import pandas as pd import random from flask import Flask, render_template, request, redirect, url_for app = Flask(__name__) # 读取Excel文件并初始化学生数据 def load_students(file_path): df = pd.read_excel(file_path, engine='openpyxl') # 指定引擎 students = [{'id': row['学号'], 'name': row['姓名'], 'points': 0} for index, row in df.iterrows()] return students # 随机点名算法,积分越高,概率越低 def weighted_random_choice(students): total_weights = sum(1 / (s['points'] + 1) for s in students) random_value = random.uniform(0, total_weights) current_weight = 0 for student in students: weight = 1 / (student['points'] + 1) if current_weight + weight >= random_value: return student current_weight += weight return students[-1] # 点名并到达课堂,积分 +1 def attend_class(student): student['points'] += 1 # 回答问题并进行加减分 def answer_question(student, accurate_repeat, answer_score): if accurate_repeat: student['points'] += 0.5 else: student['points'] -= 1 student['points'] += answer_score # 加载学生数据 students = load_students(r'C:\Users\86152\Desktop\新建文件夹 (2)\新建文件夹 (2)\软工学生名单.xlsx') @app.route('/') def index(): return render_template('index.html', student={}) @app.route('/call_student') def call_student(): student = weighted_random_choice(students) attend_class(student) return render_template('index.html', student=student) @app.route('/ask_question', methods=['GET', 'POST']) def ask_question(): if request.method == 'POST': # 获取表单传递的 student_id student_id = request.form.get('student_id') # 调试打印学号以确保正确传递 print(f"传递的学号: {student_id}") # 获取前端传递的是否准确重复问题和得分 accurate_repeat = request.form.get('accurate_repeat') == 'on' answer_score = float(request.form.get('answer_score', 0)) # 处理学号为字符串以确保类型一致 try: # 确保学号一致时,将 student_id 转换为字符串 student = next(s for s in students if str(s['id']) == str(student_id)) # 更新学生积分 answer_question(student, accurate_repeat, answer_score) except StopIteration: # 如果找不到对应学号的学生,返回提示信息 return "未找到对应学号的学生,请检查输入。" return redirect(url_for('index')) # 在 GET 请求中随机选择一个学生 student = weighted_random_choice(students) # 返回带有学生数据的模板 return render_template('ask_question.html', student=student) @app.route('/rankings') def rankings(): sorted_students = sorted(students, key=lambda s: s['points'], reverse=True) return render_template('rankings.html', rankings=sorted_students) if __name__ == "__main__": app.run(debug=True)