diff --git a/package.json b/package.json
index 55e0ef59..2b54b4c6 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"prettier": "prettier --write"
},
"dependencies": {
+ "@vitejs/plugin-vue-jsx": "^3.0.0",
"@vuemap/vue-amap": "^1.1.20",
"ant-design-vue": "^3.2.15",
"axios": "^1.2.1",
diff --git a/src/components/PermissionButton/index.vue b/src/components/PermissionButton/index.vue
new file mode 100644
index 00000000..cbeb5c37
--- /dev/null
+++ b/src/components/PermissionButton/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/index.ts b/src/components/index.ts
index 19985bef..0742e8cf 100644
--- a/src/components/index.ts
+++ b/src/components/index.ts
@@ -1,8 +1,10 @@
import type { App } from 'vue'
import AIcon from './AIcon'
+import PermissionButton from './PermissionButton/index.vue'
export default {
install(app: App) {
app.component('AIcon', AIcon)
+ app.component('PermissionButton', PermissionButton)
}
}
diff --git a/src/router/router.ts b/src/router/router.ts
new file mode 100644
index 00000000..bc22c28f
--- /dev/null
+++ b/src/router/router.ts
@@ -0,0 +1,240 @@
+/** 路由Code */
+export enum MENUS_CODE {
+ 'home' = 'home',
+ 'Analysis/CPU' = 'Analysis/CPU',
+ 'Analysis/DeviceChart' = 'Analysis/DeviceChart',
+ 'Analysis/DeviceMessage' = 'Analysis/DeviceMessage',
+ 'Analysis/Jvm' = 'Analysis/Jvm',
+ 'Analysis/MessageChart' = 'Analysis/MessageChart',
+ 'Analysis' = 'Analysis',
+ 'cloud/Aliyun' = 'cloud/Aliyun',
+ 'cloud/Ctwing' = 'cloud/Ctwing',
+ 'cloud/DuerOS' = 'cloud/DuerOS',
+ 'cloud/Onenet' = 'cloud/Onenet',
+ 'device/Alarm' = 'device/Alarm',
+ 'device/Category/Save' = 'device/Category/Save',
+ 'device/Category' = 'device/Category',
+ 'device/Command' = 'device/Command',
+ 'device/DataSource' = 'device/DataSource',
+ 'device/Instance' = 'device/Instance',
+ 'device/Location' = 'device/Location',
+ 'device/Product/Save' = 'device/Product/Save',
+ 'device/Product' = 'device/Product',
+ 'device/DashBoard' = 'device/DashBoard',
+ 'device/components/Alarm/Edit' = 'device/components/Alarm/Edit',
+ 'device/components/Alarm/Record' = 'device/components/Alarm/Record',
+ 'device/components/Alarm/Setting' = 'device/components/Alarm/Setting',
+ 'device/components/Alarm' = 'device/components/Alarm',
+ 'device/components/Metadata/Base/Edit' = 'device/components/Metadata/Base/Edit',
+ 'device/components/Metadata/Base' = 'device/components/Metadata/Base',
+ 'device/components/Metadata/Cat' = 'device/components/Metadata/Cat',
+ 'device/components/Metadata/Import' = 'device/components/Metadata/Import',
+ 'device/components/Metadata' = 'device/components/Metadata',
+ 'link/Certificate' = 'link/Certificate',
+ 'link/Certificate/Detail' = 'link/Certificate/Detail',
+ 'link/Gateway' = 'link/Gateway',
+ 'link/Protocol/Debug' = 'link/Protocol/Debug',
+ 'link/Protocol' = 'link/Protocol',
+ 'link/Type' = 'link/Type',
+ 'link/AccessConfig' = 'link/AccessConfig',
+ 'link/DataCollect/Dashboard' = 'link/DataCollect/Dashboard',
+ 'link/DataCollect/DataGathering' = 'link/DataCollect/DataGathering',
+ 'link/DataCollect/IntegratedQuery' = 'link/DataCollect/IntegratedQuery',
+ 'edge/Device' = 'edge/Device',
+ 'edge/Resource' = 'edge/Resource',
+ 'Log' = 'Log',
+ 'media/Cascade' = 'media/Cascade',
+ 'media/Cascade/Save' = 'media/Cascade/Save',
+ 'media/Cascade/Channel' = 'media/Cascade/Channel',
+ 'media/Config' = 'media/Config',
+ 'media/Device' = 'media/Device',
+ 'media/Device/Save' = 'media/Device/Save',
+ 'media/Device/Channel' = 'media/Device/Channel',
+ 'media/Device/Playback' = 'media/Device/Playback',
+ 'media/Reveal' = 'media/Reveal',
+ 'media/Stream' = 'media/Stream',
+ 'media/Stream/Detail' = 'media/Stream/Detail',
+ 'media/DashBoard' = 'media/DashBoard',
+ 'notice/Type' = 'notice/Type',
+ 'notice/Config' = 'notice/Config',
+ 'media/SplitScreen' = 'media/SplitScreen',
+ 'notice/Type/Config' = 'notice/Config',
+ 'notice/Config/Detail' = 'notice/Config/Detail',
+ 'notice/Template' = 'notice/Template',
+ 'notice/Template/Detail' = 'notice/Template/Detail',
+ 'rule-engine/DashBoard' = 'rule-engine/DashBoard',
+ 'rule-engine/Instance' = 'rule-engine/Instance',
+ 'rule-engine/SQLRule' = 'rule-engine/SQLRule',
+ 'rule-engine/Scene' = 'rule-engine/Scene',
+ 'rule-engine/Alarm/Log' = 'rule-engine/Alarm/Log',
+ 'rule-engine/Alarm/Log/Detail' = 'rule-engine/Alarm/Log/Detail',
+ 'rule-engine/Alarm/Config' = 'rule-engine/Alarm/Config',
+ 'rule-engine/Scene/Save' = 'rule-engine/Scene/Save',
+ 'rule-engine/Scene/Save2' = 'rule-engine/Scene/Save2',
+ 'rule-engine/Alarm/Configuration' = 'rule-engine/Alarm/Configuration',
+ 'rule-engine/Alarm/Configuration/Save' = 'rule-engine/Alarm/Configuration/Save',
+ 'simulator/Device' = 'simulator/Device',
+ 'system/DataSource' = 'system/DataSource',
+ 'system/DataSource/Management' = 'system/DataSource/Management',
+ 'system/Department/Assets' = 'system/Department/Assets',
+ 'system/Department/Member' = 'system/Department/Member',
+ 'system/Department' = 'system/Department',
+ 'system/Menu' = 'system/Menu',
+ 'system/Menu/Setting' = 'system/Menu/Setting',
+ 'system/OpenAPI' = 'system/OpenAPI',
+ 'system/Permission' = 'system/Permission',
+ 'system/Role/Detail' = 'system/Role/Detail',
+ 'system/Role' = 'system/Role',
+ 'system/Tenant/Detail/Assets' = 'system/Tenant/Detail/Assets',
+ 'system/Tenant/Detail/Info' = 'system/Tenant/Detail/Info',
+ 'system/Tenant/Detail/Member' = 'system/Tenant/Detail/Member',
+ 'system/Tenant/Detail/Permission' = 'system/Tenant/Detail/Permission',
+ 'system/Tenant/Detail' = 'system/Tenant/Detail',
+ 'system/Tenant' = 'system/Tenant',
+ 'system/User' = 'system/User',
+ 'system/Relationship' = 'system/Relationship',
+ 'system/Basis' = 'system/Basis',
+ 'user/Login' = 'user/Login',
+ 'visualization/Category' = 'visualization/Category',
+ 'visualization/Configuration' = 'visualization/Configuration',
+ 'visualization/Screen' = 'visualization/Screen',
+ 'device/Firmware' = 'device/Firmware',
+ 'device/Firmware/Task' = 'device/Firmware/Task',
+ 'device/Firmware/Task/Detail' = 'device/Firmware/Task/Detail',
+ 'device/Instance/Detail/Config/Tags' = 'device/Instance/Detail/Config/Tags',
+ 'device/Instance/Detail/Config' = 'device/Instance/Detail/Config',
+ 'device/Instance/Detail/Functions' = 'device/Instance/Detail/Functions',
+ 'device/Instance/Detail/Info' = 'device/Instance/Detail/Info',
+ 'device/Instance/Detail/Log' = 'device/Instance/Detail/Log',
+ 'device/Instance/Detail/MetadataLog/Event' = 'device/Instance/Detail/MetadataLog/Event',
+ 'device/Instance/Detail/MetadataLog/Property' = 'device/Instance/Detail/MetadataLog/Property',
+ 'device/Instance/Detail/Running' = 'device/Instance/Detail/Running',
+ 'device/Instance/Detail' = 'device/Instance/Detail',
+ 'device/Product/Detail/BaseInfo' = 'device/Product/Detail/BaseInfo',
+ 'device/Product/Detail' = 'device/Product/Detail',
+ 'link/AccessConfig/Detail' = 'link/AccessConfig/Detail',
+ 'link/DashBoard' = 'link/DashBoard',
+ 'system/Menu/Detail' = 'system/Menu/Detail',
+ 'system/Department/Detail' = 'system/Department/Detail',
+ 'link/Type/Detail' = 'link/Type/Detail',
+ 'account/Center' = 'account/Center',
+ 'account/NotificationSubscription' = 'account/NotificationSubscription',
+ 'account/NotificationRecord' = 'account/NotificationRecord',
+ 'account/Center/bind' = 'account/Center/bind',
+ 'Northbound/DuerOS' = 'Northbound/DuerOS',
+ 'Northbound/DuerOS/Detail' = 'Northbound/DuerOS/Detail',
+ 'Northbound/AliCloud' = 'Northbound/AliCloud',
+ 'Northbound/AliCloud/Detail' = 'Northbound/AliCloud/Detail',
+ 'system/Platforms' = 'system/Platforms',
+ 'system/Platforms/Api' = 'system/Platforms/Api',
+ 'system/Platforms/View' = 'system/Platforms/View',
+ 'system/Platforms/Setting' = 'system/Platforms/Setting',
+ 'system/Apply' = 'system/Apply',
+ 'system/Apply/Api' = 'system/Apply/Api',
+ 'system/Apply/View' = 'system/Apply/View',
+ 'system/License' = 'system/License',
+ 'iot-card/Home' = 'iot-card/Home',
+ 'iot-card/Platform' = 'iot-card/Platform',
+ 'iot-card/Platform/Detail' = 'iot-card/Platform/Detail',
+ 'iot-card/Recharge' = 'iot-card/Recharge',
+ 'iot-card/Dashboard' = 'iot-card/Dashboard',
+ 'iot-card/CardManagement' = 'iot-card/CardManagement',
+ 'iot-card/Record' = 'iot-card/Record',
+}
+
+export type MENUS_CODE_TYPE = keyof typeof MENUS_CODE | string;
+
+export enum BUTTON_PERMISSION_ENUM {
+ 'add' = 'add',
+ 'delete' = 'delete',
+ 'import' = 'import',
+ 'view' = 'view',
+ 'export' = 'export',
+ 'update' = 'update',
+ 'action' = 'action',
+ 'push' = 'push',
+ 'assert' = 'assert',
+ 'bind-user' = 'bind-user',
+ 'active' = 'active',
+ 'sync' = 'sync',
+ 'channel' = 'channel',
+ 'debug' = 'debug',
+ 'log' = 'log',
+ 'tigger' = 'tigger',
+ 'empowerment' = 'empowerment',
+ 'bind' = 'bind',
+ 'edit' = 'edit', //资产权限编辑
+ 'setting' = 'setting', //菜单配置
+ 'password' = 'password', //重置密码
+ 'api' = 'api', //查看api
+ 'manage' = 'manage', //数据源-管理
+ 'stop' = 'stop',
+ 'restart' = 'restart',
+ 'pay' = 'pay', //充值
+}
+
+// 调试按钮、通知记录、批量导出、批量导入、选择通道、推送、分配资产、绑定用户对应的ID是啥
+export type CUSTOM_BUTTON = 'debug' | 'log' | 'channel' | 'assert' | 'bind-user';
+
+export type BUTTON_PERMISSION = keyof typeof BUTTON_PERMISSION_ENUM | string | CUSTOM_BUTTON;
+
+export const getDetailNameByCode = {
+ 'system/Menu/Detail': '菜单详情',
+ 'device/Product/Detail': '产品详情',
+ 'device/Instance/Detail': '设备详情',
+ 'device/Firmware/Task/Detail': '详情',
+ 'system/Department/Detail': '组织详情',
+ 'system/Role/Detail': '权限配置',
+ 'link/Type/Detail': '网络组件详情',
+ 'link/AccessConfig/Detail': '配置详情',
+ 'media/Stream/Detail': '流媒体详情',
+ 'rule-engine/Alarm/Log/Detail': '告警日志',
+ 'Northbound/AliCloud/Detail': '阿里云详情',
+ 'link/Certificate/Detail': '证书详情',
+ 'iot-card/Platform/Detail': '平台对接详情',
+};
+
+// 开源版路由
+export const CommunityCodeList = [
+ 'account/Center',
+ 'account/NotificationSubscription',
+ 'account/NotificationRecord',
+ 'system/Basis',
+ 'system/User',
+ 'system/Department',
+ 'system/Department/Detail',
+ 'system/Role',
+ 'system/Role/Detail',
+ 'system/Menu',
+ 'system/Menu/Detail',
+ 'system/Menu/Setting',
+ 'system/Permission',
+ 'system/Relationship',
+ 'home',
+ 'rule-engine/DashBoard',
+ 'rule-engine/Alarm/Configuration',
+ 'rule-engine/Alarm/Configuration/Save',
+ 'rule-engine/Alarm/Log',
+ 'rule-engine/Alarm/Log/Detail',
+ 'device/DashBoard',
+ 'device/Category',
+ 'device/Instance',
+ 'device/Instance/Detail',
+ 'device/Product',
+ 'device/Product/Detail',
+ 'link/AccessConfig',
+ 'link/AccessConfig/Detail',
+ 'link/Protocol',
+ 'link/DashBoard',
+ 'Log',
+ 'link/Type',
+ 'link/Type/Detail',
+ 'link/Certificate',
+ 'link/Certificate/Detail',
+ 'rule-engine/Scene',
+ 'rule-engine/Scene/Save',
+ 'notice/Config',
+ 'notice/Config/Detail',
+ 'notice/Template',
+ 'notice/Template/Detail',
+];
diff --git a/src/store/permission.ts b/src/store/permission.ts
new file mode 100644
index 00000000..075bced2
--- /dev/null
+++ b/src/store/permission.ts
@@ -0,0 +1,42 @@
+import { defineStore } from "pinia";
+import type { MENUS_CODE_TYPE, BUTTON_PERMISSION } from '@/router/router'
+
+export const usePermissionStore = defineStore({
+ id: 'permission',
+ state: () => ({
+ permissions: {} as {[key: MENUS_CODE_TYPE]: BUTTON_PERMISSION},
+ }),
+ getters: {
+ check(state) {
+ return (permissionCode: string) => {
+ if (!permissionCode) {
+ return true
+ }
+ if (!permissionCode.includes(":")) {
+ return false
+ }
+ const code = permissionCode.split(":")[0]
+ const value = permissionCode.split(":")[1]
+ const _buttonArray = state.permissions[code]
+ if (!_buttonArray) {
+ return false
+ }
+ return _buttonArray.includes(value)
+ }
+ },
+ hasPermission(state) {
+ return (permissionCode: string | string[]) => {
+ if (!permissionCode) {
+ return true
+ }
+ if (!!Object.keys(state.permissions).length) {
+ if (typeof permissionCode === 'string') {
+ return this.check(permissionCode)
+ }
+ return permissionCode.some(_permissionCode => this.check(_permissionCode))
+ }
+ return false
+ }
+ }
+ }
+})
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
index 163e015a..a0f2eac9 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,5 +1,6 @@
import {defineConfig, loadEnv} from 'vite'
import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
import Components from 'unplugin-vue-components/vite'
import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'
import AutoImport from 'unplugin-auto-import/vite'
@@ -46,6 +47,7 @@ export default defineConfig(({ mode}) => {
},
plugins: [
vue(),
+ vueJsx(),
Components({
resolvers: [AntDesignVueResolver({ importStyle: 'less' }), VueAmapResolver()],
directoryAsNamespace: true