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

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)