GlobalAward接口token验证,id更换为uuid

This commit is contained in:
litianxiang
2026-01-21 14:34:43 +08:00
parent 30d08356c0
commit b1e6183dd1
8 changed files with 107 additions and 21 deletions

View File

@@ -76,7 +76,9 @@ public class GlobalAwardController {
UploadCompleteResponse uploadCompleteResponse = uploadService.completePdfUpload( UploadCompleteResponse uploadCompleteResponse = uploadService.completePdfUpload(
request.getUploadId(), request.getUploadId(),
request.getFileName(), request.getFileName(),
request.getTotalSize()); request.getTotalSize(),
request.getEmail(),
request.getSecureToken());
return Response.success(uploadCompleteResponse); return Response.success(uploadCompleteResponse);
} }
@@ -123,7 +125,9 @@ public class GlobalAwardController {
UploadCompleteResponse uploadCompleteResponse = uploadService.completeVideoUpload( UploadCompleteResponse uploadCompleteResponse = uploadService.completeVideoUpload(
request.getUploadId(), request.getUploadId(),
request.getFileName(), request.getFileName(),
request.getTotalSize()); request.getTotalSize(),
request.getEmail(),
request.getSecureToken());
return Response.success(uploadCompleteResponse); return Response.success(uploadCompleteResponse);
} }
@@ -141,12 +145,12 @@ public class GlobalAwardController {
return Response.success(globalAwardService.saveContestant(request)); return Response.success(globalAwardService.saveContestant(request));
} }
@GetMapping("/contestants/by-email") // @GetMapping("/contestants/by-email")
@ApiOperation(value = "根据邮箱查询参赛者", notes = "根据邮箱地址获取参赛者信息") // @ApiOperation(value = "根据邮箱查询参赛者", notes = "根据邮箱地址获取参赛者信息")
public Response<ContestantDTO> getContestantByEmail(@ApiParam(value = "参赛者邮箱地址", required = true) @RequestParam("email") String email) { // public Response<ContestantDTO> getContestantByEmail(@ApiParam(value = "参赛者邮箱地址", required = true) @RequestParam("email") String email) {
ContestantDTO dto = globalAwardService.getContestantByEmail(email); // ContestantDTO dto = globalAwardService.getContestantByEmail(email);
return Response.success(dto); // return Response.success(dto);
} // }
@GetMapping("/checkEmail") @GetMapping("/checkEmail")
public Response<String> checkEmail(@RequestParam("email") String email) { public Response<String> checkEmail(@RequestParam("email") String email) {

View File

@@ -18,11 +18,11 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@TableName("submissions") @TableName("contestants")
public class Contestant { public class Contestant {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.ASSIGN_UUID)
private Long id; private String id;
private String email; private String email;

View File

@@ -50,11 +50,11 @@ public class ContestantDTO {
@ApiModelProperty(value = "视频文件路径", required = false, example = "contestants/user@example.com/2024/01/video_1234567890.mp4") @ApiModelProperty(value = "视频文件路径", required = false, example = "contestants/user@example.com/2024/01/video_1234567890.mp4")
private String videoPath; private String videoPath;
/** // /**
* 是否确认覆盖已存在记录false 表示发现已有记录时仅返回 existingRecord不覆盖 // * 是否确认覆盖已存在记录false 表示发现已有记录时仅返回 existingRecord不覆盖
*/ // */
@ApiModelProperty(value = "是否确认覆盖已存在记录", required = false, example = "false") // @ApiModelProperty(value = "是否确认覆盖已存在记录", required = false, example = "false")
private Boolean confirm = false; // private Boolean confirm = false;
@NotBlank @NotBlank
private String secureToken; private String secureToken;

View File

@@ -36,4 +36,18 @@ public class UploadCompleteRequest {
@Positive(message = "文件大小必须大于0") @Positive(message = "文件大小必须大于0")
@ApiModelProperty(value = "文件总大小(字节)", required = true, example = "10485760") @ApiModelProperty(value = "文件总大小(字节)", required = true, example = "10485760")
private Long totalSize; private Long totalSize;
/**
* 用户邮箱
*/
@NotBlank(message = "用户邮箱不能为空")
@ApiModelProperty(value = "用户邮箱", required = true, example = "user@example.com")
private String email;
/**
* 安全令牌(邮箱验证令牌)
*/
@NotBlank(message = "安全令牌不能为空")
@ApiModelProperty(value = "安全令牌", required = true, example = "abc123def456")
private String secureToken;
} }

View File

@@ -41,6 +41,13 @@ public class UploadInitRequest {
/** /**
* 用户邮箱 * 用户邮箱
*/ */
@ApiModelProperty(value = "用户邮箱", required = false, example = "user@example.com") @ApiModelProperty(value = "用户邮箱", required = true, example = "user@example.com")
private String email; private String email;
/**
* 安全令牌(邮箱验证令牌)
*/
@NotBlank(message = "安全令牌不能为空")
@ApiModelProperty(value = "安全令牌", required = true, example = "abc123def456")
private String secureToken;
} }

View File

@@ -18,6 +18,8 @@ public interface GlobalAwardService {
void checkEmail(String email); void checkEmail(String email);
CheckOTPVO checkCode(String email, String otp); CheckOTPVO checkCode(String email, String otp);
void checkSecurityToken(String email, String securityToken);
} }

View File

@@ -37,7 +37,7 @@ public interface UploadService {
* @param totalSize 文件总大小 * @param totalSize 文件总大小
* @return 完成上传结果 * @return 完成上传结果
*/ */
UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize); UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize, String email, String secureToken);
/** /**
* 查询PDF上传状态 * 查询PDF上传状态
@@ -74,7 +74,7 @@ public interface UploadService {
* @param totalSize 文件总大小 * @param totalSize 文件总大小
* @return 完成上传结果 * @return 完成上传结果
*/ */
UploadCompleteResponse completeVideoUpload(String uploadId, String fileName, long totalSize); UploadCompleteResponse completeVideoUpload(String uploadId, String fileName, long totalSize, String email, String secureToken);
/** /**
* 查询视频上传状态 * 查询视频上传状态

View File

@@ -14,6 +14,7 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@@ -62,16 +63,65 @@ public class UploadServiceImpl implements UploadService {
@Value("${minio.bucketName:globalAward}") @Value("${minio.bucketName:globalAward}")
private String minioBucket; private String minioBucket;
@Resource
private com.ai.da.service.GlobalAwardService globalAwardService;
// 内存存储上传任务状态 // 内存存储上传任务状态
private final ConcurrentHashMap<String, UploadTask> uploadTasks = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, UploadTask> uploadTasks = new ConcurrentHashMap<>();
// JSON序列化工具 // JSON序列化工具
private final ObjectMapper objectMapper = new ObjectMapper(); private final ObjectMapper objectMapper = new ObjectMapper();
/**
* 应用启动时加载现有上传任务
*/
@PostConstruct
public void loadExistingTasks() {
try {
Path tempPath = Paths.get(tempDir);
if (!Files.exists(tempPath)) {
return;
}
Files.list(tempPath)
.filter(Files::isDirectory)
.forEach(uploadDir -> {
try {
String uploadId = uploadDir.getFileName().toString();
Path metadataPath = uploadDir.resolve("metadata.json");
if (Files.exists(metadataPath)) {
String json = Files.readString(metadataPath);
UploadTask task = objectMapper.readValue(json, UploadTask.class);
// 检查任务是否已过期
if (task.getExpiresAt().isAfter(LocalDateTime.now())) {
uploadTasks.put(uploadId, task);
log.info("加载现有上传任务: uploadId={}, status={}", uploadId, task.getStatus());
} else {
// 清理过期任务
cleanupTempFiles(uploadId);
log.info("清理过期上传任务: uploadId={}", uploadId);
}
}
} catch (Exception e) {
log.warn("加载上传任务失败: {}", uploadDir.getFileName(), e);
}
});
log.info("成功加载 {} 个现有上传任务", uploadTasks.size());
} catch (Exception e) {
log.error("加载现有上传任务时发生错误", e);
}
}
// ===== PDF上传实现 ===== // ===== PDF上传实现 =====
@Override @Override
public UploadTask initPdfUpload(UploadInitRequest request) { public UploadTask initPdfUpload(UploadInitRequest request) {
// 验证安全令牌
globalAwardService.checkSecurityToken(request.getEmail(), request.getSecureToken());
// 验证PDF文件 // 验证PDF文件
validatePdfFile(request); validatePdfFile(request);
@@ -115,7 +165,10 @@ public class UploadServiceImpl implements UploadService {
} }
@Override @Override
public UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize) { public UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize, String email, String secureToken) {
// 验证安全令牌
globalAwardService.checkSecurityToken(email, secureToken);
UploadTask task = validateAndGetTask(uploadId, "pdf"); UploadTask task = validateAndGetTask(uploadId, "pdf");
log.info("开始PDF文件合并: uploadId={}, fileName={}", uploadId, fileName); log.info("开始PDF文件合并: uploadId={}, fileName={}", uploadId, fileName);
@@ -175,6 +228,9 @@ public class UploadServiceImpl implements UploadService {
@Override @Override
public UploadTask initVideoUpload(UploadInitRequest request) { public UploadTask initVideoUpload(UploadInitRequest request) {
// 验证安全令牌
globalAwardService.checkSecurityToken(request.getEmail(), request.getSecureToken());
// 验证视频文件 // 验证视频文件
validateVideoFile(request); validateVideoFile(request);
@@ -218,7 +274,10 @@ public class UploadServiceImpl implements UploadService {
} }
@Override @Override
public UploadCompleteResponse completeVideoUpload(String uploadId, String fileName, long totalSize) { public UploadCompleteResponse completeVideoUpload(String uploadId, String fileName, long totalSize, String email, String secureToken) {
// 验证安全令牌
globalAwardService.checkSecurityToken(email, secureToken);
UploadTask task = validateAndGetTask(uploadId, "video"); UploadTask task = validateAndGetTask(uploadId, "video");
log.info("开始视频文件合并: uploadId={}, fileName={}", uploadId, fileName); log.info("开始视频文件合并: uploadId={}, fileName={}", uploadId, fileName);