一、luffy前台配置
1.1  gloabl.css
/* 声明全局样式和项目的初始化样式 */
body, h1, h2, h3, h4, h5, h6, p, table, tr, td, ul, li, a, form, input, select, option, textarea {
    margin: 0;
    padding: 0;
    font-size: 15px;
}
a {
    text-decoration: none;
    color: #333;
}
ul {
    list-style: none;
}
table {
    border-collapse: collapse; /* 合并边框 */
}
1.2  settings.js
export default {
    BASE_URL:'http://127.0.0.1:8000/'
}
1.3  main.js
//5 去掉所有标签默认样式
import '@/assets/css/global.css'
// 6 全局配置
import settings from "@/assets/js/settings";
Vue.prototype.$settings=settings
二、luffy后台配置
2.1  后台主页模块接口
创建home app
前提:在 luffy 虚拟环境下
1.终端从项目根目录进入apps目录
>: cd luffyapi & cd apps
2.创建app
>: python ../../manage.py startapp home
utils/model.py
from django.db import models
class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now_add=True, verbose_name='最后更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
    is_show = models.BooleanField(default=True, verbose_name='是否上传')
    orders = models.IntegerField(verbose_name='优先级')
    class Meta:
        abstract = True     # BaseModel是张虚拟表,不在数据库生成,只用于继承
home/models.py
from django.db import models
from utils.model import BaseModel
# Create your models here.
class Banner(BaseModel):
    title = models.CharField(max_length=32, unique=True, verbose_name='轮播图名称')
    image = models.ImageField(upload_to='banner', verbose_name='轮播图图片')
    link = models.CharField(max_length=32, verbose_name='跳转链接')
    detail = models.TextField(verbose_name='轮播图详情')
    class Meta:
        db_table = 'luffy_banner'
        verbose_name_plural = '轮播图表'
    def __str__(self):
        return self.title
执行两条数据库迁移命令
 # 数据库迁移
     python manage.py makemigrations
     python manage.py migrate

2.2  轮播图接口编写
utils/view.py
from rest_framework.mixins import ListModelMixin
from utils.response import APIResponse
class CommonListModelMixin(ListModelMixin):
    def list(self, request, *args, **kwargs):
        res = super().list(request, *args, **kwargs)
        return APIResponse(result=res.data)
utils/response.py
from rest_framework.response import Response
class APIResponse(Response):  # 继承Response进行封装
    def __init__(self, code=200, msg='响应成功', status=None, headers=None, **kwargs):
        data = {'code': code, 'msg': msg}
        if kwargs:
            data.update(kwargs)
        super().__init__(data=data, status=status, headers=headers)
home/views.py
rom rest_framework.viewsets import GenericViewSet
from utils.view import CommonListModelMixin
from home.models import Banner
from home.serializer import BannerSerializer
class BannerView(GenericViewSet, CommonListModelMixin):
    queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')
    serializer_class = BannerSerializer
home/serializer.py
from rest_framework.serializers import ModelSerializer
from home.models import Banner
class BannerSerializer(ModelSerializer):
    class Meta:
        model = Banner
        fields = ['title', 'image', 'link']
主路由:luffy_test/urls.py
from django.contrib import admin
from django.urls import path, include
from home import views
from django.views.static import serve
from django.conf import settings
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/home/', include('home.urls')),
    # 开启media访问
    path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT}),
]
子路由:home/urls.py
from . import views
from rest_framework.routers import SimpleRouter
route = SimpleRouter()
route.register('banner', views.BannerView, 'banner')
urlpatterns = [
]
urlpatterns += route.urls
安装simpleui
# 安装simpleUi
	pip install django-simpleui


在配置文件中修改国际化配置并注册simpleui
# settings/dev.py
INSTALLED_APPS = [
    'simpleui',                     # 首行添加内容,注册simpleui
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'home',
    'user',
]
LANGUAGE_CODE = 'zh-hans'          # 修改语言
TIME_ZONE = 'Asia/Shanghai'		  # 修改时区
USE_I18N = True
USE_L10N = True
USE_TZ = False
创建管理员用户
# 创建管理员用户
	python manage.py createsuperuser

登录django后台
# django后台管理
	127.0.0.1:8000/admin

在admin.py中注册Banner表
from django.contrib import admin
# Register your models here.
from .models import Banner
admin.site.register(Banner)
测试数据录入



本地访问测试

三、解决跨域问题
3.1  什么是跨域?
跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 
举例:
  出于安全考虑(比如csrf攻击),浏览器一般会禁止进行跨域访问,但是因为有时相应的需求,需要允许跨域访问,这时,我们就需要将跨域访问限制打开。启动一个web服务,端口是8081,然后再开启一个web服务/前端服务都可以,端口是8082,然后再8082的服务中通过ajax来访问8081的服务,这就不满足同源策略,就会出现跨域问题
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现
请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险
3.2  如何解决跨域?
解决跨域问题的方式也有多种。
1、前后端结合(JsonP)
  虽然jsonp也可以实现跨域,但是因为jsonp不支持post请求,应用场景受到很大限制,所以这里不对jsonp作介绍。
2、纯后端方式一(CORS方式)
  CORS 是w3c标准的方式,通过在web服务器端设置:响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4,firefox3.5,safair4,opera12支持这种方式。
  服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。
  跨域资源共享,后端技术,核心就是在响应头中加入数据,允许浏览器接受数据
    
  CORS需要浏览器和服务器同时支持,IE浏览器不能低于IE10
3.纯后端方式二(Nginx代理方式)
  首先配置Nginx的反向代理方式 
    
4.Nginx配置跨域解决 
 
    location / {  
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        if ($request_method = 'OPTIONS') {
            return 204;
    }
    proxy_pass http://192.168.12.1:8081;
    }
# 这里使用的是CORS方式解决跨域请求,如下:
3.3  CORS基本流程
 浏览器将CORS请求分成两类:
        简单请求(simple request)
        非简单请求(not-so-simple request)
3.4  简单请求与非简单请求
# 简单请求:
    浏览器发出CORS简单请求,只需要在头信息之中增加一个Access-Control-Allow-Origin字段
    
# 非简单请求
    浏览器发出CORS非简单请求,会在正式通信之前,先发送一个options请求,称为”预检”请求。
    浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,如果运行,再发真正的请求
    
# 什么是简单请求,什么是非简单请求
	-满足下面两种情况,就是简单请求
    	1 请求方法是以下三种方法之一:
            HEAD
            GET
            POST
        2 HTTP的请求头信息不超出以下几种字段:
            Accept
            Accept-Language
            Content-Language
            Last-Event-ID
            Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
pip install django-cors-headers

3.6  添加到settings/dev.py的app中
INSTALLED_APPS = (
	...
	'corsheaders',
	...
)
3.7  添加中间件
MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
	...
	'corsheaders.middleware.CorsMiddleware',
	'django.middleware.common.CommonMiddleware',
	...
]
3.8  setting/dev.py中添加下面的配置
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
	'*'
)
CORS_ALLOW_METHODS = (
	'DELETE',
	'GET',
	'OPTIONS',
	'PATCH',
	'POST',
	'PUT',
	'VIEW',
)
CORS_ALLOW_HEADERS = (
	'XMLHttpRequest',
	'X_FILENAME',
	'accept-encoding',
	'authorization',
	'content-type',
	'dnt',
	'origin',
	'user-agent',
	'x-csrftoken',
	'x-requested-with',
	'Pragma',
)
四、自定义配置
4.1  settings/common_settings.py
# 轮播图显示的条数
BANNER_COUNT = 3
4.2  settings/dev.py
from settings.common_settings import *
4.3  home/views.py
from rest_framework.viewsets import GenericViewSet
from utils.view import CommonListModelMixin
from home.models import Banner
from home.serializer import BannerSerializer
from django.conf import settings
class BannerView(GenericViewSet, CommonListModelMixin):
    queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]
    serializer_class = BannerSerializer
五、Git介绍与安装
5.1  Git下载与安装
# 下载地址
	https://git-scm.com/downloads
        
# 安装一路下一步即可
    在桌面任意位置点击鼠标右键,如果有两个东西(【git gui here】  【git bash here】),表示安装完成

5.2  pycharm配置Git


5.3  svn,git ,github,gitee,gitlab的区别
# svn:版本管理软件,它是集中式的版本管理,必须有个svn的服务端,服务端如果过来,svn就用不了了
# git:版本管理软件,它是一个分布式的版本管理,每个客户端都可以作为服务端,即便服务端挂了,也能进行版本管理(本地管理)
# github:全球最大的开源远程git仓库,全球最大的开源仓库,git远程仓库
# gitee:中国最大的开源软件仓库   【私有仓库,花钱买空间】
# gitlab:公司内部的远程仓库,运维搭建维护
六、wsgi,uWSGI,uwsgi的区别
=========================================================================================================================================
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。描述的是Web服务器如何与Web应用间进行通信
它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范。
WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。
=========================================================================================================================================
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI,是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信协议。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,用于与nginx等代理服务器通信,它与WSGI相比是两样东西。
uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
# 更多详情,请参考下方博客链接
https://www.liuqingzheng.top/article/1/05-CGI,FastCGI,WSGI,uWSGI,uwsgi%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82/
七、软件开发模式
=========================================================================================================================================
一、瀑布开发模式
瀑布开发模式是一种传统的软件开发模式,瀑布法是一个刚性的线性模型,其中包括顺序阶段(需求,设计,实施,验证,维护),其中每一个阶段的目标性都很明确。而且在进入下一阶段之前,每个阶段目标必须100%地完成,但这种模式如果进行回溯修改时会比较麻烦。
但该方法的线性特性使其易于理解和管理。如果软件项目对稳定要求比较高,那可以选择这种开发模式。在使用瀑布开发模式时丰富的软件开发经验会比较有帮助。然而,由于刚性结构和严格的控制特点,通常会导致项目的开发时间比较慢、成本比较昂贵。
=========================================================================================================================================
二、快速应用开发模式
快速应用开发模式是一个比较精简的软件开发流程,可以以低投资成本生产高质量的软件。这种RAD流程可以使开发人员快速适应不断变化的市场需求。快速调整的能力可以帮助企业节省开发成本。快速应用程序开发模式分为四个阶段:需求规划,用户设计,构建和切换。重复用户设计和施工阶段,直到满足用户的所有要求。
RAD对于具有明确定义的业务目标及用户组的开发项目最有效,比较适用于一些中小型软件开发项目,或者是开发时间比较紧迫的软件项目。然而,它需要技术人员具有丰富开发经验,以及要非常了解用户的核心需求。
=========================================================================================================================================
三、敏捷开发模式
敏捷开发模式有许多不同的形式,包括:Scrum,Crystal,Extreme Programming(XP)和Feature-Driven Development(FDD)。它通过迭代开发,关注互动沟通等方法来降低软件开发过程中的风险,同时也可以减少在开发中的资源消耗。好处是通过早期发现和修复缺陷来提高开发的效率。但这种模式比较依赖用户的信息反馈,而且这种模式比较适用于小规模的软件开发公司,习惯于“瀑布法”的程序员,管理层和组织可能难以适应敏捷。
=========================================================================================================================================
四、DevOps部署模式
DevOps部署模式增强了软件开发部门之间的协作,如开发,测试和运营。它着重于改进软件的上市时间,降低新版本的故障率,缩短BUG修复的交付时间,优先考虑最小的中断以及最大的可靠性等。
使用DevOps部署模式对提高客户满意度,提高产品质量,提高员工的生产力和效率得益(Efficiency Gain)等方面非常有用。但DevOps也有一些缺点:
有些客户不想持续更新他们的软件
一些行业在允许进入运营阶段之前,需要进行大量测试
不同部门使用的不同环境可能导致软件开发过程中一些问题不会显现出来
一些质量属性需要人为的相互作用,这会减慢软件的交付流程