1. HttpClient
HttpClient是Apache的一个子项目,是高效的、功能丰富的支持HTTP协议的客户端编程工具包
作用:发送HTTP请求, 接受相应数据
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
发送请求步骤
创建HttpClient对象
创建Http请求对象
调用HttpClient的execute方法发送请求
GET方式请求
POST方式请求
封装
封装到 common 里的工具类 HttpClientUtil
2. 微信登录
微信登录 官方手册
代码开发
配置微信登录配置项
为微信用户生成jwt令牌时使用的配置项
登录方法
wxLogin 接口思路:
- 获取当前微信用户的 openid (openid 在 user 表里是唯一索引)
- 判断 openid 是否在数据库里
- 如果不在,则创新新用户并保存到数据库
- 返回当前的用户信息
拦截用户端发送的请求并校验
编写拦截器JwtTokenUserInterceptor
注册拦截器
3. 用户端商品查询
商品浏览查询
接口设计
- 查询分类
- 根据分类 id 查询菜品
- 根据分类 id 查询套餐
- 根据套餐 id 查询包含的菜品
代码开发
这里是选择导入提供的相应代码
4. 缓存(RedisTemplate)
查询的请求发的比较频繁,就考虑将查询的数据缓存在 redis 减少数据库的查询压力
实现思路
- 每个分类下的菜品保存一份缓存数据
- 数据库里的菜品数据有变更时清理缓存数据
代码实现
存缓存
清理缓存
在数据库发生变动的时候,要清楚当前有关联的缓存
5. 缓存(Spring Cache)
Spring Cache 是一个框架,实现了基于注解的缓存功能
只需要简单地加一个注解,就能实现缓存功能
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> <version>2.7.3</version>
</dependency>
常用注解
注解 | 说明 |
@EnableCaching | 开启缓存注解功能,通常加在启动类上 |
@Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
实现思路
- 导入Spring Cache和Redis相关maven坐标
- 在启动类上加入@EnableCaching注解,开启缓存注解功能
- 在用户端接口SetmealController的 list 方法上加入@Cacheable注解
- 在管理端接口SetmealController的 save、delete、update、startOrStop等方法上加入CacheEvict注解
代码开发
存缓存
在用户端接口SetmealController的 list 方法上加入@Cacheable注解
清理缓存
在管理端接口SetmealController的 save、delete、update等方法上加入CacheEvict注解
选择性删除缓存
全删缓存
6. 购物车
添加购物车
实现目的
- 暂时存放所选商品的地方
- 选的什么商品
- 每个商品都买了几个
- 不同用户的购物车需要区分开
代码开发
代码比较常规
一条购物车信息 == 一个用户选择的菜品(或套餐)及对应数量
注意点:
在添加购物车的时候,进行条件查询,判断是否已经存在该条购物车信息
如果已经存在该购物车信息,则直接进行 数量 + 1,只有在不存在的时候才进行添加数据
其中添加购物车数据的时候,也需要进行判断加入的是套餐还是菜品
查看购物车
直接根据当前登录用户的 userId 去数据库查询,该数据库变化频繁,不建议采用缓存
代码开发
清空购物车
清空当前用户 userId 对应的数据库所有信息
删除购物车一条信息
实现思路
- 根据前端传入的 shoppingCartDTO 和当前登录用户的 userId 去数据库查询对应的数据
- 查到的一定是一条数据,否则是错误
- 判断查到的数据当前的 Number 是否为 1
- 如果为 1 则直接删除该条信息
- 否则该条信息的 Number - 1