From ba94ceae1315174798ae1967ef62268c6d16cd5b Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期一, 06 十月 2025 22:07:06 +0800 Subject: [PATCH] feat: 评审与活动相关改动 - backend(GraphQL): Activity schema 增加 updateActivityState(id, state);实现 resolver/service 仅更新 state=2 作为逻辑删除 - backend(GraphQL): region.graphqls 新增 Query leafRegions - backend(GraphQL): player.graphqls 的 projectReviewApplications 增加可选参数 regionId - backend(Service): listProjectReviewApplications 绑定 regionId 参数,修复 QueryParameterException - frontend(web): 新增 api/activity.js 的 updateActivityState 并接入 activity-list 删除逻辑 - frontend(web): review-list.vue 权限仅校验登录,移除角色限制;查询参数修正为 name/regionId - frontend(web): 删除未引用的 ActivityList.vue - frontend(web): projectReviewNew.js GraphQL 查询增加 name 参数 --- backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 112 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java b/backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java index 3ab5319..afeaee8 100644 --- a/backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java +++ b/backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java @@ -5,13 +5,21 @@ import com.rongyichuang.activity.service.ActivityService; import com.rongyichuang.common.dto.PageRequest; import com.rongyichuang.common.dto.PageResponse; +import com.rongyichuang.common.dto.response.MediaResponse; +import com.rongyichuang.common.enums.MediaTargetType; +import com.rongyichuang.common.repository.MediaRepository; +import com.rongyichuang.common.entity.Media; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; import java.util.List; +import java.util.stream.Collectors; @Controller public class ActivityResolver { @@ -19,13 +27,19 @@ @Autowired private ActivityService activityService; + @Autowired + private MediaRepository mediaRepository; + + @Value("${app.media-url}") + private String mediaBaseUrl; + /** * 鍒嗛〉鏌ヨ姣旇禌鍒楄〃 */ @QueryMapping - public PageResponse<ActivityResponse> activities(@Argument int page, @Argument int size, @Argument String name) { + public PageResponse<ActivityResponse> activities(@Argument int page, @Argument int size, @Argument String name, @Argument Integer state) { PageRequest pageRequest = new PageRequest(page, size); - return activityService.findCompetitions(pageRequest, name); + return activityService.findActivities(pageRequest, name, state); } /** @@ -45,11 +59,19 @@ } /** + * 鑾峰彇鎵�鏈夋瘮璧涢樁娈碉紙鐢ㄤ簬璇勫椤甸潰涓嬫媺閫夋嫨锛� + */ + @QueryMapping + public List<ActivityResponse> allActivityStages() { + return activityService.findAllStagesForSelection(); + } + + /** * 鑾峰彇姣旇禌鐨勬墍鏈夐樁娈� */ @QueryMapping - public List<ActivityResponse> activityStages(@Argument Long competitionId) { - return activityService.findStagesByCompetitionId(competitionId); + public List<ActivityResponse> activityStages(@Argument Long activityId) { + return activityService.findStagesByActivityId(activityId); } /** @@ -57,7 +79,7 @@ */ @QueryMapping public List<ActivityResponse> ongoingActivities() { - return activityService.findOngoingCompetitions(); + return activityService.findOngoingActivities(); } /** @@ -75,4 +97,89 @@ public Boolean deleteActivity(@Argument Long id) { return activityService.deleteActivity(id); } + + @MutationMapping + public Boolean updateActivityState(@Argument Long id, @Argument Integer state) { + return activityService.updateActivityState(id, state); + } + + /** + * 瑙f瀽Activity鐨刢overImage瀛楁 + */ + @SchemaMapping(typeName = "Activity", field = "coverImage") + public MediaResponse coverImage(ActivityResponse activity) { + List<Media> mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( + MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); + + // 鏌ユ壘绗竴涓浘鐗囩被鍨嬬殑濯掍綋浣滀负灏侀潰鍥� + return mediaList.stream() + .filter(media -> media.getMediaType() != null && media.getMediaType() == 1) // 1琛ㄧず鍥剧墖 + .findFirst() + .map(this::convertToMediaResponse) + .orElse(null); + } + + /** + * 瑙f瀽Activity鐨刬mages瀛楁 + */ + @SchemaMapping(typeName = "Activity", field = "images") + public List<MediaResponse> images(ActivityResponse activity) { + List<Media> mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( + MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); + + // 杩斿洖鎵�鏈夊浘鐗囩被鍨嬬殑濯掍綋 + return mediaList.stream() + .filter(media -> media.getMediaType() != null && media.getMediaType() == 1) // 1琛ㄧず鍥剧墖 + .map(this::convertToMediaResponse) + .collect(Collectors.toList()); + } + + /** + * 瑙f瀽Activity鐨剉ideos瀛楁 + */ + @SchemaMapping(typeName = "Activity", field = "videos") + public List<MediaResponse> videos(ActivityResponse activity) { + List<Media> mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( + MediaTargetType.ACTIVITY.getValue(), activity.getId(), 1); + + // 杩斿洖鎵�鏈夎棰戠被鍨嬬殑濯掍綋 + return mediaList.stream() + .filter(media -> media.getMediaType() != null && media.getMediaType() == 2) // 2琛ㄧず瑙嗛 + .map(this::convertToMediaResponse) + .collect(Collectors.toList()); + } + + /** + * 灏哅edia瀹炰綋杞崲涓篗ediaResponse + */ + private MediaResponse convertToMediaResponse(Media media) { + MediaResponse response = new MediaResponse(); + response.setId(media.getId()); + response.setName(media.getName()); + response.setPath(media.getPath()); + response.setFileSize(media.getFileSize()); + response.setFileExt(media.getFileExt()); + response.setMediaType(media.getMediaType()); + response.setTargetType(media.getTargetType()); + response.setTargetId(media.getTargetId()); + response.setThumbPath(media.getThumbPath()); + response.setDuration(media.getDuration()); + response.setDescription(media.getDescription()); + + // 璁剧疆瀹屾暣URL + if (mediaBaseUrl != null && !mediaBaseUrl.isEmpty() && media.getPath() != null) { + String base = mediaBaseUrl.endsWith("/") ? mediaBaseUrl.substring(0, mediaBaseUrl.length() - 1) : mediaBaseUrl; + String path = media.getPath().startsWith("/") ? media.getPath() : ("/" + media.getPath()); + response.setFullUrl(base + path); + } + + // 璁剧疆缂╃暐鍥惧畬鏁碪RL + if (mediaBaseUrl != null && !mediaBaseUrl.isEmpty() && media.getThumbPath() != null) { + String base = mediaBaseUrl.endsWith("/") ? mediaBaseUrl.substring(0, mediaBaseUrl.length() - 1) : mediaBaseUrl; + String thumbPath = media.getThumbPath().startsWith("/") ? media.getThumbPath() : ("/" + media.getThumbPath()); + response.setFullThumbUrl(base + thumbPath); + } + + return response; + } } \ No newline at end of file -- Gitblit v1.8.0