diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 7aee6ce..fc6a68e 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1,7 +1,6 @@ # ChatRoom 开发计划与注意事项 > **技术栈**:Laravel 12 · PHP 8.4 · Laravel Reverb (WebSocket) · Redis · MySQL 8.0 · Laravel Horizon -> **原项目**:`/Users/pllx/Web/chat/hp0709`(VBScript ASP + MS Access 聊天室) > **目标域名**:`http://chatroom.test`(Herd 自动配置)| `https://chat.ay.lc`(生产环境) --- @@ -463,8 +462,6 @@ routes/ - [ ] **滚动公告管理**(后台 CRUD,`ScrollAd` 模型已建,界面待完成) - [ ] **好友系统**(`FriendCall` / `FriendRequest` 模型已建,Controller 待完成) - [ ] **婚姻系统**(`Marriage` 模型已建,界面待完成) -- [ ] **历史数据迁移**(从 Access 导入旧用户数据:GBK→UTF-8 转换) -- [ ] **密码兼容过渡**(旧 MD5 用户登录时自动升级为 bcrypt) - [ ] **单元测试**(核心 Service 层测试覆盖率) - [ ] **Flash 游戏替代**(`game/`、`pig/` 等 .swf 文件,考虑 HTML5/Canvas 重写) @@ -472,39 +469,32 @@ routes/ ## 七、注意事项 -### 7.1 密码兼容策略 +### 7.1 密码策略 -- 导入旧数据时,`password` 字段存原始 MD5 值(32位字符串) -- 登录时双模式验证:`md5($input) === $storedPass` 成功后升级为 `bcrypt` -- 新注册用户直接用 `bcrypt`(`Hash::make()`) +- 所有用户密码使用 `bcrypt`(`Hash::make()`) +- 登录时使用 `Hash::check()` 验证 -### 7.2 字符编码 +### 7.2 实时推送机制 -- 原 Access 数据库为 **GBK 编码** -- 所有 MySQL 表必须 `utf8mb4_unicode_ci` -- 导入历史数据前转换: - ```bash - iconv -f GBK -t UTF-8 原文件.csv > 目标文件_utf8.csv - ``` +**聊天室所有状态变更均通过 Reverb WebSocket 广播**,无需轮询刷新。 -### 7.3 REFRESH.ASP 已废弃 +> [!NOTE] +> 历史上基于 `` 的 6秒刷新方案已被完全取代,任何涉及聊天室状态更新的功能都应通过 Event → Broadcasting 实现,**禁止在实现中引入轮询逻辑**。 -原系统的 6 秒 `` **完全由 Reverb WebSocket 实时推送取代**,无需任何轮询逻辑。 +### 7.3 Redis 状态层设计 -### 7.4 Application 对象替代 +| 数据 | Redis Key 格式 | 说明 | +| ------------ | ------------------------- | -------------------------- | +| 在线用户列表 | `room:{id}:users` Hash | 值为用户信息 JSON | +| 消息环形缓冲 | `room:{id}:messages` List | 最多保留 200 条 | +| 房间基本信息 | `room:{id}:info` String | JSON 快照 | +| 并发锁 | `Cache::lock("key", 10)` | 使用 `->block(5, fn)` 实现 | -| 原 ASP | Laravel 替代 | -| ------------------------------- | --------------------------------------------- | -| `Application("_user_list")` | `Redis::hgetall("room:{id}:users")` | -| `Application("_says")` 环形缓冲 | `Redis::lrange("room:{id}:messages", 0, 199)` | -| `Application("_room_list")` | `Redis::get("room:{id}:info")` + `rooms` 表 | -| `Application.Lock/Unlock` | `Cache::lock("key", 10)->block(5, fn)` | - -### 7.5 Flash 游戏(暂不处理) +### 7.4 Flash 游戏(暂不处理) `game/`、`pig/`、`Gupiao/` 等目录内的 `.swf` Flash 文件现代浏览器已不支持,**本期不做转换**。 -### 7.6 AI 机器人多厂商支持 +### 7.5 AI 机器人多厂商支持 `AiChatService` 支持以下 Provider,通过 `ai_provider_configs` 后台配置切换: @@ -514,7 +504,7 @@ routes/ | `deepseek` | `deepseek-chat` | 国产低成本,兼容 OpenAI 接口 | | `gemini` | `gemini-1.5-flash` | Google Gemini | -### 7.7 商店商品类型说明 +### 7.6 商店商品类型说明 | type | slug 示例 | 说明 | | ---------- | ---------------- | ---------------------- | @@ -524,7 +514,7 @@ routes/ --- -### 7.8 积分流水系统 — 开发者使用指南 ⭐ +### 7.7 积分流水系统 — 开发者使用指南 ⭐ > [!IMPORTANT] > **铁律**:所有涉及修改用户 `exp_num`(经验)、`jjb`(金币)、`meili`(魅力)的操作, @@ -675,8 +665,3 @@ php artisan horizon:terminate # 清理所有缓存 php artisan optimize:clear ``` - ---- - -> 原 ASP 源码参考路径:`/Users/pllx/Web/chat/hp0709/` -> 数据库 SQL 参考:`/Users/pllx/Web/chat/hp0709_php/database.sql`