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