PICFLOW 数据库设计
所有表使用 InnoDB 引擎,utf8mb4 字符集。连接数据库为 img。

表结构
1. users — 用户表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
用户 ID |
| username |
VARCHAR(50) UNIQUE |
用户名 |
| nickname |
VARCHAR(100) |
昵称 |
| email |
VARCHAR(100) |
邮箱 |
| password_hash |
VARCHAR(255) |
bcrypt 密码哈希 |
| role |
ENUM(‘user’,’moderator’,’admin’) |
角色,默认 ‘user’ |
| avatar |
VARCHAR(500) |
头像 URL |
| bio |
TEXT |
个人简介 |
| storage_driver |
ENUM(‘local’,’aliyun’,’tencent’) |
存储后端偏好 |
| api_token |
VARCHAR(64) |
API Token (SHA-256) |
| is_banned |
TINYINT(1) |
是否被封禁 |
| ban_reason |
TEXT |
封禁原因 |
| banned_until |
DATETIME |
封禁截止时间 |
| is_muted |
TINYINT(1) |
是否被禁言 |
| muted_until |
DATETIME |
禁言截止时间 |
| liked_tags |
TEXT |
用户喜欢的标签 (逗号分隔) |
| created_at |
DATETIME |
注册时间 |
| updated_at |
DATETIME |
更新时间 |
首个注册用户自动获得 admin 角色。
2. categories — 分类表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
分类 ID |
| name |
VARCHAR(50) |
分类名称 |
| slug |
VARCHAR(50) UNIQUE |
URL 友好标识 |
| description |
TEXT |
分类描述 |
| sort_order |
INT |
排序序号 |
默认分类:scenery(风景)、portrait(人像)、design(设计)、animal(动物)、food(食物)、other(其他)。
3. images — 图片表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
图片 ID |
| user_id |
INT FK → users.id |
上传者 |
| title |
VARCHAR(200) |
标题 |
| description |
TEXT |
描述 |
| category_id |
INT FK → categories.id |
分类 |
| file_path |
VARCHAR(500) |
存储路径 |
| storage_driver |
ENUM(‘local’,’aliyun’,’tencent’) |
存储后端 |
| file_size |
BIGINT |
文件大小 (bytes) |
| width |
INT |
图片宽度 (px) |
| height |
INT |
图片高度 (px) |
| mime_type |
VARCHAR(50) |
MIME 类型 |
| views_count |
INT DEFAULT 0 |
浏览次数 |
| likes_count |
INT DEFAULT 0 |
点赞数 |
| deleted_at |
DATETIME |
软删除时间 |
| created_at |
DATETIME |
上传时间 |
软删除机制:deleted_at IS NOT NULL 表示已删除,30 天后硬删除。
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| image_id |
INT FK → images.id |
图片 ID |
| tag |
VARCHAR(50) |
标签名 |
每张图片可关联多个标签。标签在图片上传时根据标题、分类、文件名自动生成。
5. likes — 点赞表
| 字段 |
类型 |
说明 |
| user_id |
INT FK → users.id |
用户 ID |
| image_id |
INT FK → images.id |
图片 ID |
| created_at |
DATETIME |
点赞时间 |
联合唯一索引 (user_id, image_id),保证同一用户对同一图片只能点赞一次。
6. browse_history — 浏览历史表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| user_id |
INT (可为 NULL) |
用户 ID |
| image_id |
INT FK → images.id |
图片 ID |
| dwell_time |
INT |
停留时长 (秒) |
| from_page |
VARCHAR(200) |
来源页面 |
| created_at |
DATETIME |
浏览时间 |
支持匿名用户的浏览记录(user_id 可为 NULL)。
7. user_tag_prefs — 用户标签偏好表
| 字段 |
类型 |
说明 |
| user_id |
INT FK → users.id |
用户 ID |
| tag |
VARCHAR(50) |
标签名 |
| weight |
FLOAT DEFAULT 0 |
偏好权重 |
每次点赞/浏览时更新权重。点赞 +1,浏览 >=3s 根据停留时长 +1~3。约每 50 次浏览事件衰减 ~5%。
8. user_uploader_prefs — 用户上传者偏好表
| 字段 |
类型 |
说明 |
| user_id |
INT FK → users.id |
用户 ID |
| uploader_id |
INT FK → users.id |
上传者 ID |
| weight |
FLOAT DEFAULT 0 |
偏好权重 |
9. email_verifications — 邮件验证表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| user_id |
INT FK → users.id |
用户 ID |
| email |
VARCHAR(100) |
目标邮箱 |
| code |
VARCHAR(6) |
6 位验证码 |
| type |
ENUM(‘password_reset’,’email_change’,’profile_change’) |
验证类型 |
| expires_at |
DATETIME |
过期时间 (15 分钟) |
| used_at |
DATETIME |
使用时间 |
| created_at |
DATETIME |
发送时间 |
10. change_logs — 操作日志表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| admin_id |
INT |
操作者 ID |
| admin_name |
VARCHAR(50) |
操作者用户名 |
| action_type |
VARCHAR(50) |
操作类型 (28 种) |
| title |
VARCHAR(200) |
操作标题 |
| detail |
TEXT |
详细描述 |
| target_info |
TEXT |
目标信息 |
| created_at |
DATETIME |
操作时间 |
操作类型枚举:login_success, login_failed, register, upload, delete_image, ban_user, unban_user, mute_user, unmute_user, role_change, tag_update, setting_update, announcement_create, announcement_update, version_create, version_update, api_key_reset, email_send, storage_config, moderation_action, trash_restore, trash_delete, export, batch_delete, bot_upload, bot_moderation, profile_update, password_change。
11. announcements — 系统公告表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| title |
VARCHAR(200) |
公告标题 |
| content |
TEXT |
公告内容 |
| is_active |
TINYINT(1) |
是否显示 |
| is_pinned |
TINYINT(1) |
是否置顶 |
| sort_order |
INT |
排序 |
| created_at |
DATETIME |
发布时间 |
12. site_settings — 站点设置表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| key |
VARCHAR(50) UNIQUE |
设置键名 |
| value |
TEXT |
设置值 |
| type |
ENUM(‘text’,’bool’,’number’,’select’) |
值类型 |
| label |
VARCHAR(100) |
显示名称 |
| options |
TEXT |
select 类型的选项 |
| updated_at |
DATETIME |
更新时间 |
Key-Value 形式的灵活配置系统,管理员可通过后台直接编辑。
13. app_versions — 应用版本表
| 字段 |
类型 |
说明 |
| id |
INT AUTO_INCREMENT PK |
|
| platform |
VARCHAR(20) |
平台 (web/h5/ios/android/desktop/uniapp) |
| version |
VARCHAR(20) |
版本号 |
| build |
INT |
构建号 |
| title |
VARCHAR(200) |
版本标题 |
| description |
TEXT |
更新说明 |
| update_url |
VARCHAR(500) |
下载地址 |
| is_force |
TINYINT(1) |
是否强制更新 |
| is_active |
TINYINT(1) |
是否启用 |
| created_at |
DATETIME |
发布时间 |
索引策略
users.username — UNIQUE 索引(登录查询)
users.email — INDEX(密码重置查询)
users.api_token — UNIQUE 索引(API 鉴权)
images.user_id — INDEX(用户图片查询)
images.category_id — INDEX(分类筛选)
images.deleted_at — INDEX(软删除过滤)
images.created_at — INDEX(时间排序)
likes(user_id, image_id) — UNIQUE 联合索引
likes.image_id — INDEX(点赞数聚合)
image_tags.tag — INDEX(标签搜索)
browse_history.image_id — INDEX(浏览统计)
browse_history.user_id — INDEX(用户历史)
user_tag_prefs(user_id, tag) — UNIQUE 联合索引
user_uploader_prefs(user_id, uploader_id) — UNIQUE 联合索引