一、前言

由于套餐管理相较于菜品管理更简单,所以是我自己敲的,这里就没必要放代码了,因为大体步骤都是一样的,而且套餐的删除还不需要考虑菜品的起售,整体难度更简单。

上一节引入了Redis,这里引入Redis的主要原因就是在店铺的营业状态这里可以通过操作Redis来改变(Redis的应用场景就是在热门、点击率高的板块使用,同时营业状态就一个字段,没必要再在MySQL中再创建一个表了)。

二、店铺营业状态

1.Redis配置类

其实在上一节中我们就已经用到了配置类了,目的是为了方便后续自动装配,所以这里就不过多赘述了。

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建Redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis.key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

2.文档

老样子,先看文档:

可以看到这里我们需要设计两个接口来达到目的。

3.Controller(admin)

其实使用Redis数据库相对于MySQL更简单,因为MySQL需要通过底层Mapper来达到操控持久层的效果,而Redis是没有这个概念的,我们使用的是Spring Data Redis框架,不再需要遵循Mybatis框架的规则了,甚至我们这里都不需要写Service层了。

很简单,就是自动装配Redis模板对象,然后直接对Value字段进行操作。

值得注意的是,这里我们似乎一直在使用set,相当于一直在创建SHOP_STATUS这个键,这里可能会有点不能理解,但是其实这是基于Redis的特性来使用的,Redis的字符串键值对是没有修改功能的,所以如果想要修改字段,就只能直接覆盖。

@RestController("adminShopController")
@Slf4j
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
public class ShopController {

    public static final String KEY = "SHOP_STATUS";
    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 设置店铺营业状态
     * @param status
     * @return
     */
    @PutMapping("/{status}")
    @ApiOperation("设置店铺营业状态")
    public Result setStatus(@PathVariable Integer status){
        log.info("设置店铺状态为:{}",status == 1?"营业中":"打烊中");
        redisTemplate.opsForValue().set(KEY,status);

        return Result.success();
    }


    /**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){

        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取店铺的营业状态为:{}",status == 1?"营业中":"打烊中");

        return Result.success(status);
    }
}

在ARDM中查看我们新建的键值对:

4.Controller(user)

刚刚的是服务端的Controller,我们想要达到的效果是在小程序中能查看店铺的营业状态,如果打烊就不能再点餐或者新增订单了。

所以自然的,用户端也需要一个Controller,但是用户只需要查看状态即可,不允许设置状态,所以只需要把上面的代码抄下来,然后将RequestMapping稍微修改一下即可。

@RestController("userShopController")
@Slf4j
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){

        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取店铺的营业状态为:{}",status == 1?"营业中":"打烊中");

        return Result.success(status);
    }
}

三、httpClient快速入门

HttpClient 是一个用于发送和接收HTTP请求的客户端编程工具包,功能和Servlet正好相反,Servlet是用于接收请求,发送响应的,而HttpClient是用于发送请求,接收响应的(浏览器其实就是一个HttpClient)。

@SpringBootTest
public class HttpClientTest {

    /**
     * 测试通过httpclient发送get方式请求
     */
    @Test
    public void testGET() throws IOException {
        //创建httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();

        //创建请求对象
        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 = 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();
    }
}

这是我们用来测试在客户端中能否查看店铺状态信息的方法,相当于向服务端发送了获取数据的请求,得到服务端的响应,模拟了浏览器的工作。

更多推荐