#!/usr/bin/env python3 """更新主页班级排名板块和弹窗数据为视觉设计产业数据""" import json import os import re from datetime import datetime def load_visual_profile_data(): """加载视觉设计个人档案数据""" file_path = '网页未导入数据/视觉设计产业/视觉设计个人档案.json' with open(file_path, 'r', encoding='utf-8') as f: return json.load(f) def load_avatar_list(): """加载头像列表""" file_path = '网页未导入数据/头像列表.json' with open(file_path, 'r', encoding='utf-8') as f: avatars = json.load(f) # 提取简短的URL(不包含签名参数) avatar_urls = [] for avatar in avatars[:20]: # 取前20个头像 url = avatar['file_url'] # 提取基本URL(去掉?后面的部分) base_url = url.split('?')[0] if '?' in url else url avatar_urls.append(base_url) return avatar_urls def transform_to_class_ranking(profile_data, avatar_urls): """转换为classRanking格式""" class_ranking = [] for idx, student in enumerate(profile_data[:10]): # 取前10名 ranking_item = { "id": idx + 1, "name": student["学员名称"], "score": int(student["学分"]), "rank": int(student["班级排名"]), "studentId": student["学号"], "school": student["学校名称"], "major": student["专业名称"], "mbti": student["MBTI"], "verticalDirection": student["垂直方向"] } # 第10名(李沐阳)标记为当前用户 if idx == 9: # 索引9是第10名 ranking_item["isCurrentUser"] = True class_ranking.append(ranking_item) return class_ranking def transform_to_top_students(profile_data, avatar_urls): """转换为topStudents格式""" top_students = [] for idx, student in enumerate(profile_data[:10]): # 取前10名 top_student = { "rank": int(student["班级排名"]), "studentId": student["学号"], "studentName": student["学员名称"], "name": student["学员名称"], "avatar": avatar_urls[idx % len(avatar_urls)], "score": int(student["学分"]), "credits": int(student["学分"]), "school": student["学校名称"], "major": student["专业名称"], "isMe": idx == 9 # 第10名(李沐阳)是当前用户 } top_students.append(top_student) return top_students def transform_to_rankings(profile_data, avatar_urls): """转换为profileOverview.ranking.rankings格式""" rankings = [] for idx, student in enumerate(profile_data[:10]): # 取前10名 ranking = { "rank": int(student["班级排名"]), "studentId": student["学号"], "studentName": student["学员名称"], "name": student["学员名称"], "avatar": avatar_urls[idx % len(avatar_urls)], "score": int(student["学分"]), "credits": int(student["学分"]), "school": student["学校名称"], "major": student["专业名称"], "isMe": idx == 9 # 第10名(李沐阳)是当前用户 } rankings.append(ranking) return rankings def update_mock_data_file(): """更新mockData.js文件中的班级排名数据""" # 加载数据 profile_data = load_visual_profile_data() avatar_urls = load_avatar_list() # 读取原文件 with open('src/data/mockData.js', 'r', encoding='utf-8') as f: content = f.read() # 备份原文件 backup_time = datetime.now().strftime('%Y%m%d_%H%M%S') with open(f'src/data/mockData.js.backup_{backup_time}', 'w', encoding='utf-8') as f: f.write(content) # 生成新数据 class_ranking = transform_to_class_ranking(profile_data, avatar_urls) top_students = transform_to_top_students(profile_data, avatar_urls) rankings = transform_to_rankings(profile_data, avatar_urls) # 替换classRanking数组 class_ranking_str = json.dumps(class_ranking, ensure_ascii=False, indent=2) # 转换为JavaScript格式(去掉属性名的引号) class_ranking_str = re.sub(r'"(\w+)":', r'\1:', class_ranking_str) pattern = r'classRanking:\s*\[[\s\S]*?\](?=,\s*\/\/|\s*,\s*\w+:|\s*}\s*;)' replacement = f'classRanking: {class_ranking_str}' content = re.sub(pattern, replacement, content, count=1) # 替换topStudents数组 top_students_str = json.dumps(top_students, ensure_ascii=False, indent=6) top_students_str = re.sub(r'"(\w+)":', r'\1:', top_students_str) pattern = r'topStudents:\s*\[[\s\S]*?\](?=,\s*\}\s*,)' replacement = f'topStudents: {top_students_str}' content = re.sub(pattern, replacement, content, count=1) # 替换profileOverview.ranking.rankings数组 rankings_str = json.dumps(rankings, ensure_ascii=False, indent=8) rankings_str = re.sub(r'"(\w+)":', r'\1:', rankings_str) # 查找并替换两处rankings(因为profileOverview出现了两次) pattern = r'(profileOverview\s*=\s*\{[\s\S]*?ranking:\s*\{[\s\S]*?)rankings:\s*\[[\s\S]*?\]' def replace_rankings(match): return match.group(1) + f'rankings: {rankings_str}' content = re.sub(pattern, replace_rankings, content) # 更新学生基本信息(第10名学生 - 李沐阳) if len(profile_data) >= 10: current_student = profile_data[9] # 第10名(李沐阳) # 更新个人信息 content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)name:\s*"[^"]*"', rf'\1name: "{current_student["学员名称"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)realName:\s*"[^"]*"', rf'\1realName: "{current_student["学员名称"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)studentId:\s*"[^"]*"', rf'\1studentId: "{current_student["学号"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)studentNo:\s*"[^"]*"', rf'\1studentNo: "{current_student["学号"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)school:\s*"[^"]*"', rf'\1school: "{current_student["学校名称"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)major:\s*"[^"]*"', rf'\1major: "{current_student["专业名称"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)mbti:\s*"[^"]*"', rf'\1mbti: "{current_student["MBTI"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)mbtiType:\s*"[^"]*"', rf'\1mbtiType: "{current_student["MBTI"]}"', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)credits:\s*\d+', rf'\1credits: {current_student["学分"]}', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)classRank:\s*\d+', rf'\1classRank: {current_student["班级排名"]}', content ) # 更新myRank信息 content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?myRank:\s*\{[\s\S]*?)rank:\s*\d+', rf'\1rank: {current_student["班级排名"]}', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?myRank:\s*\{[\s\S]*?)score:\s*\d+', rf'\1score: {current_student["学分"]}', content ) # 更新ranking.myRank信息 content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?ranking:\s*\{[\s\S]*?myRank:\s*\{[\s\S]*?)rank:\s*\d+', rf'\1rank: {current_student["班级排名"]}', content ) content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?ranking:\s*\{[\s\S]*?myRank:\s*\{[\s\S]*?)score:\s*\d+', rf'\1score: {current_student["学分"]}', content ) # 更新className为视觉设计班 content = re.sub( r'(profileOverview\s*=\s*\{[\s\S]*?studentInfo:\s*\{[\s\S]*?)className:\s*"[^"]*"', rf'\1className: "视觉设计班"', content ) # 写回文件 with open('src/data/mockData.js', 'w', encoding='utf-8') as f: f.write(content) print(f"✅ 已更新 mockData.js") print(f" - classRanking: {len(class_ranking)} 条数据") print(f" - topStudents: {len(top_students)} 条数据") print(f" - rankings: {len(rankings)} 条数据") print(f" - 备份文件: mockData.js.backup_{backup_time}") if __name__ == "__main__": print("🚀 开始更新班级排名数据...") update_mock_data_file() print("🎉 更新完成!")