2 lines
8.7 KiB
JavaScript
2 lines
8.7 KiB
JavaScript
import{f as Q,a as X,r as Y,s as ee,b as te,c as se,d as ae}from"./users-CPJP5r-B.js";import{_ as ne,r as P,o as ie,e as V,f as d,g as n,w as a,n as g,i as M,v as le,I as re,x as c,y as o,J as A,h as p,j as m,m as w,K as y,L as _,M as oe,N as ce}from"./index-B57Le1Kd.js";function E(v){if(!v)return null;if(v instanceof Date)return v;let i=String(v).trim();if(!i)return null;/^\d{4}-\d{2}-\d{2}$/.test(i)&&(i=`${i}T00:00:00`);let u=i.includes("T")?i:i.replace(" ","T");u=u.replace(/\.(\d{3})\d+/,".$1"),/([zZ]|[+-]\d{2}:\d{2})$/.test(u)||(u=`${u}+08:00`);const x=new Date(u);return Number.isNaN(x.getTime())?null:x}function L(v){const i=String(v||"");if(!i)return{ok:!1,message:"密码不能为空"};if(i.length<8)return{ok:!1,message:"密码长度不能少于8个字符"};if(i.length>128)return{ok:!1,message:"密码长度不能超过128个字符"};const u=/[a-zA-Z]/.test(i),h=/\d/.test(i);return!u||!h?{ok:!1,message:"密码必须包含字母和数字"}:{ok:!0,message:""}}const ue={class:"page-stack"},de={class:"app-page-title"},fe={class:"table-wrap"},pe={class:"user-block"},me={class:"user-main"},ye={key:0,class:"app-muted user-sub"},_e={key:1,class:"vip-sub"},ge={key:0,class:"app-muted"},ve={class:"actions"},ke={class:"table-wrap"},we={__name:"UsersPage",setup(v){const i=M("refreshStats",null),u=M("refreshNavBadges",null),h=P(!1),x=P([]),I=P(!1),b=P([]);function k(t){const e=t?.vip_expire_time;if(!e)return!1;if(String(e).startsWith("2099-12-31"))return!0;const l=E(e);return l?l.getTime()>Date.now():!1}function D(t){const e=t?.vip_expire_time;if(!e||!k(t))return"";if(String(e).startsWith("2099-12-31"))return"永久VIP";const l=E(e);if(!l)return`到期: ${e}`;const r=Math.ceil((l.getTime()-Date.now())/(1e3*60*60*24));return`到期: ${e}(剩${r}天)`}function z(t){return t==="rejected"?{label:"禁用",type:"danger"}:{label:"正常",type:"success"}}async function T(){h.value=!0;try{x.value=await Q()}catch{x.value=[]}finally{h.value=!1}}async function R(){I.value=!0;try{const t=await le();b.value=Array.isArray(t)?t:[]}catch{b.value=[]}finally{I.value=!1}}async function U(){await Promise.all([T(),R()]),await u?.({pendingResets:b.value.length})}async function W(t){try{await y.confirm(`确定启用用户「${t.username}」吗?启用后用户可正常登录。`,"启用用户",{confirmButtonText:"启用",cancelButtonText:"取消",type:"success"})}catch{return}try{await X(t.id),_.success("用户已启用"),await T(),await i?.()}catch{}}async function Z(t){try{await y.confirm(`确定禁用用户「${t.username}」吗?禁用后用户将无法登录。`,"禁用用户",{confirmButtonText:"禁用",cancelButtonText:"取消",type:"warning"})}catch{return}try{await Y(t.id),_.success("用户已禁用"),await T(),await i?.()}catch{}}async function q(t){try{await y.confirm(`确定批准「${t.username}」的密码重置申请吗?`,"批准重置",{confirmButtonText:"批准",cancelButtonText:"取消",type:"success"})}catch{return}try{const e=await oe(t.id);_.success(e?.message||"密码重置申请已批准"),await R(),await u?.({pendingResets:b.value.length})}catch{}}async function J(t){try{await y.confirm(`确定拒绝「${t.username}」的密码重置申请吗?`,"拒绝重置",{confirmButtonText:"拒绝",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await ce(t.id);_.success(e?.message||"密码重置申请已拒绝"),await R(),await u?.({pendingResets:b.value.length})}catch{}}async function K(t){try{await y.confirm(`确定删除用户「${t.username}」吗?此操作将删除该用户的所有数据,不可恢复!`,"删除用户",{confirmButtonText:"删除",cancelButtonText:"取消",type:"error"})}catch{return}try{await ae(t.id),_.success("用户已删除"),await T(),await i?.()}catch{}}async function C(t,e){const l={7:"一周",30:"一个月",365:"一年",999999:"永久"}[e]||`${e}天`;try{await y.confirm(`确定为用户「${t.username}」开通 ${l} VIP 吗?`,"设置VIP",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"})}catch{return}try{const r=await ee(t.id,e);_.success(r?.message||"VIP设置成功"),await T(),await i?.()}catch{}}async function F(t){try{await y.confirm(`确定移除用户「${t.username}」的 VIP 吗?`,"移除VIP",{confirmButtonText:"移除",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await te(t.id);_.success(e?.message||"VIP已移除"),await T(),await i?.()}catch{}}async function G(t){let e;try{e=(await y.prompt("请输入新密码(至少8位且包含字母和数字)","重置密码",{confirmButtonText:"提交",cancelButtonText:"取消",inputType:"password",inputPlaceholder:"新密码",inputValidator:B=>L(B).ok,inputErrorMessage:"密码至少8位且包含字母和数字"})).value}catch{return}const l=L(e);if(!l.ok){_.error(l.message);return}try{await y.confirm(`确定将用户「${t.username}」的密码重置为该新密码吗?`,"二次确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning"})}catch{return}try{const r=await se(t.id,e);_.success(r?.message||"密码重置成功")}catch{}}return ie(U),(t,e)=>{const l=g("el-button"),r=g("el-table-column"),B=g("el-tag"),$=g("el-dropdown-item"),H=g("el-dropdown-menu"),O=g("el-dropdown"),N=g("el-table"),S=g("el-card"),j=re("loading");return c(),V("div",ue,[d("div",de,[e[1]||(e[1]=d("h2",null,"用户",-1)),d("div",null,[n(l,{onClick:U},{default:a(()=>[...e[0]||(e[0]=[o("刷新",-1)])]),_:1})])]),n(S,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[d("div",fe,[A((c(),p(N,{data:x.value,style:{width:"100%"}},{default:a(()=>[n(r,{prop:"id",label:"ID",width:"80"}),n(r,{label:"用户","min-width":"240"},{default:a(({row:s})=>[d("div",pe,[d("div",me,[d("strong",null,w(s.username),1),k(s)?(c(),p(B,{key:0,type:"warning",effect:"light",size:"small"},{default:a(()=>[...e[2]||(e[2]=[o("VIP",-1)])]),_:1})):m("",!0)]),s.email?(c(),V("div",ye,w(s.email),1)):m("",!0),D(s)?(c(),V("div",_e,w(D(s)),1)):m("",!0)])]),_:1}),n(r,{label:"状态",width:"120"},{default:a(({row:s})=>[n(B,{type:z(s.status).type,effect:"light"},{default:a(()=>[o(w(z(s.status).label),1)]),_:2},1032,["type"])]),_:1}),n(r,{label:"时间","min-width":"220"},{default:a(({row:s})=>[d("div",null,w(s.created_at),1),s.vip_expire_time?(c(),V("div",ge,"VIP到期: "+w(s.vip_expire_time),1)):m("",!0)]),_:1}),n(r,{label:"操作",width:"280",fixed:"right"},{default:a(({row:s})=>[d("div",ve,[s.status==="rejected"?(c(),p(l,{key:0,type:"success",size:"small",onClick:f=>W(s)},{default:a(()=>[...e[3]||(e[3]=[o("启用",-1)])]),_:1},8,["onClick"])):(c(),p(l,{key:1,type:"warning",size:"small",onClick:f=>Z(s)},{default:a(()=>[...e[4]||(e[4]=[o("禁用",-1)])]),_:1},8,["onClick"])),n(O,{trigger:"click"},{dropdown:a(()=>[n(H,null,{default:a(()=>[k(s)?m("",!0):(c(),p($,{key:0,onClick:f=>C(s,7)},{default:a(()=>[...e[6]||(e[6]=[o("开通一周",-1)])]),_:1},8,["onClick"])),k(s)?m("",!0):(c(),p($,{key:1,onClick:f=>C(s,30)},{default:a(()=>[...e[7]||(e[7]=[o("开通一月",-1)])]),_:1},8,["onClick"])),k(s)?m("",!0):(c(),p($,{key:2,onClick:f=>C(s,365)},{default:a(()=>[...e[8]||(e[8]=[o("开通一年",-1)])]),_:1},8,["onClick"])),k(s)?m("",!0):(c(),p($,{key:3,onClick:f=>C(s,999999)},{default:a(()=>[...e[9]||(e[9]=[o("永久VIP",-1)])]),_:1},8,["onClick"])),k(s)?(c(),p($,{key:4,onClick:f=>F(s)},{default:a(()=>[...e[10]||(e[10]=[o("移除VIP",-1)])]),_:1},8,["onClick"])):m("",!0)]),_:2},1024)]),default:a(()=>[n(l,{size:"small"},{default:a(()=>[...e[5]||(e[5]=[o("VIP",-1)])]),_:1})]),_:2},1024),n(l,{size:"small",onClick:f=>G(s)},{default:a(()=>[...e[11]||(e[11]=[o("重置密码",-1)])]),_:1},8,["onClick"]),n(l,{type:"danger",size:"small",onClick:f=>K(s)},{default:a(()=>[...e[12]||(e[12]=[o("删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[j,h.value]])])]),_:1}),n(S,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[e[15]||(e[15]=d("h3",{class:"section-title"},"密码重置申请",-1)),d("div",ke,[A((c(),p(N,{data:b.value,style:{width:"100%"}},{default:a(()=>[n(r,{prop:"id",label:"申请ID",width:"90"}),n(r,{prop:"username",label:"用户名","min-width":"200"}),n(r,{prop:"email",label:"邮箱","min-width":"220"},{default:a(({row:s})=>[o(w(s.email||"-"),1)]),_:1}),n(r,{prop:"created_at",label:"申请时间","min-width":"180"}),n(r,{label:"操作",width:"180",fixed:"right"},{default:a(({row:s})=>[n(l,{type:"success",size:"small",onClick:f=>q(s)},{default:a(()=>[...e[13]||(e[13]=[o("批准",-1)])]),_:1},8,["onClick"]),n(l,{type:"danger",size:"small",onClick:f=>J(s)},{default:a(()=>[...e[14]||(e[14]=[o("拒绝",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[j,I.value]])]),e[16]||(e[16]=d("div",{class:"help app-muted"},"当未启用邮件找回密码时,用户会提交申请,由管理员在此处处理。",-1))]),_:1})])}}},be=ne(we,[["__scopeId","data-v-84b2f73a"]]);export{be as default};
|