Browse Source

feat: 修改其权限相关hook

lanjianrong 4 năm trước cách đây
mục cha
commit
c4473db18f

+ 4 - 2
src/api/sys/model/userModel.ts

@@ -30,7 +30,9 @@ export interface LoginResultModel {
 /**
  * @description: Get user information return value
  */
-export interface GetUserInfoByUserIdModel {
+export interface GetUserInfoModel {
   username: string
-  category: string
+  id: string
+  roles: string[]
+  isAdmin: number
 }

+ 6 - 6
src/api/sys/user.ts

@@ -3,7 +3,8 @@ import {
   LoginParams,
   // LoginResultModel,
   GetUserInfoByUserIdParams,
-  GetUserInfoByUserIdModel
+  GetUserInfoByUserIdModel,
+  GetUserInfoModel
 } from './model/userModel'
 
 import { ErrorMessageMode } from '/@/utils/http/axios/types'
@@ -11,7 +12,7 @@ import { ErrorMessageMode } from '/@/utils/http/axios/types'
 enum Api {
   Login = '/backstage/login',
   Logout = '/backstage/login/out',
-  GetUserInfoById = '/login/project/name',
+  GetUserInfo = '/backstage/manager/currentuser',
   GetPermCodeByUserId = '/getPermCodeByUserId',
   GetToken = '/login/project/name',
   GetAccountGroupList = '/backstage/account/group'
@@ -35,10 +36,9 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
 /**
  * @description: getUserInfoById
  */
-export function getUserInfoById(params: GetUserInfoByUserIdParams) {
-  return defHttp.get<GetUserInfoByUserIdModel>({
-    url: Api.GetUserInfoById,
-    params
+export function getUserInfo() {
+  return defHttp.get<GetUserInfoModel>({
+    url: Api.GetUserInfo
   })
 }
 

+ 6 - 2
src/enums/roleEnum.ts

@@ -1,7 +1,11 @@
 export enum RoleEnum {
   // super admin
-  SUPER = 'super',
+  // SUPER = 'super',
 
   // tester
-  TEST = 'test',
+  // TEST = 'test',
+  ADMIN = 'admin',
+  SHOWPROJECT = 'showProject',
+  SHOWSTAFF = 'showStaff',
+  SHOWPERMISSION = 'showPermission'
 }

+ 3 - 3
src/layouts/default/header/components/user-dropdown/index.vue

@@ -4,7 +4,7 @@
       <img :class="`${prefixCls}__header`" :src="getUserInfo.avatar" />
       <span :class="`${prefixCls}__info hidden md:block`">
         <span :class="`${prefixCls}__name  `" class="truncate">
-          {{ getUserInfo.realName }}
+          {{ getUserInfo.username }}
         </span>
       </span>
     </span>
@@ -71,8 +71,8 @@
       const userStore = useUserStore()
 
       const getUserInfo = computed(() => {
-        const { realName = '', avatar, desc } = userStore.getUserInfo || {}
-        return { realName, avatar: avatar || headerImg, desc }
+        const { username = '', avatar, desc } = userStore.getUserInfo || {}
+        return { username, avatar: avatar || headerImg, desc }
       })
 
       const [register, { openModal }] = useModal()

+ 5 - 2
src/router/routes/modules/dashboard.ts

@@ -1,6 +1,7 @@
 import type { AppRouteModule } from '/@/router/types'
 
 import { LAYOUT } from '/@/router/constant'
+import { RoleEnum } from '/@/enums/roleEnum'
 // import { t } from '/@/hooks/web/useI18n'
 
 const dashboard: AppRouteModule = {
@@ -18,7 +19,8 @@ const dashboard: AppRouteModule = {
       component: () => import('/@/views/dashboard/workbench/index.vue'),
       meta: {
         icon: 'clarity:users-solid-badged',
-        title: '项目'
+        title: '项目',
+        roles: [RoleEnum.ADMIN, RoleEnum.SHOWPROJECT]
       }
     },
     {
@@ -27,7 +29,8 @@ const dashboard: AppRouteModule = {
       component: () => import('/@/views/dashboard/project-detail/index.vue'),
       meta: {
         title: '项目详情',
-        hideMenu: true
+        hideMenu: true,
+        roles: [RoleEnum.ADMIN, RoleEnum.SHOWPROJECT]
       }
     }
   ]

+ 15 - 11
src/router/routes/modules/manager.ts

@@ -1,6 +1,7 @@
 import type { AppRouteModule } from '/@/router/types'
 
 import { LAYOUT } from '/@/router/constant'
+import { RoleEnum } from '/@/enums/roleEnum'
 
 const manager: AppRouteModule = {
   path: '/manager',
@@ -9,7 +10,8 @@ const manager: AppRouteModule = {
   redirect: '/manager/staff-list',
   meta: {
     title: '后台用户',
-    icon: 'fa-solid:user-cog'
+    icon: 'fa-solid:user-cog',
+    roles: [RoleEnum.ADMIN, RoleEnum.SHOWSTAFF, RoleEnum.SHOWPERMISSION]
   },
   children: [
     {
@@ -17,23 +19,25 @@ const manager: AppRouteModule = {
       name: 'ManagerList',
       component: () => import('/@/views/manager/user/list/index.vue'),
       meta: {
-        title: '用户列表'
-      }
-    },
-    {
-      path: 'staff-detail/:id',
-      name: 'ManagerDetail',
-      component: () => import('/@/views/manager/user/detail/index.vue'),
-      meta: {
-        title: '用户详情'
+        title: '用户列表',
+        roles: [RoleEnum.ADMIN, RoleEnum.SHOWSTAFF]
       }
     },
+    // {
+    //   path: 'staff-detail/:id',
+    //   name: 'ManagerDetail',
+    //   component: () => import('/@/views/manager/user/detail/index.vue'),
+    //   meta: {
+    //     title: '用户详情'
+    //   }
+    // },
     {
       path: 'perm-list',
       name: 'PermList',
       component: () => import('/@/views/manager/permission/index.vue'),
       meta: {
-        title: '权限组'
+        title: '权限组',
+        roles: [RoleEnum.ADMIN, RoleEnum.SHOWPERMISSION]
       }
     }
   ]

+ 37 - 16
src/store/modules/user.ts

@@ -10,11 +10,12 @@ import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum'
 import { getAuthCache, setAuthCache, getToken, removeAuthCache } from '/@/utils/auth'
 import {
   GetUserInfoByUserIdModel,
+  GetUserInfoModel,
   // GetUserInfoByUserIdParams,
   LoginParams
 } from '/@/api/sys/model/userModel'
 
-import { loginApi, getXsrfToken, logoutApi, getAccountGroupList } from '/@/api/sys/user'
+import { loginApi, getXsrfToken, logoutApi, getAccountGroupList, getUserInfo } from '/@/api/sys/user'
 
 import { useI18n } from '/@/hooks/web/useI18n'
 import { useMessage } from '/@/hooks/web/useMessage'
@@ -23,7 +24,7 @@ import { PermGroupItem } from '/@/api/sys/model/managerModel'
 import { getPermGroupList } from '/@/api/sys/manager'
 
 interface UserState {
-  userInfo: Nullable<UserInfo>
+  userInfo: Nullable<GetUserInfoModel>
   token?: string
   roleList: RoleEnum[]
   accountGroups: string[]
@@ -38,9 +39,11 @@ export const useUserStore = defineStore({
     // token
     token: undefined,
     // roleList
-    roleList: [],
+    rolesList: [],
     accountGroups: [],
-    permGroups: []
+    permGroups: [],
+    // Whether the login expired
+    sessionTimeout: false
   }),
   getters: {
     getUserInfo(): UserInfo {
@@ -50,13 +53,16 @@ export const useUserStore = defineStore({
       return this.token || getAuthCache<string>(TOKEN_KEY)
     },
     getRoleList(): RoleEnum[] {
-      return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY)
+      return this.rolesList.length ? this.rolesList : getAuthCache<RoleEnum[]>(ROLES_KEY)
     },
     getGroupList(): string[] {
       return this.accountGroups
     },
     getPermGroupList(): PermGroupItem[] {
       return this.permGroups
+    },
+    getSessionTimeout(): boolean {
+      return !!this.sessionTimeout
     }
   },
   actions: {
@@ -65,7 +71,9 @@ export const useUserStore = defineStore({
       setAuthCache(TOKEN_KEY, info)
     },
     setRoleList(roleList: RoleEnum[]) {
-      this.roleList = roleList
+      console.log('roleList', roleList)
+
+      this.rolesList = roleList
       setAuthCache(ROLES_KEY, roleList)
     },
     setUserInfo(info: UserInfo) {
@@ -78,10 +86,14 @@ export const useUserStore = defineStore({
     setPermGroupList(permList: PermGroupItem[]) {
       this.permGroups = permList
     },
+    setSessionTimeout(flag: boolean) {
+      this.sessionTimeout = flag
+    },
     resetState() {
       this.userInfo = null
       this.token = ''
-      this.roleList = []
+      this.rolesList = []
+      this.sessionTimeout = false
     },
     /**
      * @description: login
@@ -95,22 +107,31 @@ export const useUserStore = defineStore({
       try {
         const { goHome = true, mode, ...loginParams } = params
 
-        const userInfo = await loginApi(loginParams, mode)
+        await loginApi(loginParams, mode)
         // get user info
-        // const userInfo = await this.getUserInfoAction({ userId })
-        this.setRoleList([RoleEnum.SUPER])
-        // if (isAdmin) {
-        // }
-
+        const userInfo = await this.getUserInfoAction()
         // const roleList = roles.map(item => item.value) as RoleEnum[]
-        this.setUserInfo({ ...userInfo })
-        goHome && (await router.replace(PageEnum.BASE_HOME))
+        const sessionTimeout = this.sessionTimeout
+        sessionTimeout && this.setSessionTimeout(false)
+        !sessionTimeout && goHome && (await router.replace(PageEnum.BASE_HOME))
         return userInfo
+        return true
       } catch (error) {
-        return null
+        return Promise.reject(error)
       }
     },
 
+    async getUserInfoAction() {
+      const userInfo = await getUserInfo()
+      this.setUserInfo({ ...userInfo })
+      if (userInfo?.isAdmin) {
+        this.setRoleList([RoleEnum.ADMIN])
+      } else {
+        this.setRoleList(userInfo.roles)
+      }
+
+      return userInfo
+    },
     async fetchGroupList() {
       try {
         const data = await getAccountGroupList()

+ 7 - 6
src/views/dashboard/project-detail/components/account.vue

@@ -11,8 +11,10 @@
     <BasicForm @register="registerForm" ref="formElRef">
       <template #role="{ model, field }">
         <span v-if="hasAdmin" class="text-red">已存在管理员</span>
-        <a-switch v-model:checked="model[field]" size="small" />
-        <span>设为<Icon icon="clarity:administrator-solid" />管理员</span>
+        <span v-else>
+          <a-switch v-model:checked="model[field]" size="small" />
+          <span>设为<Icon icon="clarity:administrator-solid" />管理员</span>
+        </span>
         <!-- <a-radio-group v-else v-model:value="model[field]">
           <a-radio :value="1"></a-radio>
         </a-radio-group> -->
@@ -100,7 +102,6 @@
           field: 'id',
           component: 'Input',
           label: '登录账号',
-          required: true,
           show: false
         },
         {
@@ -144,7 +145,7 @@
           label: '电话'
         },
         {
-          field: 'isAdmin',
+          field: 'boolAdmin',
           label: '特殊账号',
           component: 'Switch',
           slot: 'role'
@@ -194,9 +195,9 @@
         formElRef.value?.validate().then(async (values: any) => {
           try {
             if (formType.value === 0) {
-              await createProjectAccount({ ...values, projectId: props.id, isAdmin: values.isAdmin ? true : false })
+              await createProjectAccount({ ...values, projectId: props.id })
             } else {
-              await updateProjectAccount({ ...values, projectId: props.id, isAdmin: values.isAdmin ? true : false })
+              await updateProjectAccount({ ...values, projectId: props.id })
             }
           } finally {
             openModal(false)

+ 1 - 1
src/views/dashboard/project-detail/components/tableData.tsx

@@ -8,7 +8,7 @@ export function getTableColumns(fn: (item: ProjectAccountItem) => void): BasicCo
       title: '账号',
       customRender: ({ text, record }) => (
         <div>
-          {record.isAdmin ? <Icon icon="clarity:administrator-solid" /> : null}
+          {record.boolAdmin ? <Icon icon="clarity:administrator-solid" /> : null}
           {text}
         </div>
       )

+ 1 - 0
src/views/sys/login/LoginForm.vue

@@ -147,6 +147,7 @@
               password: data.password
             })
           )
+          console.log('userInfo', userInfo)
 
           if (userInfo) {
             notification.success({