feat: 第17课课评完成 + 学生档案更新 + 课评网页模板 + 暑假绩效考核

This commit is contained in:
chengzi
2026-07-01 10:26:46 +08:00
parent 42b3c25d20
commit 9bc8e9a0d8
102 changed files with 4962 additions and 25 deletions

85
scripts/fetch_oj_csp17.py Normal file
View File

@@ -0,0 +1,85 @@
import httpx, re, json
from pathlib import Path
import sys
sys.stdout.reconfigure(encoding='utf-8')
env = {}
for line in Path('E:/workSpace/02-ClassFeedback/.env').read_text(encoding='utf-8').split('\n'):
if '=' in line and not line.startswith('#'):
k, v = line.split('=', 1)
env[k.strip()] = v.strip()
client = httpx.Client(base_url=env['OJ_BASE_URL'], follow_redirects=True, timeout=30)
r = client.post('/login', json={'uname': env['OJ_USERNAME'], 'password': env['OJ_PASSWORD']})
print('Login:', r.status_code)
hw_id = '6a35eadbc2880e90d8609759'
# Get problem list
r = client.get(f'/homework/{hw_id}')
problems = re.findall(r'href=\"/p/([^\"]+)\?tid=' + hw_id + r'\"[^>]*><b>([^<]+)</b>(?:&nbsp;|\s)*([^<]*)</a>', r.text)
print('Problems:')
prob_map = {}
for pid, pid_display, pname in problems:
pname_clean = pname.strip() if pname.strip() else pid_display
prob_map[pid] = pname_clean
print(f' {pid}: {pname_clean}')
# Get all submissions
print('\n--- Student Submissions ---')
student_data = {}
for page in range(1, 11):
r2 = client.get(f'/record?tid={hw_id}&page={page}')
if '没有找到相关记录' in r2.text:
break
rows = re.findall(r'<tr[^>]*>(.*?)</tr>', r2.text, re.DOTALL)
found_any = False
for row in rows:
if 'col--status' not in row:
continue
found_any = True
name_match = re.search(r'<a[^>]*href=\"/user/\d+\"[^>]*>([^<]+)</a>', row)
prob_match = re.search(r'href=\"/p/([^\"]+)\?tid=' + hw_id + r'\"[^>]*>([^<]+)</a>', row)
status_match = re.search(r'record-status--text\s+(\w+)\">([^<]+)<', row)
score_match = re.search(r'<span[^>]*>\s*(\d+)\s*</span>', row)
time_match = re.search(r'(\d{2}-\d{2}\s+\d{2}:\d{2})', row)
if name_match:
name = name_match.group(1).strip()
pid = prob_match.group(1) if prob_match else '?'
pname = prob_map.get(pid, pid)
status = status_match.group(2).strip() if status_match else '?'
score = score_match.group(1) if score_match else '?'
time_str = time_match.group(1) if time_match else '?'
if name not in student_data:
student_data[name] = []
student_data[name].append({
'problem': pname,
'status': status,
'score': score,
'time': time_str
})
if not found_any:
break
# Our target students
targets = ['杨林轩', '欧俊宇', '汪子杰', '谢明泓']
with open('E:/workSpace/02-ClassFeedback/oj_csp17_result.txt', 'w', encoding='utf-8') as f:
for name in targets:
if name in student_data:
f.write(f'\n{name}】({len(student_data[name])}次提交):\n')
for rec in student_data[name]:
f.write(f' {rec["problem"]}: {rec["status"]} (得分: {rec["score"]}, 时间: {rec["time"]})\n')
else:
f.write(f'\n{name}】: 无提交记录\n')
f.write('\n--- All students found ---\n')
for name in sorted(student_data.keys()):
f.write(f' {name}: {len(student_data[name])} submissions\n')
print('Done! Results written to oj_csp17_result.txt')