Bläddra i källkod

feat: 增加权限控制

lanjianrong 4 år sedan
förälder
incheckning
168ee7b7e7

+ 1 - 0
src/api/sys/model/projectModel.ts

@@ -24,6 +24,7 @@ export interface ProjectListItem {
   insideCategory: string
   remark: string
   status: number
+  staffIdEncrypted: string
 }
 
 export type ProjectUpdateOrCreateParams = {

+ 2 - 2
src/store/modules/user.ts

@@ -46,8 +46,8 @@ export const useUserStore = defineStore({
     sessionTimeout: false
   }),
   getters: {
-    getUserInfo(): UserInfo {
-      return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {}
+    getUserInfo(): GetUserInfoModel {
+      return this.userInfo || getAuthCache<GetUserInfoModel>(USER_INFO_KEY) || {}
     },
     getToken(): string {
       return this.token || getAuthCache<string>(TOKEN_KEY)

+ 4 - 3
src/views/dashboard/project-detail/components/account.vue

@@ -3,7 +3,7 @@
     <template #toolbar>
       <div class="w-2/5 flex justify-end">
         <!-- <Search @search="value => handleSearch('search', value)" placeholder="项目名称/项目编号" /> -->
-        <a-button @click="showModalFn" class="ml-3"><PlusOutlined />新增账号</a-button>
+        <a-button v-if="hasPermission" @click="showModalFn" class="ml-3"><PlusOutlined />新增账号</a-button>
       </div>
     </template>
   </BasicTable>
@@ -58,7 +58,8 @@
         type: String as PropType<string>,
         default: '1'
       },
-      hasAdmin: propTypes.bool
+      hasAdmin: propTypes.bool,
+      hasPermission: propTypes.bool
     },
     setup(props) {
       const userStore = useUserStore()
@@ -70,7 +71,7 @@
       const formType = ref(0) // 0 - 创建账号 1 - 更新账号
       const { createMessage } = useMessage()
       const [registerTable, { setTableData }] = useTable({
-        columns: getTableColumns((item: ProjectAccountItem) => showUpdateModalFn(item)),
+        columns: getTableColumns((item: ProjectAccountItem) => showUpdateModalFn(item), props.hasPermission),
         showTableSetting: true,
         canResize: true
       })

+ 25 - 15
src/views/dashboard/project-detail/components/info.vue

@@ -12,6 +12,7 @@
   import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'
   import { updateProject } from '/@/api/sys/project'
   import { useMessage } from '/@/hooks/web/useMessage'
+  import { propTypes } from '/@/utils/propTypes'
 
   export default defineComponent({
     components: {
@@ -21,7 +22,8 @@
       info: {
         type: Object as PropType<ProjectListItem>,
         required: true
-      }
+      },
+      hasPermission: propTypes.bool
     },
     emits: ['updateInfo:info'],
     setup(props, { emit }) {
@@ -50,7 +52,8 @@
                 label: '停用',
                 value: ProjectStatusEnum.STOP
               }
-            ]
+            ],
+            disabled: !props.hasPermission
           }
         },
         {
@@ -65,7 +68,6 @@
           field: 'code',
           component: 'Input',
           label: '项目编号',
-
           componentProps: {
             disabled: true
           }
@@ -74,7 +76,7 @@
           field: 'name',
           component: 'Input',
           label: '项目名称',
-
+          disabled: !props.hasPermission,
           required: true
         },
         {
@@ -82,10 +84,10 @@
           component: 'Select',
           componentProps: {
             options,
-            showArrow: true
+            showArrow: true,
+            disabled: !props.hasPermission
           },
           label: '所在办事处',
-
           required: true
         },
         {
@@ -94,7 +96,8 @@
           label: '销售负责人',
           componentProps: {
             options,
-            showArrow: true
+            showArrow: true,
+            disabled: !props.hasPermission
           },
           colProps: {
             span: 14
@@ -107,7 +110,8 @@
           disabledLabelWidth: true,
           componentProps: {
             options: staffOptions,
-            showArrow: true
+            showArrow: true,
+            disabled: !props.hasPermission
           },
           label: '',
           colProps: {
@@ -119,12 +123,16 @@
         {
           field: 'remark',
           component: 'InputTextArea',
+          componentProps: {
+            disabled: !props.hasPermission
+          },
           label: '备注'
         }
       ])
       const [register, { updateSchema, setFieldsValue }] = useForm({
         labelWidth: 120,
         schemas,
+        showActionButtonGroup: props.hasPermission,
         actionColOptions: {
           flex: '280px',
           span: 14
@@ -193,15 +201,17 @@
         if (values.staffId) {
           newVal.staffName = staffOptions.value.find(item => item.value === values.staffId)?.label || ''
         }
-        await updateProject(newVal)
-        info.value = { ...info.value, ...newVal }
-      }
-      function handleSubmit(values) {
         try {
-          handleOnSave(values)
-        } finally {
-          createMessage.success('更新成功')
+          await updateProject(newVal)
+        } catch (error) {
+          return false
         }
+        info.value = { ...info.value, ...newVal }
+        return true
+      }
+      async function handleSubmit(values) {
+        const result = await handleOnSave(values)
+        result && createMessage.success('更新成功')
       }
       return { register, schemas, handleSubmit }
     }

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

@@ -1,7 +1,7 @@
 import { BasicColumn } from '/@/components/Table/src/types/table'
 import { Icon } from '/@/components/Icon/index'
 import { ProjectAccountItem } from '/@/api/sys/model/projectModel'
-export function getTableColumns(fn: (item: ProjectAccountItem) => void): BasicColumn[] {
+export function getTableColumns(fn: (item: ProjectAccountItem) => void, hasPermission: boolean): BasicColumn[] {
   return [
     {
       dataIndex: 'account',
@@ -40,9 +40,11 @@ export function getTableColumns(fn: (item: ProjectAccountItem) => void): BasicCo
       title: '操作',
       customRender: ({ record }) => (
         <div>
-          <a-button type="primary" onClick={() => fn(record)}>
-            编辑
-          </a-button>
+          {hasPermission && (
+            <a-button type="primary" onClick={() => fn(record)}>
+              编辑
+            </a-button>
+          )}
         </div>
       )
     }

+ 19 - 3
src/views/dashboard/project-detail/index.vue

@@ -15,10 +15,20 @@
     <div>
       <a-tabs :default-active-key="activeKey" @change="tabChange">
         <a-tab-pane key="1" tab="项目信息">
-          <ProjectInfo v-if="projectInfo" :info="projectInfo" @updateInfo:info="updateInfo" />
+          <ProjectInfo
+            v-if="projectInfo"
+            :info="projectInfo"
+            @updateInfo:info="updateInfo"
+            :has-permission="hasPermission"
+          />
         </a-tab-pane>
         <a-tab-pane key="2" tab="项目账号">
-          <ProjectAccount :active-id="activeKey" :id="projectInfo?.id" :has-admin="hasAdmin" />
+          <ProjectAccount
+            :active-id="activeKey"
+            :id="projectInfo?.id"
+            :has-admin="hasAdmin"
+            :has-permission="hasPermission"
+          />
         </a-tab-pane>
         <!-- <a-tab-pane key="3" tab="项目标段" />
         <a-tab-pane key="4" tab="办事处共享" />
@@ -38,6 +48,7 @@
   import { projectStatusBgColorMap, projectStatusTextMap } from '/@/enums/statusEnum'
   import ProjectInfo from './components/info.vue'
   import ProjectAccount from './components/account.vue'
+  import { useUserStore } from '/@/store/modules/user'
   export default defineComponent({
     name: 'Project',
     components: {
@@ -52,6 +63,10 @@
       const { prefixCls } = useDesign('project')
       const projectInfo = ref<Nullable<ProjectListItem>>(null)
       const hasAdmin = computed(() => projectInfo.value?.userId !== 'xCi4xUL6uur0h7fVI--NeA')
+      const userStore = useUserStore()
+      const hasPermission = computed(
+        () => !!userStore.getUserInfo.isAdmin || projectInfo.value?.staffIdEncrypted === userStore.getUserInfo.id
+      )
       const route = useRoute()
       async function fetchProjectInfo(id: string) {
         const project = await getProjectById({ id })
@@ -82,7 +97,8 @@
         prefixCls,
         updateInfo,
         tabChange,
-        hasAdmin
+        hasAdmin,
+        hasPermission
       }
     }
   })

+ 9 - 2
src/views/dashboard/workbench/index.vue

@@ -4,7 +4,9 @@
       <template #toolbar>
         <div class="w-2/5 flex">
           <Search @search="value => handleSearch('search', value)" placeholder="项目名称/项目编号" />
-          <a-button @click="showModalFn" class="ml-3"><PlusOutlined />新增项目</a-button>
+          <a-button v-if="hasPermission([RoleEnum.ADMIN])" @click="showModalFn" class="ml-3"
+            ><PlusOutlined />新增项目</a-button
+          >
         </div>
       </template>
       <template #filterDropdown="{ setSelectedKeys, selectedKeys, confirm, clearFilters }">
@@ -36,6 +38,7 @@
   import { BasicForm, FormActionType, FormSchema, useForm } from '/@/components/Form/index'
   import { PlusOutlined } from '@ant-design/icons-vue'
   import { PageWrapper } from '/@/components/Page'
+  import { RoleEnum } from '/@/enums/roleEnum'
   import { getProjectList } from '/@/api/sys/project'
   import { Input, Select } from 'ant-design-vue'
   import { getProjectTableColumns } from './tableData'
@@ -44,6 +47,7 @@
   import { addProject } from '/@/api/sys/project'
   import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'
   import { useMessage } from '/@/hooks/web/useMessage'
+  import { usePermission } from '/@/hooks/web/usePermission'
 
   export default defineComponent({
     name: 'Workbench',
@@ -57,6 +61,7 @@
       PlusOutlined
     },
     setup() {
+      const { hasPermission } = usePermission()
       const { createMessage } = useMessage()
       const formElRef = ref<Nullable<FormActionType>>(null)
       const officeStore = useOfficeStore()
@@ -185,7 +190,9 @@
         registerModal,
         registerForm,
         submitModal,
-        formElRef
+        formElRef,
+        hasPermission,
+        RoleEnum
       }
     }
   })