SpringBoot + SSM项目《神威食客》(Hyplus Foodie)
GitHub仓库:Hyplus-Foodie
目录
1 项目整体介绍
软件开发流程:
- 需求分析:需求规格说明书、产品原型
- 设计:UI设计、数据库设计、接口设计
- 编码:项目代码、单元测试
- 测试:测试用例、测试报告
- 上线运维:软件环境安装、配置
角色分工:
- 项目经理:对整个项目负责,任务分配、把控进度
- 产品经理:进行需求调研,输出需求调研文档、产品原型等
- UI设计师:根据产品原型输出界面效果图
- 架构师:项目整体架构设计、技术选型等
- 开发工程师:代码实现
- 测试工程师:编写测试用例,输出测试报告
- 运维工程师:软件环境搭建、项目上线
软件环境:
- 开发环境(Development):开发人员在开发阶段使用的环境,一般外部用户无法访问
- 测试环境(Testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问
- 生产环境(Production):即线上环境,正式提供对外服务的环境
2 后端环境搭建
各类对象:
- POJO:普通Java对象,只有属性和对应的getter和setter
- Entity:实体,通常和数据库中的表对应
- DTO:数据传输对象,通常用于程序中各层之间传递数据
- VO:视图对象,为前端展示数据提供的对象
更多细节详见仓库源码
3 功能测试
功能测试方式:
- 通过接口文档测试
- 通过前后端联调测试
注意:由于开发阶段前端和后端是并行开发的,后端完成某个功能后,此时前端对应的功能可能还没有开发完成,
导致无法进行前后端联调测试。所以在开发阶段,后端测试主要以接口文档测试为去。
4 Spring Data Redis
5 HttpClient
HttpClient是Apache Jakarta Common下的子项目,提供了高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且支持HTTP协议的最新版本和建议。
核心API:
- HttpClient
- HttpClients
- CloseableHttpClient
- HttpGet
- HttpPost
发送请求步骤:
- 创建HttpClient对象
- 创建Http请求对象(HttpGet或HttpPost)
- 调用HttpClient的
execute()
方法发送请求
使用例:
@SpringBootTest
public class HttpClientTest {
/**
* 通过HttpClient发送Get请求
*/
@Test
public void testGet() throws IOException {
// 创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建HttpGet对象
HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
// 发送请求,接收响应结果
CloseableHttpResponse response = httpClient.execute(httpGet);
// 解析返回结果
// 获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务端返回的状态码为:" + statusCode);
// 获取服务端返回的内容
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
System.out.println("服务端返回的内容为:" + body);
// 关闭资源
response.close();
httpClient.close();
}
/**
* 通过HttpClient发送Post请求
*/
@Test
public void testPost() throws Exception {
// 创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建HttpPost对象
HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
// 设置请求体
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "admin");
jsonObject.put("password", "123456");
StringEntity entity = new StringEntity(jsonObject.toString());
// 指定请求编码方式
entity.setContentEncoding("utf-8");
// 指定请求数据类型
entity.setContentType("application/json");
httpPost.setEntity(entity);
// 发送请求,接收响应结果
CloseableHttpResponse response = httpClient.execute(httpPost);
// 解析返回结果
// 获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务端返回的状态码为:" + statusCode);
// 获取服务端返回的内容
HttpEntity entity1 = response.getEntity();
String body = EntityUtils.toString(entity1);
System.out.println("服务端返回的内容为:" + body);
// 关闭资源
response.close();
httpClient.close();
}
}
6 微信小程序开发
小程序:一种新的开放能力,可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
微信开发者工具:下载链接
安装并创建项目后注意取消勾选详情 - 本地设置 - 不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书
。
6.1 小程序目录结构
小程序包含一个描述整体程序的app和多个描述各自页面的page。一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:
app.js
:小程序逻辑,必需app.json
:小程序公共配置,必须app.wxss
:小程序公共样式表,非必须
一个小程序页面由四个文件组成,各种文件类型的作用如下:
js
:页面逻辑,必需wxml
:页面结构,必须json
:页面配置,非必须wxss
:页面样式表,非必须
6.2 微信登录
官方文档:小程序登录
7 Spring Cache
Spring Cache实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:
- EHCache
- Caffeine
- Redis
常用注解:
@EnableCaching
:开启缓存注解功能,通常加在启动类上@Cacheable
:在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中。相关属性如下:cacheNames
:缓存名称,用于划分不同的缓存区(例如userCache::
+ key值)key
:缓存key值,格式为Spring EL表达式,从方法参数获取值(与形参名保持一致,例如#id
、#user.id
等)
@CachePut
:将方法的返回值放到缓存中。相关属性类似@Cacheable
@CacheEvict
:将一条或多条数据从缓存中删除。相关属性相比@Cacheable
新增如下几条:allEntries
:为true则删除该区域内所有的缓存。beforeInvocation
:设为true时在执行方法之前做删除缓存处理;设为false时在执行方法之后做删除处理。默认为false。
8 微信支付
详见产品中心
JSAPI下单:商户系统调用该接口在微信支付服务后台生成预支付交易单
微信小程序支付时序图:
9 校验收货地址是否超出配送范围
百度地图开放平台:https://lbsyun.baidu.com/
进入控制台,创建应用,获取AK
相关接口:
- https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
- https://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1
10 Spring Task
Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。
应用场景:
- 信用卡每月还款提醒
- 银行贷款每月还款提醒
- 火车票售票系统处理未支付订单
- 入职纪念日为用户发送通知吃
cron表达式:本质上是一个字符串,可以定义任务触发的时间,建议通过cron表达式在线生成器编写。
基本构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义——秒 分钟 小时 日 月 周 [年]
(其中“年”可选),日或周几不确定可填?
。
【例】2022年10月12日上午9点整对应的cron表达式为0 0 9 12 10 ? 2022
Spring Task使用步骤:
- 导入maven坐标
spring-context
- 启动类添加注解
@EnableScheduling
开启任务调度 - 自定义定时任务类,在方法(无返回)上添加注解
@Scheduled
并设置cron
参数