GlobalAward接口token验证,id更换为uuid
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ public interface GlobalAwardService {
|
||||
void checkEmail(String email);
|
||||
|
||||
CheckOTPVO checkCode(String email, String otp);
|
||||
|
||||
void checkSecurityToken(String email, String securityToken);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 查询视频上传状态
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user