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