SPA shop/forum/payment/users sections now keep configuration pages only. Operational workbenches were removed from the sidebar and loaders; legacy hash routes open NativeOpsRedirect into the matching WP native admin page. Admin SPA production build refreshed accordingly.
2 lines
10 KiB
JavaScript
2 lines
10 KiB
JavaScript
import{_ as H,a1 as s,W as i,X as h,a4 as a,a3 as t,a2 as m,F as q,R as O,f as d,Z as g,a5 as C,l as W,o as X,r as x,Y as $}from"./vendor-vue.Bykizn0M.js";import{P as Y}from"./PageHeader.Di3JTPjc.js";import{_ as L}from"./FaIcon.CX_hGmM4.js";import{a as R}from"./shared-api.D5_fnN32.js";import{_ as Z}from"./index.js";import{u as K}from"./vendor-naive.BuHWlEgf.js";import"./vendor-misc.1adHN6i_.js";const Q={class:"aksrt-page-container"},ee={__name:"ExtensionsSectionPage",props:{title:{type:String,required:!0},desc:{type:String,default:""},note:{type:String,default:""},links:{type:Array,default:()=>[]}},setup(y){const p=H();function z(o){p.push(o)}return(o,k)=>{const _=s("n-button"),S=s("n-space"),u=s("n-alert"),c=s("n-card");return i(),h("div",Q,[a(Y,{title:y.title,desc:y.desc},{actions:t(()=>[y.links.length?(i(),m(S,{key:0},{default:t(()=>[(i(!0),h(q,null,O(y.links,I=>(i(),m(_,{key:I.path,quaternary:"",onClick:V=>z(I.path)},{default:t(()=>[d(g(I.label),1)]),_:2},1032,["onClick"]))),128))]),_:1})):C("",!0)]),_:1},8,["title","desc"]),y.note?(i(),m(c,{key:0,class:"aksrt-section-card"},{default:t(()=>[a(u,{type:"info","show-icon":!1},{default:t(()=>[d(g(y.note),1)]),_:1})]),_:1})):C("",!0),W(o.$slots,"default")])}}},te={class:"aksrt-security__overview-card"},ae={key:0,class:"aksrt-security__output"},le={key:0,class:"aksrt-security__output"},ne={__name:"ExtensionSecurity",setup(y){const p=K(),z=x(!1),o=x([{key:"email_gate",icon:"fas fa-envelope",color:"#1890ff",value:"—",label:"邮箱验证"},{key:"captcha",icon:"fas fa-shield-alt",color:"#52c41a",value:"—",label:"验证码保护"},{key:"moderation",icon:"fas fa-gavel",color:"#722ed1",value:"—",label:"内容审核"},{key:"ip_geo",icon:"fas fa-map-marker-alt",color:"#fa8c16",value:"—",label:"IP 归属地"}]),k=x([{key:"email_verification",icon:"fas fa-envelope",color:"#1890ff",name:"邮箱验证",description:"新用户注册需要邮箱验证",enabled:!1,settingsRoute:"/users/auth"},{key:"captcha_comment",icon:"fas fa-shield-alt",color:"#52c41a",name:"评论验证码",description:"发表评论时需要人机验证",enabled:!1,settingsRoute:"/permissions/login"},{key:"captcha_download",icon:"fas fa-shield-alt",color:"#52c41a",name:"下载验证码",description:"下载资源时需要人机验证",enabled:!1,settingsRoute:"/permissions/login"},{key:"content_audit",icon:"fas fa-shield-virus",color:"#722ed1",name:"内容审核 API",description:"接入第三方内容安全审核",enabled:!1,settingsRoute:"/extensions/audit"},{key:"ip_geolocation",icon:"fas fa-map-marker-alt",color:"#fa8c16",name:"IP 归属地",description:"在评论和用户主页显示 IP 归属地",enabled:!1,settingsRoute:"/extensions/ip"}]),_=x({show_unapproved_comments:!1,skip_submit_moderation:!1,guest_comment:!1}),S=x([]),u=x({ip:"8.8.8.8",loading:!1,result:""}),c=x({text:"这是一段用于审核测试的示例文本。",loading:!1,result:""});X(async()=>{var n;try{const e=await R.request("/settings/security");if(e!=null&&e.data){const r=e.data,w=e.services||{},f=r.captcha||w.captcha||{},N=!!(f.enabled&&f.configured),U=f.scenes||{},v=r.content_audit||w.audit||{},b=r.ip_geo||w.ip_geo||{};o.value[0].value=r.email_gate_enabled?"已开启":"未开启",o.value[0].color=r.email_gate_enabled?"#52c41a":"#8a909c",o.value[1].value=N?"已开启":"未开启",o.value[1].color=N?"#52c41a":"#8a909c",v.enabled?(o.value[2].value=v.configured?"已配置":"待补全",o.value[2].color=v.configured?"#52c41a":"#faad14"):(o.value[2].value="未开启",o.value[2].color="#8a909c"),b.enabled?(o.value[3].value=b.configured?"已配置":"待补全",o.value[3].color=b.configured?"#52c41a":"#faad14"):(o.value[3].value="未开启",o.value[3].color="#8a909c"),k.value[0].enabled=!!r.email_gate_enabled,k.value[1].enabled=!!U.comment,k.value[2].enabled=!!f.download_active,k.value[3].enabled=!!v.enabled,k.value[4].enabled=!!b.enabled,r.risk_switches&&(_.value={..._.value,...r.risk_switches})}}catch{}try{const e=await R.request("/security/audit-log");(n=e==null?void 0:e.data)!=null&&n.logs&&(S.value=e.data.logs.slice(0,10))}catch{}});async function I(){z.value=!0;try{await R.request("/settings/security",{method:"POST",body:JSON.stringify({risk_switches:_.value})}),p.success("风险设置已保存")}catch(n){p.error("保存失败: "+((n==null?void 0:n.message)||"未知错误"))}finally{z.value=!1}}async function V(){u.value.loading=!0,u.value.result="";try{const n=await R.testIpGeo(String(u.value.ip||"").trim()),e=(n==null?void 0:n.data)||{};u.value.result=JSON.stringify(e,null,2),e.ok?p.success(e.display?`IP 测试成功:${e.display}`:"IP 接口测试完成"):p.warning(e.message||"未查询到归属地信息")}catch(n){p.error((n==null?void 0:n.message)||"IP 测试失败")}finally{u.value.loading=!1}}async function M(){c.value.loading=!0,c.value.result="";try{const n=await R.testContentAudit(String(c.value.text||"").trim()),e=(n==null?void 0:n.data)||{};c.value.result=JSON.stringify(e,null,2),e.ok?p.success(e.message||"内容审核测试完成"):p.warning(e.message||"内容审核未通过或配置异常")}catch(n){p.error((n==null?void 0:n.message)||"内容审核测试失败")}finally{c.value.loading=!1}}return(n,e)=>{const r=s("n-grid-item"),w=s("n-grid"),f=s("n-card"),N=s("n-tag"),U=s("router-link"),v=s("n-space"),b=s("n-thing"),J=s("n-list-item"),F=s("n-list"),G=s("n-input"),P=s("n-form-item"),A=s("n-button"),B=s("n-form"),j=s("n-alert"),E=s("n-switch"),T=s("n-text"),D=s("n-empty");return i(),m(ee,{title:"网站安全",desc:"扩展安全策略和第三方安全集成。"},{default:t(()=>[a(f,{title:"安全概览",size:"small",class:"aksrt-security__section"},{default:t(()=>[a(w,{cols:4,"x-gap":12,"y-gap":12},{default:t(()=>[(i(!0),h(q,null,O(o.value,l=>(i(),m(r,{key:l.key},{default:t(()=>[$("div",te,[a(L,{icon:l.icon,size:18,color:l.color},null,8,["icon","color"]),$("div",null,[$("strong",null,g(l.value),1),$("p",null,g(l.label),1)])])]),_:2},1024))),128))]),_:1})]),_:1}),a(f,{title:"安全能力",size:"small",class:"aksrt-security__section"},{default:t(()=>[a(F,{bordered:"",size:"small"},{default:t(()=>[(i(!0),h(q,null,O(k.value,l=>(i(),m(J,{key:l.key},{default:t(()=>[a(b,{title:l.name,description:l.description},{avatar:t(()=>[a(L,{icon:l.icon,size:16,color:l.color},null,8,["icon","color"])]),"header-extra":t(()=>[a(v,{align:"center",size:"small"},{default:t(()=>[a(N,{type:l.enabled?"success":"default",size:"small"},{default:t(()=>[d(g(l.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"]),l.settingsRoute?(i(),m(U,{key:0,to:l.settingsRoute,class:"aksrt-security__config-link"},{default:t(()=>[...e[5]||(e[5]=[d(" 前往配置 ",-1)])]),_:1},8,["to"])):C("",!0)]),_:2},1024)]),_:2},1032,["title","description"])]),_:2},1024))),128))]),_:1})]),_:1}),a(f,{title:"在线测试",size:"small",class:"aksrt-security__section"},{default:t(()=>[a(w,{cols:2,"x-gap":16,"y-gap":16},{default:t(()=>[a(r,null,{default:t(()=>[a(B,{"label-placement":"top"},{default:t(()=>[a(P,{label:"IP 归属地测试"},{default:t(()=>[a(G,{value:u.value.ip,"onUpdate:value":e[0]||(e[0]=l=>u.value.ip=l),placeholder:"输入 IPv4 / IPv6,例如 8.8.8.8"},null,8,["value"])]),_:1}),a(v,null,{default:t(()=>[a(A,{loading:u.value.loading,onClick:V},{default:t(()=>[...e[6]||(e[6]=[d("测试 IP 接口",-1)])]),_:1},8,["loading"])]),_:1}),u.value.result?(i(),h("pre",ae,g(u.value.result),1)):C("",!0)]),_:1})]),_:1}),a(r,null,{default:t(()=>[a(B,{"label-placement":"top"},{default:t(()=>[a(P,{label:"内容审核测试"},{default:t(()=>[a(G,{value:c.value.text,"onUpdate:value":e[1]||(e[1]=l=>c.value.text=l),type:"textarea",autosize:{minRows:4,maxRows:8},placeholder:"输入一段测试文本,检查当前审核策略是否生效"},null,8,["value"])]),_:1}),a(v,null,{default:t(()=>[a(A,{loading:c.value.loading,onClick:M},{default:t(()=>[...e[7]||(e[7]=[d("测试内容审核",-1)])]),_:1},8,["loading"])]),_:1}),c.value.result?(i(),h("pre",le,g(c.value.result),1)):C("",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(f,{title:"风险开关",size:"small",class:"aksrt-security__section"},{action:t(()=>[a(v,{justify:"end"},{default:t(()=>[a(A,{type:"primary",size:"small",loading:z.value,onClick:I},{default:t(()=>[...e[12]||(e[12]=[d("保存风险设置",-1)])]),_:1},8,["loading"])]),_:1})]),default:t(()=>[a(j,{type:"warning",size:"small",style:{"margin-bottom":"12px"}},{default:t(()=>[...e[8]||(e[8]=[d(" 以下开关会影响站点安全策略,请谨慎操作。 ",-1)])]),_:1}),a(B,{"label-placement":"left","label-width":"200",size:"small"},{default:t(()=>[a(P,{label:"允许未审核评论显示"},{default:t(()=>[a(E,{value:_.value.show_unapproved_comments,"onUpdate:value":e[2]||(e[2]=l=>_.value.show_unapproved_comments=l)},null,8,["value"]),a(T,{depth:"3",style:{"margin-left":"8px","font-size":"12px"}},{default:t(()=>[...e[9]||(e[9]=[d(" 开启后未审核评论也会在前台显示(标记为待审核) ",-1)])]),_:1})]),_:1}),a(P,{label:"允许前台投稿无需审核"},{default:t(()=>[a(E,{value:_.value.skip_submit_moderation,"onUpdate:value":e[3]||(e[3]=l=>_.value.skip_submit_moderation=l)},null,8,["value"]),a(T,{depth:"3",style:{"margin-left":"8px","font-size":"12px"}},{default:t(()=>[...e[10]||(e[10]=[d(" 开启后用户投稿直接发布,不经过审核流程 ",-1)])]),_:1})]),_:1}),a(P,{label:"允许游客评论"},{default:t(()=>[a(E,{value:_.value.guest_comment,"onUpdate:value":e[4]||(e[4]=l=>_.value.guest_comment=l)},null,8,["value"]),a(T,{depth:"3",style:{"margin-left":"8px","font-size":"12px"}},{default:t(()=>[...e[11]||(e[11]=[d(" 开启后未登录用户也可以发表评论 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),a(f,{title:"安全审计",size:"small",class:"aksrt-security__section"},{default:t(()=>[S.value.length===0?(i(),m(D,{key:0,description:"暂无审计记录"})):(i(),m(F,{key:1,bordered:"",size:"small"},{default:t(()=>[(i(!0),h(q,null,O(S.value,l=>(i(),m(J,{key:l.id},{default:t(()=>[a(b,{title:l.action,description:l.detail},{"header-extra":t(()=>[a(T,{depth:"3",style:{"font-size":"11px"}},{default:t(()=>[d(g(l.time),1)]),_:2},1024)]),_:2},1032,["title","description"])]),_:2},1024))),128))]),_:1}))]),_:1})]),_:1})}}},_e=Z(ne,[["__scopeId","data-v-1628ae71"]]);export{_e as default};
|