51948469c2
- Stop ignoring web/app/index.html and web/app/assets/ - Bundle index-DBKIQT7H.js from current vite build (~101MB assets) Co-authored-by: Cursor <cursoragent@cursor.com>
3 lines
14 KiB
JavaScript
3 lines
14 KiB
JavaScript
import{Ar as e,Er as t,F as n,Hn as ee,Jn as r,Kn as i,L as a,Lt as o,M as s,N as c,P as l,Pt as u,Qn as d,Y as f,Yn as p,Zn as m,br as h,er as te,gr as g,j as _,lr as v,q as ne,qn as y,sr as re,t as b}from"./index-0r0acSeq.js";import{t as ie}from"./useSnackbar-D7YOfKok.js";import{t as ae}from"./VChip-w-M8sdt8.js";import{t as x}from"./VDialog-BT_QEuY9.js";import{a as oe}from"./VSelectionControl-DC3vDaP0.js";import{n as S,t as C}from"./VRow-DVJPuwsC.js";import{t as w}from"./VSpacer-ChFM7SSV.js";import{a as T,i as E,n as D,r as se}from"./validation-Yxuom3Du.js";import{t as ce}from"./VTextarea-DG0_V8OT.js";import{t as le}from"./VSwitch-BMJAc-vh.js";var ue={class:`d-flex align-center mb-3`},de={key:0,class:`text-center mb-3`},fe=[`src`],pe={key:0,class:`d-flex align-center justify-center ga-2 mt-2`},me={class:`text-caption pa-1 bg-grey-lighten-4 rounded`,style:{"user-select":`all`}},he={key:1},ge={key:1,class:`d-flex ga-2 align-center`},_e={class:`d-flex align-center ga-2`},O=te({__name:`SettingsPage`,setup(te){let O=ie(),k=u(),A=h(!1),j=h({system_name:``,system_title:``,cpu_alert_threshold:80,mem_alert_threshold:80,disk_alert_threshold:80,db_pool_size:10,db_max_overflow:20,telegram_bot_token:``,telegram_chat_id:``}),M=h(!1),N=h(!1),P=h(!1),F=h({current:``,new_pw:``,confirm:``,totp_code:``}),I=h(!1),L=h(``),R=h(``),z=h(``),B=h(!1),V=h(!1),H=h(``),U=h(``),W=h(!1),G=h(!1),K=h(``),q=h(!1),J=h(``),Y=h(!1),X=h(!1),Z=h(``),Q=h(!1);async function ve(){A.value=!0;try{let e=await o.get(`/settings/`),t=Array.isArray(e)?e:[],n=Object.keys(j.value);for(let e of t){let t=e.key;if(t&&n.includes(t)){let n=e.value;typeof n==`string`&&/^\d+(\.\d+)?$/.test(n)?j.value[t]=Number(n):j.value[t]=n}}}catch{O(`加载设置失败`,`error`)}finally{A.value=!1}}async function ye(){try{let e=await o.get(`/settings/ip-allowlist`);X.value=e.enabled||!1,Z.value=[...e.manual_ips||[],...e.subscription_ips||[]].join(`
|
|
`)}catch{O(`加载白名单失败`,`error`)}}async function be(){M.value=!0;try{let e=Object.entries(j.value).filter(([e])=>[`system_name`,`system_title`,`cpu_alert_threshold`,`mem_alert_threshold`,`disk_alert_threshold`,`db_pool_size`,`db_max_overflow`,`telegram_bot_token`,`telegram_chat_id`].includes(e));for(let[t,n]of e)await o.put(`/settings/${t}`,{value:n});O(`设置已保存`)}catch(e){O(e instanceof Error?e.message:`保存失败`,`error`)}finally{M.value=!1}}async function xe(){N.value=!0;try{await o.post(`/settings/telegram/test`),O(`测试消息已发送`)}catch(e){O(e.message||`发送失败`,`error`)}finally{N.value=!1}}async function Se(){if(F.value.new_pw!==F.value.confirm){O(`两次密码不一致`,`error`);return}I.value=!0;try{let e={current_password:F.value.current,new_password:F.value.new_pw};k.admin?.totp_enabled&&F.value.totp_code&&(e.totp_code=F.value.totp_code),await o.put(`/auth/password`,e),F.value={current:``,new_pw:``,confirm:``,totp_code:``},O(`密码已修改`)}catch(e){O(e instanceof Error?e.message:`修改失败`,`error`)}finally{I.value=!1}}async function Ce(){try{let e=await o.post(`/auth/totp/setup`);L.value=e.qr_code,R.value=e.secret||``}catch(e){O(e instanceof Error?e.message:`生成失败`,`error`)}}async function we(){B.value=!0;try{await o.post(`/auth/totp/enable`,{code:z.value}),await k.fetchProfile(),L.value=``,z.value=``,O(`TOTP 已启用`)}catch(e){O(e.message||`启用失败`,`error`)}finally{B.value=!1}}function Te(){V.value=!0}async function Ee(){W.value=!0;try{await o.post(`/auth/totp/disable`,{admin_id:k.admin?.id,current_password:H.value,totp_code:U.value}),await k.fetchProfile(),V.value=!1,H.value=``,U.value=``,O(`TOTP 已禁用`)}catch(e){O(e.message||`禁用失败`,`error`)}finally{W.value=!1}}function De(){R.value&&(navigator.clipboard.writeText(R.value),O(`密钥已复制`))}async function Oe(){if(G.value){G.value=!1;return}q.value=!0,J.value=``}async function $(){if(!J.value){O(`请输入密码`,`error`);return}Y.value=!0;try{K.value=(await o.post(`/settings/api-key/reveal`,{current_password:J.value})).api_key,G.value=!0,q.value=!1,J.value=``}catch(e){O(e.message||`验证失败`,`error`)}finally{Y.value=!1}}function ke(){K.value&&(navigator.clipboard.writeText(K.value),O(`已复制到剪贴板`))}async function Ae(){try{await o.post(`/settings/ip-allowlist/toggle`,{enabled:X.value})}catch(e){O(e.message||`操作失败`,`error`)}}async function je(){Q.value=!0;try{let e=Z.value.split(`
|
|
`).map(e=>e.trim()).filter(Boolean);await o.post(`/settings/ip-allowlist`,{ips:e}),O(`白名单已保存`)}catch(e){O(e.message||`保存失败`,`error`)}finally{Q.value=!1}}return re(()=>{ve(),ye(),k.fetchProfile()}),(o,u)=>(v(),y(oe,{fluid:``,class:`pa-6`},{default:g(()=>[d(C,null,{default:g(()=>[d(S,{cols:`12`,lg:`6`},{default:g(()=>[d(s,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[24]||=[m(`mdi-cog`,-1)]]),_:1}),u[25]||=m(` 系统设置 `,-1)]),_:1}),A.value?(v(),y(ne,{key:0,indeterminate:``,color:`primary`})):r(``,!0),d(_),d(c,null,{default:g(()=>[d(b,{modelValue:j.value.system_name,"onUpdate:modelValue":u[0]||=e=>j.value.system_name=e,label:`系统名称`,variant:`outlined`,density:`compact`,class:`mb-3`,rules:[t(T)(`系统名称`)]},null,8,[`modelValue`,`rules`]),d(b,{modelValue:j.value.system_title,"onUpdate:modelValue":u[1]||=e=>j.value.system_title=e,label:`系统标题`,variant:`outlined`,density:`compact`,class:`mb-3`,rules:[t(T)(`系统标题`)]},null,8,[`modelValue`,`rules`]),d(_,{class:`my-4`}),u[26]||=i(`div`,{class:`text-subtitle-2 mb-3`},`告警阈值`,-1),d(C,{dense:``},{default:g(()=>[d(S,{cols:`4`},{default:g(()=>[d(b,{modelValue:j.value.cpu_alert_threshold,"onUpdate:modelValue":u[2]||=e=>j.value.cpu_alert_threshold=e,label:`CPU %`,variant:`outlined`,density:`compact`,type:`number`,rules:[t(T)(`阈值`),t(E)(1,100,`阈值`)]},null,8,[`modelValue`,`rules`])]),_:1}),d(S,{cols:`4`},{default:g(()=>[d(b,{modelValue:j.value.mem_alert_threshold,"onUpdate:modelValue":u[3]||=e=>j.value.mem_alert_threshold=e,label:`内存 %`,variant:`outlined`,density:`compact`,type:`number`,rules:[t(T)(`阈值`),t(E)(1,100,`阈值`)]},null,8,[`modelValue`,`rules`])]),_:1}),d(S,{cols:`4`},{default:g(()=>[d(b,{modelValue:j.value.disk_alert_threshold,"onUpdate:modelValue":u[4]||=e=>j.value.disk_alert_threshold=e,label:`磁盘 %`,variant:`outlined`,density:`compact`,type:`number`,rules:[t(T)(`阈值`),t(E)(1,100,`阈值`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),d(_,{class:`my-4`}),u[27]||=i(`div`,{class:`text-subtitle-2 mb-3`},`连接池`,-1),d(C,{dense:``},{default:g(()=>[d(S,{cols:`6`},{default:g(()=>[d(b,{modelValue:j.value.db_pool_size,"onUpdate:modelValue":u[5]||=e=>j.value.db_pool_size=e,label:`连接池大小`,variant:`outlined`,density:`compact`,type:`number`,rules:[t(T)(),t(D)()]},null,8,[`modelValue`,`rules`])]),_:1}),d(S,{cols:`6`},{default:g(()=>[d(b,{modelValue:j.value.db_max_overflow,"onUpdate:modelValue":u[6]||=e=>j.value.db_max_overflow=e,label:`溢出连接数`,variant:`outlined`,density:`compact`,type:`number`,rules:[t(T)(),t(D)()]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1})]),_:1}),d(n,{class:`px-4 pb-4`},{default:g(()=>[d(w),d(a,{color:`primary`,variant:`flat`,onClick:be,loading:M.value},{default:g(()=>[...u[28]||=[m(`保存设置`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),d(s,{elevation:`0`,border:``,rounded:`lg`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[29]||=[m(`mdi-send`,-1)]]),_:1}),u[30]||=m(` Telegram 推送 `,-1)]),_:1}),d(_),d(c,null,{default:g(()=>[d(b,{modelValue:j.value.telegram_bot_token,"onUpdate:modelValue":u[7]||=e=>j.value.telegram_bot_token=e,label:`Bot Token`,variant:`outlined`,density:`compact`,class:`mb-3`,type:P.value?`text`:`password`,"append-inner-icon":P.value?`mdi-eye`:`mdi-eye-off`,"onClick:appendInner":u[8]||=e=>P.value=!P.value},null,8,[`modelValue`,`type`,`append-inner-icon`]),d(b,{modelValue:j.value.telegram_chat_id,"onUpdate:modelValue":u[9]||=e=>j.value.telegram_chat_id=e,label:`Chat ID`,variant:`outlined`,density:`compact`,class:`mb-3`},null,8,[`modelValue`]),d(a,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-message-text`,onClick:xe,loading:N.value},{default:g(()=>[...u[31]||=[m(`发送测试消息`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1}),d(S,{cols:`12`,lg:`6`},{default:g(()=>[d(s,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[32]||=[m(`mdi-lock`,-1)]]),_:1}),u[33]||=m(` 修改密码 `,-1)]),_:1}),d(_),d(c,null,{default:g(()=>[d(b,{modelValue:F.value.current,"onUpdate:modelValue":u[10]||=e=>F.value.current=e,label:`当前密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-3`,rules:[t(T)(`密码`)]},null,8,[`modelValue`,`rules`]),d(b,{modelValue:F.value.new_pw,"onUpdate:modelValue":u[11]||=e=>F.value.new_pw=e,label:`新密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-3`,rules:[t(T)(`密码`)]},null,8,[`modelValue`,`rules`]),d(b,{modelValue:F.value.confirm,"onUpdate:modelValue":u[12]||=e=>F.value.confirm=e,label:`确认新密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-3`,rules:[t(T)(`确认密码`),t(se)(()=>F.value.new_pw)]},null,8,[`modelValue`,`rules`]),t(k).admin?.totp_enabled?(v(),y(b,{key:0,modelValue:F.value.totp_code,"onUpdate:modelValue":u[13]||=e=>F.value.totp_code=e,label:`TOTP 验证码`,variant:`outlined`,density:`compact`,type:`text`,inputmode:`numeric`,maxlength:`6`,class:`mb-3`,rules:t(k).admin?.totp_enabled?[t(T)(`验证码`)]:[]},null,8,[`modelValue`,`rules`])):r(``,!0)]),_:1}),d(n,{class:`px-4 pb-4`},{default:g(()=>[d(w),d(a,{color:`primary`,variant:`flat`,onClick:Se,loading:I.value},{default:g(()=>[...u[34]||=[m(`修改密码`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),d(s,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[35]||=[m(`mdi-shield-key`,-1)]]),_:1}),u[36]||=m(` 双因素认证 (TOTP) `,-1)]),_:1}),d(_),d(c,null,{default:g(()=>[i(`div`,ue,[u[37]||=i(`span`,{class:`text-body-2`},`状态:`,-1),d(ae,{color:t(k).admin?.totp_enabled?`success`:`grey`,size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:g(()=>[m(e(t(k).admin?.totp_enabled?`已启用`:`未启用`),1)]),_:1},8,[`color`])]),L.value?(v(),p(`div`,de,[i(`img`,{src:L.value,alt:`TOTP QR`,style:{"max-width":`200px`}},null,8,fe),R.value?(v(),p(`div`,pe,[i(`code`,me,e(R.value),1),d(a,{size:`x-small`,variant:`text`,icon:`mdi-content-copy`,onClick:De})])):r(``,!0),u[38]||=i(`div`,{class:`text-caption text-medium-emphasis mt-1`},`用认证器 App 扫描二维码或手动输入密钥`,-1)])):r(``,!0),t(k).admin?.totp_enabled?(v(),y(a,{key:2,size:`small`,variant:`tonal`,color:`error`,"prepend-icon":`mdi-shield-off`,onClick:Te},{default:g(()=>[...u[41]||=[m(`禁用 TOTP`,-1)]]),_:1})):(v(),p(`div`,he,[L.value?(v(),p(`div`,ge,[d(b,{modelValue:z.value,"onUpdate:modelValue":u[14]||=e=>z.value=e,label:`验证码`,variant:`outlined`,density:`compact`,style:{"max-width":`160px`}},null,8,[`modelValue`]),d(a,{color:`primary`,variant:`flat`,size:`small`,onClick:we,loading:B.value},{default:g(()=>[...u[40]||=[m(`启用`,-1)]]),_:1},8,[`loading`])])):(v(),y(a,{key:0,size:`small`,variant:`tonal`,"prepend-icon":`mdi-qrcode`,onClick:Ce},{default:g(()=>[...u[39]||=[m(`生成二维码`,-1)]]),_:1}))]))]),_:1})]),_:1}),d(s,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[42]||=[m(`mdi-key`,-1)]]),_:1}),u[43]||=m(` API Key `,-1)]),_:1}),d(_),d(c,null,{default:g(()=>[i(`div`,_e,[d(b,{"model-value":G.value?K.value:`••••••••`,label:`API Key`,variant:`outlined`,density:`compact`,readonly:``,type:G.value?`text`:`password`,style:{"max-width":`320px`}},null,8,[`model-value`,`type`]),d(a,{variant:`text`,size:`small`,icon:G.value?`mdi-eye-off`:`mdi-eye`,onClick:Oe},null,8,[`icon`]),d(a,{variant:`text`,size:`small`,icon:`mdi-content-copy`,onClick:ke})])]),_:1})]),_:1}),d(s,{elevation:`0`,border:``,rounded:`lg`},{default:g(()=>[d(l,{class:`d-flex align-center`},{default:g(()=>[d(f,{class:`mr-2`},{default:g(()=>[...u[44]||=[m(`mdi-ip-network`,-1)]]),_:1}),u[45]||=m(` IP 白名单 `,-1)]),_:1}),d(_),d(c,null,{default:g(()=>[d(le,{modelValue:X.value,"onUpdate:modelValue":[u[15]||=e=>X.value=e,Ae],label:`启用 IP 白名单`,color:`primary`,density:`compact`,"hide-details":``,class:`mb-3`},null,8,[`modelValue`]),d(ce,{modelValue:Z.value,"onUpdate:modelValue":u[16]||=e=>Z.value=e,label:`IP 列表(每行一个)`,variant:`outlined`,density:`compact`,rows:`4`,class:`mb-2`},null,8,[`modelValue`]),d(a,{size:`small`,variant:`tonal`,onClick:je,loading:Q.value},{default:g(()=>[...u[46]||=[m(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1})]),_:1}),d(x,{modelValue:q.value,"onUpdate:modelValue":u[19]||=e=>q.value=e,"max-width":`400`},{default:g(()=>[d(s,{border:``},{default:g(()=>[d(l,null,{default:g(()=>[...u[47]||=[m(`验证身份`,-1)]]),_:1}),d(c,null,{default:g(()=>[u[48]||=i(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},`请输入当前密码以查看 API Key`,-1),d(b,{modelValue:J.value,"onUpdate:modelValue":u[17]||=e=>J.value=e,label:`当前密码`,variant:`outlined`,density:`compact`,type:`password`,autofocus:``,onKeydown:ee($,[`enter`]),rules:[t(T)(`密码`)]},null,8,[`modelValue`,`rules`])]),_:1}),d(n,null,{default:g(()=>[d(w),d(a,{variant:`text`,onClick:u[18]||=e=>q.value=!1},{default:g(()=>[...u[49]||=[m(`取消`,-1)]]),_:1}),d(a,{color:`primary`,variant:`flat`,onClick:$,loading:Y.value},{default:g(()=>[...u[50]||=[m(`确认`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),d(x,{modelValue:V.value,"onUpdate:modelValue":u[23]||=e=>V.value=e,"max-width":`400`},{default:g(()=>[d(s,{border:``},{default:g(()=>[d(l,null,{default:g(()=>[...u[51]||=[m(`禁用 TOTP`,-1)]]),_:1}),d(c,null,{default:g(()=>[d(b,{modelValue:H.value,"onUpdate:modelValue":u[20]||=e=>H.value=e,label:`当前密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-2`,rules:[t(T)()]},null,8,[`modelValue`,`rules`]),d(b,{modelValue:U.value,"onUpdate:modelValue":u[21]||=e=>U.value=e,label:`验证码`,variant:`outlined`,density:`compact`,rules:[t(T)()]},null,8,[`modelValue`,`rules`])]),_:1}),d(n,null,{default:g(()=>[d(w),d(a,{variant:`text`,onClick:u[22]||=e=>V.value=!1},{default:g(()=>[...u[52]||=[m(`取消`,-1)]]),_:1}),d(a,{color:`error`,variant:`flat`,onClick:Ee,loading:W.value},{default:g(()=>[...u[53]||=[m(`禁用`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{O as default}; |