为历史记录页面添加了NSFW(Not Safe For Work)内容标记系统,包括:
- NSFW标记:每张图片可以标记/取消标记为NSFW内容
- NSFW筛选:可以切换显示或隐藏NSFW内容
- 默认隐藏:默认情况下不显示带有NSFW标记的图片
- 视觉标识:NSFW图片右上角显示红色"🔞 NSFW"徽章
- 打开历史记录页面(
/history.html) - 在任意图片下方可以看到"标记NSFW"按钮
- 点击按钮即可将该图片标记为NSFW
- 再次点击可取消NSFW标记
- 展开筛选条件面板(点击"🔍 筛选条件"标题)
- 找到"🔞 NSFW内容"筛选区域
- 点击"隐藏NSFW"按钮:隐藏所有NSFW图片(默认状态)
- 点击"显示NSFW"按钮:显示所有图片,包括NSFW内容
- 被标记为NSFW的图片右上角会显示红色"🔞 NSFW"徽章
- 该徽章始终可见,即使在不显示NSFW内容的模式下也能看到(如果当前正在查看该图片)
-
数据库结构 (
database.py)- 在
generation_history表中添加is_nsfw字段(INTEGER,默认0) - 添加
idx_history_nsfw索引优化查询性能 - 新增
toggle_nsfw()函数切换NSFW状态 - 修改
get_user_history()、get_all_history()、get_history_count()支持NSFW筛选 - 默认情况下只返回
is_nsfw = 0的记录
- 在
-
API接口 (
history_routes.py)- 新增
/api/nsfwPOST 接口处理NSFW标记切换 - 修改
/api/historyGET 接口支持show_nsfw参数
- 新增
-
样式 (
static/history.html)- 添加NSFW徽章样式(
.nsfw-badge) - 添加NSFW切换按钮样式(
.nsfw-toggle-btn) - 添加NSFW筛选按钮样式
- 添加NSFW徽章样式(
-
功能
toggleNsfwDisplay(): 切换NSFW显示/隐藏toggleNsfw(): 切换单张图片的NSFW标记- 修改
renderHistory()显示NSFW徽章和切换按钮 - 修改
loadHistory()支持NSFW筛选参数 - 初始化时默认设置"隐藏NSFW"为激活状态
如果数据库中已有历史记录但没有 is_nsfw 字段,需要运行迁移脚本:
python scripts/migrate_add_nsfw.py该脚本会:
- 检查
is_nsfw字段是否存在 - 如果不存在则添加该字段(默认值为0)
- 创建NSFW索引
0: 非NSFW内容(默认值)1: NSFW内容
- 星级筛选:默认不选择任何评级(显示全部)
- NSFW筛选:默认隐藏NSFW内容
- 这样设计是为了提供更好的用户体验,避免意外看到不适宜的内容
运行测试脚本验证NSFW功能:
python tests/test_nsfw.py测试内容包括:
- 创建用户
- 获取历史记录
- 标记图片为NSFW
- 验证默认隐藏NSFW
- 验证显示NSFW
- 取消NSFW标记
- NSFW标记是全局共享的,一个用户的标记会影响所有用户
- 如果需要每用户独立的NSFW标记,需要重新设计数据库结构
- 当前实现适合公共评审场景
如果需要支持每用户独立的NSFW标记,可以考虑:
- 创建NSFW标记表:
CREATE TABLE image_nsfw_flags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
image_id TEXT NOT NULL,
user_id INTEGER NOT NULL,
is_nsfw INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(image_id, user_id)
);-
修改查询逻辑: 根据当前用户ID查询其个人NSFW标记
-
更新API: 返回当前用户的NSFW标记状态
但当前实现已经满足"对所有用户图片标记NSFW"的需求。