Skip to content

Commit 3b74b5c

Browse files
committed
feat: 用户管理新增分配角色功能
1 parent 2735dcf commit 3b74b5c

File tree

3 files changed

+110
-6
lines changed

3 files changed

+110
-6
lines changed

src/apis/system/user.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,6 @@ export function exportUser(query: T.UserQuery) {
4040
return http.download(`${BASE_URL}/export`, query)
4141
}
4242

43-
/** @desc 重置密码 */
44-
export function resetUserPwd(data: any, id: string) {
45-
return http.patch(`${BASE_URL}/${id}/password`, data)
46-
}
47-
4843
/** @desc 下载用户导入模板 */
4944
export function downloadUserImportTemplate() {
5045
return http.download(`${BASE_URL}/import/template`)
@@ -59,3 +54,13 @@ export function parseImportUser(data: FormData) {
5954
export function importUser(data: any) {
6055
return http.post(`${BASE_URL}/import`, data)
6156
}
57+
58+
/** @desc 重置密码 */
59+
export function resetUserPwd(data: any, id: string) {
60+
return http.patch(`${BASE_URL}/${id}/password`, data)
61+
}
62+
63+
/** @desc 分配角色 */
64+
export function updateUserRole(data: { roleIds: string[] }, id: string) {
65+
return http.patch(`${BASE_URL}/${id}/role`, data)
66+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<template>
2+
<a-modal
3+
v-model:visible="visible"
4+
title="分配角色"
5+
:mask-closable="false"
6+
:esc-to-close="false"
7+
:width="width >= 500 ? 500 : '100%'"
8+
draggable
9+
@before-ok="save"
10+
@close="reset"
11+
>
12+
<GiForm ref="formRef" v-model="form" :options="options" :columns="columns" />
13+
</a-modal>
14+
</template>
15+
16+
<script setup lang="ts">
17+
import { Message } from '@arco-design/web-vue'
18+
import { useWindowSize } from '@vueuse/core'
19+
import { getUser, updateUserRole } from '@/apis/system'
20+
import { type Columns, GiForm, type Options } from '@/components/GiForm'
21+
import { useForm } from '@/hooks'
22+
import { useRole } from '@/hooks/app'
23+
24+
const emit = defineEmits<{
25+
(e: 'save-success'): void
26+
}>()
27+
28+
const { width } = useWindowSize()
29+
const dataId = ref('')
30+
const visible = ref(false)
31+
const formRef = ref<InstanceType<typeof GiForm>>()
32+
const { roleList, getRoleList } = useRole()
33+
34+
const options: Options = {
35+
form: { size: 'large' },
36+
btns: { hide: true },
37+
}
38+
39+
const columns: Columns = reactive([
40+
{
41+
label: '角色',
42+
field: 'roleIds',
43+
type: 'select',
44+
options: roleList,
45+
props: {
46+
multiple: true,
47+
allowClear: true,
48+
allowSearch: { retainInputValue: true },
49+
placeholder: '请选择角色',
50+
},
51+
rules: [{ required: true, message: '请选择角色' }],
52+
},
53+
])
54+
55+
const { form, resetForm } = useForm({})
56+
57+
// 重置
58+
const reset = () => {
59+
formRef.value?.formRef?.resetFields()
60+
resetForm()
61+
}
62+
63+
// 保存
64+
const save = async () => {
65+
try {
66+
const isInvalid = await formRef.value?.formRef?.validate()
67+
if (isInvalid) return false
68+
await updateUserRole({ roleIds: form.roleIds }, dataId.value)
69+
Message.success('分配成功')
70+
emit('save-success')
71+
return true
72+
} catch (error) {
73+
return false
74+
}
75+
}
76+
77+
// 初始化
78+
const onOpen = async (id: string) => {
79+
reset()
80+
dataId.value = id
81+
if (!roleList.value.length) {
82+
await getRoleList()
83+
}
84+
const res = await getUser(id)
85+
Object.assign(form, res.data)
86+
visible.value = true
87+
}
88+
89+
defineExpose({ onOpen })
90+
</script>

src/views/system/user/index.vue

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,14 @@
7070
删除
7171
</a-link>
7272
<a-dropdown>
73-
<a-button v-if="has.hasPermOr(['system:user:resetPwd'])" type="text" size="mini">
73+
<a-button v-if="has.hasPermOr(['system:user:resetPwd', 'system:user:updateRole'])" type="text" size="mini">
7474
<template #icon>
7575
<icon-more :size="16" />
7676
</template>
7777
</a-button>
7878
<template #content>
7979
<a-doption v-permission="['system:user:resetPwd']" @click="onResetPwd(record)">重置密码</a-doption>
80+
<a-doption v-permission="['system:user:updateRole']" @click="onUpdateRole(record)">分配角色</a-doption>
8081
</template>
8182
</a-dropdown>
8283
</a-space>
@@ -89,6 +90,7 @@
8990
<UserImportDrawer ref="UserImportDrawerRef" @save-success="search" />
9091
<UserDetailDrawer ref="UserDetailDrawerRef" />
9192
<UserResetPwdModal ref="UserResetPwdModalRef" />
93+
<UserUpdateRoleModal ref="UserUpdateRoleModalRef" @save-success="search" />
9294
</div>
9395
</template>
9496

@@ -98,6 +100,7 @@ import UserAddDrawer from './UserAddDrawer.vue'
98100
import UserImportDrawer from './UserImportDrawer.vue'
99101
import UserDetailDrawer from './UserDetailDrawer.vue'
100102
import UserResetPwdModal from './UserResetPwdModal.vue'
103+
import UserUpdateRoleModal from './UserUpdateRoleModal.vue'
101104
import { type UserQuery, type UserResp, deleteUser, exportUser, listUser } from '@/apis/system'
102105
import type { Columns, Options } from '@/components/GiForm'
103106
import type { TableInstanceColumns } from '@/components/GiTable/type'
@@ -252,6 +255,12 @@ const UserResetPwdModalRef = ref<InstanceType<typeof UserResetPwdModal>>()
252255
const onResetPwd = (record: UserResp) => {
253256
UserResetPwdModalRef.value?.onReset(record.id)
254257
}
258+
259+
const UserUpdateRoleModalRef = ref<InstanceType<typeof UserUpdateRoleModal>>()
260+
// 分配角色
261+
const onUpdateRole = (record: UserResp) => {
262+
UserUpdateRoleModalRef.value?.onOpen(record.id)
263+
}
255264
</script>
256265

257266
<style lang="scss" scoped>

0 commit comments

Comments
 (0)