Netty - 从启蒙到搬砖(完整应用篇)(前端 Vue 篇)

简介: Netty - 从启蒙到搬砖(完整应用篇)(前端 Vue 篇)

后端篇:https://lux-sun.blog.csdn.net/article/details/101352493

 

前端篇


1、在 main.js 里赋值给 this

// main.js
import websocket from '@/assets/js/websocket'
Vue.prototype.websocket = websocket

2、 在首页 mounted 钩子函数里开启长连接

// index.vue
mounted () {
    this.websocket.initWebSocket() // 开启长连接
}

3、所有的业务都在这里处理,无需其它地方再调用 websocket.js 里的函数

// websocket.js
import cookie from '@/assets/js/cookieUtil'
import store from '@/store'
import { Notification } from 'element-ui'
import goodorder from '@/api/goodorderBG'
let websocketURL = 'wss://xxx/websocket'
let heartbeatTime = 20000 // nginx 60s 限制,这里 20s 一次心跳
let reconnectionTime = 10000 // 断线后 10s 尝试一次重连
let ws = null
let that = null
let reconnection = true
let reconnectionCount = 0
export default {
  initWebSocket(){
    console.log('初始化websocket');
    that = this
    if(ws!==null){
      this.closeWebsocket()
    }
    ws = new WebSocket(websocketURL);
    ws.onmessage = this.websocketOnMessage;
    ws.onopen = this.websocketOnOpen;
    ws.onerror = this.websocketOnError;
    ws.onclose = this.websocketClose;
  },
  websocketOnOpen(){ // 连接建立之后执行send方法发送数据
    Notification({
      title: '已连接到服务器',
      message: '成功与服务器建立联机',
      type: 'success',
      offset: 60 // 偏移量
    })
    reconnectionCount = 0
    let account = JSON.parse(cookie.getCookie())
    let actions = {"operand":1, "userId":account.userInfo.userId}
    that.websocketSend(JSON.stringify(actions)) // 绑定userId
    that.initData() // 初始化websocket建立数据
  },
  websocketOnError(){ // 连接建立失败重连
  },
  websocketOnMessage(e){ // 数据接收
    let data = JSON.parse(e.data)
    if(data.status === 1){ // 1:连接无异常
      setTimeout(() => {
        that.heartbeat()
      },heartbeatTime) // 心跳包
    }else if(data.status === 2) { // 2:有新的业务逻辑消息需要处理
      let info = JSON.parse(data.data)
      if(info.type === 1){ // 家长申请订单
        store.dispatch('websocket/changeAuditOrderNum',info.data.total)
        Notification({
          title: '您的家长申请订单数量有新的变化',
          message: data.msg,
          offset: 60
        });
      }
    }
  },
  websocketSend(data){ // 数据发送
    ws.send(data);
  },
  websocketClose(e){ // 关闭
    if(reconnection){
      if(reconnectionCount === 0){
        Notification({
          title: '连接意外断开',
          message: '正在尝试重新建立连接',
          type: 'error',
          offset: 60
        })
      }
      setTimeout(() => {
        console.log('尝试重连')
        reconnectionCount += 1
        that.initWebSocket()
      },reconnectionTime) // 重新连接
    }else{
      // 不重连但是将重连状态改为true
      console.log('停止连接')
      reconnection = true
    }
  },
  closeWebsocket(){ // 主动关闭websocket
    try {
      ws.close()
      ws = null
    }catch (e) { }
  },
  heartbeat(){
    let actions = {"operand":2};
    this.websocketSend(JSON.stringify(actions));
  },
  setReconnection(rc){ // 退出登录会调用,且设置false
    reconnection = rc
  },
  initData(){
    // 获取申请订单数
    goodorder.getTempGoodorderCount(
      {
        status: 0,
        type: 0
      }
    ).then(res => {
      if(res.success){
        store.dispatch('websocket/changeAuditOrderNum',res.data)
      } else if (res.nullwarn) {
        store.dispatch('websocket/changeAuditOrderNum',0)
      } else {
        this.$message({ type: 'error', message: res.msg })
      }
    }).catch(error => {
      if(error !== 'noLogin'){
        this.$message({ type: 'error', message: '系统错误' })
      }
    })
  }
}

4、这里用到了 Vuex,我们稍微看下

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const modulesFiles = require.context('./modules', false, /\.js$/)
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // set './app.js' => 'app'
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})
const store = new Vuex.Store({
  modules
})
export default store
// store/modules/websocket.js
const state = {
  tempOrderNum: 0,
  noticeNum: 0
}
const mutations = {
  changeTempOrderNum: (state,num) => {
    state.tempOrderNum = num
    state.noticeNum = state.tempOrderNum
  }
}
const actions = {
  changeTempOrderNum({ commit },num) {
    commit('changeTempOrderNum',num)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
目录
相关文章
|
5天前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
10天前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
|
6天前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
29 3
|
5天前
|
JavaScript 前端开发 API
如何在前端开发中有效管理状态:React vs. Vue
在现代前端开发中,状态管理是一个关键因素,它直接影响到应用的性能和可维护性。React 和 Vue 是当前最流行的前端框架,它们在状态管理方面各有优势和劣势。本文将深入探讨 React 和 Vue 在状态管理中的不同实现,分析它们的优缺点,并提供实际应用中的最佳实践,以帮助开发者选择最适合他们项目的解决方案。
|
19天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
52 0
|
19天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
42 0
|
19天前
|
C# 开发者 测试技术
震惊!Xamarin 竟能如此构建跨平台应用程序,代码共享、界面设计与性能优化全攻略大揭秘!
【8月更文挑战第31天】在移动应用开发领域,跨平台工具日益受到青睐。Xamarin 是一款强大的工具,支持使用 C# 开发适用于 iOS、Android 和 Windows 的应用。通过安装 Visual Studio 或 Visual Studio for Mac,并创建 Xamarin 项目,开发者可以利用丰富的功能和工具进行开发。Xamarin 的主要优势在于代码共享,能够显著提高开发效率。
39 0
|
19天前
|
开发者 Android开发 iOS开发
Xamarin开发者的神器!揭秘你绝不能错过的插件和工具,让你的开发效率飞跃式提升
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程,保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用介绍 Xamarin.Forms 的基本功能和工作原理。首先配置 Visual Studio 开发环境,然后创建并运行一个包含标题、按钮和消息标签的示例应用,展示如何定义界面布局及处理按钮点击事件。这帮助开发者快速入门 Xamarin.Forms,提高跨平台应用开发效率。
30 0
|
19天前
|
开发者 存储 API
Xamarin 开发者的社区资源概览:从官方文档到GitHub示例,全面探索提升开发技能与解决问题的多元化渠道与实用工具
【8月更文挑战第31天】Xamarin 开发者社区资源概览旨在提升开发效率与解决问题,涵盖官方文档、社区论坛、GitHub 项目等。官方文档详尽,涵盖 Xamarin.Forms 使用、性能优化等;社区论坛供交流心得;GitHub 提供示例代码。此外,第三方博客、视频教程及 Xamarin University 等资源也丰富多样,适合各阶段开发者学习与提升。通过综合利用这些资源,开发者可不断进步,应对技术挑战。
31 0
|
19天前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
34 0