## 📖 项目简介
@author 若寒
@contact QQ: 1132111134
# 摸鱼搭子集合地
基于 PHP + MySQL 的匿名聊天室。访客用昵称进入,无需注册登录。支持多房间、图片/视频/文件、自定义头像与夜间模式。
当前版本:**v2.0**
- 前台:站点根目录
- 后台:`/admin/`
---
## 功能一览
### 前台
- 多聊天室,可上锁(密码进入)
- 文字、表情、图片、视频、文件
- 自定义昵称、颜色、头像
- 头像与聊天图片自动转为 WebP(动态 GIF 保留原格式)
- 消息撤回(2 分钟内)、增量刷新
- 夜间模式、在线用户列表
- 房间可要求「先设固定昵称再聊天」
### 后台
- 仪表盘、房间、用户、消息、文件
- 敏感词、统计、操作日志
- 功能开关(点一下即时保存)
- 主题色、公告、上传大小等参数
- **按 IP 锁定昵称**(可选):同一 IP 保存过昵称后不能再改
### 安全
- CSRF 防护
- 房间密码哈希存储(旧明文会在验证成功后自动升级)
- 上传目录禁止执行 PHP
- 自动识别域名 / HTTPS / 子目录,避免上传文件 404
---
## 运行环境
| 项目 | 要求 |
|------|------|
| PHP | 7.4 及以上(需 PDO MySQL) |
| 扩展 | `pdo_mysql`、`gd`(**必须支持 WebP**,即存在 `imagewebp`) |
| 数据库 | MySQL 5.7 / 8.0 或 MariaDB,字符集 `utf8mb4` |
| Web | Nginx 或 Apache,开启伪静态(Apache 用自带 `.htaccess` 即可) |
| 权限 | `uploads`、`cache`、`logs` 可写(755 或 775) |
宝塔:软件商店安装 PHP 后,在 PHP 设置里勾选 `fileinfo`、`gd`,并确认 gd 编译了 webp。
---
## 宝塔部署
### 1. 创建站点与数据库
1. 新建网站,PHP 选 7.4 或更高。
2. 创建 MySQL 数据库,记下库名、用户名、密码。
3. 将本项目全部文件上传到站点根目录。
### 2. 导入数据
- **新站**:phpMyAdmin 导入根目录 `shujuku.sql`。
- **旧站升级**:不要重复导入 SQL,只覆盖代码。程序会自动补齐头像、锁定昵称等字段。
### 3. 修改配置
编辑 `config.php` 顶部:
```php
define('DB_HOST', getenv('DB_HOST') ?: 'localhost');
define('DB_NAME', getenv('DB_NAME') ?: '你的数据库名');
define('DB_USER', getenv('DB_USER') ?: '数据库用户名');
define('DB_PASS', getenv('DB_PASS') ?: '数据库密码');
```
没有设置环境变量时,用后面的默认值。按你宝塔里的数据库改这四项即可。
站点地址会按当前访问域名自动识别,一般不用改 `SITE_URL`。
### 4. 目录权限
对以下目录设置 **755** 或 **775**(运行用户可写):
- `uploads/`
- `cache/`
- `logs/`
### 5. 上传大小
根目录 `.user.ini` 已包含:
```ini
upload_max_filesize=100M
post_max_size=100M
```
同时把宝塔 **Nginx 限制**(如 `client_max_body_size`)调到不小于 100M,否则大文件会被网关拦掉。
### 6. PHP 扩展自检
在服务器执行:
```bash
php -r "echo function_exists('imagewebp') ? 'WebP OK' : 'WebP 未开启';"
```
显示 `WebP 未开启` 时,头像和图片转换会失败。需重装/编译带 webp 的 gd。
---
## 目录结构
```
├── index.php 聊天前台
├── api.php 前台接口
├── config.php 配置(改数据库)
├── shujuku.sql 全新安装用的数据库
├── admin/ 管理后台
├── includes/ 业务类
├── assets/ 前台静态资源(含本地 Font Awesome)
├── uploads/ 用户上传(图片 / 视频 / 文件 / 头像)
├── cache/ 缓存与 PHP Session
└── logs/ 运行日志
```
---
## 使用说明
### 前台
打开网站即可聊天。点齿轮进入个人设置:改昵称、颜色、上传头像。
点「随机昵称」只填入输入框,必须再点 **保存** 才会生效。
保存后刷新不应再变成另一个随机名。身份靠浏览器 Cookie 记住。
### 后台
地址:`https://你的域名/admin/`
导入 `shujuku.sql` 后,默认管理员用户名为 **`admin`**。
请尽快在后台「个人资料」里修改密码。若不知道原密码,可在 phpMyAdmin 的 `admins` 表用 PHP `password_hash` 生成新哈希后改掉。
常用开关在 **系统设置 → 功能开关**(点一下即保存):
- 图片 / 视频 / 文件上传
- 表情、暗黑模式、在线用户
- **按 IP 锁定昵称**:同一 IP 点过保存后不能再改名(默认关闭)
房间列表可单独开关「需固定昵称」:开启后,进该房间必须先设固定昵称。
---
## 升级注意
覆盖代码前建议备份:`config.php`、`uploads/`、数据库。
覆盖后让用户 **强制刷新** 一次前台(Ctrl+F5)。
新字段由程序自动 `ALTER`,无需手工改表。
---
## 常见问题
**图片/头像 404**
确认 `uploads` 可写,且用当前域名访问(不要混用 http/https 或带/不带 www 的两套地址)。程序会按请求自动生成路径。
**头像上传提示 GD/WebP**
PHP 未启用 gd 或 gd 不支持 webp。见上方「PHP 扩展自检」。
**刷新后昵称变了**
确认浏览器没有禁用 Cookie。不要用无痕窗口对比两个窗口的身份。
**同一 IP 不能改名**
后台「按 IP 锁定昵称」已打开。关掉即可恢复修改。办公室/校园共用出口 IP 时请谨慎开启。
**上传失败、非 JSON 响应**
多半是 Nginx/PHP 体积限制或 `uploads` 权限。看宝塔错误日志和 `logs/`。
---
## 许可与说明
学习与研究用途。部署到公网请自行做好备份、改默认后台密码,并遵守当地法律法规。




