位置: 文档库 > Python > 文档下载预览

《Python购物车之用户部分代码.doc》

1. 下载的文档为doc格式,下载后可用word或者wps进行编辑;

2. 将本文以doc文档格式下载到电脑,方便收藏和打印;

3. 下载后的文档,内容与下面显示的完全一致,下载之前请确认下面内容是否您想要的,是否完整.

点击下载文档

Python购物车之用户部分代码.doc

《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()

七、安全考虑与最佳实践

在实现用户系统时,必须考虑以下安全要点:

  1. 密码存储:始终使用加盐哈希(如PBKDF2、bcrypt或Argon2)存储密码,绝不能明文存储

  2. 会话管理:使用安全的随机会话ID,设置合理的过期时间,防止会话固定攻击

  3. 输入验证:对所有用户输入进行验证和清理,防止SQL注入和XSS攻击

  4. 敏感数据:避免在日志或错误消息中记录敏感信息

  5. HTTPS:所有认证相关的通信必须通过HTTPS进行

  6. CSRF防护:实现CSRF令牌机制防止跨站请求伪造

  7. 速率限制:对登录、注册等接口实施速率限制防止暴力破解

八、扩展性与维护建议

为确保系统的长期可维护性,建议:

  1. 模块化设计:将不同功能拆分为独立模块,便于测试和维护

  2. 依赖注入:通过构造函数注入依赖,提高代码的可测试性

  3. 单元测试:为所有核心功能编写单元测试,确保代码质量

  4. 文档完善:为所有公共接口编写清晰的文档字符串

  5. 日志记录:实现适当的日志记录机制,便于问题排查

  6. 配置管理:将数据库连接等配置信息外部化

关键词:Python购物车、用户认证、面向对象编程、数据持久化、安全实践、模块化设计

简介:本文详细阐述了使用Python实现购物车系统用户部分的核心代码,包括用户数据模型、认证系统、信息管理、购物车交互等模块。通过完整的类实现和集成示例,展示了如何构建安全、可扩展的电商用户子系统,同时强调了密码安全、会话管理等关键安全实践。

《Python购物车之用户部分代码.doc》
将本文以doc文档格式下载到电脑,方便收藏和打印
推荐度:
点击下载文档