diff --git a/ruoyi-admin/src/main/java/com/ruoyi/announce/controller/AnnounceController.java b/ruoyi-admin/src/main/java/com/ruoyi/announce/controller/AnnounceController.java
index f3bd624..93c3f50 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/announce/controller/AnnounceController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/announce/controller/AnnounceController.java
@@ -1,8 +1,17 @@
 package com.ruoyi.announce.controller;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.announce.util.BencodeEncoder;
+import com.ruoyi.authentication.domain.SysUserPasskey;
+import com.ruoyi.authentication.service.ISysUserPasskeyService;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.announce.service.IAnnounceService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.SecurityUtils;
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.net.URLCodec;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
@@ -10,52 +19,182 @@
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 public class AnnounceController extends BaseController {
+    // 在你的 Controller 中：
 
     @Autowired
     private IAnnounceService announceService;
 
+    @Autowired
+    private BencodeEncoder bencodeEncoder;
+
+
+
+
+
+
+    private byte[] decodeInfoHashAndPeerId(String param) {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        for (int i = 0; i < param.length(); ) {
+            char c = param.charAt(i);
+            if (c == '%' && i + 2 < param.length()) {
+                char hi = param.charAt(i + 1);
+                char lo = param.charAt(i + 2);
+                if (isHexDigit(hi) && isHexDigit(lo)) {
+                    int value = Character.digit(hi, 16) << 4 | Character.digit(lo, 16);
+                    bos.write(value);
+                    i += 3;
+                    continue;
+                }
+            }
+            // 不是合法的 %xx，直接跳过或处理为异常字符
+            bos.write((byte) c); // 或者 throw new IllegalArgumentException(...)
+            i++;
+        }
+        return bos.toByteArray();
+    }
+
+    private boolean isHexDigit(char c) {
+        return (c >= '0' && c <= '9') ||
+                (c >= 'A' && c <= 'F') ||
+                (c >= 'a' && c <= 'f');
+    }
+
+
+
+
     /**
      * BT Tracker /announce 接口
      * 接收客户端（qBittorrent 等）发来的 announce 请求，返回 bencoded peers 列表
      */
-    @GetMapping(value = "/announce", produces = "application/x-bittorrent")
-    public void announce(
-            HttpServletRequest request,
-            HttpServletResponse response,
-            @RequestParam("info_hash") String infoHashParam,
-            @RequestParam("peer_id")   String peerIdParam,
-            @RequestParam("port")      int port,
-            @RequestParam("uploaded")  long uploaded,
-            @RequestParam("downloaded") long downloaded,
-            @RequestParam("left")      long left,
-            @RequestParam(value = "event",    required = false) String event,
-            @RequestParam("passkey")   String passkey
-    ) throws Exception {
-        // 1. URL Decode 得到原始二进制
-        byte[] infoHash = URLDecoder.decode(infoHashParam, StandardCharsets.ISO_8859_1.name())
-                .getBytes(StandardCharsets.ISO_8859_1);
-        byte[] peerId   = URLDecoder.decode(peerIdParam,   StandardCharsets.ISO_8859_1.name())
-                .getBytes(StandardCharsets.ISO_8859_1);
 
-        // 2. 处理 announce 请求（验证 passkey，更新 peer 列表，获取 peers 信息）
+    @GetMapping(value = "/announce", produces = "application/x-bittorrent")
+    public void announce(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // —— 打印所有参数 ——
+        Map<String, String[]> parameterMap = request.getParameterMap();
+        System.out.println("—— 请求参数列表 ——");
+        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
+            String paramName = entry.getKey();
+            String[] paramValues = entry.getValue();
+            System.out.println(paramName + " = " + Arrays.toString(paramValues));
+        }
+
+
+        // —— 4. 获取参数（不使用 @RequestParam） ——
+        String infoHashParam = request.getParameter("info_hash");
+        String peerIdParam   = request.getParameter("peer_id");
+        String portStr       = request.getParameter("port");
+        String uploadedStr   = request.getParameter("uploaded");
+        String downloadedStr = request.getParameter("downloaded");
+        String leftStr       = request.getParameter("left");
+        String event         = request.getParameter("event");
+        String passkey       = request.getParameter("passkey");
+        String ip            = request.getRemoteAddr();
+
+        System.out.println("Received request with parameters:");
+        System.out.println("info_hash: " + infoHashParam);
+        System.out.println("peer_id: " + peerIdParam);
+        System.out.println("port: " + portStr);
+        System.out.println("uploaded: " + uploadedStr);
+        System.out.println("downloaded: " + downloadedStr);
+        System.out.println("left: " + leftStr);
+        System.out.println("event: " + event);
+        System.out.println("passkey: " + passkey);
+        System.out.println("client IP: " + ip);
+
+
+
+
+
+
+
+
+        if ((infoHashParam == null && peerIdParam == null && portStr == null &&
+                uploadedStr == null && downloadedStr == null && leftStr == null)) {
+
+            // 只要 passkey 和 ip 不为空，则认为是 heartbeat
+            if (passkey != null && ip != null) {
+                // 处理为心跳请求
+                Map<String, Object> reply = announceService.handleHeartbeat(ip);
+                byte[] bencodeReply = bencodeEncoder.encodeBencode(reply);
+
+                response.setContentType("text/plain");
+                response.getOutputStream().write(bencodeReply);
+                return;
+            }
+
+            // 如果不是心跳，就是错误请求
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+            response.setContentType("text/plain");
+            response.getWriter().write("Missing required announce parameters.");
+            return;
+        }
+
+        // —— 5. 转换参数类型 ——
+        assert portStr != null;
+        int port = Integer.parseInt(portStr);
+        long uploaded = Long.parseLong(uploadedStr);
+        long downloaded = Long.parseLong(downloadedStr);
+        long left = Long.parseLong(leftStr);
+
+        // 确保 URL 解码不会失败，使用更健壮的方法
+        assert infoHashParam != null;
+        byte[] infoHash = decodeInfoHashAndPeerId(infoHashParam);
+        byte[] peerId   = decodeInfoHashAndPeerId(peerIdParam);
+
+        // —— 7. 调用业务逻辑处理 ——
         Map<String, Object> reply = announceService.handleAnnounce(
                 infoHash, peerId, port, uploaded, downloaded, left, event, passkey,
                 request.getRemoteAddr()
         );
 
-        // 3. bencode 编码并返回给客户端
+        // —— 8. 返回 Bencode 编码的 tracker 响应 ——
         response.setStatus(HttpServletResponse.SC_OK);
         response.setHeader("Content-Type", "application/x-bittorrent");
         try (var out = response.getOutputStream()) {
-            byte[] bencoded = announceService.encodeBencode(reply);
+            byte[] bencoded = bencodeEncoder.encodeBencode(reply);
+
             out.write(bencoded);
             out.flush();
         }
     }
+    // Scrape 接口
+    @GetMapping(value = "/scrape", produces = "application/x-bittorrent")
+    public void scrape(@RequestParam("info_hash") String[] infoHashes, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        // 收集所有 info_hash 对应的统计数据
+        Map<String, Object> scrapeStats = announceService.handleScrape(infoHashes);
+
+        // 将统计数据转换为 Bencode 格式并返回
+        byte[] bencodedReply = bencodeEncoder.encodeBencode(scrapeStats);
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setHeader("Content-Type", "application/x-bittorrent");
+        try (var out = response.getOutputStream()) {
+            out.write(bencodedReply);
+            out.flush();
+        }
+    }
+
+    /**
+     * 查询当前所有活跃的 Peer 节点
+     */
+    @GetMapping(value = "/peers", produces = "application/json")
+    public TableDataInfo getAllPeers() {
+        List<Map<String, Object>> peers = announceService.getAllPeers();
+        System.out.println(peers);
+        return getDataTable(peers);
+    }
 }
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/announce/service/IAnnounceService.java b/ruoyi-admin/src/main/java/com/ruoyi/announce/service/IAnnounceService.java
index e6e7aa7..c005cc8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/announce/service/IAnnounceService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/announce/service/IAnnounceService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.announce.service;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -38,9 +39,11 @@
             String passkey,
             String ip
     ) throws Exception;
+    List<Map<String, Object>> getAllPeers();
 
-    /**
-     * 将一个 Map<String,Object> 编码成 bencode 二进制
-     */
-    byte[] encodeBencode(Map<String, Object> reply) throws IOException;
+    // 处理 scrape 请求
+    Map<String, Object> handleScrape(String[] infoHashes);
+
+    Map<String, Object> handleHeartbeat(String ip) throws IOException;
+
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/announce/service/impl/AnnounceServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/announce/service/impl/AnnounceServiceImpl.java
index f80050f..e9cdce8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/announce/service/impl/AnnounceServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/announce/service/impl/AnnounceServiceImpl.java
@@ -1,132 +1,332 @@
 package com.ruoyi.announce.service.impl;
 
 import com.ruoyi.announce.service.IAnnounceService;
-import com.ruoyi.announce.util.BencodeEncoder;
+import com.ruoyi.authentication.domain.SysUserPasskey;
+import com.ruoyi.authentication.domain.UserScore;
+import com.ruoyi.authentication.service.ISysUserPasskeyService;
+import com.ruoyi.authentication.service.IUserScoreService;
 import com.ruoyi.common.core.redis.RedisCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import static java.lang.Long.parseLong;
+
 @Service
 public class AnnounceServiceImpl implements IAnnounceService {
 
-    private static final int ANNOUNCE_INTERVAL = 1800; // 秒
+    private static final int ANNOUNCE_INTERVAL = 1800;
+    private static final int PEER_CACHE_DURATION_MIN = 60;
+    private static final int MAX_SEEDERS = 25;
+    private static final int MAX_LEECHERS = 50;
+    private static final int UPLOAD_WEIGHT = 70;
+    private static final int DOWNLOAD_WEIGHT = 30;
 
     @Autowired
     private RedisCache redisCache;
+    @Autowired
+    private ISysUserPasskeyService passkeyService;
+    @Autowired
+    private IUserScoreService userScoreService;
 
     @Override
-    public Map<String, Object> handleAnnounce(
-            byte[] infoHash,
-            byte[] peerId,
-            int port,
-            long uploaded,
-            long downloaded,
-            long left,
-            String event,
-            String passkey,
-            String ip
-    ) throws Exception {
-        // 1. 转 hex 作为 Redis key 前缀
-        String infoHashHex = bytesToHex(infoHash);
-        String peerIdStr   = new String(peerId, StandardCharsets.ISO_8859_1);
-
-        // 2. 校验 passkey（可根据业务到 MySQL 查 userId，此处略过）
-
-        // 3. 在 Redis 中记录/刷新此 peer 的信息
-        //    使用 Hash 存储详情，TTL 120 秒
-        String peerKey = "peer:" + infoHashHex + ":" + peerIdStr;
-        Map<String, Object> peerData = new HashMap<>();
-        peerData.put("ip",         ip);
-        peerData.put("port",       port);
-        peerData.put("uploaded",   uploaded);
-        peerData.put("downloaded", downloaded);
-        peerData.put("left",       left);
-        peerData.put("lastSeen",   System.currentTimeMillis());
-        redisCache.setCacheMap(peerKey, peerData);
-        redisCache.expire(peerKey, 120, TimeUnit.SECONDS);
-
-        // 4. 从 Redis 中扫描所有同 info_hash 的 peer
-        Collection<String> keys = redisCache.keys("peer:" + infoHashHex + ":*");
-        List<byte[]> peersBin = new ArrayList<>(keys.size());
-        for (String key : keys) {
-            @SuppressWarnings("unchecked")
-            Map<String, Object> data = (Map<String, Object>) redisCache.getCacheMap(key);
-            String peerIp = (String) data.get("ip");
-            int    peerPort = ((Number) data.get("port")).intValue();
-            peersBin.add(encodePeer(peerIp, peerPort));
-            if (peersBin.size() >= 50) break;  // 最多返回 50 个 peers
+    public Map<String, Object> handleAnnounce(byte[] infoHash,
+                                              byte[] peerId,
+                                              int port,
+                                              long uploaded,
+                                              long downloaded,
+                                              long left,
+                                              String event,
+                                              String passkey,
+                                              String ip) throws IOException {
+        if (passkey == null) {
+            return Collections.emptyMap();
         }
 
-        // 5. 构造返回数据 Map（有序）
-        Map<String, Object> reply = new LinkedHashMap<>();
-        reply.put("interval", ANNOUNCE_INTERVAL);
-        reply.put("min interval", ANNOUNCE_INTERVAL / 2);
-        reply.put("complete",   countSeeders(infoHashHex));
-        reply.put("incomplete", countLeechers(infoHashHex));
-        reply.put("peers",      peersBin);
+        String infoHashHex = toHex(infoHash);
+        String peerKey = buildPeerKey(peerId);
+        String seederSet = buildZSetKey(infoHashHex, "seeders");
+        String leecherSet = buildZSetKey(infoHashHex, "leechers");
 
-        return reply;
-    }
-
-    @Override
-    public byte[] encodeBencode(Map<String, Object> reply) throws IOException {
-        BencodeEncoder encoder = new BencodeEncoder();
-        return encoder.encodeBencode(reply);
-    }
-
-    // —— 辅助方法 —— //
-
-    /** 统计 left == 0 的 Seeder 数 */
-    private int countSeeders(String infoHashHex) {
-        int count = 0;
-        for (String key : redisCache.keys("peer:" + infoHashHex + ":*")) {
-            @SuppressWarnings("unchecked")
-            Map<String, Object> data = (Map<String, Object>) redisCache.getCacheMap(key);
-            long left = ((Number) data.get("left")).longValue();
-            if (left == 0) count++;
+        if ("stopped".equals(event)) {
+            return handleStopEvent(peerKey, seederSet, leecherSet, passkey, uploaded, downloaded);
         }
-        return count;
+
+        cachePeerState(peerKey, uploaded, downloaded, left, ip, port);
+        updatePeerRanking(seederSet, leecherSet, peerKey, left == 0);
+
+        List<byte[]> peerList = selectPeers(seederSet, leecherSet, peerKey, left == 0);
+        byte[] peersBinary = flattenPeers(peerList);
+
+        return buildResponse(seederSet, leecherSet, peersBinary);
     }
 
-    /** 统计 left > 0 的 Leecher 数 */
-    private int countLeechers(String infoHashHex) {
-        int count = 0;
-        for (String key : redisCache.keys("peer:" + infoHashHex + ":*")) {
-            @SuppressWarnings("unchecked")
-            Map<String, Object> data = (Map<String, Object>) redisCache.getCacheMap(key);
-            long left = ((Number) data.get("left")).longValue();
-            if (left > 0) count++;
+    private Map<String, Object> handleStopEvent(String peerKey,
+                                                String seederSet,
+                                                String leecherSet,
+                                                String passkey,
+                                                long uploaded,
+                                                long downloaded) {
+        redisCache.deleteObject(peerKey);
+        redisCache.zRemove(seederSet, peerKey);
+        redisCache.zRemove(leecherSet, peerKey);
+
+        Optional<Long> userId = resolveUserId(passkey);
+        userId.ifPresent(id -> updateUserScore(id, uploaded, downloaded));
+        return Collections.emptyMap();
+    }
+
+    private void cachePeerState(String peerKey,
+                                long uploaded,
+                                long downloaded,
+                                long left,
+                                String ip,
+                                int port) {
+        Map<String, String> data = new HashMap<>();
+        data.put("ip", ip);
+        data.put("port", String.valueOf(port));
+        data.put("uploaded", String.valueOf(uploaded));
+        data.put("downloaded", String.valueOf(downloaded));
+        data.put("left", String.valueOf(left));
+        data.put("lastSeen", String.valueOf(System.currentTimeMillis()));
+
+        redisCache.setCacheMap(peerKey, data);
+        redisCache.expire(peerKey, PEER_CACHE_DURATION_MIN, TimeUnit.MINUTES);
+    }
+
+    private void updatePeerRanking(String seederSet,
+                                   String leecherSet,
+                                   String peerKey,
+                                   boolean isSeeder) {
+        String sourceSet = isSeeder ? leecherSet : seederSet;
+        String targetSet = isSeeder ? seederSet : leecherSet;
+
+        redisCache.zRemove(sourceSet, peerKey);
+        redisCache.zAdd(targetSet, peerKey, System.currentTimeMillis());
+    }
+
+    private List<byte[]> selectPeers(String seederSet,
+                                     String leecherSet,
+                                     String selfKey,
+                                     boolean isSeeder) throws IOException {
+        Set<String> candidates = new LinkedHashSet<>();
+        if (isSeeder) {
+            candidates.addAll(redisCache.zRange(leecherSet, 0, MAX_LEECHERS));
+        } else {
+            candidates.addAll(Optional.ofNullable(redisCache.zRange(seederSet, 0, MAX_SEEDERS)).orElse(Collections.emptySet()));
+            candidates.addAll(Optional.ofNullable(redisCache.zRange(leecherSet, 0, MAX_LEECHERS)).orElse(Collections.emptySet()));
         }
-        return count;
+
+        List<byte[]> peers = new ArrayList<>();
+        for (String candidateKey : candidates) {
+            if (candidateKey.equals(selfKey)) continue;
+            cachePeerLevel:
+            {
+                Map<String, String> info = redisCache.getCacheMap(candidateKey);
+                String peerIp = info.get("ip");
+                String portStr = info.get("port");
+                if (peerIp == null || peerIp.contains(":") || portStr == null) break cachePeerLevel;
+                peers.add(encodePeer(peerIp, Integer.parseInt(portStr)));
+            }
+        }
+        return peers;
     }
 
-    /** 将 IPv4 + port 编码成 6 字节：4 字节 IP + 2 字节 port */
-    private byte[] encodePeer(String ip, int port) throws Exception {
+    private byte[] flattenPeers(List<byte[]> peerList) throws IOException {
+        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+            for (byte[] peer : peerList) {
+                out.write(peer);
+            }
+            return out.toByteArray();
+        }
+    }
+
+    private Map<String, Object> buildResponse(String seederSet,
+                                              String leecherSet,
+                                              byte[] peersBinary) {
+        Map<String, Object> response = new LinkedHashMap<>();
+        response.put("interval", ANNOUNCE_INTERVAL);
+        response.put("min interval", ANNOUNCE_INTERVAL / 2);
+        response.put("complete", Optional.ofNullable(redisCache.zCard(seederSet)).orElse(0L).intValue());
+        response.put("incomplete", Optional.ofNullable(redisCache.zCard(leecherSet)).orElse(0L).intValue());
+        response.put("peers", peersBinary);
+        return response;
+    }
+
+    private Optional<Long> resolveUserId(String passkey) {
+        SysUserPasskey criteria = new SysUserPasskey(passkey);
+        List<SysUserPasskey> records = passkeyService.selectSysUserPasskeyList(criteria);
+        return records.isEmpty() ? Optional.empty() : Optional.of(records.get(0).getUserId());
+    }
+
+    private void updateUserScore(Long userId, long uploaded, long downloaded) {
+        try {
+            UserScore existing = userScoreService.selectUserScoreByUserId(userId);
+            boolean isNew = existing.getUserId() == null;
+            long totalUploaded = isNew ? uploaded : parseLong(existing.getUploaded()) + uploaded;
+            long totalDownloaded = isNew ? downloaded : parseLong(existing.getDownloaded()) + downloaded;
+            long combinedScore = calculateWeightedScore(totalUploaded, totalDownloaded);
+
+            existing.setUserId(userId);
+            existing.setUploaded(String.valueOf(totalUploaded));
+            existing.setDownloaded(String.valueOf(totalDownloaded));
+            existing.setScore(combinedScore);
+            existing.setUpdatedAt(new Date());
+
+            if (isNew) {
+                userScoreService.insertUserScore(existing);
+            } else {
+                userScoreService.updateUserScore(existing);
+            }
+        } catch (Exception e) {
+            // Log exception properly in production code
+            System.err.println("Failed to update user score: " + e.getMessage());
+        }
+    }
+
+    private long calculateWeightedScore(long uploaded, long downloaded) {
+        return (uploaded * UPLOAD_WEIGHT + downloaded * DOWNLOAD_WEIGHT) / (UPLOAD_WEIGHT + DOWNLOAD_WEIGHT);
+    }
+
+    private String buildPeerKey(byte[] peerId) {
+        return "peer:" + new String(peerId, StandardCharsets.ISO_8859_1);
+    }
+
+    private String buildZSetKey(String infoHashHex, String type) {
+        return String.format("torrent:%s:%s", infoHashHex, type);
+    }
+
+    private String toHex(byte[] data) {
+        char[] hex = "0123456789abcdef".toCharArray();
+        StringBuilder sb = new StringBuilder(data.length * 2);
+        for (byte b : data) {
+            sb.append(hex[(b >> 4) & 0xF]).append(hex[b & 0xF]);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Encode peer address into 6-byte compact representation as per BEP 23
+     */
+    private byte[] encodePeer(String ip, int port) {
         String[] parts = ip.split("\\.");
-        ByteBuffer buf = ByteBuffer.allocate(6);
-        for (int i = 0; i < 4; i++) {
-            buf.put((byte) Integer.parseInt(parts[i]));
+        if (parts.length != 4) return null;
+        ByteBuffer buffer = ByteBuffer.allocate(6);
+        try {
+            for (String part : parts) {
+                int segment = Integer.parseInt(part);
+                if (segment < 0 || segment > 255) return null;
+                buffer.put((byte) segment);
+            }
+            buffer.putShort((short) port);
+            return buffer.array();
+        } catch (NumberFormatException e) {
+            return null;
         }
-        buf.putShort((short) port);
-        return buf.array();
     }
 
-    /** 将字节数组转成十六进制字符串 */
-    private static final char[] HEX = "0123456789abcdef".toCharArray();
-    private String bytesToHex(byte[] bytes) {
-        char[] cs = new char[bytes.length * 2];
-        for (int i = 0; i < bytes.length; i++) {
-            int v = bytes[i] & 0xFF;
-            cs[i * 2]     = HEX[v >>> 4];
-            cs[i * 2 + 1] = HEX[v & 0x0F];
+    @Override
+    public Map<String, Object> handleScrape(String[] infoHashes) {
+        Map<String, Object> stats = new HashMap<>();
+        for (String hash : infoHashes) {
+            String key = hash.toLowerCase();
+            Map<String, Integer> countMap = Map.of(
+                    "complete", getZCardAsInt(buildZSetKey(key, "seeders")),
+                    "incomplete", getZCardAsInt(buildZSetKey(key, "leechers")),
+                    "downloaded", 0
+            );
+            stats.put(hash, countMap);
         }
-        return new String(cs);
+        return stats;
     }
-}
+
+    /**
+     * 查询当前所有活跃的 Peer 节点，包含详细字段
+     */
+    @Override
+    public Map<String, Object> handleHeartbeat( String ip) {
+        // 延长该 IP 下所有 peer 的缓存有效期
+        Collection<String> keys = redisCache.keys("peer:*");
+        for (String key : keys) {
+            Map<String, String> data = redisCache.getCacheMap(key);
+            if (data == null) continue;
+            String peerIp = data.get("ip");
+            if (ip.equals(peerIp)) {
+                redisCache.expire(key, PEER_CACHE_DURATION_MIN, TimeUnit.MINUTES);
+            }
+        }
+
+        // 构造基本响应（可根据需要扩展）
+        return Map.of(
+                "interval", ANNOUNCE_INTERVAL,
+                "min interval", ANNOUNCE_INTERVAL / 2,
+                "complete", Optional.ofNullable(redisCache.zCard("some:default:torrent:seeders")).orElse(0L).intValue(),
+                "incomplete", Optional.ofNullable(redisCache.zCard("some:default:torrent:leechers")).orElse(0L).intValue(),
+                "peers", new byte[0]
+        );
+    }
+
+    /**
+     * 查询当前所有活跃的 Peer 节点，包含详细字段
+     */
+    @Override
+    public List<Map<String, Object>> getAllPeers() {
+        // RedisCache.keys 返回 Collection<String>
+        Collection<String> keys = redisCache.keys("peer:*");
+        List<Map<String, Object>> peers = new ArrayList<>();
+        for (String key : keys) {
+            Map<String, String> data = redisCache.getCacheMap(key);
+            if (data == null || data.isEmpty()) continue;
+            Map<String, Object> info = new LinkedHashMap<>();
+            info.put("peerKey", key);
+            info.put("ip", data.get("ip"));
+            info.put("port", data.get("port"));
+            info.put("uploaded", data.get("uploaded"));
+            info.put("downloaded", data.get("downloaded"));
+            info.put("left", data.get("left"));
+            info.put("lastSeen", data.get("lastSeen"));
+            peers.add(info);
+        }
+        return peers;
+    }
+
+    private void refreshPeersForIp(String ip) {
+        redisCache.keys("peer:*").stream()
+                .filter(key -> ip.equals(redisCache.getCacheMap(key).get("ip")))
+                .forEach(key -> redisCache.expire(key, PEER_CACHE_DURATION_MIN, TimeUnit.MINUTES));
+    }
+
+    private List<byte[]> selectPeerBytes(Set<String> peers) {
+        List<byte[]> list = new ArrayList<>();
+        for (String peerId : peers) {
+            Map<String, String> data = redisCache.getCacheMap("peer:" + peerId);
+            if (data == null) continue;
+            String ip = data.get("ip");
+            String port = data.get("port");
+            if (ip == null || ip.contains(":")) continue;
+            list.add(encodePeer(ip, Integer.parseInt(port)));
+        }
+        return list;
+    }
+
+    private Map<String, Object> buildResponse(int incomplete, byte[] peers) {
+        Map<String, Object> response = new LinkedHashMap<>();
+        response.put("interval", ANNOUNCE_INTERVAL);
+        response.put("min interval", ANNOUNCE_INTERVAL / 2);
+        response.put("complete", 0);
+        response.put("incomplete", incomplete);
+        response.put("peers", peers);
+        return response;
+    }
+
+    private int getZCardAsInt(String zsetKey) {
+        Long count = redisCache.zCard(zsetKey);
+        return Optional.ofNullable(count).orElse(0L).intValue();
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/announce/util/BencodeEncoder.java b/ruoyi-admin/src/main/java/com/ruoyi/announce/util/BencodeEncoder.java
index a2cdb30..44dcf6a 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/announce/util/BencodeEncoder.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/announce/util/BencodeEncoder.java
@@ -1,9 +1,12 @@
 package com.ruoyi.announce.util;
 
+import org.springframework.stereotype.Service;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
-
+@Service
 public class BencodeEncoder {
 
     public byte[] encodeBencode(Map<String, Object> reply) throws IOException {
@@ -32,11 +35,20 @@
             encodeMap((Map<String, Object>) obj, outputStream);
         } else if (obj instanceof Iterable) {
             encodeList((Iterable<Object>) obj, outputStream);
+        } else if (obj instanceof byte[]) {
+            encodeByteArray((byte[]) obj, outputStream);
         } else {
             throw new IllegalArgumentException("Unsupported object type: " + obj.getClass());
         }
     }
 
+    private void encodeByteArray(byte[] bytes, ByteArrayOutputStream outputStream) throws IOException {
+        outputStream.write(Integer.toString(bytes.length).getBytes());
+        outputStream.write(':');
+        outputStream.write(bytes);
+    }
+
+
     private void encodeInteger(Integer value, ByteArrayOutputStream outputStream) throws IOException {
         outputStream.write('i');
         outputStream.write(value.toString().getBytes());
@@ -44,11 +56,13 @@
     }
 
     private void encodeString(String value, ByteArrayOutputStream outputStream) throws IOException {
-        outputStream.write(Integer.toString(value.length()).getBytes());
+        byte[] bytes = value.getBytes(StandardCharsets.UTF_8); // Assuming UTF-8 encoding
+        outputStream.write(Integer.toString(bytes.length).getBytes());
         outputStream.write(':');
-        outputStream.write(value.getBytes());
+        outputStream.write(bytes);
     }
 
+
     private void encodeList(Iterable<Object> list, ByteArrayOutputStream outputStream) throws IOException {
         outputStream.write('l'); // Start of a list
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/SysUserPasskeyController.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/SysUserPasskeyController.java
new file mode 100644
index 0000000..d3ea497
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/SysUserPasskeyController.java
@@ -0,0 +1,105 @@
+package com.ruoyi.authentication.controller;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.SysUserPasskey;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.authentication.service.ISysUserPasskeyService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+@RestController
+@RequestMapping("/system/passkey")
+public class SysUserPasskeyController extends BaseController
+{
+    @Autowired
+    private ISysUserPasskeyService sysUserPasskeyService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysUserPasskey sysUserPasskey)
+    {
+        startPage();
+        List<SysUserPasskey> list = sysUserPasskeyService.selectSysUserPasskeyList(sysUserPasskey);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysUserPasskey sysUserPasskey)
+    {
+        List<SysUserPasskey> list = sysUserPasskeyService.selectSysUserPasskeyList(sysUserPasskey);
+        ExcelUtil<SysUserPasskey> util = new ExcelUtil<SysUserPasskey>(SysUserPasskey.class);
+        util.exportExcel(response, list, "【请填写功能名称】数据");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:query')")
+    @GetMapping(value = "/{userId}")
+    public AjaxResult getInfo(@PathVariable("userId") Long userId)
+    {
+        return success(sysUserPasskeyService.selectSysUserPasskeyByUserId(userId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysUserPasskey sysUserPasskey)
+    {
+        return toAjax(sysUserPasskeyService.insertSysUserPasskey(sysUserPasskey));
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysUserPasskey sysUserPasskey)
+    {
+        return toAjax(sysUserPasskeyService.updateSysUserPasskey(sysUserPasskey));
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:passkey:remove')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(sysUserPasskeyService.deleteSysUserPasskeyByUserIds(userIds));
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/UserScoreController.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/UserScoreController.java
new file mode 100644
index 0000000..93b9119
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/controller/UserScoreController.java
@@ -0,0 +1,105 @@
+package com.ruoyi.authentication.controller;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.UserScore;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.authentication.service.IUserScoreService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+@RestController
+@RequestMapping("/system/score")
+public class UserScoreController extends BaseController
+{
+    @Autowired
+    private IUserScoreService userScoreService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(UserScore userScore)
+    {
+        startPage();
+        List<UserScore> list = userScoreService.selectUserScoreList(userScore);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, UserScore userScore)
+    {
+        List<UserScore> list = userScoreService.selectUserScoreList(userScore);
+        ExcelUtil<UserScore> util = new ExcelUtil<UserScore>(UserScore.class);
+        util.exportExcel(response, list, "【请填写功能名称】数据");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:query')")
+    @GetMapping(value = "/{userId}")
+    public AjaxResult getInfo(@PathVariable("userId") Long userId)
+    {
+        return success(userScoreService.selectUserScoreByUserId(userId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody UserScore userScore)
+    {
+        return toAjax(userScoreService.insertUserScore(userScore));
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody UserScore userScore)
+    {
+        return toAjax(userScoreService.updateUserScore(userScore));
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @PreAuthorize("@ss.hasPermi('system:score:remove')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(userScoreService.deleteUserScoreByUserIds(userIds));
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserPasskey.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserPasskey.java
new file mode 100644
index 0000000..7370c77
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserPasskey.java
@@ -0,0 +1,71 @@
+package com.ruoyi.authentication.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】对象 sys_user_passkey
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public class SysUserPasskey extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    public SysUserPasskey(String passkey){
+        this.passkey = passkey;
+    }
+
+    /** $column.columnComment */
+    private Long userId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String passkey;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date createdAt;
+
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setPasskey(String passkey) 
+    {
+        this.passkey = passkey;
+    }
+
+    public String getPasskey() 
+    {
+        return passkey;
+    }
+    public void setCreatedAt(Date createdAt) 
+    {
+        this.createdAt = createdAt;
+    }
+
+    public Date getCreatedAt() 
+    {
+        return createdAt;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("passkey", getPasskey())
+            .append("createdAt", getCreatedAt())
+            .toString();
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java
new file mode 100644
index 0000000..f7049d1
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java
@@ -0,0 +1,109 @@
+package com.ruoyi.authentication.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】对象 user_score
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public class UserScore extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long userId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String uploaded;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String downloaded;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long bonus;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long score;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date updatedAt;
+
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setUploaded(String uploaded) 
+    {
+        this.uploaded = uploaded;
+    }
+
+    public String getUploaded() 
+    {
+        return uploaded;
+    }
+    public void setDownloaded(String downloaded) 
+    {
+        this.downloaded = downloaded;
+    }
+
+    public String getDownloaded() 
+    {
+        return downloaded;
+    }
+    public void setBonus(Long bonus) 
+    {
+        this.bonus = bonus;
+    }
+
+    public Long getBonus() 
+    {
+        return bonus;
+    }
+    public void setScore(Long score) 
+    {
+        this.score = score;
+    }
+
+    public Long getScore() 
+    {
+        return score;
+    }
+    public void setUpdatedAt(Date updatedAt) 
+    {
+        this.updatedAt = updatedAt;
+    }
+
+    public Date getUpdatedAt() 
+    {
+        return updatedAt;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("uploaded", getUploaded())
+            .append("downloaded", getDownloaded())
+            .append("bonus", getBonus())
+            .append("score", getScore())
+            .append("updatedAt", getUpdatedAt())
+            .toString();
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserPasskeyMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserPasskeyMapper.java
new file mode 100644
index 0000000..7607c63
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserPasskeyMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.authentication.mapper;
+
+import java.util.List;
+import com.ruoyi.authentication.domain.SysUserPasskey;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public interface SysUserPasskeyMapper 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public SysUserPasskey selectSysUserPasskeyByUserId(Long userId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<SysUserPasskey> selectSysUserPasskeyList(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertSysUserPasskey(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateSysUserPasskey(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 删除【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteSysUserPasskeyByUserId(Long userId);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysUserPasskeyByUserIds(Long[] userIds);
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java
new file mode 100644
index 0000000..4c15e5e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.authentication.mapper;
+
+import java.util.List;
+import com.ruoyi.authentication.domain.UserScore;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public interface UserScoreMapper 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public UserScore selectUserScoreByUserId(Long userId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<UserScore> selectUserScoreList(UserScore userScore);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertUserScore(UserScore userScore);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateUserScore(UserScore userScore);
+
+    /**
+     * 删除【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteUserScoreByUserId(Long userId);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteUserScoreByUserIds(Long[] userIds);
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserPasskeyService.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserPasskeyService.java
new file mode 100644
index 0000000..33e0ec6
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserPasskeyService.java
@@ -0,0 +1,62 @@
+package com.ruoyi.authentication.service;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.SysUserPasskey;
+
+/**
+ * 【请填写功能名称】Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public interface ISysUserPasskeyService 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public SysUserPasskey selectSysUserPasskeyByUserId(Long userId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<SysUserPasskey> selectSysUserPasskeyList(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertSysUserPasskey(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateSysUserPasskey(SysUserPasskey sysUserPasskey);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的【请填写功能名称】主键集合
+     * @return 结果
+     */
+    public int deleteSysUserPasskeyByUserIds(Long[] userIds);
+
+    /**
+     * 删除【请填写功能名称】信息
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteSysUserPasskeyByUserId(Long userId);
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java
new file mode 100644
index 0000000..b93e41e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java
@@ -0,0 +1,62 @@
+package com.ruoyi.authentication.service;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.UserScore;
+
+/**
+ * 【请填写功能名称】Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+public interface IUserScoreService 
+{
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public UserScore selectUserScoreByUserId(Long userId);
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public List<UserScore> selectUserScoreList(UserScore userScore);
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    public int insertUserScore(UserScore userScore);
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    public int updateUserScore(UserScore userScore);
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的【请填写功能名称】主键集合
+     * @return 结果
+     */
+    public int deleteUserScoreByUserIds(Long[] userIds);
+
+    /**
+     * 删除【请填写功能名称】信息
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    public int deleteUserScoreByUserId(Long userId);
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserPasskeyServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserPasskeyServiceImpl.java
new file mode 100644
index 0000000..c2091e5
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserPasskeyServiceImpl.java
@@ -0,0 +1,94 @@
+package com.ruoyi.authentication.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.SysUserPasskey;
+import com.ruoyi.authentication.mapper.SysUserPasskeyMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.authentication.service.ISysUserPasskeyService;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+@Service
+public class SysUserPasskeyServiceImpl implements ISysUserPasskeyService 
+{
+    @Autowired
+    private SysUserPasskeyMapper sysUserPasskeyMapper;
+
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public SysUserPasskey selectSysUserPasskeyByUserId(Long userId)
+    {
+        return sysUserPasskeyMapper.selectSysUserPasskeyByUserId(userId);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public List<SysUserPasskey> selectSysUserPasskeyList(SysUserPasskey sysUserPasskey)
+    {
+        return sysUserPasskeyMapper.selectSysUserPasskeyList(sysUserPasskey);
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int insertSysUserPasskey(SysUserPasskey sysUserPasskey)
+    {
+        return sysUserPasskeyMapper.insertSysUserPasskey(sysUserPasskey);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param sysUserPasskey 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int updateSysUserPasskey(SysUserPasskey sysUserPasskey)
+    {
+        return sysUserPasskeyMapper.updateSysUserPasskey(sysUserPasskey);
+    }
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserPasskeyByUserIds(Long[] userIds)
+    {
+        return sysUserPasskeyMapper.deleteSysUserPasskeyByUserIds(userIds);
+    }
+
+    /**
+     * 删除【请填写功能名称】信息
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserPasskeyByUserId(Long userId)
+    {
+        return sysUserPasskeyMapper.deleteSysUserPasskeyByUserId(userId);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java
new file mode 100644
index 0000000..4a41923
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java
@@ -0,0 +1,94 @@
+package com.ruoyi.authentication.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.authentication.domain.UserScore;
+import com.ruoyi.authentication.mapper.UserScoreMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.authentication.service.IUserScoreService;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-04-25
+ */
+@Service
+public class UserScoreServiceImpl implements IUserScoreService 
+{
+    @Autowired
+    private UserScoreMapper userScoreMapper;
+
+    /**
+     * 查询【请填写功能名称】
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public UserScore selectUserScoreByUserId(Long userId)
+    {
+        return userScoreMapper.selectUserScoreByUserId(userId);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public List<UserScore> selectUserScoreList(UserScore userScore)
+    {
+        return userScoreMapper.selectUserScoreList(userScore);
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int insertUserScore(UserScore userScore)
+    {
+        return userScoreMapper.insertUserScore(userScore);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     * 
+     * @param userScore 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int updateUserScore(UserScore userScore)
+    {
+        return userScoreMapper.updateUserScore(userScore);
+    }
+
+    /**
+     * 批量删除【请填写功能名称】
+     * 
+     * @param userIds 需要删除的【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteUserScoreByUserIds(Long[] userIds)
+    {
+        return userScoreMapper.deleteUserScoreByUserIds(userIds);
+    }
+
+    /**
+     * 删除【请填写功能名称】信息
+     * 
+     * @param userId 【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteUserScoreByUserId(Long userId)
+    {
+        return userScoreMapper.deleteUserScoreByUserId(userId);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java b/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
index c80db77..15dc9f3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
@@ -1,11 +1,11 @@
 package com.ruoyi.torrent.controller;
 
+import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -16,6 +16,7 @@
 import com.ruoyi.torrent.service.IBtTorrentAnnounceService;
 import com.ruoyi.torrent.service.IBtTorrentFileService;
 import com.ruoyi.torrent.service.IBtTorrentService;
+import com.ruoyi.torrent.util.TorrentFileUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,7 +42,6 @@
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.util.UUID;
 
 /**
  * 种子主Controller
@@ -62,6 +62,9 @@
     private IBtTorrentAnnounceService btTorrentAnnounceService;
     private static final String RECOMMEND_API = "http://127.0.0.1:5000/recommend_torrents";
 
+    private String torrentPath= "torrents";
+
+
     private static final String boundary = "----WebKitFormBoundary" + UUID.randomUUID().toString().replace("-", "");
 
     @PreAuthorize("@ss.hasPermi('system:torrent:add')")
@@ -69,8 +72,9 @@
     @PostMapping("/uploadTorrent")
     public AjaxResult uploadTorrent(@RequestParam("file") MultipartFile file) {
         try {
+
             // Create URL connection to Flask server
-            String flaskUrl = "http://localhost:5000/parse_torrent"; // Flask server URL
+            String flaskUrl = "http://49.233.215.144:5000/parse_torrent"; // Flask server URL
             HttpURLConnection connection = (HttpURLConnection) new URL(flaskUrl).openConnection();
             connection.setRequestMethod("POST");
             connection.setDoOutput(true);
@@ -86,6 +90,10 @@
                 if (responseCode != 200) {
                     return AjaxResult.error("Failed to communicate with Flask server, response code: " + responseCode);
                 }
+                TorrentFileUtil.uploadFile(file,torrentPath+"/"+SecurityUtils.getUserId());
+
+
+
 
                 // Assuming the Flask server responds with JSON, parse the response
                 String responseBody = new String(connection.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
@@ -133,9 +141,11 @@
             BtTorrent btTorrent = objectMapper.readValue(btTorrentNode.toString(), BtTorrent.class);
             btTorrent.setCreatedBy(SecurityUtils.getUsername());
             btTorrent.setUploaderId(SecurityUtils.getUserId());
+            btTorrent.setFilePath(torrentPath+"/"+SecurityUtils.getUserId()+"/"+btTorrent.getName());
             btTorrentService.insertBtTorrent(btTorrent);
             Long torrentId=btTorrent.getTorrentId();
 
+
             // Convert btTorrentFilesNode to List<BtTorrentFile> using TypeReference
             List<BtTorrentFile> btTorrentFiles = objectMapper.readValue(
                     btTorrentFilesNode.toString(),
@@ -175,6 +185,43 @@
         }
     }
 
+    @GetMapping("/download/{id}")
+    public void downloadTorrent(@PathVariable("id") Long id, HttpServletResponse response) {
+        try {
+            // 1. 调用 getTorrentInfo(id) 获取文件路径
+            BtTorrent btTorrent= btTorrentService.selectBtTorrentByTorrentId(id);
+            String filePath=btTorrent.getFilePath();
+            String fileName=btTorrent.getName();
+
+            // 2. 使用工具方法下载文件（不删除源文件）
+            TorrentFileUtil.downloadFile(response, filePath, fileName, false);
+
+        } catch (FileNotFoundException e) {
+
+            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+            System.out.println(e.getMessage());
+
+        } catch (Exception e) {
+
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            System.out.println(e.getMessage());
+
+        }
+
+    }
+
+    /**
+     * 查询种子主列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:torrent:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BtTorrent btTorrent)
+    {
+        startPage();
+        List<BtTorrent> list = btTorrentService.selectBtTorrentList(btTorrent);
+        return getDataTable(list);
+    }
+
     /**
      * 查询种子主列表
      */
@@ -265,6 +312,10 @@
 	@DeleteMapping("/{torrentIds}")
     public AjaxResult remove(@PathVariable Long[] torrentIds)
     {
+        for (Long torrentId : torrentIds){
+            String filePath = btTorrentService.selectBtTorrentByTorrentId(torrentId).getFilePath();
+            TorrentFileUtil.deleteFileOrFolder(filePath);
+        }
         return toAjax(btTorrentService.deleteBtTorrentByTorrentIds(torrentIds));
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/OssMultipartUploader.java b/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/OssMultipartUploader.java
new file mode 100644
index 0000000..6a0323f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/OssMultipartUploader.java
@@ -0,0 +1,96 @@
+package com.ruoyi.torrent.util;
+
+import com.aliyun.oss.*;
+import com.aliyun.oss.common.auth.CredentialsProviderFactory;
+import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
+import com.aliyun.oss.common.comm.SignVersion;
+import com.aliyun.oss.internal.Mimetypes;
+import com.aliyun.oss.model.*;
+import com.aliyuncs.exceptions.ClientException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class OssMultipartUploader {
+
+    private final OSS ossClient;
+    private final String bucketName;
+
+    public OssMultipartUploader(String endpoint, String region, String bucketName) throws ClientException {
+        EnvironmentVariableCredentialsProvider credentialsProvider =
+                CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
+        ClientBuilderConfiguration config = new ClientBuilderConfiguration();
+        config.setSignatureVersion(SignVersion.V4);
+
+        this.ossClient = OSSClientBuilder.create()
+                .endpoint(endpoint)
+                .region(region)
+                .credentialsProvider(credentialsProvider)
+                .clientConfiguration(config)
+                .build();
+
+        this.bucketName = bucketName;
+    }
+
+    public void uploadFile(String objectName, String filePath) throws Exception {
+        File file = new File(filePath);
+        long partSize = 1 * 1024 * 1024L; // 1MB
+        long fileLength = file.length();
+        int partCount = (int) (fileLength / partSize);
+        if (fileLength % partSize != 0) {
+            partCount++;
+        }
+
+        // 设置元数据（如 content-type）
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setContentType(Mimetypes.getInstance().getMimetype(file, objectName));
+
+        InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(bucketName, objectName);
+        initiateRequest.setObjectMetadata(metadata);
+        InitiateMultipartUploadResult initResult = ossClient.initiateMultipartUpload(initiateRequest);
+        String uploadId = initResult.getUploadId();
+
+        List<PartETag> partETags = new ArrayList<>();
+
+        try {
+            for (int i = 0; i < partCount; i++) {
+                long startPos = i * partSize;
+                long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
+
+                try (InputStream inputStream = new FileInputStream(file)) {
+                    inputStream.skip(startPos);
+
+                    UploadPartRequest uploadPartRequest = new UploadPartRequest();
+                    uploadPartRequest.setBucketName(bucketName);
+                    uploadPartRequest.setKey(objectName);
+                    uploadPartRequest.setUploadId(uploadId);
+                    uploadPartRequest.setInputStream(inputStream);
+                    uploadPartRequest.setPartSize(curPartSize);
+                    uploadPartRequest.setPartNumber(i + 1);
+
+                    UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
+                    partETags.add(uploadPartResult.getPartETag());
+                }
+            }
+
+            CompleteMultipartUploadRequest completeRequest =
+                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
+
+            CompleteMultipartUploadResult result = ossClient.completeMultipartUpload(completeRequest);
+            System.out.println("上传成功，ETag: " + result.getETag());
+
+        } catch (Exception e) {
+            ossClient.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, objectName, uploadId));
+            throw new RuntimeException("上传失败，已中止上传任务", e);
+        }
+    }
+
+    public void shutdown() {
+        if (ossClient != null) {
+            ossClient.shutdown();
+        }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/TorrentFileUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/TorrentFileUtil.java
index a1cd422..03f2c18 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/TorrentFileUtil.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/torrent/util/TorrentFileUtil.java
@@ -5,10 +5,8 @@
 import java.io.*;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -33,28 +31,30 @@
             Files.createDirectories(saveDir);
         }
 
-        // 获取文件信息
-        String originalFilename = Objects.requireNonNull(file.getOriginalFilename());
-        String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
-        String storedFilename = System.currentTimeMillis() + "_" + UUID.randomUUID() + fileExtension;
+        // 获取原始文件名
+        String originalFilename = Objects.requireNonNull(file.getOriginalFilename()).trim();
         long fileSize = file.getSize();
+        String fileExtension = originalFilename.contains(".") ?
+                originalFilename.substring(originalFilename.lastIndexOf(".")) : "";
 
-        // 保存文件
-        Path targetPath = saveDir.resolve(storedFilename);
+        // 使用原始文件名保存（防止路径穿越漏洞）
+        String safeFileName = originalFilename.replaceAll("[\\\\/:*?\"<>|]", "_");
+        Path targetPath = saveDir.resolve(safeFileName);
         Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
 
         // 返回文件信息
         Map<String, Object> fileInfo = new HashMap<>();
         fileInfo.put("originalName", originalFilename);
-        fileInfo.put("storedName", storedFilename);
+        fileInfo.put("storedName", safeFileName);
         fileInfo.put("filePath", targetPath.toString());
         fileInfo.put("fileSize", fileSize);
-        fileInfo.put("fileType", fileExtension.substring(1));
+        fileInfo.put("fileType", fileExtension.isEmpty() ? "unknown" : fileExtension.substring(1));
         fileInfo.put("uploadTime", new Date());
 
         return fileInfo;
     }
 
+
     /**
      * 文件下载工具方法
      *
@@ -114,6 +114,40 @@
             return false;
         }
     }
+    /**
+     * 删除文件或文件夹
+     *
+     * @param path 文件或文件夹路径
+     * @return 是否删除成功
+     */
+    public static boolean deleteFileOrFolder(String path) {
+        try {
+            Path filePath = Paths.get(path);
+            if (Files.isDirectory(filePath)) {
+                // 如果是文件夹，递归删除文件夹中的内容
+                Files.walkFileTree(filePath, new SimpleFileVisitor<Path>() {
+                    @Override
+                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                        Files.delete(file); // 删除文件
+                        return FileVisitResult.CONTINUE;
+                    }
+
+                    @Override
+                    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                        Files.delete(dir); // 删除文件夹
+                        return FileVisitResult.CONTINUE;
+                    }
+                });
+            } else {
+                // 如果是文件，直接删除
+                Files.deleteIfExists(filePath);
+            }
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 
     /**
      * 重命名文件
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index 12ed4d4..ca1fce9 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -7,8 +7,8 @@
             # 主库数据源
             master:
                 url: jdbc:mysql://49.233.215.144:3306/pt_station?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: sy
-                password: sy_password
+                username: root
+                password: 22301058Zsy*
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index cb1a87c..01b71fe 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -9,7 +9,7 @@
   # 文件路径 示例（ Windows配置D:/ruoyi/uploadPath，Linux配置 /home/ruoyi/uploadPath）
   profile: D:/ruoyi/uploadPath
   # 获取ip地址开关
-  addressEnabled: false
+  addressEnabled: true
   # 验证码类型 math 数字计算 char 字符验证
   captchaType: math
 
@@ -75,7 +75,7 @@
       # 数据库索引
       database: 0
       # 密码
-      password:
+      password: 22301058Zsy*
       # 连接超时时间
       timeout: 10s
       lettuce:
diff --git a/ruoyi-admin/src/main/resources/mapper/system/SysUserPasskeyMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/SysUserPasskeyMapper.xml
new file mode 100644
index 0000000..949ac4f
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/SysUserPasskeyMapper.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.authentication.mapper.SysUserPasskeyMapper">
+    
+    <resultMap type="SysUserPasskey" id="SysUserPasskeyResult">
+        <result property="userId"    column="user_id"    />
+        <result property="passkey"    column="passkey"    />
+        <result property="createdAt"    column="created_at"    />
+    </resultMap>
+
+    <sql id="selectSysUserPasskeyVo">
+        select user_id, passkey, created_at from sys_user_passkey
+    </sql>
+
+    <select id="selectSysUserPasskeyList" parameterType="SysUserPasskey" resultMap="SysUserPasskeyResult">
+        <include refid="selectSysUserPasskeyVo"/>
+        <where>  
+            <if test="passkey != null  and passkey != ''"> and passkey = #{passkey}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysUserPasskeyByUserId" parameterType="Long" resultMap="SysUserPasskeyResult">
+        <include refid="selectSysUserPasskeyVo"/>
+        where user_id = #{userId}
+    </select>
+
+    <insert id="insertSysUserPasskey" parameterType="SysUserPasskey">
+        insert into sys_user_passkey
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="passkey != null and passkey != ''">passkey,</if>
+            <if test="createdAt != null">created_at,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="passkey != null and passkey != ''">#{passkey},</if>
+            <if test="createdAt != null">#{createdAt},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysUserPasskey" parameterType="SysUserPasskey">
+        update sys_user_passkey
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="passkey != null and passkey != ''">passkey = #{passkey},</if>
+            <if test="createdAt != null">created_at = #{createdAt},</if>
+        </trim>
+        where user_id = #{userId}
+    </update>
+
+    <delete id="deleteSysUserPasskeyByUserId" parameterType="Long">
+        delete from sys_user_passkey where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteSysUserPasskeyByUserIds" parameterType="String">
+        delete from sys_user_passkey where user_id in 
+        <foreach item="userId" collection="array" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/system/UserScoreMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/UserScoreMapper.xml
new file mode 100644
index 0000000..2f0f7fc
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/UserScoreMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.authentication.mapper.UserScoreMapper">
+    
+    <resultMap type="UserScore" id="UserScoreResult">
+        <result property="userId"    column="user_id"    />
+        <result property="uploaded"    column="uploaded"    />
+        <result property="downloaded"    column="downloaded"    />
+        <result property="bonus"    column="bonus"    />
+        <result property="score"    column="score"    />
+        <result property="updatedAt"    column="updated_at"    />
+    </resultMap>
+
+    <sql id="selectUserScoreVo">
+        select user_id, uploaded, downloaded, bonus, score, updated_at from user_score
+    </sql>
+
+    <select id="selectUserScoreList" parameterType="UserScore" resultMap="UserScoreResult">
+        <include refid="selectUserScoreVo"/>
+        <where>  
+            <if test="uploaded != null  and uploaded != ''"> and uploaded = #{uploaded}</if>
+            <if test="downloaded != null  and downloaded != ''"> and downloaded = #{downloaded}</if>
+            <if test="bonus != null "> and bonus = #{bonus}</if>
+            <if test="score != null "> and score = #{score}</if>
+            <if test="updatedAt != null "> and updated_at = #{updatedAt}</if>
+        </where>
+    </select>
+    
+    <select id="selectUserScoreByUserId" parameterType="Long" resultMap="UserScoreResult">
+        <include refid="selectUserScoreVo"/>
+        where user_id = #{userId}
+    </select>
+
+    <insert id="insertUserScore" parameterType="UserScore">
+        insert into user_score
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="uploaded != null">uploaded,</if>
+            <if test="downloaded != null">downloaded,</if>
+            <if test="bonus != null">bonus,</if>
+
+            <if test="updatedAt != null">updated_at,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="uploaded != null">#{uploaded},</if>
+            <if test="downloaded != null">#{downloaded},</if>
+            <if test="bonus != null">#{bonus},</if>
+
+            <if test="updatedAt != null">#{updatedAt},</if>
+         </trim>
+    </insert>
+
+    <update id="updateUserScore" parameterType="UserScore">
+        update user_score
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="uploaded != null">uploaded = #{uploaded},</if>
+            <if test="downloaded != null">downloaded = #{downloaded},</if>
+            <if test="bonus != null">bonus = #{bonus},</if>
+
+            <if test="updatedAt != null">updated_at = #{updatedAt},</if>
+        </trim>
+        where user_id = #{userId}
+    </update>
+
+    <delete id="deleteUserScoreByUserId" parameterType="Long">
+        delete from user_score where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteUserScoreByUserIds" parameterType="String">
+        delete from user_score where user_id in 
+        <foreach item="userId" collection="array" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
