前言
这是第一次进项目,第一次做冲刺,所以这次分配的任务不是很多。这次我主要实现角色和权限的功能,通过rbac权限模型进行实现
一、角色的增删改查
部分代码:
/**
* 添加角色
*
* @param role
* @return
*/
@Override
public ResultInfo insert(Role role) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
roleMapper.insertRole(role);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("添加失败!");
e.printStackTrace();
}
return info;
}
/**
* 查看所有角色
*
* @return
*/
@Override
public ResultInfo selectAll() {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
List<Role> list = roleMapper.selectAll();
info.setData(list);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("查询失败!");
e.printStackTrace();
}
return info;
}
/**
* 查看一个用户拥有的角色
* @param userId
* @return
*/
@Override
public ResultInfo selectOne(Integer userId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
List<Integer> roleIds = roleMapper.selectRelByUserId(userId);
List<Role> list = new ArrayList<>();
for (Integer roleId : roleIds){
Role role = roleMapper.selectRoleByRoleId(roleId);
list.add(role);
}
info.setData(list);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("查询失败!");
e.printStackTrace();
}
return info;
}
/**
* 修改角色
*
* @param role
* @return
*/
@Override
public ResultInfo update(Role role) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
roleMapper.update(role);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("修改失败!");
e.printStackTrace();
}
return info;
}
/**
* 删除角色
*
* @param roleId
* @return
*/
@Override
public ResultInfo delete(Integer roleId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
roleMapper.deleteRoleByRoleId(roleId);
List<Integer> userIds = roleMapper.selectOneByRoleId(roleId);
List<Integer> resourceIds = roleMapper.selectResourceIdsByRoleId(roleId);
if (userIds.size() != 0){
for (Integer userId : userIds){
roleMapper.deleteRel(roleId, userId);
}
}
if (resourceIds.size() != 0){
for (Integer resourceId : resourceIds){
roleMapper.deleteRelWithResource(roleId, resourceId);
}
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("删除失败!");
e.printStackTrace();
}
return info;
}
二、权限的增删改查
部分权限:
/**
* 添加权限
* @param resource
* @return
*/
@Override
public ResultInfo insert(Resource resource) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
String parentId = resource.getParentId();
//id只有三位代表第一级,parentid只能为000
if ("000".equals(parentId)){
Integer count = resourceMapper.selectCountByParentId(parentId);
StringBuilder resourceId = new StringBuilder();
if (count >= 0 && count <=9){
resourceId.append("0");
resourceId.append("0");
resourceId.append(count+1);
}else if (count >= 10 && count <= 99){
resourceId.append("0");
Integer ten = (count/10)%10;
Integer a = count % 10;
resourceId.append(ten);
resourceId.append(a);
}else if (count >= 100 && count <=999){
Integer hundred = (count/100)%10;
Integer ten = (count/10)%10;
Integer a = count % 10;
resourceId.append(hundred);
resourceId.append(ten);
resourceId.append(a);
}
resource.setResourceId(resourceId.toString());
resourceMapper.insertResource(resource);
//由于id的结构构成原因,id除最后三位,前面几位必须为表里有的id
}else {
Integer count = resourceMapper.selectCountByParentId(parentId);
StringBuilder resourceId = new StringBuilder(parentId);
if (count >= 0 && count <=9){
resourceId.append("0");
resourceId.append("0");
resourceId.append(count+1);
}else if (count >= 10 && count <= 99){
resourceId.append("0");
Integer ten = (count/10)%10;
Integer a = count % 10;
resourceId.append(ten);
resourceId.append(a);
}else if (count >= 100 && count <=999){
Integer hundred = (count/100)%10;
Integer ten = (count/10)%10;
Integer a = count % 10;
resourceId.append(hundred);
resourceId.append(ten);
resourceId.append(a);
}
resource.setResourceId(resourceId.toString());
resourceMapper.insertResource(resource);
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("添加失败");
e.printStackTrace();
}
return info;
}
/**
* 查看所有权限
* @return
*/
@Override
public ResultInfo selectAll() {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
List<Resource> list = resourceMapper.selectAll();
info.setData(list);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("查看失败");
e.printStackTrace();
}
return info;
}
/**
* 查看一个角色所拥有的权限
* @param roleId
* @return
*/
@Override
public ResultInfo selectOne(Integer roleId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
List<String> resourceIds = resourceMapper.selectRelByRoleId(roleId);
List<Resource> list = new ArrayList<>();
for (String resourceId : resourceIds){
Resource resource = resourceMapper.selectByResourceId(resourceId);
list.add(resource);
}
info.setData(list);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("查看失败");
e.printStackTrace();
}
return info;
}
/**
* 查看一个用户所拥有的权限
* @param userId
* @return
*/
@Override
public ResultInfo selectResrouceByUserId(Integer userId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
List<Integer> roleIds = roleMapper.selectRelByUserId(userId);
List<Resource> list = new ArrayList<>();
for (Integer roleId : roleIds){
List<String> resourceIds = resourceMapper.selectRelByRoleId(roleId);
for (String resourceId : resourceIds){
Resource resource = resourceMapper.selectByResourceId(resourceId);
list.add(resource);
}
}
info.setData(list);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("查询失败");
e.printStackTrace();
}
return info;
}
/**
* 修改权限
* @param resource
* @return
*/
@Override
public ResultInfo update(Resource resource) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
resourceMapper.update(resource);
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("修改失败");
e.printStackTrace();
}
return info;
}
/**
* 删除权限
* @param resourceId
* @return
*/
@Override
public ResultInfo delete(String resourceId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
String parentId = resourceId;
Resource resource = resourceMapper.selectResourceByParentId(parentId);
if (resource == null) {
resourceMapper.deleteResourceByResourceId(resourceId);
Integer integer = Integer.parseInt(resourceId.substring(resourceId.length() - 3));
String parentId1 = null;
if (resourceId.length() > 3) {
parentId1 = resourceId.substring(0, resourceId.length() - 4);
} else {
parentId1 = "000";
}
// Integer count = resourceMapper.selectCountByParentId(parentId1);
//获得同一级的所有的resourceId
List<String> resourceIds = resourceMapper.selectResourceIdsByParentId(parentId1);
//改变后的Id
String newResourceId = resourceId;
//改变需要改变的resouceId
for (String oldResourceId : resourceIds) {
Integer integer1 = Integer.parseInt(oldResourceId.substring(oldResourceId.length() - 3));
//判断resourceId是否需要改变,比integer大就是需要改变
if (integer1 > integer) {
//获取需要改变的resource下的所有子级Id
List<String> resourceIds1 = resourceMapper.selectChildResourceIdsByResourceId(oldResourceId);
//改变需要改变的resource的resourceId
resourceMapper.updateResourceId(oldResourceId, newResourceId);
//改变需要改变的resource下所有子级的resourceId以及parentId
for (String resourceId1 : resourceIds1) {
String substring = resourceId1.substring(oldResourceId.length());
StringBuilder sb = new StringBuilder();
sb.append(newResourceId);
sb.append(substring);
resourceMapper.updateParentIdByResourceId(resourceId1, sb.toString().substring(0,sb.toString().length()-3));
resourceMapper.updateResourceId(resourceId1,sb.toString());
}
newResourceId = oldResourceId;
}
}
List<Integer> roleIds = resourceMapper.selectRoleIdByResourceId(resourceId);
for (Integer roleId : roleIds) {
resourceMapper.deleteRelByResourceIdAndRoleId(resourceId, roleId);
}
} else {
info.setFlag(false);
info.setErrorMsg("该权限下还有权限,无法删除");
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("删除失败");
e.printStackTrace();
}
return info;
}
三、将角色赋予用户或取消用户的角色
部分代码:
/**
* 赋予用户角色
*
* @param roleIds
* @param userId
* @return
*/
@Override
public ResultInfo permission(List<Integer> roleIds, Integer userId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
for (Integer roleId : roleIds){
roleMapper.insertRel(roleId, userId);
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("赋予权限失败!");
e.printStackTrace();
}
return info;
}
/**
* 取消用户角色
* @param roleIds
* @param userId
* @return
*/
@Override
public ResultInfo cancel(List<Integer> roleIds, Integer userId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
for (Integer roleId : roleIds){
roleMapper.deleteRel(roleId, userId);
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("取消失败!");
e.printStackTrace();
}
return info;
}
四、将权限赋予角色或删除角色的权限
部分代码:
@Override
public ResultInfo save(List<String> resourceIds, Integer roleId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
for (String resourceId : resourceIds){
resourceMapper.insertRel(resourceId,roleId);
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("添加失败");
e.printStackTrace();
}
return info;
}
@Override
public ResultInfo deleteRel(List<String> resourceIds, Integer roleId) {
ResultInfo info = new ResultInfo();
info.setFlag(true);
try {
for (String resourceId : resourceIds){
resourceMapper.deleteRelByResourceIdAndRoleId(resourceId,roleId);
}
} catch (Exception e) {
info.setFlag(false);
info.setErrorMsg("删除失败");
e.printStackTrace();
}
return info;
}
总结
因为是第一次进冲刺写代码,所以其实功能分配给我的都不是太难,这次只需要新学一个rbac权限模型,来进行总体设计,其余功能都是基本的增删改查功能