Files
claude-relay-service/web/admin-spa/dist/assets/MainLayout-Dnl8xkCL.js
shaw 19cab40b77 feat(admin-spa): 添加构建后的dist目录并更新.gitignore
- 添加 admin-spa 构建后的 dist 目录
- 从 .gitignore 中移除 dist 忽略规则
- 确保 /admin-next 路由可以正常访问

现在访问 /admin-next/api-stats 将能正确加载新版管理界面

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-29 12:48:15 +08:00

2 lines
12 KiB
JavaScript

import{c as I,r as h,_ as F,q as N,V as J,x as l,y as n,z as t,L as M,R as y,P as b,C as T,Y as A,O as p,J as S,T as O,K as k,aq as _,Q as q,aT as z,ac as H,o as Q,av as Y,aU as G,I as j,aV as W,M as X}from"./vue-vendor-YmkKLAOK.js";import{_ as V,u as B,a as D}from"./index-15K8yWyh.js";import{s as x}from"./toast-BvwA7Mwb.js";import{L as Z}from"./LogoTitle-D39YWWT1.js";import"./element-plus-D-FTEVKS.js";import"./vendor-BDiMbLwQ.js";/* empty css */const ee={class:"glass-strong rounded-3xl p-6 mb-8 shadow-xl",style:{"z-index":"10",position:"relative"}},te={class:"flex flex-col md:flex-row justify-between items-center gap-4"},se={class:"flex items-center gap-4"},ae={class:"flex items-center gap-2"},ne={class:"text-sm text-gray-400 font-mono"},oe=["href"],le={class:"relative user-menu-container"},re={class:"px-4 py-3 border-b border-gray-100"},ie={class:"flex items-center justify-between text-sm"},ue={class:"font-mono text-gray-700"},de={key:0,class:"mt-2"},ce={class:"flex items-center justify-between text-sm mb-2"},me={class:"font-mono text-green-600"},fe=["href"],pe={key:1,class:"mt-2 text-center text-xs text-gray-500"},ge={key:2,class:"mt-2 text-center"},ve={key:"message",class:"px-3 py-1.5 bg-green-100 border border-green-200 rounded-lg inline-block"},xe={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},be={class:"modal-content w-full max-w-md p-8 mx-auto max-h-[90vh] flex flex-col"},ye=["value"],we={class:"flex gap-3 pt-4"},he=["disabled"],ke={key:0,class:"loading-spinner mr-2"},_e={key:1,class:"fas fa-save mr-2"},Ue={__name:"AppHeader",setup(U){const g=z(),u=B(),w=I(()=>u.user||{username:"Admin"}),r=I(()=>u.oemSettings||{}),v=I(()=>u.oemLoading),s=h({current:"...",latest:"",hasUpdate:!1,checkingUpdate:!1,lastChecked:null,releaseInfo:null,noUpdateMessage:!1}),o=h(!1),f=h(!1),d=h(!1),a=F({currentPassword:"",newPassword:"",confirmPassword:"",newUsername:""}),C=async()=>{if(!s.value.checkingUpdate){s.value.checkingUpdate=!0;try{const i=await D.get("/admin/check-updates");if(i.success){const e=i.data;s.value.current=e.current,s.value.latest=e.latest,s.value.hasUpdate=e.hasUpdate,s.value.releaseInfo=e.releaseInfo,s.value.lastChecked=new Date,localStorage.setItem("versionInfo",JSON.stringify({current:e.current,latest:e.latest,lastChecked:s.value.lastChecked,hasUpdate:e.hasUpdate,releaseInfo:e.releaseInfo})),e.hasUpdate||(s.value.noUpdateMessage=!0,setTimeout(()=>{s.value.noUpdateMessage=!1},3e3))}}catch(i){console.error("Error checking for updates:",i);const e=localStorage.getItem("versionInfo");if(e){const m=JSON.parse(e);s.value.current=m.current||s.value.current,s.value.latest=m.latest,s.value.hasUpdate=m.hasUpdate,s.value.releaseInfo=m.releaseInfo,s.value.lastChecked=new Date(m.lastChecked)}}finally{s.value.checkingUpdate=!1}}},K=()=>{a.currentPassword="",a.newPassword="",a.confirmPassword="",a.newUsername="",f.value=!0,o.value=!1},P=()=>{f.value=!1},E=async()=>{if(a.newPassword!==a.confirmPassword){x("两次输入的密码不一致","error");return}if(a.newPassword.length<8){x("新密码长度至少8位","error");return}d.value=!0;try{const i=await D.post("/admin/change-password",{currentPassword:a.currentPassword,newPassword:a.newPassword,newUsername:a.newUsername||void 0});if(i.success){const e=a.newUsername?"账户信息修改成功,请重新登录":"密码修改成功,请重新登录";x(e,"success"),P(),setTimeout(()=>{u.logout(),g.push("/login")},1500)}else x(i.message||"修改失败","error")}catch{x("修改密码失败","error")}finally{d.value=!1}},R=()=>{confirm("确定要退出登录吗?")&&(u.logout(),g.push("/login"),x("已安全退出","success")),o.value=!1},L=i=>{!i.target.closest(".user-menu-container")&&o.value&&(o.value=!1)};return N(()=>{C(),setInterval(()=>{C()},36e5),document.addEventListener("click",L)}),J(()=>{document.removeEventListener("click",L)}),(i,e)=>{var m,$;return n(),l(q,null,[t("div",ee,[t("div",te,[t("div",se,[y(Z,{loading:v.value,title:r.value.siteName,subtitle:"管理后台","logo-src":r.value.siteIconData||r.value.siteIcon,"title-class":"text-white"},null,8,["loading","title","logo-src"]),t("div",ae,[t("span",ne,"v"+b(s.value.current||"..."),1),s.value.hasUpdate?(n(),l("a",{key:0,href:((m=s.value.releaseInfo)==null?void 0:m.htmlUrl)||"#",target:"_blank",class:"inline-flex items-center gap-1 px-2 py-0.5 bg-green-500 border border-green-600 rounded-full text-xs text-white hover:bg-green-600 transition-colors animate-pulse",title:"有新版本可用"},e[7]||(e[7]=[t("i",{class:"fas fa-arrow-up text-[10px]"},null,-1),t("span",null,"新版本",-1)]),8,oe)):M("",!0)])]),t("div",le,[t("button",{onClick:e[0]||(e[0]=c=>o.value=!o.value),class:"btn btn-primary px-4 py-3 flex items-center gap-2 relative"},[e[8]||(e[8]=t("i",{class:"fas fa-user-circle"},null,-1)),t("span",null,b(w.value.username||"Admin"),1),t("i",{class:T(["fas fa-chevron-down text-xs transition-transform duration-200",{"rotate-180":o.value}])},null,2)]),o.value?(n(),l("div",{key:0,class:"absolute right-0 top-full mt-2 w-56 bg-white rounded-xl shadow-xl border border-gray-200 py-2 user-menu-dropdown",style:{"z-index":"999999"},onClick:e[2]||(e[2]=A(()=>{},["stop"]))},[t("div",re,[t("div",ie,[e[9]||(e[9]=t("span",{class:"text-gray-500"},"当前版本",-1)),t("span",ue,"v"+b(s.value.current||"..."),1)]),s.value.hasUpdate?(n(),l("div",de,[t("div",ce,[e[10]||(e[10]=t("span",{class:"text-green-600 font-medium"},[t("i",{class:"fas fa-arrow-up mr-1"}),p("有新版本 ")],-1)),t("span",me,"v"+b(s.value.latest),1)]),t("a",{href:(($=s.value.releaseInfo)==null?void 0:$.htmlUrl)||"#",target:"_blank",class:"block w-full text-center px-3 py-1.5 bg-green-500 text-white text-sm rounded-lg hover:bg-green-600 transition-colors"},e[11]||(e[11]=[t("i",{class:"fas fa-external-link-alt mr-1"},null,-1),p("查看更新 ",-1)]),8,fe)])):s.value.checkingUpdate?(n(),l("div",pe,e[12]||(e[12]=[t("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),p("检查更新中... ",-1)]))):(n(),l("div",ge,[y(O,{name:"fade",mode:"out-in"},{default:S(()=>[s.value.noUpdateMessage?(n(),l("div",ve,e[13]||(e[13]=[t("p",{class:"text-xs text-green-700 font-medium"},[t("i",{class:"fas fa-check-circle mr-1"}),p("当前已是最新版本 ")],-1)]))):(n(),l("button",{key:"button",onClick:e[1]||(e[1]=c=>C()),class:"text-xs text-blue-500 hover:text-blue-700 transition-colors"},e[14]||(e[14]=[t("i",{class:"fas fa-sync-alt mr-1"},null,-1),p("检查更新 ",-1)])))]),_:1})]))]),t("button",{onClick:K,class:"w-full px-4 py-3 text-left text-gray-700 hover:bg-gray-50 transition-colors flex items-center gap-3"},e[15]||(e[15]=[t("i",{class:"fas fa-key text-blue-500"},null,-1),t("span",null,"修改账户信息",-1)])),e[17]||(e[17]=t("hr",{class:"my-2 border-gray-200"},null,-1)),t("button",{onClick:R,class:"w-full px-4 py-3 text-left text-gray-700 hover:bg-gray-50 transition-colors flex items-center gap-3"},e[16]||(e[16]=[t("i",{class:"fas fa-sign-out-alt text-red-500"},null,-1),t("span",null,"退出登录",-1)]))])):M("",!0)])])]),f.value?(n(),l("div",xe,[t("div",be,[t("div",{class:"flex items-center justify-between mb-6"},[e[19]||(e[19]=t("div",{class:"flex items-center gap-3"},[t("div",{class:"w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center"},[t("i",{class:"fas fa-key text-white"})]),t("h3",{class:"text-xl font-bold text-gray-900"},"修改账户信息")],-1)),t("button",{onClick:P,class:"text-gray-400 hover:text-gray-600 transition-colors"},e[18]||(e[18]=[t("i",{class:"fas fa-times text-xl"},null,-1)]))]),t("form",{onSubmit:A(E,["prevent"]),class:"space-y-6 modal-scroll-content custom-scrollbar flex-1"},[t("div",null,[e[20]||(e[20]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"当前用户名",-1)),t("input",{value:w.value.username||"Admin",type:"text",disabled:"",class:"form-input w-full bg-gray-100 cursor-not-allowed"},null,8,ye),e[21]||(e[21]=t("p",{class:"text-xs text-gray-500 mt-2"},"当前用户名,输入新用户名以修改",-1))]),t("div",null,[e[22]||(e[22]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新用户名",-1)),k(t("input",{"onUpdate:modelValue":e[3]||(e[3]=c=>a.newUsername=c),type:"text",class:"form-input w-full",placeholder:"输入新用户名(留空保持不变)"},null,512),[[_,a.newUsername]]),e[23]||(e[23]=t("p",{class:"text-xs text-gray-500 mt-2"},"留空表示不修改用户名",-1))]),t("div",null,[e[24]||(e[24]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"当前密码",-1)),k(t("input",{"onUpdate:modelValue":e[4]||(e[4]=c=>a.currentPassword=c),type:"password",required:"",class:"form-input w-full",placeholder:"请输入当前密码"},null,512),[[_,a.currentPassword]])]),t("div",null,[e[25]||(e[25]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新密码",-1)),k(t("input",{"onUpdate:modelValue":e[5]||(e[5]=c=>a.newPassword=c),type:"password",required:"",class:"form-input w-full",placeholder:"请输入新密码"},null,512),[[_,a.newPassword]]),e[26]||(e[26]=t("p",{class:"text-xs text-gray-500 mt-2"},"密码长度至少8位",-1))]),t("div",null,[e[27]||(e[27]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"确认新密码",-1)),k(t("input",{"onUpdate:modelValue":e[6]||(e[6]=c=>a.confirmPassword=c),type:"password",required:"",class:"form-input w-full",placeholder:"请再次输入新密码"},null,512),[[_,a.confirmPassword]])]),t("div",we,[t("button",{type:"button",onClick:P,class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),t("button",{type:"submit",disabled:d.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[d.value?(n(),l("div",ke)):(n(),l("i",_e)),p(" "+b(d.value?"保存中...":"保存修改"),1)],8,he)])],32)])])):M("",!0)],64)}}},Ce=V(Ue,[["__scopeId","data-v-9f4a7654"]]),Pe={class:"flex flex-wrap gap-2 mb-6 bg-white/10 rounded-2xl p-2 backdrop-blur-sm"},Ie=["onClick"],Me={__name:"TabBar",props:{activeTab:{type:String,required:!0}},emits:["tab-change"],setup(U){const g=[{key:"dashboard",name:"仪表板",icon:"fas fa-tachometer-alt"},{key:"apiKeys",name:"API Keys",icon:"fas fa-key"},{key:"accounts",name:"账户管理",icon:"fas fa-user-circle"},{key:"tutorial",name:"使用教程",icon:"fas fa-graduation-cap"},{key:"settings",name:"其他设置",icon:"fas fa-cogs"}];return(u,w)=>(n(),l("div",Pe,[(n(),l(q,null,H(g,r=>t("button",{key:r.key,onClick:v=>u.$emit("tab-change",r.key),class:T(["tab-btn flex-1 py-3 px-6 text-sm font-semibold transition-all duration-300",U.activeTab===r.key?"active":"text-gray-700 hover:bg-white/10 hover:text-gray-900"])},[t("i",{class:T(r.icon+" mr-2")},null,2),p(b(r.name),1)],10,Ie)),64))]))}},Te=V(Me,[["__scopeId","data-v-0593e69b"]]),Se={class:"min-h-screen p-6"},Ve={class:"glass-strong rounded-3xl p-6 shadow-xl",style:{"z-index":"1","min-height":"calc(100vh - 240px)"}},Le={class:"tab-content"},$e={__name:"MainLayout",setup(U){const g=G(),u=z(),w=B(),r=h("dashboard"),v={dashboard:"/dashboard",apiKeys:"/api-keys",accounts:"/accounts",tutorial:"/tutorial",settings:"/settings"};Q(()=>g.path,o=>{const f=Object.keys(v).find(d=>v[d]===o);f&&(r.value=f)},{immediate:!0});const s=o=>{r.value=o,u.push(v[o])};return N(()=>{w.loadOemSettings()}),(o,f)=>{const d=Y("router-view");return n(),l("div",Se,[y(Ce),t("div",Ve,[y(Te,{"active-tab":r.value,onTabChange:s},null,8,["active-tab"]),t("div",Le,[y(d,null,{default:S(({Component:a})=>[y(O,{name:"slide-up",mode:"out-in"},{default:S(()=>[(n(),j(W,{include:["DashboardView","ApiKeysView"]},[(n(),j(X(a)))],1024))]),_:2},1024)]),_:1})])])])}}},Be=V($e,[["__scopeId","data-v-6b200e64"]]);export{Be as default};