Files
online_sys/frontend_智能开发/fixDataStructure.js
KQL a7242f0c69 Initial commit: 教务系统在线平台
- 包含4个产业方向的前端项目:智能开发、智能制造、大健康、财经商贸
- 已清理node_modules、.yoyo等大文件,项目大小从2.6GB优化至631MB
- 配置完善的.gitignore文件

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-12 18:16:55 +08:00

212 lines
7.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 修复智能制造数据结构问题
import fs from 'fs';
// 读取智能制造岗位简历数据
const manufacturingData = JSON.parse(
fs.readFileSync('网页未导入数据/智能制造产业/智能制造岗位简历.json', 'utf8')
);
// 按岗位群分组
const groupedData = {};
manufacturingData.forEach(item => {
const groupName = item['简历岗位群'];
if (!groupedData[groupName]) {
groupedData[groupName] = [];
}
groupedData[groupName].push(item);
});
// 转换为industries格式添加avatar字段
const industries = Object.entries(groupedData).map(([groupName, positions], index) => {
const groupId = `manufacturing_${index + 1}`;
const positionList = positions.map((pos, posIndex) => ({
id: `${groupId}_${posIndex + 1}`,
title: pos['岗位名称'],
level: pos['岗位等级标签'],
avatar: pos['简历头像url'] || "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFXZhkWje7.jpeg", // 添加avatar字段
department: groupName,
type: "全职",
experience: getExperienceByLevel(pos['岗位等级标签']),
education: "大专",
salary: pos['岗位等级标签'] === '技术骨干岗' ? "8-15K" : "5-10K",
location: "苏州",
updateTime: "2024-01-20",
description: `负责${pos['岗位名称']}相关工作,包括${extractMainTasks(pos['简历内容'])}`,
requirements: extractRequirements(pos['简历内容'])
}));
const questions = extractQuestions(positions[0]['面试题内容']);
return {
id: groupId,
name: groupName,
positions: positionList,
questions: questions
};
});
// 根据岗位等级获取经验要求
function getExperienceByLevel(level) {
switch(level) {
case '技术骨干岗': return "2-5年";
case '基础岗': return "0-2年";
default: return "1-3年";
}
}
// 提取主要任务描述
function extractMainTasks(resumeContent) {
const taskMatch = resumeContent.match(/### (五)岗位职责[:]?\s*([\s\S]*?)(?=# 二、|$)/);
if (taskMatch) {
const tasks = taskMatch[1].split('\n')
.filter(line => line.match(/^\d+\./))
.slice(0, 3)
.map(line => line.replace(/^\d+\.\s*/, '').split('')[0])
.join('、');
return tasks || "相关技术工作";
}
return "相关技术工作";
}
// 提取岗位要求
function extractRequirements(resumeContent) {
const coreMatch = resumeContent.match(/### (一)核心能力\s*([\s\S]*?)(?=###|$)/);
if (coreMatch) {
const lines = coreMatch[1].split('\n')
.filter(line => line.match(/^\d+\./))
.slice(0, 4)
.map(line => line.replace(/^\d+\.\s*/, '').trim());
return lines.length > 0 ? lines : ["熟悉相关岗位工作", "具有良好的沟通能力", "有相关工作经验优先"];
}
return ["熟悉相关岗位工作", "具有良好的沟通能力", "有相关工作经验优先"];
}
// 提取面试题
function extractQuestions(questionContent) {
if (!questionContent) return [];
const sections = questionContent.split(/# \w+、/).filter(s => s.trim());
const questions = [];
sections.forEach((section, sectionIndex) => {
const lines = section.split('\n').filter(line => line.trim());
const title = lines[0] || `面试题组${sectionIndex + 1}`;
const subQuestions = [];
for (let i = 1; i < lines.length; i++) {
if (lines[i].match(/^\d+\./)) {
const question = lines[i].replace(/^\d+\.\s*/, '').trim();
let answer = "请根据实际情况回答";
// 查找答案
for (let j = i + 1; j < lines.length && j < i + 5; j++) {
if (lines[j].includes('示例答案') || lines[j].includes('答案:')) {
answer = lines[j].replace(/.*?示例答案[:]?\s*/, '').replace(/.*?答案[:]?\s*/, '').trim();
break;
}
}
subQuestions.push({
id: `q${sectionIndex}_${subQuestions.length + 1}`,
question: question,
answer: answer
});
}
}
if (subQuestions.length > 0) {
questions.push({
id: `group_q${sectionIndex + 1}`,
question: title,
subQuestions: subQuestions.slice(0, 8)
});
}
});
return questions;
}
// 生成按行业分组的简历模板数据 - 按照原来的数据结构
const resumeTemplates = {};
manufacturingData.forEach((item) => {
const industryName = item['简历岗位群']; // 使用岗位群作为行业名称
if (!resumeTemplates[industryName]) {
resumeTemplates[industryName] = [];
}
// 提取项目经历
const projectMatch = item['简历内容'].match(/### (一)项目名称[:]?\s*(.+)/);
const positionMatch = item['简历内容'].match(/### (二)实习岗位[:]?\s*(.+)/);
const timeMatch = item['简历内容'].match(/### (三)实习时间[:]?\s*(.+)/);
const companyMatch = item['简历内容'].match(/### (四)实习单位[:]?\s*(.+)/);
const dutiesMatch = item['简历内容'].match(/### (五)岗位职责[:]?\s*([\s\S]*?)(?=# 二、|$)/);
// 提取技能
const coreSkillsMatch = item['简历内容'].match(/### (一)核心能力\s*([\s\S]*?)(?=###|$)/);
const compoundSkillsMatch = item['简历内容'].match(/### (二)复合能力\s*([\s\S]*?)(?=# 三、|$)/);
// 提取个人总结
const summaryMatch = item['简历内容'].match(/# 三、个人总结\s*([\s\S]*?)$/);
const templateItem = {
position: item['岗位名称'],
level: item['岗位等级标签'],
avatar: item['简历头像url'],
content: {
original: item['简历内容'],
modified: item['简历内容'] // 可以根据需要设置不同的内容
},
studentInfo: {
project_experience: {
project_name: projectMatch ? projectMatch[1].trim() : "智能制造项目",
position: positionMatch ? positionMatch[1].trim() : item['岗位名称'],
time_period: timeMatch ? timeMatch[1].trim() : "2023.09 - 2024.01",
company: companyMatch ? companyMatch[1].trim() : "苏州智能制造有限公司",
description: dutiesMatch ?
dutiesMatch[1].trim()
.split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, ''))
.join('\n') : ""
},
core_skills: coreSkillsMatch ?
coreSkillsMatch[1].split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, '').trim()) : [],
compound_skills: compoundSkillsMatch ?
compoundSkillsMatch[1].split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, '').trim()) : [],
personal_summary: summaryMatch ? summaryMatch[1].trim() : ""
}
};
resumeTemplates[industryName].push(templateItem);
});
// 输出结果
const output = {
industries,
resumeTemplates,
totalPositions: industries.reduce((sum, ind) => sum + ind.positions.length, 0),
totalGroups: industries.length
};
// 写入文件
fs.writeFileSync('fixedManufacturingDataStructure.json', JSON.stringify(output, null, 2), 'utf8');
console.log(`修复完成!
- 岗位群数量: ${output.totalGroups}
- 岗位总数: ${output.totalPositions}
- 简历模板组数: ${Object.keys(resumeTemplates).length}
- 简历模板总数: ${Object.values(resumeTemplates).reduce((sum, templates) => sum + templates.length, 0)}
修复内容:
- ✅ 添加了岗位avatar字段
- ✅ 优化了岗位描述和经验要求
- ✅ 修复了简历模板数据结构 - 按行业分组
- ✅ 完善了面试题数据
`);