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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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