-- 短视频解析平台数据库表结构设计
-- 数据库: 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='健康检查日志表';
