Xiuno BBS 数据库表结构详解
本文档只记载所有核心表结构,不包括任何由插件拓展出的新字段。

核心表结构
1. 用户表 (bbs_user)
存储论坛所有注册用户的基本信息。
| 字段名 |
类型 |
默认值 |
说明 |
| uid |
int(11) unsigned |
AUTO_INCREMENT |
用户编号,主键 |
| gid |
smallint(6) unsigned |
0 |
用户组编号,关联 bbs_group.gid |
| email |
char(40) |
'' |
邮箱,唯一索引 |
| username |
char(32) |
'' |
用户名,唯一索引,不可重复 |
| realname |
char(16) |
'' |
真实姓名,预留字段 |
| password |
char(32) |
'' |
密码(MD5加密) |
| password_sms |
char(16) |
'' |
手机短信验证码,预留字段 |
| salt |
char(16) |
'' |
密码混淆盐值 |
| mobile |
char(11) |
'' |
手机号,预留字段 |
| qq |
char(15) |
'' |
QQ号,预留字段 |
| threads |
int(11) |
0 |
发帖数 |
| posts |
int(11) |
0 |
回帖数 |
| credits |
int(11) |
0 |
积分,预留字段 |
| golds |
int(11) |
0 |
金币,虚拟货币 |
| rmbs |
int(11) |
0 |
点券,预留字段 |
| create_ip |
int(11) unsigned |
0 |
创建时IP(ip2long转换) |
| create_date |
int(11) unsigned |
0 |
创建时间(UNIX时间戳) |
| login_ip |
int(11) unsigned |
0 |
最后登录IP |
| login_date |
int(11) unsigned |
0 |
最后登录时间 |
| logins |
int(11) unsigned |
0 |
登录次数 |
| avatar |
int(11) unsigned |
0 |
用户最后更新头像时间 |
索引:
- PRIMARY KEY (uid)
- UNIQUE KEY username (username)
- UNIQUE KEY email (email)
- KEY gid (gid)
默认数据:
- 默认管理员账号:uid=1, username=admin, password=d98bb50e808918dd45a8d92feafc4fa3, salt=123456
细节:
avatar 字段如果为0,则表示没有头像,如果不是0,则应该从 view/avatar/ 目录下获取头像文件。
username 字段同时作为用户名和显示名称
头像图片文件名和路径的计算:
$filename = "$uid.png"; //文件名
$dir = substr(sprintf("%09d", $uid), 0, 3).'/'; //目录名
$path = $conf['upload_path'].'avatar/'.$dir; //文件路径
$url = $conf['upload_url'].'avatar/'.$dir.$filename; //文件URL
2. 用户组表 (bbs_group)
定义用户权限组,控制不同用户组的操作权限。
十分遗憾的是,xiuno bbs的用户权限系统做的很失败,跟垃圾一样,没有和其他论坛的权限系统那么完善和可扩展,导致插件需要在自己的设计中考虑到用户权限,并在插件设置那边进行配置。这导致了权限碎片化。
| 字段名 |
类型 |
默认值 |
说明 |
| gid |
smallint(6) unsigned |
- |
用户组编号,主键 |
| name |
char(20) |
'' |
用户组名称 |
| creditsfrom |
int(11) |
0 |
积分下限 |
| creditsto |
int(11) |
0 |
积分上限 |
| allowread |
int(11) |
0 |
允许访问 |
| allowthread |
int(11) |
0 |
允许发主题 |
| allowpost |
int(11) |
0 |
允许回帖 |
| allowattach |
int(11) |
0 |
允许上传附件 |
| allowdown |
int(11) |
0 |
允许下载附件 |
| allowtop |
int(11) |
0 |
允许置顶 |
| allowupdate |
int(11) |
0 |
允许编辑 |
| allowdelete |
int(11) |
0 |
允许删除 |
| allowmove |
int(11) |
0 |
允许移动 |
| allowbanuser |
int(11) |
0 |
允许禁止用户 |
| allowdeleteuser |
int(11) |
0 |
允许删除用户 |
| allowviewip |
int(11) unsigned |
0 |
允许查看用户敏感信息 |
预设用户组: | gid | 名称 | 权限说明 | |-----|------|----------| | 0 | 游客组 | 仅可浏览和回帖 | | 1 | 管理员组 | 全部权限 | | 2 | 超级版主组 | 全部权限(除删除用户) | | 4 | 版主组 | 版块管理权限 | | 5 | 实习版主组 | 有限管理权限 | | 6 | 待验证用户组 | 仅可浏览和回帖 | | 7 | 禁止用户组 | 无任何权限 | | 101及以上 | 会员 | 普通用户权限 |
3. 版块表 (bbs_forum)
存储论坛版块信息。
| 字段名 |
类型 |
默认值 |
说明 |
| fid |
int(11) unsigned |
AUTO_INCREMENT |
版块ID,主键 |
| name |
char(16) |
'' |
版块名称 |
| rank |
tinyint(3) unsigned |
0 |
显示顺序,倒序排列,数字越大越靠前 |
| threads |
mediumint(8) unsigned |
0 |
主题数 |
| todayposts |
mediumint(8) unsigned |
0 |
今日发帖数,每日凌晨清零 |
| todaythreads |
mediumint(8) unsigned |
0 |
今日发主题数,每日凌晨清零 |
| brief |
text |
'' |
版块简介,允许HTML |
| announcement |
text |
'' |
版块公告,允许HTML |
| accesson |
int(11) unsigned |
0 |
是否开启权限控制 |
| orderby |
tinyint(11) |
0 |
默认列表排序:0=顶贴时间,1=发帖时间 |
| create_date |
int(11) unsigned |
0 |
版块创建时间 |
| icon |
int(11) unsigned |
0 |
版块图标最后更新时间 |
| moduids |
char(120) |
'' |
版主UID列表,逗号分隔,最多10个 |
| seo_title |
char(64) |
'' |
SEO标题,预留字段 |
| seo_keywords |
char(64) |
'' |
SEO关键词,预留字段 |
索引:
细节:
icon 字段如果为0,则表示没有图标,如果不是0,则应该从 view/forum/ 目录下获取图标文件。
4. 版块访问权限表 (bbs_forum_access)
当版块开启权限控制时,定义各用户组的访问权限。
| 字段名 |
类型 |
默认值 |
说明 |
| fid |
int(11) unsigned |
0 |
版块ID |
| gid |
int(11) unsigned |
0 |
用户组ID |
| allowread |
tinyint(1) unsigned |
0 |
允许查看 |
| allowthread |
tinyint(1) unsigned |
0 |
允许发主题 |
| allowpost |
tinyint(1) unsigned |
0 |
允许回复 |
| allowattach |
tinyint(1) unsigned |
0 |
允许上传附件 |
| allowdown |
tinyint(1) unsigned |
0 |
允许下载附件 |
索引:
说明: 此表与 bbs_forum.accesson 字段配合使用,当 accesson=1 时生效。
5. 主题表 (bbs_thread)
存储论坛主题(帖子)信息。
| 字段名 |
类型 |
默认值 |
说明 |
| fid |
smallint(6) |
0 |
版块ID |
| tid |
int(11) unsigned |
AUTO_INCREMENT |
主题ID,主键 |
| top |
tinyint(1) |
0 |
置顶级别:0=普通,1-3=置顶 |
| uid |
int(11) unsigned |
0 |
发帖用户ID |
| userip |
int(11) unsigned |
0 |
发帖时用户IP |
| subject |
char(128) |
'' |
主题标题 |
| create_date |
int(11) unsigned |
0 |
发帖时间 |
| last_date |
int(11) unsigned |
0 |
最后回复时间 |
| views |
int(11) unsigned |
0 |
查看次数 |
| posts |
int(11) unsigned |
0 |
回帖数 |
| images |
tinyint(6) |
0 |
附件图片数 |
| files |
tinyint(6) |
0 |
附件文件数 |
| mods |
tinyint(6) |
0 |
版主操作次数 |
| closed |
tinyint(1) unsigned |
0 |
是否关闭,关闭后不可回帖编辑 |
| firstpid |
int(11) unsigned |
0 |
首帖PID |
| lastuid |
int(11) unsigned |
0 |
最近回复用户ID |
| lastpid |
int(11) unsigned |
0 |
最后回复PID |
索引:
- PRIMARY KEY (tid)
- KEY (lastpid) - 最后回复排序
- KEY (fid, tid) - 发帖时间排序
- KEY (fid, lastpid) - 顶贴时间排序
置顶级别说明:
- 0:普通主题
- 1:版块置顶
- 2:未使用,猜测为分类置顶
- 3:全局置顶
细节:
- files字段是被使用的,但images字段未必会使用(取决于使用的帖子编辑器插件)
6. 置顶主题表 (bbs_thread_top)
专门管理置顶主题,提高查询效率。
| 字段名 |
类型 |
默认值 |
说明 |
| fid |
smallint(6) |
0 |
版块ID |
| tid |
int(11) unsigned |
0 |
主题ID |
| top |
int(11) unsigned |
0 |
置顶级别 |
索引:
- PRIMARY KEY (tid)
- KEY (top, tid) - 全局置顶查询
- KEY (fid, top) - 版块置顶查询
7. 帖子表 (bbs_post)
存储主题的所有帖子内容(包括首帖和回复)。
| 字段名 |
类型 |
默认值 |
说明 |
| tid |
int(11) unsigned |
0 |
主题ID |
| pid |
int(11) unsigned |
AUTO_INCREMENT |
帖子ID,主键 |
| uid |
int(11) unsigned |
0 |
发帖用户ID |
| isfirst |
int(11) unsigned |
0 |
是否为首帖 |
| create_date |
int(11) unsigned |
0 |
发帖时间 |
| userip |
int(11) unsigned |
0 |
发帖时用户IP |
| images |
smallint(6) |
0 |
附件图片数 |
| files |
smallint(6) |
0 |
附件文件数 |
| doctype |
tinyint(3) |
0 |
内容类型 |
| quotepid |
int(11) |
0 |
引用的帖子PID |
| message |
longtext |
'' |
原始内容 |
| message_fmt |
longtext |
'' |
格式化后的HTML内容 |
索引:
- PRIMARY KEY (pid)
- KEY (tid, pid) - 主题内帖子排序
- KEY (uid) - 用户回帖查询
内容类型 (doctype):
- 0:HTML(需要插件支持)
- 1:纯文本
- 2:Markdown(需要插件支持)
- 3:BBCode / UBB(需要插件支持)
8. 附件表 (bbs_attach)
存储帖子中的附件信息。
| 字段名 |
类型 |
默认值 |
说明 |
| aid |
int(11) unsigned |
AUTO_INCREMENT |
附件ID,主键 |
| tid |
int(11) |
0 |
主题ID |
| pid |
int(11) |
0 |
帖子ID |
| uid |
int(11) |
0 |
上传用户ID |
| filesize |
int(8) unsigned |
0 |
文件大小(字节) |
| width |
mediumint(8) unsigned |
0 |
图片宽度,>0表示图片 |
| height |
mediumint(8) unsigned |
0 |
图片高度 |
| filename |
char(120) |
'' |
保存后的文件名 |
| orgfilename |
char(120) |
'' |
原始文件名 |
| filetype |
char(7) |
'' |
文件类型:image/txt/zip |
| create_date |
int(11) unsigned |
0 |
上传时间 |
| comment |
char(100) |
'' |
文件注释 |
| downloads |
int(11) |
0 |
下载次数 |
| credits |
int(11) |
0 |
需要积分,预留 |
| golds |
int(11) |
0 |
需要金币,预留 |
| rmbs |
int(11) |
0 |
需要点券,预留 |
| isimage |
tinyint(1) |
0 |
是否为图片 |
索引:
- PRIMARY KEY (aid)
- KEY pid (pid) - 帖子附件查询
- KEY uid (uid) - 用户附件查询
9. 我的主题表 (bbs_mythread)
记录用户参与的主题,用于快速查询用户发帖。
| 字段名 |
类型 |
默认值 |
说明 |
| uid |
int(11) unsigned |
0 |
用户ID |
| tid |
int(11) unsigned |
0 |
主题ID |
索引:
- PRIMARY KEY (uid, tid) - 联合主键,确保唯一性
说明: 每个主题不管回复多少次,只记录一次。数据量大时建议分区。
10. 我的回帖表 (bbs_mypost)
记录用户的回帖,用于快速查询用户回复。
| 字段名 |
类型 |
默认值 |
说明 |
| uid |
int(11) unsigned |
0 |
用户ID |
| tid |
int(11) unsigned |
0 |
主题ID |
| pid |
int(11) unsigned |
0 |
帖子ID |
索引:
- PRIMARY KEY (uid, pid) - 联合主键
- KEY (tid) - 主题查询
说明: 数据量大时建议分区。
11. 会话表 (bbs_session)
存储用户会话信息。
| 字段名 |
类型 |
默认值 |
说明 |
| sid |
char(32) |
'0' |
会话ID,主键 |
| uid |
int(11) unsigned |
0 |
用户ID,未登录为0 |
| fid |
tinyint(3) unsigned |
0 |
所在版块 |
| url |
char(32) |
'' |
当前访问URL |
| ip |
int(11) unsigned |
0 |
用户IP |
| useragent |
char(128) |
'' |
用户浏览器信息 |
| data |
char(255) |
'' |
会话数据 |
| bigdata |
tinyint(1) |
0 |
是否有大数据 |
| last_date |
int(11) unsigned |
0 |
上次活动时间 |
索引:
- PRIMARY KEY (sid)
- KEY ip (ip)
- KEY fid (fid)
- KEY uid_last_date (uid, last_date)
说明: 会话数据会缓存到 runtime 表中,提高访问效率。
12. 会话数据表 (bbs_session_data)
存储会话的超大数据。
| 字段名 |
类型 |
默认值 |
说明 |
| sid |
char(32) |
'0' |
会话ID,主键 |
| last_date |
int(11) unsigned |
0 |
上次活动时间 |
| data |
text |
'' |
超大会话数据 |
索引:
说明: 当 bbs_session.bigdata=1 时,大数据存储在此表。
13. 版主操作日志表 (bbs_modlog)
记录版主的管理操作。
| 字段名 |
类型 |
默认值 |
说明 |
| logid |
int(11) unsigned |
AUTO_INCREMENT |
日志ID,主键 |
| uid |
int(11) unsigned |
0 |
版主用户ID |
| tid |
int(11) unsigned |
0 |
主题ID |
| pid |
int(11) unsigned |
0 |
帖子ID |
| subject |
char(32) |
'' |
主题标题 |
| comment |
char(64) |
'' |
版主评价 |
| rmbs |
int(11) |
0 |
加减点券,预留 |
| create_date |
int(11) unsigned |
0 |
操作时间 |
| action |
char(16) |
'' |
操作类型:top/delete/untop |
索引:
- PRIMARY KEY (logid)
- KEY (uid, logid) - 版主操作查询
- KEY (tid) - 主题操作查询
细节:
- 该表几乎没有被原装xiuno bbs使用,主要由插件使用。
14. 键值存储表 (bbs_kv)
持久化的键值对数据存储。
| 字段名 |
类型 |
默认值 |
说明 |
| k |
char(32) |
'' |
键名,主键 |
| v |
mediumtext |
'' |
值 |
| expiry |
int(11) unsigned |
0 |
过期时间 |
索引:
用途: 存储系统配置、插件数据等持久化信息。
15. 缓存表 (bbs_cache)
临时数据缓存存储。
| 字段名 |
类型 |
默认值 |
说明 |
| k |
char(32) |
'' |
缓存键名,主键 |
| v |
mediumtext |
'' |
缓存值 |
| expiry |
int(11) unsigned |
0 |
过期时间 |
索引:
用途: 存储临时数据,可定期清理过期数据。如果conf/conf.php中设置$conf['cache']['type']为mysql,则此表用于缓存来保持缓存机制的可用性。
注意: 【缺陷】千万不要设置$conf['cache']['enable']为false,否则论坛功能可能会有故障。
16. 队列表 (bbs_queue)
临时队列数据存储。
| 字段名 |
类型 |
默认值 |
说明 |
| queueid |
int(11) unsigned |
0 |
队列ID |
| v |
int(11) |
0 |
队列数据(仅支持整数) |
| expiry |
int(11) unsigned |
0 |
过期时间,0表示不过期 |
索引:
- UNIQUE KEY (queueid, v)
- KEY (expiry)
用途: 实现简单的队列功能,如消息队列、任务队列等。
17. 表统计表 (bbs_table_day)
记录大表每日的最大ID和数量,用于数据分区和冷热数据分离。
| 字段名 |
类型 |
默认值 |
说明 |
| year |
smallint(11) unsigned |
0 |
年 |
| month |
tinyint(11) unsigned |
0 |
月 |
| day |
tinyint(11) unsigned |
0 |
日 |
| create_date |
int(11) unsigned |
0 |
时间戳 |
| table |
char(16) |
'' |
表名 |
| maxid |
int(11) unsigned |
0 |
最大ID |
| count |
int(11) unsigned |
0 |
记录总数 |
索引:
- PRIMARY KEY (year, month, day, table)
说明:
- 由计划任务每日凌晨1点执行更新
- 用于优化大数据表的查询性能
- 可有效过滤冷热数据
表关系图
bbs_user (用户)
├── bbs_group (用户组) - gid
├── bbs_thread (主题) - uid
├── bbs_post (帖子) - uid
├── bbs_attach (附件) - uid
├── bbs_mythread (我的主题) - uid
├── bbs_mypost (我的回帖) - uid
├── bbs_session (会话) - uid
└── bbs_modlog (操作日志) - uid
bbs_forum (版块)
├── bbs_thread (主题) - fid
├── bbs_forum_access (访问权限) - fid
└── bbs_session (会话) - fid
bbs_thread (主题)
├── bbs_post (帖子) - tid
├── bbs_attach (附件) - tid
├── bbs_thread_top (置顶) - tid
├── bbs_mythread (我的主题) - tid
├── bbs_mypost (我的回帖) - tid
└── bbs_modlog (操作日志) - tid
bbs_post (帖子)
└── bbs_attach (附件) - pid
数据安全
密码存储
密码采用 MD5 + Salt 方式加密:
$password_md5 = md5(md5($password) . $salt)
【缺陷】
但最大的问题也在这里:
- md5已经被证明存在安全问题,不建议使用
- 为什么:
- MD5算法存在碰撞攻击风险,且计算速度过快,容易被暴力破解
- 那为什么还要继续用md5:
- 因为一种合规性要求,认为数据要在传输的时候就加密,认为这样可以防止密码被泄漏
- 而什么加密方式或者说是哈希方式是可以轻松在浏览器里实现的?对,就是md5
- xiuno bbs用了个jquery的md5函数,可以在浏览器里实现md5加密
- 而这个就是偶尔发生的“加密后长度有问题”错误的根源
- 每个用户会分配一个专属于用户的salt,存储在用户表里,而不是通过统一salt加密
- 这导致如果没有小心的编程,在使用user_read或db_find_one等函数的时候,md5 hash与salt都会同时出现
- 这会导致敏感信息暴露在外的风险
- 例如在API场合就会有这样的可能性
- 例如在
thread-{tid}.htm?ajax=1的API响应,其中thread部分会带有一个user部分,而该部分并没有进行过滤,导致密码hash与salt泄漏
- 在自己设计的时候高度建议使用
password_hash()函数来加密密码
IP存储
IP地址使用 ip2long() 转换为整数存储,节省空间并提高查询效率。
敏感信息
- 用户密码、手机号等敏感信息需谨慎处理
allowviewip 权限控制敏感信息查看
- 建议定期备份重要数据
扩展字段
以下字段为预留扩展字段,可根据需求进行二次开发:
bbs_user.mobile - 手机号
bbs_user.qq - QQ号
bbs_user.credits - 积分系统 - 经验值
bbs_user.golds - 积分系统 - 虚拟货币
bbs_user.rmbs - 积分系统 - 点券(用于充值系统)
bbs_attach.credits - 附件下载积分限制
bbs_attach.golds - 附件下载金币限制
bbs_modlog.rmbs - 版主奖励系统