xto-fronted 0.2.6 → 0.2.7
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/.env.development +4 -0
- package/.env.production +4 -0
- package/README.md +94 -196
- package/dist/{components/Layout/TopMenu.vue.d.ts → App.vue.d.ts} +1 -1
- package/dist/api/auth.d.ts +8 -10
- package/dist/api/system.d.ts +11 -12
- package/dist/api/user.d.ts +12 -3
- package/dist/components/Layout/Footer.vue.d.ts +1 -1
- package/dist/components/Layout/Header.vue.d.ts +3 -14
- package/dist/components/Layout/Sidebar.vue.d.ts +1 -1
- package/dist/components/Layout/Tabs.vue.d.ts +1 -1
- package/dist/components/Layout/index.vue.d.ts +1 -1
- package/dist/composables/useAuth.d.ts +4 -19
- package/dist/directives/permission.d.ts +0 -1
- package/dist/index-CWRs4WMN.js +372 -0
- package/dist/index-CpxpXTQX.js +1462 -0
- package/dist/index-Cu3Z2-PY.js +345 -0
- package/dist/index-DPEVEyik.js +475 -0
- package/dist/index-DYnXaqYf.js +142 -0
- package/dist/index.d.ts +12 -25
- package/dist/index.es.js +76 -1521
- package/dist/index.umd.js +1 -20
- package/dist/main.d.ts +0 -1
- package/dist/router/dynamicRoutes.d.ts +33 -17
- package/dist/router/index.d.ts +4 -26
- package/dist/router/layoutRoute.d.ts +18 -0
- package/dist/router/staticRoutes.d.ts +2 -18
- package/dist/setup.d.ts +17 -0
- package/dist/stores/app.d.ts +15 -9
- package/dist/stores/auth.d.ts +48 -62
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/menu.d.ts +29 -47
- package/dist/stores/user.d.ts +84 -64
- package/dist/style.css +1 -1
- package/dist/utils/auth.d.ts +10 -10
- package/dist/utils/permission.d.ts +10 -1
- package/dist/utils/request.d.ts +7 -23
- package/dist/{components/Layout/Breadcrumb.vue.d.ts → views/dashboard/index.vue.d.ts} +1 -1
- package/dist/{components/Error → views/error}/403.vue.d.ts +1 -1
- package/dist/{components/Error → views/error}/404.vue.d.ts +1 -1
- package/dist/views/login/index.vue.d.ts +4 -0
- package/dist/views/system/menu/index.vue.d.ts +4 -0
- package/dist/views/system/role/index.vue.d.ts +4 -0
- package/dist/views/system/user/index.vue.d.ts +4 -0
- package/dist/vite.svg +9 -9
- package/index.html +13 -0
- package/package.json +27 -31
- package/public/vite.svg +10 -0
- package/src/App.vue +20 -0
- package/src/api/auth.ts +26 -0
- package/src/api/system.ts +65 -0
- package/src/api/user.ts +46 -0
- package/src/assets/styles/_dark.scss +407 -0
- package/src/assets/styles/_reset.scss +126 -0
- package/src/assets/styles/_root.scss +140 -0
- package/src/assets/styles/_transition.scss +119 -0
- package/src/assets/styles/_variables.scss +45 -0
- package/src/assets/styles/index.scss +187 -0
- package/src/components/Layout/Footer.vue +17 -0
- package/src/components/Layout/Header.vue +390 -0
- package/src/components/Layout/Sidebar.vue +297 -0
- package/src/components/Layout/Tabs.vue +134 -0
- package/src/components/Layout/index.vue +62 -0
- package/src/composables/useAuth.ts +45 -0
- package/src/composables/useForm.ts +79 -0
- package/src/composables/useTable.ts +97 -0
- package/src/directives/permission.ts +38 -0
- package/src/enums/index.ts +63 -0
- package/src/env.d.ts +17 -0
- package/src/index.ts +48 -0
- package/src/main.ts +34 -0
- package/src/router/dynamicRoutes.ts +163 -0
- package/src/router/index.ts +81 -0
- package/src/router/layoutRoute.ts +45 -0
- package/src/router/staticRoutes.ts +43 -0
- package/src/setup.ts +54 -0
- package/src/stores/app.ts +163 -0
- package/src/stores/auth.ts +66 -0
- package/src/stores/index.ts +15 -0
- package/src/stores/menu.ts +80 -0
- package/src/stores/user.ts +73 -0
- package/src/style.css +11 -0
- package/src/types/api.d.ts +84 -0
- package/src/types/global.d.ts +45 -0
- package/src/types/router.d.ts +48 -0
- package/src/types/xto.d.ts +149 -0
- package/src/utils/auth.ts +62 -0
- package/src/utils/permission.ts +42 -0
- package/src/utils/request.ts +124 -0
- package/src/utils/storage.ts +63 -0
- package/src/views/dashboard/index.vue +284 -0
- package/src/views/error/403.vue +57 -0
- package/src/views/error/404.vue +57 -0
- package/src/views/login/index.vue +248 -0
- package/src/views/system/menu/index.vue +381 -0
- package/src/views/system/role/index.vue +304 -0
- package/src/views/system/user/index.vue +327 -0
- package/tsconfig.json +26 -0
- package/tsconfig.node.json +11 -0
- package/vite.config.ts +140 -0
- package/dist/api/menu.d.ts +0 -4
- package/dist/components/Login/index.vue.d.ts +0 -25
- package/dist/components/SettingDrawer/index.vue.d.ts +0 -19
- package/dist/composables/index.d.ts +0 -8
- package/dist/composables/useApp.d.ts +0 -65
- package/dist/composables/useMenu.d.ts +0 -34
- package/dist/config/index.d.ts +0 -31
package/dist/index.umd.js
CHANGED
|
@@ -1,20 +1 @@
|
|
|
1
|
-
(function(l,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):(l=typeof globalThis<"u"?globalThis:l||self,z(l.XtoFronted={},l.axios,l.feedback,l.Vue,l.Pinia,l.VueRouter,l.navigation,l.base,l.form))})(this,function(l,z,S,e,W,B,M,$,x){"use strict";let G={...{appName:"XTO App",baseUrl:"",appId:"",clientId:"",indexPath:"/dashboard",loginPath:"/login"}};function se(t){G={...G,...t}}function L(){return G}function we(t){return G[t]}const Y=()=>`tooyu-cloud:${L().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",R=()=>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=R();return(t==null?void 0:t.accessToken)||null},le=()=>{const t=R();return(t==null?void 0:t.tokenType)||"Bearer"},Ce=()=>{const t=R();return(t==null?void 0:t.code)||null},Z=()=>{k.remove(J),k.remove(Ee)},v=()=>!!Q(),Ve=()=>{const t=L(),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=>{if(n.config.responseType==="blob")return n;const{data:s}=n;return s.code===200||s.code===0?n:(S.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:S.Message.error("登录已过期,请重新登录"),Z(),window.location.href="/login";break;case 404:S.Message.error("请求资源不存在");break;case 500:S.Message.error("服务器错误");break;default:S.Message.error(((r=s.data)==null?void 0:r.message)||"请求失败")}else S.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 A={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)},download(t,o){return U().get(t,{...o,responseType:"blob"}).then(n=>(n.headers["content-type"]||"").includes("application/json")?n.data.text().then(r=>{try{const m=JSON.parse(r);return S.Message.error(m.message||"请求失败"),Promise.reject(new Error(m.message||"请求失败"))}catch{return S.Message.error("请求失败"),Promise.reject(new Error("请求失败"))}}):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),m=e.ref(k.get("showFooter")??!0),c=e.ref(k.get("showBreadcrumb")??!0),a=e.ref(k.get("primaryColor")||"#409eff"),d=e.ref(k.get("isGrayscale")||!1),u=e.ref([]),h=e.computed(()=>t.value?"dark":"light"),_=()=>{t.value=!t.value,o.value=t.value?"dark":"light",p()},f=N=>{o.value=N,t.value=N==="dark",p()},p=()=>{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=()=>{m.value=!m.value,k.set("showFooter",m.value)},C=()=>{c.value=!c.value,k.set("showBreadcrumb",c.value)},b=N=>{a.value=N,document.documentElement.style.setProperty("--color-primary",N),k.set("primaryColor",N)},D=N=>{d.value=N;const K=document.documentElement;N?K.classList.add("grayscale"):K.classList.remove("grayscale"),k.set("isGrayscale",N)},F=N=>{u.value.includes(N)||u.value.push(N)},T=N=>{const K=u.value.indexOf(N);K>-1&&u.value.splice(K,1)},E=()=>{u.value=[]},V=()=>{p(),a.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",a.value),d.value&&document.documentElement.classList.add("grayscale")};return e.watch(t,p),{isDark:t,theme:o,layout:n,isCollapsed:s,showTabs:r,showFooter:m,showBreadcrumb:c,primaryColor:a,isGrayscale:d,cachedViews:u,themeClass:h,toggleTheme:_,toggleCollapse:i,setTheme:f,setLayout:y,toggleTabs:g,toggleFooter:w,toggleBreadcrumb:C,setPrimaryColor:b,setGrayscale:D,addCachedView:F,removeCachedView:T,clearCachedViews:E,initTheme:V}}),ee=W.defineStore("auth",()=>{const t=e.ref(R()),o=e.computed(()=>v()),n=a=>{ae(a),t.value=R()},s=()=>{t.value=null,Z()},r=e.computed(()=>{var a;return((a=t.value)==null?void 0:a.accessToken)||null}),m=e.computed(()=>{var a;return((a=t.value)==null?void 0:a.tokenType)||"Bearer"}),c=e.computed(()=>{var a;return((a=t.value)==null?void 0:a.code)||null});return{loginInfo:t,isLoggedIn:o,accessToken:r,tokenType:m,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 a;return((a=t.value)==null?void 0:a.userName)||""}),s=e.computed(()=>{var a;return((a=t.value)==null?void 0:a.avatar)||""}),r=e.computed(()=>{var a;return(a=t.value)==null?void 0:a.userId});return{userInfo:t,isLoggedIn:o,userName:n,avatar:s,userId:r,setUserInfo:a=>{t.value=a,k.set("user_info",a)},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),m=e.computed(()=>{const _=L();function f(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=f(g.children||[]);if(w)return w}}return null}return f(n.value)||_.indexPath||"/dashboard"}),c=(_,f)=>{const p=[];return!_||_.length<=0||_.forEach(i=>{if(i.type===1){const y={code:i.menuCode,name:i.menuName,path:"",title:i.menuName},g=f||"";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(p.push(C),i.children&&i.children.length>0){const b=c(i.children,i.menuUrl);C.children=b}}}),p},a=_=>{n.value=_,k.set(t,_)},d=_=>{const f=n.value.findIndex(p=>p.code==="home");f>-1&&n.value.splice(f,1),n.value.unshift({..._,code:"home",name:"首页"}),k.set(t,n.value)},u=(_,f)=>{if(h(),!(f!=null&&f.skipIndexMenu)){const i=L();n.value.push({code:"home",name:"首页",icon:"grid",closable:!1,default:!1,out:!1,path:i.indexPath||"/dashboard",title:"首页"})}const p=c(_);n.value.push(...p),k.set(t,n.value),k.set(o,s.value)},h=()=>{n.value=[],s.value={},k.remove(t),k.remove(o)};return{menuList:n,menuBtnListMap:s,hasMenu:r,index:m,setMenuList:a,setIndexMenu:d,setMenuFromRemote:u,clearMenu:h}});function de(t){const o=L();return A.post("/user/v1.0/login/by-domain",{appId:o.appId,clientId:o.clientId,uid:t.uid,password:t.password,code:!0})}function ue(){return A.put("/user/v1.0/user/logout")}function Be(t,o){return A.get(`/user/v1.0/login/by-code?appId=${t}&code=${o}`)}function me(){return A.get("/user/v1.0/user/get-me")}function he(){const t=L();return A.get(`/user/v1.0/menu/get-menu?appId=${t.appId}`)}function j(){const t=B.useRouter(),o=B.useRoute(),n=ee(),s=te(),r=P(),m=e.ref(!1),c=e.computed(()=>n.isLoggedIn),a=e.computed(()=>s.userInfo),d=e.computed(()=>s.userName||""),u=e.computed(()=>r.menuList),h=e.computed(()=>r.index),_=async(w,C)=>{m.value=!0;try{g();const D=(await de({uid:w,password:C})).data;n.login(D),await p(),await i();const F=o.query.redirectUrl;if(F){const T=decodeURIComponent(F);if(T.startsWith("http")){const E=D.code;location.href=T.includes("?")?`${T}&code=${E}`:`${T}?code=${E}`}else await t.replace(T)}else await t.replace(h.value||"/");return S.Message.success("登录成功"),{success:!0,data:D}}catch(b){return S.Message.error((b==null?void 0:b.message)||"登录失败"),{success:!1,error:b}}finally{m.value=!1}},f=async(w=!0)=>{const C=L();try{await ue()}catch(b){console.error("退出登录接口失败",b)}finally{g(),t.push(C.loginPath||"/login"),w&&S.Message.success("退出登录成功")}},p=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 p(),r.hasMenu||await i(),!0}catch(w){return console.error("初始化应用失败",w),g(),!1}},g=()=>{n.logout(),s.clearUserInfo(),r.clearMenu()};return{loading:m,isLoggedIn:c,userInfo:a,userName:d,menuList:u,indexPath:h,login:_,logout:f,loadUserInfo:p,loadMenu:i,initApp:y,clearAllState:g}}function be(){const t=P(),o=ee(),n=te(),s=e.computed(()=>o.isLoggedIn),r=e.computed(()=>n.userName),m=e.computed(()=>n.userInfo),c=h=>{const _=window.location.pathname,p=(t.menuBtnListMap[_]||[]).map(i=>i.code);return Array.isArray(h)?h.some(i=>p.includes(i)):p.includes(h)};return{isLoggedIn:s,userName:r,userInfo:m,hasPermission:c,hasAnyPermission:h=>h.some(_=>c(_)),hasAllPermissions:h=>h.every(_=>c(_)),getCurrentPagePermissions:()=>{const h=window.location.pathname;return(t.menuBtnListMap[h]||[]).map(f=>f.code)}}}function ne(){const t=B.useRoute(),o=B.useRouter(),n=P(),s=O(),r=e.ref(""),m=e.computed(()=>t.path),c=e.computed(()=>s.isCollapsed),a=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},h=e.computed(()=>r.value.trim()?u(a.value).filter(g=>g.title.toLowerCase().includes(r.value.toLowerCase())):[]),_=e.computed(()=>r.value.trim()?a.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):a.value);return{searchKeyword:r,activeMenu:m,isCollapsed:c,menuList:a,hasMenu:d,searchResults:h,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 Se(t,o={}){const{rules:n,onSubmit:s}=o,r=e.ref(),m=e.reactive({...t}),c=e.ref(!1),a=e.ref(!1),d=e.ref(!1),u=()=>{f(),d.value=!1,a.value=!0},h=i=>{Object.assign(m,i),d.value=!0,a.value=!0},_=()=>{a.value=!1,f()},f=()=>{var i;Object.keys(t).forEach(y=>{m[y]=t[y]}),(i=r.value)==null||i.resetFields()};return{formRef:r,formData:m,rules:n,loading:c,visible:a,isEdit:d,openAdd:u,openEdit:h,close:_,resetForm:f,handleSubmit:async()=>{var i;try{await((i=r.value)==null?void 0:i.validate()),c.value=!0,await(s==null?void 0:s(m)),_()}catch(y){console.error(y)}finally{c.value=!1}}}}function Le(t){const{fetchData:o,defaultPageSize:n=10}=t,s=e.ref(!1),r=e.ref([]),m=e.ref(0),c=e.ref(1),a=e.ref(n),d=e.reactive({}),u=async()=>{s.value=!0;try{const g={...d,page:c.value,pageSize:a.value},w=await o(g);r.value=w.list,m.value=w.total}catch(g){console.error(g)}finally{s.value=!1}},h=()=>{c.value=1,u()},_=()=>{Object.keys(d).forEach(g=>{d[g]=void 0}),c.value=1,u()},f=g=>{c.value=g,u()},p=g=>{a.value=g,c.value=1,u()},i=()=>{u()},y=e.computed(()=>({current:c.value,pageSize:a.value,total:m.value}));return{loading:s,data:r,total:m,currentPage:c,pageSize:a,searchParams:d,pagination:y,getData:u,handleSearch:h,handleReset:_,handlePageChange:f,handleSizeChange:p,refresh:i}}const Ie={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}=j(),r=L(),{activeMenu:m,isCollapsed:c,filteredMenuList:a,handleMenuSelect:d}=ne();return(u,h)=>{var _;return e.openBlock(),e.createElementBlock("div",Ie,[e.createElementVNode("div",Te,[h[1]||(h[1]=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(M.Menu),{modelValue:e.unref(m),"onUpdate:modelValue":h[0]||(h[0]=f=>e.isRef(m)?m.value=f:null),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(a),f=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:f.path},[f.children&&f.children.length>0?(e.openBlock(),e.createBlock(e.unref(M.SubMenu),{key:0,index:f.path,icon:"grid"},{title:e.withCtx(()=>[e.withDirectives(e.createElementVNode("span",null,e.toDisplayString(f.title),513),[[e.vShow,!e.unref(c)]])]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.children,p=>(e.openBlock(),e.createBlock(e.unref(M.MenuItem),{key:p.path,index:p.path,icon:"grid"},{default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(p.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(M.MenuItem),{key:1,index:f.path,icon:"grid"},{default:e.withCtx(()=>[e.unref(c)?(e.openBlock(),e.createBlock(e.unref(S.Tooltip),{key:0,content:f.title,placement:"right"},{default:e.withCtx(()=>[...h[2]||(h[2]=[e.createElementVNode("span",null,null,-1)])]),_:1},8,["content"])):(e.openBlock(),e.createElementBlock("span",$e,e.toDisplayString(f.title),1))]),_:2},1032,["index"]))],64))),128))]),_:1},8,["modelValue","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(()=>[...h[3]||(h[3]=[e.createTextVNode("退出",-1)])]),_:1},8,["onClick"])]))])}}}),I=(t,o)=>{const n=t.__vccOpts||t;for(const[s,r]of o)n[s]=r;return n},pe=I(De,[["__scopeId","data-v-d6c5528d"]]),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>`,Re=`<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>`,Ae={class:"setting-drawer"},Oe={class:"setting-section"},ze={class:"setting-section__content"},qe={class:"layout-options"},He=["onClick"],je=["innerHTML"],Ke={class:"layout-option__label"},We={class:"setting-section"},Ge={class:"setting-section__content"},Ye={class:"setting-item"},Xe={class:"setting-item"},fe=I(e.defineComponent({inheritAttrs:!1,__name:"index",props:{visible:{type:Boolean}},emits:["update:visible"],setup(t,{emit:o}){const n=O(),s={navLeft:Fe,navTop:Re},r=[{value:"sidebar",label:"左侧导航",icon:"navLeft"},{value:"top",label:"顶部导航",icon:"navTop"}],m=e.computed({get:()=>n.layout,set:d=>n.setLayout(d)}),c=o,a=()=>{c("update:visible",!1)};return(d,u)=>(e.openBlock(),e.createBlock(e.unref(S.Drawer),{"model-value":t.visible,title:"皮肤设置",direction:"rtl",size:280,"onUpdate:modelValue":a},{default:e.withCtx(()=>[e.createElementVNode("div",Ae,[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,h=>e.createElementVNode("div",{key:h.value,class:e.normalizeClass(["layout-option",{"is-active":m.value===h.value}]),onClick:_=>m.value=h.value},[e.createElementVNode("div",{class:"layout-option__preview",innerHTML:s[h.icon]},null,8,je),e.createElementVNode("span",Ke,e.toDisplayString(h.label),1)],10,He)),64))])])]),e.createElementVNode("div",We,[u[3]||(u[3]=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(x.Switch),{"model-value":e.unref(n).showBreadcrumb,"onUpdate:modelValue":e.unref(n).toggleBreadcrumb},null,8,["model-value","onUpdate:modelValue"])]),e.createElementVNode("div",Xe,[u[2]||(u[2]=e.createElementVNode("span",{class:"setting-item__label"},"灰度模式",-1)),e.createVNode(e.unref(x.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-3a74bfd0"]]),Je={key:0,class:"breadcrumb"},Qe=["onClick"],Ze=I(e.defineComponent({__name:"Breadcrumb",setup(t){const o=B.useRoute(),n=B.useRouter(),s=P(),r=e.computed(()=>{var h;const c=o.path,a=s.menuList,d=(_,f,p=[])=>{for(const i of _){const y={title:i.title,path:i.path,isLast:!1};if(i.path===f)return y.isLast=!0,[...p,y];if(i.children&&i.children.length>0){const g=d(i.children,f,[...p,y]);if(g)return g}}return null},u=d(a,c);return u&&u.length>0?u:(h=o.meta)!=null&&h.title?[{title:o.meta.title,path:c,isLast:!0}]:[]}),m=c=>{!c.isLast&&c.path&&n.push(c.path)};return(c,a)=>r.value.length>0?(e.openBlock(),e.createElementBlock("div",Je,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,(d,u)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:d.path},[e.createElementVNode("span",{class:e.normalizeClass(["breadcrumb__item",{"breadcrumb__item--link":!d.isLast}]),onClick:h=>m(d)},e.toDisplayString(d.title),11,Qe),u<r.value.length-1?(e.openBlock(),e.createBlock(e.unref($.Icon),{key:0,name:"arrow-right",size:12,class:"breadcrumb__separator"})):e.createCommentVNode("",!0)],64))),128))])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-31468670"]]),ve={class:"header"},et={class:"header__left"},tt={class:"header__right"},nt={key:0,class:"header__search-results"},ot=["onClick"],st={class:"header__search-info"},rt={class:"header__search-title"},at={key:0,class:"header__search-parent"},lt=["title"],ct={class:"header__avatar"},it={class:"header__user-name"},dt={key:0,class:"header__dropdown"},ut={class:"header__dropdown-header"},mt={class:"header__dropdown-avatar"},ht={class:"header__dropdown-info"},pt={class:"header__dropdown-name"},ft={class:"header__dropdown-role"},_t={class:"header__dropdown-menu"},oe=I(e.defineComponent({__name:"Header",props:{showCollapse:{type:Boolean}},setup(t){const o=O(),{logout:n,userName:s,userInfo:r}=j(),{searchKeyword:m,searchResults:c,handleSearchItemClick:a}=ne(),d=e.ref(!1),u=e.ref(null),h=e.ref(null),_=e.ref(!1),f=e.ref(!1),p=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=T=>{u.value&&!u.value.contains(T.target)&&b(),h.value&&!h.value.contains(T.target)&&(m.value="")};return e.onMounted(()=>{document.addEventListener("click",F),document.addEventListener("fullscreenchange",w)}),e.onUnmounted(()=>{document.removeEventListener("click",F),document.removeEventListener("fullscreenchange",w)}),(T,E)=>(e.openBlock(),e.createElementBlock("div",ve,[e.createElementVNode("div",et,[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.unref(o).showBreadcrumb?(e.openBlock(),e.createBlock(Ze,{key:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",tt,[e.createElementVNode("div",{class:"header__search",ref_key:"searchRef",ref:h},[e.createVNode(e.unref(x.Input),{modelValue:e.unref(m),"onUpdate:modelValue":E[0]||(E[0]=V=>e.isRef(m)?m.value=V:null),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),e.unref(c).length>0?(e.openBlock(),e.createElementBlock("div",nt,[(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(a)(V.path)},[e.createVNode(e.unref($.Icon),{name:"grid",size:16,class:"header__search-icon"}),e.createElementVNode("div",st,[e.createElementVNode("span",rt,e.toDisplayString(V.title),1),V.parentTitle?(e.openBlock(),e.createElementBlock("span",at,e.toDisplayString(V.parentTitle),1)):e.createCommentVNode("",!0)])],8,ot))),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,lt),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=>f.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",ct,[e.createElementVNode("span",null,e.toDisplayString(p.value.charAt(0)),1)]),e.createElementVNode("span",it,e.toDisplayString(p.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",dt,[e.createElementVNode("div",ut,[e.createElementVNode("div",mt,[e.createElementVNode("span",null,e.toDisplayString(p.value.charAt(0)),1)]),e.createElementVNode("div",ht,[e.createElementVNode("div",pt,e.toDisplayString(p.value),1),e.createElementVNode("div",ft,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",_t,[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(fe,{visible:f.value,"onUpdate:visible":E[2]||(E[2]=V=>f.value=V)},null,8,["visible"])]))}}),[["__scopeId","data-v-b15434d8"]]),gt={class:"top-menu"},yt=I(e.defineComponent({__name:"TopMenu",setup(t){const o=B.useRoute(),n=B.useRouter(),s=P(),r=e.computed(()=>o.path),m=c=>{n.push(c)};return(c,a)=>(e.openBlock(),e.createElementBlock("div",gt,[e.createVNode(e.unref(M.Menu),{"default-active":r.value,mode:"horizontal",class:"top-menu__inner",onSelect:m},{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(M.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(M.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(M.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"]]),kt={class:"layout__main"},wt={class:"layout__content"},Nt={class:"layout__top"},Et={class:"layout__content"},_e=I(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"),m=e.computed(()=>s.value==="sidebar");return(c,a)=>{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(pe)],4),e.createElementVNode("div",kt,[e.createVNode(oe,{class:"layout__header","show-collapse":m.value},null,8,["show-collapse"]),e.createElementVNode("main",wt,[e.createVNode(d)])])],64)):s.value==="top"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",Nt,[a[0]||(a[0]=e.createElementVNode("div",{class:"layout__logo"},[e.createElementVNode("img",{src:ie,alt:"Logo",class:"layout__logo-img"})],-1)),e.createVNode(yt),e.createVNode(oe,{class:"layout__header--top","show-collapse":!1})]),e.createElementVNode("main",Et,[e.createVNode(d)])],64)):e.createCommentVNode("",!0)],2)}}}),[["__scopeId","data-v-a2789d75"]]),Ct={},Vt={class:"tabs-wrapper"};function Bt(t,o){return e.openBlock(),e.createElementBlock("div",Vt)}const bt=I(Ct,[["render",Bt],["__scopeId","data-v-3b1e382a"]]),St={},Lt={class:"footer"};function It(t,o){return e.openBlock(),e.createElementBlock("div",Lt,[...o[0]||(o[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const Tt=I(St,[["render",It],["__scopeId","data-v-317ae311"]]),$t=`<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>`,xt=`<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>`,Mt=`<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>`,Ut=`<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>`,Pt={class:"login"},Dt={class:"login__container"},Ft={class:"login__header"},Rt=["src"],At={class:"login__title"},Ot={class:"login__subtitle"},zt=["innerHTML"],qt=["innerHTML"],Ht=["innerHTML"],jt=I(e.defineComponent({__name:"index",props:{logo:{},title:{},subtitle:{}},emits:["success","error"],setup(t,{emit:o}){const n=o,{login:s,loading:r}=j(),m=L(),c=e.reactive({uid:"",password:""}),a=e.ref(!1),d={uid:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},u=e.ref(),h={user:$t,lock:xt,eye:Mt,eyeOff:Ut},_=async()=>{var f;try{await((f=u.value)==null?void 0:f.validate());const p=await s(c.uid,c.password);p.success?n("success",p.data):n("error",p.error)}catch(p){console.error("登录失败",p),n("error",p)}};return(f,p)=>(e.openBlock(),e.createElementBlock("div",Pt,[e.createElementVNode("div",Dt,[e.createElementVNode("div",Ft,[e.createElementVNode("img",{src:t.logo||"/vite.svg",alt:"Logo",class:"login__logo"},null,8,Rt),e.createElementVNode("h1",At,e.toDisplayString(t.title||e.unref(m).appName),1),e.createElementVNode("p",Ot,e.toDisplayString(t.subtitle||"后台管理系统"),1)]),e.createVNode(e.unref(x.Form),{ref_key:"formRef",ref:u,model:c,rules:d,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.FormItem),{prop:"uid"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Input),{modelValue:c.uid,"onUpdate:modelValue":p[0]||(p[0]=i=>c.uid=i),placeholder:"请输入账号",size:"large"},{prefix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon",innerHTML:h.user},null,8,zt)]),_:1},8,["modelValue"])]),_:1}),e.createVNode(e.unref(x.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref(x.Input),{modelValue:c.password,"onUpdate:modelValue":p[2]||(p[2]=i=>c.password=i),type:a.value?"text":"password",placeholder:"请输入密码",size:"large",onKeyup:e.withKeys(_,["enter"])},{prefix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon",innerHTML:h.lock},null,8,qt)]),suffix:e.withCtx(()=>[e.createElementVNode("span",{class:"login__input-icon login__input-icon--clickable",onClick:p[1]||(p[1]=i=>a.value=!a.value),innerHTML:a.value?h.eyeOff:h.eye},null,8,Ht)]),_:1},8,["modelValue","type"])]),_:1}),e.createVNode(e.unref(x.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(()=>[...p[3]||(p[3]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])]))}}),[["__scopeId","data-v-a48f4a52"]]),Kt={class:"error-page"},Wt={class:"error-page__content"},Gt=I(e.defineComponent({__name:"404",setup(t){const o=B.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Kt,[e.createElementVNode("div",Wt,[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-25c06185"]]),Yt={class:"error-page"},Xt={class:"error-page__content"},Jt=I(e.defineComponent({__name:"403",setup(t){const o=B.useRouter(),n=()=>{o.push("/")};return(s,r)=>(e.openBlock(),e.createElementBlock("div",Yt,[e.createElementVNode("div",Xt,[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-42d7e36e"]]);function Qt(t){const o=P(),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)}const Zt=["/login","/404","/403"];function vt(t,o){const n=L(),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,m,c)=>{const a=O();if(a.initTheme(),v())if(r.path===n.loginPath)c({path:n.indexPath||"/"});else{const{initApp:d,isLoggedIn:u}=j();if(!u.value&&!await d()){c(n.loginPath||"/login");return}r.name&&r.meta.keepAlive&&a.addCachedView(r.name),c()}else Zt.includes(r.path)?c():c({path:n.loginPath||"/login",query:{redirectUrl:encodeURIComponent(r.fullPath)}})}),s}function en(t,o){const n=B.createRouter({history:B.createWebHistory(),routes:o});t.matcher=n.matcher}function tn(t){const o=L();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:"/403",name:"Forbidden",component:t==null?void 0:t.forbiddenComponent,meta:{title:"403",hidden:!0}}]}function nn(t,o={}){const n=o.indexPath||"/dashboard",s=[...t];return o.notFoundComponent&&s.push({path:"/:pathMatch(.*)*",name:"LayoutNotFound",component:o.notFoundComponent,meta:{title:"404",hidden:!0}}),{path:"/",name:"Layout",component:o.layoutComponent||_e,redirect:n,children:s}}function on(t={}){return[{path:"/403",name:"Forbidden",component:t.forbiddenComponent,meta:{title:"403",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 sn={1:"启用",0:"禁用"},rn={0:"未知",1:"男",2:"女"},an={0:"目录",1:"菜单",2:"按钮"},ln=[{label:"启用",value:1},{label:"禁用",value:0}],cn=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],dn=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],un={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 a=!1;Array.isArray(s)?a=s.some(u=>c.includes(u)):a=c.includes(s),a||(d=t.parentNode)==null||d.removeChild(t)}};function mn(t){return se(t),ce(),{config:L()}}l.Footer=Tt,l.Forbidden=Jt,l.Gender=ye,l.GenderOptions=cn,l.GenderText=rn,l.Header=oe,l.Layout=_e,l.Login=jt,l.MenuType=ke,l.MenuTypeOptions=dn,l.MenuTypeText=an,l.NotFound=Gt,l.SettingDrawer=fe,l.Sidebar=pe,l.Status=ge,l.StatusOptions=ln,l.StatusText=sn,l.Tabs=bt,l.clearToken=Z,l.createErrorRoutes=on,l.createLayoutRoute=nn,l.createRouter=vt,l.createStaticRoutes=tn,l.createXtoApp=mn,l.getCode=Ce,l.getConfig=L,l.getConfigValue=we,l.getCurrentUser=me,l.getLoginInfo=R,l.getRequest=U,l.getToken=Q,l.getTokenType=le,l.getUserMenu=he,l.hasPermission=Qt,l.hasToken=v,l.http=A,l.local=k,l.localStorageUtil=q,l.login=de,l.loginByCode=Be,l.logout=ue,l.permissionDirective=un,l.resetRequest=ce,l.resetRouter=en,l.session=Ne,l.sessionStorageUtil=H,l.setConfig=se,l.setLoginInfo=ae,l.useApp=j,l.useAppStore=O,l.useAuth=be,l.useAuthStore=ee,l.useForm=Se,l.useMenu=ne,l.useMenuStore=P,l.useTable=Le,l.useUserStore=te,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(a,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("pinia"),require("vue-router"),require("@xto/navigation"),require("@xto/base"),require("@xto/form"),require("@xto/feedback"),require("axios"),require("@xto/data")):typeof define=="function"&&define.amd?define(["exports","vue","pinia","vue-router","@xto/navigation","@xto/base","@xto/form","@xto/feedback","axios","@xto/data"],e):(a=typeof globalThis<"u"?globalThis:a||self,e(a.XtoFronted={},a.Vue,a.Pinia,a.VueRouter,a.navigation,a.base,a.form,a.feedback,a.axios,a.data))})(this,function(a,e,W,L,z,w,h,I,De,D){"use strict";const j="xto_",ie=t=>({get(r){const o=t.getItem(j+r);if(!o)return null;try{return JSON.parse(o)}catch{return o}},set(r,o){if(o==null){t.removeItem(j+r);return}const m=typeof o=="string"?o:JSON.stringify(o);t.setItem(j+r,m)},remove(r){t.removeItem(j+r)},clear(){Object.keys(t).forEach(o=>{o.startsWith(j)&&t.removeItem(o)})}}),q=ie(window.localStorage),K=ie(window.sessionStorage),y={get:q.get,set:q.set,remove:q.remove,clear:q.clear},Ie={get:K.get,set:K.set,remove:K.remove,clear:K.clear},O=W.defineStore("app",()=>{const t=e.ref(y.get("appName")||"XTO App"),r=e.ref(y.get("indexPath")||"/dashboard"),o=e.ref(y.get("isDark")||!1),m=e.ref(y.get("theme")||"light"),c=e.ref(y.get("layout")||"sidebar"),d=e.ref(y.get("isCollapsed")||!1),s=e.ref(y.get("showTabs")??!0),n=e.ref(y.get("showFooter")??!0),f=e.ref(y.get("showBreadcrumb")??!0),g=e.ref(y.get("primaryColor")||"#409eff"),N=e.ref([]),B=e.computed(()=>o.value?"dark":"light"),p=T=>{t.value=T,y.set("appName",T)},E=T=>{r.value=T,y.set("indexPath",T)},x=()=>{o.value=!o.value,m.value=o.value?"dark":"light",_()},V=T=>{m.value=T,o.value=T==="dark",_()},_=()=>{const T=document.documentElement;o.value?T.classList.add("dark"):T.classList.remove("dark"),y.set("isDark",o.value),y.set("theme",m.value)},S=()=>{d.value=!d.value,y.set("isCollapsed",d.value)},M=T=>{c.value=T,y.set("layout",T)},U=()=>{s.value=!s.value,y.set("showTabs",s.value)},k=()=>{n.value=!n.value,y.set("showFooter",n.value)},i=()=>{f.value=!f.value,y.set("showBreadcrumb",f.value)},l=T=>{g.value=T,document.documentElement.style.setProperty("--color-primary",T),y.set("primaryColor",T)},u=T=>{N.value.includes(T)||N.value.push(T)},R=T=>{const Te=N.value.indexOf(T);Te>-1&&N.value.splice(Te,1)},P=()=>{N.value=[]},Q=()=>{_(),g.value!=="#409eff"&&document.documentElement.style.setProperty("--color-primary",g.value)};return e.watch(o,_),{appName:t,indexPath:r,isDark:o,theme:m,layout:c,isCollapsed:d,showTabs:s,showFooter:n,showBreadcrumb:f,primaryColor:g,cachedViews:N,themeClass:B,setAppName:p,setIndexPath:E,toggleTheme:x,toggleCollapse:S,setTheme:V,setLayout:M,toggleTabs:U,toggleFooter:k,toggleBreadcrumb:i,setPrimaryColor:l,addCachedView:u,removeCachedView:R,clearCachedViews:P,initTheme:Q}}),de="/vite.svg",$e=(t,r,o)=>{const m=t[r];return m?typeof m=="function"?m():Promise.resolve(m):new Promise((c,d)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(d.bind(null,new Error("Unknown variable dynamic import: "+r+(r.split("/").length!==o?". Note that variables only represent file names one level deep.":""))))})},Z=[{path:"/login",name:"Login",component:()=>Promise.resolve().then(()=>Ut),meta:{title:"登录",hidden:!0}},{path:"/404",name:"NotFound",component:()=>Promise.resolve().then(()=>Ft),meta:{title:"404",hidden:!0}},{path:"/403",name:"Forbidden",component:()=>Promise.resolve().then(()=>Ot),meta:{title:"403",hidden:!0}}],v={path:"/:pathMatch(.*)*",redirect:"/404",meta:{hidden:!0}},ee={path:"/",name:"Layout",component:()=>Promise.resolve().then(()=>wt),redirect:"/dashboard",children:[{path:"/dashboard",name:"Dashboard",component:()=>Promise.resolve().then(()=>xe),meta:{title:"仪表盘",icon:"dashboard",keepAlive:!0,affix:!0}},{path:"/system/user",name:"SystemUser",component:()=>Promise.resolve().then(()=>Se),meta:{title:"用户管理",icon:"user",keepAlive:!0}},{path:"/system/role",name:"SystemRole",component:()=>Promise.resolve().then(()=>Be),meta:{title:"角色管理",icon:"role",keepAlive:!0}},{path:"/system/menu",name:"SystemMenu",component:()=>Promise.resolve().then(()=>be),meta:{title:"菜单管理",icon:"menu",keepAlive:!0}}]},Le=[{path:"/dashboard",name:"Dashboard",component:()=>Promise.resolve().then(()=>xe),meta:{title:"仪表盘",icon:"dashboard",keepAlive:!0,affix:!0}},{path:"/system",name:"System",redirect:"/system/user",meta:{title:"系统管理",icon:"setting"},children:[{path:"user",name:"SystemUser",component:()=>Promise.resolve().then(()=>Se),meta:{title:"用户管理",icon:"user",keepAlive:!0}},{path:"role",name:"SystemRole",component:()=>Promise.resolve().then(()=>Be),meta:{title:"角色管理",icon:"role",keepAlive:!0}},{path:"menu",name:"SystemMenu",component:()=>Promise.resolve().then(()=>be),meta:{title:"菜单管理",icon:"menu",keepAlive:!0}}]}],ce=[{id:1,name:"Dashboard",path:"/dashboard",component:"dashboard/index",icon:"dashboard",title:"仪表盘",keepAlive:!0,affix:!0},{id:2,name:"System",path:"/system",redirect:"/system/user",icon:"setting",title:"系统管理",children:[{id:21,name:"SystemUser",path:"/system/user",component:"system/user/index",icon:"user",title:"用户管理",keepAlive:!0},{id:22,name:"SystemRole",path:"/system/role",component:"system/role/index",icon:"role",title:"角色管理",keepAlive:!0},{id:23,name:"SystemMenu",path:"/system/menu",component:"system/menu/index",icon:"menu",title:"菜单管理",keepAlive:!0}]}],te="token",ne="refresh_token",oe="token_expire",J=()=>y.get(te),me=t=>{y.set(te,t)},Ae=()=>y.get(ne),pe=t=>{y.set(ne,t)},ue=()=>y.get(oe),fe=t=>{y.set(oe,t)},he=t=>{me(t.token),pe(t.refreshToken),fe(t.expireTime)},le=()=>{y.remove(te),y.remove(ne),y.remove(oe)},Ve=()=>{const t=ue();return t?Date.now()>t:!0},re=()=>!!J()&&!Ve(),F=W.defineStore("user",()=>{const t=e.ref(y.get("userInfo")),r=e.ref(y.get("roles")||[]),o=e.ref(y.get("permissions")||[]),m=e.computed(()=>!!t.value),c=e.computed(()=>{var p;return((p=t.value)==null?void 0:p.username)||""}),d=e.computed(()=>{var p;return((p=t.value)==null?void 0:p.nickname)||""}),s=e.computed(()=>{var p;return((p=t.value)==null?void 0:p.avatar)||""}),n=e.computed(()=>{var p;return(p=t.value)==null?void 0:p.id});return{userInfo:t,roles:r,permissions:o,isLoggedIn:m,username:c,nickname:d,avatar:s,userId:n,setUserInfo:p=>{t.value=p,r.value=p.roles||[],o.value=p.permissions||[],y.set("userInfo",p),y.set("roles",p.roles||[]),y.set("permissions",p.permissions||[])},clearUserInfo:()=>{t.value=null,r.value=[],o.value=[],y.remove("userInfo"),y.remove("roles"),y.remove("permissions")},hasPermission:p=>Array.isArray(p)?p.some(E=>o.value.includes(E)):o.value.includes(p),hasRole:p=>Array.isArray(p)?p.some(E=>r.value.includes(E)):r.value.includes(p)}}),G=L.createRouter({history:L.createWebHistory(),routes:[...Z,ee,v],scrollBehavior:()=>({left:0,top:0})}),Ue=["/login","/404","/403"];G.beforeEach(async(t,r,o)=>{const m=O();if(m.initTheme(),re())if(t.path==="/login")o({path:"/"});else{const c=F();c.isLoggedIn||(c.setUserInfo({id:1,username:"admin",nickname:"管理员",avatar:"",email:"admin@example.com",phone:"13800138000",status:1,roles:["admin"],permissions:["*"],createTime:new Date().toISOString()}),H().setMenuList(ce)),t.name&&t.meta.keepAlive&&m.addCachedView(t.name),o()}else Ue.includes(t.path)?o():o("/login")});function Me(){const t=L.createRouter({history:L.createWebHistory(),routes:[...Z,ee,v]});G.matcher=t.matcher}const H=W.defineStore("menu",()=>{const t=e.ref(y.get("menuList")||[]),r=e.computed(()=>t.value.length>0),o=s=>{t.value=s,y.set("menuList",s)},m=()=>{t.value=[],y.remove("menuList")},c=s=>s.filter(n=>!n.hidden).map(n=>{const f={path:n.path,name:n.name,meta:{title:n.title,icon:n.icon,keepAlive:n.keepAlive,hidden:n.hidden}};return n.redirect&&(f.redirect=n.redirect),n.component&&(f.component=()=>$e(Object.assign({}),`../views/${n.component}.vue`,3)),n.children&&n.children.length>0&&(f.children=c(n.children)),f});return{menuList:t,hasMenu:r,setMenuList:o,clearMenu:m,generateRoutes:c,addRoutes:s=>{c(s).forEach(f=>{G.addRoute("Layout",f)})}}}),Y=W.defineStore("auth",()=>{const t=e.ref(J()),r=e.computed(()=>re()),o=e.ref(""),m=e.ref(""),c=e.ref(""),d=e.ref("/login");return{token:t,isLoggedIn:r,baseUrl:o,appId:m,clientId:c,loginPath:d,login:p=>{t.value=p.token,he(p)},logout:()=>{t.value=null,le()},setBaseUrl:p=>{o.value=p},setAppId:p=>{m.value=p},setClientId:p=>{c.value=p},setLoginPath:p=>{d.value=p}}}),Re={class:"sidebar"},Fe={class:"sidebar__logo"},Pe={class:"sidebar__logo-text"},ze={key:0,class:"sidebar__search"},Oe={key:0,class:"sidebar__search-results"},je=["onClick"],qe={class:"menu-icon"},Ke={class:"sidebar__search-item-info"},He={class:"sidebar__search-item-title"},Ye={key:0,class:"sidebar__search-item-parent"},Xe={class:"menu-icon"},We={class:"menu-icon"},Je={class:"menu-icon"},Ge={key:1,class:"sidebar__user"},Qe={class:"sidebar__user-info"},Ze={class:"sidebar__user-name"},ve={class:"sidebar__user-role"},et=e.defineComponent({__name:"Sidebar",setup(t){const r=L.useRoute(),o=L.useRouter(),m=H(),c=F(),d=Y(),s=O(),n=e.ref(""),f=e.computed(()=>s.isCollapsed),g=e.computed(()=>r.path),N=e.computed(()=>s.isDark?"#1d1e1f":"#fff"),B=e.computed(()=>s.isDark?"#cfd3dc":"#303133"),p=e.computed(()=>"#409eff"),E=(k,i="")=>{const l=[];return k.forEach(u=>{u.children&&u.children.length>0?l.push(...E(u.children,u.title)):l.push({...u,parentTitle:i})}),l},x=e.computed(()=>n.value.trim()?E(m.menuList).filter(i=>i.title.toLowerCase().includes(n.value.toLowerCase())):[]),V=e.computed(()=>n.value.trim()?m.menuList.map(k=>{if(k.children&&k.children.length>0){const i=k.children.filter(l=>l.title.toLowerCase().includes(n.value.toLowerCase()));return i.length>0?{...k,children:i}:null}return k.title.toLowerCase().includes(n.value.toLowerCase())?k:null}).filter(Boolean):m.menuList),_=k=>{k&&k!==r.path&&(o.push(k),n.value="")},S=k=>{o.push(k),n.value=""},M=()=>{d.logout(),c.clearUserInfo(),m.clearMenu(),o.push("/login")},U=k=>({dashboard:"📊",system:"⚙️",user:"👤",role:"👥",menu:"📋",setting:"🔧"})[k||""]||"📄";return(k,i)=>(e.openBlock(),e.createElementBlock("div",Re,[e.createElementVNode("div",Fe,[i[1]||(i[1]=e.createElementVNode("img",{src:de,alt:"Logo",class:"sidebar__logo-img"},null,-1)),e.withDirectives(e.createElementVNode("span",Pe,"Xto Demo",512),[[e.vShow,!f.value]])]),f.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ze,[e.createVNode(e.unref(h.Input),{modelValue:n.value,"onUpdate:modelValue":i[0]||(i[0]=l=>n.value=l),placeholder:"搜索菜单...",size:"small",clearable:""},null,8,["modelValue"]),x.value.length>0?(e.openBlock(),e.createElementBlock("div",Oe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,l=>(e.openBlock(),e.createElementBlock("div",{key:l.path,class:"sidebar__search-item",onClick:u=>S(l.path)},[e.createElementVNode("span",qe,e.toDisplayString(U(l.icon)),1),e.createElementVNode("div",Ke,[e.createElementVNode("span",He,e.toDisplayString(l.title),1),l.parentTitle?(e.openBlock(),e.createElementBlock("span",Ye,e.toDisplayString(l.parentTitle),1)):e.createCommentVNode("",!0)])],8,je))),128))])):e.createCommentVNode("",!0)])),e.createVNode(e.unref(z.Menu),{"default-active":g.value,collapse:f.value,"collapse-transition":!1,"background-color":N.value,"text-color":B.value,"active-text-color":p.value,class:"sidebar__menu",onSelect:_},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,l=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:l.path},[l.children&&l.children.length>0?(e.openBlock(),e.createBlock(e.unref(z.SubMenu),{key:0,index:l.path},{title:e.withCtx(()=>[e.createElementVNode("span",Xe,e.toDisplayString(U(l.icon)),1),e.createElementVNode("span",null,e.toDisplayString(l.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.children,u=>(e.openBlock(),e.createBlock(e.unref(z.MenuItem),{key:u.path,index:u.path},{default:e.withCtx(()=>[e.createElementVNode("span",We,e.toDisplayString(U(u.icon)),1),e.createElementVNode("span",null,e.toDisplayString(u.title),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(e.openBlock(),e.createBlock(e.unref(z.MenuItem),{key:1,index:l.path},{default:e.withCtx(()=>[e.createElementVNode("span",Je,e.toDisplayString(U(l.icon)),1),e.createElementVNode("span",null,e.toDisplayString(l.title),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse","background-color","text-color","active-text-color"]),f.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ge,[e.createElementVNode("div",Qe,[e.createElementVNode("span",Ze,e.toDisplayString(e.unref(c).nickname),1),e.createElementVNode("span",ve,e.toDisplayString(e.unref(c).roles.join(", ")),1)]),e.createVNode(e.unref(w.Button),{type:"text",size:"small",onClick:M},{default:e.withCtx(()=>[...i[2]||(i[2]=[e.createTextVNode("退出",-1)])]),_:1})]))]))}}),A=(t,r)=>{const o=t.__vccOpts||t;for(const[m,c]of r)o[m]=c;return o},_e=A(et,[["__scopeId","data-v-1d224580"]]),tt={class:"header"},nt={class:"header__left"},ot={key:0},lt={key:1},rt={class:"header__breadcrumb"},at={key:0},st={class:"header__right"},it=["title"],dt={key:0,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},ct={key:1,viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},mt={key:0},pt={key:1},ut={class:"header__avatar"},ft={class:"header__user-name"},ht={key:0,class:"header__dropdown"},Vt={class:"header__dropdown-header"},_t={class:"header__dropdown-avatar"},Nt={class:"header__dropdown-info"},gt={class:"header__dropdown-name"},yt={class:"header__dropdown-role"},Ne=A(e.defineComponent({__name:"Header",setup(t){const r=L.useRoute(),o=L.useRouter(),m=O(),c=F(),d=Y(),s=H(),n=e.computed(()=>m.isCollapsed),f=e.ref(!1),g=e.ref(null),N=e.ref(!1),B=e.computed(()=>r.matched.filter(u=>u.meta&&u.meta.title).map(u=>({title:u.meta.title,path:u.path}))),p=()=>{m.toggleCollapse()},E=()=>{m.toggleTheme()},x=()=>{document.fullscreenElement?document.exitFullscreen():document.documentElement.requestFullscreen()},V=()=>{N.value=!!document.fullscreenElement},_=()=>{f.value=!f.value},S=()=>{f.value=!1},M=()=>{S(),alert("个人信息功能开发中...")},U=()=>{S(),alert("修改密码功能开发中...")},k=()=>{S(),d.logout(),c.clearUserInfo(),s.clearMenu(),o.push("/login")},i=l=>{g.value&&!g.value.contains(l.target)&&S()};return e.onMounted(()=>{document.addEventListener("click",i),document.addEventListener("fullscreenchange",V)}),e.onUnmounted(()=>{document.removeEventListener("click",i),document.removeEventListener("fullscreenchange",V)}),(l,u)=>{var R;return e.openBlock(),e.createElementBlock("div",tt,[e.createElementVNode("div",nt,[e.createElementVNode("div",{class:"header__collapse",onClick:p},[n.value?(e.openBlock(),e.createElementBlock("span",ot,"☰")):(e.openBlock(),e.createElementBlock("span",lt,"☰"))]),e.createElementVNode("div",rt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.value,(P,Q)=>(e.openBlock(),e.createElementBlock("span",{key:P.path},[Q>0?(e.openBlock(),e.createElementBlock("span",at," / ")):e.createCommentVNode("",!0),e.createElementVNode("span",{class:e.normalizeClass({"is-current":Q===B.value.length-1})},e.toDisplayString(P.title),3)]))),128))])]),e.createElementVNode("div",st,[e.createElementVNode("div",{class:"header__action",onClick:x,title:N.value?"Exit Fullscreen":"Fullscreen"},[N.value?(e.openBlock(),e.createElementBlock("svg",dt,[...u[0]||(u[0]=[e.createElementVNode("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",ct,[...u[1]||(u[1]=[e.createElementVNode("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"},null,-1)])]))],8,it),e.createElementVNode("div",{class:"header__action",onClick:E,title:"切换主题"},[e.unref(m).isDark?(e.openBlock(),e.createElementBlock("span",mt,"🌙")):(e.openBlock(),e.createElementBlock("span",pt,"☀️"))]),e.createElementVNode("div",{class:"header__user",ref_key:"dropdownRef",ref:g},[e.createElementVNode("div",{class:"header__user-trigger",onClick:e.withModifiers(_,["stop"])},[e.createElementVNode("div",ut,[e.createElementVNode("span",null,e.toDisplayString(((R=e.unref(c).nickname)==null?void 0:R.charAt(0))||"U"),1)]),e.createElementVNode("span",ft,e.toDisplayString(e.unref(c).nickname),1),e.createElementVNode("span",{class:e.normalizeClass(["header__user-arrow",{"is-active":f.value}])},"▼",2)]),e.createVNode(e.Transition,{name:"dropdown"},{default:e.withCtx(()=>{var P;return[f.value?(e.openBlock(),e.createElementBlock("div",ht,[e.createElementVNode("div",Vt,[e.createElementVNode("div",_t,[e.createElementVNode("span",null,e.toDisplayString(((P=e.unref(c).nickname)==null?void 0:P.charAt(0))||"U"),1)]),e.createElementVNode("div",Nt,[e.createElementVNode("div",gt,e.toDisplayString(e.unref(c).nickname),1),e.createElementVNode("div",yt,e.toDisplayString(e.unref(c).roles.join(", ")),1)])]),u[6]||(u[6]=e.createElementVNode("div",{class:"header__dropdown-divider"},null,-1)),e.createElementVNode("div",{class:"header__dropdown-menu"},[e.createElementVNode("div",{class:"header__dropdown-item",onClick:M},[...u[2]||(u[2]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"👤",-1),e.createElementVNode("span",null,"个人信息",-1)])]),e.createElementVNode("div",{class:"header__dropdown-item",onClick:U},[...u[3]||(u[3]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"🔐",-1),e.createElementVNode("span",null,"修改密码",-1)])]),u[5]||(u[5]=e.createElementVNode("div",{class:"header__dropdown-divider"},null,-1)),e.createElementVNode("div",{class:"header__dropdown-item header__dropdown-item--danger",onClick:k},[...u[4]||(u[4]=[e.createElementVNode("span",{class:"header__dropdown-icon"},"🚪",-1),e.createElementVNode("span",null,"退出登录",-1)])])])])):e.createCommentVNode("",!0)]}),_:1})],512)])])}}}),[["__scopeId","data-v-7af82b67"]]),Et={class:"layout"},kt={class:"layout__main"},Ct={class:"layout__content"},ae=A(e.defineComponent({__name:"index",setup(t){const r=O(),o=e.computed(()=>r.isCollapsed?"64px":"210px");return(m,c)=>{const d=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",Et,[e.createElementVNode("aside",{class:"layout__aside",style:e.normalizeStyle({width:o.value})},[e.createVNode(_e)],4),e.createElementVNode("div",kt,[e.createVNode(Ne,{class:"layout__header"}),e.createElementVNode("main",Ct,[e.createVNode(d)])])])}}}),[["__scopeId","data-v-0bcf8553"]]),wt=Object.freeze(Object.defineProperty({__proto__:null,default:ae},Symbol.toStringTag,{value:"Module"})),xt={class:"tabs-wrapper"},St={class:"tab-label"},Bt=["onClick"],bt=A(e.defineComponent({__name:"Tabs",setup(t){const r=L.useRoute(),o=L.useRouter(),m=e.computed(()=>{const n=[];return r.matched.forEach(f=>{var g;(g=f.meta)!=null&&g.affix&&n.push({name:f.name,title:f.meta.title,path:f.path,affix:!0})}),n}),c=e.computed(()=>r.path),d=n=>{o.push(n)},s=n=>{const f=m.value.find(g=>g.path===n);if(!(f!=null&&f.affix)&&n===c.value){const g=m.value.findIndex(B=>B.path===n),N=m.value[g-1]||m.value[g+1];N&&o.push(N.path)}};return(n,f)=>(e.openBlock(),e.createElementBlock("div",xt,[e.createVNode(e.unref(z.Tabs),{modelValue:c.value,"onUpdate:modelValue":f[0]||(f[0]=g=>c.value=g),type:"card",onTabClick:d},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,g=>(e.openBlock(),e.createBlock(e.unref(z.TabPane),{key:g.path,name:g.path,label:g.title,closable:!g.affix},{label:e.withCtx(()=>[e.createElementVNode("span",St,[e.createTextVNode(e.toDisplayString(g.title)+" ",1),g.affix?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",{key:0,class:"tab-close",onClick:e.withModifiers(N=>s(g.path),["stop"])}," ✕ ",8,Bt))])]),_:2},1032,["name","label","closable"]))),128))]),_:1},8,["modelValue"])]))}}),[["__scopeId","data-v-9156d8cd"]]),Tt={},Dt={class:"footer"};function It(t,r){return e.openBlock(),e.createElementBlock("div",Dt,[...r[0]||(r[0]=[e.createElementVNode("span",null,"Copyright © 2024 Xto Demo. All Rights Reserved.",-1)])])}const $t=A(Tt,[["render",It],["__scopeId","data-v-4852826a"]]),Lt={class:"login"},At={class:"login__container"},ge=A(e.defineComponent({__name:"index",setup(t){const r=L.useRouter(),o=Y(),m=F(),c=H(),d=e.ref(!1),s=e.ref(!1),n=e.reactive({username:"admin",password:"123456"}),f={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"},{min:6,message:"密码长度至少6位",trigger:"blur"}]},g=e.ref(),N=async()=>{var B;try{await((B=g.value)==null?void 0:B.validate()),d.value=!0,setTimeout(()=>{o.login({token:"mock_token_"+Date.now(),refreshToken:"mock_refresh_token",expireTime:Date.now()+7*24*60*60*1e3}),m.setUserInfo({id:1,username:n.username,nickname:"管理员",avatar:"",email:"admin@example.com",phone:"13800138000",status:1,roles:["admin"],permissions:["*"],createTime:new Date().toISOString()}),c.setMenuList([{id:1,name:"Dashboard",path:"/dashboard",component:"dashboard/index",icon:"dashboard",title:"仪表盘",keepAlive:!0,affix:!0},{id:2,name:"System",path:"/system",redirect:"/system/user",icon:"setting",title:"系统管理",children:[{id:21,name:"SystemUser",path:"/system/user",component:"system/user/index",icon:"user",title:"用户管理",keepAlive:!0},{id:22,name:"SystemRole",path:"/system/role",component:"system/role/index",icon:"role",title:"角色管理",keepAlive:!0},{id:23,name:"SystemMenu",path:"/system/menu",component:"system/menu/index",icon:"menu",title:"菜单管理",keepAlive:!0}]}]),I.Message.success("登录成功"),r.push("/"),d.value=!1},1e3)}catch{d.value=!1}};return(B,p)=>(e.openBlock(),e.createElementBlock("div",Lt,[e.createElementVNode("div",At,[p[5]||(p[5]=e.createElementVNode("div",{class:"login__header"},[e.createElementVNode("img",{src:de,alt:"Logo",class:"login__logo"}),e.createElementVNode("h1",{class:"login__title"},"Xto Demo"),e.createElementVNode("p",{class:"login__subtitle"},"后台管理系统")],-1)),e.createVNode(e.unref(h.Form),{ref_key:"formRef",ref:g,model:n,rules:f,class:"login__form","label-width":"0"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{prop:"username"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:n.username,"onUpdate:modelValue":p[0]||(p[0]=E=>n.username=E),placeholder:"用户名","prefix-icon":"👤",size:"large"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{prop:"password"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:n.password,"onUpdate:modelValue":p[1]||(p[1]=E=>n.password=E),type:"password",placeholder:"密码","prefix-icon":"🔒",size:"large","show-password":"",onKeyup:e.withKeys(N,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(h.Checkbox),{modelValue:s.value,"onUpdate:modelValue":p[2]||(p[2]=E=>s.value=E)},{default:e.withCtx(()=>[...p[3]||(p[3]=[e.createTextVNode("记住我",-1)])]),_:1},8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",size:"large",loading:d.value,class:"login__submit",onClick:N},{default:e.withCtx(()=>[...p[4]||(p[4]=[e.createTextVNode(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),p[6]||(p[6]=e.createElementVNode("div",{class:"login__footer"},[e.createElementVNode("p",null,"提示: 任意用户名密码即可登录 (Mock 模式)")],-1))])]))}}),[["__scopeId","data-v-cc0ffe99"]]),Ut=Object.freeze(Object.defineProperty({__proto__:null,default:ge},Symbol.toStringTag,{value:"Module"})),Mt={class:"error-page"},Rt={class:"error-page__content"},ye=A(e.defineComponent({__name:"404",setup(t){const r=L.useRouter(),o=()=>{r.push("/")};return(m,c)=>(e.openBlock(),e.createElementBlock("div",Mt,[e.createElementVNode("div",Rt,[c[1]||(c[1]=e.createElementVNode("div",{class:"error-page__code"},"404",-1)),c[2]||(c[2]=e.createElementVNode("div",{class:"error-page__title"},"页面不存在",-1)),c[3]||(c[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您访问的页面不存在或已被删除",-1)),e.createVNode(e.unref(w.Button),{type:"primary",onClick:o},{default:e.withCtx(()=>[...c[0]||(c[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-c3c12c24"]]),Ft=Object.freeze(Object.defineProperty({__proto__:null,default:ye},Symbol.toStringTag,{value:"Module"})),Pt={class:"error-page"},zt={class:"error-page__content"},Ee=A(e.defineComponent({__name:"403",setup(t){const r=L.useRouter(),o=()=>{r.push("/")};return(m,c)=>(e.openBlock(),e.createElementBlock("div",Pt,[e.createElementVNode("div",zt,[c[1]||(c[1]=e.createElementVNode("div",{class:"error-page__code"},"403",-1)),c[2]||(c[2]=e.createElementVNode("div",{class:"error-page__title"},"无访问权限",-1)),c[3]||(c[3]=e.createElementVNode("div",{class:"error-page__desc"},"抱歉,您没有权限访问此页面",-1)),e.createVNode(e.unref(w.Button),{type:"primary",onClick:o},{default:e.withCtx(()=>[...c[0]||(c[0]=[e.createTextVNode("返回首页",-1)])]),_:1})])]))}}),[["__scopeId","data-v-dd5f2795"]]),Ot=Object.freeze(Object.defineProperty({__proto__:null,default:Ee},Symbol.toStringTag,{value:"Module"}));function jt(){const t=F(),r=d=>{const s=t.permissions;return s.includes("*")?!0:Array.isArray(d)?d.some(n=>s.includes(n)):s.includes(d)},o=d=>{const s=t.roles;return s.includes("admin")?!0:Array.isArray(d)?d.some(n=>s.includes(n)):s.includes(d)},m=e.computed(()=>t.roles.includes("admin")),c=e.computed(()=>t.isLoggedIn);return{hasPermission:r,hasRole:o,isAdmin:m,isLoggedIn:c}}function qt(t,r={}){const{rules:o,onSubmit:m}=r,c=e.ref(),d=e.reactive({...t}),s=e.ref(!1),n=e.ref(!1),f=e.ref(!1),g=()=>{p(),f.value=!1,n.value=!0},N=x=>{Object.assign(d,x),f.value=!0,n.value=!0},B=()=>{n.value=!1,p()},p=()=>{var x;Object.keys(t).forEach(V=>{d[V]=t[V]}),(x=c.value)==null||x.resetFields()};return{formRef:c,formData:d,rules:o,loading:s,visible:n,isEdit:f,openAdd:g,openEdit:N,close:B,resetForm:p,handleSubmit:async()=>{var x;try{await((x=c.value)==null?void 0:x.validate()),s.value=!0,await(m==null?void 0:m(d)),B()}catch(V){console.error(V)}finally{s.value=!1}}}}function Kt(t){const{fetchData:r,defaultPageSize:o=10}=t,m=e.ref(!1),c=e.ref([]),d=e.ref(0),s=e.ref(1),n=e.ref(o),f=e.reactive({}),g=async()=>{m.value=!0;try{const _={...f,page:s.value,pageSize:n.value},S=await r(_);c.value=S.list,d.value=S.total}catch(_){console.error(_)}finally{m.value=!1}},N=()=>{s.value=1,g()},B=()=>{Object.keys(f).forEach(_=>{f[_]=void 0}),s.value=1,g()},p=_=>{s.value=_,g()},E=_=>{n.value=_,s.value=1,g()},x=()=>{g()},V=e.computed(()=>({current:s.value,pageSize:n.value,total:d.value}));return{loading:m,data:c,total:d,currentPage:s,pageSize:n,searchParams:f,pagination:V,getData:g,handleSearch:N,handleReset:B,handlePageChange:p,handleSizeChange:E,refresh:x}}function Ht(t){const o=F().permissions;return Array.isArray(t)?t.some(m=>o.includes(m)):o.includes(t)}function ke(t){const o=F().roles;return Array.isArray(t)?t.some(m=>o.includes(m)):o.includes(t)}function Yt(){return ke("admin")}const X=(()=>{const t=De.create({baseURL:void 0,timeout:3e4,headers:{"Content-Type":"application/json"}});return t.interceptors.request.use(r=>{const o=J();return o&&(r.headers.Authorization=`Bearer ${o}`),r},r=>Promise.reject(r)),t.interceptors.response.use(r=>{const{data:o}=r;return o.code===200||o.code===0?o.data:(I.Message.error(o.message||"请求失败"),Promise.reject(new Error(o.message||"请求失败")))},r=>{var m;const{response:o}=r;if(o)switch(o.status){case 401:I.Message.error("登录已过期,请重新登录"),le(),window.location.href="/login";break;case 403:I.Message.error("没有权限访问");break;case 404:I.Message.error("请求资源不存在");break;case 500:I.Message.error("服务器错误");break;default:I.Message.error(((m=o.data)==null?void 0:m.message)||"请求失败")}else I.Message.error("网络连接失败");return Promise.reject(r)}),t})(),b={get(t,r){return X.get(t,r)},post(t,r,o){return X.post(t,r,o)},put(t,r,o){return X.put(t,r,o)},patch(t,r,o){return X.patch(t,r,o)},delete(t,r){return X.delete(t,r)}};function Xt(t,r={}){const o=r.indexPath||"/dashboard";return{path:"/",name:"Layout",component:ae,redirect:o,children:t}}function Wt(t){return L.createRouter({history:L.createWebHistory(),routes:t,scrollBehavior:()=>({left:0,top:0})})}function Jt(t){return b.post("/auth/login",t)}function Gt(){return b.post("/auth/logout")}function Qt(){return b.get("/user/info")}function Zt(t){return b.post("/auth/refresh",{refreshToken:t})}function vt(t){return b.get("/role/list",{params:t})}function en(t){return b.get(`/role/${t}`)}function tn(t){return b.post("/role",t)}function nn(t,r){return b.put(`/role/${t}`,r)}function on(t){return b.delete(`/role/${t}`)}function ln(t,r){return b.patch(`/role/${t}/status`,{status:r})}function rn(){return b.get("/menu/list")}function an(){return b.get("/menu/tree")}function sn(t){return b.post("/menu",t)}function dn(t,r){return b.put(`/menu/${t}`,r)}function cn(t){return b.delete(`/menu/${t}`)}function mn(t){return b.get("/user/list",{params:t})}function pn(t){return b.get(`/user/${t}`)}function un(t){return b.post("/user",t)}function fn(t,r){return b.put(`/user/${t}`,r)}function hn(t){return b.delete(`/user/${t}`)}function Vn(t){return b.post("/user/batch-delete",{ids:t})}function _n(t,r){return b.patch(`/user/${t}/status`,{status:r})}function Nn(t){return b.post(`/user/${t}/reset-password`)}var C=(t=>(t[t.ENABLED=1]="ENABLED",t[t.DISABLED=0]="DISABLED",t))(C||{}),Ce=(t=>(t[t.UNKNOWN=0]="UNKNOWN",t[t.MALE=1]="MALE",t[t.FEMALE=2]="FEMALE",t))(Ce||{}),$=(t=>(t[t.DIRECTORY=0]="DIRECTORY",t[t.MENU=1]="MENU",t[t.BUTTON=2]="BUTTON",t))($||{});const gn={1:"启用",0:"禁用"},yn={0:"未知",1:"男",2:"女"},En={0:"目录",1:"菜单",2:"按钮"},se=[{label:"启用",value:1},{label:"禁用",value:0}],kn=[{label:"未知",value:0},{label:"男",value:1},{label:"女",value:2}],we=[{label:"目录",value:0},{label:"菜单",value:1},{label:"按钮",value:2}],Cn={mounted(t,r){var s;const o=F(),{value:m}=r;if(!m)return;const c=o.permissions;let d=!1;Array.isArray(m)?d=m.some(n=>c.includes(n)||c.includes("*")):d=c.includes(m)||c.includes("*"),d||(s=t.parentNode)==null||s.removeChild(t)}};function wn(t={}){const r=O(),o=Y();t.appName&&r.setAppName(t.appName),t.baseUrl&&o.setBaseUrl(t.baseUrl),t.appId&&o.setAppId(t.appId),t.clientId&&o.setClientId(t.clientId),t.indexPath&&r.setIndexPath(t.indexPath),t.loginPath&&o.setLoginPath(t.loginPath)}const xn={class:"dashboard"},Sn={class:"dashboard__stats"},Bn={class:"stat-card__content"},bn={class:"stat-card__info"},Tn={class:"stat-card__title"},Dn={class:"dashboard__main"},In={class:"quick-links"},$n={class:"quick-link__icon"},Ln={class:"quick-link__title"},An={class:"activity-list"},Un={class:"activity-item__action"},Mn={class:"activity-item__time"},Rn={class:"system-info"},Fn={class:"system-info__item"},Pn={class:"system-info__item"},xe=Object.freeze(Object.defineProperty({__proto__:null,default:A(e.defineComponent({__name:"index",setup(t){const r=e.ref([{title:"用户总数",value:1234,icon:"👥",color:"#409eff"},{title:"今日访问",value:567,icon:"👀",color:"#67c23a"},{title:"订单数量",value:890,icon:"📦",color:"#e6a23c"},{title:"销售金额",value:123456,icon:"💰",color:"#f56c6c"}]),o=e.ref([{user:"张三",action:"登录系统",time:"2分钟前",type:"success"},{user:"李四",action:"修改了用户信息",time:"5分钟前",type:"warning"},{user:"王五",action:"创建了新订单",time:"10分钟前",type:"info"},{user:"赵六",action:"删除了测试数据",time:"30分钟前",type:"danger"},{user:"钱七",action:"更新了系统配置",time:"1小时前",type:"primary"}]),m=e.ref([{title:"用户管理",path:"/system/user",icon:"👤"},{title:"角色管理",path:"/system/role",icon:"👥"},{title:"菜单管理",path:"/system/menu",icon:"📋"},{title:"系统设置",path:"/system",icon:"⚙️"}]);return(c,d)=>{const s=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",xn,[e.createElementVNode("div",Sn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,n=>(e.openBlock(),e.createBlock(e.unref(D.Card),{key:n.title,class:"stat-card"},{default:e.withCtx(()=>[e.createElementVNode("div",Bn,[e.createElementVNode("div",{class:"stat-card__icon",style:e.normalizeStyle({backgroundColor:n.color+"20"})},e.toDisplayString(n.icon),5),e.createElementVNode("div",bn,[e.createElementVNode("div",Tn,e.toDisplayString(n.title),1),e.createElementVNode("div",{class:"stat-card__value",style:e.normalizeStyle({color:n.color})},e.toDisplayString(n.value.toLocaleString()),5)])])]),_:2},1024))),128))]),e.createElementVNode("div",Dn,[e.createVNode(e.unref(D.Card),{class:"dashboard__quick"},{header:e.withCtx(()=>[...d[0]||(d[0]=[e.createElementVNode("span",{class:"card-title"},"快捷入口",-1)])]),default:e.withCtx(()=>[e.createElementVNode("div",In,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,n=>(e.openBlock(),e.createBlock(s,{key:n.path,to:n.path,class:"quick-link"},{default:e.withCtx(()=>[e.createElementVNode("span",$n,e.toDisplayString(n.icon),1),e.createElementVNode("span",Ln,e.toDisplayString(n.title),1)]),_:2},1032,["to"]))),128))])]),_:1}),e.createVNode(e.unref(D.Card),{class:"dashboard__activity"},{header:e.withCtx(()=>[...d[1]||(d[1]=[e.createElementVNode("span",{class:"card-title"},"最近活动",-1)])]),default:e.withCtx(()=>[e.createElementVNode("div",An,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,(n,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"activity-item"},[e.createVNode(e.unref(D.Tag),{type:n.type,size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.user),1)]),_:2},1032,["type"]),e.createElementVNode("span",Un,e.toDisplayString(n.action),1),e.createElementVNode("span",Mn,e.toDisplayString(n.time),1)]))),128))])]),_:1})]),e.createVNode(e.unref(D.Card),{class:"dashboard__system"},{header:e.withCtx(()=>[...d[2]||(d[2]=[e.createElementVNode("span",{class:"card-title"},"系统信息",-1)])]),default:e.withCtx(()=>[e.createElementVNode("div",Rn,[d[5]||(d[5]=e.createElementVNode("div",{class:"system-info__item"},[e.createElementVNode("span",{class:"system-info__label"},"系统版本"),e.createElementVNode("span",{class:"system-info__value"},"v1.0.0")],-1)),d[6]||(d[6]=e.createElementVNode("div",{class:"system-info__item"},[e.createElementVNode("span",{class:"system-info__label"},"Vue 版本"),e.createElementVNode("span",{class:"system-info__value"},"3.4.21")],-1)),d[7]||(d[7]=e.createElementVNode("div",{class:"system-info__item"},[e.createElementVNode("span",{class:"system-info__label"},"构建工具"),e.createElementVNode("span",{class:"system-info__value"},"Vite 5")],-1)),d[8]||(d[8]=e.createElementVNode("div",{class:"system-info__item"},[e.createElementVNode("span",{class:"system-info__label"},"UI 组件库"),e.createElementVNode("span",{class:"system-info__value"},"xto")],-1)),e.createElementVNode("div",Fn,[d[3]||(d[3]=e.createElementVNode("span",{class:"system-info__label"},"服务器状态",-1)),e.createVNode(e.unref(D.Progress),{percentage:75,status:"success"})]),e.createElementVNode("div",Pn,[d[4]||(d[4]=e.createElementVNode("span",{class:"system-info__label"},"内存使用",-1)),e.createVNode(e.unref(D.Progress),{percentage:45})])])]),_:1})])}}}),[["__scopeId","data-v-44648cb1"]])},Symbol.toStringTag,{value:"Module"})),zn={class:"user-page"},On={class:"toolbar"},jn={class:"data-table"},qn={key:0},Kn={key:1},Hn={class:"pagination-wrapper"},Se=Object.freeze(Object.defineProperty({__proto__:null,default:A(e.defineComponent({__name:"index",setup(t){const r=[{id:1,username:"admin",nickname:"管理员",email:"admin@example.com",phone:"13800138001",status:C.ENABLED,roles:["admin"],createTime:"2024-01-01 10:00:00"},{id:2,username:"zhangsan",nickname:"张三",email:"zhangsan@example.com",phone:"13800138002",status:C.ENABLED,roles:["editor"],createTime:"2024-01-02 10:00:00"},{id:3,username:"lisi",nickname:"李四",email:"lisi@example.com",phone:"13800138003",status:C.DISABLED,roles:["viewer"],createTime:"2024-01-03 10:00:00"},{id:4,username:"wangwu",nickname:"王五",email:"wangwu@example.com",phone:"13800138004",status:C.ENABLED,roles:["editor"],createTime:"2024-01-04 10:00:00"},{id:5,username:"zhaoliu",nickname:"赵六",email:"zhaoliu@example.com",phone:"13800138005",status:C.ENABLED,roles:["viewer"],createTime:"2024-01-05 10:00:00"}],o=e.ref(!1),m=e.ref([]),c=e.ref(0),d=e.ref(1),s=e.ref(10),n=e.reactive({keyword:"",status:void 0}),f=e.ref(!1),g=e.computed(()=>N.id?"编辑用户":"新增用户"),N=e.reactive({id:0,username:"",nickname:"",email:"",phone:"",status:C.ENABLED,roles:[]}),B={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],nickname:[{required:!0,message:"请输入昵称",trigger:"blur"}],email:[{required:!0,message:"请输入邮箱",trigger:"blur"},{type:"email",message:"请输入正确的邮箱格式",trigger:"blur"}]},p=e.ref(),E=()=>{o.value=!0,setTimeout(()=>{let i=[...r];n.keyword&&(i=i.filter(l=>l.username.includes(n.keyword)||l.nickname.includes(n.keyword))),n.status!==void 0&&(i=i.filter(l=>l.status===n.status)),c.value=i.length,m.value=i.slice((d.value-1)*s.value,d.value*s.value),o.value=!1},300)},x=()=>{d.value=1,E()},V=()=>{n.keyword="",n.status=void 0,d.value=1,E()},_=()=>{Object.assign(N,{id:0,username:"",nickname:"",email:"",phone:"",status:C.ENABLED,roles:[]}),f.value=!0},S=i=>{Object.assign(N,i),f.value=!0},M=i=>{I.Message.success("删除成功"),E()},U=async()=>{var i;try{await((i=p.value)==null?void 0:i.validate()),I.Message.success(N.id?"编辑成功":"新增成功"),f.value=!1,E()}catch(l){console.error(l)}},k=i=>{I.Message.success(`已${i.status===C.ENABLED?"启用":"禁用"}用户 ${i.username}`)};return e.onMounted(()=>{E()}),(i,l)=>(e.openBlock(),e.createElementBlock("div",zn,[e.createVNode(e.unref(D.Card),{class:"search-card"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Form),{model:n,inline:""},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{label:"关键词"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:n.keyword,"onUpdate:modelValue":l[0]||(l[0]=u=>n.keyword=u),placeholder:"用户名/昵称",clearable:"",onKeyup:e.withKeys(x,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"状态"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Select),{modelValue:n.status,"onUpdate:modelValue":l[1]||(l[1]=u=>n.status=u),options:e.unref(se),placeholder:"请选择",clearable:""},null,8,["modelValue","options"])]),_:1}),e.createVNode(e.unref(h.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",onClick:x},{default:e.withCtx(()=>[...l[11]||(l[11]=[e.createTextVNode("搜索",-1)])]),_:1}),e.createVNode(e.unref(w.Button),{onClick:V},{default:e.withCtx(()=>[...l[12]||(l[12]=[e.createTextVNode("重置",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),e.createVNode(e.unref(D.Card),{class:"table-card"},{default:e.withCtx(()=>[e.createElementVNode("div",On,[e.createVNode(e.unref(w.Button),{type:"primary",onClick:_},{default:e.withCtx(()=>[...l[13]||(l[13]=[e.createTextVNode("新增用户",-1)])]),_:1})]),e.createElementVNode("table",jn,[l[18]||(l[18]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"ID"),e.createElementVNode("th",null,"用户名"),e.createElementVNode("th",null,"昵称"),e.createElementVNode("th",null,"邮箱"),e.createElementVNode("th",null,"手机号"),e.createElementVNode("th",null,"角色"),e.createElementVNode("th",null,"状态"),e.createElementVNode("th",null,"创建时间"),e.createElementVNode("th",null,"操作")])],-1)),e.createElementVNode("tbody",null,[o.value?(e.openBlock(),e.createElementBlock("tr",qn,[...l[14]||(l[14]=[e.createElementVNode("td",{colspan:"9",class:"loading-cell"},"加载中...",-1)])])):m.value.length===0?(e.openBlock(),e.createElementBlock("tr",Kn,[...l[15]||(l[15]=[e.createElementVNode("td",{colspan:"9",class:"empty-cell"},"暂无数据",-1)])])):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(m.value,u=>(e.openBlock(),e.createElementBlock("tr",{key:u.id},[e.createElementVNode("td",null,e.toDisplayString(u.id),1),e.createElementVNode("td",null,e.toDisplayString(u.username),1),e.createElementVNode("td",null,e.toDisplayString(u.nickname),1),e.createElementVNode("td",null,e.toDisplayString(u.email),1),e.createElementVNode("td",null,e.toDisplayString(u.phone),1),e.createElementVNode("td",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.roles,R=>(e.openBlock(),e.createBlock(e.unref(D.Tag),{key:R,size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(R),1)]),_:2},1024))),128))]),e.createElementVNode("td",null,[e.createVNode(e.unref(h.Switch),{"model-value":u.status===e.unref(C).ENABLED,"onUpdate:modelValue":R=>{u.status=R?e.unref(C).ENABLED:e.unref(C).DISABLED,k(u)}},null,8,["model-value","onUpdate:modelValue"])]),e.createElementVNode("td",null,e.toDisplayString(u.createTime),1),e.createElementVNode("td",null,[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",link:"",size:"small",onClick:R=>S(u)},{default:e.withCtx(()=>[...l[16]||(l[16]=[e.createTextVNode("编辑",-1)])]),_:1},8,["onClick"]),e.createVNode(e.unref(I.Popconfirm),{title:"确定删除该用户吗?",onConfirm:R=>M(u.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"danger",link:"",size:"small"},{default:e.withCtx(()=>[...l[17]||(l[17]=[e.createTextVNode("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)])]))),128))])]),e.createElementVNode("div",Hn,[e.createVNode(e.unref(D.Pagination),{"current-page":d.value,"onUpdate:currentPage":l[2]||(l[2]=u=>d.value=u),"page-size":s.value,"onUpdate:pageSize":l[3]||(l[3]=u=>s.value=u),total:c.value,"page-sizes":[10,20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:E,onSizeChange:E},null,8,["current-page","page-size","total"])])]),_:1}),e.createVNode(e.unref(I.Modal),{modelValue:f.value,"onUpdate:modelValue":l[10]||(l[10]=u=>f.value=u),title:g.value,width:"500px"},{footer:e.withCtx(()=>[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{onClick:l[9]||(l[9]=u=>f.value=!1)},{default:e.withCtx(()=>[...l[19]||(l[19]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(e.unref(w.Button),{type:"primary",onClick:U},{default:e.withCtx(()=>[...l[20]||(l[20]=[e.createTextVNode("确定",-1)])]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(e.unref(h.Form),{ref_key:"formRef",ref:p,model:N,rules:B,"label-width":"80px"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{label:"用户名",prop:"username"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.username,"onUpdate:modelValue":l[4]||(l[4]=u=>N.username=u),placeholder:"请输入用户名"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"昵称",prop:"nickname"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.nickname,"onUpdate:modelValue":l[5]||(l[5]=u=>N.nickname=u),placeholder:"请输入昵称"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"邮箱",prop:"email"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.email,"onUpdate:modelValue":l[6]||(l[6]=u=>N.email=u),placeholder:"请输入邮箱"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"手机号",prop:"phone"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.phone,"onUpdate:modelValue":l[7]||(l[7]=u=>N.phone=u),placeholder:"请输入手机号"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"状态"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Switch),{modelValue:N.status,"onUpdate:modelValue":l[8]||(l[8]=u=>N.status=u),"active-value":e.unref(C).ENABLED,"inactive-value":e.unref(C).DISABLED},null,8,["modelValue","active-value","inactive-value"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]))}}),[["__scopeId","data-v-d2491ae0"]])},Symbol.toStringTag,{value:"Module"})),Yn={class:"role-page"},Xn={class:"toolbar"},Wn={class:"data-table"},Jn={key:0},Gn={key:1},Qn={class:"pagination-wrapper"},Be=Object.freeze(Object.defineProperty({__proto__:null,default:A(e.defineComponent({__name:"index",setup(t){const r=[{id:1,name:"超级管理员",code:"admin",description:"拥有所有权限",status:C.ENABLED,permissions:["*"],createTime:"2024-01-01 10:00:00"},{id:2,name:"编辑",code:"editor",description:"内容编辑权限",status:C.ENABLED,permissions:["user:read","user:write"],createTime:"2024-01-02 10:00:00"},{id:3,name:"访客",code:"viewer",description:"只读权限",status:C.ENABLED,permissions:["user:read"],createTime:"2024-01-03 10:00:00"}],o=e.ref(!1),m=e.ref([]),c=e.ref(0),d=e.ref(1),s=e.ref(10),n=e.reactive({keyword:"",status:void 0}),f=e.ref(!1),g=e.computed(()=>N.id?"编辑角色":"新增角色"),N=e.reactive({id:0,name:"",code:"",description:"",status:C.ENABLED,permissions:[]}),B={name:[{required:!0,message:"请输入角色名称",trigger:"blur"}],code:[{required:!0,message:"请输入角色编码",trigger:"blur"}]},p=e.ref(),E=()=>{o.value=!0,setTimeout(()=>{let k=[...r];n.keyword&&(k=k.filter(i=>i.name.includes(n.keyword)||i.code.includes(n.keyword))),n.status!==void 0&&(k=k.filter(i=>i.status===n.status)),c.value=k.length,m.value=k.slice((d.value-1)*s.value,d.value*s.value),o.value=!1},300)},x=()=>{d.value=1,E()},V=()=>{n.keyword="",n.status=void 0,d.value=1,E()},_=()=>{Object.assign(N,{id:0,name:"",code:"",description:"",status:C.ENABLED,permissions:[]}),f.value=!0},S=k=>{Object.assign(N,k),f.value=!0},M=k=>{I.Message.success("删除成功"),E()},U=async()=>{var k;try{await((k=p.value)==null?void 0:k.validate()),I.Message.success(N.id?"编辑成功":"新增成功"),f.value=!1,E()}catch(i){console.error(i)}};return e.onMounted(()=>{E()}),(k,i)=>(e.openBlock(),e.createElementBlock("div",Yn,[e.createVNode(e.unref(D.Card),{class:"search-card"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Form),{model:n,inline:""},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{label:"关键词"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:n.keyword,"onUpdate:modelValue":i[0]||(i[0]=l=>n.keyword=l),placeholder:"角色名称/编码",clearable:"",onKeyup:e.withKeys(x,["enter"])},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"状态"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Select),{modelValue:n.status,"onUpdate:modelValue":i[1]||(i[1]=l=>n.status=l),options:e.unref(se),placeholder:"请选择",clearable:""},null,8,["modelValue","options"])]),_:1}),e.createVNode(e.unref(h.FormItem),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",onClick:x},{default:e.withCtx(()=>[...i[10]||(i[10]=[e.createTextVNode("搜索",-1)])]),_:1}),e.createVNode(e.unref(w.Button),{onClick:V},{default:e.withCtx(()=>[...i[11]||(i[11]=[e.createTextVNode("重置",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),e.createVNode(e.unref(D.Card),{class:"table-card"},{default:e.withCtx(()=>[e.createElementVNode("div",Xn,[e.createVNode(e.unref(w.Button),{type:"primary",onClick:_},{default:e.withCtx(()=>[...i[12]||(i[12]=[e.createTextVNode("新增角色",-1)])]),_:1})]),e.createElementVNode("table",Wn,[i[17]||(i[17]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"ID"),e.createElementVNode("th",null,"角色名称"),e.createElementVNode("th",null,"角色编码"),e.createElementVNode("th",null,"描述"),e.createElementVNode("th",null,"状态"),e.createElementVNode("th",null,"创建时间"),e.createElementVNode("th",null,"操作")])],-1)),e.createElementVNode("tbody",null,[o.value?(e.openBlock(),e.createElementBlock("tr",Jn,[...i[13]||(i[13]=[e.createElementVNode("td",{colspan:"7",class:"loading-cell"},"加载中...",-1)])])):m.value.length===0?(e.openBlock(),e.createElementBlock("tr",Gn,[...i[14]||(i[14]=[e.createElementVNode("td",{colspan:"7",class:"empty-cell"},"暂无数据",-1)])])):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(m.value,l=>(e.openBlock(),e.createElementBlock("tr",{key:l.id},[e.createElementVNode("td",null,e.toDisplayString(l.id),1),e.createElementVNode("td",null,e.toDisplayString(l.name),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:"primary",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.code),1)]),_:2},1024)]),e.createElementVNode("td",null,e.toDisplayString(l.description),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:l.status===e.unref(C).ENABLED?"success":"danger",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.status===e.unref(C).ENABLED?"启用":"禁用"),1)]),_:2},1032,["type"])]),e.createElementVNode("td",null,e.toDisplayString(l.createTime),1),e.createElementVNode("td",null,[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",link:"",size:"small",onClick:u=>S(l)},{default:e.withCtx(()=>[...i[15]||(i[15]=[e.createTextVNode("编辑",-1)])]),_:1},8,["onClick"]),e.createVNode(e.unref(I.Popconfirm),{title:"确定删除该角色吗?",onConfirm:u=>M(l.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"danger",link:"",size:"small"},{default:e.withCtx(()=>[...i[16]||(i[16]=[e.createTextVNode("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)])]))),128))])]),e.createElementVNode("div",Qn,[e.createVNode(e.unref(D.Pagination),{"current-page":d.value,"onUpdate:currentPage":i[2]||(i[2]=l=>d.value=l),"page-size":s.value,"onUpdate:pageSize":i[3]||(i[3]=l=>s.value=l),total:c.value,"page-sizes":[10,20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:E,onSizeChange:E},null,8,["current-page","page-size","total"])])]),_:1}),e.createVNode(e.unref(I.Modal),{modelValue:f.value,"onUpdate:modelValue":i[9]||(i[9]=l=>f.value=l),title:g.value,width:"500px"},{footer:e.withCtx(()=>[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{onClick:i[8]||(i[8]=l=>f.value=!1)},{default:e.withCtx(()=>[...i[18]||(i[18]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(e.unref(w.Button),{type:"primary",onClick:U},{default:e.withCtx(()=>[...i[19]||(i[19]=[e.createTextVNode("确定",-1)])]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(e.unref(h.Form),{ref_key:"formRef",ref:p,model:N,rules:B,"label-width":"80px"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{label:"角色名称",prop:"name"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.name,"onUpdate:modelValue":i[4]||(i[4]=l=>N.name=l),placeholder:"请输入角色名称"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"角色编码",prop:"code"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.code,"onUpdate:modelValue":i[5]||(i[5]=l=>N.code=l),placeholder:"请输入角色编码"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"描述"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:N.description,"onUpdate:modelValue":i[6]||(i[6]=l=>N.description=l),placeholder:"请输入描述"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"状态"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Switch),{modelValue:N.status,"onUpdate:modelValue":i[7]||(i[7]=l=>N.status=l),"active-value":e.unref(C).ENABLED,"inactive-value":e.unref(C).DISABLED},null,8,["modelValue","active-value","inactive-value"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]))}}),[["__scopeId","data-v-8ad30bc6"]])},Symbol.toStringTag,{value:"Module"})),Zn={class:"menu-page"},vn={class:"toolbar"},eo={class:"menu-tree"},to={class:"tree-table"},no={class:"tree-row tree-row--level-0"},oo=["onClick"],lo=["onClick"],be=Object.freeze(Object.defineProperty({__proto__:null,default:A(e.defineComponent({__name:"index",setup(t){const r=[{id:1,parentId:null,name:"Dashboard",path:"/dashboard",component:"dashboard/index",redirect:"",icon:"dashboard",title:"仪表盘",type:$.MENU,sort:1,status:C.ENABLED,hidden:!1,keepAlive:!0},{id:2,parentId:null,name:"System",path:"/system",component:"",redirect:"/system/user",icon:"setting",title:"系统管理",type:$.DIRECTORY,sort:2,status:C.ENABLED,hidden:!1,keepAlive:!1,children:[{id:21,parentId:2,name:"SystemUser",path:"/system/user",component:"system/user/index",redirect:"",icon:"user",title:"用户管理",type:$.MENU,sort:1,status:C.ENABLED,hidden:!1,keepAlive:!0},{id:22,parentId:2,name:"SystemRole",path:"/system/role",component:"system/role/index",redirect:"",icon:"role",title:"角色管理",type:$.MENU,sort:2,status:C.ENABLED,hidden:!1,keepAlive:!0},{id:23,parentId:2,name:"SystemMenu",path:"/system/menu",component:"system/menu/index",redirect:"",icon:"menu",title:"菜单管理",type:$.MENU,sort:3,status:C.ENABLED,hidden:!1,keepAlive:!0}]}],o=e.ref(!1),m=e.ref([]),c=e.ref(!1),d=e.computed(()=>s.id?"编辑菜单":"新增菜单"),s=e.reactive({id:0,parentId:null,name:"",path:"",component:"",redirect:"",icon:"",title:"",type:$.MENU,sort:0,status:C.ENABLED,hidden:!1,keepAlive:!0}),n={name:[{required:!0,message:"请输入菜单名称",trigger:"blur"}],path:[{required:!0,message:"请输入路由路径",trigger:"blur"}],title:[{required:!0,message:"请输入菜单标题",trigger:"blur"}]},f=e.ref(),g=()=>{o.value=!0,setTimeout(()=>{m.value=r,o.value=!1},300)},N=(x=null)=>{Object.assign(s,{id:0,parentId:x,name:"",path:"",component:"",redirect:"",icon:"",title:"",type:$.MENU,sort:0,status:C.ENABLED,hidden:!1,keepAlive:!0}),c.value=!0},B=x=>{Object.assign(s,x),c.value=!0},p=async()=>{var x;try{await((x=f.value)==null?void 0:x.validate()),I.Message.success(s.id?"编辑成功":"新增成功"),c.value=!1,g()}catch(V){console.error(V)}},E=x=>({dashboard:"📊",system:"⚙️",user:"👤",role:"👥",menu:"📋",setting:"🔧"})[x||""]||"📄";return e.onMounted(()=>{g()}),(x,V)=>(e.openBlock(),e.createElementBlock("div",Zn,[e.createVNode(e.unref(D.Card),{class:"menu-card"},{default:e.withCtx(()=>[e.createElementVNode("div",vn,[e.createVNode(e.unref(w.Button),{type:"primary",onClick:V[0]||(V[0]=_=>N())},{default:e.withCtx(()=>[...V[14]||(V[14]=[e.createTextVNode("新增菜单",-1)])]),_:1})]),e.createElementVNode("div",eo,[e.createElementVNode("table",to,[V[19]||(V[19]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"菜单名称"),e.createElementVNode("th",null,"图标"),e.createElementVNode("th",null,"路由路径"),e.createElementVNode("th",null,"类型"),e.createElementVNode("th",null,"排序"),e.createElementVNode("th",null,"状态"),e.createElementVNode("th",null,"操作")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,_=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:_.id},[e.createElementVNode("tr",no,[e.createElementVNode("td",null,[e.createElementVNode("span",{class:"menu-name",onClick:S=>B(_)},e.toDisplayString(_.title),9,oo)]),e.createElementVNode("td",null,e.toDisplayString(E(_.icon)),1),e.createElementVNode("td",null,e.toDisplayString(_.path),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:_.type===e.unref($).DIRECTORY?"primary":_.type===e.unref($).MENU?"success":"warning",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.type===e.unref($).DIRECTORY?"目录":_.type===e.unref($).MENU?"菜单":"按钮"),1)]),_:2},1032,["type"])]),e.createElementVNode("td",null,e.toDisplayString(_.sort),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:_.status===e.unref(C).ENABLED?"success":"danger",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.status===e.unref(C).ENABLED?"启用":"禁用"),1)]),_:2},1032,["type"])]),e.createElementVNode("td",null,[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",link:"",size:"small",onClick:S=>N(_.id)},{default:e.withCtx(()=>[...V[15]||(V[15]=[e.createTextVNode("新增",-1)])]),_:1},8,["onClick"]),e.createVNode(e.unref(w.Button),{type:"primary",link:"",size:"small",onClick:S=>B(_)},{default:e.withCtx(()=>[...V[16]||(V[16]=[e.createTextVNode("编辑",-1)])]),_:1},8,["onClick"])]),_:2},1024)])]),_.children?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(_.children,S=>(e.openBlock(),e.createElementBlock("tr",{key:S.id,class:"tree-row tree-row--level-1"},[e.createElementVNode("td",null,[V[17]||(V[17]=e.createElementVNode("span",{class:"tree-indent"},null,-1)),e.createElementVNode("span",{class:"menu-name",onClick:M=>B(S)},e.toDisplayString(S.title),9,lo)]),e.createElementVNode("td",null,e.toDisplayString(E(S.icon)),1),e.createElementVNode("td",null,e.toDisplayString(S.path),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:S.type===e.unref($).DIRECTORY?"primary":S.type===e.unref($).MENU?"success":"warning",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(S.type===e.unref($).DIRECTORY?"目录":S.type===e.unref($).MENU?"菜单":"按钮"),1)]),_:2},1032,["type"])]),e.createElementVNode("td",null,e.toDisplayString(S.sort),1),e.createElementVNode("td",null,[e.createVNode(e.unref(D.Tag),{type:S.status===e.unref(C).ENABLED?"success":"danger",size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(S.status===e.unref(C).ENABLED?"启用":"禁用"),1)]),_:2},1032,["type"])]),e.createElementVNode("td",null,[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{type:"primary",link:"",size:"small",onClick:M=>B(S)},{default:e.withCtx(()=>[...V[18]||(V[18]=[e.createTextVNode("编辑",-1)])]),_:1},8,["onClick"])]),_:2},1024)])]))),128)):e.createCommentVNode("",!0)],64))),128))])])])]),_:1}),e.createVNode(e.unref(I.Modal),{modelValue:c.value,"onUpdate:modelValue":V[13]||(V[13]=_=>c.value=_),title:d.value,width:"600px"},{footer:e.withCtx(()=>[e.createVNode(e.unref(w.Space),null,{default:e.withCtx(()=>[e.createVNode(e.unref(w.Button),{onClick:V[12]||(V[12]=_=>c.value=!1)},{default:e.withCtx(()=>[...V[20]||(V[20]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(e.unref(w.Button),{type:"primary",onClick:p},{default:e.withCtx(()=>[...V[21]||(V[21]=[e.createTextVNode("确定",-1)])]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(e.unref(h.Form),{ref_key:"formRef",ref:f,model:s,rules:n,"label-width":"80px"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.FormItem),{label:"上级菜单"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.parentId,"onUpdate:modelValue":V[1]||(V[1]=_=>s.parentId=_),placeholder:"上级菜单ID",disabled:""},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"菜单类型"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Select),{modelValue:s.type,"onUpdate:modelValue":V[2]||(V[2]=_=>s.type=_),options:e.unref(we)},null,8,["modelValue","options"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"菜单名称",prop:"name"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.name,"onUpdate:modelValue":V[3]||(V[3]=_=>s.name=_),placeholder:"请输入菜单名称(路由name)"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"菜单标题",prop:"title"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.title,"onUpdate:modelValue":V[4]||(V[4]=_=>s.title=_),placeholder:"请输入菜单标题"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"路由路径",prop:"path"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.path,"onUpdate:modelValue":V[5]||(V[5]=_=>s.path=_),placeholder:"请输入路由路径"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"组件路径"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.component,"onUpdate:modelValue":V[6]||(V[6]=_=>s.component=_),placeholder:"请输入组件路径"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"图标"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Input),{modelValue:s.icon,"onUpdate:modelValue":V[7]||(V[7]=_=>s.icon=_),placeholder:"请输入图标名称"},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"排序"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.InputNumber),{modelValue:s.sort,"onUpdate:modelValue":V[8]||(V[8]=_=>s.sort=_),min:0},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"状态"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Switch),{modelValue:s.status,"onUpdate:modelValue":V[9]||(V[9]=_=>s.status=_),"active-value":e.unref(C).ENABLED,"inactive-value":e.unref(C).DISABLED},null,8,["modelValue","active-value","inactive-value"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"隐藏"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Switch),{modelValue:s.hidden,"onUpdate:modelValue":V[10]||(V[10]=_=>s.hidden=_)},null,8,["modelValue"])]),_:1}),e.createVNode(e.unref(h.FormItem),{label:"缓存"},{default:e.withCtx(()=>[e.createVNode(e.unref(h.Switch),{modelValue:s.keepAlive,"onUpdate:modelValue":V[11]||(V[11]=_=>s.keepAlive=_)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]))}}),[["__scopeId","data-v-2a272a68"]])},Symbol.toStringTag,{value:"Module"}));a.Footer=$t,a.Forbidden=Ee,a.Gender=Ce,a.GenderOptions=kn,a.GenderText=yn,a.Header=Ne,a.Layout=ae,a.Login=ge,a.MenuType=$,a.MenuTypeOptions=we,a.MenuTypeText=En,a.NotFound=ye,a.Sidebar=_e,a.Status=C,a.StatusOptions=se,a.StatusText=gn,a.Tabs=bt,a.batchDeleteUsers=Vn,a.clearToken=le,a.createLayoutRoute=Xt,a.createMenu=sn,a.createRole=tn,a.createRouter=Wt,a.createUser=un,a.createXtoApp=wn,a.defaultDynamicRoutes=Le,a.deleteMenu=cn,a.deleteRole=on,a.deleteUser=hn,a.errorRoute=v,a.getMenuList=rn,a.getMenuTree=an,a.getRefreshToken=Ae,a.getRoleDetail=en,a.getRoleList=vt,a.getToken=J,a.getTokenExpire=ue,a.getUserDetail=pn,a.getUserInfo=Qt,a.getUserList=mn,a.hasPermission=Ht,a.hasRole=ke,a.hasToken=re,a.http=b,a.isAdmin=Yt,a.isTokenExpired=Ve,a.layoutRoute=ee,a.local=y,a.localStorageUtil=q,a.login=Jt,a.logout=Gt,a.mockMenuData=ce,a.permissionDirective=Cn,a.refreshToken=Zt,a.resetPassword=Nn,a.resetRouter=Me,a.router=G,a.session=Ie,a.sessionStorageUtil=K,a.setRefreshToken=pe,a.setToken=me,a.setTokenExpire=fe,a.setTokenInfo=he,a.staticRoutes=Z,a.updateMenu=dn,a.updateRole=nn,a.updateRoleStatus=ln,a.updateUser=fn,a.updateUserStatus=_n,a.useAppStore=O,a.useAuth=jt,a.useAuthStore=Y,a.useForm=qt,a.useMenuStore=H,a.useTable=Kt,a.useUserStore=F,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
package/dist/main.d.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
import { RouteRecordRaw } from 'vue-router';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
export declare const layoutRoute: RouteRecordRaw;
|
|
3
|
+
export declare const defaultDynamicRoutes: RouteRecordRaw[];
|
|
4
|
+
export declare const mockMenuData: ({
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
component: string;
|
|
9
|
+
icon: string;
|
|
10
|
+
title: string;
|
|
11
|
+
keepAlive: boolean;
|
|
12
|
+
affix: boolean;
|
|
13
|
+
redirect?: undefined;
|
|
14
|
+
children?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
id: number;
|
|
17
|
+
name: string;
|
|
18
|
+
path: string;
|
|
19
|
+
redirect: string;
|
|
20
|
+
icon: string;
|
|
21
|
+
title: string;
|
|
22
|
+
children: {
|
|
23
|
+
id: number;
|
|
24
|
+
name: string;
|
|
25
|
+
path: string;
|
|
26
|
+
component: string;
|
|
27
|
+
icon: string;
|
|
28
|
+
title: string;
|
|
29
|
+
keepAlive: boolean;
|
|
30
|
+
}[];
|
|
31
|
+
component?: undefined;
|
|
32
|
+
keepAlive?: undefined;
|
|
33
|
+
affix?: undefined;
|
|
34
|
+
})[];
|
package/dist/router/index.d.ts
CHANGED
|
@@ -1,28 +1,6 @@
|
|
|
1
|
-
import { Router, RouteRecordRaw } from 'vue-router';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @param routes 业务路由配置
|
|
6
|
-
* @param options 路由选项
|
|
2
|
+
* 路由配置
|
|
7
3
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
scrollBehavior?: Router['options']['scrollBehavior'];
|
|
12
|
-
}): Router;
|
|
13
|
-
/**
|
|
14
|
-
* 重置路由
|
|
15
|
-
*/
|
|
16
|
-
export declare function resetRouter(router: Router, routes: RouteRecordRaw[]): void;
|
|
17
|
-
/**
|
|
18
|
-
* 创建静态路由配置
|
|
19
|
-
* 注意:404 路由应在 createLayoutRoute 中通过 notFoundComponent 参数配置,
|
|
20
|
-
* 以确保 404 页面在布局内显示(保留菜单导航)
|
|
21
|
-
*/
|
|
22
|
-
export declare function createStaticRoutes(options?: {
|
|
23
|
-
loginPath?: string;
|
|
24
|
-
loginComponent?: any;
|
|
25
|
-
layoutComponent?: any;
|
|
26
|
-
forbiddenComponent?: any;
|
|
27
|
-
}): RouteRecordRaw[];
|
|
28
|
-
export { type RouteRecordRaw } from 'vue-router';
|
|
4
|
+
declare const router: import('vue-router').Router;
|
|
5
|
+
export declare function resetRouter(): void;
|
|
6
|
+
export default router;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RouteRecordRaw, Router } from 'vue-router';
|
|
2
|
+
interface LayoutRouteOptions {
|
|
3
|
+
indexPath?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* 创建布局路由
|
|
7
|
+
* @param children 子路由配置
|
|
8
|
+
* @param options 配置选项
|
|
9
|
+
* @returns 布局路由配置
|
|
10
|
+
*/
|
|
11
|
+
export declare function createLayoutRoute(children: RouteRecordRaw[], options?: LayoutRouteOptions): RouteRecordRaw;
|
|
12
|
+
/**
|
|
13
|
+
* 创建路由实例
|
|
14
|
+
* @param routes 路由配置数组
|
|
15
|
+
* @returns 路由实例
|
|
16
|
+
*/
|
|
17
|
+
export declare function createRouter(routes: RouteRecordRaw[]): Router;
|
|
18
|
+
export {};
|
|
@@ -1,19 +1,3 @@
|
|
|
1
1
|
import { RouteRecordRaw } from 'vue-router';
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
/** 登录路径 */
|
|
5
|
-
loginPath?: string;
|
|
6
|
-
/** 登录组件 */
|
|
7
|
-
loginComponent?: any;
|
|
8
|
-
/** 404 组件 */
|
|
9
|
-
notFoundComponent?: any;
|
|
10
|
-
/** 403 组件 */
|
|
11
|
-
forbiddenComponent?: any;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 创建错误路由
|
|
15
|
-
* 注意:如果使用 createLayoutRoute 并传入 notFoundComponent,
|
|
16
|
-
* 404 页面将在布局内显示(保留菜单导航),此时无需单独创建 404 路由
|
|
17
|
-
*/
|
|
18
|
-
export declare function createErrorRoutes(options?: StaticRouteOptions): RouteRecordRaw[];
|
|
19
|
-
export { type RouteRecordRaw } from 'vue-router';
|
|
2
|
+
export declare const staticRoutes: RouteRecordRaw[];
|
|
3
|
+
export declare const errorRoute: RouteRecordRaw;
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 应用初始化配置
|
|
3
|
+
*/
|
|
4
|
+
interface XtoAppConfig {
|
|
5
|
+
appName?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
appId?: string;
|
|
8
|
+
clientId?: string;
|
|
9
|
+
indexPath?: string;
|
|
10
|
+
loginPath?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 创建 XTO 应用配置
|
|
14
|
+
* @param config 应用配置
|
|
15
|
+
*/
|
|
16
|
+
export declare function createXtoApp(config?: XtoAppConfig): void;
|
|
17
|
+
export {};
|
package/dist/stores/app.d.ts
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* 应用状态
|
|
3
3
|
*/
|
|
4
4
|
export type ThemeMode = 'light' | 'dark';
|
|
5
|
-
export type LayoutMode = 'sidebar' | 'top';
|
|
5
|
+
export type LayoutMode = 'sidebar' | 'top' | 'mix';
|
|
6
6
|
export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
7
|
+
appName: import('vue').Ref<string, string>;
|
|
8
|
+
indexPath: import('vue').Ref<string, string>;
|
|
7
9
|
isDark: import('vue').Ref<boolean, boolean>;
|
|
8
10
|
theme: import('vue').Ref<ThemeMode, ThemeMode>;
|
|
9
11
|
layout: import('vue').Ref<LayoutMode, LayoutMode>;
|
|
@@ -12,9 +14,10 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
12
14
|
showFooter: import('vue').Ref<boolean, boolean>;
|
|
13
15
|
showBreadcrumb: import('vue').Ref<boolean, boolean>;
|
|
14
16
|
primaryColor: import('vue').Ref<string, string>;
|
|
15
|
-
isGrayscale: import('vue').Ref<boolean, boolean>;
|
|
16
17
|
cachedViews: import('vue').Ref<string[], string[]>;
|
|
17
18
|
themeClass: import('vue').ComputedRef<"light" | "dark">;
|
|
19
|
+
setAppName: (name: string) => void;
|
|
20
|
+
setIndexPath: (path: string) => void;
|
|
18
21
|
toggleTheme: () => void;
|
|
19
22
|
toggleCollapse: () => void;
|
|
20
23
|
setTheme: (mode: ThemeMode) => void;
|
|
@@ -23,12 +26,13 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
23
26
|
toggleFooter: () => void;
|
|
24
27
|
toggleBreadcrumb: () => void;
|
|
25
28
|
setPrimaryColor: (color: string) => void;
|
|
26
|
-
setGrayscale: (value: boolean) => void;
|
|
27
29
|
addCachedView: (name: string) => void;
|
|
28
30
|
removeCachedView: (name: string) => void;
|
|
29
31
|
clearCachedViews: () => void;
|
|
30
32
|
initTheme: () => void;
|
|
31
|
-
}, "isDark" | "theme" | "layout" | "isCollapsed" | "showTabs" | "showFooter" | "showBreadcrumb" | "primaryColor" | "
|
|
33
|
+
}, "appName" | "indexPath" | "isDark" | "theme" | "layout" | "isCollapsed" | "showTabs" | "showFooter" | "showBreadcrumb" | "primaryColor" | "cachedViews">, Pick<{
|
|
34
|
+
appName: import('vue').Ref<string, string>;
|
|
35
|
+
indexPath: import('vue').Ref<string, string>;
|
|
32
36
|
isDark: import('vue').Ref<boolean, boolean>;
|
|
33
37
|
theme: import('vue').Ref<ThemeMode, ThemeMode>;
|
|
34
38
|
layout: import('vue').Ref<LayoutMode, LayoutMode>;
|
|
@@ -37,9 +41,10 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
37
41
|
showFooter: import('vue').Ref<boolean, boolean>;
|
|
38
42
|
showBreadcrumb: import('vue').Ref<boolean, boolean>;
|
|
39
43
|
primaryColor: import('vue').Ref<string, string>;
|
|
40
|
-
isGrayscale: import('vue').Ref<boolean, boolean>;
|
|
41
44
|
cachedViews: import('vue').Ref<string[], string[]>;
|
|
42
45
|
themeClass: import('vue').ComputedRef<"light" | "dark">;
|
|
46
|
+
setAppName: (name: string) => void;
|
|
47
|
+
setIndexPath: (path: string) => void;
|
|
43
48
|
toggleTheme: () => void;
|
|
44
49
|
toggleCollapse: () => void;
|
|
45
50
|
setTheme: (mode: ThemeMode) => void;
|
|
@@ -48,12 +53,13 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
48
53
|
toggleFooter: () => void;
|
|
49
54
|
toggleBreadcrumb: () => void;
|
|
50
55
|
setPrimaryColor: (color: string) => void;
|
|
51
|
-
setGrayscale: (value: boolean) => void;
|
|
52
56
|
addCachedView: (name: string) => void;
|
|
53
57
|
removeCachedView: (name: string) => void;
|
|
54
58
|
clearCachedViews: () => void;
|
|
55
59
|
initTheme: () => void;
|
|
56
60
|
}, "themeClass">, Pick<{
|
|
61
|
+
appName: import('vue').Ref<string, string>;
|
|
62
|
+
indexPath: import('vue').Ref<string, string>;
|
|
57
63
|
isDark: import('vue').Ref<boolean, boolean>;
|
|
58
64
|
theme: import('vue').Ref<ThemeMode, ThemeMode>;
|
|
59
65
|
layout: import('vue').Ref<LayoutMode, LayoutMode>;
|
|
@@ -62,9 +68,10 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
62
68
|
showFooter: import('vue').Ref<boolean, boolean>;
|
|
63
69
|
showBreadcrumb: import('vue').Ref<boolean, boolean>;
|
|
64
70
|
primaryColor: import('vue').Ref<string, string>;
|
|
65
|
-
isGrayscale: import('vue').Ref<boolean, boolean>;
|
|
66
71
|
cachedViews: import('vue').Ref<string[], string[]>;
|
|
67
72
|
themeClass: import('vue').ComputedRef<"light" | "dark">;
|
|
73
|
+
setAppName: (name: string) => void;
|
|
74
|
+
setIndexPath: (path: string) => void;
|
|
68
75
|
toggleTheme: () => void;
|
|
69
76
|
toggleCollapse: () => void;
|
|
70
77
|
setTheme: (mode: ThemeMode) => void;
|
|
@@ -73,9 +80,8 @@ export declare const useAppStore: import('pinia').StoreDefinition<"app", Pick<{
|
|
|
73
80
|
toggleFooter: () => void;
|
|
74
81
|
toggleBreadcrumb: () => void;
|
|
75
82
|
setPrimaryColor: (color: string) => void;
|
|
76
|
-
setGrayscale: (value: boolean) => void;
|
|
77
83
|
addCachedView: (name: string) => void;
|
|
78
84
|
removeCachedView: (name: string) => void;
|
|
79
85
|
clearCachedViews: () => void;
|
|
80
86
|
initTheme: () => void;
|
|
81
|
-
}, "toggleTheme" | "toggleCollapse" | "setTheme" | "setLayout" | "toggleTabs" | "toggleFooter" | "toggleBreadcrumb" | "setPrimaryColor" | "
|
|
87
|
+
}, "setAppName" | "setIndexPath" | "toggleTheme" | "toggleCollapse" | "setTheme" | "setLayout" | "toggleTabs" | "toggleFooter" | "toggleBreadcrumb" | "setPrimaryColor" | "addCachedView" | "removeCachedView" | "clearCachedViews" | "initTheme">>;
|