xto-fronted 0.1.7 → 0.1.9

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 (86) hide show
  1. package/README.md +4 -0
  2. package/dist/components/Login/index.vue.d.ts +15 -0
  3. package/dist/config/index.d.ts +25 -5
  4. package/dist/index.d.ts +17 -4
  5. package/dist/index.es.js +1272 -55
  6. package/dist/index.umd.js +1 -1
  7. package/dist/router/dynamicRoutes.d.ts +19 -25
  8. package/dist/router/index.d.ts +24 -4
  9. package/dist/router/staticRoutes.d.ts +15 -2
  10. package/dist/stores/menu.d.ts +14 -8
  11. package/dist/style.css +1 -1
  12. package/dist/utils/request.d.ts +8 -0
  13. package/package.json +2 -10
  14. package/.env.development +0 -3
  15. package/.env.production +0 -3
  16. package/dist/403-DM5wfQkM.js +0 -31
  17. package/dist/404-BurAu5LC.js +0 -31
  18. package/dist/index-BNiEld34.js +0 -15
  19. package/dist/index-Be9RiEfo.js +0 -98
  20. package/dist/index-BqRv1bdN.js +0 -1185
  21. package/dist/index-CQLVXvNJ.js +0 -15
  22. package/dist/index-CyiE8n2V.js +0 -15
  23. package/dist/index-xauR1bOL.js +0 -15
  24. package/dist/views/dashboard/index.vue.d.ts +0 -2
  25. package/dist/views/login/index.vue.d.ts +0 -4
  26. package/dist/views/system/menu/index.vue.d.ts +0 -2
  27. package/dist/views/system/role/index.vue.d.ts +0 -2
  28. package/dist/views/system/user/index.vue.d.ts +0 -2
  29. package/index.html +0 -13
  30. package/public/vite.svg +0 -10
  31. package/src/App.vue +0 -20
  32. package/src/api/auth.ts +0 -35
  33. package/src/api/menu.ts +0 -13
  34. package/src/api/system.ts +0 -65
  35. package/src/api/user.ts +0 -12
  36. package/src/assets/styles/_dark.scss +0 -407
  37. package/src/assets/styles/_reset.scss +0 -126
  38. package/src/assets/styles/_root.scss +0 -140
  39. package/src/assets/styles/_transition.scss +0 -119
  40. package/src/assets/styles/_variables.scss +0 -45
  41. package/src/assets/styles/index.scss +0 -187
  42. package/src/components/Layout/Footer.vue +0 -17
  43. package/src/components/Layout/Header.vue +0 -335
  44. package/src/components/Layout/Sidebar.vue +0 -213
  45. package/src/components/Layout/Tabs.vue +0 -20
  46. package/src/components/Layout/index.vue +0 -62
  47. package/src/composables/index.ts +0 -9
  48. package/src/composables/useApp.ts +0 -170
  49. package/src/composables/useAuth.ts +0 -70
  50. package/src/composables/useForm.ts +0 -79
  51. package/src/composables/useMenu.ts +0 -141
  52. package/src/composables/useTable.ts +0 -97
  53. package/src/config/index.ts +0 -19
  54. package/src/directives/permission.ts +0 -41
  55. package/src/enums/index.ts +0 -63
  56. package/src/env.d.ts +0 -17
  57. package/src/index.ts +0 -44
  58. package/src/main.ts +0 -29
  59. package/src/router/dynamicRoutes.ts +0 -163
  60. package/src/router/index.ts +0 -71
  61. package/src/router/staticRoutes.ts +0 -43
  62. package/src/stores/app.ts +0 -145
  63. package/src/stores/auth.ts +0 -45
  64. package/src/stores/index.ts +0 -15
  65. package/src/stores/menu.ts +0 -158
  66. package/src/stores/user.ts +0 -41
  67. package/src/types/api.d.ts +0 -103
  68. package/src/types/global.d.ts +0 -45
  69. package/src/types/router.d.ts +0 -48
  70. package/src/types/xto.d.ts +0 -149
  71. package/src/utils/auth.ts +0 -86
  72. package/src/utils/permission.ts +0 -30
  73. package/src/utils/request.ts +0 -126
  74. package/src/utils/storage.ts +0 -72
  75. package/src/views/dashboard/index.vue +0 -32
  76. package/src/views/error/403.vue +0 -57
  77. package/src/views/error/404.vue +0 -57
  78. package/src/views/login/index.vue +0 -141
  79. package/src/views/system/menu/index.vue +0 -32
  80. package/src/views/system/role/index.vue +0 -32
  81. package/src/views/system/user/index.vue +0 -32
  82. package/tsconfig.json +0 -26
  83. package/tsconfig.node.json +0 -11
  84. package/vite.config.ts +0 -139
  85. /package/dist/{views/error → components/Error}/403.vue.d.ts +0 -0
  86. /package/dist/{views/error → components/Error}/404.vue.d.ts +0 -0
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(a,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("vue-router"),require("@xto/navigation"),require("@xto/base"),require("@xto/form"),require("@xto/feedback"),require("pinia"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","vue-router","@xto/navigation","@xto/base","@xto/form","@xto/feedback","pinia","axios"],e):(a=typeof globalThis<"u"?globalThis:a||self,e(a.XtoFronted={},a.Vue,a.VueRouter,a.navigation,a.base,a.form,a.feedback,a.Pinia,a.axios))})(this,function(a,e,C,F,z,$,I,j,Ne){"use strict";const T={webTitle:"analysis-web",baseUrl:"https://cloud-api-test.tineco.com",appId:"DBU-CONTENT-ANALYSIS",clientId:"Tineco"},q=()=>`tooyu-cloud:${T.appId}:`,te=t=>({get(n){const o=q(),s=t.getItem(o+n);if(!s)return null;try{return JSON.parse(s)}catch{return s}},set(n,o){const s=q();if(o==null){t.removeItem(s+n);return}const r=typeof o=="string"?o:JSON.stringify(o);t.setItem(s+n,r)},remove(n){const o=q();t.removeItem(o+n)},clear(){const n=q();Object.keys(t).forEach(s=>{s.startsWith(n)&&t.removeItem(s)})}}),P=te(window.localStorage),D=te(window.sessionStorage),g={get:P.get,set:P.set,remove:P.remove,clear:P.clear},be={get:D.get,set:D.set,remove:D.remove,clear:D.clear},x=j.defineStore("app",()=>{const t=e.ref(g.get("isDark")||!1),n=e.ref(g.get("theme")||"light"),o=e.ref(g.get("layout")||"sidebar"),s=e.ref(g.get("isCollapsed")||!1),r=e.ref(g.get("showTabs")??!0),d=e.ref(g.get("showFooter")??!0),c=e.ref(g.get("showBreadcrumb")??!0),l=e.ref(g.get("primaryColor")||"#409eff"),m=e.ref([]),_=e.computed(()=>t.value?"dark":"light"),k=()=>{t.value=!t.value,n.value=t.value?"dark":"light",E()},f=b=>{n.value=b,t.value=b==="dark",E()},E=()=>{const b=document.documentElement;t.value?b.classList.add("dark"):b.classList.remove("dark"),g.set("isDark",t.value),g.set("theme",n.value)},y=()=>{s.value=!s.value,g.set("isCollapsed",s.value)},i=b=>{o.value=b,g.set("layout",b)},u=()=>{r.value=!r.value,g.set("showTabs",r.value)},p=()=>{d.value=!d.value,g.set("showFooter",d.value)},N=()=>{c.value=!c.value,g.set("showBreadcrumb",c.value)},h=b=>{l.value=b,document.documentElement.style.setProperty("--color-primary",b),g.set("primaryColor",b)},w=b=>{m.value.includes(b)||m.value.push(b)},S=b=>{const Ee=m.value.indexOf(b);Ee>-1&&m.value.splice(Ee,1)},B=()=>{m.value=[]},L=()=>{E(),l.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",l.value)};return e.watch(t,E),{isDark:t,theme:n,layout:o,isCollapsed:s,showTabs:r,showFooter:d,showBreadcrumb:c,primaryColor:l,cachedViews:m,themeClass:_,toggleTheme:k,toggleCollapse:y,setTheme:f,setLayout:i,toggleTabs:u,toggleFooter:p,toggleBreadcrumb:N,setPrimaryColor:h,addCachedView:w,removeCachedView:S,clearCachedViews:B,initTheme:L}}),ne="/vite.svg",K="login_info",H="user_info",M=()=>g.get(K),oe=t=>{const n={accessToken:t.access_token,refreshToken:t.refresh_token,expiresTime:t.expires_time,refreshTime:t.refresh_time,tokenType:t.token_type,code:t.code};g.set(K,n)},W=()=>{const t=M();return(t==null?void 0:t.accessToken)||null},se=()=>{const t=M();return(t==null?void 0:t.tokenType)||"Bearer"},we=()=>{const t=M();return(t==null?void 0:t.code)||null},Y=()=>{g.remove(K),g.remove(H)},J=()=>!!W(),Ve=t=>{g.set(H,t)},Se=()=>g.get(H),Ce=()=>{g.remove(H)},X=j.defineStore("auth",()=>{const t=e.ref(M()),n=e.computed(()=>J()),o=l=>{oe(l),t.value=M()},s=()=>{t.value=null,Y()},r=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.accessToken)||null}),d=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.tokenType)||"Bearer"}),c=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.code)||null});return{loginInfo:t,isLoggedIn:n,accessToken:r,tokenType:d,code:c,login:o,logout:s}}),G=j.defineStore("user",()=>{const t=e.ref(g.get("user_info")),n=e.computed(()=>!!t.value),o=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.userName)||""}),s=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.avatar)||""}),r=e.computed(()=>{var l;return(l=t.value)==null?void 0:l.userId});return{userInfo:t,isLoggedIn:n,userName:o,avatar:s,userId:r,setUserInfo:l=>{t.value=l,g.set("user_info",l)},clearUserInfo:()=>{t.value=null,g.remove("user_info")}}}),U=j.defineStore("menu",()=>{const t="menu_list",n="menu_btn_list",o=e.ref(g.get(t)||[]),s=e.ref(g.get(n)||{}),r={code:"home",name:"首页",icon:"home",closable:!1,default:!1,out:!1,path:"/dashboard",title:"首页"},d=e.computed(()=>o.value.length>0),c=e.computed(()=>{function f(y){if(y&&y.length>0)for(let i=0;i<y.length;i++){const u=y[i];if(u.default)return u.path;{const p=f(u.children||[]);if(p)return p}}return null}return f(o.value)||r.path}),l=(f,E)=>{const y=[];return!f||f.length<=0||f.forEach(i=>{if(i.type===1){const u={code:i.menuCode,name:i.menuName,path:"",title:i.menuName},p=E||"";let N=s.value[p]||[];N.push(u),s.value[p]=N}else{const u=[];let p=i.menuUrl,N=i.isOut||!1;!N&&i.menuUrl&&(i.menuUrl.startsWith("http")?p="/iframe/"+encodeURIComponent(p):i.menuUrl.startsWith("keep-alive:")&&(p="/iframe/keep-alive/"+encodeURIComponent(p.split("keep-alive:")[1])));const h={code:i.menuCode,name:i.menuName,path:p,icon:i.icon,closable:i.closable,default:i.isDefault,out:N,children:u,title:i.menuName};if(y.push(h),i.children&&i.children.length>0){const w=l(i.children,i.menuUrl);h.children=w}}}),y},m=f=>{o.value=f,g.set(t,f)},_=f=>{k(),o.value.push(r);const E=l(f);o.value.push(...E),g.set(t,o.value),g.set(n,s.value)},k=()=>{o.value=[],s.value={},g.remove(t),g.remove(n)};return{menuList:o,menuBtnListMap:s,hasMenu:d,index:c,indexMenu:r,setMenuList:m,setMenuFromRemote:_,clearMenu:k}}),O=(()=>{const t=Ne.create({baseURL:T.baseUrl,timeout:15e3,headers:{"Content-Type":"application/json"}});return t.interceptors.request.use(n=>{const o=W();if(o){const s=se();n.headers.Authorization=`${s} ${o}`}return n},n=>Promise.reject(n)),t.interceptors.response.use(n=>{const{data:o}=n;return o.code===200||o.code===0?n:(I.Message.error(o.message||"请求失败"),Promise.reject(new Error(o.message||"请求失败")))},n=>{var s;const{response:o}=n;if(o)switch(o.status){case 401:case 403:I.Message.error("登录已过期,请重新登录"),Y(),window.location.href="/login";break;case 404:I.Message.error("请求资源不存在");break;case 500:I.Message.error("服务器错误");break;default:I.Message.error(((s=o.data)==null?void 0:s.message)||"请求失败")}else I.Message.error("网络连接失败");return Promise.reject(n)}),t})(),A={get(t,n){return O.get(t,n).then(o=>o.data)},post(t,n,o){return O.post(t,n,o).then(s=>s.data)},put(t,n,o){return O.put(t,n,o).then(s=>s.data)},patch(t,n,o){return O.patch(t,n,o).then(s=>s.data)},delete(t,n){return O.delete(t,n).then(o=>o.data)}};function re(t){return A.post("/user/v1.0/login/by-domain",{appId:T.appId,clientId:T.clientId,uid:t.uid,password:t.password,code:!0})}function ae(){return A.put("/user/v1.0/user/logout")}function Be(t,n){return A.get(`/user/v1.0/login/by-code?appId=${t}&code=${n}`)}function le(){return A.get("/user/v1.0/user/get-me")}function ce(){return A.get(`/user/v1.0/menu/get-menu?appId=${T.appId}`)}function R(){const t=C.useRouter(),n=C.useRoute(),o=X(),s=G(),r=U(),d=e.ref(!1),c=e.computed(()=>o.isLoggedIn),l=e.computed(()=>s.userInfo),m=e.computed(()=>s.userName||""),_=e.computed(()=>r.menuList),k=e.computed(()=>r.index),f=async(N,h)=>{d.value=!0;try{p();const S=(await re({uid:N,password:h})).data;o.login(S),await y(),await i();const B=n.query.redirectUrl;if(B){const L=decodeURIComponent(B);if(L.startsWith("http")){const b=S.code;location.href=L.includes("?")?`${L}&code=${b}`:`${L}?code=${b}`}else await t.replace(L)}else await t.replace(k.value||"/");return I.Message.success("登录成功"),{success:!0,data:S}}catch(w){return I.Message.error((w==null?void 0:w.message)||"登录失败"),{success:!1,error:w}}finally{d.value=!1}},E=async(N=!0)=>{try{await ae()}catch(h){console.error("退出登录接口失败",h)}finally{p(),t.push("/login"),N&&I.Message.success("退出登录成功")}},y=async()=>{const N=await le();return s.setUserInfo(N.data),N.data},i=async()=>{const N=await ce();return r.setMenuFromRemote(N.data),r.menuList},u=async()=>{if(!o.isLoggedIn)return!1;try{return s.userInfo||await y(),r.hasMenu||await i(),!0}catch(N){return console.error("初始化应用失败",N),p(),!1}},p=()=>{o.logout(),s.clearUserInfo(),r.clearMenu()};return{loading:d,isLoggedIn:c,userInfo:l,userName:m,menuList:_,indexPath:k,login:f,logout:E,loadUserInfo:y,loadMenu:i,initApp:u,clearAllState:p}}function Ie(){const t=U(),n=X(),o=G(),s=e.computed(()=>n.isLoggedIn),r=e.computed(()=>o.userName),d=e.computed(()=>o.userInfo),c=k=>{const f=window.location.pathname,y=(t.menuBtnListMap[f]||[]).map(i=>i.code);return Array.isArray(k)?k.some(i=>y.includes(i)):y.includes(k)};return{isLoggedIn:s,userName:r,userInfo:d,hasPermission:c,hasAnyPermission:k=>k.some(f=>c(f)),hasAllPermissions:k=>k.every(f=>c(f)),getCurrentPagePermissions:()=>{const k=window.location.pathname;return(t.menuBtnListMap[k]||[]).map(E=>E.code)}}}const $e={home:"🏠",dashboard:"📊",system:"⚙️",user:"👤",role:"👥",menu:"📋",setting:"🔧"};function ie(t){const n=C.useRoute(),o=C.useRouter(),s=U(),r=x(),d={...$e,...t},c=e.ref(""),l=e.computed(()=>n.path),m=e.computed(()=>r.isCollapsed),_=e.computed(()=>s.menuList),k=e.computed(()=>s.hasMenu),f=(h,w="")=>{const S=[];return h.forEach(B=>{B.children&&B.children.length>0?S.push(...f(B.children,B.title)):S.push({...B,parentTitle:w})}),S},E=e.computed(()=>c.value.trim()?f(_.value).filter(w=>w.title.toLowerCase().includes(c.value.toLowerCase())):[]),y=e.computed(()=>c.value.trim()?_.value.map(h=>{if(h.children&&h.children.length>0){const w=h.children.filter(S=>S.title.toLowerCase().includes(c.value.toLowerCase()));return w.length>0?{...h,children:w}:null}return h.title.toLowerCase().includes(c.value.toLowerCase())?h:null}).filter(Boolean):_.value);return{searchKeyword:c,activeMenu:l,isCollapsed:m,menuList:_,hasMenu:k,searchResults:E,filteredMenuList:y,flattenMenus:f,getMenuIcon:h=>d[h||""]||"📄",handleMenuSelect:h=>{h&&h!==n.path&&(o.push(h),c.value="")},handleSearchItemClick:h=>{o.push(h),c.value=""},clearSearch:()=>{c.value=""}}}function Te(t,n={}){const{rules:o,onSubmit:s}=n,r=e.ref(),d=e.reactive({...t}),c=e.ref(!1),l=e.ref(!1),m=e.ref(!1),_=()=>{E(),m.value=!1,l.value=!0},k=i=>{Object.assign(d,i),m.value=!0,l.value=!0},f=()=>{l.value=!1,E()},E=()=>{var i;Object.keys(t).forEach(u=>{d[u]=t[u]}),(i=r.value)==null||i.resetFields()};return{formRef:r,formData:d,rules:o,loading:c,visible:l,isEdit:m,openAdd:_,openEdit:k,close:f,resetForm:E,handleSubmit:async()=>{var i;try{await((i=r.value)==null?void 0:i.validate()),c.value=!0,await(s==null?void 0:s(d)),f()}catch(u){console.error(u)}finally{c.value=!1}}}}function Le(t){const{fetchData:n,defaultPageSize:o=10}=t,s=e.ref(!1),r=e.ref([]),d=e.ref(0),c=e.ref(1),l=e.ref(o),m=e.reactive({}),_=async()=>{s.value=!0;try{const p={...m,page:c.value,pageSize:l.value},N=await n(p);r.value=N.list,d.value=N.total}catch(p){console.error(p)}finally{s.value=!1}},k=()=>{c.value=1,_()},f=()=>{Object.keys(m).forEach(p=>{m[p]=void 0}),c.value=1,_()},E=p=>{c.value=p,_()},y=p=>{l.value=p,c.value=1,_()},i=()=>{_()},u=e.computed(()=>({current:c.value,pageSize:l.value,total:d.value}));return{loading:s,data:r,total:d,currentPage:c,pageSize:l,searchParams:m,pagination:u,getData:_,handleSearch:k,handleReset:f,handlePageChange:E,handleSizeChange:y,refresh:i}}const Me={class:"sidebar"},Ue={class:"sidebar__logo"},Ae={key:0,class:"sidebar__search"},Pe={key:0,class:"sidebar__search-results"},De=["onClick"],xe={class:"menu-icon"},Oe={class:"sidebar__search-item-info"},Re={class:"sidebar__search-item-title"},Fe={key:0,class:"sidebar__search-item-parent"},ze={class:"menu-icon"},je={class:"menu-icon"},qe={class:"menu-icon"},He={key:1,class:"sidebar__user"},Ke={class:"sidebar__user-info"},We={class:"sidebar__user-name"},Ye={class:"sidebar__user-role"},Je=e.defineComponent({__name:"Sidebar",setup(t){const{logout:n,userName:o,userInfo:s}=R(),{searchKeyword:r,activeMenu:d,isCollapsed:c,searchResults:l,filteredMenuList:m,getMenuIcon:_,handleMenuSelect:k,handleSearchItemClick:f}=ie();return(E,y)=>{var i;return e.openBlock(),e.createElementBlock("div",Me,[e.createElementVNode("div",Ue,[y[1]||(y[1]=e.createElementVNode("img",{src:ne,alt:"Logo",class:"sidebar__logo-img"},null,-1)),e.withDirectives(e.createElementVNode("span",{class:"sidebar__logo-text"},e.toDisplayString(e.unref(T).webTitle),513),[[e.vShow,!e.unref(c)]])]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ae,[e.createVNode(e.unref($.Input),{modelValue:e.unref(r),"onUpdate:modelValue":y[0]||(y[0]=u=>e.isRef(r)?r.value=u:null),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),e.unref(l).length>0?(e.openBlock(),e.createElementBlock("div",Pe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(l),u=>(e.openBlock(),e.createElementBlock("div",{key:u.path,class:"sidebar__search-item",onClick:p=>e.unref(f)(u.path)},[e.createElementVNode("span",xe,e.toDisplayString(e.unref(_)(u.icon)),1),e.createElementVNode("div",Oe,[e.createElementVNode("span",Re,e.toDisplayString(u.title),1),u.parentTitle?(e.openBlock(),e.createElementBlock("span",Fe,e.toDisplayString(u.parentTitle),1)):e.createCommentVNode("",!0)])],8,De))),128))])):e.createCommentVNode("",!0)])),e.createVNode(e.unref(F.Menu),{"default-active":e.unref(d),collapse:e.unref(c),"collapse-transition":!1,class:"sidebar__menu",onSelect:e.unref(k)},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(m),u=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:u.path},[u.children&&u.children.length>0?(e.openBlock(),e.createBlock(e.unref(F.SubMenu),{key:0,index:u.path},{title:e.withCtx(()=>[e.createElementVNode("span",ze,e.toDisplayString(e.unref(_)(u.icon)),1),e.createElementVNode("span",null,e.toDisplayString(u.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.children,p=>(e.openBlock(),e.createBlock(e.unref(F.MenuItem),{key:p.path,index:p.path},{default:e.withCtx(()=>[e.createElementVNode("span",je,e.toDisplayString(e.unref(_)(p.icon)),1),e.createElementVNode("span",null,e.toDisplayString(p.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(F.MenuItem),{key:1,index:u.path},{default:e.withCtx(()=>[e.createElementVNode("span",qe,e.toDisplayString(e.unref(_)(u.icon)),1),e.createElementVNode("span",null,e.toDisplayString(u.title),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse","onSelect"]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",He,[e.createElementVNode("div",Ke,[e.createElementVNode("span",We,e.toDisplayString(e.unref(o)||"用户"),1),e.createElementVNode("span",Ye,e.toDisplayString(((i=e.unref(s))==null?void 0:i.departmentName)||""),1)]),e.createVNode(e.unref(z.Button),{type:"text",size:"small",onClick:e.unref(n)},{default:e.withCtx(()=>[...y[2]||(y[2]=[e.createTextVNode("退出",-1)])]),_:1},8,["onClick"])]))])}}}),V=(t,n)=>{const o=t.__vccOpts||t;for(const[s,r]of n)o[s]=r;return o},de=V(Je,[["__scopeId","data-v-bd43a7b8"]]),Xe={class:"header"},Ge={class:"header__right"},Qe=["title"],Ze={key:0,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},ve={key:1,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},et={key:0},tt={key:1},nt={class:"header__avatar"},ot={class:"header__user-name"},st={key:0,class:"header__dropdown"},rt={class:"header__dropdown-header"},at={class:"header__dropdown-avatar"},lt={class:"header__dropdown-info"},ct={class:"header__dropdown-name"},it={class:"header__dropdown-role"},me=V(e.defineComponent({__name:"Header",setup(t){const n=x(),{logout:o,userName:s,userInfo:r}=R(),d=e.ref(!1),c=e.ref(null),l=e.ref(!1),m=e.computed(()=>s.value||"用户"),_=()=>{n.toggleCollapse()},k=()=>{n.toggleTheme()},f=()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},E=()=>{l.value=!!document.fullscreenElement},y=()=>{d.value=!d.value},i=()=>{d.value=!1},u=async()=>{i(),await o()},p=N=>{c.value&&!c.value.contains(N.target)&&i()};return e.onMounted(()=>{document.addEventListener("click",p),document.addEventListener("fullscreenchange",E)}),e.onUnmounted(()=>{document.removeEventListener("click",p),document.removeEventListener("fullscreenchange",E)}),(N,h)=>(e.openBlock(),e.createElementBlock("div",Xe,[e.createElementVNode("div",{class:"header__left"},[e.createElementVNode("div",{class:"header__collapse",onClick:_},[...h[0]||(h[0]=[e.createElementVNode("span",null,"☰",-1)])])]),e.createElementVNode("div",Ge,[e.createElementVNode("div",{class:"header__action",onClick:f,title:l.value?"退出全屏":"全屏"},[l.value?(e.openBlock(),e.createElementBlock("svg",Ze,[...h[1]||(h[1]=[e.createElementVNode("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",ve,[...h[2]||(h[2]=[e.createElementVNode("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"},null,-1)])]))],8,Qe),e.createElementVNode("div",{class:"header__action",onClick:k,title:"切换主题"},[e.unref(n).isDark?(e.openBlock(),e.createElementBlock("span",et,"🌙")):(e.openBlock(),e.createElementBlock("span",tt,"☀️"))]),e.createElementVNode("div",{class:"header__user",ref_key:"dropdownRef",ref:c},[e.createElementVNode("div",{class:"header__user-trigger",onClick:e.withModifiers(y,["stop"])},[e.createElementVNode("div",nt,[e.createElementVNode("span",null,e.toDisplayString(m.value.charAt(0)),1)]),e.createElementVNode("span",ot,e.toDisplayString(m.value),1),e.createElementVNode("span",{class:e.normalizeClass(["header__user-arrow",{"is-active":d.value}])},"▼",2)]),e.createVNode(e.Transition,{name:"dropdown"},{default:e.withCtx(()=>{var w;return[d.value?(e.openBlock(),e.createElementBlock("div",st,[e.createElementVNode("div",rt,[e.createElementVNode("div",at,[e.createElementVNode("span",null,e.toDisplayString(m.value.charAt(0)),1)]),e.createElementVNode("div",lt,[e.createElementVNode("div",ct,e.toDisplayString(m.value),1),e.createElementVNode("div",it,e.toDisplayString(((w=e.unref(r))==null?void 0:w.departmentName)||""),1)])]),h[4]||(h[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:u},[...h[3]||(h[3]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"🚪",-1),e.createElementVNode("span",null,"退出登录",-1)])])])])):e.createCommentVNode("",!0)]}),_:1})],512)])]))}}),[["__scopeId","data-v-2bf8f3d2"]]),dt={class:"layout"},mt={class:"layout__main"},ut={class:"layout__content"},ue=V(e.defineComponent({__name:"index",setup(t){const n=x(),o=e.computed(()=>n.isCollapsed?"64px":"210px");return(s,r)=>{const d=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",dt,[e.createElementVNode("aside",{class:"layout__aside",style:e.normalizeStyle({width:o.value})},[e.createVNode(de)],4),e.createElementVNode("div",mt,[e.createVNode(me,{class:"layout__header"}),e.createElementVNode("main",ut,[e.createVNode(d)])])])}}}),[["__scopeId","data-v-1a24e6d0"]]),pt=Object.freeze(Object.defineProperty({__proto__:null,default:ue},Symbol.toStringTag,{value:"Module"})),ht={},_t={class:"tabs-wrapper"};function ft(t,n){return e.openBlock(),e.createElementBlock("div",_t)}const gt=V(ht,[["render",ft],["__scopeId","data-v-3b1e382a"]]),yt={},kt={class:"footer"};function Et(t,n){return e.openBlock(),e.createElementBlock("div",kt,[...n[0]||(n[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const Nt=V(yt,[["render",Et],["__scopeId","data-v-317ae311"]]);function bt(t){const n=U(),o=window.location.pathname,r=(n.menuBtnListMap[o]||[]).map(d=>d.code);return Array.isArray(t)?t.some(d=>r.includes(d)):r.includes(t)}function wt(){return!0}const Q=[{path:"/login",name:"Login",component:()=>Promise.resolve().then(()=>xt),meta:{title:"登录",hidden:!0}},{path:"/404",name:"NotFound",component:()=>Promise.resolve().then(()=>Ft),meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:()=>Promise.resolve().then(()=>qt),meta:{title:"403",hidden:!0}}],Z={path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}},v={path:"/",name:"Layout",component:()=>Promise.resolve().then(()=>pt),redirect:"/dashboard",children:[{path:"/dashboard",name:"Dashboard",component:()=>Promise.resolve().then(()=>fe),meta:{title:"仪表盘",icon:"dashboard",keepAlive:!0,affix:!0}},{path:"/system/user",name:"SystemUser",component:()=>Promise.resolve().then(()=>ge),meta:{title:"用户管理",icon:"user",keepAlive:!0}},{path:"/system/role",name:"SystemRole",component:()=>Promise.resolve().then(()=>ye),meta:{title:"角色管理",icon:"role",keepAlive:!0}},{path:"/system/menu",name:"SystemMenu",component:()=>Promise.resolve().then(()=>ke),meta:{title:"菜单管理",icon:"menu",keepAlive:!0}}]},Vt=[{path:"/dashboard",name:"Dashboard",component:()=>Promise.resolve().then(()=>fe),meta:{title:"仪表盘",icon:"dashboard",keepAlive:!0,affix:!0}},{path:"/system",name:"System",redirect:"/system/user",meta:{title:"系统管理",icon:"setting"},children:[{path:"user",name:"SystemUser",component:()=>Promise.resolve().then(()=>ge),meta:{title:"用户管理",icon:"user",keepAlive:!0}},{path:"role",name:"SystemRole",component:()=>Promise.resolve().then(()=>ye),meta:{title:"角色管理",icon:"role",keepAlive:!0}},{path:"menu",name:"SystemMenu",component:()=>Promise.resolve().then(()=>ke),meta:{title:"菜单管理",icon:"menu",keepAlive:!0}}]}],St=[{id:1,name:"Dashboard",path:"/dashboard",component:"dashboard/index",icon:"dashboard",title:"仪表盘",keepAlive:!0,affix:!0},{id:2,name:"System",path:"/system",redirect:"/system/user",icon:"setting",title:"系统管理",children:[{id:21,name:"SystemUser",path:"/system/user",component:"system/user/index",icon:"user",title:"用户管理",keepAlive:!0},{id:22,name:"SystemRole",path:"/system/role",component:"system/role/index",icon:"role",title:"角色管理",keepAlive:!0},{id:23,name:"SystemMenu",path:"/system/menu",component:"system/menu/index",icon:"menu",title:"菜单管理",keepAlive:!0}]}],ee=C.createRouter({history:C.createWebHistory(),routes:[...Q,v,Z],scrollBehavior:()=>({left:0,top:0})}),Ct=["/login","/404","/403"];ee.beforeEach(async(t,n,o)=>{const s=x();if(s.initTheme(),J())if(t.path==="/login")o({path:"/"});else{const{initApp:r,isLoggedIn:d}=R();if(!d.value&&!await r()){o("/login");return}t.name&&t.meta.keepAlive&&s.addCachedView(t.name),o()}else Ct.includes(t.path)?o():o({path:"/login",query:{redirectUrl:encodeURIComponent(t.fullPath)}})});function Bt(){const t=C.createRouter({history:C.createWebHistory(),routes:[...Q,v,Z]});ee.matcher=t.matcher}var pe=(t=>(t[t.ENABLED=1]="ENABLED",t[t.DISABLED=0]="DISABLED",t))(pe||{}),he=(t=>(t[t.UNKNOWN=0]="UNKNOWN",t[t.MALE=1]="MALE",t[t.FEMALE=2]="FEMALE",t))(he||{}),_e=(t=>(t[t.DIRECTORY=0]="DIRECTORY",t[t.MENU=1]="MENU",t[t.BUTTON=2]="BUTTON",t))(_e||{});const It={1:"启用",0:"禁用"},$t={0:"未知",1:"男",2:"女"},Tt={0:"目录",1:"菜单",2:"按钮"},Lt=[{label:"启用",value:1},{label:"禁用",value:0}],Mt=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],Ut=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],At={mounted(t,n){var m;const o=U(),{value:s}=n;if(!s)return;const r=window.location.pathname,c=(o.menuBtnListMap[r]||[]).map(_=>_.code);let l=!1;Array.isArray(s)?l=s.some(_=>c.includes(_)):l=c.includes(s),l||(m=t.parentNode)==null||m.removeChild(t)}},Pt={class:"login"},Dt={class:"login__container"},xt=Object.freeze(Object.defineProperty({__proto__:null,default:V(e.defineComponent({__name:"index",setup(t){const{login:n,loading:o}=R(),s=e.reactive({uid:"",password:""}),r={uid:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},d=e.ref(),c=async()=>{var l;try{await((l=d.value)==null?void 0:l.validate()),await n(s.uid,s.password)}catch(m){console.error("登录失败",m)}};return(l,m)=>(e.openBlock(),e.createElementBlock("div",Pt,[e.createElementVNode("div",Dt,[m[3]||(m[3]=e.createElementVNode("div",{class:"login__header"},[e.createElementVNode("img",{src:ne,alt:"Logo",class:"login__logo"}),e.createElementVNode("h1",{class:"login__title"},"Analysis Web"),e.createElementVNode("p",{class:"login__subtitle"},"后台管理系统")],-1)),e.createVNode(e.unref($.Form),{ref_key:"formRef",ref:d,model:s,rules:r,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref($.FormItem),{prop:"uid"},{default:e.withCtx(()=>[e.createVNode(e.unref($.Input),{modelValue:s.uid,"onUpdate:modelValue":m[0]||(m[0]=_=>s.uid=_),placeholder:"请输入账号",size:"large"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref($.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref($.Input),{modelValue:s.password,"onUpdate:modelValue":m[1]||(m[1]=_=>s.password=_),type:"password",placeholder:"请输入密码",size:"large","show-password":"",onKeyup:e.withKeys(c,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref($.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(z.Button),{type:"primary",size:"large",loading:e.unref(o),class:"login__submit",onClick:c},{default:e.withCtx(()=>[...m[2]||(m[2]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])]))}}),[["__scopeId","data-v-728dba9d"]])},Symbol.toStringTag,{value:"Module"})),Ot={class:"error-page"},Rt={class:"error-page__content"},Ft=Object.freeze(Object.defineProperty({__proto__:null,default:V(e.defineComponent({__name:"404",setup(t){const n=C.useRouter(),o=()=>{n.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Ot,[e.createElementVNode("div",Rt,[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(z.Button),{type:"primary",onClick:o},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-f1a1acb0"]])},Symbol.toStringTag,{value:"Module"})),zt={class:"error-page"},jt={class:"error-page__content"},qt=Object.freeze(Object.defineProperty({__proto__:null,default:V(e.defineComponent({__name:"403",setup(t){const n=C.useRouter(),o=()=>{n.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",zt,[e.createElementVNode("div",jt,[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(z.Button),{type:"primary",onClick:o},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-f6105e3d"]])},Symbol.toStringTag,{value:"Module"})),Ht={},Kt={class:"dashboard"};function Wt(t,n){return e.openBlock(),e.createElementBlock("div",Kt,[...n[0]||(n[0]=[e.createElementVNode("div",{class:"dashboard__placeholder"},[e.createElementVNode("h2",null,"首页"),e.createElementVNode("p",null,"功能开发中...")],-1)])])}const fe=Object.freeze(Object.defineProperty({__proto__:null,default:V(Ht,[["render",Wt],["__scopeId","data-v-a57037a8"]])},Symbol.toStringTag,{value:"Module"})),Yt={},Jt={class:"page"};function Xt(t,n){return e.openBlock(),e.createElementBlock("div",Jt,[...n[0]||(n[0]=[e.createElementVNode("div",{class:"page__placeholder"},[e.createElementVNode("h2",null,"用户管理"),e.createElementVNode("p",null,"功能开发中...")],-1)])])}const ge=Object.freeze(Object.defineProperty({__proto__:null,default:V(Yt,[["render",Xt],["__scopeId","data-v-715bfcf7"]])},Symbol.toStringTag,{value:"Module"})),Gt={},Qt={class:"page"};function Zt(t,n){return e.openBlock(),e.createElementBlock("div",Qt,[...n[0]||(n[0]=[e.createElementVNode("div",{class:"page__placeholder"},[e.createElementVNode("h2",null,"角色管理"),e.createElementVNode("p",null,"功能开发中...")],-1)])])}const ye=Object.freeze(Object.defineProperty({__proto__:null,default:V(Gt,[["render",Zt],["__scopeId","data-v-0802c3db"]])},Symbol.toStringTag,{value:"Module"})),vt={},en={class:"page"};function tn(t,n){return e.openBlock(),e.createElementBlock("div",en,[...n[0]||(n[0]=[e.createElementVNode("div",{class:"page__placeholder"},[e.createElementVNode("h2",null,"菜单管理"),e.createElementVNode("p",null,"功能开发中...")],-1)])])}const ke=Object.freeze(Object.defineProperty({__proto__:null,default:V(vt,[["render",tn],["__scopeId","data-v-7bc14131"]])},Symbol.toStringTag,{value:"Module"}));a.Footer=Nt,a.Gender=he,a.GenderOptions=Mt,a.GenderText=$t,a.Header=me,a.Layout=ue,a.MenuType=_e,a.MenuTypeOptions=Ut,a.MenuTypeText=Tt,a.Sidebar=de,a.Status=pe,a.StatusOptions=Lt,a.StatusText=It,a.Tabs=gt,a.appConfig=T,a.clearToken=Y,a.clearUserInfo=Ce,a.defaultDynamicRoutes=Vt,a.errorRoute=Z,a.getCode=we,a.getCurrentUser=le,a.getLoginInfo=M,a.getToken=W,a.getTokenType=se,a.getUserInfo=Se,a.getUserMenu=ce,a.hasPermission=bt,a.hasToken=J,a.http=A,a.isAdmin=wt,a.layoutRoute=v,a.local=g,a.localStorageUtil=P,a.login=re,a.loginByCode=Be,a.logout=ae,a.mockMenuData=St,a.permissionDirective=At,a.resetRouter=Bt,a.router=ee,a.session=be,a.sessionStorageUtil=D,a.setLoginInfo=oe,a.setUserInfo=Ve,a.staticRoutes=Q,a.useApp=R,a.useAppStore=x,a.useAuth=Ie,a.useAuthStore=X,a.useForm=Te,a.useMenu=ie,a.useMenuStore=U,a.useTable=Le,a.useUserStore=G,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-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,7 +1,21 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
- export declare const layoutRoute: RouteRecordRaw;
3
- export declare const defaultDynamicRoutes: RouteRecordRaw[];
4
- export declare const mockMenuData: ({
2
+ import { Component } from 'vue';
3
+ export interface DynamicRouteOptions {
4
+ /** 布局组件 */
5
+ layoutComponent?: Component;
6
+ /** 默认首页路径 */
7
+ indexPath?: string;
8
+ }
9
+ /**
10
+ * 创建布局路由
11
+ * @param children 子路由配置
12
+ * @param options 选项
13
+ */
14
+ export declare function createLayoutRoute(children: RouteRecordRaw[], options?: DynamicRouteOptions): RouteRecordRaw;
15
+ /**
16
+ * Mock 菜单数据(用于开发)
17
+ */
18
+ export declare const mockMenuData: {
5
19
  id: number;
6
20
  name: string;
7
21
  path: string;
@@ -10,25 +24,5 @@ export declare const mockMenuData: ({
10
24
  title: string;
11
25
  keepAlive: boolean;
12
26
  affix: boolean;
13
- redirect?: undefined;
14
- children?: undefined;
15
- } | {
16
- id: number;
17
- name: string;
18
- path: string;
19
- redirect: string;
20
- icon: string;
21
- title: string;
22
- children: {
23
- id: number;
24
- name: string;
25
- path: string;
26
- component: string;
27
- icon: string;
28
- title: string;
29
- keepAlive: boolean;
30
- }[];
31
- component?: undefined;
32
- keepAlive?: undefined;
33
- affix?: undefined;
34
- })[];
27
+ }[];
28
+ export { type RouteRecordRaw } from 'vue-router';
@@ -1,6 +1,26 @@
1
+ import { Router, RouteRecordRaw } from 'vue-router';
1
2
  /**
2
- * 路由配置
3
+ * 创建路由实例
4
+ * @param routes 业务路由配置
5
+ * @param options 路由选项
3
6
  */
4
- declare const router: import('vue-router').Router;
5
- export declare function resetRouter(): void;
6
- export default router;
7
+ export declare function createRouter(routes: RouteRecordRaw[], options?: {
8
+ historyMode?: 'hash' | 'history' | 'memory';
9
+ base?: string;
10
+ scrollBehavior?: Router['options']['scrollBehavior'];
11
+ }): Router;
12
+ /**
13
+ * 重置路由
14
+ */
15
+ export declare function resetRouter(router: Router, routes: RouteRecordRaw[]): void;
16
+ /**
17
+ * 创建静态路由配置
18
+ */
19
+ export declare function createStaticRoutes(options?: {
20
+ loginPath?: string;
21
+ loginComponent?: any;
22
+ layoutComponent?: any;
23
+ notFoundComponent?: any;
24
+ forbiddenComponent?: any;
25
+ }): RouteRecordRaw[];
26
+ export { type RouteRecordRaw } from 'vue-router';
@@ -1,3 +1,16 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
- export declare const staticRoutes: RouteRecordRaw[];
3
- export declare const errorRoute: RouteRecordRaw;
2
+ export interface StaticRouteOptions {
3
+ /** 登录路径 */
4
+ loginPath?: string;
5
+ /** 登录组件 */
6
+ loginComponent?: any;
7
+ /** 404 组件 */
8
+ notFoundComponent?: any;
9
+ /** 403 组件 */
10
+ forbiddenComponent?: any;
11
+ }
12
+ /**
13
+ * 创建错误路由
14
+ */
15
+ export declare function createErrorRoutes(options?: StaticRouteOptions): RouteRecordRaw[];
16
+ export { type RouteRecordRaw } from 'vue-router';
@@ -34,11 +34,13 @@ export declare const useMenuStore: import('pinia').StoreDefinition<"menu", Pick<
34
34
  menuBtnListMap: import('vue').Ref<Record<string, MenuItem[]>, Record<string, MenuItem[]>>;
35
35
  hasMenu: import('vue').ComputedRef<boolean>;
36
36
  index: import('vue').ComputedRef<string>;
37
- indexMenu: MenuItem;
38
37
  setMenuList: (menus: MenuItem[]) => void;
39
- setMenuFromRemote: (remoteMenus: RemoteMenuItem[]) => void;
38
+ setIndexMenu: (menu: MenuItem) => void;
39
+ setMenuFromRemote: (remoteMenus: RemoteMenuItem[], options?: {
40
+ skipIndexMenu?: boolean;
41
+ }) => void;
40
42
  clearMenu: () => void;
41
- }, "menuList" | "menuBtnListMap" | "indexMenu">, Pick<{
43
+ }, "menuList" | "menuBtnListMap">, Pick<{
42
44
  menuList: import('vue').Ref<{
43
45
  code: string;
44
46
  name: string;
@@ -73,9 +75,11 @@ export declare const useMenuStore: import('pinia').StoreDefinition<"menu", Pick<
73
75
  menuBtnListMap: import('vue').Ref<Record<string, MenuItem[]>, Record<string, MenuItem[]>>;
74
76
  hasMenu: import('vue').ComputedRef<boolean>;
75
77
  index: import('vue').ComputedRef<string>;
76
- indexMenu: MenuItem;
77
78
  setMenuList: (menus: MenuItem[]) => void;
78
- setMenuFromRemote: (remoteMenus: RemoteMenuItem[]) => void;
79
+ setIndexMenu: (menu: MenuItem) => void;
80
+ setMenuFromRemote: (remoteMenus: RemoteMenuItem[], options?: {
81
+ skipIndexMenu?: boolean;
82
+ }) => void;
79
83
  clearMenu: () => void;
80
84
  }, "hasMenu" | "index">, Pick<{
81
85
  menuList: import('vue').Ref<{
@@ -112,8 +116,10 @@ export declare const useMenuStore: import('pinia').StoreDefinition<"menu", Pick<
112
116
  menuBtnListMap: import('vue').Ref<Record<string, MenuItem[]>, Record<string, MenuItem[]>>;
113
117
  hasMenu: import('vue').ComputedRef<boolean>;
114
118
  index: import('vue').ComputedRef<string>;
115
- indexMenu: MenuItem;
116
119
  setMenuList: (menus: MenuItem[]) => void;
117
- setMenuFromRemote: (remoteMenus: RemoteMenuItem[]) => void;
120
+ setIndexMenu: (menu: MenuItem) => void;
121
+ setMenuFromRemote: (remoteMenus: RemoteMenuItem[], options?: {
122
+ skipIndexMenu?: boolean;
123
+ }) => void;
118
124
  clearMenu: () => void;
119
- }, "setMenuList" | "setMenuFromRemote" | "clearMenu">>;
125
+ }, "setMenuList" | "setIndexMenu" | "setMenuFromRemote" | "clearMenu">>;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sidebar[data-v-bd43a7b8]{height:100%;display:flex;flex-direction:column;background-color:var(--bg-color)}.sidebar__logo[data-v-bd43a7b8]{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-bd43a7b8]{width:32px;height:32px}.sidebar__logo-text[data-v-bd43a7b8]{font-size:16px;font-weight:600;color:var(--color-primary)}.sidebar__search[data-v-bd43a7b8]{padding:10px;border-bottom:1px solid var(--color-border-lighter);position:relative}.sidebar__search-results[data-v-bd43a7b8]{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-bd43a7b8]{display:flex;align-items:center;gap:10px;padding:10px 12px;cursor:pointer;transition:background-color .2s}.sidebar__search-item[data-v-bd43a7b8]:hover{background-color:var(--color-fill)}.sidebar__search-item-info[data-v-bd43a7b8]{display:flex;flex-direction:column;gap:2px}.sidebar__search-item-title[data-v-bd43a7b8]{font-size:14px;color:var(--color-text-primary)}.sidebar__search-item-parent[data-v-bd43a7b8]{font-size:12px;color:var(--color-text-secondary)}.sidebar__menu[data-v-bd43a7b8]{flex:1;border-right:none;overflow-y:auto}.sidebar__user[data-v-bd43a7b8]{padding:10px;border-top:1px solid var(--color-border-lighter);display:flex;align-items:center;justify-content:space-between}.sidebar__user-info[data-v-bd43a7b8]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-bd43a7b8]{font-size:14px;font-weight:500}.sidebar__user-role[data-v-bd43a7b8]{font-size:12px;color:var(--color-text-secondary)}.menu-icon[data-v-bd43a7b8]{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-728dba9d]{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-728dba9d]{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-728dba9d]{text-align:center;margin-bottom:30px}.login__logo[data-v-728dba9d]{width:60px;height:60px}.login__title[data-v-728dba9d]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-728dba9d]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-728dba9d] .t-form-item{margin-bottom:20px}.login__submit[data-v-728dba9d]{width:100%}.error-page[data-v-f1a1acb0]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-f1a1acb0]{text-align:center}.error-page__code[data-v-f1a1acb0]{font-size:120px;font-weight:600;color:var(--color-primary);line-height:1;margin-bottom:20px}.error-page__title[data-v-f1a1acb0]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-f1a1acb0]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.error-page[data-v-f6105e3d]{width:100%;height:100vh;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color-page)}.error-page__content[data-v-f6105e3d]{text-align:center}.error-page__code[data-v-f6105e3d]{font-size:120px;font-weight:600;color:var(--color-warning);line-height:1;margin-bottom:20px}.error-page__title[data-v-f6105e3d]{font-size:24px;font-weight:500;color:var(--color-text-primary);margin-bottom:10px}.error-page__desc[data-v-f6105e3d]{font-size:14px;color:var(--color-text-secondary);margin-bottom:30px}.dashboard[data-v-a57037a8]{padding:20px;height:100%}.dashboard__placeholder[data-v-a57037a8]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary)}.dashboard__placeholder h2[data-v-a57037a8]{margin-bottom:10px;color:var(--color-text-primary)}.page[data-v-715bfcf7]{padding:20px;height:100%}.page__placeholder[data-v-715bfcf7]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary)}.page__placeholder h2[data-v-715bfcf7]{margin-bottom:10px;color:var(--color-text-primary)}.page[data-v-0802c3db]{padding:20px;height:100%}.page__placeholder[data-v-0802c3db]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary)}.page__placeholder h2[data-v-0802c3db]{margin-bottom:10px;color:var(--color-text-primary)}.page[data-v-7bc14131]{padding:20px;height:100%}.page__placeholder[data-v-7bc14131]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary)}.page__placeholder h2[data-v-7bc14131]{margin-bottom:10px;color:var(--color-text-primary)}
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}
@@ -14,6 +14,14 @@ export interface PageResponse<T> {
14
14
  page: number;
15
15
  pageSize: number;
16
16
  }
17
+ /**
18
+ * 获取请求实例
19
+ */
20
+ export declare function getRequest(): AxiosInstance;
21
+ /**
22
+ * 重置请求实例(配置变更时调用)
23
+ */
24
+ export declare function resetRequest(): void;
17
25
  declare const request: AxiosInstance;
18
26
  export declare const http: {
19
27
  get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<ApiResponse<T>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xto-fronted",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "XTO 前端应用脚手架,封装登录、退出、菜单渲染等统一逻辑",
@@ -16,15 +16,7 @@
16
16
  "./style.css": "./dist/style.css"
17
17
  },
18
18
  "files": [
19
- "dist",
20
- "src",
21
- "public",
22
- "index.html",
23
- "vite.config.ts",
24
- "tsconfig.json",
25
- "tsconfig.node.json",
26
- ".env.production",
27
- ".env.development"
19
+ "dist"
28
20
  ],
29
21
  "scripts": {
30
22
  "dev": "vite",
package/.env.development DELETED
@@ -1,3 +0,0 @@
1
- VITE_APP_NAME=analysis-web
2
- VITE_APP_ID=DBU-CONTENT-ANALYSIS
3
- VITE_APP_CLIENT_ID=Tineco
package/.env.production DELETED
@@ -1,3 +0,0 @@
1
- VITE_APP_NAME=analysis-web
2
- VITE_APP_ID=DBU-CONTENT-ANALYSIS
3
- VITE_APP_CLIENT_ID=Tineco
@@ -1,31 +0,0 @@
1
- import { defineComponent as s, openBlock as n, createElementBlock as p, createElementVNode as o, createVNode as a, unref as d, withCtx as _, createTextVNode as i } from "vue";
2
- import { useRouter as m } from "vue-router";
3
- import { Button as l } from "@xto/base";
4
- import { a as c } from "./index-BqRv1bdN.js";
5
- const f = { class: "error-page" }, u = { class: "error-page__content" }, g = /* @__PURE__ */ s({
6
- __name: "403",
7
- setup(v) {
8
- const r = m(), t = () => {
9
- r.push("/");
10
- };
11
- return (x, e) => (n(), p("div", f, [
12
- o("div", u, [
13
- e[1] || (e[1] = o("div", { class: "error-page__code" }, "403", -1)),
14
- e[2] || (e[2] = o("div", { class: "error-page__title" }, "无访问权限", -1)),
15
- e[3] || (e[3] = o("div", { class: "error-page__desc" }, "抱歉,您没有权限访问此页面", -1)),
16
- a(d(l), {
17
- type: "primary",
18
- onClick: t
19
- }, {
20
- default: _(() => [...e[0] || (e[0] = [
21
- i("返回首页", -1)
22
- ])]),
23
- _: 1
24
- })
25
- ])
26
- ]));
27
- }
28
- }), V = /* @__PURE__ */ c(g, [["__scopeId", "data-v-f6105e3d"]]);
29
- export {
30
- V as default
31
- };
@@ -1,31 +0,0 @@
1
- import { defineComponent as s, openBlock as n, createElementBlock as a, createElementVNode as o, createVNode as p, unref as _, withCtx as d, createTextVNode as i } from "vue";
2
- import { useRouter as m } from "vue-router";
3
- import { Button as c } from "@xto/base";
4
- import { a as l } from "./index-BqRv1bdN.js";
5
- const f = { class: "error-page" }, u = { class: "error-page__content" }, g = /* @__PURE__ */ s({
6
- __name: "404",
7
- setup(v) {
8
- const r = m(), t = () => {
9
- r.push("/");
10
- };
11
- return (x, e) => (n(), a("div", f, [
12
- o("div", u, [
13
- e[1] || (e[1] = o("div", { class: "error-page__code" }, "404", -1)),
14
- e[2] || (e[2] = o("div", { class: "error-page__title" }, "页面不存在", -1)),
15
- e[3] || (e[3] = o("div", { class: "error-page__desc" }, "抱歉,您访问的页面不存在或已被删除", -1)),
16
- p(_(c), {
17
- type: "primary",
18
- onClick: t
19
- }, {
20
- default: d(() => [...e[0] || (e[0] = [
21
- i("返回首页", -1)
22
- ])]),
23
- _: 1
24
- })
25
- ])
26
- ]));
27
- }
28
- }), V = /* @__PURE__ */ l(g, [["__scopeId", "data-v-f1a1acb0"]]);
29
- export {
30
- V as default
31
- };
@@ -1,15 +0,0 @@
1
- import { openBlock as t, createElementBlock as c, createElementVNode as e } from "vue";
2
- import { a as n } from "./index-BqRv1bdN.js";
3
- const r = {}, s = { class: "page" };
4
- function a(l, o) {
5
- return t(), c("div", s, [...o[0] || (o[0] = [
6
- e("div", { class: "page__placeholder" }, [
7
- e("h2", null, "角色管理"),
8
- e("p", null, "功能开发中...")
9
- ], -1)
10
- ])]);
11
- }
12
- const p = /* @__PURE__ */ n(r, [["render", a], ["__scopeId", "data-v-0802c3db"]]);
13
- export {
14
- p as default
15
- };
@@ -1,98 +0,0 @@
1
- import { defineComponent as c, reactive as f, ref as w, openBlock as y, createElementBlock as V, createElementVNode as s, createVNode as l, unref as o, withCtx as t, withKeys as b, createTextVNode as v } from "vue";
2
- import { u as x, _ as h, a as k } from "./index-BqRv1bdN.js";
3
- import { Button as z } from "@xto/base";
4
- import { Form as B, FormItem as i, Input as p } from "@xto/form";
5
- import "vue-router";
6
- const C = { class: "login" }, I = { class: "login__container" }, N = /* @__PURE__ */ c({
7
- __name: "index",
8
- setup(q) {
9
- const { login: m, loading: _ } = x(), r = f({
10
- uid: "",
11
- password: ""
12
- }), g = {
13
- uid: [
14
- { required: !0, message: "请输入账号", trigger: "blur" }
15
- ],
16
- password: [
17
- { required: !0, message: "请输入密码", trigger: "blur" }
18
- ]
19
- }, n = w(), u = async () => {
20
- var a;
21
- try {
22
- await ((a = n.value) == null ? void 0 : a.validate()), await m(r.uid, r.password);
23
- } catch (e) {
24
- console.error("登录失败", e);
25
- }
26
- };
27
- return (a, e) => (y(), V("div", C, [
28
- s("div", I, [
29
- e[3] || (e[3] = s("div", { class: "login__header" }, [
30
- s("img", {
31
- src: h,
32
- alt: "Logo",
33
- class: "login__logo"
34
- }),
35
- s("h1", { class: "login__title" }, "Analysis Web"),
36
- s("p", { class: "login__subtitle" }, "后台管理系统")
37
- ], -1)),
38
- l(o(B), {
39
- ref_key: "formRef",
40
- ref: n,
41
- model: r,
42
- rules: g,
43
- class: "login__form",
44
- "label-width": "0"
45
- }, {
46
- default: t(() => [
47
- l(o(i), { prop: "uid" }, {
48
- default: t(() => [
49
- l(o(p), {
50
- modelValue: r.uid,
51
- "onUpdate:modelValue": e[0] || (e[0] = (d) => r.uid = d),
52
- placeholder: "请输入账号",
53
- size: "large"
54
- }, null, 8, ["modelValue"])
55
- ]),
56
- _: 1
57
- }),
58
- l(o(i), { prop: "password" }, {
59
- default: t(() => [
60
- l(o(p), {
61
- modelValue: r.password,
62
- "onUpdate:modelValue": e[1] || (e[1] = (d) => r.password = d),
63
- type: "password",
64
- placeholder: "请输入密码",
65
- size: "large",
66
- "show-password": "",
67
- onKeyup: b(u, ["enter"])
68
- }, null, 8, ["modelValue"])
69
- ]),
70
- _: 1
71
- }),
72
- l(o(i), null, {
73
- default: t(() => [
74
- l(o(z), {
75
- type: "primary",
76
- size: "large",
77
- loading: o(_),
78
- class: "login__submit",
79
- onClick: u
80
- }, {
81
- default: t(() => [...e[2] || (e[2] = [
82
- v(" 登录 ", -1)
83
- ])]),
84
- _: 1
85
- }, 8, ["loading"])
86
- ]),
87
- _: 1
88
- })
89
- ]),
90
- _: 1
91
- }, 8, ["model"])
92
- ])
93
- ]));
94
- }
95
- }), R = /* @__PURE__ */ k(N, [["__scopeId", "data-v-728dba9d"]]);
96
- export {
97
- R as default
98
- };