博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
chapter 3、项目配置
阅读量:2345 次
发布时间:2019-05-10

本文共 12378 字,大约阅读时间需要 41 分钟。

全项目流程目录:

项目标准源码:

目录

 


3.1 数据库连接

1、在数据库中新建数据库 mxshop 

2、在sittings.py中配置数据库

sittings.py

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': "mxshop",        'USER': "root",        'PASSWORD': "520lkl",        'HOST': "127.0.0.1",        'PORT': "3306",        # 'OPTIONS': {'init_command': 'SET storage_engine=INNODB;'}    }}

3、使用pymysql 不再使用mysql-client(mysql-client与python3不兼容)

在于与sitting同级文件夹下的__Init__.py文件下引入数据库,在连接mysql时需要这样子做,如果不引入将会出现以下错误:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

__init__.py

import pymysqlpymysql.install_as_MySQLdb()

在工程文件夹下新建以下文件夹

 

3.2 将搭建vue运行环境

1、在vue所在文件夹下打开cmd运行: cnpm install

2、cnpm run dev

3、打开浏览器输入 http://localhost:8080,或者http://127.0.0.1:8080,打开网页

4、新建三个Django项目:users,users_operation,goods,并将他们注册到sittings.py 中

5、替换系统用户

sittings.py

AUTH_USER_MODEL= "users.UserProfile"#替换系统用户

3.3-3.6定义后台字段,并进行数据迁移

users.modes.py

from datetime import datetimefrom django.db import modelsfrom django.contrib.auth.models import AbstractUser# Create your models here.class UserProfile(AbstractUser):#扩展用户信息数据库    birthday = models.DateTimeField(verbose_name=u"生日", null=True, blank=True, default=None)    name = models.CharField(max_length=30, verbose_name=u"昵称", null=True, blank=True)    gender = models.CharField(choices=(("male",u"男"),("female",u"女")),default="",max_length=6)    # address = models.CharField(max_length=100,default=u"")    mobile = models.CharField(max_length=11,verbose_name='电话号码')    # image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.img",max_length=100)#用户头像和默认头像    class Meta:        verbose_name = u"用户信息"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.name    # def unread_message(self):    #     '''    #     获取当前用户未读的信息的条数    #     在当前方法内部 引入外部模块,防止循环引用    #     '''    #     from operation.models import UserMessage    #     message = UserMessage.objects.filter(user = self.id,has_read = False)    #     return message.count()class VerifyCodede(models.Model):    code = models.CharField(max_length=6,verbose_name='验证码')    mobile = models.CharField(max_length=11,verbose_name='电话号码')    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")    class Meta:        verbose_name = u"短信验证码"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.code

goods.models.py

from datetime import datetimefrom django.db import modelsfrom DjangoUeditor.models import UEditorFieldclass GoodsCategory(models.Model):    CATEGORY_TYPE = (        (1,'一级类别'),        (2,'二级类别'),        (3,'三级类别')    )#做choice用    name = models.CharField(max_length=50,verbose_name='类别名',default='',help_text='类别名')    code = models.CharField(max_length=50, verbose_name='类别编号',default='',help_text='类别编号')    desc = models.TextField(verbose_name='类别描述',help_text='类别描述')    category_type = models.CharField(choices=CATEGORY_TYPE, verbose_name='类目级别',help_text='类目级别',max_length=10)    parent_category = models.ForeignKey('self', verbose_name='父类目录级',null=True,blank=True,related_name='sub_cat',on_delete=models.CASCADE)    is_tab = models.BooleanField(default=False, verbose_name='是否导航',help_text='是否导航')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = u"商品类别"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.nameclass GoodsCategoryBrand(models.Model):    category = models.ForeignKey(GoodsCategory, verbose_name='商品类目', help_text='商品类目', on_delete=models.CASCADE)    name = models.CharField(max_length=50, verbose_name='品牌名',help_text='品牌名',default='')    desc = models.TextField(verbose_name='品牌描述',help_text='品牌描述',default='',max_length=500)    image = models.ImageField(max_length=100, verbose_name='图片上传',upload_to='brand/images/')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = u"品牌"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.nameclass Goods(models.Model):    category = models.ForeignKey(GoodsCategory,verbose_name='商品类目', help_text='商品类目',on_delete=models.CASCADE)    name = models.CharField(max_length=50, verbose_name='商品名', help_text='品牌名', default='')    goods_sn = models.CharField(max_length=50, verbose_name='商品货号', help_text='商品货号', default='')    click_nums = models.CharField(max_length=50, verbose_name='点击数', help_text='点击数', default='')    sold_nums = models.CharField(max_length=50, verbose_name='售卖数', help_text='售卖数', default='')    goods_nums = models.CharField(max_length=50, verbose_name='库存数', help_text='库存数', default='')    market_price = models.FloatField(max_length=50, verbose_name='市场价格', help_text='市场价格', default='')    shop_price = models.FloatField(max_length=50, verbose_name='售卖价格', help_text='售卖价格', default='')    goods_brief = models.CharField(max_length=50, verbose_name='商品简述', help_text='商品简述', default='')    goods_desc = UEditorField(verbose_name='商品描述内容',imagePath='good/images', filePath='goods/files',default='')    ship_free = models.BooleanField(max_length=50, verbose_name='是否免运费', help_text='是否免运费', default='')    goods_front_img = models.ImageField(max_length=50, verbose_name='商品首页图', help_text='商品首页图', default='')    is_new = models.BooleanField(default=False, verbose_name='是否为新品')    is_hot = models.BooleanField(verbose_name='是否为热销商品', default=False)    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "商品"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.nameclass GoodsImage(models.Model):    goods = models.ForeignKey(Goods,verbose_name='商品',related_name='images',on_delete=models.CASCADE)    image = models.ImageField(verbose_name='商品图片',upload_to='brand/images/')    image_url = models.CharField(max_length=100, verbose_name='图片url')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = '商品图片'        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.goods.nameclass Banner(models.Model):    '''    轮播商品    '''    goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)    image = models.ImageField(upload_to='banner',verbose_name='轮播图')    index = models.IntegerField(default=0,verbose_name='轮播顺序')    add_time = models.DateTimeField(default= datetime.now,verbose_name='添加时间')    class Meta:        verbose_name = '轮播图片'        verbose_name_plural = verbose_name    def __str__(self):        return self.goods.name

trade.models.py

from datetime import datetimefrom django.db import modelsfrom django.contrib.auth import get_user_model#拿到userprofileUser = get_user_model()from goods.models import Goodsclass ShoppingCart(models.Model):    user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)    goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)    nums = models.IntegerField(default=0,verbose_name='购买数量')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "购物车"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return "%s(%d)".format(self.goods.name,self.goods_nums)class OrderInfo(models.Model):    '''    订单    '''    ORDER_STATUS = (        ('success','成功'),        ('cancal','取消'),        ('cancal','待支付')    )    # PAY_TYPE = (    #     ('alipay','支付宝'),    #     ('wechat','微信')    # )    user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)    order_sn = models.CharField(max_length=30,verbose_name='订单编号')#订单编号    trade_sn = models.CharField(max_length=100,unique=True,null=True,blank=True,verbose_name='交易编号')#交易编号    pay_status = models.CharField(choices=ORDER_STATUS,max_length=10,verbose_name='订单状态')    post_script = models.CharField(max_length=10,verbose_name='订单留言')    order_mount = models.FloatField(default=0.0,verbose_name='点单金额')    pay_time = models.DateTimeField(null=True,blank=True,verbose_name='支付时间')    address = models.CharField(max_length=100,default='',verbose_name='收货地址')    signer_name = models.CharField(max_length=20,default='',verbose_name='签收人')    signer_mobile = models.CharField(max_length=11,verbose_name='联系电话')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "订单"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return str(self.order_sn)class OrderGoods(models.Model):    '''    订单的商品详情    '''    order = models.ForeignKey(OrderInfo,verbose_name='订单信息',on_delete=models.CASCADE)    goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)    goods_num = models.IntegerField(default=0,verbose_name='商品数量')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "订单商品"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return str(self.order.order_sn)

user_operation.py

from datetime import datetimefrom django.db import modelsfrom django.contrib.auth import get_user_modelUser = get_user_model()from goods.models import Goods# Create your models here.class UserFav(models.Model):    '''    用户收藏    '''    user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)    goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "用户收藏"        verbose_name_plural = verbose_name    def __str__(self):#admin 管理时返回的题目标题        return self.user.nameclass UserLeavingMessage(models.Model):    '''    用户留言    '''    MESSAGE_CHIOCES = (        (1,'留言'),        (2,'投诉'),        (3,'询问'),        (4,'售后'),        (5,'求购')    )    user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)    message_type = models.IntegerField(default=1,choices=MESSAGE_CHIOCES,verbose_name='留言',                                       help_text="留言类型:1(留言),2(投诉),3(询问),4(售后),5(求购)")    subject = models.CharField(max_length=100,default='',verbose_name='主题')    message = models.TextField(default='',verbose_name='留言内容',help_text='留言内容')    file = models.FileField(verbose_name='上传的文件',help_text='上传的文件')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "用户留言"        verbose_name_plural = verbose_name    def __str__(self):  # admin 管理时返回的题目标题        return self.subjectclass UserAddress(models.Model):    '''    用户收货地址    '''    user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)    district = models.CharField(max_length=100,default='',verbose_name="区域")    address = models.CharField(max_length=100,default='',verbose_name='收货地址')    signer_name = models.CharField(max_length=20,default='',verbose_name='签收人')    signer_mobile = models.CharField(max_length=11,default='',verbose_name='签收电话')    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')    class Meta:        verbose_name = "收货地址"        verbose_name_plural = verbose_name    def __str__(self):  # admin 管理时返回的题目标题        return self.address

3.7xadmin配置

1、在每个项目下面新建adminx.py文件

2在sitting.py中注册adminx

INSTALLED_APPS = [      'xadmin'    'crispy_forms']

3、安装以下插件,不用考虑版本,直接使用最新版

xlwt,xlsxwriter插件的安装

4、进行数据迁移,将xadmin添加到数据库

5、将xadmin注册到urls.py文件中

from django.urls import path,include,re_pathimport xadminurlpatterns = [    path('xadmin/', xadmin.site.urls),]

6、创建xadmin后台管理超级用户

python manage.py createsuperuser 

7、修改系统语言

在sitting.py中,将

LANGUAGE_CODE = 'en-ch' 改为
LANGUAGE_CODE = 'zh-hans'

3.8将数据导入数据库中

在将数据导入数据库中时,一定要检查models是否设计完整,否则保存时会出现以下错误save() prohibited to prevent data loss due to unsaved related object 'goods'.

1、在保存前models中的外键必须先保存

2、boolean类型数据必须给初始值

3、charfield类型数据必须给初始长度

最后实在是没办法,各种连级删除或添加出错时,直接暴力删除数据库和各个app下面的migration里面的python文件,然后重新进行数据迁移,当然这样什么数据都没有了,xadmin后台管理员也要重新设置

3.9 配置静态文件访问路径

 sittings.py

MEDIA_URL = '/media/'MEDIA_ROOT = os.path.join(BASE_DIR,'media)

urls.py

from MxShop.settings import MEDIA_ROOTfrom django.views.static import serveurlpatterns = [    re_path(r'^media/(?P
.*)$', serve, { 'document_root': MEDIA_ROOT,}),]

 

你可能感兴趣的文章
我们应该@Override接口的方法实现吗?
查看>>
ng-repeat定义次数而不是重复数组?
查看>>
java项目之——坦克大战10
查看>>
java项目之——坦克大战11
查看>>
顶级域名注册分布统计:2006年09月 .com .de .net .uk .cn
查看>>
雅虎通可以批量添加MSN用户了
查看>>
C/C++题目--拷贝构造函数概念
查看>>
C/C++题目--深复制与浅复制
查看>>
数据结构教程--李春葆版(总结)之线性表-顺序存储结构练习题
查看>>
linux gdb的详细用法 运行与断点
查看>>
删除vector中重复元素
查看>>
和为s的连续正数序列
查看>>
什么是Redis?什么是nosql?NoSQL数据库的四大分类
查看>>
为什么说Redis是单线程的以及Redis为什么这么快!
查看>>
redis的过期健删除策略以及内存淘汰机制
查看>>
Mysql几种索引类型的区别及适用情况
查看>>
判断一个数组,是否可以分成两个数组之和相等的数组
查看>>
背包问题
查看>>
结构体变量之间的比较和赋值原理
查看>>
Hadoop Hdfs 配置
查看>>