From 81d91229a33e4507d532aa36fc8be85b8f273951 Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Wed, 31 Jul 2024 18:00:56 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- .../supervision/config/JwtInterceptor.java | 90 +++++++++++ .../com/supervision/config/ThreadCache.java | 30 ++++ .../com/supervision/config/WebConfig.java | 56 +++++++ .../police/controller/MenuController.java | 28 ++++ .../police/controller/RoleController.java | 44 ++++++ .../police/controller/UserController.java | 69 +++++++++ .../supervision/police/domain/SystemMenu.java | 10 +- .../supervision/police/domain/SystemRole.java | 8 +- .../police/domain/SystemRoleMenuRelation.java | 63 ++++++++ .../supervision/police/domain/SystemUser.java | 17 +-- .../police/domain/SystemUserRoleRelation.java | 8 +- .../com/supervision/police/dto/MenuDTO.java | 44 ++++++ .../com/supervision/police/dto/RoleDTO.java | 69 +++++++++ .../police/dto/user/LoginReqVO.java | 11 ++ .../police/dto/user/LoginResVO.java | 70 +++++++++ .../police/dto/user/RoleMenuDTO.java | 24 +++ .../police/dto/user/UserInfoDTO.java | 81 ++++++++++ .../police/dto/user/UserInfoReqVo.java | 52 +++++++ .../police/dto/user/UserRoleDTO.java | 15 ++ .../police/dto/user/UserStatusReqVo.java | 14 ++ .../mapper/SystemRoleMenuRelationMapper.java | 18 +++ .../mapper/SystemUserRoleRelationMapper.java | 9 ++ .../police/service/SystemMenuService.java | 5 + .../SystemRoleMenuRelationService.java | 22 +++ .../police/service/SystemRoleService.java | 9 ++ .../SystemUserRoleRelationService.java | 21 +++ .../police/service/SystemUserService.java | 19 +++ .../service/impl/SystemMenuServiceImpl.java | 22 +++ .../SystemRoleMenuRelationServiceImpl.java | 52 +++++++ .../service/impl/SystemRoleServiceImpl.java | 103 +++++++++++++ .../SystemUserRoleRelationServiceImpl.java | 70 +++++++++ .../service/impl/SystemUserServiceImpl.java | 143 ++++++++++++++++++ .../java/com/supervision/utils/SM2Util.java | 97 ++++++++++++ .../java/com/supervision/utils/TokenUtil.java | 19 +++ .../java/com/supervision/utils/UserUtil.java | 54 +++++++ .../mapper/SystemRoleMenuRelationMapper.xml | 22 +++ .../mapper/SystemUserRoleRelationMapper.xml | 28 ++++ src/main/resources/secure/sm2_private.key | 1 + src/main/resources/secure/sm2_public.key | 1 + 40 files changed, 1507 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/supervision/config/JwtInterceptor.java create mode 100644 src/main/java/com/supervision/config/ThreadCache.java create mode 100644 src/main/java/com/supervision/config/WebConfig.java create mode 100644 src/main/java/com/supervision/police/controller/MenuController.java create mode 100644 src/main/java/com/supervision/police/controller/RoleController.java create mode 100644 src/main/java/com/supervision/police/controller/UserController.java create mode 100644 src/main/java/com/supervision/police/domain/SystemRoleMenuRelation.java create mode 100644 src/main/java/com/supervision/police/dto/MenuDTO.java create mode 100644 src/main/java/com/supervision/police/dto/RoleDTO.java create mode 100644 src/main/java/com/supervision/police/dto/user/LoginReqVO.java create mode 100644 src/main/java/com/supervision/police/dto/user/LoginResVO.java create mode 100644 src/main/java/com/supervision/police/dto/user/RoleMenuDTO.java create mode 100644 src/main/java/com/supervision/police/dto/user/UserInfoDTO.java create mode 100644 src/main/java/com/supervision/police/dto/user/UserInfoReqVo.java create mode 100644 src/main/java/com/supervision/police/dto/user/UserRoleDTO.java create mode 100644 src/main/java/com/supervision/police/dto/user/UserStatusReqVo.java create mode 100644 src/main/java/com/supervision/police/mapper/SystemRoleMenuRelationMapper.java create mode 100644 src/main/java/com/supervision/police/service/SystemRoleMenuRelationService.java create mode 100644 src/main/java/com/supervision/police/service/impl/SystemRoleMenuRelationServiceImpl.java create mode 100644 src/main/java/com/supervision/utils/SM2Util.java create mode 100644 src/main/java/com/supervision/utils/TokenUtil.java create mode 100644 src/main/java/com/supervision/utils/UserUtil.java create mode 100644 src/main/resources/mapper/SystemRoleMenuRelationMapper.xml create mode 100644 src/main/resources/secure/sm2_private.key create mode 100644 src/main/resources/secure/sm2_public.key diff --git a/pom.xml b/pom.xml index 77780fd..2aec48f 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,11 @@ 1.12.0 - + + org.bouncycastle + bcprov-jdk15on + 1.70 + diff --git a/src/main/java/com/supervision/config/JwtInterceptor.java b/src/main/java/com/supervision/config/JwtInterceptor.java new file mode 100644 index 0000000..a316b37 --- /dev/null +++ b/src/main/java/com/supervision/config/JwtInterceptor.java @@ -0,0 +1,90 @@ +package com.supervision.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.hutool.jwt.JWT; +import cn.hutool.jwt.JWTUtil; +import com.supervision.utils.TokenUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class JwtInterceptor implements HandlerInterceptor { + + public JwtInterceptor() { + } + + + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + //请求消息头获取用户ID + String token = request.getHeader("token"); + if (StrUtil.isBlank(token)) { + // 如果是swagger来的接口,说明这里是测试的,会伪造一个用户 + String referer = request.getHeader("Referer"); + if (StrUtil.isNotBlank(referer) && StrUtil.contains(referer, "swagger-ui")) { + cacheAuth(JWTUtil.parseToken(devActiveUser())); + return true; + } else { + throw new BusinessException("当前用户未登录", HttpStatus.UNAUTHORIZED.value()); + } + } + JWT jwt = JWTUtil.parseToken(token); + // 校验token是否过期,如果过期了,需要提示过期重新登录 + checkTokenExpire(jwt); + cacheAuth(jwt); + return true; + } + + + @Override + public void afterCompletion(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, + @Nullable Exception ex) throws Exception { + // 请求结束,将用户信息从thread中移除 + clearAuth(); + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } + + + private void checkTokenExpire(JWT jwt) { + Object expireTime = jwt.getPayload("expireTime"); + long l = Long.parseLong(String.valueOf(expireTime)); + // 校验是否比当前时间大 + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis > l) { + throw new BusinessException("用户登录已过期,请重新登录", HttpStatus.UNAUTHORIZED.value()); + } + } + + + private void cacheAuth(JWT jwt) { + try { + JSONObject claimsJson = jwt.getPayload().getClaimsJson(); + ThreadCache.USER.set(claimsJson.toString()); + } catch (Exception e) { + log.error("用户信息异常", e); + } + } + + private String devActiveUser() { + Map map = new HashMap<>(); + map.put("id", "1"); + map.put("account", "test"); + map.put("name", "测试"); + return TokenUtil.creatToken(JSONUtil.toJsonStr(map)); + } + + private void clearAuth() { + ThreadCache.USER.remove(); + } +} diff --git a/src/main/java/com/supervision/config/ThreadCache.java b/src/main/java/com/supervision/config/ThreadCache.java new file mode 100644 index 0000000..4b98e76 --- /dev/null +++ b/src/main/java/com/supervision/config/ThreadCache.java @@ -0,0 +1,30 @@ +/* + * 文 件 名: ThreadCache + * 版 权: + * 描 述: <描述> + * 修 改 人: RedName + * 修改时间: 2023/9/4 + * 跟踪单号: <跟踪单号> + * 修改单号: <修改单号> + * 修改内容: <修改内容> + */ +package com.supervision.config; + + +/** + * <功能详细描述> + * + * @author ljt + * @version [版本号, 2023/9/4] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class ThreadCache { + + /** + * 用户ID + */ + public static final ThreadLocal USER = new ThreadLocal<>(); + + +} diff --git a/src/main/java/com/supervision/config/WebConfig.java b/src/main/java/com/supervision/config/WebConfig.java new file mode 100644 index 0000000..05647cd --- /dev/null +++ b/src/main/java/com/supervision/config/WebConfig.java @@ -0,0 +1,56 @@ +package com.supervision.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 添加权限拦截器 + registry.addInterceptor(new JwtInterceptor()) + .addPathPatterns("/**") + .excludePathPatterns(ignorePathPatterns()); + } + + public List ignorePathPatterns() { + List paths = new ArrayList<>(); + paths.add("/swagger-resources/**"); + paths.add("/webjars/**"); + paths.add("/v3/**"); + paths.add("/swagger-ui.html/**"); + paths.add("/swagger-ui/**"); + paths.add("/webjars/"); + paths.add("/doc.html/**"); + paths.add("/error"); + paths.add("/favicon.ico"); + paths.add("/user/login"); + paths.add("/user/register"); + paths.add("/user/changePassWord"); + paths.add("/user/checkAccount"); + paths.add("/webSocket/**"); + paths.add("/ask/downloadTalkVideo"); + paths.add("/fileManage/downloadFile"); + paths.add("/aqLibrary/downloadQuestionLibraryTemplate"); + paths.add("/medicalRecManage/downloadMedicalAnswerTemplate"); + paths.add("/qaKnowledge/**"); + // 开发环境,放开不校验token.每次修改这里需要重启(热部署不行) +// paths.add("/**"); + return paths; + } +} diff --git a/src/main/java/com/supervision/police/controller/MenuController.java b/src/main/java/com/supervision/police/controller/MenuController.java new file mode 100644 index 0000000..336c04e --- /dev/null +++ b/src/main/java/com/supervision/police/controller/MenuController.java @@ -0,0 +1,28 @@ +package com.supervision.police.controller; + +import com.supervision.police.dto.MenuDTO; +import com.supervision.police.service.SystemMenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Tag(name = "菜单管理") +@RestController +@Slf4j +@RequestMapping("/menu") +@RequiredArgsConstructor +public class MenuController { + + private final SystemMenuService menuService; + @Operation(summary = "查看用户信息列表") + @GetMapping("/listMenu") + public List listMenu() { + return menuService.listMenu(); + } +} diff --git a/src/main/java/com/supervision/police/controller/RoleController.java b/src/main/java/com/supervision/police/controller/RoleController.java new file mode 100644 index 0000000..34cbd57 --- /dev/null +++ b/src/main/java/com/supervision/police/controller/RoleController.java @@ -0,0 +1,44 @@ +package com.supervision.police.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.police.dto.RoleDTO; +import com.supervision.police.service.SystemRoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "用户角色管理") +@RestController +@RequestMapping("/roleManage") +@RequiredArgsConstructor +public class RoleController { + + private final SystemRoleService roleService; + @Operation(summary = "新增角色") + @PostMapping("/save") + public String saveRole(@RequestBody RoleDTO roleDTO) { + + return roleService.saveRole(roleDTO); + } + + @Operation(summary = "修改角色") + @PostMapping("/update") + public void updateRole(@RequestBody RoleDTO roleDTO) { + roleService.updateRole(roleDTO); + } + + @Operation(summary = "删除角色") + @DeleteMapping("/delete") + public Boolean deleteRole(@Parameter(name = "id") @RequestParam(name="id") String id) { + return roleService.deleteRole(id); + } + @Operation(summary = "查看角色列表") + @GetMapping("/list") + public IPage list(@Parameter(name = "roleName",description = "角色名称") @RequestParam(required = false) String roleName, + @Parameter(name = "pageNum",description = "页码") @RequestParam(defaultValue = "1") Integer pageNum, + @Parameter(name = "pageSize",description = "每页大小") @RequestParam(defaultValue = "10") Integer pageSize) { + return roleService.list(roleName, pageNum, pageSize); + } +} diff --git a/src/main/java/com/supervision/police/controller/UserController.java b/src/main/java/com/supervision/police/controller/UserController.java new file mode 100644 index 0000000..6d7b5cd --- /dev/null +++ b/src/main/java/com/supervision/police/controller/UserController.java @@ -0,0 +1,69 @@ +package com.supervision.police.controller; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.police.dto.user.*; +import com.supervision.police.service.SystemUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "用户管理") +@RestController +@RequestMapping("/user") +@RequiredArgsConstructor +public class UserController { + + private final SystemUserService userService; + + + @Operation(summary = "登录") + @PostMapping("/login") + public LoginResVO login(@RequestBody LoginReqVO reqVO) { + + return userService.login(reqVO); + } + + + @Operation(summary = "新增用户信息") + @PostMapping("/saveUserInfo") + public String saveUserInfo(@RequestBody UserInfoReqVo userInfoReqVo) { + + return userService.saveUserInfo(userInfoReqVo); + } + + @Operation(summary = "修改用户信息") + @PostMapping("/update") + public void updateUser(@RequestBody UserInfoReqVo userInfoReqVo) { + userService.updateUserInfo(userInfoReqVo); + } + + @Operation(summary = "修改用户状态") + @PostMapping("/updateUserStatus") + public void updateUserStatus(@RequestBody UserStatusReqVo userStatusReqVo) { + userService.updateUserStatus(userStatusReqVo); + } + + @Operation(summary = "删除用户信息") + @DeleteMapping("/delete") + public Boolean deleteUser(@Parameter(name = "id") @RequestParam(name="id") String id) { + return userService.deleteUser(id); + } + @Operation(summary = "查看用户信息列表") + @GetMapping("/list") + public IPage list(@Parameter(name = "userName",description = "用户名") @RequestParam(required = false) String userName, + @Parameter(name = "roleId",description = "角色id") @RequestParam(required = false) String roleId, + @Parameter(name = "roleName",description = "角色名") @RequestParam(required = false) String roleName, + @Parameter(name = "pageNum",description = "页码") @RequestParam(defaultValue = "1") Integer pageNum, + @Parameter(name = "pageSize",description = "每页大小") @RequestParam(defaultValue = "10") Integer pageSize) { + return userService.list(userName, roleId, roleName, pageNum, pageSize); + } + + + + + +} diff --git a/src/main/java/com/supervision/police/domain/SystemMenu.java b/src/main/java/com/supervision/police/domain/SystemMenu.java index ac7be95..283b5a6 100644 --- a/src/main/java/com/supervision/police/domain/SystemMenu.java +++ b/src/main/java/com/supervision/police/domain/SystemMenu.java @@ -1,9 +1,11 @@ package com.supervision.police.domain; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; import lombok.Data; @@ -33,7 +35,7 @@ public class SystemMenu implements Serializable { /** * 标签类型 0: 菜单 1:标签 默认菜单 */ - private Integer lableType; + private Integer labelType; /** * 父级id @@ -48,7 +50,8 @@ public class SystemMenu implements Serializable { /** * 创建时间 */ - private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; /** * 更新人 @@ -58,7 +61,8 @@ public class SystemMenu implements Serializable { /** * 更新时间 */ - private Date updateTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/supervision/police/domain/SystemRole.java b/src/main/java/com/supervision/police/domain/SystemRole.java index 1a440ce..511943d 100644 --- a/src/main/java/com/supervision/police/domain/SystemRole.java +++ b/src/main/java/com/supervision/police/domain/SystemRole.java @@ -1,9 +1,11 @@ package com.supervision.police.domain; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; import lombok.Data; @@ -38,7 +40,8 @@ public class SystemRole implements Serializable { /** * 创建时间 */ - private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; /** * 更新人 @@ -48,7 +51,8 @@ public class SystemRole implements Serializable { /** * 更新时间 */ - private Date updateTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/supervision/police/domain/SystemRoleMenuRelation.java b/src/main/java/com/supervision/police/domain/SystemRoleMenuRelation.java new file mode 100644 index 0000000..eaaaee5 --- /dev/null +++ b/src/main/java/com/supervision/police/domain/SystemRoleMenuRelation.java @@ -0,0 +1,63 @@ +package com.supervision.police.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 角色菜单关联表 + * @TableName system_role_menu_relation + */ +@TableName(value ="system_role_menu_relation") +@Data +public class SystemRoleMenuRelation implements Serializable { + /** + * 主键id + */ + private String id; + + /** + * 角色id + */ + private String roleId; + + /** + * 菜单id + */ + private String menuId; + + /** + * 创建人ID + */ + private String createUserId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; + + /** + * 更新人 + */ + private String updateUserId; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + public SystemRoleMenuRelation() { + } + + public SystemRoleMenuRelation(String roleId, String menuId) { + this.roleId = roleId; + this.menuId = menuId; + } +} \ No newline at end of file diff --git a/src/main/java/com/supervision/police/domain/SystemUser.java b/src/main/java/com/supervision/police/domain/SystemUser.java index c519ddb..c0b31c3 100644 --- a/src/main/java/com/supervision/police/domain/SystemUser.java +++ b/src/main/java/com/supervision/police/domain/SystemUser.java @@ -1,9 +1,11 @@ package com.supervision.police.domain; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; import lombok.Data; @@ -33,7 +35,7 @@ public class SystemUser implements Serializable { /** * 用户名 */ - private String username; + private String userName; /** * 手机号码 @@ -50,11 +52,6 @@ public class SystemUser implements Serializable { */ private String userPd; - /** - * 人员所属部门ID - */ - private String deptId; - /** * 备注 */ @@ -63,7 +60,7 @@ public class SystemUser implements Serializable { /** * 最近登录时间 */ - private Date recentLoginTime; + private LocalDateTime recentLoginTime; /** * 创建人ID @@ -73,7 +70,8 @@ public class SystemUser implements Serializable { /** * 创建时间 */ - private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; /** * 更新人 @@ -83,7 +81,8 @@ public class SystemUser implements Serializable { /** * 更新时间 */ - private Date updateTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/supervision/police/domain/SystemUserRoleRelation.java b/src/main/java/com/supervision/police/domain/SystemUserRoleRelation.java index f4c1f67..f66b19b 100644 --- a/src/main/java/com/supervision/police/domain/SystemUserRoleRelation.java +++ b/src/main/java/com/supervision/police/domain/SystemUserRoleRelation.java @@ -1,9 +1,11 @@ package com.supervision.police.domain; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; import lombok.Data; @@ -38,7 +40,8 @@ public class SystemUserRoleRelation implements Serializable { /** * 创建时间 */ - private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; /** * 更新人 @@ -48,7 +51,8 @@ public class SystemUserRoleRelation implements Serializable { /** * 更新时间 */ - private Date updateTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/supervision/police/dto/MenuDTO.java b/src/main/java/com/supervision/police/dto/MenuDTO.java new file mode 100644 index 0000000..8e2f29c --- /dev/null +++ b/src/main/java/com/supervision/police/dto/MenuDTO.java @@ -0,0 +1,44 @@ +package com.supervision.police.dto; + +import com.supervision.police.domain.SystemMenu; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; +import java.util.Objects; + +@Data +public class MenuDTO { + + @Schema(description = "菜单id") + private String id; + + @Schema(description = "标签(菜单名或按钮名)") + private String label; + + @Schema(description = "标签码 前端权限使用") + private String labelCode; + + @Schema(description = "标签类型 0: 菜单 1:标签 默认菜单") + private Integer labelType; + + @Schema(description = "父级id") + private String parentId; + + @Schema(description = "子菜单") + private List children; + + public MenuDTO() { + } + + public MenuDTO(SystemMenu systemMenu) { + if (Objects.isNull(systemMenu)){ + return; + } + this.id = systemMenu.getId(); + this.label = systemMenu.getLabel(); + this.labelCode = systemMenu.getLabelCode(); + this.labelType = systemMenu.getLabelType(); + this.parentId = systemMenu.getParentId(); + } +} diff --git a/src/main/java/com/supervision/police/dto/RoleDTO.java b/src/main/java/com/supervision/police/dto/RoleDTO.java new file mode 100644 index 0000000..46c0e49 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/RoleDTO.java @@ -0,0 +1,69 @@ +package com.supervision.police.dto; + +import cn.hutool.core.collection.CollUtil; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.supervision.police.domain.SystemRole; +import com.supervision.police.domain.SystemRoleMenuRelation; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Data +public class RoleDTO { + + @Schema(description = "角色id") + private String id; + + @Schema(description = "角色名称") + private String roleName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "菜单id列表") + private List menuIdList; + + @Schema(description = "关联用户数量") + private int userCount; + + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime updateTime; + + + public RoleDTO() { + } + + public RoleDTO(SystemRole role, Long userCount, List roleMenuRelationList) { + if (Objects.isNull(role)){ + return; + } + this.id = role.getId(); + this.roleName = role.getRoleName(); + this.remark = role.getRemark(); + this.updateTime = role.getUpdateTime(); + this.userCount = userCount.intValue(); + if (CollUtil.isNotEmpty(roleMenuRelationList)){ + this.menuIdList = roleMenuRelationList.stream().map(SystemRoleMenuRelation::getMenuId).toList(); + } + } + public SystemRole toSystemRole() { + SystemRole systemRole = new SystemRole(); + systemRole.setId(this.id); + systemRole.setRoleName(this.roleName); + systemRole.setRemark(this.remark); + return systemRole; + } + + public List menuIdListToRoleMenu() { + if (CollUtil.isEmpty(this.menuIdList)){ + return new ArrayList<>(); + } + return this.menuIdList.stream().map(menuId -> new SystemRoleMenuRelation(this.id,menuId)).toList(); + } + +} diff --git a/src/main/java/com/supervision/police/dto/user/LoginReqVO.java b/src/main/java/com/supervision/police/dto/user/LoginReqVO.java new file mode 100644 index 0000000..36f14f7 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/LoginReqVO.java @@ -0,0 +1,11 @@ +package com.supervision.police.dto.user; + +import lombok.Data; + +@Data +public class LoginReqVO { + + private String userAccount; + + private String password; +} diff --git a/src/main/java/com/supervision/police/dto/user/LoginResVO.java b/src/main/java/com/supervision/police/dto/user/LoginResVO.java new file mode 100644 index 0000000..50a86eb --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/LoginResVO.java @@ -0,0 +1,70 @@ +package com.supervision.police.dto.user; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; +import com.supervision.police.domain.SystemUser; +import com.supervision.utils.TokenUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + + +@Data +public class LoginResVO { + + @Schema(description = "主键") + private String id; + + @Schema(description = "用户账户") + private String account; + + @Schema(description = "用户名称") + private String userName; + + @Schema(description = "用户角色编码") + private String roleCode; + + @Schema(description = "菜单权限标识") + private List permission = new ArrayList<>(); + + @Schema(description = "token") + private String token; + + public LoginResVO() { + } + + public LoginResVO(SystemUser systemUser) { + if (Objects.isNull(systemUser)){ + return; + } + this.id = systemUser.getId(); + this.account = systemUser.getAccount(); + this.userName = systemUser.getUserName(); + } + + public void setToken(UserInfoDTO userInfoDTO) { + if (Objects.isNull(userInfoDTO)){ + return; + } + this.token = TokenUtil.creatToken(JSONUtil.toJsonStr(userInfoDTO)); + } + public void setToken(String token) { + this.token = token; + } + + public void setPermission(List permission) { + this.permission = permission; + } + + public void roleMenuDTOSetPermission(List roleMenuDTOS) { + if (CollUtil.isEmpty(roleMenuDTOS)){ + return; + } + this.permission = roleMenuDTOS.stream().map(RoleMenuDTO::getLabelCode).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/supervision/police/dto/user/RoleMenuDTO.java b/src/main/java/com/supervision/police/dto/user/RoleMenuDTO.java new file mode 100644 index 0000000..4df424e --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/RoleMenuDTO.java @@ -0,0 +1,24 @@ +package com.supervision.police.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class RoleMenuDTO { + + @Schema(description = "角色id") + private String roleId; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "菜单id") + private String menuId; + + @Schema(description = "菜单名称") + private String label; + + @Schema(description = "菜单编码") + private String labelCode; + +} diff --git a/src/main/java/com/supervision/police/dto/user/UserInfoDTO.java b/src/main/java/com/supervision/police/dto/user/UserInfoDTO.java new file mode 100644 index 0000000..895909a --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/UserInfoDTO.java @@ -0,0 +1,81 @@ +package com.supervision.police.dto.user; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableId; +import com.supervision.police.domain.SystemUser; +import lombok.Data; +import org.springframework.scheduling.support.SimpleTriggerContext; + +import java.time.LocalDateTime; +import java.util.*; + +@Data +public class UserInfoDTO { + + + /** + * 主键 + */ + @TableId + private String id; + + /** + * 头像id + */ + private String headPicId; + + /** + * 账户名 + */ + private String account; + + /** + * 用户名 + */ + private String userName; + + /** + * 手机号码 + */ + private String phoneNum; + + /** + * 账号状态 0正常 1停用 + */ + private Integer status; + + + private List userRoleList; + /** + * 最近登录时间 + */ + private LocalDateTime recentLoginTime; + + public UserInfoDTO() { + } + + public UserInfoDTO(SystemUser systemUser) { + systemUserSetter(systemUser); + } + + public UserInfoDTO(SystemUser systemUser, Map> userRoleMap) { + systemUserSetter(systemUser); + if (StrUtil.isNotEmpty(this.id)){ + this.setUserRoleList(userRoleMap.getOrDefault(this.id, new ArrayList<>(1))); + } + } + + private void systemUserSetter(SystemUser systemUser){ + if (Objects.isNull(systemUser)){ + return; + } + this.id = systemUser.getId(); + this.headPicId = systemUser.getHeadPicId(); + this.account = systemUser.getAccount(); + this.userName = systemUser.getUserName(); + this.phoneNum = systemUser.getPhoneNum(); + this.status = systemUser.getStatus(); + this.recentLoginTime = systemUser.getRecentLoginTime(); + } + +} diff --git a/src/main/java/com/supervision/police/dto/user/UserInfoReqVo.java b/src/main/java/com/supervision/police/dto/user/UserInfoReqVo.java new file mode 100644 index 0000000..059018b --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/UserInfoReqVo.java @@ -0,0 +1,52 @@ +package com.supervision.police.dto.user; + +import com.supervision.police.domain.SystemUser; +import com.supervision.utils.UserUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class UserInfoReqVo { + + @Schema(description = "用户id") + private String id; + + @Schema(description = "头像ID") + private String headPicId; + + @Schema(description = "账号") + private String account; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "密码") + private String password; + + @Schema(description = "手机号") + private String phoneNum; + + @Schema(description = "账号状态 0正常 1停用") + private Integer status; + + @Schema(description = "角色ID列表") + private List roleIdList; + + @Schema(description = "备注") + private String remark; + + public SystemUser toSystemUser() { + SystemUser systemUser = new SystemUser(); + systemUser.setId(id); + systemUser.setHeadPicId(headPicId); + systemUser.setAccount(account); + systemUser.setUserName(userName); + systemUser.setUserPd(password); + systemUser.setRemark(remark); + systemUser.setStatus(status); + systemUser.setUserPd(UserUtil.signPassword(this.getPassword())); + return systemUser; + } +} diff --git a/src/main/java/com/supervision/police/dto/user/UserRoleDTO.java b/src/main/java/com/supervision/police/dto/user/UserRoleDTO.java new file mode 100644 index 0000000..b77af20 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/UserRoleDTO.java @@ -0,0 +1,15 @@ +package com.supervision.police.dto.user; + +import lombok.Data; + +@Data +public class UserRoleDTO { + + private String userId; + + private String roleId; + + private String roleName; + + private Integer roleType; +} diff --git a/src/main/java/com/supervision/police/dto/user/UserStatusReqVo.java b/src/main/java/com/supervision/police/dto/user/UserStatusReqVo.java new file mode 100644 index 0000000..6fbdd7e --- /dev/null +++ b/src/main/java/com/supervision/police/dto/user/UserStatusReqVo.java @@ -0,0 +1,14 @@ +package com.supervision.police.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class UserStatusReqVo { + + @Schema(description = "用户ID") + private String id; + + @Schema(description = "用户状态 0正常 1停用") + private String status; +} diff --git a/src/main/java/com/supervision/police/mapper/SystemRoleMenuRelationMapper.java b/src/main/java/com/supervision/police/mapper/SystemRoleMenuRelationMapper.java new file mode 100644 index 0000000..7a344a8 --- /dev/null +++ b/src/main/java/com/supervision/police/mapper/SystemRoleMenuRelationMapper.java @@ -0,0 +1,18 @@ +package com.supervision.police.mapper; + +import com.supervision.police.domain.SystemRoleMenuRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author Administrator +* @description 针对表【system_role_menu_relation(角色菜单关联表)】的数据库操作Mapper +* @createDate 2024-07-31 15:02:36 +* @Entity com.supervision.police.domain.SystemRoleMenuRelation +*/ +public interface SystemRoleMenuRelationMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/com/supervision/police/mapper/SystemUserRoleRelationMapper.java b/src/main/java/com/supervision/police/mapper/SystemUserRoleRelationMapper.java index c01c44b..c0e9b53 100644 --- a/src/main/java/com/supervision/police/mapper/SystemUserRoleRelationMapper.java +++ b/src/main/java/com/supervision/police/mapper/SystemUserRoleRelationMapper.java @@ -2,6 +2,11 @@ package com.supervision.police.mapper; import com.supervision.police.domain.SystemUserRoleRelation; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.supervision.police.dto.user.RoleMenuDTO; +import com.supervision.police.dto.user.UserRoleDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Administrator @@ -11,6 +16,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SystemUserRoleRelationMapper extends BaseMapper { + List listUserRole(@Param("userId") String userId, @Param("roleId") String roleId, + @Param("roleName") String roleName); + + List listUserRoleMenu(String userId); } diff --git a/src/main/java/com/supervision/police/service/SystemMenuService.java b/src/main/java/com/supervision/police/service/SystemMenuService.java index 2bcf77f..0208972 100644 --- a/src/main/java/com/supervision/police/service/SystemMenuService.java +++ b/src/main/java/com/supervision/police/service/SystemMenuService.java @@ -2,6 +2,9 @@ package com.supervision.police.service; import com.supervision.police.domain.SystemMenu; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.dto.MenuDTO; + +import java.util.List; /** * @author Administrator @@ -10,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface SystemMenuService extends IService { + List listMenu(); + } diff --git a/src/main/java/com/supervision/police/service/SystemRoleMenuRelationService.java b/src/main/java/com/supervision/police/service/SystemRoleMenuRelationService.java new file mode 100644 index 0000000..bc53505 --- /dev/null +++ b/src/main/java/com/supervision/police/service/SystemRoleMenuRelationService.java @@ -0,0 +1,22 @@ +package com.supervision.police.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.domain.SystemRoleMenuRelation; +import com.supervision.police.domain.SystemUserRoleRelation; + +import java.util.List; + +/** +* @author Administrator +* @description 针对表【system_role_menu_relation(角色菜单关联表)】的数据库操作Service +* @createDate 2024-07-31 15:02:36 +*/ +public interface SystemRoleMenuRelationService extends IService { + + + void updateRoleMenu(String roleId, List menuIds); + + void deleteRoleMenu(String roleId); + + List listRoleMenuByRoleIdList(List roleIdList); +} diff --git a/src/main/java/com/supervision/police/service/SystemRoleService.java b/src/main/java/com/supervision/police/service/SystemRoleService.java index 605ab6b..7e94a3f 100644 --- a/src/main/java/com/supervision/police/service/SystemRoleService.java +++ b/src/main/java/com/supervision/police/service/SystemRoleService.java @@ -1,7 +1,9 @@ package com.supervision.police.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.police.domain.SystemRole; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.dto.RoleDTO; /** * @author Administrator @@ -10,4 +12,11 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface SystemRoleService extends IService { + String saveRole(RoleDTO roleDTO); + + void updateRole(RoleDTO roleDTO); + + Boolean deleteRole(String id); + + IPage list(String roleName, Integer pageNum, Integer pageSize); } diff --git a/src/main/java/com/supervision/police/service/SystemUserRoleRelationService.java b/src/main/java/com/supervision/police/service/SystemUserRoleRelationService.java index 1a04edb..0f5de45 100644 --- a/src/main/java/com/supervision/police/service/SystemUserRoleRelationService.java +++ b/src/main/java/com/supervision/police/service/SystemUserRoleRelationService.java @@ -2,6 +2,10 @@ package com.supervision.police.service; import com.supervision.police.domain.SystemUserRoleRelation; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.dto.user.RoleMenuDTO; +import com.supervision.police.dto.user.UserRoleDTO; + +import java.util.List; /** * @author Administrator @@ -10,4 +14,21 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface SystemUserRoleRelationService extends IService { + List listUserRole(String userId, String roleId, String roleName); + + List saveUserRoleRelation(String userId, List roleIdList); + + List updateUserRoleRelation(String userId, List roleIdList); + + void deleteUserRoleRelation(String userId); + + + /** + * 获取用户角色菜单 + * @param userId 用户id + * @return + */ + List listUserRoleMenu(String userId); + + List listUserRoleByRoleIdList(List roleIdList); } diff --git a/src/main/java/com/supervision/police/service/SystemUserService.java b/src/main/java/com/supervision/police/service/SystemUserService.java index b281b62..d234f59 100644 --- a/src/main/java/com/supervision/police/service/SystemUserService.java +++ b/src/main/java/com/supervision/police/service/SystemUserService.java @@ -1,7 +1,11 @@ package com.supervision.police.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.police.domain.SystemUser; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.dto.user.*; + +import java.util.List; /** * @author Administrator @@ -10,4 +14,19 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface SystemUserService extends IService { + LoginResVO login(LoginReqVO reqVO); + + UserInfoDTO getUserAccountInfo(); + + String saveUserInfo(UserInfoReqVo userInfoReqVo); + + void updateUserInfo(UserInfoReqVo userInfoReqVo); + + Boolean deleteUser(String id); + + IPage list(String userName, String roleId, String roleName, Integer pageNum, Integer pageSize); + + + void updateUserStatus(UserStatusReqVo userStatusReqVo); + } diff --git a/src/main/java/com/supervision/police/service/impl/SystemMenuServiceImpl.java b/src/main/java/com/supervision/police/service/impl/SystemMenuServiceImpl.java index 2b7665e..58bd6fe 100644 --- a/src/main/java/com/supervision/police/service/impl/SystemMenuServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/SystemMenuServiceImpl.java @@ -1,11 +1,17 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.SystemMenu; +import com.supervision.police.dto.MenuDTO; import com.supervision.police.service.SystemMenuService; import com.supervision.police.mapper.SystemMenuMapper; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @author Administrator * @description 针对表【system_menu(菜单表)】的数据库操作Service实现 @@ -15,6 +21,22 @@ import org.springframework.stereotype.Service; public class SystemMenuServiceImpl extends ServiceImpl implements SystemMenuService{ + @Override + public List listMenu() { + + List systemMenuList = super.list(); + if (CollUtil.isEmpty(systemMenuList)){ + return new ArrayList<>(); + } + + List menuDTOList = systemMenuList.stream().map(MenuDTO::new).toList(); + for (MenuDTO menuDTO : menuDTOList) { + List children = menuDTOList.stream() + .filter(item -> menuDTO.getId().equals(item.getParentId())).toList(); + menuDTO.setChildren(children); + } + return menuDTOList.stream().filter(item -> StrUtil.isEmpty(item.getParentId())).toList(); + } } diff --git a/src/main/java/com/supervision/police/service/impl/SystemRoleMenuRelationServiceImpl.java b/src/main/java/com/supervision/police/service/impl/SystemRoleMenuRelationServiceImpl.java new file mode 100644 index 0000000..2e631d0 --- /dev/null +++ b/src/main/java/com/supervision/police/service/impl/SystemRoleMenuRelationServiceImpl.java @@ -0,0 +1,52 @@ +package com.supervision.police.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.supervision.police.domain.SystemRoleMenuRelation; +import com.supervision.police.domain.SystemUserRoleRelation; +import com.supervision.police.service.SystemRoleMenuRelationService; +import com.supervision.police.mapper.SystemRoleMenuRelationMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** +* @author Administrator +* @description 针对表【system_role_menu_relation(角色菜单关联表)】的数据库操作Service实现 +* @createDate 2024-07-31 15:02:36 +*/ +@Service +public class SystemRoleMenuRelationServiceImpl extends ServiceImpl + implements SystemRoleMenuRelationService { + + @Override + @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) + public void updateRoleMenu(String roleId, List menuIds) { + Assert.notEmpty(roleId, "角色id不能为空"); + + if (CollUtil.isNotEmpty(menuIds)){ + List list = menuIds.stream().map(menuId -> new SystemRoleMenuRelation(roleId, menuId)).toList(); + list.forEach(super::save); + } + } + + @Override + public void deleteRoleMenu(String roleId) { + super.remove(lambdaQuery().eq(SystemRoleMenuRelation::getRoleId, roleId)); + } + + @Override + public List listRoleMenuByRoleIdList(List roleIdList) { + if(CollUtil.isEmpty(roleIdList)){ + return new ArrayList<>(); + } + return super.lambdaQuery().in(SystemRoleMenuRelation::getRoleId, roleIdList).list(); + } +} + + + + diff --git a/src/main/java/com/supervision/police/service/impl/SystemRoleServiceImpl.java b/src/main/java/com/supervision/police/service/impl/SystemRoleServiceImpl.java index 51eb864..73e8271 100644 --- a/src/main/java/com/supervision/police/service/impl/SystemRoleServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/SystemRoleServiceImpl.java @@ -1,20 +1,123 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.SystemRole; +import com.supervision.police.domain.SystemRoleMenuRelation; +import com.supervision.police.domain.SystemUserRoleRelation; +import com.supervision.police.dto.RoleDTO; +import com.supervision.police.service.SystemRoleMenuRelationService; import com.supervision.police.service.SystemRoleService; import com.supervision.police.mapper.SystemRoleMapper; +import com.supervision.police.service.SystemUserRoleRelationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【system_role(角色表)】的数据库操作Service实现 * @createDate 2024-07-31 11:02:43 */ +@Slf4j @Service +@RequiredArgsConstructor public class SystemRoleServiceImpl extends ServiceImpl implements SystemRoleService{ + private final SystemRoleMenuRelationService systemRoleMenuRelationService; + + private final SystemUserRoleRelationService systemUserRoleRelationService; + + private final SystemRoleMenuRelationService roleMenuRelationService; + @Override + @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) + public String saveRole(RoleDTO roleDTO) { + + Assert.notEmpty(roleDTO.getRoleName(), "角色名称不能为空"); + Long count = super.lambdaQuery().eq(SystemRole::getRoleName, roleDTO.getRoleName()).count(); + Assert.isTrue(count == 0, "角色名称已存在"); + + // 保存角色 + SystemRole systemRole = roleDTO.toSystemRole(); + super.save(systemRole); + + // 保存角色关联的菜单信息 + if (CollUtil.isNotEmpty(roleDTO.getMenuIdList())){ + roleDTO.setId(systemRole.getId()); + roleDTO.menuIdListToRoleMenu().forEach(systemRoleMenuRelationService::save); + } + + return systemRole.getId(); + } + + @Override + @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) + public void updateRole(RoleDTO roleDTO) { + Assert.notEmpty(roleDTO.getId(), "角色id不能为空"); + Assert.notEmpty(roleDTO.getRoleName(), "角色名称不能为空"); + + SystemRole dbSystemRole = super.getById(roleDTO.getId()); + Assert.notNull(dbSystemRole, "角色不存在"); + if (!StrUtil.equals(dbSystemRole.getRoleName(), roleDTO.getRoleName())){ + // 判断角色名称是否重复 + Long count = super.lambdaQuery().eq(SystemRole::getRoleName, roleDTO.getRoleName()).count(); + Assert.isTrue(count == 0, "角色名称已存在"); + } + + dbSystemRole.setRoleName(roleDTO.getRoleName()); + dbSystemRole.setRemark(roleDTO.getRemark()); + + // 更新角色基本数据 + super.updateById(dbSystemRole); + + // 更新角色关联的菜单信息 + systemRoleMenuRelationService.updateRoleMenu(dbSystemRole.getId(), roleDTO.getMenuIdList()); + + } + + @Override + public Boolean deleteRole(String roleId) { + + Assert.notEmpty(roleId, "角色id不能为空"); + boolean success = super.removeById(roleId); + if (success){ + systemRoleMenuRelationService.deleteRoleMenu(roleId); + } + return success; + } + + @Override + public IPage list(String roleName, Integer pageNum, Integer pageSize) { + + Page page = super.lambdaQuery().like(StrUtil.isNotEmpty(roleName), SystemRole::getRoleName, roleName) + .orderBy(true, false, SystemRole::getUpdateTime).page(new Page<>(pageNum, pageSize)); + + if (CollUtil.isEmpty(page.getRecords())){ + return Page.of(pageNum, pageSize,page.getTotal()); + } + + List roleIdList = page.getRecords().stream().map(SystemRole::getId).toList(); + // 角色关联的用户数量 + List userRoleList = systemUserRoleRelationService.listUserRoleByRoleIdList(roleIdList); + Map roleCount = userRoleList.stream().collect(Collectors.groupingBy(SystemUserRoleRelation::getRoleId, Collectors.counting())); + // 角色关联的菜单数据 + List roleMenuList = roleMenuRelationService.listRoleMenuByRoleIdList(roleIdList); + Map> roleMenuMap = roleMenuList.stream().collect(Collectors.groupingBy(SystemRoleMenuRelation::getRoleId)); + + return page.convert(systemRole -> + new RoleDTO(systemRole, roleCount.get(systemRole.getId()),roleMenuMap.get(systemRole.getId()))); + + } } diff --git a/src/main/java/com/supervision/police/service/impl/SystemUserRoleRelationServiceImpl.java b/src/main/java/com/supervision/police/service/impl/SystemUserRoleRelationServiceImpl.java index 0ac8be9..f8ca076 100644 --- a/src/main/java/com/supervision/police/service/impl/SystemUserRoleRelationServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/SystemUserRoleRelationServiceImpl.java @@ -1,20 +1,90 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.SystemUserRoleRelation; +import com.supervision.police.dto.user.RoleMenuDTO; +import com.supervision.police.dto.user.UserRoleDTO; import com.supervision.police.service.SystemUserRoleRelationService; import com.supervision.police.mapper.SystemUserRoleRelationMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @author Administrator * @description 针对表【system_user_role_relation(用户角色关联表)】的数据库操作Service实现 * @createDate 2024-07-31 11:02:43 */ +@Slf4j @Service +@RequiredArgsConstructor public class SystemUserRoleRelationServiceImpl extends ServiceImpl implements SystemUserRoleRelationService{ + @Override + public List listUserRole(String userId, String roleId, String roleName) { + return super.getBaseMapper().listUserRole(userId,roleId,roleName); + } + + @Override + public List saveUserRoleRelation(String userId, List roleIdList) { + Assert.notEmpty(userId, "用户id不能为空"); + + if (CollUtil.isEmpty(roleIdList)){ + log.info("saveUserRoleRelation:userId:{},roleList is empty",userId); + return CollUtil.newArrayList(); + } + + List userRoleList = roleIdList.stream().map(roleId -> { + SystemUserRoleRelation userRole = new SystemUserRoleRelation(); + userRole.setRoleId(roleId); + userRole.setUserId(userId); + return userRole; + }).toList(); + super.saveBatch(userRoleList); + return userRoleList; + } + + @Override + public List updateUserRoleRelation(String userId, List roleIdList) { + Assert.notEmpty(userId, "用户id不能为空"); + + super.lambdaUpdate().eq(SystemUserRoleRelation::getUserId,userId).remove(); + + if (CollUtil.isEmpty(roleIdList)){ + log.info("updateUserRoleRelation:userId:{},roleList is empty",userId); + return CollUtil.newArrayList(); + } + return saveUserRoleRelation(userId,roleIdList); + } + + @Override + public void deleteUserRoleRelation(String userId) { + super.lambdaUpdate().eq(SystemUserRoleRelation::getUserId,userId).remove(); + } + + @Override + public List listUserRoleMenu(String userId) { + if (StrUtil.isEmpty(userId)){ + return new ArrayList<>(); + } + + return super.getBaseMapper().listUserRoleMenu(userId); + } + + @Override + public List listUserRoleByRoleIdList(List roleIdList) { + if (CollUtil.isEmpty(roleIdList)){ + return CollUtil.newArrayList(); + } + return super.lambdaQuery().in(SystemUserRoleRelation::getRoleId,roleIdList).list(); + } } diff --git a/src/main/java/com/supervision/police/service/impl/SystemUserServiceImpl.java b/src/main/java/com/supervision/police/service/impl/SystemUserServiceImpl.java index 911440c..5d7ff65 100644 --- a/src/main/java/com/supervision/police/service/impl/SystemUserServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/SystemUserServiceImpl.java @@ -1,20 +1,163 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.SystemUser; +import com.supervision.police.dto.user.*; +import com.supervision.police.service.SystemUserRoleRelationService; import com.supervision.police.service.SystemUserService; import com.supervision.police.mapper.SystemUserMapper; +import com.supervision.utils.UserUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【system_user(用户表)】的数据库操作Service实现 * @createDate 2024-07-31 11:02:43 */ +@Slf4j @Service +@RequiredArgsConstructor public class SystemUserServiceImpl extends ServiceImpl implements SystemUserService{ + private final SystemUserRoleRelationService userRoleRelationManageService; + + @Override + @Transactional(rollbackFor = Exception.class) + public LoginResVO login(LoginReqVO reqVO) { + + // 校验用户信息是否正确 + Assert.isTrue(StrUtil.isAllNotEmpty(reqVO.getUserAccount(), reqVO.getPassword()), "用户名或密码不能为空"); + + SystemUser systemUser = super.getOne(new LambdaQueryWrapper().eq(SystemUser::getAccount, reqVO.getUserAccount())); + Assert.notNull(systemUser, "用户名或密码有误!"); + Assert.notNull(UserUtil.checkUserPassword(reqVO.getPassword(), systemUser.getUserPd()), "用户名或密码有误!"); + Assert.isTrue(systemUser.getStatus() == 0, "该用户已被停用,请联系管理员!"); + + // 组装用户信息 + LoginResVO loginResVO = new LoginResVO(systemUser); + // 设置用户token信息 + loginResVO.setToken(new UserInfoDTO(systemUser)); + // 设置用户权限信息 + loginResVO.roleMenuDTOSetPermission(userRoleRelationManageService.listUserRoleMenu(systemUser.getId())); + return loginResVO; + } + + @Override + public UserInfoDTO getUserAccountInfo() { + return UserUtil.getUser(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String saveUserInfo(UserInfoReqVo userInfoReqVo) { + Assert.notEmpty(userInfoReqVo.getAccount(), "账号不能为空"); + Assert.notEmpty(userInfoReqVo.getUserName(), "姓名不能为空"); + Assert.notEmpty(userInfoReqVo.getPassword(), "密码不能为空"); + Assert.notEmpty(userInfoReqVo.getRoleIdList(), "角色不能为空"); + + Long count = super.lambdaQuery().eq(SystemUser::getAccount, userInfoReqVo.getAccount()).count(); + Assert.isTrue(count == 0, "用户名已存在"); + + SystemUser systemUser = userInfoReqVo.toSystemUser(); + // 设置默认密码 + super.save(systemUser); + userRoleRelationManageService.saveUserRoleRelation(systemUser.getId(), userInfoReqVo.getRoleIdList()); + return systemUser.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUserInfo(UserInfoReqVo userInfoReqVo) { + + Assert.notEmpty(userInfoReqVo.getId(), "用户id不能为空"); + Assert.notEmpty(userInfoReqVo.getAccount(), "用户名不能为空"); + Assert.notEmpty(userInfoReqVo.getUserName(), "姓名不能为空"); + Assert.notEmpty(userInfoReqVo.getRoleIdList(), "角色不能为空"); + + + Long count = super.lambdaQuery() + .eq(SystemUser::getAccount, userInfoReqVo.getAccount()) + .ne(SystemUser::getId, userInfoReqVo.getId()).count(); + Assert.isTrue(count == 0, "用户名已存在,请更改用户名"); + + super.lambdaUpdate() + .set(SystemUser::getHeadPicId, userInfoReqVo.getHeadPicId()) + .set(SystemUser::getUserName, userInfoReqVo.getUserName()) + .set(SystemUser::getAccount, userInfoReqVo.getAccount()) + .set(SystemUser::getPhoneNum, userInfoReqVo.getPhoneNum()) + .set(SystemUser::getStatus, userInfoReqVo.getStatus()) + .set(SystemUser::getRemark, userInfoReqVo.getRemark()) + + .eq(SystemUser::getId, userInfoReqVo.getId()) + .update(); + + userRoleRelationManageService.updateUserRoleRelation(userInfoReqVo.getId(), userInfoReqVo.getRoleIdList()); + } + + @Override + public Boolean deleteUser(String id) { + + Assert.notEmpty(id, "用户id不能为空"); + SystemUser systemUser = super.getById(id); + Assert.notNull(systemUser, "用户不存在"); + Assert.isFalse(systemUser.getStatus() == 0, "该用户已启用,不能删除"); + + super.removeById(id); + + userRoleRelationManageService.deleteUserRoleRelation(id); + return true; + } + + @Override + public IPage list(String userName, String roleId, String roleName, Integer pageNum, Integer pageSize) { + + List userRoleDTOS = new ArrayList<>(); + // 先对角色进行判断 + if (StrUtil.isNotEmpty(roleId) || StrUtil.isNotEmpty(roleName)){ + userRoleDTOS = userRoleRelationManageService.listUserRole(null, roleId, roleName); + if (CollUtil.isEmpty(userRoleDTOS)){ + return Page.of(pageNum, pageSize, 0); + } + } + + //构建查询条件 + Page userInfoPage = super.page(Page.of(pageNum, pageSize), + new LambdaQueryWrapper() + .eq(StrUtil.isNotEmpty(userName), SystemUser::getUserName, userName) + .in(CollUtil.isNotEmpty(userRoleDTOS), SystemUser::getId, userRoleDTOS.stream().map(UserRoleDTO::getUserId).toList())); + + if (CollUtil.isEmpty(userInfoPage.getRecords())){ + return Page.of(pageNum, pageSize, userInfoPage.getTotal()); + } + + Map> userRoleMap = userRoleDTOS.stream().collect(Collectors.groupingBy(UserRoleDTO::getUserId, Collectors.toList())); + + return userInfoPage.convert(systemUser -> new UserInfoDTO(systemUser,userRoleMap)); + } + + + @Override + public void updateUserStatus(UserStatusReqVo userStatusReqVo) { + Assert.notEmpty(userStatusReqVo.getId(), "用户id不能为空"); + Assert.notNull(userStatusReqVo.getStatus(), "用户状态不能为空"); + super.lambdaUpdate().set(SystemUser::getStatus, userStatusReqVo.getStatus()) + .eq(SystemUser::getId, userStatusReqVo.getId()).update(); + } } diff --git a/src/main/java/com/supervision/utils/SM2Util.java b/src/main/java/com/supervision/utils/SM2Util.java new file mode 100644 index 0000000..5633563 --- /dev/null +++ b/src/main/java/com/supervision/utils/SM2Util.java @@ -0,0 +1,97 @@ +package com.supervision.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.SM2; + +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; + +public class SM2Util { + + + private static SM2 sm2 = getSM2(); + + /** + * 生成密钥; 测试使用,实际使用中请保存到文件中,或者数据库中 + */ + public static void generateKey() { + KeyPair pair = SecureUtil.generateKeyPair("SM2"); + PrivateKey privateKey = pair.getPrivate(); + PublicKey publicKey = pair.getPublic(); + + System.out.println("private:"+Base64.encode(privateKey.getEncoded())); + System.out.println("public:"+Base64.encode(publicKey.getEncoded())); + + } + + /** + * 验证签名 + * @param content 需要被验证的内容 + * @param sign 签名 + * @return true:验证通过,false:验证失败 + */ + public static boolean verify(String content,String sign){ + + return sm2.verifyHex(HexUtil.encodeHexStr(content), sign); + } + + /** + * 加密字符串 + * @param content 需要签名的内容 + * @return 加密后的密文 base64编码 + */ + public static String encryptBase64(String content){ + + return sm2.encryptBase64(content,KeyType.PublicKey); + } + + /** + * 对密文进行解密 + * @param data 密文 + * @return + */ + public static String decrypt(String data){ + + return sm2.decryptStr(data, KeyType.PrivateKey); + } + + + /** + * 签名 + * @param content 需要签名的内容 + * @return 签名字符串 结果固定为142位 + */ + public static String sign(String content){ + return sm2.signHex(HexUtil.encodeHexStr(content)); + } + + public static SM2 getSM2(){ + String privateKey = ResourceUtil.readUtf8Str("secure/sm2_private.key"); + String publicKey = ResourceUtil.readUtf8Str("secure/sm2_public.key"); + return new SM2(privateKey, publicKey); + } + + public static void main(String[] args) { + + String content = "张三里斯忘我ss **()((##"; + + String encryptBase64 = encryptBase64(content); + System.out.println("加密结果:"+encryptBase64); + + String decrypt = decrypt(encryptBase64); + System.out.println("解密结果:"+decrypt); + + String sign = sign(content); + System.out.println("签名结果:"+sign); + boolean verify = verify(content, sign); + System.out.println("正向验证结果:"+verify); + + boolean verify1 = verify("djaoidf", sign); + System.out.println("反向验证结果:"+verify1); + } +} diff --git a/src/main/java/com/supervision/utils/TokenUtil.java b/src/main/java/com/supervision/utils/TokenUtil.java new file mode 100644 index 0000000..5542884 --- /dev/null +++ b/src/main/java/com/supervision/utils/TokenUtil.java @@ -0,0 +1,19 @@ +package com.supervision.utils; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.hutool.jwt.JWTUtil; +import cn.hutool.jwt.signers.JWTSigner; +import cn.hutool.jwt.signers.JWTSignerUtil; + +public class TokenUtil { + + public static String creatToken(String userInfo){ + final JWTSigner signer = JWTSignerUtil.hs256("~~||DDEdfdfee33s6$$".getBytes()); + JSONObject info = JSONUtil.parseObj(userInfo); + // 过期时间一天,同时这个字段也作为单点登录使用 + info.putOnce("expireTime",System.currentTimeMillis() + 1000 * 60 * 60 * 24); + info.putOnce("issueTime",System.currentTimeMillis()); + return JWTUtil.createToken(info, signer); + } +} diff --git a/src/main/java/com/supervision/utils/UserUtil.java b/src/main/java/com/supervision/utils/UserUtil.java new file mode 100644 index 0000000..c726913 --- /dev/null +++ b/src/main/java/com/supervision/utils/UserUtil.java @@ -0,0 +1,54 @@ +package com.supervision.utils; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.hutool.jwt.JWT; +import cn.hutool.jwt.JWTUtil; +import com.supervision.police.dto.user.UserInfoDTO; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +public class UserUtil { + + public static UserInfoDTO getUser() { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + Assert.notNull(requestAttributes, "未获取到用户信息"); + HttpServletRequest request = requestAttributes.getRequest(); + + String token = request.getHeader("token"); + if (StrUtil.isBlank(token)) { + token = (String) request.getAttribute("token"); + + } + Assert.notEmpty(token, "未获取到用户token信息"); + JWT jwt = JWTUtil.parseToken(token); + JSONObject claimsJson = jwt.getPayload().getClaimsJson(); + UserInfoDTO bean = JSONUtil.toBean(claimsJson.toString(), UserInfoDTO.class); + Assert.notNull(bean, "未获取到用户信息"); + return bean; + } + + + /** + * 验证密码 + * @param password 明文密码 + * @param userPd 密文签名 + * @return + */ + public static boolean checkUserPassword(String password, String userPd) { + return SM2Util.verify(password, userPd); + } + + /** + * 密码加密签名 + * @param password 密码 + * @return + */ + public static String signPassword(String password){ + return SM2Util.sign(password); + } + +} diff --git a/src/main/resources/mapper/SystemRoleMenuRelationMapper.xml b/src/main/resources/mapper/SystemRoleMenuRelationMapper.xml new file mode 100644 index 0000000..11f0f5e --- /dev/null +++ b/src/main/resources/mapper/SystemRoleMenuRelationMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + id,role_id,menu_id, + create_user_id,create_time,update_user_id, + update_time + + diff --git a/src/main/resources/mapper/SystemUserRoleRelationMapper.xml b/src/main/resources/mapper/SystemUserRoleRelationMapper.xml index 8fc5353..75b7a39 100644 --- a/src/main/resources/mapper/SystemUserRoleRelationMapper.xml +++ b/src/main/resources/mapper/SystemUserRoleRelationMapper.xml @@ -19,4 +19,32 @@ create_user_id,create_time,update_user_id, update_time + + diff --git a/src/main/resources/secure/sm2_private.key b/src/main/resources/secure/sm2_private.key new file mode 100644 index 0000000..0fdacda --- /dev/null +++ b/src/main/resources/secure/sm2_private.key @@ -0,0 +1 @@ +MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgIc/Neoxk2aVlkKS4WyHJQ6NTWRMcaSh7dqAeH7gHKyegCgYIKoEcz1UBgi2hRANCAASSC2D8SWIwi6S2QmAzuiJXwtcTHcPsY/Epd4y6VOy0x5OZ4+hXdAq9KrXtRXJlbho1x8+0Rifr396CChxfYcAN \ No newline at end of file diff --git a/src/main/resources/secure/sm2_public.key b/src/main/resources/secure/sm2_public.key new file mode 100644 index 0000000..2b23191 --- /dev/null +++ b/src/main/resources/secure/sm2_public.key @@ -0,0 +1 @@ +MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEkgtg/EliMIuktkJgM7oiV8LXEx3D7GPxKXeMulTstMeTmePoV3QKvSq17UVyZW4aNcfPtEYn69/eggocX2HADQ== \ No newline at end of file