帮助重传后端

Change-Id: Ia669c583bc421e6d7de0de84305f2955802f5e2e
diff --git a/.gitignore b/.gitignore
index 512a350..b8fd6ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,7 +23,6 @@
 *.iml
 *.ipr
 out/
-!**/public/torrents/**/out/
 !**/src/main/**/out/
 !**/src/test/**/out/
 
@@ -33,17 +32,3 @@
 /dist/
 /nbdist/
 /.nb-gradle/
-
-### VS Code ###
-.vscode/
-
-/public/torrents
-/config
-/src/main/resources/application-db-tencentcloud.yml
-/src/main/resources/application-db-vultr.yml
-/public/
-
-application*.yml
-application.yml
-application-caching.yml
-application-test.yml
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..80076d7
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+# Build stage
+FROM registry.cn-hangzhou.aliyuncs.com/library/maven:3.8.4-openjdk-17 as build
+WORKDIR /app
+
+# Create .m2 directory and copy settings.xml
+RUN mkdir -p /root/.m2
+COPY settings.xml /root/.m2/settings.xml
+
+# Cache dependencies
+COPY pom.xml .
+RUN mvn dependency:go-offline -B
+
+# Build application
+COPY src ./src
+RUN mvn clean package -DskipTests
+
+# Production stage
+FROM registry.cn-hangzhou.aliyuncs.com/library/openjdk:17-slim
+WORKDIR /app
+COPY --from=build /app/target/*.jar app.jar
+EXPOSE 8080
+ENTRYPOINT ["java", "-jar", "app.jar"] 
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ae475ab..c193b11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,211 +1,211 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.0.2</version>
-        <relativePath/> <!-- lookup parent from repository -->
-    </parent>
-    <groupId>com.github.bitsapling</groupId>
-    <artifactId>Sapling</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>Sapling</name>
-    <description>Sapling project</description>
-
-    <properties>
-        <java.version>17</java.version>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-cache</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-mail</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-quartz</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-validation</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>cn.dev33</groupId>
-            <artifactId>sa-token-spring-boot3-starter</artifactId>
-            <version>1.34.0</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.dev33</groupId>
-            <artifactId>sa-token-dao-redis-jackson</artifactId>
-            <version>1.34.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-json</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-tomcat</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.11.0</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.15</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-validator</groupId>
-            <artifactId>commons-validator</artifactId>
-            <version>1.7</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.12.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-            <version>1.10.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-            <version>1.22</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jetbrains</groupId>
-            <artifactId>annotations</artifactId>
-            <version>23.1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>31.1-jre</version>
-        </dependency>
-        <dependency>
-            <groupId>at.favre.lib</groupId>
-            <artifactId>bcrypt</artifactId>
-            <version>0.9.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.konghq</groupId>
-            <artifactId>unirest-java</artifactId>
-            <version>3.14.1</version>
-        </dependency>
-        <dependency>
-            <groupId>me.tongfei</groupId>
-            <artifactId>progressbar</artifactId>
-            <version>0.9.5</version>
-        </dependency>
-        <dependency>
-            <groupId>com.dampcake</groupId>
-            <artifactId>bencode</artifactId>
-            <version>1.4</version>
-        </dependency>
-        <dependency>
-            <groupId>com.mysql</groupId>
-            <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-devtools</artifactId>
-            <scope>runtime</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-jsr310</artifactId>
-            <version>2.14.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.redisson</groupId>
-            <artifactId>redisson-hibernate-6</artifactId>
-            <version>3.19.3</version>
-        </dependency>
-        <dependency>
-            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
-            <artifactId>owasp-java-html-sanitizer</artifactId>
-            <version>20220608.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.rometools</groupId>
-            <artifactId>rome</artifactId>
-            <version>1.18.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alicp.jetcache</groupId>
-            <artifactId>jetcache-starter-redis</artifactId>
-            <version>2.7.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.greenrobot</groupId>
-            <artifactId>eventbus-java</artifactId>
-            <version>3.3.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-websocket</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+<?xml version="1.0" encoding="UTF-8"?>

+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

+    <modelVersion>4.0.0</modelVersion>

+    <parent>

+        <groupId>org.springframework.boot</groupId>

+        <artifactId>spring-boot-starter-parent</artifactId>

+        <version>3.0.2</version>

+        <relativePath/> <!-- lookup parent from repository -->

+    </parent>

+    <groupId>com.github.example.pt</groupId>

+    <artifactId>pt</artifactId>

+    <version>0.0.1-SNAPSHOT</version>

+    <name>com.github.example.pt</name>

+    <description>PT</description>

+

+    <properties>

+        <java.version>17</java.version>

+    </properties>

+

+    <dependencies>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-cache</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-data-redis</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-data-jpa</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-mail</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-quartz</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-validation</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>cn.dev33</groupId>

+            <artifactId>sa-token-spring-boot3-starter</artifactId>

+            <version>1.34.0</version>

+        </dependency>

+        <dependency>

+            <groupId>cn.dev33</groupId>

+            <artifactId>sa-token-dao-redis-jackson</artifactId>

+            <version>1.34.0</version>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-web</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-json</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-tomcat</artifactId>

+            <scope>runtime</scope>

+        </dependency>

+        <dependency>

+            <groupId>commons-io</groupId>

+            <artifactId>commons-io</artifactId>

+            <version>2.11.0</version>

+        </dependency>

+        <dependency>

+            <groupId>commons-codec</groupId>

+            <artifactId>commons-codec</artifactId>

+            <version>1.15</version>

+        </dependency>

+        <dependency>

+            <groupId>commons-validator</groupId>

+            <artifactId>commons-validator</artifactId>

+            <version>1.7</version>

+        </dependency>

+        <dependency>

+            <groupId>org.apache.commons</groupId>

+            <artifactId>commons-lang3</artifactId>

+            <version>3.12.0</version>

+        </dependency>

+        <dependency>

+            <groupId>org.apache.commons</groupId>

+            <artifactId>commons-text</artifactId>

+            <version>1.10.0</version>

+        </dependency>

+        <dependency>

+            <groupId>org.apache.commons</groupId>

+            <artifactId>commons-compress</artifactId>

+            <version>1.22</version>

+        </dependency>

+        <dependency>

+            <groupId>org.jetbrains</groupId>

+            <artifactId>annotations</artifactId>

+            <version>23.1.0</version>

+        </dependency>

+        <dependency>

+            <groupId>com.google.guava</groupId>

+            <artifactId>guava</artifactId>

+            <version>31.1-jre</version>

+        </dependency>

+        <dependency>

+            <groupId>at.favre.lib</groupId>

+            <artifactId>bcrypt</artifactId>

+            <version>0.9.0</version>

+        </dependency>

+        <dependency>

+            <groupId>com.konghq</groupId>

+            <artifactId>unirest-java</artifactId>

+            <version>3.14.1</version>

+        </dependency>

+        <dependency>

+            <groupId>me.tongfei</groupId>

+            <artifactId>progressbar</artifactId>

+            <version>0.9.5</version>

+        </dependency>

+        <dependency>

+            <groupId>com.dampcake</groupId>

+            <artifactId>bencode</artifactId>

+            <version>1.4</version>

+        </dependency>

+        <dependency>

+            <groupId>com.mysql</groupId>

+            <artifactId>mysql-connector-j</artifactId>

+            <scope>runtime</scope>

+        </dependency>

+        <dependency>

+            <groupId>com.h2database</groupId>

+            <artifactId>h2</artifactId>

+            <scope>runtime</scope>

+        </dependency>

+        <dependency>

+            <groupId>org.projectlombok</groupId>

+            <artifactId>lombok</artifactId>

+            <optional>true</optional>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-devtools</artifactId>

+            <scope>runtime</scope>

+            <optional>true</optional>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-test</artifactId>

+            <scope>test</scope>

+        </dependency>

+        <dependency>

+            <groupId>com.fasterxml.jackson.datatype</groupId>

+            <artifactId>jackson-datatype-jsr310</artifactId>

+            <version>2.14.1</version>

+        </dependency>

+        <dependency>

+            <groupId>org.redisson</groupId>

+            <artifactId>redisson-hibernate-6</artifactId>

+            <version>3.19.3</version>

+        </dependency>

+        <dependency>

+            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>

+            <artifactId>owasp-java-html-sanitizer</artifactId>

+            <version>20220608.1</version>

+        </dependency>

+        <dependency>

+            <groupId>org.apache.commons</groupId>

+            <artifactId>commons-pool2</artifactId>

+        </dependency>

+        <dependency>

+            <groupId>com.rometools</groupId>

+            <artifactId>rome</artifactId>

+            <version>1.18.0</version>

+        </dependency>

+        <dependency>

+            <groupId>com.alicp.jetcache</groupId>

+            <artifactId>jetcache-starter-redis</artifactId>

+            <version>2.7.3</version>

+        </dependency>

+        <dependency>

+            <groupId>org.greenrobot</groupId>

+            <artifactId>eventbus-java</artifactId>

+            <version>3.3.1</version>

+        </dependency>

+        <dependency>

+            <groupId>org.springframework.boot</groupId>

+            <artifactId>spring-boot-starter-websocket</artifactId>

+        </dependency>

+    </dependencies>

+

+    <build>

+        <plugins>

+            <plugin>

+                <groupId>org.springframework.boot</groupId>

+                <artifactId>spring-boot-maven-plugin</artifactId>

+                <configuration>

+                    <excludes>

+                        <exclude>

+                            <groupId>org.projectlombok</groupId>

+                            <artifactId>lombok</artifactId>

+                        </exclude>

+                    </excludes>

+                </configuration>

+            </plugin>

+        </plugins>

+    </build>

 </project> 
\ No newline at end of file
diff --git a/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent b/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent
new file mode 100644
index 0000000..6fcda4d
--- /dev/null
+++ b/public/torrents/1ac0431647b6391733d2ad470e307d57d41b6dd2.torrent
Binary files differ
diff --git a/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent b/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent
new file mode 100644
index 0000000..1b3fe60
--- /dev/null
+++ b/public/torrents/62b376114e5fd75d86696e4f72a9d87e923d08fa.torrent
Binary files differ
diff --git a/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent b/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent
new file mode 100644
index 0000000..bea48e6
--- /dev/null
+++ b/public/torrents/86abb21e4d87f2ed8a4735d059555b31209fb588.torrent
Binary files differ
diff --git a/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent b/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent
new file mode 100644
index 0000000..98fd81d
--- /dev/null
+++ b/public/torrents/ebd068cd030eca8a041f5099bfda374b3a607ca2.torrent
Binary files differ
diff --git a/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent b/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent
new file mode 100644
index 0000000..64eac95
--- /dev/null
+++ b/public/torrents/f4ca53495ac5c7222806c4b0264dda2e42e137d5.torrent
@@ -0,0 +1 @@
+d8:announce32:http://172.21.8.94:6969/announce10:created by18:qBittorrent v5.1.013:creation datei1748927545e4:infod6:lengthi102880e4:name31:Weixin Image_20240419002938.jpg12:piece lengthi16384e6:pieces140:þnÃI •o…?Ð3ëØDwÌ—kÅ缇Ȧè<ªKÑ 51ǘþ¬,hÞ·Ù(_\!À&ªXóæ­2”-Ÿc㧬K[!ÿy6¬©W3®).z9ŒˆåÔ¨Tü%	’žpêQa˜:J}‰9Ð0‘‚œ½Á\N(5…½›ZR7K¹°©ÆÆÉšÖwÖ7:privatei1ee15:publish-website20:Another Sapling Site9:publisher5:admin13:publisher-url31:http://172.23.192.1:8081/user/2e
\ No newline at end of file
diff --git a/settings.xml b/settings.xml
new file mode 100644
index 0000000..6dab700
--- /dev/null
+++ b/settings.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"

+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

+    <mirrors>

+        <mirror>

+            <id>aliyunmaven</id>

+            <mirrorOf>*</mirrorOf>

+            <name>阿里云公共仓库</name>

+            <url>https://maven.aliyun.com/repository/public</url>

+        </mirror>

+    </mirrors>

+</settings> 
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/config/ApiPrinter.java b/src/main/java/com/github/example/pt/config/ApiPrinter.java
index 6019575..c5dce23 100644
--- a/src/main/java/com/github/example/pt/config/ApiPrinter.java
+++ b/src/main/java/com/github/example/pt/config/ApiPrinter.java
@@ -1,24 +1,24 @@
-package com.github.example.pt.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.ApplicationListener;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
-
-@Component
-public class ApiPrinter implements ApplicationListener<ApplicationReadyEvent> {
-
-    @Autowired
-    private RequestMappingHandlerMapping handlerMapping;
-
-    @Override
-    public void onApplicationEvent(ApplicationReadyEvent event) {
-        System.out.println("=== 项目启动,已注册的 API 接口如下: ===");
-        handlerMapping.getHandlerMethods().forEach((mapping, method) -> {
-            System.out.println("接口路径: " + mapping + " -> 方法: " + method.getMethod().getDeclaringClass().getSimpleName()
-                    + "." + method.getMethod().getName());
-        });
-        System.out.println("========================================");
-    }
+package com.github.example.pt.config;

+

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.boot.context.event.ApplicationReadyEvent;

+import org.springframework.context.ApplicationListener;

+import org.springframework.stereotype.Component;

+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

+

+@Component

+public class ApiPrinter implements ApplicationListener<ApplicationReadyEvent> {

+

+    @Autowired

+    private RequestMappingHandlerMapping handlerMapping;

+

+    @Override

+    public void onApplicationEvent(ApplicationReadyEvent event) {

+        System.out.println("=== 项目启动,已注册的 API 接口如下: ===");

+        handlerMapping.getHandlerMethods().forEach((mapping, method) -> {

+            System.out.println("接口路径: " + mapping + " -> 方法: " + method.getMethod().getDeclaringClass().getSimpleName()

+                    + "." + method.getMethod().getName());

+        });

+        System.out.println("========================================");

+    }

 }
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java b/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
index 5826c6d..eedcd87 100644
--- a/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
+++ b/src/main/java/com/github/example/pt/config/SaTokenHandshakeInterceptor.java
@@ -1,36 +1,36 @@
-package com.github.example.pt.config;
-
-
-import jakarta.servlet.http.HttpServletRequest;
-import org.springframework.http.server.ServerHttpRequest;
-import org.springframework.http.server.ServerHttpResponse;
-import org.springframework.http.server.ServletServerHttpRequest;
-import org.springframework.web.socket.WebSocketHandler;
-import org.springframework.web.socket.server.HandshakeInterceptor;
-
-import java.util.Map;
-
-public class SaTokenHandshakeInterceptor implements HandshakeInterceptor {
-
-    @Override
-    public boolean beforeHandshake(ServerHttpRequest request,
-                                   ServerHttpResponse response,
-                                   WebSocketHandler wsHandler,
-                                   Map<String, Object> attributes) {
-
-        if (request instanceof ServletServerHttpRequest servletRequest) {
-            HttpServletRequest httpServletRequest = servletRequest.getServletRequest();
-            String token = httpServletRequest.getHeader("sapling-token");
-            attributes.put("sapling-token", token); // ✅ 存入 sessionAttributes
-        }
-
-        return true;
-    }
-
-    @Override
-    public void afterHandshake(ServerHttpRequest request,
-                               ServerHttpResponse response,
-                               WebSocketHandler wsHandler,
-                               Exception exception) {
-    }
-}
+package com.github.example.pt.config;

+

+

+import jakarta.servlet.http.HttpServletRequest;

+import org.springframework.http.server.ServerHttpRequest;

+import org.springframework.http.server.ServerHttpResponse;

+import org.springframework.http.server.ServletServerHttpRequest;

+import org.springframework.web.socket.WebSocketHandler;

+import org.springframework.web.socket.server.HandshakeInterceptor;

+

+import java.util.Map;

+

+public class SaTokenHandshakeInterceptor implements HandshakeInterceptor {

+

+    @Override

+    public boolean beforeHandshake(ServerHttpRequest request,

+                                   ServerHttpResponse response,

+                                   WebSocketHandler wsHandler,

+                                   Map<String, Object> attributes) {

+

+        if (request instanceof ServletServerHttpRequest servletRequest) {

+            HttpServletRequest httpServletRequest = servletRequest.getServletRequest();

+            String token = httpServletRequest.getHeader("sapling-token");

+            attributes.put("sapling-token", token); // ✅ 存入 sessionAttributes

+        }

+

+        return true;

+    }

+

+    @Override

+    public void afterHandshake(ServerHttpRequest request,

+                               ServerHttpResponse response,

+                               WebSocketHandler wsHandler,

+                               Exception exception) {

+    }

+}

diff --git a/src/main/java/com/github/example/pt/controller/auth/AuthController.java b/src/main/java/com/github/example/pt/controller/auth/AuthController.java
index 61c2e72..1a7c2ee 100644
--- a/src/main/java/com/github/example/pt/controller/auth/AuthController.java
+++ b/src/main/java/com/github/example/pt/controller/auth/AuthController.java
@@ -18,6 +18,7 @@
 import com.github.example.pt.util.IPUtil;
 import com.github.example.pt.util.PasswordHash;
 import jakarta.servlet.http.HttpServletRequest;
+import kong.unirest.HttpStatus;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
@@ -107,6 +108,9 @@
     @PostMapping("/register")
     @Transactional
     public UserSessionResponseDTO register(@RequestBody RegisterRequestDTO register) {
+        if(userService.getUserCount()>=2) {
+            throw new APIGenericException(AUTHENTICATION_FAILED,"内测用户数量已满");
+        }
         log.info("Received register request: {}", register.getEmail());
         log.info("这里111111111111111111111111111");
         if (StringUtils.isEmpty(register.getEmail())) {
@@ -131,7 +135,7 @@
                 register.getEmail(),
                 PasswordHash.hash(register.getPassword()),
                 register.getUsername(),
-                userGroupService.getDefaultUserGroup(),
+                userGroupService.getUserGroup(1),
                 UUID.randomUUID().toString(),
                 Timestamp.from(Instant.now()),
                 "uploads/facivon.ico",
diff --git a/src/main/java/com/github/example/pt/controller/chat/ChatHistoryController.java b/src/main/java/com/github/example/pt/controller/chat/ChatHistoryController.java
index 00f714b..390de43 100644
--- a/src/main/java/com/github/example/pt/controller/chat/ChatHistoryController.java
+++ b/src/main/java/com/github/example/pt/controller/chat/ChatHistoryController.java
@@ -1,69 +1,69 @@
-package com.github.example.pt.controller.chat;
-
-import com.github.example.pt.controller.chat.dto.ChatMessageDTO;
-import com.github.example.pt.entity.ChatMessage;
-import com.github.example.pt.entity.User;
-import com.github.example.pt.repository.ChatMessageRepository;
-import com.github.example.pt.service.UserService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.time.ZoneId;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@RestController
-@RequestMapping("/chat")
-@Slf4j
-public class ChatHistoryController {
-
-    private final ChatMessageRepository chatMessageRepository;
-    private final UserService userService;
-
-    @Autowired
-    public ChatHistoryController(ChatMessageRepository chatMessageRepository, UserService userService) {
-        this.chatMessageRepository = chatMessageRepository;
-        this.userService = userService;
-    }
-
-    /**
-     * GET /api/chat/history?roomId={roomId}
-     * 返回指定 roomId 的所有历史消息,按时间升序排列
-     *
-     * @param roomId 聊天室 ID
-     * @return List<ChatMessageDTO>
-     */
-    @GetMapping("/history")
-    public List<ChatMessageDTO> getHistory(
-            @RequestParam Long roomId,
-            @RequestParam(defaultValue = "0")  int page,
-            @RequestParam(defaultValue = "20") int size) {
-        Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").ascending());
-
-        List<ChatMessage> messages = chatMessageRepository.findByRoomIdOrderByCreatedAtAsc(roomId);
-
-        return messages.stream().map(msg -> {
-            ChatMessageDTO dto = new ChatMessageDTO();
-            dto.setRoomId(msg.getRoomId());
-            dto.setContent(msg.getContent());
-
-            User user = userService.getUser(msg.getUserId());
-            dto.setUsername(user!=null?user.getUsername():" unknown ");
-            // 不返回头像,如果需要可以自行扩展
-            dto.setAvatar(null);
-            // LocalDateTime → 毫秒时间戳
-            dto.setTimestamp(msg.getCreatedAt()
-                    .atZone(ZoneId.systemDefault())
-                    .toInstant()
-                    .toEpochMilli());
-            return dto;
-        }).collect(Collectors.toList());
-    }
+package com.github.example.pt.controller.chat;

+

+import com.github.example.pt.controller.chat.dto.ChatMessageDTO;

+import com.github.example.pt.entity.ChatMessage;

+import com.github.example.pt.entity.User;

+import com.github.example.pt.repository.ChatMessageRepository;

+import com.github.example.pt.service.UserService;

+import lombok.extern.slf4j.Slf4j;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.data.domain.PageRequest;

+import org.springframework.data.domain.Pageable;

+import org.springframework.data.domain.Sort;

+import org.springframework.web.bind.annotation.GetMapping;

+import org.springframework.web.bind.annotation.RequestMapping;

+import org.springframework.web.bind.annotation.RequestParam;

+import org.springframework.web.bind.annotation.RestController;

+

+import java.time.ZoneId;

+import java.util.List;

+import java.util.stream.Collectors;

+

+@RestController

+@RequestMapping("/chat")

+@Slf4j

+public class ChatHistoryController {

+

+    private final ChatMessageRepository chatMessageRepository;

+    private final UserService userService;

+

+    @Autowired

+    public ChatHistoryController(ChatMessageRepository chatMessageRepository, UserService userService) {

+        this.chatMessageRepository = chatMessageRepository;

+        this.userService = userService;

+    }

+

+    /**

+     * GET /api/chat/history?roomId={roomId}

+     * 返回指定 roomId 的所有历史消息,按时间升序排列

+     *

+     * @param roomId 聊天室 ID

+     * @return List<ChatMessageDTO>

+     */

+    @GetMapping("/history")

+    public List<ChatMessageDTO> getHistory(

+            @RequestParam Long roomId,

+            @RequestParam(defaultValue = "0")  int page,

+            @RequestParam(defaultValue = "20") int size) {

+        Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").ascending());

+

+        List<ChatMessage> messages = chatMessageRepository.findByRoomIdOrderByCreatedAtAsc(roomId);

+

+        return messages.stream().map(msg -> {

+            ChatMessageDTO dto = new ChatMessageDTO();

+            dto.setRoomId(msg.getRoomId());

+            dto.setContent(msg.getContent());

+

+            User user = userService.getUser(msg.getUserId());

+            dto.setUsername(user!=null?user.getUsername():" unknown ");

+            // 不返回头像,如果需要可以自行扩展

+            dto.setAvatar(null);

+            // LocalDateTime → 毫秒时间戳

+            dto.setTimestamp(msg.getCreatedAt()

+                    .atZone(ZoneId.systemDefault())

+                    .toInstant()

+                    .toEpochMilli());

+            return dto;

+        }).collect(Collectors.toList());

+    }

 }
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/controller/torrent/TorrentController.java b/src/main/java/com/github/example/pt/controller/torrent/TorrentController.java
index 4ff12f0..e5885ad 100644
--- a/src/main/java/com/github/example/pt/controller/torrent/TorrentController.java
+++ b/src/main/java/com/github/example/pt/controller/torrent/TorrentController.java
@@ -48,6 +48,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
@@ -174,6 +175,26 @@
         return new TorrentSearchResultResponseDTO(torrents.getTotalElements(), torrents.getTotalPages(), torrents.getContent());
     }
 
+    @GetMapping("/search")
+    public TorrentSearchResultResponseDTO searchByCategory(
+        @RequestParam(name = "category" , required = false) String slug,
+        Pageable pageable) {
+
+        if (slug == null || slug.isEmpty()) {
+            throw new APIGenericException(MISSING_PARAMETERS, "请输入你要查找的类型.");
+        }
+
+        Long categoryId = categoryService.getCategoryIdBySlug(slug);
+
+        Page<Torrent> res = torrentService.searchByCategoryId(categoryId, pageable);
+
+        return new TorrentSearchResultResponseDTO(
+            res.getTotalElements(),
+            res.getTotalPages(),
+            res.getContent()
+        );
+    } 
+
     @GetMapping("/view/{info_hash}")
     @SaCheckPermission("torrent:view")
     public TorrentInfoResponseDTO view(@PathVariable("info_hash") String infoHash) {
diff --git a/src/main/java/com/github/example/pt/entity/ChatMessage.java b/src/main/java/com/github/example/pt/entity/ChatMessage.java
index 9b690bb..b8383fa 100644
--- a/src/main/java/com/github/example/pt/entity/ChatMessage.java
+++ b/src/main/java/com/github/example/pt/entity/ChatMessage.java
@@ -1,77 +1,77 @@
-package com.github.example.pt.entity;
-
-import jakarta.persistence.*;
-import java.time.LocalDateTime;
-
-@Entity
-@Table(name = "chat_messages")
-public class ChatMessage {
-
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    /** 聊天室 ID */
-    @Column(name = "room_id", nullable = false)
-    private Long roomId;
-
-    /** 发送者用户 ID(由 Sa-Token loginId 提供) */
-    @Column(name = "user_id", nullable = false)
-    private Long userId;
-
-    /** 消息内容 */
-    @Column(name = "content", nullable = false, columnDefinition = "TEXT")
-    private String content;
-
-    /** 发送时间 */
-    @Column(name = "created_at", nullable = false)
-    private LocalDateTime createdAt;
-
-    public ChatMessage() { }
-
-    public ChatMessage(Long roomId, Long userId, String content, LocalDateTime createdAt) {
-        this.roomId = roomId;
-        this.userId = userId;
-        this.content = content;
-        this.createdAt = createdAt;
-    }
-
-    // 省略 getter 和 setter
-
-    public Long getId() {
-        return id;
-    }
-
-    public Long getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(Long roomId) {
-        this.roomId = roomId;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-
-    public LocalDateTime getCreatedAt() {
-        return createdAt;
-    }
-
-    public void setCreatedAt(LocalDateTime createdAt) {
-        this.createdAt = createdAt;
-    }
+package com.github.example.pt.entity;

+

+import jakarta.persistence.*;

+import java.time.LocalDateTime;

+

+@Entity

+@Table(name = "chat_messages")

+public class ChatMessage {

+

+

+    @Id

+    @GeneratedValue(strategy = GenerationType.IDENTITY)

+    private Long id;

+

+    /** 聊天室 ID */

+    @Column(name = "room_id", nullable = false)

+    private Long roomId;

+

+    /** 发送者用户 ID(由 Sa-Token loginId 提供) */

+    @Column(name = "user_id", nullable = false)

+    private Long userId;

+

+    /** 消息内容 */

+    @Column(name = "content", nullable = false, columnDefinition = "TEXT")

+    private String content;

+

+    /** 发送时间 */

+    @Column(name = "created_at", nullable = false)

+    private LocalDateTime createdAt;

+

+    public ChatMessage() { }

+

+    public ChatMessage(Long roomId, Long userId, String content, LocalDateTime createdAt) {

+        this.roomId = roomId;

+        this.userId = userId;

+        this.content = content;

+        this.createdAt = createdAt;

+    }

+

+    // 省略 getter 和 setter

+

+    public Long getId() {

+        return id;

+    }

+

+    public Long getRoomId() {

+        return roomId;

+    }

+

+    public void setRoomId(Long roomId) {

+        this.roomId = roomId;

+    }

+

+    public Long getUserId() {

+        return userId;

+    }

+

+    public void setUserId(Long userId) {

+        this.userId = userId;

+    }

+

+    public String getContent() {

+        return content;

+    }

+

+    public void setContent(String content) {

+        this.content = content;

+    }

+

+    public LocalDateTime getCreatedAt() {

+        return createdAt;

+    }

+

+    public void setCreatedAt(LocalDateTime createdAt) {

+        this.createdAt = createdAt;

+    }

 }
\ No newline at end of file
diff --git a/src/main/java/com/github/example/pt/repository/ChatMessageRepository.java b/src/main/java/com/github/example/pt/repository/ChatMessageRepository.java
index b1ef4d2..5dc96ad 100644
--- a/src/main/java/com/github/example/pt/repository/ChatMessageRepository.java
+++ b/src/main/java/com/github/example/pt/repository/ChatMessageRepository.java
@@ -1,16 +1,16 @@
-package com.github.example.pt.repository;
-
-import com.github.example.pt.entity.ChatMessage;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-
-@Repository
-public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {
-    /**
-     * 按时间升序查询某个 roomId 的所有消息
-     */
-    List<ChatMessage> findByRoomIdOrderByCreatedAtAsc(Long roomId);
-}
+package com.github.example.pt.repository;

+

+import com.github.example.pt.entity.ChatMessage;

+import org.springframework.data.jpa.repository.JpaRepository;

+import org.springframework.stereotype.Repository;

+

+import java.util.List;

+

+

+@Repository

+public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {

+    /**

+     * 按时间升序查询某个 roomId 的所有消息

+     */

+    List<ChatMessage> findByRoomIdOrderByCreatedAtAsc(Long roomId);

+}

diff --git a/src/main/java/com/github/example/pt/service/AnnounceService.java b/src/main/java/com/github/example/pt/service/AnnounceService.java
index 8e5f7e6..ba58bb0 100644
--- a/src/main/java/com/github/example/pt/service/AnnounceService.java
+++ b/src/main/java/com/github/example/pt/service/AnnounceService.java
@@ -15,6 +15,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.sql.Timestamp;
 import java.time.Instant;
 import java.util.NoSuchElementException;
@@ -97,7 +98,7 @@
         peer.setLeft(task.left());
         peer.setSeeder(task.left() == 0);
         peer.setUpdateAt(Timestamp.from(Instant.now()));
-        peer.setSeedingTime(peer.getSeedingTime() + (Instant.now().toEpochMilli() - lastUpdateAt.toInstant().toEpochMilli()));
+        peer.setSeedingTime((peer.getSeedingTime() + (Instant.now().toEpochMilli() - lastUpdateAt.toInstant().toEpochMilli()))/86400);
         peer.setPartialSeeder(task.event() == AnnounceEventType.PAUSED);
         // Update user peer speed
         long bytesPerSecondUploading = uploadedOffset / (announceInterval / 1000);
@@ -108,6 +109,16 @@
         // Update real user data
         user.setRealDownloaded(user.getRealDownloaded() + lastDownload);
         user.setRealUploaded(user.getRealUploaded() + lastUploaded);
+
+        //计算用户的分享率
+
+        if(user.getRealDownloaded() + lastDownload>0){
+            user.setKarma(new BigDecimal((user.getRealUploaded() + lastUploaded) / (user.getRealDownloaded() + lastDownload)));
+        }else{
+            user.setKarma(BigDecimal.ZERO);
+        }
+       
+
         // Apply user promotion policy
         long promotionUploadOffset = (long) user.getGroup().getPromotionPolicy().applyUploadRatio(lastDownload);
         long promotionDownloadOffset = (long) user.getGroup().getPromotionPolicy().applyDownloadRatio(lastUploaded);
diff --git a/src/main/java/com/github/example/pt/service/CategoryService.java b/src/main/java/com/github/example/pt/service/CategoryService.java
index ab9c097..efeaf1a 100644
--- a/src/main/java/com/github/example/pt/service/CategoryService.java
+++ b/src/main/java/com/github/example/pt/service/CategoryService.java
@@ -1,6 +1,8 @@
 package com.github.example.pt.service;
 
 import com.github.example.pt.entity.Category;
+import com.github.example.pt.exception.APIErrorCode;
+import com.github.example.pt.exception.APIGenericException;
 import com.github.example.pt.repository.CategoryRepository;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -9,6 +11,9 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+
+import static cn.dev33.satoken.SaManager.log;
 
 @Service
 
@@ -22,6 +27,19 @@
     }
 
     @Nullable
+    public Long getCategoryIdBySlug(@NotNull String slug) {
+        Optional<Category> categoryOptional = repository.findBySlug(slug);
+        if(categoryOptional.isPresent()){
+            Long categoryId = categoryOptional.get().getId();
+            log.info("Category with slug '{}' id: {}", slug,categoryId);
+            return categoryId;
+        }else{
+            log.warn("Category with slug '{}' not found", slug);
+            throw new APIGenericException(APIErrorCode.INVALID_CATEGORY, "Specified category not exists.");
+        }
+    }
+
+    @Nullable
     public Category getCategory(long id) {
         return repository.findById(id).orElse(null);
     }
diff --git a/src/main/java/com/github/example/pt/service/TorrentService.java b/src/main/java/com/github/example/pt/service/TorrentService.java
index e3a0885..17fa847 100644
--- a/src/main/java/com/github/example/pt/service/TorrentService.java
+++ b/src/main/java/com/github/example/pt/service/TorrentService.java
@@ -95,6 +95,15 @@
                         .withPage(searchRequestDTO.getPage()));
     }
 
+    public Page<Torrent> searchByCategoryId(Long categoryId, Pageable pageable) {
+    return torrentRepository.findAll((root, query, cb) -> {
+        List<Predicate> predicates = new ArrayList<>();
+        if (categoryId != null) {
+            predicates.add(cb.equal(root.get("category").get("id"), categoryId));
+        }
+        return cb.and(predicates.toArray(new Predicate[0]));
+    }, pageable);
+}
 
     @NotNull
     public Page<Torrent> search(@NotNull String keyword, @NotNull List<String> categoriesRequired, @NotNull List<String> promotionRequired, @NotNull List<String> tagRequired, @NotNull Pageable pageable) {
diff --git a/src/main/java/com/github/example/pt/service/UserService.java b/src/main/java/com/github/example/pt/service/UserService.java
index 5dd661e..830c717 100644
--- a/src/main/java/com/github/example/pt/service/UserService.java
+++ b/src/main/java/com/github/example/pt/service/UserService.java
@@ -50,4 +50,8 @@
         return repository.save(user);
     }
 
+    @NotNull
+    public Long getUserCount() {
+        return repository.count();
+    }
 }
diff --git a/src/main/java/com/github/example/pt/type/AnnounceEventTypeConverter.java b/src/main/java/com/github/example/pt/type/AnnounceEventTypeConverter.java
index f2b00e1..1f69369 100644
--- a/src/main/java/com/github/example/pt/type/AnnounceEventTypeConverter.java
+++ b/src/main/java/com/github/example/pt/type/AnnounceEventTypeConverter.java
@@ -1,21 +1,21 @@
-package com.github.example.pt.type;
-
-import jakarta.persistence.AttributeConverter;
-import jakarta.persistence.Converter;
-
-@Converter(autoApply = false)
-public class AnnounceEventTypeConverter implements AttributeConverter<AnnounceEventType, String> {
-    @Override
-    public String convertToDatabaseColumn(AnnounceEventType attribute) {
-        if (attribute == null) {
-            return null;
-        }
-        return attribute.getKey();  // 比如 "completed"
-    }
-
-    @Override
-    public AnnounceEventType convertToEntityAttribute(String dbData) {
-        return AnnounceEventType.fromName(dbData);
-    }
-}
-
+package com.github.example.pt.type;

+

+import jakarta.persistence.AttributeConverter;

+import jakarta.persistence.Converter;

+

+@Converter(autoApply = false)

+public class AnnounceEventTypeConverter implements AttributeConverter<AnnounceEventType, String> {

+    @Override

+    public String convertToDatabaseColumn(AnnounceEventType attribute) {

+        if (attribute == null) {

+            return null;

+        }

+        return attribute.getKey();  // 比如 "completed"

+    }

+

+    @Override

+    public AnnounceEventType convertToEntityAttribute(String dbData) {

+        return AnnounceEventType.fromName(dbData);

+    }

+}

+

diff --git a/src/main/java/com/github/example/pt/websocket/ChatRawWebSocketHandler.java b/src/main/java/com/github/example/pt/websocket/ChatRawWebSocketHandler.java
index ffedc53..a570402 100644
--- a/src/main/java/com/github/example/pt/websocket/ChatRawWebSocketHandler.java
+++ b/src/main/java/com/github/example/pt/websocket/ChatRawWebSocketHandler.java
@@ -1,96 +1,96 @@
-package com.github.example.pt.websocket;
-
-import cn.dev33.satoken.stp.StpUtil;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.example.pt.entity.User;
-import com.github.example.pt.service.UserService;
-import com.github.example.pt.controller.chat.dto.ChatMessageDTO;
-import com.github.example.pt.repository.ChatMessageRepository;
-import com.github.example.pt.entity.ChatMessage;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.web.socket.*;
-import org.springframework.web.socket.handler.TextWebSocketHandler;
-
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-@Component
-public class ChatRawWebSocketHandler extends TextWebSocketHandler {
-    private static final Map<Long, WebSocketSession> sessions = new ConcurrentHashMap<>();
-    @Autowired
-    private UserService userService;
-    @Autowired
-    private ChatMessageRepository chatMessageRepository;
-    private final ObjectMapper objectMapper = new ObjectMapper();
-
-    @Override
-    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
-        // 鉴权:从 session attributes 获取 token
-        String token = (String) session.getAttributes().get("sapling-token");
-        if (token == null) {
-            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("No token"));
-            return;
-        }
-        Long userId;
-        try {
-            userId = Long.valueOf(StpUtil.getLoginIdByToken(token).toString());
-        } catch (Exception e) {
-            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Invalid token"));
-            return;
-        }
-        sessions.put(userId, session);
-    }
-
-    @Override
-    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
-        String token = (String) session.getAttributes().get("sapling-token");
-        if (token == null) {
-            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("No token"));
-            return;
-        }
-        Long userId;
-        try {
-            userId = Long.valueOf(StpUtil.getLoginIdByToken(token).toString());
-        } catch (Exception e) {
-            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Invalid token"));
-            return;
-        }
-        User user = userService.getUser(userId);
-        if (user == null) {
-            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("User not found"));
-            return;
-        }
-        // 解析前端消息
-        ChatMessageDTO dto = objectMapper.readValue(message.getPayload(), ChatMessageDTO.class);
-        // 构建并保存消息实体
-        ChatMessage chatMessage = new ChatMessage();
-        chatMessage.setRoomId(dto.getRoomId() != null ? dto.getRoomId() : 1L);
-        chatMessage.setUserId(userId);
-        chatMessage.setContent(dto.getContent());
-        chatMessage.setCreatedAt(LocalDateTime.now());
-        chatMessageRepository.save(chatMessage);
-        // 构建广播DTO
-        ChatMessageDTO broadcast = new ChatMessageDTO();
-        broadcast.setRoomId(chatMessage.getRoomId());
-        broadcast.setContent(chatMessage.getContent());
-        broadcast.setUsername(user.getUsername());
-        broadcast.setAvatar(user.getAvatar());
-        broadcast.setTimestamp(System.currentTimeMillis());
-        String json = objectMapper.writeValueAsString(broadcast);
-        // 广播所有在线用户
-        for (WebSocketSession ws : sessions.values()) {
-            if (ws.isOpen()) {
-                ws.sendMessage(new TextMessage(json));
-            }
-        }
-    }
-
-    @Override
-    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
-        // 移除会话
-        sessions.entrySet().removeIf(e -> e.getValue().equals(session));
-    }
+package com.github.example.pt.websocket;

+

+import cn.dev33.satoken.stp.StpUtil;

+import com.fasterxml.jackson.databind.ObjectMapper;

+import com.github.example.pt.entity.User;

+import com.github.example.pt.service.UserService;

+import com.github.example.pt.controller.chat.dto.ChatMessageDTO;

+import com.github.example.pt.repository.ChatMessageRepository;

+import com.github.example.pt.entity.ChatMessage;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Component;

+import org.springframework.web.socket.*;

+import org.springframework.web.socket.handler.TextWebSocketHandler;

+

+import java.io.IOException;

+import java.time.LocalDateTime;

+import java.util.Map;

+import java.util.concurrent.ConcurrentHashMap;

+

+@Component

+public class ChatRawWebSocketHandler extends TextWebSocketHandler {

+    private static final Map<Long, WebSocketSession> sessions = new ConcurrentHashMap<>();

+    @Autowired

+    private UserService userService;

+    @Autowired

+    private ChatMessageRepository chatMessageRepository;

+    private final ObjectMapper objectMapper = new ObjectMapper();

+

+    @Override

+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

+        // 鉴权:从 session attributes 获取 token

+        String token = (String) session.getAttributes().get("sapling-token");

+        if (token == null) {

+            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("No token"));

+            return;

+        }

+        Long userId;

+        try {

+            userId = Long.valueOf(StpUtil.getLoginIdByToken(token).toString());

+        } catch (Exception e) {

+            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Invalid token"));

+            return;

+        }

+        sessions.put(userId, session);

+    }

+

+    @Override

+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {

+        String token = (String) session.getAttributes().get("sapling-token");

+        if (token == null) {

+            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("No token"));

+            return;

+        }

+        Long userId;

+        try {

+            userId = Long.valueOf(StpUtil.getLoginIdByToken(token).toString());

+        } catch (Exception e) {

+            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Invalid token"));

+            return;

+        }

+        User user = userService.getUser(userId);

+        if (user == null) {

+            session.close(CloseStatus.NOT_ACCEPTABLE.withReason("User not found"));

+            return;

+        }

+        // 解析前端消息

+        ChatMessageDTO dto = objectMapper.readValue(message.getPayload(), ChatMessageDTO.class);

+        // 构建并保存消息实体

+        ChatMessage chatMessage = new ChatMessage();

+        chatMessage.setRoomId(dto.getRoomId() != null ? dto.getRoomId() : 1L);

+        chatMessage.setUserId(userId);

+        chatMessage.setContent(dto.getContent());

+        chatMessage.setCreatedAt(LocalDateTime.now());

+        chatMessageRepository.save(chatMessage);

+        // 构建广播DTO

+        ChatMessageDTO broadcast = new ChatMessageDTO();

+        broadcast.setRoomId(chatMessage.getRoomId());

+        broadcast.setContent(chatMessage.getContent());

+        broadcast.setUsername(user.getUsername());

+        broadcast.setAvatar(user.getAvatar());

+        broadcast.setTimestamp(System.currentTimeMillis());

+        String json = objectMapper.writeValueAsString(broadcast);

+        // 广播所有在线用户

+        for (WebSocketSession ws : sessions.values()) {

+            if (ws.isOpen()) {

+                ws.sendMessage(new TextMessage(json));

+            }

+        }

+    }

+

+    @Override

+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {

+        // 移除会话

+        sessions.entrySet().removeIf(e -> e.getValue().equals(session));

+    }

 }
\ No newline at end of file
diff --git a/src/main/resources/application-caching.yml b/src/main/resources/application-caching.yml
index 972a688..d1426a9 100644
--- a/src/main/resources/application-caching.yml
+++ b/src/main/resources/application-caching.yml
@@ -6,8 +6,8 @@
         cache:
           region:
             factory_class: org.redisson.hibernate.RedissonRegionFactory
-          use_second_level_cache: true
-          use_query_cache: true
+          use_second_level_cache: false
+          use_query_cache: false
           region_prefix: sapling
           use_structured_entries: true
           provider_configuration_file_resource_path: classpath:conf/hibernate-redis.properties
diff --git a/src/main/resources/application-db.yml b/src/main/resources/application-db.yml
index c3c18c5..cccd795 100644
--- a/src/main/resources/application-db.yml
+++ b/src/main/resources/application-db.yml
@@ -10,4 +10,4 @@
     database-platform: org.hibernate.dialect.MySQL8Dialect

     show-sql: true

     properties:

-      hibernate.format_sql: true

+      hibernate.format_sql: true
\ No newline at end of file
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index ece0b31..965363c 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -3,6 +3,3 @@
 logging:
   level:
     com.github.example.pt: debug
-#spring:
-#  jpa:
-#    show-sql: true
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 70a562f..ea2169f 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -68,63 +68,3 @@
   is-share: false
   token-style: random-128
 
-security:
-  rsa:
-    # 指定服务器RSA公钥文件路径(支持classpath:或文件系统路径)
-    server-public-key-file: src/main/resources/keys/public_key.pem
-#spring:
-#  profiles:
-#    active: test,db  # 移除 caching 配置
-#
-#  jpa:
-#    properties:
-#      hibernate:
-#        ddl-auto: update
-#        hbm2ddl.auto: update
-#        cache:
-#          use_second_level_cache: false
-#          use_query_cache: false
-#
-#  quartz:
-#    job-store-type: jdbc
-#    wait-for-jobs-to-complete-on-shutdown: true
-#    overwrite-existing-jobs: true
-#    jdbc:
-#      initialize-schema: always
-#    properties:
-#      org:
-#        quartz:
-#          scheduler:
-#            instanceName: sapling_scheduler
-#            instanceId: AUTO
-#          jobStore:
-#            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
-#            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#            tablePrefix: QRTZ_
-#            useProperties: false
-#            clusterCheckinInterval: 10000
-#            isClustered: true
-#          threadPool:
-#            class: org.quartz.simpl.SimpleThreadPool
-#            threadCount: 10
-#            threadPriority: 5
-#            threadsInheritContextClassLoaderOfInitializingThread: true
-#
-#  servlet:
-#    multipart:
-#      enabled: true
-#      max-request-size: 20MB
-#      max-file-size: 20MB
-#
-#server:
-#  port: 8081
-#  servlet:
-#    context-path: /api
-#
-#sa-token:
-#  token-name: sapling-token
-#  timeout: 2592000
-#  activity-timeout: -1
-#  is-concurrent: true
-#  is-share: false
-#  token-style: random-128
diff --git a/src/main/resources/ppt.sql b/src/main/resources/ppt.sql
index 6f72579..54e71f0 100644
--- a/src/main/resources/ppt.sql
+++ b/src/main/resources/ppt.sql
@@ -1,741 +1,742 @@
-/*
-Navicat Premium Dump SQL
-
- Source Server         : first
- Source Server Type    : MySQL
- Source Server Version : 80036 (8.0.36)
- Source Host           : localhost:3306
- Source Schema         : ppt
-
- Target Server Type    : MySQL
- Target Server Version : 80036 (8.0.36)
- File Encoding         : 65001
-
- Date: 04/06/2025 14:33:40
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
--- ----------------------------
--- Table structure for categories
--- ----------------------------
-DROP TABLE IF EXISTS `categories`;
-CREATE TABLE `categories`  (
-                               `id` bigint NOT NULL AUTO_INCREMENT,
-                               `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               PRIMARY KEY (`id`) USING BTREE,
-                               UNIQUE INDEX `uk_categories_slug`(`slug` ASC) USING BTREE,
-                               UNIQUE INDEX `UKoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE,
-                               INDEX `idx_categories_slug`(`slug` ASC) USING BTREE,
-                               INDEX `IDXoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of categories
--- ----------------------------
-INSERT INTO `categories` VALUES (1, 'os', '操作系统', 'os-icon.png');
-
--- ----------------------------
--- Table structure for exam_plans
--- ----------------------------
-DROP TABLE IF EXISTS `exam_plans`;
-CREATE TABLE `exam_plans`  (
-                               `id` bigint NOT NULL AUTO_INCREMENT,
-                               `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `downloaded` bigint NOT NULL,
-                               `duration` bigint NOT NULL,
-                               `karma` double NOT NULL,
-                               `seeding_time` bigint NOT NULL,
-                               `seeds` bigint NOT NULL,
-                               `share_ratio` double NOT NULL,
-                               `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `uploaded` bigint NOT NULL,
-                               PRIMARY KEY (`id`) USING BTREE,
-                               UNIQUE INDEX `UK74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE,
-                               INDEX `IDX74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of exam_plans
--- ----------------------------
-
--- ----------------------------
--- Table structure for exams
--- ----------------------------
-DROP TABLE IF EXISTS `exams`;
-CREATE TABLE `exams`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `end_at` datetime(6) NOT NULL,
-                          `exam_plan_id` bigint NULL DEFAULT NULL,
-                          `user_id` bigint NULL DEFAULT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `UK2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,
-                          INDEX `IDX2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,
-                          INDEX `FKl0cips1gany3cuppyfs7ntpai`(`exam_plan_id` ASC) USING BTREE,
-                          CONSTRAINT `FKi63cpl1xkgy32iq68ru4ypjn4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                          CONSTRAINT `FKl0cips1gany3cuppyfs7ntpai` FOREIGN KEY (`exam_plan_id`) REFERENCES `exam_plans` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of exams
--- ----------------------------
-
--- ----------------------------
--- Table structure for login_history
--- ----------------------------
-DROP TABLE IF EXISTS `login_history`;
-CREATE TABLE `login_history`  (
-                                  `id` bigint NOT NULL AUTO_INCREMENT,
-                                  `user_id` bigint NOT NULL,
-                                  `time` timestamp NOT NULL,
-                                  `type` enum('ACCOUNT','PASSKEY','PERSONAL_ACCESSTOKEN','PROGRAM_INTERNAL','TWO_STEP_VERIFICATION') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  PRIMARY KEY (`id`) USING BTREE,
-                                  INDEX `idx_login_time`(`time` ASC) USING BTREE,
-                                  INDEX `fk_loginhistory_user`(`user_id` ASC) USING BTREE,
-                                  INDEX `IDX3lft44makrxommxm63k7xj77d`(`time` ASC) USING BTREE,
-                                  CONSTRAINT `fk_loginhistory_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of login_history
--- ----------------------------
-INSERT INTO `login_history` VALUES (1, 1, '2025-06-03 12:25:33', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (2, 1, '2025-06-03 12:51:42', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (3, 1, '2025-06-03 12:52:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (4, 1, '2025-06-03 14:20:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (5, 1, '2025-06-03 14:31:13', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (6, 1, '2025-06-04 03:40:10', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.44.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (7, 1, '2025-06-04 03:43:09', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (8, 1, '2025-06-04 03:44:27', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (9, 1, '2025-06-04 03:51:35', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (10, 1, '2025-06-04 03:52:22', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (11, 1, '2025-06-04 03:52:53', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (12, 1, '2025-06-04 03:53:12', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (13, 1, '2025-06-04 03:54:46', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (14, 1, '2025-06-04 03:58:14', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (15, 1, '2025-06-04 04:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (16, 1, '2025-06-04 04:43:29', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (17, 1, '2025-06-04 04:54:09', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (18, 1, '2025-06-04 04:59:13', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (19, 1, '2025-06-04 05:17:07', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (20, 1, '2025-06-04 05:18:28', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (21, 1, '2025-06-04 05:21:25', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (22, 1, '2025-06-04 05:21:58', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (23, 1, '2025-06-04 05:22:24', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (24, 1, '2025-06-04 05:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (25, 1, '2025-06-04 05:27:44', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (26, 1, '2025-06-04 05:27:50', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (27, 1, '2025-06-04 05:31:45', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (28, 1, '2025-06-04 05:33:00', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (29, 1, '2025-06-04 06:11:31', 'PASSKEY', '192.168.254.1', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (30, 1, '2025-06-04 06:12:13', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (31, 1, '2025-06-04 06:12:27', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (32, 1, '2025-06-04 06:13:21', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-
--- ----------------------------
--- Table structure for peers
--- ----------------------------
-DROP TABLE IF EXISTS `peers`;
-CREATE TABLE `peers`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `port` int NOT NULL,
-                          `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `peer_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `uploaded` bigint NOT NULL,
-                          `downloaded` bigint NOT NULL,
-                          `to_go` bigint NOT NULL,
-                          `seeder` tinyint(1) NOT NULL,
-                          `partial_seeder` tinyint(1) NOT NULL,
-                          `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `update_at` timestamp NOT NULL,
-                          `seeding_time` bigint NOT NULL,
-                          `upload_speed` bigint NOT NULL,
-                          `download_speed` bigint NOT NULL,
-                          `user_id` bigint NULL DEFAULT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `uk_peers_ip_port_infohash`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,
-                          UNIQUE INDEX `UKoa8l3xqdvxr898mosks3hq3cb`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,
-                          INDEX `idx_peers_update_at`(`update_at` ASC) USING BTREE,
-                          INDEX `fk_peers_user`(`user_id` ASC) USING BTREE,
-                          INDEX `IDXmmvk33liy7j5u9e4qhxw2d7h5`(`update_at` ASC) USING BTREE,
-                          CONSTRAINT `fk_peers_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
-
--- ----------------------------
--- Table structure for permissions
--- ----------------------------
-DROP TABLE IF EXISTS `permissions`;
-CREATE TABLE `permissions`  (
-                                `id` bigint NOT NULL AUTO_INCREMENT,
-                                `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `def` tinyint(1) NOT NULL,
-                                `user_group_id` bigint NULL DEFAULT NULL,
-                                PRIMARY KEY (`id`) USING BTREE,
-                                UNIQUE INDEX `uk_permissions_slug`(`slug` ASC) USING BTREE,
-                                UNIQUE INDEX `UKdv6mwikptsu70hcrjq07sqsfy`(`slug` ASC) USING BTREE,
-                                INDEX `fk_permissions_user_group`(`user_group_id` ASC) USING BTREE,
-                                CONSTRAINT `fk_permissions_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of permissions
--- ----------------------------
-INSERT INTO `permissions` VALUES (1, 'torrent:upload', 1, 1);
-INSERT INTO `permissions` VALUES (2, 'torrent:download', 1, 1);
-INSERT INTO `permissions` VALUES (3, 'torrent:view', 1, 1);
-INSERT INTO `permissions` VALUES (4, 'torrent:search', 1, 1);
-INSERT INTO `permissions` VALUES (5, 'comment:create', 1, 1);
-INSERT INTO `permissions` VALUES (6, 'user:manage', 1, 1);
-INSERT INTO `permissions` VALUES (7, 'torrent:approve', 1, 1);
-INSERT INTO `permissions` VALUES (8, 'torrent:thanks', 1, 1);
-INSERT INTO `permissions` VALUES (9, 'promotion:list', 1, 1);
-
--- ----------------------------
--- Table structure for promotion_policies
--- ----------------------------
-DROP TABLE IF EXISTS `promotion_policies`;
-CREATE TABLE `promotion_policies`  (
-                                       `id` bigint NOT NULL AUTO_INCREMENT,
-                                       `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `upload_ratio` double NULL DEFAULT NULL,
-                                       `download_ratio` double NULL DEFAULT NULL,
-                                       PRIMARY KEY (`id`) USING BTREE,
-                                       UNIQUE INDEX `uk_promotion_policies_slug`(`slug` ASC) USING BTREE,
-                                       UNIQUE INDEX `UKcjqpe1g15outfc0u6ajvpwxoe`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of promotion_policies
--- ----------------------------
-INSERT INTO `promotion_policies` VALUES (1, 'default', '默认策略', 1, 1);
-INSERT INTO `promotion_policies` VALUES (2, 'vip', '活跃用户策略', 1, 1.5);
-
--- ----------------------------
--- Table structure for qrtz_blob_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_blob_triggers`;
-CREATE TABLE `qrtz_blob_triggers`  (
-                                       `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `BLOB_DATA` blob NULL,
-                                       PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                       INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                       CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_blob_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_calendars
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_calendars`;
-CREATE TABLE `qrtz_calendars`  (
-                                   `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                   `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                   `CALENDAR` blob NOT NULL,
-                                   PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_calendars
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_cron_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_cron_triggers`;
-CREATE TABLE `qrtz_cron_triggers`  (
-                                       `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                       PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                       CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_cron_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_fired_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_fired_triggers`;
-CREATE TABLE `qrtz_fired_triggers`  (
-                                        `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `FIRED_TIME` bigint NOT NULL,
-                                        `SCHED_TIME` bigint NOT NULL,
-                                        `PRIORITY` int NOT NULL,
-                                        `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_fired_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_job_details
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_job_details`;
-CREATE TABLE `qrtz_job_details`  (
-                                     `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                     `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_DATA` blob NULL,
-                                     PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
-                                     INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,
-                                     INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_job_details
--- ----------------------------
-INSERT INTO `qrtz_job_details` VALUES ('sapling_scheduler', 'peers_cleanup', 'DEFAULT', 'Peers Cleanup', 'com.github.example.pt.crontask.PeersCleanup', '1', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787000737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007800);
-
--- ----------------------------
--- Table structure for qrtz_locks
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_locks`;
-CREATE TABLE `qrtz_locks`  (
-                               `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_locks
--- ----------------------------
-INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'STATE_ACCESS');
-INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'TRIGGER_ACCESS');
-
--- ----------------------------
--- Table structure for qrtz_paused_trigger_grps
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
-CREATE TABLE `qrtz_paused_trigger_grps`  (
-                                             `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                             `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                             PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_paused_trigger_grps
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_scheduler_state
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_scheduler_state`;
-CREATE TABLE `qrtz_scheduler_state`  (
-                                         `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `LAST_CHECKIN_TIME` bigint NOT NULL,
-                                         `CHECKIN_INTERVAL` bigint NOT NULL,
-                                         PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_scheduler_state
--- ----------------------------
-INSERT INTO `qrtz_scheduler_state` VALUES ('sapling_scheduler', 'LAPTOP-V24K5A551749018489588', 1749018510182, 10000);
-
--- ----------------------------
--- Table structure for qrtz_simple_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_simple_triggers`;
-CREATE TABLE `qrtz_simple_triggers`  (
-                                         `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `REPEAT_COUNT` bigint NOT NULL,
-                                         `REPEAT_INTERVAL` bigint NOT NULL,
-                                         `TIMES_TRIGGERED` bigint NOT NULL,
-                                         PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                         CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_simple_triggers
--- ----------------------------
-INSERT INTO `qrtz_simple_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', -1, 1800000, 1);
-
--- ----------------------------
--- Table structure for qrtz_simprop_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
-CREATE TABLE `qrtz_simprop_triggers`  (
-                                          `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `INT_PROP_1` int NULL DEFAULT NULL,
-                                          `INT_PROP_2` int NULL DEFAULT NULL,
-                                          `LONG_PROP_1` bigint NULL DEFAULT NULL,
-                                          `LONG_PROP_2` bigint NULL DEFAULT NULL,
-                                          `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,
-                                          `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,
-                                          `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                          CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_simprop_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_triggers`;
-CREATE TABLE `qrtz_triggers`  (
-                                  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL,
-                                  `PREV_FIRE_TIME` bigint NULL DEFAULT NULL,
-                                  `PRIORITY` int NULL DEFAULT NULL,
-                                  `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `START_TIME` bigint NOT NULL,
-                                  `END_TIME` bigint NULL DEFAULT NULL,
-                                  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `MISFIRE_INSTR` smallint NULL DEFAULT NULL,
-                                  `JOB_DATA` blob NULL,
-                                  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_triggers
--- ----------------------------
-INSERT INTO `qrtz_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', 'peers_cleanup', 'DEFAULT', NULL, 1749020288505, 1749018488505, 5, 'WAITING', 'SIMPLE', 1749018488505, 0, NULL, 0, '');
-
--- ----------------------------
--- Table structure for seedbox
--- ----------------------------
-DROP TABLE IF EXISTS `seedbox`;
-CREATE TABLE `seedbox`  (
-                            `id` bigint NOT NULL AUTO_INCREMENT,
-                            `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                            `download_multiplier_id` bigint NULL DEFAULT NULL,
-                            `upload_multiplier_id` bigint NULL DEFAULT NULL,
-                            PRIMARY KEY (`id`) USING BTREE,
-                            UNIQUE INDEX `UKecbehjtg3bfr4rmyixt1gcvfq`(`address` ASC) USING BTREE,
-                            INDEX `FKq63tqhykgl96l4rkwy9widy5b`(`download_multiplier_id` ASC) USING BTREE,
-                            INDEX `FK9xl51na3dn8k7ou8cyv7s1wrf`(`upload_multiplier_id` ASC) USING BTREE,
-                            CONSTRAINT `FK9xl51na3dn8k7ou8cyv7s1wrf` FOREIGN KEY (`upload_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                            CONSTRAINT `FKq63tqhykgl96l4rkwy9widy5b` FOREIGN KEY (`download_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of seedbox
--- ----------------------------
-
--- ----------------------------
--- Table structure for settings
--- ----------------------------
-DROP TABLE IF EXISTS `settings`;
-CREATE TABLE `settings`  (
-                             `id` bigint NOT NULL AUTO_INCREMENT,
-                             `setting_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `setting_value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             PRIMARY KEY (`id`) USING BTREE,
-                             UNIQUE INDEX `uk_settings_setting_key`(`setting_key` ASC) USING BTREE,
-                             UNIQUE INDEX `UKswd05dvj4ukvw5q135bpbbfae`(`setting_key` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Table structure for tags
--- ----------------------------
-DROP TABLE IF EXISTS `tags`;
-CREATE TABLE `tags`  (
-                         `id` bigint NOT NULL AUTO_INCREMENT,
-                         `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                         PRIMARY KEY (`id`) USING BTREE,
-                         UNIQUE INDEX `uk_tags_name`(`name` ASC) USING BTREE,
-                         UNIQUE INDEX `UKt48xdq560gs3gap9g7jg36kgc`(`name` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of tags
--- ----------------------------
-INSERT INTO `tags` VALUES (9, '[\"linux\"]');
-INSERT INTO `tags` VALUES (3, 'debian');
-INSERT INTO `tags` VALUES (1, 'linux');
-INSERT INTO `tags` VALUES (5, 'macos');
-INSERT INTO `tags` VALUES (2, 'ubuntu');
-INSERT INTO `tags` VALUES (4, 'windows');
-
--- ----------------------------
--- Table structure for thanks
--- ----------------------------
-DROP TABLE IF EXISTS `thanks`;
-CREATE TABLE `thanks`  (
-                           `id` bigint NOT NULL AUTO_INCREMENT,
-                           `torrent_id` bigint NULL DEFAULT NULL,
-                           `user_id` bigint NULL DEFAULT NULL,
-                           PRIMARY KEY (`id`) USING BTREE,
-                           UNIQUE INDEX `UKrt9lg0h53brgpf9iat5hcmf6g`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                           INDEX `FKp3kgh25tko48vq7x6u2w3dvpp`(`torrent_id` ASC) USING BTREE,
-                           CONSTRAINT `FK2t90h21s5hyx6hynewsdlk46j` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                           CONSTRAINT `FKp3kgh25tko48vq7x6u2w3dvpp` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of thanks
--- ----------------------------
-
--- ----------------------------
--- Table structure for torrents
--- ----------------------------
-DROP TABLE IF EXISTS `torrents`;
-CREATE TABLE `torrents`  (
-                             `id` bigint NOT NULL AUTO_INCREMENT,
-                             `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `user_id` bigint NULL DEFAULT NULL,
-                             `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `sub_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `size` bigint NOT NULL,
-                             `created_at` timestamp NOT NULL,
-                             `updated_at` timestamp NOT NULL,
-                             `under_review` tinyint(1) NOT NULL,
-                             `anonymous` tinyint(1) NOT NULL,
-                             `category_id` bigint NULL DEFAULT NULL,
-                             `promotion_policy_id` bigint NULL DEFAULT NULL,
-                             `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             PRIMARY KEY (`id`) USING BTREE,
-                             UNIQUE INDEX `uk_torrents_info_hash`(`info_hash` ASC) USING BTREE,
-                             UNIQUE INDEX `UKhag2ej1vo8snvirb1lv4b8r4x`(`info_hash` ASC) USING BTREE,
-                             INDEX `idx_torrents_title`(`title` ASC) USING BTREE,
-                             INDEX `idx_torrents_sub_title`(`sub_title` ASC) USING BTREE,
-                             INDEX `idx_torrents_promotion_policy_id`(`promotion_policy_id` ASC) USING BTREE,
-                             INDEX `fk_torrents_user`(`user_id` ASC) USING BTREE,
-                             INDEX `fk_torrents_category`(`category_id` ASC) USING BTREE,
-                             INDEX `IDXdplkaapqslelnscuunfpm9eb6`(`title` ASC) USING BTREE,
-                             INDEX `IDX6r5kh6i4awpdlytjmm06pk22k`(`sub_title` ASC) USING BTREE,
-                             INDEX `IDXd2j3h8td7682cctkv5o77b33y`(`promotion_policy_id` ASC) USING BTREE,
-                             CONSTRAINT `fk_torrents_category` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
-                             CONSTRAINT `fk_torrents_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
-                             CONSTRAINT `fk_torrents_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of torrents
--- ----------------------------
-INSERT INTO `torrents` VALUES (7, '499e9c69e90b976c5c84542cf9b88fad1e12ef1c', 1, 'example torrent title', 'subtitle here', 66194, '2025-06-04 03:41:27', '2025-06-04 03:41:27', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (8, 'f45775564c88b5a2782a301d162e1d4811b0b6d5', 1, 'example torrent title', 'subtitle here', 231105, '2025-06-04 05:20:37', '2025-06-04 05:20:37', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (9, '8e10c9daa1b5fb18dc5b0e73988808ba958391fa', 1, 'example torrent title', 'subtitle here', 426155, '2025-06-04 06:03:49', '2025-06-04 06:03:49', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (10, '1e3275f54ec074af2d99828311d4a8488eb7a487', 1, 'example torrent title', 'subtitle here', 13861694, '2025-06-04 06:10:23', '2025-06-04 06:10:23', 0, 0, 1, 1, '演示种子');
-
--- ----------------------------
--- Table structure for torrents_tag
--- ----------------------------
-DROP TABLE IF EXISTS `torrents_tag`;
-CREATE TABLE `torrents_tag`  (
-                                 `torrent_id` bigint NOT NULL,
-                                 `tag_id` bigint NOT NULL,
-                                 PRIMARY KEY (`torrent_id`, `tag_id`) USING BTREE,
-                                 INDEX `fk_torrents_tag_tag`(`tag_id` ASC) USING BTREE,
-                                 CONSTRAINT `fk_torrents_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
-                                 CONSTRAINT `fk_torrents_tag_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of torrents_tag
--- ----------------------------
-INSERT INTO `torrents_tag` VALUES (7, 9);
-INSERT INTO `torrents_tag` VALUES (8, 9);
-INSERT INTO `torrents_tag` VALUES (9, 9);
-INSERT INTO `torrents_tag` VALUES (10, 9);
-
--- ----------------------------
--- Table structure for transfer_history
--- ----------------------------
-DROP TABLE IF EXISTS `transfer_history`;
-CREATE TABLE `transfer_history`  (
-                                     `id` bigint NOT NULL AUTO_INCREMENT,
-                                     `user_id` bigint NOT NULL,
-                                     `torrent_id` bigint NOT NULL,
-                                     `to_go` bigint NOT NULL,
-                                     `started_at` timestamp NOT NULL,
-                                     `updated_at` timestamp NOT NULL,
-                                     `uploaded` bigint NOT NULL,
-                                     `downloaded` bigint NOT NULL,
-                                     `actual_uploaded` bigint NOT NULL,
-                                     `actual_downloaded` bigint NOT NULL,
-                                     `upload_speed` bigint NOT NULL,
-                                     `download_speed` bigint NOT NULL,
-                                     `last_event` enum('started','completed','stopped','paused','unknown') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `have_complete_history` tinyint(1) NOT NULL,
-                                     PRIMARY KEY (`id`) USING BTREE,
-                                     UNIQUE INDEX `uk_user_torrent`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                                     UNIQUE INDEX `UKrm5p4xv3rb2vm6psql5je94jh`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                                     INDEX `fk_transfer_torrent`(`torrent_id` ASC) USING BTREE,
-                                     CONSTRAINT `fk_transfer_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                                     CONSTRAINT `fk_transfer_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of transfer_history
--- ----------------------------
-INSERT INTO `transfer_history` VALUES (1, 1, 7, 66194, '2025-06-04 04:43:30', '2025-06-04 05:21:25', 0, 0, 0, 0, 0, 0, 'completed', 1);
-INSERT INTO `transfer_history` VALUES (2, 1, 10, 0, '2025-06-04 06:11:31', '2025-06-04 06:13:21', 27723388, 0, 0, 27723388, 0, 77874, 'started', 1);
-
--- ----------------------------
--- Table structure for user_groups
--- ----------------------------
-DROP TABLE IF EXISTS `user_groups`;
-CREATE TABLE `user_groups`  (
-                                `id` bigint NOT NULL AUTO_INCREMENT,
-                                `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `promotion_policy_id` bigint NULL DEFAULT NULL,
-                                PRIMARY KEY (`id`) USING BTREE,
-                                UNIQUE INDEX `uk_user_groups_slug`(`slug` ASC) USING BTREE,
-                                UNIQUE INDEX `UKkkje1jbmrkam1k7jbd39homw0`(`slug` ASC) USING BTREE,
-                                INDEX `fk_user_groups_promotion_policy`(`promotion_policy_id` ASC) USING BTREE,
-                                CONSTRAINT `fk_user_groups_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of user_groups
--- ----------------------------
-INSERT INTO `user_groups` VALUES (1, 'default', '默认用户组', 1);
-INSERT INTO `user_groups` VALUES (2, 'vip', '活跃用户组', 2);
-
--- ----------------------------
--- Table structure for user_groups_permission_entities
--- ----------------------------
-DROP TABLE IF EXISTS `user_groups_permission_entities`;
-CREATE TABLE `user_groups_permission_entities`  (
-                                                    `user_group_id` bigint NOT NULL,
-                                                    `permission_entities_id` bigint NOT NULL,
-                                                    PRIMARY KEY (`user_group_id`, `permission_entities_id`) USING BTREE,
-                                                    UNIQUE INDEX `UK_95j9uaq96bvd9ykn0sngywks6`(`permission_entities_id` ASC) USING BTREE,
-                                                    CONSTRAINT `fk_ugpe_permission` FOREIGN KEY (`permission_entities_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
-                                                    CONSTRAINT `fk_ugpe_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of user_groups_permission_entities
--- ----------------------------
-INSERT INTO `user_groups_permission_entities` VALUES (1, 1);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 2);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 3);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 4);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 5);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 6);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 7);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 8);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 9);
-
--- ----------------------------
--- Table structure for users
--- ----------------------------
-DROP TABLE IF EXISTS `users`;
-CREATE TABLE `users`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `group_id` bigint NULL DEFAULT NULL,
-                          `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `create_at` timestamp NOT NULL,
-                          `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `custom_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `download_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `upload_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `downloaded` bigint NOT NULL,
-                          `uploaded` bigint NOT NULL,
-                          `real_downloaded` bigint NOT NULL,
-                          `real_uploaded` bigint NOT NULL,
-                          `isp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `karma` decimal(19, 2) NOT NULL,
-                          `invite_slot` int NOT NULL,
-                          `seeding_time` bigint NOT NULL,
-                          `personal_access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `privacy_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `uk_users_username`(`username` ASC) USING BTREE,
-                          UNIQUE INDEX `uk_users_email`(`email` ASC) USING BTREE,
-                          UNIQUE INDEX `uk_users_passkey`(`passkey` ASC) USING BTREE,
-                          UNIQUE INDEX `UKr43af9ap4edm43mmtq01oddj6`(`username` ASC) USING BTREE,
-                          UNIQUE INDEX `UK6dotkott2kjsp8vw4d0m25fb7`(`email` ASC) USING BTREE,
-                          UNIQUE INDEX `UK402sx6cqgk66uwt7eyf54tmij`(`passkey` ASC) USING BTREE,
-                          INDEX `fk_users_group`(`group_id` ASC) USING BTREE,
-                          CONSTRAINT `fk_users_group` FOREIGN KEY (`group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of users
--- ----------------------------
-INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
-
-SET FOREIGN_KEY_CHECKS = 1;
-
--- ----------------------------
--- Records of chat_messages
--- ----------------------------
-DROP TABLE IF EXISTS `chat_messages`;
-CREATE TABLE chat_messages (
-                               id BIGINT AUTO_INCREMENT PRIMARY KEY,
-                               room_id BIGINT NOT NULL,
-                               user_id BIGINT NOT NULL,
-                               content TEXT NOT NULL,
-                               created_at DATETIME NOT NULL
-);
+/*

+ Navicat Premium Dump SQL

+

+ Source Server         : first

+ Source Server Type    : MySQL

+ Source Server Version : 80036 (8.0.36)

+ Source Host           : localhost:3306

+ Source Schema         : ppt

+

+ Target Server Type    : MySQL

+ Target Server Version : 80036 (8.0.36)

+ File Encoding         : 65001

+

+ Date: 04/06/2025 14:33:40

+*/

+

+SET NAMES utf8mb4;

+SET FOREIGN_KEY_CHECKS = 0;

+

+-- ----------------------------

+-- Table structure for categories

+-- ----------------------------

+DROP TABLE IF EXISTS `categories`;

+CREATE TABLE `categories`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_categories_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE,

+  INDEX `idx_categories_slug`(`slug` ASC) USING BTREE,

+  INDEX `IDXoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of categories

+-- ----------------------------

+INSERT INTO `categories` VALUES (1, 'os', '操作系统', 'os-icon.png');

+

+-- ----------------------------

+-- Table structure for exam_plans

+-- ----------------------------

+DROP TABLE IF EXISTS `exam_plans`;

+CREATE TABLE `exam_plans`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `duration` bigint NOT NULL,

+  `karma` double NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `seeds` bigint NOT NULL,

+  `share_ratio` double NOT NULL,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `uploaded` bigint NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UK74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE,

+  INDEX `IDX74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of exam_plans

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for exams

+-- ----------------------------

+DROP TABLE IF EXISTS `exams`;

+CREATE TABLE `exams`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `end_at` datetime(6) NOT NULL,

+  `exam_plan_id` bigint NULL DEFAULT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UK2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,

+  INDEX `IDX2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,

+  INDEX `FKl0cips1gany3cuppyfs7ntpai`(`exam_plan_id` ASC) USING BTREE,

+  CONSTRAINT `FKi63cpl1xkgy32iq68ru4ypjn4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKl0cips1gany3cuppyfs7ntpai` FOREIGN KEY (`exam_plan_id`) REFERENCES `exam_plans` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of exams

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for login_history

+-- ----------------------------

+DROP TABLE IF EXISTS `login_history`;

+CREATE TABLE `login_history`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `user_id` bigint NOT NULL,

+  `time` timestamp NOT NULL,

+  `type` enum('ACCOUNT','PASSKEY','PERSONAL_ACCESSTOKEN','PROGRAM_INTERNAL','TWO_STEP_VERIFICATION') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  INDEX `idx_login_time`(`time` ASC) USING BTREE,

+  INDEX `fk_loginhistory_user`(`user_id` ASC) USING BTREE,

+  INDEX `IDX3lft44makrxommxm63k7xj77d`(`time` ASC) USING BTREE,

+  CONSTRAINT `fk_loginhistory_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of login_history

+-- ----------------------------

+INSERT INTO `login_history` VALUES (1, 1, '2025-06-03 12:25:33', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (2, 1, '2025-06-03 12:51:42', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (3, 1, '2025-06-03 12:52:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (4, 1, '2025-06-03 14:20:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (5, 1, '2025-06-03 14:31:13', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (6, 1, '2025-06-04 03:40:10', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.44.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (7, 1, '2025-06-04 03:43:09', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (8, 1, '2025-06-04 03:44:27', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (9, 1, '2025-06-04 03:51:35', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (10, 1, '2025-06-04 03:52:22', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (11, 1, '2025-06-04 03:52:53', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (12, 1, '2025-06-04 03:53:12', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (13, 1, '2025-06-04 03:54:46', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (14, 1, '2025-06-04 03:58:14', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (15, 1, '2025-06-04 04:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (16, 1, '2025-06-04 04:43:29', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (17, 1, '2025-06-04 04:54:09', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (18, 1, '2025-06-04 04:59:13', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (19, 1, '2025-06-04 05:17:07', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (20, 1, '2025-06-04 05:18:28', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (21, 1, '2025-06-04 05:21:25', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (22, 1, '2025-06-04 05:21:58', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (23, 1, '2025-06-04 05:22:24', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (24, 1, '2025-06-04 05:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (25, 1, '2025-06-04 05:27:44', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (26, 1, '2025-06-04 05:27:50', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (27, 1, '2025-06-04 05:31:45', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (28, 1, '2025-06-04 05:33:00', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (29, 1, '2025-06-04 06:11:31', 'PASSKEY', '192.168.254.1', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (30, 1, '2025-06-04 06:12:13', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (31, 1, '2025-06-04 06:12:27', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (32, 1, '2025-06-04 06:13:21', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+

+-- ----------------------------

+-- Table structure for peers

+-- ----------------------------

+DROP TABLE IF EXISTS `peers`;

+CREATE TABLE `peers`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `port` int NOT NULL,

+  `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `peer_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `to_go` bigint NOT NULL,

+  `seeder` tinyint(1) NOT NULL,

+  `partial_seeder` tinyint(1) NOT NULL,

+  `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `update_at` timestamp NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `upload_speed` bigint NOT NULL,

+  `download_speed` bigint NOT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_peers_ip_port_infohash`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,

+  UNIQUE INDEX `UKoa8l3xqdvxr898mosks3hq3cb`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,

+  INDEX `idx_peers_update_at`(`update_at` ASC) USING BTREE,

+  INDEX `fk_peers_user`(`user_id` ASC) USING BTREE,

+  INDEX `IDXmmvk33liy7j5u9e4qhxw2d7h5`(`update_at` ASC) USING BTREE,

+  CONSTRAINT `fk_peers_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+

+-- ----------------------------

+-- Table structure for permissions

+-- ----------------------------

+DROP TABLE IF EXISTS `permissions`;

+CREATE TABLE `permissions`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `def` tinyint(1) NOT NULL,

+  `user_group_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_permissions_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKdv6mwikptsu70hcrjq07sqsfy`(`slug` ASC) USING BTREE,

+  INDEX `fk_permissions_user_group`(`user_group_id` ASC) USING BTREE,

+  CONSTRAINT `fk_permissions_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of permissions

+-- ----------------------------

+INSERT INTO `permissions` VALUES (1, 'torrent:upload', 1, 1);

+INSERT INTO `permissions` VALUES (2, 'torrent:download', 1, 1);

+INSERT INTO `permissions` VALUES (3, 'torrent:view', 1, 1);

+INSERT INTO `permissions` VALUES (4, 'torrent:search', 1, 1);

+INSERT INTO `permissions` VALUES (5, 'comment:create', 1, 1);

+INSERT INTO `permissions` VALUES (6, 'user:manage', 1, 1);

+INSERT INTO `permissions` VALUES (7, 'torrent:approve', 1, 1);

+INSERT INTO `permissions` VALUES (8, 'torrent:thanks', 1, 1);

+INSERT INTO `permissions` VALUES (9, 'promotion:list', 1, 1);

+

+-- ----------------------------

+-- Table structure for promotion_policies

+-- ----------------------------

+DROP TABLE IF EXISTS `promotion_policies`;

+CREATE TABLE `promotion_policies`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `upload_ratio` double NULL DEFAULT NULL,

+  `download_ratio` double NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_promotion_policies_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKcjqpe1g15outfc0u6ajvpwxoe`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of promotion_policies

+-- ----------------------------

+INSERT INTO `promotion_policies` VALUES (1, 'default', '默认策略', 1, 1);

+INSERT INTO `promotion_policies` VALUES (2, 'vip', '活跃用户策略', 1, 1.5);

+

+-- ----------------------------

+-- Table structure for qrtz_blob_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_blob_triggers`;

+CREATE TABLE `qrtz_blob_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `BLOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_blob_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_calendars

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_calendars`;

+CREATE TABLE `qrtz_calendars`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CALENDAR` blob NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_calendars

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_cron_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_cron_triggers`;

+CREATE TABLE `qrtz_cron_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_cron_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_fired_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_fired_triggers`;

+CREATE TABLE `qrtz_fired_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `FIRED_TIME` bigint NOT NULL,

+  `SCHED_TIME` bigint NOT NULL,

+  `PRIORITY` int NOT NULL,

+  `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,

+  INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_fired_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_job_details

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_job_details`;

+CREATE TABLE `qrtz_job_details`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,

+  INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_job_details

+-- ----------------------------

+INSERT INTO `qrtz_job_details` VALUES ('sapling_scheduler', 'peers_cleanup', 'DEFAULT', 'Peers Cleanup', 'com.github.example.pt.crontask.PeersCleanup', '1', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787000737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007800);

+

+-- ----------------------------

+-- Table structure for qrtz_locks

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_locks`;

+CREATE TABLE `qrtz_locks`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_locks

+-- ----------------------------

+INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'STATE_ACCESS');

+INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'TRIGGER_ACCESS');

+

+-- ----------------------------

+-- Table structure for qrtz_paused_trigger_grps

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;

+CREATE TABLE `qrtz_paused_trigger_grps`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_paused_trigger_grps

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_scheduler_state

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_scheduler_state`;

+CREATE TABLE `qrtz_scheduler_state`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `LAST_CHECKIN_TIME` bigint NOT NULL,

+  `CHECKIN_INTERVAL` bigint NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_scheduler_state

+-- ----------------------------

+INSERT INTO `qrtz_scheduler_state` VALUES ('sapling_scheduler', 'LAPTOP-V24K5A551749018489588', 1749018510182, 10000);

+

+-- ----------------------------

+-- Table structure for qrtz_simple_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_simple_triggers`;

+CREATE TABLE `qrtz_simple_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `REPEAT_COUNT` bigint NOT NULL,

+  `REPEAT_INTERVAL` bigint NOT NULL,

+  `TIMES_TRIGGERED` bigint NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_simple_triggers

+-- ----------------------------

+INSERT INTO `qrtz_simple_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', -1, 1800000, 1);

+

+-- ----------------------------

+-- Table structure for qrtz_simprop_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_simprop_triggers`;

+CREATE TABLE `qrtz_simprop_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `INT_PROP_1` int NULL DEFAULT NULL,

+  `INT_PROP_2` int NULL DEFAULT NULL,

+  `LONG_PROP_1` bigint NULL DEFAULT NULL,

+  `LONG_PROP_2` bigint NULL DEFAULT NULL,

+  `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,

+  `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,

+  `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_simprop_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_triggers`;

+CREATE TABLE `qrtz_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL,

+  `PREV_FIRE_TIME` bigint NULL DEFAULT NULL,

+  `PRIORITY` int NULL DEFAULT NULL,

+  `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `START_TIME` bigint NOT NULL,

+  `END_TIME` bigint NULL DEFAULT NULL,

+  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `MISFIRE_INSTR` smallint NULL DEFAULT NULL,

+  `JOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_triggers

+-- ----------------------------

+INSERT INTO `qrtz_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', 'peers_cleanup', 'DEFAULT', NULL, 1749020288505, 1749018488505, 5, 'WAITING', 'SIMPLE', 1749018488505, 0, NULL, 0, '');

+

+-- ----------------------------

+-- Table structure for seedbox

+-- ----------------------------

+DROP TABLE IF EXISTS `seedbox`;

+CREATE TABLE `seedbox`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `download_multiplier_id` bigint NULL DEFAULT NULL,

+  `upload_multiplier_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UKecbehjtg3bfr4rmyixt1gcvfq`(`address` ASC) USING BTREE,

+  INDEX `FKq63tqhykgl96l4rkwy9widy5b`(`download_multiplier_id` ASC) USING BTREE,

+  INDEX `FK9xl51na3dn8k7ou8cyv7s1wrf`(`upload_multiplier_id` ASC) USING BTREE,

+  CONSTRAINT `FK9xl51na3dn8k7ou8cyv7s1wrf` FOREIGN KEY (`upload_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKq63tqhykgl96l4rkwy9widy5b` FOREIGN KEY (`download_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of seedbox

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for settings

+-- ----------------------------

+DROP TABLE IF EXISTS `settings`;

+CREATE TABLE `settings`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `setting_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `setting_value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_settings_setting_key`(`setting_key` ASC) USING BTREE,

+  UNIQUE INDEX `UKswd05dvj4ukvw5q135bpbbfae`(`setting_key` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Table structure for tags

+-- ----------------------------

+DROP TABLE IF EXISTS `tags`;

+CREATE TABLE `tags`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_tags_name`(`name` ASC) USING BTREE,

+  UNIQUE INDEX `UKt48xdq560gs3gap9g7jg36kgc`(`name` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of tags

+-- ----------------------------

+INSERT INTO `tags` VALUES (9, '[\"linux\"]');

+INSERT INTO `tags` VALUES (3, 'debian');

+INSERT INTO `tags` VALUES (1, 'linux');

+INSERT INTO `tags` VALUES (5, 'macos');

+INSERT INTO `tags` VALUES (2, 'ubuntu');

+INSERT INTO `tags` VALUES (4, 'windows');

+

+-- ----------------------------

+-- Table structure for thanks

+-- ----------------------------

+DROP TABLE IF EXISTS `thanks`;

+CREATE TABLE `thanks`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `torrent_id` bigint NULL DEFAULT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UKrt9lg0h53brgpf9iat5hcmf6g`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  INDEX `FKp3kgh25tko48vq7x6u2w3dvpp`(`torrent_id` ASC) USING BTREE,

+  CONSTRAINT `FK2t90h21s5hyx6hynewsdlk46j` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKp3kgh25tko48vq7x6u2w3dvpp` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of thanks

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for torrents

+-- ----------------------------

+DROP TABLE IF EXISTS `torrents`;

+CREATE TABLE `torrents`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `sub_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `size` bigint NOT NULL,

+  `created_at` timestamp NOT NULL,

+  `updated_at` timestamp NOT NULL,

+  `under_review` tinyint(1) NOT NULL,

+  `anonymous` tinyint(1) NOT NULL,

+  `category_id` bigint NULL DEFAULT NULL,

+  `promotion_policy_id` bigint NULL DEFAULT NULL,

+  `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_torrents_info_hash`(`info_hash` ASC) USING BTREE,

+  UNIQUE INDEX `UKhag2ej1vo8snvirb1lv4b8r4x`(`info_hash` ASC) USING BTREE,

+  INDEX `idx_torrents_title`(`title` ASC) USING BTREE,

+  INDEX `idx_torrents_sub_title`(`sub_title` ASC) USING BTREE,

+  INDEX `idx_torrents_promotion_policy_id`(`promotion_policy_id` ASC) USING BTREE,

+  INDEX `fk_torrents_user`(`user_id` ASC) USING BTREE,

+  INDEX `fk_torrents_category`(`category_id` ASC) USING BTREE,

+  INDEX `IDXdplkaapqslelnscuunfpm9eb6`(`title` ASC) USING BTREE,

+  INDEX `IDX6r5kh6i4awpdlytjmm06pk22k`(`sub_title` ASC) USING BTREE,

+  INDEX `IDXd2j3h8td7682cctkv5o77b33y`(`promotion_policy_id` ASC) USING BTREE,

+  CONSTRAINT `fk_torrents_category` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of torrents

+-- ----------------------------

+INSERT INTO `torrents` VALUES (7, '499e9c69e90b976c5c84542cf9b88fad1e12ef1c', 1, 'example torrent title', 'subtitle here', 66194, '2025-06-04 03:41:27', '2025-06-04 03:41:27', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (8, 'f45775564c88b5a2782a301d162e1d4811b0b6d5', 1, 'example torrent title', 'subtitle here', 231105, '2025-06-04 05:20:37', '2025-06-04 05:20:37', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (9, '8e10c9daa1b5fb18dc5b0e73988808ba958391fa', 1, 'example torrent title', 'subtitle here', 426155, '2025-06-04 06:03:49', '2025-06-04 06:03:49', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (10, '1e3275f54ec074af2d99828311d4a8488eb7a487', 1, 'example torrent title', 'subtitle here', 13861694, '2025-06-04 06:10:23', '2025-06-04 06:10:23', 0, 0, 1, 1, '演示种子');

+

+-- ----------------------------

+-- Table structure for torrents_tag

+-- ----------------------------

+DROP TABLE IF EXISTS `torrents_tag`;

+CREATE TABLE `torrents_tag`  (

+  `torrent_id` bigint NOT NULL,

+  `tag_id` bigint NOT NULL,

+  PRIMARY KEY (`torrent_id`, `tag_id`) USING BTREE,

+  INDEX `fk_torrents_tag_tag`(`tag_id` ASC) USING BTREE,

+  CONSTRAINT `fk_torrents_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_tag_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of torrents_tag

+-- ----------------------------

+INSERT INTO `torrents_tag` VALUES (7, 9);

+INSERT INTO `torrents_tag` VALUES (8, 9);

+INSERT INTO `torrents_tag` VALUES (9, 9);

+INSERT INTO `torrents_tag` VALUES (10, 9);

+

+-- ----------------------------

+-- Table structure for transfer_history

+-- ----------------------------

+DROP TABLE IF EXISTS `transfer_history`;

+CREATE TABLE `transfer_history`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `user_id` bigint NOT NULL,

+  `torrent_id` bigint NOT NULL,

+  `to_go` bigint NOT NULL,

+  `started_at` timestamp NOT NULL,

+  `updated_at` timestamp NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `actual_uploaded` bigint NOT NULL,

+  `actual_downloaded` bigint NOT NULL,

+  `upload_speed` bigint NOT NULL,

+  `download_speed` bigint NOT NULL,

+  `last_event` enum('started','completed','stopped','paused','unknown') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `have_complete_history` tinyint(1) NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_user_torrent`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  UNIQUE INDEX `UKrm5p4xv3rb2vm6psql5je94jh`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  INDEX `fk_transfer_torrent`(`torrent_id` ASC) USING BTREE,

+  CONSTRAINT `fk_transfer_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `fk_transfer_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of transfer_history

+-- ----------------------------

+INSERT INTO `transfer_history` VALUES (1, 1, 7, 66194, '2025-06-04 04:43:30', '2025-06-04 05:21:25', 0, 0, 0, 0, 0, 0, 'completed', 1);

+INSERT INTO `transfer_history` VALUES (2, 1, 10, 0, '2025-06-04 06:11:31', '2025-06-04 06:13:21', 27723388, 0, 0, 27723388, 0, 77874, 'started', 1);

+

+-- ----------------------------

+-- Table structure for user_groups

+-- ----------------------------

+DROP TABLE IF EXISTS `user_groups`;

+CREATE TABLE `user_groups`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `promotion_policy_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_user_groups_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKkkje1jbmrkam1k7jbd39homw0`(`slug` ASC) USING BTREE,

+  INDEX `fk_user_groups_promotion_policy`(`promotion_policy_id` ASC) USING BTREE,

+  CONSTRAINT `fk_user_groups_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of user_groups

+-- ----------------------------

+INSERT INTO `user_groups` VALUES (1, 'default', '默认用户组', 1);

+INSERT INTO `user_groups` VALUES (2, 'vip', '活跃用户组', 2);

+

+-- ----------------------------

+-- Table structure for user_groups_permission_entities

+-- ----------------------------

+DROP TABLE IF EXISTS `user_groups_permission_entities`;

+CREATE TABLE `user_groups_permission_entities`  (

+  `user_group_id` bigint NOT NULL,

+  `permission_entities_id` bigint NOT NULL,

+  PRIMARY KEY (`user_group_id`, `permission_entities_id`) USING BTREE,

+  UNIQUE INDEX `UK_95j9uaq96bvd9ykn0sngywks6`(`permission_entities_id` ASC) USING BTREE,

+  CONSTRAINT `fk_ugpe_permission` FOREIGN KEY (`permission_entities_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,

+  CONSTRAINT `fk_ugpe_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of user_groups_permission_entities

+-- ----------------------------

+INSERT INTO `user_groups_permission_entities` VALUES (1, 1);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 2);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 3);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 4);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 5);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 6);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 7);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 8);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 9);

+

+-- ----------------------------

+-- Table structure for users

+-- ----------------------------

+DROP TABLE IF EXISTS `users`;

+CREATE TABLE `users`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `group_id` bigint NULL DEFAULT NULL,

+  `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `create_at` timestamp NOT NULL,

+  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `custom_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `download_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `upload_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `real_downloaded` bigint NOT NULL,

+  `real_uploaded` bigint NOT NULL,

+  `isp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `karma` decimal(19, 2) NOT NULL,

+  `invite_slot` int NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `personal_access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `privacy_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_users_username`(`username` ASC) USING BTREE,

+  UNIQUE INDEX `uk_users_email`(`email` ASC) USING BTREE,

+  UNIQUE INDEX `uk_users_passkey`(`passkey` ASC) USING BTREE,

+  UNIQUE INDEX `UKr43af9ap4edm43mmtq01oddj6`(`username` ASC) USING BTREE,

+  UNIQUE INDEX `UK6dotkott2kjsp8vw4d0m25fb7`(`email` ASC) USING BTREE,

+  UNIQUE INDEX `UK402sx6cqgk66uwt7eyf54tmij`(`passkey` ASC) USING BTREE,

+  INDEX `fk_users_group`(`group_id` ASC) USING BTREE,

+  CONSTRAINT `fk_users_group` FOREIGN KEY (`group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of users

+-- ----------------------------

+INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');

+

+SET FOREIGN_KEY_CHECKS = 1;

+

+-- ----------------------------

+-- Records of chat_messages

+-- ----------------------------

+DROP TABLE IF EXISTS `chat_messages`;

+CREATE TABLE chat_messages (

+    id BIGINT AUTO_INCREMENT PRIMARY KEY,

+    room_id BIGINT NOT NULL,

+    user_id BIGINT NOT NULL,

+    content TEXT NOT NULL,

+    created_at DATETIME NOT NULL

+);

+

diff --git a/src/test/java/com/github/example/pt/ptApplicationTests.java b/src/test/java/com/github/example/pt/ptApplicationTests.java
index 4195344..f5da35b 100644
--- a/src/test/java/com/github/example/pt/ptApplicationTests.java
+++ b/src/test/java/com/github/example/pt/ptApplicationTests.java
@@ -1,4 +1,3 @@
-
 package com.github.example.pt;
 import org.junit.jupiter.api.Test;
 class ptApplicationTests {
diff --git a/target/classes/application-caching.yml b/target/classes/application-caching.yml
index 972a688..d1426a9 100644
--- a/target/classes/application-caching.yml
+++ b/target/classes/application-caching.yml
@@ -6,8 +6,8 @@
         cache:
           region:
             factory_class: org.redisson.hibernate.RedissonRegionFactory
-          use_second_level_cache: true
-          use_query_cache: true
+          use_second_level_cache: false
+          use_query_cache: false
           region_prefix: sapling
           use_structured_entries: true
           provider_configuration_file_resource_path: classpath:conf/hibernate-redis.properties
diff --git a/target/classes/application-db.yml b/target/classes/application-db.yml
index c3c18c5..cccd795 100644
--- a/target/classes/application-db.yml
+++ b/target/classes/application-db.yml
@@ -10,4 +10,4 @@
     database-platform: org.hibernate.dialect.MySQL8Dialect

     show-sql: true

     properties:

-      hibernate.format_sql: true

+      hibernate.format_sql: true
\ No newline at end of file
diff --git a/target/classes/application-test.yml b/target/classes/application-test.yml
index ece0b31..965363c 100644
--- a/target/classes/application-test.yml
+++ b/target/classes/application-test.yml
@@ -3,6 +3,3 @@
 logging:
   level:
     com.github.example.pt: debug
-#spring:
-#  jpa:
-#    show-sql: true
\ No newline at end of file
diff --git a/target/classes/application.yml b/target/classes/application.yml
index 70a562f..ea2169f 100644
--- a/target/classes/application.yml
+++ b/target/classes/application.yml
@@ -68,63 +68,3 @@
   is-share: false
   token-style: random-128
 
-security:
-  rsa:
-    # 指定服务器RSA公钥文件路径(支持classpath:或文件系统路径)
-    server-public-key-file: src/main/resources/keys/public_key.pem
-#spring:
-#  profiles:
-#    active: test,db  # 移除 caching 配置
-#
-#  jpa:
-#    properties:
-#      hibernate:
-#        ddl-auto: update
-#        hbm2ddl.auto: update
-#        cache:
-#          use_second_level_cache: false
-#          use_query_cache: false
-#
-#  quartz:
-#    job-store-type: jdbc
-#    wait-for-jobs-to-complete-on-shutdown: true
-#    overwrite-existing-jobs: true
-#    jdbc:
-#      initialize-schema: always
-#    properties:
-#      org:
-#        quartz:
-#          scheduler:
-#            instanceName: sapling_scheduler
-#            instanceId: AUTO
-#          jobStore:
-#            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
-#            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#            tablePrefix: QRTZ_
-#            useProperties: false
-#            clusterCheckinInterval: 10000
-#            isClustered: true
-#          threadPool:
-#            class: org.quartz.simpl.SimpleThreadPool
-#            threadCount: 10
-#            threadPriority: 5
-#            threadsInheritContextClassLoaderOfInitializingThread: true
-#
-#  servlet:
-#    multipart:
-#      enabled: true
-#      max-request-size: 20MB
-#      max-file-size: 20MB
-#
-#server:
-#  port: 8081
-#  servlet:
-#    context-path: /api
-#
-#sa-token:
-#  token-name: sapling-token
-#  timeout: 2592000
-#  activity-timeout: -1
-#  is-concurrent: true
-#  is-share: false
-#  token-style: random-128
diff --git a/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class b/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
index 29f91eb..333d8ed 100644
--- a/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
+++ b/target/classes/com/github/example/pt/autoconfig/QuartzConfig$AutowiringSpringBeanJobFactory.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class b/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
index 32f477b..583be35 100644
--- a/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
+++ b/target/classes/com/github/example/pt/controller/announce/AnnounceController$PeerResult.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/announce/AnnounceController.class b/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
index 4c5e952..8eb41fb 100644
--- a/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
+++ b/target/classes/com/github/example/pt/controller/announce/AnnounceController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/auth/AuthController.class b/target/classes/com/github/example/pt/controller/auth/AuthController.class
index 2f89a93..d6d5c51 100644
--- a/target/classes/com/github/example/pt/controller/auth/AuthController.class
+++ b/target/classes/com/github/example/pt/controller/auth/AuthController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
index 0f17497..624efea 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/CategoryResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
index 0c433f2..50117e7 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserBasicResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
index 24b37b8..8938bd6 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserGroupResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
index 72232d0..c982c44 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class b/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
index a928092..0a47108 100644
--- a/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/dto/response/UserTinyResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/TorrentController.class b/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
index 77f8437..ace13eb 100644
--- a/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
+++ b/target/classes/com/github/example/pt/controller/torrent/TorrentController.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
index 2f33bef..df5d002 100644
--- a/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
+++ b/target/classes/com/github/example/pt/controller/torrent/dto/response/TorrentUploadSuccessResponseDTO.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/crontask/PeersCleanup.class b/target/classes/com/github/example/pt/crontask/PeersCleanup.class
index c80d93a..924eda1 100644
--- a/target/classes/com/github/example/pt/crontask/PeersCleanup.class
+++ b/target/classes/com/github/example/pt/crontask/PeersCleanup.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/APIGenericException.class b/target/classes/com/github/example/pt/exception/APIGenericException.class
index 79847d4..e2856b8 100644
--- a/target/classes/com/github/example/pt/exception/APIGenericException.class
+++ b/target/classes/com/github/example/pt/exception/APIGenericException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/FixedAnnounceException.class b/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
index 1b8ab5f..33c9e79 100644
--- a/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/FixedAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class b/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
index 0d147b2..8e8a69a 100644
--- a/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/InvalidAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class b/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
index e8f45d2..277775f 100644
--- a/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
+++ b/target/classes/com/github/example/pt/exception/InvalidTorrentVerifyException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class b/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
index c64c060..651b6e2 100644
--- a/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
+++ b/target/classes/com/github/example/pt/exception/RetryableAnnounceException.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class b/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
index 207d093..4b5549b 100644
--- a/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
+++ b/target/classes/com/github/example/pt/service/AnnounceService$AnnounceTask.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AnnounceService.class b/target/classes/com/github/example/pt/service/AnnounceService.class
index 3c611bc..eaf7ad1 100644
--- a/target/classes/com/github/example/pt/service/AnnounceService.class
+++ b/target/classes/com/github/example/pt/service/AnnounceService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/AuthenticationService.class b/target/classes/com/github/example/pt/service/AuthenticationService.class
index deaef28..4a351a3 100644
--- a/target/classes/com/github/example/pt/service/AuthenticationService.class
+++ b/target/classes/com/github/example/pt/service/AuthenticationService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/BlacklistClientService.class b/target/classes/com/github/example/pt/service/BlacklistClientService.class
index 8514c94..b556e73 100644
--- a/target/classes/com/github/example/pt/service/BlacklistClientService.class
+++ b/target/classes/com/github/example/pt/service/BlacklistClientService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/CategoryService.class b/target/classes/com/github/example/pt/service/CategoryService.class
index 78f5266..e8b2a8f 100644
--- a/target/classes/com/github/example/pt/service/CategoryService.class
+++ b/target/classes/com/github/example/pt/service/CategoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/ExamPlanService.class b/target/classes/com/github/example/pt/service/ExamPlanService.class
index f7dc083..4bed8bb 100644
--- a/target/classes/com/github/example/pt/service/ExamPlanService.class
+++ b/target/classes/com/github/example/pt/service/ExamPlanService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/LoginHistoryService.class b/target/classes/com/github/example/pt/service/LoginHistoryService.class
index d2cee3d..afb141f 100644
--- a/target/classes/com/github/example/pt/service/LoginHistoryService.class
+++ b/target/classes/com/github/example/pt/service/LoginHistoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PeerService.class b/target/classes/com/github/example/pt/service/PeerService.class
index 40e8fa7..7c87eb8 100644
--- a/target/classes/com/github/example/pt/service/PeerService.class
+++ b/target/classes/com/github/example/pt/service/PeerService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PermissionService.class b/target/classes/com/github/example/pt/service/PermissionService.class
index a7d6823..f538c86 100644
--- a/target/classes/com/github/example/pt/service/PermissionService.class
+++ b/target/classes/com/github/example/pt/service/PermissionService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/PromotionService.class b/target/classes/com/github/example/pt/service/PromotionService.class
index 512f454..c88ae88 100644
--- a/target/classes/com/github/example/pt/service/PromotionService.class
+++ b/target/classes/com/github/example/pt/service/PromotionService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/SettingService.class b/target/classes/com/github/example/pt/service/SettingService.class
index 62595e4..60dfe1d 100644
--- a/target/classes/com/github/example/pt/service/SettingService.class
+++ b/target/classes/com/github/example/pt/service/SettingService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TagService.class b/target/classes/com/github/example/pt/service/TagService.class
index 251ab50..bc48eaf 100644
--- a/target/classes/com/github/example/pt/service/TagService.class
+++ b/target/classes/com/github/example/pt/service/TagService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TorrentService.class b/target/classes/com/github/example/pt/service/TorrentService.class
index 2a51300..409eef9 100644
--- a/target/classes/com/github/example/pt/service/TorrentService.class
+++ b/target/classes/com/github/example/pt/service/TorrentService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/TransferHistoryService.class b/target/classes/com/github/example/pt/service/TransferHistoryService.class
index 08df053..0c05ee7 100644
--- a/target/classes/com/github/example/pt/service/TransferHistoryService.class
+++ b/target/classes/com/github/example/pt/service/TransferHistoryService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/UserGroupService.class b/target/classes/com/github/example/pt/service/UserGroupService.class
index 60d996c..c2b5b77 100644
--- a/target/classes/com/github/example/pt/service/UserGroupService.class
+++ b/target/classes/com/github/example/pt/service/UserGroupService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/service/UserService.class b/target/classes/com/github/example/pt/service/UserService.class
index a43dfaf..c0df2b7 100644
--- a/target/classes/com/github/example/pt/service/UserService.class
+++ b/target/classes/com/github/example/pt/service/UserService.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/type/AnnounceEventType.class b/target/classes/com/github/example/pt/type/AnnounceEventType.class
index 62dd62e..1e8df5e 100644
--- a/target/classes/com/github/example/pt/type/AnnounceEventType.class
+++ b/target/classes/com/github/example/pt/type/AnnounceEventType.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/IPUtil.class b/target/classes/com/github/example/pt/util/IPUtil.class
index dab2236..a68be73 100644
--- a/target/classes/com/github/example/pt/util/IPUtil.class
+++ b/target/classes/com/github/example/pt/util/IPUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/InfoHashUtil.class b/target/classes/com/github/example/pt/util/InfoHashUtil.class
index b18f975..916c74d 100644
--- a/target/classes/com/github/example/pt/util/InfoHashUtil.class
+++ b/target/classes/com/github/example/pt/util/InfoHashUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/PasswordHash.class b/target/classes/com/github/example/pt/util/PasswordHash.class
index 4a8d67a..5443baf 100644
--- a/target/classes/com/github/example/pt/util/PasswordHash.class
+++ b/target/classes/com/github/example/pt/util/PasswordHash.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/RandomUtil.class b/target/classes/com/github/example/pt/util/RandomUtil.class
index 969ad27..b6ac3fe 100644
--- a/target/classes/com/github/example/pt/util/RandomUtil.class
+++ b/target/classes/com/github/example/pt/util/RandomUtil.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/SafeUUID.class b/target/classes/com/github/example/pt/util/SafeUUID.class
index a070c31..a20c7c6 100644
--- a/target/classes/com/github/example/pt/util/SafeUUID.class
+++ b/target/classes/com/github/example/pt/util/SafeUUID.class
Binary files differ
diff --git a/target/classes/com/github/example/pt/util/TorrentParser.class b/target/classes/com/github/example/pt/util/TorrentParser.class
index 4cb7ca9..33dfca4 100644
--- a/target/classes/com/github/example/pt/util/TorrentParser.class
+++ b/target/classes/com/github/example/pt/util/TorrentParser.class
Binary files differ
diff --git a/target/classes/ppt.sql b/target/classes/ppt.sql
index 6f72579..54e71f0 100644
--- a/target/classes/ppt.sql
+++ b/target/classes/ppt.sql
@@ -1,741 +1,742 @@
-/*
-Navicat Premium Dump SQL
-
- Source Server         : first
- Source Server Type    : MySQL
- Source Server Version : 80036 (8.0.36)
- Source Host           : localhost:3306
- Source Schema         : ppt
-
- Target Server Type    : MySQL
- Target Server Version : 80036 (8.0.36)
- File Encoding         : 65001
-
- Date: 04/06/2025 14:33:40
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
--- ----------------------------
--- Table structure for categories
--- ----------------------------
-DROP TABLE IF EXISTS `categories`;
-CREATE TABLE `categories`  (
-                               `id` bigint NOT NULL AUTO_INCREMENT,
-                               `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               PRIMARY KEY (`id`) USING BTREE,
-                               UNIQUE INDEX `uk_categories_slug`(`slug` ASC) USING BTREE,
-                               UNIQUE INDEX `UKoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE,
-                               INDEX `idx_categories_slug`(`slug` ASC) USING BTREE,
-                               INDEX `IDXoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of categories
--- ----------------------------
-INSERT INTO `categories` VALUES (1, 'os', '操作系统', 'os-icon.png');
-
--- ----------------------------
--- Table structure for exam_plans
--- ----------------------------
-DROP TABLE IF EXISTS `exam_plans`;
-CREATE TABLE `exam_plans`  (
-                               `id` bigint NOT NULL AUTO_INCREMENT,
-                               `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `downloaded` bigint NOT NULL,
-                               `duration` bigint NOT NULL,
-                               `karma` double NOT NULL,
-                               `seeding_time` bigint NOT NULL,
-                               `seeds` bigint NOT NULL,
-                               `share_ratio` double NOT NULL,
-                               `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `uploaded` bigint NOT NULL,
-                               PRIMARY KEY (`id`) USING BTREE,
-                               UNIQUE INDEX `UK74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE,
-                               INDEX `IDX74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of exam_plans
--- ----------------------------
-
--- ----------------------------
--- Table structure for exams
--- ----------------------------
-DROP TABLE IF EXISTS `exams`;
-CREATE TABLE `exams`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `end_at` datetime(6) NOT NULL,
-                          `exam_plan_id` bigint NULL DEFAULT NULL,
-                          `user_id` bigint NULL DEFAULT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `UK2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,
-                          INDEX `IDX2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,
-                          INDEX `FKl0cips1gany3cuppyfs7ntpai`(`exam_plan_id` ASC) USING BTREE,
-                          CONSTRAINT `FKi63cpl1xkgy32iq68ru4ypjn4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                          CONSTRAINT `FKl0cips1gany3cuppyfs7ntpai` FOREIGN KEY (`exam_plan_id`) REFERENCES `exam_plans` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of exams
--- ----------------------------
-
--- ----------------------------
--- Table structure for login_history
--- ----------------------------
-DROP TABLE IF EXISTS `login_history`;
-CREATE TABLE `login_history`  (
-                                  `id` bigint NOT NULL AUTO_INCREMENT,
-                                  `user_id` bigint NOT NULL,
-                                  `time` timestamp NOT NULL,
-                                  `type` enum('ACCOUNT','PASSKEY','PERSONAL_ACCESSTOKEN','PROGRAM_INTERNAL','TWO_STEP_VERIFICATION') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  PRIMARY KEY (`id`) USING BTREE,
-                                  INDEX `idx_login_time`(`time` ASC) USING BTREE,
-                                  INDEX `fk_loginhistory_user`(`user_id` ASC) USING BTREE,
-                                  INDEX `IDX3lft44makrxommxm63k7xj77d`(`time` ASC) USING BTREE,
-                                  CONSTRAINT `fk_loginhistory_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of login_history
--- ----------------------------
-INSERT INTO `login_history` VALUES (1, 1, '2025-06-03 12:25:33', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (2, 1, '2025-06-03 12:51:42', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (3, 1, '2025-06-03 12:52:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (4, 1, '2025-06-03 14:20:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (5, 1, '2025-06-03 14:31:13', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (6, 1, '2025-06-04 03:40:10', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.44.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (7, 1, '2025-06-04 03:43:09', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (8, 1, '2025-06-04 03:44:27', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (9, 1, '2025-06-04 03:51:35', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (10, 1, '2025-06-04 03:52:22', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (11, 1, '2025-06-04 03:52:53', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (12, 1, '2025-06-04 03:53:12', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (13, 1, '2025-06-04 03:54:46', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (14, 1, '2025-06-04 03:58:14', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (15, 1, '2025-06-04 04:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (16, 1, '2025-06-04 04:43:29', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (17, 1, '2025-06-04 04:54:09', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (18, 1, '2025-06-04 04:59:13', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (19, 1, '2025-06-04 05:17:07', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (20, 1, '2025-06-04 05:18:28', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (21, 1, '2025-06-04 05:21:25', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (22, 1, '2025-06-04 05:21:58', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (23, 1, '2025-06-04 05:22:24', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (24, 1, '2025-06-04 05:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (25, 1, '2025-06-04 05:27:44', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (26, 1, '2025-06-04 05:27:50', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (27, 1, '2025-06-04 05:31:45', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (28, 1, '2025-06-04 05:33:00', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (29, 1, '2025-06-04 06:11:31', 'PASSKEY', '192.168.254.1', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (30, 1, '2025-06-04 06:12:13', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (31, 1, '2025-06-04 06:12:27', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-INSERT INTO `login_history` VALUES (32, 1, '2025-06-04 06:13:21', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');
-
--- ----------------------------
--- Table structure for peers
--- ----------------------------
-DROP TABLE IF EXISTS `peers`;
-CREATE TABLE `peers`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `port` int NOT NULL,
-                          `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `peer_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `uploaded` bigint NOT NULL,
-                          `downloaded` bigint NOT NULL,
-                          `to_go` bigint NOT NULL,
-                          `seeder` tinyint(1) NOT NULL,
-                          `partial_seeder` tinyint(1) NOT NULL,
-                          `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `update_at` timestamp NOT NULL,
-                          `seeding_time` bigint NOT NULL,
-                          `upload_speed` bigint NOT NULL,
-                          `download_speed` bigint NOT NULL,
-                          `user_id` bigint NULL DEFAULT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `uk_peers_ip_port_infohash`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,
-                          UNIQUE INDEX `UKoa8l3xqdvxr898mosks3hq3cb`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,
-                          INDEX `idx_peers_update_at`(`update_at` ASC) USING BTREE,
-                          INDEX `fk_peers_user`(`user_id` ASC) USING BTREE,
-                          INDEX `IDXmmvk33liy7j5u9e4qhxw2d7h5`(`update_at` ASC) USING BTREE,
-                          CONSTRAINT `fk_peers_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
-
--- ----------------------------
--- Table structure for permissions
--- ----------------------------
-DROP TABLE IF EXISTS `permissions`;
-CREATE TABLE `permissions`  (
-                                `id` bigint NOT NULL AUTO_INCREMENT,
-                                `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `def` tinyint(1) NOT NULL,
-                                `user_group_id` bigint NULL DEFAULT NULL,
-                                PRIMARY KEY (`id`) USING BTREE,
-                                UNIQUE INDEX `uk_permissions_slug`(`slug` ASC) USING BTREE,
-                                UNIQUE INDEX `UKdv6mwikptsu70hcrjq07sqsfy`(`slug` ASC) USING BTREE,
-                                INDEX `fk_permissions_user_group`(`user_group_id` ASC) USING BTREE,
-                                CONSTRAINT `fk_permissions_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of permissions
--- ----------------------------
-INSERT INTO `permissions` VALUES (1, 'torrent:upload', 1, 1);
-INSERT INTO `permissions` VALUES (2, 'torrent:download', 1, 1);
-INSERT INTO `permissions` VALUES (3, 'torrent:view', 1, 1);
-INSERT INTO `permissions` VALUES (4, 'torrent:search', 1, 1);
-INSERT INTO `permissions` VALUES (5, 'comment:create', 1, 1);
-INSERT INTO `permissions` VALUES (6, 'user:manage', 1, 1);
-INSERT INTO `permissions` VALUES (7, 'torrent:approve', 1, 1);
-INSERT INTO `permissions` VALUES (8, 'torrent:thanks', 1, 1);
-INSERT INTO `permissions` VALUES (9, 'promotion:list', 1, 1);
-
--- ----------------------------
--- Table structure for promotion_policies
--- ----------------------------
-DROP TABLE IF EXISTS `promotion_policies`;
-CREATE TABLE `promotion_policies`  (
-                                       `id` bigint NOT NULL AUTO_INCREMENT,
-                                       `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `upload_ratio` double NULL DEFAULT NULL,
-                                       `download_ratio` double NULL DEFAULT NULL,
-                                       PRIMARY KEY (`id`) USING BTREE,
-                                       UNIQUE INDEX `uk_promotion_policies_slug`(`slug` ASC) USING BTREE,
-                                       UNIQUE INDEX `UKcjqpe1g15outfc0u6ajvpwxoe`(`slug` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of promotion_policies
--- ----------------------------
-INSERT INTO `promotion_policies` VALUES (1, 'default', '默认策略', 1, 1);
-INSERT INTO `promotion_policies` VALUES (2, 'vip', '活跃用户策略', 1, 1.5);
-
--- ----------------------------
--- Table structure for qrtz_blob_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_blob_triggers`;
-CREATE TABLE `qrtz_blob_triggers`  (
-                                       `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `BLOB_DATA` blob NULL,
-                                       PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                       INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                       CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_blob_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_calendars
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_calendars`;
-CREATE TABLE `qrtz_calendars`  (
-                                   `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                   `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                   `CALENDAR` blob NOT NULL,
-                                   PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_calendars
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_cron_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_cron_triggers`;
-CREATE TABLE `qrtz_cron_triggers`  (
-                                       `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                       `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                       PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                       CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_cron_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_fired_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_fired_triggers`;
-CREATE TABLE `qrtz_fired_triggers`  (
-                                        `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `FIRED_TIME` bigint NOT NULL,
-                                        `SCHED_TIME` bigint NOT NULL,
-                                        `PRIORITY` int NOT NULL,
-                                        `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                        `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                        PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                        INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_fired_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_job_details
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_job_details`;
-CREATE TABLE `qrtz_job_details`  (
-                                     `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                     `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `JOB_DATA` blob NULL,
-                                     PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
-                                     INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,
-                                     INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_job_details
--- ----------------------------
-INSERT INTO `qrtz_job_details` VALUES ('sapling_scheduler', 'peers_cleanup', 'DEFAULT', 'Peers Cleanup', 'com.github.example.pt.crontask.PeersCleanup', '1', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787000737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007800);
-
--- ----------------------------
--- Table structure for qrtz_locks
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_locks`;
-CREATE TABLE `qrtz_locks`  (
-                               `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                               PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_locks
--- ----------------------------
-INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'STATE_ACCESS');
-INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'TRIGGER_ACCESS');
-
--- ----------------------------
--- Table structure for qrtz_paused_trigger_grps
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
-CREATE TABLE `qrtz_paused_trigger_grps`  (
-                                             `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                             `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                             PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_paused_trigger_grps
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_scheduler_state
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_scheduler_state`;
-CREATE TABLE `qrtz_scheduler_state`  (
-                                         `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `LAST_CHECKIN_TIME` bigint NOT NULL,
-                                         `CHECKIN_INTERVAL` bigint NOT NULL,
-                                         PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_scheduler_state
--- ----------------------------
-INSERT INTO `qrtz_scheduler_state` VALUES ('sapling_scheduler', 'LAPTOP-V24K5A551749018489588', 1749018510182, 10000);
-
--- ----------------------------
--- Table structure for qrtz_simple_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_simple_triggers`;
-CREATE TABLE `qrtz_simple_triggers`  (
-                                         `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                         `REPEAT_COUNT` bigint NOT NULL,
-                                         `REPEAT_INTERVAL` bigint NOT NULL,
-                                         `TIMES_TRIGGERED` bigint NOT NULL,
-                                         PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                         CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_simple_triggers
--- ----------------------------
-INSERT INTO `qrtz_simple_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', -1, 1800000, 1);
-
--- ----------------------------
--- Table structure for qrtz_simprop_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
-CREATE TABLE `qrtz_simprop_triggers`  (
-                                          `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                          `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `INT_PROP_1` int NULL DEFAULT NULL,
-                                          `INT_PROP_2` int NULL DEFAULT NULL,
-                                          `LONG_PROP_1` bigint NULL DEFAULT NULL,
-                                          `LONG_PROP_2` bigint NULL DEFAULT NULL,
-                                          `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,
-                                          `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,
-                                          `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                          PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                          CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_simprop_triggers
--- ----------------------------
-
--- ----------------------------
--- Table structure for qrtz_triggers
--- ----------------------------
-DROP TABLE IF EXISTS `qrtz_triggers`;
-CREATE TABLE `qrtz_triggers`  (
-                                  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL,
-                                  `PREV_FIRE_TIME` bigint NULL DEFAULT NULL,
-                                  `PRIORITY` int NULL DEFAULT NULL,
-                                  `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                  `START_TIME` bigint NOT NULL,
-                                  `END_TIME` bigint NULL DEFAULT NULL,
-                                  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
-                                  `MISFIRE_INSTR` smallint NULL DEFAULT NULL,
-                                  `JOB_DATA` blob NULL,
-                                  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,
-                                  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of qrtz_triggers
--- ----------------------------
-INSERT INTO `qrtz_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', 'peers_cleanup', 'DEFAULT', NULL, 1749020288505, 1749018488505, 5, 'WAITING', 'SIMPLE', 1749018488505, 0, NULL, 0, '');
-
--- ----------------------------
--- Table structure for seedbox
--- ----------------------------
-DROP TABLE IF EXISTS `seedbox`;
-CREATE TABLE `seedbox`  (
-                            `id` bigint NOT NULL AUTO_INCREMENT,
-                            `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                            `download_multiplier_id` bigint NULL DEFAULT NULL,
-                            `upload_multiplier_id` bigint NULL DEFAULT NULL,
-                            PRIMARY KEY (`id`) USING BTREE,
-                            UNIQUE INDEX `UKecbehjtg3bfr4rmyixt1gcvfq`(`address` ASC) USING BTREE,
-                            INDEX `FKq63tqhykgl96l4rkwy9widy5b`(`download_multiplier_id` ASC) USING BTREE,
-                            INDEX `FK9xl51na3dn8k7ou8cyv7s1wrf`(`upload_multiplier_id` ASC) USING BTREE,
-                            CONSTRAINT `FK9xl51na3dn8k7ou8cyv7s1wrf` FOREIGN KEY (`upload_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                            CONSTRAINT `FKq63tqhykgl96l4rkwy9widy5b` FOREIGN KEY (`download_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of seedbox
--- ----------------------------
-
--- ----------------------------
--- Table structure for settings
--- ----------------------------
-DROP TABLE IF EXISTS `settings`;
-CREATE TABLE `settings`  (
-                             `id` bigint NOT NULL AUTO_INCREMENT,
-                             `setting_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `setting_value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             PRIMARY KEY (`id`) USING BTREE,
-                             UNIQUE INDEX `uk_settings_setting_key`(`setting_key` ASC) USING BTREE,
-                             UNIQUE INDEX `UKswd05dvj4ukvw5q135bpbbfae`(`setting_key` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Table structure for tags
--- ----------------------------
-DROP TABLE IF EXISTS `tags`;
-CREATE TABLE `tags`  (
-                         `id` bigint NOT NULL AUTO_INCREMENT,
-                         `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                         PRIMARY KEY (`id`) USING BTREE,
-                         UNIQUE INDEX `uk_tags_name`(`name` ASC) USING BTREE,
-                         UNIQUE INDEX `UKt48xdq560gs3gap9g7jg36kgc`(`name` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of tags
--- ----------------------------
-INSERT INTO `tags` VALUES (9, '[\"linux\"]');
-INSERT INTO `tags` VALUES (3, 'debian');
-INSERT INTO `tags` VALUES (1, 'linux');
-INSERT INTO `tags` VALUES (5, 'macos');
-INSERT INTO `tags` VALUES (2, 'ubuntu');
-INSERT INTO `tags` VALUES (4, 'windows');
-
--- ----------------------------
--- Table structure for thanks
--- ----------------------------
-DROP TABLE IF EXISTS `thanks`;
-CREATE TABLE `thanks`  (
-                           `id` bigint NOT NULL AUTO_INCREMENT,
-                           `torrent_id` bigint NULL DEFAULT NULL,
-                           `user_id` bigint NULL DEFAULT NULL,
-                           PRIMARY KEY (`id`) USING BTREE,
-                           UNIQUE INDEX `UKrt9lg0h53brgpf9iat5hcmf6g`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                           INDEX `FKp3kgh25tko48vq7x6u2w3dvpp`(`torrent_id` ASC) USING BTREE,
-                           CONSTRAINT `FK2t90h21s5hyx6hynewsdlk46j` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                           CONSTRAINT `FKp3kgh25tko48vq7x6u2w3dvpp` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of thanks
--- ----------------------------
-
--- ----------------------------
--- Table structure for torrents
--- ----------------------------
-DROP TABLE IF EXISTS `torrents`;
-CREATE TABLE `torrents`  (
-                             `id` bigint NOT NULL AUTO_INCREMENT,
-                             `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `user_id` bigint NULL DEFAULT NULL,
-                             `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `sub_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             `size` bigint NOT NULL,
-                             `created_at` timestamp NOT NULL,
-                             `updated_at` timestamp NOT NULL,
-                             `under_review` tinyint(1) NOT NULL,
-                             `anonymous` tinyint(1) NOT NULL,
-                             `category_id` bigint NULL DEFAULT NULL,
-                             `promotion_policy_id` bigint NULL DEFAULT NULL,
-                             `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                             PRIMARY KEY (`id`) USING BTREE,
-                             UNIQUE INDEX `uk_torrents_info_hash`(`info_hash` ASC) USING BTREE,
-                             UNIQUE INDEX `UKhag2ej1vo8snvirb1lv4b8r4x`(`info_hash` ASC) USING BTREE,
-                             INDEX `idx_torrents_title`(`title` ASC) USING BTREE,
-                             INDEX `idx_torrents_sub_title`(`sub_title` ASC) USING BTREE,
-                             INDEX `idx_torrents_promotion_policy_id`(`promotion_policy_id` ASC) USING BTREE,
-                             INDEX `fk_torrents_user`(`user_id` ASC) USING BTREE,
-                             INDEX `fk_torrents_category`(`category_id` ASC) USING BTREE,
-                             INDEX `IDXdplkaapqslelnscuunfpm9eb6`(`title` ASC) USING BTREE,
-                             INDEX `IDX6r5kh6i4awpdlytjmm06pk22k`(`sub_title` ASC) USING BTREE,
-                             INDEX `IDXd2j3h8td7682cctkv5o77b33y`(`promotion_policy_id` ASC) USING BTREE,
-                             CONSTRAINT `fk_torrents_category` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
-                             CONSTRAINT `fk_torrents_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,
-                             CONSTRAINT `fk_torrents_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of torrents
--- ----------------------------
-INSERT INTO `torrents` VALUES (7, '499e9c69e90b976c5c84542cf9b88fad1e12ef1c', 1, 'example torrent title', 'subtitle here', 66194, '2025-06-04 03:41:27', '2025-06-04 03:41:27', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (8, 'f45775564c88b5a2782a301d162e1d4811b0b6d5', 1, 'example torrent title', 'subtitle here', 231105, '2025-06-04 05:20:37', '2025-06-04 05:20:37', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (9, '8e10c9daa1b5fb18dc5b0e73988808ba958391fa', 1, 'example torrent title', 'subtitle here', 426155, '2025-06-04 06:03:49', '2025-06-04 06:03:49', 0, 0, 1, 1, '演示种子');
-INSERT INTO `torrents` VALUES (10, '1e3275f54ec074af2d99828311d4a8488eb7a487', 1, 'example torrent title', 'subtitle here', 13861694, '2025-06-04 06:10:23', '2025-06-04 06:10:23', 0, 0, 1, 1, '演示种子');
-
--- ----------------------------
--- Table structure for torrents_tag
--- ----------------------------
-DROP TABLE IF EXISTS `torrents_tag`;
-CREATE TABLE `torrents_tag`  (
-                                 `torrent_id` bigint NOT NULL,
-                                 `tag_id` bigint NOT NULL,
-                                 PRIMARY KEY (`torrent_id`, `tag_id`) USING BTREE,
-                                 INDEX `fk_torrents_tag_tag`(`tag_id` ASC) USING BTREE,
-                                 CONSTRAINT `fk_torrents_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
-                                 CONSTRAINT `fk_torrents_tag_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of torrents_tag
--- ----------------------------
-INSERT INTO `torrents_tag` VALUES (7, 9);
-INSERT INTO `torrents_tag` VALUES (8, 9);
-INSERT INTO `torrents_tag` VALUES (9, 9);
-INSERT INTO `torrents_tag` VALUES (10, 9);
-
--- ----------------------------
--- Table structure for transfer_history
--- ----------------------------
-DROP TABLE IF EXISTS `transfer_history`;
-CREATE TABLE `transfer_history`  (
-                                     `id` bigint NOT NULL AUTO_INCREMENT,
-                                     `user_id` bigint NOT NULL,
-                                     `torrent_id` bigint NOT NULL,
-                                     `to_go` bigint NOT NULL,
-                                     `started_at` timestamp NOT NULL,
-                                     `updated_at` timestamp NOT NULL,
-                                     `uploaded` bigint NOT NULL,
-                                     `downloaded` bigint NOT NULL,
-                                     `actual_uploaded` bigint NOT NULL,
-                                     `actual_downloaded` bigint NOT NULL,
-                                     `upload_speed` bigint NOT NULL,
-                                     `download_speed` bigint NOT NULL,
-                                     `last_event` enum('started','completed','stopped','paused','unknown') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                     `have_complete_history` tinyint(1) NOT NULL,
-                                     PRIMARY KEY (`id`) USING BTREE,
-                                     UNIQUE INDEX `uk_user_torrent`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                                     UNIQUE INDEX `UKrm5p4xv3rb2vm6psql5je94jh`(`user_id` ASC, `torrent_id` ASC) USING BTREE,
-                                     INDEX `fk_transfer_torrent`(`torrent_id` ASC) USING BTREE,
-                                     CONSTRAINT `fk_transfer_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-                                     CONSTRAINT `fk_transfer_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of transfer_history
--- ----------------------------
-INSERT INTO `transfer_history` VALUES (1, 1, 7, 66194, '2025-06-04 04:43:30', '2025-06-04 05:21:25', 0, 0, 0, 0, 0, 0, 'completed', 1);
-INSERT INTO `transfer_history` VALUES (2, 1, 10, 0, '2025-06-04 06:11:31', '2025-06-04 06:13:21', 27723388, 0, 0, 27723388, 0, 77874, 'started', 1);
-
--- ----------------------------
--- Table structure for user_groups
--- ----------------------------
-DROP TABLE IF EXISTS `user_groups`;
-CREATE TABLE `user_groups`  (
-                                `id` bigint NOT NULL AUTO_INCREMENT,
-                                `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                                `promotion_policy_id` bigint NULL DEFAULT NULL,
-                                PRIMARY KEY (`id`) USING BTREE,
-                                UNIQUE INDEX `uk_user_groups_slug`(`slug` ASC) USING BTREE,
-                                UNIQUE INDEX `UKkkje1jbmrkam1k7jbd39homw0`(`slug` ASC) USING BTREE,
-                                INDEX `fk_user_groups_promotion_policy`(`promotion_policy_id` ASC) USING BTREE,
-                                CONSTRAINT `fk_user_groups_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of user_groups
--- ----------------------------
-INSERT INTO `user_groups` VALUES (1, 'default', '默认用户组', 1);
-INSERT INTO `user_groups` VALUES (2, 'vip', '活跃用户组', 2);
-
--- ----------------------------
--- Table structure for user_groups_permission_entities
--- ----------------------------
-DROP TABLE IF EXISTS `user_groups_permission_entities`;
-CREATE TABLE `user_groups_permission_entities`  (
-                                                    `user_group_id` bigint NOT NULL,
-                                                    `permission_entities_id` bigint NOT NULL,
-                                                    PRIMARY KEY (`user_group_id`, `permission_entities_id`) USING BTREE,
-                                                    UNIQUE INDEX `UK_95j9uaq96bvd9ykn0sngywks6`(`permission_entities_id` ASC) USING BTREE,
-                                                    CONSTRAINT `fk_ugpe_permission` FOREIGN KEY (`permission_entities_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
-                                                    CONSTRAINT `fk_ugpe_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of user_groups_permission_entities
--- ----------------------------
-INSERT INTO `user_groups_permission_entities` VALUES (1, 1);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 2);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 3);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 4);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 5);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 6);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 7);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 8);
-INSERT INTO `user_groups_permission_entities` VALUES (1, 9);
-
--- ----------------------------
--- Table structure for users
--- ----------------------------
-DROP TABLE IF EXISTS `users`;
-CREATE TABLE `users`  (
-                          `id` bigint NOT NULL AUTO_INCREMENT,
-                          `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `group_id` bigint NULL DEFAULT NULL,
-                          `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `create_at` timestamp NOT NULL,
-                          `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `custom_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `download_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `upload_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `downloaded` bigint NOT NULL,
-                          `uploaded` bigint NOT NULL,
-                          `real_downloaded` bigint NOT NULL,
-                          `real_uploaded` bigint NOT NULL,
-                          `isp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `karma` decimal(19, 2) NOT NULL,
-                          `invite_slot` int NOT NULL,
-                          `seeding_time` bigint NOT NULL,
-                          `personal_access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          `privacy_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-                          PRIMARY KEY (`id`) USING BTREE,
-                          UNIQUE INDEX `uk_users_username`(`username` ASC) USING BTREE,
-                          UNIQUE INDEX `uk_users_email`(`email` ASC) USING BTREE,
-                          UNIQUE INDEX `uk_users_passkey`(`passkey` ASC) USING BTREE,
-                          UNIQUE INDEX `UKr43af9ap4edm43mmtq01oddj6`(`username` ASC) USING BTREE,
-                          UNIQUE INDEX `UK6dotkott2kjsp8vw4d0m25fb7`(`email` ASC) USING BTREE,
-                          UNIQUE INDEX `UK402sx6cqgk66uwt7eyf54tmij`(`passkey` ASC) USING BTREE,
-                          INDEX `fk_users_group`(`group_id` ASC) USING BTREE,
-                          CONSTRAINT `fk_users_group` FOREIGN KEY (`group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Records of users
--- ----------------------------
-INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');
-
-SET FOREIGN_KEY_CHECKS = 1;
-
--- ----------------------------
--- Records of chat_messages
--- ----------------------------
-DROP TABLE IF EXISTS `chat_messages`;
-CREATE TABLE chat_messages (
-                               id BIGINT AUTO_INCREMENT PRIMARY KEY,
-                               room_id BIGINT NOT NULL,
-                               user_id BIGINT NOT NULL,
-                               content TEXT NOT NULL,
-                               created_at DATETIME NOT NULL
-);
+/*

+ Navicat Premium Dump SQL

+

+ Source Server         : first

+ Source Server Type    : MySQL

+ Source Server Version : 80036 (8.0.36)

+ Source Host           : localhost:3306

+ Source Schema         : ppt

+

+ Target Server Type    : MySQL

+ Target Server Version : 80036 (8.0.36)

+ File Encoding         : 65001

+

+ Date: 04/06/2025 14:33:40

+*/

+

+SET NAMES utf8mb4;

+SET FOREIGN_KEY_CHECKS = 0;

+

+-- ----------------------------

+-- Table structure for categories

+-- ----------------------------

+DROP TABLE IF EXISTS `categories`;

+CREATE TABLE `categories`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_categories_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE,

+  INDEX `idx_categories_slug`(`slug` ASC) USING BTREE,

+  INDEX `IDXoul14ho7bctbefv8jywp5v3i2`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of categories

+-- ----------------------------

+INSERT INTO `categories` VALUES (1, 'os', '操作系统', 'os-icon.png');

+

+-- ----------------------------

+-- Table structure for exam_plans

+-- ----------------------------

+DROP TABLE IF EXISTS `exam_plans`;

+CREATE TABLE `exam_plans`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `duration` bigint NOT NULL,

+  `karma` double NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `seeds` bigint NOT NULL,

+  `share_ratio` double NOT NULL,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `uploaded` bigint NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UK74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE,

+  INDEX `IDX74jaepieaj2umswpqn16yy3x5`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of exam_plans

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for exams

+-- ----------------------------

+DROP TABLE IF EXISTS `exams`;

+CREATE TABLE `exams`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `end_at` datetime(6) NOT NULL,

+  `exam_plan_id` bigint NULL DEFAULT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UK2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,

+  INDEX `IDX2wii0igd3vdfecy00op0un4qt`(`user_id` ASC) USING BTREE,

+  INDEX `FKl0cips1gany3cuppyfs7ntpai`(`exam_plan_id` ASC) USING BTREE,

+  CONSTRAINT `FKi63cpl1xkgy32iq68ru4ypjn4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKl0cips1gany3cuppyfs7ntpai` FOREIGN KEY (`exam_plan_id`) REFERENCES `exam_plans` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of exams

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for login_history

+-- ----------------------------

+DROP TABLE IF EXISTS `login_history`;

+CREATE TABLE `login_history`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `user_id` bigint NOT NULL,

+  `time` timestamp NOT NULL,

+  `type` enum('ACCOUNT','PASSKEY','PERSONAL_ACCESSTOKEN','PROGRAM_INTERNAL','TWO_STEP_VERIFICATION') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  INDEX `idx_login_time`(`time` ASC) USING BTREE,

+  INDEX `fk_loginhistory_user`(`user_id` ASC) USING BTREE,

+  INDEX `IDX3lft44makrxommxm63k7xj77d`(`time` ASC) USING BTREE,

+  CONSTRAINT `fk_loginhistory_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of login_history

+-- ----------------------------

+INSERT INTO `login_history` VALUES (1, 1, '2025-06-03 12:25:33', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (2, 1, '2025-06-03 12:51:42', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (3, 1, '2025-06-03 12:52:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (4, 1, '2025-06-03 14:20:55', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (5, 1, '2025-06-03 14:31:13', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.43.4', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (6, 1, '2025-06-04 03:40:10', 'ACCOUNT', '0:0:0:0:0:0:0:1', 'PostmanRuntime/7.44.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (7, 1, '2025-06-04 03:43:09', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (8, 1, '2025-06-04 03:44:27', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (9, 1, '2025-06-04 03:51:35', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (10, 1, '2025-06-04 03:52:22', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (11, 1, '2025-06-04 03:52:53', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (12, 1, '2025-06-04 03:53:12', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (13, 1, '2025-06-04 03:54:46', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (14, 1, '2025-06-04 03:58:14', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (15, 1, '2025-06-04 04:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (16, 1, '2025-06-04 04:43:29', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (17, 1, '2025-06-04 04:54:09', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (18, 1, '2025-06-04 04:59:13', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (19, 1, '2025-06-04 05:17:07', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (20, 1, '2025-06-04 05:18:28', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (21, 1, '2025-06-04 05:21:25', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (22, 1, '2025-06-04 05:21:58', 'PASSKEY', '192.168.10.10', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (23, 1, '2025-06-04 05:22:24', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (24, 1, '2025-06-04 05:22:30', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (25, 1, '2025-06-04 05:27:44', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (26, 1, '2025-06-04 05:27:50', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (27, 1, '2025-06-04 05:31:45', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (28, 1, '2025-06-04 05:33:00', 'PASSKEY', '192.168.10.10', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (29, 1, '2025-06-04 06:11:31', 'PASSKEY', '192.168.254.1', 'qBittorrent/5.1.0', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (30, 1, '2025-06-04 06:12:13', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (31, 1, '2025-06-04 06:12:27', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+INSERT INTO `login_history` VALUES (32, 1, '2025-06-04 06:13:21', 'PASSKEY', '192.168.254.1', 'Transmission/4.0.6', 'Unknown - GeoIP not initialized');

+

+-- ----------------------------

+-- Table structure for peers

+-- ----------------------------

+DROP TABLE IF EXISTS `peers`;

+CREATE TABLE `peers`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `port` int NOT NULL,

+  `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `peer_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `to_go` bigint NOT NULL,

+  `seeder` tinyint(1) NOT NULL,

+  `partial_seeder` tinyint(1) NOT NULL,

+  `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `update_at` timestamp NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `upload_speed` bigint NOT NULL,

+  `download_speed` bigint NOT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_peers_ip_port_infohash`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,

+  UNIQUE INDEX `UKoa8l3xqdvxr898mosks3hq3cb`(`ip` ASC, `port` ASC, `info_hash` ASC) USING BTREE,

+  INDEX `idx_peers_update_at`(`update_at` ASC) USING BTREE,

+  INDEX `fk_peers_user`(`user_id` ASC) USING BTREE,

+  INDEX `IDXmmvk33liy7j5u9e4qhxw2d7h5`(`update_at` ASC) USING BTREE,

+  CONSTRAINT `fk_peers_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+

+-- ----------------------------

+-- Table structure for permissions

+-- ----------------------------

+DROP TABLE IF EXISTS `permissions`;

+CREATE TABLE `permissions`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `def` tinyint(1) NOT NULL,

+  `user_group_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_permissions_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKdv6mwikptsu70hcrjq07sqsfy`(`slug` ASC) USING BTREE,

+  INDEX `fk_permissions_user_group`(`user_group_id` ASC) USING BTREE,

+  CONSTRAINT `fk_permissions_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of permissions

+-- ----------------------------

+INSERT INTO `permissions` VALUES (1, 'torrent:upload', 1, 1);

+INSERT INTO `permissions` VALUES (2, 'torrent:download', 1, 1);

+INSERT INTO `permissions` VALUES (3, 'torrent:view', 1, 1);

+INSERT INTO `permissions` VALUES (4, 'torrent:search', 1, 1);

+INSERT INTO `permissions` VALUES (5, 'comment:create', 1, 1);

+INSERT INTO `permissions` VALUES (6, 'user:manage', 1, 1);

+INSERT INTO `permissions` VALUES (7, 'torrent:approve', 1, 1);

+INSERT INTO `permissions` VALUES (8, 'torrent:thanks', 1, 1);

+INSERT INTO `permissions` VALUES (9, 'promotion:list', 1, 1);

+

+-- ----------------------------

+-- Table structure for promotion_policies

+-- ----------------------------

+DROP TABLE IF EXISTS `promotion_policies`;

+CREATE TABLE `promotion_policies`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `upload_ratio` double NULL DEFAULT NULL,

+  `download_ratio` double NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_promotion_policies_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKcjqpe1g15outfc0u6ajvpwxoe`(`slug` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of promotion_policies

+-- ----------------------------

+INSERT INTO `promotion_policies` VALUES (1, 'default', '默认策略', 1, 1);

+INSERT INTO `promotion_policies` VALUES (2, 'vip', '活跃用户策略', 1, 1.5);

+

+-- ----------------------------

+-- Table structure for qrtz_blob_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_blob_triggers`;

+CREATE TABLE `qrtz_blob_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `BLOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_blob_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_calendars

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_calendars`;

+CREATE TABLE `qrtz_calendars`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CALENDAR` blob NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_calendars

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_cron_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_cron_triggers`;

+CREATE TABLE `qrtz_cron_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_cron_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_fired_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_fired_triggers`;

+CREATE TABLE `qrtz_fired_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `FIRED_TIME` bigint NOT NULL,

+  `SCHED_TIME` bigint NOT NULL,

+  `PRIORITY` int NOT NULL,

+  `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,

+  INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_fired_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_job_details

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_job_details`;

+CREATE TABLE `qrtz_job_details`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,

+  INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_job_details

+-- ----------------------------

+INSERT INTO `qrtz_job_details` VALUES ('sapling_scheduler', 'peers_cleanup', 'DEFAULT', 'Peers Cleanup', 'com.github.example.pt.crontask.PeersCleanup', '1', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787000737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007800);

+

+-- ----------------------------

+-- Table structure for qrtz_locks

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_locks`;

+CREATE TABLE `qrtz_locks`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_locks

+-- ----------------------------

+INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'STATE_ACCESS');

+INSERT INTO `qrtz_locks` VALUES ('sapling_scheduler', 'TRIGGER_ACCESS');

+

+-- ----------------------------

+-- Table structure for qrtz_paused_trigger_grps

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;

+CREATE TABLE `qrtz_paused_trigger_grps`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_paused_trigger_grps

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_scheduler_state

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_scheduler_state`;

+CREATE TABLE `qrtz_scheduler_state`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `LAST_CHECKIN_TIME` bigint NOT NULL,

+  `CHECKIN_INTERVAL` bigint NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_scheduler_state

+-- ----------------------------

+INSERT INTO `qrtz_scheduler_state` VALUES ('sapling_scheduler', 'LAPTOP-V24K5A551749018489588', 1749018510182, 10000);

+

+-- ----------------------------

+-- Table structure for qrtz_simple_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_simple_triggers`;

+CREATE TABLE `qrtz_simple_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `REPEAT_COUNT` bigint NOT NULL,

+  `REPEAT_INTERVAL` bigint NOT NULL,

+  `TIMES_TRIGGERED` bigint NOT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_simple_triggers

+-- ----------------------------

+INSERT INTO `qrtz_simple_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', -1, 1800000, 1);

+

+-- ----------------------------

+-- Table structure for qrtz_simprop_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_simprop_triggers`;

+CREATE TABLE `qrtz_simprop_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `INT_PROP_1` int NULL DEFAULT NULL,

+  `INT_PROP_2` int NULL DEFAULT NULL,

+  `LONG_PROP_1` bigint NULL DEFAULT NULL,

+  `LONG_PROP_2` bigint NULL DEFAULT NULL,

+  `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,

+  `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,

+  `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_simprop_triggers

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for qrtz_triggers

+-- ----------------------------

+DROP TABLE IF EXISTS `qrtz_triggers`;

+CREATE TABLE `qrtz_triggers`  (

+  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL,

+  `PREV_FIRE_TIME` bigint NULL DEFAULT NULL,

+  `PRIORITY` int NULL DEFAULT NULL,

+  `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `START_TIME` bigint NOT NULL,

+  `END_TIME` bigint NULL DEFAULT NULL,

+  `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,

+  `MISFIRE_INSTR` smallint NULL DEFAULT NULL,

+  `JOB_DATA` blob NULL,

+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,

+  INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE,

+  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of qrtz_triggers

+-- ----------------------------

+INSERT INTO `qrtz_triggers` VALUES ('sapling_scheduler', '6da64b5bd2ee-37ffa82a-a598-485c-9718-40ee90c26bc4', 'DEFAULT', 'peers_cleanup', 'DEFAULT', NULL, 1749020288505, 1749018488505, 5, 'WAITING', 'SIMPLE', 1749018488505, 0, NULL, 0, '');

+

+-- ----------------------------

+-- Table structure for seedbox

+-- ----------------------------

+DROP TABLE IF EXISTS `seedbox`;

+CREATE TABLE `seedbox`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `download_multiplier_id` bigint NULL DEFAULT NULL,

+  `upload_multiplier_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UKecbehjtg3bfr4rmyixt1gcvfq`(`address` ASC) USING BTREE,

+  INDEX `FKq63tqhykgl96l4rkwy9widy5b`(`download_multiplier_id` ASC) USING BTREE,

+  INDEX `FK9xl51na3dn8k7ou8cyv7s1wrf`(`upload_multiplier_id` ASC) USING BTREE,

+  CONSTRAINT `FK9xl51na3dn8k7ou8cyv7s1wrf` FOREIGN KEY (`upload_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKq63tqhykgl96l4rkwy9widy5b` FOREIGN KEY (`download_multiplier_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of seedbox

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for settings

+-- ----------------------------

+DROP TABLE IF EXISTS `settings`;

+CREATE TABLE `settings`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `setting_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `setting_value` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_settings_setting_key`(`setting_key` ASC) USING BTREE,

+  UNIQUE INDEX `UKswd05dvj4ukvw5q135bpbbfae`(`setting_key` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Table structure for tags

+-- ----------------------------

+DROP TABLE IF EXISTS `tags`;

+CREATE TABLE `tags`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_tags_name`(`name` ASC) USING BTREE,

+  UNIQUE INDEX `UKt48xdq560gs3gap9g7jg36kgc`(`name` ASC) USING BTREE

+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of tags

+-- ----------------------------

+INSERT INTO `tags` VALUES (9, '[\"linux\"]');

+INSERT INTO `tags` VALUES (3, 'debian');

+INSERT INTO `tags` VALUES (1, 'linux');

+INSERT INTO `tags` VALUES (5, 'macos');

+INSERT INTO `tags` VALUES (2, 'ubuntu');

+INSERT INTO `tags` VALUES (4, 'windows');

+

+-- ----------------------------

+-- Table structure for thanks

+-- ----------------------------

+DROP TABLE IF EXISTS `thanks`;

+CREATE TABLE `thanks`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `torrent_id` bigint NULL DEFAULT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `UKrt9lg0h53brgpf9iat5hcmf6g`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  INDEX `FKp3kgh25tko48vq7x6u2w3dvpp`(`torrent_id` ASC) USING BTREE,

+  CONSTRAINT `FK2t90h21s5hyx6hynewsdlk46j` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `FKp3kgh25tko48vq7x6u2w3dvpp` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of thanks

+-- ----------------------------

+

+-- ----------------------------

+-- Table structure for torrents

+-- ----------------------------

+DROP TABLE IF EXISTS `torrents`;

+CREATE TABLE `torrents`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `info_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `user_id` bigint NULL DEFAULT NULL,

+  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `sub_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `size` bigint NOT NULL,

+  `created_at` timestamp NOT NULL,

+  `updated_at` timestamp NOT NULL,

+  `under_review` tinyint(1) NOT NULL,

+  `anonymous` tinyint(1) NOT NULL,

+  `category_id` bigint NULL DEFAULT NULL,

+  `promotion_policy_id` bigint NULL DEFAULT NULL,

+  `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_torrents_info_hash`(`info_hash` ASC) USING BTREE,

+  UNIQUE INDEX `UKhag2ej1vo8snvirb1lv4b8r4x`(`info_hash` ASC) USING BTREE,

+  INDEX `idx_torrents_title`(`title` ASC) USING BTREE,

+  INDEX `idx_torrents_sub_title`(`sub_title` ASC) USING BTREE,

+  INDEX `idx_torrents_promotion_policy_id`(`promotion_policy_id` ASC) USING BTREE,

+  INDEX `fk_torrents_user`(`user_id` ASC) USING BTREE,

+  INDEX `fk_torrents_category`(`category_id` ASC) USING BTREE,

+  INDEX `IDXdplkaapqslelnscuunfpm9eb6`(`title` ASC) USING BTREE,

+  INDEX `IDX6r5kh6i4awpdlytjmm06pk22k`(`sub_title` ASC) USING BTREE,

+  INDEX `IDXd2j3h8td7682cctkv5o77b33y`(`promotion_policy_id` ASC) USING BTREE,

+  CONSTRAINT `fk_torrents_category` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of torrents

+-- ----------------------------

+INSERT INTO `torrents` VALUES (7, '499e9c69e90b976c5c84542cf9b88fad1e12ef1c', 1, 'example torrent title', 'subtitle here', 66194, '2025-06-04 03:41:27', '2025-06-04 03:41:27', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (8, 'f45775564c88b5a2782a301d162e1d4811b0b6d5', 1, 'example torrent title', 'subtitle here', 231105, '2025-06-04 05:20:37', '2025-06-04 05:20:37', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (9, '8e10c9daa1b5fb18dc5b0e73988808ba958391fa', 1, 'example torrent title', 'subtitle here', 426155, '2025-06-04 06:03:49', '2025-06-04 06:03:49', 0, 0, 1, 1, '演示种子');

+INSERT INTO `torrents` VALUES (10, '1e3275f54ec074af2d99828311d4a8488eb7a487', 1, 'example torrent title', 'subtitle here', 13861694, '2025-06-04 06:10:23', '2025-06-04 06:10:23', 0, 0, 1, 1, '演示种子');

+

+-- ----------------------------

+-- Table structure for torrents_tag

+-- ----------------------------

+DROP TABLE IF EXISTS `torrents_tag`;

+CREATE TABLE `torrents_tag`  (

+  `torrent_id` bigint NOT NULL,

+  `tag_id` bigint NOT NULL,

+  PRIMARY KEY (`torrent_id`, `tag_id`) USING BTREE,

+  INDEX `fk_torrents_tag_tag`(`tag_id` ASC) USING BTREE,

+  CONSTRAINT `fk_torrents_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,

+  CONSTRAINT `fk_torrents_tag_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of torrents_tag

+-- ----------------------------

+INSERT INTO `torrents_tag` VALUES (7, 9);

+INSERT INTO `torrents_tag` VALUES (8, 9);

+INSERT INTO `torrents_tag` VALUES (9, 9);

+INSERT INTO `torrents_tag` VALUES (10, 9);

+

+-- ----------------------------

+-- Table structure for transfer_history

+-- ----------------------------

+DROP TABLE IF EXISTS `transfer_history`;

+CREATE TABLE `transfer_history`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `user_id` bigint NOT NULL,

+  `torrent_id` bigint NOT NULL,

+  `to_go` bigint NOT NULL,

+  `started_at` timestamp NOT NULL,

+  `updated_at` timestamp NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `actual_uploaded` bigint NOT NULL,

+  `actual_downloaded` bigint NOT NULL,

+  `upload_speed` bigint NOT NULL,

+  `download_speed` bigint NOT NULL,

+  `last_event` enum('started','completed','stopped','paused','unknown') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `have_complete_history` tinyint(1) NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_user_torrent`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  UNIQUE INDEX `UKrm5p4xv3rb2vm6psql5je94jh`(`user_id` ASC, `torrent_id` ASC) USING BTREE,

+  INDEX `fk_transfer_torrent`(`torrent_id` ASC) USING BTREE,

+  CONSTRAINT `fk_transfer_torrent` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

+  CONSTRAINT `fk_transfer_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of transfer_history

+-- ----------------------------

+INSERT INTO `transfer_history` VALUES (1, 1, 7, 66194, '2025-06-04 04:43:30', '2025-06-04 05:21:25', 0, 0, 0, 0, 0, 0, 'completed', 1);

+INSERT INTO `transfer_history` VALUES (2, 1, 10, 0, '2025-06-04 06:11:31', '2025-06-04 06:13:21', 27723388, 0, 0, 27723388, 0, 77874, 'started', 1);

+

+-- ----------------------------

+-- Table structure for user_groups

+-- ----------------------------

+DROP TABLE IF EXISTS `user_groups`;

+CREATE TABLE `user_groups`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `display_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `promotion_policy_id` bigint NULL DEFAULT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_user_groups_slug`(`slug` ASC) USING BTREE,

+  UNIQUE INDEX `UKkkje1jbmrkam1k7jbd39homw0`(`slug` ASC) USING BTREE,

+  INDEX `fk_user_groups_promotion_policy`(`promotion_policy_id` ASC) USING BTREE,

+  CONSTRAINT `fk_user_groups_promotion_policy` FOREIGN KEY (`promotion_policy_id`) REFERENCES `promotion_policies` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of user_groups

+-- ----------------------------

+INSERT INTO `user_groups` VALUES (1, 'default', '默认用户组', 1);

+INSERT INTO `user_groups` VALUES (2, 'vip', '活跃用户组', 2);

+

+-- ----------------------------

+-- Table structure for user_groups_permission_entities

+-- ----------------------------

+DROP TABLE IF EXISTS `user_groups_permission_entities`;

+CREATE TABLE `user_groups_permission_entities`  (

+  `user_group_id` bigint NOT NULL,

+  `permission_entities_id` bigint NOT NULL,

+  PRIMARY KEY (`user_group_id`, `permission_entities_id`) USING BTREE,

+  UNIQUE INDEX `UK_95j9uaq96bvd9ykn0sngywks6`(`permission_entities_id` ASC) USING BTREE,

+  CONSTRAINT `fk_ugpe_permission` FOREIGN KEY (`permission_entities_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,

+  CONSTRAINT `fk_ugpe_user_group` FOREIGN KEY (`user_group_id`) REFERENCES `user_groups` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT

+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of user_groups_permission_entities

+-- ----------------------------

+INSERT INTO `user_groups_permission_entities` VALUES (1, 1);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 2);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 3);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 4);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 5);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 6);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 7);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 8);

+INSERT INTO `user_groups_permission_entities` VALUES (1, 9);

+

+-- ----------------------------

+-- Table structure for users

+-- ----------------------------

+DROP TABLE IF EXISTS `users`;

+CREATE TABLE `users`  (

+  `id` bigint NOT NULL AUTO_INCREMENT,

+  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `group_id` bigint NULL DEFAULT NULL,

+  `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `create_at` timestamp NOT NULL,

+  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `custom_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `download_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `upload_bandwidth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `downloaded` bigint NOT NULL,

+  `uploaded` bigint NOT NULL,

+  `real_downloaded` bigint NOT NULL,

+  `real_uploaded` bigint NOT NULL,

+  `isp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `karma` decimal(19, 2) NOT NULL,

+  `invite_slot` int NOT NULL,

+  `seeding_time` bigint NOT NULL,

+  `personal_access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  `privacy_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

+  PRIMARY KEY (`id`) USING BTREE,

+  UNIQUE INDEX `uk_users_username`(`username` ASC) USING BTREE,

+  UNIQUE INDEX `uk_users_email`(`email` ASC) USING BTREE,

+  UNIQUE INDEX `uk_users_passkey`(`passkey` ASC) USING BTREE,

+  UNIQUE INDEX `UKr43af9ap4edm43mmtq01oddj6`(`username` ASC) USING BTREE,

+  UNIQUE INDEX `UK6dotkott2kjsp8vw4d0m25fb7`(`email` ASC) USING BTREE,

+  UNIQUE INDEX `UK402sx6cqgk66uwt7eyf54tmij`(`passkey` ASC) USING BTREE,

+  INDEX `fk_users_group`(`group_id` ASC) USING BTREE,

+  CONSTRAINT `fk_users_group` FOREIGN KEY (`group_id`) REFERENCES `user_groups` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

+

+-- ----------------------------

+-- Records of users

+-- ----------------------------

+INSERT INTO `users` VALUES (1, 'testuser@example.com', '$2a$06$JqvHpC94mnN23uwmZX0XHeuyFj3M22Ikw8VBZRopfrlWbPfA4KREu', 'testuser', 1, '47050e8f-f3fd-4a9c-a828-0e0de456691f', '2025-06-03 11:34:08', 'https://www.baidu.com/facivon.ico', '测试用户', '这个用户很懒,还没有个性签名', 'zh-CN', '100mbps', '100mbps', 0, 27723388, 27723388, 0, '未知', 0.00, 0, 30790068, '948c9146-ff5f-4ad6-8ba5-d32e1209cafd', '0');

+

+SET FOREIGN_KEY_CHECKS = 1;

+

+-- ----------------------------

+-- Records of chat_messages

+-- ----------------------------

+DROP TABLE IF EXISTS `chat_messages`;

+CREATE TABLE chat_messages (

+    id BIGINT AUTO_INCREMENT PRIMARY KEY,

+    room_id BIGINT NOT NULL,

+    user_id BIGINT NOT NULL,

+    content TEXT NOT NULL,

+    created_at DATETIME NOT NULL

+);

+

diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index e69de29..7af9fb2 100644
--- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,150 @@
+com\github\example\pt\service\BlacklistClientService.class
+com\github\example\pt\repository\PromotionPolicyRepository.class
+com\github\example\pt\service\AnnouncePerformanceMonitorService.class
+com\github\example\pt\repository\TorrentRepository.class
+com\github\example\pt\service\SettingService.class
+com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.class
+com\github\example\pt\entity\TransferHistory.class
+com\github\example\pt\exception\BrowserReadableAnnounceException.class
+com\github\example\pt\entity\UserGroup.class
+com\github\example\pt\controller\dto\response\PromotionResponseDTO.class
+com\github\example\pt\repository\TransferHistoryRepository.class
+com\github\example\pt\controller\DebugController$DebugTorrent.class
+com\github\example\pt\util\ClassUtil.class
+com\github\example\pt\util\TorrentParser.class
+com\github\example\pt\repository\ChatMessageRepository.class
+com\github\example\pt\controller\announce\AnnounceController.class
+com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.class
+com\github\example\pt\entity\Peer.class
+com\github\example\pt\controller\dto\response\UserGroupResponseDTO.class
+com\github\example\pt\service\ExamService.class
+com\github\example\pt\exception\RESTException.class
+com\github\example\pt\exception\InvalidAnnounceException.class
+com\github\example\pt\redisrepository\RedisLoginAttemptRepository.class
+com\github\example\pt\controller\torrent\TorrentController.class
+com\github\example\pt\controller\chat\ChatHistoryController.class
+com\github\example\pt\entity\SettingEntity.class
+com\github\example\pt\exception\APIErrorCode.class
+com\github\example\pt\repository\TagRepository.class
+com\github\example\pt\controller\dto\response\UserBasicResponseDTO.class
+com\github\example\pt\type\PrivacyLevel.class
+com\github\example\pt\repository\SettingRepository.class
+com\github\example\pt\listener\SaTokenEventListener.class
+com\github\example\pt\util\URLEncodeUtil.class
+com\github\example\pt\entity\Exam.class
+com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.class
+com\github\example\pt\type\GuestAccessBlocker.class
+com\github\example\pt\exception\RetryableAnnounceException.class
+com\github\example\pt\config\WebSocketConfig.class
+com\github\example\pt\repository\ExamPlanRepository.class
+com\github\example\pt\config\ApiPrinter.class
+com\github\example\pt\entity\ExamPlan.class
+com\github\example\pt\service\AuthenticationService.class
+com\github\example\pt\controller\dto\response\ScrapeContainerDTO.class
+com\github\example\pt\service\PromotionService.class
+com\github\example\pt\config\SecurityConfig.class
+com\github\example\pt\type\LoginType.class
+com\github\example\pt\service\TagService.class
+com\github\example\pt\ptApplication.class
+com\github\example\pt\controller\dto\response\UserTinyResponseDTO.class
+com\github\example\pt\util\BencodeUtil.class
+com\github\example\pt\autoconfig\SafeHTMLConfig.class
+com\github\example\pt\repository\LoginHistoryRepository.class
+com\github\example\pt\util\IPUtil.class
+com\github\example\pt\controller\category\CategoryController.class
+com\github\example\pt\exception\FixedAnnounceException.class
+com\github\example\pt\util\SafeUUID.class
+com\github\example\pt\service\CategoryService.class
+com\github\example\pt\util\PackUtil.class
+com\github\example\pt\controller\chat\dto\ChatMessageDTO.class
+com\github\example\pt\config\SaTokenHandshakeInterceptor.class
+com\github\example\pt\repository\UserRepository.class
+com\github\example\pt\service\PermissionService.class
+com\github\example\pt\type\AnnounceEventTypeConverter.class
+com\github\example\pt\util\InfoHashUtil.class
+com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.class
+com\github\example\pt\exception\TorrentException.class
+com\github\example\pt\repository\CategoryRepository.class
+com\github\example\pt\exception\InvalidTorrentVersionException.class
+com\github\example\pt\repository\UserGroupRepository.class
+com\github\example\pt\controller\promotion\PromotionController.class
+com\github\example\pt\service\ExamPlanService.class
+com\github\example\pt\controller\DebugController.class
+com\github\example\pt\type\IPFormatRequirement.class
+com\github\example\pt\controller\auth\AuthController.class
+com\github\example\pt\autoconfig\QuartzConfig$AutowiringSpringBeanJobFactory.class
+com\github\example\pt\controller\dto\response\UserSessionResponseDTO.class
+com\github\example\pt\entity\ChatMessage.class
+com\github\example\pt\service\LoginHistoryService.class
+com\github\example\pt\util\ExecutorUtil.class
+com\github\example\pt\service\AnnounceService.class
+com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.class
+com\github\example\pt\exception\InvalidTorrentPiecesException.class
+com\github\example\pt\service\UserGroupService.class
+com\github\example\pt\util\PasswordHash.class
+com\github\example\pt\service\ThanksService.class
+com\github\example\pt\controller\feed\FeedController.class
+com\github\example\pt\util\MiscUtil.class
+com\github\example\pt\exception\InvalidTorrentVerifyException.class
+com\github\example\pt\service\TransferHistoryService$PeerStatus.class
+com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.class
+com\github\example\pt\exception\InvalidTorrentFileException.class
+com\github\example\pt\repository\PermissionRepository.class
+com\github\example\pt\controller\advice\GlobalControllerAdvice.class
+com\github\example\pt\entity\Category.class
+com\github\example\pt\repository\ExamRepository.class
+com\github\example\pt\controller\torrent\form\TorrentUploadForm.class
+com\github\example\pt\exception\EmptyTorrentFileException.class
+com\github\example\pt\service\PeerService.class
+com\github\example\pt\util\ByteUtil.class
+com\github\example\pt\entity\User.class
+com\github\example\pt\exception\AnnounceException.class
+com\github\example\pt\repository\PeersRepository.class
+com\github\example\pt\autoconfig\JetcacheConfig.class
+com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.class
+com\github\example\pt\util\RandomUtil.class
+com\github\example\pt\type\AnnounceEventType.class
+com\github\example\pt\service\UserService.class
+com\github\example\pt\objects\ResponsePojo.class
+com\github\example\pt\autoconfig\JacksonConfig.class
+com\github\example\pt\exception\TrackerException.class
+com\github\example\pt\util\IpValidator.class
+com\github\example\pt\entity\Permission.class
+com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.class
+com\github\example\pt\entity\LoginHistory.class
+com\github\example\pt\service\AnnounceService$AnnounceTask.class
+com\github\example\pt\service\TorrentService.class
+com\github\example\pt\entity\Thanks.class
+com\github\example\pt\config\MailConfig.class
+com\github\example\pt\autoconfig\WorkDirectoryConfig.class
+com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.class
+com\github\example\pt\autoconfig\RedisConfig.class
+com\github\example\pt\util\BooleanUtil.class
+com\github\example\pt\controller\DebugController$DebugPeer.class
+com\github\example\pt\exception\APIGenericException.class
+com\github\example\pt\exception\BadConfigException.class
+com\github\example\pt\type\GuestAccessRequirement.class
+com\github\example\pt\config\TrackerConfig.class
+com\github\example\pt\controller\announce\AnnounceController$PeerResult.class
+com\github\example\pt\entity\SeedBox.class
+com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.class
+com\github\example\pt\service\TransferHistoryService.class
+com\github\example\pt\exception\AnnounceBusyException.class
+com\github\example\pt\crontask\PeersCleanup.class
+com\github\example\pt\websocket\ChatRawWebSocketHandler.class
+com\github\example\pt\controller\dto\response\CategoryResponseDTO.class
+com\github\example\pt\entity\Tag.class
+com\github\example\pt\repository\ThanksRepository.class
+com\github\example\pt\controller\dto\response\TransferHistoryDTO.class
+com\github\example\pt\util\HibernateSessionUtil.class
+com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.class
+com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.class
+com\github\example\pt\entity\PromotionPolicy.class
+com\github\example\pt\redisentity\RedisLoginAttempt.class
+com\github\example\pt\autoconfig\QuartzConfig.class
+com\github\example\pt\entity\Torrent.class
+com\github\example\pt\controller\dto\response\UserResponseDTO.class
+com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.class
+com\github\example\pt\config\SiteBasicConfig.class
+com\github\example\pt\service\SaTokenPermImpl.class
+com\github\example\pt\util\GsonUtil.class
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index 975c5c3..d000526 100644
--- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1,145 +1,144 @@
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnouncePerformanceMonitorService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ExecutorUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceBusyException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SaTokenConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamPlanService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventType.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SecurityConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PermissionRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\User.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\MiscUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\QuartzConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ChatMessage.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserGroupService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\InfoHashUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisentity\RedisLoginAttempt.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ClassUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\RandomUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\TorrentController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\FixedAnnounceException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\DebugController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\PromotionPolicy.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\announce\AnnounceController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\CategoryResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentPiecesException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TorrentService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\WorkDirectoryConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SettingEntity.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\LoginHistoryService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PromotionService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\URLEncodeUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ChatMessageRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\AuthController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamPlanRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PermissionService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\listener\SaTokenEventListener.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\EmptyTorrentFileException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Torrent.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SafeHTMLConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\feed\FeedController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Category.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IPUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Peer.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\ApiPrinter.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Permission.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ByteUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PromotionResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Exam.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TagRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PackUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Tag.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserTinyResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\CategoryService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\MailConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TransferHistoryRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIErrorCode.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BrowserReadableAnnounceException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JetcacheConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BooleanUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TransferHistory.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TorrentException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ThanksService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\dto\ChatMessageDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BencodeUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserBasicResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TrackerException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TorrentRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SiteBasicConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\HibernateSessionUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\GsonUtil.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PasswordHash.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\websocket\ChatRawWebSocketHandler.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventTypeConverter.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\ChatHistoryController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TagService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessBlocker.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\form\TorrentUploadForm.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\LoginHistory.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\CategoryRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SeedBox.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ThanksRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\SafeUUID.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\TrackerConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TransferHistoryDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AuthenticationService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\advice\GlobalControllerAdvice.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\RedisConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\UserGroup.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ExamPlan.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIGenericException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TransferHistoryService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserGroupResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\LoginHistoryRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JacksonConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\SettingRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\crontask\PeersCleanup.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\ptApplication.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisrepository\RedisLoginAttemptRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\promotion\PromotionController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentFileException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SettingService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PeersRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\WebSocketConfig.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\ScrapeContainerDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVerifyException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessRequirement.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PromotionPolicyRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\objects\ResponsePojo.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVersionException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RESTException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SaTokenPermImpl.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\PrivacyLevel.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserGroupRepository.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IpValidator.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SaTokenHandshakeInterceptor.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnounceService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BadConfigException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserSessionResponseDTO.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\BlacklistClientService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\TorrentParser.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\category\CategoryController.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\IPFormatRequirement.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Thanks.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RetryableAnnounceException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidAnnounceException.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PeerService.java
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\LoginType.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\LoginHistoryService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Torrent.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ChatMessage.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ClassUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Thanks.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ExecutorUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\WebSocketConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\dto\ChatMessageDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\MiscUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SettingService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserSessionResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BadConfigException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\QuartzConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\SaTokenPermImpl.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TransferHistoryService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentPiecesException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ChatMessageRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentFileException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceBusyException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\EmptyTorrentFileException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IPUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisentity\RedisLoginAttempt.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Category.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Peer.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\ApiPrinter.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\PrivacyLevel.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TorrentException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SaTokenHandshakeInterceptor.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserBasicResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\feed\FeedController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PromotionService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\MailConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\LoginHistory.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\BrowserReadableAnnounceException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVersionException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PermissionService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidTorrentVerifyException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessBlocker.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentSearchResultResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\IpValidator.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\PromotionPolicy.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\SafeUUID.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\form\TorrentUploadForm.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIErrorCode.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventType.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PermissionRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\chat\ChatHistoryController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\LoginType.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ExamPlanService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Permission.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\TrackerException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TransferHistoryRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\UserGroup.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\redisrepository\RedisLoginAttemptRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\CategoryService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\InfoHashUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\URLEncodeUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\objects\ResponsePojo.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\crontask\PeersCleanup.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\announce\AnnounceController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TransferHistoryDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\websocket\ChatRawWebSocketHandler.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentBasicResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\AnnounceException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\LoginRequestDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\ThanksService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\AuthController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\UserGroupService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\BlacklistClientService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PackUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamPlanRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\ByteUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\WorkDirectoryConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AuthenticationService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\TorrentController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\SearchTorrentRequestDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\LoginStatusResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\User.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RetryableAnnounceException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\PasswordHash.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PeerInfoResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\TrackerConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SeedBox.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\CategoryResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\AnnounceEventTypeConverter.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\TorrentParser.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\HibernateSessionUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SiteBasicConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Exam.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\TransferHistory.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\CategoryRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TorrentRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\auth\dto\request\RegisterRequestDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\category\CategoryController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\SettingEntity.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\TorrentScrapeRequestDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\GuestAccessRequirement.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\edazdarevic\commons\net\CIDRUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\GsonUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\TagRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentScrapeResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\FixedAnnounceException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TorrentService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\APIGenericException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\ExamPlan.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\ptApplication.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ThanksRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\TorrentInfoResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\listener\SaTokenEventListener.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\InvalidAnnounceException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\type\IPFormatRequirement.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserTinyResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\DebugController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\PromotionResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JacksonConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\ExamRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BooleanUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnouncePerformanceMonitorService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\exception\RESTException.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\advice\GlobalControllerAdvice.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\JetcacheConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\promotion\PromotionController.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\RandomUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\config\SecurityConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\ScrapeContainerDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\response\TorrentUploadSuccessResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\RedisConfig.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\util\BencodeUtil.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PeersRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\entity\Tag.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\dto\response\UserGroupResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\PeerService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\UserGroupRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\LoginHistoryRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\controller\torrent\dto\request\ThanksResponseDTO.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\SettingRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\AnnounceService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\service\TagService.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\repository\PromotionPolicyRepository.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\main\java\com\github\example\pt\autoconfig\SafeHTMLConfig.java
diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
index f95662e..e72d29d 100644
--- a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
+++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -1 +1 @@
-E:\desktop\EX\0606B\PT_Sixth_Backend\src\test\java\com\github\example\pt\ptApplicationTests.java
+C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\src\test\java\com\github\example\pt\ptApplicationTests.java
diff --git a/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump b/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump
new file mode 100644
index 0000000..4636bb9
--- /dev/null
+++ b/target/surefire-reports/2025-06-06T13-53-41_147-jvmRun1.dump
@@ -0,0 +1,14 @@
+# Created at 2025-06-06T13:53:42.822

+System.exit() or native command error interrupted process checker.

+java.lang.IllegalStateException: Cannot use PPID 5704 process information. Going to use NOOP events.

+	at org.apache.maven.surefire.booter.PpidChecker.checkProcessInfo(PpidChecker.java:155)

+	at org.apache.maven.surefire.booter.PpidChecker.isProcessAlive(PpidChecker.java:116)

+	at org.apache.maven.surefire.booter.ForkedBooter$2.run(ForkedBooter.java:214)

+	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)

+	at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)

+	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)

+	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)

+	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)

+	at java.base/java.lang.Thread.run(Thread.java:840)

+

+

diff --git a/target/surefire-reports/TEST-com.github.example.pt.ptApplicationTests.xml b/target/surefire-reports/TEST-com.github.example.pt.ptApplicationTests.xml
index 1c99dac..bd6d590 100644
--- a/target/surefire-reports/TEST-com.github.example.pt.ptApplicationTests.xml
+++ b/target/surefire-reports/TEST-com.github.example.pt.ptApplicationTests.xml
@@ -1,63 +1,61 @@
 <?xml version="1.0" encoding="UTF-8"?>

-<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="com.github.example.pt.ptApplicationTests" time="0.019" tests="1" errors="0" skipped="0" failures="0">

+<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="com.github.example.pt.ptApplicationTests" time="11.505" tests="1" errors="0" skipped="0" failures="0">

   <properties>

     <property name="java.specification.version" value="17"/>

     <property name="sun.cpu.isalist" value="amd64"/>

     <property name="sun.jnu.encoding" value="GBK"/>

-    <property name="java.class.path" value="E:\desktop\EX\0606B\PT_Sixth_Backend\target\test-classes;E:\desktop\EX\0606B\PT_Sixth_Backend\target\classes;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-cache\3.0.2\spring-boot-starter-cache-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter\3.0.2\spring-boot-starter-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.0.2\spring-boot-starter-logging-3.0.2.jar;C:\Users\张家豪\.m2\repository\ch\qos\logback\logback-classic\1.4.5\logback-classic-1.4.5.jar;C:\Users\张家豪\.m2\repository\ch\qos\logback\logback-core\1.4.5\logback-core-1.4.5.jar;C:\Users\张家豪\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.19.0\log4j-to-slf4j-2.19.0.jar;C:\Users\张家豪\.m2\repository\org\apache\logging\log4j\log4j-api\2.19.0\log4j-api-2.19.0.jar;C:\Users\张家豪\.m2\repository\org\slf4j\jul-to-slf4j\2.0.6\jul-to-slf4j-2.0.6.jar;C:\Users\张家豪\.m2\repository\org\yaml\snakeyaml\1.33\snakeyaml-1.33.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-context-support\6.0.4\spring-context-support-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-beans\6.0.4\spring-beans-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-context\6.0.4\spring-context-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\3.0.2\spring-boot-starter-data-redis-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-redis\3.0.1\spring-data-redis-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-keyvalue\3.0.1\spring-data-keyvalue-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-oxm\6.0.4\spring-oxm-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-aop\6.0.4\spring-aop-6.0.4.jar;C:\Users\张家豪\.m2\repository\io\lettuce\lettuce-core\6.2.2.RELEASE\lettuce-core-6.2.2.RELEASE.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\projectreactor\reactor-core\3.5.2\reactor-core-3.5.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\3.0.2\spring-boot-starter-data-jpa-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.0.2\spring-boot-starter-aop-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\aspectj\aspectjweaver\1.9.19\aspectjweaver-1.9.19.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.0.2\spring-boot-starter-jdbc-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-jdbc\6.0.4\spring-jdbc-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\hibernate\orm\hibernate-core\6.1.6.Final\hibernate-core-6.1.6.Final.jar;C:\Users\张家豪\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.1.0\jakarta.persistence-api-3.1.0.jar;C:\Users\张家豪\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\张家豪\.m2\repository\org\jboss\logging\jboss-logging\3.5.0.Final\jboss-logging-3.5.0.Final.jar;C:\Users\张家豪\.m2\repository\org\hibernate\common\hibernate-commons-annotations\6.0.2.Final\hibernate-commons-annotations-6.0.2.Final.jar;C:\Users\张家豪\.m2\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\张家豪\.m2\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.1\jaxb-runtime-4.0.1.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.1\jaxb-core-4.0.1.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\txw2\4.0.1\txw2-4.0.1.jar;C:\Users\张家豪\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.1\istack-commons-runtime-4.1.1.jar;C:\Users\张家豪\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.0\jakarta.inject-api-2.0.0.jar;C:\Users\张家豪\.m2\repository\org\antlr\antlr4-runtime\4.10.1\antlr4-runtime-4.10.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-jpa\3.0.1\spring-data-jpa-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-commons\3.0.1\spring-data-commons-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-orm\6.0.4\spring-orm-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-aspects\6.0.4\spring-aspects-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-mail\3.0.2\spring-boot-starter-mail-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\eclipse\angus\jakarta.mail\1.0.0\jakarta.mail-1.0.0.jar;C:\Users\张家豪\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.1\jakarta.activation-api-2.1.1.jar;C:\Users\张家豪\.m2\repository\org\eclipse\angus\angus-activation\1.0.0\angus-activation-1.0.0.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-quartz\3.0.2\spring-boot-starter-quartz-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-tx\6.0.4\spring-tx-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\张家豪\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.0.2\spring-boot-starter-validation-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.5\tomcat-embed-el-10.1.5.jar;C:\Users\张家豪\.m2\repository\org\hibernate\validator\hibernate-validator\8.0.0.Final\hibernate-validator-8.0.0.Final.jar;C:\Users\张家豪\.m2\repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-spring-boot3-starter\1.34.0\sa-token-spring-boot3-starter-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-jakarta-servlet\1.34.0\sa-token-jakarta-servlet-1.34.0.jar;C:\Users\张家豪\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.0.0\jakarta.servlet-api-6.0.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-spring-boot-autoconfig\1.34.0\sa-token-spring-boot-autoconfig-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-dao-redis-jackson\1.34.0\sa-token-dao-redis-jackson-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-core\1.34.0\sa-token-core-1.34.0.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.0.2\spring-boot-starter-web-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-web\6.0.4\spring-web-6.0.4.jar;C:\Users\张家豪\.m2\repository\io\micrometer\micrometer-observation\1.10.3\micrometer-observation-1.10.3.jar;C:\Users\张家豪\.m2\repository\io\micrometer\micrometer-commons\1.10.3\micrometer-commons-1.10.3.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-webmvc\6.0.4\spring-webmvc-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-expression\6.0.4\spring-expression-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.0.2\spring-boot-starter-json-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.14.1\jackson-databind-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.14.1\jackson-datatype-jdk8-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.14.1\jackson-module-parameter-names-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.0.2\spring-boot-starter-tomcat-3.0.2.jar;C:\Users\张家豪\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.5\tomcat-embed-core-10.1.5.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.5\tomcat-embed-websocket-10.1.5.jar;C:\Users\张家豪\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\张家豪\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\张家豪\.m2\repository\commons-validator\commons-validator\1.7\commons-validator-1.7.jar;C:\Users\张家豪\.m2\repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;C:\Users\张家豪\.m2\repository\commons-digester\commons-digester\2.1\commons-digester-2.1.jar;C:\Users\张家豪\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\张家豪\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-text\1.10.0\commons-text-1.10.0.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-compress\1.22\commons-compress-1.22.jar;C:\Users\张家豪\.m2\repository\org\jetbrains\annotations\23.1.0\annotations-23.1.0.jar;C:\Users\张家豪\.m2\repository\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;C:\Users\张家豪\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\张家豪\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\张家豪\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\张家豪\.m2\repository\com\google\errorprone\error_prone_annotations\2.11.0\error_prone_annotations-2.11.0.jar;C:\Users\张家豪\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\张家豪\.m2\repository\at\favre\lib\bcrypt\0.9.0\bcrypt-0.9.0.jar;C:\Users\张家豪\.m2\repository\at\favre\lib\bytes\1.3.0\bytes-1.3.0.jar;C:\Users\张家豪\.m2\repository\com\konghq\unirest-java\3.14.1\unirest-java-3.14.1.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\Users\张家豪\.m2\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;C:\Users\张家豪\.m2\repository\me\tongfei\progressbar\0.9.5\progressbar-0.9.5.jar;C:\Users\张家豪\.m2\repository\org\jline\jline\3.21.0\jline-3.21.0.jar;C:\Users\张家豪\.m2\repository\com\dampcake\bencode\1.4\bencode-1.4.jar;C:\Users\张家豪\.m2\repository\com\mysql\mysql-connector-j\8.0.32\mysql-connector-j-8.0.32.jar;C:\Users\张家豪\.m2\repository\com\h2database\h2\2.1.214\h2-2.1.214.jar;C:\Users\张家豪\.m2\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-devtools\3.0.2\spring-boot-devtools-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot\3.0.2\spring-boot-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.0.2\spring-boot-autoconfigure-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-test\3.0.2\spring-boot-starter-test-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-test\3.0.2\spring-boot-test-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\3.0.2\spring-boot-test-autoconfigure-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;C:\Users\张家豪\.m2\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;C:\Users\张家豪\.m2\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;C:\Users\张家豪\.m2\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;C:\Users\张家豪\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.0\jakarta.xml.bind-api-4.0.0.jar;C:\Users\张家豪\.m2\repository\org\assertj\assertj-core\3.23.1\assertj-core-3.23.1.jar;C:\Users\张家豪\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter\5.9.2\junit-jupiter-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\张家豪\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\张家豪\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.9.2\junit-jupiter-params-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;C:\Users\张家豪\.m2\repository\org\mockito\mockito-core\4.8.1\mockito-core-4.8.1.jar;C:\Users\张家豪\.m2\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;C:\Users\张家豪\.m2\repository\org\objenesis\objenesis\3.2\objenesis-3.2.jar;C:\Users\张家豪\.m2\repository\org\mockito\mockito-junit-jupiter\4.8.1\mockito-junit-jupiter-4.8.1.jar;C:\Users\张家豪\.m2\repository\org\skyscreamer\jsonassert\1.5.1\jsonassert-1.5.1.jar;C:\Users\张家豪\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-core\6.0.4\spring-core-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-jcl\6.0.4\spring-jcl-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-test\6.0.4\spring-test-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\xmlunit\xmlunit-core\2.9.1\xmlunit-core-2.9.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.14.1\jackson-datatype-jsr310-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.14.1\jackson-annotations-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.14.1\jackson-core-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\redisson\redisson-hibernate-6\3.19.3\redisson-hibernate-6-3.19.3.jar;C:\Users\张家豪\.m2\repository\org\redisson\redisson\3.19.3\redisson-3.19.3.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;C:\Users\张家豪\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\张家豪\.m2\repository\io\reactivex\rxjava3\rxjava\3.1.6\rxjava-3.1.6.jar;C:\Users\张家豪\.m2\repository\org\jboss\marshalling\jboss-marshalling\2.0.11.Final\jboss-marshalling-2.0.11.Final.jar;C:\Users\张家豪\.m2\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.11.Final\jboss-marshalling-river-2.0.11.Final.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\kryo\5.4.0\kryo-5.4.0.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.14.1\jackson-dataformat-yaml-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;C:\Users\张家豪\.m2\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;C:\Users\张家豪\.m2\repository\com\googlecode\owasp-java-html-sanitizer\owasp-java-html-sanitizer\20220608.1\owasp-java-html-sanitizer-20220608.1.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\Users\张家豪\.m2\repository\com\rometools\rome\1.18.0\rome-1.18.0.jar;C:\Users\张家豪\.m2\repository\com\rometools\rome-utils\1.18.0\rome-utils-1.18.0.jar;C:\Users\张家豪\.m2\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;C:\Users\张家豪\.m2\repository\org\slf4j\slf4j-api\2.0.6\slf4j-api-2.0.6.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-starter-redis\2.7.3\jetcache-starter-redis-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-autoconfigure\2.7.3\jetcache-autoconfigure-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-anno\2.7.3\jetcache-anno-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-core\2.7.3\jetcache-core-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-anno-api\2.7.3\jetcache-anno-api-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.21\fastjson2-2.0.21.jar;C:\Users\张家豪\.m2\repository\com\github\ben-manes\caffeine\caffeine\3.1.2\caffeine-3.1.2.jar;C:\Users\张家豪\.m2\repository\javax\annotation\javax.annotation-api\1.3.1\javax.annotation-api-1.3.1.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-redis\2.7.3\jetcache-redis-2.7.3.jar;C:\Users\张家豪\.m2\repository\redis\clients\jedis\4.3.1\jedis-4.3.1.jar;C:\Users\张家豪\.m2\repository\org\json\json\20220320\json-20220320.jar;C:\Users\张家豪\.m2\repository\org\greenrobot\eventbus-java\3.3.1\eventbus-java-3.3.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\3.0.2\spring-boot-starter-websocket-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-messaging\6.0.4\spring-messaging-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-websocket\6.0.4\spring-websocket-6.0.4.jar;"/>

-    <property name="java.vm.vendor" value="Microsoft"/>

+    <property name="java.class.path" value="C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\target\test-classes;C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\target\classes;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-cache\3.0.2\spring-boot-starter-cache-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter\3.0.2\spring-boot-starter-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.0.2\spring-boot-starter-logging-3.0.2.jar;C:\Users\75001\.m2\repository\ch\qos\logback\logback-classic\1.4.5\logback-classic-1.4.5.jar;C:\Users\75001\.m2\repository\ch\qos\logback\logback-core\1.4.5\logback-core-1.4.5.jar;C:\Users\75001\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.19.0\log4j-to-slf4j-2.19.0.jar;C:\Users\75001\.m2\repository\org\apache\logging\log4j\log4j-api\2.19.0\log4j-api-2.19.0.jar;C:\Users\75001\.m2\repository\org\slf4j\jul-to-slf4j\2.0.6\jul-to-slf4j-2.0.6.jar;C:\Users\75001\.m2\repository\org\yaml\snakeyaml\1.33\snakeyaml-1.33.jar;C:\Users\75001\.m2\repository\org\springframework\spring-context-support\6.0.4\spring-context-support-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-beans\6.0.4\spring-beans-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-context\6.0.4\spring-context-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\3.0.2\spring-boot-starter-data-redis-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-redis\3.0.1\spring-data-redis-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-keyvalue\3.0.1\spring-data-keyvalue-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-oxm\6.0.4\spring-oxm-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-aop\6.0.4\spring-aop-6.0.4.jar;C:\Users\75001\.m2\repository\io\lettuce\lettuce-core\6.2.2.RELEASE\lettuce-core-6.2.2.RELEASE.jar;C:\Users\75001\.m2\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\projectreactor\reactor-core\3.5.2\reactor-core-3.5.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\3.0.2\spring-boot-starter-data-jpa-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.0.2\spring-boot-starter-aop-3.0.2.jar;C:\Users\75001\.m2\repository\org\aspectj\aspectjweaver\1.9.19\aspectjweaver-1.9.19.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.0.2\spring-boot-starter-jdbc-3.0.2.jar;C:\Users\75001\.m2\repository\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-jdbc\6.0.4\spring-jdbc-6.0.4.jar;C:\Users\75001\.m2\repository\org\hibernate\orm\hibernate-core\6.1.6.Final\hibernate-core-6.1.6.Final.jar;C:\Users\75001\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.1.0\jakarta.persistence-api-3.1.0.jar;C:\Users\75001\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\75001\.m2\repository\org\jboss\logging\jboss-logging\3.5.0.Final\jboss-logging-3.5.0.Final.jar;C:\Users\75001\.m2\repository\org\hibernate\common\hibernate-commons-annotations\6.0.2.Final\hibernate-commons-annotations-6.0.2.Final.jar;C:\Users\75001\.m2\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;C:\Users\75001\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\75001\.m2\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.1\jaxb-runtime-4.0.1.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.1\jaxb-core-4.0.1.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\txw2\4.0.1\txw2-4.0.1.jar;C:\Users\75001\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.1\istack-commons-runtime-4.1.1.jar;C:\Users\75001\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.0\jakarta.inject-api-2.0.0.jar;C:\Users\75001\.m2\repository\org\antlr\antlr4-runtime\4.10.1\antlr4-runtime-4.10.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-jpa\3.0.1\spring-data-jpa-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-commons\3.0.1\spring-data-commons-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-orm\6.0.4\spring-orm-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-aspects\6.0.4\spring-aspects-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-mail\3.0.2\spring-boot-starter-mail-3.0.2.jar;C:\Users\75001\.m2\repository\org\eclipse\angus\jakarta.mail\1.0.0\jakarta.mail-1.0.0.jar;C:\Users\75001\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.1\jakarta.activation-api-2.1.1.jar;C:\Users\75001\.m2\repository\org\eclipse\angus\angus-activation\1.0.0\angus-activation-1.0.0.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-quartz\3.0.2\spring-boot-starter-quartz-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-tx\6.0.4\spring-tx-6.0.4.jar;C:\Users\75001\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\75001\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.0.2\spring-boot-starter-validation-3.0.2.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.5\tomcat-embed-el-10.1.5.jar;C:\Users\75001\.m2\repository\org\hibernate\validator\hibernate-validator\8.0.0.Final\hibernate-validator-8.0.0.Final.jar;C:\Users\75001\.m2\repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-spring-boot3-starter\1.34.0\sa-token-spring-boot3-starter-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-jakarta-servlet\1.34.0\sa-token-jakarta-servlet-1.34.0.jar;C:\Users\75001\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.0.0\jakarta.servlet-api-6.0.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-spring-boot-autoconfig\1.34.0\sa-token-spring-boot-autoconfig-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-dao-redis-jackson\1.34.0\sa-token-dao-redis-jackson-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-core\1.34.0\sa-token-core-1.34.0.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.0.2\spring-boot-starter-web-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-web\6.0.4\spring-web-6.0.4.jar;C:\Users\75001\.m2\repository\io\micrometer\micrometer-observation\1.10.3\micrometer-observation-1.10.3.jar;C:\Users\75001\.m2\repository\io\micrometer\micrometer-commons\1.10.3\micrometer-commons-1.10.3.jar;C:\Users\75001\.m2\repository\org\springframework\spring-webmvc\6.0.4\spring-webmvc-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-expression\6.0.4\spring-expression-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.0.2\spring-boot-starter-json-3.0.2.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.14.1\jackson-databind-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.14.1\jackson-datatype-jdk8-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.14.1\jackson-module-parameter-names-2.14.1.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.0.2\spring-boot-starter-tomcat-3.0.2.jar;C:\Users\75001\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.5\tomcat-embed-core-10.1.5.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.5\tomcat-embed-websocket-10.1.5.jar;C:\Users\75001\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\75001\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\75001\.m2\repository\commons-validator\commons-validator\1.7\commons-validator-1.7.jar;C:\Users\75001\.m2\repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;C:\Users\75001\.m2\repository\commons-digester\commons-digester\2.1\commons-digester-2.1.jar;C:\Users\75001\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\75001\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-text\1.10.0\commons-text-1.10.0.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-compress\1.22\commons-compress-1.22.jar;C:\Users\75001\.m2\repository\org\jetbrains\annotations\23.1.0\annotations-23.1.0.jar;C:\Users\75001\.m2\repository\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;C:\Users\75001\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\75001\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\75001\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\75001\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\75001\.m2\repository\com\google\errorprone\error_prone_annotations\2.11.0\error_prone_annotations-2.11.0.jar;C:\Users\75001\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\75001\.m2\repository\at\favre\lib\bcrypt\0.9.0\bcrypt-0.9.0.jar;C:\Users\75001\.m2\repository\at\favre\lib\bytes\1.3.0\bytes-1.3.0.jar;C:\Users\75001\.m2\repository\com\konghq\unirest-java\3.14.1\unirest-java-3.14.1.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\Users\75001\.m2\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;C:\Users\75001\.m2\repository\me\tongfei\progressbar\0.9.5\progressbar-0.9.5.jar;C:\Users\75001\.m2\repository\org\jline\jline\3.21.0\jline-3.21.0.jar;C:\Users\75001\.m2\repository\com\dampcake\bencode\1.4\bencode-1.4.jar;C:\Users\75001\.m2\repository\com\mysql\mysql-connector-j\8.0.32\mysql-connector-j-8.0.32.jar;C:\Users\75001\.m2\repository\com\h2database\h2\2.1.214\h2-2.1.214.jar;C:\Users\75001\.m2\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-devtools\3.0.2\spring-boot-devtools-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot\3.0.2\spring-boot-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.0.2\spring-boot-autoconfigure-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-test\3.0.2\spring-boot-starter-test-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-test\3.0.2\spring-boot-test-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\3.0.2\spring-boot-test-autoconfigure-3.0.2.jar;C:\Users\75001\.m2\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;C:\Users\75001\.m2\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;C:\Users\75001\.m2\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;C:\Users\75001\.m2\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;C:\Users\75001\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.0\jakarta.xml.bind-api-4.0.0.jar;C:\Users\75001\.m2\repository\org\assertj\assertj-core\3.23.1\assertj-core-3.23.1.jar;C:\Users\75001\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter\5.9.2\junit-jupiter-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\75001\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\75001\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\75001\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.9.2\junit-jupiter-params-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;C:\Users\75001\.m2\repository\org\mockito\mockito-core\4.8.1\mockito-core-4.8.1.jar;C:\Users\75001\.m2\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;C:\Users\75001\.m2\repository\org\objenesis\objenesis\3.2\objenesis-3.2.jar;C:\Users\75001\.m2\repository\org\mockito\mockito-junit-jupiter\4.8.1\mockito-junit-jupiter-4.8.1.jar;C:\Users\75001\.m2\repository\org\skyscreamer\jsonassert\1.5.1\jsonassert-1.5.1.jar;C:\Users\75001\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-core\6.0.4\spring-core-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-jcl\6.0.4\spring-jcl-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-test\6.0.4\spring-test-6.0.4.jar;C:\Users\75001\.m2\repository\org\xmlunit\xmlunit-core\2.9.1\xmlunit-core-2.9.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.14.1\jackson-datatype-jsr310-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.14.1\jackson-annotations-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.14.1\jackson-core-2.14.1.jar;C:\Users\75001\.m2\repository\org\redisson\redisson-hibernate-6\3.19.3\redisson-hibernate-6-3.19.3.jar;C:\Users\75001\.m2\repository\org\redisson\redisson\3.19.3\redisson-3.19.3.jar;C:\Users\75001\.m2\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;C:\Users\75001\.m2\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;C:\Users\75001\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\75001\.m2\repository\io\reactivex\rxjava3\rxjava\3.1.6\rxjava-3.1.6.jar;C:\Users\75001\.m2\repository\org\jboss\marshalling\jboss-marshalling\2.0.11.Final\jboss-marshalling-2.0.11.Final.jar;C:\Users\75001\.m2\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.11.Final\jboss-marshalling-river-2.0.11.Final.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\kryo\5.4.0\kryo-5.4.0.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.14.1\jackson-dataformat-yaml-2.14.1.jar;C:\Users\75001\.m2\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;C:\Users\75001\.m2\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;C:\Users\75001\.m2\repository\com\googlecode\owasp-java-html-sanitizer\owasp-java-html-sanitizer\20220608.1\owasp-java-html-sanitizer-20220608.1.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\Users\75001\.m2\repository\com\rometools\rome\1.18.0\rome-1.18.0.jar;C:\Users\75001\.m2\repository\com\rometools\rome-utils\1.18.0\rome-utils-1.18.0.jar;C:\Users\75001\.m2\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;C:\Users\75001\.m2\repository\org\slf4j\slf4j-api\2.0.6\slf4j-api-2.0.6.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-starter-redis\2.7.3\jetcache-starter-redis-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-autoconfigure\2.7.3\jetcache-autoconfigure-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-anno\2.7.3\jetcache-anno-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-core\2.7.3\jetcache-core-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-anno-api\2.7.3\jetcache-anno-api-2.7.3.jar;C:\Users\75001\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.21\fastjson2-2.0.21.jar;C:\Users\75001\.m2\repository\com\github\ben-manes\caffeine\caffeine\3.1.2\caffeine-3.1.2.jar;C:\Users\75001\.m2\repository\javax\annotation\javax.annotation-api\1.3.1\javax.annotation-api-1.3.1.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-redis\2.7.3\jetcache-redis-2.7.3.jar;C:\Users\75001\.m2\repository\redis\clients\jedis\4.3.1\jedis-4.3.1.jar;C:\Users\75001\.m2\repository\org\json\json\20220320\json-20220320.jar;C:\Users\75001\.m2\repository\org\greenrobot\eventbus-java\3.3.1\eventbus-java-3.3.1.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\3.0.2\spring-boot-starter-websocket-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-messaging\6.0.4\spring-messaging-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-websocket\6.0.4\spring-websocket-6.0.4.jar;"/>

+    <property name="java.vm.vendor" value="Oracle Corporation"/>

     <property name="sun.arch.data.model" value="64"/>

     <property name="user.variant" value=""/>

-    <property name="java.vendor.url" value="https://www.microsoft.com"/>

+    <property name="java.vendor.url" value="https://java.oracle.com/"/>

     <property name="user.timezone" value="Asia/Shanghai"/>

     <property name="os.name" value="Windows 11"/>

     <property name="java.vm.specification.version" value="17"/>

     <property name="sun.java.launcher" value="SUN_STANDARD"/>

     <property name="user.country" value="CN"/>

-    <property name="sun.boot.library.path" value="C:\Users\张家豪\.jdks\ms-17.0.15\bin"/>

-    <property name="sun.java.command" value="C:\WINDOWS\TEMP\surefire13777575975494743556\surefirebooter14600334824495032936.jar C:\Windows\Temp\surefire13777575975494743556 2025-06-06T16-41-33_678-jvmRun1 surefire2548858935558829792tmp surefire_014851753079105445043tmp"/>

+    <property name="sun.boot.library.path" value="C:\Program Files\Java\jdk-17\bin"/>

+    <property name="sun.java.command" value="C:\Users\75001\AppData\Local\Temp\surefire3030428393077310074\surefirebooter9472185601631202322.jar C:\Users\75001\AppData\Local\Temp\surefire3030428393077310074 2025-06-06T10-50-43_042-jvmRun1 surefire8153678642292441913tmp surefire_017704141993419977322tmp"/>

     <property name="jdk.debug" value="release"/>

-    <property name="surefire.test.class.path" value="E:\desktop\EX\0606B\PT_Sixth_Backend\target\test-classes;E:\desktop\EX\0606B\PT_Sixth_Backend\target\classes;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-cache\3.0.2\spring-boot-starter-cache-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter\3.0.2\spring-boot-starter-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.0.2\spring-boot-starter-logging-3.0.2.jar;C:\Users\张家豪\.m2\repository\ch\qos\logback\logback-classic\1.4.5\logback-classic-1.4.5.jar;C:\Users\张家豪\.m2\repository\ch\qos\logback\logback-core\1.4.5\logback-core-1.4.5.jar;C:\Users\张家豪\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.19.0\log4j-to-slf4j-2.19.0.jar;C:\Users\张家豪\.m2\repository\org\apache\logging\log4j\log4j-api\2.19.0\log4j-api-2.19.0.jar;C:\Users\张家豪\.m2\repository\org\slf4j\jul-to-slf4j\2.0.6\jul-to-slf4j-2.0.6.jar;C:\Users\张家豪\.m2\repository\org\yaml\snakeyaml\1.33\snakeyaml-1.33.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-context-support\6.0.4\spring-context-support-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-beans\6.0.4\spring-beans-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-context\6.0.4\spring-context-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\3.0.2\spring-boot-starter-data-redis-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-redis\3.0.1\spring-data-redis-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-keyvalue\3.0.1\spring-data-keyvalue-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-oxm\6.0.4\spring-oxm-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-aop\6.0.4\spring-aop-6.0.4.jar;C:\Users\张家豪\.m2\repository\io\lettuce\lettuce-core\6.2.2.RELEASE\lettuce-core-6.2.2.RELEASE.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\projectreactor\reactor-core\3.5.2\reactor-core-3.5.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\3.0.2\spring-boot-starter-data-jpa-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.0.2\spring-boot-starter-aop-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\aspectj\aspectjweaver\1.9.19\aspectjweaver-1.9.19.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.0.2\spring-boot-starter-jdbc-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-jdbc\6.0.4\spring-jdbc-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\hibernate\orm\hibernate-core\6.1.6.Final\hibernate-core-6.1.6.Final.jar;C:\Users\张家豪\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.1.0\jakarta.persistence-api-3.1.0.jar;C:\Users\张家豪\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\张家豪\.m2\repository\org\jboss\logging\jboss-logging\3.5.0.Final\jboss-logging-3.5.0.Final.jar;C:\Users\张家豪\.m2\repository\org\hibernate\common\hibernate-commons-annotations\6.0.2.Final\hibernate-commons-annotations-6.0.2.Final.jar;C:\Users\张家豪\.m2\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\张家豪\.m2\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.1\jaxb-runtime-4.0.1.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.1\jaxb-core-4.0.1.jar;C:\Users\张家豪\.m2\repository\org\glassfish\jaxb\txw2\4.0.1\txw2-4.0.1.jar;C:\Users\张家豪\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.1\istack-commons-runtime-4.1.1.jar;C:\Users\张家豪\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.0\jakarta.inject-api-2.0.0.jar;C:\Users\张家豪\.m2\repository\org\antlr\antlr4-runtime\4.10.1\antlr4-runtime-4.10.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-jpa\3.0.1\spring-data-jpa-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\data\spring-data-commons\3.0.1\spring-data-commons-3.0.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-orm\6.0.4\spring-orm-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-aspects\6.0.4\spring-aspects-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-mail\3.0.2\spring-boot-starter-mail-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\eclipse\angus\jakarta.mail\1.0.0\jakarta.mail-1.0.0.jar;C:\Users\张家豪\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.1\jakarta.activation-api-2.1.1.jar;C:\Users\张家豪\.m2\repository\org\eclipse\angus\angus-activation\1.0.0\angus-activation-1.0.0.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-quartz\3.0.2\spring-boot-starter-quartz-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-tx\6.0.4\spring-tx-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\张家豪\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.0.2\spring-boot-starter-validation-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.5\tomcat-embed-el-10.1.5.jar;C:\Users\张家豪\.m2\repository\org\hibernate\validator\hibernate-validator\8.0.0.Final\hibernate-validator-8.0.0.Final.jar;C:\Users\张家豪\.m2\repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-spring-boot3-starter\1.34.0\sa-token-spring-boot3-starter-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-jakarta-servlet\1.34.0\sa-token-jakarta-servlet-1.34.0.jar;C:\Users\张家豪\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.0.0\jakarta.servlet-api-6.0.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-spring-boot-autoconfig\1.34.0\sa-token-spring-boot-autoconfig-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-dao-redis-jackson\1.34.0\sa-token-dao-redis-jackson-1.34.0.jar;C:\Users\张家豪\.m2\repository\cn\dev33\sa-token-core\1.34.0\sa-token-core-1.34.0.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.0.2\spring-boot-starter-web-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-web\6.0.4\spring-web-6.0.4.jar;C:\Users\张家豪\.m2\repository\io\micrometer\micrometer-observation\1.10.3\micrometer-observation-1.10.3.jar;C:\Users\张家豪\.m2\repository\io\micrometer\micrometer-commons\1.10.3\micrometer-commons-1.10.3.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-webmvc\6.0.4\spring-webmvc-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-expression\6.0.4\spring-expression-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.0.2\spring-boot-starter-json-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.14.1\jackson-databind-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.14.1\jackson-datatype-jdk8-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.14.1\jackson-module-parameter-names-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.0.2\spring-boot-starter-tomcat-3.0.2.jar;C:\Users\张家豪\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.5\tomcat-embed-core-10.1.5.jar;C:\Users\张家豪\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.5\tomcat-embed-websocket-10.1.5.jar;C:\Users\张家豪\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\张家豪\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\张家豪\.m2\repository\commons-validator\commons-validator\1.7\commons-validator-1.7.jar;C:\Users\张家豪\.m2\repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;C:\Users\张家豪\.m2\repository\commons-digester\commons-digester\2.1\commons-digester-2.1.jar;C:\Users\张家豪\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\张家豪\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-text\1.10.0\commons-text-1.10.0.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-compress\1.22\commons-compress-1.22.jar;C:\Users\张家豪\.m2\repository\org\jetbrains\annotations\23.1.0\annotations-23.1.0.jar;C:\Users\张家豪\.m2\repository\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;C:\Users\张家豪\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\张家豪\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\张家豪\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\张家豪\.m2\repository\com\google\errorprone\error_prone_annotations\2.11.0\error_prone_annotations-2.11.0.jar;C:\Users\张家豪\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\张家豪\.m2\repository\at\favre\lib\bcrypt\0.9.0\bcrypt-0.9.0.jar;C:\Users\张家豪\.m2\repository\at\favre\lib\bytes\1.3.0\bytes-1.3.0.jar;C:\Users\张家豪\.m2\repository\com\konghq\unirest-java\3.14.1\unirest-java-3.14.1.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\Users\张家豪\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\Users\张家豪\.m2\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;C:\Users\张家豪\.m2\repository\me\tongfei\progressbar\0.9.5\progressbar-0.9.5.jar;C:\Users\张家豪\.m2\repository\org\jline\jline\3.21.0\jline-3.21.0.jar;C:\Users\张家豪\.m2\repository\com\dampcake\bencode\1.4\bencode-1.4.jar;C:\Users\张家豪\.m2\repository\com\mysql\mysql-connector-j\8.0.32\mysql-connector-j-8.0.32.jar;C:\Users\张家豪\.m2\repository\com\h2database\h2\2.1.214\h2-2.1.214.jar;C:\Users\张家豪\.m2\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-devtools\3.0.2\spring-boot-devtools-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot\3.0.2\spring-boot-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.0.2\spring-boot-autoconfigure-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-test\3.0.2\spring-boot-starter-test-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-test\3.0.2\spring-boot-test-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\3.0.2\spring-boot-test-autoconfigure-3.0.2.jar;C:\Users\张家豪\.m2\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;C:\Users\张家豪\.m2\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;C:\Users\张家豪\.m2\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;C:\Users\张家豪\.m2\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;C:\Users\张家豪\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.0\jakarta.xml.bind-api-4.0.0.jar;C:\Users\张家豪\.m2\repository\org\assertj\assertj-core\3.23.1\assertj-core-3.23.1.jar;C:\Users\张家豪\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter\5.9.2\junit-jupiter-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\张家豪\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\张家豪\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.9.2\junit-jupiter-params-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\张家豪\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;C:\Users\张家豪\.m2\repository\org\mockito\mockito-core\4.8.1\mockito-core-4.8.1.jar;C:\Users\张家豪\.m2\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;C:\Users\张家豪\.m2\repository\org\objenesis\objenesis\3.2\objenesis-3.2.jar;C:\Users\张家豪\.m2\repository\org\mockito\mockito-junit-jupiter\4.8.1\mockito-junit-jupiter-4.8.1.jar;C:\Users\张家豪\.m2\repository\org\skyscreamer\jsonassert\1.5.1\jsonassert-1.5.1.jar;C:\Users\张家豪\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-core\6.0.4\spring-core-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-jcl\6.0.4\spring-jcl-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-test\6.0.4\spring-test-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\xmlunit\xmlunit-core\2.9.1\xmlunit-core-2.9.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.14.1\jackson-datatype-jsr310-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.14.1\jackson-annotations-2.14.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.14.1\jackson-core-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\redisson\redisson-hibernate-6\3.19.3\redisson-hibernate-6-3.19.3.jar;C:\Users\张家豪\.m2\repository\org\redisson\redisson\3.19.3\redisson-3.19.3.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;C:\Users\张家豪\.m2\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;C:\Users\张家豪\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\张家豪\.m2\repository\io\reactivex\rxjava3\rxjava\3.1.6\rxjava-3.1.6.jar;C:\Users\张家豪\.m2\repository\org\jboss\marshalling\jboss-marshalling\2.0.11.Final\jboss-marshalling-2.0.11.Final.jar;C:\Users\张家豪\.m2\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.11.Final\jboss-marshalling-river-2.0.11.Final.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\kryo\5.4.0\kryo-5.4.0.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;C:\Users\张家豪\.m2\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;C:\Users\张家豪\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.14.1\jackson-dataformat-yaml-2.14.1.jar;C:\Users\张家豪\.m2\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;C:\Users\张家豪\.m2\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;C:\Users\张家豪\.m2\repository\com\googlecode\owasp-java-html-sanitizer\owasp-java-html-sanitizer\20220608.1\owasp-java-html-sanitizer-20220608.1.jar;C:\Users\张家豪\.m2\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\Users\张家豪\.m2\repository\com\rometools\rome\1.18.0\rome-1.18.0.jar;C:\Users\张家豪\.m2\repository\com\rometools\rome-utils\1.18.0\rome-utils-1.18.0.jar;C:\Users\张家豪\.m2\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;C:\Users\张家豪\.m2\repository\org\slf4j\slf4j-api\2.0.6\slf4j-api-2.0.6.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-starter-redis\2.7.3\jetcache-starter-redis-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-autoconfigure\2.7.3\jetcache-autoconfigure-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-anno\2.7.3\jetcache-anno-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-core\2.7.3\jetcache-core-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-anno-api\2.7.3\jetcache-anno-api-2.7.3.jar;C:\Users\张家豪\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.21\fastjson2-2.0.21.jar;C:\Users\张家豪\.m2\repository\com\github\ben-manes\caffeine\caffeine\3.1.2\caffeine-3.1.2.jar;C:\Users\张家豪\.m2\repository\javax\annotation\javax.annotation-api\1.3.1\javax.annotation-api-1.3.1.jar;C:\Users\张家豪\.m2\repository\com\alicp\jetcache\jetcache-redis\2.7.3\jetcache-redis-2.7.3.jar;C:\Users\张家豪\.m2\repository\redis\clients\jedis\4.3.1\jedis-4.3.1.jar;C:\Users\张家豪\.m2\repository\org\json\json\20220320\json-20220320.jar;C:\Users\张家豪\.m2\repository\org\greenrobot\eventbus-java\3.3.1\eventbus-java-3.3.1.jar;C:\Users\张家豪\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\3.0.2\spring-boot-starter-websocket-3.0.2.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-messaging\6.0.4\spring-messaging-6.0.4.jar;C:\Users\张家豪\.m2\repository\org\springframework\spring-websocket\6.0.4\spring-websocket-6.0.4.jar;"/>

+    <property name="surefire.test.class.path" value="C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\target\test-classes;C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend\target\classes;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-cache\3.0.2\spring-boot-starter-cache-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter\3.0.2\spring-boot-starter-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.0.2\spring-boot-starter-logging-3.0.2.jar;C:\Users\75001\.m2\repository\ch\qos\logback\logback-classic\1.4.5\logback-classic-1.4.5.jar;C:\Users\75001\.m2\repository\ch\qos\logback\logback-core\1.4.5\logback-core-1.4.5.jar;C:\Users\75001\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.19.0\log4j-to-slf4j-2.19.0.jar;C:\Users\75001\.m2\repository\org\apache\logging\log4j\log4j-api\2.19.0\log4j-api-2.19.0.jar;C:\Users\75001\.m2\repository\org\slf4j\jul-to-slf4j\2.0.6\jul-to-slf4j-2.0.6.jar;C:\Users\75001\.m2\repository\org\yaml\snakeyaml\1.33\snakeyaml-1.33.jar;C:\Users\75001\.m2\repository\org\springframework\spring-context-support\6.0.4\spring-context-support-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-beans\6.0.4\spring-beans-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-context\6.0.4\spring-context-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\3.0.2\spring-boot-starter-data-redis-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-redis\3.0.1\spring-data-redis-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-keyvalue\3.0.1\spring-data-keyvalue-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-oxm\6.0.4\spring-oxm-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-aop\6.0.4\spring-aop-6.0.4.jar;C:\Users\75001\.m2\repository\io\lettuce\lettuce-core\6.2.2.RELEASE\lettuce-core-6.2.2.RELEASE.jar;C:\Users\75001\.m2\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\projectreactor\reactor-core\3.5.2\reactor-core-3.5.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\3.0.2\spring-boot-starter-data-jpa-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.0.2\spring-boot-starter-aop-3.0.2.jar;C:\Users\75001\.m2\repository\org\aspectj\aspectjweaver\1.9.19\aspectjweaver-1.9.19.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.0.2\spring-boot-starter-jdbc-3.0.2.jar;C:\Users\75001\.m2\repository\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-jdbc\6.0.4\spring-jdbc-6.0.4.jar;C:\Users\75001\.m2\repository\org\hibernate\orm\hibernate-core\6.1.6.Final\hibernate-core-6.1.6.Final.jar;C:\Users\75001\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.1.0\jakarta.persistence-api-3.1.0.jar;C:\Users\75001\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\75001\.m2\repository\org\jboss\logging\jboss-logging\3.5.0.Final\jboss-logging-3.5.0.Final.jar;C:\Users\75001\.m2\repository\org\hibernate\common\hibernate-commons-annotations\6.0.2.Final\hibernate-commons-annotations-6.0.2.Final.jar;C:\Users\75001\.m2\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;C:\Users\75001\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\75001\.m2\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\jaxb-runtime\4.0.1\jaxb-runtime-4.0.1.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\jaxb-core\4.0.1\jaxb-core-4.0.1.jar;C:\Users\75001\.m2\repository\org\glassfish\jaxb\txw2\4.0.1\txw2-4.0.1.jar;C:\Users\75001\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.1\istack-commons-runtime-4.1.1.jar;C:\Users\75001\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.0\jakarta.inject-api-2.0.0.jar;C:\Users\75001\.m2\repository\org\antlr\antlr4-runtime\4.10.1\antlr4-runtime-4.10.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-jpa\3.0.1\spring-data-jpa-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\data\spring-data-commons\3.0.1\spring-data-commons-3.0.1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-orm\6.0.4\spring-orm-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-aspects\6.0.4\spring-aspects-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-mail\3.0.2\spring-boot-starter-mail-3.0.2.jar;C:\Users\75001\.m2\repository\org\eclipse\angus\jakarta.mail\1.0.0\jakarta.mail-1.0.0.jar;C:\Users\75001\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.1\jakarta.activation-api-2.1.1.jar;C:\Users\75001\.m2\repository\org\eclipse\angus\angus-activation\1.0.0\angus-activation-1.0.0.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-quartz\3.0.2\spring-boot-starter-quartz-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-tx\6.0.4\spring-tx-6.0.4.jar;C:\Users\75001\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\75001\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.0.2\spring-boot-starter-validation-3.0.2.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.5\tomcat-embed-el-10.1.5.jar;C:\Users\75001\.m2\repository\org\hibernate\validator\hibernate-validator\8.0.0.Final\hibernate-validator-8.0.0.Final.jar;C:\Users\75001\.m2\repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-spring-boot3-starter\1.34.0\sa-token-spring-boot3-starter-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-jakarta-servlet\1.34.0\sa-token-jakarta-servlet-1.34.0.jar;C:\Users\75001\.m2\repository\jakarta\servlet\jakarta.servlet-api\6.0.0\jakarta.servlet-api-6.0.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-spring-boot-autoconfig\1.34.0\sa-token-spring-boot-autoconfig-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-dao-redis-jackson\1.34.0\sa-token-dao-redis-jackson-1.34.0.jar;C:\Users\75001\.m2\repository\cn\dev33\sa-token-core\1.34.0\sa-token-core-1.34.0.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.0.2\spring-boot-starter-web-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-web\6.0.4\spring-web-6.0.4.jar;C:\Users\75001\.m2\repository\io\micrometer\micrometer-observation\1.10.3\micrometer-observation-1.10.3.jar;C:\Users\75001\.m2\repository\io\micrometer\micrometer-commons\1.10.3\micrometer-commons-1.10.3.jar;C:\Users\75001\.m2\repository\org\springframework\spring-webmvc\6.0.4\spring-webmvc-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-expression\6.0.4\spring-expression-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.0.2\spring-boot-starter-json-3.0.2.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.14.1\jackson-databind-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.14.1\jackson-datatype-jdk8-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.14.1\jackson-module-parameter-names-2.14.1.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.0.2\spring-boot-starter-tomcat-3.0.2.jar;C:\Users\75001\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.5\tomcat-embed-core-10.1.5.jar;C:\Users\75001\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.5\tomcat-embed-websocket-10.1.5.jar;C:\Users\75001\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\75001\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\75001\.m2\repository\commons-validator\commons-validator\1.7\commons-validator-1.7.jar;C:\Users\75001\.m2\repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;C:\Users\75001\.m2\repository\commons-digester\commons-digester\2.1\commons-digester-2.1.jar;C:\Users\75001\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\75001\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-text\1.10.0\commons-text-1.10.0.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-compress\1.22\commons-compress-1.22.jar;C:\Users\75001\.m2\repository\org\jetbrains\annotations\23.1.0\annotations-23.1.0.jar;C:\Users\75001\.m2\repository\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;C:\Users\75001\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\75001\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\75001\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\75001\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\75001\.m2\repository\com\google\errorprone\error_prone_annotations\2.11.0\error_prone_annotations-2.11.0.jar;C:\Users\75001\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\75001\.m2\repository\at\favre\lib\bcrypt\0.9.0\bcrypt-0.9.0.jar;C:\Users\75001\.m2\repository\at\favre\lib\bytes\1.3.0\bytes-1.3.0.jar;C:\Users\75001\.m2\repository\com\konghq\unirest-java\3.14.1\unirest-java-3.14.1.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\Users\75001\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\Users\75001\.m2\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;C:\Users\75001\.m2\repository\me\tongfei\progressbar\0.9.5\progressbar-0.9.5.jar;C:\Users\75001\.m2\repository\org\jline\jline\3.21.0\jline-3.21.0.jar;C:\Users\75001\.m2\repository\com\dampcake\bencode\1.4\bencode-1.4.jar;C:\Users\75001\.m2\repository\com\mysql\mysql-connector-j\8.0.32\mysql-connector-j-8.0.32.jar;C:\Users\75001\.m2\repository\com\h2database\h2\2.1.214\h2-2.1.214.jar;C:\Users\75001\.m2\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-devtools\3.0.2\spring-boot-devtools-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot\3.0.2\spring-boot-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.0.2\spring-boot-autoconfigure-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-test\3.0.2\spring-boot-starter-test-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-test\3.0.2\spring-boot-test-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\3.0.2\spring-boot-test-autoconfigure-3.0.2.jar;C:\Users\75001\.m2\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;C:\Users\75001\.m2\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;C:\Users\75001\.m2\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;C:\Users\75001\.m2\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;C:\Users\75001\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.0\jakarta.xml.bind-api-4.0.0.jar;C:\Users\75001\.m2\repository\org\assertj\assertj-core\3.23.1\assertj-core-3.23.1.jar;C:\Users\75001\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter\5.9.2\junit-jupiter-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.9.2\junit-jupiter-api-5.9.2.jar;C:\Users\75001\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\75001\.m2\repository\org\junit\platform\junit-platform-commons\1.9.2\junit-platform-commons-1.9.2.jar;C:\Users\75001\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.9.2\junit-jupiter-params-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.9.2\junit-jupiter-engine-5.9.2.jar;C:\Users\75001\.m2\repository\org\junit\platform\junit-platform-engine\1.9.2\junit-platform-engine-1.9.2.jar;C:\Users\75001\.m2\repository\org\mockito\mockito-core\4.8.1\mockito-core-4.8.1.jar;C:\Users\75001\.m2\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;C:\Users\75001\.m2\repository\org\objenesis\objenesis\3.2\objenesis-3.2.jar;C:\Users\75001\.m2\repository\org\mockito\mockito-junit-jupiter\4.8.1\mockito-junit-jupiter-4.8.1.jar;C:\Users\75001\.m2\repository\org\skyscreamer\jsonassert\1.5.1\jsonassert-1.5.1.jar;C:\Users\75001\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\75001\.m2\repository\org\springframework\spring-core\6.0.4\spring-core-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-jcl\6.0.4\spring-jcl-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-test\6.0.4\spring-test-6.0.4.jar;C:\Users\75001\.m2\repository\org\xmlunit\xmlunit-core\2.9.1\xmlunit-core-2.9.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.14.1\jackson-datatype-jsr310-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.14.1\jackson-annotations-2.14.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.14.1\jackson-core-2.14.1.jar;C:\Users\75001\.m2\repository\org\redisson\redisson-hibernate-6\3.19.3\redisson-hibernate-6-3.19.3.jar;C:\Users\75001\.m2\repository\org\redisson\redisson\3.19.3\redisson-3.19.3.jar;C:\Users\75001\.m2\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;C:\Users\75001\.m2\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;C:\Users\75001\.m2\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;C:\Users\75001\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\75001\.m2\repository\io\reactivex\rxjava3\rxjava\3.1.6\rxjava-3.1.6.jar;C:\Users\75001\.m2\repository\org\jboss\marshalling\jboss-marshalling\2.0.11.Final\jboss-marshalling-2.0.11.Final.jar;C:\Users\75001\.m2\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.11.Final\jboss-marshalling-river-2.0.11.Final.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\kryo\5.4.0\kryo-5.4.0.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;C:\Users\75001\.m2\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;C:\Users\75001\.m2\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.14.1\jackson-dataformat-yaml-2.14.1.jar;C:\Users\75001\.m2\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;C:\Users\75001\.m2\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;C:\Users\75001\.m2\repository\com\googlecode\owasp-java-html-sanitizer\owasp-java-html-sanitizer\20220608.1\owasp-java-html-sanitizer-20220608.1.jar;C:\Users\75001\.m2\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\Users\75001\.m2\repository\com\rometools\rome\1.18.0\rome-1.18.0.jar;C:\Users\75001\.m2\repository\com\rometools\rome-utils\1.18.0\rome-utils-1.18.0.jar;C:\Users\75001\.m2\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;C:\Users\75001\.m2\repository\org\slf4j\slf4j-api\2.0.6\slf4j-api-2.0.6.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-starter-redis\2.7.3\jetcache-starter-redis-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-autoconfigure\2.7.3\jetcache-autoconfigure-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-anno\2.7.3\jetcache-anno-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-core\2.7.3\jetcache-core-2.7.3.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-anno-api\2.7.3\jetcache-anno-api-2.7.3.jar;C:\Users\75001\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.21\fastjson2-2.0.21.jar;C:\Users\75001\.m2\repository\com\github\ben-manes\caffeine\caffeine\3.1.2\caffeine-3.1.2.jar;C:\Users\75001\.m2\repository\javax\annotation\javax.annotation-api\1.3.1\javax.annotation-api-1.3.1.jar;C:\Users\75001\.m2\repository\com\alicp\jetcache\jetcache-redis\2.7.3\jetcache-redis-2.7.3.jar;C:\Users\75001\.m2\repository\redis\clients\jedis\4.3.1\jedis-4.3.1.jar;C:\Users\75001\.m2\repository\org\json\json\20220320\json-20220320.jar;C:\Users\75001\.m2\repository\org\greenrobot\eventbus-java\3.3.1\eventbus-java-3.3.1.jar;C:\Users\75001\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\3.0.2\spring-boot-starter-websocket-3.0.2.jar;C:\Users\75001\.m2\repository\org\springframework\spring-messaging\6.0.4\spring-messaging-6.0.4.jar;C:\Users\75001\.m2\repository\org\springframework\spring-websocket\6.0.4\spring-websocket-6.0.4.jar;"/>

     <property name="sun.cpu.endian" value="little"/>

-    <property name="user.home" value="C:\Users\张家豪"/>

+    <property name="user.home" value="C:\Users\75001"/>

     <property name="user.language" value="zh"/>

     <property name="java.specification.vendor" value="Oracle Corporation"/>

-    <property name="java.version.date" value="2025-04-15"/>

-    <property name="java.home" value="C:\Users\张家豪\.jdks\ms-17.0.15"/>

+    <property name="java.version.date" value="2023-01-17"/>

+    <property name="java.home" value="C:\Program Files\Java\jdk-17"/>

     <property name="file.separator" value="\"/>

-    <property name="basedir" value="E:\desktop\EX\0606B\PT_Sixth_Backend"/>

+    <property name="basedir" value="C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend"/>

     <property name="java.vm.compressedOopsMode" value="Zero based"/>

     <property name="line.separator" value="&#10;"/>

     <property name="java.vm.specification.vendor" value="Oracle Corporation"/>

     <property name="java.specification.name" value="Java Platform API Specification"/>

-    <property name="surefire.real.class.path" value="C:\WINDOWS\TEMP\surefire13777575975494743556\surefirebooter14600334824495032936.jar"/>

+    <property name="surefire.real.class.path" value="C:\Users\75001\AppData\Local\Temp\surefire3030428393077310074\surefirebooter9472185601631202322.jar"/>

     <property name="user.script" value=""/>

     <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>

-    <property name="java.runtime.version" value="17.0.15+6-LTS"/>

-    <property name="user.name" value="张家豪"/>

+    <property name="java.runtime.version" value="17.0.6+9-LTS-190"/>

+    <property name="user.name" value="75001"/>

     <property name="path.separator" value=";"/>

     <property name="os.version" value="10.0"/>

-    <property name="java.runtime.name" value="OpenJDK Runtime Environment"/>

+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>

     <property name="file.encoding" value="GBK"/>

-    <property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>

-    <property name="java.vendor.version" value="Microsoft-11369865"/>

-    <property name="localRepository" value="C:\Users\张家豪\.m2\repository"/>

-    <property name="java.vendor.url.bug" value="https://github.com/microsoft/openjdk/issues"/>

-    <property name="java.io.tmpdir" value="C:\WINDOWS\TEMP\"/>

-    <property name="idea.version" value="2024.2.4"/>

-    <property name="java.version" value="17.0.15"/>

-    <property name="user.dir" value="E:\desktop\EX\0606B\PT_Sixth_Backend"/>

+    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>

+    <property name="localRepository" value="C:\Users\75001\.m2\repository"/>

+    <property name="java.vendor.url.bug" value="https://bugreport.java.com/bugreport/"/>

+    <property name="java.io.tmpdir" value="C:\Users\75001\AppData\Local\Temp\"/>

+    <property name="idea.version" value="2025.1.1.1"/>

+    <property name="java.version" value="17.0.6"/>

+    <property name="user.dir" value="C:\Users\75001\Desktop\Sapling-main\PT_Sixth_Backend"/>

     <property name="os.arch" value="amd64"/>

     <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>

     <property name="sun.os.patch.level" value=""/>

     <property name="native.encoding" value="GBK"/>

-    <property name="java.library.path" value="C:\Users\张家豪\.jdks\ms-17.0.15\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:\ProgramData\anaconda3\condabin;E:\Program Files\Python312\Scripts\;E:\Program Files\Python312\;C:\MinGW\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;E:\MinGW\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Java\jdk-19\bin;C:\Program Files\Java\jdk-19\jre\bin;E:\ComplierComplier\GnuWin32\bin;E:\ComplierComplier\MinGW\bin;E:\Program Files\nodejs\;E:\Program Files\nodejs\node_global\node_modules;E:\Program Files\Git\cmd;E:\Program Files\Redis\;E:\ProgramData\anaconda3;E:\ProgramData\anaconda3\Scripts;E:\ProgramData\anaconda3\Library\bin;E:\ProgramData\anaconda3\Library\mingw-w64\bin;E:\ProgramData\anaconda3\Library\usr\bin;E:\Program Files\apache-maven-3.9.9\bin;E:\docker\resources\bin;E:\Program Files\Git LFS;C:\MinGW\bin;C:\Users\张家豪\AppData\Local\Microsoft\WindowsApps;C:\texlive\2023\bin\windows;E:\Program Files\IDEA\IntelliJ IDEA Community Edition 2024.1\bin;;E:\Tomcat\apache-tomcat-10.1.20\bin\;E:\Program Files\Python工具\PyCharm Community Edition 2024.1.4\bin;;E:\Program Files\nodejs\node_global;C:\Users\张家豪\AppData\Local\Programs\Microsoft VS Code\bin;;."/>

+    <property name="java.library.path" value="C:\Program Files\Java\jdk-17\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\VMware\bin\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\李健星\Documents\MinGW(1)\bin;%S;stemRoot%\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Java\jdk-17\bin;D:\MySQL\My SQL Server 8.0\bin;C:\Program Files\dotnet\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\MySQL\MySQL Server 8.0\bin;D:\Java\;D:\anaconda;D:\anaconda\Library\bin;D:\anaconda\Scripts;D:\anaconda\Library\mingw-w64;C:\Program Files\NVIDIA Corporation\Nsight Compute 2023.1.0\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\include;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\lib\x64;C:\ProgramData\chocolatey\bin;C:\Program Files\CMake\bin;D:\Maven\apache-maven-3.9.9-bin\apache-maven-3.9.9\bin;C:\WINDOWS\system32;C:\WINDOWS\system32\downlevel;D:\Git\cmd;C:\Users\75001\AppData\Roaming\npm;C:\Program Files\Docker\Docker\resources\bin;D:\Redis;C:\Users\75001\AppData\Local\Programs\Python\Python311\Scripts\;C:\Users\75001\AppData\Local\Programs\Python\Python311\;C:\Users\75001\AppData\Local\Microsoft\WindowsApps;C:\Users\75001\AppData\Local\Programs\Microsoft VS Code\bin;D:\Lijianxing\PyCharm Community Edition 2024.1.3\bin;;D:\jpNoteBook\cursor\resources\app\bin;D:\FanQieClean\IntelliJ IDEA 2025.1.1.1\bin;;C:\Users\75001\.bun\bin;."/>

     <property name="java.vm.info" value="mixed mode, sharing"/>

-    <property name="java.vendor" value="Microsoft"/>

-    <property name="java.vm.version" value="17.0.15+6-LTS"/>

-    <property name="java.specification.maintenance.version" value="1"/>

+    <property name="java.vendor" value="Oracle Corporation"/>

+    <property name="java.vm.version" value="17.0.6+9-LTS-190"/>

     <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>

     <property name="java.class.version" value="61.0"/>

   </properties>

-  <testcase name="contextLoads" classname="com.github.example.pt.ptApplicationTests" time="0.013"/>

+  <testcase name="contextLoads" classname="com.github.example.pt.ptApplicationTests" time="0.302"/>

 </testsuite>
\ No newline at end of file
diff --git a/target/surefire-reports/com.github.example.pt.ptApplicationTests.txt b/target/surefire-reports/com.github.example.pt.ptApplicationTests.txt
index 8128148..f72adb5 100644
--- a/target/surefire-reports/com.github.example.pt.ptApplicationTests.txt
+++ b/target/surefire-reports/com.github.example.pt.ptApplicationTests.txt
@@ -1,4 +1,4 @@
 -------------------------------------------------------------------------------

 Test set: com.github.example.pt.ptApplicationTests

 -------------------------------------------------------------------------------

-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s - in com.github.example.pt.ptApplicationTests

+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11.505 s - in com.github.example.pt.ptApplicationTests

diff --git a/target/test-classes/com/github/example/pt/ptApplicationTests.class b/target/test-classes/com/github/example/pt/ptApplicationTests.class
index 88acaad..6aad098 100644
--- a/target/test-classes/com/github/example/pt/ptApplicationTests.class
+++ b/target/test-classes/com/github/example/pt/ptApplicationTests.class
Binary files differ