dao/src/main/java/com/sandu/ximon/dao/domain/RoleDetail.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.sandu.ximon.dao.domain; import lombok.Data; import java.util.List; @Data public class RoleDetail extends Role { private List<Long> menuIdList; } dao/src/main/java/com/sandu/ximon/dao/mapper/RoleMapper.java
@@ -2,7 +2,10 @@ import com.sandu.ximon.dao.domain.Role; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sandu.ximon.dao.domain.RoleDetail; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @Entity com.sandu.ximon.dao.domain.Role @@ -10,6 +13,7 @@ @Mapper public interface RoleMapper extends BaseMapper<Role> { List<RoleDetail> listRole(List<Long> roleIdList); } dao/src/main/resources/mapper/RoleMapper.xml
@@ -5,18 +5,35 @@ <mapper namespace="com.sandu.ximon.dao.mapper.RoleMapper"> <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.Role"> <id property="id" column="id" jdbcType="BIGINT"/> <result property="name" column="name" jdbcType="VARCHAR"/> <result property="remark" column="remark" jdbcType="VARCHAR"/> <result property="level" column="level" jdbcType="INTEGER"/> <result property="permission" column="permission" jdbcType="VARCHAR"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> <id property="id" column="id" jdbcType="BIGINT"/> <result property="name" column="name" jdbcType="VARCHAR"/> <result property="remark" column="remark" jdbcType="VARCHAR"/> <result property="level" column="level" jdbcType="INTEGER"/> <result property="permission" column="permission" jdbcType="VARCHAR"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> </resultMap> <sql id="Base_Column_List"> id,name,remark, level,permission,create_time, update_time </sql> <resultMap id="RoleDetail" type="com.sandu.ximon.dao.domain.RoleDetail" extends="BaseResultMap"> <collection property="menuIdList" columnPrefix="menu_" ofType="java.lang.Long"> <constructor> <arg column="menu_id" javaType="long"/> </constructor> </collection> </resultMap> <select id="listRole" resultMap="RoleDetail"> SELECT t1.*, t2.menu_id AS menu_menu_id FROM role t1 LEFT JOIN role_menu_relation t2 ON t1.id = t2.role_id <where> t1.id IN <foreach collection="roleIdList" separator="," item="roleId" open="(" close=")"> #{roleId} </foreach> </where> </select> </mapper> sandu-common/src/main/java/com/sandu/common/enums/RoleLevelStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.sandu.common.enums; /** * @author chenjiantian */ public enum RoleLevelStatus { /** * */ SUPER(1, "è¶ çº§ç®¡çå"), COMMON(2, "æ®é管çå"), ; private final Integer code; private final String message; RoleLevelStatus(Integer code, String message) { this.code = code; this.message = message; } public Integer getCode() { return code; } public String getMessage() { return message; } } ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.sandu.common.domain.ResponseVO; import com.sandu.common.enums.AdminStatusStatus; import com.sandu.common.enums.ResponseStatusEnums; import com.sandu.common.execption.BusinessException; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.security.LoginUserInfo; import com.sandu.common.security.annotation.AnonymousAccess; @@ -16,8 +16,9 @@ import com.sandu.common.security.token.TokenProvider; import com.sandu.common.util.IpUtil; import com.sandu.common.util.ResponseUtil; import com.sandu.ximon.admin.dto.AdminJwtUser; import com.sandu.ximon.admin.param.AdminLoginParam; import com.sandu.ximon.admin.param.AdminParam; import com.sandu.ximon.admin.param.PwdParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.admin.service.AdminService; import com.sandu.ximon.admin.service.MenuService; @@ -28,21 +29,22 @@ import com.sandu.ximon.dao.enums.AdministratorEnums; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.Collections; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author hupeng * @date 2018-11-23 * ææãæ ¹æ®tokenè·åç¨æ·è¯¦ç»ä¿¡æ¯ * @author chenjiantian * @date 2022/1/18 16:04 * 管çåæ§å¶ç±» */ @Slf4j @RestController @@ -68,10 +70,11 @@ if (!passwordEncoder.matches(loginParam.getPassword(), admin.getPassword())) { return ResponseUtil.error(ResponseStatusEnums.BAD_CREDENTIALS.getCode(), ResponseStatusEnums.BAD_CREDENTIALS.getMessage()); } UserDetails userJwtUser = new AdminJwtUser(admin, roleService.mapToGrantedAuthorities(admin.getId())); if (!userJwtUser.isEnabled()) { if (AdminStatusStatus.DISABLE.getCode().equals(admin.getStatus())) { return ResponseUtil.error(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage()); } Collection<GrantedAuthority> grantedAuthorities = roleService.mapToGrantedAuthorities(admin.getId()); LoginUserInfo loginUserInfo = new LoginUserInfo(); loginUserInfo.setUserId(admin.getId()); @@ -80,8 +83,7 @@ loginUserInfo.setStatus(admin.getStatus()); loginUserInfo.setIp(IpUtil.getRealIp()); loginUserInfo.setAdministratorType(AdministratorEnums.ADMIN.getCode()); loginUserInfo.setPermission("tenant"); loginUserInfo.setPermission(grantedAuthorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(","))); // çæä»¤ç String token = tokenProvider.createToken(loginUserInfo); @@ -105,7 +107,7 @@ Long userId = SecurityUtils.getUserId(); Admin admin = adminService.getById(userId); List<Role> roles = roleService.listByAdminId(admin.getId()); if(CollectionUtil.isEmpty(roles)){ if (CollectionUtil.isEmpty(roles)) { return ResponseUtil.fail("ç¨æ·æ²¡æè§è²ï¼æ æ³è·åæ°æ®"); } List<Menu> menus = menuService.listByRoleIds(roles.stream().map(Role::getId).collect(Collectors.toList())); @@ -131,33 +133,43 @@ return ResponseUtil.successPage(list); } // @PreAuthorize("@el.check('admin:add')") // @PostMapping("/register") // public ResponseVO<Object> register(@Validated @RequestBody AdminParam adminParam) { // Admin admin = adminService.register(adminParam); // return ResponseUtil.success(admin); // } @PostMapping("/register") public ResponseVO<Object> register(@Validated @RequestBody AdminParam param) { boolean result = adminService.register(param); if (result) { return ResponseUtil.success("注åç¨æ·æå"); } else { return ResponseUtil.fail("注åç¨æ·å¤±è´¥"); } } // /** // * ä¿®æ¹ç®¡çåä¿¡æ¯ // * // * @param resources // * @return // */ // @PutMapping("/{id}") // @PreAuthorize("@el.check('admin:edit')") // public ResponseVO<Object> update(@RequestBody AdminParam resources, @PathVariable Long id) { // checkLevel(id); // adminService.updateAdmin(id, resources); // return ResponseUtil.success(null); // } // // @PutMapping("/updatePassword") // public ResponseVO<Object> updatePassword(@Validated @RequestBody PwdParam param) { // Long userId = SecurityUtils.getUserId(); // adminService.updatePassword(userId, param); // return ResponseUtil.success(null); // } /** * ä¿®æ¹ç®¡çåä¿¡æ¯ */ @PostMapping("/update/{adminId}") public ResponseVO<Object> updateAdmin(@RequestBody AdminParam param, @PathVariable Long adminId) { boolean result = adminService.updateAdmin(adminId, param); if (result) { return ResponseUtil.success("ä¿®æ¹æå"); } else { return ResponseUtil.fail("ä¿®æ¹å¤±è´¥"); } } /** * ä¿®æ¹æçå¯ç */ @PutMapping("/updateMyPassword") public ResponseVO<Object> updateMyPassword(@Validated @RequestBody PwdParam param) { boolean result = adminService.updateMyPassword(param); if (result) { return ResponseUtil.success("ä¿®æ¹æå"); } else { return ResponseUtil.fail("ä¿®æ¹å¤±è´¥"); } } // @PutMapping("/updateStatus/{id}") // public ResponseVO<Object> updateStatus(@PathVariable Long id, @RequestParam(value = "status") Integer status) { @@ -169,13 +181,15 @@ // return ResponseUtil.success(null); // } // @DeleteMapping("/{id}") // @PreAuthorize("@el.check('admin:del')") // public ResponseVO<Object> delete(@PathVariable Long id) { // checkLevel(id); // adminService.deleteAdmin(id); // return ResponseUtil.success(null); // } @PostMapping("/del/{adminId}") public ResponseVO<Object> deleteAdmin(@PathVariable Long adminId) { boolean result = adminService.deleteAdmin(adminId); if (result) { return ResponseUtil.success("ä¿®æ¹æå"); } else { return ResponseUtil.fail("ä¿®æ¹å¤±è´¥"); } } // /** // * ç»ç®¡çååé è§è² @@ -191,28 +205,6 @@ // return ResponseUtil.success(""); // } /** * 妿å½åç¨æ·çè§è²çº§å«ä½äºåå»ºç¨æ·çè§è²çº§å«ï¼åæåºæéä¸è¶³çé误 * * @param updateId 被æä½äººçid */ private void checkLevel(Long updateId) { Admin admin = adminService.findByUserName(SecurityUtils.getUsername()); // è·åæä½è æå¤§æé Integer currentLevel = Collections.min(roleService.listByAdminId(admin.getId()).stream().map(Role::getLevel).collect(Collectors.toList())); // è·å被ç¼è¾äººçæå¤§æé List<Integer> optList = roleService.listByAdminId(updateId).stream().map(Role::getLevel).collect(Collectors.toList()); // 没æé é便æä½ if (CollectionUtil.isEmpty(optList)) { return; } Integer optLevel = Collections.min(optList); if (optLevel != null) { if (currentLevel > optLevel) { throw new BusinessException("æéä¸è¶³ï¼ä½ çè§è²çº§å«ï¼" + currentLevel + "ï¼ä½äºæä½çè§è²çº§å«ï¼" + optLevel); } } } // /** // * ç¼è¾æçä¿¡æ¯ ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MenuController.java
@@ -41,13 +41,24 @@ boolean result = menuService.updateMenu(menuId,param); if (result) { return ResponseUtil.success("æ·»å æå"); return ResponseUtil.success("ç¼è¾æå"); } else { return ResponseUtil.fail("æ·»å 失败"); return ResponseUtil.fail("ç¼è¾å¤±è´¥"); } } @PostMapping @PostMapping("/del/{menuId}") public ResponseVO<Object> delMenu(@PathVariable Long menuId) { boolean result = menuService.delMenu(menuId); if (result) { return ResponseUtil.success("å 餿å"); } else { return ResponseUtil.fail("å é¤å¤±è´¥"); } } @PostMapping("/add") public ResponseVO<Object> addMenu(@Validated @RequestBody MenuParam param) { boolean result = menuService.addMenu(param); ximon-admin/src/main/java/com/sandu/ximon/admin/controller/RoleController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,74 @@ package com.sandu.ximon.admin.controller; import com.github.pagehelper.PageHelper; import com.sandu.common.domain.ResponseVO; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.util.ResponseUtil; import com.sandu.ximon.admin.param.RoleParam; import com.sandu.ximon.admin.service.RoleService; import com.sandu.ximon.dao.domain.Role; import com.sandu.ximon.dao.domain.RoleDetail; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author chenjiantian * @date 2021/4/27 18:47 */ @AllArgsConstructor @RestController @RequestMapping("/v1/role") public class RoleController { private final RoleService roleService; /** * è·å管çåçè§è² */ @GetMapping("/getRoleListByAdmin/{adminId}") public ResponseVO<Object> getRoleListByAdmin(@PathVariable Long adminId) { List<Role> roles = roleService.listByAdminId(adminId); return ResponseUtil.success(roles); } @GetMapping("/list") public ResponseVO<Object> listRole(BaseConditionVO conditionVO) { List<RoleDetail> roleDetails = roleService.listRole(conditionVO.getPageNo(), conditionVO.getPageSize()); return ResponseUtil.success(roleDetails); } @PostMapping("/add") public ResponseVO<Object> addRole(@Validated @RequestBody RoleParam param) { boolean result = roleService.addRole(param); if (result) { return ResponseUtil.success("æ·»å æå"); } else { return ResponseUtil.success("æ·»å 失败"); } } @PostMapping("/update/{roleId}") public ResponseVO<Object> updateRole(@PathVariable Long roleId, @Validated @RequestBody RoleParam param) { boolean result = roleService.updateRole(roleId, param); if (result) { return ResponseUtil.success("ç¼è¾æå"); } else { return ResponseUtil.success("ç¼è¾å¤±è´¥"); } } @PostMapping("/del/{roleId}") public ResponseVO<Object> delRole(@PathVariable Long roleId) { boolean result = roleService.delRole(roleId); if (result) { return ResponseUtil.success("å 餿å"); } else { return ResponseUtil.success("å é¤å¤±è´¥"); } } } ximon-admin/src/main/java/com/sandu/ximon/admin/param/AdminParam.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.sandu.ximon.admin.param; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @author chenjiantian * @date 2022/1/18 15:56 */ @Data public class AdminParam { @NotBlank(message = "è´¦å·ä¸è½ä¸ºç©º") private String username; @NotBlank(message = "å¯ç ä¸è½ä¸ºç©º") private String password; private String mobile; @NotBlank(message = "ç¨æ·åä¸è½ä¸ºç©º") private String nickName; private String note; @NotNull(message = "è§è²idä¸è½ä¸ºç©º") private Long roleId; } ximon-admin/src/main/java/com/sandu/ximon/admin/param/PwdParam.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.sandu.ximon.admin.param; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; /** * @author chenjiantian * @date 2022/1/18 16:21 */ @Data public class PwdParam { @NotBlank(message = "æ§å¯ç ä¸è½ä¸ºç©º") private String oldPass; @NotBlank(message = "æ°å¯ç ä¸è½ä¸ºç©º") @Size(min = 6,message = "å¯ç æçå¿ é¡»æ¯6ä½") private String newPass; @NotBlank(message = "确认å¯ç ä¸è½ä¸ºç©º") @Size(min = 6,message = "å¯ç æçå¿ é¡»æ¯6ä½") private String confirmPass; } ximon-admin/src/main/java/com/sandu/ximon/admin/param/RoleParam.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.sandu.ximon.admin.param; import lombok.Data; import javax.validation.constraints.NotBlank; import java.util.List; /** * @author chenjiantian * @date 2022/1/18 11:38 */ @Data public class RoleParam { /** * åç§° */ @NotBlank(message = "è§è²åç§°ä¸è½ä¸ºç©º") private String name; /** * 夿³¨ */ private String remark; private List<Long> menuIdList; } ximon-admin/src/main/java/com/sandu/ximon/admin/security/PermissionConfig.java
@@ -1,5 +1,7 @@ package com.sandu.ximon.admin.security; import com.sandu.common.security.LoginUserInfo; import com.sandu.ximon.dao.enums.AdministratorEnums; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; @@ -12,14 +14,22 @@ * @date 2021/8/27 18:28 * æéæ§å¶ */ @Service(value = "p") @Service(value = "el") public class PermissionConfig { // public Boolean check(String... permissions) { // // // è·åå½åç¨æ·çæææé // List<String> elPermissions = SecurityUtils.getUserDetails().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()); // // 夿å½åç¨æ·çæææéæ¯å¦å 嫿¥å£ä¸å®ä¹çæé // return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains); // } public Boolean check(String... permissions) { LoginUserInfo loginUserInfo = SecurityUtils.getUserDetails(); if (loginUserInfo == null || loginUserInfo.getPermission() == null) { return false; } // å®¢æ·æ²¡ææé管ç if(AdministratorEnums.CUSTOMER.getCode().equals(loginUserInfo.getAdministratorType())){ return true; } String[] split = loginUserInfo.getPermission().split(","); // è·åå½åç¨æ·çæææé List<String> elPermissions = Arrays.stream(split).collect(Collectors.toList()); // 夿å½åç¨æ·çæææéæ¯å¦å 嫿¥å£ä¸å®ä¹çæé return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains); } } ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
@@ -18,7 +18,7 @@ /** * è·åå½åç»å½ç¨æ·ä¿¡æ¯ */ private static LoginUserInfo getUserDetails() { public static LoginUserInfo getUserDetails() { final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()); ximon-admin/src/main/java/com/sandu/ximon/admin/service/AdminService.java
@@ -1,18 +1,145 @@ package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.enums.RoleLevelStatus; import com.sandu.common.execption.BusinessException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.ximon.admin.param.AdminParam; import com.sandu.ximon.admin.param.PwdParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.domain.Admin; import com.sandu.ximon.dao.domain.AdminRoleRelation; import com.sandu.ximon.dao.domain.Role; import com.sandu.ximon.dao.mapper.AdminMapper; import lombok.AllArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * @author chenjiantian * @date 2021/11/24 11:02 */ @Service @AllArgsConstructor public class AdminService extends BaseServiceImpl<AdminMapper, Admin> { private final PasswordEncoder passwordEncoder; private final AdminRoleRelationService adminRoleRelationService; private final RoleService roleService; public Admin findByUserName(String username) { return getOne(Wrappers.lambdaQuery(Admin.class).eq(Admin::getUsername, username).last("limit 1")); } @Transactional(rollbackFor = Exception.class) public boolean register(AdminParam param) { Admin admin = findByUserName(param.getUsername()); if (admin != null) { throw new BusinessException("å½åè´¦å·" + param.getUsername() + "å·²ç»åå¨"); } Admin save = new Admin(); save.setUsername(param.getUsername()); save.setPassword(passwordEncoder.encode(param.getPassword())); save.setNickName(param.getNickName()); save.setMobile(param.getMobile()); save.setNote(param.getNote()); if (!save(save)) { throw new BusinessException("注å管çå失败"); } Role role = roleService.getById(param.getRoleId()); if (role == null) { throw new BusinessException("è§è²ä¸åå¨"); } if (RoleLevelStatus.SUPER.getCode().equals(role.getLevel())) { throw new BusinessException("æ æ³æ·»å è¶ çº§ç®¡çå"); } AdminRoleRelation adminRoleRelation = new AdminRoleRelation(); adminRoleRelation.setAdminId(save.getId()); adminRoleRelation.setRoleId(param.getRoleId()); if (!adminRoleRelationService.save(adminRoleRelation)) { throw new BusinessException("æ·»å 管çåè§è²å¤±è´¥"); } return true; } @Transactional(rollbackFor = Exception.class) public boolean updateAdmin(Long adminId, AdminParam param) { Admin admin = getById(adminId); if (admin == null) { throw new BusinessException("æ¾ä¸å°ç®¡çå"); } List<Role> roles = roleService.listByAdminId(admin.getId()); if (CollectionUtil.isEmpty(roles)) { throw new BusinessException("å½åç¨æ·æ²¡æè§è²"); } List<Integer> levels = roles.stream().map(Role::getLevel).collect(Collectors.toList()); int min = Collections.min(levels); roleService.assertLevels(min); Admin update = new Admin(); update.setId(adminId); update.setPassword(passwordEncoder.encode(param.getPassword())); update.setNickName(param.getNickName()); update.setMobile(param.getMobile()); update.setNote(param.getNote()); if (!updateById(update)) { throw new BusinessException("ç¼è¾ç®¡çå失败"); } adminRoleRelationService.remove(Wrappers.lambdaQuery(AdminRoleRelation.class).eq(AdminRoleRelation::getAdminId,admin)); AdminRoleRelation adminRoleRelation = new AdminRoleRelation(); adminRoleRelation.setAdminId(adminId); adminRoleRelation.setRoleId(param.getRoleId()); if (!adminRoleRelationService.save(adminRoleRelation)) { throw new BusinessException("æ·»å 管çåè§è²å¤±è´¥"); } return true; } public boolean updateMyPassword(PwdParam param) { if (!StrUtil.equals(param.getNewPass(), param.getConfirmPass())) { throw new BusinessException("两次å¯ç ä¸ä¸è´"); } Long userId = SecurityUtils.getUserId(); Admin admin = getById(userId); if (admin == null) { throw new BusinessException("ç¨æ·ä¸åå¨"); } if (!passwordEncoder.matches(param.getOldPass(), admin.getPassword())) { throw new BusinessException("æ§å¯ç 䏿£ç¡®"); } Admin update = new Admin(); update.setId(userId); update.setPassword(passwordEncoder.encode(param.getNewPass())); return updateById(update); } public boolean deleteAdmin(Long adminId) { Admin admin = getById(adminId); if (admin == null) { throw new BusinessException("æ¾ä¸å°ç®¡çå"); } List<Role> roles = roleService.listByAdminId(admin.getId()); if (CollectionUtil.isEmpty(roles)) { throw new BusinessException("å½åç¨æ·æ²¡æè§è²"); } List<Integer> levels = roles.stream().map(Role::getLevel).collect(Collectors.toList()); int min = Collections.min(levels); int maxLevel = roleService.assertLevels(min); if(!RoleLevelStatus.SUPER.getCode().equals(maxLevel)){ throw new BusinessException("åªæè¶ çº§ç®¡çåæè½å é¤ç¨æ·"); } return removeById(adminId); } } ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java
@@ -3,13 +3,17 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.enums.RoleLevelStatus; import com.sandu.common.execption.BusinessException; import com.sandu.common.execption.EntityExistException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.param.MenuParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.bo.MenuNode; import com.sandu.ximon.dao.domain.AdminRoleRelation; import com.sandu.ximon.dao.domain.Menu; import com.sandu.ximon.dao.domain.Role; import com.sandu.ximon.dao.domain.RoleMenuRelation; import com.sandu.ximon.dao.mapper.AdminRoleRelationMapper; import com.sandu.ximon.dao.mapper.MenuMapper; @@ -17,6 +21,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -79,6 +84,12 @@ throw new BusinessException("æ¾ä¸å°èåä¿¡æ¯"); } List<Role> roles = SpringContextHolder.getBean(RoleService.class).listByAdminId(SecurityUtils.getUserId()); Integer roleLevel = roles.stream().map(Role::getLevel).min(Integer::compareTo).orElse(RoleLevelStatus.COMMON.getCode()); if(!RoleLevelStatus.SUPER.getCode().equals(roleLevel)){ throw new BusinessException("è¶ çº§ç®¡çåæå¯ä»¥ç¼è¾èå"); } Menu menu = new Menu(); BeanUtils.copyProperties(param,menu); menu.setId(menuId); @@ -91,4 +102,18 @@ .filter(menu -> menu.getPid().equals(0L)) .map(menu -> covertMenuNode(menu, list)).collect(Collectors.toList()); } public boolean delMenu(Long menuId) { Menu one = getById(menuId); if (one == null) { throw new BusinessException("æ¾ä¸å°èåä¿¡æ¯"); } List<Role> roles = SpringContextHolder.getBean(RoleService.class).listByAdminId(SecurityUtils.getUserId()); Integer roleLevel = roles.stream().map(Role::getLevel).min(Integer::compareTo).orElse(RoleLevelStatus.COMMON.getCode()); if(!RoleLevelStatus.SUPER.getCode().equals(roleLevel)){ throw new BusinessException("è¶ çº§ç®¡çåæå¯ä»¥å é¤èå"); } return removeById(menuId); } } ximon-admin/src/main/java/com/sandu/ximon/admin/service/RoleMenuRelationService.java
@@ -1,9 +1,14 @@ package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollectionUtil; import com.sandu.common.execption.BusinessException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.ximon.dao.domain.RoleMenuRelation; import com.sandu.ximon.dao.mapper.RoleMenuRelationMapper; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * @author chenjiantian @@ -11,4 +16,20 @@ */ @Service public class RoleMenuRelationService extends BaseServiceImpl<RoleMenuRelationMapper, RoleMenuRelation> { public boolean addRoleMenuList(Long roleId, List<Long> menuIdList) { if (CollectionUtil.isNotEmpty(menuIdList)) { List<RoleMenuRelation> roleMenuRelationList = new ArrayList<>(); for (Long menuId : menuIdList) { RoleMenuRelation roleMenuRelation = new RoleMenuRelation(); roleMenuRelation.setMenuId(menuId); roleMenuRelation.setRoleId(roleId); roleMenuRelationList.add(roleMenuRelation); } if (!saveBatch(roleMenuRelationList)) { throw new BusinessException("ç¼è¾è§è²èå失败"); } } return true; } } ximon-admin/src/main/java/com/sandu/ximon/admin/service/RoleService.java
@@ -3,22 +3,23 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.sandu.common.enums.RoleLevelStatus; import com.sandu.common.execption.BusinessException; import com.sandu.common.execption.EntityExistException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.ximon.dao.domain.AdminRoleRelation; import com.sandu.ximon.dao.domain.Menu; import com.sandu.ximon.dao.domain.Role; import com.sandu.ximon.dao.domain.RoleMenuRelation; import com.sandu.common.util.BeanConvertUtil; import com.sandu.ximon.admin.param.RoleParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.domain.*; import com.sandu.ximon.dao.mapper.RoleMapper; import lombok.AllArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.*; import java.util.stream.Collectors; /** @@ -73,8 +74,88 @@ List<AdminRoleRelation> list = adminRoleRelationService.list(Wrappers.lambdaQuery(AdminRoleRelation.class).eq(AdminRoleRelation::getAdminId, adminId).select(AdminRoleRelation::getRoleId)); List<Long> roleIdList = list.stream().map(AdminRoleRelation::getRoleId).collect(Collectors.toList()); if (CollectionUtil.isEmpty(roleIdList)) { throw new BusinessException("å½åç¨æ·æ²¡æè§è²"); return null; } return listByIds(roleIdList); } @Transactional(rollbackFor = Exception.class) public boolean addRole(RoleParam param) { Role role = new Role(); role.setName(param.getName()); role.setRemark(param.getRemark()); role.setLevel(RoleLevelStatus.COMMON.getCode()); if(!save(role)){ throw new BusinessException("æ·»å è§è²å¤±è´¥"); } roleMenuRelationService.addRoleMenuList(role.getId(),param.getMenuIdList()); return true; } @Transactional(rollbackFor = Exception.class) public boolean updateRole(Long roleId, RoleParam param) { Role role = getById(roleId); if (role == null) { throw new BusinessException("æ¾ä¸å°è§è²ä¿¡æ¯"); } assertLevels(role.getLevel()); Role update = new Role(); update.setId(roleId); update.setName(param.getName()); update.setRemark(param.getRemark()); if(!updateById(update)){ throw new BusinessException("ç¼è¾è§è²å¤±è´¥"); } roleMenuRelationService.remove(Wrappers.lambdaQuery(RoleMenuRelation.class).eq(RoleMenuRelation::getRoleId,roleId)); roleMenuRelationService.addRoleMenuList(role.getId(),param.getMenuIdList()); return true; } /** * 夿å½åè§è²è½ä¸è½æä½ç®æ ç¨æ· ä¸è¡çè¯ç´æ¥æåºå¼å¸¸ * @param roleLevel ç®æ ç¨æ·çæé«è§è²ç级 * @return æä½äººçæé«è§è²ç级 */ public int assertLevels(Integer roleLevel) { Long userId = SecurityUtils.getUserId(); List<Role> roles = listByAdminId(userId); if(CollectionUtil.isEmpty(roles)){ throw new BusinessException("å½åç¨æ·æ²¡æè§è²"); } List<Integer> levels = roles.stream().map(Role::getLevel).collect(Collectors.toList()); int min = Collections.min(levels); if (roleLevel != null) { if (roleLevel < min) { throw new BusinessException("æéä¸è¶³ï¼ä½ çè§è²çº§å«ï¼" + min + "ï¼ä½äºæä½çè§è²çº§å«ï¼" + roleLevel); } } return min; } public boolean delRole(Long roleId) { Role role = getById(roleId); if (role == null) { throw new BusinessException("æ¾ä¸å°è§è²"); } assertLevels(role.getLevel()); List<AdminRoleRelation> list = adminRoleRelationService.list(Wrappers.lambdaQuery(AdminRoleRelation.class).eq(AdminRoleRelation::getRoleId, role)); if(CollectionUtil.isNotEmpty(list)){ throw new BusinessException("å½åè§è²æç®¡çå使ç¨ï¼æ æ³å é¤"); } roleMenuRelationService.remove(Wrappers.lambdaQuery(RoleMenuRelation.class).eq(RoleMenuRelation::getRoleId,roleId)); return removeById(roleId); } public List<RoleDetail> listRole(int pageNo, int pageSize) { PageHelper.startPage(pageNo, pageSize); List<Long> roleIdList = list().stream().map(Role::getId).collect(Collectors.toList()); if(CollectionUtil.isEmpty(roleIdList)){ return null; } return baseMapper.listRole(roleIdList); } }