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
13 KiB

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