diff --git a/pom.xml b/pom.xml
index 671fec8..a2635e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,9 @@
     <description>PTPlatform</description>
     <properties>
         <java.version>17</java.version>
+        <mockito.version>4.5.1</mockito.version>
     </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/ptp/ptplatform/controller/RecommendController.java b/src/main/java/com/ptp/ptplatform/controller/RecommendController.java
new file mode 100644
index 0000000..69e9b88
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/RecommendController.java
@@ -0,0 +1,39 @@
+package com.ptp.ptplatform.controller;
+
+import com.ptp.ptplatform.entity.TORRENT;
+import com.ptp.ptplatform.entity.USER;
+import com.ptp.ptplatform.service.RecommenderService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/recommend")
+public class RecommendController {
+    @Resource
+    private UserController userController;
+
+    private final RecommenderService recommenderService;
+
+    @Autowired
+    public RecommendController(RecommenderService recommenderService) {
+        this.recommenderService = recommenderService;
+    }
+
+    @GetMapping("/for-user")
+    public ResponseEntity<List<TORRENT>> recommendForUser(
+            HttpServletRequest request,
+            @RequestParam(defaultValue = "10") int limit) {
+        USER user = userController.getUserInRequest(request);
+        if (user == null) {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
+        }
+        return ResponseEntity.ok(recommenderService.recommendForUser(user.getUsername(), limit));
+    }
+}
\ 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 134c624..46edfaf 100644
--- a/src/main/java/com/ptp/ptplatform/controller/UserController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/UserController.java
@@ -196,11 +196,13 @@
 
     public USER getUserInRequest(HttpServletRequest request) {
         String authHeader = request.getHeader("Authorization");
-        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
+        System.out.println("authHeader" + authHeader);
+        if (authHeader == null) {
             return null;
         }
         try {
             String username = JwtUtils.getClaimByToken(authHeader).getSubject();
+            System.out.println("username" + username);
             return userMapper.selectByUsername(username);
         } catch (Exception e) {
             e.printStackTrace();  // 添加日志
diff --git a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java
deleted file mode 100644
index 3743f4e..0000000
--- a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.ptp.ptplatform.entity;
-
-import java.time.LocalDateTime;
-
-public class DOWNLOAD_RECORD {
-
-    private int id; // 下载记录ID
-    private int userId; // 下载用户ID
-    private int torrentId; // 请求的种子资源ID
-    private String status; // 下载状态（成功、失败、终止）
-    private LocalDateTime downloadTime; // 下载时间
-    private String downloadPath; // 下载路径
-
-    // 构造方法、getter和setter省略
-
-    public DOWNLOAD_RECORD(int userId, int torrentId, String status, LocalDateTime downloadTime, String downloadPath) {
-        this.userId = userId;
-        this.torrentId = torrentId;
-        this.status = status;
-        this.downloadTime = downloadTime;
-        this.downloadPath = downloadPath;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/RECOMMEND_HISTORY.java b/src/main/java/com/ptp/ptplatform/entity/RECOMMEND_HISTORY.java
new file mode 100644
index 0000000..9abbf00
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/RECOMMEND_HISTORY.java
@@ -0,0 +1,35 @@
+package com.ptp.ptplatform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("user_recommendation_history")
+public class RECOMMEND_HISTORY {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private String username;
+    private Integer torrentId;
+
+    @TableField("recommended_at")
+    private LocalDateTime recommendedAt;
+
+    private Boolean shown;
+    private Boolean clicked;
+
+    public RECOMMEND_HISTORY() {}
+
+    public RECOMMEND_HISTORY(String username, Integer torrentId) {
+        this.username = username;
+        this.torrentId = torrentId;
+        this.recommendedAt = LocalDateTime.now();
+        this.shown = false;
+        this.clicked = false;
+    }
+}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java b/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java
deleted file mode 100644
index 4cb8c90..0000000
--- a/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.ptp.ptplatform.mapper;
-
-import com.ptp.ptplatform.entity.DOWNLOAD_RECORD;
-import org.apache.ibatis.annotations.Insert;
-
-public interface DownloadRecordMapper {
-    @Insert("INSERT INTO download_record (username, torrent_id, status, download_time, download_path) " +
-            "VALUES (#{username}, #{torrentId}, #{status}, #{downloadTime}, #{downloadPath})")
-    void insertDownloadRecord(DOWNLOAD_RECORD downloadRecord);
-}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
index 6ab9859..22ff203 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
@@ -2,15 +2,13 @@
 
 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 org.apache.ibatis.annotations.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 
 import java.util.List;
 
+@Mapper
 public interface DownloadTorrentMapper extends BaseMapper<DOWNLOAD_TORRENT> {
     // 获取对应用户的保种积分
     @Select("SELECT * FROM download_torrent WHERE username = #{username}")
@@ -25,4 +23,15 @@
             "WHERE id = #{id}")
     int updateDT(DOWNLOAD_TORRENT downloadTorrent);
 
+    @Select("SELECT DISTINCT username FROM download_torrent WHERE torrentid = #{torrentId}")
+    List<String> findUsersWhoDownloaded(Integer torrentId);
+
+    @Select("SELECT COUNT(*) FROM download_torrent WHERE username = #{username} AND torrentid = #{torrentId}")
+    int countUserDownloads(String username, Integer torrentId);
+
+    @Select("SELECT * FROM download_torrent WHERE username = #{username}")
+    List<DOWNLOAD_TORRENT> findByUsername(@Param("username") String username);
+
+    @Select("SELECT DISTINCT username FROM download_torrent WHERE torrentid = #{torrentId}")
+    List<String> findUsersByTorrentId(@Param("torrentId") Integer torrentId);
 }
diff --git a/src/main/java/com/ptp/ptplatform/mapper/RecommendHistoryMapper.java b/src/main/java/com/ptp/ptplatform/mapper/RecommendHistoryMapper.java
new file mode 100644
index 0000000..f019dc6
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/RecommendHistoryMapper.java
@@ -0,0 +1,28 @@
+package com.ptp.ptplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ptp.ptplatform.entity.RECOMMEND_HISTORY;
+import org.apache.ibatis.annotations.*;
+
+import java.util.Set;
+
+@Mapper
+public interface RecommendHistoryMapper extends BaseMapper<RECOMMEND_HISTORY> {
+
+    @Select("SELECT torrent_id FROM user_recommendation_history WHERE username = #{username}")
+    Set<Integer> findRecommendedTorrentIdsByUser(@Param("username") String username);
+
+    @Insert("INSERT INTO user_recommendation_history(username, torrent_id, recommended_at, shown, clicked) " +
+            "VALUES(#{username}, #{torrentId}, #{recommendedAt}, #{shown}, #{clicked})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insertHistory(RECOMMEND_HISTORY history);
+
+    @Update("UPDATE user_recommendation_history SET shown = TRUE WHERE username = #{username} AND torrent_id = #{torrentId}")
+    int markAsShown(@Param("username") String username, @Param("torrentId") Integer torrentId);
+
+    @Update("UPDATE user_recommendation_history SET clicked = TRUE WHERE username = #{username} AND torrent_id = #{torrentId}")
+    int markAsClicked(@Param("username") String username, @Param("torrentId") Integer torrentId);
+
+    @Select("SELECT COUNT(*) FROM user_recommendation_history WHERE username = #{username} AND torrent_id = #{torrentId}")
+    int existsByUserAndTorrent(@Param("username") String username, @Param("torrentId") Integer torrentId);
+}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
index fcb26d8..deb43fc 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
@@ -73,4 +73,11 @@
     // 删除Torrent
     @Delete("DELETE FROM torrent WHERE id = #{id}")
     int deleteTorrent(int id);
+
+    @Select("SELECT * FROM torrent WHERE id = #{torrentId}")
+    TORRENT findById(@Param("torrentId") Integer torrentId);
+
+    @Select("SELECT * FROM torrent ORDER BY like_count DESC LIMIT #{limit}")
+    List<TORRENT> findPopularTorrents(@Param("limit") int limit);
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
index 9204b6c..282b8f1 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
@@ -22,6 +22,8 @@
     @Select("SELECT username, authority, level, registTime, lastLogin, upload, download, shareRate, magicPoints FROM user")
     List<USER> selectAllUsers();
 
+    @Select("SELECT * FROM user WHERE username = #{username}")
+    USER findByUsername(@Param("username") String username);
 
     // 注册用户
     @Insert("INSERT INTO user (username, password, registTime) " +
diff --git a/src/main/java/com/ptp/ptplatform/service/RecommenderService.java b/src/main/java/com/ptp/ptplatform/service/RecommenderService.java
new file mode 100644
index 0000000..115c125
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/RecommenderService.java
@@ -0,0 +1,14 @@
+package com.ptp.ptplatform.service;
+
+import com.ptp.ptplatform.entity.TORRENT;
+import java.util.*;
+
+
+public interface RecommenderService {
+    List<TORRENT> recommendForUser(String username, int limit);
+    List<TORRENT> getSimilarTorrents(Integer torrentId, int limit);
+    List<TORRENT> getPopularTorrents(int limit);
+
+    void markRecommendationAsShown(String username, Integer torrentId);
+    void markRecommendationAsClicked(String username, Integer torrentId);
+}
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/RecommenderServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/RecommenderServiceImpl.java
new file mode 100644
index 0000000..11221bf
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/RecommenderServiceImpl.java
@@ -0,0 +1,171 @@
+package com.ptp.ptplatform.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ptp.ptplatform.entity.DOWNLOAD_TORRENT;
+import com.ptp.ptplatform.entity.RECOMMEND_HISTORY;
+import com.ptp.ptplatform.entity.TORRENT;
+import com.ptp.ptplatform.mapper.DownloadTorrentMapper;
+import com.ptp.ptplatform.mapper.RecommendHistoryMapper;
+import com.ptp.ptplatform.mapper.TorrentMapper;
+import com.ptp.ptplatform.mapper.UserMapper;
+import com.ptp.ptplatform.service.RecommenderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+// src/main/java/com/yourpackage/service/impl/RecommenderServiceImpl.java
+@Service
+public class RecommenderServiceImpl implements RecommenderService {
+
+    private final TorrentMapper torrentRepository;
+    private final DownloadTorrentMapper downloadRepository;
+    private final UserMapper userRepository;
+    private final RecommendHistoryMapper historyRepository;
+
+    @Autowired
+    public RecommenderServiceImpl(TorrentMapper torrentRepository,
+                                  DownloadTorrentMapper downloadRepository,
+                                  UserMapper userRepository,
+                                  RecommendHistoryMapper historyRepository) {
+        this.torrentRepository = torrentRepository;
+        this.downloadRepository = downloadRepository;
+        this.userRepository = userRepository;
+        this.historyRepository = historyRepository;
+    }
+
+    @Override
+    public List<TORRENT> recommendForUser(String username, int limit) {
+        // 1. 获取用户已经推荐过的资源ID
+        Set<Integer> alreadyRecommended = historyRepository.findRecommendedTorrentIdsByUser(username);
+
+        // 2. 获取用户已经下载过的资源ID
+        Set<Integer> alreadyDownloaded = getDownloadedTorrentIds(username);
+
+        // 3. 合并排除集合
+        Set<Integer> excludedIds = new HashSet<>();
+        excludedIds.addAll(alreadyRecommended);
+        excludedIds.addAll(alreadyDownloaded);
+
+        // 4. 获取原始推荐结果（80%）
+        List<TORRENT> originalRecommendations = getOriginalRecommendations(username,
+                (int)(limit * 0.8), excludedIds);
+
+        // 5. 获取随机推荐（20%），同样排除已推荐和已下载的
+        List<TORRENT> randomRecommendations = getRandomRecommendations(
+                limit - originalRecommendations.size(), excludedIds);
+
+        // 6. 合并结果
+        List<TORRENT> finalRecommendations = new ArrayList<>();
+        finalRecommendations.addAll(originalRecommendations);
+        finalRecommendations.addAll(randomRecommendations);
+        Collections.shuffle(finalRecommendations);
+
+        // 7. 记录本次推荐
+        recordRecommendations(username, finalRecommendations);
+
+        return finalRecommendations.stream().limit(limit).collect(Collectors.toList());
+    }
+
+    private Set<Integer> getDownloadedTorrentIds(String username) {
+        return downloadRepository.findByUsername(username).stream()
+                .map(DOWNLOAD_TORRENT::getTorrentid)
+                .collect(Collectors.toSet());
+    }
+
+    private List<TORRENT> getOriginalRecommendations(String username, int limit, Set<Integer> excludedIds) {
+        // 1. 获取用户下载历史
+        List<DOWNLOAD_TORRENT> userDownloads = downloadRepository.findByUsername(username);
+        if (userDownloads.isEmpty()) {
+            return getPopularTorrents(limit, excludedIds);
+        }
+
+        // 2. 收集相似用户
+        Set<String> similarUsers = new HashSet<>();
+        for (DOWNLOAD_TORRENT download : userDownloads) {
+            List<String> users = downloadRepository.findUsersByTorrentId(download.getTorrentid());
+            similarUsers.addAll(users);
+        }
+        similarUsers.remove(username);
+
+        // 3. 获取相似用户喜欢的种子（排除已推荐和已下载的）
+        Map<Integer, Integer> torrentScores = new HashMap<>();
+        for (String similarUser : similarUsers) {
+            downloadRepository.findByUsername(similarUser).stream()
+                    .filter(d -> !excludedIds.contains(d.getTorrentid()))
+                    .forEach(d -> torrentScores.merge(d.getTorrentid(), 1, Integer::sum));
+        }
+
+        // 4. 排序并获取推荐
+        return torrentScores.entrySet().stream()
+                .sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
+                .limit(limit)
+                .map(e -> torrentRepository.findById(e.getKey()))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    private List<TORRENT> getRandomRecommendations(int count, Set<Integer> excludedIds) {
+        QueryWrapper<TORRENT> query = new QueryWrapper<>();
+        if (!excludedIds.isEmpty()) {
+            query.notIn("id", excludedIds);
+        }
+        return torrentRepository.selectList(query
+                .orderByAsc("RAND()")
+                .last("LIMIT " + count));
+    }
+
+    private List<TORRENT> getPopularTorrents(int limit, Set<Integer> excludedIds) {
+        QueryWrapper<TORRENT> query = new QueryWrapper<>();
+        if (!excludedIds.isEmpty()) {
+            query.notIn("id", excludedIds);
+        }
+        return torrentRepository.selectList(query
+                .orderByDesc("like_count")
+                .last("LIMIT " + limit));
+    }
+
+    private void recordRecommendations(String username, List<TORRENT> recommendations) {
+        List<RECOMMEND_HISTORY> newRecords = recommendations.stream()
+                .filter(t -> historyRepository.existsByUserAndTorrent(username, t.getId()) == 0)
+                .map(t -> new RECOMMEND_HISTORY(username, t.getId()))
+                .collect(Collectors.toList());
+
+        if (!newRecords.isEmpty()) {
+            newRecords.forEach(historyRepository::insert);
+        }
+    }
+
+    @Override
+    public List<TORRENT> getSimilarTorrents(Integer torrentId, int limit) {
+        TORRENT target = torrentRepository.findById(torrentId);
+        if (target == null) {
+            return Collections.emptyList();
+        }
+
+        return torrentRepository.selectList(new QueryWrapper<TORRENT>()
+                .eq("category", target.getCategory())
+                .ne("id", torrentId)
+                .orderByDesc("like_count")
+                .last("LIMIT " + limit));
+    }
+
+    @Override
+    public List<TORRENT> getPopularTorrents(int limit) {
+        return torrentRepository.selectList(new QueryWrapper<TORRENT>()
+                .orderByDesc("like_count")
+                .last("LIMIT " + limit));
+    }
+
+    @Override
+    public void markRecommendationAsShown(String username, Integer torrentId) {
+        historyRepository.markAsShown(username, torrentId);
+    }
+
+    @Override
+    public void markRecommendationAsClicked(String username, Integer torrentId) {
+        historyRepository.markAsClicked(username, torrentId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/utils/SimilarityUtil.java b/src/main/java/com/ptp/ptplatform/utils/SimilarityUtil.java
new file mode 100644
index 0000000..db3cd69
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/utils/SimilarityUtil.java
@@ -0,0 +1,54 @@
+package com.ptp.ptplatform.utils;
+
+import java.util.*;
+
+public class SimilarityUtil {
+
+    /**
+     * 计算用户相似度 (余弦相似度)
+     */
+    public static double calculateUserSimilarity(Map<Integer, Integer> user1Downloads,
+                                                 Map<Integer, Integer> user2Downloads) {
+        Set<Integer> commonTorrents = new HashSet<>(user1Downloads.keySet());
+        commonTorrents.retainAll(user2Downloads.keySet());
+
+        if (commonTorrents.isEmpty()) return 0.0;
+
+        double dotProduct = 0.0;
+        double norm1 = 0.0;
+        double norm2 = 0.0;
+
+        // 计算共同下载的种子的点积和范数
+        for (Integer torrentId : commonTorrents) {
+            dotProduct += user1Downloads.get(torrentId) * user2Downloads.get(torrentId);
+        }
+
+        // 计算用户1的范数
+        for (Integer count : user1Downloads.values()) {
+            norm1 += Math.pow(count, 2);
+        }
+
+        // 计算用户2的范数
+        for (Integer count : user2Downloads.values()) {
+            norm2 += Math.pow(count, 2);
+        }
+
+        return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
+    }
+
+    /**
+     * 计算种子相似度 (基于共同下载用户)
+     */
+    public static double calculateTorrentSimilarity(Set<Integer> torrent1Users,
+                                                    Set<Integer> torrent2Users) {
+        Set<Integer> intersection = new HashSet<>(torrent1Users);
+        intersection.retainAll(torrent2Users);
+
+        Set<Integer> union = new HashSet<>(torrent1Users);
+        union.addAll(torrent2Users);
+
+        if (union.isEmpty()) return 0.0;
+
+        return (double) intersection.size() / union.size();
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
index 1201f02..c6a2c3d 100644
--- a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
@@ -66,28 +66,6 @@
     }
 
     @Test
-    void info_Success() {
-        // Arrange
-        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("Bearer validToken")).thenReturn(mockClaims);
-            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
-
-            // Act
-            Result result = userController.userInfo(request);
-
-            // Assert
-            assertTrue(result.isSuccess());
-            assertNotNull(result.getData().get("username"));
-            assertEquals(testUser.getUsername(), result.getData().get("username"));
-        }
-    }
-
-    @Test
     void login_Success() {
         // Arrange
         when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
@@ -190,133 +168,6 @@
     }
 
     @Test
-    void allowDownload_Success() {
-        // Arrange
-        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("Bearer validToken")).thenReturn(mockClaims);
-            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
-
-            // Act
-            Result result = userController.allowDownload(request);
-
-            // Assert
-            assertTrue(result.isSuccess());
-            Map<String, Object> data = result.getData();
-            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("Bearer validToken");
-
-        Claims mockClaims = mock(Claims.class);
-        when(mockClaims.getSubject()).thenReturn(testUser.getUsername());
-
-        try (MockedStatic<JwtUtils> mockedJwtUtils = mockStatic(JwtUtils.class)) {
-            mockedJwtUtils.when(() -> JwtUtils.getClaimByToken("Bearer validToken")).thenReturn(mockClaims);
-            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
-
-            Map<String, String> passwordMap = new HashMap<>();
-            passwordMap.put("oldPassword", testUser.getPassword());
-            passwordMap.put("newPassword", "newPassword123");
-
-            // Act
-            Result result = userController.updatePassword(request, passwordMap);
-
-            // Assert
-            assertTrue(result.isSuccess());
-            assertEquals("修改密码成功", result.getMessage());
-            verify(userMapper, times(1)).updateUser(testUser);
-        }
-    }
-
-    @Test
-    void updatePassword_Fail_WrongOldPassword() {
-        // Arrange
-        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("Bearer validToken")).thenReturn(mockClaims);
-            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
-
-            Map<String, String> passwordMap = new HashMap<>();
-            passwordMap.put("oldPassword", "wrongPassword");
-            passwordMap.put("newPassword", "newPassword123");
-
-            // Act
-            Result result = userController.updatePassword(request, passwordMap);
-
-            // Assert
-            assertFalse(result.isSuccess());
-            assertEquals("原密码不正确", result.getMessage());
-            verify(userMapper, never()).updateUser(any());
-        }
-    }
-
-    @Test
-    void getUserInRequest_Success() {
-        // Arrange
-        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("Bearer validToken")).thenReturn(mockClaims);
-            when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
-
-            // Act
-            USER result = userController.getUserInRequest(request);
-
-            // Assert
-            assertEquals(testUser, result);
-        }
-    }
-
-    @Test
-    public void testSearchUser() {
-        // Arrange
-        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("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.getUsername(), "zzz")).thenReturn(mockResults);
-
-            // 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());
-        }
-    }
-
-    @Test
     public void testGetAllUser() {
         // Arrange
         List<USER> mockUsers = Arrays.asList(
diff --git a/uploads/2a385251-07dd-4f77-824b-5a669233208a.jpg b/uploads/2a385251-07dd-4f77-824b-5a669233208a.jpg
new file mode 100644
index 0000000..a6d7f38
--- /dev/null
+++ b/uploads/2a385251-07dd-4f77-824b-5a669233208a.jpg
@@ -0,0 +1 @@
+test image
\ No newline at end of file
diff --git a/uploads/454cbfca-a769-4042-b14d-fd0834971733.jpg b/uploads/454cbfca-a769-4042-b14d-fd0834971733.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/454cbfca-a769-4042-b14d-fd0834971733.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/48a9fe5b-16e7-4c13-9ad9-187d567de73f.png b/uploads/48a9fe5b-16e7-4c13-9ad9-187d567de73f.png
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/uploads/48a9fe5b-16e7-4c13-9ad9-187d567de73f.png
@@ -0,0 +1 @@
+
\ No newline at end of file
