Kaynağa Gözat

优化登录日志

hongrunxia 6 gün önce
ebeveyn
işleme
f48147cc7f

+ 7 - 0
src/router/guard/permissionGuard.ts

@@ -18,6 +18,7 @@ import _ from 'lodash';
 import { MOCK_LOGIN_URL_QUERY, SKIP_SSO_URL_QUERY } from '../constant';
 import { useSso } from '/@/hooks/web/useSso';
 import { useAutoLogin } from '/@/hooks/vent/useAutoLogin';
+import { addBrowseLog } from '@/router/helper/menuHelper';
 
 const LOGIN_PATH = PageEnum.BASE_LOGIN;
 //auth2登录路由
@@ -249,6 +250,7 @@ export function createPermissionGuard(router: Router) {
       // mountMicroApp(to.path);
       next();
       document.title = to.meta.title;
+
       return;
     }
 
@@ -274,4 +276,9 @@ export function createPermissionGuard(router: Router) {
       document.title = '';
     }
   });
+
+  router.afterEach(async (to, from) => {
+    await addBrowseLog(to, from);
+    // await addBrowseOuterLog(from);
+  });
 }

+ 58 - 0
src/router/helper/menuHelper.ts

@@ -5,7 +5,9 @@ import { cloneDeep } from 'lodash-es';
 import { isUrl } from '/@/utils/is';
 import { RouteParams } from 'vue-router';
 import { toRaw } from 'vue';
+import { defHttp } from '/@/utils/http/axios';
 
+let currentRouter = '';
 export function getAllParentPath<T = Recordable>(treeData: T[], path: string) {
   const menuList = findPath(treeData, (n) => n.path === path) as Menu[];
   return (menuList || []).map((item) => item.path);
@@ -95,3 +97,59 @@ export function configureDynamicParamsMenu(menu: Menu, params: RouteParams) {
   // children
   menu.children?.forEach((item) => configureDynamicParamsMenu(item, params));
 }
+
+export async function addBrowseLog(to, from) {
+  let currentBrowseId = '';
+  if (to.path !== '/sys/log/addBrowseLog') {
+    const url = '/sys/log/addBrowseLog';
+
+    // 生成时间戳函数
+    const formatTimestamp = () => {
+      const date = new Date();
+      return [
+        date.getFullYear(),
+        String(date.getMonth() + 1).padStart(2, '0'),
+        String(date.getDate()).padStart(2, '0'),
+        String(date.getHours()).padStart(2, '0'),
+        String(date.getMinutes()).padStart(2, '0'),
+        String(date.getSeconds()).padStart(2, '0'),
+        String(date.getMilliseconds()).padStart(3, '0'),
+      ].join('');
+    };
+    // 2. 记录新页面进入日志
+    currentBrowseId = formatTimestamp();
+    if (!currentRouter) {
+      currentRouter = to.fullPath;
+      try {
+        await defHttp.post({
+          url,
+          params: {
+            browseId: currentBrowseId,
+            isEnd: false,
+            method: to.fullPath,
+          },
+        });
+        console.log('进入页面日志记录成功');
+      } catch (e) {
+        console.error('进入页面日志记录失败:', e);
+      }
+    } else {
+      if (from.fullPath === currentRouter) {
+        try {
+          currentRouter = '';
+          await defHttp.post({
+            url,
+            params: {
+              browseId: currentBrowseId,
+              isEnd: true,
+              method: from.fullPath,
+            },
+          });
+          console.log('进入页面日志记录成功');
+        } catch (e) {
+          console.error('进入页面日志记录失败:', e);
+        }
+      }
+    }
+  }
+}

+ 1 - 1
src/router/index.ts

@@ -2,7 +2,7 @@ import type { RouteRecordRaw } from 'vue-router';
 import type { App } from 'vue';
 import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router';
 import { basicRoutes } from './routes';
-import { defHttp } from '/@/utils/http/axios';
+
 // let userName = unref(userStore.getUserInfo).username;
 // 白名单应该包含基本静态路由
 const WHITE_NAME_LIST: string[] = [];

+ 2 - 3
src/views/monitor/log/index.vue

@@ -2,8 +2,8 @@
   <BasicTable @register="registerTable" :searchInfo="searchInfo" :columns="logColumns">
     <template #tableTitle>
       <a-tabs defaultActiveKey="1" @change="tabChange" size="small">
-        <a-tab-pane tab="登录日志" key="1"></a-tab-pane>
-        <!-- <a-tab-pane tab="操作日志" key="2"></a-tab-pane> -->
+        <a-tab-pane tab="登录日志" key="1" />
+        <a-tab-pane tab="操作日志" key="2" />
       </a-tabs>
     </template>
     <template #expandedRowRender="{ record }">
@@ -38,7 +38,6 @@
     tableProps: {
       title: '日志列表',
       api: getLogList,
-      expandRowByClick: true,
       showActionColumn: false,
       rowSelection: {
         columnWidth: 20,

+ 45 - 45
src/views/monitor/logRouter/index.vue

@@ -2,62 +2,62 @@
   <BasicTable @register="registerTable" :searchInfo="searchInfo" :columns="logColumns">
     <template #tableTitle>
       <a-tabs defaultActiveKey="1" @change="tabChange" size="small">
-        <a-tab-pane tab="浏览器日志" key="1"></a-tab-pane>
+        <a-tab-pane tab="浏览器日志" key="1" />
       </a-tabs>
     </template>
   </BasicTable>
 </template>
 <script lang="ts" name="monitor-log" setup>
-import { ref } from 'vue';
-import { BasicTable, useTable, TableAction } from '/@/components/Table';
-import { getLogList } from './log.api';
-import { columns, searchFormSchema } from './log.data';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { useListPage } from '/@/hooks/system/useListPage';
-const { createMessage } = useMessage();
-const checkedKeys = ref<Array<string | number>>([]);
+  import { ref } from 'vue';
+  import { BasicTable, useTable, TableAction } from '/@/components/Table';
+  import { getLogList } from './log.api';
+  import { columns, searchFormSchema } from './log.data';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  const { createMessage } = useMessage();
+  const checkedKeys = ref<Array<string | number>>([]);
 
-const logColumns = ref<any>(columns);
-const searchInfo = { logType: '3' };
-// 列表页面公共参数、方法
-const { prefixCls, tableContext } = useListPage({
-  designScope: 'user-list',
-  tableProps: {
-    title: '日志列表',
-    api: getLogList,
-    expandRowByClick: true,
-    showActionColumn: false,
-    rowSelection: {
-      columnWidth: 20,
+  const logColumns = ref<any>(columns);
+  const searchInfo = { logType: '3' };
+  // 列表页面公共参数、方法
+  const { prefixCls, tableContext } = useListPage({
+    designScope: 'user-list',
+    tableProps: {
+      title: '日志列表',
+      api: getLogList,
+      expandRowByClick: true,
+      showActionColumn: false,
+      rowSelection: {
+        columnWidth: 20,
+      },
+      formConfig: {
+        schemas: searchFormSchema,
+        fieldMapToTime: [['fieldTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD']],
+      },
     },
-    formConfig: {
-      schemas: searchFormSchema,
-      fieldMapToTime: [['fieldTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD']],
-    },
-  },
-});
+  });
 
-const [registerTable, { reload }] = tableContext;
+  const [registerTable, { reload }] = tableContext;
 
-// 日志类型
-function tabChange(key) {
-  searchInfo.logType = key;
-  if (key == '3') {
-    logColumns.value = columns;
+  // 日志类型
+  function tabChange(key) {
+    searchInfo.logType = key;
+    if (key == '3') {
+      logColumns.value = columns;
+    }
+    reload();
   }
-  reload();
-}
 
-/**
- * 选择事件
- */
-function onSelectChange(selectedRowKeys: (string | number)[]) {
-  checkedKeys.value = selectedRowKeys;
-}
+  /**
+   * 选择事件
+   */
+  function onSelectChange(selectedRowKeys: (string | number)[]) {
+    checkedKeys.value = selectedRowKeys;
+  }
 </script>
 <style lang="less" scoped>
-::v-deep .table-form {
-  padding: 0 !important;
-  margin: 0 !important;
-}
+  ::v-deep .table-form {
+    padding: 0 !important;
+    margin: 0 !important;
+  }
 </style>

+ 0 - 17
src/views/vent/monitorManager/gateMonitor/gate.threejs.ts

@@ -547,23 +547,6 @@ export const mountedThree = (playerDom) => {
         fmXr.mountedThree(playerDom);
         resolve(null);
         break;
-      case 'zmjthjg': //黄家沟
-        const FmNoSubStation = await import('./gate.threejs.noStation');
-        if (FmNoSubStation) fm3 = new FmNoSubStation.default(model);
-        if (fm3) fm3.mountedThree(playerDom);
-        fmXr = new FmXR(model);
-        fmXr.mountedThree(playerDom);
-        resolve(null);
-        break;
-      case 'gsgszdek': //准东二矿
-        fmWindowHjg = new FmDc(model);
-        if (fmWindowHjg) fmWindowHjg.mountedThree(playerDom);
-        fm3 = new Fm3(model);
-        fm3.mountedThree(playerDom);
-        fmXr = new FmXR(model);
-        fmXr.mountedThree(playerDom);
-        resolve(null);
-        break;
       default:
         // 根据字典加载模型
         const dictCodes = getDictItemsByCode('gateStyle');