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

WebSocket异步导出

WebSocket异步导出

    • 1、安装sockjs-client和stompjs
    • 2、连接后台
    • 3、vite.config.ts 配置反向代理
    • 4、导出并实时通信
    • 5、 封装WebSocket 文件
    • 注册登录(城通网盘)

1、安装sockjs-client和stompjs

import SockJS from 'sockjs-client/dist/sockjs.min.js'
import Stomp from 'stompjs'

2、连接后台

let base_url = '/api/****'
//创建STOMP连接
let socket = new SockJS(sockUrl)
// 获取STOMP子协议的客户端对象
this.stompClient = Stomp.over(socket);
// 心跳发送频率
this.stompClient.heartbeat.outgoing = 60000;
// 心跳接收频率
this.stompClient.heartbeat.incoming = 120000;
// 调用.connect方法连接Stomp服务端进行验证
this.stompClient.connect({}, (frame) => {
	console.log('Connected: ' + frame);
	// 订阅服务端提供的某个topic  如用户id
	this.stompClient.subscribe('/topic/***/' + this.$route.params.id, (frame) => {
	 console.log('Received message:', JSON.stringify(frame.body));
	})
});

3、vite.config.ts 配置反向代理

原因:SockJS 使用https和http 传输

  // 服务端渲染
    server: {
      port: env.VITE_PORT, // 端口号
      host: "0.0.0.0",
      open: env.VITE_OPEN === 'true',
      // 本地跨域代理. 目前注释的原因:暂时没有用途,server 端已经支持跨域
      proxy: {
        ['/api']: {
          target: 'http://*****/api',
          ws: false,
          rewrite: (path) => path.replace(new RegExp(^/api‘), ''),
        },
      }
    }

4、导出并实时通信

import WebSocketService from '@/utils/websocket'
const exportLoading = ref(false)  //异步导出加载中
const exportData = ref(false)     //导出结果提示
// 异步导出
const handleAsynExport = async () => {
  exportLoading.value = true
  try {
    await AsynExportApi.exportSales(queryParams.value)
    if (WebSocketService?.stompClient == null) {
      // 建立 Websocket连接,  /topic/***/${id}  是后端提供的
      const destination = `/topic/***/${id}`
      WebSocketService.connect(destination, handleMessage)
    }

  } finally {
    setTimeout(() => {
      if (!exportData.value) {
        ElNotification.error({
          title: '提示',
          message: '导出失败,请稍后重试'
        })
      }
      exportLoading.value = false
    }, 3000)
  }
//弹窗下载链接
const handleMessage = (data: any) => {
  exportData.value = true
  exportLoading.value = false
  ElNotification.success({
    title: '提示',
    message: h('p', null, [
      h('span', null, data.fileName + '加载成功,请'),
      h(
        'a',
        {
          style: 'color: teal;cursor:pointer;text-decoration: underline;',
          onClick: () => {
            location.replace(data.filePath)
          }
        },
        '下载'
      )
    ])
  })
}

//页面切换后断开连接
useRouter().afterEach(() => {
  if (WebSocketService?.stompClient !== null) {
    //断开Websocket连接
    WebSocketService.disconnect()
  }
})

5、 封装WebSocket 文件

下载 :WebSocket 封装 访问密码: 3146

注册登录(城通网盘)


http://www.kler.cn/a/515876.html

相关文章:

  • leetcode 121. 买卖股票的最佳时机
  • LabVIEW 水电站厂内经济运行系统
  • 3.1 Go函数调用过程
  • 【深度学习】Java DL4J 2024年度技术总结
  • 【Vim Masterclass 笔记22】S09L40 + L41:同步练习11:Vim 的配置与 vimrc 文件的相关操作(含点评课内容)
  • 工程上LabVIEW常用的控制算法有哪些
  • 笋瓜果实的代谢组学和转录组分析-文献精读103
  • [ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview
  • ESP32C3使用Audiuno搭建开发环境入门
  • 智慧农业——温湿,土壤,风速风向,降雨量 传感器监视平台
  • 单路由及双路由端口映射指南
  • Objective-C语言的计算机基础
  • 【0x0012】HCI_Delete_Stored_Link_Key命令详解
  • MFC结构体数据文件读写
  • 【JavaEE】Spring(3):IoC和DI
  • C#单点登录(SSO):解锁高效访问的密码
  • 汇编实验·子程序、分支、循环综合设计
  • 初识Netty(使用Netty实现服务端与客户端)
  • AWScurl笔记
  • 【Java设计模式-7】责任链模式:我是流水线的一员
  • No.37 笔记 | Python面向对象编程学习笔记:探索代码世界的奇妙之旅
  • 2.5英寸笔记本电脑机械硬盘拆解方法
  • vim查找如何忽略字母的大小写
  • Java算法——排序
  • PHP如何封装项目框架达到高可用、高性能、高并发
  • 嵌入式知识点总结 C/C++ 专题提升(七)-位操作