Commit 3fd809ab authored by luwei's avatar luwei

dist

parent e337af94
import{A as e,D as t,Ht as n,I as r,N as i,X as a,d as o,m as s,st as c,t as l,u}from"./_plugin-vue_export-helper-D1RKUtCV.js";import{t as d}from"./echarts-B4btcaVd.js";var f={class:`curve-box`},p={class:`stats-row`},m={class:`stat-card`},h={class:`stat-value`},g={class:`stat-card`},_={class:`stat-value`},v={class:`stat-card`},y={class:`stat-value`},b=l({__name:`DataCurve`,props:{records:{type:Array,default:()=>[]}},setup(l){let b=l,x=c(null),S=null,C=u(()=>(Array.isArray(b.records)?b.records:[]).map((e,t)=>({idx:t,time:e.time||`第${t+1}条`,current:Number(e.current),voltage:Number(e.voltage),actual_temperature:Number(e.actual_temperature)})).filter(e=>Number.isFinite(e.current)||Number.isFinite(e.voltage)||Number.isFinite(e.actual_temperature))),w=u(()=>{let e=C.value.map(e=>e.actual_temperature).filter(e=>Number.isFinite(e));return{count:C.value.length,max:e.length?Math.max(...e):0,min:e.length?Math.min(...e):0}}),T=e=>Number.isFinite(e)?Number(e).toFixed(2):`--`,E=e=>C.value.map(t=>Number.isFinite(t[e])?t[e]:null),D=()=>{if(!x.value)return;S||=d(x.value);let e=C.value.length>0;S.setOption({animation:!0,color:[`#409EFF`,`#67C23A`,`#FF6B6B`],tooltip:{trigger:`axis`,backgroundColor:`rgba(255,255,255,0.96)`,borderColor:`#e2e8f0`,borderWidth:1,textStyle:{color:`#334155`},extraCssText:`box-shadow: 0 10px 30px rgba(15,23,42,0.16); border-radius: 12px;`,formatter(e){if(!e?.length)return``;let t=[`<div style="margin-bottom:6px;font-weight:600;">${e[0].axisValue}</div>`];return e.forEach(e=>{t.push(`<div style="display:flex;align-items:center;gap:6px;min-width:160px;justify-content:space-between;">
<span>${e.marker}${e.seriesName}</span>
<strong>${T(e.data)}</strong>
</div>`)}),t.join(``)}},legend:{bottom:0,itemWidth:18,itemHeight:10,textStyle:{color:`#475569`},data:[`电流(A)`,`电压(V)`,`温度(℃)`]},grid:{top:24,left:24,right:24,bottom:56,containLabel:!0},xAxis:{type:`category`,boundaryGap:!1,data:C.value.map(e=>e.time),axisLabel:{color:`#64748b`,rotate:35},axisLine:{lineStyle:{color:`#94a3b8`}}},yAxis:{type:`value`,axisLabel:{color:`#64748b`},splitLine:{lineStyle:{type:`dashed`,color:`rgba(148, 163, 184, 0.45)`}}},series:[{name:`电流(A)`,type:`line`,smooth:!0,symbol:`circle`,symbolSize:7,data:E(`current`)},{name:`电压(V)`,type:`line`,smooth:!0,symbol:`circle`,symbolSize:7,data:E(`voltage`)},{name:`温度(℃)`,type:`line`,smooth:!0,symbol:`circle`,symbolSize:7,data:E(`actual_temperature`)}],graphic:e?[]:[{type:`text`,left:`center`,top:`middle`,style:{text:`暂无足够数据生成曲线`,fill:`#64748b`,fontSize:14}}]},!0)},O=()=>{S?.resize()};return i(async()=>{await t(),D(),window.addEventListener(`resize`,O)}),a(()=>b.records,async()=>{await t(),D()},{deep:!0}),e(()=>{window.removeEventListener(`resize`,O),S?.dispose(),S=null}),(e,t)=>(r(),s(`div`,f,[o(`div`,p,[o(`div`,m,[t[0]||=o(`div`,{class:`stat-label`},`总条数`,-1),o(`div`,h,n(w.value.count),1)]),o(`div`,g,[t[1]||=o(`div`,{class:`stat-label`},`最高温度`,-1),o(`div`,_,n(T(w.value.max))+` °C`,1)]),o(`div`,v,[t[2]||=o(`div`,{class:`stat-label`},`最低温度`,-1),o(`div`,y,n(T(w.value.min))+` °C`,1)])]),o(`div`,{ref_key:`chartRef`,ref:x,class:`echarts-box`},null,512)]))}},[[`__scopeId`,`data-v-7c9af9ab`]]);export{b as t};
\ No newline at end of file
.curve-box[data-v-7c9af9ab]{flex-direction:column;gap:14px;height:100%;display:flex}.stats-row[data-v-7c9af9ab]{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;display:grid}.stat-card[data-v-7c9af9ab]{background:#f3f6fb;border-radius:14px;padding:14px 16px}.stat-label[data-v-7c9af9ab]{color:#64748b;margin-bottom:8px;font-size:13px}.stat-value[data-v-7c9af9ab]{color:#0f172a;font-size:18px;font-weight:700}.echarts-box[data-v-7c9af9ab]{background:linear-gradient(#fff,#f8fafc);border:1px solid #0f172a1a;border-radius:14px;flex:1;min-height:360px}
This diff is collapsed.
.data-page[data-v-7089f2ac]{background:var(--bg-page);height:100%}.data-page.dragging[data-v-7089f2ac]{-webkit-user-select:none;user-select:none;cursor:col-resize}.data-layout[data-v-7089f2ac]{background:var(--bg-white);border:1px solid var(--border-color);height:100%;box-shadow:var(--shadow-card);align-items:stretch;gap:0;display:flex}.pane-divider[data-v-7089f2ac]{background:var(--border-color);cursor:col-resize;flex-shrink:0;width:4px;transition:background .15s;position:relative}.pane-divider[data-v-7089f2ac]:after{content:"";position:absolute;inset:0 -2px}.pane-divider[data-v-7089f2ac]:hover,.dragging .pane-divider[data-v-7089f2ac]{background:var(--primary-border)}.pane-card[data-v-7089f2ac]{border:none;border-right:1px solid var(--border-color);background:var(--bg-white);border-radius:0;min-width:0;height:100%;box-shadow:none!important}.pane-card[data-v-7089f2ac] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 16px;display:flex}.pane-card[data-v-7089f2ac] .el-card__body{flex-direction:column;gap:10px;height:calc(100% - 44px);padding:12px 16px;display:flex}.pane-card--tree[data-v-7089f2ac] .el-card__body{padding:8px 0;overflow-y:auto}.pane-header[data-v-7089f2ac]{width:100%;color:var(--text-primary);justify-content:space-between;align-items:center;font-size:14px;font-weight:600;display:flex}.file-title[data-v-7089f2ac]{color:var(--text-secondary);margin-left:4px;font-size:13px;font-weight:400}.tree-node[data-v-7089f2ac]{justify-content:space-between;align-items:center;gap:8px;width:100%;padding-right:4px;display:flex}.tree-main[data-v-7089f2ac]{align-items:center;gap:6px;min-width:0;display:inline-flex}.tree-icon[data-v-7089f2ac]{color:var(--primary);flex:none;font-size:14px}.tree-name[data-v-7089f2ac]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.tree-actions[data-v-7089f2ac]{flex-shrink:0;display:none}.tree-actions .el-button[data-v-7089f2ac]{color:var(--text-tertiary);padding:0 3px;font-size:13px}.tree-actions .el-button[data-v-7089f2ac]:hover{color:var(--primary)}.tree-node:hover .tree-actions[data-v-7089f2ac]{display:inline-flex}.upload-panel[data-v-7089f2ac]{width:100%}.upload-panel__icon[data-v-7089f2ac]{color:var(--primary);margin-bottom:8px;font-size:28px}.search-form[data-v-7089f2ac]{flex-shrink:0;margin-bottom:4px}.content-wrap[data-v-7089f2ac]{flex:1;min-height:0}@media (width<=980px){.data-layout[data-v-7089f2ac]{display:block;overflow-y:auto}.pane-divider[data-v-7089f2ac]{display:none}.pane-card[data-v-7089f2ac]{border-right:none;border-bottom:1px solid var(--border-color);min-height:420px;margin-bottom:12px;width:100%!important}}
import{n as e,r as t,u as n}from"./es-DCOtnflc.js";import{$ as r,A as i,B as a,D as o,Ht as s,I as c,N as l,Q as u,R as d,V as f,Vt as p,X as m,_ as h,a as g,at as _,d as v,f as y,ht as b,m as x,p as S,st as C,t as w,u as T,v as E}from"./_plugin-vue_export-helper-D1RKUtCV.js";import{t as D}from"./request-D8DwihSV.js";import{t as O}from"./echarts-B4btcaVd.js";function k(){return D.get(`/eval/packages`)}function A(){return D.get(`/eval/models`)}function j(e){return D.post(`/eval/run`,e)}function M(){return D.get(`/eval/records`)}function N(e){return D.get(`/eval/records/${e}`)}function P(e){return D.delete(`/eval/records/${e}`)}var F={__name:`EvalChart`,props:{chartData:{type:Array,default:()=>[]},height:{type:String,default:`360px`}},setup(e){let t=e,n=C(null),r=null,a=T(()=>Array.isArray(t.chartData)?t.chartData.filter(e=>e!=null):[]),s=T(()=>a.value.map(e=>e.time||String(e.index??``))),u=T(()=>a.value.map(e=>e.actual??null)),d=T(()=>a.value.map(e=>e.predicted??null)),f=()=>{if(!n.value)return;r||=O(n.value);let e=a.value.length>0;r.setOption({animation:!1,color:[`#409EFF`,`#F56C6C`],tooltip:{trigger:`axis`,backgroundColor:`rgba(255,255,255,0.96)`,borderColor:`#e2e8f0`,borderWidth:1,textStyle:{color:`#334155`},extraCssText:`box-shadow: 0 8px 24px rgba(15,23,42,0.14); border-radius: 10px;`,formatter(e){if(!e?.length)return``;let t=[`<div style="margin-bottom:6px;font-weight:600;font-size:12px;">${e[0].axisValue}</div>`];return e.forEach(e=>{let n=e.data==null?`--`:Number(e.data).toFixed(4);t.push(`<div style="display:flex;align-items:center;gap:8px;min-width:180px;justify-content:space-between;">
<span>${e.marker}${e.seriesName}</span>
<strong>${n} ℃</strong>
</div>`)}),t.join(``)}},legend:{bottom:4,itemWidth:20,itemHeight:10,textStyle:{color:`#475569`,fontSize:12},data:[`实际温度 (℃)`,`预测温度 (℃)`]},grid:{top:16,left:16,right:20,bottom:52,containLabel:!0},xAxis:{type:`category`,boundaryGap:!1,data:s.value,axisLabel:{color:`#64748b`,fontSize:11,rotate:35,interval:Math.max(0,Math.floor(s.value.length/12)-1),hideOverlap:!0},axisLine:{lineStyle:{color:`#cbd5e1`}}},yAxis:{type:`value`,name:`温度 (℃)`,nameTextStyle:{color:`#64748b`,fontSize:11},axisLabel:{color:`#64748b`,fontSize:11},splitLine:{lineStyle:{type:`dashed`,color:`rgba(148,163,184,0.4)`}}},series:[{name:`实际温度 (℃)`,type:`line`,smooth:!1,symbol:`none`,lineStyle:{width:2,type:`solid`},data:u.value},{name:`预测温度 (℃)`,type:`line`,smooth:!1,symbol:`none`,lineStyle:{width:2,type:`dashed`},data:d.value}],graphic:e?[]:[{type:`text`,left:`center`,top:`middle`,style:{text:`暂无评估数据`,fill:`#94a3b8`,fontSize:14}}],dataZoom:e?[{type:`inside`,start:0,end:100},{type:`slider`,start:0,end:100,height:20,bottom:28}]:[]},!0)},h=()=>r?.resize();return m(()=>t.chartData,async()=>{await o(),f()},{deep:!0}),l(async()=>{await o(),f(),window.addEventListener(`resize`,h)}),i(()=>{window.removeEventListener(`resize`,h),r?.dispose(),r=null}),(e,r)=>(c(),x(`div`,{ref_key:`chartRef`,ref:n,style:p({width:`100%`,height:t.height})},null,4))}},ee={class:`eval-page`},te={key:0,class:`eval-loading`},ne={class:`metrics-row`},re={class:`metric-chip`},ie={class:`metric-value`},ae={class:`metric-chip`},oe={class:`metric-value`},I={class:`metric-chip`},L={class:`metric-value`},R={class:`metric-chip`},z={class:`metric-value`},B={class:`metric-chip`},V={class:`metric-value`},H={class:`card-header-row`},U={class:`metric-cell`},W={class:`metric-cell`},G={style:{"min-height":`120px`}},K={class:`metrics-row`,style:{"margin-bottom":`12px`}},se={class:`metric-chip`},ce={class:`metric-value`},le={class:`metric-chip`},ue={class:`metric-value`},de={class:`metric-chip`},fe={class:`metric-value`},q={class:`metric-chip`},pe={class:`metric-value`},J=w({__name:`index`,setup(i){let o=C([]),p=C([]),m=_({model_id:``,package_id:``}),w=C(!1),T=C(null),D=C([]),O=C(!1),J=C(!1),Y=C(null),X=C(!1),Z=async()=>{let[e,t]=await Promise.all([k(),A()]);o.value=e,p.value=t},Q=async()=>{O.value=!0;try{D.value=await M()}finally{O.value=!1}},me=async()=>{if(!m.model_id){t.warning(`请选择模型`);return}if(!m.package_id){t.warning(`请选择数据包`);return}w.value=!0,T.value=null;try{T.value=await j({model_id:m.model_id,package_id:m.package_id}),t.success(`评估完成`),await Q()}catch(e){t.error(e?.message||`评估失败`)}finally{w.value=!1}},he=async e=>{X.value=!0,J.value=!0,Y.value=null;try{Y.value=await N(e.id)}finally{X.value=!1}},ge=async n=>{try{await e.confirm(`确定删除模型"${n.model_name}"在"${n.package_name}"上的评估记录吗?`,`提示`,{type:`warning`}),await P(n.id),t.success(`已删除`),T.value?.id===n.id&&(T.value=null),await Q()}catch{}},$=e=>e==null?`-`:Number(e).toFixed(5);return l(async()=>{await Promise.all([Z(),Q()])}),(e,t)=>{let i=a(`el-option`),l=a(`el-select`),_=a(`el-form-item`),C=a(`el-button`),k=a(`el-form`),A=a(`el-icon`),j=a(`el-card`),M=a(`el-table-column`),N=a(`el-table`),P=a(`el-dialog`),Z=f(`loading`);return c(),x(`div`,ee,[E(j,{class:`config-card`,shadow:`hover`},{header:u(()=>[...t[4]||=[v(`span`,{class:`card-title`},`评估配置`,-1)]]),default:u(()=>[E(k,{model:m,inline:``,class:`eval-form`},{default:u(()=>[E(_,{label:`选择模型`,required:``},{default:u(()=>[E(l,{modelValue:m.model_id,"onUpdate:modelValue":t[0]||=e=>m.model_id=e,placeholder:`请选择已保存模型`,filterable:``,style:{width:`260px`}},{default:u(()=>[(c(!0),x(g,null,d(p.value,e=>(c(),y(i,{key:e.id,label:`${e.model_name}(训练包:${e.package_name})`,value:e.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),E(_,{label:`选择数据包`,required:``},{default:u(()=>[E(l,{modelValue:m.package_id,"onUpdate:modelValue":t[1]||=e=>m.package_id=e,placeholder:`请选择评估数据包`,filterable:``,style:{width:`240px`}},{default:u(()=>[(c(!0),x(g,null,d(o.value,e=>(c(),y(i,{key:e.id,label:`${e.name}${e.data_count} 条)`,value:e.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),E(_,null,{default:u(()=>[E(C,{type:`primary`,loading:w.value,onClick:me},{default:u(()=>[...t[5]||=[h(` 开始评估 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1},8,[`model`]),w.value?(c(),x(`div`,te,[E(A,{class:`is-loading`,style:{"font-size":`24px`,color:`#409EFF`}},{default:u(()=>[E(b(n))]),_:1}),t[6]||=v(`span`,null,`正在推理,请稍候…`,-1)])):T.value?(c(),x(g,{key:1},[v(`div`,ne,[v(`div`,re,[t[7]||=v(`span`,{class:`metric-label`},`评估样本`,-1),v(`span`,ie,s(T.value.total_count)+` 条`,1)]),v(`div`,ae,[t[8]||=v(`span`,{class:`metric-label`},`MAE`,-1),v(`span`,oe,s($(T.value.mae))+` ℃`,1)]),v(`div`,I,[t[9]||=v(`span`,{class:`metric-label`},`RMSE`,-1),v(`span`,L,s($(T.value.rmse))+` ℃`,1)]),v(`div`,R,[t[10]||=v(`span`,{class:`metric-label`},`模型`,-1),v(`span`,z,s(T.value.model_name),1)]),v(`div`,B,[t[11]||=v(`span`,{class:`metric-label`},`数据包`,-1),v(`span`,V,s(T.value.package_name),1)])]),E(F,{"chart-data":T.value.chart_data,height:`340px`},null,8,[`chart-data`])],64)):S(``,!0)]),_:1}),E(j,{class:`records-card`,shadow:`hover`},{header:u(()=>[v(`div`,H,[t[13]||=v(`span`,{class:`card-title`},`评估记录`,-1),E(C,{icon:b(n),size:`small`,plain:``,loading:O.value,onClick:Q},{default:u(()=>[...t[12]||=[h(` 刷新 `,-1)]]),_:1},8,[`icon`,`loading`])])]),default:u(()=>[r((c(),y(N,{data:D.value,border:``,stripe:``,height:`calc(100vh - 580px)`},{default:u(()=>[E(M,{prop:`model_name`,label:`模型名称`,"min-width":`140`,"show-overflow-tooltip":``}),E(M,{prop:`package_name`,label:`评估数据包`,"min-width":`130`,"show-overflow-tooltip":``}),E(M,{label:`样本数`,width:`90`,align:`center`},{default:u(({row:e})=>[h(s(e.total_count),1)]),_:1}),E(M,{label:`MAE (℃)`,width:`110`,align:`center`},{default:u(({row:e})=>[v(`span`,U,s($(e.mae)),1)]),_:1}),E(M,{label:`RMSE (℃)`,width:`110`,align:`center`},{default:u(({row:e})=>[v(`span`,W,s($(e.rmse)),1)]),_:1}),E(M,{prop:`created_at`,label:`评估时间`,width:`165`}),E(M,{label:`操作`,width:`120`,fixed:`right`,align:`center`},{default:u(({row:e})=>[E(C,{link:``,type:`primary`,onClick:t=>he(e)},{default:u(()=>[...t[14]||=[h(`查看`,-1)]]),_:1},8,[`onClick`]),E(C,{link:``,type:`danger`,onClick:t=>ge(e)},{default:u(()=>[...t[15]||=[h(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[Z,O.value]])]),_:1}),E(P,{modelValue:J.value,"onUpdate:modelValue":t[3]||=e=>J.value=e,title:Y.value?`${Y.value.model_name}${Y.value.package_name}`:`评估详情`,width:`860px`,"destroy-on-close":``},{footer:u(()=>[E(C,{onClick:t[2]||=e=>J.value=!1},{default:u(()=>[...t[20]||=[h(`关闭`,-1)]]),_:1})]),default:u(()=>[r((c(),x(`div`,G,[Y.value?(c(),x(g,{key:0},[v(`div`,K,[v(`div`,se,[t[16]||=v(`span`,{class:`metric-label`},`样本数`,-1),v(`span`,ce,s(Y.value.total_count),1)]),v(`div`,le,[t[17]||=v(`span`,{class:`metric-label`},`MAE`,-1),v(`span`,ue,s($(Y.value.mae))+` ℃`,1)]),v(`div`,de,[t[18]||=v(`span`,{class:`metric-label`},`RMSE`,-1),v(`span`,fe,s($(Y.value.rmse))+` ℃`,1)]),v(`div`,q,[t[19]||=v(`span`,{class:`metric-label`},`评估时间`,-1),v(`span`,pe,s(Y.value.created_at),1)])]),E(F,{"chart-data":Y.value.chart_data||[],height:`380px`},null,8,[`chart-data`])],64)):S(``,!0)])),[[Z,X.value]])]),_:1},8,[`modelValue`,`title`])])}}},[[`__scopeId`,`data-v-ec2828d6`]]);export{J as default};
\ No newline at end of file
.eval-page[data-v-ec2828d6]{flex-direction:column;gap:12px;height:100%;display:flex;overflow-y:auto}.config-card[data-v-ec2828d6],.records-card[data-v-ec2828d6]{flex-shrink:0}.config-card[data-v-ec2828d6] .el-card__header,.records-card[data-v-ec2828d6] .el-card__header{border-bottom:1px solid #e8edf3;padding:12px 20px}.config-card[data-v-ec2828d6] .el-card__body,.records-card[data-v-ec2828d6] .el-card__body{padding:16px 20px}.records-card[data-v-ec2828d6]{flex:1;min-height:200px}.card-title[data-v-ec2828d6]{color:#0f172a;font-size:14px;font-weight:600}.card-header-row[data-v-ec2828d6]{justify-content:space-between;align-items:center;display:flex}.eval-form[data-v-ec2828d6] .el-form-item{margin-bottom:0;margin-right:16px}.eval-loading[data-v-ec2828d6]{color:#64748b;align-items:center;gap:10px;padding:24px 0 8px;font-size:14px;display:flex}.metrics-row[data-v-ec2828d6]{flex-wrap:wrap;gap:10px;padding:16px 0 12px;display:flex}.metric-chip[data-v-ec2828d6]{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;flex-direction:column;align-items:flex-start;gap:2px;min-width:100px;padding:8px 16px;display:flex}.metric-label[data-v-ec2828d6]{color:#94a3b8;text-transform:uppercase;letter-spacing:.5px;font-size:11px;font-weight:500}.metric-value[data-v-ec2828d6]{color:#0f172a;font-size:15px;font-weight:600}.metric-cell[data-v-ec2828d6]{color:#0f766e;font-size:13px;font-weight:500}
.model-list-page[data-v-c204d828]{background:var(--bg-page);height:100%;overflow:hidden}.list-card[data-v-c204d828]{border:1px solid var(--border-color);border-radius:4px;height:100%;overflow:hidden;box-shadow:var(--shadow-card)!important}.list-card[data-v-c204d828] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 20px;display:flex}.list-card[data-v-c204d828] .el-card__body{height:calc(100% - 44px);padding:16px 20px;overflow:hidden}.card-title[data-v-c204d828]{color:var(--text-primary);font-size:14px;font-weight:600}.card-header-row[data-v-c204d828]{justify-content:space-between;align-items:center;width:100%;display:flex}.params-text[data-v-c204d828],.loss-text[data-v-c204d828]{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:12px;display:block;overflow:hidden}.loss-text[data-v-c204d828]{color:var(--primary);font-weight:500}
import{n as e,r as t,u as n}from"./es-DCOtnflc.js";import{$ as r,B as i,Ht as a,I as o,N as s,Q as c,V as l,_ as u,d,f,ht as p,m,p as h,st as g,t as _,v}from"./_plugin-vue_export-helper-D1RKUtCV.js";import{a as y,r as b}from"./trainManagement-TFX-G3Jl.js";var x={class:`model-list-page`},S={class:`card-header-row`},C={class:`params-text`},w={class:`loss-text`},T=_({__name:`index`,setup(_){let T=g([]),E=g(!1),D=async()=>{E.value=!0;try{T.value=await y()}finally{E.value=!1}},O=async n=>{try{await e.confirm(`确定删除模型"${n.model_name}"吗?删除后无法恢复。`,`提示`,{type:`warning`}),await b(n.id),t.success(`模型已删除`),await D()}catch{}},k=e=>e?[`seq=${e.seq_len}`,`hidden=${e.hidden_size}`,`layers=${e.num_layers}`,`epochs=${e.epochs}`,`lr=${e.learning_rate}`].join(` / `):`-`,A=e=>e.train_loss==null?`-`:`训练 ${Number(e.train_loss).toFixed(5)}`+(e.val_loss==null?``:` / 验证 ${Number(e.val_loss).toFixed(5)}`);return s(D),(e,t)=>{let s=i(`el-button`),g=i(`el-table-column`),_=i(`el-tooltip`),y=i(`el-table`),b=i(`el-empty`),j=i(`el-card`),M=l(`loading`);return o(),m(`div`,x,[v(j,{shadow:`hover`,class:`list-card`},{header:c(()=>[d(`div`,S,[t[1]||=d(`span`,{class:`card-title`},`已保存模型`,-1),v(s,{icon:p(n),size:`small`,plain:``,loading:E.value,onClick:D},{default:c(()=>[...t[0]||=[u(` 刷新 `,-1)]]),_:1},8,[`icon`,`loading`])])]),default:c(()=>[r((o(),f(y,{data:T.value,border:``,stripe:``,height:`calc(100vh - 160px)`},{default:c(()=>[v(g,{type:`index`,width:`55`,label:`#`,align:`center`}),v(g,{prop:`model_name`,label:`模型名称`,"min-width":`150`,"show-overflow-tooltip":``}),v(g,{prop:`package_name`,label:`训练数据包`,"min-width":`140`,"show-overflow-tooltip":``}),v(g,{label:`LSTM 参数`,"min-width":`280`,"show-overflow-tooltip":``},{default:c(({row:e})=>[v(_,{content:k(e.params),placement:`top`},{default:c(()=>[d(`span`,C,a(k(e.params)),1)]),_:2},1032,[`content`])]),_:1}),v(g,{label:`训练损失`,"min-width":`190`,"show-overflow-tooltip":``},{default:c(({row:e})=>[d(`span`,w,a(A(e)),1)]),_:1}),v(g,{prop:`created_at`,label:`保存时间`,width:`170`}),v(g,{label:`操作`,width:`90`,fixed:`right`,align:`center`},{default:c(({row:e})=>[v(s,{link:``,type:`danger`,onClick:t=>O(e)},{default:c(()=>[...t[2]||=[u(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[M,E.value]]),!E.value&&T.value.length===0?(o(),f(b,{key:0,description:`暂无已保存的模型,请先在模型训练页面完成训练并保存`,style:{padding:`40px 0`}})):h(``,!0)]),_:1})])}}},[[`__scopeId`,`data-v-c204d828`]]);export{T as default};
\ No newline at end of file
.train-page[data-v-fea158ef]{background:var(--bg-page);flex-direction:column;gap:12px;height:100%;display:flex;overflow-y:auto}.config-card[data-v-fea158ef],.tasks-card[data-v-fea158ef]{border:1px solid var(--border-color);border-radius:4px;flex-shrink:0;box-shadow:var(--shadow-card)!important}.config-card[data-v-fea158ef] .el-card__header,.tasks-card[data-v-fea158ef] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 20px;display:flex}.config-card[data-v-fea158ef] .el-card__body,.tasks-card[data-v-fea158ef] .el-card__body{padding:16px 20px}.tasks-card[data-v-fea158ef]{flex:1;min-height:0;overflow:hidden}.card-title[data-v-fea158ef]{color:var(--text-primary);font-size:14px;font-weight:600}.card-header-row[data-v-fea158ef]{justify-content:space-between;align-items:center;width:100%;display:flex}.train-form .form-row[data-v-fea158ef]{flex-wrap:wrap;gap:24px;margin-bottom:4px;display:flex}.train-form .form-item-wide[data-v-fea158ef]{flex:1;min-width:220px}.train-form .form-item-wide[data-v-fea158ef] .el-form-item__content{display:block}.params-section[data-v-fea158ef]{border-top:1px solid var(--border-color);margin-bottom:8px;padding-top:12px}.params-label[data-v-fea158ef]{color:var(--text-secondary);margin-bottom:12px;font-size:13px;font-weight:600;display:block}.params-grid[data-v-fea158ef]{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px 24px;display:grid}.params-grid[data-v-fea158ef] .el-form-item{margin-bottom:0}.form-action[data-v-fea158ef]{border-top:1px solid var(--border-color);text-align:right;padding-top:16px}.params-cell[data-v-fea158ef]{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:12px;display:block;overflow:hidden}.muted[data-v-fea158ef]{color:var(--text-tertiary)}.err-text[data-v-fea158ef]{color:#f53f3f;white-space:nowrap;text-overflow:ellipsis;font-size:12px;display:block;overflow:hidden}
import{n as e,r as t,u as n}from"./es-DCOtnflc.js";import{$ as ee,A as r,B as i,Ht as a,I as o,N as s,Q as c,R as l,V as u,_ as d,a as f,at as p,d as m,f as h,ht as g,m as _,st as v,t as y,u as b,v as x}from"./_plugin-vue_export-helper-D1RKUtCV.js";import{c as S,i as C,l as w,n as T,o as E,s as D,t as O}from"./trainManagement-TFX-G3Jl.js";var k={class:`train-page`},A={class:`form-row`},j={class:`params-section`},M={class:`params-grid`},N={class:`form-action`},P={class:`card-header-row`},F={class:`params-cell`},I={key:2,class:`muted`},L={key:0,class:`err-text`},R={key:1},z=`calc(100vh - 520px)`,B=y(Object.assign({},{__name:`index`,setup(y){let B=p({model_name:``,package_id:``,params:{seq_len:20,hidden_size:64,num_layers:2,epochs:50,batch_size:32,learning_rate:.001,train_ratio:.8}}),V=v([]),H=v(!1),U=v([]),W=v(!1),G=null,K=b(()=>U.value.some(e=>e.status===`pending`||e.status===`running`)),q=()=>{G||=setInterval(Y,3e3)},J=()=>{G&&=(clearInterval(G),null)},Y=async()=>{try{U.value=await D(),K.value?q():J()}catch{}},te=async()=>{if(!B.model_name.trim()){t.warning(`请输入模型名称`);return}if(!B.package_id){t.warning(`请选择数据包`);return}H.value=!0;try{await T({model_name:B.model_name.trim(),package_id:B.package_id,params:{...B.params}}),t.success(`训练任务已提交`),B.model_name=``,await Y()}finally{H.value=!1}},ne=async e=>{try{await O(e.id),t.success(`已发送取消请求`),await Y()}catch(e){t.error(e?.message||`取消失败`)}},X=async e=>{try{await S(e.id),t.success(`重新训练已启动`),await Y()}catch(e){t.error(e?.message||`重启失败`)}},re=async e=>{try{await w(e.id),t.success(`模型已保存,可在模型列表中查看`),await Y()}catch(e){t.error(e?.message||`保存失败`)}},Z=async n=>{try{await e.confirm(`确定删除训练任务"${n.model_name}"吗?`,`提示`,{type:`warning`}),await C(n.id),t.success(`已删除`),await Y()}catch{}},ie={pending:{type:`info`,text:`等待中`},running:{type:`warning`,text:`训练中`},completed:{type:`success`,text:`已完成`},failed:{type:`danger`,text:`失败`},cancelled:{type:``,text:`已取消`}},Q=e=>ie[e]||{type:`info`,text:e},$=e=>e?[`序列长度 ${e.seq_len}`,`隐藏层 ${e.hidden_size}`,`层数 ${e.num_layers}`,`轮数 ${e.epochs}`,`批次 ${e.batch_size}`,`学习率 ${e.learning_rate}`,`训练比 ${e.train_ratio}`].join(` / `):`-`,ae=e=>e.train_loss==null?`-`:`训练: ${Number(e.train_loss).toFixed(5)}`+(e.val_loss==null?``:` / 验证: ${Number(e.val_loss).toFixed(5)}`);return s(async()=>{W.value=!0;try{await Promise.all([E().then(e=>V.value=e),Y()])}finally{W.value=!1}}),r(J),(e,t)=>{let r=i(`el-option`),s=i(`el-select`),p=i(`el-form-item`),v=i(`el-input`),y=i(`el-input-number`),b=i(`el-button`),S=i(`el-form`),C=i(`el-card`),w=i(`el-table-column`),T=i(`el-tooltip`),E=i(`el-tag`),D=i(`el-progress`),O=i(`el-table`),G=u(`loading`);return o(),_(`div`,k,[x(C,{class:`config-card`,shadow:`hover`},{header:c(()=>[...t[9]||=[m(`span`,{class:`card-title`},`训练配置`,-1)]]),default:c(()=>[x(S,{model:B,"label-position":`top`,class:`train-form`},{default:c(()=>[m(`div`,A,[x(p,{label:`选择数据包`,required:``,class:`form-item-wide`},{default:c(()=>[x(s,{modelValue:B.package_id,"onUpdate:modelValue":t[0]||=e=>B.package_id=e,placeholder:`请选择数据包`,filterable:``,style:{width:`100%`}},{default:c(()=>[(o(!0),_(f,null,l(V.value,e=>(o(),h(r,{key:e.id,label:`${e.name}${e.data_count} 条)`,value:e.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),x(p,{label:`模型名称`,required:``,class:`form-item-wide`},{default:c(()=>[x(v,{modelValue:B.model_name,"onUpdate:modelValue":t[1]||=e=>B.model_name=e,placeholder:`请输入模型名称`,maxlength:`100`,"show-word-limit":``},null,8,[`modelValue`])]),_:1})]),m(`div`,j,[t[10]||=m(`span`,{class:`params-label`},`LSTM 超参数`,-1),m(`div`,M,[x(p,{label:`序列长度`},{default:c(()=>[x(y,{modelValue:B.params.seq_len,"onUpdate:modelValue":t[2]||=e=>B.params.seq_len=e,min:5,max:500,step:5,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`隐藏层大小`},{default:c(()=>[x(y,{modelValue:B.params.hidden_size,"onUpdate:modelValue":t[3]||=e=>B.params.hidden_size=e,min:8,max:1024,step:8,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`LSTM 层数`},{default:c(()=>[x(y,{modelValue:B.params.num_layers,"onUpdate:modelValue":t[4]||=e=>B.params.num_layers=e,min:1,max:8,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`训练轮数 (Epochs)`},{default:c(()=>[x(y,{modelValue:B.params.epochs,"onUpdate:modelValue":t[5]||=e=>B.params.epochs=e,min:1,max:2e3,step:10,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`批次大小 (Batch)`},{default:c(()=>[x(y,{modelValue:B.params.batch_size,"onUpdate:modelValue":t[6]||=e=>B.params.batch_size=e,min:1,max:512,step:8,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`学习率`},{default:c(()=>[x(y,{modelValue:B.params.learning_rate,"onUpdate:modelValue":t[7]||=e=>B.params.learning_rate=e,min:1e-5,max:1,step:1e-4,precision:5,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1}),x(p,{label:`训练集比例`},{default:c(()=>[x(y,{modelValue:B.params.train_ratio,"onUpdate:modelValue":t[8]||=e=>B.params.train_ratio=e,min:.5,max:.99,step:.05,precision:2,"controls-position":`right`,style:{width:`100%`}},null,8,[`modelValue`])]),_:1})])]),m(`div`,N,[x(b,{type:`primary`,size:`large`,loading:H.value,onClick:te},{default:c(()=>[...t[11]||=[d(` 开始训练 `,-1)]]),_:1},8,[`loading`])])]),_:1},8,[`model`])]),_:1}),x(C,{class:`tasks-card`,shadow:`hover`},{header:c(()=>[m(`div`,P,[t[13]||=m(`span`,{class:`card-title`},`训练记录`,-1),x(b,{icon:g(n),size:`small`,plain:``,loading:W.value,onClick:Y},{default:c(()=>[...t[12]||=[d(` 刷新 `,-1)]]),_:1},8,[`icon`,`loading`])])]),default:c(()=>[ee((o(),h(O,{data:U.value,border:``,stripe:``,height:z},{default:c(()=>[x(w,{prop:`model_name`,label:`模型名称`,"min-width":`140`,"show-overflow-tooltip":``}),x(w,{prop:`package_name`,label:`数据包`,"min-width":`130`,"show-overflow-tooltip":``}),x(w,{label:`参数`,"min-width":`180`,"show-overflow-tooltip":``},{default:c(({row:e})=>[x(T,{content:$(e.params),placement:`top`},{default:c(()=>[m(`span`,F,a($(e.params)),1)]),_:2},1032,[`content`])]),_:1}),x(w,{label:`状态`,width:`100`,align:`center`},{default:c(({row:e})=>[x(E,{type:Q(e.status).type,size:`small`},{default:c(()=>[d(a(Q(e.status).text),1)]),_:2},1032,[`type`])]),_:1}),x(w,{label:`进度`,width:`150`,align:`center`},{default:c(({row:e})=>[e.status===`running`?(o(),h(D,{key:0,percentage:e.progress,"stroke-width":6,"show-text":!0,style:{width:`120px`}},null,8,[`percentage`])):e.status===`completed`?(o(),h(D,{key:1,percentage:100,status:`success`,"stroke-width":6,style:{width:`120px`}})):(o(),_(`span`,I,`—`))]),_:1}),x(w,{label:`损失`,"min-width":`200`,"show-overflow-tooltip":``},{default:c(({row:e})=>[e.status===`failed`?(o(),_(`span`,L,a(e.error_msg||`未知错误`),1)):(o(),_(`span`,R,a(ae(e)),1))]),_:1}),x(w,{prop:`created_at`,label:`创建时间`,width:`160`}),x(w,{label:`操作`,width:`210`,fixed:`right`},{default:c(({row:e})=>[e.status===`running`||e.status===`pending`?(o(),h(b,{key:0,link:``,type:`warning`,onClick:t=>ne(e)},{default:c(()=>[...t[14]||=[d(`取消`,-1)]]),_:1},8,[`onClick`])):e.status===`completed`?(o(),_(f,{key:1},[e.is_saved?(o(),h(E,{key:1,type:`success`,size:`small`,style:{"margin-right":`6px`}},{default:c(()=>[...t[16]||=[d(`已保存`,-1)]]),_:1})):(o(),h(b,{key:0,link:``,type:`primary`,onClick:t=>re(e)},{default:c(()=>[...t[15]||=[d(` 保存模型 `,-1)]]),_:1},8,[`onClick`])),x(b,{link:``,type:`info`,onClick:t=>X(e)},{default:c(()=>[...t[17]||=[d(`重新训练`,-1)]]),_:1},8,[`onClick`]),x(b,{link:``,type:`danger`,onClick:t=>Z(e)},{default:c(()=>[...t[18]||=[d(`删除`,-1)]]),_:1},8,[`onClick`])],64)):(o(),_(f,{key:2},[x(b,{link:``,type:`info`,onClick:t=>X(e)},{default:c(()=>[...t[19]||=[d(`重新训练`,-1)]]),_:1},8,[`onClick`]),x(b,{link:``,type:`danger`,onClick:t=>Z(e)},{default:c(()=>[...t[20]||=[d(`删除`,-1)]]),_:1},8,[`onClick`])],64))]),_:1})]),_:1},8,[`data`])),[[G,W.value]])]),_:1})])}}}),[[`__scopeId`,`data-v-fea158ef`]]);export{B as default};
\ No newline at end of file
.pane-card[data-v-bbcd2093]{border:none;border-right:1px solid var(--border-color);background:var(--bg-white);border-radius:0;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:none!important}.pane-card[data-v-bbcd2093] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 16px;display:flex}.pane-card[data-v-bbcd2093] .el-card__body{flex:1;padding:8px 0;overflow-y:auto}.pane-header[data-v-bbcd2093]{width:100%;color:var(--text-primary);justify-content:space-between;align-items:center;font-size:14px;font-weight:600;display:flex}.tree-node[data-v-bbcd2093]{justify-content:space-between;align-items:center;width:100%;min-width:0;padding-right:4px;display:flex}.tree-main[data-v-bbcd2093]{align-items:center;gap:6px;min-width:0;display:flex}.tree-icon[data-v-bbcd2093]{color:var(--primary);flex-shrink:0;font-size:14px}.tree-name[data-v-bbcd2093]{text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary);font-size:13px;overflow:hidden}.tree-actions[data-v-bbcd2093]{flex-shrink:0;gap:0;display:none}.tree-actions .el-button[data-v-bbcd2093]{color:var(--text-tertiary);padding:0 3px;font-size:13px}.tree-actions .el-button[data-v-bbcd2093]:hover{color:var(--primary)}.tree-node:hover .tree-actions[data-v-bbcd2093]{display:inline-flex}.pane-card[data-v-8f5781ed]{border:none;border-right:1px solid var(--border-color);background:var(--bg-white);border-radius:0;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:none!important}.pane-card[data-v-8f5781ed] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 16px;display:flex}.pane-card[data-v-8f5781ed] .el-card__body{flex:1;padding:12px 16px;overflow:hidden}.pane-header[data-v-8f5781ed]{width:100%;color:var(--text-primary);justify-content:space-between;align-items:center;font-size:14px;font-weight:600;display:flex}.search-bar[data-v-8f5781ed]{gap:8px;margin-bottom:12px;display:flex}.search-bar .el-input[data-v-8f5781ed]{flex:1}[data-v-8f5781ed] .el-table .current-row>td{background:var(--primary-light)!important}[data-v-8f5781ed] .el-table .el-button.is-link{height:auto;padding:0 4px;font-size:13px;line-height:1}.pane-card[data-v-6b2fedfc]{background:var(--bg-white);border:none;border-radius:0;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:none!important}.pane-card[data-v-6b2fedfc] .el-card__header{border-bottom:1px solid var(--border-color);background:#f7f8fa;align-items:center;height:44px;padding:0 16px;display:flex}.pane-card[data-v-6b2fedfc] .el-card__body{flex:1;padding:0;overflow:hidden}.pane-header[data-v-6b2fedfc]{width:100%;color:var(--text-primary);justify-content:space-between;align-items:center;font-size:14px;font-weight:600;display:flex}.pkg-title[data-v-6b2fedfc]{color:var(--text-secondary);margin-left:4px;font-size:13px;font-weight:400}.content-wrap[data-v-6b2fedfc]{height:100%;padding:0 16px 12px}[data-v-6b2fedfc] .el-radio-group .el-radio-button__inner{color:var(--text-secondary);border-color:var(--border-color);background:0 0;padding:4px 12px;font-size:13px}[data-v-6b2fedfc] .el-radio-group .el-radio-button__original-radio:checked+.el-radio-button__inner{color:#fff;background:var(--primary)!important;border-color:var(--primary)!important;box-shadow:none!important}.add-pkg-page[data-v-03a732e5]{flex-direction:column;gap:0;height:100%;display:flex;overflow:hidden}.add-pkg-header[data-v-03a732e5]{background:#ffffffe6;border-bottom:1px solid #e8edf3;flex-shrink:0;align-items:center;gap:16px;padding:12px 20px;display:flex}.add-pkg-title[data-v-03a732e5]{color:#0f172a;font-size:16px;font-weight:600}.section-card[data-v-03a732e5]{background:#fff;border:1px solid #e8edf3;border-radius:8px;padding:16px;overflow:hidden}.section-title[data-v-03a732e5]{color:#0f172a;align-items:center;gap:8px;margin-bottom:12px;font-size:14px;font-weight:600;display:flex}.section-hint[data-v-03a732e5]{color:#64748b;font-size:12px;font-weight:400}.file-search-bar[data-v-03a732e5]{margin-bottom:10px}.file-section[data-v-03a732e5]{flex-shrink:0;margin:12px 12px 0}.section-bottom[data-v-03a732e5]{flex:1;gap:12px;min-height:0;padding:12px;display:flex;overflow:hidden}.form-section[data-v-03a732e5]{flex-shrink:0;width:320px;overflow-y:auto}.preview-section[data-v-03a732e5]{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.preview-section .section-title[data-v-03a732e5]{flex-shrink:0}.preview-content[data-v-03a732e5]{flex:1;min-height:0;overflow:hidden}.pkg-form[data-v-03a732e5] .el-form-item{margin-bottom:16px}.pkg-page[data-v-bc327363]{background:var(--bg-page);height:100%}.pkg-page.dragging[data-v-bc327363]{-webkit-user-select:none;user-select:none;cursor:col-resize}.pkg-layout[data-v-bc327363]{background:var(--bg-white);border:1px solid var(--border-color);height:100%;box-shadow:var(--shadow-card);align-items:stretch;gap:0;display:flex}.pane-divider[data-v-bc327363]{background:var(--border-color);cursor:col-resize;flex-shrink:0;width:4px;transition:background .15s;position:relative}.pane-divider[data-v-bc327363]:after{content:"";position:absolute;inset:0 -2px}.pane-divider[data-v-bc327363]:hover,.dragging .pane-divider[data-v-bc327363]{background:var(--primary-border)}
This diff is collapsed.
.uc-page[data-v-d5068297]{background:var(--bg-page);place-items:center;height:100%;display:grid}.uc-card[data-v-d5068297]{background:var(--bg-white);border:1px solid var(--border-color);width:min(480px,100%);box-shadow:var(--shadow-card);text-align:center;border-radius:4px;padding:40px 32px}.uc-card h2[data-v-d5068297]{color:var(--text-primary);margin:0 0 12px;font-size:16px;font-weight:600}.uc-card p[data-v-d5068297]{color:var(--text-secondary);margin:0;font-size:13px;line-height:1.6}
import{Ht as e,I as t,d as n,m as r,t as i}from"./_plugin-vue_export-helper-D1RKUtCV.js";var a={class:`uc-page`},o={class:`uc-card`},s=i({__name:`UnderConstruction`,props:{title:{type:String,default:`页面建设中`}},setup(i){return(s,c)=>(t(),r(`section`,a,[n(`div`,o,[n(`h2`,null,e(i.title),1),c[0]||=n(`p`,null,`该模块正在建设中,可先使用“数据管理”完成数据上传与查看。`,-1)])]))}},[[`__scopeId`,`data-v-d5068297`]]);export{s as default};
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import{t as e}from"./request-D8DwihSV.js";function t(){return e.get(`/train/packages`)}function n(){return e.get(`/train/tasks`)}function r(t){return e.post(`/train/tasks`,t)}function i(t){return e.post(`/train/tasks/${t}/cancel`)}function a(t){return e.post(`/train/tasks/${t}/restart`)}function o(t){return e.delete(`/train/tasks/${t}`)}function s(t){return e.post(`/train/tasks/${t}/save`)}function c(){return e.get(`/train/models`)}function l(t){return e.delete(`/train/models/${t}`)}export{c as a,a as c,o as i,s as l,r as n,t as o,l as r,n as s,i as t};
\ No newline at end of file
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>热实验温度控制系统</title>
<script type="module" crossorigin src="/assets/index-B6mx_Oi_.js"></script>
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-D1RKUtCV.js">
<link rel="modulepreload" crossorigin href="/assets/es-DCOtnflc.js">
<link rel="stylesheet" crossorigin href="/assets/index-Bdu9N6pH.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment