From c1113c937ca96fd9893c537f87a99585f3ad9f6a Mon Sep 17 00:00:00 2001 From: En Date: Wed, 8 Apr 2026 22:58:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B5=9B=E4=BA=8B=E2=86=92=E6=B4=BB?= =?UTF-8?q?=E5=8A=A8=E6=9C=AF=E8=AF=AD=E7=BB=9F=E4=B8=80=EF=BC=8CAI?= =?UTF-8?q?=E5=88=9B=E4=BD=9C=E5=B5=8C=E5=A5=97=E8=B7=AF=E7=94=B1=E9=87=8D?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=89=8D=E7=AB=AF=E4=BE=9D=E8=B5=96=E5=8D=87?= =?UTF-8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端: - 全局将"赛事"统一为"活动"(Swagger注解、DTO、Entity、Controller、Service) - 评审模块DTO/Entity/Service字段调整与优化 - 新增V9迁移脚本,修改V2/V4/V6迁移脚本注释 - PublicRegisterActivityDto字段对齐 前端: - AI绘本创作路由重构为嵌套路由(11个子路由) - 新增依赖:@stomp/stompjs、ali-oss、crypto-js - 环境配置(.env)更新,vite配置调整 - API接口术语统一,PublicLayout与aicreate store优化 - 新增nginx部署文档 Co-Authored-By: Claude Opus 4.6 --- .../ContestAttachmentController.java | 4 +- .../contest/controller/ContestController.java | 24 +- .../controller/ContestNoticeController.java | 4 +- .../controller/ContestTeamController.java | 2 +- .../biz/contest/dto/CreateContestDto.java | 14 +- .../biz/contest/dto/CreateNoticeDto.java | 4 +- .../contest/dto/CreateRegistrationDto.java | 4 +- .../biz/contest/dto/CreateTeamDto.java | 4 +- .../biz/contest/dto/QueryContestDto.java | 10 +- .../biz/contest/dto/QueryRegistrationDto.java | 2 +- .../modules/biz/contest/dto/QueryWorkDto.java | 2 +- .../biz/contest/entity/BizContest.java | 14 +- .../contest/entity/BizContestAttachment.java | 4 +- .../biz/contest/entity/BizContestNotice.java | 6 +- .../entity/BizContestRegistration.java | 4 +- .../entity/BizContestRegistrationTeacher.java | 2 +- .../biz/contest/entity/BizContestTeam.java | 4 +- .../contest/entity/BizContestTeamMember.java | 2 +- .../biz/contest/entity/BizContestWork.java | 6 +- .../entity/BizContestWorkAttachment.java | 4 +- .../contest/service/IContestWorkService.java | 2 +- .../impl/ContestRegistrationServiceImpl.java | 14 +- .../service/impl/ContestServiceImpl.java | 46 +- .../service/impl/ContestTeamServiceImpl.java | 4 +- .../service/impl/ContestWorkServiceImpl.java | 10 +- .../controller/ContestJudgeController.java | 6 +- .../controller/ContestReviewController.java | 6 +- .../controller/PresetCommentController.java | 4 +- .../review/dto/ContestJudgesForContestVo.java | 8 +- .../review/dto/CreatePresetCommentDto.java | 4 +- .../biz/review/dto/SyncPresetCommentsDto.java | 8 +- .../biz/review/entity/BizContestJudge.java | 4 +- .../review/entity/BizContestReviewRule.java | 2 +- .../entity/BizContestWorkJudgeAssignment.java | 4 +- .../review/entity/BizContestWorkScore.java | 4 +- .../biz/review/entity/BizPresetComment.java | 2 +- .../review/service/IContestJudgeService.java | 2 +- .../service/impl/ContestJudgeServiceImpl.java | 10 +- .../impl/ContestResultServiceImpl.java | 34 +- .../impl/ContestReviewServiceImpl.java | 32 +- .../impl/PresetCommentServiceImpl.java | 14 +- .../pub/dto/PublicRegisterActivityDto.java | 2 +- .../V2__add_tenant_isolation_to_notice.sql | 2 +- .../migration/V4__rebuild_review_tables.sql | 12 +- .../V6__add_table_and_column_comments.sql | 18 +- ...9__rename_contest_to_activity_comments.sql | 24 + frontend/.env.development | 6 +- frontend/.env.production | 6 +- frontend/.env.test | 2 + frontend/docs/nginx-deployment.md | 79 +++ frontend/package-lock.json | 663 +++++++++++++++++- frontend/package.json | 4 + frontend/src/api/ai-3d.ts | 2 +- frontend/src/api/contests.ts | 4 +- frontend/src/api/students.ts | 2 +- frontend/src/api/teachers.ts | 2 +- frontend/src/layouts/PublicLayout.vue | 42 +- frontend/src/router/index.ts | 68 +- frontend/src/stores/aicreate.ts | 14 + frontend/src/views/public/create/Index.vue | 27 +- frontend/vite.config.ts | 15 +- lesingle-aicreate-client/src/api/index.js | 2 +- 62 files changed, 1071 insertions(+), 265 deletions(-) create mode 100644 backend-java/src/main/resources/db/migration/V9__rename_contest_to_activity_comments.sql create mode 100644 frontend/docs/nginx-deployment.md diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestAttachmentController.java b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestAttachmentController.java index 80e235a..edee255 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestAttachmentController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestAttachmentController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -@Tag(name = "赛事附件") +@Tag(name = "活动附件") @RestController @RequestMapping("/contests/attachments") @RequiredArgsConstructor @@ -30,7 +30,7 @@ public class ContestAttachmentController { @GetMapping("/contest/{contestId}") @RequirePermission("contest:read") - @Operation(summary = "查询赛事下的附件列表") + @Operation(summary = "查询活动下的附件列表") public Result> findByContest(@PathVariable Long contestId) { List list = attachmentService.list( new LambdaQueryWrapper() diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestController.java b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestController.java index b5effd2..bbbff4f 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Map; -@Tag(name = "赛事管理") +@Tag(name = "活动管理") @RestController @RequestMapping("/contests") @RequiredArgsConstructor @@ -28,14 +28,14 @@ public class ContestController { @PostMapping @RequirePermission("contest:create") - @Operation(summary = "创建赛事") + @Operation(summary = "创建活动") public Result create(@Valid @RequestBody CreateContestDto dto) { return Result.success(contestService.createContest(dto, SecurityUtil.getCurrentUserId())); } @GetMapping("/stats") @RequirePermission("contest:read") - @Operation(summary = "获取赛事统计") + @Operation(summary = "获取活动统计") public Result> getStats() { Long tenantId = SecurityUtil.getCurrentTenantId(); boolean isSuperTenant = tenantService.isSuperTenant(tenantId); @@ -44,14 +44,14 @@ public class ContestController { @GetMapping("/dashboard") @RequirePermission("contest:read") - @Operation(summary = "获取赛事看板") + @Operation(summary = "获取活动看板") public Result> getDashboard() { return Result.success(contestService.getDashboard(SecurityUtil.getCurrentTenantId())); } @GetMapping @RequirePermission("contest:read") - @Operation(summary = "查询赛事列表") + @Operation(summary = "查询活动列表") public Result>> findAll(QueryContestDto dto) { Long tenantId = SecurityUtil.getCurrentTenantId(); boolean isSuperTenant = tenantService.isSuperTenant(tenantId); @@ -60,7 +60,7 @@ public class ContestController { @GetMapping("/my-contests") @RequirePermission({"contest:read", "contest:activity:read"}) - @Operation(summary = "获取我的赛事") + @Operation(summary = "获取我的活动") public Result>> getMyContests(QueryContestDto dto) { Long userId = SecurityUtil.getCurrentUserId(); Long tenantId = SecurityUtil.getCurrentTenantId(); @@ -69,21 +69,21 @@ public class ContestController { @GetMapping("/{id}") @RequirePermission("contest:read") - @Operation(summary = "查询赛事详情") + @Operation(summary = "查询活动详情") public Result> findDetail(@PathVariable Long id) { return Result.success(contestService.findDetail(id)); } @PatchMapping("/{id}") @RequirePermission("contest:update") - @Operation(summary = "更新赛事") + @Operation(summary = "更新活动") public Result update(@PathVariable Long id, @RequestBody CreateContestDto dto) { return Result.success(contestService.updateContest(id, dto)); } @PatchMapping("/{id}/publish") @RequirePermission("contest:publish") - @Operation(summary = "发布/撤回赛事") + @Operation(summary = "发布/撤回活动") public Result publish(@PathVariable Long id, @RequestBody Map body) { contestService.publishContest(id, body.get("contestState")); return Result.success(); @@ -91,7 +91,7 @@ public class ContestController { @PatchMapping("/{id}/finish") @RequirePermission("contest:update") - @Operation(summary = "结束赛事") + @Operation(summary = "结束活动") public Result finish(@PathVariable Long id) { contestService.finishContest(id); return Result.success(); @@ -99,7 +99,7 @@ public class ContestController { @PatchMapping("/{id}/reopen") @RequirePermission("contest:update") - @Operation(summary = "重新开放赛事") + @Operation(summary = "重新开放活动") public Result reopen(@PathVariable Long id) { contestService.reopenContest(id); return Result.success(); @@ -107,7 +107,7 @@ public class ContestController { @DeleteMapping("/{id}") @RequirePermission("contest:delete") - @Operation(summary = "删除赛事") + @Operation(summary = "删除活动") public Result remove(@PathVariable Long id) { contestService.removeContest(id); return Result.success(); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestNoticeController.java b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestNoticeController.java index 941b660..f07600e 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestNoticeController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestNoticeController.java @@ -21,7 +21,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; -@Tag(name = "赛事公告") +@Tag(name = "活动公告") @RestController @RequestMapping("/contests/notices") @RequiredArgsConstructor @@ -78,7 +78,7 @@ public class ContestNoticeController { @GetMapping("/contest/{contestId}") @RequirePermission("notice:read") - @Operation(summary = "查询赛事下的公告列表") + @Operation(summary = "查询活动下的公告列表") public Result> findByContest(@PathVariable Long contestId) { Long tenantId = SecurityUtil.getCurrentTenantId(); List list = noticeService.list( diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestTeamController.java b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestTeamController.java index 226f291..34e5fb9 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestTeamController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestTeamController.java @@ -34,7 +34,7 @@ public class ContestTeamController { @GetMapping("/contest/{contestId}") @RequirePermission("team:read") - @Operation(summary = "查询赛事下的团队列表") + @Operation(summary = "查询活动下的团队列表") public Result>> findByContest(@PathVariable Long contestId) { return Result.success(teamService.findByContest(contestId, SecurityUtil.getCurrentTenantId())); } diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateContestDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateContestDto.java index 5e9a504..eb98f54 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateContestDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateContestDto.java @@ -7,15 +7,15 @@ import lombok.Data; import java.util.List; @Data -@Schema(description = "创建赛事DTO") +@Schema(description = "创建活动DTO") public class CreateContestDto { - @NotBlank(message = "赛事名称不能为空") - @Schema(description = "赛事名称") + @NotBlank(message = "活动名称不能为空") + @Schema(description = "活动名称") private String contestName; - @NotBlank(message = "赛事类型不能为空") - @Schema(description = "赛事类型") + @NotBlank(message = "活动类型不能为空") + @Schema(description = "活动类型") private String contestType; @Schema(description = "可见性") @@ -41,10 +41,10 @@ public class CreateContestDto { @Schema(description = "地址") private String address; - @Schema(description = "赛事内容") + @Schema(description = "活动内容") private String content; - @Schema(description = "赛事关联租户ID列表") + @Schema(description = "活动关联租户ID列表") private List contestTenants; @Schema(description = "封面图URL") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateNoticeDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateNoticeDto.java index e638232..429a780 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateNoticeDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateNoticeDto.java @@ -9,8 +9,8 @@ import lombok.Data; @Schema(description = "创建公告DTO") public class CreateNoticeDto { - @NotNull(message = "赛事ID不能为空") - @Schema(description = "赛事ID") + @NotNull(message = "活动ID不能为空") + @Schema(description = "活动ID") private Long contestId; @NotBlank(message = "公告标题不能为空") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateRegistrationDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateRegistrationDto.java index ba25d23..5ef1a8f 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateRegistrationDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateRegistrationDto.java @@ -9,8 +9,8 @@ import lombok.Data; @Schema(description = "创建报名DTO") public class CreateRegistrationDto { - @NotNull(message = "赛事ID不能为空") - @Schema(description = "赛事ID") + @NotNull(message = "活动ID不能为空") + @Schema(description = "活动ID") private Long contestId; @NotBlank(message = "报名类型不能为空") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateTeamDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateTeamDto.java index 492f3c9..9e07d81 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateTeamDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/CreateTeamDto.java @@ -11,8 +11,8 @@ import java.util.List; @Schema(description = "创建团队DTO") public class CreateTeamDto { - @NotNull(message = "赛事ID不能为空") - @Schema(description = "赛事ID") + @NotNull(message = "活动ID不能为空") + @Schema(description = "活动ID") private Long contestId; @NotBlank(message = "团队名称不能为空") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryContestDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryContestDto.java index 0115f15..7ba9084 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryContestDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryContestDto.java @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data -@Schema(description = "查询赛事DTO") +@Schema(description = "查询活动DTO") public class QueryContestDto { @Schema(description = "页码", defaultValue = "1") @@ -13,22 +13,22 @@ public class QueryContestDto { @Schema(description = "每页条数", defaultValue = "10") private Long pageSize = 10L; - @Schema(description = "赛事名称") + @Schema(description = "活动名称") private String contestName; - @Schema(description = "赛事状态") + @Schema(description = "活动状态") private String contestState; @Schema(description = "状态") private String status; - @Schema(description = "赛事类型") + @Schema(description = "活动类型") private String contestType; @Schema(description = "可见性") private String visibility; - @Schema(description = "赛事阶段") + @Schema(description = "活动阶段") private String stage; @Schema(description = "创建者租户ID") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryRegistrationDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryRegistrationDto.java index 982d2a3..32e4b41 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryRegistrationDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryRegistrationDto.java @@ -13,7 +13,7 @@ public class QueryRegistrationDto { @Schema(description = "每页条数", defaultValue = "10") private Long pageSize = 10L; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") private Long contestId; @Schema(description = "报名状态") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryWorkDto.java b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryWorkDto.java index 7b75ecb..38b65b1 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryWorkDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/dto/QueryWorkDto.java @@ -13,7 +13,7 @@ public class QueryWorkDto { @Schema(description = "每页条数", defaultValue = "10") private Long pageSize = 10L; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") private Long contestId; @Schema(description = "报名ID") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContest.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContest.java index 2e34236..d5174b7 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContest.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContest.java @@ -13,27 +13,27 @@ import java.time.LocalDateTime; import java.util.List; /** - * 赛事实体(35+ 字段,7 个 JSON 列) + * 活动实体(35+ 字段,7 个 JSON 列) */ @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "t_biz_contest", autoResultMap = true) -@Schema(description = "赛事实体") +@Schema(description = "活动实体") public class BizContest extends BaseEntity { - @Schema(description = "赛事名称") + @Schema(description = "活动名称") @TableField("contest_name") private String contestName; - @Schema(description = "赛事类型:individual/team") + @Schema(description = "活动类型:individual/team") @TableField("contest_type") private String contestType; - @Schema(description = "赛事发布状态", allowableValues = {"published", "unpublished"}) + @Schema(description = "活动发布状态", allowableValues = {"published", "unpublished"}) @TableField("contest_state") private String contestState; - @Schema(description = "赛事进度状态:ongoing/finished") + @Schema(description = "活动进度状态:ongoing/finished") private String status; @Schema(description = "开始时间") @@ -47,7 +47,7 @@ public class BizContest extends BaseEntity { @Schema(description = "线下地址") private String address; - @Schema(description = "赛事详情(富文本)") + @Schema(description = "活动详情(富文本)") private String content; @Schema(description = "可见范围", allowableValues = {"public", "designated", "internal", "private"}) diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestAttachment.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestAttachment.java index c24b154..01c8f52 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestAttachment.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestAttachment.java @@ -10,10 +10,10 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_attachment") -@Schema(description = "赛事附件实体") +@Schema(description = "活动附件实体") public class BizContestAttachment extends BaseEntity { - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestNotice.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestNotice.java index 83ae817..19da44f 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestNotice.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestNotice.java @@ -10,15 +10,15 @@ import lombok.EqualsAndHashCode; import java.time.LocalDateTime; /** - * 赛事公告实体 + * 活动公告实体 */ @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_notice") -@Schema(description = "赛事公告实体") +@Schema(description = "活动公告实体") public class BizContestNotice extends BaseEntity { - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistration.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistration.java index c81a1e7..9041235 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistration.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistration.java @@ -12,10 +12,10 @@ import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_registration") -@Schema(description = "赛事报名实体") +@Schema(description = "活动报名实体") public class BizContestRegistration extends BaseEntity { - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistrationTeacher.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistrationTeacher.java index 1f26be6..0424eee 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistrationTeacher.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestRegistrationTeacher.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; @Data @TableName("t_biz_contest_registration_teacher") -@Schema(description = "赛事报名老师关联实体") +@Schema(description = "活动报名老师关联实体") public class BizContestRegistrationTeacher implements Serializable { @Schema(description = "主键ID") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeam.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeam.java index 1c53b17..e865dd9 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeam.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeam.java @@ -10,14 +10,14 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_team") -@Schema(description = "赛事团队实体") +@Schema(description = "活动团队实体") public class BizContestTeam extends BaseEntity { @Schema(description = "租户ID") @TableField("tenant_id") private Long tenantId; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeamMember.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeamMember.java index 431fed7..c904f26 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeamMember.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestTeamMember.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; @Data @TableName("t_biz_contest_team_member") -@Schema(description = "赛事团队成员实体") +@Schema(description = "活动团队成员实体") public class BizContestTeamMember implements Serializable { @Schema(description = "主键ID") diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWork.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWork.java index 817d35d..dd2c5b4 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWork.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWork.java @@ -15,14 +15,14 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "t_biz_contest_work", autoResultMap = true) -@Schema(description = "赛事作品实体") +@Schema(description = "活动作品实体") public class BizContestWork extends BaseEntity { @Schema(description = "租户ID") @TableField("tenant_id") private Long tenantId; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; @@ -86,7 +86,7 @@ public class BizContestWork extends BaseEntity { @TableField("user_work_id") private Long userWorkId; - // ====== 赛果字段 ====== + // ====== 成果字段 ====== @Schema(description = "最终得分") @TableField("final_score") private BigDecimal finalScore; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWorkAttachment.java b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWorkAttachment.java index ad48fb6..072d3c6 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWorkAttachment.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/entity/BizContestWorkAttachment.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; @Data @TableName("t_biz_contest_work_attachment") -@Schema(description = "赛事作品附件实体") +@Schema(description = "活动作品附件实体") public class BizContestWorkAttachment implements Serializable { @Schema(description = "主键ID") @@ -20,7 +20,7 @@ public class BizContestWorkAttachment implements Serializable { @TableField("tenant_id") private Long tenantId; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java index 57700f7..6b3b443 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java @@ -12,7 +12,7 @@ import java.util.Map; public interface IContestWorkService extends IService { /** - * 为指定赛事生成下一个作品编号(与 {@link #submitWork} 所用规则一致:W{contestId}-{序号})。 + * 为指定活动生成下一个作品编号(与 {@link #submitWork} 所用规则一致:W{contestId}-{序号})。 */ String nextContestWorkNo(Long contestId); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestRegistrationServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestRegistrationServiceImpl.java index 6f2957f..4760bc5 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestRegistrationServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestRegistrationServiceImpl.java @@ -42,15 +42,15 @@ public class ContestRegistrationServiceImpl extends ServiceImpl createRegistration(CreateRegistrationDto dto, Long tenantId, Long creatorId) { - log.info("开始创建报名,赛事ID:{},用户ID:{}", dto.getContestId(), dto.getUserId()); + log.info("开始创建报名,活动ID:{},用户ID:{}", dto.getContestId(), dto.getUserId()); - // 验证赛事存在且已发布 + // 验证活动存在且已发布 BizContest contest = contestMapper.selectById(dto.getContestId()); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } if (!PublishStatus.PUBLISHED.getValue().equals(contest.getContestState())) { - throw BusinessException.of(ErrorCode.BAD_REQUEST, "赛事未发布,无法报名"); + throw BusinessException.of(ErrorCode.BAD_REQUEST, "活动未发布,无法报名"); } // 获取用户信息 @@ -85,7 +85,7 @@ public class ContestRegistrationServiceImpl extends ServiceImpl> findAll(QueryRegistrationDto dto, Long tenantId, boolean isSuperTenant) { - log.info("查询报名列表,赛事ID:{},页码:{}", dto.getContestId(), dto.getPage()); + log.info("查询报名列表,活动ID:{},页码:{}", dto.getContestId(), dto.getPage()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -128,7 +128,7 @@ public class ContestRegistrationServiceImpl extends ServiceImpl getStats(Long contestId, Long tenantId, boolean isSuperAdmin) { - log.info("获取报名统计,赛事ID:{},租户ID:{},超管:{}", contestId, tenantId, isSuperAdmin); + log.info("获取报名统计,活动ID:{},租户ID:{},超管:{}", contestId, tenantId, isSuperAdmin); // 非超管需要按租户过滤 boolean needTenantFilter = !isSuperAdmin && tenantId != null; @@ -217,7 +217,7 @@ public class ContestRegistrationServiceImpl extends ServiceImpl getMyRegistration(Long contestId, Long userId, Long tenantId) { - log.info("查询我的报名,赛事ID:{},用户ID:{}", contestId, userId); + log.info("查询我的报名,活动ID:{},用户ID:{}", contestId, userId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestRegistration::getContestId, contestId); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java index 7da6649..ac8b169 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java @@ -73,7 +73,7 @@ public class ContestServiceImpl extends ServiceImpl i @Override public BizContest createContest(CreateContestDto dto, Long creatorId) { - log.info("开始创建赛事,名称:{}", dto.getContestName()); + log.info("开始创建活动,名称:{}", dto.getContestName()); try { BizContest entity = new BizContest(); @@ -97,17 +97,17 @@ public class ContestServiceImpl extends ServiceImpl i } save(entity); - log.info("赛事创建成功,ID:{}, 名称:{}", entity.getId(), entity.getContestName()); + log.info("活动创建成功,ID:{}, 名称:{}", entity.getId(), entity.getContestName()); return entity; } catch (Exception e) { - log.error("创建赛事失败,名称:{}", dto.getContestName(), e); - throw new BusinessException(ErrorCode.INTERNAL_ERROR, "创建赛事失败:" + e.getMessage()); + log.error("创建活动失败,名称:{}", dto.getContestName(), e); + throw new BusinessException(ErrorCode.INTERNAL_ERROR, "创建活动失败:" + e.getMessage()); } } @Override public PageResult> findAll(QueryContestDto dto, Long tenantId, boolean isSuperTenant) { - log.info("查询赛事列表,页码:{},每页:{}", dto.getPage(), dto.getPageSize()); + log.info("查询活动列表,页码:{},每页:{}", dto.getPage(), dto.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContest::getValidState, 1); @@ -220,7 +220,7 @@ public class ContestServiceImpl extends ServiceImpl i @Override public PageResult> getMyContests(QueryContestDto dto, Long userId, Long tenantId) { - log.info("查询我的赛事,用户ID:{},租户ID:{}", userId, tenantId); + log.info("查询我的活动,用户ID:{},租户ID:{}", userId, tenantId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContest::getValidState, 1); @@ -249,11 +249,11 @@ public class ContestServiceImpl extends ServiceImpl i @Override public Map findDetail(Long id) { - log.info("查询赛事详情,ID:{}", id); + log.info("查询活动详情,ID:{}", id); BizContest contest = getById(id); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } Map result = entityToMap(contest); @@ -287,72 +287,72 @@ public class ContestServiceImpl extends ServiceImpl i @Override public BizContest updateContest(Long id, CreateContestDto dto) { - log.info("更新赛事,ID:{}", id); + log.info("更新活动,ID:{}", id); BizContest entity = getById(id); if (entity == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } mapDtoToEntity(dto, entity); updateById(entity); - log.info("赛事更新成功,ID:{}", id); + log.info("活动更新成功,ID:{}", id); return entity; } @Override public void publishContest(Long id, String contestState) { - log.info("发布/撤回赛事,ID:{},状态:{}", id, contestState); + log.info("发布/撤回活动,ID:{},状态:{}", id, contestState); BizContest entity = getById(id); if (entity == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } entity.setContestState(contestState); updateById(entity); - log.info("赛事状态更新成功,ID:{},新状态:{}", id, contestState); + log.info("活动状态更新成功,ID:{},新状态:{}", id, contestState); } @Override public void finishContest(Long id) { - log.info("结束赛事,ID:{}", id); + log.info("结束活动,ID:{}", id); BizContest entity = getById(id); if (entity == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } entity.setStatus("finished"); updateById(entity); - log.info("赛事已结束,ID:{}", id); + log.info("活动已结束,ID:{}", id); } @Override public void reopenContest(Long id) { - log.info("重新开启赛事,ID:{}", id); + log.info("重新开启活动,ID:{}", id); BizContest entity = getById(id); if (entity == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } entity.setStatus("ongoing"); updateById(entity); - log.info("赛事已重新开启,ID:{}", id); + log.info("活动已重新开启,ID:{}", id); } @Override public void removeContest(Long id) { - log.info("删除赛事,ID:{}", id); + log.info("删除活动,ID:{}", id); removeById(id); - log.info("赛事删除成功,ID:{}", id); + log.info("活动删除成功,ID:{}", id); } @Override public Map getStats(Long tenantId, boolean isSuperTenant) { - log.info("获取赛事统计,租户ID:{}", tenantId); + log.info("获取活动统计,租户ID:{}", tenantId); LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper<>(); baseWrapper.eq(BizContest::getValidState, 1); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestTeamServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestTeamServiceImpl.java index e463763..3bbf00c 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestTeamServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestTeamServiceImpl.java @@ -32,7 +32,7 @@ public class ContestTeamServiceImpl extends ServiceImpl createTeam(CreateTeamDto dto, Long tenantId, Long creatorId) { - log.info("开始创建团队,赛事ID:{},团队名称:{}", dto.getContestId(), dto.getTeamName()); + log.info("开始创建团队,活动ID:{},团队名称:{}", dto.getContestId(), dto.getTeamName()); BizContestTeam team = new BizContestTeam(); team.setTenantId(tenantId); @@ -70,7 +70,7 @@ public class ContestTeamServiceImpl extends ServiceImpl> findByContest(Long contestId, Long tenantId) { - log.info("查询赛事团队列表,赛事ID:{}", contestId); + log.info("查询活动团队列表,活动ID:{}", contestId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestTeam::getContestId, contestId); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java index 6c39570..6fcc7a3 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java @@ -76,7 +76,7 @@ public class ContestWorkServiceImpl extends ServiceImpl> findAll(QueryWorkDto dto, Long tenantId, boolean isSuperTenant) { - log.info("查询作品列表,赛事ID:{},页码:{}", dto.getContestId(), dto.getPage()); + log.info("查询作品列表,活动ID:{},页码:{}", dto.getContestId(), dto.getPage()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -310,7 +310,7 @@ public class ContestWorkServiceImpl extends ServiceImpl page = new Page<>(dto.getPage(), dto.getPageSize()); Page result = contestWorkMapper.selectPage(page, wrapper); - // 批量查询报名/赛事信息 + // 批量查询报名/活动信息 Set registrationIds = result.getRecords().stream() .map(BizContestWork::getRegistrationId) .filter(Objects::nonNull) @@ -499,7 +499,7 @@ public class ContestWorkServiceImpl extends ServiceImpl getStats(Long contestId, Long tenantId, boolean isSuperTenant) { - log.info("获取作品统计,赛事ID:{}", contestId); + log.info("获取作品统计,活动ID:{}", contestId); // 租户过滤 boolean needTenantFilter = !isSuperTenant && tenantId != null; @@ -611,7 +611,7 @@ public class ContestWorkServiceImpl extends ServiceImpl> getGuidedWorks(Long contestId, String workNo, String playerName, String accountNo, Long page, Long pageSize, Long userId) { - log.info("查询指导作品,赛事ID:{},教师用户ID:{}", contestId, userId); + log.info("查询指导作品,活动ID:{},教师用户ID:{}", contestId, userId); // 简化实现:查询当前教师指导的报名ID列表,再查对应作品 // 完整实现需要关联 t_biz_contest_registration_teacher 表 diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestJudgeController.java b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestJudgeController.java index bdd3e57..c2abf68 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestJudgeController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestJudgeController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.Map; -@Tag(name = "赛事评委") +@Tag(name = "活动评委") @RestController @RequestMapping("/contests/judges") @RequiredArgsConstructor @@ -23,7 +23,7 @@ public class ContestJudgeController { @PostMapping @RequirePermission("contest:update") - @Operation(summary = "添加赛事评委") + @Operation(summary = "添加活动评委") public Result createJudge(@RequestBody Map body) { Long contestId = Long.valueOf(body.get("contestId").toString()); Long judgeId = Long.valueOf(body.get("judgeId").toString()); @@ -35,7 +35,7 @@ public class ContestJudgeController { @GetMapping("/contest/{contestId}") @RequirePermission("contest:read") - @Operation(summary = "查询赛事评委列表", + @Operation(summary = "查询活动评委列表", description = "返回 assigned(显式关联)与 implicitPool(平台隐式池)。添加评委抽屉仅用 assigned 回显;作品分配可选池为 assigned ∪ implicitPool(前端合并)。") public Result findByContest(@PathVariable Long contestId) { return Result.success(contestJudgeService.findByContest(contestId)); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java index 9bd9178..9ae6427 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java @@ -82,7 +82,7 @@ public class ContestReviewController { @GetMapping("/judge/contests") @RequirePermission("review:score") - @Operation(summary = "获取评委参与的赛事列表") + @Operation(summary = "获取评委参与的活动列表") public Result>> getJudgeContests() { Long judgeId = SecurityUtil.getCurrentUserId(); return Result.success(contestReviewService.getJudgeContests(judgeId)); @@ -90,7 +90,7 @@ public class ContestReviewController { @GetMapping("/judge/contests/{contestId}/works") @RequirePermission("review:score") - @Operation(summary = "获取评委赛事作品列表") + @Operation(summary = "获取评委活动作品列表") public Result>> getJudgeContestWorks( @PathVariable Long contestId, @RequestParam(defaultValue = "1") Long page, @@ -132,7 +132,7 @@ public class ContestReviewController { @GetMapping("/judge/contests/{contestId}/detail") @RequirePermission("review:read") - @Operation(summary = "获取评委视角的赛事详情(含评审规则)") + @Operation(summary = "获取评委视角的活动详情(含评审规则)") public Result> getJudgeContestDetail(@PathVariable Long contestId) { Long judgeId = SecurityUtil.getCurrentUserId(); return Result.success(contestReviewService.getJudgeContestDetail(judgeId, contestId)); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/controller/PresetCommentController.java b/backend-java/src/main/java/com/competition/modules/biz/review/controller/PresetCommentController.java index 00d1e8e..4e407a8 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/controller/PresetCommentController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/controller/PresetCommentController.java @@ -38,7 +38,7 @@ public class PresetCommentController { } @GetMapping("/judge/contests") - @Operation(summary = "获取评委参与的赛事列表") + @Operation(summary = "获取评委参与的活动列表") public Result>> getJudgeContests() { Long judgeId = SecurityUtil.getCurrentUserId(); return Result.success(presetCommentService.getJudgeContests(judgeId)); @@ -76,7 +76,7 @@ public class PresetCommentController { } @PostMapping("/sync") - @Operation(summary = "同步评语到其他赛事") + @Operation(summary = "同步评语到其他活动") public Result> syncComments(@Valid @RequestBody SyncPresetCommentsDto dto) { Long judgeId = SecurityUtil.getCurrentUserId(); return Result.success(presetCommentService.syncComments(dto.getSourceContestId(), dto.getTargetContestIds(), judgeId)); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/dto/ContestJudgesForContestVo.java b/backend-java/src/main/java/com/competition/modules/biz/review/dto/ContestJudgesForContestVo.java index 5970b7d..b3805a8 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/dto/ContestJudgesForContestVo.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/dto/ContestJudgesForContestVo.java @@ -7,15 +7,15 @@ import java.util.List; import java.util.Map; /** - * 某赛事下的评委数据:显式关联与平台隐式池分离,避免扁平列表语义混淆。 + * 某活动下的评委数据:显式关联与平台隐式池分离,避免扁平列表语义混淆。 */ @Data -@Schema(description = "赛事评委查询结果") +@Schema(description = "活动评委查询结果") public class ContestJudgesForContestVo { - @Schema(description = "机构为该赛事显式添加的评委(t_biz_contest_judge),每条必有 id、judgeId;添加评委抽屉回显与提交差集仅基于此列表") + @Schema(description = "机构为该活动显式添加的评委(t_biz_contest_judge),每条必有 id、judgeId;添加评委抽屉回显与提交差集仅基于此列表") private List> assigned; - @Schema(description = "平台评委租户下对该赛事默认可用、未写入关联表的用户(id 为 null,isPlatform 为 true);可与 assigned 合并作为作品分配可选池") + @Schema(description = "平台评委租户下对该活动默认可用、未写入关联表的用户(id 为 null,isPlatform 为 true);可与 assigned 合并作为作品分配可选池") private List> implicitPool; } diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/dto/CreatePresetCommentDto.java b/backend-java/src/main/java/com/competition/modules/biz/review/dto/CreatePresetCommentDto.java index a81b323..12c5f96 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/dto/CreatePresetCommentDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/dto/CreatePresetCommentDto.java @@ -11,8 +11,8 @@ import java.math.BigDecimal; @Schema(description = "创建预设评语DTO") public class CreatePresetCommentDto { - @NotNull(message = "赛事ID不能为空") - @Schema(description = "赛事ID") + @NotNull(message = "活动ID不能为空") + @Schema(description = "活动ID") private Long contestId; @NotBlank(message = "评语内容不能为空") diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/dto/SyncPresetCommentsDto.java b/backend-java/src/main/java/com/competition/modules/biz/review/dto/SyncPresetCommentsDto.java index f4973db..4f77de4 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/dto/SyncPresetCommentsDto.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/dto/SyncPresetCommentsDto.java @@ -11,11 +11,11 @@ import java.util.List; @Schema(description = "同步预设评语DTO") public class SyncPresetCommentsDto { - @NotNull(message = "源赛事ID不能为空") - @Schema(description = "源赛事ID") + @NotNull(message = "源活动ID不能为空") + @Schema(description = "源活动ID") private Long sourceContestId; - @NotEmpty(message = "目标赛事列表不能为空") - @Schema(description = "目标赛事ID列表") + @NotEmpty(message = "目标活动列表不能为空") + @Schema(description = "目标活动ID列表") private List targetContestIds; } diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestJudge.java b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestJudge.java index c7d1218..a7ab6d0 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestJudge.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestJudge.java @@ -12,10 +12,10 @@ import java.math.BigDecimal; @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_judge") -@Schema(description = "赛事评委实体") +@Schema(description = "活动评委实体") public class BizContestJudge extends BaseEntity { - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestReviewRule.java b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestReviewRule.java index ce60a57..cb7e2c8 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestReviewRule.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestReviewRule.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "t_biz_contest_review_rule", autoResultMap = true) -@Schema(description = "赛事评审规则实体") +@Schema(description = "活动评审规则实体") public class BizContestReviewRule extends BaseEntity { @Schema(description = "租户ID") diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkJudgeAssignment.java b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkJudgeAssignment.java index 292edea..1ec161a 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkJudgeAssignment.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkJudgeAssignment.java @@ -12,14 +12,14 @@ import java.time.LocalDateTime; @Data @TableName("t_biz_contest_work_judge_assignment") -@Schema(description = "赛事作品评委分配实体") +@Schema(description = "活动作品评委分配实体") public class BizContestWorkJudgeAssignment implements Serializable { @Schema(description = "主键ID") @TableId(type = IdType.AUTO) private Long id; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkScore.java b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkScore.java index a74784e..89ba5da 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkScore.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizContestWorkScore.java @@ -14,14 +14,14 @@ import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @TableName(value = "t_biz_contest_work_score", autoResultMap = true) -@Schema(description = "赛事作品评分实体") +@Schema(description = "活动作品评分实体") public class BizContestWorkScore extends BaseEntity { @Schema(description = "租户ID") @TableField("tenant_id") private Long tenantId; - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizPresetComment.java b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizPresetComment.java index ced197f..15b7bb7 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizPresetComment.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/entity/BizPresetComment.java @@ -15,7 +15,7 @@ import java.math.BigDecimal; @Schema(description = "预设评语实体") public class BizPresetComment extends BaseEntity { - @Schema(description = "赛事ID") + @Schema(description = "活动ID") @TableField("contest_id") private Long contestId; diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestJudgeService.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestJudgeService.java index 95c0541..8e62928 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestJudgeService.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestJudgeService.java @@ -12,7 +12,7 @@ public interface IContestJudgeService extends IService { BizContestJudge createJudge(Long contestId, Long judgeId, String specialty, BigDecimal weight, String description); /** - * 查询某赛事评委:{@link ContestJudgesForContestVo#getAssigned()} 为显式关联; + * 查询某活动评委:{@link ContestJudgesForContestVo#getAssigned()} 为显式关联; * {@link ContestJudgesForContestVo#getImplicitPool()} 为平台默认可用未落库项。 */ ContestJudgesForContestVo findByContest(Long contestId); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestJudgeServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestJudgeServiceImpl.java index a714bef..4bf4b17 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestJudgeServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestJudgeServiceImpl.java @@ -36,7 +36,7 @@ public class ContestJudgeServiceImpl extends ServiceImpl dupWrapper = new LambdaQueryWrapper<>(); @@ -44,7 +44,7 @@ public class ContestJudgeServiceImpl extends ServiceImpl 0) { - throw BusinessException.of(ErrorCode.BAD_REQUEST, "该评委已添加到此赛事"); + throw BusinessException.of(ErrorCode.BAD_REQUEST, "该评委已添加到此活动"); } BizContestJudge entity = new BizContestJudge(); @@ -61,7 +61,7 @@ public class ContestJudgeServiceImpl extends ServiceImpl assignedJudgeIds = judges.stream().map(BizContestJudge::getJudgeId).collect(Collectors.toSet()); - // 2. 查询平台评委(自动对所有赛事可用) + // 2. 查询平台评委(自动对所有活动可用) List platformJudges = new ArrayList<>(); if (judgeTenantId != null) { LambdaQueryWrapper platformWrapper = new LambdaQueryWrapper<>(); @@ -105,7 +105,7 @@ public class ContestJudgeServiceImpl extends ServiceImpl assignedCountMap = new HashMap<>(); for (Long judgeId : allUserIds) { LambdaQueryWrapper assignWrapper = new LambdaQueryWrapper<>(); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestResultServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestResultServiceImpl.java index 8f4188c..4a459e5 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestResultServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestResultServiceImpl.java @@ -48,11 +48,11 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public Map calculateAllFinalScores(Long contestId) { - log.info("批量计算终分,赛事ID:{}", contestId); + log.info("批量计算终分,活动ID:{}", contestId); BizContest contest = contestMapper.selectById(contestId); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } // 获取计算规则 @@ -107,7 +107,7 @@ public class ContestResultServiceImpl implements IContestResultService { } } - log.info("批量计算终分完成,赛事ID:{},计算数量:{}", contestId, calculatedCount); + log.info("批量计算终分完成,活动ID:{},计算数量:{}", contestId, calculatedCount); Map result = new LinkedHashMap<>(); result.put("calculatedCount", calculatedCount); @@ -117,7 +117,7 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public Map calculateRankings(Long contestId) { - log.info("计算排名,赛事ID:{}", contestId); + log.info("计算排名,活动ID:{}", contestId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestWork::getContestId, contestId); @@ -145,7 +145,7 @@ public class ContestResultServiceImpl implements IContestResultService { workMapper.updateById(work); } - log.info("排名计算完成,赛事ID:{},排名数量:{}", contestId, works.size()); + log.info("排名计算完成,活动ID:{},排名数量:{}", contestId, works.size()); Map result = new LinkedHashMap<>(); result.put("rankedCount", works.size()); @@ -171,7 +171,7 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public Map batchSetAwards(Long contestId, BatchSetAwardsDto dto) { - log.info("批量设置奖项,赛事ID:{},数量:{}", contestId, dto.getAwards().size()); + log.info("批量设置奖项,活动ID:{},数量:{}", contestId, dto.getAwards().size()); int updated = 0; for (BatchSetAwardsDto.AwardItem item : dto.getAwards()) { @@ -193,7 +193,7 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public Map autoSetAwards(Long contestId, AutoSetAwardsDto dto) { - log.info("自动设置奖项,赛事ID:{}", contestId); + log.info("自动设置奖项,活动ID:{}", contestId); // 1. 获取已排名作品,按排名排序 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -252,11 +252,11 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public void publishResults(Long contestId) { - log.info("发布赛果,赛事ID:{}", contestId); + log.info("发布成果,活动ID:{}", contestId); BizContest contest = contestMapper.selectById(contestId); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } // 验证有排名作品 @@ -276,32 +276,32 @@ public class ContestResultServiceImpl implements IContestResultService { contest.setStatus("finished"); contestMapper.updateById(contest); - log.info("赛果发布成功,赛事ID:{}", contestId); + log.info("成果发布成功,活动ID:{}", contestId); } @Override public void unpublishResults(Long contestId) { - log.info("撤回赛果,赛事ID:{}", contestId); + log.info("撤回成果,活动ID:{}", contestId); BizContest contest = contestMapper.selectById(contestId); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } if (!PublishStatus.PUBLISHED.getValue().equals(contest.getResultState())) { - throw BusinessException.of(ErrorCode.BAD_REQUEST, "赛果未发布,无法撤回"); + throw BusinessException.of(ErrorCode.BAD_REQUEST, "成果未发布,无法撤回"); } contest.setResultState(PublishStatus.UNPUBLISHED.getValue()); contest.setResultPublishTime(null); contestMapper.updateById(contest); - log.info("赛果撤回成功,赛事ID:{}", contestId); + log.info("成果撤回成功,活动ID:{}", contestId); } @Override public PageResult> getResults(Long contestId, Long page, Long pageSize, String workNo, String accountNo) { - log.info("查询赛果列表,赛事ID:{},页码:{}", contestId, page); + log.info("查询成果列表,活动ID:{},页码:{}", contestId, page); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestWork::getContestId, contestId); @@ -446,7 +446,7 @@ public class ContestResultServiceImpl implements IContestResultService { @Override public Map getResultsSummary(Long contestId) { - log.info("查询赛果概览,赛事ID:{}", contestId); + log.info("查询成果概览,活动ID:{}", contestId); LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper<>(); baseWrapper.eq(BizContestWork::getContestId, contestId); @@ -507,7 +507,7 @@ public class ContestResultServiceImpl implements IContestResultService { BizContest contest = contestMapper.selectById(contestId); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } Map contestMap = new LinkedHashMap<>(); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java index fbeeff3..ae3245e 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java @@ -62,7 +62,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { List desiredOrder = new ArrayList<>(new LinkedHashSet<>(judgeIds)); Set desired = new HashSet<>(desiredOrder); - log.info("分配作品(同步),赛事ID:{},作品ID:{},期望评委数:{}", contestId, workId, desired.size()); + log.info("分配作品(同步),活动ID:{},作品ID:{},期望评委数:{}", contestId, workId, desired.size()); // 1. 取消已分配但不在本次列表中的评委(仅删除未评分的分配行) LambdaQueryWrapper existWrapper = new LambdaQueryWrapper<>(); @@ -124,7 +124,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public Map batchAssignWorks(Long contestId, List workIds, List judgeIds, Long creatorId) { - log.info("批量分配作品,赛事ID:{},作品数:{},评委数:{}", contestId, workIds.size(), judgeIds.size()); + log.info("批量分配作品,活动ID:{},作品数:{},评委数:{}", contestId, workIds.size(), judgeIds.size()); int totalCreated = 0; int totalSkipped = 0; @@ -144,7 +144,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public Map autoAssignWorks(Long contestId, Long creatorId) { - log.info("自动分配作品,赛事ID:{}", contestId); + log.info("自动分配作品,活动ID:{}", contestId); // 1. 获取所有未分配的作品 LambdaQueryWrapper workWrapper = new LambdaQueryWrapper<>(); @@ -159,14 +159,14 @@ public class ContestReviewServiceImpl implements IContestReviewService { throw BusinessException.of(ErrorCode.BAD_REQUEST, "没有需要分配的作品"); } - // 2. 获取赛事所有评委 + // 2. 获取活动所有评委 LambdaQueryWrapper judgeWrapper = new LambdaQueryWrapper<>(); judgeWrapper.eq(BizContestJudge::getContestId, contestId); judgeWrapper.eq(BizContestJudge::getValidState, 1); List judges = judgeMapper.selectList(judgeWrapper); if (judges.isEmpty()) { - throw BusinessException.of(ErrorCode.BAD_REQUEST, "赛事尚未配置评委"); + throw BusinessException.of(ErrorCode.BAD_REQUEST, "活动尚未配置评委"); } // 3. 轮询分配:每个作品分配给3个评委 @@ -303,7 +303,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public List> getAssignedWorks(Long judgeId, Long contestId) { - log.info("查询评委已分配作品,评委ID:{},赛事ID:{}", judgeId, contestId); + log.info("查询评委已分配作品,评委ID:{},活动ID:{}", judgeId, contestId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestWorkJudgeAssignment::getJudgeId, judgeId); @@ -343,7 +343,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public List> getJudgeContests(Long judgeId) { - log.info("查询评委关联赛事,评委ID:{}", judgeId); + log.info("查询评委关联活动,评委ID:{}", judgeId); Set contestIds = new LinkedHashSet<>(); @@ -399,7 +399,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public PageResult> getJudgeContestWorks(Long judgeId, Long contestId, Long page, Long pageSize, String workNo, String accountNo, String reviewStatus) { - log.info("查询评委赛事作品,评委ID:{},赛事ID:{},页码:{}", judgeId, contestId, page); + log.info("查询评委活动作品,评委ID:{},活动ID:{},页码:{}", judgeId, contestId, page); // 分页查询分配记录 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -511,7 +511,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public Map getReviewProgress(Long contestId) { - log.info("查询评审进度,赛事ID:{}", contestId); + log.info("查询评审进度,活动ID:{}", contestId); // 总作品数 LambdaQueryWrapper workWrapper = new LambdaQueryWrapper<>(); @@ -580,7 +580,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { @Override public Map getWorkStatusStats(Long contestId) { - log.info("查询作品状态统计,赛事ID:{}", contestId); + log.info("查询作品状态统计,活动ID:{}", contestId); LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper<>(); baseWrapper.eq(BizContestWork::getContestId, contestId); @@ -669,7 +669,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { public Map calculateFinalScore(Long workId) { log.info("计算作品终分,作品ID:{}", workId); - // 1. 获取作品、赛事、评审规则 + // 1. 获取作品、活动、评审规则 BizContestWork work = workMapper.selectById(workId); if (work == null) { throw BusinessException.of(ErrorCode.NOT_FOUND, "作品不存在"); @@ -677,7 +677,7 @@ public class ContestReviewServiceImpl implements IContestReviewService { BizContest contest = contestMapper.selectById(work.getContestId()); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } String calculationRule = "average"; // 默认 @@ -768,11 +768,11 @@ public class ContestReviewServiceImpl implements IContestReviewService { return result; } - // ====== 评委赛事详情 ====== + // ====== 评委活动详情 ====== @Override public Map getJudgeContestDetail(Long judgeId, Long contestId) { - log.info("获取评委赛事详情,评委ID:{},赛事ID:{}", judgeId, contestId); + log.info("获取评委活动详情,评委ID:{},活动ID:{}", judgeId, contestId); // 显式评委 或 已有作品分配记录 LambdaQueryWrapper judgeWrapper = new LambdaQueryWrapper<>(); @@ -785,13 +785,13 @@ public class ContestReviewServiceImpl implements IContestReviewService { assignCheck.eq(BizContestWorkJudgeAssignment::getContestId, contestId); assignCheck.eq(BizContestWorkJudgeAssignment::getJudgeId, judgeId); if (assignmentMapper.selectCount(assignCheck) == 0) { - throw BusinessException.of(ErrorCode.FORBIDDEN, "您不是该赛事的评委"); + throw BusinessException.of(ErrorCode.FORBIDDEN, "您不是该活动的评委"); } } BizContest contest = contestMapper.selectById(contestId); if (contest == null) { - throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + throw BusinessException.of(ErrorCode.NOT_FOUND, "活动不存在"); } Map result = new LinkedHashMap<>(); diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/PresetCommentServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/PresetCommentServiceImpl.java index 528bd1b..c7e26f2 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/PresetCommentServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/PresetCommentServiceImpl.java @@ -31,7 +31,7 @@ public class PresetCommentServiceImpl extends ServiceImpl> findAll(Long contestId, Long judgeId) { - log.info("查询预设评语列表,赛事ID:{},评委ID:{}", contestId, judgeId); + log.info("查询预设评语列表,活动ID:{},评委ID:{}", contestId, judgeId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizPresetComment::getValidState, 1); @@ -155,7 +155,7 @@ public class PresetCommentServiceImpl extends ServiceImpl> getJudgeContests(Long judgeId) { - log.info("查询评委关联赛事(预设评语视角),评委ID:{}", judgeId); + log.info("查询评委关联活动(预设评语视角),评委ID:{}", judgeId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizContestJudge::getJudgeId, judgeId); @@ -166,7 +166,7 @@ public class PresetCommentServiceImpl extends ServiceImpl { Map map = new LinkedHashMap<>(); map.put("id", j.getContestId()); - // 查询赛事详情获取名称和状态 + // 查询活动详情获取名称和状态 BizContest contest = contestMapper.selectById(j.getContestId()); if (contest != null) { map.put("contestName", contest.getContestName()); @@ -179,9 +179,9 @@ public class PresetCommentServiceImpl extends ServiceImpl syncComments(Long sourceContestId, List targetContestIds, Long judgeId) { - log.info("同步预设评语,源赛事ID:{},目标赛事数:{},评委ID:{}", sourceContestId, targetContestIds.size(), judgeId); + log.info("同步预设评语,源活动ID:{},目标活动数:{},评委ID:{}", sourceContestId, targetContestIds.size(), judgeId); - // 查询源赛事的评语 + // 查询源活动的评语 LambdaQueryWrapper sourceWrapper = new LambdaQueryWrapper<>(); sourceWrapper.eq(BizPresetComment::getContestId, sourceContestId); sourceWrapper.eq(BizPresetComment::getJudgeId, judgeId); @@ -189,7 +189,7 @@ public class PresetCommentServiceImpl extends ServiceImpl sourceComments = presetCommentMapper.selectList(sourceWrapper); if (sourceComments.isEmpty()) { - throw BusinessException.of(ErrorCode.BAD_REQUEST, "源赛事没有预设评语"); + throw BusinessException.of(ErrorCode.BAD_REQUEST, "源活动没有预设评语"); } int created = 0; diff --git a/backend-java/src/main/java/com/competition/modules/pub/dto/PublicRegisterActivityDto.java b/backend-java/src/main/java/com/competition/modules/pub/dto/PublicRegisterActivityDto.java index 58d9c53..4d93411 100644 --- a/backend-java/src/main/java/com/competition/modules/pub/dto/PublicRegisterActivityDto.java +++ b/backend-java/src/main/java/com/competition/modules/pub/dto/PublicRegisterActivityDto.java @@ -13,6 +13,6 @@ public class PublicRegisterActivityDto { @Schema(description = "子女ID(participantType=child时必填)") private Long childId; - @Schema(description = "团队ID(团队赛事时填写)") + @Schema(description = "团队ID(团队活动时填写)") private Long teamId; } diff --git a/backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql b/backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql index d3df735..d86252d 100644 --- a/backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql +++ b/backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql @@ -15,6 +15,6 @@ WHERE tenant_id IS NULL; ALTER TABLE t_biz_contest_notice ADD INDEX idx_tenant_id (tenant_id); --- 4. 添加联合索引优化按租户和赛事查询 +-- 4. 添加联合索引优化按租户和活动查询 ALTER TABLE t_biz_contest_notice ADD INDEX idx_tenant_contest (tenant_id, contest_id); diff --git a/backend-java/src/main/resources/db/migration/V4__rebuild_review_tables.sql b/backend-java/src/main/resources/db/migration/V4__rebuild_review_tables.sql index ef5ac71..6cf8a96 100644 --- a/backend-java/src/main/resources/db/migration/V4__rebuild_review_tables.sql +++ b/backend-java/src/main/resources/db/migration/V4__rebuild_review_tables.sql @@ -4,12 +4,12 @@ -- 使用 DROP + CREATE 确保表结构完整,因为评审模块尚未有生产数据 -- ============================================================ --- 1. 赛事评委表(对应实体 BizContestJudge,继承 BaseEntity) +-- 1. 活动评委表(对应实体 BizContestJudge,继承 BaseEntity) -- ============================================================ DROP TABLE IF EXISTS t_biz_contest_judge; CREATE TABLE t_biz_contest_judge ( id BIGINT NOT NULL AUTO_INCREMENT, - contest_id BIGINT NOT NULL COMMENT '赛事ID', + contest_id BIGINT NOT NULL COMMENT '活动ID', judge_id BIGINT NOT NULL COMMENT '评委用户ID', specialty VARCHAR(100) DEFAULT NULL COMMENT '专业领域', weight DECIMAL(3,2) DEFAULT 1.00 COMMENT '评委权重 0-1', @@ -26,7 +26,7 @@ CREATE TABLE t_biz_contest_judge ( PRIMARY KEY (id), INDEX idx_contest_id (contest_id), INDEX idx_judge_id (judge_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='赛事评委表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动评委表'; -- ============================================================ -- 2. 评审规则表(对应实体 BizContestReviewRule,继承 BaseEntity) @@ -60,7 +60,7 @@ CREATE TABLE t_biz_contest_review_rule ( DROP TABLE IF EXISTS t_biz_contest_work_judge_assignment; CREATE TABLE t_biz_contest_work_judge_assignment ( id BIGINT NOT NULL AUTO_INCREMENT, - contest_id BIGINT NOT NULL COMMENT '赛事ID', + contest_id BIGINT NOT NULL COMMENT '活动ID', work_id BIGINT NOT NULL COMMENT '作品ID', judge_id BIGINT NOT NULL COMMENT '评委用户ID', assignment_time DATETIME DEFAULT NULL COMMENT '分配时间', @@ -82,7 +82,7 @@ DROP TABLE IF EXISTS t_biz_contest_work_score; CREATE TABLE t_biz_contest_work_score ( id BIGINT NOT NULL AUTO_INCREMENT, tenant_id BIGINT DEFAULT NULL COMMENT '租户ID', - contest_id BIGINT NOT NULL COMMENT '赛事ID', + contest_id BIGINT NOT NULL COMMENT '活动ID', work_id BIGINT NOT NULL COMMENT '作品ID', assignment_id BIGINT DEFAULT NULL COMMENT '分配记录ID', judge_id BIGINT NOT NULL COMMENT '评委用户ID', @@ -113,7 +113,7 @@ CREATE TABLE t_biz_contest_work_score ( DROP TABLE IF EXISTS t_biz_preset_comment; CREATE TABLE t_biz_preset_comment ( id BIGINT NOT NULL AUTO_INCREMENT, - contest_id BIGINT DEFAULT NULL COMMENT '赛事ID(null 表示全局)', + contest_id BIGINT DEFAULT NULL COMMENT '活动ID(null 表示全局)', judge_id BIGINT DEFAULT NULL COMMENT '评委ID(null 表示通用)', content VARCHAR(1000) NOT NULL COMMENT '评语文本', category VARCHAR(50) DEFAULT NULL COMMENT '评语分类', diff --git a/backend-java/src/main/resources/db/migration/V6__add_table_and_column_comments.sql b/backend-java/src/main/resources/db/migration/V6__add_table_and_column_comments.sql index b5f8967..10d188e 100644 --- a/backend-java/src/main/resources/db/migration/V6__add_table_and_column_comments.sql +++ b/backend-java/src/main/resources/db/migration/V6__add_table_and_column_comments.sql @@ -8,15 +8,15 @@ -- 一、表级别注释 -- ============================================================ -ALTER TABLE t_biz_contest COMMENT='赛事表'; -ALTER TABLE t_biz_contest_attachment COMMENT='赛事附件表'; -ALTER TABLE t_biz_contest_notice COMMENT='赛事公告表'; -ALTER TABLE t_biz_contest_registration COMMENT='赛事报名表'; -ALTER TABLE t_biz_contest_registration_teacher COMMENT='赛事报名老师关联表'; -ALTER TABLE t_biz_contest_team COMMENT='赛事团队表'; -ALTER TABLE t_biz_contest_team_member COMMENT='赛事团队成员表'; -ALTER TABLE t_biz_contest_work COMMENT='赛事作品表'; -ALTER TABLE t_biz_contest_work_attachment COMMENT='赛事作品附件表'; +ALTER TABLE t_biz_contest COMMENT='活动表'; +ALTER TABLE t_biz_contest_attachment COMMENT='活动附件表'; +ALTER TABLE t_biz_contest_notice COMMENT='活动公告表'; +ALTER TABLE t_biz_contest_registration COMMENT='活动报名表'; +ALTER TABLE t_biz_contest_registration_teacher COMMENT='活动报名老师关联表'; +ALTER TABLE t_biz_contest_team COMMENT='活动团队表'; +ALTER TABLE t_biz_contest_team_member COMMENT='活动团队成员表'; +ALTER TABLE t_biz_contest_work COMMENT='活动作品表'; +ALTER TABLE t_biz_contest_work_attachment COMMENT='活动作品附件表'; ALTER TABLE t_biz_homework COMMENT='作业表'; ALTER TABLE t_biz_homework_review_rule COMMENT='作业评审规则表'; ALTER TABLE t_biz_homework_score COMMENT='作业评分表'; diff --git a/backend-java/src/main/resources/db/migration/V9__rename_contest_to_activity_comments.sql b/backend-java/src/main/resources/db/migration/V9__rename_contest_to_activity_comments.sql new file mode 100644 index 0000000..f2eb8d1 --- /dev/null +++ b/backend-java/src/main/resources/db/migration/V9__rename_contest_to_activity_comments.sql @@ -0,0 +1,24 @@ +-- V9: 将数据库表/列 COMMENT 中的旧品牌用词统一改为"活动" + +-- 表级 COMMENT 更新 +ALTER TABLE t_biz_contest COMMENT='活动表'; +ALTER TABLE t_biz_contest_attachment COMMENT='活动附件表'; +ALTER TABLE t_biz_contest_notice COMMENT='活动公告表'; +ALTER TABLE t_biz_contest_registration COMMENT='活动报名表'; +ALTER TABLE t_biz_contest_registration_teacher COMMENT='活动报名老师关联表'; +ALTER TABLE t_biz_contest_team COMMENT='活动团队表'; +ALTER TABLE t_biz_contest_team_member COMMENT='活动团队成员表'; +ALTER TABLE t_biz_contest_work COMMENT='活动作品表'; +ALTER TABLE t_biz_contest_work_attachment COMMENT='活动作品附件表'; +ALTER TABLE t_biz_contest_judge COMMENT='活动评委表'; +ALTER TABLE t_biz_contest_review_rule COMMENT='活动评审规则表'; +ALTER TABLE t_biz_contest_work_score COMMENT='活动作品评分表'; +ALTER TABLE t_biz_contest_work_judge_assignment COMMENT='活动作品评委分配表'; +ALTER TABLE t_biz_preset_comment COMMENT='活动预设评语表'; + +-- 列级 COMMENT 更新(V4 中创建的列) +ALTER TABLE t_biz_contest_judge MODIFY COLUMN contest_id BIGINT NOT NULL COMMENT '活动ID'; +-- 注意:t_biz_contest_review_rule 表没有 contest_id 列(评审规则是基于 tenant_id 的全局规则),跳过 +ALTER TABLE t_biz_contest_work_score MODIFY COLUMN contest_id BIGINT NOT NULL COMMENT '活动ID'; +ALTER TABLE t_biz_contest_work_judge_assignment MODIFY COLUMN contest_id BIGINT NOT NULL COMMENT '活动ID'; +ALTER TABLE t_biz_preset_comment MODIFY COLUMN contest_id BIGINT DEFAULT NULL COMMENT '活动ID(null 表示全局)'; diff --git a/frontend/.env.development b/frontend/.env.development index 96a5e9f..23c2864 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -1,6 +1,4 @@ # 开发环境 VITE_API_BASE_URL=/api -# AI 绘本子项目本地 dev server(vite proxy /ai-web → 该地址) -VITE_AI_CLIENT_DEV_URL=http://localhost:3001 -# 兼容旧名:与 VITE_AI_CLIENT_DEV_URL 二选一即可,优先前者 -VITE_AI_POST_MESSAGE_URL=http://localhost:3001 +# 乐读派 AI 创作后端地址(直连,不走 Vite 代理) +VITE_LEAI_API_URL=http://192.168.1.120:8080 diff --git a/frontend/.env.production b/frontend/.env.production index f32edc7..5e532bc 100644 --- a/frontend/.env.production +++ b/frontend/.env.production @@ -1,6 +1,4 @@ # 生产环境 VITE_API_BASE_URL=/api -# 如果后端部署在不同域名,可以改成完整地址: -# VITE_API_BASE_URL=https://api.your-domain.com -VITE_AI_POST_MESSAGE_URL=http://localhost:3001 - +# 乐读派 AI 创作后端地址(直连) +VITE_LEAI_API_URL=http://192.168.1.120:8080 diff --git a/frontend/.env.test b/frontend/.env.test index 3cd9f05..d81177c 100644 --- a/frontend/.env.test +++ b/frontend/.env.test @@ -1,3 +1,5 @@ # 测试环境 VITE_BASE_URL=/web-test/ VITE_API_BASE_URL=/api-test +# 乐读派 AI 创作后端地址(直连) +VITE_LEAI_API_URL=http://192.168.1.120:8080 diff --git a/frontend/docs/nginx-deployment.md b/frontend/docs/nginx-deployment.md new file mode 100644 index 0000000..7bf0351 --- /dev/null +++ b/frontend/docs/nginx-deployment.md @@ -0,0 +1,79 @@ +# Nginx 部署配置指南 — AI 绘本创作模块整合 + +## 概述 + +AI 绘本创作模块已整合进主前端。该模块通过 `VITE_LEAI_API_URL` 环境变量**直连乐读派后端**(跨域),不走 Nginx 代理。只需确保乐读派后端允许跨域即可。 + +## 关键配置 + +| 项目 | 配置方式 | 说明 | +|------|---------|------| +| 乐读派 API 地址 | `.env.*` 中 `VITE_LEAI_API_URL` | 编译时注入,浏览器直连 | +| 乐读派 WebSocket | 自动从 `VITE_LEAI_API_URL` 推导 `ws://` | CreatingView 页面使用 | +| 主后端 API | Nginx 代理 `/api` → `8580` | 与之前相同 | + +## 环境变量配置 + +在每个环境对应的 `.env.*` 文件中配置乐读派后端地址: + +```bash +# .env.development / .env.production / .env.test +VITE_LEAI_API_URL=http://192.168.1.120:8080 +``` + +## 乐读派后端 CORS 配置 + +由于前端直连乐读派后端(跨域),乐读派后端需要配置 CORS: + +```yaml +# 乐读派后端 application.yml 需要添加: +allowed-origins: + - http://your-domain.com # 生产域名 + - http://localhost:3000 # 本地开发 +``` + +## Nginx 配置示例 + +```nginx +server { + listen 80; + server_name your-domain.com; + + # ─── 主后端 API(与之前相同) ─── + location /api/ { + proxy_pass http://127.0.0.1:8580/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # ─── 前端静态资源 ─── + location /web/ { + alias /path/to/frontend/dist/; + try_files $uri $uri/ /web/index.html; + } + + # ─── SPA 回退 ─── + location / { + return 301 /web/; + } +} +``` + +## 开发环境 + +```bash +# 只需启动一个前端(不再需要 aicreate-client) +cd frontend +npm run dev +``` + +Vite 代理只需配置主后端 `/api → 8580`,乐读派 API 由浏览器直接访问 `VITE_LEAI_API_URL`。 + +## 注意事项 + +1. **CORS 必须配置**:乐读派后端必须允许前端域名的跨域请求 +2. **WebSocket 跨域**:Creating 页面的进度推送使用 WebSocket,乐读派后端也需要允许 WS 跨域 +3. **HTTPS 环境**:如果前端使用 HTTPS,`VITE_LEAI_API_URL` 建议也使用 `https://`,否则浏览器会阻止混合内容 +4. **修改地址后需重新构建**:`VITE_LEAI_API_URL` 是编译时变量,修改后需要 `npm run build` diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3ae007f..49d7095 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,11 +9,14 @@ "version": "1.0.0", "dependencies": { "@ant-design/icons-vue": "^7.0.1", + "@stomp/stompjs": "^7.3.0", "@vee-validate/zod": "^4.12.4", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", + "ali-oss": "^6.23.0", "ant-design-vue": "^4.1.1", "axios": "^1.6.7", + "crypto-js": "^4.2.0", "dayjs": "^1.11.10", "echarts": "^6.0.0", "pinia": "^2.1.7", @@ -26,6 +29,7 @@ }, "devDependencies": { "@playwright/test": "^1.59.1", + "@types/crypto-js": "^4.2.2", "@types/multer": "^2.0.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-typescript": "^13.0.0", @@ -1416,6 +1420,11 @@ "nanopop": "^2.1.0" } }, + "node_modules/@stomp/stompjs": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/@stomp/stompjs/-/stompjs-7.3.0.tgz", + "integrity": "sha512-nKMLoFfJhrQAqkvvKd1vLq/cVBGCMwPRCD0LqW7UT1fecRx9C3GoKEIR2CYwVuErGeZu8w0kFkl2rlhPlqHVgQ==" + }, "node_modules/@transloadit/prettier-bytes": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", @@ -1443,6 +1452,12 @@ "@types/node": "*" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2215,6 +2230,25 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-3.5.3.tgz", + "integrity": "sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2232,6 +2266,41 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ali-oss": { + "version": "6.23.0", + "resolved": "https://registry.npmmirror.com/ali-oss/-/ali-oss-6.23.0.tgz", + "integrity": "sha512-FipRmyd16Pr/tEey/YaaQ/24Pc3HEpLM9S1DRakEuXlSLXNIJnu1oJtHM53eVYpvW3dXapSjrip3xylZUTIZVQ==", + "dependencies": { + "address": "^1.2.2", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^4.3.4", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.4.0", + "js-base64": "^2.5.2", + "jstoxml": "^2.0.0", + "lodash": "^4.17.21", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "platform": "^1.3.1", + "pump": "^3.0.0", + "qs": "^6.4.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "^2.44.0", + "utility": "^1.18.0", + "xml2js": "^0.6.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/alien-signals": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.1.2.tgz", @@ -2308,7 +2377,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, "license": "MIT" }, "node_modules/anymatch": { @@ -2461,6 +2529,11 @@ "dev": true, "license": "ISC" }, + "node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmmirror.com/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -2518,6 +2591,11 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2531,6 +2609,21 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2660,6 +2753,14 @@ "dev": true, "license": "MIT" }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/copy-anything": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", @@ -2675,6 +2776,11 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" + }, "node_modules/core-js": { "version": "3.47.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", @@ -2686,6 +2792,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2701,6 +2812,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2733,6 +2849,14 @@ "node": ">=0.12" } }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "engines": { + "node": "*" + } + }, "node_modules/dayjs": { "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", @@ -2743,7 +2867,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2764,6 +2887,17 @@ "dev": true, "license": "MIT" }, + "node_modules/default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==", + "dependencies": { + "os-name": "~1.0.3" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2773,6 +2907,15 @@ "node": ">=0.4.0" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -2794,6 +2937,14 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/digest-header": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/digest-header/-/digest-header-1.1.0.tgz", + "integrity": "sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==", + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2871,6 +3022,11 @@ "zrender": "6.0.0" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -2878,6 +3034,22 @@ "dev": true, "license": "ISC" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==", + "engines": { + "node": ">= 0.11.14" + } + }, "node_modules/entities": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", @@ -3024,6 +3196,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3275,6 +3452,17 @@ "type": "^2.7.2" } }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3437,6 +3625,17 @@ "node": ">= 6" } }, + "node_modules/formstream": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/formstream/-/formstream-1.5.2.tgz", + "integrity": "sha512-NASf0lgxC1AyKNXQIrXTEYkiX99LhCEXTkiGObXAkpBui86a4u8FjH1o2bGb3PpqI3kafC+yw4zWeK6l6VHTgg==", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "node-hex": "^1.0.1", + "pause-stream": "~0.0.11" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -3519,6 +3718,11 @@ "node": ">= 0.4" } }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3712,6 +3916,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/i18next": { "version": "20.6.1", "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz", @@ -3721,6 +3933,17 @@ "@babel/runtime": "^7.12.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3791,7 +4014,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/is-binary-path": { @@ -3807,6 +4029,11 @@ "node": ">=8" } }, + "node_modules/is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -3823,6 +4050,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3881,6 +4116,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-type-of": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/is-type-of/-/is-type-of-1.4.0.tgz", + "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==", + "dependencies": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, "node_modules/is-url": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", @@ -3899,6 +4144,11 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3906,6 +4156,11 @@ "dev": true, "license": "ISC" }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -3916,6 +4171,11 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3956,6 +4216,11 @@ "dev": true, "license": "MIT" }, + "node_modules/jstoxml": { + "version": "2.2.9", + "resolved": "https://registry.npmmirror.com/jstoxml/-/jstoxml-2.2.9.tgz", + "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4108,6 +4373,14 @@ "node": ">= 0.4" } }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4132,6 +4405,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4178,17 +4462,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/muggle-string": { @@ -4201,7 +4503,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -4260,6 +4561,14 @@ "license": "MIT", "optional": true }, + "node_modules/node-hex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/node-hex/-/node-hex-1.0.1.tgz", + "integrity": "sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -4294,7 +4603,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4310,11 +4618,21 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -4338,6 +4656,35 @@ "node": ">= 0.8.0" } }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dependencies": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dependencies": { + "minimist": "^1.1.0" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4436,6 +4783,14 @@ "node": ">=8" } }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, "node_modules/perfect-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", @@ -4503,6 +4858,11 @@ "node": ">= 6" } }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, "node_modules/playwright": { "version": "1.59.1", "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.59.1.tgz", @@ -4738,12 +5098,26 @@ "node": ">=6" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4754,6 +5128,20 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4785,6 +5173,20 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -4936,6 +5338,16 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sass": { "version": "1.97.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", @@ -4957,6 +5369,14 @@ "@parcel/watcher": "^2.4.1" } }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/scroll-into-view-if-needed": { "version": "2.2.31", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", @@ -4966,6 +5386,14 @@ "compute-scroll-into-view": "^1.0.20" } }, + "node_modules/sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==", + "dependencies": { + "get-ready": "~1.0.0" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -5008,6 +5436,74 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5092,6 +5588,42 @@ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==", "license": "MIT" }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5285,7 +5817,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -5295,7 +5826,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -5319,6 +5849,11 @@ "node": ">=12.22" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -5373,6 +5908,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5463,6 +6003,17 @@ "dev": true, "license": "MIT" }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -5504,13 +6055,57 @@ "punycode": "^2.1.0" } }, + "node_modules/urllib": { + "version": "2.44.0", + "resolved": "https://registry.npmmirror.com/urllib/-/urllib-2.44.0.tgz", + "integrity": "sha512-zRCJqdfYllRDA9bXUtx+vccyRqtJPKsw85f44zH7zPD28PIvjMqIgw9VwoTLV7xTBWZsbebUFVHU5ghQcWku2A==", + "dependencies": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "default-user-agent": "^1.0.0", + "digest-header": "^1.0.0", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.6.3", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + }, + "engines": { + "node": ">= 0.10.0" + }, + "peerDependencies": { + "proxy-agent": "^5.0.0" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, + "node_modules/utility": { + "version": "1.18.0", + "resolved": "https://registry.npmmirror.com/utility/-/utility-1.18.0.tgz", + "integrity": "sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==", + "dependencies": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0" + } + }, "node_modules/vee-validate": { "version": "4.15.1", "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.15.1.tgz", @@ -5757,6 +6352,25 @@ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "license": "MIT" }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dependencies": { + "semver": "^5.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/win-release/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -5771,7 +6385,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "node_modules/xml-name-validator": { @@ -5784,6 +6397,34 @@ "node": ">=12" } }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 09e535c..90bc25a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,11 +14,14 @@ }, "dependencies": { "@ant-design/icons-vue": "^7.0.1", + "@stomp/stompjs": "^7.3.0", "@vee-validate/zod": "^4.12.4", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", + "ali-oss": "^6.23.0", "ant-design-vue": "^4.1.1", "axios": "^1.6.7", + "crypto-js": "^4.2.0", "dayjs": "^1.11.10", "echarts": "^6.0.0", "pinia": "^2.1.7", @@ -31,6 +34,7 @@ }, "devDependencies": { "@playwright/test": "^1.59.1", + "@types/crypto-js": "^4.2.2", "@types/multer": "^2.0.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-typescript": "^13.0.0", diff --git a/frontend/src/api/ai-3d.ts b/frontend/src/api/ai-3d.ts index 27ee713..a16beb5 100644 --- a/frontend/src/api/ai-3d.ts +++ b/frontend/src/api/ai-3d.ts @@ -1,7 +1,7 @@ /** * AI 3D 模块 API 存根文件 * 原模块已剥离至 competition-management-system-stripped-modules/ - * 仅保留被赛事模块引用的类型和接口定义 + * 仅保留被活动模块引用的类型和接口定义 */ import request from "@/utils/request"; import type { PaginationParams } from "@/types/api"; diff --git a/frontend/src/api/contests.ts b/frontend/src/api/contests.ts index 11fe3d4..519d055 100644 --- a/frontend/src/api/contests.ts +++ b/frontend/src/api/contests.ts @@ -1302,7 +1302,7 @@ export const reviewsApi = { return response; }, - // 获取评委视角的赛事详情(含评审规则) + // 获取评委视角的活动详情(含评审规则) getJudgeContestDetail: async (contestId: number): Promise => { const response = await request.get( `/contests/reviews/judge/contests/${contestId}/detail`, @@ -1556,7 +1556,7 @@ export const resultsApi = { // 评委管理 export const judgesApi = { - // 获取赛事评委(assigned + implicitPool) + // 获取活动评委(assigned + implicitPool) getList: async ( contestId: number, ): Promise => { diff --git a/frontend/src/api/students.ts b/frontend/src/api/students.ts index fa376b2..394b2b4 100644 --- a/frontend/src/api/students.ts +++ b/frontend/src/api/students.ts @@ -1,7 +1,7 @@ /** * 学生模块 API 存根文件 * 原模块已剥离至 competition-management-system-stripped-modules/ - * 仅保留被赛事模块引用的类型和接口定义 + * 仅保留被活动模块引用的类型和接口定义 */ import request from "@/utils/request"; import type { PaginationParams, PaginationResponse } from "@/types/api"; diff --git a/frontend/src/api/teachers.ts b/frontend/src/api/teachers.ts index e34eed9..7939610 100644 --- a/frontend/src/api/teachers.ts +++ b/frontend/src/api/teachers.ts @@ -1,7 +1,7 @@ /** * 教师模块 API 存根文件 * 原模块已剥离至 competition-management-system-stripped-modules/ - * 仅保留被赛事模块引用的类型和接口定义 + * 仅保留被活动模块引用的类型和接口定义 */ import request from "@/utils/request"; import type { PaginationParams, PaginationResponse } from "@/types/api"; diff --git a/frontend/src/layouts/PublicLayout.vue b/frontend/src/layouts/PublicLayout.vue index 27da603..013cc83 100644 --- a/frontend/src/layouts/PublicLayout.vue +++ b/frontend/src/layouts/PublicLayout.vue @@ -63,10 +63,11 @@
- - - - + + + + +
@@ -116,13 +117,14 @@ +