xto-fronted 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,6 +12,104 @@
12
12
  - 🌓 亮色/暗色主题切换
13
13
  - 📱 响应式布局
14
14
 
15
+ ## 安装
16
+
17
+ ```bash
18
+ # npm
19
+ npm install xto-fronted
20
+
21
+ # pnpm
22
+ pnpm add xto-fronted
23
+
24
+ # yarn
25
+ yarn add xto-fronted
26
+ ```
27
+
28
+ ## 快速开始
29
+
30
+ ```typescript
31
+ // main.ts
32
+ import { createApp } from 'vue'
33
+ import { createPinia } from 'pinia'
34
+ import App from './App.vue'
35
+ import router from './router'
36
+
37
+ // 初始化 xto-fronted
38
+ import { createXtoApp } from 'xto-fronted'
39
+
40
+ createXtoApp({
41
+ appName: '我的应用',
42
+ baseUrl: 'https://api.example.com',
43
+ appId: 'MY-APP-ID',
44
+ clientId: 'MY-CLIENT-ID',
45
+ indexPath: '/dashboard',
46
+ loginPath: '/login'
47
+ })
48
+
49
+ // 样式
50
+ import 'xto-fronted/style.css'
51
+ import '@xto/base/es/style.css'
52
+ import '@xto/form/es/style.css'
53
+ import '@xto/feedback/es/style.css'
54
+ import '@xto/navigation/es/style.css'
55
+
56
+ const app = createApp(App)
57
+ app.use(createPinia())
58
+ app.use(router)
59
+ app.mount('#app')
60
+ ```
61
+
62
+ ```typescript
63
+ // router/index.ts
64
+ import { createRouter, createLayoutRoute, Login, NotFound } from 'xto-fronted'
65
+
66
+ const businessRoutes = [
67
+ {
68
+ path: '/dashboard',
69
+ name: 'Dashboard',
70
+ component: () => import('@/views/dashboard/index.vue'),
71
+ meta: { title: '仪表盘', icon: 'dashboard' }
72
+ }
73
+ ]
74
+
75
+ const layoutRoute = createLayoutRoute(businessRoutes, { indexPath: '/dashboard' })
76
+
77
+ const routes = [
78
+ { path: '/login', name: 'Login', component: Login },
79
+ layoutRoute,
80
+ { path: '/:pathMatch(.*)*', redirect: '/404' }
81
+ ]
82
+
83
+ export default createRouter(routes)
84
+ ```
85
+
86
+ ```vue
87
+ <!-- App.vue -->
88
+ <script setup>
89
+ import { useAppStore } from 'xto-fronted'
90
+ const appStore = useAppStore()
91
+ </script>
92
+
93
+ <template>
94
+ <div class="app" :class="{ dark: appStore.isDark }">
95
+ <router-view />
96
+ </div>
97
+ </template>
98
+ ```
99
+
100
+ ## 示例项目
101
+
102
+ 查看 [example](./example) 目录获取完整的示例项目。
103
+
104
+ ```bash
105
+ # 在根目录安装依赖(包含 example)
106
+ pnpm install
107
+
108
+ # 运行示例项目
109
+ cd example
110
+ pnpm dev
111
+ ```
112
+
15
113
  ## 项目结构
16
114
 
17
115
  ```
@@ -1,5 +1,6 @@
1
1
  import { ApiResponse } from '../utils/request';
2
2
  import { LoginResult } from '../types/api';
3
+
3
4
  export interface LoginParams {
4
5
  uid: string;
5
6
  password: string;
@@ -1,3 +1,4 @@
1
1
  import { ApiResponse } from '../utils/request';
2
2
  import { RemoteMenuItem } from '../types/api';
3
+
3
4
  export declare function getUserMenu(): Promise<ApiResponse<RemoteMenuItem[]>>;
@@ -1,5 +1,6 @@
1
1
  import { PageParams, PageResponse } from '../utils/request';
2
2
  import { RoleInfo, MenuItem } from '../types/api';
3
+
3
4
  export declare function getRoleList(params: PageParams & {
4
5
  status?: number;
5
6
  keyword?: string;
@@ -1,3 +1,4 @@
1
1
  import { ApiResponse } from '../utils/request';
2
2
  import { UserInfo } from '../types/api';
3
+
3
4
  export declare function getCurrentUser(): Promise<ApiResponse<UserInfo>>;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,4 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
2
- dropdownRef: HTMLDivElement;
3
- }, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
4
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
@@ -1,15 +1,25 @@
1
- type __VLS_Props = {
1
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
2
2
  logo?: string;
3
3
  title?: string;
4
4
  subtitle?: string;
5
- };
6
- declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
7
- error: (error: any) => any;
8
- success: (data: any) => any;
9
- }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
5
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
6
+ success: (data: any) => void;
7
+ error: (error: any) => void;
8
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
9
+ logo?: string;
10
+ title?: string;
11
+ subtitle?: string;
12
+ }>>> & Readonly<{
10
13
  onError?: ((error: any) => any) | undefined;
11
14
  onSuccess?: ((data: any) => any) | undefined;
12
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
13
- formRef: any;
14
- }, HTMLDivElement>;
15
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
15
16
  export default _default;
17
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
18
+ type __VLS_TypePropsToRuntimeProps<T> = {
19
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
20
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
21
+ } : {
22
+ type: import('vue').PropType<T[K]>;
23
+ required: true;
24
+ };
25
+ };
@@ -1,4 +1,5 @@
1
1
  import { UserInfo, LoginResult } from '../types/api';
2
+
2
3
  export declare function useApp(): {
3
4
  loading: import('vue').Ref<boolean, boolean>;
4
5
  isLoggedIn: import('vue').ComputedRef<boolean>;
@@ -1,4 +1,5 @@
1
1
  import { MenuItem } from '../types/api';
2
+
2
3
  export declare function useMenu(iconMap?: Record<string, string>): {
3
4
  searchKeyword: import('vue').Ref<string, string>;
4
5
  activeMenu: import('vue').ComputedRef<string>;
@@ -1,4 +1,5 @@
1
1
  import { Directive } from 'vue';
2
+
2
3
  declare const permission: Directive;
3
4
  export default permission;
4
5
  export declare function setupPermissionDirective(app: any): void;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { XtoConfig, setConfig, getConfig, getConfigValue } from './config';
2
+
2
3
  export { default as Layout } from './components/Layout/index.vue';
3
4
  export { default as Header } from './components/Layout/Header.vue';
4
5
  export { default as Sidebar } from './components/Layout/Sidebar.vue';
package/dist/index.es.js CHANGED
@@ -726,7 +726,7 @@ const Ye = { class: "sidebar" }, Xe = { class: "sidebar__logo" }, Je = {
726
726
  for (const [n, o] of s)
727
727
  t[n] = o;
728
728
  return t;
729
- }, dt = /* @__PURE__ */ M(ut, [["__scopeId", "data-v-5560e0bb"]]), ht = { class: "header" }, pt = { class: "header__right" }, _t = ["title"], mt = {
729
+ }, dt = /* @__PURE__ */ M(ut, [["__scopeId", "data-v-e0f3701a"]]), ht = { class: "header" }, pt = { class: "header__right" }, _t = ["title"], mt = {
730
730
  key: 0,
731
731
  viewBox: "0 0 24 24",
732
732
  width: "16",
@@ -843,7 +843,7 @@ const Ye = { class: "sidebar" }, Xe = { class: "sidebar__logo" }, Je = {
843
843
  ])
844
844
  ]));
845
845
  }
846
- }), xt = /* @__PURE__ */ M($t, [["__scopeId", "data-v-2bf8f3d2"]]), Tt = { class: "layout" }, Et = { class: "layout__main" }, Ut = { class: "layout__content" }, Nt = /* @__PURE__ */ D({
846
+ }), xt = /* @__PURE__ */ M($t, [["__scopeId", "data-v-151096f1"]]), Tt = { class: "layout" }, Et = { class: "layout__main" }, Ut = { class: "layout__content" }, Nt = /* @__PURE__ */ D({
847
847
  __name: "index",
848
848
  setup(e) {
849
849
  const s = ee(), t = b(
@@ -867,7 +867,7 @@ const Ye = { class: "sidebar" }, Xe = { class: "sidebar__logo" }, Je = {
867
867
  ]);
868
868
  };
869
869
  }
870
- }), Pt = /* @__PURE__ */ M(Nt, [["__scopeId", "data-v-1a24e6d0"]]), Rt = {}, Mt = { class: "tabs-wrapper" };
870
+ }), Pt = /* @__PURE__ */ M(Nt, [["__scopeId", "data-v-5a394347"]]), Rt = {}, Mt = { class: "tabs-wrapper" };
871
871
  function At(e, s) {
872
872
  return k(), L("div", Mt);
873
873
  }
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(a,R){typeof exports=="object"&&typeof module<"u"?R(exports,require("axios"),require("@xto/feedback"),require("vue"),require("pinia"),require("vue-router"),require("@xto/navigation"),require("@xto/base"),require("@xto/form")):typeof define=="function"&&define.amd?define(["exports","axios","@xto/feedback","vue","pinia","vue-router","@xto/navigation","@xto/base","@xto/form"],R):(a=typeof globalThis<"u"?globalThis:a||self,R(a.XtoFronted={},a.axios,a.feedback,a.Vue,a.Pinia,a.VueRouter,a.navigation,a.base,a.form))})(this,function(a,R,B,e,q,I,H,K,T){"use strict";let M={...{appName:"XTO App",baseUrl:"",appId:"",clientId:"",indexPath:"/dashboard",loginPath:"/login"}};function ee(t){M={...M,...t}}function V(){return M}function ge(t){return M[t]}const j=()=>`tooyu-cloud:${M.appId}:`,te=t=>({get(o){const n=j(),s=t.getItem(n+o);if(!s)return null;try{return JSON.parse(s)}catch{return s}},set(o,n){const s=j();if(n==null){t.removeItem(s+o);return}const r=typeof n=="string"?n:JSON.stringify(n);t.setItem(s+o,r)},remove(o){const n=j();t.removeItem(n+o)},clear(){const o=j();Object.keys(t).forEach(s=>{s.startsWith(o)&&t.removeItem(s)})}}),F=te(window.localStorage),O=te(window.sessionStorage),_={get:F.get,set:F.set,remove:F.remove,clear:F.clear},ye={get:O.get,set:O.set,remove:O.remove,clear:O.clear},X="login_info",W="user_info",P=()=>_.get(X),ne=t=>{const o={accessToken:t.access_token,refreshToken:t.refresh_token,expiresTime:t.expires_time,refreshTime:t.refresh_time,tokenType:t.token_type,code:t.code};_.set(X,o)},J=()=>{const t=P();return(t==null?void 0:t.accessToken)||null},oe=()=>{const t=P();return(t==null?void 0:t.tokenType)||"Bearer"},ke=()=>{const t=P();return(t==null?void 0:t.code)||null},G=()=>{_.remove(X),_.remove(W)},Q=()=>!!J(),Ee=t=>{_.set(W,t)},Ne=()=>_.get(W),we=()=>{_.remove(W)},Ce=()=>{const t=V(),o=R.create({baseURL:t.baseUrl,timeout:15e3,headers:{"Content-Type":"application/json"}});return o.interceptors.request.use(n=>{const s=J();if(s){const r=oe();n.headers.Authorization=`${r} ${s}`}return n},n=>Promise.reject(n)),o.interceptors.response.use(n=>{const{data:s}=n;return s.code===200||s.code===0?n:(B.Message.error(s.message||"请求失败"),Promise.reject(new Error(s.message||"请求失败")))},n=>{var r;const{response:s}=n;if(s)switch(s.status){case 401:case 403:B.Message.error("登录已过期,请重新登录"),G(),window.location.href="/login";break;case 404:B.Message.error("请求资源不存在");break;case 500:B.Message.error("服务器错误");break;default:B.Message.error(((r=s.data)==null?void 0:r.message)||"请求失败")}else B.Message.error("网络连接失败");return Promise.reject(n)}),o};let Y=null;function $(){return Y||(Y=Ce()),Y}function se(){Y=null}new Proxy({},{get(t,o){return $()[o]}});const D={get(t,o){return $().get(t,o).then(n=>n.data)},post(t,o,n){return $().post(t,o,n).then(s=>s.data)},put(t,o,n){return $().put(t,o,n).then(s=>s.data)},patch(t,o,n){return $().patch(t,o,n).then(s=>s.data)},delete(t,o){return $().delete(t,o).then(n=>n.data)}},x=q.defineStore("app",()=>{const t=e.ref(_.get("isDark")||!1),o=e.ref(_.get("theme")||"light"),n=e.ref(_.get("layout")||"sidebar"),s=e.ref(_.get("isCollapsed")||!1),r=e.ref(_.get("showTabs")??!0),m=e.ref(_.get("showFooter")??!0),l=e.ref(_.get("showBreadcrumb")??!0),c=e.ref(_.get("primaryColor")||"#409eff"),f=e.ref([]),k=e.computed(()=>t.value?"dark":"light"),g=()=>{t.value=!t.value,o.value=t.value?"dark":"light",h()},u=C=>{o.value=C,t.value=C==="dark",h()},h=()=>{const C=document.documentElement;t.value?C.classList.add("dark"):C.classList.remove("dark"),_.set("isDark",t.value),_.set("theme",o.value)},E=()=>{s.value=!s.value,_.set("isCollapsed",s.value)},i=C=>{n.value=C,_.set("layout",C)},N=()=>{r.value=!r.value,_.set("showTabs",r.value)},d=()=>{m.value=!m.value,_.set("showFooter",m.value)},y=()=>{l.value=!l.value,_.set("showBreadcrumb",l.value)},p=C=>{c.value=C,document.documentElement.style.setProperty("--color-primary",C),_.set("primaryColor",C)},w=C=>{f.value.includes(C)||f.value.push(C)},b=C=>{const _e=f.value.indexOf(C);_e>-1&&f.value.splice(_e,1)},S=()=>{f.value=[]},U=()=>{h(),c.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",c.value)};return e.watch(t,h),{isDark:t,theme:o,layout:n,isCollapsed:s,showTabs:r,showFooter:m,showBreadcrumb:l,primaryColor:c,cachedViews:f,themeClass:k,toggleTheme:g,toggleCollapse:E,setTheme:u,setLayout:i,toggleTabs:N,toggleFooter:d,toggleBreadcrumb:y,setPrimaryColor:p,addCachedView:w,removeCachedView:b,clearCachedViews:S,initTheme:U}}),Ve="/vite.svg",Z=q.defineStore("auth",()=>{const t=e.ref(P()),o=e.computed(()=>Q()),n=c=>{ne(c),t.value=P()},s=()=>{t.value=null,G()},r=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.accessToken)||null}),m=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.tokenType)||"Bearer"}),l=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.code)||null});return{loginInfo:t,isLoggedIn:o,accessToken:r,tokenType:m,code:l,login:n,logout:s}}),v=q.defineStore("user",()=>{const t=e.ref(_.get("user_info")),o=e.computed(()=>!!t.value),n=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.userName)||""}),s=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.avatar)||""}),r=e.computed(()=>{var c;return(c=t.value)==null?void 0:c.userId});return{userInfo:t,isLoggedIn:o,userName:n,avatar:s,userId:r,setUserInfo:c=>{t.value=c,_.set("user_info",c)},clearUserInfo:()=>{t.value=null,_.remove("user_info")}}}),A=q.defineStore("menu",()=>{const t="menu_list",o="menu_btn_list",n=e.ref(_.get(t)||[]),s=e.ref(_.get(o)||{}),r=e.computed(()=>n.value.length>0),m=e.computed(()=>{const u=V();function h(i){if(i&&i.length>0)for(let N=0;N<i.length;N++){const d=i[N];if(d.default)return d.path;{const y=h(d.children||[]);if(y)return y}}return null}return h(n.value)||u.indexPath||"/dashboard"}),l=(u,h)=>{const E=[];return!u||u.length<=0||u.forEach(i=>{if(i.type===1){const N={code:i.menuCode,name:i.menuName,path:"",title:i.menuName},d=h||"";let y=s.value[d]||[];y.push(N),s.value[d]=y}else{const N=[];let d=i.menuUrl,y=i.isOut||!1;!y&&i.menuUrl&&(i.menuUrl.startsWith("http")?d="/iframe/"+encodeURIComponent(d):i.menuUrl.startsWith("keep-alive:")&&(d="/iframe/keep-alive/"+encodeURIComponent(d.split("keep-alive:")[1])));const p={code:i.menuCode,name:i.menuName,path:d,icon:i.icon,closable:i.closable,default:i.isDefault,out:y,children:N,title:i.menuName};if(E.push(p),i.children&&i.children.length>0){const w=l(i.children,i.menuUrl);p.children=w}}}),E},c=u=>{n.value=u,_.set(t,u)},f=u=>{const h=n.value.findIndex(E=>E.code==="home");h>-1&&n.value.splice(h,1),n.value.unshift({...u,code:"home",name:"首页"}),_.set(t,n.value)},k=(u,h)=>{if(g(),!(h!=null&&h.skipIndexMenu)){const i=V();n.value.push({code:"home",name:"首页",icon:"home",closable:!1,default:!1,out:!1,path:i.indexPath||"/dashboard",title:"首页"})}const E=l(u);n.value.push(...E),_.set(t,n.value),_.set(o,s.value)},g=()=>{n.value=[],s.value={},_.remove(t),_.remove(o)};return{menuList:n,menuBtnListMap:s,hasMenu:r,index:m,setMenuList:c,setIndexMenu:f,setMenuFromRemote:k,clearMenu:g}});function re(t){const o=V();return D.post("/user/v1.0/login/by-domain",{appId:o.appId,clientId:o.clientId,uid:t.uid,password:t.password,code:!0})}function ae(){return D.put("/user/v1.0/user/logout")}function be(t,o){return D.get(`/user/v1.0/login/by-code?appId=${t}&code=${o}`)}function ce(){return D.get("/user/v1.0/user/get-me")}function le(){return D.get(`/user/v1.0/menu/get-menu?appId=${M.appId}`)}function z(){const t=I.useRouter(),o=I.useRoute(),n=Z(),s=v(),r=A(),m=e.ref(!1),l=e.computed(()=>n.isLoggedIn),c=e.computed(()=>s.userInfo),f=e.computed(()=>s.userName||""),k=e.computed(()=>r.menuList),g=e.computed(()=>r.index),u=async(y,p)=>{m.value=!0;try{d();const b=(await re({uid:y,password:p})).data;n.login(b),await E(),await i();const S=o.query.redirectUrl;if(S){const U=decodeURIComponent(S);if(U.startsWith("http")){const C=b.code;location.href=U.includes("?")?`${U}&code=${C}`:`${U}?code=${C}`}else await t.replace(U)}else await t.replace(g.value||"/");return B.Message.success("登录成功"),{success:!0,data:b}}catch(w){return B.Message.error((w==null?void 0:w.message)||"登录失败"),{success:!1,error:w}}finally{m.value=!1}},h=async(y=!0)=>{const p=V();try{await ae()}catch(w){console.error("退出登录接口失败",w)}finally{d(),t.push(p.loginPath||"/login"),y&&B.Message.success("退出登录成功")}},E=async()=>{const y=await ce();return s.setUserInfo(y.data),y.data},i=async()=>{const y=await le();return r.setMenuFromRemote(y.data),r.menuList},N=async()=>{if(!n.isLoggedIn)return!1;try{return s.userInfo||await E(),r.hasMenu||await i(),!0}catch(y){return console.error("初始化应用失败",y),d(),!1}},d=()=>{n.logout(),s.clearUserInfo(),r.clearMenu()};return{loading:m,isLoggedIn:l,userInfo:c,userName:f,menuList:k,indexPath:g,login:u,logout:h,loadUserInfo:E,loadMenu:i,initApp:N,clearAllState:d}}function Ie(){const t=A(),o=Z(),n=v(),s=e.computed(()=>o.isLoggedIn),r=e.computed(()=>n.userName),m=e.computed(()=>n.userInfo),l=g=>{const u=window.location.pathname,E=(t.menuBtnListMap[u]||[]).map(i=>i.code);return Array.isArray(g)?g.some(i=>E.includes(i)):E.includes(g)};return{isLoggedIn:s,userName:r,userInfo:m,hasPermission:l,hasAnyPermission:g=>g.some(u=>l(u)),hasAllPermissions:g=>g.every(u=>l(u)),getCurrentPagePermissions:()=>{const g=window.location.pathname;return(t.menuBtnListMap[g]||[]).map(h=>h.code)}}}const Se={home:"🏠",dashboard:"📊",system:"⚙️",user:"👤",role:"👥",menu:"📋",setting:"🔧"};function ie(t){const o=I.useRoute(),n=I.useRouter(),s=A(),r=x(),m={...Se,...t},l=e.ref(""),c=e.computed(()=>o.path),f=e.computed(()=>r.isCollapsed),k=e.computed(()=>s.menuList),g=e.computed(()=>s.hasMenu),u=(p,w="")=>{const b=[];return p.forEach(S=>{S.children&&S.children.length>0?b.push(...u(S.children,S.title)):b.push({...S,parentTitle:w})}),b},h=e.computed(()=>l.value.trim()?u(k.value).filter(w=>w.title.toLowerCase().includes(l.value.toLowerCase())):[]),E=e.computed(()=>l.value.trim()?k.value.map(p=>{if(p.children&&p.children.length>0){const w=p.children.filter(b=>b.title.toLowerCase().includes(l.value.toLowerCase()));return w.length>0?{...p,children:w}:null}return p.title.toLowerCase().includes(l.value.toLowerCase())?p:null}).filter(Boolean):k.value);return{searchKeyword:l,activeMenu:c,isCollapsed:f,menuList:k,hasMenu:g,searchResults:h,filteredMenuList:E,flattenMenus:u,getMenuIcon:p=>m[p||""]||"📄",handleMenuSelect:p=>{p&&p!==o.path&&(n.push(p),l.value="")},handleSearchItemClick:p=>{n.push(p),l.value=""},clearSearch:()=>{l.value=""}}}function Be(t,o={}){const{rules:n,onSubmit:s}=o,r=e.ref(),m=e.reactive({...t}),l=e.ref(!1),c=e.ref(!1),f=e.ref(!1),k=()=>{h(),f.value=!1,c.value=!0},g=i=>{Object.assign(m,i),f.value=!0,c.value=!0},u=()=>{c.value=!1,h()},h=()=>{var i;Object.keys(t).forEach(N=>{m[N]=t[N]}),(i=r.value)==null||i.resetFields()};return{formRef:r,formData:m,rules:n,loading:l,visible:c,isEdit:f,openAdd:k,openEdit:g,close:u,resetForm:h,handleSubmit:async()=>{var i;try{await((i=r.value)==null?void 0:i.validate()),l.value=!0,await(s==null?void 0:s(m)),u()}catch(N){console.error(N)}finally{l.value=!1}}}}function Le(t){const{fetchData:o,defaultPageSize:n=10}=t,s=e.ref(!1),r=e.ref([]),m=e.ref(0),l=e.ref(1),c=e.ref(n),f=e.reactive({}),k=async()=>{s.value=!0;try{const d={...f,page:l.value,pageSize:c.value},y=await o(d);r.value=y.list,m.value=y.total}catch(d){console.error(d)}finally{s.value=!1}},g=()=>{l.value=1,k()},u=()=>{Object.keys(f).forEach(d=>{f[d]=void 0}),l.value=1,k()},h=d=>{l.value=d,k()},E=d=>{c.value=d,l.value=1,k()},i=()=>{k()},N=e.computed(()=>({current:l.value,pageSize:c.value,total:m.value}));return{loading:s,data:r,total:m,currentPage:l,pageSize:c,searchParams:f,pagination:N,getData:k,handleSearch:g,handleReset:u,handlePageChange:h,handleSizeChange:E,refresh:i}}const Te={class:"sidebar"},$e={class:"sidebar__logo"},Ue={key:0,class:"sidebar__search"},Me={key:0,class:"sidebar__search-results"},Pe=["onClick"],De={class:"menu-icon"},Ae={class:"sidebar__search-item-info"},Re={class:"sidebar__search-item-title"},Fe={key:0,class:"sidebar__search-item-parent"},Oe={class:"menu-icon"},xe={class:"menu-icon"},ze={class:"menu-icon"},qe={key:1,class:"sidebar__user"},He={class:"sidebar__user-info"},Ke={class:"sidebar__user-name"},je={class:"sidebar__user-role"},We=e.defineComponent({__name:"Sidebar",setup(t){const{logout:o,userName:n,userInfo:s}=z(),r=V(),{searchKeyword:m,activeMenu:l,isCollapsed:c,searchResults:f,filteredMenuList:k,getMenuIcon:g,handleMenuSelect:u,handleSearchItemClick:h}=ie();return(E,i)=>{var N;return e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("div",$e,[i[1]||(i[1]=e.createElementVNode("img",{src:Ve,alt:"Logo",class:"sidebar__logo-img"},null,-1)),e.withDirectives(e.createElementVNode("span",{class:"sidebar__logo-text"},e.toDisplayString(e.unref(r).appName),513),[[e.vShow,!e.unref(c)]])]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ue,[e.createVNode(e.unref(T.Input),{modelValue:e.unref(m),"onUpdate:modelValue":i[0]||(i[0]=d=>e.isRef(m)?m.value=d:null),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),e.unref(f).length>0?(e.openBlock(),e.createElementBlock("div",Me,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f),d=>(e.openBlock(),e.createElementBlock("div",{key:d.path,class:"sidebar__search-item",onClick:y=>e.unref(h)(d.path)},[e.createElementVNode("span",De,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("div",Ae,[e.createElementVNode("span",Re,e.toDisplayString(d.title),1),d.parentTitle?(e.openBlock(),e.createElementBlock("span",Fe,e.toDisplayString(d.parentTitle),1)):e.createCommentVNode("",!0)])],8,Pe))),128))])):e.createCommentVNode("",!0)])),e.createVNode(e.unref(H.Menu),{"default-active":e.unref(l),collapse:e.unref(c),"collapse-transition":!1,class:"sidebar__menu",onSelect:e.unref(u)},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k),d=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:d.path},[d.children&&d.children.length>0?(e.openBlock(),e.createBlock(e.unref(H.SubMenu),{key:0,index:d.path},{title:e.withCtx(()=>[e.createElementVNode("span",Oe,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.children,y=>(e.openBlock(),e.createBlock(e.unref(H.MenuItem),{key:y.path,index:y.path},{default:e.withCtx(()=>[e.createElementVNode("span",xe,e.toDisplayString(e.unref(g)(y.icon)),1),e.createElementVNode("span",null,e.toDisplayString(y.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(H.MenuItem),{key:1,index:d.path},{default:e.withCtx(()=>[e.createElementVNode("span",ze,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse","onSelect"]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",qe,[e.createElementVNode("div",He,[e.createElementVNode("span",Ke,e.toDisplayString(e.unref(n)||"用户"),1),e.createElementVNode("span",je,e.toDisplayString(((N=e.unref(s))==null?void 0:N.departmentName)||""),1)]),e.createVNode(e.unref(K.Button),{type:"text",size:"small",onClick:e.unref(o)},{default:e.withCtx(()=>[...i[2]||(i[2]=[e.createTextVNode("退出",-1)])]),_:1},8,["onClick"])]))])}}}),L=(t,o)=>{const n=t.__vccOpts||t;for(const[s,r]of o)n[s]=r;return n},de=L(We,[["__scopeId","data-v-5560e0bb"]]),Ye={class:"header"},Xe={class:"header__right"},Je=["title"],Ge={key:0,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},Qe={key:1,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},Ze={key:0},ve={key:1},et={class:"header__avatar"},tt={class:"header__user-name"},nt={key:0,class:"header__dropdown"},ot={class:"header__dropdown-header"},st={class:"header__dropdown-avatar"},rt={class:"header__dropdown-info"},at={class:"header__dropdown-name"},ct={class:"header__dropdown-role"},ue=L(e.defineComponent({__name:"Header",setup(t){const o=x(),{logout:n,userName:s,userInfo:r}=z(),m=e.ref(!1),l=e.ref(null),c=e.ref(!1),f=e.computed(()=>s.value||"用户"),k=()=>{o.toggleCollapse()},g=()=>{o.toggleTheme()},u=()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},h=()=>{c.value=!!document.fullscreenElement},E=()=>{m.value=!m.value},i=()=>{m.value=!1},N=async()=>{i(),await n()},d=y=>{l.value&&!l.value.contains(y.target)&&i()};return e.onMounted(()=>{document.addEventListener("click",d),document.addEventListener("fullscreenchange",h)}),e.onUnmounted(()=>{document.removeEventListener("click",d),document.removeEventListener("fullscreenchange",h)}),(y,p)=>(e.openBlock(),e.createElementBlock("div",Ye,[e.createElementVNode("div",{class:"header__left"},[e.createElementVNode("div",{class:"header__collapse",onClick:k},[...p[0]||(p[0]=[e.createElementVNode("span",null,"☰",-1)])])]),e.createElementVNode("div",Xe,[e.createElementVNode("div",{class:"header__action",onClick:u,title:c.value?"退出全屏":"全屏"},[c.value?(e.openBlock(),e.createElementBlock("svg",Ge,[...p[1]||(p[1]=[e.createElementVNode("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",Qe,[...p[2]||(p[2]=[e.createElementVNode("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"},null,-1)])]))],8,Je),e.createElementVNode("div",{class:"header__action",onClick:g,title:"切换主题"},[e.unref(o).isDark?(e.openBlock(),e.createElementBlock("span",Ze,"🌙")):(e.openBlock(),e.createElementBlock("span",ve,"☀️"))]),e.createElementVNode("div",{class:"header__user",ref_key:"dropdownRef",ref:l},[e.createElementVNode("div",{class:"header__user-trigger",onClick:e.withModifiers(E,["stop"])},[e.createElementVNode("div",et,[e.createElementVNode("span",null,e.toDisplayString(f.value.charAt(0)),1)]),e.createElementVNode("span",tt,e.toDisplayString(f.value),1),e.createElementVNode("span",{class:e.normalizeClass(["header__user-arrow",{"is-active":m.value}])},"▼",2)]),e.createVNode(e.Transition,{name:"dropdown"},{default:e.withCtx(()=>{var w;return[m.value?(e.openBlock(),e.createElementBlock("div",nt,[e.createElementVNode("div",ot,[e.createElementVNode("div",st,[e.createElementVNode("span",null,e.toDisplayString(f.value.charAt(0)),1)]),e.createElementVNode("div",rt,[e.createElementVNode("div",at,e.toDisplayString(f.value),1),e.createElementVNode("div",ct,e.toDisplayString(((w=e.unref(r))==null?void 0:w.departmentName)||""),1)])]),p[4]||(p[4]=e.createElementVNode("div",{class:"header__dropdown-divider"},null,-1)),e.createElementVNode("div",{class:"header__dropdown-menu"},[e.createElementVNode("div",{class:"header__dropdown-item header__dropdown-item--danger",onClick:N},[...p[3]||(p[3]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"🚪",-1),e.createElementVNode("span",null,"退出登录",-1)])])])])):e.createCommentVNode("",!0)]}),_:1})],512)])]))}}),[["__scopeId","data-v-2bf8f3d2"]]),lt={class:"layout"},it={class:"layout__main"},dt={class:"layout__content"},me=L(e.defineComponent({__name:"index",setup(t){const o=x(),n=e.computed(()=>o.isCollapsed?"64px":"210px");return(s,r)=>{const m=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",lt,[e.createElementVNode("aside",{class:"layout__aside",style:e.normalizeStyle({width:n.value})},[e.createVNode(de)],4),e.createElementVNode("div",it,[e.createVNode(ue,{class:"layout__header"}),e.createElementVNode("main",dt,[e.createVNode(m)])])])}}}),[["__scopeId","data-v-1a24e6d0"]]),ut={},mt={class:"tabs-wrapper"};function ft(t,o){return e.openBlock(),e.createElementBlock("div",mt)}const ht=L(ut,[["render",ft],["__scopeId","data-v-3b1e382a"]]),pt={},_t={class:"footer"};function gt(t,o){return e.openBlock(),e.createElementBlock("div",_t,[...o[0]||(o[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const yt=L(pt,[["render",gt],["__scopeId","data-v-317ae311"]]),kt={class:"login"},Et={class:"login__container"},Nt={class:"login__header"},wt=["src"],Ct={class:"login__title"},Vt={class:"login__subtitle"},bt=L(e.defineComponent({__name:"index",props:{logo:{},title:{},subtitle:{}},emits:["success","error"],setup(t,{emit:o}){const n=o,{login:s,loading:r}=z(),m=V(),l=e.reactive({uid:"",password:""}),c={uid:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},f=e.ref(),k=async()=>{var g;try{await((g=f.value)==null?void 0:g.validate());const u=await s(l.uid,l.password);u.success?n("success",u.data):n("error",u.error)}catch(u){console.error("登录失败",u),n("error",u)}};return(g,u)=>(e.openBlock(),e.createElementBlock("div",kt,[e.createElementVNode("div",Et,[e.createElementVNode("div",Nt,[e.createElementVNode("img",{src:t.logo||"/vite.svg",alt:"Logo",class:"login__logo"},null,8,wt),e.createElementVNode("h1",Ct,e.toDisplayString(t.title||e.unref(m).appName),1),e.createElementVNode("p",Vt,e.toDisplayString(t.subtitle||"后台管理系统"),1)]),e.createVNode(e.unref(T.Form),{ref_key:"formRef",ref:f,model:l,rules:c,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.FormItem),{prop:"uid"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.Input),{modelValue:l.uid,"onUpdate:modelValue":u[0]||(u[0]=h=>l.uid=h),placeholder:"请输入账号",size:"large"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(T.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.Input),{modelValue:l.password,"onUpdate:modelValue":u[1]||(u[1]=h=>l.password=h),type:"password",placeholder:"请输入密码",size:"large","show-password":"",onKeyup:e.withKeys(k,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(T.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Button),{type:"primary",size:"large",loading:e.unref(r),class:"login__submit",onClick:k},{default:e.withCtx(()=>[...u[2]||(u[2]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])]))}}),[["__scopeId","data-v-fdb37509"]]),It={class:"error-page"},St={class:"error-page__content"},Bt=L(e.defineComponent({__name:"404",setup(t){const o=I.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",It,[e.createElementVNode("div",St,[r[1]||(r[1]=e.createElementVNode("div",{class:"error-page__code"},"404",-1)),r[2]||(r[2]=e.createElementVNode("div",{class:"error-page__title"},"页面不存在",-1)),r[3]||(r[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您访问的页面不存在或已被删除",-1)),e.createVNode(e.unref(K.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-6fc8a81b"]]),Lt={class:"error-page"},Tt={class:"error-page__content"},$t=L(e.defineComponent({__name:"403",setup(t){const o=I.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Lt,[e.createElementVNode("div",Tt,[r[1]||(r[1]=e.createElementVNode("div",{class:"error-page__code"},"403",-1)),r[2]||(r[2]=e.createElementVNode("div",{class:"error-page__title"},"无访问权限",-1)),r[3]||(r[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您没有权限访问此页面",-1)),e.createVNode(e.unref(K.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-f9466667"]]);function Ut(t){const o=A(),n=window.location.pathname,r=(o.menuBtnListMap[n]||[]).map(m=>m.code);return Array.isArray(t)?t.some(m=>r.includes(m)):r.includes(t)}function Mt(){return!0}const Pt=["/login","/404","/403"];function Dt(t,o){const n=V(),s=I.createRouter({history:I.createWebHistory((o==null?void 0:o.base)||""),routes:t,scrollBehavior:(o==null?void 0:o.scrollBehavior)||(()=>({left:0,top:0}))});return s.beforeEach(async(r,m,l)=>{const c=x();if(c.initTheme(),Q())if(r.path===n.loginPath)l({path:n.indexPath||"/"});else{const{initApp:f,isLoggedIn:k}=z();if(!k.value&&!await f()){l(n.loginPath||"/login");return}r.name&&r.meta.keepAlive&&c.addCachedView(r.name),l()}else Pt.includes(r.path)?l():l({path:n.loginPath||"/login",query:{redirectUrl:encodeURIComponent(r.fullPath)}})}),s}function At(t,o){const n=I.createRouter({history:I.createWebHistory(),routes:o});t.matcher=n.matcher}function Rt(t){const o=V();return[{path:(t==null?void 0:t.loginPath)||o.loginPath||"/login",name:"Login",component:t==null?void 0:t.loginComponent,meta:{title:"登录",hidden:!0}},{path:"/404",name:"NotFound",component:t==null?void 0:t.notFoundComponent,meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:t==null?void 0:t.forbiddenComponent,meta:{title:"403",hidden:!0}},{path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}}]}function Ft(t,o={}){const n=o.indexPath||"/dashboard";return{path:"/",name:"Layout",component:o.layoutComponent||me,redirect:n,children:t}}function Ot(t={}){return[{path:"/404",name:"NotFound",component:t.notFoundComponent,meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:t.forbiddenComponent,meta:{title:"403",hidden:!0}},{path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}}]}var fe=(t=>(t[t.ENABLED=1]="ENABLED",t[t.DISABLED=0]="DISABLED",t))(fe||{}),he=(t=>(t[t.UNKNOWN=0]="UNKNOWN",t[t.MALE=1]="MALE",t[t.FEMALE=2]="FEMALE",t))(he||{}),pe=(t=>(t[t.DIRECTORY=0]="DIRECTORY",t[t.MENU=1]="MENU",t[t.BUTTON=2]="BUTTON",t))(pe||{});const xt={1:"启用",0:"禁用"},zt={0:"未知",1:"男",2:"女"},qt={0:"目录",1:"菜单",2:"按钮"},Ht=[{label:"启用",value:1},{label:"禁用",value:0}],Kt=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],jt=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],Wt={mounted(t,o){var f;const n=A(),{value:s}=o;if(!s)return;const r=window.location.pathname,l=(n.menuBtnListMap[r]||[]).map(k=>k.code);let c=!1;Array.isArray(s)?c=s.some(k=>l.includes(k)):c=l.includes(s),c||(f=t.parentNode)==null||f.removeChild(t)}};function Yt(t){return ee(t),se(),{config:V()}}a.Footer=yt,a.Forbidden=$t,a.Gender=he,a.GenderOptions=Kt,a.GenderText=zt,a.Header=ue,a.Layout=me,a.Login=bt,a.MenuType=pe,a.MenuTypeOptions=jt,a.MenuTypeText=qt,a.NotFound=Bt,a.Sidebar=de,a.Status=fe,a.StatusOptions=Ht,a.StatusText=xt,a.Tabs=ht,a.clearToken=G,a.clearUserInfo=we,a.createErrorRoutes=Ot,a.createLayoutRoute=Ft,a.createRouter=Dt,a.createStaticRoutes=Rt,a.createXtoApp=Yt,a.getCode=ke,a.getConfig=V,a.getConfigValue=ge,a.getCurrentUser=ce,a.getLoginInfo=P,a.getRequest=$,a.getToken=J,a.getTokenType=oe,a.getUserInfo=Ne,a.getUserMenu=le,a.hasPermission=Ut,a.hasToken=Q,a.http=D,a.isAdmin=Mt,a.local=_,a.localStorageUtil=F,a.login=re,a.loginByCode=be,a.logout=ae,a.permissionDirective=Wt,a.resetRequest=se,a.resetRouter=At,a.session=ye,a.sessionStorageUtil=O,a.setConfig=ee,a.setLoginInfo=ne,a.setUserInfo=Ee,a.useApp=z,a.useAppStore=x,a.useAuth=Ie,a.useAuthStore=Z,a.useForm=Be,a.useMenu=ie,a.useMenuStore=A,a.useTable=Le,a.useUserStore=v,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
1
+ (function(a,R){typeof exports=="object"&&typeof module<"u"?R(exports,require("axios"),require("@xto/feedback"),require("vue"),require("pinia"),require("vue-router"),require("@xto/navigation"),require("@xto/base"),require("@xto/form")):typeof define=="function"&&define.amd?define(["exports","axios","@xto/feedback","vue","pinia","vue-router","@xto/navigation","@xto/base","@xto/form"],R):(a=typeof globalThis<"u"?globalThis:a||self,R(a.XtoFronted={},a.axios,a.feedback,a.Vue,a.Pinia,a.VueRouter,a.navigation,a.base,a.form))})(this,function(a,R,B,e,q,I,H,K,T){"use strict";let M={...{appName:"XTO App",baseUrl:"",appId:"",clientId:"",indexPath:"/dashboard",loginPath:"/login"}};function ee(t){M={...M,...t}}function V(){return M}function ge(t){return M[t]}const j=()=>`tooyu-cloud:${M.appId}:`,te=t=>({get(o){const n=j(),s=t.getItem(n+o);if(!s)return null;try{return JSON.parse(s)}catch{return s}},set(o,n){const s=j();if(n==null){t.removeItem(s+o);return}const r=typeof n=="string"?n:JSON.stringify(n);t.setItem(s+o,r)},remove(o){const n=j();t.removeItem(n+o)},clear(){const o=j();Object.keys(t).forEach(s=>{s.startsWith(o)&&t.removeItem(s)})}}),F=te(window.localStorage),O=te(window.sessionStorage),_={get:F.get,set:F.set,remove:F.remove,clear:F.clear},ye={get:O.get,set:O.set,remove:O.remove,clear:O.clear},X="login_info",W="user_info",P=()=>_.get(X),ne=t=>{const o={accessToken:t.access_token,refreshToken:t.refresh_token,expiresTime:t.expires_time,refreshTime:t.refresh_time,tokenType:t.token_type,code:t.code};_.set(X,o)},J=()=>{const t=P();return(t==null?void 0:t.accessToken)||null},oe=()=>{const t=P();return(t==null?void 0:t.tokenType)||"Bearer"},ke=()=>{const t=P();return(t==null?void 0:t.code)||null},G=()=>{_.remove(X),_.remove(W)},Q=()=>!!J(),Ee=t=>{_.set(W,t)},Ne=()=>_.get(W),we=()=>{_.remove(W)},Ce=()=>{const t=V(),o=R.create({baseURL:t.baseUrl,timeout:15e3,headers:{"Content-Type":"application/json"}});return o.interceptors.request.use(n=>{const s=J();if(s){const r=oe();n.headers.Authorization=`${r} ${s}`}return n},n=>Promise.reject(n)),o.interceptors.response.use(n=>{const{data:s}=n;return s.code===200||s.code===0?n:(B.Message.error(s.message||"请求失败"),Promise.reject(new Error(s.message||"请求失败")))},n=>{var r;const{response:s}=n;if(s)switch(s.status){case 401:case 403:B.Message.error("登录已过期,请重新登录"),G(),window.location.href="/login";break;case 404:B.Message.error("请求资源不存在");break;case 500:B.Message.error("服务器错误");break;default:B.Message.error(((r=s.data)==null?void 0:r.message)||"请求失败")}else B.Message.error("网络连接失败");return Promise.reject(n)}),o};let Y=null;function $(){return Y||(Y=Ce()),Y}function se(){Y=null}new Proxy({},{get(t,o){return $()[o]}});const D={get(t,o){return $().get(t,o).then(n=>n.data)},post(t,o,n){return $().post(t,o,n).then(s=>s.data)},put(t,o,n){return $().put(t,o,n).then(s=>s.data)},patch(t,o,n){return $().patch(t,o,n).then(s=>s.data)},delete(t,o){return $().delete(t,o).then(n=>n.data)}},x=q.defineStore("app",()=>{const t=e.ref(_.get("isDark")||!1),o=e.ref(_.get("theme")||"light"),n=e.ref(_.get("layout")||"sidebar"),s=e.ref(_.get("isCollapsed")||!1),r=e.ref(_.get("showTabs")??!0),m=e.ref(_.get("showFooter")??!0),l=e.ref(_.get("showBreadcrumb")??!0),c=e.ref(_.get("primaryColor")||"#409eff"),f=e.ref([]),k=e.computed(()=>t.value?"dark":"light"),g=()=>{t.value=!t.value,o.value=t.value?"dark":"light",h()},u=C=>{o.value=C,t.value=C==="dark",h()},h=()=>{const C=document.documentElement;t.value?C.classList.add("dark"):C.classList.remove("dark"),_.set("isDark",t.value),_.set("theme",o.value)},E=()=>{s.value=!s.value,_.set("isCollapsed",s.value)},i=C=>{n.value=C,_.set("layout",C)},N=()=>{r.value=!r.value,_.set("showTabs",r.value)},d=()=>{m.value=!m.value,_.set("showFooter",m.value)},y=()=>{l.value=!l.value,_.set("showBreadcrumb",l.value)},p=C=>{c.value=C,document.documentElement.style.setProperty("--color-primary",C),_.set("primaryColor",C)},w=C=>{f.value.includes(C)||f.value.push(C)},b=C=>{const _e=f.value.indexOf(C);_e>-1&&f.value.splice(_e,1)},S=()=>{f.value=[]},U=()=>{h(),c.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",c.value)};return e.watch(t,h),{isDark:t,theme:o,layout:n,isCollapsed:s,showTabs:r,showFooter:m,showBreadcrumb:l,primaryColor:c,cachedViews:f,themeClass:k,toggleTheme:g,toggleCollapse:E,setTheme:u,setLayout:i,toggleTabs:N,toggleFooter:d,toggleBreadcrumb:y,setPrimaryColor:p,addCachedView:w,removeCachedView:b,clearCachedViews:S,initTheme:U}}),Ve="/vite.svg",Z=q.defineStore("auth",()=>{const t=e.ref(P()),o=e.computed(()=>Q()),n=c=>{ne(c),t.value=P()},s=()=>{t.value=null,G()},r=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.accessToken)||null}),m=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.tokenType)||"Bearer"}),l=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.code)||null});return{loginInfo:t,isLoggedIn:o,accessToken:r,tokenType:m,code:l,login:n,logout:s}}),v=q.defineStore("user",()=>{const t=e.ref(_.get("user_info")),o=e.computed(()=>!!t.value),n=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.userName)||""}),s=e.computed(()=>{var c;return((c=t.value)==null?void 0:c.avatar)||""}),r=e.computed(()=>{var c;return(c=t.value)==null?void 0:c.userId});return{userInfo:t,isLoggedIn:o,userName:n,avatar:s,userId:r,setUserInfo:c=>{t.value=c,_.set("user_info",c)},clearUserInfo:()=>{t.value=null,_.remove("user_info")}}}),A=q.defineStore("menu",()=>{const t="menu_list",o="menu_btn_list",n=e.ref(_.get(t)||[]),s=e.ref(_.get(o)||{}),r=e.computed(()=>n.value.length>0),m=e.computed(()=>{const u=V();function h(i){if(i&&i.length>0)for(let N=0;N<i.length;N++){const d=i[N];if(d.default)return d.path;{const y=h(d.children||[]);if(y)return y}}return null}return h(n.value)||u.indexPath||"/dashboard"}),l=(u,h)=>{const E=[];return!u||u.length<=0||u.forEach(i=>{if(i.type===1){const N={code:i.menuCode,name:i.menuName,path:"",title:i.menuName},d=h||"";let y=s.value[d]||[];y.push(N),s.value[d]=y}else{const N=[];let d=i.menuUrl,y=i.isOut||!1;!y&&i.menuUrl&&(i.menuUrl.startsWith("http")?d="/iframe/"+encodeURIComponent(d):i.menuUrl.startsWith("keep-alive:")&&(d="/iframe/keep-alive/"+encodeURIComponent(d.split("keep-alive:")[1])));const p={code:i.menuCode,name:i.menuName,path:d,icon:i.icon,closable:i.closable,default:i.isDefault,out:y,children:N,title:i.menuName};if(E.push(p),i.children&&i.children.length>0){const w=l(i.children,i.menuUrl);p.children=w}}}),E},c=u=>{n.value=u,_.set(t,u)},f=u=>{const h=n.value.findIndex(E=>E.code==="home");h>-1&&n.value.splice(h,1),n.value.unshift({...u,code:"home",name:"首页"}),_.set(t,n.value)},k=(u,h)=>{if(g(),!(h!=null&&h.skipIndexMenu)){const i=V();n.value.push({code:"home",name:"首页",icon:"home",closable:!1,default:!1,out:!1,path:i.indexPath||"/dashboard",title:"首页"})}const E=l(u);n.value.push(...E),_.set(t,n.value),_.set(o,s.value)},g=()=>{n.value=[],s.value={},_.remove(t),_.remove(o)};return{menuList:n,menuBtnListMap:s,hasMenu:r,index:m,setMenuList:c,setIndexMenu:f,setMenuFromRemote:k,clearMenu:g}});function re(t){const o=V();return D.post("/user/v1.0/login/by-domain",{appId:o.appId,clientId:o.clientId,uid:t.uid,password:t.password,code:!0})}function ae(){return D.put("/user/v1.0/user/logout")}function be(t,o){return D.get(`/user/v1.0/login/by-code?appId=${t}&code=${o}`)}function ce(){return D.get("/user/v1.0/user/get-me")}function le(){return D.get(`/user/v1.0/menu/get-menu?appId=${M.appId}`)}function z(){const t=I.useRouter(),o=I.useRoute(),n=Z(),s=v(),r=A(),m=e.ref(!1),l=e.computed(()=>n.isLoggedIn),c=e.computed(()=>s.userInfo),f=e.computed(()=>s.userName||""),k=e.computed(()=>r.menuList),g=e.computed(()=>r.index),u=async(y,p)=>{m.value=!0;try{d();const b=(await re({uid:y,password:p})).data;n.login(b),await E(),await i();const S=o.query.redirectUrl;if(S){const U=decodeURIComponent(S);if(U.startsWith("http")){const C=b.code;location.href=U.includes("?")?`${U}&code=${C}`:`${U}?code=${C}`}else await t.replace(U)}else await t.replace(g.value||"/");return B.Message.success("登录成功"),{success:!0,data:b}}catch(w){return B.Message.error((w==null?void 0:w.message)||"登录失败"),{success:!1,error:w}}finally{m.value=!1}},h=async(y=!0)=>{const p=V();try{await ae()}catch(w){console.error("退出登录接口失败",w)}finally{d(),t.push(p.loginPath||"/login"),y&&B.Message.success("退出登录成功")}},E=async()=>{const y=await ce();return s.setUserInfo(y.data),y.data},i=async()=>{const y=await le();return r.setMenuFromRemote(y.data),r.menuList},N=async()=>{if(!n.isLoggedIn)return!1;try{return s.userInfo||await E(),r.hasMenu||await i(),!0}catch(y){return console.error("初始化应用失败",y),d(),!1}},d=()=>{n.logout(),s.clearUserInfo(),r.clearMenu()};return{loading:m,isLoggedIn:l,userInfo:c,userName:f,menuList:k,indexPath:g,login:u,logout:h,loadUserInfo:E,loadMenu:i,initApp:N,clearAllState:d}}function Ie(){const t=A(),o=Z(),n=v(),s=e.computed(()=>o.isLoggedIn),r=e.computed(()=>n.userName),m=e.computed(()=>n.userInfo),l=g=>{const u=window.location.pathname,E=(t.menuBtnListMap[u]||[]).map(i=>i.code);return Array.isArray(g)?g.some(i=>E.includes(i)):E.includes(g)};return{isLoggedIn:s,userName:r,userInfo:m,hasPermission:l,hasAnyPermission:g=>g.some(u=>l(u)),hasAllPermissions:g=>g.every(u=>l(u)),getCurrentPagePermissions:()=>{const g=window.location.pathname;return(t.menuBtnListMap[g]||[]).map(h=>h.code)}}}const Se={home:"🏠",dashboard:"📊",system:"⚙️",user:"👤",role:"👥",menu:"📋",setting:"🔧"};function ie(t){const o=I.useRoute(),n=I.useRouter(),s=A(),r=x(),m={...Se,...t},l=e.ref(""),c=e.computed(()=>o.path),f=e.computed(()=>r.isCollapsed),k=e.computed(()=>s.menuList),g=e.computed(()=>s.hasMenu),u=(p,w="")=>{const b=[];return p.forEach(S=>{S.children&&S.children.length>0?b.push(...u(S.children,S.title)):b.push({...S,parentTitle:w})}),b},h=e.computed(()=>l.value.trim()?u(k.value).filter(w=>w.title.toLowerCase().includes(l.value.toLowerCase())):[]),E=e.computed(()=>l.value.trim()?k.value.map(p=>{if(p.children&&p.children.length>0){const w=p.children.filter(b=>b.title.toLowerCase().includes(l.value.toLowerCase()));return w.length>0?{...p,children:w}:null}return p.title.toLowerCase().includes(l.value.toLowerCase())?p:null}).filter(Boolean):k.value);return{searchKeyword:l,activeMenu:c,isCollapsed:f,menuList:k,hasMenu:g,searchResults:h,filteredMenuList:E,flattenMenus:u,getMenuIcon:p=>m[p||""]||"📄",handleMenuSelect:p=>{p&&p!==o.path&&(n.push(p),l.value="")},handleSearchItemClick:p=>{n.push(p),l.value=""},clearSearch:()=>{l.value=""}}}function Be(t,o={}){const{rules:n,onSubmit:s}=o,r=e.ref(),m=e.reactive({...t}),l=e.ref(!1),c=e.ref(!1),f=e.ref(!1),k=()=>{h(),f.value=!1,c.value=!0},g=i=>{Object.assign(m,i),f.value=!0,c.value=!0},u=()=>{c.value=!1,h()},h=()=>{var i;Object.keys(t).forEach(N=>{m[N]=t[N]}),(i=r.value)==null||i.resetFields()};return{formRef:r,formData:m,rules:n,loading:l,visible:c,isEdit:f,openAdd:k,openEdit:g,close:u,resetForm:h,handleSubmit:async()=>{var i;try{await((i=r.value)==null?void 0:i.validate()),l.value=!0,await(s==null?void 0:s(m)),u()}catch(N){console.error(N)}finally{l.value=!1}}}}function Le(t){const{fetchData:o,defaultPageSize:n=10}=t,s=e.ref(!1),r=e.ref([]),m=e.ref(0),l=e.ref(1),c=e.ref(n),f=e.reactive({}),k=async()=>{s.value=!0;try{const d={...f,page:l.value,pageSize:c.value},y=await o(d);r.value=y.list,m.value=y.total}catch(d){console.error(d)}finally{s.value=!1}},g=()=>{l.value=1,k()},u=()=>{Object.keys(f).forEach(d=>{f[d]=void 0}),l.value=1,k()},h=d=>{l.value=d,k()},E=d=>{c.value=d,l.value=1,k()},i=()=>{k()},N=e.computed(()=>({current:l.value,pageSize:c.value,total:m.value}));return{loading:s,data:r,total:m,currentPage:l,pageSize:c,searchParams:f,pagination:N,getData:k,handleSearch:g,handleReset:u,handlePageChange:h,handleSizeChange:E,refresh:i}}const Te={class:"sidebar"},$e={class:"sidebar__logo"},Ue={key:0,class:"sidebar__search"},Me={key:0,class:"sidebar__search-results"},Pe=["onClick"],De={class:"menu-icon"},Ae={class:"sidebar__search-item-info"},Re={class:"sidebar__search-item-title"},Fe={key:0,class:"sidebar__search-item-parent"},Oe={class:"menu-icon"},xe={class:"menu-icon"},ze={class:"menu-icon"},qe={key:1,class:"sidebar__user"},He={class:"sidebar__user-info"},Ke={class:"sidebar__user-name"},je={class:"sidebar__user-role"},We=e.defineComponent({__name:"Sidebar",setup(t){const{logout:o,userName:n,userInfo:s}=z(),r=V(),{searchKeyword:m,activeMenu:l,isCollapsed:c,searchResults:f,filteredMenuList:k,getMenuIcon:g,handleMenuSelect:u,handleSearchItemClick:h}=ie();return(E,i)=>{var N;return e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("div",$e,[i[1]||(i[1]=e.createElementVNode("img",{src:Ve,alt:"Logo",class:"sidebar__logo-img"},null,-1)),e.withDirectives(e.createElementVNode("span",{class:"sidebar__logo-text"},e.toDisplayString(e.unref(r).appName),513),[[e.vShow,!e.unref(c)]])]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ue,[e.createVNode(e.unref(T.Input),{modelValue:e.unref(m),"onUpdate:modelValue":i[0]||(i[0]=d=>e.isRef(m)?m.value=d:null),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),e.unref(f).length>0?(e.openBlock(),e.createElementBlock("div",Me,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f),d=>(e.openBlock(),e.createElementBlock("div",{key:d.path,class:"sidebar__search-item",onClick:y=>e.unref(h)(d.path)},[e.createElementVNode("span",De,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("div",Ae,[e.createElementVNode("span",Re,e.toDisplayString(d.title),1),d.parentTitle?(e.openBlock(),e.createElementBlock("span",Fe,e.toDisplayString(d.parentTitle),1)):e.createCommentVNode("",!0)])],8,Pe))),128))])):e.createCommentVNode("",!0)])),e.createVNode(e.unref(H.Menu),{"default-active":e.unref(l),collapse:e.unref(c),"collapse-transition":!1,class:"sidebar__menu",onSelect:e.unref(u)},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k),d=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:d.path},[d.children&&d.children.length>0?(e.openBlock(),e.createBlock(e.unref(H.SubMenu),{key:0,index:d.path},{title:e.withCtx(()=>[e.createElementVNode("span",Oe,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.children,y=>(e.openBlock(),e.createBlock(e.unref(H.MenuItem),{key:y.path,index:y.path},{default:e.withCtx(()=>[e.createElementVNode("span",xe,e.toDisplayString(e.unref(g)(y.icon)),1),e.createElementVNode("span",null,e.toDisplayString(y.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(H.MenuItem),{key:1,index:d.path},{default:e.withCtx(()=>[e.createElementVNode("span",ze,e.toDisplayString(e.unref(g)(d.icon)),1),e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse","onSelect"]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",qe,[e.createElementVNode("div",He,[e.createElementVNode("span",Ke,e.toDisplayString(e.unref(n)||"用户"),1),e.createElementVNode("span",je,e.toDisplayString(((N=e.unref(s))==null?void 0:N.departmentName)||""),1)]),e.createVNode(e.unref(K.Button),{type:"text",size:"small",onClick:e.unref(o)},{default:e.withCtx(()=>[...i[2]||(i[2]=[e.createTextVNode("退出",-1)])]),_:1},8,["onClick"])]))])}}}),L=(t,o)=>{const n=t.__vccOpts||t;for(const[s,r]of o)n[s]=r;return n},de=L(We,[["__scopeId","data-v-e0f3701a"]]),Ye={class:"header"},Xe={class:"header__right"},Je=["title"],Ge={key:0,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},Qe={key:1,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},Ze={key:0},ve={key:1},et={class:"header__avatar"},tt={class:"header__user-name"},nt={key:0,class:"header__dropdown"},ot={class:"header__dropdown-header"},st={class:"header__dropdown-avatar"},rt={class:"header__dropdown-info"},at={class:"header__dropdown-name"},ct={class:"header__dropdown-role"},ue=L(e.defineComponent({__name:"Header",setup(t){const o=x(),{logout:n,userName:s,userInfo:r}=z(),m=e.ref(!1),l=e.ref(null),c=e.ref(!1),f=e.computed(()=>s.value||"用户"),k=()=>{o.toggleCollapse()},g=()=>{o.toggleTheme()},u=()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},h=()=>{c.value=!!document.fullscreenElement},E=()=>{m.value=!m.value},i=()=>{m.value=!1},N=async()=>{i(),await n()},d=y=>{l.value&&!l.value.contains(y.target)&&i()};return e.onMounted(()=>{document.addEventListener("click",d),document.addEventListener("fullscreenchange",h)}),e.onUnmounted(()=>{document.removeEventListener("click",d),document.removeEventListener("fullscreenchange",h)}),(y,p)=>(e.openBlock(),e.createElementBlock("div",Ye,[e.createElementVNode("div",{class:"header__left"},[e.createElementVNode("div",{class:"header__collapse",onClick:k},[...p[0]||(p[0]=[e.createElementVNode("span",null,"☰",-1)])])]),e.createElementVNode("div",Xe,[e.createElementVNode("div",{class:"header__action",onClick:u,title:c.value?"退出全屏":"全屏"},[c.value?(e.openBlock(),e.createElementBlock("svg",Ge,[...p[1]||(p[1]=[e.createElementVNode("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",Qe,[...p[2]||(p[2]=[e.createElementVNode("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"},null,-1)])]))],8,Je),e.createElementVNode("div",{class:"header__action",onClick:g,title:"切换主题"},[e.unref(o).isDark?(e.openBlock(),e.createElementBlock("span",Ze,"🌙")):(e.openBlock(),e.createElementBlock("span",ve,"☀️"))]),e.createElementVNode("div",{class:"header__user",ref_key:"dropdownRef",ref:l},[e.createElementVNode("div",{class:"header__user-trigger",onClick:e.withModifiers(E,["stop"])},[e.createElementVNode("div",et,[e.createElementVNode("span",null,e.toDisplayString(f.value.charAt(0)),1)]),e.createElementVNode("span",tt,e.toDisplayString(f.value),1),e.createElementVNode("span",{class:e.normalizeClass(["header__user-arrow",{"is-active":m.value}])},"▼",2)]),e.createVNode(e.Transition,{name:"dropdown"},{default:e.withCtx(()=>{var w;return[m.value?(e.openBlock(),e.createElementBlock("div",nt,[e.createElementVNode("div",ot,[e.createElementVNode("div",st,[e.createElementVNode("span",null,e.toDisplayString(f.value.charAt(0)),1)]),e.createElementVNode("div",rt,[e.createElementVNode("div",at,e.toDisplayString(f.value),1),e.createElementVNode("div",ct,e.toDisplayString(((w=e.unref(r))==null?void 0:w.departmentName)||""),1)])]),p[4]||(p[4]=e.createElementVNode("div",{class:"header__dropdown-divider"},null,-1)),e.createElementVNode("div",{class:"header__dropdown-menu"},[e.createElementVNode("div",{class:"header__dropdown-item header__dropdown-item--danger",onClick:N},[...p[3]||(p[3]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"🚪",-1),e.createElementVNode("span",null,"退出登录",-1)])])])])):e.createCommentVNode("",!0)]}),_:1})],512)])]))}}),[["__scopeId","data-v-151096f1"]]),lt={class:"layout"},it={class:"layout__main"},dt={class:"layout__content"},me=L(e.defineComponent({__name:"index",setup(t){const o=x(),n=e.computed(()=>o.isCollapsed?"64px":"210px");return(s,r)=>{const m=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",lt,[e.createElementVNode("aside",{class:"layout__aside",style:e.normalizeStyle({width:n.value})},[e.createVNode(de)],4),e.createElementVNode("div",it,[e.createVNode(ue,{class:"layout__header"}),e.createElementVNode("main",dt,[e.createVNode(m)])])])}}}),[["__scopeId","data-v-5a394347"]]),ut={},mt={class:"tabs-wrapper"};function ft(t,o){return e.openBlock(),e.createElementBlock("div",mt)}const ht=L(ut,[["render",ft],["__scopeId","data-v-3b1e382a"]]),pt={},_t={class:"footer"};function gt(t,o){return e.openBlock(),e.createElementBlock("div",_t,[...o[0]||(o[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const yt=L(pt,[["render",gt],["__scopeId","data-v-317ae311"]]),kt={class:"login"},Et={class:"login__container"},Nt={class:"login__header"},wt=["src"],Ct={class:"login__title"},Vt={class:"login__subtitle"},bt=L(e.defineComponent({__name:"index",props:{logo:{},title:{},subtitle:{}},emits:["success","error"],setup(t,{emit:o}){const n=o,{login:s,loading:r}=z(),m=V(),l=e.reactive({uid:"",password:""}),c={uid:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},f=e.ref(),k=async()=>{var g;try{await((g=f.value)==null?void 0:g.validate());const u=await s(l.uid,l.password);u.success?n("success",u.data):n("error",u.error)}catch(u){console.error("登录失败",u),n("error",u)}};return(g,u)=>(e.openBlock(),e.createElementBlock("div",kt,[e.createElementVNode("div",Et,[e.createElementVNode("div",Nt,[e.createElementVNode("img",{src:t.logo||"/vite.svg",alt:"Logo",class:"login__logo"},null,8,wt),e.createElementVNode("h1",Ct,e.toDisplayString(t.title||e.unref(m).appName),1),e.createElementVNode("p",Vt,e.toDisplayString(t.subtitle||"后台管理系统"),1)]),e.createVNode(e.unref(T.Form),{ref_key:"formRef",ref:f,model:l,rules:c,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.FormItem),{prop:"uid"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.Input),{modelValue:l.uid,"onUpdate:modelValue":u[0]||(u[0]=h=>l.uid=h),placeholder:"请输入账号",size:"large"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(T.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref(T.Input),{modelValue:l.password,"onUpdate:modelValue":u[1]||(u[1]=h=>l.password=h),type:"password",placeholder:"请输入密码",size:"large","show-password":"",onKeyup:e.withKeys(k,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(T.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Button),{type:"primary",size:"large",loading:e.unref(r),class:"login__submit",onClick:k},{default:e.withCtx(()=>[...u[2]||(u[2]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])]))}}),[["__scopeId","data-v-fdb37509"]]),It={class:"error-page"},St={class:"error-page__content"},Bt=L(e.defineComponent({__name:"404",setup(t){const o=I.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",It,[e.createElementVNode("div",St,[r[1]||(r[1]=e.createElementVNode("div",{class:"error-page__code"},"404",-1)),r[2]||(r[2]=e.createElementVNode("div",{class:"error-page__title"},"页面不存在",-1)),r[3]||(r[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您访问的页面不存在或已被删除",-1)),e.createVNode(e.unref(K.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-6fc8a81b"]]),Lt={class:"error-page"},Tt={class:"error-page__content"},$t=L(e.defineComponent({__name:"403",setup(t){const o=I.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Lt,[e.createElementVNode("div",Tt,[r[1]||(r[1]=e.createElementVNode("div",{class:"error-page__code"},"403",-1)),r[2]||(r[2]=e.createElementVNode("div",{class:"error-page__title"},"无访问权限",-1)),r[3]||(r[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您没有权限访问此页面",-1)),e.createVNode(e.unref(K.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-f9466667"]]);function Ut(t){const o=A(),n=window.location.pathname,r=(o.menuBtnListMap[n]||[]).map(m=>m.code);return Array.isArray(t)?t.some(m=>r.includes(m)):r.includes(t)}function Mt(){return!0}const Pt=["/login","/404","/403"];function Dt(t,o){const n=V(),s=I.createRouter({history:I.createWebHistory((o==null?void 0:o.base)||""),routes:t,scrollBehavior:(o==null?void 0:o.scrollBehavior)||(()=>({left:0,top:0}))});return s.beforeEach(async(r,m,l)=>{const c=x();if(c.initTheme(),Q())if(r.path===n.loginPath)l({path:n.indexPath||"/"});else{const{initApp:f,isLoggedIn:k}=z();if(!k.value&&!await f()){l(n.loginPath||"/login");return}r.name&&r.meta.keepAlive&&c.addCachedView(r.name),l()}else Pt.includes(r.path)?l():l({path:n.loginPath||"/login",query:{redirectUrl:encodeURIComponent(r.fullPath)}})}),s}function At(t,o){const n=I.createRouter({history:I.createWebHistory(),routes:o});t.matcher=n.matcher}function Rt(t){const o=V();return[{path:(t==null?void 0:t.loginPath)||o.loginPath||"/login",name:"Login",component:t==null?void 0:t.loginComponent,meta:{title:"登录",hidden:!0}},{path:"/404",name:"NotFound",component:t==null?void 0:t.notFoundComponent,meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:t==null?void 0:t.forbiddenComponent,meta:{title:"403",hidden:!0}},{path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}}]}function Ft(t,o={}){const n=o.indexPath||"/dashboard";return{path:"/",name:"Layout",component:o.layoutComponent||me,redirect:n,children:t}}function Ot(t={}){return[{path:"/404",name:"NotFound",component:t.notFoundComponent,meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:t.forbiddenComponent,meta:{title:"403",hidden:!0}},{path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}}]}var fe=(t=>(t[t.ENABLED=1]="ENABLED",t[t.DISABLED=0]="DISABLED",t))(fe||{}),he=(t=>(t[t.UNKNOWN=0]="UNKNOWN",t[t.MALE=1]="MALE",t[t.FEMALE=2]="FEMALE",t))(he||{}),pe=(t=>(t[t.DIRECTORY=0]="DIRECTORY",t[t.MENU=1]="MENU",t[t.BUTTON=2]="BUTTON",t))(pe||{});const xt={1:"启用",0:"禁用"},zt={0:"未知",1:"男",2:"女"},qt={0:"目录",1:"菜单",2:"按钮"},Ht=[{label:"启用",value:1},{label:"禁用",value:0}],Kt=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],jt=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],Wt={mounted(t,o){var f;const n=A(),{value:s}=o;if(!s)return;const r=window.location.pathname,l=(n.menuBtnListMap[r]||[]).map(k=>k.code);let c=!1;Array.isArray(s)?c=s.some(k=>l.includes(k)):c=l.includes(s),c||(f=t.parentNode)==null||f.removeChild(t)}};function Yt(t){return ee(t),se(),{config:V()}}a.Footer=yt,a.Forbidden=$t,a.Gender=he,a.GenderOptions=Kt,a.GenderText=zt,a.Header=ue,a.Layout=me,a.Login=bt,a.MenuType=pe,a.MenuTypeOptions=jt,a.MenuTypeText=qt,a.NotFound=Bt,a.Sidebar=de,a.Status=fe,a.StatusOptions=Ht,a.StatusText=xt,a.Tabs=ht,a.clearToken=G,a.clearUserInfo=we,a.createErrorRoutes=Ot,a.createLayoutRoute=Ft,a.createRouter=Dt,a.createStaticRoutes=Rt,a.createXtoApp=Yt,a.getCode=ke,a.getConfig=V,a.getConfigValue=ge,a.getCurrentUser=ce,a.getLoginInfo=P,a.getRequest=$,a.getToken=J,a.getTokenType=oe,a.getUserInfo=Ne,a.getUserMenu=le,a.hasPermission=Ut,a.hasToken=Q,a.http=D,a.isAdmin=Mt,a.local=_,a.localStorageUtil=F,a.login=re,a.loginByCode=be,a.logout=ae,a.permissionDirective=Wt,a.resetRequest=se,a.resetRouter=At,a.session=ye,a.sessionStorageUtil=O,a.setConfig=ee,a.setLoginInfo=ne,a.setUserInfo=Ee,a.useApp=z,a.useAppStore=x,a.useAuth=Ie,a.useAuthStore=Z,a.useForm=Be,a.useMenu=ie,a.useMenuStore=A,a.useTable=Le,a.useUserStore=v,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
package/dist/main.d.ts CHANGED
@@ -0,0 +1 @@
1
+
@@ -1,5 +1,6 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
2
  import { Component } from 'vue';
3
+
3
4
  export interface DynamicRouteOptions {
4
5
  /** 布局组件 */
5
6
  layoutComponent?: Component;
@@ -1,4 +1,5 @@
1
1
  import { Router, RouteRecordRaw } from 'vue-router';
2
+
2
3
  /**
3
4
  * 创建路由实例
4
5
  * @param routes 业务路由配置
@@ -1,4 +1,5 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
+
2
3
  export interface StaticRouteOptions {
3
4
  /** 登录路径 */
4
5
  loginPath?: string;
@@ -1,4 +1,5 @@
1
1
  import { LoginInfo } from '../utils/auth';
2
+
2
3
  export declare const useAuthStore: import('pinia').StoreDefinition<"auth", Pick<{
3
4
  loginInfo: import('vue').Ref<{
4
5
  accessToken: string;
@@ -1,4 +1,5 @@
1
1
  import { MenuItem, RemoteMenuItem } from '../types/api';
2
+
2
3
  export declare const useMenuStore: import('pinia').StoreDefinition<"menu", Pick<{
3
4
  menuList: import('vue').Ref<{
4
5
  code: string;
@@ -1,4 +1,5 @@
1
1
  import { UserInfo } from '../types/api';
2
+
2
3
  export declare const useUserStore: import('pinia').StoreDefinition<"user", Pick<{
3
4
  userInfo: import('vue').Ref<{
4
5
  uId: string;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sidebar[data-v-5560e0bb]{height:100%;display:flex;flex-direction:column;background-color:var(--bg-color)}.sidebar__logo[data-v-5560e0bb]{height:50px;display:flex;align-items:center;justify-content:center;gap:10px;border-bottom:1px solid var(--color-border-lighter)}.sidebar__logo-img[data-v-5560e0bb]{width:32px;height:32px}.sidebar__logo-text[data-v-5560e0bb]{font-size:16px;font-weight:600;color:var(--color-primary)}.sidebar__search[data-v-5560e0bb]{padding:10px;border-bottom:1px solid var(--color-border-lighter);position:relative}.sidebar__search-results[data-v-5560e0bb]{position:absolute;top:100%;left:0;right:0;background-color:var(--bg-color);border:1px solid var(--color-border-lighter);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow);max-height:300px;overflow-y:auto;z-index:100}.sidebar__search-item[data-v-5560e0bb]{display:flex;align-items:center;gap:10px;padding:10px 12px;cursor:pointer;transition:background-color .2s}.sidebar__search-item[data-v-5560e0bb]:hover{background-color:var(--color-fill)}.sidebar__search-item-info[data-v-5560e0bb]{display:flex;flex-direction:column;gap:2px}.sidebar__search-item-title[data-v-5560e0bb]{font-size:14px;color:var(--color-text-primary)}.sidebar__search-item-parent[data-v-5560e0bb]{font-size:12px;color:var(--color-text-secondary)}.sidebar__menu[data-v-5560e0bb]{flex:1;border-right:none;overflow-y:auto}.sidebar__user[data-v-5560e0bb]{padding:10px;border-top:1px solid var(--color-border-lighter);display:flex;align-items:center;justify-content:space-between}.sidebar__user-info[data-v-5560e0bb]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-5560e0bb]{font-size:14px;font-weight:500}.sidebar__user-role[data-v-5560e0bb]{font-size:12px;color:var(--color-text-secondary)}.menu-icon[data-v-5560e0bb]{margin-right:8px}.header[data-v-2bf8f3d2]{display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:100%}.header__left[data-v-2bf8f3d2]{display:flex;align-items:center;gap:15px}.header__collapse[data-v-2bf8f3d2]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:var(--color-text-regular)}.header__collapse[data-v-2bf8f3d2]:hover{color:var(--color-primary)}.header__right[data-v-2bf8f3d2]{display:flex;align-items:center;gap:15px}.header__action[data-v-2bf8f3d2]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--border-radius-base);font-size:16px}.header__action[data-v-2bf8f3d2]:hover{background-color:var(--color-fill)}.header__user[data-v-2bf8f3d2]{position:relative}.header__user-trigger[data-v-2bf8f3d2]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:var(--border-radius-base);transition:background-color .2s}.header__user-trigger[data-v-2bf8f3d2]:hover{background-color:var(--color-fill)}.header__user-name[data-v-2bf8f3d2]{font-size:14px;color:var(--color-text-primary)}.header__user-arrow[data-v-2bf8f3d2]{font-size:10px;color:var(--color-text-secondary);transition:transform .2s}.header__user-arrow.is-active[data-v-2bf8f3d2]{transform:rotate(180deg)}.header__avatar[data-v-2bf8f3d2]{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:500}.header__dropdown[data-v-2bf8f3d2]{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background-color:var(--bg-color);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow);overflow:hidden;z-index:100}.header__dropdown-header[data-v-2bf8f3d2]{display:flex;align-items:center;gap:12px;padding:16px}.header__dropdown-avatar[data-v-2bf8f3d2]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;font-weight:500}.header__dropdown-info[data-v-2bf8f3d2]{flex:1}.header__dropdown-name[data-v-2bf8f3d2]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.header__dropdown-role[data-v-2bf8f3d2]{font-size:12px;color:var(--color-text-secondary);margin-top:2px}.header__dropdown-divider[data-v-2bf8f3d2]{height:1px;background-color:var(--color-border-lighter)}.header__dropdown-menu[data-v-2bf8f3d2]{padding:8px 0}.header__dropdown-item[data-v-2bf8f3d2]{display:flex;align-items:center;gap:10px;padding:10px 16px;cursor:pointer;font-size:14px;color:var(--color-text-regular);transition:all .2s}.header__dropdown-item[data-v-2bf8f3d2]:hover{background-color:var(--color-fill);color:var(--color-text-primary)}.header__dropdown-item--danger[data-v-2bf8f3d2]{color:var(--color-danger)}.header__dropdown-item--danger[data-v-2bf8f3d2]:hover{background-color:var(--color-danger-light);color:var(--color-danger)}.header__dropdown-icon[data-v-2bf8f3d2]{font-size:16px}.dropdown-enter-active[data-v-2bf8f3d2],.dropdown-leave-active[data-v-2bf8f3d2]{transition:all .2s ease}.dropdown-enter-from[data-v-2bf8f3d2],.dropdown-leave-to[data-v-2bf8f3d2]{opacity:0;transform:translateY(-10px)}.layout[data-v-1a24e6d0]{display:flex;width:100%;height:100%}.layout__aside[data-v-1a24e6d0]{transition:width .3s;overflow:hidden;flex-shrink:0;height:100%}.layout__main[data-v-1a24e6d0]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%}.layout__header[data-v-1a24e6d0]{height:50px;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter);flex-shrink:0}.layout__content[data-v-1a24e6d0]{flex:1;overflow:auto;background-color:var(--bg-color-page)}.tabs-wrapper[data-v-3b1e382a]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary);font-size:12px}.footer[data-v-317ae311]{width:100%;text-align:center;font-size:12px;color:var(--color-text-secondary)}.login[data-v-fdb37509]{width:100%;min-height:100vh;display:flex;align-items:center;justify-content:flex-end;padding-right:15%;background:linear-gradient(135deg,var(--color-primary-light-9) 0%,var(--color-primary-light-7) 100%)}.login__container[data-v-fdb37509]{width:400px;padding:40px;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark)}.login__header[data-v-fdb37509]{text-align:center;margin-bottom:30px}.login__logo[data-v-fdb37509]{width:60px;height:60px}.login__title[data-v-fdb37509]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-fdb37509]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-fdb37509] .t-form-item{margin-bottom:20px}.login__submit[data-v-fdb37509]{width:100%}.error-page[data-v-6fc8a81b]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-6fc8a81b]{text-align:center}.error-page__code[data-v-6fc8a81b]{font-size:120px;font-weight:600;color:var(--color-primary);line-height:1;margin-bottom:20px}.error-page__title[data-v-6fc8a81b]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-6fc8a81b]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.error-page[data-v-f9466667]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-f9466667]{text-align:center}.error-page__code[data-v-f9466667]{font-size:120px;font-weight:600;color:var(--color-warning);line-height:1;margin-bottom:20px}.error-page__title[data-v-f9466667]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-f9466667]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}
1
+ .sidebar[data-v-e0f3701a]{height:100%;display:flex;flex-direction:column;background:linear-gradient(180deg,#1e3a5f,#0d2137);color:#fff}.sidebar__logo[data-v-e0f3701a]{height:50px;display:flex;align-items:center;justify-content:center;gap:10px;border-bottom:1px solid rgba(255,255,255,.1)}.sidebar__logo-img[data-v-e0f3701a]{width:32px;height:32px}.sidebar__logo-text[data-v-e0f3701a]{font-size:16px;font-weight:600;color:#fff}.sidebar__search[data-v-e0f3701a]{padding:10px;border-bottom:1px solid rgba(255,255,255,.1);position:relative}.sidebar__search-results[data-v-e0f3701a]{position:absolute;top:100%;left:0;right:0;background-color:#1a2f4a;border:1px solid rgba(255,255,255,.1);border-radius:var(--border-radius-base);box-shadow:0 4px 12px #0000004d;max-height:300px;overflow-y:auto;z-index:100}.sidebar__search-item[data-v-e0f3701a]{display:flex;align-items:center;gap:10px;padding:10px 12px;cursor:pointer;transition:background-color .2s}.sidebar__search-item[data-v-e0f3701a]:hover{background-color:#ffffff1a}.sidebar__search-item-info[data-v-e0f3701a]{display:flex;flex-direction:column;gap:2px}.sidebar__search-item-title[data-v-e0f3701a]{font-size:14px;color:#fff}.sidebar__search-item-parent[data-v-e0f3701a]{font-size:12px;color:#fff9}.sidebar__menu[data-v-e0f3701a]{flex:1;border-right:none;overflow-y:auto;background-color:transparent}.sidebar__menu[data-v-e0f3701a] .x-menu{background-color:transparent;border-right:none}.sidebar__menu[data-v-e0f3701a] .x-menu-item{color:#fffc}.sidebar__menu[data-v-e0f3701a] .x-menu-item:hover{background-color:#ffffff1a;color:#fff}.sidebar__menu[data-v-e0f3701a] .x-menu-item.is-active{background-color:#409eff4d;color:#fff;border-right:3px solid var(--color-primary)}.sidebar__menu[data-v-e0f3701a] .x-sub-menu__title{color:#fffc}.sidebar__menu[data-v-e0f3701a] .x-sub-menu__title:hover{background-color:#ffffff1a;color:#fff}.sidebar__menu[data-v-e0f3701a] .x-sub-menu.is-active .x-sub-menu__title{color:#fff}.sidebar__menu[data-v-e0f3701a] .x-sub-menu .x-menu{background-color:#0003}.sidebar__user[data-v-e0f3701a]{padding:12px 16px;border-top:1px solid rgba(255,255,255,.1);display:flex;align-items:center;justify-content:space-between;background-color:#0000001a}.sidebar__user-info[data-v-e0f3701a]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-e0f3701a]{font-size:14px;font-weight:500;color:#fff}.sidebar__user-role[data-v-e0f3701a]{font-size:12px;color:#fff9}.menu-icon[data-v-e0f3701a]{margin-right:8px}.header[data-v-151096f1]{display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:100%}.header__left[data-v-151096f1]{display:flex;align-items:center;gap:15px}.header__collapse[data-v-151096f1]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#fffc}.header__collapse[data-v-151096f1]:hover{color:#fff}.header__right[data-v-151096f1]{display:flex;align-items:center;gap:15px}.header__action[data-v-151096f1]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:var(--border-radius-base);font-size:16px;color:#fffc}.header__action[data-v-151096f1]:hover{background-color:#ffffff1a;color:#fff}.header__user[data-v-151096f1]{position:relative}.header__user-trigger[data-v-151096f1]{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:var(--border-radius-base);transition:background-color .2s}.header__user-trigger[data-v-151096f1]:hover{background-color:#ffffff1a}.header__user-name[data-v-151096f1]{font-size:14px;color:#ffffffe6}.header__user-arrow[data-v-151096f1]{font-size:10px;color:#fff9;transition:transform .2s}.header__user-arrow.is-active[data-v-151096f1]{transform:rotate(180deg)}.header__avatar[data-v-151096f1]{width:32px;height:32px;border-radius:50%;background:#fff3;display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:500}.header__dropdown[data-v-151096f1]{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background-color:var(--bg-color);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow);overflow:hidden;z-index:100}.header__dropdown-header[data-v-151096f1]{display:flex;align-items:center;gap:12px;padding:16px}.header__dropdown-avatar[data-v-151096f1]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-light-3));display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;font-weight:500}.header__dropdown-info[data-v-151096f1]{flex:1}.header__dropdown-name[data-v-151096f1]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.header__dropdown-role[data-v-151096f1]{font-size:12px;color:var(--color-text-secondary);margin-top:2px}.header__dropdown-divider[data-v-151096f1]{height:1px;background-color:var(--color-border-lighter)}.header__dropdown-menu[data-v-151096f1]{padding:8px 0}.header__dropdown-item[data-v-151096f1]{display:flex;align-items:center;gap:10px;padding:10px 16px;cursor:pointer;font-size:14px;color:var(--color-text-regular);transition:all .2s}.header__dropdown-item[data-v-151096f1]:hover{background-color:var(--color-fill);color:var(--color-text-primary)}.header__dropdown-item--danger[data-v-151096f1]{color:var(--color-danger)}.header__dropdown-item--danger[data-v-151096f1]:hover{background-color:#f56c6c1a;color:var(--color-danger)}.header__dropdown-icon[data-v-151096f1]{font-size:16px}.dropdown-enter-active[data-v-151096f1],.dropdown-leave-active[data-v-151096f1]{transition:all .2s ease}.dropdown-enter-from[data-v-151096f1],.dropdown-leave-to[data-v-151096f1]{opacity:0;transform:translateY(-10px)}.layout[data-v-5a394347]{display:flex;width:100%;height:100%}.layout__aside[data-v-5a394347]{transition:width .3s;overflow:hidden;flex-shrink:0;height:100%}.layout__main[data-v-5a394347]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%}.layout__header[data-v-5a394347]{height:50px;background:linear-gradient(135deg,#1e3a5f,#0d2137);flex-shrink:0}.layout__content[data-v-5a394347]{flex:1;overflow:auto;background-color:var(--bg-color-page)}.tabs-wrapper[data-v-3b1e382a]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary);font-size:12px}.footer[data-v-317ae311]{width:100%;text-align:center;font-size:12px;color:var(--color-text-secondary)}.login[data-v-fdb37509]{width:100%;min-height:100vh;display:flex;align-items:center;justify-content:flex-end;padding-right:15%;background:linear-gradient(135deg,var(--color-primary-light-9) 0%,var(--color-primary-light-7) 100%)}.login__container[data-v-fdb37509]{width:400px;padding:40px;background-color:var(--bg-color);border-radius:var(--border-radius-large);box-shadow:var(--box-shadow-dark)}.login__header[data-v-fdb37509]{text-align:center;margin-bottom:30px}.login__logo[data-v-fdb37509]{width:60px;height:60px}.login__title[data-v-fdb37509]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-fdb37509]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-fdb37509] .t-form-item{margin-bottom:20px}.login__submit[data-v-fdb37509]{width:100%}.error-page[data-v-6fc8a81b]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-6fc8a81b]{text-align:center}.error-page__code[data-v-6fc8a81b]{font-size:120px;font-weight:600;color:var(--color-primary);line-height:1;margin-bottom:20px}.error-page__title[data-v-6fc8a81b]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-6fc8a81b]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.error-page[data-v-f9466667]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-f9466667]{text-align:center}.error-page__code[data-v-f9466667]{font-size:120px;font-weight:600;color:var(--color-warning);line-height:1;margin-bottom:20px}.error-page__title[data-v-f9466667]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-f9466667]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}
@@ -1,4 +1,5 @@
1
1
  import { AxiosInstance, AxiosRequestConfig } from 'axios';
2
+
2
3
  export interface ApiResponse<T = unknown> {
3
4
  code: number;
4
5
  data: T;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xto-fronted",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "XTO 前端应用脚手架,封装登录、退出、菜单渲染等统一逻辑",
package/dist/App.vue.d.ts DELETED
@@ -1,2 +0,0 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
- export default _default;