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