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