Day01 【苍穹外卖】环境搭建和前后端联调

2023-12-19

一、苍穹外卖简介

项目采用前后端分离的方式开发,包括前端界面(Web端管理程序、小程序客户端界面)前端vue技术开发使用nginx部署启动,后端springboot技术开发IDEA进行启动。

二、项目联调和配置

1、前端web界面

前端项目使用nginx启动,只需要将打包后的vue项目放到nginx安装目录下的html文件夹下。然后对nginx.conf文件进行配置即可启动前端vue,浏览器使用 localhost:80 即可访问相关界面。

在这里插入图片描述

2、前后端联调实现登录

思考:本项目采用前后端分离的方式开发,前端的浏览器发送的请求是如何请求到后端服务的?
前端请求地址: http://localhost/api/employee/login
后端接口地址: http://localhost:8080/admin/employee/login

前端请求:打开浏览器的调试,Network下的Headers即可看到前端请求的url: http://localhost/api/employee/login
在这里插入图片描述
后端配置文件:application.yml

server:
  port: 8080
#当前环境为dev开发环境,因此application-dev.yml配置文件也生效
spring:
  profiles:
    active: dev 
  main:
    allow-circular-references: true
  datasource:
    druid:
      driver-class-name: ${sky.datasource.driver-class-name}
      url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: ${sky.datasource.username}
      password: ${sky.datasource.password}

mybatis:
  #mapper配置文件
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.sky.entity
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true

logging:
  level:
    com:
      sky:
        mapper: debug
        service: info
        controller: info

sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token

配置文件:application-dev.yml

sky:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    host: localhost
    port: 3306
    database: sky_take_out
    username: root
    password: 12345678

后端接收请求:当后端接收登录请求时,后端接口地址: http://localhost:8080/admin/employee/login

/**
 * 员工管理EmployeeController 
 */
@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    @Autowired
    private JwtProperties jwtProperties;
    // 登录请求
    @PostMapping("/login")
    public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
        log.info("员工登录:{}", employeeLoginDTO);
        Employee employee = employeeService.login(employeeLoginDTO);
        //登录成功后,生成jwt令牌
        Map<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
        String token = JwtUtil.createJWT(
                jwtProperties.getAdminSecretKey(),
                jwtProperties.getAdminTtl(),
                claims);

        EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
                .id(employee.getId())
                .userName(employee.getUsername())
                .name(employee.getName())
                .token(token)
                .build();
        return Result.success(employeeLoginVO);
    }
}

解答:采用Nginx做反向代理,将前端发送的动态请求由Nginx转发到后端服务器。
在这里插入图片描述
Nginx反向代理的好处:提升访问速度、进行负载均衡、保障后端服务安全。

3、反向代理配置

#将匹配到的/api/的前端请求转发到http://localhost:8080/admin/请求地址,后面动态的请求 
server {
        listen 80; #监听的端口
        server_name  localhost; #监听的域名
        # 反向代理,处理管理端发送的请求
        location /api/ {
        	#反向代理关键proxy_pass指令
			proxy_pass   http://localhost:8080/admin/; #指令将请求转发到代理的后端服务器
        }
}

配置说明:当nginx接收到前端请求含有 /api/ 时,nginx将请求转发到 http://localhost:8080/admin/ 的后端服务器请求路径下响应,动态请求路径拼接在 http://localhost:8080/admin/ 后即可,如下图。
在这里插入图片描述

4、负载均衡

负载均衡的前提是反向代理,将接收到的请求均衡的分配到各应用服务器上

upstream webservers{
	  server 127.0.0.1:8080 weight=90 ;
	  server 127.0.0.1:8088 weight=10 ;
	}
#将匹配到的/api/的前端请求转发到http://localhost:8080/admin/请求地址,后面动态的请求 
server {
        listen 80; #监听的端口
        server_name  localhost; #监听的域名
        # 反向代理,处理管理端发送的请求
        location /api/ {
        	#负载均衡
			#proxy_pass   http://webservers/admin/; #指令将请求转发到的后端服务器
        }
}

nginx负载均衡策略:
在这里插入图片描述

5、密码加密存储

为了保护用户的隐私和数据安全,密码一般不使用明文存储,此处使用 md5加密算法 进行加密。

/**
 * 员工登录
 *
 * @param employeeLoginDTO
 * @return
 */
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
    String username = employeeLoginDTO.getUsername();
    String password = employeeLoginDTO.getPassword();

    //1、根据用户名查询数据库中的数据
    Employee employee = employeeMapper.getByUsername(username);

    //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
    if (employee == null) {
        //账号不存在
        throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
    }

    //密码比对
    //对用户登录的密码做md5加密处理后和数据库加密后的密码对比
    password = DigestUtils.md5DigestAsHex(password.getBytes());
    if (!password.equals(employee.getPassword())) {
        //密码错误
        throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
    }

    if (employee.getStatus() == StatusConstant.DISABLE) {
        //账号被锁定
        throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
    }

    //3、返回实体对象
    return employee;
}

6、导入接口文档

作为前后端分离的项目,接口的设计非常重要,下面是前后端分离开发流程:
在这里插入图片描述
对于json格式的接口,使用 http://yapi.lootom-ai.com/login 导入接口文件。

7、Swagger 测试

Swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。
Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。教程: knife4j使用教程
在这里插入图片描述

<!--1、引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>
/**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
    /**
     * 2、通过knife4j生成接口文档
     * @return
     */
    @Bean
    public Docket docket() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

    /**
     * 3、设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("开始设置静态资源映射....");
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

所有配置结束后,重启SpringBoot服务,打开浏览器: http://localhost:8080/doc.html 即可查看相关的接口文档。
在这里插入图片描述

思考:通过 Swagger 就可以生成接口文档,那么我们就不需要 Yapi了?
1、Yapi是设计阶段使用的工具,管理和维护接口;
2、Swagger 在开发阶段使用的框架,帮助后端开发人员做后端的接口测试;

8、Swagger常用注解

注解 说明
@Api 用在类,例如Controller,表示类的说明
@ApiModel 用在类,例如entity,DTO,VO
@ApiModelProperty 用在属性,描述属性信息
@ApiOperation 用在方法上,例如Controller的方法,例如方法的用途、作用

在这里插入图片描述
在这里插入图片描述
标注后,重启服务,打开浏览器: http://localhost:8080/doc.html 即可查看。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Day01 【苍穹外卖】环境搭建和前后端联调 的相关文章

随机推荐

  • 自定义WheelView

    项目中用到一个比较觉得不错的控件 WheelView 即上下滚动View 它是继承ScrollView实现 在Android各版本上的效果都是如下 也许在git上有许多这样功能的控件 但个人认为这个控件实现的方式简单 比较让人容易理解 对自
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • java 员工绩效管理系统Myeclipse开发mysql数据库MVC结构serlvet编程计算机网页项目

    一 源码特点 java 员工绩效管理系统是一套完善的java web信息管理系统 对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean 系统具有完整的源代码和数据库 系统主要采用B S模式开发 开发工具myec
  • 64.Oracle19cPDB的创建和删除

    1 创建PDB CREATE PLUGGABLE DATABASE DB CROSS ADMIN USER pdbadmin IDENTIFIED BY enmo 2023 ROLES dba DEFAULT TABLESPACE CROS
  • Linux中seLinux是什么?关闭会造成哪些影响?

    seLinux是一种安全增强型的Linux操作系统 其主要作用是强化系统的安全性和保护系统资源免受未经授权的访问和攻击 其提供了三种工作模式 分别是Disabled工作模式 Permissive工作模式和Enforcing工作模式 那么Li
  • CNN和TCN的区别和联系

    CNN 卷积神经网络 和TCN 时间卷积网络 都是神经网络的变体 用于处理不同类型的数据 以下是它们的主要区别和联系 区别 应用领域 CNN 主要用于处理图像数据 具有在空间维度上捕捉局部特征的能力 常用于计算机视觉任务 TCN 主要用于处
  • Python中的定时器用法:Timer定时器和schedule库

    目录 一 引言 二 Timer定时器 1 Timer定时器的原理 2 Timer定时器的使用方法 3 Timer定时器的实际应用案例 三 schedule库 1 schedule库的原理 2 schedule库的使用方法 3 schedul
  • 62.$ORACLE_HOME/.patch_storage是否可以删除

    1 此目录为是Oracle打补丁时被替换的文件的备份 是的 即使成功安装了补丁程序 也必须保留 ORACLE HOME patch storage目录 1 将临时补丁应用到Oracle主目录时 OPatch将补丁信息存储在 ORACLE H
  • Linux-----13、用户、组

    用户 组 一 用户管理 用户概念及作用 了解 用户 指的是Linux操作系统中用于管理系统或者服务的人 一问 管理系统到底在 管理什么 答 Linux下一切皆 文件 所以用户管理的是相应的文件 二问 如何管理 文件呢 答 文件基本管理 比如
  • 宿主机和容器

    宿主机 Host 和容器 Container 是 Docker 中的两个重要概念 描述了 Docker 环境中的两个主要部分 宿主机 Host 宿主机是指安装了 Docker 引擎 Docker Engine 的物理计算机或虚拟机 它是 D
  • 从 MySQL 到 DolphinDB,Debezium + Kafka 数据同步实战

    Debezium 是一个开源的分布式平台 用于实时捕获和发布数据库更改事件 它可以将关系型数据库 如 MySQL PostgreSQL Oracle 等 的变更事件转化为可观察的流数据 以供其他应用程序实时消费和处理 本文中我们将采用 De
  • VSCode 代码高亮 变量类型、函数名、类名没有颜色 - 设置主题即可

    https zhuanlan zhihu com p 630401039 之前应该设置主题了 但不知道为啥C 里面只有 int 有高亮 其他像 cv Mat 函数名 类名都没有颜色 解决方案是重新设置一下主题 File preference
  • 使用SQL和Python处理Excel文件数据

    目录 一 引言 二 使用SQL查询Excel文件数据 1 导入必要的库 2 创建数据库连接 3 读取Excel文件数据 4 将数据写入数据库 5 使用SQL查询数据 三 使用Python读取和处理Excel文件数据 1 导入必要的库 2 读
  • ES elasticsearch-analysis-dynamic-synonym连接数据库动态更新synonym近义词

    ES elasticsearch analysis dynamic synonym连接数据库动态更新synonym近义词 修改源码实现连接数据库获取近义词汇 下载elasticsearch analysis dynamic synonym打
  • 移动端界面布局适配方案

    自适应和响应式 1 自适应 根据不同的设备大小来自动调整尺寸 大小 2 响应式 会随着屏幕的实时变动而自动调整 是一种自适应 移动端视口 能看到的区域就是视口 viewport fixed就是相对于视口来进行定位的 在PC端视口就只有一个
  • 基于SpringBoot+Vue的智慧校园之家长子系统设计实现(源码+lw+部署文档+讲解等)

    文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的
  • MSDN:Mutually Semantic Distillation Network for Zero-Shot Learning 中文版 待更新

    摘要 零样本学习 ZSL 的关键挑战是如何将潜在的语义知识融合在可见类的视觉特征和抽象特征之间 从而实现向不可见类的横向知识转移 之前的工作要么只是将图像的全局特征与其相关的类语义向量对齐 要么利用单向注意力来学习有限的潜在语义表示 这无法
  • Vue 大文件上传和断点续传的实现

    实现 Vue 大文件上传和断点续传需要掌握以下几个步骤 分片 将大文件分割成若干个小块 便于上传 一般采用 Blob 对象或 ArrayBuffer 来实现 上传 将分片文件上传到服务器 可以使用 XMLHttpRequest Fetch
  • 63.基于Oracle19.14的PDB的静默安装

    1 dbca rsp文件准备 vi dbca rsp responseFileVersion oracle assistants rspfmt dbca response schema v19 0 0 gdbName CROSS sid C
  • Day01 【苍穹外卖】环境搭建和前后端联调

    文章目录 一 苍穹外卖简介 二 项目联调和配置 1 前端web界面 2 前后端联调实现登录 3 反向代理配置 4 负载均衡