首页 > 其他分享 >苍穹外卖学习笔记——第一天

苍穹外卖学习笔记——第一天

时间:2024-04-08 21:56:43浏览次数:33  
标签:sky 接口 server nginx 文档 笔记 外卖 苍穹

项目概述、环境搭建

软件开发整体介绍

软件开发流程

步骤 任务或输出文件
需求分析 需求规格说明书、产品原型
设计 UI设计、数据库设计、接口设计
编码 项目代码、单元测试
测试 测试用例、测试报告
上线运维 软件环境安装、配置

角色分工

角色 分工 处于流程
项目经理 对整个项目负责,任务分配、把控进度 全部流程
产品经理 进行需求调研,输出需求调研文档、产品原型等 需求分析
UI设计师 根据产品原型输出界面效果图 设计
架构师 项目整体架构设计、技术选型等 设计
开发工程师 代码实现 编码
测试工程师 编写测试用例,输出测试报告 测试
运维工程师 软件环境搭建、项目上线 上线运维

软件环境

软件环境 说明
开发环境(development) 开发人员在开发阶段使用的环境,一般外部用户无法访问
测试环境(testing) 专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问
生产环境(production) 即线上环境,正式提供对外服务的环境

苍穹外卖项目介绍

项目介绍

定位

  • 专门为某一家餐饮企业(餐厅、饭店)定制的一款软件产品。

功能架构

  • 功能架构用于体现项目中的业务功能模块。

  • 整个项目包含管理端和外卖端,其中管理端供外卖商家使用,用户端供点餐用户使用,功能架构如下:

功能架构

产品原型

  • 产品原型用于展示项目的业务功能,一般由产品经理进行设计。

技术选型

  • 技术选型用于展示项目中使用到的技术框架和中间件等,技术选型如下:
技术选型

开发环境搭建

整体结构

整体结构

前端环境搭建

  • 前端工程基于nginx运行。
  • 启动nginx:双击nginx.exe即可启动nginx服务,访问端口号为 80。

注意:此处先使用开发好的前端页面,后端开发完成后再来开发前端页面。

后端环境搭建

  • 后端工程基于 Maven 进行项目构建,并且进行分模块开发。
  • 后端已经写好了初始文件,直接导入即可。

项目整体结构

项目整体结构
名称 说明
sky-take-out Maven父工程,统一管理依赖版本,聚合其他子模块
sky-common 子模块,存放公共类,例如:工具类、常量类、异常类等
sky-pojo 子模块,存放实体类、VO、DTO等
sky-server 子模块,后端服务,存放配置文件、Controller、Service、Mapper等
sky-common
  • sky-common子模块中存放的是一些公共类,可以供其他模块使用。
sky-pojo
  • sky-pojo子模块中存放的是一些entity、DTO、VO,entity、DTO、VO都属于pojo。
名称 说明
Entity 实体,通常和数据库中的表对应
DTO 数据传输对象,通常用于程序中各层之间传递数据
VO 视图对象,为前端展示数据提供的对象
POJO 普通Java对象,只有属性和对应的getter和setter
sky-server
  • sky-server子模块中存放的是 配置文件、配置类、拦截器、controller、service、mapper、启动类等。

使用Git进行版本控制

  • 使用Git进行项目代码的版本控制,具体操作:
    • 创建Git本地仓库。
    • 创建Git远程仓库。
    • 将本地文件推送到Git远程仓库。

数据库环境搭建

  • 通过数据库建表语句创建数据库表,数据库表结构如下:
序号 表名 中文名
1 employee 员工表
2 category 分类表
3 dish 菜品表
4 dish_flavor 菜品口味表
5 setmeal 套餐表
6 setmeal_dish 套餐菜品关系表
7 user 用户表
8 address_book 地址表
9 shopping_cart 购物车表
10 orders 订单表
11 order_detail 订单明细表

前后端联调

  • 后端的初始工程中已经实现了登录功能,直接进行前后端联调测试即可。
登录功能联调

注意:可以通过断点调试跟踪后端程序的执行过程。

nginx反向代理
  • nginx反向代理就是将前端发送的动态请求由nginx转发到后端服务器。
  • 本次测试中,前端请求地址为http://localhost/api/employee/login,nginx服务器接收到这个请求后,将请求转发到后端接口地址,后端接口地址为http://localhost:8080/admin/employee/login。
  • nginx 反向代理的好处:
    • 提高访问速度
    • 进行负载均衡
    • 保证后端服务安全
nginx反向代理的配置方式
  • 在nginx.conf文件中配置以下信息:
server{
	listen 80; #监听端口号
	server_name localhost; #服务器名
	
	location /api/ { #前端请求地址中要匹配的部分
            		proxy_pass   http://localhost:8080/admin/;  #反向代理,后端接口地址中要替换的部分
	}

}
nginx负载均衡的配置方式
  • 在nginx.conf文件中配置以下信息:
upstream webservers{
	server 192.168.100.128:8080; #后端服务器1地址
	server 192.168.100.129:8080; #后端服务器2地址
}

server{
	listen 80; #监听端口号
	server_name localhost; #服务器名
	
	location /api/ { #前端请求地址中要匹配的部分
            		proxy_pass   http://webservers/admin/;  #负载均衡,后端接口地址中要替换的部分,其中服务器地址由上方的配置决定
	}

}
nginx负载均衡策略
名称 说明
轮询 默认方式
weight 权重方式,默认为1,权重越高,被分配的客户端请求就越多
ip_hash 依据ip分配方式,这样每个访客可以固定访问一个后端服务
least_conn 依据最少连接方式,把请求优先分配给连接数少的后端服务
url_hash 依据url分配方式,这样相同的url会被分配到同一个后端服务
fair 依据响应时间方式,响应时间短的服务将会被优先分配

完善登录功能

当前登陆功能存在问题

  • 员工表中的密码是明文存储,安全性太低。

解决方案

  • 使用MD5加密方式对明文密码加密后存储,提高安全性。

执行步骤

  1. 修改数据库中明文密码,改为MD5加密后的密文:123456 → e10adc3949ba59abbe56e057f20f883e。
  2. 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对:
//在EmployeeServiceImpl.java中

//进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
    //密码错误
    throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}

导入接口文档

前后端分离开发流程

前后端分离开发流程

操作步骤

  • 将课程资料中提供的项目接口导入YApi即可。

Swagger

介绍

  • 只需要按照Swagger的规范去定义接口及接口相关的信息,就可以生成接口文档以及在线接口调试页面。

  • 官网:https://swagger.io/

  • Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

使用步骤

  1. 导入knife4j的Maven坐标:
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>
  1. 在配置类中加入knife4j相关配置:
//WebMvcConfiguration.java中

@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;
}
  1. 设置静态资源映射,否则接口文档页面无法访问:
//WebMvcConfiguration.java中

/**
* 设置静态资源映射
* @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/");
}
  1. 访问接口文档,访问路径为http://ip:port/doc.html。
  2. 进行接口测试。

YApi vs Swagger

  • Yapi是在设计阶段使用的工具,用于管理和维护接口。

  • Swagger是在开发阶段使用的框架,用于帮助后端开发人员做后端的接口测试

常用注解

  • 通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:
注解 说明
@Api 用在类上,例如Controller,表示对类的说明
@ApiModel 用在POJO类上,例如entity、DTO、VO,表示对POJO类的说明
@ApiModelProperty 用在属性上,描述属性信息
@ApiOperation 用在方法上,例如Controller的方法,说明方法的用途、作用

标签:sky,接口,server,nginx,文档,笔记,外卖,苍穹
From: https://www.cnblogs.com/zgg1h/p/18122723

相关文章

  • 【阅读笔记】《同意》
    未成年幼女与男恋童癖的故事作者:[法]瓦内莎·斯普林格拉翻译:李溪月kindle看的电子书笔记传记形式的书。作者记录了14岁时与一个50+岁的恋童癖患者进行第一次性行为的经历以及前后的故事。恋童癖被作者命名为“G”,作者自称“M”,G是一名作家,在其作品中经常写与未成年......
  • 机器学习笔记 使用Python从头开始​​构建百万参数LLaMA
    一、LLaMA架构        LLaMA (Large Language Model Meta AI) 是一个基础语言模型的集合,参数范围从7B到65B,LLaMA并非专门为对话任务而设计的模型,而是专注于语言理解和生成。但是作为基础模型,LLaMA被设计为多功能的,可以应用于许多不同的用例,而不是为特定任务......
  • 吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.1-12.3
    目录第7周12、支持向量机(SupportVectorMachines)12.1优化目标第7周12、支持向量机(SupportVectorMachines)12.1优化目标到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法......
  • 虚树学习笔记
    关于虚树对于一些在树上进行某些询问的查询,且每个询问实际用到的点并不多的时候,可以考虑建虚树来查询。虚树的建立复杂度是\(O(m\logn)\)的,\(m\)是虚树节点数量,\(n\)是原树节点数量。也有方法可以做到\(O(m\logm)\)。例题题目链接。分析注意到范围:\(\sumk_i\le5......
  • 虚数学习笔记
    虚树详见OI-Wiki。其实就是把原树浓缩成\(k_i\)数量级的小树,题目会保证\(\sumk_i\)和\(n\)同阶,于是每次询问暴力dp就是对的了。但是OI-Wiki并未提到为什么dp用到的所有点是关键点本身和排完序后每相邻两个关键点的LCA呢?证明虚树的建立:ilboolcmp(inta,i......
  • 具体数学学习笔记(更新中)
    第五章5.1组合数基础P1405.24求证:\[\sum_k\binoml{m+k}\binom{s+k}n(-1)^k=(-1)^{l+m}\binom{s-m}{n-l}\]H_W_Y老师有点太强了,归纳法纯shaber,考虑直接推式子:\[LHS=\sum_{k}\binom{m+k-l-1}{m+k}\binom{n-s-k-1}{n}(-1)^{m+n}\\=(-1)^{m+n}\sum_k\binom{m-l-1+......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • [网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
    文章目录一.工具&术语1.网安术语2.常用工具3.推荐文章二.常见攻击1.SQL注入2.XSS跨站3.越权漏洞4.CSRF跨站请求伪造5.支付漏洞三.音乐异或解密示例四.总结一.工具&术语1.网安术语常见安全网站及论坛:看雪(https://bbs.pediy.com/)安全客(https://www.anquanke.com)fre......
  • 【笔记】栈(Stack)
    一、什么是栈栈:一种特殊的线性表,其只允许在固定的一端(也就是在表尾)进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何数据元素的栈称为空栈 。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。注意:1、栈是一个线性表,那......
  • 苍穹外卖10(Spring Task定时任务,WebSocket双向通信,订单状态定时处理,来电提醒,客户催单)
    目录一、SpringTask1.介绍2.入门1使用步骤2使用示例3.详解1@Scheduled注解2cron表达式1cron表达式6个域2各个域的取值说明4.小结二、订单状态定时处理1.需求分析1问题分析2功能需求2.代码开发1修改引导类加@EnableScheduling2创建OrderTask......