天天看点

角色管理

  • 分页查询角色权限
# 业务层接口
public interface SysRoleService extends IService<SysRole> {

    /**
     * 分页查询角色列表
     * @param page 分页参数
     * @param sysRole 条件查询对象,会取name属性值作为条件
     * @return
     */
    IPage<SysRole> selectPage(Page<SysRole> page, SysRole sysRole);

}

# 业务层实现
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {

    @Override
    public IPage<SysRole> selectPage(Page<SysRole> page, SysRole sysRole) {
        return baseMapper.selectPage(page, sysRole);
    }

}

# 控制层
@Controller
@RequestMapping("/role")
public class SysRoleController {

    // url路径
    private static final String HTML_PREFIX = "system/role/";

    // 跳转到分页查询页面
    @GetMapping(value = {"/", ""})
    public String role() {
        return HTML_PREFIX + "role-list";
    }

    // 角色业务对象
    @Autowired
    private SysRoleService sysRoleService;

    // 分页查询
    @PreAuthorize("hasAuthority('sys:role:list')")
    @GetMapping("/page")
    @ResponseBody
    public MengxueguResult page(Page<SysRole> page, SysRole sysRole) {
        return MengxueguResult.ok( sysRoleService.selectPage(page, sysRole) );
    }

}      
  • 跳转到新增或修改的页面
# 持久层接口
public interface SysPermissionMapper extends BaseMapper<SysPermission> {

    List<SysPermission> findByRoleId(@Param("roleId") Long roleId);

}

# 持久层映射
<select id="findByRoleId" resultType="SysPermission">
    SELECT
        DISTINCT p.*
    FROM
        sys_permission p
            JOIN sys_role_permission rp ON p.id = rp.permission_id
            JOIN sys_role sr ON rp.role_id = sr.id
    WHERE rp.role_id = #{roleId}
    ORDER BY p.id
</select>

# 业务层接口
/**
 * 通过角色id查询角色信息和所拥有权限信息
 * @param id
 * @return
 */
SysRole findById(Long id);

# 业务层实现
@Override
public SysRole findById(Long id) {
    // 1. 通过角色id查询对应的角色信息
    SysRole sysRole = baseMapper.selectById(id);
    // 2. 通过角色id查询所拥有的权限
    List<SysPermission> permissions = sysPermissionMapper.findByRoleId(id);
    // 3. 将查询到的权限set到角色对象中SysRole
    sysRole.setPerList(permissions);
    return sysRole;
}

# 控制层接口
/**
 * 跳转到新增或修改数据的页面
 * @param id 如果传入id,则表示执行修改操作
 * @param model
 * @return
 */
@PreAuthorize("hasAnyAuthority('sys:role:add', 'sys:role:edit')")
@GetMapping(value={"/form", "/form/{id}"})
public String form(@PathVariable(required = false) Long id, Model model) {
    // 通过角色id查询对应的角色信息和权限信息
    SysRole role = sysRoleService.findById(id);
    model.addAttribute("role", role);
    return HTML_PREFIX + "role-form";
}      
  • 新增或修改操作
# 持久层接口
/**
 * 通过角色id删除角色权限表中的所有记录
 * @param roleId
 * @return
 */
boolean deleteRolePermissionByRoleId(@Param("roleId") Long roleId);

/**
 * 保存角色 与权限关系表数据
 * @param roleId 角色id
 * @param perIds 角色所拥有的权限
 * @return
 */
boolean saveRolePermission(@Param("roleId") Long roleId,@Param("perIds") List<Long> perIds);

# 持久层映射
<!--通过角色id删除角色权限关系 表数据-->
<delete id="deleteRolePermissionByRoleId">
  DELETE FROM sys_role_permission where role_id = #{roleId}
</delete>

<insert id="saveRolePermission">
    INSERT INTO sys_role_permission(role_id, permission_id) VALUES
    <foreach collection="perIds" item="item" index="index" separator=",">
        (#{roleId}, #{item})
    </foreach>
</insert>

# 业务层实现
/**
 * 重写mybatis plus的saveOrUpdate方法
 * @param entity
 * @return
 */
@Transactional
@Override
public boolean saveOrUpdate(SysRole entity) {
    entity.setUpdateDate(new Date());
    // 1. 更新《角色表》中的数据
    boolean flag = super.saveOrUpdate(entity);
    if(flag) {
        // 2. 先删除《角色权限关系表》中的数据
        baseMapper.deleteRolePermissionByRoleId(entity.getId());
        // 3. 新增《角色权限关系表》中的数据
        if(CollectionUtils.isNotEmpty(entity.getPerIds())) {
            baseMapper.saveRolePermission(entity.getId(), entity.getPerIds());
        }
    }
    return flag;
}

# 控制层接口
/**
 * 提交新增或者修改的数据
 * @return
 */
@PreAuthorize("hasAnyAuthority('sys:role:add', 'sys:role:edit')")
@RequestMapping(method = {RequestMethod.POST, RequestMethod.PUT}, value = "")
public String saveOrUpdate(SysRole sysRole) {
    sysRoleService.saveOrUpdate(sysRole);
    return "redirect:/role";
}      
  • 删除角色
# 业务层接口
/**
 * 1. 通过id删除角色信息表数据
 * 2. 通过id删除角色权限关系表数据
 * @param id 角色id
 * @return
 */
boolean deleteById(Long id);

# 业务层实现
@Transactional //事务管理
@Override
public boolean deleteById(Long id) {
    // 1. 通过id删除角色信息表数据
    baseMapper.deleteById(id);
    // 2. 通过id删除角色权限关系表数据
    baseMapper.deleteRolePermissionByRoleId(id);
    return true;
}

# 控制层接口
/**
 * 删除角色
 * @param id
 * @return
 */
@PreAuthorize("hasAuthority('sys:role:delete')")
@DeleteMapping("/{id}") // /role/{id}
@ResponseBody
public MengxueguResult deleteById(@PathVariable("id") Long id) {
    sysRoleService.deleteById(id);
    return MengxueguResult.ok();
}