大家可以直接微信扫描上面的二维码关注我的公众号,然后回复【bg28】 里面就会给到源代码的下载地址同时会附上相应的视频教程,并定期在我的公众号上给大家推送相应的技术文章,欢迎大家关注我的公众号。
在第二十七章我们已经实现了我们的菜单管理的整个的功能,那么在第二十八章我们将实现我们的角色管理的功能。
由于在前面几章的时候我们还没涉及到鉴权因此当时是把前端的权限都放开了,但是到本章实际上我们已经对整个系统进行了鉴权了,因此在此处前端需要改造router目录底下的index.js,改造完成以后的代码如下:
import Vue from 'vue';
import iView from 'iview';
import Util from '../lib/util';
import VueRouter from 'vue-router';
import routers from './router';
Vue.use(VueRouter);
// 路由配置
const RouterConfig = {
//mode: 'history',
routes: routers
};
export const router = new VueRouter(RouterConfig);
router.beforeEach((to, from, next) => {
iView.LoadingBar.start();
Util.title(to.meta.title);
if (to.meta.requireAuth) {
if (localStorage.getItem('token') != '' && localStorage.getItem('token') != null) {
next();
} else {
next({
path: '/login',
query: {redirect: to.fullPath}//登录成功以后跳转到该路由
});
}
} else {
next();
}
});
router.afterEach((to) => {
iView.LoadingBar.finish();
window.scrollTo(0, 0);
});
在我们开始编写角色管理的时候我们首先需要实现一些相关工具类。
@Table(name = "t_role")
public class Role {
/**
* 角色流水ID
*/
@Id
@Column(name = "roleId")
@KeySql(genId = UuidGenId.class)
private String roleId;
/**
* 角色名字
*/
@Column(name = "roleName")
private String roleName;
/**
* 角色编码
*/
@Column(name = "roleCode")
private String roleCode;
/**
* 创建时间
*/
@Column(name = "crtDate")
private Date crtDate;
/**
* 角色数据集合
*/
@Transient
private String roleTrees;
/**
* 空的构造函数
*/
public Role(){
super();
}
// 省略set和get方法
}
@Table(name = "t_role_tree")
public class RoleTree {
/**
* 角色菜单关联流水ID
*/
@Id
@Column(name = "roleTreeId")
@KeySql(genId = UuidGenId.class)
private String roleTreeId;
/**
* 角色ID
*/
@Column(name = "roleId")
private String roleId;
/**
* 菜单ID
*/
@Column(name = "treeId")
private Integer treeId;
/**
*
* @param roleId 角色ID
* @param treeId 菜单ID
*/
public RoleTree(String roleId,Integer treeId){
this.roleId = roleId;
this.treeId = treeId;
}
// 省略set和get方法
}
由于角色是与菜单是有关联关系的,因此在我们删除角色的时候,我们需要删除角色与菜单之间的中间表的关联关系的数据,因此我们需要根据角色ID来删除角色菜单关联数据。
delete from t_role_tree where roleId = #{roleId}
/**
* 功能描述:根据角色ID来删除角色菜单关联数据
* @param roleId 角色ID
* @return 返回删除结果
*/
int deleteRoleTreeByRoleId(@Param("roleId")String roleId);
update t_role set roleName = #{roleName},roleCode=#{roleCode} where roleId = #{roleId}
package com.github.bg.admin.core.dao;
import com.github.bg.admin.core.entity.Role;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
/**
* @author linzf
* @since 2019-07-05
* 类描述:角色的dao
*/
public interface RoleDao extends Mapper {
/**
* 功能描述:根据用户ID来获取该用户的相应的绑定的数据
* @param userId 用户ID
* @return 返回角色的集合
*/
List getUserRoleListByUserId(@Param("userId") String userId);
/**
* 功能描述:更新角色信息
*
* @param roleId 角色流水ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @return 返回操作结果
*/
int updateRole(@Param("roleId") String roleId, @Param("roleName") String roleName, @Param("roleCode") String roleCode);
/**
* 功能描述:验证角色编码和角色名字是否重复
*
* @param roleId 角色ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @return 返回验证结果
*/
int checkRoleCodeAndName(@Param("roleId") String roleId, @Param("roleName") String roleName, @Param("roleCode") String roleCode);
/**
* 功能描述:获取角色列表数据
*
* @param search 模糊匹配角色的roleName和roleCode
* @return 返回查询结果
*/
List queryRoleList(@Param("search") String search);
}
package com.github.bg.admin.core.service;
import com.github.bg.admin.core.constant.RoleStaticConstant;
import com.github.bg.admin.core.constant.SystemStaticConst;
import com.github.bg.admin.core.constant.TreeStaticConstant;
import com.github.bg.admin.core.dao.RoleDao;
import com.github.bg.admin.core.dao.RoleTreeDao;
import com.github.bg.admin.core.dao.TreeDao;
import com.github.bg.admin.core.dto.TreeDto;
import com.github.bg.admin.core.entity.*;
import com.github.bg.admin.core.mapper.TreeMapper;
import com.github.bg.admin.core.util.JsonUtils;
import com.github.bg.admin.core.util.PageUtil;
import com.github.bg.admin.core.util.TreeInstall;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author linzf
* @since 2019/4/30
* 类描述:角色管理的service
*/
@Service
@Transactional(rollbackFor = {IllegalArgumentException.class})
public class RoleService {
@Autowired
private RoleDao roleDao;
@Autowired
private TreeDao treeDao;
@Autowired
private RoleTreeDao roleTreeDao;
@Autowired
private TreeMapper treeMapper;
/**
* 功能描述:加载菜单节点的数据
* @return 返回加载结果
*/
public ReturnInfo loadTree(){
Tree tree = new Tree();
tree.setTreeState(TreeStaticConstant.TREE_STATE_NORMAL);
return new ReturnInfo(SystemStaticConst.SUCCESS, "加载菜单数据成功", TreeInstall.installTree(treeMapper.treesToTreeDTO(treeDao.select(tree))));
}
/**
* 功能描述:删除角色数据
*
* @param roleId 角色流水ID
* @return 返回删除结果
*/
public ReturnInfo deleteRole(String roleId) {
try {
if (roleDao.deleteByPrimaryKey(roleId) > 0) {
// 删除角色的关联数据
roleTreeDao.deleteRoleTreeByRoleId(roleId);
return new ReturnInfo(SystemStaticConst.SUCCESS, "删除角色数据成功");
}
return new ReturnInfo(SystemStaticConst.FAIL, "删除角色数据失败!失败原因:该角色数据不存在");
} catch (Exception e) {
return new ReturnInfo(SystemStaticConst.FAIL, "删除角色数据失败!失败原因:" + e.getMessage());
}
}
/**
* 功能描述:更新角色数据
*
* @param roleId 角色流水ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @param roleTrees 角色菜单关联的数据
* @return 返回操作结果
*/
public ReturnInfo updateRole(String roleId, String roleName, String roleCode,String roleTrees) {
try {
if (roleDao.checkRoleCodeAndName(roleId, roleName, "") > 0) {
return new ReturnInfo(SystemStaticConst.FAIL, "角色名字已经存在,请修改以后再提交!");
}
if (roleDao.checkRoleCodeAndName(roleId, "", roleCode) > 0) {
return new ReturnInfo(SystemStaticConst.FAIL, "角色编码已经存在,请修改以后再提交!");
}
if (roleDao.updateRole(roleId, roleName, roleCode) > 0) {
if(roleTrees!=null){
// 删除关联表的数据
roleTreeDao.deleteRoleTreeByRoleId(roleId);
// 重新插入新的关联数据
saveRoleAssociateTree(JsonUtils.jsonToList(roleTrees, TreeDto.class),new Role(roleId));
}
return new ReturnInfo(SystemStaticConst.SUCCESS, "更新角色数据成功");
}
return new ReturnInfo(SystemStaticConst.FAIL, "更新角色数据失败!失败原因:查无此角色数据");
} catch (Exception e) {
return new ReturnInfo(SystemStaticConst.FAIL, "更新角色数据失败!失败原因:" + e.getMessage());
}
}
/**
* 功能描述:获取角色信息
*
* @param roleId 角色流水ID
* @return 返回操作结果
*/
public ReturnInfo getRoleByRoleId(String roleId) {
try {
Role role = roleDao.selectByPrimaryKey(roleId);
if (role != null) {
List treeList = treeDao.queryTreeByRoleId(role.getRoleId());
List allTree = treeDao.selectAll();
Map treeMap = new HashMap<>(3);
for(Tree tree:treeList){
treeMap.put(tree.getTreeId().toString(),tree);
}
Map result = JsonUtils.objToMap(role);
result.put(RoleStaticConstant.ROLE_TREE_LIST_NAME,TreeInstall.installCheckTree(treeMapper.treesToTreeDTO(allTree),treeMap));
return new ReturnInfo(SystemStaticConst.SUCCESS, "获取角色数据成功", result);
}
} catch (Exception e) {
return new ReturnInfo(SystemStaticConst.FAIL, "获取角色数据失败!失败原因:" + e.getMessage());
}
return new ReturnInfo(SystemStaticConst.FAIL, "获取角色数据失败!失败原因:查无此角色数据");
}
/**
* 功能描述:实现增加角色数据
*
* @param role 角色实体数据
* @return 返回操作结果
*/
public ReturnInfo addRole(Role role) {
role.setCrtDate(new Date());
try {
if (roleDao.checkRoleCodeAndName("", role.getRoleName(), "") > 0) {
return new ReturnInfo(SystemStaticConst.FAIL, "角色名字已经存在,请修改以后再提交!");
}
if (roleDao.checkRoleCodeAndName("", "", role.getRoleCode()) > 0) {
return new ReturnInfo(SystemStaticConst.FAIL, "角色编码已经存在,请修改以后再提交!");
}
roleDao.insert(role);
saveRoleAssociateTree(JsonUtils.jsonToList(role.getRoleTrees(),TreeDto.class),role);
} catch (Exception e) {
return new ReturnInfo(SystemStaticConst.FAIL, "增加角色失败,失败原因:" + e.getMessage());
}
return new ReturnInfo(SystemStaticConst.SUCCESS, "增加加角色成功", role);
}
/**
* 功能描述:验证角色编码和角色名字是否重复
*
* @param roleId 角色流水ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @return 返回处理结果
*/
public ReturnInfo checkRoleCodeAndName(String roleId, String roleName, String roleCode) {
Map result = new HashMap<>(1);
try {
// 查询的结果大于0表示数据库已经存在该数据了,反之则不存在
if (roleDao.checkRoleCodeAndName(roleId, roleName, roleCode) > 0) {
result.put("success", "unPass");
} else {
result.put("success", "pass");
}
} catch (Exception e) {
return new ReturnInfo(SystemStaticConst.FAIL, "验证请求处理失败,失败原因:" + e.getMessage());
}
return new ReturnInfo(SystemStaticConst.SUCCESS, "验证请求处理成功", result);
}
/**
* 功能描述:获取角色列表数据
*
* @param search 模糊匹配角色的roleName和roleCode
* @param pageSize 每页显示的记录的条数
* @param current 当前访问第几页
* @param orderKey 排序字段
* @param orderByValue 排序方式,降序还是升序
* @return 返回查询结果
*/
public ReturnInfo queryRoleList(String search, int pageSize, int current, String orderKey, String orderByValue) {
PageHelper.startPage(current, (pageSize > 0 && pageSize <= 500) ? pageSize : 20, (orderKey != null && !"".equals(orderKey)) ? ((orderByValue != null && !"".equals(orderByValue)) ? (orderKey + " " + orderByValue) : orderKey) : "");
HashMap res = PageUtil.getResult(roleDao.queryRoleList(search));
return new ReturnInfo(SystemStaticConst.SUCCESS, "获取角色列表数据成功!", new Page(pageSize, current, (long) res.get("total"), (List) res.get("rows")));
}
/**
* 功能描述:保存角色和菜单的关联关系的数据
* @param treeDtoList 菜单节点数据
* @param entity 角色实体
* @return 返回是否有子节点被选中
*/
private boolean saveRoleAssociateTree(List treeDtoList,Role entity){
boolean hasChildrenChecked = false;
for(TreeDto treeDto:treeDtoList){
if(treeDto.getChildren()!=null&&treeDto.getChildren().size()>0){
if(saveRoleAssociateTree(treeDto.getChildren(),entity)||treeDto.isChecked()){
roleTreeDao.insert(new RoleTree(entity.getRoleId(),treeDto.getTreeId()));
hasChildrenChecked = true;
}
}else{
if(treeDto.isChecked()){
roleTreeDao.insert(new RoleTree(entity.getRoleId(),treeDto.getTreeId()));
hasChildrenChecked = true;
}
}
}
return hasChildrenChecked;
}
}
package com.github.bg.admin.core.controller;
import com.github.bg.admin.core.entity.ReturnInfo;
import com.github.bg.admin.core.entity.Role;
import com.github.bg.admin.core.service.RoleService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author linzf
* @since 2019/4/30
* 类描述:角色管理的controller
*/
@RestController
@RequestMapping("/role")
public class RoleController {
@Autowired
private RoleService roleService;
/**
* 功能描述:加载菜单节点的数据
* @return
*/
@ApiOperation(value = "加载菜单节点的数据")
@PostMapping("loadTree")
public ReturnInfo loadTree(){
return roleService.loadTree();
}
/**
* 功能描述:删除角色数据
* @param roleId 角色流水ID
* @return 返回删除结果
*/
@ApiOperation(value = "删除角色数据")
@PostMapping("deleteRole")
public ReturnInfo deleteRole(@RequestParam(name = "roleId")String roleId){
return roleService.deleteRole(roleId);
}
/**
* 功能描述:更新角色数据
* @param roleId 角色流水ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @param roleTrees 角色关联的菜单数据
* @return 返回操作结果
*/
@ApiOperation(value = "更新角色数据")
@PostMapping("updateRole")
public ReturnInfo updateRole(@RequestParam(name = "roleId") String roleId, @RequestParam(name = "roleName") String roleName, @RequestParam(name = "roleCode") String roleCode,@RequestParam(name = "roleTrees" ,required = false) String roleTrees){
return roleService.updateRole(roleId, roleName, roleCode,roleTrees);
}
/**
* 功能描述:获取角色信息
* @param roleId 角色流水ID
* @return 返回操作结果
*/
@ApiOperation(value = "获取角色信息")
@PostMapping("getRoleByRoleId")
public ReturnInfo getRoleByRoleId(@RequestParam(name = "roleId") String roleId){
return roleService.getRoleByRoleId(roleId);
}
/**
* 功能描述:实现增加角色
* @param role 角色实体数据
* @return 返回操作结果
*/
@ApiOperation(value = "增加角色")
@PostMapping("addRole")
public ReturnInfo addRole(Role role){
return roleService.addRole(role);
}
/**
* 功能描述:验证角色编码和角色名字是否重复
*
* @param roleId 角色流水ID
* @param roleName 角色名字
* @param roleCode 角色编码
* @return 返回处理结果
*/
@ApiOperation(value = "验证角色编码和角色名字是否重复")
@PostMapping("checkRoleCodeAndName")
public ReturnInfo checkRoleCodeAndName(@RequestParam(name = "roleId", required = false) String roleId, @RequestParam(name = "roleName", required = false) String roleName, @RequestParam(name = "roleCode", required = false) String roleCode) {
return roleService.checkRoleCodeAndName(roleId, roleName, roleCode);
}
/**
* 功能描述:获取角色列表数据
*
* @param search 模糊匹配角色的roleName和roleCode
* @param pageSize 每页显示的记录的条数
* @param current 当前访问第几页
* @param orderKey 排序字段
* @param orderByValue 排序方式,降序还是升序
* @return 返回查询结果
*/
@ApiOperation(value = "获取角色列表数据")
@PostMapping("queryRoleList")
public ReturnInfo queryRoleList(@RequestParam(name = "search", required = false) String search, @RequestParam(name = "pageSize") int pageSize, @RequestParam(name = "current") int current, @RequestParam(name = "orderKey",required = false) String orderKey, @RequestParam(name = "orderByValue",required = false) String orderByValue) {
return roleService.queryRoleList(search, pageSize, current,orderKey,orderByValue);
}
}
最后我们重新编译我们的项目,记得一定要重新编译,因为我们引入了mapper,不重新编译是会报错的,然后我们使用账号:admin密码:123456登录系统操作我们的角色模块,可以正常的对整个角色模块进行相应的操作,这样我们就完成了角色的整合。
上一篇文章地址:spring boot+iview 前后端分离架构之菜单管理的实现(二十七)
下一篇文章地址:spring boot+iview 前后端分离架构之组织管理的实现(二十九)