1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| /**
| * 菜单状态管理
| */
| import { defineStore } from 'pinia';
| import { menuApi, type BackendMenuNode } from '@/api/modules/menu';
| import { normalizeMenus, addHomeMenu } from '@/utils/menuTransform';
|
| interface MenuState {
| menus: BackendMenuNode[];
| loaded: boolean;
| }
|
| export const useMenuStore = defineStore('menu', {
| state: (): MenuState => ({
| menus: [],
| loaded: false,
| }),
|
| getters: {
| flatMenus: (state) => {
| const flat: BackendMenuNode[] = [];
| const flatten = (items: BackendMenuNode[]) => {
| items.forEach((item) => {
| flat.push(item);
| if (item.children?.length) {
| flatten(item.children);
| }
| });
| };
| flatten(state.menus);
| return flat;
| },
| },
|
| actions: {
| async loadMenus() {
| try {
| const data = await menuApi.getTreeMenu();
| this.menus = addHomeMenu(data || []);
| this.loaded = true;
| return this.menus;
| } catch (error) {
| console.error('加载菜单失败:', error);
| throw error;
| }
| },
|
| findMenuByPath(path: string): BackendMenuNode | null {
| return this.flatMenus.find((m) => m.path === path) || null;
| },
|
| resetMenus() {
| this.menus = [];
| this.loaded = false;
| },
| },
| });
|
|