• Vue+Element-UI+Springboot权限管理系统


    一、前端修改权限弹出层

    1. <el-dialog
    2. title="修改权限"
    3. :visible.sync="updatePermissiondialogVisible"
    4. width="30%"
    5. >
    6. <el-tree
    7. :data="treeData"
    8. show-checkbox
    9. node-key="id"
    10. ref="rootTree"
    11. default-expand-all
    12. :props="defaultProps">
    13. el-tree>
    14. <span slot="footer" class="dialog-footer">
    15. <el-button @click="updatePermissiondialogVisible = false">取 消el-button>
    16. <el-button type="primary" @click="confirmPermission">确 定el-button>
    17. span>
    18. el-dialog>

    treeData:是我们从后端查询出的所有权限

    defaultProps:(1)children:子节点;lable:子节点名称

    node-key:是我们权限显示根据查询出来的权限编号来显示

    ref:可以理解为被选中的权限

    data数据层需要定义的数据:

    1. data(){
    2. return:{
    3. //权限弹出层
    4. updatePermissiondialogVisible:false,
    5. defaultProps: {
    6. children: 'children',
    7. label: 'name'
    8. },
    9. //树型菜单数据
    10. treeData:[],
    11. //被选中中菜单项目
    12. checkedKeys:[],
    13. roleId:0
    14. }
    15. }

    选中点击修改权限按钮触发的事件:

    1. //修改权限按钮事件
    2. updatePer(roleId){
    3. this.roleId=roleId;
    4. this.updatePermissiondialogVisible=true;
    5. this.$http.post("/permission/allMenu/"+roleId).then(result=>{
    6. // //1.查询所有的菜单
    7. this.treeData=result.data.data.treeData;
    8. console.log(result.data.data.checkIds)
    9. // //2.查询当前角色具有的菜单id.
    10. setTimeout(()=>{
    11. result.data.data.checkIds.forEach(value=>{
    12. this.$refs.rootTree.setChecked(value,true,false);
    13. })
    14. },100)
    15. /*menuids.forEach(value=>{
    16. console.log(value);
    17. that.$refs.tree.setChecked(value,true,false);
    18. })*/
    19. })
    20. },

    二、后台权限信息数据回显功能实现:

    1.controller层

    1. @PostMapping("/allMenu/{roleId}")
    2. public CommonResult allMenu(@PathVariable String roleId){
    3. CommonResult allMenu = permissionService.findAllMenu(roleId);
    4. return allMenu;
    5. }

    2.业务层Srvice层(核心)

            我查询当前角色具有的权限使用的是递归调用分别比较当前权限id与父4权限id是否相同,相同则代表该权限id具有子菜单。

    1. @Service
    2. public class PermissionServiceImpl extends ServiceImpl implements IPermissionService {
    3. @Autowired
    4. private PermissionMapper permissionMapper;
    5. @Autowired
    6. private RedisTemplate redisTemplate;
    7. @Autowired
    8. private IRolePermissionService rolePermissionService;
    9. @Override
    10. //查询出所有的权限
    11. public CommonResult findAllMenu(String roleid) {
    12. QueryWrapper wrapper=new QueryWrapper<>();
    13. wrapper.eq("is_deleted",0);
    14. List permissionList = permissionMapper.selectList(wrapper);
    15. //设置层级关系
    16. List firstMenus =new ArrayList<>();
    17. for (Permission first : permissionList) {
    18. //查找一级菜单放入list集合
    19. if(first.getPid().equals("1")){
    20. firstMenus.add(first);
    21. }
    22. }
    23. //为一级菜单设置二级菜单
    24. for (Permission firstMenu : firstMenus) {
    25. firstMenu.setChildren(findChildren(permissionList,firstMenu.getId()));
    26. }
    27. //根据角色查询该角色具有的权限id
    28. QueryWrapper wrapper1=new QueryWrapper<>();
    29. wrapper1.eq("role_id",roleid);
    30. List list = rolePermissionService.list(wrapper1);
    31. //使用stream流只取出id
    32. List collect = list.stream().map(iteam -> iteam.getPermissionId()).distinct().collect(Collectors.toList());
    33. //将查询到的结果封装到map中
    34. Map map=new HashMap<>();
    35. map.put("checkIds",collect);
    36. map.put("treeData",firstMenus);
    37. return new CommonResult(2000,"查询成功!",map);
    38. }

    3.dao层(mapper层)

    数据库方面我使用是mybatis-plus

    1. @Repository
    2. public interface PermissionMapper extends BaseMapper {
    3. List findPermissionByUserId(String id);
    4. }

     此时我们已经做到权限数据可以回显,当前角色具有的权限也会被选中

    三、重新给角色分配权限后的确认修改的功能实现:

    1、点击确认修改权限的事件

    1. //确定权限分配
    2. confirmPermission(){
    3. //获取全选半选的树节点
    4. var checkedNodes=this.$refs.rootTree.getCheckedNodes(false,true);
    5. var ids=[];
    6. checkedNodes.forEach(iteam=>{
    7. ids.push(iteam.id)
    8. })
    9. this.$http.post("/rolePermission/edit/"+this.roleId,ids).then(result=>{
    10. if (result.data.code===2000){
    11. this.$message.success(result.data.msg);
    12. this.updatePermissiondialogVisible=false;
    13. }
    14. this.$router.go(0);
    15. })
    16. },

    2、后端修改权限controller层

    1. @RestController
    2. @RequestMapping("/rolePermission")
    3. public class RolePermissionController {
    4. @Autowired
    5. private IRolePermissionService rolePermissionService;
    6. @PostMapping("/edit/{roleId}")
    7. public CommonResult edit(@PathVariable String roleId, @RequestBody List ids){
    8. System.out.println(ids);
    9. return rolePermissionService.edit(roleId,ids);
    10. }
    11. }

    3.dao层(mapper层)

    数据库方面我使用是mybatis-plus

    在mapper中我调用的都是mybatis-plus中自带的单表方法

    4.业务层Srvice层(核心)

    修改权限业务流程可以看作是:

    1.先把角色原有的权限全部删除

    2.将重写分配给角色的权限添加上去

    因为是两步操作而且要保证同时进行所以我们要为其添加上事务处理

    @Transactional

    另外也要在主启动类上开启事务注解

    @EnableTransactionManagement//开启事务
    1. @Service
    2. public class RolePermissionServiceImpl extends ServiceImpl implements IRolePermissionService {
    3. @Override
    4. @Transactional
    5. public CommonResult edit(String roleId, List ids) {
    6. //修改操作
    7. //先删除后添加
    8. //删除
    9. QueryWrapper wrapper=new QueryWrapper<>();
    10. wrapper.eq("role_id",roleId);
    11. this.remove(wrapper);
    12. //添加
    13. List collect =
    14. ids.stream()
    15. .map(iteam -> new RolePermission(null, roleId, iteam, false, LocalDateTime.now(), LocalDateTime.now())).collect(Collectors.toList());
    16. this.saveBatch(collect);
    17. return new CommonResult(2000,"分配成功!",null);
    18. }
    19. }

     

     

  • 相关阅读:
    Fabric.js 使用图片遮盖画布(前景图)
    检测Nginx配置是否正确
    HTTP协议初始
    神经网络中的偏置(bias)究竟有什么用?
    【Vue】07 绑定样式 条件渲染
    ElasticSearch ( 五 ) ik中文分词
    晶振不仅仅是可以振荡就够了
    MongoDB 语法大全
    PPT 批量删除每页相同位置的内容
    极光推送Service
  • 原文地址:https://blog.csdn.net/Have_MonkeyG/article/details/126346655