mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import{c as I,r as w,_ as E,q as R,V as F,x as o,y as n,z as t,L as M,R as y,P as b,C as T,Y as A,O as v,J as V,T as N,K as k,aq as _,Q as q,aT as z,ac as J,o as H,av as Q,aU as Y,I as j,aV as G,M as W}from"./vue-vendor-YmkKLAOK.js";import{_ as L,u as X,a as D}from"./index-BiAIsnvb.js";import{s as g}from"./toast-BvwA7Mwb.js";import{L as Z}from"./LogoTitle-C0G1l-co.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"},ve={key:2,class:"mt-2 text-center"},xe={key:"message",class:"px-3 py-1.5 bg-green-100 border border-green-200 rounded-lg inline-block"},ge={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 x=z(),u=X(),m=I(()=>u.user||{username:"Admin"}),l=I(()=>u.oemSettings||{}),h=I(()=>u.oemLoading),s=w({current:"...",latest:"",hasUpdate:!1,checkingUpdate:!1,lastChecked:null,releaseInfo:null,noUpdateMessage:!1}),r=w(!1),f=w(!1),p=w(!1),a=E({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 c=JSON.parse(e);s.value.current=c.current||s.value.current,s.value.latest=c.latest,s.value.hasUpdate=c.hasUpdate,s.value.releaseInfo=c.releaseInfo,s.value.lastChecked=new Date(c.lastChecked)}}finally{s.value.checkingUpdate=!1}}},B=()=>{a.currentPassword="",a.newPassword="",a.confirmPassword="",a.newUsername="",f.value=!0,r.value=!1},P=()=>{f.value=!1},K=async()=>{if(a.newPassword!==a.confirmPassword){g("两次输入的密码不一致","error");return}if(a.newPassword.length<8){g("新密码长度至少8位","error");return}p.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?"账户信息修改成功,请重新登录":"密码修改成功,请重新登录";g(e,"success"),P(),setTimeout(()=>{u.logout(),x.push("/login")},1500)}else g(i.message||"修改失败","error")}catch{g("修改密码失败","error")}finally{p.value=!1}},O=()=>{confirm("确定要退出登录吗?")&&(u.logout(),x.push("/login"),g("已安全退出","success")),r.value=!1},S=i=>{!i.target.closest(".user-menu-container")&&r.value&&(r.value=!1)};return R(()=>{C(),setInterval(()=>{C()},36e5),document.addEventListener("click",S)}),F(()=>{document.removeEventListener("click",S)}),(i,e)=>{var c,$;return n(),o(q,null,[t("div",ee,[t("div",te,[t("div",se,[y(Z,{loading:h.value,title:l.value.siteName,subtitle:"管理后台","logo-src":l.value.siteIconData||l.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(),o("a",{key:0,href:((c=s.value.releaseInfo)==null?void 0:c.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]=d=>r.value=!r.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(m.value.username||"Admin"),1),t("i",{class:T(["fas fa-chevron-down text-xs transition-transform duration-200",{"rotate-180":r.value}])},null,2)]),r.value?(n(),o("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(),o("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"}),v("有新版本 ")],-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),v("查看更新 ",-1)]),8,fe)])):s.value.checkingUpdate?(n(),o("div",pe,e[12]||(e[12]=[t("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),v("检查更新中... ",-1)]))):(n(),o("div",ve,[y(N,{name:"fade",mode:"out-in"},{default:V(()=>[s.value.noUpdateMessage?(n(),o("div",xe,e[13]||(e[13]=[t("p",{class:"text-xs text-green-700 font-medium"},[t("i",{class:"fas fa-check-circle mr-1"}),v("当前已是最新版本 ")],-1)]))):(n(),o("button",{key:"button",onClick:e[1]||(e[1]=d=>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),v("检查更新 ",-1)])))]),_:1})]))]),t("button",{onClick:B,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:O,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(),o("div",ge,[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(K,["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:m.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]=d=>a.newUsername=d),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]=d=>a.currentPassword=d),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]=d=>a.newPassword=d),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]=d=>a.confirmPassword=d),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:p.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[p.value?(n(),o("div",ke)):(n(),o("i",_e)),v(" "+b(p.value?"保存中...":"保存修改"),1)],8,he)])],32)])])):M("",!0)],64)}}},Ce=L(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 x=[{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,m)=>(n(),o("div",Pe,[(n(),o(q,null,J(x,l=>t("button",{key:l.key,onClick:h=>u.$emit("tab-change",l.key),class:T(["tab-btn flex-1 py-3 px-6 text-sm font-semibold transition-all duration-300",U.activeTab===l.key?"active":"text-gray-700 hover:bg-white/10 hover:text-gray-900"])},[t("i",{class:T(l.icon+" mr-2")},null,2),v(b(l.name),1)],10,Ie)),64))]))}},Te=L(Me,[["__scopeId","data-v-0593e69b"]]),Ve={class:"min-h-screen p-6"},Le={class:"glass-strong rounded-3xl p-6 shadow-xl",style:{"z-index":"1","min-height":"calc(100vh - 240px)"}},Se={class:"tab-content"},$e={__name:"MainLayout",setup(U){const x=Y(),u=z(),m=w("dashboard"),l={dashboard:"/dashboard",apiKeys:"/api-keys",accounts:"/accounts",tutorial:"/tutorial",settings:"/settings"};H(()=>x.path,s=>{const r=Object.keys(l).find(f=>l[f]===s);r&&(m.value=r)},{immediate:!0});const h=s=>{m.value=s,u.push(l[s])};return(s,r)=>{const f=Q("router-view");return n(),o("div",Ve,[y(Ce),t("div",Le,[y(Te,{"active-tab":m.value,onTabChange:h},null,8,["active-tab"]),t("div",Se,[y(f,null,{default:V(({Component:p})=>[y(N,{name:"slide-up",mode:"out-in"},{default:V(()=>[(n(),j(G,{include:["DashboardView","ApiKeysView"]},[(n(),j(W(p)))],1024))]),_:2},1024)]),_:1})])])])}}},Ke=L($e,[["__scopeId","data-v-92ae9a03"]]);export{Ke as default};
|