diff --git a/src/main/java/entity/Seed.java b/src/main/java/entity/Seed.java
index eabf49d..394ce3c 100644
--- a/src/main/java/entity/Seed.java
+++ b/src/main/java/entity/Seed.java
@@ -50,4 +50,7 @@
 
     @Column(name = "popularity", nullable = false)
     public int downloadtimes;
+
+    @Column(name = "URL", columnDefinition = "TEXT")
+    public String url;
 }
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
index 603ec85..69d34ed 100644
--- a/src/main/java/entity/User.java
+++ b/src/main/java/entity/User.java
@@ -17,10 +17,10 @@
 public class User {
     @Id
     @Column(name = "user_id", length = 36, nullable = false)
-    private String userid;
+    public String userid;
 
     @Column(name = "email", nullable = false, length = 255, unique = true)
-    private String email;
+    public String email;
 
     @Column(name = "username", length = 100, nullable = false)
     public String username;
diff --git a/src/main/java/tracker/Tracker.java b/src/main/java/tracker/Tracker.java
index d53c258..6334ebb 100644
--- a/src/main/java/tracker/Tracker.java
+++ b/src/main/java/tracker/Tracker.java
@@ -11,10 +11,10 @@
 
 import com.querydsl.jpa.impl.JPAUpdateClause;
 
+import entity.QUserPT;
 import entity.TTorent;
 import entity.TransRecord;
 import entity.config;
-import entity.QUserPT;
 
 public class Tracker implements TrackerInterface {
     private final EntityManagerFactory emf;
@@ -80,32 +80,92 @@
     }
 
     @Override
-    public boolean AddDownload(String userid,int download){
-        return true;
-    };//给用户增加下载量，返回0成功，返回1失败;
+    public boolean AddDownload(String userid, int download) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            QUserPT q = QUserPT.userPT;
+            long updated = new JPAUpdateClause(em, q)
+                .where(q.userid.eq(userid))
+                .set(q.download, q.download.add(download))
+                .execute();
+            tx.commit();
+            return updated <= 0;
+        } catch(Exception e) {
+            if (tx.isActive()) tx.rollback();
+            return true;
+        } finally {
+            em.close();
+        }
+    }
 
     @Override
-    public boolean ReduceDownload(String userid,int download){
-        return true;
-    };//给用户减少下载量，返回0成功，返回1失败;
+    public boolean ReduceDownload(String userid, int download) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            QUserPT q = QUserPT.userPT;
+            long updated = new JPAUpdateClause(em, q)
+                .where(q.userid.eq(userid))
+                .set(q.download, q.download.subtract(download))
+                .execute();
+            tx.commit();
+            return updated <= 0;
+        } catch(Exception e) {
+            if (tx.isActive()) tx.rollback();
+            return true;
+        } finally {
+            em.close();
+        }
+    }
 
     @Override
-    public boolean AddMagic(String userid,int magic){
-        return true;
-    };//给用户增加魔力值，返回0成功，返回1失败;
+    public boolean AddMagic(String userid, int magic) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            QUserPT q = QUserPT.userPT;
+            long updated = new JPAUpdateClause(em, q)
+                .where(q.userid.eq(userid))
+                .set(q.magic, q.magic.add(magic))
+                .execute();
+            tx.commit();
+            return updated <= 0;
+        } catch(Exception e) {
+            if (tx.isActive()) tx.rollback();
+            return true;
+        } finally {
+            em.close();
+        }
+    }
 
     @Override
-    public boolean ReduceMagic(String userid,int magic){
-        return true;
-    };//给用户减少魔力值，返回0成功，返回1失败;
+    public boolean ReduceMagic(String userid, int magic) {
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            QUserPT q = QUserPT.userPT;
+            long updated = new JPAUpdateClause(em, q)
+                .where(q.userid.eq(userid))
+                .set(q.magic, q.magic.subtract(magic))
+                .execute();
+            tx.commit();
+            return updated <= 0;
+        } catch(Exception e) {
+            if (tx.isActive()) tx.rollback();
+            return true;
+        } finally {
+            em.close();
+        }
+    }
+
 
     @Override
-    public TTorent ReadTorrent(File torrent){
-        return new TTorent();
-    };//传入torrent文件，解析后返回TTorent类
-
-    @Override
-    public int SaveTorrent(TTorent seed,String seedid){
+    public int SaveTorrent(File TTorent){
         return 0;
     };//保存seedid对应的ttorent信息
 
@@ -116,7 +176,20 @@
 
 
     @Override
-    public int AddRecord(String seedid,TransRecord rd){
-        return 0;
-    };//新增一个seedid对应的种子的传输任务记录
+    public int AddRecord(TransRecord rd){
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            em.persist(rd);
+            tx.commit();
+            // 持久化成功，返回1表示插入成功
+            return 1;
+        } catch (Exception e) {
+            if (tx.isActive()) tx.rollback();
+            return -1;
+        } finally {
+            em.close();
+        }
+    }
 }
diff --git a/src/main/java/tracker/TrackerInterface.java b/src/main/java/tracker/TrackerInterface.java
index 0c2df5c..1496a26 100644
--- a/src/main/java/tracker/TrackerInterface.java
+++ b/src/main/java/tracker/TrackerInterface.java
@@ -1,8 +1,8 @@
 package tracker;
 import java.io.File;
 
-import entity.TTorent;
 import entity.TransRecord;
+
 public interface TrackerInterface{
     public boolean AddUpLoad(String userid,int upload);//给用户新增上传量，返回0成功，返回1失败;
     public boolean ReduceUpLoad(String userid,int upload);//给用户减上传量，返回0成功，返回1失败;
@@ -11,9 +11,8 @@
     public boolean AddMagic(String userid,int magic);//给用户增加魔力值，返回0成功，返回1失败;
     public boolean ReduceMagic(String userid,int magic);//给用户减少魔力值，返回0成功，返回1失败;
 
-    public TTorent ReadTorrent(File torrent);//传入torrent文件，解析后返回TTorent类
-    public int SaveTorrent(TTorent seed,String seedid);//保存seedid对应的ttorent信息
+    public int SaveTorrent(File TTorent);//保存seedid对应的ttorent信息
     public File GetTTorent(String seedid,String userid);//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为
-
-    public int AddRecord(String seedid,TransRecord rd);//新增一个seedid对应的种子的传输任务记录
+    
+    public int AddRecord(TransRecord rd);//新增一个seedid对应的种子的传输任务记录
 }
\ No newline at end of file
diff --git a/src/test/java/databasetest/databasetest.java b/src/test/java/databasetest/databasetest.java
deleted file mode 100644
index e947a9b..0000000
--- a/src/test/java/databasetest/databasetest.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package databasetest;
-
-public class databasetest {
-    
-}
diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 1ef5f44..3c4898b 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -4,10 +4,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.UUID;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
 
 import org.junit.jupiter.api.AfterAll;
@@ -16,6 +19,8 @@
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 
+import entity.TransRecord;
+import entity.TransportId;
 import entity.config;
 import tracker.Tracker;
 
@@ -73,10 +78,12 @@
                 int delta = rnd.nextInt(1000) + 1; // Ensure non-zero value
                 long before = originalUploads.get(uid);
                 
-                // 操作成功时返回 false
+                // AddUpLoad 前打印
+                System.out.println("Running AddUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddUpLoad(uid, delta), 
                     "AddUpLoad should return false on successful operation");
-                
+                System.out.println("AddUpLoad assert passed for user=" + uid);
+
                 // Clear the persistence context to ensure fresh data is fetched
                 em.clear();
                 
@@ -85,13 +92,18 @@
                     "select u.upload from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid)
                  .getSingleResult();
-                
+
+                // upload 值断言前打印
+                System.out.println("Running upload-value assert for user=" + uid);
                 Assertions.assertEquals(before + delta, after, 
                     "Upload value should be increased by " + delta);
+                System.out.println("Upload-value assert passed for user=" + uid);
                 
-                // 操作成功时返回 false
+                // ReduceUpLoad 前打印
+                System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta),
                     "ReduceUpLoad should return false on successful operation");
+                System.out.println("ReduceUpLoad assert passed for user=" + uid);
             }))
             .collect(Collectors.toList());
     }
@@ -105,14 +117,184 @@
                 int max = (int)Math.min(before, 1000);
                 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
                 if (delta == 0) return;  // 无可减量时跳过
+
+                // ReduceUpLoad 前打印
+                System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta));
+                System.out.println("ReduceUpLoad assert passed for user=" + uid);
+
                 Long after = em.createQuery(
                     "select u.upload from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid)
                  .getSingleResult();
+
+                // 减少后值断言前打印
+                System.out.println("Running post-reduce-value assert for user=" + uid);
                 Assertions.assertEquals(before - delta, after);
-                // 回滚到初始值
+                System.out.println("Post-reduce-value assert passed for user=" + uid);
+
+                // 回滚 AddUpLoad 前打印
+                System.out.println("Running rollback AddUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddUpLoad(uid, delta));
+                System.out.println("Rollback AddUpLoad assert passed for user=" + uid);
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddDownload() {
+        Random rnd = new Random();
+        return userIds.stream()
+            .map(uid -> DynamicTest.dynamicTest("AddDownload for user " + uid, () -> {
+                int delta = rnd.nextInt(1000) + 1;
+                Long before = em.createQuery(
+                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                ).setParameter("uid", uid).getSingleResult();
+                before = before != null ? before : 0L;
+
+                System.out.println("Running AddDownload assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.AddDownload(uid, delta),
+                    "AddDownload should return false on successful operation");
+                em.clear();
+
+                Long after = em.createQuery(
+                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                ).setParameter("uid", uid).getSingleResult();
+                System.out.println("Running download-value assert for user=" + uid);
+                Assertions.assertEquals(before + delta, after,
+                    "Download value should be increased by " + delta);
+
+                System.out.println("Running rollback ReduceDownload assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.ReduceDownload(uid, delta),
+                    "Rollback ReduceDownload should return false");
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testReduceDownload() {
+        Random rnd = new Random();
+        return userIds.stream()
+            .map(uid -> DynamicTest.dynamicTest("ReduceDownload for user " + uid, () -> {
+                Long before = em.createQuery(
+                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                ).setParameter("uid", uid).getSingleResult();
+                before = before != null ? before : 0L;
+                int max = before.intValue();
+                int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
+                if (delta == 0) return;
+
+                System.out.println("Running ReduceDownload assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.ReduceDownload(uid, delta));
+                Long after = em.createQuery(
+                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                ).setParameter("uid", uid).getSingleResult();
+                System.out.println("Running post-reduce-download-value assert for user=" + uid);
+                Assertions.assertEquals(before - delta, after);
+
+                System.out.println("Running rollback AddDownload assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.AddDownload(uid, delta));
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddMagic() {
+        Random rnd = new Random();
+        return userIds.stream()
+            .map(uid -> DynamicTest.dynamicTest("AddMagic for user " + uid, () -> {
+                int delta = rnd.nextInt(1000) + 1;
+                Integer before = em.createQuery(
+                    "select u.magic from UserPT u where u.userid = :uid", Integer.class
+                ).setParameter("uid", uid).getSingleResult();
+                before = before != null ? before : 0;
+
+                System.out.println("Running AddMagic assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.AddMagic(uid, delta));
+                em.clear();
+
+                Integer after = em.createQuery(
+                    "select u.magic from UserPT u where u.userid = :uid", Integer.class
+                ).setParameter("uid", uid).getSingleResult();
+                System.out.println("Running magic-value assert for user=" + uid);
+                Assertions.assertEquals(before + delta, after.intValue());
+
+                System.out.println("Running rollback ReduceMagic assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testReduceMagic() {
+        Random rnd = new Random();
+        return userIds.stream()
+            .map(uid -> DynamicTest.dynamicTest("ReduceMagic for user " + uid, () -> {
+                Integer before = em.createQuery(
+                    "select u.magic from UserPT u where u.userid = :uid", Integer.class
+                ).setParameter("uid", uid).getSingleResult();
+                before = before != null ? before : 0;
+                int max = before.intValue();
+                int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
+                if (delta == 0) return;
+
+                System.out.println("Running ReduceMagic assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
+                Integer after = em.createQuery(
+                    "select u.magic from UserPT u where u.userid = :uid", Integer.class
+                ).setParameter("uid", uid).getSingleResult();
+                System.out.println("Running post-reduce-magic-value assert for user=" + uid);
+                Assertions.assertEquals(before - delta, after.intValue());
+
+                System.out.println("Running rollback AddMagic assert for user=" + uid + ", delta=" + delta);
+                Assertions.assertFalse(tracker.AddMagic(uid, delta));
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddRecord() {
+        Random rnd = new Random();
+        // 取所有 seed_id 用于外键测试
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        // 若无可用 seedId 则跳过此组测试，避免 rnd.nextInt(0) 抛错
+        // if (seedIds.isEmpty()) {
+        //     return Collections.emptyList();
+        // }
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("AddRecord test #" + i, () -> {
+                // 随机构造 TransRecord
+                String uploaderId = userIds.get(rnd.nextInt(userIds.size()));
+                String downloaderId = userIds.get(rnd.nextInt(userIds.size()));
+                String seedId = seedIds.get(rnd.nextInt(seedIds.size()));
+                String taskId = UUID.randomUUID().toString();
+
+                TransRecord rd = new TransRecord();
+                rd.taskid = taskId;
+                rd.uploaduserid = uploaderId;
+                rd.downloaduserid = downloaderId;
+                rd.seedid = seedId;
+                rd.upload = rnd.nextInt(10000);
+                rd.download = rnd.nextInt(10000);
+                rd.maxupload = rd.upload + rnd.nextInt(10000);
+                rd.maxdownload = rd.download + rnd.nextInt(10000);
+
+                // 调用待测方法
+                int ret = tracker.AddRecord(rd);
+                Assertions.assertTrue(ret > 0, "返回值应为新记录主键");
+
+                // 验证已插入
+                TransportId pk = new TransportId(taskId, uploaderId, downloaderId);
+                TransRecord fetched = em.find(TransRecord.class, pk);
+                Assertions.assertNotNull(fetched, "应查询到新增的 TransRecord");
+
+                // 清理：删除测试记录
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                em.remove(fetched);
+                tx.commit();
             }))
             .collect(Collectors.toList());
     }
