Day05_苍穹外卖——Redis店铺营业状态设置

目录

  • 1.1 Redis简介
  • 1.2 Redis下载与安装
      • 1.2.1 Redis下载
      • 1.2.2 Redis安装
    • 1.3 Redis服务启动与停止
      • 1.3.1 服务启动命令
      • 1.3.2 客户端连接命令
      • 1.3.3 修改Redis配置文件
      • 1.3.4 Redis客户端图形工具
  • 2. Redis数据类型
    • 2.1 五种常用数据类型介绍
    • 2.2 各种数据类型特点
  • 3. Redis常用命令
    • 3.1 字符串操作命令
    • 3.2 哈希操作命令
    • 3.3 列表操作命令
    • 3.4 集合操作命令
    • 3.5 有序集合操作命令
    • 3.6 通用命令
  • 4.在Java中操作Redis
    • 4.1 Redis的Java客户端
    • 4.2 Spring Data Redis使用方式
      • 4.2.1 介绍
      • 4.2.2 环境搭建
      • 4.2.3 操作常见类型数据
  • 5. 店铺营业状态设置
    • 5.1 需求分析和设计
      • 5.1.1 产品原型
      • 5.1.2 接口设计
      • 5.1.3 营业状态存储方式
    • 5.2 代码开发
      • 5.2.1 设置营业状态
      • 5.2.2 管理端查询营业状态
      • 5.2.3 用户端查询营业状态
    • 5.3 功能测试
      • 5.3.1 接口文档测试
      • 5.3.2 接口分组展示
      • 5.3.3 前后端联调测试
    • 5.4 代码提交

功能实现: 营业状态设置

效果图:
在这里插入图片描述
选择营业中,客户可在小程序端下单:
在这里插入图片描述
选择打烊中,客户无法在小程序端下单:
在这里插入图片描述

1.1 Redis简介

Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件
官网: https://redis.io
中文网: https://www.redis.net.cn/

key-value结构存储:

在这里插入图片描述

主要特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。

NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。

关系型数据库(RDBMS):

  • Mysql
  • Oracle
  • DB2
  • SQLServer

非关系型数据库(NoSql):

  • Redis
  • Mongo db
  • MemCached

1.2 Redis下载与安装

1.2.1 Redis下载

Redis安装包分为windows版和Linux版:

  • Windows版下载地址:https://github.com/microsoftarchive/redis/releases
  • Linux版下载地址: https://download.redis.io/releases/

1.2.2 Redis安装

1)在Windows中安装Redis(项目中使用)

Redis的Windows版属于绿色软件,直接解压即可使用,解压后目录结构如下:
在这里插入图片描述
2)在Linux中安装Redis(简单了解)

在Linux系统安装Redis步骤:

  1. 将Redis安装包上传到Linux
  2. 解压安装包,命令:tar -zxvf redis-4.0.0.tar.gz -C /usr/local
  3. 安装Redis的依赖环境gcc,命令:yum install gcc-c++
  4. 进入/usr/local/redis-4.0.0,进行编译,命令:make
  5. 进入redis的src目录进行安装,命令:make install

安装后重点文件说明:

  • /usr/local/redis-4.0.0/src/redis-server:Redis服务启动脚本
  • /usr/local/redis-4.0.0/src/redis-cli:Redis客户端脚本
  • /usr/local/redis-4.0.0/redis.conf:Redis配置文件

1.3 Redis服务启动与停止

以window版Redis进行演示:

1.3.1 服务启动命令

redis-server.exe redis.windows.conf

在这里插入图片描述

Redis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务

当Redis服务启动成功后,可通过客户端进行连接。

1.3.2 客户端连接命令

redis-cli.exe
在这里插入图片描述

通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:

  • -h ip地址
  • -p 端口号
  • -a 密码(如果需要)

1.3.3 修改Redis配置文件

可以设置Redis服务密码或配置一些常用选项,修改redis.windows.conf

# 允许外部访问
bind 0.0.0.0
# 端口
port 6379
# 开启 AOF 持久化
appendonly yes
# 设置持久化文件名
appendfilename "appendonly.aof"
# RDB 快照持久化
save 900 1
save 300 10
save 60 10000
# 日志级别
loglevel notice
# 设置连接密码
requirepass 123456
# 客户端超时(0 表示永不超时)
timeout 0

注意:

  • 修改密码后需要重启Redis服务才能生效
  • Redis配置文件中 # 表示注释

重启Redis后,再次连接Redis时,需加上密码,否则连接失败。

redis-cli.exe -h localhost -p 6379 -a 123456

在这里插入图片描述
此时,-h 和 -p 参数可省略不写。

1.3.4 Redis客户端图形工具

https://gitee.com/qishibo/AnotherRedisDesktopManager/releases
在这里插入图片描述
安装完毕后,直接双击启动

新建连接

在这里插入图片描述
连接成功
在这里插入图片描述

2. Redis数据类型

2.1 五种常用数据类型介绍

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

2.2 各种数据类型特点

在这里插入图片描述

解释说明:

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

3. Redis常用命令

3.1 字符串操作命令

Redis 中字符串类型常用命令:

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
  • SETNX key value 只有在 key 不存在时设置 key 的值

更多命令可以参考Redis中文网:https://www.redis.net.cn

> set name kunkun
OK> get name
kunkun> setex code 10 1234
> get code
1234
过十秒钟后
> get code
null> setnx name ikun
> get name
kunkun
只有key不存在时,才会设置key的值

3.2 哈希操作命令

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值
  • HGETALL key 获取哈希表中指定key的左右字段和值

在这里插入图片描述

> hset user name zhangsan
1> hset user age 18
1> hget user name
zhangsan> hget user age
18> hdel user age
1> hget user age
null> hget user name
zhangsan> hset user phone 1234567
1> hset user age 18
1> hkeys user
name
phone
age> hvals user
zhangsan
1234567
18> hgetall user
name
zhangsan
phone
1234567
age
18

3.3 列表操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
  • RPOP key 移除并获取列表最后一个元素
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

在这里插入图片描述

> lpush list01 sing dance rap basketball
4> rpush list01 java go python
7> lrange list01 0 6
basketball
rap
dance
sing
java
go
python> lrange list01 0 -1
basketball
rap
dance
sing
java
go
python> rpop list01
python> lpop list01
basketball> llen list01
5> lrange list01 0 -1
rap
dance
sing
java
go--没有元素的时候会等待超时所设定的时间后返回null
> brpop list01 10
list01
dance
> brpop list01 10
list01
rap
> brpop list01 10
null

3.4 集合操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SREM key member1 [member2] 移除集合中一个或多个成员
  • SDIFF key1 [key2] 返回所有给定集合的差集
    在这里插入图片描述
> sadd A go java go
2> sadd B java python
2> SMEMBERS A
go
java> SMEMBERS B
java
python> scard A
2> scard B
2> SINTER A B
java> SUNION A B
go
java
python> SDIFF A B
go> SDIFF B A
python> SREM A go
1

3.5 有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:

常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member …] 移除有序集合中的一个或多个成员

在这里插入图片描述

> zadd C 99 zhangsan 88 lisi 77 wangwu
3> zrange C 0 -1
wangwu
lisi
zhangsan> ZINCRBY C 20 wangwu
97> zrange C 0 -1
lisi
wangwu
zhangsan> zrange C 0 -1 withscores
lisi
88
wangwu
97
zhangsan
99> zrem C lisi
1> zrange C 0 -1 withscores
wangwu
97
zhangsan
99

3.6 通用命令

Redis的通用命令是不分数据类型的,都可以使用的命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key

  • EXISTS key 检查给定 key 是否存在

  • TYPE key 返回 key 所储存的值的类型

  • DEL key 该命令用于在 key 存在是删除 key

  • rename key 新key 重命名

  • ping 测试连接是否正常

  • expire key 秒数 设置这个key在缓存中的存活时间

  • ttl key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位

    若返回值为 -1: 永不过期
    若返回值为 -2: 已过期或者不存在

> keys *
A
B
C> keys A
A> keys A*
A> exists user
0> type A
set> type C
zset> del C
1> exists C
0> rename B BB
OK> ping
PONG> expire A 10
1> exists A
0> ttl A
-2

4.在Java中操作Redis

4.1 Redis的Java客户端

前面我们讲解了Redis的常用命令,这些命令是我们操作Redis的基础,那么我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。

Redis 的 Java 客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

我们重点学习Spring Data Redis

4.2 Spring Data Redis使用方式

4.2.1 介绍

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

网址:https://spring.io/projects/spring-data-redis
在这里插入图片描述
Spring Boot提供了对应的Starter,maven坐标:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:string数据操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:hash类型的数据操作
  • ListOperations:list类型的数据操作

4.2.2 环境搭建

进入到sky-server模块

1). 导入Spring Data Redis的maven坐标(已完成)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2). 配置Redis数据源

在application-dev.yml中添加

sky:redis:host: localhostport: 6379password: 123456database: 10

解释说明:

database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。

可以通过修改Redis配置文件来指定数据库的数量。

在application.yml中添加读取application-dev.yml中的相关Redis配置

spring:profiles:active: devredis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}

3). 编写配置类,创建RedisTemplate对象

package com.sky.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Slf4j
@Configuration
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info("开始创建redis模板对象...");RedisTemplate redisTemplate = new RedisTemplate();//设置redis key的序列化器StringRedisSerializer,默认是JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());//不推荐设置value的序列化器//设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}

解释说明:

当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为

JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为

StringRedisSerializer序列化器。

4). 通过RedisTemplate对象操作Redis

在test下新建测试类

package com.sky;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
public class TestRedis {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test() {System.out.println(redisTemplate);}
}

测试:
在这里插入图片描述

说明RedisTemplate对象注入成功,并且通过该RedisTemplate对象获取操作5种数据类型相关对象。

上述环境搭建完毕后,接下来,我们就来具体对常见5种数据类型进行操作。

4.2.3 操作常见类型数据

1). 操作字符串类型数据

    /*** 测试String类型*/@Testpublic void testString() {//获取valueOperations对象ValueOperations valueOperations = redisTemplate.opsForValue();//通过valueOperations对象操作String类型数据valueOperations.set("name", "kunkun");      //对应set命令Object name = valueOperations.get("name");  //对应get命令System.out.println(name);//存储验证码,并设置过期时间为10秒valueOperations.set("code", "123456", 10, TimeUnit.SECONDS);//对应setex命令valueOperations.setIfAbsent("age", "18");//对应setnx命令valueOperations.setIfAbsent("age", "19");System.out.println(valueOperations.get("age"));}

2). 操作哈希类型数据

    /*** 测试Hash类型*/@Testpublic void testHash() {//获取hashOperations对象HashOperations hashOperations = redisTemplate.opsForHash();//通过hashOperations对象操作Hash类型数据hashOperations.put("user", "name", "tom");//对应hset命令hashOperations.put("user", "age", "18");//对应hset命令hashOperations.put("user", "iphone", "18024352434");//对应hset命令System.out.println(hashOperations.get("user", "name"));//对应hget命令System.out.println(hashOperations.keys("user"));//对应hkeys命令System.out.println(hashOperations.values("user"));//对应hvals命令hashOperations.delete("user", "iphone");//对应hdel命令System.out.println(hashOperations.entries("user"));//对应hgetall命令}

3). 操作列表类型数据

    /*** 测试列表类型数据*/@Testpublic void testList() {//获取listOperations对象ListOperations listOperations = redisTemplate.opsForList();//通过listOperations对象操作列表类型数据listOperations.leftPushAll("mylist", "a","b","c");//对应lpush命令listOperations.leftPush("mylist", "d");listOperations.rightPush("mylist", "e");//对应rpush命令List mylist = listOperations.range("mylist", 0, -1);//对应lrange命令System.out.println(mylist);listOperations.leftPop("mylist");//对应lpop命令listOperations.rightPop("mylist");//对应rpop命令System.out.println(listOperations.size("mylist"));//对应llen命令}

4). 操作集合类型数据

    /*** 测试set集合类型数据*/@Testpublic void testSet() {//获取setOperations对象SetOperations setOperations = redisTemplate.opsForSet();//通过setOperations对象操作set集合数据setOperations.add("myset1", "a","b","c","d");//对应sadd命令setOperations.add("myset2", "a","b","x","y");//对应sadd命令System.out.println(setOperations.members("myset1"));//对应smembers命令System.out.println(setOperations.members("myset2"));//对应smembers命令System.out.println(setOperations.size("myset1"));//对应scard命令System.out.println(setOperations.size("myset2"));//对应scard命令System.out.println(setOperations.intersect("myset1", "myset2"));//对应sinter命令System.out.println(setOperations.union("myset1", "myset2"));//对应sunion命令System.out.println(setOperations.difference("myset1", "myset2"));//对应sdiff命令setOperations.remove("myset1", "a");//对应srem命令setOperations.remove("myset2", "a", "b");//对应srem命令}

5). 操作有序集合类型数据

    /*** 测试zset有序集合类型数据*/@Testpublic void testZSet() {//获取zSetOperations对象ZSetOperations zSetOperations = redisTemplate.opsForZSet();//通过zSetOperations对象操作zset有序集合数据zSetOperations.add("zset1", "a",10);//对应zadd命令zSetOperations.add("zset1", "b",20);//对应zadd命令zSetOperations.add("zset1", "c",30);//对应zadd命令System.out.println(zSetOperations.range("zset1", 0, -1));//对应zrange命令System.out.println(zSetOperations.incrementScore("zset1", "a", 5));//对应zincrby命令zSetOperations.remove("zset1", "b", "c");//对应zrem命令}

6). 通用命令操作

    /*** 测试通用命令*/@Testpublic void testCommon() {System.out.println(redisTemplate.keys("*"));//对应keys命令System.out.println(redisTemplate.hasKey("user"));//对应exists命令for (Object key : redisTemplate.keys("*")){System.out.println(redisTemplate.type(key));//对应type命令}redisTemplate.delete("mylist");//对应del命令redisTemplate.rename("user", "user1");//对应rename命令redisTemplate.expire("user1", 10, TimeUnit.SECONDS);//对应expire命令System.out.println(redisTemplate.getExpire("user1"));//对应ttl命令System.out.println(redisTemplate.getConnectionFactory().getConnection().ping());//对应ping命令}

5. 店铺营业状态设置

5.1 需求分析和设计

5.1.1 产品原型

进到苍穹外卖后台,显示餐厅的营业状态,营业状态分为营业中打烊中,若当前餐厅处于营业状态,自动接收任何订单,客户可在小程序进行下单操作;若当前餐厅处于打烊状态,不接受任何订单,客户便无法在小程序进行下单操作。

在这里插入图片描述
点击营业状态按钮时,弹出更改营业状态

在这里插入图片描述

选择营业,设置餐厅为营业中状态

选择打烊,设置餐厅为打烊中状态

状态说明:
在这里插入图片描述

5.1.2 接口设计

根据上述原型图设计接口,共包含3个接口。

接口设计:

  • 设置营业状态
  • 管理端查询营业状态
  • 用户端查询营业状态

注: 从技术层面分析,其实管理端和用户端查询营业状态时,可通过一个接口去实现即可。因为营业状态是一致的。但是,本项目约定:

  • 管理端发出的请求,统一使用/admin作为前缀。
  • 用户端发出的请求,统一使用/user作为前缀。

因为访问路径不一致,故分为两个接口实现。

1). 设置营业状态
在这里插入图片描述

2). 管理端营业状态

在这里插入图片描述

3). 用户端营业状态

在这里插入图片描述

5.1.3 营业状态存储方式

虽然,可以通过一张表来存储营业状态数据,但整个表中只有一个字段,所以意义不大。

营业状态数据存储方式:基于Redis的字符串来进行存储

在这里插入图片描述

约定: 1表示营业 0表示打烊

5.2 代码开发

5.2.1 设置营业状态

在sky-server模块中,创建ShopController.java

根据接口定义创建ShopController的setStatus设置营业状态方法:

package com.sky.controller.admin;import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate 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();}
}

5.2.2 管理端查询营业状态

根据接口定义创建ShopController的getStatus查询营业状态方法:

	/*** 获取店铺的营业状态* @return*/@GetMapping("/status")@ApiOperation("获取店铺的营业状态")public Result<Integer> getStatus(){Integer status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");return Result.success(status);}

5.2.3 用户端查询营业状态

创建com.sky.controller.user包,在该包下创建ShopController.java

根据接口定义创建ShopController的getStatus查询营业状态方法:

package com.sky.controller.user;import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate 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);}
}

5.3 功能测试

5.3.1 接口文档测试

启动服务: 访问http://localhost:8080/doc.html,打开店铺相关接口

注意: 使用admin用户登录重新获取token,防止token失效。

设置营业状态:
在这里插入图片描述
点击发送
在这里插入图片描述
查看Idea控制台日志
在这里插入图片描述
查看Redis中数据
在这里插入图片描述
管理端查询营业状态:
在这里插入图片描述
用户端查询营业状态:
在这里插入图片描述

5.3.2 接口分组展示

在上述接口文档测试中,管理端和用户端的接口放在一起,不方便区分。
在这里插入图片描述
接下来,我们要实现管理端和用户端接口进行区分。

在WebMvcConfiguration.java中,分别扫描"com.sky.controller.admin"和"com.sky.controller.user"这两个包。

	@Beanpublic 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.sky.controller.admin")).paths(PathSelectors.any()).build();return docket;}@Beanpublic 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.sky.controller.user")).paths(PathSelectors.any()).build();return docket;}

重启服务器,再次访问接口文档,可进行选择用户端接口或者管理端接口
在这里插入图片描述

5.3.3 前后端联调测试

启动nginx,访问 http://localhost

进入后台,状态为营业中
在这里插入图片描述
点击营业状态设置,修改状态为打烊中
在这里插入图片描述
再次查看状态,状态已为打烊中
在这里插入图片描述

5.4 代码提交

点击提交:
在这里插入图片描述
提交过程中,出现提示:
在这里插入图片描述
继续push:
在这里插入图片描述
推送成功:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98186.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双指针:字符串

题目&#xff1a;字符串 题目概述&#xff1a;找包含所有小写字母的最短字符串。 重点思路&#xff1a; right是 < len-1字符 - ‘26’转换成整形再判断&#xff08;写字符a也可以&#xff0c;更准确&#xff09;。 #include <iostream> #include <algorithm>…

HarmonyOS 应用开发深度实践:精通 Stage 模型与 UIAbility 生命周期

好的&#xff0c;请看这篇关于 HarmonyOS Stage 模型与 UIAbility 深度实践的技术文章。 HarmonyOS 应用开发深度实践&#xff1a;精通 Stage 模型与 UIAbility 生命周期 引言 随着 HarmonyOS 4、5 的广泛部署和 HarmonyOS NEXT (API 12) 的发布&#xff0c;华为的分布式操作系…

DEDECMS 小程序插件简介 2.0全新上线

网上有很多的dedecms的小程序插件&#xff0c;但是有的依赖他们第三方、有的需要一定php或sql基础、有的插件免费但是小程序源码价格昂贵&#xff0c;这也是促使我开发dedecms小程序插件的一大原因。2025年9月4日 dedecms小程序插件2.0版本正式上线&#xff0c;由于使用人数减少…

Flink 1.17.2 集群安装部署

Flink集群的安装 1. 集群规划 Ip host Server Note 192.168.10.101 node01 jobManager、TaskManagerRunner 老大和小弟服务 192.168.10.102 node02 TaskManagerRunner 小弟 192.168.10.103 node03 TaskManagerRunner 小弟 注意&#xff1a;本次使用jdk-1.8.0…

[vue.js] 树形结点多选框选择

vue.js前端代码&#xff1a; <template><div><el-tree:data"treeData"node-key"id"show-checkboxref"tree"check-change"handleCheckChange"/><el-button click"getSelectedNodes">获取选中的节点&…

Web 服务器基本工作流程

这是一个关于 ​​Web 服务器基本工作流程​​ 的全面解释。我们以最经典的 ​​客户端-服务器-后端​​ 三层架构为例&#xff0c;并结合你之前遇到的 Nginx 场景进行说明。​​核心角色​​​​客户端 (Client)​​&#xff1a; 通常是 ​​Web 浏览器​​ (Chrome, Firefox)…

IDEA 连接MySQL数据库

一、 连接数据库1、打开连接2、建立连接3、输入用户名和密码二、操作数据库1、选择数据库2、New| Query Console 查询控制台3、写查询语句4、New| SQL Script| sql Generator 生成这个数据库表的SQL结构New | SQL Script | Generate DDL to Query Console 在查询控制台生成…

江协科技STM32课程笔记(二)—外部中断EXTI

二、外部中断EXTI中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。1、stm32中断简介…

Java常见排序算法实现

以下是Java中几种常见排序算法的实现&#xff0c;包括冒泡排序、选择排序、插入排序、快速排序和归并排序。 各排序算法特点说明&#xff1a;冒泡排序&#xff1a; 原理&#xff1a;重复比较相邻元素&#xff0c;将大的元素逐步"冒泡"到数组末尾特点&#xff1a;稳定…

Python爬虫实战:研究Pandas,构建地理信息数据采集和分析系统

1. 引言 1.1 研究背景 地理数据作为描述地球表面空间要素的数据,包含了丰富的空间位置、分布特征和属性信息,在城市规划、环境监测、商业分析等众多领域发挥着不可替代的作用。随着 "数字地球"、"智慧城市" 等概念的提出和发展,地理数据的重要性日益凸…

nvm安装node后出现报错: “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件”

一、问题描述 使用nvm安装node后&#xff0c;使用npm命令报错如下 报错1&#xff1a;npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。报错2&#xf…

【高等数学】第十二章 无穷级数——第二节 常数项级数的审敛法

上一节&#xff1a;【高等数学】第十二章 无穷级数——第一节 常数项级数的概念和性质 总目录&#xff1a;【高等数学】 目录 文章目录1. 正项级数及其审敛法1. 正项级数及其审敛法 正项级数 各项都是正数或零的级数称为正项级数正项级数收敛 正项级数 ∑n1∞un\displaystyle\…

图观 流渲染场景编辑器

一、 产品简介图观 流渲染场景编辑器&#xff0c;以编辑器插件形式&#xff0c;在Unreal Engine中轻松编辑并发布数字孪生场景。支持 GIS 全球/局部 数字孪生场景构建&#xff0c;并预置 图观技术架构工程模板&#xff0c;支持对 场景效果、镜头视野&#xff0c;环境时间气象、…

Visual Studio 函数头显示引用个数

在visual studio 里面有自带的显示引用方案 codeLens

数据结构的哈希表冲突解决方法

哈希表是一种高效的数据结构,通过哈希函数将键映射到存储位置。但由于哈希函数可能将不同键映射到相同位置(称为哈希冲突),需要有效的方法来解决冲突。以下是常见的冲突解决策略,每种方法都有其原理、优缺点和适用场景。我将逐步解释这些方法,确保内容清晰可靠。 1. 开放…

MySQL 基础概念与简单使用

MySQL 基础概念与简单使用 一、数据库基本概念 1、数据库定义 数据库&#xff08;Database&#xff09;是存储在计算机内、有组织、可共享的数据集合&#xff0c;用于高效地管理大量数据。 2、数据库分类 按数据模型分类&#xff1a; 关系型数据库&#xff08;如 MySQL、Oracle…

关系模型的数据结构

在关系数据库这个世界里&#xff0c;所有东西&#xff08;包括你要记录的人、物、事&#xff0c;以及它们之间的联系&#xff09;都用一种叫做“关系”的结构来表示。而这种“关系”的灵魂&#xff0c;就是“码”&#xff08;Key&#xff09;。1. 核心思想&#xff1a;万物皆“…

180 课时吃透 Go 语言游戏后端系列0:序言

零基础能学习 Go 游戏后端开发吗&#xff1f; 当然能学啦&#xff01;别担心&#xff0c;就算你之前对编程一窍不通&#xff0c;也完全没问题。我特意准备了180课时的开发课程&#xff0c;由浅入深、从理论到实践带领大家学会使用GO语言进行游戏后端开发。 编程就像学一门新语…

Android-SerialPort-API-master源码 串口调试 权限分析 定制

我把界面美化了一下Android-SerialPort-API-master源码 1.加了发送按钮 2.加上固定/dev/ttyGS1和GS9串口权限问题已经查清楚了。app与PosServer都是使用google的SerialPort方案。我做的app 都多使用一个函数available()&#xff0c;这个函数是非常有用的。在上位机发送单条指令…

KVM 入门使用手册

KVM 入门使用手册 1. 概述 2. 安装 在 Ubuntu/Debian 上安装 在 RHEL/CentOS/Fedora 上安装 3. 网络配置 查看默认网络 使用桥接网络 (推荐用于服务器) 4. 创建虚拟机 方法一:使用图形界面 (virt-manager) 方法二:使用命令行 (virt-install) 5. 管理虚拟机 使用 `virsh` 命令…