Skip to content

Commit 25cc01d

Browse files
1myuanwxg0103
authored andcommitted
feat: role member
1 parent 59d7867 commit 25cc01d

File tree

7 files changed

+181
-12
lines changed

7 files changed

+181
-12
lines changed
Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { get, post, del } from '@/request/index'
22
import type { Ref } from 'vue'
33
import { Result } from '@/request/Result'
4-
import type { RoleItem, RolePermissionItem, CreateOrUpdateParams } from '@/api/type/role'
4+
import type { RoleItem, RolePermissionItem, CreateOrUpdateParams, RoleMemberItem, CreateMemberParams } from '@/api/type/role'
55
import { RoleTypeEnum } from '@/enums/system'
6+
import type { pageRequest } from '@/api/type/common'
67

78
const prefix = '/system/role'
89
/**
@@ -57,11 +58,52 @@ const saveRolePermission: (
5758
return post(`${prefix}/${role_id}/permission`, data, undefined, loading)
5859
}
5960

61+
/**
62+
* 获取角色成员列表
63+
*/
64+
const getRoleMemberList: (
65+
role_id: string,
66+
page: pageRequest,
67+
param: any,
68+
loading?: Ref<boolean>,
69+
) => Promise<Result<RoleMemberItem>> = (role_id, page, param, loading) => {
70+
return get(
71+
`${prefix}/${role_id}/user_list/${page.current_page}/${page.page_size}`,
72+
param,
73+
loading,
74+
)
75+
}
76+
77+
/**
78+
* 新建角色成员
79+
*/
80+
const CreateMember: (
81+
role_id: string,
82+
data: CreateMemberParams,
83+
loading?: Ref<boolean>,
84+
) => Promise<Result<any>> = (role_id, data, loading) => {
85+
return post(`${prefix}/${role_id}/add_member`, data, undefined, loading)
86+
}
87+
88+
/**
89+
* 删除角色成员
90+
*/
91+
const deleteRoleMember: (role_id: string, user_relation_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
92+
role_id,
93+
user_relation_id,
94+
loading,
95+
) => {
96+
return del(`${prefix}/${role_id}/remove_member/${user_relation_id}`, undefined, {}, loading)
97+
}
98+
6099
export default {
61100
getRoleList,
62101
getRolePermissionList,
63102
getRoleTemplate,
64103
CreateOrUpdateRole,
65104
deleteRole,
66-
saveRolePermission
105+
saveRolePermission,
106+
getRoleMemberList,
107+
CreateMember,
108+
deleteRoleMember
67109
}

ui/src/api/type/role.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,17 @@ interface CreateOrUpdateParams {
4040
role_type?: RoleTypeEnum,
4141
}
4242

43-
export type { RoleItem, RolePermissionItem, RoleTableDataItem, CreateOrUpdateParams, ChildrenPermissionItem }
43+
interface RoleMemberItem {
44+
user_relation_id: string,
45+
user_id: string,
46+
username: string,
47+
nick_name: string,
48+
workspace_id: string,
49+
workspace_name: string,
50+
}
51+
52+
interface CreateMemberParams {
53+
members: { user_ids: string[], workspace_ids: string[] }[]
54+
}
55+
56+
export type { RoleItem, RolePermissionItem, RoleTableDataItem, CreateOrUpdateParams, ChildrenPermissionItem, RoleMemberItem, CreateMemberParams }

ui/src/locales/lang/zh-CN/views/role.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ export default {
1717
moduleName: '模块名称'
1818
},
1919
member: {
20-
title: '成员'
20+
title: '成员',
21+
add: '添加成员',
22+
workspace: '工作空间',
23+
role: '角色',
24+
delete: {
25+
button: '移除',
26+
confirmTitle: '是否删除成员:',
27+
}
2128
}
2229
}

ui/src/views/role/component/CreateOrUpdateRoleDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import type { FormInstance } from 'element-plus'
3030
import { MsgSuccess } from '@/utils/message'
3131
import { t } from '@/locales'
3232
import type { RoleItem, CreateOrUpdateParams } from '@/api/type/role'
33-
import RoleApi from '@/api/user/role'
33+
import RoleApi from '@/api/system/role'
3434
import { roleTypeMap } from '../index'
3535
3636
const emit = defineEmits<{
Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,109 @@
11
<template>
2-
<div></div>
2+
<div class="p-24 pt-0">
3+
<div class="flex-between mb-16">
4+
<el-button type="primary" @click="handleAdd">
5+
{{ $t('views.role.member.add') }}
6+
</el-button>
7+
<div class="flex complex-search">
8+
<el-select class="complex-search__left" v-model="searchType" style="width: 120px">
9+
<el-option :label="$t('views.login.loginForm.username.label')" value="username" />
10+
</el-select>
11+
<el-input v-if="searchType === 'username'" v-model="searchForm.username" @change="getList"
12+
:placeholder="$t('common.inputPlaceholder')" style="width: 220px" clearable />
13+
</div>
14+
</div>
15+
<app-table class="mt-16" :data="tableData" :pagination-config="paginationConfig" @sizeChange="handleSizeChange"
16+
@changePage="getList" v-loading="loading">
17+
<el-table-column prop="nick_name" :label="$t('views.userManage.form.nick_name.label')" />
18+
<el-table-column prop="username" :label="$t('views.userManage.form.username.label')" />
19+
<el-table-column prop="workspace_name" :label="$t('views.role.member.workspace')" />
20+
<!-- TODO -->
21+
<el-table-column prop="nick_name" :label="$t('views.role.member.role')" />
22+
<el-table-column :label="$t('common.operation')" width="100" fixed="right">
23+
<template #default="{ row }">
24+
<el-tooltip effect="dark" :content="`${$t('common.create')}${$t('views.role.customRole')}`" placement="top">
25+
<el-button type="primary" text @click.stop="handleDelete(row)" :title="$t('common.edit')">
26+
<el-icon>
27+
<EditPen />
28+
</el-icon>
29+
</el-button>
30+
</el-tooltip>
31+
</template>
32+
</el-table-column>
33+
</app-table>
34+
</div>
35+
<!-- <AddMemberDrawer ref="addMemberDrawerRef" /> -->
336
</template>
437

5-
<script setup lang="ts"></script>
38+
<script setup lang="ts">
39+
import { onMounted, ref, reactive, watch } from 'vue'
40+
import RoleApi from '@/api/system/role'
41+
import type { RoleItem, RoleMemberItem } from '@/api/type/role'
42+
import { MsgSuccess, MsgConfirm } from '@/utils/message'
43+
import { t } from '@/locales'
44+
45+
const props = defineProps<{
46+
currentRole?: RoleItem
47+
}>()
48+
49+
const loading = ref(false)
50+
51+
const searchType = ref('username')
52+
const searchForm = ref<Record<string, any>>({
53+
username: '',
54+
})
55+
const paginationConfig = reactive({
56+
current_page: 1,
57+
page_size: 20,
58+
total: 0,
59+
})
60+
61+
const tableData = ref<RoleMemberItem[]>([])
62+
63+
async function getList() {
64+
try {
65+
const params = {
66+
[searchType.value]: searchForm.value[searchType.value],
67+
}
68+
const res = await RoleApi.getRoleMemberList(props.currentRole?.id as string, paginationConfig, params, loading)
69+
console.log('🤔️ =>', res);
70+
} catch (error) {
71+
console.error(error)
72+
}
73+
}
74+
75+
function handleSizeChange() {
76+
paginationConfig.current_page = 1
77+
getList()
78+
}
79+
80+
onMounted(() => {
81+
getList()
82+
})
83+
84+
watch(() => props.currentRole?.id, () => {
85+
getList()
86+
})
87+
88+
// TODO
89+
function handleAdd() {
90+
}
91+
92+
function handleDelete(row: RoleMemberItem) {
93+
MsgConfirm(
94+
`${t('views.role.member.delete.confirmTitle')}${row.nick_name} ?`, '',
95+
{
96+
confirmButtonText: t('common.confirm'),
97+
confirmButtonClass: 'danger',
98+
},
99+
)
100+
.then(() => {
101+
loading.value = true
102+
RoleApi.deleteRoleMember(props.currentRole?.id as string, row.user_relation_id, loading).then(() => {
103+
MsgSuccess(t('common.deleteSuccess'))
104+
getList()
105+
})
106+
})
107+
.catch(() => { })
108+
}
109+
</script>

ui/src/views/role/component/PermissionConfiguration.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<script setup lang="ts">
3737
import { ref, watch, computed } from 'vue'
3838
import type { RoleItem, RolePermissionItem, RoleTableDataItem, ChildrenPermissionItem } from '@/api/type/role'
39-
import RoleApi from '@/api/user/role'
39+
import RoleApi from '@/api/system/role'
4040
import { MsgSuccess } from '@/utils/message'
4141
import { t } from '@/locales'
4242

ui/src/views/role/index.vue

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@
4444
</div>
4545
<div class="role-left_title">
4646
<span class="color-secondary lighter">{{ $t('views.role.customRole') }}</span>
47-
<AppIcon iconName="app-wordspace" style="font-size: 16px" class="cursor color-primary"
48-
@click="createOrUpdateRole()">
49-
</AppIcon>
47+
<el-tooltip effect="dark" :content="`${$t('common.create')}${$t('views.role.customRole')}`"
48+
placement="top">
49+
<el-button type="primary" text @click="createOrUpdateRole()">
50+
<AppIcon iconName="app-copy"></AppIcon>
51+
</el-button>
52+
</el-tooltip>
5053
</div>
5154
<common-list :data="filterCustomRole" @click="clickRole" :default-active="currentRole?.id">
5255
<template #default="{ row }">
@@ -113,7 +116,7 @@
113116

114117
<script lang="ts" setup>
115118
import { onMounted, ref, watch } from 'vue'
116-
import RoleApi from '@/api/user/role'
119+
import RoleApi from '@/api/system/role'
117120
import { t } from '@/locales'
118121
import PermissionConfiguration from './component/PermissionConfiguration.vue'
119122
import Member from './component/Member.vue'

0 commit comments

Comments
 (0)