diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index db38ede..3eecaff 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,5 +1,203 @@
 package cheat;
 
-// public class Cheat implements CheatInterfnterface {
-    
-// }
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+
+import entity.Appeal;
+import entity.QAppeal;
+import entity.QSeed;
+import entity.User;
+import entity.config;
+
+public class Cheat implements CheatInterfnterface {
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Override
+    @Transactional
+    public boolean AddAppeal(Appeal appeal) {
+        try {
+            entityManager.persist(appeal);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public Appeal GetAppeal(String appealid) {
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QAppeal qAppeal = QAppeal.appeal;
+            Appeal appeal = queryFactory
+                .selectFrom(qAppeal)
+                .where(qAppeal.appealid.eq(appealid))
+                .fetchOne();
+            return appeal;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public Appeal[] GetAppealList() {
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QAppeal qAppeal = QAppeal.appeal;
+            List<Appeal> appeals = queryFactory
+                .selectFrom(qAppeal)
+                .fetch();
+            return appeals.toArray(new Appeal[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public boolean HandleAppeal(String appealid, Integer status) {
+        try {
+            Appeal appeal = GetAppeal(appealid);
+            if (appeal != null) {
+                appeal.status = status;
+                entityManager.merge(appeal);
+                User user = entityManager.find(User.class, appeal.appealuserid);
+                if (user != null && user.accountstate != false) {
+                    if (status == 1) {
+                        user.accountstate = false;
+                    }
+                    entityManager.merge(user);
+                }
+                return true;
+            }
+            return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public Pair<String, String>[] GetFakeSeed() {
+        List<Pair<String, String>> fakeSeeds = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QSeed qSeed = QSeed.seed;
+            List<com.querydsl.core.Tuple> results = queryFactory
+                .select(qSeed.seedid, qSeed.seeduserid)
+                .from(qSeed)
+                .where(qSeed.faketime.gt(new config().FakeTime))
+                .fetch();
+            for (com.querydsl.core.Tuple result : results) {
+                String seedid = result.get(qSeed.seedid);
+                String userid = result.get(qSeed.seeduserid);
+                fakeSeeds.add(Pair.of(seedid, userid));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return fakeSeeds.toArray(new Pair[0]);
+    }
+
+    @Override
+    public String[] GetPunishedUserList() {
+        List<String> punishedUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            entity.QUser qUser = entity.QUser.user;
+            List<String> results = queryFactory
+                .select(qUser.userid)
+                .from(qUser)
+                .where(qUser.accountstate.isTrue())
+                .fetch();
+            for (String userid : results) {
+                punishedUsers.add(userid);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return punishedUsers.toArray(new String[0]);
+    }
+
+    @Override
+    public void DetectTrans() {
+        // JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+        // QSeed qSeed = QSeed.seed;
+        // List<Seed> seeds = queryFactory
+        //     .selectFrom(qSeed)
+        //     .fetch();
+        // for (Seed seed : seeds) {
+        //     QTransRecord qTransRecord = QTransRecord.transRecord;
+        //     List<TransRecord> tasks = queryFactory
+        //         .selectFrom(qTransRecord)
+        //         .where(qTransRecord.seedid.eq(seed.seedid))
+        //         .fetch();
+
+        //     int n = tasks.size();
+        //     if (n == 0) continue;
+
+        //     double[] xArr = new double[n];
+        //     for (int i = 0; i < n; i++) {
+        //         TransRecord t = tasks.get(i);
+        //         xArr[i] = Math.max(0, t.upload - t.download);
+        //     }
+
+        //     double sum = 0;
+        //     for (double x : xArr) sum += x;
+        //     double mu = sum / n;
+
+        //     double sqSum = 0;
+        //     for (double x : xArr) sqSum += (x - mu) * (x - mu);
+        //     double sigma = Math.sqrt(sqSum / n);
+
+        //     for (int i = 0; i < n; i++) {
+        //         if (Math.abs(xArr[i] - mu) > 3 * sigma) {
+        //             User user = entityManager.find(User.class, tasks.get(i).downloaduserid);
+        //             if (user != null) {
+        //                 user.detectedCount++;
+        //                 user.lastDetectedTime = new java.util.Date();
+        //                 entityManager.merge(user);
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    @Override
+    public void DetectFakeSeed(){
+    }
+
+    @Override
+    public boolean DetectFakeSeed(String seedid){
+        return false;
+    }
+
+    @Override
+    public void PunishUser(){
+        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+        entity.QUser qUser = entity.QUser.user;
+        List<User> users = queryFactory
+            .selectFrom(qUser)
+            .where(qUser.detectedCount.gt(new entity.config().CheatTime) 
+                .or(qUser.fakeDetectedCount.gt(new entity.config().FakeTime)))
+            .fetch();
+
+        for (User user : users) {
+            user.accountstate = true;
+            entityManager.merge(user);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/cheat/CheatInterfnterface.java b/src/main/java/cheat/CheatInterfnterface.java
index cca8818..e7e4942 100644
--- a/src/main/java/cheat/CheatInterfnterface.java
+++ b/src/main/java/cheat/CheatInterfnterface.java
@@ -1,21 +1,18 @@
 package cheat;
 import org.apache.commons.lang3.tuple.Pair;
-
 import entity.Appeal;
 public interface CheatInterfnterface{
-    public Pair<String,String>[] GetFeakSeed();//返回做假种的列表，<seedid,userid>
-    public void DetectFeakSeed();//检测所有种子是否为假种，并将检测结果写入数据表
+    public Pair<String,String>[] GetFakeSeed();//返回做假种的列表，<seedid,userid>
+    public void DetectFakeSeed();//检测所有种子是否为假种，并将检测结果写入数据表
     public void DetectTrans();//检测所有种子是存在伪造上传量下载量
-    public boolean DetectTransSeed(String seedid);//检测单个种子是否存在伪造上传量下载量
-    public boolean DetectFeakSeed(String seedid);//检测单个用户是否存在假种
-    public void PunishUser();//扫描数据库中的可疑表，标记可疑用户
-    public boolean DetectUser(String userid);//检测单个用户是否存在可疑行为,每次登录的时候进行检查
-    public String[] GetPunishedUserList();//获取所有可疑用户的列表
 
+    public boolean DetectFakeSeed(String seedid);//检测单个用户是否存在假种
+    public void PunishUser();//扫描数据库中的可疑表，标记可疑用户
+    public String[] GetPunishedUserList();//获取所有可疑用户的列表
+    
     public boolean AddAppeal(Appeal appeal);//数据库中写入一个申诉请求
     public Appeal GetAppeal(String appealid);//获取某个申诉
     public Appeal[] GetAppealList();//获取所有申诉列表
-
-    public boolean RevokePunish(String userid);//撤销某个用户的惩罚
-
+    public boolean HandleAppeal(String appealid, Integer status);//处理申诉
+    // status = 0表示未处理， = 1表示通过， = 2表示拒绝
 }
diff --git a/src/main/java/entity/Appeal.java b/src/main/java/entity/Appeal.java
index 36816c4..0ab79f7 100644
--- a/src/main/java/entity/Appeal.java
+++ b/src/main/java/entity/Appeal.java
@@ -31,5 +31,5 @@
     public String fileURL;
 
     @Column(name = "status", nullable = false)
-    public int state; // 0: pending, 1: approved, 2: rejected
+    public int status; // 0: pending, 1: approved, 2: rejected
 }
diff --git a/src/main/java/entity/BegInfo.java b/src/main/java/entity/BegInfo.java
index fe3174d..405e352 100644
--- a/src/main/java/entity/BegInfo.java
+++ b/src/main/java/entity/BegInfo.java
@@ -27,5 +27,5 @@
     public Date endtime;
 
     @Column(name = "has_match", nullable = false)
-    public boolean hasseed;
+    public int hasseed;
 }
diff --git a/src/main/java/entity/Profile.java b/src/main/java/entity/Profile.java
index 2ff6979..ec330b2 100644
--- a/src/main/java/entity/Profile.java
+++ b/src/main/java/entity/Profile.java
@@ -11,7 +11,7 @@
 
 @Entity
 @Table(name = "UserMigration")
-public class Profile {//迁移信息
+public class Profile {// 迁移信息
     @Id
     @Column(name = "migration_id", length = 64, nullable = false)
     public String profileurl;
@@ -43,4 +43,7 @@
 
     @Transient
     public String downloadgived;
+
+    @Column(name = "application_url", nullable = false)
+    public String applicationurl;
 }
diff --git a/src/main/java/entity/SubmitSeed.java b/src/main/java/entity/SubmitSeed.java
index 2cec77d..98986d0 100644
--- a/src/main/java/entity/SubmitSeed.java
+++ b/src/main/java/entity/SubmitSeed.java
@@ -7,28 +7,23 @@
 public class SubmitSeed {
 
     @EmbeddedId
-    private SubmitSeedId id;
+    @AttributeOverrides({
+            @AttributeOverride(name = "begId", column = @Column(name = "beg_id")),
+            @AttributeOverride(name = "seedId", column = @Column(name = "seed_id"))
+    })
+    public SubmitSeedId id;
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", foreignKey = @ForeignKey(name = "fk_ss_beg"))
-    private BegInfo begInfo;
+    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", foreignKey = @ForeignKey(name = "fk_ss_beg"), insertable = false, updatable = false)
+    public BegInfo begInfo;
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_ss_seed"))
-    private Seed seed;
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_ss_seed"), insertable = false, updatable = false)
+    public Seed seed;
 
     @Column(name = "votes", nullable = false)
-    private int votes;
+    public int votes;
 
-    public SubmitSeed() {}
-
-    public SubmitSeedId getId() {
-        return id;
+    public SubmitSeed() {
     }
-
-    public void setId(SubmitSeedId id) {
-        this.id = id;
-    }
-
-    // getters and setters for begInfo, seed, and votes
-}
+}
\ No newline at end of file
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
index d1d67c7..8bc67ae 100644
--- a/src/main/java/entity/User.java
+++ b/src/main/java/entity/User.java
@@ -7,6 +7,9 @@
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import java.util.Date;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 import com.querydsl.core.annotations.QueryEntity;
 
@@ -25,6 +28,21 @@
     public String password;
     @Column(name = "gender", nullable = false)
     public String sex;
+
+    @Column(name = "detectedCount", nullable = false)
+    public int detectedCount = 0;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "lastDetectedTime", nullable = false)
+    public Date lastDetectedTime = new Date();
+
+    @Column(name = "fake_detected_count", nullable = false)
+    public int fakeDetectedCount = 0;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "fake_last_detected_time", nullable = false)
+    public Date fakeLastDetectedTime = new Date();
+
     @Transient
     public String age;
     @Column(name = "school")
diff --git a/src/main/java/entity/UserVotes.java b/src/main/java/entity/UserVotes.java
index af28e3c..ba7d950 100644
--- a/src/main/java/entity/UserVotes.java
+++ b/src/main/java/entity/UserVotes.java
@@ -8,37 +8,29 @@
 public class UserVotes {
 
     @EmbeddedId
-    private UserVotesId id;
+    @AttributeOverrides({
+            @AttributeOverride(name = "userId", column = @Column(name = "user_id")),
+            @AttributeOverride(name = "begId", column = @Column(name = "beg_id")),
+            @AttributeOverride(name = "seedId", column = @Column(name = "seed_id"))
+    })
+    public UserVotesId id;
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "user_id", referencedColumnName = "user_id", 
-                foreignKey = @ForeignKey(name = "fk_user_votes_user"))
-    private User user;
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_user_votes_user"), insertable = false, updatable = false)
+    public User user;
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", 
-                foreignKey = @ForeignKey(name = "fk_user_votes_beg"))
-    private BegInfo begInfo;
+    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", foreignKey = @ForeignKey(name = "fk_user_votes_beg"), insertable = false, updatable = false)
+    public BegInfo begInfo;
 
     @ManyToOne(optional = false)
-    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", 
-                foreignKey = @ForeignKey(name = "fk_user_votes_seed"))
-    private Seed seed;
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_user_votes_seed"), insertable = false, updatable = false)
+    public Seed seed;
 
     @Column(name = "created_at", nullable = false)
     @Temporal(TemporalType.TIMESTAMP)
-    private Date createdAt;
+    public Date createdAt;
 
-    public UserVotes() {}
-
-    // getter and setter for the composite key and other fields
-    public UserVotesId getId() {
-        return id;
+    public UserVotes() {
     }
-
-    public void setId(UserVotesId id) {
-        this.id = id;
-    }
-
-    // getters and setters for user, begInfo, seed, createdAt
-}
+}
\ No newline at end of file
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index 71f3b4f..c509df3 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -5,6 +5,7 @@
     public static final int FarmNumber=3;
     public static final int FakeTime=3;
     public static final int BegVote=3;
+    public static final int CheatTime=5;
     // 请根据实际环境修改为可达的地址
     public static final String SqlURL = "192.168.5.9:3306";
     public static final String Database = "pt_database";
diff --git a/src/main/java/object/config.java b/src/main/java/object/config.java
new file mode 100644
index 0000000..750ce35
--- /dev/null
+++ b/src/main/java/object/config.java
@@ -0,0 +1,9 @@
+package object;
+
+public class config {
+    public String TrackerURL;
+    public int FarmNumber;
+    public int FakeTime = 5;
+    public int BegVote;
+    public String SqlURL="192.168.5.9:3306";
+}
diff --git a/src/test/java/cheattest/cheatsystest.java b/src/test/java/cheattest/cheatsystest.java
index 090500c..4f3a035 100644
--- a/src/test/java/cheattest/cheatsystest.java
+++ b/src/test/java/cheattest/cheatsystest.java
@@ -1,5 +1,549 @@
 package cheattest;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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.Persistence;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+
+import cheat.Cheat;
+import entity.Appeal;
+import entity.Seed;
+import entity.User;
+import entity.UserPT;
+import entity.config;
+
 public class cheatsystest {
-    
+    private static EntityManagerFactory emf;
+    private static EntityManager em;
+    private static Cheat cheat;
+    private static List<String> insertedAppealIds = new ArrayList<>();
+    private static List<String> insertedSeedIds = new ArrayList<>(); // 用于记录插入的假种子 ID
+
+    @BeforeAll
+    static void setup() throws Exception {
+        // 加载 MySQL 驱动
+        Class.forName("com.mysql.cj.jdbc.Driver");
+        Map<String, Object> props = new HashMap<>();
+        config cfg = new config();
+        String jdbcUrl = String.format(
+            "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
+            cfg.SqlURL, cfg.TestDatabase);
+        props.put("javax.persistence.jdbc.url", jdbcUrl);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
+        emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+        em = emf.createEntityManager();
+        cheat = new Cheat();
+        // 通过反射注入 entityManager
+        java.lang.reflect.Field f = Cheat.class.getDeclaredField("entityManager");
+        f.setAccessible(true);
+        f.set(cheat, em);
+    }
+
+    @AfterAll
+    static void teardown() {
+        // 清理测试过程中插入的 Appeal 数据
+        if (em != null && em.isOpen()) {
+            em.getTransaction().begin();
+            for (String appealId : insertedAppealIds) {
+                Appeal appeal = em.find(Appeal.class, appealId);
+                if (appeal != null) {
+                    em.remove(appeal);
+                }
+            }
+            em.getTransaction().commit();
+        }
+
+        // 清理测试过程中插入的 Seed 数据
+        if (em != null && em.isOpen()) {
+            em.getTransaction().begin();
+            for (String seedId : insertedSeedIds) {
+                Seed seed = em.find(Seed.class, seedId);
+                if (seed != null) {
+                    em.remove(seed);
+                }
+            }
+            em.getTransaction().commit();
+        }
+
+        // 清理测试过程中插入的 User 数据
+        if (em != null && em.isOpen()) {
+            em.getTransaction().begin();
+            List<String> insertedUserIds = em.createQuery("SELECT u.userid FROM User u WHERE u.accountstate = true", String.class)
+                                             .getResultList();
+            for (String userId : insertedUserIds) {
+                User user = em.find(User.class, userId);
+                if (user != null) {
+                    em.remove(user);
+                }
+            }
+            em.getTransaction().commit();
+        }
+
+        // 关闭 EntityManager 和 EntityManagerFactory
+        if (em != null && em.isOpen()) em.close();
+        if (emf != null && emf.isOpen()) emf.close();
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddAppeal() {
+        // 查询数据库中已存在的一个用户
+        String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
+                          .setMaxResults(1)
+                          .getSingleResult();
+
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("AddAppeal test #" + i, () -> {
+                // 插入 Appeal
+                String appealId = UUID.randomUUID().toString();
+                Appeal appeal = new Appeal();
+                appeal.appealid = appealId;
+                appeal.appealuserid = userId;
+                appeal.content = "Test appeal content " + i;
+                appeal.fileURL = "http://example.com/file" + i;
+                appeal.status = 0;
+
+                em.getTransaction().begin();
+                boolean result = cheat.AddAppeal(appeal);
+                em.getTransaction().commit();
+
+                Assertions.assertTrue(result, "AddAppeal 应返回 true");
+
+                // 验证 Appeal 是否插入
+                Appeal fetched = em.find(Appeal.class, appealId);
+                Assertions.assertNotNull(fetched, "数据库应能查到新插入的 Appeal");
+                Assertions.assertEquals(userId, fetched.appealuserid);
+                Assertions.assertEquals("Test appeal content " + i, fetched.content);
+
+                // 清理
+                em.getTransaction().begin();
+                em.remove(fetched);
+                em.getTransaction().commit();
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetAppeal() {
+        // 查询数据库中已存在的10个Appeal
+        List<Appeal> appeals = em.createQuery("SELECT a FROM Appeal a", Appeal.class)
+                             .setMaxResults(10)
+                             .getResultList();
+
+        List<DynamicTest> tests = new ArrayList<>();
+
+        // 前面用已有的Appeal测试能查到
+        for (int i = 0; i < Math.min(7, appeals.size()); i++) {
+            Appeal appeal = appeals.get(i);
+            tests.add(DynamicTest.dynamicTest("GetAppeal found test #" + i, () -> {
+                Appeal fetched = cheat.GetAppeal(appeal.appealid);
+                Assertions.assertNotNull(fetched, "GetAppeal 应返回非空");
+                Assertions.assertEquals(appeal.appealid, fetched.appealid);
+                Assertions.assertEquals(appeal.appealuserid, fetched.appealuserid);
+                Assertions.assertEquals(appeal.content, fetched.content);
+            }));
+        }
+
+        // 后3个用随机UUID测试查不到
+        for (int i = 7; i < 10; i++) {
+            String notExistId = UUID.randomUUID().toString();
+            tests.add(DynamicTest.dynamicTest("GetAppeal not found test #" + i, () -> {
+                Appeal fetched = cheat.GetAppeal(notExistId);
+                Assertions.assertNull(fetched, "GetAppeal 查询不存在的id应返回null");
+            }));
+        }
+
+        return tests;
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetAppealList() {
+        // 查询数据库中已存在的一个用户
+        String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
+                      .setMaxResults(1)
+                      .getSingleResult();
+        // 用于记录测试过程中插入的 Appeal ID
+
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("GetAppealList test #" + i, () -> {
+                // 插入一个新的 Appeal
+                String appealId = UUID.randomUUID().toString();
+                Appeal appeal = new Appeal();
+                appeal.appealid = appealId;
+                appeal.appealuserid = userId;
+                appeal.content = "GetAppealList test content " + i;
+                appeal.fileURL = "http://example.com/file" + i;
+                appeal.status = 0;
+
+                em.getTransaction().begin();
+                em.persist(appeal);
+                em.getTransaction().commit();
+
+                // 记录插入的 Appeal ID
+                insertedAppealIds.add(appealId);
+
+                // 调用 GetAppealList 并验证
+                Appeal[] appeals = cheat.GetAppealList();
+                Assertions.assertNotNull(appeals, "GetAppealList 应返回非空");
+
+                // 检查整个列表是否包含所有插入的数据
+                for (String id : insertedAppealIds) {
+                    boolean found = Arrays.stream(appeals)
+                                           .anyMatch(a -> a.appealid.equals(id));
+                    Assertions.assertTrue(found, "GetAppealList 应包含插入的 Appeal ID: " + id);
+                }
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testHandleAppeal() {
+        // 查询数据库中已存在的一个用户
+        String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
+                          .setMaxResults(1)
+                          .getSingleResult();
+
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("HandleAppeal test #" + i, () -> {
+                // 插入一个新的 Appeal
+                String appealId = UUID.randomUUID().toString();
+                Appeal appeal = new Appeal();
+                appeal.appealid = appealId;
+                appeal.appealuserid = userId;
+                appeal.content = "HandleAppeal test content " + i;
+                appeal.fileURL = "http://example.com/file" + i;
+                appeal.status = 0;
+
+                em.getTransaction().begin();
+                em.persist(appeal);
+                em.getTransaction().commit();
+
+                // 如果 newStatus 为 1，先将用户的 account_status 设置为 true
+                if (i % 2 == 0) { // 偶数索引对应 newStatus = 1
+                    em.getTransaction().begin();
+                    User user = em.find(User.class, userId);
+                    Assertions.assertNotNull(user, "数据库应能查到相关用户");
+                    user.accountstate = true; // 设置为 true
+                    em.getTransaction().commit();
+                }
+
+                // 测试处理申诉
+                int newStatus = (i % 2 == 0) ? 1 : 2; // 偶数索引通过申诉，奇数索引拒绝申诉
+                boolean result = cheat.HandleAppeal(appealId, newStatus);
+                Assertions.assertTrue(result, "HandleAppeal 应返回 true");
+
+                // 验证 Appeal 状态是否更新
+                Appeal updatedAppeal = em.find(Appeal.class, appealId);
+                Assertions.assertNotNull(updatedAppeal, "数据库应能查到更新后的 Appeal");
+                Assertions.assertEquals(newStatus, updatedAppeal.status, "Appeal 的状态应被更新为: " + newStatus);
+
+                // 如果申诉通过，验证用户的 account_status 是否被设置为 false
+                if (newStatus == 1) {
+                    User user = em.find(User.class, userId);
+                    Assertions.assertNotNull(user, "数据库应能查到相关用户");
+                    Assertions.assertFalse(user.accountstate, "通过申诉后用户的 account_status 应为 false");
+                }
+
+                // 清理测试数据
+                em.getTransaction().begin();
+                em.remove(updatedAppeal);
+                em.getTransaction().commit();
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetFakeSeed() {
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("GetFakeSeed test #" + i, () -> {
+                // 插入一个新的假种子
+                String seedId = UUID.randomUUID().toString();
+                String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
+                                  .setMaxResults(1)
+                                  .getSingleResult();
+
+                Seed seed = new Seed();
+                seed.seedid = seedId;
+                seed.seeduserid = userId;
+                seed.faketime = 100 + i; // 设置为大于 config.FakeTime 的值
+                seed.lastfakecheck = new Date();
+                seed.outurl = "http://example.com/fake" + i;
+                seed.title = "Fake Seed " + i;
+                seed.subtitle = "Subtitle " + i;
+                seed.seedsize = "100MB";
+                seed.seedtag = "test,fake";
+                seed.downloadtimes = 0;
+                seed.url = "http://example.com/seed" + i;
+
+                em.getTransaction().begin();
+                em.persist(seed);
+                em.getTransaction().commit();
+
+                // 记录插入的 Seed ID
+                insertedSeedIds.add(seedId);
+
+                // 调用 GetFakeSeed 并验证
+                Pair<String, String>[] fakeSeeds = cheat.GetFakeSeed();
+                Assertions.assertNotNull(fakeSeeds, "GetFakeSeed 应返回非空");
+
+                // 验证返回的假种子列表是否包含所有插入的假种子
+                for (String id : insertedSeedIds) {
+                    boolean found = Arrays.stream(fakeSeeds)
+                                           .anyMatch(pair -> pair.getLeft().equals(id));
+                    Assertions.assertTrue(found, "GetFakeSeed 应包含插入的假种子 ID: " + id);
+                }
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetPunishedUserList() {
+        List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
+
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("GetPunishedUserList test #" + i, () -> {
+                // 插入一个新的用户，accountstate 设置为 true
+                String userId = UUID.randomUUID().toString();
+                User user = new User();
+                user.userid = userId;
+                user.email = "test" + i + "@example.com";
+                user.username = "TestUser" + i;
+                user.password = "password" + i;
+                user.sex = "M";
+                user.detectedCount = 0;
+                user.lastDetectedTime = new Date();
+                user.school = "TestSchool";
+                user.pictureurl = "http://example.com/avatar" + i;
+                user.profile = "Test profile " + i;
+                user.accountstate = true; // 设置为 true
+                user.invitetimes = 5;
+
+                // 创建并设置 UserPT 实例
+                UserPT userPT = new UserPT();
+                userPT.user = user; // 关联 User 实例
+                user.userPT = userPT;
+
+                em.getTransaction().begin();
+                em.persist(user);
+                em.persist(userPT); // 持久化 UserPT 实例
+                em.getTransaction().commit();
+
+                // 记录插入的用户 ID
+                insertedUserIds.add(userId);
+
+                // 调用 GetPunishedUserList 并验证
+                String[] punishedUsers = cheat.GetPunishedUserList();
+                Assertions.assertNotNull(punishedUsers, "GetPunishedUserList 应返回非空");
+
+                // 验证返回的用户列表是否包含所有插入的用户
+                for (String id : insertedUserIds) {
+                    boolean found = Arrays.stream(punishedUsers).anyMatch(returnedId -> returnedId.equals(id));
+                    Assertions.assertTrue(found, "GetPunishedUserList 应包含插入的用户 ID: " + id);
+                }
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testPunishUser() {
+        List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
+
+        return IntStream.range(0, 10)
+            .mapToObj(i -> DynamicTest.dynamicTest("PunishUser test #" + i, () -> {
+                // 配置参数
+                int cheatTime = config.CheatTime;
+                int fakeTime = config.FakeTime;
+
+                // 插入用户 1（作弊用户）
+                String userId1 = UUID.randomUUID().toString();
+                User user1 = new User();
+                user1.userid = userId1;
+                user1.email = "cheater" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+                user1.username = "Cheater" + i;
+                user1.password = "password" + i;
+                user1.sex = "M";
+                user1.detectedCount = cheatTime + 1; // detectedCount 超过 cheatTime
+                user1.fakeDetectedCount = 0;
+                user1.lastDetectedTime = new Date();
+                user1.fakeLastDetectedTime = new Date();
+                user1.accountstate = false; // 初始状态为未封禁
+                user1.invitetimes = 5;
+
+                // 创建并设置 UserPT 实例
+                UserPT userPT1 = new UserPT();
+                userPT1.user = user1; // 关联 User 实例
+                user1.userPT = userPT1;
+
+                // 插入用户 2（非作弊用户）
+                String userId2 = UUID.randomUUID().toString();
+                User user2 = new User();
+                user2.userid = userId2;
+                user2.email = "normal" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+                user2.username = "NormalUser" + i;
+                user2.password = "password" + i;
+                user2.sex = "F";
+                user2.detectedCount = 0;
+                user2.fakeDetectedCount = fakeTime - 1; // fakeDetectedCount 未超过 fakeTime
+                user2.lastDetectedTime = new Date();
+                user2.fakeLastDetectedTime = new Date();
+                user2.accountstate = false; // 初始状态为未封禁
+                user2.invitetimes = 5;
+
+                // 创建并设置 UserPT 实例
+                UserPT userPT2 = new UserPT();
+                userPT2.user = user2; // 关联 User 实例
+                user2.userPT = userPT2;
+
+                em.getTransaction().begin();
+                em.persist(user1);
+                em.persist(userPT1); // 持久化 UserPT 实例
+                em.persist(user2);
+                em.persist(userPT2); // 持久化 UserPT 实例
+                em.getTransaction().commit();
+
+                // 记录插入的用户 ID
+                insertedUserIds.add(userId1);
+                insertedUserIds.add(userId2);
+
+                // 调用 PunishUser 方法
+                cheat.PunishUser();
+
+                // 验证用户 1 是否被封禁
+                User punishedUser1 = em.find(User.class, userId1);
+                Assertions.assertNotNull(punishedUser1, "数据库应能查到用户 1");
+                Assertions.assertTrue(punishedUser1.accountstate, "作弊用户应被封禁");
+
+                // 验证用户 2 是否未被封禁
+                User punishedUser2 = em.find(User.class, userId2);
+                Assertions.assertNotNull(punishedUser2, "数据库应能查到用户 2");
+                Assertions.assertFalse(punishedUser2.accountstate, "非作弊用户不应被封禁");
+            }))
+            .collect(Collectors.toList());
+    }
+
+    // @TestFactory
+    // Collection<DynamicTest> testDetectTrans() {
+    //     List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
+    //     List<String> insertedSeedIds = new ArrayList<>(); // 用于记录插入的种子 ID
+    //     List<String> insertedTransIds = new ArrayList<>(); // 用于记录插入的传输记录 ID
+
+    //     return IntStream.range(0, 10)
+    //         .mapToObj(i -> DynamicTest.dynamicTest("DetectTrans test #" + i, () -> {
+    //             // 插入上传用户
+    //             String uploaderId = UUID.randomUUID().toString();
+    //             User uploader = new User();
+    //             uploader.userid = uploaderId;
+    //             uploader.email = "uploader" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+    //             uploader.username = "Uploader" + i;
+    //             uploader.password = "password" + i;
+    //             uploader.sex = "M";
+    //             uploader.detectedCount = 0; // 初始 detectedCount 为 0
+    //             uploader.fakeDetectedCount = 0;
+    //             uploader.lastDetectedTime = new Date();
+    //             uploader.fakeLastDetectedTime = new Date();
+    //             uploader.accountstate = false;
+    //             uploader.invitetimes = 5;
+
+    //             // 创建并设置 UserPT 实例
+    //             UserPT uploaderPT = new UserPT();
+    //             uploaderPT.user = uploader; // 关联 User 实例
+    //             uploader.userPT = uploaderPT;
+
+    //             // 插入下载用户
+    //             String downloaderId = UUID.randomUUID().toString();
+    //             User downloader = new User();
+    //             downloader.userid = downloaderId;
+    //             downloader.email = "downloader" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+    //             downloader.username = "Downloader" + i;
+    //             downloader.password = "password" + i;
+    //             downloader.sex = "F";
+    //             downloader.detectedCount = 0;
+    //             downloader.fakeDetectedCount = 0;
+    //             downloader.lastDetectedTime = new Date();
+    //             downloader.fakeLastDetectedTime = new Date();
+    //             downloader.accountstate = false;
+    //             downloader.invitetimes = 5;
+
+    //             // 创建并设置 UserPT 实例
+    //             UserPT downloaderPT = new UserPT();
+    //             downloaderPT.user = downloader; // 关联 User 实例
+    //             downloader.userPT = downloaderPT;
+
+    //             em.getTransaction().begin();
+    //             em.persist(uploader);
+    //             em.persist(uploaderPT); // 持久化 UserPT 实例
+    //             em.persist(downloader);
+    //             em.persist(downloaderPT); // 持久化 UserPT 实例
+    //             em.getTransaction().commit();
+    //             insertedUserIds.add(uploaderId);
+    //             insertedUserIds.add(downloaderId);
+
+    //             // 插入种子
+    //             String seedId = UUID.randomUUID().toString();
+    //             Seed seed = new Seed();
+    //             seed.seedid = seedId;
+    //             seed.seeduserid = uploaderId;
+    //             seed.faketime = 0;
+    //             seed.lastfakecheck = new Date();
+    //             seed.outurl = "http://example.com/seed" + i;
+    //             seed.title = "Seed " + i;
+    //             seed.subtitle = "Subtitle " + i;
+    //             seed.seedsize = "100MB";
+    //             seed.seedtag = "test";
+    //             seed.downloadtimes = 0;
+    //             seed.url = "http://example.com/seed" + i;
+
+    //             em.getTransaction().begin();
+    //             em.persist(seed);
+    //             em.getTransaction().commit();
+    //             insertedSeedIds.add(seedId);
+
+    //             // 插入正常和异常的传输记录
+    //             List<TransRecord> transRecords = new ArrayList<>();
+    //             for (int j = 0; j < 15; j++) {
+    //                 TransRecord transRecord = new TransRecord();
+    //                 transRecord.taskid = UUID.randomUUID().toString();
+    //                 transRecord.uploaduserid = uploaderId;
+    //                 transRecord.downloaduserid = downloaderId; // 确保 downloader_id 存在于 User 表中
+    //                 transRecord.seedid = seedId; // 确保 seed_id 存在于 Seed 表中
+    //                 transRecord.upload = (j < 13) ? 100 : 1000; // 前 3 条为正常数据，后 2 条为异常数据
+    //                 transRecord.download = (j < 13) ? 90 : 10; // 异常数据的上传量远大于下载量
+    //                 transRecord.maxupload = 200;
+    //                 transRecord.maxdownload = 200;
+
+    //                 em.getTransaction().begin();
+    //                 em.persist(transRecord);
+    //                 em.getTransaction().commit();
+    //                 insertedTransIds.add(transRecord.taskid);
+    //                 transRecords.add(transRecord);
+    //             }
+
+    //             // 调用 DetectTrans 方法
+    //             cheat.DetectTrans();
+
+    //             // 验证下载用户的 detectedCount 是否增加
+    //             User detectedDownloader = em.find(User.class, downloaderId);
+    //             Assertions.assertNotNull(detectedDownloader, "数据库应能查到上传用户");
+    //             Assertions.assertEquals(2, detectedDownloader.detectedCount, "上传用户的 detectedCount 应增加 2（对应 2 条异常数据）");
+    //         }))
+    //         .collect(Collectors.toList());
+    // }
 }
