Browse Source

✨ 前端用户退出时,关闭SignalR连接

pull/39/head
王军 5 years ago
parent
commit
c51bbfcf70
  1. 17
      vben271/src/hooks/web/useSignalR.ts
  2. 10
      vben271/src/router/index.ts
  3. 4
      vben271/src/store/modules/user.ts

17
vben271/src/hooks/web/useSignalR.ts

@ -1,12 +1,13 @@
import * as signalR from '@microsoft/signalr'; import * as signalR from '@microsoft/signalr';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { useUserStoreWithOut } from '/@/store/modules/user'; import { useUserStoreWithOut } from '/@/store/modules/user';
let connection;
export function useSignalR() { export function useSignalR() {
/** /**
* 开始连接SignalR * 开始连接SignalR
*/ */
function startConnect(): void { function startConnect(): void {
let connection = connectionsignalR(); connection = connectionsignalR();
//接收普通文本消息 //接收普通文本消息
connection.on('ReceiveTextMessageAsync', ReceiveTextMessageHandlerAsync); connection.on('ReceiveTextMessageAsync', ReceiveTextMessageHandlerAsync);
//接收广播消息 //接收广播消息
@ -14,16 +15,24 @@ export function useSignalR() {
//开始连接 //开始连接
connection.start(); connection.start();
} }
/**
* 关闭SignalR连接
*/
function closeConnect(): void {
if (connection) {
connection.stop();
}
}
/** /**
* 连接signalr * 连接signalr
*/ */
function connectionsignalR(): signalR.HubConnection { function connectionsignalR() {
const userStore = useUserStoreWithOut(); const userStore = useUserStoreWithOut();
const token = userStore.getToken; const token = userStore.getToken;
const url = (import.meta.env.VITE_WEBSOCKE_URL as string) + '/signalr/notification'; const url = (import.meta.env.VITE_WEBSOCKE_URL as string) + '/signalr/notification';
const connection = new signalR.HubConnectionBuilder() connection = new signalR.HubConnectionBuilder()
.withUrl(url, { .withUrl(url, {
accessTokenFactory: () => token, accessTokenFactory: () => token,
skipNegotiation: true, skipNegotiation: true,
@ -78,5 +87,5 @@ export function useSignalR() {
}); });
} }
return { startConnect }; return { startConnect, closeConnect };
} }

10
vben271/src/router/index.ts

@ -1,8 +1,8 @@
import { createWebHistory, RouteRecordRaw } from 'vue-router'; import { createWebHistory, RouteRecordRaw } from "vue-router";
import type { App } from 'vue'; import type { App } from "vue";
import { createRouter, createWebHashHistory } from 'vue-router'; import { createRouter, createWebHashHistory } from "vue-router";
import { basicRoutes } from './routes'; import { basicRoutes } from "./routes";
// 白名单应该包含基本静态路由 // 白名单应该包含基本静态路由
const WHITE_NAME_LIST: string[] = []; const WHITE_NAME_LIST: string[] = [];
@ -18,7 +18,7 @@ export const router = createRouter({
history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH), history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH),
routes: basicRoutes as unknown as RouteRecordRaw[], routes: basicRoutes as unknown as RouteRecordRaw[],
strict: true, strict: true,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: () => ({ left: 0, top: 0 })
}); });
// reset router // reset router

4
vben271/src/store/modules/user.ts

@ -20,7 +20,7 @@ import { router } from '/@/router';
import { usePermissionStore } from '/@/store/modules/permission'; import { usePermissionStore } from '/@/store/modules/permission';
import { LoginInput } from '/@/services/ServiceProxies'; import { LoginInput } from '/@/services/ServiceProxies';
import jwt_decode from 'jwt-decode'; import jwt_decode from 'jwt-decode';
import { useSignalR } from '/@/hooks/web/useSignalR';
import { useOidcLogout } from '/@/views/sys/login/useLogin'; import { useOidcLogout } from '/@/views/sys/login/useLogin';
interface UserState { interface UserState {
userInfo: Nullable<UserInfo>; userInfo: Nullable<UserInfo>;
@ -223,6 +223,8 @@ export const useUserStore = defineStore({
content: t('sys.app.logoutMessage'), content: t('sys.app.logoutMessage'),
onOk: async () => { onOk: async () => {
await this.logout(true); await this.logout(true);
const { closeConnect } = useSignalR();
closeConnect();
}, },
}); });
}, },

Loading…
Cancel
Save