You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
13 KiB

import{g as Q,B as J,c as o,a,l as r,d as f,t as i,F as k,r as M,L as I,p as q,s as W,v as X,x as h,z as D,y as Y,o as n,n as A,m as $,q as Z,C as ee,_ as te}from"./AL6uUoB7.js";import{u as se}from"./D_urMdl7.js";import{u as le}from"./BgfmgSoF.js";import"./mydnAiU4.js";const ae={class:"flex items-center gap-2 mb-1"},oe={class:"text-lg font-semibold text-slate-800"},ne={key:0,class:"text-slate-400 font-normal"},ie={key:0,class:"grid grid-cols-3 gap-4"},re=["onClick"],de={class:"flex items-start justify-between"},ce={width:"22",height:"22",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},ue=["d"],ve={key:0,class:"badge badge-success badge-sm text-white"},ye={key:1,class:"badge badge-ghost badge-sm"},me={class:"text-base font-semibold text-slate-800 mt-3"},pe={class:"text-xs text-slate-400 mt-1"},_e={class:"text-[11px] text-slate-400 mt-3 pt-3 border-t border-slate-100"},be={key:0},fe={class:"text-slate-600"},ke={key:1,class:"text-slate-300"},he={key:1},ge={class:"grid grid-cols-4 gap-3 mb-5"},xe=["onClick"],we={class:"flex items-center justify-between"},Ce={key:0,class:"text-[10px] text-emerald-500 font-semibold"},Se={key:1,class:"text-[10px] text-slate-300 font-semibold"},Me={class:"text-sm font-semibold text-slate-700 mt-2"},qe={class:"text-[11px] text-slate-400 mb-2.5"},Ae=["onClick"],Te=["checked","onClick"],Pe={key:1,class:"bg-white rounded-2xl border border-slate-100 shadow-sm p-6 max-w-3xl"},Ie={class:"flex items-center justify-between mb-5"},De={class:"flex items-center gap-3"},Ve={class:"text-base font-semibold text-slate-800"},Ke={class:"text-xs text-slate-400 mt-0.5"},Le={class:"flex items-center gap-2"},Re={class:"flex items-center gap-2 mr-1"},$e=["disabled"],je={key:0,class:"loading loading-spinner loading-xs"},ze={class:"grid grid-cols-2 gap-x-5 gap-y-4"},Be={class:"label py-1"},Ee={class:"label-text text-sm"},Ne={key:0,class:"text-rose-500 ml-0.5"},Ue={key:1,class:"lock-tag ml-1.5"},Oe=["onUpdate:modelValue"],Fe=["value"],Ge={key:1,class:"relative"},He=["onUpdate:modelValue","type","placeholder"],Qe=["onClick"],Je={key:2,class:"text-[11px] text-slate-400 mt-1"},We={class:"flex items-end gap-3"},Xe={class:"form-control flex-1"},Ye=["disabled"],Ze={key:0,class:"loading loading-spinner loading-xs"},et=Q({__name:"systemconfig",setup(tt){const{success:T,info:V,error:P}=se(),{webApi:g}=le();function v(l,t,e,s,c,p,_){return{id:l,provider:t,name:e,short:s,tag:c,color:p,enable:!1,is_default:!1,fields:_}}const y=Y([{id:"storage",label:"对象存储",desc:"固件 / 头像等文件直传(默认阿里云 OSS)",color:"#6366f1",icon:"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8",multi:!0,services:[v("storage_aliyun_oss","aliyun_oss","阿里云 OSS","OSS","Aliyun · 固件/头像上传所用","#ff6a00",[{key:"endpoint",label:"Endpoint",value:"",placeholder:"oss-cn-shanghai.aliyuncs.com",mono:!0,required:!0},{key:"bucket",label:"Bucket",value:"",placeholder:"yunyan-firmware",mono:!0,required:!0},{key:"access_key_id",label:"AccessKey ID",value:"",mono:!0,encrypted:!0,required:!0},{key:"access_key_secret",label:"AccessKey Secret",value:"",mono:!0,encrypted:!0,required:!0},{key:"domain",label:"自定义域名 (CDN)",value:"",placeholder:"cdn.yunyan.com",wide:!0,hint:"可选,配置后文件下载 URL 走该域名"}]),v("storage_tencent_cos","tencent_cos","腾讯云 COS","COS","Tencent","#00a4ff",[{key:"region",label:"Region",value:"",placeholder:"ap-guangzhou",mono:!0,required:!0},{key:"appid",label:"AppId",value:"",mono:!0,required:!0},{key:"bucket",label:"Bucket",value:"",mono:!0,required:!0},{key:"secret_id",label:"SecretId",value:"",mono:!0,encrypted:!0,required:!0},{key:"secret_key",label:"SecretKey",value:"",mono:!0,encrypted:!0,required:!0},{key:"domain",label:"自定义域名 (CDN)",value:"",wide:!0,hint:"可选"}])]},{id:"email",label:"邮件服务",desc:"生产通知 / 账号告警发信(支持 SMTP 与 Resend)",color:"#f59e0b",icon:"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z",multi:!1,services:[v("email","auto","邮件服务","MAIL","生产通知 / 账号告警","#f59e0b",[{key:"EmailType",label:"邮箱类型",value:"1",type:"select",required:!0,options:[{value:"0",label:"QQ 邮箱 (SMTP)"},{value:"1",label:"腾讯企业邮箱 (SMTP)"},{value:"2",label:"Gmail (SMTP)"},{value:"3",label:"Resend(HTTP API,海外送达率优)"}]},{key:"FromEmail",label:"发件人邮箱",value:"",mono:!0,required:!0,placeholder:"noreply@yourdomain.com",hint:"Resend 须为已在其后台验证域名下的地址"},{key:"FromName",label:"发件人昵称",value:"",placeholder:"云岩科技"},{key:"Password",label:"SMTP 授权码 / Resend API Key",value:"",mono:!0,encrypted:!0,required:!0,hint:"SMTP 类型填邮箱授权码;Resend 填 re_ 开头的 API Key"}])]},{id:"translate",label:"翻译服务",desc:"后台文案多语言同步",color:"#14b8a6",icon:"M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129",multi:!0,services:[v("translate_volc","volc","火山引擎翻译","火山","Volcengine MT","#1664ff",[{key:"region",label:"Region",value:"cn-beijing",mono:!0,required:!0},{key:"access_key",label:"AccessKey",value:"",mono:!0,encrypted:!0,required:!0},{key:"secret_key",label:"SecretKey",value:"",mono:!0,encrypted:!0,required:!0}]),v("translate_aliyun","aliyun_mt","阿里云翻译","阿里","Aliyun MT","#ff6a00",[{key:"region",label:"Region",value:"cn-hangzhou",mono:!0,required:!0},{key:"access_key_id",label:"AccessKey ID",value:"",mono:!0,encrypted:!0,required:!0},{key:"access_key_secret",label:"AccessKey Secret",value:"",mono:!0,encrypted:!0,required:!0}]),v("translate_google","google_mt","Google 翻译","G","Cloud Translation","#ea4335",[{key:"project",label:"Project ID",value:"",mono:!0,required:!0},{key:"api_key",label:"API Key",value:"",mono:!0,encrypted:!0,required:!0}]),v("translate_deepl","deepl","DeepL","DL","DeepL API","#0f2b46",[{key:"auth_key",label:"Auth Key",value:"",mono:!0,encrypted:!0,required:!0}])]}]),m=h("cards"),K=h(""),x=h(""),C=h(!1),S=h(!1),w=h(""),d=D(()=>y.find(l=>l.id===K.value)||y[0]),j=D(()=>d.value.services),u=D(()=>d.value.multi&&d.value.services.find(l=>l.id===x.value)||d.value.services[0]);function z(l){return y.find(t=>t.id===l)?.services||[]}function B(l){return z(l).some(t=>t.enable)}function L(l){const t=y.find(s=>s.id===l);if(!t)return"";if(!t.multi){const s=t.services[0];return s.enable?s.name:""}const e=t.services.find(s=>s.is_default&&s.enable);return e?e.name:""}function E(l){K.value=l;const t=y.find(s=>s.id===l),e=t.services.find(s=>s.is_default)||t.services[0];x.value=e.id,m.value="edit"}function N(){m.value="cards"}async function U(){try{const t=(await g("getsysconfigs",{}))?.items||[],e={};for(const s of t)e[s.id]=s;for(const s of y)for(const c of s.services){const p=e[c.id];if(p){c.enable=!!p.enable,c.is_default=!!p.is_default;for(const _ of p.fields||[]){const b=c.fields.find(H=>H.key===_.key);b&&(_.encrypted?(b.value="",_.def_value==="[encrypted]"&&(b.hint=(b.hint?b.hint+";":"")+"已配置(留空保留原密文)")):b.value=_.def_value||"")}}}}catch(l){V("系统配置读取失败:"+(l?.message??l))}}J(U);async function O(){const l=u.value;if(!l)return;const t=d.value;C.value=!0;const e={id:l.id,category:t.id,name:l.name,provider:l.provider,enable:l.enable,is_default:t.multi?l.is_default:!0,fields:l.fields.map((s,c)=>({key:s.key,description:s.label,type:s.type==="select"?"select":"",encrypted:!!s.encrypted,def_value:s.value||"",sort:c}))};try{await g("savesysconfig",e),T(`「${l.name}」配置已保存${l.enable?"并启用":""}`)}catch(s){P(s?.message??"保存失败")}finally{C.value=!1}}async function R(l){const t=d.value;t.services.forEach(e=>{e.is_default=e.id===l.id}),l.enable=!0,x.value=l.id;try{await F(l,t),await g("setsysdefault",{id:l.id,category:t.id}),T(`已将「${l.name}」设为默认`)}catch(e){P(e?.message??"设置失败")}}async function F(l,t){const e={id:l.id,category:t.id,name:l.name,provider:l.provider,enable:!0,is_default:!0,fields:l.fields.map((s,c)=>({key:s.key,description:s.label,type:s.type==="select"?"select":"",encrypted:!!s.encrypted,def_value:s.value||"",sort:c}))};await g("savesysconfig",e)}async function G(){if(!w.value.trim()){V("请先填测试收件邮箱");return}S.value=!0;try{await g("testsysemail",{to:w.value.trim()}),T(`测试邮件已发送至 ${w.value.trim()}`)}catch(l){P(l?.message??"发送失败")}finally{S.value=!1}}return(l,t)=>(n(),o("div",null,[a("div",ae,[m.value==="edit"?(n(),o("button",{key:0,class:"btn btn-ghost btn-sm",onClick:N},"← 返回")):r("",!0),a("h2",oe,[t[2]||(t[2]=f("系统配置",-1)),m.value==="edit"?(n(),o("span",ne," / "+i(d.value.label),1)):r("",!0)])]),t[11]||(t[11]=a("p",{class:"text-xs text-slate-400 mb-5"}," 平台自用服务配置(与「第三方服务配置」分库存储,不下发客户端):对象存储(固件 / 头像直传)、邮件服务(生产通知发信)、翻译服务(后台文案多语言)。 ",-1)),m.value==="cards"?(n(),o("div",ie,[(n(!0),o(k,null,M(y,e=>(n(),o("div",{key:e.id,class:"cat-card",onClick:s=>E(e.id)},[a("div",de,[a("div",{class:"cat-icon",style:I({background:e.color})},[(n(),o("svg",ce,[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:e.icon},null,8,ue)]))],4),B(e.id)?(n(),o("span",ve,"已启用")):(n(),o("span",ye,"未配置"))]),a("div",me,i(e.label),1),a("div",pe,i(e.desc),1),a("div",_e,[L(e.id)?(n(),o("span",be,[t[3]||(t[3]=f("当前:",-1)),a("b",fe,i(L(e.id)),1)])):(n(),o("span",ke,"尚未配置,点击设置"))])],8,re))),128))])):m.value==="edit"?(n(),o("div",he,[d.value.multi?(n(),o(k,{key:0},[t[4]||(t[4]=a("div",{class:"text-xs font-semibold text-slate-500 mb-2"},[f("选择服务商 "),a("span",{class:"text-slate-400 font-normal"},"(勾选设为默认,平台调用走默认项)")],-1)),a("div",ge,[(n(!0),o(k,null,M(j.value,e=>(n(),o("div",{key:e.id,class:A(["provider-card",{active:x.value===e.id,"is-default":e.is_default}]),onClick:s=>x.value=e.id},[a("div",we,[a("div",{class:"provider-logo",style:I({background:e.color})},i(e.short),5),e.enable?(n(),o("span",Ce,"已配置")):(n(),o("span",Se,"未配置"))]),a("div",Me,i(e.name),1),a("div",qe,i(e.tag),1),a("label",{class:A(["default-pick",{on:e.is_default}]),onClick:$(s=>R(e),["stop"])},[a("input",{type:"radio",class:"radio radio-xs radio-primary",checked:e.is_default,onClick:$(s=>R(e),["stop"])},null,8,Te),a("span",null,i(e.is_default?"默认使用":"设为默认"),1)],10,Ae)],10,xe))),128))])],64)):r("",!0),u.value?(n(),o("div",Pe,[a("div",Ie,[a("div",De,[a("div",{class:"provider-logo",style:I({background:u.value.color,width:"44px",height:"44px",fontSize:"14px"})},i(u.value.short),5),a("div",null,[a("h3",Ve,i(u.value.name),1),a("p",Ke,i(u.value.tag),1)])]),a("div",Le,[a("label",Re,[t[5]||(t[5]=a("span",{class:"text-xs text-slate-500"},"启用",-1)),q(a("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>u.value.enable=e),type:"checkbox",class:"toggle toggle-primary toggle-sm"},null,512),[[W,u.value.enable]])]),a("button",{class:"btn btn-primary btn-sm text-white",disabled:C.value,onClick:O},[C.value?(n(),o("span",je)):r("",!0),t[6]||(t[6]=f("保存 ",-1))],8,$e)])]),t[10]||(t[10]=a("div",{class:"divider text-xs text-slate-400 my-3"},"配置项",-1)),a("div",ze,[(n(!0),o(k,null,M(u.value.fields,e=>(n(),o("div",{key:e.key,class:A(["form-control",{"col-span-2":e.wide}])},[a("label",Be,[a("span",Ee,[f(i(e.label),1),e.required?(n(),o("span",Ne,"*")):r("",!0),e.encrypted?(n(),o("span",Ue,"🔒 加密存储")):r("",!0)])]),e.type==="select"?q((n(),o("select",{key:0,"onUpdate:modelValue":s=>e.value=s,class:"select select-bordered select-sm"},[(n(!0),o(k,null,M(e.options,s=>(n(),o("option",{key:s.value,value:s.value},i(s.label),9,Fe))),128))],8,Oe)),[[Z,e.value]]):(n(),o("div",Ge,[q(a("input",{"onUpdate:modelValue":s=>e.value=s,type:e.encrypted&&!e._show?"password":"text",class:A(["input input-bordered input-sm w-full",{"font-mono":e.mono,"pr-14":e.encrypted}]),placeholder:e.placeholder},null,10,He),[[ee,e.value]]),e.encrypted?(n(),o("button",{key:0,type:"button",class:"absolute right-3 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:s=>e._show=!e._show},i(e._show?"隐藏":"显示"),9,Qe)):r("",!0)])),e.hint?(n(),o("span",Je,i(e.hint),1)):r("",!0)],2))),128))]),d.value.id==="email"?(n(),o(k,{key:0},[t[9]||(t[9]=a("div",{class:"divider text-xs text-slate-400 my-4"},"测试发信",-1)),a("div",We,[a("div",Xe,[t[7]||(t[7]=a("label",{class:"label py-1"},[a("span",{class:"label-text text-sm"},"测试收件邮箱")],-1)),q(a("input",{"onUpdate:modelValue":t[1]||(t[1]=e=>w.value=e),class:"input input-bordered input-sm font-mono",placeholder:"填一个邮箱,发送测试邮件验证配置(需先保存)"},null,512),[[X,w.value]])]),a("button",{class:"btn btn-outline btn-sm",disabled:S.value,onClick:G},[S.value?(n(),o("span",Ze)):r("",!0),t[8]||(t[8]=f("发送测试 ",-1))],8,Ye)])],64)):r("",!0)])):r("",!0)])):r("",!0)]))}}),nt=te(et,[["__scopeId","data-v-6ea4e757"]]);export{nt as default};