24小時留言板


title: 24小時留言板
date: 2025-06-25 23:32:53
tags: 代碼工具

24小時留言板

核心效果如圖所示

在這里插入圖片描述

代碼解析

# TodoController 代碼解析## 整體架構
這是一個基于Spring WebFlux的響應式控制器,結合Redis發布\訂閱機制實現實時更新的待辦事項系統。關鍵組件包括:
- **TodoRepo**:數據訪問層接口
- **ReactiveRedisTemplate**:Redis響應式操作模板
- **ChannelTopic**:Redis消息通道
- **Sinks.Many**:Project Reactor的事件分發器## 核心功能解析### 1. Redis發布\訂閱初始化
```java
public TodoController(TodoRepo repo, ReactiveRedisTemplate<String, String> redisTemplate) {this.repo = repo;this.redisTemplate = redisTemplate;redisTemplate.listenTo(todoTopic).map(msg -> msg.getMessage()).filter(message -> !StringUtils.isEmpty(message)).subscribe(eventSink::tryEmitNext);
}
  • 功能:控制器啟動時自動訂閱Redis頻道
  • 處理流程
    1. 監聽todo_events頻道
    2. 提取消息內容
    3. 過濾空消息
    4. 將消息推送到事件流(Sinks)

2. 事件廣播機制

private void broadcastEvent(String eventType, Todo todo) {String messageId = "global_" + todo.getId() + "_" + System.currentTimeMillis();String payload = "";\\ 事件類型處理switch (eventType) {case "create":case "update":payload = String.format("id:%s\nevent:%s\ndata:%s\n\n",messageId, eventType, renderItem(todo));break;case "delete":payload = String.format("id:%s\nevent:delete\ndata:%d\n\n",messageId, todo.getId());break;}\\ Redis發布if (StringUtils.hasLength(payload)) {redisTemplate.convertAndSend(todoTopic.getTopic(), payload).subscribe();}
}
  • 事件格式:符合SSE規范,包含:
    • id:全局唯一事件ID(含時間戳)
    • event:事件類型(create\update\delete)
    • data:有效載荷
  • 安全設計:廣播前檢查消息有效性

3. SSE數據流接口

@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> list() {Flux<String> initialFlux = repo.findAllByOrderByIdDesc().map(todo -> String.format("id:init_%d\nevent:create\ndata:%s\n\n",todo.getId(), renderItem(todo)));return Flux.merge(initialFlux, eventSink.asFlux()).filter(payload -> !StringUtils.isEmpty(payload));
}
  • 實現策略
    1. 加載初始數據并轉換為SSE格式(init前綴)
    2. 合并實時事件流(Redis訂閱)
    3. 過濾空消息
  • SSE規范
    • id: [event_id]
    • event: [event_type]
    • data: [payload]
    • 消息以雙換行結束

4. CRUD操作實現

創建待辦事項
@PostMapping
public Mono<String> create(@ModelAttribute Form form) {return repo.save(new Todo(null, HtmlUtils.htmlEscape(form.getContent()))).doOnSuccess(todo -> broadcastEvent("create", todo)).thenReturn("");
}
  • 安全特性:HTML內容轉義防御XSS
  • 響應策略:空字符串實現PRG(Post-Redirect-Get)模式
刪除待辦事項
@PostMapping(path = "\{id}\delete", produces = MediaType.TEXT_HTML_VALUE)
public Mono<String> delete(@PathVariable Long id) {return repo.findById(id).doOnSuccess(todo -> broadcastEvent("delete", todo)).then(repo.deleteById(id)).thenReturn("");
}
  • 關鍵流程
    1. 先查詢再刪除(確保廣播正確的todo數據)
    2. 廣播刪除事件
    3. 執行刪除操作

5. 視圖渲染引擎

查看模式渲染
private String renderItem(Todo t) {return """<li id="todo-%d" class="message-item"><div class="message-content">%s<div class="message-extra"><div class="message-time"><i class="far fa-clock"><\i> %s<\div><\div><\div><div class="message-actions"><button class="delete-btn" onclick="handleDelete(%d)"><i class="fas fa-trash-alt"><\i><\button><\div><\li>""";
}
  • 元素結構
    • 唯一ID綁定:todo-{id}
    • 內容顯示區
    • 時間戳(當前服務器時間)
    • 刪除按鈕(綁定JavaScript操作)
編輯模式渲染(未使用)
private String renderItemEditing(Todo t) {\\ 包含表單和按鈕
}
  • 潛在擴展點:提供編輯功能時可復用

6. 安全機制

\\ 輸入轉義
HtmlUtils.htmlEscape(form.getContent())\\ 輸出轉義
private String escapeHtml(String s) {return HtmlUtils.htmlEscape(s);
}
  • 雙保險策略:輸入輸出雙重轉義防御XSS攻擊
  • 規范實踐:使用Spring內置HtmlUtils工具類

設計亮點

  1. 響應式架構

    • Flux\Mono異步處理
    • 背壓支持(onBackpressureBuffer)
  2. 實時廣播系統

    • Redis發布\訂閱
    • 多級事件分發(Sinks->Flux)
  3. 客戶端驅動更新

    • HTML片段直接注入頁面
    • 無JavaScript框架依賴
  4. 優雅降級策略

    • 事件ID前綴區分初始化\實時事件
    • 空消息過濾保證穩定性
  5. 擴展性設計

    • 事件類型支持(create\update\delete)
    • 預留編輯模式渲染器

優化建議

  1. 時間戳改進

    \\ 當前使用服務器當前時間
    LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))\\ 建議:使用Todo創建時間
    t.getCreatedAt().format(DateTimeFormatter.ofPattern("HH:mm:ss"))
    
  2. 事件完整性保證

    \\ 增加錯誤處理
    .doOnError(e -> log.error("Event broadcast failed", e))
    
  3. 集群支持增強

    \\ 當前事件ID格式
    "global_" + todo.getId() + "_" + System.currentTimeMillis()\\ 建議增加實例標識
    "node1_" + todo.getId() + "_" + System.currentTimeMillis()
    
  4. 編輯功能集成
    可啟用預留的renderItemEditing方法實現編輯功能

  5. 自動清理機制
    增加定時任務清理24小時前的待辦事項

該系統實現了基于響應式編程和Redis發布\訂閱的高效實時應用,兼顧了性能和安全,代碼結構清晰且擴展性強,是實時應用開發的優秀范例。

## GITHUb倉庫
https:\\github.com\qingyun201908\HTMXANDSpringWebflux

在這里插入圖片描述

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

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

相關文章

深入理解Redis整數集合(intset)的升級策略:內存優化的核心魔法

引言 作為Redis中最節省內存的數據結構之一&#xff0c;整數集合&#xff08;intset&#xff09; 專門用于高效存儲整型數據。但你可能不知道&#xff0c;它背后藏著一個精妙的「動態升級」機制——能在不浪費內存的前提下&#xff0c;靈活適配不同大小的整數。今天我們就來扒…

高性能計算(HPC)集群和工作流:intel-oneapi-hpc-toolkit安裝與使用

成功安裝了 Intel oneAPI HPC Toolkit&#xff01;這個工具包包含了很多強大的工具&#xff0c;可以幫助你優化和加速高性能計算&#xff08;HPC&#xff09;任務&#xff0c;特別是在使用 Intel 的硬件&#xff08;如 Xeon 處理器和 GPU&#xff09;時。 接下來&#xff0c;…

QT vscode cmake 編譯 undefined reference to `vtable for 問題解決

編譯時出現undefined reference to vtable for 問題&#xff0c;是沒有添加頭文件到目標&#xff0c;添加即可&#xff1a; 如果使用的是qt5, 沒有qt_add_executable, 使用qt 5的 自動處理即可&#xff1a; # 啟用 Qt 自動處理功能 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC …

linux內核奔潰轉儲之kexec、kdump

一、kexec是什么&#xff1f; kexec 是 Linux 內核提供的一種關鍵技術&#xff0c;允許系統?在不經過完整硬件重啟&#xff08;BIOS/UEFI 初始化&#xff09;的情況下&#xff0c;直接從當前正在運行的內核加載并啟動另一個新內核?。以下是其核心要點&#xff1a; ?定義與核…

標題:2025金融護網行動實戰指南:從合規防御到智能免疫的體系化進階

引言 2025年&#xff0c;隨著《中國人民銀行業務領域網絡安全事件報告管理辦法》正式實施&#xff0c;金融護網行動已從“合規檢查”升級為“能力對抗”。面對AI驅動的自適應攻擊、勒索病毒與黑灰產協同威脅&#xff0c;金融機構需構建“技術-管理-人才”三位一體的智能防御體…

NEO4j的安裝部署

windows neo4j新版本安裝需要部署jdk17&#xff0c;下面這個版本是jdk8最新的支持版本 neo4j-community-3.5.9-windows.zipIndex of /doc/neo4j/3.5.9/ 啟動 dos面板中啟動 neo4j.bat console linux neo4j新版本安裝需要部署jdk17&#xff0c;下面這個版本是jdk8最新的支…

八股文——JAVA基礎:說一下C++與java的區別

首先&#xff0c;c與java都是面向對象編程&#xff0c;都包含封裝、繼承、多態的特性。但是c多繼承&#xff0c;而java只能單繼承與多實現。 其次&#xff0c;java無法直接訪問內存&#xff0c;java通過引用對向&#xff0c;比如new一個對象&#xff0c;拿到的對象實例實際上是…

Vue3 Composition API 深度解析:告別Options API的局限性

目錄 一、為什么需要Composition API&#xff1f; 二、核心概念&#xff1a;setup() 函數 三、響應式核心&#xff1a;ref() 和 reactive() 1. ref - 處理基本類型/對象 2. reactive - 處理對象 四、生命周期鉤子新寫法 五、強大的邏輯復用&#xff1a;組合式函數 六、響…

IoT/HCIP實驗-5/基于NB-IoT的智慧農業實驗(平臺側開發+端側編碼+基礎調試分析)

文章目錄 概述擴展板 E53_IA1智慧農業平臺測開發功能定義/模型開發編解碼插件開發-消息編解碼插件開發-關聯編解碼插件開發-部署注冊實際設備 智慧農業端側編碼工程配置數據結構定義數據收集任務數據上報任務設備接入過程正確設置接入參數命令響應任務 程序調試其他 概述 本實…

多網絡環境vmware虛擬機配置

環境&#xff1a;一臺臺式機、一臺筆記本、筆記本中安裝虛擬機。臺式機及筆記本都使用wifi連接。 實現效果&#xff1a;虛擬機采用固定ip方式&#xff0c;臺式機可以直接連接虛擬機。 1、VMware環境配置 臺式機ip&#xff1a;192.168.31.43 筆記本ip&#xff1a;192.168.31.…

ZArchiver×亞矩云手機:云端文件管理的“超維解壓”革命

在數字化辦公與移動應用生態中&#xff0c;文件壓縮與解壓是高頻剛需場景&#xff0c;但傳統本地工具受限于設備性能、存儲空間及跨平臺協作痛點。ZArchiver&#xff08;輕量級壓縮工具&#xff09;與亞矩云手機的結合&#xff0c;通過“云端算力虛擬化環境”的創新模式&#x…

微幀WZVQA:極致還原人眼感知,精準評估視頻畫質

隨著移動互聯網的不斷發展以及智能手機的普及&#xff0c;短視頻已逐步取代圖片和文字&#xff0c;躋身主流媒體形式的前列。短視頻平臺的興起&#xff0c;讓數十億用戶可以制作&#xff0c;分享并接收彼此的信息&#xff0c;為人們開辟了一條全新的知識獲取途徑。然而&#xf…

信創 CDC 實戰|國產數據庫的數據高速通道:OceanBase 實時入倉 StarRocks

國產數據庫加速進入核心系統&#xff0c;傳統同步工具卻頻頻“掉鏈子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、達夢等主流信創數據庫&#xff0c;逐一拆解其日志機制與同步難點&#xff0c;結合 TapData 的實踐經驗&#xff0c;系統講解從 CDC 捕獲到實時入倉&#xff0…

Unity 通過AVProMovieCapture插件實現攝像機錄屏

1.AVProMovieCapture插件下載 沒什么好說的&#xff0c;搞到安裝包之后&#xff0c;直接往項目中拉就行。 2.操作面板配置 &#xff08;1&#xff09;在Hierarchy創建一個空物體&#xff0c;上面添加Capture From Camera和Camera Selector兩個插件 &#xff08;2&#xff09…

深度學習:PyTorch卷積神經網絡分享(1)

本文目錄&#xff1a; 一、CNN概述二、CNN日常應用三、CNN的卷積層&#xff08;一 &#xff09;基本介紹&#xff08;二&#xff09;卷積層計算1.對輸入數據的要求2.卷積核核心參數3.計算過程4.特征圖尺寸計算5.1、多通道卷積計算5.2、多卷積核計算6.PyTorch卷積層API 前言&…

Cesium添加3dtiles并平移到指定經緯度

訪問tileset.json,查看root.transform,12,13,14分別代表模型參考原點的地心坐標Cartesian3(x,y,z) let tileset await Cesium.Cesium3DTileset.fromUrl()構造origin_cartesian3new Cesium.Cartesian3(x,y,z) 設置待平移到的位置經緯高為longitude,latitude,height,例如(116,…

STM32G070x 單片機項目代碼解析:基于 HAL 庫的嵌入式系統開發

項目總體架構 該項目采用標準的 STM32 工程結構&#xff0c;主要包含以下幾個部分&#xff1a; 頭文件包含&#xff1a;系統頭文件和用戶自定義頭文件外設句柄定義&#xff1a;SPI、TIM、UART 等外設的句柄聲明用戶自定義變量&#xff1a;LED 控制、按鍵狀態等標志位初始化函數…

winform mvvm

if (!mvvmContext1.IsDesignMode) InitializeBindings(); 這段代碼的意思是&#xff1a;如果當前應用程序不是處于設計模式&#xff08;即程序正在運行&#xff09;&#xff0c;就調用InitializeBindings方法來初始化視圖與視圖模型之間的綁定。 void Initiali…

防火墻快速管理軟件,66K超小巧

軟件介紹 今天為大家推薦一款輕量級的Windows防火墻管理工具&#xff0c;這款工具能幫助用戶快速開啟或關閉系統防火墻功能&#xff0c;操作比系統原生設置更加便捷高效。 軟件優勢 相比通過系統設置層層點擊的操作方式&#xff0c;這款僅66KB大小的微型工具只需單擊按鈕…

python中的高級變量III

python中的高級變量III 刪除列表元素&#xff08;list&#xff09;擴展知識點 name_list ["Mike","John","Alice"] del name_list[1] # 通過del name_list[1]刪除“John” print(name_list) # 輸出 [Mike, Alice]注意&#xff1a;del …