新增聊天室座驾系统

This commit is contained in:
pllx
2026-04-30 09:40:50 +08:00
parent 45ce8b2b2d
commit 3c95478097
32 changed files with 3982 additions and 53 deletions
@@ -0,0 +1,14 @@
{
"name": "chatroom-ride-development",
"version": "0.1.0",
"description": "聊天室座驾开发插件,沉淀新增座驾的代码位置、命名规则和测试清单。",
"interface": {
"displayName": "Chatroom Ride Development"
},
"skills": [
{
"name": "chatroom-ride-development",
"path": "skills/chatroom-ride-development/SKILL.md"
}
]
}
@@ -0,0 +1,53 @@
---
name: chatroom-ride-development
description: "开发 /Users/pllx/Web/Herd/chatroom 的聊天室座驾。适用于新增 ride_<key> 座驾商品、全屏 Canvas 特效、座驾音效、后台配置、前台座驾页面和进房欢迎语。"
---
# Chatroom Ride Development
## 适用场景
- 新增或修改聊天室座驾商品。
- 新增 `resources/js/effects/<key>.js` 全屏座驾特效。
- 调整座驾购买、续期、替换、入场欢迎语或后台价格/天数配置。
- 排查座驾进房后特效不播放、欢迎语不显示、购买记录不正确的问题。
## 必须遵守
- 座驾商品类型固定为 `ride`,商品 slug 固定为 `ride_<effect_key>`
- `<effect_key>` 必须同时出现在:
- `shop_items.slug`
- `ShopItem::rideKey()` 可解析结果
- `EffectBroadcast::TYPES`
- `resources/js/effects/effect-manager.js`
- `resources/js/effects/effect-sounds.js`
- `resources/js/effects/<effect_key>.js`
- 新增座驾默认通过迁移或 Seeder 写入 `shop_items`,字段至少包含名称、slug、图标、价格、`duration_days`、排序和 `welcome_message`
- `welcome_message` 支持 `{name}``{ride}`,输出前必须转义,不能直接信任后台输入。
- 当前版本只允许用户同时拥有一个 active 座驾;同款续购叠加有效期,不同款替换旧座驾并把旧记录置为 `cancelled`
- 不要另建座驾购买表;购买记录继续使用 `user_purchases`
## 新增座驾步骤
1. 新增全屏特效文件:`resources/js/effects/<effect_key>.js`
2. 在 `effect-manager.js` 注册模块加载和启动分支。
3. 在 `effect-sounds.js` 注册音效启动分支。
4. 在 `EffectBroadcast::TYPES` 加入 `<effect_key>`
5. 在迁移或 Seeder 中新增 `shop_items` 记录,slug 使用 `ride_<effect_key>`
6. 若后台预览需要,把按钮加入管理菜单预览区。
7. 更新座驾相关 PHPUnit 测试,至少覆盖列表、购买、续期、替换和进房触发。
## 验证清单
- `node --check resources/js/effects/<effect_key>.js`
- `node --check resources/js/effects/effect-manager.js`
- `node --check resources/js/effects/effect-sounds.js`
- `php artisan test --compact tests/Feature/RideControllerTest.php`
- 有进房逻辑变更时运行相关 `ChatControllerTest` 过滤用例。
- 修改 PHP 后运行 `vendor/bin/pint --dirty --format=agent`
## 特别注意
- 如果从 stash 恢复昨天的座驾特效,必须确认 untracked 父提交中的新特效文件也已恢复,不能只恢复已跟踪文件。
- `99a` 这种以数字开头的 key 在 JS 对象字面量里必须加引号。
- 新座驾的展示名可以是中文,但 effect key 必须保持小写短横线/数字/字母风格,避免前后端匹配失败。