From 405a8ce5112f837263ab357271f3e7159910fad0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com>
Date: Fri, 29 Sep 2023 11:07:56 +0800
Subject: [PATCH] =?UTF-8?q?:sparkles:=E6=96=B0=E5=A2=9E=E5=85=A8=E5=B1=80?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/permission.js | 2 +-
src/router/index.js | 5 ++
src/signalr/analysis.js | 33 ++++----
src/signalr/signalr.js | 5 +-
src/store/modules/socket.js | 9 +-
src/utils/signalR.js | 159 ------------------------------------
src/views/error/Error.vue | 69 ++++++++++++++++
7 files changed, 102 insertions(+), 180 deletions(-)
delete mode 100644 src/utils/signalR.js
create mode 100644 src/views/error/Error.vue
diff --git a/src/permission.js b/src/permission.js
index 5cd7086..02af186 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -9,7 +9,7 @@ import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'
NProgress.configure({ showSpinner: false })
-const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/socialLogin']
+const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/socialLogin', '/error']
router.beforeEach((to, from, next) => {
NProgress.start()
diff --git a/src/router/index.js b/src/router/index.js
index 1cc4762..3e10920 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -59,6 +59,11 @@ export const constantRoutes = [
component: () => import('@/views/error/401'),
hidden: true
},
+ {
+ path: '/error',
+ component: () => import('@/views/error/Error'),
+ hidden: true
+ },
{
path: '',
component: Layout,
diff --git a/src/signalr/analysis.js b/src/signalr/analysis.js
index 1a8a052..b992514 100644
--- a/src/signalr/analysis.js
+++ b/src/signalr/analysis.js
@@ -1,5 +1,4 @@
-// import signalr from './signalr'
-import { ElNotification, ElMessage, ElMessageBox } from 'element-plus'
+import { ElNotification, ElMessageBox } from 'element-plus'
import useSocketStore from '@/store/modules/socket'
import useUserStore from '@/store/modules/user'
import { webNotify } from '@/utils/index'
@@ -38,16 +37,21 @@ export default {
// 接收强退通知
connection.on('forceUser', (data) => {
- ElMessageBox.alert(`你的账号已被强退,原因:${data.reason || '无'}`, '提示', {
- confirmButtonText: '确定',
- callback: () => {
- useUserStore()
- .logOut()
- .then(() => {
- location.href = import.meta.env.VITE_APP_ROUTER_PREFIX + 'index'
- })
- }
- })
+ // connection.stop().then(() => {
+ // console.log('Connection stoped')
+ // })
+ // ElMessageBox.alert(`你的账号已被强退,原因:${data.reason || '无'}`, '提示', {
+ // confirmButtonText: '确定',
+ // callback: () => {
+
+ // }
+ // })
+ useSocketStore().setGlobalError({ code: 0, msg: `你的账号已被强退,原因:${data.reason || '无'}` })
+ useUserStore()
+ .logOut()
+ .then(() => {
+ location.href = import.meta.env.VITE_APP_ROUTER_PREFIX + 'error'
+ })
})
// 接收聊天数据
connection.on('receiveChat', (data) => {
@@ -70,7 +74,7 @@ export default {
useSocketStore().getOnlineInfo(data)
})
- connection.on('logOut', () => {
+ connection.on(MsgType.LogOut, () => {
useUserStore()
.logOut()
.then(() => {
@@ -86,5 +90,6 @@ export default {
}
const MsgType = {
M001: 'onlineNum',
- M002: 'connId'
+ M002: 'connId',
+ LogOut: 'logOut'
}
diff --git a/src/signalr/signalr.js b/src/signalr/signalr.js
index 85de1d8..0c3d1df 100644
--- a/src/signalr/signalr.js
+++ b/src/signalr/signalr.js
@@ -41,7 +41,6 @@ export default {
await this.start()
})
analysis.onMessage(connection)
- // this.receiveMsg(connection)
// 启动
// this.start();
},
@@ -70,7 +69,5 @@ export default {
}
return false
}
- },
- // 接收消息处理
- receiveMsg(connection) {}
+ }
}
diff --git a/src/store/modules/socket.js b/src/store/modules/socket.js
index 94ca547..953182e 100644
--- a/src/store/modules/socket.js
+++ b/src/store/modules/socket.js
@@ -2,7 +2,7 @@ import useUserStore from './user'
import signalR from '@/signalr/signalr'
const useSocketStore = defineStore('socket', {
persist: {
- paths: ['chatMessage', 'chatList', 'sessionList', 'newChat', 'noticeIdArr', 'newNotice'] //存储指定key
+ paths: ['chatMessage', 'chatList', 'sessionList', 'newChat', 'noticeIdArr', 'newNotice', 'globalErrorMsg'] //存储指定key
},
state: () => ({
onlineNum: 0,
@@ -16,7 +16,9 @@ const useSocketStore = defineStore('socket', {
sessionList: {},
newChat: 0,
newNotice: 0,
- noticeIdArr: []
+ noticeIdArr: [],
+ // 全局错误提醒
+ globalErrorMsg: {}
}),
getters: {
/**
@@ -113,6 +115,9 @@ const useSocketStore = defineStore('socket', {
} else if (type == 1) {
this.newChat = 0
}
+ },
+ setGlobalError(data) {
+ this.globalErrorMsg = data
}
}
})
diff --git a/src/utils/signalR.js b/src/utils/signalR.js
deleted file mode 100644
index da13ad5..0000000
--- a/src/utils/signalR.js
+++ /dev/null
@@ -1,159 +0,0 @@
-// 官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0&viewFallbackFrom=aspnetcore-2.2&tabs=visual-studio
-import * as signalR from '@microsoft/signalr'
-import { getToken } from '@/utils/auth'
-import { ElNotification, ElMessage, ElMessageBox } from 'element-plus'
-import useSocketStore from '@/store/modules/socket'
-import useUserStore from '@/store/modules/user'
-import { webNotify } from './index'
-export default {
- // signalR对象
- SR: {},
- // 失败连接重试次数
- failNum: 4,
- init(url) {
- var socketUrl = window.location.origin + url
- const connection = new signalR.HubConnectionBuilder()
- .withUrl(socketUrl, { accessTokenFactory: () => getToken() })
- .withAutomaticReconnect() //自动重新连接
- .configureLogging(signalR.LogLevel.Warning)
- .build()
- this.SR = connection
- // 断线重连
- connection.onclose(async (error) => {
- console.error('断开连接了' + error)
- console.assert(connection.state === signalR.HubConnectionState.Disconnected)
- // 建议用户重新刷新浏览器
- await this.start()
- })
-
- connection.onreconnected((connectionId) => {
- ElMessage({
- message: '与服务器通讯已连接成功',
- type: 'success',
- duration: 2000
- })
- console.log('断线重新连接成功' + connectionId)
- })
-
- connection.onreconnecting(async () => {
- console.log('断线重新连接中... ')
-
- await this.start()
- })
-
- this.receiveMsg(connection)
- // 启动
- // this.start();
- },
- /**
- * 调用 this.signalR.start().then(async () => { await this.SR.invoke("method")})
- * @returns
- */
- async start() {
- try {
- console.log('signalR-1', this.SR.state)
- //使用async和await 或 promise的then 和catch 处理来自服务端的异常
- if (this.SR.state === signalR.HubConnectionState.Disconnected) {
- await this.SR.start()
- }
-
- console.log('signalR-2', this.SR.state)
- return true
- } catch (error) {
- console.error(error)
- this.failNum--
- // console.log(`失败重试剩余次数${that.failNum}`, error)
- if (this.failNum > 0 && this.SR.state.Disconnected) {
- setTimeout(async () => {
- await this.start()
- }, 5000)
- }
- return false
- }
- },
- // 接收消息处理
- receiveMsg(connection) {
- connection.on('onlineNum', (data) => {
- useSocketStore().setOnlineUsers(data)
- })
- // 接收欢迎语
- connection.on('welcome', (data) => {
- ElNotification.info(data)
- })
- connection.on('connId', (data) => {
- // useUserStore().saveConnId(data)
- })
- // 接收后台手动推送消息
- connection.on('receiveNotice', (title, data) => {
- ElNotification({
- type: 'info',
- title: title,
- message: data,
- dangerouslyUseHTMLString: true,
- duration: 0
- })
- webNotify({ title: title, body: data })
- })
- // 接收系统通知/公告
- connection.on('moreNotice', (data) => {
- if (data.code == 200) {
- useSocketStore().setNoticeList(data.data)
- }
- })
-
- // 接收在线用户
- // connection.on('onlineUser', (data) => {
- // useSocketStore().setOnlineUsers(data)
- // })
-
- // 接收封锁通知
- connection.on('lockUser', (data) => {
- ElMessageBox.alert(`你的账号已被锁定,剩余,${data.time}分,原因:${data.reason || '-'}`, '提示', {
- confirmButtonText: '确定',
- callback: (action) => {
- useUserStore()
- .logOut()
- .then(() => {
- var redirectUrl = window.location.pathname
- if (location.pathname.indexOf('/login') != 0) {
- location.href = import.meta.env.VITE_APP_ROUTER_PREFIX + 'index?redirect=' + redirectUrl
- }
- })
- }
- })
- })
- // 接收聊天数据
- connection.on('receiveChat', (data) => {
- const title = `来自${data.userName}的消息通知`
- useSocketStore().setChat(data)
-
- if (data.userid != useUserStore().userId) {
- ElNotification({
- title: title,
- message: data.message,
- type: 'success',
- duration: 3000
- })
- }
- webNotify({ title: title, body: data.message })
- })
-
- connection.on('onlineInfo', (data) => {
- console.log('onlineInfo', data)
- useSocketStore().getOnlineInfo(data)
- })
-
- connection.on('logOut', () => {
- useUserStore()
- .logOut()
- .then(() => {
- ElMessageBox.alert(`你的账号已在其他设备登录,如果不是你的操作请尽快修改密码`, '提示', {
- confirmButtonText: '确定',
- callback: () => {
- location.href = import.meta.env.VITE_APP_ROUTER_PREFIX + 'index'
- }
- })
- })
- })
- }
-}
diff --git a/src/views/error/Error.vue b/src/views/error/Error.vue
new file mode 100644
index 0000000..64505cf
--- /dev/null
+++ b/src/views/error/Error.vue
@@ -0,0 +1,69 @@
+
+
+
+
+ 提示!
+ {{ msgObj.msg }}
+
+
+ 回首页
+
+
+
+
+
+
+
+
+
+
+
+