天天看點

角色管理

  • 分頁查詢角色權限
# 業務層接口
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();
}