parent
6dec354a30
commit
9e5c289d07
@ -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)
|
Loading…
Reference in new issue