# 职引 — 技术架构文档 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 |