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>
1 line
33 KiB
JavaScript
1 line
33 KiB
JavaScript
import{a as e}from"./VDataTable-C3x4dm8T.js";import{$n as t,Dr as n,Er as r,F as i,Fr as a,Gn as o,Jn as s,Kn as c,L as l,Lr as u,Lt as d,M as f,N as p,Nr as m,Nt as h,O as g,P as _,Pn as v,Qn as y,Qt as b,Sn as x,Xn as S,Y as C,Yn as w,Zn as T,_r as ee,br as E,dn as D,dr as te,en as O,er as k,fr as A,h as ne,j,mr as M,o as N,or as P,q as F,rr as I,s as re,sn as L,t as R,tn as z,tr as B,ur as ie,v as ae,w as V}from"./index-D6kmN0iw.js";import{a as oe,i as se,n as ce,r as le,t as H}from"./VSelectionControl-CB3RXt-d.js";import{n as U,t as W}from"./VRow-BDVYLJeC.js";import{t as G}from"./VSpacer-D_GqDOug.js";import{t as K}from"./useSnackbar-D7YOfKok.js";import{t as q}from"./VChip-BtzC63Ui.js";import{t as J}from"./VDialog-LUpcFvdq.js";import{t as Y}from"./VSelect-6PVoJJ_P.js";import{t as ue}from"./VCheckbox-XbESZLFr.js";import{t as de}from"./VDataTableServer-ZeDQGEA6.js";import{t as X}from"./VAlert-iRqYZk6X.js";import{t as fe}from"./wsUrl-CqmqkTTE.js";var pe=I({__name:`PushDiagnoseDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},result:{},targetName:{}},emits:[`update:modelValue`],setup(e){return(t,n)=>(A(),S(J,{"model-value":e.modelValue,"max-width":`520`,"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:modelValue`,e)},{default:E(()=>[B(f,{border:``},{default:E(()=>[B(_,null,{default:E(()=>[k(`推送失败诊断 — `+u(e.targetName),1)]),_:1}),B(p,null,{default:E(()=>[e.loading?(A(),S(F,{key:0,indeterminate:``,class:`mb-3`})):e.result?(A(),y(c,{key:1},[B(V,{density:`compact`},{default:E(()=>[B(g,{title:`SSH 连接`},{append:E(()=>[B(C,{color:e.result.ssh_ok?`success`:`error`},{default:E(()=>[k(u(e.result.ssh_ok?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.disk_avail?(A(),S(g,{key:0,title:`磁盘可用: ${e.result.disk_avail}`},null,8,[`title`])):T(``,!0),e.result.disk_used_pct==null?T(``,!0):(A(),S(g,{key:1,title:`磁盘使用率: ${e.result.disk_used_pct}%`},null,8,[`title`])),B(g,{title:`目标路径存在`},{append:E(()=>[B(C,{color:e.result.path_exists?`success`:`error`},{default:E(()=>[k(u(e.result.path_exists?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1}),e.result.path_perms?(A(),S(g,{key:2,subtitle:e.result.path_perms,title:`权限`},null,8,[`subtitle`])):T(``,!0),B(g,{title:`目标路径可写`},{append:E(()=>[B(C,{color:e.result.path_writable?`success`:`error`},{default:E(()=>[k(u(e.result.path_writable?`mdi-check`:`mdi-close`),1)]),_:1},8,[`color`])]),_:1})]),_:1}),(A(!0),y(c,null,M(e.result.errors,(e,t)=>(A(),S(X,{key:t,type:`error`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:E(()=>[k(u(e),1)]),_:2},1024))),128))],64)):T(``,!0)]),_:1}),B(i,null,{default:E(()=>[B(G),B(l,{variant:`text`,onClick:n[0]||=e=>t.$emit(`update:modelValue`,!1)},{default:E(()=>[...n[2]||=[k(`关闭`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function Z(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function me(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(`zh-CN`,{hour12:!1})}function he(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function ge(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`cancelled`:return`grey`;case`running`:return`info`;default:return`warning`}}function _e(e){switch(e){case`incremental`:return`增量`;case`full`:return`全量`;case`checksum`:return`校验和`;case`overwrite`:return`覆盖`;default:return e||`—`}}function ve(e){return e===`成功`?`success`:e===`失败`?`error`:e===`已取消`?`grey`:`warning`}function ye(e){return e?`success`:`error`}var be={class:`text-caption`},xe={class:`text-caption text-medium-emphasis`},Se=[`title`],Ce={key:1,class:`text-caption text-medium-emphasis`},we=I({__name:`PushHistoryTable`,props:{items:{},headers:{},total:{},loading:{type:Boolean},page:{},statusFilter:{},syncModeFilter:{},serverFilter:{},statusOptions:{},syncModeOptions:{},serverOptions:{},reconciling:{type:Boolean}},emits:[`update:page`,`update:statusFilter`,`update:syncModeFilter`,`update:serverFilter`,`filter-change`,`page-change`,`reconcile`,`diagnose`],setup(e){return(t,n)=>(A(),S(f,{elevation:`0`,border:``,rounded:`lg`},{default:E(()=>[B(_,{class:`d-flex flex-wrap align-center ga-2`},{default:E(()=>[n[6]||=w(`span`,null,`推送历史`,-1),B(G),B(Y,{"model-value":e.statusFilter,items:e.statusOptions,"item-title":`label`,"item-value":`value`,label:`状态`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":n[0]||=e=>{t.$emit(`update:statusFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(Y,{"model-value":e.syncModeFilter,items:e.syncModeOptions,"item-title":`label`,"item-value":`value`,label:`模式`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`120px`},"onUpdate:modelValue":n[1]||=e=>{t.$emit(`update:syncModeFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(Y,{"model-value":e.serverFilter,items:e.serverOptions,"item-title":`title`,"item-value":`value`,label:`服务器`,variant:`outlined`,density:`compact`,"hide-details":``,clearable:``,style:{"max-width":`180px`},"onUpdate:modelValue":n[2]||=e=>{t.$emit(`update:serverFilter`,e),t.$emit(`filter-change`)}},null,8,[`model-value`,`items`]),B(l,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-wrench`,loading:e.reconciling,onClick:n[3]||=e=>t.$emit(`reconcile`)},{default:E(()=>[...n[5]||=[k(` 修复卡住记录 `,-1)]]),_:1},8,[`loading`])]),_:1}),B(de,{items:e.items,headers:e.headers,"items-length":e.total,loading:e.loading,page:e.page,"items-per-page":15,hover:``,density:`comfortable`,"onUpdate:page":n[4]||=e=>{t.$emit(`update:page`,e),t.$emit(`page-change`)}},{"item.status":E(({item:e})=>[B(q,{color:m(ge)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:E(()=>[k(u(m(he)(e.status)),1)]),_:2},1032,[`color`])]),"item.sync_mode":E(({item:e})=>[w(`span`,be,u(m(_e)(e.sync_mode)),1)]),"item.started_at":E(({item:e})=>[w(`span`,xe,u(m(me)(e.started_at)),1)]),"item.error_message":E(({item:e})=>[e.error_message?(A(),y(`span`,{key:0,class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`200px`},title:e.error_message},u(e.error_message),9,Se)):(A(),y(`span`,Ce,`—`))]),"item.actions":E(({item:e})=>[e.status===`failed`?(A(),S(l,{key:0,size:`x-small`,variant:`tonal`,"prepend-icon":`mdi-stethoscope`,onClick:n=>t.$emit(`diagnose`,e)},{default:E(()=>[...n[7]||=[k(` 诊断 `,-1)]]),_:1},8,[`onClick`])):T(``,!0)]),"no-data":E(()=>[...n[8]||=[w(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1}))}}),Te={class:`text-caption text-medium-emphasis`},Ee={key:2,class:`mb-2 text-body-2`},De={key:0,class:`text-error text-caption`},Oe={key:1,class:`text-warning text-caption`},ke={key:2,class:`text-caption text-medium-emphasis`},Ae=I({__name:`PushPreviewDialog`,props:{modelValue:{type:Boolean},loading:{type:Boolean},results:{},selectedCount:{},previewDone:{},previewTotal:{},largeBatch:{type:Boolean},warnThreshold:{},errorCount:{},syncMode:{}},emits:[`update:modelValue`,`confirm-push`],setup(t){return(n,r)=>(A(),S(J,{"model-value":t.modelValue,"max-width":`800`,"onUpdate:modelValue":r[2]||=e=>n.$emit(`update:modelValue`,e)},{default:E(()=>[B(f,{border:``},{default:E(()=>[B(_,{class:`d-flex align-center`},{default:E(()=>[r[3]||=k(` 推送预览 `,-1),B(G),w(`span`,Te,[t.loading?(A(),y(c,{key:0},[k(u(t.previewDone)+` / `+u(t.previewTotal)+` 台`,1)],64)):(A(),y(c,{key:1},[k(u(t.results.length)+` 台`,1)],64))])]),_:1}),B(p,null,{default:E(()=>[t.loading?(A(),S(F,{key:0,"model-value":t.previewTotal?Math.round(t.previewDone/t.previewTotal*100):0,class:`mb-3`},null,8,[`model-value`])):T(``,!0),t.largeBatch&&!t.loading?(A(),S(X,{key:1,type:`info`,density:`compact`,variant:`tonal`,class:`mb-2`},{default:E(()=>[k(` 已预览 `+u(t.results.length)+` 台服务器(超过 `+u(t.warnThreshold)+` 台时推送耗时可能较长) `,1)]),_:1})):T(``,!0),t.loading?T(``,!0):(A(),y(`div`,Ee,[r[4]||=k(` 将推送到 `,-1),w(`strong`,null,u(t.selectedCount),1),r[5]||=k(` 台服务器 `,-1)])),t.results.length?(A(),S(e,{key:3,density:`compact`},{default:E(()=>[r[6]||=w(`thead`,null,[w(`tr`,null,[w(`th`,null,`服务器`),w(`th`,null,`文件数`),w(`th`,null,`预计传输`),w(`th`,null,`大小`),w(`th`,null,`备注`)])],-1),w(`tbody`,null,[(A(!0),y(c,null,M(t.results,e=>(A(),y(`tr`,{key:e.server_id},[w(`td`,null,u(e.server_name),1),w(`td`,null,u(e.stats?.files_total??`—`),1),w(`td`,null,u(e.stats?.files_transferred??`—`),1),w(`td`,null,u(e.stats?m(Z)(e.stats.transfer_size_bytes??0):`—`),1),w(`td`,null,[e.error?(A(),y(`span`,De,u(e.error),1)):t.syncMode===`full`&&(e.stats?.files_deleted??0)>0?(A(),y(`span`,Oe,`将删除 `+u(e.stats?.files_deleted)+` 个远端文件`,1)):(A(),y(`span`,ke,`—`))])]))),128))])]),_:1})):T(``,!0),t.errorCount>0&&!t.loading?(A(),S(X,{key:4,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:E(()=>[k(u(t.errorCount)+` 台预览失败,推送时这些服务器可能仍会失败 `,1)]),_:1})):T(``,!0)]),_:1}),B(i,null,{default:E(()=>[B(G),B(l,{variant:`text`,onClick:r[0]||=e=>n.$emit(`update:modelValue`,!1)},{default:E(()=>[...r[7]||=[k(`关闭`,-1)]]),_:1}),B(l,{color:`primary`,variant:`flat`,disabled:t.loading,onClick:r[1]||=e=>n.$emit(`confirm-push`)},{default:E(()=>[...r[8]||=[k(`确认推送`,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),je={key:1,class:`text-caption text-medium-emphasis mb-2`},Me=I({__name:`PushProgressList`,props:{items:{},batchId:{},pushing:{type:Boolean},cancelling:{type:Boolean},doneCount:{},totalProgress:{}},emits:[`cancel`],setup(e){return(n,r)=>e.items.length>0?(A(),S(f,{key:0,class:`mb-4`,elevation:`0`,border:``,rounded:`lg`},{default:E(()=>[B(_,{class:`d-flex align-center text-subtitle-1`},{default:E(()=>[r[2]||=k(` 推送进度 `,-1),B(G),e.batchId&&e.items.some(e=>e.status===`running`||e.status===`pending`)&&e.pushing?(A(),S(l,{key:0,size:`small`,variant:`tonal`,color:`error`,class:`mr-2`,loading:e.cancelling,onClick:r[0]||=e=>n.$emit(`cancel`)},{default:E(()=>[...r[1]||=[k(` 取消推送 `,-1)]]),_:1},8,[`loading`])):T(``,!0),B(q,{size:`small`,variant:`tonal`,color:`primary`},{default:E(()=>[k(u(e.items.filter(e=>e.status===`success`).length)+`/`+u(e.items.length)+` 完成 `,1)]),_:1})]),_:1}),B(j),B(p,null,{default:E(()=>[e.pushing||e.totalProgress>0?(A(),S(F,{key:0,"model-value":e.totalProgress,color:`primary`,height:`8`,rounded:``,class:`mb-3`},null,8,[`model-value`])):T(``,!0),e.items.length?(A(),y(`div`,je,u(e.doneCount)+` / `+u(e.items.length)+` 台已结束 `,1)):T(``,!0),B(V,{density:`compact`},{default:E(()=>[(A(!0),y(c,null,M(e.items,e=>(A(),S(g,{key:e.id,title:e.name},t({append:E(()=>[e.status===`pending`?(A(),S(C,{key:0,color:`grey`},{default:E(()=>[...r[3]||=[k(`mdi-clock-outline`,-1)]]),_:1})):e.status===`running`?(A(),S(C,{key:1,color:`blue`,class:`mdi-spin`},{default:E(()=>[...r[4]||=[k(`mdi-loading`,-1)]]),_:1})):e.status===`success`?(A(),S(C,{key:2,color:`green`},{default:E(()=>[...r[5]||=[k(`mdi-check-circle`,-1)]]),_:1})):e.status===`cancelled`?(A(),S(C,{key:3,color:`grey`},{default:E(()=>[...r[6]||=[k(`mdi-cancel`,-1)]]),_:1})):(A(),S(C,{key:4,color:`red`},{default:E(()=>[...r[7]||=[k(`mdi-alert-circle`,-1)]]),_:1}))]),_:2},[e.detail?{name:`subtitle`,fn:E(()=>[w(`span`,{class:a(e.status===`failed`?`text-error`:`text-medium-emphasis`)},u(e.detail),3)]),key:`0`}:void 0]),1032,[`title`]))),128))]),_:1})]),_:1})]),_:1})):T(``,!0)}}),Ne={key:0,class:`text-center text-medium-emphasis py-6`},Pe={class:`d-flex align-center px-2 mb-2`},Fe={class:`text-caption text-medium-emphasis ml-1`},Ie={class:`d-flex align-center ga-2`},Le={class:`text-body-2 font-weight-medium text-truncate`},Re={class:`text-caption text-medium-emphasis text-truncate`},ze={key:0,class:`text-caption mt-1`},Be=I({__name:`PushServerGrid`,props:{selectAll:{type:Boolean},serverSearch:{},serversLoading:{type:Boolean},serversByCategory:{},selectedIds:{},pushStatus:{},isCategoryAllSelected:{type:Function}},emits:[`update:serverSearch`,`toggle-all`,`refresh`,`toggle-category`,`toggle-server`],setup(e){return(t,n)=>(A(),S(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(_,{class:`d-flex align-center`},{default:E(()=>[B(ue,{"model-value":e.selectAll,label:`全选`,density:`compact`,"hide-details":``,class:`mr-4`,"onUpdate:modelValue":n[0]||=e=>t.$emit(`toggle-all`)},null,8,[`model-value`]),B(R,{"model-value":e.serverSearch,"prepend-inner-icon":`mdi-magnify`,label:`搜索服务器...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`},"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:serverSearch`,e)},null,8,[`model-value`]),B(l,{icon:`mdi-refresh`,variant:`text`,size:`small`,loading:e.serversLoading,title:`刷新在线状态`,onClick:n[2]||=e=>t.$emit(`refresh`)},null,8,[`loading`])]),_:1}),B(j),B(p,{class:`pa-2`},{default:E(()=>[e.serversByCategory.length===0?(A(),y(`div`,Ne,`暂无服务器`)):(A(!0),y(c,{key:1},M(e.serversByCategory,r=>(A(),y(`div`,{key:r.category,class:`mb-4`},[w(`div`,Pe,[B(l,{size:`x-small`,variant:`text`,color:e.isCategoryAllSelected(r.category)?`primary`:`default`,onClick:e=>t.$emit(`toggle-category`,r.category)},{default:E(()=>[B(C,{size:`16`,class:`mr-1`},{default:E(()=>[k(u(e.isCategoryAllSelected(r.category)?`mdi-checkbox-marked`:`mdi-checkbox-blank-outline`),1)]),_:2},1024),k(` `+u(r.category),1)]),_:2},1032,[`color`,`onClick`]),w(`span`,Fe,` (`+u(r.servers.filter(t=>e.selectedIds.has(t.id)).length)+`/`+u(r.servers.length)+`) `,1)]),B(W,{dense:``},{default:E(()=>[(A(!0),y(c,null,M(r.servers,r=>(A(),S(U,{key:r.id,cols:`6`,sm:`4`,md:`3`,lg:`2`},{default:E(()=>[B(f,{color:e.selectedIds.has(r.id)?`primary`:void 0,variant:e.selectedIds.has(r.id)?`tonal`:`outlined`,rounded:`lg`,class:`pa-3 cursor-pointer`,onClick:e=>t.$emit(`toggle-server`,r.id)},{default:E(()=>[w(`div`,Ie,[B(C,{color:m(ye)(r.is_online),size:`12`},{default:E(()=>[...n[3]||=[k(`mdi-circle`,-1)]]),_:1},8,[`color`]),w(`span`,Le,u(r.name),1)]),w(`div`,Re,u(r.domain),1),e.pushStatus[r.id]?(A(),y(`div`,ze,[B(q,{color:m(ve)(e.pushStatus[r.id]),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:E(()=>[k(u(e.pushStatus[r.id]),1)]),_:2},1032,[`color`])])):T(``,!0)]),_:2},1032,[`color`,`variant`,`onClick`])]),_:2},1024))),128))]),_:2},1024)]))),128))]),_:1})]),_:1}))}}),Ve=D({...ce({falseIcon:`$radioOff`,trueIcon:`$radioOn`})},`VRadio`),Q=L()({name:`VRadio`,props:Ve(),setup(e,{slots:t}){return z(()=>B(H,P(H.filterProps(e),{class:[`v-radio`,e.class],style:e.style,type:`radio`}),t)),{}}}),He=D({height:{type:[Number,String],default:`auto`},...v(re(),[`direction`]),...v(se(),[`multiple`]),trueIcon:{type:O,default:`$radioOn`},falseIcon:{type:O,default:`$radioOff`},type:{type:String,default:`radio`}},`VRadioGroup`),Ue=L()({name:`VRadioGroup`,inheritAttrs:!1,props:He(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:t,slots:r}){let i=ee(),a=s(()=>e.id||`radio-group-${i}`),o=b(e,`modelValue`),l=n();return z(()=>{let[n,i]=x(t),s=N.filterProps(e),u=H.filterProps(e),d=r.label?r.label({label:e.label,props:{for:a.value}}):e.label;return B(N,P({ref:l,class:[`v-radio-group`,e.class],style:e.style},n,s,{modelValue:o.value,"onUpdate:modelValue":e=>o.value=e,id:a.value}),{...r,default:({id:t,messagesId:n,isDisabled:a,isReadonly:s})=>w(c,null,[d&&B(ne,{id:t.value},{default:()=>[d]}),B(le,P(u,{id:t.value,"aria-describedby":n.value,defaultsTarget:`VRadio`,trueIcon:e.trueIcon,falseIcon:e.falseIcon,type:e.type,disabled:a.value,readonly:s.value,"aria-labelledby":d?t.value:void 0,multiple:!1},i,{modelValue:o.value,"onUpdate:modelValue":e=>o.value=e}),r)])})}),ae({},l)}}),We={class:`text-caption text-medium-emphasis mt-1`},Ge=I({__name:`PushSyncModeCard`,props:{syncMode:{},syncModeDesc:{}},emits:[`update:syncMode`],setup(e){return(t,n)=>(A(),S(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(_,{class:`text-subtitle-1`},{default:E(()=>[...n[1]||=[k(`同步模式`,-1)]]),_:1}),B(p,null,{default:E(()=>[B(Ue,{"model-value":e.syncMode,inline:``,density:`compact`,"onUpdate:modelValue":n[0]||=e=>t.$emit(`update:syncMode`,e)},{default:E(()=>[B(Q,{label:`增量同步`,value:`incremental`}),B(Q,{label:`全量同步`,value:`full`}),B(Q,{label:`校验和同步`,value:`checksum`})]),_:1},8,[`model-value`]),e.syncMode===`full`?(A(),S(X,{key:0,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:E(()=>[...n[2]||=[k(` 全量同步会删除目标目录中不存在于源目录的文件 `,-1)]]),_:1})):T(``,!0),w(`div`,We,u(e.syncModeDesc),1)]),_:1})]),_:1}))}}),Ke=I({__name:`PushToolbar`,props:{sourcePath:{},targetPath:{},zipLocked:{type:Boolean},pushing:{type:Boolean}},emits:[`update:sourcePath`,`update:targetPath`,`preview`,`push`],setup(e){return(t,n)=>(A(),S(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:E(()=>[B(W,{align:`center`,dense:``},{default:E(()=>[B(U,{cols:`12`,sm:`4`},{default:E(()=>[B(R,{"model-value":e.sourcePath,label:`推送源路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`,disabled:e.zipLocked,hint:e.zipLocked?`已使用 ZIP 解压目录作为源路径`:void 0,"persistent-hint":``,"onUpdate:modelValue":n[0]||=e=>t.$emit(`update:sourcePath`,e)},null,8,[`model-value`,`disabled`,`hint`])]),_:1}),B(U,{cols:`12`,sm:`4`},{default:E(()=>[B(R,{"model-value":e.targetPath,label:`目标路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder-marker`,"onUpdate:modelValue":n[1]||=e=>t.$emit(`update:targetPath`,e)},null,8,[`model-value`])]),_:1}),B(U,{cols:`12`,sm:`4`,class:`d-flex ga-2 justify-end`},{default:E(()=>[B(l,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-eye`,onClick:n[2]||=e=>t.$emit(`preview`)},{default:E(()=>[...n[4]||=[k(`预览`,-1)]]),_:1}),B(l,{size:`small`,color:`primary`,variant:`flat`,"prepend-icon":`mdi-upload`,loading:e.pushing,onClick:n[3]||=e=>t.$emit(`push`)},{default:E(()=>[...n[5]||=[k(` 推送 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1}))}}),qe={key:0},Je={key:1,class:`d-flex align-center`},Ye=I({__name:`PushZipUpload`,props:{uploadedZip:{},isDragging:{type:Boolean},zipUploading:{type:Boolean}},emits:[`dragover`,`dragleave`,`drop`,`file-select`,`clear`],setup(e){let t=n(null);return(n,r)=>(A(),S(f,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:E(()=>[B(_,{class:`text-subtitle-1`},{default:E(()=>[...r[6]||=[k(`源文件`,-1)]]),_:1}),B(p,null,{default:E(()=>[e.uploadedZip?(A(),y(`div`,Je,[B(C,{class:`mr-2`},{default:E(()=>[...r[10]||=[k(`mdi-folder-zip`,-1)]]),_:1}),w(`span`,null,u(e.uploadedZip.name)+` (`+u(e.uploadedZip.fileCount)+` 个文件, `+u(m(Z)(e.uploadedZip.size))+`)`,1),B(G),B(l,{size:`small`,variant:`text`,color:`error`,onClick:r[5]||=e=>n.$emit(`clear`)},{default:E(()=>[...r[11]||=[k(`清除`,-1)]]),_:1})])):(A(),y(`div`,qe,[w(`div`,{class:a([`border-dashed border rounded pa-6 text-center cursor-pointer`,{"border-primary bg-primary-lighten-5":e.isDragging}]),onDragover:r[0]||=o(e=>n.$emit(`dragover`),[`prevent`]),onDragleave:r[1]||=e=>n.$emit(`dragleave`),onDrop:r[2]||=o(e=>n.$emit(`drop`,e),[`prevent`]),onClick:r[3]||=e=>t.value?.click()},[B(C,{size:`48`,color:`grey`},{default:E(()=>[...r[7]||=[k(`mdi-cloud-upload-outline`,-1)]]),_:1}),r[8]||=w(`div`,{class:`text-body-2 mt-2`},`拖拽 ZIP 文件到此处,或点击选择`,-1),r[9]||=w(`div`,{class:`text-caption text-medium-emphasis`},`支持 .zip 格式`,-1)],34),w(`input`,{ref_key:`zipInputRef`,ref:t,type:`file`,accept:`.zip`,hidden:``,onChange:r[4]||=e=>n.$emit(`file-select`,e)},null,544)])),e.zipUploading?(A(),S(F,{key:2,indeterminate:``,class:`mt-2`})):T(``,!0)]),_:1})]),_:1}))}}),$=[`success`,`failed`,`cancelled`];function Xe(){let e=K(),t=n(``),r=n(``),i=n(`incremental`),a=n(!1),o=n(null),c=n(!1),l=s(()=>{switch(i.value){case`incremental`:return`仅传输新增或修改的文件`;case`full`:return`使目标目录与源目录完全一致,会删除不存在于源的文件`;case`checksum`:return`通过文件内容校验和判断是否需要传输`;default:return``}});function u(){return o.value?.sourcePath||t.value}function f(t){return u()?r.value.trim()?t===0?(e(`请选择至少一台服务器`,`warning`),!1):!0:(e(`请填写目标路径`,`warning`),!1):(e(`请选择源路径或上传 ZIP 文件`,`warning`),!1)}async function p(e){a.value=!1;let t=e.dataTransfer?.files[0];t?.name.endsWith(`.zip`)&&await h(t)}function m(e){let t=e.target.files?.[0];t&&h(t)}async function h(t){c.value=!0;try{let n=new FormData;n.append(`file`,t);let r=await d.upload(`/sync/upload-zip`,n);o.value={name:t.name,sourcePath:r.source_path,fileCount:r.file_count,size:r.size},e(`ZIP 上传成功`)}catch(t){e(t instanceof Error?t.message:`上传失败`,`error`)}finally{c.value=!1}}function g(){o.value=null}return{sourcePath:t,targetPath:r,syncMode:i,syncModeDesc:l,isDragging:a,uploadedZip:o,zipUploading:c,effectiveSourcePath:u,validateForm:f,handleZipDrop:p,handleZipSelect:m,clearZipUpload:g}}function Ze(e){let t=n([]),r=n(!1),i=n(``),a=n(new Set),o=null;async function c(){r.value=!0;try{t.value=(await d.get(`/servers/`,{per_page:200})).items||[]}catch{t.value=[]}finally{r.value=!1}}function l(e){u(),o=setInterval(()=>{e()||c()},6e4)}function u(){o&&=(clearInterval(o),null)}let f=s(()=>{if(!i.value)return t.value;let e=i.value.toLowerCase();return t.value.filter(t=>t.name.toLowerCase().includes(e)||(t.domain||``).toLowerCase().includes(e))}),p=s(()=>{let e=f.value;return e.length>0&&e.every(e=>a.value.has(e.id))}),m=s(()=>{let e={};for(let t of f.value){let n=t.category||`未分类`;e[n]||(e[n]=[]),e[n].push(t)}return Object.entries(e).map(([e,t])=>({category:e,servers:t}))});function h(e){let t=m.value.find(t=>t.category===e);return!t||t.servers.length===0?!1:t.servers.every(e=>a.value.has(e.id))}function g(e){let t=m.value.find(t=>t.category===e);if(!t)return;let n=new Set(a.value),r=t.servers.every(e=>n.has(e.id));for(let e of t.servers)r?n.delete(e.id):n.add(e.id);a.value=n}function _(e){let t=new Set(a.value);t.has(e)?t.delete(e):t.add(e),a.value=t}function v(){let e=f.value,t=e.length>0&&e.every(e=>a.value.has(e.id)),n=new Set(a.value);for(let r of e)t?n.delete(r.id):n.add(r.id);a.value=n}return{servers:t,serversLoading:r,serverSearch:i,selectedIds:a,pushStatus:e,filteredServers:f,selectAll:p,serversByCategory:m,loadServers:c,startAutoRefresh:l,stopAutoRefresh:u,isCategoryAllSelected:h,toggleCategory:g,toggleServer:_,toggleAll:v}}function Qe(e,t,r){let i=K(),a=h(),o=n(!1),c=n(!1),l=n([]),u=n(``),f=n(null),p=[],m=s(()=>l.value.filter(e=>$.includes(e.status)).length),g=s(()=>{let e=l.value.length;return e?Math.round(m.value/e*100):0});function _(){p.forEach(e=>clearTimeout(e)),p.length=0}function v(){let e=l.value.length;if(!e||!o.value||l.value.filter(e=>$.includes(e.status)).length<e)return;o.value=!1,x(),r();let t=l.value.filter(e=>e.status===`failed`).length,n=l.value.filter(e=>e.status===`cancelled`).length,a=l.value.filter(e=>e.status===`success`).length;i(`推送完成:${a} 成功,${t} 失败${n?`,${n} 取消`:``}`)}function y(e){if(e.type!==`sync_progress`||e.batch_id!==u.value||e.server_id==null)return;let n=l.value.findIndex(t=>t.id===e.server_id);if(n===-1)return;let r=l.value[n],i=e.status;if(i===`running`)r.status=`running`,r.detail=`同步中...`;else if(i===`success`){r.status=`success`;let n=e.duration_seconds;r.detail=n==null?`完成`:`完成(${n}s)`,t.pushStatus.value[e.server_id]=`成功`}else i===`failed`?(r.status=`failed`,r.detail=e.error_message||`失败`,t.pushStatus.value[e.server_id]=`失败`):i===`cancelled`&&(r.status=`cancelled`,r.detail=e.error_message||`已取消`,t.pushStatus.value[e.server_id]=`已取消`);v()}function b(){if(!a.token)return;x();let e=fe(`/ws/sync`,{token:a.token}),n=new WebSocket(e);n.onmessage=e=>{if(e.data!==`pong`)try{let t=JSON.parse(e.data);if(t.type===`ping`){n.send(`pong`);return}y(t)}catch{}},n.onclose=e=>{f.value=null,e.code!==1e3&&o.value&&(l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`连接中断`,t.pushStatus.value[e.id]=`失败`)}),o.value=!1,i(`推送进度连接中断,部分服务器状态未知`,`warning`),r())},f.value=n}function x(){f.value&&=(f.value.close(1e3),null)}async function S(){if(u.value){c.value=!0;try{await d.post(`/sync/cancel`,{batch_id:u.value}),l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`cancelled`,e.detail=`已取消`,t.pushStatus.value[e.id]=`已取消`)}),o.value=!1,x(),r(),i(`推送已取消`)}catch(e){i(e instanceof Error?e.message:`取消失败`,`error`)}finally{c.value=!1}}}async function C(){if(o.value||!e.validateForm(t.selectedIds.value.size))return;_(),x(),u.value=``,t.pushStatus.value={};let n=[...t.selectedIds.value];l.value=n.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`,status:`pending`})),o.value=!0;try{if(u.value=(await d.post(`/sync/files`,{source_path:e.effectiveSourcePath(),target_path:e.targetPath.value,server_ids:n,sync_mode:e.syncMode.value})).batch_id||``,!u.value)throw Error(`未返回 batch_id,无法追踪进度`);b()}catch(e){let t=e instanceof Error?e.message:`推送请求失败`;l.value.forEach(e=>{e.status=`failed`,e.detail=t}),o.value=!1,i(t,`error`);return}let a=setTimeout(()=>{o.value&&(l.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`等待超时`,t.pushStatus.value[e.id]=`失败`)}),o.value=!1,x(),r(),i(`推送超时,${m.value}/${l.value.length} 台已有结果`,`warning`))},3e5);p.push(a)}function w(){x(),_()}return{pushing:o,cancelling:c,wsProgressItems:l,pushBatchId:u,doneCount:m,totalProgress:g,doPush:C,cancelPush:S,dispose:w}}function $e(e,t){let r=n(!1),i=n([]),a=n(!1),o=n(0),c=n(0),l=s(()=>o.value>30),u=s(()=>i.value.filter(e=>e.error).length);async function f(t,n){try{let r=await d.post(`/sync/preview`,{source_path:e.effectiveSourcePath(),target_path:e.targetPath.value,server_id:t,sync_mode:e.syncMode.value});return r.error?{server_id:t,server_name:n,error:r.error}:{server_id:t,server_name:r.server_name||n,stats:r.stats}}catch(e){return{server_id:t,server_name:n,error:e instanceof Error?e.message:`预览失败`}}}async function p(){if(!e.validateForm(t.selectedIds.value.size))return;let n=[...t.selectedIds.value];o.value=n.length,c.value=0,r.value=!0,a.value=!0,i.value=[];let s=n.map(e=>({id:e,name:t.servers.value.find(t=>t.id===e)?.name||`#${e}`}));for(let e=0;e<s.length;e+=4){let t=s.slice(e,e+4),n=await Promise.all(t.map(e=>f(e.id,e.name)));i.value=[...i.value,...n],c.value=i.value.length}a.value=!1}function m(){r.value=!1}function h(e){r.value=!1,e()}return{showPreview:r,previewResults:i,previewLoading:a,previewTotal:o,previewDone:c,previewLargeBatch:l,previewWarnThreshold:30,previewErrorCount:u,doPreview:p,closePreview:m,confirmAndPush:h}}var et=[{label:`成功`,value:`success`},{label:`失败`,value:`failed`},{label:`进行中`,value:`running`},{label:`已取消`,value:`cancelled`}],tt=[{label:`增量`,value:`incremental`},{label:`全量`,value:`full`},{label:`校验和`,value:`checksum`}],nt=[{title:`时间`,key:`started_at`,width:170},{title:`服务器`,key:`server_name`,width:120},{title:`状态`,key:`status`,width:88},{title:`模式`,key:`sync_mode`,width:88},{title:`源路径`,key:`source_path`},{title:`目标路径`,key:`target_path`},{title:`错误`,key:`error_message`,width:200},{title:`操作`,key:`actions`,width:88,sortable:!1}];function rt(e,t){let r=K(),i=n([]),a=n(0),o=n(!1),c=n(1),l=n(null),u=n(null),f=n(null),p=n(!1),m=n(!1),h=n(!1),g=n(null),_=n(null),v=s(()=>t.servers.value.map(e=>({title:e.name,value:e.id})));function y(){c.value=1,b()}async function b(){o.value=!0;try{let e={page:c.value,per_page:15};l.value&&(e.status=l.value),u.value&&(e.sync_mode=u.value),f.value!=null&&(e.server_id=f.value);let t=await d.get(`/servers/logs`,e);i.value=t.items||[],a.value=t.total||0}catch{i.value=[],a.value=0}finally{o.value=!1}}async function x(){p.value=!0;try{let e=(await d.post(`/sync/reconcile-stale-logs`,{max_age_minutes:120})).reconciled??0;r(e>0?`已订正 ${e} 条卡住的推送记录`:`没有需要订正的记录`),await b()}catch(e){r(e instanceof Error?e.message:`订正失败`,`error`)}finally{p.value=!1}}async function S(t){_.value=t,g.value=null,m.value=!0,h.value=!0;try{g.value=await d.post(`/sync/diagnose`,{server_id:t.server_id,target_path:t.target_path||e.targetPath.value||void 0})}catch(e){r(e instanceof Error?e.message:`诊断失败`,`error`),m.value=!1}finally{h.value=!1}}function C(){m.value=!1}return{logs:i,logTotal:a,logLoading:o,logPage:c,logStatusFilter:l,logSyncModeFilter:u,logServerFilter:f,reconcilingLogs:p,logStatusOptions:et,logSyncModeOptions:tt,logHeaders:nt,logServerOptions:v,showDiagnose:m,diagnoseLoading:h,diagnoseResult:g,diagnoseTarget:_,onLogFilterChange:y,loadLogs:b,reconcileStaleLogs:x,openDiagnose:S,closeDiagnose:C}}function it(){let e=Xe(),t=Ze(n({})),i=rt(e,t),a=Qe(e,t,()=>i.loadLogs()),o=$e(e,t);function s(){o.confirmAndPush(()=>a.doPush())}return ie(()=>{t.loadServers(),i.loadLogs(),t.startAutoRefresh(()=>a.pushing.value)}),te(()=>{a.dispose(),t.stopAutoRefresh()}),{form:r(e),servers:r(t),progress:r(a),preview:r(o),logs:r(i),onConfirmAndPush:s}}var at=I({__name:`PushPage`,setup(e){let{form:t,servers:n,progress:r,preview:i,logs:a,onConfirmAndPush:o}=it();return(e,s)=>(A(),S(oe,{fluid:``,class:`pa-6`},{default:E(()=>[B(Ye,{"uploaded-zip":m(t).uploadedZip,"is-dragging":m(t).isDragging,"zip-uploading":m(t).zipUploading,onDragover:s[0]||=e=>m(t).isDragging=!0,onDragleave:s[1]||=e=>m(t).isDragging=!1,onDrop:m(t).handleZipDrop,onFileSelect:m(t).handleZipSelect,onClear:m(t).clearZipUpload},null,8,[`uploaded-zip`,`is-dragging`,`zip-uploading`,`onDrop`,`onFileSelect`,`onClear`]),B(Ke,{"source-path":m(t).sourcePath,"onUpdate:sourcePath":s[2]||=e=>m(t).sourcePath=e,"target-path":m(t).targetPath,"onUpdate:targetPath":s[3]||=e=>m(t).targetPath=e,"zip-locked":!!m(t).uploadedZip,pushing:m(r).pushing,onPreview:m(i).doPreview,onPush:m(r).doPush},null,8,[`source-path`,`target-path`,`zip-locked`,`pushing`,`onPreview`,`onPush`]),B(Be,{"select-all":m(n).selectAll,"server-search":m(n).serverSearch,"onUpdate:serverSearch":s[4]||=e=>m(n).serverSearch=e,"servers-loading":m(n).serversLoading,"servers-by-category":m(n).serversByCategory,"selected-ids":m(n).selectedIds,"push-status":m(n).pushStatus,"is-category-all-selected":m(n).isCategoryAllSelected,onToggleAll:m(n).toggleAll,onRefresh:m(n).loadServers,onToggleCategory:m(n).toggleCategory,onToggleServer:m(n).toggleServer},null,8,[`select-all`,`server-search`,`servers-loading`,`servers-by-category`,`selected-ids`,`push-status`,`is-category-all-selected`,`onToggleAll`,`onRefresh`,`onToggleCategory`,`onToggleServer`]),B(Ge,{"sync-mode":m(t).syncMode,"onUpdate:syncMode":s[5]||=e=>m(t).syncMode=e,"sync-mode-desc":m(t).syncModeDesc},null,8,[`sync-mode`,`sync-mode-desc`]),B(Me,{items:m(r).wsProgressItems,"batch-id":m(r).pushBatchId,pushing:m(r).pushing,cancelling:m(r).cancelling,"done-count":m(r).doneCount,"total-progress":m(r).totalProgress,onCancel:m(r).cancelPush},null,8,[`items`,`batch-id`,`pushing`,`cancelling`,`done-count`,`total-progress`,`onCancel`]),B(Ae,{modelValue:m(i).showPreview,"onUpdate:modelValue":s[6]||=e=>m(i).showPreview=e,loading:m(i).previewLoading,results:m(i).previewResults,"selected-count":m(n).selectedIds.size,"preview-done":m(i).previewDone,"preview-total":m(i).previewTotal,"large-batch":m(i).previewLargeBatch,"warn-threshold":m(i).previewWarnThreshold,"error-count":m(i).previewErrorCount,"sync-mode":m(t).syncMode,onConfirmPush:m(o)},null,8,[`modelValue`,`loading`,`results`,`selected-count`,`preview-done`,`preview-total`,`large-batch`,`warn-threshold`,`error-count`,`sync-mode`,`onConfirmPush`]),B(pe,{modelValue:m(a).showDiagnose,"onUpdate:modelValue":s[7]||=e=>m(a).showDiagnose=e,loading:m(a).diagnoseLoading,result:m(a).diagnoseResult,"target-name":m(a).diagnoseTarget?.server_name},null,8,[`modelValue`,`loading`,`result`,`target-name`]),B(we,{items:m(a).logs,headers:m(a).logHeaders,total:m(a).logTotal,loading:m(a).logLoading,page:m(a).logPage,"onUpdate:page":s[8]||=e=>m(a).logPage=e,"status-filter":m(a).logStatusFilter,"onUpdate:statusFilter":s[9]||=e=>m(a).logStatusFilter=e,"sync-mode-filter":m(a).logSyncModeFilter,"onUpdate:syncModeFilter":s[10]||=e=>m(a).logSyncModeFilter=e,"server-filter":m(a).logServerFilter,"onUpdate:serverFilter":s[11]||=e=>m(a).logServerFilter=e,"status-options":m(a).logStatusOptions,"sync-mode-options":m(a).logSyncModeOptions,"server-options":m(a).logServerOptions,reconciling:m(a).reconcilingLogs,onFilterChange:m(a).onLogFilterChange,onPageChange:m(a).loadLogs,onReconcile:m(a).reconcileStaleLogs,onDiagnose:m(a).openDiagnose},null,8,[`items`,`headers`,`total`,`loading`,`page`,`status-filter`,`sync-mode-filter`,`server-filter`,`status-options`,`sync-mode-options`,`server-options`,`reconciling`,`onFilterChange`,`onPageChange`,`onReconcile`,`onDiagnose`])]),_:1}))}});export{at as default}; |