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