# python_dailyfresh **Repository Path**: ahcfl_leon/python_dailyfresh ## Basic Information - **Project Name**: python_dailyfresh - **Description**: dailyfresh是基于python并采用django框架开发的一款B2C购物商城项目。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 4 - **Created**: 2021-06-02 - **Last Updated**: 2024-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dailyfresh mall based on B2C model #### 项目介绍 dailyfresh是基于python的django框架并采用B2C方式开发的一款购物商城项目。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0711/095531_913a0156_8172401.png "首页.png") #### 软件架构 ``` 1. 语言:Python3.* (Django) 2. 数据库: MySql、 redis 3. 任务队列(异步处理): celery(django-celery) 4. 分布式文件存储: FastDFS 5. 搜索引擎(商品检索): haystack(django-haystack)、whoosh、二次开发 6. web服务器配置: Nginx+ uwsgi 7. 开发环境: PyCharm、Linux、vim 开发架构 Browser/Server(浏览器/服务器)结构 Nginx+uwsgi ``` #### 开发配置说明 https://gitee.com/ahcfl_leon/python_dailyfresh/tree/master/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3 #### 主体模块 ``` 1. 用户模块 2. 商品相关模块 3. 购物车相关模块 4. 订单相关模块 ``` #### 数据库表设计 ``` 1. SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。 【简单来说,属性值、特性相同的商品就可以称为一个SPU】 例如,华为手机可以是一个SPU,小米手机也可以是一个SPU,这个与商家无关,与颜色、款式、套餐也无关。 2. SKU库存进出计量的单位, 可以是以件、盒、托盘等为单位,在服装、鞋类商品中使用最多最普遍。 例如,衣服中一个SKU,通常表示:规格、颜色、款式。 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2021/0711/095447_c494cbb2_8172401.png "Snipaste_2021-07-11_09-52-57.png") #### 功能与性能优化 ``` 案例1:用户注册发激活邮件时,可能发送邮件所需的时间较长,客户端会需要等待,用户体验不好。 案例2:用户访问量过大时,每次都需要从数据库动态获取首页页面数据,数据库查询次数较多,也要考虑到DDOS攻击。 改进: 把耗时的任务放到后台异步执行,此处使用celery任务队列, 其中使用redis作中间件。 问题一:用户注册发激活邮件时,可能发送邮件所需的时间较长,客户端会需要等待一段时间,体验感不好。怎么优化呢? 答: 可以将耗时的发送邮件任务放到后台异步执行,交给Celery任务队列处理。 使用Redis作为中间件,监听任务队列,交给Worker执行。 问题二:Django框架本身内置的文件存储只能存放小文件,不能解决项目的海量图片存储。应该怎么处理呢? 答: 引入FastDFS+Nginx对商品图片进行存储和调度。FastDFS 是C编写的一款开源分布式文件系统。 充分考虑了冗余备份、负载均衡、线性扩容等机制。使用 FastDFS 很方便搭建一套高性能的文件服务器集群,提供文件上传下载等服务。 问题三:开发过程中,用户的浏览记录和用户购物车商品信息如何存储,以什么格式存储呢? 答: Redis存储用户历史浏览记录, 采用list数据结构,例如: history_userId: [skuid1,skuid2,skuid3]; 存储用户购物车商品信息,采用hash数据结构,例如:cart_userid: {'sku_id1': num, 'sku_id2': num}。 问题四:用户访问量过大时,每次都需要从数据库动态获取首页页面数据,数据库查询次数较多,考虑到DDOS攻击,怎么解决呢? 答: 可以把首页第一次查询的数据在Redis缓存存储。当用户再次查询这些数据时,先从缓存中获取,如获取不到,再去查询数据库,减少数据库的查询次数。 问题五:订单并发处理 答: 可以进行加锁处理,悲观锁首先对数据进行了定位和加锁,再去获取数据。其他事务要想获取锁,必须等原事件结束。 乐观锁在进行操作时不会加锁,提交更正时才进行判断。所以,在本项目并发冲突比较少的场景,可以引入乐观锁。 ```