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
