Commit 678e2873 authored by 陈立彬's avatar 陈立彬

权限&时间统一格式化

parent 271b2097
......@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<version>3.0.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.breeze</groupId>
......@@ -114,6 +114,11 @@
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- jwt支持 -->
<dependency>
<groupId>com.auth0</groupId>
......@@ -121,9 +126,16 @@
<version>3.4.0</version>
</dependency>
<!--security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- JWT 支持 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-security</artifactId>-->
<!-- <groupId>io.jsonwebtoken</groupId>-->
<!-- <artifactId>jjwt</artifactId>-->
<!-- <version>0.9.1</version>-->
<!-- </dependency>-->
</dependencies>
......
......@@ -3,8 +3,9 @@ package cn.breeze.elleai;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
@SpringBootApplication
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@EnableKnife4j
public class ElleaiApplication {
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineQaSaveDto implements Serializable {
......
......@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class ExamineRecordRequestDto implements Serializable {
......@@ -28,4 +29,12 @@ public class ExamineRecordRequestDto implements Serializable {
@Schema(description = "对练模式(0练习 1对练)")
@JsonProperty("examine_mode")
private Integer examineMode;
@Schema(description = "开始时间")
@JsonProperty("start_time")
private Date startTime;
@Schema(description = "结束时间")
@JsonProperty("end_time")
private Date endTime;
}
......@@ -8,7 +8,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......@@ -55,7 +55,7 @@ public class ExamineSaveDto implements Serializable {
@Schema(description = "开始时间")
@JsonProperty("start_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime startTime;
private Date startTime;
/**
* 结束时间
......@@ -63,7 +63,7 @@ public class ExamineSaveDto implements Serializable {
@Schema(description = "结束时间")
@JsonProperty("end_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime endTime;
private Date endTime;
/**
* 状态(0禁用 1启用)
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneCategorySaveDto implements Serializable {
......
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneSaveDto implements Serializable {
......
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ProperNounSaveDto implements Serializable {
......
......@@ -6,7 +6,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiCategorySaveDto implements Serializable {
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineDetailRecordMobileDto implements Serializable {
......@@ -63,12 +63,12 @@ public class ExamineDetailRecordMobileDto implements Serializable {
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonProperty("update_time")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -7,7 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineQaDifyDto implements Serializable {
......
......@@ -8,7 +8,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineQaDto implements Serializable {
......@@ -55,7 +55,7 @@ public class ExamineQaDto implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -63,5 +63,5 @@ public class ExamineQaDto implements Serializable {
@Schema(description = "更新时间")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
package cn.breeze.elleai.application.dto.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Date;
import java.util.List;
@Data
public class ExamineRecordDto implements Serializable {
@Schema(description = "对练记录ID")
private Integer id;
/**
* 用户ID
*/
@Schema(description = "用户ID")
@JsonProperty("user_id")
private String userId;
/**
* 会话ID
*/
@Schema(description = "会话ID")
@JsonProperty("session_id")
private String sessionId;
/**
* 对练ID
*/
@Schema(description = "对练ID")
@JsonProperty("examine_id")
private Integer examineId;
@Schema(description = "对练名称")
@JsonProperty("examine_name")
private String examineName;
@Schema(description = "对练描述")
@JsonProperty("examine_description")
private String examineDescription;
/**
* 对练模式(0练习 1对练)
*/
@Schema(description = "对练模式(0练习 1对练)")
@JsonProperty("examine_mode")
private Integer examineMode;
/**
* 已答题数量
*/
@Schema(description = "已答题数量")
@JsonProperty("answered_num")
private Integer answeredNum;
/**
* 综合评分
*/
@Schema(description = "综合评分")
@JsonProperty("overall_score")
private Float overallScore;
/**
* 综合评价
*/
@Schema(description = "综合评价")
@JsonProperty("overall_evaluation")
private String overallEvaluation;
/**
* 创建时间
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonProperty("update_time")
private Date updateTime;
/**
* 答题明细
*/
@Schema(description = "答题明细列表")
@JsonProperty("details")
private List<ExamineDetailRecordMobileDto> details;
}
package cn.breeze.elleai.application.dto.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......@@ -76,14 +77,16 @@ public class ExamineRecordMobileDto implements Serializable {
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonProperty("update_time")
private LocalDateTime updateTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date updateTime;
/**
* 答题明细
......
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneCategoryDto implements Serializable {
......@@ -65,7 +65,7 @@ public class ExamineSceneCategoryDto implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -73,7 +73,7 @@ public class ExamineSceneCategoryDto implements Serializable {
@Schema(description = "更新时间")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
/**
* 父级分类ID
......
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneDto implements Serializable {
......@@ -44,7 +44,7 @@ public class ExamineSceneDto implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -52,5 +52,5 @@ public class ExamineSceneDto implements Serializable {
@Schema(description = "update_time")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class HotQaMobileDto implements Serializable {
......
......@@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ProperNounDto implements Serializable {
......@@ -38,12 +38,12 @@ public class ProperNounDto implements Serializable {
*/
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class QaAssistantDto implements Serializable {
......@@ -57,12 +57,12 @@ public class QaAssistantDto implements Serializable {
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonProperty("update_time")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class UserChatCompletionDto implements Serializable {
......@@ -32,12 +32,12 @@ public class UserChatCompletionDto implements Serializable {
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private LocalDateTime createTime;
private Date createTime;
/**
* 最后更新时间
*/
@Schema(description = "更新时间")
@JsonProperty("update_time")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class UserChatCompletionHistoryDto implements Serializable {
......@@ -37,5 +37,5 @@ public class UserChatCompletionHistoryDto implements Serializable {
*/
@Schema(description = "创建时间")
@JsonProperty("create_time")
private LocalDateTime createTime;
private Date createTime;
}
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiCategoryDto implements Serializable {
......@@ -45,7 +45,7 @@ public class WikiCategoryDto implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -53,5 +53,5 @@ public class WikiCategoryDto implements Serializable {
@Schema(description = "update_time")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiDto implements Serializable {
......@@ -85,7 +85,7 @@ public class WikiDto implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -93,5 +93,5 @@ public class WikiDto implements Serializable {
@Schema(description = "update_time")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -566,11 +566,8 @@ public class AppExamineService {
List<ExamineDto> dtoList = page.getRecords().stream().map(v -> {
ExamineDto dto = BeanUtil.copyProperties(v, ExamineDto.class);
long startTime = v.getStartTime().toEpochSecond(ZoneOffset.UTC);
dto.setStartTime(startTime);
long endTime = v.getEndTime().toEpochSecond(ZoneOffset.UTC);
dto.setEndTime(endTime);
dto.setStartTime(v.getStartTime().getTime());
dto.setEndTime(v.getEndTime().getTime());
return dto;
}).collect(Collectors.toList());
......@@ -598,11 +595,8 @@ public class AppExamineService {
List<ExamineMobileDto> dtoList = page.getRecords().stream().map(v -> {
ExamineMobileDto dto = BeanUtil.copyProperties(v, ExamineMobileDto.class);
long startTime = v.getStartTime().toEpochSecond(ZoneOffset.UTC);
dto.setStartTime(startTime);
long endTime = v.getEndTime().toEpochSecond(ZoneOffset.UTC);
dto.setEndTime(endTime);
dto.setStartTime(v.getStartTime().getTime());
dto.setEndTime(v.getEndTime().getTime());
// 已考人数
long examCount = 0;
......@@ -673,6 +667,39 @@ public class AppExamineService {
return pageResult;
}
/**
* 用户对练记录
* @param request
* @return
*/
public PageResult<ExamineRecordDto> examineRecordPaginQuery(ExamineRecordRequestDto request) {
ExamineRecordRequestModel requestModel = BeanUtil.copyProperties(request, ExamineRecordRequestModel.class);
Page<ExamineRecordResponseModel> page = examineService.examineRecordPaginQuery(requestModel);
PageResult<ExamineRecordDto> pageResult = PageResult.of(request.getPageNo(), request.getPageSize(), (int) page.getTotalRow(), null);
if(CollectionUtil.isNotEmpty(page.getRecords())) {
List<ExamineRecordDto> dtoList = page.getRecords().stream().map(v -> {
ExamineRecordDto dto = BeanUtil.copyProperties(v, ExamineRecordDto.class);
ExamineDto examineDto = examineDetail(dto.getExamineId());
if(Objects.nonNull(examineDto)) {
dto.setExamineName(examineDto.getName());
dto.setExamineDescription(examineDto.getDescription());
}
return dto;
}).collect(Collectors.toList());
pageResult.setItems(dtoList);
}
return pageResult;
}
/************************************************** 资料库分类 **************************************************/
/**
......
package cn.breeze.elleai.config;
import cn.breeze.elleai.application.dto.ApiResponse;
import cn.breeze.elleai.exception.InternalException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
......@@ -12,23 +12,17 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
* 请求接口处理
* @author Administrator
*/
@RestControllerAdvice
//@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@Value("${spring.application.name:}")
private String applicationName;
// @ExceptionHandler(InternalException.class)
// public ResponseEntity<ApiResponse> handleException(InternalException e) {
// e.printStackTrace();
// log.error("出错啦:ex = {}, message = {}", e.getDescription(), e.getStackTrace());
// ApiResponse error = ApiResponse.fail(e.getCode(), e.getDescription(), e.getDescription());
// error.setModule(applicationName);
// return new ResponseEntity<>(error, HttpStatus.OK);
// }
@ExceptionHandler(InternalException.class)
public ResponseEntity<ApiResponse> handleException(InternalException e) {
e.printStackTrace();
log.error("出错啦:ex = {}, message = {}", e.getDescription(), e.getStackTrace());
ApiResponse error = ApiResponse.fail(e.getCode(), e.getDescription());
return new ResponseEntity<>(error, HttpStatus.OK);
}
@ExceptionHandler(Exception.class)
......
......@@ -18,6 +18,9 @@ public class GlobalWebWebConfigurer implements WebMvcConfigurer {
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
QueryParamHandlerMethodArgumentResolver queryParamHandlerMethodArgumentResolver = new QueryParamHandlerMethodArgumentResolver();
resolvers.add(queryParamHandlerMethodArgumentResolver);
UserPrincipalHandlerMethodArgumentResolver userPrincipalHandlerMethodArgumentResolver = new UserPrincipalHandlerMethodArgumentResolver();
resolvers.add(userPrincipalHandlerMethodArgumentResolver);
}
@Override
......
package cn.breeze.elleai.config;
import cn.breeze.elleai.util.Codes;
import cn.breeze.elleai.util.JwtUtil;
import cn.breeze.elleai.util.PrincipalEnum;
import cn.breeze.elleai.util.UserPrincipal;
import cn.hutool.core.util.StrUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import reactor.core.publisher.Mono;
import java.util.Objects;
/**
*
......@@ -25,18 +31,13 @@ public class UserPrincipalHandlerMethodArgumentResolver implements HandlerMethod
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
UserPrincipal userPrincipal = null;
String username = webRequest.getHeader(Codes.X_JWT_UN);
String uid = webRequest.getHeader(Codes.X_JWT_UID);
String type = webRequest.getHeader(Codes.X_JWT_TYPE);
String jti = webRequest.getHeader(Codes.X_JWT_JTI);
if (StrUtil.isAllNotBlank(uid, username, type)) {
userPrincipal = new UserPrincipal();
//最少要有用户ID、用户名和用户类型(mobile, openapi, admin)其中一种
userPrincipal.setUserId(Long.valueOf(uid));
userPrincipal.setType(PrincipalEnum.valueOf(type));
userPrincipal.setUsername(username);
userPrincipal.setJti(jti);
Mono<Authentication> convert = JwtUtil.convert(request);
Authentication authentication = convert.toFuture().get();
if(Objects.nonNull(authentication)) {
userPrincipal = (UserPrincipal) authentication.getPrincipal();
}
return userPrincipal;
}
......
......@@ -10,6 +10,7 @@ import cn.breeze.elleai.application.dto.response.QaAssistantDto;
import cn.breeze.elleai.application.dto.response.UserChatCompletionHistoryDto;
import cn.breeze.elleai.application.service.AppChatCompletionService;
import cn.breeze.elleai.config.QueryParam;
import com.alibaba.fastjson.JSON;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
......@@ -34,6 +35,8 @@ public class ChatCompletionMobileController {
@GetMapping("/hot/list")
public ApiResponse<PageResult<HotQaMobileDto>> hotList(@QueryParam QaAssistantRequestDto request) {
PageResult<HotQaMobileDto> pageResult = new PageResult<>();
String json = "{\"items\": [{\"question\": \"热门提问1\"},{\"question\": \"热门提问2\"},{\"question\": \"热门提问3\"},{\"question\": \"热门提问4\"},{\"question\": \"热门提问5\"},{\"question\": \"热门提问6\"},{\"question\": \"热门提问7\"},{\"question\": \"热门提问8\"},{\"question\": \"热门提问9\"},{\"question\": \"热门提问10\"}],\"total\": 10,\"total_page\": 1,\"page_no\": 1,\"page_size\": 10}";
pageResult = JSON.parseObject(json, PageResult.class);
return ApiResponse.ok(pageResult);
}
......
......@@ -3,12 +3,12 @@ package cn.breeze.elleai.controller;
import cn.breeze.elleai.application.dto.ApiResponse;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.request.ExamineQaRequestDto;
import cn.breeze.elleai.application.dto.request.ExamineQaSaveDto;
import cn.breeze.elleai.application.dto.request.ExamineRecordRequestDto;
import cn.breeze.elleai.application.dto.request.ExamineRequestDto;
import cn.breeze.elleai.application.dto.request.ExamineSaveDto;
import cn.breeze.elleai.application.dto.response.ExamineDto;
import cn.breeze.elleai.application.dto.response.ExamineQaDto;
import cn.breeze.elleai.application.dto.response.ExamineRecordDto;
import cn.breeze.elleai.application.dto.response.ExamineRecordMobileDto;
import cn.breeze.elleai.application.service.AppExamineService;
import cn.breeze.elleai.config.QueryParam;
import io.swagger.v3.oas.annotations.Operation;
......@@ -61,4 +61,18 @@ public class ExamineController {
PageResult<ExamineDto> pageResult = examineService.examinePaginQuery(request);
return ApiResponse.ok(pageResult);
}
@Operation(summary = "对练记录详情", tags = "对练记录")
@GetMapping("/record/detail/{id}")
public ApiResponse<ExamineRecordMobileDto> recordDetail(@Schema(description = "对练记录ID") @PathVariable("id") Integer id) {
ExamineRecordMobileDto detail = examineService.examineRecordMobileDetail(id);
return ApiResponse.ok(detail);
}
@Operation(summary = "对练记录列表", tags = "对练记录")
@GetMapping("/record/list")
public ApiResponse<PageResult<ExamineRecordDto>> recordList(@QueryParam ExamineRecordRequestDto request) {
PageResult<ExamineRecordDto> pageResult = examineService.examineRecordPaginQuery(request);
return ApiResponse.ok(pageResult);
}
}
......@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class ExamineRecordRequestModel implements Serializable {
......@@ -27,5 +28,9 @@ public class ExamineRecordRequestModel implements Serializable {
* 对练模式(0练习 1对练)
*/
private Integer examineMode;
private Date startTime;
private Date endTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......@@ -43,13 +43,13 @@ public class ExamineSaveModel implements Serializable {
* 开始时间
*/
@JsonProperty("start_time")
private LocalDateTime startTime;
private Date startTime;
/**
* 结束时间
*/
@JsonProperty("end_time")
private LocalDateTime endTime;
private Date endTime;
/**
* 状态(0禁用 1启用)
......
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneCategorySaveModel implements Serializable {
......@@ -47,13 +47,13 @@ public class ExamineSceneCategorySaveModel implements Serializable {
* 创建时间
*/
@JsonProperty("create_time")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
@JsonProperty("update_time")
private LocalDateTime updateTime;
private Date updateTime;
/**
* 父级分类ID
......
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.request;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneSaveModel implements Serializable {
......@@ -38,10 +38,10 @@ public class ExamineSceneSaveModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ProperNounSaveModel implements Serializable {
......@@ -35,12 +35,12 @@ public class ProperNounSaveModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class QaAssistantSaveModel implements Serializable {
......@@ -49,12 +49,12 @@ public class QaAssistantSaveModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiCategorySaveModel implements Serializable {
......
......@@ -5,7 +5,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiSaveModel implements Serializable {
......
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineDetailRecordResponseModel implements Serializable {
......@@ -38,10 +38,10 @@ public class ExamineDetailRecordResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineQaResponseModel implements Serializable {
......@@ -50,7 +50,7 @@ public class ExamineQaResponseModel implements Serializable {
@Schema(description = "创建时间")
@JsonProperty("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
......@@ -58,6 +58,6 @@ public class ExamineQaResponseModel implements Serializable {
@Schema(description = "更新时间")
@JsonProperty("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineQaXrefResponseModel implements Serializable {
......@@ -29,11 +29,11 @@ public class ExamineQaXrefResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......@@ -52,10 +52,10 @@ public class ExamineRecordResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
......@@ -40,12 +40,12 @@ public class ExamineResponseModel implements Serializable {
/**
* 开始时间
*/
private LocalDateTime startTime;
private Date startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
private Date endTime;
/**
* 状态(0禁用 1启用)
......@@ -65,12 +65,12 @@ public class ExamineResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
/**
* 关联题目列表
......
......@@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneCategoryResponseModel implements Serializable {
......@@ -56,12 +56,12 @@ public class ExamineSceneCategoryResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
/**
* 父级分类ID
......
......@@ -5,7 +5,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ExamineSceneResponseModel implements Serializable {
......@@ -40,11 +40,11 @@ public class ExamineSceneResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class ProperNounResponseModel implements Serializable {
......@@ -34,11 +34,11 @@ public class ProperNounResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class QaAssistantResponseModel implements Serializable {
......@@ -50,11 +50,11 @@ public class QaAssistantResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -3,7 +3,7 @@ package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class UserChatCompletionHistoryResponseModel implements Serializable {
......@@ -28,6 +28,6 @@ public class UserChatCompletionHistoryResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class UserChatCompletionResponseModel implements Serializable {
......@@ -24,11 +24,11 @@ public class UserChatCompletionResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiCategoryResponseModel implements Serializable {
......@@ -40,11 +40,11 @@ public class WikiCategoryResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -5,7 +5,7 @@ import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class WikiResponseModel implements Serializable {
......@@ -61,11 +61,11 @@ public class WikiResponseModel implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -24,7 +24,7 @@ import com.mybatisflex.core.update.UpdateChain;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
......@@ -112,7 +112,7 @@ public class ChatCompletionServiceImpl implements ChatCompletionService{
UserChatCompletionEntity entity = new UserChatCompletionEntity();
entity.setUserId(userId);
entity.setSessionId(sessionId);
entity.setUpdateTime(LocalDateTime.now());
entity.setUpdateTime(new Date());
chatCompletionMapper.insertOrUpdateSelective(entity);
return entity.getId();
}
......@@ -123,7 +123,7 @@ public class ChatCompletionServiceImpl implements ChatCompletionService{
entity.setChatCompletionId(chatCompletionId);
entity.setType(type);
entity.setContent(content);
entity.setCreateTime(LocalDateTime.now());
entity.setCreateTime(new Date());
chatCompletionHistoryMapper.insertOrUpdateSelective(entity);
}
......@@ -168,7 +168,7 @@ public class ChatCompletionServiceImpl implements ChatCompletionService{
public void updateQaAssistantStatus(Integer id, Integer status) {
UpdateChain.of(QaAssistantEntity.class)
.set(QA_ASSISTANT_ENTITY.STATUS, status)
.set(QA_ASSISTANT_ENTITY.UPDATE_TIME, LocalDateTime.now())
.set(QA_ASSISTANT_ENTITY.UPDATE_TIME, new Date())
.where(QA_ASSISTANT_ENTITY.ID.eq(id))
.update();
}
......@@ -177,7 +177,7 @@ public class ChatCompletionServiceImpl implements ChatCompletionService{
public void deleteQaAssistant(Integer id) {
UpdateChain.of(QaAssistantEntity.class)
.set(QA_ASSISTANT_ENTITY.DELETED, 1)
.set(QA_ASSISTANT_ENTITY.UPDATE_TIME, LocalDateTime.now())
.set(QA_ASSISTANT_ENTITY.UPDATE_TIME, new Date())
.where(QA_ASSISTANT_ENTITY.ID.eq(id))
.update();
}
......@@ -185,7 +185,7 @@ public class ChatCompletionServiceImpl implements ChatCompletionService{
@Override
public void saveQaAssistant(QaAssistantSaveModel dto) {
QaAssistantEntity entity = BeanUtil.toBean(dto, QaAssistantEntity.class);
entity.setUpdateTime(LocalDateTime.now());
entity.setUpdateTime(new Date());
if(Objects.isNull(entity.getId())) {
entity.setStatus(1);
entity.setDeleted(0);
......
......@@ -14,7 +14,7 @@ import com.mybatisflex.core.update.UpdateChain;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
......@@ -67,7 +67,7 @@ public class CommonServiceImpl implements CommonService{
public void updateProperNounStatus(Integer id, Integer status) {
UpdateChain.of(ProperNounEntity.class)
.set(PROPER_NOUN_ENTITY.STATUS, status)
.set(PROPER_NOUN_ENTITY.UPDATE_TIME, LocalDateTime.now())
.set(PROPER_NOUN_ENTITY.UPDATE_TIME, new Date())
.where(PROPER_NOUN_ENTITY.ID.eq(id))
.update();
}
......@@ -76,7 +76,7 @@ public class CommonServiceImpl implements CommonService{
public void deleteProperNoun(Integer id) {
UpdateChain.of(ProperNounEntity.class)
.set(PROPER_NOUN_ENTITY.DELETED, 1)
.set(PROPER_NOUN_ENTITY.UPDATE_TIME, LocalDateTime.now())
.set(PROPER_NOUN_ENTITY.UPDATE_TIME, new Date())
.where(PROPER_NOUN_ENTITY.ID.eq(id))
.update();
}
......@@ -84,7 +84,7 @@ public class CommonServiceImpl implements CommonService{
@Override
public void saveProperNoun(ProperNounSaveModel dto) {
ProperNounEntity entity = BeanUtil.toBean(dto, ProperNounEntity.class);
entity.setUpdateTime(LocalDateTime.now());
entity.setUpdateTime(new Date());
if(Objects.isNull(entity.getId())) {
entity.setStatus(1);
entity.setDeleted(0);
......
package cn.breeze.elleai.exception;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
/**
*
* 内部异常类
* @author Administrator
*/
@Getter
@Setter
public class InternalException extends RuntimeException {
public InternalException() {
super();
}
public InternalException(int code, String description) {
super();
this.code = code;
this.description = description;
}
/**
* 错误码
*/
@Schema(description = "错误编码")
private int code;
/**
* 错误信息描述
*/
@Schema(description = "错误描述")
private String description;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -60,12 +60,12 @@ public class ExamineEntity implements Serializable {
/**
* 开始时间
*/
private LocalDateTime startTime;
private Date startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
private Date endTime;
/**
* 状态(0禁用 1启用)
......@@ -85,11 +85,11 @@ public class ExamineEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -60,11 +60,11 @@ public class ExamineQaEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -50,11 +50,11 @@ public class ExamineQaXrefEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -65,12 +65,12 @@ public class ExamineSceneCategoryEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
/**
* 父级分类ID
......
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -60,11 +60,11 @@ public class ExamineSceneEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -55,11 +55,11 @@ public class ProperNounEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -70,11 +70,11 @@ public class QaAssistantEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -11,7 +11,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 实体类。
......@@ -45,11 +45,11 @@ public class UserChatCompletionEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 实体类。
......@@ -49,6 +49,6 @@ public class UserChatCompletionHistoryEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -60,11 +60,11 @@ public class UserExamineDetailRecordEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -70,11 +70,11 @@ public class UserExamineRecordEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -55,12 +55,12 @@ public class WikiCategoryEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
/**
* 父级分类ID
......
......@@ -4,7 +4,7 @@ import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.io.Serial;
......@@ -80,11 +80,11 @@ public class WikiEntity implements Serializable {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
private Date updateTime;
}
package cn.breeze.elleai.security;
import cn.breeze.elleai.util.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.core.Authentication;
import org.springframework.web.servlet.HandlerInterceptor;
import reactor.core.publisher.Mono;
import java.util.*;
@Slf4j
public class JwtInterceptor implements HandlerInterceptor {
@SneakyThrows
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("token");
if(StringUtils.isEmpty(token)){
System.out.println("json不能为空");
}
Mono<Authentication> convert = JwtUtil.convert(request);
Authentication authentication = convert.toFuture().get();
if(Objects.isNull(authentication)) {
response.setStatus(401);
return false;
}
return true;
}
}
package cn.breeze.elleai.security;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SecurityConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new JwtInterceptor())
// //拦截的路径
// .addPathPatterns("/**")
// //排除登录接口
// .excludePathPatterns("/front/getToken");
}
}
\ No newline at end of file
......@@ -6,17 +6,6 @@ package cn.breeze.elleai.util;
public abstract class Codes {
/**
* 启用的状态
*/
public static final Byte ENABLED_BYTE = Byte.valueOf("1");
/**
* 停用的状态
*/
public static final Byte DISABLED_BYTE = Byte.valueOf("0");
/**
* 启用的状态
*/
......@@ -31,12 +20,7 @@ public abstract class Codes {
/**
* jwt签名
*/
public static final String JWT_SIGN_KEY = "ZDQ0MjhlODYyNzE4MzJhZWUyN2U1MTQ5Yzk2NTA5MGU=";
/**
* aes签名key
*/
public static final String JWT_AES_KEY = "fys3xpev0bupb7u1wah3zg7tr3syumzr";
public static final String JWT_SIGN_KEY = "mezeron-ai";
/**
......
package cn.breeze.elleai.util;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author qx
* @date 2023/7/4
* @des Jwt配置类
*/
@Component
@ConfigurationProperties(prefix = "jwt")
@Data
public class JwtProperties {
/**
* 过期时间-分钟
*/
private Integer expireTime;
/**
* refreshToken时间
*/
private Integer refreshTime;
/**
* 密钥
*/
private String secret;
}
package cn.breeze.elleai.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
* @author qx
* @date 2023/7/4
* @des JWT工具类
*/
@Component
@RequiredArgsConstructor
public class JwtUtil {
private final JwtProperties jwtProperties;
public static UserPrincipal checkAndTransformV2(String token) {
Algorithm algorithm = Algorithm.HMAC256("mezeron-ai");
JWTVerifier verifier = com.auth0.jwt.JWT.require(algorithm)
.withIssuer("oss")
.build();
DecodedJWT jwt = verifier.verify(token);
/**
* 生成一个jwt字符串
*
* @param username 用户名
* @return jwt字符串
*/
public String sign(String username) {
Algorithm algorithm = Algorithm.HMAC256(jwtProperties.getSecret());
return JWT.create()
// 设置过期时间1个小时
.withExpiresAt(new Date(System.currentTimeMillis() + jwtProperties.getExpireTime() * 60 * 1000))
// 设置负载
.withClaim("username", username).sign(algorithm);
}
/**
* 生成refreshToken
*
* @param username 用户名
* @return
*/
public String refreshToken(String username) {
Algorithm algorithm = Algorithm.HMAC256(jwtProperties.getSecret());
return JWT.create()
// 设置更新时间2个小时
.withExpiresAt(new Date(System.currentTimeMillis() + jwtProperties.getRefreshTime() * 60 * 1000))
// 设置负载
.withClaim("username", username).sign(algorithm);
}
String userId = jwt.getClaim("userId").asString();
String userName = jwt.getClaim("userName").asString();
String position = jwt.getClaim("position").asString();
String shopId = jwt.getClaim("shopId").asString();
String shopName = jwt.getClaim("shopName").asString();
String jobTitle = jwt.getClaim("jobTitle").asString();
public static void main(String[] args) {
Algorithm algorithm = Algorithm.HMAC256("KU5TjMO6zmh03bU3");
String username = "admin";
String token = JWT.create()
// 设置过期时间1个小时
.withExpiresAt(new Date(System.currentTimeMillis() + 60 * 60 * 1000))
// 设置负载
.withClaim("username", username).sign(algorithm);
System.out.println(token);
UserPrincipal principal = new UserPrincipal();
principal.setUserId(userId);
principal.setUserName(userName);
principal.setPosition(position);
principal.setShopId(shopId);
principal.setShopName(shopName);
principal.setJobTitle(jobTitle);
return principal;
}
/**
* 校验token是否正确
*
* @param token token值
*/
public boolean verify(String token) {
if (token == null || token.length() == 0) {
throw new RuntimeException("token为空");
}
try {
Algorithm algorithm = Algorithm.HMAC256(jwtProperties.getSecret());
JWTVerifier jwtVerifier = JWT.require(algorithm).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
Map<String, Claim> map = decodedJWT.getClaims();
System.out.println("claims:" + map.get("username").asString());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static Mono<Authentication> convert(HttpServletRequest request) {
return Mono.just(request).flatMap(ex -> {
String token = null;
/**
* 重新生成token和refreshToken
*
* @param refreshToken refreshToken
* @return 返回token和refreshToken
*/
public Map<String, String> refreshJwt(String refreshToken) {
if (refreshToken == null || refreshToken.length() == 0) {
throw new RuntimeException("refreshToken为空");
}
Algorithm algorithm = Algorithm.HMAC256(jwtProperties.getSecret());
JWTVerifier jwtVerifier = JWT.require(algorithm).build();
DecodedJWT decodedJWT = jwtVerifier.verify(refreshToken);
Map<String, Claim> map = decodedJWT.getClaims();
// 获取用户名
String username = map.get("username").asString();
Map<String, String> resultMap = new HashMap<>();
// 重新生成token和refreshToken
resultMap.put("token", sign(username));
resultMap.put("refreshToken", refreshToken(username));
return resultMap;
String headerVal = request.getHeader("Authorization");
if (StrUtil.isNotBlank(headerVal) && headerVal.startsWith("Bearer ")) {
token = headerVal.substring(7);
} else {
Cookie[] cookies = request.getCookies();
if (Objects.nonNull(cookies) && cookies.length > 0) {
Optional<Cookie> jwt = Arrays.stream(cookies).filter(v -> Objects.equals(v.getName(), "jwt")).findFirst();
if (jwt.isPresent()) {
token = jwt.get().getValue();
}
}
}
return Mono.justOrEmpty(token);
}).flatMap(token -> Mono.justOrEmpty(checkAndTransformV2(token))
.map(payload -> {
if(ObjectUtil.isNull(payload)) {
//解密失败,jwt无效时返回为通过的授权
return UsernamePasswordAuthenticationToken.unauthenticated("", "");
} else {
//解密成功,jwt验证通过,返回授权
return UsernamePasswordAuthenticationToken.authenticated(payload, "", Collections.emptyList());
}
}));
}
}
package cn.breeze.elleai.util;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
@Data
@Component
@ConfigurationProperties(prefix = "token")
public class JwtUtils {
private long expireTime;
private String secret;
private String header;
protected static final long MILLIS_SECOND = 1000;
protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
// 生成JWT
// public String generateToken(String account) {
//
// Date nowDate = new Date();
// Date expireDate = new Date(nowDate.getTime() + MILLIS_SECOND * expireTime);
//
// return Jwts.builder()
// .setHeaderParam("typ", "JWT")
// .setSubject(account)
// .setIssuedAt(nowDate)
// .setExpiration(expireDate)
// .signWith(SignatureAlgorithm.HS512, secret)
// .compact();
// }
// // 解析JWT
// public Claims getClaimsByToken(String jwt) {
// try {
// return Jwts.parser()
// .setSigningKey(secret)
// .parseClaimsJws(jwt)
// .getBody();
// } catch (Exception e) {
// return null;
// }
// }
//
// // 判断JWT是否过期
// public boolean isTokenExpired(Claims claims) {
// return claims.getExpiration().before(new Date());
// }
}
package cn.breeze.elleai.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author qx
* @date 2023/7/4
* @des 登录过滤器
*/
//@Component
//@WebFilter(urlPatterns = "/**")
public class LoginFilter implements Filter {
// @Value("${sso_server}")
private String serverHost;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = httpServletRequest.getParameter("token");
if (this.check(token)) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
// token过期后再使用refreshToken处理
String refreshToken = httpServletRequest.getHeader("refreshToken");
if (check(refreshToken)) {
// 重新生成token和refreshtoken给客户端保存 下次传递token参数的时候使用这个重新生成的
System.out.println("更新后的token和refreshToken:" + refreshToken(refreshToken));
filterChain.doFilter(servletRequest, servletResponse);
}
// 如果refreshToken也过期 那么需要重新登录
HttpServletResponse response = (HttpServletResponse) servletResponse;
String redirect = serverHost + "/login";
response.sendRedirect(redirect);
}
}
/**
* 验证token
*
* @param token
* @return
* @throws IOException
*/
private boolean check(String token) throws IOException {
if (token == null || token.trim().length() == 0) {
return false;
}
// OkHttpClient client = new OkHttpClient();
// // 请求验证token的合法性
// String url = serverHost + "/checkJwt?token=" + token;
// Request request = new Request.Builder().url(url).build();
// Response response = client.newCall(request).execute();
// return Boolean.parseBoolean(response.body().string());
return true;
}
/**
* 重新获取token和refreshToken
*
* @param refreshToken
* @return
* @throws IOException
*/
private String refreshToken(String refreshToken) throws IOException {
if (refreshToken == null || refreshToken.trim().length() == 0) {
return null;
}
// OkHttpClient client = new OkHttpClient();
// // 请求重新获取token和refreshToken
// String url = serverHost + "/refreshJwt?refreshToken=" + refreshToken;
// Request request = new Request.Builder().url(url).build();
// Response response = client.newCall(request).execute();
// return response.body().string();
return null;
}
}
......@@ -10,11 +10,17 @@ import java.io.Serializable;
@Data
public class UserPrincipal implements Serializable {
private String jti;
private String userId;
private String username;
private String userName;
private Long userId;
private String position;
private String jobTitle;
private String shopId;
private String shopName;
private PrincipalEnum type;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment