Files
claude-relay-service/web/admin-spa/dist/assets/MainLayout-C8nYwTH1.js
2025-08-06 16:44:03 +00:00

2 lines
12 KiB
JavaScript

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