Parcourir la source

优化资源管理的页面和接口

reghao il y a 4 ans
Parent
commit
5b4b947c44

+ 12 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/ResourceController.java

@@ -1,6 +1,8 @@
 package cn.reghao.autodop.dmaster.auth.controller;
 
 import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
+import cn.reghao.autodop.dmaster.auth.entity.po.Role;
+import cn.reghao.autodop.dmaster.auth.entity.vo.MenuVO;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.auth.service.ResourceService;
 import io.swagger.annotations.Api;
@@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author reghao
@@ -26,16 +29,17 @@ public class ResourceController {
         this.resourceService = resourceService;
     }
 
-    @ApiOperation(value = "添加/修改资源")
+    @ApiOperation(value = "添加资源")
     @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
     public String addMenu(@Validated Menu menu) {
-        if (menu.getId() == null) {
-            // TODO menu 最多只能有两个 parent,即最多只能有三级菜单
-            resourceService.addResource(menu);
-        } else {
-            // TODO 禁止修改 menu 的URL,父级菜单和菜单类型
-            resourceService.updateResource(menu);
-        }
+        resourceService.addResource(menu);
+        return WebBody.success();
+    }
+
+    @ApiOperation(value = "修改资源")
+    @PostMapping(value = "/edit", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String modifyMenu(@Validated MenuVO menu, @RequestParam("roles") Set<Role> roles) {
+        resourceService.updateResource(menu, roles);
         return WebBody.success();
     }
 

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/ResourcePageController.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.auth.controller;
 import cn.reghao.autodop.dmaster.auth.db.query.RoleQuery;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
 import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
+import cn.reghao.autodop.dmaster.auth.entity.vo.MenuVO;
 import cn.reghao.autodop.dmaster.auth.service.ResourceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -73,9 +74,9 @@ public class ResourcePageController {
 
         model.addAttribute("allRoles", allRoles);
         model.addAttribute("menuRoles", menuRoles);
-        model.addAttribute("menu", menu);
+        model.addAttribute("menu", new MenuVO(menu));
         model.addAttribute("pMenu", pMenu);
-        return "/auth/menu/add";
+        return "/auth/menu/edit";
     }
 
     // TODO Hibernate 会根据传入的 id 自动查找相应的 Menu

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/po/Menu.java

@@ -36,6 +36,7 @@ public class Menu extends BaseEntity<Integer> {
     @NotBlank(message = "菜单类型不能为空白字符串")
     private String type;
     private String icon;
+    @Transient
     private String remark;
     private Boolean isEnabled;
     // 可访问资源的角色,一个资源可被多个角色访问

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/po/Role.java

@@ -27,6 +27,7 @@ public class Role extends BaseEntity<Integer> {
     private String name;
     private String description;
     // 角色可访问的资源,一个角色可访问多个资源
+    // TODO Role 端维护 Role 和 Menu 之间的关系
     @ManyToMany
     @JoinTable(name = "role_menu",
             joinColumns = @JoinColumn(name = "role_id"),

+ 40 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/vo/MenuVO.java

@@ -0,0 +1,40 @@
+package cn.reghao.autodop.dmaster.auth.entity.vo;
+
+import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2021-07-15 14:06:13
+ */
+@NoArgsConstructor
+@Data
+public class MenuVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @NotNull(message = "菜单 ID 不能为 NULL")
+    private Integer menuId;
+    // 父级菜单 ID
+    @NotNull(message = "父级菜单不能为 NULL")
+    private Integer pid;
+    // 在同一个 pid 组内的位置,作为排序使用
+    private Integer pos;
+    @NotBlank(message = "菜单名不能为空白字符串")
+    private String name;
+    @NotBlank(message = "URL 地址不能为空白字符串,目录类型使用可使用 # 字符")
+    private String url;
+    private String icon;
+
+    public MenuVO(Menu menu) {
+        this.menuId = menu.getId();
+        this.pid = menu.getPid();
+        this.pos = menu.getPos();
+        this.name = menu.getName();
+        this.url = menu.getUrl();
+        this.icon = menu.getIcon();
+    }
+}

+ 0 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/MenuService.java

@@ -1,8 +0,0 @@
-package cn.reghao.autodop.dmaster.auth.service;
-
-/**
- * @author reghao
- * @date 2021-07-14 20:39:55
- */
-public interface MenuService {
-}

+ 114 - 110
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/ResourceService.java

@@ -1,7 +1,9 @@
 package cn.reghao.autodop.dmaster.auth.service;
 
+import cn.reghao.autodop.dmaster.auth.entity.MenuType;
 import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
+import cn.reghao.autodop.dmaster.auth.entity.vo.MenuVO;
 import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
 import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
 import lombok.extern.slf4j.Slf4j;
@@ -26,9 +28,29 @@ public class ResourceService {
         this.roleRepository = roleRepository;
     }
 
-    public void addResource(Menu menu) {
+    public synchronized void addResource(Menu menu) {
+        // menu 最多只能有两个 parent,即最多只能有三级菜单
+        checkMenu(menu);
+        // 调整 menu 组内元素的位置
+        adjustPosition(menu);
+        menu.setIsEnabled(true);
+        Menu menuEntity = menuRepository.save(menu);
+
+        Set<Role> roles = menu.getRoles();
+        roles.forEach(role -> role.getMenus().add(menuEntity));
+        roleRepository.saveAll(roles);
+    }
+
+    /**
+     * 检查菜单的层级
+     *
+     * @param
+     * @return
+     * @date 2021-07-15 上午11:15
+     */
+    private void checkMenu(Menu menu) {
         int pid = menu.getPid();
-        /*if (pid != 0) {
+        if (pid != 0) {
             Menu menu1 = getResourceById(pid);
             int pid1 = menu1.getPid();
             if (pid1 != 0) {
@@ -39,144 +61,125 @@ public class ResourceService {
                     return;
                 }
             }
-        }*/
-
-        menu.setIsEnabled(true);
-        int pos = menu.getPos()+1;
-        if (adjustPosition(pid, pos)) {
-            menu.setPos(pos);
-            //menuRepository.save(menu);
         }
     }
 
     /**
-     * TODO 某个 menu 的位置调整后,调整同一组内其他 menu 的相对位置
+     * 调整同一 pid 组内 menu 的位置
      *
-     * @param pid 组 ID
-     * @param pos 当前 menu 的最新位置
-     * @return
      * @date 2021-05-18 上午9:54
      */
-    private boolean adjustPosition(int pid, int pos) {
-        List<Menu> menus = menuRepository.findByPid(pid);
-        int size = menus.size();
-        if (pos > size+1) {
-            return false;
-        }
-
-        // 组内没有menu 或新增的 menu 在组内排在最后一位
-        if (menus.isEmpty() || pos == size) {
-            return true;
+    private void adjustPosition(Menu menu) {
+        int pid = menu.getPid();
+        if (pid != 0) {
+            Menu pMenu = menuRepository.getOne(pid);
+            if (pMenu.getType().equals(MenuType.PAGE.name())) {
+                log.error("父级菜单的类型不能是 PAGE");
+                return;
+            }
         }
 
-        // 新增的 menu 在组内排在第 1 位
-        if (pos == 0) {
-            // 组内的元素均后移一位
-            List<Menu> tmpList = menus.stream().peek(menu1 -> {
-                int tmp = menu1.getPos();
-                menu1.setPos(tmp+1);
-            }).collect(Collectors.toList());
-            menuRepository.saveAll(tmpList);
-            return true;
+        List<Menu> menus = menuRepository.findByPid(pid);
+        menus.sort(Comparator.comparingInt(Menu::getPos));
+        // 组内没有 menu 或新增的 menu 在组内排在最后一位
+        if (menus.isEmpty()) {
+            menu.setPos(1);
+            return;
         }
 
-        // 新增的 menu 插入到组中间
-        Map<Integer, Menu> map = menus.stream().collect(Collectors.toMap(Menu::getPos, menu1 -> menu1));
-        // 需要调整顺序的 menu
-        List<Menu> tmpList = new ArrayList<>();
-        for (int i = pos+1; i <= size; i++) {
-            Menu menu = map.get(i);
-            int tmp = menu.getPos();
-            menu.setPos(tmp+1);
-            menu.setUpdateTime(LocalDateTime.now());
-            tmpList.add(menu);
+        // menu 的位置
+        int pos = menu.getPos()+1;
+        int size = menus.size();
+        if (pos == 1) {
+            // menu 的位置在 menu 组的首位, 组内的其他元素位置向后移一位
+            menu.setPos(1);
+            moveBackward(menus, 1);
+        } else if (pos >= size+1) {
+            // menu 的位置在 menu 组的末尾, 组内的其他元素位置不变
+            menu.setPos(size+1);
+        } else {
+            // menu 的位置在 menu 组的中间, pos 开始的元素位置向后移一位
+            menu.setPos(pos);
+            moveBackward(menus, pos);
         }
-        menuRepository.saveAll(tmpList);
-        return true;
     }
 
-    public boolean updateResource(Menu menu) {
-        Optional<Menu> optionalMenu = menuRepository.findById(menu.getId());
-        if (!optionalMenu.isPresent()) {
-            return false;
-        }
-
-        Menu menuEntity = optionalMenu.get();
-        int oldPos = menuEntity.getPos();
-        int newPos = menu.getPos();
-        // menu 位置发生改变
-        if (oldPos != newPos+1) {
-            Map<Integer, Menu> map = menuRepository.findByPid(menu.getPid()).stream()
-                    .collect(Collectors.toMap(Menu::getPos, menu1 -> menu1));
-            int size = map.size();
-
-            // 元素移动到最后一位
-            if (newPos == size) {
-                List<Menu> tmpList = new ArrayList<>();
-                for (int i = oldPos+1; i <= newPos; i++) {
-                    Menu tmp = map.get(i);
-                    tmp.setPos(tmp.getPos()-1);
-                    tmpList.add(tmp);
-                }
-                menuRepository.saveAll(tmpList);
-                menu.setUpdateTime(LocalDateTime.now());
-                menuRepository.save(menu);
-                return true;
-            } else if (newPos < size) {
-                adjustPosition1(map, oldPos, newPos+1);
-            } else {
-                return false;
-            }
+    /**
+     * 向后移动元素
+     *
+     * @return
+     * @date 2021-07-15 下午5:07
+     */
+    private void moveBackward(List<Menu> menus, int startPos) {
+        for (int i = startPos-1; i < menus.size(); i++) {
+            Menu tmpMenu = menus.get(i);
+            int newPos = tmpMenu.getPos()+1;
+            tmpMenu.setPos(newPos);
         }
-
-        menu.setPos(newPos+1);
-        menu.setUpdateTime(LocalDateTime.now());
-        menuRepository.save(menu);
-        return true;
+        menuRepository.saveAll(menus);
     }
 
     /**
-     * TODO 调整组内 menu 的顺序
+     * 向前移动元素
      *
      * @param
      * @return
-     * @date 2021-05-19 下午2:15
+     * @date 2021-07-15 下午5:41
      */
-    private void adjustPosition1(Map<Integer, Menu> map, int oldPos, int newPos) {
-        List<Menu> tmpList = new ArrayList<>();
-        if (oldPos < newPos) {
-            // 元素向后移动
-            // oldPos 前面的元素保持不变
-            // newPos 后面的元素保持不变
-            // (oldPos, newPos] 之间的元素向前移动一位
-
-            for (int i = oldPos+1; i <= newPos; i++) {
-                Menu tmp = map.get(i);
-                tmp.setPos(tmp.getPos()-1);
-                tmpList.add(tmp);
-            }
-        } else {
-            // 元素向前移动
-            // newPos 前面的元素保持不变
-            // oldPos 后面的元素保持不变
-            // [newPos, oldPos) 之间的元素向后移动一位
-            for (int i = newPos; i < oldPos; i++) {
-                Menu tmp = map.get(i);
-                tmp.setPos(tmp.getPos()+1);
-                tmpList.add(tmp);
-            }
+    private void moveForward(List<Menu> menus, int startPos) {
+        for (int i = startPos; i < menus.size(); i++) {
+            Menu tmpMenu = menus.get(i);
+            int newPos = tmpMenu.getPos()-1;
+            tmpMenu.setPos(newPos);
         }
-        menuRepository.saveAll(tmpList);
+        menuRepository.saveAll(menus);
     }
 
-    public void deleteResource(Menu menu) {
+    public synchronized void updateResource(MenuVO vo, Set<Role> roles) {
+        int menuId = vo.getMenuId();
+        Menu menuEntity = menuRepository.findById(menuId).orElse(null);
+        if (menuEntity == null) {
+            log.error("menu 不存在");
+            return;
+        }
+
+        int pid = vo.getPid();
+        if (pid != menuEntity.getPid()) {
+            // menu 更换到了新的 menu 组
+            return;
+        }
+
+        int oldPos = menuEntity.getPos();
+        int pos = vo.getPos();
+        if (oldPos != pos) {
+            // menu 在组内的位置发生变化
+            List<Menu> menus = menuRepository.findByPid(pid);
+            menus.sort(Comparator.comparingInt(Menu::getPos));
+        }
+
+        menuEntity.setName(vo.getName());
+        menuEntity.setUrl(vo.getUrl());
+        menuEntity.setIcon(vo.getIcon());
+        menuEntity.setUpdateTime(LocalDateTime.now());
+        menuRepository.save(menuEntity);
+
+        roles.forEach(role -> role.getMenus().add(menuEntity));
+        roleRepository.saveAll(roles);
+    }
+
+    public synchronized void deleteResource(Menu menu) {
         // 删除 Role 关联的 Menu
         for (Role role : menu.getRoles()) {
             role.getMenus().remove(menu);
             roleRepository.save(role);
         }
 
-        // TODO 重新调整组内 menu 的位置
+        // 重新调整组内排序
+        int pid = menu.getPid();
+        List<Menu> menus = menuRepository.findByPid(pid);
+        menus.sort(Comparator.comparingInt(Menu::getPos));
+        int pos = menu.getPos();
+        moveForward(menus, pos);
         menuRepository.delete(menu);
     }
 
@@ -196,6 +199,7 @@ public class ResourceService {
 
     public Map<Integer, String> getMapByPid(int pid) {
         List<Menu> menus = menuRepository.findByPid(pid);
+        menus.sort(Comparator.comparingInt(Menu::getPos));
         Map<Integer, String> map = new HashMap<>();
         menus.forEach(menu -> {
             map.put(menu.getPos(), menu.getName());
@@ -204,6 +208,6 @@ public class ResourceService {
     }
 
     public Menu getResourceById(int id) {
-        return menuRepository.findById(id).get();
+        return menuRepository.findById(id).orElse(null);
     }
 }

+ 7 - 11
dmaster/src/main/resources/templates/auth/menu/add.html

@@ -7,24 +7,19 @@
 <body>
 <div class="layui-form timo-compile">
     <form th:action="@{/api/auth/menu}">
-        <input type="hidden" name="id" th:if="${menu}" th:value="${menu.id}"/>
-        <input type="hidden" name="isDelete" th:if="${menu}" th:value="${menu.isDelete}"/>
-        <input type="hidden" name="createTime" th:if="${menu}" th:value="${menu.createTime}"/>
-        <input type="hidden" name="updateTime" th:if="${menu}" th:value="${menu.updateTime}"/>
-        <input type="hidden" name="isEnabled" th:if="${menu}" th:value="${menu.isEnabled}"/>
         <div class="layui-form-item">
-            <label class="layui-form-label required">标题</label>
+            <label class="layui-form-label required">名字</label>
             <div class="layui-input-inline">
                 <label>
-                    <input class="layui-input" type="text" name="name"  placeholder="请输入标题" th:value="${menu?.name}">
+                    <input class="layui-input" type="text" name="name"  placeholder="请输入名字">
                 </label>
             </div>
         </div>
         <div class="layui-form-item">
-            <label class="layui-form-label required">URL地址</label>
+            <label class="layui-form-label required">URL 地址</label>
             <div class="layui-input-inline">
                 <label>
-                    <input class="layui-input url-input" type="text" name="url"  placeholder="请输入URL地址" th:value="${menu?.url}">
+                    <input class="layui-input url-input" type="text" name="url"  placeholder="请输入URL地址">
                 </label>
             </div>
         </div>
@@ -32,7 +27,7 @@
             <label class="layui-form-label">菜单图标</label>
             <div class="layui-input-inline">
                 <label>
-                    <input class="layui-input icon-input" type="text" name="icon"  placeholder="请输入菜单图标" th:value="${menu?.icon}">
+                    <input class="layui-input icon-input" type="text" name="icon"  placeholder="请输入菜单图标">
                 </label>
             </div>
             <i th:class="'icon-show '+${menu?.icon}" style="line-height: 38px;"></i>
@@ -41,7 +36,8 @@
             <label class="layui-form-label required">父级菜单</label>
             <div class="layui-input-inline">
                 <label>
-                    <input class="layui-input select-tree" th:attr="data-url=@{/api/auth/menu/1}, data-value=${pMenu?.id}" type="text" name="pid"  placeholder="请选择父级菜单(必须是目录类型)" th:value="${pMenu?.name}">
+                    <input class="layui-input select-tree" th:attr="data-url=@{/api/auth/menu/1}, data-value=${pMenu?.id}"
+                           type="text" name="pid"  placeholder="请选择父级菜单(必须是目录类型)">
                 </label>
             </div>
         </div>

+ 120 - 0
dmaster/src/main/resources/templates/auth/menu/edit.html

@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+</head>
+<body>
+<div class="layui-form timo-compile">
+    <form th:action="@{/api/auth/menu/edit}">
+        <input type="hidden" name="menuId" th:value="${menu.menuId}"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">名字</label>
+            <div class="layui-input-inline">
+                <label>
+                    <input class="layui-input" type="text" name="name"  placeholder="请输入名字" th:value="${menu.name}">
+                </label>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">URL地址</label>
+            <div class="layui-input-inline">
+                <label>
+                    <input class="layui-input url-input" type="text" name="url"  placeholder="请输入URL地址" th:value="${menu.url}">
+                </label>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">菜单图标</label>
+            <div class="layui-input-inline">
+                <label>
+                    <input class="layui-input icon-input" type="text" name="icon"  placeholder="请输入菜单图标" th:value="${menu.icon}">
+                </label>
+            </div>
+            <i th:class="'icon-show '+${menu.icon}" style="line-height: 38px;"></i>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">父级菜单</label>
+            <div class="layui-input-inline">
+                <label>
+                    <input class="layui-input select-tree" th:attr="data-url=@{/api/auth/menu/1}, data-value=${pMenu.id}"
+                           type="text" name="pid"  placeholder="请选择父级菜单(必须是目录类型)" th:value="${pMenu?.name}">
+                </label>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">排序</label>
+            <div class="layui-input-inline">
+                <label>
+                    <select class="select-pos" name="pos" lay-verify="pos"
+                            th:attr="data-url=@{/api/auth/menu/sorted}, data-id=${menu.menuId}, data-pos=${menu.pos}"></select>
+                </label>
+            </div>
+            <div class="layui-input-info">(之后)</div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">分配角色</label>
+            <div class="layui-input-block">
+                <input th:each="item:${allRoles}" type="checkbox" name="roles" th:title="${item.name}"
+                       th:value="${item.id}" th:checked="${#sets.contains(menuRoles, item)}" lay-skin="primary">
+            </div>
+        </div>
+        <div class="layui-form-item timo-finally">
+            <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
+            <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
+        </div>
+    </form>
+</div>
+
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
+
+<script type="text/javascript">
+    layui.use(['form'], function () {
+        window.form = layui.form;
+        // 初始化排序字段下拉选项
+        var pid = $(".select-tree").data('value');
+        if (pid !== undefined){
+            sortRender({id: pid});
+        }
+    });
+
+    // 初始化下拉树
+    $.fn.selectTree({
+        rootTree: '根',
+        // 选中后事件
+        onSelected: sortRender
+    });
+
+    // 重新渲染排序字段的下拉选项
+    function sortRender(treeNode) {
+        var pid = treeNode.id;
+        var pos = $(".select-pos");
+        var id = pos.data('id') ? pos.data('id') : 0;
+        var url = pos.data('url') + "/" + pid + "/" + id;
+        $.get(url, function (result) {
+            result = result.data
+            var options = '';
+            var posNum = Object.keys(result).length;
+            if(pid === $(".select-tree").data('value') && pos.data('pos')){
+                posNum = pos.data('pos') - 1;
+            }
+            result[0] = "首位";
+            // TODO key 应该是 int 类型才对
+            for(var key in result){
+                var selected = posNum === parseInt(key) ? "selected=''" : "";
+                options += "<option value='"+ key +"' " + selected + ">"+ result[key] +"</option>";
+            }
+            pos.html(options);
+            form.render('select');
+        });
+    }
+
+    // 监听变动图标
+    $(".icon-input").on("input propertychange", function(){
+        $(".icon-show").attr("class", "icon-show "+$(this).val());
+    });
+</script>
+</body>
+</html>

+ 2 - 2
dmaster/src/main/resources/templates/auth/menu/index.html

@@ -95,8 +95,8 @@
                                            th:attr="data-url=@{'/auth/menu/detail/{{id}}'}"
                                            data-size="800,600" href="#">详细
                                         </a>
-                                        <a class="ajax-delete popup-delete" th:attr="data-msg='您是否确定删除'"
-                                           th:href="@{'/auth/menu/{{id}}'}">删除
+                                        <a class="ajax-delete popup-delete" th:attr="data-msg='确定删除 {{name}}?'"
+                                           th:href="@{'/api/auth/menu/{{id}}'}">删除
                                         </a>
                                     </td>
                                 </tr>

+ 1 - 1
dmaster/src/main/resources/templates/auth/role/menus.html

@@ -60,7 +60,7 @@
                 var menu = {
                     id: item.id,
                     pId: item.pid,
-                    name: item.title
+                    name: item.name
                 };
                 if(item.pid === 0){
                     menu.open = true;