diff --git a/src/main/java/com/pt/service/CommentService.java b/src/main/java/com/pt/service/CommentService.java
index 3d8b7dd..1ac817e 100644
--- a/src/main/java/com/pt/service/CommentService.java
+++ b/src/main/java/com/pt/service/CommentService.java
@@ -17,11 +17,16 @@
         this.commentRepository = commentRepository;
     }
 
-    public void addComment(String content, String username, int postId) {
+    public void addComment(String content, String username, int postId, Integer reviewer) {
+        System.out.println("Adding comment: " + content + " by " + username + " on post ID: " + postId + " with reviewer ID: " + reviewer);
         Comment comment = new Comment();
         comment.setContent(content);
         comment.setWriter(username);
         comment.setParentPost(postId);
+        if(reviewer != null) {
+            System.out.println("Setting reviewer ID: " + reviewer);
+            comment.setReviewer(reviewer);
+        }
         commentRepository.save(comment);
     }
 
@@ -37,4 +42,8 @@
         );
         return comments;
     }
+
+    public Comment getCommentById(int commentId) {
+        return commentRepository.findById(commentId).orElse(null);
+    }
 }
diff --git a/src/main/java/com/pt/service/TorrentService.java b/src/main/java/com/pt/service/TorrentService.java
index 1fdb700..ad38622 100644
--- a/src/main/java/com/pt/service/TorrentService.java
+++ b/src/main/java/com/pt/service/TorrentService.java
@@ -18,6 +18,10 @@
     private TorrentMetaRepository torrentMetaRepository;
 
     public TorrentMeta parseAndSaveTorrent(byte[] torrentBytes) throws Exception {
+        System.out.println("111");
+        for (byte b : torrentBytes) {
+            System.out.println(b);
+        }
         Map<String, Object> torrentDict = (Map<String, Object>) BencodeCodec.decode(torrentBytes);
         if (!torrentDict.containsKey("info")) {
             throw new IllegalArgumentException("Invalid torrent file: missing 'info' dictionary");
@@ -25,12 +29,14 @@
 
         Map<String, Object> infoDict = (Map<String, Object>) torrentDict.get("info");
 
+        System.out.println(222);
         // 计算 info_hash
         byte[] infoEncoded = BencodeCodec.encode(infoDict);
         MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
         byte[] infoHashBytes = sha1.digest(infoEncoded);
         String infoHash = bytesToHex(infoHashBytes);
 
+        System.out.println(333);
         // 获取文件名，大小等
         String name = (String) infoDict.get("name");
         long length = 0;
diff --git a/src/main/java/com/pt/service/TrackerService.java b/src/main/java/com/pt/service/TrackerService.java
index 191479b..8a654d0 100644
--- a/src/main/java/com/pt/service/TrackerService.java
+++ b/src/main/java/com/pt/service/TrackerService.java
@@ -2,10 +2,13 @@
 
 import com.pt.entity.PeerInfoEntity;
 import com.pt.entity.TorrentMeta;
+import com.pt.entity.User;
 import com.pt.exception.ResourceNotFoundException;
 import com.pt.repository.PeerInfoRepository;
 import com.pt.repository.TorrentMetaRepository;
 import com.pt.utils.BencodeCodec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -18,6 +21,8 @@
 @Service
 public class TrackerService {
 
+    private static final Logger logger = LoggerFactory.getLogger(TrackerService.class);
+
     @Autowired
     private TorrentMetaRepository torrentMetaRepository;
 
@@ -26,6 +31,9 @@
 
     @Autowired
     private TorrentStatsService statsService;
+    
+    @Autowired
+    private UserService userService;
 
     @Transactional
     public byte[] handleAnnounce(Map<String, String[]> params, String ipAddress) {
@@ -39,6 +47,7 @@
             // 解析参数
             String infoHash = decodeParam(params.get("info_hash")[0]);
             String peerId = decodeParam(params.get("peer_id")[0]);
+            String username = decodeParam(params.get("username")[0]);
             int port = Integer.parseInt(params.get("port")[0]);
 
             // 获取事件类型
@@ -57,8 +66,16 @@
 
             // 创建或更新 peer 信息
             PeerInfoEntity peer = findOrCreatePeer(peerId, infoHash);
+            
+            // 计算流量增量
+            long uploadedDelta = uploaded - peer.getUploaded();
+            long downloadedDelta = downloaded - peer.getDownloaded();
+            
+            // 更新用户总流量
+            updateUserTraffic(username, uploadedDelta, downloadedDelta);
 
             // 设置 peer 属性
+            peer.setUsername(username);
             setPeerProperties(peer, ipAddress, port, uploaded, downloaded, left);
 
             // 处理事件类型
@@ -81,6 +98,34 @@
         }
     }
 
+    // 添加更新用户流量的方法
+    @Transactional
+    private void updateUserTraffic(String username, long uploadedDelta, long downloadedDelta) {
+        if (uploadedDelta <= 0 && downloadedDelta <= 0) {
+            return; // 没有新的流量，不需要更新
+        }
+
+        User user = userService.findByUsername(username);
+        if (user != null) {
+            long oldUploaded = user.getUploaded();
+            long oldDownloaded = user.getDownloaded();
+            
+            user.setUploaded(oldUploaded + uploadedDelta);
+            user.setDownloaded(oldDownloaded + downloadedDelta);
+            userService.save(user);
+            
+            // 更新用户等级
+            userService.updateUserLevel(user.getUid());
+            
+            logger.info("用户 {} 流量更新: 上传 {} -> {} (+{}), 下载 {} -> {} (+{})", 
+                username,
+                oldUploaded, user.getUploaded(), uploadedDelta,
+                oldDownloaded, user.getDownloaded(), downloadedDelta);
+        } else {
+            logger.warn("尝试更新不存在的用户流量: {}", username);
+        }
+    }
+
     // 辅助方法：获取事件参数
     private String getEventParam(Map<String, String[]> params) {
         return params.containsKey("event") ?
@@ -96,7 +141,15 @@
     // 辅助方法：查找或创建 peer
     private PeerInfoEntity findOrCreatePeer(String peerId, String infoHash) {
         return peerInfoRepository.findByPeerIdAndInfoHash(peerId, infoHash)
-                .orElseGet(PeerInfoEntity::new);
+                .orElseGet(() -> {
+                    PeerInfoEntity newPeer = new PeerInfoEntity();
+                    newPeer.setPeerId(peerId);
+                    newPeer.setInfoHash(infoHash);
+                    newPeer.setActive(true);
+                    newPeer.setStatus("downloading");
+                    newPeer.setLastSeen(LocalDateTime.now());
+                    return newPeer;
+                });
     }
 
     // 辅助方法：设置 peer 属性
