diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
index cb8a36b..9d18320 100644
--- a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
@@ -17,6 +17,8 @@
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @RestController
 @RequestMapping("/help/posts")
@@ -41,7 +43,7 @@
         post.setCreateTime(LocalDateTime.now());
         post.setLikeCount(0);
         post.setReplyCount(0);
-        post.setImageUrl(image.getOriginalFilename());
+        post.setImageUrl(null);
 //        post.setIsSolved(false);
 
         // 处理图片上传
@@ -85,6 +87,53 @@
                 .data("total", ipage.getTotal());
     }
 
+    @GetMapping("/search")
+    public Result searchPosts(
+            @RequestParam String keyword,
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "5") int size) {
+
+        // 1. 把搜索词拆分成单词（中英文混合拆分）
+        List<String> keywords = splitKeywords(keyword); // 例如 "你好hello" → ["你", "好", "hello"]
+
+        // 2. 构建动态查询条件（每个关键词用 OR 连接）
+        QueryWrapper<HelpPost> queryWrapper = new QueryWrapper<>();
+        for (String word : keywords) {
+            queryWrapper.and(wrapper ->
+                    // 使用LOWER函数使搜索不区分大小写
+                    wrapper.apply("LOWER(title) LIKE LOWER({0})", "%" + word + "%")
+                            .or()
+                            .apply("LOWER(content) LIKE LOWER({0})", "%" + word + "%")
+            );
+        }
+        queryWrapper.orderByDesc("create_time");
+
+        // 3. 执行分页查询
+        IPage<HelpPost> ipage = postService.page(new Page<>(page, size), queryWrapper);
+        return Result.ok()
+                .data("records", ipage.getRecords())
+                .data("total", ipage.getTotal());
+    }
+
+    /**
+     * 拆分关键词（支持中英文混合）
+     * 例如："你好hello 世界" → ["你", "好", "hello", "世", "界"]
+     */
+    private List<String> splitKeywords(String keyword) {
+        List<String> keywords = new ArrayList<>();
+
+        // 用正则匹配中文字符和英文单词
+        Pattern pattern = Pattern.compile("([\\u4e00-\\u9fa5])|([a-zA-Z0-9]+)");
+        Matcher matcher = pattern.matcher(keyword);
+
+        while (matcher.find()) {
+            String matched = matcher.group();
+            keywords.add(matched);
+        }
+
+        return keywords;
+    }
+
     @GetMapping("/{Id}")
     public Result getPost(@PathVariable int Id) {
         HelpPost post = postService.getById(Id);
@@ -137,33 +186,6 @@
         return Result.ok();
     }
 
-//    @PostMapping("/{Id}/comments")
-//    public Result comment(@PathVariable int Id,
-//                          @RequestBody HelpComment comment) {
-//        // 设置评论信息
-//        comment.setPostId(Id);
-//        comment.setCreateTime(LocalDateTime.now());
-//        comment.setLikeCount(0); // 初始化点赞数
-//        comment.setParentId(0);  // 默认父评论ID
-//        comment.setReplyTo(null); // 主评论 replyTo=null
-//
-//        // 保存评论
-//        boolean saved = commentService.save(comment);
-//        if (!saved) {
-//            return Result.error(404).setMessage("评论保存失败");
-//        }
-//
-//        // 更新回复数
-//        postService.incrementReplyCount(Id);
-//
-//        // 获取更新后的完整评论（包含数据库生成的ID和时间）
-//        HelpComment newComment = commentService.getById(comment.getId());
-//
-//        return Result.ok()
-//                .data("comment", newComment)  // 返回完整评论数据
-//                .data("newReplyCount", postService.getById(Id).getReplyCount());
-//    }
-
     @PostMapping(value = "/{Id}/comments", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public Result comment(@PathVariable int Id,
                           @RequestParam("authorId") String authorId,
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
index 2b18372..2c6031c 100644
--- a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
@@ -1,5 +1,6 @@
 package com.ptp.ptplatform.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ptp.ptplatform.entity.*;
 import com.ptp.ptplatform.mapper.DiscountMapper;
@@ -41,6 +42,10 @@
 import java.util.List;
 import java.util.UUID;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
 
 //实现种子的增删改查
 @RestController
@@ -65,11 +70,69 @@
     private TrackerService trackerservice = new TrackerService(new ObjectMapper());
     private ClientService clientservice = new ClientService();
 
+    @GetMapping
+    public Result listPosts(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "5") int size,
+            @RequestParam(required = false) String category,
+            @RequestParam(required = false) String subtitle,
+            @RequestParam(required = false) String region,
+            @RequestParam(required = false) String resolution) {
+
+        // 构建查询条件
+        QueryWrapper<TORRENT> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("create_time");
+
+        if (category != null && !category.isEmpty() && !"all".equals(category)) {
+            queryWrapper.eq("category", category);
+        }
+        if (subtitle != null && !subtitle.isEmpty() && !"all".equals(subtitle)) {
+            queryWrapper.eq("subtitle", subtitle);
+        }
+        if (region != null && !region.isEmpty() && !"all".equals(region)) {
+            queryWrapper.eq("region", region);
+        }
+        if (resolution != null && !resolution.isEmpty() && !"all".equals(resolution)) {
+            queryWrapper.eq("resolution", resolution);
+        }
+
+        // 执行分页查询
+        IPage<TORRENT> ipage = new Page<>(page, size);
+        IPage<TORRENT> resultPage = torrentMapper.selectPage(ipage, queryWrapper);
+
+        // 转换size字段为格式化字符串
+        List<Map<String, Object>> formattedRecords = resultPage.getRecords().stream()
+                .map(torrent -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("id", torrent.getId());
+                    map.put("torrentName", torrent.getTorrentName());
+                    map.put("description", torrent.getDescription());
+                    map.put("category", torrent.getCategory());
+                    map.put("region", torrent.getRegion());
+                    map.put("resolution", torrent.getResolution());
+                    map.put("subtitle", torrent.getSubtitle());
+                    map.put("size", formatFileSize(torrent.getSize())); // 格式化size
+                    map.put("hash", torrent.getHash());
+                    map.put("username", torrent.getUsername());
+                    map.put("filePath", torrent.getFilePath());
+                    map.put("like_count", torrent.getLike_count());
+                    map.put("reply_count", torrent.getReply_count());
+                    map.put("createTime", torrent.getCreateTime());
+                    return map;
+                })
+                .collect(Collectors.toList());
+
+        return Result.ok()
+                .data("records", formattedRecords)
+                .data("total", resultPage.getTotal());
+    }
+
+
     @GetMapping("/{Id}")
     public Result getPost(@PathVariable int Id) {
         TORRENT torrent = postService.getById(Id);
         if (torrent == null) {
-            return Result.error(404).setMessage("种子不存在"); // 明确设置404状态码
+            return Result.error(404).setMessage("种子不存在");
         }
 
         // 获取所有评论（按创建时间排序）
@@ -101,8 +164,25 @@
             }
         }
 
+        // 创建格式化后的torrent对象
+        Map<String, Object> formattedTorrent = new HashMap<>();
+        formattedTorrent.put("id", torrent.getId());
+        formattedTorrent.put("torrentName", torrent.getTorrentName());
+        formattedTorrent.put("description", torrent.getDescription());
+        formattedTorrent.put("category", torrent.getCategory());
+        formattedTorrent.put("region", torrent.getRegion());
+        formattedTorrent.put("resolution", torrent.getResolution());
+        formattedTorrent.put("subtitle", torrent.getSubtitle());
+        formattedTorrent.put("size", formatFileSize(torrent.getSize())); // 格式化size
+        formattedTorrent.put("hash", torrent.getHash());
+        formattedTorrent.put("username", torrent.getUsername());
+        formattedTorrent.put("filePath", torrent.getFilePath());
+        formattedTorrent.put("like_count", torrent.getLike_count());
+        formattedTorrent.put("reply_count", torrent.getReply_count());
+        formattedTorrent.put("createTime", torrent.getCreateTime());
+
         return Result.ok()
-                .data("torrent", torrent)
+                .data("torrent", formattedTorrent)
                 .data("comments", rootComments);
     }
 
@@ -350,64 +430,50 @@
         }
     }
 
-    // Controller
-    @GetMapping
-    public Result listPosts(@RequestParam(defaultValue = "1") int page,
-                            @RequestParam(defaultValue = "5") int size) {
-        int offset = (page - 1) * size;
-        List<TORRENT> pagedList = torrentMapper.selectAllTorrentWithPage(offset, size);
-        int total = torrentMapper.countAllTorrent();
 
-        Page<TORRENT> pageResult = new Page<>(page, size);
-        pageResult.setRecords(pagedList);
-        pageResult.setTotal(total);
 
-        return Result.ok()
-                .data("records", pageResult.getRecords())
-                .data("total", pageResult.getTotal());
-    }
-
-    // 获取特定分区下的种子（分页版）
-    @GetMapping("/get/torrentByCategory/{category}")
-    public Result getTorrentByCategory(
-            @PathVariable("category") String category,
+    @GetMapping("/search")
+    public Result searchTorrents(
+            @RequestParam String keyword,
             @RequestParam(defaultValue = "1") int page,
             @RequestParam(defaultValue = "5") int size) {
 
-        int offset = (page - 1) * size;
-        List<TORRENT> pagedList = torrentMapper.selectTorrentByCategoryWithPage(category, offset, size);
-        int total = torrentMapper.countByCategory(category);
+        // 1. 把搜索词拆分成单词（中英文混合拆分）
+        List<String> keywords = splitKeywords(keyword);
 
-        Page<TORRENT> pageResult = new Page<>(page, size);
-        pageResult.setRecords(pagedList);
-        pageResult.setTotal(total);
+        // 2. 构建动态查询条件（只搜索种子名称）
+        QueryWrapper<TORRENT> queryWrapper = new QueryWrapper<>();
+        for (String word : keywords) {
+            queryWrapper.and(wrapper ->
+                    // 使用LOWER函数将数据库字段和搜索词都转为小写
+                    wrapper.apply("LOWER(torrent_name) LIKE LOWER({0})", "%" + word + "%")
+            );
+        }
+        queryWrapper.orderByDesc("create_time");
+
+        // 3. 执行分页查询
+        IPage<TORRENT> ipage = new Page<>(page, size);
+        IPage<TORRENT> resultPage = torrentMapper.selectPage(ipage, queryWrapper);
 
         return Result.ok()
-                .data("records", pageResult.getRecords())
-                .data("total", pageResult.getTotal());
+                .data("records", resultPage.getRecords())
+                .data("total", resultPage.getTotal());
     }
 
-    // 搜索种子关键字（分页版）
-    @GetMapping("/get/torrentByKey/{key}")
-    public Result getTorrentByKey(
-            @PathVariable("key") String key,
-            @RequestParam(defaultValue = "1") int page,
-            @RequestParam(defaultValue = "5") int size) {
-
-        int offset = (page - 1) * size;
-        List<TORRENT> pagedList = torrentMapper.selectTorrentByKeyWithPage(key, offset, size);
-        int total = torrentMapper.countByKey(key);
-
-        Page<TORRENT> pageResult = new Page<>(page, size);
-        pageResult.setRecords(pagedList);
-        pageResult.setTotal(total);
-
-        return Result.ok()
-                .data("records", pageResult.getRecords())
-                .data("total", pageResult.getTotal());
+    /**
+     * 拆分关键词（支持中英文混合）
+     */
+    private List<String> splitKeywords(String keyword) {
+        List<String> keywords = new ArrayList<>();
+        Pattern pattern = Pattern.compile("([\\u4e00-\\u9fa5])|([a-zA-Z0-9]+)");
+        Matcher matcher = pattern.matcher(keyword);
+        while (matcher.find()) {
+            keywords.add(matcher.group());
+        }
+        return keywords;
     }
 
-    // 获取对应用户种子（分页版）
+
     @GetMapping("/get/torrentMyself")
     public Result getTorrentByKey(
             HttpServletRequest request,
@@ -417,10 +483,21 @@
         USER user = userController.getUserInRequest(request);
         int offset = (page - 1) * size;
         List<TORRENT> pagedList = torrentMapper.selectTorrentByUsernameWithPage(user.getUsername(), offset, size);
+
+        // 为每个种子添加下载次数和格式化后的文件大小
+        List<Map<String, Object>> resultList = new ArrayList<>();
+        for (TORRENT torrent : pagedList) {
+            Map<String, Object> torrentMap = new HashMap<>();
+            torrentMap.put("torrent", torrent);
+            torrentMap.put("downloadCount", getDownloadCount(torrent.getId()));
+            torrentMap.put("formattedSize", formatFileSize(torrent.getSize())); // 添加格式化后的文件大小
+            resultList.add(torrentMap);
+        }
+
         int total = torrentMapper.countByUsername(user.getUsername());
 
-        Page<TORRENT> pageResult = new Page<>(page, size);
-        pageResult.setRecords(pagedList);
+        Page<Map<String, Object>> pageResult = new Page<>(page, size);
+        pageResult.setRecords(resultList);
         pageResult.setTotal(total);
 
         return Result.ok()
@@ -465,4 +542,26 @@
         throw new IOException("Invalid torrent file");
     }
 
+    private int getDownloadCount(int torrentId) {
+        QueryWrapper<DOWNLOAD_TORRENT> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("torrentid", torrentId);
+        return downloadTorrentMapper.selectCount(queryWrapper).intValue();
+    }
+
+    private String formatFileSize(long size) {
+        if (size < 1024) {
+            return size + " B";
+        }
+        double kb = size / 1024.0;
+        if (kb < 1024) {
+            return String.format("%.2f KB", kb);
+        }
+        double mb = kb / 1024.0;
+        if (mb < 1024) {
+            return String.format("%.2f MB", mb);
+        }
+        double gb = mb / 1024.0;
+        return String.format("%.2f GB", gb);
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/UserController.java b/src/main/java/com/ptp/ptplatform/controller/UserController.java
index f03af76..134c624 100644
--- a/src/main/java/com/ptp/ptplatform/controller/UserController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/UserController.java
@@ -34,13 +34,33 @@
     @Autowired
     private DownloadTorrentMapper downloadTorrentMapper;
 
-    //个人中心获取用户登录信息
-    @GetMapping("/info") //获取
-    public Result info(HttpServletRequest request) {
-        USER user = this.getUserInRequest(request);
-        return Result.ok().data("info", user);
+    @GetMapping("/userInfo")
+    public Result userInfo(HttpServletRequest request) {
+        try {
+            USER user = this.getUserInRequest(request);
+            if (user == null) {
+                return Result.error(404).setMessage("用户未找到");
+            }
+
+            // 创建一个Map来组织返回数据
+            Map<String, Object> userInfo = new HashMap<>();
+            userInfo.put("username", user.getUsername());
+            userInfo.put("authority", user.getAuthority().name());
+            userInfo.put("level", user.getLevel());
+            userInfo.put("registTime", user.getRegistTime());
+            userInfo.put("upload", user.getUpload());
+            userInfo.put("download", user.getDownload());
+            userInfo.put("shareRate", user.getShareRate());
+            userInfo.put("magicPoints", user.getMagicPoints());
+            userInfo.put("lastLogin", user.getLastLogin());
+
+            return Result.ok().data(userInfo);
+        } catch (Exception e) {
+            return Result.error(500).setMessage("获取用户信息失败");
+        }
     }
 
+
     @PostMapping("/login") //用户登录
     public Result login(String username, String password) {
         USER user = userMapper.selectByUsername(username);
@@ -99,24 +119,22 @@
 
     }
 
-    //获取允许下载额度的相关信息
     @GetMapping("/allowDownload")
     public Result allowDownload(HttpServletRequest request) {
         USER user = this.getUserInRequest(request);
-        // 总额度 已经使用 剩余 单位是GB
-        int totalSize = SizeCalculation.byteToGB(user.getUpload());
-        int usedSize = SizeCalculation.byteToGB(user.getDownload());
-        int leftSize = totalSize - usedSize;
-
-        // 将变量封装成Map
+        // 直接返回字节值
         Map<String, Object> dataMap = new HashMap<>();
-        dataMap.put("totalSize", totalSize);
-        dataMap.put("usedSize", usedSize);
-        dataMap.put("leftSize", leftSize);
+        long remaining = user.getUpload() * 2 - user.getDownload(); // 剩余额度=上传量×2-下载量
+        long used = user.getDownload(); // 已使用=下载量
+        long total = used + remaining; // 总额度=已使用+剩余
 
+        dataMap.put("total", total);
+        dataMap.put("used", used);
+        dataMap.put("remaining", remaining);
         return Result.ok().data(dataMap);
     }
 
+
     //修改用户密码
     @PutMapping("/password")
     public Result updatePassword(HttpServletRequest request, @RequestBody Map<String, String> passwordMap) {
@@ -176,10 +194,18 @@
         return Result.error(400).setMessage("修改用户权限失败");
     }
 
-    //从http请求中获取到用户
     public USER getUserInRequest(HttpServletRequest request) {
-        String UserName = JwtUtils.getClaimByToken(request.getHeader("Authorization")).getSubject();
-        return userMapper.selectByUsername(UserName);
+        String authHeader = request.getHeader("Authorization");
+        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
+            return null;
+        }
+        try {
+            String username = JwtUtils.getClaimByToken(authHeader).getSubject();
+            return userMapper.selectByUsername(username);
+        } catch (Exception e) {
+            e.printStackTrace();  // 添加日志
+            return null;
+        }
     }
 
     // 用户等级更新
diff --git a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java
index 77bdfcf..8831a09 100644
--- a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java
+++ b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java
@@ -1,5 +1,6 @@
 package com.ptp.ptplatform.entity;
 
+import com.baomidou.mybatisplus.annotation.TableName;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.GenerationType;
 import jakarta.persistence.Id;
@@ -9,6 +10,7 @@
 import java.time.LocalDateTime;
 
 @Data
+@TableName("download_torrent")
 public class DOWNLOAD_TORRENT {
 
     private Integer id;
diff --git a/src/main/java/com/ptp/ptplatform/entity/HelpPost.java b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
index 90d0460..4a2cfe6 100644
--- a/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
@@ -7,7 +7,7 @@
 import java.time.LocalDateTime;
 
 @Data
-@TableName("help_posts")
+@TableName(value = "help_posts")
 public class HelpPost {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;        // 使用包装类型以支持 null
diff --git a/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
index 81da1e0..6ab9859 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
@@ -1,13 +1,17 @@
 package com.ptp.ptplatform.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ptp.ptplatform.entity.DOWNLOAD_TORRENT;
 import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
 
 import java.util.List;
 
-public interface DownloadTorrentMapper {
+public interface DownloadTorrentMapper extends BaseMapper<DOWNLOAD_TORRENT> {
     // 获取对应用户的保种积分
     @Select("SELECT * FROM download_torrent WHERE username = #{username}")
     List<DOWNLOAD_TORRENT> selectByUsername(String username);
@@ -20,4 +24,5 @@
     @Update("UPDATE download_torrent SET torrentid = #{torrentid}, finished = #{finished}, updated = #{updated}, fileSize = #{fileSize} " +
             "WHERE id = #{id}")
     int updateDT(DOWNLOAD_TORRENT downloadTorrent);
+
 }
diff --git a/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java b/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
index 4a5f6d1..2ed9068 100644
--- a/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
+++ b/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
@@ -6,11 +6,10 @@
 
 import java.util.Date;
 
-
 public class JwtUtils {
-
     private static long expire = 36000;
-    private static String secret = "abcdefgg";
+    // 使用足够长的密钥（至少64字符）
+    private static String secret = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl";
 
     public static String generateToken(String username){
         Date now = new Date();
@@ -24,7 +23,11 @@
                 .compact();
 
     }
-    public static Claims getClaimByToken(String token){
+    public static Claims getClaimByToken(String token) {
+        // 处理Bearer前缀
+        if (token != null && token.startsWith("Bearer ")) {
+            token = token.substring(7);
+        }
         return Jwts.parser()
                 .setSigningKey(secret)
                 .parseClaimsJws(token)
diff --git a/src/test/java/com/ptp/ptplatform/controller/TORRENTControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/TORRENTControllerTest.java
index f383d5e..77d21b3 100644
--- a/src/test/java/com/ptp/ptplatform/controller/TORRENTControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/TORRENTControllerTest.java
@@ -14,7 +14,9 @@
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
@@ -52,7 +54,9 @@
                 "/downloads/ubuntu-22.04.iso"      // filePath
         );
         mockTORRENT.setId(1);
-        mockTORRENT.setLikeCount(200);
+        mockTORRENT.setLike_count(200);
+        mockTORRENT.setReply_count(10);
+        mockTORRENT.setCreateTime(LocalDateTime.now());
 
         // 模拟空评论列表
         List<TorrentComment> emptyComments = new ArrayList<>();
@@ -67,9 +71,20 @@
         // 4. 验证结果
         assertEquals(200, result.getCode());
         assertNotNull(result.getData().get("torrent"));
-        TORRENT returnedTORRENT = (TORRENT) result.getData().get("torrent");
-        assertEquals("Ubuntu 22.04 ISO", returnedTORRENT.getTorrentName());
-        assertEquals(200, returnedTORRENT.getLikeCount());
+
+        // 获取返回的Map对象
+        Map<String, Object> torrentMap = (Map<String, Object>) result.getData().get("torrent");
+
+        // 验证Map中的值
+        assertEquals("Ubuntu 22.04 ISO", torrentMap.get("torrentName"));
+        assertEquals(200, torrentMap.get("like_count"));
+        assertEquals(10, torrentMap.get("reply_count"));
+        assertEquals("Software", torrentMap.get("category"));
+        assertEquals("美国", torrentMap.get("region"));
+        assertEquals("1080p", torrentMap.get("resolution"));
+        assertEquals("中文字幕", torrentMap.get("subtitle"));
+        assertEquals("admin", torrentMap.get("username"));
+        assertEquals("/downloads/ubuntu-22.04.iso", torrentMap.get("filePath"));
 
         // 5. 验证服务层调用
         verify(torrentService, times(1)).getById(1);
diff --git a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
index 599655e..1201f02 100644
--- a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
@@ -51,9 +51,7 @@
     void setUp() {
         MockitoAnnotations.openMocks(this);
 
-        testUser = new USER();
-        testUser.setUsername("testUser");
-        testUser.setPassword("testPassword");
+        testUser = new USER("testUser", "testPassword", USER.Authority.USER);
         testUser.setLastLogin(new Date());
         testUser.setUpload(1073741824L); // 1GB in bytes
         testUser.setDownload(536870912L); // 0.5GB in bytes
@@ -61,6 +59,7 @@
         testInviteCode = new INVITE_CODE("testUser");
         testInviteCode.setCode("TESTCODE123");
         testInviteCode.setIsUsed(false);
+
         mockMvc = MockMvcBuilders
                 .standaloneSetup(userController)
                 .build();
@@ -69,21 +68,22 @@
     @Test
     void info_Success() {
         // Arrange
-        when(request.getHeader("Authorization")).thenReturn("validToken");
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
 
         Claims mockClaims = mock(Claims.class);
         when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("validToken")).thenReturn(mockClaims);
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
             when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             // Act
-            Result result = userController.info(request);
+            Result result = userController.userInfo(request);
 
             // Assert
             assertTrue(result.isSuccess());
-            assertEquals(testUser, result.getData().get("info"));
+            assertNotNull(result.getData().get("username"));
+            assertEquals(testUser.getUsername(), result.getData().get("username"));
         }
     }
 
@@ -192,13 +192,17 @@
     @Test
     void allowDownload_Success() {
         // Arrange
-        when(request.getHeader("Authorization")).thenReturn("validToken");
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
+
+        // 设置testUser的值
+        testUser.setUpload(1073741824L);  // 1GB
+        testUser.setDownload(536870912L); // 0.5GB
 
         Claims mockClaims = mock(Claims.class);
         when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("validToken")).thenReturn(mockClaims);
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
             when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             // Act
@@ -207,23 +211,22 @@
             // Assert
             assertTrue(result.isSuccess());
             Map<String, Object> data = result.getData();
-            assertEquals(1, data.get("totalSize")); // 1GB
-            assertEquals(0, data.get("usedSize")); // 0.5GB (but SizeCalculation.byteToGB rounds down)
-            assertEquals(1, data.get("leftSize")); // 0.5GB rounded up
+            assertEquals(2147483648L, data.get("total")); // upload*2 = 2GB
+            assertEquals(536870912L, data.get("used")); // download = 0.5GB
+            assertEquals(1610612736L, data.get("remaining")); // upload*2 - download = 1.5GB
         }
     }
 
     @Test
     void updatePassword_Success() {
         // Arrange
-        when(request.getHeader("Authorization")).thenReturn("validToken");
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
 
         Claims mockClaims = mock(Claims.class);
         when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("validToken")).thenReturn(mockClaims);
-
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
             when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             Map<String, String> passwordMap = new HashMap<>();
@@ -243,16 +246,13 @@
     @Test
     void updatePassword_Fail_WrongOldPassword() {
         // Arrange
-        when(request.getHeader("Authorization")).thenReturn("validToken");
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
 
-        // 创建模拟的 Claims 对象
         Claims mockClaims = mock(Claims.class);
-        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());  // 模拟 getSubject() 返回用户名
+        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            // 模拟 JwtUtils.getClaimByToken 返回模拟的 Claims 对象
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("validToken")).thenReturn(mockClaims);
-
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
             when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             Map<String, String> passwordMap = new HashMap<>();
@@ -272,12 +272,12 @@
     @Test
     void getUserInRequest_Success() {
         // Arrange
-        when(request.getHeader("Authorization")).thenReturn("validToken");
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
         Claims mockClaims = mock(Claims.class);
-        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());  // 模拟 getSubject() 返回用户名
+        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("validToken")).thenReturn(mockClaims);
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
             when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             // Act
@@ -290,45 +290,35 @@
 
     @Test
     public void testSearchUser() {
-        // 模拟 JWT 验证
+        // Arrange
+        when(request.getHeader("Authorization")).thenReturn("Bearer validToken");
         Claims mockClaims = mock(Claims.class);
-        when(mockClaims.getSubject()).thenReturn("testUser");
+        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
 
         try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            // 模拟 JwtUtils 行为
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken(anyString())).thenReturn(mockClaims);
-
-            // 模拟用户查询
-            USER mockUser = new USER("testUser", "password", USER.Authority.USER);
-            when(userMapper.selectByUsername("testUser")).thenReturn(mockUser);
+            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
+            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
 
             // 模拟搜索结果
             List<USER> mockResults = Arrays.asList(
                     new USER("user1", "pass1", USER.Authority.USER),
                     new USER("user2", "pass2", USER.Authority.USER)
             );
-            when(userMapper.searchUsername("testUser", "zzz")).thenReturn(mockResults);
+            when(userMapper.searchUsername(testUser.getUsername(), "zzz")).thenReturn(mockResults);
 
-            // 创建请求并添加 Authorization 头
-            MockHttpServletRequest request = new MockHttpServletRequest();
-            request.addHeader("Authorization", "mockToken");
-
-            // 测试有搜索关键词的情况
+            // Act
             Result result = userController.searchUser("zzz", request);
+
+            // Assert
             assertEquals(200, result.getCode());
             assertNotNull(result.getData().get("data"));
             assertEquals(2, ((List<?>) result.getData().get("data")).size());
-
-            // 测试无搜索关键词的情况
-            Result errorResult = userController.searchUser("", request);
-            assertEquals(500, errorResult.getCode());
-            assertEquals("请提供搜索关键词", errorResult.getMessage());
         }
     }
 
     @Test
     public void testGetAllUser() {
-        // 模拟返回所有用户
+        // Arrange
         List<USER> mockUsers = Arrays.asList(
                 new USER("admin", "adminPass", USER.Authority.ADMIN),
                 new USER("user1", "pass1", USER.Authority.USER),
@@ -336,41 +326,38 @@
         );
         when(userMapper.selectAllUsers()).thenReturn(mockUsers);
 
+        // Act
         Result result = userController.getAllUser();
+
+        // Assert
         assertEquals(200, result.getCode());
         assertNotNull(result.getData().get("data"));
         assertEquals(3, ((List<?>) result.getData().get("data")).size());
-
-        // 测试空列表情况
-        when(userMapper.selectAllUsers()).thenReturn(Collections.emptyList());
-        Result emptyResult = userController.getAllUser();
-        assertEquals(200, emptyResult.getCode());
-        assertTrue(((List<?>) emptyResult.getData().get("data")).isEmpty());
     }
 
     @Test
     public void testChangeAuthority() {
-        // 测试成功修改权限
+        // Arrange
         Map<String, String> authorityMap = new HashMap<>();
         authorityMap.put("changeUsername", "testUser");
         authorityMap.put("authority", "ADMIN");
 
-        USER mockUser = new USER("testUser", "password", USER.Authority.USER);
-        when(userMapper.selectByUsername("testUser")).thenReturn(mockUser);
+        when(userMapper.selectByUsername("testUser")).thenReturn(testUser);
         when(userMapper.updateUser(any(USER.class))).thenReturn(1);
 
-        Result successResult = userController.changeAuthority(new MockHttpServletRequest(), authorityMap);
-        assertEquals(200, successResult.getCode());
-        assertEquals("修改用户权限成功", successResult.getMessage());
+        // Act
+        Result result = userController.changeAuthority(request, authorityMap);
 
+        // Assert
+        assertEquals(200, result.getCode());
+        assertEquals("修改用户权限成功", result.getMessage());
     }
+
     @Test
     void whenPostRefreshLevel_thenServiceCalled_andReturnOk() throws Exception {
         mockMvc.perform(post("/user/refreshLevel"))
                 .andExpect(status().isOk());
 
-        // 验证 service 方法被调用
         verify(userLevelService).refreshAllUserLevels();
     }
-}
-
+}
\ No newline at end of file
diff --git a/uploads/38ee81c5-ee84-4371-94bd-55ff19784e97.png b/uploads/38ee81c5-ee84-4371-94bd-55ff19784e97.png
new file mode 100644
index 0000000..ef08183
--- /dev/null
+++ b/uploads/38ee81c5-ee84-4371-94bd-55ff19784e97.png
Binary files differ
diff --git a/uploads/3faa8c92-715f-49b1-9fb4-3f8fea12cbd8.png b/uploads/3faa8c92-715f-49b1-9fb4-3f8fea12cbd8.png
new file mode 100644
index 0000000..cee3e35
--- /dev/null
+++ b/uploads/3faa8c92-715f-49b1-9fb4-3f8fea12cbd8.png
Binary files differ
diff --git a/uploads/5ea70d6e-50d5-44ec-b35e-e9e7101ee24f.png b/uploads/5ea70d6e-50d5-44ec-b35e-e9e7101ee24f.png
new file mode 100644
index 0000000..e5d4cab
--- /dev/null
+++ b/uploads/5ea70d6e-50d5-44ec-b35e-e9e7101ee24f.png
Binary files differ
diff --git a/uploads/665a02db-5b60-40ae-92dd-c46b31637372.jpg b/uploads/665a02db-5b60-40ae-92dd-c46b31637372.jpg
new file mode 100644
index 0000000..a6d7f38
--- /dev/null
+++ b/uploads/665a02db-5b60-40ae-92dd-c46b31637372.jpg
@@ -0,0 +1 @@
+test image
\ No newline at end of file
diff --git a/uploads/d967fdec-79e7-4633-9015-73c8aee165e7.jpg b/uploads/d967fdec-79e7-4633-9015-73c8aee165e7.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/d967fdec-79e7-4633-9015-73c8aee165e7.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
