feat: 团队管理

This commit is contained in:
wangdan-fit2cloud 2023-10-20 11:26:14 +08:00
parent 37164a7b7c
commit 558213db40
12 changed files with 104 additions and 46 deletions

26
ui/src/api/team.ts Normal file
View 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
View File

@ -0,0 +1,17 @@
interface TeamMember {
id: string
username: string
email: string
team_id: string
/**
* typemanage
*/
type: string
user_id: string
}
interface TeamMemberRequest {
username_or_email: string
}
export type { TeamMember, TeamMemberRequest }

View File

@ -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 {

View File

@ -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)
@ -173,4 +173,4 @@ const close = () => {
defineExpose({ open, close }) defineExpose({ open, close })
</script> </script>
<style lang="scss" scope></style> <style lang="scss" scope></style>

View File

@ -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)
} }

View File

@ -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 {

View File

@ -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()
@ -115,4 +115,4 @@ const sendEmail = () => {
</script> </script>
<style lang="scss" scope> <style lang="scss" scope>
@import '../index.scss'; @import '../index.scss';
</style> </style>

View File

@ -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'
@ -99,4 +99,4 @@ const login = () => {
</script> </script>
<style lang="scss" scope> <style lang="scss" scope>
@import './index.scss'; @import './index.scss';
</style> </style>

View File

@ -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'
@ -200,4 +200,4 @@ const sendEmail = () => {
</script> </script>
<style lang="scss" scope> <style lang="scss" scope>
@import '../index.scss'; @import '../index.scss';
</style> </style>

View File

@ -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>({
@ -133,4 +133,4 @@ const resetPassword = () => {
</script> </script>
<style lang="scss" scope> <style lang="scss" scope>
@import '../index.scss'; @import '../index.scss';
</style> </style>

View File

@ -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>