From 764f6eec4b7ddfff5250b9032fd635dd2258ee28 Mon Sep 17 00:00:00 2001 From: zhonghua Date: Fri, 3 Apr 2026 14:49:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=85=AC=E5=91=8A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ContestNoticeController.java | 22 ++++++++++++++++--- .../biz/contest/entity/BizContestNotice.java | 14 +++++++++++- .../src/main/resources/application.yml | 2 +- .../V1__add_deleted_to_t_biz_contest_work.sql | 21 ------------------ .../V2__add_tenant_isolation_to_notice.sql | 20 +++++++++++++++++ 5 files changed, 53 insertions(+), 26 deletions(-) delete mode 100644 backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql create mode 100644 backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql 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 e11727b..26244ab 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.competition.common.result.PageResult; import com.competition.common.result.Result; +import com.competition.common.util.SecurityUtil; import com.competition.modules.biz.contest.dto.CreateNoticeDto; import com.competition.modules.biz.contest.entity.BizContestNotice; import com.competition.modules.biz.contest.service.IContestNoticeService; @@ -39,6 +40,8 @@ public class ContestNoticeController { if (StringUtils.hasText(dto.getPublishTime())) { notice.setPublishTime(LocalDateTime.parse(dto.getPublishTime())); } + // 设置当前租户 ID(租户隔离) + notice.setTenantId(SecurityUtil.getCurrentTenantId()); noticeService.save(notice); return Result.success(notice); } @@ -47,9 +50,11 @@ public class ContestNoticeController { @RequirePermission("notice:read") @Operation(summary = "查询赛事下的公告列表") public Result> findByContest(@PathVariable Long contestId) { + Long tenantId = SecurityUtil.getCurrentTenantId(); List list = noticeService.list( new LambdaQueryWrapper() .eq(BizContestNotice::getContestId, contestId) + .eq(BizContestNotice::getTenantId, tenantId) .orderByDesc(BizContestNotice::getCreateTime)); return Result.success(list); } @@ -60,10 +65,21 @@ public class ContestNoticeController { public Result> findAll( @RequestParam(defaultValue = "1") Long page, @RequestParam(defaultValue = "10") Long pageSize, - @RequestParam(required = false) String title) { + @RequestParam(required = false) String title, + @RequestParam(required = false) String status) { + Long tenantId = SecurityUtil.getCurrentTenantId(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(StringUtils.hasText(title), BizContestNotice::getTitle, title) - .orderByDesc(BizContestNotice::getCreateTime); + .eq(BizContestNotice::getTenantId, tenantId) // 租户隔离 + .like(StringUtils.hasText(title), BizContestNotice::getTitle, title); + + // 发布状态过滤 + if ("published".equals(status)) { + wrapper.isNotNull(BizContestNotice::getPublishTime); + } else if ("unpublished".equals(status)) { + wrapper.isNull(BizContestNotice::getPublishTime); + } + + wrapper.orderByDesc(BizContestNotice::getCreateTime); Page result = noticeService.page(new Page<>(page, pageSize), wrapper); return Result.success(PageResult.from(result)); } 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 9b18068..bf01ff7 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 @@ -8,24 +8,36 @@ import lombok.EqualsAndHashCode; import java.time.LocalDateTime; +/** + * 赛事公告实体 + */ @Data @EqualsAndHashCode(callSuper = true) @TableName("t_biz_contest_notice") public class BizContestNotice extends BaseEntity { + /** 赛事 ID */ @TableField("contest_id") private Long contestId; + /** 租户 ID(用于租户隔离) */ + @TableField("tenant_id") + private Long tenantId; + + /** 公告标题 */ private String title; + /** 公告内容(富文本) */ private String content; - /** system/manual/urgent */ + /** 公告类型:system/manual/urgent */ @TableField("notice_type") private String noticeType; + /** 优先级 */ private Integer priority; + /** 发布时间 */ @TableField("publish_time") private LocalDateTime publishTime; } diff --git a/backend-java/src/main/resources/application.yml b/backend-java/src/main/resources/application.yml index f5f9ace..c838ade 100644 --- a/backend-java/src/main/resources/application.yml +++ b/backend-java/src/main/resources/application.yml @@ -15,7 +15,7 @@ spring: # Flyway 数据库迁移 flyway: - enabled: false + enabled: true locations: classpath:db/migration baseline-on-migrate: true baseline-version: 0 diff --git a/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql b/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql deleted file mode 100644 index e775554..0000000 --- a/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Flyway migration: --- 兼容部分环境没有跑过最新的 init.sql, --- 导致 t_biz_contest_work 缺少 deleted 字段,从而逻辑删除查询报错。 -SET @column_cnt := ( - SELECT COUNT(*) - FROM information_schema.columns - WHERE table_schema = DATABASE() - AND table_name = 't_biz_contest_work' - AND column_name = 'deleted' -); - -SET @sql := IF( - @column_cnt = 0, - 'ALTER TABLE t_biz_contest_work ADD COLUMN deleted tinyint NOT NULL DEFAULT ''0'' COMMENT ''逻辑删除:0-未删除,1-已删除''', - 'SELECT 1' -); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - 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 new file mode 100644 index 0000000..d3df735 --- /dev/null +++ b/backend-java/src/main/resources/db/migration/V2__add_tenant_isolation_to_notice.sql @@ -0,0 +1,20 @@ +-- 活动公告表添加租户隔离字段 +-- 执行时间:2026-04-03 + +-- 1. 添加 tenant_id 字段 +ALTER TABLE t_biz_contest_notice +ADD COLUMN tenant_id BIGINT COMMENT '租户 ID(用于租户隔离)' AFTER contest_id; + +-- 2. 为现有数据设置默认租户 ID(根据实际业务,可能需要手动设置) +-- 假设现有公告都属于当前租户(需要根据实际情况修改 tenant_id) +UPDATE t_biz_contest_notice +SET tenant_id = 9 +WHERE tenant_id IS NULL; + +-- 3. 添加索引优化查询性能 +ALTER TABLE t_biz_contest_notice +ADD INDEX idx_tenant_id (tenant_id); + +-- 4. 添加联合索引优化按租户和赛事查询 +ALTER TABLE t_biz_contest_notice +ADD INDEX idx_tenant_contest (tenant_id, contest_id);