<template> <view style="display: none;">阅读socket正在运行...</view> </template> <script> import { info } from '@/api/user' export default { name: 'ReadSocket', props: { value: String, courseId: String }, data() { return { websocket: null, stompClient: null, timer: null, fileId: '', userId: '', msgShow: false } }, watch: { value: { handler() { this.fileId = this.value } } }, created() { this.fileId = this.value }, mounted() { let token = uni.getStorageSync('token'); info(token).then(res => { console.log(res) this.userId = res.id this.connection() }) }, destroyed() { // 关闭连接 uni.closeSocket() // 清理定时器 if(this.timer!=null){ clearInterval(this.timer) } }, methods: { beat() { // 清理定时器 if (this.timer!=null) { clearInterval(this.timer) } let that = this // 10秒联系一次 this.timer = setInterval(() => { // 发送消息 that.sendPing() }, 10000) // 维持心跳 this.sendPing(); }, sendPing() { // 发送消息,断线重连 uni.sendSocketMessage({ data: 'ping', success: res => { return; }, fail: err => { // 未连接打开websocket连接 this.connection(); } }); }, // 建立连接 connection() { // socket服务器 let host = this.$urls.socket // 如果为空,则表示使用自己的 if (host == null || host === '') { const https = 'https:' == document.location.protocol ? true : false; host = https ? 'wss://'+window.location.host : 'ws://' + window.location.host } let that = this const socketUrl = `${host}/api/socket/read/${this.userId}/${this.courseId}/${this.fileId}` console.log('开始连接:', socketUrl); uni.connectSocket({ url: socketUrl }); uni.onSocketError(function(res) { console.log('WebSocket连接打开失败,请检查!'); }); // 连接打开开始计时 uni.onSocketOpen(function(res) { console.log('WebSocket连接已打开!'); // 开始发送数据 that.beat() }); // 关闭连接 uni.onSocketClose(function(res) { console.log('WebSocket 已关闭!'); }); // 收到消息 uni.onSocketMessage(function(res) { console.log('msg', res.data) const data = JSON.parse(res.data) // 意外终止消息 if (data.stopped) { uni.showToast({ icon: 'none', title: data.stopMsg, duration: 3500 }) that.msgShow = true setTimeout(() => { // 切到课程页面回去 uni.switchTab({ url: '/pages/course/index' }) }, 3500) return } if (data.all && !that.msgShow) { uni.showToast({ title: '恭喜,您已经学完全部课程啦!', icon: 'none', duration: 2000 }); that.msgShow = true return } if (data.current && !that.msgShow) { uni.showToast({ title: '恭喜,您已学完本课件!', icon: 'none', duration: 2000 }); that.msgShow = true return } }) } } } </script>