Files
zhiyin/docs/ARCHITECTURE.md
T
yuzhiran 9276ab9028 v4.2 冲刺版+每日推送+支付修复+全量代码评审
## 新增功能
- 冲刺版 ¥49.9/月:完整支付→激活→权益扣减链路
- 每日一题定时推送(@nestjs/schedule,早8点微信订阅消息)
- miniprogram-ci 编译上传脚本(scripts/upload-mp.js)

## Bug修复
- 套餐值统一:vip→growth/sprint(interview轮次限制、analyze次数检查)
- member/pay 移除开发绕过:改为订单校验后激活
- progress→report 参数名不匹配:id→interviewId
- result.vue resume.create() 参数传错(对象→独立参数)
- resume.vue analyze请求缺少Authorization header
- bank.vue contribution请求缺少Authorization header
- member.vue startPay() 缺少try/catch导致网络错误崩溃
- login.vue 调试面板 v-if="true" 生产泄漏

## 配置
- 微信支付生产证书就位(商户号1113760598)
- .env 清理冗余文件(删除.example/.production)
- WX_NOTIFY_URL 更新为 zhiyinwx.yzrcloud.cn

## 文档
- PROJECT-STATUS.md v4.1→v4.2,状态全面更新
- DEPLOYMENT.md 新增小程序编译上传章节、清理检查清单
2026-06-09 20:03:05 +08:00

281 lines
9.7 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.
# 职引 — 技术架构文档 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 | 小之 |