Files
claude-relay-service/web/admin-spa/dist/assets/SettingsView-BaUN8Iwk.js
2025-08-22 16:02:05 +00:00

4 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{aR as F,r as h,aW as O,q as T,x as d,z as t,L as f,u as s,K as S,aq as D,O as m,C as j,P as k,aY as C,y as c}from"./vue-vendor-DfnFpxGJ.js";import{s as y}from"./toast-BvwA7Mwb.js";import{b as N,_ as E}from"./index-BdtiivzQ.js";import"./element-plus-CMedNaYf.js";import"./vendor-BDiMbLwQ.js";const V=F("settings",()=>{const n=h({siteName:"Claude Relay Service",siteIcon:"",siteIconData:"",updatedAt:null}),g=h(!1),p=h(!1),u=async()=>{g.value=!0;try{const r=await N.get("/admin/oem-settings");return r&&r.success&&(n.value={...n.value,...r.data},x()),r}catch(r){throw console.error("Failed to load OEM settings:",r),r}finally{g.value=!1}},a=async r=>{p.value=!0;try{const o=await N.put("/admin/oem-settings",r);return o&&o.success&&(n.value={...n.value,...o.data},x()),o}catch(o){throw console.error("Failed to save OEM settings:",o),o}finally{p.value=!1}},v=async()=>{const r={siteName:"Claude Relay Service",siteIcon:"",siteIconData:"",updatedAt:null};return n.value={...r},await a(r)},x=()=>{if(n.value.siteName&&(document.title=`${n.value.siteName} - 管理后台`),n.value.siteIconData||n.value.siteIcon){const r=document.querySelector('link[rel="icon"]')||document.createElement("link");r.rel="icon",r.href=n.value.siteIconData||n.value.siteIcon,document.querySelector('link[rel="icon"]')||document.head.appendChild(r)}};return{oemSettings:n,loading:g,saving:p,loadOemSettings:u,saveOemSettings:a,resetOemSettings:v,applyOemSettings:x,formatDateTime:r=>r?new Date(r).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"",validateIconFile:r=>{const o=[];return r.size>350*1024&&o.push("图标文件大小不能超过 350KB"),["image/x-icon","image/png","image/jpeg","image/jpg","image/svg+xml"].includes(r.type)||o.push("不支持的文件类型,请选择 .ico, .png, .jpg 或 .svg 文件"),{isValid:o.length===0,errors:o}},fileToBase64:r=>new Promise((o,i)=>{const e=new FileReader;e.onload=l=>o(l.target.result),e.onerror=i,e.readAsDataURL(r)})}}),R={class:"settings-container"},B={class:"card p-4 sm:p-6"},A={key:0,class:"py-12 text-center"},M={key:1,class:"table-container hidden sm:block"},U={class:"min-w-full"},$={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},q={class:"table-row"},z={class:"px-6 py-4"},L={class:"table-row"},P={class:"px-6 py-4"},G={class:"space-y-3"},K={key:0,class:"inline-flex items-center gap-3 rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},J=["src"],W={class:"px-6 py-6",colspan:"2"},Y={class:"flex items-center justify-between"},H={class:"flex gap-3"},Q=["disabled"],X={key:0,class:"loading-spinner mr-2"},Z={key:1,class:"fas fa-save mr-2"},tt=["disabled"],et={key:0,class:"text-sm text-gray-500 dark:text-gray-400"},st={key:2,class:"space-y-4 sm:hidden"},at={class:"rounded-lg bg-gray-50 p-4 dark:bg-gray-700"},rt={class:"space-y-2"},ot={class:"rounded-lg bg-gray-50 p-4 dark:bg-gray-700"},it={class:"space-y-3"},nt={key:0,class:"inline-flex w-full items-center gap-3 rounded-lg border border-gray-200 bg-white p-3 dark:border-gray-600 dark:bg-gray-800"},lt=["src"],dt={class:"flex flex-col gap-2"},ct={class:"space-y-3 pt-2"},gt=["disabled"],ut={key:0,class:"loading-spinner mr-2"},mt={key:1,class:"fas fa-save mr-2"},yt=["disabled"],pt={key:0,class:"text-center text-xs text-gray-500 dark:text-gray-400"},xt={__name:"SettingsView",setup(n){const g=V(),{loading:p,saving:u,oemSettings:a}=O(g),v=h();T(async()=>{try{await g.loadOemSettings()}catch{y("加载设置失败","error")}});const x=async()=>{try{const i={siteName:a.value.siteName,siteIcon:a.value.siteIcon,siteIconData:a.value.siteIconData},e=await g.saveOemSettings(i);e&&e.success?y("OEM设置保存成功","success"):y((e==null?void 0:e.message)||"保存失败","error")}catch{y("保存OEM设置失败","error")}},w=async()=>{if(confirm(`确定要重置为默认设置吗?
这将清除所有自定义的网站名称和图标设置。`))try{const i=await g.resetOemSettings();i&&i.success?y("已重置为默认设置","success"):y("重置失败","error")}catch{y("重置失败","error")}},I=async i=>{const e=i.target.files[0];if(!e)return;const l=g.validateIconFile(e);if(!l.isValid){l.errors.forEach(b=>y(b,"error"));return}try{const b=await g.fileToBase64(e);a.value.siteIconData=b}catch{y("文件读取失败","error")}i.target.value=""},_=()=>{a.value.siteIcon="",a.value.siteIconData=""},r=()=>{console.warn("Icon failed to load")},o=g.formatDateTime;return(i,e)=>(c(),d("div",R,[t("div",B,[e[25]||(e[25]=t("div",{class:"mb-4 sm:mb-6"},[t("h3",{class:"mb-1 text-lg font-bold text-gray-900 dark:text-gray-100 sm:mb-2 sm:text-xl"}," 其他设置 "),t("p",{class:"text-sm text-gray-600 dark:text-gray-400 sm:text-base"},"自定义网站名称和图标")],-1)),s(p)?(c(),d("div",A,e[5]||(e[5]=[t("div",{class:"loading-spinner mx-auto mb-4"},null,-1),t("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载设置...",-1)]))):(c(),d("div",M,[t("table",U,[t("tbody",$,[t("tr",q,[e[7]||(e[7]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600"},[t("i",{class:"fas fa-font text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 网站名称 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"品牌标识")])])],-1)),t("td",z,[S(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>s(a).siteName=l),class:"form-input w-full max-w-md dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",maxlength:"100",placeholder:"Claude Relay Service",type:"text"},null,512),[[D,s(a).siteName]]),e[6]||(e[6]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 将显示在浏览器标题和页面头部 ",-1))])]),t("tr",L,[e[12]||(e[12]=t("td",{class:"w-48 whitespace-nowrap px-6 py-4"},[t("div",{class:"flex items-center"},[t("div",{class:"mr-3 flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-purple-500 to-purple-600"},[t("i",{class:"fas fa-image text-xs text-white"})]),t("div",null,[t("div",{class:"text-sm font-semibold text-gray-900 dark:text-gray-100"}," 网站图标 "),t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"Favicon")])])],-1)),t("td",P,[t("div",G,[s(a).siteIconData||s(a).siteIcon?(c(),d("div",K,[t("img",{alt:"图标预览",class:"h-8 w-8",src:s(a).siteIconData||s(a).siteIcon,onError:r},null,40,J),e[9]||(e[9]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"当前图标",-1)),t("button",{class:"rounded-lg px-3 py-1 font-medium text-red-600 transition-colors hover:bg-red-50 hover:text-red-900",onClick:_},e[8]||(e[8]=[t("i",{class:"fas fa-trash mr-1"},null,-1),m("删除 ",-1)]))])):f("",!0),t("div",null,[t("input",{ref_key:"iconFileInput",ref:v,accept:".ico,.png,.jpg,.jpeg,.svg",class:"hidden",type:"file",onChange:I},null,544),t("button",{class:"btn btn-success px-4 py-2",onClick:e[1]||(e[1]=l=>i.$refs.iconFileInput.click())},e[10]||(e[10]=[t("i",{class:"fas fa-upload mr-2"},null,-1),m(" 上传图标 ",-1)])),e[11]||(e[11]=t("span",{class:"ml-3 text-xs text-gray-500 dark:text-gray-400"},"支持 .ico, .png, .jpg, .svg 格式,最大 350KB",-1))])])])]),t("tr",null,[t("td",W,[t("div",Y,[t("div",H,[t("button",{class:j(["btn btn-primary px-6 py-3",{"cursor-not-allowed opacity-50":s(u)}]),disabled:s(u),onClick:x},[s(u)?(c(),d("div",X)):(c(),d("i",Z)),m(" "+k(s(u)?"保存中...":"保存设置"),1)],10,Q),t("button",{class:"btn bg-gray-100 px-6 py-3 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",disabled:s(u),onClick:w},e[13]||(e[13]=[t("i",{class:"fas fa-undo mr-2"},null,-1),m(" 重置为默认 ",-1)]),8,tt)]),s(a).updatedAt?(c(),d("div",et,[e[14]||(e[14]=t("i",{class:"fas fa-clock mr-1"},null,-1)),m(" 最后更新:"+k(s(o)(s(a).updatedAt)),1)])):f("",!0)])])])])])])),s(p)?f("",!0):(c(),d("div",st,[t("div",at,[e[16]||(e[16]=C('<div class="mb-3 flex items-center gap-3" data-v-32a92c9b><div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600" data-v-32a92c9b><i class="fas fa-font text-sm text-white" data-v-32a92c9b></i></div><div data-v-32a92c9b><h4 class="text-sm font-semibold text-gray-900 dark:text-gray-100" data-v-32a92c9b>网站名称</h4><p class="text-xs text-gray-500" data-v-32a92c9b>品牌标识</p></div></div>',1)),t("div",rt,[S(t("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>s(a).siteName=l),class:"form-input w-full text-sm dark:border-gray-500 dark:bg-gray-600 dark:text-gray-200",maxlength:"100",placeholder:"Claude Relay Service",type:"text"},null,512),[[D,s(a).siteName]]),e[15]||(e[15]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"将显示在浏览器标题和页面头部",-1))])]),t("div",ot,[e[22]||(e[22]=C('<div class="mb-3 flex items-center gap-3" data-v-32a92c9b><div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-purple-500 to-purple-600" data-v-32a92c9b><i class="fas fa-image text-sm text-white" data-v-32a92c9b></i></div><div data-v-32a92c9b><h4 class="text-sm font-semibold text-gray-900 dark:text-gray-100" data-v-32a92c9b>网站图标</h4><p class="text-xs text-gray-500 dark:text-gray-400" data-v-32a92c9b>Favicon</p></div></div>',1)),t("div",it,[s(a).siteIconData||s(a).siteIcon?(c(),d("div",nt,[t("img",{alt:"图标预览",class:"h-8 w-8",src:s(a).siteIconData||s(a).siteIcon,onError:r},null,40,lt),e[18]||(e[18]=t("span",{class:"flex-1 text-sm text-gray-600 dark:text-gray-400"},"当前图标",-1)),t("button",{class:"rounded-lg px-3 py-1 text-sm font-medium text-red-600 transition-colors hover:bg-red-50 hover:text-red-900",onClick:_},e[17]||(e[17]=[t("i",{class:"fas fa-trash mr-1"},null,-1),m("删除 ",-1)]))])):f("",!0),t("input",{ref_key:"iconFileInput",ref:v,accept:"image/*",style:{display:"none"},type:"file",onChange:I},null,544),t("div",dt,[t("button",{class:"flex w-full items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",onClick:e[3]||(e[3]=l=>i.$refs.iconFileInput.click())},e[19]||(e[19]=[t("i",{class:"fas fa-upload"},null,-1),m(" 上传图标 ",-1)])),e[20]||(e[20]=t("div",{class:"text-xs text-gray-500 dark:text-gray-400"},"或者输入图标URL",-1)),S(t("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>s(a).siteIcon=l),class:"form-input w-full text-sm dark:border-gray-500 dark:bg-gray-600 dark:text-gray-200",placeholder:"https://example.com/icon.png",type:"url"},null,512),[[D,s(a).siteIcon]])]),e[21]||(e[21]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 支持 PNG、JPEG、GIF 格式,建议使用正方形图片 ",-1))])]),t("div",ct,[t("button",{class:"btn btn-primary w-full py-3 text-sm font-semibold",disabled:s(u),onClick:x},[s(u)?(c(),d("div",ut)):(c(),d("i",mt)),m(" "+k(s(u)?"保存中...":"保存设置"),1)],8,gt),t("button",{class:"btn w-full bg-gray-100 py-3 text-sm text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",disabled:s(u),onClick:w},e[23]||(e[23]=[t("i",{class:"fas fa-undo mr-2"},null,-1),m(" 重置为默认 ",-1)]),8,yt),s(a).updatedAt?(c(),d("div",pt,[e[24]||(e[24]=t("i",{class:"fas fa-clock mr-1"},null,-1)),m(" 最后更新:"+k(s(o)(s(a).updatedAt)),1)])):f("",!0)])]))])]))}},wt=E(xt,[["__scopeId","data-v-32a92c9b"]]);export{wt as default};