diff --git a/common/src/main/java/com/canvas/web/enums/ResponseEnum.java b/common/src/main/java/com/canvas/web/enums/ResponseEnum.java index 46904e5..c473eea 100644 --- a/common/src/main/java/com/canvas/web/enums/ResponseEnum.java +++ b/common/src/main/java/com/canvas/web/enums/ResponseEnum.java @@ -77,7 +77,8 @@ public enum ResponseEnum { * 角色模块 **/ ROLE_ADD_ERROR_EXIST_NAME(20010, "新增角色失败,角色名称已存在"), - ROLE_ADD_ERROR_EXIST_AUTHORITY(20011, "新增角色失败,角色权限已存在"), + ROLE_ADD_ERROR_EXIST_AUTHORITY(20011, "新增角色失败,角色权限已存在"), + ROLE_ADD_ERROR_EXIST_ID(20015,"新增角色失败,角色id异常"), ROLE_UPDATE_ERROR_EXIST_NAME(20012, "修改角色失败,角色名称已存在"), ROLE_UPDATE_ERROR_EXIST_AUTHORITY(20013, "修改角色失败,角色权限已存在"), ROLE_UPDATE_ERROR(20014, "修改角色失败"), diff --git a/common/src/main/java/com/canvas/web/utils/CacheKey.java b/common/src/main/java/com/canvas/web/utils/CacheKey.java index b3aeaa0..9a0e14a 100644 --- a/common/src/main/java/com/canvas/web/utils/CacheKey.java +++ b/common/src/main/java/com/canvas/web/utils/CacheKey.java @@ -23,7 +23,7 @@ public interface CacheKey { /** * 数据 */ - String DATE_USER = "data::user:"; + String DATA_USER = "data::user:"; /** * 菜单 */ diff --git a/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java b/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java index 925ac6b..d287c12 100644 --- a/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java +++ b/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java @@ -64,7 +64,7 @@ public class AuthorizationController { @ApiOperation("登录授权") @AnonymousPostMapping(value = "/login") - public ResponseEntity login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { + public Response login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { // 密码解密 String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); // 查询验证码 @@ -83,29 +83,29 @@ public class AuthorizationController { // 生成令牌 String token = tokenProvider.createToken(authentication); final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal(); -// // 保存在线信息 -// onlineUserService.save(jwtUserDto, token, request); + // 保存在线信息 + onlineUserService.save(jwtUserDto, token, request); // 返回 token 与 用户信息 Map authInfo = new HashMap(2) {{ put("token", properties.getTokenStartWith() + token); put("user", jwtUserDto); }}; -// if (loginProperties.isSingleLogin()) { -// //踢掉之前已经登录的token -// onlineUserService.checkLoginOnUser(authUser.getUsername(), token); -// } - return ResponseEntity.ok(authInfo); + if (loginProperties.isSingleLogin()) { + //踢掉之前已经登录的token + onlineUserService.checkLoginOnUser(authUser.getUsername(), token); + } + return Response.success(authInfo); } @ApiOperation("获取用户信息") @GetMapping(value = "/info") - public ResponseEntity getUserInfo() { - return ResponseEntity.ok(SecurityUtils.getCurrentUser()); + public Response getUserInfo() { + return Response.success(SecurityUtils.getCurrentUser()); } @ApiOperation("获取验证码") @AnonymousGetMapping(value = "/code") - public ResponseEntity getCode() { + public Response getCode() { // 获取运算的结果 Captcha captcha = loginProperties.getCaptcha(); String uuid = properties.getCodeKey() + IdUtil.simpleUUID(); @@ -121,22 +121,22 @@ public class AuthorizationController { put("img", captcha.toBase64()); put("uuid", uuid); }}; - return ResponseEntity.ok(imgResult); + return Response.success(imgResult); } @ApiOperation("退出登录") @AnonymousDeleteMapping(value = "/logout") - public ResponseEntity logout(HttpServletRequest request) { + public Response logout(HttpServletRequest request) { onlineUserService.logout(tokenProvider.getToken(request)); - return new ResponseEntity<>(HttpStatus.OK); + return Response.success(ResponseEnum.SUCCESS); } @ApiOperation("短信验证码") @AnonymousPostMapping(value = "/msg") - public ResponseEntity sendXMsg(@Validated @RequestBody MsgDto msgDto) { + public Response sendXMsg(@Validated @RequestBody MsgDto msgDto) { UserDto userDto = userService.findByPhone(msgDto.getPhone()); if (userDto==null){ - return new ResponseEntity<>(HttpStatus.NO_CONTENT); + return new Response<>(HttpStatus.NO_CONTENT); } //加载短信配置文件 @@ -155,7 +155,7 @@ public class AuthorizationController { put("uuid", uuid); }}; String response = submail.xsend(); - return ResponseEntity.ok(msgResult); + return Response.success(msgResult); } @ApiOperation("客户端修改密码") diff --git a/system/src/main/java/com/canvas/web/modules/security/service/OnlineUserService.java b/system/src/main/java/com/canvas/web/modules/security/service/OnlineUserService.java index 493ba67..23ff5c6 100644 --- a/system/src/main/java/com/canvas/web/modules/security/service/OnlineUserService.java +++ b/system/src/main/java/com/canvas/web/modules/security/service/OnlineUserService.java @@ -29,13 +29,13 @@ public class OnlineUserService { public void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request) { - //String dept = jwtUserDto.getUser().getName().getDept(); + String org = jwtUserDto.getUser().getOrg().getName(); String ip = StringUtils.getIp(request); String browser = StringUtils.getBrowser(request); String address = StringUtils.getCityInfo(ip); OnlineUserDto onlineUserDto = null; try { - //onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); + onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), jwtUserDto.getUser().getPhone(),jwtUserDto.getUser().getNickName(), org, browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); } catch (Exception e) { log.error(e.getMessage(),e); } @@ -108,7 +108,7 @@ public class OnlineUserService { for (OnlineUserDto user : all) { Map map = new LinkedHashMap<>(); map.put("用户名", user.getUserName()); - map.put("部门", user.getDept()); + map.put("机构", user.getOrg()); map.put("登录IP", user.getIp()); map.put("登录地点", user.getAddress()); map.put("浏览器", user.getBrowser()); diff --git a/system/src/main/java/com/canvas/web/modules/security/service/dto/OnlineUserDto.java b/system/src/main/java/com/canvas/web/modules/security/service/dto/OnlineUserDto.java index 0af1e5e..48a934f 100644 --- a/system/src/main/java/com/canvas/web/modules/security/service/dto/OnlineUserDto.java +++ b/system/src/main/java/com/canvas/web/modules/security/service/dto/OnlineUserDto.java @@ -17,6 +17,11 @@ public class OnlineUserDto { */ private String userName; + /** + * 手机号 + * */ + private String phone; + /** * 昵称 */ @@ -25,7 +30,7 @@ public class OnlineUserDto { /** * 岗位 */ - private String dept; + private String org; /** * 浏览器 diff --git a/system/src/main/java/com/canvas/web/modules/system/controller/MenuController.java b/system/src/main/java/com/canvas/web/modules/system/controller/MenuController.java index d407d43..0dd6a29 100644 --- a/system/src/main/java/com/canvas/web/modules/system/controller/MenuController.java +++ b/system/src/main/java/com/canvas/web/modules/system/controller/MenuController.java @@ -4,8 +4,10 @@ package com.canvas.web.modules.system.controller; import com.canvas.web.annotation.rest.AnonymousGetMapping; import com.canvas.web.enums.ResponseEnum; import com.canvas.web.modules.system.service.MenuService; +import com.canvas.web.modules.system.service.dto.MenuDto; import com.canvas.web.modules.system.service.mapstruct.MenuMapper; import com.canvas.web.utils.Response; +import com.canvas.web.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -15,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequiredArgsConstructor @Api(tags = "菜单管理") @@ -32,6 +36,14 @@ public class MenuController { return Response.success(menuService.getMenus(pid)); } + @GetMapping("/build") + @ApiOperation("获取前端所需菜单") + public Response buildMenus(){ + List menuDtoList =menuService.findByUser(SecurityUtils.getCurrentUserId()); + List menuDtos =menuService.buildTree(menuDtoList); + return Response.success(menuService.buildMenus(menuDtos)); + } + @ApiOperation("新增权限-下拉列表-获取所有菜单") @AnonymousGetMapping("/dropdown/menu") public Response queryDropDow(){ diff --git a/system/src/main/java/com/canvas/web/modules/system/controller/RoleController.java b/system/src/main/java/com/canvas/web/modules/system/controller/RoleController.java new file mode 100644 index 0000000..21fec27 --- /dev/null +++ b/system/src/main/java/com/canvas/web/modules/system/controller/RoleController.java @@ -0,0 +1,71 @@ +package com.canvas.web.modules.system.controller; + +import com.canvas.web.annotation.rest.AnonymousGetMapping; +import com.canvas.web.annotation.rest.AnonymousPostMapping; +import com.canvas.web.enums.ResponseEnum; +import com.canvas.web.exception.BaseException; +import com.canvas.web.modules.system.service.RoleService; +import com.canvas.web.modules.system.service.dto.RoleDto; +import com.canvas.web.modules.system.service.dto.RoleQueryCriteria; +import com.canvas.web.modules.system.service.dto.RoleSmallDto; +import com.canvas.web.modules.system.service.mapstruct.RoleMapper; +import com.canvas.web.utils.Response; +import com.canvas.web.utils.SecurityUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@Api(tags = "角色管理") +@RequestMapping("/api/roles") +public class RoleController { + + private final RoleService roleService; + + private static final String ENTITY_NAME="role"; + + private final RoleMapper roleMapper; + + @ApiOperation("新增角色") + @AnonymousPostMapping("/create") + public Response create(@Validated @RequestBody RoleDto roleDto){ + if (roleDto.getId() !=null){ + throw new BaseException("A new cannot already have an ID", ResponseEnum.ROLE_ADD_ERROR_EXIST_ID.getMessage()); + } + //TODO:权限测试 + // getLevels(roleDto.getLevel()); + roleService.create(roleMapper.toEntity(roleDto)); + return Response.success(ResponseEnum.ADD_SUCCESS); + + } + + + @ApiOperation("查询角色") + @AnonymousGetMapping("/list") + public Response queryAllRole(RoleQueryCriteria criteria, Pageable pageable){ + return new Response<>(roleService.queryAll(criteria,pageable)); + } + + + + private int getLevels(Integer level){ + List levels = roleService.findByUsersId(SecurityUtils.getCurrentUserId()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if(level != null){ + if(level < min){ + throw new BaseException("权限不足,你的角色级别:" + min + ",低于操作的角色级别:" + level); + } + } + return min; + } +} diff --git a/system/src/main/java/com/canvas/web/modules/system/domain/Role.java b/system/src/main/java/com/canvas/web/modules/system/domain/Role.java index 8aa2df4..04643db 100644 --- a/system/src/main/java/com/canvas/web/modules/system/domain/Role.java +++ b/system/src/main/java/com/canvas/web/modules/system/domain/Role.java @@ -40,6 +40,7 @@ public class Role extends BaseEntity implements Serializable { @ApiModelProperty(value = "菜单", hidden = true) private Set menus; + @ManyToMany @JoinTable(name = "sys_roles_org", joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "id")}, diff --git a/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuMetaVo.java b/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuMetaVo.java new file mode 100644 index 0000000..f748cb4 --- /dev/null +++ b/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuMetaVo.java @@ -0,0 +1,18 @@ +package com.canvas.web.modules.system.domain.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class MenuMetaVo implements Serializable { + + private String title; + + private String icon; + + private Boolean noCache; +} diff --git a/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuVo.java b/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuVo.java new file mode 100644 index 0000000..220b107 --- /dev/null +++ b/system/src/main/java/com/canvas/web/modules/system/domain/vo/MenuVo.java @@ -0,0 +1,28 @@ +package com.canvas.web.modules.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class MenuVo implements Serializable { + + private String name; + + private String path; + + private Boolean hidden; + + private String redirect; + + private String component; + + private Boolean alwaysShow; + + private MenuMetaVo meta; + + private List children; +} diff --git a/system/src/main/java/com/canvas/web/modules/system/repository/MenuRepository.java b/system/src/main/java/com/canvas/web/modules/system/repository/MenuRepository.java index 8aa4555..2516ed5 100644 --- a/system/src/main/java/com/canvas/web/modules/system/repository/MenuRepository.java +++ b/system/src/main/java/com/canvas/web/modules/system/repository/MenuRepository.java @@ -34,8 +34,8 @@ public interface MenuRepository extends JpaRepository, JpaSpecificat List findByPidIsNull(); @Query(value = "SELECT m.* FROM sys_menu m INNER JOIN sys_roles_menus r ON m.menu_id = r.menu_id WHERE " + - " r.role_id IN ?1 AND type != ?2 order by m.menu_sort asc",nativeQuery = true) - LinkedHashSet findByRoleIdsAndTypeNotAndShowPosition(Set roleIds, int type); + " r.role_id IN ?1 AND type != ?2 AND m.show_position = ?3 order by m.menu_sort asc",nativeQuery = true) + LinkedHashSet findByRoleIdsAndTypeNotAndShowPosition(Set roleIds, int type,int showPosition); //更新节点数目 diff --git a/system/src/main/java/com/canvas/web/modules/system/repository/RoleRepository.java b/system/src/main/java/com/canvas/web/modules/system/repository/RoleRepository.java index 7b1d086..9e4348c 100644 --- a/system/src/main/java/com/canvas/web/modules/system/repository/RoleRepository.java +++ b/system/src/main/java/com/canvas/web/modules/system/repository/RoleRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import java.util.List; import java.util.Set; public interface RoleRepository extends JpaRepository, JpaSpecificationExecutor { @@ -27,4 +28,10 @@ public interface RoleRepository extends JpaRepository, JpaSpecificat @Modifying @Query(value = "delete from sys_roles_menus where menu_id = ?1",nativeQuery = true) void untiedMenu(Long id); + + + //根据菜单id查询 + @Query(value = "SELECT r.* FROM sys_role r, sys_roles_menus m WHERE " + + "r.role_id = m.role_id AND m.menu_id in ?1",nativeQuery = true) + List findInMenuId(List menuIds); } diff --git a/system/src/main/java/com/canvas/web/modules/system/service/MenuService.java b/system/src/main/java/com/canvas/web/modules/system/service/MenuService.java index 37394f4..2f7f617 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/MenuService.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/MenuService.java @@ -27,6 +27,8 @@ public interface MenuService { //构建菜单树 List buildTree(List menuDtos); + Object buildMenus(List menuDtos); + //根据id查询 Menu findOne(Long id); diff --git a/system/src/main/java/com/canvas/web/modules/system/service/RoleService.java b/system/src/main/java/com/canvas/web/modules/system/service/RoleService.java index 1efcacf..8d61a6e 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/RoleService.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/RoleService.java @@ -24,8 +24,6 @@ public interface RoleService { //根据角色查询角色级别 Integer findByRoles(Set roles); - //根据id 查询菜单 - List findInMenuId(ArrayList longs); //创建角色 void create(Role resources); @@ -47,4 +45,7 @@ public interface RoleService { //带查询条件查询全部数据 List queryAll(RoleQueryCriteria criteria); + + //编辑 + void update(RoleDto roleDto); } diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/DeptDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/DeptDto.java new file mode 100644 index 0000000..32db768 --- /dev/null +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/DeptDto.java @@ -0,0 +1,46 @@ +package com.canvas.web.modules.system.service.dto; + +import com.canvas.web.base.BaseDTO; +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.io.Serializable; +import java.util.Objects; + +public class DeptDto extends BaseDTO implements Serializable { + + private Long id; + + private String name; + + private Boolean enabled; + + private Integer deptSort; + + public Boolean getLeaf() { + return subCount <= 0; + } + + public String getLabel() { + return name; + } + + private Integer subCount; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DeptDto deptDto = (DeptDto) o; + return Objects.equals(id, deptDto.id) && + Objects.equals(name, deptDto.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } +} diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/MenuDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/MenuDto.java index 568d826..f5cc290 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/dto/MenuDto.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/MenuDto.java @@ -15,7 +15,7 @@ public class MenuDto extends BaseDTO implements Serializable { private Long id; - // private List children; + private List children; private Integer type; @@ -23,7 +23,7 @@ public class MenuDto extends BaseDTO implements Serializable { private String title; - // private Integer menuSort; + private Integer menuSort; private String path; @@ -44,13 +44,13 @@ public class MenuDto extends BaseDTO implements Serializable { private String icon; -// public Boolean getHasChildren() { -// return subCount > 0; -// } -// -// public Boolean getLeaf() { -// return subCount <= 0; -// } + public Boolean getHasChildren() { + return subCount > 0; + } + + public Boolean getLeaf() { + return subCount <= 0; + } public String getLabel() { return title; diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/DeptSmallDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/OrgSmallDto.java similarity index 75% rename from system/src/main/java/com/canvas/web/modules/system/service/dto/DeptSmallDto.java rename to system/src/main/java/com/canvas/web/modules/system/service/dto/OrgSmallDto.java index e0f7b96..0b18daf 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/dto/DeptSmallDto.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/OrgSmallDto.java @@ -5,7 +5,7 @@ import lombok.Data; import java.io.Serializable; @Data -public class DeptSmallDto implements Serializable { +public class OrgSmallDto implements Serializable { private Long id; diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/RoleDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/RoleDto.java index feaf863..9ae4648 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/dto/RoleDto.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/RoleDto.java @@ -1,9 +1,12 @@ package com.canvas.web.modules.system.service.dto; +import com.alibaba.fastjson.annotation.JSONField; import com.canvas.web.base.BaseDTO; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.util.Objects; import java.util.Set; @@ -16,10 +19,12 @@ public class RoleDto extends BaseDTO implements Serializable { private Set menus; - // private Set depts; + private Set orgDtos; + @NotBlank(message = "角色名称不能为空") private String name; + @JsonProperty("data_scope") private String dataScope; private Integer level; diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java index dafdde3..0cb2b1c 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java @@ -18,11 +18,7 @@ public class UserDto extends BaseDTO implements Serializable { private Set roles; -// private Set jobs; -// -// private DeptSmallDto dept; - - private Long deptId; + private OrgSmallDto org; private String username; diff --git a/system/src/main/java/com/canvas/web/modules/system/service/impl/MenuServiceImpl.java b/system/src/main/java/com/canvas/web/modules/system/service/impl/MenuServiceImpl.java index a9a7ba3..499d3ec 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/impl/MenuServiceImpl.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/impl/MenuServiceImpl.java @@ -1,11 +1,14 @@ package com.canvas.web.modules.system.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.canvas.web.enums.ResponseEnum; import com.canvas.web.exception.BaseException; import com.canvas.web.modules.system.domain.Menu; import com.canvas.web.modules.system.domain.Role; import com.canvas.web.modules.system.domain.User; +import com.canvas.web.modules.system.domain.vo.MenuMetaVo; +import com.canvas.web.modules.system.domain.vo.MenuVo; import com.canvas.web.modules.system.repository.MenuRepository; import com.canvas.web.modules.system.repository.UserRepository; import com.canvas.web.modules.system.service.MenuService; @@ -13,6 +16,7 @@ import com.canvas.web.modules.system.service.RoleService; import com.canvas.web.modules.system.service.dto.MenuDto; import com.canvas.web.modules.system.service.dto.MenuQueryCriteria; import com.canvas.web.modules.system.service.dto.MenuSmallDto; +import com.canvas.web.modules.system.service.dto.RoleSmallDto; import com.canvas.web.modules.system.service.mapstruct.MenuMapper; import com.canvas.web.modules.system.service.mapstruct.MenuSmallMapper; import com.canvas.web.utils.QueryHelp; @@ -27,9 +31,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @@ -67,11 +69,11 @@ public class MenuServiceImpl implements MenuService { if (resources.getPid().equals(0L)) { resources.setPid(null); } - if (resources.getIFrame()) { - String http = "http://", https = "https://"; - if (!resources.getPath().toLowerCase().startsWith(http)||resources.getPath().toLowerCase().startsWith(https)); - throw new BaseException("外链必须以://或者https://"); - } +// if (resources.getIFrame()) { +// String http = "http://", https = "https://"; +// if (!resources.getPath().toLowerCase().startsWith(http)||resources.getPath().toLowerCase().startsWith(https)); +// throw new BaseException("外链必须以://或者https://"); +// } menuRepository.save(resources); resources.setSubCount(0); updateSubCnt(resources.getId()); @@ -152,12 +154,91 @@ public class MenuServiceImpl implements MenuService { @Override public Set getChildMenus(List menuList, Set menuSet) { - return null; + for (Menu menu : menuList){ + menuSet.add(menu); + List menus =menuRepository.findByPid(menu.getId()); + if (menus!=null && menus.size()!=0){ + getChildMenus(menus,menuSet); + } + } + return menuSet; } @Override public List buildTree(List menuDtos) { - return null; + List trees =new ArrayList<>(); + Set ids =new HashSet<>(); + for (MenuDto menuDto :menuDtos){ + if (menuDto.getPid() == null){ + trees.add(menuDto); + } + for (MenuDto it:menuDtos){ + if (menuDto.getId().equals(it.getPid())){ + if (menuDto.getChildren() == null){ + menuDto.setChildren(new ArrayList<>()); + } + menuDto.getChildren().add(it); + ids.add(it.getId()); + } + } + } + if (trees.size() == 0){ + trees =menuDtos.stream().filter(s->!ids.contains(s.getId())).collect(Collectors.toList()); + } + return trees; + } + + @Override + public List buildMenus(List menuDtos) { + List list=new ArrayList<>(); + menuDtos.forEach(menuDTO -> { + if (menuDTO!=null){ + List menuDtoList = menuDTO.getChildren(); + MenuVo menuVo = new MenuVo(); + menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponentName()) ? menuDTO.getComponentName() : menuDTO.getTitle()); + // 一级目录需要加斜杠,不然会报警告 + menuVo.setPath(menuDTO.getPid() == null ? "/" + menuDTO.getPath() :menuDTO.getPath()); + menuVo.setHidden(menuDTO.getHidden()); + // 如果不是外链 + if(!menuDTO.getIFrame()){ + if(menuDTO.getPid() == null){ + menuVo.setComponent(StringUtils.isEmpty(menuDTO.getComponent())?"Layout":menuDTO.getComponent()); + // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 + }else if(menuDTO.getType() == 0){ + menuVo.setComponent(StringUtils.isEmpty(menuDTO.getComponent())?"ParentView":menuDTO.getComponent()); + }else if(StringUtils.isNoneBlank(menuDTO.getComponent())){ + menuVo.setComponent(menuDTO.getComponent()); + } + } + menuVo.setMeta(new MenuMetaVo(menuDTO.getTitle(),menuDTO.getIcon(),!menuDTO.getCache())); + if(CollectionUtil.isNotEmpty(menuDtoList)){ + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenus(menuDtoList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if(menuDTO.getPid() == null){ + MenuVo menuVo1 = new MenuVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 + if(!menuDTO.getIFrame()){ + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menuDTO.getPath()); + } + menuVo.setName(null); + menuVo.setMeta(null); + menuVo.setComponent("Layout"); + List list1 = new ArrayList<>(); + list1.add(menuVo1); + menuVo.setChildren(list1); + } + list.add(menuVo); + } + } + ); + return list; } @Override @@ -186,7 +267,10 @@ public class MenuServiceImpl implements MenuService { @Override public List findByUser(Long currentUserId) { - return null; + List roleSmallDtos =roleService.findByUsersId(currentUserId); + Set roleIds = roleSmallDtos.stream().map(RoleSmallDto::getId).collect(Collectors.toSet()); + LinkedHashSet menus =menuRepository.findByRoleIdsAndTypeNotAndShowPosition(roleIds,2,1); + return menus.stream().map(menuMapper::toDto).collect(Collectors.toList()); } @Override diff --git a/system/src/main/java/com/canvas/web/modules/system/service/impl/RoleServiceImpl.java b/system/src/main/java/com/canvas/web/modules/system/service/impl/RoleServiceImpl.java index b2f1061..b537d45 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/impl/RoleServiceImpl.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/impl/RoleServiceImpl.java @@ -1,7 +1,12 @@ package com.canvas.web.modules.system.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import com.canvas.web.enums.ResponseEnum; +import com.canvas.web.exception.BaseException; import com.canvas.web.modules.security.service.UserCacheClean; +import com.canvas.web.modules.system.domain.Menu; import com.canvas.web.modules.system.domain.Role; +import com.canvas.web.modules.system.domain.User; import com.canvas.web.modules.system.repository.RoleRepository; import com.canvas.web.modules.system.repository.UserRepository; import com.canvas.web.modules.system.service.RoleService; @@ -11,17 +16,21 @@ import com.canvas.web.modules.system.service.dto.RoleSmallDto; import com.canvas.web.modules.system.service.dto.UserDto; import com.canvas.web.modules.system.service.mapstruct.RoleMapper; import com.canvas.web.modules.system.service.mapstruct.RoleSmallMapper; -import com.canvas.web.utils.QueryHelp; +import com.canvas.web.utils.*; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheConfig; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -30,18 +39,30 @@ public class RoleServiceImpl implements RoleService { private final RoleRepository roleRepository; private final RoleMapper roleMapper; + private final RedisUtils redisUtils; private final RoleSmallMapper roleSmallMapper; private final UserRepository userRepository; private final UserCacheClean userCacheClean; @Override public List mapToGrantedAuthorities(UserDto user) { - return null; + Set permissions= new HashSet<>(); + //如果是管理员直接返回 + if (user.getIsAdmin()){ + permissions.add("admin"); + return permissions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); + } + Set roles =roleRepository.findByUserId(user.getId()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()) + .filter(menu -> StringUtils.isNotBlank(menu.getPermission())) + .map(Menu::getPermission).collect(Collectors.toSet()); + return permissions.stream().map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); } @Override public List findByUsersId(Long id) { - return null; + return roleSmallMapper.toDto(new ArrayList<>(roleRepository.findByUserId(id))); } @Override @@ -50,20 +71,26 @@ public class RoleServiceImpl implements RoleService { } @Override - public List findInMenuId(ArrayList longs) { - return null; + public List findInMenuId(List menuIds) { + return roleRepository.findInMenuId(menuIds); } - @Override public void create(Role resources) { - + if (roleRepository.findByName(resources.getName()) != null) { + throw new BaseException("username", ResponseEnum.ROLE_ADD_ERROR_EXIST_NAME.getMessage()); + } + roleRepository.save(resources); } @Override public void delete(Set ids) { - + for (Long id : ids) { + // 更新相关缓存 + delCaches(id, null); + } + roleRepository.deleteAllByIdIn(ids); } @Override @@ -71,24 +98,58 @@ public class RoleServiceImpl implements RoleService { } - @Override - public List findInMenuId(List menuIds) { - return null; - } @Override public List queryAll() { - Sort sort=Sort.by(Sort.Direction.ASC,"level"); + Sort sort = Sort.by(Sort.Direction.ASC, "level"); return roleMapper.toDto(roleRepository.findAll(sort)); } @Override public Object queryAll(RoleQueryCriteria criteria, Pageable pageable) { - return null; + Page page = roleRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); + return PageUtil.toPage(page.map(roleMapper::toDto)); } @Override public List queryAll(RoleQueryCriteria criteria) { return roleMapper.toDto(roleRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder))); } + + @Override + public void update(RoleDto roleDto) { + Role role = roleRepository.findById(roleDto.getId()).orElseGet(Role::new); + ValidationUtil.isNull(role.getId(), "Role", "id", roleDto.getId()); + + Role role1 = roleRepository.findByName(roleDto.getName()); + if (role1 != null && !role1.getId().equals(role.getId())) { + throw new BaseException("username", roleDto.getName()); + } + + //传输DTO转换实体 + Role role2 = roleMapper.toEntity(roleDto); + + role.setName(role2.getName()); + role.setDescription(role2.getDescription()); + role.setDataScope(role2.getDataScope()); + role.setLevel(role2.getLevel()); + role.setOrg(role2.getOrg()); + roleRepository.save(role); + // 更新相关缓存 + delCaches(role.getId(), null); + } + + + //清理缓存 + public void delCaches(Long id, List users) { + users = CollectionUtil.isEmpty(users) ? userRepository.findByRoleId(id) : users; + if (CollectionUtil.isNotEmpty(users)) { + users.forEach(item -> userCacheClean.cleanUserCache(item.getUsername())); + Set userIds = users.stream().map(User::getId).collect(Collectors.toSet()); + redisUtils.delByKeys(CacheKey.DATA_USER, userIds); + redisUtils.delByKeys(CacheKey.MENU_USER, userIds); + redisUtils.delByKeys(CacheKey.ROLE_AUTH, userIds); + } + redisUtils.del(CacheKey.ROLE_ID + id); + } } diff --git a/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java b/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java index 568cacb..81722d5 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java @@ -71,7 +71,7 @@ public class UserServiceImpl implements UserService{ //需求手机号就是用户名,所以根据此处username 实际是手机号 @Override public UserDto findByName(String userName) { - User user = userRepository.findByPhone(userName); + User user = userRepository.findByUsername(userName); if (user == null) { throw new EntityNotFoundException(User.class, "name", userName); } else {