mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-27 12:12:57 +00:00
feat: 团队管理
This commit is contained in:
parent
37164a7b7c
commit
558213db40
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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,
|
||||
User,
|
||||
ResetCurrentUserPasswordRequest
|
||||
} from './type'
|
||||
} from '@/api/type/user'
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
/**
|
||||
|
|
@ -20,7 +20,7 @@ const login: (request: LoginRequest, loading?: Ref<boolean>) => Promise<Result<s
|
|||
request,
|
||||
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,
|
||||
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,
|
||||
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',
|
||||
loading?: Ref<boolean>
|
||||
) => 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,
|
||||
loading?: Ref<boolean>
|
||||
) => 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,
|
||||
loading?: Ref<boolean>
|
||||
) => Promise<Result<boolean>> = (request, loading) => {
|
||||
return post('/user/re_password', undefined, request, loading)
|
||||
return post('/user/re_password', request, undefined, loading)
|
||||
}
|
||||
|
||||
export default {
|
||||
|
|
@ -77,14 +77,14 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
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 { MsgSuccess } from '@/utils/message'
|
||||
import UserApi from '@/api/user'
|
||||
import useStore from '@/stores';
|
||||
import useStore from '@/stores'
|
||||
import { useRouter } from 'vue-router'
|
||||
const router = useRouter()
|
||||
const { user } = useStore();
|
||||
const { user } = useStore()
|
||||
|
||||
const resetPasswordDialog = ref<boolean>(false)
|
||||
|
||||
|
|
@ -173,4 +173,4 @@ const close = () => {
|
|||
|
||||
defineExpose({ open, close })
|
||||
</script>
|
||||
<style lang="scss" scope></style>
|
||||
<style lang="scss" scope></style>
|
||||
|
|
|
|||
|
|
@ -129,10 +129,10 @@ export const get: (
|
|||
*/
|
||||
export const post: (
|
||||
url: string,
|
||||
params?: unknown,
|
||||
data?: unknown,
|
||||
params?: unknown,
|
||||
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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { defineStore } from 'pinia'
|
||||
import type { User } from '@/api/user/type'
|
||||
import type { User } from '@/api/type/user'
|
||||
import UserApi from '@/api/user'
|
||||
|
||||
export interface appStateTypes {
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import type { CheckCodeRequest } from '@/api/user/type'
|
||||
import type { CheckCodeRequest } from '@/api/type/user'
|
||||
import { useRouter } from 'vue-router'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import UserApi from '@/api/user/index'
|
||||
import UserApi from '@/api/user'
|
||||
import { MsgSuccess } from '@/utils/message'
|
||||
|
||||
const router = useRouter()
|
||||
|
|
@ -115,4 +115,4 @@ const sendEmail = () => {
|
|||
</script>
|
||||
<style lang="scss" scope>
|
||||
@import '../index.scss';
|
||||
</style>
|
||||
</style>
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import type { LoginRequest } from '@/api/user/type'
|
||||
import type { LoginRequest } from '@/api/type/user'
|
||||
import { useRouter } from 'vue-router'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import useStore from '@/stores'
|
||||
|
|
@ -99,4 +99,4 @@ const login = () => {
|
|||
</script>
|
||||
<style lang="scss" scope>
|
||||
@import './index.scss';
|
||||
</style>
|
||||
</style>
|
||||
|
|
@ -96,10 +96,10 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
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 { useRouter } from 'vue-router'
|
||||
import UserApi from '@/api/user/index'
|
||||
import UserApi from '@/api/user'
|
||||
import { MsgSuccess } from '@/utils/message'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
|
||||
|
|
@ -200,4 +200,4 @@ const sendEmail = () => {
|
|||
</script>
|
||||
<style lang="scss" scope>
|
||||
@import '../index.scss';
|
||||
</style>
|
||||
</style>
|
||||
|
|
@ -56,11 +56,11 @@
|
|||
</template>
|
||||
<script setup lang="ts">
|
||||
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 { MsgSuccess } from '@/utils/message'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import UserApi from '@/api/user/index'
|
||||
import UserApi from '@/api/user'
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const resetPasswordForm = ref<ResetPasswordRequest>({
|
||||
|
|
@ -133,4 +133,4 @@ const resetPassword = () => {
|
|||
</script>
|
||||
<style lang="scss" scope>
|
||||
@import '../index.scss';
|
||||
</style>
|
||||
</style>
|
||||
|
|
@ -12,24 +12,28 @@
|
|||
<el-input v-model="filterText" placeholder="请输入用户名搜索" suffix-icon="Search" />
|
||||
</div>
|
||||
<div class="member-list mt-10">
|
||||
<ul>
|
||||
<li class="active border-b-light flex-between p-15">
|
||||
<div>
|
||||
<span>baixin</span>
|
||||
<el-tag class="ml-10" effect="dark">所有者</el-tag>
|
||||
</div>
|
||||
<el-dropdown trigger="click">
|
||||
<span class="cursor">
|
||||
<el-icon><MoreFilled /></el-icon>
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item>移除</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</li>
|
||||
</ul>
|
||||
<el-scrollbar>
|
||||
<ul>
|
||||
<template v-for="(item, index) in memberList" :key="index">
|
||||
<li class="active border-b-light flex-between p-15">
|
||||
<div>
|
||||
<span>{{ item.username }}</span>
|
||||
<el-tag class="ml-10" effect="dark">所有者</el-tag>
|
||||
</div>
|
||||
<el-dropdown trigger="click">
|
||||
<span class="cursor">
|
||||
<el-icon><MoreFilled /></el-icon>
|
||||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item>移除</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</li>
|
||||
</template>
|
||||
</ul>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="permission-setting flex">
|
||||
|
|
@ -71,6 +75,11 @@
|
|||
|
||||
<script lang="ts" setup>
|
||||
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 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(() => {
|
||||
tableHeight.value = window.innerHeight - 300
|
||||
window.onresize = () => {
|
||||
|
|
@ -123,9 +140,7 @@ onMounted(() => {
|
|||
tableHeight.value = window.innerHeight - 300
|
||||
})()
|
||||
}
|
||||
// getSalesList()
|
||||
// getInfo()
|
||||
// getTeams()
|
||||
getMember()
|
||||
})
|
||||
</script>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue