主要内容: - 包含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>
208 lines
7.4 KiB
JavaScript
208 lines
7.4 KiB
JavaScript
import fs from 'fs';
|
||
import path from 'path';
|
||
import { fileURLToPath } from 'url';
|
||
|
||
const __filename = fileURLToPath(import.meta.url);
|
||
const __dirname = path.dirname(__filename);
|
||
|
||
// 读取财经商贸个人档案数据
|
||
const financeProfileData = JSON.parse(
|
||
fs.readFileSync(path.join(__dirname, '网页未导入数据/财经商贸产业/财经商贸个人档案.json'), 'utf-8')
|
||
);
|
||
|
||
// 读取头像列表
|
||
const avatarList = JSON.parse(
|
||
fs.readFileSync(path.join(__dirname, '网页未导入数据/头像列表.json'), 'utf-8')
|
||
);
|
||
|
||
// 找到罗浩宇的数据(作为当前用户)
|
||
const currentUser = financeProfileData.find(student => student["学员名称"] === "罗浩宇");
|
||
const currentUserAvatar = avatarList[16].url; // 为罗浩宇选择第17个头像
|
||
|
||
// 为其他学生分配头像
|
||
const studentAvatars = {};
|
||
financeProfileData.forEach((student, index) => {
|
||
// 确保每个学生都有不同的头像
|
||
studentAvatars[student["学员名称"]] = avatarList[index % avatarList.length].url;
|
||
});
|
||
|
||
// 创建班级排名数据
|
||
const classRankingData = financeProfileData.map((student, index) => {
|
||
return {
|
||
id: index + 1,
|
||
name: student["学员名称"],
|
||
studentName: student["学员名称"], // 添加studentName字段兼容性
|
||
score: parseInt(student["学分"]),
|
||
rank: parseInt(student["班级排名"]),
|
||
studentId: student["学号"],
|
||
school: student["学校名称"],
|
||
major: student["专业名称"],
|
||
mbti: student["MBTI"],
|
||
verticalDirection: student["垂直方向"],
|
||
avatar: studentAvatars[student["学员名称"]],
|
||
isCurrentUser: student["学员名称"] === "罗浩宇" // 标记当前用户
|
||
};
|
||
});
|
||
|
||
// 按排名排序
|
||
classRankingData.sort((a, b) => a.rank - b.rank);
|
||
|
||
// 读取mockData.js文件
|
||
const mockDataPath = path.join(__dirname, 'src/data/mockData.js');
|
||
let mockDataContent = fs.readFileSync(mockDataPath, 'utf-8');
|
||
|
||
// 备份原文件
|
||
const backupPath = path.join(__dirname, 'src/data', `mockData.js.backup_${new Date().toISOString().replace(/[:.]/g, '-')}`);
|
||
fs.copyFileSync(mockDataPath, backupPath);
|
||
console.log(`备份已创建: ${backupPath}`);
|
||
|
||
// 1. 更新user对象(个人信息板块)
|
||
const userObjectStr = `user: {
|
||
name: "${currentUser["学员名称"]}",
|
||
avatar: "${currentUserAvatar}",
|
||
role: "学生",
|
||
studentId: "${currentUser["学号"]}",
|
||
school: "${currentUser["学校名称"]}",
|
||
major: "${currentUser["专业名称"]}",
|
||
credits: ${currentUser["学分"]},
|
||
classRank: ${currentUser["班级排名"]},
|
||
mbti: "${currentUser["MBTI"]}",
|
||
verticalDirection: "${currentUser["垂直方向"]}",
|
||
industry: "财经商贸"
|
||
}`;
|
||
|
||
// 替换user对象
|
||
mockDataContent = mockDataContent.replace(
|
||
/user:\s*\{[^}]*\}/s,
|
||
userObjectStr
|
||
);
|
||
|
||
// 2. 更新profile对象
|
||
const profileObjectStr = `profile: {
|
||
name: "${currentUser["学员名称"]}",
|
||
gender: "男",
|
||
studentId: "${currentUser["学号"]}",
|
||
avatar: "${currentUserAvatar}",
|
||
school: "${currentUser["学校名称"]}",
|
||
major: "${currentUser["专业名称"]}",
|
||
courses: ["复合能力培养", "财经商贸方向", "电商运营", "数字营销"],
|
||
className: "财经商贸",
|
||
studyPhase: "复合能力培养",
|
||
badges: {
|
||
credits: ${currentUser["学分"]},
|
||
classRank: ${currentUser["班级排名"]},
|
||
mbti: "${currentUser["MBTI"]}",
|
||
},`;
|
||
|
||
// 替换profile对象的开头部分
|
||
mockDataContent = mockDataContent.replace(
|
||
/profile:\s*\{[^}]*badges:\s*\{[^}]*\},/s,
|
||
profileObjectStr
|
||
);
|
||
|
||
// 3. 更新classRanking数组
|
||
const classRankingStr = `classRanking: ${JSON.stringify(classRankingData.slice(0, 10), null, 4).replace(/\n/g, '\n ')}`;
|
||
|
||
// 替换classRanking数组
|
||
mockDataContent = mockDataContent.replace(
|
||
/classRanking:\s*\[[^\]]*\]/s,
|
||
classRankingStr
|
||
);
|
||
|
||
// 4. 更新profileOverview对象
|
||
// 查找profileOverview的位置
|
||
const profileOverviewMatch = mockDataContent.match(/mockData\.profileOverview\s*=\s*\{/);
|
||
if (profileOverviewMatch) {
|
||
// 构建新的studentInfo对象
|
||
const studentInfoStr = ` // 学生基本信息
|
||
studentInfo: {
|
||
name: "${currentUser["学员名称"]}",
|
||
realName: "${currentUser["学员名称"]}",
|
||
studentId: "${currentUser["学号"]}",
|
||
studentNo: "${currentUser["学号"]}",
|
||
avatar: "${currentUserAvatar}",
|
||
school: "${currentUser["学校名称"]}",
|
||
major: "${currentUser["专业名称"]}",
|
||
className: "财经商贸班",
|
||
grade: "2023级",
|
||
studyPhase: "复合能力培养",
|
||
stageName: "${currentUser["垂直方向"]}",
|
||
mbti: "${currentUser["MBTI"]}",
|
||
mbtiType: "${currentUser["MBTI"]}",
|
||
enrollmentDate: "2023-09-01",
|
||
expectedGraduation: "2026-06-30",
|
||
credits: ${currentUser["学分"]},
|
||
gpa: 4.2,
|
||
classRank: ${currentUser["班级排名"]},
|
||
totalStudents: ${financeProfileData.length},
|
||
myRank: {
|
||
rank: ${currentUser["班级排名"]},
|
||
score: ${currentUser["学分"]},
|
||
},
|
||
},`;
|
||
|
||
// 替换studentInfo部分
|
||
mockDataContent = mockDataContent.replace(
|
||
/\/\/\s*学生基本信息\s*\n\s*studentInfo:\s*\{[^}]*myRank:\s*\{[^}]*\},[^}]*\},/s,
|
||
studentInfoStr
|
||
);
|
||
|
||
// 更新ranking对象中的topStudents
|
||
const topStudentsStr = ` topStudents: ${JSON.stringify(classRankingData.slice(0, 5).map(s => ({
|
||
...s,
|
||
studentName: s.name // 确保字段兼容性
|
||
})), null, 8).replace(/\n/g, '\n ')}`;
|
||
|
||
// 替换topStudents部分
|
||
mockDataContent = mockDataContent.replace(
|
||
/topStudents:\s*\[[^\]]*\]/s,
|
||
topStudentsStr
|
||
);
|
||
|
||
// 更新ranking.rankings数组
|
||
const rankingsStr = ` rankings: ${JSON.stringify(classRankingData.slice(0, 10).map(s => ({
|
||
...s,
|
||
studentName: s.name // 确保字段兼容性
|
||
})), null, 10).replace(/\n/g, '\n ')}`;
|
||
|
||
// 替换rankings部分
|
||
mockDataContent = mockDataContent.replace(
|
||
/rankings:\s*\[[^\]]*\](?=,?\s*\},\s*\/\/\s*个人评价)/s,
|
||
rankingsStr
|
||
);
|
||
}
|
||
|
||
// 5. 更新ClassRankModal组件的数据引用
|
||
const classRankModalPath = path.join(__dirname, 'src/components/ClassRankModal/index.jsx');
|
||
if (fs.existsSync(classRankModalPath)) {
|
||
let classRankModalContent = fs.readFileSync(classRankModalPath, 'utf-8');
|
||
|
||
// 备份ClassRankModal文件
|
||
const classRankModalBackup = path.join(__dirname, 'src/components/ClassRankModal', `index.jsx.backup_${new Date().toISOString().replace(/[:.]/g, '-')}`);
|
||
fs.copyFileSync(classRankModalPath, classRankModalBackup);
|
||
|
||
// 更新头像映射
|
||
const avatarMappingStr = classRankingData.slice(0, 10).reduce((acc, student) => {
|
||
acc[student.name] = student.avatar;
|
||
return acc;
|
||
}, {});
|
||
|
||
// 查找并替换头像映射部分(如果存在)
|
||
const avatarMappingPattern = /const\s+avatarMapping\s*=\s*\{[^}]*\}/s;
|
||
if (avatarMappingPattern.test(classRankModalContent)) {
|
||
classRankModalContent = classRankModalContent.replace(
|
||
avatarMappingPattern,
|
||
`const avatarMapping = ${JSON.stringify(avatarMappingStr, null, 4)}`
|
||
);
|
||
fs.writeFileSync(classRankModalPath, classRankModalContent, 'utf-8');
|
||
console.log('成功更新ClassRankModal组件头像映射');
|
||
}
|
||
}
|
||
|
||
// 写入更新后的mockData.js
|
||
fs.writeFileSync(mockDataPath, mockDataContent, 'utf-8');
|
||
|
||
console.log(`成功更新个人信息和班级排名数据`);
|
||
console.log(`- 当前用户:${currentUser["学员名称"]} (排名: ${currentUser["班级排名"]})`);
|
||
console.log(`- 班级总人数:${financeProfileData.length}`);
|
||
console.log(`- 前10名学生已更新到班级排名列表`); |