diff --git a/src/hooks/use-permission.ts b/src/hooks/use-permission.ts
index 7989d25..4e07779 100644
--- a/src/hooks/use-permission.ts
+++ b/src/hooks/use-permission.ts
@@ -1,6 +1,6 @@
import NProgress from 'nprogress'
import type { RouteRecordName } from 'vue-router'
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
import router, { asyncRoutes, constantRoutes } from '@/router'
import 'nprogress/nprogress.css'
import { useBasicStore } from '@/store/basic'
diff --git a/src/layout/UserProfileLayout.vue b/src/layout/UserProfileLayout.vue
new file mode 100644
index 0000000..0317c9b
--- /dev/null
+++ b/src/layout/UserProfileLayout.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/src/layout/app-main/Breadcrumb.vue b/src/layout/default/app-main/Breadcrumb.vue
similarity index 100%
rename from src/layout/app-main/Breadcrumb.vue
rename to src/layout/default/app-main/Breadcrumb.vue
diff --git a/src/layout/app-main/Hamburger.vue b/src/layout/default/app-main/Hamburger.vue
similarity index 100%
rename from src/layout/app-main/Hamburger.vue
rename to src/layout/default/app-main/Hamburger.vue
diff --git a/src/layout/app-main/Navbar.vue b/src/layout/default/app-main/Navbar.vue
similarity index 98%
rename from src/layout/app-main/Navbar.vue
rename to src/layout/default/app-main/Navbar.vue
index 6b87f05..72866b1 100644
--- a/src/layout/app-main/Navbar.vue
+++ b/src/layout/default/app-main/Navbar.vue
@@ -70,7 +70,7 @@ import { elMessage } from "@/hooks/use-element";
import { useBasicStore } from "@/store/basic";
import { langTitle } from "@/hooks/use-common";
import userImage from "@/assets/layout/user.png";
-import Debugger from "@/layout/app-main/component/Debugger.vue";
+import Debugger from "@/layout/default/app-main/component/Debugger.vue";
const basicStore = useBasicStore();
const { settings, sidebar, setToggleSideBar, userInfo } = basicStore;
diff --git a/src/layout/app-main/TagsView.vue b/src/layout/default/app-main/TagsView.vue
similarity index 100%
rename from src/layout/app-main/TagsView.vue
rename to src/layout/default/app-main/TagsView.vue
diff --git a/src/layout/app-main/component/Debugger.vue b/src/layout/default/app-main/component/Debugger.vue
similarity index 100%
rename from src/layout/app-main/component/Debugger.vue
rename to src/layout/default/app-main/component/Debugger.vue
diff --git a/src/layout/app-main/component/LangSelect.vue b/src/layout/default/app-main/component/LangSelect.vue
similarity index 100%
rename from src/layout/app-main/component/LangSelect.vue
rename to src/layout/default/app-main/component/LangSelect.vue
diff --git a/src/layout/app-main/component/ScreenFull.vue b/src/layout/default/app-main/component/ScreenFull.vue
similarity index 100%
rename from src/layout/app-main/component/ScreenFull.vue
rename to src/layout/default/app-main/component/ScreenFull.vue
diff --git a/src/layout/app-main/component/ScreenLock.vue b/src/layout/default/app-main/component/ScreenLock.vue
similarity index 100%
rename from src/layout/app-main/component/ScreenLock.vue
rename to src/layout/default/app-main/component/ScreenLock.vue
diff --git a/src/layout/app-main/component/SizeSelect.vue b/src/layout/default/app-main/component/SizeSelect.vue
similarity index 100%
rename from src/layout/app-main/component/SizeSelect.vue
rename to src/layout/default/app-main/component/SizeSelect.vue
diff --git a/src/layout/app-main/component/ThemeSelect.vue b/src/layout/default/app-main/component/ThemeSelect.vue
similarity index 100%
rename from src/layout/app-main/component/ThemeSelect.vue
rename to src/layout/default/app-main/component/ThemeSelect.vue
diff --git a/src/layout/app-main/index.vue b/src/layout/default/app-main/index.vue
similarity index 100%
rename from src/layout/app-main/index.vue
rename to src/layout/default/app-main/index.vue
diff --git a/src/layout/index.vue b/src/layout/default/index.vue
similarity index 100%
rename from src/layout/index.vue
rename to src/layout/default/index.vue
diff --git a/src/layout/sidebar/Link.vue b/src/layout/default/sidebar/Link.vue
similarity index 100%
rename from src/layout/sidebar/Link.vue
rename to src/layout/default/sidebar/Link.vue
diff --git a/src/layout/sidebar/Logo.vue b/src/layout/default/sidebar/Logo.vue
similarity index 100%
rename from src/layout/sidebar/Logo.vue
rename to src/layout/default/sidebar/Logo.vue
diff --git a/src/layout/sidebar/SidebarItem.vue b/src/layout/default/sidebar/SidebarItem.vue
similarity index 97%
rename from src/layout/sidebar/SidebarItem.vue
rename to src/layout/default/sidebar/SidebarItem.vue
index c32a250..26eb5be 100644
--- a/src/layout/sidebar/SidebarItem.vue
+++ b/src/layout/default/sidebar/SidebarItem.vue
@@ -28,7 +28,7 @@
import { ref } from 'vue'
import { resolve } from 'path-browserify'
import Link from './Link.vue'
-import MenuIcon from '../../components/MenuIcon.vue'
+import MenuIcon from '../../../components/MenuIcon.vue'
import type { RouteRawConfig } from '~/basic'
import { isExternal } from '@/hooks/use-layout'
import { langTitle } from '@/hooks/use-common'
diff --git a/src/layout/sidebar/index.vue b/src/layout/default/sidebar/index.vue
similarity index 100%
rename from src/layout/sidebar/index.vue
rename to src/layout/default/sidebar/index.vue
diff --git a/src/layout/submenu/index.vue b/src/layout/submenu/index.vue
new file mode 100644
index 0000000..d99a094
--- /dev/null
+++ b/src/layout/submenu/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
diff --git a/src/layout/submenu/sidebar/index.vue b/src/layout/submenu/sidebar/index.vue
new file mode 100644
index 0000000..a88a910
--- /dev/null
+++ b/src/layout/submenu/sidebar/index.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index 89ab940..5834a94 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,7 +1,8 @@
import { createRouter, createWebHistory } from 'vue-router'
import type { RouterTypes } from '~/basic'
import settings from '@/settings'
-const Layout = () => import('@/layout/index.vue')
+import { userRoute } from '@/router/modules/user'
+const Layout = () => import('@/layout/default/index.vue')
export const constantRoutes: RouterTypes = [
{
@@ -38,19 +39,7 @@ export const constantRoutes: RouterTypes = [
}
]
},
- {
- path: '/user',
- name: '用户',
- component: Layout,
- hidden: true,
- children: [
- {
- path: 'profile',
- name: '首选项',
- component: () => import('@/views/user/profile/index.vue')
- }
- ]
- }
+ userRoute
]
//角色和code数组动态路由
diff --git a/src/router/modules/basic-demo.ts b/src/router/modules/basic-demo.ts
index e93584b..5468595 100644
--- a/src/router/modules/basic-demo.ts
+++ b/src/router/modules/basic-demo.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const BasicDemo = {
path: '/basic-demo',
component: Layout,
diff --git a/src/router/modules/charts.ts b/src/router/modules/charts.ts
index c8841eb..b7a88da 100644
--- a/src/router/modules/charts.ts
+++ b/src/router/modules/charts.ts
@@ -1,6 +1,6 @@
/** When your routing table is too long, you can split it into small modules**/
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const chartsRouter = {
path: '/charts',
diff --git a/src/router/modules/directive.ts b/src/router/modules/directive.ts
index ce26e09..d9d86c0 100644
--- a/src/router/modules/directive.ts
+++ b/src/router/modules/directive.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const directive = {
path: '/directive',
diff --git a/src/router/modules/excel.ts b/src/router/modules/excel.ts
index d722541..c3ad98c 100644
--- a/src/router/modules/excel.ts
+++ b/src/router/modules/excel.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const excel = {
path: '/excel',
component: Layout,
diff --git a/src/router/modules/guid.ts b/src/router/modules/guid.ts
index 885f0e2..fbe296a 100644
--- a/src/router/modules/guid.ts
+++ b/src/router/modules/guid.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const guid = {
path: '/guide',
component: Layout,
diff --git a/src/router/modules/other.ts b/src/router/modules/other.ts
index 31c708c..1d546f9 100644
--- a/src/router/modules/other.ts
+++ b/src/router/modules/other.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const other = {
path: '/other',
component: Layout,
diff --git a/src/router/modules/rich-text.ts b/src/router/modules/rich-text.ts
index 252e42f..d0a1af2 100644
--- a/src/router/modules/rich-text.ts
+++ b/src/router/modules/rich-text.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const richText = {
path: '/rich-text',
component: Layout,
diff --git a/src/router/modules/table.ts b/src/router/modules/table.ts
index 64b8f8e..77244b3 100644
--- a/src/router/modules/table.ts
+++ b/src/router/modules/table.ts
@@ -1,4 +1,4 @@
-import Layout from '@/layout/index.vue'
+import Layout from '@/layout/default/index.vue'
const table = {
path: '/table',
component: Layout,
diff --git a/src/router/modules/user.ts b/src/router/modules/user.ts
new file mode 100644
index 0000000..f7568bf
--- /dev/null
+++ b/src/router/modules/user.ts
@@ -0,0 +1,17 @@
+import type { BootstrapIcons, RouteRawConfig } from "~/basic";
+
+export const userRoute = {
+ path: '/user',
+ name: 'User',
+ component: () => import('@/layout/UserProfileLayout.vue'),
+ meta: { title: '用户中心', icon: 'person' as BootstrapIcons },
+ hidden: true,
+ children: [
+ {
+ path: 'profile',
+ name: 'Profile',
+ meta: {title: '个人信息', icon: 'text-left' as BootstrapIcons},
+ component: () => import('@/views/user/profile/index.vue')
+ }
+ ]
+} as RouteRawConfig
diff --git a/typings/basic.d.ts b/typings/basic.d.ts
index d322486..e2d7a6d 100644
--- a/typings/basic.d.ts
+++ b/typings/basic.d.ts
@@ -11,31 +11,50 @@
/*router*/
import type { RouteRecordRaw } from 'vue-router'
-export interface rawConfig {
- hidden?: boolean
- alwaysShow?: boolean
- code?: number
- name?: string
- fullPath?: string
- path?: string
- meta?: {
- title: string
- icon?: string
- affix?: boolean
- activeMenu?: string
- breadcrumb?: boolean
- roles?: Array
- elSvgIcon?: string
- code?: number
- cachePage?: boolean
- leaveRmCachePage?: boolean
- closeTabRmCache?: boolean
- }
- children?: RouterOptions
- redirect?: string
+
+import type icons from 'bootstrap-icons/font/bootstrap-icons.json'
+export type BootstrapIcons = keyof typeof icons;
+
+export interface RawConfig {
+ /** 是否隐藏路由 */
+ hidden: boolean
+ /** TODO 不知道。 */
+ alwaysShow: boolean
+ /** TODO 不知道。 */
+ code: number
+ /** 路由名称 */
+ name: string
+ /** 完整路径,一般不填 */
+ fullPath: string
+ /** 路径,可以为相对路径 */
+ path: string
+ /** 元数据,没有元数据时不显示菜单 */
+ meta: Omit, 'title'> & Required>
+ /** 子路由 */
+ children: RouterTypes
+ /** 重定向,绝对路径 */
+ redirect: string
+ /** 是否显示子菜单 */
+ expand: boolean
}
-export type RouteRawConfig = RouteRecordRaw & rawConfig
-export type RouterTypes = Array
+
+export interface RawConfigMeta {
+ /** 路由标题,显示在菜单按钮上 */
+ title: string
+ /** 路由图标 */
+ icon: BootstrapIcons
+ affix: boolean
+ activeMenu: string
+ breadcrumb: boolean
+ roles: Array
+ code: number
+ cachePage: boolean
+ leaveRmCachePage: boolean
+ closeTabRmCache: boolean
+}
+
+export type RouteRawConfig = RouteRecordRaw & Partial
+export type RouterTypes = Array
/*settings*/
export interface SettingsConfig {