生鲜购物商城-项目创建
写在前面
①这个项目与之前直接用django(前后端不分离)写的生鲜购物商城实现的基本功能一致,新添加积分、优惠卷等功能。
②django项目(前后端不分离),生鲜购物商城项目笔记链接:
https://blog.csdn.net/a__int__/article/details/103788649
③本次项目设计采用Django-rest-framework框架,前后端分离设计
1、创建项目
①使用pycharm创建项目
②创建app:python manage.py startapp App
③在项目根目录下创建1.txt,把我们项目需要安装的包写去:
pymysql
redis
django_redis
djangorestframework
Pillow
python-alipay-sdk
安装:pip install -r 1.txt
2、项目配置
①安装完成后进行项目setting配置
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
# 添加这两个,自带的保留
'rest_framework',
'App'
]
# 自带的DATABASES注释了
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'FreshFoodStore',
# mysql用户名
'USER': 'root',
# 密码
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': 3306
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# 这些添加到末尾
# redis缓存过期时间24小时
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
},
'TIMEOUT': 60 * 60 * 24
}
}
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/uploads')
②配置好之新打开一个cmd窗口启动redis:redis-server
扫描二维码关注公众号,回复:
10589891 查看本文章
(如果计算机里没有下载redis参考:https://blog.csdn.net/a__int__/article/details/103648033)
③找到manage.py,设置驱动
# 写在最后一个import下面
import pymysql
pymysql.install_as_MySQLdb()
④创建数据库
mysql -uroot -proot
craete database FreshFoodStore charset=utf8;
exit
登录
⑤迁移
python manage.py migrate
3、设计数据库及模型
表 | 字段 |
---|---|
IndexSlide(首页Slide) | id、img |
FoodType(产品分类) | typeid、typenames、type2names(二级类型名)、is_hot(是否热卖) |
Foods | f_id、f_img、f_name、f_longname、scale(重量)、price、eprice(优惠前价格)、type2id(二级类型id)、type2name(二级类型名)、f_num(剩余数量)、is_sell(是否上架)、is_points(是否积分)、is_hot(是否热卖,推到首页)、place(产地) |
User | u_name、u_password、u_email、u_phone、u_icon(头像)、all_points(历史总积分)、the_points(当前总积分)、is_active(是否激活)、is_delete(是否被删除)、addr_id(默认收货地址) |
Admin(管理员) | name、password、auth(权限) |
Points(积分详单) | p_user、p_num(积分)、is_add(加或减)、p_date(日期)、p_price(消费额)、p_detail(产生或消费积分来源) |
Coupon(优惠卷) | cou_id、cou_name、cou_method(计算方法)、cou_num(计算量)、is_open(是否可以使用)、which_user(投放给哪类人) |
UserCoupon(用户领取的优惠卷) | cou_user(用户id)、cou_id(优惠卷id)、cou_status(优惠卷状态) |
Cart(购物车) | c_user、c_foods、c_foods_num、is_select(当前商品是否选中)、c_addr(购物地址id) |
Order(订单) | o_user、o_price、o_time、o_status(订单状态)、o_note(订单备注)、o_addr(收货地址)、o_points(使用积分)、o_coupon(使用优惠卷)、o_vip(使用vip折扣) |
OrderFoods(订单里的商品) | o_user、o_foods、o_foods_num |
Addr(收货地址) | a_user、a_city_id(城市)、a_detail(详细地址)、a_user_name(收货人)、a_tell(收货电话)、a_time(收货时间) |
City(全国地名表) | id、pid、name |
FoodType
- 商品分类设计:这里商品为多级分类,第一级分类存在typenames里面,其余的存在type2names里面以:分割,例如:
全部分类:0#饮料:1008#冷热饮:1009
Points
- 积分与会员设计:积分单独存一个表,并记录时间、积分来源等,每次消费可以用积分抵扣现金,1积分抵扣0.1元,下单付款后产生积分,实际付款的0.01倍为本次消费积分数。
- User表里all_points是用来记录历史以来总积分的,不进行减少,只进行相加,每次产生新的积分便向里面加一次。
- User表里有the_points用于记录当前剩余总积分,每次产生积分向里面加,减少积分向里面减。
- all_points与用户vip等级相关联,100分、500分、1000分、3000分、1万分:会员v1,会员v2、会员v3、会员v4、会员v5
- v1、v2…: 9.9折、9.6折、9.3折…
Coupon
- 折扣与优惠卷设计:会员折扣、优惠卷、积分不能同时使用,每次只能使用其中一个,且每次使用会员折扣不产生积分、使用优惠卷和积分在实际付款的基础上计算积分。
- 每次调用优惠卷先调用
- 优惠卷单独创建一个类,里面写各类优惠卷的计算方式,例如:满100减20优惠卷,cou_method(计算方法)里面存值1,cou_num(计算量)里面存值100,20,
- 优惠卷计算分类设计:满减、折扣、现金卷:1、2、3
- 优惠卷投放人群设计:所有用户、v0用户(新用户)、v0以上用户(老用户)、v3及以上用户(高消费用户):1、2、3、4
- 避免优惠卷重复领取,优惠卷采取逻辑删除字段is_del(是否被删除),用户每次领取优惠卷前读取UserCoupon(用户领取的优惠卷)表里的cou_id(优惠卷id)是否存在
4、项目常量定义
商品的排序及类型
# 所有类型
ALL_TPYE = "0"
# 综合排序
ORDER_TOTAL = "0"
# 价格升序降序
ORDER_PRICE_UP = "1"
ORDER_PRICE_DOWN = "2"
# 销量升序降序
ORDER_SALE_UP = "3"
ORDER_SALE_DOWN = "4"
订单状态
# 已下单未付款
ORDER_STATUS_NOT_PAY = 1
# 已下单已付款未发货
ORDER_STATUS_NOT_SEND = 2
# 已下单已付款已发货未发货
ORDER_STATUS_NOT_RECEIVE = 3
会员等级
VIP1 = 99
VIP2 = 499
VIP3 = 999
VIP4 = 2999
VIP5 = 9999
优惠卷类型
# 满减类型优惠卷
FULL_DISCOUNT_COUPON = 1
# 折扣优惠卷
DISCOUNT_COUPON = 2
# 现金优惠卷
CASH_COUPON = 3
优惠卷投放人群
# 所有用户
ALL_USER = 1
# 新用户
NEW_USER = 2
# 老用户
OLD_USER = 3
# 高消费用户
HIGH_CONSUMPTION_USER = 4
优惠卷状态
# 优惠卷已被删除或过期
COU_CANNOT_BE_USED = 0
# 优惠卷可以使用
COU_CAN_BE_USED = 1
# 优惠卷已被使用
COU_HAS_BEEN_USED =2
在App下新建constant.py,把上面这些常量写进去