-- 短视频解析平台数据库表结构设计 -- 数据库: video_parser -- 字符集: utf8mb4 -- 1. 用户表 CREATE TABLE IF NOT EXISTS `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', `email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱', `password` VARCHAR(255) NOT NULL COMMENT '加密后的密码', `group_id` INT NOT NULL DEFAULT 2 COMMENT '用户分组ID', `register_ip` VARCHAR(45) COMMENT '注册IP', `last_login_ip` VARCHAR(45) COMMENT '最近登录IP', `total_parse_count` INT DEFAULT 0 COMMENT '总解析次数', `is_active` TINYINT(1) DEFAULT 1 COMMENT '账号是否激活', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX `idx_email` (`email`), INDEX `idx_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 2. 用户分组表 CREATE TABLE IF NOT EXISTS `user_groups` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL UNIQUE COMMENT '分组名称', `daily_limit` INT NOT NULL DEFAULT 10 COMMENT '每日解析次数限制', `description` VARCHAR(255) COMMENT '分组描述', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户分组表'; -- 插入默认分组 INSERT INTO `user_groups` (`id`, `name`, `daily_limit`, `description`) VALUES (1, '游客', 5, '未登录用户'), (2, '普通用户', 10, '已注册用户'), (3, 'VIP用户', 50, 'VIP会员'), (4, 'SVIP用户', 200, 'SVIP会员'); -- 3. 管理员表 CREATE TABLE IF NOT EXISTS `admins` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(50) NOT NULL UNIQUE COMMENT '管理员用户名', `password` VARCHAR(255) NOT NULL COMMENT '加密后的密码', `email` VARCHAR(100) COMMENT '管理员邮箱', `totp_secret` VARCHAR(100) COMMENT '2FA密钥', `is_2fa_enabled` TINYINT(1) DEFAULT 0 COMMENT '是否启用2FA', `last_login_ip` VARCHAR(45) COMMENT '最近登录IP', `last_login_at` DATETIME COMMENT '最近登录时间', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; -- 插入默认管理员账号 (密码需要在应用中加密后插入) -- 用户名: shihao, 密码: 80012029Lz -- 4. 解析接口配置表 CREATE TABLE IF NOT EXISTS `parser_apis` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(100) NOT NULL COMMENT '接口名称', `platform` VARCHAR(50) NOT NULL COMMENT '平台类型(douyin/tiktok/bilibili)', `api_url` VARCHAR(500) NOT NULL COMMENT 'API地址', `api_key` VARCHAR(255) COMMENT 'API密钥', `weight` INT DEFAULT 1 COMMENT '权重(用于负载均衡)', `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用', `health_status` TINYINT(1) DEFAULT 1 COMMENT '健康状态(1正常/0异常)', `last_check_at` DATETIME COMMENT '最后检查时间', `fail_count` INT DEFAULT 0 COMMENT '连续失败次数', `total_calls` INT DEFAULT 0 COMMENT '总调用次数', `success_calls` INT DEFAULT 0 COMMENT '成功调用次数', `avg_response_time` INT DEFAULT 0 COMMENT '平均响应时间(ms)', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX `idx_platform` (`platform`), INDEX `idx_enabled` (`is_enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='解析接口配置表'; -- 5. 站点配置表 CREATE TABLE IF NOT EXISTS `site_config` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `config_key` VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键', `config_value` TEXT COMMENT '配置值', `config_type` VARCHAR(50) DEFAULT 'string' COMMENT '配置类型(string/int/json)', `description` VARCHAR(255) COMMENT '配置描述', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站点配置表'; -- 插入默认配置 INSERT INTO `site_config` (`config_key`, `config_value`, `config_type`, `description`) VALUES ('site_title', '短视频解析平台', 'string', '网站标题'), ('site_logo', '', 'string', '网站Logo URL'), ('site_notice', '欢迎使用短视频解析平台', 'string', '网站公告'), ('site_footer', '', 'string', '网站底部信息'), ('max_concurrent', '3', 'int', '最大并发解析数'), ('guest_daily_limit', '5', 'int', '游客每日解析次数'), ('user_daily_limit', '10', 'int', '普通用户每日解析次数'); -- 6. SMTP配置表 CREATE TABLE IF NOT EXISTS `smtp_config` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(100) NOT NULL COMMENT 'SMTP配置名称', `host` VARCHAR(255) NOT NULL COMMENT 'SMTP服务器地址', `port` INT NOT NULL COMMENT 'SMTP端口', `username` VARCHAR(255) NOT NULL COMMENT 'SMTP用户名', `password` VARCHAR(255) NOT NULL COMMENT 'SMTP密码', `from_email` VARCHAR(255) NOT NULL COMMENT '发件人邮箱', `from_name` VARCHAR(100) COMMENT '发件人名称', `use_tls` TINYINT(1) DEFAULT 1 COMMENT '是否使用TLS', `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用', `is_default` TINYINT(1) DEFAULT 0 COMMENT '是否为默认配置', `weight` INT DEFAULT 1 COMMENT '权重(用于负载均衡)', `send_count` INT DEFAULT 0 COMMENT '发送次数', `fail_count` INT DEFAULT 0 COMMENT '失败次数', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SMTP配置表'; -- 插入默认SMTP配置 INSERT INTO `smtp_config` (`name`, `host`, `port`, `username`, `password`, `from_email`, `from_name`, `is_default`) VALUES ('默认SMTP', 'smtp.resend.com', 587, 'resend', 're_TSgVYFuT_HG9g3Mu6P4i6LEdYgqVpW6S5', 'noreply@example.com', '短视频解析平台', 1); -- 7. 邮箱验证码表 CREATE TABLE IF NOT EXISTS `email_verification` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `email` VARCHAR(100) NOT NULL COMMENT '邮箱地址', `code` VARCHAR(10) NOT NULL COMMENT '验证码', `purpose` VARCHAR(50) NOT NULL COMMENT '用途(register/reset_password/forgot_password)', `is_used` TINYINT(1) DEFAULT 0 COMMENT '是否已使用', `expires_at` DATETIME NOT NULL COMMENT '过期时间', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX `idx_email_code` (`email`, `code`), INDEX `idx_expires` (`expires_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='邮箱验证码表'; -- 8. 解析记录表 CREATE TABLE IF NOT EXISTS `parse_logs` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `user_id` INT COMMENT '用户ID(NULL表示游客)', `ip_address` VARCHAR(45) NOT NULL COMMENT '请求IP', `platform` VARCHAR(50) NOT NULL COMMENT '平台类型', `video_url` VARCHAR(1000) NOT NULL COMMENT '视频链接', `parser_api_id` INT COMMENT '使用的解析接口ID', `status` VARCHAR(20) NOT NULL COMMENT '状态(success/failed/queued)', `error_message` TEXT COMMENT '错误信息', `response_time` INT COMMENT '响应时间(ms)', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX `idx_user_id` (`user_id`), INDEX `idx_ip` (`ip_address`), INDEX `idx_platform` (`platform`), INDEX `idx_status` (`status`), INDEX `idx_created` (`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='解析记录表'; -- 9. 每日解析统计表 CREATE TABLE IF NOT EXISTS `daily_parse_stats` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT COMMENT '用户ID(NULL表示游客)', `ip_address` VARCHAR(45) COMMENT 'IP地址(游客使用)', `date` DATE NOT NULL COMMENT '日期', `parse_count` INT DEFAULT 0 COMMENT '解析次数', `success_count` INT DEFAULT 0 COMMENT '成功次数', `fail_count` INT DEFAULT 0 COMMENT '失败次数', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY `uk_user_date` (`user_id`, `date`), UNIQUE KEY `uk_ip_date` (`ip_address`, `date`), INDEX `idx_date` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='每日解析统计表'; -- 10. 健康检查配置表 CREATE TABLE IF NOT EXISTS `health_check_config` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `platform` VARCHAR(50) NOT NULL COMMENT '平台类型', `test_url` VARCHAR(1000) NOT NULL COMMENT '测试视频链接', `check_interval` INT DEFAULT 300 COMMENT '检查间隔(秒)', `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用', `alert_email` VARCHAR(255) COMMENT '告警邮箱', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康检查配置表'; -- 11. 健康检查日志表 CREATE TABLE IF NOT EXISTS `health_check_logs` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `parser_api_id` INT NOT NULL COMMENT '解析接口ID', `status` VARCHAR(20) NOT NULL COMMENT '检查结果(success/failed)', `response_time` INT COMMENT '响应时间(ms)', `error_message` TEXT COMMENT '错误信息', `checked_at` DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX `idx_api_id` (`parser_api_id`), INDEX `idx_checked` (`checked_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康检查日志表';