user module API & resource module API
GET /user/thread
POST /resource/version
GET /resource/search
GET /resource/info
GET /resource/hot
GET /resource/hot/slide
GET /resource/hot-trend
PUT /resource/info
Change-Id: I39c94b06a1d69967b8e235a67a0133c8095abb38
diff --git a/src/main/java/com/g9/g9backend/controller/ResourceController.java b/src/main/java/com/g9/g9backend/controller/ResourceController.java
index c9a573c..f8d7723 100644
--- a/src/main/java/com/g9/g9backend/controller/ResourceController.java
+++ b/src/main/java/com/g9/g9backend/controller/ResourceController.java
@@ -2,7 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.g9.g9backend.mapper.UserPurchaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.g9.g9backend.pojo.*;
import com.g9.g9backend.pojo.DTO.*;
import com.g9.g9backend.service.*;
@@ -12,7 +13,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import java.util.Date;
+import java.util.*;
/**
@@ -44,7 +45,17 @@
private final NotificationService notificationService;
- public ResourceController(ResourceService resourceService, GameplayService gameplayService, RewardService rewardService, UserUploadService userUploadService, CommunityService communityService, UserService userService, UserPurchaseMapper userPurchaseMapper, UserPurchaseService userPurchaseService, UserLikeService userLikeService, UserCollectionService userCollectionService, NotificationService notificationService) {
+ private final ResourceVersionService resourceVersionService;
+
+ private final SearchHistoryService searchHistoryService;
+
+ private final GameVersionService gameVersionService;
+
+ private final TorrentRecordService torrentRecordService;
+
+ private final HotTrendService hotTrendService;
+
+ public ResourceController(ResourceService resourceService, GameplayService gameplayService, RewardService rewardService, UserUploadService userUploadService, CommunityService communityService, UserService userService, UserPurchaseService userPurchaseService, UserLikeService userLikeService, UserCollectionService userCollectionService, NotificationService notificationService, ResourceVersionService resourceVersionService, SearchHistoryService searchHistoryService, GameVersionService gameVersionService, TorrentRecordService torrentRecordService, HotTrendService hotTrendService) {
this.resourceService = resourceService;
this.gameplayService = gameplayService;
this.rewardService = rewardService;
@@ -55,6 +66,11 @@
this.userLikeService = userLikeService;
this.userCollectionService = userCollectionService;
this.notificationService = notificationService;
+ this.resourceVersionService = resourceVersionService;
+ this.searchHistoryService = searchHistoryService;
+ this.gameVersionService = gameVersionService;
+ this.torrentRecordService = torrentRecordService;
+ this.hotTrendService = hotTrendService;
}
private final Logger logger = LoggerFactory.getLogger(ResourceController.class);
@@ -99,6 +115,18 @@
}
/**
+ * 上传版本
+ *
+ * @param resourceVersion 上传版本信息
+ * @return 上传版本结果
+ */
+ @PostMapping("/version")
+ public ResponseEntity<String> uploadResourceVersion(@RequestBody ResourceVersion resourceVersion) {
+ resourceVersionService.save(resourceVersion);
+ return ResponseEntity.ok("");
+ }
+
+ /**
* 购买资源
*
* @param userResourceDTO 购买资源信息
@@ -284,4 +312,254 @@
userCollectionService.remove(userCollectionQuery);
return ResponseEntity.noContent().build();
}
+
+ /**
+ * 搜索资源
+ *
+ * @param userId 用户id
+ * @param searchValue 输入(模糊搜索)
+ * @param classify 类型名称
+ * @param gameplayList 主要玩法列表
+ * @param gameVersionList 版本列表
+ * @param pageNumber 第几页
+ * @param rows 行数
+ * @return 搜索资源结果
+ */
+ @GetMapping("/search")
+ public ResponseEntity<GetResourcePageDTO> getResourceSearch(@RequestParam int userId, @RequestParam String searchValue, @RequestParam String classify, @RequestParam String[] gameplayList, @RequestParam String[] gameVersionList, @RequestParam int pageNumber, @RequestParam int rows) {
+ IPage<Resource> page = new Page<>(pageNumber, rows);
+ QueryWrapper<Resource> resourceWrapper = new QueryWrapper<>();
+ // 搜索名称字段不为空时,根据搜索名称进行模糊匹配,并将该次搜索存到搜索历史表
+ if (!Objects.equals(searchValue, "")) {
+ resourceWrapper.like("resource_name", searchValue);
+ SearchHistory searchHistory = new SearchHistory();
+ searchHistory.setSearchContent(searchValue);
+ searchHistory.setUserId(userId);
+ searchHistoryService.save(searchHistory);
+ }
+ // 分类字段不为空时,根据类别筛选
+ if (!Objects.equals(classify, "")) {
+ resourceWrapper.eq("classify", classify);
+ }
+
+ // 主要玩法列表不为空时,根据主要玩法列表筛选(用户传入一个玩法列表,需要去 gameplay 表中查询该资源的所有玩法列表,只有当用户传入的玩法列表的每个值都在资源实际有的玩法列表中时,该资源才符合条件)
+ if (gameplayList.length > 0) {
+ // 该子查询统计了用户传入的玩法列表中有多少玩法是在资源的实际玩法列表中有的
+ String subQuery = "SELECT COUNT(*) " +
+ "FROM gameplay gp " +
+ "WHERE gp.resource_id = resource.resource_id " +
+ "AND gp.gameplay_name IN (" +
+ String.join(",", Arrays.stream(gameplayList).map(name -> "'" + name + "'").toArray(String[]::new)) + ")";
+ // 只有当子查询返回的数量等于用户传入的玩法列表长度时,说明用户传入的玩法列表完全被包含在资源的玩法列表中
+ resourceWrapper.apply("(" + subQuery + ") = " + gameplayList.length);
+ }
+
+ // 游戏版本列表不为空时,根据游戏版本列表筛选
+ if (gameVersionList.length > 0) {
+ // 拼接游戏版本列表的 IN 子句
+ String gameVersionInClause = String.join(",", Arrays.stream(gameVersionList)
+ .map(v -> "'" + v + "'")
+ .toArray(String[]::new));
+
+ // 修改 HAVING 条件逻辑,只检查输入版本列表是否是实际版本列表的子集
+ String resourceCondition = "EXISTS ("
+ + "SELECT 1 "
+ + "FROM resource_version rv "
+ + "JOIN game_version gv ON gv.resource_version_id = rv.resource_version_id "
+ + "WHERE rv.resource_id = resource.resource_id "
+ + "GROUP BY rv.resource_id "
+ + "HAVING COUNT(DISTINCT CASE WHEN gv.game_version_name IN (" + gameVersionInClause + ") THEN gv.game_version_name END) = " + gameVersionList.length
+ + ")";
+
+ // 应用条件
+ resourceWrapper.apply(resourceCondition);
+ }
+
+ IPage<Resource> resourcePage = resourceService.page(page, resourceWrapper);
+ List<Resource> resourceList = resourcePage.getRecords();
+ long total = resourcePage.getTotal();
+ long pages = resourcePage.getPages();
+ long current = resourcePage.getCurrent();
+ long size = resourcePage.getSize();
+
+ List<List<Gameplay>> gameplayLists = new ArrayList<>();
+ for (Resource resource : resourceList) {
+ // 对于每个资源,获取游戏玩法列表
+ QueryWrapper<Gameplay> gameplayQuery = new QueryWrapper<>();
+ gameplayQuery.eq("resource_id", resource.getResourceId());
+ List<Gameplay> allGameplayList = gameplayService.list(gameplayQuery);
+ gameplayLists.add(allGameplayList);
+ }
+
+ GetResourcePageDTO getResourceSearchDTO = new GetResourcePageDTO(resourceList, gameplayLists, total, pages, current, size);
+ return ResponseEntity.ok(getResourceSearchDTO);
+ }
+
+ /**
+ * 获取资源信息
+ *
+ * @param resourceId 资源id
+ * @param userId 用户id
+ * @return 获取资源信息结果
+ */
+ @GetMapping("/info")
+ public ResponseEntity<GetResourceInfoDTO> getResourceInfo(@RequestParam int resourceId, @RequestParam int userId) {
+ // 获取Resource表信息
+ Resource resource = resourceService.getById(resourceId);
+
+ // 获取Gameplay列表
+ List<Gameplay> gameplayList = gameplayService.list(new QueryWrapper<Gameplay>().eq("resource_id", resourceId));
+
+ // 获取ResourceVersion列表
+ List<ResourceVersion> resourceVersionList = resourceVersionService.list(new QueryWrapper<ResourceVersion>().eq("resource_id", resourceId));
+
+ // 获取GameVersion二维列表
+ List<List<GameVersion>> gameVersionLists = new ArrayList<>();
+ for (ResourceVersion resourceVersion : resourceVersionList) {
+ List<GameVersion> gameVersionList = gameVersionService.list(new QueryWrapper<GameVersion>().eq("resource_version_id", resourceVersion.getResourceVersionId()));
+ gameVersionLists.add(gameVersionList);
+ }
+
+ // 获取TorrentRecord二维列表
+ List<List<TorrentRecord>> torrentRecordLists = new ArrayList<>();
+ for (ResourceVersion resourceVersion : resourceVersionList) {
+ List<TorrentRecord> torrentRecordList = torrentRecordService.list(new QueryWrapper<TorrentRecord>().eq("resource_version_id", resourceVersion.getResourceVersionId()));
+ torrentRecordLists.add(torrentRecordList);
+ }
+
+ // 获取用户是否收藏
+ QueryWrapper<UserCollection> userCollectionQuery = new QueryWrapper<>();
+ userCollectionQuery.eq("user_id", userId).eq("resource_id", resourceId);
+ boolean isCollect = userCollectionService.getOne(userCollectionQuery) != null;
+
+ // 获取用户是否点赞
+ QueryWrapper<UserLike> userLikeQuery = new QueryWrapper<>();
+ userLikeQuery.eq("user_id", userId).eq("resource_id", resourceId);
+ boolean isLike = userLikeService.getOne(userLikeQuery) != null;
+
+ // 获取用户是否购买
+ QueryWrapper<UserPurchase> userPurchaseQuery = new QueryWrapper<>();
+ userPurchaseQuery.eq("user_id", userId).eq("resource_id", resourceId);
+ boolean isPurchase = userPurchaseService.getOne(userPurchaseQuery) != null;
+
+ // 获取用户是否上传
+ QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+ userUploadQuery.eq("user_id", userId).eq("resource_id", resourceId);
+ boolean isUpload = userUploadService.getOne(userUploadQuery) != null;
+
+ // 获取上传者ID
+ QueryWrapper<UserUpload> findUploaderQuery = new QueryWrapper<>();
+ findUploaderQuery.eq("resource_id", resourceId);
+ int uploaderId = userUploadService.getOne(findUploaderQuery).getUserId();
+
+ GetResourceInfoDTO getResourceInfoDTO = new GetResourceInfoDTO(resource, gameplayList, resourceVersionList, gameVersionLists, torrentRecordLists, isCollect, isLike, isPurchase, isUpload, uploaderId);
+ return ResponseEntity.ok(getResourceInfoDTO);
+ }
+
+ /**
+ * 获取热门资源
+ *
+ * @param classify 资源分类
+ * @param pageNumber 页数
+ * @param rows 行数
+ * @return 获取热门资源结果
+ */
+ @GetMapping("/hot")
+ public ResponseEntity<GetResourcePageDTO> getHotResource(@RequestParam String classify, @RequestParam int pageNumber, @RequestParam int rows) {
+ IPage<Resource> page = new Page<>(pageNumber, rows);
+ QueryWrapper<Resource> resourceQuery = new QueryWrapper<>();
+ resourceQuery.eq("classify", classify);
+ // 动态计算热度并按降序排序
+ resourceQuery.orderByDesc("(downloads * 0.25 + likes * 0.25 + collections * 0.25 + comments * 0.25)");
+ IPage<Resource> resourcePage = resourceService.page(page, resourceQuery);
+ List<Resource> resourceList = resourcePage.getRecords();
+ long total = resourcePage.getTotal();
+ long pages = resourcePage.getPages();
+ long current = resourcePage.getCurrent();
+ long size = resourcePage.getSize();
+
+ List<List<Gameplay>> gameplayLists = new ArrayList<>();
+ for (Resource resource : resourceList) {
+ // 对于每个资源,获取游戏玩法列表
+ QueryWrapper<Gameplay> gameplayQuery = new QueryWrapper<>();
+ gameplayQuery.eq("resource_id", resource.getResourceId());
+ List<Gameplay> allGameplayList = gameplayService.list(gameplayQuery);
+ gameplayLists.add(allGameplayList);
+ }
+
+ GetResourcePageDTO getResourcePageDTO = new GetResourcePageDTO(resourceList, gameplayLists, total, pages, current, size);
+ return ResponseEntity.ok(getResourcePageDTO);
+ }
+
+ /**
+ * 获取热门资源幻灯片数据
+ *
+ * @return 获取用户收藏结果
+ */
+ @GetMapping("/hot/slide")
+ public ResponseEntity<GetResourceHotSlideDTO> getResourceHotSlide() {
+ QueryWrapper<Resource> resourceQuery = new QueryWrapper<>();
+ // 动态计算热度并按降序排序
+ resourceQuery.orderByDesc("(downloads * 0.25 + likes * 0.25 + collections * 0.25 + comments * 0.25)");
+ // 限制返回3条记录
+ resourceQuery.last("LIMIT 3");
+ List<Resource> resourceList = resourceService.list(resourceQuery);
+
+ GetResourceHotSlideDTO getResourceHotSlideDTO = new GetResourceHotSlideDTO(resourceList);
+ return ResponseEntity.ok(getResourceHotSlideDTO);
+ }
+
+ /**
+ * 获取热门资源趋势图
+ *
+ * @return 获取热门资源趋势图结果
+ */
+ @GetMapping("/hot-trend")
+ public ResponseEntity<GetResourceHotTrendDTO> getResourceHotTrend() {
+ List<HotTrend> hotTrendList = hotTrendService.list();
+ GetResourceHotTrendDTO getResourceHotTrendDTO = new GetResourceHotTrendDTO(hotTrendList);
+ return ResponseEntity.ok(getResourceHotTrendDTO);
+ }
+
+ /**
+ * 修改资源信息
+ *
+ * @param putResourceInfoDTO 要修改的资源信息
+ * @return 修改资源信息结果
+ */
+ @PutMapping("/info")
+ public ResponseEntity<String> putResourceInfo(@RequestBody PutResourceInfoDTO putResourceInfoDTO) {
+ // 检查资源名是否重复
+ QueryWrapper<Resource> resourceQuery = new QueryWrapper<>();
+ resourceQuery.ne("resource_id", putResourceInfoDTO.getResourceId()).eq("resource_name", putResourceInfoDTO.getResourceName());
+ Resource resource = resourceService.getOne(resourceQuery);
+
+ if (resource != null) {
+ // 资源名重复
+ logger.warn("Modification attempt failed. Resource name already exists: {}", putResourceInfoDTO.getResourceName());
+ return ResponseEntity.status(411).body("");
+ }
+
+ UpdateWrapper<Resource> resourceUpdate = new UpdateWrapper<>();
+ resourceUpdate.eq("resource_id", putResourceInfoDTO.getResourceId())
+ .set("resource_name", putResourceInfoDTO.getResourceName())
+ .set("resource_picture", putResourceInfoDTO.getResourcePicture())
+ .set("resource_summary", putResourceInfoDTO.getResourceSummary())
+ .set("resource_detail", putResourceInfoDTO.getResourceDetail())
+ .set("price", putResourceInfoDTO.getPrice());
+ resourceService.update(resourceUpdate);
+
+ QueryWrapper<Gameplay> gameplayQuery = new QueryWrapper<>();
+ gameplayQuery.eq("resource_id", putResourceInfoDTO.getResourceId());
+ gameplayService.remove(gameplayQuery);
+
+ for (int i = 0; i < putResourceInfoDTO.getGameplayList().length; i++) {
+ Gameplay gameplay = new Gameplay();
+ gameplay.setGameplayName(putResourceInfoDTO.getGameplayList()[i]);
+ gameplay.setResourceId(putResourceInfoDTO.getResourceId());
+ gameplayService.save(gameplay);
+ }
+
+ return ResponseEntity.ok("");
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/controller/UserController.java b/src/main/java/com/g9/g9backend/controller/UserController.java
index 9315e8e..7daf5f3 100644
--- a/src/main/java/com/g9/g9backend/controller/UserController.java
+++ b/src/main/java/com/g9/g9backend/controller/UserController.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.g9.g9backend.pojo.*;
import com.g9.g9backend.pojo.DTO.*;
+import com.g9.g9backend.pojo.Thread;
import com.g9.g9backend.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +44,9 @@
private final ResourceService resourceService;
- public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService, RewardService rewardService, UserCollectionService userCollectionService, UserUploadService userUploadService, UserPurchaseService userPurchaseService, ResourceService resourceService) {
+ private final ThreadService threadService;
+
+ public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService, RewardService rewardService, UserCollectionService userCollectionService, UserUploadService userUploadService, UserPurchaseService userPurchaseService, ResourceService resourceService, ThreadService threadService) {
this.userService = userService;
this.invitationService = invitationService;
this.subscriptionService = subscriptionService;
@@ -53,6 +56,7 @@
this.userUploadService = userUploadService;
this.userPurchaseService = userPurchaseService;
this.resourceService = resourceService;
+ this.threadService = threadService;
}
@@ -397,6 +401,30 @@
}
/**
+ * 获取用户发布贴子
+ *
+ * @param userId 用户id
+ * @param pageNumber 页数
+ * @param rows 行数
+ * @return 获取用户发布贴子结果
+ */
+ @GetMapping("/thread")
+ public ResponseEntity<GetUserThreadListDTO> getUserThread(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+ IPage<Thread> page = new Page<>(pageNumber, rows);
+ QueryWrapper<Thread> threadQuery = new QueryWrapper<>();
+ threadQuery.eq("user_id", userId);
+ IPage<Thread> threadPage = threadService.page(page, threadQuery);
+ List<Thread> threadList = threadPage.getRecords();
+ long total = threadPage.getTotal();
+ long pages = threadPage.getPages();
+ long current = threadPage.getCurrent();
+ long size = threadPage.getSize();
+
+ GetUserThreadListDTO getUserThreadListDTO = new GetUserThreadListDTO(threadList, total, pages, current, size);
+ return ResponseEntity.ok(getUserThreadListDTO);
+ }
+
+ /**
* 获取用户数据
*
* @param userId 用户id
diff --git a/src/main/java/com/g9/g9backend/mapper/GameVersionMapper.java b/src/main/java/com/g9/g9backend/mapper/GameVersionMapper.java
new file mode 100644
index 0000000..f3546ee
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/mapper/GameVersionMapper.java
@@ -0,0 +1,9 @@
+package com.g9.g9backend.mapper;
+
+import com.g9.g9backend.pojo.GameVersion;
+import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface GameVersionMapper extends MppBaseMapper<GameVersion> {
+}
diff --git a/src/main/java/com/g9/g9backend/mapper/HotTrendMapper.java b/src/main/java/com/g9/g9backend/mapper/HotTrendMapper.java
new file mode 100644
index 0000000..fdcddd0
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/mapper/HotTrendMapper.java
@@ -0,0 +1,9 @@
+package com.g9.g9backend.mapper;
+
+import com.g9.g9backend.pojo.HotTrend;
+import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface HotTrendMapper extends MppBaseMapper<HotTrend> {
+}
diff --git a/src/main/java/com/g9/g9backend/mapper/VersionMapper.java b/src/main/java/com/g9/g9backend/mapper/VersionMapper.java
deleted file mode 100644
index fbf2b83..0000000
--- a/src/main/java/com/g9/g9backend/mapper/VersionMapper.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.g9.g9backend.mapper;
-
-import com.g9.g9backend.pojo.Version;
-import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface VersionMapper extends MppBaseMapper<Version> {
-}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotSlideDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotSlideDTO.java
new file mode 100644
index 0000000..42ff689
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotSlideDTO.java
@@ -0,0 +1,38 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class GetResourceHotSlideDTO {
+
+ private List<ResourceSlideInfo> records;
+
+ public GetResourceHotSlideDTO(List<Resource> resourceList) {
+ List<ResourceSlideInfo> records = new ArrayList<>();
+ for (Resource resource : resourceList) {
+ ResourceSlideInfo resourceSlideInfo = new ResourceSlideInfo();
+ resourceSlideInfo.setResourceId(resource.getResourceId());
+ resourceSlideInfo.setResourceName(resource.getResourceName());
+ resourceSlideInfo.setResourcePicture(resource.getResourcePicture());
+ records.add(resourceSlideInfo);
+ }
+ this.records = records;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class ResourceSlideInfo {
+ private int resourceId;
+
+ private String resourceName;
+
+ private String resourcePicture;
+ }
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotTrendDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotTrendDTO.java
new file mode 100644
index 0000000..4ab590d
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceHotTrendDTO.java
@@ -0,0 +1,101 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.HotTrend;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.*;
+
+@Data
+public class GetResourceHotTrendDTO {
+
+ private List<HotRecord> records;
+
+ public GetResourceHotTrendDTO(List<HotTrend> hotTrendList) {
+ List<HotRecord> records = new ArrayList<>();
+
+ HotRecord resourcePackHotRecord = new HotRecord();
+ resourcePackHotRecord.setClassify("resourcePack");
+ List<HotInfo> resourceHotInfoList = new ArrayList<>();
+
+ HotRecord modHotRecord = new HotRecord();
+ modHotRecord.setClassify("mod");
+ List<HotInfo> modHotInfoList = new ArrayList<>();
+
+ HotRecord modPackHotRecord = new HotRecord();
+ modPackHotRecord.setClassify("modPack");
+ List<HotInfo> modPackHotInfoList = new ArrayList<>();
+
+ HotRecord mapHotRecord = new HotRecord();
+ mapHotRecord.setClassify("map");
+ List<HotInfo> mapHotInfoList = new ArrayList<>();
+
+ for (HotTrend hotTrend : hotTrendList) {
+ switch (hotTrend.getClassify()) {
+ case "resourcePack":
+ HotInfo resourcePackHotInfo = new HotInfo();
+ resourcePackHotInfo.setHot(hotTrend.getHot());
+ resourcePackHotInfo.setTime(hotTrend.getTime());
+ resourceHotInfoList.add(resourcePackHotInfo);
+ break;
+ case "mod":
+ HotInfo modHotInfo = new HotInfo();
+ modHotInfo.setHot(hotTrend.getHot());
+ modHotInfo.setTime(hotTrend.getTime());
+ modHotInfoList.add(modHotInfo);
+ break;
+ case "modPack":
+ HotInfo modPackHotInfo = new HotInfo();
+ modPackHotInfo.setHot(hotTrend.getHot());
+ modPackHotInfo.setTime(hotTrend.getTime());
+ modPackHotInfoList.add(modPackHotInfo);
+ break;
+ case "map":
+ HotInfo mapHotInfo = new HotInfo();
+ mapHotInfo.setHot(hotTrend.getHot());
+ mapHotInfo.setTime(hotTrend.getTime());
+ mapHotInfoList.add(mapHotInfo);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // 按照 Time 从早到晚排序
+ resourceHotInfoList.sort(Comparator.comparing(HotInfo::getTime));
+ modHotInfoList.sort(Comparator.comparing(HotInfo::getTime));
+ modPackHotInfoList.sort(Comparator.comparing(HotInfo::getTime));
+ mapHotInfoList.sort(Comparator.comparing(HotInfo::getTime));
+
+ resourcePackHotRecord.setHotInfoList(resourceHotInfoList);
+ modHotRecord.setHotInfoList(modHotInfoList);
+ modPackHotRecord.setHotInfoList(modPackHotInfoList);
+ mapHotRecord.setHotInfoList(mapHotInfoList);
+
+ records.add(resourcePackHotRecord);
+ records.add(modHotRecord);
+ records.add(resourcePackHotRecord);
+ records.add(mapHotRecord);
+
+ this.records = records;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class HotRecord {
+ private String classify;
+
+ private List<HotInfo> hotInfoList;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class HotInfo {
+ private float hot;
+
+ private Date time;
+ }
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java
index 770ceb8..fa8a5ea 100644
--- a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java
@@ -1,14 +1,158 @@
package com.g9.g9backend.pojo.DTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.g9.g9backend.pojo.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
@Data
-@AllArgsConstructor
-@NoArgsConstructor
public class GetResourceInfoDTO {
- // todo:待完善
- private int id;
+ private int resourceId;
+
+ private String resourceName;
+
+ private String resourcePicture;
+
+ private String resourceSummary;
+
+ private String resourceDetail;
+
+ private Date uploadTime;
+
+ private Date lastUpdateTime;
+
+ private int price;
+
+ private int downloads;
+
+ private int likes;
+
+ private int collections;
+
+ private int comments;
+
+ private String classify;
+
+ private float hot;
+
+ private String[] gameplayList;
+
+ private List<ResourceVersionInfo> resourceVersionList;
+
+ // isCollect在序列化成JSON 时,字段会被映射为collect,所以这里显式指定 JSON 序列化时的字段名
+ @JsonProperty("isCollect")
+ private boolean isCollect;
+
+ @JsonProperty("isLike")
+ private boolean isLike;
+
+ @JsonProperty("isPurchase")
+ private boolean isPurchase;
+
+ @JsonProperty("isUpload")
+ private boolean isUpload;
+
+ private int uploaderId;
+
+ public GetResourceInfoDTO(Resource resource, List<Gameplay> gameplayList, List<ResourceVersion> resourceVersionList, List<List<GameVersion>> gameVersionLists, List<List<TorrentRecord>> torrentRecordLists, boolean isCollect, boolean isLike, boolean isPurchase, boolean isUpload, int uploaderId) {
+ // 创建资源基本信息
+ this.resourceId = resource.getResourceId();
+ this.resourceName = resource.getResourceName();
+ this.resourcePicture = resource.getResourcePicture();
+ this.resourceSummary = resource.getResourceSummary();
+ this.resourceDetail = resource.getResourceDetail();
+ this.uploadTime = resource.getUploadTime();
+ this.lastUpdateTime = resource.getLastUpdateTime();
+ this.price = resource.getPrice();
+ this.downloads = resource.getDownloads();
+ this.likes = resource.getLikes();
+ this.collections = resource.getCollections();
+ this.comments = resource.getComments();
+ this.classify = resource.getClassify();
+ this.hot = (float) (0.25 * resource.getDownloads() + 0.25 * resource.getLikes() + 0.25 * resource.getCollections() + 0.25 * resource.getComments());
+ this.isCollect = isCollect;
+ this.isLike = isLike;
+ this.isPurchase = isPurchase;
+ this.isUpload = isUpload;
+ this.uploaderId = uploaderId;
+
+ // 创建玩法列表
+ String[] gameplays = new String[gameplayList.size()];
+ // 处理对应的 gameplay 列表
+ for (int i = 0; i < gameplayList.size(); i++) {
+ Gameplay gameplay = gameplayList.get(i);
+ gameplays[i] = gameplay.getGameplayName();
+ }
+ this.gameplayList = gameplays;
+
+ // 创建资源版本列表
+ List<ResourceVersionInfo> resourceVersions = new ArrayList<>();
+ for (int i = 0; i < resourceVersionList.size(); i++) {
+ ResourceVersionInfo resourceVersionInfo = new ResourceVersionInfo();
+ ResourceVersion resourceVersion = resourceVersionList.get(i);
+ List<GameVersion> gameVersions = gameVersionLists.get(i);
+ List<TorrentRecord> torrentRecords = torrentRecordLists.get(i);
+
+ resourceVersionInfo.setResourceVersionId(resourceVersion.getResourceVersionId());
+ resourceVersionInfo.setResourceVersionName(resourceVersion.getResourceVersionName());
+ String[] compatibleVersions = new String[gameVersions.size()];
+ for (int j = 0; j < gameVersions.size(); j++) {
+ GameVersion gameVersion = gameVersions.get(j);
+ compatibleVersions[j] = gameVersion.getGameVersionName();
+ }
+ resourceVersionInfo.setCompatibleVersions(compatibleVersions);
+ List<TorrentRecordInfo> torrentRecordInfos = new ArrayList<>();
+ for (TorrentRecord torrentRecord : torrentRecords) {
+ TorrentRecordInfo torrentRecordInfo = new TorrentRecordInfo();
+ torrentRecordInfo.setTorrentRecordId(torrentRecord.getTorrentRecordId());
+ torrentRecordInfo.setTorrentUrl(torrentRecord.getTorrentUrl());
+ torrentRecordInfo.setInfoHash(torrentRecord.getInfoHash());
+ torrentRecordInfo.setUploadTime(torrentRecord.getUploadTime());
+ torrentRecordInfo.setUploaderUserId(torrentRecord.getUploaderUserId());
+
+ torrentRecordInfos.add(torrentRecordInfo);
+ }
+ resourceVersionInfo.setTorrentList(torrentRecordInfos);
+ resourceVersionInfo.setSeeds(resourceVersion.getSeeds());
+
+ resourceVersions.add(resourceVersionInfo);
+ }
+ this.resourceVersionList = resourceVersions;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class ResourceVersionInfo {
+ private int resourceVersionId;
+
+ private String resourceVersionName;
+
+ private String[] compatibleVersions;
+
+ private List<TorrentRecordInfo> torrentList;
+
+ private int seeds;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class TorrentRecordInfo {
+ private int torrentRecordId;
+
+ private String torrentUrl;
+
+ private String infoHash;
+
+ private Date uploadTime;
+
+ private int uploaderUserId;
+ }
}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourcePageDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourcePageDTO.java
new file mode 100644
index 0000000..d85ed06
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourcePageDTO.java
@@ -0,0 +1,77 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Gameplay;
+import com.g9.g9backend.pojo.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class GetResourcePageDTO {
+
+ private List<ResourceInfo> records = new ArrayList<>();
+
+ private long total;
+
+ private long pages;
+
+ private long current;
+
+ private long size;
+
+ public GetResourcePageDTO (List<Resource> resourceList, List<List<Gameplay>> gameplayLists,long total, long pages, long current, long size) {
+ List<ResourceInfo> recordList = new ArrayList<>();
+ // 遍历 resourceList 和 gameplayLists
+ for (int i = 0; i < resourceList.size(); i++) {
+ Resource resource = resourceList.get(i);
+ List<Gameplay> allGameplayList = gameplayLists.get(i); // 同步访问 gameplayLists 的对应元素
+
+ // 创建 ResourceInfo 对象
+ ResourceInfo resourceInfo = new ResourceInfo();
+ resourceInfo.setResourceId(resource.getResourceId());
+ resourceInfo.setResourceName(resource.getResourceName());
+ resourceInfo.setResourcePicture(resource.getResourcePicture());
+ resourceInfo.setResourceSummary(resource.getResourceSummary());
+ resourceInfo.setLastUpdateTime(resource.getLastUpdateTime());
+ // 加权求和得到热度
+ resourceInfo.setHot((float) (0.25 * resource.getDownloads() + 0.25 * resource.getLikes() + 0.25 * resource.getCollections() + 0.25 * resource.getComments()));
+ // 创建玩法列表
+ String[] gameplayList = new String[allGameplayList.size()];
+ // 处理对应的 gameplay 列表
+ for (int j = 0; j < allGameplayList.size(); j++) {
+ Gameplay gameplay = allGameplayList.get(j);
+ gameplayList[j] = gameplay.getGameplayName();
+ }
+ resourceInfo.setGameplayList(gameplayList);
+ recordList.add(resourceInfo);
+ }
+ this.records = recordList;
+ this.total = total;
+ this.pages = pages;
+ this.current = current;
+ this.size = size;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class ResourceInfo {
+ private int resourceId;
+
+ private String resourceName;
+
+ private String resourcePicture;
+
+ private String resourceSummary;
+
+ private Date lastUpdateTime;
+
+ private float hot;
+
+ private String[] gameplayList;
+ }
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java
deleted file mode 100644
index 2348a8f..0000000
--- a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.g9.g9backend.pojo.DTO;
-
-import com.g9.g9backend.pojo.Resource;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class GetResourceSearchDTO {
-
- // Todo: 待完善
- private List<Resource> records;
-
- private long total;
-
- private long pages;
-
- private long current;
-
- private long size;
-
-}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetUserThreadListDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserThreadListDTO.java
new file mode 100644
index 0000000..51cfdd9
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserThreadListDTO.java
@@ -0,0 +1,23 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Thread;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class GetUserThreadListDTO {
+
+ private List<Thread> records;
+
+ private long total;
+
+ private long pages;
+
+ private long current;
+
+ private long size;
+
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/PutResourceInfoDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/PutResourceInfoDTO.java
new file mode 100644
index 0000000..1a9be55
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/PutResourceInfoDTO.java
@@ -0,0 +1,25 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PutResourceInfoDTO {
+
+ private int resourceId;
+
+ private String resourceName;
+
+ private String resourcePicture;
+
+ private String resourceSummary;
+
+ private String resourceDetail;
+
+ private int price;
+
+ private String[] gameplayList;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/Version.java b/src/main/java/com/g9/g9backend/pojo/GameVersion.java
similarity index 83%
rename from src/main/java/com/g9/g9backend/pojo/Version.java
rename to src/main/java/com/g9/g9backend/pojo/GameVersion.java
index 180d332..68e83ea 100644
--- a/src/main/java/com/g9/g9backend/pojo/Version.java
+++ b/src/main/java/com/g9/g9backend/pojo/GameVersion.java
@@ -11,10 +11,10 @@
@Data
@AllArgsConstructor
@NoArgsConstructor
-public class Version {
+public class GameVersion {
@MppMultiId
- private String versionName;
+ private String gameVersionName;
@MppMultiId
private int resourceVersionId;
diff --git a/src/main/java/com/g9/g9backend/pojo/HotTrend.java b/src/main/java/com/g9/g9backend/pojo/HotTrend.java
new file mode 100644
index 0000000..817b518
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/HotTrend.java
@@ -0,0 +1,29 @@
+package com.g9.g9backend.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * HotTrend 实体类,表示热度趋势的数据模型
+ *
+ * @author hcy
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HotTrend {
+
+ @TableId(type = IdType.AUTO)
+ private int hotTrendId;
+
+ private float hot;
+
+ private Date time; // 若命名为currentTime会发生冲突
+
+ private String classify;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/Resource.java b/src/main/java/com/g9/g9backend/pojo/Resource.java
index a3b17f3..139ec88 100644
--- a/src/main/java/com/g9/g9backend/pojo/Resource.java
+++ b/src/main/java/com/g9/g9backend/pojo/Resource.java
@@ -31,7 +31,7 @@
private Date lastUpdateTime;
- private float price;
+ private int price;
private int downloads;
@@ -41,7 +41,5 @@
private int comments;
- private int seeds;
-
private String classify;
}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java b/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
index 4395a5a..1d177ba 100644
--- a/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
+++ b/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
@@ -20,4 +20,6 @@
private String resourceVersionName;
private int resourceId;
+
+ private int seeds;
}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/pojo/Reward.java b/src/main/java/com/g9/g9backend/pojo/Reward.java
index 5812284..aea9c84 100644
--- a/src/main/java/com/g9/g9backend/pojo/Reward.java
+++ b/src/main/java/com/g9/g9backend/pojo/Reward.java
@@ -25,7 +25,7 @@
private int userId;
- private float price;
+ private int price;
private String rewardDescription;
diff --git a/src/main/java/com/g9/g9backend/pojo/Thread.java b/src/main/java/com/g9/g9backend/pojo/Thread.java
index ddcea67..a69fb82 100644
--- a/src/main/java/com/g9/g9backend/pojo/Thread.java
+++ b/src/main/java/com/g9/g9backend/pojo/Thread.java
@@ -29,8 +29,6 @@
private int likes;
- private boolean isLike;
-
private Date createAt;
private int commentNumber;
diff --git a/src/main/java/com/g9/g9backend/service/GameVersionService.java b/src/main/java/com/g9/g9backend/service/GameVersionService.java
new file mode 100644
index 0000000..0f8aac3
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/service/GameVersionService.java
@@ -0,0 +1,7 @@
+package com.g9.g9backend.service;
+
+import com.g9.g9backend.pojo.GameVersion;
+import com.github.jeffreyning.mybatisplus.service.IMppService;
+
+public interface GameVersionService extends IMppService<GameVersion> {
+}
diff --git a/src/main/java/com/g9/g9backend/service/HotTrendService.java b/src/main/java/com/g9/g9backend/service/HotTrendService.java
new file mode 100644
index 0000000..fbd9aec
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/service/HotTrendService.java
@@ -0,0 +1,7 @@
+package com.g9.g9backend.service;
+
+import com.g9.g9backend.pojo.HotTrend;
+import com.github.jeffreyning.mybatisplus.service.IMppService;
+
+public interface HotTrendService extends IMppService<HotTrend> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/service/VersionService.java b/src/main/java/com/g9/g9backend/service/VersionService.java
deleted file mode 100644
index aff7fc7..0000000
--- a/src/main/java/com/g9/g9backend/service/VersionService.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.g9.g9backend.service;
-
-import com.g9.g9backend.pojo.Version;
-import com.github.jeffreyning.mybatisplus.service.IMppService;
-
-public interface VersionService extends IMppService<Version> {
-}
diff --git a/src/main/java/com/g9/g9backend/service/impl/GameGameVersionServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/GameGameVersionServiceImpl.java
new file mode 100644
index 0000000..78a3867
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/service/impl/GameGameVersionServiceImpl.java
@@ -0,0 +1,11 @@
+package com.g9.g9backend.service.impl;
+
+import com.g9.g9backend.mapper.GameVersionMapper;
+import com.g9.g9backend.pojo.GameVersion;
+import com.g9.g9backend.service.GameVersionService;
+import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class GameGameVersionServiceImpl extends MppServiceImpl<GameVersionMapper, GameVersion> implements GameVersionService {
+}
diff --git a/src/main/java/com/g9/g9backend/service/impl/HotTrendServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/HotTrendServiceImpl.java
new file mode 100644
index 0000000..16c671c
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/service/impl/HotTrendServiceImpl.java
@@ -0,0 +1,11 @@
+package com.g9.g9backend.service.impl;
+
+import com.g9.g9backend.mapper.HotTrendMapper;
+import com.g9.g9backend.pojo.HotTrend;
+import com.g9.g9backend.service.HotTrendService;
+import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HotTrendServiceImpl extends MppServiceImpl<HotTrendMapper, HotTrend> implements HotTrendService {
+}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/service/impl/ResourceVersionServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/ResourceVersionServiceImpl.java
index a0d684b..5df7ad9 100644
--- a/src/main/java/com/g9/g9backend/service/impl/ResourceVersionServiceImpl.java
+++ b/src/main/java/com/g9/g9backend/service/impl/ResourceVersionServiceImpl.java
@@ -4,6 +4,8 @@
import com.g9.g9backend.mapper.ResourceVersionMapper;
import com.g9.g9backend.pojo.ResourceVersion;
import com.g9.g9backend.service.ResourceVersionService;
+import org.springframework.stereotype.Service;
+@Service
public class ResourceVersionServiceImpl extends ServiceImpl<ResourceVersionMapper, ResourceVersion> implements ResourceVersionService {
}
diff --git a/src/main/java/com/g9/g9backend/service/impl/TorrentRecordServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/TorrentRecordServiceImpl.java
index 3739fb0..a783761 100644
--- a/src/main/java/com/g9/g9backend/service/impl/TorrentRecordServiceImpl.java
+++ b/src/main/java/com/g9/g9backend/service/impl/TorrentRecordServiceImpl.java
@@ -4,6 +4,8 @@
import com.g9.g9backend.mapper.TorrentRecordMapper;
import com.g9.g9backend.pojo.TorrentRecord;
import com.g9.g9backend.service.TorrentRecordService;
+import org.springframework.stereotype.Service;
+@Service
public class TorrentRecordServiceImpl extends ServiceImpl<TorrentRecordMapper, TorrentRecord> implements TorrentRecordService {
}
diff --git a/src/main/java/com/g9/g9backend/service/impl/VersionServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/VersionServiceImpl.java
deleted file mode 100644
index 28ff686..0000000
--- a/src/main/java/com/g9/g9backend/service/impl/VersionServiceImpl.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.g9.g9backend.service.impl;
-
-import com.g9.g9backend.mapper.VersionMapper;
-import com.g9.g9backend.pojo.Version;
-import com.g9.g9backend.service.VersionService;
-import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service
-public class VersionServiceImpl extends MppServiceImpl<VersionMapper, Version> implements VersionService {
-}