zuypeng il y a 1 an
Parent
commit
f0c746182e

+ 104 - 104
admin-web/src/layout/component/aside.vue

@@ -1,20 +1,21 @@
 <template>
-	<div class="h100" >
-<!--	<div class="h100" v-show="!isTagsViewCurrenFull">-->
-		<el-aside class="layout-aside" :class="setCollapseStyle">
-			<Logo  />
-<!--			<Logo v-if="setShowLogo" />-->
-			<el-scrollbar class="flex-auto" ref="layoutAsideScrollbarRef" @mouseenter="onAsideEnterLeave(true)" @mouseleave="onAsideEnterLeave(false)">
-				<Vertical :menuList="state.menuList" />
-			</el-scrollbar>
-		</el-aside>
-	</div>
+  <div class="h100" >
+    <!--	<div class="h100" v-show="!isTagsViewCurrenFull">-->
+    <el-aside class="layout-aside" :class="setCollapseStyle">
+      <Logo  />
+
+      <!--			<Logo v-if="setShowLogo" />-->
+      <el-scrollbar class="flex-auto" ref="layoutAsideScrollbarRef" @mouseenter="onAsideEnterLeave(true)" @mouseleave="onAsideEnterLeave(false)">
+        <Vertical :menuList="state.menuList" />
+      </el-scrollbar>
+    </el-aside>
+  </div>
 </template>
 
 <script setup lang="ts" name="layoutAside">
 import { defineAsyncComponent, reactive, computed, watch, onBeforeMount, ref } from 'vue';
 import { storeToRefs } from 'pinia';
-import pinia from '/@/stores';
+import pinia from '/@/stores/index';
 import { useRoutesList } from '/@/stores/routesList';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
@@ -33,129 +34,128 @@ const { routesList } = storeToRefs(stores);
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const { isTagsViewCurrenFull } = storeToRefs(storesTagsViewRoutes);
 const state = reactive<AsideState>({
-	menuList: [],
-	clientWidth: 0,
+  menuList: [],
+  clientWidth: 0,
 });
 
 // 设置菜单展开/收起时的宽度
 const setCollapseStyle = computed(() => {
-	const { layout, isCollapse, menuBar } = themeConfig.value;
-	const asideBrTheme = ['#FFFFFF', '#FFF', '#fff', '#ffffff'];
-	const asideBrColor = asideBrTheme.includes(menuBar) ? 'layout-el-aside-br-color' : '';
-	// 判断是否是手机端
-	if (state.clientWidth <= 1000) {
-		if (isCollapse) {
-			document.body.setAttribute('class', 'el-popup-parent--hidden');
-			const asideEle = document.querySelector('.layout-container') as HTMLElement;
-			const modeDivs = document.createElement('div');
-			modeDivs.setAttribute('class', 'layout-aside-mobile-mode');
-			asideEle.appendChild(modeDivs);
-			modeDivs.addEventListener('click', closeLayoutAsideMobileMode);
-			return [asideBrColor, 'layout-aside-mobile', 'layout-aside-mobile-open'];
-		} else {
-			// 关闭弹窗
-			closeLayoutAsideMobileMode();
-			return [asideBrColor, 'layout-aside-mobile', 'layout-aside-mobile-close'];
-		}
-	} else {
-		if (layout === 'columns') {
-			// 分栏布局,菜单收起时宽度给 1px
-			if (isCollapse) return [asideBrColor, 'layout-aside-pc-1'];
-			else return [asideBrColor, 'layout-aside-pc-220'];
-		} else {
-			// 其它布局给 64px
-			if (isCollapse) return [asideBrColor, 'layout-aside-pc-64'];
-			else return [asideBrColor, 'layout-aside-pc-220'];
-		}
-	}
+  const { layout, isCollapse, menuBar } = themeConfig.value;
+  const asideBrTheme = ['#FFFFFF', '#FFF', '#fff', '#ffffff'];
+  const asideBrColor = asideBrTheme.includes(menuBar) ? 'layout-el-aside-br-color' : '';
+  // 判断是否是手机端
+  if (state.clientWidth <= 1000) {
+    if (isCollapse) {
+      document.body.setAttribute('class', 'el-popup-parent--hidden');
+      const asideEle = document.querySelector('.layout-container') as HTMLElement;
+      const modeDivs = document.createElement('div');
+      modeDivs.setAttribute('class', 'layout-aside-mobile-mode');
+      asideEle.appendChild(modeDivs);
+      modeDivs.addEventListener('click', closeLayoutAsideMobileMode);
+      return [asideBrColor, 'layout-aside-mobile', 'layout-aside-mobile-open'];
+    } else {
+      // 关闭弹窗
+      closeLayoutAsideMobileMode();
+      return [asideBrColor, 'layout-aside-mobile', 'layout-aside-mobile-close'];
+    }
+  } else {
+    if (layout === 'columns') {
+      // 分栏布局,菜单收起时宽度给 1px
+      if (isCollapse) return [asideBrColor, 'layout-aside-pc-1'];
+      else return [asideBrColor, 'layout-aside-pc-220'];
+    } else {
+      // 其它布局给 64px
+      if (isCollapse) return [asideBrColor, 'layout-aside-pc-64'];
+      else return [asideBrColor, 'layout-aside-pc-220'];
+    }
+  }
 });
 // 设置显示/隐藏 logo
 const setShowLogo = computed(() => {
-	let { layout, isShowLogo } = themeConfig.value;
-	return (isShowLogo && layout === 'defaults') || (isShowLogo && layout === 'columns');
+  let { layout, isShowLogo } = themeConfig.value;
+  return (isShowLogo && layout === 'defaults') || (isShowLogo && layout === 'columns');
 });
 // 关闭移动端蒙版
 const closeLayoutAsideMobileMode = () => {
-	const el = document.querySelector('.layout-aside-mobile-mode');
-	el?.setAttribute('style', 'animation: error-img-two 0.3s');
-	setTimeout(() => {
-		el?.parentNode?.removeChild(el);
-	}, 300);
-	const clientWidth = document.body.clientWidth;
-	if (clientWidth < 1000) themeConfig.value.isCollapse = false;
-	document.body.setAttribute('class', '');
+  const el = document.querySelector('.layout-aside-mobile-mode');
+  el?.setAttribute('style', 'animation: error-img-two 0.3s');
+  setTimeout(() => {
+    el?.parentNode?.removeChild(el);
+  }, 300);
+  const clientWidth = document.body.clientWidth;
+  if (clientWidth < 1000) themeConfig.value.isCollapse = false;
+  document.body.setAttribute('class', '');
 };
 // 设置/过滤路由(非静态路由/是否显示在菜单中)
 const setFilterRoutes = () => {
-	if (themeConfig.value.layout === 'columns') return false;
-
-	state.menuList = filterRoutesFun(routesList.value);
+  if (themeConfig.value.layout === 'columns') return false;
+  state.menuList = filterRoutesFun(routesList.value);
 };
 // 路由过滤递归函数
 const filterRoutesFun = <T extends RouteItem>(arr: T[]): T[] => {
-	return arr
-		.filter((item: T) => !item.meta?.isHide)
-		.map((item: T) => {
-			item = Object.assign({}, item);
-			if (item.children) item.children = filterRoutesFun(item.children);
-			return item;
-		});
+  return arr
+      .filter((item: T) => !item.meta?.isHide)
+      .map((item: T) => {
+        item = Object.assign({}, item);
+        if (item.children) item.children = filterRoutesFun(item.children);
+        return item;
+      });
 };
 // 设置菜单导航是否固定(移动端)
 const initMenuFixed = (clientWidth: number) => {
-	state.clientWidth = clientWidth;
+  state.clientWidth = clientWidth;
 };
 // 鼠标移入、移出
 const onAsideEnterLeave = (bool: Boolean) => {
-	let { layout } = themeConfig.value;
-	if (layout !== 'columns') return false;
-	if (!bool) mittBus.emit('restoreDefault');
-	// 开启 `分栏菜单鼠标悬停预加载` 才设置,防止 columnsAside.vue 监听 pinia.state
-	if (themeConfig.value.isColumnsMenuHoverPreload) stores.setColumnsMenuHover(bool);
+  let { layout } = themeConfig.value;
+  if (layout !== 'columns') return false;
+  if (!bool) mittBus.emit('restoreDefault');
+  // 开启 `分栏菜单鼠标悬停预加载` 才设置,防止 columnsAside.vue 监听 pinia.state
+  if (themeConfig.value.isColumnsMenuHoverPreload) stores.setColumnsMenuHover(bool);
 };
 // 页面加载前
 onBeforeMount(() => {
-	initMenuFixed(document.body.clientWidth);
-	setFilterRoutes();
-	// 此界面不需要取消监听(mittBus.off('setSendColumnsChildren))
-	// 因为切换布局时有的监听需要使用,取消了监听,某些操作将不生效
-	mittBus.on('setSendColumnsChildren', (res: MittMenu) => {
-		state.menuList = res.children;
-	});
-	// 开启经典布局分割菜单时,设置菜单数据
-	mittBus.on('setSendClassicChildren', (res: MittMenu) => {
-		let { layout, isClassicSplitMenu } = themeConfig.value;
-		if (layout === 'classic' && isClassicSplitMenu) {
-			state.menuList = [];
-			state.menuList = res.children;
-		}
-	});
-	// 开启经典布局分割菜单时,重新处理菜单数据
-	mittBus.on('getBreadcrumbIndexSetFilterRoutes', () => {
-		setFilterRoutes();
-	});
-	// 监听窗口大小改变时(适配移动端)
-	mittBus.on('layoutMobileResize', (res: LayoutMobileResize) => {
-		initMenuFixed(res.clientWidth);
-		closeLayoutAsideMobileMode();
-	});
+  initMenuFixed(document.body.clientWidth);
+  setFilterRoutes();
+  // 此界面不需要取消监听(mittBus.off('setSendColumnsChildren))
+  // 因为切换布局时有的监听需要使用,取消了监听,某些操作将不生效
+  mittBus.on('setSendColumnsChildren', (res: MittMenu) => {
+    state.menuList = res.children;
+  });
+  // 开启经典布局分割菜单时,设置菜单数据
+  mittBus.on('setSendClassicChildren', (res: MittMenu) => {
+    let { layout, isClassicSplitMenu } = themeConfig.value;
+    if (layout === 'classic' && isClassicSplitMenu) {
+      state.menuList = [];
+      state.menuList = res.children;
+    }
+  });
+  // 开启经典布局分割菜单时,重新处理菜单数据
+  mittBus.on('getBreadcrumbIndexSetFilterRoutes', () => {
+    setFilterRoutes();
+  });
+  // 监听窗口大小改变时(适配移动端)
+  mittBus.on('layoutMobileResize', (res: LayoutMobileResize) => {
+    initMenuFixed(res.clientWidth);
+    closeLayoutAsideMobileMode();
+  });
 });
 // 监听 themeConfig 配置文件的变化,更新菜单 el-scrollbar 的高度
 watch(themeConfig.value, (val) => {
-	if (val.isShowLogoChange !== val.isShowLogo) {
-		if (layoutAsideScrollbarRef.value) layoutAsideScrollbarRef.value.update();
-	}
+  if (val.isShowLogoChange !== val.isShowLogo) {
+    if (layoutAsideScrollbarRef.value) layoutAsideScrollbarRef.value.update();
+  }
 });
 // 监听 pinia 值的变化,动态赋值给菜单中
 watch(
-	pinia.state,
-	(val) => {
-		let { layout, isClassicSplitMenu } = val.themeConfig.themeConfig;
-		if (layout === 'classic' && isClassicSplitMenu) return false;
-		setFilterRoutes();
-	},
-	{
-		deep: true,
-	}
+    pinia.state,
+    (val) => {
+      let { layout, isClassicSplitMenu } = val.themeConfig.themeConfig;
+      if (layout === 'classic' && isClassicSplitMenu) return false;
+      setFilterRoutes();
+    },
+    {
+      deep: true,
+    }
 );
 </script>

+ 144 - 104
admin-web/src/layout/navBars/breadcrumb/breadcrumb.vue

@@ -1,150 +1,190 @@
 <template>
-	<div v-if="isShowBreadcrumb" class="layout-navbars-breadcrumb">
-		<SvgIcon
-			class="layout-navbars-breadcrumb-icon"
-			:name="themeConfig.isCollapse ? 'ele-Expand' : 'ele-Fold'"
-			:size="16"
-			@click="onThemeConfigChange"
-		/>
-		<el-breadcrumb class="layout-navbars-breadcrumb-hide">
-			<transition-group name="breadcrumb">
-				<el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="k">
-<!--				<el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="!v.meta.tagsViewName ? v.meta.title : v.meta.tagsViewName">-->
-					<span v-if="k === state.breadcrumbList.length - 1" class="layout-navbars-breadcrumb-span">
-						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />
+  <div v-if="isShowBreadcrumb" class="layout-navbars-breadcrumb">
+    <SvgIcon
+        class="layout-navbars-breadcrumb-icon"
+        :name="themeConfig.isCollapse ? 'ele-Expand' : 'ele-Fold'"
+        :size="16"
+        @click="onThemeConfigChange"
+    />
+    <el-breadcrumb class="layout-navbars-breadcrumb-hide">
+<!--      <transition-group name="breadcrumb">-->
+        <el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="k">
+          <!--				<el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="!v.meta.tagsViewName ? v.meta.title : v.meta.tagsViewName">-->
+          <span v-if="k === state.breadcrumbList.length - 1" class="layout-navbars-breadcrumb-span">
+						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon"/>
 						<div v-if="!v.meta.tagsViewName">{{ $t(v.meta.title) }}</div>
 						<div v-else>{{ v.meta.tagsViewName }}</div>
 					</span>
-					<a v-else @click.prevent="onBreadcrumbClick(v)">
-						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />{{ $t(v.meta.title) }}
-					</a>
-				</el-breadcrumb-item>
-			</transition-group>
-		</el-breadcrumb>
-	</div>
+          <a v-else @click.prevent="onBreadcrumbClick(v)">
+            <SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon"/>
+            {{ $t(v.meta.title) }}
+          </a>
+        </el-breadcrumb-item>
+<!--      </transition-group>-->
+    </el-breadcrumb>
+  </div>
 </template>
 
 <script setup lang="ts" name="layoutBreadcrumb">
-import { reactive, computed, onMounted } from 'vue';
-import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
-import { Local } from '/@/utils/storage';
-import other from '/@/utils/other';
-import { storeToRefs } from 'pinia';
-import { useThemeConfig } from '/@/stores/themeConfig';
-import { useRoutesList } from '/@/stores/routesList';
+import {reactive, computed, onMounted,nextTick} from 'vue';
+import {onBeforeRouteUpdate, useRoute, useRouter} from 'vue-router';
+import {Local} from '/@/utils/storage';
+import {storeToRefs} from 'pinia';
+import {useThemeConfig} from '/@/stores/themeConfig';
+import {useRoutesList} from '/@/stores/routesList';
 
 // 定义变量内容
 const stores = useRoutesList();
 const storesThemeConfig = useThemeConfig();
-const { themeConfig } = storeToRefs(storesThemeConfig);
-const { routesList } = storeToRefs(stores);
+const {themeConfig} = storeToRefs(storesThemeConfig);
+const {routesList} = storeToRefs(stores);
 const route = useRoute();
 const router = useRouter();
 const state = reactive<BreadcrumbState>({
-	breadcrumbList: [],
-	routeSplit: [],
-	routeSplitFirst: '',
-	routeSplitIndex: 1,
+  breadcrumbList: [],
+  routeSplit: [],
+  routeSplitFirst: '',
+  routeSplitIndex: 1,
+  routeLinkList: []
 });
 
+
 // 动态设置经典、横向布局不显示
 const isShowBreadcrumb = computed(() => {
-	initRouteSplit(route.path);
-	const { layout, isBreadcrumb } = themeConfig.value;
-	if (layout === 'classic' || layout === 'transverse') return false;
-	else return isBreadcrumb ? true : false;
+  initRouteSplit(route.path);
+  const {layout, isBreadcrumb} = themeConfig.value;
+  if (layout === 'classic' || layout === 'transverse') return false;
+  else return isBreadcrumb ? true : false;
 });
 // 面包屑点击时
 const onBreadcrumbClick = (v: RouteItem) => {
-	const { redirect, path } = v;
-	if (redirect) router.push(redirect);
-	else router.push(path);
+  const {redirect, path} = v;
+  if (redirect) router.push(redirect);
+  else router.push(path);
 };
 // 展开/收起左侧菜单点击
 const onThemeConfigChange = () => {
-	themeConfig.value.isCollapse = !themeConfig.value.isCollapse;
-	setLocalThemeConfig();
+  themeConfig.value.isCollapse = !themeConfig.value.isCollapse;
+  setLocalThemeConfig();
 };
 // 存储布局配置
 const setLocalThemeConfig = () => {
-	Local.remove('themeConfig');
-	Local.set('themeConfig', themeConfig.value);
+  Local.remove('themeConfig');
+  Local.set('themeConfig', themeConfig.value);
 };
 // 处理面包屑数据
 const getBreadcrumbList = (arr: RouteItems) => {
-	arr.forEach((item: RouteItem) => {
-		state.routeSplit.forEach((v: string, k: number, arrs: string[]) => {
-			if (state.routeSplitFirst === item.path) {
-				state.routeSplitFirst += `/${arrs[state.routeSplitIndex]}`;
-				state.breadcrumbList.push(item);
-				state.routeSplitIndex++;
-				if (item.children) getBreadcrumbList(item.children);
-			}
-		});
-	});
+  arr.forEach((item: RouteItem) => {
+    if (item.children) {
+      item.children.forEach((item: RouteItem) => {
+      })
+    }
+    state.routeSplit.forEach((v: string, k: number, arrs: string[]) => {
+      if (state.routeSplitFirst === item.path) {
+        state.routeSplitFirst += `/${arrs[state.routeSplitIndex]}`;
+        state.breadcrumbList.push(item);
+        state.routeSplitIndex++;
+        if (item.children) getBreadcrumbList(item.children);
+      }
+    });
+  });
 };
 // 当前路由字符串切割成数组,并删除第一项空内容
 const initRouteSplit = (path: string) => {
-	if (!themeConfig.value.isBreadcrumb) return false;
-  // //console.log(path)
-  // //console.log(routesList)
-	state.breadcrumbList = [];
-	// state.breadcrumbList = [routesList.value[0]];
-	state.routeSplit = path.split('/');
-	state.routeSplit.shift();
-	state.routeSplitFirst = `/${state.routeSplit[0]}`;
-	state.routeSplitIndex = 1;
-	getBreadcrumbList(routesList.value);
-	if (route.name === 'home' || (route.name === 'notFound' && state.breadcrumbList.length > 1)) state.breadcrumbList.shift();
-	if (state.breadcrumbList.length > 0)
-		state.breadcrumbList[state.breadcrumbList.length - 1].meta.tagsViewName = other.setTagsViewNameI18n(<RouteToFrom>route);
+  if (!themeConfig.value.isBreadcrumb) return false;
+  console.log(path,route.name)
+  state.breadcrumbList = [];
+  // state.breadcrumbList = [routesList.value[0]];
+  // state.routeSplit = path.split('/');
+  // state.routeSplit.shift();
+  // state.routeSplitFirst = `/${state.routeSplit[0]}`;
+  // state.routeSplitIndex = 1;
+  //routeList 展开为一维数组
+  state.routeLinkList=[]
+  toSimpleRouteList(routesList.value, "")
+  console.log(state.routeLinkList)
+  // setTimeout(()=>{
+    state.breadcrumbList = state.routeLinkList.find(k => k.path === path).links
+    // getBreadcrumbList(routesList.value);
+    // if (route.name === 'home' || (route.name === 'notFound' && state.breadcrumbList.length > 1)) state.breadcrumbList.shift();
+    // if (state.breadcrumbList.length > 0)
+    //   state.breadcrumbList[state.breadcrumbList.length - 1].meta.tagsViewName = other.setTagsViewNameI18n(<RouteToFrom>route);
+
+    console.log(state.breadcrumbList.map(k=>k.meta.title).join("-"))
+  // },300)
+
 };
+
+const toSimpleRouteList = (rs: RouteItems, parentPath: string) => {
+  //{path:'/station/list',links:[r1,r2,r3]}
+  if (!rs) {
+    return;
+  }
+  rs.forEach(r => {
+    let rl = state.routeLinkList.find(k => k.path === parentPath)
+    state.routeLinkList.push({
+      path: r.path,
+      links: rl ? rl.links.concat(r) : [r]
+    })
+    toSimpleRouteList(r.children, r.path)
+  })
+
+}
 // 页面加载时
 onMounted(() => {
-	initRouteSplit(route.path);
+  console.log("onMounted")
+  initRouteSplit(route.path);
 });
 // 路由更新时
 onBeforeRouteUpdate((to) => {
-	initRouteSplit(to.path);
+  console.log("onBeforeRouteUpdate")
+  initRouteSplit(to.path);
 });
 </script>
 
 <style scoped lang="scss">
 .layout-navbars-breadcrumb {
-	flex: 1;
-	height: inherit;
-	display: flex;
-	align-items: center;
-	.layout-navbars-breadcrumb-icon {
-		cursor: pointer;
-		font-size: 18px;
-		color: var(--next-bg-topBarColor);
-		height: 100%;
-		width: 40px;
-		opacity: 0.8;
-		&:hover {
-			opacity: 1;
-		}
-	}
-	.layout-navbars-breadcrumb-span {
-		display: flex;
-		opacity: 0.7;
-		color: var(--next-bg-topBarColor);
-	}
-	.layout-navbars-breadcrumb-iconfont {
-		font-size: 14px;
-		margin-right: 5px;
-	}
-	:deep(.el-breadcrumb__separator) {
-		opacity: 0.7;
-		color: var(--next-bg-topBarColor);
-	}
-	:deep(.el-breadcrumb__inner a, .el-breadcrumb__inner.is-link) {
-		font-weight: unset !important;
-		color: var(--next-bg-topBarColor);
-		&:hover {
-			color: var(--el-color-primary) !important;
-		}
-	}
+  flex: 1;
+  height: inherit;
+  display: flex;
+  align-items: center;
+
+  .layout-navbars-breadcrumb-icon {
+    cursor: pointer;
+    font-size: 18px;
+    color: var(--next-bg-topBarColor);
+    height: 100%;
+    width: 40px;
+    opacity: 0.8;
+
+    &:hover {
+      opacity: 1;
+    }
+  }
+
+  .layout-navbars-breadcrumb-span {
+    display: flex;
+    opacity: 0.7;
+    color: var(--next-bg-topBarColor);
+  }
+
+  .layout-navbars-breadcrumb-iconfont {
+    font-size: 14px;
+    margin-right: 5px;
+  }
+
+  :deep(.el-breadcrumb__separator) {
+    opacity: 0.7;
+    color: var(--next-bg-topBarColor);
+  }
+
+  :deep(.el-breadcrumb__inner a, .el-breadcrumb__inner.is-link) {
+    font-weight: unset !important;
+    color: var(--next-bg-topBarColor);
+
+    &:hover {
+      color: var(--el-color-primary) !important;
+    }
+  }
 }
 </style>

+ 2 - 1
admin-web/src/layout/navBars/tagsView/tagsView.vue

@@ -207,6 +207,7 @@ const addTagsView = (path: string, to?: RouteToFrom) => {
 			}
 			item = state.tagsViewRoutesList.find((v: RouteItem) => v.path === to?.meta?.isDynamicPath);
 		} else {
+      console.log("getThemeConfig.value.isShareTagsView",getThemeConfig.value.isShareTagsView)
 			// 普通路由:参数不同,开启多个 tagsview
 			if (!getThemeConfig.value.isShareTagsView) await solveAddTagsView(path, to);
 			else await singleAddTagsView(path, to);
@@ -615,7 +616,7 @@ watch(
 		list-style: none;
 		margin: 0;
 		padding: 0;
-		height: 14px;
+		height: 34px;
 		display: flex;
 		align-items: center;
 		color: var(--el-text-color-regular);

+ 0 - 161
admin-web/src/router/backEnd.ts

@@ -1,161 +0,0 @@
-import { RouteRecordRaw } from 'vue-router';
-import { storeToRefs } from 'pinia';
-import pinia from '/@/stores';
-import { useUserInfo } from '/@/stores/userInfo';
-import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
-import { Session } from '/@/utils/storage';
-import { NextLoading } from '/@/utils/loading';
-import {  notFoundAndNoPower } from '/@/router/route';
-import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
-import { useRoutesList } from '/@/stores/routesList';
-import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
-
-// 后端控制路由
-
-// 引入 api 请求接口
-
-/**
- * 获取目录下的 .vue、.tsx 全部文件
- * @method import.meta.glob
- * @link 参考:https://cn.vitejs.dev/guide/features.html#json
- */
-const layouModules: any = import.meta.glob('../layout/routerView/*.{vue,tsx}');
-const viewsModules: any = import.meta.glob('../views/**/*.{vue,tsx}');
-const dynamicViewsModules: Record<string, Function> = Object.assign({}, { ...layouModules }, { ...viewsModules });
-
-/**
- * 后端控制路由:初始化方法,防止刷新时路由丢失
- * @method NextLoading 界面 loading 动画开始执行
- * @method useUserInfo().setUserInfos() 触发初始化用户信息 pinia
- * @method useRequestOldRoutes().setRequestOldRoutes() 存储接口原始路由(未处理component),根据需求选择使用
- * @method setAddRoute 添加动态路由
- * @method setFilterMenuAndCacheTagsViewRoutes 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
- *!/
-export async function initBackEndControlRoutes() {
-	// 界面 loading 动画开始执行
-	// if (window.nextLoading === undefined) NextLoading.start();
-	// 无 token 停止执行下一步
-	if (!Session.get('accessToken')) return false;
-	// 触发初始化用户信息 pinia
-	// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
-	await useUserInfo().setUserInfos(null);
-	// 获取路由菜单数据
-	const res = await getBackEndControlRoutes();
-	// 无登录权限时,添加判断
-	// https://gitee.com/lyt-top/vue-next-admin/issues/I64HVO
-	if (res.data.length <= 0) return Promise.resolve(true);
-	// 存储接口原始路由(未处理component),根据需求选择使用
-	useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(res.data)));
-	// 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
-	// dynamicRoutes[0].children = await backEndComponent(res.data);
-	// 添加动态路由
-	await setAddRoute();
-	// 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
-	await setFilterMenuAndCacheTagsViewRoutes();
-}
- */
-
-/**
- * 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
- * @description 用于左侧菜单、横向菜单的显示
- * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
- */
-export async function setFilterMenuAndCacheTagsViewRoutes() {
-	const storesRoutesList = useRoutesList(pinia);
-	// storesRoutesList.setRoutesList(dynamicRoutes[0].children as any);
-	setCacheTagsViewRoutes();
-}
-
-/**
- * 缓存多级嵌套数组处理后的一维数组
- * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
- */
-export function setCacheTagsViewRoutes() {
-	const storesTagsView = useTagsViewRoutes(pinia);
-	// storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes))[0].children);
-}
-
-/**
- * 处理路由格式及添加捕获所有路由或 404 Not found 路由
- * @description 替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
- * @returns 返回替换后的路由数组
- */
-export function setFilterRouteEnd() {
-	let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(null));
-	// notFoundAndNoPower 防止 404、401 不在 layout 布局中,不设置的话,404、401 界面将全屏显示
-	// 关联问题 No match found for location with path 'xxx'
-	filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower];
-	return filterRouteEnd;
-}
-
-/**
- * 添加动态路由
- * @method router.addRoute
- * @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套
- * @link 参考:https://next.router.vuejs.org/zh/api/#addroute
- */
-export async function setAddRoute() {
-	await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
-		router.addRoute(route);
-	});
-}
-
-/**
- * 请求后端路由菜单接口
- * @description isRequestRoutes 为 true,则开启后端控制路由
- * @returns 返回后端路由菜单数据
- */
-export function getBackEndControlRoutes() {
-	// 模拟 admin 与 test
-	const stores = useUserInfo(pinia);
-	const { userInfos } = storeToRefs(stores);
-	const auth = userInfos.value.roles[0];
-	// 管理员 admin
-	// if (auth === 'admin') return menuApi.getAdminMenu();
-	// // 其它用户 test
-	// else return menuApi.getTestMenu();
-}
-
-/**
- * 重新请求后端路由菜单接口
- * @description 用于菜单管理界面刷新菜单(未进行测试)
- * @description 路径:/src/views/system/menu/component/addMenu.vue
- */
-export async function setBackEndControlRefreshRoutes() {
-	await getBackEndControlRoutes();
-}
-
-/**
- * 后端路由 component 转换
- * @param routes 后端返回的路由表数组
- * @returns 返回处理成函数后的 component
- */
-export function backEndComponent(routes: any) {
-	if (!routes) return;
-	return routes.map((item: any) => {
-		if (item.component) item.component = dynamicImport(dynamicViewsModules, item.component as string);
-		item.children && backEndComponent(item.children);
-		return item;
-	});
-}
-
-/**
- * 后端路由 component 转换函数
- * @param dynamicViewsModules 获取目录下的 .vue、.tsx 全部文件
- * @param component 当前要处理项 component
- * @returns 返回处理成函数后的 component
- */
-export function dynamicImport(dynamicViewsModules: Record<string, Function>, component: string) {
-	const keys = Object.keys(dynamicViewsModules);
-	const matchKeys = keys.filter((key) => {
-		const k = key.replace(/..\/views|../, '');
-		return k.startsWith(`${component}`) || k.startsWith(`/${component}`);
-	});
-	if (matchKeys?.length === 1) {
-		const matchKey = matchKeys[0];
-		return dynamicViewsModules[matchKey];
-	}
-	if (matchKeys?.length > 1) {
-		return false;
-	}
-}

+ 1 - 1
admin-web/src/router/frontEnd.ts

@@ -113,7 +113,7 @@ export function setCacheTagsViewRoutes() {
 	const stores = useUserInfo(pinia);
 	const tagsViewRoutes = useTagsViewRoutes(pinia);
 	const { userInfos } = storeToRefs(stores);
-	let permMenus = setFilterHasPermsMenu(staticRoutes, userInfos.value.permList);
+	let permMenus = setFilterHasPermsMenu(adminRoutes, userInfos.value.permList);
 	// 添加到 pinia setTagsViewRoutes 中
 	let cachetagsViewRoutes = formatTwoStageRoutes(formatFlatteningRoutes(permMenus))[0].children
 	// //console.log("piana tagsViewRoutes>>>",cachetagsViewRoutes)

+ 1 - 1
admin-web/src/router/route.ts

@@ -121,7 +121,7 @@ export const adminRoutes: Array<RouteRecordRaw> = [
                 path: '/station',
                 name: 'adminStation',
                 component: () => import('/@/layout/routerView/parent.vue'),
-                redirect: '/admin/station/list',
+                redirect: '/station/list',
                 meta: {
                     title: '洗车站',
                     isLink: '',

+ 1 - 0
admin-web/src/types/layout.d.ts

@@ -21,6 +21,7 @@ declare type BreadcrumbState<T = any> = {
 	routeSplit: string[];
 	routeSplitFirst: string;
 	routeSplitIndex: number;
+	routeLinkList:any[];
 };
 
 // navBars search