记录项目的框架、数据表设计、项目框架等通用内容
仅作为个人笔记!
目录
1.总体设计
1.1. 项目架构
1.2.数据表设计
1.3.模型类设计
2.项目框架搭建
数据表一定要充分考虑,设计好,不能中途改动,设计模型类的更改很麻烦
模型类设计:模型类设计之前一定要分析设计好表,一旦开始就不要再改动了。
(1)在自己的抽象模型类设计中,设计一个模型类的抽象基类BaseModel,记录创建时间、更新时间、删除标记 。每个类继承之。(在元类中说明是抽象模型类)
(2)在用户模块中,按数据库设计,先设计相应的模型类:
注:外键需要两个位置参数,一个是关联的模型(被关联的类)和 on_delete
选项。在Django2.0版本后, on_delete
选项为必填。
from django.db import models
from django.contrib.auth.models import AbstractUser # 从auth用户验证模块中导入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,)
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
(3)商品模块模型类
from django.db import models
from db.base_model import BaseModel
from tinymce.models import HTMLField # 用富文本类型,需要配置app、默认配置和urls
# 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='商品种类')
goods = models.ForeignKey('Goods', verbose_name='商品SPU')
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='商品状态')
# choices参数可以限定取值范围,这里限定为上面的元组
class Meta:
db_table = 'df_goods_sku'
verbose_name = '商品'
verbose_name_plural = verbose_name
class Goods(BaseModel):
'''商品SPU模型类'''
name = models.CharField(max_length=20, verbose_name='商品SPU名称')
# 富文本类型:带有格式的文本(不是Django内置的)
detail = HTMLField(blank=True, verbose_name='商品详情')
class Meta:
db_table = 'df_goods'
verbose_name = '商品SPU'
verbose_name_plural = verbose_name
class GoodsImage(BaseModel):
'''商品图片模型类'''
sku = models.ForeignKey('GoodsSKU', verbose_name='商品')
# 下面的upload_to='goods'只是随便写给django默认的文件处理系统用的,我们的项目不用这个上传行为
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='商品')
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='商品类型')
sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU')
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
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
(4)订单模块模型类
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='用户')
addr = models.ForeignKey('user.Address', verbose_name='地址')
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, 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='订单')
sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU')
count = models.IntegerField(default=1, verbose_name='商品数目')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
comment = models.CharField(max_length=256, verbose_name='评论')
class Meta:
db_table = 'df_order_goods'
verbose_name = '订单商品'
verbose_name_plural = verbose_name
(1)创建虚拟环境,安装需要的包。
先安装一些基本的包如下:
Django==2.2
django-redis-sessions==0.5.6
django-tinymce==2.6.0
mysqlclient==1.4.6
pytz==2019.3
redis==3.0.1
redis-py-cluster==2.0.0
sqlparse==0.3.1
(2)创建Django项目
上面两步中,路径还需要指明apps较为麻烦,可以在setting.py中把 apps 加入到搜索路径中,上面两步就不用特意添加apps目录了:
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 这句本来就有,BASE_DIR 是项目的路径
sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) # 在第0个位置加上apps目录
创建templates目录,setting.py中配置:
TEMPLATES = [
{
'BACKEND': ...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '你的DB',
'USER': 'root',
'PASSWORD': '你的密码',
'HOST': '你的地址',
'PORT': '3306',
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
创建static目录,配置:
# 设置访问静态文件对应的url地址
STATIC_URL = '/static/'
# 设置静态文件存放的物理目录
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
在每个应用的urls.py中,写上app_name = '应用名',项目urls中不用再写上 namespace
from django.urls import path, include, re_path
from 你的应用 import views
app_name = '应用名'
urlpatterns = [
...
]
(3)模型类设计
新建一个名为 db 的 python package,按照前面模型类的设计
from django.db import models
class BaseModel(models.Model):
"""模型抽象基类"""
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # verbose_name用于在admin中显示
update_time = models.DateTimeField(auto_now=True, verbose_name='新年时间')
is_delete = models.BooleanField(default=False, verbose_name='删除标记')
class Meta:
# 说明是一个抽象模型类
abstract = True
将各个设计好的模型类编写到对应的models.py中;
注意注意:
(1)用户模块中,由于使用了Django内置的认证系统,在进行迁移之前,一定要在 setting.py 配置文件中加一个配置项,指定认证系统使用的模型类是谁,替换默认的认证模型类:
# 指定django认证系统使用的模型类 # AUTH_USER_MODEL = '应用名.类名' AUTH_USER_MODEL = 'user.User'
(2)在mysql中创建表 dailyfresh ,并编辑配置文件,配置数据库远程连接,参考:数据库配置远程连接。
然后执行迁移:
python manage.py makemigrations
python manage.py migrate
查看数据库,生成以下表:
mysql> show tables;
+--------------------------+
| Tables_in_dailyfresh |
+--------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| df_address |
| df_goods |
| df_goods_image |
| df_goods_sku |
| df_goods_type |
| df_index_banner |
| df_index_promotion |
| df_index_type_goods |
| df_order_goods |
| df_order_info |
| df_user |
| df_user_groups |
| df_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+--------------------------+
项目大致框架搭建完毕。
01 框架、数据表设计、项目框架笔记
02 注册、登录、用户中心 (itsdangerous模块加密、celery异步、 Django 的验证系统、redis作为缓存等)
03 FastDFS文件存储-首页-详情页-列表页
04 搜索(搜索引擎、分词包的使用)、购物车
05 订单(Mysql事务、并发处理、支付宝支付、评论)
06 项目部署(uwsgi服务器、Nginx服务器)
-----end-----