Files
zhiyin/docs/ARCHITECTURE.md
T
2026-06-08 16:28:00 +08:00

427 lines
14 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.
# 职引 — 技术架构文档 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.5P1
│ │ │ ├── member/ # 会员模块(Phase 1.5P1
│ │ │ ├── internship/ # 实习搜索模块(MVP 跳转,P1)
│ │ │ └── knowledge/ # 知识图谱模块(Phase 2P2
│ │ ├── 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 开发优先级
### P0Week 1-2,必须完成)
- [ ] 微信登录对接(/api/user/wx-login
- [ ] 岗位选择页面(校招热门 20+ 岗位,含 AI 岗位)
- [ ] AI 面试模拟核心逻辑(多轮对话)
- [ ] 每轮反馈评分接口(/api/interview/:id/feedback
- [ ] 面试报告生成(/api/interview/:id/complete
- [ ] 历史面试记录查看(/api/interview/list
### P1Week 3-4PMF 验证后)
- [ ] 简历诊断功能(复用已有代码)
- [ ] 会员系统开发(¥9.9/月)
- [ ] 微信支付对接
- [ ] 实习搜索聚合入口(跳转模式)
### P2Week 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 |