# 职引 — 技术架构文档 v4.0

> **版本**: v4.0
> **日期**: 2026-06-09
> **状态**: Phase 0.5 完成
> **定位**: 应届生/实习生 AI 面试教练

---

## 一、技术栈

### 1.1 前端

| 技术 | 版本 | 用途 |
|------|------|------|
| uni-app | 3.x | 跨端框架（微信小程序 + H5） |
| Vue | 3.4 | 框架 |
| TypeScript | 5.x | 类型安全 |
| Vite | 5.x | 构建工具 |

### 1.2 后端

| 技术 | 版本 | 用途 |
|------|------|------|
| Node.js | 18+ | 运行环境 |
| NestJS | 10.x | 框架 |
| MongoDB + Mongoose | 7.x | 数据库 |
| JWT | - | 认证 |
| class-validator | - | 参数校验 |

### 1.3 AI 能力

| 技术 | 用途 | 优先级 |
|------|------|--------|
| opencode-go (deepseek-v4-flash) | 面试模拟、简历诊断、报告 | 主用 |
| NVIDIA (stepfun-ai/step-3.5-flash) | 主用不可用时自动切换 | 备用 |

### 1.4 部署

| 技术 | 用途 |
|------|------|
| 腾讯云轻量应用服务器 | 后端部署（已 ICP 备案） |
| Nginx | 反向代理（HTTPS 终止） + H5 静态文件服务 |
| PM2 | 进程管理 |

**生产域名**：
| 域名 | 用途 | 指向 |
|------|------|------|
| `zhiyinwx.yzrcloud.cn` | 后端 API（小程序服务端 + H5 API） | Nginx → `localhost:3006` |
| `zhiyin.yzrcloud.cn` | H5 网页端 | `/www/wwwroot/zhiyin.yzrcloud.cn` |

---

## 二、项目结构

```
zhiyin/
├── zhiyin-app/                    # 小程序前端
│   └── src/
│       ├── pages/                 # 16 个页面
│       │   ├── index/             # 首页（Tab: 面试）
│       │   ├── interview/         # 面试模拟
│       │   ├── report/            # 面试报告
│       │   ├── history/           # 历史记录（Tab: 面经）
│       │   ├── user/              # 个人中心（Tab: 我的）
│       │   ├── login/             # 登录/注册
│       │   ├── member/            # 会员中心
│       │   ├── progress/          # 进步轨迹雷达图
│       │   ├── contribute/        # 面经贡献
│       │   ├── resume/            # 简历诊断/优化
│       │   ├── result/            # 优化结果
│       │   ├── internship/        # 实习搜索
│       │   ├── admin/             # 管理后台
│       │   ├── about/             # 关于
│       │   ├── agreement/         # 用户协议
│       │   └── privacy/           # 隐私政策
│       ├── services/api.ts        # API 服务封装
│       ├── config.ts              # 全局配置/端点定义
│       ├── pages.json             # 路由表（3 Tab + 13 页面）
│       └── manifest.json          # 小程序配置
│
├── backend/                       # 后端服务 (NestJS)
│   └── src/
│       ├── main.ts                # 入口（端口 3006, 前缀 /api）
│       ├── app.module.ts          # 根模块（导入全部 14 个子模块）
│       ├── common/                # 公共模块
│       │   ├── decorators/        # @CurrentUser, @Public
│       │   ├── guards/            # JwtAuthGuard
│       │   ├── strategies/        # JwtStrategy
│       │   └── filters/           # AllExceptionsFilter
│       └── modules/               # 15 个业务模块
│           ├── user/              # 用户（手机/邮箱/密码/微信登录）
│           ├── interview/         # AI 面试（核心，含进度追踪）
│           ├── ai/                # AI 调用封装（主/备切换）
│           ├── analyze/           # 简历诊断/优化 AI 分析
│           ├── resume/            # 简历 CRUD
│           ├── member/            # 会员套餐/状态
│           ├── payment/           # 微信支付 v3（签名/解密/回调）
│           ├── positions/         # 热门岗位维护
│           ├── upload/            # 文件上传
│           ├── admin/             # 管理后台 API
│           ├── email/             # 邮件发送
│           ├── progress/          # 进步轨迹四维统计
│           ├── contribution/      # 面经贡献 + 公司题库
│           ├── daily-question/    # 每日一题（待完善推送）
│           └── schemas/           # 共享数据模型（5 个 schema）
│
└── docs/                          # 项目文档
    ├── PRODUCT-PLAN.md
    ├── ARCHITECTURE.md
    ├── FEATURE-LIST.md
    ├── ROADMAP.md
    ├── PROJECT-STATUS.md
    ├── DEPLOYMENT.md
    └── WECHAT-CHECKLIST.md
```

---

## 三、数据模型

### 3.1 用户 (User)
```
phone, wxOpenid, email, password, nickname, avatar
plan (free/growth), remaining, vipExpireAt
role (user/admin), isSystemAdmin
interviewCount
```

### 3.2 面试 (Interview)
```
userId, position, status (in_progress/completed)
messages[{role, content, score, feedback, suggestion}]
totalScore, questionCount
summary{dimensionScores{logic,expression,professionalism,stability}, strengths, weaknesses, suggestions}
```

### 3.3 进步轨迹 (Progress)
```
userId, totalInterviews, completedInterviews
avgLogic, avgExpression, avgProfessionalism, avgStability
streak, lastInterviewDate, streakHistory
recentScores[{interviewId, date, position, totalScore, dimensions}]
```

### 3.4 面经贡献 (Contribution)
```
userId, interviewId, company, position, rounds, questions, experience, tags, verified
```

### 3.5 公司题库 (CompanyBank)
```
company, position
questions[{content, type, referenceAnswer, difficulty, frequency, tags}]
contributionCount, viewCount
```

### 3.6 每日一题 (DailyQuestion)
```
position, question, referenceAnswer, category, date, pushed
```

### 3.7 支付订单 (PaymentOrder)
```
outTradeNo, userId, amount, status, channel (native/jsapi)
paidAt, wxTransactionId, refundAmount, refundedAt
```

### 3.8 简历/岗位
```
Resume: userId, title, originalContent, targetPosition
HotPosition: name, salary, company, icon, sort, active
```

---

## 四、API 接口总览

### 4.1 用户 (prefix: `/api/user`)
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/send-code` | 发送手机验证码 |
| POST | `/login` | 手机号+验证码登录 |
| POST | `/send-email-code` | 发送邮箱验证码 |
| POST | `/email-login` | 邮箱+验证码登录 |
| POST | `/password-login` | 邮箱+密码登录 |
| POST | `/register` | 邮箱+密码注册 |
| POST | `/wx-login` | 微信静默登录 |
| GET | `/info` | 获取用户信息 |
| PUT | `/update` | 更新用户信息 |
| GET | `/usage` | 获取使用额度 |
| POST | `/set-password` | 设置密码 |

### 4.2 面试 (prefix: `/api/interview`)
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/create` | 创建面试 |
| POST | `/:id/answer` | 提交回答 |
| POST | `/:id/complete` | 完成面试生成报告 |
| GET | `/:id` | 获取面试详情 |
| GET | `/list/all` | 面试历史列表 |
| GET | `/stats/mine` | 用户统计 |

### 4.3 简历/AI 分析 (prefix: `/api/analyze`, `/api/resume`)
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/analyze/diagnosis` | AI 简历诊断 |
| POST | `/analyze/optimize` | AI 简历优化 |
| POST | `/resume/create` | 创建简历 |
| GET | `/resume/list` | 简历列表 |
| DELETE | `/resume/:id` | 删除简历 |

### 4.4 会员/支付 (prefix: `/api/member`, `/api/payment`)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/member/plans` | 套餐配置 |
| GET | `/member/status` | 会员状态 |
| POST | `/member/pay` | ⚠️ 开发绕过（上线前移除） |
| POST | `/payment/create` | 创建 Native 支付订单 |
| POST | `/payment/jsapi` | 创建 JSAPI 支付 |
| POST | `/payment/notify` | 微信支付回调 |
| POST | `/payment/query` | 查询订单状态 |

### 4.5 Phase 0.5 (prefix: `/api/progress`, `/api/contribution`, `/api/daily-question`)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/progress` | 进步轨迹数据 |
| GET | `/progress/stats` | 进步轨迹统计 |
| POST | `/contribution` | 提交面经贡献 |
| GET | `/contribution/my` | 我的贡献列表 |
| GET | `/contribution/company/:c/position/:p` | 公司题库查询 |
| GET | `/contribution/company/:c` | 公司岗位列表 |
| GET | `/daily-question` | 获取每日一题 |
| GET | `/daily-question/position/:p` | 按岗位获取题目 |

### 4.6 其他
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/positions/hot` | 热门岗位 |
| POST | `/upload` | 文件上传 |
| GET | `/admin/*` | 管理后台接口 |

---

## 五、部署架构

```
微信小程序 (用户端)               H5 浏览器 (用户端)
    ↓ HTTPS                           ↓ HTTPS
zhiyinwx.yzrcloud.cn            zhiyin.yzrcloud.cn
    ↓                                 ↓
Nginx 反向代理 (腾讯云轻量应用服务器)       Nginx 静态文件服务
    ↓                                 ↓
backend (NestJS :3006)              /www/wwwroot/zhiyin.yzrcloud.cn/
    ↓
MongoDB Atlas / 自建 MongoDB
    ↓
AI API (opencode-go → NVIDIA 主备切换)
```

---

## 六、安全与合规

- ✅ ICP 备案已完成
- ✅ AI 深度合成类目已通过
- ✅ JWT 认证全局守卫（白名单接口 @Public 放行）
- ✅ 请求限流 (10次/分钟)
- ⚠️ 生产环境需配置：强 JWT_SECRET、CORS 白名单、HTTPS、移除固定验证码

---

## 变更记录

| 日期 | 变更内容 | 操作人 |
|------|----------|--------|
| 2026-05-14 | 初版 | AI |
| 2026-06-01 | 重新架构：专注校招 | AI |
| 2026-06-09 | 全面重写：匹配真实 15 模块 + 16 页面 + API 清单 | AI |
| 2026-06-09 | 更新部署架构：添加生产域名 zhiyinwx.yzrcloud.cn / zhiyin.yzrcloud.cn | 小之 |
