You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from flask import Flask, request, jsonify, send_from_directory
import pandas as pd
import random
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # 启用 CORS
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 最大上传文件限制
db = SQLAlchemy(app)
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
student_id = db.Column(db.String(20), unique=True, nullable=False)
points = db.Column(db.Float, default=0)
called_count = db.Column(db.Integer, default=0)
@app.route('/upload_students', methods=['POST'])
def upload_students():
if 'file' not in request.files:
return jsonify(message="未找到文件"), 400
file = request.files['file']
if file.filename == '':
return jsonify(message="没有选择文件"), 400
if not (file.filename.endswith('.xlsx') or file.filename.endswith('.xls')):
return jsonify(message="文件格式不支持,请上传 Excel 文件"), 400
try:
df = pd.read_excel(file)
if '姓名' not in df.columns or '学号' not in df.columns:
return jsonify(message="Excel 文件必须包含 '姓名''学号'"), 400
for _, row in df.iterrows():
student = Student(name=row['姓名'], student_id=row['学号'])
db.session.add(student)
db.session.commit()
return jsonify(message="学生名单上传成功"), 200
except Exception as e:
print(f"Error: {e}")
return jsonify(message=f"文件处理失败: {str(e)}"), 500
@app.route('/call_student', methods=['POST'])
def call_student():
students = Student.query.all()
total_points = sum(student.points for student in students)
if total_points == 0:
chosen_student = random.choice(students)
else:
probabilities = [(student, 1 - (student.points / total_points)) for student in students]
total_prob = sum(prob[1] for prob in probabilities)
chosen_student = random.choices(
[prob[0] for prob in probabilities],
weights=[prob[1] / total_prob for prob in probabilities]
)[0]
chosen_student.called_count += 1
chosen_student.points += 1 # 点到后增加积分
db.session.commit()
return jsonify(name=chosen_student.name, student_id=chosen_student.student_id, index=chosen_student.id)
@app.route('/update_points', methods=['POST'])
def update_points():
data = request.json
student = Student.query.get(data['index'])
answer = data['answer']
score = 0
question = "1+1=" # 假设提问内容
if answer == question:
score += 0.5
result_message = "回答正确!"
else:
score -= 1
result_message = "回答错误!"
# 模拟准确回答的情况
if "Ezio" == answer:
score += random.uniform(0.5, 3.0)
result_message = "回答非常正确!"
student.points += score
db.session.commit()
if student.points < 0:
student.points = 0 # 确保积分不为负值
db.session.commit()
return jsonify(points=student.points, message=result_message)
@app.route('/')
def index():
return send_from_directory('', 'index.html')
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)