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('已恢复备份'); }