Files
JieXi/database/schema.sql
2025-11-28 21:20:40 +08:00

192 lines
9.5 KiB
SQL

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