店铺营业状态设置
一、需求分析
1.1 产品原型
在后台,可查看并设置餐厅营业状态(营业中 / 打烊中):
- 营业中:可自动接收订单,顾客可正常下单
- 打烊中:不接受订单,顾客无法下单
点击营业状态按钮,弹出更改窗口:
- 选择 营业 → 设置为营业中
- 选择 打烊 → 设置为打烊中
1.2 接口设计
根据原型设计 3 个接口:
- 设置营业状态
- 管理端查询营业状态
- 用户端查询营业状态
营业状态本质相同,可共用一个查询接口,项目为了区分前缀,分为两组接口:
- 管理端:
/admin前缀- 用户端:
/user前缀
1.2.1 设置营业状态
接口地址:/admin/shop/{status}
请求方式:PUT
请求数据类型:application/json
请求参数:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
|---|---|---|---|---|---|
| status | status | path | true | integer(int32) |
响应参数:
| 参数名称 | 参数说明 | 类型 | schema |
|---|---|---|---|
| code | integer(int32) | integer(int32) | |
| data | object | ||
| msg | string |
响应示例:
{
"code": 0,
"data": {},
"msg": ""
}
1.2.2 管理端查询
接口地址:/admin/shop/status
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应参数:
| 参数名称 | 参数说明 | 类型 | schema |
|---|---|---|---|
| code | integer(int32) | integer(int32) | |
| data | object | ||
| msg | string |
响应示例:
{
"code": 0,
"data": {},
"msg": ""
}
1.2.3 用户端查询
接口地址:/user/shop/status
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应参数:
| 参数名称 | 参数说明 | 类型 | schema |
|---|---|---|---|
| code | integer(int32) | integer(int32) | |
| data | object | ||
| msg | string |
响应示例:
{
"code": 0,
"data": {},
"msg": ""
}
1.3 数据存储方式
营业状态只有一个字段,建表意义不大,直接使用 Redis 字符串 存储:
- key:
SHOP_STATUS - value:
1表示营业,0表示打烊
二、功能实现
2.1 引入Spring Data Redis
2.1.1 引入依赖
在qi-server包下的pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.1.2 配置Redis
application.yml:
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 10
2.1.3 优化Redis
在qi-server的config包下新建RedisConfiguration.java
自定义 RedisTemplate 序列化,默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,设置为StringRedisSerializer序列化器:
@Configuration
@Slf4j
public class RedisConfiguration {
/**
* 创建并配置RedisTemplate实例
*
* @param redisConnectionFactory Redis连接工厂,用于建立Redis连接
* @return 配置好的RedisTemplate实例
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 记录创建RedisTemplate对象的日志
log.info("开始创建redis对象");
// 实例化RedisTemplate
RedisTemplate redisTemplate = new RedisTemplate();
// 设置Redis连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置键的序列化方式为StringRedisSerializer,确保键以字符串形式存储
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 返回配置好的RedisTemplate实例
return redisTemplate;
}
}
2.2 Controller 层
2.2.1 设置营业状态
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
@PutMapping("/{status}")
@ApiOperation("设置店铺的营业状态")
public Result setStatus(@PathVariable Integer status){
log.info("设置店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中");
redisTemplate.opsForValue().set(KEY, status);
return Result.success();
}
}
2.2.2 管理端查询营业状态
com.qi.controller.admin → ShopController.java
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("获取到店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
2.1.3 用户端查询营业状态
com.qi.controller.user → ShopController.java
@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("获取到店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
}
三、联调测试
- 默认营业状态:

- 修改营业状态:

- 查看 Redis 数据:

四、小知识点补充
4.1 在Swagger中,使接口分组展示
后续我们访问接口文档,发现管理端接口与用户端接口混合展示,查找不便。
为便于区分,我们可以通过 Swagger 分组的方式,将两类接口分开展示。
实现步骤
- 在
WebMvcConfiguration.java中添加分组配置
通过分别扫描以下包来实现分组:
- 管理端接口包:
com.qi.controller.admin - 用户端接口包:
com.qi.controller.user
@Bean
public Docket docket1(){
log.info("准备生成接口文档...");
ApiInfo apiInfo = new ApiInfoBuilder()
.title("小柒味来项目接口文档")
.version("2.0")
.description("小柒味来项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("管理端接口")
.apiInfo(apiInfo)
.select()
//指定生成接口需要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.qi.controller.admin"))
.paths(PathSelectors.any())
.build();
return docket;
}
@Bean
public Docket docket2(){
log.info("准备生成接口文档...");
ApiInfo apiInfo = new ApiInfoBuilder()
.title("小柒味来项目接口文档")
.version("2.0")
.description("小柒味来项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("用户端接口")
.apiInfo(apiInfo)
.select()
//指定生成接口需要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.qi.controller.user"))
.paths(PathSelectors.any())
.build();
return docket;
}
- 重启项目
访问 Swagger 接口文档http://localhost:8080/doc.html#/home,即可在页面中选择:
这样就能清晰地区分两类接口,方便查找与测试
4.2 Redis知识补充
存储中间件-Redis关于利用Redis实现店铺状态管理就基本实现了,下一章小柒味来 - 微信登录与商品浏览功能开发
欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1701220998@qq.com