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

View File

@@ -18,11 +18,11 @@ import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("submissions")
@TableName("contestants")
public class Contestant {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
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")
private String videoPath;
/**
* 是否确认覆盖已存在记录false 表示发现已有记录时仅返回 existingRecord不覆盖
*/
@ApiModelProperty(value = "是否确认覆盖已存在记录", required = false, example = "false")
private Boolean confirm = false;
// /**
// * 是否确认覆盖已存在记录false 表示发现已有记录时仅返回 existingRecord不覆盖
// */
// @ApiModelProperty(value = "是否确认覆盖已存在记录", required = false, example = "false")
// private Boolean confirm = false;
@NotBlank
private String secureToken;

View File

@@ -36,4 +36,18 @@ public class UploadCompleteRequest {
@Positive(message = "文件大小必须大于0")
@ApiModelProperty(value = "文件总大小(字节)", required = true, example = "10485760")
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;
/**
* 安全令牌(邮箱验证令牌)
*/
@NotBlank(message = "安全令牌不能为空")
@ApiModelProperty(value = "安全令牌", required = true, example = "abc123def456")
private String secureToken;
}

View File

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

View File

@@ -37,7 +37,7 @@ public interface UploadService {
* @param totalSize 文件总大小
* @return 完成上传结果
*/
UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize);
UploadCompleteResponse completePdfUpload(String uploadId, String fileName, long totalSize, String email, String secureToken);
/**
* 查询PDF上传状态
@@ -74,7 +74,7 @@ public interface UploadService {
* @param totalSize 文件总大小
* @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.web.multipart.MultipartFile;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import java.io.FileInputStream;
import java.io.IOException;
@@ -62,16 +63,65 @@ public class UploadServiceImpl implements UploadService {
@Value("${minio.bucketName:globalAward}")
private String minioBucket;
@Resource
private com.ai.da.service.GlobalAwardService globalAwardService;
// 内存存储上传任务状态
private final ConcurrentHashMap<String, UploadTask> uploadTasks = new ConcurrentHashMap<>();
// JSON序列化工具
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上传实现 =====
@Override
public UploadTask initPdfUpload(UploadInitRequest request) {
// 验证安全令牌
globalAwardService.checkSecurityToken(request.getEmail(), request.getSecureToken());
// 验证PDF文件
validatePdfFile(request);
@@ -115,7 +165,10 @@ public class UploadServiceImpl implements UploadService {
}
@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");
log.info("开始PDF文件合并: uploadId={}, fileName={}", uploadId, fileName);
@@ -175,6 +228,9 @@ public class UploadServiceImpl implements UploadService {
@Override
public UploadTask initVideoUpload(UploadInitRequest request) {
// 验证安全令牌
globalAwardService.checkSecurityToken(request.getEmail(), request.getSecureToken());
// 验证视频文件
validateVideoFile(request);
@@ -218,7 +274,10 @@ public class UploadServiceImpl implements UploadService {
}
@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");
log.info("开始视频文件合并: uploadId={}, fileName={}", uploadId, fileName);