目录
一.查询用户角色
二.修改用户角色
三.修改用户状态
一.查询用户角色
一个用户可以有多个角色,我们也可以给某个用户分配某些角色,所以我们还需要新建一个实体类(这个实体类需要放到bean下,因为这个实体类和数据据库不是对应关系,而是我们为了实现这一功能而建的一个实体类)
一是查询所有角色,二是查询该用户拥有哪些角色,这两个集合的交集展示出来就可以看到带有状态的角色。
后台代码:
我们来新建一个mapper包下的映射文件RoleMapper.java
public interface RoleMapper extends BaseMapper<Role> {
//查询用户拥有的所有角色的id,即返回的是id的集合
List<Integer> findRoleIdByAdmin(Integer aid);
}
然后写一下RoleMapper.xml(配置文件),还是放到resources下的同等路径中
(resources/com/first/travel/mapper/)
<?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.first.travel.mapper.RoleMapper">
<select id="findRoleIdByAdmin" parameterType="int" resultType="int">
select rid
from admin_role
where aid = #{aid}
</select>
</mapper>
然后在Service层添加查询带有状态的角色功能:
// 查询用户的角色情况
public List<RoleWithStatus> findRole(Integer aid) {
// 1.查询所有角色(selectList是BaseMapper的接口函数)
List<Role> roles = roleMapper.selectList(null);
// 2.查询用户拥有的角色(这是咱们自定义的函数,根据用户id查询这个用户拥有哪些角色,返回的是一个角色id的列表)
List<Integer> rids = roleMapper.findRoleIdByAdmin(aid);
// 3.构建带有状态的角色集合,拥有拥有状态为true,否则状态为false
List<RoleWithStatus> roleList = new ArrayList();
for (Role role : roles) {
// 创建带有状态的角色
RoleWithStatus roleWithStatus = new RoleWithStatus();
// 复制对象的属性(即把相同的属性名对应的属性值从左边那个对象赋给右边那个对象,一步到位,不用一个一个的赋值了)
BeanUtils.copyProperties(role, roleWithStatus);
if (rids.contains(role.getRid())) { // 用户拥有该角色
roleWithStatus.setAdminHas(true);
} else {
roleWithStatus.setAdminHas(false);
}
roleList.add(roleWithStatus);
}
return roleList;
}
然后在controller层添加控制逻辑:
@RequestMapping("/findRole")
public ModelAndView findRole(Integer aid){
List<RoleWithStatus> roles = adminService.findRole(aid);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("roles",roles);
modelAndView.addObject("aid",aid);
modelAndView.setViewName("/backstage/admin_role");
return modelAndView;
}
前端代码:略
运行i项目,点击首页的分配角色按钮,测试成功。
二.修改用户角色
为了方便起见,我们在修改用户角色时,先把该用户对用的角色全部删除,然后再重新添加一遍。
@Param的作用就是给参数命名,一般使用在dao(mapper)层,当添加注解后(@Param("userId") int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。
添加接口:
//删除用户的所有角色
void deleteAdminAllRoles(Integer id);
//给用户添加角色
void addAdminRole(@Param("aid") Integer aid,@Param("rid") Integer rid);
在AdminMapper.xml中添加接口配置:
<delete id="deleteAdminAllRoles" parameterType="int">
DELETE from admin_role where aid = #{aid}
</delete>
<insert id="addAdminRole">
INSERT INTO admin_role values (#{aid},#{rid})
</insert>
咱们前面说过,mapper,service,controller这三层分别是干嘛的,咱们现在再来强调一点,前面说的不够全面,service层不一定是实现接口的功能,因为的接口的功能可以由配置文件来实现,比如AdminMapper.xml,所以service层确实实现了一些功能,可以把这些功能看作是业务逻辑功能,这也可能是几个接口函数组合起来的实现的一个功能。
比如咱们下面要在service层添加的这个功能:
// 修改用户角色
public void updateRole(Integer aid, Integer[] ids) {
// 删除用户的所有角色
adminMapper.deleteAdminAllRoles(aid);
// 重新给用户添加角色
for (Integer rid : ids) {
adminMapper.addAdminRole(aid, rid);
}
}
控制层:
@RequestMapping("/updateRole")
public String updateRole(Integer aid,Integer[] ids){
adminService.updateRole(aid,ids);
return "redirect:/backstage/admin/all";
}
前端页面代码省略。
运行项目,现在就可以根据复选框来修改用户的角色了。
三.修改用户状态
当系统不想让管理员登录时,因为管理员可能会关联很多数据,此时往往不会删除管理员。
而是将管理员状态改为false. 接下来我们编写修改用户状态的代码。
修改service层:
// 修改用户状态
public void updateStatus(Integer aid) {
Admin admin = adminMapper.selectById(aid);
admin.setStatus(!admin.isStatus()); // 状态取反
adminMapper.updateById(admin);
}
控制层:
@RequestMapping("/updateStatus")
public String updateStatus(Integer aid){
adminService.updateStatus(aid);
return "redirect:/backstage/admin/all";
}
运行项目,然后在主页点击”启用/禁用“按钮,查看状态一栏的变化。