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名学生已更新到班级排名列表`);
|