diff --git a/docs/初步.md b/docs/初步.md new file mode 100644 index 0000000..8eecdb7 --- /dev/null +++ b/docs/初步.md @@ -0,0 +1,14 @@ +## 角色 +管理员
+用户
+教师
+只要有多角色 就要设计
+RBAC——基于角色权限的模型 + +角色表 用户表 用户角色表 权限表 角色权限表
+ +要做全控制 +表单 按钮 视图 + + + diff --git a/src/main/java/com/guwan/backend/common/Result.java b/src/main/java/com/guwan/backend/common/Result.java index fce4ddb..c90bce5 100644 --- a/src/main/java/com/guwan/backend/common/Result.java +++ b/src/main/java/com/guwan/backend/common/Result.java @@ -10,7 +10,6 @@ public class Result { private Integer code; private String message; private T data; - private Long nums; private String time; public Result() { diff --git a/src/main/java/com/guwan/backend/common/SearchResult.java b/src/main/java/com/guwan/backend/common/SearchResult.java new file mode 100644 index 0000000..da087ad --- /dev/null +++ b/src/main/java/com/guwan/backend/common/SearchResult.java @@ -0,0 +1,98 @@ +package com.guwan.backend.common; + +import lombok.Data; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Data +public class SearchResult { + private Integer code; + private String message; + private T data; + private Long total; + private String time; + + public SearchResult() { + this.time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + } + + public static SearchResult success() { + SearchResult result = new SearchResult<>(); + result.setCode(200); + result.setMessage("操作成功"); + return result; + } + + public static SearchResult success(T data) { + SearchResult result = new SearchResult<>(); + result.setCode(200); + result.setMessage("操作成功"); + result.setData(data); + return result; + } + + public static SearchResult success(T data, Long total) { + SearchResult result = new SearchResult<>(); + result.setCode(200); + result.setMessage("操作成功"); + result.setData(data); + result.setTotal(total); + return result; + } + + public static SearchResult success(String message, T data) { + SearchResult result = new SearchResult<>(); + result.setCode(200); + result.setMessage(message); + result.setData(data); + return result; + } + + public static SearchResult error(String message) { + SearchResult result = new SearchResult<>(); + result.setCode(500); + result.setMessage(message); + return result; + } + + public static SearchResult error(Integer code, String message) { + SearchResult result = new SearchResult<>(); + result.setCode(code); + result.setMessage(message); + return result; + } + + public static SearchResult error(Integer code, String message, T data) { + SearchResult result = new SearchResult<>(); + result.setCode(code); + result.setMessage(message); + result.setData(data); + return result; + } + + // 常用状态码 + public static final int SUCCESS = 200; + public static final int ERROR = 500; + public static final int UNAUTHORIZED = 401; + public static final int FORBIDDEN = 403; + public static final int NOT_FOUND = 404; + public static final int VALIDATE_FAILED = 400; + + // 业务状态码 + public static SearchResult validateFailed(String message) { + return error(VALIDATE_FAILED, message); + } + + public static SearchResult unauthorized(String message) { + return error(UNAUTHORIZED, message); + } + + public static SearchResult forbidden(String message) { + return error(FORBIDDEN, message); + } + + public static SearchResult notFound(String message) { + return error(NOT_FOUND, message); + } +} \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/constant/CacheConstants.java b/src/main/java/com/guwan/backend/constant/CacheConstants.java index fa79ed0..b0771db 100644 --- a/src/main/java/com/guwan/backend/constant/CacheConstants.java +++ b/src/main/java/com/guwan/backend/constant/CacheConstants.java @@ -12,7 +12,8 @@ public class CacheConstants { * 缓存内容 */ public static final List CACHE_LIST = List.of( - "userCache" + "userCache", + "paperCache" ); diff --git a/src/main/java/com/guwan/backend/controller/PapersController.java b/src/main/java/com/guwan/backend/controller/PapersController.java new file mode 100644 index 0000000..92b9315 --- /dev/null +++ b/src/main/java/com/guwan/backend/controller/PapersController.java @@ -0,0 +1,114 @@ +package com.guwan.backend.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.guwan.backend.annotation.OperationLog; +import com.guwan.backend.common.Result; +import com.guwan.backend.common.SearchResult; +import com.guwan.backend.pojo.entity.Papers; +import com.guwan.backend.service.PapersService; +import com.guwan.backend.util.UUIDUtil; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 试卷控制层 + * + * @author Guwan + * @since 2025-01-11 12:06:49 + */ +@RestController +@RequestMapping("/api/common/papers") +@RequiredArgsConstructor +public class PapersController { + /** + * 服务对象 + */ + + private final PapersService papersService; + + /** + * 分页查询 + * + * @param papers 筛选条件 + * @param pageRequest 分页对象 + * @return 查询结果 + */ + @GetMapping + public SearchResult> queryByPage(@RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "1") int size) { + + + + Page papersPage = new Page<>(page, size); + + // 使用分页查询,注意 lambdaQuery().page() 方法 + IPage resultPage = papersService.lambdaQuery() + .page(papersPage); + + + + return SearchResult.success(resultPage.getRecords(), resultPage.getTotal()); + + } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ + @GetMapping("{id}") + @Operation(summary = "获取单张试卷信息") + @OperationLog(description = "获取单张试卷信息") + public Result queryById(@PathVariable("id") Integer id) { + return Result.success(this.papersService.getById(id)); + } + + /** + * 新增数据 + * + * @param papers 实体 + * @return 新增结果 + */ + @PostMapping + @Operation(summary = "创建试卷") + @OperationLog(description = "创建试卷") + public Result add(@RequestBody Papers papers) { + + + papers.setPaperUuid(UUIDUtil.uuid()); + + papersService.save(papers); + + return Result.success(); + } + + /** + * 编辑数据 + * + * @param papers 实体 + * @return 编辑结果 + */ + @PutMapping + public Result edit(Papers papers) { + //return Result.success(this.papersService.update(papers)); + return Result.success(); + } + + /** + * 删除数据 + * + * @param id 主键 + * @return 删除是否成功 + */ + @DeleteMapping + public Result deleteById(Integer id) { + return Result.success(this.papersService.removeById(id)); + } + +} + diff --git a/src/main/java/com/guwan/backend/generator/domain/Papers.java b/src/main/java/com/guwan/backend/generator/domain/Papers.java new file mode 100644 index 0000000..a51ead0 --- /dev/null +++ b/src/main/java/com/guwan/backend/generator/domain/Papers.java @@ -0,0 +1,76 @@ +package generator.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * + * @TableName papers + */ +@TableName(value ="papers") +@Data +public class Papers implements Serializable { + /** + * 试卷编号 + */ + @TableId(type = IdType.AUTO) + private Integer paperId; + + /** + * 试卷名称 + */ + private String paperName; + + /** + * 试卷描述 + */ + private String description; + + /** + * 命题人 + */ + private String paperSetter; + + /** + * 校对人 + */ + private String paperReviewer; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 考试时间 + */ + private Integer duration; + + /** + * 试卷状态 + */ + private Object status; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 修改时间 + */ + private Date updatedTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/generator/mapper/PapersMapper.java b/src/main/java/com/guwan/backend/generator/mapper/PapersMapper.java new file mode 100644 index 0000000..85e43bf --- /dev/null +++ b/src/main/java/com/guwan/backend/generator/mapper/PapersMapper.java @@ -0,0 +1,18 @@ +package generator.mapper; + +import generator.domain.Papers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Mapper +* @createDate 2025-01-11 12:09:52 +* @Entity generator.domain.Papers +*/ +public interface PapersMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/com/guwan/backend/generator/service/PapersService.java b/src/main/java/com/guwan/backend/generator/service/PapersService.java new file mode 100644 index 0000000..012e9f1 --- /dev/null +++ b/src/main/java/com/guwan/backend/generator/service/PapersService.java @@ -0,0 +1,13 @@ +package generator.service; + +import generator.domain.Papers; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Service +* @createDate 2025-01-11 12:09:52 +*/ +public interface PapersService extends IService { + +} diff --git a/src/main/java/com/guwan/backend/generator/service/impl/PapersServiceImpl.java b/src/main/java/com/guwan/backend/generator/service/impl/PapersServiceImpl.java new file mode 100644 index 0000000..5d1c0a7 --- /dev/null +++ b/src/main/java/com/guwan/backend/generator/service/impl/PapersServiceImpl.java @@ -0,0 +1,22 @@ +package generator.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import generator.domain.Papers; +import generator.service.PapersService; +import generator.mapper.PapersMapper; +import org.springframework.stereotype.Service; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Service实现 +* @createDate 2025-01-11 12:09:52 +*/ +@Service +public class PapersServiceImpl extends ServiceImpl + implements PapersService{ + +} + + + + diff --git a/src/main/java/com/guwan/backend/mapper/PapersMapper.java b/src/main/java/com/guwan/backend/mapper/PapersMapper.java new file mode 100644 index 0000000..ede174c --- /dev/null +++ b/src/main/java/com/guwan/backend/mapper/PapersMapper.java @@ -0,0 +1,18 @@ +package com.guwan.backend.mapper; + +import com.guwan.backend.pojo.entity.Papers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Mapper +* @createDate 2025-01-11 12:00:45 +* @Entity com.guwan.backend.pojo.entity.Papers +*/ +public interface PapersMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/com/guwan/backend/pojo/entity/Papers.java b/src/main/java/com/guwan/backend/pojo/entity/Papers.java new file mode 100644 index 0000000..cf71b0e --- /dev/null +++ b/src/main/java/com/guwan/backend/pojo/entity/Papers.java @@ -0,0 +1,100 @@ +package com.guwan.backend.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * + * @TableName papers + */ +@TableName(value ="papers") +@Data +public class Papers implements Serializable { + /** + * 试卷编号 + */ + @TableId(type = IdType.AUTO) + private Integer paperId; + + /** + * 试卷uuid + */ + private String paperUuid; + + /** + * 试卷名称 + */ + private String paperName; + + /** + * 试卷描述 + */ + private String description; + + /** + * 试卷满分 + */ + private int maxScore; + + /** + * 命题人 + */ + private String paperSetter; + + /** + * 校对人 + */ + private String paperReviewer; + + + /** + * 试卷状态 + */ + private String status; + + /** + * 考试时间 + */ + private Integer duration; + + + /** + * 开始时间 + */ + @DateTimeFormat //此注解用来接收字符串类型的参数封装成LocalDateTime类型 + @JsonFormat //此注解将date类型数据转成字符串响应出去 + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @DateTimeFormat //此注解用来接收字符串类型的参数封装成LocalDateTime类型 + @JsonFormat //此注解将date类型数据转成字符串响应出去 + private LocalDateTime endTime; + + /** + * 创建时间 + */ + @DateTimeFormat //此注解用来接收字符串类型的参数封装成LocalDateTime类型 + @JsonFormat //此注解将date类型数据转成字符串响应出去 + private LocalDateTime createdTime; + + /** + * 修改时间 + */ + @DateTimeFormat //此注解用来接收字符串类型的参数封装成LocalDateTime类型 + @JsonFormat //此注解将date类型数据转成字符串响应出去 + private LocalDateTime updatedTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/service/PapersService.java b/src/main/java/com/guwan/backend/service/PapersService.java new file mode 100644 index 0000000..258ea97 --- /dev/null +++ b/src/main/java/com/guwan/backend/service/PapersService.java @@ -0,0 +1,17 @@ +package com.guwan.backend.service; + +import com.guwan.backend.pojo.entity.Papers; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.cache.annotation.Cacheable; + +import java.io.Serializable; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Service +* @createDate 2025-01-11 12:00:45 +*/ +public interface PapersService extends IService { + + +} diff --git a/src/main/java/com/guwan/backend/service/impl/PapersServiceImpl.java b/src/main/java/com/guwan/backend/service/impl/PapersServiceImpl.java new file mode 100644 index 0000000..785cf94 --- /dev/null +++ b/src/main/java/com/guwan/backend/service/impl/PapersServiceImpl.java @@ -0,0 +1,60 @@ +package com.guwan.backend.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.backend.pojo.dto.user.UserDTO; +import com.guwan.backend.pojo.entity.Papers; +import com.guwan.backend.service.PapersService; +import com.guwan.backend.mapper.PapersMapper; +import com.guwan.backend.util.RedisUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.io.Serializable; + +/** +* @author 12455 +* @description 针对表【papers】的数据库操作Service实现 +* @createDate 2025-01-11 12:00:45 +*/ +@Service +@RequiredArgsConstructor +public class PapersServiceImpl extends ServiceImpl + implements PapersService{ + + + + private static final String PAPER_CACHE_KEY = "paper:"; + + private final RedisUtils redisUtil; + + @Override + @Cacheable(value = "paperCache", key = "#id") + public Papers getById(Serializable id) { + + System.out.println("id = " + id); + + + Object cache = redisUtil.get(PAPER_CACHE_KEY + id); + + + + + log.debug("开始查询数据库"); + + Papers paper = super.getById(id); + + if (paper == null) { + log.warn("试卷信息不存在"); + return null; + } + + redisUtil.set(PAPER_CACHE_KEY + id, paper); + + return paper; + } +} + + + + diff --git a/src/main/java/com/guwan/backend/xxljob/job/SimpleXxlJob.java b/src/main/java/com/guwan/backend/xxljob/job/SimpleXxlJob.java index 14842d4..b6ac740 100644 --- a/src/main/java/com/guwan/backend/xxljob/job/SimpleXxlJob.java +++ b/src/main/java/com/guwan/backend/xxljob/job/SimpleXxlJob.java @@ -34,6 +34,7 @@ public class SimpleXxlJob { System.out.println("执行定时任务,执行时间:"+sdf.format(new Date())); for (String cache : CacheConstants.CACHE_LIST) { + System.out.println("cache = " + cache); Map stats = getStats(cache); for (Map.Entry entry : stats.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4d01936..4077a32 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -212,7 +212,7 @@ logging: xxl: job: admin: - addresses: http://192.168.1.127:9001/xxl-job-admin + addresses: http://192.168.0.6:9001/xxl-job-admin accessToken: GuwanTest executor: appname: xxl-job-executor-guwan diff --git a/src/main/resources/mapper/PapersMapper.xml b/src/main/resources/mapper/PapersMapper.xml new file mode 100644 index 0000000..7583364 --- /dev/null +++ b/src/main/resources/mapper/PapersMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + paper_id,paper_name,description, + paper_setter,paper_reviewer,start_time, + end_time,duration,status, + created_time,updated_time + +