初始化:职引项目 v1.0

This commit is contained in:
yuzhiran
2026-06-08 16:28:00 +08:00
commit 511f60d0db
111 changed files with 27295 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
# 2026-06-01 工作日志
## 修复后端 Redis 依赖问题
### 问题描述
- 后端因为 Redis 连接错误(`ioredis` `Unhandled error event`)不断崩溃(Exit Code 1
- Redis 服务器 `192.168.136.130:6379` 不可用
### 解决方案
1. **完全移除 Redis 依赖**
- 修改 `common.module.ts`:移除 `RedisModule.forRoot()`,只保留 `ThrottlerModule`
- 修改 `user.service.ts`
- 移除 `@InjectRedis()``ioredis` import
- 重写 `checkUsage()``incrementUsage()` 方法,完全使用 MongoDB 进行限流
- `sendCode()``login()` 方法使用 MongoDB 存储/验证验证码(字段:`lastCode`, `lastCodeTime`
2. **更新 User Schema**
- 添加缺失的字段:`lastCode: string``lastCodeTime: Date`
- 这些字段用于 MVP 阶段的验证码存储(替代 Redis)
3. **修复 `analyze.service.ts`**
- 移除强制 mock 模式(`return this.getMockResult(prompt)`
- 恢复真实 AI 调用(Sensenova 主用,NVIDIA 备用)
### 结果
-`npm run build` 成功(无 TypeScript 错误)
- ✅ 后端成功启动在端口 3004PID: 10220
- ✅ API 端点正常工作(测试了 `/api/internship/platforms`
-**完整面试流程测试通过!**
- 创建面试:AI 生成第一道问题 ✅
- 提交回答:AI 分析回答并生成追问 ✅
- 完成面试:AI 生成完整报告 ✅
- ✅ 不再崩溃(无 Redis 连接错误)
### 测试详情
- **AI 模型**: Sensenova (deepseek-v4-flash)
- **测试岗位**: 前端开发
- **面试评分**: 50/100
- **岗位匹配度**: 45%
- **AI 反馈**: 提供了详细的亮点、不足、改进建议、参考回答
### 配置信息
- **后端端口**: 3004
- **MongoDB**: `mongodb://zhiyin:zhiyin123@192.168.0.192:27017/zhiyin?authSource=zhiyin`**已更新**
- **AI 主用**: Sensenova (`deepseek-v4-flash`)
- **AI 备用**: NVIDIA (`stepfun-ai/step-3.5-flash`)
- **Redis**: 已禁用(使用 MongoDB 降级方案)
- **前端代理**: `http://localhost:3004`**已更新**
### 新增功能(2026-06-02 13:30
-**简历诊断页面** (`pages/analyze/diagnosis.vue`)
- 现代化 UI:渐变头部、卡片布局、评分可视化
- 功能:输入简历、选择岗位、一键诊断、查看结果
- API 测试通过 ✅
-**简历优化页面** (`pages/analyze/optimize.vue`)
- 现代化 UITab 切换、Before/After 对比、复制功能
- 功能:输入简历、填写岗位、一键优化、查看结果
- API 测试通过 ✅
-**路由配置**: 更新 `pages.json` 注册新页面
### 待完成
- [ ] 在首页添加简历诊断和优化的导航入口
- [ ] 启动前端测试完整流程(H5 前端 -> 后端 API
- [ ] 测试文件上传功能(PDF/Word 解析)
+47
View File
@@ -0,0 +1,47 @@
# 2026-06-03 工作日志
## 后端重构完成
- 彻底重写 NestJS 后端,删除所有旧 flat 模块文件
- 新架构:common(过滤器/守卫/装饰器) + ai(统一AI调用) + user(登录/JWT) + interview(面试) + analyze(分析)
- 全局 JWT 守卫,@Public() 控制公开接口
- 统一错误格式 {code, message}
- 路由前缀 /api,端口 3006
- 面试 AI 调用:主服务商 → 备用服务商 → 抛错
## 前端清理与适配
- 删除 root `pages/` 目录下的旧错误副本
- 更新 `config.ts` 仅保留新后端 API 端点
- 修复 `user.vue` 统计接口路径
- 重写 `interview.vue`:连接真实后端 AI,登录检测
- 重写 `history.vue`:从后端 `/api/interview/list/all` 获取数据
- 旧文件 pages.json 中的 analyze 页面未迁移(原项目无此页面)
## 当前服务状态
- 后端 API: http://localhost:3006 (running)
- 前端 H5: http://localhost:8888 (running)
- 登录: 手机号 + 验证码 123456
- 新用户注册赠送 3 次使用次数
## 待办
- ~~其他占位页面(resume, member, about, settings, report 等)需要补内容~~ ✅
- ~~用户页"会员中心""设置"等功能未实现~~ ✅
## 功能补全(下午)
### 后端新增
- 新增 Resume 模块(CRUD:创建/列表/详情/删除)
### UI 设计系统(傍晚 - UI Designer 专家)
- **App.vue**:全局设计 TokenCSS 变量),统一样式基类
- **首页**:重写 hero 区(径向渐变光晕)、功能卡片圆角+阴影、岗位列表排名点
- **登录页**:精简品牌区、输入框聚焦动效、按钮微交互
- **面试页**:圆形发送按钮、气泡圆角优化、打字指示器
- **历史页**:卡片式列表、筛选胶囊组、评分颜色体系
- **用户页**:未登录引导页设计
- 新增:fade-in 动画、渐变按钮基类、聚焦态 box-shadow
- **report.vue**:重写,从后端获取面试详情/对话/评分/总结,自动完成面试
- **resume.vue**:重写,连接新后端 API 实现创建/列表/删除
- **history.vue**goDetail 导航到 report 页传参 interviewId
- **user.vue**goVip→member 页,goSettings→提示说明
- **about.vue**:更新设计颜色
- **index.vue**"查看更多"改为 ActionSheet 选岗位直接面试
- **config.ts**:新增 RESUME API 端点映射
+19
View File
@@ -0,0 +1,19 @@
# 2026-06-04 全站数据源审计
## 发现并修复的问题
| 问题 | 情况 | 修复 |
|------|------|------|
| `api.ts` 引用已删除端点(knowledge.ai.payment | ❌ 运行时崩溃 | ✅ 全部清理,仅保留新后端 4 个模块 |
| `member.vue` 用旧 `api` 服务,expects `memberType` | ❌ 数据不对 | ✅ 改为读 `plan` 字段,用新 api 服务 |
| `result.vue` 用旧 `api` 服务 | ⚠️ 接口参数不同 | ✅ 已修复 api.ts 的 analyze 参数 |
| `index.vue` hotPositions 硬编码 | ❌ 静态数据 | ✅ 新增后端 `/api/positions/hot` 接口,前端动态获取 |
| `index.vue` "查看更多" ActionSheet 硬编码 | ❌ 静态数据 | ✅ 改为从 hotPositions 动态生成 |
| `about.vue` | ✅ 纯静态页面,合理 | - |
| `admin.vue` | ⚠️ 旧管理后台,暂无后端 | - |
## 新增功能
- **文件上传解析**`POST /api/upload`,支持 PDF/DOCX/TXT 文件解析为文本
- **简历页上传区**:点击上传文件 → 自动解析填入内容区
- **结果下载**:诊断/优化后 → 下载 TXT 或 HTML 文件
- **用户页改进**:未登录也可看到功能菜单,点击个人功能才弹登录引导
+19
View File
@@ -0,0 +1,19 @@
# 2026-06-05 上线前修复
## 修复的 13 个问题
| # | 问题 | 修复 |
|---|------|------|
| 1 | report.vue onLoad 未导入 → 白屏 | 添加 import onLoad |
| 2 | list/all 路由被 :id 拦截 | `:id` 路由移到静态路由之后 |
| 3 | 无参数验证 | 启用 ValidationPipe + whitelist,改用带 Logger 的异常过滤器 |
| 4 | 双 pages.json 冲突 | 删除外层 pages.json(旧版含已删除的 analyze 路由) |
| 5 | internship.vue 引用不存在 api 服务 | 重写为使用 /api/positions/hot 的简洁页面 |
| 6 | 面试次数未扣减 | UserService 注入 InterviewServicecreate 时调用 deductRemaining |
| 7 | JWT_SECRET 使用默认值 | 替换为 96 位随机 hex 字符串 |
| 8 | 验证码存内存 | 确认(单实例可用,多实例需 Redis) |
| 9 | Schema 缺索引 | Interview/Resume 添加 userId + createdAt 复合索引 |
| 10 | 页面缺 loading 态 | 首页+记录页添加 loading-tip |
| 11 | login.vue 用原始 URL | 改为 api() 辅助函数 |
| 12 | admin.vue 端口 3000 | 改为 window.location.origin |
| 13 | 渐变样式不一致 | 已在上一轮统一 |