前后端分离 项目(一)

目录

  • 1. 后端Django项目

    • (1)settings.py文件
    • (2)api/models.py文件
    • (3)api/admin.py文件
    • (4)urls.py文件
    • (5)api/urls.py文件
    • (6)api/views/course.py文件
    • (7)api/serializers/course.py文件
  • 2. 前端Vue项目
    • (1)src/main.js文件
    • (2)src/router.js文件
    • (3)src/views/Course.vue文件

1. 后端Django项目

目录结构:

(1)settings.py文件

# 下载 处理跨域问题的app:
pip install django-cors-headers
# 注册app:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api.apps.ApiConfig',
    'corsheaders'  # 注册app
]
# 注册中间件:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # 必须放在第一个位置
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# corsheaders配置项:
CORS_ORIGIN_ALLOW_ALL = True  # 允许所有人 跨域请求 我的服务端

(2)api/models.py文件

项目表结构设计

  • 课程相关

    • 课程类表CourseCategory
    • 专题课程表Course
    • 课程详情表CourseDetail
    • 老师表Teacher
    • 价格与有课程效期表PricePolicy
    • 课程章节表CourseChapter
    • 课时目录表CourseSection
    • 常见问题表OftenAskedQuestion
  • 优惠券相关
    • 优惠券生成规则Coupon
    • 优惠券发放、消费纪录CouponRecord
  • 订单相关
    • 订单Order
    • 订单详情OrderDetail
  • 用户相关
    • 用户表UserInfo -- 继承AbstractUser
    • Token

注意:settings.py文件中添加配置项

# 告诉Django用我自己写的 UserInfo表 代替内置的 User表
AUTH_USER_MODEL = 'api.UserInfo'    # app名.表名

(3)api/admin.py文件

from django.contrib import admin
from api import models

admin.site.register(models.Course)          # 课程表
admin.site.register(models.CourseDetail)    # 课程详情表
admin.site.register(models.CourseCategory)  # 课程分类表
admin.site.register(models.CourseChapter)   # 课程章节表
  • 创建超级用户
python manage.py createsuperuser
  • 启动Django项目, 进入admin页面, 对以上四个表的数据进行修改

(4)urls.py文件

路由分发:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^api/', include('api.urls')),
]

(5)api/urls.py文件

路由匹配:

from django.conf.urls import url
from api.views import course as course_view
from api.views import login as login_view

urlpatterns = [
    # 课程展示
    url(r'courses/$', course_view.CourseListView.as_view()),
]

(6)api/views/course.py文件

from rest_framework.generics import ListAPIView
from api import models
from api.serializers.course import CourseModelSerializer
from rest_framework.response import Response

class CourseListView(ListAPIView):
    queryset = models.Course.objects.all()
    serializer_class = CourseModelSerializer

    def get(self, request, *args, **kwargs):
        """"重写ListAPIView的get方法"""
        pass

由于是前后端分离, 对于视图函数CourseListView, 我们要返回一个合适的接口, 因此,

必须重写父类的get方法. 这个时候, 就需要看一看ListAPIView的源码了.

  • ListAPIView源码:

  • 点击进入list方法:

现在, 我们回归到本来的问题上, 我们要重写ListAPIView的get方法, 从而返回一个合适的接口, 但是, 由于ListAPIView本身也有一些功能, 如果我们直接重写, 势必会对其他功能造成影响. 我们的解决办法是: 将list方法功能相关的代码直接粘贴到我们重写的get方法里, 然后在不改动这些代码的前提下, 进行我们自己的处理(主要是处理返回值, 即接口).

course.py文件:

from rest_framework.generics import ListAPIView
from api import models
from api.serializers.course import CourseModelSerializer
from rest_framework.response import Response

class CourseListView(ListAPIView):
    queryset = models.Course.objects.all()
    serializer_class = CourseModelSerializer

    def get(self, request, *args, **kwargs):
        try:
            #### list源码 ####
            queryset = self.filter_queryset(self.get_queryset())
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
            serializer = self.get_serializer(queryset, many=True)
            #### list源码 ####
            data = serializer.data
        except Exception as e:
            code = 1
            msg = str(e)
        res = {'code': code, 'data': data, 'msg': msg}
        return Response(res)

上面代码中, res这个字典就是我们与前端交互的接口. 由于每次都要自己硬编码该字典内部的key和value, 这样的做法是不可靠且极为繁琐的, 因此, 我们考虑将它们封装为一个对象. 如下所示:

  • 工具类: utils/response.py文件
class BaseResponse(object):

    def __init__(self):
        self.code = 1000  # 状态码
        self.data = None  # 具体数据
        self.msg = ''     # 提示信息

    @property
    def dict(self):
        return self.__dict__  # __dict__把类的属性以字典的形式返回

course.py文件: 改进版本

from rest_framework.generics import ListAPIView
from api import models
from api.serializers.course import CourseModelSerializer
from rest_framework.response import Response
from utils.response import BaseResponse # 引入自定义工具类

class CourseListView(ListAPIView):
    queryset = models.Course.objects.all()
    serializer_class = CourseModelSerializer

    def get(self, request, *args, **kwargs):
        res_obj = BaseResponse()    # 实例化自定义工具类
        try:
            #### list源码 ####
            queryset = self.filter_queryset(self.get_queryset())
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
            serializer = self.get_serializer(queryset, many=True)
            #### list源码 ####
            res_obj.data = serializer.data  # 赋值给data属性
        except Exception as e:
            res_obj.code = 1          # 赋值给code属性
            res_obj.msg = str(e)      # 赋值给msg属性
        return Response(res_obj.dict) # 通过dict方法就可以拿到所有属性组成的字典

(7)api/serializers/course.py文件

自定义序列化类CourseModelSerializer:

from rest_framework import serializers
from api import models

class CourseModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Course
        fields = "__all__"

2. 前端Vue项目

(1)src/main.js文件

配置根URL:

// 导入Axios
import Axios from 'axios'
Axios.defaults.baseURL = 'http://127.0.0.1:8001/api';
Vue.prototype.$axios = Axios;

(2)src/router.js文件

路由匹配:

import Course from './views/Course.vue'

Vue.use(Router);
export default new Router({
    routes: [
                {
            path: '/course',
            name: 'course',
            component: Course,
        },
    ]
})

(3)src/views/Course.vue文件

自定义组件Course.vue:

getCourseList() {
    this.$axios.get('/courses/')    // 修改路径,要与后端的路径信息相匹配
        .then((res) => {            // res 是接收到的后段的返回值
            // console.log(res);
            if (res.data.code === 1000) {   // code状态码
                this.courseList = res.data.data;    // data具体数据信息
                // 去掉加载动画
                this.loading = false
            }
        })
},

原文地址:https://www.cnblogs.com/haitaoli/p/10300651.html

时间: 2024-11-05 00:42:03

前后端分离 项目(一)的相关文章

Aspnet前后端分离项目手记(二)关于token认证

在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习一下在aspnet中cookie和session的关系,做一个简单试验 这是一个普通的view没有任何处理 可以看到,没有任何东西(cookie),然后当我们写入一个session之后 \ 会发现多了一个名为ASP.NET_SessionId的cookie.我们都知道在aspnet中,session

《Spring Boot 入门及前后端分离项目实践》系列介绍

课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发.Spring Boot 介绍.前后端分离.API 规范等内容旨在让读者更加熟悉 SpringBoot 及企业开发中需要注意的事项并具有使用 SpringBoot 技术进行基本功能开发的能力:这最后的项目实战为课程的主要部分,我会带着大家实际的开发一个前后端分离的 Spring Boot 实践项目,

Docker环境下的前后端分离项目部署与运维(一)项目简介及环境要求

项目简介 本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机热备等等. 部署图 所用到的主流技术 Docker容器.前后端集群.MySQL集群.Redis集群.Haproxy负载均衡.Nginx负载均衡.Keepalived实现双机热备 前后端分离项目部署图 前后端分离项目开源框架介绍 本次教程所采用的前后端分离的项目开源框架是人人网的renren

Aspnet Mvc 前后端分离项目手记(二)关于token认证

在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习一下在aspnet中cookie和session的关系,做一个简单试验 这是一个普通的view没有任何处理 可以看到,没有任何东西(cookie),然后当我们写入一个session之后 会发现多了一个名为ASP.NET_SessionId的cookie.我们都知道在aspnet中,session是保

python 记录Django与Vue前后端分离项目搭建

python 记录Django与Vue前后端分离项目搭建 参考链接: https://blog.csdn.net/liuyukuan/article/details/70477095 1. 安装python与vue 2. 创建Django项目 django-admin startproject ulb_manager 3. 进入项目并创建名为backeng的app cd ulb_manager   python manage.py startapp backend 4. 使用vue-cli创建v

Docker环境下的前后端分离项目部署与运维

const 课程地址 = " http://icourse8.com/Dockerbushu.html "; 详细信息第1章 课程介绍 第2章 人人开源前后端分离项目下载与配置 第3章 Linux基础知识强化 第4章 搭建MySQL集群 第5章 搭建Redis集群 第6章 部署前后端分离项目 第7章 课后作业 第8章 云平台部署前后端分离 第9章 课程总结 var countAndSay = function(n) { return createStr(1, '1', n) funct

docker-compose 部署 Vue+SpringBoot 前后端分离项目

一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker-compose 部署Vue+SpringBoot 前后端分离项目 整体项目配置结构,这里在不影响原来项目的结构,因此将所有配置文件都提出来存放到docker文件夹内了,但注意docker-compose文件须放到项目总的根目录下哦! 1.新增后端所需配置文件api-Dockerfile # 指定基

基于Vue的前后端分离项目实践

一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功能和职责上的一种划分,前端负责页面的渲染,部分页面交互的逻辑,然后通过网络请求与后端进行数据的交互:后端则着重关注业务逻辑的处理,直接操控数据库. 1.2前后端未分离前(1)jsp + servlet 开发模式: JSP页面:负责视图层的渲染及交互,内部可以嵌入java 代码,在某些场景下开发起来比

SpringSecurity实现前后端分离项目的登录认证

一.文章简介 本文简要介绍了spring security的基本原理和实现,并基于springboot整合了spring security实现了基于数据库管理的用户的登录和登出,登录过程实现了验证码的校验功能. 二.spring security框架简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.主要包括:用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户能

七个开源的 Spring Boot 前后端分离项目,一定要收藏!

前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SSH 框架用的滚瓜烂熟,出来却发现自己依然没有任何优势! 其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想.很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一些前后端不分时候的开发思路,结果做出来的产品不伦不类,因此松哥这里给大家整理了几个开源的前后端分离项