Files
juwan-frontend/README.md
T
2026-02-28 10:33:50 +08:00

197 lines
4.6 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. **启动后端服务**
后端使用 Kubernetes 部署,需要先启动后端集群(参考后端仓库的部署文档)。
2. **配置端口转发**
将后端 Envoy Gateway 转发到本地:
```bash
kubectl port-forward -n juwan svc/envoy-gateway 8080:80
```
3. **配置环境变量**
创建 `.env.local` 文件:
```bash
# 后端 API 地址(通过 kubectl port-forward 转发)
NEXT_PUBLIC_BACKEND_URL=http://localhost:8080
```
4. **启动前端开发服务器**
```bash
pnpm dev
```
访问 http://localhost:3000
**工作原理**
- 前端向 `/api/*` 发起请求
- Next.js dev server 自动将请求代理到 `http://localhost:8080/api/*`
- 后端通过 `kubectl port-forward` 接收请求
- 无需修改前端代码中的 API 调用路径
### 其他命令
```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:8080'
return [
{
source: '/api/:path*',
destination: `${backendUrl}/api/:path*`,
},
]
}
```
**优点**
- 前端代码无需关心后端地址
- 避免 CORS 问题(同源请求)
- Cookie 自动携带
- 开发/生产环境无缝切换
## 环境变量
| 变量名 | 说明 | 默认值 |
| ------------------------- | ------------------------------- | ----------------------- |
| `NEXT_PUBLIC_BACKEND_URL` | 后端 API 地址(仅开发环境生效) | `http://localhost:8080` |
**注意**
- 此变量仅在开发环境(`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: 按照 开发环境设置 里的步骤完成 `kubectl port-forward`,并在 `.env.local` 配置 `NEXT_PUBLIC_BACKEND_URL`。前端统一请求 `/api/*`,开发环境由 Next.js 代理到本地转发端口。
### Q: 后端连接失败怎么办?
A: 检查以下几点:
1. 后端 K8s 集群是否正常运行
2. `kubectl port-forward` 是否在运行
3. `.env.local` 中的 `NEXT_PUBLIC_BACKEND_URL` 是否正确
4. 浏览器控制台是否有 CORS 错误
### Q: 如何添加新的 API
A:
1. 在 `lib/types.ts` 定义类型
2. 在 `lib/api/` 创建 API 函数
3. 在 `store/` 中调用 API