dfb0ea2d8f
修复 ScriptsPage 执行契约(script_id/command、历史过滤、长任务/凭据)及 SchedulesPage 缺失能力(target_path、next_run、push/script、cron/once、sync_mode);后端补迁移与 schedule_runner 传参。
1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
import{t as e}from"./VDataTable-CynA26OW.js";import{F as t,L as n,Lr as r,M as ee,N as i,P as a,Sr as te,Vr as o,Zn as ne,ar as s,er as c,et as l,gr as u,jr as d,mr as f,nr as p,or as m,rr as re,sr as h,t as g,tr as _,wr as v,z as y,zt as b}from"./index-BihgjXCy.js";import{o as x,t as ie}from"./VContainer-V_R05OUP.js";import{t as ae}from"./VChip-FKNgTWw3.js";import{t as S}from"./VDataTableServer-Pl72x6lf.js";import{t as C}from"./VSpacer-2YW4-MQQ.js";import{t as w}from"./apiError-BFaYYBmC.js";import{i as T}from"./validation-DMwOxx4a.js";import{t as E}from"./VDialog-C6lmIorM.js";import{t as D}from"./VTextarea-BpaXILgJ.js";var oe={class:`text-caption text-medium-emphasis`},O=h({__name:`CredentialsPage`,setup(h){let O=x();function se(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(`zh-CN`,{hour12:!1})}let k=d(!1),A=d(`passwords`),j=d(null),M=d(1),N=d(0),P=d(20),F=d([]),I=d(!1),L=d({name:``,username:`root`,password:``}),ce=[{title:`预设名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`创建时间`,key:`created_at`,width:180},{title:`操作`,key:`actions`,width:150,align:`end`}],R=d([]),z=d(!1),B=d({name:``,username:`root`,public_key:``,private_key:``}),V=[{title:`名称`,key:`name`},{title:`用户名`,key:`username`,width:120},{title:`私钥`,key:`private_key_set`,width:120},{title:`操作`,key:`actions`,width:150,align:`end`}],H=d([]),U=d(!1),W=d({name:``,host:``,port:3306,username:``,password:``,database:``}),le=[{title:`名称`,key:`name`},{title:`主机`,key:`host`},{title:`端口`,key:`port`,width:80},{title:`用户名`,key:`username`},{title:`数据库`,key:`database`},{title:`操作`,key:`actions`,width:150,align:`end`}],G=d(!1),K=d(``),q=d(null);async function J(){k.value=!0;try{let e=await b.getList(`/presets/`);F.value=e.items,N.value=e.total}catch(e){F.value=[],O(w(e,`加载密码预设失败`),`error`)}finally{k.value=!1}}async function Y(){k.value=!0;try{let e=await b.getList(`/ssh-key-presets/`,{page:M.value,per_page:P.value});R.value=e.items,N.value=e.total}catch(e){R.value=[],O(w(e,`加载 SSH 密钥失败`),`error`)}finally{k.value=!1}}async function X(){k.value=!0;try{let e=await b.getList(`/scripts/credentials`,{page:M.value,per_page:P.value});H.value=e.items,N.value=e.total}catch(e){H.value=[],O(w(e,`加载数据库凭据失败`),`error`)}finally{k.value=!1}}function Z(){switch(A.value){case`passwords`:J();break;case`sshkeys`:Y();break;case`db`:X();break}}te(A,()=>{M.value=1,Z()});function ue(e){j.value=e.id,L.value={name:e.name,username:e.username||`root`,password:``},I.value=!0}async function de(){let e=L.value.name.trim(),t=L.value.password;if(!e){O(`请填写预设名称`,`error`);return}if(!j.value&&!t){O(`请填写 SSH 密码`,`error`);return}try{let n=L.value.username.trim()||`root`;if(j.value){let r={name:e,username:n};t&&(r.encrypted_pw=t),await b.put(`/presets/${j.value}`,r)}else await b.post(`/presets/`,{name:e,username:n,encrypted_pw:t});I.value=!1,J(),O(`保存成功`)}catch(e){O(e instanceof Error?e.message:`保存失败`,`error`)}}function Q(e){j.value=e.id,B.value={name:e.name,username:e.username||`root`,public_key:e.public_key||``,private_key:``},z.value=!0}async function fe(){try{j.value?await b.put(`/ssh-key-presets/${j.value}`,B.value):await b.post(`/ssh-key-presets/`,B.value),z.value=!1,Y(),O(`保存成功`)}catch(e){O(e.message||`保存失败`,`error`)}}function pe(e){j.value=e.id,W.value={name:e.name,host:e.host||``,port:e.port||3306,username:e.username||``,password:``,database:e.database||``},U.value=!0}async function me(){try{j.value?await b.put(`/scripts/credentials/${j.value}`,W.value):await b.post(`/scripts/credentials`,W.value),U.value=!1,X(),O(`保存成功`)}catch(e){O(e.message||`保存失败`,`error`)}}function he(){j.value=null,A.value===`passwords`?(L.value={name:``,username:`root`,password:``},I.value=!0):A.value===`sshkeys`?(B.value={name:``,username:`root`,public_key:``,private_key:``},z.value=!0):(W.value={name:``,host:``,port:3306,username:``,password:``,database:``},U.value=!0)}function $(e,t){K.value=e,q.value=t.id,G.value=!0}async function ge(){try{K.value===`password`?await b.delete(`/presets/${q.value}`):K.value===`sshkey`?await b.delete(`/ssh-key-presets/${q.value}`):await b.delete(`/scripts/credentials/${q.value}`),G.value=!1,Z(),O(`已删除`)}catch(e){O(e.message||`删除失败`,`error`)}}return f(()=>{Z()}),(te,d)=>(u(),_(ie,{fluid:``,class:`pa-6`},{default:v(()=>[m(i,{elevation:`0`,border:``,rounded:`lg`},{default:v(()=>[m(t,{class:`d-flex align-center`},{default:v(()=>[d[30]||=s(` 凭据管理 `,-1),m(C),m(l,{modelValue:A.value,"onUpdate:modelValue":d[0]||=e=>A.value=e,mandatory:``,density:`compact`,variant:`outlined`,class:`mr-3`},{default:v(()=>[m(y,{size:`small`,value:`passwords`},{default:v(()=>[...d[26]||=[s(`密码预设`,-1)]]),_:1}),m(y,{size:`small`,value:`sshkeys`},{default:v(()=>[...d[27]||=[s(`SSH 密钥`,-1)]]),_:1}),m(y,{size:`small`,value:`db`},{default:v(()=>[...d[28]||=[s(`数据库凭据`,-1)]]),_:1})]),_:1},8,[`modelValue`]),m(y,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:he},{default:v(()=>[...d[29]||=[s(`添加`,-1)]]),_:1})]),_:1}),m(ee),A.value===`passwords`?(u(),re(ne,{key:0},[m(a,{class:`text-body-2 text-medium-emphasis pt-0 pb-2`},{default:v(()=>[...d[31]||=[s(` 保存常用 SSH 账号+密码模板;快速添加服务器时将按顺序轮询所有预设尝试登录。 `,-1)]]),_:1}),m(e,{items:F.value,headers:ce,loading:k.value,hover:``,density:`comfortable`,"items-per-page":20},{"item.created_at":v(({item:e})=>[c(`span`,oe,o(se(e.created_at)),1)]),"item.actions":v(({item:e})=>[m(y,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>ue(e)},{default:v(()=>[...d[32]||=[s(`编辑`,-1)]]),_:1},8,[`onClick`]),m(y,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>$(`password`,e)},{default:v(()=>[...d[33]||=[s(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":v(()=>[...d[34]||=[c(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无密码预设`,-1)]]),_:1},8,[`items`,`loading`])],64)):p(``,!0),A.value===`sshkeys`?(u(),_(S,{key:1,items:R.value,headers:V,"items-length":N.value,loading:k.value,page:M.value,"items-per-page":P.value,hover:``,density:`comfortable`,"onUpdate:page":d[1]||=e=>{M.value=e,Y()},"onUpdate:itemsPerPage":d[2]||=e=>{P.value=e,M.value=1,Y()}},{"item.private_key_set":v(({item:e})=>[m(ae,{color:e.private_key_set?`success`:`grey`,size:`small`,variant:`tonal`,label:``},{default:v(()=>[s(o(e.private_key_set?`已设置`:`未设置`),1)]),_:2},1032,[`color`])]),"item.actions":v(({item:e})=>[m(y,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Q(e)},{default:v(()=>[...d[35]||=[s(`编辑`,-1)]]),_:1},8,[`onClick`]),m(y,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>$(`sshkey`,e)},{default:v(()=>[...d[36]||=[s(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":v(()=>[...d[37]||=[c(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无凭据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`])):p(``,!0),A.value===`db`?(u(),_(S,{key:2,items:H.value,headers:le,"items-length":N.value,loading:k.value,page:M.value,"items-per-page":P.value,hover:``,density:`comfortable`,"onUpdate:page":d[3]||=e=>{M.value=e,X()},"onUpdate:itemsPerPage":d[4]||=e=>{P.value=e,M.value=1,X()}},{"item.actions":v(({item:e})=>[m(y,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>pe(e)},{default:v(()=>[...d[38]||=[s(`编辑`,-1)]]),_:1},8,[`onClick`]),m(y,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>$(`db`,e)},{default:v(()=>[...d[39]||=[s(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":v(()=>[...d[40]||=[c(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无凭据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`])):p(``,!0)]),_:1}),m(E,{modelValue:I.value,"onUpdate:modelValue":d[9]||=e=>I.value=e,"max-width":`500`},{default:v(()=>[m(i,{border:``},{default:v(()=>[m(t,null,{default:v(()=>[s(o(j.value?`编辑密码预设`:`新建密码预设`),1)]),_:1}),m(a,null,{default:v(()=>[m(g,{modelValue:L.value.name,"onUpdate:modelValue":d[5]||=e=>L.value.name=e,label:`预设名称`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`如:生产环境 root 密码`,rules:[r(T)(`预设名称`)]},null,8,[`modelValue`,`rules`]),m(g,{modelValue:L.value.username,"onUpdate:modelValue":d[6]||=e=>L.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`,rules:[r(T)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`]),m(g,{modelValue:L.value.password,"onUpdate:modelValue":d[7]||=e=>L.value.password=e,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:j.value?`留空表示不修改`:`必填`,rules:j.value?[]:[r(T)(`SSH 密码`)]},null,8,[`modelValue`,`placeholder`,`rules`])]),_:1}),m(n,null,{default:v(()=>[m(C),m(y,{variant:`text`,onClick:d[8]||=e=>I.value=!1},{default:v(()=>[...d[41]||=[s(`取消`,-1)]]),_:1}),m(y,{color:`primary`,variant:`flat`,onClick:de},{default:v(()=>[...d[42]||=[s(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),m(E,{modelValue:z.value,"onUpdate:modelValue":d[15]||=e=>z.value=e,"max-width":`500`},{default:v(()=>[m(i,{border:``},{default:v(()=>[m(t,null,{default:v(()=>[s(o(j.value?`编辑 SSH 密钥`:`新建 SSH 密钥`),1)]),_:1}),m(a,null,{default:v(()=>[m(g,{modelValue:B.value.name,"onUpdate:modelValue":d[10]||=e=>B.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:B.value.username,"onUpdate:modelValue":d[11]||=e=>B.value.username=e,label:`SSH 用户名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`root`},null,8,[`modelValue`]),m(D,{modelValue:B.value.public_key,"onUpdate:modelValue":d[12]||=e=>B.value.public_key=e,label:`公钥`,variant:`outlined`,density:`compact`,rows:`3`,class:`mb-2`},null,8,[`modelValue`]),m(D,{modelValue:B.value.private_key,"onUpdate:modelValue":d[13]||=e=>B.value.private_key=e,label:`私钥`,variant:`outlined`,density:`compact`,rows:`5`},null,8,[`modelValue`])]),_:1}),m(n,null,{default:v(()=>[m(C),m(y,{variant:`text`,onClick:d[14]||=e=>z.value=!1},{default:v(()=>[...d[43]||=[s(`取消`,-1)]]),_:1}),m(y,{color:`primary`,variant:`flat`,onClick:fe},{default:v(()=>[...d[44]||=[s(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),m(E,{modelValue:U.value,"onUpdate:modelValue":d[23]||=e=>U.value=e,"max-width":`500`},{default:v(()=>[m(i,{border:``},{default:v(()=>[m(t,null,{default:v(()=>[s(o(j.value?`编辑数据库凭据`:`新建数据库凭据`),1)]),_:1}),m(a,null,{default:v(()=>[m(g,{modelValue:W.value.name,"onUpdate:modelValue":d[16]||=e=>W.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:W.value.host,"onUpdate:modelValue":d[17]||=e=>W.value.host=e,label:`主机`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:W.value.port,"onUpdate:modelValue":d[18]||=e=>W.value.port=e,label:`端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:W.value.username,"onUpdate:modelValue":d[19]||=e=>W.value.username=e,label:`用户名`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:W.value.password,"onUpdate:modelValue":d[20]||=e=>W.value.password=e,label:`密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-2`},null,8,[`modelValue`]),m(g,{modelValue:W.value.database,"onUpdate:modelValue":d[21]||=e=>W.value.database=e,label:`数据库`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),m(n,null,{default:v(()=>[m(C),m(y,{variant:`text`,onClick:d[22]||=e=>U.value=!1},{default:v(()=>[...d[45]||=[s(`取消`,-1)]]),_:1}),m(y,{color:`primary`,variant:`flat`,onClick:me},{default:v(()=>[...d[46]||=[s(`保存`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),m(E,{modelValue:G.value,"onUpdate:modelValue":d[25]||=e=>G.value=e,"max-width":`400`},{default:v(()=>[m(i,{border:``},{default:v(()=>[m(t,null,{default:v(()=>[...d[47]||=[s(`确认删除`,-1)]]),_:1}),m(a,null,{default:v(()=>[...d[48]||=[s(`确定要删除此凭据吗?`,-1)]]),_:1}),m(n,null,{default:v(()=>[m(C),m(y,{variant:`text`,onClick:d[24]||=e=>G.value=!1},{default:v(()=>[...d[49]||=[s(`取消`,-1)]]),_:1}),m(y,{color:`error`,variant:`flat`,onClick:ge},{default:v(()=>[...d[50]||=[s(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{O as default}; |