From c4a9cad1c50e89365e2a58b50e259af642ed3b8c Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期二, 07 十月 2025 16:12:20 +0800 Subject: [PATCH] feat(review): 调整评审详情展示顺序与样式,描述支持多行,项目信息列宽40/60 fix(auth): 登录页与首页循环跳转保护;api.ts 在登录页不再重定向;401分支在登录页不跳转 fix(router): /login 放行策略优化,避免死循环;评审列表跳转到 /project-review/:id/detail fix(frontend): 补齐 utils/appConfig.ts,避免启动白屏 fix(review): 详情页提交评分缺少stageId时回退使用项目详情的stageId feat(backend): ActivityPlayerDetailResponse.playerInfo 补充 avatarUrl/avatar,服务组装时填充用户头像 chore(dev): 启动脚本注入本地JWT密钥,重启前后端 --- backend/src/main/java/com/rongyichuang/activity/resolver/ActivityResolver.java | 121 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 114 insertions(+), 7 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 21e6266..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); } /** @@ -37,19 +51,27 @@ } /** - * 鑾峰彇鎵�鏈夋瘮璧涳紙鐢ㄤ簬涓嬫媺閫夋嫨锛� + * 鑾峰彇鎵�鏈夋瘮璧涘拰闃舵锛堢敤浜庝笅鎷夐�夋嫨锛� */ @QueryMapping public List<ActivityResponse> allActivities() { - return activityService.findAllCompetitions(); + return activityService.findAllActivitiesForSelection(); + } + + /** + * 鑾峰彇鎵�鏈夋瘮璧涢樁娈碉紙鐢ㄤ簬璇勫椤甸潰涓嬫媺閫夋嫨锛� + */ + @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