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