Files
ALL-teach_sys/frontend_智能开发/fixInterviewQuestions.cjs
KQL cd2e307402 初始化12个产业教务系统项目
主要内容:
- 包含12个产业的完整教务系统前端代码
- 智能启动脚本 (start-industry.sh)
- 可视化产业导航页面 (index.html)
- 项目文档 (README.md)

优化内容:
- 删除所有node_modules和.yoyo文件夹,从7.5GB减少到2.7GB
- 添加.gitignore文件避免上传不必要的文件
- 自动依赖管理和智能启动系统

产业列表:
1. 文旅产业 (5150)
2. 智能制造 (5151)
3. 智能开发 (5152)
4. 财经商贸 (5153)
5. 视觉设计 (5154)
6. 交通物流 (5155)
7. 大健康 (5156)
8. 土木水利 (5157)
9. 食品产业 (5158)
10. 化工产业 (5159)
11. 能源产业 (5160)
12. 环保产业 (5161)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 14:14:14 +08:00

280 lines
8.6 KiB
JavaScript
Raw 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.

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));