""" 浏览历史模型 """ from datetime import datetime from config.database import db from app.models.product import Product from app.models.user import User class BrowseHistory(db.Model): __tablename__ = 'browse_history' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) product_id = db.Column(db.Integer, db.ForeignKey('products.id'), nullable=False) viewed_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 关联关系 user = db.relationship('User', backref='browse_history') product = db.relationship('Product', backref='viewed_by') # 唯一约束 __table_args__ = (db.UniqueConstraint('user_id', 'product_id', name='uk_user_product'),) def to_dict(self): """转换为字典""" return { 'id': self.id, 'user_id': self.user_id, 'product_id': self.product_id, 'viewed_at': self.viewed_at.isoformat() if self.viewed_at else None, 'product': { 'id': self.product.id, 'name': self.product.name, 'price': float(self.product.price), 'main_image': self.product.main_image, 'status': self.product.status, 'sales_count': self.product.sales_count, 'category': self.product.category.name if self.product.category else None } if self.product else None } @classmethod def add_history(cls, user_id, product_id): """添加浏览记录""" # 检查商品是否存在 product = Product.query.get(product_id) if not product: return False, "商品不存在" # 查找已有记录 history = cls.query.filter_by(user_id=user_id, product_id=product_id).first() if history: # 更新浏览时间 history.viewed_at = datetime.utcnow() else: # 创建新记录 history = cls(user_id=user_id, product_id=product_id) db.session.add(history) try: db.session.commit() return True, "浏览记录添加成功" except Exception as e: db.session.rollback() return False, f"添加浏览记录失败: {str(e)}" @classmethod def get_user_history(cls, user_id, page=1, per_page=20): """获取用户浏览历史""" return cls.query.filter_by(user_id=user_id) \ .join(Product) \ .filter(Product.status == 1) \ .order_by(cls.viewed_at.desc()) \ .paginate(page=page, per_page=per_page, error_out=False) @classmethod def get_user_history_count(cls, user_id): """获取用户浏览历史数量""" return cls.query.filter_by(user_id=user_id).count() @classmethod def clear_user_history(cls, user_id): """清空用户浏览历史""" try: cls.query.filter_by(user_id=user_id).delete() db.session.commit() return True, "浏览历史清空成功" except Exception as e: db.session.rollback() return False, f"清空浏览历史失败: {str(e)}" @classmethod def remove_history_item(cls, user_id, product_id): """删除单个浏览记录""" history = cls.query.filter_by(user_id=user_id, product_id=product_id).first() if not history: return False, "浏览记录不存在" db.session.delete(history) try: db.session.commit() return True, "浏览记录删除成功" except Exception as e: db.session.rollback() return False, f"删除浏览记录失败: {str(e)}" def __repr__(self): return f''