xto-fronted 0.4.112 → 0.4.113

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.
Files changed (90) hide show
  1. package/dist/App.vue.d.ts +2 -0
  2. package/dist/api/auth.d.ts +8 -0
  3. package/dist/api/index.d.ts +6 -0
  4. package/dist/api/index.js +26 -0
  5. package/dist/api/system.d.ts +16 -0
  6. package/dist/api/user.d.ts +13 -0
  7. package/dist/api.d.ts +2 -0
  8. package/dist/components/Layout/Footer.vue.d.ts +2 -0
  9. package/dist/components/Layout/Header.vue.d.ts +5 -0
  10. package/dist/components/Layout/MixTopMenu.vue.d.ts +10 -0
  11. package/dist/components/Layout/Sidebar.vue.d.ts +13 -0
  12. package/dist/components/Layout/SidebarMenuItem.vue.d.ts +5 -0
  13. package/dist/components/Layout/Tabs.vue.d.ts +2 -0
  14. package/dist/components/Layout/TopMenu.vue.d.ts +10 -0
  15. package/dist/components/Layout/index.vue.d.ts +7 -0
  16. package/dist/composables/useApp.d.ts +30 -0
  17. package/dist/composables/useAuth.d.ts +6 -0
  18. package/dist/composables/useForm.d.ts +20 -0
  19. package/dist/composables/useI18n.d.ts +30 -0
  20. package/dist/composables/useTable.d.ts +29 -0
  21. package/dist/directives/permission.d.ts +4 -0
  22. package/dist/enums/index.d.ts +32 -0
  23. package/dist/index-11ZvkUE8.js +641 -0
  24. package/dist/index-BVEs9eIP.js +3171 -0
  25. package/dist/index-BuVnk-Ka.js +189 -0
  26. package/dist/index-CPUyTvNq.js +479 -0
  27. package/dist/index-CaIet-zn.js +515 -0
  28. package/dist/index.d.ts +63 -0
  29. package/dist/index.js +99 -0
  30. package/dist/main.d.ts +0 -0
  31. package/dist/router/dynamicRoutes.d.ts +30 -0
  32. package/dist/router/guards.d.ts +17 -0
  33. package/dist/router/index.d.ts +6 -0
  34. package/dist/router/layoutRoute.d.ts +23 -0
  35. package/dist/router/staticRoutes.d.ts +2 -0
  36. package/dist/stores/app.d.ts +99 -0
  37. package/dist/stores/auth.d.ts +41 -0
  38. package/dist/stores/index.d.ts +10 -0
  39. package/dist/stores/locale.d.ts +42 -0
  40. package/dist/stores/menu.d.ts +83 -0
  41. package/dist/stores/user.d.ts +101 -0
  42. package/dist/style.css +1 -0
  43. package/dist/user-ChcAx-5W.js +1186 -0
  44. package/dist/utils/auth.d.ts +27 -0
  45. package/dist/utils/config.d.ts +51 -0
  46. package/dist/utils/permission.d.ts +17 -0
  47. package/dist/utils/request.d.ts +34 -0
  48. package/dist/utils/storage.d.ts +24 -0
  49. package/dist/views/dashboard/index.vue.d.ts +2 -0
  50. package/dist/views/error/403.vue.d.ts +2 -0
  51. package/dist/views/error/404.vue.d.ts +2 -0
  52. package/dist/views/login/index.vue.d.ts +4 -0
  53. package/dist/views/system/menu/index.vue.d.ts +4 -0
  54. package/dist/views/system/role/index.vue.d.ts +4 -0
  55. package/dist/views/system/user/index.vue.d.ts +4 -0
  56. package/package.json +1 -1
  57. package/dist/assets/404-Cw_4ZCL6.css +0 -1
  58. package/dist/assets/404-G0TYnM2t.js +0 -1
  59. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  60. package/dist/assets/index-8nuVIlbv.css +0 -1
  61. package/dist/assets/index-BRR97dc6.js +0 -1
  62. package/dist/assets/index-BlRslYYI.css +0 -1
  63. package/dist/assets/index-Br0rA9ST.js +0 -1
  64. package/dist/assets/index-BudArKxR.css +0 -1
  65. package/dist/assets/index-CEwTCJMr.js +0 -1
  66. package/dist/assets/index-CFhWBbxk.css +0 -1
  67. package/dist/assets/index-Cm58iTuj.js +0 -1
  68. package/dist/assets/index-Cno3g_Ca.js +0 -1
  69. package/dist/assets/index-Cpew6d-v.css +0 -1
  70. package/dist/assets/index-D1AzIZb6.js +0 -1
  71. package/dist/assets/index-DCn9x-He.js +0 -2
  72. package/dist/assets/index-Dk64JJvN.js +0 -1
  73. package/dist/assets/index-rQHcgyhm.css +0 -1
  74. package/dist/assets/index-vfvEFrCH.css +0 -1
  75. package/dist/assets/vendor-CWD9azq9.js +0 -16
  76. package/dist/assets/vue-vendor-gcK82_Kd.js +0 -29
  77. package/dist/assets/xto-base-CL2NKZJJ.css +0 -1
  78. package/dist/assets/xto-base-wYW0Uxvr.js +0 -1
  79. package/dist/assets/xto-business--V1F5Gwb.css +0 -1
  80. package/dist/assets/xto-core-DtPNWVUu.js +0 -1
  81. package/dist/assets/xto-data-2diO2SyB.js +0 -1
  82. package/dist/assets/xto-data-Bi03KULC.css +0 -1
  83. package/dist/assets/xto-feedback-BOOXC1Ev.js +0 -1
  84. package/dist/assets/xto-feedback-Bxx38c3P.css +0 -1
  85. package/dist/assets/xto-form-BBugNbnQ.js +0 -1
  86. package/dist/assets/xto-form-Cu6q3VLG.css +0 -1
  87. package/dist/assets/xto-layout-BDD6sSlM.css +0 -1
  88. package/dist/assets/xto-navigation-D_LFy9y9.js +0 -1
  89. package/dist/assets/xto-navigation-XfpyMpEo.css +0 -1
  90. package/dist/index.html +0 -28
@@ -0,0 +1,3171 @@
1
+ import { x as I, y as st, z as ot, A as at, B as nt, o as vt, C as lt, D as Fe, E as ht, m as _t, i as ft, F as gt, G as Qe, H as yt, I as kt, J as wt } from "./user-ChcAx-5W.js";
2
+ import { ref as y, computed as b, watch as ye, defineComponent as ne, resolveComponent as rt, openBlock as a, createBlock as O, unref as n, withCtx as M, createElementBlock as c, Fragment as K, renderList as X, createElementVNode as e, toDisplayString as x, createCommentVNode as P, normalizeClass as J, withDirectives as Te, vShow as bt, createVNode as k, createTextVNode as he, onMounted as Ke, onUnmounted as je, vModelText as We, Transition as ke, withModifiers as Ee, normalizeStyle as Ne, reactive as qe, createStaticVNode as ze, withKeys as xt, h as Ct } from "vue";
3
+ import { defineStore as Ie } from "pinia";
4
+ import { useRoute as be, useRouter as me, createRouter as He, createWebHistory as Ye } from "vue-router";
5
+ import { SubMenu as Re, MenuItem as Se, Menu as Ge, Tabs as $t, TabPane as Lt } from "@xto/navigation";
6
+ import { Icon as z, Button as we } from "@xto/base";
7
+ import { Drawer as Xe, Message as Mt } from "@xto/feedback";
8
+ import { Form as St, FormItem as Pe, Input as et, Checkbox as Nt } from "@xto/form";
9
+ import { createLocaleProvider as It, getSupportedLocales as Ut, useLocale as zt } from "@xto/core/locale";
10
+ const ue = Ie("app", () => {
11
+ const t = y(I.get("appName") || "XTO App"), r = y(I.get("indexPath") || "/dashboard"), u = y(I.get("loginPath") || "/login"), s = y(I.get("isDark") || !1), o = y(I.get("theme") || "light"), i = y(I.get("layout") || "sidebar"), h = y(I.get("isCollapsed") || !1), v = y(I.get("showTabs") ?? !0), d = y(I.get("showFooter") ?? !0), f = y(I.get("showBreadcrumb") ?? !0), _ = y(I.get("primaryColor") || "#409eff"), g = y([]), m = y([]), j = b(() => s.value ? "dark" : "light"), D = (U) => {
12
+ t.value = U, I.set("appName", U);
13
+ }, W = (U) => {
14
+ r.value = U, I.set("indexPath", U);
15
+ }, V = (U) => {
16
+ u.value = U, I.set("loginPath", U);
17
+ }, B = () => {
18
+ s.value = !s.value, o.value = s.value ? "dark" : "light", Z();
19
+ }, H = (U) => {
20
+ o.value = U, s.value = U === "dark", Z();
21
+ }, Z = () => {
22
+ const U = document.documentElement;
23
+ s.value ? U.classList.add("dark") : U.classList.remove("dark"), I.set("isDark", s.value), I.set("theme", o.value);
24
+ }, Y = () => {
25
+ h.value = !h.value, I.set("isCollapsed", h.value);
26
+ }, q = (U) => {
27
+ i.value = U, I.set("layout", U);
28
+ }, ee = () => {
29
+ v.value = !v.value, I.set("showTabs", v.value);
30
+ }, E = () => {
31
+ d.value = !d.value, I.set("showFooter", d.value);
32
+ }, N = () => {
33
+ f.value = !f.value, I.set("showBreadcrumb", f.value);
34
+ }, A = (U) => {
35
+ _.value = U, document.documentElement.style.setProperty("--color-primary", U), I.set("primaryColor", U);
36
+ }, G = (U) => {
37
+ g.value.includes(U) || g.value.push(U);
38
+ }, F = (U) => {
39
+ const oe = g.value.indexOf(U);
40
+ oe > -1 && g.value.splice(oe, 1);
41
+ }, se = () => {
42
+ g.value = [];
43
+ }, ie = (U) => {
44
+ m.value = U;
45
+ }, pe = () => {
46
+ Z(), _.value !== "#409eff" && document.documentElement.style.setProperty("--color-primary", _.value);
47
+ };
48
+ return ye(s, Z), {
49
+ appName: t,
50
+ indexPath: r,
51
+ loginPath: u,
52
+ isDark: s,
53
+ theme: o,
54
+ layout: i,
55
+ isCollapsed: h,
56
+ showTabs: v,
57
+ showFooter: d,
58
+ showBreadcrumb: f,
59
+ primaryColor: _,
60
+ cachedViews: g,
61
+ mixSubMenus: m,
62
+ themeClass: j,
63
+ setAppName: D,
64
+ setIndexPath: W,
65
+ setLoginPath: V,
66
+ toggleTheme: B,
67
+ toggleCollapse: Y,
68
+ setTheme: H,
69
+ setLayout: q,
70
+ toggleTabs: ee,
71
+ toggleFooter: E,
72
+ toggleBreadcrumb: N,
73
+ setPrimaryColor: A,
74
+ addCachedView: G,
75
+ removeCachedView: F,
76
+ clearCachedViews: se,
77
+ setMixSubMenus: ie,
78
+ initTheme: pe
79
+ };
80
+ }), Tt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
81
+ __proto__: null,
82
+ useAppStore: ue
83
+ }, Symbol.toStringTag, { value: "Module" })), Ae = "menu_list", De = "permission_list", Et = {
84
+ menuCode: "home",
85
+ menuName: "首页",
86
+ menuUrl: "/dashboard",
87
+ icon: "home",
88
+ closable: !1,
89
+ isDefault: !1,
90
+ isOut: !1
91
+ };
92
+ function it(t) {
93
+ return t.filter((r) => r.type !== 1).map((r) => ({
94
+ ...r,
95
+ children: r.children ? it(r.children) : void 0
96
+ }));
97
+ }
98
+ function Pt(t) {
99
+ const r = [];
100
+ function u(s) {
101
+ s.forEach((o) => {
102
+ o.type === 1 && o.menuCode && r.push(o.menuCode), o.children && u(o.children);
103
+ });
104
+ }
105
+ return u(t), r;
106
+ }
107
+ const de = Ie("menu", () => {
108
+ const t = y(I.get(Ae) || []), r = y(I.get(De) || []), u = b(() => t.value.length > 0);
109
+ return {
110
+ menuList: t,
111
+ permissions: r,
112
+ hasMenu: u,
113
+ setMenuList: (h) => {
114
+ r.value = Pt(h), I.set(De, r.value);
115
+ const v = it(h);
116
+ t.value = [Et, ...v], I.set(Ae, t.value);
117
+ },
118
+ clearMenu: () => {
119
+ t.value = [], r.value = [], I.remove(Ae), I.remove(De);
120
+ },
121
+ hasPermission: (h) => Array.isArray(h) ? h.some((v) => r.value.includes(v)) : r.value.includes(h)
122
+ };
123
+ }), Ve = "user_info", le = Ie("user", () => {
124
+ const t = y(I.get(Ve)), r = b(() => !!t.value), u = b(() => {
125
+ var m;
126
+ return ((m = t.value) == null ? void 0 : m.userId) || "";
127
+ }), s = b(() => {
128
+ var m;
129
+ return ((m = t.value) == null ? void 0 : m.userName) || "";
130
+ }), o = b(() => {
131
+ var m;
132
+ return ((m = t.value) == null ? void 0 : m.departmentName) || "";
133
+ }), i = b(() => {
134
+ var m;
135
+ return ((m = t.value) == null ? void 0 : m.roleName) || "";
136
+ }), h = b(() => {
137
+ var m;
138
+ return ((m = t.value) == null ? void 0 : m.email) || "";
139
+ }), v = b(() => {
140
+ var m;
141
+ return ((m = t.value) == null ? void 0 : m.mobilePhone) || "";
142
+ }), d = b(() => {
143
+ var m;
144
+ return ((m = t.value) == null ? void 0 : m.positionName) || "";
145
+ }), f = b(() => {
146
+ var m;
147
+ return ((m = t.value) == null ? void 0 : m.avatar) || "";
148
+ });
149
+ return {
150
+ userInfo: t,
151
+ isLoggedIn: r,
152
+ userId: u,
153
+ userName: s,
154
+ departmentName: o,
155
+ roleName: i,
156
+ email: h,
157
+ mobilePhone: v,
158
+ positionName: d,
159
+ avatar: f,
160
+ setUserInfo: (m) => {
161
+ t.value = m, I.set(Ve, m);
162
+ },
163
+ clearUserInfo: () => {
164
+ t.value = null, I.remove(Ve);
165
+ }
166
+ };
167
+ }), Ue = Ie("auth", () => {
168
+ const t = y(st()), r = b(() => ot()), u = y(""), s = y(""), o = y(""), i = y("/login");
169
+ return {
170
+ token: t,
171
+ isLoggedIn: r,
172
+ baseUrl: u,
173
+ appId: s,
174
+ clientId: o,
175
+ loginPath: i,
176
+ login: (m) => {
177
+ t.value = m.access_token, nt(m);
178
+ },
179
+ logout: () => {
180
+ t.value = null, at();
181
+ },
182
+ setBaseUrl: (m) => {
183
+ u.value = m;
184
+ },
185
+ setAppId: (m) => {
186
+ s.value = m;
187
+ },
188
+ setClientId: (m) => {
189
+ o.value = m;
190
+ },
191
+ setLoginPath: (m) => {
192
+ i.value = m;
193
+ }
194
+ };
195
+ }), At = { class: "menu-item__content" }, Dt = { class: "menu-item__icon" }, Vt = {
196
+ key: 1,
197
+ class: "menu-item__char"
198
+ }, Ot = { class: "menu-item__text" }, Bt = { class: "menu-item__content" }, Rt = {
199
+ key: 0,
200
+ class: "menu-item__icon"
201
+ }, Ft = {
202
+ key: 1,
203
+ class: "menu-item__char"
204
+ }, Kt = { class: "menu-item__text" }, jt = /* @__PURE__ */ ne({
205
+ __name: "SidebarMenuItem",
206
+ props: {
207
+ menu: {}
208
+ },
209
+ setup(t) {
210
+ const r = t, u = /* @__PURE__ */ new Set([
211
+ "arrow-up",
212
+ "arrow-down",
213
+ "arrow-left",
214
+ "arrow-right",
215
+ "caret-down",
216
+ "caret-right",
217
+ "plus",
218
+ "minus",
219
+ "close",
220
+ "check",
221
+ "edit",
222
+ "delete",
223
+ "copy",
224
+ "download",
225
+ "upload",
226
+ "refresh",
227
+ "search",
228
+ "filter",
229
+ "more",
230
+ "setting",
231
+ "share",
232
+ "loading",
233
+ "info",
234
+ "success",
235
+ "warning",
236
+ "error",
237
+ "question",
238
+ "user",
239
+ "user-add",
240
+ "user-group",
241
+ "logout",
242
+ "login",
243
+ "file",
244
+ "folder",
245
+ "folder-open",
246
+ "document",
247
+ "image",
248
+ "video",
249
+ "music",
250
+ "camera",
251
+ "mail",
252
+ "phone",
253
+ "chat",
254
+ "bell",
255
+ "message",
256
+ "eye",
257
+ "eye-off",
258
+ "calendar",
259
+ "clock",
260
+ "history",
261
+ "timer",
262
+ "location",
263
+ "map",
264
+ "globe",
265
+ "star",
266
+ "heart",
267
+ "thumb-up",
268
+ "link",
269
+ "external-link",
270
+ "lock",
271
+ "unlock",
272
+ "key",
273
+ "home",
274
+ "menu",
275
+ "menu-fold",
276
+ "menu-unfold",
277
+ "sidebar-fold",
278
+ "sidebar-expand",
279
+ "sidebar-left",
280
+ "dashboard",
281
+ "chart",
282
+ "chart-pie",
283
+ "chart-line",
284
+ "report",
285
+ "analytics",
286
+ "system",
287
+ "permission",
288
+ "role",
289
+ "user-manage",
290
+ "log",
291
+ "notification",
292
+ "app",
293
+ "list",
294
+ "grid",
295
+ "fullscreen",
296
+ "fullscreen-exit",
297
+ "zoom-in",
298
+ "zoom-out",
299
+ "print",
300
+ "bookmark",
301
+ "tag",
302
+ "code",
303
+ "terminal",
304
+ "database",
305
+ "server",
306
+ "cloud",
307
+ "gift",
308
+ "moon",
309
+ "sun",
310
+ "theme",
311
+ "skin"
312
+ ]), s = (d) => {
313
+ if (!d || d === "") return "";
314
+ if (d.startsWith("tineco-icon-")) {
315
+ const _ = d.replace("tineco-icon-", "");
316
+ return {
317
+ home: "home",
318
+ dashboard: "dashboard",
319
+ system: "system",
320
+ user: "user",
321
+ role: "role",
322
+ menu: "list",
323
+ setting: "setting",
324
+ file: "file",
325
+ folder: "folder",
326
+ chart: "chart",
327
+ report: "report",
328
+ analytics: "analytics"
329
+ }[_] || _;
330
+ }
331
+ return {
332
+ dashboard: "dashboard",
333
+ system: "system",
334
+ user: "user",
335
+ role: "role",
336
+ menu: "list",
337
+ setting: "setting",
338
+ home: "home",
339
+ chart: "chart",
340
+ report: "report",
341
+ analytics: "analytics",
342
+ permission: "permission",
343
+ log: "log",
344
+ notification: "notification",
345
+ app: "app",
346
+ list: "list",
347
+ grid: "grid"
348
+ }[d] || d;
349
+ }, o = (d) => d ? d.charAt(0) : "", i = (d) => u.has(d), h = b(() => r.menu.menuId || r.menu.menuCode || r.menu.menuUrl || ""), v = b(() => r.menu.children && r.menu.children.length > 0);
350
+ return (d, f) => {
351
+ const _ = rt("SidebarMenuItem", !0);
352
+ return v.value ? (a(), O(n(Re), {
353
+ key: 0,
354
+ index: h.value
355
+ }, {
356
+ title: M(() => [
357
+ e("span", At, [
358
+ e("span", Dt, [
359
+ i(s(t.menu.icon)) ? (a(), O(n(z), {
360
+ key: 0,
361
+ name: s(t.menu.icon),
362
+ size: 16
363
+ }, null, 8, ["name"])) : (a(), c("span", Vt, x(o(t.menu.menuName)), 1))
364
+ ]),
365
+ e("span", Ot, x(t.menu.menuName), 1)
366
+ ])
367
+ ]),
368
+ default: M(() => [
369
+ (a(!0), c(K, null, X(t.menu.children, (g) => (a(), O(_, {
370
+ key: g.menuId || g.menuCode || g.menuUrl,
371
+ menu: g
372
+ }, null, 8, ["menu"]))), 128))
373
+ ]),
374
+ _: 1
375
+ }, 8, ["index"])) : (a(), O(n(Se), {
376
+ key: 1,
377
+ index: t.menu.menuUrl || h.value
378
+ }, {
379
+ default: M(() => [
380
+ e("span", Bt, [
381
+ t.menu.menuName !== "首页" ? (a(), c("span", Rt, [
382
+ i(s(t.menu.icon)) ? (a(), O(n(z), {
383
+ key: 0,
384
+ name: s(t.menu.icon),
385
+ size: 16
386
+ }, null, 8, ["name"])) : (a(), c("span", Ft, x(o(t.menu.menuName)), 1))
387
+ ])) : P("", !0),
388
+ e("span", Kt, x(t.menu.menuName), 1)
389
+ ])
390
+ ]),
391
+ _: 1
392
+ }, 8, ["index"]));
393
+ };
394
+ }
395
+ }), re = (t, r) => {
396
+ const u = t.__vccOpts || t;
397
+ for (const [s, o] of r)
398
+ u[s] = o;
399
+ return u;
400
+ }, Wt = /* @__PURE__ */ re(jt, [["__scopeId", "data-v-f5865e28"]]), qt = {
401
+ key: 0,
402
+ class: "sidebar__logo"
403
+ }, Ht = ["src"], Yt = {
404
+ key: 1,
405
+ class: "sidebar__user"
406
+ }, Gt = { class: "sidebar__user-info" }, Xt = { class: "sidebar__user-name" }, Jt = { class: "sidebar__user-role" }, Oe = "sidebar_opened_menus", Be = "sidebar_menu_list_key", Zt = /* @__PURE__ */ ne({
407
+ __name: "Sidebar",
408
+ props: {
409
+ menuList: { default: () => [] },
410
+ showLogo: { type: Boolean, default: !0 },
411
+ showUser: { type: Boolean, default: !0 },
412
+ logoSrc: { default: "/vite.svg" }
413
+ },
414
+ setup(t) {
415
+ const r = t, u = be(), s = me(), o = de(), i = le(), h = Ue(), v = ue(), d = b(() => r.menuList.length > 0 ? r.menuList : o.menuList), f = b(() => v.isCollapsed), _ = b(() => u.path), g = (E) => E.menuId || E.menuCode || E.menuUrl || "", m = () => d.value.map(g).join(","), j = I.get(Be) || "", D = m(), W = j === D ? I.get(Oe) || [] : [], V = y(W);
416
+ ye(V, (E) => {
417
+ I.set(Oe, E), I.set(Be, m());
418
+ }, { deep: !0 });
419
+ const B = (E, N, A = []) => {
420
+ var G;
421
+ for (const F of E) {
422
+ if (F.menuUrl && (N === F.menuUrl || N.startsWith(F.menuUrl + "/")))
423
+ return [...A, g(F)];
424
+ if ((G = F.children) != null && G.length) {
425
+ const se = B(F.children, N, [...A, g(F)]);
426
+ if (se) return se;
427
+ }
428
+ }
429
+ return null;
430
+ };
431
+ ye([() => u.path, d], ([E, N]) => {
432
+ if (N.length > 0) {
433
+ const A = B(N, E);
434
+ if (A) {
435
+ const G = A.slice(0, -1), F = /* @__PURE__ */ new Set([...V.value, ...G]);
436
+ V.value = Array.from(F);
437
+ }
438
+ }
439
+ }, { immediate: !0 }), ye(d, (E, N) => {
440
+ E !== N && (V.value = [], I.set(Oe, []), I.set(Be, m()));
441
+ }, { immediate: !1 });
442
+ const H = b(() => v.isDark ? "#1d1e1f" : "#fff"), Z = b(() => v.isDark ? "#cfd3dc" : "#303133"), Y = b(() => "#409eff"), q = (E) => {
443
+ E && E !== u.path && s.push(E);
444
+ }, ee = () => {
445
+ h.logout(), i.clearUserInfo(), o.clearMenu(), s.push(v.loginPath);
446
+ };
447
+ return (E, N) => (a(), c("div", {
448
+ class: J(["sidebar", { "sidebar--collapsed": f.value }])
449
+ }, [
450
+ r.showLogo ? (a(), c("div", qt, [
451
+ e("img", {
452
+ src: r.logoSrc,
453
+ alt: "Logo",
454
+ class: "sidebar__logo-img"
455
+ }, null, 8, Ht),
456
+ Te(e("span", { class: "sidebar__logo-text" }, x(n(v).appName), 513), [
457
+ [bt, !f.value]
458
+ ])
459
+ ])) : P("", !0),
460
+ k(n(Ge), {
461
+ modelValue: _.value,
462
+ "onUpdate:modelValue": N[0] || (N[0] = (A) => _.value = A),
463
+ openeds: V.value,
464
+ "onUpdate:openeds": N[1] || (N[1] = (A) => V.value = A),
465
+ mode: "vertical",
466
+ collapse: f.value,
467
+ "collapse-transition": !1,
468
+ "background-color": H.value,
469
+ "text-color": Z.value,
470
+ "active-text-color": Y.value,
471
+ class: "sidebar__menu",
472
+ onSelect: q
473
+ }, {
474
+ default: M(() => [
475
+ (a(!0), c(K, null, X(d.value, (A) => (a(), O(Wt, {
476
+ key: g(A),
477
+ menu: A
478
+ }, null, 8, ["menu"]))), 128))
479
+ ]),
480
+ _: 1
481
+ }, 8, ["modelValue", "openeds", "collapse", "background-color", "text-color", "active-text-color"]),
482
+ r.showUser && !f.value ? (a(), c("div", Yt, [
483
+ e("div", Gt, [
484
+ e("span", Xt, x(n(i).userName), 1),
485
+ e("span", Jt, x(n(i).departmentName), 1)
486
+ ]),
487
+ k(n(we), {
488
+ type: "text",
489
+ size: "small",
490
+ onClick: ee
491
+ }, {
492
+ default: M(() => [...N[2] || (N[2] = [
493
+ he("退出", -1)
494
+ ])]),
495
+ _: 1
496
+ })
497
+ ])) : P("", !0)
498
+ ], 2));
499
+ }
500
+ }), tt = /* @__PURE__ */ re(Zt, [["__scopeId", "data-v-2ecab012"]]), Qt = { class: "header" }, es = { class: "header__left" }, ts = {
501
+ key: 0,
502
+ class: "header__breadcrumb"
503
+ }, ss = {
504
+ key: 0,
505
+ class: "breadcrumb-separator"
506
+ }, os = { class: "header__right" }, as = {
507
+ key: 0,
508
+ class: "header__search-dropdown"
509
+ }, ns = {
510
+ key: 0,
511
+ class: "header__search-results"
512
+ }, ls = ["onClick"], rs = {
513
+ key: 0,
514
+ class: "header__search-icon"
515
+ }, is = {
516
+ key: 1,
517
+ class: "header__search-char"
518
+ }, cs = { class: "header__search-item-title" }, us = {
519
+ key: 1,
520
+ class: "header__search-item-parent"
521
+ }, ds = {
522
+ key: 1,
523
+ class: "header__search-empty"
524
+ }, ms = ["title"], ps = { class: "header__avatar" }, vs = { class: "header__user-name" }, hs = {
525
+ key: 0,
526
+ class: "header__dropdown"
527
+ }, _s = { class: "header__dropdown-header" }, fs = { class: "header__dropdown-avatar" }, gs = { class: "header__dropdown-info" }, ys = { class: "header__dropdown-name" }, ks = { class: "header__dropdown-role" }, ws = { class: "header__dropdown-menu" }, bs = { class: "settings-drawer" }, xs = { class: "settings-section" }, Cs = { class: "settings-layout-options" }, $s = ["onClick"], Ls = { class: "layout-option__preview" }, Ms = {
528
+ key: 0,
529
+ class: "layout-preview-sidebar"
530
+ }, Ss = {
531
+ key: 1,
532
+ class: "layout-preview-top"
533
+ }, Ns = {
534
+ key: 2,
535
+ class: "layout-preview-mix"
536
+ }, Is = { class: "layout-option__label" }, Us = { class: "settings-section" }, zs = { class: "settings-color-options" }, Ts = ["title", "onClick"], Es = { class: "settings-section" }, Ps = { class: "settings-switch-list" }, As = { class: "settings-switch-item" }, Ds = { class: "settings-switch-item" }, Vs = /* @__PURE__ */ ne({
537
+ __name: "Header",
538
+ setup(t) {
539
+ const r = be(), u = me(), s = ue(), o = le(), i = Ue(), h = de(), v = y(!1), d = y(!1), f = y(null), _ = y(!1), g = y(!1), m = y(""), j = y(null), D = y(!1), W = [
540
+ { value: "sidebar", label: "左侧菜单", icon: "sidebar-left" },
541
+ { value: "top", label: "顶部菜单", icon: "menu" },
542
+ { value: "mix", label: "混合菜单", icon: "grid" }
543
+ ], V = [
544
+ { value: "#409eff", label: "默认蓝" },
545
+ { value: "#1890ff", label: "科技蓝" },
546
+ { value: "#52c41a", label: "极光绿" },
547
+ { value: "#faad14", label: "日落橙" },
548
+ { value: "#f5222d", label: "薄暮红" },
549
+ { value: "#722ed1", label: "酱紫" }
550
+ ], B = b(() => r.matched.filter((w) => w.meta && w.meta.title).map((w) => ({
551
+ title: w.meta.title,
552
+ path: w.path
553
+ }))), H = (T, w = "") => {
554
+ const Q = [];
555
+ return T.forEach((C) => {
556
+ C.children && C.children.length > 0 ? Q.push(...H(C.children, C.menuName)) : Q.push({ ...C, parentTitle: w, title: C.menuName, path: C.menuUrl });
557
+ }), Q;
558
+ }, Z = /* @__PURE__ */ new Set([
559
+ "arrow-up",
560
+ "arrow-down",
561
+ "arrow-left",
562
+ "arrow-right",
563
+ "caret-down",
564
+ "caret-right",
565
+ "plus",
566
+ "minus",
567
+ "close",
568
+ "check",
569
+ "edit",
570
+ "delete",
571
+ "copy",
572
+ "download",
573
+ "upload",
574
+ "refresh",
575
+ "search",
576
+ "filter",
577
+ "more",
578
+ "setting",
579
+ "share",
580
+ "loading",
581
+ "info",
582
+ "success",
583
+ "warning",
584
+ "error",
585
+ "question",
586
+ "user",
587
+ "user-add",
588
+ "user-group",
589
+ "logout",
590
+ "login",
591
+ "file",
592
+ "folder",
593
+ "folder-open",
594
+ "document",
595
+ "image",
596
+ "video",
597
+ "music",
598
+ "camera",
599
+ "mail",
600
+ "phone",
601
+ "chat",
602
+ "bell",
603
+ "message",
604
+ "eye",
605
+ "eye-off",
606
+ "calendar",
607
+ "clock",
608
+ "history",
609
+ "timer",
610
+ "location",
611
+ "map",
612
+ "globe",
613
+ "star",
614
+ "heart",
615
+ "thumb-up",
616
+ "link",
617
+ "external-link",
618
+ "lock",
619
+ "unlock",
620
+ "key",
621
+ "home",
622
+ "menu",
623
+ "menu-fold",
624
+ "menu-unfold",
625
+ "sidebar-fold",
626
+ "sidebar-expand",
627
+ "sidebar-left",
628
+ "dashboard",
629
+ "chart",
630
+ "chart-pie",
631
+ "chart-line",
632
+ "report",
633
+ "analytics",
634
+ "system",
635
+ "permission",
636
+ "role",
637
+ "user-manage",
638
+ "log",
639
+ "notification",
640
+ "app",
641
+ "list",
642
+ "grid",
643
+ "fullscreen",
644
+ "fullscreen-exit",
645
+ "zoom-in",
646
+ "zoom-out",
647
+ "print",
648
+ "bookmark",
649
+ "tag",
650
+ "code",
651
+ "terminal",
652
+ "database",
653
+ "server",
654
+ "cloud",
655
+ "gift",
656
+ "moon",
657
+ "sun",
658
+ "theme",
659
+ "skin"
660
+ ]), Y = (T) => {
661
+ if (!T || T === "") return "";
662
+ if (T.startsWith("tineco-icon-")) {
663
+ const Q = T.replace("tineco-icon-", "");
664
+ return {
665
+ home: "home",
666
+ dashboard: "dashboard",
667
+ system: "system",
668
+ user: "user",
669
+ role: "role",
670
+ menu: "list",
671
+ setting: "setting",
672
+ file: "file",
673
+ folder: "folder",
674
+ chart: "chart",
675
+ report: "report",
676
+ analytics: "analytics"
677
+ }[Q] || Q;
678
+ }
679
+ return {
680
+ dashboard: "dashboard",
681
+ system: "system",
682
+ user: "user",
683
+ role: "role",
684
+ menu: "list",
685
+ setting: "setting",
686
+ home: "home",
687
+ chart: "chart",
688
+ report: "report",
689
+ analytics: "analytics",
690
+ permission: "permission",
691
+ log: "log",
692
+ notification: "notification",
693
+ app: "app",
694
+ list: "list",
695
+ grid: "grid"
696
+ }[T] || T;
697
+ }, q = (T) => T ? T.charAt(0) : "", ee = (T) => Z.has(T), E = b(() => m.value.trim() ? H(h.menuList).filter(
698
+ (w) => w.title.toLowerCase().includes(m.value.toLowerCase())
699
+ ) : []), N = b(() => s.layout), A = () => {
700
+ s.toggleCollapse();
701
+ }, G = () => {
702
+ s.toggleTheme();
703
+ }, F = () => {
704
+ d.value = !0;
705
+ }, se = (T) => {
706
+ s.setLayout(T), d.value = !1;
707
+ }, ie = (T) => {
708
+ D.value = T;
709
+ const w = document.documentElement;
710
+ T ? w.classList.add("grey-mode") : w.classList.remove("grey-mode");
711
+ }, pe = () => {
712
+ ie(!D.value), d.value = !1;
713
+ }, U = () => {
714
+ s.toggleTheme(), d.value = !1;
715
+ }, oe = () => {
716
+ document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen();
717
+ }, _e = () => {
718
+ _.value = !!document.fullscreenElement;
719
+ }, ce = () => {
720
+ v.value = !v.value;
721
+ }, ae = () => {
722
+ v.value = !1;
723
+ }, ve = () => {
724
+ g.value = !1, m.value = "";
725
+ }, xe = (T) => {
726
+ u.push(T), ve();
727
+ }, Ce = (T) => {
728
+ s.setPrimaryColor(T), d.value = !1;
729
+ }, $e = () => {
730
+ ae(), u.push("/profile");
731
+ }, Le = () => {
732
+ ae(), u.push("/change-password");
733
+ }, Me = () => {
734
+ ae(), i.logout(), o.clearUserInfo(), h.clearMenu(), u.push(s.loginPath);
735
+ }, fe = (T) => {
736
+ f.value && !f.value.contains(T.target) && ae(), j.value && !j.value.contains(T.target) && ve();
737
+ }, ge = (T) => {
738
+ T.key === "Escape" && (ve(), ae());
739
+ };
740
+ return Ke(() => {
741
+ document.addEventListener("click", fe), document.addEventListener("fullscreenchange", _e), document.addEventListener("keydown", ge), s.initTheme(), D.value = document.documentElement.classList.contains("grey-mode");
742
+ }), je(() => {
743
+ document.removeEventListener("click", fe), document.removeEventListener("fullscreenchange", _e), document.removeEventListener("keydown", ge);
744
+ }), (T, w) => {
745
+ var Q;
746
+ return a(), c("div", Qt, [
747
+ e("div", es, [
748
+ e("div", {
749
+ class: "header__collapse",
750
+ onClick: A
751
+ }, [
752
+ k(n(z), {
753
+ name: n(s).isCollapsed ? "menu-unfold" : "menu-fold",
754
+ size: 18
755
+ }, null, 8, ["name"])
756
+ ]),
757
+ n(s).showBreadcrumb ? (a(), c("div", ts, [
758
+ (a(!0), c(K, null, X(B.value, (C, S) => (a(), c("span", {
759
+ key: C.path
760
+ }, [
761
+ S > 0 ? (a(), c("span", ss, "/")) : P("", !0),
762
+ e("span", {
763
+ class: J({ "is-current": S === B.value.length - 1 })
764
+ }, x(C.title), 3)
765
+ ]))), 128))
766
+ ])) : P("", !0)
767
+ ]),
768
+ e("div", os, [
769
+ e("div", {
770
+ class: "header__search",
771
+ ref_key: "searchRef",
772
+ ref: j
773
+ }, [
774
+ k(n(z), {
775
+ name: "search",
776
+ size: 14,
777
+ class: "header__search-icon"
778
+ }),
779
+ Te(e("input", {
780
+ "onUpdate:modelValue": w[0] || (w[0] = (C) => m.value = C),
781
+ type: "text",
782
+ class: "header__search-input",
783
+ placeholder: "搜索菜单...",
784
+ onFocus: w[1] || (w[1] = (C) => g.value = !0)
785
+ }, null, 544), [
786
+ [We, m.value]
787
+ ]),
788
+ k(ke, { name: "search-dropdown" }, {
789
+ default: M(() => [
790
+ g.value && (E.value.length > 0 || m.value) ? (a(), c("div", as, [
791
+ E.value.length > 0 ? (a(), c("div", ns, [
792
+ (a(!0), c(K, null, X(E.value, (C) => (a(), c("div", {
793
+ key: C.path,
794
+ class: "header__search-item",
795
+ onClick: (S) => xe(C.path)
796
+ }, [
797
+ C.title !== "首页" ? (a(), c("span", rs, [
798
+ ee(Y(C.icon)) ? (a(), O(n(z), {
799
+ key: 0,
800
+ name: Y(C.icon),
801
+ size: 16
802
+ }, null, 8, ["name"])) : (a(), c("span", is, x(q(C.title)), 1))
803
+ ])) : P("", !0),
804
+ e("span", cs, x(C.title), 1),
805
+ C.parentTitle ? (a(), c("span", us, x(C.parentTitle), 1)) : P("", !0)
806
+ ], 8, ls))), 128))
807
+ ])) : (a(), c("div", ds, " 未找到匹配的菜单 "))
808
+ ])) : P("", !0)
809
+ ]),
810
+ _: 1
811
+ })
812
+ ], 512),
813
+ e("div", {
814
+ class: "header__action",
815
+ onClick: oe,
816
+ title: _.value ? "退出全屏" : "全屏"
817
+ }, [
818
+ k(n(z), {
819
+ name: _.value ? "fullscreen-exit" : "fullscreen",
820
+ size: 16
821
+ }, null, 8, ["name"])
822
+ ], 8, ms),
823
+ e("div", {
824
+ class: "header__action",
825
+ onClick: F,
826
+ title: "换肤设置"
827
+ }, [
828
+ k(n(z), {
829
+ name: "skin",
830
+ size: 16
831
+ })
832
+ ]),
833
+ e("div", {
834
+ class: "header__action",
835
+ onClick: G,
836
+ title: "切换主题"
837
+ }, [
838
+ k(n(z), {
839
+ name: n(s).isDark ? "sun" : "moon",
840
+ size: 16
841
+ }, null, 8, ["name"])
842
+ ]),
843
+ e("div", {
844
+ class: "header__user",
845
+ ref_key: "dropdownRef",
846
+ ref: f
847
+ }, [
848
+ e("div", {
849
+ class: "header__user-trigger",
850
+ onClick: Ee(ce, ["stop"])
851
+ }, [
852
+ e("div", ps, [
853
+ e("span", null, x(((Q = n(o).userName) == null ? void 0 : Q.charAt(0)) || "U"), 1)
854
+ ]),
855
+ e("span", vs, x(n(o).userName), 1),
856
+ e("span", {
857
+ class: J(["header__user-arrow", { "is-active": v.value }])
858
+ }, "▼", 2)
859
+ ]),
860
+ k(ke, { name: "dropdown" }, {
861
+ default: M(() => {
862
+ var C;
863
+ return [
864
+ v.value ? (a(), c("div", hs, [
865
+ e("div", _s, [
866
+ e("div", fs, [
867
+ e("span", null, x(((C = n(o).userName) == null ? void 0 : C.charAt(0)) || "U"), 1)
868
+ ]),
869
+ e("div", gs, [
870
+ e("div", ys, x(n(o).userName), 1),
871
+ e("div", ks, x(n(o).roleName || n(o).departmentName), 1)
872
+ ])
873
+ ]),
874
+ w[7] || (w[7] = e("div", { class: "header__dropdown-divider" }, null, -1)),
875
+ e("div", ws, [
876
+ e("div", {
877
+ class: "header__dropdown-item",
878
+ onClick: $e
879
+ }, [
880
+ k(n(z), {
881
+ name: "user",
882
+ size: 16
883
+ }),
884
+ w[3] || (w[3] = e("span", null, "个人信息", -1))
885
+ ]),
886
+ e("div", {
887
+ class: "header__dropdown-item",
888
+ onClick: Le
889
+ }, [
890
+ k(n(z), {
891
+ name: "lock",
892
+ size: 16
893
+ }),
894
+ w[4] || (w[4] = e("span", null, "修改密码", -1))
895
+ ]),
896
+ w[6] || (w[6] = e("div", { class: "header__dropdown-divider" }, null, -1)),
897
+ e("div", {
898
+ class: "header__dropdown-item header__dropdown-item--danger",
899
+ onClick: Me
900
+ }, [
901
+ k(n(z), {
902
+ name: "logout",
903
+ size: 16
904
+ }),
905
+ w[5] || (w[5] = e("span", null, "退出登录", -1))
906
+ ])
907
+ ])
908
+ ])) : P("", !0)
909
+ ];
910
+ }),
911
+ _: 1
912
+ })
913
+ ], 512)
914
+ ]),
915
+ k(n(Xe), {
916
+ modelValue: d.value,
917
+ "onUpdate:modelValue": w[2] || (w[2] = (C) => d.value = C),
918
+ title: "换肤设置",
919
+ direction: "rtl",
920
+ size: "320px"
921
+ }, {
922
+ default: M(() => [
923
+ e("div", bs, [
924
+ e("div", xs, [
925
+ w[11] || (w[11] = e("div", { class: "settings-title" }, "布局模式", -1)),
926
+ e("div", Cs, [
927
+ (a(), c(K, null, X(W, (C) => e("div", {
928
+ key: C.value,
929
+ class: J(["layout-option", { "is-active": N.value === C.value }]),
930
+ onClick: (S) => se(C.value)
931
+ }, [
932
+ e("div", Ls, [
933
+ C.value === "sidebar" ? (a(), c("div", Ms, [...w[8] || (w[8] = [
934
+ e("div", { class: "preview-aside" }, null, -1),
935
+ e("div", { class: "preview-main" }, [
936
+ e("div", { class: "preview-header" }),
937
+ e("div", { class: "preview-content" })
938
+ ], -1)
939
+ ])])) : C.value === "top" ? (a(), c("div", Ss, [...w[9] || (w[9] = [
940
+ e("div", { class: "preview-header-full" }, null, -1),
941
+ e("div", { class: "preview-content-full" }, null, -1)
942
+ ])])) : (a(), c("div", Ns, [...w[10] || (w[10] = [
943
+ e("div", { class: "preview-header-mix" }, [
944
+ e("div", { class: "preview-mix-left" })
945
+ ], -1),
946
+ e("div", { class: "preview-mix-body" }, [
947
+ e("div", { class: "preview-mix-aside" }),
948
+ e("div", { class: "preview-mix-content" })
949
+ ], -1)
950
+ ])]))
951
+ ]),
952
+ e("span", Is, x(C.label), 1)
953
+ ], 10, $s)), 64))
954
+ ])
955
+ ]),
956
+ e("div", Us, [
957
+ w[12] || (w[12] = e("div", { class: "settings-title" }, "主题色", -1)),
958
+ e("div", zs, [
959
+ (a(), c(K, null, X(V, (C) => e("div", {
960
+ key: C.value,
961
+ class: J(["color-option", { "is-active": n(s).primaryColor === C.value }]),
962
+ style: Ne({ backgroundColor: C.value }),
963
+ title: C.label,
964
+ onClick: (S) => Ce(C.value)
965
+ }, [
966
+ n(s).primaryColor === C.value ? (a(), O(n(z), {
967
+ key: 0,
968
+ name: "check",
969
+ size: 12,
970
+ color: "#fff"
971
+ })) : P("", !0)
972
+ ], 14, Ts)), 64))
973
+ ])
974
+ ]),
975
+ e("div", Es, [
976
+ w[17] || (w[17] = e("div", { class: "settings-title" }, "功能设置", -1)),
977
+ e("div", Ps, [
978
+ e("div", As, [
979
+ w[14] || (w[14] = e("span", null, "灰色模式", -1)),
980
+ e("div", {
981
+ class: J(["switch-wrapper", { "is-checked": D.value }]),
982
+ onClick: pe
983
+ }, [...w[13] || (w[13] = [
984
+ e("span", { class: "switch-core" }, null, -1)
985
+ ])], 2)
986
+ ]),
987
+ e("div", Ds, [
988
+ w[16] || (w[16] = e("span", null, "暗黑模式", -1)),
989
+ e("div", {
990
+ class: J(["switch-wrapper", { "is-checked": n(s).isDark }]),
991
+ onClick: U
992
+ }, [...w[15] || (w[15] = [
993
+ e("span", { class: "switch-core" }, null, -1)
994
+ ])], 2)
995
+ ])
996
+ ])
997
+ ])
998
+ ])
999
+ ]),
1000
+ _: 1
1001
+ }, 8, ["modelValue"])
1002
+ ]);
1003
+ };
1004
+ }
1005
+ }), Os = /* @__PURE__ */ re(Vs, [["__scopeId", "data-v-9ff678f3"]]), Bs = { class: "top-menu" }, Rs = { class: "top-menu__logo" }, Fs = ["src"], Ks = { class: "top-menu__logo-text" }, js = { class: "top-menu__menu-content" }, Ws = {
1006
+ key: 0,
1007
+ class: "top-menu__menu-icon"
1008
+ }, qs = {
1009
+ key: 1,
1010
+ class: "top-menu__menu-char"
1011
+ }, Hs = { class: "top-menu__menu-text" }, Ys = { class: "top-menu__menu-content" }, Gs = { class: "top-menu__menu-icon" }, Xs = {
1012
+ key: 1,
1013
+ class: "top-menu__menu-char"
1014
+ }, Js = { class: "top-menu__menu-text" }, Zs = { class: "top-menu__menu-content" }, Qs = { class: "top-menu__menu-icon" }, eo = {
1015
+ key: 1,
1016
+ class: "top-menu__menu-char"
1017
+ }, to = { class: "top-menu__menu-text" }, so = { class: "top-menu__menu-content" }, oo = { class: "top-menu__menu-icon" }, ao = {
1018
+ key: 1,
1019
+ class: "top-menu__menu-char"
1020
+ }, no = { class: "top-menu__menu-text" }, lo = { class: "top-menu__menu-content" }, ro = {
1021
+ key: 0,
1022
+ class: "top-menu__menu-icon"
1023
+ }, io = {
1024
+ key: 1,
1025
+ class: "top-menu__menu-char"
1026
+ }, co = { class: "top-menu__menu-text" }, uo = { class: "top-menu__actions" }, mo = {
1027
+ key: 0,
1028
+ class: "top-menu__search-dropdown"
1029
+ }, po = {
1030
+ key: 0,
1031
+ class: "top-menu__search-results"
1032
+ }, vo = ["onClick"], ho = {
1033
+ key: 0,
1034
+ class: "top-menu__search-icon-item"
1035
+ }, _o = {
1036
+ key: 1,
1037
+ class: "top-menu__search-char"
1038
+ }, fo = { class: "top-menu__search-item-title" }, go = {
1039
+ key: 1,
1040
+ class: "top-menu__search-item-parent"
1041
+ }, yo = {
1042
+ key: 1,
1043
+ class: "top-menu__search-empty"
1044
+ }, ko = ["title"], wo = { class: "top-menu__avatar" }, bo = { class: "top-menu__user-name" }, xo = {
1045
+ key: 0,
1046
+ class: "top-menu__dropdown"
1047
+ }, Co = { class: "top-menu__dropdown-header" }, $o = { class: "top-menu__dropdown-avatar" }, Lo = { class: "top-menu__dropdown-info" }, Mo = { class: "top-menu__dropdown-name" }, So = { class: "top-menu__dropdown-role" }, No = { class: "top-menu__dropdown-menu" }, Io = { class: "settings-drawer" }, Uo = { class: "settings-section" }, zo = { class: "settings-layout-options" }, To = ["onClick"], Eo = { class: "layout-option__preview" }, Po = {
1048
+ key: 0,
1049
+ class: "layout-preview-sidebar"
1050
+ }, Ao = {
1051
+ key: 1,
1052
+ class: "layout-preview-top"
1053
+ }, Do = {
1054
+ key: 2,
1055
+ class: "layout-preview-mix"
1056
+ }, Vo = { class: "layout-option__label" }, Oo = { class: "settings-section" }, Bo = { class: "settings-color-options" }, Ro = ["title", "onClick"], Fo = { class: "settings-section" }, Ko = { class: "settings-switch-list" }, jo = { class: "settings-switch-item" }, Wo = { class: "settings-switch-item" }, qo = /* @__PURE__ */ ne({
1057
+ __name: "TopMenu",
1058
+ props: {
1059
+ logoSrc: { default: "/vite.svg" }
1060
+ },
1061
+ setup(t) {
1062
+ const r = t, u = be(), s = me(), o = de(), i = ue(), h = le(), v = Ue(), d = b(() => u.path), f = (S, L = "") => {
1063
+ const te = [];
1064
+ return S.forEach((l) => {
1065
+ l.children && l.children.length > 0 ? te.push(...f(l.children, l.menuName)) : te.push({ ...l, parentTitle: L, title: l.menuName, path: l.menuUrl });
1066
+ }), te;
1067
+ }, _ = b(() => Y.value.trim() ? f(o.menuList).filter(
1068
+ (L) => L.title.toLowerCase().includes(Y.value.toLowerCase())
1069
+ ) : []), g = b(() => i.isDark ? "#1d1e1f" : "#fff"), m = b(() => i.isDark ? "#cfd3dc" : "#303133"), j = b(() => "#409eff"), D = y(!1), W = y(null), V = y(!1), B = y(!1), H = y(!1), Z = y(!1), Y = y(""), q = y(null), ee = (S) => {
1070
+ S && S !== u.path && s.push(S);
1071
+ }, E = /* @__PURE__ */ new Set([
1072
+ "arrow-up",
1073
+ "arrow-down",
1074
+ "arrow-left",
1075
+ "arrow-right",
1076
+ "caret-down",
1077
+ "caret-right",
1078
+ "plus",
1079
+ "minus",
1080
+ "close",
1081
+ "check",
1082
+ "edit",
1083
+ "delete",
1084
+ "copy",
1085
+ "download",
1086
+ "upload",
1087
+ "refresh",
1088
+ "search",
1089
+ "filter",
1090
+ "more",
1091
+ "setting",
1092
+ "share",
1093
+ "loading",
1094
+ "info",
1095
+ "success",
1096
+ "warning",
1097
+ "error",
1098
+ "question",
1099
+ "user",
1100
+ "user-add",
1101
+ "user-group",
1102
+ "logout",
1103
+ "login",
1104
+ "file",
1105
+ "folder",
1106
+ "folder-open",
1107
+ "document",
1108
+ "image",
1109
+ "video",
1110
+ "music",
1111
+ "camera",
1112
+ "mail",
1113
+ "phone",
1114
+ "chat",
1115
+ "bell",
1116
+ "message",
1117
+ "eye",
1118
+ "eye-off",
1119
+ "calendar",
1120
+ "clock",
1121
+ "history",
1122
+ "timer",
1123
+ "location",
1124
+ "map",
1125
+ "globe",
1126
+ "star",
1127
+ "heart",
1128
+ "thumb-up",
1129
+ "link",
1130
+ "external-link",
1131
+ "lock",
1132
+ "unlock",
1133
+ "key",
1134
+ "home",
1135
+ "menu",
1136
+ "menu-fold",
1137
+ "menu-unfold",
1138
+ "sidebar-fold",
1139
+ "sidebar-expand",
1140
+ "sidebar-left",
1141
+ "dashboard",
1142
+ "chart",
1143
+ "chart-pie",
1144
+ "chart-line",
1145
+ "report",
1146
+ "analytics",
1147
+ "system",
1148
+ "permission",
1149
+ "role",
1150
+ "user-manage",
1151
+ "log",
1152
+ "notification",
1153
+ "app",
1154
+ "list",
1155
+ "grid",
1156
+ "fullscreen",
1157
+ "fullscreen-exit",
1158
+ "zoom-in",
1159
+ "zoom-out",
1160
+ "print",
1161
+ "bookmark",
1162
+ "tag",
1163
+ "code",
1164
+ "terminal",
1165
+ "database",
1166
+ "server",
1167
+ "cloud",
1168
+ "gift",
1169
+ "moon",
1170
+ "sun",
1171
+ "theme",
1172
+ "skin"
1173
+ ]), N = (S) => {
1174
+ if (!S || S === "") return "";
1175
+ if (S.startsWith("tineco-icon-")) {
1176
+ const te = S.replace("tineco-icon-", "");
1177
+ return {
1178
+ home: "home",
1179
+ dashboard: "dashboard",
1180
+ system: "system",
1181
+ user: "user",
1182
+ role: "role",
1183
+ menu: "list",
1184
+ setting: "setting",
1185
+ file: "file",
1186
+ folder: "folder",
1187
+ chart: "chart",
1188
+ report: "report",
1189
+ analytics: "analytics"
1190
+ }[te] || te;
1191
+ }
1192
+ return {
1193
+ dashboard: "dashboard",
1194
+ system: "system",
1195
+ user: "user",
1196
+ role: "role",
1197
+ menu: "list",
1198
+ setting: "setting",
1199
+ home: "home",
1200
+ chart: "chart",
1201
+ report: "report",
1202
+ analytics: "analytics",
1203
+ permission: "permission",
1204
+ log: "log",
1205
+ notification: "notification",
1206
+ app: "app",
1207
+ list: "list",
1208
+ grid: "grid"
1209
+ }[S] || S;
1210
+ }, A = (S) => S ? S.charAt(0) : "", G = (S) => E.has(S), F = () => {
1211
+ i.toggleTheme(), B.value = !1;
1212
+ }, se = () => {
1213
+ document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen();
1214
+ }, ie = () => {
1215
+ V.value = !!document.fullscreenElement;
1216
+ }, pe = () => {
1217
+ D.value = !D.value;
1218
+ }, U = () => {
1219
+ D.value = !1;
1220
+ }, oe = () => {
1221
+ Z.value = !1, Y.value = "";
1222
+ }, _e = (S) => {
1223
+ s.push(S), oe();
1224
+ }, ce = () => {
1225
+ B.value = !0;
1226
+ }, ae = (S) => {
1227
+ H.value = S;
1228
+ const L = document.documentElement;
1229
+ S ? L.classList.add("grey-mode") : L.classList.remove("grey-mode");
1230
+ }, ve = () => {
1231
+ ae(!H.value), B.value = !1;
1232
+ }, xe = () => {
1233
+ i.toggleTheme(), B.value = !1;
1234
+ }, Ce = [
1235
+ { value: "sidebar", label: "左侧菜单", icon: "sidebar-left" },
1236
+ { value: "top", label: "顶部菜单", icon: "menu" },
1237
+ { value: "mix", label: "混合菜单", icon: "grid" }
1238
+ ], $e = b(() => i.layout), Le = (S) => {
1239
+ i.setLayout(S), B.value = !1;
1240
+ }, Me = [
1241
+ { value: "#409eff", label: "默认蓝" },
1242
+ { value: "#1890ff", label: "科技蓝" },
1243
+ { value: "#52c41a", label: "极光绿" },
1244
+ { value: "#faad14", label: "日落橙" },
1245
+ { value: "#f5222d", label: "薄暮红" },
1246
+ { value: "#722ed1", label: "酱紫" }
1247
+ ], fe = (S) => {
1248
+ i.setPrimaryColor(S), B.value = !1;
1249
+ }, ge = () => {
1250
+ U(), s.push("/profile");
1251
+ }, T = () => {
1252
+ U(), s.push("/change-password");
1253
+ }, w = () => {
1254
+ U(), v.logout(), h.clearUserInfo(), o.clearMenu(), s.push(i.loginPath);
1255
+ }, Q = (S) => {
1256
+ W.value && !W.value.contains(S.target) && U(), q.value && !q.value.contains(S.target) && oe();
1257
+ }, C = (S) => {
1258
+ S.key === "Escape" && (oe(), U());
1259
+ };
1260
+ return Ke(() => {
1261
+ document.addEventListener("click", Q), document.addEventListener("fullscreenchange", ie), document.addEventListener("keydown", C), H.value = document.documentElement.classList.contains("grey-mode");
1262
+ }), je(() => {
1263
+ document.removeEventListener("click", Q), document.removeEventListener("fullscreenchange", ie), document.removeEventListener("keydown", C);
1264
+ }), (S, L) => {
1265
+ var te;
1266
+ return a(), c("div", Bs, [
1267
+ e("div", Rs, [
1268
+ e("img", {
1269
+ src: r.logoSrc,
1270
+ alt: "Logo",
1271
+ class: "top-menu__logo-img"
1272
+ }, null, 8, Fs),
1273
+ e("span", Ks, x(n(i).appName), 1)
1274
+ ]),
1275
+ k(n(Ge), {
1276
+ "model-value": d.value,
1277
+ mode: "horizontal",
1278
+ "background-color": g.value,
1279
+ "text-color": m.value,
1280
+ "active-text-color": j.value,
1281
+ class: "top-menu__menu",
1282
+ onSelect: ee
1283
+ }, {
1284
+ default: M(() => [
1285
+ (a(!0), c(K, null, X(n(o).menuList, (l) => (a(), c(K, {
1286
+ key: l.menuUrl
1287
+ }, [
1288
+ l.children && l.children.length > 0 ? (a(), O(n(Re), {
1289
+ key: 0,
1290
+ index: l.menuUrl
1291
+ }, {
1292
+ title: M(() => [
1293
+ e("span", js, [
1294
+ l.menuName !== "首页" ? (a(), c("span", Ws, [
1295
+ G(N(l.icon)) ? (a(), O(n(z), {
1296
+ key: 0,
1297
+ name: N(l.icon),
1298
+ size: 16
1299
+ }, null, 8, ["name"])) : (a(), c("span", qs, x(A(l.menuName)), 1))
1300
+ ])) : P("", !0),
1301
+ e("span", Hs, x(l.menuName), 1)
1302
+ ])
1303
+ ]),
1304
+ default: M(() => [
1305
+ (a(!0), c(K, null, X(l.children, (p) => (a(), c(K, {
1306
+ key: p.menuUrl
1307
+ }, [
1308
+ p.children && p.children.length > 0 ? (a(), O(n(Re), {
1309
+ key: 0,
1310
+ index: p.menuUrl
1311
+ }, {
1312
+ title: M(() => [
1313
+ e("span", Ys, [
1314
+ e("span", Gs, [
1315
+ G(N(p.icon)) ? (a(), O(n(z), {
1316
+ key: 0,
1317
+ name: N(p.icon),
1318
+ size: 16
1319
+ }, null, 8, ["name"])) : (a(), c("span", Xs, x(A(p.menuName)), 1))
1320
+ ]),
1321
+ e("span", Js, x(p.menuName), 1)
1322
+ ])
1323
+ ]),
1324
+ default: M(() => [
1325
+ (a(!0), c(K, null, X(p.children, (R) => (a(), O(n(Se), {
1326
+ key: R.menuUrl,
1327
+ index: R.menuUrl
1328
+ }, {
1329
+ default: M(() => [
1330
+ e("span", Zs, [
1331
+ e("span", Qs, [
1332
+ G(N(R.icon)) ? (a(), O(n(z), {
1333
+ key: 0,
1334
+ name: N(R.icon),
1335
+ size: 16
1336
+ }, null, 8, ["name"])) : (a(), c("span", eo, x(A(R.menuName)), 1))
1337
+ ]),
1338
+ e("span", to, x(R.menuName), 1)
1339
+ ])
1340
+ ]),
1341
+ _: 2
1342
+ }, 1032, ["index"]))), 128))
1343
+ ]),
1344
+ _: 2
1345
+ }, 1032, ["index"])) : (a(), O(n(Se), {
1346
+ key: 1,
1347
+ index: p.menuUrl
1348
+ }, {
1349
+ default: M(() => [
1350
+ e("span", so, [
1351
+ e("span", oo, [
1352
+ G(N(p.icon)) ? (a(), O(n(z), {
1353
+ key: 0,
1354
+ name: N(p.icon),
1355
+ size: 16
1356
+ }, null, 8, ["name"])) : (a(), c("span", ao, x(A(p.menuName)), 1))
1357
+ ]),
1358
+ e("span", no, x(p.menuName), 1)
1359
+ ])
1360
+ ]),
1361
+ _: 2
1362
+ }, 1032, ["index"]))
1363
+ ], 64))), 128))
1364
+ ]),
1365
+ _: 2
1366
+ }, 1032, ["index"])) : (a(), O(n(Se), {
1367
+ key: 1,
1368
+ index: l.menuUrl
1369
+ }, {
1370
+ default: M(() => [
1371
+ e("span", lo, [
1372
+ l.menuName !== "首页" ? (a(), c("span", ro, [
1373
+ G(N(l.icon)) ? (a(), O(n(z), {
1374
+ key: 0,
1375
+ name: N(l.icon),
1376
+ size: 16
1377
+ }, null, 8, ["name"])) : (a(), c("span", io, x(A(l.menuName)), 1))
1378
+ ])) : P("", !0),
1379
+ e("span", co, x(l.menuName), 1)
1380
+ ])
1381
+ ]),
1382
+ _: 2
1383
+ }, 1032, ["index"]))
1384
+ ], 64))), 128))
1385
+ ]),
1386
+ _: 1
1387
+ }, 8, ["model-value", "background-color", "text-color", "active-text-color"]),
1388
+ e("div", uo, [
1389
+ e("div", {
1390
+ class: "top-menu__search",
1391
+ ref_key: "searchRef",
1392
+ ref: q
1393
+ }, [
1394
+ k(n(z), {
1395
+ name: "search",
1396
+ size: 14,
1397
+ class: "top-menu__search-icon"
1398
+ }),
1399
+ Te(e("input", {
1400
+ "onUpdate:modelValue": L[0] || (L[0] = (l) => Y.value = l),
1401
+ type: "text",
1402
+ class: "top-menu__search-input",
1403
+ placeholder: "搜索菜单...",
1404
+ onFocus: L[1] || (L[1] = (l) => Z.value = !0)
1405
+ }, null, 544), [
1406
+ [We, Y.value]
1407
+ ]),
1408
+ k(ke, { name: "search-dropdown" }, {
1409
+ default: M(() => [
1410
+ Z.value && (_.value.length > 0 || Y.value) ? (a(), c("div", mo, [
1411
+ _.value.length > 0 ? (a(), c("div", po, [
1412
+ (a(!0), c(K, null, X(_.value, (l) => (a(), c("div", {
1413
+ key: l.path,
1414
+ class: "top-menu__search-item",
1415
+ onClick: (p) => _e(l.path)
1416
+ }, [
1417
+ l.title !== "首页" ? (a(), c("span", ho, [
1418
+ G(N(l.icon)) ? (a(), O(n(z), {
1419
+ key: 0,
1420
+ name: N(l.icon),
1421
+ size: 16
1422
+ }, null, 8, ["name"])) : (a(), c("span", _o, x(A(l.title)), 1))
1423
+ ])) : P("", !0),
1424
+ e("span", fo, x(l.title), 1),
1425
+ l.parentTitle ? (a(), c("span", go, x(l.parentTitle), 1)) : P("", !0)
1426
+ ], 8, vo))), 128))
1427
+ ])) : (a(), c("div", yo, " 未找到匹配的菜单 "))
1428
+ ])) : P("", !0)
1429
+ ]),
1430
+ _: 1
1431
+ })
1432
+ ], 512),
1433
+ e("div", {
1434
+ class: "top-menu__action",
1435
+ onClick: se,
1436
+ title: V.value ? "退出全屏" : "全屏"
1437
+ }, [
1438
+ k(n(z), {
1439
+ name: V.value ? "fullscreen-exit" : "fullscreen",
1440
+ size: 16
1441
+ }, null, 8, ["name"])
1442
+ ], 8, ko),
1443
+ e("div", {
1444
+ class: "top-menu__action",
1445
+ onClick: ce,
1446
+ title: "换肤设置"
1447
+ }, [
1448
+ k(n(z), {
1449
+ name: "skin",
1450
+ size: 16
1451
+ })
1452
+ ]),
1453
+ e("div", {
1454
+ class: "top-menu__action",
1455
+ onClick: F,
1456
+ title: "切换主题"
1457
+ }, [
1458
+ k(n(z), {
1459
+ name: n(i).isDark ? "sun" : "moon",
1460
+ size: 16
1461
+ }, null, 8, ["name"])
1462
+ ]),
1463
+ e("div", {
1464
+ class: "top-menu__user",
1465
+ ref_key: "dropdownRef",
1466
+ ref: W
1467
+ }, [
1468
+ e("div", {
1469
+ class: "top-menu__user-trigger",
1470
+ onClick: Ee(pe, ["stop"])
1471
+ }, [
1472
+ e("div", wo, [
1473
+ e("span", null, x(((te = n(h).userName) == null ? void 0 : te.charAt(0)) || "U"), 1)
1474
+ ]),
1475
+ e("span", bo, x(n(h).userName), 1),
1476
+ e("span", {
1477
+ class: J(["top-menu__user-arrow", { "is-active": D.value }])
1478
+ }, "▼", 2)
1479
+ ]),
1480
+ k(ke, { name: "dropdown" }, {
1481
+ default: M(() => {
1482
+ var l;
1483
+ return [
1484
+ D.value ? (a(), c("div", xo, [
1485
+ e("div", Co, [
1486
+ e("div", $o, [
1487
+ e("span", null, x(((l = n(h).userName) == null ? void 0 : l.charAt(0)) || "U"), 1)
1488
+ ]),
1489
+ e("div", Lo, [
1490
+ e("div", Mo, x(n(h).userName), 1),
1491
+ e("div", So, x(n(h).departmentName), 1)
1492
+ ])
1493
+ ]),
1494
+ L[7] || (L[7] = e("div", { class: "top-menu__dropdown-divider" }, null, -1)),
1495
+ e("div", No, [
1496
+ e("div", {
1497
+ class: "top-menu__dropdown-item",
1498
+ onClick: ge
1499
+ }, [
1500
+ k(n(z), {
1501
+ name: "user",
1502
+ size: 16
1503
+ }),
1504
+ L[3] || (L[3] = e("span", null, "个人信息", -1))
1505
+ ]),
1506
+ e("div", {
1507
+ class: "top-menu__dropdown-item",
1508
+ onClick: T
1509
+ }, [
1510
+ k(n(z), {
1511
+ name: "lock",
1512
+ size: 16
1513
+ }),
1514
+ L[4] || (L[4] = e("span", null, "修改密码", -1))
1515
+ ]),
1516
+ L[6] || (L[6] = e("div", { class: "top-menu__dropdown-divider" }, null, -1)),
1517
+ e("div", {
1518
+ class: "top-menu__dropdown-item top-menu__dropdown-item--danger",
1519
+ onClick: w
1520
+ }, [
1521
+ k(n(z), {
1522
+ name: "logout",
1523
+ size: 16
1524
+ }),
1525
+ L[5] || (L[5] = e("span", null, "退出登录", -1))
1526
+ ])
1527
+ ])
1528
+ ])) : P("", !0)
1529
+ ];
1530
+ }),
1531
+ _: 1
1532
+ })
1533
+ ], 512)
1534
+ ]),
1535
+ k(n(Xe), {
1536
+ modelValue: B.value,
1537
+ "onUpdate:modelValue": L[2] || (L[2] = (l) => B.value = l),
1538
+ title: "换肤设置",
1539
+ direction: "rtl",
1540
+ size: "320px"
1541
+ }, {
1542
+ default: M(() => [
1543
+ e("div", Io, [
1544
+ e("div", Uo, [
1545
+ L[11] || (L[11] = e("div", { class: "settings-title" }, "布局模式", -1)),
1546
+ e("div", zo, [
1547
+ (a(), c(K, null, X(Ce, (l) => e("div", {
1548
+ key: l.value,
1549
+ class: J(["layout-option", { "is-active": $e.value === l.value }]),
1550
+ onClick: (p) => Le(l.value)
1551
+ }, [
1552
+ e("div", Eo, [
1553
+ l.value === "sidebar" ? (a(), c("div", Po, [...L[8] || (L[8] = [
1554
+ e("div", { class: "preview-aside" }, null, -1),
1555
+ e("div", { class: "preview-main" }, [
1556
+ e("div", { class: "preview-header" }),
1557
+ e("div", { class: "preview-content" })
1558
+ ], -1)
1559
+ ])])) : l.value === "top" ? (a(), c("div", Ao, [...L[9] || (L[9] = [
1560
+ e("div", { class: "preview-header-full" }, null, -1),
1561
+ e("div", { class: "preview-content-full" }, null, -1)
1562
+ ])])) : (a(), c("div", Do, [...L[10] || (L[10] = [
1563
+ e("div", { class: "preview-header-mix" }, [
1564
+ e("div", { class: "preview-mix-left" })
1565
+ ], -1),
1566
+ e("div", { class: "preview-mix-body" }, [
1567
+ e("div", { class: "preview-mix-aside" }),
1568
+ e("div", { class: "preview-mix-content" })
1569
+ ], -1)
1570
+ ])]))
1571
+ ]),
1572
+ e("span", Vo, x(l.label), 1)
1573
+ ], 10, To)), 64))
1574
+ ])
1575
+ ]),
1576
+ e("div", Oo, [
1577
+ L[12] || (L[12] = e("div", { class: "settings-title" }, "主题色", -1)),
1578
+ e("div", Bo, [
1579
+ (a(), c(K, null, X(Me, (l) => e("div", {
1580
+ key: l.value,
1581
+ class: J(["color-option", { "is-active": n(i).primaryColor === l.value }]),
1582
+ style: Ne({ backgroundColor: l.value }),
1583
+ title: l.label,
1584
+ onClick: (p) => fe(l.value)
1585
+ }, [
1586
+ n(i).primaryColor === l.value ? (a(), O(n(z), {
1587
+ key: 0,
1588
+ name: "check",
1589
+ size: 12,
1590
+ color: "#fff"
1591
+ })) : P("", !0)
1592
+ ], 14, Ro)), 64))
1593
+ ])
1594
+ ]),
1595
+ e("div", Fo, [
1596
+ L[17] || (L[17] = e("div", { class: "settings-title" }, "功能设置", -1)),
1597
+ e("div", Ko, [
1598
+ e("div", jo, [
1599
+ L[14] || (L[14] = e("span", null, "灰色模式", -1)),
1600
+ e("div", {
1601
+ class: J(["switch-wrapper", { "is-checked": H.value }]),
1602
+ onClick: ve
1603
+ }, [...L[13] || (L[13] = [
1604
+ e("span", { class: "switch-core" }, null, -1)
1605
+ ])], 2)
1606
+ ]),
1607
+ e("div", Wo, [
1608
+ L[16] || (L[16] = e("span", null, "暗黑模式", -1)),
1609
+ e("div", {
1610
+ class: J(["switch-wrapper", { "is-checked": n(i).isDark }]),
1611
+ onClick: xe
1612
+ }, [...L[15] || (L[15] = [
1613
+ e("span", { class: "switch-core" }, null, -1)
1614
+ ])], 2)
1615
+ ])
1616
+ ])
1617
+ ])
1618
+ ])
1619
+ ]),
1620
+ _: 1
1621
+ }, 8, ["modelValue"])
1622
+ ]);
1623
+ };
1624
+ }
1625
+ }), Ho = /* @__PURE__ */ re(qo, [["__scopeId", "data-v-15f7b516"]]), Yo = { class: "mix-top-menu" }, Go = { class: "mix-top-menu__logo" }, Xo = ["src"], Jo = { class: "mix-top-menu__logo-text" }, Zo = { class: "mix-top-menu__menu-content" }, Qo = {
1626
+ key: 0,
1627
+ class: "mix-top-menu__menu-icon"
1628
+ }, ea = {
1629
+ key: 1,
1630
+ class: "mix-top-menu__menu-char"
1631
+ }, ta = { class: "mix-top-menu__menu-text" }, sa = { class: "mix-top-menu__actions" }, oa = {
1632
+ key: 0,
1633
+ class: "mix-top-menu__search-dropdown"
1634
+ }, aa = {
1635
+ key: 0,
1636
+ class: "mix-top-menu__search-results"
1637
+ }, na = ["onClick"], la = {
1638
+ key: 0,
1639
+ class: "mix-top-menu__search-icon-item"
1640
+ }, ra = {
1641
+ key: 1,
1642
+ class: "mix-top-menu__search-char"
1643
+ }, ia = { class: "mix-top-menu__search-item-title" }, ca = {
1644
+ key: 1,
1645
+ class: "mix-top-menu__search-item-parent"
1646
+ }, ua = {
1647
+ key: 1,
1648
+ class: "mix-top-menu__search-empty"
1649
+ }, da = ["title"], ma = { class: "mix-top-menu__avatar" }, pa = { class: "mix-top-menu__user-name" }, va = {
1650
+ key: 0,
1651
+ class: "mix-top-menu__dropdown"
1652
+ }, ha = { class: "mix-top-menu__dropdown-header" }, _a = { class: "mix-top-menu__dropdown-avatar" }, fa = { class: "mix-top-menu__dropdown-info" }, ga = { class: "mix-top-menu__dropdown-name" }, ya = { class: "mix-top-menu__dropdown-role" }, ka = { class: "mix-top-menu__dropdown-menu" }, wa = { class: "settings-drawer" }, ba = { class: "settings-section" }, xa = { class: "settings-layout-options" }, Ca = ["onClick"], $a = { class: "layout-option__preview" }, La = {
1653
+ key: 0,
1654
+ class: "layout-preview-sidebar"
1655
+ }, Ma = {
1656
+ key: 1,
1657
+ class: "layout-preview-top"
1658
+ }, Sa = {
1659
+ key: 2,
1660
+ class: "layout-preview-mix"
1661
+ }, Na = { class: "layout-option__label" }, Ia = { class: "settings-section" }, Ua = { class: "settings-color-options" }, za = ["title", "onClick"], Ta = { class: "settings-section" }, Ea = { class: "settings-switch-list" }, Pa = { class: "settings-switch-item" }, Aa = { class: "settings-switch-item" }, Da = /* @__PURE__ */ ne({
1662
+ __name: "MixTopMenu",
1663
+ props: {
1664
+ logoSrc: { default: "/vite.svg" }
1665
+ },
1666
+ setup(t) {
1667
+ const r = t, u = be(), s = me(), o = de(), i = ue(), h = le(), v = Ue(), d = y(""), f = (l, p = "") => {
1668
+ const R = [];
1669
+ return l.forEach(($) => {
1670
+ $.children && $.children.length > 0 ? R.push(...f($.children, $.menuName)) : R.push({ ...$, parentTitle: p, title: $.menuName, path: $.menuUrl });
1671
+ }), R;
1672
+ }, _ = b(() => N.value.trim() ? f(o.menuList).filter(
1673
+ (p) => p.title.toLowerCase().includes(N.value.toLowerCase())
1674
+ ) : []), g = b(() => {
1675
+ const l = o.menuList.find((p) => p.menuUrl === d.value);
1676
+ return (l == null ? void 0 : l.children) || [];
1677
+ }), m = b(() => o.menuList.find((l) => !!(u.path === l.menuUrl || l.children && l.children.some((p) => u.path.startsWith(p.menuUrl) || u.path === p.menuUrl)))), j = () => {
1678
+ m.value ? d.value = m.value.menuUrl : o.menuList.length > 0 && (d.value = o.menuList[0].menuUrl);
1679
+ }, D = (l) => {
1680
+ d.value = l;
1681
+ const p = o.menuList.find((R) => R.menuUrl === l);
1682
+ if (p)
1683
+ if (p.children && p.children.length > 0) {
1684
+ const R = p.children[0].menuUrl;
1685
+ u.path !== R && s.push(R);
1686
+ } else
1687
+ u.path !== l && s.push(l);
1688
+ }, W = b(() => i.isDark ? "#1d1e1f" : "#fff"), V = b(() => i.isDark ? "#cfd3dc" : "#303133"), B = b(() => "#409eff"), H = y(!1), Z = y(null), Y = y(!1), q = y(!1), ee = y(!1), E = y(!1), N = y(""), A = y(null);
1689
+ ye(() => u.path, () => {
1690
+ j(), i.setMixSubMenus(g.value);
1691
+ }), ye(() => o.menuList, (l) => {
1692
+ l && l.length > 0 && (j(), i.setMixSubMenus(g.value));
1693
+ }, { immediate: !0 });
1694
+ const G = /* @__PURE__ */ new Set([
1695
+ "arrow-up",
1696
+ "arrow-down",
1697
+ "arrow-left",
1698
+ "arrow-right",
1699
+ "caret-down",
1700
+ "caret-right",
1701
+ "plus",
1702
+ "minus",
1703
+ "close",
1704
+ "check",
1705
+ "edit",
1706
+ "delete",
1707
+ "copy",
1708
+ "download",
1709
+ "upload",
1710
+ "refresh",
1711
+ "search",
1712
+ "filter",
1713
+ "more",
1714
+ "setting",
1715
+ "share",
1716
+ "loading",
1717
+ "info",
1718
+ "success",
1719
+ "warning",
1720
+ "error",
1721
+ "question",
1722
+ "user",
1723
+ "user-add",
1724
+ "user-group",
1725
+ "logout",
1726
+ "login",
1727
+ "file",
1728
+ "folder",
1729
+ "folder-open",
1730
+ "document",
1731
+ "image",
1732
+ "video",
1733
+ "music",
1734
+ "camera",
1735
+ "mail",
1736
+ "phone",
1737
+ "chat",
1738
+ "bell",
1739
+ "message",
1740
+ "eye",
1741
+ "eye-off",
1742
+ "calendar",
1743
+ "clock",
1744
+ "history",
1745
+ "timer",
1746
+ "location",
1747
+ "map",
1748
+ "globe",
1749
+ "star",
1750
+ "heart",
1751
+ "thumb-up",
1752
+ "link",
1753
+ "external-link",
1754
+ "lock",
1755
+ "unlock",
1756
+ "key",
1757
+ "home",
1758
+ "menu",
1759
+ "menu-fold",
1760
+ "menu-unfold",
1761
+ "sidebar-fold",
1762
+ "sidebar-expand",
1763
+ "sidebar-left",
1764
+ "dashboard",
1765
+ "chart",
1766
+ "chart-pie",
1767
+ "chart-line",
1768
+ "report",
1769
+ "analytics",
1770
+ "system",
1771
+ "permission",
1772
+ "role",
1773
+ "user-manage",
1774
+ "log",
1775
+ "notification",
1776
+ "app",
1777
+ "list",
1778
+ "grid",
1779
+ "fullscreen",
1780
+ "fullscreen-exit",
1781
+ "zoom-in",
1782
+ "zoom-out",
1783
+ "print",
1784
+ "bookmark",
1785
+ "tag",
1786
+ "code",
1787
+ "terminal",
1788
+ "database",
1789
+ "server",
1790
+ "cloud",
1791
+ "gift",
1792
+ "moon",
1793
+ "sun",
1794
+ "theme",
1795
+ "skin"
1796
+ ]), F = (l) => {
1797
+ if (!l || l === "") return "";
1798
+ if (l.startsWith("tineco-icon-")) {
1799
+ const R = l.replace("tineco-icon-", "");
1800
+ return {
1801
+ home: "home",
1802
+ dashboard: "dashboard",
1803
+ system: "system",
1804
+ user: "user",
1805
+ role: "role",
1806
+ menu: "list",
1807
+ setting: "setting",
1808
+ file: "file",
1809
+ folder: "folder",
1810
+ chart: "chart",
1811
+ report: "report",
1812
+ analytics: "analytics"
1813
+ }[R] || R;
1814
+ }
1815
+ return {
1816
+ dashboard: "dashboard",
1817
+ system: "system",
1818
+ user: "user",
1819
+ role: "role",
1820
+ menu: "list",
1821
+ setting: "setting",
1822
+ home: "home",
1823
+ chart: "chart",
1824
+ report: "report",
1825
+ analytics: "analytics",
1826
+ permission: "permission",
1827
+ log: "log",
1828
+ notification: "notification",
1829
+ app: "app",
1830
+ list: "list",
1831
+ grid: "grid"
1832
+ }[l] || l;
1833
+ }, se = (l) => l ? l.charAt(0) : "", ie = (l) => G.has(l), pe = () => {
1834
+ i.toggleTheme(), q.value = !1;
1835
+ }, U = () => {
1836
+ document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen();
1837
+ }, oe = () => {
1838
+ Y.value = !!document.fullscreenElement;
1839
+ }, _e = () => {
1840
+ H.value = !H.value;
1841
+ }, ce = () => {
1842
+ H.value = !1;
1843
+ }, ae = () => {
1844
+ E.value = !1, N.value = "";
1845
+ }, ve = (l) => {
1846
+ s.push(l), ae();
1847
+ }, xe = () => {
1848
+ q.value = !0;
1849
+ }, Ce = (l) => {
1850
+ ee.value = l;
1851
+ const p = document.documentElement;
1852
+ l ? p.classList.add("grey-mode") : p.classList.remove("grey-mode");
1853
+ }, $e = () => {
1854
+ Ce(!ee.value), q.value = !1;
1855
+ }, Le = () => {
1856
+ i.toggleTheme(), q.value = !1;
1857
+ }, Me = [
1858
+ { value: "sidebar", label: "左侧菜单", icon: "sidebar-left" },
1859
+ { value: "top", label: "顶部菜单", icon: "menu" },
1860
+ { value: "mix", label: "混合菜单", icon: "grid" }
1861
+ ], fe = b(() => i.layout), ge = (l) => {
1862
+ i.setLayout(l), q.value = !1;
1863
+ }, T = [
1864
+ { value: "#409eff", label: "默认蓝" },
1865
+ { value: "#1890ff", label: "科技蓝" },
1866
+ { value: "#52c41a", label: "极光绿" },
1867
+ { value: "#faad14", label: "日落橙" },
1868
+ { value: "#f5222d", label: "薄暮红" },
1869
+ { value: "#722ed1", label: "酱紫" }
1870
+ ], w = (l) => {
1871
+ i.setPrimaryColor(l), q.value = !1;
1872
+ }, Q = () => {
1873
+ ce(), s.push("/profile");
1874
+ }, C = () => {
1875
+ ce(), s.push("/change-password");
1876
+ }, S = () => {
1877
+ ce(), v.logout(), h.clearUserInfo(), o.clearMenu(), s.push(i.loginPath);
1878
+ }, L = (l) => {
1879
+ Z.value && !Z.value.contains(l.target) && ce(), A.value && !A.value.contains(l.target) && ae();
1880
+ }, te = (l) => {
1881
+ l.key === "Escape" && (ae(), ce());
1882
+ };
1883
+ return Ke(() => {
1884
+ document.addEventListener("click", L), document.addEventListener("fullscreenchange", oe), document.addEventListener("keydown", te), ee.value = document.documentElement.classList.contains("grey-mode"), j();
1885
+ }), je(() => {
1886
+ document.removeEventListener("click", L), document.removeEventListener("fullscreenchange", oe), document.removeEventListener("keydown", te);
1887
+ }), (l, p) => {
1888
+ var R;
1889
+ return a(), c("div", Yo, [
1890
+ e("div", Go, [
1891
+ e("img", {
1892
+ src: r.logoSrc,
1893
+ alt: "Logo",
1894
+ class: "mix-top-menu__logo-img"
1895
+ }, null, 8, Xo),
1896
+ e("span", Jo, x(n(i).appName), 1)
1897
+ ]),
1898
+ k(n(Ge), {
1899
+ "model-value": d.value,
1900
+ mode: "horizontal",
1901
+ "background-color": W.value,
1902
+ "text-color": V.value,
1903
+ "active-text-color": B.value,
1904
+ class: "mix-top-menu__menu",
1905
+ onSelect: D
1906
+ }, {
1907
+ default: M(() => [
1908
+ (a(!0), c(K, null, X(n(o).menuList, ($) => (a(), O(n(Se), {
1909
+ key: $.menuUrl,
1910
+ index: $.menuUrl
1911
+ }, {
1912
+ default: M(() => [
1913
+ e("span", Zo, [
1914
+ $.menuName !== "首页" ? (a(), c("span", Qo, [
1915
+ ie(F($.icon)) ? (a(), O(n(z), {
1916
+ key: 0,
1917
+ name: F($.icon),
1918
+ size: 16
1919
+ }, null, 8, ["name"])) : (a(), c("span", ea, x(se($.menuName)), 1))
1920
+ ])) : P("", !0),
1921
+ e("span", ta, x($.menuName), 1)
1922
+ ])
1923
+ ]),
1924
+ _: 2
1925
+ }, 1032, ["index"]))), 128))
1926
+ ]),
1927
+ _: 1
1928
+ }, 8, ["model-value", "background-color", "text-color", "active-text-color"]),
1929
+ e("div", sa, [
1930
+ e("div", {
1931
+ class: "mix-top-menu__search",
1932
+ ref_key: "searchRef",
1933
+ ref: A
1934
+ }, [
1935
+ k(n(z), {
1936
+ name: "search",
1937
+ size: 14,
1938
+ class: "mix-top-menu__search-icon"
1939
+ }),
1940
+ Te(e("input", {
1941
+ "onUpdate:modelValue": p[0] || (p[0] = ($) => N.value = $),
1942
+ type: "text",
1943
+ class: "mix-top-menu__search-input",
1944
+ placeholder: "搜索菜单...",
1945
+ onFocus: p[1] || (p[1] = ($) => E.value = !0)
1946
+ }, null, 544), [
1947
+ [We, N.value]
1948
+ ]),
1949
+ k(ke, { name: "search-dropdown" }, {
1950
+ default: M(() => [
1951
+ E.value && (_.value.length > 0 || N.value) ? (a(), c("div", oa, [
1952
+ _.value.length > 0 ? (a(), c("div", aa, [
1953
+ (a(!0), c(K, null, X(_.value, ($) => (a(), c("div", {
1954
+ key: $.path,
1955
+ class: "mix-top-menu__search-item",
1956
+ onClick: (Ze) => ve($.path)
1957
+ }, [
1958
+ $.title !== "首页" ? (a(), c("span", la, [
1959
+ ie(F($.icon)) ? (a(), O(n(z), {
1960
+ key: 0,
1961
+ name: F($.icon),
1962
+ size: 16
1963
+ }, null, 8, ["name"])) : (a(), c("span", ra, x(se($.title)), 1))
1964
+ ])) : P("", !0),
1965
+ e("span", ia, x($.title), 1),
1966
+ $.parentTitle ? (a(), c("span", ca, x($.parentTitle), 1)) : P("", !0)
1967
+ ], 8, na))), 128))
1968
+ ])) : (a(), c("div", ua, " 未找到匹配的菜单 "))
1969
+ ])) : P("", !0)
1970
+ ]),
1971
+ _: 1
1972
+ })
1973
+ ], 512),
1974
+ e("div", {
1975
+ class: "mix-top-menu__action",
1976
+ onClick: U,
1977
+ title: Y.value ? "退出全屏" : "全屏"
1978
+ }, [
1979
+ k(n(z), {
1980
+ name: Y.value ? "fullscreen-exit" : "fullscreen",
1981
+ size: 16
1982
+ }, null, 8, ["name"])
1983
+ ], 8, da),
1984
+ e("div", {
1985
+ class: "mix-top-menu__action",
1986
+ onClick: xe,
1987
+ title: "换肤设置"
1988
+ }, [
1989
+ k(n(z), {
1990
+ name: "skin",
1991
+ size: 16
1992
+ })
1993
+ ]),
1994
+ e("div", {
1995
+ class: "mix-top-menu__action",
1996
+ onClick: pe,
1997
+ title: "切换主题"
1998
+ }, [
1999
+ k(n(z), {
2000
+ name: n(i).isDark ? "sun" : "moon",
2001
+ size: 16
2002
+ }, null, 8, ["name"])
2003
+ ]),
2004
+ e("div", {
2005
+ class: "mix-top-menu__user",
2006
+ ref_key: "dropdownRef",
2007
+ ref: Z
2008
+ }, [
2009
+ e("div", {
2010
+ class: "mix-top-menu__user-trigger",
2011
+ onClick: Ee(_e, ["stop"])
2012
+ }, [
2013
+ e("div", ma, [
2014
+ e("span", null, x(((R = n(h).userName) == null ? void 0 : R.charAt(0)) || "U"), 1)
2015
+ ]),
2016
+ e("span", pa, x(n(h).userName), 1),
2017
+ e("span", {
2018
+ class: J(["mix-top-menu__user-arrow", { "is-active": H.value }])
2019
+ }, "▼", 2)
2020
+ ]),
2021
+ k(ke, { name: "dropdown" }, {
2022
+ default: M(() => {
2023
+ var $;
2024
+ return [
2025
+ H.value ? (a(), c("div", va, [
2026
+ e("div", ha, [
2027
+ e("div", _a, [
2028
+ e("span", null, x((($ = n(h).userName) == null ? void 0 : $.charAt(0)) || "U"), 1)
2029
+ ]),
2030
+ e("div", fa, [
2031
+ e("div", ga, x(n(h).userName), 1),
2032
+ e("div", ya, x(n(h).departmentName), 1)
2033
+ ])
2034
+ ]),
2035
+ p[7] || (p[7] = e("div", { class: "mix-top-menu__dropdown-divider" }, null, -1)),
2036
+ e("div", ka, [
2037
+ e("div", {
2038
+ class: "mix-top-menu__dropdown-item",
2039
+ onClick: Q
2040
+ }, [
2041
+ k(n(z), {
2042
+ name: "user",
2043
+ size: 16
2044
+ }),
2045
+ p[3] || (p[3] = e("span", null, "个人信息", -1))
2046
+ ]),
2047
+ e("div", {
2048
+ class: "mix-top-menu__dropdown-item",
2049
+ onClick: C
2050
+ }, [
2051
+ k(n(z), {
2052
+ name: "lock",
2053
+ size: 16
2054
+ }),
2055
+ p[4] || (p[4] = e("span", null, "修改密码", -1))
2056
+ ]),
2057
+ p[6] || (p[6] = e("div", { class: "mix-top-menu__dropdown-divider" }, null, -1)),
2058
+ e("div", {
2059
+ class: "mix-top-menu__dropdown-item mix-top-menu__dropdown-item--danger",
2060
+ onClick: S
2061
+ }, [
2062
+ k(n(z), {
2063
+ name: "logout",
2064
+ size: 16
2065
+ }),
2066
+ p[5] || (p[5] = e("span", null, "退出登录", -1))
2067
+ ])
2068
+ ])
2069
+ ])) : P("", !0)
2070
+ ];
2071
+ }),
2072
+ _: 1
2073
+ })
2074
+ ], 512)
2075
+ ]),
2076
+ k(n(Xe), {
2077
+ modelValue: q.value,
2078
+ "onUpdate:modelValue": p[2] || (p[2] = ($) => q.value = $),
2079
+ title: "换肤设置",
2080
+ direction: "rtl",
2081
+ size: "320px"
2082
+ }, {
2083
+ default: M(() => [
2084
+ e("div", wa, [
2085
+ e("div", ba, [
2086
+ p[11] || (p[11] = e("div", { class: "settings-title" }, "布局模式", -1)),
2087
+ e("div", xa, [
2088
+ (a(), c(K, null, X(Me, ($) => e("div", {
2089
+ key: $.value,
2090
+ class: J(["layout-option", { "is-active": fe.value === $.value }]),
2091
+ onClick: (Ze) => ge($.value)
2092
+ }, [
2093
+ e("div", $a, [
2094
+ $.value === "sidebar" ? (a(), c("div", La, [...p[8] || (p[8] = [
2095
+ e("div", { class: "preview-aside" }, null, -1),
2096
+ e("div", { class: "preview-main" }, [
2097
+ e("div", { class: "preview-header" }),
2098
+ e("div", { class: "preview-content" })
2099
+ ], -1)
2100
+ ])])) : $.value === "top" ? (a(), c("div", Ma, [...p[9] || (p[9] = [
2101
+ e("div", { class: "preview-header-full" }, null, -1),
2102
+ e("div", { class: "preview-content-full" }, null, -1)
2103
+ ])])) : (a(), c("div", Sa, [...p[10] || (p[10] = [
2104
+ e("div", { class: "preview-header-mix" }, [
2105
+ e("div", { class: "preview-mix-left" })
2106
+ ], -1),
2107
+ e("div", { class: "preview-mix-body" }, [
2108
+ e("div", { class: "preview-mix-aside" }),
2109
+ e("div", { class: "preview-mix-content" })
2110
+ ], -1)
2111
+ ])]))
2112
+ ]),
2113
+ e("span", Na, x($.label), 1)
2114
+ ], 10, Ca)), 64))
2115
+ ])
2116
+ ]),
2117
+ e("div", Ia, [
2118
+ p[12] || (p[12] = e("div", { class: "settings-title" }, "主题色", -1)),
2119
+ e("div", Ua, [
2120
+ (a(), c(K, null, X(T, ($) => e("div", {
2121
+ key: $.value,
2122
+ class: J(["color-option", { "is-active": n(i).primaryColor === $.value }]),
2123
+ style: Ne({ backgroundColor: $.value }),
2124
+ title: $.label,
2125
+ onClick: (Ze) => w($.value)
2126
+ }, [
2127
+ n(i).primaryColor === $.value ? (a(), O(n(z), {
2128
+ key: 0,
2129
+ name: "check",
2130
+ size: 12,
2131
+ color: "#fff"
2132
+ })) : P("", !0)
2133
+ ], 14, za)), 64))
2134
+ ])
2135
+ ]),
2136
+ e("div", Ta, [
2137
+ p[17] || (p[17] = e("div", { class: "settings-title" }, "功能设置", -1)),
2138
+ e("div", Ea, [
2139
+ e("div", Pa, [
2140
+ p[14] || (p[14] = e("span", null, "灰色模式", -1)),
2141
+ e("div", {
2142
+ class: J(["switch-wrapper", { "is-checked": ee.value }]),
2143
+ onClick: $e
2144
+ }, [...p[13] || (p[13] = [
2145
+ e("span", { class: "switch-core" }, null, -1)
2146
+ ])], 2)
2147
+ ]),
2148
+ e("div", Aa, [
2149
+ p[16] || (p[16] = e("span", null, "暗黑模式", -1)),
2150
+ e("div", {
2151
+ class: J(["switch-wrapper", { "is-checked": n(i).isDark }]),
2152
+ onClick: Le
2153
+ }, [...p[15] || (p[15] = [
2154
+ e("span", { class: "switch-core" }, null, -1)
2155
+ ])], 2)
2156
+ ])
2157
+ ])
2158
+ ])
2159
+ ])
2160
+ ]),
2161
+ _: 1
2162
+ }, 8, ["modelValue"])
2163
+ ]);
2164
+ };
2165
+ }
2166
+ }), Va = /* @__PURE__ */ re(Da, [["__scopeId", "data-v-d5fb6d2a"]]), Oa = {
2167
+ key: 0,
2168
+ class: "layout layout--sidebar"
2169
+ }, Ba = { class: "layout__main" }, Ra = { class: "layout__header" }, Fa = { class: "layout__content" }, Ka = {
2170
+ key: 1,
2171
+ class: "layout layout--top"
2172
+ }, ja = { class: "layout__top-menu" }, Wa = { class: "layout__main" }, qa = { class: "layout__content" }, Ha = {
2173
+ key: 2,
2174
+ class: "layout layout--mix"
2175
+ }, Ya = { class: "layout__mix-top-menu" }, Ga = { class: "layout__mix-body" }, Xa = { class: "layout__content" }, Ja = /* @__PURE__ */ ne({
2176
+ __name: "index",
2177
+ props: {
2178
+ logoSrc: { default: "/vite.svg" }
2179
+ },
2180
+ setup(t) {
2181
+ const r = t, u = ue(), s = de(), o = b(
2182
+ () => u.isCollapsed ? "64px" : "210px"
2183
+ ), i = b(() => u.layout), h = b(() => i.value === "mix"), v = b(() => i.value === "sidebar" ? s.menuList : i.value === "mix" ? u.mixSubMenus : []), d = b(() => h.value ? v.value.length > 0 : !1);
2184
+ return (f, _) => {
2185
+ const g = rt("router-view");
2186
+ return a(), c(K, null, [
2187
+ i.value === "sidebar" ? (a(), c("div", Oa, [
2188
+ e("aside", {
2189
+ class: "layout__aside",
2190
+ style: Ne({ width: o.value })
2191
+ }, [
2192
+ k(tt, {
2193
+ "menu-list": v.value,
2194
+ "show-logo": !0,
2195
+ "show-user": !0,
2196
+ "logo-src": r.logoSrc
2197
+ }, null, 8, ["menu-list", "logo-src"])
2198
+ ], 4),
2199
+ e("div", Ba, [
2200
+ e("header", Ra, [
2201
+ k(Os)
2202
+ ]),
2203
+ e("main", Fa, [
2204
+ k(g)
2205
+ ])
2206
+ ])
2207
+ ])) : P("", !0),
2208
+ i.value === "top" ? (a(), c("div", Ka, [
2209
+ e("div", ja, [
2210
+ k(Ho, {
2211
+ "logo-src": r.logoSrc
2212
+ }, null, 8, ["logo-src"])
2213
+ ]),
2214
+ e("div", Wa, [
2215
+ e("main", qa, [
2216
+ k(g)
2217
+ ])
2218
+ ])
2219
+ ])) : P("", !0),
2220
+ i.value === "mix" ? (a(), c("div", Ha, [
2221
+ e("div", Ya, [
2222
+ k(Va, {
2223
+ "logo-src": r.logoSrc
2224
+ }, null, 8, ["logo-src"])
2225
+ ]),
2226
+ e("div", Ga, [
2227
+ d.value ? (a(), c("aside", {
2228
+ key: 0,
2229
+ class: "layout__aside",
2230
+ style: Ne({ width: o.value })
2231
+ }, [
2232
+ k(tt, {
2233
+ "menu-list": v.value,
2234
+ "show-logo": !1,
2235
+ "show-user": !1
2236
+ }, null, 8, ["menu-list"])
2237
+ ], 4)) : P("", !0),
2238
+ e("main", Xa, [
2239
+ k(g)
2240
+ ])
2241
+ ])
2242
+ ])) : P("", !0)
2243
+ ], 64);
2244
+ };
2245
+ }
2246
+ }), ct = /* @__PURE__ */ re(Ja, [["__scopeId", "data-v-38f2fc61"]]), Za = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2247
+ __proto__: null,
2248
+ default: ct
2249
+ }, Symbol.toStringTag, { value: "Module" })), Qa = { class: "tabs-wrapper" }, en = { class: "tab-label" }, tn = ["onClick"], sn = /* @__PURE__ */ ne({
2250
+ __name: "Tabs",
2251
+ setup(t) {
2252
+ const r = be(), u = me(), s = b(() => {
2253
+ const v = [];
2254
+ return r.matched.forEach((d) => {
2255
+ var f;
2256
+ (f = d.meta) != null && f.affix && v.push({
2257
+ name: d.name,
2258
+ title: d.meta.title,
2259
+ path: d.path,
2260
+ affix: !0
2261
+ });
2262
+ }), v;
2263
+ }), o = b(() => r.path), i = (v) => {
2264
+ u.push(v);
2265
+ }, h = (v) => {
2266
+ const d = s.value.find((f) => f.path === v);
2267
+ if (!(d != null && d.affix) && v === o.value) {
2268
+ const f = s.value.findIndex((g) => g.path === v), _ = s.value[f - 1] || s.value[f + 1];
2269
+ _ && u.push(_.path);
2270
+ }
2271
+ };
2272
+ return (v, d) => (a(), c("div", Qa, [
2273
+ k(n($t), {
2274
+ modelValue: o.value,
2275
+ "onUpdate:modelValue": d[0] || (d[0] = (f) => o.value = f),
2276
+ type: "card",
2277
+ onTabClick: i
2278
+ }, {
2279
+ default: M(() => [
2280
+ (a(!0), c(K, null, X(s.value, (f) => (a(), O(n(Lt), {
2281
+ key: f.path,
2282
+ name: f.path,
2283
+ label: f.title,
2284
+ closable: !f.affix
2285
+ }, {
2286
+ label: M(() => [
2287
+ e("span", en, [
2288
+ he(x(f.title) + " ", 1),
2289
+ f.affix ? P("", !0) : (a(), c("span", {
2290
+ key: 0,
2291
+ class: "tab-close",
2292
+ onClick: Ee((_) => h(f.path), ["stop"])
2293
+ }, " ✕ ", 8, tn))
2294
+ ])
2295
+ ]),
2296
+ _: 2
2297
+ }, 1032, ["name", "label", "closable"]))), 128))
2298
+ ]),
2299
+ _: 1
2300
+ }, 8, ["modelValue"])
2301
+ ]));
2302
+ }
2303
+ }), qn = /* @__PURE__ */ re(sn, [["__scopeId", "data-v-9156d8cd"]]), on = {}, an = { class: "footer" };
2304
+ function nn(t, r) {
2305
+ return a(), c("div", an, [...r[0] || (r[0] = [
2306
+ e("span", null, "Copyright © 2024 Xto Demo. All Rights Reserved.", -1)
2307
+ ])]);
2308
+ }
2309
+ const Hn = /* @__PURE__ */ re(on, [["render", nn], ["__scopeId", "data-v-4852826a"]]), ln = { class: "login-page" }, rn = { class: "login-form-section" }, cn = { class: "form-container" }, un = { class: "input-wrapper" }, dn = { class: "input-wrapper" }, mn = { class: "form-options" }, pn = { key: 0 }, vn = { key: 1 }, hn = /* @__PURE__ */ ne({
2310
+ __name: "index",
2311
+ setup(t) {
2312
+ const r = me(), u = be(), s = y(!1), o = y(!1), i = qe({
2313
+ uid: "",
2314
+ password: ""
2315
+ }), h = {
2316
+ uid: [
2317
+ { required: !0, message: "请输入用户名", trigger: "blur" }
2318
+ ],
2319
+ password: [
2320
+ { required: !0, message: "请输入密码", trigger: "blur" },
2321
+ { min: 6, message: "密码长度至少6位", trigger: "blur" }
2322
+ ]
2323
+ }, v = y(), d = async () => {
2324
+ var f;
2325
+ try {
2326
+ await ((f = v.value) == null ? void 0 : f.validate()), s.value = !0;
2327
+ const _ = await vt({
2328
+ appId: Fe(),
2329
+ clientId: lt(),
2330
+ uid: i.uid,
2331
+ password: i.password,
2332
+ code: !0
2333
+ });
2334
+ nt(_), Mt.success("登录成功");
2335
+ const g = u.query.redirect;
2336
+ g ? r.push(g) : r.push({ name: "Dashboard" });
2337
+ } catch (_) {
2338
+ console.error("登录失败:", _);
2339
+ } finally {
2340
+ s.value = !1;
2341
+ }
2342
+ };
2343
+ return (f, _) => (a(), c("div", ln, [
2344
+ _[10] || (_[10] = ze('<div class="login-brand" data-v-ef91e533><div class="brand-content" data-v-ef91e533><div class="brand-logo" data-v-ef91e533><div class="logo-icon" data-v-ef91e533><svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-ef91e533><rect width="48" height="48" rx="12" fill="currentColor" data-v-ef91e533></rect><path d="M14 24L20 30L34 16" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" data-v-ef91e533></path></svg></div><span class="logo-text" data-v-ef91e533>XTO</span></div><div class="brand-slogan" data-v-ef91e533><h1 data-v-ef91e533>企业级后台管理解决方案</h1><p data-v-ef91e533>开箱即用的中后台前端/设计解决方案</p></div><div class="brand-features" data-v-ef91e533><div class="feature-item" data-v-ef91e533><div class="feature-icon" data-v-ef91e533><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-ef91e533><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" data-v-ef91e533></path></svg></div><div class="feature-text" data-v-ef91e533><h4 data-v-ef91e533>高性能</h4><p data-v-ef91e533>极致的渲染性能与响应速度</p></div></div><div class="feature-item" data-v-ef91e533><div class="feature-icon" data-v-ef91e533><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-ef91e533><rect x="3" y="3" width="18" height="18" rx="2" data-v-ef91e533></rect><path d="M9 9h6M9 12h6M9 15h4" data-v-ef91e533></path></svg></div><div class="feature-text" data-v-ef91e533><h4 data-v-ef91e533>丰富组件</h4><p data-v-ef91e533>60+ 高质量业务组件</p></div></div><div class="feature-item" data-v-ef91e533><div class="feature-icon" data-v-ef91e533><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-ef91e533><circle cx="12" cy="12" r="10" data-v-ef91e533></circle><path d="M12 6v6l4 2" data-v-ef91e533></path></svg></div><div class="feature-text" data-v-ef91e533><h4 data-v-ef91e533>持续更新</h4><p data-v-ef91e533>活跃的社区与快速迭代</p></div></div></div><div class="brand-decoration" data-v-ef91e533><div class="decoration-line" data-v-ef91e533></div><div class="decoration-dots" data-v-ef91e533><span data-v-ef91e533></span><span data-v-ef91e533></span><span data-v-ef91e533></span></div></div></div><div class="brand-bg" data-v-ef91e533><div class="bg-grid" data-v-ef91e533></div><div class="bg-glow" data-v-ef91e533></div><div class="bg-pattern" data-v-ef91e533></div></div></div>', 1)),
2345
+ e("div", rn, [
2346
+ e("div", cn, [
2347
+ _[7] || (_[7] = e("div", { class: "form-header" }, [
2348
+ e("h2", null, "欢迎登录"),
2349
+ e("p", null, "请输入您的账户信息")
2350
+ ], -1)),
2351
+ k(n(St), {
2352
+ ref_key: "formRef",
2353
+ ref: v,
2354
+ model: i,
2355
+ rules: h,
2356
+ class: "login-form",
2357
+ "label-width": "0"
2358
+ }, {
2359
+ default: M(() => [
2360
+ k(n(Pe), { prop: "uid" }, {
2361
+ default: M(() => [
2362
+ e("div", un, [
2363
+ _[3] || (_[3] = e("label", { class: "input-label" }, "用户名", -1)),
2364
+ k(n(et), {
2365
+ modelValue: i.uid,
2366
+ "onUpdate:modelValue": _[0] || (_[0] = (g) => i.uid = g),
2367
+ placeholder: "请输入用户名",
2368
+ size: "large"
2369
+ }, {
2370
+ prefix: M(() => [
2371
+ k(n(z), {
2372
+ name: "user",
2373
+ size: 18
2374
+ })
2375
+ ]),
2376
+ _: 1
2377
+ }, 8, ["modelValue"])
2378
+ ])
2379
+ ]),
2380
+ _: 1
2381
+ }),
2382
+ k(n(Pe), { prop: "password" }, {
2383
+ default: M(() => [
2384
+ e("div", dn, [
2385
+ _[4] || (_[4] = e("label", { class: "input-label" }, "密码", -1)),
2386
+ k(n(et), {
2387
+ modelValue: i.password,
2388
+ "onUpdate:modelValue": _[1] || (_[1] = (g) => i.password = g),
2389
+ type: "password",
2390
+ placeholder: "请输入密码",
2391
+ size: "large",
2392
+ "show-password": "",
2393
+ onKeyup: xt(d, ["enter"])
2394
+ }, {
2395
+ prefix: M(() => [
2396
+ k(n(z), {
2397
+ name: "lock",
2398
+ size: 18
2399
+ })
2400
+ ]),
2401
+ _: 1
2402
+ }, 8, ["modelValue"])
2403
+ ])
2404
+ ]),
2405
+ _: 1
2406
+ }),
2407
+ e("div", mn, [
2408
+ k(n(Nt), {
2409
+ modelValue: o.value,
2410
+ "onUpdate:modelValue": _[2] || (_[2] = (g) => o.value = g)
2411
+ }, {
2412
+ default: M(() => [..._[5] || (_[5] = [
2413
+ he("记住我", -1)
2414
+ ])]),
2415
+ _: 1
2416
+ }, 8, ["modelValue"]),
2417
+ _[6] || (_[6] = e("a", {
2418
+ href: "#",
2419
+ class: "forgot-link"
2420
+ }, "忘记密码?", -1))
2421
+ ]),
2422
+ k(n(Pe), null, {
2423
+ default: M(() => [
2424
+ k(n(we), {
2425
+ type: "primary",
2426
+ size: "large",
2427
+ loading: s.value,
2428
+ class: "login-btn",
2429
+ onClick: d
2430
+ }, {
2431
+ default: M(() => [
2432
+ s.value ? (a(), c("span", vn, "登录中...")) : (a(), c("span", pn, "登 录"))
2433
+ ]),
2434
+ _: 1
2435
+ }, 8, ["loading"])
2436
+ ]),
2437
+ _: 1
2438
+ })
2439
+ ]),
2440
+ _: 1
2441
+ }, 8, ["model"]),
2442
+ _[8] || (_[8] = ze('<div class="form-footer" data-v-ef91e533><p data-v-ef91e533>其他登录方式</p><div class="social-login" data-v-ef91e533><button class="social-btn" title="企业微信" data-v-ef91e533><svg viewBox="0 0 24 24" fill="currentColor" data-v-ef91e533><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" data-v-ef91e533></path></svg></button><button class="social-btn" title="钉钉" data-v-ef91e533><svg viewBox="0 0 24 24" fill="currentColor" data-v-ef91e533><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19-.14.75-.42 1-.68 1.03-.58.05-1.02-.38-1.58-.75-.88-.58-1.38-.94-2.23-1.5-.99-.65-.35-1.01.22-1.59.15-.15 2.71-2.48 2.76-2.69a.2.2 0 00-.05-.18c-.06-.05-.14-.03-.21-.02-.09.02-1.49.95-4.22 2.79-.4.27-.76.41-1.08.4-.36-.01-1.04-.2-1.55-.37-.63-.2-1.12-.31-1.08-.66.02-.18.27-.36.74-.55 2.92-1.27 4.86-2.11 5.83-2.51 2.78-1.16 3.35-1.36 3.73-1.36.08 0 .27.02.39.12.1.08.13.19.14.27-.01.06.01.24 0 .38z" data-v-ef91e533></path></svg></button><button class="social-btn" title="飞书" data-v-ef91e533><svg viewBox="0 0 24 24" fill="currentColor" data-v-ef91e533><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z" data-v-ef91e533></path></svg></button></div></div>', 1))
2443
+ ]),
2444
+ _[9] || (_[9] = e("div", { class: "copyright" }, [
2445
+ e("p", null, "© 2024 XTO Team. All rights reserved.")
2446
+ ], -1))
2447
+ ])
2448
+ ]));
2449
+ }
2450
+ }), _n = /* @__PURE__ */ re(hn, [["__scopeId", "data-v-ef91e533"]]), fn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2451
+ __proto__: null,
2452
+ default: _n
2453
+ }, Symbol.toStringTag, { value: "Module" })), gn = { class: "error-page" }, yn = { class: "error-container" }, kn = { class: "error-content" }, wn = { class: "error-actions" }, bn = /* @__PURE__ */ ne({
2454
+ __name: "404",
2455
+ setup(t) {
2456
+ const r = me(), u = () => {
2457
+ r.push("/");
2458
+ };
2459
+ return (s, o) => (a(), c("div", gn, [
2460
+ e("div", yn, [
2461
+ o[7] || (o[7] = e("div", { class: "error-bg" }, [
2462
+ e("div", { class: "bg-circle circle-1" }),
2463
+ e("div", { class: "bg-circle circle-2" }),
2464
+ e("div", { class: "bg-circle circle-3" })
2465
+ ], -1)),
2466
+ e("div", kn, [
2467
+ o[5] || (o[5] = ze('<div class="error-code" data-v-1b083153><span class="code-digit" data-v-1b083153>4</span><span class="code-zero" data-v-1b083153><span class="zero-inner" data-v-1b083153>0</span></span><span class="code-digit" data-v-1b083153>4</span></div><div class="error-illustration" data-v-1b083153><svg viewBox="0 0 200 120" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-1b083153><rect x="40" y="20" width="120" height="80" rx="8" fill="var(--color-fill)" stroke="var(--color-border)" stroke-width="2" data-v-1b083153></rect><rect x="50" y="30" width="100" height="60" rx="4" fill="var(--bg-color)" data-v-1b083153></rect><line x1="60" y1="45" x2="140" y2="45" stroke="var(--color-border-light)" stroke-width="2" data-v-1b083153></line><line x1="60" y1="55" x2="120" y2="55" stroke="var(--color-border-light)" stroke-width="2" data-v-1b083153></line><line x1="60" y1="65" x2="100" y2="65" stroke="var(--color-border-light)" stroke-width="2" data-v-1b083153></line><text x="100" y="75" text-anchor="middle" fill="var(--color-primary)" font-size="24" font-weight="600" data-v-1b083153>?</text><circle cx="150" cy="35" r="12" stroke="var(--color-primary)" stroke-width="2" fill="none" data-v-1b083153></circle><line x1="158" y1="43" x2="168" y2="53" stroke="var(--color-primary)" stroke-width="2" stroke-linecap="round" data-v-1b083153></line></svg></div><h1 class="error-title" data-v-1b083153>页面不存在</h1><p class="error-desc" data-v-1b083153>抱歉,您访问的页面不存在或已被删除</p>', 4)),
2468
+ e("div", wn, [
2469
+ k(n(we), {
2470
+ type: "primary",
2471
+ size: "large",
2472
+ onClick: u
2473
+ }, {
2474
+ icon: M(() => [...o[1] || (o[1] = [
2475
+ e("svg", {
2476
+ viewBox: "0 0 24 24",
2477
+ fill: "none",
2478
+ stroke: "currentColor",
2479
+ "stroke-width": "2"
2480
+ }, [
2481
+ e("path", { d: "M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" }),
2482
+ e("polyline", { points: "9,22 9,12 15,12 15,22" })
2483
+ ], -1)
2484
+ ])]),
2485
+ default: M(() => [
2486
+ o[2] || (o[2] = he(" 返回首页 ", -1))
2487
+ ]),
2488
+ _: 1
2489
+ }),
2490
+ k(n(we), {
2491
+ size: "large",
2492
+ onClick: o[0] || (o[0] = (i) => n(r).go(-1))
2493
+ }, {
2494
+ icon: M(() => [...o[3] || (o[3] = [
2495
+ e("svg", {
2496
+ viewBox: "0 0 24 24",
2497
+ fill: "none",
2498
+ stroke: "currentColor",
2499
+ "stroke-width": "2"
2500
+ }, [
2501
+ e("path", { d: "M19 12H5M12 19l-7-7 7-7" })
2502
+ ], -1)
2503
+ ])]),
2504
+ default: M(() => [
2505
+ o[4] || (o[4] = he(" 返回上一页 ", -1))
2506
+ ]),
2507
+ _: 1
2508
+ })
2509
+ ]),
2510
+ o[6] || (o[6] = e("div", { class: "error-tip" }, [
2511
+ e("p", null, "您可以尝试:"),
2512
+ e("ul", null, [
2513
+ e("li", null, "检查您输入的网址是否正确"),
2514
+ e("li", null, "返回首页重新浏览"),
2515
+ e("li", null, "联系管理员反馈问题")
2516
+ ])
2517
+ ], -1))
2518
+ ])
2519
+ ])
2520
+ ]));
2521
+ }
2522
+ }), xn = /* @__PURE__ */ re(bn, [["__scopeId", "data-v-1b083153"]]), ut = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2523
+ __proto__: null,
2524
+ default: xn
2525
+ }, Symbol.toStringTag, { value: "Module" })), Cn = { class: "error-page" }, $n = { class: "error-container" }, Ln = { class: "error-content" }, Mn = { class: "error-actions" }, Sn = /* @__PURE__ */ ne({
2526
+ __name: "403",
2527
+ setup(t) {
2528
+ const r = me(), u = () => {
2529
+ r.push("/");
2530
+ };
2531
+ return (s, o) => (a(), c("div", Cn, [
2532
+ e("div", $n, [
2533
+ o[7] || (o[7] = e("div", { class: "error-bg" }, [
2534
+ e("div", { class: "bg-circle circle-1" }),
2535
+ e("div", { class: "bg-circle circle-2" }),
2536
+ e("div", { class: "bg-circle circle-3" })
2537
+ ], -1)),
2538
+ e("div", Ln, [
2539
+ o[5] || (o[5] = ze('<div class="error-code" data-v-d167f981><span class="code-digit" data-v-d167f981>4</span><span class="code-zero warning" data-v-d167f981><span class="zero-inner" data-v-d167f981>0</span></span><span class="code-digit" data-v-d167f981>3</span></div><div class="error-illustration" data-v-d167f981><svg viewBox="0 0 200 120" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-d167f981><path d="M100 15 L150 35 L150 70 C150 95 100 110 100 110 C100 110 50 95 50 70 L50 35 Z" fill="var(--color-warning-lighter)" stroke="var(--color-warning)" stroke-width="2" data-v-d167f981></path><rect x="85" y="55" width="30" height="25" rx="4" fill="var(--color-warning)" data-v-d167f981></rect><path d="M92 55 V48 A8 8 0 0 1 108 48 V55" fill="none" stroke="var(--color-warning)" stroke-width="3" data-v-d167f981></path><circle cx="100" cy="67" r="6" fill="none" stroke="#fff" stroke-width="2" data-v-d167f981></circle><line x1="96" y1="63" x2="104" y2="71" stroke="#fff" stroke-width="2" data-v-d167f981></line></svg></div><h1 class="error-title" data-v-d167f981>无访问权限</h1><p class="error-desc" data-v-d167f981>抱歉,您没有权限访问此页面,请联系管理员获取权限</p>', 4)),
2540
+ e("div", Mn, [
2541
+ k(n(we), {
2542
+ type: "primary",
2543
+ size: "large",
2544
+ onClick: u
2545
+ }, {
2546
+ icon: M(() => [...o[1] || (o[1] = [
2547
+ e("svg", {
2548
+ viewBox: "0 0 24 24",
2549
+ fill: "none",
2550
+ stroke: "currentColor",
2551
+ "stroke-width": "2"
2552
+ }, [
2553
+ e("path", { d: "M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" }),
2554
+ e("polyline", { points: "9,22 9,12 15,12 15,22" })
2555
+ ], -1)
2556
+ ])]),
2557
+ default: M(() => [
2558
+ o[2] || (o[2] = he(" 返回首页 ", -1))
2559
+ ]),
2560
+ _: 1
2561
+ }),
2562
+ k(n(we), {
2563
+ size: "large",
2564
+ onClick: o[0] || (o[0] = (i) => n(r).go(-1))
2565
+ }, {
2566
+ icon: M(() => [...o[3] || (o[3] = [
2567
+ e("svg", {
2568
+ viewBox: "0 0 24 24",
2569
+ fill: "none",
2570
+ stroke: "currentColor",
2571
+ "stroke-width": "2"
2572
+ }, [
2573
+ e("path", { d: "M19 12H5M12 19l-7-7 7-7" })
2574
+ ], -1)
2575
+ ])]),
2576
+ default: M(() => [
2577
+ o[4] || (o[4] = he(" 返回上一页 ", -1))
2578
+ ]),
2579
+ _: 1
2580
+ })
2581
+ ]),
2582
+ o[6] || (o[6] = e("div", { class: "error-tip" }, [
2583
+ e("p", null, "可能的原因:"),
2584
+ e("ul", null, [
2585
+ e("li", null, "您的账号权限不足"),
2586
+ e("li", null, "该页面需要特定角色才能访问"),
2587
+ e("li", null, "您的登录状态已过期")
2588
+ ])
2589
+ ], -1))
2590
+ ])
2591
+ ])
2592
+ ]));
2593
+ }
2594
+ }), Yn = /* @__PURE__ */ re(Sn, [["__scopeId", "data-v-d167f981"]]);
2595
+ function Gn() {
2596
+ const t = ue(), r = le(), u = Ue(), s = b(() => r.userName || ""), o = b(() => r.userInfo), i = b(() => t.appName), h = b(() => u.isLoggedIn), v = b(() => t.isDark), d = b(() => t.theme), f = b(() => t.isCollapsed), _ = b(() => t.layout);
2597
+ return {
2598
+ userName: s,
2599
+ userInfo: o,
2600
+ appName: i,
2601
+ isLoggedIn: h,
2602
+ isDark: v,
2603
+ theme: d,
2604
+ isCollapsed: f,
2605
+ layout: _,
2606
+ toggleTheme: () => {
2607
+ t.toggleTheme();
2608
+ },
2609
+ toggleCollapse: () => {
2610
+ t.toggleCollapse();
2611
+ }
2612
+ };
2613
+ }
2614
+ function Xn() {
2615
+ const t = le();
2616
+ return {
2617
+ isLoggedIn: b(() => t.isLoggedIn)
2618
+ };
2619
+ }
2620
+ function Jn(t, r = {}) {
2621
+ const { rules: u, onSubmit: s } = r, o = y(), i = qe({ ...t }), h = y(!1), v = y(!1), d = y(!1), f = () => {
2622
+ m(), d.value = !1, v.value = !0;
2623
+ }, _ = (D) => {
2624
+ Object.assign(i, D), d.value = !0, v.value = !0;
2625
+ }, g = () => {
2626
+ v.value = !1, m();
2627
+ }, m = () => {
2628
+ var D;
2629
+ Object.keys(t).forEach((W) => {
2630
+ i[W] = t[W];
2631
+ }), (D = o.value) == null || D.resetFields();
2632
+ };
2633
+ return {
2634
+ formRef: o,
2635
+ formData: i,
2636
+ rules: u,
2637
+ loading: h,
2638
+ visible: v,
2639
+ isEdit: d,
2640
+ openAdd: f,
2641
+ openEdit: _,
2642
+ close: g,
2643
+ resetForm: m,
2644
+ handleSubmit: async () => {
2645
+ var D;
2646
+ try {
2647
+ await ((D = o.value) == null ? void 0 : D.validate()), h.value = !0, await (s == null ? void 0 : s(i)), g();
2648
+ } catch (W) {
2649
+ console.error(W);
2650
+ } finally {
2651
+ h.value = !1;
2652
+ }
2653
+ }
2654
+ };
2655
+ }
2656
+ function Zn(t) {
2657
+ const { fetchData: r, defaultPageSize: u = 10 } = t, s = y(!1), o = y([]), i = y(0), h = y(1), v = y(u), d = qe({}), f = async () => {
2658
+ s.value = !0;
2659
+ try {
2660
+ const V = {
2661
+ ...d,
2662
+ page: h.value,
2663
+ pageSize: v.value
2664
+ }, B = await r(V);
2665
+ o.value = B.list, i.value = B.total;
2666
+ } catch (V) {
2667
+ console.error(V);
2668
+ } finally {
2669
+ s.value = !1;
2670
+ }
2671
+ }, _ = () => {
2672
+ h.value = 1, f();
2673
+ }, g = () => {
2674
+ Object.keys(d).forEach((V) => {
2675
+ d[V] = void 0;
2676
+ }), h.value = 1, f();
2677
+ }, m = (V) => {
2678
+ h.value = V, f();
2679
+ }, j = (V) => {
2680
+ v.value = V, h.value = 1, f();
2681
+ }, D = () => {
2682
+ f();
2683
+ }, W = b(() => ({
2684
+ current: h.value,
2685
+ pageSize: v.value,
2686
+ total: i.value
2687
+ }));
2688
+ return {
2689
+ loading: s,
2690
+ data: o,
2691
+ total: i,
2692
+ currentPage: h,
2693
+ pageSize: v,
2694
+ searchParams: d,
2695
+ pagination: W,
2696
+ getData: f,
2697
+ handleSearch: _,
2698
+ handleReset: g,
2699
+ handlePageChange: m,
2700
+ handleSizeChange: j,
2701
+ refresh: D
2702
+ };
2703
+ }
2704
+ const Je = Ie("locale", () => {
2705
+ const t = I.get("locale") || "zh-CN", r = It(t), u = y(t), s = Ut(), { t: o, messages: i, setLocale: h, mergeMessages: v } = zt(), d = b(() => {
2706
+ const m = s.find((j) => j.code === u.value);
2707
+ return (m == null ? void 0 : m.name) || u.value;
2708
+ });
2709
+ return {
2710
+ locale: u,
2711
+ localeName: d,
2712
+ locales: s,
2713
+ messages: i,
2714
+ t: o,
2715
+ changeLocale: (m) => {
2716
+ u.value = m, h(m), I.set("locale", m), r.setLocale(m);
2717
+ },
2718
+ addMessages: (m) => {
2719
+ v(m);
2720
+ },
2721
+ initLocale: () => {
2722
+ h(t);
2723
+ },
2724
+ provider: r
2725
+ };
2726
+ }), Nn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2727
+ __proto__: null,
2728
+ useLocaleStore: Je
2729
+ }, Symbol.toStringTag, { value: "Module" }));
2730
+ function Qn() {
2731
+ const t = Je();
2732
+ return {
2733
+ /** 当前语言代码 */
2734
+ locale: t.locale,
2735
+ /** 当前语言名称 */
2736
+ localeName: t.localeName,
2737
+ /** 支持的语言列表 */
2738
+ locales: t.locales,
2739
+ /** 翻译函数 */
2740
+ t: t.t,
2741
+ /** 当前语言包 */
2742
+ messages: t.messages,
2743
+ /** 切换语言 */
2744
+ setLocale: t.changeLocale,
2745
+ /** 添加自定义翻译 */
2746
+ addMessages: t.addMessages
2747
+ };
2748
+ }
2749
+ function el() {
2750
+ return Je().t;
2751
+ }
2752
+ function tl(t) {
2753
+ const r = le(), u = de();
2754
+ return r.isLoggedIn ? u.hasPermission(t) : !1;
2755
+ }
2756
+ function sl(t) {
2757
+ return le().isLoggedIn;
2758
+ }
2759
+ function ol() {
2760
+ return !0;
2761
+ }
2762
+ const dt = [
2763
+ {
2764
+ path: "/login",
2765
+ name: "Login",
2766
+ component: () => Promise.resolve().then(() => fn),
2767
+ meta: {
2768
+ title: "登录",
2769
+ hidden: !0
2770
+ }
2771
+ }
2772
+ ], mt = {
2773
+ path: "/",
2774
+ name: "Layout",
2775
+ component: () => Promise.resolve().then(() => Za),
2776
+ redirect: "/dashboard",
2777
+ children: [
2778
+ {
2779
+ path: "/dashboard",
2780
+ name: "Dashboard",
2781
+ component: () => import("./index-BuVnk-Ka.js"),
2782
+ meta: {
2783
+ title: "仪表盘",
2784
+ icon: "dashboard",
2785
+ keepAlive: !0,
2786
+ affix: !0
2787
+ }
2788
+ },
2789
+ {
2790
+ path: "/system/user",
2791
+ name: "SystemUser",
2792
+ component: () => import("./index-CaIet-zn.js"),
2793
+ meta: {
2794
+ title: "用户管理",
2795
+ icon: "user",
2796
+ keepAlive: !0
2797
+ }
2798
+ },
2799
+ {
2800
+ path: "/system/role",
2801
+ name: "SystemRole",
2802
+ component: () => import("./index-CPUyTvNq.js"),
2803
+ meta: {
2804
+ title: "角色管理",
2805
+ icon: "role",
2806
+ keepAlive: !0
2807
+ }
2808
+ },
2809
+ {
2810
+ path: "/system/menu",
2811
+ name: "SystemMenu",
2812
+ component: () => import("./index-11ZvkUE8.js"),
2813
+ meta: {
2814
+ title: "菜单管理",
2815
+ icon: "menu",
2816
+ keepAlive: !0
2817
+ }
2818
+ },
2819
+ // catch-all 路由:让 404 在 Layout 内部渲染,保持左侧菜单显示
2820
+ {
2821
+ path: "/:pathMatch(.*)*",
2822
+ name: "CatchAll",
2823
+ component: () => Promise.resolve().then(() => ut),
2824
+ meta: {
2825
+ title: "404",
2826
+ hidden: !0
2827
+ }
2828
+ }
2829
+ ]
2830
+ }, al = [
2831
+ {
2832
+ path: "/dashboard",
2833
+ name: "Dashboard",
2834
+ component: () => import("./index-BuVnk-Ka.js"),
2835
+ meta: {
2836
+ title: "仪表盘",
2837
+ icon: "dashboard",
2838
+ keepAlive: !0,
2839
+ affix: !0
2840
+ }
2841
+ },
2842
+ {
2843
+ path: "/system",
2844
+ name: "System",
2845
+ redirect: "/system/user",
2846
+ meta: {
2847
+ title: "系统管理",
2848
+ icon: "setting"
2849
+ },
2850
+ children: [
2851
+ {
2852
+ path: "user",
2853
+ name: "SystemUser",
2854
+ component: () => import("./index-CaIet-zn.js"),
2855
+ meta: {
2856
+ title: "用户管理",
2857
+ icon: "user",
2858
+ keepAlive: !0
2859
+ }
2860
+ },
2861
+ {
2862
+ path: "role",
2863
+ name: "SystemRole",
2864
+ component: () => import("./index-CPUyTvNq.js"),
2865
+ meta: {
2866
+ title: "角色管理",
2867
+ icon: "role",
2868
+ keepAlive: !0
2869
+ }
2870
+ },
2871
+ {
2872
+ path: "menu",
2873
+ name: "SystemMenu",
2874
+ component: () => import("./index-11ZvkUE8.js"),
2875
+ meta: {
2876
+ title: "菜单管理",
2877
+ icon: "menu",
2878
+ keepAlive: !0
2879
+ }
2880
+ }
2881
+ ]
2882
+ }
2883
+ ], In = [
2884
+ {
2885
+ menuCode: "dashboard",
2886
+ menuName: "仪表盘",
2887
+ menuUrl: "/dashboard",
2888
+ icon: "dashboard",
2889
+ closable: !0,
2890
+ isDefault: !0,
2891
+ isOut: !1
2892
+ },
2893
+ {
2894
+ menuCode: "system",
2895
+ menuName: "系统管理",
2896
+ menuUrl: "/system",
2897
+ icon: "setting",
2898
+ closable: !1,
2899
+ isDefault: !1,
2900
+ isOut: !1,
2901
+ children: [
2902
+ {
2903
+ menuCode: "system_user",
2904
+ menuName: "用户管理",
2905
+ menuUrl: "/system/user",
2906
+ icon: "user",
2907
+ closable: !0,
2908
+ isDefault: !1,
2909
+ isOut: !1
2910
+ },
2911
+ {
2912
+ menuCode: "system_role",
2913
+ menuName: "角色管理",
2914
+ menuUrl: "/system/role",
2915
+ icon: "role",
2916
+ closable: !0,
2917
+ isDefault: !1,
2918
+ isOut: !1
2919
+ },
2920
+ {
2921
+ menuCode: "system_menu",
2922
+ menuName: "菜单管理",
2923
+ menuUrl: "/system/menu",
2924
+ icon: "menu",
2925
+ closable: !0,
2926
+ isDefault: !1,
2927
+ isOut: !1
2928
+ }
2929
+ ]
2930
+ }
2931
+ ], pt = He({
2932
+ history: Ye(),
2933
+ routes: [...dt, mt],
2934
+ scrollBehavior: () => ({ left: 0, top: 0 })
2935
+ }), Un = ["/login"];
2936
+ pt.beforeEach(async (t, r, u) => {
2937
+ const s = ue();
2938
+ if (s.initTheme(), ot())
2939
+ if (t.path === "/login")
2940
+ u({ path: "/" });
2941
+ else {
2942
+ const o = le();
2943
+ o.isLoggedIn || (o.setUserInfo({
2944
+ appId: Fe(),
2945
+ userId: "1",
2946
+ userName: "管理员",
2947
+ departmentName: "技术部",
2948
+ email: "admin@example.com",
2949
+ mobilePhone: "13800138000",
2950
+ positionName: "管理员",
2951
+ avatar: ""
2952
+ }), de().setMenuList(In)), t.name && t.meta.keepAlive && s.addCachedView(t.name), u();
2953
+ }
2954
+ else
2955
+ Un.includes(t.path) ? u() : u("/login");
2956
+ });
2957
+ function nl() {
2958
+ const t = He({
2959
+ history: Ye(),
2960
+ routes: [...dt, mt]
2961
+ });
2962
+ pt.matcher = t.matcher;
2963
+ }
2964
+ function ll(t, r = {}) {
2965
+ const u = r.indexPath || "/dashboard", s = r.logoSrc || "/vite.svg", o = {
2966
+ path: "/:pathMatch(.*)*",
2967
+ name: "CatchAll",
2968
+ component: () => Promise.resolve().then(() => ut),
2969
+ meta: {
2970
+ title: "404"
2971
+ }
2972
+ };
2973
+ return {
2974
+ path: "/",
2975
+ name: "Layout",
2976
+ component: ne({
2977
+ name: "LayoutWrapper",
2978
+ render() {
2979
+ return Ct(ct, { logoSrc: s });
2980
+ }
2981
+ }),
2982
+ redirect: u,
2983
+ children: [...t, o]
2984
+ };
2985
+ }
2986
+ function rl(t, r = {}) {
2987
+ const u = r.base || ht();
2988
+ return He({
2989
+ history: Ye(u),
2990
+ routes: t,
2991
+ scrollBehavior: () => ({ left: 0, top: 0 })
2992
+ });
2993
+ }
2994
+ const zn = ["login", "404", "403", "/login", "/404", "/403"];
2995
+ function Tn(t, r) {
2996
+ if (r.includes(t)) return !0;
2997
+ const u = t.startsWith("/") ? t.slice(1) : t;
2998
+ return r.includes(u);
2999
+ }
3000
+ function il(t, r = {}) {
3001
+ const u = r.whiteList || zn;
3002
+ t.beforeEach(async (s, o, i) => {
3003
+ const h = ue(), v = le(), d = de(), f = h.loginPath || r.loginPath || "/login";
3004
+ if (h.initTheme(), st())
3005
+ if (s.path === f || s.name === "Login")
3006
+ i({ name: "Dashboard" });
3007
+ else if (v.isLoggedIn)
3008
+ s.name && s.meta.keepAlive && h.addCachedView(s.name), i();
3009
+ else
3010
+ try {
3011
+ if (r.fetchUserInfo) {
3012
+ const g = await r.fetchUserInfo();
3013
+ v.setUserInfo(g);
3014
+ } else {
3015
+ const g = await _t();
3016
+ v.setUserInfo(g);
3017
+ }
3018
+ if (r.fetchMenu) {
3019
+ const g = await r.fetchMenu();
3020
+ d.setMenuList(g);
3021
+ } else {
3022
+ const g = await ft(r.appId);
3023
+ d.setMenuList(g);
3024
+ }
3025
+ r.onLoginSuccess && r.onLoginSuccess(), s.name && s.meta.keepAlive && h.addCachedView(s.name), i({ ...s, replace: !0 });
3026
+ } catch (g) {
3027
+ console.error("获取用户信息失败:", g), v.clearUserInfo(), d.clearMenu(), at(), i({ name: "Login", query: { redirect: s.fullPath } });
3028
+ }
3029
+ else
3030
+ Tn(s.path, u) || s.name === "Login" || s.name === "NotFound" || s.name === "Forbidden" ? i() : i({ name: "Login", query: { redirect: s.fullPath } });
3031
+ }), t.afterEach(() => {
3032
+ });
3033
+ }
3034
+ var En = /* @__PURE__ */ ((t) => (t[t.ENABLED = 1] = "ENABLED", t[t.DISABLED = 0] = "DISABLED", t))(En || {}), Pn = /* @__PURE__ */ ((t) => (t[t.UNKNOWN = 0] = "UNKNOWN", t[t.MALE = 1] = "MALE", t[t.FEMALE = 2] = "FEMALE", t))(Pn || {}), An = /* @__PURE__ */ ((t) => (t[t.DIRECTORY = 0] = "DIRECTORY", t[t.MENU = 1] = "MENU", t[t.BUTTON = 2] = "BUTTON", t))(An || {});
3035
+ const cl = {
3036
+ 1: "启用",
3037
+ 0: "禁用"
3038
+ }, ul = {
3039
+ 0: "未知",
3040
+ 1: "男",
3041
+ 2: "女"
3042
+ }, dl = {
3043
+ 0: "目录",
3044
+ 1: "菜单",
3045
+ 2: "按钮"
3046
+ }, ml = [
3047
+ {
3048
+ label: "启用",
3049
+ value: 1
3050
+ /* ENABLED */
3051
+ },
3052
+ {
3053
+ label: "禁用",
3054
+ value: 0
3055
+ /* DISABLED */
3056
+ }
3057
+ ], pl = [
3058
+ {
3059
+ label: "未知",
3060
+ value: 0
3061
+ /* UNKNOWN */
3062
+ },
3063
+ {
3064
+ label: "男",
3065
+ value: 1
3066
+ /* MALE */
3067
+ },
3068
+ {
3069
+ label: "女",
3070
+ value: 2
3071
+ /* FEMALE */
3072
+ }
3073
+ ], vl = [
3074
+ {
3075
+ label: "目录",
3076
+ value: 0
3077
+ /* DIRECTORY */
3078
+ },
3079
+ {
3080
+ label: "菜单",
3081
+ value: 1
3082
+ /* MENU */
3083
+ },
3084
+ {
3085
+ label: "按钮",
3086
+ value: 2
3087
+ /* BUTTON */
3088
+ }
3089
+ ], hl = {
3090
+ mounted(t, r) {
3091
+ var h, v;
3092
+ const u = le(), s = de();
3093
+ if (!u.isLoggedIn) {
3094
+ (h = t.parentNode) == null || h.removeChild(t);
3095
+ return;
3096
+ }
3097
+ const o = r.value, i = Array.isArray(o) ? o : [o];
3098
+ s.hasPermission(i) || (v = t.parentNode) == null || v.removeChild(t);
3099
+ }
3100
+ };
3101
+ async function _l(t) {
3102
+ await gt(t.basePath);
3103
+ const r = Qe();
3104
+ return r && yt(r), kt({
3105
+ appId: t.appId,
3106
+ clientId: t.clientId,
3107
+ apiBaseUrl: r || t.apiBaseUrl,
3108
+ basePath: t.basePath
3109
+ }), t.basePath && wt(t.basePath), Promise.resolve().then(() => Tt).then(({ useAppStore: u }) => {
3110
+ const s = u();
3111
+ t.appName && s.setAppName(t.appName), t.indexPath && s.setIndexPath(t.indexPath), t.loginPath && s.setLoginPath(t.loginPath);
3112
+ }), t.locale && Promise.resolve().then(() => Nn).then(({ useLocaleStore: u }) => {
3113
+ u().changeLocale(t.locale);
3114
+ }), {
3115
+ config: {
3116
+ appName: t.appName || "XTO App",
3117
+ appId: Fe(),
3118
+ clientId: lt(),
3119
+ apiBaseUrl: Qe(),
3120
+ basePath: t.basePath || "/",
3121
+ indexPath: t.indexPath || "/dashboard",
3122
+ loginPath: t.loginPath || "/login",
3123
+ locale: t.locale || "zh-CN"
3124
+ }
3125
+ };
3126
+ }
3127
+ export {
3128
+ ue as A,
3129
+ Xn as B,
3130
+ Ue as C,
3131
+ Jn as D,
3132
+ Qn as E,
3133
+ Hn as F,
3134
+ Pn as G,
3135
+ Os as H,
3136
+ Je as I,
3137
+ de as J,
3138
+ Zn as K,
3139
+ ct as L,
3140
+ An as M,
3141
+ le as N,
3142
+ En as S,
3143
+ qn as T,
3144
+ re as _,
3145
+ ml as a,
3146
+ vl as b,
3147
+ Yn as c,
3148
+ pl as d,
3149
+ ul as e,
3150
+ dl as f,
3151
+ xn as g,
3152
+ tt as h,
3153
+ _n as i,
3154
+ cl as j,
3155
+ ll as k,
3156
+ rl as l,
3157
+ el as m,
3158
+ _l as n,
3159
+ al as o,
3160
+ tl as p,
3161
+ sl as q,
3162
+ ol as r,
3163
+ mt as s,
3164
+ In as t,
3165
+ hl as u,
3166
+ nl as v,
3167
+ pt as w,
3168
+ il as x,
3169
+ dt as y,
3170
+ Gn as z
3171
+ };