Browse Source

feat: 用户添加角色

wanggaokun 3 weeks ago
parent
commit
8e6c03006d

+ 18 - 1
src/api/interface/system/user.ts

@@ -1,3 +1,5 @@
+import { RoleVO } from './role'
+
 /**
  * 用户信息
  */
@@ -43,7 +45,7 @@ export interface UserVO extends BaseEntity {
  * 传入后端的表单信息
  */
 export interface UserBO {
-  userId: string | number
+  userId: string
   orgId: string
   positionId: string
   account: string
@@ -60,3 +62,18 @@ export interface UserBO {
   remark?: string
   status?: string
 }
+
+/**
+ * 传入已有角色
+ */
+export interface UserRoleBO {
+  userId: string
+  roleId: string
+}
+/**
+ * 接收已有角色
+ */
+export interface UserRoleVO {
+  allRoles: RoleVO[]
+  hasRoles: string[]
+}

+ 8 - 1
src/api/module/system/user.ts

@@ -1,5 +1,5 @@
 import http from '@/axios'
-import { UserBO, UserInfo, UserQuery, UserVO } from '@/api/interface/system/user'
+import { UserBO, UserInfo, UserQuery, UserRoleVO, UserVO } from '@/api/interface/system/user'
 
 class UserApi {
   static getInfo = (): Promise<ResultData<any>> => {
@@ -53,5 +53,12 @@ class UserApi {
   static delete = (data: string[]): Promise<ResultData<any>> => {
     return http.delete({ url: '/system/user/delete', data })
   }
+  /**
+   * @name 查询已有角色
+   * @returns returns
+   */
+  static getRole = (params: string): Promise<ResultData<any>> => {
+    return http.get<UserRoleVO>({ url: `/system/user/role/${params}` })
+  }
 }
 export default UserApi

+ 3 - 0
src/types/auto-components.d.ts

@@ -8,6 +8,7 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
+    AddRoleDialog: typeof import('./../views/system/user/components/AddRoleDialog.vue')['default']
     AppClassic: typeof import('./../layouts/container/AppClassic/index.vue')['default']
     AppFooter: typeof import('./../layouts/components/AppFooter/index.vue')['default']
     AppLogo: typeof import('./../layouts/components/AppLogo/index.vue')['default']
@@ -31,6 +32,7 @@ declare module 'vue' {
     ElCol: typeof import('element-plus/es')['ElCol']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElContainer: typeof import('element-plus/es')['ElContainer']
+    ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDrawer: typeof import('element-plus/es')['ElDrawer']
     ElDropdown: typeof import('element-plus/es')['ElDropdown']
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
@@ -62,6 +64,7 @@ declare module 'vue' {
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
+    ElTransfer: typeof import('element-plus/es')['ElTransfer']
     ElTree: typeof import('element-plus/es')['ElTree']
     ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     Form: typeof import('./../views/system/org/components/form.vue')['default']

+ 104 - 0
src/views/system/user/components/AddRoleDialog.vue

@@ -0,0 +1,104 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="`${paramsProps.title}-${paramsProps.row?.userName}`"
+    :destroy-on-close="true"
+    width="650px"
+    draggable
+    append-to-body>
+    <el-transfer
+      v-model="hasRoles"
+      filterable
+      :filter-method="filterMethod"
+      :titles="['未设置角色', '已设置角色']"
+      filter-placeholder="筛选角色"
+      :props="transferProps"
+      :data="allRoles" />
+    <template #footer>
+      <el-button @click="visible = false"> 取消 </el-button>
+      <el-button type="primary" @click="handleSubmit"> 确定 </el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { RoleVO } from '@/api/interface/system/role'
+import { UserBO, UserRoleBO } from '@/api/interface/system/user'
+import UserApi from '@/api/module/system/user'
+import { ResultEnum } from '@/enums/HttpEnum'
+
+defineOptions({
+  name: 'UserPermissions'
+})
+
+interface EcoDialogProps {
+  api?: (params: any) => Promise<any> // 调用接口
+  title: string // 顶部标题
+  row: Partial<UserBO>
+  getTableList?: () => void
+}
+
+const transferProps = {
+  key: 'roleId',
+  label: 'name'
+}
+
+/**
+ * 过滤角色
+ * @param query
+ * @param item
+ * @returns {boolean}
+ */
+const filterMethod = (query: string, item: Record<string, any>) => {
+  return item.name.toLowerCase().includes(query.toLowerCase())
+}
+
+const visible = ref(false)
+const paramsProps = ref<EcoDialogProps>({
+  title: '',
+  row: {},
+  api: undefined,
+  getTableList: undefined
+})
+
+// 接收父组件传过来的参数
+const acceptParams = (params: EcoDialogProps) => {
+  paramsProps.value = params
+  visible.value = true
+  getRole(params.row.userId || '')
+}
+
+const allRoles = ref<RoleVO[]>([])
+const hasRoles = ref<string[]>([])
+
+/**
+ * 获取权限信息
+ * @param userId
+ */
+const getRole = (userId: string) => {
+  if (!userId) return
+  UserApi.getRole(userId).then(res => {
+    hasRoles.value = res.data.hasRoles
+    allRoles.value = res.data.allRoles
+  })
+}
+
+const handleSubmit = async () => {
+  try {
+    const { code } = await paramsProps.value.api!(paramsProps.value.row)
+    if (code == ResultEnum.SUCCESS) {
+      ElMessage.success({ message: `${paramsProps.value.title}成功!` })
+      paramsProps.value.getTableList!()
+      visible.value = false
+    }
+  } catch (error) {
+    console.log(error)
+  }
+}
+
+defineExpose({
+  acceptParams
+})
+</script>
+
+<style scoped lang="scss"></style>

+ 0 - 2
src/views/system/user/components/UserDrawer.vue

@@ -180,8 +180,6 @@ const handleConfirm = () => {
   ruleFormRef.value!.validate(async valid => {
     if (!valid) return
     try {
-      console.log(drawerProps.value.row)
-
       const { code } = await drawerProps.value.api!(drawerProps.value.row)
       if (code == ResultEnum.SUCCESS) {
         ElMessage.success({ message: `${drawerProps.value.title}成功!` })

+ 16 - 4
src/views/system/user/index.vue

@@ -29,10 +29,7 @@
                 <template #dropdown>
                   <el-dropdown-menu>
                     <el-dropdown-item icon="Refresh" @click="UserApi.resetPassword(row)">重置密码</el-dropdown-item>
-                    <el-dropdown-item icon="CirclePlusFilled"> Action 2 </el-dropdown-item>
-                    <el-dropdown-item icon="CirclePlus">Action 3</el-dropdown-item>
-                    <el-dropdown-item icon="Check">Action 4</el-dropdown-item>
-                    <el-dropdown-item icon="CircleCheck">Action 5</el-dropdown-item>
+                    <el-dropdown-item icon="User" @click="openDialog('设置角色', row)"> 设置角色 </el-dropdown-item>
                   </el-dropdown-menu>
                 </template>
               </el-dropdown>
@@ -42,12 +39,14 @@
       </ProTable>
     </div>
     <UserDrawer ref="drawerRef" />
+    <AddRoleDialog ref="dialogRef" />
   </div>
 </template>
 <script lang="tsx" setup name="OrgManage">
 import OrgApi from '@/api/module/system/org'
 import UserApi from '@/api/module/system/user'
 import UserDrawer from './components/UserDrawer.vue'
+import AddRoleDialog from './components/AddRoleDialog.vue'
 import TreeFilter from '@/components/TreeFilter/index.vue'
 import { ColumnProps, ProTableInstance, SearchProps } from '@/components/ProTable/interface'
 import { UserBO, UserQuery, UserVO } from '@/api/interface/system/user'
@@ -140,6 +139,19 @@ const openDrawer = (title: string, row: Partial<UserBO> = {}) => {
   }
   drawerRef.value?.acceptParams(params)
 }
+
+// 打开 Dialog(新增、查看、编辑)
+const dialogRef = ref<InstanceType<typeof AddRoleDialog> | null>(null)
+const openDialog = (title: string, row: Partial<UserBO> = {}) => {
+  const params = {
+    title,
+    row: title === '新增' ? { orgId: selectTreeId.value } : { ...row },
+    isView: title === '查看',
+    api: title === '新增' ? UserApi.add : title === '编辑' ? UserApi.edit : undefined,
+    getTableList: proTableRef.value?.getTableList
+  }
+  dialogRef.value?.acceptParams(params)
+}
 </script>
 
 <style lang="scss" scoped>