前后台分离开发

前后台分离开发

简介

前后台分离开发,就是在项目开发过程中,对于前端代码的开发由专门的前端开发人员负责,后端代码则由后端开发人员负责,这样可以做到分工明确、各司其职,提高开发效率,前后端代码并行开发,可以加快项目开发进度。

目前,前后端分离开发方式已经被越来越多的公司所采用,称为当前项目开发的主流开发方式。

前后端分离开发后,从工程结构上也会发生变化,即前后端代码不在混合在同一个maven工程中,而是分为前端工程和后端工程。

在这里插入图片描述

开发流程

前后端分离开发后,面临一个问题,就是前端开发人员和后端开发人员如何进行配合共同开发一个项目?

可以按照如下流程进行:

在这里插入图片描述

接口(API接口)就是一个http的请求地址,主要就是去定义:请求路径、请求方式、请求参数、响应数据等内容。

在这里插入图片描述

前端技术栈

开发工具
  • Visual Studio Code
  • hbuilder
技术框架
  • nodejs
  • VUE
  • ElementUI
  • mock 模拟数据
  • webpack 前端打包

YApi

YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护API,YApi还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。

YApi让接口开发更简单高效,让接口的管理更具可读性、可维护性,让团队协作更合理。

源码地址:https://github.com/YMFE/yapi

要使用YApi,需要自己进行部署。

使用方式

使用YApi,可以执行下面操作:

  • 添加项目
  • 添加分类
  • 添加接口
  • 编辑接口
  • 查看接口

Swagger

介绍

使用Swagger你只需要按照它的规范去定义接口及接口相关信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种各样的接口文档,以及在线接口调试界面等等。

官网:https://swagger.io/

knife4j是为java MVC框架集成Swagger生成Api文档的增强解决方案

<dependency>
	<groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

使用方式

操作步骤:

  1. 导入knife4j的maven坐标

  2. 导入knife4j相关配置类(WebMvcConfig)

    添加两个注解,同时在该文件下添加如下两个方法

    @EnableSwagger2
    @EnableKnife4j
    
    @Bean
    public Docket createRestApi() {
        // 文档类型
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.itheima.reggie.contaoller"))
            .paths(PathSelectors.any())
            .build();
    }
    
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("瑞吉外卖")
            .version("1.0")
            .description("瑞吉外卖接口文档")
            .build();
    }
    
  3. 设置静态资源,否则接口文档页面无法访问

    WebMvcConfig类中的addResourceHandlers方法

    registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    
  4. 在LoginCheckFilter中设置不需要处理的请求路径

    log.info("拦截到请求:{}", requestURI);
    
    // 定义不需要处理的请求路径
    String[] urls = new String[] {
        "/employee/login",
        "/employee/logout",
        "/backend/**",
        "/front/**",
        "/commmon/**",
        "/user/sendMsg",
        "/user/login",
        "/doc.html",  // 新增
        "/webjars/**",  // 新增
        "/swagger-resources",  // 新增
        "/v2/api-docs"  // 新增
    };
    

效果视图

在这里插入图片描述

常用注解

注释说明
@Api用在请求的类上,例如Controller,表明对类的说明
@ApiModel用在类上,通常是实体类,表示一个返回响应数据的信息
@ApiModelProperty用在属性上,描述响应类的属性
@ApiOperation用在请求的方法上,说明方法的用途、作用
@ApiImplicitParams用在请求的方法上,表示一组参数的说明
@ApiImplicitParam用在@ApiImplicitParams注解中,指定一个请求参数的各个方面

使用示例

  1. @Api

    @Api(tags = "套餐相关接口")
    public class SetmealController {
    }
    
  2. @ApiModel与@ApiModelProperty

    @ApiModel("返回结果")
    public class R<T> implements Serializable {
    
        @ApiModelProperty("编码")
        private Integer code; //编码:1成功,0和其它数字为失败
    }
    
  3. @ApiOperation、@ApiImplicitParams、@ApiImplicitParam

    @ApiOperation(value = "套餐分页查询接口")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "page", value = "页码", readOnly = true),
        @ApiImplicitParam(name = "pageSize", value = "每页记录数", readOnly = true),
        @ApiImplicitParam(name = "name", value = "套餐名称", readOnly = false)
    })
    public R<Page<SetmealDto>> page(int page, int pageSize, String name) {
    }
    
  4. 效果,添加说明

    在这里插入图片描述

项目部署

部署架构

在这里插入图片描述

部署环境说明

服务器:

  • 192.168.138.100(服务器A)

    Nginx:部署前端项目、配置反向代理

    Mysql:主从复制结构中的主库

  • 192.168.138.101(服务器B)

    jdk:运行Java项目

    git:版本控制工具

    maven:项目构建工具

    jar:Spring Boot项目打成jar包基于内置Tomcat运行

    Mysql:主从复制结构中的从库

  • 172.14.2.94(服务器C)

    Redis:缓存中间件

部署前端项目

第一步:在服务器A中安装Nginx,将课程治疗中的dist目录上传到Nginx的html目录下

在这里插入图片描述

第二步:修改Nginx配置文件nginx.conf

在这里插入图片描述

location / {
    root	html/dist;
    index	index.html;
}

# 反向代理配置
location ^~ /api/ {
    rewrite ^/api/(.*)$ /$1 break;
	proxy_pass http://192.168.138.101:8080;
}

其中rewrite重写请求路径,例如:将/api/employee/login重写为/employee/login,最后请求地址为:http://192.168.138.101:8080/employee/login

部署后端项目

第一步:在服务器B中安装jdk、git、maven、MySQL,使用git clone命令将git远程仓库的代码克隆下来

第二步:将资料中提供的reggieStart.sh文件上传到服务器B,通过chmod命令设置执行权限为777

#!/bin/sh
echo =================================
echo  自动化部署脚本启动
echo =================================

echo 停止原来运行中的工程
APP_NAME=reggie_take_out

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo 'Stop Success!'
fi

echo 准备从Git仓库拉取最新代码
cd /usr/local/javaApp/reggie_take_out

echo 开始从Git仓库拉取最新代码
git pull
echo 代码拉取完成

echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true`

cd target

echo 启动项目
nohup java -jar reggie_take_out-1.0-SNAPSHOT.jar &> reggie_take_out.log &
echo 项目启动完成

>符号是指:将正常信息重定向

&>可以将错误信息或者普通信息都重定向输出

末尾&表示后台运行

chmod 777 reggieStart.sh # 修改文件权限

第三步:执行reggieStart.sh脚本文件,自动部署项目

在这里插入图片描述

访问服务器A,由于niginx默认80端口,前台不写端口默认访问也为80端口

访问192.168.138.100即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路在脚下——我的 2023 年终总结

写下这个题目的时候&#xff0c;我刚从外面跑步&#xff08;有积雪&#xff0c;边走边跑&#xff09;近 8 公里回来。一是寻找一下灵感&#xff0c;二是“排解”一下负能量。 今年这个形势&#xff0c;实话说大家都挺不容易的。但是&#xff0c;正如本山大叔所说&#xff0c;“…

Python中如何使用_new_实现单例模式

单例模式是一个经典设计模式&#xff0c;简要的说&#xff0c;一个类的单例模式就是它只能被实例化一次&#xff0c;实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None&#xff0c;这就是一个很典型的设计&#xff0c;通常使用 if xxx is None或者if xxx …

【HarmonyOS】鸿蒙开发简介与项目基础配置演示

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

win11 电脑睡眠功能失效了如何修复 win11 禁止鼠标唤醒

1、win11睡眠不管用怎么办&#xff0c;win11电脑睡眠功能失效了如何修复 在win11系统中拥有许多令人激动的新功能和改进&#xff0c;有些用户在使用win11电脑时可能会遇到一个问题&#xff1a;睡眠模式不起作用。当他们尝试将计算机置于睡眠状态时&#xff0c;却发现系统无法进…

01 HAL库点亮LED灯

引言&#xff1a;本专题采取的开发平台是stm32cubeIDE&#xff0c; 文章后面会后提供 一 、 LED简介 LED&#xff08;Light Emitting Diode&#xff09;是一种半导体发光器件&#xff0c;能够将电能直接转化为光能的电子元件。它具有体积小、功耗低、寿命长等特点&#xff0c;广…

FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战

1.列表与列表项概念及结构体介绍 1.1列表项简介 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表 1.2 列表、列表项、迷你列表项结构体 1&#xff09;列表结构体 typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VAL…

第三代半导体材料-碳化硅(SiC)详述

SiC产业概述 碳化硅&#xff08;SiC&#xff09;是第三代半导体材料的典型代表。 什么是半导体&#xff1f; 官话来说&#xff0c;半导体指常温下导电性能介于导体与绝缘体之间的材料。 但导电性能的强弱&#xff0c;并非是体现半导体材料价值的最直观属性&#xff0c;半导…

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…

TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)

报错 找到错误代码 这个错误是因为在使用 numpy.loadtxt() 函数时尝试将换行符&#xff08;\n&#xff09;作为分隔符&#xff08;delimiter&#xff09;。然而&#xff0c;换行符是用于标识文本文件中每一行的结束&#xff0c;而不是用于分隔数据字段。 解决 如果你的数据文…

项目记录:利用Redis实现缓存以提升查询效率

一、概述 当我们查询所有数据时&#xff0c;如果缓存中没有&#xff0c;则去数据库查询&#xff0c;如果有&#xff0c;直接查缓存的数据就行。注意定期更新缓存数据。 二、主体代码 private static final String ROOM_SCHEDULES_HASH "RoomSchedules";Overridepu…

【进阶】【JS逆向爬虫】【1.JavaScript 基础语法】初始JavaScript

JS逆向爬虫 初始JavaScript1.JavaScript 概述2.JavaScript 的作用3.浏览器执行 JS 简介4.JS 的组成ECMAScriptDOM ——文档对象模型BOM ——浏览器对象模型 5.JavaScript 运行过程 初始JavaScript 1.JavaScript 概述 Java是世界上最流行的语言之一&#xff0c;是一种运行在客…

如何高效查询文件:Linux 下的多种方法详解

如何高效查询文件&#xff1a;Linux 下的多种方法详解 在日常工作中&#xff0c;我们经常需要查找文件&#xff0c;无论是寻找特定的代码文件、配置文件还是其他文档。Linux 提供了多种强大的命令和工具&#xff0c;通过巧妙地使用管道符&#xff0c;我们可以将这些命令组合起来…

线程的6个状态(应该能应付一下考试)

如果你是一个拉面店的老板&#xff0c;员工是cpu资源&#xff0c;顾客是线程 一天中午&#xff0c;你的拉面店人很多&#xff0c;总共6个后厨全都在工作&#xff0c;此时&#xff1a; 来了一名顾客&#xff0c;这位顾客坐在位置玩手机 1.由于这位顾客没有下单&#xff0c;可能…

[设计模式 Go实现] 创建型~简单工厂模式

go 语言没有构造函数一说&#xff0c;所以一般会定义NewXXX函数来初始化相关类。 NewXXX 函数返回接口时就是简单工厂模式&#xff0c;也就是说Golang的一般推荐做法就是简单工厂。 代码实现 package simplefactoryimport "fmt"//API is interface type API interf…

Python+OpenGL绘制3D模型(九)完善插件功能: 矩阵,材质,法线

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

gulimall-002 分布式基础概念

1、微服务概念 微服务是一种非常流行的架构风格。 拒绝大型单体应用&#xff0c;基于业务边界进行服务微化拆分&#xff0c;各个服务独立部署运行。 每个服务运行在自己的单个进程使用轻量级机制通信可以使用不同的编程语言编写以及不同的数据存储技术 2、集群&分布式&…

力扣:63. 不同路径 II(动态规划)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那…

14个强大的JS库

文章目录 一、前言二、Handsontable&#xff1a;高效的数据网格处理库2.1、数据绑定和验证2.2、过滤和排序2.3、文件导出2.4、多框架兼容性2.5、丰富的附加功能2.6、GitHub受欢迎程度 三、Calendar&#xff1a;全功能可定制日历库3.1、多种视图类型3.2、任务和里程碑管理3.3、鼠…

【报错处理】opencv-3.4.1安装报错 error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

description 最近在复现ORB-SLAM2的时候配置 opencv-3.4.1的环境, 官网下载的opencv-3.4.1 source文件, 原封不动地解压后按照该指导方法安装和编译, 在make的过程中, 出现了编译错误 (截图忘记了)&#xff0c;具体报错如下: error: invalid conversion from ‘const char*’ …

【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…