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