diff --git a/app.py b/app.py new file mode 100644 index 0000000..504b1cf --- /dev/null +++ b/app.py @@ -0,0 +1,90 @@ +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)