80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
"""
|
|
用户地址模型
|
|
"""
|
|
from datetime import datetime
|
|
from config.database import db
|
|
|
|
|
|
class UserAddress(db.Model):
|
|
"""用户地址模型"""
|
|
__tablename__ = 'user_addresses'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
|
|
receiver_name = db.Column(db.String(50), nullable=False)
|
|
receiver_phone = db.Column(db.String(20), nullable=False)
|
|
province = db.Column(db.String(50), nullable=False)
|
|
city = db.Column(db.String(50), nullable=False)
|
|
district = db.Column(db.String(50), nullable=False)
|
|
detail_address = db.Column(db.String(200), nullable=False)
|
|
postal_code = db.Column(db.String(10))
|
|
is_default = db.Column(db.Integer, default=0)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
# 关联关系
|
|
user = db.relationship('User', backref='addresses')
|
|
|
|
def get_full_address(self):
|
|
"""获取完整地址"""
|
|
return f"{self.province} {self.city} {self.district} {self.detail_address}"
|
|
|
|
def to_dict(self):
|
|
"""转换为字典"""
|
|
return {
|
|
'id': self.id,
|
|
'user_id': self.user_id,
|
|
'receiver_name': self.receiver_name,
|
|
'receiver_phone': self.receiver_phone,
|
|
'province': self.province,
|
|
'city': self.city,
|
|
'district': self.district,
|
|
'detail_address': self.detail_address,
|
|
'postal_code': self.postal_code,
|
|
'full_address': self.get_full_address(),
|
|
'is_default': self.is_default,
|
|
'created_at': self.created_at.isoformat() if self.created_at else None
|
|
}
|
|
|
|
@classmethod
|
|
def set_default_address(cls, user_id, address_id):
|
|
"""设置默认地址"""
|
|
try:
|
|
# 先取消所有默认地址
|
|
cls.query.filter_by(user_id=user_id).update({'is_default': 0})
|
|
# 设置新的默认地址
|
|
address = cls.query.filter_by(id=address_id, user_id=user_id).first()
|
|
if address:
|
|
address.is_default = 1
|
|
db.session.commit()
|
|
return True
|
|
return False
|
|
except Exception:
|
|
db.session.rollback()
|
|
return False
|
|
|
|
@classmethod
|
|
def get_default_address(cls, user_id):
|
|
"""获取默认地址"""
|
|
return cls.query.filter_by(user_id=user_id, is_default=1).first()
|
|
|
|
@classmethod
|
|
def get_user_addresses(cls, user_id):
|
|
"""获取用户所有地址"""
|
|
return cls.query.filter_by(user_id=user_id).order_by(
|
|
cls.is_default.desc(), cls.created_at.desc()
|
|
).all()
|
|
|
|
def __repr__(self):
|
|
return f'<UserAddress {self.receiver_name}-{self.get_full_address()}>'
|