# 業務層接口
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();
}