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 {
-}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 07ec02f..8b9058d 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -4,7 +4,7 @@
   datasource:
     url: jdbc:mysql://localhost:3306/mcpt
     username: root
-    password:
+    password: 123456
   jpa:
     hibernate:
       ddl-auto: none
diff --git a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
index 9d7c908..61b73d8 100644
--- a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
@@ -1,5 +1,7 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
@@ -13,7 +15,9 @@
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.when;
@@ -66,6 +70,21 @@
     @Mock
     private NotificationService notificationService;
 
+    @Mock
+    private ResourceVersionService resourceVersionService;
+
+    @Mock
+    private SearchHistoryService searchHistoryService;
+
+    @Mock
+    private GameVersionService gameVersionService;
+
+    @Mock
+    private TorrentRecordService torrentRecordService;
+
+    @Mock
+    private HotTrendService hotTrendService;
+
     // ObjectMapper对象用于将 Java 对象和 JSON 字符串互相转换 ，因为在测试中，需要把请求参数或返回响应转换成 JSON 字符串形式来传输
     private final ObjectMapper objectMapper = new ObjectMapper();
 
@@ -115,6 +134,23 @@
                 .andExpect(status().isOk()); // 期望接口返回 HTTP 状态码 200（成功）
     }
 
+    // 上传版本
+    @Test
+    public void testUploadResourceVersion() throws Exception {
+
+        ResourceVersion resourceVersion = new ResourceVersion();
+        resourceVersion.setResourceId(1);
+        resourceVersion.setResourceVersionName("Test ResourceVersion");
+
+        when(resourceVersionService.save(any())).thenReturn(true);
+
+        // 模拟 HTTP 请求
+        mockMvc.perform(post("/resource/version")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(resourceVersion)))
+                .andExpect(status().isOk());
+    }
+
     // 购买资源
     @Test
     public void testPurchaseResource_success() throws Exception {
@@ -253,4 +289,136 @@
                         .param("resourceId", "1"))
                 .andExpect(status().isNoContent());
     }
+
+    // 搜索资源
+    @Test
+    public void testGetResourceSearch() throws Exception {
+
+        when(searchHistoryService.save(any())).thenReturn(true);
+        when(resourceService.page(any(), any())).thenReturn(new Page<>(1, 1));
+
+        List<Gameplay> gameplayList = new ArrayList<>();
+        QueryWrapper<Gameplay> gameplayQuery = new QueryWrapper<>();
+        gameplayQuery.eq("resource_id", 1);
+        when(gameplayService.list(gameplayQuery)).thenReturn(gameplayList);
+
+        mockMvc.perform(get("/resource/search")
+                        .param("userId", "1")
+                        .param("searchValue", "")
+                        .param("classify", "")
+                        .param("gameplayList", "")
+                        .param("gameVersionList", "")
+                        .param("pageNumber", "1")
+                        .param("rows", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取资源信息
+    @Test
+    public void testGetResourceInfo() throws Exception {
+
+        when(resourceService.getById(any())).thenReturn(new Resource());
+        when(gameplayService.list(new QueryWrapper<Gameplay>().eq("resource_id", 1))).thenReturn(new ArrayList<>());
+        when(resourceVersionService.list(new QueryWrapper<ResourceVersion>().eq("resource_id", 1))).thenReturn(new ArrayList<>());
+        when(gameVersionService.list(new QueryWrapper<GameVersion>().eq("resource_version_id", 1))).thenReturn(new ArrayList<>());
+        when(torrentRecordService.list(new QueryWrapper<TorrentRecord>().eq("resource_version_id", 1))).thenReturn(new ArrayList<>());
+        when(userCollectionService.getOne(any())).thenReturn(new UserCollection());
+        when(userLikeService.getOne(any())).thenReturn(new UserLike());
+        when(userPurchaseService.getOne(any())).thenReturn(new UserPurchase());
+        when(userUploadService.getOne(any())).thenReturn(new UserUpload());
+
+        mockMvc.perform(get("/resource/info")
+                        .param("resourceId", "1")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取热门资源
+    @Test
+    public void testGetHotResource() throws Exception {
+
+        when(resourceService.page(any(), any())).thenReturn(new Page<>(1, 1));
+
+        List<Gameplay> gameplayList = new ArrayList<>();
+        QueryWrapper<Gameplay> gameplayQuery = new QueryWrapper<>();
+        gameplayQuery.eq("resource_id", 1);
+        when(gameplayService.list(gameplayQuery)).thenReturn(gameplayList);
+
+        mockMvc.perform(get("/resource/hot")
+                        .param("classify", "map")
+                        .param("pageNumber", "1")
+                        .param("rows", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取热门资源幻灯片数据
+    @Test
+    public void testGetHotSlideResource() throws Exception {
+
+        List<Resource> resourceList = new ArrayList<>();
+        QueryWrapper<Resource> resourceQuery = new QueryWrapper<>();
+        resourceQuery.orderByDesc("(downloads * 0.25 + likes * 0.25 + collections * 0.25 + comments * 0.25)");
+        resourceQuery.last("LIMIT 3");
+        when(resourceService.list(resourceQuery)).thenReturn(resourceList);
+
+        mockMvc.perform(get("/resource/hot/slide"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取热门资源趋势图
+    @Test
+    public void testGetResourceHotTrend() throws Exception {
+
+        List<HotTrend> hotTrendList = new ArrayList<>();
+        when(hotTrendService.list()).thenReturn(hotTrendList);
+
+        mockMvc.perform(get("/resource/hot-trend"))
+                .andExpect(status().isOk());
+    }
+
+    // 修改资源信息
+    @Test
+    public void testPutResourceInfo_success() throws Exception {
+
+        PutResourceInfoDTO putResourceInfoDTO = new PutResourceInfoDTO();
+        putResourceInfoDTO.setResourceId(1);
+        putResourceInfoDTO.setResourceName("test");
+        putResourceInfoDTO.setResourcePicture("test");
+        putResourceInfoDTO.setResourceSummary("test");
+        putResourceInfoDTO.setResourceDetail("test");
+        putResourceInfoDTO.setPrice(100);
+        String[] gameplayList = {"test1",  "test2"};
+        putResourceInfoDTO.setGameplayList(gameplayList);
+
+        when(resourceService.getOne(any())).thenReturn(null);
+        when(resourceService.update(any())).thenReturn(true);
+        when(gameplayService.remove(any())).thenReturn(true);
+        when(gameplayService.save(any())).thenReturn(true);
+
+        mockMvc.perform(put("/resource/info")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(putResourceInfoDTO)))
+                .andExpect(status().isOk());
+    }
+
+    @Test
+    public void testPutResourceInfo__resourceNameExists() throws Exception {
+
+        PutResourceInfoDTO putResourceInfoDTO = new PutResourceInfoDTO();
+        putResourceInfoDTO.setResourceId(1);
+        putResourceInfoDTO.setResourceName("test");
+        putResourceInfoDTO.setResourcePicture("test");
+        putResourceInfoDTO.setResourceSummary("test");
+        putResourceInfoDTO.setResourceDetail("test");
+        putResourceInfoDTO.setPrice(100);
+        String[] gameplayList = {"test1",  "test2"};
+        putResourceInfoDTO.setGameplayList(gameplayList);
+
+        when(resourceService.getOne(any())).thenReturn(new Resource());
+
+        mockMvc.perform(put("/resource/info")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(putResourceInfoDTO)))
+                .andExpect(status().is(411));
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
index d390dea..76db7ee 100644
--- a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -58,6 +58,9 @@
     @Mock
     private ResourceService resourceService;
 
+    @Mock
+    private ThreadService threadService;
+
     private final ObjectMapper objectMapper = new ObjectMapper();
 
     @BeforeEach
@@ -303,7 +306,7 @@
     public void testGetUserCollection() throws Exception {
 
         when(userCollectionService.page(any(), any())).thenReturn(new Page<>(1, 2));
-        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0,  "mod"));
 
         mockMvc.perform(get("/user/collection")
                         .param("userId", "1")
@@ -317,7 +320,7 @@
     public void testGetUserUpload() throws Exception {
 
         when(userUploadService.page(any(), any())).thenReturn(new Page<>(1, 2));
-        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0,  "mod"));
 
         mockMvc.perform(get("/user/upload")
                         .param("userId", "1")
@@ -331,7 +334,7 @@
     public void testGetUserPurchase() throws Exception {
 
         when(userPurchaseService.page(any(), any())).thenReturn(new Page<>(1, 2));
-        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0,  "mod"));
 
         mockMvc.perform(get("/user/purchase")
                         .param("userId", "1")
@@ -356,6 +359,19 @@
                 .andExpect(status().isOk());
     }
 
+    // 获取发布过的贴子
+    @Test
+    public void testGetUserThread() throws Exception {
+
+        when(threadService.page(any(), any())).thenReturn(new Page<>(1, 2));
+
+        mockMvc.perform(get("/user/thread")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
     // 获取用户数据
     @Test
     public void testGetUserData() throws Exception {
