feat: 彩票业务迁移并补全后台权限与代理结算体系

This commit is contained in:
2026-06-10 10:29:43 +08:00
parent bbdb69dabb
commit 1948b10fe6
108 changed files with 7083 additions and 5033 deletions

View File

@@ -11,28 +11,15 @@
侧栏与 `prd.*` 权限目录见 [`docs/admin-rbac.md`](docs/admin-rbac.md)。维护命令:`php artisan lottery:admin-auth-sync --audit`
## 数据库基线
## 数据库迁移
项目当前已经整理出一份**最终版基线结构**,并已将历史迁移链清理为 schema dump 模式
项目当前使用 **纯 migration 链** 维护 PostgreSQL 结构
- PostgreSQL 基线文件:[`database/schema/pgsql-schema.sql`](database/schema/pgsql-schema.sql)
- 适用场景:**新环境初始化**
- 后续 migration 目录`database/migrations/`
- 适用场景:**从当前基线之后继续新增结构变更**
- 新环境初始化:直接执行完整 migration
- 已有环境升级:继续通过新增 migration 演进
- 结构来源`database/migrations/`
推荐约定如下:
- 新环境初始化时,优先使用 Laravel schema dump让框架先加载 `database/schema/pgsql-schema.sql`,再执行该时间点之后的新迁移。
- 已上线或已有数据的环境,如果已经接受 schema dump 作为唯一基线,可不再保留历史 migration 文件。
- 之后的数据库结构演进,从当前 schema dump 往后继续追加新的 migration。
当数据库结构发生一轮阶段性稳定变更后,可重新生成基线:
```bash
php artisan schema:dump --database=pgsql
```
如果只是日常开发中的普通字段变更,仍然按正常方式新增 migration 即可;等累积到一段时间后,再统一刷新一次 schema dump。
不再依赖 `schema dump` 作为数据库基线,部署时也不需要先导入 SQL 基线文件。
## 统一数据库初始化
@@ -44,7 +31,7 @@ php artisan lottery:db-init
这条命令会自动完成:
- 执行 `migrate`让 Laravel 在空库时优先加载 `database/schema/pgsql-schema.sql`
- 执行 `migrate`直接跑完整 migration 链
- 执行生产安全的基础种子 `FoundationSeeder`
- 执行后台权限同步与体检 `lottery:admin-auth-sync --audit`
- 在非 `production` 环境默认补充联调用演示数据 `LocalDemoSeeder`
@@ -133,6 +120,12 @@ php artisan schedule:work
> 仅用系统 cron 每分钟执行一次 `schedule:run` **无法覆盖「每秒」的 `lottery:hall-countdown`**,开发大厅实时倒计时时请用 `schedule:work`(或生产上等价常驻调度进程)。
**队列消费者(推荐 `queue:work`,不要再用 `queue:listen`**
```bash
php artisan queue:work --tries=3 --timeout=120 --sleep=1
```
只做 HTTP / 降级轮询、不测 WebSocket 时:**终端 2、3 可先不开**;要完整大厅 WS**三项都开**
## 统一配置说明
@@ -146,6 +139,16 @@ php artisan schedule:work
- `REVERB_HOST`:浏览器连接 Reverb 时看到的主机名或 IP
- `SANCTUM_STATEFUL_DOMAINS`:允许带 Cookie 的前端来源列表
## 生产性能基线
为避免调度锁、大厅快照缓存与业务表争抢同一数据库,生产环境请至少满足:
- `CACHE_STORE=redis`
- `QUEUE_CONNECTION=redis`
- 常驻进程使用 `php artisan queue:work`,不要使用 `queue:listen`
若继续使用 database cache`schedule:work``withoutOverlapping()` / `onOneServer()` 锁、大厅 countdown 指纹缓存、以及大厅快照碎片缓存都会额外打数据库,容易放大高频调度的抖动。
如果你要用局域网地址访问,比如 `http://192.168.0.101:8000`,通常只需要:
1. 把 `APP_BIND_HOST``VITE_HOST``REVERB_SERVER_HOST` 改成 `0.0.0.0`