xto-fronted 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/system.d.ts +1 -1
- package/dist/composables/useApp.d.ts +7 -10
- package/dist/composables/useAuth.d.ts +0 -3
- package/dist/index-C6Nm0r9k.js +475 -0
- package/dist/index-C6w0-8xN.js +1648 -0
- package/dist/index-D2fQ8TK8.js +475 -0
- package/dist/index-D4crnrO6.js +142 -0
- package/dist/index-DFXuyPge.js +1627 -0
- package/dist/index-Do1CBqg8.js +345 -0
- package/dist/index-Jb4VMHIS.js +142 -0
- package/dist/index-TrLCW5xL.js +372 -0
- package/dist/index-a_ilWAvi.js +345 -0
- package/dist/index-sRwZYbZ4.js +372 -0
- package/dist/index.es.js +66 -60
- package/dist/index.umd.js +1 -1
- package/dist/router/dynamicRoutes.d.ts +18 -22
- package/dist/router/guards.d.ts +1 -0
- package/dist/stores/auth.d.ts +5 -19
- package/dist/stores/menu.d.ts +43 -74
- package/dist/stores/user.d.ts +63 -84
- package/dist/style.css +1 -1
- package/dist/utils/auth.d.ts +12 -3
- package/dist/utils/permission.d.ts +5 -4
- package/package.json +1 -1
- package/src/api/auth.ts +4 -4
- package/src/api/system.ts +5 -4
- package/src/components/Layout/Header.vue +5 -5
- package/src/components/Layout/Sidebar.vue +18 -12
- package/src/composables/useApp.ts +1 -1
- package/src/composables/useAuth.ts +0 -28
- package/src/directives/permission.ts +6 -16
- package/src/router/dynamicRoutes.ts +31 -31
- package/src/router/guards.ts +6 -10
- package/src/router/index.ts +7 -9
- package/src/stores/auth.ts +4 -4
- package/src/stores/menu.ts +19 -50
- package/src/stores/user.ts +18 -40
- package/src/types/api.d.ts +28 -31
- package/src/utils/auth.ts +45 -7
- package/src/utils/permission.ts +10 -19
- package/src/utils/request.ts +4 -3
- package/src/views/login/index.vue +11 -8
package/dist/stores/menu.d.ts
CHANGED
|
@@ -1,108 +1,77 @@
|
|
|
1
|
-
import { AppRoute } from '../types/router';
|
|
2
1
|
import { MenuItem } from '../types/api';
|
|
3
2
|
export declare const useMenuStore: import('pinia').StoreDefinition<"menu", Pick<{
|
|
4
3
|
menuList: import('vue').Ref<{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
component?: string | undefined;
|
|
9
|
-
redirect?: string | undefined;
|
|
4
|
+
menuCode: string;
|
|
5
|
+
menuName: string;
|
|
6
|
+
menuUrl: string;
|
|
10
7
|
icon?: string | undefined;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
order?: number | undefined;
|
|
16
|
-
parentId?: number | string | null | undefined;
|
|
8
|
+
closable?: boolean | undefined;
|
|
9
|
+
isDefault?: boolean | undefined;
|
|
10
|
+
isOut?: boolean | undefined;
|
|
11
|
+
type?: number | undefined;
|
|
17
12
|
children?: /*elided*/ any[] | undefined;
|
|
18
13
|
}[], MenuItem[] | {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
component?: string | undefined;
|
|
23
|
-
redirect?: string | undefined;
|
|
14
|
+
menuCode: string;
|
|
15
|
+
menuName: string;
|
|
16
|
+
menuUrl: string;
|
|
24
17
|
icon?: string | undefined;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
order?: number | undefined;
|
|
30
|
-
parentId?: number | string | null | undefined;
|
|
18
|
+
closable?: boolean | undefined;
|
|
19
|
+
isDefault?: boolean | undefined;
|
|
20
|
+
isOut?: boolean | undefined;
|
|
21
|
+
type?: number | undefined;
|
|
31
22
|
children?: /*elided*/ any[] | undefined;
|
|
32
23
|
}[]>;
|
|
33
24
|
hasMenu: import('vue').ComputedRef<boolean>;
|
|
34
25
|
setMenuList: (menus: MenuItem[]) => void;
|
|
35
26
|
clearMenu: () => void;
|
|
36
|
-
generateRoutes: (menus: MenuItem[]) => AppRoute[];
|
|
37
|
-
addRoutes: (menus: MenuItem[]) => void;
|
|
38
27
|
}, "menuList">, Pick<{
|
|
39
28
|
menuList: import('vue').Ref<{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
component?: string | undefined;
|
|
44
|
-
redirect?: string | undefined;
|
|
29
|
+
menuCode: string;
|
|
30
|
+
menuName: string;
|
|
31
|
+
menuUrl: string;
|
|
45
32
|
icon?: string | undefined;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
order?: number | undefined;
|
|
51
|
-
parentId?: number | string | null | undefined;
|
|
33
|
+
closable?: boolean | undefined;
|
|
34
|
+
isDefault?: boolean | undefined;
|
|
35
|
+
isOut?: boolean | undefined;
|
|
36
|
+
type?: number | undefined;
|
|
52
37
|
children?: /*elided*/ any[] | undefined;
|
|
53
38
|
}[], MenuItem[] | {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
component?: string | undefined;
|
|
58
|
-
redirect?: string | undefined;
|
|
39
|
+
menuCode: string;
|
|
40
|
+
menuName: string;
|
|
41
|
+
menuUrl: string;
|
|
59
42
|
icon?: string | undefined;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
order?: number | undefined;
|
|
65
|
-
parentId?: number | string | null | undefined;
|
|
43
|
+
closable?: boolean | undefined;
|
|
44
|
+
isDefault?: boolean | undefined;
|
|
45
|
+
isOut?: boolean | undefined;
|
|
46
|
+
type?: number | undefined;
|
|
66
47
|
children?: /*elided*/ any[] | undefined;
|
|
67
48
|
}[]>;
|
|
68
49
|
hasMenu: import('vue').ComputedRef<boolean>;
|
|
69
50
|
setMenuList: (menus: MenuItem[]) => void;
|
|
70
51
|
clearMenu: () => void;
|
|
71
|
-
generateRoutes: (menus: MenuItem[]) => AppRoute[];
|
|
72
|
-
addRoutes: (menus: MenuItem[]) => void;
|
|
73
52
|
}, "hasMenu">, Pick<{
|
|
74
53
|
menuList: import('vue').Ref<{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
component?: string | undefined;
|
|
79
|
-
redirect?: string | undefined;
|
|
54
|
+
menuCode: string;
|
|
55
|
+
menuName: string;
|
|
56
|
+
menuUrl: string;
|
|
80
57
|
icon?: string | undefined;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
order?: number | undefined;
|
|
86
|
-
parentId?: number | string | null | undefined;
|
|
58
|
+
closable?: boolean | undefined;
|
|
59
|
+
isDefault?: boolean | undefined;
|
|
60
|
+
isOut?: boolean | undefined;
|
|
61
|
+
type?: number | undefined;
|
|
87
62
|
children?: /*elided*/ any[] | undefined;
|
|
88
63
|
}[], MenuItem[] | {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
component?: string | undefined;
|
|
93
|
-
redirect?: string | undefined;
|
|
64
|
+
menuCode: string;
|
|
65
|
+
menuName: string;
|
|
66
|
+
menuUrl: string;
|
|
94
67
|
icon?: string | undefined;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
order?: number | undefined;
|
|
100
|
-
parentId?: number | string | null | undefined;
|
|
68
|
+
closable?: boolean | undefined;
|
|
69
|
+
isDefault?: boolean | undefined;
|
|
70
|
+
isOut?: boolean | undefined;
|
|
71
|
+
type?: number | undefined;
|
|
101
72
|
children?: /*elided*/ any[] | undefined;
|
|
102
73
|
}[]>;
|
|
103
74
|
hasMenu: import('vue').ComputedRef<boolean>;
|
|
104
75
|
setMenuList: (menus: MenuItem[]) => void;
|
|
105
76
|
clearMenu: () => void;
|
|
106
|
-
|
|
107
|
-
addRoutes: (menus: MenuItem[]) => void;
|
|
108
|
-
}, "setMenuList" | "clearMenu" | "generateRoutes" | "addRoutes">>;
|
|
77
|
+
}, "setMenuList" | "clearMenu">>;
|
package/dist/stores/user.d.ts
CHANGED
|
@@ -1,113 +1,92 @@
|
|
|
1
1
|
import { UserInfo } from '../types/api';
|
|
2
2
|
export declare const useUserStore: import('pinia').StoreDefinition<"user", Pick<{
|
|
3
3
|
userInfo: import('vue').Ref<{
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
appId: string;
|
|
5
|
+
userId: string;
|
|
6
|
+
userName: string;
|
|
7
|
+
departmentName?: string | undefined;
|
|
8
8
|
email?: string | undefined;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
roles: string[];
|
|
12
|
-
permissions: string[];
|
|
13
|
-
createTime?: string | undefined;
|
|
14
|
-
updateTime?: string | undefined;
|
|
15
|
-
} | null, UserInfo | {
|
|
16
|
-
id: number | string;
|
|
17
|
-
username: string;
|
|
18
|
-
nickname: string;
|
|
9
|
+
mobilePhone?: string | undefined;
|
|
10
|
+
positionName?: string | undefined;
|
|
19
11
|
avatar?: string | undefined;
|
|
12
|
+
} | null, UserInfo | {
|
|
13
|
+
appId: string;
|
|
14
|
+
userId: string;
|
|
15
|
+
userName: string;
|
|
16
|
+
departmentName?: string | undefined;
|
|
20
17
|
email?: string | undefined;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
permissions: string[];
|
|
25
|
-
createTime?: string | undefined;
|
|
26
|
-
updateTime?: string | undefined;
|
|
18
|
+
mobilePhone?: string | undefined;
|
|
19
|
+
positionName?: string | undefined;
|
|
20
|
+
avatar?: string | undefined;
|
|
27
21
|
} | null>;
|
|
28
|
-
roles: import('vue').Ref<string[], string[]>;
|
|
29
|
-
permissions: import('vue').Ref<string[], string[]>;
|
|
30
22
|
isLoggedIn: import('vue').ComputedRef<boolean>;
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
userId: import('vue').ComputedRef<string>;
|
|
24
|
+
userName: import('vue').ComputedRef<string>;
|
|
25
|
+
departmentName: import('vue').ComputedRef<string>;
|
|
26
|
+
email: import('vue').ComputedRef<string>;
|
|
27
|
+
mobilePhone: import('vue').ComputedRef<string>;
|
|
28
|
+
positionName: import('vue').ComputedRef<string>;
|
|
33
29
|
avatar: import('vue').ComputedRef<string>;
|
|
34
|
-
userId: import('vue').ComputedRef<string | number | undefined>;
|
|
35
30
|
setUserInfo: (info: UserInfo) => void;
|
|
36
31
|
clearUserInfo: () => void;
|
|
37
|
-
|
|
38
|
-
hasRole: (role: string | string[]) => boolean;
|
|
39
|
-
}, "roles" | "permissions" | "userInfo">, Pick<{
|
|
32
|
+
}, "userInfo">, Pick<{
|
|
40
33
|
userInfo: import('vue').Ref<{
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
appId: string;
|
|
35
|
+
userId: string;
|
|
36
|
+
userName: string;
|
|
37
|
+
departmentName?: string | undefined;
|
|
45
38
|
email?: string | undefined;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
roles: string[];
|
|
49
|
-
permissions: string[];
|
|
50
|
-
createTime?: string | undefined;
|
|
51
|
-
updateTime?: string | undefined;
|
|
52
|
-
} | null, UserInfo | {
|
|
53
|
-
id: number | string;
|
|
54
|
-
username: string;
|
|
55
|
-
nickname: string;
|
|
39
|
+
mobilePhone?: string | undefined;
|
|
40
|
+
positionName?: string | undefined;
|
|
56
41
|
avatar?: string | undefined;
|
|
42
|
+
} | null, UserInfo | {
|
|
43
|
+
appId: string;
|
|
44
|
+
userId: string;
|
|
45
|
+
userName: string;
|
|
46
|
+
departmentName?: string | undefined;
|
|
57
47
|
email?: string | undefined;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
permissions: string[];
|
|
62
|
-
createTime?: string | undefined;
|
|
63
|
-
updateTime?: string | undefined;
|
|
48
|
+
mobilePhone?: string | undefined;
|
|
49
|
+
positionName?: string | undefined;
|
|
50
|
+
avatar?: string | undefined;
|
|
64
51
|
} | null>;
|
|
65
|
-
roles: import('vue').Ref<string[], string[]>;
|
|
66
|
-
permissions: import('vue').Ref<string[], string[]>;
|
|
67
52
|
isLoggedIn: import('vue').ComputedRef<boolean>;
|
|
68
|
-
|
|
69
|
-
|
|
53
|
+
userId: import('vue').ComputedRef<string>;
|
|
54
|
+
userName: import('vue').ComputedRef<string>;
|
|
55
|
+
departmentName: import('vue').ComputedRef<string>;
|
|
56
|
+
email: import('vue').ComputedRef<string>;
|
|
57
|
+
mobilePhone: import('vue').ComputedRef<string>;
|
|
58
|
+
positionName: import('vue').ComputedRef<string>;
|
|
70
59
|
avatar: import('vue').ComputedRef<string>;
|
|
71
|
-
userId: import('vue').ComputedRef<string | number | undefined>;
|
|
72
60
|
setUserInfo: (info: UserInfo) => void;
|
|
73
61
|
clearUserInfo: () => void;
|
|
74
|
-
|
|
75
|
-
hasRole: (role: string | string[]) => boolean;
|
|
76
|
-
}, "username" | "nickname" | "avatar" | "isLoggedIn" | "userId">, Pick<{
|
|
62
|
+
}, "userId" | "userName" | "departmentName" | "email" | "mobilePhone" | "positionName" | "avatar" | "isLoggedIn">, Pick<{
|
|
77
63
|
userInfo: import('vue').Ref<{
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
64
|
+
appId: string;
|
|
65
|
+
userId: string;
|
|
66
|
+
userName: string;
|
|
67
|
+
departmentName?: string | undefined;
|
|
82
68
|
email?: string | undefined;
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
roles: string[];
|
|
86
|
-
permissions: string[];
|
|
87
|
-
createTime?: string | undefined;
|
|
88
|
-
updateTime?: string | undefined;
|
|
89
|
-
} | null, UserInfo | {
|
|
90
|
-
id: number | string;
|
|
91
|
-
username: string;
|
|
92
|
-
nickname: string;
|
|
69
|
+
mobilePhone?: string | undefined;
|
|
70
|
+
positionName?: string | undefined;
|
|
93
71
|
avatar?: string | undefined;
|
|
72
|
+
} | null, UserInfo | {
|
|
73
|
+
appId: string;
|
|
74
|
+
userId: string;
|
|
75
|
+
userName: string;
|
|
76
|
+
departmentName?: string | undefined;
|
|
94
77
|
email?: string | undefined;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
permissions: string[];
|
|
99
|
-
createTime?: string | undefined;
|
|
100
|
-
updateTime?: string | undefined;
|
|
78
|
+
mobilePhone?: string | undefined;
|
|
79
|
+
positionName?: string | undefined;
|
|
80
|
+
avatar?: string | undefined;
|
|
101
81
|
} | null>;
|
|
102
|
-
roles: import('vue').Ref<string[], string[]>;
|
|
103
|
-
permissions: import('vue').Ref<string[], string[]>;
|
|
104
82
|
isLoggedIn: import('vue').ComputedRef<boolean>;
|
|
105
|
-
|
|
106
|
-
|
|
83
|
+
userId: import('vue').ComputedRef<string>;
|
|
84
|
+
userName: import('vue').ComputedRef<string>;
|
|
85
|
+
departmentName: import('vue').ComputedRef<string>;
|
|
86
|
+
email: import('vue').ComputedRef<string>;
|
|
87
|
+
mobilePhone: import('vue').ComputedRef<string>;
|
|
88
|
+
positionName: import('vue').ComputedRef<string>;
|
|
107
89
|
avatar: import('vue').ComputedRef<string>;
|
|
108
|
-
userId: import('vue').ComputedRef<string | number | undefined>;
|
|
109
90
|
setUserInfo: (info: UserInfo) => void;
|
|
110
91
|
clearUserInfo: () => void;
|
|
111
|
-
|
|
112
|
-
hasRole: (role: string | string[]) => boolean;
|
|
113
|
-
}, "setUserInfo" | "clearUserInfo" | "hasPermission" | "hasRole">>;
|
|
92
|
+
}, "setUserInfo" | "clearUserInfo">>;
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.sidebar[data-v-a7668285]{height:100%;display:flex;flex-direction:column;background-color:var(--bg-color);border-right:1px solid var(--color-border-lighter)}.sidebar--collapsed .sidebar__logo[data-v-a7668285]{justify-content:center;padding:0}.sidebar__logo[data-v-a7668285]{height:50px;display:flex;align-items:center;padding:0 20px;gap:10px;border-bottom:1px solid var(--color-border-lighter)}.sidebar__logo-img[data-v-a7668285]{width:32px;height:32px}.sidebar__logo-text[data-v-a7668285]{font-size:16px;font-weight:600;color:var(--color-primary)}.sidebar__menu[data-v-a7668285]{flex:1;border-right:none;overflow-y:auto}.sidebar__user[data-v-a7668285]{padding:10px;border-top:1px solid var(--color-border-lighter);display:flex;align-items:center;justify-content:space-between}.sidebar__user-info[data-v-a7668285]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-a7668285]{font-size:14px;font-weight:500}.sidebar__user-role[data-v-a7668285]{font-size:12px;color:var(--color-text-secondary)}.header[data-v-015c45c9]{display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:100%;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter)}.header__left[data-v-015c45c9]{display:flex;align-items:center;gap:15px}.header__collapse[data-v-015c45c9]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--color-text-regular);transition:color .2s}.header__collapse[data-v-015c45c9]:hover{color:var(--color-primary)}.header__breadcrumb[data-v-015c45c9]{font-size:14px;color:var(--color-text-secondary)}.header__breadcrumb .breadcrumb-separator[data-v-015c45c9]{margin:0 8px;color:var(--color-text-placeholder)}.header__breadcrumb .is-current[data-v-015c45c9]{color:var(--color-text-primary);font-weight:500}.header__right[data-v-015c45c9]{display:flex;align-items:center;gap:8px}.header__action[data-v-015c45c9]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--border-radius-base);color:var(--color-text-regular);transition:all .2s}.header__action[data-v-015c45c9]:hover{background-color:var(--color-fill);color:var(--color-primary)}.header__user[data-v-015c45c9]{position:relative;margin-left:8px}.header__user-trigger[data-v-015c45c9]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:var(--border-radius-base);transition:background-color .2s}.header__user-trigger[data-v-015c45c9]:hover{background-color:var(--color-fill)}.header__user-name[data-v-015c45c9]{font-size:14px;color:var(--color-text-primary);max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header__user-arrow[data-v-015c45c9]{font-size:10px;color:var(--color-text-secondary);transition:transform .2s}.header__user-arrow.is-active[data-v-015c45c9]{transform:rotate(180deg)}.header__avatar[data-v-015c45c9]{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:500}.header__dropdown[data-v-015c45c9]{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background-color:var(--bg-color);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow);overflow:hidden;z-index:100}.header__dropdown-header[data-v-015c45c9]{display:flex;align-items:center;gap:12px;padding:16px}.header__dropdown-avatar[data-v-015c45c9]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;font-weight:500}.header__dropdown-info[data-v-015c45c9]{flex:1}.header__dropdown-name[data-v-015c45c9]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.header__dropdown-role[data-v-015c45c9]{font-size:12px;color:var(--color-text-secondary);margin-top:2px}.header__dropdown-divider[data-v-015c45c9]{height:1px;background-color:var(--color-border-lighter)}.header__dropdown-menu[data-v-015c45c9]{padding:8px 0}.header__dropdown-item[data-v-015c45c9]{display:flex;align-items:center;gap:10px;padding:10px 16px;cursor:pointer;font-size:14px;color:var(--color-text-regular);transition:all .2s}.header__dropdown-item[data-v-015c45c9]:hover{background-color:var(--color-fill);color:var(--color-text-primary)}.header__dropdown-item--danger[data-v-015c45c9]{color:var(--color-danger)}.header__dropdown-item--danger[data-v-015c45c9]:hover{background-color:var(--color-danger-light);color:var(--color-danger)}.header__search-modal[data-v-015c45c9]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;display:flex;align-items:flex-start;justify-content:center;padding-top:100px;z-index:200}.search-container[data-v-015c45c9]{width:600px;max-width:90vw;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark);overflow:hidden}.search-input-wrapper[data-v-015c45c9]{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--color-border-lighter)}.search-input-wrapper .search-icon[data-v-015c45c9]{color:var(--color-text-secondary);margin-right:12px}.search-input-wrapper .search-input[data-v-015c45c9]{flex:1;font-size:16px;color:var(--color-text-primary);background:transparent;border:none;outline:none}.search-input-wrapper .search-input[data-v-015c45c9]::placeholder{color:var(--color-text-placeholder)}.search-input-wrapper .search-shortcut[data-v-015c45c9]{font-size:12px;color:var(--color-text-secondary);padding:4px 8px;background-color:var(--color-fill);border-radius:var(--border-radius-base)}.search-results[data-v-015c45c9]{max-height:400px;overflow-y:auto;padding:8px 0}.search-result-item[data-v-015c45c9]{display:flex;align-items:center;gap:12px;padding:12px 20px;cursor:pointer;transition:background-color .2s}.search-result-item[data-v-015c45c9]:hover{background-color:var(--color-fill)}.search-result-item.is-first[data-v-015c45c9]{background-color:var(--color-primary-light-9)}.search-result-item .search-result-icon[data-v-015c45c9]{color:var(--color-text-secondary)}.search-result-item .search-result-info[data-v-015c45c9]{flex:1;display:flex;flex-direction:column;gap:2px}.search-result-item .search-result-title[data-v-015c45c9]{font-size:14px;color:var(--color-text-primary)}.search-result-item .search-result-parent[data-v-015c45c9]{font-size:12px;color:var(--color-text-secondary)}.search-empty[data-v-015c45c9]{padding:40px 20px;text-align:center;color:var(--color-text-secondary);font-size:14px}.settings-drawer .settings-section[data-v-015c45c9]{margin-bottom:24px}.settings-drawer .settings-title[data-v-015c45c9]{font-size:14px;font-weight:500;color:var(--color-text-primary);margin-bottom:12px}.settings-drawer .settings-layout-options[data-v-015c45c9]{display:flex;gap:12px}.settings-drawer .layout-option[data-v-015c45c9]{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px;border:1px solid var(--color-border);border-radius:var(--border-radius-base);cursor:pointer;transition:all .2s}.settings-drawer .layout-option[data-v-015c45c9]:hover{border-color:var(--color-primary-light-5)}.settings-drawer .layout-option.is-active[data-v-015c45c9]{border-color:var(--color-primary);background-color:var(--color-primary-light-9)}.settings-drawer .layout-option__preview[data-v-015c45c9]{width:48px;height:36px;border:1px solid var(--color-border-light);border-radius:2px;overflow:hidden}.settings-drawer .layout-option__label[data-v-015c45c9]{font-size:12px;color:var(--color-text-regular)}.settings-drawer .layout-preview-sidebar[data-v-015c45c9]{display:flex;height:100%}.settings-drawer .layout-preview-sidebar .preview-aside[data-v-015c45c9]{width:25%;height:100%;background-color:var(--color-primary-light-7)}.settings-drawer .layout-preview-sidebar .preview-main[data-v-015c45c9]{flex:1;display:flex;flex-direction:column}.settings-drawer .layout-preview-sidebar .preview-main .preview-header[data-v-015c45c9]{height:20%;background-color:var(--color-border-light)}.settings-drawer .layout-preview-sidebar .preview-main .preview-content[data-v-015c45c9]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .layout-preview-top[data-v-015c45c9]{display:flex;flex-direction:column;height:100%}.settings-drawer .layout-preview-top .preview-header-full[data-v-015c45c9]{height:25%;background-color:var(--color-primary-light-7)}.settings-drawer .layout-preview-top .preview-content-full[data-v-015c45c9]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .layout-preview-mix[data-v-015c45c9]{display:flex;flex-direction:column;height:100%}.settings-drawer .layout-preview-mix .preview-header-mix[data-v-015c45c9]{height:25%;background-color:var(--color-primary-light-7);display:flex}.settings-drawer .layout-preview-mix .preview-header-mix .preview-mix-left[data-v-015c45c9]{width:30%;background-color:var(--color-primary)}.settings-drawer .layout-preview-mix .preview-mix-body[data-v-015c45c9]{flex:1;display:flex}.settings-drawer .layout-preview-mix .preview-mix-body .preview-mix-aside[data-v-015c45c9]{width:25%;background-color:var(--color-primary-light-8)}.settings-drawer .layout-preview-mix .preview-mix-body .preview-mix-content[data-v-015c45c9]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .settings-color-options[data-v-015c45c9]{display:flex;gap:12px}.settings-drawer .color-option[data-v-015c45c9]{width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .2s}.settings-drawer .color-option[data-v-015c45c9]:hover{transform:scale(1.1)}.settings-drawer .color-option.is-active[data-v-015c45c9]{box-shadow:0 0 0 2px var(--bg-color),0 0 0 4px var(--color-primary)}.settings-drawer .settings-switch-list[data-v-015c45c9]{display:flex;flex-direction:column;gap:12px}.settings-drawer .settings-switch-item[data-v-015c45c9]{display:flex;align-items:center;justify-content:space-between}.settings-drawer .settings-switch-item span[data-v-015c45c9]{font-size:14px;color:var(--color-text-regular)}.settings-drawer .switch-wrapper[data-v-015c45c9]{width:44px;height:22px;display:flex;align-items:center;cursor:pointer}.settings-drawer .switch-wrapper .switch-core[data-v-015c45c9]{width:100%;height:100%;border-radius:11px;background-color:var(--color-border);position:relative;transition:background-color .2s}.settings-drawer .switch-wrapper .switch-core[data-v-015c45c9]:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background-color:#fff;border-radius:50%;transition:left .2s}.settings-drawer .switch-wrapper.is-checked .switch-core[data-v-015c45c9]{background-color:var(--color-primary)}.settings-drawer .switch-wrapper.is-checked .switch-core[data-v-015c45c9]:after{left:24px}.dropdown-enter-active[data-v-015c45c9],.dropdown-leave-active[data-v-015c45c9]{transition:all .2s ease}.dropdown-enter-from[data-v-015c45c9],.dropdown-leave-to[data-v-015c45c9]{opacity:0;transform:translateY(-10px)}.search-enter-active[data-v-015c45c9],.search-leave-active[data-v-015c45c9]{transition:all .2s ease}.search-enter-from[data-v-015c45c9],.search-leave-to[data-v-015c45c9]{opacity:0}:root.grey-mode[data-v-015c45c9]{filter:grayscale(100%)}.layout[data-v-a3110011]{display:flex;width:100%;height:100%}.layout__aside[data-v-a3110011]{transition:width .3s;overflow:hidden;flex-shrink:0;height:100%}.layout__main[data-v-a3110011]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%}.layout__header[data-v-a3110011]{height:50px;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter);flex-shrink:0}.layout__content[data-v-a3110011]{flex:1;overflow:auto;background-color:var(--bg-color-page)}.tabs-wrapper[data-v-9156d8cd]{width:100%;height:100%;padding:0 10px}.tabs-wrapper[data-v-9156d8cd] .t-tabs{height:100%}.tabs-wrapper[data-v-9156d8cd] .t-tabs__header{margin:0;border-bottom:none}.tabs-wrapper[data-v-9156d8cd] .t-tabs__nav{border:none}.tabs-wrapper[data-v-9156d8cd] .t-tabs__item{height:32px;line-height:32px;border:1px solid var(--color-border-lighter);margin-right:5px;border-radius:var(--border-radius-base);padding:0 15px}.tabs-wrapper[data-v-9156d8cd] .t-tabs__item.is-active{background-color:var(--color-primary-light-9);border-color:var(--color-primary)}.tab-label[data-v-9156d8cd]{display:flex;align-items:center;gap:5px}.tab-close[data-v-9156d8cd]{width:14px;height:14px;display:flex;align-items:center;justify-content:center;font-size:10px;border-radius:50%}.tab-close[data-v-9156d8cd]:hover{background-color:var(--color-danger-light);color:var(--color-danger)}.footer[data-v-4852826a]{width:100%;text-align:center;font-size:12px;color:var(--color-text-secondary)}.login[data-v-c2cc908e]{width:100%;min-height:100vh;display:flex;align-items:center;justify-content:flex-end;padding-right:15%;background:linear-gradient(135deg,var(--color-primary-light-9) 0%,var(--color-primary-light-7) 100%)}.login__container[data-v-c2cc908e]{width:400px;padding:40px;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark)}.login__header[data-v-c2cc908e]{text-align:center;margin-bottom:30px}.login__logo[data-v-c2cc908e]{width:60px;height:60px}.login__title[data-v-c2cc908e]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-c2cc908e]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-c2cc908e] .x-form-item{margin-bottom:20px}.login__form[data-v-c2cc908e] .x-input__prefix{margin-right:8px}.login__submit[data-v-c2cc908e]{width:100%}.login__footer[data-v-c2cc908e]{text-align:center;margin-top:20px;font-size:12px;color:var(--color-text-placeholder)}.error-page[data-v-c3c12c24]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-c3c12c24]{text-align:center}.error-page__code[data-v-c3c12c24]{font-size:120px;font-weight:600;color:var(--color-primary);line-height:1;margin-bottom:20px}.error-page__title[data-v-c3c12c24]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-c3c12c24]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.error-page[data-v-dd5f2795]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-dd5f2795]{text-align:center}.error-page__code[data-v-dd5f2795]{font-size:120px;font-weight:600;color:var(--color-warning);line-height:1;margin-bottom:20px}.error-page__title[data-v-dd5f2795]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-dd5f2795]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.dashboard[data-v-44648cb1]{padding:20px}.dashboard__stats[data-v-44648cb1]{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-bottom:20px}@media (max-width: 1200px){.dashboard__stats[data-v-44648cb1]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.dashboard__stats[data-v-44648cb1]{grid-template-columns:1fr}}.dashboard__main[data-v-44648cb1]{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-bottom:20px}@media (max-width: 992px){.dashboard__main[data-v-44648cb1]{grid-template-columns:1fr}}.dashboard__quick[data-v-44648cb1],.dashboard__activity[data-v-44648cb1]{min-height:300px}.card-title[data-v-44648cb1]{font-size:16px;font-weight:500}.stat-card__content[data-v-44648cb1]{display:flex;align-items:center;gap:15px}.stat-card__icon[data-v-44648cb1]{width:50px;height:50px;display:flex;align-items:center;justify-content:center;font-size:24px;border-radius:var(--border-radius-base)}.stat-card__info[data-v-44648cb1]{flex:1}.stat-card__title[data-v-44648cb1]{font-size:14px;color:var(--color-text-secondary);margin-bottom:5px}.stat-card__value[data-v-44648cb1]{font-size:24px;font-weight:600}.quick-links[data-v-44648cb1]{display:grid;grid-template-columns:repeat(4,1fr);gap:15px}@media (max-width: 768px){.quick-links[data-v-44648cb1]{grid-template-columns:repeat(2,1fr)}}.quick-link[data-v-44648cb1]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;border-radius:var(--border-radius-base);background-color:var(--color-fill);text-decoration:none;transition:all var(--transition-duration-fast)}.quick-link[data-v-44648cb1]:hover{background-color:var(--color-primary-light-9);transform:translateY(-2px)}.quick-link__icon[data-v-44648cb1]{font-size:28px;margin-bottom:10px}.quick-link__title[data-v-44648cb1]{font-size:14px;color:var(--color-text-primary)}.activity-list[data-v-44648cb1]{display:flex;flex-direction:column;gap:15px}.activity-item[data-v-44648cb1]{display:flex;align-items:center;gap:10px;padding-bottom:15px;border-bottom:1px solid var(--color-border-lighter)}.activity-item[data-v-44648cb1]:last-child{border-bottom:none;padding-bottom:0}.activity-item__action[data-v-44648cb1]{flex:1;font-size:14px;color:var(--color-text-regular)}.activity-item__time[data-v-44648cb1]{font-size:12px;color:var(--color-text-placeholder)}.system-info[data-v-44648cb1]{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}@media (max-width: 768px){.system-info[data-v-44648cb1]{grid-template-columns:1fr}}.system-info__item[data-v-44648cb1]{display:flex;align-items:center;gap:10px}.system-info__label[data-v-44648cb1]{font-size:14px;color:var(--color-text-secondary);min-width:80px}.system-info__value[data-v-44648cb1]{font-size:14px;color:var(--color-text-primary)}.user-page[data-v-d2491ae0]{padding:20px}.user-page .search-card[data-v-d2491ae0]{margin-bottom:20px}.user-page .toolbar[data-v-d2491ae0]{margin-bottom:15px}.data-table[data-v-d2491ae0]{width:100%;border-collapse:collapse}.data-table th[data-v-d2491ae0],.data-table td[data-v-d2491ae0]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.data-table th[data-v-d2491ae0]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.data-table .loading-cell[data-v-d2491ae0],.data-table .empty-cell[data-v-d2491ae0]{text-align:center;color:var(--color-text-secondary);padding:40px}.pagination-wrapper[data-v-d2491ae0]{display:flex;justify-content:flex-end;margin-top:20px}.role-page[data-v-8ad30bc6]{padding:20px}.role-page .search-card[data-v-8ad30bc6]{margin-bottom:20px}.role-page .toolbar[data-v-8ad30bc6]{margin-bottom:15px}.data-table[data-v-8ad30bc6]{width:100%;border-collapse:collapse}.data-table th[data-v-8ad30bc6],.data-table td[data-v-8ad30bc6]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.data-table th[data-v-8ad30bc6]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.data-table .loading-cell[data-v-8ad30bc6],.data-table .empty-cell[data-v-8ad30bc6]{text-align:center;color:var(--color-text-secondary);padding:40px}.pagination-wrapper[data-v-8ad30bc6]{display:flex;justify-content:flex-end;margin-top:20px}.menu-page[data-v-2a272a68]{padding:20px}.menu-page .toolbar[data-v-2a272a68]{margin-bottom:15px}.tree-table[data-v-2a272a68]{width:100%;border-collapse:collapse}.tree-table th[data-v-2a272a68],.tree-table td[data-v-2a272a68]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.tree-table th[data-v-2a272a68]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.tree-table .tree-row--level-1 td[data-v-2a272a68]:first-child{padding-left:30px}.tree-indent[data-v-2a272a68]{display:inline-block;width:20px}.menu-name[data-v-2a272a68]{cursor:pointer;color:var(--color-primary)}.menu-name[data-v-2a272a68]:hover{text-decoration:underline}
|
|
1
|
+
.sidebar[data-v-abf8c2be]{height:100%;display:flex;flex-direction:column;background-color:var(--bg-color);border-right:1px solid var(--color-border-lighter)}.sidebar--collapsed .sidebar__logo[data-v-abf8c2be]{justify-content:center;padding:0}.sidebar__logo[data-v-abf8c2be]{height:50px;display:flex;align-items:center;padding:0 20px;gap:10px;border-bottom:1px solid var(--color-border-lighter)}.sidebar__logo-img[data-v-abf8c2be]{width:32px;height:32px}.sidebar__logo-text[data-v-abf8c2be]{font-size:16px;font-weight:600;color:var(--color-primary)}.sidebar__menu[data-v-abf8c2be]{flex:1;border-right:none;overflow-y:auto}.sidebar__user[data-v-abf8c2be]{padding:10px;border-top:1px solid var(--color-border-lighter);display:flex;align-items:center;justify-content:space-between}.sidebar__user-info[data-v-abf8c2be]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-abf8c2be]{font-size:14px;font-weight:500}.sidebar__user-role[data-v-abf8c2be]{font-size:12px;color:var(--color-text-secondary)}.header[data-v-de94213f]{display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:100%;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter)}.header__left[data-v-de94213f]{display:flex;align-items:center;gap:15px}.header__collapse[data-v-de94213f]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--color-text-regular);transition:color .2s}.header__collapse[data-v-de94213f]:hover{color:var(--color-primary)}.header__breadcrumb[data-v-de94213f]{font-size:14px;color:var(--color-text-secondary)}.header__breadcrumb .breadcrumb-separator[data-v-de94213f]{margin:0 8px;color:var(--color-text-placeholder)}.header__breadcrumb .is-current[data-v-de94213f]{color:var(--color-text-primary);font-weight:500}.header__right[data-v-de94213f]{display:flex;align-items:center;gap:8px}.header__action[data-v-de94213f]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--border-radius-base);color:var(--color-text-regular);transition:all .2s}.header__action[data-v-de94213f]:hover{background-color:var(--color-fill);color:var(--color-primary)}.header__user[data-v-de94213f]{position:relative;margin-left:8px}.header__user-trigger[data-v-de94213f]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:var(--border-radius-base);transition:background-color .2s}.header__user-trigger[data-v-de94213f]:hover{background-color:var(--color-fill)}.header__user-name[data-v-de94213f]{font-size:14px;color:var(--color-text-primary);max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header__user-arrow[data-v-de94213f]{font-size:10px;color:var(--color-text-secondary);transition:transform .2s}.header__user-arrow.is-active[data-v-de94213f]{transform:rotate(180deg)}.header__avatar[data-v-de94213f]{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:500}.header__dropdown[data-v-de94213f]{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background-color:var(--bg-color);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow);overflow:hidden;z-index:100}.header__dropdown-header[data-v-de94213f]{display:flex;align-items:center;gap:12px;padding:16px}.header__dropdown-avatar[data-v-de94213f]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;font-weight:500}.header__dropdown-info[data-v-de94213f]{flex:1}.header__dropdown-name[data-v-de94213f]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.header__dropdown-role[data-v-de94213f]{font-size:12px;color:var(--color-text-secondary);margin-top:2px}.header__dropdown-divider[data-v-de94213f]{height:1px;background-color:var(--color-border-lighter)}.header__dropdown-menu[data-v-de94213f]{padding:8px 0}.header__dropdown-item[data-v-de94213f]{display:flex;align-items:center;gap:10px;padding:10px 16px;cursor:pointer;font-size:14px;color:var(--color-text-regular);transition:all .2s}.header__dropdown-item[data-v-de94213f]:hover{background-color:var(--color-fill);color:var(--color-text-primary)}.header__dropdown-item--danger[data-v-de94213f]{color:var(--color-danger)}.header__dropdown-item--danger[data-v-de94213f]:hover{background-color:var(--color-danger-light);color:var(--color-danger)}.header__search-modal[data-v-de94213f]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;display:flex;align-items:flex-start;justify-content:center;padding-top:100px;z-index:200}.search-container[data-v-de94213f]{width:600px;max-width:90vw;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark);overflow:hidden}.search-input-wrapper[data-v-de94213f]{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--color-border-lighter)}.search-input-wrapper .search-icon[data-v-de94213f]{color:var(--color-text-secondary);margin-right:12px}.search-input-wrapper .search-input[data-v-de94213f]{flex:1;font-size:16px;color:var(--color-text-primary);background:transparent;border:none;outline:none}.search-input-wrapper .search-input[data-v-de94213f]::placeholder{color:var(--color-text-placeholder)}.search-input-wrapper .search-shortcut[data-v-de94213f]{font-size:12px;color:var(--color-text-secondary);padding:4px 8px;background-color:var(--color-fill);border-radius:var(--border-radius-base)}.search-results[data-v-de94213f]{max-height:400px;overflow-y:auto;padding:8px 0}.search-result-item[data-v-de94213f]{display:flex;align-items:center;gap:12px;padding:12px 20px;cursor:pointer;transition:background-color .2s}.search-result-item[data-v-de94213f]:hover{background-color:var(--color-fill)}.search-result-item.is-first[data-v-de94213f]{background-color:var(--color-primary-light-9)}.search-result-item .search-result-icon[data-v-de94213f]{color:var(--color-text-secondary)}.search-result-item .search-result-info[data-v-de94213f]{flex:1;display:flex;flex-direction:column;gap:2px}.search-result-item .search-result-title[data-v-de94213f]{font-size:14px;color:var(--color-text-primary)}.search-result-item .search-result-parent[data-v-de94213f]{font-size:12px;color:var(--color-text-secondary)}.search-empty[data-v-de94213f]{padding:40px 20px;text-align:center;color:var(--color-text-secondary);font-size:14px}.settings-drawer .settings-section[data-v-de94213f]{margin-bottom:24px}.settings-drawer .settings-title[data-v-de94213f]{font-size:14px;font-weight:500;color:var(--color-text-primary);margin-bottom:12px}.settings-drawer .settings-layout-options[data-v-de94213f]{display:flex;gap:12px}.settings-drawer .layout-option[data-v-de94213f]{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px;border:1px solid var(--color-border);border-radius:var(--border-radius-base);cursor:pointer;transition:all .2s}.settings-drawer .layout-option[data-v-de94213f]:hover{border-color:var(--color-primary-light-5)}.settings-drawer .layout-option.is-active[data-v-de94213f]{border-color:var(--color-primary);background-color:var(--color-primary-light-9)}.settings-drawer .layout-option__preview[data-v-de94213f]{width:48px;height:36px;border:1px solid var(--color-border-light);border-radius:2px;overflow:hidden}.settings-drawer .layout-option__label[data-v-de94213f]{font-size:12px;color:var(--color-text-regular)}.settings-drawer .layout-preview-sidebar[data-v-de94213f]{display:flex;height:100%}.settings-drawer .layout-preview-sidebar .preview-aside[data-v-de94213f]{width:25%;height:100%;background-color:var(--color-primary-light-7)}.settings-drawer .layout-preview-sidebar .preview-main[data-v-de94213f]{flex:1;display:flex;flex-direction:column}.settings-drawer .layout-preview-sidebar .preview-main .preview-header[data-v-de94213f]{height:20%;background-color:var(--color-border-light)}.settings-drawer .layout-preview-sidebar .preview-main .preview-content[data-v-de94213f]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .layout-preview-top[data-v-de94213f]{display:flex;flex-direction:column;height:100%}.settings-drawer .layout-preview-top .preview-header-full[data-v-de94213f]{height:25%;background-color:var(--color-primary-light-7)}.settings-drawer .layout-preview-top .preview-content-full[data-v-de94213f]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .layout-preview-mix[data-v-de94213f]{display:flex;flex-direction:column;height:100%}.settings-drawer .layout-preview-mix .preview-header-mix[data-v-de94213f]{height:25%;background-color:var(--color-primary-light-7);display:flex}.settings-drawer .layout-preview-mix .preview-header-mix .preview-mix-left[data-v-de94213f]{width:30%;background-color:var(--color-primary)}.settings-drawer .layout-preview-mix .preview-mix-body[data-v-de94213f]{flex:1;display:flex}.settings-drawer .layout-preview-mix .preview-mix-body .preview-mix-aside[data-v-de94213f]{width:25%;background-color:var(--color-primary-light-8)}.settings-drawer .layout-preview-mix .preview-mix-body .preview-mix-content[data-v-de94213f]{flex:1;background-color:var(--bg-color-page)}.settings-drawer .settings-color-options[data-v-de94213f]{display:flex;gap:12px}.settings-drawer .color-option[data-v-de94213f]{width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .2s}.settings-drawer .color-option[data-v-de94213f]:hover{transform:scale(1.1)}.settings-drawer .color-option.is-active[data-v-de94213f]{box-shadow:0 0 0 2px var(--bg-color),0 0 0 4px var(--color-primary)}.settings-drawer .settings-switch-list[data-v-de94213f]{display:flex;flex-direction:column;gap:12px}.settings-drawer .settings-switch-item[data-v-de94213f]{display:flex;align-items:center;justify-content:space-between}.settings-drawer .settings-switch-item span[data-v-de94213f]{font-size:14px;color:var(--color-text-regular)}.settings-drawer .switch-wrapper[data-v-de94213f]{width:44px;height:22px;display:flex;align-items:center;cursor:pointer}.settings-drawer .switch-wrapper .switch-core[data-v-de94213f]{width:100%;height:100%;border-radius:11px;background-color:var(--color-border);position:relative;transition:background-color .2s}.settings-drawer .switch-wrapper .switch-core[data-v-de94213f]:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background-color:#fff;border-radius:50%;transition:left .2s}.settings-drawer .switch-wrapper.is-checked .switch-core[data-v-de94213f]{background-color:var(--color-primary)}.settings-drawer .switch-wrapper.is-checked .switch-core[data-v-de94213f]:after{left:24px}.dropdown-enter-active[data-v-de94213f],.dropdown-leave-active[data-v-de94213f]{transition:all .2s ease}.dropdown-enter-from[data-v-de94213f],.dropdown-leave-to[data-v-de94213f]{opacity:0;transform:translateY(-10px)}.search-enter-active[data-v-de94213f],.search-leave-active[data-v-de94213f]{transition:all .2s ease}.search-enter-from[data-v-de94213f],.search-leave-to[data-v-de94213f]{opacity:0}:root.grey-mode[data-v-de94213f]{filter:grayscale(100%)}.layout[data-v-a3110011]{display:flex;width:100%;height:100%}.layout__aside[data-v-a3110011]{transition:width .3s;overflow:hidden;flex-shrink:0;height:100%}.layout__main[data-v-a3110011]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%}.layout__header[data-v-a3110011]{height:50px;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter);flex-shrink:0}.layout__content[data-v-a3110011]{flex:1;overflow:auto;background-color:var(--bg-color-page)}.tabs-wrapper[data-v-9156d8cd]{width:100%;height:100%;padding:0 10px}.tabs-wrapper[data-v-9156d8cd] .t-tabs{height:100%}.tabs-wrapper[data-v-9156d8cd] .t-tabs__header{margin:0;border-bottom:none}.tabs-wrapper[data-v-9156d8cd] .t-tabs__nav{border:none}.tabs-wrapper[data-v-9156d8cd] .t-tabs__item{height:32px;line-height:32px;border:1px solid var(--color-border-lighter);margin-right:5px;border-radius:var(--border-radius-base);padding:0 15px}.tabs-wrapper[data-v-9156d8cd] .t-tabs__item.is-active{background-color:var(--color-primary-light-9);border-color:var(--color-primary)}.tab-label[data-v-9156d8cd]{display:flex;align-items:center;gap:5px}.tab-close[data-v-9156d8cd]{width:14px;height:14px;display:flex;align-items:center;justify-content:center;font-size:10px;border-radius:50%}.tab-close[data-v-9156d8cd]:hover{background-color:var(--color-danger-light);color:var(--color-danger)}.footer[data-v-4852826a]{width:100%;text-align:center;font-size:12px;color:var(--color-text-secondary)}.login[data-v-ed827d66]{width:100%;min-height:100vh;display:flex;align-items:center;justify-content:flex-end;padding-right:15%;background:linear-gradient(135deg,var(--color-primary-light-9) 0%,var(--color-primary-light-7) 100%)}.login__container[data-v-ed827d66]{width:400px;padding:40px;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark)}.login__header[data-v-ed827d66]{text-align:center;margin-bottom:30px}.login__logo[data-v-ed827d66]{width:60px;height:60px}.login__title[data-v-ed827d66]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-ed827d66]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-ed827d66] .x-form-item{margin-bottom:20px}.login__form[data-v-ed827d66] .x-input__prefix{margin-right:8px}.login__submit[data-v-ed827d66]{width:100%}.login__footer[data-v-ed827d66]{text-align:center;margin-top:20px;font-size:12px;color:var(--color-text-placeholder)}.error-page[data-v-c3c12c24]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-c3c12c24]{text-align:center}.error-page__code[data-v-c3c12c24]{font-size:120px;font-weight:600;color:var(--color-primary);line-height:1;margin-bottom:20px}.error-page__title[data-v-c3c12c24]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-c3c12c24]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.error-page[data-v-dd5f2795]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-dd5f2795]{text-align:center}.error-page__code[data-v-dd5f2795]{font-size:120px;font-weight:600;color:var(--color-warning);line-height:1;margin-bottom:20px}.error-page__title[data-v-dd5f2795]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-dd5f2795]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.dashboard[data-v-44648cb1]{padding:20px}.dashboard__stats[data-v-44648cb1]{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-bottom:20px}@media (max-width: 1200px){.dashboard__stats[data-v-44648cb1]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.dashboard__stats[data-v-44648cb1]{grid-template-columns:1fr}}.dashboard__main[data-v-44648cb1]{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-bottom:20px}@media (max-width: 992px){.dashboard__main[data-v-44648cb1]{grid-template-columns:1fr}}.dashboard__quick[data-v-44648cb1],.dashboard__activity[data-v-44648cb1]{min-height:300px}.card-title[data-v-44648cb1]{font-size:16px;font-weight:500}.stat-card__content[data-v-44648cb1]{display:flex;align-items:center;gap:15px}.stat-card__icon[data-v-44648cb1]{width:50px;height:50px;display:flex;align-items:center;justify-content:center;font-size:24px;border-radius:var(--border-radius-base)}.stat-card__info[data-v-44648cb1]{flex:1}.stat-card__title[data-v-44648cb1]{font-size:14px;color:var(--color-text-secondary);margin-bottom:5px}.stat-card__value[data-v-44648cb1]{font-size:24px;font-weight:600}.quick-links[data-v-44648cb1]{display:grid;grid-template-columns:repeat(4,1fr);gap:15px}@media (max-width: 768px){.quick-links[data-v-44648cb1]{grid-template-columns:repeat(2,1fr)}}.quick-link[data-v-44648cb1]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;border-radius:var(--border-radius-base);background-color:var(--color-fill);text-decoration:none;transition:all var(--transition-duration-fast)}.quick-link[data-v-44648cb1]:hover{background-color:var(--color-primary-light-9);transform:translateY(-2px)}.quick-link__icon[data-v-44648cb1]{font-size:28px;margin-bottom:10px}.quick-link__title[data-v-44648cb1]{font-size:14px;color:var(--color-text-primary)}.activity-list[data-v-44648cb1]{display:flex;flex-direction:column;gap:15px}.activity-item[data-v-44648cb1]{display:flex;align-items:center;gap:10px;padding-bottom:15px;border-bottom:1px solid var(--color-border-lighter)}.activity-item[data-v-44648cb1]:last-child{border-bottom:none;padding-bottom:0}.activity-item__action[data-v-44648cb1]{flex:1;font-size:14px;color:var(--color-text-regular)}.activity-item__time[data-v-44648cb1]{font-size:12px;color:var(--color-text-placeholder)}.system-info[data-v-44648cb1]{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}@media (max-width: 768px){.system-info[data-v-44648cb1]{grid-template-columns:1fr}}.system-info__item[data-v-44648cb1]{display:flex;align-items:center;gap:10px}.system-info__label[data-v-44648cb1]{font-size:14px;color:var(--color-text-secondary);min-width:80px}.system-info__value[data-v-44648cb1]{font-size:14px;color:var(--color-text-primary)}.user-page[data-v-d2491ae0]{padding:20px}.user-page .search-card[data-v-d2491ae0]{margin-bottom:20px}.user-page .toolbar[data-v-d2491ae0]{margin-bottom:15px}.data-table[data-v-d2491ae0]{width:100%;border-collapse:collapse}.data-table th[data-v-d2491ae0],.data-table td[data-v-d2491ae0]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.data-table th[data-v-d2491ae0]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.data-table .loading-cell[data-v-d2491ae0],.data-table .empty-cell[data-v-d2491ae0]{text-align:center;color:var(--color-text-secondary);padding:40px}.pagination-wrapper[data-v-d2491ae0]{display:flex;justify-content:flex-end;margin-top:20px}.role-page[data-v-8ad30bc6]{padding:20px}.role-page .search-card[data-v-8ad30bc6]{margin-bottom:20px}.role-page .toolbar[data-v-8ad30bc6]{margin-bottom:15px}.data-table[data-v-8ad30bc6]{width:100%;border-collapse:collapse}.data-table th[data-v-8ad30bc6],.data-table td[data-v-8ad30bc6]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.data-table th[data-v-8ad30bc6]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.data-table .loading-cell[data-v-8ad30bc6],.data-table .empty-cell[data-v-8ad30bc6]{text-align:center;color:var(--color-text-secondary);padding:40px}.pagination-wrapper[data-v-8ad30bc6]{display:flex;justify-content:flex-end;margin-top:20px}.menu-page[data-v-2a272a68]{padding:20px}.menu-page .toolbar[data-v-2a272a68]{margin-bottom:15px}.tree-table[data-v-2a272a68]{width:100%;border-collapse:collapse}.tree-table th[data-v-2a272a68],.tree-table td[data-v-2a272a68]{padding:12px;text-align:left;border-bottom:1px solid var(--color-border-lighter)}.tree-table th[data-v-2a272a68]{font-weight:500;color:var(--color-text-regular);background-color:var(--color-fill-light)}.tree-table .tree-row--level-1 td[data-v-2a272a68]:first-child{padding-left:30px}.tree-indent[data-v-2a272a68]{display:inline-block;width:20px}.menu-name[data-v-2a272a68]{cursor:pointer;color:var(--color-primary)}.menu-name[data-v-2a272a68]:hover{text-decoration:underline}
|
package/dist/utils/auth.d.ts
CHANGED
|
@@ -2,16 +2,25 @@
|
|
|
2
2
|
* Token 管理
|
|
3
3
|
*/
|
|
4
4
|
export interface TokenInfo {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
access_token: string;
|
|
6
|
+
token_type: string;
|
|
7
|
+
refresh_token: string;
|
|
8
|
+
expires_time: number;
|
|
9
|
+
refresh_time: number;
|
|
10
|
+
code?: string;
|
|
8
11
|
}
|
|
9
12
|
export declare const getToken: () => string | null;
|
|
10
13
|
export declare const setToken: (token: string) => void;
|
|
14
|
+
export declare const getTokenType: () => string | null;
|
|
15
|
+
export declare const setTokenType: (tokenType: string) => void;
|
|
11
16
|
export declare const getRefreshToken: () => string | null;
|
|
12
17
|
export declare const setRefreshToken: (refreshToken: string) => void;
|
|
13
18
|
export declare const getTokenExpire: () => number | null;
|
|
14
19
|
export declare const setTokenExpire: (expireTime: number) => void;
|
|
20
|
+
export declare const getRefreshTime: () => number | null;
|
|
21
|
+
export declare const setRefreshTime: (refreshTime: number) => void;
|
|
22
|
+
export declare const getCode: () => string | null;
|
|
23
|
+
export declare const setCode: (code: string) => void;
|
|
15
24
|
export declare const setTokenInfo: (info: TokenInfo) => void;
|
|
16
25
|
export declare const clearToken: () => void;
|
|
17
26
|
export declare const isTokenExpired: () => boolean;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 权限工具函数
|
|
3
|
+
* 注意:tineco-ui 不支持 permissions 和 roles 字段,这些函数暂时返回登录状态
|
|
3
4
|
*/
|
|
4
5
|
/**
|
|
5
6
|
* 检查是否有权限
|
|
6
|
-
* @param
|
|
7
|
+
* @param _permission 权限标识(暂不使用)
|
|
7
8
|
*/
|
|
8
|
-
export declare function hasPermission(
|
|
9
|
+
export declare function hasPermission(_permission: string | string[]): boolean;
|
|
9
10
|
/**
|
|
10
11
|
* 检查是否有角色
|
|
11
|
-
* @param
|
|
12
|
+
* @param _role 角色标识(暂不使用)
|
|
12
13
|
*/
|
|
13
|
-
export declare function hasRole(
|
|
14
|
+
export declare function hasRole(_role: string | string[]): boolean;
|
|
14
15
|
/**
|
|
15
16
|
* 检查是否是管理员
|
|
16
17
|
*/
|
package/package.json
CHANGED
package/src/api/auth.ts
CHANGED
|
@@ -7,20 +7,20 @@ import type { LoginParams, LoginResult, UserInfo } from '@/types/api'
|
|
|
7
7
|
|
|
8
8
|
// 登录
|
|
9
9
|
export function login(data: LoginParams) {
|
|
10
|
-
return http.post<LoginResult>('/user/
|
|
10
|
+
return http.post<LoginResult>('/user/v1.0/login/by-domain', data)
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
// 登出
|
|
14
14
|
export function logout() {
|
|
15
|
-
return http.
|
|
15
|
+
return http.put('/user/v1.0/user/logout')
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
// 获取用户信息
|
|
19
19
|
export function getUserInfo() {
|
|
20
|
-
return http.get<UserInfo>('/user/user-
|
|
20
|
+
return http.get<UserInfo>('/user/v1.0/user/get-me')
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
// 刷新 Token
|
|
24
24
|
export function refreshToken(refreshToken: string) {
|
|
25
|
-
return http.post<{ token: string; expireTime: number }>('/user/
|
|
25
|
+
return http.post<{ token: string; expireTime: number }>('/user/v1.0/refresh', { refreshToken })
|
|
26
26
|
}
|
package/src/api/system.ts
CHANGED
|
@@ -41,12 +41,13 @@ export function updateRoleStatus(id: string | number, status: number) {
|
|
|
41
41
|
|
|
42
42
|
// 获取菜单列表
|
|
43
43
|
export function getMenuList() {
|
|
44
|
-
return http.get<MenuItem[]>('/user/
|
|
44
|
+
return http.get<MenuItem[]>('/user/v1.0/menu/list')
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
//
|
|
48
|
-
export function getMenuTree() {
|
|
49
|
-
|
|
47
|
+
// 获取用户菜单(根据 appId)
|
|
48
|
+
export function getMenuTree(appId?: string) {
|
|
49
|
+
const id = appId || import.meta.env.VITE_APP_ID
|
|
50
|
+
return http.get<MenuItem[]>(`/user/v1.0/menu/get-menu?appId=${id}`)
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
// 创建菜单
|
|
@@ -262,9 +262,9 @@ onUnmounted(() => {
|
|
|
262
262
|
<div class="header__user" ref="dropdownRef">
|
|
263
263
|
<div class="header__user-trigger" @click.stop="toggleDropdown">
|
|
264
264
|
<div class="header__avatar">
|
|
265
|
-
<span>{{ userStore.
|
|
265
|
+
<span>{{ userStore.userName?.charAt(0) || 'U' }}</span>
|
|
266
266
|
</div>
|
|
267
|
-
<span class="header__user-name">{{ userStore.
|
|
267
|
+
<span class="header__user-name">{{ userStore.userName }}</span>
|
|
268
268
|
<span class="header__user-arrow" :class="{ 'is-active': dropdownVisible }">▼</span>
|
|
269
269
|
</div>
|
|
270
270
|
|
|
@@ -273,11 +273,11 @@ onUnmounted(() => {
|
|
|
273
273
|
<div v-if="dropdownVisible" class="header__dropdown">
|
|
274
274
|
<div class="header__dropdown-header">
|
|
275
275
|
<div class="header__dropdown-avatar">
|
|
276
|
-
<span>{{ userStore.
|
|
276
|
+
<span>{{ userStore.userName?.charAt(0) || 'U' }}</span>
|
|
277
277
|
</div>
|
|
278
278
|
<div class="header__dropdown-info">
|
|
279
|
-
<div class="header__dropdown-name">{{ userStore.
|
|
280
|
-
<div class="header__dropdown-role">{{ userStore.
|
|
279
|
+
<div class="header__dropdown-name">{{ userStore.userName }}</div>
|
|
280
|
+
<div class="header__dropdown-role">{{ userStore.departmentName }}</div>
|
|
281
281
|
</div>
|
|
282
282
|
</div>
|
|
283
283
|
<div class="header__dropdown-divider"></div>
|
|
@@ -41,15 +41,21 @@ const handleLogout = () => {
|
|
|
41
41
|
|
|
42
42
|
// 获取菜单图标名称
|
|
43
43
|
const getMenuIcon = (icon?: string): string => {
|
|
44
|
+
if (!icon) return 'file'
|
|
45
|
+
// 处理 tineco-ui 的图标类名(如 tineco-icon-home)
|
|
46
|
+
if (icon.startsWith('tineco-icon-')) {
|
|
47
|
+
return icon.replace('tineco-icon-', '')
|
|
48
|
+
}
|
|
44
49
|
const iconMap: Record<string, string> = {
|
|
45
50
|
dashboard: 'dashboard',
|
|
46
51
|
system: 'system',
|
|
47
52
|
user: 'user',
|
|
48
53
|
role: 'role',
|
|
49
54
|
menu: 'list',
|
|
50
|
-
setting: 'setting'
|
|
55
|
+
setting: 'setting',
|
|
56
|
+
home: 'home'
|
|
51
57
|
}
|
|
52
|
-
return iconMap[icon
|
|
58
|
+
return iconMap[icon] || icon
|
|
53
59
|
}
|
|
54
60
|
</script>
|
|
55
61
|
|
|
@@ -73,26 +79,26 @@ const getMenuIcon = (icon?: string): string => {
|
|
|
73
79
|
class="sidebar__menu"
|
|
74
80
|
@select="handleMenuSelect"
|
|
75
81
|
>
|
|
76
|
-
<template v-for="menu in menuStore.menuList" :key="menu.
|
|
82
|
+
<template v-for="menu in menuStore.menuList" :key="menu.menuUrl">
|
|
77
83
|
<!-- 有子菜单 -->
|
|
78
|
-
<SubMenu v-if="menu.children && menu.children.length > 0" :index="menu.
|
|
84
|
+
<SubMenu v-if="menu.children && menu.children.length > 0" :index="menu.menuUrl">
|
|
79
85
|
<template #title>
|
|
80
86
|
<Icon :name="getMenuIcon(menu.icon)" :size="16" />
|
|
81
|
-
<span>{{ menu.
|
|
87
|
+
<span>{{ menu.menuName }}</span>
|
|
82
88
|
</template>
|
|
83
89
|
<MenuItem
|
|
84
90
|
v-for="child in menu.children"
|
|
85
|
-
:key="child.
|
|
86
|
-
:index="child.
|
|
91
|
+
:key="child.menuUrl"
|
|
92
|
+
:index="child.menuUrl"
|
|
87
93
|
>
|
|
88
94
|
<Icon :name="getMenuIcon(child.icon)" :size="16" />
|
|
89
|
-
<span>{{ child.
|
|
95
|
+
<span>{{ child.menuName }}</span>
|
|
90
96
|
</MenuItem>
|
|
91
97
|
</SubMenu>
|
|
92
98
|
<!-- 无子菜单 -->
|
|
93
|
-
<MenuItem v-else :index="menu.
|
|
99
|
+
<MenuItem v-else :index="menu.menuUrl">
|
|
94
100
|
<Icon :name="getMenuIcon(menu.icon)" :size="16" />
|
|
95
|
-
<span>{{ menu.
|
|
101
|
+
<span>{{ menu.menuName }}</span>
|
|
96
102
|
</MenuItem>
|
|
97
103
|
</template>
|
|
98
104
|
</Menu>
|
|
@@ -100,8 +106,8 @@ const getMenuIcon = (icon?: string): string => {
|
|
|
100
106
|
<!-- 用户信息 -->
|
|
101
107
|
<div v-if="!isCollapsed" class="sidebar__user">
|
|
102
108
|
<div class="sidebar__user-info">
|
|
103
|
-
<span class="sidebar__user-name">{{ userStore.
|
|
104
|
-
<span class="sidebar__user-role">{{ userStore.
|
|
109
|
+
<span class="sidebar__user-name">{{ userStore.userName }}</span>
|
|
110
|
+
<span class="sidebar__user-role">{{ userStore.departmentName }}</span>
|
|
105
111
|
</div>
|
|
106
112
|
<Button type="text" size="small" @click="handleLogout">退出</Button>
|
|
107
113
|
</div>
|
|
@@ -18,7 +18,7 @@ export function useApp() {
|
|
|
18
18
|
const authStore = useAuthStore()
|
|
19
19
|
|
|
20
20
|
// 用户名
|
|
21
|
-
const userName = computed(() => userStore.
|
|
21
|
+
const userName = computed(() => userStore.userName || '')
|
|
22
22
|
|
|
23
23
|
// 用户信息
|
|
24
24
|
const userInfo = computed(() => userStore.userInfo)
|