等级制度

Change-Id: I24bf28fedd57e5e5ef16c875e557e51a4db401bd
diff --git a/src/main/resources/ppt.sql b/src/main/resources/ppt.sql
index 54e71f0..ad94e82 100644
--- a/src/main/resources/ppt.sql
+++ b/src/main/resources/ppt.sql
@@ -1,742 +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
+);
+