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 sortedStudents = [...financeProfileData].sort((a, b) => { return parseInt(b["学分"]) - parseInt(a["学分"]); }); // 重新分配正确的排名 sortedStudents.forEach((student, index) => { student.correctRank = index + 1; }); // 为学生分配头像 const studentAvatars = {}; sortedStudents.forEach((student, index) => { studentAvatars[student["学员名称"]] = avatarList[index % avatarList.length].url; }); // 找到罗浩宇 const luoHaoyu = sortedStudents.find(s => s["学员名称"] === "罗浩宇"); const luoHaoyuRank = luoHaoyu ? luoHaoyu.correctRank : 6; // 创建完整的班级排名数据 const fullClassRanking = sortedStudents.map((student) => { return { id: student.correctRank, name: student["学员名称"], studentName: student["学员名称"], // 兼容性字段 score: parseInt(student["学分"]), rank: student.correctRank, studentId: student["学号"], school: student["学校名称"], major: student["专业名称"], mbti: student["MBTI"], verticalDirection: student["垂直方向"], avatar: studentAvatars[student["学员名称"]], isCurrentUser: student["学员名称"] === "罗浩宇" }; }); // 读取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. 更新ranking.topStudents(前10名用于Dashboard) const topStudentsStr = ` topStudents: ${JSON.stringify(fullClassRanking.slice(0, 10), null, 8).replace(/\n/g, '\n ')}`; // 替换topStudents mockDataContent = mockDataContent.replace( /topStudents:\s*\[[^\]]*\](?=,[\s\n]*[}])/s, topStudentsStr ); // 2. 更新classRanking数组(前10名) const classRankingStr = ` classRanking: ${JSON.stringify(fullClassRanking.slice(0, 10), null, 4).replace(/\n/g, '\n ')}`; // 替换classRanking数组 mockDataContent = mockDataContent.replace( /classRanking:\s*\[[^\]]*\]/s, classRankingStr ); // 3. 更新ranking.myRank const myRankStr = ` myRank: { rank: ${luoHaoyuRank}, totalStudents: ${sortedStudents.length}, trend: "stable", change: 0, }`; // 替换myRank mockDataContent = mockDataContent.replace( /myRank:\s*\{[^}]*\}/g, myRankStr ); // 4. 更新user对象的classRank mockDataContent = mockDataContent.replace( /classRank:\s*\d+/g, `classRank: ${luoHaoyuRank}` ); // 5. 更新profileOverview中的相关字段 if (luoHaoyu) { // 更新classRank mockDataContent = mockDataContent.replace( /classRank:\s*\d+(?=,[\s\n]*totalStudents)/g, `classRank: ${luoHaoyuRank}` ); // 更新myRank对象 const profileMyRankStr = ` myRank: { rank: ${luoHaoyuRank}, score: ${luoHaoyu["学分"]}, }`; mockDataContent = mockDataContent.replace( /myRank:\s*\{[^}]*rank:[^}]*\}/g, profileMyRankStr ); } // 6. 更新profileOverview.ranking.rankings(前10名) const rankingsStr = ` rankings: ${JSON.stringify(fullClassRanking.slice(0, 10), null, 10).replace(/\n/g, '\n ')}`; // 替换rankings数组 mockDataContent = mockDataContent.replace( /rankings:\s*\[[^\]]*\](?=,?\s*\},\s*\/\/\s*个人评价)/s, rankingsStr ); // 写入更新后的文件 fs.writeFileSync(mockDataPath, mockDataContent, 'utf-8'); console.log(`\n成功修复班级排名数据:`); console.log(`- 罗浩宇排名:第${luoHaoyuRank}名(学分:${luoHaoyu?.["学分"]})`); console.log(`- 班级总人数:${sortedStudents.length}`); console.log('\n前5名学生:'); fullClassRanking.slice(0, 5).forEach(s => { console.log(` ${s.rank}. ${s.name} - ${s.score}分`); });