蒼穹外賣項目實戰(day7-1)-緩存菜品和緩存套餐功能-記錄實戰教程、問題的解決方法以及完整代碼


完整資料下載
通過網盤分享的文件:蒼穹外賣
鏈接:

https://pan.baidu.com/s/1JJaFOodXOF_lNJSUiZ6qtw?pwd=ps2t

提取碼: ps2t


目錄

1、緩存菜品

(1)問題說明

(2)使用redis緩存部分數據

1-2、代碼完善

(1)user包下DishController完善

(2)RedisConfiguration完善

(3)admin包下DishController

(4)測試功能

2、緩存套餐

Spring Cache知識點

2-2、代碼完善

(1)user/SetmealController完善

(2)admin/SetmealController完善

(3)功能測試


1、緩存菜品

(1)問題說明

(2)使用redis緩存部分數據

注意:

1、訪問mysql是磁盤IO操作,訪問redis是訪問內存

2、用戶點單的購物車中的菜品需要存儲,這個儲存不需要給服務器端,只有最后點付錢才會給服務器提交數據所以這里才有Redis來暫存

3、面試題:如何保持radis與數據庫中的數據一致性:設置過期時間 延遲雙刪

4、在套菜中,套餐是一個集合list,我們將list集合進行序列化,轉成Redis的String類型再存進Redis中;

redis的string不是java的string,redis的string算是object了,外部任何數據傳入redis都會被轉換為string

5、注意:小程序的圖片默認訪問的是老師的oss,直接去數據庫把圖片oss鏈接全改成自己的,或者在管理端(前端頁面)重新上傳圖片

6、 從redis中獲取商鋪營業狀態
?需要提前在redis中設置key為shop_status,value為1或0,1表示營業中,0表示打烊中,否則會報錯,錯誤提示為

“Cannot invoke "java.lang.Integer.intValue()" because "status" is null”

7、現在有兩個問題;

(1)如果數據庫數據變動了怎么辦?

?數據庫的數據變動了,做新增修改的時候都需要先更新數據庫,然后刪除緩存,延時雙刪,每次查詢再把數據存入redis。

(2)如果不斷存入新數據,數據不會老化那么總有一天內存會爆滿的,如何處理?

?設置超時時間,到期了數據就會消失,還可以更改redis的淘汰策略

1-2、代碼完善

(1)user包下DishController完善

位置:sky-server/src/main/java/com/sky/controller/user/DishController.java

完整代碼:

package com.sky.controller.user;import com.sky.constant.StatusConstant;
import com.sky.entity.Dish;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "C端-菜品瀏覽接口")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisTemplate redisTemplate;/*** 根據分類id查詢菜品* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根據分類id查詢菜品")public Result<List<DishVO>> list(Long categoryId) {log.info("根據分類id查詢菜品,categoryId={}", categoryId);// 查詢Redis緩存//構造緩存keyString key = "dish_" + categoryId;//從緩存中獲取數據List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);// 判斷是否存在緩存,如果存在,則直接返回緩存數據,無需再次查詢數據庫if (list != null && list.size() > 0) {log.info("查詢Redis緩存,key={},list={}", key, list);return Result.success(list);}// 查詢數據庫Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);//查詢起售中的菜品//如果緩存中沒有數據,則查詢數據庫list = dishService.listWithFlavor(dish);log.info("查詢數據庫,categoryId={},list={}", categoryId, list);// 保存到Redis緩存redisTemplate.opsForValue().set(key, list);return Result.success(list);}}

示意圖:

?


啟動項目時遇見的錯誤:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.ArrayList[0]->com.sky.vo.DishVO["updateTime"])


原因:

?????????這個錯誤是因為 Jackson 默認不支持 Java 8 的日期時間類型(如LocalDateTime)序列化導致的。錯誤信息已經提示了解決方案:需要添加jackson-datatype-jsr310模塊來支持 Java 8 日期時間類型的處理。


?解決方法一:

????????在RedisTemplate,設置了鍵和值的序列化方式。從錯誤來看,這個配置中缺少了對 Java 8 日期時間類型(如LocalDateTime)的支持,需要添加JavaTimeModule來解決序列化問題。代碼在下面的“(2)RedisConfiguration完善”有步驟

?解決方法二:

????????取消對值的序列化,只保留對key的序列化,這樣就可以避免日期時間類型(如LocalDateTime)序列化導致的錯誤

在小程序查看菜品是,Redis就會緩存對應的數據:值沒有序列化

(2)RedisConfiguration完善

位置:sky-server/src/main/java/com/sky/config/RedisConfiguration.java

添加的代碼:

??? // 注冊JavaTimeModule以支持LocalDateTime等Java 8日期類型objectMapper.registerModule(new JavaTimeModule());

文件完整代碼:

package com.sky.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info("初始化創建Redis模板對象...");RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 注冊JavaTimeModule以支持LocalDateTime等Java 8日期類型objectMapper.registerModule(new JavaTimeModule());objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 設置key的序列化方式redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 設置hash類型的序列化方式redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

示意圖:

查看Redis數據庫:鍵和值都已經序列化

(3)admin包下DishController

?????????傳入的菜品id,redis存的key是類別id,如果我們想刪除菜品對應分類的緩存數據 需要我們去查詢數據庫 也需多次訪問數據庫 我們的目的是減去數據庫操作壓力,故我們選擇清理所有緩存數據

位置:sky-server/src/main/java/com/sky/controller/admin/DishController.java

新增代碼:

/*** 清除所有Redis緩存* @return*/private void clearRedisCache(String pattern) {Set keys = redisTemplate.keys(pattern);redisTemplate.delete(keys);}

完整代碼:

package com.sky.controller.admin;import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
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.*;import java.util.List;
import java.util.Set;/*** 后臺菜品管理* @author sky*/
@RestController//聲明當前類是一個控制器
@RequestMapping("/admin/dish")//聲明當前類下所有請求的前綴
@Api(tags = "后臺菜品管理")
@Slf4j//聲明當前類使用log4j日志
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisTemplate redisTemplate;/*** 新增菜品* (1)@RequestBody:注解用于將請求體中的json數據綁定到對象中,這里的對象就是DishDTO* 而且前端發送的數據是Json格式,所以需要將請求體中的json數據綁定到DishDTO對象中* (2)使用DishDTO對象來接收前端發送的json數據的原因是:* 1. 方便后續處理,比如校驗數據,保存到數據庫等* 2. 前端發送的json數據可能有多余的字段,這些字段在后續的業務邏輯中可能并不需要,* 所以使用DishDTO對象來接收前端發送的json數據,可以過濾掉多余的字段,提高后續業務邏輯的效率* @param dishDTO* @return*/@PostMapping//聲明當前方法是一個HTTP POST請求@ApiOperation(value = "新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}", dishDTO);dishService.saveWithFlavors(dishDTO);//刪除Redis緩存clearRedisCache("dish_" + dishDTO.getCategoryId());return Result.success();}/*** 分頁查詢菜品* @param dishPageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("分頁查詢菜品")public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO){log.info("分頁查詢菜品:{}", dishPageQueryDTO);PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);return Result.success(pageResult);}/*** 菜品批量刪除*傳入的菜品id,redis存的key是類別id,如果我們想刪除菜品對應分類的緩存數據* 需要我們去查詢數據庫 也需多次訪問數據庫* 我們的目的是減去數據庫操作壓力,故我們選擇清理所有緩存數據* @param ids* @return*/@DeleteMapping@ApiOperation("菜品批量刪除")public Result delete(@RequestParam List<Long> ids) {log.info("菜品批量刪除:{}", ids);dishService.deleteBatch(ids);//刪除所有Redis緩存clearRedisCache("dish_*");return Result.success();}/*** 根據ID查詢菜品詳情* @param id* @return*/@GetMapping("/{id}")@ApiOperation("根據ID查詢菜品詳情")public Result<DishVO> getById(@PathVariable Long id){log.info("查詢菜品:{}", id);DishVO dishVO = dishService.getByIdWithFlavors(id);return Result.success(dishVO);}/*** 更新(修改)菜品* @param dishDTO* @return*/@PutMapping@ApiOperation("更新菜品")public Result update(@RequestBody DishDTO dishDTO){log.info("更新菜品:{}", dishDTO);dishService.updateWithFlavors(dishDTO);
//??????? //刪除所有Redis緩存
//??????? Set keys = redisTemplate.keys("dish_*");
//??????? redisTemplate.delete(keys);//刪除所有Redis緩存clearRedisCache("dish_*");return Result.success();}/*** 根據分類id查詢套餐* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根據分類id查詢套餐")public Result<List<Dish>> list(Long categoryId){log.info("根據分類id查詢套餐:{}", categoryId);List<Dish> list = dishService.list(categoryId);return Result.success(list);}/*** 菜品起售停售* @param status* @param id* @return*/@PostMapping("/status/{status}")@ApiOperation("菜品起售停售")public Result<String> startOrStop(@PathVariable Integer status, Long id){dishService.startOrStop(status,id);//刪除所有Redis緩存clearRedisCache("dish_*");return Result.success();}/*** 清除所有Redis緩存* @return*/private void clearRedisCache(String pattern) {Set keys = redisTemplate.keys(pattern);redisTemplate.delete(keys);}}

示意圖:

(4)測試功能

小程序查詢菜品分類,如“傳統主食”,打開Redis數據庫,查看緩存的數據,key為“dish_12”

打開前端網頁:菜品管理

找到菜品分類為“傳統主食”的“饅頭”,點擊修改,修改價格,保存

回到Redis數據庫,可以發現緩存全沒了,成功!

????????測試“新增菜品”,清理緩存功能,先出小程序,查詢“傳統主食”及任意多個菜品分類,打開Redis數據庫出現“dish_12”,去前端網頁新增菜品,點擊保存,最后查看數據庫“dish_12”是否還存在,沒有則表示成功!

2、緩存套餐

Spring Cache知識點

?????????SpringCache是一個框架,實現了基于注解的緩存功能,只需要簡單地加一個注解,就能實現緩存功能。SpringCache提供了一層抽象,底層可以切換不同的緩存實現,例如:
1、EHCache
2、Caffeine
3、Redis

依賴導入:(源文件已有)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.7.3</version>
</dependency>

?我們的項目使用的是Redis。pom文件導入對應的緩存類型坐標,即可切換不同的緩存實現

如:

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

2-2、代碼完善

?源文件的pom文件已導入Redis和spring cache依賴

(1)user/SetmealController完善

位置:sky-server/src/main/java/com/sky/controller/user/SetmealController.java

新增代碼:

/*** 條件查詢** @param categoryId* @return*/
@Cacheable(cacheNames = "setmealList", key = "#categoryId")
@GetMapping("/list")
@ApiOperation("根據分類id查詢套餐")
public Result<List<Setmeal>> list(Long categoryId) {Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setmealService.list(setmeal);return Result.success(list);
}

完整代碼:

package com.sky.controller.user;import com.sky.constant.StatusConstant;
import com.sky.entity.Setmeal;
import com.sky.result.Result;
import com.sky.service.SetmealService;
import com.sky.vo.DishItemVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController("userSetmealController")
@RequestMapping("/user/setmeal")
@Api(tags = "C端-套餐瀏覽接口")
public class SetmealController {@Autowiredprivate SetmealService setmealService;/*** 條件查詢** @param categoryId* @return*/@Cacheable(cacheNames = "setmealList", key = "#categoryId")@GetMapping("/list")@ApiOperation("根據分類id查詢套餐")public Result<List<Setmeal>> list(Long categoryId) {Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setmealService.list(setmeal);return Result.success(list);}/*** 根據套餐id查詢包含的菜品列表** @param id* @return*/@GetMapping("/dish/{id}")@ApiOperation("根據套餐id查詢包含的菜品列表")public Result<List<DishItemVO>> dishList(@PathVariable("id") Long id) {List<DishItemVO> list = setmealService.getDishItemById(id);return Result.success(list);}
}

示意圖:

注意:爆紅是因為導錯包,選“org.springframework.cache.annotation.Cacheable;”

(2)admin/SetmealController完善

位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java

新增代碼:

@CacheEvict(value = "setmealCache", key = "#setmealDTO.categoryId")//精確匹配key,清理緩存
??? @CacheEvict(value = "setmealCache", allEntries = true)//清理所有緩存

完整代碼:

package com.sky.controller.admin;import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.SetmealService;
import com.sky.vo.SetmealVO;
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.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 套餐管理*/
@RestController
@RequestMapping("/admin/setmeal")
@Api(tags = "套餐相關接口")
@Slf4j
public class SetmealController {@Autowiredprivate SetmealService setmealService;/*** 新增套餐* @param setmealDTO* @return*/@CacheEvict(value = "setmealCache", key = "#setmealDTO.categoryId")//精確匹配key,清理緩存@PostMapping@ApiOperation("新增套餐")//由于SetmealDTO中有List<SetmealDish> setmealDishes = new ArrayList<>();,所以這里需要使用@RequestBody注解//使用SetmealDTOwenden @RequestBody注解,將json數據綁定到SetmealDTO對象中public Result save(@RequestBody SetmealDTO setmealDTO) {log.info("新增套餐:{}", setmealDTO);setmealService.saveWithDish(setmealDTO);return Result.success();}/*** 套餐分頁查詢* @param setmealPageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("分頁查詢")public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO) {PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);return Result.success(pageResult);}/*** 批量刪除套餐* @param ids* @return*/@CacheEvict(value = "setmealCache", allEntries = true)@DeleteMapping@ApiOperation("批量刪除套餐")public Result delete(@RequestParam List<Long> ids) {log.info("批量刪除套餐:{}", ids);setmealService.delete(ids);return Result.success();}/*** 根據id獲取套餐* @param id* @return*/@GetMapping("/{id}")@ApiOperation("根據id獲取套餐")public Result<SetmealVO> getById(@PathVariable("id") Long id){log.info("根據id獲取套餐:{}", id);SetmealVO setmealVO = setmealService.getById(id);return Result.success(setmealVO);}/*** 更新套餐1* @param setmealDTO* @return*/@CacheEvict(value = "setmealCache", allEntries = true)@PutMapping@ApiOperation("更新套餐")public Result Update(@RequestBody SetmealDTO setmealDTO) {log.info("更新套餐:{}", setmealDTO);setmealService.update(setmealDTO);return Result.success();}/*** 套餐起售停售* @param status* @param id* @return*/@CacheEvict(value = "setmealCache", allEntries = true)@PostMapping("/status/{status}")@ApiOperation("套餐起售停售")public Result startOrStop(@PathVariable Integer status, Long id) {setmealService.startOrStop(status, id);return Result.success();}}

(3)功能測試

1、全部清理

打開小程序,任意點擊多個菜品分類,查看Redis數據庫,打開前端網頁,修改菜品信息,保存,查看數據庫,若菜品數據全清空,則表示功能完成!

2、精確清除緩存(新增菜品)

與前面一樣的操作,只刪除對應的dish_?,如dish_12,即算完成!

至此,緩存菜品和緩存套餐功能已完成!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98526.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機畢業設計 基于Python+Django的醫療數據分析系統

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…

使用 chromedp 高效爬取 Bing 搜索結果

在數據采集領域&#xff0c;搜索引擎結果是重要的信息來源。但傳統爬蟲面對現代瀏覽器渲染的頁面時&#xff0c;常因 JavaScript 動態加載、跳轉鏈接加密等問題束手無策。本文將詳細介紹如何使用 Go 語言的chromedp庫&#xff0c;模擬真實瀏覽器行為爬取 Bing 搜索結果&#xf…

遺漏的需求

“編寫執行者的目的&#xff0c;僅用別名來表達需要傳遞的數據”&#xff0c;就如客戶信息用名字和地址表示一樣&#xff0c;這是一個很好的建議。然而&#xff0c;對程序員來說&#xff0c;這沒有提供軟件開發所必需的詳細信息。程序設計人員和用戶界面設計者需要準確地知道地…

《云原生故障診療指南:從假活到配置漂移的根治方案》

當云原生架構成為企業數字化轉型的標配,系統故障的形態也隨之發生了根本性變化。曾經那些“一目了然”的報錯信息逐漸消失,取而代之的是“指標正常卻服務不可用”“偶發故障無規律可循”等隱性問題。這些故障如同架構中的“暗物質”,看不見卻持續影響著系統的穩定性,其排查…

“從零到一:使用GitLab和Jenkins實現自動化CI/CD流水線”

GitLab倉庫 簡單的來說就是開發人員提交代碼的倉庫&#xff0c;用于團隊開發&#xff0c;GitLab 上托管的倉庫通常作為遠程倉庫使用&#xff0c;開發人員可以將本地的 Git 倉庫推送到 GitLab 上&#xff0c;也可以從 GitLab 克隆倉庫到本地進行開發。 Jenkins Jenkins 是一個開…

3D開發工具HOOPS助力造船業數字化轉型,打造更高效、更智能的船舶設計與協作!

造船業是一個高度復雜且競爭激烈的行業&#xff0c;涵蓋船體設計、結構分析、生產制造到運維管理的完整生命周期。面對龐大的CAD數據、多方協作的復雜流程以及數字化轉型的迫切需求&#xff0c;傳統工具往往顯得力不從心。 Tech Soft 3D的HOOPS SDK系列&#xff0c;正以其卓越…

Python調用MCP:無需重構,快速為現有應用注入AI與外部服務能力!

文章目錄 ?? 介紹 ?? ?? 演示環境 ?? ? MCP核心概念:AI世界的“USB-C” ? ??? MCP安裝與基礎使用 ??? ?? 安裝模塊 ?? 創建第一個MCP服務端 ?? Python中MCP客戶端的調用方案 ?? ?? 概述 ?? 深度解析 ?? 參數詳情 ?? 常用方法 ?? 不同傳輸協…

【鏈表】3.重排鏈表(medium)

重排鏈表&#xff08;medium&#xff09;題?描述&#xff1a;解法&#xff1a;算法思路&#xff1a;算法代碼&#xff1a;題?鏈接&#xff1a;143. 重排鏈表 題?描述&#xff1a; 給定?個單鏈表 L 的頭節點 head &#xff0c;單鏈表 L 表?為&#xff1a; L(0) → L(1) →…

蜜罐平臺-Hfish部署

Hfish簡介&#xff1a; HFish是一款社區型免費蜜罐&#xff0c;側重企業安全場景&#xff0c;從內網失陷檢測、外網威脅感知、威脅情報生產三個場景出發&#xff0c;為用戶提供可獨立操作且實用的功能&#xff0c;通過安全、敏捷、可靠的中低交互蜜罐增加用戶在失陷感知和威脅…

docker-容器

安裝docker yum install -y docker查看版本 docker version安裝docker-compose yum install -y docker-compose查看版本 docker-compose --version基礎鏡像構建 tar --exclude/var/lib -cvf euler.tar /etc /boot /var /tmp /usr /mnt /bin /sbin /lib /lib64將JDK等需要的中間…

ESP32開發:ubuntu22.04 下esp-idf開發環境搭建

ubuntu22.04 下 esp-idf 開發環境搭建1.安裝編譯 ESP-IDF 需要以下軟件包2.獲取 ESP-IDF3.設置工具下載工具備選方案4.設置環境變量5.編譯工程并燒錄配置工程編譯工程燒錄固件到設備6.其他指令監視輸出擦除 flash清除編譯1.安裝編譯 ESP-IDF 需要以下軟件包 編譯 ESP-IDF 需要…

匯編基礎2

1.函數調用fun0mov r4, #100bx lrget_MaxNumcmp r0, r1stmfd sp!, {r0-r12, lr} //入棧bl fun0 //調用fun0函數ldmfd sp!, {r0-r12, lr} //出棧movge r3, r0movlt r3, r1bx lr mainldr sp, 0x40001000mov r0, #100mov r1, #200mov r2, #100stmfd sp!,…

20250909的學習筆記

HTML 基礎筆記1. HTML 基本格式<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>中文測試</title> </head> <body>這里是測試body測試內容。 </body> </html>2. HTML 標簽常用標簽 - <h1…

Linux 安全加固;Windows 安全設置

一、Linux 安全加固1. 賬戶與權限管理最小權限原則禁用 root 遠程登錄&#xff1a;修改 /etc/ssh/sshd_config&#xff0c;設置 PermitRootLogin no。使用 sudo 替代直接 root 操作&#xff0c;并通過 /etc/sudoers 限制命令范圍&#xff08;如僅允許 apt 和 systemctl&#xf…

條碼打印檢測一體機是什么?

在工業4.0和智能制造的大背景下&#xff0c;數據的準確性和實時性是構建高效追溯系統。條碼/二維碼作為物理世界與數字世界連接的橋梁&#xff0c;其打印質量直接決定了數據鏈路的可靠性。傳統“打印-人工抽檢/離線全檢”的模式存在流程割裂、效率低下、無法100%覆蓋的弊端&…

Javaweb - 14.6 - Vue3 數據交互 Axios

目錄 Promise 普通函數和回調函數 Promise 簡介 Promise 基本用法 async 和 await 的使用 Axios 介紹 Axios 入門案例 Axios 的 get 和 post 方法 Axios 攔截器 完&#xff01; Promise 普通函數和回調函數 普通函數&#xff1a;正常調用的函數&#xff0c;一般函數…

怎么選適合企業的RPA財務機器人?

對于大多數財務人來說&#xff0c;“月初月末就是噩夢”已經成了常態&#xff1a;一邊要面對堆積如山的單據和報表&#xff0c;一邊還要應付領導不斷加碼的工作&#xff0c;常常忙到深夜&#xff0c;卻總覺得自己陷在重復事務中難有成長。其實&#xff0c;這并不是個體問題&…

html css js網頁制作成品——HTML+CSS無窮網頁設計(5頁)附源碼

目錄 一、?????網站題目 二、??網站描述 三、??網站介紹 四、??網站效果 五、?? 代碼實現 ??HTML

AUTOSAR進階圖解==>AUTOSAR_SWS_PDURouter

AUTOSAR PDU Router詳解文檔 AUTOSAR通信架構中的核心路由模塊目錄 1. 概述2. PDU Router模塊架構3. PDU Router配置模型4. PDU Router路由流程5. PDU Router狀態機6. 總結 1. 概述 PDU Router模塊是AUTOSAR通信架構中的核心組件&#xff0c;負責在AUTOSAR軟件組件之間路由I-…

RHEL7.9、RHEL9.3——源碼安裝MySQL

目錄 一、環境部署 1. 克隆rhel7.9虛擬機 二、源碼安裝MySQL 1. 準備工作 2. 源碼部署mysql8.0.40 1&#xff09;安裝編譯mysql所需軟件包 2&#xff09;編譯安裝mysql8.0.40 3&#xff09;生成啟動腳本 一、環境部署 1. 克隆rhel7.9虛擬機 改名為 “RHEL79_mysql_master” 并…