# 轻论坛(LightForum)
一个轻量级 PHP 论坛程序,**支持注册、登录、发帖、回复**,自带**一键自动安装程序**,可自由选择数据库:
- **SQLite(默认)**:零配置,无需安装数据库,数据存为一个文件,适合个人站/小论坛
- **MySQL**:使用已有的 MySQL/MariaDB 服务,支持更大并发
- 环境要求:PHP 7.4+(建议 8.x),启用 `pdo` 扩展;SQLite 需 `pdo_sqlite`,MySQL 需 `pdo_mysql`
- 语言:PHP 原生 + HTML + CSS,无任何第三方依赖,解压即用
---
## 一、功能列表
| 功能 | 说明 |
|---|---|
| 一键安装 | 访问 `install.php`,自动检测环境、选择数据库类型、建库建表,一次点击完成安装 |
| 双数据库支持 | 安装时可选 SQLite 或 MySQL;选 MySQL 时若库不存在会自动创建 |
| 板块分类 | 内置闲聊/技术/求助/公告等板块,首页按板块筛选,发帖时选择板块 |
| 板块管理后台 | `admin.php`:管理员可新增/重命名/删除板块、调整排序 |
| 用户注册 | 用户名唯一、密码哈希存储、长度校验 |
| 用户登录/退出 | 弹窗式登录/注册(可切换 Tab、AJAX 无刷新提交),支持登录后返回原页面;含登录失败防爆破锁定、退出清理会话 |
| 修改密码 | 登录用户可在个人主页进入修改密码页,验证当前密码后设置新密码(至少 6 位),CSRF 防护 |
| 改名与更名卡 | 管理员后台可直接修改任意用户用户名,也可向用户发放「更名卡」道具;用户持更名卡可在个人主页自行改名(每次消耗 1 张),用户名 2-20 字符且唯一 |
| 管理员入口 | 用默认账号 admin 登录后顶栏显示「管理」「设置」;若登录后没出现入口,访问 fix_admin.php 一键修复(修复后删除该文件) |
| 发帖/编辑/删除 | 登录用户可发帖;作者或管理员可编辑、删除帖子 |
| 回复/删除回复 | 登录用户可回复(带楼号);作者或管理员可删除回复 |
| 帖子置顶 | 管理员可置顶/取消置顶,置顶帖在列表最前并带标记 |
| 关键词搜索 | 顶栏搜索框,按标题/内容模糊搜索,支持分页 |
| 用户个人主页 | 点击用户名查看资料(注册时间/发帖数/回复数)与 TA 的全部帖子 |
| 富文本编辑 | 发帖/回复使用内置多功能富文本编辑器(段落/字体/字号/加粗/斜体/下划线/删除线/上下标/颜色/背景色/对齐/缩进/列表/链接/图片/表格/引用/代码块/分隔线/特殊符号/表情),支持图片本地上传;帖子代码块自动高亮;服务端白名单净化防 XSS |
| 站内私信 | 收件箱/发件箱、未读角标、私信详情与回复、从个人主页发私信 |
| 帖子点赞 | 一键点赞/取消,被赞 +1 积分;列表与详情显示赞数 |
| 积分等级 | 发帖 +10、回复 +5、被赞 +3(数值可在后台调整);按积分划分 5 个等级(新手上路→论坛元老),全站显示徽章 |
| 邮箱验证 | 注册必填邮箱(后台可改选填),发送验证链接,验证状态在个人主页展示并可重发;后台可开启“需验证邮箱后才能发帖/回复” |
| 站点设置后台 | `admin_settings.php`:管理员网页上直接调整站点名、每页条数、开关注册、积分数值、等级名称与门槛、邮箱规则,保存即生效,可一键恢复默认 |
| 管理员账号 | 安装自动创建 admin,可管理任意帖子/回复、板块、置顶 |
| 数据迁移 | `migrate.php` 一键把 SQLite 数据迁移到 MySQL |
| 自动结构升级 | 旧版数据库访问时自动补齐新结构,无需手工操作 |
| 列表分页 | 帖子列表与回复均支持分页 |
| 安全防护 | PDO 预处理防 SQL 注入、htmlspecialchars 防 XSS、CSRF Token、密码 bcrypt 哈希、会话固定防护、权限校验 |
---
## 二、部署步骤(部署到你的 PHP 环境)
### 方式 A:本地开发(XAMPP / 宝塔 / phpStudy)
1. 把整个 `forum` 文件夹复制到网站根目录,例如:
- XAMPP:`C:\xampp\htdocs\forum`
- 宝塔面板:`/www/wwwroot/你的域名/forum`
2. 浏览器访问:`http://localhost/forum/install.php`
3. 环境检测通过后,选择数据库类型:
- **SQLite**:什么都不用填,直接点【⚡ 一键安装】
- **MySQL**:填写主机 / 端口 / 数据库名 / 用户名 / 密码,再点【⚡ 一键安装】(数据库不存在会自动创建)
4. 提示“安装成功”后,点击【进入论坛】即可使用
> 若提示“pdo_sqlite / pdo_mysql 未启用”:宝塔/phpStudy 到 PHP 设置中勾选对应扩展后重启;XAMPP 默认已开启。
>
> **邮箱验证说明**:注册时邮箱为必填(可在 config.php 改回选填),通过 PHP 的 `mail()` 函数发送验证链接。若你的服务器未配置邮件发送(如纯本地 PHP、未配置 SMTP 的主机),邮件可能发不出去——不影响注册与其他功能,可在 `config.php` 的 `send_verification_email()` 中自行接入 SMTP 发送库。默认不强制“验证后才能发帖”,如需强制把 `EMAIL_VERIFY_REQUIRED_TO_POST` 改为 `true`。
### 方式 B:PHP 内置开发服务器(临时体验)
如果你的电脑装了 PHP,也可在 `forum` 目录运行:
```bash
php -S localhost:8000
```
然后访问 `http://localhost:8000/install.php` 完成安装。
---
## 三、默认账号与权限
| 用户名 | 密码 | 权限 |
|---|---|---|
| `admin` | `admin123` | 管理员:可管理任意帖子/回复、板块、置顶 |
普通用户通过【注册】创建,只能编辑/删除**自己**的帖子和回复。登录后建议尽快注册并使用自己的账号。
---
## 四、从 SQLite 迁移到 MySQL
已用 SQLite 运行一段时间后想换 MySQL?使用内置迁移工具:
1. 浏览器访问 `http://localhost/forum/migrate.php`
2. 填写目标 MySQL 连接信息(数据库不存在会自动创建)
3. 勾选「迁移成功后把站点切换到 MySQL」→ 点【开始迁移】
4. 完成:用户/帖子/回复/点赞/私信全部搬运到 MySQL,站点即切换完成
- 迁移**不会删除**源 `data/lightforum.db`,想回退可直接删掉 `data/settings.php` 让站点回到 SQLite;
- 若目标库已存在论坛数据,可勾选「清空目标库论坛表」覆盖;
- 需要在服务器同时启用 `pdo_sqlite` 与 `pdo_mysql` 两个扩展。
---
## 五、目录结构
```
forum/
├── install.php # 一键自动安装程序(环境检测 + 数据库选择 + 建库建表)
├── migrate.php # SQLite → MySQL 数据迁移工具
├── admin.php # 管理后台(板块管理,仅管理员)
├── admin_settings.php # 站点设置后台(积分/等级/邮箱规则,仅管理员)
├── config.php # 配置、数据库连接(双驱动)、公共函数、自动结构升级、富文本净化
├── index.php # 首页:板块导航 + 帖子列表(置顶优先/分页/筛选)
├── register.php # 注册
├── login.php # 登录(含防爆破)
├── logout.php # 退出登录
├── profile.php # 用户个人主页(资料 + 积分等级 + 邮箱验证 + TA 的帖子)
├── like.php # 点赞 / 取消点赞(作者积分 +1/-1)
├── messages.php # 私信收件箱 / 发件箱 / 发送
├── message.php # 私信详情与回复
├── verify_email.php # 邮箱验证链接入口
├── post.php # 发帖(富文本 + 选板块)/ 编辑帖子(管理员可置顶)
├── view.php # 帖子详情 + 回复列表 + 置顶/编辑/删除操作
├── reply.php # 提交回复(富文本)
├── sticky.php # 置顶 / 取消置顶(仅管理员)
├── delete.php # 删除帖子(作者/管理员)
├── delete_reply.php # 删除回复(作者/管理员)
├── header.php # 公共头部模板(含管理入口)
├── footer.php # 公共底部模板
├── css/style.css # 界面样式(含登录/注册弹窗)
├── js/editor.js # 内置多功能富文本编辑器
├── js/modal.js # 登录/注册弹窗交互(AJAX 提交、Tab 切换)
├── js/highlight.js # 帖子代码块前端高亮
├── js/lightbox.js # 帖子图片点击放大(灯箱)
├── upload.php # 图片本地上传接口(仅登录+CSRF,JPG/PNG/GIF/WebP,≤2MB,上传后自动压缩)
├── change_password.php # 修改密码(验证旧密码+新密码强度+CSRF)
├── rename.php # 用户使用更名卡改名(消耗1张,CSRF)
└── uploads/ # 图片上传目录(首次上传时自动创建)
├── data/ # 数据目录(安装时自动创建,含防下载 .htaccess)
│ ├── settings.php # 安装配置(数据库类型与连接信息,自动生成)
│ └── lightforum.db # SQLite 数据库文件(仅 SQLite 模式)
└── README.md
```
---
## 六、常用配置
打开 `config.php` 顶部即可修改:
```php
define('SITE_NAME', '轻论坛'); // 站点名称(出厂默认值,后台“站点设置”可改)
define('POSTS_PER_PAGE', 10); // 每页帖子数(出厂默认值,后台可改)
define('REPLIES_PER_PAGE', 20); // 每页回复数(出厂默认值,后台可改)
define('LOGIN_MAX_ATTEMPTS', 5); // 登录失败锁定次数
define('LOGIN_LOCK_MINUTES', 10); // 登录锁定时间(分钟)
// 积分规则(出厂默认值,可在后台“站点设置”中修改并立即生效)
define('POINTS_NEW_POST', 10); // 发帖积分
define('POINTS_NEW_REPLY', 5); // 回复积分
define('POINTS_LIKED', 3); // 帖子被赞作者所得积分
// 邮箱规则(出厂默认值,可在后台“站点设置”中修改)
define('EMAIL_REQUIRED', true); // 注册是否必填邮箱(true=必填 / false=选填)
define('EMAIL_VERIFY_REQUIRED_TO_POST', false); // true=必须验证邮箱后才能发帖/回复
```
> 站点名、每页条数、开关注册、积分数值、等级名称/门槛、邮箱规则**建议直接在后台 `admin_settings.php` 修改**(保存即生效,无需改代码);以上常量为出厂默认值,仅当数据库中没有对应设置时生效。
数据库类型与连接信息存于 `data/settings.php`(由安装/迁移向导生成),不要手工编辑;要更换数据库请使用对应向导。
---
## 七、重新安装 / 备份 / 迁移
- **重新安装(清空数据 / 切换数据库)**:进入 `install.php`,展开“高级:重新安装”,勾选确认后点击即可重建所选数据库。
- **SQLite 备份**:直接备份 `data/lightforum.db` 这一个文件。
- **MySQL 备份**:在 MySQL 中用 `mysqldump` 导出:
```bash
mysqldump -u 用户名 -p 数据库名 > lightforum.sql
```
- **升级已有旧版**:无需任何操作——程序每次访问会自动检测并补齐新版结构(板块表、管理员标记、帖子板块/置顶字段、用户邮箱与积分、私信表、点赞表),老数据原样保留。
- **迁移服务器**:把整个 `forum` 目录复制到新环境,重新访问 `install.php` 选择与原安装一致的数据库类型即可(原数据保留)。
---
## 八、安全说明
- 所有 SQL 均使用预处理语句,防 SQL 注入;
- 所有输出经 `htmlspecialchars` 转义,防 XSS;
- 所有表单带 CSRF Token 校验,删除操作必须 POST 提交;
- 密码使用 `password_hash()`(bcrypt)存储,不保存明文;
- 编辑/删除均有权限校验:普通用户仅限本人内容,管理员可管理全部;
- MySQL 表使用 InnoDB + utf8mb4 + 外键级联删除;
- `data/` 目录写入 `.htaccess` 禁止直接访问(Apache);若使用 Nginx,请在站点配置中拒绝访问该目录:
```nginx
location ~ ^/forum/data/ { deny all; }
```
- `data/settings.php` 含 MySQL 密码,请务必确保该目录不可被 Web 直接访问(如上所述)。