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();
+        }
+    }
 }
