2024-04-11 00:15:57 +08:00
|
|
|
|
import { defineStore } from "pinia";
|
2024-12-03 15:01:03 +08:00
|
|
|
|
import router from "@/router/index";
|
2024-11-02 19:26:25 +08:00
|
|
|
|
import { RouteRecordRaw } from "vue-router";
|
|
|
|
|
|
import { getMenuListAPI } from "@/api/modules/system/index";
|
|
|
|
|
|
import { moduleReplacement, linearArray } from "@/router/route-output";
|
2024-04-11 00:15:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 路由列表
|
2024-04-18 00:24:07 +08:00
|
|
|
|
* @methods setRouteNames 设置路由名称集合
|
2024-04-21 00:26:49 +08:00
|
|
|
|
* @methods setTabs 添加tabs标签页
|
|
|
|
|
|
* @methods setCurrentRoute 设置系统内的当前路由
|
|
|
|
|
|
* @methods removeTabsList 删除tabs页的指定路由
|
2024-11-02 19:26:25 +08:00
|
|
|
|
* @methods removeRouteName 删除缓存路由名,用于取消页面缓存,单个删除
|
|
|
|
|
|
* @methods removeRouteNames 删除缓存路由名,用于取消页面缓存,批量删除
|
|
|
|
|
|
* @methods initSetRouter 路由初始化
|
2024-04-11 00:15:57 +08:00
|
|
|
|
*/
|
2024-11-02 19:26:25 +08:00
|
|
|
|
export const useRoutesConfigStore = defineStore("route-config", {
|
2024-04-11 00:15:57 +08:00
|
|
|
|
state: (): any => ({
|
2024-04-20 16:54:12 +08:00
|
|
|
|
routeTree: [], // 有访问权限的路由树
|
|
|
|
|
|
routeList: [], // 有访问权限的一维路由数组
|
2024-04-21 00:26:49 +08:00
|
|
|
|
cacheRoutes: [], // 所有可缓存路由的路由名
|
2024-04-20 16:54:12 +08:00
|
|
|
|
tabsList: [], // 标签页数据
|
2024-04-18 13:01:43 +08:00
|
|
|
|
currentRoute: {} // 当前路由
|
2024-04-11 00:15:57 +08:00
|
|
|
|
}),
|
|
|
|
|
|
actions: {
|
2024-04-20 16:54:12 +08:00
|
|
|
|
/**
|
2024-04-21 17:09:20 +08:00
|
|
|
|
* 设置可缓存路由的路由名
|
2024-04-21 16:08:59 +08:00
|
|
|
|
* @param {string} name 路由名
|
2024-04-20 16:54:12 +08:00
|
|
|
|
*/
|
2024-04-21 16:08:59 +08:00
|
|
|
|
setRouteNames(name: string) {
|
|
|
|
|
|
let state = this.cacheRoutes.some((item: string) => item === name);
|
|
|
|
|
|
if (state) return;
|
|
|
|
|
|
this.cacheRoutes.push(name);
|
2024-04-18 00:24:07 +08:00
|
|
|
|
},
|
2024-04-20 16:54:12 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 添加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);
|
2024-04-18 13:01:43 +08:00
|
|
|
|
},
|
2024-04-20 16:54:12 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 设置系统内的当前路由数据
|
|
|
|
|
|
* @param {object} data 当前路由
|
|
|
|
|
|
*/
|
|
|
|
|
|
setCurrentRoute(data: Menu.MenuOptions) {
|
|
|
|
|
|
if (this.currentRoute.name && data.name === this.currentRoute.name) return;
|
2024-04-18 13:01:43 +08:00
|
|
|
|
this.currentRoute = data;
|
2024-04-20 16:54:12 +08:00
|
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 删除tabs页的指定路由
|
|
|
|
|
|
* @param {string} key 路由name
|
|
|
|
|
|
*/
|
|
|
|
|
|
removeTabsList(key: string) {
|
|
|
|
|
|
const index = this.tabsList.findIndex((item: Menu.MenuOptions) => item.name === key);
|
2024-11-02 19:26:25 +08:00
|
|
|
|
if (this.tabsList[index].meta.affix) return;
|
2024-04-20 16:54:12 +08:00
|
|
|
|
if (index === -1) return;
|
|
|
|
|
|
this.tabsList.splice(index, 1);
|
2024-04-21 16:08:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
/**
|
2024-04-22 00:14:26 +08:00
|
|
|
|
* 删除缓存路由名,用于取消页面缓存,单个删除
|
2024-04-21 16:08:59 +08:00
|
|
|
|
* @param {string} key 路由名
|
|
|
|
|
|
*/
|
2024-04-22 00:14:26 +08:00
|
|
|
|
removeRouteName(key: string) {
|
2024-04-21 16:08:59 +08:00
|
|
|
|
const index = this.cacheRoutes.findIndex((item: string) => item === key);
|
|
|
|
|
|
if (index === -1) return;
|
|
|
|
|
|
this.cacheRoutes.splice(index, 1);
|
2024-04-22 00:14:26 +08:00
|
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 删除缓存路由名,用于取消页面缓存,批量删除
|
|
|
|
|
|
* @param {Array} list 路由名
|
|
|
|
|
|
*/
|
|
|
|
|
|
removeRouteNames(list: Array<string>) {
|
|
|
|
|
|
this.cacheRoutes = this.cacheRoutes.filter((item: string) => !list.includes(item));
|
2024-11-02 19:26:25 +08:00
|
|
|
|
},
|
2024-11-09 15:37:37 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 重置routeTree路由树
|
|
|
|
|
|
*/
|
|
|
|
|
|
async resetRoute() {
|
|
|
|
|
|
this.routeTree = [];
|
|
|
|
|
|
},
|
2024-11-02 19:26:25 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 路由初始化
|
|
|
|
|
|
* 1、将模块设置为真实模块
|
|
|
|
|
|
* 2、存储路由树,用于生成菜单
|
|
|
|
|
|
* 3、根据树生成一维路由数组
|
|
|
|
|
|
* 4、动态添加路由,设置完整的路由,二维路由:顶层路由 + 二级的一维路由
|
|
|
|
|
|
* 5、动态添加路由
|
|
|
|
|
|
* 6、缓存一维路由
|
|
|
|
|
|
*/
|
|
|
|
|
|
async initSetRouter() {
|
|
|
|
|
|
// 1、获取过滤角色权限后的树,后端做排序处理
|
|
|
|
|
|
let { data } = await getMenuListAPI();
|
|
|
|
|
|
// 2、将模块设置为真实模块
|
|
|
|
|
|
let tree = moduleReplacement(data);
|
|
|
|
|
|
// 3、存储路由树,用于生成菜单
|
|
|
|
|
|
this.routeTree = tree[0].children;
|
|
|
|
|
|
// 4、根据树生成一维路由数组
|
|
|
|
|
|
tree[0].children = linearArray(tree[0].children);
|
|
|
|
|
|
// 5、设置完整的路由,二维路由:顶层路由 + 二级的一维路由
|
|
|
|
|
|
tree[0].redirect = tree[0].children[0].path;
|
|
|
|
|
|
// 6、动态添加路由
|
|
|
|
|
|
tree.forEach((route: RouteRecordRaw) => router.addRoute(route));
|
|
|
|
|
|
// 7、缓存一维路由
|
|
|
|
|
|
this.routeList = tree[0].children;
|
2024-04-11 00:15:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|