天天生鲜项目搭建指南

一、环境搭建指南


1、首先下载依赖环境
python版本
Django版本
mysql版本
2、环境搭建
2.1、首先创建文件夹,

本人在Windows电脑F盘创建文件夹Django,并在里面创建子目录dailyfresh_version,运行电脑终端Windows PowerShell,首先按照下面顺序进行配置:

# 第一步,对PowerShell的一种配置
Set-ExecutionPolicy Unrestricted
# 第二步,安装Django所需的虚拟环境
pip install virtualenv
# 第三步,进入当前用户名
cd F:\Django\dailyfresh_version
# 第四步,在打开的文件佳下面下载Django项目所依赖的东西
virtualenv .
# 第五步,进入文件夹下的虚拟环境,使用下列指令切换,
.\Scripts\activate		#ps:如果你想取消虚拟环境,运行deactivate
# 第六步,安装django
pip install django		#ps:如果你需要安装制定版本,运行pip install django==版本号
# 第七步,创建项目名,我的项目名为dailyfresh
django-admin startproject 项目名		#django-admin startproject dailyfresh
# 第八步,进入项目
cd 项目名				#ps: cd dailyfresh
# 第九步,测试程序是否运行成功
python manage.py runserver
# 第十步,如果需要用VS code软件打开,直接运行下面指令
code .
2.2 项目框架搭建

首先,利用Pycharm打开新建立的项目文件,后期新建项目直接在pycharm下操作

2.2.1 首先安装富文本,使用如下指令

# 第一步 安装富文本编辑器插件
pip install django-tinymce==2.6.0
# 第二步 在setting中添加该应用
INSTALLED_APPS = [
    #第三方插件应用
    'tinymce',          #富文本编辑器

	#系统自带应用
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
# 第三步 在setting中继续配置富文本编辑器
#富文本编辑器配置
TINYMCE_DEFAULT_CONFIG = {
    'theme': 'advanced',
    'width': 600,
    'height': 400,
}
# 第四步 在setting的同级目录下的url.py中添加如下
from django.urls import path,include			# 导入两个包

# 添加如此指令
urlpatterns = [
    path('admin/', admin.site.urls),
    path('tinymce/',include(('tinymce.urls','tinymce'))),                       #富文本编辑器
    
]

富文本编辑器与模型类有关,富文本编辑器应该查看模型类。

2.2.2 天天生鲜主要包含购物车、货物、用户、还有主页几个功能框,因此我们需要创建这几个app,首先运行如下指令创建

# 第一步,创建四个应用
python manage.py startapp user				
python manage.py startapp goods
python manage.py startapp cart
python manage.py startapp order

然后我们新建一个目录来存放这几个应用,并把这些应用放在里头,然后需要去settings中配置应用,本来要写路径,就是这样写apps.user,但是会很麻烦,所以我们打算直接写user、order等等,那我们可以做如下配置

# 第一步,在setting中指定绝对路径
import os
import sys				# 调用里面的path路径
# BASE_DIR  项目在哪,绝对路径就在哪?
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))			# 项目的绝对路径

# 第二步,添加各模块应用
INSTALLED_APPS = [
    #自定义应用
    'user',     #用户模块
    'goods',    #商品模块
    'cart',     #购物车模块
    'order',    #订单模块


    #第三方插件应用
    'tinymce',          #富文本编辑器

    #系统自带应用
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

2.2.3 添加一个空目录templates,用于存放静态文件,然后在setting中做如下配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2.2.4 创建数据库,打开linux,安装mysql,我的是在Ubuntu20.4安装的,下面提供mysql的安装教程,

如何在Ubuntu上安装mysql

1、更新镜像源,前面安装时已经配置了,如果没有配置对着下面的参考指南看下

2、下载安装mysql

sudo apt-get install mysql-server			# 第一步
sudo apt-get install mysql-client			# 第二步
sudo apt-get install libmysqlclient-dev		# 第三步

3、下载数据库之后没有密码,故我们根据如下配置

mysql -u root -p						# 第一步

找到mysql的根目录:可根据如下流程

pwd(cd …)——>home(cd …)——>ls——>cd /etc/mysql——>ls——>sudo cat debian.cnf——>

指令如下

cd..						# 第一步
cd..						# 第二步
ls							# 第三步
cd /etc/mysql				# 第四步
ls							# 第五步
sudo cat debian.cnf			# 第五步

登录mysql,用sudo cat debian.cnf获得的账号密码(倒数第一是密码,倒数第二是账号)

mysql -u debian-sys-maint -p

输入密码

然后退回MySQL,退回主界面再次进入mysql更改密码,如果无法进入,就用管理员身份进入

进入mysql后,执行下面的更改秘密啊

alter user 'root'@'localhost' identified by '123456'

然后退回主界面,输入

mysql -u root -p
# EnterPassword:		输入自己设置的密码

发现还是无法进入,然后用管理员模式,也就是前面加个sudo,发现可以进入。所以我们还需要最后设置一步,我们最后一次进入debian-sys-maint用户中,然后在mysql语句中输入如下语句

alter user 'root'@'localhost' identified with caching_sha2_password by '123456';
# 然后退出即可

然后自己看下面的教程吧,你们自己看参考教程吧

mysql配置参考教程

安装好后,在终端中创建数据库

# 第一步 登录mysql数据库
mysql -uroot -p123456
# 第二步 查看数据库
show databases;
# 第三步 创建自己的数据库,我要创建数据库名为dailyfresh_version1
create dailyfresh 数据库名		# create dailyfresh dailyfresh_version1

2.2.5 数据库配置,笔者在linux新建mysql数据库,数据库名为dailyfresh_version1,用户名root,端口号:3306 密码:123456 虚拟机IP端口号:192.168.23.150

首先打开dailyfresh,然后找到setting,然后配置下列信息:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',			#使用mysql数据库
        'NAME': 'dailyfresh_version1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '192.168.23.150',           #连接Ubunut1
        'PORT': '3306',
    }
}

然后顺带把时区和地区配置一下,把下面两个参数改变

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

2.2.6 新建静态目录,用于存放一些css和js配置,我们这里将工程目录下的直接复制过来即可,然后我们需要在setting中做如下配置

# 静态文件路径配置
STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]

2.2.7 然后在settings.py同级目录下的url中添加如下指令

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tinymce/',include(('tinymce.urls','tinymce'))),                       #富文本编辑器
    
    path('user/',include(('user.urls','user'),namespace='user')),                #用户模块
    path('cart/',include(('cart.urls','cart'),namespace='cart')),               #购物车模块
    path('order/',include(('order.urls','order'),namespace='order')),           #订单模块
    path('',include(('goods.urls','goods'),namespace='goods')),                 #商品模块
]

2.2.8 然后我们把urls.py到apps下的每个应用(order、user、cart、goods)中拷贝一份,我们先拷贝一份,然后我们需要删掉一些东西,后面做项目的时候边做边加,空目录如下:

from django.conf.urls import url
urlpatterns = [
   
]

然后把包含这个内容的urls.py文件拷贝到各个应用中。

2.2.9 新建一个python包,命名为db,然后在其目录下新建一个python文件base_model.py,并在里头输入如下内容:

from django.db import models


class BaseModel(models.Model):
    """模型抽象基类,为所有继承此基类的类加入如下三个字段"""
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    class Meta:
        """说明是个抽象模型类"""
        abstract = True

2.2.10 为各应用模型类加入如下内容

1、user中的models.py

from django.db import models
from django.contrib.auth.models import AbstractUser  # 用户验证类
from db.base_model import BaseModel


# Create your models here.

class User(AbstractUser, BaseModel):
    """用户模型类"""

    class Meta:
        db_table = 'df_user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name


class Address(BaseModel):
    """地址模型类"""
    user = models.ForeignKey('User', verbose_name='所属账户', on_delete=models.CASCADE)  # 删除user则对应的地址都会被删除
    receiver = models.CharField(max_length=20, verbose_name='收件人')
    addr = models.CharField(max_length=256, verbose_name='收件地址')
    zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')
    phone = models.CharField(max_length=11, verbose_name='联系电话')
    is_default = models.BooleanField(default=False, verbose_name='是否默认')
    
    class Meta:
        db_table = 'df_address'
        verbose_name = '地址'
        verbose_name_plural = verbose_name

2、goods中的models.py

from django.db import models
from db.base_model import BaseModel
from tinymce.models import HTMLField


# Create your models here.

class GoodsType(BaseModel):
    """商品类型模型类"""
    name = models.CharField(max_length=20, verbose_name='种类名称')
    logo = models.CharField(max_length=20, verbose_name='标识')
    image = models.ImageField(upload_to='type', verbose_name='商品类型图片')

    class Meta:
        db_table = 'df_goods_type'
        verbose_name = '商品种类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsSKU(BaseModel):
    """商品SKU模型类"""
    status_choices = (
        (0, '下线'),
        (1, '上线'),
    )

    type = models.ForeignKey('GoodsType', verbose_name='商品种类', on_delete=models.CASCADE)
    goods = models.ForeignKey('Goods', verbose_name='商品SPU', on_delete=models.CASCADE)
    name = models.CharField(max_length=20, verbose_name='商品名称')
    desc = models.CharField(max_length=256, verbose_name='商品简介')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    unite = models.CharField(max_length=20, verbose_name='商品单位')
    image = models.ImageField(upload_to='goods', verbose_name='商品图片')
    stock = models.IntegerField(default=1, verbose_name='商品库存')
    sales = models.IntegerField(default=0, verbose_name='商品销量')
    status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name='商品状态')

    class Meta:
        db_table = 'df_goods_sku'
        verbose_name = '商品'
        verbose_name_plural = verbose_name

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


class Goods(BaseModel):
    """商品SPU模型类"""
    name = models.CharField(max_length=20, verbose_name='商品SPU名称')
    detail = HTMLField(blank=True, verbose_name='商品详情')

    class Meta:
        db_table = 'df_goods'
        verbose_name = '商品SPU'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsImage(BaseModel):
    """商品图片模型类"""
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品', on_delete=models.DO_NOTHING)
    image = models.ImageField(upload_to='goods', verbose_name='图片路径')

    class Meta:
        db_table = 'df_goods_image'
        verbose_name = '商品图片'
        verbose_name_plural = verbose_name


class IndexGoodsBanner(BaseModel):
    """首页轮播商品展示模型类"""
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品', on_delete=models.DO_NOTHING)
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_banner'
        verbose_name = '首页轮播商品'
        verbose_name_plural = verbose_name


class IndexTypeGoodsBanner(BaseModel):
    """首页分类商品展示模型类"""
    DISPLAY_TYPE_CHOICES = (
        (0, "标题"),
        (1, "图片")
    )

    type = models.ForeignKey('GoodsType', verbose_name='商品类型', on_delete=models.DO_NOTHING)
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU', on_delete=models.DO_NOTHING)
    display_type = models.SmallIntegerField(default=1, choices=DISPLAY_TYPE_CHOICES, verbose_name='展示类型')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_type_goods'
        verbose_name = '主页分类展示商品'
        verbose_name_plural = verbose_name

    # def __str__(self):
    #     return self.get_display_type_display()


class IndexPromotionBanner(BaseModel):
    """首页促销活动模型类"""
    name = models.CharField(max_length=20, verbose_name='活动名称')
    url = models.URLField(verbose_name='活动链接')
    image = models.ImageField(upload_to='banner', verbose_name='活动图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_promotion'
        verbose_name = '主页促销活动'
        verbose_name_plural = verbose_name

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

3、order中的models.py

from django.db import models
from db.base_model import BaseModel


# Create your models here.

class OrderInfo(BaseModel):
  
    PAY_METHOD_CHOICES = (
        (1, '货到付款'),
        (2, '微信支付'),
        (3, '支付宝'),
        (4, '银联支付')
    )

    ORDER_STATUS_CHOICES = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成')
    )

    order_id = models.CharField(max_length=128, primary_key=True, verbose_name='订单id')
    user = models.ForeignKey('user.User', verbose_name='用户', on_delete=models.CASCADE)
    addr = models.ForeignKey('user.Address', verbose_name='地址', on_delete=models.CASCADE)
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name='支付方式')
    total_count = models.IntegerField(default=1, verbose_name='商品数量')
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品总价')
    transit_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='订单运费')
    order_status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name='订单状态')
    trade_no = models.CharField(max_length=128, default='', verbose_name='支付编号')

    class Meta:
        db_table = 'df_order_info'
        verbose_name = "订单"
        verbose_name_plural = verbose_name


class OrderGoods(BaseModel):
    """订单商品模型类"""
    order = models.ForeignKey('OrderInfo', verbose_name='订单', on_delete=models.DO_NOTHING)
    sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU', on_delete=models.DO_NOTHING)
    count = models.IntegerField(default=1, verbose_name='商品数目')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    comment = models.CharField(max_length=256, default='', verbose_name='评论')

    class Meta:
        db_table = 'df_order_goods'
        verbose_name = '订单商品'
        verbose_name_plural = verbose_name

加了这些后,为了讲models.py中的文件迁移到数据库中,我们可以添加如下内容,到settings中加入

#django认证系统使用的模型类
#作用:生成我们所需的模型类对应的表
AUTH_USER_MODEL='user.User'

2.2.11 然后再pycharm中运行python manage.py runserver,不出意外,此时定会报错,因为还未进行数据库迁移,此时我们需要python manag.py migrate,不出意外,又会出现报错,因为虚拟机下的数据库并未给其授权,此时我们需要做如下配置

Django的mysql的远程登录关于linux的配置

首先在终端输入

ifconfig

可能没有安装ifconfig这个插件,我们运行下面的的命令行

sudo apt install net-tools

然后我们需要进入配置文件,把原来的那个地址更改,先运行

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

把里面的

bind address=****改一下,改成ifconfig中显示的那个

然后使用mysql数据库做点配置,

use mysql;

然后输入

select host,user from user;

然后输入

update user set host='%' where user='root';

然后授权数据库

flush privileges;

参考文档

然后还出了一个错,django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.由于pycharm中未安装与数据库相关的应用,此时我们需要再数据库中安装应用,首先我们在dailyfresh文件下的__init__.py中加入

# 第一步,在__init__.py中添加如下内容
import pymysql
pymysql.install_as_MySQLdb()
# 第二步,在终端中安装响应的插件有
pip install pymysql
# 第三步,可能需要安装Pillow
python -m pip install Pillow
# 第四步,安装cryptography
pip install cryptography
# 第五步,在终端执行下面命令
python manage.py makemigrations
# 第六步,将文件迁移到数据库
python manage.py migrate

现在迁移数据库就没有啥问题了。此时我们把数据库与pycharm项目连接完成了

天天生鲜项目搭建文件可从公众号学聚思获取,关注公众号:学聚思、学聚思、学聚思。重要的事情说三遍

本文博客获取关键词:天天生鲜项目框架博客;

本项目关键词:天天生鲜项目框架

请大家按照关键字搜索哦,另外,本人创建了1个QQ群欢迎各位加入讨论

QQ群号:301666877

天天生鲜项目学习视频

另外如果需要其他资源,比如视频中的工程文档,欢迎公众号留言

本内容持续更新直至天天生鲜项目完成!


第一章,环境配置与天天生鲜项目框架搭建

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐