diff --git a/et --hard b0d52b6 b/et --hard b0d52b6
new file mode 100644
index 0000000..5dacbbe
--- /dev/null
+++ b/et --hard b0d52b6
@@ -0,0 +1,58 @@
+[33m9afbc55[m[33m ([m[1;36mHEAD[m[33m -> [m[1;32mmaster[m[33m)[m HEAD@{0}: pull --rebase (finish): returning to refs/heads/master
+[33m9afbc55[m[33m ([m[1;36mHEAD[m[33m -> [m[1;32mmaster[m[33m)[m HEAD@{1}: pull --rebase (pick): 修改cheat文件
+[33me8716ad[m[33m ([m[1;31morigin/master[m[33m, [m[1;31morigin/HEAD[m[33m)[m HEAD@{2}: pull --rebase (start): checkout e8716ada9fc18154108495d7c389b7fc0f269580
+[33mb0d52b6[m HEAD@{3}: commit (amend): 修改cheat文件
+[33m34caf7d[m HEAD@{4}: commit: 修改cheat文件
+[33m720e94e[m HEAD@{5}: commit (amend): Api修改暂存
+[33mba2cb98[m HEAD@{6}: pull: Fast-forward
+[33m26f66f5[m HEAD@{7}: pull: Fast-forward
+[33m7dc11a2[m HEAD@{8}: pull: Fast-forward
+[33mc69af0a[m HEAD@{9}: pull: Fast-forward
+[33medf430a[m HEAD@{10}: commit: 修复testGetAppealList函数
+[33m5ba779f[m HEAD@{11}: commit (amend): Cheat接口部分实现及测试代码
+[33m7a0803a[m HEAD@{12}: commit (amend): 函数拼写矫正&接口修改
+[33md4167c1[m HEAD@{13}: reset: moving to HEAD~1
+[33m56e3ca5[m HEAD@{14}: commit (amend): Cheat接口部分实现及测试代码
+[33m66c7797[m HEAD@{15}: commit (amend): 函数拼写矫正&接口修改
+[33m90f3d5d[m HEAD@{16}: reset: moving to HEAD~1
+[33m99eaef3[m HEAD@{17}: commit (amend): Cheat部分函数实现及测试代码
+[33m1775145[m HEAD@{18}: commit (amend): Cheat System部分功能实现及单元测试代码
+[33m80a7003[m HEAD@{19}: rebase (finish): returning to refs/heads/master
+[33m80a7003[m HEAD@{20}: commit (amend): CheatSystem开发
+[33m2a7ca56[m HEAD@{21}: pull --rebase (pick): Cheat接口改动
+[33m90f3d5d[m HEAD@{22}: pull --rebase (pick): 函数拼写矫正&接口修改
+[33md4167c1[m HEAD@{23}: pull --rebase (pick): 函数拼写矫正&接口修改
+[33m33a7d95[m HEAD@{24}: pull --rebase (start): checkout 33a7d95241577b2720875014004e0e9a1178e2a5
+[33md7dec5f[m HEAD@{25}: commit: CheatSystem开发
+[33ma9594e4[m HEAD@{26}: reset: moving to HEAD
+[33ma9594e4[m HEAD@{27}: rebase (finish): returning to refs/heads/master
+[33ma9594e4[m HEAD@{28}: rebase (pick): Cheat接口改动
+[33mb413180[m HEAD@{29}: rebase (continue): 函数拼写矫正&接口修改
+[33m21e8079[m HEAD@{30}: rebase (continue): 函数拼写矫正&接口修改
+[33mf35409f[m HEAD@{31}: pull --rebase (start): checkout f35409f7212fe81f9f656d45cd305bbf2207f92f
+[33mb97358d[m HEAD@{32}: commit (amend): 本地冲突暂存
+[33maa78bae[m HEAD@{33}: merge refs/remotes/origin/master: Merge made by the 'ort' strategy.
+[33m8b4f838[m HEAD@{34}: commit: Cheat接口改动
+[33m6f65699[m HEAD@{35}: commit: 函数拼写矫正&接口修改
+[33mc9d0644[m HEAD@{36}: commit (amend): 函数拼写矫正&接口修改
+[33m9b70bb3[m HEAD@{37}: commit: 改动Cheat接口
+[33m57f2bac[m HEAD@{38}: pull: Fast-forward
+[33m1d888e1[m HEAD@{39}: pull: Fast-forward
+[33ma912512[m HEAD@{40}: pull: Fast-forward
+[33ma8babc6[m HEAD@{41}: commit (merge): 处理冲突
+[33m0e21c14[m HEAD@{42}: commit: 处理更新
+[33m53e52fc[m HEAD@{43}: commit (amend): 更新API文档 by Raver
+[33mc5deb8f[m HEAD@{44}: commit (amend): 更新API文档 by Raver
+[33mbe6e3e1[m HEAD@{45}: commit: 更新API文档 by Raver
+[33mac1a633[m HEAD@{46}: pull: Fast-forward
+[33mb10834c[m HEAD@{47}: pull: Fast-forward
+[33maa249ae[m HEAD@{48}: pull: Fast-forward
+[33m1b9b88e[m HEAD@{49}: pull: Fast-forward
+[33m30e7379[m HEAD@{50}: pull: Fast-forward
+[33m5663419[m HEAD@{51}: commit (amend): Hello by Raver
+[33mf593971[m HEAD@{52}: commit: Hello by Raver
+[33mbab2b5c[m HEAD@{53}: pull: Fast-forward
+[33mfd27075[m[33m ([m[1;31morigin/Raver[m[33m)[m HEAD@{54}: checkout: moving from Raver to master
+[33maf22949[m[33m ([m[1;32mRaver[m[33m)[m HEAD@{55}: commit: Add user_torrent_stats table creation script
+[33mfd27075[m[33m ([m[1;31morigin/Raver[m[33m)[m HEAD@{56}: checkout: moving from master to Raver
+[33mfd27075[m[33m ([m[1;31morigin/Raver[m[33m)[m HEAD@{57}: clone: from ssh://gerrit.lilingkun.com:29418/G10-PT-TRM
diff --git a/pom.xml b/pom.xml
index caedede..34a5ced 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,224 +3,223 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                              http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-  <!-- 基本坐标 -->
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.example</groupId>
-  <artifactId>simple-maven-project</artifactId>
-  <version>1.0-SNAPSHOT</version>
+    <!-- 基本坐标 -->
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.example</groupId>
+    <artifactId>simple-maven-project</artifactId>
+    <version>1.0-SNAPSHOT</version>
 
-  <!-- 指定 Java 版本 -->
-  <properties>
-    <!-- 使用 Java 9，以支持接口中的 private 方法 -->
-    <maven.compiler.source>9</maven.compiler.source>
-    <!-- 如果还没定义，请添加 QueryDSL 版本 -->
-    <querydsl.version>5.0.0</querydsl.version>
-  </properties>
+    <!-- 指定 Java 版本 -->
+    <properties>
+        <!-- 使用 Java 9，以支持接口中的 private 方法 -->
+        <maven.compiler.source>9</maven.compiler.source>
+        <!-- 如果还没定义，请添加 QueryDSL 版本 -->
+        <querydsl.version>5.0.0</querydsl.version>
+    </properties>
 
-  <!-- 添加依赖 -->
-  <dependencies>
-    <!-- Apache Commons Lang3，用于 Pair 等工具类 -->
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.12.0</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.persistence</groupId>
-      <artifactId>javax.persistence-api</artifactId>
-      <version>2.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-core</artifactId>
-      <version>5.6.14.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>com.mysql</groupId>
-      <artifactId>mysql-connector-j</artifactId>
-      <version>8.0.32</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>1.7.36</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>1.7.36</version>
-    </dependency>
-    <!-- QueryDSL -->
-    <dependency>
-      <groupId>com.querydsl</groupId>
-      <artifactId>querydsl-jpa</artifactId>
-      <version>${querydsl.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.querydsl</groupId>
-      <artifactId>querydsl-apt</artifactId>
-      <version>${querydsl.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.annotation</groupId>
-      <artifactId>javax.annotation-api</artifactId>
-      <version>1.3.2</version>
-    </dependency>
-    <!-- JUnit Jupiter API & Engine for writing and running tests -->
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter</artifactId>
-      <version>5.9.1</version>
-      <scope>test</scope>
-    </dependency>
-    <!-- JUnit Jupiter Engine -->
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-engine</artifactId>
-      <version>5.9.1</version>
-      <scope>test</scope>
-    </dependency>
-    <!-- 添加 Querydsl 核心依赖 -->
-    <dependency>
-      <groupId>com.querydsl</groupId>
-      <artifactId>querydsl-core</artifactId>
-      <version>5.0.0</version>
-    </dependency>
-    <!-- 添加 Querydsl APT，仅在编译时使用 -->
-    <dependency>
-      <groupId>com.querydsl</groupId>
-      <artifactId>querydsl-apt</artifactId>
-      <version>5.0.0</version>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
+    <!-- 添加依赖 -->
+    <dependencies>
+        <!-- Apache Commons Lang3，用于 Pair 等工具类 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.persistence</groupId>
+            <artifactId>javax.persistence-api</artifactId>
+            <version>2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+            <version>5.6.14.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <version>8.0.32</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.36</version>
+        </dependency>
+        <!-- QueryDSL -->
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+            <version>${querydsl.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <version>${querydsl.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <!-- JUnit Jupiter API & Engine for writing and running tests -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>5.9.1</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- JUnit Jupiter Engine -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>5.9.1</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- 添加 Querydsl 核心依赖 -->
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-core</artifactId>
+            <version>5.0.0</version>
+        </dependency>
+        <!-- 添加 Querydsl APT，仅在编译时使用 -->
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <version>5.0.0</version>
+            <scope>provided</scope>
+        </dependency>
 
-  <!-- 构建配置 -->
-  <build>
-    <plugins>
-      <!-- 编译插件，设定 Java 9 编译 -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <release>9</release>
-          <compilerArgs>
-            <arg>--add-modules</arg>
-            <arg>java.xml.ws.annotation</arg>
-          </compilerArgs>
-          <annotationProcessorPaths>
-            <path>
-              <groupId>com.querydsl</groupId>
-              <artifactId>querydsl-apt</artifactId>
-              <version>${querydsl.version}</version>
-              <classifier>jpa</classifier>
-            </path>
-            <path>
-              <groupId>com.querydsl</groupId>
-              <artifactId>querydsl-jpa</artifactId>
-              <version>${querydsl.version}</version>
-            </path>
-            <path>
-              <groupId>javax.annotation</groupId>
-              <artifactId>javax.annotation-api</artifactId>
-              <version>1.3.2</version>
-            </path>
-            <path>
-              <groupId>javax.persistence</groupId>
-              <artifactId>javax.persistence-api</artifactId>
-              <version>2.2</version>
-            </path>
-          </annotationProcessorPaths>
-          <generatedSourcesDirectory>${project.build.directory}/generated-sources/java</generatedSourcesDirectory>
-        </configuration>
-      </plugin>
-      <!-- 执行插件，方便 mvn exec:java 直接运行 -->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>3.1.0</version>
-        <configuration>
-          <mainClass>api.ApiMain</mainClass>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>com.mysema.maven</groupId>
-        <artifactId>apt-maven-plugin</artifactId>
-        <version>1.1.3</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>process</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
-              <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.22.2</version>
-        <configuration>
-          <includes>
-            <include>**/*Test.java</include>
-          </includes>
-          <!-- 确保 test 可以访问 main 的类 -->
-          <useSystemClassLoader>true</useSystemClassLoader>
-          <useManifestOnlyJar>false</useManifestOnlyJar>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.22.2</version>
-        <configuration>
-          <includes>
-            <include>**/*Test.java</include>
-          </includes>
-        </configuration>
-      </plugin>
-      <!-- Optional: 将生成目录加入编译生命周期 -->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <version>3.2.0</version>
-        <executions>
-          <execution>
-            <id>add-source</id>
-            <phase>generate-sources</phase>
-            <goals><goal>add-source</goal></goals>
-            <configuration>
-              <sources>
-                <source>${project.build.directory}/generated-sources/java</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <!-- 添加 APT 插件配置，生成 Q 类 -->
-      <plugin>
-        <groupId>com.mysema.maven</groupId>
-        <artifactId>apt-maven-plugin</artifactId>
-        <version>1.1.3</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>process</goal>
-            </goals>
-            <configuration>
-              <!-- 生成目录，可根据项目实际调整 -->
-              <outputDirectory>target/generated-sources/java</outputDirectory>
-              <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>2.5.6</version> <!-- 根据需要调整版本 -->
+        </dependency>
+    </dependencies>
+
+    <!-- 构建配置 -->
+    <build>
+        <plugins>
+            <!-- 编译插件，设定 Java 9 编译 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <release>9</release>
+                    <compilerArgs>
+                        <arg>--add-modules</arg>
+                        <arg>java.xml.ws.annotation</arg>
+                    </compilerArgs>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>com.querydsl</groupId>
+                            <artifactId>querydsl-apt</artifactId>
+                            <version>${querydsl.version}</version>
+                            <classifier>jpa</classifier>
+                        </path>
+                        <path>
+                            <groupId>com.querydsl</groupId>
+                            <artifactId>querydsl-jpa</artifactId>
+                            <version>${querydsl.version}</version>
+                        </path>
+                        <path>
+                            <groupId>javax.annotation</groupId>
+                            <artifactId>javax.annotation-api</artifactId>
+                            <version>1.3.2</version>
+                        </path>
+                        <path>
+                            <groupId>javax.persistence</groupId>
+                            <artifactId>javax.persistence-api</artifactId>
+                            <version>2.2</version>
+                        </path>
+                    </annotationProcessorPaths>
+                    <generatedSourcesDirectory>${project.build.directory}/generated-sources/java</generatedSourcesDirectory>
+                </configuration>
+            </plugin>
+            <!-- 执行插件，方便 mvn exec:java 直接运行 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <mainClass>api.ApiMain</mainClass>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.22.2</version>
+                <configuration>
+                    <includes>
+                        <include>**/*Test.java</include>
+                    </includes>
+                    <!-- 确保 test 可以访问 main 的类 -->
+                    <useSystemClassLoader>true</useSystemClassLoader>
+                    <useManifestOnlyJar>false</useManifestOnlyJar>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.5.6</version>
+            </plugin>
+            <!-- Optional: 将生成目录加入编译生命周期 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>3.2.0</version>
+                <executions>
+                    <execution>
+                        <id>add-source</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.build.directory}/generated-sources/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- 添加 APT 插件配置，生成 Q 类 -->
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <!-- 生成目录，可根据项目实际调整 -->
+                            <outputDirectory>target/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>
\ No newline at end of file
diff --git a/src/main/java/api/ApiApplication.java b/src/main/java/api/ApiApplication.java
new file mode 100644
index 0000000..93eb640
--- /dev/null
+++ b/src/main/java/api/ApiApplication.java
@@ -0,0 +1,11 @@
+package api;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ApiApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ApiApplication.class, args);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
new file mode 100644
index 0000000..a683b0e
--- /dev/null
+++ b/src/main/java/api/ApiController.java
@@ -0,0 +1,78 @@
+package api;
+
+import java.io.File;
+
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import database.Database1;
+import entity.Seed;
+import tracker.Tracker;
+
+@RestController
+public class ApiController implements ApiInterface {
+
+    private static Database1 db;
+
+    private static Tracker tracker;
+
+    @Override
+    public ResponseEntity<Integer> saveTorrent(
+        @RequestParam("userid") String userid,
+        @RequestParam("title") String title,
+        @RequestParam("tag") String tag,
+        @RequestParam("file") MultipartFile file
+    ) {
+        try {
+            Seed seed = new Seed();
+            seed.seedid = "exampleSeedId"; // 示例种子ID
+            seed.seeduserid = userid; // 示例用户ID
+            seed.title = title; // 示例标题
+            seed.seedsize = "1GB"; // 示例种子大小
+            seed.seedtag = tag; // 示例标签
+            seed.url = "http://example.com/torrent"; // 示例URL
+            db = new Database1();
+            tracker = new Tracker();
+            int ret = db.RegisterSeed(seed);
+            System.out.println("RegisterSeed ret: " + ret);
+            System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
+            // Convert MultipartFile to File
+            File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
+            file.transferTo(tempFile);
+            tracker.SaveTorrent(seed.seedid, tempFile);
+            // Optionally, delete the temp file after saving if not needed
+            // tempFile.delete();
+            return ResponseEntity.ok(0); // 返回 0 表示成功
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseEntity.status(500).body(1); // 返回 1 表示失败
+        }
+    }
+
+    @Override
+    public ResponseEntity<Resource> getTorrent(
+        @RequestParam("seedid") String seedid,
+        @RequestParam("userid") String userid,
+        @RequestParam("ip") String ip
+    ) {
+        // 实现获取种子文件的逻辑
+        // 示例：从本地目录中查找文件
+        tracker = new Tracker();
+        File file = tracker.GetTTorent(seedid, userid, ip);
+        if (file != null) {
+            FileSystemResource resource = new FileSystemResource(file);
+            return ResponseEntity.ok()
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
+                .contentType(MediaType.APPLICATION_OCTET_STREAM)
+                .body(resource);
+        } else {
+            return ResponseEntity.notFound().build(); // 返回 404 表示文件未找到
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index 495226d..ab3408c 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -1,5 +1,30 @@
 package api;
 
+import org.springframework.core.io.Resource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+@RequestMapping("/api")
 public interface ApiInterface {
-    
+
+    @PostMapping("/save-torrent")
+    ResponseEntity<Integer> saveTorrent(
+        @RequestParam("userid") String userid,
+        @RequestParam("title") String title,
+        @RequestParam("tag") String tag,
+        @RequestParam("file") MultipartFile file
+    );
+
+    @GetMapping("/get-torrent")
+    ResponseEntity<Resource> getTorrent(
+        @RequestParam("seedid") String seedid,
+        @RequestParam("userid") String userid,
+        @RequestParam("ip") String ip
+    );
 }
\ No newline at end of file
diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index 270f2fd..3eecaff 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,14 +1,11 @@
 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.EntityTransaction;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
 
 import org.apache.commons.lang3.tuple.Pair;
 
@@ -22,138 +19,94 @@
 
 public class Cheat implements CheatInterfnterface {
 
-    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);
-    }
-
-    // 测试时注入
-    public Cheat(EntityManagerFactory emf) {
-        this.emf = emf;
-    }
-
-    private EntityManager getEntityManager() {
-        return emf.createEntityManager();
-    }
+    @PersistenceContext
+    private EntityManager entityManager;
 
     @Override
+    @Transactional
     public boolean AddAppeal(Appeal appeal) {
-        EntityManager em = getEntityManager();
-        EntityTransaction tx = em.getTransaction();
         try {
-            tx.begin();
-            em.persist(appeal);
-            tx.commit();
+            entityManager.persist(appeal);
         } catch (Exception e) {
-            if (tx.isActive()) {
-                tx.rollback();
-            }
             e.printStackTrace();
             return false;
-        } finally {
-            em.close();
         }
         return true;
     }
 
     @Override
     public Appeal GetAppeal(String appealid) {
-        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
             Appeal appeal = queryFactory
-                    .selectFrom(qAppeal)
-                    .where(qAppeal.appealid.eq(appealid))
-                    .fetchOne();
+                .selectFrom(qAppeal)
+                .where(qAppeal.appealid.eq(appealid))
+                .fetchOne();
             return appeal;
         } catch (Exception e) {
             e.printStackTrace();
             return null;
-        } finally {
-            em.close();
         }
     }
 
     @Override
     public Appeal[] GetAppealList() {
-        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
             List<Appeal> appeals = queryFactory
-                    .selectFrom(qAppeal)
-                    .fetch();
+                .selectFrom(qAppeal)
+                .fetch();
             return appeals.toArray(new Appeal[0]);
         } catch (Exception e) {
             e.printStackTrace();
             return null;
-        } finally {
-            em.close();
         }
     }
 
     @Override
     public boolean HandleAppeal(String appealid, Integer status) {
-        EntityManager em = getEntityManager();
-        EntityTransaction tx = em.getTransaction();
         try {
-            tx.begin();
-            Appeal appeal = em.find(Appeal.class, appealid);
+            Appeal appeal = GetAppeal(appealid);
             if (appeal != null) {
                 appeal.status = status;
-                em.merge(appeal);
-                User user = em.find(User.class, appeal.appealuserid);
+                entityManager.merge(appeal);
+                User user = entityManager.find(User.class, appeal.appealuserid);
                 if (user != null && user.accountstate != false) {
                     if (status == 1) {
                         user.accountstate = false;
                     }
-                    em.merge(user);
+                    entityManager.merge(user);
                 }
-                tx.commit();
                 return true;
             }
             return false;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
-        } finally {
-            if (tx.isActive()) {
-                tx.rollback();
-            }
-            em.close();
         }
     }
 
     @Override
     public Pair<String, String>[] GetFakeSeed() {
         List<Pair<String, String>> fakeSeeds = new ArrayList<>();
-        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
+            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();
+                .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);
+                String userid = result.get(qSeed.seeduserid);
                 fakeSeeds.add(Pair.of(seedid, userid));
             }
         } catch (Exception e) {
             e.printStackTrace();
             return null;
-        } finally {
-            em.close();
         }
         return fakeSeeds.toArray(new Pair[0]);
     }
@@ -161,23 +114,20 @@
     @Override
     public String[] GetPunishedUserList() {
         List<String> punishedUsers = new ArrayList<>();
-        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
+            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();
+                .select(qUser.userid)
+                .from(qUser)
+                .where(qUser.accountstate.isTrue())
+                .fetch();
             for (String userid : results) {
                 punishedUsers.add(userid);
             }
         } catch (Exception e) {
             e.printStackTrace();
             return null;
-        } finally {
-            em.close();
         }
         return punishedUsers.toArray(new String[0]);
     }
@@ -198,17 +148,21 @@
 
         //     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);
@@ -223,37 +177,27 @@
     }
 
     @Override
-    public void DetectFakeSeed() {
+    public void DetectFakeSeed(){
     }
 
     @Override
-    public boolean DetectFakeSeed(String seedid) {
+    public boolean DetectFakeSeed(String seedid){
         return false;
     }
 
     @Override
-    public void PunishUser() {
-        EntityManager em = getEntityManager();
-        EntityTransaction tx = em.getTransaction();
-        try {
-            tx.begin();
-            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
-            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();
+    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;
-                em.merge(user);
-            }
-            tx.commit();
-        } catch (Exception e) {
-            if (tx.isActive()) tx.rollback();
-        } finally {
-            em.close();
+        for (User user : users) {
+            user.accountstate = true;
+            entityManager.merge(user);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 766c90a..f835288 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -5,7 +5,7 @@
 import java.util.Map;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
 import javax.persistence.Persistence;
 
 import com.querydsl.jpa.impl.JPAQuery;
@@ -23,68 +23,55 @@
 import entity.User;
 import entity.UserPT;
 import entity.UserStar;
+import entity.config;
 
 public class Database1 implements DataManagerInterface {
-
-    private EntityManagerFactory emf;
+    @PersistenceContext
+    private final EntityManager entitymanager;
 
     public Database1() {
-        entity.config cfg = new entity.config();
-        Map<String, Object> props = new HashMap<>();
-        props.put("javax.persistence.jdbc.url", "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
+        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);
-    }
-
-    // 方便测试时注入
-    public Database1(EntityManagerFactory emf) {
-        this.emf = emf;
-    }
-
-    private EntityManager getEntityManager() {
-        return emf.createEntityManager();
+        this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
     }
 
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
-    public int RegisterUser(User userinfo) {
-        EntityManager em = getEntityManager();
-        try {
-            JPAQuery<String> query = new JPAQuery<>(em);
+    public int RegisterUser(User userinfo){
+        try{
+            JPAQuery<String> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             List<String> allEmails = query.select(u.email).from(u).fetch();
 
-            if (allEmails.contains(userinfo.email)) {
+            if(allEmails.contains(userinfo.email)){
                 return 1;
             }
-            em.getTransaction().begin();
-            em.persist(userinfo);
-            em.getTransaction().commit();
+            entitymanager.persist(userinfo);
             return 0;
 
-        } catch (Exception e) {
+        }catch(Exception e){
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     // 返回状态：0 success，1 不存在，2其他原因
     @Override
-    public int UpdateInformation(User userinfo) {
-        EntityManager em = getEntityManager();
+    public int UpdateInformation(User userinfo){
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            JPAQuery<User> query = new JPAQuery<>(em);
+            JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
 
-            if (updateUser == null) {
+            if(updateUser == null){
                 return 1;
             }
             // 只更新需要的字段，避免破坏持久化状态和关联关系
@@ -98,305 +85,242 @@
             updateUser.accountstate = userinfo.accountstate;
             updateUser.invitetimes = userinfo.invitetimes;
             // 如有其他字段也一并赋值
-            em.getTransaction().begin();
-            em.merge(updateUser);
-            em.getTransaction().commit();
+            entitymanager.merge(updateUser);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     // 返回用户的全部基本信息
     @Override
-    public User GetInformation(String userid) {
-        EntityManager em = getEntityManager();
-        try {
-            User user = em.find(User.class, userid);
-            return user;
-        } finally {
-            em.close();
-        }
+    public User GetInformation(String userid){
+        User user = entitymanager.find(User.class, userid);
+        return user;
     }
 
     //返回用户的全部pt站信息
     @Override
-    public UserPT GetInformationPT(String userid) {
-        EntityManager em = getEntityManager();
-        try {
-            UserPT userPT = em.find(UserPT.class, userid);
-            return userPT;
-        } finally {
-            em.close();
-        }
+    public UserPT GetInformationPT(String userid){
+        UserPT userPT = entitymanager.find(UserPT.class, userid);
+        return userPT;
     }
 
     //返回状态：0 success，1 邮箱重复，2其他原因
     @Override
-    public int UpdateInformationPT(UserPT userinfo) {
-        EntityManager em = getEntityManager();
-        try {
-            JPAQuery<UserPT> query = new JPAQuery<>(em);
+    public int UpdateInformationPT(UserPT userinfo){
+        try{
+            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
-
-            if (userPT == null) {
+        
+            if(userPT == null){
                 return 1;
             }
             userPT = userinfo;
-            em.getTransaction().begin();
-            em.merge(userPT);
-            em.getTransaction().commit();
+            entitymanager.merge(userPT);
             return 0;
 
-        } catch (Exception e) {
+        }catch(Exception e){
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
     }
 
     //返回状态：0 success，1 id重复，2其他原因
     @Override
-    public int RegisterUserPT(UserPT userinfo) {
-        EntityManager em = getEntityManager();
+    public int RegisterUserPT(UserPT userinfo){
         try {
-            JPAQuery<UserPT> query = new JPAQuery<>(em);
+            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT checkUserPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
             if (checkUserPT != null) {
                 return 1;
             }
-            em.getTransaction().begin();
-            em.persist(userinfo);
-            em.getTransaction().commit();
+            entitymanager.persist(userinfo);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
     }
 
     //返回种子的全部信息
     @Override
-    public Seed GetSeedInformation(String seedid) {
-        EntityManager em = getEntityManager();
-        try {
-            JPAQuery<Seed> query = new JPAQuery<>(em);
-            QSeed s = QSeed.seed;
-            Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
-            return seed;
-        } finally {
-            em.close();
-        }
+    public Seed GetSeedInformation(String seedid){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
+        return seed;
     }
 
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
-    public int RegisterSeed(Seed seedinfo) {
-        EntityManager em = getEntityManager();
+    public int RegisterSeed(Seed seedinfo){
         try {
-            JPAQuery<Seed> query = new JPAQuery<>(em);
+            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
             if (seed != null) {
                 return 1;
             }
-            em.getTransaction().begin();
-            em.persist(seedinfo);
-            em.getTransaction().commit();
+            entitymanager.persist(seedinfo);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
     }
 
     //接收新的种子然后更新其全部属性
     @Override
-    public int UpdateSeed(Seed seedinfo) {
-        EntityManager em = getEntityManager();
+    public int UpdateSeed(Seed seedinfo){
         try {
-            JPAQuery<Seed> query = new JPAQuery<>(em);
+            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
             if (seed == null) {
                 return 1;
             }
             seed = seedinfo;
-            em.getTransaction().begin();
-            em.merge(seed);
-            em.getTransaction().commit();
+            entitymanager.merge(seed);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
     }
 
     //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     @Override
-    public Seed[] SearchSeed(String userQ) {
-        EntityManager em = getEntityManager();
-        try {
-            JPAQuery<Seed> query = new JPAQuery<>(em);
-            QSeed s = QSeed.seed;
-            List<Seed> seeds = query.select(s).from(s).fetch();
+    public Seed[] SearchSeed(String userQ){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        List<Seed> seeds = query.select(s).from(s).fetch();
 
-            if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
-                return seeds.toArray(new Seed[0]);
-            }
-
-            String processedQuery = userQ.toLowerCase().trim();
-            Map<Seed, Integer> seedCountMap = new HashMap<>();
-            for (Seed seed : seeds) {
-                String title = seed.title.toLowerCase().trim();
-                int count = countCommonCharacter(processedQuery, title);
-                seedCountMap.put(seed, count);
-            }
-            seeds.sort((s1, s2) -> {
-                int count1 = seedCountMap.getOrDefault(s1, 0);
-                int count2 = seedCountMap.getOrDefault(s2, 0);
-                return Integer.compare(count2, count1);
-            });
-
+        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
             return seeds.toArray(new Seed[0]);
-        } finally {
-            em.close();
         }
+
+        String processedQuery = userQ.toLowerCase().trim();
+        Map<Seed, Integer> seedCountMap = new HashMap<>();
+        for(Seed seed : seeds){
+            String title = seed.title.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            seedCountMap.put(seed, count);
+        }
+        seeds.sort((s1, s2) -> {
+            int count1 = seedCountMap.getOrDefault(s1, 0);
+            int count2 = seedCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return seeds.toArray(new Seed[0]);
     }
 
     //计算字符串公共字符数量
-    private int countCommonCharacter(String str1, String str2) {
+    private int countCommonCharacter(String str1, String str2){
         Map<Character, Integer> map1 = new HashMap<>();
         Map<Character, Integer> map2 = new HashMap<>();
 
-        for (char c : str1.toCharArray()) {
+        for(char c : str1.toCharArray()){
             if (!Character.isWhitespace(c)) {
                 map1.put(c, map1.getOrDefault(c, 0) + 1);
             }
         }
 
-        for (char c : str2.toCharArray()) {
+        for(char c : str2.toCharArray()){
             if (!Character.isWhitespace(c)) {
                 map2.put(c, map2.getOrDefault(c, 0) + 1);
             }
         }
 
         int res = 0;
-        for (char c : map1.keySet()) {
+        for(char c : map1.keySet()){
             if (map2.containsKey(c)) {
                 res += Math.min(map1.get(c), map2.get(c));
             }
-
+            
         }
         return res;
     }
 
     //返回状态：0 success，1 重复，2其他原因
     @Override
-    public int AddNotice(Notice notice) {
-        EntityManager em = getEntityManager();
+    public int AddNotice(Notice notice){
         try {
-            JPAQuery<Notice> query = new JPAQuery<>(em);
+            JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
             if (checkNotice != null) {
                 return 1;
             }
-
-            em.getTransaction().begin();
-            em.persist(notice);
-            em.getTransaction().commit();
+            
+            entitymanager.persist(notice);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     //返回状态：0 success，1 不存在，2其他原因
     @Override
-    public boolean UpdateNotice(Notice notice) {
-        EntityManager em = getEntityManager();
+    public boolean UpdateNotice(Notice notice){
         try {
-            Notice oldNotice = em.find(Notice.class, notice.noticeid);
+            Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
             }
             oldNotice = notice;
-            em.getTransaction().begin();
-            em.merge(oldNotice);
-            em.getTransaction().commit();
+            entitymanager.merge(oldNotice);
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
-        } finally {
-            em.close();
         }
     }
 
     //删除公告，返回状态：0 success，1 不存在，2其他原因
     @Override
-    public boolean DeleteNotice(String noticeid) {
-        EntityManager em = getEntityManager();
+    public boolean DeleteNotice(String noticeid){
         try {
-            Notice notice = em.find(Notice.class, noticeid);
+            Notice notice = entitymanager.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
             }
-            em.getTransaction().begin();
-            em.remove(notice);
-            em.getTransaction().commit();
+            entitymanager.remove(notice);
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     //获取用户的剩余邀请次数
-    public int GetUserAvailableInviteTimes(String userid) {
-        EntityManager em = getEntityManager();
+    public int GetUserAvailableInviteTimes(String userid){
         try {
-            JPAQuery<Integer> query = new JPAQuery<>(em);
+            JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
-
+            
             return invite_left;
         } catch (Exception e) {
             e.printStackTrace();
             return -1;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     //邀请用户，返回状态：0 success，1 剩余次数不足，2,3其他原因
     @Override
-    public int InviteUser(String inviterid, String inviteemail) {
-        EntityManager em = getEntityManager();
+    public int InviteUser(String inviterid,String inviteemail){
         try {
-            User user = em.find(User.class, inviterid);
+            User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
             }
@@ -404,176 +328,158 @@
                 return 1;
             }
             user.invitetimes -= 1;
-            em.getTransaction().begin();
-            em.merge(user);
-            em.getTransaction().commit();
+            entitymanager.merge(user);
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean AddCollect(String userid, String seedid) {
-        EntityManager em = getEntityManager();
-        try {
-            JPAQuery<User> query2 = new JPAQuery<>(em);
-            QUser u2 = QUser.user;
-            User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
-            if (user == null) {
-                return false;
-            }
-            JPAQuery<Seed> query3 = new JPAQuery<>(em);
-            QSeed p = QSeed.seed;
-            Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
-            if (seed == null) {
-                return false;
-            }
-            JPAQuery<String> query = new JPAQuery<>(em);
-            QUserStar u = QUserStar.userStar;
-            List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
-
-            if (allSeedId.contains(seedid)) {
-                return false;
-            }
-            UserStar userStar = new UserStar();
-            userStar.userid = userid;
-            userStar.seedid = seedid;
-            em.getTransaction().begin();
-            em.persist(userStar);
-            em.getTransaction().commit();
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
+    public boolean AddCollect(String userid,String seedid){
+        JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
+        QUser u2 = QUser.user;
+        User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
+        if (user == null) {
             return false;
-        } finally {
-            em.close();
         }
+        JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
+        QSeed p = QSeed.seed;
+        Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
+        if (seed == null) {
+            return false;
+        }
+        JPAQuery<String> query = new JPAQuery<>(entitymanager);
+        QUserStar u = QUserStar.userStar;
+        List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
+
+        if (allSeedId.contains(seedid)) {
+            return false;
+        }
+        UserStar userStar = new UserStar();
+        userStar.userid = userid;
+        userStar.seedid = seedid;
+        entitymanager.persist(userStar);
+        return true;
     }
 
     //删除一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean DeleteCollect(String userid, String seedid) {
-        EntityManager em = getEntityManager();
+    public boolean DeleteCollect(String userid,String seedid){
         try {
-            JPAQuery<UserStar> query = new JPAQuery<>(em);
+            JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
             if (userStar == null) {
                 return true; // 收藏不存在
             }
-            em.getTransaction().begin();
-            em.remove(userStar);
-            em.getTransaction().commit();
+            entitymanager.remove(userStar);
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
-        } finally {
-            em.close();
         }
-
+        
     }
 
     @Override
-    public int AddBegSeed(BegInfo info) {
+    public int AddBegSeed(BegInfo info){
         return 0;
     }
 
     @Override
-    public int UpdateBegSeed(BegInfo info) {
+    public int UpdateBegSeed(BegInfo info){
         return 0;
     }
 
     @Override
-    public int DeleteBegSeed(String begid) {
+    public int DeleteBegSeed(String begid){
         return 0;
     }
 
     @Override
-    public int VoteSeed(String begId, String seedId, String userId) {
+    public int VoteSeed(String begId, String seedId, String userId){
         return 0;
     }
 
     @Override
-    public int SubmitSeed(String begid, Seed seed) {
+    public int SubmitSeed(String begid,Seed seed){
         return 0;
     }
 
     @Override
-    public void SettleBeg() {
-
+    public void SettleBeg(){
+        
     }
 
     @Override
-    public int AddPost(Post post) {
+    public int AddPost(Post post){
         return 0;
     }
 
     @Override
-    public int UpdatePost(Post post) {
+    public int UpdatePost(Post post){
         return 0;
     }
 
     @Override
-    public int DeletePost(String postid) {
+    public int DeletePost(String postid){
         return 0;
     }
 
     @Override
-    public int AddComment(String postid, String userid, String comment) {
+    public int AddComment(String postid, String userid, String comment){
         return 0;
     }
 
     @Override
-    public int DeleteComment(String postid, String commentid) {
+    public int DeleteComment(String postid,String commentid){
         return 0;
     }
 
     @Override
-    public boolean ExchangeMagicToUpload(String userid, int magic)//将魔力值兑换为上传量，返回状态：0 success，1 不存在,2其他原因
+    public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量，返回状态：0 success，1 不存在,2其他原因
     {
         return true;
     }
-
+    
     @Override
-    public boolean ExchangeMagicToDownload(String userid, int magic) {
+    public boolean ExchangeMagicToDownload(String userid,int magic)
+    {
         return true;
     }//将魔力值兑换为下载量，返回状态：0 success，1 不存在,2其他原因
 
     @Override
-    public boolean ExchangeMagicToVip(String userid, int magic) {
+    public boolean ExchangeMagicToVip(String userid,int magic){
         return true;
     }
     //将魔力值兑换为VIP次数，返回状态：0 success，1 不存在,2其他原因
 
     @Override
-    public boolean UploadTransmitProfile(Profile profile) {
+    public boolean UploadTransmitProfile(Profile profile){
         return true;
     }
 
     @Override
-    public Profile GetTransmitProfile(String profileid) {
+    public Profile GetTransmitProfile(String profileid){
         Profile profile = new Profile();
         return profile;
     }
     //获取迁移信息
-
+    
     @Override
-    public boolean ExamTransmitProfile(String profileid, boolean result) {
+    public boolean ExamTransmitProfile(String profileid,boolean result){
         return true;
     }
-
     //审核迁移信息,0成功，1失败
     @Override
-    public Profile[] GetTransmitProfileList() {
+    public Profile[] GetTransmitProfileList(){
         return new Profile[0];
     }
     //获取所有迁移信息
 
 }
+
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index c509df3..ec4ab2e 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -8,7 +8,7 @@
     public static final int CheatTime=5;
     // 请根据实际环境修改为可达的地址
     public static final String SqlURL = "192.168.5.9:3306";
-    public static final String Database = "pt_database";
+    public static final String Database = "pt_database_test";
     public static final String TestDatabase = "pt_database_test";
     public static final String SqlPassword = "123456";
     public static final String SqlUsername = "root";
diff --git a/src/test/java/cheattest/cheatsystest.java b/src/test/java/cheattest/cheatsystest.java
index 98ebf73..4f3a035 100644
--- a/src/test/java/cheattest/cheatsystest.java
+++ b/src/test/java/cheattest/cheatsystest.java
@@ -30,7 +30,6 @@
 import entity.config;
 
 public class cheatsystest {
-
     private static EntityManagerFactory emf;
     private static EntityManager em;
     private static Cheat cheat;
@@ -44,15 +43,19 @@
         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);
+            "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(emf);
+        cheat = new Cheat();
+        // 通过反射注入 entityManager
+        java.lang.reflect.Field f = Cheat.class.getDeclaredField("entityManager");
+        f.setAccessible(true);
+        f.set(cheat, em);
     }
 
     @AfterAll
@@ -85,7 +88,7 @@
         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();
+                                             .getResultList();
             for (String userId : insertedUserIds) {
                 User user = em.find(User.class, userId);
                 if (user != null) {
@@ -96,58 +99,54 @@
         }
 
         // 关闭 EntityManager 和 EntityManagerFactory
-        if (em != null && em.isOpen()) {
-            em.close();
-        }
-        if (emf != null && emf.isOpen()) {
-            emf.close();
-        }
+        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();
+                          .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;
+            .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();
+                em.getTransaction().begin();
+                boolean result = cheat.AddAppeal(appeal);
+                em.getTransaction().commit();
 
-            Assertions.assertTrue(result, "AddAppeal 应返回 true");
+                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);
+                // 验证 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());
+                // 清理
+                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();
+                             .setMaxResults(10)
+                             .getResultList();
 
         List<DynamicTest> tests = new ArrayList<>();
 
@@ -179,140 +178,140 @@
     Collection<DynamicTest> testGetAppealList() {
         // 查询数据库中已存在的一个用户
         String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
-                .setMaxResults(1)
-                .getSingleResult();
+                      .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;
+            .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();
+                em.getTransaction().begin();
+                em.persist(appeal);
+                em.getTransaction().commit();
 
-            // 记录插入的 Appeal ID
-            insertedAppealIds.add(appealId);
+                // 记录插入的 Appeal ID
+                insertedAppealIds.add(appealId);
 
-            // 调用 GetAppealList 并验证
-            Appeal[] appeals = cheat.GetAppealList();
-            Assertions.assertNotNull(appeals, "GetAppealList 应返回非空");
+                // 调用 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());
+                // 检查整个列表是否包含所有插入的数据
+                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();
+                          .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;
+            .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.persist(appeal);
                 em.getTransaction().commit();
-            }
 
-            // 测试处理申诉
-            int newStatus = (i % 2 == 0) ? 1 : 2; // 偶数索引通过申诉，奇数索引拒绝申诉
-            boolean result = cheat.HandleAppeal(appealId, newStatus);
-            Assertions.assertTrue(result, "HandleAppeal 应返回 true");
+                // 如果 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();
+                }
 
-            // 验证 Appeal 状态是否更新
-            Appeal updatedAppeal = em.find(Appeal.class, appealId);
-            Assertions.assertNotNull(updatedAppeal, "数据库应能查到更新后的 Appeal");
-            Assertions.assertEquals(newStatus, updatedAppeal.status, "Appeal 的状态应被更新为: " + newStatus);
+                // 测试处理申诉
+                int newStatus = (i % 2 == 0) ? 1 : 2; // 偶数索引通过申诉，奇数索引拒绝申诉
+                boolean result = cheat.HandleAppeal(appealId, newStatus);
+                Assertions.assertTrue(result, "HandleAppeal 应返回 true");
 
-            // 如果申诉通过，验证用户的 account_status 是否被设置为 false
-            if (newStatus == 1) {
-                User user = em.find(User.class, userId);
-                Assertions.assertNotNull(user, "数据库应能查到相关用户");
-                Assertions.assertFalse(user.accountstate, "通过申诉后用户的 account_status 应为 false");
-            }
+                // 验证 Appeal 状态是否更新
+                Appeal updatedAppeal = em.find(Appeal.class, appealId);
+                Assertions.assertNotNull(updatedAppeal, "数据库应能查到更新后的 Appeal");
+                Assertions.assertEquals(newStatus, updatedAppeal.status, "Appeal 的状态应被更新为: " + newStatus);
 
-            // 清理测试数据
-            em.getTransaction().begin();
-            em.remove(updatedAppeal);
-            em.getTransaction().commit();
-        }))
-                .collect(Collectors.toList());
+                // 如果申诉通过，验证用户的 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();
+            .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;
+                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();
+                em.getTransaction().begin();
+                em.persist(seed);
+                em.getTransaction().commit();
 
-            // 记录插入的 Seed ID
-            insertedSeedIds.add(seedId);
+                // 记录插入的 Seed ID
+                insertedSeedIds.add(seedId);
 
-            // 调用 GetFakeSeed 并验证
-            Pair<String, String>[] fakeSeeds = cheat.GetFakeSeed();
-            Assertions.assertNotNull(fakeSeeds, "GetFakeSeed 应返回非空");
+                // 调用 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());
+                // 验证返回的假种子列表是否包含所有插入的假种子
+                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
@@ -320,47 +319,47 @@
         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;
+            .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;
+                // 创建并设置 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();
+                em.getTransaction().begin();
+                em.persist(user);
+                em.persist(userPT); // 持久化 UserPT 实例
+                em.getTransaction().commit();
 
-            // 记录插入的用户 ID
-            insertedUserIds.add(userId);
+                // 记录插入的用户 ID
+                insertedUserIds.add(userId);
 
-            // 调用 GetPunishedUserList 并验证
-            String[] punishedUsers = cheat.GetPunishedUserList();
-            Assertions.assertNotNull(punishedUsers, "GetPunishedUserList 应返回非空");
+                // 调用 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());
+                // 验证返回的用户列表是否包含所有插入的用户
+                for (String id : insertedUserIds) {
+                    boolean found = Arrays.stream(punishedUsers).anyMatch(returnedId -> returnedId.equals(id));
+                    Assertions.assertTrue(found, "GetPunishedUserList 应包含插入的用户 ID: " + id);
+                }
+            }))
+            .collect(Collectors.toList());
     }
 
     @TestFactory
@@ -368,76 +367,76 @@
         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;
+            .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;
+                // 插入用户 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;
+                // 创建并设置 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;
+                // 插入用户 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;
+                // 创建并设置 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();
+                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);
+                // 记录插入的用户 ID
+                insertedUserIds.add(userId1);
+                insertedUserIds.add(userId2);
 
-            // 调用 PunishUser 方法
-            cheat.PunishUser();
+                // 调用 PunishUser 方法
+                cheat.PunishUser();
 
-            // 验证用户 1 是否被封禁
-            User punishedUser1 = em.find(User.class, userId1);
-            Assertions.assertNotNull(punishedUser1, "数据库应能查到用户 1");
-            Assertions.assertTrue(punishedUser1.accountstate, "作弊用户应被封禁");
+                // 验证用户 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());
+                // 验证用户 2 是否未被封禁
+                User punishedUser2 = em.find(User.class, userId2);
+                Assertions.assertNotNull(punishedUser2, "数据库应能查到用户 2");
+                Assertions.assertFalse(punishedUser2.accountstate, "非作弊用户不应被封禁");
+            }))
+            .collect(Collectors.toList());
     }
 
     // @TestFactory
@@ -445,6 +444,7 @@
     //     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, () -> {
     //             // 插入上传用户
@@ -461,10 +461,12 @@
     //             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();
@@ -479,10 +481,12 @@
     //             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 实例
@@ -491,6 +495,7 @@
     //             em.getTransaction().commit();
     //             insertedUserIds.add(uploaderId);
     //             insertedUserIds.add(downloaderId);
+
     //             // 插入种子
     //             String seedId = UUID.randomUUID().toString();
     //             Seed seed = new Seed();
@@ -505,10 +510,12 @@
     //             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++) {
@@ -521,14 +528,17 @@
     //                 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, "数据库应能查到上传用户");
diff --git a/src/test/java/databasetest/databasesystest.java b/src/test/java/databasetest/databasesystest.java
index f4b22f1..f802360 100644
--- a/src/test/java/databasetest/databasesystest.java
+++ b/src/test/java/databasetest/databasesystest.java
@@ -45,7 +45,10 @@
         props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
         emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
         em = emf.createEntityManager();
-        db = new Database1(emf);
+        db = new Database1();
+        java.lang.reflect.Field f = Database1.class.getDeclaredField("entitymanager");
+        f.setAccessible(true);
+        f.set(db, em);
         testUserIds = new ArrayList<>();
         testEmails = new ArrayList<>();
         for (int i = 0; i < 10; i++) {
