225 lines
6.7 KiB
JavaScript
225 lines
6.7 KiB
JavaScript
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
|
|||
|
|
// 读取视觉设计岗位简历数据
|
|||
|
|
const positionsData = JSON.parse(
|
|||
|
|
fs.readFileSync('网页未导入数据/视觉设计产业/视觉设计岗位简历.json', 'utf-8')
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 读取mock文件
|
|||
|
|
const mockFile = 'src/mocks/resumeInterviewMock.js';
|
|||
|
|
let mockContent = fs.readFileSync(mockFile, 'utf-8');
|
|||
|
|
|
|||
|
|
// 创建备份
|
|||
|
|
const backup = `${mockFile}.backup_${Date.now()}`;
|
|||
|
|
fs.writeFileSync(backup, mockContent);
|
|||
|
|
console.log(`备份已创建: ${backup}`);
|
|||
|
|
|
|||
|
|
// 提取visualDesignIndustries数据
|
|||
|
|
const startMatch = mockContent.match(/const visualDesignIndustries = \[/);
|
|||
|
|
if (!startMatch) {
|
|||
|
|
console.error('未找到visualDesignIndustries');
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 找到数组的结束位置
|
|||
|
|
let startPos = startMatch.index;
|
|||
|
|
let bracketCount = 0;
|
|||
|
|
let inArray = false;
|
|||
|
|
let endPos = startPos;
|
|||
|
|
|
|||
|
|
for (let i = startPos; i < mockContent.length; i++) {
|
|||
|
|
if (mockContent[i] === '[') {
|
|||
|
|
bracketCount++;
|
|||
|
|
inArray = true;
|
|||
|
|
} else if (mockContent[i] === ']') {
|
|||
|
|
bracketCount--;
|
|||
|
|
if (bracketCount === 0 && inArray) {
|
|||
|
|
endPos = i + 1;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提取数组内容并解析
|
|||
|
|
const arrayStr = mockContent.substring(startPos, endPos + 1);
|
|||
|
|
let visualDesignIndustries;
|
|||
|
|
try {
|
|||
|
|
// 使用eval解析(因为文件中是JS而不是JSON)
|
|||
|
|
eval('visualDesignIndustries = ' + arrayStr.replace('const visualDesignIndustries = ', ''));
|
|||
|
|
} catch (e) {
|
|||
|
|
console.error('解析失败:', e);
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 岗位到产业的映射
|
|||
|
|
const positionToIndustry = {
|
|||
|
|
"包装设计师": "包装设计",
|
|||
|
|
"插画师": "插画设计",
|
|||
|
|
"影视灯光": "灯光",
|
|||
|
|
"角色原画师": "动画设计",
|
|||
|
|
"特效设计师": "后期特效",
|
|||
|
|
"剪辑师": "剪辑",
|
|||
|
|
"品牌视觉内容策划": "品牌设计",
|
|||
|
|
"平面设计师": "平面设计",
|
|||
|
|
"3D建模师": "三维设计",
|
|||
|
|
"影视摄像": "摄影/摄像",
|
|||
|
|
"室内设计师": "室内设计",
|
|||
|
|
"调色师": "调色",
|
|||
|
|
"自媒体运营专员": "新媒体运营",
|
|||
|
|
"音效设计师": "音频处理",
|
|||
|
|
"导演": "影视节目策划",
|
|||
|
|
"直播运营": "直播"
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 提取面试题函数
|
|||
|
|
function extractQuestions(interviewContent) {
|
|||
|
|
const questions = [];
|
|||
|
|
const lines = interviewContent.split('\n');
|
|||
|
|
let currentQuestion = null;
|
|||
|
|
let currentAnswer = '';
|
|||
|
|
let collectingAnswer = false;
|
|||
|
|
|
|||
|
|
for (const line of lines) {
|
|||
|
|
const lineStripped = line.trim();
|
|||
|
|
|
|||
|
|
// 检测问题行
|
|||
|
|
if (lineStripped && lineStripped[0] && lineStripped[0].match(/\d/) &&
|
|||
|
|
(lineStripped.includes('问题') || lineStripped.includes(':'))) {
|
|||
|
|
// 保存上一个问题
|
|||
|
|
if (currentQuestion) {
|
|||
|
|
let answer = currentAnswer.trim();
|
|||
|
|
if (answer.length > 400) {
|
|||
|
|
answer = answer.substring(0, 400) + '...';
|
|||
|
|
}
|
|||
|
|
questions.push({
|
|||
|
|
question: currentQuestion,
|
|||
|
|
answer: answer || "请根据您的实际经验和项目情况进行回答。"
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提取新问题
|
|||
|
|
let questionText = '';
|
|||
|
|
if (lineStripped.includes('问题:')) {
|
|||
|
|
questionText = lineStripped.split('问题:')[1]?.trim() || '';
|
|||
|
|
} else if (lineStripped.includes('问题:')) {
|
|||
|
|
questionText = lineStripped.split('问题:')[1]?.trim() || '';
|
|||
|
|
} else if (lineStripped.includes('. ')) {
|
|||
|
|
const parts = lineStripped.split('. ');
|
|||
|
|
questionText = parts[1]?.trim() || '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
currentQuestion = questionText;
|
|||
|
|
currentAnswer = '';
|
|||
|
|
collectingAnswer = false;
|
|||
|
|
}
|
|||
|
|
// 检测答案开始
|
|||
|
|
else if (['参考回答:', '参考答案:', '答案:'].some(marker => line.includes(marker))) {
|
|||
|
|
collectingAnswer = true;
|
|||
|
|
for (const marker of ['参考回答:', '参考答案:', '答案:']) {
|
|||
|
|
if (line.includes(marker)) {
|
|||
|
|
const answerPart = line.split(marker)[1]?.trim();
|
|||
|
|
if (answerPart) {
|
|||
|
|
currentAnswer = answerPart;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 收集答案内容
|
|||
|
|
else if (collectingAnswer && lineStripped) {
|
|||
|
|
if (lineStripped.startsWith('#') ||
|
|||
|
|
(lineStripped[0] && lineStripped[0].match(/\d/) && lineStripped.includes('问题'))) {
|
|||
|
|
collectingAnswer = false;
|
|||
|
|
} else {
|
|||
|
|
if (currentAnswer) currentAnswer += ' ';
|
|||
|
|
currentAnswer += lineStripped;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 保存最后一个问题
|
|||
|
|
if (currentQuestion) {
|
|||
|
|
let answer = currentAnswer.trim();
|
|||
|
|
if (answer.length > 400) {
|
|||
|
|
answer = answer.substring(0, 400) + '...';
|
|||
|
|
}
|
|||
|
|
questions.push({
|
|||
|
|
question: currentQuestion,
|
|||
|
|
answer: answer || "请根据您的实际经验和项目情况进行回答。"
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return questions.slice(0, 16); // 最多16个问题
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新产业面试题
|
|||
|
|
let updateCount = 0;
|
|||
|
|
for (const industry of visualDesignIndustries) {
|
|||
|
|
if (industry.name === 'UI设计') continue; // 跳过已更新的
|
|||
|
|
|
|||
|
|
// 找到对应的岗位数据
|
|||
|
|
const positionName = Object.keys(positionToIndustry).find(
|
|||
|
|
key => positionToIndustry[key] === industry.name
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (!positionName) {
|
|||
|
|
console.log(`未找到 ${industry.name} 对应的岗位`);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const positionData = positionsData.find(p => p['岗位名称'] === positionName);
|
|||
|
|
if (!positionData || !positionData['面试题内容']) {
|
|||
|
|
console.log(`未找到 ${positionName} 的面试题`);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提取面试题
|
|||
|
|
const questions = extractQuestions(positionData['面试题内容']);
|
|||
|
|
if (questions.length === 0) {
|
|||
|
|
console.log(`${industry.name} 没有有效的面试题`);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`更新 ${industry.name}: ${questions.length} 个问题`);
|
|||
|
|
|
|||
|
|
// 构建新的questions数组
|
|||
|
|
const subQuestions = questions.map((qa, index) => ({
|
|||
|
|
id: `${industry.questions[0].subQuestions[0].id.split('_')[0]}_${index + 1}`,
|
|||
|
|
question: qa.question,
|
|||
|
|
answer: qa.answer
|
|||
|
|
}));
|
|||
|
|
|
|||
|
|
// 更新industry的questions
|
|||
|
|
industry.questions = [{
|
|||
|
|
id: industry.questions[0].id,
|
|||
|
|
question: `# ${industry.name}面试题`,
|
|||
|
|
subQuestions: subQuestions
|
|||
|
|
}];
|
|||
|
|
|
|||
|
|
updateCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 将更新后的数组转回字符串
|
|||
|
|
const updatedArrayStr = 'const visualDesignIndustries = ' +
|
|||
|
|
JSON.stringify(visualDesignIndustries, null, 2) + ';';
|
|||
|
|
|
|||
|
|
// 替换文件内容
|
|||
|
|
const newMockContent = mockContent.substring(0, startPos) +
|
|||
|
|
updatedArrayStr +
|
|||
|
|
mockContent.substring(endPos + 1);
|
|||
|
|
|
|||
|
|
// 写入文件
|
|||
|
|
fs.writeFileSync(mockFile, newMockContent);
|
|||
|
|
console.log(`\n成功更新 ${updateCount} 个产业的面试题`);
|
|||
|
|
|
|||
|
|
// 验证语法
|
|||
|
|
const { execSync } = require('child_process');
|
|||
|
|
try {
|
|||
|
|
execSync(`node -c ${mockFile}`);
|
|||
|
|
console.log('✓ 语法验证通过');
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('❌ 语法错误,恢复备份');
|
|||
|
|
fs.writeFileSync(mockFile, mockContent);
|
|||
|
|
console.log('已恢复备份');
|
|||
|
|
}
|