mirror of
				https://github.com/continew-org/continew-admin-ui.git
				synced 2025-10-31 22:57:15 +08:00 
			
		
		
		
	feat: 用户管理新增分配角色功能
This commit is contained in:
		| @@ -40,11 +40,6 @@ export function exportUser(query: T.UserQuery) { | |||||||
|   return http.download(`${BASE_URL}/export`, query) |   return http.download(`${BASE_URL}/export`, query) | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @desc 重置密码 */ |  | ||||||
| export function resetUserPwd(data: any, id: string) { |  | ||||||
|   return http.patch(`${BASE_URL}/${id}/password`, data) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** @desc 下载用户导入模板 */ | /** @desc 下载用户导入模板 */ | ||||||
| export function downloadUserImportTemplate() { | export function downloadUserImportTemplate() { | ||||||
|   return http.download(`${BASE_URL}/import/template`) |   return http.download(`${BASE_URL}/import/template`) | ||||||
| @@ -59,3 +54,13 @@ export function parseImportUser(data: FormData) { | |||||||
| export function importUser(data: any) { | export function importUser(data: any) { | ||||||
|   return http.post(`${BASE_URL}/import`, data) |   return http.post(`${BASE_URL}/import`, data) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** @desc 重置密码 */ | ||||||
|  | export function resetUserPwd(data: any, id: string) { | ||||||
|  |   return http.patch(`${BASE_URL}/${id}/password`, data) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** @desc 分配角色 */ | ||||||
|  | export function updateUserRole(data: { roleIds: string[] }, id: string) { | ||||||
|  |   return http.patch(`${BASE_URL}/${id}/role`, data) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								src/views/system/user/UserUpdateRoleModal.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/views/system/user/UserUpdateRoleModal.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | <template> | ||||||
|  |   <a-modal | ||||||
|  |     v-model:visible="visible" | ||||||
|  |     title="分配角色" | ||||||
|  |     :mask-closable="false" | ||||||
|  |     :esc-to-close="false" | ||||||
|  |     :width="width >= 500 ? 500 : '100%'" | ||||||
|  |     draggable | ||||||
|  |     @before-ok="save" | ||||||
|  |     @close="reset" | ||||||
|  |   > | ||||||
|  |     <GiForm ref="formRef" v-model="form" :options="options" :columns="columns" /> | ||||||
|  |   </a-modal> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script setup lang="ts"> | ||||||
|  | import { Message } from '@arco-design/web-vue' | ||||||
|  | import { useWindowSize } from '@vueuse/core' | ||||||
|  | import { getUser, updateUserRole } from '@/apis/system' | ||||||
|  | import { type Columns, GiForm, type Options } from '@/components/GiForm' | ||||||
|  | import { useForm } from '@/hooks' | ||||||
|  | import { useRole } from '@/hooks/app' | ||||||
|  |  | ||||||
|  | const emit = defineEmits<{ | ||||||
|  |   (e: 'save-success'): void | ||||||
|  | }>() | ||||||
|  |  | ||||||
|  | const { width } = useWindowSize() | ||||||
|  | const dataId = ref('') | ||||||
|  | const visible = ref(false) | ||||||
|  | const formRef = ref<InstanceType<typeof GiForm>>() | ||||||
|  | const { roleList, getRoleList } = useRole() | ||||||
|  |  | ||||||
|  | const options: Options = { | ||||||
|  |   form: { size: 'large' }, | ||||||
|  |   btns: { hide: true }, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const columns: Columns = reactive([ | ||||||
|  |   { | ||||||
|  |     label: '角色', | ||||||
|  |     field: 'roleIds', | ||||||
|  |     type: 'select', | ||||||
|  |     options: roleList, | ||||||
|  |     props: { | ||||||
|  |       multiple: true, | ||||||
|  |       allowClear: true, | ||||||
|  |       allowSearch: { retainInputValue: true }, | ||||||
|  |       placeholder: '请选择角色', | ||||||
|  |     }, | ||||||
|  |     rules: [{ required: true, message: '请选择角色' }], | ||||||
|  |   }, | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | const { form, resetForm } = useForm({}) | ||||||
|  |  | ||||||
|  | // 重置 | ||||||
|  | const reset = () => { | ||||||
|  |   formRef.value?.formRef?.resetFields() | ||||||
|  |   resetForm() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 保存 | ||||||
|  | const save = async () => { | ||||||
|  |   try { | ||||||
|  |     const isInvalid = await formRef.value?.formRef?.validate() | ||||||
|  |     if (isInvalid) return false | ||||||
|  |     await updateUserRole({ roleIds: form.roleIds }, dataId.value) | ||||||
|  |     Message.success('分配成功') | ||||||
|  |     emit('save-success') | ||||||
|  |     return true | ||||||
|  |   } catch (error) { | ||||||
|  |     return false | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 初始化 | ||||||
|  | const onOpen = async (id: string) => { | ||||||
|  |   reset() | ||||||
|  |   dataId.value = id | ||||||
|  |   if (!roleList.value.length) { | ||||||
|  |     await getRoleList() | ||||||
|  |   } | ||||||
|  |   const res = await getUser(id) | ||||||
|  |   Object.assign(form, res.data) | ||||||
|  |   visible.value = true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | defineExpose({ onOpen }) | ||||||
|  | </script> | ||||||
| @@ -70,13 +70,14 @@ | |||||||
|                 删除 |                 删除 | ||||||
|               </a-link> |               </a-link> | ||||||
|               <a-dropdown> |               <a-dropdown> | ||||||
|                 <a-button v-if="has.hasPermOr(['system:user:resetPwd'])" type="text" size="mini"> |                 <a-button v-if="has.hasPermOr(['system:user:resetPwd', 'system:user:updateRole'])" type="text" size="mini"> | ||||||
|                   <template #icon> |                   <template #icon> | ||||||
|                     <icon-more :size="16" /> |                     <icon-more :size="16" /> | ||||||
|                   </template> |                   </template> | ||||||
|                 </a-button> |                 </a-button> | ||||||
|                 <template #content> |                 <template #content> | ||||||
|                   <a-doption v-permission="['system:user:resetPwd']" @click="onResetPwd(record)">重置密码</a-doption> |                   <a-doption v-permission="['system:user:resetPwd']" @click="onResetPwd(record)">重置密码</a-doption> | ||||||
|  |                   <a-doption v-permission="['system:user:updateRole']" @click="onUpdateRole(record)">分配角色</a-doption> | ||||||
|                 </template> |                 </template> | ||||||
|               </a-dropdown> |               </a-dropdown> | ||||||
|             </a-space> |             </a-space> | ||||||
| @@ -89,6 +90,7 @@ | |||||||
|     <UserImportDrawer ref="UserImportDrawerRef" @save-success="search" /> |     <UserImportDrawer ref="UserImportDrawerRef" @save-success="search" /> | ||||||
|     <UserDetailDrawer ref="UserDetailDrawerRef" /> |     <UserDetailDrawer ref="UserDetailDrawerRef" /> | ||||||
|     <UserResetPwdModal ref="UserResetPwdModalRef" /> |     <UserResetPwdModal ref="UserResetPwdModalRef" /> | ||||||
|  |     <UserUpdateRoleModal ref="UserUpdateRoleModalRef" @save-success="search" /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -98,6 +100,7 @@ import UserAddDrawer from './UserAddDrawer.vue' | |||||||
| import UserImportDrawer from './UserImportDrawer.vue' | import UserImportDrawer from './UserImportDrawer.vue' | ||||||
| import UserDetailDrawer from './UserDetailDrawer.vue' | import UserDetailDrawer from './UserDetailDrawer.vue' | ||||||
| import UserResetPwdModal from './UserResetPwdModal.vue' | import UserResetPwdModal from './UserResetPwdModal.vue' | ||||||
|  | import UserUpdateRoleModal from './UserUpdateRoleModal.vue' | ||||||
| import { type UserQuery, type UserResp, deleteUser, exportUser, listUser } from '@/apis/system' | import { type UserQuery, type UserResp, deleteUser, exportUser, listUser } from '@/apis/system' | ||||||
| import type { Columns, Options } from '@/components/GiForm' | import type { Columns, Options } from '@/components/GiForm' | ||||||
| import type { TableInstanceColumns } from '@/components/GiTable/type' | import type { TableInstanceColumns } from '@/components/GiTable/type' | ||||||
| @@ -252,6 +255,12 @@ const UserResetPwdModalRef = ref<InstanceType<typeof UserResetPwdModal>>() | |||||||
| const onResetPwd = (record: UserResp) => { | const onResetPwd = (record: UserResp) => { | ||||||
|   UserResetPwdModalRef.value?.onReset(record.id) |   UserResetPwdModalRef.value?.onReset(record.id) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const UserUpdateRoleModalRef = ref<InstanceType<typeof UserUpdateRoleModal>>() | ||||||
|  | // 分配角色 | ||||||
|  | const onUpdateRole = (record: UserResp) => { | ||||||
|  |   UserUpdateRoleModalRef.value?.onOpen(record.id) | ||||||
|  | } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user