009-云E办_根据id查询列表

  • 一、根据用户id查询列表
  • 1、Menu 修改菜单类 pojo/Menu
  • 2、MenuController
  • 3、MenuService和MenuServiceImpl
  • 4、MenuMapper
  • MenuMapper.xml
  • 5、测试:


查看menu菜单了的数据库:

component组件:前端用vue写的,组件开发。

parentId:说明菜单是多个级别菜单。相互关联是通过父ID。

ensemble id查询_ensemble id查询


权限相互关联的。

ensemble id查询_ensemble id查询_02


Menu数据:

ensemble id查询_ensemble id查询_03

一、根据用户id查询列表

思想:
根据用户id,查询出对应的角色id。
根据角色id,查询出菜单id。
到这里可以看出,该用户可以访问的所有菜单id
根据菜单id,得到子菜单id
根据子菜单的父id,得到 父菜单id。

MySQL语句有两种写法:
1:(非本次使用的方法:)在AdminMaper接口中,先查出所有的一级菜单,再把一级菜单穿进去,进行查询自菜单,最后合并起来返回前端。
缺点:需要查询多次数据库。

2:(本次使用的方法:)那么希望只查询一次数据库就把菜单和子菜单全部查询出来。通过子关联。用户id是t_admin表,菜单是:t_menu表。通过t_admin_role表角色id进行关联。拿到t_menu_role的id再去t_menu去查询。
通过role权限列表拿到id,再去菜单/admin表进行查询:

ensemble id查询_xml_04

代码层从上往下写:controller/service/Mapper/mapperxml…

ensemble id查询_xml_05

1、Menu 修改菜单类 pojo/Menu

菜单分两级,一级菜单下面有子菜单,我们修改下Menu对象。

在返回的时候会返回子菜单,添加子菜单的属性:

ensemble id查询_子菜单_06

2、MenuController

@RestController
@RequestMapping("/system/cfg")
public class MenuController {
    @Autowired
    private IMenuService menuService;

    /**
     * 虽然是通过用户id查询菜单列表,但是没有传id
     * 如果用户正常能登录以后,用户的相关信息一般在后端获取的,而不是前端传进来的,可能出问题
     * 通过全局变量获取到,用户id
     */
    @ApiOperation(value = "通过用户Id查询菜单列表")
    @GetMapping("/menu")
    public List<Menu> getMenusByAdminId(){
        return menuService.getMenusByAdminId();
    }
}

3、MenuService和MenuServiceImpl

public interface IMenuService extends IService<Menu> {

    /**
     * 通过用户id查询菜单列表
     * @return
     */
    List<Menu> getMenusByAdminId();
}
------------impl----------------
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;
    /**
     * 通过用户id查询菜单列表
     * @return
     */
    @Override
    public List<Menu> getMenusByAdminId() {
        /*
        此时要传admin的id了,那么如何获取呢?
         */
        return menuMapper.getMenusByAdminId(
                ((Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
    }
}

4、MenuMapper

@Mapper
public interface MenuMapper extends BaseMapper<Menu> {
    /**
     * 通过用户id查询菜单列表
     */
    List<Menu> getMenusByAdminId(Integer id);

}

MenuMapper.xml

PS:希望在Navicat中进行语句测试,测试成功后,再放入MenuMapper.xml文件中。

MenuMapper.xml 的代码:
在SQL语句中,不能添加注释

本应是resultType,要改为resultMap.
是因为:resultType不能用Menu了,是因为Menu的pojo类,里面多了children。而resultType拿不了children。所以得用resultMap

resultMap如何写呢?
id与resultMap相对应。type是“pojo.Menu”,继承一下baseResultMap–》本身就是Menu的别名了。
然后就改写:子分类菜单:<collection property=“children” 属性>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxxx.server.mapper.MenuMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.xxxx.server.pojo.Menu">
        <id column="id" property="id" />
        <result column="url" property="url" />
        <result column="path" property="path" />
        <result column="component" property="component" />
        <result column="name" property="name" />
        <result column="iconCls" property="iconCls" />
        <result column="keepAlive" property="keepAlive" />
        <result column="requireAuth" property="requireAuth" />
        <result column="parentId" property="parentId" />
        <result column="enabled" property="enabled" />
    </resultMap>

    <resultMap id="Menus" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
        <!--子分类菜单:-->
        <collection property="children" ofType="com.xxxx.server.pojo.Menu">
            <id column="id2" property="id" />
            <result column="url2" property="url" />
            <result column="path2" property="path" />
            <result column="component2" property="component" />
            <result column="name2" property="name" />
            <result column="iconCls2" property="iconCls" />
            <result column="keepAlive2" property="keepAlive" />
            <result column="requireAuth2" property="requireAuth" />
            <result column="parentId2" property="parentId" />
            <result column="enabled2" property="enabled" />
        </collection>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, url, path, component, name, iconCls, keepAlive, requireAuth, parentId, enabled
    </sql>

    <!--根据用户id查询菜单列表-->
    <select id="getMenusByAdminId" resultMap="Menus">
        SELECT
            DISTINCT
            m1.*,
            m2.id AS id2,
            m2.url AS url2,
            m2.path AS path2,
            m2.component AS component2,
            m2.`name` AS name2,
            m2.iconCls AS iconCls2,
            m2.keepAlive As keepAlive2,
            m2.requireAuth AS requireAuth2,
            m2.parentID AS parentId2,
            m2.enabled AS enabled2
        FROM
            t_menu m1,	--#父菜单
            t_menu m2,	--#子菜单
            t_admin_role ar,	--#用户角色
            t_menu_role mr	    --#菜单角色
        WHERE
            m1.id = m2.parentId     --#父菜单id=子菜单Id
          AND m2.id = mr.mid     -- #子菜单id=菜单角色的菜单id
          AND mr.rid = ar.rid     --#菜单角色的用户id=用户角色的用户id
          AND ar.adminId = #{id}
          AND m2.enabled = TRUE
    </select>

</mapper>

5、测试:

开启项目,在文档中进行测试:

ensemble id查询_ensemble id查询_07