商城(项目准备)
1.项目准备
需求分析
-
用户部分
注册:图片验证码,短信验证码
登陆:第三方登陆(qq登陆)
个人信息:邮箱填写与验证,浏览历史记录
地址管理:省市地址信息加载,新增修改删除地址,设置默认地址
修改密码 -
商品部分
首页:商品分类,广告控制
商品列表
商品详情
商品搜索 -
购物车管理
-
订单部分
提交订单
我的订单
订单评价 -
支付部分
支付宝支付
2.项目架构
- 项目采用前后端分离的应用模式
- 前端使用Vue.js
- 后端使用Django REST framework
3.创建工程
在git平台创建工程
在码云上创建新项目,创建基本的项目名称
克隆路径,用ssh来克隆,先在终端生成ssh 秘钥,生成ssh方法如下:
cd .ssh
rm -rf id_rsa id_rsa.pub(删除原来id_rsa id_rsa.pub)
cd
ssh-keygen -t rsh(执行命令)
cd .ssh
复制公钥(cat id_rsa、)
复制私钥(cat id_rsa.pub)
将秘钥复制的码云,我的ssh里面
git clone ssh路径
git checkout -b dev(创建并切换分支到dev)
添加前端文件
将前端文件复制到meiduo子目录中
在执行如下命令:
git add front_end_pc
git add front_end_pc 的时候会报错误CRLF will be replaced by LF in front_end_pc/place_order.html
LF 是换行符 (Linux :\n windows:\r mac :\r\n)
CR 是\r LF是\n
git status
git commit -m ‘add front_end_pc’
git push origin dev:dev
在码云中发起合并(一般都是最后才做的)
在创建的文件中点击Pull Request
然后选择分支dev,点击创建
进入合并页面,选择合并分支
接收合并请求
后端虚拟环境创建
mkvirtualenv meiduo_mall -p python3
pip install django==1.11.11
pip install djangorestframework
pip install pymysql
前端文件开发预览
安装node.js版本控制工具nvm
安装node 相当于在python中安装一个解释器
live-server 可以定时刷新,不会使用缓存
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
退出重新进入终端,安装nvm
nvm install node
安装live-server
npm install -g live-server
这个访问静态文件的时候,需要cd front_end_pc 路径下,执行
live-server 命令
创建数据库
现在root数据库中,创建meiduo29数据库
create database meiduo29 default charset=utf8;
再创建一个数据库用户,专门存放meiduo29的库
create user meiduo identified by ‘meiduo’;
grant all on meiduo_mall.* to ‘meiduo’@’%’;
flush privileges;
说明:
第一句:创建用户账号 meiduo, 密码 meiduo (由identified by 指明)
第二句:授权meiduo_mall数据库下的所有表(meiduo_mall.*)的所有权限(all)给用户meiduo在以任何ip访问数据库的时候(‘meiduo’@’%’)
第三句:刷新生效用户权限
4.配置
-
修改settings/dev.py 文件中的路径信息
在工程目录/meiduo_mall/apps,创建子应用usersINSTALLED_APPS = [ 'meiduo_mall.apps.users.apps.UsersConfig', ]
使用sys.path添加<BASE_DIR>/apps目录,即可添加apps应用的导包路径
添加导包路径
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
2. INSTALLED_APPS
在INSTALLED_APPS中添加rest_framework
INSTALLED_APPS = [
'rest_framework',
]
-
数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 数据库主机 'PORT': 3306, # 数据库端口 'USER': 'meiduo', # 数据库用户名 'PASSWORD': 'meiduo', # 数据库用户密码 'NAME': 'meiduo_mall' # 数据库名字 } }
注意:
记得在meiduo/meiduo_mall/init.py文件中添加
import pymysql
pymysql.install_as_MySQLdb()
- Redis
安装django-redis,
django_redis
为了避免储存新的原生连接所产生的另一份设置Django-redis提供方法get_reids_connection(alians)使你获得可重用的连接字符串
from django_redis import get_redis_connection
con = get_redis_connection(‘default’)
django_redis 依赖于redis,django_redis 已经帮我们创建好了连接对象,get_redis_connection是Django_redis里面的连接对象
并配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.211.55.5:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.211.55.5:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
-
本地化语言与时区
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
-
日志
formatters
verbose
levelname(等级)
asctime(时间)
(module)s%(lineno)d%(message)s 模块里面第几行信息LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' }, 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, }, 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', 'formatter': 'simple' }, 'file': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/meiduo.log"), # 日志文件的位置 'maxBytes': 300 * 1024 * 1024, 'backupCount': 10, 'formatter': 'verbose' }, }, 'loggers': { 'django': { # 定义了一个名为django的日志器 'handlers': ['console', 'file'], 'propagate': True, }, } }
-
异常处理
context 字典 可以指出哪个视图函数新建utils/exceptions.py from rest_framework.views import exception_handler as drf_exception_handler import logging from django.db import DatabaseError from redis.exceptions import RedisError from rest_framework.response import Response from rest_framework import status 获取在配置文件中定义的logger,用来记录日志 logger = logging.getLogger('django') def exception_handler(exc, context): """ 自定义异常处理 :param exc: 异常 :param context: 抛出异常的上下文 :return: Response响应对象 """ # 调用drf框架原生的异常处理方法 response = drf_exception_handler(exc, context) if response is None: view = context['view'] if isinstance(exc, DatabaseError) or isinstance(exc, RedisError): # 数据库异常 logger.error('[%s] %s' % (view, exc)) response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
配置文件中添加
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',
}