luffy-3 前端项目创建+第三方+后端首页轮播图接口+跨域问题详解

前端项目创建

vue create luffycity

重构项目目录

"""
├── luffycity
	├── public/          			# 项目共有资源
		├── favicon.ico				# 站点图标
		└── index.html				# 主页
    ├── src/      					# 项目主应用,开发时的代码保存
    	├── assets/      			# 前台静态资源总目录
    		├── css/				# 自定义css样式
    			└── global.css		# 自定义全局样式
    		├── js/					# 自定义js样式
				└── settings.js		# 自定义配置文件
			└── img/				# 前台图片资源
		├── components/    			# 小组件目录
		├── views/  				# 页面组件目录
		├── App.vue	    			# 根组件
		├── main.js	    			# 入口脚本文件
		├── router    		
			└── index.js			# 路由脚本文件
		store	    		
			└── index.js			# 仓库脚本文件
    ├── vue.config.js	    		# 项目配置文件
    └── *.*							# 其他配置文件
"""

文件修订

App.vue

<template>
    <div id="app">
        <router-view/>
    </div>
</template>

router / index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter);

const routes = [
    {
        path: '/',
        name: 'Home',
        component: Home
    },
    {
        path: '/home',
        redirect: '/',
    },
];

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

Home.vue

<template>
    <div class="home">
    </div>
</template>

<script>
    export default {
        name: 'home',
        components: {
        },
    }
</script>

前端全局样式和js配置

在vue中,有一些默认的样式及js配置,我们不需要

global.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; /* 合并边框 */
}

main.js中引入即可

import './assets/css/global.css'

settings.js

跟后端交互,有个后端地址,设置成一个变量,以后要换,只要改这个变量即可

export default {
    base_url: 'http://127.0.0.1:8000'
}

main.js中引入

// 配置全局自定义设置
import settings from '@/assets/js/settings'
//把settings对象,放到了Vue的原型中,相当于放到了Vue类中,类可以拿到,对象也可以拿到
Vue.prototype.$settings = settings;
// 在所有需要与后台交互的组件中:this.$settings.base_url + '再拼接具体后台路由'

前端使用axios,cookies,elementui

axios

用于和后端交互,ajax传输数据

-第一步:安装
cnpm install axios -S

-第二步:在main.js中引入
import axios from 'axios'
Vue.prototype.$axios=axios

-第三步:使用
this.$axios.get()

cookies

前端自己存放从后端返回的数据

-第一步:安装
cnpm install vue-cookies -S

-第二步:在main.js中引入
import cookies from 'vue-cookies'
Vue.prototype.$cookies=cookies

-第三步:使用
this.$cookies.set('key','value',秒)
this.$cookies.get('key')

elementui

样式库

-第一步:安装
cnpm install element-ui -S

-第二步:在main.js中引入
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

-第三步:使用
直接去elementui官网复制

后端主页模块接口

首页轮播图接口

1.创建一个'home' app

2.在models中创建轮播图表

3.轮播图表中的很多字段会与其他表重复,所以创建一个基表,以后可以继承它,在公共代码utils下创建一个models.py
class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='最后更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
    is_show = models.BooleanField(default=False, verbose_name='是否上架')
    orders = models.IntegerField(verbose_name='优先级')

    class Meta:
        abstract = True  # 是否在数据库中生成表,True表示这个表只用来继承,不会生成

4.在'home'app的models中banner表继承基表
class Banner(BaseModel):
    title = models.CharField(max_length=16, unique=True, verbose_name='名称')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    link = models.CharField(max_length=64, verbose_name='跳转链接')
    info = models.TextField(verbose_name='详情')

    class Meta:
        db_table = 'luffy_banner'
        verbose_name = '轮播图表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title
    
5.迁移
python manage.py makemigrations
python manage.py migrate

跨域问题详解

前后端分离项目中后,前端向后端发送请求,会被禁止,是因为同源策略:它是浏览器的安全策略,浏览器不允许向不同的域发送请求获取数据
同一个域(同源):ip地址和端口号完全一致
请求发出去,后端执行了,但是到前端浏览器,被拦截了,不让进
通过CORS(跨域资源共享)解决-----服务端中,只要在响应头中加入固定的东西,浏览器就能允许数据进入

不使用第三方

# 写个中间件---process_resposne中
from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):
    def process_response(self,request,response):
        if request.method=="OPTIONS":
            #可以加*
            response["Access-Control-Allow-Headers"]="Content-Type"
        response["Access-Control-Allow-Origin"] = "*"
        return response

使用第三方

-第一步:安装---装完确认以下django版本是否还是2.2.2,可能会将django升到最新版
    pip3 install django-cors-headers

-第二步:把它加入到app中
        INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )

-第三步:加入中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',  #cors的中间件
]
-第四步:配置文件
    CORS_ORIGIN_ALLOW_ALL = True 
    CORS_ALLOW_METHODS = (
        'DELETE',
        'GET',
        'OPTIONS',
        'PATCH',
        'POST',
        'PUT',
        'VIEW',
    )

    CORS_ALLOW_HEADERS = (
        'accept-encoding',
        'authorization',
        'content-type',
        'origin',
        'user-agent',

    )

自定义配置

django中有配置文件,项目自己会有一些配置信息,新增一个配置文件

第一步:在settings文件夹下新建common_settings.py
第二步:写入 BANNER_COUNT = 3
第三步:在配置文件中导入
from settings.common_settings import *
posted @ 2022-07-06 21:59  Rain_Kz  阅读(57)  评论(0编辑  收藏  举报