From 209b3bd9790a24f0e598d02c9df2d84609a8fb05 Mon Sep 17 00:00:00 2001 From: yangsy Date: Tue, 13 Jan 2026 13:15:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/index.ts | 1 + src/components/permission/index.ts | 1 + .../permission-config-modal/index.ts | 6 + .../permission-config-modal.vue | 263 ++++++++++++++++++ src/enums/index.ts | 1 + src/enums/permission-type.ts | 13 + src/layouts/app-layout.vue | 8 +- src/pages/permission-page.vue | 184 ++++++++++++ src/router/index.ts | 9 + 9 files changed, 485 insertions(+), 1 deletion(-) create mode 100644 src/components/permission/index.ts create mode 100644 src/components/permission/permission-config-modal/index.ts create mode 100644 src/components/permission/permission-config-modal/permission-config-modal.vue create mode 100644 src/enums/permission-type.ts create mode 100644 src/pages/permission-page.vue diff --git a/src/components/index.ts b/src/components/index.ts index 5b99575..bae6273 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,3 +1,4 @@ export * from './device'; export * from './global'; +export * from './permission'; export * from './station'; diff --git a/src/components/permission/index.ts b/src/components/permission/index.ts new file mode 100644 index 0000000..3aa4b34 --- /dev/null +++ b/src/components/permission/index.ts @@ -0,0 +1 @@ +export * from './permission-config-modal'; diff --git a/src/components/permission/permission-config-modal/index.ts b/src/components/permission/permission-config-modal/index.ts new file mode 100644 index 0000000..16e3da6 --- /dev/null +++ b/src/components/permission/permission-config-modal/index.ts @@ -0,0 +1,6 @@ +import type { ComponentInstance } from 'vue'; +import PermissionConfigModal from './permission-config-modal.vue'; + +export type PermissionConfigModalProps = ComponentInstance['$props']; + +export { PermissionConfigModal }; diff --git a/src/components/permission/permission-config-modal/permission-config-modal.vue b/src/components/permission/permission-config-modal/permission-config-modal.vue new file mode 100644 index 0000000..78949f1 --- /dev/null +++ b/src/components/permission/permission-config-modal/permission-config-modal.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/src/enums/index.ts b/src/enums/index.ts index ca20593..7d2a5e9 100644 --- a/src/enums/index.ts +++ b/src/enums/index.ts @@ -1,3 +1,4 @@ export * from './alarm-type'; export * from './device-type'; export * from './fault-level'; +export * from './permission-type'; diff --git a/src/enums/permission-type.ts b/src/enums/permission-type.ts new file mode 100644 index 0000000..f1224fe --- /dev/null +++ b/src/enums/permission-type.ts @@ -0,0 +1,13 @@ +export const PERMISSION_TYPE_LITERALS = { + VIEW: 'VIEW', + OPERATION: 'OPERATION', +} as const; + +export type PermissionType = keyof typeof PERMISSION_TYPE_LITERALS; + +export const PERMISSION_TYPE_NAMES = { + [PERMISSION_TYPE_LITERALS.VIEW]: '查看', + [PERMISSION_TYPE_LITERALS.OPERATION]: '操作', +} as const; + +export type PermissionTypeEnum = typeof PERMISSION_TYPE_NAMES; diff --git a/src/layouts/app-layout.vue b/src/layouts/app-layout.vue index fe57eaa..3e7a7f2 100644 --- a/src/layouts/app-layout.vue +++ b/src/layouts/app-layout.vue @@ -6,7 +6,7 @@ import { useAlarmStore, useSettingStore, useUserStore } from '@/stores'; import { parseErrorFeedback } from '@/utils'; import { useIsFetching, useIsMutating, useMutation } from '@tanstack/vue-query'; import { isCancel } from 'axios'; -import { ChevronDownIcon, ChevronsLeftIcon, ChevronsRightIcon, ComputerIcon, LogOutIcon, LogsIcon, MapPinIcon, SettingsIcon, SirenIcon } from 'lucide-vue-next'; +import { ChevronDownIcon, ChevronsLeftIcon, ChevronsRightIcon, ComputerIcon, KeyIcon, LogOutIcon, LogsIcon, MapPinIcon, SettingsIcon, SirenIcon } from 'lucide-vue-next'; import { NBadge, NButton, @@ -106,6 +106,12 @@ const menuOptions: MenuOption[] = [ }, ], }, + { + label: () => h(RouterLink, { to: '/permission' }, { default: () => '权限管理' }), + key: '/permission', + show: userStore.isLamp, + icon: renderIcon(KeyIcon), + }, ]; const dropdownOptions: DropdownOption[] = [ diff --git a/src/pages/permission-page.vue b/src/pages/permission-page.vue new file mode 100644 index 0000000..9948bec --- /dev/null +++ b/src/pages/permission-page.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/src/router/index.ts b/src/router/index.ts index 3809a81..7cd6228 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -47,6 +47,15 @@ const router = createRouter({ }, ], }, + { + path: 'permission', + component: () => import('@/pages/permission-page.vue'), + beforeEnter: () => { + const userStore = useUserStore(); + if (userStore.isLamp) return true; + return { path: '/404' }; + }, + }, { path: '/:pathMatch(.*)*', component: () => import('@/pages/not-found-page.vue'),