Websocket实时更新商品信息

产品展示页面中第一次通过接口去获取数据库的列表数据

/// <summary>
/// 获取指定的商品目录
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="ids"></param>
/// <returns></returns>
[HttpGet]
[Route("items")]
[ProducesResponseType(typeof(PaginatedViewModel<Catalog>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(IEnumerable<ProductDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> Catalogs([FromQuery] int pageSize = 10, [FromQuery] int pageIndex = 0, string ids = null)
{
    if (!string.IsNullOrEmpty(ids))
    {
        var items = await GetItemByIds(ids);
        if (!items.Any())
        {
            return BadRequest("ids value invalid. Must be comma-separated list of numbers");
        }

        return Ok(items);
    }

    var totalItems = await _catalogContext.Catalogs
        .LongCountAsync();

    var itemsOnPage = await _catalogContext.Catalogs
        .OrderBy(c => c.Name)
        .Skip(pageSize * pageIndex)
        .Take(pageSize)
        .ToListAsync();
    var result = itemsOnPage.Select(x => new ProductDto(x.Id.ToString(), x.Name, x.Price.ToString(), x.Stock.ToString(), x.ImgPath));
    var model = new PaginatedViewModel<ProductDto>(pageIndex, pageSize, totalItems, result);
    return Ok(model);

}

2.在前端页面会把当前页面的产品列表id都发送到websocket中去

function updateAndSendProductIds(ids) {productIds = ids;// Check if the WebSocket is openif (socket.readyState === WebSocket.OPEN) {// Send the list of product IDs through the WebSocket connectionsocket.send(JSON.stringify(productIds));}
}function fetchData() {const apiUrl = baseUrl + `/Catalog/items?pageSize=${pageSize}&pageIndex=${currentPage}`;axios.get(apiUrl).then(response => {const data = response.data.data;displayProducts(baseUrl, data);const newProductIds = data.map(product => product.Id);// Check if the WebSocket is openupdateAndSendProductIds(newProductIds);// 从响应中获取总页数const totalPages = Math.ceil(response.data.count / pageSize);displayPagination(totalPages);// 更新当前页数的显示const currentPageElement = document.getElementById('currentPage');currentPageElement.textContent = `当前页数: ${currentPage + 1} / 总页数: ${totalPages}`;}).catch(error => {console.error('获取数据失败:', error);});
}
using System.Net.WebSockets;
using System.Threading.Tasks;
using System;
using WsServer.Handler;
using WsServer.Manager;
using StackExchange.Redis;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
using Catalogs.Domain.Catalogs;
using Catalogs.Domain.Dtos;
using System.Net.Sockets;namespace WebScoket.Server.Services
{/// <summary>/// 实时推送产品主要是最新的库存,其他信息也会更新/// </summary>public class ProductListHandler : WebSocketHandler{private System.Threading.Timer _timer;private readonly IDatabase _redisDb;//展示列表推送private string productIdsStr;public ProductListHandler(WebSocketConnectionManager webSocketConnectionManager,IConfiguration configuration) : base(webSocketConnectionManager){ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(configuration["DistributedRedis:ConnectionString"] ?? throw new Exception("$未能获取distributedredis连接字符串"));_redisDb = redis.GetDatabase();_timer = new System.Threading.Timer(Send, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));}private void Send(object state){// 获取当前时间并发送给所有连接的客户端if (productIdsStr != null){string[] productIds = System.Text.Json.JsonSerializer.Deserialize<string[]>(productIdsStr);string hashKeyToRetrieve = "products";List<ProductDto> products = new List<ProductDto>();foreach (var productId in productIds){if(productId == "null") {continue;}string retrievedProductValue = _redisDb.HashGet(hashKeyToRetrieve, productId);if (!string.IsNullOrEmpty(retrievedProductValue)){//反序列化和构造函数冲突,改造了一下CatalogCatalog catalog = System.Text.Json.JsonSerializer.Deserialize<Catalog>(retrievedProductValue);products.Add(new ProductDto(catalog.Id.ToString(), catalog.Name, catalog.Price.ToString(), catalog.Stock.ToString(), catalog.ImgPath));}}if (products.Count > 0){SendMessageToAllAsync(System.Text.Json.JsonSerializer.Serialize(products)).Wait();}else{SendMessageToAllAsync("NoProduct").Wait();}}}public override async Task ReceiveAsync(WebSocket socket, WebSocketReceiveResult result, byte[] buffer){//每次页面有刷新就会拿到展示的id列表productIdsStr = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);}}
}

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

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

相关文章

windows服务器相关操作

windows服务器相关操作 向windows服务器传输文件 参考&#xff1a; 本机向windows服务器传输文件的三种方法 windows杀死端口进程 关于windows杀死某个端口号进程的方法 window后台启动、关闭springboot项目 参考&#xff1a; win环境后台启动、关闭springBoot的jar包配置…

阿里云2核2G3M配置的云服务器可以搭建几个网站?

阿里云2核2G3M配置的云服务器可以搭建几个网站&#xff1f;对于这个问题&#xff0c;没有一个具体的答案&#xff0c;因为这取决于您的网站的流量和复杂程度。在一般情况下&#xff0c;这个配置可以支持搭建几个中小型网站。若您的网站需要大量的资源或处理高并发请求&#xff…

java验证手机号

java验证手机号 public static boolean verifyPhonenumber(String visitedPhonenumber) {String regex "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";return verifyByStr(visitedPhonenumber, regex);}

卸载Oracle23c free版本的数据库及软件

在上一篇的文章中&#xff0c;测试验证了如何安装Oracle23c free版本的数据库。总体上来说还是比较简单的。把相关的依赖包安装好&#xff0c;rpm -ivh执行安装即可。 在这一篇文章中将验证测试如何卸载。Oracle的文档介绍就是强大&#xff0c;我们找到文档内容&#xff0c;按…

机器学习股票崩盘预测模型(企业建模_论文科研)AI model for stock crash prediction

对齐颗粒度&#xff0c;打通股票崩盘底层逻辑&#xff0c;形成一套组合拳&#xff0c;形成信用评级机制良性生态圈&#xff0c;重振股市信心&#xff01;--中国股市新展望&#xff01;By Toby&#xff01;2024.1.3 综合介绍 股票崩盘&#xff0c;是指证券市场上由于某种原因&a…

Eureka工作原理详解

摘要&#xff1a;本文将详细介绍Eureka的工作原理&#xff0c;包括服务注册、服务发现、心跳检测等关键概念。通过阅读本文&#xff0c;您将了解到Eureka如何实现高可用、可扩展的服务注册中心。 一、引言 在微服务架构中&#xff0c;服务注册与发现是一个重要的环节。为了实…

ctfshow——PHP特性

文章目录 web 89web 90web 91web 92web 93web 94web 95web 96web 97web 98web 99web 100——优先级、eval()用法web 101——RefelctionClass反射类web 102——php伪协议、hex2bin()web103web 104——sha1绕过web 105 web 89 使用人工分配 ID 键的数值型数组绕过preg_match. 两个…

Vue2 实现内容拖拽或添加 HTML 到 Tinymce 富文本编辑器的高级功能详解

在 Web 开发中&#xff0c;Tinymce 被广泛应用作为富文本编辑器。除了基础的文本编辑功能&#xff0c;Tinymce 还提供了一系列高级功能&#xff0c;使得文本编辑更加灵活和便捷。本文将介绍如何在 Tinymce 中实现一些高级功能&#xff0c;并深入了解每个工具的使用。 Tinymce …

Python中的eval和exec函数:深度解析两者的区别与使用场景

概要 Python中的eval和exec函数&#xff0c;它们都是非常强大的工具&#xff0c;用于动态执行代码。然而&#xff0c;它们在用途、用法和安全性方面存在显著的区别。在本文中&#xff0c;将深入探讨eval和exec函数的区别、用法以及示例代码&#xff0c;以帮助大家更好地理解和…

用单片机设计PLC电路图

自记&#xff1a; 以下为PMOS推挽输出及集成块光耦&#xff1a;

MediaPipeUnityPlugin Win10环境搭建(22年3月的记录,新版本已完全不同,这里只做记录)

https://github.com/homuler/MediaPipeUnityPlugin You cannot build libraries for Android with the following steps. 1、安装msys2配置系统环境变量Path添加 C:\msys64\usr\bin 执行 pacman -Su 执行 pacman -S git patch unzip 2、安装Python3.9.10 勾选系统环境变量 …

【性能测试入门】详解客户端性能测试和服务器端性能测试!

一&#xff1a;客户端性能测试和服务器端性能测试 客户端性能测试和服务器端性能测试是两个不同但相关的概念: 客户端性能测试: - 测试应用程序客户端(如Web浏览器、移动应用等)的性能,例如加载时间,响应时间等。 - 测试在不同系统配置(CPU、内存、网络等)下客户端的运行性…

QT自定义信号和槽

信号和槽 介绍实现创建文件对teacher的h和cpp文件进行处理对student的h和cpp文件进行处理对widget的h和cpp文件进行处理 介绍 Qt中的信号和槽是一种强大的机制&#xff0c;用于处理对象之间的通信。它们是Qt框架中实现事件驱动编程的核心部分。 信号&#xff08;Signal&#x…

SpringCloud微服务架构,适合接私(附源码)

一个由商业级项目升级优化而来的微服务架构&#xff0c;采用SpringBoot 2.7 、SpringCloud 等核心技术构建&#xff0c;提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。 架构图 项目介绍 用户权益 仅允许免费用于学习、毕设、公司项目、私活等。…

帮你了解广告行业是如何发展的(移动端为主),通俗易懂!!

一、背景 移动互联网发展&#xff0c;各移动设备普及 一方面&#xff0c;受欢迎的高uv、pv APP不断增多。 另一方面&#xff0c;广告主在传统媒体上拓展缓慢&#xff0c;需要产品推广途径以及发掘潜在用户。出现问题 众多APP无法变现 广告主需要更好的推广渠道 广告主直接和AP…

正则表达式RE

目录 正则表达式RE 正则表达式基本元字符 正则表达式拓展元字符 正则表达式RE 正则表达式基本元字符 正则表达式拓展元字符 用来处理文本 正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜…

[每周一更]-(第81期):PS抠图流程(扭扭曲曲的身份证修正)

应朋友之急&#xff0c;整理下思路&#xff0c;分享一下~~ 分两步走&#xff1a;先用磁性套索工具圈出要处理的图&#xff1b;然后使用透视剪裁工具&#xff0c;将扭曲的图片拉平即可&#xff1b;(macbook pro) 做事有规则&#xff0c;才能更高效;用什么工具&#xff0c;先列举…

从Eumetsat批量下载哨兵数据等各种数据

从Eumetsat批量下载哨兵数据等各种数据 那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程&#xff0c;他们只是觉得这是一件有趣的事情&#xff01; 批量下载Sentinel数据脚本2023 从Eumetsat批量下载哨兵数据等各种数据&#x1f33f;前言&#x1f340;脚本构成…

QQ邮件发送(PHP的Laravel)

1. 开启 QQ 邮箱的 SMTP 支持 2.里面会一个类似于密码之类&#xff08;复制一下&#xff09; 3.然后再 .env文件里面配置一下 MAIL_DRIVERsmtp —— 使用支持 ESMTP 的 SMTP 服务器发送邮件&#xff1b; MAIL_HOSTsmtp.qq.com —— QQ 邮箱的 SMTP 服务器地址&#xff0c;必…

SpringSecurity深度学习

SpringSecurity简介 spring Security是什么&#xff1f; Spring Security 是一个强大且高度可定制的身份验证和访问控制框架&#xff0c;用于保护基于Spring的应用程序。它是Spring项目的一部分&#xff0c;旨在为企业级系统提供全面的安全性解决方案。 一个简单的授权和校验…