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