diff --git a/build/plugins/auto-import.ts b/build/plugins/auto-import.ts index eb4c02985..d899dbdb5 100644 --- a/build/plugins/auto-import.ts +++ b/build/plugins/auto-import.ts @@ -15,7 +15,7 @@ export default (srcPath: string) => { defaultClass: 'inline-block' }), Components({ - dts: true, + dts: 'src/typings/components.d.ts', resolvers: [NaiveUiResolver(), IconsResolver({ customCollections: ['custom'], componentPrefix: 'icon' })] }) ]; diff --git a/mock/api/route.ts b/mock/api/route.ts index f97432a6b..d6e3f66f4 100644 --- a/mock/api/route.ts +++ b/mock/api/route.ts @@ -369,7 +369,7 @@ const routes: AuthRoute.Route[] = [ title: '关于', requiresAuth: true, singleLayout: 'basic', - permissions: ['super', 'admin', 'test'], + permissions: ['super', 'admin', 'user'], icon: 'fluent:book-information-24-regular', order: 8 } diff --git a/mock/model/route.ts b/mock/model/route.ts new file mode 100644 index 000000000..74624b317 --- /dev/null +++ b/mock/model/route.ts @@ -0,0 +1,848 @@ +const routes: Record = { + super: [ + { + name: 'dashboard', + path: '/dashboard', + component: 'basic', + children: [ + { + name: 'dashboard_analysis', + path: '/dashboard/analysis', + component: 'self', + meta: { + title: '分析页', + requiresAuth: true, + icon: 'icon-park-outline:analysis' + } + }, + { + name: 'dashboard_workbench', + path: '/dashboard/workbench', + component: 'self', + meta: { + title: '工作台', + requiresAuth: true, + icon: 'icon-park-outline:workbench' + } + } + ], + meta: { + title: '仪表盘', + icon: 'carbon:dashboard', + order: 1 + } + }, + { + name: 'document', + path: '/document', + component: 'basic', + children: [ + { + name: 'document_vue', + path: '/document/vue', + component: 'self', + meta: { + title: 'vue文档', + requiresAuth: true, + icon: 'mdi:vuejs' + } + }, + { + name: 'document_vue-new', + path: '/document/vue-new', + component: 'self', + meta: { + title: 'vue文档(新版)', + requiresAuth: true, + icon: 'mdi:vuejs' + } + }, + { + name: 'document_vite', + path: '/document/vite', + component: 'self', + meta: { + title: 'vite文档', + requiresAuth: true, + icon: 'simple-icons:vite' + } + }, + { + name: 'document_project', + path: '/document/project', + meta: { + title: '项目文档(外链)', + requiresAuth: true, + icon: 'mdi:file-link-outline', + href: 'https://docs.soybean.pro/' + } + } + ], + meta: { + title: '文档', + icon: 'carbon:document', + order: 2 + } + }, + { + name: 'component', + path: '/component', + component: 'basic', + children: [ + { + name: 'component_button', + path: '/component/button', + component: 'self', + meta: { + title: '按钮', + requiresAuth: true, + icon: 'ic:baseline-radio-button-checked' + } + }, + { + name: 'component_card', + path: '/component/card', + component: 'self', + meta: { + title: '卡片', + requiresAuth: true, + icon: 'mdi:card-outline' + } + }, + { + name: 'component_table', + path: '/component/table', + component: 'self', + meta: { + title: '表格', + requiresAuth: true, + icon: 'mdi:table-large' + } + } + ], + meta: { + title: '组件示例', + icon: 'fluent:app-store-24-regular', + order: 3 + } + }, + { + name: 'plugin', + path: '/plugin', + component: 'basic', + children: [ + { + name: 'plugin_map', + path: '/plugin/map', + component: 'self', + meta: { + title: '地图', + requiresAuth: true, + icon: 'mdi:map' + } + }, + { + name: 'plugin_video', + path: '/plugin/video', + component: 'self', + meta: { + title: '视频', + requiresAuth: true, + icon: 'mdi:video' + } + }, + { + name: 'plugin_editor', + path: '/plugin/editor', + component: 'multi', + children: [ + { + name: 'plugin_editor_quill', + path: '/plugin/editor/quill', + component: 'self', + meta: { + title: '富文本编辑器', + requiresAuth: true, + icon: 'mdi:file-document-edit-outline' + } + }, + { + name: 'plugin_editor_markdown', + path: '/plugin/editor/markdown', + component: 'self', + meta: { + title: 'markdown编辑器', + requiresAuth: true, + icon: 'ri:markdown-line' + } + } + ], + meta: { + title: '编辑器', + icon: 'icon-park-outline:editor' + } + }, + { + name: 'plugin_swiper', + path: '/plugin/swiper', + component: 'self', + meta: { + title: 'Swiper插件', + requiresAuth: true, + icon: 'simple-icons:swiper' + } + }, + { + name: 'plugin_copy', + path: '/plugin/copy', + component: 'self', + meta: { + title: '剪贴板', + requiresAuth: true, + icon: 'mdi:clipboard-outline' + } + }, + { + name: 'plugin_icon', + path: '/plugin/icon', + component: 'self', + meta: { + title: '图标', + requiresAuth: true, + icon: 'ic:baseline-insert-emoticon' + } + }, + { + name: 'plugin_print', + path: '/plugin/print', + component: 'self', + meta: { + title: '打印', + requiresAuth: true, + icon: 'ic:baseline-local-printshop' + } + } + ], + meta: { + title: '插件示例', + icon: 'clarity:plugin-line', + order: 4 + } + }, + { + name: 'auth-demo', + path: '/auth-demo', + component: 'basic', + children: [ + { + name: 'auth-demo_permission', + path: '/auth-demo/permission', + component: 'self', + meta: { + title: '权限切换', + requiresAuth: true, + icon: 'ic:round-construction' + } + }, + { + name: 'auth-demo_super', + path: '/auth-demo/super', + component: 'self', + meta: { + title: '超级管理员可见', + requiresAuth: true, + icon: 'ic:round-supervisor-account' + } + } + ], + meta: { + title: '权限示例', + icon: 'ic:baseline-security', + order: 5 + } + }, + { + name: 'exception', + path: '/exception', + component: 'basic', + children: [ + { + name: 'exception_403', + path: '/exception/403', + component: 'self', + meta: { + title: '异常页403', + requiresAuth: true, + icon: 'ic:baseline-block' + } + }, + { + name: 'exception_404', + path: '/exception/404', + component: 'self', + meta: { + title: '异常页404', + requiresAuth: true, + icon: 'ic:baseline-web-asset-off' + } + }, + { + name: 'exception_500', + path: '/exception/500', + component: 'self', + meta: { + title: '异常页500', + requiresAuth: true, + icon: 'ic:baseline-wifi-off' + } + } + ], + meta: { + title: '异常页', + icon: 'ant-design:exception-outlined', + order: 6 + } + }, + { + name: 'multi-menu', + path: '/multi-menu', + component: 'basic', + children: [ + { + name: 'multi-menu_first', + path: '/multi-menu/first', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second', + path: '/multi-menu/first/second', + component: 'self', + meta: { + title: '二级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + }, + { + name: 'multi-menu_first_second-new', + path: '/multi-menu/first/second-new', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second-new_third', + path: '/multi-menu/first/second-new/third', + component: 'self', + meta: { + title: '三级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '二级菜单(有子菜单)', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '一级菜单', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '多级菜单', + icon: 'carbon:menu', + order: 7 + } + }, + { + name: 'about', + path: '/about', + component: 'self', + meta: { + title: '关于', + requiresAuth: true, + singleLayout: 'basic', + icon: 'fluent:book-information-24-regular', + order: 8 + } + } + ], + admin: [ + { + name: 'dashboard', + path: '/dashboard', + component: 'basic', + children: [ + { + name: 'dashboard_analysis', + path: '/dashboard/analysis', + component: 'self', + meta: { + title: '分析页', + requiresAuth: true, + icon: 'icon-park-outline:analysis' + } + }, + { + name: 'dashboard_workbench', + path: '/dashboard/workbench', + component: 'self', + meta: { + title: '工作台', + requiresAuth: true, + icon: 'icon-park-outline:workbench' + } + } + ], + meta: { + title: '仪表盘', + icon: 'carbon:dashboard', + order: 1 + } + }, + { + name: 'document', + path: '/document', + component: 'basic', + children: [ + { + name: 'document_vue', + path: '/document/vue', + component: 'self', + meta: { + title: 'vue文档', + requiresAuth: true, + icon: 'mdi:vuejs' + } + }, + { + name: 'document_vue-new', + path: '/document/vue-new', + component: 'self', + meta: { + title: 'vue文档(新版)', + requiresAuth: true, + icon: 'mdi:vuejs' + } + }, + { + name: 'document_vite', + path: '/document/vite', + component: 'self', + meta: { + title: 'vite文档', + requiresAuth: true, + icon: 'simple-icons:vite' + } + }, + { + name: 'document_project', + path: '/document/project', + meta: { + title: '项目文档(外链)', + requiresAuth: true, + icon: 'mdi:file-link-outline', + href: 'https://docs.soybean.pro/' + } + } + ], + meta: { + title: '文档', + icon: 'carbon:document', + order: 2 + } + }, + { + name: 'component', + path: '/component', + component: 'basic', + children: [ + { + name: 'component_button', + path: '/component/button', + component: 'self', + meta: { + title: '按钮', + requiresAuth: true, + icon: 'ic:baseline-radio-button-checked' + } + }, + { + name: 'component_card', + path: '/component/card', + component: 'self', + meta: { + title: '卡片', + requiresAuth: true, + icon: 'mdi:card-outline' + } + }, + { + name: 'component_table', + path: '/component/table', + component: 'self', + meta: { + title: '表格', + requiresAuth: true, + icon: 'mdi:table-large' + } + } + ], + meta: { + title: '组件示例', + icon: 'fluent:app-store-24-regular', + order: 3 + } + }, + { + name: 'plugin', + path: '/plugin', + component: 'basic', + children: [ + { + name: 'plugin_map', + path: '/plugin/map', + component: 'self', + meta: { + title: '地图', + requiresAuth: true, + icon: 'mdi:map' + } + }, + { + name: 'plugin_video', + path: '/plugin/video', + component: 'self', + meta: { + title: '视频', + requiresAuth: true, + icon: 'mdi:video' + } + }, + { + name: 'plugin_editor', + path: '/plugin/editor', + component: 'multi', + children: [ + { + name: 'plugin_editor_quill', + path: '/plugin/editor/quill', + component: 'self', + meta: { + title: '富文本编辑器', + requiresAuth: true, + icon: 'mdi:file-document-edit-outline' + } + }, + { + name: 'plugin_editor_markdown', + path: '/plugin/editor/markdown', + component: 'self', + meta: { + title: 'markdown编辑器', + requiresAuth: true, + icon: 'ri:markdown-line' + } + } + ], + meta: { + title: '编辑器', + icon: 'icon-park-outline:editor' + } + }, + { + name: 'plugin_swiper', + path: '/plugin/swiper', + component: 'self', + meta: { + title: 'Swiper插件', + requiresAuth: true, + icon: 'simple-icons:swiper' + } + }, + { + name: 'plugin_copy', + path: '/plugin/copy', + component: 'self', + meta: { + title: '剪贴板', + requiresAuth: true, + icon: 'mdi:clipboard-outline' + } + }, + { + name: 'plugin_icon', + path: '/plugin/icon', + component: 'self', + meta: { + title: '图标', + requiresAuth: true, + icon: 'ic:baseline-insert-emoticon' + } + }, + { + name: 'plugin_print', + path: '/plugin/print', + component: 'self', + meta: { + title: '打印', + requiresAuth: true, + icon: 'ic:baseline-local-printshop' + } + } + ], + meta: { + title: '插件示例', + icon: 'clarity:plugin-line', + order: 4 + } + }, + { + name: 'auth-demo', + path: '/auth-demo', + component: 'basic', + children: [ + { + name: 'auth-demo_permission', + path: '/auth-demo/permission', + component: 'self', + meta: { + title: '权限切换', + requiresAuth: true, + icon: 'ic:round-construction' + } + } + ], + meta: { + title: '权限示例', + icon: 'ic:baseline-security', + order: 5 + } + }, + { + name: 'exception', + path: '/exception', + component: 'basic', + children: [ + { + name: 'exception_403', + path: '/exception/403', + component: 'self', + meta: { + title: '异常页403', + requiresAuth: true, + icon: 'ic:baseline-block' + } + }, + { + name: 'exception_404', + path: '/exception/404', + component: 'self', + meta: { + title: '异常页404', + requiresAuth: true, + icon: 'ic:baseline-web-asset-off' + } + }, + { + name: 'exception_500', + path: '/exception/500', + component: 'self', + meta: { + title: '异常页500', + requiresAuth: true, + icon: 'ic:baseline-wifi-off' + } + } + ], + meta: { + title: '异常页', + icon: 'ant-design:exception-outlined', + order: 6 + } + }, + { + name: 'multi-menu', + path: '/multi-menu', + component: 'basic', + children: [ + { + name: 'multi-menu_first', + path: '/multi-menu/first', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second', + path: '/multi-menu/first/second', + component: 'self', + meta: { + title: '二级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + }, + { + name: 'multi-menu_first_second-new', + path: '/multi-menu/first/second-new', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second-new_third', + path: '/multi-menu/first/second-new/third', + component: 'self', + meta: { + title: '三级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '二级菜单(有子菜单)', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '一级菜单', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '多级菜单', + icon: 'carbon:menu', + order: 7 + } + }, + { + name: 'about', + path: '/about', + component: 'self', + meta: { + title: '关于', + requiresAuth: true, + singleLayout: 'basic', + icon: 'fluent:book-information-24-regular', + order: 8 + } + } + ], + user: [ + { + name: 'dashboard', + path: '/dashboard', + component: 'basic', + children: [ + { + name: 'dashboard_analysis', + path: '/dashboard/analysis', + component: 'self', + meta: { + title: '分析页', + requiresAuth: true, + icon: 'icon-park-outline:analysis' + } + } + ], + meta: { + title: '仪表盘', + icon: 'carbon:dashboard', + order: 1 + } + }, + { + name: 'auth-demo', + path: '/auth-demo', + component: 'basic', + children: [ + { + name: 'auth-demo_permission', + path: '/auth-demo/permission', + component: 'self', + meta: { + title: '权限切换', + requiresAuth: true, + icon: 'ic:round-construction' + } + } + ], + meta: { + title: '权限示例', + icon: 'ic:baseline-security', + order: 5 + } + }, + { + name: 'multi-menu', + path: '/multi-menu', + component: 'basic', + children: [ + { + name: 'multi-menu_first', + path: '/multi-menu/first', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second', + path: '/multi-menu/first/second', + component: 'self', + meta: { + title: '二级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + }, + { + name: 'multi-menu_first_second-new', + path: '/multi-menu/first/second-new', + component: 'multi', + children: [ + { + name: 'multi-menu_first_second-new_third', + path: '/multi-menu/first/second-new/third', + component: 'self', + meta: { + title: '三级菜单', + requiresAuth: true, + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '二级菜单(有子菜单)', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '一级菜单', + icon: 'ic:outline-menu' + } + } + ], + meta: { + title: '多级菜单', + icon: 'carbon:menu', + order: 7 + } + }, + { + name: 'about', + path: '/about', + component: 'self', + meta: { + title: '关于', + requiresAuth: true, + singleLayout: 'basic', + icon: 'fluent:book-information-24-regular', + order: 8 + } + } + ] +}; + +export default routes; diff --git a/mock/model/user.ts b/mock/model/user.ts new file mode 100644 index 000000000..384311c77 --- /dev/null +++ b/mock/model/user.ts @@ -0,0 +1,35 @@ +interface ModelUser { + userId: string; + userName: string; + password: string; + role: Auth.RoleType; +} + +const users: ModelUser[] = [ + { + userId: '0', + userName: 'Soybean', + password: 'soybean', + role: 'super' + }, + { + userId: '1', + userName: 'Super', + password: 'super', + role: 'super' + }, + { + userId: '2', + userName: 'Admin', + password: 'admin', + role: 'admin' + }, + { + userId: '3', + userName: 'User01', + password: 'user01', + role: 'user' + } +]; + +export default users; diff --git a/src/config/map-sdk.ts b/src/config/map-sdk.ts index e28fa78b8..f0b806633 100644 --- a/src/config/map-sdk.ts +++ b/src/config/map-sdk.ts @@ -1,6 +1,5 @@ /** 百度地图sdk地址 */ -export const BAIDU_MAP_SDK_URL = - 'https://api.map.baidu.com/getscript?v=3.0&ak=KSezYymXPth1DIGILRX3oYN9PxbOQQmU&services=&t=20210201100830&s=1'; +export const BAIDU_MAP_SDK_URL = `https://api.map.baidu.com/getscript?v=3.0&ak=KSezYymXPth1DIGILRX3oYN9PxbOQQmU&services=&t=20210201100830&s=1`; /** 高德地图sdk地址 */ export const GAODE_MAP_SDK_URL = 'https://webapi.amap.com/maps?v=2.0&key=e7bd02bd504062087e6563daf4d6721d'; diff --git a/src/enum/business.ts b/src/enum/business.ts index 894b46494..9d58a1838 100644 --- a/src/enum/business.ts +++ b/src/enum/business.ts @@ -1,3 +1,11 @@ +/** 用户角色 */ +export enum EnumUserRole { + super = '超级管理员', + admin = '管理员', + user = '普通用户' + // custom = '自定义角色' +} + /** 登录模块 */ export enum EnumLoginModule { 'pwd-login' = '账密登录', diff --git a/src/router/modules/about.ts b/src/router/modules/about.ts index 47fea40b0..219cd1331 100644 --- a/src/router/modules/about.ts +++ b/src/router/modules/about.ts @@ -6,7 +6,7 @@ const about: AuthRoute.Route = { title: '关于', requiresAuth: true, singleLayout: 'basic', - permissions: ['super', 'admin', 'test'], + permissions: ['super', 'admin', 'user'], icon: 'fluent:book-information-24-regular', order: 8 } diff --git a/src/typings/business.d.ts b/src/typings/business.d.ts index f25bb1d8e..073b6d2c5 100644 --- a/src/typings/business.d.ts +++ b/src/typings/business.d.ts @@ -4,10 +4,10 @@ declare namespace Auth { * 用户角色类型(前端静态路由用角色类型进行路由权限的控制) * - super: 超级管理员(该权限具有所有路由数据) * - admin: 管理员 - * - test: 测试 - * - normal: 普通用户 + * - user: 用户 + * - custom: 自定义角色 */ - type RoleType = 'super' | 'admin' | 'test' | 'normal'; + type RoleType = keyof typeof import('@/enum').EnumUserRole; /** 用户信息 */ interface UserInfo { diff --git a/components.d.ts b/src/typings/components.d.ts similarity index 100% rename from components.d.ts rename to src/typings/components.d.ts diff --git a/src/utils/auth/user.ts b/src/utils/auth/user.ts index 632f859c4..6000ee6d4 100644 --- a/src/utils/auth/user.ts +++ b/src/utils/auth/user.ts @@ -37,7 +37,7 @@ export function getUserInfo() { userId: '', userName: '', userPhone: '', - userRole: 'normal' + userRole: 'user' }; const userInfo: Auth.UserInfo = getLocal(EnumStorageKey['user-info']) || emptyInfo; return userInfo; diff --git a/src/views/auth-demo/permission/index.vue b/src/views/auth-demo/permission/index.vue index 7425cc2d9..90fa02518 100644 --- a/src/views/auth-demo/permission/index.vue +++ b/src/views/auth-demo/permission/index.vue @@ -8,7 +8,7 @@ :value="auth.userInfo.userRole" class="w-120px" size="small" - :options="roleList" + :options="options" @update:value="auth.updateUserRole" />
@@ -17,7 +17,7 @@
super可见 admin可见 - admin和test可见 + admin和test可见
权限函数 hasPermission @@ -25,7 +25,7 @@ super可见 admin可见 - admin和test可见 + admin和user可见
@@ -33,6 +33,8 @@