This commit is contained in:
张成
2026-02-28 10:38:28 +08:00
parent 1a011bcc01
commit dfd3119163
44 changed files with 449 additions and 13555 deletions

View File

@@ -1,140 +0,0 @@
# AI 功能禁用说明
## 📋 概述
根据需求AI 接入功能暂时禁用,作为二期规划。当前使用简单的文本匹配来实现职位过滤功能。
## ✅ 已完成的修改
### 1. 创建文本匹配过滤服务
- ✅ 创建了 `api/middleware/job/job_filter_service.js`
- 实现基于文本匹配的职位分析
- 支持技能匹配、经验匹配、薪资匹配
- 支持外包检测和关键词过滤
### 2. 禁用 AI 服务调用
#### 2.1 jobManager.js
- ✅ 注释掉 `aiService` 引用
- ✅ 禁用 `analyzeResumeWithAI()` 调用
- ✅ 修改 `analyzeResume()` 使用文本匹配
#### 2.2 resumeManager.js
- ✅ 注释掉 `aiService` 引用
- ✅ 修改 `analyzeResume()` 使用文本匹配
- ✅ 修改 `calculateMatchScore()` 使用 `jobFilterService.analyzeJobMatch()`
#### 2.3 chatManager.js
- ✅ 注释掉 `aiService` 引用
- ✅ 修改 `generateChatContent()` 使用默认模板
- ✅ 修改 `generateInterviewInvitation()` 使用默认模板
- ✅ 添加 `generateDefaultChatContent()` 方法
- ✅ 添加 `generateDefaultInterviewInvitation()` 方法
## 🔧 文本匹配过滤功能
### 功能特性
1. **技能匹配度计算**
- 从职位描述中提取技能关键词
- 与简历技能进行匹配
- 计算匹配百分比0-100分
2. **经验匹配度计算**
- 从职位描述中提取经验要求
- 与简历工作经验进行匹配
- 计算匹配分数
3. **薪资合理性计算**
- 解析职位薪资范围
- 与期望薪资进行对比
- 计算匹配分数
4. **外包检测**
- 检测职位描述中的外包关键词
- 标记是否为外包岗位
5. **关键词过滤**
- 支持包含关键词过滤
- 支持排除关键词过滤
- 支持自定义排除关键词列表
### 使用示例
```javascript
const jobFilterService = require('./job_filter_service');
// 分析职位匹配度
const analysis = jobFilterService.analyzeJobMatch(jobInfo, resumeInfo);
console.log('综合分数:', analysis.overallScore);
console.log('技能匹配:', analysis.skillMatch);
console.log('是否为外包:', analysis.isOutsourcing);
// 过滤职位列表
const filteredJobs = jobFilterService.filterJobs(jobs, {
minScore: 60, // 最低匹配分数
excludeOutsourcing: true, // 排除外包
excludeKeywords: ['销售', '客服'] // 排除关键词
}, resumeInfo);
```
## 📝 默认模板
### 聊天内容模板
- **greeting**: "您好,我对这个岗位很感兴趣,希望能进一步了解。"
- **interview**: "感谢您的回复,我很期待与您进一步沟通。"
- **followup**: "您好,想了解一下这个岗位的最新进展。"
### 面试邀约模板
- "感谢您的邀请,我很期待与您面谈。请问方便的时间是什么时候?"
## ⚠️ 注意事项
1. **AI 服务文件保留**
- `api/middleware/job/aiService.js` 文件保留,但不再被调用
- 二期规划时可以重新启用
3. **日志提示**
- 所有禁用 AI 的地方都有日志提示
- 明确标注"AI分析已禁用二期规划"
## 🔄 二期规划恢复步骤
当需要恢复 AI 功能时:
1. 取消注释所有 `aiService` 引用
2. 恢复 AI 方法调用
3. 移除或注释文本匹配的替代代码
4. 测试 AI 服务连接和功能
## 📊 当前功能对比
| 功能 | AI 版本 | 文本匹配版本 |
|------|---------|-------------|
| 简历分析 | AI 智能分析 | 技能关键词提取 |
| 职位匹配 | AI 深度分析 | 文本匹配评分 |
| 聊天生成 | AI 个性化生成 | 固定模板 |
| 面试邀约 | AI 个性化生成 | 固定模板 |
| 外包检测 | AI 判断 | 关键词匹配 |
## 🎯 后续优化建议
1. **增强文本匹配**
- 添加更多技能关键词
- 优化匹配算法
- 支持同义词匹配
2. **规则配置化**
- 将过滤规则配置化
- 支持用户自定义规则
- 支持规则优先级
3. **匹配度优化**
- 优化评分算法
- 添加更多匹配维度
- 支持权重配置

View File

@@ -1,968 +0,0 @@
# 自动找工作系统 - MQTT指令列表
> 版本: v1.0 | 更新日期: 2025-12-25
## 文档说明
本文档定义了服务端通过MQTT向客户端下发的所有指令格式和规范。所有操作都通过任务和指令的方式异步执行。
---
## 一、MQTT通信架构
### 1.1 通信流程
```
┌──────────────┐ ┌──────────────┐
│ 服务端 │ │ 客户端 │
│ (Node.js) │ │ (设备端) │
└──────┬───────┘ └──────┬───────┘
│ │
│ ① 创建任务(task_status表) │
│ ② 生成指令(task_commands表) │
│ │
│ ③ MQTT Publish │
│ Topic: {sn_code}/command │
│ ─────────────────────────────> │
│ │
│ ④ 执行指令 │
│ ⑤ 生成结果 │
│ │
│ ⑥ MQTT Publish │
│ Topic: response │
│ <───────────────────────────── │
│ │
│ ⑦ 更新指令状态(task_commands) │
│ ⑧ 更新任务状态(task_status) │
│ │
```
### 1.2 MQTT配置
- **Broker地址**: `mqtt://192.144.167.231:1883`
- **订阅主题**:
- `heartbeat` - 设备心跳信息
- `response` - 设备响应信息
- **发布主题**:
- `{sn_code}/command` - 向指定设备发送指令
### 1.3 消息格式
**服务端 → 客户端 (指令)**
```json
{
"commandId": "uuid",
"taskId": "uuid",
"platform": "boss",
"action": "search_jobs",
"data": {
"keyword": "全栈工程师",
"city": "101020100",
"page": 1
}
}
```
**客户端 → 服务端 (响应)**
```json
{
"commandId": "uuid",
"taskId": "uuid",
"code": 200,
"message": "执行成功",
"data": {
// 返回数据
}
}
```
**客户端 → 服务端 (心跳)**
```json
{
"sn_code": "device001",
"platform": "boss",
"timestamp": 1672531200000,
"status": "online",
"version": "1.0.0"
}
```
---
## 二、已实现指令列表
### 2.1 用户登录指令
#### get_login_qr_code - 获取登录二维码
**指令格式**
```json
{
"action": "get_login_qr_code",
"platform": "boss",
"data": {}
}
```
**返回格式**
```json
{
"code": 200,
"message": "二维码获取成功",
"data": {
"qrCode": "https://example.com/qrcode.png",
"qr_code_url": "https://example.com/qrcode.png",
"expire_time": 300
}
}
```
**说明**: 获取登录二维码,用户扫码登录后客户端需要保存cookies/token
---
#### get_user_info - 获取用户信息
**指令格式**
```json
{
"action": "get_user_info",
"platform": "boss",
"data": {}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"userId": "123456",
"userName": "张三",
"phone": "138****5678",
"isLoggedIn": true
}
}
```
**说明**: 获取当前登录用户的基本信息,验证登录状态
---
### 2.2 简历管理指令
#### get_online_resume - 获取在线简历
**指令格式**
```json
{
"action": "get_online_resume",
"platform": "boss",
"data": {}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"baseInfo": {
"name": "张三",
"gender": 1,
"age": 28,
"account": "138****5678",
"emailBlur": "zhang***@qq.com",
"workYears": 5,
"workYearDesc": "5年",
"degreeCategory": "本科"
},
"expectList": [{
"positionName": "全栈工程师",
"locationName": "上海",
"salaryDesc": "20-30K",
"industryDesc": "互联网"
}],
"workExpList": [{
"companyName": "XX科技公司",
"positionName": "高级前端工程师",
"startDate": "2020-01",
"endDate": "2023-12",
"workContent": "负责前端架构设计和开发..."
}],
"projectExpList": [{
"name": "电商平台项目",
"roleName": "技术负责人",
"startDate": "2022-01",
"endDate": "2023-06",
"projectDesc": "项目描述...",
"performance": "项目成果..."
}],
"educationExpList": [{
"school": "XX大学",
"major": "计算机科学与技术",
"degreeName": "本科",
"endYear": 2018
}],
"userDesc": "熟悉Vue、React、Node.js等技术栈...",
"certificationList": []
}
}
```
**说明**: 获取用户在招聘平台上的完整简历信息
---
### 2.3 岗位搜索指令
#### search_jobs - 搜索岗位 (已实现但需完善)
**指令格式**
```json
{
"action": "search_jobs",
"platform": "boss",
"data": {
"keyword": "全栈工程师",
"city": "101020100",
"page": 1
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "搜索成功",
"data": {
"total": 150,
"page": 1,
"jobList": [{
"jobId": "job123456",
"jobTitle": "全栈工程师",
"companyName": "XX科技公司",
"companySize": "100-499人",
"salary": "20-30K",
"location": "上海·浦东新区",
"experience": "3-5年",
"education": "本科",
"jobRequirements": "1. 熟悉Vue/React...",
"jobDescription": "岗位职责...",
"bossName": "张经理",
"bossTitle": "技术总监"
}]
}
}
```
**说明**: 当前实现基础,需要扩展支持更多搜索条件
---
#### get_job_list - 获取岗位列表
**指令格式**
```json
{
"action": "get_job_list",
"platform": "boss",
"data": {
"page": 1,
"pageSize": 20
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"total": 50,
"page": 1,
"jobList": [
// 同 search_jobs 的 jobList 格式
]
}
}
```
**说明**: 获取推荐岗位列表
---
### 2.4 投递管理指令
#### apply_job - 投递岗位 (基础实现)
**指令格式**
```json
{
"action": "apply_job",
"platform": "boss",
"data": {
"jobId": "job123456",
"expectSalary": "20-30K"
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "投递成功",
"data": {
"applyId": "apply123456",
"jobId": "job123456",
"applyTime": "2025-12-25 10:30:00",
"status": "success"
}
}
```
**错误码**
- `400` - 参数错误
- `403` - 已投递过该岗位
- `429` - 投递次数达到上限
- `500` - 投递失败
**说明**: 向指定岗位投递简历
---
### 2.5 聊天管理指令
#### get_chat_list - 获取聊天列表
**指令格式**
```json
{
"action": "get_chat_list",
"platform": "boss",
"data": {
"page": 1,
"pageSize": 20
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"total": 15,
"chatList": [{
"conversationId": "conv123456",
"jobId": "job123456",
"jobTitle": "全栈工程师",
"companyName": "XX科技",
"bossName": "张经理",
"lastMessage": "您好,请问...",
"lastMessageTime": "2025-12-25 10:30:00",
"unreadCount": 2,
"hasInterview": false
}]
}
}
```
**说明**: 获取与HR的聊天会话列表
---
#### send_chat_message - 发送聊天消息
**指令格式**
```json
{
"action": "send_chat_message",
"platform": "boss",
"data": {
"conversationId": "conv123456",
"jobId": "job123456",
"content": "您好,我对这个岗位很感兴趣..."
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "发送成功",
"data": {
"messageId": "msg123456",
"sendTime": "2025-12-25 10:30:00"
}
}
```
**说明**: 向HR发送聊天消息
---
### 2.6 测试和调试指令
#### open_bot_detection - 打开测试页
**指令格式**
```json
{
"action": "open_bot_detection",
"platform": "boss",
"data": {}
}
```
**返回格式**
```json
{
"code": 200,
"message": "测试页已打开",
"data": {}
}
```
**说明**: 打开测试页面,用于调试
---
## 三、待开发指令列表
### 3.1 搜索投递增强指令 (优先级: HIGH)
#### search_jobs_enhanced - 增强搜索岗位 ⭐⭐⭐⭐⭐
**指令格式**
```json
{
"action": "search_jobs_enhanced",
"platform": "boss",
"data": {
"keyword": "全栈工程师",
"city": "101020100",
"page": 1,
"pageSize": 20,
// 新增搜索条件
"experience": "3",
"degree": "203",
"salary": "406",
"scale": "303",
"stage": "807",
"position": "100109",
// 滚动加载方式
"scrollLoadType": "auto",
"maxScrollPages": 5
}
}
```
**参数说明**
| 参数 | 说明 | 示例值 |
|------|------|--------|
| keyword | 搜索关键词 | "全栈工程师" |
| city | 城市代码 | "101020100" (上海) |
| page | 页码 | 1 |
| pageSize | 每页数量 | 20 |
| experience | 工作经验 | "1"=1年以下, "3"=1-3年, "4"=3-5年, "5"=5-10年, "6"=10年以上 |
| degree | 学历要求 | "202"=不限, "203"=大专, "204"=本科, "205"=硕士, "206"=博士 |
| salary | 薪资范围 | "402"=3-5K, "403"=5-10K, "404"=10-15K, "405"=15-20K, "406"=20-30K, "407"=30-50K, "408"=50K以上 |
| scale | 公司规模 | "302"=0-20人, "303"=20-99人, "304"=100-499人, "305"=500-999人, "306"=1000人以上 |
| stage | 融资阶段 | "801"=未融资, "802"=天使轮, "803"=A轮, "804"=B轮, "805"=C轮, "806"=D轮及以上, "807"=已上市, "808"=不需要融资 |
| position | 职位类型 | "100109"=全栈, "100110"=前端, "100111"=后端, "100112"=移动端 |
| scrollLoadType | 加载方式 | "auto"=自动滚动, "manual"=手动翻页 |
| maxScrollPages | 最大滚动页数 | 5 |
**返回格式**
```json
{
"code": 200,
"message": "搜索成功",
"data": {
"total": 150,
"page": 1,
"hasMore": true,
"jobList": [{
"jobId": "job123456",
"jobTitle": "全栈工程师",
"companyName": "XX科技公司",
"companySize": "100-499人",
"companyIndustry": "互联网",
"companyStage": "已上市",
"salary": "20-30K",
"salaryMonth": "14薪",
"location": "上海·浦东新区",
"longitude": 121.5273,
"latitude": 31.2172,
"experience": "3-5年",
"education": "本科",
"skills": ["Vue", "React", "Node.js"],
"jobRequirements": "1. 熟悉Vue/React...",
"jobDescription": "岗位职责...",
"welfare": ["五险一金", "带薪年假", "弹性工作"],
"bossName": "张经理",
"bossTitle": "技术总监",
"bossActiveStatus": "刚刚活跃",
"publishTime": "2025-12-25",
"viewCount": 150,
"applyCount": 30,
"isOutsourcing": false,
"jobLink": "https://www.zhipin.com/job_detail/xxx"
}]
}
}
```
**说明**:
- 支持Boss直聘完整的搜索筛选条件
- 支持自动滚动加载更多岗位
- 返回更详细的岗位信息
---
#### search_by_url - 通过URL搜索岗位 ⭐⭐⭐⭐⭐
**指令格式**
```json
{
"action": "search_by_url",
"platform": "boss",
"data": {
"url": "https://www.zhipin.com/web/geek/jobs?city=101020100&query=%E5%85%A8%E6%A0%88%E5%B7%A5%E7%A8%8B%E5%B8%88",
"scrollLoadType": "auto",
"maxScrollPages": 5
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "搜索成功",
"data": {
// 同 search_jobs_enhanced 返回格式
}
}
```
**说明**:
- 直接使用Boss直聘的搜索URL
- 自动解析URL参数
- 支持所有筛选条件
---
### 3.2 批量投递指令 (优先级: HIGH)
#### batch_apply_jobs - 批量投递岗位 ⭐⭐⭐⭐⭐
**指令格式**
```json
{
"action": "batch_apply_jobs",
"platform": "boss",
"data": {
"jobIds": ["job001", "job002", "job003"],
"expectSalary": "20-30K",
"applyInterval": 30,
"maxApplyCount": 10
}
}
```
**参数说明**
| 参数 | 说明 | 示例值 |
|------|------|--------|
| jobIds | 岗位ID数组 | ["job001", "job002"] |
| expectSalary | 期望薪资 | "20-30K" |
| applyInterval | 投递间隔(秒) | 30 |
| maxApplyCount | 最大投递数量 | 10 |
**返回格式**
```json
{
"code": 200,
"message": "批量投递完成",
"data": {
"total": 10,
"success": 8,
"failed": 2,
"results": [{
"jobId": "job001",
"status": "success",
"applyId": "apply001",
"message": "投递成功"
}, {
"jobId": "job002",
"status": "failed",
"message": "已投递过该岗位"
}]
}
}
```
**说明**:
- 批量投递多个岗位
- 控制投递间隔避免被限制
- 返回每个岗位的投递结果
---
### 3.3 简历刷新指令 (优先级: HIGH)
#### refresh_resume - 刷新简历 ⭐⭐⭐⭐
**指令格式**
```json
{
"action": "refresh_resume",
"platform": "boss",
"data": {}
}
```
**返回格式**
```json
{
"code": 200,
"message": "简历刷新成功",
"data": {
"refreshTime": "2025-12-25 10:30:00",
"nextRefreshTime": "2025-12-25 12:30:00"
}
}
```
**说明**:
- 刷新简历提升排名
- 每2小时可刷新一次
---
### 3.4 账号保活指令 (优先级: HIGH)
#### auto_active - 自动活跃账号 ⭐⭐⭐⭐
**指令格式**
```json
{
"action": "auto_active",
"platform": "boss",
"data": {
"actionType": "random",
"actions": ["browse_jobs", "view_company", "search_keyword", "update_visibility"]
}
}
```
**参数说明**
| 参数 | 说明 | 可选值 |
|------|------|--------|
| actionType | 动作类型 | "random"=随机, "sequence"=顺序 |
| actions | 动作列表 | ["browse_jobs", "view_company", "search_keyword", "update_visibility"] |
**动作说明**
- `browse_jobs` - 浏览岗位(随机点击5-10个岗位)
- `view_company` - 查看公司主页
- `search_keyword` - 搜索关键词(随机关键词)
- `update_visibility` - 修改简历可见性
**返回格式**
```json
{
"code": 200,
"message": "活跃操作完成",
"data": {
"executedActions": ["browse_jobs", "view_company"],
"duration": 120,
"timestamp": "2025-12-25 10:30:00"
}
}
```
**说明**:
- 模拟真实用户行为
- 随机时间间隔
- 避免账号被标记为机器人
---
### 3.5 聊天增强指令 (优先级: MEDIUM)
#### get_chat_detail - 获取聊天详情 ⭐⭐⭐
**指令格式**
```json
{
"action": "get_chat_detail",
"platform": "boss",
"data": {
"conversationId": "conv123456",
"page": 1,
"pageSize": 50
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"conversationId": "conv123456",
"jobId": "job123456",
"messages": [{
"messageId": "msg001",
"senderId": "boss123",
"senderType": "boss",
"content": "您好,请问什么时候方便面试?",
"sendTime": "2025-12-25 10:30:00",
"isRead": true,
"messageType": "text",
"isInterviewInvitation": true
}]
}
}
```
**说明**: 获取完整的聊天历史记录
---
#### send_greeting - 发送打招呼 ⭐⭐⭐
**指令格式**
```json
{
"action": "send_greeting",
"platform": "boss",
"data": {
"jobId": "job123456",
"content": "您好,我对这个岗位很感兴趣,期待能有机会详聊。"
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "打招呼成功",
"data": {
"conversationId": "conv123456",
"messageId": "msg001",
"sendTime": "2025-12-25 10:30:00"
}
}
```
**说明**: 主动向HR发起沟通
---
### 3.6 数据采集指令 (优先级: MEDIUM)
#### get_job_detail - 获取岗位详情 ⭐⭐⭐
**指令格式**
```json
{
"action": "get_job_detail",
"platform": "boss",
"data": {
"jobId": "job123456"
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"jobId": "job123456",
// 完整的岗位详情(同search_jobs_enhanced中的jobList项)
"companyDetail": {
"companyId": "company123",
"companyName": "XX科技公司",
"companyLogo": "https://...",
"companySize": "100-499人",
"companyIndustry": "互联网",
"companyStage": "已上市",
"companyAddress": "上海市浦东新区...",
"companyDesc": "公司介绍..."
}
}
}
```
**说明**: 获取岗位的完整详情信息
---
#### get_company_info - 获取公司信息 ⭐⭐⭐
**指令格式**
```json
{
"action": "get_company_info",
"platform": "boss",
"data": {
"companyId": "company123"
}
}
```
**返回格式**
```json
{
"code": 200,
"message": "获取成功",
"data": {
"companyId": "company123",
"companyName": "XX科技公司",
"companyLogo": "https://...",
"companySize": "100-499人",
"companyIndustry": "互联网",
"companyStage": "已上市",
"companyAddress": "上海市浦东新区...",
"companyDesc": "公司介绍...",
"companyBenefit": ["五险一金", "带薪年假"],
"companyPhotos": ["https://...", "https://..."],
"jobCount": 50,
"isVerified": true
}
}
```
**说明**: 获取公司的详细信息
---
## 四、指令执行规范
### 4.1 指令生命周期
```
1. 创建 (pending)
2. 下发 (sent)
3. 执行中 (executing)
4. 完成 (completed) / 失败 (failed) / 超时 (timeout)
```
### 4.2 超时设置
| 指令类型 | 超时时间 | 重试次数 |
|---------|----------|----------|
| 登录类指令 | 60秒 | 1次 |
| 简历获取 | 30秒 | 2次 |
| 岗位搜索 | 60秒 | 2次 |
| 岗位投递 | 30秒 | 1次 |
| 聊天消息 | 30秒 | 2次 |
| 保活操作 | 120秒 | 0次 |
### 4.3 错误码规范
| 错误码 | 说明 | 处理方式 |
|--------|------|----------|
| 200 | 成功 | - |
| 400 | 参数错误 | 不重试 |
| 401 | 未登录 | 触发重新登录 |
| 403 | 无权限/已操作 | 不重试 |
| 429 | 请求过于频繁 | 延迟后重试 |
| 500 | 服务器错误 | 重试 |
| 503 | 服务不可用 | 延迟后重试 |
| 600 | 网络超时 | 重试 |
| 700 | 客户端错误 | 记录日志,不重试 |
### 4.4 重试策略
- **指数退避**: `delay = min(1000 * 2^(retryCount-1), 30000ms)`
- **最大重试次数**: 根据指令类型决定(见4.2表格)
- **可重试错误**: 429, 500, 503, 600
- **不可重试错误**: 400, 401, 403, 700
---
## 五、客户端实现要求
### 5.1 MQTT客户端
- **连接保持**: 断线自动重连
- **心跳间隔**: 10秒
- **订阅主题**: `{sn_code}/command`
- **发布主题**: `response`, `heartbeat`
### 5.2 指令处理
1. **接收指令**
- 解析JSON格式
- 验证必需字段
- 记录指令日志
2. **执行指令**
- 根据action分发到对应处理器
- 更新执行状态
- 捕获异常错误
3. **返回响应**
- 统一响应格式
- 包含commandId用于追踪
- 返回详细的执行结果
### 5.3 异常处理
- **网络异常**: 自动重试
- **登录过期**: 通知服务端重新登录
- **页面加载失败**: 刷新页面重试
- **元素定位失败**: 记录截图,返回错误
### 5.4 日志记录
- **请求日志**: 记录所有接收到的指令
- **响应日志**: 记录所有返回的响应
- **错误日志**: 记录所有异常和错误
- **操作日志**: 记录关键操作步骤
---
## 六、开发优先级
### P0 - 立即开发 (投递核心功能)
1.`search_jobs_enhanced` - 增强搜索
2.`search_by_url` - URL搜索
3.`batch_apply_jobs` - 批量投递
4.`refresh_resume` - 简历刷新
### P1 - 短期开发 (保活和聊天)
5.`auto_active` - 账号保活
6.`send_greeting` - 发送打招呼
7.`get_chat_detail` - 聊天详情
### P2 - 中期开发 (数据采集)
8.`get_job_detail` - 岗位详情
9.`get_company_info` - 公司信息
---
**文档维护**: 开发团队
**最后更新**: 2025-12-25

View File

@@ -1,20 +0,0 @@
# handleAutoDeliverTask ,自动投递岗位
1. 如果 2 小时之内没有获取在线简历 ,则重新获取一下在线简历,没有创建,有则更新
2. 获取职位列表, 按照用户 简历的信息resume_info 中的 skills expectedLocation expectedSalary expectedPosition workYears education location 和 职位类型 job_types 中的 年龄薪资距离职位的位置commonSkillsexcludeKeywords
user_longitude
user_longitude
job_postings和 经纬度 做距离匹配 ,按照 用户中可以配置 is_salary_priority 优先级 按照权重 占比 过滤
defaultValue: [ { "key": "distance", "weight": 50 }, { "key": "salary", "weight": 20 }, { "key": "work_years", "weight": 10 }, { "key": "education", "weight": 20} ]
3.投递合适匹配的岗位

View File

@@ -1,354 +0,0 @@
# 任务与指令的区别说明
## 📋 概述
在调度系统中,**任务Task** 和 **指令Command** 是两个不同层次的概念,它们的关系是:**一个任务可以包含多个指令**。
### ⚠️ 重要说明
**当前系统实际情况**
- **真正的任务**:目前只有 `auto_deliver`(自动投递任务)是真正的任务,它包含多个步骤和指令
- **伪任务**:虽然代码中有 `get_resume``get_job_list``send_chat``apply_job` 等任务处理器,但它们实际上只是包装了单个指令,本质上就是直接执行指令
**为什么会有伪任务**
1. 统一的任务追踪和日志记录
2. 保持接口的一致性
3. 未来可能扩展为真正的任务(包含多个步骤)
## 🔄 层级关系
```
任务Task
├── 指令1Command
├── 指令2Command
└── 指令3Command
```
## 📊 详细对比
| 维度 | 任务Task | 指令Command |
|------|------------|----------------|
| **概念层级** | 业务层 | 执行层 |
| **数据库表** | `task_status` | `task_commands` |
| **管理模块** | TaskQueue任务队列 | CommandManager指令管理器 |
| **处理模块** | TaskHandlers任务处理器 | jobManager业务管理器 |
| **粒度** | 粗粒度(业务流程) | 细粒度(具体操作) |
| **包含关系** | 包含多个指令 | 属于某个任务 |
| **执行方式** | 由任务队列调度 | 由指令管理器执行 |
| **通信方式** | 内部调度 | 通过 MQTT 发送到客户端 |
## 🎯 任务Task
### 定义
任务是业务层面的概念,代表一个完整的业务流程或工作单元。
### 特点
- **业务导向**:代表一个完整的业务目标
- **可包含多个步骤**:一个任务可以包含多个指令
- **有生命周期**pending → running → completed/failed
- **有优先级**:可以设置任务优先级
- **有超时机制**:任务级别有超时保护
### 任务类型示例
**真正的任务(包含多个步骤)**
- `auto_deliver` - 自动投递任务(包含多个子操作:获取简历、获取岗位列表、筛选职位、批量投递)
- `auto_chat` - 自动沟通任务待实现自动与HR进行沟通回复消息等
- `auto_active_account` - 自动活跃账号任务(待实现:自动执行操作保持账号活跃度)
**注意**:目前系统中只有 `auto_deliver` 是已实现的真正任务,`auto_chat``auto_active_account` 是待实现的任务框架。
### 任务表结构task_status
```javascript
{
id: 1,
sn_code: 'GHJU',
taskType: 'auto_deliver',
taskName: '自动投递 - 前端开发',
status: 'running',
priority: 7,
taskParams: { keyword: '前端', platform: 'boss' },
result: {},
startTime: '2024-01-01 10:00:00',
endTime: null,
duration: 0
}
```
### 任务执行流程
```javascript
// 1. 添加任务到队列
await taskQueue.addTask(sn_code, {
taskType: 'auto_deliver',
taskName: '自动投递',
taskParams: { keyword: '前端' }
});
// 2. 任务队列调度执行
// 3. 任务处理器处理任务
// 4. 任务处理器创建并执行指令
```
## ⚙️ 指令Command
### 定义
指令是执行层面的概念,代表一个具体的操作,通过 MQTT 发送到客户端执行。
### 特点
- **执行导向**:代表一个具体的操作
- **原子性**:一个指令是一个不可分割的操作
- **有执行顺序**:指令可以按顺序执行
- **有超时机制**:指令级别有超时保护
- **MQTT 通信**:通过 MQTT 发送到客户端
### 指令类型示例
- `getOnlineResume` - 获取在线简历
- `getJobList` - 获取岗位列表
- `applyJob` - 投递简历
- `sendChatMessage` - 发送聊天消息
- `getLoginQrCode` - 获取登录二维码
### 指令表结构task_commands
```javascript
{
id: 1,
task_id: 100, // 关联的任务ID
command_type: 'getOnlineResume',
command_name: '获取在线简历',
command_params: '{"sn_code":"GHJU"}',
status: 'completed',
sequence: 1,
priority: 9,
start_time: '2024-01-01 10:00:00',
end_time: '2024-01-01 10:00:30',
duration: 30000
}
```
### 指令执行流程
```javascript
// 1. 任务处理器创建指令
const commands = [{
command_type: 'getOnlineResume',
command_name: '获取在线简历',
command_params: JSON.stringify({ sn_code })
}];
// 2. 指令管理器执行指令
await command.executeCommands(taskId, commands, mqttClient);
// 3. 通过 MQTT 发送到客户端
// 4. 客户端执行并返回结果
```
## 🔗 关系示例
### 示例1自动投递任务
**任务**`auto_deliver`(自动投递任务)
**包含的指令**
1. `getOnlineResume` - 获取在线简历
2. `getJobList` - 获取岗位列表
3. `applyJob` - 投递简历(可能多个)
```javascript
// 任务处理器创建多个指令
async handleAutoDeliverTask(task) {
// 1. 获取简历指令
const getResumeCommand = {
command_type: 'getOnlineResume',
command_name: '获取在线简历',
...
};
// 2. 获取岗位列表指令
const getJobListCommand = {
command_type: 'getJobList',
command_name: '获取岗位列表',
...
};
// 3. 投递指令(可能多个)
const applyCommands = jobs.map(job => ({
command_type: 'applyJob',
command_name: `投递简历 - ${job.jobTitle}`,
...
}));
// 执行所有指令
await command.executeCommands(task.id, [
getResumeCommand,
getJobListCommand,
...applyCommands
], mqttClient);
}
```
### 示例2获取简历伪任务实际是指令
**说明**:虽然代码中有 `get_resume` 任务处理器,但它实际上只是包装了单个指令,本质上就是直接执行指令。
**任务**`get_resume`(获取简历任务)
**包含的指令**
1. `getOnlineResume` - 获取在线简历
```javascript
async handleGetResumeTask(task) {
// 实际上只是创建一个指令并执行
const commands = [{
command_type: 'getOnlineResume',
command_name: '获取在线简历',
command_params: JSON.stringify({ sn_code: task.sn_code })
}];
await command.executeCommands(task.id, commands, this.mqttClient);
}
```
**注意**:这种"任务"实际上可以直接作为指令执行,不需要通过任务队列。它们存在的原因可能是为了:
1. 统一的任务追踪和日志记录
2. 未来可能扩展为真正的任务(包含多个步骤)
3. 保持接口的一致性
## 📈 执行流程图
```
┌─────────────────┐
│ 任务队列 │
│ (TaskQueue) │
└────────┬────────┘
│ 调度任务
┌─────────────────┐
│ 任务处理器 │
│ (TaskHandlers) │
└────────┬────────┘
│ 创建指令
┌─────────────────┐
│ 指令管理器 │
│ (CommandManager)│
└────────┬────────┘
│ 执行指令
┌─────────────────┐
│ 业务管理器 │
│ (jobManager) │
└────────┬────────┘
│ MQTT 发送
┌─────────────────┐
│ 客户端设备 │
│ (Python Client)│
└─────────────────┘
```
## 🎨 设计优势
### 1. **职责分离**
- **任务层**:负责业务逻辑和流程编排
- **指令层**:负责具体操作和 MQTT 通信
### 2. **灵活性**
- 一个任务可以包含不同数量的指令
- 可以根据业务需求动态创建指令
### 3. **可追踪性**
- 任务级别:可以追踪整个业务流程
- 指令级别:可以追踪每个具体操作
### 4. **错误处理**
- 任务级别:处理业务逻辑错误
- 指令级别:处理执行错误和超时
## 📝 代码示例
### 任务处理器创建指令
```javascript
// api/middleware/schedule/taskHandlers.js
async handleAutoDeliverTask(task) {
const { sn_code, taskParams } = task;
// 1. 创建获取简历指令
const getResumeCommand = {
command_type: 'getOnlineResume',
command_name: '获取在线简历',
command_params: JSON.stringify({ sn_code, platform: 'boss' })
};
// 2. 创建获取岗位列表指令
const getJobListCommand = {
command_type: 'getJobList',
command_name: '获取岗位列表',
command_params: JSON.stringify({
sn_code,
keyword: taskParams.keyword,
platform: 'boss'
})
};
// 3. 执行指令序列
const result = await command.executeCommands(
task.id,
[getResumeCommand, getJobListCommand],
this.mqttClient
);
return result;
}
```
### 指令管理器执行指令
```javascript
// api/middleware/schedule/command.js
async executeCommand(taskId, command, mqttClient) {
// 1. 创建指令记录
const commandRecord = await db.getModel('task_commands').create({
task_id: taskId,
command_type: command.command_type,
command_name: command.command_name,
status: 'pending'
});
// 2. 调用业务管理器执行
const result = await jobManager[commandType](
sn_code,
mqttClient,
commandParams
);
// 3. 更新指令状态
await this.updateCommandStatus(commandId, 'completed', result);
return result;
}
```
## 🔍 总结
- **任务Task**:业务层面的工作单元,代表一个完整的业务流程
- **真正的任务**:包含多个步骤/指令,如 `auto_deliver`
- **伪任务**:虽然叫任务,但实际只是包装了单个指令,如 `get_resume``get_job_list`
- **指令Command**:执行层面的操作单元,代表一个具体的操作
- 通过 MQTT 发送到客户端执行
- 如:`getOnlineResume``getJobList``applyJob`
- **关系**
- 真正的任务包含多个指令,指令按顺序执行
- 伪任务只是指令的包装,本质上就是直接执行指令
- **管理**:任务由任务队列管理,指令由指令管理器管理
- **通信**:任务在服务端内部调度,指令通过 MQTT 发送到客户端
- **当前状态**
- 目前系统中只有 `auto_deliver` 是真正的任务(包含多个步骤)
- 其他如 `get_resume``get_job_list``send_chat``apply_job` 虽然叫任务,但实际只是指令的包装
这种设计实现了业务逻辑和执行逻辑的分离,提高了系统的灵活性和可维护性。伪任务的存在可能是为了统一的任务追踪和未来扩展。

View File

@@ -1,874 +0,0 @@
# 自动找工作系统 - 功能规划文档
> 版本: v1.0 | 规划日期: 2025-12-25 | 状态: 待开发
## 文档说明
本文档规划了自动找工作系统的未开发功能,按优先级分为4个方向共20项功能。每项功能包含现状分析、待开发内容和预期价值,可直接转化为开发任务。
## 优先级说明
- **HIGH**: 核心功能,对系统价值提升明显,建议优先开发
- **MEDIUM**: 重要优化,提升用户体验和系统性能,可分阶段实施
- **LOW**: 未来规划,可根据实际需求决定是否开发
---
## 第一部分: 功能完善和补充
**优先级: HIGH** | **预计工期: 4-6周**
### 1.1 自动聊天功能完善 ⭐⭐⭐⭐⭐
**现状分析**
- ✅ 聊天记录表结构完整 (`chat_records`)
- ✅ AI聊天内容生成基础框架 (`aiService.generateChatContent`)
- ✅ 聊天类型分类 (greeting/followup/interview/reply)
- ❌ AI生成器未完整实现
- ❌ 聊天时机判断逻辑缺失
- ❌ 多轮对话上下文管理未实现
**待开发内容**
1. **AI聊天内容生成器完整实现**
- 完善 Prompt 模板(不同场景)
- 集成简历信息和岗位描述
- 个性化内容生成(根据HR回复调整策略)
- 长度和语气控制
2. **聊天时机智能判断**
- HR查看后多久发消息(规则+AI预测)
- 避免过于频繁或过晚联系
- 根据不同平台特性调整策略
- 工作时间优先发送
3. **多轮对话上下文管理**
- 记录对话历史
- 上下文理解(避免重复询问)
- 话题延续和自然过渡
- 面试邀约智能识别和响应
4. **情感分析和回复策略调整**
- 分析HR回复的情感倾向
- 根据情感调整后续策略
- 识别拒绝信号(及时停止沟通)
- 识别兴趣信号(加大沟通力度)
**技术实现**
- 文件路径: `api/middleware/job/chatManager.js`
- 依赖: `aiService.js`, `chat_records表`
- 预计工期: 2周
**预期价值**
- 📈 HR回复率提升 30%+
- 📈 面试邀约率提升 20%+
- 💡 减少人工沟通成本 80%+
- ✨ 提供24小时自动化沟通能力
---
### 1.2 账号保活任务 ⭐⭐⭐⭐⭐
**现状分析**
- ✅ 配置项已有 (`pla_account.auto_active`, `active_interval`, `active_actions_json`)
- ✅ 任务类型定义 (`auto_active_account`)
- ❌ 执行逻辑未实现
- ❌ 行为模拟策略缺失
**待开发内容**
1. **定时浏览岗位模拟真实用户**
- 随机浏览岗位详情
- 模拟点击、滚动行为
- 页面停留时间随机化(10-60秒)
- 每日浏览次数控制(5-20次)
2. **随机时间间隔访问**
- 避免固定时间访问(容易被识别)
- 工作时间随机分布
- 模拟午休和下班后的访问
- 周末降低活跃频率
3. **多样化操作行为**
- 搜索岗位(随机关键词)
- 查看推荐岗位
- 浏览公司主页
- 修改简历可见性
- 更新最后活跃时间
4. **避免账号被标记为机器人**
- 行为模式随机化
- 添加鼠标轨迹模拟
- 操作速度人性化(不要太快)
- 避免连续大量操作
**技术实现**
- 文件路径: `api/middleware/schedule/taskHandlers.js` (新增 `handleAutoActiveTask`)
- MQTT指令: 新增 `auto_active` 操作类型
- 预计工期: 1周
**预期价值**
- 📉 账号封禁风险降低 70%+
- 📈 简历曝光率提升 40%+
- 🔒 账号在线状态保持稳定
- ✨ 自动维护账号活跃度
---
### 1.3 简历自动更新 ⭐⭐⭐⭐
**现状分析**
- ✅ 简历同步功能完整
- ✅ 简历信息存储完善
- ❌ 简历刷新逻辑未实现
- ❌ 简历优化建议缺失
**待开发内容**
1. **定时刷新简历排名**
- 每天自动刷新简历(提升排名)
- 最佳刷新时间智能选择(如早上9点)
- 通过MQTT下发刷新指令
- 记录刷新历史和效果
2. **简历内容优化建议**
- AI分析当前简历不足
- 给出具体优化建议(哪些技能需要补充)
- 对比同类岗位的简历特征
- 建议调整项目经验描述
3. **A/B测试不同简历版本效果**
- 支持多个简历版本
- 自动切换测试
- 统计不同版本的查看率和回复率
- 推荐最优版本
**技术实现**
- 文件路径: `api/middleware/job/resumeManager.js` (新增刷新方法)
- MQTT指令: 新增 `refresh_resume` 操作
- 数据库: `resume_info` 新增 `last_refresh_time` 字段
- 预计工期: 1周
**预期价值**
- 📈 简历曝光率提升 50%+
- 📈 查看率提升 30%+
- 💡 简历质量持续优化
- ✨ 自动维护简历新鲜度
---
### 1.4 岗位黑名单和收藏 ⭐⭐⭐⭐
**现状分析**
- ❌ 黑名单功能未实现
- ❌ 收藏功能未实现
- ❌ 岗位对比功能缺失
**待开发内容**
1. **公司黑名单**
- 不再投递某公司的岗位
- 黑名单原因记录(薪资虚标、工作内容不符等)
- 支持批量添加
- 黑名单导入导出
2. **岗位类型黑名单**
- 不再投递某类岗位(如外包、销售)
- 支持自定义黑名单关键词
- 黑名单优先级高于匹配规则
3. **收藏感兴趣岗位**
- 标记收藏岗位
- 收藏原因备注
- 收藏夹分类管理
- 收藏岗位状态跟踪(是否还在招聘)
4. **岗位对比功能**
- 多个岗位并排对比
- 对比维度: 薪资、技能要求、公司、地点、福利
- AI给出推荐意见
- 导出对比报告
**技术实现**
- 数据库: 新增 `job_blacklist`, `job_favorites`
- 文件路径: `api/controller_admin/` 新增相关API
- 前端: `admin/src/views/work/` 新增黑名单和收藏页面
- 预计工期: 1周
**预期价值**
- 📈 投递精准度提升 40%+
- 📉 无效投递减少 60%+
- 💡 提供个性化岗位管理
- ✨ 提高求职效率
---
### 1.5 多轮面试跟踪 ⭐⭐⭐⭐
**现状分析**
-`apply_records` 表有 `hasInterview` 字段
- ❌ 只记录是否有面试,未细分轮次
- ❌ Offer管理功能缺失
- ❌ 入职状态未追踪
**待开发内容**
1. **一面/二面/三面状态追踪**
- 新增面试轮次字段 (`interview_round`)
- 每轮面试时间、地点、面试官记录
- 面试类型(电话、视频、现场)
- 面试状态(待面试、已面试、通过、淘汰)
2. **面试反馈记录**
- 面试官反馈内容
- 面试问题记录
- 自我评价
- 改进建议
3. **Offer管理**
- Offer详情(薪资、福利、入职时间)
- 接受/拒绝/谈薪状态
- 谈薪记录(几轮谈判,最终结果)
- Offer对比(如有多个Offer)
4. **入职状态追踪**
- 入职日期
- 试用期状态
- 转正时间
- 离职时间(如有)
**技术实现**
- 数据库: `apply_records` 新增字段或新增 `interview_records`, `offer_records`
- 文件路径: `api/controller_admin/apply_records.js` 扩展
- 前端: `admin/src/views/work/apply_records.vue` 新增详情面板
- 预计工期: 1.5周
**预期价值**
- 📊 完整的求职生命周期管理
- 📈 面试准备更充分
- 💡 Offer决策更科学
- ✨ 提供长期职业数据积累
---
## 第二部分: AI能力增强
**优先级: HIGH** | **预计工期: 5-7周**
### 2.1 简历智能优化 ⭐⭐⭐⭐⭐
**现状分析**
- ✅ 简历AI分析基础功能 (`aiService.analyzeResume`)
- ✅ 竞争力评分、技能提取、优劣势分析
- ❌ 优化建议深度不足
- ❌ 针对性改进方案缺失
**待开发内容**
1. **AI简历分析深度提升**
- 细粒度分析(每个项目、每段经历)
- 识别简历中的弱项和亮点
- 对比行业优秀简历
- 生成详细分析报告
2. **简历改进建议(针对性)**
- 针对目标岗位给出定制化建议
- 建议补充哪些技能关键词
- 建议如何重写工作描述
- 建议哪些内容需要精简
3. **技能关键词优化建议**
- 分析热门技能关键词
- 建议替换为更专业的术语
- 建议技能顺序排列
- 建议补充相关技能
4. **项目经验描述优化**
- 使用STAR法则重写项目描述
- 量化项目成果(如提升XX%性能)
- 突出个人贡献和技术难点
- 精简冗长描述
**技术实现**
- 文件路径: `api/middleware/job/aiService.js` 新增 `optimizeResume` 方法
- Prompt工程: 设计专业的简历优化Prompt
- 前端: `resume_info_detail.vue` 新增优化建议面板
- 预计工期: 2周
**预期价值**
- 📈 简历竞争力提升 20%+
- 📈 查看率提升 35%+
- 📈 回复率提升 25%+
- 💡 简历质量专业化
---
### 2.2 面试问题预测 ⭐⭐⭐⭐
**待开发内容**
1. **基于岗位描述预测面试问题**
- 分析岗位职责和要求
- 预测技术问题(如React性能优化、数据库索引等)
- 预测行为问题(如团队合作、项目经验)
- 预测HR问题(如离职原因、职业规划)
2. **提供参考答案**
- 给出专业、结构化的答案
- 提供多种回答思路
- 标注答案亮点和注意事项
- 面试官可能的追问
3. **根据简历生成个性化回答**
- 结合简历中的项目经验
- 使用简历中的真实案例
- 避免空洞的回答
- 突出个人优势
**技术实现**
- 文件路径: `api/middleware/job/aiService.js` 新增 `predictInterviewQuestions` 方法
- 数据来源: `job_postings.jobDescription`, `resume_info`
- 前端: 新增 `interview_prep.vue` 面试准备页面
- 预计工期: 1.5周
**预期价值**
- 📈 面试通过率提升 30%+
- ⏱️ 面试准备时间减少 70%+
- 💡 回答更专业、更自信
- ✨ 提供全方位面试辅导
---
### 2.3 薪资谈判策略 ⭐⭐⭐⭐
**待开发内容**
1. **AI分析岗位薪资合理范围**
- 根据岗位要求和地区计算合理薪资
- 参考行业薪资数据(如拉勾、Boss薪资报告)
- 考虑公司规模和融资阶段
- 给出薪资范围建议(如18-22K)
2. **给出谈薪建议和话术**
- 什么时候开始谈薪(面试哪个阶段)
- 如何提薪资要求(不卑不亢)
- 谈判策略(如先等对方报价)
- 具体话术模板
3. **根据市场行情评估Offer价值**
- 对比市场平均薪资
- 综合评估(薪资+福利+发展空间)
- 识别低于市场价的Offer
- 给出接受/拒绝建议
**技术实现**
- 文件路径: `api/middleware/job/aiService.js` 新增 `analyzeSalary` 方法
- 数据源: 岗位描述、地区、公司、市场数据
- 前端: `offer_analysis.vue` Offer分析页面
- 预计工期: 1周
**预期价值**
- 💰 薪资平均提升 10-15%
- 📈 谈判成功率提升 40%+
- 💡 避免接受低薪Offer
- ✨ 提供科学的薪资决策
---
### 2.4 公司背景调查 ⭐⭐⭐⭐
**待开发内容**
1. **整合企查查/天眼查数据**
- 调用企查查API获取公司信息
- 公司基本信息(注册资本、成立时间、法人)
- 融资情况(融资轮次、投资方)
- 诉讼记录、欠薪记录
2. **AI分析公司发展前景**
- 根据融资情况评估发展阶段
- 根据招聘规模判断业务状态
- 根据行业趋势预测前景
- 给出公司评级(A/B/C/D)
3. **风险预警**
- 识别高风险公司(如多次欠薪、频繁裁员)
- 识别虚假招聘(如招聘周期异常长)
- 识别外包公司(尽管岗位描述未标注)
- 给出风险提示和建议
**技术实现**
- 文件路径: `api/services/company_background_service.js`
- 数据源: 企查查API、`company_info`
- 前端: `job_postings.vue` 新增公司背调入口
- 预计工期: 1.5周
**预期价值**
- 📉 入职风险降低 80%+
- 💡 避免进入高风险公司
- ✨ 提供全面的公司情报
- 🔍 识别隐藏的问题公司
---
### 2.5 职业发展路径 ⭐⭐⭐
**待开发内容**
1. **基于简历和目标生成职业规划**
- 分析当前职业阶段(初级/中级/高级)
- 根据目标岗位生成发展路径
- 列出需要补充的技能和经验
- 给出时间线规划(1年/3年/5年)
2. **技能提升建议**
- 推荐学习资源(课程、书籍、开源项目)
- 建议考取的证书
- 建议参加的技术社区
- 建议做的练手项目
3. **转行可行性分析**
- 评估转行难度
- 分析已有技能的可迁移性
- 给出转行路径建议
- 预测转行后的薪资变化
**技术实现**
- 文件路径: `api/middleware/job/aiService.js` 新增 `generateCareerPath` 方法
- 数据源: `resume_info`, 目标岗位描述
- 前端: 新增 `career_plan.vue` 职业规划页面
- 预计工期: 1.5周
**预期价值**
- 📊 提供长期职业指导
- 💡 明确发展方向和目标
- 📈 技能提升更有针对性
- ✨ 降低职业迷茫感
---
## 第三部分: 用户体验优化
**优先级: MEDIUM** | **预计工期: 4-5周**
### 3.1 数据可视化增强 ⭐⭐⭐⭐
**待开发内容**
1. **投递转化漏斗图**
- 投递数 → 查看数 → 回复数 → 面试数 → Offer数
- 每个环节的转化率
- 识别漏斗中的薄弱环节
- 对比不同平台的漏斗差异
2. **面试成功率趋势**
- 按时间展示面试通过率变化
- 分析成功率提升/下降原因
- 识别面试表现最好的时间段
- 给出改进建议
3. **薪资分布统计**
- 投递岗位的薪资分布
- Offer薪资分布
- 对比期望薪资和实际薪资
- 不同技能栈的薪资对比
4. **不同平台效果对比**
- Boss、猎聘等平台的效果对比
- 投递量、回复率、面试率对比
- 平台特点分析
- 推荐最优平台
**技术实现**
- 前端: `admin/src/views/statistics/` 新增统计页面
- ECharts图表: 漏斗图、折线图、柱状图、饼图
- API: `statistics_server.js` 新增统计接口
- 预计工期: 1周
**预期价值**
- 📊 数据洞察更直观
- 💡 快速发现问题环节
- 📈 数据驱动优化决策
- ✨ 提供专业的数据分析
---
### 3.2 实时通知系统 ⭐⭐⭐⭐
**待开发内容**
1. **浏览器通知**
- 面试邀约即时通知
- Offer通知
- 重要聊天消息通知
- 任务执行状态通知
2. **邮件通知**
- 每日投递报告
- 面试提醒(提前1天)
- 重要事件邮件
- 周报月报
3. **企业微信/钉钉集成**
- 通过企业微信机器人推送
- 支持快捷操作(如快速回复)
- 群组通知
- @指定人员
4. **关键事件提醒**
- 面试邀约(立即通知)
- Offer(立即通知)
- 简历被查看(可配置)
- 任务执行失败(立即通知)
**技术实现**
- 文件路径: `api/services/notification_service.js`
- 浏览器通知: Web Notification API
- 邮件: nodemailer
- 企业微信: 企业微信Webhook
- 预计工期: 1.5周
**预期价值**
- ⏱️ 响应时间缩短 90%+
- 📲 不错过任何重要消息
- 💡 多渠道及时触达
- ✨ 提供主动式消息推送
---
### 3.3 批量操作功能 ⭐⭐⭐
**待开发内容**
1. **批量启用/禁用账号**
- 勾选多个账号
- 一键启用/禁用
- 批量设置自动化开关
- 操作日志记录
2. **批量设置投递策略**
- 批量修改投递时间范围
- 批量修改每日上限
- 批量设置关键词过滤
- 应用模板到多个账号
3. **批量导出数据**
- 勾选导出字段
- 导出为CSV/Excel
- 定时导出任务
- 导出历史管理
**技术实现**
- 前端: 各列表页面新增批量操作工具栏
- API: 各模块新增批量操作接口
- 预计工期: 1周
**预期价值**
- ⏱️ 管理效率提升 80%+
- 💡 降低重复操作
- ✨ 提供便捷的批量工具
---
### 3.4 移动端适配 ⭐⭐⭐
**待开发内容**
1. **响应式布局优化**
- 适配手机、平板屏幕
- 菜单改为抽屉式
- 表格改为卡片式
- 图表自适应尺寸
2. **移动端专属操作界面**
- 大图标按钮
- 手势操作(滑动、长按)
- 底部操作栏
- 快捷入口
3. **快捷操作入口**
- 快捷查看今日统计
- 快捷查看任务状态
- 快捷回复聊天
- 快捷查看面试安排
**技术实现**
- 前端: 响应式CSS
- 使用 iView 的响应式组件
- 新增移动端专属组件
- 预计工期: 1.5周
**预期价值**
- 📱 随时随地管理
- 💡 提升移动端体验
- ✨ 扩大使用场景
---
### 3.5 智能推荐 ⭐⭐⭐
**待开发内容**
1. **推荐最适合的岗位**
- 基于简历和历史投递记录
- AI预测岗位匹配度
- 推荐优先投递的岗位
- 推荐理由说明
2. **推荐最佳投递时间**
- 分析不同时间投递的效果
- 推荐最佳投递时段
- 避开竞争激烈的时段
- 根据平台特性调整
3. **推荐优化策略**
- 分析数据找出问题
- 推荐具体改进措施
- 预测改进后的效果
- 跟踪改进效果
**技术实现**
- 文件路径: `api/middleware/job/recommendService.js`
- AI模型: 基于历史数据训练
- 前端: 首页新增推荐面板
- 预计工期: 1周
**预期价值**
- 📈 投递效果提升 25%+
- 💡 降低决策成本
- ✨ 提供智能化建议
---
## 第四部分: 系统性能提升
**优先级: MEDIUM** | **预计工期: 3-4周**
### 4.1 缓存策略优化 ⭐⭐⭐⭐
**待开发内容**
1. **Redis缓存热点数据**
- 缓存职位类型配置(5分钟→实时)
- 缓存统计数据(避免重复计算)
- 缓存简历信息(减少数据库查询)
- 缓存设备状态
2. **职位类型配置缓存**
- 当前5分钟缓存改为即时失效
- 配置更新时清除缓存
- 预加载常用配置
3. **简历信息缓存**
- 缓存最近查询的简历
- LRU淘汰策略
- 简历更新时清除缓存
**技术实现**
- Redis集成: `ioredis`
- 文件路径: `api/middleware/cache/cacheManager.js`
- 缓存策略: LRU, TTL
- 预计工期: 1周
**预期价值**
- 📈 响应速度提升 50%+
- 📉 数据库压力降低 60%+
- 💡 提升系统吞吐量
- ✨ 提供更快的用户体验
---
### 4.2 数据库查询优化 ⭐⭐⭐⭐
**待开发内容**
1. **慢查询分析和优化**
- 开启MySQL慢查询日志
- 分析TOP 10慢查询
- 优化SQL语句
- 添加必要索引
2. **索引优化**
- 分析现有索引使用情况
- 添加复合索引
- 删除冗余索引
- 定期索引维护
3. **分表分库策略**
- 大表分表(如 `chat_records` 按月分表)
- 历史数据归档
- 读写分离(可选)
**技术实现**
- 使用 `EXPLAIN` 分析查询
- Sequelize 索引配置优化
- 数据库迁移脚本
- 预计工期: 1周
**预期价值**
- 📈 查询性能提升 3-5倍
- 📉 慢查询数量减少 80%+
- 💡 数据库可支撑更大数据量
- ✨ 提升系统稳定性
---
### 4.3 任务队列扩展 ⭐⭐⭐
**待开发内容**
1. **支持更多任务类型**
- 定时报告生成
- 数据清理任务
- 批量操作任务
- 自定义任务
2. **任务优先级动态调整**
- 根据紧急程度调整优先级
- VIP用户任务优先执行
- 失败任务降低优先级
- 长时间等待的任务提升优先级
3. **任务失败自动重试优化**
- 更智能的重试策略
- 不同错误类型不同重试间隔
- 重试次数动态调整
- 重试失败后的降级处理
**技术实现**
- 文件路径: `api/middleware/schedule/taskQueue.js` 优化
- 新增任务类型处理器
- 优化优先级算法
- 预计工期: 1周
**预期价值**
- 📈 任务处理更稳定
- 💡 支持更复杂的任务场景
- ✨ 提供更灵活的任务管理
---
### 4.4 并发控制优化 ⭐⭐⭐
**待开发内容**
1. **增加并发设备数**
- 当前最多5个设备
- 支持动态配置并发数
- 根据服务器性能自动调整
- 支持分布式部署
2. **更精细的限流策略**
- 不同任务类型不同限流
- 不同平台不同限流
- 根据时间段动态调整
- API请求限流
3. **分布式锁机制**
- 避免多实例冲突
- Redis分布式锁
- 锁超时自动释放
- 死锁检测
**技术实现**
- Redis分布式锁: `redlock`
- 配置动态化
- 负载均衡策略
- 预计工期: 1周
**预期价值**
- 📈 系统吞吐量提升 2-3倍
- 💡 支持更大规模部署
- ✨ 提供企业级并发控制
---
### 4.5 日志和监控 ⭐⭐⭐⭐
**待开发内容**
1. **完善日志记录**
- 统一日志格式(JSON)
- 日志级别分级(DEBUG/INFO/WARN/ERROR)
- 敏感信息脱敏
- 日志文件按日期切割
2. **性能监控面板**
- API响应时间监控
- 数据库查询时间监控
- 任务执行时间监控
- 内存和CPU监控
3. **异常告警机制**
- 错误率超过阈值告警
- 任务失败立即告警
- 系统资源不足告警
- 钉钉/企业微信告警
4. **操作审计日志**
- 记录所有关键操作
- 操作人、操作时间、操作内容
- 敏感操作二次确认
- 审计日志导出
**技术实现**
- 日志库: `winston`
- 监控: `prometheus` + `grafana` (可选)
- 告警: `api/services/alert_service.js`
- 预计工期: 1.5周
**预期价值**
- 🔍 问题定位效率提升 80%+
- 📊 系统运行状态可视化
- 🚨 及时发现和处理异常
- ✨ 提供运维级别的监控
---
## 附录: 开发优先级建议
### 短期(1-2个月)
**优先开发高价值、低成本功能**
| 功能 | 优先级 | 预计工期 | 价值 |
|------|--------|----------|------|
| 自动聊天功能完善 | ⭐⭐⭐⭐⭐ | 2周 | HR回复率+30% |
| 账号保活任务 | ⭐⭐⭐⭐⭐ | 1周 | 封禁风险-70% |
| 简历智能优化 | ⭐⭐⭐⭐⭐ | 2周 | 竞争力+20% |
| 缓存策略优化 | ⭐⭐⭐⭐ | 1周 | 响应速度+50% |
**预计总工期: 6周**
### 中期(3-4个月)
**完善核心功能和AI能力**
| 功能 | 优先级 | 预计工期 | 价值 |
|------|--------|----------|------|
| 简历自动更新 | ⭐⭐⭐⭐ | 1周 | 曝光率+50% |
| 岗位黑名单和收藏 | ⭐⭐⭐⭐ | 1周 | 精准度+40% |
| 多轮面试跟踪 | ⭐⭐⭐⭐ | 1.5周 | 完整生命周期 |
| 面试问题预测 | ⭐⭐⭐⭐ | 1.5周 | 通过率+30% |
| 数据可视化增强 | ⭐⭐⭐⭐ | 1周 | 数据洞察更直观 |
**预计总工期: 6周**
### 长期(5-6个月)
**提升体验和系统性能**
| 功能 | 优先级 | 预计工期 | 价值 |
|------|--------|----------|------|
| 薪资谈判策略 | ⭐⭐⭐⭐ | 1周 | 薪资+10-15% |
| 公司背景调查 | ⭐⭐⭐⭐ | 1.5周 | 风险-80% |
| 实时通知系统 | ⭐⭐⭐⭐ | 1.5周 | 响应时间-90% |
| 日志和监控 | ⭐⭐⭐⭐ | 1.5周 | 定位效率+80% |
| 数据库查询优化 | ⭐⭐⭐⭐ | 1周 | 性能+3-5倍 |
**预计总工期: 6.5周**
---
## 总结
本规划文档共列出 **20项待开发功能**,分为4个优先级方向:
- **功能完善和补充** (5项, HIGH): 完善核心业务流程
- **AI能力增强** (5项, HIGH): 提升智能化水平
- **用户体验优化** (5项, MEDIUM): 改善交互和便捷性
- **系统性能提升** (5项, MEDIUM): 优化性能和稳定性
**预期开发周期**:
- 短期(1-2月): 6周
- 中期(3-4月): 6周
- 长期(5-6月): 6.5周
- **总计**: 约4.5个月
**预期收益**:
- 📈 整体求职成功率提升 **50%+**
- 📈 用户使用效率提升 **80%+**
- 📈 系统性能提升 **3-5倍**
- 💰 用户平均薪资提升 **10-15%**
---
**文档维护**: 开发团队
**最后更新**: 2025-12-25

View File

@@ -1,574 +0,0 @@
# 发布脚本使用说明
## 📋 概述
发布脚本 (`scripts/publish.js`) 用于自动化应用的构建和发布流程,包括:
1. 清理构建目录
2. 构建应用NSIS 或便携版)
3. 调用接口创建版本记录
4. 上传压缩包到 OSS
## 🚀 快速开始
### 安装依赖
确保已安装 `form-data` 依赖:
```bash
npm install form-data --save-dev
```
### 基本使用
```bash
# 发布 NSIS 安装包(默认)
npm run publish
# 或直接运行脚本
node scripts/publish.js
```
## 📝 命令选项
### 构建类型
```bash
# 发布 NSIS 安装包
npm run publish:nsis
# 或
node scripts/publish.js --type nsis
# 发布便携版
npm run publish:portable
# 或
node scripts/publish.js --type portable
```
### 发布说明
```bash
node scripts/publish.js --notes "修复了若干bug优化了性能"
```
### 强制更新
```bash
node scripts/publish.js --force
```
### 跳过步骤
```bash
# 仅上传已构建的文件(跳过构建)
node scripts/publish.js --skip-build
# 仅构建不上传
node scripts/publish.js --skip-upload
```
### 查看帮助
```bash
node scripts/publish.js --help
```
## 🔧 配置要求
### 1. 配置文件
确保 `config/appConfig.js` 中包含有效的配置:
```javascript
module.exports = {
api_urls: {
dev: "http://work.light120.com/api",
prod: "http://work.light120.com/api"
},
token: "your-token-here", // 必须配置有效的 token
// ...
};
```
### 2. API 接口
脚本需要以下 API 接口:
#### 接口 1创建版本记录
- **接口地址**: `POST /api/version/create`
- **请求头**:
```
Content-Type: application/json
Authorization: ${token}
```
- **请求参数**:
```json
{
"version": "1.0.0", // 必填版本号x.y.z 格式)
"platform": "win32", // 必填平台类型win32/darwin/linux
"arch": "x64", // 必填架构类型x64/ia32/arm64
"download_url": "https://...", // 必填:下载地址(上传后更新)
"file_path": "/path/to/file", // 必填:服务器文件路径
"file_size": 12345678, // 可选:文件大小(字节),不提供会自动计算
"file_hash": "sha256-hash", // 可选SHA256 哈希值,不提供会自动计算
"release_notes": "发布说明", // 可选:更新日志
"force_update": 0, // 可选是否强制更新1:是 0:否),默认 0
"status": 1 // 可选状态1:启用 0:禁用),默认 1
}
```
- **响应示例**:
```json
{
"code": 0,
"message": "版本创建成功",
"data": {
"id": 123,
"version": "1.0.0",
"platform": "win32",
"arch": "x64",
"download_url": "https://oss.example.com/path/to/file.exe",
"file_path": "/path/to/file.exe",
"file_size": 12345678,
"file_hash": "sha256-hash-value",
"release_notes": "发布说明",
"force_update": 0,
"status": 1,
"create_time": "2024-01-01 12:00:00"
}
}
```
- **错误响应**:
```json
{
"code": 400,
"message": "版本号不能为空" // 或其他错误信息
}
```
- **注意事项**:
- 版本号格式必须为 `x.y.z`1.0.0
- 平台类型必须为:`win32`、`darwin` 或 `linux`
- 架构类型必须为:`x64`、`ia32` 或 `arm64`
- 如果版本已存在(相同 version + platform + arch会返回错误
- 如果提供了 `file_path` 但未提供 `file_size` 或 `file_hash`,接口会自动计算
#### 接口 2上传文件到 OSS
- **接口地址**: `POST /api/file/upload_version`
- **请求头**:
```
Content-Type: multipart/form-data
Authorization: ${token}
```
- **请求参数**Form Data:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `file` | File | 是 | 文件内容(二进制) |
| `version` | String | 是 | 版本号1.0.0 |
| `platform` | String | 是 | 平台类型win32/darwin/linux |
| `arch` | String | 是 | 架构类型x64/ia32/arm64 |
| `file_hash` | String | 是 | SHA256 哈希值 |
| `file_size` | Number | 是 | 文件大小(字节) |
| `version_id` | Number | 否 | 版本记录 ID如果已创建版本记录 |
| `build_type` | String | 否 | 构建类型nsis/portable |
- **请求示例**(使用 form-data:
```javascript
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('file', fs.createReadStream('./dist/app.exe'));
form.append('version', '1.0.0');
form.append('platform', 'win32');
form.append('arch', 'x64');
form.append('file_hash', 'sha256-hash-value');
form.append('file_size', 12345678);
form.append('version_id', 123); // 可选
// 发送请求
form.submit('http://api.example.com/api/file/upload_version', {
headers: {
'Authorization': `${token}`
}
}, callback);
```
- **响应示例**:
```json
{
"code": 0,
"message": "文件上传成功",
"data": {
"download_url": "https://oss.example.com/versions/win32/x64/app-1.0.0.exe",
"file_path": "versions/win32/x64/app-1.0.0.exe",
"oss_path": "https://oss.example.com/versions/win32/x64/app-1.0.0.exe",
"file_size": 12345678,
"file_hash": "sha256-hash-value"
}
}
```
- **错误响应**:
```json
{
"code": 400,
"message": "文件上传失败:文件大小不匹配" // 或其他错误信息
}
```
- **注意事项**:
- 文件会按照 `versions/{platform}/{arch}/{filename}` 的路径结构上传到 OSS
- 上传前会验证文件哈希值,确保文件完整性
- 上传成功后,建议调用 `/version/update` 接口更新版本记录的下载地址
- 大文件上传建议设置较长的超时时间(建议 10 分钟以上)
#### 接口 3更新版本下载地址可选
- **接口地址**: `POST /api/version/update`
- **请求头**:
```
Content-Type: application/json
Authorization: ${token}
```
- **请求参数**:
```json
{
"id": 123, // 必填:版本记录 ID
"download_url": "https://...", // 可选:下载地址
"file_path": "/path/to/file", // 可选:文件路径
"file_hash": "sha256-hash", // 可选:文件哈希值
"file_size": 12345678, // 可选:文件大小
"release_notes": "更新说明", // 可选:更新日志
"force_update": 1, // 可选:是否强制更新
"status": 1 // 可选:状态
}
```
- **响应示例**:
```json
{
"code": 0,
"message": "版本更新成功",
"data": {
"id": 123,
"version": "1.0.0",
"download_url": "https://oss.example.com/path/to/file.exe",
// ... 其他字段
}
}
```
- **使用场景**:
- 文件上传成功后,更新版本记录的下载地址
- 修改版本的发布说明或强制更新标志
- 启用或禁用某个版本
## 📦 发布流程
1. **清理构建目录**
- 删除 `dist` 目录及其所有内容
2. **构建应用**
- 根据构建类型执行 `electron-builder`
- NSIS: `electron-builder --win nsis`
- Portable: `electron-builder --win portable`
3. **查找构建产物**
- 在 `dist` 目录中查找 `.exe` 文件
- 按文件大小排序,优先处理主安装包
4. **创建版本记录**
- 调用 `POST /api/version/create` 接口
- 传递版本信息、平台、架构等
- 获取版本记录 ID用于后续更新
5. **上传文件到 OSS**
- 计算文件 SHA256 哈希值
- 使用 `multipart/form-data` 格式调用 `POST /api/file/upload_version` 接口
- 传递文件、版本信息、哈希值等参数
- 获取上传后的下载地址
6. **更新版本记录**
- 使用获取到的下载地址调用 `POST /api/version/update` 接口
- 更新版本记录的 `download_url` 和 `file_path` 字段
## ⚠️ 注意事项
1. **Token 配置**
- 确保 `config/appConfig.js` 中有有效的 `token`
- Token 用于 API 认证,格式为 `${token}`
- 所有接口请求都需要在请求头中包含 `Authorization: ${token}`
2. **接口路径**
- 所有接口路径前缀为 `/api`
- 完整路径示例:
- 创建版本:`POST http://api.example.com/api/version/create`
- 上传文件:`POST http://api.example.com/api/file/upload_version`
- 更新版本:`POST http://api.example.com/api/version/update`
3. **文件大小**
- 大文件上传可能需要较长时间
- 脚本默认超时时间为 10 分钟600000ms
- 建议大文件(>100MB增加超时时间到 30 分钟
4. **网络连接**
- 确保能够访问 API 服务器和 OSS
- 上传大文件时建议使用稳定的网络连接
- 建议在网络稳定的环境下执行发布流程
5. **版本号**
- 版本号从 `package.json` 的 `version` 字段读取
- 发布前确保版本号已更新
- 版本号格式必须符合 `x.y.z` 格式1.0.0
6. **构建产物**
- 脚本会自动查找 `dist` 目录中的 `.exe` 文件
- 排除 `builder` 和 `helper` 相关的辅助文件
- 确保构建产物文件名清晰,便于识别
7. **文件哈希验证**
- 上传前必须计算文件的 SHA256 哈希值
- 上传接口会验证文件哈希,确保文件完整性
- 哈希值不匹配会导致上传失败
8. **接口调用顺序**
- 建议先创建版本记录(获取 version_id
- 然后上传文件(可传递 version_id
- 最后更新版本记录的下载地址
- 也可以先上传文件,再创建版本记录并更新下载地址
## 🔍 故障排查
### 问题:上传失败
**可能原因**:
- Token 无效或过期
- API 接口地址不正确
- 网络连接问题
- 文件过大,超时
**解决方法**:
1. 检查 `config/appConfig.js` 中的 `token` 是否有效
2. 检查 API 地址是否正确
3. 检查网络连接
4. 如果文件很大,可以增加超时时间
### 问题:构建失败
**可能原因**:
- 缺少依赖
- electron-builder 配置错误
- 磁盘空间不足
**解决方法**:
1. 运行 `npm install` 安装所有依赖
2. 检查 `package.json` 中的 `build` 配置
3. 确保有足够的磁盘空间
### 问题:找不到构建产物
**可能原因**:
- 构建未成功完成
- 构建产物在其他位置
**解决方法**:
1. 检查构建日志,确认构建成功
2. 手动检查 `dist` 目录
3. 使用 `--skip-build` 选项,手动指定文件路径(需要修改脚本)
## 📝 示例
### 完整发布流程
```bash
# 1. 更新版本号(在 package.json 中)
# "version": "1.0.1"
# 2. 发布
npm run publish -- --notes "新功能:支持自动投递简历" --force
```
### 仅上传已构建的文件
```bash
# 1. 手动构建
npm run build:nsis
# 2. 仅上传
node scripts/publish.js --skip-build
```
### 测试发布(不上传)
```bash
# 构建并创建版本记录,但不上传文件
node scripts/publish.js --skip-upload
```
## 💻 接口调用示例
### Node.js 示例代码
#### 1. 创建版本记录
```javascript
const axios = require('axios');
const crypto = require('crypto');
const fs = require('fs');
async function createVersion() {
const filePath = './dist/app-1.0.0.exe';
const stats = fs.statSync(filePath);
const fileSize = stats.size;
// 计算文件哈希
const fileBuffer = fs.readFileSync(filePath);
const fileHash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
const response = await axios.post('http://api.example.com/api/version/create', {
version: '1.0.0',
platform: 'win32',
arch: 'x64',
download_url: '', // 上传后更新
file_path: filePath,
file_size: fileSize,
file_hash: fileHash,
release_notes: '修复了若干bug优化了性能',
force_update: 0,
status: 1
}, {
headers: {
'Authorization': `${token}`,
'Content-Type': 'application/json'
}
});
return response.data.data; // 返回版本记录,包含 id
}
```
#### 2. 上传文件到 OSS
```javascript
const FormData = require('form-data');
const axios = require('axios');
const fs = require('fs');
const crypto = require('crypto');
async function uploadVersionFile(versionId) {
const filePath = './dist/app-1.0.0.exe';
const stats = fs.statSync(filePath);
const fileSize = stats.size;
// 计算文件哈希
const fileBuffer = fs.readFileSync(filePath);
const fileHash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
// 创建 FormData
const form = new FormData();
form.append('file', fs.createReadStream(filePath));
form.append('version', '1.0.0');
form.append('platform', 'win32');
form.append('arch', 'x64');
form.append('file_hash', fileHash);
form.append('file_size', fileSize);
if (versionId) {
form.append('version_id', versionId);
}
const response = await axios.post('http://api.example.com/api/file/upload_version', form, {
headers: {
'Authorization': `${token}`,
...form.getHeaders()
},
maxContentLength: Infinity,
maxBodyLength: Infinity,
timeout: 600000 // 10 分钟超时
});
return response.data.data; // 返回上传结果,包含 download_url
}
```
#### 3. 更新版本下载地址
```javascript
async function updateVersionDownloadUrl(versionId, downloadUrl, fileHash) {
const response = await axios.post('http://api.example.com/api/version/update', {
id: versionId,
download_url: downloadUrl,
file_hash: fileHash
}, {
headers: {
'Authorization': `${token}`,
'Content-Type': 'application/json'
}
});
return response.data.data;
}
```
#### 4. 完整发布流程示例
```javascript
async function publishVersion() {
try {
// 1. 创建版本记录
console.log('创建版本记录...');
const version = await createVersion();
console.log('版本记录创建成功ID:', version.id);
// 2. 上传文件
console.log('上传文件到 OSS...');
const uploadResult = await uploadVersionFile(version.id);
console.log('文件上传成功,下载地址:', uploadResult.download_url);
// 3. 更新版本下载地址
console.log('更新版本下载地址...');
await updateVersionDownloadUrl(version.id, uploadResult.download_url, uploadResult.file_hash);
console.log('版本发布完成!');
} catch (error) {
console.error('发布失败:', error.response?.data || error.message);
throw error;
}
}
```
### cURL 示例
#### 创建版本记录
```bash
curl -X POST http://api.example.com/api/version/create \
-H "Authorization: your-token-here" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0.0",
"platform": "win32",
"arch": "x64",
"download_url": "",
"file_path": "/path/to/file.exe",
"file_size": 12345678,
"file_hash": "sha256-hash-value",
"release_notes": "发布说明",
"force_update": 0,
"status": 1
}'
```
#### 上传文件
```bash
curl -X POST http://api.example.com/api/file/upload_version \
-H "Authorization: your-token-here" \
-F "file=@./dist/app-1.0.0.exe" \
-F "version=1.0.0" \
-F "platform=win32" \
-F "arch=x64" \
-F "file_hash=sha256-hash-value" \
-F "file_size=12345678" \
-F "version_id=123"
```
## 🔗 相关文档
- [API 配置说明](./API_CONFIG.md)
- [打包说明](./BUILD.md)
- [更新逻辑检查报告](./更新逻辑检查报告.md)

View File

@@ -1,100 +0,0 @@
# 命名规范统一方案
## 📋 命名规范标准
### 1. 文件命名规范
**统一使用下划线命名snake_case**
-`ai_service.js`
-`job_service.js`
-`pla_account_service.js`
-`job_manager_service.js`
-`chat_manager_service.js`
-`resume_manager_service.js`
-`aiService.js``ai_service.js`
-`jobManager.js``job_manager_service.js`
-`chatManager.js``chat_manager_service.js`
-`resumeManager.js``resume_manager_service.js`
### 2. 类命名规范
**统一使用大驼峰命名PascalCase**
-`AIService`
-`JobService`
-`JobManagerService`
-`ChatManagerService`
-`ResumeManagerService`
-`aiService``AIService`
-`JobManager``JobManagerService`
### 3. 目录命名规范
**统一使用小写+下划线snake_case**
-`services/` - 业务服务层
-`middleware/` - 中间件层
-`middleware/schedule/` - 调度系统
-`middleware/mqtt/` - MQTT通信
-`middleware/job/` → 移到 `services/` 并重命名
### 4. 服务文件命名规范
**所有服务文件统一以 `_service.js` 结尾**
-`ai_service.js`
-`job_service.js`
-`job_manager_service.js`
-`chat_manager_service.js`
-`resume_manager_service.js`
-`pla_account_service.js`
-`oss_tool_service.js` (重命名 `ossTool.js`)
## 🔄 需要重命名的文件
### services/ 目录
1. `ossTool.js``oss_tool_service.js`
2. `task_scheduler.js` → 标记为废弃或删除
### middleware/job/ 目录(移到 services/
1. `jobManager.js``services/job_manager_service.js`
2. `chatManager.js``services/chat_manager_service.js`
3. `resumeManager.js``services/resume_manager_service.js`
4. `aiService.js` → 合并到 `services/ai_service.js` 后删除
## 📁 整理后的目录结构
```
api/
├── services/ # 业务服务层
│ ├── index.js # 服务管理器
│ ├── ai_service.js # AI服务合并后
│ ├── job_service.js # 职位服务
│ ├── job_manager_service.js # 工作管理服务
│ ├── chat_manager_service.js # 聊天管理服务
│ ├── resume_manager_service.js # 简历管理服务
│ ├── pla_account_service.js # 账号服务
│ └── oss_tool_service.js # OSS服务
└── middleware/ # 中间件层
├── schedule/ # 调度系统
├── mqtt/ # MQTT通信
├── dbProxy.js # 数据库代理
└── logProxy.js # 日志代理
```
## 🎯 执行步骤
1. **重命名现有文件**
- `ossTool.js``oss_tool_service.js`
2. **移动并重命名业务服务**
- `middleware/job/jobManager.js``services/job_manager_service.js`
- `middleware/job/chatManager.js``services/chat_manager_service.js`
- `middleware/job/resumeManager.js``services/resume_manager_service.js`
3. **合并AI服务**
-`middleware/job/aiService.js` 的功能合并到 `services/ai_service.js`
- 删除 `middleware/job/aiService.js`
4. **更新所有引用**
- 更新 `command.js` 中的引用
- 更新其他文件中的引用
5. **统一类命名**
- 确保所有类都使用 PascalCase
- 确保所有服务类都以 Service 结尾

View File

@@ -1,68 +0,0 @@
# 命名规范统一进度
## ✅ 已完成
### 1. OSS服务重命名
-`ossTool.js``oss_tool_service.js`
-`OSSTool``OSSToolService`
- ✅ 更新引用:`api/controller_front/file.js`
## 📋 待完成
### 2. 移动并重命名业务服务middleware/job/ → services/
-`jobManager.js``services/job_manager_service.js`
- 类名:`JobManager``JobManagerService`
- 更新引用:`api/middleware/schedule/command.js`
-`chatManager.js``services/chat_manager_service.js`
- 类名:`ChatManager``ChatManagerService`
- 更新引用:`api/middleware/schedule/command.js`
-`resumeManager.js``services/resume_manager_service.js`
- 类名:`ResumeManager``ResumeManagerService`
### 3. 合并AI服务
- ⏳ 将 `middleware/job/aiService.js` 的功能合并到 `services/ai_service.js`
- ⏳ 统一类名为 `AIService`
- ⏳ 删除 `middleware/job/aiService.js`
- ⏳ 更新所有引用
### 4. 处理废弃文件
-`services/task_scheduler.js` - 添加废弃标记或删除
## 📝 命名规范总结
### 文件命名规范
- ✅ 统一使用 `snake_case` + `_service.js` 后缀
- ✅ 示例:`oss_tool_service.js`, `job_manager_service.js`
### 类命名规范
- ✅ 统一使用 `PascalCase` + `Service` 后缀
- ✅ 示例:`OSSToolService`, `JobManagerService`
### 目录结构
```
api/
├── services/ # 业务服务层
│ ├── ai_service.js
│ ├── job_service.js
│ ├── job_manager_service.js # 待移动
│ ├── chat_manager_service.js # 待移动
│ ├── resume_manager_service.js # 待移动
│ ├── pla_account_service.js
│ └── oss_tool_service.js # ✅ 已完成
└── middleware/ # 中间件层
├── schedule/
├── mqtt/
└── job/ # 待删除文件移到services后
```
## 🔄 下一步操作
1. 移动并重命名 `middleware/job/` 下的文件
2. 合并AI服务
3. 更新所有引用
4. 统一导出方式
5. 删除废弃文件

View File

@@ -1,860 +0,0 @@
{
"baseInfo": {
"name": "张成",
"nickName": "张成",
"tiny": "https://img.bosszhipin.com/beijin/upload/avatar/20250211/607f1f3d68754fd006d510844c0273d99b737108b9d73a664006f977785f3a6a694eb527b0e564d8_s.png.webp",
"birthday": "19930612",
"age": "32岁",
"gender": 1,
"degree": 203,
"degreeCategory": "本科",
"account": "193******69",
"emailBlur": "978****03@qq.com",
"weixinBlur": "z56***01",
"freshGraduate": 0,
"workYears": 11,
"nameShowType": 0,
"bossCert": 0,
"userCert": 2,
"certGender": true,
"certBirth": true,
"startWorkDate": 20141201,
"applyStatus": 0,
"workYearDesc": "10年以上经验",
"resumeStatus": 0,
"resumeCount": 0,
"complete": false,
"weiXinSecurityUid": null,
"garbageFieldList": null,
"hometown": 0,
"hometownName": null,
"studyAbroadCertPass": 0,
"highestEduExp": null,
"showF3Optimize": 0,
"startWorkDateDesc": "2014-12",
"birthdayDesc": "1993-06"
},
"userDesc": "拥有10年深厚行业经验的资深前端架构师专注前沿技术与业务融合推动数字化产品创新升级。\n \n1. 技术栈与架构熟练运用Vue、React等主流框架搭配Webpack、Vite等构建工具进行高效开发。精通TypeScript优化代码结构与维护性。擅长使用Redux、MobX管理复杂应用状态搭建稳定架构。\n \n2. 跨端与组件化掌握Flutter、React Native等跨端技术实现多平台无缝运行。主导设计高复用组件库利用Storybook管理组件使组件复用率达70%开发周期缩短40%。\n \n3. AI集成积极探索AI与前端融合集成GPT等大模型实现智能客服、内容生成引入机器学习算法实现用户行为分析、个性化推荐大幅提升用户参与度。\n \n4. 音视频处理具备音视频处理能力使用WebRTC实现实时通信结合FFmpeg进行格式转换、剪辑。利用Media Source Extensions实现自适应码率播放优化视频加载与播放体验。\n\n 5. 后端及多元开发擅长使用Node.js搭配Express、Koa框架搭建高性能后端服务优化接口响应速度。熟练运用Python进行数据处理、自动化脚本编写结合Django、Flask框架开发后端应用在数据挖掘与分析领域成果显著。掌握C#语言,基于.NET平台进行Windows桌面应用开发具备丰富的Windows Forms、WPF项目经验实现全栈技术链路的打通。",
"applyStatus": 0,
"lastlast_modify_time": "2025.11.05 13:41",
"workEduDesc": "宝尊电子商务·架构师",
"expectList": [
{
"id": "dfc1777a2703c9071nVz3d-0GVpYxA~~",
"expectType": 0,
"position": 100123,
"positionName": "全栈工程师",
"customPositionId": "",
"positionType": 0,
"location": 101020100,
"locationName": "上海",
"subLocation": 0,
"subLocationName": null,
"lowSalary": 20,
"highSalary": 30,
"salaryDesc": "20-30K",
"salaryDescNew": "20-30K",
"industryList": [],
"industryDesc": "行业不限",
"suggestPosition": "",
"applyStatus": 0,
"freshGraduate": 0,
"doneWorkPositionList": null,
"garbageFieldList": null,
"interestPositionList": null,
"interestLocationList": null,
"industryExpect": false,
"tagName": null
}
],
"workExpList": [
{
"id": "9bd3116c0333c52d1nJ_09y-EldZx465V_-X",
"companyName": "上海宝尊电子商务有限公司",
"industry": {
"code": 100020,
"name": "互联网"
},
"department": "",
"customPositionName": "架构师",
"position": 100704,
"positionName": "架构师",
"positionLv2": 100700,
"startDate": "2019.06",
"startDateStr": "2019.06",
"endDate": "2024.12",
"endDateStr": "2024.12",
"emphasis": [],
"workContent": "智能视频剪辑系统(2021.07-2024.12)\n技术栈:Vue2+Element UI+WebAssembly+Canvas+Konva.js+WebSocket+GSAP\n核心功能:\n1.视频处理:基于WebAssembly解析视频信息,实现大文件分片上传,支持200G+视频处理\n2.创意编辑:使用Konva.js开发多层级编辑器,实现图片分层、文字动画、贴片特效\n3.动画系统:基于GSAP开发文字特效、Logo动画,支持动态片头片尾制作\n4.预览系统:使用Canvas实现视频片段预览,支持时间轴精确定位\n5.任务管理:基于WebSocket实现批量任务进度实时通知\n项目成果:视频处理效率提升300%|日均处理1000+视频|压缩率达97%|任务效率提升200%|降低\n人工成本60%",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "283b1abcae6041e41nJ_0969ElpVy423Vvic",
"companyName": "上海航天动力科技工程有限公司",
"industry": {
"code": 100021,
"name": "计算机软件"
},
"department": "",
"customPositionName": "架构师",
"position": 100704,
"positionName": "架构师",
"positionLv2": 100700,
"startDate": "2018.06",
"startDateStr": "2018.06",
"endDate": "2019.06",
"endDateStr": "2019.06",
"emphasis": [],
"workContent": "技术栈:Vue2+iView+OpenLayers+Cesium+WebSocket+Less\n核心功能:\n1.GIS可视化:基于OpenLayers实现管网GIS展示,支持多图层管理\n2.实时监控:使用WebSocket推送报警信息,实现管道水流方向动画\n3.数据分析:集成ECharts开发运营分析、报表统计功能\n4.空间分析:使用Turf.js实现等差线绘制,可视化爆管位置\n项目成果:地图加载提升200%|漏损检测准确率95%|节省成本300万+|服务10+水务公司|覆盖管\n网1000km+",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "d18fc7f74a6479ee1nJ_0969ElpVy423Vvid",
"companyName": "上海开澜软件有限公司",
"industry": {
"code": 100021,
"name": "计算机软件"
},
"department": "",
"customPositionName": ".NET",
"position": 100107,
"positionName": ".NET",
"positionLv2": 100100,
"startDate": "2016.06",
"startDateStr": "2016.06",
"endDate": "2018.06",
"endDateStr": "2018.06",
"emphasis": [
"HTML"
],
"workContent": "滩涂造地BIM管理系统(2017.01-2018.05)\n技术栈:jQuery+EasyUI+BIMViz+百度图+WebAppOffice\n核心功能:\n1.BIM可视化:集成BIMViz实现模型在线预览,支持构件查询和联动\n2.地图集成:基于百度地图API实现工程位置展示和空间分析\n3.文档管理:使用WebAppOffice实现在线预览,支持多格式文档\n4.工作流程:开发OA审批流程,实现物料申请和人员管理\n项目成果:BIM性能提升200%|审批效率提升150%|支持50+文档格式|日均处理500+工单|管理效\n率提升80%",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "c07196b9b117210f1nJ_0969ElpVy423Vvie",
"companyName": "上海加谷网络科技有限公司",
"industry": {
"code": 100002,
"name": "游戏"
},
"department": "",
"customPositionName": ".NET",
"position": 100107,
"positionName": ".NET",
"positionLv2": 100100,
"startDate": "2014.06",
"startDateStr": "2014.06",
"endDate": "2016.05",
"endDateStr": "2016.05",
"emphasis": [
"HTML"
],
"workContent": "H5营销平台开发(2014.06-2016.05)\n技术栈:jQuery+Canvas+CSS3+HTML5+微信JSSDK\n核心功能:\n1.互动游戏:开发大转盘抽奖、刮刮卡、砸金蛋等H5游戏\n2.动画特效:自研Canvas动画框架,支持Flash动画转换\n3.低代码平台:开发可视化搭建工具,支持营销活动快速生成\n4.社交功能:集成微信分享、支付、授权等功能项目成果:服务200+品牌|开发效率提升300%|上线周期缩短80%|转化率提升150%|支持百万级访问",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
}
],
"projectExpList": [
{
"id": "903b8e07eb7f44ca1nx50t-6EFZQw4i8UvKY",
"name": "AI智能视频剪辑系统",
"roleName": "全栈工程师",
"url": "",
"startDate": "2024.01",
"endDate": "",
"projectDesc": "系统简介\nai智能视频剪辑系统,可通过淘宝直播间,天猫,淘宝商品链接,自动从直播间中按照商品切片,并输出到天猫商品详情页主视频,发布到小红书,淘宝微淘等平台,可批量生成视频,处理视频,前端技术栈:vue全家桶+elemeui+浏览器插件\n后端技术栈:Node.js+Koa2+Vue2+FFmpeg+Redis\n功能模块:\n1.内容采集:开发Chrome浏览器插件自动获取直播回放、商品时间点智能识别、多平台视频源导入本地大视频文件上传,支持200g左右大文件批量上传,断点续传等功能\n2.任务管理:用户可以批量创建任务,任务实时状态使用WebSocket更新并通知\n3.模版管理:可基于execl文件批量创建任务,动态生成片尾图和首图\n4.智能生成:基于GPT的视频内容理解、关键片段提取和智能场景组合、60秒精华自动生成\n5.内容编辑:多轨道编辑和场景识别分割、转场特效库和字幕样式编辑、贴纸滤镜和音频处理、GSAP文字动画和Logo动效\n6.深度剪辑:用户可以拖动句子,自动以切片输出内容\n7.发布管理:多格式导出和自定义分辨率码率、批量导出队列和云端渲染、进度实时展示\n8.视频特效开发:如:文字抖动,花字,特效,特殊字幕,贴片动画等工作成果:\n1.使用FFmpeg开发视频处理引擎,支持多种视频格式转码,压缩进度回调\n2.设计任务队列系统,服务器CPU使用率控制在70%以下,使用负载均衡分摊压力,实现任务批量处理\n3.集成GPT模型,视频内容理解准确率达85%,精华片段提取效率提升200%\n4.实现大文件分片上传,支持断点续传,上传成功率99%\n5.开发完整的日志追踪系统,问题定位时间缩短,使用sse日志推送至前端页面可实时观察任务处理情况,接入报警机器人报警推送至企业微信群\n6.开发前端视频渲染引擎,图片编辑器,js逆向破解支持数据采集成功\n7.封装常用前端组件库,前端框架搭建与维护,指导其他组员开发,解决问题",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2024.01",
"endDateStr": "至今"
},
{
"id": "2a6ee534976187341nx50t-6EVNWyoq-Vf-e",
"name": "水务DMA分区计量管理系统",
"roleName": "全栈工程师",
"url": "",
"startDate": "2023.07",
"endDate": "",
"projectDesc": "DMA (DistrictMetered Area)分区计量管理系统是一种先进的、专门应用于供水管网精细化管理的综合性系统。\n通过将供水管网划分成多个相对独立的计量区域(即DMA分区),在每个分区的进水口和出水口等关键节点安装高精度的计量设备,精确监测和记录水流的流入、流出情况,实现对各个分区内水量的实时计量与分析,其核心原理是基于封闭区域水量平衡理论,通过对比流入和流出水量等数据,精准定位可能存在的管网漏损点以及评估管网运行状态,助力供水企业实现科学管理、高效节水以及提升供水服务质量.\n前端技术栈:vue全家桶+elemeui,c#+wpf\n后端技术栈:Node.js+Koa2+mysq\n功能模块:\n1.实时数据处理:对DMA分区计量设备的水流数据进行清洗、校验和初步分析\n2.GIS数据管理:提供接口实现与地理信息系统的数据交互,管理管网地理空间数据。\n3.数据存储:基于MongoDB设计数据存储架构,进行数据备份与恢复。\n4.管网可视化:通过地图展示供水管网地理空间数据,支持多种地图操作\n5.空间分析:实现管网连通性、最短路径、缓冲区等空间分析功能。\n6.地图交互:提供地图标注和测距工具。\n7.实时数据推送:利用WebSocket实时推送DMA分区计量和设备状态数据。\n8.智能报警:实时监测管网异常,生成报警信息并通知相关人员,对报警信息分类统计\n9.设备状态监控:实时获取计量设备工作状态、电量等信息,分析运行历史数据数据采集功能\n10.数据采集程序:使用C#的WPF开发可与多种RTU设备通信的采集程序\n11.动态解析:服务端动态接收并自动解析不同RTU设备的数据。\n12.数据展示与导出:以图表和表格展示采集数据,支持CSV格式动态导出。\n项目成果:支持10000+设备并发查询性能提升150%系统稳定性99.99",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2023.07",
"endDateStr": "至今"
},
{
"id": "6aa05589bc43d7711nx50t-6EVNWyoq-Vf-d",
"name": "bb物语小程序商城",
"roleName": "全栈工程师",
"url": "",
"startDate": "2023.05",
"endDate": "",
"projectDesc": "技术架构:\n前端:Vue2+mpVue\n后端:node.js+koa2+sequelize\n数据库:MySQL+Redis\n功能模块:\n1.商品管理:商品分类、商品上架、库存管理、价格管理、商品搜索\n2.订单管理:订单创建、订单支付、订单取消、订单查询,订单统计\n3.用户管理:用户注册、用户登录、用户信息管理、用户积分、用户等级\n4.营销管理:优惠券管理、满减活动、限时抢购、拼团活动、积分兑换\n5.支付系统:微信支付、支付宝支付\n4.设计用户管理系统,支持用户注册、登录、信息管理和积分系统\n5.开发营销管理模块,支持优惠券、满减活动、限时抢购和拼团活动\n6.实现数据分析功能,支持销售数据统计,用户行为分析、商品热度分析、营销效果分析\n工作成果:\n1.实现商品管理系统,支持商品的分类、上架、库存和价格管理\n2.开发订单管理模块,支持订单的创建、支付、取消和查询\n3.集成多种支付方式,支持微信支付、支付宝支付\n4.设计用户管理系统,支持用户注册、登录、信息管理和积分系统\n5.开发营销管理模块,支持优惠券、满减活动、限时抢购和拼团活动\n6.实现数据分析功能,支持销售数据统计,用户行为分析和商品热度分析\n7.支持三级分销,以及销售人员工资统计",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2023.05",
"endDateStr": "至今"
},
{
"id": "32010e34944e04851nJ_0969E1JQx4q-Vfuc",
"name": "AI智能写手系统",
"roleName": "全栈开发工程师",
"url": "",
"startDate": "2020.03",
"endDate": "2021.07",
"projectDesc": "技术栈:Vue2+Element Ul+WebSocket+jWT+Less+Webpack+Node.js\n核心功能:\n1.平台管理:基于IWT的权限控制,实现品牌管理、角色权限、秀场墙功能\n2.内容制作:开发智能语句生成,作品库管理,多元化批量处理功能\n3.数据采集:Chrome插件开发,实现多平台商品信息自动采集\n4.多端适配:使用Rem+Flex实现响应式布局,支持不同屏幕自适应\n5.自动发布:开发多平台发布插件,支持淘宝天猫京东等平台内自动发布\n6.定时任务:基于Node.js实现定时发布、数据同步、内容更新等动化任务\n项目成果:开发效率提升200%|首屏加载800ms|数据处理效率提升300%|服务10+品牌|运营效率\n提升400%|任务成功率99.5%",
"performance": "开发效率提升200%首屏加载800ms数据处理效率提升300%服务10+品牌运营效率\n提升400%任务成功率99.5%",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2020.03",
"endDateStr": "2021.07"
},
{
"id": "1dc51326ce11bc601nJ_0969E1JQx4q-Vfud",
"name": "易分析取数工具",
"roleName": "全栈开发工程师",
"url": "",
"startDate": "2019.08",
"endDate": "2020.03",
"projectDesc": "系统简介\n获取天猫,淘宝,腾讯,小红书蒲公英商家后台数据,用与大数据做营销精细化运营,支持人群画像,地域,人群,粉丝,购买,等一些列数据,以及达人数据粉丝数,带货数,直播场次,直播效果,商品评论,数据做分析\n前端技术栈:vue全家桶+elemeui+浏览器插件\n后端技术栈:Node.js+Koa2+mysql,Pythopn+Selenium+Flask\n功能模块:\n1.前端数据采集:淘宝数据银行API对接,策略中心数据抓取,生意参谋数据同步,营销数据实时获取\n2.后端数据采集:\n3.插件功能:多平台数据采集插件、自定义数据抓取规则、请求拦截和数据过滤、离线数据缓存\n4.数据处理:多维度数据整合分析、数据清洗和结构化、自定义数据导出、实时数据同步\n5.监控预警:数据采集任务监控、异常采集预警,数据质量监控、采集额度管理\n工作成果:\n1.支持淘宝全站数据采集,日均处理5000+数据\n2.开发通用数据采集引擎,支持自定义采集规则\n3.实现数据实时同步,延迟<500ms\n4.分布式爬虫系统架构,支持分布式抓取",
"performance": "1. 设计插件热更新方案,实现核心模块动态替换和状态保持\n2. 开发多浏览器兼容层,解决不同浏览器API差异问题实现插件配置动态更新和按需加载机制\n3. 使用Sequelize设计数据模型,处理复杂的表关联和数据同步重写浏览器原生Ajax,实现智能请求拦截和缓存策略\n4. 开发分布式日志系统,支持问题快速定位",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2019.08",
"endDateStr": "2020.03"
},
{
"id": "e4294f91116b15dc1nJ_0969E1JQx4q-Vfue",
"name": "全工况智能终端采集系统",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2018.05",
"endDate": "2018.08",
"projectDesc": "技术栈:WPF+Socket+InfluxDB+PostgreSQL\n核心功能:\n1.数据采集:实现Socket高并发通信,支持多协议解析\n2.实时监控:开发设备状态实时监控界面\n3.数据存储:设计混合数据库方案,优化查询性能\n4.可视化:实现数据实时展示和趋势分析\n项目成果:支持10000+设备并发|查询性能提升150%|系统稳定性99.99%|支持亿级数据毫秒级查询",
"performance": "1.实现百万级数据快速查询,平均查询时间<500ms\n2.设计实时数据动态渲染方案\n3.优化数据库性能,批量写入效率提升50%\n4.实现数据自动分级存储和归档\n5.开发设备状态实时监控系统",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2018.05",
"endDateStr": "2018.08"
},
{
"id": "96160107ede0ae851nJ_0969E1JQx4q-Vfuf",
"name": "宝山排水证管理系统",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2017.01",
"endDate": "2017.07",
"projectDesc": "技术栈:AngularjS+KendoUI+lonic+TypeScript+MongoDE\n核心功能:\n1.PC端开发:基于KendoUI快速构建后台管理界面,实现许可证全流程管理\n2.移动端开发:使用lonic+Aneular开发跨平台App,支持iOS和Androic\n3.表单设计:实现动态表单配置,支持多类型数据录入和自定义校验规则\n4.流程管理:开发审批流程引擎,支持条件分支、并行审批、委托授权\n5.地图功能:集成百度地图,实现排水户分布展示和空间位置选择\n6.统计分析:开发数据可视化大屏,展示许可证办理情况和区域分布移动端技术难点:\n基于lonic+Cordova实现原生功能调用,如相机、定位、文件系统等解决Android返回键监听和iOS手势返冲突问题\n实现大文件分片上传和断点续传,支持现场照片批量上传\n开发自定义相机组件,支持照片压缩和水印添加使用SOLite实现本地数据存储,解决断网环境下的数据同光\n优化Scroll性能,解决长列表滚动卡顿问题\n处理键盘弹出时的页面布局自适应\n解决iOS和Android平台字体、样式兼容性问题\n实现应用内检查更新和增量更新功能\n优化首屏加载速度,实现资源按需加载\n项目成果:办理时间缩短80%|代码复用率80%|响应时间300ms|审批效率提升200%",
"performance": "1. 实现大文件分片上传和断点续传,支持现场照片批量上传开发自定义相机组件,支持照片压缩和水印添加使用SOLite实现本地数据存储,解决断网环境下的数据同光\n2. 优化Scroll性能,解决长列表滚动卡顿问题处理键盘弹出时的页面布局自适应解决iOS和Android平台字体、样式兼容性问题实现应用内检查更新和增量更新功能\n3. 优化首屏加载速度,实现资源按需加载",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2017.01",
"endDateStr": "2017.07"
},
{
"id": "c06dfe8c3678cf231nJ90tq7EVpQxo6_V_qW",
"name": "H5营销平台",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2014.06",
"endDate": "2016.05",
"projectDesc": "技术栈:Vue2+Canvas+CSS3+微信ISSDK+.Net\n功能模块:\n1.游戏开发:开发大转盘抽奖、刮刮卡等H5游戏、自研Canvas动画框架、支持Flash动画转换\n2.内容管理:开发可视化搭建工具、支持营销活动快速生成、实现模板在线编辑\n3.社交功能:集成微信分享、支付、授权、开发用户数据分析、实现活动数据统计\n项目成果:服务200+品牌开发效率提升300%转化率提升150%",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2014.06",
"endDateStr": "2016.05"
},
{
"id": "4e09afd8b41347c61nJ_0969E1JQx4q-VfqW",
"name": "物料ERP管理系统",
"roleName": "前端开发工程师",
"url": "",
"startDate": "2014.08",
"endDate": "2015.06",
"projectDesc": "技术栈:jQuery+Bootstrap+EasyUl+WebSocket+SQL Server\n核心功能:\n1.库存管理:实现物料库、出库、调拨、盘点等完整业务流程\n2.采购管理:开发供应商管理、询价比价、采购计划、订单跟踪功能\n3.生产管理:实现BOM管理、生产计划、物料需求计划(MRP)功能\n4.报表分析:开发库存周转率、采购分析、成本核算等统计报表\n5.预警提醒:设置库存预警、采购超期、价格异常等自动提醒\n技术难点:\n开发物料编码生成器,支持多级分类和自定义规则\n实现基于WebSocket的实时库存变更提醒\n设计MRP运算引擎,优化大批量数据处理性能\n开发报表导出功能,支持复杂表头和数据汇总项目成果:库存周转提升40%|采购成本降低15%|支持100+用户并发|日均处理3000+笔业务",
"performance": "1. 开发物料编码生成器,支持多级分类和自定义规则\n2. 实现基于WebSocket的实时库存变更提醒\n3. 设计MRP运算引擎,优化大批量数据处理性能\n4. 开发报表导出功能,支持复杂表头和数据汇",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2014.08",
"endDateStr": "2015.06"
}
],
"educationExpList": [
{
"id": "ee34188f32f9cecc1XF52NW5F1dT",
"schoolId": 2811,
"school": "武汉工程大学",
"major": "计算机应用技术(大数据方向)",
"degree": 203,
"eduType": 2,
"degreeName": "本科",
"startYear": "2021",
"endYear": "2024",
"educationDesc": "",
"country": "",
"tags": [
"卓越工程师计划"
],
"schoolType": 0,
"suggestToDel": 0,
"thesisTitle": "",
"thesisDesc": "",
"majorRanking": 0,
"courseList": [],
"badge": "https://img.bosszhipin.com/beijin/icon/bed7df948518127f74daa2ee178c44fc6bb61e3b7bce0931da574d19d1d82c88.jpg",
"certified": 0,
"garbageFieldList": null,
"startYearStr": "2021",
"endYearStr": "2024"
},
{
"id": "e095a1ceefdd0cc31XF52NW6FVZY",
"schoolId": 2831,
"school": "武汉软件工程职业学院",
"major": "软件技术",
"degree": 202,
"eduType": 1,
"degreeName": "大专",
"startYear": "2011",
"endYear": "2014",
"educationDesc": "",
"country": "",
"tags": [],
"schoolType": 0,
"suggestToDel": 0,
"thesisTitle": "",
"thesisDesc": "",
"majorRanking": 0,
"courseList": [],
"badge": "https://img.bosszhipin.com/beijin/icon/18282111c2fc8e191c5b6aedcece5a956bb61e3b7bce0931da574d19d1d82c88.jpg",
"certified": 0,
"garbageFieldList": null,
"startYearStr": "2011",
"endYearStr": "2014"
}
],
"socialContactList": null,
"volunteerExpList": null,
"certificationList": null,
"trainingExpList": null,
"designWorksImage": null,
"designWorksVideo": null,
"personalImage": null,
"deliciousFoodImage": null,
"garbage": {
"status": 0,
"reasonCode": 0,
"resumeDetailStatus": 0,
"garbageBaseInfo": null,
"baseInfo": null,
"garbageUserDesc": null,
"personalAdvantages": null,
"garbageWorkExp": null,
"workExp": null,
"garbageEduExp": null,
"eduExp": null,
"garbageProjectExp": null,
"projectExp": null,
"garbageVolunteerExp": null,
"volunteerExp": null,
"garbageExpectList": null,
"expect": null,
"garbageCertificationList": null,
"certification": null,
"designWorks": null,
"designWorksImageList": null,
"designWorksVideoList": null,
"garbageHandicapped": null,
"handicapped": null,
"trainingExp": null,
"clubExp": null,
"professionalSkill": null,
"honor": null
},
"editStatus": {
"canAddExpect": true,
"canAddWorkExp": true,
"canAddProjectExp": true,
"canAddEduExp": true,
"canAddSocialContact": true
},
"doneWorkPositionList": [],
"handicappedInfo": null,
"postExpList": [],
"myLabels": null,
"clubExpList": [],
"professionalSkill": null,
"honorList": [],
"feature": {
"showNewPositionStyle": 1,
"showHandicappedModule": 0,
"showResumeImportBtn": 1,
"showResumeImportBtnRedDot": false,
"showResumeFillHelper": 1,
"showTrainingExpModule": 0,
"showF3Optimize": 1,
"showPostExpModule": 0,
"webResumeLabelModule": 0,
"expectLocationInterestCombine": 0,
"stuMultiExpectChoose": 0,
"useNewStruct": 1
},
"virtualPartTimeCombineExpect": null,
"extendInfo": {
"shareUrl": "https://m.zhipin.com/mpa/html/resume-detail?sid=self&securityId=I8Nn8H-vv1Tt2-x1OxkE4U0hH697NrOJFEJF_pkEXnMTR6gLbbUXGWy9pFLFnOy9YeLxI-31CLT9aCmPeQ_YSVDoSj1AMLuej3IhRhkUgQzm98k4pG1F7XVZdNphlh2Mc8Wr2PltQNmRB2eJHwcx4j338ACBezr_YAvcjOQ~",
"shareText": "{\"showQQShare\":false,\"smsShareTitle\":\"牛人张成 10年以上工作经验目标 全栈工程师职位求靠谱Boss带走。迅速进入@Boss直聘把TA带走下载链接奉上https://m.zhipin.com/download?from=duanxin\",\"wbShareTitle\":\"#招聘#牛人张成 10年以上工作经验目标 全栈工程师职位求靠谱Boss带走。迅速进入@Boss直聘把TA带走下载链接奉上https://m.zhipin.com/download?from=weibo\",\"wxShareDesc\":\"经验10年以上工作经验 期望薪资20-30K\",\"wxShareTitle\":\"【Boss直聘】张成正在求职全栈工程师\"}"
},
"moduleList": [
{
"moduleType": 10,
"moduleName": "个人信息",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": {
"name": "张成",
"nickName": "张成",
"tiny": "https://img.bosszhipin.com/beijin/upload/avatar/20250211/607f1f3d68754fd006d510844c0273d99b737108b9d73a664006f977785f3a6a694eb527b0e564d8_s.png.webp",
"birthday": "1993-06",
"age": "32岁",
"gender": 1,
"degree": 203,
"degreeCategory": "本科",
"account": "193******69",
"emailBlur": "978****03@qq.com",
"weixinBlur": "z56***01",
"freshGraduate": 0,
"workYears": 11,
"nameShowType": 0,
"bossCert": 0,
"userCert": 2,
"certGender": true,
"certBirth": true,
"startWorkDate": 20141201,
"applyStatus": 0,
"workYearDesc": "10年以上经验",
"resumeStatus": 0,
"resumeCount": 0,
"complete": false,
"weiXinSecurityUid": null,
"garbageFieldList": null,
"hometown": 0,
"hometownName": null,
"studyAbroadCertPass": 0,
"highestEduExp": null,
"showF3Optimize": 0,
"startWorkDateDesc": "2014-12",
"birthdayDesc": "1993-06"
},
"dataList": null
},
{
"moduleType": 11,
"moduleName": "个人优势",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": {
"userDesc": "拥有10年深厚行业经验的资深前端架构师专注前沿技术与业务融合推动数字化产品创新升级。\n \n1. 技术栈与架构熟练运用Vue、React等主流框架搭配Webpack、Vite等构建工具进行高效开发。精通TypeScript优化代码结构与维护性。擅长使用Redux、MobX管理复杂应用状态搭建稳定架构。\n \n2. 跨端与组件化掌握Flutter、React Native等跨端技术实现多平台无缝运行。主导设计高复用组件库利用Storybook管理组件使组件复用率达70%开发周期缩短40%。\n \n3. AI集成积极探索AI与前端融合集成GPT等大模型实现智能客服、内容生成引入机器学习算法实现用户行为分析、个性化推荐大幅提升用户参与度。\n \n4. 音视频处理具备音视频处理能力使用WebRTC实现实时通信结合FFmpeg进行格式转换、剪辑。利用Media Source Extensions实现自适应码率播放优化视频加载与播放体验。\n\n 5. 后端及多元开发擅长使用Node.js搭配Express、Koa框架搭建高性能后端服务优化接口响应速度。熟练运用Python进行数据处理、自动化脚本编写结合Django、Flask框架开发后端应用在数据挖掘与分析领域成果显著。掌握C#语言,基于.NET平台进行Windows桌面应用开发具备丰富的Windows Forms、WPF项目经验实现全栈技术链路的打通。"
},
"dataList": null
},
{
"moduleType": 24,
"moduleName": "求职期望",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": null,
"dataList": [
{
"id": "dfc1777a2703c9071nVz3d-0GVpYxA~~",
"expectType": 0,
"position": 100123,
"positionName": "全栈工程师",
"customPositionId": "",
"positionType": 0,
"location": 101020100,
"locationName": "上海",
"subLocation": 0,
"subLocationName": null,
"lowSalary": 20,
"highSalary": 30,
"salaryDesc": "20-30K",
"salaryDescNew": "20-30K",
"industryList": [],
"industryDesc": "行业不限",
"suggestPosition": "",
"applyStatus": 0,
"freshGraduate": 0,
"doneWorkPositionList": null,
"garbageFieldList": null,
"interestPositionList": null,
"interestLocationList": null,
"industryExpect": false,
"tagName": null
}
]
},
{
"moduleType": 12,
"moduleName": "工作经历",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": null,
"dataList": [
{
"id": "9bd3116c0333c52d1nJ_09y-EldZx465V_-X",
"companyName": "上海宝尊电子商务有限公司",
"industry": {
"code": 100020,
"name": "互联网"
},
"department": "",
"customPositionName": "架构师",
"position": 100704,
"positionName": "架构师",
"positionLv2": 100700,
"startDate": "2019.06",
"startDateStr": "2019.06",
"endDate": "2024.12",
"endDateStr": "2024.12",
"emphasis": [],
"workContent": "智能视频剪辑系统(2021.07-2024.12)\n技术栈:Vue2+Element UI+WebAssembly+Canvas+Konva.js+WebSocket+GSAP\n核心功能:\n1.视频处理:基于WebAssembly解析视频信息,实现大文件分片上传,支持200G+视频处理\n2.创意编辑:使用Konva.js开发多层级编辑器,实现图片分层、文字动画、贴片特效\n3.动画系统:基于GSAP开发文字特效、Logo动画,支持动态片头片尾制作\n4.预览系统:使用Canvas实现视频片段预览,支持时间轴精确定位\n5.任务管理:基于WebSocket实现批量任务进度实时通知\n项目成果:视频处理效率提升300%|日均处理1000+视频|压缩率达97%|任务效率提升200%|降低\n人工成本60%",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "283b1abcae6041e41nJ_0969ElpVy423Vvic",
"companyName": "上海航天动力科技工程有限公司",
"industry": {
"code": 100021,
"name": "计算机软件"
},
"department": "",
"customPositionName": "架构师",
"position": 100704,
"positionName": "架构师",
"positionLv2": 100700,
"startDate": "2018.06",
"startDateStr": "2018.06",
"endDate": "2019.06",
"endDateStr": "2019.06",
"emphasis": [],
"workContent": "技术栈:Vue2+iView+OpenLayers+Cesium+WebSocket+Less\n核心功能:\n1.GIS可视化:基于OpenLayers实现管网GIS展示,支持多图层管理\n2.实时监控:使用WebSocket推送报警信息,实现管道水流方向动画\n3.数据分析:集成ECharts开发运营分析、报表统计功能\n4.空间分析:使用Turf.js实现等差线绘制,可视化爆管位置\n项目成果:地图加载提升200%|漏损检测准确率95%|节省成本300万+|服务10+水务公司|覆盖管\n网1000km+",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "d18fc7f74a6479ee1nJ_0969ElpVy423Vvid",
"companyName": "上海开澜软件有限公司",
"industry": {
"code": 100021,
"name": "计算机软件"
},
"department": "",
"customPositionName": ".NET",
"position": 100107,
"positionName": ".NET",
"positionLv2": 100100,
"startDate": "2016.06",
"startDateStr": "2016.06",
"endDate": "2018.06",
"endDateStr": "2018.06",
"emphasis": [
"HTML"
],
"workContent": "滩涂造地BIM管理系统(2017.01-2018.05)\n技术栈:jQuery+EasyUI+BIMViz+百度图+WebAppOffice\n核心功能:\n1.BIM可视化:集成BIMViz实现模型在线预览,支持构件查询和联动\n2.地图集成:基于百度地图API实现工程位置展示和空间分析\n3.文档管理:使用WebAppOffice实现在线预览,支持多格式文档\n4.工作流程:开发OA审批流程,实现物料申请和人员管理\n项目成果:BIM性能提升200%|审批效率提升150%|支持50+文档格式|日均处理500+工单|管理效\n率提升80%",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
},
{
"id": "c07196b9b117210f1nJ_0969ElpVy423Vvie",
"companyName": "上海加谷网络科技有限公司",
"industry": {
"code": 100002,
"name": "游戏"
},
"department": "",
"customPositionName": ".NET",
"position": 100107,
"positionName": ".NET",
"positionLv2": 100100,
"startDate": "2014.06",
"startDateStr": "2014.06",
"endDate": "2016.05",
"endDateStr": "2016.05",
"emphasis": [
"HTML"
],
"workContent": "H5营销平台开发(2014.06-2016.05)\n技术栈:jQuery+Canvas+CSS3+HTML5+微信JSSDK\n核心功能:\n1.互动游戏:开发大转盘抽奖、刮刮卡、砸金蛋等H5游戏\n2.动画特效:自研Canvas动画框架,支持Flash动画转换\n3.低代码平台:开发可视化搭建工具,支持营销活动快速生成\n4.社交功能:集成微信分享、支付、授权等功能项目成果:服务200+品牌|开发效率提升300%|上线周期缩短80%|转化率提升150%|支持百万级访问",
"workPerformance": "",
"isPublic": 1,
"workType": 1,
"suggestToDel": 0,
"garbageFieldList": null
}
]
},
{
"moduleType": 13,
"moduleName": "项目经历",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": null,
"dataList": [
{
"id": "903b8e07eb7f44ca1nx50t-6EFZQw4i8UvKY",
"name": "AI智能视频剪辑系统",
"roleName": "全栈工程师",
"url": "",
"startDate": "2024.01",
"endDate": "",
"projectDesc": "系统简介\nai智能视频剪辑系统,可通过淘宝直播间,天猫,淘宝商品链接,自动从直播间中按照商品切片,并输出到天猫商品详情页主视频,发布到小红书,淘宝微淘等平台,可批量生成视频,处理视频,前端技术栈:vue全家桶+elemeui+浏览器插件\n后端技术栈:Node.js+Koa2+Vue2+FFmpeg+Redis\n功能模块:\n1.内容采集:开发Chrome浏览器插件自动获取直播回放、商品时间点智能识别、多平台视频源导入本地大视频文件上传,支持200g左右大文件批量上传,断点续传等功能\n2.任务管理:用户可以批量创建任务,任务实时状态使用WebSocket更新并通知\n3.模版管理:可基于execl文件批量创建任务,动态生成片尾图和首图\n4.智能生成:基于GPT的视频内容理解、关键片段提取和智能场景组合、60秒精华自动生成\n5.内容编辑:多轨道编辑和场景识别分割、转场特效库和字幕样式编辑、贴纸滤镜和音频处理、GSAP文字动画和Logo动效\n6.深度剪辑:用户可以拖动句子,自动以切片输出内容\n7.发布管理:多格式导出和自定义分辨率码率、批量导出队列和云端渲染、进度实时展示\n8.视频特效开发:如:文字抖动,花字,特效,特殊字幕,贴片动画等工作成果:\n1.使用FFmpeg开发视频处理引擎,支持多种视频格式转码,压缩进度回调\n2.设计任务队列系统,服务器CPU使用率控制在70%以下,使用负载均衡分摊压力,实现任务批量处理\n3.集成GPT模型,视频内容理解准确率达85%,精华片段提取效率提升200%\n4.实现大文件分片上传,支持断点续传,上传成功率99%\n5.开发完整的日志追踪系统,问题定位时间缩短,使用sse日志推送至前端页面可实时观察任务处理情况,接入报警机器人报警推送至企业微信群\n6.开发前端视频渲染引擎,图片编辑器,js逆向破解支持数据采集成功\n7.封装常用前端组件库,前端框架搭建与维护,指导其他组员开发,解决问题",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2024.01",
"endDateStr": "至今"
},
{
"id": "2a6ee534976187341nx50t-6EVNWyoq-Vf-e",
"name": "水务DMA分区计量管理系统",
"roleName": "全栈工程师",
"url": "",
"startDate": "2023.07",
"endDate": "",
"projectDesc": "DMA (DistrictMetered Area)分区计量管理系统是一种先进的、专门应用于供水管网精细化管理的综合性系统。\n通过将供水管网划分成多个相对独立的计量区域(即DMA分区),在每个分区的进水口和出水口等关键节点安装高精度的计量设备,精确监测和记录水流的流入、流出情况,实现对各个分区内水量的实时计量与分析,其核心原理是基于封闭区域水量平衡理论,通过对比流入和流出水量等数据,精准定位可能存在的管网漏损点以及评估管网运行状态,助力供水企业实现科学管理、高效节水以及提升供水服务质量.\n前端技术栈:vue全家桶+elemeui,c#+wpf\n后端技术栈:Node.js+Koa2+mysq\n功能模块:\n1.实时数据处理:对DMA分区计量设备的水流数据进行清洗、校验和初步分析\n2.GIS数据管理:提供接口实现与地理信息系统的数据交互,管理管网地理空间数据。\n3.数据存储:基于MongoDB设计数据存储架构,进行数据备份与恢复。\n4.管网可视化:通过地图展示供水管网地理空间数据,支持多种地图操作\n5.空间分析:实现管网连通性、最短路径、缓冲区等空间分析功能。\n6.地图交互:提供地图标注和测距工具。\n7.实时数据推送:利用WebSocket实时推送DMA分区计量和设备状态数据。\n8.智能报警:实时监测管网异常,生成报警信息并通知相关人员,对报警信息分类统计\n9.设备状态监控:实时获取计量设备工作状态、电量等信息,分析运行历史数据数据采集功能\n10.数据采集程序:使用C#的WPF开发可与多种RTU设备通信的采集程序\n11.动态解析:服务端动态接收并自动解析不同RTU设备的数据。\n12.数据展示与导出:以图表和表格展示采集数据,支持CSV格式动态导出。\n项目成果:支持10000+设备并发查询性能提升150%系统稳定性99.99",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2023.07",
"endDateStr": "至今"
},
{
"id": "6aa05589bc43d7711nx50t-6EVNWyoq-Vf-d",
"name": "bb物语小程序商城",
"roleName": "全栈工程师",
"url": "",
"startDate": "2023.05",
"endDate": "",
"projectDesc": "技术架构:\n前端:Vue2+mpVue\n后端:node.js+koa2+sequelize\n数据库:MySQL+Redis\n功能模块:\n1.商品管理:商品分类、商品上架、库存管理、价格管理、商品搜索\n2.订单管理:订单创建、订单支付、订单取消、订单查询,订单统计\n3.用户管理:用户注册、用户登录、用户信息管理、用户积分、用户等级\n4.营销管理:优惠券管理、满减活动、限时抢购、拼团活动、积分兑换\n5.支付系统:微信支付、支付宝支付\n4.设计用户管理系统,支持用户注册、登录、信息管理和积分系统\n5.开发营销管理模块,支持优惠券、满减活动、限时抢购和拼团活动\n6.实现数据分析功能,支持销售数据统计,用户行为分析、商品热度分析、营销效果分析\n工作成果:\n1.实现商品管理系统,支持商品的分类、上架、库存和价格管理\n2.开发订单管理模块,支持订单的创建、支付、取消和查询\n3.集成多种支付方式,支持微信支付、支付宝支付\n4.设计用户管理系统,支持用户注册、登录、信息管理和积分系统\n5.开发营销管理模块,支持优惠券、满减活动、限时抢购和拼团活动\n6.实现数据分析功能,支持销售数据统计,用户行为分析和商品热度分析\n7.支持三级分销,以及销售人员工资统计",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2023.05",
"endDateStr": "至今"
},
{
"id": "32010e34944e04851nJ_0969E1JQx4q-Vfuc",
"name": "AI智能写手系统",
"roleName": "全栈开发工程师",
"url": "",
"startDate": "2020.03",
"endDate": "2021.07",
"projectDesc": "技术栈:Vue2+Element Ul+WebSocket+jWT+Less+Webpack+Node.js\n核心功能:\n1.平台管理:基于IWT的权限控制,实现品牌管理、角色权限、秀场墙功能\n2.内容制作:开发智能语句生成,作品库管理,多元化批量处理功能\n3.数据采集:Chrome插件开发,实现多平台商品信息自动采集\n4.多端适配:使用Rem+Flex实现响应式布局,支持不同屏幕自适应\n5.自动发布:开发多平台发布插件,支持淘宝天猫京东等平台内自动发布\n6.定时任务:基于Node.js实现定时发布、数据同步、内容更新等动化任务\n项目成果:开发效率提升200%|首屏加载800ms|数据处理效率提升300%|服务10+品牌|运营效率\n提升400%|任务成功率99.5%",
"performance": "开发效率提升200%首屏加载800ms数据处理效率提升300%服务10+品牌运营效率\n提升400%任务成功率99.5%",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2020.03",
"endDateStr": "2021.07"
},
{
"id": "1dc51326ce11bc601nJ_0969E1JQx4q-Vfud",
"name": "易分析取数工具",
"roleName": "全栈开发工程师",
"url": "",
"startDate": "2019.08",
"endDate": "2020.03",
"projectDesc": "系统简介\n获取天猫,淘宝,腾讯,小红书蒲公英商家后台数据,用与大数据做营销精细化运营,支持人群画像,地域,人群,粉丝,购买,等一些列数据,以及达人数据粉丝数,带货数,直播场次,直播效果,商品评论,数据做分析\n前端技术栈:vue全家桶+elemeui+浏览器插件\n后端技术栈:Node.js+Koa2+mysql,Pythopn+Selenium+Flask\n功能模块:\n1.前端数据采集:淘宝数据银行API对接,策略中心数据抓取,生意参谋数据同步,营销数据实时获取\n2.后端数据采集:\n3.插件功能:多平台数据采集插件、自定义数据抓取规则、请求拦截和数据过滤、离线数据缓存\n4.数据处理:多维度数据整合分析、数据清洗和结构化、自定义数据导出、实时数据同步\n5.监控预警:数据采集任务监控、异常采集预警,数据质量监控、采集额度管理\n工作成果:\n1.支持淘宝全站数据采集,日均处理5000+数据\n2.开发通用数据采集引擎,支持自定义采集规则\n3.实现数据实时同步,延迟<500ms\n4.分布式爬虫系统架构,支持分布式抓取",
"performance": "1. 设计插件热更新方案,实现核心模块动态替换和状态保持\n2. 开发多浏览器兼容层,解决不同浏览器API差异问题实现插件配置动态更新和按需加载机制\n3. 使用Sequelize设计数据模型,处理复杂的表关联和数据同步重写浏览器原生Ajax,实现智能请求拦截和缓存策略\n4. 开发分布式日志系统,支持问题快速定位",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2019.08",
"endDateStr": "2020.03"
},
{
"id": "e4294f91116b15dc1nJ_0969E1JQx4q-Vfue",
"name": "全工况智能终端采集系统",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2018.05",
"endDate": "2018.08",
"projectDesc": "技术栈:WPF+Socket+InfluxDB+PostgreSQL\n核心功能:\n1.数据采集:实现Socket高并发通信,支持多协议解析\n2.实时监控:开发设备状态实时监控界面\n3.数据存储:设计混合数据库方案,优化查询性能\n4.可视化:实现数据实时展示和趋势分析\n项目成果:支持10000+设备并发|查询性能提升150%|系统稳定性99.99%|支持亿级数据毫秒级查询",
"performance": "1.实现百万级数据快速查询,平均查询时间<500ms\n2.设计实时数据动态渲染方案\n3.优化数据库性能,批量写入效率提升50%\n4.实现数据自动分级存储和归档\n5.开发设备状态实时监控系统",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2018.05",
"endDateStr": "2018.08"
},
{
"id": "96160107ede0ae851nJ_0969E1JQx4q-Vfuf",
"name": "宝山排水证管理系统",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2017.01",
"endDate": "2017.07",
"projectDesc": "技术栈:AngularjS+KendoUI+lonic+TypeScript+MongoDE\n核心功能:\n1.PC端开发:基于KendoUI快速构建后台管理界面,实现许可证全流程管理\n2.移动端开发:使用lonic+Aneular开发跨平台App,支持iOS和Androic\n3.表单设计:实现动态表单配置,支持多类型数据录入和自定义校验规则\n4.流程管理:开发审批流程引擎,支持条件分支、并行审批、委托授权\n5.地图功能:集成百度地图,实现排水户分布展示和空间位置选择\n6.统计分析:开发数据可视化大屏,展示许可证办理情况和区域分布移动端技术难点:\n基于lonic+Cordova实现原生功能调用,如相机、定位、文件系统等解决Android返回键监听和iOS手势返冲突问题\n实现大文件分片上传和断点续传,支持现场照片批量上传\n开发自定义相机组件,支持照片压缩和水印添加使用SOLite实现本地数据存储,解决断网环境下的数据同光\n优化Scroll性能,解决长列表滚动卡顿问题\n处理键盘弹出时的页面布局自适应\n解决iOS和Android平台字体、样式兼容性问题\n实现应用内检查更新和增量更新功能\n优化首屏加载速度,实现资源按需加载\n项目成果:办理时间缩短80%|代码复用率80%|响应时间300ms|审批效率提升200%",
"performance": "1. 实现大文件分片上传和断点续传,支持现场照片批量上传开发自定义相机组件,支持照片压缩和水印添加使用SOLite实现本地数据存储,解决断网环境下的数据同光\n2. 优化Scroll性能,解决长列表滚动卡顿问题处理键盘弹出时的页面布局自适应解决iOS和Android平台字体、样式兼容性问题实现应用内检查更新和增量更新功能\n3. 优化首屏加载速度,实现资源按需加载",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2017.01",
"endDateStr": "2017.07"
},
{
"id": "c06dfe8c3678cf231nJ90tq7EVpQxo6_V_qW",
"name": "H5营销平台",
"roleName": ".net软件工程师",
"url": "",
"startDate": "2014.06",
"endDate": "2016.05",
"projectDesc": "技术栈:Vue2+Canvas+CSS3+微信ISSDK+.Net\n功能模块:\n1.游戏开发:开发大转盘抽奖、刮刮卡等H5游戏、自研Canvas动画框架、支持Flash动画转换\n2.内容管理:开发可视化搭建工具、支持营销活动快速生成、实现模板在线编辑\n3.社交功能:集成微信分享、支付、授权、开发用户数据分析、实现活动数据统计\n项目成果:服务200+品牌开发效率提升300%转化率提升150%",
"performance": "",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2014.06",
"endDateStr": "2016.05"
},
{
"id": "4e09afd8b41347c61nJ_0969E1JQx4q-VfqW",
"name": "物料ERP管理系统",
"roleName": "前端开发工程师",
"url": "",
"startDate": "2014.08",
"endDate": "2015.06",
"projectDesc": "技术栈:jQuery+Bootstrap+EasyUl+WebSocket+SQL Server\n核心功能:\n1.库存管理:实现物料库、出库、调拨、盘点等完整业务流程\n2.采购管理:开发供应商管理、询价比价、采购计划、订单跟踪功能\n3.生产管理:实现BOM管理、生产计划、物料需求计划(MRP)功能\n4.报表分析:开发库存周转率、采购分析、成本核算等统计报表\n5.预警提醒:设置库存预警、采购超期、价格异常等自动提醒\n技术难点:\n开发物料编码生成器,支持多级分类和自定义规则\n实现基于WebSocket的实时库存变更提醒\n设计MRP运算引擎,优化大批量数据处理性能\n开发报表导出功能,支持复杂表头和数据汇总项目成果:库存周转提升40%|采购成本降低15%|支持100+用户并发|日均处理3000+笔业务",
"performance": "1. 开发物料编码生成器,支持多级分类和自定义规则\n2. 实现基于WebSocket的实时库存变更提醒\n3. 设计MRP运算引擎,优化大批量数据处理性能\n4. 开发报表导出功能,支持复杂表头和数据汇",
"suggestToDel": 0,
"garbageFieldList": null,
"startDateStr": "2014.08",
"endDateStr": "2015.06"
}
]
},
{
"moduleType": 14,
"moduleName": "教育经历",
"customConfig": {
"showType": 0,
"desc": null,
"tag": null
},
"data": null,
"dataList": [
{
"id": "ee34188f32f9cecc1XF52NW5F1dT",
"schoolId": 2811,
"school": "武汉工程大学",
"major": "计算机应用技术(大数据方向)",
"degree": 203,
"eduType": 2,
"degreeName": "本科",
"startYear": "2021",
"endYear": "2024",
"educationDesc": "",
"country": "",
"tags": [
"卓越工程师计划"
],
"schoolType": 0,
"suggestToDel": 0,
"thesisTitle": "",
"thesisDesc": "",
"majorRanking": 0,
"courseList": [],
"badge": "https://img.bosszhipin.com/beijin/icon/bed7df948518127f74daa2ee178c44fc6bb61e3b7bce0931da574d19d1d82c88.jpg",
"certified": 0,
"garbageFieldList": null,
"startYearStr": "2021",
"endYearStr": "2024"
},
{
"id": "e095a1ceefdd0cc31XF52NW6FVZY",
"schoolId": 2831,
"school": "武汉软件工程职业学院",
"major": "软件技术",
"degree": 202,
"eduType": 1,
"degreeName": "大专",
"startYear": "2011",
"endYear": "2014",
"educationDesc": "",
"country": "",
"tags": [],
"schoolType": 0,
"suggestToDel": 0,
"thesisTitle": "",
"thesisDesc": "",
"majorRanking": 0,
"courseList": [],
"badge": "https://img.bosszhipin.com/beijin/icon/18282111c2fc8e191c5b6aedcece5a956bb61e3b7bce0931da574d19d1d82c88.jpg",
"certified": 0,
"garbageFieldList": null,
"startYearStr": "2011",
"endYearStr": "2014"
}
]
},
{
"moduleType": 16,
"moduleName": "资格证书",
"customConfig": {
"showType": 1,
"desc": null,
"tag": null
},
"data": null,
"dataList": null
},
{
"moduleType": 21,
"moduleName": "志愿服务经历",
"customConfig": {
"showType": 1,
"desc": null,
"tag": null
},
"data": null,
"dataList": null
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,47 +0,0 @@
# 已删除文件清单
## ✅ 已删除的文件
### 1. 废弃的服务文件
-`api/services/task_scheduler.js` - 未使用的任务调度器
- **原因**:实际系统使用 `middleware/schedule/` 中的调度系统
- **替代方案**:使用 `middleware/schedule/index.js` 中的 `ScheduleManager`
### 2. 已合并的服务文件
-`api/services/job_service.js` - 职位服务(只有一个方法)
- **原因**:只有一个 `jobGreet` 方法,已合并到 `middleware/job/jobManager.js`
- **新位置**`middleware/job/jobManager.js``job_greet()` 方法
### 3. 重命名的文件
-`api/services/ossTool.js``api/services/oss_tool_service.js`
- **原因**统一命名规范snake_case + _service.js
## 📝 清理说明
### services/index.js 清理
- 移除了对 `TaskScheduler` 的引用(已废弃)
- 移除了对 `MQTTHandler` 的引用(文件不存在)
- 移除了对 `JobService` 的引用(已合并)
- 保留了 `AIService``PlaAccountService` 的引用
## ⚠️ 注意事项
1. **TaskScheduler 已废弃**
- 实际调度系统:`middleware/schedule/index.js` (ScheduleManager)
- 任务队列:`middleware/schedule/taskQueue.js`
2. **MQTT 管理**
- 实际使用:`middleware/mqtt/mqttManager.js`
- 不是 `services/mqtt_handler.js`(文件不存在)
3. **工作管理**
- 实际使用:`middleware/job/jobManager.js`
- 已包含 `job_greet` 方法
## 🔄 后续工作
继续完成命名规范统一:
- 移动并重命名 `middleware/job/` 下的文件到 `services/`
- 合并AI服务
- 统一类命名

View File

View File

@@ -1,123 +0,0 @@
# 指令和任务模式适配检查报告
## 📋 检查范围
检查 `api/middleware` 目录下的代码是否适用于新的指令和任务模式。
## ✅ 已适配的部分
### 1. **任务处理器 (taskHandlers.js)**
- ✅ 正确使用 `command.executeCommands()` 执行指令
- ✅ 在 `handleAutoDeliverTask` 中创建指令并执行
- ✅ 指令类型使用驼峰命名(`getOnlineResume`, `getJobList`, `applyJob`
### 2. **指令管理器 (command.js)**
- ✅ 已重构完成,统一封装指令执行
- ✅ 统一处理成功、失败、超时
- ✅ 统一记录数据库
- ✅ 支持驼峰转下划线的命名转换
### 3. **任务队列 (taskQueue.js)**
- ✅ 正确使用任务处理器
- ✅ 通过 `taskHandlers` 执行任务
## ⚠️ 需要修复的问题
### 1. **方法命名不一致**
**问题描述**
- 指令类型使用驼峰命名:`getOnlineResume`, `getJobList`, `applyJob`
- 大部分方法使用下划线命名:`get_online_resume`, `get_job_list`
-`applyJob` 方法名是驼峰命名,与指令类型一致
**当前转换逻辑**
```javascript
// command.js 中的转换
const to_snake_case = (str) => {
if (str.includes('_')) return str;
return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
};
// getOnlineResume -> get_online_resume ✓
// getJobList -> get_job_list ✓
// applyJob -> apply_job ✗ (但实际方法名是 applyJob)
```
**解决方案**
1. **方案1推荐**:统一使用下划线命名,将 `applyJob` 改为 `apply_job`
2. **方案2**:保持现状,`command.js` 中已支持两种命名方式(先尝试下划线,再尝试原名称)
**当前状态**方案2已实现代码可以正常工作但命名不统一。
### 2. **sendChatMessage 方法**
**问题描述**
- `chatManager.js` 中的方法是 `sendChatMessage`(驼峰命名)
- 如果指令类型是 `sendChatMessage`,转换后会变成 `send_chat_message`,但实际方法名是 `sendChatMessage`
**当前状态**`command.js` 中已支持回退机制,如果下划线命名找不到,会尝试原名称,所以可以正常工作。
## 📊 方法命名对照表
| 指令类型 (command_type) | 转换后方法名 | 实际方法名 | 状态 |
|------------------------|-------------|-----------|------|
| `getOnlineResume` | `get_online_resume` | `get_online_resume` | ✅ 匹配 |
| `getJobList` | `get_job_list` | `get_job_list` | ✅ 匹配 |
| `applyJob` | `apply_job` | `applyJob` | ⚠️ 不匹配(但可工作) |
| `sendChatMessage` | `send_chat_message` | `sendChatMessage` | ⚠️ 不匹配(但可工作) |
## 🔧 建议修复
### 方案1统一使用下划线命名推荐
**修改文件**
1. `api/middleware/job/jobManager.js`:将 `applyJob` 改为 `apply_job`
2. `api/middleware/job/chatManager.js`:将 `sendChatMessage` 改为 `send_chat_message`
3. `api/middleware/schedule/taskHandlers.js`:将指令类型改为下划线命名
**优点**
- 命名统一,符合项目规范
- 代码更清晰,减少混淆
**缺点**
- 需要修改多个文件
- 可能影响其他调用方
### 方案2保持现状当前方案
**优点**
- 不需要修改现有代码
- `command.js` 已支持两种命名方式
**缺点**
- 命名不统一,容易混淆
- 代码可读性稍差
## 📝 其他检查项
### 1. **deviceManager.js**
- ✅ 不直接涉及指令和任务,主要用于设备状态管理
- ✅ 与任务系统配合良好
### 2. **job/index.js**
- ✅ 正确导出所有方法
- ✅ 支持下划线命名规范
### 3. **MQTT 相关**
- ✅ 通过 `mqttClient.publishAndWait` 发送指令
- ✅ 与指令系统配合良好
## ✅ 总结
**整体适配情况****良好** ✅
1. ✅ 核心功能已正确适配新的指令和任务模式
2. ✅ 指令执行统一封装,处理逻辑完善
3. ⚠️ 存在命名不一致问题,但不影响功能(有回退机制)
4. 💡 建议统一命名规范,提高代码可维护性
## 🎯 下一步行动
1. **可选**:统一方法命名规范(下划线命名)
2. **可选**:添加单元测试验证指令执行流程
3. **可选**:完善错误处理和日志记录

View File

@@ -1,764 +0,0 @@
# Boss直聘搜索列表和投递功能开发规划
## 📋 功能概述
基于Boss直聘Web端职位搜索页面`https://www.zhipin.com/web/geek/jobs`),完善搜索列表获取和职位投递功能,包括服务端任务创建、指令生成和完整流程实现。
## 🎯 目标功能
### 1. 搜索列表功能
- 支持多条件搜索(关键词、城市、薪资、经验、学历等)
- 支持分页获取职位列表
- 自动保存职位到数据库
- 支持职位去重和更新
### 2. 投递功能
- 单个职位投递
- 批量职位投递
- 投递状态跟踪
- 投递记录管理
## 📊 Boss直聘响应数据结构
### 响应格式示例
Boss直聘搜索职位列表的响应数据结构如下
```json
{
"code": 0,
"message": "Success",
"zpData": {
"resCount": 450, // 搜索结果总数
"hasMore": true, // 是否还有更多
"totalCount": 300, // 总职位数
"jobList": [ // 职位列表
{
"encryptJobId": "5ae70dfe114c23ab0nR-2ti-FFpU", // 职位ID投递必需
"encryptBossId": "b55854108ac215180XZ62N-_FlNT", // Boss ID投递必需
"securityId": "HP23zbQfaslvy-c1...", // 安全ID投递必需
"jobName": "全栈软件工程师", // 职位名称
"salaryDesc": "25-50K·19薪", // 薪资描述(需解析)
"jobExperience": "在校/应届", // 工作经验(需解析)
"jobDegree": "学历不限", // 学历要求
"city": 101020100, // 城市代码
"cityName": "上海", // 城市名称
"areaDistrict": "长宁区", // 区域
"businessDistrict": "新华路", // 商圈
"gps": { // 位置信息(优先使用)
"longitude": 121.41902537687392,
"latitude": 31.210308153576566
},
"encryptBrandId": "d283b66de3cefd891H1529q5Flc~", // 公司ID
"brandName": "上海大裂谷智能科技", // 公司名称
"brandScaleName": "100-499人", // 公司规模
"brandIndustry": "人工智能", // 公司行业
"brandStageName": "天使轮", // 融资阶段
"bossName": "杨明雨", // Boss姓名
"bossTitle": "HR", // Boss职位
"bossOnline": true, // Boss是否在线
"jobLabels": ["在校/应届", "学历不限"], // 职位标签
"skills": [], // 技能要求
"welfareList": ["带薪年假", "五险一金"], // 福利列表
"proxyJob": 0, // 是否外包0否1是
"industry": 100028 // 行业代码
}
]
}
}
```
### 关键字段说明
1. **投递必需字段**:
- `encryptJobId`: 职位ID投递时必须
- `encryptBossId`: Boss ID投递时必须
- `securityId`: 安全ID投递时必须每次搜索可能不同
2. **位置信息**:
- `gps.longitude``gps.latitude`: 直接使用无需调用位置服务API
- 如果没有gps字段再使用 `cityName + areaDistrict + businessDistrict + brandName` 调用位置服务
3. **薪资解析**:
- `salaryDesc` 格式多样:`"25-50K·19薪"``"20-30K"``"面议"`
- 需要解析出 `salaryMin``salaryMax`(单位:元)
4. **工作年限解析**:
- `jobExperience` 可能为:`"在校/应届"``"3-5年"``"1-3年"`
- 需要解析出 `experienceMin``experienceMax`
## 📊 功能架构
```
用户/系统触发
创建任务 (task_status)
生成指令序列 (task_commands)
执行指令 (通过MQTT发送到设备)
设备执行并返回结果
保存数据到数据库
更新任务和指令状态
```
## 🔧 技术实现
### 一、搜索列表功能完善
#### 1.1 指令参数扩展
**文件**: `api/middleware/job/jobManager.js`
**方法**: `get_job_list()`
**需要支持的参数**:
```javascript
{
keyword: '全栈工程师', // 搜索关键词
city: '101020100', // 城市代码(上海)
cityName: '上海', // 城市名称
salary: '20-30K', // 薪资范围
experience: '3-5年', // 工作经验
education: '本科', // 学历要求
industry: '互联网', // 公司行业
companySize: '100-499人', // 公司规模
financingStage: 'B轮', // 融资阶段
page: 1, // 页码
pageSize: 20, // 每页数量
pageCount: 3 // 获取页数(用于批量获取)
}
```
#### 1.2 任务创建接口
**文件**: `api/services/pla_account_service.js`
**新增方法**: `createSearchJobListTask()`
```javascript
/**
* 创建搜索职位列表任务
* @param {Object} params - 任务参数
* @param {number} params.id - 账号ID
* @param {string} params.keyword - 搜索关键词
* @param {string} params.city - 城市代码
* @param {Object} params.searchParams - 搜索条件(薪资、经验、学历等)
* @param {number} params.pageCount - 获取页数
* @returns {Promise<Object>} 任务创建结果
*/
async createSearchJobListTask(params) {
// 1. 验证账号和授权
// 2. 创建任务记录
// 3. 生成搜索指令
// 4. 执行指令
// 5. 返回任务ID
}
```
#### 1.3 指令生成逻辑
**文件**: `api/middleware/schedule/taskHandlers.js`
**需要完善**: `handleAutoDeliverTask()` 中的搜索指令生成
**当前实现**:
```javascript
const getJobListCommand = {
command_type: 'getJobList',
command_name: '获取职位列表',
command_params: JSON.stringify({
sn_code: sn_code,
keyword: keyword || accountConfig.keyword || '',
platform: platform || 'boss',
pageCount: pageCount || 3
}),
priority: config.getTaskPriority('search_jobs') || 5
};
```
**需要扩展为**:
```javascript
const getJobListCommand = {
command_type: 'get_job_list', // 统一使用下划线命名
command_name: '获取职位列表',
command_params: JSON.stringify({
sn_code: sn_code,
platform: platform || 'boss',
keyword: keyword || accountConfig.keyword || '',
city: city || accountConfig.city || '101020100', // 默认上海
cityName: cityName || accountConfig.cityName || '上海',
salary: searchParams?.salary || '',
experience: searchParams?.experience || '',
education: searchParams?.education || '',
industry: searchParams?.industry || '',
companySize: searchParams?.companySize || '',
financingStage: searchParams?.financingStage || '',
page: 1,
pageSize: 20,
pageCount: pageCount || 3
}),
priority: config.getTaskPriority('get_job_list') || 5,
sequence: 1
};
```
#### 1.4 职位数据保存优化
**文件**: `api/middleware/job/jobManager.js`
**方法**: `saveJobsToDatabase()`
**需要完善**:
- 支持更多字段映射从Boss直聘响应数据
- 优化位置解析逻辑
- 支持职位状态更新(已投递、已查看等)
- 添加职位匹配度计算
### 二、投递功能完善
#### 2.1 单个职位投递
**文件**: `api/middleware/job/jobManager.js`
**方法**: `applyJob()`
**当前状态**: ✅ 已实现基础功能
**需要完善**:
- 支持更多投递参数(期望薪资、求职信等)
- 优化错误处理
- 添加投递前检查(是否已投递、是否满足条件等)
#### 2.2 批量职位投递任务
**文件**: `api/middleware/schedule/taskHandlers.js`
**方法**: `handleAutoDeliverTask()`
**当前状态**: ✅ 已实现基础功能
**需要完善**:
1. **搜索条件完善**
- 支持城市、薪资、经验、学历等筛选条件
- 从账号配置中读取默认搜索条件
- 支持任务参数覆盖账号配置
2. **职位匹配算法优化**
- 完善距离计算(基于经纬度)
- 完善薪资匹配(解析薪资范围字符串)
- 完善工作年限匹配
- 完善学历匹配
- 完善权重评分系统
3. **投递指令生成**
- 为每个匹配的职位生成投递指令
- 支持批量投递(一次任务投递多个职位)
- 添加投递间隔控制(避免频繁投递)
#### 2.3 投递任务创建接口
**文件**: `api/services/pla_account_service.js`
**新增方法**: `createDeliverTask()`
```javascript
/**
* 创建投递任务
* @param {Object} params - 任务参数
* @param {number} params.id - 账号ID
* @param {string} params.keyword - 搜索关键词
* @param {Object} params.searchParams - 搜索条件
* @param {Object} params.filterRules - 过滤规则
* @param {number} params.maxCount - 最大投递数量
* @returns {Promise<Object>} 任务创建结果
*/
async createDeliverTask(params) {
// 1. 验证账号和授权
// 2. 创建任务记录
// 3. 生成搜索指令(获取职位列表)
// 4. 生成投递指令序列(根据匹配结果)
// 5. 执行任务
// 6. 返回任务ID
}
```
## 📝 具体开发任务
### 任务1: 完善搜索参数支持
**文件**: `api/middleware/job/jobManager.js`
**修改方法**: `get_job_list()`
**任务内容**:
1. 扩展参数支持(城市、薪资、经验、学历等)
2. 构建完整的搜索参数对象
3. 传递给MQTT指令
**代码位置**: 第153-206行
**预计工作量**: 2小时
---
### 任务2: 优化职位数据保存
**文件**: `api/middleware/job/jobManager.js`
**修改方法**: `saveJobsToDatabase()`
**任务内容**:
1. 完善字段映射从Boss直聘响应数据提取更多字段
2. 优化位置解析优先使用响应中的gps字段减少API调用
3. 解析薪资范围从salaryDesc提取min/max
4. 解析工作年限从jobExperience提取min/max
5. 添加职位状态管理
6. 添加职位匹配度字段
**Boss直聘响应数据字段映射表**:
| 响应字段 | 数据库字段 | 说明 | 示例值 |
|---------|-----------|------|--------|
| `encryptJobId` | `jobId` | 职位ID加密 | "5ae70dfe114c23ab0nR-2ti-FFpU" |
| `jobName` | `jobTitle` | 职位名称 | "全栈软件工程师" |
| `encryptBrandId` | `companyId` | 公司ID加密 | "d283b66de3cefd891H1529q5Flc~" |
| `brandName` | `companyName` | 公司名称 | "上海大裂谷智能科技" |
| `brandScaleName` | `companySize` | 公司规模 | "100-499人" |
| `brandIndustry` | `companyIndustry` | 公司行业 | "人工智能" |
| `brandStageName` | `brandStage` | 融资阶段 | "天使轮" |
| `salaryDesc` | `salary` | 薪资描述 | "25-50K·19薪" |
| `salaryDesc` | `salaryMin`, `salaryMax` | 薪资范围(需解析) | 25000, 50000 |
| `jobExperience` | `experience` | 工作经验 | "在校/应届" |
| `jobExperience` | `experienceMin`, `experienceMax` | 工作年限范围(需解析) | - |
| `jobDegree` | `education` | 学历要求 | "学历不限" |
| `jobDegree` | `educationLevel` | 学历等级(需映射) | - |
| `city` | `city` | 城市代码 | 101020100 |
| `cityName` | `cityName` | 城市名称 | "上海" |
| `areaDistrict` | `areaDistrict` | 区域 | "长宁区" |
| `businessDistrict` | `businessDistrict` | 商圈 | "新华路" |
| `gps.longitude` | `longitude` | 经度(优先使用) | 121.41902537687392 |
| `gps.latitude` | `latitude` | 纬度(优先使用) | 31.210308153576566 |
| `encryptBossId` | `encryptBossId` | Boss ID投递需要 | "b55854108ac215180XZ62N-_FlNT" |
| `securityId` | `securityId` | 安全ID投递需要 | "HP23zbQfaslvy-c1..." |
| `bossName` | `bossName` | Boss姓名 | "杨明雨" |
| `bossTitle` | `bossTitle` | Boss职位 | "HR" |
| `bossOnline` | `bossOnline` | Boss是否在线 | true |
| `jobLabels` | `jobLabels` | 职位标签JSON | ["在校/应届", "学历不限"] |
| `skills` | `skills` | 技能要求JSON | ["Java", "MySQL"] |
| `welfareList` | `welfareList` | 福利列表JSON | ["带薪年假", "五险一金"] |
| `proxyJob` | `isOutsourcing` | 是否外包 | 0/1 |
| `industry` | `industry` | 行业代码 | 100028 |
**关键优化点**:
1. **位置信息**: 优先使用响应中的 `gps.longitude``gps.latitude`避免调用位置服务API
- 如果 `gps` 字段存在,直接使用
- 如果不存在,再使用 `cityName + areaDistrict + businessDistrict + brandName` 调用位置服务
2. **薪资解析**: 从 `salaryDesc` 解析薪资范围
- 格式示例:`"25-50K·19薪"` → min: 25000, max: 50000
- 格式示例:`"20-30K"` → min: 20000, max: 30000
- 格式示例:`"面议"` → min: 0, max: 0
- 格式示例:`"15K以上"` → min: 15000, max: 999999
- 需要处理K、W、薪年终奖倍数
3. **工作年限解析**: 从 `jobExperience` 解析年限范围
- `"在校/应届"` → min: 0, max: 0
- `"1-3年"` → min: 1, max: 3
- `"3-5年"` → min: 3, max: 5
- `"5-10年"` → min: 5, max: 10
- `"10年以上"` → min: 10, max: 99
4. **学历映射**: 将学历描述映射为等级
- `"学历不限"``"unlimited"`
- `"高中"``"high_school"`
- `"大专"``"college"`
- `"本科"``"bachelor"`
- `"硕士"``"master"`
- `"博士"``"doctor"`
5. **投递必需字段**: 确保保存 `encryptJobId``encryptBossId``securityId`
- 这些字段在投递时必须使用
- `securityId` 每次搜索可能不同,需要实时保存
**代码位置**: 第215-308行
**预计工作量**: 4小时增加字段解析逻辑
---
### 任务3: 完善自动投递任务搜索条件
**文件**: `api/middleware/schedule/taskHandlers.js`
**修改方法**: `handleAutoDeliverTask()`
**任务内容**:
1. 从账号配置读取默认搜索条件
2. 支持任务参数覆盖
3. 构建完整的搜索参数
4. 传递给搜索指令
**代码位置**: 第220-233行
**预计工作量**: 2小时
---
### 任务4: 优化职位匹配算法
**文件**: `api/middleware/schedule/taskHandlers.js`
**修改方法**: `handleAutoDeliverTask()`
**任务内容**:
1. 完善距离计算(使用经纬度计算实际距离)
2. 完善薪资匹配(解析"20-30K"格式,转换为数值范围)
3. 完善工作年限匹配(解析"3-5年"格式)
4. 完善学历匹配(学历等级映射)
5. 优化权重评分计算
**代码位置**: 第255-400行职位评分和过滤逻辑
**预计工作量**: 4小时
---
### 任务5: 创建搜索任务接口(支持可选投递)
**文件**: `api/services/pla_account_service.js`
**新增方法**: `createSearchJobListTask()`
**方法签名**:
```javascript
/**
* 创建搜索职位列表任务(支持可选投递)
* @param {Object} params - 任务参数
* @param {number} params.id - 账号ID
* @param {string} params.keyword - 搜索关键词
* @param {Object} params.searchParams - 搜索条件(城市、薪资、经验、学历等)
* @param {number} params.pageCount - 获取页数
* @param {boolean} params.autoDeliver - 是否自动投递默认false
* @param {Object} params.filterRules - 过滤规则autoDeliver=true时使用
* @param {number} params.maxCount - 最大投递数量autoDeliver=true时使用
* @returns {Promise<Object>} 任务创建结果 { taskId, message, jobCount, deliveredCount }
*/
async createSearchJobListTask(params) {
// 1. 验证账号和授权
// 2. 创建任务记录 (taskType: 'search_jobs' 或 'auto_deliver')
// 3. 生成搜索指令
// 4. 执行搜索指令
// 5. 等待搜索完成(职位会自动保存到数据库)
// 6. 如果 autoDeliver=true:
// - 从数据库获取刚搜索到的职位列表
// - 根据简历信息和过滤规则匹配职位
// - 生成投递指令序列
// - 执行投递指令(带间隔控制)
// - 保存投递记录
// - 更新职位状态
// 7. 返回任务信息
}
```
**任务内容**:
1. 验证账号和授权
2. 创建任务记录根据autoDeliver参数设置taskType: 'search_jobs' 或 'auto_deliver'
3. 生成搜索指令command_type: 'get_job_list'
4. 执行搜索指令通过MQTT发送到设备
5. 等待搜索完成(职位会自动保存到数据库)
6. 如果 `autoDeliver=true`,继续执行投递流程:
- 从数据库获取刚搜索到的职位列表applyStatus = 'pending'
- 根据简历信息和过滤规则匹配职位(距离、薪资、工作年限、学历等)
- 为每个匹配的职位生成投递指令command_type: 'apply_job'
- 批量执行投递指令(带间隔控制,避免频繁投递)
- 保存投递记录 (apply_records)
- 更新职位状态 (job_postings.applyStatus = 'applied')
7. 返回任务信息(包含搜索到的职位数量和投递数量)
**代码位置**: 在 `runCommand()` 方法后添加
**预计工作量**: 5小时增加投递逻辑
---
---
### 任务6: 完善指令类型映射
**文件**: `api/middleware/schedule/command.js`
**修改位置**: 指令执行逻辑
**任务内容**:
1. 确保 `get_job_list` 指令类型正确映射到 `jobManager.get_job_list()`
2. 确保 `search_jobs` 指令类型正确映射到 `jobManager.search_jobs()`
3. 确保 `apply_job` 指令类型正确映射到 `jobManager.applyJob()`
**代码位置**: 第150-250行指令执行逻辑
**预计工作量**: 1小时
---
### 任务7: 添加搜索条件配置管理
**文件**: `api/model/pla_account.js`
**任务内容**:
1. 添加搜索条件配置字段(如果不存在)
2. 支持在账号配置中保存默认搜索条件
3. 支持在任务参数中覆盖搜索条件
**相关字段**:
- `search_config` (JSON): 搜索条件配置
```json
{
"city": "101020100",
"cityName": "上海",
"defaultSalary": "20-30K",
"defaultExperience": "3-5年",
"defaultEducation": "本科"
}
```
**预计工作量**: 1小时
---
## 🔄 工作流程
### 搜索职位列表流程(支持可选投递)
```
1. 用户/系统调用 createSearchJobListTask()
- 参数: { id, keyword, searchParams, pageCount, autoDeliver: true/false, filterRules, maxCount }
2. 创建任务记录 (task_status)
- taskType: 'search_jobs' 或 'auto_deliver'根据autoDeliver参数
3. 生成搜索指令 (task_commands)
- command_type: 'get_job_list'
- command_params: { keyword, city, salary, experience, education, ... }
4. 执行指令 (通过MQTT发送到设备)
5. 设备执行搜索并返回职位列表
6. 保存职位到数据库 (job_postings)
- 去重处理
- 位置解析优先使用gps字段
- 字段映射
- 状态: applyStatus = 'pending'(待投递)
7. 更新搜索指令状态为完成
8. 如果 autoDeliver=true继续执行投递流程:
8.1 从数据库获取刚搜索到的职位列表
- 筛选条件: applyStatus = 'pending', sn_code = 账号SN码
8.2 根据简历信息和过滤规则匹配职位
- 距离匹配(基于经纬度)
- 薪资匹配解析salaryDesc
- 工作年限匹配解析jobExperience
- 学历匹配解析jobDegree
- 权重评分
8.3 为每个匹配的职位生成投递指令
- command_type: 'apply_job'
- command_params: {
jobId: job.encryptJobId, // 职位ID必需
encryptBossId: job.encryptBossId, // Boss ID必需
securityId: job.securityId, // 安全ID必需从最新搜索结果获取
brandName: job.brandName, // 公司名称(可选)
jobTitle: job.jobName // 职位名称(可选)
}
8.4 批量执行投递指令(带间隔控制,避免频繁投递)
8.5 保存投递记录 (apply_records)
8.6 更新职位状态 (job_postings.applyStatus = 'applied')
9. 更新任务状态为完成
10. 返回任务信息(包含搜索到的职位数量和投递数量)
```
**说明**:
- 此接口支持两种模式:
- `autoDeliver=false`: 仅搜索,不投递。职位保存到数据库,状态为'pending'
- `autoDeliver=true`: 搜索完成后立即投递匹配的职位
- **重要**: 投递必须在搜索完成后立即执行,因为 `securityId` 等字段可能有时效性,前端页面变化后这些字段可能失效
- 不支持从已保存的职位中选择投递,因为职位信息可能已过期
## 📊 数据库字段说明
### job_postings 表需要完善的字段
| 字段名 | 类型 | 说明 | 状态 | 数据来源 |
|--------|------|------|------|----------|
| `city` | VARCHAR | 城市代码 | 待添加 | `job.city` |
| `cityName` | VARCHAR | 城市名称 | 待添加 | `job.cityName` |
| `areaDistrict` | VARCHAR | 区域 | 待添加 | `job.areaDistrict` |
| `businessDistrict` | VARCHAR | 商圈 | 待添加 | `job.businessDistrict` |
| `salaryMin` | INT | 最低薪资(元) | 待添加 | 从 `salaryDesc` 解析 |
| `salaryMax` | INT | 最高薪资(元) | 待添加 | 从 `salaryDesc` 解析 |
| `experienceMin` | INT | 最低工作年限 | 待添加 | 从 `jobExperience` 解析 |
| `experienceMax` | INT | 最高工作年限 | 待添加 | 从 `jobExperience` 解析 |
| `educationLevel` | VARCHAR | 学历等级 | 待添加 | 从 `jobDegree` 映射 |
| `matchScore` | DECIMAL | 匹配度评分 | 待添加 | 计算得出 |
| `encryptBossId` | VARCHAR | Boss ID | 已有 | `job.encryptBossId` |
| `securityId` | VARCHAR | 安全ID | 待添加 | `job.securityId`(投递必需) |
| `bossName` | VARCHAR | Boss姓名 | 待添加 | `job.bossName` |
| `bossTitle` | VARCHAR | Boss职位 | 待添加 | `job.bossTitle` |
| `bossOnline` | TINYINT | Boss是否在线 | 待添加 | `job.bossOnline` |
| `brandStage` | VARCHAR | 融资阶段 | 待添加 | `job.brandStageName` |
| `jobLabels` | JSON | 职位标签 | 待添加 | `job.jobLabels` |
| `skills` | JSON | 技能要求 | 待添加 | `job.skills` |
| `welfareList` | JSON | 福利列表 | 待添加 | `job.welfareList` |
| `isOutsourcing` | TINYINT | 是否外包 | 待添加 | `job.proxyJob` |
| `industry` | INT | 行业代码 | 待添加 | `job.industry` |
### pla_account 表需要添加的字段
| 字段名 | 类型 | 说明 | 状态 |
|--------|------|------|------|
| `search_config` | JSON | 搜索条件配置 | 待添加 |
| `city` | VARCHAR | 默认城市代码 | 待添加 |
| `cityName` | VARCHAR | 默认城市名称 | 待添加 |
## 🧪 测试计划
### 单元测试
1. 测试搜索参数构建
2. 测试职位数据保存
3. 测试职位匹配算法
4. 测试投递指令生成
### 集成测试
1. 测试完整搜索流程
2. 测试完整投递流程
3. 测试任务创建和执行
4. 测试MQTT通信
### 功能测试
1. 测试多条件搜索
2. 测试分页获取
3. 测试批量投递
4. 测试错误处理
## 📅 开发时间估算
| 任务 | 预计时间 | 优先级 |
|------|----------|--------|
| 任务1: 完善搜索参数支持 | 2小时 | 高 |
| 任务2: 优化职位数据保存 | 4小时 | 高 |
| 任务3: 完善自动投递任务搜索条件 | 2小时 | 高 |
| 任务4: 优化职位匹配算法 | 4小时 | 高 |
| 任务5: 创建搜索任务接口(支持可选投递) | 5小时 | 高 |
| 任务6: 完善指令类型映射 | 1小时 | 中 |
| 任务7: 添加搜索条件配置管理 | 1小时 | 低 |
**总计**: 约19小时
## 🚀 开发优先级
### 第一阶段(核心功能)
1. 任务1: 完善搜索参数支持
2. 任务2: 优化职位数据保存
3. 任务3: 完善自动投递任务搜索条件
4. 任务4: 优化职位匹配算法
5. 任务5: 创建搜索任务接口(支持可选投递)
### 第二阶段(接口完善)
6. 任务6: 完善指令类型映射
### 第三阶段(配置管理)
7. 任务7: 添加搜索条件配置管理
## 💡 使用场景说明
### 场景1: 仅搜索职位列表
```javascript
// 只搜索职位,不投递
const result = await plaAccountService.createSearchJobListTask({
id: accountId,
keyword: '全栈工程师',
searchParams: {
city: '101020100',
cityName: '上海',
salary: '20-30K',
experience: '3-5年',
education: '本科'
},
pageCount: 3,
autoDeliver: false // 不自动投递
});
// 返回: { taskId: 123, message: '搜索任务已创建', jobCount: 45 }
// 职位会自动保存到数据库,状态为 'pending'(待投递)
```
### 场景2: 搜索并自动投递(推荐)
```javascript
// 搜索职位并自动投递匹配的职位
const result = await plaAccountService.createSearchJobListTask({
id: accountId,
keyword: '全栈工程师',
searchParams: {
city: '101020100',
cityName: '上海',
salary: '20-30K',
experience: '3-5年',
education: '本科'
},
pageCount: 3,
autoDeliver: true, // 自动投递
filterRules: {
minSalary: 20000,
maxSalary: 30000,
keywords: ['Vue', 'React'],
excludeKeywords: ['外包', '外派']
},
maxCount: 10 // 最多投递10个职位
});
// 返回: { taskId: 123, message: '搜索并投递任务已创建', jobCount: 45, deliveredCount: 8 }
```
**重要说明**:
- **投递必须在搜索完成后立即执行**,因为 `securityId` 等字段可能有时效性
- 前端页面变化后,已保存的职位信息中的 `securityId` 可能失效,无法用于投递
- 因此不支持从已保存的职位中选择投递,必须在搜索后立即投递
- 如果只需要搜索不投递,设置 `autoDeliver: false`
- 如果需要搜索并投递,设置 `autoDeliver: true`,系统会根据匹配规则自动投递
## 📌 注意事项
1. **命名规范**: 统一使用下划线命名(`get_job_list` 而不是 `getJobList`
2. **错误处理**: 所有方法都需要完善的错误处理和日志记录
3. **数据验证**: 所有输入参数都需要验证
4. **性能优化**: 批量操作需要考虑性能,避免阻塞
5. **MQTT通信**: 确保指令参数格式正确,与客户端协议一致
6. **数据库事务**: 批量操作需要使用事务保证数据一致性
7. **投递时机**: 投递必须在搜索完成后立即执行,因为 `securityId` 等字段可能有时效性,前端页面变化后这些字段可能失效
8. **职位状态验证**: 投递前必须验证职位状态applyStatus = 'pending'),避免重复投递
9. **投递必需字段**: 投递时需要 `encryptJobId`、`encryptBossId` 和 `securityId`,这些字段必须从最新搜索结果中获取
10. **位置信息**: 优先使用响应中的 `gps` 字段避免不必要的API调用
11. **接口设计**: 搜索和投递在同一接口中完成,不支持单独的投递接口,因为已保存的职位信息可能已过期
## 🔗 相关文件
- `api/middleware/job/jobManager.js` - 工作管理核心逻辑
- `api/middleware/schedule/taskHandlers.js` - 任务处理器
- `api/middleware/schedule/command.js` - 指令管理器
- `api/services/pla_account_service.js` - 账号服务
- `api/model/job_postings.js` - 职位数据模型
- `api/model/pla_account.js` - 账号数据模型

View File

@@ -1,210 +0,0 @@
# resume_info 表同步指南
## ❌ 错误信息
```
Unknown column 'sn_code' in 'field list'
```
这个错误表示数据库中的 `resume_info` 表缺少 `sn_code` 字段。
## 🔧 解决方案
### 方案1: 使用同步脚本(推荐)
运行以下命令同步表结构:
```bash
node scripts/sync_resume_table.js
```
这个脚本会:
- ✅ 使用 `alter: true` 模式同步表(保留现有数据)
- ✅ 显示当前表结构
- ✅ 检查所有必需字段是否存在
- ✅ 提示缺少的字段
### 方案2: 手动添加字段
如果同步脚本无法运行可以手动执行以下SQL
```sql
-- 添加 sn_code 字段
ALTER TABLE `resume_info`
ADD COLUMN `sn_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '设备SN码' AFTER `id`;
-- 添加 account_id 字段
ALTER TABLE `resume_info`
ADD COLUMN `account_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户ID' AFTER `sn_code`;
-- 添加索引
ALTER TABLE `resume_info`
ADD INDEX `idx_sn_code` (`sn_code`);
```
### 方案3: 重建表(会删除现有数据!)
⚠️ **警告:此操作会删除表中所有数据!**
如果表中没有重要数据,可以删除表让系统重新创建:
```sql
DROP TABLE IF EXISTS `resume_info`;
```
然后重启应用Sequelize 会自动创建表(因为模型中有 `sync({ force: true })`)。
## 📋 必需字段列表
`resume_info` 表必须包含以下字段:
### 核心字段
-`id` - 主键VARCHAR/UUID
-`sn_code` - 设备SN码VARCHAR(50),必填)
-`account_id` - 用户IDVARCHAR(50),必填)
-`platform` - 平台VARCHAR(20),默认'boss'
### 个人信息
-`fullName` - 姓名
-`gender` - 性别
-`age` - 年龄
-`phone` - 电话
-`email` - 邮箱
-`location` - 所在地
### 教育背景
-`education` - 学历
-`major` - 专业
-`school` - 毕业院校
-`graduationYear` - 毕业年份
### 工作信息
-`workYears` - 工作年限
-`currentPosition` - 当前职位
-`currentCompany` - 当前公司
-`currentSalary` - 当前薪资
### 期望信息
-`expectedPosition` - 期望职位
-`expectedSalary` - 期望薪资
-`expectedLocation` - 期望地点
-`expectedIndustry` - 期望行业
### 技能和经验TEXT类型
-`skills` - 技能标签JSON
-`skillDescription` - 技能描述
-`certifications` - 证书资质JSON
-`projectExperience` - 项目经验JSON
-`workExperience` - 工作经历JSON
### AI分析字段TEXT类型
-`aiSkillTags` - AI技能标签JSON
-`aiStrengths` - AI优势分析
-`aiWeaknesses` - AI劣势分析
-`aiCareerSuggestion` - AI职业建议
-`aiCompetitiveness` - AI竞争力评分INT
### 其他字段
-`resumeContent` - 简历内容TEXT
-`originalData` - 原始数据TEXT/JSON
-`isActive` - 是否活跃BOOLEAN
-`isPublic` - 是否公开BOOLEAN
-`syncTime` - 同步时间DATETIME
## 🔍 验证表结构
运行以下SQL查看表结构
```sql
DESCRIBE resume_info;
```
或者查看完整的建表语句:
```sql
SHOW CREATE TABLE resume_info;
```
## 📝 完整建表SQL参考
```sql
CREATE TABLE `resume_info` (
`id` varchar(255) NOT NULL,
`sn_code` varchar(50) NOT NULL DEFAULT '' COMMENT '设备SN码',
`account_id` varchar(50) NOT NULL DEFAULT '' COMMENT '用户ID',
`platform` varchar(20) NOT NULL DEFAULT 'boss' COMMENT '平台',
`fullName` varchar(50) DEFAULT '' COMMENT '姓名',
`gender` varchar(10) DEFAULT '' COMMENT '性别',
`age` int(11) DEFAULT 0 COMMENT '年龄',
`phone` varchar(20) DEFAULT '' COMMENT '电话',
`email` varchar(100) DEFAULT '' COMMENT '邮箱',
`location` varchar(100) DEFAULT '' COMMENT '所在地',
`education` varchar(50) DEFAULT '' COMMENT '学历',
`major` varchar(100) DEFAULT '' COMMENT '专业',
`school` varchar(200) DEFAULT '' COMMENT '毕业院校',
`graduationYear` int(11) DEFAULT 0 COMMENT '毕业年份',
`workYears` varchar(50) DEFAULT '' COMMENT '工作年限',
`currentPosition` varchar(100) DEFAULT '' COMMENT '当前职位',
`currentCompany` varchar(200) DEFAULT '' COMMENT '当前公司',
`currentSalary` varchar(50) DEFAULT '' COMMENT '当前薪资',
`expectedPosition` varchar(100) DEFAULT '' COMMENT '期望职位',
`expectedSalary` varchar(50) DEFAULT '' COMMENT '期望薪资',
`expectedLocation` varchar(100) DEFAULT '' COMMENT '期望地点',
`expectedIndustry` varchar(100) DEFAULT '' COMMENT '期望行业',
`skills` text COMMENT '技能标签(JSON)',
`skillDescription` text COMMENT '技能描述',
`certifications` text COMMENT '证书资质(JSON)',
`projectExperience` text COMMENT '项目经验(JSON)',
`workExperience` text COMMENT '工作经历(JSON)',
`aiSkillTags` text COMMENT 'AI技能标签(JSON)',
`aiStrengths` text COMMENT 'AI优势分析',
`aiWeaknesses` text COMMENT 'AI劣势分析',
`aiCareerSuggestion` text COMMENT 'AI职业建议',
`aiCompetitiveness` int(11) DEFAULT 0 COMMENT 'AI竞争力评分',
`resumeContent` text COMMENT '简历内容',
`originalData` text COMMENT '原始数据(JSON)',
`isActive` tinyint(1) DEFAULT 1 COMMENT '是否活跃',
`isPublic` tinyint(1) DEFAULT 1 COMMENT '是否公开',
`syncTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '同步时间',
PRIMARY KEY (`id`),
KEY `idx_sn_code` (`sn_code`),
KEY `idx_platform` (`platform`),
KEY `idx_isActive` (`isActive`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='简历信息表';
```
## ✅ 验证修复
修复后,运行以下代码验证:
```javascript
const db = require('./api/middleware/dbProxy');
const resume_info = db.getModel('resume_info');
// 测试创建记录
const testResume = await resume_info.create({
id: 'test-uuid-123',
sn_code: 'TEST001',
account_id: 'user123',
platform: 'boss',
fullName: '测试用户',
isActive: true
});
console.log('✅ 创建成功:', testResume.id);
```
## 🚀 下一步
表结构同步完成后,就可以正常使用简历存储功能了:
```javascript
const jobManager = require('./api/middleware/job/jobManager');
const resumeData = await jobManager.get_online_resume(
'GHJU',
mqttClient,
{ platform: 'boss' }
);
```

View File

@@ -1,57 +0,0 @@
# 文件清理总结
## ✅ 已删除的文件
### 1. 废弃的服务文件
-`api/services/task_scheduler.js`
- **删除原因**:未使用,实际系统使用 `middleware/schedule/` 中的调度系统
- **替代方案**:使用 `middleware/schedule/index.js` 中的 `ScheduleManager`
### 2. 已合并的服务文件
-`api/services/job_service.js`
- **删除原因**:只有一个方法,已合并到 `middleware/job/jobManager.js`
- **新位置**`middleware/job/jobManager.js``job_greet()` 方法
### 3. 重命名的文件
-`api/services/ossTool.js``api/services/oss_tool_service.js`
- **原因**:统一命名规范
## 🔧 已清理的引用
### services/index.js
- ✅ 移除了对 `TaskScheduler` 的引用(已删除)
- ✅ 移除了对 `MQTTHandler` 的引用(文件不存在)
- ✅ 移除了对 `JobService` 的引用(已合并)
- ✅ 移除了相关的初始化代码和监听器设置
- ✅ 保留了 `AIService``PlaAccountService` 的引用
## 📋 当前 services/ 目录结构
```
api/services/
├── index.js # 服务管理器(已清理)
├── ai_service.js # AI服务
├── pla_account_service.js # 账号服务
└── oss_tool_service.js # OSS服务已重命名
```
## ⚠️ 注意事项
1. **调度系统**
- 实际使用:`middleware/schedule/index.js` (ScheduleManager)
- 不要使用:`services/task_scheduler.js`(已删除)
2. **MQTT管理**
- 实际使用:`middleware/mqtt/mqttManager.js`
- 不要使用:`services/mqtt_handler.js`(文件不存在)
3. **工作管理**
- 实际使用:`middleware/job/jobManager.js`
- 包含 `job_greet` 方法(原 `job_service.js` 的方法)
## 🎯 清理效果
- **减少文件数量**删除了2个不需要的文件
- **代码更清晰**:移除了无效引用
- **结构更合理**services 目录只保留实际使用的服务

View File

@@ -1,54 +0,0 @@
# 服务合并完成说明
## ✅ 已完成
### 1. job_service.js 合并
- ✅ 将 `job_service.js``jobGreet` 方法合并到 `jobManager.js`
- ✅ 方法重命名为 `job_greet`(统一使用下划线命名)
- ✅ 更新了 `api/controller_admin/job_postings.js` 中的引用
- ✅ 更新了 `api/services/index.js`,移除了 `JobService` 的引用
- ✅ 删除了 `job_service.js` 文件
### 2. 方法改进
-`job_greet` 方法支持可选的 `mqttClient` 参数
- ✅ 修复了 `getResumeAnalysis` 方法的 `mqttClient` 参数问题
## 📝 变更详情
### 方法位置变更
- **原位置**`api/services/job_service.js``JobService.jobGreet()`
- **新位置**`api/middleware/job/jobManager.js``JobManager.job_greet()`
### 方法签名变更
```javascript
// 旧方法
async jobGreet(params) {
// ...
}
// 新方法
async job_greet(params) {
const { sn_code, encryptJobId, securityId, brandName, platform = 'boss', mqttClient } = params;
// 支持可选的 mqttClient 参数
// ...
}
```
### 引用更新
- `api/controller_admin/job_postings.js`
- `jobService.jobGreet()``jobManager.job_greet()`
## 🎯 优势
1. **代码更集中**:所有工作管理相关的方法都在 `jobManager.js`
2. **减少文件数量**:删除了只有一个方法的服务文件
3. **命名统一**:使用下划线命名 `job_greet`,与其他方法一致
4. **更好的复用性**:支持可选的 `mqttClient` 参数
## 📋 后续工作
继续完成命名规范统一:
- 移动并重命名 `middleware/job/` 下的文件到 `services/`
- 合并AI服务
- 统一类命名

View File

@@ -1,320 +0,0 @@
# 服务端升级功能逻辑说明
## 概述
本文档说明服务端需要实现的升级功能逻辑,配合客户端的自动升级功能。
## API 接口要求
### GET /version/check
**功能**:检查是否有新版本可用
**请求参数**Query 参数):
- `current_version`: 当前版本号x.y.z 格式,如 "1.0.0"
- `platform`: 平台类型(如 "win32", "darwin", "linux"
- `arch`: 架构类型(如 "x64", "ia32", "arm64"
- `sn_code`: 设备序列号(可选,用于权限控制)
**响应格式**
```json
{
"code": 0,
"message": "success",
"data": {
"version": "1.1.0",
"download_url": "http://work.light120.com/downloads/app-1.1.0.exe",
"release_notes": "修复了一些bug新增了xxx功能",
"force_update": false,
"file_size": 52428800,
"file_hash": "abc123def456..."
}
}
```
**字段说明**
- `version`: 最新版本号x.y.z 格式)
- `download_url`: 更新包下载地址(完整的 HTTP/HTTPS URL
- `release_notes`: 更新日志(可选,字符串)
- `force_update`: 是否强制更新(可选,布尔值,默认 false
- `file_size`: 文件大小(字节,可选)
- `file_hash`: 文件 SHA256 哈希值(可选,用于校验文件完整性)
**业务逻辑**
1. **版本比较**
- 从数据库查询最新版本信息(根据 platform 和 arch
- 比较请求中的 `current_version` 与数据库中的最新版本
- 如果最新版本 > 当前版本,返回更新信息
- 如果版本相同或更旧,返回 `code: 0, data: null` 或提示"已是最新版本"
2. **版本号格式**
- 格式x.y.z如 1.0.0, 1.1.0, 2.0.0
- 比较规则:主版本号 > 次版本号 > 修订号
- 示例1.1.0 > 1.0.0, 2.0.0 > 1.9.9
3. **平台和架构过滤**
- 只返回匹配 platform 和 arch 的版本信息
- 如果某个平台没有新版本,返回空结果
4. **序列号验证**(可选):
- 可以根据 sn_code 验证设备权限
- 如果启用权限控制,未授权的设备返回错误
5. **错误处理**
- 参数缺失:返回 `code: 400, message: "参数错误"`
- 服务器错误:返回 `code: 500, message: "服务器错误"`
- 无新版本:返回 `code: 0, data: null``has_update: false`
## 数据库设计建议
### 版本信息表version_info
| 字段名 | 类型 | 说明 | 约束 |
|--------|------|------|------|
| id | INT/BIGINT | 主键 | PRIMARY KEY, AUTO_INCREMENT |
| version | VARCHAR(20) | 版本号x.y.z 格式) | NOT NULL, UNIQUE |
| platform | VARCHAR(20) | 平台类型win32/darwin/linux | NOT NULL |
| arch | VARCHAR(20) | 架构类型x64/ia32/arm64 | NOT NULL |
| download_url | VARCHAR(500) | 下载地址 | NOT NULL |
| file_path | VARCHAR(500) | 服务器文件路径 | NOT NULL |
| file_size | BIGINT | 文件大小(字节) | DEFAULT 0 |
| file_hash | VARCHAR(64) | SHA256 哈希值 | |
| release_notes | TEXT | 更新日志 | |
| force_update | TINYINT(1) | 是否强制更新 | DEFAULT 0 |
| status | TINYINT(1) | 状态1:启用 0:禁用) | DEFAULT 1 |
| create_time | DATETIME | 创建时间 | NOT NULL, DEFAULT CURRENT_TIMESTAMP |
| last_modify_time | DATETIME | 最后修改时间 | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
**索引建议**
- PRIMARY KEY (id)
- UNIQUE KEY (version, platform, arch)
- INDEX (platform, arch, status)
### 版本发布历史表version_history可选
用于记录版本发布历史,便于管理:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | INT/BIGINT | 主键 |
| version_id | INT | 关联 version_info.id |
| release_type | VARCHAR(20) | 发布类型stable/beta/alpha |
| create_time | DATETIME | 发布时间 |
| last_modify_time | DATETIME | 最后修改时间 |
## 业务逻辑流程
### 1. 版本检查流程
```
客户端请求
接收参数current_version, platform, arch, sn_code
验证参数有效性
查询数据库最新版本(按 platform + arch + status=1
版本号比较
有更新?
├─ 是 → 构建返回数据(包含文件信息)
└─ 否 → 返回空结果或提示"已是最新版本"
返回响应
```
### 2. 版本管理流程
**新增版本**
1. 上传安装包文件到服务器指定目录
2. 计算文件 SHA256 哈希值
3. 获取文件大小
4. 插入数据库记录status=1 表示启用)
**禁用版本**
1. 更新 status=0不删除记录保留历史
**删除版本**
1. 删除数据库记录
2. 删除服务器上的文件
### 3. 文件存储建议
**目录结构**
```
/uploads/
└── versions/
├── win32/
│ ├── x64/
│ │ ├── app-1.0.0.exe
│ │ └── app-1.1.0.exe
│ └── ia32/
└── darwin/
└── x64/
└── app-1.1.0.dmg
```
**文件命名规则**
- 格式:`app-{version}.{ext}`
- 示例:`app-1.1.0.exe`, `app-1.1.0.dmg`
**下载 URL 生成**
- 基础 URL`http://work.light120.com/downloads/`
- 完整 URL`http://work.light120.com/downloads/app-1.1.0.exe`
## 关键逻辑说明
### 1. 版本号比较逻辑
**字符串比较规则**
- 将版本号按 "." 分割成数组:["1", "1", "0"]
- 逐位比较数字大小
- 主版本号优先级最高,依次递减
**示例**
```javascript
// 伪代码
compareVersion("1.1.0", "1.0.0") true // 1.1.0 > 1.0.0
compareVersion("2.0.0", "1.9.9") true // 2.0.0 > 1.9.9
compareVersion("1.0.0", "1.0.0") false // 相等
```
### 2. 文件哈希计算
**计算方法**
- 使用 SHA256 算法
- 读取文件内容,计算哈希值
- 返回小写的十六进制字符串
**用途**
- 客户端下载后校验文件完整性
- 防止文件被篡改
- 确保文件下载完整
### 3. 强制更新逻辑
**force_update 字段**
- `true`: 强制更新,客户端必须更新才能使用
- `false`: 可选更新,客户端可以选择稍后更新
**业务场景**
- 安全漏洞修复 → 强制更新
- 重大功能更新 → 强制更新
- 小版本更新 → 可选更新
### 4. 平台和架构支持
**支持列表**
- Windows: `win32` + `x64` / `ia32`
- macOS: `darwin` + `x64` / `arm64`
- Linux: `linux` + `x64` / `arm64`
**查询逻辑**
- 必须同时匹配 platform 和 arch
- 如果某个组合没有版本,返回空结果
## 安全考虑
### 1. 文件下载安全
- **HTTPS 下载**:优先使用 HTTPS 协议
- **文件校验**:提供 SHA256 哈希值供客户端校验
- **文件大小验证**:返回文件大小,客户端可以验证下载完整性
### 2. 权限控制
- **序列号验证**:可以根据 sn_code 控制哪些设备可以更新
- **版本状态**:使用 status 字段控制版本是否可用
- **IP 限制**:可以限制下载 IP 范围(可选)
### 3. 防止恶意更新
- **文件类型验证**:只允许上传 .exe、.dmg、.AppImage 等安装包
- **文件大小限制**:设置最大文件大小限制
- **版本号验证**:验证版本号格式是否正确
## 返回状态码说明
| code | 说明 | 处理方式 |
|------|------|----------|
| 0 | 成功 | 检查 data 是否为空判断是否有更新 |
| 400 | 参数错误 | 客户端提示参数错误 |
| 401 | 未授权 | 客户端提示未授权 |
| 404 | 未找到版本 | 客户端提示版本不存在 |
| 500 | 服务器错误 | 客户端提示服务器错误,稍后重试 |
## 示例场景
### 场景1有新版本
**请求**
```
GET /version/check?current_version=1.0.0&platform=win32&arch=x64&sn_code=GHJU
```
**响应**
```json
{
"code": 0,
"message": "success",
"data": {
"version": "1.1.0",
"download_url": "http://work.light120.com/downloads/app-1.1.0.exe",
"release_notes": "1. 修复了登录问题\n2. 新增自动升级功能",
"force_update": false,
"file_size": 52428800,
"file_hash": "a1b2c3d4e5f6..."
}
}
```
### 场景2已是最新版本
**请求**
```
GET /version/check?current_version=1.1.0&platform=win32&arch=x64&sn_code=GHJU
```
**响应**
```json
{
"code": 0,
"message": "已是最新版本",
"data": null
}
```
### 场景3参数错误
**请求**
```
GET /version/check?current_version=1.0.0
```
**响应**
```json
{
"code": 400,
"message": "缺少必要参数platform, arch",
"data": null
}
```
## 注意事项
1. **日期字段命名**:统一使用 `create_time``last_modify_time`
2. **版本号格式**:严格按照 x.y.z 格式,便于版本比较
3. **文件存储**:建议使用 CDN 或静态文件服务器,提高下载速度
4. **日志记录**:记录版本检查请求,便于统计和分析
5. **缓存策略**:可以考虑缓存最新版本信息,减少数据库查询
6. **灰度发布**:可以通过 sn_code 控制部分设备先更新(可选)
## 实现优先级
1. **基础功能**:版本检查、版本比较、返回下载信息
2. **文件管理**:文件上传、文件存储、哈希计算
3. **安全功能**:文件校验、权限控制
4. **管理功能**:版本管理后台、历史记录

View File

@@ -1,26 +0,0 @@
# 目录整理执行计划
## 📋 整理步骤
### 第一步合并AI服务
-`middleware/job/aiService.js` 的功能合并到 `services/ai_service.js`
- 保留更完整的功能middleware/job/aiService.js 功能更全)
- 删除 `middleware/job/aiService.js`
### 第二步:移动业务服务
- `middleware/job/jobManager.js``services/job_manager_service.js`
- `middleware/job/chatManager.js``services/chat_manager_service.js`
- `middleware/job/resumeManager.js``services/resume_manager_service.js`
### 第三步:更新引用
- 更新 `command.js` 中的引用
- 更新所有其他文件中的引用
### 第四步:处理废弃文件
- `services/task_scheduler.js` 标记为废弃(添加注释说明)
## ⚠️ 注意事项
- 更新所有 require 路径
- 测试确保功能正常

View File

@@ -1,60 +0,0 @@
# 目录结构整理方案
## 📋 职责划分
### services/ - 业务服务层
**职责**:对外提供业务逻辑服务,处理业务相关的操作
- 职位服务job_service.js
- 账号服务pla_account_service.js
- AI服务ai_service.js
- OSS服务ossTool.js
- 工作管理服务jobManager.js
- 聊天管理服务chatManager.js
- 简历管理服务resumeManager.js
### middleware/ - 中间件层
**职责**:系统级功能,基础设施服务
- 调度系统schedule/
- MQTT通信mqtt/
- 数据库代理dbProxy.js
- 日志代理logProxy.js
## 🔄 需要移动的文件
### 1. 从 middleware/job/ 移到 services/
- `jobManager.js``services/job_manager_service.js`
- `chatManager.js``services/chat_manager_service.js`
- `resumeManager.js``services/resume_manager_service.js`
### 2. 合并重复的AI服务
- `middleware/job/aiService.js``services/ai_service.js` 合并
- 保留 `services/ai_service.js`,删除 `middleware/job/aiService.js`
### 3. 处理未使用的文件
- `services/task_scheduler.js` - 标记为废弃或删除(实际未使用)
## 📁 整理后的目录结构
```
api/
├── services/ # 业务服务层
│ ├── index.js # 服务管理器
│ ├── ai_service.js # AI服务合并后
│ ├── job_service.js # 职位服务
│ ├── pla_account_service.js # 账号服务
│ ├── ossTool.js # OSS服务
│ ├── job_manager_service.js # 工作管理服务从middleware/job/移入)
│ ├── chat_manager_service.js # 聊天管理服务从middleware/job/移入)
│ └── resume_manager_service.js # 简历管理服务从middleware/job/移入)
└── middleware/ # 中间件层
├── schedule/ # 调度系统
│ ├── index.js
│ ├── taskQueue.js
│ ├── command.js
│ └── ...
├── mqtt/ # MQTT通信
├── dbProxy.js # 数据库代理
└── logProxy.js # 日志代理
```

View File

@@ -1,239 +0,0 @@
# 简历存储功能 - 前置条件和使用说明
## ⚠️ 重要前置条件
在使用简历存储功能之前,必须确保以下条件已满足:
### 1. 数据库表已创建
#### ✅ `pla_account` 表(平台账户表)
此表存储设备与平台账户的绑定关系,**必须先有记录**才能存储简历。
**表结构**:
```sql
CREATE TABLE `pla_account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '账户名',
`sn_code` varchar(50) NOT NULL DEFAULT '' COMMENT '设备SN码',
`platform_type` varchar(50) NOT NULL DEFAULT '' COMMENT '平台类型(boss/liepin)',
`login_name` varchar(50) NOT NULL DEFAULT '' COMMENT '登录名',
`pwd` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
`keyword` varchar(50) NOT NULL DEFAULT '' COMMENT '关键词',
`search_url` varchar(50) NOT NULL DEFAULT '' COMMENT '搜索页网址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
**示例数据**:
```sql
INSERT INTO `pla_account` (`name`, `sn_code`, `platform_type`, `login_name`, `pwd`)
VALUES ('张三的Boss账号', 'GHJU', 'boss', '13800138000', 'password123');
```
#### ✅ `resume_info` 表(简历信息表)
此表存储简历详细信息,会自动创建(通过 Sequelize sync
**关键字段**:
- `id` - 简历UUID主键
- `sn_code` - 设备SN码关联设备
- `account_id` - 账户ID**关联 pla_account.id**
- `platform` - 平台类型boss/liepin
### 2. 数据关联关系
```
┌─────────────────┐ ┌──────────────────┐
│ pla_account │ │ resume_info │
├─────────────────┤ ├──────────────────┤
│ id (自增) │◄────────│ account_id │
│ sn_code │ │ sn_code │
│ platform_type │ │ platform │
│ login_name │ │ fullName │
│ pwd │ │ ... │
└─────────────────┘ └──────────────────┘
```
**查询逻辑**:
1. 通过 `sn_code` + `platform` 查询 `pla_account`
2. 获取 `pla_account.id` 作为 `account_id`
3.`account_id` 存入 `resume_info`
### 3. 环境配置
#### 数据库连接
确保数据库连接配置正确(`config/config.js`
#### AI服务配置可选
如需AI分析功能需配置 DeepSeek API
```env
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxx
DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions
DEEPSEEK_MODEL=deepseek-chat
```
## 🚀 使用流程
### 步骤1: 创建平台账户记录
在调用简历存储功能之前,必须先在 `pla_account` 表中创建账户记录:
```javascript
const db = require('./api/middleware/dbProxy');
const pla_account = db.getModel('pla_account');
// 创建账户记录
await pla_account.create({
name: '张三的Boss账号',
sn_code: 'GHJU',
platform_type: 'boss',
login_name: '13800138000',
pwd: 'password123',
keyword: '前端工程师',
search_url: 'https://www.zhipin.com/web/geek/job'
});
```
### 步骤2: 同步数据库表结构
运行同步脚本确保表结构正确:
```bash
node scripts/sync_resume_table.js
```
### 步骤3: 调用简历存储功能
```javascript
const jobManager = require('./api/middleware/job/jobManager');
// 获取在线简历(自动存储)
const resumeData = await jobManager.get_online_resume(
'GHJU', // 设备SN码必须在 pla_account 中存在)
mqttClient, // MQTT客户端
{ platform: 'boss' } // 平台类型(必须与 pla_account.platform_type 匹配)
);
```
## ❌ 常见错误
### 错误1: "未找到设备 GHJU 在平台 boss 的账户信息"
**原因**: `pla_account` 表中没有对应的记录
**解决方案**:
```javascript
// 检查是否存在账户记录
const account = await pla_account.findOne({
where: { sn_code: 'GHJU', platform_type: 'boss' }
});
if (!account) {
// 创建账户记录
await pla_account.create({
name: '账户名称',
sn_code: 'GHJU',
platform_type: 'boss',
login_name: '登录名',
pwd: '密码'
});
}
```
### 错误2: "Unknown column 'sn_code' in 'field list'"
**原因**: 数据库表结构未同步
**解决方案**:
```bash
# 运行同步脚本
node scripts/sync_resume_table.js
# 或手动执行SQL
ALTER TABLE `resume_info`
ADD COLUMN `sn_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '设备SN码',
ADD COLUMN `account_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户ID';
```
### 错误3: "account_id 不能为空"
**原因**: `pla_account` 查询失败或返回 null
**解决方案**:
1. 确认 `sn_code``platform_type` 匹配
2. 检查 `pla_account` 表中是否有对应记录
3. 确认 `platform` 参数正确('boss' 不是 'Boss'
## ✅ 验证清单
使用简历存储功能前,请确认:
- [ ] `pla_account` 表已创建
- [ ] `pla_account` 表中有对应设备的记录
- [ ] `sn_code``platform_type` 匹配
- [ ] `resume_info` 表已创建
- [ ] `resume_info` 表包含 `sn_code``account_id` 字段
- [ ] 数据库连接正常
- [ ] MQTT 客户端可用
- [ ] 可选DeepSeek API 配置正确
## 📝 完整示例
```javascript
const db = require('./api/middleware/dbProxy');
const jobManager = require('./api/middleware/job/jobManager');
async function setupAndGetResume() {
const pla_account = db.getModel('pla_account');
// 1. 检查或创建账户记录
let account = await pla_account.findOne({
where: { sn_code: 'GHJU', platform_type: 'boss' }
});
if (!account) {
console.log('创建账户记录...');
account = await pla_account.create({
name: '测试账号',
sn_code: 'GHJU',
platform_type: 'boss',
login_name: '13800138000',
pwd: 'password123'
});
console.log('账户创建成功ID:', account.id);
} else {
console.log('账户已存在ID:', account.id);
}
// 2. 获取简历(自动存储)
console.log('获取在线简历...');
const resumeData = await jobManager.get_online_resume(
'GHJU',
mqttClient,
{ platform: 'boss' }
);
console.log('简历获取成功!');
console.log('姓名:', resumeData.baseInfo?.name);
// 3. 验证存储结果
const resume_info = db.getModel('resume_info');
const savedResume = await resume_info.findOne({
where: { sn_code: 'GHJU', platform: 'boss', isActive: true }
});
console.log('简历已保存ID:', savedResume.id);
console.log('关联账户ID:', savedResume.account_id);
console.log('竞争力评分:', savedResume.aiCompetitiveness);
}
```
## 🔗 相关文档
- 详细功能说明: `_doc/简历存储和分析功能说明.md`
- 数据库同步指南: `_doc/数据库表同步指南.md`
- 快速参考: `_doc/简历功能快速参考.md`
- 示例代码: `examples/resume_storage_example.js`

View File

@@ -1,238 +0,0 @@
# 简历存储和AI分析功能实现总结
## ✅ 已完成的工作
### 1. 核心功能实现
#### 📝 文件修改
**文件**: `api/middleware/job/jobManager.js`
**新增依赖**:
```javascript
const db = require('../dbProxy');
const { v4: uuidv4 } = require('uuid');
```
**新增/修改的方法**:
1. **`get_online_resume(sn_code, mqttClient, params)`** ✅
- 从MQTT获取在线简历数据
- 自动调用存储方法保存到数据库
- 支持平台参数配置默认boss
- 容错处理:存储失败不影响数据返回
2. **`saveResumeToDatabase(sn_code, platform, resumeData)`** ✅ 新增
- 解析Boss直聘响应数据
- 映射到resume_info模型字段
- 自动提取技能标签
- 处理项目经验和工作经历JSON格式
- 支持创建/更新简历(去重机制)
- 自动触发AI分析
3. **`extractSkillsFromDesc(description)`** ✅ 新增
- 从简历描述中自动提取技能标签
- 支持40+常见技术栈识别
- 自动去重
4. **`analyzeResumeWithAI(resumeId, resumeInfo)`** ✅ 新增
- 调用AI服务分析简历
- 生成专业的分析提示词
- 解析AI返回结果
- 更新AI分析字段到数据库
- 失败时使用默认分析
5. **`parseAIAnalysis(aiResponse, resumeInfo)`** ✅ 新增
- 智能解析AI返回的JSON或文本格式
- 支持中英文字段识别
- 正则表达式提取关键信息
- 容错处理
6. **`getDefaultAnalysis(resumeInfo)`** ✅ 新增
- 基于规则的默认分析算法
- 工作年限评分
- 技能数量评分
- 学历评分
- 综合竞争力计算0-100分
### 2. 数据映射实现
#### Boss直聘 → resume_info 字段映射
| 数据类型 | 映射字段数 | 状态 |
|---------|-----------|------|
| 基本信息 | 6个字段 | ✅ |
| 教育背景 | 4个字段 | ✅ |
| 工作经验 | 4个字段 | ✅ |
| 期望信息 | 4个字段 | ✅ |
| 技能专长 | 3个字段 | ✅ |
| 项目经验 | JSON数组 | ✅ |
| 工作经历 | JSON数组 | ✅ |
| AI分析 | 5个字段 | ✅ |
| 原始数据 | 完整JSON | ✅ |
**总计**: 30+ 字段完整映射
### 3. AI分析功能
#### 分析维度
- ✅ 技能标签提取5-10个
- ✅ 优势分析100字以内
- ✅ 劣势分析100字以内
- ✅ 职业建议150字以内
- ✅ 竞争力评分0-100分
#### 评分算法
```
基础分: 50分
+ 工作年限: 10年以上(+20) | 5-10年(+15) | 3-5年(+10)
+ 技能数量: 10个以上(+15) | 5-10个(+10)
+ 学历: 硕士(+10) | 本科(+5)
= 最终竞争力评分 (0-100)
```
### 4. 文档和示例
#### 📚 创建的文档
1. **`_doc/简历存储和分析功能说明.md`** ✅
- 功能概述
- 数据映射表
- 使用示例
- 注意事项
2. **`_doc/简历功能实现总结.md`** ✅
- 实现总结
- 技术细节
- 测试指南
#### 💻 创建的示例代码
**`examples/resume_storage_example.js`** ✅
- 示例1: 获取在线简历并自动存储
- 示例2: 查询已存储的简历
- 示例3: 查看简历的项目经验
- 示例4: 统计简历数据
## 🎯 功能特性
### 核心特性
-**自动存储**: 获取简历后自动保存到数据库
-**智能去重**: 同设备同平台只保留一份活跃简历
-**AI分析**: 自动调用AI服务进行简历分析
-**容错处理**: 存储或分析失败不影响主流程
-**完整数据**: 保留原始JSON数据便于追溯
-**技能提取**: 自动识别40+常见技术栈
### 技术亮点
- 🔹 使用UUID作为简历唯一标识
- 🔹 JSON格式存储复杂数据项目、工作经历
- 🔹 智能解析AI返回的多种格式
- 🔹 基于规则的默认分析作为降级方案
- 🔹 完善的日志输出便于调试
## 📊 数据流程图
```
┌─────────────┐
│ MQTT请求 │
│ get_online_ │
│ resume │
└──────┬──────┘
┌─────────────┐
│ 获取简历数据 │
│ (Boss直聘) │
└──────┬──────┘
┌─────────────┐
│ 解析数据 │
│ 字段映射 │
└──────┬──────┘
┌─────────────┐
│ 保存到数据库 │
│ resume_info │
└──────┬──────┘
┌─────────────┐
│ AI分析简历 │
│ (DeepSeek) │
└──────┬──────┘
┌─────────────┐
│ 更新AI字段 │
│ 完成存储 │
└─────────────┘
```
## 🧪 测试建议
### 单元测试
```bash
# 运行示例代码
node examples/resume_storage_example.js
```
### 集成测试
1. 确保数据库连接正常
2. 确保MQTT服务可用
3. 确保DeepSeek API配置正确
4. 调用 `get_online_resume` 方法
5. 检查数据库中的记录
6. 验证AI分析字段
### 测试用例
- ✅ 新简历创建
- ✅ 已有简历更新
- ✅ 技能标签提取
- ✅ AI分析成功
- ✅ AI分析失败降级
- ✅ 数据库存储失败容错
## 🔧 配置要求
### 环境变量
```env
# DeepSeek AI配置用于简历分析
DEEPSEEK_API_KEY=your_api_key_here
DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions
DEEPSEEK_MODEL=deepseek-chat
```
### 数据库
- 表: `resume_info`
- 引擎: MySQL/MariaDB
- 字符集: UTF8MB4
## 📈 性能指标
- **数据获取**: ~2-5秒取决于MQTT响应
- **数据存储**: ~100-300ms
- **AI分析**: ~3-10秒取决于API响应
- **总耗时**: ~5-15秒
## 🚀 后续优化方向
1. **性能优化**
- 异步AI分析不阻塞主流程
- 批量处理多份简历
- 缓存AI分析结果
2. **功能增强**
- 支持更多招聘平台
- 简历版本管理
- 简历对比功能
- 导出PDF/Word
3. **AI优化**
- 优化提示词模板
- 增加更多分析维度
- 训练专用模型
## ✨ 总结
本次实现完成了从在线简历获取、数据存储到AI智能分析的完整闭环为自动化求职系统提供了坚实的数据基础。所有核心功能已实现并经过测试可以投入使用。

View File

@@ -1,251 +0,0 @@
# 简历存储和分析功能 - 快速参考
## 🚀 快速开始
### 1. 基本使用
```javascript
const jobManager = require('./api/middleware/job/jobManager');
// 获取在线简历(自动存储和分析)
const resumeData = await jobManager.get_online_resume(
'GHJU', // 设备SN码
mqttClient, // MQTT客户端
{ platform: 'boss' } // 平台可选默认boss
);
```
### 2. 查询已存储的简历
```javascript
const db = require('./api/middleware/dbProxy');
const resume_info = db.getModel('resume_info');
// 查询指定设备的简历
const resume = await resume_info.findOne({
where: {
sn_code: 'GHJU',
platform: 'boss',
isActive: true
}
});
console.log('姓名:', resume.fullName);
console.log('竞争力评分:', resume.aiCompetitiveness);
```
## 📋 主要字段说明
### 基本信息
- `fullName` - 姓名
- `gender` - 性别
- `age` - 年龄
- `phone` - 电话
- `email` - 邮箱
### 工作信息
- `workYears` - 工作年限
- `currentPosition` - 当前职位
- `currentCompany` - 当前公司
- `expectedPosition` - 期望职位
- `expectedSalary` - 期望薪资
### AI分析字段
- `aiSkillTags` - AI提取的技能标签JSON数组
- `aiStrengths` - 优势分析
- `aiWeaknesses` - 劣势分析
- `aiCareerSuggestion` - 职业建议
- `aiCompetitiveness` - 竞争力评分0-100
### 复杂数据JSON格式
- `skills` - 技能标签数组
- `projectExperience` - 项目经验数组
- `workExperience` - 工作经历数组
- `originalData` - 完整原始数据
## 🔍 常用查询示例
### 查询高竞争力简历
```javascript
const highScoreResumes = await resume_info.findAll({
where: {
aiCompetitiveness: { [db.models.op.gte]: 80 }
},
order: [['aiCompetitiveness', 'DESC']]
});
```
### 按技能搜索
```javascript
const vueResumes = await resume_info.findAll({
where: {
skills: { [db.models.op.like]: '%Vue%' }
}
});
```
### 统计数据
```javascript
// 总数
const total = await resume_info.count();
// 按平台统计
const bossCount = await resume_info.count({
where: { platform: 'boss' }
});
// 平均竞争力
const avgScore = await resume_info.findAll({
attributes: [
[db.models.sequelize.fn('AVG',
db.models.sequelize.col('aiCompetitiveness')),
'avgScore']
]
});
```
## 🎯 数据处理技巧
### 解析JSON字段
```javascript
// 解析技能标签
const skills = JSON.parse(resume.skills || '[]');
console.log('技能:', skills.join(', '));
// 解析项目经验
const projects = JSON.parse(resume.projectExperience || '[]');
projects.forEach(p => {
console.log(`项目: ${p.name} - ${p.role}`);
});
// 解析工作经历
const workExp = JSON.parse(resume.workExperience || '[]');
workExp.forEach(w => {
console.log(`${w.company} - ${w.position}`);
});
```
### 获取原始数据
```javascript
const originalData = JSON.parse(resume.originalData);
console.log('完整Boss直聘数据:', originalData);
```
## ⚙️ 配置说明
### 环境变量(.env
```env
# DeepSeek AI配置
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxx
DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions
DEEPSEEK_MODEL=deepseek-chat
```
### 数据库配置
确保 `resume_info` 表已创建,字段定义参考:
`api/model/resume_info.js`
## 🐛 常见问题
### Q1: 简历保存失败怎么办?
A: 系统有容错机制,保存失败不会影响数据返回。检查日志:
```
[工作管理] 保存简历数据失败: [错误信息]
```
### Q2: AI分析失败怎么办
A: 系统会自动使用基于规则的默认分析。检查:
- DeepSeek API配置是否正确
- API密钥是否有效
- 网络连接是否正常
### Q3: 如何更新已有简历?
A: 再次调用 `get_online_resume`,系统会自动检测并更新:
```javascript
// 同一设备同一平台会自动更新
await jobManager.get_online_resume('GHJU', mqttClient);
```
### Q4: 如何查看详细日志?
A: 查看控制台输出:
```
[工作管理] 开始获取设备 GHJU 的在线简历
[工作管理] 成功获取简历数据
[工作管理] 简历已创建/更新 - ID: xxx
[工作管理] AI分析完成 - 竞争力评分: 85
```
## 📊 性能优化建议
### 1. 批量查询
```javascript
// 使用 findAll 而不是多次 findOne
const resumes = await resume_info.findAll({
where: { sn_code: { [db.models.op.in]: ['GHJU', 'ABCD'] } }
});
```
### 2. 选择性字段
```javascript
// 只查询需要的字段
const resumes = await resume_info.findAll({
attributes: ['id', 'fullName', 'aiCompetitiveness'],
where: { isActive: true }
});
```
### 3. 分页查询
```javascript
const resumes = await resume_info.findAndCountAll({
limit: 20,
offset: 0,
order: [['aiCompetitiveness', 'DESC']]
});
```
## 🔗 相关文档
- 详细说明: `_doc/简历存储和分析功能说明.md`
- 实现总结: `_doc/简历功能实现总结.md`
- 示例代码: `examples/resume_storage_example.js`
- 模型定义: `api/model/resume_info.js`
- 响应示例: `_doc/在线简历响应文本.json`
## 💡 最佳实践
1. **总是检查返回值**
```javascript
const resume = await resume_info.findOne({...});
if (resume) {
// 处理简历数据
}
```
2. **安全解析JSON**
```javascript
try {
const skills = JSON.parse(resume.skills || '[]');
} catch (e) {
console.error('解析失败:', e);
}
```
3. **使用事务处理批量操作**
```javascript
const t = await db.models.sequelize.transaction();
try {
// 批量操作
await t.commit();
} catch (error) {
await t.rollback();
}
```
4. **定期清理旧数据**
```javascript
// 删除非活跃简历
await resume_info.destroy({
where: { isActive: false }
});
```

View File

@@ -1,169 +0,0 @@
# 简历存储和分析功能说明
## 📋 功能概述
本功能实现了从在线平台Boss直聘获取用户简历数据并自动存储到数据库同时使用AI进行智能分析的完整流程。
## 🔗 数据关联
- **`pla_account`** 表:存储平台账户信息(设备与平台的绑定关系)
- **`resume_info`** 表:存储简历详细信息
- **关联关系**`resume_info.account_id` = `pla_account.id`自增ID
- **查询逻辑**:通过 `sn_code` + `platform` 查询 `pla_account` 获取 `account_id`
## 🔧 核心功能
### 1. 简历数据获取与存储
**位置**: `api/middleware/job/jobManager.js`
**主要方法**:
- `get_online_resume(sn_code, mqttClient, params)` - 获取在线简历
- `saveResumeToDatabase(sn_code, platform, resumeData)` - 保存简历到数据库
**数据流程**:
```
MQTT请求 → 获取简历数据 → 解析数据 → 存储到resume_info表 → AI分析 → 更新AI分析字段
```
### 2. 数据映射关系
#### 从Boss直聘响应到数据库字段的映射
| Boss直聘字段 | 数据库字段 | 说明 |
|-------------|-----------|------|
| `baseInfo.name` | `fullName` | 姓名 |
| `baseInfo.gender` | `gender` | 性别1=男0=女) |
| `baseInfo.age` | `age` | 年龄 |
| `baseInfo.account` | `phone` | 电话 |
| `baseInfo.emailBlur` | `email` | 邮箱 |
| `expectList[0].locationName` | `location` | 所在地 |
| `educationExpList[0].degreeName` | `education` | 学历 |
| `educationExpList[0].major` | `major` | 专业 |
| `educationExpList[0].school` | `school` | 毕业院校 |
| `educationExpList[0].endYear` | `graduationYear` | 毕业年份 |
| `baseInfo.workYearDesc` | `workYears` | 工作年限 |
| `workExpList[0].positionName` | `currentPosition` | 当前职位 |
| `workExpList[0].companyName` | `currentCompany` | 当前公司 |
| `expectList[0].positionName` | `expectedPosition` | 期望职位 |
| `expectList[0].salaryDesc` | `expectedSalary` | 期望薪资 |
| `expectList[0].locationName` | `expectedLocation` | 期望地点 |
| `expectList[0].industryDesc` | `expectedIndustry` | 期望行业 |
| `userDesc` | `skillDescription` | 技能描述 |
| `projectExpList` | `projectExperience` | 项目经验JSON |
| `workExpList` | `workExperience` | 工作经历JSON |
### 3. AI智能分析
**分析维度**:
1. **技能标签提取** - 从简历描述中自动提取技术栈
2. **优势分析** - 分析候选人的核心优势
3. **劣势分析** - 指出需要改进的方面
4. **职业建议** - 提供职业发展建议
5. **竞争力评分** - 0-100分的综合评分
**评分规则**(默认分析):
- 基础分50分
- 工作年限10年以上+20分5-10年+15分3-5年+10分
- 技能数量10个以上+15分5-10个+10分
- 学历:硕士+10分本科+5分
### 4. 技能标签自动提取
系统会自动从简历描述中提取以下技能标签:
**前端技术**:
- Vue, React, Angular, JavaScript, TypeScript
- Webpack, Vite, Redux, MobX
- jQuery, Bootstrap, Element UI, Ant Design
**后端技术**:
- Node.js, Python, Java, C#, .NET
- Express, Koa, Django, Flask
**数据库**:
- MySQL, MongoDB, Redis
**其他技术**:
- WebRTC, FFmpeg, Canvas, WebSocket
- Git, Docker, Kubernetes, AWS, Azure
- Selenium, Jest, Mocha, Cypress
## 📊 数据库表结构
**表名**: `resume_info`
**主要字段**:
```sql
- id: IDUUID
- sn_code: SN码
- platform: boss/liepin
- fullName:
- gender:
- age:
- phone:
- email:
- education:
- workYears:
- expectedPosition:
- expectedSalary:
- skills: JSON
- projectExperience: JSON
- workExperience: JSON
- aiSkillTags: AI提取的技能标签JSON
- aiStrengths: AI分析的优势
- aiWeaknesses: AI分析的劣势
- aiCareerSuggestion: AI职业建议
- aiCompetitiveness: AI竞争力评分
- originalData: JSON
- isActive:
- syncTime:
```
## 🚀 使用示例
### 调用方式
```javascript
const jobManager = require('./api/middleware/job/jobManager');
// 获取在线简历(自动存储和分析)
const resumeData = await jobManager.get_online_resume(
'GHJU', // 设备SN码
mqttClient, // MQTT客户端实例
{ platform: 'boss' } // 参数(可选)
);
```
### 响应数据示例
参考文件: `_doc/在线简历响应文本.json`
## 🔍 日志输出
系统会输出以下日志信息:
```
[工作管理] 开始获取设备 GHJU 的在线简历
[工作管理] 成功获取简历数据: {...}
[工作管理] 简历已创建 - ID: xxx-xxx-xxx
[工作管理] 开始AI分析简历 - ID: xxx-xxx-xxx
[工作管理] AI分析完成 - 竞争力评分: 85
[工作管理] 简历数据已保存到数据库
```
## ⚠️ 注意事项
1. **数据安全**: 原始简历数据会完整保存在 `originalData` 字段中
2. **去重机制**: 同一设备同一平台只保留一份活跃简历
3. **容错处理**: 如果AI分析失败会使用基于规则的默认分析
4. **异步处理**: 简历保存失败不会影响数据返回
## 📝 后续优化建议
1. 增加更多平台支持(猎聘、拉勾等)
2. 优化AI提示词提高分析准确度
3. 添加简历版本管理功能
4. 实现简历对比功能
5. 增加简历导出功能PDF、Word等

View File

@@ -1,281 +0,0 @@
# 聊天列表功能说明
## 功能概述
聊天列表模块实现了管理后台的实时聊天功能,包括:
- 会话列表展示
- 实时消息收发
- 消息历史记录
- 轮询机制接收新消息
## 功能特性
### 1. 会话列表
- **按会话分组**: 自动按照 `conversationId``jobId + sn_code` 组合进行分组
- **最新消息展示**: 显示每个会话的最新一条消息
- **未读消息标记**: 显示未读消息数量(开发中)
- **平台过滤**: 支持按 Boss直聘/猎聘 平台筛选
- **搜索功能**: 支持按公司名称/职位名称搜索
### 2. 聊天窗口
- **消息列表**: 按时间顺序展示所有聊天消息
- **消息方向**: 区分发送和接收的消息,不同样式展示
- **AI标记**: 显示AI生成的消息标记
- **面试邀约**: 特殊样式展示面试邀约消息
- **实时刷新**: 自动轮询获取新消息(默认5秒)
### 3. 消息发送
- **快速回复**: 输入框支持快速发送消息
- **Enter发送**: 支持回车键发送消息
- **发送状态**: 显示消息发送中的加载状态
- **AI生成**: 预留AI消息生成功能接口(开发中)
### 4. 定时刷新机制
- **自动刷新**: 使用 setInterval 定时刷新消息
- **可配置间隔**: 默认10秒,可自定义刷新间隔
- **资源释放**: 页面销毁时自动清除定时器
- **简单高效**: 使用Ajax轮询,无需WebSocket
## 文件结构
```
admin/src/
├── views/chat/
│ ├── chat_list.vue # 聊天列表页面(新增)
│ └── chat_records.vue # 聊天记录管理页面(原有)
├── api/operation/
│ └── chat_records_server.js # 聊天API服务
└── router/
└── component-map.js # 路由组件映射
api/
├── controller_admin/
│ └── chat_records.js # 聊天记录后端控制器(已扩展)
└── model/
└── chat_records.js # 聊天记录数据模型
```
## API 接口
### 前端API服务 (chat_records_server.js)
| 方法 | 说明 | 参数 |
|------|------|------|
| `page(param)` | 分页查询聊天记录 | seachOption, pageOption |
| `getByJobId(params)` | 获取指定职位的聊天记录 | jobId, sn_code |
| `sendMessage(data)` | 发送聊天消息 | sn_code, jobId, content, chatType, platform |
| `getUnreadCount(params)` | 获取未读消息数量 | sn_code |
| `markAsRead(data)` | 标记消息为已读 | chatId |
| `getStatistics()` | 获取聊天统计数据 | - |
### 后端API接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/admin_api/chat/list` | POST | 获取聊天记录列表 |
| `/admin_api/chat/by-job` | GET | 获取指定职位的聊天记录 |
| `/admin_api/chat/send` | POST | 发送聊天消息 |
| `/admin_api/chat/unread-count` | GET | 获取未读消息数量 |
| `/admin_api/chat/mark-read` | POST | 标记消息为已读 |
| `/admin_api/chat/statistics` | GET | 获取聊天统计数据 |
| `/admin_api/chat/detail` | GET | 获取聊天记录详情 |
| `/admin_api/chat/delete` | POST | 删除聊天记录 |
## 使用说明
### 1. 访问聊天列表页面
在后台菜单中添加聊天列表页面的路由配置:
```javascript
{
name: '聊天列表',
path: '/chat/chat_list',
component: 'chat/chat_list'
}
```
### 2. 查看会话列表
- 左侧显示所有会话列表
- 每个会话显示公司名称、职位名称、最新消息和时间
- 点击会话可在右侧查看完整的聊天记录
### 3. 发送消息
1. 在左侧选择一个会话
2. 在右侧聊天窗口底部的输入框中输入消息
3. 点击"发送"按钮或按回车键发送
4. 消息发送成功后会自动刷新聊天记录
### 4. 筛选和搜索
- **平台筛选**: 在顶部选择 Boss直聘 或 猎聘 进行筛选
- **关键词搜索**: 在搜索框输入公司名称或职位名称进行搜索
- 筛选和搜索会实时更新会话列表
## 数据模型
### 聊天记录模型 (chat_records)
主要字段:
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 主键ID |
| sn_code | STRING | 设备SN码 |
| platform | STRING | 平台(boss/liepin) |
| jobId | STRING | 职位ID |
| companyName | STRING | 公司名称 |
| jobTitle | STRING | 职位名称 |
| hrName | STRING | HR姓名 |
| content | TEXT | 消息内容 |
| direction | STRING | 消息方向(sent/received) |
| chatType | STRING | 聊天类型(greeting/reply/interview) |
| sendStatus | STRING | 发送状态(pending/sent/failed) |
| sendTime | DATE | 发送时间 |
| receiveTime | DATE | 接收时间 |
| hasReply | BOOLEAN | 是否有回复 |
| conversationId | STRING | 会话ID |
| isAiGenerated | BOOLEAN | 是否AI生成 |
| isInterviewInvitation | BOOLEAN | 是否面试邀约 |
## 技术实现
### 1. 会话分组逻辑
```javascript
// 按 conversationId 或 jobId+sn_code 分组
const convId = record.conversationId || `${record.jobId}_${record.sn_code}`
```
### 2. 定时刷新机制
```javascript
// 启动定时刷新
startAutoRefresh() {
this.refreshTimer = setInterval(() => {
// 如果有选中的会话,刷新消息
if (this.activeConversation) {
this.loadChatMessages()
}
// 刷新会话列表
this.loadConversations()
}, this.refreshInterval) // 默认10秒
}
// 停止定时刷新
stopAutoRefresh() {
if (this.refreshTimer) {
clearInterval(this.refreshTimer)
this.refreshTimer = null
}
}
```
### 3. 消息发送流程
1. 前端调用 `chatRecordsServer.sendMessage()`
2. 后端创建聊天记录,状态为 `pending`
3. 后端通过MQTT发送消息到设备(待实现)
4. 更新聊天记录状态为 `sent`
5. 前端刷新消息列表
## 待开发功能
### 1. 优化刷新机制(可选)
当前使用简单的定时刷新,如果需要更高的实时性,可以考虑:
- WebSocket实时推送(需要服务端支持)
- 长轮询(Long Polling)
- Server-Sent Events (SSE)
- 智能刷新间隔(根据活跃度动态调整)
### 2. AI消息生成
集成AI服务生成智能回复:
- 根据聊天上下文生成合适的回复
- 支持不同的回复风格
- 提高回复效率
### 3. 富文本消息
支持更丰富的消息类型:
- 图片消息
- 文件消息
- 表情包
- Markdown格式
### 4. 消息状态管理
完善消息状态:
- 已读/未读状态
- 消息撤回
- 消息编辑
- 消息引用回复
### 5. 会话管理
增强会话管理功能:
- 会话置顶
- 会话静音
- 会话归档
- 会话标签
## 注意事项
### 1. MQTT集成
当前消息发送功能需要集成MQTT客户端才能真正发送到设备。在 `chat_records.js` 控制器中有TODO标记:
```javascript
// TODO: 这里需要通过MQTT发送消息到设备
// 目前先简单返回成功,实际需要集成MQTT客户端
```
### 2. 数据同步
- 刷新间隔不宜过短,避免服务器压力(建议10秒以上)
- 可根据实际需求调整刷新间隔
- 考虑添加手动刷新按钮,让用户主动刷新
### 3. 性能优化
- 会话列表分页加载
- 消息列表虚拟滚动
- 图片懒加载
- 消息缓存机制
### 4. 安全性
- 消息内容过滤和验证
- 防止XSS攻击
- 消息发送频率限制
- 敏感信息加密
## 测试建议
### 1. 功能测试
- 测试会话列表加载
- 测试消息发送和接收
- 测试筛选和搜索功能
- 测试定时刷新机制
### 2. 边界测试
- 测试空会话列表
- 测试空消息列表
- 测试网络异常情况
- 测试大量消息加载
### 3. 性能测试
- 测试大量会话的加载速度
- 测试长时间运行的内存占用
- 测试频繁切换会话的响应速度
## 更新日志
### v1.0.0 (2025-01-XX)
- ✅ 创建聊天列表页面
- ✅ 实现会话分组和展示
- ✅ 实现消息发送功能
- ✅ 实现定时刷新接收新消息(Ajax轮询)
- ✅ 添加后端API接口
- ✅ 支持平台筛选和搜索
### 计划中
- ⏳ AI消息生成
- ⏳ 富文本消息支持
- ⏳ 完善消息状态管理
- ⏳ 增强会话管理功能
- ⏳ 优化刷新机制(WebSocket/长轮询等)

View File

@@ -1,151 +0,0 @@
# 聊天功能快速开始
## 快速配置
### 1. 添加菜单路由
在后台管理系统的菜单配置中添加以下菜单项:
```json
{
"name": "聊天列表",
"path": "/chat/chat_list",
"component": "chat/chat_list",
"icon": "md-chatbubbles"
}
```
### 2. 启动项目
```bash
# 启动后端API服务
cd api
npm install
npm start
# 启动前端管理后台
cd admin
npm install
npm run dev
```
### 3. 访问聊天列表
在浏览器中访问: `http://localhost:8080/#/chat/chat_list`
## 功能演示
### 查看会话列表
1. 左侧显示所有聊天会话
2. 每个会话显示:
- 公司名称
- 职位名称
- 最新消息内容
- 消息时间
- 平台标签(Boss/猎聘)
### 查看聊天记录
1. 点击左侧的任意会话
2. 右侧显示完整的聊天历史记录
3. 消息按时间顺序排列
4. 区分发送和接收的消息
### 发送消息
1. 选择一个会话
2. 在底部输入框输入消息
3. 点击"发送"按钮或按回车键
4. 消息发送成功后会自动刷新
### 筛选和搜索
- **平台筛选**: 选择Boss直聘或猎聘
- **关键词搜索**: 输入公司名称或职位名称
## API测试
### 测试获取聊天列表
```bash
curl -X POST http://localhost:3000/admin_api/chat/list \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"pageSize": 20
}'
```
### 测试发送消息
```bash
curl -X POST http://localhost:3000/admin_api/chat/send \
-H "Content-Type: application/json" \
-d '{
"sn_code": "GHJU",
"jobId": "12345",
"content": "您好,我对这个职位很感兴趣",
"platform": "boss",
"chatType": "reply"
}'
```
### 测试获取指定职位的聊天记录
```bash
curl -X GET "http://localhost:3000/admin_api/chat/by-job?jobId=12345&sn_code=GHJU"
```
## 常见问题
### 1. 页面显示空白?
- 检查API服务是否正常运行
- 检查浏览器控制台是否有错误
- 确认数据库中是否有聊天记录数据
### 2. 消息发送失败?
- 检查设备SN码是否正确
- 检查职位ID是否存在
- 查看后端日志确认错误原因
- 注意: 当前MQTT集成待完成,消息会保存但不会真正发送到设备
### 3. 轮询不工作?
- 检查浏览器控制台是否有网络错误
- 确认轮询定时器是否正常启动
- 可以调整轮询间隔 (默认5秒)
### 4. 会话列表为空?
- 检查筛选条件是否过于严格
- 尝试清空搜索关键词
- 确认数据库中有聊天记录
## 下一步
### 功能扩展
- 集成MQTT实现真实消息发送
- 添加WebSocket实现实时推送
- 集成AI生成智能回复
- 支持富文本和文件消息
### 性能优化
- 实现消息虚拟滚动
- 添加消息缓存机制
- 优化大量会话的加载性能
### 用户体验
- 添加消息已读状态
- 支持消息撤回
- 添加消息搜索功能
- 支持会话置顶和归档
## 技术支持
如有问题,请查看:
- [聊天列表功能说明.md](./聊天列表功能说明.md) - 完整的功能文档
- 项目代码中的注释
- 后端API的Swagger文档
## 更新记录
- **2025-01-XX**: 初始版本发布
- 实现基础聊天列表功能
- 支持消息发送和接收
- 添加轮询机制
- 支持平台筛选和搜索

File diff suppressed because it is too large Load Diff

View File

@@ -1,299 +0,0 @@
# autoAiWorkSys 调度架构分析与优化建议
## 📋 目录
1. [架构概览](#架构概览)
2. [核心问题分析](#核心问题分析)
3. [优化建议](#优化建议)
4. [重构方案](#重构方案)
---
## 架构概览
### 当前架构层次
```
应用入口 (app.js)
└─> ScheduleManager (middleware/schedule/index.js)
├─> TaskQueue (taskQueue.js) - 设备级任务队列
├─> Strategy (strategy.js) - 调度策略
├─> Monitor (monitor.js) - 监控系统
├─> Command (command.js) - 指令执行
└─> MQTT Client - 设备通信
ServiceManager (services/index.js)
├─> TaskScheduler (task_scheduler.js) - 通用任务调度器(未使用)
├─> JobService (job_service.js) - 职位服务
└─> JobManager (job/jobManager.js) - 工作管理
```
### 任务执行流程
```
任务创建 → TaskQueue.addTask()
保存到数据库 (task_status)
processQueue() - 单设备串行执行
executeTask() - 执行任务
getTaskCommands() - 生成指令序列
Command.executeCommands() - 执行指令
MQTT.publishAndWait() - 发送到设备
更新任务状态
```
---
## 核心问题分析
### 🔴 问题1: 架构层次混乱,职责不清
**问题描述:**
- 存在两套调度系统:`TaskScheduler` (services层) 和 `ScheduleManager` (middleware层)
- `TaskScheduler` 定义了完整的调度功能但未被使用
- `TaskQueue``TaskScheduler` 功能重叠(都有优先级队列、重试机制)
- `ServiceManager``ScheduleManager` 职责边界模糊
**影响:**
- 代码维护困难,新人难以理解
- 功能重复,增加维护成本
- 扩展性差,难以统一优化
---
### 🔴 问题2: 任务执行效率低
**问题描述:**
- 每个设备单线程串行执行(`TaskQueue.processQueue()`
- 优先级队列使用简单数组,插入效率 O(n)
- 无法充分利用多核CPU资源
- 设备间无法并行执行
**影响:**
- 设备资源利用率低
- 任务执行延迟高
- 无法横向扩展
---
### 🔴 问题3: 重试机制分散,可能导致重复重试
**问题描述:**
- `TaskScheduler` 有重试机制maxRetries, retryDelay
- `TaskQueue` 有重试机制retryCount, maxRetries
- `Command` 也有重试机制maxRetries, retryDelay
- 三层重试可能导致总重试次数超出预期
**影响:**
- 重试次数不可控
- 资源浪费
- 错误处理逻辑复杂
---
### 🔴 问题4: 状态管理分散,可能不一致
**问题描述:**
- 内存状态:`TaskQueue.deviceQueues``TaskQueue.deviceStatus`
- 数据库状态:`task_status`
- 监控状态:`Monitor.deviceOnlineStatus`
- 策略状态:`Strategy.deviceTimestamps``Strategy.dailyCounters`
**影响:**
- 服务重启后状态丢失
- 内存和数据库状态可能不一致
- 难以追踪任务真实状态
---
### 🔴 问题5: 优先级队列实现效率低
**问题描述:**
- 使用简单数组 + `sort()` 实现优先级队列
- 每次插入都需要排序,时间复杂度 O(n log n)
- 应该使用堆Heap数据结构
**影响:**
- 队列操作性能差
- 任务数量多时性能下降明显
---
### 🔴 问题6: MQTT客户端获取方式不统一
**问题描述:**
- `ScheduleManager` 初始化时创建 MQTT 客户端
- `TaskQueue` 通过 `getMqttClient()` 动态获取
- `JobService` 直接从 `scheduleManager` 获取
- 可能导致多个MQTT连接或连接丢失
**影响:**
- 资源管理混乱
- 连接状态不可控
- 难以监控和调试
---
### 🔴 问题7: 错误处理不完善
**问题描述:**
- 部分异步操作缺少 try-catch
- 错误信息记录不完整
- 错误恢复机制缺失
**影响:**
- 错误难以追踪
- 系统稳定性差
- 调试困难
---
## 优化建议
### ✅ 优化1: 统一调度架构
**建议:**
1. **移除未使用的 `TaskScheduler`**,统一使用 `ScheduleManager` + `TaskQueue`
2. **明确职责划分**
- `ScheduleManager`: 系统初始化、组件协调、定时任务
- `TaskQueue`: 任务队列管理、执行调度
- `Command`: 指令执行、MQTT通信
- `Strategy`: 调度策略、频率控制
- `Monitor`: 监控、统计、告警
---
### ✅ 优化2: 提升任务执行效率
**建议:**
1. **使用工作池模式**:允许设备间并行执行
2. **优化优先级队列**使用堆Heap数据结构
3. **支持任务并发控制**:每个设备可配置最大并发数
---
### ✅ 优化3: 统一重试机制
**建议:**
1. **只在 TaskQueue 层实现重试**,移除 Command 层的重试
2. **使用指数退避策略**
3. **记录重试原因和次数**
---
### ✅ 优化4: 统一状态管理
**建议:**
1. **使用数据库作为唯一数据源**Single Source of Truth
2. **内存状态仅作为缓存**,定期同步到数据库
3. **服务启动时从数据库恢复状态**
---
### ✅ 优化5: 优化优先级队列
**建议:**
使用堆Heap数据结构实现优先级队列
---
### ✅ 优化6: 统一MQTT客户端管理
**建议:**
1. **使用单例模式**统一管理MQTT客户端
2. **实现连接池**(如果需要多个连接)
3. **添加连接状态监控和自动重连**
---
### ✅ 优化7: 完善错误处理
**建议:**
1. **统一错误处理中间件**
2. **完善错误日志记录**(包含上下文信息)
3. **实现错误恢复机制**
---
## 重构方案
### 阶段1: 架构清理(优先级:高)
1. **移除未使用的代码**
- 删除或标记 `TaskScheduler`(如果确实未使用)
- 清理重复功能
2. **统一MQTT管理**
- 实现统一的MQTT客户端管理器
- 所有模块通过统一接口获取客户端
3. **统一错误处理**
- 实现错误处理中间件
- 完善错误日志
### 阶段2: 性能优化(优先级:高)
1. **优化优先级队列**
- 使用堆数据结构
- 提升插入和删除效率
2. **实现工作池模式**
- 允许设备间并行执行
- 支持并发控制
3. **优化数据库操作**
- 批量更新任务状态
- 使用事务保证一致性
### 阶段3: 状态管理优化(优先级:中)
1. **统一状态管理**
- 数据库作为唯一数据源
- 内存状态作为缓存
2. **实现状态同步**
- 定期同步内存状态到数据库
- 服务启动时恢复状态
### 阶段4: 监控和可观测性(优先级:中)
1. **完善监控指标**
- 任务执行时间分布
- 错误率统计
- 资源使用情况
2. **实现告警机制**
- 任务失败率告警
- 设备离线告警
- 系统资源告警
---
## 总结
### 关键优化点
1.**统一架构**:移除冗余,明确职责
2.**提升性能**:工作池模式、堆队列、并发控制
3.**统一重试**:避免重复重试,使用指数退避
4.**状态管理**:数据库为主,内存为缓存
5.**资源管理**统一MQTT客户端管理
6.**错误处理**:完善错误处理和恢复机制
### 预期收益
- **性能提升**:任务执行效率提升 50-100%
- **稳定性提升**:错误处理更完善,系统更稳定
- **可维护性提升**:代码结构更清晰,易于维护
- **可扩展性提升**:支持更多设备和任务类型
---
*文档生成时间2024年*
*分析范围autoAiWorkSys 调度架构*

View File

@@ -1,255 +0,0 @@
# 调度架构重构完成说明
## ✅ 已完成的优化
### 1. 优先级队列优化PriorityQueue.js
**实现内容:**
- 使用堆Heap数据结构实现优先级队列
- 时间复杂度:插入 O(log n),删除 O(log n)
- 支持按优先级和创建时间排序
**性能提升:**
- 队列操作性能提升 10-100 倍(取决于队列大小)
- 任务数量多时性能优势明显
**使用方式:**
```javascript
const queue = new PriorityQueue();
queue.push({ priority: 10, createdAt: Date.now(), ...task });
const task = queue.pop(); // 获取优先级最高的任务
```
---
### 2. 工作池模式实现
**实现内容:**
- **设备内串行执行**:每个设备的任务按顺序执行(`deviceMaxConcurrency = 1`
- **设备间并行执行**:不同设备可以同时执行任务
- **全局并发控制**:通过 `maxConcurrency` 控制全局最大并发设备数默认5
**配置说明:**
```javascript
const taskQueue = new TaskQueue({
maxConcurrency: 5, // 全局最大并发设备数
deviceMaxConcurrency: 1 // 每个设备最大并发数(保持串行)
});
```
**执行流程:**
```
设备A: 任务1 → 任务2 → 任务3 (串行)
设备B: 任务1 → 任务2 → 任务3 (串行)
设备C: 任务1 → 任务2 → 任务3 (串行)
并行执行最多5个设备同时执行
```
---
### 3. 统一重试机制
**实现内容:**
- 移除了 Command 层的重试逻辑
- 统一在 TaskQueue 层实现重试
- 使用指数退避策略
**重试策略:**
- 基础延迟1000ms
- 最大延迟30000ms
- 计算公式:`delay = min(1000 * 2^(retryCount-1), 30000)`
**重试次数:**
- 第1次重试延迟 1000ms
- 第2次重试延迟 2000ms
- 第3次重试延迟 4000ms
- 第4次重试延迟 8000ms
- ...最大30000ms
---
### 4. 统一错误处理ErrorHandler.js
**实现内容:**
- 统一错误分类(可重试/不可重试)
- 自动记录错误日志到数据库
- 错误上下文信息完整记录
**可重试错误类型:**
- 网络错误ETIMEDOUT, ECONNRESET, ENOTFOUND
- MQTT连接错误
- 设备离线错误
- 超时错误
**使用方式:**
```javascript
const errorInfo = await ErrorHandler.handleError(error, {
taskId: task.id,
sn_code: task.sn_code,
taskType: task.taskType
});
if (ErrorHandler.isRetryableError(error)) {
// 可重试
}
```
---
### 5. 统一MQTT客户端管理
**实现内容:**
- 优先使用 ScheduleManager 初始化的 MQTT 客户端
- 避免重复创建连接
- 统一获取接口
**获取方式:**
```javascript
// TaskQueue 内部自动获取
const mqttClient = await this.getMqttClient();
```
---
### 6. 状态管理优化
**实现内容:**
- 服务启动时从数据库恢复未完成任务
- 内存状态作为缓存,数据库为主
- 定期同步状态到数据库
**恢复机制:**
- 启动时自动加载 `pending``running` 状态的任务
- `running` 状态的任务自动重置为 `pending`
- 确保服务重启后任务不丢失
---
## 📊 性能对比
### 优化前
- 队列插入O(n log n) - 每次插入都要排序
- 任务执行:完全串行,设备间无法并行
- 重试机制:三层重试,可能重复重试
- 错误处理:分散,难以追踪
### 优化后
- 队列插入O(log n) - 堆插入
- 任务执行设备间并行最多5个设备同时执行
- 重试机制:统一重试,指数退避
- 错误处理:统一处理,完整记录
### 预期性能提升
- **队列操作性能**:提升 10-100 倍
- **任务执行效率**:提升 50-100%(设备间并行)
- **错误恢复能力**:提升 80%(统一错误处理)
- **系统稳定性**:显著提升(状态恢复机制)
---
## 🔧 使用说明
### 1. 初始化
TaskQueue 会在 ScheduleManager 初始化时自动初始化:
```javascript
// 在 schedule/index.js 中
await this.components.taskQueue.init?.();
```
### 2. 添加任务
```javascript
const taskId = await taskQueue.addTask(sn_code, {
taskType: 'get_job_list',
taskName: '获取岗位列表',
taskParams: { keyword: '前端', platform: 'boss' },
priority: 7,
maxRetries: 3
});
```
### 3. 获取状态
```javascript
// 获取设备状态
const status = taskQueue.getDeviceStatus(sn_code);
// 获取全局统计
const stats = taskQueue.getStatistics();
```
### 4. 配置并发数
```javascript
// 在创建 TaskQueue 实例时配置
const taskQueue = new TaskQueue({
maxConcurrency: 10, // 全局最大并发设备数
deviceMaxConcurrency: 1 // 每个设备最大并发数(保持串行)
});
```
---
## 📝 代码变更说明
### 新增文件
1. `PriorityQueue.js` - 优先级队列实现
2. `ErrorHandler.js` - 统一错误处理
### 修改文件
1. `taskQueue.js` - 完全重构
- 使用 PriorityQueue 替代数组
- 实现工作池模式
- 统一重试机制
- 集成错误处理
### 兼容性
- ✅ 保持原有 API 接口不变
- ✅ 数据库结构不变
---
## 🚀 后续优化建议
### 1. 监控和告警
- 添加任务执行时间监控
- 实现失败率告警
- 资源使用监控
### 2. 性能优化
- 批量更新数据库状态
- 使用 Redis 缓存热点数据
- 实现任务预取机制
### 3. 扩展功能
- 支持任务依赖关系
- 实现任务优先级动态调整
- 支持任务暂停/恢复
---
## ⚠️ 注意事项
1. **设备内串行执行**:每个设备仍然保持串行执行,确保任务顺序
2. **全局并发控制**默认最多5个设备同时执行可根据服务器性能调整
3. **状态恢复**:服务重启后会自动恢复未完成任务
4. **错误处理**:不可重试的错误会立即标记为失败,不会重试
---
## 📞 问题反馈
如遇到问题,请检查:
1. 数据库连接是否正常
2. MQTT 客户端是否初始化
3. 任务状态是否正确更新
4. 错误日志中的详细信息
---
*重构完成时间2024年*
*重构版本v2.0*

View File

@@ -1,387 +0,0 @@
# 自动找工作系统 - 项目功能总结
> 版本: v1.0 | 更新日期: 2025-12-25
## 一、项目概述
自动找工作系统(autoAiWorkSys)是一个基于AI的智能求职助手平台,通过自动化技术帮助求职者高效管理多个招聘平台账号、智能筛选匹配岗位、自动投递简历,并提供全流程的求职数据分析。系统集成Qwen 2.5 AI模型,实现简历智能分析、岗位匹配度评分、聊天内容生成等功能,大幅提升求职效率和成功率。
## 二、技术栈
### 前端技术
- **框架**: Vue 2.6.14 + Vuex 3.6.2 + Vue Router 3.5.3
- **UI组件**: View Design (iView) 4.7.0
- **构建工具**: Webpack 5
- **图表库**: ECharts
- **HTTP客户端**: 自定义 framework.http
### 后端技术
- **运行时**: Node.js
- **Web框架**: Koa 2.16.3
- **ORM**: Sequelize 5.22.5
- **数据库**: MySQL 8.0
- **消息队列**: MQTT (mqtt://192.144.167.231:1883)
- **AI模型**: Qwen 2.5 (阿里云DashScope)
- **缓存**: Redis (规划中)
- **存储**: Ali OSS
### 核心框架
- **Node Core Framework**: 自研框架,提供统一的API路由、数据库管理、日志管理
## 三、核心特性
1. **多平台账号管理** - 支持Boss直聘、猎聘等多个招聘平台,统一管理账号和授权
2. **智能简历分析** - AI评估简历竞争力(0-100分),提取技能标签,给出优势劣势和职业建议
3. **自动岗位投递** - 基于技能匹配和AI评分自动筛选岗位并投递,支持每日上限和时间范围控制
4. **AI岗位匹配** - 多维度评分(技能、经验、薪资、公司质量),自动识别外包岗位
5. **任务调度系统** - 优先级队列+MQTT通信,设备内串行、设备间并行执行
6. **数据可视化统计** - 投递成功率、面试转化率、不同平台效果对比等多维度分析
7. **设备实时监控** - 在线状态、健康度、错误信息、心跳检测
8. **完整审计日志** - 任务执行、投递记录、聊天记录全链路追踪
## 四、功能模块一览
### 4.1 前端功能模块
| 模块 | 页面路径 | 主要功能 |
|------|---------|----------|
| **首页/仪表板** | `/home` | 设备选择、账户信息卡片、今日统计、当前任务列表、近7天趋势图 |
| **账号管理** | `/account/pla_account` | 账号列表、新增/编辑、授权管理、批量位置解析、停止任务 |
| **账号详情** | `/account/pla_account_detail` | 账号基本信息、任务历史、自动化配置、运行操作面板 |
| **简历管理** | `/account/resume_info` | 简历列表、查看详情、AI分析结果展示、删除 |
| **简历详情** | `/account/resume_info_detail` | 个人信息、教育背景、工作经验、期望信息、AI评分和建议 |
| **岗位管理** | `/work/job_postings` | 岗位列表、过滤查询、打招呼、查看详情 |
| **投递记录** | `/work/apply_records` | 投递状态追踪、反馈状态、面试/Offer信息 |
| **职位类型** | `/work/job_types` | 职位类型配置、技能关键词、排除关键词 |
| **任务管理** | `/task/task_status` | 任务列表、指令详情、取消/重试操作 |
| **聊天管理** | `/chat/chat_list` | 双面板聊天界面、会话列表、AI生成回复 |
| **聊天记录** | `/chat/chat_records` | 聊天历史记录、消息类型、发送状态 |
| **系统配置** | `/system/system_config` | 系统参数配置、AI服务配置、MQTT配置 |
### 4.2 后端API模块
| 模块 | 接口前缀 | 主要功能 |
|------|---------|----------|
| **账号管理** | `/admin_api/account` | 列表、详情、新增、更新、删除、授权、停止任务、位置解析 |
| **简历管理** | `/admin_api/resume` | 列表、详情、统计、删除、AI分析、按设备获取 |
| **岗位管理** | `/admin_api/job` | 列表、详情、统计、删除、打招呼 |
| **投递记录** | `/admin_api/apply` | 列表、详情、统计、删除 |
| **聊天记录** | `/admin_api/chat` | 列表、详情、统计、删除 |
| **设备监控** | `/admin_api/device` | 列表、概览、配置更新、错误重置 |
| **任务状态** | `/admin_api/task` | 列表、详情、统计、更新、删除 |
| **数据统计** | `/admin_api/dashboard` | 综合统计、投递转化率、平台对比、设备排名 |
| **系统配置** | `/admin_api/system` | 配置列表、新增、更新、删除 |
### 4.3 核心业务流程
```
┌─────────────────────┐
│ 账号配置和授权 │
└──────────┬──────────┘
┌─────────────────────┐
│ 获取在线简历(MQTT) │ → AI分析 → 竞争力评分、技能提取、优劣势分析
└──────────┬──────────┘
┌─────────────────────┐
│ 创建自动投递任务 │
└──────────┬──────────┘
┌─────────────────────┐
│ 搜索岗位(MQTT) │ → 保存到job_postings表
└──────────┬──────────┘
┌─────────────────────┐
│ 岗位过滤和匹配 │ → 技能匹配+AI评分+外包识别
└──────────┬──────────┘
┌─────────────────────┐
│ 自动投递(MQTT) │ → 记录apply_records
└──────────┬──────────┘
┌─────────────────────┐
│ 聊天和面试跟踪 │ → AI生成聊天内容
└──────────┬──────────┘
┌─────────────────────┐
│ 数据统计和分析 │
└─────────────────────┘
```
## 五、已实现功能清单
### 5.1 账号管理模块 ✅
- ✅ 多平台账号绑定(Boss直聘、猎聘)
- ✅ 账号状态管理(启用/禁用、在线/离线、登录状态)
- ✅ 自动化开关(自动投递、自动聊天、自动活跃)
- ✅ 授权管理(设置授权日期、天数、过期时间计算)
- ✅ 职位类型配置(关联job_types)
- ✅ 投递配置(时间范围、每日上限、薪资范围、关键词过滤)
- ✅ 沟通配置(时间范围、是否沟通外包岗位)
- ✅ 活跃配置(活跃间隔、活跃动作)
- ✅ 位置解析(单个/批量,经纬度获取)
- ✅ 停止任务(取消该账号所有运行中任务)
### 5.2 简历管理模块 ✅
- ✅ 简历信息存储(个人信息、教育背景、工作经验、期望信息)
- ✅ 简历获取(通过MQTT从设备获取在线简历)
- ✅ AI竞争力评分(0-100分)
- ✅ AI技能标签提取
- ✅ AI优势劣势分析
- ✅ AI职业建议生成
- ✅ 简历与岗位匹配度计算
- ✅ 简历统计(平均竞争力、工作年限分布、竞争力分布)
- ✅ 按设备和平台查询简历
### 5.3 岗位管理模块 ✅
- ✅ 岗位信息存储(基本信息、要求、描述、薪资、地点)
- ✅ 岗位搜索(通过MQTT下发搜索指令)
- ✅ 岗位列表获取(通过MQTT获取列表)
- ✅ AI岗位匹配评分(技能、经验、薪资、公司质量)
- ✅ 外包岗位识别(规则+AI双层识别)
- ✅ 岗位过滤(技能关键词匹配、排除关键词检测)
- ✅ 综合评分计算(多维度权重评分)
- ✅ 岗位统计(总数、平均匹配度、外包比例)
- ✅ 打招呼功能(初次沟通)
### 5.4 自动投递模块 ✅
- ✅ 自动投递任务创建和调度
- ✅ 每日投递上限控制
- ✅ 投递时间范围控制(工作日/周末)
- ✅ 简历刷新检查(2小时内刷新)
- ✅ 岗位过滤和排序
- ✅ 投递指令下发(MQTT)
- ✅ 投递状态追踪(待投递、投递中、成功、失败、重复)
- ✅ 反馈状态管理(无反馈、已查看、感兴趣、不合适、面试邀约)
- ✅ 投递统计(成功率、面试转化率、Offer转化率)
### 5.5 AI分析模块 ✅
- ✅ Qwen 2.5模型集成(阿里云DashScope)
- ✅ 简历智能分析
- ✅ 技能标签提取
- ✅ 竞争力评分(0-100)
- ✅ 优势劣势分析
- ✅ 职业发展建议
- ✅ 岗位智能匹配
- ✅ 技能匹配度(0-100)
- ✅ 经验匹配度(0-100)
- ✅ 薪资合理性(0-100)
- ✅ 公司质量评分(0-100)
- ✅ 外包岗位识别
- ✅ 聊天内容生成(基础框架)
### 5.6 任务调度模块 ✅
- ✅ 优先级任务队列(堆实现,O(log n)性能)
- ✅ 并发控制(全局5设备,每设备1任务)
- ✅ 设备内串行、设备间并行执行
- ✅ 任务状态管理(待执行、执行中、成功、失败、超时、取消)
- ✅ 指数退避重试机制(最多3次)
- ✅ 任务超时检测(10分钟)
- ✅ 错误分类(可重试/不可重试)
- ✅ 任务恢复(启动时恢复未完成任务)
- ✅ 任务统计(岗位搜索数、过滤数、投递数、聊天数)
### 5.7 设备监控模块 ✅
- ✅ 设备状态追踪(在线/离线)
- ✅ 心跳检测(通过MQTT)
- ✅ 健康度评分
- ✅ 错误信息记录
- ✅ 最后心跳时间
- ✅ 设备配置更新
- ✅ 设备错误重置
- ✅ 设备概览统计(在线数、离线数、健康度排名)
### 5.8 数据统计模块 ✅
- ✅ 投递成功率统计
- ✅ 面试转化率统计
- ✅ Offer转化率统计
- ✅ 不同平台数据对比
- ✅ 设备活跃度排名
- ✅ 简历竞争力分布
- ✅ 岗位外包比例统计
- ✅ 近7天趋势图(投递、搜索、聊天)
- ✅ 今日统计(实时刷新)
### 5.9 聊天管理模块 ✅
- ✅ 聊天记录存储
- ✅ 聊天类型分类(打招呼、跟进、面试、回复)
- ✅ 发送状态追踪
- ✅ 回复检测和记录
- ✅ 回复时长统计
- ✅ 面试邀约识别
- ✅ 情感分析(积极/中性/消极)
- ✅ 效果评分
- ✅ AI生成标记
- ✅ 双面板聊天界面
### 5.10 其他功能 ✅
- ✅ 用户邀请和推广系统
- ✅ 公司信息库(上市公司数据)
- ✅ 版本管理
- ✅ 邮件服务集成
- ✅ OSS存储集成
- ✅ 地理位置服务(百度地图API)
- ✅ Swagger API文档
- ✅ 数据导出(CSV)
## 六、数据模型
### 6.1 核心表结构
| 表名 | 说明 | 关键字段 |
|------|------|---------|
| **pla_account** | 平台账号表 | sn_code, platform_type, is_online, auto_deliver, deliver_config |
| **resume_info** | 简历信息表 | resumeId, account_id, aiCompetitiveness, aiSkillTags, aiStrengths |
| **job_postings** | 岗位信息表 | jobId, platform, aiMatchScore, isOutsourcing, applyStatus |
| **apply_records** | 投递记录表 | resumeId, jobId, applyStatus, feedbackStatus, hasInterview, hasOffer |
| **chat_records** | 聊天记录表 | conversationId, chatType, isAiGenerated, hasReply, sentiment |
| **task_status** | 任务状态表 | taskType, status, priority, retryCount, progress |
| **task_commands** | 任务指令表 | taskId, commandType, commandData, response, executeTime |
| **job_types** | 职位类型表 | name, commonSkills, excludeKeywords, sortOrder |
| **device_monitor** | 设备监控表 | sn_code, is_online, health_score, last_heartbeat_time |
| **company_info** | 公司信息表 | company_name, is_listed, market_value, risk_level |
### 6.2 表关联关系
```
pla_account (1) ──→ (N) resume_info
├─→ (N) apply_records ←── (1) job_postings
│ │
│ └─→ (N) chat_records
└─→ (N) task_status ──→ (N) task_commands
pla_account (1) ──→ (1) job_types (职位类型配置)
pla_account (1) ──→ (N) device_monitor (设备监控)
```
## 七、快速开始
### 7.1 环境要求
- Node.js >= 14.x
- MySQL >= 8.0
- Redis (可选,用于缓存)
- MQTT Broker (已配置: mqtt://192.144.167.231:1883)
### 7.2 安装步骤
```bash
# 1. 克隆项目
git clone <repository-url>
cd autoAiWorkSys
# 2. 安装后端依赖
npm install
# 3. 安装前端依赖
cd admin
npm install
# 4. 配置数据库
# 编辑 config/config.js
# 设置MySQL连接信息
# 5. 初始化数据库
# 执行 _sql 目录下的SQL脚本
# 6. 启动后端服务
npm run dev
# 7. 启动前端服务(新终端)
cd admin
npm run dev
```
### 7.3 核心配置
**config/config.js** - 主配置文件
```javascript
{
db: {
host: 'localhost',
port: 3306,
database: 'auto_job',
username: 'root',
password: 'your_password'
},
mqtt: {
host: 'mqtt://192.144.167.231:1883',
clientId: 'autoAiWorkSys_server'
},
ai: {
apiKey: 'your_dashscope_api_key',
model: 'qwen-turbo' // qwen-turbo/qwen-plus/qwen-max
}
}
```
### 7.4 访问地址
- 前端管理后台: http://localhost:8080
- 后端API: http://localhost:3000/admin_api
- API文档: http://localhost:3000/api/docs
## 八、项目文件结构
```
autoAiWorkSys/
├── admin/ # 前端管理后台
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ ├── api/ # API调用
│ │ ├── router/ # 路由配置
│ │ └── store/ # Vuex状态管理
│ └── package.json
├── api/ # 后端服务
│ ├── controller_admin/ # 后台管理API
│ ├── middleware/ # 核心业务逻辑
│ │ ├── job/ # 岗位、简历、聊天管理
│ │ ├── schedule/ # 任务调度系统
│ │ └── mqtt/ # MQTT通信
│ ├── model/ # 数据库模型
│ ├── services/ # 业务服务层
│ └── utils/ # 工具函数
├── config/ # 配置文件
├── framework/ # 核心框架
├── _doc/ # 文档目录
├── _sql/ # 数据库脚本
└── package.json
```
## 九、技术亮点
1. **优先级队列** - 堆实现,O(log n)性能,比数组提升10-100倍
2. **双层过滤** - 规则过滤+AI评分,平衡性能和准确性
3. **智能重试** - 指数退避策略,区分可重试和不可重试错误
4. **MQTT通信** - 异步消息队列,高效的设备指令下发和响应
5. **AI多场景应用** - 简历分析、岗位匹配、聊天生成、外包识别
6. **完整审计** - 任务、投递、聊天全链路追踪
7. **模块化设计** - 清晰的分层架构,易于扩展和维护
## 十、性能指标
- 任务调度延迟: < 100ms
- 数据库查询: 95%在100ms内
- MQTT消息延迟: < 50ms
- 前端页面加载: < 2s
- 并发支持: 最多5个设备同时执行
---
**文档维护**: 开发团队
**最后更新**: 2025-12-25
**联系方式**: 项目Issues