diff --git a/README.md b/README.md
index 5ca413b..cadf565 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ Super Invincible Management System
5. git fetch origin && git merge origin/main: 拉取远程仓库的最新代码并合并到当前分支
6. git push origin xxx: 推送当前分支到远程仓库
7. 提 PR
-8. require review: 请求review
+8. require review: 请求reviewpush
9. merge: 合并 PR
10. delete: 删除分支
diff --git a/pom.xml b/pom.xml
index ce45c54..115a8bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,12 +34,6 @@
org.springframework.boot
spring-boot-starter-web
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- 3.0.3
-
-
org.springframework.boot
spring-boot-devtools
@@ -56,11 +50,21 @@
mysql-connector-j
runtime
+
+ cn.hutool
+ hutool-all
+ 5.8.26
+
org.springframework.boot
spring-boot-configuration-processor
true
+
+ com.auth0
+ java-jwt
+ 4.2.1
+
org.projectlombok
lombok
diff --git a/src/main/java/top/suyiiyii/sims/SimsApplication.java b/src/main/java/top/suyiiyii/sims/SimsApplication.java
index 8e4c0bd..8dba06d 100644
--- a/src/main/java/top/suyiiyii/sims/SimsApplication.java
+++ b/src/main/java/top/suyiiyii/sims/SimsApplication.java
@@ -3,7 +3,8 @@ package top.suyiiyii.sims;
import com.tangzc.autotable.springboot.EnableAutoTable;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-/*@EnableAutoTable*/
+
+@EnableAutoTable
@SpringBootApplication
public class SimsApplication {
public static void main(String[] args) {
diff --git a/src/main/java/top/suyiiyii/sims/VO/UserVO.java b/src/main/java/top/suyiiyii/sims/VO/UserVO.java
new file mode 100644
index 0000000..b465ef8
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/VO/UserVO.java
@@ -0,0 +1,24 @@
+package top.suyiiyii.sims.VO;
+
+import lombok.Data;
+import top.suyiiyii.sims.entity.Role;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/15 16:04
+ * @PackageName:top.suyiiyii.sims.VO
+ * @ClassName: UserVO
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class UserVO {
+ private Integer userId;
+ private String username;
+ private String grade;
+ private String group;
+ private List roles; // 角色名称列表
+
+}
diff --git a/src/main/java/top/suyiiyii/sims/common/AuthAccess.java b/src/main/java/top/suyiiyii/sims/common/AuthAccess.java
new file mode 100644
index 0000000..65ad38f
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/common/AuthAccess.java
@@ -0,0 +1,17 @@
+package top.suyiiyii.sims.common;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/12 11:26
+ * @PackageName:top.suyiiyii.sims.common
+ * @ClassName: AuthAccess
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface AuthAccess {
+}
diff --git a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java
new file mode 100644
index 0000000..0505380
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java
@@ -0,0 +1,35 @@
+package top.suyiiyii.sims.common;
+
+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.WebMvcConfigurationSupport;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/12 11:27
+ * @PackageName:top.suyiiyii.sims.common
+ * @ClassName: InterceptorConfig
+ * @Description: TODO 拦截器配置
+ * @Version 1.0
+ */
+ @Configuration
+ public class InterceptorConfig extends WebMvcConfigurationSupport {
+ @Override
+ protected void addInterceptors(InterceptorRegistry registry) {
+// registry.addInterceptor(jwtInterceptor())
+// .addPathPatterns("/**")
+// .excludePathPatterns("/user/login") // 排除不需要验证的路径
+// .excludePathPatterns("/user/register")
+// .excludePathPatterns("/v3/api-docs/**");
+
+ super.addInterceptors(registry);
+ }
+
+ @Bean
+ public JwtInterceptor jwtInterceptor() {
+ return new JwtInterceptor();
+ }
+
+ }
+
diff --git a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java
new file mode 100644
index 0000000..9f9fa9a
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java
@@ -0,0 +1,70 @@
+package top.suyiiyii.sims.common;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.exception.ServiceException;
+import top.suyiiyii.sims.mapper.UserMapper;
+import top.suyiiyii.sims.utils.JwtUtils;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/12 11:33
+ * @PackageName:top.suyiiyii.sims.common
+ * @ClassName: JwtInterceptor
+ * @Description: TODO
+ * @Version 1.0
+ */
+
+public class JwtInterceptor implements HandlerInterceptor {
+
+ @Resource
+ UserMapper userMapper;
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+ // 从 Authorization 头中获取 token
+ String token = request.getHeader("Authorization");
+ if (token != null && token.startsWith("Bearer ")) {
+ token = token.substring(7);
+ // 去除 "Bearer " 前缀
+ } else {
+ // 如果 Authorization 头中没有 token,则尝试从请求参数中获取
+ token = request.getParameter("token");
+ }
+ // 如果不是映射到方法直接通过
+ if (handler instanceof HandlerMethod) {
+ AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class);
+ if (annotation != null) {
+ return true;
+ }
+ }
+
+ // request.setAttribute();
+ // request.getAttribute()
+
+ // 执行认证
+ if (StrUtil.isBlank(token)) {
+ //权限错误
+ throw new ServiceException("401", "请登录");
+ }
+ // 获取 token 中的 user id
+ String userId= JwtUtils.extractUserId(token);
+ if (userId == null) {
+ throw new ServiceException("401", "请登录");
+ }
+
+ User user = userMapper.selectById(Integer.parseInt(userId));
+ if (user == null) {
+ throw new ServiceException("401", "请登录");
+ }
+ // 验证 token 的有效性
+ if (!JwtUtils.verifyToken(token, user.getPassword())) {
+ throw new ServiceException("401", "请登录");
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/top/suyiiyii/sims/common/Result.java b/src/main/java/top/suyiiyii/sims/common/Result.java
new file mode 100644
index 0000000..50cca31
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/common/Result.java
@@ -0,0 +1,54 @@
+package top.suyiiyii.sims.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import top.suyiiyii.sims.dto.CommonResponse;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/10 21:18
+ * @PackageName:top.suyiiyii.sims.common
+ * @ClassName: Result
+ * @Description: 泛型结果对象
+ * @Version 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Result { // 添加类型参数 T
+
+ public static final String CODE_SUCCESS = "200";
+ public static final String CODE_AUTH_ERROR = "401";
+ public static final String CODE_SYS_ERROR = "500";
+
+ private String code;
+ private String msg;
+ private T data; // 将 Object 改为 T
+
+ public static Result success() { // 添加类型参数 T 并指定返回类型
+ return new Result<>(CODE_SUCCESS, "success", null);
+ }
+
+ public static Result success(T data) { // 添加类型参数 T 并指定返回类型
+ return new Result<>(CODE_SUCCESS, "success", data);
+ }
+
+ public static Result msg(String msg) {
+ return success(CommonResponse.factory(msg));
+ }
+
+ public static Result error(String msg) { // 添加类型参数 T 并指定返回类型
+ return new Result<>(CODE_SYS_ERROR, msg, null);
+ }
+
+ public static Result error(String code, String msg) { // 添加类型参数 T 并指定返回类型
+ return new Result<>(code, msg, null);
+ }
+
+ public static Result authError(String msg) { // 添加类型参数 T 并指定返回类型
+ return new Result<>(CODE_AUTH_ERROR, "认证错误", null);
+ }
+}
diff --git a/src/main/java/top/suyiiyii/sims/controller/AdminController.java b/src/main/java/top/suyiiyii/sims/controller/AdminController.java
new file mode 100644
index 0000000..3beb4bd
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/controller/AdminController.java
@@ -0,0 +1,47 @@
+package top.suyiiyii.sims.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import top.suyiiyii.sims.common.Result;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.service.RoleService;
+import top.suyiiyii.sims.service.UserService;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/14 13:57
+ * @PackageName:top.suyiiyii.sims.controller
+ * @ClassName: AdminController
+ * @Description: TODO
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/admin")
+public class AdminController {
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private UserService userService;
+
+ @GetMapping("/findAllUsersWithRoles")
+ public Result findAllUsersWithRoles() {
+ List userList = roleService.findAllUsersWithRoles();
+ return Result.success(userList);
+ }
+
+ @GetMapping("/selectAll")
+ public Result selectAll() {
+ List users = userService.selectAll();
+ return Result.success(users);
+ }
+}
+/**
+ request.setAttribute();lUsers();
+ return Result.success(userList);
+ }
+}
+**/
\ No newline at end of file
diff --git a/src/main/java/top/suyiiyii/sims/controller/HelloController.java b/src/main/java/top/suyiiyii/sims/controller/HelloController.java
index b9f4c20..9962cad 100644
--- a/src/main/java/top/suyiiyii/sims/controller/HelloController.java
+++ b/src/main/java/top/suyiiyii/sims/controller/HelloController.java
@@ -3,6 +3,7 @@ package top.suyiiyii.sims.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
+import top.suyiiyii.sims.common.Result;
import java.util.List;
@@ -18,5 +19,9 @@ public class HelloController {
List list = List.of(username,age.toString());
return list;
}
+ @GetMapping("/helloResult")
+ public Result healthz() {
+ return Result.success("Hello World");
+ }
}
diff --git a/src/main/java/top/suyiiyii/sims/controller/RecordController.java b/src/main/java/top/suyiiyii/sims/controller/RecordController.java
new file mode 100644
index 0000000..d0f3914
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/controller/RecordController.java
@@ -0,0 +1,45 @@
+package top.suyiiyii.sims.controller;
+
+import org.springframework.web.bind.annotation.*;
+import top.suyiiyii.sims.common.Result;
+import top.suyiiyii.sims.dto.CommonResponse;
+import top.suyiiyii.sims.dto.RecordDto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+public class RecordController {
+
+
+ @GetMapping("/admin/record")
+ public Result> adminRecord(Integer page, Integer size) {
+ return Result.success(new ArrayList<>());
+ }
+
+ @GetMapping("/record")
+ public Result> record(Integer page, Integer size) {
+ return Result.success(new ArrayList<>());
+ }
+
+ @PutMapping("/admin/record/{id}")
+ public Result adminUpdateRecord(@PathVariable Integer id, @RequestBody RecordDto recordDto) {
+
+ return Result.msg("修改成功");
+ }
+
+ @DeleteMapping("/admin/record/{id}")
+ public Result adminDeleteRecord(@PathVariable Integer id) {
+
+ return Result.msg("删除成功");
+ }
+
+
+ @PostMapping("/admin/record")
+ public Result adminAddRecord(@RequestBody RecordDto recordDto) {
+
+ return Result.msg("添加成功");
+ }
+
+
+}
diff --git a/src/main/java/top/suyiiyii/sims/controller/UserController.java b/src/main/java/top/suyiiyii/sims/controller/UserController.java
new file mode 100644
index 0000000..ce18f52
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/controller/UserController.java
@@ -0,0 +1,109 @@
+package top.suyiiyii.sims.controller;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import top.suyiiyii.sims.common.AuthAccess;
+import top.suyiiyii.sims.common.Result;
+import top.suyiiyii.sims.dto.CommonResponse;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.exception.ServiceException;
+import top.suyiiyii.sims.service.RoleService;
+import top.suyiiyii.sims.service.UserService;
+
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/10 22:25
+ * @PackageName:top.suyiiyii.sims.controller
+ * @ClassName: UserController
+ * @Description: TODO
+ * @Version 1.0
+ */
+
+@Slf4j
+@RestController
+//@RequestMapping("/user")
+public class UserController {
+ @Autowired
+ UserService userService;
+ @Autowired
+ RoleService roleService;
+
+ @AuthAccess
+ @GetMapping("/")
+ public Result hello() {
+
+ return Result.success("success");
+
+ }
+
+ @PostMapping("/user/login")
+ public Result login(@RequestBody LoginRequest request) {
+ log.info("login request:{}", request);
+
+ if (StrUtil.isBlank(request.getUsername()) || StrUtil.isBlank(request.getPassword())) {
+
+ return Result.error("用户名或密码不能为空");
+ }
+
+ User user = userService.login(request.getUsername(), request.getPassword());
+
+ return Result.success(new LoginResponse());
+ }
+
+ @PostMapping("/user/register")
+ public Result register(@RequestBody RegisterRequest request) {
+ log.info("register request:{}", request);
+ if (StrUtil.isBlank(request.getUsername()) || StrUtil.isBlank(request.getPassword())) {
+
+ return Result.error("用户名或密码不能为空");
+ }
+ if (request.getPassword() == null || request.getPassword().length() < 3) {
+ throw new ServiceException("密码长度不能小于3位");
+ }
+
+ userService.register(new User());
+
+ return Result.success(CommonResponse.factory("注册成功"));
+ }
+
+ @DeleteMapping("/admin/user/{id}")
+ public Result adminDelete(@PathVariable Integer id) {
+ log.info("delete request:{}", id);
+// userService.deleteUser(user.getId());
+ return Result.success(CommonResponse.factory("删除成功"));
+ }
+
+ @GetMapping("/admin/user/{id}")
+ public Result adminGetById(@PathVariable Integer id) {
+ log.info("selectById request:{}", id);
+ User user = userService.selectById(id);
+ return Result.success(user);
+ }
+
+
+
+ @Data
+ public static class RegisterRequest {
+ private String username;
+ private String password;
+ private String email;
+ private String grade;
+ private String group;
+ }
+
+ @Data
+ public static class LoginRequest {
+ public String username;
+ public String password;
+ }
+
+ @Data
+ public static class LoginResponse {
+ public String token;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/top/suyiiyii/sims/dto/CommonResponse.java b/src/main/java/top/suyiiyii/sims/dto/CommonResponse.java
new file mode 100644
index 0000000..dac2ea3
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/dto/CommonResponse.java
@@ -0,0 +1,16 @@
+package top.suyiiyii.sims.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CommonResponse {
+ String message;
+
+ public static CommonResponse factory(String message) {
+ return new CommonResponse(message);
+ }
+}
diff --git a/src/main/java/top/suyiiyii/sims/dto/RecordDto.java b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java
new file mode 100644
index 0000000..d0e4104
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java
@@ -0,0 +1,42 @@
+package top.suyiiyii.sims.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RecordDto {
+ private Integer id;
+ // 用户ID
+ private Integer userId;
+ // 奖惩类型
+ private String type;
+ // 奖惩类别ID
+ private Integer categoryId;
+ // 奖惩日期
+ private LocalDateTime date;
+ // 奖惩内容
+ private String content;
+ // 奖惩原因
+ private String reason;
+ // 奖惩金额
+ private Double amount;
+ // 奖惩备注
+ private String remark;
+ // 是否撤销
+ private Boolean isRevoked;
+ // 撤销日期
+ private LocalDateTime revokeDate;
+ // 撤销原因
+ private String revokeReason;
+ // 撤销备注
+ private String revokeRemark;
+ // 操作人ID
+ private Integer operatorUserId;
+ // 最近一次更新时间
+ private LocalDateTime lastUpdateTime;
+}
diff --git a/src/main/java/top/suyiiyii/sims/dto/UserDto.java b/src/main/java/top/suyiiyii/sims/dto/UserDto.java
new file mode 100644
index 0000000..3ad3334
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/dto/UserDto.java
@@ -0,0 +1,21 @@
+package top.suyiiyii.sims.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/15 15:36
+ * @PackageName:top.suyiiyii.sims.dto
+ * @ClassName: UserDto
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class UserDto {
+ private Long userId;
+ private String username;
+ private List roles; // 角色名称列表
+ private List permissions; // 权限列表
+}
diff --git a/src/main/java/top/suyiiyii/sims/entity/Attachment.java b/src/main/java/top/suyiiyii/sims/entity/Attachment.java
index 1a3f602..c9606c4 100644
--- a/src/main/java/top/suyiiyii/sims/entity/Attachment.java
+++ b/src/main/java/top/suyiiyii/sims/entity/Attachment.java
@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @Author tortoise
@@ -16,7 +18,10 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class Attachment {
+ @TableId("id")
private Integer id;
private Integer recordId;
// 文件路径
diff --git a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java
index a0f2724..def612c 100644
--- a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java
+++ b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java
@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @Author tortoise
@@ -16,8 +18,10 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class HierarchyRelation {
-
+ @TableId("id")
private Integer id;
// 上级用户ID
diff --git a/src/main/java/top/suyiiyii/sims/entity/Notification.java b/src/main/java/top/suyiiyii/sims/entity/Notification.java
index 402b5b0..d3a5779 100644
--- a/src/main/java/top/suyiiyii/sims/entity/Notification.java
+++ b/src/main/java/top/suyiiyii/sims/entity/Notification.java
@@ -1,7 +1,10 @@
package top.suyiiyii.sims.entity;
+import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@@ -15,7 +18,10 @@ import java.time.LocalDateTime;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class Notification {
+ @TableId("id")
private Integer id;
private String title;
private String content;
diff --git a/src/main/java/top/suyiiyii/sims/entity/Permissions.java b/src/main/java/top/suyiiyii/sims/entity/Permissions.java
index 33c19f2..2575033 100644
--- a/src/main/java/top/suyiiyii/sims/entity/Permissions.java
+++ b/src/main/java/top/suyiiyii/sims/entity/Permissions.java
@@ -3,7 +3,11 @@ package top.suyiiyii.sims.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Objects;
/**
* @Author tortoise
@@ -15,12 +19,28 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class Permissions {
-
+ @TableId("id")
private Integer id;
//权限id
private Integer permissionId;
+
+ private String path;
// 权限描述
private String description;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Permissions that = (Permissions) o;
+ return Objects.equals(path, that.path);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(path);
+ }
}
diff --git a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentRecord.java b/src/main/java/top/suyiiyii/sims/entity/Record.java
similarity index 85%
rename from src/main/java/top/suyiiyii/sims/entity/RewardPunishmentRecord.java
rename to src/main/java/top/suyiiyii/sims/entity/Record.java
index 6081c68..c6e8d9d 100644
--- a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentRecord.java
+++ b/src/main/java/top/suyiiyii/sims/entity/Record.java
@@ -1,10 +1,10 @@
package top.suyiiyii.sims.entity;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@@ -12,14 +12,16 @@ import java.time.LocalDateTime;
* @Author tortoise
* @Date 2024/8/9 14:04
* @PackageName:top.suyiiyii.sims.entity
- * @ClassName: RewardPunishmentRecord
+ * @ClassName: Record
* @Description: TODO
* @Version 1.0
*/
@Data
@Table
-public class RewardPunishmentRecord {
-
+@AllArgsConstructor
+@NoArgsConstructor
+public class Record {
+ @TableId("id")
private Integer id;
// 用户ID
private Integer userId;
diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java
index 66b8b34..f72ccc7 100644
--- a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java
+++ b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java
@@ -1,7 +1,10 @@
package top.suyiiyii.sims.entity;
+import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@@ -15,8 +18,10 @@ import java.time.LocalDateTime;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class RevokeRequest {
-
+ @TableId("id")
private Integer id;
private Integer recordId;
private Integer userId;
diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java
index 4dc5b2e..1fa6277 100644
--- a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java
+++ b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java
@@ -1,7 +1,10 @@
package top.suyiiyii.sims.entity;
+import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@@ -15,8 +18,10 @@ import java.time.LocalDateTime;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class RevokedRecord {
-
+ @TableId("id")
private Integer id;
// 被撤销的奖惩记录ID
private Integer recordId;
diff --git a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java b/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java
index 02b052a..8b705f7 100644
--- a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java
+++ b/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java
@@ -3,7 +3,9 @@ package top.suyiiyii.sims.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @Author tortoise
@@ -15,8 +17,10 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class RewardPunishmentCategory {
-
+ @TableId("id")
private Integer id;
private Integer categoryId;
diff --git a/src/main/java/top/suyiiyii/sims/entity/Role.java b/src/main/java/top/suyiiyii/sims/entity/Role.java
index 0b1b59f..78897ed 100644
--- a/src/main/java/top/suyiiyii/sims/entity/Role.java
+++ b/src/main/java/top/suyiiyii/sims/entity/Role.java
@@ -3,20 +3,24 @@ package top.suyiiyii.sims.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @Author tortoise
* @Date 2024/8/9 14:02
* @PackageName:top.suyiiyii.sims.entity
- * @ClassName: Role
+ * @ClassName: RoleMapper
* @Description: TODO
* @Version 1.0
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class Role {
-
+ @TableId("id")
private Integer id;
private Integer roleId;
//管理员,普通用户,组员,组长,队长
diff --git a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java
index 02b863b..f838187 100644
--- a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java
+++ b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java
@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.security.Permission;
@@ -18,8 +20,11 @@ import java.security.Permission;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class RolePermission {
- private Integer rolePermissionId;
+ @TableId("id")
+ private Integer id;
private Integer roleId;
private Integer permissionId;
}
diff --git a/src/main/java/top/suyiiyii/sims/entity/User.java b/src/main/java/top/suyiiyii/sims/entity/User.java
index ab369d2..6606503 100644
--- a/src/main/java/top/suyiiyii/sims/entity/User.java
+++ b/src/main/java/top/suyiiyii/sims/entity/User.java
@@ -1,10 +1,13 @@
package top.suyiiyii.sims.entity;
-import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Set;
/**
* @Author tortoise
@@ -16,14 +19,19 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class User {
-
+ @TableId("id")
private Integer id;
- private Integer userId;
+ private Integer studentId;
private String username;
private String password;
- private String name;
private String email;
+ private String grade;
private String group;
-
+ @TableField(exist = false)
+ private String token;
+ @TableField(exist = false)
+ private Set permissions;
}
diff --git a/src/main/java/top/suyiiyii/sims/entity/UserRole.java b/src/main/java/top/suyiiyii/sims/entity/UserRole.java
index 7d82f6d..323df76 100644
--- a/src/main/java/top/suyiiyii/sims/entity/UserRole.java
+++ b/src/main/java/top/suyiiyii/sims/entity/UserRole.java
@@ -3,7 +3,9 @@ package top.suyiiyii.sims.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.tangzc.mpe.autotable.annotation.Table;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @Author tortoise
@@ -15,8 +17,10 @@ import lombok.Data;
*/
@Data
@Table
+@AllArgsConstructor
+@NoArgsConstructor
public class UserRole {
-
+ @TableId("id")
private Integer id;
private Integer userId;
private Integer roleId;
diff --git a/src/main/java/top/suyiiyii/sims/exception/GlobalException.java b/src/main/java/top/suyiiyii/sims/exception/GlobalException.java
new file mode 100644
index 0000000..fc85068
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/exception/GlobalException.java
@@ -0,0 +1,23 @@
+package top.suyiiyii.sims.exception;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import top.suyiiyii.sims.common.Result;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/11 1:38
+ * @PackageName:top.suyiiyii.sims.exception
+ * @ClassName: GlobalException
+ * @Description: TODO
+ * @Version 1.0
+ */
+@ControllerAdvice
+public class GlobalException {
+ @ExceptionHandler(ServiceException.class)
+ @ResponseBody
+ public Result ServiceException(ServiceException e){
+ return Result.error(e.getCode(),e.getMessage());
+ }
+}
diff --git a/src/main/java/top/suyiiyii/sims/exception/ServiceException.java b/src/main/java/top/suyiiyii/sims/exception/ServiceException.java
new file mode 100644
index 0000000..0b3e6d5
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/exception/ServiceException.java
@@ -0,0 +1,25 @@
+package top.suyiiyii.sims.exception;
+
+import lombok.Getter;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/11 1:38
+ * @PackageName:top.suyiiyii.sims.exception
+ * @ClassName: ServiceException
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Getter
+public class ServiceException extends RuntimeException{
+ public final String code;
+
+ public ServiceException(String msg){
+ super(msg);
+ this.code = "500";
+ }
+ public ServiceException(String code ,String msg){
+ super(msg);
+ this.code = code;
+ }
+}
diff --git a/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java b/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java
new file mode 100644
index 0000000..dffca5c
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java
@@ -0,0 +1,25 @@
+package top.suyiiyii.sims.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import top.suyiiyii.sims.entity.Permissions;
+import top.suyiiyii.sims.entity.RolePermission;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/14 16:14
+ * @PackageName:top.suyiiyii.sims.mapper
+ * @ClassName: PermissionsMapper
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Mapper
+public interface PermissionsMapper {
+@Select("SELECT * FROM role_permission WHERE role_id = #{id}")
+ List getRolePerminsionByRoleId(Integer id);
+@Select("SELECT * FROM permissions WHERE permission_id = #{permissionId}")
+ Permissions selectById(Integer permissionId);
+}
diff --git a/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java
new file mode 100644
index 0000000..d22fbfe
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java
@@ -0,0 +1,58 @@
+package top.suyiiyii.sims.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import lombok.Data;
+import org.apache.ibatis.annotations.*;
+import top.suyiiyii.sims.entity.Permissions;
+import top.suyiiyii.sims.entity.Role;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.entity.UserRole;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/14 14:13
+ * @PackageName:top.suyiiyii.sims.mapper
+ * @ClassName: RoleMapper
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Mapper
+public interface RoleMapper {
+ @Insert("INSERT INTO role(name) VALUES(#{name}")
+ void addRole(String name);
+@Delete("DELETE FROM role WHERE name=#{name}")
+ void deleteRole(String name);
+@Update("UPDATE role SET name=#{newName} WHERE name=#{name}")
+ void updateRole(String name, String newName);
+ /**
+ * @author: tortoise
+ * @date: 2024/8/14 14:23
+ * @Description: TODO 查询用户信息
+ * @param
+ * @return: java.util.List
+ */
+ @Select("SELECT u.username, u.name, u.userId, r.role_name " +
+ "FROM user u " +
+ "LEFT JOIN user_role ur ON u.user_id = ur.user_id " +
+ "LEFT JOIN role r ON ur.role_id = r.role_id")
+ @Results({
+ @Result(property = "username", column = "username"),
+ @Result(property = "name", column = "name"),
+ @Result(property = "userId", column = "userId"),
+ @Result(property = "group", column = "group"),
+ @Result(property = "roles", column = "role_name", many = @Many(select = "selectRolesByUser"))
+ })
+ List selectAllUsersWithRoles();
+
+ // 根据用户ID查询角色
+ @Select("SELECT role_id, role_name " +
+ "FROM role " +
+ "WHERE role_id IN " +
+ "(SELECT role_id FROM user_role WHERE user_id = #{user_id})")
+ List selectRolesById(@Param("user_id") int id);
+
+@Select("SELECT role_name FROM role WHERE role_id=#{roleId}")
+ List selectRoleNamesByRoleId(Integer roleId);
+}
diff --git a/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java b/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java
new file mode 100644
index 0000000..8d7746a
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java
@@ -0,0 +1,77 @@
+package top.suyiiyii.sims.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.*;
+import top.suyiiyii.sims.entity.Role;
+import top.suyiiyii.sims.entity.User;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/10 22:21
+ * @PackageName:top.suyiiyii.sims.mapper
+ * @ClassName: UserMapper
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Mapper
+public interface UserMapper extends BaseMapper {
+ /**
+ * 添加新用户
+ * @param user 新用户对象
+ * @return 影响的行数
+ */
+ @Insert("insert INTO user (id,user_id, username, password, name, email, `group`) VALUES (#{id},#{userId}, #{username}, #{password}, #{name}, #{email}, #{group})")
+ int addUser(User user);
+
+ /**
+ * 根据ID删除用户
+ * @param id 用户ID
+ * @return 影响的行数
+ */
+ @Delete("DELETE FROM user WHERE id = #{id}")
+ int deleteUser(Integer id);
+
+ /**
+ * 更新用户信息
+ * @param user 更新后的用户对象
+ * @return 影响的行数
+ */
+ @Update("UPDATE user SET " +
+ "user_id = #{userId}, " +
+ "username = #{username}, " +
+ "name = #{name}, " +
+ "email = #{email}, " +
+ "`group` = #{group} " +
+ "WHERE id = #{id}")
+ int updateUser(User user);
+
+ /**
+ * 根据ID查询用户信息
+ * @param id 用户ID
+ * @return 用户对象
+ */
+ @Select("SELECT id, user_id, username, password, name, email, `group` from user WHERE id = #{Id}")
+ User selectByUserId(Integer userId);
+
+ /**
+ * 根据iD查询用户信息
+ * @param
+ * @return 用户对象
+ */
+ @Select("SELECT id, user_id, username, password, name, email, `group` from user WHERE id = #{Id}")
+ User selectById(Integer Id);
+ /**
+ * 查询所有用户信息
+ * @return 用户列表
+ */
+ @Select("SELECT id, user_id, username, password, name, email,grade, `group` FROM user")
+ List selectAll();
+
+ @Select("select * from user where username = #{username}")
+ User selectByUserName(@Param("username") String username);
+@Update("update user set password = #{password} where username = #{username}")
+ void updatePassword(User user);
+
+}
diff --git a/src/main/java/top/suyiiyii/sims/service/RoleService.java b/src/main/java/top/suyiiyii/sims/service/RoleService.java
new file mode 100644
index 0000000..b8cdd70
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/service/RoleService.java
@@ -0,0 +1,49 @@
+package top.suyiiyii.sims.service;
+
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import top.suyiiyii.sims.entity.Role;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.entity.UserRole;
+import top.suyiiyii.sims.mapper.RoleMapper;
+
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/14 14:14
+ * @PackageName:top.suyiiyii.sims.service
+ * @ClassName: RoleService
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Service
+public class RoleService {
+ @Autowired
+ RoleMapper roleMapper;
+ public void addRole(String name){
+ roleMapper.addRole(name);
+ }
+ public void deleteRole(String name){
+ roleMapper.deleteRole(name);
+ }
+ public void updateRole(String name,String newName){
+ roleMapper.updateRole(name,newName);
+ }
+ public List findAllUsersWithRoles(){
+ return roleMapper.selectAllUsersWithRoles();
+ }
+ /**
+ * @author: tortoise
+ * @date: 2024/8/14 14:39
+ * @Description: TODO 查看自己身份
+ * @param Id
+ * @return: java.util.List
+ */
+ List selectRolesById(int id){
+ return roleMapper.selectRolesById(id);
+ }
+
+
+}
diff --git a/src/main/java/top/suyiiyii/sims/service/UserService.java b/src/main/java/top/suyiiyii/sims/service/UserService.java
new file mode 100644
index 0000000..0dba25d
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/service/UserService.java
@@ -0,0 +1,142 @@
+package top.suyiiyii.sims.service;
+
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import top.suyiiyii.sims.VO.UserVO;
+import top.suyiiyii.sims.entity.*;
+import top.suyiiyii.sims.exception.ServiceException;
+import top.suyiiyii.sims.mapper.PermissionsMapper;
+import top.suyiiyii.sims.mapper.RoleMapper;
+import top.suyiiyii.sims.mapper.UserMapper;
+import top.suyiiyii.sims.utils.JwtUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/10 22:22
+ * @PackageName:top.suyiiyii.sims.service
+ * @ClassName: UserService
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Service
+public class UserService {
+ @Autowired
+ UserMapper userMapper;
+ @Autowired
+ RoleMapper roleMapper;
+ @Autowired
+ PermissionsMapper permissionsMapper;
+
+ public void addUser(User user) {
+ userMapper.addUser(user);
+ }
+
+ public User selectById(int id) {
+ return userMapper.selectById(id);
+ }
+
+ public void updateUser(User user) {
+ userMapper.updateUser(user);
+ }
+
+ public void deleteUser(int id) {
+ userMapper.deleteUser(id);
+ }
+
+ public List selectAll() {
+ return userMapper.selectAll();
+ }
+//TODO:返回一个DTO,用户基本信息
+ public User login(String username, String password) {
+ User dbUser = userMapper.selectByUserName(username);
+ if (dbUser == null) {
+ throw new ServiceException("账号不存在");
+ }
+ if (!dbUser.getPassword().equals(password)) {
+ throw new ServiceException("密码或用户名错误");
+ }
+ HashSet permissionsSet = new HashSet<>();
+ Integer id = dbUser.getId();
+ List UserRoles = roleMapper.selectRolesById(id);
+ for (UserRole userRole : UserRoles) {
+ //根据roleid找所有permissionId
+ List rolePerminsion = permissionsMapper.getRolePerminsionByRoleId(userRole.getRoleId());
+ for (RolePermission rolePermission : rolePerminsion) {
+ Integer permissionId = rolePermission.getPermissionId();
+ //根据permissionId找permission
+ Permissions permissions = permissionsMapper.selectById(permissionId);
+ permissionsSet.add(permissions);
+ }
+ }
+ dbUser.setPermissions(permissionsSet);
+
+ String token = JwtUtils.createToken(dbUser.getId().toString(), dbUser.getPassword());
+ dbUser.setToken(token);
+ return dbUser;
+ }
+
+ public User register(User user) {
+
+ User dbUser = userMapper.selectByUserId(user.getStudentId());
+
+ if (user.getUsername() == null || user.getUsername().equals("")) {
+ throw new ServiceException("用户名不能为空");
+ }
+ if (dbUser != null) {
+ throw new ServiceException("账号已经存在");
+ }
+ if (user.getStudentId() == null || user.getStudentId().equals("")) {
+ throw new ServiceException("用户id不能为空");
+ }
+ if( user.getPassword() == null || user.getPassword().equals("")) {
+ throw new ServiceException("密码不能为空");
+ }
+ if (user.getEmail() == null || user.getEmail().equals("")) {
+ throw new ServiceException("邮箱不能为空");
+ }
+ if (user.getGroup() == null || user.getGroup().equals("")) {
+ throw new ServiceException("组别不能为空");
+ }
+
+ userMapper.addUser(user);
+ return user;
+ }
+ public User selectByUsername(String username) {
+ return userMapper.selectByUserName(username);
+ }
+ public void updatePassword(User user) {
+ userMapper.updatePassword(user);
+ }
+ public List findAllUsers(){
+ List users = userMapper.selectAll();
+ List userVOS = new ArrayList<>();
+
+ for (User user : users) {
+ UserVO userVO = new UserVO();
+ userVO.setUserId(user.getId());
+ userVO.setUsername(user.getUsername());
+ userVO.setGrade(user.getGrade());
+ userVO.setGroup(user.getGroup());
+ userVO.setRoles(new ArrayList<>());
+ Integer id = user.getId();
+ List userRoles = roleMapper.selectRolesById(id);
+ for (UserRole userRole : userRoles) {
+ Integer roleId = userRole.getRoleId();
+ // 获取一个角色的名称列表
+ List roleNameList = roleMapper.selectRoleNamesByRoleId(roleId);
+ // 累加角色名称到用户的角色列表中
+ userVO.getRoles().addAll(roleNameList);
+ }
+ userVOS.add(userVO);
+ }
+ return userVOS;
+ }
+
+}
diff --git a/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java b/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java
new file mode 100644
index 0000000..cf050e0
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java
@@ -0,0 +1,85 @@
+package top.suyiiyii.sims.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import top.suyiiyii.sims.entity.User;
+import top.suyiiyii.sims.mapper.UserMapper;
+
+import java.util.Date;
+
+/**
+ * @Author tortoise
+ * @Date 2024/8/12 11:44
+ * @PackageName:top.suyiiyii.sims.utils
+ * @ClassName: JwtUtils
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Component
+public class JwtUtils {
+ private static UserMapper staticUserMapper;
+ @Resource
+ UserMapper userMapper;
+ @PostConstruct
+ public void setUserService() {
+ staticUserMapper=userMapper;
+ }
+
+ /**
+ * @author: tortoise
+ * @date: 2024/8/1 15:12
+ * @Description: 生成token
+ * @param userId
+ * @param sign
+ * @return: java.lang.String
+ */
+ public static String createToken(String userId, String sign) {
+ return JWT.create()
+ .withAudience(userId)
+ .withExpiresAt(DateUtil.offsetHour(new Date(), 2))
+ .sign(Algorithm.HMAC256(sign));
+ // 设置令牌过期时间为2小时
+ }
+ public static User getCurrentUser() {
+ try {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ String token = request.getHeader("token");
+ if (StrUtil.isNotBlank(token)) {
+ String userId = JWT.decode(token).getAudience().get(0);
+ return staticUserMapper.selectById(Integer.valueOf(userId));
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ return null;
+ }
+ // 验证 JWT 令牌
+ public static boolean verifyToken(String token, String secret) {
+ try {
+ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build(); // 创建 JWT 验证器
+ jwtVerifier.verify(token); // 验证令牌
+ return true;
+ } catch (JWTDecodeException e) {
+ // 处理异常或记录日志
+ return false;
+ }
+ }
+ public static String extractUserId(String token) {
+ try {
+ return JWT.decode(token).getAudience().get(0); // 从 token 中提取用户ID
+ } catch (JWTDecodeException e) {
+ // 处理异常或记录日志
+ return null;
+ }
+ }
+}