socket.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // src/utils/socket.js
  2. import { ElMessage } from 'element-plus'
  3. import { ROOTPATH2 } from '../comment/httpUrl.js'
  4. var WSS = null // 全局唯一的 WebSocket 实例
  5. /**
  6. * 连接 WebSocket
  7. * @param {string} userId 当前用户 ID
  8. */
  9. export function connectSocket(userId, store, router) {
  10. if (!userId) return
  11. // 若已有连接则关闭
  12. if (WSS) {
  13. try {
  14. WSS.close()
  15. } catch { }
  16. }
  17. const wsUrl = `${ROOTPATH2}${userId}`
  18. WSS = new WebSocket(wsUrl)
  19. console.log('🔗 WebSocket 连接中:', wsUrl)
  20. console.log(WSS)
  21. WSS.onopen = () => {
  22. console.log('✅ WebSocket 已连接:', wsUrl)
  23. }
  24. WSS.onmessage = (event) => {
  25. if (event.data === 'HeartBeat') return
  26. let msg
  27. try {
  28. msg = JSON.parse(event.data)
  29. } catch (e) {
  30. console.warn('非 JSON 消息:', event.data)
  31. return
  32. }
  33. if (msg.type === 'kickOut') {
  34. ElMessage({
  35. message: msg.content || '您的账号已在其他设备登录',
  36. type: 'warning',
  37. duration: 1500
  38. })
  39. // 清空本地存储
  40. localStorage.removeItem('token')
  41. localStorage.removeItem('userId')
  42. localStorage.removeItem('userType')
  43. localStorage.removeItem('companyId')
  44. if (store) store.dispatch('SET_DATA')
  45. if (router) router.push({ name: 'login' })
  46. }
  47. }
  48. WSS.onerror = (err) => {
  49. console.error('❌ WebSocket 错误:', err)
  50. }
  51. WSS.onclose = () => {
  52. console.log('🔌 WebSocket 已关闭')
  53. }
  54. }
  55. /** 获取 WebSocket 实例 */
  56. export function getSocket() {
  57. return WSS
  58. }
  59. /** 发送消息 */
  60. export function sendSocketMsg(data) {
  61. if (WSS && WSS.readyState === WebSocket.OPEN) {
  62. WSS.send(data)
  63. } else {
  64. console.warn('⚠️ WebSocket 未连接,无法发送')
  65. }
  66. }
  67. /** 关闭连接 */
  68. export function closeSocket() {
  69. if (WSS) {
  70. WSS.close()
  71. WSS = null
  72. }
  73. }