Hyplus Foodie(神威食客)是Hyperplasma旗下的一款开源的新型外卖服务系统,致力于为用户提供最为便捷、可靠的美食体验。通过其科学的前后端设计,用户可以随时随地轻松下单,享受独具Hyperplasma风味的美食体验。无论是忙碌的工作日还是悠闲的周末,Hyplus Foodie都能满足您的用餐需求,让美食触手可及。
GitHub仓库:github.com/Akira37R/Hyplus-Foodie
Gitee仓库:gitee.com/akira37/Hyplus-Foodie
目录
1 项目整体介绍
本文仅介绍所使用的技术栈,项目部署说明见仓库README.md
。
软件开发流程:
- 需求分析:需求规格说明书、产品原型
- 设计: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
参数
11 WebSocket
WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
HTTP协议和WebSocket协议对比:
- HTTP是短连接;WebSocket是长连接
- HTTP通信是单向的,基于请求响应模式;WebSocket支持双向通信
- HTTP和WebSocket底层都是TCP连接
WebSocket应用场景:
- 视频弹幕
- 网页聊天
- 体育实况更新
- 股票基金报价实时更新
12 Apache ECharts
Apache ECharts(官网:echarts.apache.org)是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
13 Apache POl
Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作,一般情况下用于操作Excel文件。
应用场景:
- 银行网银系统导出交易明细
- 各种业务系统导出Excel报表
- 批量导入业务数据
使用例:
/**
* 使用POI操作excel文件
*/
public class POITest {
public static void write() throws Exception {
// 在内存中创建excel文件
XSSFWorkbook excel = new XSSFWorkbook();
// 在excel文件中创建一个sheet
XSSFSheet sheet = excel.createSheet("info");
// 在sheet中创建一行(编号从0开始)
XSSFRow row = sheet.createRow(1);
// 在行中创建单元格(编号从0开始),并写入文件内容
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("年龄");
// 创建新行,并写入内容
row = sheet.createRow(2);
row.createCell(1).setCellValue("张三");
row.createCell(2).setCellValue(20);
// 通过输出流将excel文件写入磁盘
FileOutputStream out = new FileOutputStream(new File("assets/test.xlsx"));
excel.write(out);
// 关闭资源
out.close();
}
public static void read() throws Exception {
// 读取excel文件
FileInputStream in = new FileInputStream("assets/test.xlsx");
XSSFWorkbook excel = new XSSFWorkbook(in);
// 获取excel文件中的sheet
XSSFSheet sheet = excel.getSheetAt(0);
// 获取最后一行的行号
int lastRowNum = sheet.getLastRowNum();
for (int i = 1; i <= lastRowNum; i++) {
// 获取指定行
XSSFRow row = sheet.getRow(i);
// 获取单元格的值
String cellValue1 = row.getCell(1).getStringCellValue();
String cellValue2 = row.getCell(2).getStringCellValue();
System.out.println(cellValue1 + " " + cellValue2);
}
in.close();
excel.close();
}
public static void main(String[] args) throws Exception {
write();
read();
}
}
《《神威食客》(Hyplus Foodie)——SpringBoot+SSM单体项目》有1条评论