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.

42 lines
1.5 KiB

from datetime import datetime
from flask_login import UserMixin
from . import db, login_manager
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
password_hash = db.Column(db.String(255), nullable=False)
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
student_no = db.Column(db.String(32), unique=True, nullable=False)
name = db.Column(db.String(64), nullable=False)
major = db.Column(db.String(128))
total_score = db.Column(db.Float, default=0.0)
attendance_count = db.Column(db.Integer, default=0)
random_called_count = db.Column(db.Integer, default=0)
class RollCall(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
student_id = db.Column(db.Integer, db.ForeignKey("student.id"), nullable=False)
call_time = db.Column(db.DateTime, default=datetime.utcnow)
mode = db.Column(db.String(16), nullable=False) # random / sequence
status = db.Column(
db.String(16), nullable=False
) # absent / distracted / attended
score_change = db.Column(db.Float, nullable=False, default=0.0)
student = db.relationship("Student", backref="roll_calls")
# user 关系可按需在查询中使用,不强制 backref
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))