""" 「访问统计」数据模型。 每条记录是一次访问事件: - path 访问路径 - referer 来源页(可空) - ua User-Agent 摘要(可空) - ip 访客 IP(如果能拿到) - day YYYY-MM-DD 日期(用于按天聚合) - visit_at 访问时间 """ import datetime from applications.extensions import db class VisitLog(db.Model): __tablename__ = 'site_visit_log' id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='记录ID') path = db.Column(db.String(255), default='', index=True, comment='访问路径') referer = db.Column(db.String(255), default='', comment='来源页') ua = db.Column(db.String(255), default='', comment='UA') ip = db.Column(db.String(64), default='', comment='访问IP') day = db.Column(db.String(10), default='', index=True, comment='日期 YYYY-MM-DD') visit_at = db.Column(db.DateTime, default=datetime.datetime.now, index=True, comment='访问时间') class PageStat(db.Model): """ 路径级累计统计:每次访问做 upsert(按 path+day)。 字段: - path - day - pv 当日 / 累计 Page View - uv IP 去重计数(用 set 维护在内存里,但用户规模小可以按 (path, day, ip) 简单去重) - last_hit 最后一次访问时间 """ __tablename__ = 'site_page_stat' id = db.Column(db.Integer, primary_key=True, autoincrement=True) path = db.Column(db.String(255), default='', index=True) day = db.Column(db.String(10), default='', index=True) pv = db.Column(db.Integer, default=0, comment='Page View') uv = db.Column(db.Integer, default=0, comment='独立访客数(IP 去重后)') uv_ip_set = db.Column(db.Text, default='', comment='独立 IP 列表 CSV') last_hit = db.Column(db.DateTime, default=datetime.datetime.now, comment='最近访问时间') def to_dict(self): return { 'id': self.id, 'path': self.path, 'day': self.day, 'pv': self.pv or 0, 'uv': self.uv or 0, 'last_hit': self.last_hit.strftime('%Y-%m-%d %H:%M:%S') if self.last_hit else '', }