Files
Nexus/web/app/assets/PushPage-DSf6k8wF.js
T
Your Name 51948469c2 build(frontend): track Vite output in Git for Gitea deploy
- 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>
2026-06-03 00:52:44 +08:00

1 line
16 KiB
JavaScript

import{$n as e,$t as t,Ar as n,F as r,Gn as i,It as a,Jn as o,L as s,M as c,Mr as l,N as u,Nn as d,Nt as f,O as ee,P as p,Qn as te,Sr as m,Wn as ne,Xn as h,Y as g,Yn as _,Zn as v,Zt as y,ar as b,dr as x,en as re,er as S,h as C,hr as w,j as ie,lr as ae,nr as T,o as E,on as D,pr as O,q as oe,qn as k,s as A,t as j,un as M,ur as se,v as N,vr as P,w as ce,xn as F}from"./index-9ZGEqHPG.js";import{a as le,i as I,n as ue,r as L,t as R}from"./VSelectionControl-D6-x3Otj.js";import{n as z,t as de}from"./VRow-DBY5CCN2.js";import{t as B}from"./VSpacer-Cu4v-Rar.js";import{t as fe}from"./useSnackbar-D7YOfKok.js";import{t as V}from"./VChip-CTgzb9sy.js";import{t as pe}from"./VDialog-BBAukoFN.js";import{t as me}from"./VCheckbox-Jgl_2qoG.js";import{t as he}from"./VDataTableServer-DJK7mjnE.js";import{t as ge}from"./VAlert-CYAMaUR9.js";var H=M({...ue({falseIcon:`$radioOff`,trueIcon:`$radioOn`})},`VRadio`),U=D()({name:`VRadio`,props:H(),setup(e,{slots:t}){return re(()=>S(R,b(R.filterProps(e),{class:[`v-radio`,e.class],style:e.style,type:`radio`}),t)),{}}}),W=M({height:{type:[Number,String],default:`auto`},...d(A(),[`direction`]),...d(I(),[`multiple`]),trueIcon:{type:t,default:`$radioOn`},falseIcon:{type:t,default:`$radioOff`},type:{type:String,default:`radio`}},`VRadioGroup`),_e=D()({name:`VRadioGroup`,inheritAttrs:!1,props:W(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:t,slots:n}){let r=w(),a=k(()=>e.id||`radio-group-${r}`),s=y(e,`modelValue`),c=m();return re(()=>{let[r,l]=F(t),u=E.filterProps(e),d=R.filterProps(e),f=n.label?n.label({label:e.label,props:{for:a.value}}):e.label;return S(E,b({ref:c,class:[`v-radio-group`,e.class],style:e.style},r,u,{modelValue:s.value,"onUpdate:modelValue":e=>s.value=e,id:a.value}),{...n,default:({id:t,messagesId:r,isDisabled:a,isReadonly:c})=>o(i,null,[f&&S(C,{id:t.value},{default:()=>[f]}),S(L,b(d,{id:t.value,"aria-describedby":r.value,defaultsTarget:`VRadio`,trueIcon:e.trueIcon,falseIcon:e.falseIcon,type:e.type,disabled:a.value,readonly:c.value,"aria-labelledby":f?t.value:void 0,multiple:!1},l,{modelValue:s.value,"onUpdate:modelValue":e=>s.value=e}),n)])})}),N({},c)}}),ve={key:0},ye={key:1,class:`d-flex align-center`},be={key:0,class:`text-center text-medium-emphasis py-6`},xe={class:`d-flex align-center px-2 mb-2`},Se={class:`text-caption text-medium-emphasis ml-1`},Ce={class:`d-flex align-center ga-2`},we={class:`text-body-2 font-weight-medium text-truncate`},Te={class:`text-caption text-medium-emphasis text-truncate`},Ee={key:0,class:`text-caption mt-1`},De={class:`text-caption text-medium-emphasis mt-1`},Oe={class:`text-caption text-medium-emphasis mt-1`},ke={key:1},Ae={class:`mb-2`},je={key:0,class:`text-body-2`},Me={class:`text-caption text-medium-emphasis`},Ne=T({__name:`PushPage`,setup(t){let d=fe(),y=f(),b=m([]);async function re(){try{b.value=(await a.get(`/servers/`,{per_page:200})).items||[]}catch{b.value=[]}}let C=m(``),w=m(``),T=m(``),E=m(new Set),D=m(!1),A=m(0),M=m(0),N=[],F=m({}),I=m(`incremental`),ue=k(()=>{switch(I.value){case`incremental`:return`仅传输新增或修改的文件`;case`full`:return`使目标目录与源目录完全一致,会删除不存在于源的文件`;case`checksum`:return`通过文件内容校验和判断是否需要传输`;default:return``}}),L=m(!1),R=m(null),H=m(!1),W=m(null);function Ne(){W.value?.click()}async function Pe(e){L.value=!1;let t=e.dataTransfer?.files[0];t&&t.name.endsWith(`.zip`)&&await Ie(t)}function Fe(e){let t=e.target.files?.[0];t&&Ie(t)}async function Ie(e){H.value=!0;try{let t=new FormData;t.append(`file`,e);let n=await a.upload(`/sync/upload-zip`,t);R.value={name:e.name,sourcePath:n.source_path,fileCount:n.file_count,size:n.size},d(`ZIP 上传成功`)}catch(e){d(e.message||`上传失败`,`error`)}finally{H.value=!1}}function Le(){R.value=null}function Re(e){return e<1024?e+` B`:e<1048576?(e/1024).toFixed(1)+` KB`:(e/1048576).toFixed(1)+` MB`}let G=m([]),K=m(``),q=null;function ze(){return`${location.protocol===`https:`?`wss:`:`ws:`}//${location.host}/ws/alerts`}function Be(){if(!y.token)return;let e=`${ze()}?token=${y.token}`,t=new WebSocket(e);t.onmessage=e=>{if(e.data!==`pong`)try{let n=JSON.parse(e.data);if(n.type===`ping`){t.send(`pong`);return}if(n.type===`sync_progress`&&n.batch_id===K.value){let e=G.value.findIndex(e=>e.id===n.server_id);if(e!==-1){let t=G.value[e];n.status===`running`?(t.status=`running`,t.detail=n.detail||`同步中...`):n.status===`success`?(t.status=`success`,t.detail=n.detail||`完成`):n.status===`failed`&&(t.status=`failed`,t.detail=n.detail||`失败`)}}}catch{}},t.onclose=()=>{q=null},q=t}function J(){q&&=(q.close(),null)}let Y=m(!1);async function Ve(){if(K.value){Y.value=!0;try{await a.post(`/sync/cancel`,{batch_id:K.value}),G.value.forEach(e=>{(e.status===`pending`||e.status===`running`)&&(e.status=`failed`,e.detail=`已取消`)}),d(`推送已取消`)}catch(e){d(e instanceof Error?e.message:`取消失败`,`error`)}finally{Y.value=!1}}}let X=m(!1),Z=m({}),He=m([]),Ue=m(0),We=m(!1),Ge=m(1),Ke=[{title:`时间`,key:`created_at`,width:180},{title:`服务器`,key:`server_name`},{title:`状态`,key:`status`,width:100},{title:`源路径`,key:`source_path`},{title:`目标路径`,key:`target_path`}],qe=k({get:()=>b.value.length>0&&E.value.size===b.value.length,set:()=>{}}),Je=k(()=>{if(!T.value)return b.value;let e=T.value.toLowerCase();return b.value.filter(t=>t.name.toLowerCase().includes(e)||(t.domain||``).toLowerCase().includes(e))}),Ye=k(()=>{let e={};for(let t of Je.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 Xe(e){let t=Ye.value.find(t=>t.category===e);return!t||t.servers.length===0?!1:t.servers.every(e=>E.value.has(e.id))}function Ze(e){let t=Ye.value.find(t=>t.category===e);if(!t)return;let n=new Set(E.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);E.value=n}function Q(){return R.value?.sourcePath||C.value}function Qe(e){let t=new Set(E.value);t.has(e)?t.delete(e):t.add(e),E.value=t}function $e(){E.value.size===b.value.length?E.value=new Set:E.value=new Set(b.value.map(e=>e.id))}async function et(){if(!Q()||E.value.size===0){d(`请选择服务器和源路径(或上传 ZIP 文件)`,`warning`);return}try{Z.value=await a.post(`/sync/preview`,{source_path:Q(),target_path:w.value,server_id:E.value.values().next().value,sync_mode:I.value}),X.value=!0}catch(e){Z.value={error:e.message},X.value=!0}}async function tt(){if(!Q()||E.value.size===0){d(`请选择服务器和源路径(或上传 ZIP 文件)`,`warning`);return}D.value=!0,A.value=0,M.value=0,F.value={};let e=[...E.value];G.value=e.map(e=>({id:e,name:b.value.find(t=>t.id===e)?.name||`#${e}`,status:`pending`}));try{K.value=(await a.post(`/sync/files`,{source_path:Q(),target_path:w.value,server_ids:e,sync_mode:I.value})).batch_id||``,K.value&&Be()}catch{let t=e.length,n=await Promise.allSettled(e.map(async e=>{try{await a.post(`/sync/files`,{source_path:Q(),target_path:w.value,server_ids:[e],sync_mode:I.value}),F.value[e]=`成功`;let t=G.value.findIndex(t=>t.id===e);t!==-1&&(G.value[t].status=`success`)}catch(t){F.value[e]=`失败`;let n=G.value.findIndex(t=>t.id===e);n!==-1&&(G.value[n].status=`failed`,G.value[n].detail=t instanceof Error?t.message:`推送失败`)}M.value++,A.value=Math.round(M.value/t*100)}));D.value=!1,$();let r=n.filter(e=>e.status===`fulfilled`).length;d(`推送完成:${r}/${t} 台成功`);return}let t=setInterval(()=>{let e=G.value.filter(e=>e.status===`success`||e.status===`failed`).length;if(M.value=e,A.value=Math.round(e/G.value.length*100),e>=G.value.length){clearInterval(t),D.value=!1,J(),$();let e=G.value.filter(e=>e.status===`failed`).length,n=G.value.filter(e=>e.status===`success`).length;d(`推送完成:${n} 成功,${e} 失败`)}},500);N.push(t);let n=setTimeout(()=>{if(D.value){clearInterval(t),D.value=!1,J(),$();let e=G.value.filter(e=>e.status===`success`||e.status===`failed`).length;d(`推送超时,${e}/${G.value.length} 台已完成`,`warning`)}},3e5);N.push(n)}async function $(){We.value=!0;try{let e=await a.get(`/servers/logs`,{page:Ge.value,per_page:15});He.value=e.items||[],Ue.value=e.total||0}catch{He.value=[]}finally{We.value=!1}}function nt(e){return e===`成功`?`success`:e===`失败`?`error`:`warning`}return ae(()=>{re(),$()}),se(()=>{J(),N.forEach(e=>clearTimeout(e)),N.length=0}),(t,a)=>(x(),_(le,{fluid:``,class:`pa-6`},{default:P(()=>[S(c,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:P(()=>[S(p,{class:`text-subtitle-1`},{default:P(()=>[...a[11]||=[e(`源文件`,-1)]]),_:1}),S(u,null,{default:P(()=>[R.value?(x(),v(`div`,ye,[S(g,{class:`mr-2`},{default:P(()=>[...a[15]||=[e(`mdi-folder-zip`,-1)]]),_:1}),o(`span`,null,l(R.value.name)+` (`+l(R.value.fileCount)+` 个文件, `+l(Re(R.value.size))+`)`,1),S(B),S(s,{size:`small`,variant:`text`,color:`error`,onClick:Le},{default:P(()=>[...a[16]||=[e(`清除`,-1)]]),_:1})])):(x(),v(`div`,ve,[o(`div`,{class:n([`border-dashed border rounded pa-6 text-center cursor-pointer`,{"border-primary bg-primary-lighten-5":L.value}]),onDragover:a[0]||=ne(e=>L.value=!0,[`prevent`]),onDragleave:a[1]||=e=>L.value=!1,onDrop:ne(Pe,[`prevent`]),onClick:Ne},[S(g,{size:`48`,color:`grey`},{default:P(()=>[...a[12]||=[e(`mdi-cloud-upload-outline`,-1)]]),_:1}),a[13]||=o(`div`,{class:`text-body-2 mt-2`},`拖拽 ZIP 文件到此处,或点击选择`,-1),a[14]||=o(`div`,{class:`text-caption text-medium-emphasis`},`支持 .zip 格式`,-1)],34),o(`input`,{ref_key:`zipInput`,ref:W,type:`file`,accept:`.zip`,hidden:``,onChange:Fe},null,544)])),H.value?(x(),_(oe,{key:2,indeterminate:``,class:`mt-2`})):h(``,!0)]),_:1})]),_:1}),S(c,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:P(()=>[S(de,{align:`center`,dense:``},{default:P(()=>[S(z,{cols:`12`,sm:`4`},{default:P(()=>[S(j,{modelValue:C.value,"onUpdate:modelValue":a[2]||=e=>C.value=e,label:`推送源路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder`},null,8,[`modelValue`])]),_:1}),S(z,{cols:`12`,sm:`4`},{default:P(()=>[S(j,{modelValue:w.value,"onUpdate:modelValue":a[3]||=e=>w.value=e,label:`目标路径`,variant:`outlined`,density:`compact`,"prepend-inner-icon":`mdi-folder-marker`},null,8,[`modelValue`])]),_:1}),S(z,{cols:`12`,sm:`4`,class:`d-flex ga-2 justify-end`},{default:P(()=>[S(s,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-eye`,onClick:et},{default:P(()=>[...a[17]||=[e(`预览`,-1)]]),_:1}),S(s,{size:`small`,color:`primary`,variant:`flat`,"prepend-icon":`mdi-upload`,onClick:tt,loading:D.value},{default:P(()=>[...a[18]||=[e(`推送`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1}),S(c,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:P(()=>[S(p,{class:`d-flex align-center`},{default:P(()=>[S(me,{modelValue:qe.value,"onUpdate:modelValue":[a[4]||=e=>qe.value=e,$e],label:`全选`,density:`compact`,"hide-details":``,class:`mr-4`},null,8,[`modelValue`]),S(j,{modelValue:T.value,"onUpdate:modelValue":a[5]||=e=>T.value=e,"prepend-inner-icon":`mdi-magnify`,label:`搜索服务器...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`}},null,8,[`modelValue`])]),_:1}),S(ie),S(u,{class:`pa-2`},{default:P(()=>[Je.value.length===0?(x(),v(`div`,be,`暂无服务器`)):(x(!0),v(i,{key:1},O(Ye.value,t=>(x(),v(`div`,{key:t.category,class:`mb-4`},[o(`div`,xe,[S(s,{size:`x-small`,variant:`text`,color:Xe(t.category)?`primary`:`default`,onClick:e=>Ze(t.category)},{default:P(()=>[S(g,{size:`16`,class:`mr-1`},{default:P(()=>[e(l(Xe(t.category)?`mdi-checkbox-marked`:`mdi-checkbox-blank-outline`),1)]),_:2},1024),e(` `+l(t.category),1)]),_:2},1032,[`color`,`onClick`]),o(`span`,Se,` (`+l(t.servers.filter(e=>E.value.has(e.id)).length)+`/`+l(t.servers.length)+`) `,1)]),S(de,{dense:``},{default:P(()=>[(x(!0),v(i,null,O(t.servers,t=>(x(),_(z,{cols:`6`,sm:`4`,md:`3`,lg:`2`,key:t.id},{default:P(()=>[S(c,{color:E.value.has(t.id)?`primary`:void 0,variant:E.value.has(t.id)?`tonal`:`outlined`,rounded:`lg`,class:`pa-3 cursor-pointer`,onClick:e=>Qe(t.id)},{default:P(()=>[o(`div`,Ce,[S(g,{color:t.status===`online`?`success`:`error`,size:`12`},{default:P(()=>[...a[19]||=[e(`mdi-circle`,-1)]]),_:1},8,[`color`]),o(`span`,we,l(t.name),1)]),o(`div`,Te,l(t.domain),1),F.value[t.id]?(x(),v(`div`,Ee,[S(V,{color:nt(F.value[t.id]),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:P(()=>[e(l(F.value[t.id]),1)]),_:2},1032,[`color`])])):h(``,!0)]),_:2},1032,[`color`,`variant`,`onClick`])]),_:2},1024))),128))]),_:2},1024)]))),128))]),_:1})]),_:1}),S(c,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:P(()=>[S(p,{class:`text-subtitle-1`},{default:P(()=>[...a[20]||=[e(`同步模式`,-1)]]),_:1}),S(u,null,{default:P(()=>[S(_e,{modelValue:I.value,"onUpdate:modelValue":a[6]||=e=>I.value=e,inline:``,density:`compact`},{default:P(()=>[S(U,{label:`增量同步`,value:`incremental`}),S(U,{label:`全量同步`,value:`full`}),S(U,{label:`校验和同步`,value:`checksum`})]),_:1},8,[`modelValue`]),I.value===`full`?(x(),_(ge,{key:0,type:`warning`,density:`compact`,variant:`tonal`,class:`mt-2`},{default:P(()=>[...a[21]||=[e(` 全量同步会删除目标目录中不存在于源目录的文件 `,-1)]]),_:1})):h(``,!0),o(`div`,De,l(ue.value),1)]),_:1})]),_:1}),D.value?(x(),_(c,{key:0,elevation:`0`,border:``,rounded:`lg`,class:`mb-4 pa-4`},{default:P(()=>[a[22]||=o(`div`,{class:`text-subtitle-2 mb-2`},`推送进度`,-1),S(oe,{"model-value":A.value,color:`primary`,height:`8`,rounded:``},null,8,[`model-value`]),o(`div`,Oe,l(M.value)+` / `+l(E.value.size)+` 台完成`,1)]),_:1})):h(``,!0),G.value.length>0?(x(),_(c,{key:1,class:`mb-4`,elevation:`0`,border:``,rounded:`lg`},{default:P(()=>[S(p,{class:`d-flex align-center text-subtitle-1`},{default:P(()=>[a[24]||=e(` 推送进度 `,-1),S(B),K.value&&G.value.some(e=>e.status===`running`||e.status===`pending`)?(x(),_(s,{key:0,size:`small`,variant:`tonal`,color:`error`,class:`mr-2`,loading:Y.value,onClick:Ve},{default:P(()=>[...a[23]||=[e(` 取消推送 `,-1)]]),_:1},8,[`loading`])):h(``,!0),S(V,{size:`small`,variant:`tonal`,color:`primary`},{default:P(()=>[e(l(G.value.filter(e=>e.status===`success`).length)+`/`+l(G.value.length)+` 完成 `,1)]),_:1})]),_:1}),S(ie),S(u,null,{default:P(()=>[S(ce,{density:`compact`},{default:P(()=>[(x(!0),v(i,null,O(G.value,t=>(x(),_(ee,{key:t.id,title:t.name},te({append:P(()=>[t.status===`pending`?(x(),_(g,{key:0,color:`grey`},{default:P(()=>[...a[25]||=[e(`mdi-clock-outline`,-1)]]),_:1})):t.status===`running`?(x(),_(g,{key:1,color:`blue`},{default:P(()=>[...a[26]||=[e(`mdi-loading`,-1)]]),_:1})):t.status===`success`?(x(),_(g,{key:2,color:`green`},{default:P(()=>[...a[27]||=[e(`mdi-check-circle`,-1)]]),_:1})):(x(),_(g,{key:3,color:`red`},{default:P(()=>[...a[28]||=[e(`mdi-alert-circle`,-1)]]),_:1}))]),_:2},[t.detail?{name:`subtitle`,fn:P(()=>[o(`span`,{class:n(t.status===`failed`?`text-error`:`text-medium-emphasis`)},l(t.detail),3)]),key:`0`}:void 0]),1032,[`title`]))),128))]),_:1})]),_:1})]),_:1})):h(``,!0),S(pe,{modelValue:X.value,"onUpdate:modelValue":a[9]||=e=>X.value=e,"max-width":`600`},{default:P(()=>[S(c,{border:``},{default:P(()=>[S(p,null,{default:P(()=>[...a[29]||=[e(`推送预览`,-1)]]),_:1}),S(u,null,{default:P(()=>[Z.value.error?(x(),_(ge,{key:0,type:`error`,class:`mb-2`},{default:P(()=>[e(l(Z.value.error),1)]),_:1})):(x(),v(`div`,ke,[o(`div`,Ae,[a[30]||=e(`将推送到 `,-1),o(`strong`,null,l(E.value.size),1),a[31]||=e(` 台服务器`,-1)]),Z.value.files?(x(),v(`div`,je,l(Z.value.files)+` 个文件,`+l(Z.value.size),1)):h(``,!0)]))]),_:1}),S(r,null,{default:P(()=>[S(B),S(s,{variant:`text`,onClick:a[7]||=e=>X.value=!1},{default:P(()=>[...a[32]||=[e(`关闭`,-1)]]),_:1}),S(s,{color:`primary`,variant:`flat`,onClick:a[8]||=e=>{X.value=!1,tt()}},{default:P(()=>[...a[33]||=[e(`确认推送`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),S(c,{elevation:`0`,border:``,rounded:`lg`},{default:P(()=>[S(p,null,{default:P(()=>[...a[34]||=[e(`推送历史`,-1)]]),_:1}),S(he,{items:He.value,headers:Ke,"items-length":Ue.value,loading:We.value,page:Ge.value,"items-per-page":15,hover:``,density:`comfortable`,"onUpdate:page":a[10]||=e=>{Ge.value=e,$()}},{"item.status":P(({item:t})=>[S(V,{color:t.status===`success`?`success`:t.status===`failed`?`error`:`warning`,size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:P(()=>[e(l(t.status===`success`?`成功`:t.status===`failed`?`失败`:t.status),1)]),_:2},1032,[`color`])]),"item.created_at":P(({item:e})=>[o(`span`,Me,l(e.created_at),1)]),"no-data":P(()=>[...a[35]||=[o(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`])]),_:1})]),_:1}))}});export{Ne as default};