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
}
目录
相关文章
|
4月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
388 1
|
1月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
203 1
|
5月前
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
329 83
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
272 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
7月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
370 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
4月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
189 22
|
3月前
|
JavaScript API 开发者
Vue框架中常见指令的应用概述。
通过以上的详细解析,你应该已经初窥Vue.js的指令的威力了。它们是Vue声明式编程模型的核心之一,无论是构建简单的静态网站还是复杂的单页面应用,你都会经常用到。记住,尽管Vue提供了大量预定义的指令,你还可以创建自定义指令以满足特定的需求。为你的Vue应用程序加上这些功能增强器,让编码变得更轻松、更愉快吧!
63 1
|
6月前
|
人工智能 前端开发 JavaScript
AI程序员:通义灵码 2.0应用VScode前端开发深度体验
AI程序员:通义灵码 2.0应用VScode前端开发深度体验,在软件开发领域,人工智能技术的融入正深刻改变着程序员的工作方式。通义灵码 2.0 作为一款先进的 AI 编程助手,与广受欢迎的代码编辑器 Visual Studio Code(VScode)相结合,为前端开发带来了全新的可能性。本文将详细分享通义灵码 2.0 在 VScode 前端开发环境中的深度使用体验。
1000 2
AI程序员:通义灵码 2.0应用VScode前端开发深度体验
|
7月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
410 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~