紧接着上一篇博客,现在我们开始实现我们的权限管理。
1.权限组
之前用户可以通过用户角色表和用户表进行关联,进而分配用户不同的角色,也可以通过菜单角色与菜单表进行关联,进而分配不同的角色,可以拥有不同的菜单权限。那权限组模块主要就是进行用户角色的相关操作,包括角色里面所关联的菜单。所以出了角色的相关操作(增加角色,删除角色,修改角色等等),还可以对菜单进行操作(查询、更新角色所拥有的菜单)。
1.1.实现功能
- 需要注意的是Spring Security用的角色都是以
ROLE_
开头的所以我们需要判断一下添加的角色是否是以ROLE_
开头,是的话那就直接添加,没有的话后端需要自动添加上去,否则不会被Security掌控。 - 第二就是查询所有菜单,但这里的菜单查询不和“菜单列表”模块时的菜单查询一样,这里有对应的子菜单(分为3级),所以需要查询写方法和SQL语句。
新建PermissionController
PermissionController.java
@RestController
@RequestMapping("/system/basic/permiss")
public class PermissionController {
@Resource
private IRoleService roleService;
@Resource
private IMenuService menuService;
@Resource
private IMenuRoleService menuRoleService;
@ApiOperation(value = "获取所有角色")
@GetMapping("/")
public List<Role> getAllRoles() {
return roleService.list();
}
@ApiOperation(value = "添加角色")
@PostMapping("/role")
public RespBean addRole(@RequestBody Role role) {
if (!role.getName().startsWith("ROLE_")) {
role.setName("ROLE_" + role.getName());
}
if (roleService.save(role)) {
return RespBean.success("添加成功");
}
return RespBean.error("添加失败");
}
@ApiOperation(value = "删除角色")
@DeleteMapping("/{id}")
public RespBean deleteRole(@PathVariable Integer id) {
if (roleService.removeById(id)) {
return RespBean.success("删除成功");
}
return RespBean.error("删除失败");
}
@ApiOperation(value = "查询所有菜单")
@GetMapping("/menus")
public List<Menu> getAllMenus() {
return menuService.getAllMenus();
}
@ApiOperation(value = "根据角色id查询菜单id")
@GetMapping("/mid/{rid}")
public List<Integer> getMidByRid(@PathVariable Integer rid) {
return menuRoleService
// 根据rid(角色id)查询mid(菜单id)
.list(new QueryWrapper<MenuRole>()
.eq("rid", rid))
.stream()
.map(MenuRole::getMid)
.collect(Collectors.toList());
}
@ApiOperation(value = "更新角色菜单")
@PutMapping("/")
public RespBean updateMenuRole(Integer rid, Integer[] mids) {
return menuRoleService.updateMenuRole(rid, mids);
}
}
1.2.权限组Mapper层
MenuMapper.java
public interface MenuMapper extends BaseMapper<Menu> {
/**
*通过用户ID查询菜单列表
* @param adminId
* @return
*/
List<Menu> getMenusByAdminId(Integer adminId);
/**
* 根据角色获得菜单列表
* @return
*/
List<Menu> getMenusWithRole();
/**
* 查询所有菜单
* @return
*/
List<Menu> getAllMenus();
}
MenuRoleMapper.java
public interface MenuRoleMapper extends BaseMapper<MenuRole> {
/**
* 批量更新
* @param rid
* @param mids
* @return Integer
*/
Integer insertRecord(@Param("rid") Integer rid, @Param("mids") Integer[] mids);
}
1.3.SQL语句
在MenuMapper.xml中添加以下代码:
<resultMap id="MenusWithChildren" type="com.kt.pojo.Menu" extends="BaseResultMap">
<!-- 一级菜单 -->
<id column="id1" property="id"/>
<result column="name1" property="name"/>
<!-- 二级菜单 -->
<collection property="children" ofType="com.kt.pojo.Menu">
<id column="id2" property="id"/>
<result column="name2" property="name"/>
<!-- 三级菜单 -->
<collection property="children" ofType="com.kt.pojo.Menu">
<id column="id3" property="id"/>
<result column="name3" property="name"/>
</collection>
</collection>
</resultMap>
<!-- 查询所有菜单 -->
<select id="getAllMenus" resultMap="MenusWithChildren">
SELECT
m1.id AS id1,
m1.`name` AS name1,
m2.id AS id2,
m2.`name` AS name2,
m3.id AS id3,
m3.`name` AS name3
FROM
t_menu m1,
t_menu m2,
t_menu m3
WHERE
m1.id = m2.parentId
AND m2.id = m3.parentId
AND m3.enabled = TRUE
</select>
在MenuRoleMapper.xml下添加如下代码:
<!-- 更新角色菜单 -->
<insert id="insertRecord">
insert into t_menu_role(mid, rid) values
<foreach collection="mids" item="mid" separator=",">
(#{mid}, #{rid})
</foreach>
</insert>
1.4.服务类
IMenuService.java
public interface IMenuService extends IService<Menu> {
/**
* 通过用户ID查询菜单列表
* @return
*/
List<Menu> getMenusByAdminId();
/**
* 根据角色获得菜单列表
* @return
*/
List<Menu> getMenusWithRole();
/**
* 查询所有菜单
* @return
*/
List<Menu> getAllMenus();
}
IMenuRoleService.java
public interface IMenuRoleService extends IService<MenuRole> {
/**
* 更新角色菜单
* @param rid
* @param mids
* @return
*/
RespBean updateMenuRole(Integer rid, Integer[] mids);
}
1.5.服务实现类
MenuServiceImpl.java
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
@Resource
private MenuMapper menuMapper;
@Resource
private RedisTemplate redisTemplate;
......
/**
* 根据角色获得菜单列表
* @return
*/
@Override
public List<Menu> getMenusWithRole() {
return menuMapper.getMenusWithRole();
}
@Override
public List<Menu> getAllMenus() {
return menuMapper.getAllMenus();
}
}
MenuRoleServiceImpl.java
@Service
public class MenuRoleServiceImpl extends ServiceImpl<MenuRoleMapper, MenuRole> implements IMenuRoleService {
@Resource
private MenuRoleMapper menuRoleMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public RespBean updateMenuRole(Integer rid, Integer[] mids) {
// 根据角色id删除角色下面的所有菜单
menuRoleMapper.delete(new QueryWrapper<MenuRole>().eq("rid", rid));
// 判断菜单id是否存在
if (null == mids || 0 == mids.length) {
// 不存在mid,不执行任何存在,只是一个“更新成功”提示。
return RespBean.success("更新成功");
}
Integer result = menuRoleMapper.insertRecord(rid, mids);
if (result == mids.length) {
return RespBean.success("更新成功");
}
return RespBean.error("更新失败");
}
}
1.2.测试
添加角色功能:
重启我们的项目,打开接口文档(将多余的参数值删去,只需要name
和nameZh
)
结果:
数据库变化:
根据角色id查询菜单id:
那么到这里权限组模块就完成了,其他功能就自行测试了,我这里就不进行测试了,下一篇主要实现部门管理模块:
👇👇👇
数据库存储过程实现CRUD