From 2c72161efaa70b3acbbce61663a77efba8fa18e7 Mon Sep 17 00:00:00 2001 From: zyh Date: Fri, 29 Aug 2025 23:04:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E5=91=8A=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/AnnouncementController.java | 70 ++++++++++++++++--- .../mapper/admin/AnnouncementMapper.java | 14 ++++ .../dto/admin/AnnouncementConverter.java | 2 + .../model/dto/admin/AnnouncementRequest.java | 11 +++ .../model/dto/admin/AnnouncementResponse.java | 11 +++ .../model/entity/admin/Announcement.java | 6 ++ .../service/admin/AnnouncementService.java | 35 ++++++++++ 7 files changed, 141 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gameplatform/server/controller/admin/AnnouncementController.java b/src/main/java/com/gameplatform/server/controller/admin/AnnouncementController.java index 63ce89a..4a9f0a3 100644 --- a/src/main/java/com/gameplatform/server/controller/admin/AnnouncementController.java +++ b/src/main/java/com/gameplatform/server/controller/admin/AnnouncementController.java @@ -6,11 +6,13 @@ import com.gameplatform.server.model.dto.admin.AnnouncementResponse; import com.gameplatform.server.model.dto.common.PageResult; import com.gameplatform.server.model.entity.admin.Announcement; import com.gameplatform.server.service.admin.AnnouncementService; +import io.jsonwebtoken.Claims; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,8 +26,8 @@ public class AnnouncementController { private AnnouncementService announcementService; @PostMapping - @Operation(summary = "创建公告", description = "创建新的系统公告") - public ResponseEntity createAnnouncement(@RequestBody AnnouncementRequest request) { + @Operation(summary = "创建公告", description = "创建新的系统公告,belongId会自动从JWT token中获取") + public ResponseEntity createAnnouncement(@RequestBody AnnouncementRequest request, Authentication authentication) { if (request.getTitle() == null || request.getTitle().trim().isEmpty()) { return ResponseEntity.badRequest().body(new Object() { public final boolean success = false; @@ -44,6 +46,33 @@ public class AnnouncementController { request.setEnabled(false); // 默认禁用 } + // 从JWT token中获取当前用户ID + if (authentication == null) { + return ResponseEntity.badRequest().body(new Object() { + public final boolean success = false; + public final String message = "用户未认证"; + }); + } + + Claims claims = (Claims) authentication.getDetails(); + if (claims == null) { + return ResponseEntity.badRequest().body(new Object() { + public final boolean success = false; + public final String message = "无法获取用户信息"; + }); + } + + Long userId = claims.get("userId", Long.class); + if (userId == null) { + return ResponseEntity.badRequest().body(new Object() { + public final boolean success = false; + public final String message = "无法获取用户ID"; + }); + } + + // 设置belongId为当前用户ID + request.setBelongId(userId.intValue()); + Announcement announcement = AnnouncementConverter.toEntity(request); boolean success = announcementService.createAnnouncement(announcement); final boolean finalSuccess = success; @@ -60,13 +89,20 @@ public class AnnouncementController { public ResponseEntity> getAnnouncementList( @Parameter(description = "页码", example = "1") @RequestParam(defaultValue = "1") int page, @Parameter(description = "每页大小", example = "20") @RequestParam(defaultValue = "20") int size, - @Parameter(description = "按启用状态筛选,不传则获取全部") @RequestParam(required = false) Boolean enabled) { + @Parameter(description = "按启用状态筛选,不传则获取全部") @RequestParam(required = false) Boolean enabled, + @Parameter(description = "按归属ID筛选") @RequestParam(required = false) Integer belongId) { int offset = (page - 1) * size; List announcements; long total; - if (enabled != null) { + if (belongId != null && enabled != null) { + announcements = announcementService.getAnnouncementsByBelongIdAndEnabled(belongId, enabled, size, offset); + total = announcementService.getAnnouncementCountByBelongIdAndEnabled(belongId, enabled); + } else if (belongId != null) { + announcements = announcementService.getAnnouncementsByBelongId(belongId, size, offset); + total = announcementService.getAnnouncementCountByBelongId(belongId); + } else if (enabled != null) { announcements = announcementService.getAnnouncementsByEnabled(enabled, size, offset); total = announcementService.getAnnouncementCountByEnabled(enabled); } else { @@ -99,10 +135,11 @@ public class AnnouncementController { } @PutMapping("/{id}") - @Operation(summary = "更新公告", description = "更新指定ID的公告信息") + @Operation(summary = "更新公告", description = "更新指定ID的公告信息,belongId会自动从JWT token中获取") public ResponseEntity updateAnnouncement( @Parameter(description = "公告ID", example = "1") @PathVariable Long id, - @RequestBody AnnouncementRequest request) { + @RequestBody AnnouncementRequest request, + Authentication authentication) { // 检查公告是否存在 if (!announcementService.announcementExists(id)) { @@ -123,6 +160,17 @@ public class AnnouncementController { }); } + // 从JWT token中获取当前用户ID + if (authentication != null) { + Claims claims = (Claims) authentication.getDetails(); + if (claims != null) { + Long userId = claims.get("userId", Long.class); + if (userId != null) { + request.setBelongId(userId.intValue()); + } + } + } + Announcement announcement = AnnouncementConverter.toEntity(request); announcement.setId(id); boolean success = announcementService.updateAnnouncement(announcement); @@ -178,8 +226,14 @@ public class AnnouncementController { @GetMapping("/enabled") @Operation(summary = "获取启用的公告", description = "获取所有启用状态的公告,用于前端显示") - public ResponseEntity> getEnabledAnnouncements() { - List announcements = announcementService.getEnabledAnnouncements(); + public ResponseEntity> getEnabledAnnouncements( + @Parameter(description = "按归属ID筛选") @RequestParam(required = false) Integer belongId) { + List announcements; + if (belongId != null) { + announcements = announcementService.getEnabledAnnouncementsByBelongId(belongId); + } else { + announcements = announcementService.getEnabledAnnouncements(); + } List responses = announcements.stream() .map(AnnouncementConverter::toResponse) .toList(); diff --git a/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java b/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java index ec57603..144ae6a 100644 --- a/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java +++ b/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java @@ -29,4 +29,18 @@ public interface AnnouncementMapper extends BaseMapper { long countByEnabled(@Param("enabled") Boolean enabled); int updateEnabled(@Param("id") Long id, @Param("enabled") Boolean enabled); + + List findByBelongId(@Param("belongId") Integer belongId, + @Param("size") int size, + @Param("offset") int offset); + + long countByBelongId(@Param("belongId") Integer belongId); + + List findByBelongIdAndEnabled(@Param("belongId") Integer belongId, + @Param("enabled") Boolean enabled, + @Param("size") int size, + @Param("offset") int offset); + + long countByBelongIdAndEnabled(@Param("belongId") Integer belongId, + @Param("enabled") Boolean enabled); } diff --git a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementConverter.java b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementConverter.java index 44da593..8acc9dc 100644 --- a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementConverter.java +++ b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementConverter.java @@ -17,6 +17,7 @@ public class AnnouncementConverter { announcement.setContent(request.getContent()); announcement.setEnabled(request.getEnabled()); announcement.setJumpUrl(request.getJumpUrl()); + announcement.setBelongId(request.getBelongId()); return announcement; } @@ -37,6 +38,7 @@ public class AnnouncementConverter { response.setJumpUrl(announcement.getJumpUrl()); response.setCreatedAt(announcement.getCreatedAt()); response.setUpdatedAt(announcement.getUpdatedAt()); + response.setBelongId(announcement.getBelongId()); return response; } diff --git a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementRequest.java b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementRequest.java index 38409e4..4e9d2e2 100644 --- a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementRequest.java +++ b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementRequest.java @@ -16,6 +16,9 @@ public class AnnouncementRequest { @Schema(description = "跳转链接", example = "https://example.com") private String jumpUrl; + + // belongId字段保留用于内部设置,但不在API文档中暴露 + private Integer belongId; public String getTitle() { return title; @@ -48,4 +51,12 @@ public class AnnouncementRequest { public void setJumpUrl(String jumpUrl) { this.jumpUrl = jumpUrl; } + + public Integer getBelongId() { + return belongId; + } + + public void setBelongId(Integer belongId) { + this.belongId = belongId; + } } diff --git a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementResponse.java b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementResponse.java index d277c97..7cf809e 100644 --- a/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementResponse.java +++ b/src/main/java/com/gameplatform/server/model/dto/admin/AnnouncementResponse.java @@ -26,6 +26,9 @@ public class AnnouncementResponse { @Schema(description = "更新时间") private LocalDateTime updatedAt; + + @Schema(description = "归属ID", example = "1") + private Integer belongId; public Long getId() { return id; @@ -82,4 +85,12 @@ public class AnnouncementResponse { public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + + public Integer getBelongId() { + return belongId; + } + + public void setBelongId(Integer belongId) { + this.belongId = belongId; + } } diff --git a/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java b/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java index af93ea6..88c75c7 100644 --- a/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java +++ b/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java @@ -25,6 +25,9 @@ public class Announcement { @TableField("updated_at") private LocalDateTime updatedAt; + + @TableField("belong_id") + private Integer belongId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } @@ -46,4 +49,7 @@ public class Announcement { public LocalDateTime getUpdatedAt() { return updatedAt; } public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + + public Integer getBelongId() { return belongId; } + public void setBelongId(Integer belongId) { this.belongId = belongId; } } diff --git a/src/main/java/com/gameplatform/server/service/admin/AnnouncementService.java b/src/main/java/com/gameplatform/server/service/admin/AnnouncementService.java index ab27c58..5e8ec65 100644 --- a/src/main/java/com/gameplatform/server/service/admin/AnnouncementService.java +++ b/src/main/java/com/gameplatform/server/service/admin/AnnouncementService.java @@ -91,4 +91,39 @@ public class AnnouncementService { public boolean announcementExists(Long id) { return getAnnouncementById(id) != null; } + + /** + * 根据归属ID获取公告(分页) + */ + public List getAnnouncementsByBelongId(Integer belongId, int size, int offset) { + return announcementMapper.findByBelongId(belongId, size, offset); + } + + /** + * 根据归属ID获取公告数量 + */ + public long getAnnouncementCountByBelongId(Integer belongId) { + return announcementMapper.countByBelongId(belongId); + } + + /** + * 根据归属ID和启用状态获取公告(分页) + */ + public List getAnnouncementsByBelongIdAndEnabled(Integer belongId, Boolean enabled, int size, int offset) { + return announcementMapper.findByBelongIdAndEnabled(belongId, enabled, size, offset); + } + + /** + * 根据归属ID和启用状态获取公告数量 + */ + public long getAnnouncementCountByBelongIdAndEnabled(Integer belongId, Boolean enabled) { + return announcementMapper.countByBelongIdAndEnabled(belongId, enabled); + } + + /** + * 获取指定归属ID的启用公告(用于前端显示) + */ + public List getEnabledAnnouncementsByBelongId(Integer belongId) { + return announcementMapper.findByBelongIdAndEnabled(belongId, true, 10, 0); // 最多返回10条启用的公告 + } }