websocketMixin.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * WebSocket功能混入
  3. * 提供WebSocket连接管理的通用方法和生命周期处理
  4. *
  5. * @author kxmall
  6. * @date 2025-01-08
  7. */
  8. import riderWebSocketManager from '@/utils/websocket.js';
  9. import { registerMessageHandlers, unregisterMessageHandlers } from '@/utils/messageHandlers.js';
  10. import { mapState } from 'vuex';
  11. export default {
  12. computed: {
  13. ...mapState(['token', 'userInfo'])
  14. },
  15. data() {
  16. return {
  17. // WebSocket连接状态
  18. wsConnectionStatus: 'disconnected', // disconnected, connecting, connected, error
  19. // 是否启用WebSocket(可以通过配置控制)
  20. wsEnabled: true
  21. };
  22. },
  23. methods: {
  24. /**
  25. * 初始化WebSocket连接
  26. */
  27. initWebSocket() {
  28. if (!this.wsEnabled) {
  29. console.log('WebSocket功能已禁用');
  30. return;
  31. }
  32. if (!this.userInfo || !this.userInfo.state) {
  33. console.log('用户未通过审核,不连接WebSocket');
  34. return;
  35. }
  36. // 注册消息处理器
  37. registerMessageHandlers(riderWebSocketManager, this);
  38. // 连接WebSocket
  39. riderWebSocketManager.connect(this.userInfo, this.$baseUrl);
  40. console.log('WebSocket初始化完成');
  41. },
  42. /**
  43. * 断开WebSocket连接
  44. */
  45. disconnectWebSocket() {
  46. if (riderWebSocketManager.isConnected()) {
  47. unregisterMessageHandlers(riderWebSocketManager);
  48. riderWebSocketManager.disconnect();
  49. console.log('WebSocket连接已断开');
  50. }
  51. },
  52. /**
  53. * 重连WebSocket
  54. */
  55. reconnectWebSocket() {
  56. console.log('手动重连WebSocket');
  57. riderWebSocketManager.reset();
  58. this.disconnectWebSocket();
  59. // 延迟一秒后重连
  60. setTimeout(() => {
  61. this.initWebSocket();
  62. }, 1000);
  63. },
  64. /**
  65. * 发送WebSocket消息
  66. * @param {String} message 消息内容
  67. */
  68. sendWebSocketMessage(message) {
  69. return riderWebSocketManager.send(message);
  70. },
  71. /**
  72. * 获取WebSocket连接状态
  73. */
  74. getWebSocketStatus() {
  75. return riderWebSocketManager.isConnected() ? 'connected' : 'disconnected';
  76. },
  77. /**
  78. * 设置WebSocket启用状态
  79. * @param {Boolean} enabled 是否启用
  80. */
  81. setWebSocketEnabled(enabled) {
  82. this.wsEnabled = enabled;
  83. if (enabled) {
  84. this.initWebSocket();
  85. } else {
  86. this.disconnectWebSocket();
  87. }
  88. }
  89. },
  90. /**
  91. * 页面显示时的处理
  92. */
  93. onShow() {
  94. // 如果用户状态发生变化,重新初始化WebSocket
  95. if (this.userInfo && this.userInfo.state && this.wsEnabled) {
  96. if (!riderWebSocketManager.isConnected()) {
  97. console.log('页面显示,重新连接WebSocket');
  98. this.initWebSocket();
  99. }
  100. }
  101. },
  102. /**
  103. * 页面隐藏时的处理
  104. */
  105. onHide() {
  106. // 页面隐藏时不断开连接,保持后台接收消息
  107. console.log('页面隐藏,WebSocket保持连接');
  108. },
  109. /**
  110. * 组件销毁前的清理
  111. */
  112. beforeDestroy() {
  113. this.disconnectWebSocket();
  114. },
  115. /**
  116. * 组件销毁后的清理(兼容性)
  117. */
  118. destroyed() {
  119. this.disconnectWebSocket();
  120. },
  121. /**
  122. * 页面卸载时的清理
  123. */
  124. onUnload() {
  125. this.disconnectWebSocket();
  126. }
  127. };