Files
zsglpt/static/admin/assets/SecurityPage-DBhX0IuO.js
yuyx b0fe325154 feat: KDocs 上传增强 + 离线监控 + Bug修复
KDocs 上传功能增强:
- 搜索优化:只用姓名搜索 + C列验证,避免匹配到错误单元格
- 有效行范围:支持配置起始行/结束行,限制上传区域
- 图片覆盖:支持覆盖单元格已有图片(Escape + Delete)
- 配置持久化:kdocs_row_start/row_end 保存到数据库(v18迁移)

二次登录功能:
- 登录后立即再次登录,让"上次登录时间"显示为刚刚

KDocs 离线监控:
- 每5分钟检测金山文档登录状态
- 离线时发送邮件通知管理员(每次掉线只通知一次)
- 恢复在线后重置通知状态

Bug 修复:
- 任务日志搜索账号关键词报错500:添加异常处理

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 23:40:46 +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-DKH_HvPt.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};