{{ t('setting.hamburgerIcon') }}
diff --git a/src/components/Setting/src/components/LayoutRadioPicker.vue b/src/components/Setting/src/components/LayoutRadioPicker.vue
index 752c037..9665d64 100644
--- a/src/components/Setting/src/components/LayoutRadioPicker.vue
+++ b/src/components/Setting/src/components/LayoutRadioPicker.vue
@@ -5,14 +5,13 @@ import { computed } from 'vue'
const appStore = useAppStore()
const layout = computed(() => appStore.getLayout)
-console.log(layout.value)
@@ -91,6 +110,51 @@ console.log(layout.value)
}
}
+ &__top {
+ border: 2px solid #e5e7eb;
+ border-radius: 4px;
+
+ &:before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ width: 100%;
+ height: 33%;
+ background-color: #273352;
+ border-radius: 4px 4px 0 0;
+ content: '';
+ }
+ }
+
+ &__cut-menu {
+ border: 2px solid #e5e7eb;
+ border-radius: 4px;
+
+ &:before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ width: 100%;
+ height: 33%;
+ background-color: #273352;
+ border-radius: 4px 4px 0 0;
+ content: '';
+ }
+
+ &:after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 10%;
+ height: 100%;
+ background-color: #fff;
+ border-radius: 4px 0 0 4px;
+ content: '';
+ }
+ }
+
.is-acitve {
border-color: var(--el-color-primary);
}
diff --git a/src/components/TabMenu/index.ts b/src/components/TabMenu/index.ts
new file mode 100644
index 0000000..b5fd71c
--- /dev/null
+++ b/src/components/TabMenu/index.ts
@@ -0,0 +1,3 @@
+import TabMenu from './src/TabMenu.vue'
+
+export { TabMenu }
diff --git a/src/components/TabMenu/src/TabMenu.vue b/src/components/TabMenu/src/TabMenu.vue
new file mode 100644
index 0000000..278b22b
--- /dev/null
+++ b/src/components/TabMenu/src/TabMenu.vue
@@ -0,0 +1,211 @@
+
+
+
diff --git a/src/components/TabMenu/src/helper.ts b/src/components/TabMenu/src/helper.ts
new file mode 100644
index 0000000..4842809
--- /dev/null
+++ b/src/components/TabMenu/src/helper.ts
@@ -0,0 +1,52 @@
+import { getAllParentPath } from '@/components/Menu/src/helper'
+import type { RouteMeta } from 'vue-router'
+import { isUrl } from '@/utils/is'
+import { cloneDeep } from 'lodash-es'
+import { reactive } from 'vue'
+
+export type TabMapTypes = {
+ [key: string]: string[]
+}
+
+export const tabPathMap = reactive
({})
+
+export const initTabMap = (routes: AppRouteRecordRaw[]) => {
+ for (const v of routes) {
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (!meta?.hidden) {
+ tabPathMap[v.path] = []
+ }
+ }
+}
+
+export const filterMenusPath = (
+ routes: AppRouteRecordRaw[],
+ allRoutes: AppRouteRecordRaw[]
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+ for (const v of routes) {
+ let data: Nullable = null
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (!meta.hidden) {
+ const allParentPaht = getAllParentPath(allRoutes, v.path)
+
+ const fullPath = isUrl(v.path) ? v.path : allParentPaht.join('/')
+
+ data = cloneDeep(v)
+ data.path = fullPath
+ if (v.children && data) {
+ data.children = filterMenusPath(v.children, allRoutes)
+ }
+
+ if (data) {
+ res.push(data)
+ }
+
+ if (allParentPaht.length && Reflect.has(tabPathMap, allParentPaht[0])) {
+ tabPathMap[allParentPaht[0]].push(fullPath)
+ }
+ }
+ }
+
+ return res
+}
diff --git a/src/components/TagsView/src/TagsView.vue b/src/components/TagsView/src/TagsView.vue
index 8aaf751..f06590c 100644
--- a/src/components/TagsView/src/TagsView.vue
+++ b/src/components/TagsView/src/TagsView.vue
@@ -132,8 +132,8 @@ watch(