# TheBet365 - 足球投注平台 MVP

Monorepo 项目，包含 NestJS 后端与 Vue 3 三端前端。

## 技术栈

| 层级 | 技术 |
|------|------|
| 后端 | NestJS + Prisma + PostgreSQL + Redis |
| 玩家前台 | Vue 3 + Vite + Pinia (H5 移动端优先) |
| 管理后台（平台+代理） | Vue 3 + Vite + Element Plus，单应用 `apps/admin` |
| 包管理 | pnpm workspace |

## 快速开始

> 完整步骤、环境变量、端口、演示账号与排错见 **[docs/项目启动指南.md](docs/项目启动指南.md)**。  
> **Docker 全栈一键部署（生产）** 见 **[docs/Docker部署指南.md](docs/Docker部署指南.md)**。

### 1. 启动基础设施

```bash
docker compose up -d
```

### 2. 安装依赖

```bash
pnpm install
```

### 3. 配置环境

```bash
cp .env.example apps/api/.env
```

### 4. 数据库迁移与种子数据

```bash
pnpm db:migrate
pnpm db:seed
```

### 5. 启动开发服务

```bash
pnpm dev:api      # API http://localhost:3000
pnpm dev:player   # 玩家前台 http://localhost:5173
pnpm dev:admin    # 管理后台 http://localhost:5174（admin/agent 同一入口）
pnpm dev:manage   # 同上别名
```

API 文档：http://localhost:3000/api/docs

## 测试账号

| 角色 | 用户名 | 密码 |
|------|--------|------|
| 超级管理员 | admin | Admin@123 |
| 一级代理 | agent1 | Agent@123 |
| 二级代理 | agent2 | Agent@123 |
| 玩家 | player1 | Player@123 |

更多默认数据（赛事、48 强夺冠、余额、Banner 等）见 **[docs/默认数据说明.md](docs/默认数据说明.md)**。

## 项目结构

```
apps/api/src/
├── domains/                 # 8 个业务领域
│   ├── identity/            # 身份与权限（auth + users）
│   ├── agent/               # 代理网络
│   ├── ledger/              # 账务账本（wallet）
│   ├── catalog/             # 赛事目录（matches）
│   ├── odds/                # 盘口赔率（markets）
│   ├── betting/             # 注单引擎
│   ├── settlement/          # 结算引擎（含 domain/ 纯函数）
│   └── operations/          # 运营支撑（audit/cashback/content/i18n）
├── applications/            # 三端应用层（编排，不含领域规则）
│   ├── player/
│   ├── admin/
│   └── agent/
├── shared/                  # 基础设施
│   ├── prisma/
│   └── common/
├── app.module.ts
└── main.ts

apps/
  player/       玩家 H5 前台
  admin/        管理后台（平台 + 代理，单应用）
packages/
  shared/       共享类型与常量
```

## MVP 功能

- 三端登录鉴权 + RBAC
- 2 级代理 + 信用额度池
- 钱包账变（禁止直接改余额）
- 11 种足球玩法 + 盘口模板
- 单关 / 2~5 串 1 下注
- 结算预览 + 确认入账
- 返水批次
- Banner / 公告 / 多语言

## 测试

```bash
pnpm --filter @thebet365/api test
```
