diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6e02720..ee4c4c8 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,15 +21,18 @@ jobs: steps: - uses: actions/checkout@v4 + - run: rm -rf test.db - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: maven + - run: mvn -B test --file pom.xml - name: Build with Maven run: mvn -B package -DskipTests --file pom.xml + # 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 diff --git a/.gitignore b/.gitignore index df127dd..0d33ed4 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,5 @@ build/ ### VS Code ### .vscode/ -/src/main/resources/application.yaml +/test.db +/src/main/resources/application-prod.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..8707a91 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-case-conflict + - id: check-merge-conflict + - id: check-executables-have-shebangs + args: + - --autofix + - repo: https://github.com/gherynos/pre-commit-java + rev: v0.5.4 + hooks: + - id: pmd + - id: cpd + - id: checkstyle diff --git a/pom.xml b/pom.xml index 115a8bc..29aef43 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,15 @@ mybatis-plus-ext-spring-boot3-starter 3.5.7-EXT691 + + org.springframework.session + spring-session-core + + + org.modelmapper + modelmapper + 2.3.9 + com.mysql mysql-connector-j @@ -91,6 +100,11 @@ springdoc-openapi-starter-webmvc-ui 2.3.0 + + org.xerial + sqlite-jdbc + test + diff --git a/src/main/java/top/suyiiyii/sims/SimsApplication.java b/src/main/java/top/suyiiyii/sims/SimsApplication.java index 8dba06d..adbe2d4 100644 --- a/src/main/java/top/suyiiyii/sims/SimsApplication.java +++ b/src/main/java/top/suyiiyii/sims/SimsApplication.java @@ -1,11 +1,13 @@ package top.suyiiyii.sims; import com.tangzc.autotable.springboot.EnableAutoTable; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableAutoTable @SpringBootApplication +@MapperScan("top.suyiiyii.sims.mapper") public class SimsApplication { public static void main(String[] args) { SpringApplication.run(SimsApplication.class, args); diff --git a/src/main/java/top/suyiiyii/sims/VO/UserVO.java b/src/main/java/top/suyiiyii/sims/VO/UserVO.java deleted file mode 100644 index b465ef8..0000000 --- a/src/main/java/top/suyiiyii/sims/VO/UserVO.java +++ /dev/null @@ -1,24 +0,0 @@ -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/InterceptorConfig.java b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java index 0505380..5becb7b 100644 --- a/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java +++ b/src/main/java/top/suyiiyii/sims/common/InterceptorConfig.java @@ -1,9 +1,16 @@ 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 @@ -15,14 +22,23 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp */ @Configuration public class InterceptorConfig extends WebMvcConfigurationSupport { + @Autowired + private RoleService roleService; + + + + //UserService userService; @Override protected void addInterceptors(InterceptorRegistry registry) { -// registry.addInterceptor(jwtInterceptor()) -// .addPathPatterns("/**") -// .excludePathPatterns("/user/login") // 排除不需要验证的路径 -// .excludePathPatterns("/user/register") -// .excludePathPatterns("/v3/api-docs/**"); + registry.addInterceptor(jwtInterceptor()) + .addPathPatterns("/**") + .excludePathPatterns("/user/login") // 排除不需要验证的路径 + .excludePathPatterns("/user/register") + .excludePathPatterns("/v3/api-docs/**"); + // 注册AdminInterceptor,只拦截以admin/开头的路径 + registry.addInterceptor(new AdminInterceptor()) + .addPathPatterns("/admin/**"); super.addInterceptors(registry); } @@ -31,5 +47,36 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp 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; + } + } + } } diff --git a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java index 9f9fa9a..a946758 100644 --- a/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java +++ b/src/main/java/top/suyiiyii/sims/common/JwtInterceptor.java @@ -42,10 +42,6 @@ public class JwtInterceptor implements HandlerInterceptor { return true; } } - - // request.setAttribute(); - // request.getAttribute() - // 执行认证 if (StrUtil.isBlank(token)) { //权限错误 @@ -65,6 +61,8 @@ public class JwtInterceptor implements HandlerInterceptor { if (!JwtUtils.verifyToken(token, user.getPassword())) { throw new ServiceException("401", "请登录"); } + // 验证token后,如果一切正常,将token存储到request的属性中 + request.setAttribute("token", token); return true; } } diff --git a/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java b/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java new file mode 100644 index 0000000..3241164 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/common/ModelMapperConfig.java @@ -0,0 +1,44 @@ +package top.suyiiyii.sims.common; + +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 + * @Date 2024/8/20 21:19 + * @PackageName:top.suyiiyii.sims.common + * @ClassName: ModelMapperConfig + * @Description: TODO + * @Version 1.0 + */ +@Configuration +public class ModelMapperConfig { + @Bean + public ModelMapper modelMapper() { + ModelMapper modelMapper = new ModelMapper(); + // 设置完全匹配 + modelMapper.getConfiguration().setFullTypeMatchingRequired(true); + + // 设置匹配策略为严格模式 + modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + // configureUser(modelMapper); + return modelMapper; + } + // 配置 User 类的映射规则 + private void configureUser(ModelMapper modelMapper) { + // 定义 UserModel -> User 的映射规则 + // 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 +// .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/RecordController.java b/src/main/java/top/suyiiyii/sims/controller/RecordController.java index d0f3914..52e18ea 100644 --- a/src/main/java/top/suyiiyii/sims/controller/RecordController.java +++ b/src/main/java/top/suyiiyii/sims/controller/RecordController.java @@ -1,45 +1,117 @@ 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.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 RecordController { - +public class +RecordController { + @Autowired + RecordService recordService; + @Autowired + UserService UserService; + @Autowired + RoleService roleService; + @Autowired + CategoryService categoryService; + @Autowired + ModelMapper modelMapper; + @Operation(summary = "获取所有奖惩记录") @GetMapping("/admin/record") - public Result> adminRecord(Integer page, Integer size) { - return Result.success(new ArrayList<>()); + public Result> adminRecord( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + List records = recordService.getAllRecords(page, size); + List recordDtos = new ArrayList<>(); + for (Record record : records) { + + RecordDto recordDto = modelMapper.map(record, RecordDto.class); + recordDto.setCategoryName(categoryService.getCategoryName(record.getCategoryId())); + recordDto.setSubCategoryName(categoryService.getsubCategoryName( record.getCategoryId())); + recordDtos.add(recordDto); + } + return Result.success(recordDtos); } + @Operation(summary = "获取自己的奖惩记录") @GetMapping("/record") - public Result> record(Integer page, Integer size) { - return Result.success(new ArrayList<>()); + public Result> record(@RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, + HttpServletRequest request) { + String token = (String) request.getAttribute("token"); + String userId= JwtUtils.extractUserId(token); + List recordDtos=new ArrayList<>(); + + 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())); + + recordDtos.add(recordDto); + } + return Result.success(recordDtos); + } + @Operation(summary = "更新单个奖惩记录") @PutMapping("/admin/record/{id}") public Result adminUpdateRecord(@PathVariable Integer id, @RequestBody RecordDto recordDto) { - + Record record = modelMapper.map(recordDto, Record.class); + recordService.updateRecord(record,id); return Result.msg("修改成功"); } + @Operation(summary = "删除单个奖惩记录") @DeleteMapping("/admin/record/{id}") public Result adminDeleteRecord(@PathVariable Integer id) { - + recordService.deleteRecord(id); return Result.msg("删除成功"); } + @Operation(summary = "添加奖惩记录") @PostMapping("/admin/record") public Result adminAddRecord(@RequestBody RecordDto recordDto) { + Integer categoryId = categoryService.getIdBySubCategoryName(recordDto.getSubCategoryName()); + Record record = modelMapper.map(recordDto, Record.class); + if (categoryId == null) { + Result.error("请选择奖惩类别,以及类型"); + } + record.setCategoryId(categoryId); + recordService.addRecord(record); 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 ce18f52..c9e0362 100644 --- a/src/main/java/top/suyiiyii/sims/controller/UserController.java +++ b/src/main/java/top/suyiiyii/sims/controller/UserController.java @@ -1,6 +1,8 @@ package top.suyiiyii.sims.controller; import cn.hutool.core.util.StrUtil; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -8,11 +10,14 @@ 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.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; +import java.util.List; + /** * @Author tortoise @@ -32,6 +37,7 @@ public class UserController { @Autowired RoleService roleService; + @AuthAccess @GetMapping("/") public Result hello() { @@ -41,17 +47,20 @@ public class UserController { } @PostMapping("/user/login") - public Result login(@RequestBody LoginRequest request) { + public Result login(@RequestBody LoginRequest request, HttpServletRequest httpServletRequest) { 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()); + String token = userService.login(request.getUsername(), request.getPassword()); + if (token == null) { + return Result.error("用户名或密码错误"); + } + LoginResponse response = new LoginResponse(); + response.setToken(token); + return Result.success(response); } @PostMapping("/user/register") @@ -64,26 +73,46 @@ public class UserController { if (request.getPassword() == null || request.getPassword().length() < 3) { throw new ServiceException("密码长度不能小于3位"); } - - userService.register(new User()); + 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); return Result.success(CommonResponse.factory("注册成功")); } + @Operation(description = "删除单个用户") @DeleteMapping("/admin/user/{id}") public Result adminDelete(@PathVariable Integer id) { log.info("delete request:{}", id); -// userService.deleteUser(user.getId()); + userService.deleteUser(id); return Result.success(CommonResponse.factory("删除成功")); } + @Operation(description = "获取所有用户信息") + @GetMapping("/admin/user") + public Result> adminGet() { + List allUsers = userService.findAllUsers(); + return Result.success(allUsers); + } + + @Operation(description = "根据 id 获取用户信息") @GetMapping("/admin/user/{id}") - public Result adminGetById(@PathVariable Integer id) { + public Result adminGetById(@PathVariable Integer id) { log.info("selectById request:{}", id); - User user = userService.selectById(id); + UserDto user = userService.findUser(id); return Result.success(user); } + @Operation(description = "获取当前用户信息") + @GetMapping("/user/me") + public Result getSelf() { + UserDto user = userService.findUser(0); + return Result.success(user); + } @Data diff --git a/src/main/java/top/suyiiyii/sims/dto/RecordDto.java b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java index d0e4104..617668e 100644 --- a/src/main/java/top/suyiiyii/sims/dto/RecordDto.java +++ b/src/main/java/top/suyiiyii/sims/dto/RecordDto.java @@ -5,20 +5,22 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class RecordDto { - private Integer id; + // 用户ID - private Integer userId; - // 奖惩类型 - private String type; - // 奖惩类别ID - private Integer categoryId; + private Integer studentId; + + + private String categoryName; + + private String subCategoryName; // 奖惩日期 - private LocalDateTime date; + private Long date; // 奖惩内容 private String content; // 奖惩原因 @@ -30,7 +32,7 @@ public class RecordDto { // 是否撤销 private Boolean isRevoked; // 撤销日期 - private LocalDateTime revokeDate; + private Long revokeDate; // 撤销原因 private String revokeReason; // 撤销备注 @@ -38,5 +40,5 @@ public class RecordDto { // 操作人ID private Integer operatorUserId; // 最近一次更新时间 - private LocalDateTime lastUpdateTime; + private Long lastUpdateTime; } diff --git a/src/main/java/top/suyiiyii/sims/dto/UserDto.java b/src/main/java/top/suyiiyii/sims/dto/UserDto.java index 3ad3334..403a4c8 100644 --- a/src/main/java/top/suyiiyii/sims/dto/UserDto.java +++ b/src/main/java/top/suyiiyii/sims/dto/UserDto.java @@ -14,8 +14,9 @@ import java.util.List; */ @Data public class UserDto { - private Long userId; + private Integer userId; private String username; + private String grade; + private String userGroup; private List roles; // 角色名称列表 - private List permissions; // 权限列表 } diff --git a/src/main/java/top/suyiiyii/sims/entity/Record.java b/src/main/java/top/suyiiyii/sims/entity/Record.java index c6e8d9d..6390515 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Record.java +++ b/src/main/java/top/suyiiyii/sims/entity/Record.java @@ -1,5 +1,6 @@ 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; @@ -12,7 +13,7 @@ import java.time.LocalDateTime; * @Author tortoise * @Date 2024/8/9 14:04 * @PackageName:top.suyiiyii.sims.entity - * @ClassName: Record + * @ClassName: RecordMapper * @Description: TODO * @Version 1.0 */ @@ -21,16 +22,15 @@ import java.time.LocalDateTime; @AllArgsConstructor @NoArgsConstructor public class Record { - @TableId("id") + @TableId(type = IdType.AUTO) + //自增 private Integer id; // 用户ID - private Integer userId; - // 奖惩类型 - private String type; + private Integer StudentId; // 奖惩类别ID private Integer categoryId; // 奖惩日期 - private LocalDateTime date; + private Long date; // 奖惩内容 private String content; // 奖惩原因 @@ -42,7 +42,7 @@ public class Record { // 是否撤销 private Boolean isRevoked; // 撤销日期 - private LocalDateTime revokeDate; + private Long revokeDate; // 撤销原因 private String revokeReason; // 撤销备注 @@ -50,7 +50,7 @@ public class Record { // 操作人ID private Integer operatorUserId; // 最近一次更新时间 - private LocalDateTime lastUpdateTime; + private Long lastUpdateTime; } diff --git a/src/main/java/top/suyiiyii/sims/entity/User.java b/src/main/java/top/suyiiyii/sims/entity/User.java index 6606503..d7bed55 100644 --- a/src/main/java/top/suyiiyii/sims/entity/User.java +++ b/src/main/java/top/suyiiyii/sims/entity/User.java @@ -1,14 +1,11 @@ package top.suyiiyii.sims.entity; -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 * @Date 2024/8/9 14:02 @@ -29,9 +26,5 @@ public class User { private String password; private String email; private String grade; - private String group; - @TableField(exist = false) - private String token; - @TableField(exist = false) - private Set permissions; + private String userGroup; } diff --git a/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java b/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java new file mode 100644 index 0000000..902eadc --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/CategoryMapper.java @@ -0,0 +1,23 @@ +package top.suyiiyii.sims.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +/** + * @Author tortoise + * @Date 2024/8/16 23:31 + * @PackageName:top.suyiiyii.sims.mapper + * @ClassName: CategoryMapper + * @Description: TODO + * @Version 1.0 + */ +@Mapper +public interface CategoryMapper { + @Select("SELECT * FROM reward_punishment_category WHERE category_id=#{id}") + 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}") + Integer getIdBySubCategoryName(String subCategoryName); +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpUserMapper.java b/src/main/java/top/suyiiyii/sims/mapper/MpUserMapper.java new file mode 100644 index 0000000..651b14e --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/MpUserMapper.java @@ -0,0 +1,7 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import top.suyiiyii.sims.entity.User; + +public interface MpUserMapper extends BaseMapper { +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java new file mode 100644 index 0000000..a4d635d --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java @@ -0,0 +1,52 @@ +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; + +/** + * @Author tortoise + * @Date 2024/8/16 21:39 + * @PackageName:top.suyiiyii.sims.mapper + * @ClassName: RecordMapper + * @Description: TODO + * @Version 1.0 + */ +@Mapper +public interface RecordMapper { + //分页查询 +@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); + + //根据id,更新对应信息 + @Update("UPDATE record SET " + + + "date = #{record.date}, " + + "content = #{record.content}, " + + "reason = #{record.reason}, " + + "amount = #{record.amount}, " + + "remark = #{record.remark}, " + + "is_revoked = #{record.isRevoked}, " + + "revoke_date = #{record.revokeDate}, " + + "revoke_reason = #{record.revokeReason}, " + + "revoke_remark = #{record.revokeRemark}, " + + "operator_user_id = #{record.operatorUserId}, " + + "last_update_time = #{record.lastUpdateTime} " + + "WHERE id = #{id}") + void updateRecord(Record record, Integer id); + + @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)", + "VALUES (#{studentId}, #{categoryId}, #{date}, #{content}, #{reason}, #{amount}, #{remark}, #{isRevoked},", + "#{revokeDate}, #{revokeReason}, #{revokeRemark}, #{operatorUserId}, #{lastUpdateTime})" + }) + void addRecord(Record record); +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java index d22fbfe..6a59928 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/RoleMapper.java @@ -51,8 +51,10 @@ public interface RoleMapper { "FROM role " + "WHERE role_id IN " + "(SELECT role_id FROM user_role WHERE user_id = #{user_id})") - List selectRolesById(@Param("user_id") int 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 index 8d7746a..1aef24f 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,user_id, username, password, name, email, `group`) VALUES (#{id},#{userId}, #{username}, #{password}, #{name}, #{email}, #{group})") + @Insert("insert INTO user (id,student_id, username, password, name, email, userGroup) VALUES (#{id},#{studentId}, #{username}, #{password}, #{name}, #{email}, #{userGroup})") int addUser(User user); /** @@ -39,39 +39,41 @@ public interface UserMapper extends BaseMapper { * @return 影响的行数 */ @Update("UPDATE user SET " + - "user_id = #{userId}, " + + "student_id = #{userId}, " + "username = #{username}, " + "name = #{name}, " + "email = #{email}, " + - "`group` = #{group} " + + "grade = #{grade}, " + + "userGroup = #{group} " + "WHERE id = #{id}") int updateUser(User user); /** * 根据ID查询用户信息 - * @param id 用户ID + * @param * @return 用户对象 */ - @Select("SELECT id, user_id, username, password, name, email, `group` from user WHERE id = #{Id}") - User selectByUserId(Integer userId); + @Select("SELECT id, student_id, username, password, name, email,grade,user_group from user WHERE student_id = #{id}") + User selectByUserId(Integer id); /** * 根据iD查询用户信息 * @param * @return 用户对象 */ - @Select("SELECT id, user_id, username, password, name, email, `group` from user WHERE id = #{Id}") - User selectById(Integer Id); + @Select("SELECT id, student_id, username, password, name, email,grade, user_group from user WHERE id = #{id}") + User selectById(Integer id); /** * 查询所有用户信息 * @return 用户列表 */ - @Select("SELECT id, user_id, username, password, name, email,grade, `group` FROM user") + @Select("SELECT id, student_id, username, password, name, 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}") void updatePassword(User user); - +@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 new file mode 100644 index 0000000..98e20d1 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/CategoryService.java @@ -0,0 +1,34 @@ +package top.suyiiyii.sims.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.mapper.CategoryMapper; + +/** + * @Author tortoise + * @Date 2024/8/16 23:32 + * @PackageName:top.suyiiyii.sims.service + * @ClassName: CategoryService + * @Description: TODO + * @Version 1.0 + */ +@Service +public class CategoryService { + @Autowired + CategoryMapper categoryMapper; + + + public String getCategoryName(Integer id) { + return categoryMapper.getCategoryName(id); + } + + public String getsubCategoryName(Integer categoryId) { + return categoryMapper.getSubCategoryName(categoryId); + } + + + public Integer getIdBySubCategoryName(String subCategoryName) { + return categoryMapper.getIdBySubCategoryName(subCategoryName); + + } +} diff --git a/src/main/java/top/suyiiyii/sims/service/RecordService.java b/src/main/java/top/suyiiyii/sims/service/RecordService.java new file mode 100644 index 0000000..2afc0b7 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/RecordService.java @@ -0,0 +1,51 @@ +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; + +import java.util.List; + +/** + * @Author tortoise + * @Date 2024/8/16 21:47 + * @PackageName:top.suyiiyii.sims.service + * @ClassName: RecordService + * @Description: TODO + * @Version 1.0 + */ +@Service +public class RecordService { + @Autowired + RecordMapper recordMapper; + @Autowired + UserMapper userMapper; + + public List getAllRecords(Integer page, Integer size) { + + return recordMapper.getAllRecords(page, size); + } + + + public List getMyAllRecords(Integer page, Integer size, String userId) { + String studentId = userMapper.getStudentIdById(userId); + return recordMapper.getMyAllRecords(page, size, studentId); + } + + public void updateRecord(Record record, Integer id) { + recordMapper.updateRecord(record, id); + } + + public void deleteRecord(Integer id) { + recordMapper.deleteRecord(id); + } + + public void addRecord(Record record) { + recordMapper.addRecord(record); + } +} diff --git a/src/main/java/top/suyiiyii/sims/service/RoleService.java b/src/main/java/top/suyiiyii/sims/service/RoleService.java index b8cdd70..e019e88 100644 --- a/src/main/java/top/suyiiyii/sims/service/RoleService.java +++ b/src/main/java/top/suyiiyii/sims/service/RoleService.java @@ -22,15 +22,7 @@ import java.util.List; 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(); } @@ -41,9 +33,20 @@ public class RoleService { * @param Id * @return: java.util.List */ - 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) { + if (role.getRoleName().equals("admin")) { + return true; + } + } + return false; + } } diff --git a/src/main/java/top/suyiiyii/sims/service/UserService.java b/src/main/java/top/suyiiyii/sims/service/UserService.java index 0dba25d..f870e76 100644 --- a/src/main/java/top/suyiiyii/sims/service/UserService.java +++ b/src/main/java/top/suyiiyii/sims/service/UserService.java @@ -5,7 +5,8 @@ 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.dto.UserDto; import top.suyiiyii.sims.entity.*; import top.suyiiyii.sims.exception.ServiceException; import top.suyiiyii.sims.mapper.PermissionsMapper; @@ -38,10 +39,6 @@ public class UserService { userMapper.addUser(user); } - public User selectById(int id) { - return userMapper.selectById(id); - } - public void updateUser(User user) { userMapper.updateUser(user); } @@ -54,7 +51,8 @@ public class UserService { return userMapper.selectAll(); } //TODO:返回一个DTO,用户基本信息 - public User login(String username, String password) { + public String login(String username, String password) { + User dbUser = userMapper.selectByUserName(username); if (dbUser == null) { throw new ServiceException("账号不存在"); @@ -64,10 +62,10 @@ public class UserService { } HashSet permissionsSet = new HashSet<>(); Integer id = dbUser.getId(); - List UserRoles = roleMapper.selectRolesById(id); - for (UserRole userRole : UserRoles) { + List roles = roleMapper.selectRolesById(id); + for (Role role : roles) { //根据roleid找所有permissionId - List rolePerminsion = permissionsMapper.getRolePerminsionByRoleId(userRole.getRoleId()); + List rolePerminsion = permissionsMapper.getRolePerminsionByRoleId(role.getRoleId()); for (RolePermission rolePermission : rolePerminsion) { Integer permissionId = rolePermission.getPermissionId(); //根据permissionId找permission @@ -75,13 +73,15 @@ public class UserService { permissionsSet.add(permissions); } } - dbUser.setPermissions(permissionsSet); String token = JwtUtils.createToken(dbUser.getId().toString(), dbUser.getPassword()); - dbUser.setToken(token); - return dbUser; + + + return token; + } + public User register(User user) { User dbUser = userMapper.selectByUserId(user.getStudentId()); @@ -101,7 +101,7 @@ public class UserService { if (user.getEmail() == null || user.getEmail().equals("")) { throw new ServiceException("邮箱不能为空"); } - if (user.getGroup() == null || user.getGroup().equals("")) { + if (user.getUserGroup() == null || user.getUserGroup().equals("")) { throw new ServiceException("组别不能为空"); } @@ -114,29 +114,57 @@ public class UserService { public void updatePassword(User user) { userMapper.updatePassword(user); } - public List findAllUsers(){ + public List findAllUsers(){ List users = userMapper.selectAll(); - List userVOS = new ArrayList<>(); + List UserDtos = 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<>()); + UserDto UserDto = new UserDto(); + UserDto.setUserId(user.getId()); + UserDto.setUsername(user.getUsername()); + UserDto.setGrade(user.getGrade()); + UserDto.setUserGroup(user.getUserGroup()); + UserDto.setRoles(new ArrayList<>()); Integer id = user.getId(); - List userRoles = roleMapper.selectRolesById(id); - for (UserRole userRole : userRoles) { - Integer roleId = userRole.getRoleId(); + List roles = roleMapper.selectRolesById(id); + for (Role role : roles) { + Integer roleId = role.getRoleId(); // 获取一个角色的名称列表 List roleNameList = roleMapper.selectRoleNamesByRoleId(roleId); // 累加角色名称到用户的角色列表中 - userVO.getRoles().addAll(roleNameList); + UserDto.getRoles().addAll(roleNameList); } - userVOS.add(userVO); + UserDtos.add(UserDto); } - return userVOS; + return UserDtos; + } + public UserDto findUser(Integer id) { + + UserDto UserDto = new UserDto(); + User user = userMapper.selectById(id); + UserDto.setUserId(user.getId()); + UserDto.setUsername(user.getUsername()); + UserDto.setGrade(user.getGrade()); + UserDto.setUserGroup(user.getUserGroup()); + UserDto.setRoles(new ArrayList<>()); + List roles = roleMapper.selectRolesById(id); + for (Role role : roles) { + Integer roleId = role.getRoleId(); + // 获取一个角色的名称列表 + List roleNameList = roleMapper.selectRoleNamesByRoleId(roleId); + // 累加角色名称到用户的角色列表中 + UserDto.getRoles().addAll(roleNameList); + } + + + return UserDto; } + public User selectByUserId(Integer studentId) { + return userMapper.selectByUserId(studentId); + } + + public List selectRolesById(Integer studentId) { + return roleMapper.selectRolesById(studentId); + } } diff --git a/src/main/resources/application-test.yaml b/src/main/resources/application-test.yaml new file mode 100644 index 0000000..b73be74 --- /dev/null +++ b/src/main/resources/application-test.yaml @@ -0,0 +1,8 @@ +spring: + datasource: + url: jdbc:sqlite:test.db:testdb?cache=shared + driver-class-name: org.sqlite.JDBC + username: + password: + + diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..2b0fca7 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,14 @@ +# datasource +spring: + profiles: + active: prod + datasource: + url: ${DATASOURCE_URL} + username: ${DATASOURCE_USERNAME} + password: ${DATASOURCE_PASSWORD} + driver-class-name: ${DATASOURCE_DRIVER_CLASS_NAME} + + +auto-table: + enable: true + model-package: top.suyiiyii.sims.entity \ No newline at end of file diff --git a/src/test/java/top/suyiiyii/sims/SimsApplicationTests.java b/src/test/java/top/suyiiyii/sims/SimsApplicationTests.java deleted file mode 100644 index e7a4422..0000000 --- a/src/test/java/top/suyiiyii/sims/SimsApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package top.suyiiyii.sims; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SimsApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java b/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java new file mode 100644 index 0000000..bb51181 --- /dev/null +++ b/src/test/java/top/suyiiyii/sims/mapper/UserMapperTest.java @@ -0,0 +1,33 @@ +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