xto-fronted 0.1.10 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -1 +1,20 @@
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"})});
1
+ (function(a,z){typeof exports=="object"&&typeof module<"u"?z(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"],z):(a=typeof globalThis<"u"?globalThis:a||self,z(a.XtoFronted={},a.axios,a.feedback,a.Vue,a.Pinia,a.VueRouter,a.navigation,a.base,a.form))})(this,function(a,z,I,e,W,b,x,$,M){"use strict";let G={...{appName:"XTO App",baseUrl:"",appId:"",clientId:"",indexPath:"/dashboard",loginPath:"/login"}};function se(t){G={...G,...t}}function S(){return G}function we(t){return G[t]}const Y=()=>`tooyu-cloud:${S().appId}:`,re=t=>({get(o){const n=Y(),s=t.getItem(n+o);if(!s)return null;try{return JSON.parse(s)}catch{return s}},set(o,n){const s=Y();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=Y();t.removeItem(n+o)},clear(){const o=Y();Object.keys(t).forEach(s=>{s.startsWith(o)&&t.removeItem(s)})}}),q=re(window.localStorage),H=re(window.sessionStorage),k={get:q.get,set:q.set,remove:q.remove,clear:q.clear},Ne={get:H.get,set:H.set,remove:H.remove,clear:H.clear},J="login_info",Ee="user_info",A=()=>k.get(J),ae=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};k.set(J,o)},Q=()=>{const t=A();return(t==null?void 0:t.accessToken)||null},le=()=>{const t=A();return(t==null?void 0:t.tokenType)||"Bearer"},Ce=()=>{const t=A();return(t==null?void 0:t.code)||null},Z=()=>{k.remove(J),k.remove(Ee)},v=()=>!!Q(),Ve=()=>{const t=S(),o=z.create({baseURL:t.baseUrl,timeout:15e3,headers:{"Content-Type":"application/json"}});return o.interceptors.request.use(n=>{const s=Q();if(s){const r=le();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:(I.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:I.Message.error("登录已过期,请重新登录"),Z(),window.location.href="/login";break;case 404:I.Message.error("请求资源不存在");break;case 500:I.Message.error("服务器错误");break;default:I.Message.error(((r=s.data)==null?void 0:r.message)||"请求失败")}else I.Message.error("网络连接失败");return Promise.reject(n)}),o};let X=null;function U(){return X||(X=Ve()),X}function ce(){X=null}new Proxy({},{get(t,o){return U()[o]}});const R={get(t,o){return U().get(t,o).then(n=>n.data)},post(t,o,n){return U().post(t,o,n).then(s=>s.data)},put(t,o,n){return U().put(t,o,n).then(s=>s.data)},patch(t,o,n){return U().patch(t,o,n).then(s=>s.data)},delete(t,o){return U().delete(t,o).then(n=>n.data)}},ie="/vite.svg",O=W.defineStore("app",()=>{const t=e.ref(k.get("isDark")||!1),o=e.ref(k.get("theme")||"light"),n=e.ref(k.get("layout")||"sidebar"),s=e.ref(k.get("isCollapsed")||!1),r=e.ref(k.get("showTabs")??!0),h=e.ref(k.get("showFooter")??!0),c=e.ref(k.get("showBreadcrumb")??!0),l=e.ref(k.get("primaryColor")||"#409eff"),d=e.ref(k.get("isGrayscale")||!1),u=e.ref([]),f=e.computed(()=>t.value?"dark":"light"),_=()=>{t.value=!t.value,o.value=t.value?"dark":"light",m()},p=N=>{o.value=N,t.value=N==="dark",m()},m=()=>{const N=document.documentElement;t.value?N.classList.add("dark"):N.classList.remove("dark"),k.set("isDark",t.value),k.set("theme",o.value)},i=()=>{s.value=!s.value,k.set("isCollapsed",s.value)},y=N=>{n.value=N,k.set("layout",N)},g=()=>{r.value=!r.value,k.set("showTabs",r.value)},w=()=>{h.value=!h.value,k.set("showFooter",h.value)},C=()=>{c.value=!c.value,k.set("showBreadcrumb",c.value)},B=N=>{l.value=N,document.documentElement.style.setProperty("--color-primary",N),k.set("primaryColor",N)},D=N=>{d.value=N;const j=document.documentElement;N?j.classList.add("grayscale"):j.classList.remove("grayscale"),k.set("isGrayscale",N)},F=N=>{u.value.includes(N)||u.value.push(N)},L=N=>{const j=u.value.indexOf(N);j>-1&&u.value.splice(j,1)},E=()=>{u.value=[]},V=()=>{m(),l.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",l.value),d.value&&document.documentElement.classList.add("grayscale")};return e.watch(t,m),{isDark:t,theme:o,layout:n,isCollapsed:s,showTabs:r,showFooter:h,showBreadcrumb:c,primaryColor:l,isGrayscale:d,cachedViews:u,themeClass:f,toggleTheme:_,toggleCollapse:i,setTheme:p,setLayout:y,toggleTabs:g,toggleFooter:w,toggleBreadcrumb:C,setPrimaryColor:B,setGrayscale:D,addCachedView:F,removeCachedView:L,clearCachedViews:E,initTheme:V}}),ee=W.defineStore("auth",()=>{const t=e.ref(A()),o=e.computed(()=>v()),n=l=>{ae(l),t.value=A()},s=()=>{t.value=null,Z()},r=e.computed(()=>{var l;return((l=t.value)==null?void 0:l.accessToken)||null}),h=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:o,accessToken:r,tokenType:h,code:c,login:n,logout:s}}),te=W.defineStore("user",()=>{const t=e.ref(k.get("user_info")),o=e.computed(()=>!!t.value),n=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:o,userName:n,avatar:s,userId:r,setUserInfo:l=>{t.value=l,k.set("user_info",l)},clearUserInfo:()=>{t.value=null,k.remove("user_info")}}}),P=W.defineStore("menu",()=>{const t="menu_list",o="menu_btn_list",n=e.ref(k.get(t)||[]),s=e.ref(k.get(o)||{}),r=e.computed(()=>n.value.length>0),h=e.computed(()=>{const _=S();function p(i){if(i&&i.length>0)for(let y=0;y<i.length;y++){const g=i[y];if(g.default)return g.path;{const w=p(g.children||[]);if(w)return w}}return null}return p(n.value)||_.indexPath||"/dashboard"}),c=(_,p)=>{const m=[];return!_||_.length<=0||_.forEach(i=>{if(i.type===1){const y={code:i.menuCode,name:i.menuName,path:"",title:i.menuName},g=p||"";let w=s.value[g]||[];w.push(y),s.value[g]=w}else{const y=[];let g=i.menuUrl,w=i.isOut||!1;!w&&i.menuUrl&&(i.menuUrl.startsWith("http")?g="/iframe/"+encodeURIComponent(g):i.menuUrl.startsWith("keep-alive:")&&(g="/iframe/keep-alive/"+encodeURIComponent(g.split("keep-alive:")[1])));const C={code:i.menuCode,name:i.menuName,path:g,icon:"grid",closable:i.closable,default:i.isDefault,out:w,children:y,title:i.menuName};if(m.push(C),i.children&&i.children.length>0){const B=c(i.children,i.menuUrl);C.children=B}}}),m},l=_=>{n.value=_,k.set(t,_)},d=_=>{const p=n.value.findIndex(m=>m.code==="home");p>-1&&n.value.splice(p,1),n.value.unshift({..._,code:"home",name:"首页"}),k.set(t,n.value)},u=(_,p)=>{if(f(),!(p!=null&&p.skipIndexMenu)){const i=S();n.value.push({code:"home",name:"首页",icon:"grid",closable:!1,default:!1,out:!1,path:i.indexPath||"/dashboard",title:"首页"})}const m=c(_);n.value.push(...m),k.set(t,n.value),k.set(o,s.value)},f=()=>{n.value=[],s.value={},k.remove(t),k.remove(o)};return{menuList:n,menuBtnListMap:s,hasMenu:r,index:h,setMenuList:l,setIndexMenu:d,setMenuFromRemote:u,clearMenu:f}});function de(t){const o=S();return R.post("/user/v1.0/login/by-domain",{appId:o.appId,clientId:o.clientId,uid:t.uid,password:t.password,code:!0})}function ue(){return R.put("/user/v1.0/user/logout")}function Be(t,o){return R.get(`/user/v1.0/login/by-code?appId=${t}&code=${o}`)}function me(){return R.get("/user/v1.0/user/get-me")}function he(){const t=S();return R.get(`/user/v1.0/menu/get-menu?appId=${t.appId}`)}function K(){const t=b.useRouter(),o=b.useRoute(),n=ee(),s=te(),r=P(),h=e.ref(!1),c=e.computed(()=>n.isLoggedIn),l=e.computed(()=>s.userInfo),d=e.computed(()=>s.userName||""),u=e.computed(()=>r.menuList),f=e.computed(()=>r.index),_=async(w,C)=>{h.value=!0;try{g();const D=(await de({uid:w,password:C})).data;n.login(D),await m(),await i();const F=o.query.redirectUrl;if(F){const L=decodeURIComponent(F);if(L.startsWith("http")){const E=D.code;location.href=L.includes("?")?`${L}&code=${E}`:`${L}?code=${E}`}else await t.replace(L)}else await t.replace(f.value||"/");return I.Message.success("登录成功"),{success:!0,data:D}}catch(B){return I.Message.error((B==null?void 0:B.message)||"登录失败"),{success:!1,error:B}}finally{h.value=!1}},p=async(w=!0)=>{const C=S();try{await ue()}catch(B){console.error("退出登录接口失败",B)}finally{g(),t.push(C.loginPath||"/login"),w&&I.Message.success("退出登录成功")}},m=async()=>{const w=await me();return s.setUserInfo(w.data),w.data},i=async()=>{const w=await he();return r.setMenuFromRemote(w.data),r.menuList},y=async()=>{if(!n.isLoggedIn)return!1;try{return s.userInfo||await m(),r.hasMenu||await i(),!0}catch(w){return console.error("初始化应用失败",w),g(),!1}},g=()=>{n.logout(),s.clearUserInfo(),r.clearMenu()};return{loading:h,isLoggedIn:c,userInfo:l,userName:d,menuList:u,indexPath:f,login:_,logout:p,loadUserInfo:m,loadMenu:i,initApp:y,clearAllState:g}}function Se(){const t=P(),o=ee(),n=te(),s=e.computed(()=>o.isLoggedIn),r=e.computed(()=>n.userName),h=e.computed(()=>n.userInfo),c=f=>{const _=window.location.pathname,m=(t.menuBtnListMap[_]||[]).map(i=>i.code);return Array.isArray(f)?f.some(i=>m.includes(i)):m.includes(f)};return{isLoggedIn:s,userName:r,userInfo:h,hasPermission:c,hasAnyPermission:f=>f.some(_=>c(_)),hasAllPermissions:f=>f.every(_=>c(_)),getCurrentPagePermissions:()=>{const f=window.location.pathname;return(t.menuBtnListMap[f]||[]).map(p=>p.code)}}}function ne(){const t=b.useRoute(),o=b.useRouter(),n=P(),s=O(),r=e.ref(""),h=e.computed(()=>t.path),c=e.computed(()=>s.isCollapsed),l=e.computed(()=>n.menuList),d=e.computed(()=>n.hasMenu),u=(y,g="")=>{const w=[];return y.forEach(C=>{C.children&&C.children.length>0?w.push(...u(C.children,C.title)):w.push({...C,parentTitle:g})}),w},f=e.computed(()=>r.value.trim()?u(l.value).filter(g=>g.title.toLowerCase().includes(r.value.toLowerCase())):[]),_=e.computed(()=>r.value.trim()?l.value.map(y=>{if(y.children&&y.children.length>0){const g=y.children.filter(w=>w.title.toLowerCase().includes(r.value.toLowerCase()));return g.length>0?{...y,children:g}:null}return y.title.toLowerCase().includes(r.value.toLowerCase())?y:null}).filter(Boolean):l.value);return{searchKeyword:r,activeMenu:h,isCollapsed:c,menuList:l,hasMenu:d,searchResults:f,filteredMenuList:_,flattenMenus:u,handleMenuSelect:y=>{y&&y!==t.path&&(o.push(y),r.value="")},handleSearchItemClick:y=>{o.push(y),r.value=""},clearSearch:()=>{r.value=""}}}function be(t,o={}){const{rules:n,onSubmit:s}=o,r=e.ref(),h=e.reactive({...t}),c=e.ref(!1),l=e.ref(!1),d=e.ref(!1),u=()=>{p(),d.value=!1,l.value=!0},f=i=>{Object.assign(h,i),d.value=!0,l.value=!0},_=()=>{l.value=!1,p()},p=()=>{var i;Object.keys(t).forEach(y=>{h[y]=t[y]}),(i=r.value)==null||i.resetFields()};return{formRef:r,formData:h,rules:n,loading:c,visible:l,isEdit:d,openAdd:u,openEdit:f,close:_,resetForm:p,handleSubmit:async()=>{var i;try{await((i=r.value)==null?void 0:i.validate()),c.value=!0,await(s==null?void 0:s(h)),_()}catch(y){console.error(y)}finally{c.value=!1}}}}function Ie(t){const{fetchData:o,defaultPageSize:n=10}=t,s=e.ref(!1),r=e.ref([]),h=e.ref(0),c=e.ref(1),l=e.ref(n),d=e.reactive({}),u=async()=>{s.value=!0;try{const g={...d,page:c.value,pageSize:l.value},w=await o(g);r.value=w.list,h.value=w.total}catch(g){console.error(g)}finally{s.value=!1}},f=()=>{c.value=1,u()},_=()=>{Object.keys(d).forEach(g=>{d[g]=void 0}),c.value=1,u()},p=g=>{c.value=g,u()},m=g=>{l.value=g,c.value=1,u()},i=()=>{u()},y=e.computed(()=>({current:c.value,pageSize:l.value,total:h.value}));return{loading:s,data:r,total:h,currentPage:c,pageSize:l,searchParams:d,pagination:y,getData:u,handleSearch:f,handleReset:_,handlePageChange:p,handleSizeChange:m,refresh:i}}const Le={class:"sidebar"},Te={class:"sidebar__logo"},$e={key:1},xe={key:0,class:"sidebar__user"},Me={class:"sidebar__user-info"},Ue={class:"sidebar__user-name"},Pe={class:"sidebar__user-role"},De=e.defineComponent({__name:"Sidebar",setup(t){const{logout:o,userName:n,userInfo:s}=K(),r=S(),{activeMenu:h,isCollapsed:c,filteredMenuList:l,handleMenuSelect:d}=ne();return(u,f)=>{var _;return e.openBlock(),e.createElementBlock("div",Le,[e.createElementVNode("div",Te,[f[0]||(f[0]=e.createElementVNode("img",{src:ie,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.createVNode(e.unref(x.Menu),{"default-active":e.unref(h),collapse:e.unref(c),"collapse-transition":!1,class:"sidebar__menu",onSelect:e.unref(d)},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(l),p=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:p.path},[p.children&&p.children.length>0?(e.openBlock(),e.createBlock(e.unref(x.SubMenu),{key:0,index:p.path,icon:"grid"},{title:e.withCtx(()=>[e.withDirectives(e.createElementVNode("span",null,e.toDisplayString(p.title),513),[[e.vShow,!e.unref(c)]])]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.children,m=>(e.openBlock(),e.createBlock(e.unref(x.MenuItem),{key:m.path,index:m.path,icon:"grid"},{default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(m.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(x.MenuItem),{key:1,index:p.path,icon:"grid"},{default:e.withCtx(()=>[e.unref(c)?(e.openBlock(),e.createBlock(e.unref(I.Tooltip),{key:0,content:p.title,placement:"right"},{default:e.withCtx(()=>[...f[1]||(f[1]=[e.createElementVNode("span",null,null,-1)])]),_:1},8,["content"])):(e.openBlock(),e.createElementBlock("span",$e,e.toDisplayString(p.title),1))]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse","onSelect"]),e.unref(c)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",xe,[e.createElementVNode("div",Me,[e.createElementVNode("span",Ue,e.toDisplayString(e.unref(n)||"用户"),1),e.createElementVNode("span",Pe,e.toDisplayString(((_=e.unref(s))==null?void 0:_.departmentName)||""),1)]),e.createVNode(e.unref($.Button),{type:"text",size:"small",onClick:e.unref(o)},{default:e.withCtx(()=>[...f[2]||(f[2]=[e.createTextVNode("退出",-1)])]),_:1},8,["onClick"])]))])}}}),T=(t,o)=>{const n=t.__vccOpts||t;for(const[s,r]of o)n[s]=r;return n},fe=T(De,[["__scopeId","data-v-363654cb"]]),Fe=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
2
+ <rect x="3" y="3" width="18" height="4" rx="1"/>
3
+ <rect x="3" y="9" width="6" height="12" rx="1"/>
4
+ <rect x="11" y="9" width="10" height="12" rx="1"/>
5
+ </svg>`,Ae=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
6
+ <rect x="3" y="3" width="18" height="4" rx="1"/>
7
+ <rect x="3" y="9" width="18" height="12" rx="1"/>
8
+ </svg>`,Re={class:"setting-drawer"},Oe={class:"setting-section"},ze={class:"setting-section__content"},qe={class:"layout-options"},He=["onClick"],Ke=["innerHTML"],je={class:"layout-option__label"},We={class:"setting-section"},Ge={class:"setting-section__content"},Ye={class:"setting-item"},pe=T(e.defineComponent({inheritAttrs:!1,__name:"index",props:{visible:{type:Boolean}},emits:["update:visible"],setup(t,{emit:o}){const n=O(),s={navLeft:Fe,navTop:Ae},r=[{value:"sidebar",label:"左侧导航",icon:"navLeft"},{value:"top",label:"顶部导航",icon:"navTop"}],h=e.computed({get:()=>n.layout,set:d=>n.setLayout(d)}),c=o,l=()=>{c("update:visible",!1)};return(d,u)=>(e.openBlock(),e.createBlock(e.unref(I.Drawer),{"model-value":t.visible,title:"皮肤设置",direction:"rtl",size:280,"onUpdate:modelValue":l},{default:e.withCtx(()=>[e.createElementVNode("div",Re,[e.createElementVNode("div",Oe,[u[0]||(u[0]=e.createElementVNode("h4",{class:"setting-section__title"},"导航模式",-1)),e.createElementVNode("div",ze,[e.createElementVNode("div",qe,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(r,f=>e.createElementVNode("div",{key:f.value,class:e.normalizeClass(["layout-option",{"is-active":h.value===f.value}]),onClick:_=>h.value=f.value},[e.createElementVNode("div",{class:"layout-option__preview",innerHTML:s[f.icon]},null,8,Ke),e.createElementVNode("span",je,e.toDisplayString(f.label),1)],10,He)),64))])])]),e.createElementVNode("div",We,[u[2]||(u[2]=e.createElementVNode("h4",{class:"setting-section__title"},"界面设置",-1)),e.createElementVNode("div",Ge,[e.createElementVNode("div",Ye,[u[1]||(u[1]=e.createElementVNode("span",{class:"setting-item__label"},"灰度模式",-1)),e.createVNode(e.unref(M.Switch),{"model-value":e.unref(n).isGrayscale,"onUpdate:modelValue":e.unref(n).setGrayscale},null,8,["model-value","onUpdate:modelValue"])])])])])]),_:1},8,["model-value"]))}}),[["__scopeId","data-v-14d31c8c"]]),Xe={class:"header"},Je={class:"header__left"},Qe={class:"header__right"},Ze={key:0,class:"header__search-results"},ve=["onClick"],et={class:"header__search-info"},tt={class:"header__search-title"},nt={key:0,class:"header__search-parent"},ot=["title"],st={class:"header__avatar"},rt={class:"header__user-name"},at={key:0,class:"header__dropdown"},lt={class:"header__dropdown-header"},ct={class:"header__dropdown-avatar"},it={class:"header__dropdown-info"},dt={class:"header__dropdown-name"},ut={class:"header__dropdown-role"},mt={class:"header__dropdown-menu"},oe=T(e.defineComponent({__name:"Header",props:{showCollapse:{type:Boolean}},setup(t){const o=O(),{logout:n,userName:s,userInfo:r}=K(),{searchKeyword:h,searchResults:c,handleSearchItemClick:l}=ne(),d=e.ref(!1),u=e.ref(null),f=e.ref(null),_=e.ref(!1),p=e.ref(!1),m=e.computed(()=>s.value||"用户"),i=()=>{o.toggleCollapse()},y=()=>{o.toggleTheme()},g=()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},w=()=>{_.value=!!document.fullscreenElement},C=()=>{d.value=!d.value},B=()=>{d.value=!1},D=async()=>{B(),await n()},F=L=>{u.value&&!u.value.contains(L.target)&&B(),f.value&&!f.value.contains(L.target)&&(h.value="")};return e.onMounted(()=>{document.addEventListener("click",F),document.addEventListener("fullscreenchange",w)}),e.onUnmounted(()=>{document.removeEventListener("click",F),document.removeEventListener("fullscreenchange",w)}),(L,E)=>(e.openBlock(),e.createElementBlock("div",Xe,[e.createElementVNode("div",Je,[t.showCollapse?(e.openBlock(),e.createElementBlock("div",{key:0,class:"header__collapse",onClick:i},[...E[3]||(E[3]=[e.createElementVNode("span",null,"☰",-1)])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",Qe,[e.createElementVNode("div",{class:"header__search",ref_key:"searchRef",ref:f},[e.createVNode(e.unref(M.Input),{modelValue:e.unref(h),"onUpdate:modelValue":E[0]||(E[0]=V=>e.isRef(h)?h.value=V:null),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),e.unref(c).length>0?(e.openBlock(),e.createElementBlock("div",Ze,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(c),V=>(e.openBlock(),e.createElementBlock("div",{key:V.path,class:"header__search-item",onClick:N=>e.unref(l)(V.path)},[e.createVNode(e.unref($.Icon),{name:"grid",size:16,class:"header__search-icon"}),e.createElementVNode("div",et,[e.createElementVNode("span",tt,e.toDisplayString(V.title),1),V.parentTitle?(e.openBlock(),e.createElementBlock("span",nt,e.toDisplayString(V.parentTitle),1)):e.createCommentVNode("",!0)])],8,ve))),128))])):e.createCommentVNode("",!0)],512),e.createElementVNode("div",{class:"header__action",onClick:g,title:_.value?"退出全屏":"全屏"},[e.createVNode(e.unref($.Icon),{name:_.value?"fullscreen-exit":"fullscreen",size:16},null,8,["name"])],8,ot),e.createElementVNode("div",{class:"header__action",onClick:y,title:"切换主题"},[e.createVNode(e.unref($.Icon),{name:e.unref(o).isDark?"sun":"moon",size:16},null,8,["name"])]),e.createElementVNode("div",{class:"header__action",onClick:E[1]||(E[1]=V=>p.value=!0),title:"皮肤设置"},[e.createVNode(e.unref($.Icon),{name:"skin",size:16})]),e.createElementVNode("div",{class:"header__user",ref_key:"dropdownRef",ref:u},[e.createElementVNode("div",{class:"header__user-trigger",onClick:e.withModifiers(C,["stop"])},[e.createElementVNode("div",st,[e.createElementVNode("span",null,e.toDisplayString(m.value.charAt(0)),1)]),e.createElementVNode("span",rt,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 V;return[d.value?(e.openBlock(),e.createElementBlock("div",at,[e.createElementVNode("div",lt,[e.createElementVNode("div",ct,[e.createElementVNode("span",null,e.toDisplayString(m.value.charAt(0)),1)]),e.createElementVNode("div",it,[e.createElementVNode("div",dt,e.toDisplayString(m.value),1),e.createElementVNode("div",ut,e.toDisplayString(((V=e.unref(r))==null?void 0:V.departmentName)||""),1)])]),E[5]||(E[5]=e.createElementVNode("div",{class:"header__dropdown-divider"},null,-1)),e.createElementVNode("div",mt,[e.createElementVNode("div",{class:"header__dropdown-item header__dropdown-item--danger",onClick:D},[e.createVNode(e.unref($.Icon),{name:"logout",size:16}),E[4]||(E[4]=e.createElementVNode("span",null,"退出登录",-1))])])])):e.createCommentVNode("",!0)]}),_:1})],512)]),e.createVNode(pe,{visible:p.value,"onUpdate:visible":E[2]||(E[2]=V=>p.value=V)},null,8,["visible"])]))}}),[["__scopeId","data-v-175c2432"]]),ht={class:"top-menu"},ft=T(e.defineComponent({__name:"TopMenu",setup(t){const o=b.useRoute(),n=b.useRouter(),s=P(),r=e.computed(()=>o.path),h=c=>{n.push(c)};return(c,l)=>(e.openBlock(),e.createElementBlock("div",ht,[e.createVNode(e.unref(x.Menu),{"default-active":r.value,mode:"horizontal",class:"top-menu__inner",onSelect:h},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s).menuList,d=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:d.path},[d.children&&d.children.length>0?(e.openBlock(),e.createBlock(e.unref(x.SubMenu),{key:0,index:d.path,icon:"grid"},{title:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.children,u=>(e.openBlock(),e.createBlock(e.unref(x.MenuItem),{key:u.path,index:u.path,icon:"grid"},{default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(u.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(x.MenuItem),{key:1,index:d.path,icon:"grid"},{default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(d.title),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active"])]))}}),[["__scopeId","data-v-f9b502d8"]]),pt={class:"layout__main"},_t={class:"layout__content"},gt={class:"layout__top"},yt={class:"layout__content"},_e=T(e.defineComponent({__name:"index",setup(t){const o=O(),n=e.computed(()=>o.isCollapsed?"64px":"210px"),s=e.computed(()=>o.layout),r=e.computed(()=>s.value==="sidebar"),h=e.computed(()=>s.value==="sidebar");return(c,l)=>{const d=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["layout",`layout--${s.value}`])},[r.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("aside",{class:"layout__aside",style:e.normalizeStyle({width:n.value})},[e.createVNode(fe)],4),e.createElementVNode("div",pt,[e.createVNode(oe,{class:"layout__header","show-collapse":h.value},null,8,["show-collapse"]),e.createElementVNode("main",_t,[e.createVNode(d)])])],64)):s.value==="top"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",gt,[l[0]||(l[0]=e.createElementVNode("div",{class:"layout__logo"},[e.createElementVNode("img",{src:ie,alt:"Logo",class:"layout__logo-img"})],-1)),e.createVNode(ft),e.createVNode(oe,{class:"layout__header--top","show-collapse":!1})]),e.createElementVNode("main",yt,[e.createVNode(d)])],64)):e.createCommentVNode("",!0)],2)}}}),[["__scopeId","data-v-a2789d75"]]),kt={},wt={class:"tabs-wrapper"};function Nt(t,o){return e.openBlock(),e.createElementBlock("div",wt)}const Et=T(kt,[["render",Nt],["__scopeId","data-v-3b1e382a"]]),Ct={},Vt={class:"footer"};function Bt(t,o){return e.openBlock(),e.createElementBlock("div",Vt,[...o[0]||(o[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const St=T(Ct,[["render",Bt],["__scopeId","data-v-317ae311"]]),bt=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
9
+ <circle cx="12" cy="8" r="4"/>
10
+ <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
11
+ </svg>`,It=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
12
+ <rect x="3" y="11" width="18" height="11" rx="2" ry="2"/>
13
+ <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
14
+ </svg>`,Lt=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
15
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/>
16
+ <circle cx="12" cy="12" r="3"/>
17
+ </svg>`,Tt=`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
18
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/>
19
+ <line x1="1" y1="1" x2="23" y2="23"/>
20
+ </svg>`,$t={class:"login"},xt={class:"login__container"},Mt={class:"login__header"},Ut=["src"],Pt={class:"login__title"},Dt={class:"login__subtitle"},Ft=["innerHTML"],At=["innerHTML"],Rt=["innerHTML"],Ot=T(e.defineComponent({__name:"index",props:{logo:{},title:{},subtitle:{}},emits:["success","error"],setup(t,{emit:o}){const n=o,{login:s,loading:r}=K(),h=S(),c=e.reactive({uid:"",password:""}),l=e.ref(!1),d={uid:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},u=e.ref(),f={user:bt,lock:It,eye:Lt,eyeOff:Tt},_=async()=>{var p;try{await((p=u.value)==null?void 0:p.validate());const m=await s(c.uid,c.password);m.success?n("success",m.data):n("error",m.error)}catch(m){console.error("登录失败",m),n("error",m)}};return(p,m)=>(e.openBlock(),e.createElementBlock("div",$t,[e.createElementVNode("div",xt,[e.createElementVNode("div",Mt,[e.createElementVNode("img",{src:t.logo||"/vite.svg",alt:"Logo",class:"login__logo"},null,8,Ut),e.createElementVNode("h1",Pt,e.toDisplayString(t.title||e.unref(h).appName),1),e.createElementVNode("p",Dt,e.toDisplayString(t.subtitle||"后台管理系统"),1)]),e.createVNode(e.unref(M.Form),{ref_key:"formRef",ref:u,model:c,rules:d,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref(M.FormItem),{prop:"uid"},{default:e.withCtx(()=>[e.createVNode(e.unref(M.Input),{modelValue:c.uid,"onUpdate:modelValue":m[0]||(m[0]=i=>c.uid=i),placeholder:"请输入账号",size:"large"},{prefix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon",innerHTML:f.user},null,8,Ft)]),_:1},8,["modelValue"])]),_:1}),e.createVNode(e.unref(M.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref(M.Input),{modelValue:c.password,"onUpdate:modelValue":m[2]||(m[2]=i=>c.password=i),type:l.value?"text":"password",placeholder:"请输入密码",size:"large",onKeyup:e.withKeys(_,["enter"])},{prefix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon",innerHTML:f.lock},null,8,At)]),suffix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon login__input-icon--clickable",onClick:m[1]||(m[1]=i=>l.value=!l.value),innerHTML:l.value?f.eyeOff:f.eye},null,8,Rt)]),_:1},8,["modelValue","type"])]),_:1}),e.createVNode(e.unref(M.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref($.Button),{type:"primary",size:"large",loading:e.unref(r),class:"login__submit",onClick:_},{default:e.withCtx(()=>[...m[3]||(m[3]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])]))}}),[["__scopeId","data-v-a48f4a52"]]),zt={class:"error-page"},qt={class:"error-page__content"},Ht=T(e.defineComponent({__name:"404",setup(t){const o=b.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",zt,[e.createElementVNode("div",qt,[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($.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-6fc8a81b"]]),Kt={class:"error-page"},jt={class:"error-page__content"},Wt=T(e.defineComponent({__name:"403",setup(t){const o=b.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Kt,[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($.Button),{type:"primary",onClick:n},{default:e.withCtx(()=>[...r[0]||(r[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-f9466667"]]);function Gt(t){const o=P(),n=window.location.pathname,r=(o.menuBtnListMap[n]||[]).map(h=>h.code);return Array.isArray(t)?t.some(h=>r.includes(h)):r.includes(t)}const Yt=["/login","/404","/403"];function Xt(t,o){const n=S(),s=b.createRouter({history:b.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,h,c)=>{const l=O();if(l.initTheme(),v())if(r.path===n.loginPath)c({path:n.indexPath||"/"});else{const{initApp:d,isLoggedIn:u}=K();if(!u.value&&!await d()){c(n.loginPath||"/login");return}r.name&&r.meta.keepAlive&&l.addCachedView(r.name),c()}else Yt.includes(r.path)?c():c({path:n.loginPath||"/login",query:{redirectUrl:encodeURIComponent(r.fullPath)}})}),s}function Jt(t,o){const n=b.createRouter({history:b.createWebHistory(),routes:o});t.matcher=n.matcher}function Qt(t){const o=S();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 Zt(t,o={}){const n=o.indexPath||"/dashboard";return{path:"/",name:"Layout",component:o.layoutComponent||_e,redirect:n,children:t}}function vt(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 ge=(t=>(t[t.ENABLED=1]="ENABLED",t[t.DISABLED=0]="DISABLED",t))(ge||{}),ye=(t=>(t[t.UNKNOWN=0]="UNKNOWN",t[t.MALE=1]="MALE",t[t.FEMALE=2]="FEMALE",t))(ye||{}),ke=(t=>(t[t.DIRECTORY=0]="DIRECTORY",t[t.MENU=1]="MENU",t[t.BUTTON=2]="BUTTON",t))(ke||{});const en={1:"启用",0:"禁用"},tn={0:"未知",1:"男",2:"女"},nn={0:"目录",1:"菜单",2:"按钮"},on=[{label:"启用",value:1},{label:"禁用",value:0}],sn=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],rn=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],an={mounted(t,o){var d;const n=P(),{value:s}=o;if(!s)return;const r=window.location.pathname,c=(n.menuBtnListMap[r]||[]).map(u=>u.code);let l=!1;Array.isArray(s)?l=s.some(u=>c.includes(u)):l=c.includes(s),l||(d=t.parentNode)==null||d.removeChild(t)}};function ln(t){return se(t),ce(),{config:S()}}a.Footer=St,a.Forbidden=Wt,a.Gender=ye,a.GenderOptions=sn,a.GenderText=tn,a.Header=oe,a.Layout=_e,a.Login=Ot,a.MenuType=ke,a.MenuTypeOptions=rn,a.MenuTypeText=nn,a.NotFound=Ht,a.SettingDrawer=pe,a.Sidebar=fe,a.Status=ge,a.StatusOptions=on,a.StatusText=en,a.Tabs=Et,a.clearToken=Z,a.createErrorRoutes=vt,a.createLayoutRoute=Zt,a.createRouter=Xt,a.createStaticRoutes=Qt,a.createXtoApp=ln,a.getCode=Ce,a.getConfig=S,a.getConfigValue=we,a.getCurrentUser=me,a.getLoginInfo=A,a.getRequest=U,a.getToken=Q,a.getTokenType=le,a.getUserMenu=he,a.hasPermission=Gt,a.hasToken=v,a.http=R,a.local=k,a.localStorageUtil=q,a.login=de,a.loginByCode=Be,a.logout=ue,a.permissionDirective=an,a.resetRequest=ce,a.resetRouter=Jt,a.session=Ne,a.sessionStorageUtil=H,a.setConfig=se,a.setLoginInfo=ae,a.useApp=K,a.useAppStore=O,a.useAuth=Se,a.useAuthStore=ee,a.useForm=be,a.useMenu=ne,a.useMenuStore=P,a.useTable=Ie,a.useUserStore=te,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
@@ -13,17 +13,4 @@ export interface DynamicRouteOptions {
13
13
  * @param options 选项
14
14
  */
15
15
  export declare function createLayoutRoute(children: RouteRecordRaw[], options?: DynamicRouteOptions): RouteRecordRaw;
16
- /**
17
- * Mock 菜单数据(用于开发)
18
- */
19
- export declare const mockMenuData: {
20
- id: number;
21
- name: string;
22
- path: string;
23
- component: string;
24
- icon: string;
25
- title: string;
26
- keepAlive: boolean;
27
- affix: boolean;
28
- }[];
29
16
  export { type RouteRecordRaw } from 'vue-router';
@@ -2,7 +2,7 @@
2
2
  * 应用状态
3
3
  */
4
4
  export type ThemeMode = 'light' | 'dark';
5
- export type LayoutMode = 'sidebar' | 'top' | 'mix';
5
+ export type LayoutMode = 'sidebar' | 'top';
6
6
  export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
7
7
  isDark: import('vue').Ref<boolean, boolean>;
8
8
  theme: import('vue').Ref<ThemeMode, ThemeMode>;
@@ -12,6 +12,7 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
12
12
  showFooter: import('vue').Ref<boolean, boolean>;
13
13
  showBreadcrumb: import('vue').Ref<boolean, boolean>;
14
14
  primaryColor: import('vue').Ref<string, string>;
15
+ isGrayscale: import('vue').Ref<boolean, boolean>;
15
16
  cachedViews: import('vue').Ref<string[], string[]>;
16
17
  themeClass: import('vue').ComputedRef<"light" | "dark">;
17
18
  toggleTheme: () => void;
@@ -22,11 +23,12 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
22
23
  toggleFooter: () => void;
23
24
  toggleBreadcrumb: () => void;
24
25
  setPrimaryColor: (color: string) => void;
26
+ setGrayscale: (value: boolean) => void;
25
27
  addCachedView: (name: string) => void;
26
28
  removeCachedView: (name: string) => void;
27
29
  clearCachedViews: () => void;
28
30
  initTheme: () => void;
29
- }, "isDark" | "theme" | "layout" | "isCollapsed" | "showTabs" | "showFooter" | "showBreadcrumb" | "primaryColor" | "cachedViews">, Pick<{
31
+ }, "isDark" | "theme" | "layout" | "isCollapsed" | "showTabs" | "showFooter" | "showBreadcrumb" | "primaryColor" | "isGrayscale" | "cachedViews">, Pick<{
30
32
  isDark: import('vue').Ref<boolean, boolean>;
31
33
  theme: import('vue').Ref<ThemeMode, ThemeMode>;
32
34
  layout: import('vue').Ref<LayoutMode, LayoutMode>;
@@ -35,6 +37,7 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
35
37
  showFooter: import('vue').Ref<boolean, boolean>;
36
38
  showBreadcrumb: import('vue').Ref<boolean, boolean>;
37
39
  primaryColor: import('vue').Ref<string, string>;
40
+ isGrayscale: import('vue').Ref<boolean, boolean>;
38
41
  cachedViews: import('vue').Ref<string[], string[]>;
39
42
  themeClass: import('vue').ComputedRef<"light" | "dark">;
40
43
  toggleTheme: () => void;
@@ -45,6 +48,7 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
45
48
  toggleFooter: () => void;
46
49
  toggleBreadcrumb: () => void;
47
50
  setPrimaryColor: (color: string) => void;
51
+ setGrayscale: (value: boolean) => void;
48
52
  addCachedView: (name: string) => void;
49
53
  removeCachedView: (name: string) => void;
50
54
  clearCachedViews: () => void;
@@ -58,6 +62,7 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
58
62
  showFooter: import('vue').Ref<boolean, boolean>;
59
63
  showBreadcrumb: import('vue').Ref<boolean, boolean>;
60
64
  primaryColor: import('vue').Ref<string, string>;
65
+ isGrayscale: import('vue').Ref<boolean, boolean>;
61
66
  cachedViews: import('vue').Ref<string[], string[]>;
62
67
  themeClass: import('vue').ComputedRef<"light" | "dark">;
63
68
  toggleTheme: () => void;
@@ -68,8 +73,9 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
68
73
  toggleFooter: () => void;
69
74
  toggleBreadcrumb: () => void;
70
75
  setPrimaryColor: (color: string) => void;
76
+ setGrayscale: (value: boolean) => void;
71
77
  addCachedView: (name: string) => void;
72
78
  removeCachedView: (name: string) => void;
73
79
  clearCachedViews: () => void;
74
80
  initTheme: () => void;
75
- }, "toggleTheme" | "toggleCollapse" | "setTheme" | "setLayout" | "toggleTabs" | "toggleFooter" | "toggleBreadcrumb" | "setPrimaryColor" | "addCachedView" | "removeCachedView" | "clearCachedViews" | "initTheme">>;
81
+ }, "toggleTheme" | "toggleCollapse" | "setTheme" | "setLayout" | "toggleTabs" | "toggleFooter" | "toggleBreadcrumb" | "setPrimaryColor" | "setGrayscale" | "addCachedView" | "removeCachedView" | "clearCachedViews" | "initTheme">>;
@@ -1,8 +1,6 @@
1
1
  /**
2
- * Pinia Store 入口
2
+ * Pinia Store 导出
3
3
  */
4
- declare const pinia: import('pinia').Pinia;
5
- export default pinia;
6
4
  export * from './user';
7
5
  export * from './auth';
8
6
  export * from './menu';
package/dist/style.css CHANGED
@@ -1 +1 @@
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
+ :root{--color-primary: #409eff;--color-primary-light-3: #79bbff;--color-primary-light-5: #a0cfff;--color-primary-light-7: #c6e2ff;--color-primary-light-8: #d9ecff;--color-primary-light-9: #ecf5ff;--color-primary-dark-2: #337ecc;--color-success: #67c23a;--color-success-light: #e1f3d8;--color-success-dark: #529b2e;--color-warning: #e6a23c;--color-warning-light: #fdf6ec;--color-warning-dark: #b88230;--color-danger: #f56c6c;--color-danger-light: #fde2e2;--color-danger-dark: #c45656;--color-info: #909399;--color-info-light: #f4f4f5;--color-info-dark: #73767a;--color-text-primary: #303133;--color-text-regular: #606266;--color-text-secondary: #909399;--color-text-placeholder: #a8abb2;--color-text-disabled: #c0c4cc;--color-border: #dcdfe6;--color-border-light: #e4e7ed;--color-border-lighter: #ebeef5;--color-border-extra-light: #f2f6fc;--color-border-dark: #d4d7de;--color-fill: #f5f7fa;--color-fill-light: #fafafa;--color-fill-lighter: #fafcff;--color-fill-blank: #ffffff;--bg-color: #ffffff;--bg-color-page: #f2f3f5;--bg-color-overlay: #ffffff;--box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);--box-shadow-light: 0 2px 8px 0 rgba(0, 0, 0, .06);--box-shadow-lighter: 0 1px 4px 0 rgba(0, 0, 0, .04);--box-shadow-dark: 0 4px 16px 0 rgba(0, 0, 0, .12);--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-size-base: 14px;--font-size-small: 12px;--font-size-large: 16px;--font-size-extra-large: 18px;--border-radius-base: 4px;--border-radius-small: 2px;--border-radius-large: 8px;--border-radius-round: 20px;--border-radius-circle: 50%;--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 16px;--spacing-lg: 24px;--spacing-xl: 32px;--component-size-large: 40px;--component-size-default: 32px;--component-size-small: 24px;--transition-duration: .3s;--transition-duration-fast: .2s;--transition-duration-slow: .5s;--z-index-dropdown: 1000;--z-index-sticky: 1020;--z-index-fixed: 1030;--z-index-modal-backdrop: 1040;--z-index-modal: 1050;--z-index-popover: 1060;--z-index-tooltip: 1070;--sidebar-width: 210px;--sidebar-collapsed-width: 64px;--header-height: 50px;--tabs-height: 40px;--footer-height: 30px}.dark{--color-text-primary: #e5eaf3;--color-text-regular: #cfd3dc;--color-text-secondary: #a3a6ad;--color-text-placeholder: #8d9095;--color-text-disabled: #6c6e72;--color-border: #4c4d4f;--color-border-light: #414243;--color-border-lighter: #363637;--color-border-extra-light: #2b2b2c;--color-border-dark: #58585b;--color-fill: #303030;--color-fill-light: #262727;--color-fill-lighter: #1d1d1d;--color-fill-blank: #141414;--bg-color: #1d1e1f;--bg-color-page: #0a0a0a;--bg-color-overlay: #1d1e1f;--box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .3);--box-shadow-light: 0 2px 8px 0 rgba(0, 0, 0, .24);--box-shadow-lighter: 0 1px 4px 0 rgba(0, 0, 0, .2);--box-shadow-dark: 0 4px 16px 0 rgba(0, 0, 0, .36)}.grayscale{--color-primary: #909399;--color-primary-light-3: #a6a9ad;--color-primary-light-5: #bcbec1;--color-primary-light-7: #d2d4d6;--color-primary-light-8: #e0e1e2;--color-primary-light-9: #eeefef;--color-primary-dark-2: #73767a;--color-success: #909399;--color-success-light: #f4f4f5;--color-success-dark: #73767a;--color-warning: #909399;--color-warning-light: #f4f4f5;--color-warning-dark: #73767a;--color-danger: #909399;--color-danger-light: #f4f4f5;--color-danger-dark: #73767a;--color-info: #909399;--color-info-light: #f4f4f5;--color-info-dark: #73767a;--color-text-primary: #5a5e66;--color-text-regular: #8a8e99;--color-text-secondary: #a8abb2;--color-text-placeholder: #c0c4cc;--color-text-disabled: #d3d4d6;--color-border: #d3d4d6;--color-border-light: #e0e1e2;--color-border-lighter: #ebedef;--color-border-extra-light: #f2f3f5;--color-border-dark: #c0c4cc;--color-fill: #f5f6f7;--color-fill-light: #fafbfb;--color-fill-lighter: #fcfcfc;--color-fill-blank: #ffffff;--bg-color: #ffffff;--bg-color-page: #f5f6f7;--bg-color-overlay: #ffffff}.grayscale img,.grayscale svg,.grayscale .xto-icon{filter:grayscale(100%)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{width:100%;height:100%;font-size:var(--font-size-base);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{width:100%;height:100%;font-family:var(--font-family);font-size:var(--font-size-base);line-height:1.5;color:var(--color-text-primary);background-color:var(--bg-color-page)}#app{width:100%;height:100%}a{color:var(--color-primary);text-decoration:none;cursor:pointer;transition:color var(--transition-duration-fast)}a:hover{color:var(--color-primary-light-3)}ul,ol{list-style:none}img{max-width:100%;height:auto;vertical-align:middle}button{cursor:pointer;font-family:inherit;font-size:inherit;border:none;background:none;outline:none}button:disabled{cursor:not-allowed}input,textarea,select{font-family:inherit;font-size:inherit;outline:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{margin:0;font-weight:500;color:var(--color-text-primary)}p{margin:0}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background-color:var(--color-fill-light);border-radius:3px}::-webkit-scrollbar-thumb{background-color:var(--color-border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background-color:var(--color-text-secondary)}::selection{background-color:var(--color-primary-light-8);color:var(--color-primary)}.fade-enter-active,.fade-leave-active{transition:opacity var(--transition-duration)}.fade-enter-from,.fade-leave-to{opacity:0}.fade-scale-enter-active,.fade-scale-leave-active{transition:all var(--transition-duration)}.fade-scale-enter-from,.fade-scale-leave-to{opacity:0;transform:scale(.9)}.fade-transform-enter-active,.fade-transform-leave-active{transition:all var(--transition-duration-fast)}.fade-transform-enter-from{opacity:0;transform:translate(-10px)}.fade-transform-leave-to{opacity:0;transform:translate(10px)}.slide-down-enter-active,.slide-down-leave-active{transition:all var(--transition-duration)}.slide-down-enter-from,.slide-down-leave-to{opacity:0;transform:translateY(-20px)}.slide-up-enter-active,.slide-up-leave-active{transition:all var(--transition-duration)}.slide-up-enter-from,.slide-up-leave-to{opacity:0;transform:translateY(20px)}.slide-left-enter-active,.slide-left-leave-active{transition:all var(--transition-duration)}.slide-left-enter-from,.slide-left-leave-to{opacity:0;transform:translate(20px)}.slide-right-enter-active,.slide-right-leave-active{transition:all var(--transition-duration)}.slide-right-enter-from,.slide-right-leave-to{opacity:0;transform:translate(-20px)}.zoom-enter-active,.zoom-leave-active{transition:all var(--transition-duration)}.zoom-enter-from,.zoom-leave-to{opacity:0;transform:scale(.5)}.list-enter-active,.list-leave-active{transition:all var(--transition-duration)}.list-enter-from,.list-leave-to{opacity:0;transform:translateY(30px)}.collapse-transition{transition:width var(--transition-duration),padding var(--transition-duration)}.dark .sidebar,.dark .layout__aside{background-color:#1d1e1f}.dark .sidebar{border-right:1px solid #363637}.dark .sidebar__search-results{background-color:#1d1e1f;border-color:#363637}.dark .sidebar__search-item:hover{background-color:#262727}.dark .sidebar__search-item-title{color:#cfd3dc}.dark .sidebar__search-item-parent{color:#a3a6ad}.dark .sidebar__logo{border-bottom-color:#363637}.dark .sidebar__user{border-top-color:#363637}.dark .sidebar__user-name{color:#cfd3dc}.dark .sidebar__user-role{color:#a3a6ad}.dark .x-menu{background-color:#1d1e1f!important;border-color:#363637;color:#cfd3dc}.dark .x-menu.x-menu--vertical{border-right-color:#363637}.dark .x-menu.x-menu--horizontal{border-bottom-color:#363637}.dark .x-menu-item{color:#cfd3dc!important}.dark .x-menu-item:hover{background-color:#262727!important}.dark .x-menu-item.is-active{background-color:#262727!important;color:#cfd3dc!important}.dark .x-sub-menu__title{color:#cfd3dc!important}.dark .x-sub-menu__title:hover{background-color:#262727!important}.dark .x-sub-menu__menu{background-color:#1d1e1f!important;border:1px solid #363637;box-shadow:0 2px 12px #00000080}.dark .x-sub-menu__arrow{color:#a3a6ad}.dark .x-sub-menu.is-opened>.x-sub-menu__title{background-color:#262727!important}.dark .header{background-color:#1d1e1f;border-bottom-color:#363637}.dark .header__collapse{color:#cfd3dc}.dark .header__breadcrumb{color:#a3a6ad}.dark .header__user-name{color:#cfd3dc}.dark .header__user-arrow{color:#a3a6ad}.dark .header__action:hover,.dark .header__user-trigger:hover{background-color:#262727}.dark .header__dropdown{background-color:#1d1e1f;border:1px solid #363637;box-shadow:0 2px 12px #00000080}.dark .header__dropdown-name{color:#e5eaf3}.dark .header__dropdown-role{color:#a3a6ad}.dark .header__dropdown-divider{background-color:#363637}.dark .header__dropdown-item{color:#cfd3dc}.dark .header__dropdown-item:hover{background-color:#262727;color:#e5eaf3}.dark .x-button.x-button--default{background-color:#1d1e1f;border-color:#4c4d4f;color:#cfd3dc}.dark .x-button.x-button--default:hover{border-color:var(--color-primary);color:var(--color-primary)}.dark .x-button.x-button--text{color:var(--color-primary)}.dark .x-form-item__label{color:#cfd3dc}.dark .x-form-item__error{color:#f56c6c}.dark .x-input{background-color:#1d1e1f;border-color:#4c4d4f}.dark .x-input.is-focus{border-color:var(--color-primary)}.dark .x-input .x-input__inner{background-color:transparent;color:#e5eaf3}.dark .x-input .x-input__inner::placeholder{color:#6c6e72}.dark .x-input .x-input__suffix,.dark .x-input .x-input__prefix{color:#a3a6ad}.dark .x-select{background-color:#1d1e1f;border-color:#4c4d4f}.dark .x-card{background-color:#1d1e1f;border-color:#363637}.dark .x-card__header{border-bottom-color:#363637;color:#e5eaf3}.dark .data-table th{background-color:#262727;color:#cfd3dc;border-bottom-color:#363637}.dark .data-table td{border-bottom-color:#363637;color:#cfd3dc}.dark .data-table tr:hover td{background-color:#262727}.dark .x-modal__wrapper{background-color:#000000b3}.dark .x-modal__container{background-color:#1d1e1f;border:1px solid #363637}.dark .x-modal__header{border-bottom-color:#363637;color:#e5eaf3}.dark .x-modal__footer{border-top-color:#363637}.dark .x-message{background-color:#1d1e1f;border:1px solid #363637}.dark .x-tag.x-tag--primary{background-color:#409eff33;color:#79bbff;border-color:#409eff4d}.dark .x-tag.x-tag--success{background-color:#67c23a33;color:#95d475;border-color:#67c23a4d}.dark .x-tag.x-tag--warning{background-color:#e6a23c33;color:#eebe77;border-color:#e6a23c4d}.dark .x-tag.x-tag--danger{background-color:#f56c6c33;color:#fab6b6;border-color:#f56c6c4d}.dark .x-tag.x-tag--info{background-color:#90939933;color:#c0c4cc;border-color:#9093994d}.dark .x-switch{background-color:#4c4d4f}.dark .x-switch.is-checked{background-color:var(--color-primary)}.dark .x-pagination{color:#cfd3dc}.dark .x-pagination__item{background-color:#1d1e1f;border-color:#4c4d4f;color:#cfd3dc}.dark .x-pagination__item:hover{color:var(--color-primary)}.dark .x-pagination__item.is-active{background-color:var(--color-primary);border-color:var(--color-primary);color:#fff}.dark .login{background:linear-gradient(135deg,#1a1a2e,#16213e)}.dark .login__container{background-color:#1d1e1f;border:1px solid #363637}.dark .login__title{color:var(--color-primary)}.dark .login__subtitle{color:#a3a6ad}.dark .login__footer{color:#6c6e72}.dark .stat-card__title{color:#a3a6ad}.dark .quick-link{background-color:#262727}.dark .quick-link:hover{background-color:#409eff1a}.dark .quick-link__title{color:#cfd3dc}.dark .activity-item{border-bottom-color:#363637}.dark .activity-item__action{color:#cfd3dc}.dark .search-card,.dark .table-card,.dark .x-popconfirm{background-color:#1d1e1f;border:1px solid #363637}.grayscale .sidebar__logo-text{color:var(--color-primary)}.grayscale .x-menu-item.is-active{background-color:var(--color-fill)!important;color:var(--color-text-primary)!important}.grayscale .x-sub-menu.is-active .x-sub-menu__title{color:var(--color-text-primary)!important}.grayscale .x-button--default:hover{border-color:var(--color-primary);color:var(--color-primary)}.grayscale .x-button--text{color:var(--color-primary)}.grayscale .x-input.is-focus{border-color:var(--color-primary)}.grayscale .x-switch.is-checked{background-color:var(--color-primary)}.grayscale .x-pagination__item:hover{color:var(--color-primary)}.grayscale .x-pagination__item.is-active{background-color:var(--color-primary);border-color:var(--color-primary)}.grayscale .login__title{color:var(--color-primary)}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.flex{display:flex}.flex-center{display:flex;align-items:center;justify-content:center}.flex-between{display:flex;align-items:center;justify-content:space-between}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.text-danger{color:var(--color-danger)}.text-info{color:var(--color-info)}.bg-primary{background-color:var(--color-primary)}.bg-success{background-color:var(--color-success)}.bg-warning{background-color:var(--color-warning)}.bg-danger{background-color:var(--color-danger)}.mt-10{margin-top:10px}.mt-20{margin-top:20px}.mb-10{margin-bottom:10px}.mb-20{margin-bottom:20px}.ml-10{margin-left:10px}.mr-10{margin-right:10px}.p-10{padding:10px}.p-20{padding:20px}.card{background-color:var(--bg-color);border-radius:var(--border-radius-base);box-shadow:var(--box-shadow-light);padding:var(--spacing-md)}.page-container{padding:var(--spacing-md);min-height:100%}.search-bar{display:flex;flex-wrap:wrap;gap:var(--spacing-sm);margin-bottom:var(--spacing-md)}.toolbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-md)}.table-container{background-color:var(--bg-color);border-radius:var(--border-radius-base);padding:var(--spacing-md)}.pagination-container{display:flex;justify-content:flex-end;margin-top:var(--spacing-md)}.sidebar[data-v-363654cb]{height:100%;display:flex;flex-direction:column;background-color:var(--bg-color)}.sidebar__logo[data-v-363654cb]{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-363654cb]{width:32px;height:32px}.sidebar__logo-text[data-v-363654cb]{font-size:16px;font-weight:600;color:var(--color-primary);white-space:nowrap}.sidebar__menu[data-v-363654cb]{flex:1;border-right:none;overflow-y:auto;overflow-x:visible;background-color:transparent!important}.sidebar__menu[data-v-363654cb] .x-menu{background-color:transparent;border-right:none}.sidebar__menu[data-v-363654cb] .x-menu-item{height:46px;line-height:46px}.sidebar__menu[data-v-363654cb] .x-menu-item:hover{background-color:var(--color-fill)}.sidebar__menu[data-v-363654cb] .x-menu-item.is-active{background-color:var(--color-fill);color:var(--color-text-primary)!important}.sidebar__menu[data-v-363654cb] .x-sub-menu__title{height:46px;line-height:46px}.sidebar__menu[data-v-363654cb] .x-sub-menu__title:hover{background-color:var(--color-fill)}.sidebar__menu[data-v-363654cb] .x-sub-menu.is-active .x-sub-menu__title{color:var(--color-text-primary)!important}.sidebar__menu[data-v-363654cb] .x-sub-menu .x-menu{background-color:#00000005}.sidebar__menu[data-v-363654cb] .x-sub-menu .x-menu-item{padding-left:50px!important}.sidebar__user[data-v-363654cb]{padding:12px 16px;border-top:1px solid var(--color-border-lighter);display:flex;align-items:center;justify-content:space-between;background-color:#fff}.sidebar__user-info[data-v-363654cb]{display:flex;flex-direction:column;gap:2px}.sidebar__user-name[data-v-363654cb]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.sidebar__user-role[data-v-363654cb]{font-size:12px;color:var(--color-text-secondary)}.setting-drawer[data-v-14d31c8c]{padding:0 4px}.setting-section[data-v-14d31c8c]{margin-bottom:24px}.setting-section__title[data-v-14d31c8c]{font-size:14px;font-weight:500;color:var(--color-text-primary);margin:0 0 12px}.layout-options[data-v-14d31c8c]{display:flex;gap:12px}.layout-option[data-v-14d31c8c]{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 8px;border:2px solid var(--color-border);border-radius:4px;cursor:pointer;transition:all .2s}.layout-option[data-v-14d31c8c]:hover{border-color:var(--color-primary-light-5)}.layout-option.is-active[data-v-14d31c8c]{border-color:var(--color-primary);background-color:#409eff0d}.layout-option__preview[data-v-14d31c8c]{width:40px;height:40px;display:flex;align-items:center;justify-content:center}.layout-option__preview[data-v-14d31c8c] svg{width:100%;height:100%;color:var(--color-text-regular)}.layout-option__label[data-v-14d31c8c]{font-size:12px;color:var(--color-text-secondary)}.layout-option.is-active .layout-option__label[data-v-14d31c8c]{color:var(--color-primary)}.setting-item[data-v-14d31c8c]{display:flex;align-items:center;justify-content:space-between;padding:12px 0}.setting-item__label[data-v-14d31c8c]{font-size:14px;color:var(--color-text-primary)}.header[data-v-175c2432]{display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:100%}.header__left[data-v-175c2432]{display:flex;align-items:center;gap:15px}.header__collapse[data-v-175c2432]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:20px;color:var(--color-text-regular);border-radius:4px;transition:all .2s}.header__collapse[data-v-175c2432]:hover{color:var(--color-primary);background-color:var(--color-fill)}.header__right[data-v-175c2432]{display:flex;align-items:center;gap:12px}.header__search[data-v-175c2432]{position:relative;width:120px}.header__search-results[data-v-175c2432]{position:absolute;top:calc(100% + 8px);left:0;right:0;background-color:var(--bg-color);border:1px solid var(--color-border-lighter);border-radius:4px;box-shadow:0 2px 12px #00000026;max-height:300px;overflow-y:auto;z-index:100}.header__search-item[data-v-175c2432]{display:flex;align-items:center;gap:10px;padding:10px 12px;cursor:pointer;transition:background-color .2s}.header__search-item[data-v-175c2432]:hover{background-color:var(--color-fill)}.header__search-icon[data-v-175c2432]{width:20px;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}.header__search-info[data-v-175c2432]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.header__search-title[data-v-175c2432]{font-size:14px;color:var(--color-text-primary)}.header__search-parent[data-v-175c2432]{font-size:12px;color:var(--color-text-secondary)}.header__action[data-v-175c2432]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:4px;transition:all .2s;color:var(--color-text-regular)}.header__action[data-v-175c2432]:hover{background-color:var(--color-fill)}.header__user[data-v-175c2432]{position:relative}.header__user-trigger[data-v-175c2432]{display:flex;align-items:center;gap:10px;cursor:pointer;padding:6px 12px;border-radius:4px;transition:background-color .2s}.header__user-trigger[data-v-175c2432]:hover{background-color:var(--color-fill)}.header__user-name[data-v-175c2432]{font-size:14px;color:var(--color-text-primary)}.header__user-arrow[data-v-175c2432]{font-size:10px;color:var(--color-text-secondary);transition:transform .2s}.header__user-arrow.is-active[data-v-175c2432]{transform:rotate(180deg)}.header__avatar[data-v-175c2432]{width:30px;height:30px;border-radius:50%;background:linear-gradient(135deg,#409eff,#66b1ff);display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:500}.header__dropdown[data-v-175c2432]{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background-color:var(--bg-color);border-radius:4px;box-shadow:0 2px 12px #00000026;overflow:hidden;z-index:100}.header__dropdown-header[data-v-175c2432]{display:flex;align-items:center;gap:12px;padding:16px;background-color:var(--color-fill)}.header__dropdown-avatar[data-v-175c2432]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,#409eff,#66b1ff);display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;font-weight:500}.header__dropdown-info[data-v-175c2432]{flex:1}.header__dropdown-name[data-v-175c2432]{font-size:14px;font-weight:500;color:var(--color-text-primary)}.header__dropdown-role[data-v-175c2432]{font-size:12px;color:var(--color-text-secondary);margin-top:2px}.header__dropdown-divider[data-v-175c2432]{height:1px;background-color:var(--color-border-lighter)}.header__dropdown-menu[data-v-175c2432]{padding:8px 0}.header__dropdown-item[data-v-175c2432]{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-175c2432]:hover{background-color:var(--color-fill);color:var(--color-text-primary)}.header__dropdown-item--danger[data-v-175c2432]{color:var(--color-danger)}.header__dropdown-item--danger[data-v-175c2432]:hover{background-color:#f56c6c1a;color:var(--color-danger)}.dropdown-enter-active[data-v-175c2432],.dropdown-leave-active[data-v-175c2432]{transition:all .2s ease}.dropdown-enter-from[data-v-175c2432],.dropdown-leave-to[data-v-175c2432]{opacity:0;transform:translateY(-10px)}.top-menu[data-v-f9b502d8]{flex:1;display:flex;align-items:center;padding-left:20px}.top-menu__inner[data-v-f9b502d8]{border-bottom:none!important;background-color:transparent!important}.top-menu[data-v-f9b502d8] .x-menu-item{height:50px;line-height:50px;border-bottom:2px solid transparent!important}.top-menu[data-v-f9b502d8] .x-menu-item:hover{background-color:var(--color-fill)}.top-menu[data-v-f9b502d8] .x-menu-item.is-active{border-bottom-color:transparent!important}.top-menu[data-v-f9b502d8] .x-sub-menu__title{height:50px;line-height:50px;border-bottom:2px solid transparent!important}.top-menu[data-v-f9b502d8] .x-sub-menu__title:hover{background-color:var(--color-fill)}.top-menu[data-v-f9b502d8] .x-sub-menu.is-active .x-sub-menu__title{border-bottom-color:transparent!important}.layout[data-v-a2789d75]{display:flex;width:100%;height:100%}.layout__aside[data-v-a2789d75]{transition:width .3s;overflow:visible;flex-shrink:0;height:100%}.layout__main[data-v-a2789d75]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%}.layout__top[data-v-a2789d75]{display:flex;align-items:center;height:50px;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter);flex-shrink:0}.layout__logo[data-v-a2789d75]{width:60px;height:50px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.layout__logo-img[data-v-a2789d75]{width:32px;height:32px}.layout__header[data-v-a2789d75]{height:50px;background-color:var(--bg-color);border-bottom:1px solid var(--color-border-lighter);flex-shrink:0}.layout__header--top[data-v-a2789d75]{border-bottom:none}.layout__content[data-v-a2789d75]{flex:1;overflow:auto;background-color:var(--bg-color-page)}.layout--top[data-v-a2789d75]{flex-direction:column}.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-a48f4a52]{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-a48f4a52]{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-a48f4a52]{text-align:center;margin-bottom:30px}.login__logo[data-v-a48f4a52]{width:60px;height:60px}.login__title[data-v-a48f4a52]{font-size:28px;font-weight:600;color:var(--color-primary);margin:15px 0 5px}.login__subtitle[data-v-a48f4a52]{font-size:14px;color:var(--color-text-secondary)}.login__form[data-v-a48f4a52] .t-form-item{margin-bottom:20px}.login__submit[data-v-a48f4a52]{width:100%}.login__input-icon[data-v-a48f4a52]{display:inline-flex;align-items:center;justify-content:center}.login__input-icon[data-v-a48f4a52] svg{width:16px;height:16px;color:var(--color-text-secondary)}.login__input-icon--clickable[data-v-a48f4a52]{cursor:pointer}.login__input-icon--clickable[data-v-a48f4a52]:hover svg{color:var(--color-primary)}.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}
@@ -9,11 +9,6 @@ export interface LoginInfo {
9
9
  tokenType: string;
10
10
  code: string;
11
11
  }
12
- export interface TokenInfo {
13
- token: string;
14
- refreshToken: string;
15
- expireTime: number;
16
- }
17
12
  export declare const getLoginInfo: () => LoginInfo | null;
18
13
  export declare const setLoginInfo: (data: Record<string, unknown>) => void;
19
14
  export declare const getToken: () => string | null;
@@ -21,6 +16,3 @@ export declare const getTokenType: () => string;
21
16
  export declare const getCode: () => string | null;
22
17
  export declare const clearToken: () => void;
23
18
  export declare const hasToken: () => boolean;
24
- export declare const setUserInfo: (userInfo: Record<string, unknown>) => void;
25
- export declare const getUserInfo: () => Record<string, unknown> | null;
26
- export declare const clearUserInfo: () => void;
@@ -6,7 +6,3 @@
6
6
  * @param permission 权限标识
7
7
  */
8
8
  export declare function hasPermission(permission: string | string[]): boolean;
9
- /**
10
- * 检查是否是管理员
11
- */
12
- export declare function isAdmin(): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xto-fronted",
3
- "version": "0.1.10",
3
+ "version": "0.2.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "XTO 前端应用脚手架,封装登录、退出、菜单渲染等统一逻辑",
@@ -18,6 +18,13 @@
18
18
  "files": [
19
19
  "dist"
20
20
  ],
21
+ "pnpm": {
22
+ "onlyBuiltDependencies": [
23
+ "@parcel/watcher",
24
+ "esbuild",
25
+ "vue-demi"
26
+ ]
27
+ },
21
28
  "scripts": {
22
29
  "dev": "vite",
23
30
  "build": "vue-tsc && vite build",
@@ -27,29 +34,28 @@
27
34
  "prepublishOnly": "npm run build:lib"
28
35
  },
29
36
  "peerDependencies": {
30
- "@xto/base": "^0.1.0",
31
- "@xto/core": "^0.1.0",
32
- "@xto/feedback": "^0.1.0",
33
- "@xto/form": "^0.1.0",
34
- "@xto/navigation": "^0.1.0",
37
+ "@xto/base": "^1.1.1",
38
+ "@xto/core": "^1.0.0",
39
+ "@xto/feedback": "^1.0.3",
40
+ "@xto/form": "^1.0.2",
41
+ "@xto/navigation": "^1.1.0",
35
42
  "axios": "^1.6.0",
36
43
  "pinia": "^2.1.0",
37
44
  "vue": "^3.4.0",
38
45
  "vue-router": "^4.3.0"
39
46
  },
40
- "dependencies": {},
41
47
  "devDependencies": {
42
48
  "@types/node": "^20.11.30",
43
49
  "@vitejs/plugin-vue": "^5.0.4",
44
- "@xto/base": "^0.1.0",
45
- "@xto/core": "^0.1.0",
46
- "@xto/feedback": "^0.1.0",
47
- "@xto/form": "^0.1.0",
48
- "@xto/navigation": "^0.1.0",
50
+ "@xto/base": "^1.1.3",
51
+ "@xto/core": "^1.0.1",
52
+ "@xto/feedback": "^1.0.3",
53
+ "@xto/form": "^1.0.2",
54
+ "@xto/navigation": "^1.1.0",
49
55
  "axios": "^1.6.8",
50
56
  "pinia": "^2.1.7",
51
- "sass": "^1.72.0",
52
- "sass-embedded": "^1.72.0",
57
+ "sass": "^1.98.0",
58
+ "sass-embedded": "^1.98.0",
53
59
  "typescript": "^5.4.2",
54
60
  "vite": "^5.2.0",
55
61
  "vite-plugin-dts": "^3.9.1",