mirror of
https://git-qiuchenly.yltfspace.com/QiuChenly/corepatch
synced 2025-11-25 05:40:27 +08:00
482 lines
146 KiB
JavaScript
482 lines
146 KiB
JavaScript
import{T as e,f as a,z as l,A as t}from"./BFOgUDhg.js"
|
||
import{d as s,r as n,w as i,c as u,o,i as c,a as d,F as r,l as v,m as p,T as m,p as b,q as g,b as y,t as f,e as h,z as k,C as I,D as w,B as C,G as x,u as _,h as S,k as A,n as V,U,g as T,H as E,P as N,v as D,V as P,E as M}from"./CdD4XvnD.js"
|
||
import{c as B,_ as z,T as F,A as $,U as R,a as q,i as L,f as j,M as O,g as K,b as G,C as W,d as H,e as J,u as Q,S as Y}from"./BaSQ3xJt.js"
|
||
import{C as X}from"./Nkv5t_uh.js"
|
||
import{A as Z}from"./DJTzdxEM.js"
|
||
import{P as ee}from"./CU438sNO.js"
|
||
import{P as ae}from"./JHpP7yB4.js"
|
||
import{a as le,b as te,F as se,g as ne}from"./6K6b4Qy_.js"
|
||
import{I as ie}from"./JespKOZ3.js"
|
||
import{I as ue}from"./j0cGtmjd.js"
|
||
import{u as oe}from"./_iI2y1H4.js"
|
||
import{chunkUpload as ce}from"./BvE56hIT.js"
|
||
const de={class:"user-edit-dialog"},re={class:"dialog-header"},ve={class:"dialog-body"},pe={key:0,class:"loading-state"},me={key:1,class:"user-form"},be={class:"user-header-section"},ge=["src"],ye={key:1,class:"avatar-placeholder"},fe=["disabled"],he=["disabled"],ke=["disabled"],Ie={key:1,class:"avatar-menu-item uploading"},we={class:"readonly-info"},Ce={class:"info-item"},xe={class:"info-value"},_e={class:"info-item"},Se={class:"info-value"},Ae={class:"form-grid"},Ve={class:"form-item"},Ue={class:"input-with-icon"},Te={class:"form-item"},Ee={class:"input-with-icon"},Ne={class:"form-item"},De={class:"form-item"},Pe={class:"input-with-icon"},Me={class:"form-item"},Be={class:"input-with-icon"},ze={class:"form-item"},Fe={class:"input-with-icon"},$e={key:0,class:"form-item"},Re={class:"form-item"},qe={class:"titles-section"},Le={class:"titles-list"},je=["onClick"],Oe={class:"add-title-input"},Ke=["disabled"],Ge={class:"dialog-actions"},We=["disabled"],He=["src"],Je=q(s({__name:"UserEditDialog",props:{visible:{type:Boolean},userData:{},canEditRole:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["confirm","cancel","update:visible"],setup(e,{emit:a}){const l=e,t=a,s=n({nickName:"",email:"",avatar:"",gender:"unknown",age:0,exp:0,level:0,role:"user",status:"active",titles:[]}),V=n(""),U=n(null),T=n(null),E=n(null),N=n(null),D=n(""),P=n(!1),M=n(!1),q=n(!1),L=n(null),{toasts:j,success:O,error:K,removeToast:G}=B(),W=n(""),H=()=>{var e
|
||
null==(e=U.value)||e.click()},J=async e=>{var a
|
||
const l=null==(a=e.target.files)?void 0:a[0]
|
||
if(!l)return
|
||
if(!l.type.startsWith("image/"))return void K("请选择图片文件",2e3)
|
||
if(l.size>10485760)return void K("图片大小不能超过10MB",2e3)
|
||
const t=new FileReader
|
||
t.onload=e=>{var a
|
||
D.value=null==(a=e.target)?void 0:a.result},t.readAsDataURL(l),N.value=l,await Q(l)},Q=async e=>{var a,l,t
|
||
P.value=!0
|
||
try{const l=await $.uploadFile(R.APP_ICON,e)
|
||
if(!l.success||!(null==(a=l.data)?void 0:a.fileId))throw new Error(l.message||"上传头像失败")
|
||
s.value.avatar=l.data.fileId,O("头像上传成功",2e3)}catch(n){const e=(null==(t=null==(l=n.response)?void 0:l.data)?void 0:t.message)||n.message||"上传头像失败"
|
||
K(e,3e3),N.value=null,D.value=""}finally{P.value=!1}},Y=()=>{N.value=null,D.value="",s.value.avatar="",U.value&&(U.value.value=""),M.value=!1},Z=()=>{L.value&&(clearTimeout(L.value),L.value=null),M.value=!0},ee=()=>{(D.value||W.value)&&(q.value=!0,M.value=!1)},ae=e=>{const a=e.relatedTarget
|
||
a&&E.value&&E.value.contains(a)||(L.value&&clearTimeout(L.value),L.value=window.setTimeout(()=>{M.value=!1},200))},le=()=>{if(!M.value||!T.value||!E.value)return
|
||
const e=T.value.getBoundingClientRect(),a=E.value,l=a.offsetHeight
|
||
let t=e.right+12,s=e.top
|
||
t+52>window.innerWidth-20&&(t=e.left-52-12),s+l>window.innerHeight-20&&(s=window.innerHeight-l-20),t<20&&(t=20),s<20&&(s=20),a.style.left=`${t}px`,a.style.top=`${s}px`}
|
||
i(M,e=>{e&&A(()=>{le()})})
|
||
const te=u(()=>[{value:"user",label:"普通用户",icon:"mdi:account"},{value:"admin",label:"管理员",icon:"mdi:shield-account"}]),se=u(()=>[{value:"active",label:"正常",icon:"mdi:check-circle"},{value:"locked",label:"锁定",icon:"mdi:lock"},{value:"banned",label:"封禁",icon:"mdi:ban"}]),ne=u(()=>[{value:"unknown",label:"未知",icon:"mdi:help-circle"},{value:"male",label:"男",icon:"mdi:gender-male"},{value:"female",label:"女",icon:"mdi:gender-female"}]),ie=()=>{var e
|
||
const a=V.value.trim()
|
||
a&&!(null==(e=s.value.titles)?void 0:e.includes(a))&&(s.value.titles||(s.value.titles=[]),s.value.titles.push(a),V.value="")}
|
||
o(()=>{window.addEventListener("scroll",le,!0),window.addEventListener("resize",le)}),c(()=>{window.removeEventListener("scroll",le,!0),window.removeEventListener("resize",le),L.value&&clearTimeout(L.value),W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value)}),i(()=>l.visible,e=>{e&&((()=>{var e
|
||
l.userData&&(s.value={nickName:l.userData.nickName||"",email:l.userData.email||"",avatar:l.userData.avatar||"",gender:l.userData.gender||"unknown",age:l.userData.age||0,exp:l.userData.exp||0,level:l.userData.level||0,role:l.userData.role||"user",status:l.userData.status||"active",titles:l.userData.titles?[...l.userData.titles]:[]},N.value=null,D.value="",M.value=!1,(null==(e=l.userData)?void 0:e.avatar)?(async()=>{if(s.value.avatar){if(s.value.avatar.startsWith("http://")||s.value.avatar.startsWith("https://"))return void(W.value=s.value.avatar)
|
||
try{const e=await $.getImage(s.value.avatar,80,200,200)
|
||
W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value),W.value=e}catch(e){W.value=""}}else W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value),W.value=""})():(W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value),W.value=""))})(),V.value="")})
|
||
const ue=()=>{t("confirm",s.value)},oe=()=>{t("update:visible",!1),t("cancel")}
|
||
return(a,l)=>(S(),d(r,null,[(S(),v(m,{to:"body"},[p(b,{name:"fade"},{default:g(()=>{return[e.visible?(S(),d("div",{key:0,class:"user-edit-dialog-overlay",onClick:f(oe,["self"])},[h("div",de,[h("div",re,[l[12]||(l[12]=h("h3",{class:"dialog-title"},"编辑用户信息",-1)),h("button",{class:"close-btn",onClick:oe,type:"button"},[p(z,{icon:"mdi:close"})])]),h("div",ve,[e.loading?(S(),d("div",pe,[...l[13]||(l[13]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载用户信息中...",-1)])])):(S(),d("div",me,[h("div",be,[h("div",{class:"avatar-section",onMouseenter:Z,onMouseleave:ae},[h("div",{ref_key:"avatarPreviewRef",ref:T,class:"avatar-preview"},[D.value||W.value?(S(),d("img",{key:0,src:D.value||W.value,alt:"头像预览",class:"avatar-image"},null,8,ge)):(S(),d("div",ye,[p(z,{icon:"mdi:account",class:"placeholder-icon"})]))],512),h("input",{ref_key:"avatarInputRef",ref:U,type:"file",accept:"image/*",onChange:J,class:"file-input",style:{display:"none"}},null,544),(S(),v(m,{to:"body"},[p(b,{name:"avatar-menu-fade"},{default:g(()=>[M.value?(S(),d("div",{key:0,ref_key:"avatarMenuRef",ref:E,class:"avatar-menu",onMouseenter:Z,onMouseleave:ae},[h("button",{type:"button",class:"avatar-menu-item",onClick:ee,disabled:!D.value&&!W.value,title:"预览"},[p(z,{icon:"fluent:eye-24-regular"})],8,fe),h("button",{type:"button",class:"avatar-menu-item",onClick:H,disabled:P.value,title:"更换"},[p(z,{icon:"fluent:image-edit-24-regular"})],8,he),N.value||s.value.avatar?(S(),d("button",{key:0,type:"button",class:"avatar-menu-item danger",onClick:Y,disabled:P.value,title:"清除"},[p(z,{icon:"fluent:delete-24-regular"})],8,ke)):y("",!0),P.value?(S(),d("div",Ie,[...l[14]||(l[14]=[h("div",{class:"spinner-small"},null,-1)])])):y("",!0)],544)):y("",!0)]),_:1})]))],32),h("div",we,[h("div",Ce,[l[15]||(l[15]=h("span",{class:"info-label"},"用户ID",-1)),h("span",xe,k(e.userData.id),1)]),h("div",_e,[l[16]||(l[16]=h("span",{class:"info-label"},"注册时间",-1)),h("span",Se,k((a=e.userData.createdAt,a?new Date(a).toLocaleString("zh-CN"):"未知")),1)])])]),h("div",Ae,[h("div",Ve,[l[17]||(l[17]=h("label",{class:"form-label"},"昵称",-1)),h("div",Ue,[p(z,{icon:"fluent:person-24-regular",class:"input-icon"}),I(h("input",{"onUpdate:modelValue":l[0]||(l[0]=e=>s.value.nickName=e),type:"text",placeholder:"请输入昵称",class:"form-input"},null,512),[[w,s.value.nickName]])])]),h("div",Te,[l[18]||(l[18]=h("label",{class:"form-label"},"邮箱",-1)),h("div",Ee,[p(z,{icon:"fluent:mail-24-regular",class:"input-icon"}),I(h("input",{"onUpdate:modelValue":l[1]||(l[1]=e=>s.value.email=e),type:"email",placeholder:"请输入邮箱",class:"form-input"},null,512),[[w,s.value.email]])])]),h("div",Ne,[l[19]||(l[19]=h("label",{class:"form-label"},"性别",-1)),p(X,{modelValue:s.value.gender,"onUpdate:modelValue":l[2]||(l[2]=e=>s.value.gender=e),options:ne.value,placeholder:"请选择性别"},null,8,["modelValue","options"])]),h("div",De,[l[20]||(l[20]=h("label",{class:"form-label"},"年龄",-1)),h("div",Pe,[p(z,{icon:"mdi:calendar",class:"input-icon"}),I(h("input",{"onUpdate:modelValue":l[3]||(l[3]=e=>s.value.age=e),type:"number",min:"0",max:"150",placeholder:"请输入年龄",class:"form-input"},null,512),[[w,s.value.age,void 0,{number:!0}]])])]),h("div",Me,[l[21]||(l[21]=h("label",{class:"form-label"},"经验值",-1)),h("div",Be,[p(z,{icon:"mdi:star",class:"input-icon"}),I(h("input",{"onUpdate:modelValue":l[4]||(l[4]=e=>s.value.exp=e),type:"number",min:"0",placeholder:"请输入经验值",class:"form-input"},null,512),[[w,s.value.exp,void 0,{number:!0}]])])]),h("div",ze,[l[22]||(l[22]=h("label",{class:"form-label"},"等级",-1)),h("div",Fe,[p(z,{icon:"mdi:trending-up",class:"input-icon"}),I(h("input",{"onUpdate:modelValue":l[5]||(l[5]=e=>s.value.level=e),type:"number",min:"0",placeholder:"请输入等级",class:"form-input"},null,512),[[w,s.value.level,void 0,{number:!0}]])])]),e.canEditRole?(S(),d("div",$e,[l[23]||(l[23]=h("label",{class:"form-label"},"角色",-1)),p(X,{modelValue:s.value.role,"onUpdate:modelValue":l[6]||(l[6]=e=>s.value.role=e),options:te.value,placeholder:"请选择角色"},null,8,["modelValue","options"])])):y("",!0),h("div",Re,[l[24]||(l[24]=h("label",{class:"form-label"},"状态",-1)),p(X,{modelValue:s.value.status,"onUpdate:modelValue":l[7]||(l[7]=e=>s.value.status=e),options:se.value,placeholder:"请选择状态"},null,8,["modelValue","options"])])]),h("div",qe,[h("div",Le,[(S(!0),d(r,null,C(s.value.titles,(e,a)=>(S(),d("div",{key:a,class:"title-tag"},[h("span",null,k(e),1),h("button",{type:"button",class:"remove-title-btn",onClick:e=>(e=>{s.value.titles&&s.value.titles.splice(e,1)})(a)},[p(z,{icon:"mdi:close"})],8,je)]))),128)),h("div",Oe,[I(h("input",{"onUpdate:modelValue":l[8]||(l[8]=e=>V.value=e),type:"text",placeholder:"添加称号",class:"title-input",onKeyup:x(ie,["enter"])},null,544),[[w,V.value]]),h("button",{type:"button",class:"add-title-btn",onClick:ie,disabled:!V.value.trim()},[p(z,{icon:"mdi:plus"})],8,Ke)])])])]))]),h("div",Ge,[h("button",{class:"btn btn-outline",onClick:oe}," 取消 "),h("button",{class:"btn btn-primary",onClick:ue,disabled:e.loading}," 保存 ",8,We)])])])):y("",!0)]
|
||
var a}),_:1})])),p(b,{name:"preview-fade"},{default:g(()=>[q.value?(S(),d("div",{key:0,class:"avatar-preview-modal",onClick:l[11]||(l[11]=e=>q.value=!1)},[h("div",{class:"preview-content",onClick:l[10]||(l[10]=f(()=>{},["stop"]))},[h("img",{src:D.value||W.value,alt:"头像预览"},null,8,He),h("button",{class:"close-preview-btn",onClick:l[9]||(l[9]=e=>q.value=!1)},[p(z,{icon:"mdi:close"})])])])):y("",!0)]),_:1}),p(F,{toasts:_(j),onRemove:_(G)},null,8,["toasts","onRemove"])],64))}}),[["__scopeId","data-v-b683b3a3"]]),Qe={class:"input-dialog"},Ye={class:"dialog-header"},Xe={class:"dialog-title"},Ze={class:"dialog-body"},ea={key:0,class:"dialog-message"},aa={key:0,class:"field-group"},la={class:"group-title"},ta={key:0,class:"input-label"},sa=["onUpdate:modelValue","placeholder","required","rows"],na={key:3,class:"icon-upload-wrapper"},ia={key:0,class:"input-label icon-label"},ua=["onUpdate:modelValue","type","placeholder","required"],oa={key:0,class:"input-label"},ca=["onUpdate:modelValue","placeholder","required","rows"],da={key:3,class:"icon-upload-wrapper"},ra={key:0,class:"input-label icon-label"},va=["onUpdate:modelValue","type","placeholder","required"],pa={class:"dialog-actions"},ma=["disabled"],ba=q(s({__name:"InputDialog",props:{visible:{type:Boolean},title:{},message:{},fields:{},confirmText:{default:"确认"},cancelText:{default:"取消"}},emits:["confirm","cancel","close"],setup(e,{emit:a}){const l=e,t=a,s=n({}),o=n([]),_=n(null),T=u(()=>{const e={},a=[]
|
||
l.fields.forEach(l=>{l.group?(e[l.group]||(e[l.group]=[]),e[l.group].push(l)):a.push(l)})
|
||
const t=[]
|
||
return Object.entries(e).forEach(([e,a])=>{const l=a.some(e=>e.span&&e.span<12)
|
||
t.push({group:e,fields:a,hasGrid:l})}),a.length>0&&t.push({fields:a}),t}),E=e=>l.fields.findIndex(a=>{var l
|
||
return a.key===(null==(l=e[0])?void 0:l.key)}),N=e=>e.map(e=>({value:e.value,label:e.label,icon:D(e.value)||""})),D=e=>({user:"mdi:account",admin:"mdi:shield-account",qiuchenly:"mdi:shield-crown",active:"mdi:check-circle",locked:"mdi:lock",banned:"mdi:ban"}[e]||""),P=u(()=>l.fields.every(e=>{const a=s.value[e.key]||""
|
||
return!(e.required&&"icon"!==e.type&&!a.trim())&&!(e.required&&"icon"===e.type&&!a)&&(!e.validator||e.validator(a))})),M=()=>{const e={}
|
||
l.fields.forEach(a=>{e[a.key]=void 0!==a.value?a.value:a.defaultValue||""}),s.value=e}
|
||
i(()=>l.visible,e=>{e&&(M(),A(()=>{o.value[0]&&o.value[0].focus()}))}),i(()=>l.fields,()=>{l.visible&&M()},{deep:!0})
|
||
const B=()=>{P.value&&t("confirm",{...s.value})},F=()=>{t("cancel"),t("close")},$=e=>{_.value={x:e.clientX,y:e.clientY}},R=e=>{if(!_.value)return
|
||
const a=Math.abs(e.clientX-_.value.x),l=Math.abs(e.clientY-_.value.y)
|
||
Math.sqrt(a*a+l*l)<5&&F(),_.value=null}
|
||
return c(()=>{_.value=null}),(a,t)=>(S(),v(m,{to:"body"},[p(b,{name:"fade"},{default:g(()=>[e.visible?(S(),d("div",{key:0,class:"input-dialog-overlay",onMousedown:f($,["self"]),onMouseup:f(R,["self"])},[h("div",Qe,[h("div",Ye,[h("h3",Xe,k(e.title),1),h("button",{class:"close-btn",onClick:F,type:"button"},[p(z,{icon:"mdi:close"})])]),h("div",Ze,[e.message?(S(),d("p",ea,k(e.message),1)):y("",!0),(S(!0),d(r,null,C(T.value,(e,a)=>(S(),d(r,{key:a},[e.group?(S(),d("div",aa,[h("h4",la,k(e.group),1),h("div",{class:V(["group-content",{"grid-layout":e.hasGrid}])},[(S(!0),d(r,null,C(e.fields,(a,l)=>(S(),d("div",{key:a.key,class:V(["input-group",{"icon-field":"icon"===a.type,[`span-${a.span||12}`]:a.span,[`align-${a.align||"left"}`]:a.align}])},[a.label&&"icon"!==a.type?(S(),d("label",ta,k(a.label),1)):y("",!0),"select"===a.type?(S(),v(X,{key:1,modelValue:s.value[a.key],"onUpdate:modelValue":e=>s.value[a.key]=e,options:N(a.options||[]),placeholder:a.placeholder||"请选择",class:"input-select"},null,8,["modelValue","onUpdate:modelValue","options","placeholder"])):"textarea"===a.type?I((S(),d("textarea",{key:2,"onUpdate:modelValue":e=>s.value[a.key]=e,placeholder:a.placeholder,required:a.required,class:"input-field textarea-field",rows:a.rows||4,onKeyup:x(F,["esc"]),ref_for:!0,ref:a=>{a&&E(e.fields)===l&&(o.value[0]=a)}},null,40,sa)),[[w,s.value[a.key]]]):"icon"===a.type?(S(),d("div",na,[a.label?(S(),d("label",ia,k(a.label),1)):y("",!0),p(Z,{modelValue:s.value[a.key],"onUpdate:modelValue":e=>s.value[a.key]=e,size:80,onChange:e=>{s.value[a.key]=e}},null,8,["modelValue","onUpdate:modelValue","onChange"])])):I((S(),d("input",{key:4,"onUpdate:modelValue":e=>s.value[a.key]=e,type:a.type||"text",placeholder:a.placeholder,required:a.required,class:"input-field",onKeyup:[x(B,["enter"]),x(F,["esc"])],ref_for:!0,ref:a=>{a&&E(e.fields)===l&&(o.value[0]=a)}},null,40,ua)),[[U,s.value[a.key]]])],2))),128))],2)])):(S(!0),d(r,{key:1},C(e.fields,e=>(S(),d("div",{key:e.key,class:V(["input-group",{"icon-field":"icon"===e.type,[`align-${e.align||"left"}`]:e.align}])},[e.label&&"icon"!==e.type?(S(),d("label",oa,k(e.label),1)):y("",!0),"select"===e.type?(S(),v(X,{key:1,modelValue:s.value[e.key],"onUpdate:modelValue":a=>s.value[e.key]=a,options:N(e.options||[]),placeholder:e.placeholder||"请选择",class:"input-select"},null,8,["modelValue","onUpdate:modelValue","options","placeholder"])):"textarea"===e.type?I((S(),d("textarea",{key:2,"onUpdate:modelValue":a=>s.value[e.key]=a,placeholder:e.placeholder,required:e.required,class:"input-field textarea-field",rows:e.rows||4,onKeyup:x(F,["esc"]),ref_for:!0,ref:a=>{a&&0===l.fields.findIndex(a=>a.key===e.key)&&(o.value[0]=a)}},null,40,ca)),[[w,s.value[e.key]]]):"icon"===e.type?(S(),d("div",da,[e.label?(S(),d("label",ra,k(e.label),1)):y("",!0),p(Z,{modelValue:s.value[e.key],"onUpdate:modelValue":a=>s.value[e.key]=a,size:80,onChange:a=>{s.value[e.key]=a}},null,8,["modelValue","onUpdate:modelValue","onChange"])])):I((S(),d("input",{key:4,"onUpdate:modelValue":a=>s.value[e.key]=a,type:e.type||"text",placeholder:e.placeholder,required:e.required,class:"input-field",onKeyup:[x(B,["enter"]),x(F,["esc"])],ref_for:!0,ref:a=>{a&&0===l.fields.findIndex(a=>a.key===e.key)&&(o.value[0]=a)}},null,40,va)),[[U,s.value[e.key]]])],2))),128))],64))),128))]),h("div",pa,[e.cancelText?(S(),d("button",{key:0,class:"btn btn-outline",onClick:F},k(e.cancelText),1)):y("",!0),h("button",{class:"btn btn-primary",onClick:B,disabled:!P.value},k(e.confirmText),9,ma)])])],32)):y("",!0)]),_:1})]))}}),[["__scopeId","data-v-31c676a4"]]),ga={class:"users-management"},ya={class:"section-header"},fa={class:"header-actions"},ha={class:"table-container"},ka={key:0,class:"loading-state"},Ia={key:1,class:"error-state"},wa={class:"data-table"},Ca={key:0},xa={colspan:"8",class:"empty-state"},_a={class:"action-buttons"},Sa=["onClick"],Aa=["onClick"],Va=["onClick"],Ua=["onClick"],Ta=["onClick"],Ea=["onClick"],Na=["onClick"],Da=["onClick"],Pa=["onClick"],Ma=q(s({__name:"UsersManagement",setup(e){const{toasts:a,success:l,error:t,removeToast:s}=B(),i=L(),c=function(){const e=n(!1),a=n({title:"",fields:[],confirmText:"确认",cancelText:"取消"})
|
||
let l=null
|
||
return{visible:u(()=>e.value),config:u(()=>a.value),show:t=>(a.value={...a.value,...t},e.value=!0,new Promise(e=>{l=e})),handleConfirm:a=>{e.value=!1,l&&(l(a),l=null)},handleCancel:()=>{e.value=!1,l&&(l(null),l=null)}}}(),{isQiuChenLy:v}=j(),m=n(""),b=n([]),g=n(!1),f=n(""),x=n(1),A=n(20),U=n(0),E=u(()=>Math.ceil(U.value/A.value)),N=n(!1),D=n(null),P=n(!1),M=u(()=>b.value)
|
||
let R=null
|
||
const q=()=>{R&&clearTimeout(R),R=setTimeout(()=>{x.value=1,H()},500)},K=e=>{x.value=e,H()},G=e=>{switch(e){case"admin":return"管理员"
|
||
case"qiuchenly":return"超级管理员"
|
||
default:return"用户"}},W=e=>{switch(e){case"active":return"正常"
|
||
case"locked":return"锁定"
|
||
case"banned":return"封禁"
|
||
case"deleted":return"已删除"
|
||
default:return e}},H=async()=>{g.value=!0,f.value=""
|
||
try{const e=await $.getUsers(x.value,A.value,m.value||void 0)
|
||
e.users&&Array.isArray(e.users)?(b.value=e.users.map(e=>{var a
|
||
return{id:e.id||e._id||(null==(a=e._id)?void 0:a.toString()),username:e.username,nickName:e.nickName,email:e.email,avatar:e.avatar||"",role:e.role||(e.roleWeight>=9999?"qiuchenly":e.roleWeight>=90?"admin":"user"),roleWeight:e.roleWeight,status:e.status||"active",gender:e.gender||"unknown",age:e.age||0,exp:e.exp||0,level:e.level||0,titles:e.titles||[],createdAt:e.createdAt}}),U.value=e.total||0):f.value="加载用户列表失败"}catch(e){f.value=e.message||"加载用户列表失败",t(e.message||"加载用户列表失败",3e3)}finally{g.value=!1}},J=async()=>{var e,a
|
||
const s=await c.show({title:"添加用户",message:"请填写用户信息",fields:[{key:"username",label:"用户名",placeholder:"请输入用户名",type:"text",required:!0},{key:"password",label:"密码",placeholder:"请输入密码",type:"password",required:!0},{key:"email",label:"邮箱",placeholder:"请输入邮箱(可选)",type:"email",required:!1},{key:"nickName",label:"昵称",placeholder:"请输入昵称(可选)",type:"text",required:!1},{key:"role",label:"角色",type:"select",required:!1,defaultValue:"user",options:[{label:"普通用户",value:"user"},...v.value?[{label:"管理员",value:"admin"}]:[]]}]})
|
||
if(s)try{const e=await $.addUser({username:s.username,password:s.password,email:s.email||void 0,nickName:s.nickName||void 0,role:"admin"===s.role?"admin":void 0})
|
||
if(e.success)l("添加用户成功",2e3),H()
|
||
else{const a=e.message||"添加用户失败"
|
||
t(a,3e3)}}catch(n){const l=(null==(a=null==(e=n.response)?void 0:e.data)?void 0:a.message)||n.message||"添加用户失败"
|
||
t(l,3e3)}},Q=async e=>{var a,s,n,i,u,o
|
||
if(D.value){P.value=!0
|
||
try{const u={}
|
||
if(void 0!==e.nickName&&(u.nickName=e.nickName),void 0!==e.email&&(u.email=e.email),void 0!==e.avatar&&(u.avatar=e.avatar),void 0!==e.gender&&(u.gender=e.gender),void 0!==e.age&&(u.age=e.age),void 0!==e.exp&&(u.exp=e.exp),void 0!==e.level&&(u.level=e.level),void 0!==e.titles&&(u.titles=e.titles),void 0!==e.status){const l={active:"active",locked:"locked",banned:"banned"}[e.status]||e.status
|
||
try{await $.setUserStatus(D.value.username,l)}catch(c){const e=(null==(s=null==(a=c.response)?void 0:a.data)?void 0:s.message)||c.message||"更新用户状态失败"
|
||
t(e,3e3)}}if(void 0!==e.role&&v.value)try{await $.upgradeUserRole(D.value.username,e.role)}catch(c){const e=(null==(i=null==(n=c.response)?void 0:n.data)?void 0:i.message)||c.message||"更新用户角色失败"
|
||
t(e,3e3)}if(Object.keys(u).length>0){const e=await $.updateUser(D.value.id,u)
|
||
if(e.success)l("更新用户成功",2e3),H(),N.value=!1,D.value=null
|
||
else{const a=e.message||"更新用户失败"
|
||
t(a,3e3)}}else l("更新用户成功",2e3),H(),N.value=!1,D.value=null}catch(c){const e=(null==(o=null==(u=c.response)?void 0:u.data)?void 0:o.message)||c.message||"更新用户失败"
|
||
t(e,3e3)}finally{P.value=!1}}},Y=()=>{N.value=!1,D.value=null}
|
||
return o(()=>{H()}),(e,n)=>(S(),d("div",ga,[h("div",ya,[n[3]||(n[3]=h("h2",null,"用户管理",-1)),h("div",fa,[I(h("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>m.value=e),type:"text",placeholder:"搜索用户...",class:"search-input",onInput:q},null,544),[[w,m.value]]),h("button",{class:"btn btn-primary",onClick:J},[p(z,{icon:"mdi:plus",class:"btn-icon"}),n[2]||(n[2]=T(" 添加用户 ",-1))])])]),h("div",ha,[g.value?(S(),d("div",ka,[...n[4]||(n[4]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):f.value?(S(),d("div",Ia,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(f.value),1),h("button",{class:"btn btn-primary",onClick:H},"重试")])):(S(),d(r,{key:2},[h("table",wa,[n[6]||(n[6]=h("thead",null,[h("tr",null,[h("th",null,"ID"),h("th",null,"用户名"),h("th",null,"昵称"),h("th",null,"邮箱"),h("th",null,"角色"),h("th",null,"注册时间"),h("th",null,"状态"),h("th",null,"操作")])],-1)),h("tbody",null,[0===M.value.length?(S(),d("tr",Ca,[h("td",xa,[p(z,{icon:"mdi:account-off"}),n[5]||(n[5]=h("p",null,"暂无用户数据",-1))])])):y("",!0),(S(!0),d(r,null,C(M.value,e=>{return S(),d("tr",{key:e.id},[h("td",null,k(e.id),1),h("td",null,k(e.username),1),h("td",null,k(e.nickName||"-"),1),h("td",null,k(e.email||"-"),1),h("td",null,[h("span",{class:V(["role-badge",e.role])},k(G(e.role)),3)]),h("td",null,k((a=e.createdAt,new Date(a).toLocaleString("zh-CN"))),1),h("td",null,[h("span",{class:V(["status-badge",e.status])},k(W(e.status)),3)]),h("td",null,[h("div",_a,[h("button",{class:"action-btn edit",onClick:a=>(async e=>{D.value={id:e.id,username:e.username,nickName:e.nickName,email:e.email,avatar:e.avatar||"",role:e.role,roleWeight:e.roleWeight,status:e.status,gender:e.gender||"unknown",age:e.age||0,exp:e.exp||0,level:e.level||0,titles:e.titles||[],createdAt:e.createdAt},N.value=!0})(e),title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,Sa),h("button",{class:"action-btn delete",onClick:a=>(async e=>{var a,s
|
||
if(await i.show({title:"删除用户",message:`确定要删除用户 ${e.username} 吗?此操作不可恢复!`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const a=await $.deleteUser(e.username)
|
||
if(a.success)l("删除用户成功",2e3),H()
|
||
else{const e=a.message||"删除用户失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"删除用户失败"
|
||
t(e,3e3)}})(e),title:"删除"},[p(z,{icon:"mdi:delete"})],8,Aa),"active"===e.status?(S(),d("button",{key:0,class:"action-btn lock",onClick:a=>(async e=>{var a,s
|
||
if(await i.show({title:"锁定用户",message:`确定要锁定用户 ${e.username} 吗?锁定后用户将无法发表评论、点赞、收藏、分享等操作。`,type:"warning",confirmText:"锁定",cancelText:"取消"}))try{const a=await $.setUserStatus(e.username,"locked")
|
||
if(a.success)l("锁定用户成功",2e3),H()
|
||
else{const e=a.message||"锁定用户失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"锁定用户失败"
|
||
t(e,3e3)}})(e),title:"锁定"},[p(z,{icon:"mdi:lock"})],8,Va)):"locked"===e.status?(S(),d("button",{key:1,class:"action-btn unlock",onClick:a=>(async e=>{var a,s
|
||
try{const a=await $.setUserStatus(e.username,"active")
|
||
if(a.success)l("解除锁定成功",2e3),H()
|
||
else{const e=a.message||"解除锁定失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"解除锁定失败"
|
||
t(e,3e3)}})(e),title:"解除锁定"},[p(z,{icon:"mdi:lock-open"})],8,Ua)):y("",!0),"active"===e.status||"locked"===e.status?(S(),d("button",{key:2,class:"action-btn ban",onClick:a=>(async e=>{var a,s
|
||
if(await i.show({title:"封禁用户",message:`确定要封禁用户 ${e.username} 吗?封禁后用户将无法登录,无法访问任何API接口。`,type:"danger",confirmText:"封禁",cancelText:"取消"}))try{const a=await $.setUserStatus(e.username,"banned")
|
||
if(a.success)l("封禁用户成功",2e3),H()
|
||
else{const e=a.message||"封禁用户失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"封禁用户失败"
|
||
t(e,3e3)}})(e),title:"封禁"},[p(z,{icon:"mdi:ban"})],8,Ta)):y("",!0),"banned"===e.status?(S(),d("button",{key:3,class:"action-btn unban",onClick:a=>(async e=>{var a,s
|
||
try{const a=await $.setUserStatus(e.username,"active")
|
||
if(a.success)l("解除封禁成功",2e3),H()
|
||
else{const e=a.message||"解除封禁失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"解除封禁失败"
|
||
t(e,3e3)}})(e),title:"解除封禁"},[p(z,{icon:"mdi:check-circle"})],8,Ea)):y("",!0),_(v)&&"user"===e.role?(S(),d("button",{key:4,class:"action-btn upgrade",onClick:a=>(async e=>{var a,s
|
||
if(await i.show({title:"提升用户权限",message:`确定要将用户 ${e.username} 提升为管理员吗?`,type:"warning",confirmText:"提升",cancelText:"取消"}))try{const a=await $.upgradeUserRole(e.username,"admin")
|
||
if(a.success)l("提升用户权限成功",2e3),H()
|
||
else{const e=a.message||"提升用户权限失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"提升用户权限失败"
|
||
t(e,3e3)}})(e),title:"提升为管理员"},[p(z,{icon:"mdi:arrow-up-circle"})],8,Na)):y("",!0),_(v)&&"admin"===e.role?(S(),d("button",{key:5,class:"action-btn downgrade",onClick:a=>(async e=>{var a,s
|
||
if(await i.show({title:"降级用户权限",message:`确定要将管理员 ${e.username} 降级为普通用户吗?`,type:"warning",confirmText:"降级",cancelText:"取消"}))try{const a=await $.upgradeUserRole(e.username,"user")
|
||
if(a.success)l("降级用户权限成功",2e3),H()
|
||
else{const e=a.message||"降级用户权限失败"
|
||
t(e,3e3)}}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"降级用户权限失败"
|
||
t(e,3e3)}})(e),title:"降级为普通用户"},[p(z,{icon:"mdi:arrow-down-circle"})],8,Da)):y("",!0),h("button",{class:"action-btn password",onClick:a=>(async e=>{var a,s
|
||
const n=await c.show({title:"修改用户密码",message:`为用户 ${e.username} 设置新密码`,fields:[{key:"newPassword",label:"新密码",placeholder:"请输入新密码(至少6个字符)",type:"password",required:!0},{key:"confirmPassword",label:"确认密码",placeholder:"请再次输入新密码",type:"password",required:!0}]})
|
||
if(n)if(!n.newPassword||n.newPassword.length<6)t("密码长度至少6个字符",3e3)
|
||
else if(n.newPassword===n.confirmPassword)try{const a=await $.adminChangeUserPassword(e.id,n.newPassword)
|
||
if(a.success)l("修改密码成功",2e3)
|
||
else{const e=a.message||"修改密码失败"
|
||
t(e,3e3)}}catch(i){const e=(null==(s=null==(a=i.response)?void 0:a.data)?void 0:s.message)||i.message||"修改密码失败"
|
||
t(e,3e3)}else t("两次输入的密码不一致",3e3)})(e),title:"修改密码"},[p(z,{icon:"mdi:key"})],8,Pa)])])])
|
||
var a}),128))])]),p(ee,{"current-page":x.value,"total-pages":E.value,total:U.value,onPageChange:K},null,8,["current-page","total-pages","total"])],64))]),p(Je,{visible:N.value,"onUpdate:visible":n[1]||(n[1]=e=>N.value=e),userData:D.value,loading:P.value,onConfirm:Q,onCancel:Y},null,8,["visible","userData","loading"]),p(ba,{visible:_(c).visible.value,title:_(c).config.value.title,message:_(c).config.value.message,fields:_(c).config.value.fields,"confirm-text":_(c).config.value.confirmText,"cancel-text":_(c).config.value.cancelText,onConfirm:_(c).handleConfirm,onCancel:_(c).handleCancel},null,8,["visible","title","message","fields","confirm-text","cancel-text","onConfirm","onCancel"]),p(O,{visible:_(i).visible.value,title:_(i).config.value.title||"",message:_(i).config.value.message||"",type:"danger"===_(i).config.value.type?"error":_(i).config.value.type||"warning","confirm-text":_(i).config.value.confirmText,"cancel-text":_(i).config.value.cancelText,onConfirm:_(i).handleConfirm,onCancel:_(i).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"]),p(F,{toasts:_(a),onRemove:_(s)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-99845269"]]),Ba={class:"posts-management"},za={class:"section-header"},Fa={class:"header-actions"},$a={class:"table-container"},Ra={key:0,class:"loading-state"},qa={key:1,class:"error-state"},La={class:"data-table"},ja={key:0},Oa={colspan:"8",class:"empty-state"},Ka={class:"post-title-cell"},Ga={class:"post-title"},Wa={class:"status-cell"},Ha={key:0,class:"status-badge locked",title:"已锁定"},Ja={class:"action-buttons"},Qa=["onClick"],Ya=["onClick"],Xa=["onClick"],Za=["onClick"],el=["onClick"],al=q(s({__name:"PostsManagement",setup(e){const a=E(),{success:l,error:t}=B(),s=L(),c=K(),m=n(""),b=n("all"),g=n([]),f=n(!1),x=n(""),A=n(1),U=n(20),T=n(0),N=u(()=>Math.ceil(T.value/U.value)),D=n(!1),P=n(null),M=n(!1),F=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"normal",label:"正常",icon:"fluent-color:checkmark-circle-24"},{value:"deleted",label:"已删除",icon:"fluent-color:cloud-dismiss-48"}],R=u(()=>g.value),q=e=>{switch(e){case"reported":return"已举报"
|
||
case"deleted":return"已删除"
|
||
default:return"正常"}}
|
||
let j=null
|
||
const G=()=>{j&&clearTimeout(j),j=setTimeout(()=>{A.value=1,W()},500)}
|
||
i(b,()=>{A.value=1,W()})
|
||
const W=async()=>{var e,a
|
||
f.value=!0,x.value=""
|
||
try{const e=await $.getAdminPosts(A.value,U.value,m.value||void 0,b.value)
|
||
e.success&&e.data?(g.value=e.data.posts.map(e=>{var a
|
||
return{id:e.id,title:e.title,author:"string"==typeof e.author?e.author:(null==(a=e.author)?void 0:a.name)||"-",forumName:e.forumName||e.bundleId||"-",bundleId:e.bundleId,content:e.content,attachments:e.attachments||[],replyCount:e.replyCount||0,publishTime:e.publishTime,status:e.deletedAt?"deleted":e.status||"normal",locked:!0===e.locked}}),T.value=e.data.total):x.value=e.message||"加载帖子列表失败"}catch(l){x.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"加载帖子列表失败"}finally{f.value=!1}},H=async e=>{var a,s
|
||
if(P.value){c.show("保存中...")
|
||
try{const a=await $.updateAdminPost(P.value.id,e.title,e.content,e.attachmentIds)
|
||
a.success?(l("编辑帖子成功",2e3),await W(),D.value=!1,P.value=null):t(a.message||"编辑帖子失败",3e3)}catch(n){t((null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"编辑帖子失败",3e3)}finally{c.hide()}}},J=()=>{D.value=!1,P.value=null},Q=e=>{A.value=e,W()}
|
||
return o(()=>{W()}),(e,n)=>(S(),d("div",Ba,[h("div",za,[n[3]||(n[3]=h("h2",null,"帖子管理",-1)),h("div",Fa,[I(h("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>m.value=e),type:"text",placeholder:"搜索帖子...",class:"search-input",onInput:G},null,544),[[w,m.value]]),p(X,{modelValue:b.value,"onUpdate:modelValue":n[1]||(n[1]=e=>b.value=e),options:F},null,8,["modelValue"])])]),h("div",$a,[f.value?(S(),d("div",Ra,[...n[4]||(n[4]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):x.value?(S(),d("div",qa,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(x.value),1),h("button",{class:"btn btn-primary",onClick:W},"重试")])):(S(),d(r,{key:2},[h("table",La,[n[6]||(n[6]=h("thead",null,[h("tr",null,[h("th",null,"ID"),h("th",null,"标题"),h("th",null,"作者"),h("th",null,"板块"),h("th",null,"回复数"),h("th",null,"发布时间"),h("th",null,"状态"),h("th",null,"操作")])],-1)),h("tbody",null,[0===R.value.length?(S(),d("tr",ja,[h("td",Oa,[p(z,{icon:"mdi:file-document-outline"}),n[5]||(n[5]=h("p",null,"暂无帖子数据",-1))])])):y("",!0),(S(!0),d(r,null,C(R.value,e=>{var n,i
|
||
return S(),d("tr",{key:e.id},[h("td",null,k(e.id),1),h("td",Ka,[h("span",Ga,k(e.title),1)]),h("td",null,k("string"==typeof e.author?e.author:(null==(n=e.author)?void 0:n.name)||"-"),1),h("td",null,k(e.forumName),1),h("td",null,k(e.replyCount),1),h("td",null,k((i=e.publishTime,new Date(i).toLocaleString("zh-CN"))),1),h("td",null,[h("div",Wa,[h("span",{class:V(["status-badge",e.status])},k(q(e.status)),3),e.locked?(S(),d("span",Ha," 已锁定 ")):y("",!0)])]),h("td",null,[h("div",Ja,[h("button",{class:"action-btn view",onClick:l=>(e=>{e.bundleId?a.push(`/discussion/${e.bundleId}/post/${e.id}`):a.push("/discussion")})(e),title:"查看"},[p(z,{icon:"mdi:eye"})],8,Qa),h("button",{class:"action-btn edit",onClick:a=>(async e=>{var a,l
|
||
if(P.value={id:e.id,bundleId:e.bundleId,title:e.title,content:e.content||"",attachments:e.attachments||[],author:"string"==typeof e.author?{id:"",name:e.author}:e.author},D.value=!0,M.value=!0,e.bundleId)try{const a=await $.getForumPost(e.bundleId,e.id,1,1)
|
||
a&&(P.value={id:e.id,bundleId:e.bundleId,title:a.title||e.title,content:a.content||e.content||"",attachments:a.attachments||[],author:a.author||("string"==typeof e.author?{id:"",name:e.author}:e.author)})}catch(s){t("获取帖子详情失败: "+((null==(l=null==(a=s.response)?void 0:a.data)?void 0:l.message)||s.message||"未知错误"),3e3)}finally{M.value=!1}else M.value=!1})(e),title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,Ya),e.locked?(S(),d("button",{key:1,class:"action-btn unlock",onClick:a=>(async e=>{var a,s
|
||
c.show("解锁中...")
|
||
try{const a=await $.lockAdminPost(e.id,!1)
|
||
a.success?(l("解锁帖子成功",2e3),await W()):t(a.message||"解锁帖子失败",3e3)}catch(n){t((null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"解锁帖子失败",3e3)}finally{c.hide()}})(e),title:"解锁帖子"},[p(z,{icon:"mdi:lock-open"})],8,Za)):(S(),d("button",{key:0,class:"action-btn lock",onClick:a=>(async e=>{var a,n
|
||
if(await s.show({title:"锁定帖子",message:`确定要锁定帖子 "${e.title}" 吗?锁定后用户将无法查看该帖子。`,type:"warning",confirmText:"锁定",cancelText:"取消"})){c.show("锁定中...")
|
||
try{const a=await $.lockAdminPost(e.id,!0)
|
||
a.success?(l("锁定帖子成功",2e3),await W()):t(a.message||"锁定帖子失败",3e3)}catch(i){t((null==(n=null==(a=i.response)?void 0:a.data)?void 0:n.message)||i.message||"锁定帖子失败",3e3)}finally{c.hide()}}})(e),title:"锁定帖子"},[p(z,{icon:"mdi:lock"})],8,Xa)),h("button",{class:"action-btn delete",onClick:a=>(async e=>{var a,n
|
||
if(await s.show({title:"删除帖子",message:`确定要删除帖子 "${e.title}" 吗?`,type:"danger",confirmText:"删除",cancelText:"取消"})){c.show("删除中...")
|
||
try{const a=await $.deleteAdminPost(e.id)
|
||
a.success?(l("删除帖子成功",2e3),await W()):t(a.message||"删除帖子失败",3e3)}catch(i){t((null==(n=null==(a=i.response)?void 0:a.data)?void 0:n.message)||i.message||"删除帖子失败",3e3)}finally{c.hide()}}})(e),title:"删除"},[p(z,{icon:"mdi:delete"})],8,el)])])])}),128))])]),N.value>1?(S(),v(ee,{key:0,"current-page":A.value,"total-pages":N.value,total:T.value,onPageChange:Q},null,8,["current-page","total-pages","total"])):y("",!0)],64))]),p(ae,{visible:D.value,"onUpdate:visible":n[2]||(n[2]=e=>D.value=e),postData:P.value,loading:M.value,onConfirm:H,onCancel:J},null,8,["visible","postData","loading"]),p(O,{visible:_(s).visible.value,title:_(s).config.value.title||"",message:_(s).config.value.message||"",type:"danger"===_(s).config.value.type?"error":_(s).config.value.type||"warning","confirm-text":_(s).config.value.confirmText,"cancel-text":_(s).config.value.cancelText,onConfirm:_(s).handleConfirm,onCancel:_(s).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"])]))}}),[["__scopeId","data-v-dee2ffee"]]),ll={class:"violations-management"},tl={class:"section-header"},sl={class:"header-actions"},nl={class:"violations-list"},il={key:0,class:"loading-state"},ul={key:1,class:"error-state"},ol={key:0,class:"empty-state"},cl={class:"violation-header"},dl={class:"violation-info"},rl={class:"violation-type"},vl={class:"violation-id"},pl={class:"violation-time"},ml={class:"violation-content"},bl={class:"violation-details"},gl={class:"detail-row"},yl={class:"detail-value"},fl={key:0,class:"detail-row"},hl={class:"detail-value"},kl={class:"detail-row"},Il={class:"report-types-tags"},wl={class:"detail-row"},Cl={class:"detail-content"},xl={key:1,class:"detail-row"},_l={class:"detail-content"},Sl={key:0,class:"violation-actions"},Al=["onClick"],Vl=["onClick"],Ul=q(s({__name:"ViolationsManagement",setup(e,{expose:a}){const{success:l,error:t}=B(),s=L(),c=K(),m=n("all"),b=n([]),g=n(!1),f=n(""),I=n(1),w=n(20),x=n(0),A=u(()=>Math.ceil(x.value/w.value)),U=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"pending",label:"待处理",icon:"fluent-color:clock-24"},{value:"resolved",label:"已处理",icon:"fluent-color:checkmark-circle-24"},{value:"rejected",label:"已驳回",icon:"fluent-color:dismiss-circle-24"}],E=u(()=>b.value),N=e=>{switch(e){case"post":return"帖子"
|
||
case"reply":return"回复"
|
||
case"nestedReply":return"楼中楼"
|
||
default:return e}},D=e=>{switch(e){case"pending":return"待处理"
|
||
case"resolved":return"已处理"
|
||
case"rejected":return"已驳回"
|
||
default:return e}},P=e=>{var a
|
||
return e?"string"==typeof e?e:"object"==typeof e&&(e.name||e.id||(null==(a=e._id)?void 0:a.toString()))||"-":"-"},M=e=>{var a
|
||
return e?"string"==typeof e?null:"object"==typeof e&&(e.id||(null==(a=e._id)?void 0:a.toString()))||null:null}
|
||
i(m,()=>{I.value=1,F()})
|
||
const F=async()=>{var e,a
|
||
g.value=!0,f.value=""
|
||
try{const e=await $.getAdminViolations(I.value,w.value,m.value)
|
||
e.success&&e.data?(b.value=e.data.violations.map(e=>({id:e.id,type:e.type,reportedUser:e.reportedUser||e.reporterNickname||"-",reportTypes:e.reportTypes||[],content:e.content||"-",comment:e.comment,reportTime:e.reportTime,status:e.status||"pending"})),x.value=e.data.total):f.value=e.message||"加载违规列表失败"}catch(l){f.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"加载违规列表失败"}finally{g.value=!1}},R=async(e,a)=>{var n,i
|
||
const u="resolved"===a?"确认违规":"驳回举报"
|
||
if(await s.show({title:u,message:`确定要${u}吗?`,type:"resolved"===a?"warning":"info",confirmText:u,cancelText:"取消"})){c.show("处理中...")
|
||
try{const s=await $.resolveViolation(e.id,a)
|
||
s.success?(l(`${u}成功`,2e3),await F(),window.dispatchEvent(new CustomEvent("system-notifications-changed"))):t(s.message||`${u}失败`,3e3)}catch(o){t((null==(i=null==(n=o.response)?void 0:n.data)?void 0:i.message)||o.message||`${u}失败`,3e3)}finally{c.hide()}}}
|
||
a({loadPendingViolationsCount:async()=>{try{const e=await $.getAdminViolations(1,1,"pending")
|
||
if(e.success&&e.data)return e.data.total||0}catch(e){}return 0}})
|
||
const q=e=>{I.value=e,F()}
|
||
return o(()=>{F()}),(e,a)=>(S(),d("div",ll,[h("div",tl,[a[1]||(a[1]=h("h2",null,"违规处理",-1)),h("div",sl,[p(X,{modelValue:m.value,"onUpdate:modelValue":a[0]||(a[0]=e=>m.value=e),options:U},null,8,["modelValue"])])]),h("div",nl,[g.value?(S(),d("div",il,[...a[2]||(a[2]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):f.value?(S(),d("div",ul,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(f.value),1),h("button",{class:"btn btn-primary",onClick:F},"重试")])):(S(),d(r,{key:2},[0===E.value.length?(S(),d("div",ol,[p(z,{icon:"mdi:shield-check"}),a[3]||(a[3]=h("p",null,"暂无违规记录",-1))])):y("",!0),(S(!0),d(r,null,C(E.value,e=>{return S(),d("div",{key:e.id,class:"violation-item"},[h("div",cl,[h("div",dl,[h("span",rl,k(N(e.type)),1),h("span",vl,"#"+k(e.id),1),h("span",pl,k((l=e.reportTime,new Date(l).toLocaleString("zh-CN"))),1)]),h("span",{class:V(["violation-status",e.status])},k(D(e.status)),3)]),h("div",ml,[h("div",bl,[h("div",gl,[a[4]||(a[4]=h("span",{class:"detail-label"},"被举报人:",-1)),h("span",yl,k(P(e.reportedUser)),1)]),M(e.reportedUser)?(S(),d("div",fl,[a[5]||(a[5]=h("span",{class:"detail-label"},"用户ID:",-1)),h("span",hl,[h("code",null,k(M(e.reportedUser)),1)])])):y("",!0),h("div",kl,[a[6]||(a[6]=h("span",{class:"detail-label"},"举报类型:",-1)),h("div",Il,[(S(!0),d(r,null,C(e.reportTypes,e=>(S(),d("span",{key:e,class:V(["report-type-tag",_(le)(e)])},k(_(te)(e)),3))),128))])]),h("div",wl,[a[7]||(a[7]=h("span",{class:"detail-label"},"被举报内容:",-1)),h("div",Cl,k(e.content),1)]),e.comment?(S(),d("div",xl,[a[8]||(a[8]=h("span",{class:"detail-label"},"补充说明:",-1)),h("div",_l,k(e.comment),1)])):y("",!0)]),"pending"===e.status?(S(),d("div",Sl,[h("button",{class:"btn btn-danger",onClick:a=>R(e,"resolved")},[p(z,{icon:"mdi:check",class:"btn-icon"}),a[9]||(a[9]=T(" 确认违规 ",-1))],8,Al),h("button",{class:"btn btn-secondary",onClick:a=>R(e,"rejected")},[p(z,{icon:"mdi:close",class:"btn-icon"}),a[10]||(a[10]=T(" 驳回举报 ",-1))],8,Vl)])):y("",!0)])])
|
||
var l}),128)),A.value>1?(S(),v(ee,{key:1,"current-page":I.value,"total-pages":A.value,total:x.value,onPageChange:q},null,8,["current-page","total-pages","total"])):y("",!0)],64))]),p(O,{visible:_(s).visible.value,title:_(s).config.value.title||"",message:_(s).config.value.message||"",type:"danger"===_(s).config.value.type?"error":_(s).config.value.type||"warning","confirm-text":_(s).config.value.confirmText,"cancel-text":_(s).config.value.cancelText,onConfirm:_(s).handleConfirm,onCancel:_(s).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"])]))}}),[["__scopeId","data-v-b0de3444"]]),Tl={class:"issues-management"},El={class:"filter-select"},Nl={class:"issues-list"},Dl={key:0,class:"loading-state"},Pl={key:1,class:"error-state"},Ml={key:0,class:"empty-state"},Bl={class:"violation-header"},zl={class:"violation-info"},Fl={class:"violation-id"},$l={class:"violation-time"},Rl={class:"violation-content"},ql={class:"violation-details"},Ll={class:"detail-row"},jl={class:"detail-value-with-icon"},Ol=["src","alt"],Kl={key:1,class:"app-icon-placeholder-small"},Gl={class:"detail-row"},Wl={class:"detail-value"},Hl={class:"detail-row"},Jl={class:"detail-row"},Ql={class:"detail-value"},Yl={class:"detail-row"},Xl={class:"detail-value"},Zl={class:"detail-row"},et={class:"detail-value"},at={class:"detail-row"},lt={class:"detail-content"},tt={key:0,class:"detail-row"},st={key:1,class:"detail-row"},nt={class:"attachments-list"},it=["onClick"],ut={class:"attachment-name"},ot={key:2,class:"detail-row"},ct={class:"detail-content"},dt={key:3,class:"detail-row"},rt={class:"detail-value"},vt={key:0,class:"violation-actions"},pt=["onClick"],mt=["onClick"],bt=q(s({__name:"IssuesManagement",setup(e){const{success:a,error:l}=B(),t=K(),s=n("all"),c=n([]),m=n(!1),b=n(""),g=n(1),f=n(20),I=n(0),w=u(()=>Math.ceil(I.value/f.value)),x=n(!1),_=n(null),A=n(""),U=n("resolved"),E=n(new Map),N=n(new Map),D=n([]),P=n(0),M=n(!1),F=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"pending",label:"待处理",icon:"fluent-color:clock-24"},{value:"resolved",label:"已解决",icon:"fluent-color:checkmark-circle-24"},{value:"rejected",label:"已驳回",icon:"fluent-color:dismiss-circle-24"}],R=u(()=>c.value),q=e=>new Date(e).toLocaleString("zh-CN"),L=e=>{switch(e){case"crash":return"打开崩溃"
|
||
case"crack_failed":return"破解失效"
|
||
case"update_request":return"请求更新"
|
||
case"unexpected_error":return"意外错误"
|
||
default:return e}},j=e=>{switch(e){case"pending":return"待处理"
|
||
case"resolved":return"已解决"
|
||
case"rejected":return"已驳回"
|
||
default:return e}},O=e=>{var a,l
|
||
return"string"==typeof e?e:e&&"object"==typeof e?(null==(a=e._id)?void 0:a.toString())||(null==(l=e.id)?void 0:l.toString())||e.toString():String(e)},G=e=>E.value.get(e),W=e=>e.screenshotAttachmentIds&&0!==e.screenshotAttachmentIds.length?e.screenshotAttachmentIds.map(e=>O(e)):[],H=()=>{M.value=!1,D.value=[]}
|
||
i(s,()=>{g.value=1,J()})
|
||
const J=async()=>{var e,a
|
||
m.value=!0,b.value=""
|
||
try{const e=await $.getAdminIssues(g.value,f.value,s.value)
|
||
if(e.success&&e.data){c.value=e.data.issues||[],I.value=e.data.total||0
|
||
for(const e of c.value){if(e.appIconId&&!E.value.has(e.id))try{const a=await $.getIcon(e.appIconId,80,128,128)
|
||
E.value.set(e.id,a)}catch(l){}if(e.screenshotAttachmentIds&&e.screenshotAttachmentIds.length>0){const a=new Map
|
||
for(const t of e.screenshotAttachmentIds){const e=O(t)
|
||
try{const l=await $.getAttachmentImage(e)
|
||
l&&a.set(e,l)}catch(l){}}a.size>0&&N.value.set(e.id,a)}}}else b.value=e.message||"加载问题列表失败"}catch(l){b.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"加载问题列表失败"}finally{m.value=!1}},Q=(e,a)=>{_.value=e,U.value=a,A.value="",x.value=!0},Y=async e=>{var s,n
|
||
if(_.value){A.value=e.resolutionNote||"",t.show("处理中...")
|
||
try{const e=await $.resolveIssue(_.value.id,U.value,A.value.trim()||void 0)
|
||
e.success?(a("问题已"+("resolved"===U.value?"标记为已解决":"驳回"),2e3),x.value=!1,_.value=null,A.value="",await J()):l(e.message||"处理问题失败",3e3)}catch(i){l((null==(n=null==(s=i.response)?void 0:s.data)?void 0:n.message)||i.message||"处理问题失败",3e3)}finally{t.hide()}}},Z=()=>{x.value=!1,_.value=null,A.value=""},ae=e=>{g.value=e,J()}
|
||
return o(()=>{J()}),(e,a)=>(S(),d("div",Tl,[h("div",El,[p(X,{modelValue:s.value,"onUpdate:modelValue":a[0]||(a[0]=e=>s.value=e),options:F},null,8,["modelValue"])]),h("div",Nl,[m.value?(S(),d("div",Dl,[...a[1]||(a[1]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):b.value?(S(),d("div",Pl,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(b.value),1),h("button",{class:"btn btn-primary",onClick:J},"重试")])):(S(),d(r,{key:2},[0===R.value.length?(S(),d("div",Ml,[p(z,{icon:"mdi:bug-check"}),a[2]||(a[2]=h("p",null,"暂无问题报告",-1))])):y("",!0),(S(!0),d(r,null,C(R.value,e=>(S(),d("div",{key:e.id,class:"violation-item"},[h("div",Bl,[h("div",zl,[h("span",{class:V(["violation-type",`issue-type-${e.errorType}`])},k(L(e.errorType)),3),h("span",Fl,"#"+k(e.id),1),h("span",$l,k(q(e.submitTime)),1)]),h("span",{class:V(["violation-status",e.status])},k(j(e.status)),3)]),h("div",Rl,[h("div",ql,[h("div",Ll,[a[3]||(a[3]=h("span",{class:"detail-label"},"应用:",-1)),h("div",jl,[e.appIconId&&G(e.id)?(S(),d("img",{key:0,src:G(e.id),alt:e.appName,class:"app-icon-small"},null,8,Ol)):(S(),d("div",Kl,k(e.appName.charAt(0).toUpperCase()),1)),h("span",null,k(e.appName)+" ("+k(e.appVersion)+")",1)])]),h("div",Gl,[a[4]||(a[4]=h("span",{class:"detail-label"},"Bundle ID:",-1)),h("span",Wl,k(e.bundleId),1)]),h("div",Hl,[a[5]||(a[5]=h("span",{class:"detail-label"},"问题类型:",-1)),h("span",{class:V(["detail-value issue-type-badge",`issue-type-${e.errorType}`])},k(L(e.errorType)),3)]),h("div",Jl,[a[6]||(a[6]=h("span",{class:"detail-label"},"系统信息:",-1)),h("span",Ql,k(e.osVersion)+" ("+k(e.architecture)+")",1)]),h("div",Yl,[a[7]||(a[7]=h("span",{class:"detail-label"},"提交用户:",-1)),h("span",Xl,k(e.userName),1)]),h("div",Zl,[a[8]||(a[8]=h("span",{class:"detail-label"},"提交时间:",-1)),h("span",et,k(q(e.submitTime)),1)]),h("div",at,[a[9]||(a[9]=h("span",{class:"detail-label"},"问题描述:",-1)),h("div",lt,k(e.content),1)]),e.screenshotAttachmentIds&&e.screenshotAttachmentIds.length>0?(S(),d("div",tt,[a[10]||(a[10]=h("span",{class:"detail-label"},"截图:",-1)),p(ie,{"image-ids":W(e),"show-index":!1,columns:4,"max-width":80,onImageClick:a=>(async(e,a)=>{const l=W(e),t=[]
|
||
for(const n of l)try{const e=await $.getAttachmentImage(n)
|
||
e&&t.push(e)}catch(s){}t.length>0&&(D.value=t,P.value=Math.min(a,t.length-1),M.value=!0)})(e,a)},null,8,["image-ids","onImageClick"])])):y("",!0),e.fileAttachmentIds&&e.fileAttachmentIds.length>0?(S(),d("div",st,[a[11]||(a[11]=h("span",{class:"detail-label"},"文件:",-1)),h("div",nt,[(S(!0),d(r,null,C(e.fileAttachmentIds,(e,a)=>(S(),d("div",{key:`file-${a}`,class:"attachment-item",onClick:a=>(async e=>{try{const a=O(e),t=await $.getAttachmentDownloadUrl(a)
|
||
if(!t)return void l("获取下载链接失败",2e3)
|
||
const s=document.createElement("a")
|
||
s.href=t.url,s.download=t.name,s.target="_blank",document.body.appendChild(s),s.click(),document.body.removeChild(s)}catch(a){l("下载文件失败",2e3)}})(e)},[p(z,{icon:"mdi:file",class:"attachment-icon"}),h("span",ut,"文件 "+k(a+1),1),p(z,{icon:"mdi:download",class:"attachment-action-icon",title:"下载"})],8,it))),128))])])):y("",!0),e.resolutionNote?(S(),d("div",ot,[a[12]||(a[12]=h("span",{class:"detail-label"},"处理说明:",-1)),h("div",ct,k(e.resolutionNote),1)])):y("",!0),e.processedAt?(S(),d("div",dt,[a[13]||(a[13]=h("span",{class:"detail-label"},"处理时间:",-1)),h("span",rt,k(q(e.processedAt)),1)])):y("",!0)]),"pending"===e.status?(S(),d("div",vt,[h("button",{class:"btn btn-primary",onClick:a=>Q(e,"resolved")},[p(z,{icon:"mdi:check",class:"btn-icon"}),a[14]||(a[14]=T(" 标记为已解决 ",-1))],8,pt),h("button",{class:"btn btn-secondary",onClick:a=>Q(e,"rejected")},[p(z,{icon:"mdi:close",class:"btn-icon"}),a[15]||(a[15]=T(" 驳回 ",-1))],8,mt)])):y("",!0)])]))),128)),w.value>1?(S(),v(ee,{key:1,"current-page":g.value,"total-pages":w.value,total:I.value,onPageChange:ae},null,8,["current-page","total-pages","total"])):y("",!0)],64))]),p(ba,{visible:x.value,title:"resolved"===U.value?"标记为已解决":"驳回问题",message:`确定要${"resolved"===U.value?"标记为已解决":"驳回"}这个问题吗?`,fields:[{key:"resolutionNote",label:"处理说明",placeholder:"请输入处理说明(可选)",type:"textarea",required:!1,defaultValue:A.value}],"confirm-text":"确认","cancel-text":"取消",onConfirm:Y,onCancel:Z},null,8,["visible","title","message","fields"]),p(ue,{visible:M.value,images:D.value,"initial-index":P.value,onClose:H},null,8,["visible","images","initial-index"])]))}}),[["__scopeId","data-v-703a116b"]]),gt=["checked","indeterminate","disabled"],yt={class:"checkbox-box"},ft={key:0,class:"checkbox-icon indeterminate-icon",viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg"},ht={key:1,class:"checkbox-icon",viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg"},kt={key:0,class:"checkbox-label-text"},It=q(s({__name:"CustomCheckbox",props:{modelValue:{type:Boolean},label:{},disabled:{type:Boolean},indeterminate:{type:Boolean}},emits:["update:modelValue"],setup(e){const a=e,l=n(null)
|
||
return i(()=>a.indeterminate,e=>{l.value&&(l.value.indeterminate=e||!1)},{immediate:!0}),o(()=>{l.value&&a.indeterminate&&(l.value.indeterminate=!0)}),(a,t)=>(S(),d("label",{class:V(["custom-checkbox",{checked:e.modelValue,indeterminate:e.indeterminate,disabled:e.disabled}])},[h("input",{type:"checkbox",checked:e.modelValue,indeterminate:e.indeterminate,disabled:e.disabled,onChange:t[0]||(t[0]=e=>a.$emit("update:modelValue",e.target.checked)),class:"checkbox-input",ref_key:"checkboxInputRef",ref:l},null,40,gt),h("span",yt,[e.indeterminate?(S(),d("svg",ft,[...t[1]||(t[1]=[h("path",{d:"M2 6H10",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1)])])):e.modelValue?(S(),d("svg",ht,[...t[2]||(t[2]=[h("path",{d:"M10 3L4.5 8.5L2 6",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)])])):y("",!0)]),e.label?(S(),d("span",kt,k(e.label),1)):y("",!0)],2))}}),[["__scopeId","data-v-49067f17"]]),wt={class:"forums-management"},Ct={key:0,class:"sub-tab-content"},xt={class:"section-header"},_t={class:"header-actions"},St={class:"table-container"},At={class:"data-table"},Vt={style:{width:"50px"}},Ut={key:1,class:"checkbox-disabled-placeholder"},Tt={class:"forum-name-cell"},Et=["src","alt","onError"],Nt=["src","alt","onError"],Dt={key:2,class:"forum-icon-placeholder"},Pt={class:"bundle-id"},Mt={class:"action-buttons"},Bt=["onClick"],zt=["onClick"],Ft=["onClick"],$t={key:0,class:"empty-state"},Rt={key:1,class:"sub-tab-content"},qt={class:"section-header"},Lt={class:"header-actions"},jt={class:"table-container"},Ot={class:"data-table"},Kt={class:"forum-name-cell"},Gt=["src","alt","onError"],Wt={key:2,class:"forum-icon-placeholder"},Ht={class:"bundle-id"},Jt={class:"action-buttons"},Qt=["onClick"],Yt=["onClick"],Xt={key:0,class:"empty-state"},Zt={key:2,class:"sub-tab-content"},es={class:"section-header"},as={class:"header-info"},ls={class:"header-actions"},ts={class:"table-container"},ss={class:"data-table"},ns={class:"forum-name-cell"},is=["src","alt","onError"],us=["src","alt","onError"],os={key:2,class:"forum-icon-placeholder"},cs={class:"bundle-id"},ds={class:"action-buttons"},rs=["onClick"],vs=["onClick"],ps={key:0,class:"empty-state"},ms=q(s({__name:"ForumsManagement",setup(a){const{success:l,error:t}=B(),s=L(),m=["forums","requests","manage"],b=n(""),g=n("all"),f=n([]),x=n([]),A=n("forums"),U=n(0),E=n(!1),N=n(!1),D=n([]),P=u(()=>f.value.filter(e=>"builtin"!==Y.value[e.bundleId]).map(e=>e.bundleId)),M=u(()=>P.value.length>0&&D.value.length===P.value.length),F=u(()=>D.value.length>0&&D.value.length<P.value.length),R=n(1),q=n(20),j=n(0),K=u(()=>Math.ceil(j.value/q.value)),G=u(()=>f.value),W=n(1),H=n(20),J=u(()=>Math.ceil(U.value/H.value)),Q=n({}),Y=n({}),Z=n([]),ae=n(0),le=n(!1),te=n(!1),ie=n(!1),ue=n(null),oe=n(1),ce=n(20),de=u(()=>Math.ceil(ae.value/ce.value)),re=n({bundleId:"",name:"",description:"",iconId:"",maxImageCount:5,maxFileCount:5,maxImageSize:20,maxFileSize:20}),ve=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"enabled",label:"已启用",icon:"fluent-color:checkmark-circle-24"},{value:"disabled",label:"已禁用",icon:"fluent-color:dismiss-circle-24"}],pe=e=>{R.value=e,Ve()}
|
||
i([b,g],()=>{R.value=1,D.value=[],Ve()}),i(R,()=>{D.value=[]}),i(A,()=>{D.value=[]})
|
||
const me=u(()=>x.value.filter(e=>e.status===se.PENDING)),be=u(()=>[{key:"iconId",label:"图标",type:"icon",defaultValue:re.value.iconId,align:"center"},{key:"bundleId",label:"讨论区ID",type:"text",placeholder:"com.example.forum",required:!0,defaultValue:re.value.bundleId},{key:"name",label:"讨论区名称",type:"text",placeholder:"请输入讨论区名称",required:!0,defaultValue:re.value.name},{key:"description",label:"描述",type:"textarea",placeholder:"请输入描述(可选)",defaultValue:re.value.description,rows:3},{key:"maxImageCount",label:"图片数量限制",type:"number",placeholder:"5",defaultValue:String(re.value.maxImageCount),group:"图片限制",span:6},{key:"maxImageSize",label:"单个图片大小限制(MB)",type:"number",placeholder:"20",defaultValue:String(re.value.maxImageSize),group:"图片限制",span:6},{key:"maxFileCount",label:"文件数量限制",type:"number",placeholder:"5",defaultValue:String(re.value.maxFileCount),group:"文件限制",span:6},{key:"maxFileSize",label:"单个文件大小限制(MB)",type:"number",placeholder:"20",defaultValue:String(re.value.maxFileSize),group:"文件限制",span:6}]),ge=u(()=>[{key:"iconId",label:"图标",type:"icon",defaultValue:re.value.iconId,align:"center"},{key:"name",label:"讨论区名称",type:"text",placeholder:"请输入讨论区名称",required:!0,defaultValue:re.value.name},{key:"description",label:"描述",type:"textarea",placeholder:"请输入描述(可选)",defaultValue:re.value.description,rows:3},{key:"maxImageCount",label:"图片数量限制",type:"number",placeholder:"5",defaultValue:String(re.value.maxImageCount),group:"图片限制",span:6},{key:"maxImageSize",label:"单个图片大小限制(MB)",type:"number",placeholder:"20",defaultValue:String(re.value.maxImageSize),group:"图片限制",span:6},{key:"maxFileCount",label:"文件数量限制",type:"number",placeholder:"5",defaultValue:String(re.value.maxFileCount),group:"文件限制",span:6},{key:"maxFileSize",label:"单个文件大小限制(MB)",type:"number",placeholder:"20",defaultValue:String(re.value.maxFileSize),group:"文件限制",span:6}]),ye=u(()=>[{id:"forums",label:"讨论区列表",icon:"fluent-color:comment-multiple-28",badge:null},{id:"manage",label:"讨论区管理",icon:"fluent-color:settings-32",badge:null},{id:"requests",label:"申请开通",icon:"fluent-color:clipboard-text-edit-32",badge:me.value.length>0?String(me.value.length):null}]),fe=e=>{var a
|
||
a=e,m.includes(a)&&(A.value=e)},he=e=>new Date(e).toLocaleString("zh-CN"),ke=n({}),Ie=n({}),we=n({}),Ce=async e=>{var a
|
||
if(0!==e.length)try{const l=await $.batchGetAppIconIds(e)
|
||
l.success&&(null==(a=l.data)?void 0:a.iconIdMap)&&(Object.assign(Q.value,l.data.iconIdMap),Object.entries(l.data.iconIdMap).forEach(([e,a])=>{_e(e,a)}))}catch(l){}},xe=e=>{if(ke.value[e])return null
|
||
if(Ie.value[e]||we.value[e])return null
|
||
const a=Q.value[e]
|
||
return a?(_e(e,a),null):$.getAppIconUrl(e)},_e=async(e,a)=>{if(!Ie.value[e]){Ie.value[e]=!0
|
||
try{const l=await $.getIcon(a,80,128,128)
|
||
ke.value[e]=l,delete we.value[e]}catch(l){we.value[e]=!0
|
||
const a=$.getAppIconUrl(e)
|
||
a&&(ke.value[e]=a)}finally{delete Ie.value[e]}}},Se=e=>{switch(e){case se.PENDING:return"待处理"
|
||
case se.APPROVED:return"已批准"
|
||
case se.REJECTED:return"已拒绝"
|
||
default:return e}},Ae=()=>{window.dispatchEvent(new CustomEvent("system-notifications-changed"))},Ve=async()=>{N.value=!0
|
||
try{const e=await $.getForumPermissions(R.value,q.value,b.value||void 0,g.value)
|
||
if(e.permissions&&e.permissions.length>0){f.value=e.permissions,j.value=e.total
|
||
const a=e.permissions.map(e=>e.bundleId)
|
||
await Ce(a),await(async()=>{try{const e=await $.getAllForums(),a={}
|
||
e.forEach(e=>{"builtin"!==e.type&&"created"!==e.type||(a[e.bundleId]=e.type)}),Y.value=a}catch(e){}})()}else f.value=[],j.value=0}catch(e){f.value=[],j.value=0}finally{N.value=!1}},Ue=async()=>{E.value=!0
|
||
try{const e=await $.getForumRequests("all",W.value,H.value)
|
||
if(x.value=e.requests,U.value=e.total,e.requests&&e.requests.length>0){const a=e.requests.map(e=>e.bundleId)
|
||
await Ce(a)}}catch(e){x.value=[],U.value=0}finally{E.value=!1}},Te=e=>{W.value=e,Ue()},Ee=async()=>{var e,a
|
||
if(0!==me.value.length)try{const e=me.value.map(e=>e.id),a=await $.batchProcessForumRequests(e,"approve")
|
||
if(a.success&&a.data){a.data.success.forEach(e=>{const a=x.value.find(a=>a.id===e.requestId)
|
||
a&&(a.status=se.APPROVED)}),await Ue(),await Ve(),Ae()
|
||
const e=a.data.success.length,s=a.data.failed.length
|
||
0===s?l(`成功批准 ${e} 个申请`,2e3):t(`批准完成:成功 ${e} 个,失败 ${s} 个`,3e3)}else t(a.message||"批量批准失败",3e3)}catch(s){const l=(null==(a=null==(e=s.response)?void 0:e.data)?void 0:a.message)||s.message||"批量批准失败"
|
||
t(l,3e3)}},Ne=()=>{Ue()},De=async()=>{le.value=!0
|
||
try{const e=await $.getAdminForums(oe.value,ce.value)
|
||
Z.value=e.forums,ae.value=e.total,Z.value.forEach(e=>{"created"===e.type&&e.iconId&&(async(e,a)=>{const l=Z.value.find(a=>a.bundleId===e)
|
||
if(l)try{const e=await $.getIcon(a,80,128,128)
|
||
l.iconUrl=e,l.iconLoaded=!0,l.iconError=!1}catch(t){l.iconError=!0,l.iconLoaded=!0}})(e.bundleId,e.iconId)})}catch(e){Z.value=[],ae.value=0}finally{le.value=!1}},Pe=e=>{oe.value=e,De()},Me=async e=>{var a,s
|
||
if(e.bundleId&&e.name)try{const a=e.maxImageSize?1024*parseInt(e.maxImageSize)*1024:void 0,s=e.maxFileSize?1024*parseInt(e.maxFileSize)*1024:void 0,n=e.maxImageCount?parseInt(e.maxImageCount):void 0,i=e.maxFileCount?parseInt(e.maxFileCount):void 0,u=await $.createForum(e.bundleId,e.name,e.iconId||void 0,e.description||void 0,n,i,a,s)
|
||
u.success?(l("创建讨论区成功",2e3),te.value=!1,re.value={bundleId:"",name:"",description:"",iconId:"",maxImageCount:5,maxFileCount:5,maxImageSize:20,maxFileSize:20},oe.value=1,await De()):t(u.message||"创建讨论区失败",3e3)}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"创建讨论区失败"
|
||
t(e,3e3)}else t("讨论区ID和名称不能为空",3e3)},Be=async e=>{var a,s
|
||
if(ue.value&&e.name)try{const a=void 0!==e.maxImageSize&&""!==e.maxImageSize?parseInt(e.maxImageSize):void 0,s=void 0===a||isNaN(a)?void 0:1024*a*1024,n=void 0!==e.maxFileSize&&""!==e.maxFileSize?parseInt(e.maxFileSize):void 0,i=void 0===n||isNaN(n)?void 0:1024*n*1024,u=void 0!==e.maxImageCount&&""!==e.maxImageCount?parseInt(e.maxImageCount):void 0,o=void 0===u||isNaN(u)?void 0:u,c=void 0!==e.maxFileCount&&""!==e.maxFileCount?parseInt(e.maxFileCount):void 0,d=void 0===c||isNaN(c)?void 0:c,r=await $.updateForum(ue.value.bundleId,{name:e.name,iconId:e.iconId||void 0,description:e.description||void 0,maxImageCount:o,maxFileCount:d,maxImageSize:s,maxFileSize:i})
|
||
r.success?(l("更新讨论区成功",2e3),ie.value=!1,ue.value=null,re.value={bundleId:"",name:"",description:"",iconId:"",maxImageCount:5,maxFileCount:5,maxImageSize:20,maxFileSize:20},await De()):t(r.message||"更新讨论区失败",3e3)}catch(n){const e=(null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"更新讨论区失败"
|
||
t(e,3e3)}else t("讨论区名称不能为空",3e3)},ze=async e=>{var a,n,i,u,o,c,d
|
||
let r=e
|
||
const v=Z.value.find(a=>a.bundleId===e)
|
||
if(v)r=v.name
|
||
else{const a=f.value.find(a=>a.bundleId===e)
|
||
a&&(r=a.appName)}if(await s.show({title:"删除讨论区",message:`确定要删除讨论区 "${r}" 吗?\n\n此操作将永久删除该讨论区及其所有帖子、回复、附件等相关数据,此操作不可恢复!`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const s=await $.deleteForum(e)
|
||
s.success?(null==(n=null==(a=s.data)?void 0:a.success)||n.length,0===((null==(u=null==(i=s.data)?void 0:i.failed)?void 0:u.length)||0)?l("删除讨论区成功",2e3):t("删除失败",3e3),"manage"===A.value&&(1===Z.value.length&&oe.value>1&&oe.value--,await De()),"forums"===A.value&&(1===f.value.length&&R.value>1&&R.value--,await Ve()),(null==(o=s.data)?void 0:o.success)&&s.data.success.forEach(e=>{delete Y.value[e]})):t(s.message||"删除讨论区失败",3e3)}catch(p){const e=(null==(d=null==(c=p.response)?void 0:c.data)?void 0:d.message)||p.message||"删除讨论区失败"
|
||
t(e,3e3)}},Fe=(e,a,l)=>`${e}${l?"张":"个"}/单${l?"张":"个"}${Math.round(a/1048576)}MB`,$e=e=>{D.value=e?[...P.value]:[]},Re=async()=>{var e,a,n,i,u,o,c
|
||
if(0===D.value.length)return
|
||
const d=D.value.map(e=>{const a=f.value.find(a=>a.bundleId===e)
|
||
return a?a.appName:e}).join("、")
|
||
if(await s.show({title:"批量删除讨论区",message:`确定要删除以下 ${D.value.length} 个讨论区吗?\n\n${d}\n\n此操作将永久删除这些讨论区及其所有帖子、回复、附件等相关数据,此操作不可恢复!`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const s=await $.deleteForum(D.value)
|
||
if(s.success){const o=(null==(a=null==(e=s.data)?void 0:e.success)?void 0:a.length)||D.value.length,c=(null==(i=null==(n=s.data)?void 0:n.failed)?void 0:i.length)||0
|
||
0===c?l(`成功删除 ${o} 个讨论区`,2e3):t(`删除完成:成功 ${o} 个,失败 ${c} 个`,3e3),D.value=[],await Ve(),(null==(u=s.data)?void 0:u.success)&&s.data.success.forEach(e=>{delete Y.value[e]})}else t(s.message||"批量删除失败",3e3)}catch(r){const e=(null==(c=null==(o=r.response)?void 0:o.data)?void 0:c.message)||r.message||"批量删除失败"
|
||
t(e,3e3)}},qe=()=>{te.value=!1,re.value={bundleId:"",name:"",description:"",iconId:"",maxImageCount:5,maxFileCount:5,maxImageSize:20,maxFileSize:20}},Le=()=>{ie.value=!1,ue.value=null,re.value={bundleId:"",name:"",description:"",iconId:"",maxImageCount:5,maxFileCount:5,maxImageSize:20,maxFileSize:20}}
|
||
return o(()=>{Ve(),Ue(),De(),window.addEventListener("forum-requests-changed",Ne)}),c(()=>{window.removeEventListener("forum-requests-changed",Ne)}),(a,n)=>(S(),d("div",wt,[p(e,{tabs:ye.value,activeTab:A.value,"onUpdate:activeTab":fe},null,8,["tabs","activeTab"]),"forums"===A.value?(S(),d("div",Ct,[h("div",xt,[h("div",_t,[I(h("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>b.value=e),type:"text",placeholder:"搜索讨论区...",class:"search-input"},null,512),[[w,b.value]]),p(X,{modelValue:g.value,"onUpdate:modelValue":n[1]||(n[1]=e=>g.value=e),options:ve},null,8,["modelValue"]),D.value.length>0?(S(),d("button",{key:0,class:"btn btn-error",onClick:Re},[p(z,{icon:"mdi:delete",class:"btn-icon"}),T(" 批量删除 ("+k(D.value.length)+") ",1)])):y("",!0)])]),h("div",St,[h("table",At,[h("thead",null,[h("tr",null,[h("th",Vt,[p(It,{"model-value":M.value,indeterminate:F.value,label:"","onUpdate:modelValue":$e,class:"checkbox-header"},null,8,["model-value","indeterminate"])]),n[3]||(n[3]=h("th",null,"应用名称",-1)),n[4]||(n[4]=h("th",null,"Bundle ID",-1)),n[5]||(n[5]=h("th",null,"帖子数",-1)),n[6]||(n[6]=h("th",null,"最后发帖时间",-1)),n[7]||(n[7]=h("th",null,"状态",-1)),n[8]||(n[8]=h("th",null,"操作",-1))])]),h("tbody",null,[(S(!0),d(r,null,C(G.value,e=>(S(),d("tr",{key:e.bundleId},[h("td",null,["builtin"!==Y.value[e.bundleId]?(S(),v(It,{key:0,"model-value":D.value.includes(e.bundleId),label:"","onUpdate:modelValue":a=>((e,a)=>{a?D.value.includes(e)||D.value.push(e):D.value=D.value.filter(a=>a!==e)})(e.bundleId,a),class:"checkbox-row"},null,8,["model-value","onUpdate:modelValue"])):(S(),d("span",Ut))]),h("td",null,[h("div",Tt,[ke.value[e.bundleId]?(S(),d("img",{key:0,src:ke.value[e.bundleId],alt:e.appName,class:"forum-icon",onError:()=>{delete ke.value[e.bundleId]}},null,40,Et)):xe(e.bundleId)?(S(),d("img",{key:1,src:xe(e.bundleId),alt:e.appName,class:"forum-icon",onError:()=>{we.value[e.bundleId]=!0}},null,40,Nt)):(S(),d("div",Dt,k(e.appName.charAt(0).toUpperCase()),1)),h("span",null,k(e.appName),1)])]),h("td",null,[h("code",Pt,k(e.bundleId),1)]),h("td",null,k(e.postCount),1),h("td",null,k(e.lastPostTime?he(e.lastPostTime):"-"),1),h("td",null,[h("span",{class:V(["status-badge",e.enabled?"enabled":"disabled"])},k(e.enabled?"已启用":"已禁用"),3)]),h("td",null,[h("div",Mt,[e.enabled?(S(),d("button",{key:0,class:"action-btn ban",onClick:a=>(async e=>{var a,s
|
||
const n=f.value.find(a=>a.bundleId===e)
|
||
if(n)try{const a=await $.disableForum(e)
|
||
a.success?(n.enabled=!1,n.updatedAt=(new Date).toISOString(),l("禁用讨论区成功",2e3)):t(a.message||"禁用讨论区失败",3e3)}catch(i){const e=(null==(s=null==(a=i.response)?void 0:a.data)?void 0:s.message)||i.message||"禁用讨论区失败"
|
||
t(e,3e3)}})(e.bundleId),title:"禁用讨论区"},[p(z,{icon:"mdi:ban"})],8,Bt)):(S(),d("button",{key:1,class:"action-btn enable",onClick:a=>(async e=>{var a,s
|
||
const n=f.value.find(a=>a.bundleId===e)
|
||
if(n)try{const a=await $.enableForum(e)
|
||
a.success?(n.enabled=!0,n.updatedAt=(new Date).toISOString(),l("启用讨论区成功",2e3)):t(a.message||"启用讨论区失败",3e3)}catch(i){const e=(null==(s=null==(a=i.response)?void 0:a.data)?void 0:s.message)||i.message||"启用讨论区失败"
|
||
t(e,3e3)}})(e.bundleId),title:"启用讨论区"},[p(z,{icon:"mdi:check-circle"})],8,zt)),"builtin"!==Y.value[e.bundleId]?(S(),d("button",{key:2,class:"action-btn delete",onClick:a=>ze(e.bundleId),title:"删除讨论区"},[p(z,{icon:"mdi:delete"})],8,Ft)):y("",!0)])])]))),128))])]),0!==G.value.length||N.value?y("",!0):(S(),d("div",$t,[p(z,{icon:"mdi:forum-outline",class:"empty-icon"}),n[9]||(n[9]=h("p",null,"没有找到讨论区",-1))]))]),j.value>0&&K.value>1?(S(),v(ee,{key:0,"current-page":R.value,"total-pages":K.value,total:j.value,onPageChange:pe},null,8,["current-page","total-pages","total"])):y("",!0)])):y("",!0),"manage"===A.value?(S(),d("div",Rt,[h("div",qt,[h("div",Lt,[h("button",{class:"btn btn-primary",onClick:n[2]||(n[2]=e=>te.value=!0)},[p(z,{icon:"mdi:plus",class:"btn-icon"}),n[10]||(n[10]=T(" 创建讨论区 ",-1))])])]),h("div",jt,[h("table",Ot,[n[11]||(n[11]=h("thead",null,[h("tr",null,[h("th",null,"讨论区名称"),h("th",null,"Bundle ID"),h("th",null,"类型"),h("th",null,"描述"),h("th",null,"图片限制"),h("th",null,"文件限制"),h("th",null,"操作")])],-1)),h("tbody",null,[(S(!0),d(r,null,C(Z.value,e=>(S(),d("tr",{key:e.bundleId},[h("td",null,[h("div",Kt,["builtin"===e.type?(S(),v(z,{key:0,icon:_(ne)(e.bundleId),class:"forum-icon-iconify"},null,8,["icon"])):"created"===e.type&&e.iconUrl?(S(),d("img",{key:1,src:e.iconUrl,alt:e.name,class:"forum-icon",onError:()=>{e.iconError=!0}},null,40,Gt)):"created"===e.type?(S(),d("div",Wt,k(e.name.charAt(0).toUpperCase()),1)):y("",!0),h("span",null,k(e.name),1)])]),h("td",null,[h("code",Ht,k(e.bundleId),1)]),h("td",null,[h("span",{class:V(["status-badge","builtin"===e.type?"enabled":"info"])},k("builtin"===e.type?"内置":"创建"),3)]),h("td",null,k(e.description||"-"),1),h("td",null,k(Fe(e.maxImageCount||5,e.maxImageSize||20971520,!0)),1),h("td",null,k(Fe(e.maxFileCount||5,e.maxFileSize||20971520,!1)),1),h("td",null,[h("div",Jt,[h("button",{class:"action-btn edit",onClick:a=>(e=>{ue.value=e
|
||
const a=e.maxImageSize?Math.round(e.maxImageSize/1048576):20,l=e.maxFileSize?Math.round(e.maxFileSize/1048576):20
|
||
re.value={bundleId:e.bundleId,name:e.name,description:e.description||"",iconId:e.iconId||"",maxImageCount:e.maxImageCount||5,maxFileCount:e.maxFileCount||5,maxImageSize:a,maxFileSize:l},ie.value=!0})(e),title:"编辑讨论区"},[p(z,{icon:"mdi:pencil"})],8,Qt),"builtin"!==e.type?(S(),d("button",{key:0,class:"action-btn delete",onClick:a=>ze(e.bundleId),title:"删除讨论区"},[p(z,{icon:"mdi:delete"})],8,Yt)):y("",!0)])])]))),128))])]),0!==Z.value.length||le.value?y("",!0):(S(),d("div",Xt,[p(z,{icon:"mdi:forum-outline",class:"empty-icon"}),n[12]||(n[12]=h("p",null,"暂无讨论区",-1))]))]),ae.value>0&&de.value>1?(S(),v(ee,{key:0,"current-page":oe.value,"total-pages":de.value,total:ae.value,onPageChange:Pe},null,8,["current-page","total-pages","total"])):y("",!0)])):y("",!0),"requests"===A.value?(S(),d("div",Zt,[h("div",es,[h("div",as,[h("span",null,"共 "+k(U.value)+" 条申请记录",1)]),h("div",ls,[me.value.length>0?(S(),d("button",{key:0,class:"btn btn-primary",onClick:Ee},[p(z,{icon:"mdi:check-all",class:"btn-icon"}),T(" 一键批准全部 ("+k(me.value.length)+") ",1)])):y("",!0)])]),h("div",ts,[h("table",ss,[n[13]||(n[13]=h("thead",null,[h("tr",null,[h("th",null,"应用名称"),h("th",null,"Bundle ID"),h("th",null,"申请人"),h("th",null,"申请时间"),h("th",null,"状态"),h("th",null,"操作")])],-1)),h("tbody",null,[(S(!0),d(r,null,C(x.value,e=>(S(),d("tr",{key:e.id},[h("td",null,[h("div",ns,[ke.value[e.bundleId]?(S(),d("img",{key:0,src:ke.value[e.bundleId],alt:e.appName,class:"forum-icon",onError:()=>{delete ke.value[e.bundleId]}},null,40,is)):xe(e.bundleId)?(S(),d("img",{key:1,src:xe(e.bundleId),alt:e.appName,class:"forum-icon",onError:()=>{we.value[e.bundleId]=!0}},null,40,us)):(S(),d("div",os,k(e.appName.charAt(0).toUpperCase()),1)),h("span",null,k(e.appName),1)])]),h("td",null,[h("code",cs,k(e.bundleId),1)]),h("td",null,k(e.requesterName),1),h("td",null,k(he(e.requestTime)),1),h("td",null,[h("span",{class:V(["status-badge",e.status])},k(Se(e.status)),3)]),h("td",null,[h("div",ds,[e.status===_(se).PENDING?(S(),d("button",{key:0,class:"action-btn enable",onClick:a=>(async e=>{var a,s
|
||
const n=x.value.find(a=>a.id===e)
|
||
if(n)try{const a=await $.processForumRequest(e,"approve")
|
||
a.success?(n.status=se.APPROVED,1===x.value.length&&W.value>1&&W.value--,await Ue(),await Ve(),Ae(),l("批准申请成功",2e3)):t(a.message||"批准申请失败",3e3)}catch(i){const e=(null==(s=null==(a=i.response)?void 0:a.data)?void 0:s.message)||i.message||"批准申请失败"
|
||
t(e,3e3)}})(e.id),title:"批准申请"},[p(z,{icon:"mdi:check"})],8,rs)):y("",!0),e.status===_(se).PENDING?(S(),d("button",{key:1,class:"action-btn delete",onClick:a=>(async e=>{var a,s
|
||
const n=x.value.find(a=>a.id===e)
|
||
if(n)try{const a="该应用暂不支持讨论区功能",s=await $.processForumRequest(e,"reject",a)
|
||
s.success?(n.status=se.REJECTED,1===x.value.length&&W.value>1&&W.value--,await Ue(),await Ve(),Ae(),l("拒绝申请成功",2e3)):t(s.message||"拒绝申请失败",3e3)}catch(i){const e=(null==(s=null==(a=i.response)?void 0:a.data)?void 0:s.message)||i.message||"拒绝申请失败"
|
||
t(e,3e3)}})(e.id),title:"拒绝申请"},[p(z,{icon:"mdi:close"})],8,vs)):y("",!0)])])]))),128))])]),0!==x.value.length||E.value?y("",!0):(S(),d("div",ps,[p(z,{icon:"mdi:file-document-outline",class:"empty-icon"}),n[14]||(n[14]=h("p",null,"暂无申请记录",-1))]))]),U.value>0&&J.value>1?(S(),v(ee,{key:0,"current-page":W.value,"total-pages":J.value,total:U.value,onPageChange:Te},null,8,["current-page","total-pages","total"])):y("",!0)])):y("",!0),p(ba,{visible:te.value,title:"创建讨论区",fields:be.value,onConfirm:Me,onCancel:qe},null,8,["visible","fields"]),p(ba,{visible:ie.value,title:"编辑讨论区",fields:ge.value,onConfirm:Be,onCancel:Le},null,8,["visible","fields"]),p(O,{visible:_(s).visible.value,title:_(s).config.value.title||"",message:_(s).config.value.message||"",type:"danger"===_(s).config.value.type?"error":_(s).config.value.type||"warning","confirm-text":_(s).config.value.confirmText,"cancel-text":_(s).config.value.cancelText,onConfirm:_(s).handleConfirm,onCancel:_(s).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"])]))}}),[["__scopeId","data-v-8f9463d0"]]),bs={class:"apps-management"},gs={class:"section-header"},ys={class:"header-actions"},fs={class:"table-container"},hs={key:0,class:"loading-state"},ks={key:1,class:"error-state"},Is={class:"data-table"},ws={key:0},Cs={colspan:"6",class:"empty-state"},xs={class:"app-icon-cell"},_s={class:"app-icon"},Ss=["src","alt","onLoad","onError"],As={class:"action-buttons"},Vs=["onClick"],Us=q(s({__name:"AppsManagement",setup(e){const{isQiuChenLy:a}=j(),l=oe(),t=n(""),s=n([]),i=n(!1),c=n(""),m=n(1),b=n(20),g=n(0),f=u(()=>Math.ceil(g.value/b.value)),x=n({}),_=n({}),A=n({})
|
||
let V=null
|
||
const U=()=>{V&&clearTimeout(V),V=setTimeout(()=>{m.value=1,M()},500)},E=e=>{const a=e._id||e.id||e.bundleId
|
||
return e.iconId&&x.value[a]?x.value[a]:null},D=e=>{const a=e._id||e.id||e.bundleId
|
||
return _.value[a]||!1},P=e=>{const a=e._id||e.id||e.bundleId
|
||
return A.value[a]||!1},M=async()=>{if(a.value){i.value=!0,c.value=""
|
||
try{const e=t.value.trim()||void 0,a=await $.getAppInfoAll(m.value,b.value,e)
|
||
if(a.success&&a.data){let e=[]
|
||
Array.isArray(a.data)?e=a.data:a.data.list&&Array.isArray(a.data.list)?e=a.data.list:a.data.apps&&Array.isArray(a.data.apps)&&(e=a.data.apps),s.value=e
|
||
const l=a.data.total||a.data.count||e.length
|
||
g.value=l,e.forEach(e=>{e.iconId&&(async e=>{const a=e._id||e.id||e.bundleId
|
||
if(e.iconId&&!x.value[a])try{const l=await $.getIcon(e.iconId,80,128,128)
|
||
x.value[a]=l,A.value[a]=!1}catch(l){A.value[a]=!0}})(e)})}else c.value=a.message||"加载App列表失败"}catch(e){c.value=e.message||"加载App列表失败"}finally{i.value=!1}}},B=e=>{m.value=e,M()}
|
||
return o(()=>{M()}),(e,a)=>(S(),d("div",bs,[h("div",gs,[a[2]||(a[2]=h("h2",null,"App管理",-1)),h("div",ys,[I(h("input",{"onUpdate:modelValue":a[0]||(a[0]=e=>t.value=e),type:"text",placeholder:"搜索Bundle ID或应用名称...",class:"search-input",onInput:U},null,544),[[w,t.value]]),h("button",{class:"btn btn-primary",onClick:M},[p(z,{icon:"mdi:refresh",class:"btn-icon"}),a[1]||(a[1]=T(" 刷新 ",-1))])])]),h("div",fs,[i.value?(S(),d("div",hs,[...a[3]||(a[3]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):c.value?(S(),d("div",ks,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(c.value),1),h("button",{class:"btn btn-primary",onClick:M},"重试")])):(S(),d(r,{key:2},[h("table",Is,[a[5]||(a[5]=h("thead",null,[h("tr",null,[h("th",null,"图标"),h("th",null,"Bundle ID"),h("th",null,"应用名称"),h("th",null,"版本"),h("th",null,"描述"),h("th",null,"操作")])],-1)),h("tbody",null,[0===s.value.length?(S(),d("tr",ws,[h("td",Cs,[p(z,{icon:"mdi:apps"}),a[4]||(a[4]=h("p",null,"暂无应用数据",-1))])])):y("",!0),(S(!0),d(r,null,C(s.value,e=>(S(),d("tr",{key:e._id||e.id||e.bundleId},[h("td",null,[h("div",xs,[h("div",_s,[E(e)?I((S(),d("img",{key:0,src:E(e),alt:e.appName||e.bundleId,onLoad:a=>(e=>{const a=e._id||e.id||e.bundleId
|
||
_.value[a]=!0,A.value[a]=!1})(e),onError:a=>(e=>{const a=e._id||e.id||e.bundleId
|
||
_.value[a]=!1,A.value[a]=!0})(e)},null,40,Ss)),[[N,D(e)&&!P(e)]]):y("",!0),I(h("div",{class:"icon-placeholder"},k((e.appName||e.bundleId).charAt(0).toUpperCase()),513),[[N,!E(e)||!D(e)||P(e)]])])])]),h("td",null,k(e.bundleId),1),h("td",null,k(e.appName||"-"),1),h("td",null,k(e.appVersion||"-"),1),h("td",null,k((e.description||"").substring(0,50))+k(e.description&&e.description.length>50?"...":""),1),h("td",null,[h("div",As,[h("button",{class:"action-btn view",onClick:a=>(e=>{const a=[`Bundle ID: ${e.bundleId}`,`名称: ${e.appName||"未设置"}`,`版本: ${e.appVersion||"未设置"}`,`描述: ${e.description||"无描述"}`].join("\n")
|
||
l.show("应用详情",a)})(e),title:"查看详情"},[p(z,{icon:"mdi:eye"})],8,Vs)])])]))),128))])]),f.value>1?(S(),v(ee,{key:0,"current-page":m.value,"total-pages":f.value,total:g.value,onPageChange:B},null,8,["current-page","total-pages","total"])):y("",!0)],64))])]))}}),[["__scopeId","data-v-59e5e5ab"]]),Ts=5242880,Es={class:"files-management"},Ns={key:0,class:"sub-tab-content"},Ds={class:"section-header"},Ps={class:"header-actions"},Ms={class:"table-container"},Bs={key:0,class:"loading-state"},zs={key:1,class:"error-state"},Fs={key:2,class:"data-table"},$s={key:0},Rs={colspan:"5",class:"empty-state"},qs={class:"actions"},Ls={class:"action-buttons"},js=["onClick"],Os=["onClick"],Ks={key:1,class:"sub-tab-content"},Gs={class:"section-header"},Ws={class:"header-actions"},Hs={class:"table-container"},Js={key:0,class:"loading-state"},Qs={key:1,class:"error-state"},Ys={class:"data-table"},Xs={key:0},Zs={colspan:"6",class:"empty-state"},en={key:0,class:"beta-tag"},an={key:1,class:"text-muted"},ln={class:"actions"},tn={class:"action-buttons"},sn=["onClick"],nn={class:"modal-dialog"},un={class:"modal-header"},on={class:"modal-content"},cn={key:0,class:"upload-placeholder"},dn={key:1,class:"upload-progress"},rn={class:"progress-bar"},vn={key:2,class:"upload-success"},pn={class:"modal-footer"},mn={class:"modal-dialog"},bn={class:"modal-header"},gn={class:"modal-content"},yn={class:"form-group autocomplete-group"},fn={class:"autocomplete-wrapper"},hn={key:0,class:"autocomplete-loading"},kn=["onClick"],In=["src","alt"],wn={key:1,class:"app-icon-placeholder"},Cn={class:"app-content"},xn={class:"app-name"},_n={class:"app-info"},Sn={class:"bundle-id"},An={key:0,class:"app-version"},Vn={class:"app-detail-header"},Un=["src","alt"],Tn={key:1,class:"app-icon-placeholder-large"},En={class:"app-detail-content"},Nn={class:"app-detail-name"},Dn={class:"app-detail-bundle-id"},Pn={class:"form-group"},Mn={class:"form-group"},Bn={class:"form-group checkbox-group"},zn={class:"form-group file-info-group"},Fn=["value"],$n={class:"modal-footer"},Rn=["disabled"],qn=s({__name:"FilesManagement",setup(a){const{success:l,error:t}=B(),s=L(),m=n("files"),b=u(()=>[{id:"files",label:"文件列表",icon:"mdi:file",badge:null},{id:"binds",label:"文件绑定",icon:"mdi:link",badge:null}]),g=n([]),x=n(!1),U=n(""),E=n([]),N=n(!1),P=n(""),M=n(1),F=n(20),R=n(1),q=n(!1),j=n(!1),K=n(null),G=n({bundleId:"",version:"",fullVersion:"",beta:!1}),W=n(!1),H=n(null),J=n(!1),Q=n(0),Y=n(""),X=n(null),Z=n([]),ae=n(!1),le=n(null),te=n(null),se=n(null),ne=n(null),ie=n({}),ue=n(!1)
|
||
let oe=null
|
||
const ce=e=>new Date(e).toLocaleString("zh-CN"),de=e=>{if(!e)return"0 B"
|
||
const a=Math.floor(Math.log(e)/Math.log(1024))
|
||
return Math.round(e/Math.pow(1024,a)*100)/100+" "+["B","KB","MB","GB"][a]},re=e=>{var a
|
||
if(!e)return"-"
|
||
const l=null==(a=e.split(".").pop())?void 0:a.toLowerCase()
|
||
return{dmg:"DMG镜像",pkg:"安装包",zip:"压缩包",tar:"压缩包",gz:"压缩包",app:"应用程序"}[l||""]||(null==l?void 0:l.toUpperCase())||"未知"},ve=async()=>{x.value=!0,U.value=""
|
||
try{const e=await $.getFiles()
|
||
e.success&&e.data?g.value=Array.isArray(e.data)?e.data:[]:U.value=e.message||"加载文件列表失败"}catch(e){U.value=e.message||"加载文件列表失败"}finally{x.value=!1}},pe=async()=>{N.value=!0,P.value=""
|
||
try{const e=await $.getBinds(M.value,F.value)
|
||
e.success&&e.data?(E.value=e.data.binds||e.data.list||e.data||[],R.value=Math.ceil((e.data.total||0)/F.value)):P.value=e.message||"加载绑定列表失败"}catch(e){P.value=e.message||"加载绑定列表失败"}finally{N.value=!1}},me=e=>{M.value=e,pe()},be=()=>{le.value?A(()=>{if(!le.value)return
|
||
const e=le.value.getBoundingClientRect(),a=ue.value?1:Z.value.length,l=Math.min(64*a+8,300),t=window.innerHeight-e.bottom
|
||
let s=e.bottom+4,n=e.left,i=e.width
|
||
t<l&&e.top>l&&(s=e.top-l-4),n+i>window.innerWidth-16&&(n=window.innerWidth-i-16),n<16&&(n=16),se.value={top:`${s}px`,left:`${n}px`,width:`${i}px`}}):se.value=null},ge=()=>{ae.value=!0,be()
|
||
const e=G.value.bundleId.trim()
|
||
if(oe&&clearTimeout(oe),!e)return void(Z.value=[])
|
||
oe=setTimeout(()=>{(async e=>{if(e.trim()){ue.value=!0
|
||
try{const a=await $.getAppInfoAll(1,20,e.trim())
|
||
if(a.success&&a.data){let e=[]
|
||
a.data.list&&Array.isArray(a.data.list)?e=a.data.list:Array.isArray(a.data)?e=a.data:a.data.apps&&Array.isArray(a.data.apps)&&(e=a.data.apps),Z.value=e,e.forEach(e=>{e.iconId&&he(e)})}else Z.value=[]}catch(a){Z.value=[]}finally{ue.value=!1}}else Z.value=[]})(e)},500)
|
||
const a=Z.value.find(e=>e.bundleId===G.value.bundleId)
|
||
a&&a.appVersion&&(G.value.version=a.appVersion)},ye=()=>{ae.value=!0,be()},fe=()=>{setTimeout(()=>{ae.value=!1},200)}
|
||
i(ae,e=>{e?(be(),window.addEventListener("scroll",be,!0),window.addEventListener("resize",be)):(window.removeEventListener("scroll",be,!0),window.removeEventListener("resize",be))}),i(Z,()=>{ae.value&&be()}),i(q,e=>{e||(G.value={bundleId:"",version:"",fullVersion:"",beta:!1},ne.value=null)}),i(()=>G.value.bundleId,e=>{if(e&&Z.value.length>0){const a=Z.value.find(a=>a.bundleId===e)
|
||
a?(ne.value=a,a.appVersion&&!G.value.version&&(G.value.version=a.appVersion)):ne.value=null}else ne.value=null})
|
||
const he=async e=>{const a=e._id||e.id||e.bundleId
|
||
if(e.iconId&&!ie.value[a])try{ie.value[a]=await $.getIcon(e.iconId,80,128,128)}catch(l){}},ke=e=>{const a=e._id||e.id||e.bundleId
|
||
return ie.value[a]||null},Ie=async()=>{var e
|
||
if(G.value.bundleId&&G.value.version)if(null==(e=K.value)?void 0:e.name){W.value=!0
|
||
try{const e=await $.bindFile({bundleId:G.value.bundleId,version:G.value.version,fileId:K.value.name,fullVersion:G.value.fullVersion||void 0,beta:G.value.beta})
|
||
e.success?(l("文件绑定成功",2e3),q.value=!1,G.value={bundleId:"",version:"",fullVersion:"",beta:!1},ne.value=null,pe()):t(e.message||"绑定失败",3e3)}catch(a){t(a.message||"绑定失败",3e3)}finally{W.value=!1}}else t("文件信息不完整",2e3)
|
||
else t("请填写包名和版本",2e3)},we=()=>{j.value=!0,X.value=null,Q.value=0,Y.value=""},Ce=()=>{var e
|
||
null==(e=H.value)||e.click()},xe=e=>{var a
|
||
const l=null==(a=e.target.files)?void 0:a[0]
|
||
l&&Se(l)},_e=e=>{var a
|
||
e.preventDefault()
|
||
const l=null==(a=e.dataTransfer)?void 0:a.files[0]
|
||
l&&Se(l)},Se=async e=>{var a
|
||
J.value=!0,Q.value=0,Y.value="准备上传...",X.value=null
|
||
try{const t=5242880
|
||
let s
|
||
if(e.size<=t){Y.value="上传中..."
|
||
const l=await $.uploadSoftwareFile(e,e=>{Q.value=e,Y.value=`上传中... ${e}%`})
|
||
if(!l.success||!(null==(a=l.data)?void 0:a.fileId))throw new Error(l.message||"上传失败")
|
||
s=l.data.fileId}else{Y.value="初始化分段上传..."
|
||
const a=await async function(e){var a
|
||
const{file:l,chunkSize:t=Ts,onProgress:s,onChunkProgress:n}=e
|
||
if(l.size<=t)try{encodeURIComponent(l.name)
|
||
const e=await $.uploadSoftwareFile(l,s)
|
||
return e.success&&(null==(a=e.data)?void 0:a.fileId)?{success:!0,fileId:e.data.fileId}:{success:!1,message:e.message||"上传失败"}}catch(u){return{success:!1,message:u.message||"上传失败"}}const i=Math.ceil(l.size/t)
|
||
try{const e=encodeURIComponent(l.name),a=await async function(e,a,l){var t
|
||
const s=await fetch("/api/proxy",{method:"POST",headers:{"x-forward-by-qiuchenly":"/api/v1/uploadManage/chunk/init","x-forward-method-by-qiuchenly":"POST","Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("token")||""}`},body:JSON.stringify({fileName:e,fileSize:a,totalChunks:l})}),n=await s.json()
|
||
return n.success&&(null==(t=n.data)?void 0:t.uploadId)?{success:!0,uploadId:n.data.uploadId}:{success:!1,message:n.message||"初始化分片上传失败"}}(e,l.size,i)
|
||
if(!a.success||!a.uploadId)return{success:!1,message:a.message||"初始化分片上传失败"}
|
||
const n=a.uploadId,u=new Map
|
||
let o=0,c=0
|
||
const d=()=>{if(s){let e=0
|
||
u.forEach(a=>{e+=a})
|
||
const a=Math.round(e/i)
|
||
s(a)}},r=async e=>{const a=e*t,s=Math.min(a+t,l.size),o=l.slice(a,s),r=await async function(e,a,l){const t=new FormData
|
||
t.append("uploadId",e),t.append("chunkIndex",a.toString()),t.append("chunk",l)
|
||
const s=await fetch("/api/proxy",{method:"POST",headers:{"x-forward-by-qiuchenly":"/api/v1/uploadManage/chunk/upload","x-forward-method-by-qiuchenly":"POST",Authorization:`Bearer ${localStorage.getItem("token")||""}`},body:t}),n=await s.json()
|
||
return{success:n.success||!1,message:n.message}}(n,e,o)
|
||
if(!r.success)throw new Error(`分片 ${e+1}/${i} 上传失败: ${r.message}`)
|
||
u.set(e,100),c++,d()},v=async()=>{for(;o<i;){const e=o++
|
||
await r(e)}}
|
||
await Promise.all([v(),v(),v()])
|
||
const p=await async function(e,a){var l
|
||
const t=await fetch("/api/proxy",{method:"POST",headers:{"x-forward-by-qiuchenly":"/api/v1/uploadManage/chunk/complete","x-forward-method-by-qiuchenly":"POST","Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("token")||""}`},body:JSON.stringify({uploadId:e,fileName:a})}),s=await t.json()
|
||
return s.success&&(null==(l=s.data)?void 0:l.fileId)?{success:!0,fileId:s.data.fileId}:{success:!1,message:s.message||"完成分片上传失败"}}(n,e)
|
||
return p.success?{success:!0,fileId:p.fileId}:{success:!1,message:p.message||"完成分片上传失败"}}catch(u){return{success:!1,message:u.message||"分片上传失败"}}}({file:e,onProgress:e=>{Q.value=e,Y.value=`上传中... ${e}%`}})
|
||
if(!a.success||!a.fileId)throw new Error(a.message||"上传失败")
|
||
s=a.fileId}s&&(X.value=e,l("文件上传成功",2e3),setTimeout(()=>{ve(),j.value=!1},1500))}catch(s){t(s.message||"上传失败",3e3)}finally{J.value=!1,Q.value=0,Y.value=""}}
|
||
return o(()=>{ve(),pe()}),c(()=>{window.removeEventListener("scroll",be,!0),window.removeEventListener("resize",be)}),(a,n)=>{var i
|
||
return S(),d("div",Es,[p(e,{tabs:b.value,activeTab:m.value,"onUpdate:activeTab":n[0]||(n[0]=e=>m.value=e)},null,8,["tabs","activeTab"]),"files"===m.value?(S(),d("div",Ns,[h("div",Ds,[h("div",Ps,[h("button",{onClick:we,class:"btn btn-primary"},[p(z,{icon:"mdi:upload"}),n[13]||(n[13]=T(" 上传文件 ",-1))]),h("button",{onClick:ve,class:"btn btn-primary"},[p(z,{icon:"mdi:refresh"}),n[14]||(n[14]=T(" 刷新 ",-1))])])]),h("div",Ms,[x.value?(S(),d("div",Bs,[...n[15]||(n[15]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):U.value?(S(),d("div",zs,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(U.value),1)])):(S(),d("table",Fs,[n[17]||(n[17]=h("thead",null,[h("tr",null,[h("th",null,"文件名"),h("th",null,"大小"),h("th",null,"类型"),h("th",null,"修改时间"),h("th",null,"操作")])],-1)),h("tbody",null,[0===g.value.length?(S(),d("tr",$s,[h("td",Rs,[p(z,{icon:"mdi:file-off"}),n[16]||(n[16]=h("p",null,"暂无文件数据",-1))])])):y("",!0),(S(!0),d(r,null,C(g.value,(e,a)=>(S(),d("tr",{key:e.name||a},[h("td",null,k(e.name),1),h("td",null,k(de(e.size)),1),h("td",null,k(re(e.name)),1),h("td",null,k(ce(e.lastModified)),1),h("td",qs,[h("div",Ls,[h("button",{onClick:a=>(async e=>{K.value=e,G.value={bundleId:"",version:"",fullVersion:"",beta:!1},ne.value=null,Z.value=[],q.value=!0})(e),class:"action-btn edit",title:"绑定到应用"},[p(z,{icon:"mdi:link"})],8,js),h("button",{onClick:a=>(async e=>{if(await s.show({title:"删除文件",message:`确定要删除文件 "${e.name}" 吗?此操作不可恢复!`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const a=await $.deleteSoftwareFile(e.name)
|
||
a.success?(l("文件删除成功",2e3),ve()):t(a.message||"删除失败",3e3)}catch(a){t(a.message||"删除失败",3e3)}})(e),class:"action-btn delete",title:"删除文件"},[p(z,{icon:"mdi:delete"})],8,Os)])])]))),128))])]))])])):y("",!0),"binds"===m.value?(S(),d("div",Ks,[h("div",Gs,[h("div",Ws,[h("button",{onClick:pe,class:"btn btn-primary"},[p(z,{icon:"mdi:refresh"}),n[18]||(n[18]=T(" 刷新 ",-1))])])]),h("div",Hs,[N.value?(S(),d("div",Js,[...n[19]||(n[19]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):P.value?(S(),d("div",Qs,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(P.value),1)])):(S(),d(r,{key:2},[h("table",Ys,[n[21]||(n[21]=h("thead",null,[h("tr",null,[h("th",null,"Bundle ID"),h("th",null,"版本"),h("th",null,"文件名"),h("th",null,"Beta"),h("th",null,"绑定时间"),h("th",null,"操作")])],-1)),h("tbody",null,[0===E.value.length?(S(),d("tr",Xs,[h("td",Zs,[p(z,{icon:"mdi:link-off"}),n[20]||(n[20]=h("p",null,"暂无绑定数据",-1))])])):y("",!0),(S(!0),d(r,null,C(E.value,e=>(S(),d("tr",{key:e._id||e.id},[h("td",null,k(e.bundleId),1),h("td",null,k(e.version),1),h("td",null,k(e.fileId),1),h("td",null,[e.beta?(S(),d("span",en,"Beta")):(S(),d("span",an,"-"))]),h("td",null,k(ce(e.createdAt)),1),h("td",ln,[h("div",tn,[h("button",{onClick:a=>(async e=>{if(await s.show({title:"删除绑定",message:`确定要删除绑定 "${e.bundleId} ${e.version}" 吗?`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const a=e._id||e.id
|
||
if(!a)return void t("绑定ID不存在",2e3)
|
||
const s=await $.deleteBind(a)
|
||
s.success?(l("绑定删除成功",2e3),pe()):t(s.message||"删除失败",3e3)}catch(a){t(a.message||"删除失败",3e3)}})(e),class:"action-btn delete",title:"删除绑定"},[p(z,{icon:"mdi:delete"})],8,sn)])])]))),128))])]),E.value.length>0&&R.value>1?(S(),v(ee,{key:0,"current-page":M.value,"total-pages":R.value,onPageChange:me},null,8,["current-page","total-pages"])):y("",!0)],64))])])):y("",!0),j.value?(S(),d("div",{key:2,class:"modal-overlay",onClick:n[4]||(n[4]=f(e=>j.value=!1,["self"]))},[h("div",nn,[h("div",un,[n[22]||(n[22]=h("h3",null,"上传软件程序文件",-1)),h("button",{onClick:n[1]||(n[1]=e=>j.value=!1),class:"close-btn"},[p(z,{icon:"mdi:close"})])]),h("div",on,[h("div",{class:"upload-area",onClick:Ce,onDragover:n[2]||(n[2]=f(()=>{},["prevent"])),onDrop:f(_e,["prevent"])},[h("input",{ref_key:"uploadFileInputRef",ref:H,type:"file",style:{display:"none"},onChange:xe},null,544),J.value||X.value?J.value?(S(),d("div",dn,[h("div",rn,[h("div",{class:"progress-fill",style:D({width:`${Q.value}%`})},null,4)]),h("p",null,k(Y.value),1)])):X.value?(S(),d("div",vn,[p(z,{icon:"mdi:check-circle"}),h("p",null,"上传成功:"+k(X.value.name),1)])):y("",!0):(S(),d("div",cn,[p(z,{icon:"mdi:cloud-upload"}),n[23]||(n[23]=h("p",null,"点击或拖拽上传文件",-1)),n[24]||(n[24]=h("p",{class:"upload-hint"},"支持 .dmg、.pkg、.app 等格式,大文件将自动分段上传",-1))]))],32)]),h("div",pn,[h("button",{onClick:n[3]||(n[3]=e=>j.value=!1),class:"btn btn-secondary"},"关闭")])])])):y("",!0),q.value?(S(),d("div",{key:3,class:"modal-overlay",onClick:n[12]||(n[12]=f(e=>q.value=!1,["self"]))},[h("div",mn,[h("div",bn,[n[25]||(n[25]=h("h3",null,"绑定文件到应用",-1)),h("button",{onClick:n[5]||(n[5]=e=>q.value=!1),class:"close-btn"},[p(z,{icon:"mdi:close"})])]),h("div",gn,[h("div",yn,[n[26]||(n[26]=h("label",{class:"form-label"},"选择应用:",-1)),h("div",fn,[I(h("input",{ref_key:"bundleIdInputRef",ref:le,"onUpdate:modelValue":n[6]||(n[6]=e=>G.value.bundleId=e),type:"text",placeholder:"输入包名或应用名,如: paral",onInput:ge,onFocus:ye,onBlur:fe,class:"form-input"},null,544),[[w,G.value.bundleId]]),ae.value&&(Z.value.length>0||ue.value)?(S(),d("div",{key:0,ref_key:"autocompleteDropdownRef",ref:te,class:"autocomplete-dropdown",style:D(se.value),onMousedown:n[7]||(n[7]=f(()=>{},["prevent"]))},[ue.value?(S(),d("div",hn," 搜索中... ")):y("",!0),(S(!0),d(r,null,C(Z.value,e=>(S(),d("div",{key:e.bundleId,class:"autocomplete-item",onClick:a=>(e=>{G.value.bundleId=e.bundleId,ne.value=e,e.appVersion&&(G.value.version=e.appVersion),ae.value=!1})(e)},[h("div",{class:V(["app-icon-wrapper",{"has-icon":ke(e)}])},[ke(e)?(S(),d("img",{key:0,src:ke(e),alt:e.appName||e.bundleId,class:"app-icon"},null,8,In)):(S(),d("div",wn,k((e.appName||e.bundleId).charAt(0).toUpperCase()),1))],2),h("div",Cn,[h("div",xn,k(e.appName||e.bundleId),1),h("div",_n,[h("span",Sn,k(e.bundleId),1),e.appVersion?(S(),d("span",An,k(e.appVersion),1)):y("",!0)])])],8,kn))),128))],36)):y("",!0)])]),h("div",{class:V(["selected-app-info",{"is-empty":!ne.value}])},[h("div",Vn,[h("div",{class:V(["app-detail-icon",{"has-icon":ne.value&&ke(ne.value)}])},[ne.value&&ke(ne.value)?(S(),d("img",{key:0,src:ke(ne.value),alt:ne.value.appName||ne.value.bundleId,class:"app-icon-large"},null,8,Un)):(S(),d("div",Tn,k(ne.value?(ne.value.appName||ne.value.bundleId).charAt(0).toUpperCase():"?"),1))],2),h("div",En,[h("div",Nn,k(ne.value?ne.value.appName||ne.value.bundleId:"未选择应用"),1),h("div",Dn,k(ne.value?ne.value.bundleId:"请在上方选择或输入应用"),1)])]),h("div",Pn,[n[27]||(n[27]=h("label",{class:"form-label"},"版本:",-1)),I(h("input",{"onUpdate:modelValue":n[8]||(n[8]=e=>G.value.version=e),type:"text",placeholder:"1.0.0"},null,512),[[w,G.value.version]])]),h("div",Mn,[n[28]||(n[28]=h("label",{class:"form-label"},"完整版本号:",-1)),I(h("input",{"onUpdate:modelValue":n[9]||(n[9]=e=>G.value.fullVersion=e),type:"text",placeholder:"50207.0.2510230924"},null,512),[[w,G.value.fullVersion]])]),h("div",Bn,[p(It,{modelValue:G.value.beta,"onUpdate:modelValue":n[10]||(n[10]=e=>G.value.beta=e),label:"Beta"},null,8,["modelValue"])])],2),h("div",zn,[n[29]||(n[29]=h("label",{class:"form-label"},"文件:",-1)),h("input",{value:null==(i=K.value)?void 0:i.name,type:"text",disabled:""},null,8,Fn)])]),h("div",$n,[h("button",{onClick:n[11]||(n[11]=e=>q.value=!1),class:"btn btn-secondary"},"取消"),h("button",{onClick:Ie,class:"btn btn-primary",disabled:W.value},k(W.value?"绑定中...":"确认绑定"),9,Rn)])])])):y("",!0),p(O,{visible:_(s).visible.value,title:_(s).config.value.title||"",message:_(s).config.value.message||"",type:"danger"===_(s).config.value.type?"error":_(s).config.value.type||"warning","confirm-text":_(s).config.value.confirmText,"cancel-text":_(s).config.value.cancelText,onConfirm:_(s).handleConfirm,onCancel:_(s).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"])])}}}),Ln=q(qn,[["__scopeId","data-v-8dc96897"]]),jn={class:"logs-management"},On={class:"sub-tab-content"},Kn={class:"section-header"},Gn={class:"header-actions"},Wn={class:"table-container"},Hn={key:0,class:"loading-state"},Jn={key:1,class:"error-state"},Qn={class:"data-table"},Yn={key:0},Xn={colspan:"9",class:"empty-state"},Zn={class:"operation-type-badge"},ei={class:"user-info-cell"},ai={class:"user-details"},li={class:"user-name"},ti={class:"user-username"},si=["title"],ni={class:"ip-text"},ii=["onClick"],ui={class:"log-detail-dialog"},oi={class:"dialog-header"},ci={class:"dialog-body"},di={class:"detail-section"},ri={class:"detail-grid"},vi={class:"detail-item"},pi={class:"detail-value"},mi={class:"detail-item"},bi={class:"detail-value"},gi={class:"detail-item"},yi={class:"detail-item"},fi={class:"detail-value path-text"},hi={class:"detail-item"},ki={class:"detail-value"},Ii={class:"detail-item"},wi={class:"detail-item"},Ci={class:"detail-item"},xi={class:"detail-value"},_i={class:"detail-item full-width"},Si={class:"detail-value user-agent-text"},Ai={key:0,class:"detail-section"},Vi={class:"json-viewer"},Ui={key:1,class:"detail-section"},Ti={class:"json-viewer"},Ei={key:2,class:"detail-section"},Ni={class:"json-viewer"},Di=q(s({__name:"LogsManagement",setup(a){const l=e=>{if(!e)return"-"
|
||
try{const a="string"==typeof e?JSON.parse(e):e
|
||
return JSON.stringify(a,null,2)}catch{return e}},t=n("all"),s=u(()=>[{id:"all",label:"所有日志",icon:"mdi:file-document-multiple",badge:null},{id:"my",label:"我的日志",icon:"mdi:account",badge:null}]),i=e=>{t.value=e,"all"===e?L():j()},c=n([]),I=n(!1),w=n(""),x=n(1),_=n(20),A=n(0),U=u(()=>Math.ceil(A.value/_.value)),E=e=>new Date(e).toLocaleString("zh-CN"),N=e=>({upload_app_info:"上传应用信息",upload_image:"上传图片",upload_images:"批量上传图片",bind_file:"绑定文件",delete_bind:"删除绑定",delete_user:"删除用户",upgrade_user:"升级用户",set_user_status:"设置用户状态",download_precracked_package:"下载预破解包",access_forums:"访问论坛",access_posts:"访问帖子",access_comments:"访问评论",access_replies:"访问回复",access_users:"访问用户信息",access_auth:"访问认证",access_notifications:"访问通知",access_issues:"访问问题反馈",access_ratings:"访问评分",access_appinfo:"访问应用信息",access_upload:"访问上传",access_admin:"访问管理后台",access_attachments:"访问附件",access_device_config:"访问设备配置",access_system_config:"访问系统配置",access_server:"访问服务器",access_messages:"访问消息",access_reports:"访问举报",other:"其他操作",UPLOAD_APP_INFO:"上传应用信息",UPLOAD_IMAGE:"上传图片",BIND_FILE:"绑定文件",DELETE_BIND:"删除绑定",DELETE_USER:"删除用户",UPGRADE_USER:"升级用户",SET_USER_STATUS:"设置用户状态",DOWNLOAD_PRECRACKED_PACKAGE:"下载预破解包",ACCESS_FORUMS:"访问论坛",ACCESS_POSTS:"访问帖子",ACCESS_COMMENTS:"访问评论",ACCESS_REPLIES:"访问回复",ACCESS_USERS:"访问用户信息",ACCESS_AUTH:"访问认证",ACCESS_NOTIFICATIONS:"访问通知",ACCESS_ISSUES:"访问问题反馈",ACCESS_RATINGS:"访问评分",ACCESS_APPINFO:"访问应用信息",ACCESS_UPLOAD:"访问上传",ACCESS_ADMIN:"访问管理后台",ACCESS_ATTACHMENTS:"访问附件",ACCESS_DEVICE_CONFIG:"访问设备配置",ACCESS_SYSTEM_CONFIG:"访问系统配置",ACCESS_SERVER:"访问服务器",ACCESS_MESSAGES:"访问消息",ACCESS_REPORTS:"访问举报",OTHER:"其他操作"}[String(e)]||String(e)),D=e=>e||0===e?e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`:"-",P=e=>e&&{GET:"method-get",POST:"method-post",PUT:"method-put",DELETE:"method-delete",PATCH:"method-patch"}[e.toUpperCase()]||"",M=e=>e?e>=200&&e<300?"status-success":e>=300&&e<400?"status-redirect":e>=400&&e<500?"status-client-error":e>=500?"status-server-error":"":"",B=e=>e||0===e?e<100?"duration-fast":e<500?"duration-normal":e<1e3?"duration-slow":"duration-very-slow":"",F=n(null),R=n(!1),q=()=>{R.value=!1,F.value=null},L=async()=>{I.value=!0,w.value=""
|
||
try{const e=await $.getOperationLogs(x.value,_.value)
|
||
if(e.success&&e.data){c.value=e.data.logs||e.data.list||e.data||[]
|
||
const a=e.data.total||e.data.count||c.value.length
|
||
A.value=a}else w.value=e.message||"加载操作日志失败"}catch(e){w.value=e.message||"加载操作日志失败"}finally{I.value=!1}},j=async()=>{I.value=!0,w.value=""
|
||
try{const e=await $.getMyOperationLogs(x.value,_.value)
|
||
if(e.success&&e.data){c.value=e.data.logs||e.data.list||e.data||[]
|
||
const a=e.data.total||e.data.count||c.value.length
|
||
A.value=a}else w.value=e.message||"加载操作日志失败"}catch(e){w.value=e.message||"加载操作日志失败"}finally{I.value=!1}},O=e=>{x.value=e,"all"===t.value?L():j()}
|
||
return o(()=>{L()}),(a,n)=>(S(),d("div",jn,[p(e,{tabs:s.value,activeTab:t.value,"onUpdate:activeTab":i},null,8,["tabs","activeTab"]),h("div",On,[h("div",Kn,[h("div",Gn,[h("button",{class:"btn btn-primary",onClick:n[0]||(n[0]=e=>"all"===t.value?L():j())},[p(z,{icon:"mdi:refresh",class:"btn-icon"}),n[2]||(n[2]=T(" 刷新 ",-1))])])]),h("div",Wn,[I.value?(S(),d("div",Hn,[...n[3]||(n[3]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):w.value?(S(),d("div",Jn,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(w.value),1),h("button",{class:"btn btn-primary",onClick:n[1]||(n[1]=e=>"all"===t.value?L():j())}," 重试 ")])):(S(),d(r,{key:2},[h("table",Qn,[n[5]||(n[5]=h("thead",null,[h("tr",null,[h("th",null,"操作类型"),h("th",null,"用户"),h("th",null,"方法"),h("th",null,"接口路径"),h("th",null,"IP地址"),h("th",null,"状态码"),h("th",null,"耗时"),h("th",null,"时间"),h("th",null,"操作")])],-1)),h("tbody",null,[0===c.value.length?(S(),d("tr",Yn,[h("td",Xn,[p(z,{icon:"mdi:file-document-outline"}),n[4]||(n[4]=h("p",null,"暂无日志数据",-1))])])):y("",!0),(S(!0),d(r,null,C(c.value,e=>{var a,l,t,s,n,i
|
||
return S(),d("tr",{key:e._id||e.id},[h("td",null,[h("span",Zn,k(N(e.operationType)),1)]),h("td",null,[h("div",ei,[p(G,{"avatar-id":null==(a=e.user)?void 0:a.avatar,width:32,height:32,"user-name":(null==(l=e.user)?void 0:l.nickName)||(null==(t=e.user)?void 0:t.username)||e.username,class:"user-avatar"},null,8,["avatar-id","user-name"]),h("div",ai,[h("div",li,k((null==(s=e.user)?void 0:s.nickName)||(null==(n=e.user)?void 0:n.username)||e.username||"-"),1),h("div",ti,"@"+k((null==(i=e.user)?void 0:i.username)||e.username||"-"),1)])])]),h("td",null,[h("span",{class:V(["method-badge",P(e.method)])},k(e.method||"-"),3)]),h("td",null,[h("span",{class:"path-text",title:e.path},k(e.path||"-"),9,si)]),h("td",null,[h("span",ni,k(e.ip||"-"),1)]),h("td",null,[h("span",{class:V(["status-badge",M(e.responseStatus)])},k(e.responseStatus||"-"),3)]),h("td",null,[h("span",{class:V(["duration-text",B(e.duration)])},k(D(e.duration)),3)]),h("td",null,k(E(e.createdAt)),1),h("td",null,[h("button",{class:"action-btn view",onClick:a=>(e=>{F.value=e,R.value=!0})(e),title:"查看详情"},[p(z,{icon:"mdi:eye"})],8,ii)])])}),128))])]),U.value>1?(S(),v(ee,{key:0,"current-page":x.value,"total-pages":U.value,total:A.value,onPageChange:O},null,8,["current-page","total-pages","total"])):y("",!0)],64))])]),(S(),v(m,{to:"body"},[p(b,{name:"fade"},{default:g(()=>{var e,a
|
||
return[R.value&&F.value?(S(),d("div",{key:0,class:"log-detail-overlay",onClick:f(q,["self"])},[h("div",ui,[h("div",oi,[n[6]||(n[6]=h("h3",{class:"dialog-title"},"日志详情",-1)),h("button",{class:"close-btn",onClick:q,type:"button"},[p(z,{icon:"mdi:close"})])]),h("div",ci,[h("div",di,[n[16]||(n[16]=h("h4",{class:"section-title"},"基本信息",-1)),h("div",ri,[h("div",vi,[n[7]||(n[7]=h("span",{class:"detail-label"},"操作类型:",-1)),h("span",pi,k(N(F.value.operationType)),1)]),h("div",mi,[n[8]||(n[8]=h("span",{class:"detail-label"},"用户:",-1)),h("span",bi,k((null==(e=F.value.user)?void 0:e.nickName)||(null==(a=F.value.user)?void 0:a.username)||F.value.username||"-"),1)]),h("div",gi,[n[9]||(n[9]=h("span",{class:"detail-label"},"HTTP方法:",-1)),h("span",{class:V(["detail-value method-badge",P(F.value.method)])},k(F.value.method||"-"),3)]),h("div",yi,[n[10]||(n[10]=h("span",{class:"detail-label"},"接口路径:",-1)),h("span",fi,k(F.value.path||"-"),1)]),h("div",hi,[n[11]||(n[11]=h("span",{class:"detail-label"},"IP地址:",-1)),h("span",ki,k(F.value.ip||"-"),1)]),h("div",Ii,[n[12]||(n[12]=h("span",{class:"detail-label"},"状态码:",-1)),h("span",{class:V(["detail-value status-badge",M(F.value.responseStatus)])},k(F.value.responseStatus||"-"),3)]),h("div",wi,[n[13]||(n[13]=h("span",{class:"detail-label"},"耗时:",-1)),h("span",{class:V(["detail-value duration-text",B(F.value.duration)])},k(D(F.value.duration)),3)]),h("div",Ci,[n[14]||(n[14]=h("span",{class:"detail-label"},"时间:",-1)),h("span",xi,k(E(F.value.createdAt)),1)]),h("div",_i,[n[15]||(n[15]=h("span",{class:"detail-label"},"User-Agent:",-1)),h("span",Si,k(F.value.userAgent||"-"),1)])])]),F.value.requestParams?(S(),d("div",Ai,[n[17]||(n[17]=h("h4",{class:"section-title"},"请求参数",-1)),h("pre",Vi,k(l(F.value.requestParams)),1)])):y("",!0),F.value.requestBody?(S(),d("div",Ui,[n[18]||(n[18]=h("h4",{class:"section-title"},"请求体",-1)),h("pre",Ti,k(l(F.value.requestBody)),1)])):y("",!0),F.value.responseData?(S(),d("div",Ei,[n[19]||(n[19]=h("h4",{class:"section-title"},"响应数据",-1)),h("pre",Ni,k(l(F.value.responseData)),1)])):y("",!0)]),h("div",{class:"dialog-footer"},[h("button",{class:"btn btn-primary",onClick:q},"关闭")])])])):y("",!0)]}),_:1})]))]))}}),[["__scopeId","data-v-fa40727f"]]),Pi={class:"settings-management"},Mi={key:0,class:"minio-config-section"},Bi={class:"section-header"},zi={class:"header-actions"},Fi=["disabled"],$i={key:0,class:"loading-state"},Ri={key:1,class:"error-state"},qi={key:2,class:"minio-config-form"},Li={class:"config-grid"},ji={class:"config-item"},Oi={class:"config-item"},Ki={class:"config-item config-item-checkbox"},Gi={class:"config-item"},Wi={class:"config-item"},Hi={class:"config-item"},Ji={class:"config-item"},Qi={class:"config-item"},Yi={class:"form-actions"},Xi=["disabled"],Zi={class:"device-config-section"},eu={class:"sub-tabs"},au=["onClick"],lu={class:"table-container"},tu={class:"table-header"},su={key:0,class:"loading-state"},nu={key:1,class:"error-state"},iu={key:2,class:"data-table"},uu={key:0},ou={colspan:"3",class:"empty-state"},cu={class:"action-buttons"},du=["onClick"],ru=["onClick"],vu=q(s({__name:"SettingsManagement",setup(e){const{success:a,error:l}=B(),t=L(),{isQiuChenLy:s}=j(),u=n({endPoint:"",port:443,useSSL:!1,accessKey:"",secretKey:"",defaultBucket:"",defaultIconBucket:"",defaultAppImageBucket:""}),c=n(!1),m=n(""),b=n(!1),g=n(!1),f=n("device_type"),x=n([]),A=n(!1),U=n(""),E=n(null),N=n(!1),D=[{value:"device_type",label:"设备类型",icon:"fluent-color:device-24"},{value:"system_type",label:"系统类型",icon:"fluent-color:desktop-24"},{value:"processor_type",label:"处理器类型",icon:"fluent-color:cpu-24"}],P=()=>{},M=async()=>{if(s.value){c.value=!0,m.value=""
|
||
try{const e=await $.getMinioConfig()
|
||
e.success&&e.data?u.value={endPoint:e.data["minio.endPoint"]||"",port:parseInt(e.data["minio.port"]||"443",10),useSSL:"true"===e.data["minio.useSSL"],accessKey:e.data["minio.accessKey"]||"",secretKey:e.data["minio.secretKey"]||"",defaultBucket:e.data["minio.defaultBucket"]||"",defaultIconBucket:e.data["minio.defaultIconBucket"]||"",defaultAppImageBucket:e.data["minio.defaultAppImageBucket"]||""}:m.value=e.message||"加载配置失败"}catch(e){m.value=e.message||"加载配置失败",l(e.message||"加载配置失败",3e3)}finally{c.value=!1}}},F=async()=>{var e,t
|
||
if(s.value){b.value=!0
|
||
try{const e={endPoint:u.value.endPoint,port:u.value.port,useSSL:u.value.useSSL,accessKey:u.value.accessKey,defaultBucket:u.value.defaultBucket,defaultIconBucket:u.value.defaultIconBucket,defaultAppImageBucket:u.value.defaultAppImageBucket}
|
||
u.value.secretKey&&(e.secretKey=u.value.secretKey)
|
||
const t=await $.updateMinioConfig(e)
|
||
t.success?(a(t.message||"配置保存成功",2e3),u.value.secretKey="",await M()):l(t.message||"保存配置失败",3e3)}catch(n){l((null==(t=null==(e=n.response)?void 0:e.data)?void 0:t.message)||n.message||"保存配置失败",3e3)}finally{b.value=!1}}},R=async()=>{var e,t,n
|
||
if(s.value){g.value=!0
|
||
try{const t=await $.testMinioConnection()
|
||
t.success&&(null==(e=t.data)?void 0:e.connected)?a("MinIO连接测试成功",2e3):l(t.message||"MinIO连接测试失败",3e3)}catch(i){l((null==(n=null==(t=i.response)?void 0:t.data)?void 0:n.message)||i.message||"MinIO连接测试失败",3e3)}finally{g.value=!1}}},q=async()=>{A.value=!0,U.value=""
|
||
try{const e=await $.getAllDeviceConfigs(f.value)
|
||
e.success&&e.data?x.value=e.data:U.value=e.message||"加载配置列表失败"}catch(e){U.value=e.message||"加载配置列表失败",l(e.message||"加载配置列表失败",3e3)}finally{A.value=!1}},O=()=>{E.value={type:f.value,value:""},N.value=!0},K=async e=>{var t,s
|
||
if(E.value)try{let t
|
||
t=E.value._id?await $.updateDeviceConfig(E.value._id,{value:e.value}):await $.createDeviceConfig({type:f.value,value:e.value}),t.success?(a(E.value._id?"配置已更新":"配置已创建",2e3),N.value=!1,E.value=null,await q()):l(t.message||"保存失败",3e3)}catch(n){l((null==(s=null==(t=n.response)?void 0:t.data)?void 0:s.message)||n.message||"保存失败",3e3)}},G=()=>{N.value=!1,E.value=null}
|
||
return i(f,()=>{q()}),o(()=>{s.value&&M(),q()}),(e,n)=>{var i
|
||
return S(),d("div",Pi,[n[25]||(n[25]=h("div",{class:"section-header"},[h("h2",null,"系统设置")],-1)),h("div",{class:"settings-list"},[h("div",{class:"setting-item"},[n[8]||(n[8]=h("div",{class:"setting-info"},[h("h3",null,"内容审核设置"),h("p",null,"配置内容审核规则和自动处理")],-1)),h("button",{class:"btn btn-primary",onClick:P},"配置")])]),_(s)?(S(),d("div",Mi,[h("div",Bi,[n[10]||(n[10]=h("h2",null,"MinIO存储配置",-1)),h("div",zi,[h("button",{class:"btn btn-secondary",onClick:R,disabled:g.value},[p(z,{icon:"mdi:connection"}),T(" "+k(g.value?"测试中...":"测试连接"),1)],8,Fi),h("button",{class:"btn btn-primary",onClick:M},[p(z,{icon:"mdi:refresh"}),n[9]||(n[9]=T(" 刷新 ",-1))])])]),c.value?(S(),d("div",$i,[...n[11]||(n[11]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):m.value?(S(),d("div",Ri,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(m.value),1),h("button",{class:"btn btn-primary",onClick:M},"重试")])):(S(),d("div",qi,[h("div",Li,[h("div",ji,[n[12]||(n[12]=h("label",{class:"config-label"},"服务器地址",-1)),I(h("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>u.value.endPoint=e),type:"text",class:"config-input",placeholder:"https://file.example.com/minio"},null,512),[[w,u.value.endPoint]])]),h("div",Oi,[n[13]||(n[13]=h("label",{class:"config-label"},"端口",-1)),I(h("input",{"onUpdate:modelValue":n[1]||(n[1]=e=>u.value.port=e),type:"number",class:"config-input",placeholder:"443"},null,512),[[w,u.value.port,void 0,{number:!0}]])]),h("div",Ki,[p(It,{modelValue:u.value.useSSL,"onUpdate:modelValue":n[2]||(n[2]=e=>u.value.useSSL=e),label:"使用SSL"},null,8,["modelValue"])]),h("div",Gi,[n[14]||(n[14]=h("label",{class:"config-label"},"Access Key",-1)),I(h("input",{"onUpdate:modelValue":n[3]||(n[3]=e=>u.value.accessKey=e),type:"text",class:"config-input",placeholder:"访问密钥"},null,512),[[w,u.value.accessKey]])]),h("div",Wi,[n[15]||(n[15]=h("label",{class:"config-label"},"Secret Key",-1)),I(h("input",{"onUpdate:modelValue":n[4]||(n[4]=e=>u.value.secretKey=e),type:"password",class:"config-input",placeholder:"密钥"},null,512),[[w,u.value.secretKey]])]),h("div",Hi,[n[16]||(n[16]=h("label",{class:"config-label"},"默认存储桶",-1)),I(h("input",{"onUpdate:modelValue":n[5]||(n[5]=e=>u.value.defaultBucket=e),type:"text",class:"config-input",placeholder:"macos"},null,512),[[w,u.value.defaultBucket]])]),h("div",Ji,[n[17]||(n[17]=h("label",{class:"config-label"},"图标存储桶",-1)),I(h("input",{"onUpdate:modelValue":n[6]||(n[6]=e=>u.value.defaultIconBucket=e),type:"text",class:"config-input",placeholder:"macos-icon"},null,512),[[w,u.value.defaultIconBucket]])]),h("div",Qi,[n[18]||(n[18]=h("label",{class:"config-label"},"应用图片存储桶",-1)),I(h("input",{"onUpdate:modelValue":n[7]||(n[7]=e=>u.value.defaultAppImageBucket=e),type:"text",class:"config-input",placeholder:"macos-app-image"},null,512),[[w,u.value.defaultAppImageBucket]])])]),h("div",Yi,[h("button",{class:"btn btn-primary",onClick:F,disabled:b.value},k(b.value?"保存中...":"保存配置"),9,Xi)])]))])):y("",!0),h("div",Zi,[n[24]||(n[24]=h("div",{class:"section-header"},[h("h2",null,"设备配置管理")],-1)),h("div",eu,[(S(),d(r,null,C(D,e=>h("button",{key:e.value,class:V(["sub-tab-button",{active:f.value===e.value}]),onClick:a=>f.value=e.value},[p(z,{icon:e.icon,class:"sub-tab-icon"},null,8,["icon"]),h("span",null,k(e.label),1)],10,au)),64))]),h("div",lu,[h("div",tu,[h("button",{class:"btn btn-primary",onClick:O},[p(z,{icon:"mdi:plus"}),n[19]||(n[19]=T(" 添加配置 ",-1))]),h("button",{class:"btn btn-secondary",onClick:q},[p(z,{icon:"mdi:refresh"}),n[20]||(n[20]=T(" 刷新 ",-1))])]),A.value?(S(),d("div",su,[...n[21]||(n[21]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):U.value?(S(),d("div",nu,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(U.value),1),h("button",{class:"btn btn-primary",onClick:q},"重试")])):(S(),d("table",iu,[n[23]||(n[23]=h("thead",null,[h("tr",null,[h("th",null,"配置值"),h("th",null,"创建时间"),h("th",null,"操作")])],-1)),h("tbody",null,[0===x.value.length?(S(),d("tr",uu,[h("td",ou,[p(z,{icon:"mdi:database-off"}),n[22]||(n[22]=h("p",null,"暂无配置数据",-1))])])):y("",!0),(S(!0),d(r,null,C(x.value,e=>{return S(),d("tr",{key:e._id},[h("td",null,k(e.value),1),h("td",null,k((s=e.createdAt,new Date(s).toLocaleString("zh-CN"))),1),h("td",null,[h("div",cu,[h("button",{class:"action-btn edit",onClick:a=>(e=>{E.value={...e},N.value=!0})(e),title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,du),h("button",{class:"action-btn delete",onClick:s=>(async e=>{var s,n
|
||
if(await t.show({title:"确认删除",message:`确定要删除配置 "${e.value}" 吗?此操作不可恢复。`,type:"warning"}))try{const t=await $.deleteDeviceConfig(e._id)
|
||
t.success?(a("配置已删除",2e3),await q()):l(t.message||"删除失败",3e3)}catch(i){l((null==(n=null==(s=i.response)?void 0:s.data)?void 0:n.message)||i.message||"删除失败",3e3)}})(e),title:"删除"},[p(z,{icon:"mdi:delete"})],8,ru)])])])
|
||
var s}),128))])]))])]),E.value?(S(),v(ba,{key:1,visible:N.value,title:E.value._id?"编辑配置":"添加配置",message:`${(null==(i=D.find(e=>e.value===f.value))?void 0:i.label)||""}配置`,fields:[{key:"value",label:"配置值",placeholder:"请输入配置值",type:"text",required:!0,defaultValue:E.value.value??""}],"confirm-text":"保存","cancel-text":"取消",onConfirm:K,onCancel:G},null,8,["visible","title","message","fields"])):y("",!0)])}}}),[["__scopeId","data-v-4e88d498"]]),pu={class:"ip-ban-management"},mu={class:"section-header"},bu={class:"header-actions"},gu={class:"table-container"},yu={key:0,class:"loading-state"},fu={key:1,class:"error-state"},hu={class:"data-table"},ku={key:0},Iu={colspan:"8",class:"empty-state"},wu={class:"ip-text"},Cu={key:0,class:"username-text"},xu={key:1,class:"text-muted"},_u=["title"],Su={key:0},Au={key:1,class:"text-muted"},Vu={class:"action-buttons"},Uu=["onClick"],Tu=q(s({__name:"IpBanManagement",setup(e){const{toasts:a,success:l,error:t,removeToast:s}=B(),c=L(),m=n(""),b=n(""),g=n([]),f=[{value:"",label:"全部状态",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"banned",label:"已封禁",icon:"fluent-color:shield-dismiss-24"},{value:"unbanned",label:"已解封",icon:"fluent-color:checkmark-circle-24"}],x=n(!1),A=n(""),U=n(1),E=n(20),N=n(0),D=u(()=>Math.ceil(N.value/E.value)),P=e=>new Date(e).toLocaleString("zh-CN"),M=async()=>{x.value=!0,A.value=""
|
||
try{const e="unbanned"===b.value||"banned"!==b.value&&void 0,a=await $.getIpBans(U.value,E.value,m.value||void 0,e)
|
||
a.success&&a.data?(g.value=a.data.bans||[],N.value=a.data.total||0):A.value=a.message||"加载IP封禁列表失败"}catch(e){A.value=e.message||"加载IP封禁列表失败"}finally{x.value=!1}},R=()=>{U.value=1,M()}
|
||
i(b,()=>{U.value=1,M()})
|
||
const q=e=>{U.value=e,M()}
|
||
return o(()=>{M()}),(e,n)=>(S(),d("div",pu,[h("div",mu,[n[3]||(n[3]=h("h2",null,"IP封禁管理",-1)),h("div",bu,[I(h("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>m.value=e),type:"text",placeholder:"搜索IP地址...",class:"search-input",onInput:R},null,544),[[w,m.value]]),p(X,{modelValue:b.value,"onUpdate:modelValue":n[1]||(n[1]=e=>b.value=e),options:f},null,8,["modelValue"]),h("button",{class:"btn btn-secondary",onClick:M},[p(z,{icon:"mdi:refresh",class:"btn-icon"}),n[2]||(n[2]=T(" 刷新 ",-1))])])]),h("div",gu,[x.value?(S(),d("div",yu,[...n[4]||(n[4]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):A.value?(S(),d("div",fu,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(A.value),1),h("button",{class:"btn btn-primary",onClick:M},"重试")])):(S(),d(r,{key:2},[h("table",hu,[n[6]||(n[6]=h("thead",null,[h("tr",null,[h("th",null,"IP地址"),h("th",null,"被封禁用户"),h("th",null,"封禁原因"),h("th",null,"封禁时间"),h("th",null,"过期时间"),h("th",null,"封禁操作者"),h("th",null,"状态"),h("th",null,"操作")])],-1)),h("tbody",null,[0===g.value.length?(S(),d("tr",ku,[h("td",Iu,[p(z,{icon:"mdi:shield-off"}),n[5]||(n[5]=h("p",null,"暂无IP封禁记录",-1))])])):y("",!0),(S(!0),d(r,null,C(g.value,e=>(S(),d("tr",{key:e.id},[h("td",null,[h("span",wu,k(e.ip),1)]),h("td",null,[e.bannedUsername?(S(),d("span",Cu,k(e.bannedUsername),1)):(S(),d("span",xu,"-"))]),h("td",null,[h("span",{class:"reason-text",title:e.reason},k(e.reason),9,_u)]),h("td",null,k(P(e.bannedAt)),1),h("td",null,[e.expiresAt?(S(),d("span",Su,k(P(e.expiresAt)),1)):(S(),d("span",Au,"永久"))]),h("td",null,k(e.bannedByUsername),1),h("td",null,[h("span",{class:V(["status-badge",e.isUnbanned?"unbanned":"banned"])},k(e.isUnbanned?"已解封":"已封禁"),3)]),h("td",null,[h("div",Vu,[h("button",{class:"action-btn delete",onClick:a=>(async e=>{var a,s
|
||
if(await c.show({title:"删除IP封禁记录",message:`确定要删除IP ${e.ip} 的封禁记录吗?这将删除数据库记录、Redis封禁记录和速率限制记录。此操作不可恢复。`,confirmText:"确定删除",cancelText:"取消",type:"danger"}))try{const a=await $.deleteIpBan(e.id)
|
||
a.success?(l("IP封禁记录删除成功",2e3),M()):t(a.message||"删除IP封禁记录失败",3e3)}catch(n){t((null==(s=null==(a=n.response)?void 0:a.data)?void 0:s.message)||n.message||"删除IP封禁记录失败",3e3)}})(e),title:"删除IP封禁记录"},[p(z,{icon:"mdi:delete"})],8,Uu)])])]))),128))])]),D.value>1?(S(),v(ee,{key:0,"current-page":U.value,"total-pages":D.value,total:N.value,onPageChange:q},null,8,["current-page","total-pages","total"])):y("",!0)],64))]),p(O,{visible:_(c).visible.value,title:_(c).config.value.title,message:_(c).config.value.message,type:_(c).config.value.type||"warning","confirm-text":_(c).config.value.confirmText||"确认","cancel-text":_(c).config.value.cancelText||"取消",onConfirm:_(c).handleConfirm,onCancel:_(c).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"]),p(F,{toasts:_(a),onRemove:_(s)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-c1875830"]]),Eu={class:"modal-header"},Nu={class:"modal-content"},Du={class:"form-group"},Pu={key:0,class:"upload-placeholder"},Mu={key:1,class:"upload-progress"},Bu={class:"progress-bar"},zu={key:2,class:"upload-preview"},Fu=["src"],$u={class:"form-group"},Ru={class:"form-group"},qu={class:"form-group"},Lu={class:"form-group"},ju={class:"action-config"},Ou={class:"form-group"},Ku={class:"action-config"},Gu={class:"form-group"},Wu={class:"form-group checkbox-group"},Hu={class:"checkbox-label"},Ju={class:"modal-footer"},Qu=["disabled"],Yu=q(s({__name:"CarouselEditDialog",props:{visible:{type:Boolean},carousel:{default:null}},emits:["close","success"],setup(e,{emit:a}){const{success:l,error:t}=B(),s=e,u=a,o=n(null),c=n(!1),r=n(0),C=n(""),x=n(!1),_=n(null),A=n({imageId:"",type:"image",title:"",description:"",price:"",primaryAction:{label:"",route:"",url:""},secondaryAction:{label:"",route:"",url:""},order:0,enabled:!0})
|
||
i(()=>s.carousel,e=>{e?(A.value={imageId:e.imageId,type:e.type,title:e.title,description:e.description||"",price:e.price||"",primaryAction:e.primaryAction||{label:"",route:"",url:""},secondaryAction:e.secondaryAction||{label:"",route:"",url:""},order:e.order,enabled:e.enabled},U(e.imageId)):V()},{immediate:!0})
|
||
const V=()=>{A.value={imageId:"",type:"image",title:"",description:"",price:"",primaryAction:{label:"",route:"",url:""},secondaryAction:{label:"",route:"",url:""},order:0,enabled:!0},_.value=null,r.value=0,C.value=""},U=async e=>{if(e)try{const a=await $.getImage(e)
|
||
_.value=a}catch(a){}},T=()=>{var e
|
||
null==(e=o.value)||e.click()},E=e=>{var a
|
||
const l=null==(a=e.target.files)?void 0:a[0]
|
||
l&&M(l)},N=e=>{var a
|
||
e.preventDefault()
|
||
const l=null==(a=e.dataTransfer)?void 0:a.files[0]
|
||
l&&l.type.startsWith("image/")&&M(l)},M=async e=>{c.value=!0,r.value=0,C.value="准备上传..."
|
||
try{const a=5242880
|
||
let t
|
||
if(e.size<=a){C.value="上传中..."
|
||
const a=await $.uploadFile(R.APP_IMAGE,e,e=>{r.value=e})
|
||
if(!a.success||!a.fileId)throw new Error(a.message||"上传失败")
|
||
t=a.fileId}else{C.value="初始化分段上传..."
|
||
const a=await ce({file:e,onProgress:e=>{r.value=e,C.value=`上传中... ${e}%`}})
|
||
if(!a.success||!a.attachmentId)throw new Error(a.message||"上传失败")
|
||
t=a.attachmentId}t&&(A.value.imageId=t,await U(t),l("图片上传成功",2e3))}catch(a){t(a.message||"上传失败",3e3)}finally{c.value=!1,r.value=0,C.value=""}},F=()=>{A.value.imageId="",_.value=null},q=()=>{u("close")},L=async()=>{var e,a
|
||
if(A.value.imageId&&A.value.title){x.value=!0
|
||
try{const n={imageId:A.value.imageId,type:A.value.type,title:A.value.title,description:A.value.description||void 0,price:A.value.price||void 0,order:A.value.order,enabled:A.value.enabled}
|
||
let i;(null==(e=A.value.primaryAction)?void 0:e.label)&&(n.primaryAction={label:A.value.primaryAction.label,route:A.value.primaryAction.route||void 0,url:A.value.primaryAction.url||void 0}),(null==(a=A.value.secondaryAction)?void 0:a.label)&&(n.secondaryAction={label:A.value.secondaryAction.label,route:A.value.secondaryAction.route||void 0,url:A.value.secondaryAction.url||void 0}),i=s.carousel?await $.updateCarousel(s.carousel._id,n):await $.createCarousel(n),i.success?(l(s.carousel?"更新成功":"创建成功",2e3),u("success")):t(i.message||"操作失败",3e3)}catch(n){t(n.message||"操作失败",3e3)}finally{x.value=!1}}else t("请填写必填项",2e3)}
|
||
return(a,l)=>(S(),v(m,{to:"body"},[p(b,{name:"modal-fade"},{default:g(()=>[e.visible?(S(),d("div",{key:0,class:"modal-overlay",onClick:f(q,["self"])},[h("div",{class:"modal-dialog",onClick:l[12]||(l[12]=f(()=>{},["stop"]))},[h("div",Eu,[h("h3",null,k(a.editingCarousel?"编辑轮播图":"添加轮播图"),1),h("button",{onClick:q,class:"close-btn"},[p(z,{icon:"mdi:close"})])]),h("div",Nu,[h("div",Du,[l[15]||(l[15]=h("label",{class:"form-label"},"背景图片 *",-1)),h("div",{class:"upload-area",onClick:T,onDragover:l[0]||(l[0]=f(()=>{},["prevent"])),onDrop:f(N,["prevent"])},[h("input",{ref_key:"fileInputRef",ref:o,type:"file",accept:"image/*",style:{display:"none"},onChange:E},null,544),A.value.imageId||c.value?c.value?(S(),d("div",Mu,[h("div",Bu,[h("div",{class:"progress-fill",style:D({width:`${r.value}%`})},null,4)]),h("p",null,k(C.value),1)])):A.value.imageId?(S(),d("div",zu,[h("img",{src:_.value,alt:"预览"},null,8,Fu),h("button",{class:"remove-btn",onClick:f(F,["stop"])},[p(z,{icon:"mdi:close"})])])):y("",!0):(S(),d("div",Pu,[p(z,{icon:"mdi:cloud-upload"}),l[13]||(l[13]=h("p",null,"点击或拖拽上传图片",-1)),l[14]||(l[14]=h("p",{class:"upload-hint"},"支持 JPG、PNG 等格式,大文件将自动分段上传",-1))]))],32)]),h("div",$u,[l[16]||(l[16]=h("label",{class:"form-label"},"标题 *",-1)),I(h("input",{"onUpdate:modelValue":l[1]||(l[1]=e=>A.value.title=e),type:"text",placeholder:"请输入标题"},null,512),[[w,A.value.title]])]),h("div",Ru,[l[17]||(l[17]=h("label",{class:"form-label"},"描述",-1)),I(h("textarea",{"onUpdate:modelValue":l[2]||(l[2]=e=>A.value.description=e),placeholder:"请输入描述",rows:"3"},null,512),[[w,A.value.description]])]),h("div",qu,[l[18]||(l[18]=h("label",{class:"form-label"},"价格",-1)),I(h("input",{"onUpdate:modelValue":l[3]||(l[3]=e=>A.value.price=e),type:"text",placeholder:"例如:免费、¥99"},null,512),[[w,A.value.price]])]),h("div",Lu,[l[19]||(l[19]=h("label",{class:"form-label"},"主操作按钮",-1)),h("div",ju,[I(h("input",{"onUpdate:modelValue":l[4]||(l[4]=e=>A.value.primaryAction.label=e),type:"text",placeholder:"按钮文字"},null,512),[[w,A.value.primaryAction.label]]),I(h("input",{"onUpdate:modelValue":l[5]||(l[5]=e=>A.value.primaryAction.route=e),type:"text",placeholder:"路由路径(可选)"},null,512),[[w,A.value.primaryAction.route]]),I(h("input",{"onUpdate:modelValue":l[6]||(l[6]=e=>A.value.primaryAction.url=e),type:"text",placeholder:"外部URL(可选)"},null,512),[[w,A.value.primaryAction.url]])])]),h("div",Ou,[l[20]||(l[20]=h("label",{class:"form-label"},"次操作按钮",-1)),h("div",Ku,[I(h("input",{"onUpdate:modelValue":l[7]||(l[7]=e=>A.value.secondaryAction.label=e),type:"text",placeholder:"按钮文字"},null,512),[[w,A.value.secondaryAction.label]]),I(h("input",{"onUpdate:modelValue":l[8]||(l[8]=e=>A.value.secondaryAction.route=e),type:"text",placeholder:"路由路径(可选)"},null,512),[[w,A.value.secondaryAction.route]]),I(h("input",{"onUpdate:modelValue":l[9]||(l[9]=e=>A.value.secondaryAction.url=e),type:"text",placeholder:"外部URL(可选)"},null,512),[[w,A.value.secondaryAction.url]])])]),h("div",Gu,[l[21]||(l[21]=h("label",{class:"form-label"},"排序",-1)),I(h("input",{"onUpdate:modelValue":l[10]||(l[10]=e=>A.value.order=e),type:"number",placeholder:"数字越小越靠前"},null,512),[[w,A.value.order,void 0,{number:!0}]])]),h("div",Wu,[h("label",Hu,[I(h("input",{"onUpdate:modelValue":l[11]||(l[11]=e=>A.value.enabled=e),type:"checkbox"},null,512),[[P,A.value.enabled]]),l[22]||(l[22]=h("span",null,"启用",-1))])])]),h("div",Ju,[h("button",{onClick:q,class:"btn btn-secondary"},"取消"),h("button",{onClick:L,class:"btn btn-primary",disabled:x.value||!A.value.imageId||!A.value.title},k(x.value?"提交中...":"确认"),9,Qu)])])])):y("",!0)]),_:1})]))}}),[["__scopeId","data-v-1324a06b"]]),Xu={class:"carousel-management"},Zu={class:"section-header"},eo={class:"header-actions"},ao={class:"table-container"},lo={key:0,class:"loading-state"},to={key:1,class:"error-state"},so={key:2,class:"data-table"},no={key:0},io={colspan:"6",class:"empty-state"},uo={class:"preview-cell"},oo=["src","alt","onClick","onError"],co={key:1,class:"thumbnail-placeholder"},ro={class:"actions"},vo=["onClick"],po=["onClick"],mo=["onClick"],bo=q(s({__name:"CarouselManagement",setup(e){const{success:a,error:l}=B(),t=L(),s=n([]),i=n(!1),u=n(""),c=n(!1),m=n(null),b=n(!1),g=n([]),f=n(0),I=n({}),w=n({}),x=async()=>{i.value=!0,u.value=""
|
||
try{const e=await $.getCarousels()
|
||
e.success&&e.data?(s.value=e.data.sort((e,a)=>e.order-a.order),s.value.forEach(e=>{e.imageId&&!I.value[e._id]&&_(e)})):u.value=e.message||"加载轮播图列表失败"}catch(e){u.value=e.message||"加载轮播图列表失败"}finally{i.value=!1}},_=async e=>{if(e.imageId&&!I.value[e._id])try{const a=await $.getImage(e.imageId,80,120,80)
|
||
I.value[e._id]=a,w.value[e._id]=!1}catch(a){w.value[e._id]=!0}},A=e=>e.imageId&&I.value[e._id]&&!w.value[e._id]?I.value[e._id]:null,U=()=>{m.value=null,c.value=!0},E=()=>{c.value=!1,m.value=null,x()},N=async e=>{if(e.imageId)try{const a=await $.getImage(e.imageId)
|
||
g.value=[a],f.value=0,b.value=!0}catch(a){l("加载图片失败",3e3)}}
|
||
return o(()=>{x()}),(e,n)=>(S(),d("div",Xu,[h("div",Zu,[n[4]||(n[4]=h("h2",null,"轮播管理",-1)),h("div",eo,[h("button",{class:"btn btn-primary",onClick:U},[p(z,{icon:"mdi:plus",class:"btn-icon"}),n[2]||(n[2]=T(" 添加轮播图 ",-1))]),h("button",{class:"btn btn-primary",onClick:x},[p(z,{icon:"mdi:refresh",class:"btn-icon"}),n[3]||(n[3]=T(" 刷新 ",-1))])])]),h("div",ao,[i.value?(S(),d("div",lo,[...n[5]||(n[5]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):u.value?(S(),d("div",to,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(u.value),1),h("button",{class:"btn btn-primary",onClick:x},"重试")])):(S(),d("table",so,[n[7]||(n[7]=h("thead",null,[h("tr",null,[h("th",null,"预览"),h("th",null,"标题"),h("th",null,"描述"),h("th",null,"排序"),h("th",null,"状态"),h("th",null,"操作")])],-1)),h("tbody",null,[0===s.value.length?(S(),d("tr",no,[h("td",io,[p(z,{icon:"mdi:image-off"}),n[6]||(n[6]=h("p",null,"暂无轮播图数据",-1))])])):y("",!0),(S(!0),d(r,null,C(s.value,e=>(S(),d("tr",{key:e._id},[h("td",null,[h("div",uo,[A(e)?(S(),d("img",{key:0,src:A(e),alt:e.title,class:"thumbnail",onClick:a=>N(e),onError:a=>(e=>{w.value[e._id]=!0})(e)},null,40,oo)):(S(),d("div",co,[p(z,{icon:"mdi:image"})]))])]),h("td",null,k(e.title),1),h("td",null,k((e.description||"").substring(0,50))+k(e.description&&e.description.length>50?"...":""),1),h("td",null,k(e.order),1),h("td",null,[h("span",{class:V(["status-badge",e.enabled?"enabled":"disabled"])},k(e.enabled?"启用":"禁用"),3)]),h("td",ro,[h("button",{class:"action-btn preview",onClick:a=>N(e),title:"预览"},[p(z,{icon:"mdi:eye"})],8,vo),h("button",{class:"action-btn edit",onClick:a=>(e=>{m.value=e,c.value=!0})(e),title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,po),h("button",{class:"action-btn delete",onClick:s=>(async e=>{if(await t.show({title:"删除轮播图",message:`确定要删除轮播图 "${e.title}" 吗?`,type:"danger",confirmText:"删除",cancelText:"取消"}))try{const t=await $.deleteCarousel(e._id)
|
||
t.success?(a("删除成功",2e3),x()):l(t.message||"删除失败",3e3)}catch(s){l(s.message||"删除失败",3e3)}})(e),title:"删除"},[p(z,{icon:"mdi:delete"})],8,mo)])]))),128))])]))]),c.value?(S(),v(Yu,{key:0,visible:c.value,carousel:m.value,onClose:n[0]||(n[0]=e=>c.value=!1),onSuccess:E},null,8,["visible","carousel"])):y("",!0),p(ue,{visible:b.value,images:g.value,"initial-index":f.value,onClose:n[1]||(n[1]=e=>b.value=!1)},null,8,["visible","images","initial-index"])]))}}),[["__scopeId","data-v-aefe9044"]]),go={class:"category-dictionary-management"},yo={class:"section-header"},fo={class:"header-actions"},ho={class:"table-container"},ko={class:"table-header"},Io={key:0,class:"loading-state"},wo={key:1,class:"error-state"},Co={key:2,class:"data-table"},xo={key:0},_o={colspan:"5",class:"empty-state"},So={class:"action-buttons"},Ao=["onClick"],Vo=["onClick"],Uo=q(s({__name:"CategoryDictionaryManagement",setup(e){const{success:a,error:l}=B(),t=L(),s=n([]),i=n(!1),u=n(""),c=n(null),m=n(!1),b=async()=>{i.value=!0,u.value=""
|
||
try{const e=await W.getAllCategoryDictionaries()
|
||
e.success&&e.data?s.value=e.data:u.value=e.message||"加载类别字典列表失败"}catch(e){u.value=e.message||"加载类别字典列表失败",l(e.message||"加载类别字典列表失败",3e3)}finally{i.value=!1}},g=()=>{c.value={name:"",description:""},m.value=!0},f=async e=>{var t,s,n
|
||
try{if(null==(t=c.value)?void 0:t.key){const t=await W.updateCategoryDictionary(c.value.key,e.name,e.description)
|
||
t.success?(a("类别字典已更新",2e3),await b(),I()):l(t.message||"更新失败",3e3)}else{const t=await W.createCategoryDictionary(e.key,e.name,e.description)
|
||
t.success?(a("类别字典已创建",2e3),await b(),I()):l(t.message||"创建失败",3e3)}}catch(i){l((null==(n=null==(s=i.response)?void 0:s.data)?void 0:n.message)||i.message||"保存失败",3e3)}},I=()=>{c.value=null,m.value=!1}
|
||
return o(()=>{b()}),(e,n)=>(S(),d("div",go,[h("div",yo,[n[1]||(n[1]=h("h2",null,"类别字典管理",-1)),h("div",fo,[h("button",{class:"btn btn-primary",onClick:b},[p(z,{icon:"mdi:refresh"}),n[0]||(n[0]=T(" 刷新 ",-1))])])]),h("div",ho,[h("div",ko,[h("button",{class:"btn btn-primary",onClick:g},[p(z,{icon:"mdi:plus"}),n[2]||(n[2]=T(" 添加类别 ",-1))]),h("button",{class:"btn btn-secondary",onClick:b},[p(z,{icon:"mdi:refresh"}),n[3]||(n[3]=T(" 刷新 ",-1))])]),i.value?(S(),d("div",Io,[...n[4]||(n[4]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):u.value?(S(),d("div",wo,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(u.value),1),h("button",{class:"btn btn-primary",onClick:b},"重试")])):(S(),d("table",Co,[n[6]||(n[6]=h("thead",null,[h("tr",null,[h("th",null,"Key(英文标识)"),h("th",null,"Name(中文名称)"),h("th",null,"描述"),h("th",null,"创建时间"),h("th",null,"操作")])],-1)),h("tbody",null,[0===s.value.length?(S(),d("tr",xo,[h("td",_o,[p(z,{icon:"mdi:database-off"}),n[5]||(n[5]=h("p",null,"暂无类别字典数据",-1))])])):y("",!0),(S(!0),d(r,null,C(s.value,e=>{return S(),d("tr",{key:e.key},[h("td",null,[h("code",null,k(e.key),1)]),h("td",null,k(e.name),1),h("td",null,k(e.description||"-"),1),h("td",null,k((s=e.createdAt,s?new Date(s).toLocaleString("zh-CN"):"-")),1),h("td",null,[h("div",So,[h("button",{class:"action-btn edit",onClick:a=>(e=>{c.value={key:e.key,name:e.name,description:e.description},m.value=!0})(e),title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,Ao),h("button",{class:"action-btn delete",onClick:s=>(async e=>{var s,n
|
||
if(await t.show({title:"确认删除",message:`确定要删除类别字典 "${e.name}" (${e.key}) 吗?此操作不可恢复。`,type:"warning"}))try{const t=await W.deleteCategoryDictionary(e.key)
|
||
t.success?(a("类别字典已删除",2e3),await b()):l(t.message||"删除失败",3e3)}catch(i){l((null==(n=null==(s=i.response)?void 0:s.data)?void 0:n.message)||i.message||"删除失败",3e3)}})(e),title:"删除"},[p(z,{icon:"mdi:delete"})],8,Vo)])])])
|
||
var s}),128))])]))]),c.value?(S(),v(ba,{key:0,visible:m.value,title:c.value.key?"编辑类别字典":"添加类别字典",message:"类别字典配置",fields:[{key:"key",label:"Key(英文标识)",placeholder:"请输入类别key,如:design",type:"text",required:!0,defaultValue:c.value.key||"",disabled:!!c.value.key},{key:"name",label:"Name(中文名称)",placeholder:"请输入类别中文名称,如:设计",type:"text",required:!0,defaultValue:c.value.name||""},{key:"description",label:"描述(可选)",placeholder:"请输入类别描述",type:"text",required:!1,defaultValue:c.value.description||""}],"confirm-text":"保存","cancel-text":"取消",onConfirm:f,onCancel:I},null,8,["visible","title","fields"])):y("",!0)]))}}),[["__scopeId","data-v-1be4b11e"]]),To={class:"dialog-title"},Eo={key:0,class:"loading-container"},No={key:1,class:"error-container"},Do={key:2,class:"version-preview"},Po={class:"version-info"},Mo={class:"info-row"},Bo={class:"value"},zo={class:"info-row"},Fo={class:"value"},$o={class:"info-row"},Ro={class:"value"},qo={class:"info-row"},Lo={key:0,class:"info-row"},jo={class:"value"},Oo={key:0,class:"snapshot-content"},Ko={class:"snapshot-details"},Go={class:"detail-item"},Wo={class:"detail-value"},Ho={class:"detail-item"},Jo={class:"detail-value"},Qo={key:0,class:"detail-item"},Yo={class:"detail-value"},Xo={key:1,class:"detail-item"},Zo={class:"detail-value"},ec={key:2,class:"detail-item"},ac={class:"detail-value"},lc=q(s({__name:"AppInfoVersionPreview",props:{visible:{type:Boolean},appInfoId:{},version:{}},emits:["close"],setup(e,{emit:t}){const s=e,u=t,o=n(null),c=n(!1),r=n(""),m=()=>{u("close"),r.value="",o.value=null},b=async()=>{var e,a
|
||
if(s.visible&&s.appInfoId&&s.version){c.value=!0,r.value="",o.value=null
|
||
try{const e=await J.getVersion(s.appInfoId,s.version)
|
||
e.success&&e.data?o.value=e.data:r.value=e.message||"加载版本信息失败"}catch(l){r.value=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"加载版本信息失败"}finally{c.value=!1}}},f=e=>{try{return a(new Date(e),{addSuffix:!0,locale:l})}catch{return e}}
|
||
return i(()=>s.visible,e=>{e&&b()}),i([()=>s.appInfoId,()=>s.version],()=>{s.visible&&b()}),(a,l)=>(S(),v(H,{visible:e.visible,"max-width":800,onClose:m},{header:g(()=>[h("h2",To,"版本预览 - v"+k(e.version),1)]),default:g(()=>{return[c.value?(S(),d("div",Eo,[...l[0]||(l[0]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载版本信息...",-1)])])):r.value?(S(),d("div",No,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(r.value),1),h("button",{class:"btn btn-primary",onClick:b},"重试")])):o.value?(S(),d("div",Do,[h("div",Po,[h("div",Mo,[l[1]||(l[1]=h("span",{class:"label"},"版本号:",-1)),h("span",Bo,k(e.version),1)]),h("div",zo,[l[2]||(l[2]=h("span",{class:"label"},"修改人:",-1)),h("span",Fo,k("object"==typeof o.value.modifiedBy?o.value.modifiedBy.nickName||o.value.modifiedBy.username:"未知用户"),1)]),h("div",$o,[l[3]||(l[3]=h("span",{class:"label"},"修改时间:",-1)),h("span",Ro,k(f(o.value.modifiedAt)),1)]),h("div",qo,[l[4]||(l[4]=h("span",{class:"label"},"状态:",-1)),h("span",{class:V(["status-badge",`status-${o.value.status}`])},k((a=o.value.status,{pending:"待审核",approved:"已通过",rejected:"已拒绝"}[a]||a)),3)]),o.value.changeReason?(S(),d("div",Lo,[l[5]||(l[5]=h("span",{class:"label"},"修改原因:",-1)),h("span",jo,k(o.value.changeReason),1)])):y("",!0)]),o.value.snapshot?(S(),d("div",Oo,[l[11]||(l[11]=h("h3",{class:"section-title"},"快照内容",-1)),h("div",Ko,[h("div",Go,[l[6]||(l[6]=h("span",{class:"detail-label"},"应用名称:",-1)),h("span",Wo,k(o.value.snapshot.appName),1)]),h("div",Ho,[l[7]||(l[7]=h("span",{class:"detail-label"},"Bundle ID:",-1)),h("span",Jo,k(o.value.snapshot.bundleId),1)]),o.value.snapshot.description?(S(),d("div",Qo,[l[8]||(l[8]=h("span",{class:"detail-label"},"描述:",-1)),h("span",Yo,k(o.value.snapshot.description),1)])):y("",!0),o.value.snapshot.permissions&&o.value.snapshot.permissions.length>0?(S(),d("div",Xo,[l[9]||(l[9]=h("span",{class:"detail-label"},"权限:",-1)),h("span",Zo,k(o.value.snapshot.permissions.join(", ")),1)])):y("",!0),o.value.snapshot.category&&o.value.snapshot.category.length>0?(S(),d("div",ec,[l[10]||(l[10]=h("span",{class:"detail-label"},"分类:",-1)),h("span",ac,k(o.value.snapshot.category.join(", ")),1)])):y("",!0)])])):y("",!0)])):y("",!0)]
|
||
var a}),_:1},8,["visible"]))}}),[["__scopeId","data-v-54d89f65"]]),tc={class:"version-management"},sc={class:"section-header"},nc={class:"header-actions"},ic={key:0,class:"stats-panel"},uc={class:"stat-card"},oc={class:"stat-value"},cc={class:"stat-card"},dc={class:"stat-value"},rc={class:"stat-card"},vc={class:"stat-value"},pc={class:"stat-card"},mc={class:"stat-value"},bc={class:"stat-card"},gc={class:"stat-value"},yc={class:"table-container"},fc={key:0,class:"loading-state"},hc={key:1,class:"error-state"},kc={key:2,class:"data-table"},Ic={key:0},wc={colspan:"8",class:"empty-state"},Cc={key:0},xc={key:1},_c={class:"action-buttons"},Sc=["onClick"],Ac=["onClick","disabled"],Vc=["onClick"],Uc=["onClick"],Tc=["onClick","disabled"],Ec=q(s({__name:"AppInfoVersionManagement",setup(e){E()
|
||
const{success:s,error:i}=B(),{user:c}=Q(),m=n([]),b=n(null),g=n(!1),f=n(""),w=n(""),x=n(""),_=n(1),A=n(20),U=n(0),N=n(!1),D=n(null),P=n(!1),F=n(!1),$=n(null),R=n(""),q=n(!1),L=n(null),j=n(!1),K=n(!1),G=n(null),W=n(!1),H=u(()=>$.value?`确定要审核通过 "${$.value.appName}" 的版本 v${$.value.version} 吗?`:""),X=u(()=>$.value?`确定要拒绝 "${$.value.appName}" 的版本 v${$.value.version} 吗?`:""),Z=async()=>{g.value=!0,f.value=""
|
||
try{const e=await J.getAllAppVersions(_.value,A.value,w.value||void 0,x.value||void 0)
|
||
e.success&&e.data?(m.value=e.data.list,U.value=e.data.total):f.value=e.message||"加载失败"}catch(e){f.value=e.message||"加载失败"}finally{g.value=!1}},ae=async()=>{try{const e=await J.getVersionStats()
|
||
e.success&&e.data&&(b.value=e.data)}catch(e){}},le=()=>{_.value=1,Z()},te=()=>{_.value=1,Z()},se=e=>{_.value=e,Z()},ne=e=>{try{return a(new Date(e),{addSuffix:!0,locale:l})}catch{return e}},ie=async()=>{if(!$.value)return
|
||
const e=$.value
|
||
if(!e.appInfoId)return i("应用信息ID不存在,无法进行审核"),P.value=!1,void($.value=null)
|
||
P.value=!1
|
||
try{const a=await J.submitReview(e.appInfoId,"approve")
|
||
a.success?(s("审核通过成功"),await Z(),await ae()):i(a.message||"审核失败")}catch(a){i(a.message||"审核失败")}finally{$.value=null}},ue=e=>{if(!c.value)return!1
|
||
const a=e.modifiedBy
|
||
return"object"==typeof a&&(a._id||a.id)===(c.value._id||c.value.id)},oe=async()=>{if(G.value&&G.value.appInfoId){W.value=!0
|
||
try{const e=await J.withdrawSubmission(G.value.appInfoId)
|
||
e.success?(s(e.message||"撤回成功"),K.value=!1,G.value=null,await Z(),await ae()):i(e.message||"撤回失败")}catch(e){i(e.message||"撤回失败")}finally{W.value=!1}}},ce=async()=>{await Z(),await ae()}
|
||
return o(()=>{Z(),ae()}),(e,a)=>(S(),d("div",tc,[h("div",sc,[a[10]||(a[10]=h("h2",null,"应用版本管理",-1)),h("div",nc,[I(h("select",{"onUpdate:modelValue":a[0]||(a[0]=e=>x.value=e),class:"status-filter",onChange:te},[...a[8]||(a[8]=[h("option",{value:""},"全部状态",-1),h("option",{value:"pending"},"待审核",-1),h("option",{value:"approved"},"已通过",-1),h("option",{value:"rejected"},"已拒绝",-1)])],544),[[M,x.value]]),p(Y,{modelValue:w.value,"onUpdate:modelValue":a[1]||(a[1]=e=>w.value=e),placeholder:"搜索应用、Bundle ID或提交者...",width:"300","storage-key":"admin_version_search_history",onSearch:le},null,8,["modelValue"]),h("button",{class:"btn btn-primary",onClick:ae},[p(z,{icon:"mdi:refresh"}),a[9]||(a[9]=T(" 刷新统计 ",-1))])])]),b.value?(S(),d("div",ic,[h("div",uc,[h("div",oc,k(b.value.totalApps),1),a[11]||(a[11]=h("div",{class:"stat-label"},"总应用数",-1))]),h("div",cc,[h("div",dc,k(b.value.totalVersions),1),a[12]||(a[12]=h("div",{class:"stat-label"},"总版本数",-1))]),h("div",rc,[h("div",vc,k(b.value.avgVersions),1),a[13]||(a[13]=h("div",{class:"stat-label"},"平均版本数",-1))]),h("div",pc,[h("div",mc,k(b.value.todayVersions),1),a[14]||(a[14]=h("div",{class:"stat-label"},"今日新增",-1))]),h("div",bc,[h("div",gc,k(b.value.pendingApps),1),a[15]||(a[15]=h("div",{class:"stat-label"},"待审核",-1))])])):y("",!0),h("div",yc,[g.value?(S(),d("div",fc,[...a[16]||(a[16]=[h("div",{class:"spinner"},null,-1),h("p",null,"加载中...",-1)])])):f.value?(S(),d("div",hc,[p(z,{icon:"mdi:alert-circle"}),h("p",null,k(f.value),1),h("button",{class:"btn btn-primary",onClick:Z},"重试")])):(S(),d("table",kc,[a[18]||(a[18]=h("thead",null,[h("tr",null,[h("th",null,"应用名称"),h("th",null,"Bundle ID"),h("th",null,"版本号"),h("th",null,"提交者"),h("th",null,"提交时间"),h("th",null,"审核状态"),h("th",null,"修改原因"),h("th",null,"操作")])],-1)),h("tbody",null,[m.value&&0!==m.value.length?y("",!0):(S(),d("tr",Ic,[h("td",wc,[p(z,{icon:"mdi:inbox"}),a[17]||(a[17]=h("p",null,"暂无版本记录",-1))])])),(S(!0),d(r,null,C(m.value,e=>{return S(),d("tr",{key:e._id},[h("td",null,k(e.appName),1),h("td",null,k(e.bundleId),1),h("td",null,"v"+k(e.version),1),h("td",null,["object"==typeof e.modifiedBy?(S(),d("span",Cc,k(e.modifiedBy.nickName||e.modifiedBy.username),1)):(S(),d("span",xc,"未知"))]),h("td",null,k(ne(e.createdAt)),1),h("td",null,[h("span",{class:V(["status-badge",`status-${e.status}`])},k((a=e.status,{pending:"待审核",approved:"已通过",rejected:"已拒绝"}[a]||a)),3)]),h("td",null,k(e.changeReason||"-"),1),h("td",null,[h("div",_c,[h("button",{class:"action-btn view",onClick:a=>(e=>{e.appInfoId?(D.value=e,N.value=!0):i("应用信息ID不存在,无法查看版本详情")})(e),title:"查看详情"},[p(z,{icon:"mdi:eye"})],8,Sc),h("button",{class:"action-btn edit",onClick:a=>(async e=>{if(e.appInfoId){j.value=!0
|
||
try{const a=await J.getVersion(e.appInfoId,e.version)
|
||
if(!a.success||!a.data)return void i("加载应用信息失败")
|
||
const l=a.data.snapshot
|
||
if(!l)return void i("应用信息不存在")
|
||
const t={bundleId:l.bundleId,name:l.appName||l.name||"",version:l.version||"",bundleVersion:l.fullVersion||l.bundleVersion||"",path:"",status:"supported",injection:null,update:null,iconId:l.iconId||"",imageId:l.imageId||[],description:l.description||"",permissions:l.permissions||[],compatibility:l.compatibility||[],architecture:l.architecture||[],language:l.language||[],category:l.category||[],developer:Array.isArray(l.developer)?l.developer:l.developer?[l.developer]:[],isDMCAed:l.isDMCAed||!1}
|
||
L.value=t,q.value=!0}catch(a){i(a.message||"加载应用信息失败")}finally{j.value=!1}}else i("应用信息ID不存在,无法编辑")})(e),disabled:j.value,title:"编辑"},[p(z,{icon:"mdi:pencil"})],8,Ac),"pending"!==e.status||ue(e)?y("",!0):(S(),d("button",{key:0,class:"action-btn approve",onClick:a=>(e=>{$.value=e,P.value=!0})(e),title:"审核通过"},[p(z,{icon:"mdi:check"})],8,Vc)),"pending"!==e.status||ue(e)?y("",!0):(S(),d("button",{key:1,class:"action-btn reject",onClick:a=>(e=>{$.value=e,R.value="",F.value=!0})(e),title:"审核拒绝"},[p(z,{icon:"mdi:close"})],8,Uc)),ue(e)&&"pending"===e.status?(S(),d("button",{key:2,class:"action-btn withdraw",onClick:a=>(e=>{G.value=e,K.value=!0})(e),disabled:W.value,title:"撤回提交"},[p(z,{icon:"mdi:delete"})],8,Tc)):y("",!0)])])])
|
||
var a}),128))])]))]),U.value>A.value?(S(),v(ee,{key:1,"current-page":_.value,"total-items":U.value,"page-size":A.value,onPageChange:se},null,8,["current-page","total-items","page-size"])):y("",!0),D.value&&D.value.appInfoId?(S(),v(lc,{key:2,visible:N.value,"app-info-id":D.value.appInfoId,version:D.value.version,onClose:a[2]||(a[2]=e=>N.value=!1)},null,8,["visible","app-info-id","version"])):y("",!0),p(O,{visible:P.value,title:"确认审核通过",message:H.value,type:"info","confirm-text":"确定","cancel-text":"取消",onConfirm:ie,onClose:a[3]||(a[3]=e=>P.value=!1)},null,8,["visible","message"]),$.value?(S(),v(ba,{key:3,visible:F.value,title:"审核拒绝",message:X.value,fields:[{key:"reason",label:"拒绝原因",placeholder:"请输入拒绝原因(可选)",type:"textarea",rows:4}],"confirm-text":"确定拒绝","cancel-text":"取消",onConfirm:a[4]||(a[4]=e=>{R.value=e.reason||"",(async()=>{if(!$.value)return
|
||
const e=$.value
|
||
if(!e.appInfoId)return i("应用信息ID不存在,无法进行审核"),F.value=!1,$.value=null,void(R.value="")
|
||
const a=R.value
|
||
F.value=!1
|
||
try{const l=await J.submitReview(e.appInfoId,"reject",a||void 0)
|
||
l.success?(s("审核拒绝成功"),await Z(),await ae()):i(l.message||"审核失败")}catch(l){i(l.message||"审核失败")}finally{$.value=null,R.value=""}})()}),onClose:a[5]||(a[5]=e=>F.value=!1)},null,8,["visible","message"])):y("",!0),p(t,{visible:q.value,app:L.value,onClose:a[6]||(a[6]=e=>q.value=!1),onSuccess:ce},null,8,["visible","app"]),p(O,{visible:K.value,title:"确认撤回",message:"确定要撤回此提交吗?撤回后将删除所有审核记录。",type:"warning","confirm-text":"确认撤回","cancel-text":"取消",onConfirm:oe,onClose:a[7]||(a[7]=e=>K.value=!1)},null,8,["visible"])]))}}),[["__scopeId","data-v-15f5bb3c"]]),Nc={class:"admin-panel-page"},Dc={class:"page-container"},Pc={class:"content-area"},Mc=q(s({__name:"AdminPanel",setup(a){const{toasts:l,removeToast:t}=B(),s=n("users"),i=n(null),u=n([{id:"users",label:"用户管理",icon:"fluent-color:people-team-48",badge:null},{id:"posts",label:"帖子管理",icon:"fluent-color:notebook-32",badge:null},{id:"violations",label:"违规处理",icon:"fluent-color:person-warning-48",badge:null},{id:"issues",label:"问题管理",icon:"fluent-color:person-feedback-48",badge:null},{id:"forums",label:"讨论区管理",icon:"fluent-color:chat-bubbles-question-24",badge:null},{id:"apps",label:"App管理",icon:"fluent-color:apps-24",badge:null},{id:"files",label:"文件管理",icon:"fluent-color:document-24",badge:null},{id:"logs",label:"系统日志",icon:"fluent-color:document-text-24",badge:null},{id:"ipban",label:"IP封禁管理",icon:"fluent-color:shield-24",badge:null},{id:"settings",label:"系统设置",icon:"fluent-color:settings-24",badge:null},{id:"carousel",label:"轮播管理",icon:"fluent-color:image-24",badge:null},{id:"category-dictionary",label:"类别字典",icon:"mdi:tag-multiple",badge:null},{id:"version-management",label:"版本管理",icon:"mdi:history",badge:null}]),r=async()=>{try{const e=await $.getAdminViolations(1,1,"pending")
|
||
if(e.success&&e.data){const a=e.data.total||0,l=u.value.find(e=>"violations"===e.id)
|
||
l&&(l.badge=a>0?String(a):null)}}catch(e){}}
|
||
let m=null
|
||
return o(()=>{r(),m=setInterval(()=>{r()},6e4)}),c(()=>{m&&(clearInterval(m),m=null)}),(a,n)=>(S(),d("div",Nc,[h("div",Dc,[n[1]||(n[1]=h("div",{class:"page-header"},[h("h1",{class:"page-title"},"管理员面板"),h("p",{class:"page-description"},"管理系统用户、帖子内容和违规处理")],-1)),p(e,{tabs:u.value,"active-tab":s.value,"onUpdate:activeTab":n[0]||(n[0]=e=>s.value=e)},null,8,["tabs","active-tab"]),h("div",Pc,["users"===s.value?(S(),v(Ma,{key:0})):y("",!0),"posts"===s.value?(S(),v(al,{key:1})):y("",!0),"violations"===s.value?(S(),v(Ul,{key:2,ref_key:"violationsManagementRef",ref:i},null,512)):y("",!0),"issues"===s.value?(S(),v(bt,{key:3})):y("",!0),"forums"===s.value?(S(),v(ms,{key:4})):y("",!0),"apps"===s.value?(S(),v(Us,{key:5})):y("",!0),"files"===s.value?(S(),v(Ln,{key:6})):y("",!0),"logs"===s.value?(S(),v(Di,{key:7})):y("",!0),"ipban"===s.value?(S(),v(Tu,{key:8})):y("",!0),"settings"===s.value?(S(),v(vu,{key:9})):y("",!0),"carousel"===s.value?(S(),v(bo,{key:10})):y("",!0),"category-dictionary"===s.value?(S(),v(Uo,{key:11})):y("",!0),"version-management"===s.value?(S(),v(Ec,{key:12})):y("",!0)])]),p(F,{toasts:_(l),onRemove:_(t)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-c6483f0f"]])
|
||
export{Mc as default}
|