Files
ALL-teach_sys/frontend_视觉设计/update_class_ranking_data.py

247 lines
9.2 KiB
Python
Raw Normal View History

#!/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("🎉 更新完成!")