koishi-plugin-oni-sync-bot 0.8.8 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import{defineComponent as I,openBlock as g,createElementBlock as $,createElementVNode as a,ref as O,computed as w,watch as ue,onMounted as tt,resolveComponent as C,createBlock as R,withCtx as c,createVNode as r,unref as m,createTextVNode as N,Fragment as ie,renderList as $e,normalizeClass as D,toDisplayString as B,createCommentVNode as L,reactive as Vt,warn as It,inject as te,isRef as Mt,getCurrentInstance as ce,provide as Bt,renderSlot as be,mergeProps as Pt,Transition as nt,withDirectives as Ne,normalizeStyle as ot,vShow as lt,shallowReactive as Lt,resolveDynamicComponent as Dt,withModifiers as Rt,isVNode as at,render as Ae,resolveDirective as jt}from"vue";import{store as Ft,Time as At,message as Se,send as se}from"@koishijs/client";import{isClient as Ve,useEventListener as Ut,useResizeObserver as Kt,useTimeoutFn as Gt}from"@vueuse/core";/*! Element Plus Icons Vue v2.3.2 */var Ht=I({name:"Bottom",__name:"bottom",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M544 805.888V168a32 32 0 1 0-64 0v637.888L246.656 557.952a30.72 30.72 0 0 0-45.312 0 35.52 35.52 0 0 0 0 48.064l288 306.048a30.72 30.72 0 0 0 45.312 0l288-306.048a35.52 35.52 0 0 0 0-48 30.72 30.72 0 0 0-45.312 0L544 805.824z"})]))}}),qt=Ht,Wt=I({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),Zt=Wt,Jt=I({name:"Close",__name:"close",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),Yt=Jt,Xt=I({name:"InfoFilled",__name:"info-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),Qt=Xt,en=I({name:"Plus",__name:"plus",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z"})]))}}),tn=en,nn=I({name:"Refresh",__name:"refresh",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M771.776 794.88A384 384 0 0 1 128 512h64a320 320 0 0 0 555.712 216.448H654.72a32 32 0 1 1 0-64h149.056a32 32 0 0 1 32 32v148.928a32 32 0 1 1-64 0v-50.56zM276.288 295.616h92.992a32 32 0 0 1 0 64H220.16a32 32 0 0 1-32-32V178.56a32 32 0 0 1 64 0v50.56A384 384 0 0 1 896.128 512h-64a320 320 0 0 0-555.776-216.384z"})]))}}),on=nn,ln=I({name:"SuccessFilled",__name:"success-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),an=ln,sn=I({name:"Top",__name:"top",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z"})]))}}),rn=sn,un=I({name:"WarningFilled",__name:"warning-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),cn=un;const dn={class:"filter-container"},pn={class:"filter-row"},fn={class:"button-group"},mn={key:0,class:"empty-state"},vn="yyyy-MM-dd hh:mm:ss",gn=I({__name:"page",setup(e){const n=O(),t=O("all"),o=O(""),s=O([]);function d(T){const k=At.template(vn,new Date(T.timestamp)),p=T.type.toUpperCase(),x=T.content.replace(/\u001b\[[0-9;]*m/g,"");return`[${k}] [${p}] ${x}`}const i=w(()=>s.value.filter(T=>!T.includes("[ERROR]")&&!T.includes("[WARN]"))),l=w(()=>s.value.filter(T=>T.includes("[ERROR]")||T.includes("[WARN]"))),f=w(()=>{switch(t.value){case"normal":return i.value;case"error":return l.value;default:return s.value}}),b=w(()=>{if(!o.value.trim())return f.value;const T=o.value.toLowerCase();return f.value.filter(k=>k.toLowerCase().includes(T))});function _(T){return T.includes("[ERROR]")?"log-error":T.includes("[WARN]")?"log-warn":T.includes("[INFO]")?"log-info":""}const h=()=>{n.value&&(n.value.scrollTop=0)},S=()=>{n.value&&(n.value.scrollTop=n.value.scrollHeight)};return ue(()=>Ft.onilogs,T=>{T&&(s.value=T.map(d))},{deep:true,immediate:true}),ue(()=>s.value.length,()=>{setTimeout(S,0)}),tt(()=>{S()}),(T,k)=>{const p=C("el-tab-pane"),x=C("el-tabs"),z=C("el-input"),j=C("el-icon"),U=C("el-button"),V=C("k-layout");return g(),R(V,null,{default:c(()=>[a("div",dn,[r(x,{modelValue:t.value,"onUpdate:modelValue":k[0]||(k[0]=M=>t.value=M),class:"log-tabs"},{default:c(()=>[r(p,{name:"all",label:"全部日志"}),r(p,{name:"normal",label:"正常日志"}),r(p,{name:"error",label:"错误/警告"})]),_:1},8,["modelValue"]),a("div",pn,[r(z,{modelValue:o.value,"onUpdate:modelValue":k[1]||(k[1]=M=>o.value=M),placeholder:"搜索日志内容...",clearable:"",class:"filter-input"},null,8,["modelValue"]),a("div",fn,[r(U,{size:"small",onClick:h},{default:c(()=>[r(j,null,{default:c(()=>[r(m(rn))]),_:1}),k[2]||(k[2]=N(" 顶部 ",-1))]),_:1}),r(U,{size:"small",onClick:S},{default:c(()=>[r(j,null,{default:c(()=>[r(m(qt))]),_:1}),k[3]||(k[3]=N(" 底部 ",-1))]),_:1})])])]),a("div",{class:"log-container",ref_key:"scrollRef",ref:n},[(g(true),$(ie,null,$e(b.value,(M,q)=>(g(),$("div",{key:q,class:"log-line"},[a("pre",{class:D(_(M))},B(M),3)]))),128)),b.value.length===0?(g(),$("div",mn,[...k[4]||(k[4]=[a("p",null,"暂无日志",-1)])])):L("v-if",true)],512)]),_:1})}}}),fe=(e,n)=>{const t=e.__vccOpts||e;for(const[o,s]of n)t[o]=s;return t},_n=fe(gn,[["__scopeId","data-v-62639236"]]),st=10,yn=2e4,hn=1.33,H={steamEngine:2e3,oilEngine:200,hydrogenEngine:500,biodieselEngine:200,CommandModule:200,RoboPilotCommandModule:200,SolidBooster:1e3,LiquidFuelTank:100,OxidizerTank:100,OxidizerTankLiquid:100,CargoBay:2e3,GasCargoBay:2e3,LiquidCargoBay:2e3,SpecialCargoBay:2e3,TouristModule:200,ResearchModule:200,person:30},ge={steam:20,oil:40,hydrogen:60,biodiesel:50,booster:12e3},ke={steam:900,fuel:900,oxygen:2700},bn={steam:"steamEngine",oil:"oilEngine",hydrogen:"hydrogenEngine",biodiesel:"biodieselEngine"},Cn={ResearchModule:"研究舱",CargoBay:"固体货舱",GasCargoBay:"气体货舱",LiquidCargoBay:"液体货舱",SpecialCargoBay:"生物货舱",TouristModule:"观光舱",RoboPilotCommandModule:"机器驾驶舱"};function rt(e){return Math.ceil(Math.max(e,Math.pow(e/300,3.2)))}function wn(e){const n={};for(const[t,o]of Object.entries(e))typeof o=="number"&&o>=0&&(n[t]=o);return n}function xn(e){let n=H.CommandModule;for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n+=(H[t]||0)*e[t]);return n}function Oe(e){return e.length===0?[]:(e.sort((n,t)=>n.weight-t.weight),[e[0]])}function Sn(e,n){e+=H.steamEngine;const t=[];for(let o=0;o<=st;o++){const s=e+H.SolidBooster*o,d=ge.booster*o;for(let i=0;i<=ke.steam;i++){const l=s+i,f=d+ge.steam*i,b=rt(l),_=f-b;if(_>=n){t.push({capacity:i,booster:o,weight:l,mergedDistance:f,punish:b,finalDistance:_});break}}}return Oe(t)}function Tn(e,n,t,o,s,d,i,l){const f=Math.ceil(e/ke.fuel),b=Math.ceil(e/ke.oxygen),_=l==="liquid"?H.OxidizerTankLiquid:H.OxidizerTank,h=t+H.LiquidFuelTank*f+_*b,S=e*2,T=h+S,k=Math.floor(o+s*e*d),p=rt(T),x=k-p;return x<i?{isValid:false}:{isValid:true,solution:{capacity:e,booster:n,fuelCount:f,oxygenCount:b,dryWeight:h,wetWeight:S,weight:T,mergedDistance:k,punish:p,finalDistance:x}}}function $n(e,n,t,o,s){const d=ge[e],i=o==="liquid"?hn:1;n+=H[bn[e]];const l=[];for(let f=0;f<=st;f++){const b=n+H.SolidBooster*f,_=ge.booster*f;for(let h=0;h<=yn;h+=10){const S=Tn(h,f,b,_,d,i,t,o);if(S.isValid){l.push(S.solution);break}}}if(l.length===0)return[];if(!s){const f=new Map;for(const b of l){const _=b.fuelCount;(!f.has(_)||f.get(_).weight>b.weight)&&f.set(_,b)}return Oe(Array.from(f.values()))}return Oe(l)}function kn(e){const{type:n,distance:t,oxygenType:o,allowWaste:s,...d}=e,i=wn(d),l=xn(i);return n==="steam"?Sn(l,t):$n(n,l,t,o,s)}const On={class:"rocket-calculator sci-fi-bg"},En={class:"content-layout"},zn={class:"config-section"},Nn={class:"distance-control"},Vn={class:"distance-step-selector"},In={class:"distance-input-wrapper"},Mn={class:"distance-value"},Bn={class:"oxidizer-hint"},Pn={class:"config-section"},Ln={class:"modules-grid"},Dn={class:"module-header"},Rn={class:"module-name"},jn={key:0,class:"empty-state"},Fn={key:1,class:"empty-state"},An={class:"key-stats"},Un={class:"stat-item primary"},Kn={class:"stat-value"},Gn={class:"stat-item success"},Hn={class:"stat-value"},qn={class:"stat-item warning"},Wn={class:"stat-value"},Zn={class:"detail-stats"},Jn={class:"detail-grid"},Yn={class:"detail-item"},Xn={class:"detail-label"},Qn={class:"detail-value"},eo={class:"detail-item"},to={class:"detail-value"},no={key:0,class:"detail-item"},oo={class:"detail-value"},lo={key:1,class:"detail-item"},ao={class:"detail-value"},so={class:"data-table-section"},ro={class:"table-wrapper"},io=I({__name:"calculator",setup(e){const n=w(()=>{const i=[];for(let l=1e4;l<=19e4;l+=1e4)i.push(l);return i}),t=Vt({type:"steam",distance:1e4,oxygenType:"solid",allowWaste:false,ResearchModule:0,CargoBay:0,GasCargoBay:0,LiquidCargoBay:0,SpecialCargoBay:0,TouristModule:0,RoboPilotCommandModule:0}),o=O(null),s=()=>{try{const i=kn(t);o.value=i,i.length>0?Se.success("解算完成!已收敛到最优解"):Se.warning("解算失败,无解空间")}catch(i){Se.error("解算器异常"),console.error(i)}},d=()=>{t.type="steam",t.distance=1e4,t.oxygenType="solid",t.ResearchModule=0,t.CargoBay=0,t.GasCargoBay=0,t.LiquidCargoBay=0,t.SpecialCargoBay=0,t.TouristModule=0,t.RoboPilotCommandModule=0,o.value=null};return(i,l)=>{const f=C("el-option"),b=C("el-select"),_=C("el-form-item"),h=C("el-button"),S=C("el-radio-button"),T=C("el-radio-group"),k=C("el-form"),p=C("el-input-number"),x=C("k-card"),z=C("el-divider"),j=C("el-table-column"),U=C("el-table");return g(),$("div",On,[L(" 背景装饰网格 "),l[32]||(l[32]=a("div",{class:"grid-overlay"},null,-1)),r(x,{class:"header-card sci-fi-card"},{default:c(()=>[l[29]||(l[29]=a("div",{class:"header-glow"},null,-1)),l[30]||(l[30]=a("h1",{class:"sci-fi-title"},"ONI ROCKET CALCULATOR",-1)),l[31]||(l[31]=a("p",{class:"sci-fi-subtitle"},"缺氧火箭最优配置解算系统 · 基于官方物理引擎",-1)),a("div",En,[L(" 输入控制台 "),r(x,{class:"form-card sci-fi-card"},{default:c(()=>[l[9]||(l[9]=a("div",{class:"card-header-line"},null,-1)),L(" 主配置 "),a("div",zn,[l[6]||(l[6]=a("h3",{class:"section-title"},"【核心参数】",-1)),r(k,{model:t,size:"large",class:"sci-fi-form","label-position":"top"},{default:c(()=>[r(_,{label:"引擎类型"},{default:c(()=>[r(b,{modelValue:t.type,"onUpdate:modelValue":l[0]||(l[0]=V=>t.type=V),style:{width:"100%"},class:"sci-fi-select"},{default:c(()=>[r(f,{label:"蒸汽引擎",value:"steam"}),r(f,{label:"石油引擎",value:"oil"}),r(f,{label:"液氢引擎",value:"hydrogen"}),r(f,{label:"生物柴油引擎",value:"biodiesel"})]),_:1},8,["modelValue"])]),_:1}),r(_,{label:"目标轨道"},{default:c(()=>[a("div",Nn,[L(" 10000km 一档的步进选择器 "),a("div",Vn,[(g(true),$(ie,null,$e(n.value,V=>(g(),R(h,{key:V,class:D(["step-btn",{active:t.distance===V}]),onClick:M=>t.distance=V},{default:c(()=>[N(B(V/1e3)+"k ",1)]),_:2},1032,["class","onClick"]))),128))]),a("div",In,[l[2]||(l[2]=a("span",{class:"distance-label"},"当前:",-1)),a("span",Mn,B(t.distance.toLocaleString()),1),l[3]||(l[3]=a("span",{class:"unit"},"km",-1))])])]),_:1}),t.type!=="steam"?(g(),R(_,{key:0,label:"氧化剂"},{default:c(()=>[r(T,{modelValue:t.oxygenType,"onUpdate:modelValue":l[1]||(l[1]=V=>t.oxygenType=V),class:"sci-fi-radio-group"},{default:c(()=>[r(S,{label:"solid"},{default:c(()=>[...l[4]||(l[4]=[N("氧石",-1)])]),_:1}),r(S,{label:"liquid"},{default:c(()=>[...l[5]||(l[5]=[N("液氧",-1)])]),_:1})]),_:1},8,["modelValue"]),a("div",Bn,[a("span",{class:D(["hint-item",{active:t.oxygenType==="solid"}])},"1.0x 效率",2),a("span",{class:D(["hint-item",{active:t.oxygenType==="liquid"}])},"1.33x 效率",2)])]),_:1})):L("v-if",true)]),_:1},8,["model"])]),l[10]||(l[10]=a("div",{class:"divider-line"},null,-1)),L(" 可选模块 "),a("div",Pn,[l[8]||(l[8]=a("h3",{class:"section-title"},"【载荷配置】",-1)),r(k,{model:t,size:"large",class:"modules-form","label-position":"top"},{default:c(()=>[a("div",Ln,[(g(true),$(ie,null,$e(m(Cn),(V,M)=>(g(),$("div",{key:M,class:"module-item"},[a("div",Dn,[a("span",Rn,B(V),1)]),r(p,{modelValue:t[M],"onUpdate:modelValue":q=>t[M]=q,min:0,max:20,class:"module-input"},null,8,["modelValue","onUpdate:modelValue"])]))),128))]),r(_,{class:"calculate-btn-wrapper"},{default:c(()=>[r(h,{onClick:s,class:"sci-fi-calculate-btn"},{default:c(()=>[...l[7]||(l[7]=[a("span",{class:"btn-text"},"▶ 执行解算",-1),a("span",{class:"btn-glow"},null,-1)])]),_:1})]),_:1})]),_:1},8,["model"])])]),_:1}),L(" 结果显示面板 "),r(x,{class:"result-card sci-fi-card"},{default:c(()=>[l[28]||(l[28]=a("div",{class:"card-header-line"},null,-1)),o.value?o.value.length===0?(g(),$("div",Fn,[l[13]||(l[13]=a("div",{class:"empty-icon"},"⚠️",-1)),l[14]||(l[14]=a("p",{class:"empty-text error"},"解算失败",-1)),l[15]||(l[15]=a("p",{class:"empty-hint"},"无法找到满足条件的配置,请尝试减少载荷",-1)),r(h,{onClick:d,class:"sci-fi-reset-btn"},{default:c(()=>[...l[12]||(l[12]=[N("重置参数",-1)])]),_:1})])):(g(),$(ie,{key:2},[l[27]||(l[27]=a("div",{class:"result-header"},[a("h3",{class:"result-title"},"✅ 最优解算结果"),a("div",{class:"result-status"},[a("span",{class:"status-dot"}),a("span",null,"CONVERGED")])],-1)),a("div",An,[a("div",Un,[l[17]||(l[17]=a("div",{class:"stat-label"},"总起飞重量",-1)),a("div",Kn,[N(B(o.value[0].weight.toLocaleString())+" ",1),l[16]||(l[16]=a("span",{class:"stat-unit"},"kg",-1))])]),a("div",Gn,[l[19]||(l[19]=a("div",{class:"stat-label"},"预计射程",-1)),a("div",Hn,[N(B(o.value[0].finalDistance.toLocaleString())+" ",1),l[18]||(l[18]=a("span",{class:"stat-unit"},"km",-1))])]),a("div",qn,[l[21]||(l[21]=a("div",{class:"stat-label"},"质量惩罚",-1)),a("div",Wn,[N(B(o.value[0].punish.toLocaleString())+" ",1),l[20]||(l[20]=a("span",{class:"stat-unit"},"km",-1))])])]),r(z,{class:"sci-fi-divider"}),a("div",Zn,[l[25]||(l[25]=a("h4",{class:"detail-title"},"【配置详情】",-1)),a("div",Jn,[a("div",Yn,[a("span",Xn,B(t.type==="steam"?"蒸汽填充量":"燃料填充量"),1),a("span",Qn,B(o.value[0].capacity.toLocaleString())+" kg",1)]),a("div",eo,[l[22]||(l[22]=a("span",{class:"detail-label"},"助推器数量",-1)),a("span",to,B(o.value[0].booster)+" 个",1)]),o.value[0].fuelCount!==void 0?(g(),$("div",no,[l[23]||(l[23]=a("span",{class:"detail-label"},"燃料舱数量",-1)),a("span",oo,B(o.value[0].fuelCount)+" 个",1)])):L("v-if",true),o.value[0].oxygenCount!==void 0?(g(),$("div",lo,[l[24]||(l[24]=a("span",{class:"detail-label"},"氧化剂舱数量",-1)),a("span",ao,B(o.value[0].oxygenCount)+" 个",1)])):L("v-if",true)])]),r(z,{class:"sci-fi-divider"}),a("div",so,[l[26]||(l[26]=a("h4",{class:"detail-title"},"【原始数据】",-1)),a("div",ro,[r(U,{data:o.value,stripe:"",class:"sci-fi-table"},{default:c(()=>[r(j,{prop:"weight",label:"总重(kg)",sortable:""}),r(j,{prop:"finalDistance",label:"射程(km)",sortable:""}),r(j,{prop:"booster",label:"助推器"}),r(j,{prop:"fuelCount",label:"燃料舱"}),r(j,{prop:"oxygenCount",label:"氧化剂舱"})]),_:1},8,["data"])])])],64)):(g(),$("div",jn,[...l[11]||(l[11]=[a("div",{class:"scan-line"},null,-1),a("div",{class:"empty-icon"},"📡",-1),a("p",{class:"empty-text"},"等待输入参数...",-1),a("p",{class:"empty-hint"},"请配置核心参数与载荷",-1)])]))]),_:1})])]),_:1})])}}}),uo=fe(io,[["__scopeId","data-v-3e8f9409"]]),co={};function po(e,n){const t=C("k-slot"),o=C("el-scrollbar"),s=C("k-layout");return g(),R(s,null,{default:c(()=>[r(o,{class:"scrollbar"},{default:c(()=>[r(t,{name:"calculator"})]),_:1})]),_:1})}const fo=fe(co,[["render",po],["__scopeId","data-v-7f2607d9"]]),mo={};function vo(e,n){const t=C("k-slot"),o=C("el-scrollbar"),s=C("k-layout");return g(),R(s,null,{default:c(()=>[r(o,{class:"scrollbar"},{default:c(()=>[r(t,{name:"onitodos"})]),_:1})]),_:1})}const go=fe(mo,[["render",vo],["__scopeId","data-v-4a10404d"]]);/**
1
+ import{defineComponent as I,openBlock as g,createElementBlock as $,createElementVNode as a,ref as O,computed as w,watch as he,onMounted as tt,resolveComponent as C,createBlock as R,withCtx as c,createVNode as r,unref as m,createTextVNode as N,Fragment as ie,renderList as $e,normalizeClass as D,toDisplayString as B,createCommentVNode as L,reactive as Vt,warn as It,inject as te,isRef as Mt,getCurrentInstance as ue,provide as Bt,renderSlot as be,mergeProps as Pt,Transition as nt,withDirectives as Ne,normalizeStyle as ot,vShow as lt,shallowReactive as Lt,resolveDynamicComponent as Dt,withModifiers as Rt,isVNode as at,render as Ae,resolveDirective as jt}from"vue";import{store as Ft,Time as At,message as Se,send as se}from"@koishijs/client";import{isClient as Ve,useEventListener as Ut,useResizeObserver as Kt,useTimeoutFn as Gt}from"@vueuse/core";/*! Element Plus Icons Vue v2.3.2 */var Ht=I({name:"Bottom",__name:"bottom",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M544 805.888V168a32 32 0 1 0-64 0v637.888L246.656 557.952a30.72 30.72 0 0 0-45.312 0 35.52 35.52 0 0 0 0 48.064l288 306.048a30.72 30.72 0 0 0 45.312 0l288-306.048a35.52 35.52 0 0 0 0-48 30.72 30.72 0 0 0-45.312 0L544 805.824z"})]))}}),qt=Ht,Wt=I({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),Zt=Wt,Jt=I({name:"Close",__name:"close",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),Yt=Jt,Xt=I({name:"InfoFilled",__name:"info-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),Qt=Xt,en=I({name:"Plus",__name:"plus",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z"})]))}}),tn=en,nn=I({name:"Refresh",__name:"refresh",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M771.776 794.88A384 384 0 0 1 128 512h64a320 320 0 0 0 555.712 216.448H654.72a32 32 0 1 1 0-64h149.056a32 32 0 0 1 32 32v148.928a32 32 0 1 1-64 0v-50.56zM276.288 295.616h92.992a32 32 0 0 1 0 64H220.16a32 32 0 0 1-32-32V178.56a32 32 0 0 1 64 0v50.56A384 384 0 0 1 896.128 512h-64a320 320 0 0 0-555.776-216.384z"})]))}}),on=nn,ln=I({name:"SuccessFilled",__name:"success-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),an=ln,sn=I({name:"Top",__name:"top",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z"})]))}}),rn=sn,un=I({name:"WarningFilled",__name:"warning-filled",setup(e){return(n,t)=>(g(),$("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[a("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),cn=un;const dn={class:"filter-container"},pn={class:"filter-row"},fn={class:"button-group"},mn={key:0,class:"empty-state"},vn="yyyy-MM-dd hh:mm:ss",gn=I({__name:"page",setup(e){const n=O(),t=O("all"),o=O(""),s=O([]);function d(T){const k=At.template(vn,new Date(T.timestamp)),p=T.type.toUpperCase(),x=T.content.replace(/\u001b\[[0-9;]*m/g,"");return`[${k}] [${p}] ${x}`}const i=w(()=>s.value.filter(T=>!T.includes("[ERROR]")&&!T.includes("[WARN]"))),l=w(()=>s.value.filter(T=>T.includes("[ERROR]")||T.includes("[WARN]"))),f=w(()=>{switch(t.value){case"normal":return i.value;case"error":return l.value;default:return s.value}}),b=w(()=>{let T=f.value;if(!o.value.trim())return[...T].reverse();const k=o.value.toLowerCase();return T.filter(p=>p.toLowerCase().includes(k)).reverse()});function _(T){return T.includes("[ERROR]")?"log-error":T.includes("[WARN]")?"log-warn":T.includes("[INFO]")?"log-info":""}const y=()=>{n.value&&(n.value.scrollTop=0)},S=()=>{n.value&&(n.value.scrollTop=n.value.scrollHeight)};return he(()=>Ft.onilogs,T=>{T&&(s.value=T.map(d))},{deep:true,immediate:true}),tt(()=>{y()}),(T,k)=>{const p=C("el-tab-pane"),x=C("el-tabs"),z=C("el-input"),j=C("el-icon"),U=C("el-button"),V=C("k-layout");return g(),R(V,null,{default:c(()=>[a("div",dn,[r(x,{modelValue:t.value,"onUpdate:modelValue":k[0]||(k[0]=M=>t.value=M),class:"log-tabs"},{default:c(()=>[r(p,{name:"all",label:"全部日志"}),r(p,{name:"normal",label:"正常日志"}),r(p,{name:"error",label:"错误/警告"})]),_:1},8,["modelValue"]),a("div",pn,[r(z,{modelValue:o.value,"onUpdate:modelValue":k[1]||(k[1]=M=>o.value=M),placeholder:"搜索日志内容...",clearable:"",class:"filter-input"},null,8,["modelValue"]),a("div",fn,[r(U,{size:"small",onClick:S},{default:c(()=>[r(j,null,{default:c(()=>[r(m(qt))]),_:1}),k[2]||(k[2]=N(" 底部 ",-1))]),_:1}),r(U,{size:"small",onClick:y},{default:c(()=>[r(j,null,{default:c(()=>[r(m(rn))]),_:1}),k[3]||(k[3]=N(" 顶部 ",-1))]),_:1})])])]),a("div",{class:"log-container",ref_key:"scrollRef",ref:n},[(g(true),$(ie,null,$e(b.value,(M,q)=>(g(),$("div",{key:q,class:"log-line"},[a("pre",{class:D(_(M))},B(M),3)]))),128)),b.value.length===0?(g(),$("div",mn,[...k[4]||(k[4]=[a("p",null,"暂无日志",-1)])])):L("v-if",true)],512)]),_:1})}}}),pe=(e,n)=>{const t=e.__vccOpts||e;for(const[o,s]of n)t[o]=s;return t},_n=pe(gn,[["__scopeId","data-v-e5e2df7e"]]),st=10,yn=2e4,hn=1.33,H={steamEngine:2e3,oilEngine:200,hydrogenEngine:500,biodieselEngine:200,CommandModule:200,RoboPilotCommandModule:200,SolidBooster:1e3,LiquidFuelTank:100,OxidizerTank:100,OxidizerTankLiquid:100,CargoBay:2e3,GasCargoBay:2e3,LiquidCargoBay:2e3,SpecialCargoBay:2e3,TouristModule:200,ResearchModule:200,person:30},ve={steam:20,oil:40,hydrogen:60,biodiesel:50,booster:12e3},ke={steam:900,fuel:900,oxygen:2700},bn={steam:"steamEngine",oil:"oilEngine",hydrogen:"hydrogenEngine",biodiesel:"biodieselEngine"},Cn={ResearchModule:"研究舱",CargoBay:"固体货舱",GasCargoBay:"气体货舱",LiquidCargoBay:"液体货舱",SpecialCargoBay:"生物货舱",TouristModule:"观光舱",RoboPilotCommandModule:"机器驾驶舱"};function rt(e){return Math.ceil(Math.max(e,Math.pow(e/300,3.2)))}function wn(e){const n={};for(const[t,o]of Object.entries(e))typeof o=="number"&&o>=0&&(n[t]=o);return n}function xn(e){let n=H.CommandModule;for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n+=(H[t]||0)*e[t]);return n}function Oe(e){return e.length===0?[]:(e.sort((n,t)=>n.weight-t.weight),[e[0]])}function Sn(e,n){e+=H.steamEngine;const t=[];for(let o=0;o<=st;o++){const s=e+H.SolidBooster*o,d=ve.booster*o;for(let i=0;i<=ke.steam;i++){const l=s+i,f=d+ve.steam*i,b=rt(l),_=f-b;if(_>=n){t.push({capacity:i,booster:o,weight:l,mergedDistance:f,punish:b,finalDistance:_});break}}}return Oe(t)}function Tn(e,n,t,o,s,d,i,l){const f=Math.ceil(e/ke.fuel),b=Math.ceil(e/ke.oxygen),_=l==="liquid"?H.OxidizerTankLiquid:H.OxidizerTank,y=t+H.LiquidFuelTank*f+_*b,S=e*2,T=y+S,k=Math.floor(o+s*e*d),p=rt(T),x=k-p;return x<i?{isValid:false}:{isValid:true,solution:{capacity:e,booster:n,fuelCount:f,oxygenCount:b,dryWeight:y,wetWeight:S,weight:T,mergedDistance:k,punish:p,finalDistance:x}}}function $n(e,n,t,o,s){const d=ve[e],i=o==="liquid"?hn:1;n+=H[bn[e]];const l=[];for(let f=0;f<=st;f++){const b=n+H.SolidBooster*f,_=ve.booster*f;for(let y=0;y<=yn;y+=10){const S=Tn(y,f,b,_,d,i,t,o);if(S.isValid){l.push(S.solution);break}}}if(l.length===0)return[];if(!s){const f=new Map;for(const b of l){const _=b.fuelCount;(!f.has(_)||f.get(_).weight>b.weight)&&f.set(_,b)}return Oe(Array.from(f.values()))}return Oe(l)}function kn(e){const{type:n,distance:t,oxygenType:o,allowWaste:s,...d}=e,i=wn(d),l=xn(i);return n==="steam"?Sn(l,t):$n(n,l,t,o,s)}const On={class:"rocket-calculator sci-fi-bg"},En={class:"content-layout"},zn={class:"config-section"},Nn={class:"distance-control"},Vn={class:"distance-step-selector"},In={class:"distance-input-wrapper"},Mn={class:"distance-value"},Bn={class:"oxidizer-hint"},Pn={class:"config-section"},Ln={class:"modules-grid"},Dn={class:"module-header"},Rn={class:"module-name"},jn={key:0,class:"empty-state"},Fn={key:1,class:"empty-state"},An={class:"key-stats"},Un={class:"stat-item primary"},Kn={class:"stat-value"},Gn={class:"stat-item success"},Hn={class:"stat-value"},qn={class:"stat-item warning"},Wn={class:"stat-value"},Zn={class:"detail-stats"},Jn={class:"detail-grid"},Yn={class:"detail-item"},Xn={class:"detail-label"},Qn={class:"detail-value"},eo={class:"detail-item"},to={class:"detail-value"},no={key:0,class:"detail-item"},oo={class:"detail-value"},lo={key:1,class:"detail-item"},ao={class:"detail-value"},so={class:"data-table-section"},ro={class:"table-wrapper"},io=I({__name:"calculator",setup(e){const n=w(()=>{const i=[];for(let l=1e4;l<=19e4;l+=1e4)i.push(l);return i}),t=Vt({type:"steam",distance:1e4,oxygenType:"solid",allowWaste:false,ResearchModule:0,CargoBay:0,GasCargoBay:0,LiquidCargoBay:0,SpecialCargoBay:0,TouristModule:0,RoboPilotCommandModule:0}),o=O(null),s=()=>{try{const i=kn(t);o.value=i,i.length>0?Se.success("解算完成!已收敛到最优解"):Se.warning("解算失败,无解空间")}catch(i){Se.error("解算器异常"),console.error(i)}},d=()=>{t.type="steam",t.distance=1e4,t.oxygenType="solid",t.ResearchModule=0,t.CargoBay=0,t.GasCargoBay=0,t.LiquidCargoBay=0,t.SpecialCargoBay=0,t.TouristModule=0,t.RoboPilotCommandModule=0,o.value=null};return(i,l)=>{const f=C("el-option"),b=C("el-select"),_=C("el-form-item"),y=C("el-button"),S=C("el-radio-button"),T=C("el-radio-group"),k=C("el-form"),p=C("el-input-number"),x=C("k-card"),z=C("el-divider"),j=C("el-table-column"),U=C("el-table");return g(),$("div",On,[L(" 背景装饰网格 "),l[32]||(l[32]=a("div",{class:"grid-overlay"},null,-1)),r(x,{class:"header-card sci-fi-card"},{default:c(()=>[l[29]||(l[29]=a("div",{class:"header-glow"},null,-1)),l[30]||(l[30]=a("h1",{class:"sci-fi-title"},"ONI ROCKET CALCULATOR",-1)),l[31]||(l[31]=a("p",{class:"sci-fi-subtitle"},"缺氧火箭最优配置解算系统 · 基于官方物理引擎",-1)),a("div",En,[L(" 输入控制台 "),r(x,{class:"form-card sci-fi-card"},{default:c(()=>[l[9]||(l[9]=a("div",{class:"card-header-line"},null,-1)),L(" 主配置 "),a("div",zn,[l[6]||(l[6]=a("h3",{class:"section-title"},"【核心参数】",-1)),r(k,{model:t,size:"large",class:"sci-fi-form","label-position":"top"},{default:c(()=>[r(_,{label:"引擎类型"},{default:c(()=>[r(b,{modelValue:t.type,"onUpdate:modelValue":l[0]||(l[0]=V=>t.type=V),style:{width:"100%"},class:"sci-fi-select"},{default:c(()=>[r(f,{label:"蒸汽引擎",value:"steam"}),r(f,{label:"石油引擎",value:"oil"}),r(f,{label:"液氢引擎",value:"hydrogen"}),r(f,{label:"生物柴油引擎",value:"biodiesel"})]),_:1},8,["modelValue"])]),_:1}),r(_,{label:"目标轨道"},{default:c(()=>[a("div",Nn,[L(" 10000km 一档的步进选择器 "),a("div",Vn,[(g(true),$(ie,null,$e(n.value,V=>(g(),R(y,{key:V,class:D(["step-btn",{active:t.distance===V}]),onClick:M=>t.distance=V},{default:c(()=>[N(B(V/1e3)+"k ",1)]),_:2},1032,["class","onClick"]))),128))]),a("div",In,[l[2]||(l[2]=a("span",{class:"distance-label"},"当前:",-1)),a("span",Mn,B(t.distance.toLocaleString()),1),l[3]||(l[3]=a("span",{class:"unit"},"km",-1))])])]),_:1}),t.type!=="steam"?(g(),R(_,{key:0,label:"氧化剂"},{default:c(()=>[r(T,{modelValue:t.oxygenType,"onUpdate:modelValue":l[1]||(l[1]=V=>t.oxygenType=V),class:"sci-fi-radio-group"},{default:c(()=>[r(S,{label:"solid"},{default:c(()=>[...l[4]||(l[4]=[N("氧石",-1)])]),_:1}),r(S,{label:"liquid"},{default:c(()=>[...l[5]||(l[5]=[N("液氧",-1)])]),_:1})]),_:1},8,["modelValue"]),a("div",Bn,[a("span",{class:D(["hint-item",{active:t.oxygenType==="solid"}])},"1.0x 效率",2),a("span",{class:D(["hint-item",{active:t.oxygenType==="liquid"}])},"1.33x 效率",2)])]),_:1})):L("v-if",true)]),_:1},8,["model"])]),l[10]||(l[10]=a("div",{class:"divider-line"},null,-1)),L(" 可选模块 "),a("div",Pn,[l[8]||(l[8]=a("h3",{class:"section-title"},"【载荷配置】",-1)),r(k,{model:t,size:"large",class:"modules-form","label-position":"top"},{default:c(()=>[a("div",Ln,[(g(true),$(ie,null,$e(m(Cn),(V,M)=>(g(),$("div",{key:M,class:"module-item"},[a("div",Dn,[a("span",Rn,B(V),1)]),r(p,{modelValue:t[M],"onUpdate:modelValue":q=>t[M]=q,min:0,max:20,class:"module-input"},null,8,["modelValue","onUpdate:modelValue"])]))),128))]),r(_,{class:"calculate-btn-wrapper"},{default:c(()=>[r(y,{onClick:s,class:"sci-fi-calculate-btn"},{default:c(()=>[...l[7]||(l[7]=[a("span",{class:"btn-text"},"▶ 执行解算",-1),a("span",{class:"btn-glow"},null,-1)])]),_:1})]),_:1})]),_:1},8,["model"])])]),_:1}),L(" 结果显示面板 "),r(x,{class:"result-card sci-fi-card"},{default:c(()=>[l[28]||(l[28]=a("div",{class:"card-header-line"},null,-1)),o.value?o.value.length===0?(g(),$("div",Fn,[l[13]||(l[13]=a("div",{class:"empty-icon"},"⚠️",-1)),l[14]||(l[14]=a("p",{class:"empty-text error"},"解算失败",-1)),l[15]||(l[15]=a("p",{class:"empty-hint"},"无法找到满足条件的配置,请尝试减少载荷",-1)),r(y,{onClick:d,class:"sci-fi-reset-btn"},{default:c(()=>[...l[12]||(l[12]=[N("重置参数",-1)])]),_:1})])):(g(),$(ie,{key:2},[l[27]||(l[27]=a("div",{class:"result-header"},[a("h3",{class:"result-title"},"✅ 最优解算结果"),a("div",{class:"result-status"},[a("span",{class:"status-dot"}),a("span",null,"CONVERGED")])],-1)),a("div",An,[a("div",Un,[l[17]||(l[17]=a("div",{class:"stat-label"},"总起飞重量",-1)),a("div",Kn,[N(B(o.value[0].weight.toLocaleString())+" ",1),l[16]||(l[16]=a("span",{class:"stat-unit"},"kg",-1))])]),a("div",Gn,[l[19]||(l[19]=a("div",{class:"stat-label"},"预计射程",-1)),a("div",Hn,[N(B(o.value[0].finalDistance.toLocaleString())+" ",1),l[18]||(l[18]=a("span",{class:"stat-unit"},"km",-1))])]),a("div",qn,[l[21]||(l[21]=a("div",{class:"stat-label"},"质量惩罚",-1)),a("div",Wn,[N(B(o.value[0].punish.toLocaleString())+" ",1),l[20]||(l[20]=a("span",{class:"stat-unit"},"km",-1))])])]),r(z,{class:"sci-fi-divider"}),a("div",Zn,[l[25]||(l[25]=a("h4",{class:"detail-title"},"【配置详情】",-1)),a("div",Jn,[a("div",Yn,[a("span",Xn,B(t.type==="steam"?"蒸汽填充量":"燃料填充量"),1),a("span",Qn,B(o.value[0].capacity.toLocaleString())+" kg",1)]),a("div",eo,[l[22]||(l[22]=a("span",{class:"detail-label"},"助推器数量",-1)),a("span",to,B(o.value[0].booster)+" 个",1)]),o.value[0].fuelCount!==void 0?(g(),$("div",no,[l[23]||(l[23]=a("span",{class:"detail-label"},"燃料舱数量",-1)),a("span",oo,B(o.value[0].fuelCount)+" 个",1)])):L("v-if",true),o.value[0].oxygenCount!==void 0?(g(),$("div",lo,[l[24]||(l[24]=a("span",{class:"detail-label"},"氧化剂舱数量",-1)),a("span",ao,B(o.value[0].oxygenCount)+" 个",1)])):L("v-if",true)])]),r(z,{class:"sci-fi-divider"}),a("div",so,[l[26]||(l[26]=a("h4",{class:"detail-title"},"【原始数据】",-1)),a("div",ro,[r(U,{data:o.value,stripe:"",class:"sci-fi-table"},{default:c(()=>[r(j,{prop:"weight",label:"总重(kg)",sortable:""}),r(j,{prop:"finalDistance",label:"射程(km)",sortable:""}),r(j,{prop:"booster",label:"助推器"}),r(j,{prop:"fuelCount",label:"燃料舱"}),r(j,{prop:"oxygenCount",label:"氧化剂舱"})]),_:1},8,["data"])])])],64)):(g(),$("div",jn,[...l[11]||(l[11]=[a("div",{class:"scan-line"},null,-1),a("div",{class:"empty-icon"},"📡",-1),a("p",{class:"empty-text"},"等待输入参数...",-1),a("p",{class:"empty-hint"},"请配置核心参数与载荷",-1)])]))]),_:1})])]),_:1})])}}}),uo=pe(io,[["__scopeId","data-v-3e8f9409"]]),co={};function po(e,n){const t=C("k-slot"),o=C("el-scrollbar"),s=C("k-layout");return g(),R(s,null,{default:c(()=>[r(o,{class:"scrollbar"},{default:c(()=>[r(t,{name:"calculator"})]),_:1})]),_:1})}const fo=pe(co,[["render",po],["__scopeId","data-v-7f2607d9"]]),mo={};function vo(e,n){const t=C("k-slot"),o=C("el-scrollbar"),s=C("k-layout");return g(),R(s,null,{default:c(()=>[r(o,{class:"scrollbar"},{default:c(()=>[r(t,{name:"onitodos"})]),_:1})]),_:1})}const go=pe(mo,[["render",vo],["__scopeId","data-v-4a10404d"]]);/**
2
2
  * @vue/shared v3.5.29
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
- **/const _o=Object.prototype.hasOwnProperty,Ue=(e,n)=>_o.call(e,n),_e=e=>typeof e=="function",ye=e=>typeof e=="string",it=e=>e!==null&&typeof e=="object";var yo=typeof global=="object"&&global&&global.Object===Object&&global,ho=typeof self=="object"&&self&&self.Object===Object&&self,Ie=yo||ho||Function("return this")(),ne=Ie.Symbol,ut=Object.prototype,bo=ut.hasOwnProperty,Co=ut.toString,re=ne?ne.toStringTag:void 0;function wo(e){var n=bo.call(e,re),t=e[re];try{e[re]=void 0;var o=true}catch{}var s=Co.call(e);return o&&(n?e[re]=t:delete e[re]),s}var xo=Object.prototype,So=xo.toString;function To(e){return So.call(e)}var $o="[object Null]",ko="[object Undefined]",Ke=ne?ne.toStringTag:void 0;function ct(e){return e==null?e===void 0?ko:$o:Ke&&Ke in Object(e)?wo(e):To(e)}function Oo(e){return e!=null&&typeof e=="object"}var Eo="[object Symbol]";function Me(e){return typeof e=="symbol"||Oo(e)&&ct(e)==Eo}function zo(e,n){for(var t=-1,o=e==null?0:e.length,s=Array(o);++t<o;)s[t]=n(e[t],t,e);return s}var Be=Array.isArray,Ge=ne?ne.prototype:void 0,He=Ge?Ge.toString:void 0;function dt(e){if(typeof e=="string")return e;if(Be(e))return zo(e,dt)+"";if(Me(e))return He?He.call(e):"";var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function pt(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var No="[object AsyncFunction]",Vo="[object Function]",Io="[object GeneratorFunction]",Mo="[object Proxy]";function Bo(e){if(!pt(e))return false;var n=ct(e);return n==Vo||n==Io||n==No||n==Mo}var Te=Ie["__core-js_shared__"],qe=function(){var e=/[^.]+$/.exec(Te&&Te.keys&&Te.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Po(e){return!!qe&&qe in e}var Lo=Function.prototype,Do=Lo.toString;function Ro(e){if(e!=null){try{return Do.call(e)}catch{}try{return e+""}catch{}}return""}var jo=/[\\^$.*+?()[\]{}|]/g,Fo=/^\[object .+?Constructor\]$/,Ao=Function.prototype,Uo=Object.prototype,Ko=Ao.toString,Go=Uo.hasOwnProperty,Ho=RegExp("^"+Ko.call(Go).replace(jo,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function qo(e){if(!pt(e)||Po(e))return false;var n=Bo(e)?Ho:Fo;return n.test(Ro(e))}function Wo(e,n){return e==null?void 0:e[n]}function ft(e,n){var t=Wo(e,n);return qo(t)?t:void 0}function Zo(e,n){return e===n||e!==e&&n!==n}var Jo=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yo=/^\w*$/;function Xo(e,n){if(Be(e))return false;var t=typeof e;return t=="number"||t=="symbol"||t=="boolean"||e==null||Me(e)?true:Yo.test(e)||!Jo.test(e)||n!=null&&e in Object(n)}var de=ft(Object,"create");function Qo(){this.__data__=de?de(null):{},this.size=0}function el(e){var n=this.has(e)&&delete this.__data__[e];return this.size-=n?1:0,n}var tl="__lodash_hash_undefined__",nl=Object.prototype,ol=nl.hasOwnProperty;function ll(e){var n=this.__data__;if(de){var t=n[e];return t===tl?void 0:t}return ol.call(n,e)?n[e]:void 0}var al=Object.prototype,sl=al.hasOwnProperty;function rl(e){var n=this.__data__;return de?n[e]!==void 0:sl.call(n,e)}var il="__lodash_hash_undefined__";function ul(e,n){var t=this.__data__;return this.size+=this.has(e)?0:1,t[e]=de&&n===void 0?il:n,this}function Q(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}Q.prototype.clear=Qo;Q.prototype.delete=el;Q.prototype.get=ll;Q.prototype.has=rl;Q.prototype.set=ul;function cl(){this.__data__=[],this.size=0}function Ce(e,n){for(var t=e.length;t--;)if(Zo(e[t][0],n))return t;return-1}var dl=Array.prototype,pl=dl.splice;function fl(e){var n=this.__data__,t=Ce(n,e);if(t<0)return false;var o=n.length-1;return t==o?n.pop():pl.call(n,t,1),--this.size,true}function ml(e){var n=this.__data__,t=Ce(n,e);return t<0?void 0:n[t][1]}function vl(e){return Ce(this.__data__,e)>-1}function gl(e,n){var t=this.__data__,o=Ce(t,e);return o<0?(++this.size,t.push([e,n])):t[o][1]=n,this}function le(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}le.prototype.clear=cl;le.prototype.delete=fl;le.prototype.get=ml;le.prototype.has=vl;le.prototype.set=gl;var _l=ft(Ie,"Map");function yl(){this.size=0,this.__data__={hash:new Q,map:new(_l||le),string:new Q}}function hl(e){var n=typeof e;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?e!=="__proto__":e===null}function we(e,n){var t=e.__data__;return hl(n)?t[typeof n=="string"?"string":"hash"]:t.map}function bl(e){var n=we(this,e).delete(e);return this.size-=n?1:0,n}function Cl(e){return we(this,e).get(e)}function wl(e){return we(this,e).has(e)}function xl(e,n){var t=we(this,e),o=t.size;return t.set(e,n),this.size+=t.size==o?0:1,this}function ee(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}ee.prototype.clear=yl;ee.prototype.delete=bl;ee.prototype.get=Cl;ee.prototype.has=wl;ee.prototype.set=xl;var Sl="Expected a function";function Pe(e,n){if(typeof e!="function"||n!=null&&typeof n!="function")throw new TypeError(Sl);var t=function(){var o=arguments,s=n?n.apply(this,o):o[0],d=t.cache;if(d.has(s))return d.get(s);var i=e.apply(this,o);return t.cache=d.set(s,i)||d,i};return t.cache=new(Pe.Cache||ee),t}Pe.Cache=ee;var Tl=500;function $l(e){var n=Pe(e,function(o){return t.size===Tl&&t.clear(),o}),t=n.cache;return n}var kl=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ol=/\\(\\)?/g,El=$l(function(e){var n=[];return e.charCodeAt(0)===46&&n.push(""),e.replace(kl,function(t,o,s,d){n.push(s?d.replace(Ol,"$1"):o||t)}),n});function zl(e){return e==null?"":dt(e)}function Nl(e,n){return Be(e)?e:Xo(e,n)?[e]:El(zl(e))}function Vl(e){if(typeof e=="string"||Me(e))return e;var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function Il(e,n){n=Nl(n,e);for(var t=0,o=n.length;e!=null&&t<o;)e=e[Vl(n[t++])];return t&&t==o?e:void 0}function Ml(e,n,t){var o=e==null?void 0:Il(e,n);return o===void 0?t:o}function Bl(e){for(var n=-1,t=e==null?0:e.length,o={};++n<t;){var s=e[n];o[s[0]]=s[1]}return o}const Pl=e=>e===void 0,pe=e=>typeof e=="number",Ll=e=>typeof Element>"u"?false:e instanceof Element,Dl=e=>ye(e)?!Number.isNaN(Number(e)):false,We=e=>Object.keys(e);function Ee(e,n="px"){if(!e)return"";if(pe(e)||Dl(e))return`${e}${n}`;if(ye(e))return e}const mt="__epPropKey",F=e=>e,Rl=e=>it(e)&&!!e[mt],vt=(e,n)=>{if(!it(e)||Rl(e))return e;const{values:t,required:o,default:s,type:d,validator:i}=e,f={type:d,required:!!o,validator:t||i?b=>{let _=false,h=[];if(t&&(h=Array.from(t),Ue(e,"default")&&h.push(s),_||(_=h.includes(b))),i&&(_||(_=i(b))),!_&&h.length>0){const S=[...new Set(h)].map(T=>JSON.stringify(T)).join(", ");It(`Invalid prop: validation failed${n?` for prop "${n}"`:""}. Expected one of [${S}], got value ${JSON.stringify(b)}.`)}return _}:void 0,[mt]:true};return Ue(e,"default")&&(f.default=s),f},me=e=>Bl(Object.entries(e).map(([n,t])=>[n,vt(t,n)])),jl=F([String,Object,Function]),Fl={Close:Yt},Ze={success:an,warning:cn,error:Zt,info:Qt},gt=(e,n)=>(e.install=t=>{for(const o of[e,...Object.values({})])t.component(o.name,o)},e),Al=(e,n)=>(e.install=t=>{e._context=t._context,t.config.globalProperties[n]=e},e),Ul={esc:"Escape"},Kl=["","default","small","large"],Gl=e=>e,Je=({from:e,replacement:n,scope:t,version:o,ref:s,type:d="API"},i)=>{ue(()=>m(i),l=>{},{immediate:true})};var Hl={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const ql=e=>(n,t)=>Wl(n,t,m(e)),Wl=(e,n,t)=>Ml(t,e,e).replace(/\{(\w+)\}/g,(o,s)=>{var d;return`${(d=n==null?void 0:n[s])!=null?d:`{${s}}`}`}),Zl=e=>{const n=w(()=>m(e).name),t=Mt(e)?e:O(e);return{lang:n,locale:t,t:ql(e)}},_t=Symbol("localeContextKey"),Jl=e=>{const n=e||te(_t,O());return Zl(w(()=>n.value||Hl))},ve="el",Yl="is-",X=(e,n,t,o,s)=>{let d=`${e}-${n}`;return t&&(d+=`-${t}`),o&&(d+=`__${o}`),s&&(d+=`--${s}`),d},yt=Symbol("namespaceContextKey"),Xl=e=>{const n=e||(ce()?te(yt,O(ve)):O(ve));return w(()=>m(n)||ve)},Le=(e,n)=>{const t=Xl(n);return{namespace:t,b:(p="")=>X(t.value,e,p,"",""),e:p=>p?X(t.value,e,"",p,""):"",m:p=>p?X(t.value,e,"","",p):"",be:(p,x)=>p&&x?X(t.value,e,p,x,""):"",em:(p,x)=>p&&x?X(t.value,e,"",p,x):"",bm:(p,x)=>p&&x?X(t.value,e,p,"",x):"",bem:(p,x,z)=>p&&x&&z?X(t.value,e,p,x,z):"",is:(p,...x)=>{const z=x.length>=1?x[0]:true;return p&&z?`${Yl}${p}`:""},cssVar:p=>{const x={};for(const z in p)p[z]&&(x[`--${t.value}-${z}`]=p[z]);return x},cssVarName:p=>`--${t.value}-${p}`,cssVarBlock:p=>{const x={};for(const z in p)p[z]&&(x[`--${t.value}-${e}-${z}`]=p[z]);return x},cssVarBlockName:p=>`--${t.value}-${e}-${p}`}},Ye={current:0},Xe=O(0),ht=2e3,Qe=Symbol("elZIndexContextKey"),bt=Symbol("zIndexContextKey"),Ql=e=>{const n=ce()?te(Qe,Ye):Ye,t=e||(ce()?te(bt,void 0):void 0),o=w(()=>{const i=m(t);return pe(i)?i:ht}),s=w(()=>o.value+Xe.value),d=()=>(n.current++,Xe.value=n.current,s.value);return!Ve&&te(Qe),{initialZIndex:o,currentZIndex:s,nextZIndex:d}},ea=vt({type:String,values:Kl,required:false}),ta=Symbol("size"),na=Symbol("emptyValuesContextKey"),oa=me({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>_e(e)?!e():!e}}),Ct=Symbol(),he=O();function wt(e,n=void 0){return ce()?te(Ct,he):he}function la(e,n){const t=wt(),o=Le(e,w(()=>{var l;return((l=t.value)==null?void 0:l.namespace)||ve})),s=Jl(w(()=>{var l;return(l=t.value)==null?void 0:l.locale})),d=Ql(w(()=>{var l;return((l=t.value)==null?void 0:l.zIndex)||ht})),i=w(()=>{var l;return m(n)||((l=t.value)==null?void 0:l.size)||""});return xt(w(()=>m(t)||{})),{ns:o,locale:s,zIndex:d,size:i}}const xt=(e,n,t=false)=>{var o;const s=!!ce(),d=s?wt():void 0,i=(o=void 0)!=null?o:s?Bt:void 0;if(!i)return;const l=w(()=>{const f=m(e);return d!=null&&d.value?aa(d.value,f):f});return i(Ct,l),i(_t,w(()=>l.value.locale)),i(yt,w(()=>l.value.namespace)),i(bt,w(()=>l.value.zIndex)),i(ta,{size:w(()=>l.value.size||"")}),i(na,w(()=>({emptyValues:l.value.emptyValues,valueOnClear:l.value.valueOnClear}))),(t||!he.value)&&(he.value=l.value),l},aa=(e,n)=>{const t=[...new Set([...We(e),...We(n)])],o={};for(const s of t)o[s]=n[s]!==void 0?n[s]:e[s];return o},sa=me({a11y:{type:Boolean,default:true},locale:{type:F(Object)},size:ea,button:{type:F(Object)},experimentalFeatures:{type:F(Object)},keyboardNavigation:{type:Boolean,default:true},message:{type:F(Object)},zIndex:Number,namespace:{type:String,default:"el"},...oa}),ze={};I({name:"ElConfigProvider",props:sa,setup(e,{slots:n}){ue(()=>e.message,o=>{Object.assign(ze,o??{})},{immediate:true,deep:true});const t=xt(e);return()=>be(n,"default",{config:t==null?void 0:t.value})}});var De=(e,n)=>{const t=e.__vccOpts||e;for(const[o,s]of n)t[o]=s;return t};const ra=me({size:{type:F([Number,String])},color:{type:String}}),ia=I({name:"ElIcon",inheritAttrs:false}),ua=I({...ia,props:ra,setup(e){const n=e,t=Le("icon"),o=w(()=>{const{size:s,color:d}=n;return!s&&!d?{}:{fontSize:Pl(s)?void 0:Ee(s),"--color":d}});return(s,d)=>(g(),$("i",Pt({class:m(t).b(),style:m(o)},s.$attrs),[be(s.$slots,"default")],16))}});var ca=De(ua,[["__file","icon.vue"]]);const et=gt(ca),da=me({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:true},color:String,dotStyle:{type:F([String,Object,Array])},badgeStyle:{type:F([String,Object,Array])},offset:{type:F(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),pa=["textContent"],fa=I({name:"ElBadge"}),ma=I({...fa,props:da,setup(e,{expose:n}){const t=e,o=Le("badge"),s=w(()=>t.isDot?"":pe(t.value)&&pe(t.max)?t.max<t.value?`${t.max}+`:t.value===0&&!t.showZero?"":`${t.value}`:`${t.value}`),d=w(()=>{var i,l,f,b,_,h;return[{backgroundColor:t.color,marginRight:Ee(-((l=(i=t.offset)==null?void 0:i[0])!=null?l:0)),marginTop:Ee((b=(f=t.offset)==null?void 0:f[1])!=null?b:0)},(_=t.dotStyle)!=null?_:{},(h=t.badgeStyle)!=null?h:{}]});return Je({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},w(()=>!!t.dotStyle)),Je({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},w(()=>!!t.dotClass)),n({content:s}),(i,l)=>(g(),$("div",{class:D(m(o).b())},[be(i.$slots,"default"),r(nt,{name:`${m(o).namespace.value}-zoom-in-center`,persisted:""},{default:c(()=>[Ne(a("sup",{class:D([m(o).e("content"),m(o).em("content",i.type),m(o).is("fixed",!!i.$slots.default),m(o).is("dot",i.isDot),i.dotClass,i.badgeClass]),style:ot(m(d)),textContent:B(m(s))},null,14,pa),[[lt,!i.hidden&&(m(s)||i.isDot)]])]),_:1},8,["name"])],2))}});var va=De(ma,[["__file","badge.vue"]]);const ga=gt(va),St=["success","info","warning","error"],P=Gl({customClass:"",center:false,dangerouslyUseHTMLString:false,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:false,type:"info",plain:false,offset:16,zIndex:0,grouping:false,repeatNum:1,appendTo:Ve?document.body:void 0}),_a=me({customClass:{type:String,default:P.customClass},center:{type:Boolean,default:P.center},dangerouslyUseHTMLString:{type:Boolean,default:P.dangerouslyUseHTMLString},duration:{type:Number,default:P.duration},icon:{type:jl,default:P.icon},id:{type:String,default:P.id},message:{type:F([String,Object,Function]),default:P.message},onClose:{type:F(Function),default:P.onClose},showClose:{type:Boolean,default:P.showClose},type:{type:String,values:St,default:P.type},plain:{type:Boolean,default:P.plain},offset:{type:Number,default:P.offset},zIndex:{type:Number,default:P.zIndex},grouping:{type:Boolean,default:P.grouping},repeatNum:{type:Number,default:P.repeatNum}}),ya={destroy:()=>true},A=Lt([]),ha=e=>{const n=A.findIndex(s=>s.id===e),t=A[n];let o;return n>0&&(o=A[n-1]),{current:t,prev:o}},ba=e=>{const{prev:n}=ha(e);return n?n.vm.exposed.bottom.value:0},Ca=(e,n)=>A.findIndex(o=>o.id===e)>0?16:n,wa=["id"],xa=["innerHTML"],Sa=I({name:"ElMessage"}),Ta=I({...Sa,props:_a,emits:ya,setup(e,{expose:n}){const t=e,{Close:o}=Fl,{ns:s,zIndex:d}=la("message"),{currentZIndex:i,nextZIndex:l}=d,f=O(),b=O(false),_=O(0);let h;const S=w(()=>t.type?t.type==="error"?"danger":t.type:"info"),T=w(()=>{const E=t.type;return{[s.bm("icon",E)]:E&&Ze[E]}}),k=w(()=>t.icon||Ze[t.type]||""),p=w(()=>ba(t.id)),x=w(()=>Ca(t.id,t.offset)+p.value),z=w(()=>_.value+x.value),j=w(()=>({top:`${x.value}px`,zIndex:i.value}));function U(){t.duration!==0&&({stop:h}=Gt(()=>{M()},t.duration))}function V(){h==null||h()}function M(){b.value=false}function q({code:E}){E===Ul.esc&&M()}return tt(()=>{U(),l(),b.value=true}),ue(()=>t.repeatNum,()=>{V(),U()}),Ut(document,"keydown",q),Kt(f,()=>{_.value=f.value.getBoundingClientRect().height}),n({visible:b,bottom:z,close:M}),(E,ae)=>(g(),R(nt,{name:m(s).b("fade"),onBeforeLeave:E.onClose,onAfterLeave:ae[0]||(ae[0]=y=>E.$emit("destroy")),persisted:""},{default:c(()=>[Ne(a("div",{id:E.id,ref_key:"messageRef",ref:f,class:D([m(s).b(),{[m(s).m(E.type)]:E.type},m(s).is("center",E.center),m(s).is("closable",E.showClose),m(s).is("plain",E.plain),E.customClass]),style:ot(m(j)),role:"alert",onMouseenter:V,onMouseleave:U},[E.repeatNum>1?(g(),R(m(ga),{key:0,value:E.repeatNum,type:m(S),class:D(m(s).e("badge"))},null,8,["value","type","class"])):L("v-if",true),m(k)?(g(),R(m(et),{key:1,class:D([m(s).e("icon"),m(T)])},{default:c(()=>[(g(),R(Dt(m(k))))]),_:1},8,["class"])):L("v-if",true),be(E.$slots,"default",{},()=>[E.dangerouslyUseHTMLString?(g(),$(ie,{key:1},[L(" Caution here, message could've been compromised, never use user's input as message "),a("p",{class:D(m(s).e("content")),innerHTML:E.message},null,10,xa)],2112)):(g(),$("p",{key:0,class:D(m(s).e("content"))},B(E.message),3))]),E.showClose?(g(),R(m(et),{key:2,class:D(m(s).e("closeBtn")),onClick:Rt(M,["stop"])},{default:c(()=>[r(m(o))]),_:1},8,["class","onClick"])):L("v-if",true)],46,wa),[[lt,b.value]])]),_:3},8,["name","onBeforeLeave"]))}});var $a=De(Ta,[["__file","message.vue"]]);let ka=1;const Tt=e=>{const n=!e||ye(e)||at(e)||_e(e)?{message:e}:e,t={...P,...n};if(!t.appendTo)t.appendTo=document.body;else if(ye(t.appendTo)){let o=document.querySelector(t.appendTo);Ll(o)||(o=document.body),t.appendTo=o}return t},Oa=e=>{const n=A.indexOf(e);if(n===-1)return;A.splice(n,1);const{handler:t}=e;t.close()},Ea=({appendTo:e,...n},t)=>{const o=`message_${ka++}`,s=n.onClose,d=document.createElement("div"),i={...n,id:o,onClose:()=>{s==null||s(),Oa(_)},onDestroy:()=>{Ae(null,d)}},l=r($a,i,_e(i.message)||at(i.message)?{default:_e(i.message)?i.message:()=>i.message}:null);l.appContext=t||oe._context,Ae(l,d),e.appendChild(d.firstElementChild);const f=l.component,_={id:o,vnode:l,vm:f,handler:{close:()=>{f.exposed.visible.value=false}},props:l.component.props};return _},oe=(e={},n)=>{if(!Ve)return{close:()=>{}};if(pe(ze.max)&&A.length>=ze.max)return{close:()=>{}};const t=Tt(e);if(t.grouping&&A.length){const s=A.find(({vnode:d})=>{var i;return((i=d.props)==null?void 0:i.message)===t.message});if(s)return s.props.repeatNum+=1,s.props.type=t.type,s.handler}const o=Ea(t,n);return A.push(o),o.handler};St.forEach(e=>{oe[e]=(n={},t)=>{const o=Tt(n);return oe({...o,type:e},t)}});function za(e){for(const n of A)(!e||e===n.props.type)&&n.handler.close()}oe.closeAll=za;oe._context=null;const K=Al(oe,"$message"),Na={class:"todo-app"},Va={class:"todo-container"},Ia={class:"todo-header"},Ma={class:"button-group"},Ba={class:"todo-stats"},Pa={class:"search-filter-section"},La={class:"filter-buttons"},Da={class:"todo-table-card"},Ra={key:1,class:"pagination-section"},ja=I({__name:"todolist",setup(e){const n=O([]),t=O(false),o=O(false),s=O(false),d=O(false),i=O(false),l=O(""),f=O("all"),b=O(1),_=O(8),h=O({title:"",content:"",createdBy:""}),S=O({id:0,title:"",content:"",createdBy:"",completed:false}),T=w(()=>n.value.filter(y=>y.completed).length),k=w(()=>n.value.filter(y=>!y.completed).length),p=w(()=>{let y=n.value;if(f.value==="active"?y=y.filter(u=>!u.completed):f.value==="completed"&&(y=y.filter(u=>u.completed)),l.value.trim()){const u=l.value.toLowerCase().trim();y=y.filter(W=>W.title.toLowerCase().includes(u)||W.content.toLowerCase().includes(u))}return b.value=1,y}),x=w(()=>{const y=(b.value-1)*_.value,u=y+_.value;return p.value.slice(y,u)});function z(y){_.value=y,b.value=1}function j(y){b.value=y}function U(y){return new Date(y).toLocaleString("zh-CN")}function V(){s.value=true,se("onitodos/list").then(y=>{n.value=y,s.value=false,K.success("刷新成功")}).catch(y=>{s.value=false,K.error("刷新失败"),console.error(y)})}se("onitodos/list").then(y=>{n.value=y});async function M(){if(!h.value.title.trim()){K.warning("请输入标题");return}o.value=true;try{await se("onitodos/add",{title:h.value.title,content:h.value.content,createdBy:h.value.createdBy}),K.success("添加成功"),d.value=false,h.value={title:"",content:"",createdBy:""},V()}catch(y){K.error("添加失败"),console.error(y)}finally{o.value=false}}function q(y){S.value={id:y.id,title:y.title,content:y.content,createdBy:y.createdBy,completed:y.completed},i.value=true}async function E(){if(!S.value.title.trim()){K.warning("请输入标题");return}o.value=true;try{await se("onitodos/update",{id:S.value.id,title:S.value.title,content:S.value.content,createdBy:S.value.createdBy,completed:S.value.completed}),K.success("更新成功"),i.value=false,V()}catch(y){K.error("更新失败"),console.error(y)}finally{o.value=false}}async function ae(y,u){try{await se("onitodos/update",{id:y.id,completed:u}),K.success(u?"标记完成成功":"取消完成成功"),V()}catch(W){K.error("操作失败"),console.error(W)}}return(y,u)=>{const W=C("el-icon"),G=C("el-button"),xe=C("el-statistic"),Z=C("el-input"),J=C("el-table-column"),$t=C("el-tag"),kt=C("el-table"),Ot=C("el-empty"),Et=C("el-pagination"),Y=C("el-form-item"),Re=C("el-form"),je=C("el-dialog"),zt=C("el-checkbox"),Nt=jt("loading");return g(),$("div",Na,[u[29]||(u[29]=a("div",{class:"bg-pattern"},null,-1)),a("div",Va,[a("div",Ia,[u[20]||(u[20]=a("h2",{class:"todo-title"},[a("span",{class:"title-dot"},"♦"),a("span",{class:"title-text"},"ONITODO"),a("span",{class:"title-dot"},"♦")],-1)),a("div",Ma,[r(G,{type:"default",class:"cute-btn",onClick:V,loading:s.value},{default:c(()=>[r(W,null,{default:c(()=>[r(m(on))]),_:1}),u[18]||(u[18]=N(" 刷新 ",-1))]),_:1},8,["loading"]),r(G,{type:"primary",class:"cute-btn primary",onClick:u[0]||(u[0]=v=>d.value=true)},{default:c(()=>[r(W,null,{default:c(()=>[r(m(tn))]),_:1}),u[19]||(u[19]=N(" 新增待办 ",-1))]),_:1})])]),a("div",Ba,[r(xe,{title:"总计",value:n.value.length},null,8,["value"]),r(xe,{title:"已完成",value:T.value},null,8,["value"]),r(xe,{title:"未完成",value:k.value},null,8,["value"])]),a("div",Pa,[r(Z,{modelValue:l.value,"onUpdate:modelValue":u[1]||(u[1]=v=>l.value=v),placeholder:"🔍 搜索标题或内容...",class:"search-input cute-input",clearable:""},null,8,["modelValue"]),a("div",La,[a("button",{class:D(["filter-btn",{active:f.value==="all"}]),onClick:u[2]||(u[2]=v=>f.value="all")}," 全部 ",2),a("button",{class:D(["filter-btn",{active:f.value==="active"}]),onClick:u[3]||(u[3]=v=>f.value="active")}," 未完成 ",2),a("button",{class:D(["filter-btn",{active:f.value==="completed"}]),onClick:u[4]||(u[4]=v=>f.value="completed")}," 已完成 ",2)])]),a("div",Da,[Ne((g(),R(kt,{data:x.value,stripe:"",style:{width:"100%"},class:"cute-table"},{default:c(()=>[r(J,{type:"index",label:"id",width:"80"}),r(J,{prop:"title",label:"标题","min-width":"150","show-overflow-tooltip":""},{default:c(({row:v})=>[a("span",{class:D({"completed-text":v.completed})},B(v.title),3)]),_:1}),r(J,{prop:"content",label:"内容","min-width":"150","show-overflow-tooltip":""}),r(J,{prop:"createdBy",label:"创建人",width:"80","show-overflow-tooltip":""}),r(J,{prop:"completed",label:"状态",width:"80"},{default:c(({row:v})=>[r($t,{type:v.completed?"success":"warning",size:"small",class:"cute-tag"},{default:c(()=>[N(B(v.completed?"已完成":"未完成"),1)]),_:2},1032,["type"])]),_:1}),r(J,{prop:"createdAt",label:"创建时间",width:"180"},{default:c(({row:v})=>[N(B(U(v.createdAt)),1)]),_:1}),r(J,{label:"操作",width:"150",fixed:"right"},{default:c(({row:v})=>[v.completed?(g(),R(G,{key:1,size:"small",type:"warning",class:"cute-btn",onClick:Fe=>ae(v,false)},{default:c(()=>[...u[22]||(u[22]=[N(" 取消 ",-1)])]),_:1},8,["onClick"])):(g(),R(G,{key:0,size:"small",type:"success",class:"cute-btn",onClick:Fe=>ae(v,true)},{default:c(()=>[...u[21]||(u[21]=[N(" 完成 ",-1)])]),_:1},8,["onClick"])),r(G,{size:"small",type:"primary",class:"cute-btn",onClick:Fe=>q(v)},{default:c(()=>[...u[23]||(u[23]=[N(" 编辑 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[Nt,t.value]]),p.value.length===0&&!t.value?(g(),R(Ot,{key:0,description:"暂无待办事项"})):L("v-if",true),p.value.length>8?(g(),$("div",Ra,[r(Et,{"current-page":b.value,"onUpdate:currentPage":u[5]||(u[5]=v=>b.value=v),"page-size":_.value,"onUpdate:pageSize":u[6]||(u[6]=v=>_.value=v),"page-sizes":[8,16,32,64],total:p.value.length,layout:"total, sizes, prev, pager, next, jumper",background:"",onSizeChange:z,onCurrentChange:j},null,8,["current-page","page-size","total"])])):L("v-if",true)])]),r(je,{modelValue:d.value,"onUpdate:modelValue":u[11]||(u[11]=v=>d.value=v),title:"新增待办事项",width:"500px",class:"cute-dialog"},{footer:c(()=>[r(G,{onClick:u[10]||(u[10]=v=>d.value=false),class:"cute-btn"},{default:c(()=>[...u[24]||(u[24]=[N("取消",-1)])]),_:1}),r(G,{type:"primary",onClick:M,loading:o.value,class:"cute-btn primary"},{default:c(()=>[...u[25]||(u[25]=[N(" 保存 ",-1)])]),_:1},8,["loading"])]),default:c(()=>[r(Re,{model:h.value,"label-width":"80px"},{default:c(()=>[r(Y,{label:"标题"},{default:c(()=>[r(Z,{modelValue:h.value.title,"onUpdate:modelValue":u[7]||(u[7]=v=>h.value.title=v),placeholder:"请输入标题",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"内容"},{default:c(()=>[r(Z,{modelValue:h.value.content,"onUpdate:modelValue":u[8]||(u[8]=v=>h.value.content=v),type:"textarea",rows:4,placeholder:"请输入具体内容",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"创建人"},{default:c(()=>[r(Z,{modelValue:h.value.createdBy,"onUpdate:modelValue":u[9]||(u[9]=v=>h.value.createdBy=v),placeholder:"默认为:默认创建人",class:"cute-input"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),r(je,{modelValue:i.value,"onUpdate:modelValue":u[17]||(u[17]=v=>i.value=v),title:"编辑待办事项",width:"500px",class:"cute-dialog"},{footer:c(()=>[r(G,{onClick:u[16]||(u[16]=v=>i.value=false),class:"cute-btn"},{default:c(()=>[...u[27]||(u[27]=[N("取消",-1)])]),_:1}),r(G,{type:"primary",onClick:E,loading:o.value,class:"cute-btn primary"},{default:c(()=>[...u[28]||(u[28]=[N(" 保存 ",-1)])]),_:1},8,["loading"])]),default:c(()=>[r(Re,{model:S.value,"label-width":"80px"},{default:c(()=>[r(Y,{label:"标题"},{default:c(()=>[r(Z,{modelValue:S.value.title,"onUpdate:modelValue":u[12]||(u[12]=v=>S.value.title=v),placeholder:"请输入标题",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"内容"},{default:c(()=>[r(Z,{modelValue:S.value.content,"onUpdate:modelValue":u[13]||(u[13]=v=>S.value.content=v),type:"textarea",rows:4,placeholder:"请输入具体内容",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"创建人"},{default:c(()=>[r(Z,{modelValue:S.value.createdBy,"onUpdate:modelValue":u[14]||(u[14]=v=>S.value.createdBy=v),placeholder:"请输入创建人",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"状态"},{default:c(()=>[r(zt,{modelValue:S.value.completed,"onUpdate:modelValue":u[15]||(u[15]=v=>S.value.completed=v),class:"cute-checkbox"},{default:c(()=>[...u[26]||(u[26]=[N(" 已完成 ",-1)])]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])}}}),Fa=fe(ja,[["__scopeId","data-v-1d6d47ce"]]),Ga=e=>{e.page({name:"同步机器人",path:"/onilogs",component:_n,fields:["onilogs"]}),e.page({name:"火箭计算器",path:"/calculator",component:fo}),e.page({name:"缺氧 TodoList",path:"/onitodos",component:go}),e.slot({type:"calculator",component:uo}),e.slot({type:"onitodos",component:Fa})};export{Ga as default};
5
+ **/const _o=Object.prototype.hasOwnProperty,Ue=(e,n)=>_o.call(e,n),ge=e=>typeof e=="function",_e=e=>typeof e=="string",it=e=>e!==null&&typeof e=="object";var yo=typeof global=="object"&&global&&global.Object===Object&&global,ho=typeof self=="object"&&self&&self.Object===Object&&self,Ie=yo||ho||Function("return this")(),ne=Ie.Symbol,ut=Object.prototype,bo=ut.hasOwnProperty,Co=ut.toString,re=ne?ne.toStringTag:void 0;function wo(e){var n=bo.call(e,re),t=e[re];try{e[re]=void 0;var o=true}catch{}var s=Co.call(e);return o&&(n?e[re]=t:delete e[re]),s}var xo=Object.prototype,So=xo.toString;function To(e){return So.call(e)}var $o="[object Null]",ko="[object Undefined]",Ke=ne?ne.toStringTag:void 0;function ct(e){return e==null?e===void 0?ko:$o:Ke&&Ke in Object(e)?wo(e):To(e)}function Oo(e){return e!=null&&typeof e=="object"}var Eo="[object Symbol]";function Me(e){return typeof e=="symbol"||Oo(e)&&ct(e)==Eo}function zo(e,n){for(var t=-1,o=e==null?0:e.length,s=Array(o);++t<o;)s[t]=n(e[t],t,e);return s}var Be=Array.isArray,Ge=ne?ne.prototype:void 0,He=Ge?Ge.toString:void 0;function dt(e){if(typeof e=="string")return e;if(Be(e))return zo(e,dt)+"";if(Me(e))return He?He.call(e):"";var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function pt(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var No="[object AsyncFunction]",Vo="[object Function]",Io="[object GeneratorFunction]",Mo="[object Proxy]";function Bo(e){if(!pt(e))return false;var n=ct(e);return n==Vo||n==Io||n==No||n==Mo}var Te=Ie["__core-js_shared__"],qe=function(){var e=/[^.]+$/.exec(Te&&Te.keys&&Te.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Po(e){return!!qe&&qe in e}var Lo=Function.prototype,Do=Lo.toString;function Ro(e){if(e!=null){try{return Do.call(e)}catch{}try{return e+""}catch{}}return""}var jo=/[\\^$.*+?()[\]{}|]/g,Fo=/^\[object .+?Constructor\]$/,Ao=Function.prototype,Uo=Object.prototype,Ko=Ao.toString,Go=Uo.hasOwnProperty,Ho=RegExp("^"+Ko.call(Go).replace(jo,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function qo(e){if(!pt(e)||Po(e))return false;var n=Bo(e)?Ho:Fo;return n.test(Ro(e))}function Wo(e,n){return e==null?void 0:e[n]}function ft(e,n){var t=Wo(e,n);return qo(t)?t:void 0}function Zo(e,n){return e===n||e!==e&&n!==n}var Jo=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yo=/^\w*$/;function Xo(e,n){if(Be(e))return false;var t=typeof e;return t=="number"||t=="symbol"||t=="boolean"||e==null||Me(e)?true:Yo.test(e)||!Jo.test(e)||n!=null&&e in Object(n)}var ce=ft(Object,"create");function Qo(){this.__data__=ce?ce(null):{},this.size=0}function el(e){var n=this.has(e)&&delete this.__data__[e];return this.size-=n?1:0,n}var tl="__lodash_hash_undefined__",nl=Object.prototype,ol=nl.hasOwnProperty;function ll(e){var n=this.__data__;if(ce){var t=n[e];return t===tl?void 0:t}return ol.call(n,e)?n[e]:void 0}var al=Object.prototype,sl=al.hasOwnProperty;function rl(e){var n=this.__data__;return ce?n[e]!==void 0:sl.call(n,e)}var il="__lodash_hash_undefined__";function ul(e,n){var t=this.__data__;return this.size+=this.has(e)?0:1,t[e]=ce&&n===void 0?il:n,this}function Q(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}Q.prototype.clear=Qo;Q.prototype.delete=el;Q.prototype.get=ll;Q.prototype.has=rl;Q.prototype.set=ul;function cl(){this.__data__=[],this.size=0}function Ce(e,n){for(var t=e.length;t--;)if(Zo(e[t][0],n))return t;return-1}var dl=Array.prototype,pl=dl.splice;function fl(e){var n=this.__data__,t=Ce(n,e);if(t<0)return false;var o=n.length-1;return t==o?n.pop():pl.call(n,t,1),--this.size,true}function ml(e){var n=this.__data__,t=Ce(n,e);return t<0?void 0:n[t][1]}function vl(e){return Ce(this.__data__,e)>-1}function gl(e,n){var t=this.__data__,o=Ce(t,e);return o<0?(++this.size,t.push([e,n])):t[o][1]=n,this}function le(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}le.prototype.clear=cl;le.prototype.delete=fl;le.prototype.get=ml;le.prototype.has=vl;le.prototype.set=gl;var _l=ft(Ie,"Map");function yl(){this.size=0,this.__data__={hash:new Q,map:new(_l||le),string:new Q}}function hl(e){var n=typeof e;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?e!=="__proto__":e===null}function we(e,n){var t=e.__data__;return hl(n)?t[typeof n=="string"?"string":"hash"]:t.map}function bl(e){var n=we(this,e).delete(e);return this.size-=n?1:0,n}function Cl(e){return we(this,e).get(e)}function wl(e){return we(this,e).has(e)}function xl(e,n){var t=we(this,e),o=t.size;return t.set(e,n),this.size+=t.size==o?0:1,this}function ee(e){var n=-1,t=e==null?0:e.length;for(this.clear();++n<t;){var o=e[n];this.set(o[0],o[1])}}ee.prototype.clear=yl;ee.prototype.delete=bl;ee.prototype.get=Cl;ee.prototype.has=wl;ee.prototype.set=xl;var Sl="Expected a function";function Pe(e,n){if(typeof e!="function"||n!=null&&typeof n!="function")throw new TypeError(Sl);var t=function(){var o=arguments,s=n?n.apply(this,o):o[0],d=t.cache;if(d.has(s))return d.get(s);var i=e.apply(this,o);return t.cache=d.set(s,i)||d,i};return t.cache=new(Pe.Cache||ee),t}Pe.Cache=ee;var Tl=500;function $l(e){var n=Pe(e,function(o){return t.size===Tl&&t.clear(),o}),t=n.cache;return n}var kl=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ol=/\\(\\)?/g,El=$l(function(e){var n=[];return e.charCodeAt(0)===46&&n.push(""),e.replace(kl,function(t,o,s,d){n.push(s?d.replace(Ol,"$1"):o||t)}),n});function zl(e){return e==null?"":dt(e)}function Nl(e,n){return Be(e)?e:Xo(e,n)?[e]:El(zl(e))}function Vl(e){if(typeof e=="string"||Me(e))return e;var n=e+"";return n=="0"&&1/e==-1/0?"-0":n}function Il(e,n){n=Nl(n,e);for(var t=0,o=n.length;e!=null&&t<o;)e=e[Vl(n[t++])];return t&&t==o?e:void 0}function Ml(e,n,t){var o=e==null?void 0:Il(e,n);return o===void 0?t:o}function Bl(e){for(var n=-1,t=e==null?0:e.length,o={};++n<t;){var s=e[n];o[s[0]]=s[1]}return o}const Pl=e=>e===void 0,de=e=>typeof e=="number",Ll=e=>typeof Element>"u"?false:e instanceof Element,Dl=e=>_e(e)?!Number.isNaN(Number(e)):false,We=e=>Object.keys(e);function Ee(e,n="px"){if(!e)return"";if(de(e)||Dl(e))return`${e}${n}`;if(_e(e))return e}const mt="__epPropKey",F=e=>e,Rl=e=>it(e)&&!!e[mt],vt=(e,n)=>{if(!it(e)||Rl(e))return e;const{values:t,required:o,default:s,type:d,validator:i}=e,f={type:d,required:!!o,validator:t||i?b=>{let _=false,y=[];if(t&&(y=Array.from(t),Ue(e,"default")&&y.push(s),_||(_=y.includes(b))),i&&(_||(_=i(b))),!_&&y.length>0){const S=[...new Set(y)].map(T=>JSON.stringify(T)).join(", ");It(`Invalid prop: validation failed${n?` for prop "${n}"`:""}. Expected one of [${S}], got value ${JSON.stringify(b)}.`)}return _}:void 0,[mt]:true};return Ue(e,"default")&&(f.default=s),f},fe=e=>Bl(Object.entries(e).map(([n,t])=>[n,vt(t,n)])),jl=F([String,Object,Function]),Fl={Close:Yt},Ze={success:an,warning:cn,error:Zt,info:Qt},gt=(e,n)=>(e.install=t=>{for(const o of[e,...Object.values({})])t.component(o.name,o)},e),Al=(e,n)=>(e.install=t=>{e._context=t._context,t.config.globalProperties[n]=e},e),Ul={esc:"Escape"},Kl=["","default","small","large"],Gl=e=>e,Je=({from:e,replacement:n,scope:t,version:o,ref:s,type:d="API"},i)=>{he(()=>m(i),l=>{},{immediate:true})};var Hl={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const ql=e=>(n,t)=>Wl(n,t,m(e)),Wl=(e,n,t)=>Ml(t,e,e).replace(/\{(\w+)\}/g,(o,s)=>{var d;return`${(d=n==null?void 0:n[s])!=null?d:`{${s}}`}`}),Zl=e=>{const n=w(()=>m(e).name),t=Mt(e)?e:O(e);return{lang:n,locale:t,t:ql(e)}},_t=Symbol("localeContextKey"),Jl=e=>{const n=e||te(_t,O());return Zl(w(()=>n.value||Hl))},me="el",Yl="is-",X=(e,n,t,o,s)=>{let d=`${e}-${n}`;return t&&(d+=`-${t}`),o&&(d+=`__${o}`),s&&(d+=`--${s}`),d},yt=Symbol("namespaceContextKey"),Xl=e=>{const n=e||(ue()?te(yt,O(me)):O(me));return w(()=>m(n)||me)},Le=(e,n)=>{const t=Xl(n);return{namespace:t,b:(p="")=>X(t.value,e,p,"",""),e:p=>p?X(t.value,e,"",p,""):"",m:p=>p?X(t.value,e,"","",p):"",be:(p,x)=>p&&x?X(t.value,e,p,x,""):"",em:(p,x)=>p&&x?X(t.value,e,"",p,x):"",bm:(p,x)=>p&&x?X(t.value,e,p,"",x):"",bem:(p,x,z)=>p&&x&&z?X(t.value,e,p,x,z):"",is:(p,...x)=>{const z=x.length>=1?x[0]:true;return p&&z?`${Yl}${p}`:""},cssVar:p=>{const x={};for(const z in p)p[z]&&(x[`--${t.value}-${z}`]=p[z]);return x},cssVarName:p=>`--${t.value}-${p}`,cssVarBlock:p=>{const x={};for(const z in p)p[z]&&(x[`--${t.value}-${e}-${z}`]=p[z]);return x},cssVarBlockName:p=>`--${t.value}-${e}-${p}`}},Ye={current:0},Xe=O(0),ht=2e3,Qe=Symbol("elZIndexContextKey"),bt=Symbol("zIndexContextKey"),Ql=e=>{const n=ue()?te(Qe,Ye):Ye,t=e||(ue()?te(bt,void 0):void 0),o=w(()=>{const i=m(t);return de(i)?i:ht}),s=w(()=>o.value+Xe.value),d=()=>(n.current++,Xe.value=n.current,s.value);return!Ve&&te(Qe),{initialZIndex:o,currentZIndex:s,nextZIndex:d}},ea=vt({type:String,values:Kl,required:false}),ta=Symbol("size"),na=Symbol("emptyValuesContextKey"),oa=fe({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>ge(e)?!e():!e}}),Ct=Symbol(),ye=O();function wt(e,n=void 0){return ue()?te(Ct,ye):ye}function la(e,n){const t=wt(),o=Le(e,w(()=>{var l;return((l=t.value)==null?void 0:l.namespace)||me})),s=Jl(w(()=>{var l;return(l=t.value)==null?void 0:l.locale})),d=Ql(w(()=>{var l;return((l=t.value)==null?void 0:l.zIndex)||ht})),i=w(()=>{var l;return m(n)||((l=t.value)==null?void 0:l.size)||""});return xt(w(()=>m(t)||{})),{ns:o,locale:s,zIndex:d,size:i}}const xt=(e,n,t=false)=>{var o;const s=!!ue(),d=s?wt():void 0,i=(o=void 0)!=null?o:s?Bt:void 0;if(!i)return;const l=w(()=>{const f=m(e);return d!=null&&d.value?aa(d.value,f):f});return i(Ct,l),i(_t,w(()=>l.value.locale)),i(yt,w(()=>l.value.namespace)),i(bt,w(()=>l.value.zIndex)),i(ta,{size:w(()=>l.value.size||"")}),i(na,w(()=>({emptyValues:l.value.emptyValues,valueOnClear:l.value.valueOnClear}))),(t||!ye.value)&&(ye.value=l.value),l},aa=(e,n)=>{const t=[...new Set([...We(e),...We(n)])],o={};for(const s of t)o[s]=n[s]!==void 0?n[s]:e[s];return o},sa=fe({a11y:{type:Boolean,default:true},locale:{type:F(Object)},size:ea,button:{type:F(Object)},experimentalFeatures:{type:F(Object)},keyboardNavigation:{type:Boolean,default:true},message:{type:F(Object)},zIndex:Number,namespace:{type:String,default:"el"},...oa}),ze={};I({name:"ElConfigProvider",props:sa,setup(e,{slots:n}){he(()=>e.message,o=>{Object.assign(ze,o??{})},{immediate:true,deep:true});const t=xt(e);return()=>be(n,"default",{config:t==null?void 0:t.value})}});var De=(e,n)=>{const t=e.__vccOpts||e;for(const[o,s]of n)t[o]=s;return t};const ra=fe({size:{type:F([Number,String])},color:{type:String}}),ia=I({name:"ElIcon",inheritAttrs:false}),ua=I({...ia,props:ra,setup(e){const n=e,t=Le("icon"),o=w(()=>{const{size:s,color:d}=n;return!s&&!d?{}:{fontSize:Pl(s)?void 0:Ee(s),"--color":d}});return(s,d)=>(g(),$("i",Pt({class:m(t).b(),style:m(o)},s.$attrs),[be(s.$slots,"default")],16))}});var ca=De(ua,[["__file","icon.vue"]]);const et=gt(ca),da=fe({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:true},color:String,dotStyle:{type:F([String,Object,Array])},badgeStyle:{type:F([String,Object,Array])},offset:{type:F(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),pa=["textContent"],fa=I({name:"ElBadge"}),ma=I({...fa,props:da,setup(e,{expose:n}){const t=e,o=Le("badge"),s=w(()=>t.isDot?"":de(t.value)&&de(t.max)?t.max<t.value?`${t.max}+`:t.value===0&&!t.showZero?"":`${t.value}`:`${t.value}`),d=w(()=>{var i,l,f,b,_,y;return[{backgroundColor:t.color,marginRight:Ee(-((l=(i=t.offset)==null?void 0:i[0])!=null?l:0)),marginTop:Ee((b=(f=t.offset)==null?void 0:f[1])!=null?b:0)},(_=t.dotStyle)!=null?_:{},(y=t.badgeStyle)!=null?y:{}]});return Je({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},w(()=>!!t.dotStyle)),Je({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},w(()=>!!t.dotClass)),n({content:s}),(i,l)=>(g(),$("div",{class:D(m(o).b())},[be(i.$slots,"default"),r(nt,{name:`${m(o).namespace.value}-zoom-in-center`,persisted:""},{default:c(()=>[Ne(a("sup",{class:D([m(o).e("content"),m(o).em("content",i.type),m(o).is("fixed",!!i.$slots.default),m(o).is("dot",i.isDot),i.dotClass,i.badgeClass]),style:ot(m(d)),textContent:B(m(s))},null,14,pa),[[lt,!i.hidden&&(m(s)||i.isDot)]])]),_:1},8,["name"])],2))}});var va=De(ma,[["__file","badge.vue"]]);const ga=gt(va),St=["success","info","warning","error"],P=Gl({customClass:"",center:false,dangerouslyUseHTMLString:false,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:false,type:"info",plain:false,offset:16,zIndex:0,grouping:false,repeatNum:1,appendTo:Ve?document.body:void 0}),_a=fe({customClass:{type:String,default:P.customClass},center:{type:Boolean,default:P.center},dangerouslyUseHTMLString:{type:Boolean,default:P.dangerouslyUseHTMLString},duration:{type:Number,default:P.duration},icon:{type:jl,default:P.icon},id:{type:String,default:P.id},message:{type:F([String,Object,Function]),default:P.message},onClose:{type:F(Function),default:P.onClose},showClose:{type:Boolean,default:P.showClose},type:{type:String,values:St,default:P.type},plain:{type:Boolean,default:P.plain},offset:{type:Number,default:P.offset},zIndex:{type:Number,default:P.zIndex},grouping:{type:Boolean,default:P.grouping},repeatNum:{type:Number,default:P.repeatNum}}),ya={destroy:()=>true},A=Lt([]),ha=e=>{const n=A.findIndex(s=>s.id===e),t=A[n];let o;return n>0&&(o=A[n-1]),{current:t,prev:o}},ba=e=>{const{prev:n}=ha(e);return n?n.vm.exposed.bottom.value:0},Ca=(e,n)=>A.findIndex(o=>o.id===e)>0?16:n,wa=["id"],xa=["innerHTML"],Sa=I({name:"ElMessage"}),Ta=I({...Sa,props:_a,emits:ya,setup(e,{expose:n}){const t=e,{Close:o}=Fl,{ns:s,zIndex:d}=la("message"),{currentZIndex:i,nextZIndex:l}=d,f=O(),b=O(false),_=O(0);let y;const S=w(()=>t.type?t.type==="error"?"danger":t.type:"info"),T=w(()=>{const E=t.type;return{[s.bm("icon",E)]:E&&Ze[E]}}),k=w(()=>t.icon||Ze[t.type]||""),p=w(()=>ba(t.id)),x=w(()=>Ca(t.id,t.offset)+p.value),z=w(()=>_.value+x.value),j=w(()=>({top:`${x.value}px`,zIndex:i.value}));function U(){t.duration!==0&&({stop:y}=Gt(()=>{M()},t.duration))}function V(){y==null||y()}function M(){b.value=false}function q({code:E}){E===Ul.esc&&M()}return tt(()=>{U(),l(),b.value=true}),he(()=>t.repeatNum,()=>{V(),U()}),Ut(document,"keydown",q),Kt(f,()=>{_.value=f.value.getBoundingClientRect().height}),n({visible:b,bottom:z,close:M}),(E,ae)=>(g(),R(nt,{name:m(s).b("fade"),onBeforeLeave:E.onClose,onAfterLeave:ae[0]||(ae[0]=h=>E.$emit("destroy")),persisted:""},{default:c(()=>[Ne(a("div",{id:E.id,ref_key:"messageRef",ref:f,class:D([m(s).b(),{[m(s).m(E.type)]:E.type},m(s).is("center",E.center),m(s).is("closable",E.showClose),m(s).is("plain",E.plain),E.customClass]),style:ot(m(j)),role:"alert",onMouseenter:V,onMouseleave:U},[E.repeatNum>1?(g(),R(m(ga),{key:0,value:E.repeatNum,type:m(S),class:D(m(s).e("badge"))},null,8,["value","type","class"])):L("v-if",true),m(k)?(g(),R(m(et),{key:1,class:D([m(s).e("icon"),m(T)])},{default:c(()=>[(g(),R(Dt(m(k))))]),_:1},8,["class"])):L("v-if",true),be(E.$slots,"default",{},()=>[E.dangerouslyUseHTMLString?(g(),$(ie,{key:1},[L(" Caution here, message could've been compromised, never use user's input as message "),a("p",{class:D(m(s).e("content")),innerHTML:E.message},null,10,xa)],2112)):(g(),$("p",{key:0,class:D(m(s).e("content"))},B(E.message),3))]),E.showClose?(g(),R(m(et),{key:2,class:D(m(s).e("closeBtn")),onClick:Rt(M,["stop"])},{default:c(()=>[r(m(o))]),_:1},8,["class","onClick"])):L("v-if",true)],46,wa),[[lt,b.value]])]),_:3},8,["name","onBeforeLeave"]))}});var $a=De(Ta,[["__file","message.vue"]]);let ka=1;const Tt=e=>{const n=!e||_e(e)||at(e)||ge(e)?{message:e}:e,t={...P,...n};if(!t.appendTo)t.appendTo=document.body;else if(_e(t.appendTo)){let o=document.querySelector(t.appendTo);Ll(o)||(o=document.body),t.appendTo=o}return t},Oa=e=>{const n=A.indexOf(e);if(n===-1)return;A.splice(n,1);const{handler:t}=e;t.close()},Ea=({appendTo:e,...n},t)=>{const o=`message_${ka++}`,s=n.onClose,d=document.createElement("div"),i={...n,id:o,onClose:()=>{s==null||s(),Oa(_)},onDestroy:()=>{Ae(null,d)}},l=r($a,i,ge(i.message)||at(i.message)?{default:ge(i.message)?i.message:()=>i.message}:null);l.appContext=t||oe._context,Ae(l,d),e.appendChild(d.firstElementChild);const f=l.component,_={id:o,vnode:l,vm:f,handler:{close:()=>{f.exposed.visible.value=false}},props:l.component.props};return _},oe=(e={},n)=>{if(!Ve)return{close:()=>{}};if(de(ze.max)&&A.length>=ze.max)return{close:()=>{}};const t=Tt(e);if(t.grouping&&A.length){const s=A.find(({vnode:d})=>{var i;return((i=d.props)==null?void 0:i.message)===t.message});if(s)return s.props.repeatNum+=1,s.props.type=t.type,s.handler}const o=Ea(t,n);return A.push(o),o.handler};St.forEach(e=>{oe[e]=(n={},t)=>{const o=Tt(n);return oe({...o,type:e},t)}});function za(e){for(const n of A)(!e||e===n.props.type)&&n.handler.close()}oe.closeAll=za;oe._context=null;const K=Al(oe,"$message"),Na={class:"todo-app"},Va={class:"todo-container"},Ia={class:"todo-header"},Ma={class:"button-group"},Ba={class:"todo-stats"},Pa={class:"search-filter-section"},La={class:"filter-buttons"},Da={class:"todo-table-card"},Ra={key:1,class:"pagination-section"},ja=I({__name:"todolist",setup(e){const n=O([]),t=O(false),o=O(false),s=O(false),d=O(false),i=O(false),l=O(""),f=O("all"),b=O(1),_=O(8),y=O({title:"",content:"",createdBy:""}),S=O({id:0,title:"",content:"",createdBy:"",completed:false}),T=w(()=>n.value.filter(h=>h.completed).length),k=w(()=>n.value.filter(h=>!h.completed).length),p=w(()=>{let h=n.value;if(f.value==="active"?h=h.filter(u=>!u.completed):f.value==="completed"&&(h=h.filter(u=>u.completed)),l.value.trim()){const u=l.value.toLowerCase().trim();h=h.filter(W=>W.title.toLowerCase().includes(u)||W.content.toLowerCase().includes(u))}return b.value=1,h}),x=w(()=>{const h=(b.value-1)*_.value,u=h+_.value;return p.value.slice(h,u)});function z(h){_.value=h,b.value=1}function j(h){b.value=h}function U(h){return new Date(h).toLocaleString("zh-CN")}function V(){s.value=true,se("onitodos/list").then(h=>{n.value=h,s.value=false,K.success("刷新成功")}).catch(h=>{s.value=false,K.error("刷新失败"),console.error(h)})}se("onitodos/list").then(h=>{n.value=h});async function M(){if(!y.value.title.trim()){K.warning("请输入标题");return}o.value=true;try{await se("onitodos/add",{title:y.value.title,content:y.value.content,createdBy:y.value.createdBy}),K.success("添加成功"),d.value=false,y.value={title:"",content:"",createdBy:""},V()}catch(h){K.error("添加失败"),console.error(h)}finally{o.value=false}}function q(h){S.value={id:h.id,title:h.title,content:h.content,createdBy:h.createdBy,completed:h.completed},i.value=true}async function E(){if(!S.value.title.trim()){K.warning("请输入标题");return}o.value=true;try{await se("onitodos/update",{id:S.value.id,title:S.value.title,content:S.value.content,createdBy:S.value.createdBy,completed:S.value.completed}),K.success("更新成功"),i.value=false,V()}catch(h){K.error("更新失败"),console.error(h)}finally{o.value=false}}async function ae(h,u){try{await se("onitodos/update",{id:h.id,completed:u}),K.success(u?"标记完成成功":"取消完成成功"),V()}catch(W){K.error("操作失败"),console.error(W)}}return(h,u)=>{const W=C("el-icon"),G=C("el-button"),xe=C("el-statistic"),Z=C("el-input"),J=C("el-table-column"),$t=C("el-tag"),kt=C("el-table"),Ot=C("el-empty"),Et=C("el-pagination"),Y=C("el-form-item"),Re=C("el-form"),je=C("el-dialog"),zt=C("el-checkbox"),Nt=jt("loading");return g(),$("div",Na,[u[29]||(u[29]=a("div",{class:"bg-pattern"},null,-1)),a("div",Va,[a("div",Ia,[u[20]||(u[20]=a("h2",{class:"todo-title"},[a("span",{class:"title-dot"},"♦"),a("span",{class:"title-text"},"ONITODO"),a("span",{class:"title-dot"},"♦")],-1)),a("div",Ma,[r(G,{type:"default",class:"cute-btn",onClick:V,loading:s.value},{default:c(()=>[r(W,null,{default:c(()=>[r(m(on))]),_:1}),u[18]||(u[18]=N(" 刷新 ",-1))]),_:1},8,["loading"]),r(G,{type:"primary",class:"cute-btn primary",onClick:u[0]||(u[0]=v=>d.value=true)},{default:c(()=>[r(W,null,{default:c(()=>[r(m(tn))]),_:1}),u[19]||(u[19]=N(" 新增待办 ",-1))]),_:1})])]),a("div",Ba,[r(xe,{title:"总计",value:n.value.length},null,8,["value"]),r(xe,{title:"已完成",value:T.value},null,8,["value"]),r(xe,{title:"未完成",value:k.value},null,8,["value"])]),a("div",Pa,[r(Z,{modelValue:l.value,"onUpdate:modelValue":u[1]||(u[1]=v=>l.value=v),placeholder:"🔍 搜索标题或内容...",class:"search-input cute-input",clearable:""},null,8,["modelValue"]),a("div",La,[a("button",{class:D(["filter-btn",{active:f.value==="all"}]),onClick:u[2]||(u[2]=v=>f.value="all")}," 全部 ",2),a("button",{class:D(["filter-btn",{active:f.value==="active"}]),onClick:u[3]||(u[3]=v=>f.value="active")}," 未完成 ",2),a("button",{class:D(["filter-btn",{active:f.value==="completed"}]),onClick:u[4]||(u[4]=v=>f.value="completed")}," 已完成 ",2)])]),a("div",Da,[Ne((g(),R(kt,{data:x.value,stripe:"",style:{width:"100%"},class:"cute-table"},{default:c(()=>[r(J,{type:"index",label:"id",width:"80"}),r(J,{prop:"title",label:"标题","min-width":"150","show-overflow-tooltip":""},{default:c(({row:v})=>[a("span",{class:D({"completed-text":v.completed})},B(v.title),3)]),_:1}),r(J,{prop:"content",label:"内容","min-width":"150","show-overflow-tooltip":""}),r(J,{prop:"createdBy",label:"创建人",width:"80","show-overflow-tooltip":""}),r(J,{prop:"completed",label:"状态",width:"80"},{default:c(({row:v})=>[r($t,{type:v.completed?"success":"warning",size:"small",class:"cute-tag"},{default:c(()=>[N(B(v.completed?"已完成":"未完成"),1)]),_:2},1032,["type"])]),_:1}),r(J,{prop:"createdAt",label:"创建时间",width:"180"},{default:c(({row:v})=>[N(B(U(v.createdAt)),1)]),_:1}),r(J,{label:"操作",width:"150",fixed:"right"},{default:c(({row:v})=>[v.completed?(g(),R(G,{key:1,size:"small",type:"warning",class:"cute-btn",onClick:Fe=>ae(v,false)},{default:c(()=>[...u[22]||(u[22]=[N(" 取消 ",-1)])]),_:1},8,["onClick"])):(g(),R(G,{key:0,size:"small",type:"success",class:"cute-btn",onClick:Fe=>ae(v,true)},{default:c(()=>[...u[21]||(u[21]=[N(" 完成 ",-1)])]),_:1},8,["onClick"])),r(G,{size:"small",type:"primary",class:"cute-btn",onClick:Fe=>q(v)},{default:c(()=>[...u[23]||(u[23]=[N(" 编辑 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[Nt,t.value]]),p.value.length===0&&!t.value?(g(),R(Ot,{key:0,description:"暂无待办事项"})):L("v-if",true),p.value.length>8?(g(),$("div",Ra,[r(Et,{"current-page":b.value,"onUpdate:currentPage":u[5]||(u[5]=v=>b.value=v),"page-size":_.value,"onUpdate:pageSize":u[6]||(u[6]=v=>_.value=v),"page-sizes":[8,16,32,64],total:p.value.length,layout:"total, sizes, prev, pager, next, jumper",background:"",onSizeChange:z,onCurrentChange:j},null,8,["current-page","page-size","total"])])):L("v-if",true)])]),r(je,{modelValue:d.value,"onUpdate:modelValue":u[11]||(u[11]=v=>d.value=v),title:"新增待办事项",width:"500px",class:"cute-dialog"},{footer:c(()=>[r(G,{onClick:u[10]||(u[10]=v=>d.value=false),class:"cute-btn"},{default:c(()=>[...u[24]||(u[24]=[N("取消",-1)])]),_:1}),r(G,{type:"primary",onClick:M,loading:o.value,class:"cute-btn primary"},{default:c(()=>[...u[25]||(u[25]=[N(" 保存 ",-1)])]),_:1},8,["loading"])]),default:c(()=>[r(Re,{model:y.value,"label-width":"80px"},{default:c(()=>[r(Y,{label:"标题"},{default:c(()=>[r(Z,{modelValue:y.value.title,"onUpdate:modelValue":u[7]||(u[7]=v=>y.value.title=v),placeholder:"请输入标题",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"内容"},{default:c(()=>[r(Z,{modelValue:y.value.content,"onUpdate:modelValue":u[8]||(u[8]=v=>y.value.content=v),type:"textarea",rows:4,placeholder:"请输入具体内容",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"创建人"},{default:c(()=>[r(Z,{modelValue:y.value.createdBy,"onUpdate:modelValue":u[9]||(u[9]=v=>y.value.createdBy=v),placeholder:"默认为:默认创建人",class:"cute-input"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),r(je,{modelValue:i.value,"onUpdate:modelValue":u[17]||(u[17]=v=>i.value=v),title:"编辑待办事项",width:"500px",class:"cute-dialog"},{footer:c(()=>[r(G,{onClick:u[16]||(u[16]=v=>i.value=false),class:"cute-btn"},{default:c(()=>[...u[27]||(u[27]=[N("取消",-1)])]),_:1}),r(G,{type:"primary",onClick:E,loading:o.value,class:"cute-btn primary"},{default:c(()=>[...u[28]||(u[28]=[N(" 保存 ",-1)])]),_:1},8,["loading"])]),default:c(()=>[r(Re,{model:S.value,"label-width":"80px"},{default:c(()=>[r(Y,{label:"标题"},{default:c(()=>[r(Z,{modelValue:S.value.title,"onUpdate:modelValue":u[12]||(u[12]=v=>S.value.title=v),placeholder:"请输入标题",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"内容"},{default:c(()=>[r(Z,{modelValue:S.value.content,"onUpdate:modelValue":u[13]||(u[13]=v=>S.value.content=v),type:"textarea",rows:4,placeholder:"请输入具体内容",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"创建人"},{default:c(()=>[r(Z,{modelValue:S.value.createdBy,"onUpdate:modelValue":u[14]||(u[14]=v=>S.value.createdBy=v),placeholder:"请输入创建人",class:"cute-input"},null,8,["modelValue"])]),_:1}),r(Y,{label:"状态"},{default:c(()=>[r(zt,{modelValue:S.value.completed,"onUpdate:modelValue":u[15]||(u[15]=v=>S.value.completed=v),class:"cute-checkbox"},{default:c(()=>[...u[26]||(u[26]=[N(" 已完成 ",-1)])]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])}}}),Fa=pe(ja,[["__scopeId","data-v-1d6d47ce"]]),Ga=e=>{e.page({name:"同步机器人",path:"/onilogs",component:_n,fields:["onilogs"]}),e.page({name:"火箭计算器",path:"/calculator",component:fo}),e.page({name:"缺氧 TodoList",path:"/onitodos",component:go}),e.slot({type:"calculator",component:uo}),e.slot({type:"onitodos",component:Fa})};export{Ga as default};
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .filter-container[data-v-62639236]{background:#fff;padding:16px;margin-bottom:12px;border-radius:4px;box-shadow:0 2px 4px #0000001a}.log-tabs[data-v-62639236]{margin-bottom:16px}.filter-row[data-v-62639236]{display:flex;gap:12px;align-items:center}.filter-input[data-v-62639236]{flex:1}.button-group[data-v-62639236]{display:flex;gap:8px}.log-container[data-v-62639236]{width:100%;height:calc(100vh - 220px);overflow-y:auto;padding:12px;font-family:monospace;background:#1e1e1e;color:#d4d4d4;border-radius:4px}.log-line[data-v-62639236]{line-height:1.5;font-size:13px}pre[data-v-62639236]{margin:0;font-family:inherit;white-space:pre-wrap;word-break:break-all}.log-error[data-v-62639236]{color:#f44747}.log-warn[data-v-62639236]{color:#dcdcaa}.log-info[data-v-62639236]{color:#4fc1ff}.empty-state[data-v-62639236]{display:flex;justify-content:center;align-items:center;height:100%;color:gray;font-size:14px}[data-v-3e8f9409]{box-sizing:border-box}.rocket-calculator[data-v-3e8f9409]{max-width:800px;margin:0 auto;padding:20px;box-sizing:border-box;position:relative;min-height:100vh;overflow-x:hidden}.sci-fi-bg[data-v-3e8f9409]{background:linear-gradient(135deg,#0a0e27,#1a1f3a,#0f172a);color:#e0e7ff}.grid-overlay[data-v-3e8f9409]{position:fixed;top:0;left:0;right:0;bottom:0;background-image:linear-gradient(rgba(0,255,255,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(0,255,255,.03) 1px,transparent 1px);background-size:40px 40px;pointer-events:none;z-index:0}.sci-fi-card[data-v-3e8f9409]{background:#0f172af2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(0,255,255,.2);box-shadow:0 0 20px #00ffff1a,inset 0 0 20px #00000080;position:relative;overflow:visible;z-index:1}.sci-fi-card[data-v-3e8f9409] .k-card__body{padding:24px}.card-header-line[data-v-3e8f9409]{position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,#00ffff,#8b5cf6,transparent);animation:lineGlow-3e8f9409 3s ease-in-out infinite;z-index:1}@keyframes lineGlow-3e8f9409{0%,to{opacity:.5}50%{opacity:1}}.header-card[data-v-3e8f9409]{margin-bottom:24px;text-align:center;position:relative;z-index:10;margin-top:8px}.header-glow[data-v-3e8f9409]{position:absolute;top:-50%;left:50%;transform:translate(-50%);width:200%;height:100%;background:radial-gradient(ellipse,rgba(139,92,246,.15) 0%,transparent 70%);pointer-events:none;z-index:-1}.sci-fi-title[data-v-3e8f9409]{margin:0 0 8px;font-size:28px;font-weight:800;letter-spacing:4px;color:#0ff;background:linear-gradient(90deg,#0ff,#8b5cf6,#0ff);background-size:200% auto;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation:titleShine-3e8f9409 4s linear infinite;position:relative;z-index:2;text-shadow:0 0 30px rgba(0,255,255,.3);line-height:1.4}@keyframes titleShine-3e8f9409{0%{background-position:0% center}to{background-position:200% center}}.sci-fi-subtitle[data-v-3e8f9409]{margin:0;color:#64748b;font-size:13px;letter-spacing:2px;text-transform:uppercase;position:relative;z-index:2;line-height:1.5}.content-layout[data-v-3e8f9409]{display:flex;flex-direction:column;gap:24px;position:relative;z-index:1}.config-section[data-v-3e8f9409]{margin-bottom:20px;position:relative;z-index:1}.section-title[data-v-3e8f9409]{margin:0 0 20px;font-size:14px;color:#0ff;letter-spacing:2px;font-weight:600}.distance-control[data-v-3e8f9409]{width:100%}.distance-step-selector[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-bottom:16px}.step-btn[data-v-3e8f9409]{margin:0;background:#0000004d;border:1px solid rgba(0,255,255,.2);color:#94a3b8;padding:8px 4px;font-size:12px;font-weight:600;transition:all .2s ease;white-space:nowrap}.step-btn[data-v-3e8f9409]:hover{border-color:#00ffff80;color:#0ff;transform:translateY(-1px)}.step-btn.active[data-v-3e8f9409]{background:#00ffff26;border-color:#0ff;color:#0ff;box-shadow:0 0 15px #00ffff4d}.distance-input-wrapper[data-v-3e8f9409]{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px;background:#0000004d;border:1px solid rgba(139,92,246,.3);border-radius:4px}.distance-label[data-v-3e8f9409]{color:#64748b;font-size:13px}.distance-value[data-v-3e8f9409]{font-size:20px;font-weight:800;color:#8b5cf6}.unit[data-v-3e8f9409]{color:#8b5cf6;font-weight:600;font-size:14px}.modules-grid[data-v-3e8f9409]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.module-item[data-v-3e8f9409]{background:#00ffff0d;border:1px solid rgba(0,255,255,.1);padding:12px;border-radius:4px;transition:all .3s ease;display:flex;flex-direction:column;gap:8px}.module-item[data-v-3e8f9409]:hover{border-color:#00ffff4d;background:#00ffff14}.module-name[data-v-3e8f9409]{font-size:13px;color:#94a3b8}.module-input[data-v-3e8f9409]{width:100%}.module-input[data-v-3e8f9409] .el-input__wrapper{background:#0000004d;border:1px solid rgba(0,255,255,.2);box-shadow:none;padding:4px 6px}.module-input[data-v-3e8f9409] .el-input__inner{text-align:center;color:#0ff;font-weight:700;font-size:16px}.module-input[data-v-3e8f9409] .el-input-number__decrease,.module-input[data-v-3e8f9409] .el-input-number__increase{background:#0ff3;color:#0ff;border-color:#00ffff4d;font-weight:800;font-size:16px;transition:all .2s ease}.module-input[data-v-3e8f9409] .el-input-number__decrease:hover,.module-input[data-v-3e8f9409] .el-input-number__increase:hover{background:#0ff6;color:#fff}.module-input[data-v-3e8f9409] .el-input-number__decrease.is-disabled,.module-input[data-v-3e8f9409] .el-input-number__increase.is-disabled{background:#0003;color:#475569;border-color:#ffffff1a}.calculate-btn-wrapper[data-v-3e8f9409]{margin-top:24px;margin-bottom:0}.sci-fi-calculate-btn[data-v-3e8f9409]{width:100%;height:50px;background:linear-gradient(135deg,#0ff,#8b5cf6);border:none;color:#0a0e27;font-weight:800;font-size:16px;letter-spacing:2px;position:relative;overflow:hidden;transition:all .3s ease}.sci-fi-calculate-btn[data-v-3e8f9409]:hover{transform:translateY(-2px);box-shadow:0 10px 30px #00ffff4d}.btn-text[data-v-3e8f9409]{position:relative;z-index:1}.btn-glow[data-v-3e8f9409]{position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.4),transparent);animation:btnScan-3e8f9409 2s ease-in-out infinite}@keyframes btnScan-3e8f9409{0%{left:-100%}to{left:100%}}.sci-fi-radio-group[data-v-3e8f9409]{width:100%;display:flex}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button{flex:1}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__inner{width:100%;background:#0000004d;border:1px solid rgba(0,255,255,.2);color:#94a3b8;font-weight:600;padding:12px 10px;transition:all .2s ease}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__inner:hover{color:#0ff;border-color:#0ff6}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__orig-radio:checked+.el-radio-button__inner{background:#00ffff26;border-color:#0ff;color:#0ff;box-shadow:0 0 15px #0ff3}.oxidizer-hint[data-v-3e8f9409]{display:flex;justify-content:space-around;margin-top:8px}.hint-item[data-v-3e8f9409]{font-size:12px;color:#64748b;transition:all .2s ease}.hint-item.active[data-v-3e8f9409]{color:#0ff;font-weight:600}.divider-line[data-v-3e8f9409]{height:1px;background:linear-gradient(90deg,transparent,rgba(0,255,255,.3),transparent);margin:24px 0}.result-header[data-v-3e8f9409]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:8px}.result-title[data-v-3e8f9409]{margin:0;font-size:18px;color:#0ff;letter-spacing:2px}.result-status[data-v-3e8f9409]{display:flex;align-items:center;gap:8px;font-size:12px;color:#67c23a;letter-spacing:1px}.status-dot[data-v-3e8f9409]{width:8px;height:8px;background:#67c23a;border-radius:50%;animation:statusPulse-3e8f9409 2s ease-in-out infinite}@keyframes statusPulse-3e8f9409{0%,to{box-shadow:0 0 #67c23a66}50%{box-shadow:0 0 0 8px #67c23a00}}.key-stats[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:24px}.stat-item[data-v-3e8f9409]{background:#0000004d;border:1px solid rgba(255,255,255,.1);padding:16px;text-align:center;position:relative}.stat-item.primary[data-v-3e8f9409]{border-color:#0ff6;box-shadow:0 0 20px #00ffff1a}.stat-item.success[data-v-3e8f9409]{border-color:#67c23a66;box-shadow:0 0 20px #67c23a1a}.stat-item.warning[data-v-3e8f9409]{border-color:#e6a23c66;box-shadow:0 0 20px #e6a23c1a}.stat-label[data-v-3e8f9409]{font-size:12px;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:1px}.stat-value[data-v-3e8f9409]{font-size:24px;font-weight:800}.stat-item.primary .stat-value[data-v-3e8f9409]{color:#0ff}.stat-item.success .stat-value[data-v-3e8f9409]{color:#67c23a}.stat-item.warning .stat-value[data-v-3e8f9409]{color:#e6a23c}.stat-unit[data-v-3e8f9409]{font-size:14px;opacity:.7}.detail-title[data-v-3e8f9409]{margin:0 0 16px;font-size:14px;color:#8b5cf6;letter-spacing:2px}.detail-grid[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.detail-item[data-v-3e8f9409]{display:flex;justify-content:space-between;align-items:center;background:#0003;padding:12px 16px;border-left:3px solid #8b5cf6;gap:8px}.detail-label[data-v-3e8f9409]{font-size:13px;color:#94a3b8}.detail-value[data-v-3e8f9409]{font-size:16px;font-weight:700;color:#e0e7ff;text-align:right}.sci-fi-divider[data-v-3e8f9409]{border-color:#00ffff1a;margin:24px 0}.table-wrapper[data-v-3e8f9409]{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sci-fi-table[data-v-3e8f9409]{background:#0003;min-width:500px}.sci-fi-table[data-v-3e8f9409] .el-table__header-wrapper{background:#00ffff0d}.sci-fi-table[data-v-3e8f9409] .el-table th{background:transparent;color:#0ff;border-color:#00ffff1a}.sci-fi-table[data-v-3e8f9409] .el-table td{border-color:#ffffff0d}.sci-fi-table[data-v-3e8f9409] .el-table--striped .el-table__body tr.el-table__row--striped{background:#0000001a}.empty-state[data-v-3e8f9409]{text-align:center;padding:60px 20px;position:relative}.scan-line[data-v-3e8f9409]{position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,rgba(0,255,255,.5),transparent);animation:scanMove-3e8f9409 3s linear infinite}@keyframes scanMove-3e8f9409{0%{top:0;opacity:0}10%{opacity:1}90%{opacity:1}to{top:100%;opacity:0}}.empty-icon[data-v-3e8f9409]{font-size:48px;margin-bottom:16px}.empty-text[data-v-3e8f9409]{font-size:16px;color:#64748b;margin:0 0 8px;letter-spacing:1px}.empty-text.error[data-v-3e8f9409]{color:#f87171}.empty-hint[data-v-3e8f9409]{font-size:13px;color:#475569;margin:0 0 24px;line-height:1.5}.sci-fi-reset-btn[data-v-3e8f9409]{background:#8b5cf633;border:1px solid #8b5cf6;color:#8b5cf6}.sci-fi-reset-btn[data-v-3e8f9409]:hover{background:#8b5cf64d;color:#a78bfa}.sci-fi-form[data-v-3e8f9409] .el-form-item__label{color:#94a3b8;font-weight:600;padding-bottom:6px;line-height:1.4}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper{background:#0000004d;border:1px solid rgba(0,255,255,.2);box-shadow:none}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper:hover{border-color:#0ff6}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper.is-focus{border-color:#0ff;box-shadow:0 0 10px #0ff3}@media screen and (max-width: 600px){.rocket-calculator[data-v-3e8f9409]{padding:12px}.sci-fi-title[data-v-3e8f9409]{font-size:20px;letter-spacing:2px}.sci-fi-card[data-v-3e8f9409] .k-card__body{padding:16px}.key-stats[data-v-3e8f9409],.modules-grid[data-v-3e8f9409],.detail-grid[data-v-3e8f9409]{grid-template-columns:1fr}.distance-step-selector[data-v-3e8f9409]{grid-template-columns:repeat(3,1fr)}}.scrollbar[data-v-7f2607d9]{background:linear-gradient(135deg,#0a0e27,#1a1f3a,#0f172a);color:#e0e7ff}.todo-app[data-v-1d6d47ce]{min-height:100vh;position:relative;background:linear-gradient(135deg,#e0f4ff,#f0f8ff,#e8f5ff);padding:20px}.bg-pattern[data-v-1d6d47ce]{position:fixed;top:0;left:0;right:0;bottom:0;background-image:radial-gradient(circle,#b8d4e8 1px,transparent 1px);background-size:25px 25px;opacity:.5;pointer-events:none;z-index:0}.todo-container[data-v-1d6d47ce]{position:relative;z-index:1;max-width:1000px;margin:0 auto}.todo-header[data-v-1d6d47ce]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.todo-title[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;font-size:48px;font-weight:700;color:#fff;text-shadow:2px 2px 0 #333,-2px -2px 0 #333,2px -2px 0 #333,-2px 2px 0 #333,0px 2px 0 #333,0px -2px 0 #333,2px 0px 0 #333,-2px 0px 0 #333,3px 3px 0 #ffd700,4px 4px 0 #333;letter-spacing:5px;display:inline-flex;align-items:center;gap:10px;margin:0}.title-dot[data-v-1d6d47ce]{color:#ff6b9d;font-size:16px;animation:bounce-1d6d47ce .6s infinite alternate}@keyframes bounce-1d6d47ce{0%{transform:translateY(0)}to{transform:translateY(-6px)}}.title-text[data-v-1d6d47ce]{background:linear-gradient(180deg,#fff,#f0f0f0);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.button-group[data-v-1d6d47ce]{display:flex;gap:10px}.cute-btn[data-v-1d6d47ce]{background:#fff;border:2px solid #333;color:#333;font-family:Comic Sans MS,cursive,sans-serif;border-radius:8px;box-shadow:3px 3px #333;transition:all .1s}.cute-btn[data-v-1d6d47ce]:hover{transform:translate(1px,1px);box-shadow:2px 2px #333}.cute-btn[data-v-1d6d47ce]:active{transform:translate(2px,2px);box-shadow:1px 1px #333}.cute-btn.primary[data-v-1d6d47ce]{background:linear-gradient(135deg,#ffb6c1,pink)}.todo-stats[data-v-1d6d47ce]{display:flex;gap:20px;margin-bottom:15px;padding:8px 15px;background:#fff;border:2px solid #333;border-radius:10px;box-shadow:4px 4px #333}.search-filter-section[data-v-1d6d47ce]{display:flex;gap:15px;margin-bottom:20px;align-items:center;flex-wrap:wrap}.search-input[data-v-1d6d47ce]{flex:1;min-width:250px}.filter-buttons[data-v-1d6d47ce]{display:flex;gap:10px}.filter-btn[data-v-1d6d47ce]{background:#fff;border:2px solid #333;color:#333;font-family:Comic Sans MS,cursive,sans-serif;padding:8px 20px;border-radius:8px;box-shadow:3px 3px #333;cursor:pointer;transition:all .1s}.filter-btn[data-v-1d6d47ce]:hover{transform:translate(1px,1px);box-shadow:2px 2px #333}.filter-btn[data-v-1d6d47ce]:active{transform:translate(2px,2px);box-shadow:1px 1px #333}.filter-btn.active[data-v-1d6d47ce]{background:linear-gradient(135deg,#87ceeb,#98d8c8)}.todo-table-card[data-v-1d6d47ce]{background:#fff;border:3px solid #333;border-radius:15px;box-shadow:8px 8px #333;overflow:hidden}.cute-table[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif}.cute-table[data-v-1d6d47ce] .el-table__header th{background:linear-gradient(135deg,#87ceeb,#98d8c8);color:#333;font-weight:700}.completed-text[data-v-1d6d47ce]{text-decoration:line-through;color:#909399}.cute-tag[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;border:2px solid #333}[data-v-1d6d47ce] .el-dialog{border:3px solid #333;border-radius:15px;box-shadow:8px 8px #333}[data-v-1d6d47ce] .el-dialog__header{background:linear-gradient(135deg,#87ceeb,#98d8c8);border-bottom:3px solid #333;margin:0;padding:15px 20px}[data-v-1d6d47ce] .el-dialog__header .el-dialog__title{font-family:Comic Sans MS,cursive,sans-serif;font-weight:700;color:#333}.cute-input[data-v-1d6d47ce] .el-input__wrapper{border:2px solid #333;border-radius:8px;box-shadow:none}.cute-checkbox[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;color:#333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input .el-checkbox__inner{border:2px solid #333;border-radius:4px;box-shadow:2px 2px #333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input .el-checkbox__inner:hover{transform:translate(1px,1px);box-shadow:1px 1px #333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input.is-checked .el-checkbox__inner{background:linear-gradient(135deg,#87ceeb,#98d8c8);border-color:#333}[data-v-1d6d47ce] .el-statistic__head{color:inherit;font-family:Comic Sans MS,cursive,sans-serif;font-size:14px}[data-v-1d6d47ce] .el-statistic__content{color:inherit;font-family:Comic Sans MS,cursive,sans-serif;font-size:20px}.pagination-section[data-v-1d6d47ce]{padding:20px;display:flex;justify-content:center;border-top:2px solid #333;background:linear-gradient(135deg,#f5f5f5,#fff)}[data-v-1d6d47ce] .el-pagination{font-family:Comic Sans MS,cursive,sans-serif}[data-v-1d6d47ce] .el-pagination button,[data-v-1d6d47ce] .el-pagination li{border:2px solid #333;border-radius:8px;box-shadow:2px 2px #333;transition:all .1s}[data-v-1d6d47ce] .el-pagination button:hover,[data-v-1d6d47ce] .el-pagination li:hover{transform:translate(1px,1px);box-shadow:1px 1px #333}[data-v-1d6d47ce] .el-pagination button.is-active,[data-v-1d6d47ce] .el-pagination li.is-active{background:linear-gradient(135deg,#87ceeb,#98d8c8);color:#333;font-weight:700}[data-v-1d6d47ce] .el-pagination .el-pager li{border-radius:8px}[data-v-1d6d47ce] .el-pagination .el-pagination__sizes .el-select .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__jump .el-select .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__sizes .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__jump .el-input__wrapper{border:2px solid #333;border-radius:8px;box-shadow:2px 2px #333}@media (max-width: 768px){.todo-app[data-v-1d6d47ce]{padding:10px}.todo-header[data-v-1d6d47ce]{flex-direction:column;gap:15px;align-items:stretch}.todo-title[data-v-1d6d47ce]{font-size:32px;letter-spacing:2px;justify-content:center}.title-dot[data-v-1d6d47ce]{font-size:12px}.button-group[data-v-1d6d47ce]{justify-content:center;flex-wrap:wrap}.cute-btn[data-v-1d6d47ce]{font-size:14px;padding:8px 12px}.todo-stats[data-v-1d6d47ce]{flex-wrap:wrap;justify-content:center;gap:10px}[data-v-1d6d47ce] .el-statistic{text-align:center}[data-v-1d6d47ce] .el-statistic__content{font-size:18px}.search-filter-section[data-v-1d6d47ce]{flex-direction:column;align-items:stretch}.search-input[data-v-1d6d47ce]{min-width:auto;width:100%}.filter-buttons[data-v-1d6d47ce]{justify-content:center;flex-wrap:wrap}.filter-btn[data-v-1d6d47ce]{padding:6px 14px;font-size:14px}.todo-table-card[data-v-1d6d47ce]{border-radius:10px;box-shadow:4px 4px #333}[data-v-1d6d47ce] .el-dialog{width:95%!important;margin:5vh auto!important;max-width:400px}[data-v-1d6d47ce] .el-dialog__header{padding:12px 16px}[data-v-1d6d47ce] .el-dialog__body{padding:15px}.pagination-section[data-v-1d6d47ce]{padding:15px 10px}[data-v-1d6d47ce] .el-pagination{flex-wrap:wrap;justify-content:center;gap:8px}[data-v-1d6d47ce] .el-pagination .el-pagination__sizes,[data-v-1d6d47ce] .el-pagination .el-pagination__jump{margin:0}[data-v-1d6d47ce] .el-pagination button,[data-v-1d6d47ce] .el-pagination li{min-width:32px;height:32px;line-height:28px;padding:0 8px}}@media (max-width: 480px){.todo-title[data-v-1d6d47ce]{font-size:24px;letter-spacing:1px}.title-dot[data-v-1d6d47ce]{font-size:10px}.cute-btn[data-v-1d6d47ce]{font-size:13px;padding:7px 10px}.filter-btn[data-v-1d6d47ce]{padding:5px 12px;font-size:13px}[data-v-1d6d47ce] .el-dialog{width:92%!important}}
1
+ .filter-container[data-v-e5e2df7e]{background:#fff;padding:16px;margin-bottom:12px;border-radius:8px;box-shadow:0 2px 8px #00000014;border:1px solid #e8e8e8}.log-tabs[data-v-e5e2df7e]{margin-bottom:16px}.log-tabs[data-v-e5e2df7e] .el-tabs__header{border-bottom:2px solid #e8e8e8}.log-tabs[data-v-e5e2df7e] .el-tabs__item{color:#333!important;font-weight:500;font-size:14px;padding:0 20px;margin-right:10px;opacity:1!important}.log-tabs[data-v-e5e2df7e] .el-tabs__item:hover{color:#1890ff!important}.log-tabs[data-v-e5e2df7e] .el-tabs__item.is-active{color:#1890ff!important;font-weight:600}.log-tabs[data-v-e5e2df7e] .el-tabs__active-bar{background-color:#1890ff;height:3px}.filter-row[data-v-e5e2df7e]{display:flex;gap:12px;align-items:center}.filter-input[data-v-e5e2df7e]{flex:1}.filter-input[data-v-e5e2df7e] .el-input__wrapper{border:1px solid #d9d9d9;border-radius:6px;background-color:#fff;transition:all .3s}.filter-input[data-v-e5e2df7e] .el-input__wrapper:hover{border-color:#1890ff}.filter-input[data-v-e5e2df7e] .el-input__wrapper.is-focus{border-color:#1890ff;box-shadow:0 0 0 2px #1890ff1a}.filter-input[data-v-e5e2df7e] .el-input__placeholder{color:#8c8c8c}.button-group[data-v-e5e2df7e]{display:flex;gap:8px}[data-v-e5e2df7e] .el-button{background-color:#fff;border:1px solid #d9d9d9;color:#333;border-radius:6px;padding:6px 16px;font-size:13px;transition:all .3s}[data-v-e5e2df7e] .el-button:hover{background-color:#f5f5f5;border-color:#1890ff;color:#1890ff}[data-v-e5e2df7e] .el-button:active{background-color:#e8f4ff}.log-container[data-v-e5e2df7e]{width:100%;height:calc(100vh - 260px);overflow-y:auto;padding:16px 16px 60px;font-family:Consolas,Monaco,Courier New,monospace;background-color:#1a1a2e;color:#e4e4e4;border-radius:8px;box-shadow:0 2px 8px #00000026}.log-line[data-v-e5e2df7e]{line-height:1.6;font-size:13px;padding:2px 0}pre[data-v-e5e2df7e]{margin:0;font-family:inherit;white-space:pre-wrap;word-break:break-all}.log-error[data-v-e5e2df7e]{color:#ff6b6b;text-shadow:0 0 2px rgba(255,107,107,.3)}.log-warn[data-v-e5e2df7e]{color:#ffd93d;text-shadow:0 0 2px rgba(255,217,61,.3)}.log-info[data-v-e5e2df7e]{color:#6bcfff;text-shadow:0 0 2px rgba(107,207,255,.3)}.empty-state[data-v-e5e2df7e]{display:flex;justify-content:center;align-items:center;height:100%;color:#888;font-size:14px}[data-v-e5e2df7e]::-webkit-scrollbar{width:8px;height:8px}[data-v-e5e2df7e]::-webkit-scrollbar-track{background:#2a2a4a;border-radius:4px}[data-v-e5e2df7e]::-webkit-scrollbar-thumb{background:#4a4a6a;border-radius:4px}[data-v-e5e2df7e]::-webkit-scrollbar-thumb:hover{background:#5a5a8a}[data-v-3e8f9409]{box-sizing:border-box}.rocket-calculator[data-v-3e8f9409]{max-width:800px;margin:0 auto;padding:20px;box-sizing:border-box;position:relative;min-height:100vh;overflow-x:hidden}.sci-fi-bg[data-v-3e8f9409]{background:linear-gradient(135deg,#0a0e27,#1a1f3a,#0f172a);color:#e0e7ff}.grid-overlay[data-v-3e8f9409]{position:fixed;top:0;left:0;right:0;bottom:0;background-image:linear-gradient(rgba(0,255,255,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(0,255,255,.03) 1px,transparent 1px);background-size:40px 40px;pointer-events:none;z-index:0}.sci-fi-card[data-v-3e8f9409]{background:#0f172af2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(0,255,255,.2);box-shadow:0 0 20px #00ffff1a,inset 0 0 20px #00000080;position:relative;overflow:visible;z-index:1}.sci-fi-card[data-v-3e8f9409] .k-card__body{padding:24px}.card-header-line[data-v-3e8f9409]{position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,#00ffff,#8b5cf6,transparent);animation:lineGlow-3e8f9409 3s ease-in-out infinite;z-index:1}@keyframes lineGlow-3e8f9409{0%,to{opacity:.5}50%{opacity:1}}.header-card[data-v-3e8f9409]{margin-bottom:24px;text-align:center;position:relative;z-index:10;margin-top:8px}.header-glow[data-v-3e8f9409]{position:absolute;top:-50%;left:50%;transform:translate(-50%);width:200%;height:100%;background:radial-gradient(ellipse,rgba(139,92,246,.15) 0%,transparent 70%);pointer-events:none;z-index:-1}.sci-fi-title[data-v-3e8f9409]{margin:0 0 8px;font-size:28px;font-weight:800;letter-spacing:4px;color:#0ff;background:linear-gradient(90deg,#0ff,#8b5cf6,#0ff);background-size:200% auto;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation:titleShine-3e8f9409 4s linear infinite;position:relative;z-index:2;text-shadow:0 0 30px rgba(0,255,255,.3);line-height:1.4}@keyframes titleShine-3e8f9409{0%{background-position:0% center}to{background-position:200% center}}.sci-fi-subtitle[data-v-3e8f9409]{margin:0;color:#64748b;font-size:13px;letter-spacing:2px;text-transform:uppercase;position:relative;z-index:2;line-height:1.5}.content-layout[data-v-3e8f9409]{display:flex;flex-direction:column;gap:24px;position:relative;z-index:1}.config-section[data-v-3e8f9409]{margin-bottom:20px;position:relative;z-index:1}.section-title[data-v-3e8f9409]{margin:0 0 20px;font-size:14px;color:#0ff;letter-spacing:2px;font-weight:600}.distance-control[data-v-3e8f9409]{width:100%}.distance-step-selector[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-bottom:16px}.step-btn[data-v-3e8f9409]{margin:0;background:#0000004d;border:1px solid rgba(0,255,255,.2);color:#94a3b8;padding:8px 4px;font-size:12px;font-weight:600;transition:all .2s ease;white-space:nowrap}.step-btn[data-v-3e8f9409]:hover{border-color:#00ffff80;color:#0ff;transform:translateY(-1px)}.step-btn.active[data-v-3e8f9409]{background:#00ffff26;border-color:#0ff;color:#0ff;box-shadow:0 0 15px #00ffff4d}.distance-input-wrapper[data-v-3e8f9409]{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px;background:#0000004d;border:1px solid rgba(139,92,246,.3);border-radius:4px}.distance-label[data-v-3e8f9409]{color:#64748b;font-size:13px}.distance-value[data-v-3e8f9409]{font-size:20px;font-weight:800;color:#8b5cf6}.unit[data-v-3e8f9409]{color:#8b5cf6;font-weight:600;font-size:14px}.modules-grid[data-v-3e8f9409]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.module-item[data-v-3e8f9409]{background:#00ffff0d;border:1px solid rgba(0,255,255,.1);padding:12px;border-radius:4px;transition:all .3s ease;display:flex;flex-direction:column;gap:8px}.module-item[data-v-3e8f9409]:hover{border-color:#00ffff4d;background:#00ffff14}.module-name[data-v-3e8f9409]{font-size:13px;color:#94a3b8}.module-input[data-v-3e8f9409]{width:100%}.module-input[data-v-3e8f9409] .el-input__wrapper{background:#0000004d;border:1px solid rgba(0,255,255,.2);box-shadow:none;padding:4px 6px}.module-input[data-v-3e8f9409] .el-input__inner{text-align:center;color:#0ff;font-weight:700;font-size:16px}.module-input[data-v-3e8f9409] .el-input-number__decrease,.module-input[data-v-3e8f9409] .el-input-number__increase{background:#0ff3;color:#0ff;border-color:#00ffff4d;font-weight:800;font-size:16px;transition:all .2s ease}.module-input[data-v-3e8f9409] .el-input-number__decrease:hover,.module-input[data-v-3e8f9409] .el-input-number__increase:hover{background:#0ff6;color:#fff}.module-input[data-v-3e8f9409] .el-input-number__decrease.is-disabled,.module-input[data-v-3e8f9409] .el-input-number__increase.is-disabled{background:#0003;color:#475569;border-color:#ffffff1a}.calculate-btn-wrapper[data-v-3e8f9409]{margin-top:24px;margin-bottom:0}.sci-fi-calculate-btn[data-v-3e8f9409]{width:100%;height:50px;background:linear-gradient(135deg,#0ff,#8b5cf6);border:none;color:#0a0e27;font-weight:800;font-size:16px;letter-spacing:2px;position:relative;overflow:hidden;transition:all .3s ease}.sci-fi-calculate-btn[data-v-3e8f9409]:hover{transform:translateY(-2px);box-shadow:0 10px 30px #00ffff4d}.btn-text[data-v-3e8f9409]{position:relative;z-index:1}.btn-glow[data-v-3e8f9409]{position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.4),transparent);animation:btnScan-3e8f9409 2s ease-in-out infinite}@keyframes btnScan-3e8f9409{0%{left:-100%}to{left:100%}}.sci-fi-radio-group[data-v-3e8f9409]{width:100%;display:flex}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button{flex:1}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__inner{width:100%;background:#0000004d;border:1px solid rgba(0,255,255,.2);color:#94a3b8;font-weight:600;padding:12px 10px;transition:all .2s ease}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__inner:hover{color:#0ff;border-color:#0ff6}.sci-fi-radio-group[data-v-3e8f9409] .el-radio-button__orig-radio:checked+.el-radio-button__inner{background:#00ffff26;border-color:#0ff;color:#0ff;box-shadow:0 0 15px #0ff3}.oxidizer-hint[data-v-3e8f9409]{display:flex;justify-content:space-around;margin-top:8px}.hint-item[data-v-3e8f9409]{font-size:12px;color:#64748b;transition:all .2s ease}.hint-item.active[data-v-3e8f9409]{color:#0ff;font-weight:600}.divider-line[data-v-3e8f9409]{height:1px;background:linear-gradient(90deg,transparent,rgba(0,255,255,.3),transparent);margin:24px 0}.result-header[data-v-3e8f9409]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:8px}.result-title[data-v-3e8f9409]{margin:0;font-size:18px;color:#0ff;letter-spacing:2px}.result-status[data-v-3e8f9409]{display:flex;align-items:center;gap:8px;font-size:12px;color:#67c23a;letter-spacing:1px}.status-dot[data-v-3e8f9409]{width:8px;height:8px;background:#67c23a;border-radius:50%;animation:statusPulse-3e8f9409 2s ease-in-out infinite}@keyframes statusPulse-3e8f9409{0%,to{box-shadow:0 0 #67c23a66}50%{box-shadow:0 0 0 8px #67c23a00}}.key-stats[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:24px}.stat-item[data-v-3e8f9409]{background:#0000004d;border:1px solid rgba(255,255,255,.1);padding:16px;text-align:center;position:relative}.stat-item.primary[data-v-3e8f9409]{border-color:#0ff6;box-shadow:0 0 20px #00ffff1a}.stat-item.success[data-v-3e8f9409]{border-color:#67c23a66;box-shadow:0 0 20px #67c23a1a}.stat-item.warning[data-v-3e8f9409]{border-color:#e6a23c66;box-shadow:0 0 20px #e6a23c1a}.stat-label[data-v-3e8f9409]{font-size:12px;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:1px}.stat-value[data-v-3e8f9409]{font-size:24px;font-weight:800}.stat-item.primary .stat-value[data-v-3e8f9409]{color:#0ff}.stat-item.success .stat-value[data-v-3e8f9409]{color:#67c23a}.stat-item.warning .stat-value[data-v-3e8f9409]{color:#e6a23c}.stat-unit[data-v-3e8f9409]{font-size:14px;opacity:.7}.detail-title[data-v-3e8f9409]{margin:0 0 16px;font-size:14px;color:#8b5cf6;letter-spacing:2px}.detail-grid[data-v-3e8f9409]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.detail-item[data-v-3e8f9409]{display:flex;justify-content:space-between;align-items:center;background:#0003;padding:12px 16px;border-left:3px solid #8b5cf6;gap:8px}.detail-label[data-v-3e8f9409]{font-size:13px;color:#94a3b8}.detail-value[data-v-3e8f9409]{font-size:16px;font-weight:700;color:#e0e7ff;text-align:right}.sci-fi-divider[data-v-3e8f9409]{border-color:#00ffff1a;margin:24px 0}.table-wrapper[data-v-3e8f9409]{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.sci-fi-table[data-v-3e8f9409]{background:#0003;min-width:500px}.sci-fi-table[data-v-3e8f9409] .el-table__header-wrapper{background:#00ffff0d}.sci-fi-table[data-v-3e8f9409] .el-table th{background:transparent;color:#0ff;border-color:#00ffff1a}.sci-fi-table[data-v-3e8f9409] .el-table td{border-color:#ffffff0d}.sci-fi-table[data-v-3e8f9409] .el-table--striped .el-table__body tr.el-table__row--striped{background:#0000001a}.empty-state[data-v-3e8f9409]{text-align:center;padding:60px 20px;position:relative}.scan-line[data-v-3e8f9409]{position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,rgba(0,255,255,.5),transparent);animation:scanMove-3e8f9409 3s linear infinite}@keyframes scanMove-3e8f9409{0%{top:0;opacity:0}10%{opacity:1}90%{opacity:1}to{top:100%;opacity:0}}.empty-icon[data-v-3e8f9409]{font-size:48px;margin-bottom:16px}.empty-text[data-v-3e8f9409]{font-size:16px;color:#64748b;margin:0 0 8px;letter-spacing:1px}.empty-text.error[data-v-3e8f9409]{color:#f87171}.empty-hint[data-v-3e8f9409]{font-size:13px;color:#475569;margin:0 0 24px;line-height:1.5}.sci-fi-reset-btn[data-v-3e8f9409]{background:#8b5cf633;border:1px solid #8b5cf6;color:#8b5cf6}.sci-fi-reset-btn[data-v-3e8f9409]:hover{background:#8b5cf64d;color:#a78bfa}.sci-fi-form[data-v-3e8f9409] .el-form-item__label{color:#94a3b8;font-weight:600;padding-bottom:6px;line-height:1.4}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper{background:#0000004d;border:1px solid rgba(0,255,255,.2);box-shadow:none}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper:hover{border-color:#0ff6}.sci-fi-select[data-v-3e8f9409] .el-input__wrapper.is-focus{border-color:#0ff;box-shadow:0 0 10px #0ff3}@media screen and (max-width: 600px){.rocket-calculator[data-v-3e8f9409]{padding:12px}.sci-fi-title[data-v-3e8f9409]{font-size:20px;letter-spacing:2px}.sci-fi-card[data-v-3e8f9409] .k-card__body{padding:16px}.key-stats[data-v-3e8f9409],.modules-grid[data-v-3e8f9409],.detail-grid[data-v-3e8f9409]{grid-template-columns:1fr}.distance-step-selector[data-v-3e8f9409]{grid-template-columns:repeat(3,1fr)}}.scrollbar[data-v-7f2607d9]{background:linear-gradient(135deg,#0a0e27,#1a1f3a,#0f172a);color:#e0e7ff}.todo-app[data-v-1d6d47ce]{min-height:100vh;position:relative;background:linear-gradient(135deg,#e0f4ff,#f0f8ff,#e8f5ff);padding:20px}.bg-pattern[data-v-1d6d47ce]{position:fixed;top:0;left:0;right:0;bottom:0;background-image:radial-gradient(circle,#b8d4e8 1px,transparent 1px);background-size:25px 25px;opacity:.5;pointer-events:none;z-index:0}.todo-container[data-v-1d6d47ce]{position:relative;z-index:1;max-width:1000px;margin:0 auto}.todo-header[data-v-1d6d47ce]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.todo-title[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;font-size:48px;font-weight:700;color:#fff;text-shadow:2px 2px 0 #333,-2px -2px 0 #333,2px -2px 0 #333,-2px 2px 0 #333,0px 2px 0 #333,0px -2px 0 #333,2px 0px 0 #333,-2px 0px 0 #333,3px 3px 0 #ffd700,4px 4px 0 #333;letter-spacing:5px;display:inline-flex;align-items:center;gap:10px;margin:0}.title-dot[data-v-1d6d47ce]{color:#ff6b9d;font-size:16px;animation:bounce-1d6d47ce .6s infinite alternate}@keyframes bounce-1d6d47ce{0%{transform:translateY(0)}to{transform:translateY(-6px)}}.title-text[data-v-1d6d47ce]{background:linear-gradient(180deg,#fff,#f0f0f0);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.button-group[data-v-1d6d47ce]{display:flex;gap:10px}.cute-btn[data-v-1d6d47ce]{background:#fff;border:2px solid #333;color:#333;font-family:Comic Sans MS,cursive,sans-serif;border-radius:8px;box-shadow:3px 3px #333;transition:all .1s}.cute-btn[data-v-1d6d47ce]:hover{transform:translate(1px,1px);box-shadow:2px 2px #333}.cute-btn[data-v-1d6d47ce]:active{transform:translate(2px,2px);box-shadow:1px 1px #333}.cute-btn.primary[data-v-1d6d47ce]{background:linear-gradient(135deg,#ffb6c1,pink)}.todo-stats[data-v-1d6d47ce]{display:flex;gap:20px;margin-bottom:15px;padding:8px 15px;background:#fff;border:2px solid #333;border-radius:10px;box-shadow:4px 4px #333}.search-filter-section[data-v-1d6d47ce]{display:flex;gap:15px;margin-bottom:20px;align-items:center;flex-wrap:wrap}.search-input[data-v-1d6d47ce]{flex:1;min-width:250px}.filter-buttons[data-v-1d6d47ce]{display:flex;gap:10px}.filter-btn[data-v-1d6d47ce]{background:#fff;border:2px solid #333;color:#333;font-family:Comic Sans MS,cursive,sans-serif;padding:8px 20px;border-radius:8px;box-shadow:3px 3px #333;cursor:pointer;transition:all .1s}.filter-btn[data-v-1d6d47ce]:hover{transform:translate(1px,1px);box-shadow:2px 2px #333}.filter-btn[data-v-1d6d47ce]:active{transform:translate(2px,2px);box-shadow:1px 1px #333}.filter-btn.active[data-v-1d6d47ce]{background:linear-gradient(135deg,#87ceeb,#98d8c8)}.todo-table-card[data-v-1d6d47ce]{background:#fff;border:3px solid #333;border-radius:15px;box-shadow:8px 8px #333;overflow:hidden}.cute-table[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif}.cute-table[data-v-1d6d47ce] .el-table__header th{background:linear-gradient(135deg,#87ceeb,#98d8c8);color:#333;font-weight:700}.completed-text[data-v-1d6d47ce]{text-decoration:line-through;color:#909399}.cute-tag[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;border:2px solid #333}[data-v-1d6d47ce] .el-dialog{border:3px solid #333;border-radius:15px;box-shadow:8px 8px #333}[data-v-1d6d47ce] .el-dialog__header{background:linear-gradient(135deg,#87ceeb,#98d8c8);border-bottom:3px solid #333;margin:0;padding:15px 20px}[data-v-1d6d47ce] .el-dialog__header .el-dialog__title{font-family:Comic Sans MS,cursive,sans-serif;font-weight:700;color:#333}.cute-input[data-v-1d6d47ce] .el-input__wrapper{border:2px solid #333;border-radius:8px;box-shadow:none}.cute-checkbox[data-v-1d6d47ce]{font-family:Comic Sans MS,cursive,sans-serif;color:#333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input .el-checkbox__inner{border:2px solid #333;border-radius:4px;box-shadow:2px 2px #333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input .el-checkbox__inner:hover{transform:translate(1px,1px);box-shadow:1px 1px #333}.cute-checkbox[data-v-1d6d47ce] .el-checkbox__input.is-checked .el-checkbox__inner{background:linear-gradient(135deg,#87ceeb,#98d8c8);border-color:#333}[data-v-1d6d47ce] .el-statistic__head{color:inherit;font-family:Comic Sans MS,cursive,sans-serif;font-size:14px}[data-v-1d6d47ce] .el-statistic__content{color:inherit;font-family:Comic Sans MS,cursive,sans-serif;font-size:20px}.pagination-section[data-v-1d6d47ce]{padding:20px;display:flex;justify-content:center;border-top:2px solid #333;background:linear-gradient(135deg,#f5f5f5,#fff)}[data-v-1d6d47ce] .el-pagination{font-family:Comic Sans MS,cursive,sans-serif}[data-v-1d6d47ce] .el-pagination button,[data-v-1d6d47ce] .el-pagination li{border:2px solid #333;border-radius:8px;box-shadow:2px 2px #333;transition:all .1s}[data-v-1d6d47ce] .el-pagination button:hover,[data-v-1d6d47ce] .el-pagination li:hover{transform:translate(1px,1px);box-shadow:1px 1px #333}[data-v-1d6d47ce] .el-pagination button.is-active,[data-v-1d6d47ce] .el-pagination li.is-active{background:linear-gradient(135deg,#87ceeb,#98d8c8);color:#333;font-weight:700}[data-v-1d6d47ce] .el-pagination .el-pager li{border-radius:8px}[data-v-1d6d47ce] .el-pagination .el-pagination__sizes .el-select .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__jump .el-select .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__sizes .el-input__wrapper,[data-v-1d6d47ce] .el-pagination .el-pagination__jump .el-input__wrapper{border:2px solid #333;border-radius:8px;box-shadow:2px 2px #333}@media (max-width: 768px){.todo-app[data-v-1d6d47ce]{padding:10px}.todo-header[data-v-1d6d47ce]{flex-direction:column;gap:15px;align-items:stretch}.todo-title[data-v-1d6d47ce]{font-size:32px;letter-spacing:2px;justify-content:center}.title-dot[data-v-1d6d47ce]{font-size:12px}.button-group[data-v-1d6d47ce]{justify-content:center;flex-wrap:wrap}.cute-btn[data-v-1d6d47ce]{font-size:14px;padding:8px 12px}.todo-stats[data-v-1d6d47ce]{flex-wrap:wrap;justify-content:center;gap:10px}[data-v-1d6d47ce] .el-statistic{text-align:center}[data-v-1d6d47ce] .el-statistic__content{font-size:18px}.search-filter-section[data-v-1d6d47ce]{flex-direction:column;align-items:stretch}.search-input[data-v-1d6d47ce]{min-width:auto;width:100%}.filter-buttons[data-v-1d6d47ce]{justify-content:center;flex-wrap:wrap}.filter-btn[data-v-1d6d47ce]{padding:6px 14px;font-size:14px}.todo-table-card[data-v-1d6d47ce]{border-radius:10px;box-shadow:4px 4px #333}[data-v-1d6d47ce] .el-dialog{width:95%!important;margin:5vh auto!important;max-width:400px}[data-v-1d6d47ce] .el-dialog__header{padding:12px 16px}[data-v-1d6d47ce] .el-dialog__body{padding:15px}.pagination-section[data-v-1d6d47ce]{padding:15px 10px}[data-v-1d6d47ce] .el-pagination{flex-wrap:wrap;justify-content:center;gap:8px}[data-v-1d6d47ce] .el-pagination .el-pagination__sizes,[data-v-1d6d47ce] .el-pagination .el-pagination__jump{margin:0}[data-v-1d6d47ce] .el-pagination button,[data-v-1d6d47ce] .el-pagination li{min-width:32px;height:32px;line-height:28px;padding:0 8px}}@media (max-width: 480px){.todo-title[data-v-1d6d47ce]{font-size:24px;letter-spacing:1px}.title-dot[data-v-1d6d47ce]{font-size:10px}.cute-btn[data-v-1d6d47ce]{font-size:13px;padding:7px 10px}.filter-btn[data-v-1d6d47ce]{padding:5px 12px;font-size:13px}[data-v-1d6d47ce] .el-dialog{width:92%!important}}
package/lib/index.js CHANGED
@@ -35,7 +35,7 @@ __export(src_exports, {
35
35
  name: () => name
36
36
  });
37
37
  module.exports = __toCommonJS(src_exports);
38
- var import_koishi11 = require("koishi");
38
+ var import_koishi12 = require("koishi");
39
39
  var import_path = require("path");
40
40
 
41
41
  // src/services/wikiBotService.ts
@@ -145,6 +145,22 @@ function getErrorMessage(error) {
145
145
  return String(error);
146
146
  }
147
147
  __name(getErrorMessage, "getErrorMessage");
148
+ function formatWikiTime(isoString) {
149
+ try {
150
+ const date = new Date(isoString);
151
+ if (Number.isNaN(date.getTime())) return isoString;
152
+ const pad = /* @__PURE__ */ __name((n) => String(n).padStart(2, "0"), "pad");
153
+ const y = date.getFullYear();
154
+ const m = pad(date.getMonth() + 1);
155
+ const d = pad(date.getDate());
156
+ const hh = pad((date.getUTCHours() + 8) % 24);
157
+ const mm = pad(date.getUTCMinutes());
158
+ return `${y}-${m}-${d} ${hh}:${mm}`;
159
+ } catch {
160
+ return isoString;
161
+ }
162
+ }
163
+ __name(formatWikiTime, "formatWikiTime");
148
164
 
149
165
  // src/services/wikiBotService.ts
150
166
  var WikiBotService = class _WikiBotService extends import_koishi2.Service {
@@ -466,7 +482,9 @@ var DatabaseExtension = class {
466
482
  id: "integer",
467
483
  title: "string",
468
484
  pinyin_full: "string",
469
- pinyin_first: "string"
485
+ pinyin_first: "string",
486
+ contributor: "string",
487
+ change_time: "string"
470
488
  });
471
489
  }
472
490
  };
@@ -503,6 +521,20 @@ var RouteRedirect = class {
503
521
  )}`;
504
522
  router.redirect(targetUrl);
505
523
  });
524
+ ctx.server.use("/ggwiki", async (router, next) => {
525
+ const fullPath = router.path.replace("/ggwiki", "") || "";
526
+ const decodedPath = decodeURIComponent(fullPath);
527
+ if (decodedPath.includes("..")) {
528
+ return router.body = "❌ 非法路径访问!";
529
+ }
530
+ if (!/^(\/[\p{L}\p{N}_\-:.%]+)*\/?$/u.test(fullPath)) {
531
+ return router.body = "❌ 路径包含非法字符!";
532
+ }
533
+ const queryString = router.querystring ? `?${router.querystring}` : "";
534
+ const targetUrl = `https://${this.config.main_site}${fullPath}${queryString}`;
535
+ router.redirect(targetUrl);
536
+ return;
537
+ });
506
538
  }
507
539
  };
508
540
  ((RouteRedirect2) => {
@@ -815,8 +847,72 @@ var CONFIG2 = {
815
847
  BATCH_LIMIT: "max",
816
848
  FILE_NAMESPACE_PREFIX: "File:",
817
849
  DEFAULT_USER: "同步坤器人",
818
- INCREMENTAL_USER: "定时同步"
850
+ INCREMENTAL_USER: "定时同步",
851
+ DB_RETRY_MAX: 3,
852
+ DB_RETRY_DELAY: 500
819
853
  };
854
+ async function withRetry(fn, maxRetries = CONFIG2.DB_RETRY_MAX, delay = CONFIG2.DB_RETRY_DELAY) {
855
+ let lastError;
856
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
857
+ try {
858
+ return await fn();
859
+ } catch (err) {
860
+ lastError = err instanceof Error ? err : new Error(String(err));
861
+ if (attempt < maxRetries) {
862
+ logger.debug(
863
+ `数据库操作失败,正在重试 (${attempt}/${maxRetries}): ${lastError.message}`
864
+ );
865
+ await (0, import_koishi6.sleep)(delay);
866
+ }
867
+ }
868
+ }
869
+ throw lastError || new Error("数据库操作失败");
870
+ }
871
+ __name(withRetry, "withRetry");
872
+ async function ensurePageInDatabase(database, pageId, title) {
873
+ if (!database) return;
874
+ try {
875
+ await withRetry(async () => {
876
+ const existing = await database.get("wikipages", { title });
877
+ if (existing.length === 0) {
878
+ const { pinyin_full, pinyin_first } = generatePinyinInfo(title);
879
+ await database.create("wikipages", {
880
+ id: pageId,
881
+ title,
882
+ pinyin_full,
883
+ pinyin_first
884
+ });
885
+ logger.info(`[数据库初始化] ✅ 页面 ${title} 已添加到数据库`);
886
+ }
887
+ });
888
+ } catch (err) {
889
+ const errMsg = err instanceof Error ? err.message : String(err);
890
+ logger.warn(`[数据库初始化] ❌ 初始化页面 ${title} 失败: ${errMsg}`);
891
+ }
892
+ }
893
+ __name(ensurePageInDatabase, "ensurePageInDatabase");
894
+ async function updateContributorToDatabase(database, title, user, timestamp) {
895
+ if (!database) return;
896
+ try {
897
+ await withRetry(async () => {
898
+ await database.set(
899
+ "wikipages",
900
+ { title },
901
+ {
902
+ contributor: user,
903
+ change_time: formatWikiTime(timestamp)
904
+ }
905
+ );
906
+ logger.debug(`[数据库更新] ✅ 页面 ${title} 的贡献者信息已更新: ${user}`);
907
+ });
908
+ } catch (err) {
909
+ const errMsg = err instanceof Error ? err.message : String(err);
910
+ logger.warn(
911
+ `[数据库更新] ❌ 更新页面 ${title} 的贡献者信息失败: ${errMsg}`
912
+ );
913
+ }
914
+ }
915
+ __name(updateContributorToDatabase, "updateContributorToDatabase");
820
916
  async function syncSinglePage(oldSite, newSite, pageTitle, user) {
821
917
  if (CONFIG2.IGNORED_PAGES.has(pageTitle)) {
822
918
  logger.info(`[syncSinglePage] 🚫 页面 ${pageTitle} 在忽略列表中,跳过`);
@@ -971,7 +1067,13 @@ async function syncPages(oldSite, newSite) {
971
1067
  }
972
1068
  }
973
1069
  __name(syncPages, "syncPages");
974
- async function incrementalUpdate(oldSite, newSite, config, onSynced) {
1070
+ async function incrementalUpdate(oldSite, newSite, config, onSynced, database) {
1071
+ const startTime = Date.now();
1072
+ const processedTitles = /* @__PURE__ */ new Set();
1073
+ const syncedItems = [];
1074
+ let totalProcessed = 0;
1075
+ let totalSkipped = 0;
1076
+ let totalSynced = 0;
975
1077
  try {
976
1078
  const now = /* @__PURE__ */ new Date();
977
1079
  const threeHoursAgo = new Date(now.getTime() - 3 * 60 * 60 * 1e3);
@@ -984,18 +1086,20 @@ async function incrementalUpdate(oldSite, newSite, config, onSynced) {
984
1086
  rcstart: now.toISOString(),
985
1087
  rcend: threeHoursAgo.toISOString(),
986
1088
  rcdir: "older",
987
- rcprop: "user|comment|title|timestamp"
1089
+ rcprop: "user|comment|title|timestamp|ids"
988
1090
  });
989
- const processedTitles = /* @__PURE__ */ new Set();
990
- let totalProcessed = 0;
991
- let totalSkipped = 0;
992
- const syncedItems = [];
993
1091
  for await (const res of queryGen) {
994
1092
  const pages = res.query?.recentchanges || [];
995
1093
  for (const page of pages) {
996
- const title = page.title;
1094
+ const {
1095
+ title,
1096
+ user: rcUser,
1097
+ timestamp: rcTimestamp,
1098
+ comment: rcComment,
1099
+ pageid
1100
+ } = page;
997
1101
  if (processedTitles.has(title)) {
998
- logger.info(`[增量更新流程] ⏭️ 已经处理过 ${title}, 跳过`);
1102
+ logger.debug(`[增量更新流程] ⏭️ 已处理过 ${title}, 跳过`);
999
1103
  totalSkipped++;
1000
1104
  continue;
1001
1105
  }
@@ -1010,45 +1114,33 @@ async function incrementalUpdate(oldSite, newSite, config, onSynced) {
1010
1114
  processedTitles.add(title);
1011
1115
  totalProcessed++;
1012
1116
  try {
1013
- const rcUser = page.user || "未知";
1014
- const rcTimestamp = page.timestamp || "";
1015
- const rcComment = page.comment || "";
1117
+ const user = rcUser || "未知";
1118
+ const timestamp = rcTimestamp || "";
1119
+ const comment = rcComment || "";
1016
1120
  if (title.startsWith(CONFIG2.FILE_NAMESPACE_PREFIX)) {
1017
- const fileName = title.replace(CONFIG2.FILE_NAMESPACE_PREFIX, "");
1018
- logger.info(
1019
- `[增量更新流程] 🖼️ 检查到图片: ${title},正在尝试转存`
1020
- );
1021
- const result = await syncSingleImage(
1121
+ await handleImageSync(
1022
1122
  oldSite,
1023
1123
  newSite,
1024
- fileName,
1025
- config
1124
+ title,
1125
+ user,
1126
+ timestamp,
1127
+ comment,
1128
+ config,
1129
+ syncedItems
1026
1130
  );
1027
- if (result.success && result.reason === "synced") {
1028
- syncedItems.push({
1029
- title,
1030
- type: "image",
1031
- user: rcUser,
1032
- timestamp: rcTimestamp,
1033
- comment: rcComment
1034
- });
1035
- }
1036
1131
  } else {
1037
- const result = await syncSinglePage(
1132
+ await handlePageSync(
1038
1133
  oldSite,
1039
1134
  newSite,
1040
1135
  title,
1041
- rcUser
1136
+ pageid || 0,
1137
+ user,
1138
+ timestamp,
1139
+ comment,
1140
+ database,
1141
+ syncedItems
1042
1142
  );
1043
- if (result.success && result.reason === "synced") {
1044
- syncedItems.push({
1045
- title,
1046
- type: "page",
1047
- user: rcUser,
1048
- timestamp: rcTimestamp,
1049
- comment: rcComment
1050
- });
1051
- }
1143
+ totalSynced++;
1052
1144
  }
1053
1145
  await (0, import_koishi6.sleep)(CONFIG2.SYNC_INTERVAL_SUCCESS);
1054
1146
  } catch (error) {
@@ -1058,18 +1150,50 @@ async function incrementalUpdate(oldSite, newSite, config, onSynced) {
1058
1150
  }
1059
1151
  }
1060
1152
  }
1153
+ } catch (globalError) {
1154
+ logger.error(`[增量更新流程] 💥 增量更新流程异常终止:`, globalError);
1155
+ throw globalError;
1156
+ } finally {
1157
+ const duration = (Date.now() - startTime) / 1e3;
1061
1158
  logger.info(
1062
- `[增量更新流程] ✅ 增量更新完成!处理: ${totalProcessed}, 跳过: ${totalSkipped}, 通知: ${syncedItems.length}`
1159
+ `[增量更新流程] ✅ 增量更新完成!处理: ${totalProcessed}, 跳过: ${totalSkipped}, 同步: ${totalSynced}, 通知: ${syncedItems.length}, 耗时: ${duration.toFixed(2)}s`
1063
1160
  );
1064
1161
  if (syncedItems.length > 0) {
1065
1162
  onSynced?.(syncedItems);
1066
1163
  }
1067
- } catch (globalError) {
1068
- logger.error(`[增量更新流程] 💥 增量更新流程异常终止:`, globalError);
1069
- throw globalError;
1070
1164
  }
1071
1165
  }
1072
1166
  __name(incrementalUpdate, "incrementalUpdate");
1167
+ async function handleImageSync(oldSite, newSite, title, user, timestamp, comment, config, syncedItems) {
1168
+ const fileName = title.replace(CONFIG2.FILE_NAMESPACE_PREFIX, "");
1169
+ logger.info(`[增量更新流程] 🖼️ 检查到图片: ${title},正在尝试转存`);
1170
+ const result = await syncSingleImage(oldSite, newSite, fileName, config);
1171
+ if (result.success && result.reason === "synced") {
1172
+ syncedItems.push({
1173
+ title,
1174
+ type: "image",
1175
+ user,
1176
+ timestamp,
1177
+ comment
1178
+ });
1179
+ }
1180
+ }
1181
+ __name(handleImageSync, "handleImageSync");
1182
+ async function handlePageSync(oldSite, newSite, title, pageId, user, timestamp, comment, database, syncedItems) {
1183
+ await ensurePageInDatabase(database, pageId, title);
1184
+ const result = await syncSinglePage(oldSite, newSite, title, user);
1185
+ if (result.success && result.reason === "synced") {
1186
+ syncedItems.push({
1187
+ title,
1188
+ type: "page",
1189
+ user,
1190
+ timestamp,
1191
+ comment
1192
+ });
1193
+ await updateContributorToDatabase(database, title, user, timestamp);
1194
+ }
1195
+ }
1196
+ __name(handlePageSync, "handlePageSync");
1073
1197
 
1074
1198
  // src/sync/moduleSync.ts
1075
1199
  var import_koishi7 = require("koishi");
@@ -1238,27 +1362,11 @@ async function syncModules(oldSite, newSite) {
1238
1362
  __name(syncModules, "syncModules");
1239
1363
 
1240
1364
  // src/plugins/syncCommands.ts
1241
- function formatWikiTime(isoString) {
1242
- try {
1243
- const date = new Date(isoString);
1244
- if (Number.isNaN(date.getTime())) return isoString;
1245
- const pad = /* @__PURE__ */ __name((n) => String(n).padStart(2, "0"), "pad");
1246
- const y = date.getFullYear();
1247
- const m = pad(date.getMonth() + 1);
1248
- const d = pad(date.getDate());
1249
- const hh = pad(date.getHours());
1250
- const mm = pad(date.getMinutes());
1251
- return `${y}-${m}-${d} ${hh}:${mm}`;
1252
- } catch {
1253
- return isoString;
1254
- }
1255
- }
1256
- __name(formatWikiTime, "formatWikiTime");
1257
1365
  var SyncCommands = class {
1258
1366
  static {
1259
1367
  __name(this, "SyncCommands");
1260
1368
  }
1261
- static inject = ["wikiBot", "cron"];
1369
+ static inject = ["wikiBot", "database", "cron"];
1262
1370
  config;
1263
1371
  notifyFn;
1264
1372
  constructor(ctx, config) {
@@ -1271,7 +1379,8 @@ var SyncCommands = class {
1271
1379
  ctx.wikiBot.getGGBot(),
1272
1380
  ctx.wikiBot.getBWikiBot(),
1273
1381
  config,
1274
- this.notifyFn
1382
+ this.notifyFn,
1383
+ ctx.database
1275
1384
  );
1276
1385
  });
1277
1386
  ctx.cron("30 8 * * 4", async () => {
@@ -1716,7 +1825,20 @@ bwiki: https://${this.config.domain}/bw/88888888`;
1716
1825
  `;
1717
1826
  }
1718
1827
  md += `**📖 ${match.title}**
1828
+
1829
+ `;
1830
+ if (match.contributor || match.change_time) {
1831
+ md += "---\n";
1832
+ if (match.contributor) {
1833
+ md += `> **👤 最后贡献者:** ${match.contributor}
1719
1834
  `;
1835
+ }
1836
+ if (match.change_time) {
1837
+ md += `> **🕐 最后修改:** ${match.change_time}
1838
+ `;
1839
+ }
1840
+ md += "惟知是信 至诚若天\n---\n";
1841
+ }
1720
1842
  const keyboard = this.buildResultKeyboard(match);
1721
1843
  return this.sendResponse(session, md, keyboard);
1722
1844
  }
@@ -1724,9 +1846,24 @@ bwiki: https://${this.config.domain}/bw/88888888`;
1724
1846
  if (prefix) {
1725
1847
  message += prefix + "\n";
1726
1848
  }
1727
- message += `GG原站点: https://${this.config.domain}/gg/${match.id}
1728
-
1729
- bwiki: https://${this.config.domain}/bw/${match.id}`;
1849
+ message += `📖 ${match.title}
1850
+ `;
1851
+ if (match.contributor || match.change_time) {
1852
+ message += "--------\n";
1853
+ if (match.contributor) {
1854
+ message += `👤 最后贡献者:${match.contributor}
1855
+ `;
1856
+ }
1857
+ if (match.change_time) {
1858
+ message += `🕐 最后修改:${match.change_time}
1859
+ `;
1860
+ }
1861
+ }
1862
+ message += "惟知是信 至诚若天\n";
1863
+ message += "--------\n";
1864
+ message += `🔗 GG原站点: \`https://${this.config.domain}/gg/${match.id}\`
1865
+ `;
1866
+ message += `📚 bwiki: \`https://${this.config.domain}/bw/${match.id}\``;
1730
1867
  return message;
1731
1868
  }
1732
1869
  async findPreciseMatch(ctx, queryKey, queryPinyinFull, queryPinyinFirst) {
@@ -1839,45 +1976,65 @@ bwiki: https://${this.config.domain}/bw/${match.id}`;
1839
1976
  // src/plugins/updateCommands.ts
1840
1977
  var import_koishi10 = require("koishi");
1841
1978
  var UpdateCommands = class {
1979
+ constructor(ctx, config) {
1980
+ this.ctx = ctx;
1981
+ this.config = config;
1982
+ this.log = ctx.logger("oni-sync");
1983
+ this.registerCommands(ctx);
1984
+ this.registerCronJobs(ctx);
1985
+ }
1842
1986
  static {
1843
1987
  __name(this, "UpdateCommands");
1844
1988
  }
1845
- static inject = ["database", "wikiBot"];
1989
+ static inject = ["database", "wikiBot", "cron"];
1846
1990
  config;
1847
1991
  log;
1848
- constructor(ctx, config) {
1849
- this.config = config;
1850
- this.log = ctx.logger("oni-sync");
1851
- this.registerCommands(ctx);
1992
+ registerCronJobs(ctx) {
1993
+ const cronExpression = this.config.updateCron || "0 2 * * *";
1994
+ ctx.cron(cronExpression, async () => {
1995
+ if (!this.ctx.wikiBot.isReady) {
1996
+ this.log.warn("定时任务:WikiBot 服务未就绪,跳过页面缓存更新");
1997
+ return;
1998
+ }
1999
+ this.log.info("定时任务:开始每日自动更新本地页面缓存(主站)");
2000
+ try {
2001
+ const result = await this.updatePageCache();
2002
+ this.log.info(`定时任务完成:更新 ${result.count} 条页面到本地缓存`);
2003
+ } catch (err) {
2004
+ this.log.error("定时任务失败:自动更新页面缓存", err);
2005
+ }
2006
+ });
2007
+ }
2008
+ async updatePageCache() {
2009
+ const res = await this.ctx.wikiBot.getGGBot().request({
2010
+ action: "query",
2011
+ list: "allpages",
2012
+ format: "json",
2013
+ aplimit: "max"
2014
+ });
2015
+ logger.info("主站页面查询成功");
2016
+ const pages = res.query.allpages || [];
2017
+ const pageData = pages.map((page) => {
2018
+ const { pinyin_full, pinyin_first } = generatePinyinInfo(page.title);
2019
+ return {
2020
+ id: page.pageid,
2021
+ title: page.title,
2022
+ pinyin_full,
2023
+ pinyin_first
2024
+ };
2025
+ });
2026
+ if (pageData.length > 0) {
2027
+ await this.ctx.database.upsert("wikipages", pageData);
2028
+ }
2029
+ logger.info(`检索到 ${pages.length} 个页面,已更新至数据库`);
2030
+ return { count: pages.length };
1852
2031
  }
1853
2032
  registerCommands(ctx) {
1854
2033
  ctx.command("update", "更新本地页面缓存(主站)", { authority: 2 }).action(async ({ session }) => {
1855
2034
  await session.execute("update.status");
1856
2035
  try {
1857
- const res = await ctx.wikiBot.getGGBot().request({
1858
- action: "query",
1859
- list: "allpages",
1860
- format: "json",
1861
- aplimit: "max"
1862
- });
1863
- logger.info("主站页面查询成功");
1864
- const pages = res.query.allpages || [];
1865
- const pageData = pages.map((page) => {
1866
- const { pinyin_full, pinyin_first } = generatePinyinInfo(
1867
- page.title
1868
- );
1869
- return {
1870
- id: page.pageid,
1871
- title: page.title,
1872
- pinyin_full,
1873
- pinyin_first
1874
- };
1875
- });
1876
- if (pageData.length > 0) {
1877
- await ctx.database.upsert("wikipages", pageData);
1878
- }
1879
- session.send(`✅ 检索到 ${pages.length} 个页面,已更新至数据库`);
1880
- logger.info(`检索到 ${pages.length} 个页面,已更新至数据库`);
2036
+ const result = await this.updatePageCache();
2037
+ session.send(`✅ 检索到 ${result.count} 个页面,已更新至数据库`);
1881
2038
  } catch (err) {
1882
2039
  this.log.error("主站缓存更新失败", err);
1883
2040
  session.send("❌ 主站缓存更新失败,请联系管理员查看日志");
@@ -1950,7 +2107,8 @@ var UpdateCommands = class {
1950
2107
  };
1951
2108
  ((UpdateCommands2) => {
1952
2109
  UpdateCommands2.Config = import_koishi10.Schema.object({
1953
- logsUrl: import_koishi10.Schema.string().description("日志查看地址").default("https://klei.vip/onilogs")
2110
+ logsUrl: import_koishi10.Schema.string().description("日志查看地址").default("https://klei.vip/onilogs"),
2111
+ updateCron: import_koishi10.Schema.string().description("页面缓存自动更新 cron 表达式(默认每天凌晨 2 点)").default("0 2 * * *")
1954
2112
  });
1955
2113
  })(UpdateCommands || (UpdateCommands = {}));
1956
2114
 
@@ -2393,9 +2551,167 @@ var TodoList = class {
2393
2551
  }
2394
2552
  };
2395
2553
 
2554
+ // src/plugins/syncContributor.ts
2555
+ var import_koishi11 = require("koishi");
2556
+ var SyncContributor = class {
2557
+ constructor(ctx, config) {
2558
+ this.config = config;
2559
+ this.ctx = ctx;
2560
+ this.logger = ctx.logger("【同步贡献者】");
2561
+ this.registerCommands(ctx);
2562
+ this.setupWeeklySchedule(ctx);
2563
+ }
2564
+ static {
2565
+ __name(this, "SyncContributor");
2566
+ }
2567
+ static inject = ["wikiBot", "database", "cron"];
2568
+ logger;
2569
+ ctx;
2570
+ setupWeeklySchedule(ctx) {
2571
+ ctx.cron("0 0 2 * * 0", async () => {
2572
+ this.logger.info("⏰ 开始执行每周日贡献者同步任务");
2573
+ await this.executeSyncAllContributors("定时任务");
2574
+ });
2575
+ this.logger.info("✅ 每周日贡献者定时同步任务已注册(每周日凌晨2点执行)");
2576
+ }
2577
+ async executeSyncAllContributors(source) {
2578
+ try {
2579
+ if (!this.ctx.wikiBot.isReady) {
2580
+ const msg = "❌ WikiBot 服务尚未就绪";
2581
+ this.logger.warn(`[${source}] ${msg}`);
2582
+ return msg;
2583
+ }
2584
+ const pages = await this.ctx.database.get("wikipages", {});
2585
+ this.logger.info(`[${source}] 开始处理 ${pages.length} 个页面`);
2586
+ if (pages.length === 0) {
2587
+ const msg = "⚠️ 数据库中没有页面数据";
2588
+ this.logger.warn(`[${source}] ${msg}`);
2589
+ return msg;
2590
+ }
2591
+ let successCount = 0;
2592
+ let failCount = 0;
2593
+ const failedPages = [];
2594
+ for (const page of pages) {
2595
+ await (0, import_koishi11.sleep)(800);
2596
+ try {
2597
+ const data = await getContributorsAndTimestamp(
2598
+ page.title,
2599
+ this.ctx.wikiBot.getGGBot()
2600
+ );
2601
+ if (data.contributor && data.contributor !== "") {
2602
+ await this.ctx.database.set(
2603
+ "wikipages",
2604
+ { title: page.title },
2605
+ {
2606
+ contributor: data.contributor,
2607
+ change_time: data.change_time
2608
+ }
2609
+ );
2610
+ successCount++;
2611
+ }
2612
+ } catch (err) {
2613
+ failCount++;
2614
+ const errorMsg = err instanceof Error ? err.message : String(err);
2615
+ failedPages.push(page.title);
2616
+ this.logger.error(
2617
+ `[${source}] 页面 ${page.title} 同步失败: ${errorMsg}`
2618
+ );
2619
+ }
2620
+ }
2621
+ const resultMsg = `✅ 同步完成,成功: ${successCount},失败: ${failCount}`;
2622
+ this.logger.info(`[${source}] ${resultMsg}`);
2623
+ if (failedPages.length > 0) {
2624
+ this.logger.warn(`[${source}] 失败页面列表: ${failedPages.join(", ")}`);
2625
+ }
2626
+ return resultMsg;
2627
+ } catch (err) {
2628
+ const errorMsg = err instanceof Error ? err.message : String(err);
2629
+ const msg = `❌ 同步所有页面贡献者失败: ${errorMsg}`;
2630
+ this.logger.error(`[${source}] ${msg}`);
2631
+ return msg;
2632
+ }
2633
+ }
2634
+ registerCommands(ctx) {
2635
+ ctx.command("synccontributor <title:text>", "同步页面的贡献者", {
2636
+ authority: 2
2637
+ }).action(async ({ session }, title) => {
2638
+ return this.syncSinglePage(title);
2639
+ });
2640
+ ctx.command("synccontributor.all", "同步所有页面的贡献者", { authority: 2 }).action(async ({ session }) => {
2641
+ return this.executeSyncAllContributors("手动命令");
2642
+ });
2643
+ }
2644
+ async syncSinglePage(title) {
2645
+ try {
2646
+ if (!this.ctx.wikiBot.isReady) {
2647
+ const msg = "❌ WikiBot 服务尚未就绪,请稍后重试";
2648
+ this.logger.warn(`[单页同步] ${msg}`);
2649
+ return msg;
2650
+ }
2651
+ if (!this.ctx.wikiBot.isGGBotReady()) {
2652
+ const msg = "❌ WIKIGG Bot 尚未就绪";
2653
+ this.logger.warn(`[单页同步] ${msg}`);
2654
+ return msg;
2655
+ }
2656
+ this.logger.info(`[单页同步] 开始处理页面: ${title}`);
2657
+ const data = await getContributorsAndTimestamp(
2658
+ title,
2659
+ this.ctx.wikiBot.getGGBot()
2660
+ );
2661
+ if (!data.contributor || data.contributor === "") {
2662
+ const msg = `❌ 页面 "${title}" 不存在或未被编辑`;
2663
+ this.logger.warn(`[单页同步] ${msg}`);
2664
+ return msg;
2665
+ }
2666
+ await this.ctx.database.set(
2667
+ "wikipages",
2668
+ { title },
2669
+ {
2670
+ contributor: data.contributor,
2671
+ change_time: data.change_time
2672
+ }
2673
+ );
2674
+ const successMsg = `✅ 页面 ${title} 的贡献者已同步为:${data.contributor},时间:${data.change_time}`;
2675
+ this.logger.info(`[单页同步] ${successMsg}`);
2676
+ return successMsg;
2677
+ } catch (err) {
2678
+ const errorMsg = err instanceof Error ? err.message : String(err);
2679
+ const msg = `❌ 同步页面 "${title}" 的贡献者失败: ${errorMsg}`;
2680
+ this.logger.error(`[单页同步] ${msg}`);
2681
+ return msg;
2682
+ }
2683
+ }
2684
+ };
2685
+ async function getContributorsAndTimestamp(title, sourceBot) {
2686
+ if (!title) return { contributor: "", change_time: "" };
2687
+ try {
2688
+ const res = await sourceBot.request({
2689
+ action: "query",
2690
+ format: "json",
2691
+ prop: "revisions",
2692
+ titles: title,
2693
+ formatversion: "2",
2694
+ rvprop: "timestamp|user"
2695
+ });
2696
+ if (res.query.pages[0].missing === true) {
2697
+ return { contributor: "", change_time: "" };
2698
+ }
2699
+ const revisions = res.query.pages[0].revisions[0];
2700
+ return {
2701
+ contributor: revisions.user,
2702
+ change_time: formatWikiTime(revisions.timestamp)
2703
+ };
2704
+ } catch (err) {
2705
+ const errorMsg = err instanceof Error ? err.message : String(err);
2706
+ this.logger.error(`[同步贡献者] ❌ 处理 ${title} 时出错: ${errorMsg}`);
2707
+ return { contributor: "", change_time: "" };
2708
+ }
2709
+ }
2710
+ __name(getContributorsAndTimestamp, "getContributorsAndTimestamp");
2711
+
2396
2712
  // src/index.ts
2397
2713
  var name = "oni-sync-bot";
2398
- var Config = import_koishi11.Schema.intersect([
2714
+ var Config = import_koishi12.Schema.intersect([
2399
2715
  WikiBotService.Config,
2400
2716
  RouteRedirect.Config,
2401
2717
  SyncCommands.Config,
@@ -2411,6 +2727,7 @@ function apply(ctx, config) {
2411
2727
  ctx.plugin(QueryCommands, config);
2412
2728
  ctx.plugin(UpdateCommands, config);
2413
2729
  ctx.plugin(TodoList);
2730
+ ctx.plugin(SyncContributor, config);
2414
2731
  ctx.inject(["console"], (ctx2) => {
2415
2732
  ctx2.console.addEntry({
2416
2733
  dev: (0, import_path.resolve)(__dirname, "../client/index.ts"),
@@ -9,6 +9,8 @@ export interface WikiPages {
9
9
  title: string;
10
10
  pinyin_full: string;
11
11
  pinyin_first: string;
12
+ contributor?: string;
13
+ change_time?: string;
12
14
  }
13
15
  export declare class DatabaseExtension {
14
16
  static readonly inject: string[];
@@ -0,0 +1,15 @@
1
+ import { Context } from "koishi";
2
+ export interface ContributorConfig {
3
+ }
4
+ export declare class SyncContributor {
5
+ private config;
6
+ static readonly inject: string[];
7
+ private logger;
8
+ private ctx;
9
+ constructor(ctx: Context, config: ContributorConfig);
10
+ private setupWeeklySchedule;
11
+ private executeSyncAllContributors;
12
+ private registerCommands;
13
+ private syncSinglePage;
14
+ }
15
+ export declare function apply(ctx: Context, config: ContributorConfig): void;
@@ -1,12 +1,16 @@
1
1
  import { Context, Logger, Schema } from "koishi";
2
2
  export interface UpdateCommandsConfig {
3
3
  logsUrl: string;
4
+ updateCron?: string;
4
5
  }
5
6
  export declare class UpdateCommands {
7
+ ctx: Context;
6
8
  static readonly inject: string[];
7
9
  config: UpdateCommandsConfig;
8
10
  log: Logger;
9
11
  constructor(ctx: Context, config: UpdateCommandsConfig);
12
+ private registerCronJobs;
13
+ private updatePageCache;
10
14
  private registerCommands;
11
15
  }
12
16
  export declare namespace UpdateCommands {
@@ -1,5 +1,20 @@
1
1
  import { Mwn } from "mwn";
2
2
  import { Config } from "../index";
3
+ export interface Database {
4
+ set(table: string, query: object, data: object): Promise<any>;
5
+ get<T = any>(table: string, query: object): Promise<T[]>;
6
+ create(table: string, data: object): Promise<any>;
7
+ upsert(table: string, data: object | object[]): Promise<any>;
8
+ }
9
+ /**
10
+ * 检查并初始化页面到数据库
11
+ * 如果数据库中不存在该页面,先创建基本数据
12
+ */
13
+ export declare function ensurePageInDatabase(database: Database | undefined, pageId: number, title: string): Promise<void>;
14
+ /**
15
+ * 更新页面贡献者信息到数据库
16
+ */
17
+ export declare function updateContributorToDatabase(database: Database | undefined, title: string, user: string, timestamp: string): Promise<void>;
3
18
  /**
4
19
  * 单页面同步
5
20
  * @param oldSite 源站点机器人实例
@@ -36,6 +51,7 @@ export interface SyncNotifyItem {
36
51
  * @param newSite 目标站点机器人实例
37
52
  * @param config KOISHI用户配置的项
38
53
  * @param onSynced 同步成功批量回调(仅 reason==="synced" 的条目,函数结束时一次调用)
54
+ * @param database 数据库实例(可选),用于更新贡献者信息
39
55
  */
40
- declare function incrementalUpdate(oldSite: Mwn, newSite: Mwn, config: Config, onSynced?: (items: SyncNotifyItem[]) => void): Promise<void>;
41
- export { syncSinglePage, syncPages, incrementalUpdate };
56
+ export declare function incrementalUpdate(oldSite: Mwn, newSite: Mwn, config: Config, onSynced?: (items: SyncNotifyItem[]) => void, database?: Database): Promise<void>;
57
+ export { syncSinglePage, syncPages };
@@ -18,4 +18,8 @@ declare function generatePinyinInfo(text: string): {
18
18
  pinyin_first: string;
19
19
  };
20
20
  declare function getErrorMessage(error: unknown): string;
21
- export { getAndProcessPageContent, generatePinyinInfo, logger, getErrorMessage, };
21
+ /**
22
+ * 将 MediaWiki ISO 时间戳(如 "2024-06-19T10:30:45Z")转为北京时间可读字符串
23
+ */
24
+ declare function formatWikiTime(isoString: string): string;
25
+ export { getAndProcessPageContent, generatePinyinInfo, logger, getErrorMessage, formatWikiTime, };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-oni-sync-bot",
3
3
  "description": "缺氧Wiki站镜像点同步-测试",
4
- "version": "0.8.8",
4
+ "version": "0.9.1",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -30,10 +30,10 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@types/node-fetch": "^2.6.13",
33
- "form-data": "^4.0.5",
33
+ "form-data": "^4.0.6",
34
34
  "koishi-plugin-cron": "^3.1.0",
35
- "mwn": "^3.0.1",
35
+ "mwn": "^3.0.3",
36
36
  "node-fetch": "^3.3.2",
37
- "pinyin-pro": "^3.28.0"
37
+ "pinyin-pro": "^3.28.1"
38
38
  }
39
39
  }