2 lines
6.5 KiB
JavaScript
2 lines
6.5 KiB
JavaScript
import{_ as D,u as E,g as F,h as g,c as o,a as t,i as c,d as i,F as S,j as T,w as N,t as u,b as p,k as I,v as b,r as y,l as V,m as A,o as a,B as O,n as q}from"./index-z4tF8s-R.js";const G={class:"toolbar"},H={class:"panel"},J={class:"data-table"},K={key:0},Q={key:1},W={key:2},X=["onClick"],Y=["onClick"],Z=["onClick"],w={key:0,class:"empty"},ee={class:"modal"},te={class:"modal-header"},ne={class:"modal-body"},le={class:"form-group"},se=["disabled"],oe={key:0,class:"form-group"},ae=["value"],ie={class:"form-group"},ue={class:"form-group"},de=["placeholder","disabled"],re={key:1,class:"form-group"},pe={key:2,class:"form-group"},me={class:"form-group"},ce={key:3,class:"form-error"},ve={__name:"PermissionsView",setup(be){const d=E(),B=y([]),f=y(!1),m=y(null),C=y(!1),r=y(""),n=A({type:"dir",parent_id:null,name:"",code:"",path:"",icon:"",sort_order:0}),_=V(()=>{const s=[],e=(l,v=0)=>{var U;for(const $ of l||[])s.push({...$,depth:v}),(U=$.children)!=null&&U.length&&e($.children,v+1)};return e(B.value),s}),L=V(()=>n.type==="menu"?_.value.filter(s=>s.type==="dir").map(s=>({id:s.id,label:s.name})):n.type==="btn"?_.value.filter(s=>s.type==="menu").map(s=>({id:s.id,label:`${s.name} (${s.code})`})):[]),P=V(()=>n.type==="dir"?"dir:custom":n.type==="menu"?"menu:custom":"btn:custom:action");F(x);async function x(){var e;const s=await g.get("/admin/permissions/tree");B.value=((e=s.data.data)==null?void 0:e.tree)||[]}function M(s){return{dir:"目录",menu:"菜单",btn:"按钮"}[s]||s}function h(s,e=null){m.value=null,C.value=!1,n.type=s,n.parent_id=e,n.name="",n.code="",n.path="",n.icon="",n.sort_order=0,r.value="",f.value=!0}function R(s){m.value=s.id,C.value=!!s.is_system,n.type=s.type,n.parent_id=s.parent_id,n.name=s.name,n.code=s.code,n.path=s.path||"",n.icon=s.icon||"",n.sort_order=s.sort_order||0,r.value="",f.value=!0}function k(){f.value=!1}async function j(){if(r.value="",!n.name.trim()){r.value="请填写名称";return}if(n.type!=="dir"&&!n.parent_id){r.value="请选择上级";return}const s={type:n.type,name:n.name.trim(),code:n.code.trim()||void 0,parent_id:n.type==="dir"?null:n.parent_id,path:n.path.trim(),icon:n.icon.trim(),sort_order:n.sort_order};try{m.value?await g.put(`/admin/permissions/${m.value}`,s):await g.post("/admin/permissions",s),k(),await x(),await d.loadMenuTree()}catch(e){r.value=e.message||"保存失败"}}async function z(s){if(confirm(`确定删除「${s.name}」?`))try{await g.delete(`/admin/permissions/${s.id}`),await x(),await d.loadMenuTree()}catch(e){alert(e.message||"删除失败")}}return(s,e)=>(a(),o("div",null,[e[20]||(e[20]=t("div",{class:"page-header"},[t("h2",null,"权限管理"),t("p",null,"维护目录、菜单、按钮节点,角色勾选后即可生效")],-1)),t("div",G,[c(d).hasButton("btn:perm:create")?(a(),o("button",{key:0,class:"btn btn-primary",onClick:e[0]||(e[0]=l=>h("dir"))},"新增目录")):i("",!0),c(d).hasButton("btn:perm:create")?(a(),o("button",{key:1,class:"btn btn-ghost",onClick:e[1]||(e[1]=l=>h("menu"))},"新增菜单")):i("",!0),c(d).hasButton("btn:perm:create")?(a(),o("button",{key:2,class:"btn btn-ghost",onClick:e[2]||(e[2]=l=>h("btn"))},"新增按钮")):i("",!0)]),t("div",H,[t("table",J,[e[10]||(e[10]=t("thead",null,[t("tr",null,[t("th",null,"名称"),t("th",null,"类型"),t("th",null,"标识"),t("th",null,"路径 / 图标"),t("th",null,"系统"),t("th",null,"操作")])],-1)),t("tbody",null,[(a(!0),o(S,null,T(_.value,l=>(a(),o("tr",{key:l.id||l.code},[t("td",null,[t("span",{style:O({paddingLeft:`${l.depth*18}px`})},u(l.name),5)]),t("td",null,[t("span",{class:q(["type-badge",l.type])},u(M(l.type)),3)]),t("td",null,[t("code",null,u(l.code),1)]),t("td",null,[l.path?(a(),o("span",K,u(l.path),1)):i("",!0),l.icon?(a(),o("span",Q,u(l.icon),1)):i("",!0),!l.path&&!l.icon?(a(),o("span",W,"-")):i("",!0)]),t("td",null,u(l.is_system?"是":"否"),1),t("td",null,[c(d).hasButton("btn:perm:create")&&l.type!=="btn"?(a(),o("button",{key:0,class:"btn btn-ghost",onClick:v=>h(l.type==="dir"?"menu":"btn",l.id)},"添加下级",8,X)):i("",!0),c(d).hasButton("btn:perm:edit")?(a(),o("button",{key:1,class:"btn btn-ghost",onClick:v=>R(l)},"编辑",8,Y)):i("",!0),c(d).hasButton("btn:perm:delete")&&!l.is_system?(a(),o("button",{key:2,class:"btn btn-ghost danger",onClick:v=>z(l)},"删除",8,Z)):i("",!0)])]))),128))])]),_.value.length?i("",!0):(a(),o("p",w,"暂无权限节点,请先执行数据库迁移"))]),f.value?(a(),o("div",{key:0,class:"modal-overlay",onClick:N(k,["self"])},[t("div",ee,[t("div",te,[t("h3",null,u(m.value?"编辑权限":"新增"+M(n.type)),1),t("button",{onClick:k},"×")]),t("div",ne,[t("div",le,[e[12]||(e[12]=t("label",null,"类型",-1)),p(t("select",{"onUpdate:modelValue":e[3]||(e[3]=l=>n.type=l),class:"form-select",disabled:!!m.value},[...e[11]||(e[11]=[t("option",{value:"dir"},"目录",-1),t("option",{value:"menu"},"菜单",-1),t("option",{value:"btn"},"按钮",-1)])],8,se),[[I,n.type]])]),n.type!=="dir"?(a(),o("div",oe,[e[13]||(e[13]=t("label",null,"上级",-1)),p(t("select",{"onUpdate:modelValue":e[4]||(e[4]=l=>n.parent_id=l),class:"form-select"},[(a(!0),o(S,null,T(L.value,l=>(a(),o("option",{key:l.id,value:l.id},u(l.label),9,ae))),128))],512),[[I,n.parent_id]])])):i("",!0),t("div",ie,[e[14]||(e[14]=t("label",null,"名称",-1)),p(t("input",{"onUpdate:modelValue":e[5]||(e[5]=l=>n.name=l),class:"form-input",placeholder:"显示名称"},null,512),[[b,n.name]])]),t("div",ue,[e[15]||(e[15]=t("label",null,"标识 code",-1)),p(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>n.code=l),class:"form-input",placeholder:P.value,disabled:C.value},null,8,de),[[b,n.code]]),e[16]||(e[16]=t("div",{class:"field-hint"},"建议格式:dir:xxx / menu:xxx / btn:xxx:action",-1))]),n.type==="menu"?(a(),o("div",re,[e[17]||(e[17]=t("label",null,"路由路径",-1)),p(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>n.path=l),class:"form-input",placeholder:"如 /users"},null,512),[[b,n.path]])])):i("",!0),n.type==="menu"?(a(),o("div",pe,[e[18]||(e[18]=t("label",null,"图标",-1)),p(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>n.icon=l),class:"form-input",placeholder:"可选 emoji"},null,512),[[b,n.icon]])])):i("",!0),t("div",me,[e[19]||(e[19]=t("label",null,"排序",-1)),p(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>n.sort_order=l),type:"number",class:"form-input"},null,512),[[b,n.sort_order,void 0,{number:!0}]])]),r.value?(a(),o("p",ce,u(r.value),1)):i("",!0)]),t("div",{class:"modal-footer"},[t("button",{class:"btn btn-ghost",onClick:k},"取消"),t("button",{class:"btn btn-primary",onClick:j},"保存")])])])):i("",!0)]))}},fe=D(ve,[["__scopeId","data-v-f8ed284c"]]);export{fe as default};
|