小柒味来 - 店铺营业状态接口实现

店铺营业状态设置

一、需求分析

1.1 产品原型

在后台,可查看并设置餐厅营业状态(营业中 / 打烊中):

  • 营业中:可自动接收订单,顾客可正常下单
  • 打烊中:不接受订单,顾客无法下单

点击营业状态按钮,弹出更改窗口:

  • 选择 营业 → 设置为营业中
  • 选择 打烊 → 设置为打烊中

1.2 接口设计

根据原型设计 3 个接口:

  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-serverconfig包下新建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.adminShopController.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.userShopController.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 分组的方式,将两类接口分开展示。

实现步骤

  1. 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;
    }
  1. 重启项目

访问 Swagger 接口文档http://localhost:8080/doc.html#/home,即可在页面中选择:

这样就能清晰地区分两类接口,方便查找与测试

4.2 Redis知识补充

存储中间件-Redis

关于利用Redis实现店铺状态管理就基本实现了,下一章小柒味来 - 微信登录与商品浏览功能开发


欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1701220998@qq.com
导航页 GitHub