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
英文地址,請注明出處:http://en.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` 命令…