""" 数据库模型定义 """ from flask_sqlalchemy import SQLAlchemy from datetime import datetime, timezone db = SQLAlchemy() class User(db.Model): """用户表""" __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(100), nullable=False) iyuu_token = db.Column(db.String(255)) max_fail_count = db.Column(db.Integer, default=3) cookie_cloud_uuid = db.Column(db.String(255)) cookie_cloud_password = db.Column(db.String(255)) cookie_cloud_api_url = db.Column(db.String(255)) created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) # 关联关系 websites = db.relationship('Website', backref='user', lazy=True, cascade='all, delete-orphan') notifications = db.relationship('Notification', backref='user', lazy=True) class Website(db.Model): """网站表""" __tablename__ = 'websites' id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) name = db.Column(db.String(100), nullable=False) url = db.Column(db.String(255), nullable=False) login_check_selector = db.Column(db.String(255)) success_text = db.Column(db.String(255)) interval_minutes = db.Column(db.Integer, default=30, name='interval') status = db.Column(db.Integer, default=1) created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) # 关联关系 cookies = db.relationship('Cookie', backref='website', lazy=True, cascade='all, delete-orphan') detections = db.relationship('Detection', backref='website', lazy=True, cascade='all, delete-orphan') notifications = db.relationship('Notification', backref='website', lazy=True) class Cookie(db.Model): """Cookie表""" __tablename__ = 'cookies' id = db.Column(db.Integer, primary_key=True, autoincrement=True) website_id = db.Column(db.Integer, db.ForeignKey('websites.id'), nullable=False) name = db.Column(db.String(100), nullable=False) value = db.Column(db.Text, nullable=False) domain = db.Column(db.String(255), nullable=False) path = db.Column(db.String(255), default='/') expiry = db.Column(db.DateTime) secure = db.Column(db.Integer, default=0) http_only = db.Column(db.Integer, default=0) created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) class Detection(db.Model): """检测结果表""" __tablename__ = 'detections' id = db.Column(db.Integer, primary_key=True, autoincrement=True) website_id = db.Column(db.Integer, db.ForeignKey('websites.id'), nullable=False) status = db.Column(db.Integer, nullable=False) response_time = db.Column(db.Float) http_status = db.Column(db.Integer) message = db.Column(db.Text) created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) class Notification(db.Model): """通知表""" __tablename__ = 'notifications' id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) website_id = db.Column(db.Integer, db.ForeignKey('websites.id'), nullable=False) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) status = db.Column(db.String(20), default='pending') send_time = db.Column(db.DateTime) created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))