Sfoglia il codice sorgente

系统指令权限

chao 3 anni fa
parent
commit
4c56ce771d

+ 22 - 11
db.sql

@@ -46,19 +46,30 @@ CREATE TABLE `system_menu` (
 ) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统菜单表';
 
 -- 系统权限表
--- DROP TABLE IF EXISTS `system_permission`;
--- CREATE TABLE `system_permission` (
---  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '权限ID',
---  `permission` VARCHAR(100) DEFAULT NULL COMMENT '权限标识',
---  PRIMARY KEY (`id`)
--- ) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统权限表';
+ DROP TABLE IF EXISTS `system_permission`;
+ CREATE TABLE `system_permission` (
+  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `menu_id` BIGINT NOT NULL COMMENT '菜单ID',
+  `name` VARCHAR(100) DEFAULT NULL COMMENT '权限标识',
+  `title` VARCHAR(100) NOT NULL COMMENT '权限名称',
+  PRIMARY KEY (`id`)
+ ) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统权限表';
+
+ -- 权限&角色 关联表
+DROP TABLE IF EXISTS `system_role_permission`;
+CREATE TABLE `system_role_permission` (
+  `id` BIGINT NOT NULL AUTO_INCREMENT,
+  `role_id` BIGINT DEFAULT NULL COMMENT '角色ID',
+  `permission_id` BIGINT DEFAULT NULL COMMENT '权限ID',
+  PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统角色权限关联表';
 
 -- 用户&角色 关联表
 DROP TABLE IF EXISTS `system_role_user`;
 CREATE TABLE `system_role_user` (
   `id` BIGINT NOT NULL AUTO_INCREMENT,
-  `role_id` VARCHAR(50) DEFAULT NULL COMMENT '角色ID',
-  `user_id` VARCHAR(255) DEFAULT NULL COMMENT '用户ID',
+  `role_id` BIGINT DEFAULT NULL COMMENT '角色ID',
+  `user_id` BIGINT DEFAULT NULL COMMENT '用户ID',
   PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统用户角色关联表';
 
@@ -66,10 +77,10 @@ CREATE TABLE `system_role_user` (
 DROP TABLE IF EXISTS `system_role_menu`;
 CREATE TABLE `system_role_menu` (
   `id` BIGINT NOT NULL AUTO_INCREMENT,
-  `role_id` VARCHAR(50) DEFAULT NULL COMMENT '角色ID',
-  `menu_id` VARCHAR(255) DEFAULT NULL COMMENT '菜单ID',
+  `role_id` BIGINT DEFAULT NULL COMMENT '角色ID',
+  `menu_id` BIGINT DEFAULT NULL COMMENT '菜单ID',
   PRIMARY KEY (`id`)
-) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统用户角色关联表';
+) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COMMENT='系统角色菜单关联表';
 
 -- ============================================== 系统表 end ===============================
 

+ 2 - 1
src/main/java/com/caimei365/manager/controller/sys/SysMenuApi.java

@@ -3,6 +3,7 @@ package com.caimei365.manager.controller.sys;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
 import com.caimei365.manager.entity.sys.SysMenu;
+import com.caimei365.manager.entity.sys.SysMenuTree;
 import com.caimei365.manager.service.sys.SysMenuService;
 import org.springframework.web.bind.annotation.*;
 
@@ -42,7 +43,7 @@ public class SysMenuApi {
      * 获取所有启用的菜单列表(树状结构返回)
      */
     @GetMapping("/tree")
-    public ResponseJson<List<SysMenu>> menuTree() {
+    public ResponseJson<List<SysMenuTree>> menuTree() {
         return sysMenuService.getMenuTree();
     }
 

+ 40 - 3
src/main/java/com/caimei365/manager/dao/SystemDao.java

@@ -1,9 +1,7 @@
 package com.caimei365.manager.dao;
 
 
-import com.caimei365.manager.entity.sys.SysMenu;
-import com.caimei365.manager.entity.sys.SysRole;
-import com.caimei365.manager.entity.sys.SysUser;
+import com.caimei365.manager.entity.sys.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -46,6 +44,10 @@ public interface SystemDao {
      * 根据角色Ids获取菜单列表
      */
     List<SysMenu> getMenusByRoleIds(@Param("roleIds") List<Integer> roleIds);
+    /**
+     * 根据角色Id获取按钮权限列表
+     */
+    List<String> getPermissionNames(@Param("roleIds") List<Integer> roleIds);
 
     /**
      * 获取用户列表
@@ -104,6 +106,10 @@ public interface SystemDao {
      * 保存角色菜单关系
      */
     void insertRoleMenuRelation(Integer roleId, Integer menuId);
+    /**
+     * 保存角色权限关系
+     */
+    void insertRolePermissionRelation(Integer roleId, Integer permissionId);
     /**
      * 删除原有角色菜单关联
      */
@@ -115,6 +121,16 @@ public interface SystemDao {
      * @param status   状态:0启用,1停用
      */
     List<SysMenu> getMenuList(Integer parentId, Integer status);
+    /**
+     * 获取树状菜单列表
+     * @param parentId 父级菜单Id
+     */
+    List<SysMenuTree> getMenuTree(String parentId);
+    /**
+     * 获取当前菜单的按钮权限
+     * @param menuId 菜单Id
+     */
+    List<SysMenuTree> getTreePermissions(String menuId);
     /**
      * 根据ID获取菜单
      */
@@ -135,5 +151,26 @@ public interface SystemDao {
      * 添加菜单
      */
     void insertMenu(SysMenu menu);
+    /**
+     * 获取菜单的按钮权限列表
+     * @param menuId 菜单Id
+     */
+    List<SysPermission> getPermissionList(Integer menuId);
+    /**
+     * 根据菜单Id获取权限ids
+     */
+    List<Integer> getPermissionIds(Integer menuId);
+    /**
+     * 权限ID更新权限
+     */
+    void updatePermission(SysPermission permission);
+    /**
+     * 权限ID删除权限
+     */
+    void deletePermission(Integer id);
+    /**
+     * 添加按钮权限
+     */
+    void insertPermission(SysPermission permission);
 
 }

+ 13 - 2
src/main/java/com/caimei365/manager/entity/sys/SysMenu.java

@@ -60,9 +60,20 @@ public class SysMenu {
      */
     private Integer delFlag;
     /**
-     * 排序
+     * 按钮权限
+     */
+    private List<SysPermission> permissions;
+    /**
+     * 按钮权限JSON数据:[
+     *            { "id":         "ID"
+     *              "title":      "按钮标题",
+     *              "name":       "权限标识",
+     *            },
+     *            {多条数据结构同上}
+     *         ]
      */
-    private List<SysMenu> subMenus;
+    private String permissionJson;
 
     private static final long serialVersionUID = 1L;
+
 }

+ 37 - 0
src/main/java/com/caimei365/manager/entity/sys/SysMenuTree.java

@@ -0,0 +1,37 @@
+package com.caimei365.manager.entity.sys;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/7
+ */
+@Data
+public class SysMenuTree {
+    /**
+     * Id
+     */
+    private String id;
+    /**
+     * 菜单名称
+     */
+    private String title;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 父级菜单Id
+     */
+    private String parentId;
+    /**
+     * 子菜单
+     */
+    private List<SysMenuTree> subMenus;
+
+    private static final long serialVersionUID = 1L;
+}

+ 31 - 0
src/main/java/com/caimei365/manager/entity/sys/SysPermission.java

@@ -0,0 +1,31 @@
+package com.caimei365.manager.entity.sys;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/7
+ */
+@Data
+public class SysPermission {
+    /**
+     * Id
+     */
+    private Integer id;
+    /**
+     * 菜单名称
+     */
+    private String title;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 父级菜单Id
+     */
+    private Integer menuId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 4 - 0
src/main/java/com/caimei365/manager/entity/sys/SysUser.java

@@ -72,6 +72,10 @@ public class SysUser {
      * 可访问菜单集合
      */
     private List<SysMenu> menus;
+    /**
+     * 指令权限集合
+     */
+    List<String> permissions;
 
     private static final long serialVersionUID = 1L;
 }

+ 2 - 1
src/main/java/com/caimei365/manager/service/sys/SysMenuService.java

@@ -3,6 +3,7 @@ package com.caimei365.manager.service.sys;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
 import com.caimei365.manager.entity.sys.SysMenu;
+import com.caimei365.manager.entity.sys.SysMenuTree;
 
 import java.util.List;
 
@@ -24,7 +25,7 @@ public interface SysMenuService {
     /**
      * 获取所有启用的菜单列表(树状结构返回)
      */
-    ResponseJson<List<SysMenu>> getMenuTree();
+    ResponseJson<List<SysMenuTree>> getMenuTree();
     /**
      * 根据ID获取菜单
      */

+ 101 - 6
src/main/java/com/caimei365/manager/service/sys/impl/SysMenuServiceImpl.java

@@ -1,19 +1,27 @@
 package com.caimei365.manager.service.sys.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.caimei365.manager.dao.SystemDao;
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
 import com.caimei365.manager.entity.sys.SysMenu;
+import com.caimei365.manager.entity.sys.SysMenuTree;
+import com.caimei365.manager.entity.sys.SysPermission;
 import com.caimei365.manager.service.sys.SysMenuService;
 import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 
+import static com.alibaba.fastjson.JSON.parseArray;
+
 /**
  * Description
  *
@@ -47,23 +55,30 @@ public class SysMenuServiceImpl implements SysMenuService {
      * 获取所有启用的菜单列表(树状结构返回)
      */
     @Override
-    public ResponseJson<List<SysMenu>> getMenuTree() {
-        List<SysMenu> menus = systemDao.getMenuList(0, 0);
+    public ResponseJson<List<SysMenuTree>> getMenuTree() {
+        List<SysMenuTree> menus = systemDao.getMenuTree("0");
         // 递归设置子菜单
         setSubMenusData(menus);
         return ResponseJson.success(menus);
     }
 
     /**
-     * 递归设置子菜单
+     * 递归设置子菜单(树状结构)
      */
-    private void setSubMenusData(List<SysMenu> menus) {
+    private void setSubMenusData(List<SysMenuTree> menus) {
         if (!CollectionUtils.isEmpty(menus)) {
-            for (SysMenu menu : menus) {
-                List<SysMenu> submenus = systemDao.getMenuList(menu.getId(), 0);
+            for (SysMenuTree menu : menus) {
+                // 获取子菜单
+                List<SysMenuTree> submenus = systemDao.getMenuTree(menu.getId());
                 if (!CollectionUtils.isEmpty(submenus)) {
                     setSubMenusData(submenus);
                     menu.setSubMenus(submenus);
+                } else {
+                    // 获取当前菜单的按钮权限
+                    List<SysMenuTree> permissions = systemDao.getTreePermissions(menu.getId());
+                    if (!CollectionUtils.isEmpty(permissions)) {
+                        menu.setSubMenus(permissions);
+                    }
                 }
             }
         }
@@ -75,23 +90,35 @@ public class SysMenuServiceImpl implements SysMenuService {
     @Override
     public ResponseJson<SysMenu> getMenu(Integer id) {
         SysMenu menu = systemDao.getMenu(id);
+        // 获取按钮权限
+        List<SysPermission> permissions = systemDao.getPermissionList(menu.getId());
+        if (!CollectionUtils.isEmpty(permissions)) {
+            menu.setPermissions(permissions);
+        }
         return ResponseJson.success(menu);
     }
 
     /**
      * 根据ID更新菜单
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> updateMenu(Integer id, SysMenu menu) {
         menu.setId(id);
         menu.setDelFlag(0);
         systemDao.updateMenu(menu);
+        // 按钮权限JSON数据解析
+        ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+        if (error != null) {
+            return error;
+        }
         return ResponseJson.success();
     }
 
     /**
      * 根据ID(可选择的)更新菜单字段
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> updateMenuSelective(Integer id, SysMenu menu) {
         SysMenu dbMenu = systemDao.getMenu(id);
@@ -117,12 +144,18 @@ public class SysMenuServiceImpl implements SysMenuService {
             dbMenu.setStatus(menu.getStatus());
         }
         systemDao.updateMenu(dbMenu);
+        // 按钮权限JSON数据解析
+        ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+        if (error != null) {
+            return error;
+        }
         return ResponseJson.success();
     }
 
     /**
      * 添加菜单
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> addMenu(SysMenu menu) {
         if (null == menu.getParentId()) {
@@ -138,6 +171,11 @@ public class SysMenuServiceImpl implements SysMenuService {
         SysMenu dbMenu = systemDao.getMenuByName(menu.getName());
         if (null == dbMenu) {
             systemDao.insertMenu(menu);
+            // 按钮权限JSON数据解析
+            ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+            if (error != null) {
+                return error;
+            }
         } else if (!Integer.valueOf(0).equals(dbMenu.getDelFlag())){
             // 更新已删除菜单
             return updateMenu(dbMenu.getId(), menu);
@@ -150,9 +188,66 @@ public class SysMenuServiceImpl implements SysMenuService {
     /**
      * 根据ID删除菜单
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> deleteMenu(Integer id) {
         systemDao.deleteMenu(id);
+        List<Integer> permissionIds = systemDao.getPermissionIds(id);
+        // 删除该菜单权限按钮
+        for (Integer permissionId : permissionIds) {
+           systemDao.deletePermission(permissionId);
+        }
         return ResponseJson.success();
     }
+
+    /**
+     * 按钮权限JSON数据解析
+     * @param menuId 菜单Id
+     * @param jsonStr 按钮权限JSON串
+     */
+    private ResponseJson<Void> parsePermissionJson(Integer menuId, String jsonStr) {
+        // 文章列表JSON数据解析
+        JSONArray permissionJson = null;
+        List<SysPermission> permissionList = new ArrayList<>();
+        try {
+            permissionJson = parseArray(jsonStr);
+            if (null == permissionJson || permissionJson.isEmpty()) {
+                return ResponseJson.error("按钮权限JSON数据异常!", null);
+            }
+            for (Object permissionObject : permissionJson) {
+                JSONObject detail = (JSONObject) permissionObject;
+                Integer permissionId = (Integer) detail.get("id");
+                String permissionName = (String) detail.get("name");
+                String permissionTitle = (String) detail.get("title");
+                SysPermission item = new SysPermission();
+                item.setId(permissionId);
+                item.setMenuId(menuId);
+                item.setName(permissionName);
+                item.setTitle(permissionTitle);
+                permissionList.add(item);
+            }
+        } catch (Exception e) {
+            log.error("文章列表JSON数据解析异常try-catch:", e);
+            return ResponseJson.error("文章列表JSON数据解析异常!", null);
+        }
+        List<Integer> dbPermissionIds = systemDao.getPermissionIds(menuId);
+        List<Integer> permissionIds = new ArrayList<>();
+        for (SysPermission permission : permissionList) {
+            if (null != permission.getId() && permission.getId() > 0 && dbPermissionIds.contains(permission.getId())) {
+                systemDao.updatePermission(permission);
+                permissionIds.add(permission.getId());
+            } else {
+                systemDao.insertPermission(permission);
+            }
+        }
+        for (Integer id : dbPermissionIds) {
+            if (!permissionIds.contains(id)){
+                systemDao.deletePermission(id);
+            }
+        }
+        return null;
+    }
+
+
+
 }

+ 12 - 2
src/main/java/com/caimei365/manager/service/sys/impl/SysRoleServiceImpl.java

@@ -9,6 +9,7 @@ import com.caimei365.manager.utils.CommonUtil;
 import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
@@ -63,6 +64,7 @@ public class SysRoleServiceImpl implements SysRoleService {
     /**
      * 根据ID更新角色
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> updateRole(Integer id, SysRole sysRole) {
         sysRole.setId(id);
@@ -80,6 +82,7 @@ public class SysRoleServiceImpl implements SysRoleService {
     /**
      * 添加角色
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> addRole(SysRole sysRole) {
         if (StringUtils.hasLength(sysRole.getRoleName())) {
@@ -105,6 +108,7 @@ public class SysRoleServiceImpl implements SysRoleService {
     /**
      * 根据ID删除角色
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> deleteRole(Integer id) {
         // 删除角色菜单关联
@@ -136,8 +140,14 @@ public class SysRoleServiceImpl implements SysRoleService {
             String[] split = menuIds.split(",");
             for (String s : split) {
                 if (StringUtils.hasLength(s)) {
-                    // 保存角色菜单关系
-                    systemDao.insertRoleMenuRelation(roleId, Integer.valueOf(s));
+                    if (s.contains("-")) {
+                        // 保存角色权限关系
+                        String[] ids = s.split("-");
+                        systemDao.insertRolePermissionRelation(roleId, Integer.valueOf(ids[0]));
+                    } else {
+                        // 保存角色菜单关系
+                        systemDao.insertRoleMenuRelation(roleId, Integer.valueOf(s));
+                    }
                 }
             }
         }

+ 7 - 0
src/main/java/com/caimei365/manager/service/sys/impl/SysUserServiceImpl.java

@@ -13,6 +13,7 @@ import com.caimei365.manager.utils.CommonUtil;
 import com.github.pagehelper.PageHelper;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
@@ -51,6 +52,9 @@ public class SysUserServiceImpl implements SysUserService {
                 if (!CollectionUtils.isEmpty(roleIds)) {
                     // 根据角色Id获取菜单列表
                     menus = systemDao.getMenusByRoleIds(roleIds);
+                    // 根据角色Id获取按钮权限列表
+                    List<String> permissions = systemDao.getPermissionNames(roleIds);
+                    sysUser.setPermissions(permissions);
                 }
                 sysUser.setMenus(menus);
             }
@@ -130,6 +134,7 @@ public class SysUserServiceImpl implements SysUserService {
     /**
      * 根据ID更新用户
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> updateUser(Integer id, SysUser sysUser) {
         sysUser.setId(id);
@@ -152,6 +157,7 @@ public class SysUserServiceImpl implements SysUserService {
     /**
      * 添加用户
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> addUser(SysUser sysUser) {
         if (StringUtils.hasLength(sysUser.getUsername()) && StringUtils.hasLength(sysUser.getPassword())) {
@@ -181,6 +187,7 @@ public class SysUserServiceImpl implements SysUserService {
     /**
      * 根据ID删除用户
      */
+    @Transactional(rollbackFor=Exception.class)
     @Override
     public ResponseJson<Void> deleteUser(Integer id) {
         // 删除用户角色关联

+ 45 - 2
src/main/resources/mapper/SystemDao.xml

@@ -88,6 +88,9 @@
     <insert id="insertRoleMenuRelation">
         INSERT INTO system_role_menu(role_id, menu_id) VALUES(#{roleId}, #{menuId})
     </insert>
+    <insert id="insertRolePermissionRelation">
+        INSERT INTO system_role_permission(role_id, permission_id) VALUES(#{roleId}, #{permissionId})
+    </insert>
     <delete id="deleteRoleMenuRelation">
         DELETE FROM system_role_menu WHERE role_id = #{roleId}
     </delete>
@@ -108,8 +111,16 @@
         </foreach>
         ORDER BY m.sort
     </select>
+    <select id="getPermissionNames" resultType="java.lang.String">
+        SELECT p.name FROM system_permission p
+        LEFT JOIN system_role_permission rp ON p.id = rp.permission_id
+        WHERE rp.role_id IN
+        <foreach item="roleId" collection="roleIds" open="(" separator="," close=")">
+            #{roleId}
+        </foreach>
+    </select>
     <select id="getMenuList" resultType="com.caimei365.manager.entity.sys.SysMenu">
-        SELECT m.id, m.title , m.name, m.icon, m.parent_id AS parentId, m.status, m.hidden, m.sort, m.create_time AS createTime, del_flag AS delFlag,
+        SELECT m.id, m.title, m.name, m.icon, m.parent_id AS parentId, m.status, m.hidden, m.sort, m.create_time AS createTime, del_flag AS delFlag,
         (SELECT COUNT(*) FROM system_menu WHERE parent_id=m.id) AS childCount
         FROM system_menu m
         WHERE m.del_flag = 0
@@ -121,8 +132,22 @@
         </if>
         ORDER BY m.sort
     </select>
+    <select id="getMenuTree" resultType="com.caimei365.manager.entity.sys.SysMenuTree">
+        SELECT m.id, m.name, m.title, m.parent_id AS parentId
+        FROM system_menu m
+        WHERE m.del_flag = 0
+        <if test="parentId != null or parentId == 0">
+            AND m.parent_id = #{parentId}
+        </if>
+        ORDER BY m.sort
+    </select>
+    <select id="getTreePermissions" resultType="com.caimei365.manager.entity.sys.SysMenuTree">
+        SELECT CONCAT(p.id, '-', p.menu_id) AS id, p.name, CONCAT('[按钮]', p.title) AS title
+        FROM system_permission p WHERE p.menu_id = #{menuId}
+    </select>
     <select id="getMenu" resultType="com.caimei365.manager.entity.sys.SysMenu">
-        SELECT m.id, m.title , m.name, m.icon, m.parent_id AS parentId, m.hidden, m.status, m.sort, m.create_time AS createTime, del_flag AS delFlag
+        SELECT m.id, m.title , m.name, m.icon, m.parent_id AS parentId, m.hidden, m.status, m.sort, m.create_time AS createTime, del_flag AS delFlag,
+               (SELECT COUNT(*) FROM system_menu WHERE parent_id=m.id) AS childCount
         FROM system_menu m
         WHERE m.id = #{id}
     </select>
@@ -142,4 +167,22 @@
     <update id="deleteMenu">
         UPDATE system_menu SET del_flag=1, update_time=NOW() WHERE id = #{id}
     </update>
+    <select id="getPermissionList" resultType="com.caimei365.manager.entity.sys.SysPermission">
+        SELECT p.id, p.name, p.title AS title, p.menu_id AS menuId
+        FROM system_permission p WHERE p.menu_id = #{menuId}
+    </select>
+    <select id="getPermissionIds" resultType="java.lang.Integer">
+        SELECT id FROM system_permission WHERE menu_id = #{menuId}
+    </select>
+    <update id="updatePermission">
+        UPDATE system_permission SET name=#{name}, title=#{title}, menu_id = #{menuId}
+        WHERE id = #{id}
+    </update>
+    <delete id="deletePermission">
+        DELETE FROM system_permission WHERE id = #{id}
+    </delete>
+    <insert id="insertPermission" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO system_permission(title, name, menu_id)
+        VALUES (#{title}, #{name}, #{menuId})
+    </insert>
 </mapper>