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

> 版本: v3.0
> 日期: 2026-06-01
> 状态: 重新定位后
> 定位: 应届生/实习生 AI 面试教练

---

## 一、技术栈

### 1.1 前端

| 技术 | 版本 | 用途 |
|------|------|------|
| uni-app | 3.x | 跨端框架（微信小程序 + H5） |
| Vue | 3.4 | 框架 |
| TypeScript | 5.x | 类型安全 |
| Vite | 5.x | 构建工具 |
| Pinia | 2.x | 状态管理（用户状态、面试会话） |
| SCSS | - | 样式预处理 |

### 1.2 后端

| 技术 | 版本 | 用途 |
|------|------|------|
| Node.js | 18+ | 运行环境 |
| NestJS | 10.x | 框架（模块化，适合快速迭代） |
| MongoDB + Mongoose | 7.x | 数据库（灵活 schema，适合快速迭代） |
| MongoDB Atlas | - | 免费层起步，0 成本启动 |
| JWT | - | 用户认证（微信登录对接后使用） |
| class-validator | - | 参数校验 |
| 微信支付 | - | 会员付费（Phase 1.5 接入） |

### 1.3 AI 能力

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

### 1.4 部署

| 技术 | 用途 |
|------|------|
| 腾讯云轻量应用服务器 | 后端部署（个人开发者友好，已 ICP 备案） |
| 微信小程序云开发（可选） | 静态资源 + 云函数（快速原型） |
| Nginx | 反向代理（HTTPS 终止） |

---

## 二、项目结构（简化版，MVP 优先）

```
zhiyin/
├── zhiyin-app/                    # 小程序前端
│   ├── src/
│   │   ├── pages/                # 页面
│   │   │   ├── index/            # 首页（岗位选择 + 面试入口）
│   │   │   ├── interview/        # 面试模拟（核心页面）
│   │   │   ├── report/           # 面试报告
│   │   │   ├── history/          # 历史面试记录
│   │   │   ├── resume/           # 简历诊断（Phase 1.5）
│   │   │   ├── internship/       # 实习搜索聚合（MVP 跳转模式）
│   │   │   ├── user/             # 个人中心
│   │   │   └── member/          # 会员中心（Phase 1.5）
│   │   ├── components/           # 组件
│   │   ├── services/             # API 服务
│   │   ├── stores/               # Pinia 状态
│   │   ├── styles/               # 全局样式
│   │   ├── utils/                # 工具函数
│   │   ├── App.vue
│   │   └── main.ts
│   ├── package.json
│   ├── vite.config.js
│   └── manifest.json            # 小程序配置（AI 深度合成类目已通过）
│
├── backend/                       # 后端服务
│   ├── src/
│   │   ├── common/               # 公共模块
│   │   │   ├── filters/          # 异常过滤器
│   │   │   ├── guards/           # 权限守卫（JWT）
│   │   │   ├── interceptors/     # 拦截器（日志、响应格式）
│   │   │   └── utils/            # 工具函数
│   │   ├── config/               # 配置文件（数据库、AI API、微信）
│   │   ├── dto/                  # 数据传输对象
│   │   ├── modules/              # 业务模块（MVP 只做 3 个核心模块）
│   │   │   ├── interview/        # 面试模块（核心，P0）
│   │   │   ├── user/             # 用户模块（微信登录，P0）
│   │   │   ├── resume/           # 简历模块（Phase 1.5，P1）
│   │   │   ├── member/           # 会员模块（Phase 1.5，P1）
│   │   │   ├── internship/       # 实习搜索模块（MVP 跳转，P1）
│   │   │   └── knowledge/        # 知识图谱模块（Phase 2，P2）
│   │   ├── ai/                   # AI 能力封装（opencode-go + NVIDIA 切换）
│   │   ├── wechat/              # 微信相关（登录、支付、订阅消息）
│   │   ├── app.module.ts
│   │   └── main.ts
│   ├── package.json
│   └── tsconfig.json
│
└── docs/                         # 项目文档
    ├── PRODUCT-PLAN.md           # 产品规划（✅ 已更新 v3.0）
    ├── ARCHITECTURE.md           # 架构文档（✅ 当前文件）
    ├── FEATURE-LIST.md           # 功能清单（待更新）
    ├── ROADMAP.md                # 路线图（待更新）
    └── PROJECT-STATUS.md        # 进度文档（待更新）
```

---

## 三、核心数据模型（简化，快速迭代）

### 3.1 用户（User）

```javascript
{
  _id: ObjectId,
  openid: String,              // 微信 openid（唯一标识）
  nickname: String,             // 微信昵称
  avatar: String,               // 微信头像
  targetPosition: String,       // 目标岗位（校招热门岗位）
  targetIndustry: String,       // 目标行业
  memberStatus: {               // 会员状态
    type: String,              // free/vip
    expireAt: Date,
  },
  usage: {                     // 使用统计
    dailyInterviewCount: Number,  // 每日面试次数
    totalInterviewCount: Number,  // 总面试次数
    lastResetDate: Date,
  },
  createdAt: Date,
  updatedAt: Date
}
```

### 3.2 面试会话（Interview）—— 核心模型

```javascript
{
  _id: ObjectId,
  userId: ObjectId,
  position: String,             // 面试岗位（如"前端工程师"）
  status: String,               // pending/active/completed
  rounds: [{                   // 问答轮次
    question: String,           // AI 问题
    answer: String,             // 用户回答
    feedback: {                 // AI 反馈
      score: Number,           // 本题得分（0-100）
      comment: String,         // 评语
      suggestion: String,      // 改进建议
      referenceAnswer: String, // 参考回答思路
    },
    createdAt: Date,
  }],
  summary: {                  // 面试总结
    totalScore: Number,        // 总分（0-100）
    strengths: [String],       // 优势
    weaknesses: [String],      // 不足
    suggestions: [String],     // 综合建议
    dimensionScores: {          // 各维度得分
      logic: Number,          // 逻辑思维
      expression: Number,     // 表达能力
      professionalism: Number, // 专业度
      stability: Number,      // 情绪稳定性
    },
  },
  createdAt: Date,
  completedAt: Date
}
```

### 3.3 简历（Resume）—— Phase 1.5

```javascript
{
  _id: ObjectId,
  userId: ObjectId,
  title: String,              // 简历标题
  originalContent: String,    // 原始内容
  targetPosition: String,     // 目标岗位
  createdAt: Date,
  updatedAt: Date
}
```

### 3.4 岗位题库（QuestionBank）—— Phase 2 知识图谱前置

```javascript
{
  _id: ObjectId,
  position: String,           // 岗位名称（如"前端工程师"）
  category: String,           // 分类（技术/职能/AI专项）
  difficulty: String,         // 难度（junior/mid/senior）
  questions: [{
    content: String,          // 问题内容
    type: String,             // 类型（basic/algorithm/project/behavioral）
    referenceAnswer: String,  // 参考回答
    tags: [String],          // 标签（如"闭包"、"贪心算法"）
  }],
  createdAt: Date,
  updatedAt: Date
}
```

---

## 四、API 接口设计（MVP 核心接口）

### 4.1 用户模块（微信登录）

| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 微信登录 | POST | /api/user/wx-login | 微信授权登录，返回 token |
| 获取用户信息 | GET | /api/user/info | 获取用户信息 |
| 更新用户信息 | PUT | /api/user/update | 更新目标岗位/行业 |

### 4.2 面试模块（核心）

| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 创建面试 | POST | /api/interview/create | 创建面试会话（选岗位） |
| 获取面试 | GET | /api/interview/:id | 获取面试详情 |
| 面试列表 | GET | /api/interview/list | 获取用户面试列表 |
| 提交回答 | POST | /api/interview/:id/answer | 提交本轮回答 |
| 获取反馈 | GET | /api/interview/:id/feedback | 获取本轮反馈 |
| 结束面试 | POST | /api/interview/:id/complete | 结束面试生成报告 |

### 4.3 实习搜索模块（MVP 跳转模式）

| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 实习搜索 | GET | /api/internship/search | 搜索实习岗位（聚合入口） |
| 热门实习 | GET | /api/internship/hot | 热门实习岗位列表 |

> MVP 阶段：不存数据，只做搜索聚合入口（跳转模式），低成本验证用户需求。

### 4.4 简历模块（Phase 1.5）

| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 创建简历 | POST | /api/resume/create | 创建简历记录 |
| 诊断简历 | POST | /api/resume/diagnosis | AI 诊断简历问题 |

### 4.5 会员模块（Phase 1.5）

| 接口 | 方法 | 路径 | 说明 |
|------|------|------|------|
| 会员订阅 | POST | /api/member/subscribe | 微信支付订阅 |
| 获取会员状态 | GET | /api/member/status | 获取会员信息 |

---

## 五、AI 面试模拟核心流程

```
用户选择岗位
    ↓
创建面试会话（/api/interview/create）
    ↓
AI 生成第一题（基于岗位 + 用户简历）
    ↓
用户语音/文字回答
    ↓
提交回答（/api/interview/:id/answer）
    ↓
AI 实时反馈（评分 + 评语 + 建议 + 参考回答）
    ↓
AI 追问（基于回答内容）
    ↓
循环（通常 5-8 轮）
    ↓
用户结束面试
    ↓
生成面试报告（/api/interview/:id/complete）
    ↓
展示报告（总分 + 各维度得分 + 优劣势 + 建议）
```

### 5.1 AI Prompt 设计要点

**系统提示词（System Prompt）**：
```
你是一位专业的校招面试官，正在面试一位应聘{position}岗位的应届毕业生。
请根据以下要求进行了面试：
1. 问题要符合校招难度（不要求工作经验）
2. 结合应聘岗位提出专业问题
3. 根据考生回答进行针对性追问
4. 每次回答后给出评分（0-100）和具体改进建议
5. 面试共 5-8 轮，涵盖基础、项目、算法（如适用）、行为问题
```

**反馈提示词（Feedback Prompt）**：
```
请对以下面试回答进行评分和反馈：
问题：{question}
回答：{answer}
岗位：{position}

输出格式（JSON）：
{
  "score": 85,
  "comment": "回答逻辑清晰，但缺少具体案例...",
  "suggestion": "建议结合项目经历，用STAR法则组织回答",
  "referenceAnswer": "参考回答思路：..."
}
```

---

## 六、部署架构

```
微信小程序 (用户端)
    ↓ HTTPS
Nginx 反向代理（腾讯云轻量应用服务器）
    ↓
backend (NestJS :3000)
    ↓
MongoDB Atlas (数据库)
    ↓
AI API (opencode-go → NVIDIA 主备切换)
```

### 6.1 合规优势

- ✅ **ICP 备案已完成**（合规运营基础）
- ✅ **AI 深度合成类目已通过**（可立即上线，竞品需 3-6 个月）
- ✅ 微信小程序已配置（manifest.json）

---

## 七、关键技术决策

### 7.1 为什么继续用 NestJS + MongoDB？

- 已有代码基础，重写浪费时间
- NestJS 模块化适合快速迭代（MVP → Phase 1.5 → Phase 2）
- MongoDB 灵活的数据模型适合快速改 schema（早期频繁迭代）
- 个人开发者能 hold 住（社区资源丰富）

### 7.2 为什么 MVP 先做 3 个核心模块？

- **面试模块**（核心差异，必须做好）
- **用户模块**（微信登录，0 门槛）
- **实习搜索**（跳转模式，低成本验证需求）

其他模块（简历、会员、知识图谱）MVP 后按优先级加入。

### 7.3 为什么实习搜索用跳转模式？

- 不存数据 = 0 合规风险
- 不爬数据 = 0 维护成本
- 只做聚合搜索入口 = 低成本验证用户需求
- 如果需求验证成功，Phase 1.5 再做"精选实习岗位"（人工整理）

### 7.4 AI 模型选型

- **主用**：opencode-go (deepseek-v4-flash) — 性能优先，成本低
- **备用**：NVIDIA (stepfun-ai/step-3.5-flash) — 主用不可用时自动降级
- **合规**：已备案，可合法提供 AI 服务

---

## 八、MVP 开发优先级

### P0（Week 1-2，必须完成）

- [ ] 微信登录对接（/api/user/wx-login）
- [ ] 岗位选择页面（校招热门 20+ 岗位，含 AI 岗位）
- [ ] AI 面试模拟核心逻辑（多轮对话）
- [ ] 每轮反馈评分接口（/api/interview/:id/feedback）
- [ ] 面试报告生成（/api/interview/:id/complete）
- [ ] 历史面试记录查看（/api/interview/list）

### P1（Week 3-4，PMF 验证后）

- [ ] 简历诊断功能（复用已有代码）
- [ ] 会员系统开发（¥9.9/月）
- [ ] 微信支付对接
- [ ] 实习搜索聚合入口（跳转模式）

### P2（Week 5-8，增强功能）

- [ ] AI 岗位专属题库（算法/大模型）
- [ ] 技能缺口分析
- [ ] 知识图谱（校招岗位-技能映射）
- [ ] 精选实习岗位（人工整理）

---

## 九、性能与扩展性考虑

### 9.1 性能优化

- AI 调用异步化（避免阻塞用户操作）
- 面试报告生成用队列（防止并发超时）
- MongoDB 索引优化（userId, position, createdAt）

### 9.2 扩展性考虑

- 模块化设计（NestJS 天然支持）
- AI 模型可插拔（opencode-go / NVIDIA / 未来接入其他模型）
- 数据库分片预留（用户量大的时候）
- 微信支付/订阅消息可替换（如果未来做独立 App）

---

## 十、安全风险与应对

| 风险 | 影响 | 应对 |
|------|------|------|
| AI 内容合规 | 微信下架 | 严格遵守微信 AI 内容规范；敏感词过滤；人工审核机制 |
| 用户数据泄露 | 信任危机 | HTTPS 全站；数据库访问权限控制；不存敏感信息 |
| 微信登录伪造 | 账户被盗 | 签名验证；openid 绑定校验 |
| AI API 费用失控 | 成本飙升 | 限制每日调用次数；监控告警；备用模型自动切换 |

---

## 变更记录

| 日期 | 变更内容 | 操作人 |
|------|----------|--------|
| 2026-05-14 | 职引项目启动，架构文档初版 | AI |
| 2026-05-15 | 方向调整：简历工具 → AI 职业发展平台 | AI |
| 2026-06-01 | **重新架构**：专注校招，简化 MVP，价格 ¥9.9/月，合规优势 | AI |
