diff --git a/src/hooks/useRoutingMethod.ts b/src/hooks/useRoutingMethod.ts
new file mode 100644
index 0000000..9fe001a
--- /dev/null
+++ b/src/hooks/useRoutingMethod.ts
@@ -0,0 +1,34 @@
+import pinia from "@/store/index";
+import { storeToRefs } from "pinia";
+import { useRoutesListStore } from "@/store/route-list";
+/**
+ * 路由处理hooks,内置多种路由处理场景
+ * @returns 路由方法
+ */
+export const useRoutingMethod = () => {
+ /**
+ * 从一维路由中查找路由
+ * @param {string} key 路由的name
+ * @returns 查找到的路由,undefined则表示未找到
+ */
+ const findLinearArray = (key: string) => {
+ const routerStore = useRoutesListStore(pinia);
+ const { routeList } = storeToRefs(routerStore);
+ return routeList.value.find((item: Menu.MenuOptions) => item.name == key);
+ };
+
+ /**
+ * 从tabs路由中查找路由
+ * @param {string} key 路由的name
+ * @returns 查找到的路由,undefined则表示未找到
+ */
+ const findTagsList = (key: string) => {
+ const routerStore = useRoutesListStore(pinia);
+ const { tabsList } = storeToRefs(routerStore);
+ return tabsList.value.find((item: Menu.MenuOptions) => item.name == key);
+ };
+ return {
+ findLinearArray,
+ findTagsList
+ };
+};
diff --git a/src/layout/components/Menu/index.vue b/src/layout/components/Menu/index.vue
index a04d72f..389eb57 100644
--- a/src/layout/components/Menu/index.vue
+++ b/src/layout/components/Menu/index.vue
@@ -1,5 +1,12 @@
-
+
@@ -10,19 +17,18 @@ import { storeToRefs } from "pinia";
import { useThemeConfig } from "@/store/theme-config";
import { useRoutesListStore } from "@/store/route-list";
import { useRouter } from "vue-router";
+import { useRoutingMethod } from "@/hooks/useRoutingMethod";
const router = useRouter();
const routerStore = useRoutesListStore();
-const { routeTree, routeList } = storeToRefs(routerStore);
+const { routeTree, currentRoute } = storeToRefs(routerStore);
const themeStore = useThemeConfig();
const { collapsed } = storeToRefs(themeStore);
-console.log("路由树", routeTree.value);
-
const onMenuItem = (key: string) => {
- let find = routeList.value.find((item: Menu.MenuOptions) => item.name === key);
- console.log("当前", find);
+ const { findLinearArray } = useRoutingMethod();
+ const find = findLinearArray(key);
if (find) {
- routerStore.setTagsList(find);
+ routerStore.setTabs(find);
router.push(find.path);
} else {
router.push("/404");
diff --git a/src/layout/components/Tabs/index.vue b/src/layout/components/Tabs/index.vue
index 5540c55..7b473e7 100644
--- a/src/layout/components/Tabs/index.vue
+++ b/src/layout/components/Tabs/index.vue
@@ -1,7 +1,15 @@
-
-
+
+
@@ -34,22 +42,27 @@
diff --git a/src/router/index.ts b/src/router/index.ts
index 63150d0..6a8e5c0 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -41,23 +41,30 @@ router.beforeEach(async (to, from, next) => {
const { token } = storeToRefs(store);
console.log(to, from);
if (to.path === "/login" && !token.value) {
+ // 1、去登录页,无token,放行
next();
} else if (!token.value) {
+ // 2、没有token,直接重定向到登录页
next("/login");
} else if (to.path === "/login" && token.value) {
+ // 3、去登录页,有token,直接重定向到home页
next("/home");
+ // 项目内的跳转,处理跳转路由高亮
currentlyRoute(to);
} else {
+ // 4、去非登录页,有token,校验是否动态添加过路由,添加过则放行,未添加则执行路由初始化
const routeStore = useRoutesListStore(pinia);
const { routeTree } = storeToRefs(routeStore);
// 如果缓存的路由是0,则说明未动态添加路由,先添加再跳转
// 解决刷新页面404的问题
if (routeTree.value.length == 0) {
await initSetRouter();
+ // 处理完重新跳转
next({ path: to.path, query: to.query });
} else {
// 动态路由添加过走这里,直接放行
next();
+ // 项目内的跳转,处理跳转路由高亮
currentlyRoute(to);
}
}
diff --git a/src/router/route-output.ts b/src/router/route-output.ts
index 8a2a1c4..c6ce605 100644
--- a/src/router/route-output.ts
+++ b/src/router/route-output.ts
@@ -5,6 +5,7 @@ import { storeToRefs } from "pinia";
import { useUserInfoStore } from "@/store/user-info";
import { useRoutesListStore } from "@/store/route-list";
import { deepClone, arrayFlattened } from "@/utils/index";
+import { useRoutingMethod } from "@/hooks/useRoutingMethod";
/**
* 初始化
@@ -55,11 +56,11 @@ export function linearArray(tree: any) {
/**
* 过滤路由树,返回有权限的树
- * @param {array} nodes 根据角色权限过滤原始路由树
+ * @param {array} tree 根据角色权限过滤原始路由树
* @returns 返回有权限的树
*/
-export const filterByRole = (nodes: any) => {
- return nodes.filter((item: any) => {
+export const filterByRole = (tree: any) => {
+ return tree.filter((item: any) => {
if (item.meta && item.meta.roles) {
if (!roleBase(item.meta.roles)) return false;
}
@@ -80,12 +81,23 @@ export const roleBase = (roles: Array) => {
};
/**
- * 路由跳转,将路由存入store
+ * 处理tabs,跳转路由如果存在,则存入store
* @param {object} to 需要跳转的路由
- * @returns 是否有权限 true是 false否
*/
export const currentlyRoute = (to: any) => {
- // const store = useRoutesListStore(pinia);
- // const { routeList, currentRoute, tagsList } = storeToRefs(store);
- console.log("当前路由", to);
+ const store = useRoutesListStore(pinia);
+ const { tabsList, routeList } = storeToRefs(store);
+ console.log("刷新", tabsList.value, routeList.value);
+ // tabs无数据则默认添加首页
+ if (tabsList.value.length == 0 && routeList.value.length != 0) {
+ store.setTabs(routeList.value[0]);
+ }
+ const { findLinearArray } = useRoutingMethod();
+ const find = findLinearArray(to.name);
+ if (find != undefined) {
+ // 存入当前路由
+ store.setCurrentRoute(find);
+ store.setTabs(find);
+ }
+ console.log("刷新", tabsList.value);
};
diff --git a/src/router/route.ts b/src/router/route.ts
index e71ffda..3696d23 100644
--- a/src/router/route.ts
+++ b/src/router/route.ts
@@ -154,7 +154,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
title: "about-project",
isHide: false,
isKeepAlive: true,
- isAffix: true,
+ isAffix: false,
isLink: "",
isIframe: false,
roles: ["admin", "common"],
diff --git a/src/store/route-list.ts b/src/store/route-list.ts
index 6fd0a50..d0164f4 100644
--- a/src/store/route-list.ts
+++ b/src/store/route-list.ts
@@ -8,30 +8,56 @@ import { defineStore } from "pinia";
*/
export const useRoutesListStore = defineStore("routeList", {
state: (): any => ({
- routeTree: [], // 路由树
- routeList: [], // 路由数据-一维
- routeNames: [], // 路由名称
- tagsList: [], // 标签页数据
+ routeTree: [], // 有访问权限的路由树
+ routeList: [], // 有访问权限的一维路由数组
+ routeNames: [], // 有访问权限的路由名称
+ tabsList: [], // 标签页数据
currentRoute: {} // 当前路由
}),
actions: {
setRouteTree(data: Menu.MenuOptions) {
this.routeTree = data;
},
+ /**
+ * 设置有访问权限的一维路由数组
+ * @param {Array} data 一维路由数组
+ */
setRouteList(data: any) {
this.routeList = data;
},
+ /**
+ * 设置所有可缓存路由的路由名
+ * @param {Array} data 路由名数组
+ */
setRouteNames(data: Array) {
this.routeNames = data;
},
- setTagsList(data: Menu.MenuOptions) {
- let isExist = this.tagsList.some((item: Menu.MenuOptions) => item.name === data.name);
- if (!isExist) {
- this.tagsList.push(data);
- }
+ /**
+ * 添加tabs标签页
+ * @param {object} data 当前tabs路由
+ */
+ setTabs(data: Menu.MenuOptions) {
+ // 当前路由在tags中是否存在,不存在则缓存
+ let isExist = this.tabsList.some((item: Menu.MenuOptions) => item.name === data.name);
+ if (isExist) return;
+ this.tabsList.push(data);
},
- setCurrentRoute(data: any) {
+ /**
+ * 设置系统内的当前路由数据
+ * @param {object} data 当前路由
+ */
+ setCurrentRoute(data: Menu.MenuOptions) {
+ if (this.currentRoute.name && data.name === this.currentRoute.name) return;
this.currentRoute = data;
+ },
+ /**
+ * 删除tabs页的指定路由
+ * @param {string} key 路由name
+ */
+ removeTabsList(key: string) {
+ const index = this.tabsList.findIndex((item: Menu.MenuOptions) => item.name === key);
+ if (index === -1) return;
+ this.tabsList.splice(index, 1);
}
}
});