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
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))
|