feat(admin): strip SPA ops menus; redirect old hashes to native WP (Phase 4)

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.
This commit is contained in:
kate522 committed 2026-07-15 02:10:05 +08:00
1 parent bf061f43ee
commit a3dde3874a
85 files changed
+15987 -249

No files matched your search

@@ -0,0 +1 @@
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||"内Line truncated