feat: 团队管理
This commit is contained in:
parent
91e3c3d163
commit
b3db53ed58
@ -1,5 +1,5 @@
|
|||||||
import { Result } from '@/request/Result'
|
import { Result } from '@/request/Result'
|
||||||
import { get, post, del } from '@/request/index'
|
import { get, post, del, put } from '@/request/index'
|
||||||
import type { TeamMember, TeamMemberRequest } from '@/api/type/team'
|
import type { TeamMember, TeamMemberRequest } from '@/api/type/team'
|
||||||
// import type { Ref } from 'vue'
|
// import type { Ref } from 'vue'
|
||||||
|
|
||||||
@ -36,9 +36,33 @@ const getMemberPermissions: (member_id: String) => Promise<Result<any>> = (membe
|
|||||||
return get(`${prefix}/${member_id}`)
|
return get(`${prefix}/${member_id}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取成员权限
|
||||||
|
* @param 参数 member_id
|
||||||
|
* @param 参数 {
|
||||||
|
"team_member_permission_list": [
|
||||||
|
{
|
||||||
|
"target_id": "string",
|
||||||
|
"type": "string",
|
||||||
|
"operate": {
|
||||||
|
"USE": true,
|
||||||
|
"MANAGE": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
const putMemberPermissions: (member_id: String, body: any) => Promise<Result<any>> = (
|
||||||
|
member_id,
|
||||||
|
body
|
||||||
|
) => {
|
||||||
|
return put(`${prefix}/${member_id}`, undefined, body)
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getTeamMember,
|
getTeamMember,
|
||||||
postCreatTeamMember,
|
postCreatTeamMember,
|
||||||
delTeamMember,
|
delTeamMember,
|
||||||
getMemberPermissions
|
getMemberPermissions,
|
||||||
|
putMemberPermissions
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,7 @@ export const routes: Array<RouteRecordRaw> = [
|
|||||||
path: '/',
|
path: '/',
|
||||||
name: 'home',
|
name: 'home',
|
||||||
component: () => import('@/layout/app-layout/index.vue'),
|
component: () => import('@/layout/app-layout/index.vue'),
|
||||||
|
redirect: '/setting',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/first',
|
path: '/first',
|
||||||
|
|||||||
@ -1,20 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-table v-bind="$attrs" :max-height="tableHeight">
|
<el-table :data="data" :max-height="tableHeight">
|
||||||
<el-table-column prop="name" label="数据集名称" />
|
<el-table-column prop="name" label="数据集名称" />
|
||||||
<el-table-column label="管理" align="center">
|
<el-table-column label="管理" align="center">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-checkbox v-model="allChecked" label="管理" />
|
<el-checkbox
|
||||||
|
v-model="allChecked[MANAGE]"
|
||||||
|
label="管理"
|
||||||
|
@change="handleCheckAllChange($event, MANAGE)"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-checkbox v-model="row.operate['MANAGE']" />
|
<el-checkbox v-model="row.operate[MANAGE]" @change="checkedOperateChange(MANAGE, row)" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="使用" align="center">
|
<el-table-column label="使用" align="center">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-checkbox v-model="allChecked" label="使用" />
|
<el-checkbox
|
||||||
|
v-model="allChecked[USE]"
|
||||||
|
label="使用"
|
||||||
|
@change="handleCheckAllChange($event, USE)"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-checkbox v-model="row.operate['USE']" />
|
<el-checkbox v-model="row.operate[USE]" @change="checkedOperateChange(USE, row)" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -22,13 +30,64 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted, watch } from 'vue'
|
import { ref, onMounted, watch } from 'vue'
|
||||||
|
|
||||||
// const emit = defineEmits(['refresh'])
|
const MANAGE = 'MANAGE'
|
||||||
|
const USE = 'USE'
|
||||||
|
|
||||||
const allChecked = ref(false)
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
id: String
|
||||||
|
})
|
||||||
|
|
||||||
const tableHeight = ref(0)
|
const emit = defineEmits(['update:data'])
|
||||||
|
const allChecked: any = ref({
|
||||||
|
[MANAGE]: false,
|
||||||
|
[USE]: false
|
||||||
|
})
|
||||||
|
|
||||||
const loading = ref<boolean>(false)
|
const tableHeight = ref(100)
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.data,
|
||||||
|
(val) => {
|
||||||
|
Object.keys(allChecked.value).map((item) => {
|
||||||
|
allChecked.value[item] = compare(item)
|
||||||
|
})
|
||||||
|
emit('update:data', val)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
function handleCheckAllChange(val: string | number | boolean, Name: string | number) {
|
||||||
|
if (val) {
|
||||||
|
props.data.map((item: any) => {
|
||||||
|
item.operate[Name] = true
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
props.data.map((item: any) => {
|
||||||
|
item.operate[Name] = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function checkedOperateChange(Name: string | number, row: any) {
|
||||||
|
if (Name === MANAGE) {
|
||||||
|
props.data.map((item: any) => {
|
||||||
|
if (item.id === row.id) {
|
||||||
|
item.operate[USE] = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
allChecked.value[Name] = compare(Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
function compare(attrs: string | number) {
|
||||||
|
const filterData = props.data.filter((item: any) => item?.operate[attrs])
|
||||||
|
return props.data.length > 0 && filterData.length === props.data.length
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
tableHeight.value = window.innerHeight - 300
|
tableHeight.value = window.innerHeight - 300
|
||||||
@ -37,6 +96,9 @@ onMounted(() => {
|
|||||||
tableHeight.value = window.innerHeight - 300
|
tableHeight.value = window.innerHeight - 300
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
|
Object.keys(allChecked.value).map((item) => {
|
||||||
|
allChecked.value[item] = compare(item)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scope></style>
|
<style lang="scss" scope></style>
|
||||||
|
|||||||
@ -56,12 +56,11 @@
|
|||||||
>
|
>
|
||||||
<PermissionSetting :data="item.data"></PermissionSetting>
|
<PermissionSetting :data="item.data"></PermissionSetting>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<!-- <el-tab-pane label="应用" name="application">应用</el-tab-pane> -->
|
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="team-manage__footer border-t p-15 flex">
|
<div class="team-manage__footer border-t p-15 flex">
|
||||||
<el-button type="primary">保存</el-button>
|
<el-button type="primary" @click="submitPermissions">保存</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -76,7 +75,6 @@ import type { TeamMember } from '@/api/type/team'
|
|||||||
import CreateMemberDialog from './component/CreateMemberDialog.vue'
|
import CreateMemberDialog from './component/CreateMemberDialog.vue'
|
||||||
import PermissionSetting from './component/PermissionSetting.vue'
|
import PermissionSetting from './component/PermissionSetting.vue'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
import { timePanelSharedProps } from 'element-plus/es/components/time-picker/src/props/shared'
|
|
||||||
|
|
||||||
const DATASET = 'DATASET'
|
const DATASET = 'DATASET'
|
||||||
|
|
||||||
@ -95,12 +93,12 @@ const settingTags = reactive([
|
|||||||
label: '数据集',
|
label: '数据集',
|
||||||
value: DATASET,
|
value: DATASET,
|
||||||
data: [] as any
|
data: [] as any
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '应用',
|
||||||
|
value: 'application',
|
||||||
|
data: [] as any
|
||||||
}
|
}
|
||||||
// {
|
|
||||||
// label: '应用',
|
|
||||||
// value: 'application',
|
|
||||||
// data: []
|
|
||||||
// }
|
|
||||||
])
|
])
|
||||||
|
|
||||||
watch(filterText, (val) => {
|
watch(filterText, (val) => {
|
||||||
@ -111,6 +109,30 @@ watch(filterText, (val) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function submitPermissions() {
|
||||||
|
rLoading.value = true
|
||||||
|
const obj: any = {
|
||||||
|
team_member_permission_list: []
|
||||||
|
}
|
||||||
|
settingTags.map((item) => {
|
||||||
|
item.data.map((v: any) => {
|
||||||
|
obj['team_member_permission_list'].push({
|
||||||
|
target_id: v.id,
|
||||||
|
type: v.type,
|
||||||
|
operate: v.operate
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
TeamApi.putMemberPermissions(currentUser.value, obj)
|
||||||
|
.then(() => {
|
||||||
|
MsgSuccess('提交成功')
|
||||||
|
MemberPermissions(currentUser.value)
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
rLoading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function MemberPermissions(id: String) {
|
function MemberPermissions(id: String) {
|
||||||
rLoading.value = true
|
rLoading.value = true
|
||||||
TeamApi.getMemberPermissions(id)
|
TeamApi.getMemberPermissions(id)
|
||||||
@ -122,12 +144,6 @@ function MemberPermissions(id: String) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// if (!res.data || Object.keys(res.data).length == 0) {
|
|
||||||
// permissionsData.value = []
|
|
||||||
// } else {
|
|
||||||
// permissionsData.value = res.data
|
|
||||||
// }
|
|
||||||
|
|
||||||
rLoading.value = false
|
rLoading.value = false
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user