Files
juwan-frontend/README.md
T
zetaloop ffc94f2846 chore: update dev setup to use docker compose backend
Default backend URL changed from port 8080 (kubectl port-forward)
to 18080 (docker compose Envoy Gateway). README updated to reflect
the deploy/dev workflow.
2026-04-23 21:23:51 +08:00

187 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 聚玩前端
基于 Next.js 15 的游戏代练平台前端应用。
## 技术栈
- **框架**: Next.js 15 (App Router)
- **语言**: TypeScript
- **样式**: Tailwind CSS 4
- **状态管理**: Zustand
- **表单**: React Hook Form + Zod
- **UI 组件**: Radix UI + shadcn/ui
- **测试**: Vitest
## 开发环境设置
### 前置要求
- Node.js 20+
- pnpm 9+
### 安装依赖
```bash
pnpm install
```
### 连接后端开发
1. **启动后端服务**
在后端仓库的 `deploy/dev` 目录下构建并启动所有微服务:
```bash
cd ../juwan-backend/deploy/dev
python3 build.py
docker compose up -d
```
验证后端是否正常运行:
```bash
curl http://127.0.0.1:18080/healthz
```
2. **启动前端开发服务器**
```bash
pnpm dev
```
访问 http://localhost:3000
Next.js 会自动将 `/api/*` 请求代理到 `http://localhost:18080/api/*`(后端 Envoy Gateway),无需额外配置。
### 其他命令
```bash
# 类型检查
pnpm typecheck
# 代码检查
pnpm lint
# 代码格式化
pnpm format
# 运行测试
pnpm test
# 完整检查(类型 + lint + 格式)
pnpm check
# 生产构建
pnpm build
# 启动生产服务器
pnpm start
```
## 项目结构
```
juwan-frontend/
├── app/ # Next.js App Router 页面
│ ├── (auth)/ # 认证相关页面(注册/登录/找回密码)
│ ├── (account)/ # 账户相关页面(个人中心/认证申请)
│ ├── (order)/ # 订单相关页面(下单/聊天/评价/纠纷)
│ └── (main)/ # 主要页面(首页/搜索/打手/店铺)
├── components/ # 可复用组件
├── lib/ # 工具函数和类型定义
│ ├── api/ # API 调用函数
│ ├── domain/ # 业务逻辑(状态机等)
│ ├── types.ts # 核心类型定义
│ ├── errors.ts # 错误处理
│ └── decision.ts # 权限决策
├── store/ # Zustand 状态管理
├── tests/ # 测试文件
└── public/ # 静态资源
```
## API 代理配置说明
开发环境下,Next.js 会自动将 `/api/*` 请求代理到后端:
```typescript
// next.config.ts
async rewrites() {
if (process.env.NODE_ENV !== 'development') {
return []
}
const backendUrl = process.env.NEXT_PUBLIC_BACKEND_URL || 'http://localhost:18080'
return [
{
source: '/api/:path*',
destination: `${backendUrl}/api/:path*`,
},
]
}
```
**优点**
- 前端代码无需关心后端地址
- 避免 CORS 问题(同源请求)
- Cookie 自动携带
- 开发/生产环境无缝切换
## 环境变量
| 变量名 | 说明 | 默认值 |
| ------------------------- | ------------------------------- | ----------------------- |
| `NEXT_PUBLIC_BACKEND_URL` | 后端 API 地址(仅开发环境生效) | `http://localhost:18080` |
**注意**
- 此变量仅在开发环境(`pnpm dev`)生效,用于配置 API 代理目标
- 生产环境不使用此变量,前后端通过 Envoy Gateway 统一路由
## 部署
### 构建 Docker 镜像
```bash
docker build -t juwan-frontend:latest .
docker tag juwan-frontend:latest 103.236.53.208:4418/library/juwan-frontend:latest
docker push 103.236.53.208:4418/library/juwan-frontend:latest
```
### 部署到 Kubernetes
```bash
kubectl apply -f deploy/k8s/frontend.yaml
```
## 开发规范
- 使用 TypeScript 严格模式
- 遵循 ESLint 规则(`pnpm lint`
- 提交前运行 `pnpm check` 确保代码质量
- 所有 API 调用必须有类型定义
- 组件使用 shadcn/ui 风格
## 常见问题
### Q: 本地开发如何连后端?
A: 在后端仓库 `deploy/dev` 下执行 `python3 build.py && docker compose up -d` 启动所有微服务,然后 `pnpm dev` 启动前端。默认代理到 `http://localhost:18080`,无需额外配置。
### Q: 后端连接失败怎么办?
A: 检查以下几点:
1. 后端 Docker 容器是否正常运行(`docker compose ps`
2. Envoy Gateway 是否监听在 18080 端口(`curl http://127.0.0.1:18080/healthz`
3. 如果使用了自定义端口,检查 `.env.local` 中的 `NEXT_PUBLIC_BACKEND_URL`
4. 浏览器控制台是否有 CORS 错误
### Q: 如何添加新的 API
A:
1. 在 `lib/types.ts` 定义类型
2. 在 `lib/api/` 创建 API 函数
3. 在 `store/` 中调用 API