247 lines
9.2 KiB
Python
247 lines
9.2 KiB
Python
|
|
#!/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("🎉 更新完成!")
|