diff --git a/Web/src/views/system/onlineUser/component/sendMessage.vue b/Web/src/views/system/onlineUser/component/sendMessage.vue index 09f941cb..e2028404 100644 --- a/Web/src/views/system/onlineUser/component/sendMessage.vue +++ b/Web/src/views/system/onlineUser/component/sendMessage.vue @@ -62,11 +62,11 @@ const openDialog = (row: any) => { var receiveUser = JSON.parse(JSON.stringify(row)); state.ruleForm.receiveUserId = receiveUser.userId; - state.ruleForm.receiveUserName = receiveUser.realName; + state.ruleForm.receiveUserName = receiveUser.realName; state.ruleForm.connectionId = receiveUser.connectionId; - + state.ruleForm.sendUserId = userInfos.value.id; - state.ruleForm.sendUserName = userInfos.value.realName; + state.ruleForm.sendUserName = userInfos.value.realName; state.ruleForm.sendTime = formatDate(new Date(), 'YYYY-mm-dd HH:MM:SS'); state.isShowDialog = true; }; diff --git a/Web/src/views/system/onlineUser/index.vue b/Web/src/views/system/onlineUser/index.vue index 87cc72c5..46e184c9 100644 --- a/Web/src/views/system/onlineUser/index.vue +++ b/Web/src/views/system/onlineUser/index.vue @@ -1,54 +1,67 @@ @@ -56,17 +69,19 @@ import { onMounted, reactive, ref } from 'vue'; import { ElMessageBox, ElNotification } from 'element-plus'; import { throttle } from 'lodash-es'; +import { signalR } from './signalR'; +import { VxeGridInstance, VxePagerEvents, VxePagerDefines } from 'vxe-table'; +import { useVxeTable } from '/@/hooks/vxeTableOptionsHook'; + import SendMessage from '/@/views/system/onlineUser/component/sendMessage.vue'; import { getAPI, clearAccessTokens } from '/@/utils/axios-utils'; import { SysOnlineUserApi, SysAuthApi } from '/@/api-services/api'; import { SysOnlineUser } from '/@/api-services/models'; -import { signalR } from './signalR'; - +const xGrid = ref(); const sendMessageRef = ref>(); const state = reactive({ - loading: false, isVisible: false, queryParams: { userName: undefined, @@ -74,8 +89,11 @@ const state = reactive({ }, tableParams: { page: 1, - pageSize: 10, - total: 1 as any, + pageSize: 50, + field: 'id', // 默认的排序字段 + order: 'aes', // 排序方向 + descStr: 'desc', // 降序排序的关键字符 + total: 0 as any, }, onlineUserList: [] as Array, // 在线用户列表 lastUserState: { @@ -84,6 +102,27 @@ const state = reactive({ }, // 最后接收的用户变更状态信息 }); +// 表格参数配置 +const options = useVxeTable({ + id: 'sysOnlineUser', + name: '在线用户', + columns: [ + // { type: 'checkbox', width: 40, fixed: 'left' }, + { type: 'seq', title: '序号', width: 50, fixed: 'left' }, + { field: 'userName', title: '账号', minWidth: 110, showOverflow: 'tooltip' }, + { field: 'realName', title: '姓名', minWidth: 110, showOverflow: 'tooltip' }, + { field: 'ip', title: 'IP地址', minWidth: 100, showOverflow: 'tooltip' }, + { field: 'browser', title: '浏览器', minWidth: 160, showOverflow: 'tooltip' }, + // { field: 'connectionId', title: '连接Id', minWidth: 160, showOverflow: 'tooltip', sortable: true }, + { field: 'time', title: '登录时间', minWidth: 120, showOverflow: 'tooltip' }, + { title: '操作', fixed: 'right', width: 100, showOverflow: true, slots: { default: 'row_buttons' } }, + ], + enableExport: true, + searchCallback: () => handleQuery(), + queryAllCallback: () => fetchData({ pageSize: 99999 }), +}); + +// 页面初始化 onMounted(async () => { // 在线用户列表 signalR.off('OnlineUserList'); @@ -95,7 +134,6 @@ onMounted(async () => { }; notificationThrottle(); }); - // 强制下线 signalR.off('ForceOffline'); signalR.on('ForceOffline', async (data: any) => { @@ -131,13 +169,19 @@ const openDrawer = () => { }; // 查询操作 -const handleQuery = async () => { - state.loading = true; - let params = Object.assign(state.queryParams, state.tableParams); - var res = await getAPI(SysOnlineUserApi).apiSysOnlineUserPagePost(params); - state.onlineUserList = res.data.result?.items ?? []; +const handleQuery = async (reset = false) => { + options.loading = true; + if (reset) state.tableParams.page = 1; + var res = await fetchData(null); + xGrid.value?.loadData(res.data.result?.items ?? []); state.tableParams.total = res.data.result?.total; - state.loading = false; + options.loading = false; +}; + +// 获取数据 +const fetchData = async (tableParams: any) => { + let params = Object.assign(state.queryParams, state.tableParams, tableParams); + return getAPI(SysOnlineUserApi).apiSysOnlineUserPagePost(params); }; // 重置操作 @@ -148,9 +192,9 @@ const resetQuery = () => { }; // 发送消息 -const openSendMessage = (row: any)=>{ +const openSendMessage = (row: any) => { sendMessageRef.value?.openDialog(row); -} +}; // 强制下线 const forceOffline = async (row: any) => { @@ -167,18 +211,38 @@ const forceOffline = async (row: any) => { .catch(() => {}); }; -// 改变页面容量 -const handleSizeChange = (val: number) => { - state.tableParams.pageSize = val; +// 改变页码序号或页面容量 +const pageChange: VxePagerEvents.PageChange = ({ currentPage, pageSize }: VxePagerDefines.PageChangeEventParams) => { + state.tableParams.page = currentPage; + state.tableParams.pageSize = pageSize; handleQuery(); }; -// 改变页码序号 -const handleCurrentChange = (val: number) => { - state.tableParams.page = val; +// 列排序 +const sortChange = (options: any) => { + state.tableParams.field = options.field; + state.tableParams.order = options.order; handleQuery(); }; // 导出对象 defineExpose({ openDrawer }); + + diff --git a/Web/src/views/system/onlineUser/signalR.ts b/Web/src/views/system/onlineUser/signalR.ts index 91bd7600..18837e52 100644 --- a/Web/src/views/system/onlineUser/signalR.ts +++ b/Web/src/views/system/onlineUser/signalR.ts @@ -20,10 +20,12 @@ connection.serverTimeoutInMilliseconds = 30 * 60 * 1000; // 超时时间30m connection.start().then(() => { console.log('启动连接'); }); + // 断开连接 connection.onclose(async () => { console.log('断开连接'); }); + // 重连中 connection.onreconnecting(() => { ElNotification({ @@ -33,6 +35,7 @@ connection.onreconnecting(() => { position: 'bottom-right', }); }); + // 重连成功 connection.onreconnected(() => { console.log('重连成功'); @@ -41,7 +44,7 @@ connection.onreconnected(() => { connection.on('OnlineUserList', () => {}); // 接收消息 -connection.on("ReceiveMessage", (message: any)=>{ +connection.on('ReceiveMessage', (message: any) => { var tmpMsg = `${message.message}
`; tmpMsg += `

发送人员:${message.sendUserName}

`; tmpMsg += `

发送时间:${message.sendTime}

`; @@ -52,7 +55,7 @@ connection.on("ReceiveMessage", (message: any)=>{ type: 'info', position: 'top-right', dangerouslyUseHTMLString: true, - duration: 0 + duration: 0, }); });