db08179eb0
文档更新: - 更新README中成人内容过滤部分,添加Cloudflare Pages配置要求 - 新增CLOUDFLARE_PAGES_ADULT_FILTER.md详细配置指南 - 更新D1_MIGRATION.md,修正user_settings表结构 数据库优化: - 修复scripts/d1-init.sql,添加缺失的user_settings表 - 更新表结构以匹配当前实现 - 添加必要的索引优化查询性能 问题修复: - 解决Cloudflare Pages部署时'获取用户设置失败'错误 - 明确说明不同部署平台的存储类型要求 - 提供详细的故障排除指南
6.6 KiB
6.6 KiB
D1 数据库迁移 - 添加成人内容过滤和跳过配置功能
如果您已经有一个运行中的 D1 数据库,需要执行以下 SQL 语句来添加成人内容过滤和跳过配置支持。
🗄️ 新增表结构
user_settings 表(成人内容过滤功能 - 必需)
这个表用于存储用户的个人设置,包括成人内容过滤开关:
-- 创建用户设置表(成人内容过滤功能)
CREATE TABLE IF NOT EXISTS user_settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
username TEXT NOT NULL,
filter_adult_content BOOLEAN DEFAULT 1,
theme TEXT DEFAULT 'auto',
language TEXT DEFAULT 'zh-CN',
auto_play BOOLEAN DEFAULT 1,
video_quality TEXT DEFAULT 'auto',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE (user_id, username)
);
-- 为用户设置添加索引以优化查询性能
CREATE INDEX IF NOT EXISTS idx_user_settings_user_id ON user_settings(user_id);
CREATE INDEX IF NOT EXISTS idx_user_settings_username ON user_settings(username);
skip_configs 表(跳过功能 - 可选)
这个表用于存储用户的跳过片头片尾配置:
-- 创建跳过配置表
CREATE TABLE IF NOT EXISTS skip_configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
config_key TEXT NOT NULL,
start_time INTEGER DEFAULT 0,
end_time INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE (user_id, config_key)
);
-- 为跳过配置添加索引以优化查询性能
CREATE INDEX IF NOT EXISTS idx_skip_configs_user_id ON skip_configs(user_id);
🚀 执行迁移的方法
⚠️ 重要提示
如果您在 Cloudflare Pages 使用成人内容过滤功能时遇到"获取用户设置失败"错误,这是因为缺少 user_settings 表。必须执行此迁移才能使功能正常工作。
方法一:使用 Cloudflare Dashboard(推荐)
- 登录 Cloudflare Dashboard
- 进入您的账户,找到 D1 服务
- 选择您的数据库实例
- 点击 Console 标签页
- 在 SQL 查询界面中粘贴上面的 SQL 代码
- 点击 Execute 执行
方法二:使用 Wrangler CLI
如果您有 Wrangler CLI,可以在本地执行:
# 首先登录 Cloudflare
wrangler auth login
# 创建迁移文件
echo "-- 上面的SQL代码" > user_settings_migration.sql
# 执行数据库迁移
wrangler d1 execute your-database-name --file=user_settings_migration.sql
方法三:使用项目内置迁移脚本
# 克隆或更新项目代码
git pull origin main
# 执行完整的D1初始化(包含新表)
wrangler d1 execute your-database-name --file=./scripts/d1-init.sql
📋 字段说明
user_settings 表字段
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id |
INTEGER | 自增 | 主键 |
user_id |
INTEGER | 无 | 用户ID,关联users表 |
username |
TEXT | 无 | 用户名 |
filter_adult_content |
BOOLEAN | 1(true) | 成人内容过滤开关 |
theme |
TEXT | 'auto' | 界面主题设置 |
language |
TEXT | 'zh-CN' | 语言设置 |
auto_play |
BOOLEAN | 1(true) | 自动播放开关 |
video_quality |
TEXT | 'auto' | 视频质量偏好 |
created_at |
DATETIME | 当前时间 | 创建时间 |
updated_at |
DATETIME | 当前时间 | 更新时间 |
skip_configs 表字段
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id |
INTEGER | 自增 | 主键 |
user_id |
INTEGER | 无 | 用户ID,关联users表 |
config_key |
TEXT | 无 | 配置键,格式:source+video_id |
start_time |
INTEGER | 0 | 跳过开始时间(秒) |
end_time |
INTEGER | 0 | 跳过结束时间(秒) |
created_at |
DATETIME | 当前时间 | 创建时间 |
updated_at |
DATETIME | 当前时间 | 更新时间 |
✅ 迁移验证
执行迁移后,可以通过以下 SQL 验证表是否创建成功:
-- 检查 user_settings 表是否存在
SELECT name FROM sqlite_master WHERE type='table' AND name='user_settings';
-- 检查 skip_configs 表是否存在
SELECT name FROM sqlite_master WHERE type='table' AND name='skip_configs';
-- 查看 user_settings 表结构
PRAGMA table_info(user_settings);
-- 查看 skip_configs 表结构
PRAGMA table_info(skip_configs);
🔧 故障排除
1. "获取用户设置失败" 错误
原因:缺少 user_settings 表
解决:执行上述迁移SQL,确保user_settings表已创建
2. "表已存在" 错误
原因:表已经创建过了
解决:这是正常的,CREATE TABLE IF NOT EXISTS 语句是安全的
3. 外键约束错误
原因:users表不存在或结构不匹配
解决:确保先运行完整的 ./scripts/d1-init.sql 初始化脚本
📞 需要帮助?
如果在迁移过程中遇到问题:
- 检查 Cloudflare D1 Dashboard 中的数据库状态
- 确认环境变量
NEXT_PUBLIC_STORAGE_TYPE=d1已设置 - 验证
wrangler.toml中的数据库配置 - 查看项目 Issues 或提交新的问题报告
-- 检查表是否存在
SELECT name FROM sqlite_master WHERE type='table' AND name='skip_configs';
-- 检查表结构
PRAGMA table_info(skip_configs);
-- 检查索引是否创建
SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='skip_configs';
⚠️ 重要提示
- 备份数据:执行迁移前建议备份数据库
- 测试环境:建议先在测试环境执行迁移
- 版本兼容:这个迁移向后兼容,不会影响现有功能
- 只需执行一次:这个迁移脚本可以安全地重复执行(使用了
IF NOT EXISTS)
🔄 如果您是新部署
如果您是新部署的 D1 数据库,直接使用更新后的 D1初始化.md 中的完整 SQL 即可,无需单独执行迁移。
执行完迁移后,跳过功能就可以在您的 D1 部署中正常使用了!🎉