Django REST framework+Vue 打造生鲜超市(二)

三、Models设计

3.1.项目初始化

(1)进虚拟环境下安装

  • django2.0.2
  • djangorestframework和相关依赖mark,filter
  • pillow  图片处理

pip install djangorestframework

pip install -i https://pypi.douban.com/simple django==2.0.2

pip install markdown

pip install django-filter

pip install pillow

pip install pymysql

(2)创建项目

  • 项目:MxShop
  • app:users

 interpreter选择虚拟环境里面的python.exe

(3)Mysql的配置

settings中设置

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘mxshop‘,        #数据库名字
        ‘USER‘: ‘root‘,          #账号
        ‘PASSWORD‘: ‘123456‘,    #密码
        ‘HOST‘: ‘127.0.0.1‘,     #IP
        ‘PORT‘: ‘3306‘,          #端口
        #这里引擎用innodb(默认myisam)
        #因为后面第三方登录时,要求引擎为INNODB
        # ‘OPTIONS‘:{‘init_command‘: ‘SET storage_engine=INNODB‘}, #这样设置会报错,改为
        "OPTIONS":{"init_command":"SET default_storage_engine=INNODB;"}
    }
}

安装Mysqlclient

下载地址:

https://www.lfd.uci.edu/~gohlke/pythonlibs/

安装

pip install mysqlclient-1.3.12-cp36-cp36m-win_amd64

__init__.py添加代码:

import pymysql
pymysql.install_as_MySQLdb()

(4)项目目录结构搭建

新建两个python package

  • extra_apps   (扩展的源码包)
  • apps              (放所有app)

新建两个文件夹

  • media       (保存图片)
  • db_tools   (数据库相关)

把extra_apps和apps标记为sources root,然后settings中也要加路径

#settings.py

import sys

sys.path.insert(0,BASE_DIR)
sys.path.insert(0,os.path.join(BASE_DIR, ‘apps‘))
sys.path.insert(0,os.path.join(BASE_DIR, ‘extra_apps‘))

现在项目目录如下:

3.2.users models设计

(1)创建三个app

  • goods        商品
  • trade          交易
  • user_operation       用户操作

(2)users/models.py

# users/models.py
__author__ = ‘derek‘

from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    """
    用户信息
    """
    GENDER_CHOICES = (
        ("male", u"男"),
        ("female", u"女")
    )
    #用户用手机注册,所以姓名,生日和邮箱可以为空
    name = models.CharField("姓名",max_length=30, null=True, blank=True)
    birthday = models.DateField("出生年月",null=True, blank=True)
    gender = models.CharField("性别",max_length=6, choices=GENDER_CHOICES, default="female")
    mobile = models.CharField("电话",max_length=11)
    email = models.EmailField("邮箱",max_length=100, null=True, blank=True)

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

class VerifyCode(models.Model):
    """
    验证码
    """
    code = models.CharField("验证码",max_length=10)
    mobile = models.CharField("电话",max_length=11)
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "短信验证"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.code

要想替换系统的用户,还要在settings中配置

#settings.py

#重载系统的用户,让UserProfile生效
AUTH_USER_MODEL = ‘users.UserProfile‘

(3)这里UserProfile继承AbstractUser,可以看看AbstractUser的源码

 源码

3.3.goods的model设计

(1)安装

安装好后把xadmin和DjangoUeditor放到extra_apps目录下面

(2)把四个app、xadmin和DjangoUeditor添加到 INSTALLED_APPS中

INSTALLED_APPS = [
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘users‘,
    ‘goods‘,
    ‘trade‘,
    ‘user_operation‘,
    ‘rest_framework‘,
    ‘xadmin‘,
    ‘crispy_forms‘,
    ‘DjangoUeditor‘
]

设置media的保存路径

#settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

(3)商品分类model 设计

class GoodsCategory(models.Model):
    """
    商品分类
    """
    CATEGORY_TYPE = (
        (1, "一级类目"),
        (2, "二级类目"),
        (3, "三级类目"),
    )

    name = models.CharField(‘类别名‘,default="", max_length=30,help_text="类别名")
    code = models.CharField("类别code",default="", max_length=30,help_text="类别code")
    desc = models.TextField("类别描述",default="",help_text="类别描述")
    #目录树级别
    category_type = models.IntegerField("类目级别",choices=CATEGORY_TYPE,help_text="类目级别")
    # 设置models有一个指向自己的外键
    parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别", help_text="父目录",
                                        related_name="sub_cat")
    is_tab = models.BooleanField("是否导航",default=False,help_text="是否导航")
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "商品类别"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

(4)商品model设计

class Goods(models.Model):
    """
    商品
    """
    category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name="商品类目")
    goods_sn = models.CharField("商品唯一货号",max_length=50, default="")
    name = models.CharField("商品名",max_length=100,)
    click_num = models.IntegerField("点击数",default=0)
    sold_num = models.IntegerField("商品销售量",default=0)
    fav_num = models.IntegerField("收藏数",default=0)
    goods_num = models.IntegerField("库存数",default=0)
    market_price = models.FloatField("市场价格",default=0)
    shop_price = models.FloatField("本店价格",default=0)
    goods_brief = models.TextField("商品简短描述",max_length=500)
    goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300,
                              filePath="goods/files/", default=‘‘)
    ship_free = models.BooleanField("是否承担运费",default=True)
    # 首页中展示的商品封面图
    goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图")
    # 首页中新品展示
    is_new = models.BooleanField("是否新品",default=False)
    # 商品详情页的热卖商品,自行设置
    is_hot = models.BooleanField("是否热销",default=False)
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = ‘商品信息‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class GoodsImage(models.Model):
    """
    商品轮播图
    """
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", related_name="images")
    image = models.ImageField(upload_to="", verbose_name="图片", null=True, blank=True)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = ‘商品轮播‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.goods.name

(4)首页商品轮播图model设计

因为首页的商品轮播图片是大图,跟商品详情里面的图片不一样,所以要单独写一个首页轮播图model

class Banner(models.Model):
    """
    首页轮播的商品
    """
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")
    image = models.ImageField(upload_to=‘banner‘, verbose_name="轮播图片")
    index = models.IntegerField("轮播顺序",default=0)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = ‘首页轮播‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.goods.name

(5)商品广告和热搜model

class HotSearchWords(models.Model):
    """
    搜索栏下方热搜词
    """
    keywords = models.CharField("热搜词",default="", max_length=20)
    index = models.IntegerField("排序",default=0)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = ‘热搜排行‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.keywords

 goods/models.py

3.4.trade交易的model设计

trade/models.py

# trade/models.py
__author__ = ‘derek‘

from datetime import datetime
from django.db import models

from goods.models import Goods

# get_user_model方法会去setting中找AUTH_USER_MODEL
from django.contrib.auth import get_user_model
User = get_user_model()

# Create your models here.
class ShoppingCart(models.Model):
    """
    购物车
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")
    nums = models.IntegerField("购买数量",default=0)

    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = ‘购物车喵‘
        verbose_name_plural = verbose_name
        unique_together = ("user", "goods")

    def __str__(self):
        return "%s(%d)".format(self.goods.name, self.nums)

class OrderInfo(models.Model):
    """
    订单信息
    """
    ORDER_STATUS = (
        ("TRADE_SUCCESS", "成功"),
        ("TRADE_CLOSED", "超时关闭"),
        ("WAIT_BUYER_PAY", "交易创建"),
        ("TRADE_FINISHED", "交易结束"),
        ("paying", "待支付"),
    )
    PAY_TYPE = (
        ("alipay", "支付宝"),
        ("wechat", "微信"),
    )

    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    #订单号唯一
    order_sn = models.CharField("订单编号",max_length=30, null=True, blank=True, unique=True)
    # 微信支付会用到
    nonce_str = models.CharField("随机加密串",max_length=50, null=True, blank=True, unique=True)
    # 支付宝交易号
    trade_no = models.CharField("交易号",max_length=100, unique=True, null=True, blank=True)
    #支付状态
    pay_status = models.CharField("订单状态",choices=ORDER_STATUS, default="paying", max_length=30)
    # 订单的支付类型
    pay_type = models.CharField("支付类型",choices=PAY_TYPE, default="alipay", max_length=10)
    post_script = models.CharField("订单留言",max_length=200)
    order_mount = models.FloatField("订单金额",default=0.0)
    pay_time = models.DateTimeField("支付时间",null=True, blank=True)

    # 用户信息
    address = models.CharField("收货地址",max_length=100, default="")
    signer_name = models.CharField("签收人",max_length=20, default="")
    singer_mobile = models.CharField("联系电话",max_length=11)

    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "订单信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return str(self.order_sn)

class OrderGoods(models.Model):
    """
    订单内的商品详情
    """
    # 一个订单对应多个商品
    order = models.ForeignKey(OrderInfo, on_delete=models.CASCADE, verbose_name="订单信息", related_name="goods")
    # 两个外键形成一张关联表
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")
    goods_num = models.IntegerField("商品数量",default=0)

    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "订单商品"
        verbose_name_plural = verbose_name

    def __str__(self):
        return str(self.order.order_sn)

3.5.用户操作的model设计

user_operation/models.py

# user_operation/models.py
__author__ = ‘derek‘

from datetime import datetime
from django.db import models
from goods.models import Goods

from django.contrib.auth import get_user_model
User = get_user_model()

class UserFav(models.Model):
    """
    用户收藏操作
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", help_text="商品id")
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = ‘用户收藏‘
        verbose_name_plural = verbose_name
        unique_together = ("user", "goods")

    def __str__(self):
        return self.user.username

class UserAddress(models.Model):
    """
    用户收货地址
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户" )
    province = models.CharField("省份",max_length=100, default="")
    city = models.CharField("城市",max_length=100, default="")
    district = models.CharField("区域",max_length=100, default="")
    address = models.CharField("详细地址",max_length=100, default="")
    signer_name = models.CharField("签收人",max_length=100, default="")
    signer_mobile = models.CharField("电话",max_length=11, default="")
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "收货地址"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.address

class UserLeavingMessage(models.Model):
    """
    用户留言
    """
    MESSAGE_CHOICES = (
        (1, "留言"),
        (2, "投诉"),
        (3, "询问"),
        (4, "售后"),
        (5, "求购")
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    message_type = models.IntegerField(default=1, choices=MESSAGE_CHOICES, verbose_name="留言类型",
                                      help_text=u"留言类型: 1(留言),2(投诉),3(询问),4(售后),5(求购)")
    subject = models.CharField("主题",max_length=100, default="")
    message = models.TextField("留言内容",default="",help_text="留言内容")
    file = models.FileField(upload_to="message/images/", verbose_name="上传的文件", help_text="上传的文件")
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "用户留言"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.subject

原文地址:https://www.cnblogs.com/daluozi/p/9467323.html

时间: 2024-11-10 04:43:43

Django REST framework+Vue 打造生鲜超市(二)的相关文章

Django REST framework+Vue 打造生鲜超市(一)

一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实现和核心源码分析 Sentry 完成线上系统的错误日志的监控和告警 第三方登录和支付宝支付的集成 本地调试远程服务器代码的技巧 1.2.课程系统构成 vue前端项目 django rest framework 系统实现前台功能 xadmin后台管理系统 vue部分: API 接口 Vue 组件 与a

Django REST framework+Vue 打造生鲜超市(五)

六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类的serializer goods/serializers.py from rest_framework import serializers from .models import Goods,GoodsCategory class CategorySerializer3(serializers.

Django REST framework+Vue 打造生鲜超市(九)

十.购物车.订单管理和支付功能 10.1.添加商品到购物车 (1)trade/serializer.py # trade/serializer.py __author__ = 'derek' from .models import ShoppingCart from rest_framework import serializers from goods.models import Goods class ShopCartSerializer(serializers.Serializer): #

Django REST framework+Vue 打造生鲜超市(十三)

十四.social_django 集成第三方登录 14.1.申请应用 进入微博开放平台,首先要经过认证,然后才可以创建应用 地址:http://open.weibo.com/authentication 创建应用 写上应用的名字,创建好后,会有个“App Key”,这个非常重要  OAuth2.0 授权设置 正常情况下,必须经过审核才可以让第三方登录,我们可以先用测试模式来完成. (1)添加测试用户,可以测试登录 (2)高级信息  14.2.第三方登录 我们用social_django第三方库来

Django REST framework+Vue 打造生鲜超市(三)

四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py import xadmin from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView from DjangoUeditor.models import UEditor

3- vue django restful framework 打造生鲜超市 - model设计和资源导入

3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, 支持第三方登录.集成了sentry错误监控系统. 本小节内容: model设计与资源引入 资源初始化 数据库设计,数据表结构 新建虚拟环境 mkvirtualenv -p=D:\softEnv

Django rest framework + Vue简单示例

一.创建Vue项目 修改源:npm config set registry https://registry.npm.taobao.org         (建议修改) 创建脚手架:vue init webpack Vue项目名称 基本插件: axios,发送Ajax请求 vuex,保存所有组件共用的变量 vue-cookies,操作cookie 二.流程 vue项目基本目录结构 1.创建脚手架 vue init webpack Vue项目名称 运行 npm run dev 2.App.Vue中

django restful framework 一对多方向更新数据库

目录 django restful framework 序列化 一 . 数据模型: models 二. 序列化: serializers 三, 视图: views 四, 路由: urls 五. 测试 : test django restful framework 序列化 案例: 一个网域domain可以绑定多台服务器主机assets, 但是一台服务器只能绑定一个网域. 数据模型之间关系适用于一对多. 一 . 数据模型: models 定义 assets 模型:apps/assets/models

轻轻松松学会 DRF Django REST framework

DRF Django REST framework 之 APIView(一) DRF Django REST framework 之 解析器(二) DRF Django REST framework 之 序列化(三) DRF Django REST framework 之 视图组件(四) 持续更新中.... 原文地址:https://www.cnblogs.com/pungchur/p/12028316.html