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 新增小程序编译上传章节、清理检查清单
This commit is contained in:
yuzhiran
2026-06-09 20:03:05 +08:00
parent 37cfdfe93c
commit 9276ab9028
44 changed files with 15205 additions and 2062 deletions
+123 -131
View File
@@ -1,12 +1,16 @@
# 职引 - 部署文档
> **最后更新**: 2026-06-09
> **生产环境**: 已部署(服务器已购 + 域名已配)
## 目录
1. [环境要求](#环境要求)
2. [后端部署](#后端部署)
3. [端部署H5](#端部署h5)
4. [微信小程序部署](#微信小程序部署)
5. [数据库初始化](#数据库初始化)
6. [监控和日志](#监控和日志)
2. [生产域名](#生产域名)
3. [端部署](#端部署)
4. [前端部署(H5](#前端部署h5)
5. [微信小程序部署](#微信小程序部署)
6. [数据库初始化](#数据库初始化)
7. [安全检查清单](#安全检查清单)
---
@@ -22,7 +26,19 @@
### 本地开发
- **Node.js**: 18.x
- **MongoDB**: 本地或云服务
- **HBuilderX**: uni-app 开发
- **后端端口**: 3006(默认)
- **前端端口**: 8085Vite 开发服务器)
---
## 生产域名
| 用途 | 域名 | 指向 |
|------|------|------|
| 后端 API(小程序服务端) | `https://zhiyinwx.yzrcloud.cn` | Nginx → `http://localhost:3006` |
| H5 网页端 | `https://zhiyin.yzrcloud.cn` | 静态目录 `/www/wwwroot/zhiyin.yzrcloud.cn` |
端口固定为 **3006**,由 `main.ts``process.env.PORT || 3006` 控制。
---
@@ -31,141 +47,142 @@
### 1. 安装依赖
```bash
cd backend
npm install --production
npm install
```
### 2. 配置环境变量
复制 `.env.example``.env.production` 并修改
```bash
cp .env.example .env.production
vim .env.production # 修改生产配置
创建 `.env` 文件(参考 `backend/.env`
```env
MONGODB_URI=mongodb://localhost:27017/zhiyin
JWT_SECRET=your-strong-secret-at-least-32-chars
PORT=3006
AI_PRIMARY_KEY=your-deepseek-key
AI_BACKUP_KEY=your-nvidia-key
WECHAT_APPID=your-appid
WECHAT_MCHID=your-mchid
WECHAT_API_KEY=your-api-v3-key
WECHAT_SERIAL_NO=your-cert-serial
WECHAT_PRIVATE_KEY_PATH=/path/to/apiclient_key.pem
WX_DAILY_QUESTION_TMPL=在微信公众平台配置的订阅消息模板ID
```
**关键配置项**
- `MONGODB_URI`: 生产数据库地址
- `JWT_SECRET`: 强密钥(至少32字符)
- `PORT`: 生产端口(推荐 3000
- `WECHAT_APPID` / `WECHAT_SECRET`: 小程序生产凭证
### 3. 编译 TypeScript
### 3. 编译并启动
```bash
npm run build
npm run build # 编译 TypeScript → dist/
node dist/main.js # 启动(或使用 PM2
```
### 4. 使用 PM2 启动
### 4. PM2 进程管理
```bash
# 安装 PM2
npm install -g pm2
# 启动应用
pm2 start dist/main.js --name zhiyin-backend
# 设置开机自启
pm2 startup
pm2 save
pm2 startup && pm2 save
```
### 5. 配置 Nginx 反向代理
### 5. Nginx 反向代理(后端 API
```nginx
server {
listen 80;
server_name api.yourdomain.com;
listen 443 ssl http2;
server_name zhiyinwx.yzrcloud.cn;
ssl_certificate /etc/nginx/ssl/yzrcloud.cn.pem;
ssl_certificate_key /etc/nginx/ssl/yzrcloud.cn.key;
location / {
proxy_pass http://localhost:3000;
proxy_pass http://localhost:3006;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
# HTTP → HTTPS 跳转
server {
listen 80;
server_name zhiyinwx.yzrcloud.cn;
return 301 https://$host$request_uri;
}
```
---
## 前端部署(H5
### 1. 修改 API 地址
编辑 `zhiyin-app/config/api.js`
```javascript
export const BASE_URL = 'https://api.yourdomain.com/api'
### 1. 配置 API 地址
编辑 `zhiyin-app/.env.production`
```env
VITE_API_BASE_URL=https://zhiyinwx.yzrcloud.cn/api
```
### 2. 编译 H5
### 2. 编译
```bash
cd zhiyin-app
npm run build:h5
# 输出: dist/build/h5/
```
### 3. 部署到 Web 服务器
`dist/build/h5/` 目录上传到服务器:
```bash
# 使用 scp 上传
scp -r dist/build/h5/* user@your-server:/var/www/zhiyin/
# 或使用 FTP/SSH 上传
scp -r dist/build/h5/* user@your-server:/www/wwwroot/zhiyin.yzrcloud.cn/
```
### 4. 配置 Nginx
### 4. Nginx 配置
```nginx
server {
listen 80;
server_name yourdomain.com;
root /var/www/zhiyin;
listen 443 ssl http2;
server_name zhiyin.yzrcloud.cn;
root /www/wwwroot/zhiyin.yzrcloud.cn;
index index.html;
ssl_certificate /etc/nginx/ssl/yzrcloud.cn.pem;
ssl_certificate_key /etc/nginx/ssl/yzrcloud.cn.key;
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf)$ {
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# HTTP → HTTPS 跳转
server {
listen 80;
server_name zhiyin.yzrcloud.cn;
return 301 https://$host$request_uri;
}
```
---
## 微信小程序部署
### 1. 修改配置
编辑 `zhiyin-app/manifest.json`
```json
{
"mp-weixin": {
"appid": "your-production-appid"
}
}
```
### 1. 修改 manifest.json
编辑 `zhiyin-app/manifest.json`,填写正式 appid。
### 2. 编译小程序
### 2. 编译
```bash
cd zhiyin-app
npm run build:mp-weixin
# 输出: dist/build/mp-weixin/
```
### 3. 使用微信开发者工具上传
1. 打开微信开发者工具
2. 导入 `dist/build/mp-weixin/` 目录
3. 点击「上传」按钮
4. 填写版本号和项目备注
5. 登录微信公众平台提交审核
### 4. 提交审核前检查
- ✅ 已配置合法域名(在微信公众平台)
- ✅ 已通过 AI 深度合成类目审批
- ✅ 已配置隐私协议和用户协议
- ✅ 已测试所有核心功能
1. 导入 `dist/build/mp-weixin/`
2. 点击「上传」
3. 登录微信公众平台提交审核
---
## 数据库初始化
### 1. 创建数据库和用户
```bash
mongo
> use zhiyin
@@ -176,84 +193,59 @@ mongo
})
```
### 2. 创建索引
```bash
cd backend
node scripts/create-indexes.js
```
### 3. 初始化管理员账号(可选)
```bash
node scripts/create-admin.js
```
---
## 监控和日志
## 小程序编译上传
### 1. 日志配置
使用 PM2 查看日志:
### 环境要求
```bash
pm2 logs zhiyin-backend
pm2 logs zhiyin-backend --lines 100
# 安装 miniprogram-ci(已在项目 devDeps 中)
cd zhiyin-app && npm install --save-dev miniprogram-ci
```
### 2. 错误监控
推荐集成
- **Sentry**: 错误追踪
- **PM2 Plus**: 进程监控
- **MongoDB Atlas**: 数据库监控
### 配置
确保以下文件就位
- `dist/build/mp-weixin/` — uni-app 构建输出(`npm run build:mp-weixin`
- 微信小程序私钥文件:`/root/opencode-workspace/微信小程序参数/宇之然AI磁场appid/private.wxf466b3c3bc411ffc.key`
- `project.config.json`(构建时自动生成,appid: wxf466b3c3bc411ffc
### 3. 性能监控
### 编译与预览上传
```bash
# 查看进程状态
pm2 monit
cd zhiyin-app
# 查看资源占用
pm2 list
# 构建微信小程序
npm run build:mp-weixin
# 预览(生成二维码)
node scripts/upload-mp.js
# 直接上传(修改脚本中 ci.preview → ci.upload
```
---
## 常见问题
### Q1: MongoDB 连接失败
**A**: 检查 `.env.production` 中的 `MONGODB_URI` 是否正确,确保数据库可访问。
### Q2: 微信小程序请求失败
**A**: 确保在微信公众平台配置了合法域名(必须是 HTTPS)。
### Q3: AI 调用失败
**A**: 检查 `AI_PRIMARY_KEY``AI_BACKUP_KEY` 是否正确,确保 API 额度充足。
### 版本号
当前线上版本:**1.0.3**(见 note.txt
---
## 安全检查清单
- [ ] 修改默认 JWT_SECRET
- [ ] 已禁用开发模式的固定验证码
- [ ] 已配置 CORS 白名单
- [ ] 已启用 HTTPS
- [ ] 配置 MongoDB 访问权限
- [ ] 已移除控制台日志(生产环境)
- [ ] 配置速率限制(防止滥用)
- [ ] 修改默认 JWT_SECRET(当前已有环境变量值)
- [ ] 移除开发模式的固定验证码 123456
- [x] 移除 `member/pay` 开发绕过(已改为真实订单校验)
- [x] 套餐值统一:vip → growth/sprint(采访轮次、分析次数不再受限)
- [ ] 配置 CORS 白名单(当前: `origin: '*'`
- [ ] 启用 HTTPS
- [ ] 配置 MongoDB 访问权限
- [ ] 移除 console.log(生产环境)
- [x] 配置微信支付生产密钥(证书已验证)
- [x] 配置微信小程序密钥(appid: wxf466b3c3bc411ffc
- [ ] 配置每日一题订阅消息模板 IDWX_DAILY_QUESTION_TMPL
---
## 回滚方案
## 变更记录
如果需要回滚到上一个版本:
```bash
# 1. 查看 PM2 历史
pm2 logs zhiyin-backend --lines 1000
# 2. 重启到上一个版本
pm2 restart zhiyin-backend --version <previous-version>
# 3. 数据库回滚(如有迁移)
mongorestore --uri="<connection-string>" --drop backup/
```
---
**最后更新**: 2026-06-02
| 日期 | 变更内容 | 操作者 |
|------|----------|--------|
| 2026-06-09 | 初版 | AI |
| 2026-06-09 | 更新生产域名:zhiyinwx.yzrcloud.cnAPI :3006)、zhiyin.yzrcloud.cnH5 静态目录) | 小之 |