从这一次笔记开始就时我们的业务开发了,这里会开发一个根据用户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>
到这里,保存代码,重启项目,就可以看到我们可以查询出当前用户获取到的菜单列表了!!!