目录
一.查询用户角色
二.修改用户角色
三.修改用户状态
一.查询用户角色
一个用户可以有多个角色,我们也可以给某个用户分配某些角色,所以我们还需要新建一个实体类(这个实体类需要放到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 mapperPUBLIC "-//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 ridfrom admin_rolewhere 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,否则状态为falseList<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";}
运行项目,然后在主页点击”启用/禁用“按钮,查看状态一栏的变化。