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