Files
online_sys/frontend_智能开发/fixInterviewQuestions.cjs

280 lines
8.6 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const path = require('path');
// 读取智能开发岗位简历数据
const smartDevData = JSON.parse(
fs.readFileSync('./网页未导入数据/智能开发产业/智能开发岗位简历.json', 'utf-8')
);
// 按岗位群分组
const groupedData = {};
smartDevData.forEach(item => {
const group = item['简历岗位群'];
if (!groupedData[group]) {
groupedData[group] = {
positions: [],
questions: item['面试题'],
questionsContent: item['面试题内容']
};
}
groupedData[group].positions.push(item);
});
// 生成industries数组
const industries = [];
let industryIndex = 0;
Object.keys(groupedData).sort().forEach(groupName => {
const groupData = groupedData[groupName];
industryIndex++;
// 解析面试题 - 每个岗位群只有一个面试题卡片
const questions = [];
if (groupData.questionsContent) {
const sections = groupData.questionsContent.split(/# [一二三四五六七八九十]+、/);
// 收集所有子问题
const allSubQuestions = [];
let questionIndex = 0;
sections.forEach((section, sectionIndex) => {
if (sectionIndex === 0 || !section.trim()) return;
const lines = section.split('\n');
const sectionTitle = lines[0] ? lines[0].trim() : `${sectionIndex}部分`;
lines.forEach(line => {
const questionMatch = line.match(/^\d+\.\s+(.+)/);
const answerMatch = line.match(/^示例答案[:]\s*(.+)/);
if (questionMatch) {
questionIndex++;
const question = questionMatch[1].trim();
// 查找后续的答案
let answer = '';
const lineIndex = lines.indexOf(line);
for (let i = lineIndex + 1; i < lines.length; i++) {
if (lines[i].match(/^示例答案[:]/)) {
answer = lines[i].replace(/^示例答案[:]/, '').trim();
// 继续收集多行答案
for (let j = i + 1; j < lines.length; j++) {
if (lines[j].match(/^\d+\./)) break;
if (lines[j].trim()) {
answer += ' ' + lines[j].trim();
}
}
break;
}
}
allSubQuestions.push({
id: `q_${questionIndex}`,
question: question,
answer: answer || "请根据实际情况回答"
});
}
});
});
// 创建一个面试题卡片,包含所有问题
if (allSubQuestions.length > 0) {
// 只取前10个问题避免太多
const limitedQuestions = allSubQuestions.slice(0, 10);
questions.push({
id: `group_q1`,
question: `# ${groupData.questions || groupName + '面试题'}`,
subQuestions: limitedQuestions
});
}
}
const industry = {
id: `smartdev_${industryIndex}`,
name: groupName,
positions: groupData.positions.map((pos, index) => ({
id: `smartdev_${industryIndex}_${index + 1}`,
title: pos['岗位名称'],
level: pos['岗位等级标签'],
avatar: pos['简历头像url'],
department: groupName,
type: "全职",
experience: "1-3年",
education: "大专",
salary: "6-12K",
location: "苏州",
updateTime: "2024-01-20",
description: `负责${pos['岗位名称']}相关工作`,
requirements: extractRequirements(pos['简历内容'])
})),
questions: questions // 一个岗位群只有一个面试题卡片
};
industries.push(industry);
});
// 生成resumeTemplates对象
const resumeTemplates = {};
Object.keys(groupedData).sort().forEach(groupName => {
const groupData = groupedData[groupName];
resumeTemplates[groupName] = groupData.positions.map(pos => ({
position: pos['岗位名称'],
level: pos['岗位等级标签'],
avatar: pos['简历头像url'],
content: {
original: pos['简历内容'],
modified: pos['简历内容'] // 暂时使用相同内容
},
studentInfo: extractStudentInfo(pos['简历内容'])
}));
});
// 辅助函数提取职位要求从简历中提取核心能力前4条
function extractRequirements(resumeContent) {
const requirements = [];
const coreSkillsMatch = resumeContent.match(/### (一)核心能力\s*\n\n([\s\S]*?)### (二)/);
if (coreSkillsMatch) {
const skills = coreSkillsMatch[1].split('\n')
.filter(line => line.match(/^\d+\./))
.slice(0, 4)
.map(line => line.replace(/^\d+\.\s*/, '').trim());
return skills.length > 0 ? skills : getDefaultRequirements();
}
return getDefaultRequirements();
}
function getDefaultRequirements() {
return [
"具备相关专业知识和技能",
"熟悉行业标准和规范",
"良好的团队协作能力",
"持续学习和创新能力"
];
}
// 辅助函数:提取学生信息
function extractStudentInfo(resumeContent) {
const info = {
project_experience: {},
core_skills: [],
composite_skills: [],
personal_summary: ""
};
// 提取项目经历
const projectMatch = resumeContent.match(/### (一)项目名称[:]\s*(.+)/);
const positionMatch = resumeContent.match(/### (二)实习岗位[:]\s*(.+)/);
const timeMatch = resumeContent.match(/### [三四])实习时间[:]\s*(.+)/);
const companyMatch = resumeContent.match(/### [三四])实习单位[:]\s*(.+)/);
if (projectMatch) info.project_experience.project_name = projectMatch[1].trim();
if (positionMatch) info.project_experience.position = positionMatch[1].trim();
if (timeMatch) info.project_experience.time_period = timeMatch[1].trim();
if (companyMatch) info.project_experience.company = companyMatch[1].trim();
// 提取岗位职责
const dutiesMatch = resumeContent.match(/### (五)岗位职责[:]\s*\n\n([\s\S]*?)#/);
if (dutiesMatch) {
info.project_experience.description = dutiesMatch[1]
.split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, '').trim())
.join(' \n');
}
// 提取核心技能
const coreSkillsMatch = resumeContent.match(/### (一)核心能力\s*\n\n([\s\S]*?)### (二)/);
if (coreSkillsMatch) {
info.core_skills = coreSkillsMatch[1]
.split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, '').trim());
}
// 提取复合能力
const compositeSkillsMatch = resumeContent.match(/### (二)复合能力\s*\n\n([\s\S]*?)#/);
if (compositeSkillsMatch) {
info.composite_skills = compositeSkillsMatch[1]
.split('\n')
.filter(line => line.match(/^\d+\./))
.map(line => line.replace(/^\d+\.\s*/, '').split(/[:]/)[0].trim())
.slice(0, 2);
}
// 提取个人总结
const summaryMatch = resumeContent.match(/# 三、个人[总评][结价]\s*\n\n([\s\S]*?)$/);
if (summaryMatch) {
info.personal_summary = summaryMatch[1].trim();
}
return info;
}
// 生成最终的Mock数据结构
const mockData = `// 简历与面试题Mock数据
// 岗位群列表
const industries = ${JSON.stringify(industries, null, 2)};
// 简历模板数据
const resumeTemplates = ${JSON.stringify(resumeTemplates, null, 2)};
// 我的简历数据
const myResume = {
personalInfo: {
name: "张明",
phone: "138****8888",
email: "zhangming@example.com",
age: 22,
education: "苏州信息职业技术学院 2020.9-2023.6",
experience: "应届毕业生",
location: "苏州"
},
workExperience: [
{
company: "苏州某智能科技企业",
position: "AI开发实习生",
duration: "2023.03-2023.06",
description: "负责AI模型开发与应用相关工作"
}
],
skills: ["Python编程", "机器学习", "深度学习", "数据分析"],
projects: [
{
name: "智能应用开发项目",
role: "AI开发实习生",
duration: "2023.04-2023.06",
description: "参与智能应用的模型开发和部署"
}
]
};
// 获取页面mock数据的函数
export function getMockPageData() {
return resumeInterviewMockData;
}
// 导出合并的数据
export const resumeInterviewMockData = {
industries,
resumeTemplates,
myResume
};`;
// 写入修复后的数据
fs.writeFileSync('./src/mocks/resumeInterviewMock.js', mockData, 'utf-8');
console.log('面试题结构修复完成!');
console.log(`- 生成了 ${industries.length} 个岗位群`);
console.log('- 每个岗位群只有一个面试题卡片');
console.log('- 每个面试题卡片最多包含10个问题');
// 输出第一个岗位群的面试题结构作为示例
console.log('\n示例第一个岗位群的面试题结构:');
console.log(JSON.stringify(industries[0].questions, null, 2));