You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
15 KiB
1 lines
15 KiB
import{g as at,E as it,B as dt,c as l,p as r,H as C,a as s,l as L,F as v,r as g,t as u,v as _,q as K,G as B,J as G,K as ut,M as rt,d as m,x as b,y as R,o,n as pt,s as j,_ as ct}from"./CSjlBIfC.js";import{u as mt}from"./CX31_Ko0.js";import{u as bt}from"./QmZ_XupB.js";import"./CgE-6DOq.js";const xt={class:"flex items-center justify-between mb-4"},vt={class:"bg-white rounded-xl shadow-sm border border-slate-100 overflow-hidden"},ft={class:"table table-sm"},yt={key:0},gt={key:1},kt={class:"font-mono"},wt={class:"font-medium"},_t={key:0,class:"text-green-600 text-xs"},ht={key:1,class:"text-slate-400 text-xs"},Ct={key:0,class:"text-xs text-slate-500"},St={key:1,class:"text-xs text-slate-300"},Vt={key:0,class:"text-xs text-slate-500"},Ut={key:1,class:"text-xs text-slate-300"},Et={key:2,class:"text-xs text-slate-300"},It={key:3,class:"text-[11px] text-emerald-600 mt-0.5"},$t={class:"text-xs text-slate-500"},Mt={class:"flex gap-1 justify-end"},Nt=["onClick"],At=["onClick"],Lt=["onClick"],jt=["onClick"],Dt={class:"flex items-center gap-3 mb-5"},Pt={class:"text-lg font-semibold text-slate-800"},Tt={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"},Ot={class:"grid grid-cols-2 gap-3"},Bt=["disabled"],Gt={class:"col-span-2"},Rt={class:"mt-4 border-t border-slate-100 pt-4"},Ft={class:"flex items-center justify-between mb-1"},qt={class:"flex gap-1"},zt={class:"text-xs text-slate-500 mb-1.5"},Ht={key:0,class:"text-amber-500 ml-1"},Jt={class:"flex flex-wrap gap-2"},Kt=["value"],Qt={class:"mt-4 border-t border-slate-100 pt-4"},Wt={class:"mb-3"},Xt={class:"flex flex-wrap gap-2"},Yt=["value"],Zt={key:1,class:"text-xs text-slate-300"},ts={class:"mb-3"},ss={class:"flex flex-wrap gap-2"},es=["value"],ns={class:"max-h-56 overflow-y-auto pr-1 border border-slate-100 rounded-lg p-2"},ls={key:0,class:"text-xs text-slate-300"},os={key:1,class:"text-xs text-slate-300"},as={class:"text-[11px] font-semibold text-slate-500 mb-1 sticky top-0 bg-white py-0.5"},is={class:"flex flex-wrap gap-2"},ds=["value"],us={class:"flex gap-3 justify-end mt-6"},rs=["disabled"],ps={class:"modal-box max-w-md"},cs={class:"text-xs text-slate-400 mb-3"},ms={class:"font-medium text-slate-600"},bs={class:"text-emerald-600"},xs={class:"grid grid-cols-3 gap-3"},vs={class:"modal-action"},fs=at({__name:"accounts",setup(ys){const{webApi:F,consoleApi:f}=mt(),{success:S,error:k,warn:Q}=bt(),W={1:"超管",2:"管理员",3:"代理",4:"运营"},X={1:"badge-error",2:"badge-primary",3:"badge-warning",4:"badge-info"},Y=[["cn","中国"],["us","美国"],["ea","东亚"],["sea","东南亚"],["sa","南亚"],["me","中东"],["eu","欧洲"],["ru","俄罗斯"],["af","非洲"],["sam","南美"],["nam","北美"],["oc","大洋洲"],["br","巴西"],["in","印度"]],V=b("list"),U=b([]),E=b([]),D=b(!1),I=b(!1),y=b(0),a=R({username:"",password:"",identity:2,enabled:"1",remark:""}),i=R({access:[],apps:[],regions:[],products:[]}),h=b([]),P=b(!1);function x(n){return(n||"").split(",").map(t=>t.trim()).filter(t=>t)}function $(n){return n.join(",")}function q(n){const t=[];return n.apps&&t.push("应用:"+x(n.apps).length),n.regions&&t.push("区域:"+x(n.regions).length),n.products&&t.push("产品:"+x(n.products).length),n.access&&t.push("页面:"+x(n.access).length),t}async function M(){D.value=!0;try{try{E.value=await f("apps/list",{})??[]}catch{E.value=[]}const n=await f("accounts/list",{});U.value=n??[]}catch(n){k(n?.message??"获取账号列表失败"),U.value=[]}finally{D.value=!1}}async function Z(){P.value=!0,h.value=[];try{const[n,t]=await Promise.all([F("getbrands",{}),F("getproducts",{})]),e=n?.brands??[],d=t?.products??[],w={};e.forEach(c=>{w[c.id]=c.brand||"品牌商#"+c.id});const N={};d.forEach(c=>{const A=String(c.brandid||0);(N[A]=N[A]||[]).push(c)});const ot=Object.keys(N).sort((c,A)=>(parseInt(c)||0)-(parseInt(A)||0));h.value=ot.map(c=>({fid:c,label:w[c]||(parseInt(c)?"品牌商#"+c:"未分组"),products:N[c]??[]}))}catch{h.value=[]}finally{P.value=!1}}function z(n){y.value=n?n.id:0,a.username=n&&n.username||"",a.password="",a.identity=n?n.identity:2,a.enabled=n&&!n.enabled?"0":"1",a.remark=n&&n.remark||"",i.access=x(n?.access),a.identity===2&&!i.access.length&&(i.access=G.slice()),i.apps=x(n?.apps),i.regions=x(n?.regions),i.products=x(n?.products),Z(),V.value="form"}it(()=>a.identity,n=>{n===2&&i.access.length===0&&(i.access=G.slice())});function T(){V.value="list",M()}async function tt(){const n=a.identity,t={identity:n,enabled:a.enabled==="1",remark:a.remark.trim(),access:"",apps:"",regions:"",products:""};n!==1&&(t.access=$(i.access)),(n===3||n===4)&&(t.apps=$(i.apps),t.regions=$(i.regions),t.products=$(i.products)),I.value=!0;try{if(y.value)t.id=y.value,await f("accounts/update",t);else{if(t.username=a.username.trim(),t.password=a.password,!t.username||!t.password){k("用户名和密码必填"),I.value=!1;return}await f("accounts/add",t)}S("已保存"),T()}catch(e){k(e?.message??"保存失败")}finally{I.value=!1}}async function st(n,t){const e=window.prompt("为账号【"+t+"】设置新密码:");if(e)try{await f("accounts/resetpwd",{id:n,password:e}),S("密码已重置")}catch(d){k(d?.message??"失败")}}function et(n,t){window.confirm("确认删除账号【"+t+"】?该操作不可恢复。")&&f("accounts/del",{id:n}).then(()=>{S("已删除"),M()}).catch(e=>k(e?.message??"失败"))}const O=b(null),H=b(0),p=R({name:"",cur:"",vipday:0,trademin:0,meetmin:0});function nt(n){H.value=n.id,p.name=n.username||"#"+n.id,p.cur="VIP"+(n.balance_vipday||0)+"天 · 翻译"+(n.balance_trademin||0)+"分 · 会议"+(n.balance_meetmin||0)+"分",p.vipday=0,p.trademin=0,p.meetmin=0,O.value?.showModal()}function J(){O.value?.close()}async function lt(){const n=Number(p.vipday)||0,t=Number(p.trademin)||0,e=Number(p.meetmin)||0;if(!n&&!t&&!e){Q("请至少填写一项");return}try{await f("accounts/topup",{account_id:H.value,vipday:n,trademin:t,meetmin:e}),S("余额已更新"),J(),M()}catch(d){k(d?.message??"操作失败")}}return dt(M),(n,t)=>(o(),l("div",null,[r(s("div",null,[s("div",xt,[t[21]||(t[21]=s("div",null,[s("h2",{class:"text-lg font-bold text-slate-700"},"后台账号"),s("p",{class:"text-xs text-slate-400 mt-0.5"},"超管 / 管理员 / 代理 / 运营。代理·运营可绑定应用·区域·产品,登录后仪表盘按绑定限制。")],-1)),s("button",{class:"btn btn-primary btn-sm text-white",onClick:t[0]||(t[0]=e=>z())},"+ 新建账号")]),s("div",vt,[s("table",ft,[t[24]||(t[24]=s("thead",null,[s("tr",{class:"text-slate-500"},[s("th",null,"ID"),s("th",null,"用户名"),s("th",null,"角色"),s("th",null,"状态"),s("th",null,"绑定作用域"),s("th",null,"备注"),s("th",{class:"text-right"},"操作")])],-1)),s("tbody",null,[D.value?(o(),l("tr",yt,[...t[22]||(t[22]=[s("td",{colspan:"7",class:"text-center text-slate-400 py-8"},"加载中...",-1)])])):U.value.length?L("",!0):(o(),l("tr",gt,[...t[23]||(t[23]=[s("td",{colspan:"7",class:"text-center text-slate-400 py-8"},"暂无账号(引导超管不在此列)",-1)])])),(o(!0),l(v,null,g(U.value,e=>(o(),l("tr",{key:e.id},[s("td",kt,u(e.id),1),s("td",wt,u(e.username||""),1),s("td",null,[s("span",{class:pt(["badge badge-sm",X[e.identity]||""])},u(W[e.identity]||e.identity),3)]),s("td",null,[e.enabled?(o(),l("span",_t,"启用")):(o(),l("span",ht,"停用"))]),s("td",null,[e.identity===3||e.identity===4?(o(),l(v,{key:0},[q(e).length?(o(),l("span",Ct,u(q(e).join(" · ")),1)):(o(),l("span",St,"未绑定(不限)"))],64)):e.identity===2?(o(),l(v,{key:1},[e.access?(o(),l("span",Vt,"菜单:"+u(x(e.access).length),1)):(o(),l("span",Ut,"默认(除SaaS/系统管理)"))],64)):(o(),l("span",Et,"全部权限")),e.identity===3?(o(),l("div",It," 余额 VIP"+u(e.balance_vipday||0)+"天 · 翻译"+u(e.balance_trademin||0)+"分 · 会议"+u(e.balance_meetmin||0)+"分 ",1)):L("",!0)]),s("td",$t,u(e.remark||""),1),s("td",null,[s("div",Mt,[e.identity===3?(o(),l("button",{key:0,class:"btn btn-ghost btn-xs text-emerald-600",onClick:d=>nt(e)},"充值",8,Nt)):L("",!0),s("button",{class:"btn btn-ghost btn-xs",onClick:d=>z(e)},"编辑",8,At),s("button",{class:"btn btn-ghost btn-xs text-amber-600",onClick:d=>st(e.id,e.username)},"改密",8,Lt),s("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:d=>et(e.id,e.username)},"删除",8,jt)])])]))),128))])])])],512),[[C,V.value==="list"]]),r(s("div",null,[s("div",Dt,[s("button",{class:"btn btn-ghost btn-sm",onClick:t[1]||(t[1]=e=>T())},"← 返回列表"),s("h2",Pt,u(y.value?"编辑账号 #"+y.value:"新建账号"),1)]),s("div",Tt,[s("div",Ot,[s("div",null,[t[25]||(t[25]=s("label",{class:"text-xs text-slate-500"},"用户名",-1)),r(s("input",{"onUpdate:modelValue":t[2]||(t[2]=e=>a.username=e),disabled:!!y.value,class:"input input-bordered input-sm w-full",placeholder:"登录用户名"},null,8,Bt),[[_,a.username]])]),r(s("div",null,[t[26]||(t[26]=s("label",{class:"text-xs text-slate-500"},"密码",-1)),r(s("input",{"onUpdate:modelValue":t[3]||(t[3]=e=>a.password=e),type:"password",class:"input input-bordered input-sm w-full",placeholder:"登录密码"},null,512),[[_,a.password]])],512),[[C,!y.value]]),s("div",null,[t[28]||(t[28]=s("label",{class:"text-xs text-slate-500"},"角色",-1)),r(s("select",{"onUpdate:modelValue":t[4]||(t[4]=e=>a.identity=e),class:"select select-bordered select-sm w-full"},[...t[27]||(t[27]=[s("option",{value:2},"管理员(默认除 SaaS/系统管理外全部)",-1),s("option",{value:3},"代理(外部,按绑定限制)",-1),s("option",{value:4},"运营(内部,按绑定限制)",-1),s("option",{value:1},"超管(全部权限)",-1)])],512),[[K,a.identity,void 0,{number:!0}]])]),s("div",null,[t[30]||(t[30]=s("label",{class:"text-xs text-slate-500"},"状态",-1)),r(s("select",{"onUpdate:modelValue":t[5]||(t[5]=e=>a.enabled=e),class:"select select-bordered select-sm w-full"},[...t[29]||(t[29]=[s("option",{value:"1"},"启用",-1),s("option",{value:"0"},"停用",-1)])],512),[[K,a.enabled]])]),s("div",Gt,[t[31]||(t[31]=s("label",{class:"text-xs text-slate-500"},"备注",-1)),r(s("input",{"onUpdate:modelValue":t[6]||(t[6]=e=>a.remark=e),class:"input input-bordered input-sm w-full",placeholder:"可选"},null,512),[[_,a.remark]])])]),r(s("div",Rt,[s("div",Ft,[t[32]||(t[32]=s("div",{class:"text-sm font-semibold text-slate-600"},"菜单权限",-1)),s("div",qt,[s("button",{type:"button",class:"btn btn-ghost btn-xs",onClick:t[7]||(t[7]=e=>i.access=B(G).slice())},"管理员默认"),s("button",{type:"button",class:"btn btn-ghost btn-xs",onClick:t[8]||(t[8]=e=>i.access=B(ut).slice())},"全选"),s("button",{type:"button",class:"btn btn-ghost btn-xs",onClick:t[9]||(t[9]=e=>i.access=[])},"清空")])]),t[33]||(t[33]=s("p",{class:"text-xs text-slate-400 mb-3"},"管理员默认开放除「SaaS 管理 / 系统管理」以外的全部菜单(权限留空时按默认生效);代理/运营需显式勾选。",-1)),(o(!0),l(v,null,g(B(rt),e=>(o(),l("div",{key:e.label,class:"mb-2.5"},[s("div",zt,[m(u(e.label),1),e.restricted?(o(),l("span",Ht,"(管理员默认不开放)")):L("",!0)]),s("div",Jt,[(o(!0),l(v,null,g(e.items,d=>(o(),l("label",{key:d.id,class:"chk"},[r(s("input",{"onUpdate:modelValue":t[10]||(t[10]=w=>i.access=w),type:"checkbox",value:d.id},null,8,Kt),[[j,i.access]]),m(u(d.label),1)]))),128))])]))),128))],512),[[C,a.identity!==1]]),r(s("div",Qt,[t[37]||(t[37]=s("div",{class:"text-sm font-semibold text-slate-600 mb-2"},[m("作用域绑定 "),s("span",{class:"text-xs text-slate-400 font-normal"},"(代理/运营生效;限制仪表盘数据范围)")],-1)),s("div",Wt,[t[34]||(t[34]=s("div",{class:"text-xs text-slate-500 mb-1.5"},[m("绑定应用 "),s("span",{class:"text-slate-300"},"(仪表盘只显示这些应用数据;不勾=不限)")],-1)),s("div",Xt,[E.value.length?(o(!0),l(v,{key:0},g(E.value,e=>(o(),l("label",{key:e.id,class:"chk"},[r(s("input",{"onUpdate:modelValue":t[11]||(t[11]=d=>i.apps=d),type:"checkbox",value:e.name},null,8,Yt),[[j,i.apps]]),m(u(e.name||"应用#"+e.id),1)]))),128)):(o(),l("span",Zt,"无注册应用"))])]),s("div",ts,[t[35]||(t[35]=s("div",{class:"text-xs text-slate-500 mb-1.5"},[m("绑定区域 "),s("span",{class:"text-slate-300"},"(不勾=不限)")],-1)),s("div",ss,[(o(),l(v,null,g(Y,e=>s("label",{key:e[0],class:"chk"},[r(s("input",{"onUpdate:modelValue":t[12]||(t[12]=d=>i.regions=d),type:"checkbox",value:e[0]},null,8,es),[[j,i.regions]]),m(u(e[1]),1)])),64))])]),s("div",null,[t[36]||(t[36]=s("div",{class:"text-xs text-slate-500 mb-1.5"},[m("绑定产品 "),s("span",{class:"text-slate-300"},"(按厂家分组;仪表盘只显示这些产品数据;不勾=不限)")],-1)),s("div",ns,[P.value?(o(),l("span",ls,"加载产品中...")):h.value.length?(o(!0),l(v,{key:2},g(h.value,e=>(o(),l("div",{key:e.fid,class:"mb-2 last:mb-0"},[s("div",as,"🏭 "+u(e.label),1),s("div",is,[(o(!0),l(v,null,g(e.products,d=>(o(),l("label",{key:d.id,class:"chk"},[r(s("input",{"onUpdate:modelValue":t[13]||(t[13]=w=>i.products=w),type:"checkbox",value:String(d.id)},null,8,ds),[[j,i.products]]),m(u((d.devicename||"产品")+" #"+d.id),1)]))),128))])]))),128)):(o(),l("span",os,"无产品"))])])],512),[[C,a.identity===3||a.identity===4]]),s("div",us,[s("button",{class:"btn btn-ghost btn-sm",onClick:t[14]||(t[14]=e=>T())},"取消"),s("button",{class:"btn btn-primary btn-sm text-white",disabled:I.value,onClick:t[15]||(t[15]=e=>tt())},"保存",8,rs)])])],512),[[C,V.value==="form"]]),s("dialog",{ref_key:"topupModal",ref:O,class:"modal"},[s("div",ps,[t[43]||(t[43]=s("h3",{class:"font-bold text-lg mb-1"},"充值 / 调整资源点",-1)),s("p",cs,[t[38]||(t[38]=m("代理:",-1)),s("span",ms,u(p.name),1),t[39]||(t[39]=m("。填增量(可填负数下调),当前余额:",-1)),s("span",bs,u(p.cur),1)]),s("div",xs,[s("div",null,[t[40]||(t[40]=s("label",{class:"text-xs text-slate-500"},"VIP天数",-1)),r(s("input",{"onUpdate:modelValue":t[16]||(t[16]=e=>p.vipday=e),type:"number",class:"input input-bordered input-sm w-full"},null,512),[[_,p.vipday,void 0,{number:!0}]])]),s("div",null,[t[41]||(t[41]=s("label",{class:"text-xs text-slate-500"},"翻译分钟",-1)),r(s("input",{"onUpdate:modelValue":t[17]||(t[17]=e=>p.trademin=e),type:"number",class:"input input-bordered input-sm w-full"},null,512),[[_,p.trademin,void 0,{number:!0}]])]),s("div",null,[t[42]||(t[42]=s("label",{class:"text-xs text-slate-500"},"会议分钟",-1)),r(s("input",{"onUpdate:modelValue":t[18]||(t[18]=e=>p.meetmin=e),type:"number",class:"input input-bordered input-sm w-full"},null,512),[[_,p.meetmin,void 0,{number:!0}]])])]),s("div",vs,[s("button",{class:"btn btn-ghost btn-sm",onClick:t[19]||(t[19]=e=>J())},"取消"),s("button",{class:"btn btn-primary btn-sm text-white",onClick:t[20]||(t[20]=e=>lt())},"确认")])]),t[44]||(t[44]=s("form",{method:"dialog",class:"modal-backdrop"},[s("button",null,"close")],-1))],512)]))}}),hs=ct(fs,[["__scopeId","data-v-06dca20b"]]);export{hs as default};
|
|
|