《Python购物车之用户部分代码》
在电商系统开发中,购物车功能是核心模块之一。本文将详细阐述如何使用Python实现购物车系统的用户相关功能,包括用户注册、登录、信息管理以及与购物车的交互逻辑。通过面向对象编程和模块化设计,构建一个可扩展的购物车用户子系统。
一、用户数据模型设计
用户数据模型是整个系统的基础,需要包含用户基本信息和安全相关字段。以下是一个完整的用户类实现:
class User:
def __init__(self, username, password, email, phone=None):
"""
初始化用户对象
:param username: 用户名(唯一)
:param password: 加密后的密码
:param email: 电子邮箱(唯一)
:param phone: 手机号(可选)
"""
self.username = username
self._password = password # 使用下划线表示受保护属性
self.email = email
self.phone = phone
self.cart = ShoppingCart() # 每个用户关联一个购物车
self.is_active = True
self.registration_date = datetime.now()
@property
def password(self):
"""密码属性getter(实际系统中不应直接返回密码)"""
raise AttributeError("密码不可直接读取")
@password.setter
def password(self, new_password):
"""密码属性setter,包含加密逻辑"""
if len(new_password)
二、用户认证系统实现
认证系统需要处理用户注册、登录、密码重置等核心功能。以下是完整的认证服务实现:
class AuthService:
def __init__(self, user_repository):
"""
初始化认证服务
:param user_repository: 用户数据访问层对象
"""
self.user_repo = user_repository
self.session_store = {} # 模拟会话存储
def register(self, username, password, email, phone=None):
"""用户注册逻辑"""
if self.user_repo.exists_by_username(username):
raise ValueError("用户名已存在")
if self.user_repo.exists_by_email(email):
raise ValueError("邮箱已被注册")
user = User(username, password, email, phone)
self.user_repo.save(user)
return self._create_session(user)
def login(self, username_or_email, password):
"""统一用户名/邮箱登录"""
user = self.user_repo.find_by_username(username_or_email)
if not user:
user = self.user_repo.find_by_email(username_or_email)
if not user:
raise ValueError("用户不存在")
if not user.verify_password(password):
raise ValueError("密码错误")
if not user.is_active:
raise ValueError("账户已被禁用")
return self._create_session(user)
def _create_session(self, user):
"""创建用户会话"""
session_id = str(uuid.uuid4())
self.session_store[session_id] = {
'user_id': user.username,
'expires': datetime.now() + timedelta(hours=2)
}
return session_id
def verify_session(self, session_id):
"""验证会话有效性"""
session = self.session_store.get(session_id)
if not session or session['expires']
三、用户信息管理模块
用户信息管理需要处理个人资料更新、地址管理等功能。以下是相关实现:
class UserProfileManager:
def __init__(self, user_repo):
self.user_repo = user_repo
def update_profile(self, username, **kwargs):
"""更新用户资料"""
user = self.user_repo.find_by_username(username)
if not user:
raise ValueError("用户不存在")
allowed_fields = ['email', 'phone', 'avatar_url']
for field, value in kwargs.items():
if field in allowed_fields:
setattr(user, field, value)
self.user_repo.update(user)
return user.to_dict()
def add_shipping_address(self, username, address_data):
"""添加收货地址"""
user = self.user_repo.find_by_username(username)
if not user:
raise ValueError("用户不存在")
address = ShippingAddress(
receiver=address_data['receiver'],
phone=address_data['phone'],
address=address_data['address'],
is_default=address_data.get('is_default', False)
)
user.shipping_addresses.append(address)
self.user_repo.update(user)
return address.to_dict()
def get_shipping_addresses(self, username):
"""获取用户所有收货地址"""
user = self.user_repo.find_by_username(username)
if not user:
raise ValueError("用户不存在")
return [addr.to_dict() for addr in user.shipping_addresses]
# 辅助类
class ShippingAddress:
def __init__(self, receiver, phone, address, is_default=False):
self.receiver = receiver
self.phone = phone
self.address = address
self.is_default = is_default
self.created_at = datetime.now()
def to_dict(self):
return {
'receiver': self.receiver,
'phone': self.phone,
'address': self.address,
'is_default': self.is_default,
'created_at': self.created_at.isoformat()
}
四、用户与购物车交互
用户系统与购物车的核心交互包括购物车访问、商品添加/删除等操作。以下是相关实现:
class ShoppingCartService:
def __init__(self, user_repo, product_repo):
self.user_repo = user_repo
self.product_repo = product_repo
def get_cart(self, username):
"""获取用户购物车"""
user = self.user_repo.find_by_username(username)
if not user:
raise ValueError("用户不存在")
return user.cart.to_dict()
def add_to_cart(self, username, product_id, quantity=1):
"""添加商品到购物车"""
user = self.user_repo.find_by_username(username)
product = self.product_repo.find(product_id)
if not user:
raise ValueError("用户不存在")
if not product:
raise ValueError("商品不存在")
if quantity
五、数据持久化实现
实际项目中需要实现数据持久化,以下是基于SQLite的简单实现:
import sqlite3
from contextlib import contextmanager
class SQLiteUserRepository:
def __init__(self, db_path='shopping.db'):
self.db_path = db_path
self._initialize_db()
@contextmanager
def _get_connection(self):
conn = sqlite3.connect(self.db_path)
try:
yield conn
finally:
conn.close()
def _initialize_db(self):
with self._get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
username TEXT PRIMARY KEY,
password BLOB NOT NULL,
email TEXT UNIQUE NOT NULL,
phone TEXT,
is_active INTEGER DEFAULT 1,
registration_date TEXT NOT NULL
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS shipping_addresses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
receiver TEXT NOT NULL,
phone TEXT NOT NULL,
address TEXT NOT NULL,
is_default INTEGER DEFAULT 0,
created_at TEXT NOT NULL,
FOREIGN KEY(username) REFERENCES users(username)
)
''')
conn.commit()
def save(self, user):
with self._get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
INSERT INTO users VALUES (?, ?, ?, ?, ?, ?)
''', (
user.username,
user._password,
user.email,
user.phone,
1 if user.is_active else 0,
user.registration_date.isoformat()
))
conn.commit()
def find_by_username(self, username):
with self._get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT * FROM users WHERE username = ?
''', (username,))
row = cursor.fetchone()
if row:
return self._row_to_user(row)
return None
def _row_to_user(self, row):
"""将数据库行转换为User对象"""
user = User(
username=row[0],
password='', # 实际项目中不应返回明文密码
email=row[2],
phone=row[3]
)
user._password = row[1]
user.is_active = bool(row[4])
user.registration_date = datetime.fromisoformat(row[5])
return user
# 其他数据访问方法实现类似...
六、系统集成与使用示例
以下是完整的系统集成示例:
def main():
# 初始化组件
db_repo = SQLiteUserRepository()
auth_service = AuthService(db_repo)
profile_manager = UserProfileManager(db_repo)
# 模拟产品仓库(实际项目中应为独立服务)
class MockProductRepo:
def find(self, product_id):
return Product(
id=product_id,
name="示例商品",
price=99.99,
stock=100
)
product_repo = MockProductRepo()
cart_service = ShoppingCartService(db_repo, product_repo)
# 用户注册
try:
session = auth_service.register(
username="testuser",
password="SecurePass123",
email="test@example.com"
)
print(f"注册成功,会话ID: {session}")
except ValueError as e:
print(f"注册失败: {e}")
# 用户登录
try:
session = auth_service.login(
username_or_email="testuser",
password="SecurePass123"
)
print(f"登录成功,会话ID: {session}")
except ValueError as e:
print(f"登录失败: {e}")
# 添加商品到购物车
try:
cart = cart_service.add_to_cart(
username="testuser",
product_id="prod001",
quantity=2
)
print(f"购物车更新: {cart}")
except ValueError as e:
print(f"添加商品失败: {e}")
# 更新用户资料
try:
profile = profile_manager.update_profile(
username="testuser",
phone="13800138000"
)
print(f"资料更新成功: {profile}")
except ValueError as e:
print(f"资料更新失败: {e}")
if __name__ == "__main__":
main()
七、安全考虑与最佳实践
在实现用户系统时,必须考虑以下安全要点:
密码存储:始终使用加盐哈希(如PBKDF2、bcrypt或Argon2)存储密码,绝不能明文存储
会话管理:使用安全的随机会话ID,设置合理的过期时间,防止会话固定攻击
输入验证:对所有用户输入进行验证和清理,防止SQL注入和XSS攻击
敏感数据:避免在日志或错误消息中记录敏感信息
HTTPS:所有认证相关的通信必须通过HTTPS进行
CSRF防护:实现CSRF令牌机制防止跨站请求伪造
速率限制:对登录、注册等接口实施速率限制防止暴力破解
八、扩展性与维护建议
为确保系统的长期可维护性,建议:
模块化设计:将不同功能拆分为独立模块,便于测试和维护
依赖注入:通过构造函数注入依赖,提高代码的可测试性
单元测试:为所有核心功能编写单元测试,确保代码质量
文档完善:为所有公共接口编写清晰的文档字符串
日志记录:实现适当的日志记录机制,便于问题排查
配置管理:将数据库连接等配置信息外部化
关键词:Python购物车、用户认证、面向对象编程、数据持久化、安全实践、模块化设计
简介:本文详细阐述了使用Python实现购物车系统用户部分的核心代码,包括用户数据模型、认证系统、信息管理、购物车交互等模块。通过完整的类实现和集成示例,展示了如何构建安全、可扩展的电商用户子系统,同时强调了密码安全、会话管理等关键安全实践。