feat: 团队管理
This commit is contained in:
parent
37164a7b7c
commit
558213db40
26
ui/src/api/team.ts
Normal file
26
ui/src/api/team.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { Result } from '@/request/Result'
|
||||||
|
import { get, post } from '@/request/index'
|
||||||
|
import type { TeamMember, TeamMemberRequest } from '@/api/type/team'
|
||||||
|
// import type { Ref } from 'vue'
|
||||||
|
|
||||||
|
const prefix = '/team/member'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取团队成员列表
|
||||||
|
*/
|
||||||
|
const getTeamMember: () => Promise<Result<TeamMember[]>> = () => {
|
||||||
|
return get(`${prefix}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加成员
|
||||||
|
* @param 参数 { "username_or_email": "string" }
|
||||||
|
*/
|
||||||
|
const postCreatTeamMember: (request: TeamMemberRequest) => Promise<Result<boolean>> = (request) => {
|
||||||
|
return post(`${prefix}`, request)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getTeamMember,
|
||||||
|
postCreatTeamMember
|
||||||
|
}
|
||||||
17
ui/src/api/type/team.ts
Normal file
17
ui/src/api/type/team.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
interface TeamMember {
|
||||||
|
id: string
|
||||||
|
username: string
|
||||||
|
email: string
|
||||||
|
team_id: string
|
||||||
|
/**
|
||||||
|
* 类型:type:manage 所有者;
|
||||||
|
*/
|
||||||
|
type: string
|
||||||
|
user_id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TeamMemberRequest {
|
||||||
|
username_or_email: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type { TeamMember, TeamMemberRequest }
|
||||||
@ -7,7 +7,7 @@ import type {
|
|||||||
ResetPasswordRequest,
|
ResetPasswordRequest,
|
||||||
User,
|
User,
|
||||||
ResetCurrentUserPasswordRequest
|
ResetCurrentUserPasswordRequest
|
||||||
} from './type'
|
} from '@/api/type/user'
|
||||||
import type { Ref } from 'vue'
|
import type { Ref } from 'vue'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -20,7 +20,7 @@ const login: (request: LoginRequest, loading?: Ref<boolean>) => Promise<Result<s
|
|||||||
request,
|
request,
|
||||||
loading
|
loading
|
||||||
) => {
|
) => {
|
||||||
return post('/user/login', undefined, request, loading)
|
return post('/user/login', request, undefined, loading)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 登出
|
* 登出
|
||||||
@ -41,7 +41,7 @@ const register: (request: RegisterRequest, loading?: Ref<boolean>) => Promise<Re
|
|||||||
request,
|
request,
|
||||||
loading
|
loading
|
||||||
) => {
|
) => {
|
||||||
return post('/user/register', undefined, request, loading)
|
return post('/user/register', request, undefined, loading)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,7 +54,7 @@ const checkCode: (request: CheckCodeRequest, loading?: Ref<boolean>) => Promise<
|
|||||||
request,
|
request,
|
||||||
loading
|
loading
|
||||||
) => {
|
) => {
|
||||||
return post('/user/check_code', undefined, request, loading)
|
return post('/user/check_code', request, undefined, loading)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,7 +68,7 @@ const sendEmit: (
|
|||||||
type: 'register' | 'reset_password',
|
type: 'register' | 'reset_password',
|
||||||
loading?: Ref<boolean>
|
loading?: Ref<boolean>
|
||||||
) => Promise<Result<boolean>> = (email, type, loading) => {
|
) => Promise<Result<boolean>> = (email, type, loading) => {
|
||||||
return post('/user/send_email', undefined, { email, type }, loading)
|
return post('/user/send_email', { email, type }, undefined, loading)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 发送邮件到当前用户
|
* 发送邮件到当前用户
|
||||||
@ -88,7 +88,7 @@ const resetCurrentUserPassword: (
|
|||||||
request: ResetCurrentUserPasswordRequest,
|
request: ResetCurrentUserPasswordRequest,
|
||||||
loading?: Ref<boolean>
|
loading?: Ref<boolean>
|
||||||
) => Promise<Result<boolean>> = (request, loading) => {
|
) => Promise<Result<boolean>> = (request, loading) => {
|
||||||
return post('/user/current/reset_password', undefined, request, loading)
|
return post('/user/current/reset_password', request, undefined, loading)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 获取用户基本信息
|
* 获取用户基本信息
|
||||||
@ -109,7 +109,7 @@ const resetPassword: (
|
|||||||
request: ResetPasswordRequest,
|
request: ResetPasswordRequest,
|
||||||
loading?: Ref<boolean>
|
loading?: Ref<boolean>
|
||||||
) => Promise<Result<boolean>> = (request, loading) => {
|
) => Promise<Result<boolean>> = (request, loading) => {
|
||||||
return post('/user/re_password', undefined, request, loading)
|
return post('/user/re_password', request, undefined, loading)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -77,14 +77,14 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import type { ResetCurrentUserPasswordRequest } from '@/api/user/type'
|
import type { ResetCurrentUserPasswordRequest } from '@/api/type/user'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
import UserApi from '@/api/user'
|
import UserApi from '@/api/user'
|
||||||
import useStore from '@/stores';
|
import useStore from '@/stores'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const { user } = useStore();
|
const { user } = useStore()
|
||||||
|
|
||||||
const resetPasswordDialog = ref<boolean>(false)
|
const resetPasswordDialog = ref<boolean>(false)
|
||||||
|
|
||||||
|
|||||||
@ -129,10 +129,10 @@ export const get: (
|
|||||||
*/
|
*/
|
||||||
export const post: (
|
export const post: (
|
||||||
url: string,
|
url: string,
|
||||||
params?: unknown,
|
|
||||||
data?: unknown,
|
data?: unknown,
|
||||||
|
params?: unknown,
|
||||||
loading?: NProgress | Ref<boolean>
|
loading?: NProgress | Ref<boolean>
|
||||||
) => Promise<Result<any> | any> = (url, params, data, loading) => {
|
) => Promise<Result<any> | any> = (url, data, params, loading) => {
|
||||||
return promise(request({ url: url, method: 'post', data, params }), loading)
|
return promise(request({ url: url, method: 'post', data, params }), loading)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import type { User } from '@/api/user/type'
|
import type { User } from '@/api/type/user'
|
||||||
import UserApi from '@/api/user'
|
import UserApi from '@/api/user'
|
||||||
|
|
||||||
export interface appStateTypes {
|
export interface appStateTypes {
|
||||||
|
|||||||
@ -61,10 +61,10 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import type { CheckCodeRequest } from '@/api/user/type'
|
import type { CheckCodeRequest } from '@/api/type/user'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
import UserApi from '@/api/user/index'
|
import UserApi from '@/api/user'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import type { LoginRequest } from '@/api/user/type'
|
import type { LoginRequest } from '@/api/type/user'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
import useStore from '@/stores'
|
import useStore from '@/stores'
|
||||||
|
|||||||
@ -96,10 +96,10 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import type { RegisterRequest } from '@/api/user/type'
|
import type { RegisterRequest } from '@/api/type/user'
|
||||||
import { UserFilled, Lock, Message, Key } from '@element-plus/icons-vue'
|
import { UserFilled, Lock, Message, Key } from '@element-plus/icons-vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import UserApi from '@/api/user/index'
|
import UserApi from '@/api/user'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
|
|
||||||
|
|||||||
@ -56,11 +56,11 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted } from 'vue'
|
import { ref, onMounted } from 'vue'
|
||||||
import type { ResetPasswordRequest } from '@/api/user/type'
|
import type { ResetPasswordRequest } from '@/api/type/user'
|
||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
import UserApi from '@/api/user/index'
|
import UserApi from '@/api/user'
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const resetPasswordForm = ref<ResetPasswordRequest>({
|
const resetPasswordForm = ref<ResetPasswordRequest>({
|
||||||
|
|||||||
@ -12,24 +12,28 @@
|
|||||||
<el-input v-model="filterText" placeholder="请输入用户名搜索" suffix-icon="Search" />
|
<el-input v-model="filterText" placeholder="请输入用户名搜索" suffix-icon="Search" />
|
||||||
</div>
|
</div>
|
||||||
<div class="member-list mt-10">
|
<div class="member-list mt-10">
|
||||||
<ul>
|
<el-scrollbar>
|
||||||
<li class="active border-b-light flex-between p-15">
|
<ul>
|
||||||
<div>
|
<template v-for="(item, index) in memberList" :key="index">
|
||||||
<span>baixin</span>
|
<li class="active border-b-light flex-between p-15">
|
||||||
<el-tag class="ml-10" effect="dark">所有者</el-tag>
|
<div>
|
||||||
</div>
|
<span>{{ item.username }}</span>
|
||||||
<el-dropdown trigger="click">
|
<el-tag class="ml-10" effect="dark">所有者</el-tag>
|
||||||
<span class="cursor">
|
</div>
|
||||||
<el-icon><MoreFilled /></el-icon>
|
<el-dropdown trigger="click">
|
||||||
</span>
|
<span class="cursor">
|
||||||
<template #dropdown>
|
<el-icon><MoreFilled /></el-icon>
|
||||||
<el-dropdown-menu>
|
</span>
|
||||||
<el-dropdown-item>移除</el-dropdown-item>
|
<template #dropdown>
|
||||||
</el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
</template>
|
<el-dropdown-item>移除</el-dropdown-item>
|
||||||
</el-dropdown>
|
</el-dropdown-menu>
|
||||||
</li>
|
</template>
|
||||||
</ul>
|
</el-dropdown>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</el-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="permission-setting flex">
|
<div class="permission-setting flex">
|
||||||
@ -71,6 +75,11 @@
|
|||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref, watch, nextTick } from 'vue'
|
import { onMounted, ref, watch, nextTick } from 'vue'
|
||||||
|
import TeamApi from '@/api/team'
|
||||||
|
import type { TeamMember } from '@/api/type/team'
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const memberList = ref<TeamMember[]>([])
|
||||||
|
|
||||||
const filterText = ref('')
|
const filterText = ref('')
|
||||||
const activeName = ref('dataset')
|
const activeName = ref('dataset')
|
||||||
@ -116,6 +125,14 @@ const tableData = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
function getMember() {
|
||||||
|
loading.value = true
|
||||||
|
TeamApi.getTeamMember().then((res) => {
|
||||||
|
memberList.value = res.data
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
tableHeight.value = window.innerHeight - 300
|
tableHeight.value = window.innerHeight - 300
|
||||||
window.onresize = () => {
|
window.onresize = () => {
|
||||||
@ -123,9 +140,7 @@ onMounted(() => {
|
|||||||
tableHeight.value = window.innerHeight - 300
|
tableHeight.value = window.innerHeight - 300
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
// getSalesList()
|
getMember()
|
||||||
// getInfo()
|
|
||||||
// getTeams()
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user