Files
ALL-teach_sys/frontend_视觉设计/robustReplaceQuestions.cjs
KQL 38350dca36 更新12个教务系统并优化项目大小
主要更新:
- 更新所有12个产业的教务系统数据和功能
- 删除所有 node_modules 文件夹(节省3.7GB)
- 删除所有 .yoyo 缓存文件夹(节省1.2GB)
- 删除所有 dist 构建文件(节省55MB)

项目优化:
- 项目大小从 8.1GB 减少到 3.2GB(节省60%空间)
- 保留完整的源代码和配置文件
- .gitignore 已配置,防止再次提交大文件

启动脚本:
- start-industry.sh/bat/ps1 脚本会自动检测并安装依赖
- 首次启动时自动运行 npm install
- 支持单个或批量启动产业系统

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 14:36:25 +08:00

228 lines
6.6 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

#!/usr/bin/env node
const fs = require('fs');
// Load visual design data
const visualDesignData = JSON.parse(
fs.readFileSync('网页未导入数据/视觉设计产业/视觉设计岗位简历.json', 'utf-8')
);
// Create backup
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);
const backupPath = `src/mocks/resumeInterviewMock.js.backup_${timestamp}_robust`;
const mockContent = fs.readFileSync('src/mocks/resumeInterviewMock.js', 'utf-8');
fs.writeFileSync(backupPath, mockContent);
console.log(`✓ Backup created: ${backupPath}`);
// Position mapping
const industryPositionMap = {
'UI设计': 'UI设计师',
'包装设计': '包装设计师',
'插画设计': '插画师',
'灯光': '影视灯光',
'动画设计': '动画师',
'后期特效': '特效设计师',
'剪辑': '剪辑师',
'品牌设计': '品牌视觉内容策划',
'平面设计': '平面设计师',
'三维设计': 'CG总监助理',
'摄影/摄像': '摄影师',
'室内设计': '室内设计师',
'调色': '调色师',
'新媒体运营': '新媒体运营专员',
'音频处理': '录音师',
'影视节目策划': '文案策划',
'直播': '直播专员'
};
// Extract questions from content
function extractQuestions(content, industryName) {
const questions = [];
// Updated regex to handle various formats in the source data
const patterns = [
/(\d+)\.\s*[:]?\s*(.*?)(?:\n\s*)?[:]?\s*(.*?)(?=\d+\.\s*|$)/gs,
/(\d+)[\.]\s*[:]?\s*(.*?)\n\s*[:]?\s*(.*?)(?=\d+[\.]\s*|$)/gs,
/(\d+)[:]?\s*(.*?)\n\s*[:]?\s*(.*?)(?=\d+|$)/gs
];
let matches = [];
for (const pattern of patterns) {
const tempMatches = [...content.matchAll(pattern)];
if (tempMatches.length > 0) {
matches = tempMatches;
break;
}
}
// Take up to 5 questions
for (let i = 0; i < Math.min(5, matches.length); i++) {
const match = matches[i];
const questionText = match[2].trim();
const answerText = match[3].trim();
questions.push({
id: `q1_${i + 1}`,
question: questionText,
answer: answerText
});
}
if (questions.length > 0) {
return [{
id: "group_q1",
question: `# ${industryName}面试题`,
subQuestions: questions
}];
}
return [];
}
// Function to find and replace questions for a specific industry
function replaceIndustryQuestions(content, industryName, newQuestions) {
// Find the industry section
const industryRegex = new RegExp(
`("name":\\s*"${industryName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}")`,
'g'
);
const industryMatch = industryRegex.exec(content);
if (!industryMatch) {
return null;
}
const startPos = industryMatch.index;
// Find the questions array after this industry name
const afterIndustry = content.substring(startPos);
const questionsMatch = afterIndustry.match(/"questions":\s*\[/);
if (!questionsMatch) {
return null;
}
const questionsStart = startPos + questionsMatch.index + questionsMatch[0].length;
// Find the matching closing bracket for questions array
let bracketCount = 1;
let i = questionsStart;
let inString = false;
let escapeNext = false;
while (i < content.length && bracketCount > 0) {
const char = content[i];
if (!escapeNext) {
if (char === '"' && !inString) {
inString = true;
} else if (char === '"' && inString) {
inString = false;
} else if (!inString) {
if (char === '[' || char === '{') {
bracketCount++;
} else if (char === ']' || char === '}') {
bracketCount--;
}
}
if (char === '\\') {
escapeNext = true;
}
} else {
escapeNext = false;
}
i++;
}
const questionsEnd = i - 1;
// Create the replacement string with proper indentation
const questionsStr = JSON.stringify(newQuestions, null, 2)
.split('\n')
.map(line => ' ' + line)
.join('\n');
// Replace the questions array
const newContent =
content.substring(0, questionsStart - 1) +
'\n' + questionsStr + '\n ' +
content.substring(questionsEnd + 1);
return newContent;
}
let updatedContent = mockContent;
let successCount = 0;
const failedIndustries = [];
// Process each industry
for (const [industryName, positionName] of Object.entries(industryPositionMap)) {
console.log(`Processing ${industryName}...`);
// Find interview content
const positionData = visualDesignData.find(
item => item['岗位名称'] === positionName && item['面试题内容']
);
if (!positionData) {
console.log(` ⚠️ No interview questions found for ${positionName}`);
failedIndustries.push(industryName);
continue;
}
// Extract questions
const questions = extractQuestions(positionData['面试题内容'], industryName);
if (questions.length === 0) {
console.log(` ⚠️ Could not extract questions for ${positionName}`);
failedIndustries.push(industryName);
continue;
}
// Replace questions
const newContent = replaceIndustryQuestions(updatedContent, industryName, questions);
if (newContent) {
updatedContent = newContent;
successCount++;
console.log(` ✓ Updated (using ${positionName}, ${questions[0].subQuestions.length} questions)`);
} else {
console.log(` ✗ Failed to update`);
failedIndustries.push(industryName);
}
}
// Save the updated file
fs.writeFileSync('src/mocks/resumeInterviewMock.js', updatedContent);
console.log(`\n✅ Update complete! Successfully updated ${successCount}/${Object.keys(industryPositionMap).length} industry groups`);
if (failedIndustries.length > 0) {
console.log('\n⚠ Failed industries:');
failedIndustries.forEach(name => console.log(` - ${name}`));
}
// Verify syntax
const { execSync } = require('child_process');
try {
execSync('node -c src/mocks/resumeInterviewMock.js', { encoding: 'utf-8' });
console.log('\n✅ Syntax validation passed');
// Show sample of first updated industry
if (successCount > 0) {
console.log('\n📋 Sample verification (UI设计):');
const uiMatch = updatedContent.match(/"name":\s*"UI设计"[\s\S]*?"questions":\s*\[([\s\S]*?)\]\s*}/);
if (uiMatch) {
const questionsContent = uiMatch[1];
const firstQuestion = questionsContent.match(/"question":\s*"([^"]+)"/);
if (firstQuestion) {
console.log(` First question: "${firstQuestion[1].substring(0, 50)}..."`);
}
}
}
} catch (error) {
console.error('\n❌ Syntax error detected, restoring backup...');
fs.writeFileSync('src/mocks/resumeInterviewMock.js', mockContent);
console.log('Backup restored');
console.error('Error details:', error.message);
}