taibai_shopping/app/models/browse_history.py
2025-07-09 05:22:28 +08:00

112 lines
3.8 KiB
Python

"""
浏览历史模型
"""
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'<BrowseHistory {self.user_id}-{self.product_id}>'