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

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