# 默认数据说明

执行 `pnpm db:migrate` 后数据库仅有**表结构**；执行 **`pnpm db:seed`** 后会写入下文默认数据。
种子脚本位置：`apps/api/prisma/seed.ts`。

> **注意**：生产环境务必修改密码、`JWT_SECRET`，勿长期使用默认管理员密码。

---

## migrate 与 seed 的区别

| 命令 | 作用 |
|------|------|
| `pnpm db:migrate` | 按 Prisma 迁移**建表 / 改表**（用户、赛事、盘口、注单等） |
| `pnpm db:seed` | 在已有表结构中**写入演示账号、赛事、赔率、内容等** |

推荐顺序：先 `db:migrate`，再 `db:seed`。  
种子多为 **upsert**：重复执行一般不会重复创建用户，但会补全赛事、48 强夺冠盘等。

---

## 一、默认账号

| 用户名 | 密码 | 角色 | 说明 |
|--------|------|------|------|
| `admin` | `Admin@123` | 平台管理员 | 绑定 `SUPER_ADMIN` 角色 |
| `matchadmin` | `MatchAdmin@123` | 赛事管理员 | 仅 dev seed，`MATCH_ADMIN` 角色 |
| `financeadmin` | `FinanceAdmin@123` | 财务管理员 | 仅 dev seed，`FINANCE_ADMIN` 角色 |
| `support1` | `Support@123` | 客服/查询员 | 仅 dev seed，`SUPPORT` 角色 |
| `agent1` | `Agent@123` | 一级代理 | 仅 dev seed 写入，授信额度 **100,000** |
| `agent2` | `Agent@123` | 二级代理 | 仅 dev seed 写入，上级为 agent1，授信 **30,000** |
| `player1` | `Player@123` | 玩家 | 仅 dev seed 写入，挂靠 agent1 |

生产模式 seed 只写入 `admin` 和赛事目录数据，不写入代理、玩家、充值流水或注单。

| 入口 | 地址 |
|------|------|
| 管理后台（admin / agent1 / agent2） | http://localhost:5174 |
| 玩家前台（player1） | http://localhost:5173 |

| 接口 | 路径 |
|------|------|
| 管理端登录 | `POST /api/manage/auth/login` |
| 玩家端登录 | `POST /api/player/auth/login` |

---

## 二、默认环境与端口

| 项 | 默认值 |
|----|--------|
| API | http://localhost:3000 ，全局前缀 `/api` |
| Swagger | http://localhost:3000/api/docs |
| 管理后台 | http://localhost:5174 |
| 玩家前台 | http://localhost:5173 |
| Docker PostgreSQL | 用户/密码/库：`thebet365` @ `localhost:5432` |
| Docker Redis | `localhost:6379`（当前 API 逻辑以 Postgres 为主） |

`apps/api/.env` 模板见根目录 `.env.example`，主要项：

| 变量 | 示例 | 说明 |
|------|------|------|
| `DATABASE_URL` | `postgresql://thebet365:thebet365@localhost:5432/thebet365` | 数据库连接 |
| `JWT_SECRET` | 长随机串 | **生产必须修改** |
| `JWT_PLAYER_EXPIRES` | `24h` | 玩家 Token |
| `JWT_ADMIN_EXPIRES` | `2h` | 管理员 Token |
| `JWT_AGENT_EXPIRES` | `8h` | 代理 Token |
| `PORT` | `3000` | API 端口 |
| `UPLOAD_DIR` | 空 | 默认 `apps/api/uploads` |

---

## 三、默认赛事与盘口

各玩法判赢规则与 18 种盘口完整说明见 [投注玩法说明.md](./投注玩法说明.md)。

### 联赛

| 代码 | 名称 |
|------|------|
| `WC2026` | 2026 世界杯（加拿大、墨西哥、美国） |

### 已发布场次

- **世界杯小组赛 72 场**：含 2026-06 固定日期、场馆、分组、球队中英文名。
- 球队图片使用公开 FlagCDN 国旗 URL，例如 `https://flagcdn.com/fr.svg`；不再使用旧的赛事图片源。
- 默认赛事全部为非热门赛事，玩家首页不会因为 seed 数据自动出现热门赛事。

每场在尚无盘口时会自动创建演示玩法，包括但不限于：

- 全场 / 半场：独赢、让球、大小、单双  
- 全场：波胆（多档比分选项）

默认足球盘口模板与赛事 seed **不创建** `HT_CORRECT_SCORE`（上半场波胆）和 `SH_CORRECT_SCORE`（下半场波胆）。这两个盘口类型仍保留在系统识别能力中，便于兼容历史数据或后续手动扩展。

赔率均为种子脚本中的**示例数值**，可在管理后台赛事相关流程中调整（非冠军盘）。

### 世界杯 48 强夺冠盘

| 项 | 说明 |
|----|------|
| 数据来源 | `apps/api/src/domains/catalog/wc2026-outright-teams.ts` |
| 队伍数 | **48** 支，含排名与中英文名 |
| 默认赔率 | 如法国 4.95、英格兰 6.3、苏格兰 2500 等 |
| 玩家端 | 投注页 `/bet` → **「优胜冠军」**：按后台已发布赛事折叠展示，多赛事可分别展开；选项过多时点击 **加载更多**（须玩家账号） |
| 管理端 | 菜单 **「优胜冠军」** → 选择赛事 → 可增删队伍、改赔率；世界杯可 **导入 48 强基准** |
| 恢复基准 | **优胜冠军** 页点击 **「导入世界杯 48 强」** 与代码表对齐 |

`pnpm db:seed` 会以 `forceCanonical: true` 同步 48 强；已有选项的赔率仅在「应用基准」或重新 seed 时按文件覆盖。

---

## 四、玩家演示数据（player1）

| 项 | 默认值 |
|----|--------|
| 可用余额 | **88,888.88** |
| 账变流水 | 2 笔演示充值（`DEMO-DEP-001` / `DEMO-DEP-002`） |
| 语言偏好 | `zh-CN` |
| 示例注单 | 默认不写入演示注单 |

---

## 五、运营内容（玩家首页）

| 类型 | 数量 | 说明 |
|------|------|------|
| Banner | 3 | 欢迎投注、首存礼遇、热门赛事 |
| 走马灯（TICKER） | 1 | 欢迎语 + 理性投注提示 |
| 公告（NOTICE） | 1 | 每周一 04:00–05:00 维护通知 |

图片路径示例：`/uploads/banners/welcome.svg` 等。  
重复执行 seed 时，已存在的同类内容可能因 `catch` 跳过，不会无限重复插入。

---

## 六、权限与库内多语言

### 角色与权限

- 角色：`SUPER_ADMIN`（超级管理员）
- 权限示例：`users.create`、`users.view`、`agents.create`、`agents.view`、`wallet.deposit`、`wallet.withdraw`、`matches.manage`、`settlement.confirm`、`cashback.confirm`、`content.manage`、`reports.view`

### i18n_messages 表

种子仅写入少量玩家端 key（中 / 英 / 马来），例如 `nav.home`、`bet.place_bet`。  
**管理后台与玩家端大部分文案在代码内**（`admin-messages`、`player` 内 vue-i18n），不全部存数据库。

---

## 七、管理后台默认行为

| 项 | 默认 |
|----|------|
| 界面语言 | 中文 `zh-CN`（`localStorage` 键 `admin_locale`） |
| 可选语言 | 中文、English、Bahasa Melayu |
| 登录页 | 若开启「快速登录（调试）」可一键 admin / agent |

---

## 八、玩家端看不到「优胜冠军」时

1. 使用 **玩家账号** 登录（`player1` / `Player@123`），代理或管理员账号无法访问 `GET /player/outrights`。
2. 确认 API 已启动：`pnpm dev:api`。
3. 确认已种子：`pnpm db:seed`（或管理端 **优胜冠军 → 导入世界杯 48 强**）。
4. 进入 **投注** 页，点顶部 **优胜冠军**（不是「赛事」标签）。
5. 浏览器 F12 → Network，看 `/api/player/outrights` 是否 200 且 `data` 数组非空。

**后台有数据、玩家端没有**：多为玩家接口原先只查 `OPEN` 盘口，与后台查询不一致；现已改为与管理端「优胜冠军」页共用 `OutrightService` 数据源。修改后需 **重启 API**。

---

## 九、如何查看 / 重置

```bash
# 可视化浏览所有表
pnpm db:studio

# 重新写入种子（不删表，多为 upsert）
pnpm db:seed
```

仅想恢复 **48 强夺冠赔率** 为代码基准：管理后台 → **优胜冠军** → **导入世界杯 48 强**。

清空数据库后重来：

```bash
docker compose down -v   # 会删除 Docker 数据卷，慎用
docker compose up -d
pnpm db:migrate
pnpm db:seed
```

生产服务器如需清空业务数据并写入正规默认数据，优先使用脚本：

```bash
CONFIRM=YES ./scripts/prod-init-db.sh
```

该脚本会先备份 PostgreSQL 到 `backups/*.sql.gz` 并生成 `.sha256`，再执行 Prisma 迁移，然后以 production 模式清空业务表并写入 `admin`、WC2026 小组赛 72 场和 48 强优胜盘。

---

## 十、相关文档

- [项目启动指南.md](./项目启动指南.md) — 安装、启动、排错  
- [README.md](../README.md) — 项目概览
