SpringBoot项目实战-根据用户id查询菜单列表

909 阅读1分钟

从这一次笔记开始就时我们的业务开发了,这里会开发一个根据用户id查询菜单列表的接口,既然是开发接口,那就要从控制层开始了,首选从MenuController开始:

@RestController
@RequestMapping("/system/cfg")
public class MenuController {

    @Autowired
    private IMenuService menuService;

    @ApiOperation(value = "通过用户id查询查询菜单列表")
    @GetMapping("/menu")
    public List<Menu> getMenuByAdminId(){
        return menuService.getMenuByAdminId();
    }

}

然后,在IMenuService中补全上面使用的getMenuByAdminId()方法:

public interface IMenuService extends IService<Menu> {

    List<Menu> getMenuByAdminId();
}

然后就是在IMenuServiceImpl中要实现一下这个方法:

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;
    /**
     * 根据用户id查询菜单列表
     * @return
     */
    @Override
    public List<Menu> getMenuByAdminId() {
        //getMenuByAdminId需要传用户id,这时候,要从security全局上下文中获取用户id,SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取当前用户对象
        Admin principal = (Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        //获取到用户id
        Integer id = principal.getId();
        return menuMapper.getMenuByAdminId(id);
    }
}

这里是那当前登录的的用户的id,为了不让别人串改用户id,我们直接从全局上下文对象中获取当前登录用户的id,方法如下:

//getMenuByAdminId需要传用户id,这时候,要从security全局上下文中获取用户id,SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取当前用户对象
Admin principal = (Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//获取到用户id
Integer id = principal.getId();

然后就要在mapper层,写我们要查询的sql语句去获取数据了,找到我们对应的mapper文件mapperMenuMapper.xml:

<resultMap id="Menus" type="com.hhk.server.pojo.Menu" extends="BaseResultMap">
    <collection property="children" ofType="com.hhk.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="icon_cls" />
        <result column="keepAlive2" property="keep_alive" />
        <result column="requireAuth2" property="require_auth" />
        <result column="parentId2" property="parent_id" />
        <result column="enabled2" property="enabled" />
    </collection>
</resultMap>
<!--    根据用户id查询菜单列表-->
<select id="getMenuByAdminId" 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.icon_cls As iconCLs2,
        m2.keep_alive AS keepAlive2,
        m2.require_auth AS requireAuth2,
        m2.parent_id 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.parent_id
      AND
        m2.id=mr.mid
      AND
        mr.rid=ar.rid
      AND
        ar.admin_id=#{id}
      AND
        m2.enabled=TRUE
</select>

到这里,保存代码,重启项目,就可以看到我们可以查询出当前用户获取到的菜单列表了!!!