当前位置: 首页 > news >正文

Vue3+Setup使用websocket

创建src/util/socket.ts

let websock: any = null;
let global_callback: any = null;
const serverPort = "8080"; // webSocket连接端口
const wsuri = "ws://" + window.location.hostname + ":" + serverPort + "/wsdemo";
function createWebSocket(callback: any) {// eslint-disable-next-line @typescript-eslint/ban-ts-comment// @ts-ignoreif (websock == null || typeof websock !== WebSocket) {initWebSocket(callback);}
}
function initWebSocket(callback: any) {global_callback = callback;// 初始化websocketwebsock = new WebSocket(wsuri);websock.onmessage = function (e: any) {websocketonmessage(e);};websock.onclose = function (e: any) {websocketclose(e);};websock.onopen = function () {// eslint-disable-next-line @typescript-eslint/ban-ts-comment// @ts-ignorewebsocketOpen();};// 连接发生错误的回调方法websock.onerror = function () {console.log("WebSocket连接发生错误");//createWebSocket();啊,发现这样写会创建多个连接,加延时也不行};
}
// 实际调用的方法
function sendSock(agentData: any) {if (websock.readyState === websock.OPEN) {// 若是ws开启状态websocketsend(agentData);} else if (websock.readyState === websock.CONNECTING) {// 若是 正在开启状态,则等待1s后重新调用setTimeout(function () {sendSock(agentData);}, 1000);} else {// 若未开启 ,则等待1s后重新调用setTimeout(function () {sendSock(agentData);}, 1000);}
}
function closeSock() {websock.close();
}
// 数据接收
function websocketonmessage(msg: any) {// console.log("收到数据:"+JSON.parse(e.data));// console.log("收到数据:"+msg);// global_callback(JSON.parse(msg.data));// 收到信息为Blob类型时let result: any = null;// debuggerif (msg.data instanceof Blob) {const reader = new FileReader();reader.readAsText(msg.data, "UTF-8");reader.onload = (e: any) => {console.log(e);if (typeof reader.result === "string") {result = JSON.parse(reader.result);}//console.log("websocket收到", result);global_callback(result);};} else {result = JSON.parse(msg.data);//console.log("websocket收到", result);global_callback(result);}
}
// 数据发送
function websocketsend(agentData: any) {console.log("发送数据:" + agentData);websock.send(agentData);
}
// 关闭
function websocketclose(e: any) {console.log("connection closed (" + e.code + ")");
}
function websocketOpen(e: any) {console.log(e);console.log("连接打开");
}
export { sendSock, createWebSocket, closeSock };

创建src/store/webSocket.ts

import { defineStore } from "pinia";export const webSocketStore = defineStore("webSocket", {state: () => ({//推送消息data: [],}),getters: {},actions: {addMsg(val: any) {// eslint-disable-next-line @typescript-eslint/ban-ts-comment// @ts-ignorethis.data.push(val);},},
});

创建src/viwes/login.vue使用

<script setup lang="ts">
import { colorStore } from "@/store/color";
import { webSocketStore } from "@/store/webSocket";
import { createWebSocket } from "@/util/socket";
import { useRouter } from "vue-router";
import md5 from "js-md5"; //
import { ref } from "vue";
import loginApi from "@/api/loginApi";
import { ElNotification } from "element-plus";
const color = colorStore();
const webSocket = webSocketStore();
const routers = useRouter();
const username = ref("009999");
const password = ref("0");
const mes = ref();
const global_callback = (msg: any) => {console.log("websocket的回调函数收到服务器信息:" + JSON.stringify(msg));// console.log("收到服务器信息:" + msg);mes.value = JSON.parse(JSON.stringify(msg));webSocket.addMsg(mes);ElNotification({title: "您有一条新的消息y",message: mes.value.key,position: "bottom-right",});
};
const login = () => {let params = {staffCode: username.value,password: md5(password.value.toString()),};loginApi.login(params).then((res: any) => {if (res) {sessionStorage.setItem("organizationCode", res.hospitalCode);sessionStorage.setItem("token", res.token);sessionStorage.setItem("staffCode", res.staffCode);sessionStorage.setItem("staffName", res.name);sessionStorage.setItem("islogin", "true");sessionStorage.setItem("roleList", JSON.stringify(res.roles));sessionStorage.setItem("currectRole", JSON.stringify(res.roles[0]));loginApi.queryMenuByRoleCode(res.roles[0].roleCode).then((res: any) => {if (res) {sessionStorage.setItem("menu", JSON.stringify(res));routers.push("/");}});createWebSocket(global_callback);}});
};
</script><template><div class="con" :style="{ '--color': color.color }"><div id="box" class="login-container"><div class="left-container"><div class="title"><span><img src="../../assets/hip.png" style="height: 15px" />{{$t("base.title")}}</span></div><div class="input-container"><inputtype="text"name="username"placeholder="用户名"v-model="username"/><inputtype="password"name="password"placeholder="密码"v-model="password"/></div><div class="message-container"><span>Copyright © 2022 | {{ $t("login.GoodWill") }}</span></div></div><div class="right-container"><div class="regist-container"><span class="regist">{{ $t("login.WelcomeLogin") }}</span></div><div class="action-container" @click="login"><span>{{ $t("login.submit") }}</span></div></div></div></div>
</template><style lang="scss" scoped>
.con {height: calc(100vh - 230px);padding-top: 10%;background-image: linear-gradient(to bottom right,rgb(114, 135, 254),var(--color));
}
.login-container {width: 600px;height: 315px;margin: 0 auto;border-radius: 15px;box-shadow: 0 10px 50px 0px rbg(59, 45, 159);background-color: rgb(95, 76, 194);
}
#box {// outline: 4px solid #fff;position: relative;overflow: hidden;z-index: 1;
}
#box::before {content: "";position: absolute;background: lightgray;width: 500px;height: 400px;z-index: -2;left: 50%;top: 50%;transform-origin: 0 0;animation: rotate 5s infinite linear;
}
#box::after {content: "";position: absolute;background: rgb(95, 76, 194);width: calc(600px - 4px);height: calc(315px - 4px);left: 2px;top: 2px;border-radius: 15px;z-index: -1;
}
@keyframes rotate {to {transform: rotate(1turn);}
}
.left-container {display: inline-block;width: 330px;// height: 315px;height: 191px;margin-top: 2px;border-top-left-radius: 15px;border-bottom-left-radius: 15px;padding: 60px;background-image: linear-gradient(to bottom right,rgb(118, 76, 163),rgb(92, 103, 211));
}
.left-container::before {content: "";width: 200px;height: 200px;left: 50%;top: 50%;z-index: -1;background-image: linear-gradient(to bottom right,rgb(118, 76, 163),rgb(92, 103, 211));
}
.title {color: #fff;font-size: 18px;font-weight: 200;
}
.title span {border-bottom: 3px solid rgb(237, 221, 22);
}
.input-container {padding: 20px 0;
}
input {border: 0;background: none;outline: none;color: #fff;margin: 20px 0;display: block;width: 100%;padding: 5px 0;transition: 0.2s;border-bottom: 1px solid rgb(199, 191, 219);
}
input:hover {border-bottom-color: #fff;
}
::-webkit-input-placeholder {color: rgb(199, 191, 219);
}
.message-container {font-size: 14px;transition: 0.2s;color: rgb(199, 191, 219);cursor: pointer;
}
.message-container:hover {color: #fff;
}
.right-container {width: 145px;display: inline-block;height: calc(100% - 120px);vertical-align: top;padding: 60px 0;
}
.regist-container {text-align: center;color: #fff;font-size: 18px;font-weight: 200;
}
.regist-container span {border-bottom: 3px solid rgb(237, 221, 22);
}
.action-container {font-size: 10px;color: #fff;text-align: center;position: relative;top: 200px;
}
.action-container span {border: 1px solid rgb(237, 221, 22);padding: 10px;display: inline;line-height: 20px;border-radius: 20px;position: absolute;bottom: 10px;left: calc(72px - 20px);transition: 0.2s;cursor: pointer;
}
.action-container span:hover {background-color: rgb(237, 221, 22);color: rgb(95, 76, 194);
}
</style>

相关文章:

Vue3+Setup使用websocket

创建src/util/socket.ts let websock: any null; let global_callback: any null; const serverPort "8080"; // webSocket连接端口 const wsuri "ws://" window.location.hostname ":" serverPort "/wsdemo"; function crea…...

tcpdump快速入门及实践手册

tcpdump快速入门及实践手册 1. 快速入门 [1]. 基本用法 基本用法&#xff1a; tcpdump [选项 参数] [过滤器 参数] [rootkysrv1 pwe]# tcpdump -h tcpdump version 4.9.3 libpcap version 1.9.1 (with TPACKET_V3) OpenSSL 1.1.1f 31 Mar 2020 Usage: tcpdump [-aAbdDefhH…...

javascript双判断语句

JavaScript的if双判断语句和java相似 if&#xff08;条件表达式&#xff09; { 执行语句 } else { 执行语句 } 比如说要判断一个年份是否是闰年&#xff0c;代码如下 html><head><meta charset"UTF-8"><title></title></hea…...

C# 中的多态

多态的定义&#xff1a; 通过指向派生类的基类引用&#xff0c;调用虚函数&#xff0c;会根据引用所指向派生类的实际类型&#xff0c;调用派生类中的同名重写函数&#xff0c;便是多态。 C#中的多态可以分为两种类型&#xff1a; 编译时多态&#xff08;静态多态&#xff09;&…...

高性能内存对象缓存Memcached原理与部署

目录 一&#xff1a;Memcached 1&#xff1a;Memcached的概述 2&#xff1a;数据存储方式与数据过期方式 &#xff08;1&#xff09;数据存储方式&#xff1a;Slab Allocation (2)数据过期方式:LRU、Laxzy Expiration 3.Memcached 缓存机制 4.Memcached 分布式 5.Memcac…...

【C++进阶】map与set的封装实践

文章目录 map和setmapmap的框架迭代器operator()operator--()operator()和operator!()operator*()operator->() insertbegin()end()operator[] ()map的所有代码&#xff1a; set的封装迭代器的封装总结 map和set 通过观察stl的底层我们可以看见&#xff0c;map和set是通过红…...

可视化编程-七巧低代码入门02

1.1.什么是可视化编程 非可视化编程是一种直接在集成开发环境中&#xff08;IDE&#xff09;编写代码的编程方式&#xff0c;这种编程方式要求开发人员具备深入的编程知识&#xff0c;开发效率相对较低&#xff0c;代码维护难度较大&#xff0c;容易出现错误&#xff0c;也需要…...

算法:魔法字典

1️⃣要求&#xff1a; 设计一个使用单词列表进行初始化的数据结构&#xff0c;单词列表中的单词 互不相同 。 如果给出一个单词&#xff0c;请判定能否只将这个单词中一个字母换成另一个字母&#xff0c;使得所形成的新单词存在于你构建的字典中。 实现 MagicDictionary 类…...

html+css 实现hover 翻转按钮

前言:哈喽,大家好,今天给大家分享html+css 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 一、效果二、原理解析1.这是一个,hover翻转按钮的效果。这其实是用==一个元素==实现的。…...

ETL程序员如何平衡日常编码工作与提升式学习

在快速发展的科技行业中&#xff0c;程序员面临着不断更新的技术和工具&#xff0c;尤其是数据领域的从业者&#xff0c;如ETL&#xff08;抽取、转换、加载&#xff09;工程师。如何在日常繁重的编码工作中找到时间进行提升式学习&#xff0c;成为了许多ETL工程师的共同挑战。…...

被嫌弃的35岁程序员,竟找到了职业的新出路:PMP项目管理

35岁&#xff0c;本应是事业发展的高峰期。更多听到的却是35岁职场天花板&#xff0c;特别是IT从业者&#xff0c;35岁就好像是一道迈不过的坎&#xff1a;多年的工作经验&#xff0c;在35岁的生理年龄面前&#xff0c;一文不值。 IT从业者若想安然度过“35岁危机”&#xff0…...

跟李沐学AI:目标检测、锚框

边缘框 用于表示物体的位置&#xff0c;一个边缘框通过四个数字定义&#xff1a;(坐上x, 左上y, 右下x, 右下y)或&#xff08;左上x, 左上y, 宽, 高&#xff09; 通常物体检测或目标检测的数据集比图片分类的数据集小很多&#xff0c;因为物体检测数据集标注成本高很多。 目…...

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 二、ArkWeb 1、概念介绍 ArkWeb是用于应用程序中显示Web页面内容的Web组件&#xff0c;为开发者提供页面加载、页面交互、页面调…...

机器学习深度学习中的Warmup技术是什么?

机器学习&深度学习中的Warmup技术是什么&#xff1f; 在机器学习&深度学习模型的训练过程中&#xff0c;优化器的学习率调整策略对模型的性能和收敛性至关重要。Warmup是优化器学习率调整的一种技术&#xff0c;旨在改善训练的稳定性&#xff0c;特别是在训练的初期阶…...

ECMAScript6中的模块:export导出、import导入

1、模块概述 早期的 JavaScript 程序很小&#xff0c;通常被用来执行独立的脚本任务&#xff0c;在 Web 页面中需要的地方提供一定的交互。随着 Web 应用程序变得越来越复杂&#xff0c;有必要考虑提供一种将 JavaScript 程序拆分为可按需导入的单独模块的机制&#xff0c;这就…...

mysql写个分区表

因为表量已经达到1个亿了。现在想做个优化&#xff0c;先按照 create_time 时间进行分区吧。 create_time 是varchar类型。 CREATE TABLE orders (id varchar(40) NOT NULL ,order_no VARCHAR(20) NOT NULL,create_time VARCHAR(20) NOT NULL,amount DECIMAL(10,2) NOT NULL,…...

Hystrix——服务容错保护库

熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压&#xff0c;最终导致自身服务瘫痪的一种机制&#xff0c;它的功能类似电路的保险丝&#xff0c;其目的是为了阻断故障&#xff0c;从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…...

【区块链+金融服务】河北股权交易所综合金融服务平台 | FISCO BCOS应用案例

区域性股权市场是我国资本市场的重要组成部分&#xff0c;是多层次资本市场体系的基石。河北股权交易所&#xff08;简称&#xff1a;河交所&#xff09; 作为河北省唯一一家区域性股权市场运营机构&#xff0c;打造河北股权交易所综合金融服务平台&#xff0c;将区块链技术与区…...

[图解]需要≠需求-《分析模式》漫谈

1 00:00:00,760 --> 00:00:02,910 今天的《分析模式》漫谈 2 00:00:02,920 --> 00:00:04,180 我们来说一下 3 00:00:04,490 --> 00:00:06,490 需要不等于需求 4 00:00:10,490 --> 00:00:11,760 还是第一章 5 00:00:13,120 --> 00:00:15,020 这里 6 00:00:1…...

刷到好听的音频怎么办

在短视频平台上&#xff0c;我们常常会刷到那些好听得让人陶醉的视频&#xff0c;可却无法直接下载保存其中的音频&#xff0c;是不是感觉很遗憾&#xff1f; 比如刷到林俊杰这首前奏超好听的《江南》&#xff0c;却禁止下载无法直接下载保存。 别担心&#xff0c;下面就为您揭…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...