1. 软件开发整体介绍
1.1 软件开发流程
1.2 角色分工
- 项目经理:对整个项目负责,任务分配、把控进度
- 产品经理:进行需求调研,输出需求调研文档、产品原型等
- UI设计师:根据产品原型输出界面效果图
- 架构师:项目整体架构设计、技术选型等
- 开发工程师:代码实现
- 测试工程师:编写测试用例,输出测试报告
- 运维工程师:软件环境搭建、项目上线
1.3 软件环境
- 开发环境(development):开发人员在开发阶段使用的环境,一般外部用户无法访问
- 测试环境(testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问
- 生产环境(production):即线上环境,正式提供对外服务的环境
2. 苍穹外卖项目介绍
2.1 项目介绍
定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品
通过功能架构图来展示管理端和用户端的具体业务功能模块。
2.2 产品原型
产品原型:用于展示项目的业务功能,一般由产品经理进行设计
2.3 技术选型
技术选型:展示项目中使用到的技术框架和中间件等
用户层
- 本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序。
网关层
- Nginx是一个服务器,主要用来作为Http服务器,部署静态资源,访问性能高。在Nginx中还有两个比较重要的作用: 反向代理和负载均衡, 在进行项目部署时,要实现Tomcat的负载均衡,就可以通过Nginx来实现。
应用层
- SpringBoot: 快速构建Spring项目, 采用 “约定优于配置” 的思想, 简化Spring项目的配置开发。
- SpringMVC:SpringMVC是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以无缝集成。
- Spring Task: 由Spring提供的定时任务框架。
- httpclient: 主要实现了对http请求的发送。
- Spring Cache: 由Spring提供的数据缓存框架
- JWT: 用于对应用程序上的用户进行身份验证的标记。
- 阿里云OSS: 对象存储服务,在项目中主要存储文件,如图片等。
- Swagger: 可以自动的帮助开发人员生成接口文档,并对接口进行测试。
- POI: 封装了对Excel表格的常用操作。
- WebSocket: 一种通信网络协议,使客户端和服务器之间的数据交换更加简单,用于项目的来单、催单功能实现。
数据层
- MySQL: 关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储。
- Redis: 基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存。
- Mybatis: 本项目持久层将会使用Mybatis开发。
- pagehelper: 分页插件。
- spring data redis: 简化java代码操作Redis的API。
工具
- git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理。
- maven: 项目构建工具。
- junit:单元测试工具,开发人员功能实现完毕后,需要通过junit对功能进行单元测试。
- postman: 接口测工具,模拟用户发起的各类HTTP请求,获取对应的响应结果。
3. 开发环境搭建
3.1 前端环境搭建
- 前端工程基于 nginx
- 启动nginx:双击 nginx.exe 即可启动 nginx 服务,访问端口号为 80
3.2 后端环境搭建
3.2.1 熟悉项目结构
后端工程基于 maven 进行项目构建,并且进行分模块开发。
分析sky-common模块的每个包的作用:
名称 | 说明 |
---|---|
constant | 存放相关常量类 |
context | 存放上下文类 |
enumeration | 项目的枚举类存储 |
exception | 存放自定义异常类 |
json | 处理json转换的类 |
properties | 存放SpringBoot相关的配置属性类 |
result | 返回结果类的封装 |
utils | 常用工具类 |
分析sky-pojo模块的每个包的作用:
名称 | 说明 |
---|---|
Entity | 实体,通常和数据库中的表对应 |
DTO | 数据传输对象,通常用于程序中各层之间传递数据 |
VO | 视图对象,为前端展示数据提供的对象 |
POJO | 普通Java对象,只有属性和对应的getter和setter |
分析sky-server模块的每个包的作用:
名称 | 说明 |
---|---|
config | 存放配置类 |
controller | 存放controller类 |
interceptor | 存放拦截器类 |
mapper | 存放mapper接口 |
service | 存放service类 |
SkyApplication | 启动类 |
3.2.2 Git版本控制
使用 Git 进行项目代码的版本控制,具体操作:
- 创建 Git 本地仓库
- 创建 Git 远程仓库
- 将本地文件推送到 Git 远程仓库
3.2.3 数据库环境搭建
3.2.4 前后端联调
3.2.5 nginx反向代理和负载均衡
nginx 反向代理,就是将前端发送的动态请求由 nginx 转发到后端服务器
- 前端请求地址:http://localhost/api/employee/login
- 后端接口地址:http://localhost:8080/admin/employee/login
nginx 反向代理的好处:
- 提高访问速度
- 进行负载均衡
- 保证后端服务安全
所谓 负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器
nginx 反向代理的配置方式
nginx 负载均衡的配置方式
nginx 负载均衡策略
名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式,默认为1,权重越高,被分配的客户端请求就越多 |
ip_hash | 依据ip分配方式,这样每个访客可以固定访问一个后端服务 |
least_conn | 依据最少连接方式,把请求优先分配给连接数少的后端服务 |
url_hash | 依据url分配方式,这样相同的url会被分配到同一个后端服务 |
fair | 依据响应时间方式,响应时间短的服务将会被优先分配 |
具体配置方式
轮询:
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
weight:
upstream webservers{
server 192.168.100.128:8080 weight=90;
server 192.168.100.129:8080 weight=10;
}
ip_hash:
upstream webservers{
ip_hash;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
3.3 完善登录功能
问题: 员工表中的密码是明文存储,安全性太低。
解决思路:
- 将密码加密后存储,提高安全性
- 使用MD5加密方式对明文密码加密
实现步骤:
- 修改数据库中明文密码,改为MD5加密后的密文
- 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
4. 导入接口文档
4.1 前后端分离开发流程
4.2 操作步骤
Apifox
https://app.apifox.com/main/teams/2420981?tab=project
5. Swagger
5.1 介绍
使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。
官网:https://swagger.io/
作用
- 使得前后端分离开发更加方便,有利于团队协作
- 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
- 功能测试
Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。
Knife4j 是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
5.2 使用步骤
- 导入 knife4j 的maven坐标
- 在配置类中加入 knife4j 相关配置
- 设置静态资源映射,否则接口文档页面无法访问
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<knife4j>3.0.2</knife4j>
</dependency>
接口文档访问路径为: http://localhost:8080/doc.html
通过 Swagger 就可以生成接口文档,那么我们就不需要 Yapi 了?
- Yapi 是设计阶段使用的工具,管理和维护接口
- Swagger 在开发阶段使用的框架,帮助后端开发人员做后端的接口测试
5.3 常用注解
通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:
注解 | 说明 |
---|---|
@Api | 用在类上,例如Controller,表示对类的说明 |
@ApiModel | 用在类上,例如entity、DTO、VO |
@ApiModelProperty | 用在属性上,描述属性信息 |
@ApiOperation | 用在方法上,例如Controller的方法,说明方法的用途、作用 |
接下来,使用上述注解,生成可读性更好的接口文档