From cde42f955d0c5358d900a99e5b0541367baf06e1 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Fri, 10 Jan 2025 16:51:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(system):=20=E9=87=8D=E6=9E=84=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=9D=83=E9=99=90=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 Authority 相关代码,改为使用 Menu 进行权限管理 - 重构 Role 和 RoleMenu 实体,以及相关 repository 和 service - 更新菜单相关 API,增加菜单权限校验- 优化角色创建和编辑逻辑,支持菜单权限分配 - 更新 RoleVo 类,使用 Menu 替代 Authority --- .../zsc/edu/gateway/FirstTimeInitializer.java | 1 + .../system/controller/MenuController.java | 12 +-- .../system/controller/RoleController.java | 21 +---- .../gateway/modules/system/dto/MenuDto.java | 8 +- .../gateway/modules/system/dto/RoleDto.java | 2 +- .../modules/system/entity/RoleMenu.java | 2 - .../modules/system/repo/MenuRepository.java | 1 - .../system/repo/RoleMenuRepository.java | 1 - .../modules/system/service/RoleService.java | 7 +- .../system/service/impl/MenuServiceImpl.java | 6 ++ .../system/service/impl/RoleServiceImpl.java | 64 ++++++-------- .../edu/gateway/modules/system/vo/RoleVo.java | 87 ++++++++++--------- .../resources/mappers/system/RoleMapper.xml | 15 ++-- 13 files changed, 102 insertions(+), 125 deletions(-) diff --git a/src/main/java/com/zsc/edu/gateway/FirstTimeInitializer.java b/src/main/java/com/zsc/edu/gateway/FirstTimeInitializer.java index 032c1db..94fd6f5 100644 --- a/src/main/java/com/zsc/edu/gateway/FirstTimeInitializer.java +++ b/src/main/java/com/zsc/edu/gateway/FirstTimeInitializer.java @@ -37,6 +37,7 @@ public class FirstTimeInitializer implements CommandLineRunner { private final DeptRepository deptRepo; private final PasswordEncoder passwordEncoder; + //TODO 初始化赋权给admin @Override public void run(String... args) { // if (authorityService.count() == 0L) { diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/controller/MenuController.java b/src/main/java/com/zsc/edu/gateway/modules/system/controller/MenuController.java index 38617be..9c203ed 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/controller/MenuController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/controller/MenuController.java @@ -26,7 +26,7 @@ public class MenuController { /** * 获取菜单树 */ - @GetMapping("/menu") + @GetMapping public List menu(@AuthenticationPrincipal UserDetailsImpl userDetails) { List list = service.selectByUserId(userDetails.getId(), Menu.Type.PAGE).stream().map(MenuVo::new).toList(); return TreeUtil.makeTree( @@ -40,16 +40,16 @@ public class MenuController { /** * 新建菜单 */ - @PostMapping("") - public Menu create(MenuDto dto) { + @PostMapping + public Menu create(@RequestBody MenuDto dto) { return service.create(dto); } /** * 更新菜单 */ - @PatchMapping("") - public Menu update(MenuDto dto, Long id) { + @PatchMapping("/{id}") + public Menu update(@RequestBody MenuDto dto, @PathVariable("id") Long id) { return service.update(dto, id); } @@ -57,7 +57,7 @@ public class MenuController { * 删除菜单 */ @DeleteMapping("/{id}") - public Boolean delete(@PathVariable Long id) { + public Boolean delete(@PathVariable("id") Long id) { return service.delete(id); } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/controller/RoleController.java b/src/main/java/com/zsc/edu/gateway/modules/system/controller/RoleController.java index 9aa80ba..086aa79 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/controller/RoleController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/controller/RoleController.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zsc.edu.gateway.modules.system.dto.AuthorityCreateDto; //import com.zsc.edu.gateway.modules.system.dto.RoleAuthCreateDto; import com.zsc.edu.gateway.modules.system.dto.RoleDto; -import com.zsc.edu.gateway.modules.system.entity.Authority; import com.zsc.edu.gateway.modules.system.entity.Role; import com.zsc.edu.gateway.modules.system.query.RoleQuery; import com.zsc.edu.gateway.modules.system.service.RoleAuthService; @@ -28,7 +27,6 @@ public class RoleController { private final RoleService service; - private final RoleAuthService roleAuthService; /** * 返回所有角色列表 hasAuthority('SYSTEM:ROLE:QUERY') @@ -49,9 +47,8 @@ public class RoleController { */ @PostMapping @PreAuthorize("hasAuthority('system:role:create')") - public Boolean create(@RequestBody RoleDto dto) { - Role role= service.create(dto); - return role != null; + public Role create(@RequestBody RoleDto dto) { + return service.create(dto); } /** @@ -63,9 +60,7 @@ public class RoleController { */ @PatchMapping("{id}") @PreAuthorize("hasAuthority('system:role:update')") - public Boolean update(@RequestBody RoleDto dto, @PathVariable("id") Long id) { -// Role role = roleMapper.toEntity(dto); -// role.setId(id); + public Role update(@RequestBody RoleDto dto, @PathVariable("id") Long id) { return service.edit(dto, id); } @@ -105,15 +100,5 @@ public class RoleController { return service.delete(id); } - /** - * 为角色添加权限 hasAuthority('SYSTEM:ROLE:AUTHED') - * - * @return RoleAuthority 新的角色权限 - */ - @PostMapping("/saveAuth/{id}") - @PreAuthorize("hasAuthority('system:role:create')") - public Boolean addAuthed(@PathVariable Long id, @RequestBody Set authorities) { - return service.saveRoleAuths(id,authorities); - } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/dto/MenuDto.java b/src/main/java/com/zsc/edu/gateway/modules/system/dto/MenuDto.java index d08af5b..aef1634 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/dto/MenuDto.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/dto/MenuDto.java @@ -1,6 +1,7 @@ package com.zsc.edu.gateway.modules.system.dto; import com.zsc.edu.gateway.modules.system.entity.Menu; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,7 +14,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class MenuDto { /** - * 子部门ID + * 父菜单ID */ private Long pid; /** @@ -23,6 +24,7 @@ public class MenuDto { /** * 名称 */ + @NotBlank(message = "名字不能为空") private String name; /** * 路径 @@ -52,8 +54,4 @@ public class MenuDto { * 权限 */ private String permissions; - /** - * 权限标识 - */ - private String authority = ""; } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/dto/RoleDto.java b/src/main/java/com/zsc/edu/gateway/modules/system/dto/RoleDto.java index e844a8c..d4f96c7 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/dto/RoleDto.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/dto/RoleDto.java @@ -35,7 +35,7 @@ public class RoleDto { /** * 权限列表 */ - public Set authorities; + public Set menuIds; } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/entity/RoleMenu.java b/src/main/java/com/zsc/edu/gateway/modules/system/entity/RoleMenu.java index 1fb71c9..43f1921 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/entity/RoleMenu.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/entity/RoleMenu.java @@ -27,6 +27,4 @@ public class RoleMenu implements Serializable { */ private Long menuId; - // @TableField(exist = false) -// private Set authorities; } \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/repo/MenuRepository.java b/src/main/java/com/zsc/edu/gateway/modules/system/repo/MenuRepository.java index 3c5c671..c068602 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/repo/MenuRepository.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/repo/MenuRepository.java @@ -16,7 +16,6 @@ public interface MenuRepository extends BaseMapper { List selectByRoleId(Long roleId); - List selectByUserId(Long userId, Menu.Type type); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/repo/RoleMenuRepository.java b/src/main/java/com/zsc/edu/gateway/modules/system/repo/RoleMenuRepository.java index 808817e..08393d6 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/repo/RoleMenuRepository.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/repo/RoleMenuRepository.java @@ -7,5 +7,4 @@ import com.zsc.edu.gateway.modules.system.entity.RoleMenu; * @author Yao */ public interface RoleMenuRepository extends BaseMapper { - } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/RoleService.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/RoleService.java index 42c6766..2c73598 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/RoleService.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/RoleService.java @@ -1,14 +1,10 @@ package com.zsc.edu.gateway.modules.system.service; -import com.zsc.edu.gateway.modules.system.dto.AuthorityCreateDto; import com.zsc.edu.gateway.modules.system.dto.RoleDto; -import com.zsc.edu.gateway.modules.system.entity.Authority; import com.zsc.edu.gateway.modules.system.entity.Role; import com.baomidou.mybatisplus.extension.service.IService; import com.zsc.edu.gateway.modules.system.vo.RoleVo; -import java.util.Set; - /** *

* 角色表 服务类 @@ -21,7 +17,7 @@ public interface RoleService extends IService { Role create(RoleDto roleDto); - Boolean edit(RoleDto roleDto, Long id); + Role edit(RoleDto roleDto, Long id); RoleVo detail(Long id); @@ -29,5 +25,4 @@ public interface RoleService extends IService { Boolean delete(Long id); - Boolean saveRoleAuths(Long roleId, Set authorities); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/MenuServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/MenuServiceImpl.java index de10cdd..770be53 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/MenuServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/MenuServiceImpl.java @@ -35,6 +35,12 @@ public class MenuServiceImpl extends ServiceImpl implement @Override public Menu create(MenuDto dto) { + if (baseMapper.selectList(new LambdaQueryWrapper

().eq(Menu::getName, dto.getName())) != null) { + throw new ConstraintException("该菜单名已存在!请检查输入表单是否出错!"); + } + if (baseMapper.selectList(new LambdaQueryWrapper().eq(Menu::getPermissions, dto.getPermissions())) != null) { + throw new ConstraintException("该权限已存在!请检查输入表单是否出错!"); + } Menu menu = mapper.toEntity(dto); baseMapper.insert(menu); return menu; diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/RoleServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/RoleServiceImpl.java index 97f722e..59a010f 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/RoleServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/RoleServiceImpl.java @@ -1,17 +1,12 @@ package com.zsc.edu.gateway.modules.system.service.impl; import com.zsc.edu.gateway.exception.ConstraintException; -import com.zsc.edu.gateway.modules.system.dto.AuthorityCreateDto; import com.zsc.edu.gateway.modules.system.dto.RoleDto; -import com.zsc.edu.gateway.modules.system.entity.Authority; -import com.zsc.edu.gateway.modules.system.entity.Role; -import com.zsc.edu.gateway.modules.system.entity.RoleAuthority; -import com.zsc.edu.gateway.modules.system.entity.UserRole; +import com.zsc.edu.gateway.modules.system.entity.*; import com.zsc.edu.gateway.modules.system.mapper.RoleMapper; -import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository; +import com.zsc.edu.gateway.modules.system.repo.RoleMenuRepository; import com.zsc.edu.gateway.modules.system.repo.RoleRepository; import com.zsc.edu.gateway.modules.system.repo.UserRolesRepository; -import com.zsc.edu.gateway.modules.system.service.RoleAuthService; import com.zsc.edu.gateway.modules.system.service.RoleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +14,7 @@ import com.zsc.edu.gateway.modules.system.vo.RoleVo; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import java.util.HashSet; -import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; /** @@ -40,8 +32,7 @@ public class RoleServiceImpl extends ServiceImpl implement private final RoleMapper mapper; private final UserRolesRepository urRepo; - private final RoleAuthService roleAuthService; - private final AuthorityRepository authorityRepository; + private final RoleMenuRepository roleMenuRepository; private final RoleRepository roleRepository; @Override @@ -50,9 +41,15 @@ public class RoleServiceImpl extends ServiceImpl implement if (existsByName) { throw new ConstraintException("name", dto.name, "角色已存在"); } - Role role = mapper.toEntity(dto); + Role role = new Role(); + role.setName(dto.getName()); + role.setRemark(dto.getRemark()); save(role); -// saveRoleAuths(role.getId(), role.getAuthorities()); + if (dto.getMenuIds() != null) { + roleMenuRepository.insert( + dto.getMenuIds().stream() + .map(menuId -> new RoleMenu(role.getId(), menuId)).collect(Collectors.toList())); + } return role; } @@ -69,46 +66,37 @@ public class RoleServiceImpl extends ServiceImpl implement if (hasUser) { throw new ConstraintException("存在与本角色绑定的用户,请先删除用户"); } - - // 删除角色权限关联关系 - roleAuthService.removeByRoleId(id); + roleMenuRepository.delete(new LambdaQueryWrapper().eq(RoleMenu::getRoleId, id)); return removeById(id); } @Override - public Boolean edit(RoleDto dto, Long id) { - Role existingRole = getById(id); - if (existingRole == null) { + public Role edit(RoleDto dto, Long id) { + Role selectyRole = getById(id); + if (selectyRole == null) { throw new ConstraintException("id", id.toString(), "角色不存在"); } - if (!Objects.equals(existingRole.getName(), dto.getName()) && + if (!Objects.equals(selectyRole.getName(), dto.getName()) && count(new LambdaQueryWrapper().eq(Role::getName, dto.getName())) > 0) { throw new ConstraintException("name", dto.getName(), "同名角色已存在"); } - mapper.convert(dto, existingRole); - if (existingRole.getAuthorities() != null) { - roleAuthService.remove(new LambdaQueryWrapper().eq(RoleAuthority::getRoleId, id)); - saveRoleAuths(id, dto.getAuthorities()); + Role role = new Role(); + role.setName(dto.getName()); + role.setRemark(dto.getRemark()); + updateById(role); + if (dto.getMenuIds() != null) { + roleMenuRepository.delete(new LambdaQueryWrapper().eq(RoleMenu::getRoleId, id)); + roleMenuRepository.insert( + dto.getMenuIds().stream() + .map(menuId -> new RoleMenu(id, menuId)).collect(Collectors.toList())); } - return updateById(existingRole); + return role; } @Override public RoleVo detail(Long id) { - // Role role = getById(id); -// // List roleAuthorities = roleAuthService.list(new LambdaQueryWrapper().eq(RoleAuthority::getRoleId, role.id)); -// role.authorities = authorityRepository.selectAuthoritiesByRoleId(role.id); return roleRepository.selectRoleById(id); } - @Override - public Boolean saveRoleAuths(Long roleId, Set authorities) { - // 保存角色关联权限 - List roleAuthorities = authorities.stream() - .map(authority -> - new RoleAuthority(roleId, authorityRepository.getAuthorityIdByName(authority.getName()))) - .collect(Collectors.toList()); - return roleAuthService.saveBatch(roleAuthorities); - } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/vo/RoleVo.java b/src/main/java/com/zsc/edu/gateway/modules/system/vo/RoleVo.java index 575b2dc..26b196c 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/vo/RoleVo.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/vo/RoleVo.java @@ -1,60 +1,65 @@ package com.zsc.edu.gateway.modules.system.vo; -import com.zsc.edu.gateway.modules.system.entity.Authority; +import com.zsc.edu.gateway.modules.system.entity.Menu; import lombok.Data; -import java.util.Date; -import java.util.List; - +import java.time.LocalDateTime; +import java.util.Set; /** - * @author lenovo + * @author zhuang */ @Data public class RoleVo { + /** * 自增主键 */ public Long id; + /** - * 角色名 + * 名称,唯一 */ - private String name; - /** - *级别 - */ - private Integer level; - /** - * 描述 - */ - private String description; - /** - * 数据权限 - */ - private String dataScope; - /** - * 创建人 - */ - private String createBy; - /** - * 更新人 - */ - private String updateBy; - /** - * 创建时间 - */ - private Date createTime; - /** - * 更新时间 - */ - private Date updateTime; + public String name; + /** * 启用状态 */ - private Boolean enabled; - /** - * 备注 - */ - private String remark; + private Boolean enabled = true; - private List authorities; + /** + * 部门ID(权限) + */ + public Long deptId; + + + /** + * 备注说明 + */ + public String roleRemark; + + /** + * 创建时间 + */ + public LocalDateTime createTime; + /* + * 创建人 + * + */ + public String createBy; + + /** + * 更新时间 + */ + public LocalDateTime updateTime; + /* + * 更新人 + * + * */ + public String updateBy; + + + /** + * 权限集合 + */ + public Set menus; } diff --git a/src/main/resources/mappers/system/RoleMapper.xml b/src/main/resources/mappers/system/RoleMapper.xml index 3791d52..d72a232 100644 --- a/src/main/resources/mappers/system/RoleMapper.xml +++ b/src/main/resources/mappers/system/RoleMapper.xml @@ -9,20 +9,23 @@ - - + + - +