From c00d979e9167be3880b2bdfb9fb6b9082d49ca3c Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 01:42:40 +0800 Subject: [PATCH 01/14] =?UTF-8?q?RBAC=20=E4=BC=98=E5=8C=96=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(common): 整理拦截器配置和JWT拦截器实现 * feat(auth): 将权限信息使用注解的形式固定在接口上 * feat(rbac): stash * fix(GlobalException): 在ServiceException处理中添加日志记录 在全局异常处理器中为ServiceException添加错误日志记录,以提高错误跟踪的可观察性。现在,当捕获到ServiceException时,将记录错误消息。 更改包含: - 导入lombok.extern.slf4j.Slf4j注解以启用日志记录功能。 - 使用@Slf4j注解GlobalException类。- 在ServiceException的@ExceptionHandler方法中添加日志记录语句。 * feat(auth): 实现RBAC,调整JWT验证,更新用户服务和控制器 * 为所有接口添加权限注解 * 删除没有必要的接口 * 删除过期的测试 * refactor(entity): 使用MyBatis-Plus和AutoTable注解重新定义主键和注释 - 重构`Role`, `RolePermission`, `User`, 和`UserRole`实体类,统一使用`@ColumnId`注解代替`@TableId`,并为各实体类的字段添加了相应的注释。- 为`Role`实体类的`roleId`和`roleName`字段,`RolePermission`的`roleId`和`permissionId`字段,`User`实体类的`studentId`, `username`, `password`, `email`, `grade`, 和`userGroup`字段,以及`UserRole`的`userId`和`roleId`字段添加了`@ColumnNotNull`注解,以强化字段的非空约束。 * refactor(jwt-interceptor):精简无效的JWT,提高检查效率 调整JwtInterceptor以精简无效的JWT检查逻辑。实现对JWT效验和用户ID提取的优化,避免不必要的数据库查询。refactor(role): 使用自定义注解替换MyBatis Plus注解并移除冗余字段 通过自定义注解替换MyBatis Plus注解,以整理和优化实体类定义。删除了Role类中的冗余字段,如'tag',以及未使用的imports。 refactor(user-service): 使用ModelMapper简化对象映射,重构注册逻辑引入ModelMapper以简化User对象和DTO之间的映射操作。重构UserService中的用户注册逻辑,使用ModelMapper进行对象转换,减少手动设置属性的需求。 fix(user-controller):调整用户注册请求参数,统一数据类型 调整UserController中的注册请求参数,将'studentId'和'userGroup'的类型与现有代码库保持一致,以便正确进行参数传递和处理。 feat(user-service): 实现rbacService集成,增强用户注册流程 在UserService中集成rbacService,以在用户注册时为新用户分配默认角色。优化了用户注册流程,并简化了权限和角色的管理。 BREAKING CHANGE: 对UserRole逻辑的改动可能会影响现有的用户权限和角色分配。请确保在更新代码后进行 * 修复测试配置 --- .../top/suyiiyii/sims/common/AuthAccess.java | 1 + .../sims/common/InterceptorConfig.java | 77 +++++------------- .../suyiiyii/sims/common/JwtInterceptor.java | 58 ++++++-------- .../suyiiyii/sims/common/RbacInterceptor.java | 64 +++++++++++++++ .../sims/controller/AdminController.java | 3 + .../sims/controller/HealthzController.java | 3 + .../sims/controller/HelloController.java | 27 ------- .../sims/controller/RecordController.java | 6 ++ .../sims/controller/UserController.java | 25 +++--- .../java/top/suyiiyii/sims/entity/Role.java | 11 ++- .../suyiiyii/sims/entity/RolePermission.java | 6 +- .../java/top/suyiiyii/sims/entity/User.java | 12 ++- .../top/suyiiyii/sims/entity/UserRole.java | 6 +- .../sims/exception/GlobalException.java | 9 ++- .../suyiiyii/sims/mapper/MpRoleMapper.java | 7 ++ .../sims/mapper/MpUserRoleMapper.java | 7 ++ .../top/suyiiyii/sims/mapper/UserMapper.java | 12 +-- .../suyiiyii/sims/service/RbacService.java | 55 +++++++++++++ .../suyiiyii/sims/service/UserService.java | 79 +++++++++---------- src/main/resources/application-test.yaml | 3 +- src/main/resources/application.yaml | 5 +- .../suyiiyii/sims/mapper/UserMapperTest.java | 33 -------- .../sims/service/RbacServiceTest.java | 35 ++++++++ 23 files changed, 313 insertions(+), 231 deletions(-) create mode 100644 src/main/java/top/suyiiyii/sims/common/RbacInterceptor.java delete mode 100644 src/main/java/top/suyiiyii/sims/controller/HelloController.java create mode 100644 src/main/java/top/suyiiyii/sims/mapper/MpRoleMapper.java create mode 100644 src/main/java/top/suyiiyii/sims/mapper/MpUserRoleMapper.java create mode 100644 src/main/java/top/suyiiyii/sims/service/RbacService.java delete mode 100644 src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java create mode 100644 src/test/java/top/suyiiyii/sims/service/RbacServiceTest.java diff --git a/src/main/java/top/suyiiyii/sims/common/AuthAccess.java b/src/main/java/top/suyiiyii/sims/common/AuthAccess.java index 65ad38f..9ec5ccd 100644 --- a/src/main/java/top/suyiiyii/sims/common/AuthAccess.java +++ b/src/main/java/top/suyiiyii/sims/common/AuthAccess.java @@ -14,4 +14,5 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AuthAccess { + String[] allowRoles() default {}; } diff --git a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java index 5becb7b..ee3e9ac 100644 --- a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java +++ b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java @@ -1,16 +1,10 @@ package top.suyiiyii.sims.common; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import top.suyiiyii.sims.service.RoleService; -import top.suyiiyii.sims.service.UserService; -import top.suyiiyii.sims.utils.JwtUtils; /** * @Author tortoise @@ -20,63 +14,28 @@ import top.suyiiyii.sims.utils.JwtUtils; * @Description: TODO 拦截器配置 * @Version 1.0 */ - @Configuration - public class InterceptorConfig extends WebMvcConfigurationSupport { +@Configuration +public class InterceptorConfig extends WebMvcConfigurationSupport { @Autowired - private RoleService roleService; + private RoleService roleService; + @Autowired + private JwtInterceptor jwtInterceptor; + @Autowired + private RbacInterceptor rbacInterceptor; - //UserService userService; - @Override - protected void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(jwtInterceptor()) - .addPathPatterns("/**") - .excludePathPatterns("/user/login") // 排除不需要验证的路径 - .excludePathPatterns("/user/register") - .excludePathPatterns("/v3/api-docs/**"); + @Override + protected void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(jwtInterceptor) + .addPathPatterns("/**") + .excludePathPatterns("/v3/api-docs/**"); + registry.addInterceptor(rbacInterceptor) + .excludePathPatterns("/v3/api-docs/**");; - // 注册AdminInterceptor,只拦截以admin/开头的路径 - registry.addInterceptor(new AdminInterceptor()) - .addPathPatterns("/admin/**"); - super.addInterceptors(registry); - } - - @Bean - public JwtInterceptor jwtInterceptor() { - return new JwtInterceptor(); - } - - // AdminInterceptor的实现 - public class AdminInterceptor implements HandlerInterceptor { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String path = request.getRequestURI(); - if (path.startsWith("/admin/") && !hasAdminPermission(request)) { - // 如果用户没有管理员权限,返回403 Forbidden - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - return false; - } - return true; - } - - private boolean hasAdminPermission(HttpServletRequest request) { - // 这里应该实现检查用户权限的逻辑 - // 例如,从session、token或者数据库中获取用户信息并判断权限 - // 以下仅为示例 - String token = (String) request.getAttribute("token"); - //非空 - if (token == null) { - return false; - } - try { - Integer userId = Integer.valueOf(JwtUtils.extractUserId(token)); - return roleService.isRoleNameAdmin(userId); - } catch (Exception e) { - // 处理令牌解析过程中可能出现的异常 - return false; - } - } - } + super.addInterceptors(registry); } + +} + diff --git a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java index a946758..e7333ac 100644 --- a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java +++ b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java @@ -1,16 +1,15 @@ 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.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; 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; +import java.util.Objects; + /** * @Author tortoise * @Date 2024/8/12 11:33 @@ -20,49 +19,36 @@ import top.suyiiyii.sims.utils.JwtUtils; * @Version 1.0 */ +@Component public class JwtInterceptor implements HandlerInterceptor { - @Resource - UserMapper userMapper; + @Value("${jwt.secret}") + private String secret; + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if ("/error".equals(request.getRequestURI())) { + return true; + } // 从 Authorization 头中获取 token String token = request.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { - token = token.substring(7); // 去除 "Bearer " 前缀 + token = token.substring(7); } else { - // 如果 Authorization 头中没有 token,则尝试从请求参数中获取 - token = request.getParameter("token"); - } - // 如果不是映射到方法直接通过 - if (handler instanceof HandlerMethod) { - AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class); - if (annotation != null) { - return true; - } - } - // 执行认证 - 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,设置userId为-1,表示未登录 + request.setAttribute("userId", -1); + return true; } // 验证 token 的有效性 - if (!JwtUtils.verifyToken(token, user.getPassword())) { - throw new ServiceException("401", "请登录"); + if (!JwtUtils.verifyToken(token, secret) || JwtUtils.extractUserId(token) == null) { + throw new ServiceException("401", "登录已过期,请重新登录"); } - // 验证token后,如果一切正常,将token存储到request的属性中 - request.setAttribute("token", token); + + // 获取 token 中的 user id + Integer userId = Integer.parseInt(Objects.requireNonNull(JwtUtils.extractUserId(token))); + + request.setAttribute("userId", userId); return true; } } diff --git a/src/main/java/top/suyiiyii/sims/common/RbacInterceptor.java b/src/main/java/top/suyiiyii/sims/common/RbacInterceptor.java new file mode 100644 index 0000000..35ec723 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/common/RbacInterceptor.java @@ -0,0 +1,64 @@ +package top.suyiiyii.sims.common; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import top.suyiiyii.sims.entity.Role; +import top.suyiiyii.sims.exception.ServiceException; +import top.suyiiyii.sims.service.RbacService; + +import java.util.List; + +/** + * Rbac 拦截器 + * 从请求对象中获取用户信息,然后判断用户是否有权限访问当前路径 + */ +@Component +public class RbacInterceptor implements HandlerInterceptor { + + @Autowired + RbacService rbacService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if ("/error".equals(request.getRequestURI())) { + return true; + } + // 获取用户角色 + List roles = getUserRole(request).stream().map(Role::getRoleName).toList(); + + List allowRoles = null; + + // 获取当前请求的方法上的 AuthAccess 注解,从而获取允许访问的角色 + if (handler instanceof HandlerMethod) { + AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class); + if (annotation != null) { + allowRoles = List.of(annotation.allowRoles()); + } + } + + if (allowRoles != null && !allowRoles.isEmpty()) { + if (allowRoles.contains("guest")) { + return true; + } + for (String role : roles) { + if (allowRoles.contains(role)) { + return true; + } + } + } + throw new ServiceException("403", "权限不足"); + } + + private List getUserRole(HttpServletRequest request) { + Integer UserId = (Integer) request.getAttribute("userId"); + if (UserId == null || UserId == -1) { + return List.of(Role.guest()); + } + return rbacService.getRolesByUserId(UserId); + } + +} diff --git a/src/main/java/top/suyiiyii/sims/controller/AdminController.java b/src/main/java/top/suyiiyii/sims/controller/AdminController.java index 3beb4bd..7b1b17b 100644 --- a/src/main/java/top/suyiiyii/sims/controller/AdminController.java +++ b/src/main/java/top/suyiiyii/sims/controller/AdminController.java @@ -4,6 +4,7 @@ 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.AuthAccess; import top.suyiiyii.sims.common.Result; import top.suyiiyii.sims.entity.User; import top.suyiiyii.sims.service.RoleService; @@ -27,12 +28,14 @@ public class AdminController { @Autowired private UserService userService; + @AuthAccess(allowRoles = {"admin"}) @GetMapping("/findAllUsersWithRoles") public Result findAllUsersWithRoles() { List userList = roleService.findAllUsersWithRoles(); return Result.success(userList); } + @AuthAccess(allowRoles = {"admin"}) @GetMapping("/selectAll") public Result selectAll() { List users = userService.selectAll(); diff --git a/src/main/java/top/suyiiyii/sims/controller/HealthzController.java b/src/main/java/top/suyiiyii/sims/controller/HealthzController.java index e3724b2..34010a3 100644 --- a/src/main/java/top/suyiiyii/sims/controller/HealthzController.java +++ b/src/main/java/top/suyiiyii/sims/controller/HealthzController.java @@ -5,14 +5,17 @@ import lombok.Data; 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.AuthAccess; @RestController public class HealthzController { + @AuthAccess(allowRoles = {"guest"}) @GetMapping("/healthz") public String healthz() { return "ok"; } + @AuthAccess(allowRoles = {"guest"}) @PostMapping("/healthz") public HealthzResponse healthzPost() { return new HealthzResponse("health"); diff --git a/src/main/java/top/suyiiyii/sims/controller/HelloController.java b/src/main/java/top/suyiiyii/sims/controller/HelloController.java deleted file mode 100644 index 9962cad..0000000 --- a/src/main/java/top/suyiiyii/sims/controller/HelloController.java +++ /dev/null @@ -1,27 +0,0 @@ -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; - -@RestController -public class HelloController { - - @GetMapping("/hello") - public String hello(String username) { - return "Hello " + username; - } - @PostMapping("/hello") - public List helloPost(String username , Integer age) { - 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 index 52e18ea..40b5ffc 100644 --- a/src/main/java/top/suyiiyii/sims/controller/RecordController.java +++ b/src/main/java/top/suyiiyii/sims/controller/RecordController.java @@ -10,6 +10,7 @@ import org.modelmapper.ModelMapper; 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.dto.RecordDto; @@ -44,6 +45,7 @@ RecordController { @Autowired ModelMapper modelMapper; + @AuthAccess(allowRoles = {"admin"}) @Operation(summary = "获取所有奖惩记录") @GetMapping("/admin/record") public Result> adminRecord( @@ -61,6 +63,7 @@ RecordController { return Result.success(recordDtos); } + @AuthAccess(allowRoles = {"user"}) @Operation(summary = "获取自己的奖惩记录") @GetMapping("/record") public Result> record(@RequestParam(defaultValue = "0") int page, @@ -84,6 +87,7 @@ RecordController { } + @AuthAccess(allowRoles = {"admin"}) @Operation(summary = "更新单个奖惩记录") @PutMapping("/admin/record/{id}") public Result adminUpdateRecord(@PathVariable Integer id, @RequestBody RecordDto recordDto) { @@ -92,6 +96,7 @@ RecordController { return Result.msg("修改成功"); } + @AuthAccess(allowRoles = {"admin"}) @Operation(summary = "删除单个奖惩记录") @DeleteMapping("/admin/record/{id}") public Result adminDeleteRecord(@PathVariable Integer id) { @@ -100,6 +105,7 @@ RecordController { } + @AuthAccess(allowRoles = {"admin"}) @Operation(summary = "添加奖惩记录") @PostMapping("/admin/record") public Result adminAddRecord(@RequestBody RecordDto recordDto) { diff --git a/src/main/java/top/suyiiyii/sims/controller/UserController.java b/src/main/java/top/suyiiyii/sims/controller/UserController.java index c9e0362..80c34a3 100644 --- a/src/main/java/top/suyiiyii/sims/controller/UserController.java +++ b/src/main/java/top/suyiiyii/sims/controller/UserController.java @@ -38,14 +38,7 @@ public class UserController { RoleService roleService; - @AuthAccess - @GetMapping("/") - public Result hello() { - - return Result.success("success"); - - } - + @AuthAccess(allowRoles = {"guest"}) @PostMapping("/user/login") public Result login(@RequestBody LoginRequest request, HttpServletRequest httpServletRequest) { log.info("login request:{}", request); @@ -63,6 +56,7 @@ public class UserController { return Result.success(response); } + @AuthAccess(allowRoles = {"guest"}) @PostMapping("/user/register") public Result register(@RequestBody RegisterRequest request) { log.info("register request:{}", request); @@ -73,18 +67,13 @@ public class UserController { if (request.getPassword() == null || request.getPassword().length() < 3) { throw new ServiceException("密码长度不能小于3位"); } - User user = new User(); - user.setUsername(request.getUsername()); - user.setPassword(request.getPassword()); - user.setEmail(request.getEmail()); - user.setGrade(request.getGrade()); - user.setUserGroup(request.getGroup()); - userService.register(user); + userService.register(request); return Result.success(CommonResponse.factory("注册成功")); } @Operation(description = "删除单个用户") + @AuthAccess(allowRoles = {"admin"}) @DeleteMapping("/admin/user/{id}") public Result adminDelete(@PathVariable Integer id) { log.info("delete request:{}", id); @@ -93,6 +82,7 @@ public class UserController { } @Operation(description = "获取所有用户信息") + @AuthAccess(allowRoles = {"admin"}) @GetMapping("/admin/user") public Result> adminGet() { List allUsers = userService.findAllUsers(); @@ -100,6 +90,7 @@ public class UserController { } @Operation(description = "根据 id 获取用户信息") + @AuthAccess(allowRoles = {"admin"}) @GetMapping("/admin/user/{id}") public Result adminGetById(@PathVariable Integer id) { log.info("selectById request:{}", id); @@ -108,6 +99,7 @@ public class UserController { } @Operation(description = "获取当前用户信息") + @AuthAccess(allowRoles = {"user"}) @GetMapping("/user/me") public Result getSelf() { UserDto user = userService.findUser(0); @@ -119,9 +111,10 @@ public class UserController { public static class RegisterRequest { private String username; private String password; + private Integer studentId; private String email; private String grade; - private String group; + private String userGroup; } @Data diff --git a/src/main/java/top/suyiiyii/sims/entity/Role.java b/src/main/java/top/suyiiyii/sims/entity/Role.java index 78897ed..63e7f84 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Role.java +++ b/src/main/java/top/suyiiyii/sims/entity/Role.java @@ -1,7 +1,8 @@ package top.suyiiyii.sims.entity; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; +import com.tangzc.autotable.annotation.ColumnNotNull; +import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; import lombok.AllArgsConstructor; import lombok.Data; @@ -20,10 +21,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class Role { - @TableId("id") + @ColumnId(mode = IdType.AUTO,comment = "id主键") private Integer id; - private Integer roleId; //管理员,普通用户,组员,组长,队长 + @ColumnNotNull private String roleName; + private String tag; + public static Role guest() { + return new Role(-1, "guest",""); + } } diff --git a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java index f838187..96b9593 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java +++ b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java @@ -3,6 +3,8 @@ 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.autotable.annotation.ColumnNotNull; +import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; import lombok.AllArgsConstructor; import lombok.Data; @@ -23,8 +25,10 @@ import java.security.Permission; @AllArgsConstructor @NoArgsConstructor public class RolePermission { - @TableId("id") + @ColumnId(mode = IdType.AUTO,comment = "id主键") private Integer id; + @ColumnNotNull private Integer roleId; + @ColumnNotNull 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 d7bed55..000364d 100644 --- a/src/main/java/top/suyiiyii/sims/entity/User.java +++ b/src/main/java/top/suyiiyii/sims/entity/User.java @@ -1,6 +1,8 @@ package top.suyiiyii.sims.entity; -import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.IdType; +import com.tangzc.mpe.autotable.annotation.Column; +import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; import lombok.AllArgsConstructor; import lombok.Data; @@ -19,12 +21,18 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class User { - @TableId("id") + @ColumnId(mode = IdType.AUTO,comment = "id主键") private Integer id; + @Column(comment = "学生id",notNull = true) private Integer studentId; + @Column(comment = "用户名",notNull = true) private String username; + @Column(comment = "密码",notNull = true) private String password; + @Column(comment = "邮箱",notNull = true) private String email; + @Column(comment = "年级",notNull = true) private String grade; + @Column(comment = "用户所属团队",notNull = true) private String userGroup; } diff --git a/src/main/java/top/suyiiyii/sims/entity/UserRole.java b/src/main/java/top/suyiiyii/sims/entity/UserRole.java index 323df76..85f20ae 100644 --- a/src/main/java/top/suyiiyii/sims/entity/UserRole.java +++ b/src/main/java/top/suyiiyii/sims/entity/UserRole.java @@ -2,6 +2,8 @@ package top.suyiiyii.sims.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.tangzc.autotable.annotation.ColumnNotNull; +import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; import lombok.AllArgsConstructor; import lombok.Data; @@ -20,8 +22,10 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class UserRole { - @TableId("id") + @ColumnId(mode = IdType.AUTO,comment = "id主键") private Integer id; + @ColumnNotNull private Integer userId; + @ColumnNotNull 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 index fc85068..4645453 100644 --- a/src/main/java/top/suyiiyii/sims/exception/GlobalException.java +++ b/src/main/java/top/suyiiyii/sims/exception/GlobalException.java @@ -1,5 +1,6 @@ package top.suyiiyii.sims.exception; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -13,11 +14,15 @@ import top.suyiiyii.sims.common.Result; * @Description: TODO * @Version 1.0 */ +@Slf4j @ControllerAdvice public class GlobalException { @ExceptionHandler(ServiceException.class) @ResponseBody - public Result ServiceException(ServiceException e){ - return Result.error(e.getCode(),e.getMessage()); + public Result ServiceException(ServiceException e) { + log.warn("ServiceException:{}", e.getMessage()); + // 打印错误调用栈 + log.warn("ServiceException:", e); + return Result.error(e.getCode(), e.getMessage()); } } diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpRoleMapper.java b/src/main/java/top/suyiiyii/sims/mapper/MpRoleMapper.java new file mode 100644 index 0000000..70d3bd4 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/MpRoleMapper.java @@ -0,0 +1,7 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import top.suyiiyii.sims.entity.Role; + +public interface MpRoleMapper extends BaseMapper { +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpUserRoleMapper.java b/src/main/java/top/suyiiyii/sims/mapper/MpUserRoleMapper.java new file mode 100644 index 0000000..759242d --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/MpUserRoleMapper.java @@ -0,0 +1,7 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import top.suyiiyii.sims.entity.UserRole; + +public interface MpUserRoleMapper extends BaseMapper { +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java b/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java index 1aef24f..7346c84 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java @@ -22,7 +22,7 @@ public interface UserMapper extends BaseMapper { * @param user 新用户对象 * @return 影响的行数 */ - @Insert("insert INTO user (id,student_id, username, password, name, email, userGroup) VALUES (#{id},#{studentId}, #{username}, #{password}, #{name}, #{email}, #{userGroup})") + @Insert("insert INTO user (id,student_id, username, password, username, email, user_group) VALUES (#{id},#{studentId}, #{username}, #{password}, #{name}, #{email}, #{userGroup})") int addUser(User user); /** @@ -41,10 +41,10 @@ public interface UserMapper extends BaseMapper { @Update("UPDATE user SET " + "student_id = #{userId}, " + "username = #{username}, " + - "name = #{name}, " + + "username = #{name}, " + "email = #{email}, " + "grade = #{grade}, " + - "userGroup = #{group} " + + "user_group = #{group} " + "WHERE id = #{id}") int updateUser(User user); @@ -53,7 +53,7 @@ public interface UserMapper extends BaseMapper { * @param * @return 用户对象 */ - @Select("SELECT id, student_id, username, password, name, email,grade,user_group from user WHERE student_id = #{id}") + @Select("SELECT id, student_id, username, password, username, email,grade,user_group from user WHERE student_id = #{id}") User selectByUserId(Integer id); /** @@ -61,13 +61,13 @@ public interface UserMapper extends BaseMapper { * @param * @return 用户对象 */ - @Select("SELECT id, student_id, username, password, name, email,grade, user_group from user WHERE id = #{id}") + @Select("SELECT id, student_id, username, password, username, email,grade, user_group from user WHERE id = #{id}") User selectById(Integer id); /** * 查询所有用户信息 * @return 用户列表 */ - @Select("SELECT id, student_id, username, password, name, email, grade, user_group FROM user") + @Select("SELECT id, student_id, username, password, username, email, grade, user_group FROM user") List selectAll(); @Select("select * from user where username = #{username}") diff --git a/src/main/java/top/suyiiyii/sims/service/RbacService.java b/src/main/java/top/suyiiyii/sims/service/RbacService.java new file mode 100644 index 0000000..5cab939 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/RbacService.java @@ -0,0 +1,55 @@ +package top.suyiiyii.sims.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.entity.Role; +import top.suyiiyii.sims.entity.UserRole; +import top.suyiiyii.sims.mapper.MpRoleMapper; +import top.suyiiyii.sims.mapper.MpUserMapper; +import top.suyiiyii.sims.mapper.MpUserRoleMapper; + +import java.util.List; + +@Slf4j +@Service +public class RbacService { + + @Autowired + MpUserMapper userMapper; + + @Autowired + MpUserRoleMapper userRoleMapper; + + @Autowired + MpRoleMapper roleMapper; + + /** + * 根据用户id获取用户的角色 + * + * @param userId 用户id + * @return 用户的角色列表 + */ + public List getRolesByUserId(int userId) { + // 根据用户id获取用户的角色id,使用mp的条件构造器 + List userRoles = userRoleMapper.selectList(new QueryWrapper().eq("user_id", userId)); + // 根据角色id获取角色 + return roleMapper.selectBatchIds(userRoles.stream().map(UserRole::getRoleId).toList()); + } + + public boolean addRoleWithUserId(int userId, String roleName) { + Role role = roleMapper.selectOne(new QueryWrapper().eq("role_name", roleName)); + if (role == null) { + Role newRole = new Role(); + newRole.setRoleName(roleName); + roleMapper.insert(newRole); + role = roleMapper.selectOne(new QueryWrapper().eq("role_name", roleName)); + } + UserRole userRole = new UserRole(); + userRole.setUserId(userId); + userRole.setRoleId(role.getId()); + return userRoleMapper.insert(userRole) > 0; + } + +} diff --git a/src/main/java/top/suyiiyii/sims/service/UserService.java b/src/main/java/top/suyiiyii/sims/service/UserService.java index f870e76..d9ca0ff 100644 --- a/src/main/java/top/suyiiyii/sims/service/UserService.java +++ b/src/main/java/top/suyiiyii/sims/service/UserService.java @@ -2,21 +2,22 @@ package top.suyiiyii.sims.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import top.suyiiyii.sims.controller.UserController; import top.suyiiyii.sims.dto.UserDto; 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.mapper.*; import top.suyiiyii.sims.utils.JwtUtils; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; +import java.util.*; /** * @Author tortoise @@ -31,9 +32,17 @@ public class UserService { @Autowired UserMapper userMapper; @Autowired + MpUserMapper mpUserMapper; + @Autowired RoleMapper roleMapper; @Autowired PermissionsMapper permissionsMapper; + @Value("${jwt.secret}") + private String secret; + @Autowired + private RbacService rbacService; + @Autowired + private ModelMapper modelMapper; public void addUser(User user) { userMapper.addUser(user); @@ -60,53 +69,37 @@ public class UserService { if (!dbUser.getPassword().equals(password)) { throw new ServiceException("密码或用户名错误"); } - HashSet permissionsSet = new HashSet<>(); - Integer id = dbUser.getId(); - List roles = roleMapper.selectRolesById(id); - for (Role role : roles) { - //根据roleid找所有permissionId - List rolePerminsion = permissionsMapper.getRolePerminsionByRoleId(role.getRoleId()); - for (RolePermission rolePermission : rolePerminsion) { - Integer permissionId = rolePermission.getPermissionId(); - //根据permissionId找permission - Permissions permissions = permissionsMapper.selectById(permissionId); - permissionsSet.add(permissions); - } + return JwtUtils.createToken(dbUser.getId().toString(), secret); + } + + + public void register(UserController.RegisterRequest req) { + + User dbUser = userMapper.selectByUserId(req.getStudentId()); + + if (req.getUsername() == null || req.getUsername().equals("")) { + throw new ServiceException("用户名不能为空"); } - - String token = JwtUtils.createToken(dbUser.getId().toString(), dbUser.getPassword()); - - - return token; - - } - - - 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 (req.getStudentId() == null || req.getStudentId().equals("")) { + throw new ServiceException("学号不能为空"); } - if( user.getPassword() == null || user.getPassword().equals("")) { + if (req.getPassword() == null || req.getPassword().equals("")) { throw new ServiceException("密码不能为空"); } - if (user.getEmail() == null || user.getEmail().equals("")) { + if (req.getEmail() == null || req.getEmail().equals("")) { throw new ServiceException("邮箱不能为空"); } - if (user.getUserGroup() == null || user.getUserGroup().equals("")) { + if (req.getUserGroup() == null || req.getUserGroup().equals("")) { throw new ServiceException("组别不能为空"); } + User user =modelMapper.map(req, User.class); - userMapper.addUser(user); - return user; + mpUserMapper.insert(user); + user = mpUserMapper.selectOne(new LambdaQueryWrapper().eq(User::getUsername, req.getUsername())); + rbacService.addRoleWithUserId(user.getId(), "user"); } public User selectByUsername(String username) { return userMapper.selectByUserName(username); @@ -128,7 +121,7 @@ public class UserService { Integer id = user.getId(); List roles = roleMapper.selectRolesById(id); for (Role role : roles) { - Integer roleId = role.getRoleId(); + Integer roleId = role.getId(); // 获取一个角色的名称列表 List roleNameList = roleMapper.selectRoleNamesByRoleId(roleId); // 累加角色名称到用户的角色列表中 @@ -149,7 +142,7 @@ public class UserService { UserDto.setRoles(new ArrayList<>()); List roles = roleMapper.selectRolesById(id); for (Role role : roles) { - Integer roleId = role.getRoleId(); + Integer roleId = role.getId(); // 获取一个角色的名称列表 List roleNameList = roleMapper.selectRoleNamesByRoleId(roleId); // 累加角色名称到用户的角色列表中 diff --git a/src/main/resources/application-test.yaml b/src/main/resources/application-test.yaml index b73be74..978a6f0 100644 --- a/src/main/resources/application-test.yaml +++ b/src/main/resources/application-test.yaml @@ -5,4 +5,5 @@ spring: username: password: - +jwt: + secret: SuyiiyiiiiiiyiiiiTTTTTTTTTTTestttttttttttttt diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2b0fca7..4b7599a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -11,4 +11,7 @@ spring: auto-table: enable: true - model-package: top.suyiiyii.sims.entity \ No newline at end of file + model-package: top.suyiiyii.sims.entity + +jwt: + secret: ${JWT_SECRET} \ No newline at end of file diff --git a/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java b/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java deleted file mode 100644 index bb51181..0000000 --- a/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package top.suyiiyii.sims.mapper; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import top.suyiiyii.sims.entity.User; - -@SpringBootTest -@ActiveProfiles("test") -public class UserMapperTest { - - @Autowired - private MpUserMapper userMapper; - - @Test - public void testAddUser() { - User user = new User(); - user.setStudentId(1); - user.setUsername("test"); - user.setPassword("test"); - user.setEmail("test"); - user.setGrade("test"); - user.setUserGroup("test"); - - - - int result = userMapper.insert(user); - Assertions.assertEquals(1, result); - } - -} \ No newline at end of file diff --git a/src/test/java/top/suyiiyii/sims/service/RbacServiceTest.java b/src/test/java/top/suyiiyii/sims/service/RbacServiceTest.java new file mode 100644 index 0000000..b06cec6 --- /dev/null +++ b/src/test/java/top/suyiiyii/sims/service/RbacServiceTest.java @@ -0,0 +1,35 @@ +package top.suyiiyii.sims.service; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import top.suyiiyii.sims.entity.Role; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("test") +class RbacServiceTest { + + @Autowired + private RbacService rbacService; + + @Test + void addRoleWithUserId() { + int userId = 1; // mock userId + String roleName = "ROLE"; // mock roleName + boolean result = rbacService.addRoleWithUserId(userId, roleName); + assertTrue(result); + } + @Test + void getRolesByUserId() { + int userId = 1; // mock userId + List roles = rbacService.getRolesByUserId(userId); + assertNotNull(roles); + assert roles.stream().map(Role::getRoleName).toList().contains("ROLE"); // mock roleName + } + +} \ No newline at end of file From 1a53ffd83c82aa9bc9a16a902ef31fb871ed63c6 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 02:09:50 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E6=9E=84?= =?UTF-8?q?=E5=BB=BAdocker=E9=95=9C=E5=83=8F=20(#19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(build): add Dockerfile * feat(github-actions): 添加 Docker 镜像构建和发布工作流 * 删除maven的镜像配置 --- .github/workflows/docker-publish.yml | 96 ++++++++++++++++++++++++++++ Dockerfile | 29 +++++++++ pom.xml | 4 ++ 3 files changed, 129 insertions(+) create mode 100644 .github/workflows/docker-publish.yml create mode 100644 Dockerfile diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..98bd621 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,96 @@ +name: Docker + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + push: + branches: [ "main" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main" ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Install the cosign tool except on PR + # https://github.com/sigstore/cosign-installer + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0 + with: + cosign-release: 'v2.2.4' + + # Set up BuildKit Docker container builder to be able to build + # multi-platform images and export cache + # https://github.com/docker/setup-buildx-action + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Sign the resulting Docker image digest except on PRs. + # This will only write to the public Rekor transparency log when the Docker + # repository is public to avoid leaking data. If you would like to publish + # transparency data even for private images, pass --force to cosign below. + # https://github.com/sigstore/cosign + - name: Sign the published Docker image + if: ${{ github.event_name != 'pull_request' }} + env: + # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable + TAGS: ${{ steps.meta.outputs.tags }} + DIGEST: ${{ steps.build-and-push.outputs.digest }} + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..40ca746 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM maven:3.9-eclipse-temurin-17-alpine AS build + +WORKDIR /app + +COPY pom.xml ./pom.xml + +COPY src ./src + +RUN --mount=type=cache,target=/root/.m2 \ + mvn package -am -DskipTests + +RUN mkdir -p /layers && \ + cp /app/target/SIMS-0.0.1-SNAPSHOT.jar /layers/target.jar && \ + cd /layers && \ + java -Djarmode=layertools -jar /layers/target.jar extract + +FROM eclipse-temurin:17-jre AS runtime + +WORKDIR /app + +COPY --from=build /layers/dependencies/ . +COPY --from=build /layers/snapshot-dependencies/ . +COPY --from=build /layers/spring-boot-loader/ . +COPY --from=build /layers/application/ . + +EXPOSE 8080 + +# 执行命令 +ENTRYPOINT [ "java", "org.springframework.boot.loader.JarLauncher" ] diff --git a/pom.xml b/pom.xml index 29aef43..4374986 100644 --- a/pom.xml +++ b/pom.xml @@ -144,6 +144,10 @@ lombok + + true + + From 7a4e9adb294d2a60b5a59baba7aa6a08c67135ed Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 02:35:47 +0800 Subject: [PATCH 03/14] fix: Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 40ca746..8992df6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,4 +26,4 @@ COPY --from=build /layers/application/ . EXPOSE 8080 # 执行命令 -ENTRYPOINT [ "java", "org.springframework.boot.loader.JarLauncher" ] +ENTRYPOINT [ "java", "org.springframework.boot.loader.launch.JarLauncher" ] From 8fab21bc255a0a668c4c668cc8c929d32fb58e2d Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 11:39:21 +0800 Subject: [PATCH 04/14] Merge pull request #20 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(github): 创建gitea-sync.yml工作流 --- .github/workflows/gitea-sync.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/gitea-sync.yml diff --git a/.github/workflows/gitea-sync.yml b/.github/workflows/gitea-sync.yml new file mode 100644 index 0000000..2672a40 --- /dev/null +++ b/.github/workflows/gitea-sync.yml @@ -0,0 +1,16 @@ +name: gitea-sync.yml +on: + push: + branches: [ "*" ] + workflow_dispatch: + + +jobs: + trigger-gitea-sync: + runs-on: ubuntu-latest + steps: + - name: Trigger Gitea sync + run: | + echo "Triggering Gitea sync" + curl 'https://git.suyiiyii.top/api/v1/repos/ssyg/SIMS/mirror-sync' -X POST -H 'Authorization: token {{ secrets.GiteaToken }}'' + From 2734fb2227519ff61a9aa5f2d176de7a81fcadf5 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 11:42:46 +0800 Subject: [PATCH 05/14] Update gitea-sync.yml --- .github/workflows/gitea-sync.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gitea-sync.yml b/.github/workflows/gitea-sync.yml index 2672a40..8e8b8a3 100644 --- a/.github/workflows/gitea-sync.yml +++ b/.github/workflows/gitea-sync.yml @@ -1,7 +1,7 @@ name: gitea-sync.yml on: push: - branches: [ "*" ] + branches: [ "main", "manifest" ] workflow_dispatch: @@ -12,5 +12,5 @@ jobs: - name: Trigger Gitea sync run: | echo "Triggering Gitea sync" - curl 'https://git.suyiiyii.top/api/v1/repos/ssyg/SIMS/mirror-sync' -X POST -H 'Authorization: token {{ secrets.GiteaToken }}'' + curl 'https://git.suyiiyii.top/api/v1/repos/ssyg/SIMS/mirror-sync' -X POST -H 'Authorization: token {{ secrets.GiteaToken }}' From f5efdf8bf4534f9b84f9c130f3604692bb0f902f Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 11:45:24 +0800 Subject: [PATCH 06/14] Update gitea-sync.yml --- .github/workflows/gitea-sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gitea-sync.yml b/.github/workflows/gitea-sync.yml index 8e8b8a3..187eea0 100644 --- a/.github/workflows/gitea-sync.yml +++ b/.github/workflows/gitea-sync.yml @@ -12,5 +12,5 @@ jobs: - name: Trigger Gitea sync run: | echo "Triggering Gitea sync" - curl 'https://git.suyiiyii.top/api/v1/repos/ssyg/SIMS/mirror-sync' -X POST -H 'Authorization: token {{ secrets.GiteaToken }}' + curl 'https://git.suyiiyii.top/api/v1/repos/ssyg/SIMS/mirror-sync' -X POST -H 'Authorization: token ${{ secrets.GITEATOKEN }}' From 437b23022c9909090a3f1bfaa72f4de3504b69e0 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 19:12:28 +0800 Subject: [PATCH 07/14] =?UTF-8?q?fix(JwtInterceptor):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=BF=87=E6=9C=9F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加对过期JWT令牌的异常处理,以在访问受限时强制重新认证。在验证失败时抛出服务异常前,捕获并处理TokenExpiredException。 --- .../java/top/suyiiyii/sims/common/JwtInterceptor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java index e7333ac..63b0254 100644 --- a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java +++ b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java @@ -1,5 +1,6 @@ package top.suyiiyii.sims.common; +import com.auth0.jwt.exceptions.TokenExpiredException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; @@ -41,10 +42,13 @@ public class JwtInterceptor implements HandlerInterceptor { return true; } // 验证 token 的有效性 - if (!JwtUtils.verifyToken(token, secret) || JwtUtils.extractUserId(token) == null) { + try { + if (!JwtUtils.verifyToken(token, secret) || JwtUtils.extractUserId(token) == null) { + throw new ServiceException("401", "登录已过期,请重新登录"); + } + } catch (TokenExpiredException e) { throw new ServiceException("401", "登录已过期,请重新登录"); } - // 获取 token 中的 user id Integer userId = Integer.parseInt(Objects.requireNonNull(JwtUtils.extractUserId(token))); From 6bffefee2e3f559b6693e54ae4a4483a9b7e6517 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 19:13:28 +0800 Subject: [PATCH 08/14] =?UTF-8?q?feat(cicd):=E5=A2=9E=E5=8A=A0Workflow?= =?UTF-8?q?=E6=9D=A5=E6=9B=B4=E6=96=B0=E9=83=A8=E7=BD=B2=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-publish.yml | 17 ++++++++++++++++- .github/workflows/gitea-sync.yml | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 98bd621..19f725f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,4 +1,4 @@ -name: Docker +name: Docker Build and Publish # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by @@ -94,3 +94,18 @@ jobs: # This step uses the identity token to provision an ephemeral certificate # against the sigstore community Fulcio instance. run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} + + - name: Checkout manifest + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + ref: manifest + + - name: Update manifest + if: github.event_name == 'push' + run: | + echo "Updating manifest" + yq eval '.image.tag = "${{ steps.meta.outputs.tags }}"' -i values.yaml + git add values.yaml + git commit -m "Update deployment image to ${{ steps.meta.outputs.tags }}" + git push diff --git a/.github/workflows/gitea-sync.yml b/.github/workflows/gitea-sync.yml index 187eea0..1c162a9 100644 --- a/.github/workflows/gitea-sync.yml +++ b/.github/workflows/gitea-sync.yml @@ -3,6 +3,8 @@ on: push: branches: [ "main", "manifest" ] workflow_dispatch: + workflow_run: + workflows: ["Docker Build and Publish"] jobs: From 8a9612bcb3c6cf22fba03be386425af62f208c70 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 19:32:28 +0800 Subject: [PATCH 09/14] =?UTF-8?q?refactor(github-actions):=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8C=96=E6=8F=90=E4=BA=A4=E9=95=9C=E5=83=8F=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=92=8CGitea=E5=90=8C=E6=AD=A5=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在docker-publish.yml中引入yq Linux二进制文件并设置权限,用于在'push'事件中自动更新部署镜像标签。 - 用git-auto-commit-action自动化提交更新到GitHub,使用机器用户凭据。- 在gitea-sync.yml中增加workflow_run事件的类型限定,仅在'Docker Build and Publish'工作流完成时触发。 --- .github/workflows/docker-publish.yml | 14 +++++++++++--- .github/workflows/gitea-sync.yml | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 19f725f..94aca32 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -105,7 +105,15 @@ jobs: if: github.event_name == 'push' run: | echo "Updating manifest" + wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq + chmod +x /usr/bin/yq yq eval '.image.tag = "${{ steps.meta.outputs.tags }}"' -i values.yaml - git add values.yaml - git commit -m "Update deployment image to ${{ steps.meta.outputs.tags }}" - git push + - name: Git Auto Commit + uses: stefanzweifel/git-auto-commit-action@v5.0.1 + with: + commit_message: "Update deployment image to ${{ steps.meta.outputs.tags }}" + branch: manifest + commit_user_name: "github-actions[bot]" + commit_user_email: "github-actions[bot]@users.noreply.github.com" + commit_author: "github-actions[bot] " + diff --git a/.github/workflows/gitea-sync.yml b/.github/workflows/gitea-sync.yml index 1c162a9..cc1c271 100644 --- a/.github/workflows/gitea-sync.yml +++ b/.github/workflows/gitea-sync.yml @@ -5,6 +5,8 @@ on: workflow_dispatch: workflow_run: workflows: ["Docker Build and Publish"] + types: + - completed jobs: From 95e1173849e811316190d3355463013ee0a0b430 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 19:37:02 +0800 Subject: [PATCH 10/14] =?UTF-8?q?refactor(github-actions):=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8yq-action=E6=9B=BF=E6=8D=A2=E7=9B=B4=E6=8E=A5wget?= =?UTF-8?q?=E5=92=8C=E4=BC=98=E5=8C=96=E4=BE=9D=E8=B5=96=E5=9B=BE=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在docker-publish.yml中使用mikefarah/yq-action直接替换繁琐的wget和chmod命令,用于更新manifest。 -通过精确的路径监听在maven.yml中优化依赖图提交动作,以响应pom.xml和src/更改,提高效率。 --- .github/workflows/docker-publish.yml | 9 +++------ .github/workflows/maven.yml | 10 ++++++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 94aca32..6f3494f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -100,14 +100,11 @@ jobs: uses: actions/checkout@v4 with: ref: manifest - - name: Update manifest if: github.event_name == 'push' - run: | - echo "Updating manifest" - wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq - chmod +x /usr/bin/yq - yq eval '.image.tag = "${{ steps.meta.outputs.tags }}"' -i values.yaml + uses: mikefarah/yq@master + with: + cmd: yq eval '.image.tag = "${{ steps.meta.outputs.tags }}"' -i values.yaml - name: Git Auto Commit uses: stefanzweifel/git-auto-commit-action@v5.0.1 with: diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index ee4c4c8..8d26158 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -11,8 +11,14 @@ name: Java CI with Maven on: push: branches: [ "main" ] + paths: + - 'pom.xml' + - 'src/**' pull_request: branches: [ "main" ] + paths: + - 'pom.xml' + - 'src/**' jobs: build: @@ -34,5 +40,5 @@ jobs: # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive -# - name: Update dependency graph -# uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 From 61853817538aae05c379d3fca194d05265a26b92 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 19:41:39 +0800 Subject: [PATCH 11/14] =?UTF-8?q?fix(github-actions):=E5=B0=86=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=BB=8Eread=E6=9B=B4=E6=94=B9=E4=B8=BAwrite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 6f3494f..3b0acda 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest permissions: - contents: read + contents: write packages: write # This is used to complete the identity challenge # with sigstore/fulcio when running outside of PRs. From 8d10add577348e9439def7e0bce4be593ccc615d Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 20:00:59 +0800 Subject: [PATCH 12/14] =?UTF-8?q?feat(docker-publish):=20=E4=BB=8Emeta?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=AD=E6=8F=90=E5=8F=96=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E9=95=9C=E5=83=8F=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-publish.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 3b0acda..c6c8a29 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -59,6 +59,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get current date and commit ID + id: vars + run: | + echo "DATE=$(date +'%y%m%d')" >> $GITHUB_ENV + echo "COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata @@ -66,6 +72,7 @@ jobs: uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: ${{ env.DATE }}-${{ env.COMMIT }} # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action @@ -104,11 +111,11 @@ jobs: if: github.event_name == 'push' uses: mikefarah/yq@master with: - cmd: yq eval '.image.tag = "${{ steps.meta.outputs.tags }}"' -i values.yaml + cmd: yq eval '.image.tag = "${{ steps.meta.outputs.version }}"' -i values.yaml - name: Git Auto Commit uses: stefanzweifel/git-auto-commit-action@v5.0.1 with: - commit_message: "Update deployment image to ${{ steps.meta.outputs.tags }}" + commit_message: "Update deployment image to ${{ steps.meta.outputs.version }}" branch: manifest commit_user_name: "github-actions[bot]" commit_user_email: "github-actions[bot]@users.noreply.github.com" From 6e3ffa092bb63c270791e931f8d4b14bf6fcf66b Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 25 Aug 2024 20:21:15 +0800 Subject: [PATCH 13/14] =?UTF-8?q?reformat=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * reformat 格式化代码 * 为依赖图的生成添加写权限 --- .github/workflows/maven.yml | 2 ++ .../sims/common/InterceptorConfig.java | 2 +- .../sims/common/ModelMapperConfig.java | 15 +++++----- .../sims/controller/AdminController.java | 10 +++---- .../sims/controller/RecordController.java | 24 ++++------------ .../sims/controller/UserController.java | 1 - .../java/top/suyiiyii/sims/dto/RecordDto.java | 3 -- .../top/suyiiyii/sims/entity/Attachment.java | 2 -- .../sims/entity/HierarchyRelation.java | 2 -- .../top/suyiiyii/sims/entity/Permissions.java | 1 - .../java/top/suyiiyii/sims/entity/Record.java | 2 -- .../suyiiyii/sims/entity/RevokeRequest.java | 2 +- .../suyiiyii/sims/entity/RevokedRecord.java | 2 +- .../sims/entity/RewardPunishmentCategory.java | 1 - .../java/top/suyiiyii/sims/entity/Role.java | 4 +-- .../suyiiyii/sims/entity/RolePermission.java | 6 +--- .../java/top/suyiiyii/sims/entity/User.java | 14 +++++----- .../top/suyiiyii/sims/entity/UserRole.java | 3 +- .../sims/exception/ServiceException.java | 7 +++-- .../suyiiyii/sims/mapper/CategoryMapper.java | 5 ++-- .../sims/mapper/PermissionsMapper.java | 8 +++--- .../suyiiyii/sims/mapper/RecordMapper.java | 7 +++-- .../top/suyiiyii/sims/mapper/RoleMapper.java | 15 +++++----- .../top/suyiiyii/sims/mapper/UserMapper.java | 18 ++++++++---- .../sims/service/CategoryService.java | 2 +- .../suyiiyii/sims/service/RecordService.java | 2 -- .../suyiiyii/sims/service/RoleService.java | 11 +++----- .../suyiiyii/sims/service/UserService.java | 28 +++++++++++-------- .../top/suyiiyii/sims/utils/JwtUtils.java | 18 +++++++----- 29 files changed, 102 insertions(+), 115 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8d26158..df6813a 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -24,6 +24,8 @@ jobs: build: runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v4 diff --git a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java index ee3e9ac..69a7ff4 100644 --- a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java +++ b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java @@ -31,7 +31,7 @@ public class InterceptorConfig extends WebMvcConfigurationSupport { .addPathPatterns("/**") .excludePathPatterns("/v3/api-docs/**"); registry.addInterceptor(rbacInterceptor) - .excludePathPatterns("/v3/api-docs/**");; + .excludePathPatterns("/v3/api-docs/**"); super.addInterceptors(registry); } diff --git a/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java b/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java index 3241164..ad495cf 100644 --- a/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java +++ b/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java @@ -4,8 +4,6 @@ import org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import top.suyiiyii.sims.dto.RecordDto; -import top.suyiiyii.sims.entity.User; /** * @Author tortoise @@ -25,19 +23,20 @@ public class ModelMapperConfig { // 设置匹配策略为严格模式 modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - // configureUser(modelMapper); - return modelMapper; + // configureUser(modelMapper); + return modelMapper; } + // 配置 User 类的映射规则 private void configureUser(ModelMapper modelMapper) { // 定义 UserModel -> User 的映射规则 - // modelMapper.typeMap(RecordDto.class, Record.class) + // modelMapper.typeMap(RecordDto.class, Record.class) // 跳过设置密码字段 // 定义 User -> UserModel 的映射规则 - // modelMapper.typeMap(User.class, RecordDto.class) - // .addMappings(mapper -> mapper.skip(RecordDto::setPassword)) // 跳过设置密码字段 - // .addMappings(mapper -> mapper.map(User::getRealName, UserModel::setName)); // 将 User 的 realName 映射为 UserModel 的 name + // modelMapper.typeMap(User.class, RecordDto.class) + // .addMappings(mapper -> mapper.skip(RecordDto::setPassword)) // 跳过设置密码字段 + // .addMappings(mapper -> mapper.map(User::getRealName, UserModel::setName)); // 将 User 的 realName 映射为 UserModel 的 name // .addMappings(mapper -> mapper.using(dateToStringConverter).map(User::getCreateTime, UserModel::setCreateTime)) // .addMappings(mapper -> mapper.using(dateToStringConverter).map(User::getUpdateTime, UserModel::setUpdateTime)); } diff --git a/src/main/java/top/suyiiyii/sims/controller/AdminController.java b/src/main/java/top/suyiiyii/sims/controller/AdminController.java index 7b1b17b..4aad012 100644 --- a/src/main/java/top/suyiiyii/sims/controller/AdminController.java +++ b/src/main/java/top/suyiiyii/sims/controller/AdminController.java @@ -43,8 +43,8 @@ public class AdminController { } } /** - request.setAttribute();lUsers(); - return Result.success(userList); - } -} -**/ \ No newline at end of file + * request.setAttribute();lUsers(); + * return Result.success(userList); + * } + * } + **/ \ No newline at end of file diff --git a/src/main/java/top/suyiiyii/sims/controller/RecordController.java b/src/main/java/top/suyiiyii/sims/controller/RecordController.java index 40b5ffc..cefabb1 100644 --- a/src/main/java/top/suyiiyii/sims/controller/RecordController.java +++ b/src/main/java/top/suyiiyii/sims/controller/RecordController.java @@ -1,35 +1,23 @@ package top.suyiiyii.sims.controller; -import com.auth0.jwt.JWT; -import com.auth0.jwt.exceptions.JWTDecodeException; -import com.auth0.jwt.interfaces.DecodedJWT; import io.swagger.v3.oas.annotations.Operation; - import jakarta.servlet.http.HttpServletRequest; import org.modelmapper.ModelMapper; 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.dto.RecordDto; import top.suyiiyii.sims.entity.Record; -import top.suyiiyii.sims.entity.Role; -import top.suyiiyii.sims.entity.User; -import top.suyiiyii.sims.entity.UserRole; -import top.suyiiyii.sims.mapper.CategoryMapper; -import top.suyiiyii.sims.mapper.UserMapper; import top.suyiiyii.sims.service.CategoryService; import top.suyiiyii.sims.service.RecordService; import top.suyiiyii.sims.service.RoleService; import top.suyiiyii.sims.service.UserService; import top.suyiiyii.sims.utils.JwtUtils; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; @RestController public class @@ -57,7 +45,7 @@ RecordController { RecordDto recordDto = modelMapper.map(record, RecordDto.class); recordDto.setCategoryName(categoryService.getCategoryName(record.getCategoryId())); - recordDto.setSubCategoryName(categoryService.getsubCategoryName( record.getCategoryId())); + recordDto.setSubCategoryName(categoryService.getsubCategoryName(record.getCategoryId())); recordDtos.add(recordDto); } return Result.success(recordDtos); @@ -70,16 +58,16 @@ RecordController { @RequestParam(defaultValue = "10") int size, HttpServletRequest request) { String token = (String) request.getAttribute("token"); - String userId= JwtUtils.extractUserId(token); - List recordDtos=new ArrayList<>(); + String userId = JwtUtils.extractUserId(token); + List recordDtos = new ArrayList<>(); - List records = recordService.getMyAllRecords(page, size,userId); + List records = recordService.getMyAllRecords(page, size, userId); for (Record record : records) { RecordDto recordDto = modelMapper.map(record, RecordDto.class); recordDto.setCategoryName(categoryService.getCategoryName(record.getCategoryId())); - recordDto.setSubCategoryName(categoryService.getsubCategoryName( record.getCategoryId())); + recordDto.setSubCategoryName(categoryService.getsubCategoryName(record.getCategoryId())); recordDtos.add(recordDto); } @@ -92,7 +80,7 @@ RecordController { @PutMapping("/admin/record/{id}") public Result adminUpdateRecord(@PathVariable Integer id, @RequestBody RecordDto recordDto) { Record record = modelMapper.map(recordDto, Record.class); - recordService.updateRecord(record,id); + recordService.updateRecord(record, id); 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 index 80c34a3..a9a606d 100644 --- a/src/main/java/top/suyiiyii/sims/controller/UserController.java +++ b/src/main/java/top/suyiiyii/sims/controller/UserController.java @@ -11,7 +11,6 @@ import top.suyiiyii.sims.common.AuthAccess; import top.suyiiyii.sims.common.Result; import top.suyiiyii.sims.dto.CommonResponse; import top.suyiiyii.sims.dto.UserDto; -import top.suyiiyii.sims.entity.User; import top.suyiiyii.sims.exception.ServiceException; import top.suyiiyii.sims.service.RoleService; import top.suyiiyii.sims.service.UserService; diff --git a/src/main/java/top/suyiiyii/sims/dto/RecordDto.java b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java index 617668e..4e68526 100644 --- a/src/main/java/top/suyiiyii/sims/dto/RecordDto.java +++ b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java @@ -4,9 +4,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; -import java.util.List; - @Data @AllArgsConstructor @NoArgsConstructor diff --git a/src/main/java/top/suyiiyii/sims/entity/Attachment.java b/src/main/java/top/suyiiyii/sims/entity/Attachment.java index c9606c4..b836fb9 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Attachment.java +++ b/src/main/java/top/suyiiyii/sims/entity/Attachment.java @@ -1,7 +1,5 @@ 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; diff --git a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java index def612c..ec9e865 100644 --- a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java +++ b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java @@ -1,7 +1,5 @@ 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; diff --git a/src/main/java/top/suyiiyii/sims/entity/Permissions.java b/src/main/java/top/suyiiyii/sims/entity/Permissions.java index 2575033..e2235be 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Permissions.java +++ b/src/main/java/top/suyiiyii/sims/entity/Permissions.java @@ -1,6 +1,5 @@ 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; diff --git a/src/main/java/top/suyiiyii/sims/entity/Record.java b/src/main/java/top/suyiiyii/sims/entity/Record.java index 6390515..b1a2959 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Record.java +++ b/src/main/java/top/suyiiyii/sims/entity/Record.java @@ -7,8 +7,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - /** * @Author tortoise * @Date 2024/8/9 14:04 diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java index f72ccc7..70bdb12 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java +++ b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java @@ -13,7 +13,7 @@ import java.time.LocalDateTime; * @Date 2024/8/10 0:31 * @PackageName:top.suyiiyii.sims.entity * @ClassName: RevokeRequest - * @Description: 存储普通成员提出的奖惩撤销申请,并跟踪申请状态 + * @Description: 存储普通成员提出的奖惩撤销申请,并跟踪申请状态 * @Version 1.0 */ @Data diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java index 1fa6277..c8f2c5d 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java +++ b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java @@ -13,7 +13,7 @@ import java.time.LocalDateTime; * @Date 2024/8/10 0:34 * @PackageName:top.suyiiyii.sims.entity * @ClassName: RevokedRecord - * @Description: 存储管理员对奖惩记录的撤销信息,包括撤销原因 + * @Description: 存储管理员对奖惩记录的撤销信息,包括撤销原因 * @Version 1.0 */ @Data diff --git a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java b/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java index 8b705f7..1220b6d 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java +++ b/src/main/java/top/suyiiyii/sims/entity/RewardPunishmentCategory.java @@ -1,6 +1,5 @@ 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; diff --git a/src/main/java/top/suyiiyii/sims/entity/Role.java b/src/main/java/top/suyiiyii/sims/entity/Role.java index 63e7f84..8ad43ba 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Role.java +++ b/src/main/java/top/suyiiyii/sims/entity/Role.java @@ -21,7 +21,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class Role { - @ColumnId(mode = IdType.AUTO,comment = "id主键") + @ColumnId(mode = IdType.AUTO, comment = "id主键") private Integer id; //管理员,普通用户,组员,组长,队长 @ColumnNotNull @@ -29,6 +29,6 @@ public class Role { private String tag; public static Role guest() { - return new Role(-1, "guest",""); + return new Role(-1, "guest", ""); } } diff --git a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java index 96b9593..8a4fbce 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RolePermission.java +++ b/src/main/java/top/suyiiyii/sims/entity/RolePermission.java @@ -1,8 +1,6 @@ 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.autotable.annotation.ColumnNotNull; import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; @@ -10,8 +8,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.security.Permission; - /** * @Author tortoise * @Date 2024/8/9 14:03 @@ -25,7 +21,7 @@ import java.security.Permission; @AllArgsConstructor @NoArgsConstructor public class RolePermission { - @ColumnId(mode = IdType.AUTO,comment = "id主键") + @ColumnId(mode = IdType.AUTO, comment = "id主键") private Integer id; @ColumnNotNull private Integer roleId; diff --git a/src/main/java/top/suyiiyii/sims/entity/User.java b/src/main/java/top/suyiiyii/sims/entity/User.java index 000364d..b5c0a58 100644 --- a/src/main/java/top/suyiiyii/sims/entity/User.java +++ b/src/main/java/top/suyiiyii/sims/entity/User.java @@ -21,18 +21,18 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class User { - @ColumnId(mode = IdType.AUTO,comment = "id主键") + @ColumnId(mode = IdType.AUTO, comment = "id主键") private Integer id; - @Column(comment = "学生id",notNull = true) + @Column(comment = "学生id", notNull = true) private Integer studentId; - @Column(comment = "用户名",notNull = true) + @Column(comment = "用户名", notNull = true) private String username; - @Column(comment = "密码",notNull = true) + @Column(comment = "密码", notNull = true) private String password; - @Column(comment = "邮箱",notNull = true) + @Column(comment = "邮箱", notNull = true) private String email; - @Column(comment = "年级",notNull = true) + @Column(comment = "年级", notNull = true) private String grade; - @Column(comment = "用户所属团队",notNull = true) + @Column(comment = "用户所属团队", notNull = true) private String userGroup; } diff --git a/src/main/java/top/suyiiyii/sims/entity/UserRole.java b/src/main/java/top/suyiiyii/sims/entity/UserRole.java index 85f20ae..3d82dc1 100644 --- a/src/main/java/top/suyiiyii/sims/entity/UserRole.java +++ b/src/main/java/top/suyiiyii/sims/entity/UserRole.java @@ -1,7 +1,6 @@ package top.suyiiyii.sims.entity; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.tangzc.autotable.annotation.ColumnNotNull; import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; @@ -22,7 +21,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class UserRole { - @ColumnId(mode = IdType.AUTO,comment = "id主键") + @ColumnId(mode = IdType.AUTO, comment = "id主键") private Integer id; @ColumnNotNull private Integer userId; diff --git a/src/main/java/top/suyiiyii/sims/exception/ServiceException.java b/src/main/java/top/suyiiyii/sims/exception/ServiceException.java index 0b3e6d5..918c21e 100644 --- a/src/main/java/top/suyiiyii/sims/exception/ServiceException.java +++ b/src/main/java/top/suyiiyii/sims/exception/ServiceException.java @@ -11,14 +11,15 @@ import lombok.Getter; * @Version 1.0 */ @Getter -public class ServiceException extends RuntimeException{ +public class ServiceException extends RuntimeException { public final String code; - public ServiceException(String msg){ + public ServiceException(String msg) { super(msg); this.code = "500"; } - public ServiceException(String code ,String msg){ + + public ServiceException(String code, String msg) { super(msg); this.code = code; } diff --git a/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java b/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java index 902eadc..d1f0675 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java @@ -17,7 +17,8 @@ public interface CategoryMapper { String getCategoryName(Integer categoryId); @Select("SELECT category_name FROM reward_punishment_category WHERE category_id=#{categoryId}") - String getSubCategoryName(Integer categoryId); -@Select("SELECT category_id FROM reward_punishment_category WHERE sub_category_name=#{subCategoryName}") + String getSubCategoryName(Integer categoryId); + + @Select("SELECT category_id FROM reward_punishment_category WHERE sub_category_name=#{subCategoryName}") Integer getIdBySubCategoryName(String subCategoryName); } diff --git a/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java b/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java index dffca5c..245dc24 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/PermissionsMapper.java @@ -1,6 +1,5 @@ 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; @@ -17,9 +16,10 @@ import java.util.List; * @Version 1.0 */ @Mapper -public interface PermissionsMapper { -@Select("SELECT * FROM role_permission WHERE role_id = #{id}") +public interface PermissionsMapper { + @Select("SELECT * FROM role_permission WHERE role_id = #{id}") List getRolePerminsionByRoleId(Integer id); -@Select("SELECT * FROM permissions WHERE permission_id = #{permissionId}") + + @Select("SELECT * FROM permissions WHERE permission_id = #{permissionId}") Permissions selectById(Integer permissionId); } diff --git a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java index a4d635d..955e594 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java @@ -1,7 +1,6 @@ package top.suyiiyii.sims.mapper; import org.apache.ibatis.annotations.*; -import top.suyiiyii.sims.dto.RecordDto; import top.suyiiyii.sims.entity.Record; import java.util.List; @@ -17,9 +16,10 @@ import java.util.List; @Mapper public interface RecordMapper { //分页查询 -@Select("select * from record limit #{page},#{size}") + @Select("select * from record limit #{page},#{size}") List getAllRecords(Integer page, Integer size); -//根据学号分页查询所以信息 + + //根据学号分页查询所以信息 @Select("select * from record where student_id = #{id} limit #{page},#{size}") List getMyAllRecords(Integer page, Integer size, String id); @@ -42,6 +42,7 @@ public interface RecordMapper { @Delete("delete from record where id = #{id}") void deleteRecord(Integer id); + @Insert({ "insert into record (student_id, category_id, `date`, content, reason, amount, remark, is_revoked,", "revoke_date, revoke_reason, revoke_remark, operator_user_id, last_update_time)", diff --git a/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java index 6a59928..0d9dfe2 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java @@ -1,12 +1,8 @@ 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; @@ -22,15 +18,18 @@ import java.util.List; public interface RoleMapper { @Insert("INSERT INTO role(name) VALUES(#{name}") void addRole(String name); -@Delete("DELETE FROM role WHERE name=#{name}") + + @Delete("DELETE FROM role WHERE name=#{name}") void deleteRole(String name); -@Update("UPDATE role SET name=#{newName} WHERE name=#{name}") + + @Update("UPDATE role SET name=#{newName} WHERE name=#{name}") void updateRole(String name, String newName); + /** + * @param * @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 " + @@ -53,7 +52,7 @@ public interface RoleMapper { "(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}") + @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 index 7346c84..cf73d60 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/UserMapper.java @@ -2,7 +2,6 @@ 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; @@ -19,6 +18,7 @@ import java.util.List; public interface UserMapper extends BaseMapper { /** * 添加新用户 + * * @param user 新用户对象 * @return 影响的行数 */ @@ -27,6 +27,7 @@ public interface UserMapper extends BaseMapper { /** * 根据ID删除用户 + * * @param id 用户ID * @return 影响的行数 */ @@ -35,6 +36,7 @@ public interface UserMapper extends BaseMapper { /** * 更新用户信息 + * * @param user 更新后的用户对象 * @return 影响的行数 */ @@ -50,6 +52,7 @@ public interface UserMapper extends BaseMapper { /** * 根据ID查询用户信息 + * * @param * @return 用户对象 */ @@ -58,22 +61,27 @@ public interface UserMapper extends BaseMapper { /** * 根据iD查询用户信息 + * * @param * @return 用户对象 */ @Select("SELECT id, student_id, username, password, username, email,grade, user_group from user WHERE id = #{id}") User selectById(Integer id); + /** * 查询所有用户信息 + * * @return 用户列表 */ @Select("SELECT id, student_id, username, password, username, email, grade, user_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}") + @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); -@Select("select student_id from user where id = #{userId}") + + @Select("select student_id from user where id = #{userId}") String getStudentIdById(String userId); } diff --git a/src/main/java/top/suyiiyii/sims/service/CategoryService.java b/src/main/java/top/suyiiyii/sims/service/CategoryService.java index 98e20d1..ee6c966 100644 --- a/src/main/java/top/suyiiyii/sims/service/CategoryService.java +++ b/src/main/java/top/suyiiyii/sims/service/CategoryService.java @@ -19,7 +19,7 @@ public class CategoryService { public String getCategoryName(Integer id) { - return categoryMapper.getCategoryName(id); + return categoryMapper.getCategoryName(id); } public String getsubCategoryName(Integer categoryId) { diff --git a/src/main/java/top/suyiiyii/sims/service/RecordService.java b/src/main/java/top/suyiiyii/sims/service/RecordService.java index 2afc0b7..e009f88 100644 --- a/src/main/java/top/suyiiyii/sims/service/RecordService.java +++ b/src/main/java/top/suyiiyii/sims/service/RecordService.java @@ -1,10 +1,8 @@ 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.dto.RecordDto; import top.suyiiyii.sims.entity.Record; import top.suyiiyii.sims.mapper.RecordMapper; import top.suyiiyii.sims.mapper.UserMapper; diff --git a/src/main/java/top/suyiiyii/sims/service/RoleService.java b/src/main/java/top/suyiiyii/sims/service/RoleService.java index e019e88..a4d595e 100644 --- a/src/main/java/top/suyiiyii/sims/service/RoleService.java +++ b/src/main/java/top/suyiiyii/sims/service/RoleService.java @@ -1,11 +1,9 @@ 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; @@ -23,23 +21,22 @@ public class RoleService { @Autowired RoleMapper roleMapper; - public List findAllUsersWithRoles(){ + public List findAllUsersWithRoles() { return roleMapper.selectAllUsersWithRoles(); } + /** + * @param Id * @author: tortoise * @date: 2024/8/14 14:39 * @Description: TODO 查看自己身份 - * @param Id * @return: java.util.List */ - public List selectRolesById(int id){ + public List selectRolesById(int id) { return roleMapper.selectRolesById(id); } - - public boolean isRoleNameAdmin(Integer id) { List roles = roleMapper.selectRolesById(id); for (Role role : roles) { diff --git a/src/main/java/top/suyiiyii/sims/service/UserService.java b/src/main/java/top/suyiiyii/sims/service/UserService.java index d9ca0ff..e7f8f40 100644 --- a/src/main/java/top/suyiiyii/sims/service/UserService.java +++ b/src/main/java/top/suyiiyii/sims/service/UserService.java @@ -1,23 +1,24 @@ package top.suyiiyii.sims.service; - import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; - - import top.suyiiyii.sims.controller.UserController; import top.suyiiyii.sims.dto.UserDto; -import top.suyiiyii.sims.entity.*; +import top.suyiiyii.sims.entity.Role; +import top.suyiiyii.sims.entity.User; import top.suyiiyii.sims.exception.ServiceException; -import top.suyiiyii.sims.mapper.*; +import top.suyiiyii.sims.mapper.MpUserMapper; +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.*; +import java.util.ArrayList; +import java.util.List; /** * @Author tortoise @@ -59,8 +60,9 @@ public class UserService { public List selectAll() { return userMapper.selectAll(); } -//TODO:返回一个DTO,用户基本信息 - public String login(String username, String password) { + + //TODO:返回一个DTO,用户基本信息 + public String login(String username, String password) { User dbUser = userMapper.selectByUserName(username); if (dbUser == null) { @@ -95,19 +97,22 @@ public class UserService { if (req.getUserGroup() == null || req.getUserGroup().equals("")) { throw new ServiceException("组别不能为空"); } - User user =modelMapper.map(req, User.class); + User user = modelMapper.map(req, User.class); mpUserMapper.insert(user); user = mpUserMapper.selectOne(new LambdaQueryWrapper().eq(User::getUsername, req.getUsername())); rbacService.addRoleWithUserId(user.getId(), "user"); } + public User selectByUsername(String username) { return userMapper.selectByUserName(username); } + public void updatePassword(User user) { userMapper.updatePassword(user); } - public List findAllUsers(){ + + public List findAllUsers() { List users = userMapper.selectAll(); List UserDtos = new ArrayList<>(); @@ -131,6 +136,7 @@ public class UserService { } return UserDtos; } + public UserDto findUser(Integer id) { UserDto UserDto = new UserDto(); diff --git a/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java b/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java index cf050e0..e39f97b 100644 --- a/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java +++ b/src/main/java/top/suyiiyii/sims/utils/JwtUtils.java @@ -30,17 +30,13 @@ public class JwtUtils { private static UserMapper staticUserMapper; @Resource UserMapper userMapper; - @PostConstruct - public void setUserService() { - staticUserMapper=userMapper; - } /** + * @param userId + * @param sign * @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) { @@ -48,8 +44,9 @@ public class JwtUtils { .withAudience(userId) .withExpiresAt(DateUtil.offsetHour(new Date(), 2)) .sign(Algorithm.HMAC256(sign)); - // 设置令牌过期时间为2小时 + // 设置令牌过期时间为2小时 } + public static User getCurrentUser() { try { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); @@ -63,6 +60,7 @@ public class JwtUtils { } return null; } + // 验证 JWT 令牌 public static boolean verifyToken(String token, String secret) { try { @@ -74,6 +72,7 @@ public class JwtUtils { return false; } } + public static String extractUserId(String token) { try { return JWT.decode(token).getAudience().get(0); // 从 token 中提取用户ID @@ -82,4 +81,9 @@ public class JwtUtils { return null; } } + + @PostConstruct + public void setUserService() { + staticUserMapper = userMapper; + } } From 2c51b043814d3d31518876dc5a7b1c9e13824745 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Mon, 26 Aug 2024 10:21:01 +0800 Subject: [PATCH 14/14] =?UTF-8?q?feat(user):=20=E4=B8=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A1=A8=E6=B7=BB=E5=8A=A0=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=20(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/top/suyiiyii/sims/entity/User.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/top/suyiiyii/sims/entity/User.java b/src/main/java/top/suyiiyii/sims/entity/User.java index b5c0a58..7fadf55 100644 --- a/src/main/java/top/suyiiyii/sims/entity/User.java +++ b/src/main/java/top/suyiiyii/sims/entity/User.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.tangzc.mpe.autotable.annotation.Column; import com.tangzc.mpe.autotable.annotation.ColumnId; import com.tangzc.mpe.autotable.annotation.Table; +import com.tangzc.mpe.autotable.annotation.UniqueIndex; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -23,16 +24,21 @@ import lombok.NoArgsConstructor; public class User { @ColumnId(mode = IdType.AUTO, comment = "id主键") private Integer id; + @UniqueIndex @Column(comment = "学生id", notNull = true) private Integer studentId; + @UniqueIndex @Column(comment = "用户名", notNull = true) private String username; @Column(comment = "密码", notNull = true) private String password; + @UniqueIndex @Column(comment = "邮箱", notNull = true) private String email; + @UniqueIndex @Column(comment = "年级", notNull = true) private String grade; + @UniqueIndex @Column(comment = "用户所属团队", notNull = true) private String userGroup; }