Files
zsglpt/static/admin/assets/SecurityPage-hp7dnVAc.js
2026-01-07 17:03:03 +08:00

6 lines
18 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{a as g,_ as Oe,r as p,c as pe,o as He,f as c,I as Je,g as I,h as u,j as r,m as a,w as l,q as i,F as ce,v as Se,B as y,p as f,J as le,n as fe,K as ne,L as h}from"./index-BDEpmftQ.js";async function Ge(){const{data:d}=await g.get("/admin/security/dashboard");return d}async function Qe(d){const{data:m}=await g.get("/admin/security/threats",{params:d});return m}async function We(){const{data:d}=await g.get("/admin/security/banned-ips");return d}async function Xe(){const{data:d}=await g.get("/admin/security/banned-users");return d}async function Ye(d){const{data:m}=await g.post("/admin/security/ban-ip",d);return m}async function Ze(d){const{data:m}=await g.post("/admin/security/unban-ip",{ip:d});return m}async function et(d){const{data:m}=await g.post("/admin/security/ban-user",d);return m}async function tt(d){const{data:m}=await g.post("/admin/security/unban-user",{user_id:d});return m}async function at(d){const m=encodeURIComponent(String(d||"").trim()),{data:V}=await g.get(`/admin/security/ip-risk/${m}`);return V}async function lt(d){const{data:m}=await g.post("/admin/security/ip-risk/clear",{ip:d});return m}async function nt(d){const m=encodeURIComponent(String(d||"").trim()),{data:V}=await g.get(`/admin/security/user-risk/${m}`);return V}async function it(){const{data:d}=await g.post("/admin/security/cleanup",{});return d}const st={class:"page-stack"},ot={class:"app-page-title"},ut={class:"toolbar"},rt={class:"stat-value"},dt={class:"stat-label"},pt={class:"filters"},ct={class:"table-wrap"},ft={key:1},mt={key:1},vt={class:"mono ellipsis"},_t={class:"ellipsis"},yt={class:"pagination"},bt={class:"page-hint app-muted"},gt={class:"toolbar"},kt={class:"table-wrap"},wt={class:"table-wrap"},ht={class:"filters"},It={class:"filters"},Vt={class:"risk-head"},xt={class:"risk-title"},Ct={key:0},St={key:1},Tt={class:"toolbar"},Pt={class:"table-wrap"},Ut={class:"mono ellipsis"},Bt={class:"ellipsis"},$t={class:"dialog-actions"},me=20,Rt={__name:"SecurityPage",setup(d){const m=p("threats"),V=p(!1),z=p(null),ie=p(!1),E=p([]),A=p(0),S=p(1),$=p(""),R=p(""),D=p(!1),ve=p([]),_e=p([]),ye=p("ips"),T=p(!1),N=p(!1),o=p({kind:"ip",ip:"",user_id:"",reason:"",duration_hours:24,permanent:!1}),K=p("ip"),k=p(!1),O=p(""),H=p(""),_=p(null),w=p(""),Te=["sql_injection","xss","path_traversal","command_injection","ssrf","scanner","bruteforce","csrf","xxe","file_upload"];function se(n){const e=Number(n);return Number.isFinite(e)?e:0}function F(n){const e=Number(n||0);return e>=80?{label:"高",type:"danger"}:e>=50?{label:"中",type:"warning"}:{label:"低",type:"success"}}function be(n){const e=String(n||"").trim();return e||"永久"}function ge(n){const e=[];return n?.field_name&&e.push(`字段: ${n.field_name}`),n?.rule&&e.push(`规则: ${n.rule}`),n?.matched&&e.push(`匹配: ${n.matched}`),n?.value_preview&&e.push(`值: ${n.value_preview}`),e.length?e.join(" · "):"-"}function J(n){const e=String(n?.request_method||"").trim(),s=String(n?.request_path||"").trim();return`${e} ${s}`.trim()||"-"}const Pe=pe(()=>{const n=new Set(Te),e=z.value?.recent_threat_events||[];for(const s of e){const b=String(s?.threat_type||"").trim();b&&n.add(b)}for(const s of E.value||[]){const b=String(s?.threat_type||"").trim();b&&n.add(b)}return Array.from(n).sort((s,b)=>s.localeCompare(b)).map(s=>({label:s,value:s}))}),Ue=pe(()=>{const n=z.value||{};return[{key:"threat_events_24h",label:"最近24小时威胁事件",value:se(n.threat_events_24h)},{key:"banned_ip_count",label:"当前封禁IP数",value:se(n.banned_ip_count)},{key:"banned_user_count",label:"当前封禁用户数",value:se(n.banned_user_count)}]}),Be=pe(()=>Math.max(1,Math.ceil((A.value||0)/me)));async function j(){V.value=!0;try{z.value=await Ge()}catch{z.value=null}finally{V.value=!1}}async function G(){ie.value=!0;try{const n={page:S.value,per_page:me};$.value&&(n.event_type=$.value),R.value&&(n.severity=R.value);const e=await Qe(n);E.value=e?.items||[],A.value=e?.total||0}catch{E.value=[],A.value=0}finally{ie.value=!1}}async function P(){if(!D.value){D.value=!0;try{const[n,e]=await Promise.allSettled([We(),Xe()]);ve.value=n.status==="fulfilled"?n.value?.items||[]:[],_e.value=e.status==="fulfilled"?e.value?.items||[]:[]}finally{D.value=!1}}}async function oe(){await Promise.allSettled([j(),G(),P()])}function $e(){S.value=1,G()}function Re(){$.value="",R.value="",S.value=1,G()}function ke(){o.value={kind:"ip",ip:"",user_id:"",reason:"",duration_hours:24,permanent:!1}}function Q(n="ip",e={}){ke(),o.value.kind=n==="user"?"user":"ip",o.value.kind==="ip"?o.value.ip=String(e.ip||"").trim():o.value.user_id=String(e.user_id||"").trim(),e.reason&&(o.value.reason=String(e.reason||"").trim()),T.value=!0}async function De(){const n=o.value.kind,e=String(o.value.reason||"").trim(),s=!!o.value.permanent,b=Number(o.value.duration_hours||24);if(!e){h.error("原因不能为空");return}if(n==="ip"){const Y=String(o.value.ip||"").trim();if(!Y){h.error("IP不能为空");return}N.value=!0;try{await Ye({ip:Y,reason:e,duration_hours:b,permanent:s}),h.success("IP已封禁"),T.value=!1,await Promise.allSettled([j(),P()])}catch{}finally{N.value=!1}return}const L=String(o.value.user_id||"").trim(),X=Number.parseInt(L,10);if(!Number.isFinite(X)){h.error("用户ID无效");return}N.value=!0;try{await et({user_id:X,reason:e,duration_hours:b,permanent:s}),h.success("用户已封禁"),T.value=!1,await Promise.allSettled([j(),P()])}catch{}finally{N.value=!1}}async function we(n){const e=String(n||"").trim();if(e){try{await ne.confirm(`确定解除对 IP ${e} 的封禁吗?`,"解除封禁",{confirmButtonText:"解除",cancelButtonText:"取消",type:"warning"})}catch{return}try{await Ze(e),h.success("已解除IP封禁"),await Promise.allSettled([j(),P()])}catch{}}}async function he(n){const e=Number.parseInt(String(n||"").trim(),10);if(Number.isFinite(e)){try{await ne.confirm(`确定解除对 用户ID ${e} 的封禁吗?`,"解除封禁",{confirmButtonText:"解除",cancelButtonText:"取消",type:"warning"})}catch{return}try{await tt(e),h.success("已解除用户封禁"),await Promise.allSettled([j(),P()])}catch{}}}function Ie(n){const e=String(n||"").trim();e&&(m.value="risk",K.value="ip",O.value=e,W())}function Ve(n){const e=String(n||"").trim();e&&(m.value="risk",K.value="user",H.value=e,ue())}async function W(){const n=String(O.value||"").trim();if(!n){h.error("请输入IP");return}k.value=!0;try{_.value=await at(n),w.value="ip"}catch{_.value=null,w.value=""}finally{k.value=!1}}async function ue(){const n=String(H.value||"").trim(),e=Number.parseInt(n,10);if(!Number.isFinite(e)){h.error("请输入有效的用户ID");return}k.value=!0;try{_.value=await nt(e),w.value="user"}catch{_.value=null,w.value=""}finally{k.value=!1}}function Ne(){!_.value||!w.value||(w.value==="ip"?Q("ip",{ip:_.value?.ip,reason:"风险查询手动封禁"}):Q("user",{user_id:_.value?.user_id,reason:"风险查询手动封禁"}))}async function Fe(){!_.value||!w.value||(w.value==="ip"?(await we(_.value?.ip),await W()):(await he(_.value?.user_id),await ue()))}async function je(){if(w.value!=="ip")return;const n=String(_.value?.ip||"").trim();if(n){try{await ne.confirm(`确定清除 IP ${n} 的风险分吗?
清除风险分不会删除威胁历史,也不会解除封禁。`,"清除风险分",{confirmButtonText:"清除",cancelButtonText:"取消",type:"warning"})}catch{return}if(!k.value){k.value=!0;try{await lt(n),h.success("IP风险分已清零")}catch{}finally{k.value=!1}await W()}}}const re=p(!1);async function Le(){try{await ne.confirm(`确定清理过期封禁记录,并衰减风险分吗?
该操作不会影响仍在有效期内的封禁。`,"清理过期记录",{confirmButtonText:"清理",cancelButtonText:"取消",type:"warning"})}catch{return}re.value=!0;try{await it(),h.success("清理完成"),await oe()}catch{}finally{re.value=!1}}return He(async()=>{await oe()}),(n,e)=>{const s=c("el-button"),b=c("el-skeleton"),L=c("el-card"),X=c("el-col"),Y=c("el-row"),U=c("el-option"),xe=c("el-select"),v=c("el-table-column"),x=c("el-tag"),Z=c("el-link"),ee=c("el-tooltip"),te=c("el-table"),qe=c("el-pagination"),C=c("el-tab-pane"),de=c("el-tabs"),q=c("el-input"),Ce=c("el-radio-button"),Me=c("el-radio-group"),B=c("el-form-item"),ze=c("el-switch"),Ee=c("el-input-number"),Ae=c("el-form"),Ke=c("el-dialog"),ae=Je("loading");return u(),I("div",st,[r("div",ot,[e[21]||(e[21]=r("h2",null,"安全防护",-1)),r("div",ut,[a(s,{onClick:oe},{default:l(()=>[...e[18]||(e[18]=[i("刷新",-1)])]),_:1}),a(s,{type:"warning",plain:"",loading:re.value,onClick:Le},{default:l(()=>[...e[19]||(e[19]=[i("清理过期记录",-1)])]),_:1},8,["loading"]),a(s,{type:"primary",onClick:e[0]||(e[0]=t=>Q())},{default:l(()=>[...e[20]||(e[20]=[i("手动封禁",-1)])]),_:1})])]),a(Y,{gutter:12,class:"stats-row"},{default:l(()=>[(u(!0),I(ce,null,Se(Ue.value,t=>(u(),y(X,{key:t.key,xs:24,sm:8,md:8,lg:8,xl:8},{default:l(()=>[a(L,{shadow:"never",class:"stat-card","body-style":{padding:"14px"}},{default:l(()=>[r("div",rt,[V.value?(u(),y(b,{key:0,rows:1,animated:""})):(u(),I(ce,{key:1},[i(f(t.value),1)],64))]),r("div",dt,f(t.label),1)]),_:2},1024)]),_:2},1024))),128))]),_:1}),a(L,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:l(()=>[a(de,{modelValue:m.value,"onUpdate:modelValue":e[9]||(e[9]=t=>m.value=t)},{default:l(()=>[a(C,{label:"威胁事件",name:"threats"},{default:l(()=>[r("div",pt,[a(xe,{modelValue:$.value,"onUpdate:modelValue":e[1]||(e[1]=t=>$.value=t),placeholder:"类型",style:{width:"220px"},filterable:"",clearable:"","allow-create":"","default-first-option":""},{default:l(()=>[a(U,{label:"全部",value:""}),(u(!0),I(ce,null,Se(Pe.value,t=>(u(),y(U,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(xe,{modelValue:R.value,"onUpdate:modelValue":e[2]||(e[2]=t=>R.value=t),placeholder:"严重程度",style:{width:"200px"},clearable:""},{default:l(()=>[a(U,{label:"全部",value:""}),a(U,{label:"高风险(>=80)",value:"high"}),a(U,{label:"中风险(50-79)",value:"medium"}),a(U,{label:"低风险(<50)",value:"low"})]),_:1},8,["modelValue"]),a(s,{type:"primary",onClick:$e},{default:l(()=>[...e[22]||(e[22]=[i("筛选",-1)])]),_:1}),a(s,{onClick:Re},{default:l(()=>[...e[23]||(e[23]=[i("重置",-1)])]),_:1})]),r("div",ct,[le((u(),y(te,{data:E.value,style:{width:"100%"}},{default:l(()=>[a(v,{prop:"created_at",label:"时间",width:"180"}),a(v,{label:"类型",width:"170"},{default:l(({row:t})=>[a(x,{effect:"light",type:"info"},{default:l(()=>[i(f(t.threat_type||"unknown"),1)]),_:2},1024)]),_:1}),a(v,{label:"严重程度",width:"120"},{default:l(({row:t})=>[a(x,{type:F(t.score).type,effect:"light"},{default:l(()=>[i(f(F(t.score).label)+" ("+f(t.score??0)+") ",1)]),_:2},1032,["type"])]),_:1}),a(v,{label:"IP",width:"150"},{default:l(({row:t})=>[t.ip?(u(),y(Z,{key:0,type:"primary",underline:!1,onClick:M=>Ie(t.ip)},{default:l(()=>[i(f(t.ip),1)]),_:2},1032,["onClick"])):(u(),I("span",ft,"-"))]),_:1}),a(v,{label:"用户",width:"120"},{default:l(({row:t})=>[t.user_id!==null&&t.user_id!==void 0?(u(),y(Z,{key:0,type:"primary",underline:!1,onClick:M=>Ve(t.user_id)},{default:l(()=>[i(f(t.user_id),1)]),_:2},1032,["onClick"])):(u(),I("span",mt,"-"))]),_:1}),a(v,{label:"操作路径","min-width":"220"},{default:l(({row:t})=>[a(ee,{content:J(t),placement:"top","show-after":300},{default:l(()=>[r("span",vt,f(J(t)),1)]),_:2},1032,["content"])]),_:1}),a(v,{label:"Payload预览","min-width":"240"},{default:l(({row:t})=>[a(ee,{content:ge(t),placement:"top","show-after":300},{default:l(()=>[r("span",_t,f(t.value_preview||"-"),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data"])),[[ae,ie.value]])]),r("div",yt,[a(qe,{"current-page":S.value,"onUpdate:currentPage":e[3]||(e[3]=t=>S.value=t),"page-size":me,total:A.value,layout:"prev, pager, next, jumper, ->, total",onCurrentChange:G},null,8,["current-page","total"]),r("div",bt,"第 "+f(S.value)+" / "+f(Be.value)+" 页",1)])]),_:1}),a(C,{label:"封禁管理",name:"bans"},{default:l(()=>[r("div",gt,[a(s,{onClick:P},{default:l(()=>[...e[24]||(e[24]=[i("刷新封禁列表",-1)])]),_:1}),a(s,{type:"primary",onClick:e[4]||(e[4]=t=>Q())},{default:l(()=>[...e[25]||(e[25]=[i("手动封禁",-1)])]),_:1})]),a(de,{modelValue:ye.value,"onUpdate:modelValue":e[5]||(e[5]=t=>ye.value=t),class:"inner-tabs"},{default:l(()=>[a(C,{label:"IP黑名单",name:"ips"},{default:l(()=>[r("div",kt,[le((u(),y(te,{data:ve.value,style:{width:"100%"}},{default:l(()=>[a(v,{label:"IP",width:"180"},{default:l(({row:t})=>[a(Z,{type:"primary",underline:!1,onClick:M=>Ie(t.ip)},{default:l(()=>[i(f(t.ip||"-"),1)]),_:2},1032,["onClick"])]),_:1}),a(v,{prop:"reason",label:"原因","min-width":"260"}),a(v,{label:"过期时间",width:"190"},{default:l(({row:t})=>[i(f(be(t.expires_at)),1)]),_:1}),a(v,{label:"操作",width:"120",fixed:"right"},{default:l(({row:t})=>[a(s,{size:"small",type:"danger",plain:"",onClick:M=>we(t.ip)},{default:l(()=>[...e[26]||(e[26]=[i("解除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[ae,D.value]])])]),_:1}),a(C,{label:"用户黑名单",name:"users"},{default:l(()=>[r("div",wt,[le((u(),y(te,{data:_e.value,style:{width:"100%"}},{default:l(()=>[a(v,{label:"用户ID",width:"180"},{default:l(({row:t})=>[a(Z,{type:"primary",underline:!1,onClick:M=>Ve(t.user_id)},{default:l(()=>[i(f(t.user_id??"-"),1)]),_:2},1032,["onClick"])]),_:1}),a(v,{prop:"reason",label:"原因","min-width":"260"}),a(v,{label:"过期时间",width:"190"},{default:l(({row:t})=>[i(f(be(t.expires_at)),1)]),_:1}),a(v,{label:"操作",width:"120",fixed:"right"},{default:l(({row:t})=>[a(s,{size:"small",type:"danger",plain:"",onClick:M=>he(t.user_id)},{default:l(()=>[...e[27]||(e[27]=[i("解除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[ae,D.value]])])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(C,{label:"风险查询",name:"risk"},{default:l(()=>[a(de,{modelValue:K.value,"onUpdate:modelValue":e[8]||(e[8]=t=>K.value=t),class:"inner-tabs"},{default:l(()=>[a(C,{label:"IP查询",name:"ip"},{default:l(()=>[r("div",ht,[a(q,{modelValue:O.value,"onUpdate:modelValue":e[6]||(e[6]=t=>O.value=t),placeholder:"输入IP如 1.2.3.4",style:{width:"260px"},clearable:""},null,8,["modelValue"]),a(s,{type:"primary",loading:k.value,onClick:W},{default:l(()=>[...e[28]||(e[28]=[i("查询",-1)])]),_:1},8,["loading"])])]),_:1}),a(C,{label:"用户查询",name:"user"},{default:l(()=>[r("div",It,[a(q,{modelValue:H.value,"onUpdate:modelValue":e[7]||(e[7]=t=>H.value=t),placeholder:"输入用户ID如 123",style:{width:"260px"},clearable:""},null,8,["modelValue"]),a(s,{type:"primary",loading:k.value,onClick:ue},{default:l(()=>[...e[29]||(e[29]=[i("查询",-1)])]),_:1},8,["loading"])])]),_:1})]),_:1},8,["modelValue"]),_.value?(u(),y(L,{key:0,shadow:"never","body-style":{padding:"16px"},class:"sub-card"},{default:l(()=>[r("div",Vt,[r("div",xt,[w.value==="ip"?(u(),I("strong",Ct,"IP: "+f(_.value.ip),1)):(u(),I("strong",St,"用户ID: "+f(_.value.user_id),1)),e[32]||(e[32]=r("span",{class:"app-muted"},"风险分",-1)),a(x,{type:F(_.value.risk_score).type,effect:"light"},{default:l(()=>[i(f(_.value.risk_score??0),1)]),_:1},8,["type"]),_.value.is_banned?(u(),y(x,{key:2,type:"danger",effect:"light"},{default:l(()=>[...e[30]||(e[30]=[i("已封禁",-1)])]),_:1})):(u(),y(x,{key:3,type:"success",effect:"light"},{default:l(()=>[...e[31]||(e[31]=[i("未封禁",-1)])]),_:1}))]),r("div",Tt,[_.value.is_banned?(u(),y(s,{key:1,type:"danger",plain:"",onClick:Fe},{default:l(()=>[...e[34]||(e[34]=[i("解除封禁",-1)])]),_:1})):(u(),y(s,{key:0,type:"primary",plain:"",onClick:Ne},{default:l(()=>[...e[33]||(e[33]=[i("封禁",-1)])]),_:1})),w.value==="ip"?(u(),y(s,{key:2,type:"warning",plain:"",loading:k.value,onClick:je},{default:l(()=>[...e[35]||(e[35]=[i(" 清除风险分 ",-1)])]),_:1},8,["loading"])):fe("",!0)])]),r("div",Pt,[le((u(),y(te,{data:_.value.threat_history||[],style:{width:"100%"}},{default:l(()=>[a(v,{prop:"created_at",label:"时间",width:"180"}),a(v,{label:"类型",width:"170"},{default:l(({row:t})=>[a(x,{effect:"light",type:"info"},{default:l(()=>[i(f(t.threat_type||"unknown"),1)]),_:2},1024)]),_:1}),a(v,{label:"严重程度",width:"120"},{default:l(({row:t})=>[a(x,{type:F(t.score).type,effect:"light"},{default:l(()=>[i(f(F(t.score).label)+" ("+f(t.score??0)+") ",1)]),_:2},1032,["type"])]),_:1}),a(v,{label:"操作路径","min-width":"220"},{default:l(({row:t})=>[a(ee,{content:J(t),placement:"top","show-after":300},{default:l(()=>[r("span",Ut,f(J(t)),1)]),_:2},1032,["content"])]),_:1}),a(v,{label:"Payload预览","min-width":"240"},{default:l(({row:t})=>[a(ee,{content:ge(t),placement:"top","show-after":300},{default:l(()=>[r("span",Bt,f(t.value_preview||"-"),1)]),_:2},1032,["content"])]),_:1})]),_:1},8,["data"])),[[ae,k.value]])])]),_:1})):fe("",!0)]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(Ke,{modelValue:T.value,"onUpdate:modelValue":e[17]||(e[17]=t=>T.value=t),title:"手动封禁",width:"min(520px, 92vw)",onClosed:ke},{footer:l(()=>[r("div",$t,[e[40]||(e[40]=r("div",{class:"spacer"},null,-1)),a(s,{onClick:e[16]||(e[16]=t=>T.value=!1)},{default:l(()=>[...e[38]||(e[38]=[i("取消",-1)])]),_:1}),a(s,{type:"primary",loading:N.value,onClick:De},{default:l(()=>[...e[39]||(e[39]=[i("确认封禁",-1)])]),_:1},8,["loading"])])]),default:l(()=>[a(Ae,{"label-width":"120px"},{default:l(()=>[a(B,{label:"类型"},{default:l(()=>[a(Me,{modelValue:o.value.kind,"onUpdate:modelValue":e[10]||(e[10]=t=>o.value.kind=t)},{default:l(()=>[a(Ce,{label:"ip"},{default:l(()=>[...e[36]||(e[36]=[i("IP",-1)])]),_:1}),a(Ce,{label:"user"},{default:l(()=>[...e[37]||(e[37]=[i("用户",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),o.value.kind==="ip"?(u(),y(B,{key:0,label:"IP"},{default:l(()=>[a(q,{modelValue:o.value.ip,"onUpdate:modelValue":e[11]||(e[11]=t=>o.value.ip=t),placeholder:"例如 1.2.3.4"},null,8,["modelValue"])]),_:1})):(u(),y(B,{key:1,label:"用户ID"},{default:l(()=>[a(q,{modelValue:o.value.user_id,"onUpdate:modelValue":e[12]||(e[12]=t=>o.value.user_id=t),placeholder:"例如 123"},null,8,["modelValue"])]),_:1})),a(B,{label:"原因"},{default:l(()=>[a(q,{modelValue:o.value.reason,"onUpdate:modelValue":e[13]||(e[13]=t=>o.value.reason=t),type:"textarea",rows:3,placeholder:"请输入封禁原因"},null,8,["modelValue"])]),_:1}),a(B,{label:"永久封禁"},{default:l(()=>[a(ze,{modelValue:o.value.permanent,"onUpdate:modelValue":e[14]||(e[14]=t=>o.value.permanent=t)},null,8,["modelValue"])]),_:1}),o.value.permanent?fe("",!0):(u(),y(B,{key:2,label:"持续(小时)"},{default:l(()=>[a(Ee,{modelValue:o.value.duration_hours,"onUpdate:modelValue":e[15]||(e[15]=t=>o.value.duration_hours=t),min:1,max:8760},null,8,["modelValue"])]),_:1}))]),_:1})]),_:1},8,["modelValue"])])}}},Nt=Oe(Rt,[["__scopeId","data-v-22d57053"]]);export{Nt as default};