|
@@ -1,7 +1,7 @@
|
|
|
import { defineStore } from "pinia";
|
|
|
import { ref } from "vue";
|
|
|
import { deepTree, revDeepTree, storage } from "/@/cool/utils";
|
|
|
-import { isEmpty, orderBy } from "lodash-es";
|
|
|
+import { cloneDeep, isArray, isEmpty, orderBy } from "lodash-es";
|
|
|
import { router, service } from "/@/cool";
|
|
|
import { revisePath } from "../utils";
|
|
|
import { Menu } from "../types";
|
|
@@ -17,9 +17,6 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
// 菜单组
|
|
|
const group = ref<Menu.List>(data["base.menuGroup"] || []);
|
|
|
|
|
|
- // 顶部菜单序号
|
|
|
- const index = ref(0);
|
|
|
-
|
|
|
// 左侧菜单列表
|
|
|
const list = ref<Menu.List>([]);
|
|
|
|
|
@@ -27,15 +24,10 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
const perms = ref<any[]>(data["base.menuPerms"] || []);
|
|
|
|
|
|
// 设置左侧菜单
|
|
|
- function setMenu(i?: number) {
|
|
|
- if (i === undefined) {
|
|
|
- i = index.value;
|
|
|
- }
|
|
|
-
|
|
|
+ function setMenu(i: number = 0) {
|
|
|
// 显示分组显示菜单
|
|
|
if (config.app.menu.isGroup) {
|
|
|
- list.value = group.value[i]?.children || [];
|
|
|
- index.value = i;
|
|
|
+ list.value = group.value.filter((e) => e.isShow)[i]?.children || [];
|
|
|
} else {
|
|
|
list.value = group.value;
|
|
|
}
|
|
@@ -71,30 +63,35 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
|
|
|
// 设置视图
|
|
|
function setRoutes(list: Menu.List) {
|
|
|
- // 默认第一个菜单为首页
|
|
|
- const fp = getPath(group.value[0]);
|
|
|
+ // 获取第一个菜单路径
|
|
|
+ const fp = getPath(group.value);
|
|
|
|
|
|
// 查找符合路由
|
|
|
- const route = list.find((e) => e.path == fp);
|
|
|
+ const route = list.find((e) => (e.meta!.isHome = e.path == fp));
|
|
|
|
|
|
if (route) {
|
|
|
- // 判断是否已经注册
|
|
|
- if (!router.getRoutes().find((e) => e.name == "home")) {
|
|
|
- const newRoute = {
|
|
|
- ...route,
|
|
|
- path: "/",
|
|
|
- name: "home"
|
|
|
- };
|
|
|
- router.append([Object.assign({}, newRoute)]);
|
|
|
+ const home = router.getRoutes().find((e) => e.meta.isHome);
|
|
|
+
|
|
|
+ // 判断是否存在
|
|
|
+ if (!home) {
|
|
|
+ router.append([
|
|
|
+ {
|
|
|
+ ...route,
|
|
|
+ path: "/",
|
|
|
+ name: "home"
|
|
|
+ }
|
|
|
+ ]);
|
|
|
+ } else {
|
|
|
+ Object.assign(home.meta, route.meta);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- routes.value = list;
|
|
|
+ routes.value = list.filter((e) => e.type == 1);
|
|
|
}
|
|
|
|
|
|
// 设置菜单组
|
|
|
function setGroup(list: Menu.List) {
|
|
|
- group.value = orderBy(list, "orderNum");
|
|
|
+ group.value = orderBy(deepTree(list), "orderNum");
|
|
|
storage.set("base.menuGroup", group.value);
|
|
|
}
|
|
|
|
|
@@ -113,9 +110,10 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
isShow,
|
|
|
meta: {
|
|
|
...e.meta,
|
|
|
- label: e.name,
|
|
|
+ label: e.name, // 菜单名称的唯一标识
|
|
|
keepAlive: e.keepAlive || 0
|
|
|
},
|
|
|
+ name: `${e.name}-${e.id}`, // 避免重复命名之前的冲突
|
|
|
children: []
|
|
|
};
|
|
|
});
|
|
@@ -124,13 +122,13 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
setPerms(res.perms || []);
|
|
|
|
|
|
// 设置菜单组
|
|
|
- setGroup(deepTree(list));
|
|
|
+ setGroup(list);
|
|
|
|
|
|
// 设置视图路由
|
|
|
- setRoutes(list.filter((e) => e.type == 1));
|
|
|
+ setRoutes(list);
|
|
|
|
|
|
// 设置菜单
|
|
|
- setMenu(index.value);
|
|
|
+ setMenu();
|
|
|
|
|
|
return list;
|
|
|
}
|
|
@@ -147,38 +145,34 @@ export const useMenuStore = defineStore("menu", function () {
|
|
|
}
|
|
|
|
|
|
// 获取菜单路径
|
|
|
- function getPath(item?: Menu.Item) {
|
|
|
+ function getPath(data: Menu.Item | Menu.List) {
|
|
|
+ const list = isArray(data) ? data : [data];
|
|
|
+
|
|
|
let path = "";
|
|
|
|
|
|
- switch (item?.type) {
|
|
|
- case 0:
|
|
|
- function deep(arr: Menu.List) {
|
|
|
- arr.forEach((e: Menu.Item) => {
|
|
|
- if (e.type == 1) {
|
|
|
- if (!path) {
|
|
|
- path = e.path;
|
|
|
- }
|
|
|
- } else {
|
|
|
- deep(e.children || []);
|
|
|
+ function deep(arr: Menu.List) {
|
|
|
+ arr.forEach((e: Menu.Item) => {
|
|
|
+ switch (e.type) {
|
|
|
+ case 0:
|
|
|
+ deep(e.children || []);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ if (!path) {
|
|
|
+ path = e.path;
|
|
|
}
|
|
|
- });
|
|
|
+ break;
|
|
|
}
|
|
|
-
|
|
|
- deep(item.children || group.value || []);
|
|
|
- break;
|
|
|
-
|
|
|
- case 1:
|
|
|
- path = item.path;
|
|
|
- break;
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
- return path || "/";
|
|
|
+ deep(list);
|
|
|
+
|
|
|
+ return path;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
routes,
|
|
|
group,
|
|
|
- index,
|
|
|
list,
|
|
|
perms,
|
|
|
get,
|