学习SpringBoot+Vue前后端分离项目,原项目GitHub地址,项目作者江雨一点雨博客。
Meta
新建src/model/Meta类,将model/Menu中的keepAlive和requrieAuth移到Meta中
并在Menu中新增Meta和Children及其它们的getter和setter。
public class Meta {
private Boolean keepAlive;
private Boolean requireAuth;
public Boolean getKeepAlive() {
return keepAlive;
}
public void setKeepAlive(Boolean keepAlive) {
this.keepAlive = keepAlive;
}
public Boolean getRequireAuth() {
return requireAuth;
}
public void setRequireAuth(Boolean requireAuth) {
this.requireAuth = requireAuth;
}
}
private List<Menu> children;
private Meta meta;
在MenuMapper.xml中将
<result column="keepAlive" property="keepAlive" jdbcType="BIT"/>
<result column="requireAuth" property="requireAuth" jdbcType="BIT"/>
改为一对多关系
<association property="meta" javaType="org.javaboy.vhr.model.Meta">
<result column="keepAlive" property="keepAlive" jdbcType="BIT"/>
<result column="requireAuth" property="requireAuth" jdbcType="BIT"/>
</association>
Controller、Service和Mapper
创建controller/config/SystemConfigController
@RestController
@RequestMapping("/system/config") //注解别忘了
public class SystemConfigController {
@Autowired
MenuService menuService;
@GetMapping("/menu")
public List<Menu> getMenusByHrId(){
return menuService.getMenusByHrId();
}
}
创建Service
@Service
public class MenuService {
@Autowired
MenuMapper menuMapper;
@Autowired
MenuRoleMapper menuRoleMapper;
public List<Menu> getMenusByHrId() {
return menuMapper.getMenusByHrId(((Hr) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
}
}
在MenuMapper中添加getMenusByHrId方法
List<Menu> getMenusByHrId(Integer hrId);
在MenuMapper.xml中添加SQL
<resultMap id="Menus2" type="org.javaboy.vhr.model.Menu" extends="BaseResultMap">
<collection property="children" ofType="org.javaboy.vhr.model.Menu">
<id column="id2" property="id" jdbcType="INTEGER" />
<result column="url2" property="url" jdbcType="VARCHAR" />
<result column="path2" property="path" jdbcType="VARCHAR" />
<result column="component2" property="component" jdbcType="VARCHAR" />
<result column="name2" property="name" jdbcType="VARCHAR" />
<result column="iconCls2" property="iconCls" jdbcType="VARCHAR" />
<result column="parentId2" property="parentId" jdbcType="INTEGER" />
<result column="enabled2" property="enabled" jdbcType="BIT" />
<association property="meta" javaType="org.javaboy.vhr.model.Meta">
<result column="keepAlive2" property="keepAlive" jdbcType="BIT"/>
<result column="requireAuth2" property="requireAuth" jdbcType="BIT"/>
</association>
</collection>
</resultMap>
<select id="getMenusByHrId" resultMap="Menus2">
select distinct m1.*,m2.`id` as id2,m2.`component` as component2,m2.`enabled` as enabled2,m2.`iconCls` as iconCls2,
m2.`keepAlive` as keepAlive2,m2.`name` As name2,m2.`parentId` As parentId2,m2.`requireAuth` As requireAuth2,
m2.`path` As path2 from menu m1,menu m2,hr_role hrr,menu_role mr where m1.`id`=m2.`parentId` and hrr.`rid`=mr.`rid`
and hrr.`hrid`=#{hrid} and mr.`mid`=m2.`id` and m2.`enabled`=true order by m1.`id`,m2.`id`
</select>
查询语句建议现在数据库中写好,查询无误后,再写到xml中。
注意,在数据库中写时,将#{hrid}替换为想要查询的数字,例如3。
查询语句解析
其实看懂表的话,理解语句就很容易了。
首先来看一下有哪些表
我们需要用到的是hr,hr_role,role,menu,menu_role这几张表,hr是用户表,role是用户表,一个用户可以有多个角色嘛。hr_role是用户表和角色表的中间表。menu是菜单表,menu_role就是菜单和角色的中间表。
比如我们现在想知道某个用户能访问哪些菜单,hr的id已知,通过hr_role表可以获取到role表的id,下图为hr_role表,hrid为hr表的id,rid为role表的id。
最后通过menu_role表获取到menu的id,下图为menu_role表,mid为menu表的id。
启动项目,Postman登录,然后访问/system/config/menu,显示出菜单信息,测试成功。