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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 …