更新求种后端函数

Change-Id: I9e593e5eecfc6337120f75b3f6338f8279579dd1
diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index 3eecaff..cb35c05 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,13 +1,22 @@
 package cheat;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
 import javax.persistence.PersistenceContext;
 import javax.transaction.Transactional;
 
 import org.apache.commons.lang3.tuple.Pair;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 import com.querydsl.jpa.impl.JPAQueryFactory;
 
@@ -16,19 +25,37 @@
 import entity.QSeed;
 import entity.User;
 import entity.config;
+import entity.QUser;
+import entity.TTorent;
 
 public class Cheat implements CheatInterfnterface {
 
     @PersistenceContext
-    private EntityManager entityManager;
+    private EntityManagerFactory emf;
+
+    public Cheat() {
+        config cfg = new config();
+        Map<String,Object> props = new HashMap<>();
+        props.put("javax.persistence.jdbc.url",
+                  "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+    }
 
     @Override
     @Transactional
     public boolean AddAppeal(Appeal appeal) {
+        EntityManager entityManager = emf.createEntityManager();
         try {
+            entityManager.getTransaction().begin();
             entityManager.persist(appeal);
+            entityManager.getTransaction().commit();
         } catch (Exception e) {
             e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
             return false;
         }
         return true;
@@ -37,6 +64,7 @@
     @Override
     public Appeal GetAppeal(String appealid) {
         try {
+            EntityManager entityManager = emf.createEntityManager();
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
             Appeal appeal = queryFactory
@@ -52,6 +80,7 @@
 
     @Override
     public Appeal[] GetAppealList() {
+        EntityManager entityManager = emf.createEntityManager();
         try {
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
@@ -62,29 +91,44 @@
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            if (entityManager != null) {
+                entityManager.close();
+            }
         }
     }
 
     @Override
     public boolean HandleAppeal(String appealid, Integer status) {
+        EntityManager entityManager = emf.createEntityManager();
         try {
             Appeal appeal = GetAppeal(appealid);
             if (appeal != null) {
                 appeal.status = status;
+                entityManager.getTransaction().begin();
                 entityManager.merge(appeal);
                 User user = entityManager.find(User.class, appeal.appealuserid);
-                if (user != null && user.accountstate != false) {
+                // if (user != null && user.accountstate != false) {
+                if (user != null) {
                     if (status == 1) {
                         user.accountstate = false;
                     }
                     entityManager.merge(user);
                 }
+                entityManager.getTransaction().commit();
                 return true;
             }
             return false;
         } catch (Exception e) {
             e.printStackTrace();
+            if (emf.createEntityManager().getTransaction().isActive()) {
+                emf.createEntityManager().getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entityManager != null) {
+                entityManager.close();
+            }
         }
     }
 
@@ -92,12 +136,13 @@
     public Pair<String, String>[] GetFakeSeed() {
         List<Pair<String, String>> fakeSeeds = new ArrayList<>();
         try {
+            EntityManager entityManager = emf.createEntityManager();
             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))
+                .where(qSeed.faketime.gt(config.getFakeTime()))
                 .fetch();
             for (com.querydsl.core.Tuple result : results) {
                 String seedid = result.get(qSeed.seedid);
@@ -115,6 +160,7 @@
     public String[] GetPunishedUserList() {
         List<String> punishedUsers = new ArrayList<>();
         try {
+            EntityManager entityManager = emf.createEntityManager();
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             entity.QUser qUser = entity.QUser.user;
             List<String> results = queryFactory
@@ -187,12 +233,13 @@
 
     @Override
     public void PunishUser(){
+        EntityManager entityManager = emf.createEntityManager();
         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)))
+            .where(qUser.detectedCount.gt(config.getCheatTime()) 
+                .or(qUser.fakeDetectedCount.gt(config.getFakeTime())))
             .fetch();
 
         for (User user : users) {
@@ -200,4 +247,147 @@
             entityManager.merge(user);
         }
     }
+
+    @Override
+    public User[] GetCheatUsers() {
+        EntityManager entityManager = emf.createEntityManager();
+        List<User> cheatUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QUser qUser = QUser.user;
+            cheatUsers = queryFactory
+                .selectFrom(qUser)
+                .where(qUser.accountstate.eq(true))
+                .fetch();
+            return cheatUsers.toArray(new User[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public User[] GetSuspiciousUsers() {
+        EntityManager entityManager = emf.createEntityManager();
+        List<User> suspiciousUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QUser qUser = QUser.user;
+            suspiciousUsers = queryFactory
+                .selectFrom(qUser)
+                .where((qUser.detectedCount.gt(0)
+                    .or(qUser.fakeDetectedCount.gt(0)))
+                    .and(qUser.accountstate.eq(false)))
+                .fetch();
+            return suspiciousUsers.toArray(new User[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+    
+    @Override
+    public int UnbanUser(String userid) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            if (user.accountstate) {
+                user.accountstate = false; // 解封用户
+                entityManager.getTransaction().begin();
+                entityManager.merge(user);
+                entityManager.getTransaction().commit();
+                return 0; // 成功解封
+            }
+            return 2; // 用户未被封禁
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public int BanUser(String userid) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            if (!user.accountstate) {
+                user.accountstate = true; // 封禁用户
+                entityManager.getTransaction().begin();
+                entityManager.merge(user);
+                entityManager.getTransaction().commit();
+                return 0; // 成功封禁
+            }
+            return 2; // 用户已被封禁
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public int SubmitAppeal(String userid, String content, File file) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            Appeal appeal = new Appeal();
+            appeal.appealid = java.util.UUID.randomUUID().toString();
+            appeal.appealuserid = userid;
+            appeal.content = content;
+            appeal.user = user; // 设置关联的用户
+            Path storageDir = Paths.get(config.APPEAL_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = file.getName();
+            Path target = storageDir.resolve(appeal.appealid + "_" + filename);
+            Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+            appeal.status = 0; // 初始状态为未处理
+            appeal.fileURL = target.toString(); // 设置文件存储路径
+            entityManager.getTransaction().begin();
+            entityManager.persist(appeal);
+            entityManager.getTransaction().commit();
+            return 0; // 成功提交申诉
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/cheat/CheatInterfnterface.java b/src/main/java/cheat/CheatInterfnterface.java
index e7e4942..81aeb2c 100644
--- a/src/main/java/cheat/CheatInterfnterface.java
+++ b/src/main/java/cheat/CheatInterfnterface.java
@@ -1,6 +1,9 @@
 package cheat;
 import org.apache.commons.lang3.tuple.Pair;
 import entity.Appeal;
+import entity.User;
+import java.io.File;
+
 public interface CheatInterfnterface{
     public Pair<String,String>[] GetFakeSeed();//返回做假种的列表,<seedid,userid>
     public void DetectFakeSeed();//检测所有种子是否为假种,并将检测结果写入数据表
@@ -15,4 +18,12 @@
     public Appeal[] GetAppealList();//获取所有申诉列表
     public boolean HandleAppeal(String appealid, Integer status);//处理申诉
     // status = 0表示未处理, = 1表示通过, = 2表示拒绝
+
+    public User[] GetCheatUsers();//获取作弊用户列表,返回User对象数组
+    public User[] GetSuspiciousUsers();//获取可疑用户列表,返回User对象数组
+    public int UnbanUser(String userid);//解封用户,返回0表示成功,1表示用户不存在,2表示用户未被封禁
+    public int BanUser(String userid);//封禁用户,返回0表示成功,1表示用户不存在,2表示用户已被封禁
+
+    public int SubmitAppeal(String userid, String content, File file); // 添加新的申诉,返回0表示成功,1表示用户不存在,2表示内容不合法
+
 }