GlobalAward接口token验证,id更换为uuid
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询视频上传状态
|
* 查询视频上传状态
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user