2 lines
6.8 KiB
JavaScript
2 lines
6.8 KiB
JavaScript
import{_ as I,u as J,g as q,h,y as N,c as l,a as e,i as B,d as p,F as b,j as _,w as G,t as r,b as M,v as P,x as H,s as C,r as g,m as K,z as Q,o as i,A as X}from"./index-z4tF8s-R.js";const Y={class:"toolbar"},Z={class:"panel"},ss={class:"data-table"},es={class:"perm-tags"},ts={key:0,class:"field-hint"},ns=["onClick"],as=["onClick"],os={class:"modal modal-wide"},ls={class:"modal-header"},is={class:"modal-body"},cs={class:"form-group"},us={class:"form-group"},rs={class:"form-group"},ds={class:"check-item top-check"},ms={class:"perm-section"},ps={class:"check-item dir-check"},fs=["checked","onChange"],hs={class:"check-item"},bs=["checked","onChange"],_s={key:0,class:"perm-btns"},gs=["checked","onChange"],vs={key:0,class:"form-error"},ys={__name:"RolesView",setup(ks){const w=J(),V=g([]),v=g(N),y=g(!1),f=g(null),d=g(""),t=K({name:"",slug:"",can_access_admin:!1,dirs:[],menus:[],buttons:[]});q(async()=>{await Promise.all([x(),T()])});async function x(){const n=await h.get("/admin/roles");V.value=n.data.data||[]}async function T(){var n,s;try{const a=await h.get("/admin/permissions/tree");(s=(n=a.data.data)==null?void 0:n.tree)!=null&&s.length&&(v.value=a.data.data.tree)}catch{v.value=N}}function R(n){return X(z(n))}function A(n){return n.startsWith("dir:")?t.dirs.includes(n):n.startsWith("menu:")?t.menus.includes(n):n.startsWith("btn:")?t.buttons.includes(n):!1}function m(n,s,a){const o=t[n],c=o.indexOf(s);a&&c<0&&o.push(s),!a&&c>=0&&o.splice(c,1)}function j(n,s){m("dirs",n.code,s);for(const a of n.children||[])$(n,a,s,!1);s&&(t.can_access_admin=!0)}function $(n,s,a,o=!0){m("menus",s.code,a);for(const c of s.children||[])m("buttons",c.code,a);if(o){const c=(n.children||[]).some(u=>t.menus.includes(u.code));m("dirs",n.code,c)}a&&(t.can_access_admin=!0)}function D(n,s,a,o){m("buttons",a.code,o);const c=(s.children||[]).some(u=>t.buttons.includes(u.code));o||c?(m("menus",s.code,!0),m("dirs",n.code,!0),t.can_access_admin=!0):(s.children||[]).length&&!c&&t.menus.includes(s.code)}function L(){t.can_access_admin=!0,t.dirs=[],t.menus=[],t.buttons=[];for(const n of v.value){t.dirs.push(n.code);for(const s of n.children||[]){t.menus.push(s.code);for(const a of s.children||[])t.buttons.push(a.code)}}}function O(){Object.assign(t,{...t,can_access_admin:!1,dirs:[],menus:[],buttons:[]}),t.dirs=[],t.menus=[],t.buttons=[],t.can_access_admin=!1}function S(){f.value=null,t.name="",t.slug="";const n=Q();t.can_access_admin=n.can_access_admin,t.dirs=[],t.menus=[],t.buttons=[],d.value="",y.value=!0}function U(n){f.value=n.id,t.name=n.name,t.slug=n.slug;const s=z(n.permissions);t.can_access_admin=!!s.can_access_admin,t.dirs=[...s.dirs],t.menus=[...s.menus],t.buttons=[...s.buttons],d.value="",y.value=!0}function z(n){let s=n;if(typeof s=="string")try{s=JSON.parse(s)}catch{s={}}return(!s||typeof s!="object")&&(s={}),{can_access_admin:!!s.can_access_admin,dirs:Array.isArray(s.dirs)?s.dirs:[],menus:Array.isArray(s.menus)?s.menus:[],buttons:Array.isArray(s.buttons)?s.buttons:[]}}function k(){y.value=!1}async function W(){if(d.value="",!t.name.trim()){d.value="请填写角色名称";return}const n={name:t.name.trim(),slug:t.slug.trim()||void 0,permissions:{can_access_admin:t.can_access_admin,dirs:[...t.dirs],menus:[...t.menus],buttons:[...t.buttons]}};try{f.value?await h.put(`/admin/roles/${f.value}`,n):await h.post("/admin/roles",n),k(),await x()}catch(s){d.value=s.message||"保存失败"}}async function E(n){if(confirm(`确定删除角色「${n.name}」?`))try{await h.delete(`/admin/roles/${n.id}`),await x()}catch(s){alert(s.message||"删除失败")}}return(n,s)=>(i(),l("div",null,[s[11]||(s[11]=e("div",{class:"page-header"},[e("h2",null,"角色管理"),e("p",null,"配置目录权限、菜单权限与按钮权限")],-1)),e("div",Y,[B(w).hasButton("btn:role:create")?(i(),l("button",{key:0,class:"btn btn-primary",onClick:S},"新增角色")):p("",!0)]),e("div",Z,[e("table",ss,[s[3]||(s[3]=e("thead",null,[e("tr",null,[e("th",null,"名称"),e("th",null,"标识"),e("th",null,"权限摘要"),e("th",null,"操作")])],-1)),e("tbody",null,[(i(!0),l(b,null,_(V.value,a=>(i(),l("tr",{key:a.id},[e("td",null,r(a.name),1),e("td",null,[e("code",null,r(a.slug),1)]),e("td",null,[e("div",es,[(i(!0),l(b,null,_(R(a.permissions),o=>(i(),l("span",{key:o,class:"perm-tag"},r(o),1))),128)),R(a.permissions).length?p("",!0):(i(),l("span",ts,"无权限"))])]),e("td",null,[B(w).hasButton("btn:role:edit")?(i(),l("button",{key:0,class:"btn btn-ghost",onClick:o=>U(a)},"编辑",8,ns)):p("",!0),B(w).hasButton("btn:role:delete")&&a.slug!=="super_admin"?(i(),l("button",{key:1,class:"btn btn-ghost danger",onClick:o=>E(a)},"删除",8,as)):p("",!0)])]))),128))])])]),y.value?(i(),l("div",{key:0,class:"modal-overlay",onClick:G(k,["self"])},[e("div",os,[e("div",ls,[e("h3",null,r(f.value?"编辑角色":"新增角色"),1),e("button",{onClick:k},"×")]),e("div",is,[e("div",cs,[s[4]||(s[4]=e("label",null,"角色名称",-1)),M(e("input",{"onUpdate:modelValue":s[0]||(s[0]=a=>t.name=a),class:"form-input",placeholder:"如:部门主管"},null,512),[[P,t.name]])]),e("div",us,[s[5]||(s[5]=e("label",null,"标识 slug",-1)),M(e("input",{"onUpdate:modelValue":s[1]||(s[1]=a=>t.slug=a),class:"form-input",placeholder:"英文标识,留空自动生成"},null,512),[[P,t.slug]])]),e("div",rs,[e("label",ds,[M(e("input",{type:"checkbox","onUpdate:modelValue":s[2]||(s[2]=a=>t.can_access_admin=a)},null,512),[[H,t.can_access_admin]]),s[6]||(s[6]=C(" 允许访问管理后台 ",-1))])]),e("div",ms,[e("div",{class:"perm-section-header"},[s[7]||(s[7]=e("span",null,"权限树(目录 / 菜单 / 按钮)",-1)),e("div",{class:"perm-actions"},[e("button",{type:"button",class:"btn btn-ghost",onClick:L},"全选"),e("button",{type:"button",class:"btn btn-ghost",onClick:O},"清空")])]),(i(!0),l(b,null,_(v.value,a=>(i(),l("div",{key:a.code,class:"perm-dir"},[e("label",ps,[e("input",{type:"checkbox",checked:A(a.code),onChange:o=>j(a,o.target.checked)},null,40,fs),s[8]||(s[8]=e("span",{class:"type-badge dir"},"目录",-1)),C(" "+r(a.name),1)]),(i(!0),l(b,null,_(a.children,o=>{var c;return i(),l("div",{key:o.code,class:"perm-menu"},[e("label",hs,[e("input",{type:"checkbox",checked:A(o.code),onChange:u=>$(a,o,u.target.checked)},null,40,bs),s[9]||(s[9]=e("span",{class:"type-badge menu"},"菜单",-1)),C(" "+r(o.name),1)]),(c=o.children)!=null&&c.length?(i(),l("div",_s,[(i(!0),l(b,null,_(o.children,u=>(i(),l("label",{key:u.code,class:"check-item btn-check"},[e("input",{type:"checkbox",checked:A(u.code),onChange:F=>D(a,o,u,F.target.checked)},null,40,gs),s[10]||(s[10]=e("span",{class:"type-badge btn"},"按钮",-1)),C(" "+r(u.name),1)]))),128))])):p("",!0)])}),128))]))),128))]),d.value?(i(),l("p",vs,r(d.value),1)):p("",!0)]),e("div",{class:"modal-footer"},[e("button",{class:"btn btn-ghost",onClick:k},"取消"),e("button",{class:"btn btn-primary",onClick:W},"保存")])])])):p("",!0)]))}},ws=I(ys,[["__scopeId","data-v-fc345f7d"]]);export{ws as default};
|