Files
2026-07-22 10:18:59 +08:00

2 lines
9.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{_ as ee,u as se,g as le,h as f,c as n,a as e,i as h,d as r,F as C,j as D,t as i,w as ae,b as p,v as U,k as P,r as m,l as T,m as te,o,n as q}from"./index-z4tF8s-R.js";const ne={class:"toolbar"},oe={class:"panel"},ie={class:"data-table"},re=["onClick"],ue=["onClick"],de={key:0,class:"empty"},me={key:1,class:"pagination"},pe=["disabled"],ve=["disabled"],ce={class:"modal modal-wide"},_e={class:"modal-header"},be={class:"modal-body"},fe={key:0,class:"user-meta"},he={class:"form-group"},ge={class:"form-group"},we={class:"form-group"},ke={class:"form-group"},ye=["value"],Ce={class:"form-group"},Ue=["value"],Ve={class:"form-group"},Me={class:"form-group"},Be=["value"],xe={key:0,class:"membership-preview"},$e={key:0,class:"perm-tag"},De={key:1,class:"perm-tag"},Pe={key:2,class:"perm-tag"},Se={key:3,class:"perm-tag"},ze={key:4,class:"field-hint"},Fe={key:2,class:"form-divider"},Ie={key:3,class:"form-group"},Le=["placeholder"],Ne={key:4,class:"form-group"},Ae={key:5,class:"form-error"},Ee={class:"modal-footer"},je=["disabled"],F=20,Re={__name:"UsersView",setup(Te){const _=se(),V=m([]),k=m([]),y=m([]),I=m([]),v=m(null),u=m(!1),M=m(!1),d=m(""),B=m(!1),b=m(1),S=m(0),s=te({username:"",email:"",nickname:"",role_id:null,department_id:null,status:"active",membership_level_id:1,password:"",passwordConfirm:""}),L=T(()=>Math.max(1,Math.ceil(S.value/F))),g=T(()=>k.value.find(t=>t.id===s.membership_level_id)||null);le(async()=>{await Promise.all([x(),G(),H(),J()])});async function x(){const l=(await f.get("/admin/users",{params:{page:b.value,limit:F}})).data.data||{};V.value=l.list||[],S.value=l.total??V.value.length}async function G(){const t=await f.get("/admin/memberships");k.value=t.data.data||[]}async function H(){const t=await f.get("/admin/roles");y.value=t.data.data||[]}async function J(){const t=await f.get("/admin/department-options");I.value=t.data.data||[]}async function N(t){b.value=t,await x()}function K(){var t,l,c;u.value=!0,v.value=null,M.value=!0,d.value="",s.username="",s.email="",s.nickname="",s.role_id=((t=y.value.find(w=>w.slug==="user"))==null?void 0:t.id)||((l=y.value[0])==null?void 0:l.id)||null,s.department_id=null,s.status="active",s.membership_level_id=((c=k.value[0])==null?void 0:c.id)||1,s.password="",s.passwordConfirm=""}function O(t){var l,c;u.value=!1,v.value=t,M.value=!0,d.value="",s.username=t.username,s.email=t.email,s.nickname=t.nickname||t.username,s.role_id=t.role_id||((l=y.value.find(w=>w.slug==="user"))==null?void 0:l.id)||null,s.department_id=t.department_id||null,s.status=t.status,s.membership_level_id=t.membership_level_id||((c=k.value[0])==null?void 0:c.id)||1,s.password="",s.passwordConfirm=""}function $(){M.value=!1,v.value=null,d.value=""}function Q(t){const l=t.permissions||{};return l.can_upload_image||l.can_upload_video||l.can_upload_file||l.can_use_voice}async function W(){if(d.value="",u.value){if(s.username.trim().length<3){d.value="用户名至少 3 位";return}if(!s.email.trim()){d.value="请填写邮箱";return}if(s.password.length<6){d.value="密码至少 6 位";return}}if(s.password||s.passwordConfirm||u.value){if(s.password.length<6&&(u.value||s.password||s.passwordConfirm)){d.value="密码至少 6 位";return}if(s.password!==s.passwordConfirm){d.value="两次输入的密码不一致";return}}B.value=!0;try{if(u.value)await f.post("/admin/users",{username:s.username.trim(),email:s.email.trim(),nickname:s.nickname.trim(),role_id:s.role_id,department_id:s.department_id,status:s.status,membership_level_id:s.membership_level_id,password:s.password});else{const t={nickname:s.nickname.trim(),role_id:s.role_id,department_id:s.department_id,status:s.status,membership_level_id:s.membership_level_id};s.password&&(t.password=s.password),await f.put(`/admin/users/${v.value.id}`,t)}$(),await x()}catch(t){d.value=t.message||"保存失败"}finally{B.value=!1}}async function X(t){if(confirm(`确定删除账户「${t.username}」?此操作不可恢复。`))try{await f.delete(`/admin/users/${t.id}`),await x()}catch(l){alert(l.message||"删除失败")}}function Y(t){return t==="admin"?"管理员":"用户"}function z(t){return t?new Date(t).toLocaleString("zh-CN"):"-"}return(t,l)=>{var c,w,A,E,j;return o(),n("div",null,[l[22]||(l[22]=e("div",{class:"page-header"},[e("h2",null,"用户管理"),e("p",null,"管理注册用户、密码、角色与会员套餐")],-1)),e("div",ne,[h(_).hasButton("btn:user:create")?(o(),n("button",{key:0,class:"btn btn-primary",onClick:K},"新增账户")):r("",!0)]),e("div",oe,[e("table",ie,[l[11]||(l[11]=e("thead",null,[e("tr",null,[e("th",null,"ID"),e("th",null,"用户名"),e("th",null,"邮箱"),e("th",null,"昵称"),e("th",null,"角色"),e("th",null,"部门"),e("th",null,"会员等级"),e("th",null,"状态"),e("th",null,"最后登录"),e("th",null,"注册时间"),e("th",null,"操作")])],-1)),e("tbody",null,[(o(!0),n(C,null,D(V.value,a=>{var R;return o(),n("tr",{key:a.id},[e("td",null,i(a.id),1),e("td",null,i(a.username),1),e("td",null,i(a.email),1),e("td",null,i(a.nickname||"-"),1),e("td",null,[e("span",{class:q(["badge",a.role_slug==="super_admin"||a.role==="admin"?"badge-info":""])},i(a.role_name||Y(a.role)),3)]),e("td",null,i(a.department_name||"-"),1),e("td",null,i(a.membership_name||"-"),1),e("td",null,[e("span",{class:q(["badge",a.status==="active"?"badge-success":"badge-danger"])},i(a.status==="active"?"正常":"禁用"),3)]),e("td",null,i(z(a.last_login_at)),1),e("td",null,i(z(a.created_at)),1),e("td",null,[h(_).hasButton("btn:user:edit")?(o(),n("button",{key:0,class:"btn btn-ghost",onClick:Z=>O(a)},"编辑",8,re)):r("",!0),h(_).hasButton("btn:user:delete")&&a.id!==((R=h(_).user)==null?void 0:R.id)?(o(),n("button",{key:1,class:"btn btn-ghost danger",onClick:Z=>X(a)},"删除",8,ue)):r("",!0)])])}),128))])]),V.value.length?r("",!0):(o(),n("p",de,"暂无用户")),S.value>F?(o(),n("div",me,[e("button",{class:"btn btn-ghost",disabled:b.value<=1,onClick:l[0]||(l[0]=a=>N(b.value-1))},"上一页",8,pe),e("span",null,i(b.value)+" / "+i(L.value),1),e("button",{class:"btn btn-ghost",disabled:b.value>=L.value,onClick:l[1]||(l[1]=a=>N(b.value+1))},"下一页",8,ve)])):r("",!0)]),M.value?(o(),n("div",{key:0,class:"modal-overlay",onClick:ae($,["self"])},[e("div",ce,[e("div",_e,[e("h3",null,i(u.value?"新增账户":`编辑用户 — ${(c=v.value)==null?void 0:c.username}`),1),e("button",{onClick:$},"×")]),e("div",be,[u.value?r("",!0):(o(),n("div",fe,[e("span",null,"ID: "+i(v.value.id),1),e("span",null,"邮箱: "+i(v.value.email),1),e("span",null,"注册: "+i(z(v.value.created_at)),1)])),u.value?(o(),n(C,{key:1},[e("div",he,[l[12]||(l[12]=e("label",null,"用户名",-1)),p(e("input",{"onUpdate:modelValue":l[2]||(l[2]=a=>s.username=a),class:"form-input",placeholder:"登录用户名"},null,512),[[U,s.username]])]),e("div",ge,[l[13]||(l[13]=e("label",null,"邮箱",-1)),p(e("input",{"onUpdate:modelValue":l[3]||(l[3]=a=>s.email=a),class:"form-input",placeholder:"user@example.com"},null,512),[[U,s.email]])])],64)):r("",!0),e("div",we,[l[14]||(l[14]=e("label",null,"昵称",-1)),p(e("input",{"onUpdate:modelValue":l[4]||(l[4]=a=>s.nickname=a),class:"form-input",placeholder:"显示名称"},null,512),[[U,s.nickname]])]),e("div",ke,[l[15]||(l[15]=e("label",null,"角色",-1)),p(e("select",{"onUpdate:modelValue":l[5]||(l[5]=a=>s.role_id=a),class:"form-select"},[(o(!0),n(C,null,D(y.value,a=>(o(),n("option",{key:a.id,value:a.id},i(a.name),9,ye))),128))],512),[[P,s.role_id,void 0,{number:!0}]])]),e("div",Ce,[l[17]||(l[17]=e("label",null,"所属部门",-1)),p(e("select",{"onUpdate:modelValue":l[6]||(l[6]=a=>s.department_id=a),class:"form-select"},[l[16]||(l[16]=e("option",{value:null},"未分配",-1)),(o(!0),n(C,null,D(I.value,a=>(o(),n("option",{key:a.id,value:a.id},i(a.label||a.name),9,Ue))),128))],512),[[P,s.department_id]])]),e("div",Ve,[l[19]||(l[19]=e("label",null,"账号状态",-1)),p(e("select",{"onUpdate:modelValue":l[7]||(l[7]=a=>s.status=a),class:"form-select"},[...l[18]||(l[18]=[e("option",{value:"active"},"正常",-1),e("option",{value:"disabled"},"禁用",-1)])],512),[[P,s.status]])]),e("div",Me,[l[20]||(l[20]=e("label",null,"会员套餐",-1)),p(e("select",{"onUpdate:modelValue":l[8]||(l[8]=a=>s.membership_level_id=a),class:"form-select"},[(o(!0),n(C,null,D(k.value,a=>(o(),n("option",{key:a.id,value:a.id},i(a.name)+"(会话 "+i(a.max_conversations)+" · 日消息 "+i(a.max_messages_per_day)+" · 上传 "+i(a.max_upload_size_mb)+"MB ",9,Be))),128))],512),[[P,s.membership_level_id,void 0,{number:!0}]]),g.value?(o(),n("div",xe,[(w=g.value.permissions)!=null&&w.can_upload_image?(o(),n("span",$e,"图片")):r("",!0),(A=g.value.permissions)!=null&&A.can_upload_video?(o(),n("span",De,"视频")):r("",!0),(E=g.value.permissions)!=null&&E.can_upload_file?(o(),n("span",Pe,"文件")):r("",!0),(j=g.value.permissions)!=null&&j.can_use_voice?(o(),n("span",Se,"语音")):r("",!0),Q(g.value)?r("",!0):(o(),n("span",ze,"该套餐暂无额外权限"))])):r("",!0)]),u.value||h(_).hasButton("btn:user:reset_password")?(o(),n("div",Fe,i(u.value?"登录密码":"重置密码(可选)"),1)):r("",!0),u.value||h(_).hasButton("btn:user:reset_password")?(o(),n("div",Ie,[e("label",null,i(u.value?"密码":"新密码"),1),p(e("input",{"onUpdate:modelValue":l[9]||(l[9]=a=>s.password=a),type:"password",class:"form-input",placeholder:u.value?"至少 6 位":"留空则不修改密码",autocomplete:"new-password"},null,8,Le),[[U,s.password]])])):r("",!0),u.value||h(_).hasButton("btn:user:reset_password")?(o(),n("div",Ne,[l[21]||(l[21]=e("label",null,"确认密码",-1)),p(e("input",{"onUpdate:modelValue":l[10]||(l[10]=a=>s.passwordConfirm=a),type:"password",class:"form-input",placeholder:"再次输入密码",autocomplete:"new-password"},null,512),[[U,s.passwordConfirm]])])):r("",!0),d.value?(o(),n("p",Ae,i(d.value),1)):r("",!0)]),e("div",Ee,[e("button",{class:"btn btn-ghost",onClick:$},"取消"),e("button",{class:"btn btn-primary",disabled:B.value,onClick:W},i(B.value?"保存中...":"保存"),9,je)])])])):r("",!0)])}}},Ge=ee(Re,[["__scopeId","data-v-921bbcc9"]]);export{Ge as default};