浏览代码

升级优化Furion内置的日志审计

zuohuaijun 3 年之前
父节点
当前提交
91a0912a0e

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -21,7 +21,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysConfig/pageList")]
+    [HttpGet("/sysConfig/page")]
     public async Task<SqlSugarPagedList<SysConfig>> GetConfigPageList([FromQuery] PageConfigInput input)
     {
         return await _sysConfigRep.AsQueryable()

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -19,7 +19,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysDictData/pageList")]
+    [HttpGet("/sysDictData/page")]
     public async Task<SqlSugarPagedList<SysDictData>> GetDictDataPageList([FromQuery] PageDictDataInput input)
     {
         var code = !string.IsNullOrEmpty(input.Code?.Trim());

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -21,7 +21,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// 获取字典类型分页列表
     /// </summary>
     /// <returns></returns>
-    [HttpGet("/sysDictType/pageList")]
+    [HttpGet("/sysDictType/page")]
     public async Task<SqlSugarPagedList<SysDictType>> GetDictTypePageList([FromQuery] PageDictTypeInput input)
     {
         var code = !string.IsNullOrEmpty(input.Code?.Trim());

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -33,7 +33,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysFile/pageList")]
+    [HttpGet("/sysFile/page")]
     public async Task<SqlSugarPagedList<SysFile>> QueryFilePageList([FromQuery] PageFileInput input)
     {
         var files = await _sysFileRep.AsQueryable()

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -36,7 +36,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysRole/pageList")]
+    [HttpGet("/sysRole/page")]
     public async Task<SqlSugarPagedList<SysRole>> GetRolePageList([FromQuery] PageRoleInput input)
     {
         return await _sysRoleRep.AsQueryable()

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Timer/SysTimerService.cs

@@ -21,7 +21,7 @@ public class SysTimerService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysTimer/pageList")]
+    [HttpGet("/sysTimer/page")]
     public async Task<SqlSugarPagedList<TimerOutput>> GetTimerPageList([FromQuery] PageTimerInput input)
     {
         var workers = SpareTime.GetWorkers().ToList();

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs

@@ -36,7 +36,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet("/sysUser/pageList")]
+    [HttpGet("/sysUser/page")]
     public async Task<SqlSugarPagedList<SysUser>> GetUserPageList([FromQuery] PageUserInput input)
     {
         var orgList = input.OrgId > 0 ? await _sysOrgService.GetChildIdListWithSelfById(input.OrgId) : null;

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/log/SysDiffLogService.cs

@@ -17,7 +17,7 @@ public class SysDiffLogService : IDynamicApiController, ITransient
     /// 获取差异日志分页列表
     /// </summary>
     /// <returns></returns>
-    [HttpGet("/sysDiffLog/pageList")]
+    [HttpGet("/sysDiffLog/page")]
     [NotLog]
     public async Task<SqlSugarPagedList<SysLogDiff>> GetDiffLogList([FromQuery] PageLogInput input)
     {

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/log/SysExLogService.cs

@@ -17,7 +17,7 @@ public class SysExLogService : IDynamicApiController, ITransient
     /// 获取异常日志分页列表
     /// </summary>
     /// <returns></returns>
-    [HttpGet("/sysExLog/pageList")]
+    [HttpGet("/sysExLog/page")]
     [NotLog]
     public async Task<SqlSugarPagedList<SysLogEx>> GetExLogList([FromQuery] PageLogInput input)
     {

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/log/SysOpLogService.cs

@@ -17,7 +17,7 @@ public class SysOpLogService : IDynamicApiController, ITransient
     /// 获取操作日志分页列表
     /// </summary>
     /// <returns></returns>
-    [HttpGet("/sysOpLog/pageList")]
+    [HttpGet("/sysOpLog/page")]
     [NotLog]
     public async Task<SqlSugarPagedList<SysLogOp>> GetOpLogList([FromQuery] PageLogInput input)
     {

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/log/SysVisLogService.cs

@@ -17,7 +17,7 @@ public class SysVisLogService : IDynamicApiController, ITransient
     /// 获取访问日志分页列表
     /// </summary>
     /// <returns></returns>
-    [HttpGet("/sysVisLog/pageList")]
+    [HttpGet("/sysVisLog/page")]
     [NotLog]
     public async Task<SqlSugarPagedList<SysLogVis>> GetVisLogList([FromQuery] PageLogInput input)
     {

+ 2 - 2
Vben2/.env

@@ -2,7 +2,7 @@
 VITE_PORT = 3100
 
 # spa-title
-VITE_GLOB_APP_TITLE = Admin_NET
+VITE_GLOB_APP_TITLE = Admin.NET
 
 # spa shortname
-VITE_GLOB_APP_SHORT_NAME = Admin_NET
+VITE_GLOB_APP_SHORT_NAME = Admin.NET

+ 12 - 12
Vben2/src/api/sys/admin.ts

@@ -5,10 +5,9 @@ enum Api {
   IsAccountExist = '/system/accountExist',
 
   // 用户接口
-  UserPageList = '/sysUser/pageList',
+  UserPageList = '/sysUser/page',
   AddUser = '/sysUser/add',
   DeleteUser = '/sysUser/delete',
-  GetDatabaseList = '/codeGenerate/DatabaseList',
   UpdateUser = '/sysUser/update',
   SetUserStatus = '/sysUser/setStatus',
   GrantUserRole = '/sysUser/grantRole',
@@ -19,7 +18,7 @@ enum Api {
   UserOwnOrgList = '/sysUser/ownOrg',
 
   // 角色接口
-  RolePageList = '/sysRole/pageList',
+  RolePageList = '/sysRole/page',
   RoleList = '/sysRole/list',
   AddRole = '/sysRole/add',
   DeleteRole = '/sysRole/delete',
@@ -50,29 +49,29 @@ enum Api {
   UpdatePos = '/sysPos/update',
 
   // 日志接口
-  VislogPageList = '/sysVisLog/pageList',
+  VislogPageList = '/sysVisLog/page',
   ClearVisLog = '/sysVisLog/clear',
-  OplogPageList = '/sysOpLog/pageList',
+  OplogPageList = '/sysOpLog/page',
   ClearOpLog = '/sysOpLog/clear',
-  ExlogPageList = '/sysExLog/pageList',
+  ExlogPageList = '/sysExLog/page',
   ClearExLog = '/sysExLog/clear',
-  DifflogPageList = '/sysDiffLog/pageList',
+  DifflogPageList = '/sysDiffLog/page',
   ClearDiffLog = '/sysDiffLog/clear',
 
   // 文件接口
-  FilePageList = '/sysFile/pageList',
+  FilePageList = '/sysFile/page',
   UploadFile = '/sysFile/upload',
   DownloadFile = '/sysFile/download',
   DeleteFile = '/sysFile/delete',
 
   // 参数配置接口
-  ConfigPageList = '/sysConfig/pageList',
+  ConfigPageList = '/sysConfig/page',
   AddConfig = '/sysConfig/add',
   DeleteConfig = '/sysConfig/delete',
   UpdateConfig = '/sysConfig/update',
 
   // 定时器接口
-  TimerPageList = '/sysTimer/pageList',
+  TimerPageList = '/sysTimer/page',
   AddTimer = '/sysTimer/add',
   DeleteTimer = '/sysTimer/delete',
   UpdateTimer = '/sysTimer/update',
@@ -84,13 +83,13 @@ enum Api {
   ServerNetWork = '/server/network',
 
   // 字典接口
-  GetDictTypePageList = '/sysDictType/pageList',
+  GetDictTypePageList = '/sysDictType/page',
   GetDictTypeList = '/sysDictType/list',
   AddDictType = '/sysDictType/add',
   UpdateDictType = '/sysDictType/update',
   DeleteDictType = '/sysDictType/delete',
 
-  GetDictDataPageList = '/sysDictData/pageList',
+  GetDictDataPageList = '/sysDictData/page',
   AddDictData = '/sysDictData/add',
   UpdateDictData = '/sysDictData/update',
   DeleteDictData = '/sysDictData/delete',
@@ -98,6 +97,7 @@ enum Api {
   QueryDictDataDropdown = '/sysDictData/queryDictDataDropdown',
 
   // 数据库接口
+  GetDatabaseList = '/codeGenerate/DatabaseList',
   GetColumnInfoList = '/dataBase/columnInfoList',
   GetTableInfoList = '/dataBase/tableInfoList',
   AddTable = '/table/add',

+ 69 - 0
Vben2/src/views/sys/admin/log/oplog/OplogDrawer.vue

@@ -0,0 +1,69 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawer"
+    showFooter
+    title="操作日志"
+    width="800px"
+    @ok="handleSubmit"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicDrawer>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, unref } from 'vue';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+
+  import { formSchema } from './oplog.data';
+
+  export default defineComponent({
+    name: 'OplogDrawer',
+    components: { BasicDrawer, BasicForm },
+    emits: ['success', 'register'],
+    setup(_, { emit }) {
+      const isUpdate = ref(true);
+      let rowId: number;
+
+      const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+        labelWidth: 90,
+        schemas: formSchema,
+        showActionButtonGroup: false,
+      });
+
+      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+        resetFields();
+        setDrawerProps({ confirmLoading: false });
+        isUpdate.value = !!data?.isUpdate;
+
+        if (unref(isUpdate)) {
+          rowId = data.record.id;
+          setFieldsValue({
+            ...data.record,
+          });
+        }
+      });
+
+      async function handleSubmit() {
+        try {
+          const values = await validate();
+          setDrawerProps({ confirmLoading: true });
+
+          closeDrawer();
+          emit('success', {
+            isUpdate: unref(isUpdate),
+            values: { ...values, id: rowId },
+          });
+        } finally {
+          setDrawerProps({ confirmLoading: false });
+        }
+      }
+
+      return {
+        registerDrawer,
+        registerForm,
+        handleSubmit,
+      };
+    },
+  });
+</script>

+ 36 - 4
Vben2/src/views/sys/admin/log/oplog/index.vue

@@ -6,22 +6,38 @@
           清空日志
         </a-button>
       </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              icon: 'ant-design:eye-outlined',
+              label: '查看',
+              onClick: handleView.bind(null, record),
+            },
+          ]"
+        />
+      </template>
     </BasicTable>
+    <OplogDrawer @register="registerDrawer" />
   </div>
 </template>
 <script lang="ts">
   import { defineComponent } from 'vue';
-  import { BasicTable, useTable } from '/@/components/Table';
+  import { BasicTable, useTable, TableAction } from '/@/components/Table';
+  import { useDrawer } from '/@/components/Drawer';
   import { usePermission } from '/@/hooks/web/usePermission';
 
+  import OplogDrawer from './OplogDrawer.vue';
+
   import { columns, searchFormSchema } from './oplog.data';
   import { getOpLogPageList, clearOpLog } from '/@/api/sys/admin';
 
   export default defineComponent({
     name: 'OplogManagement',
-    components: { BasicTable },
+    components: { BasicTable, OplogDrawer, TableAction },
     setup() {
       const { hasPermission } = usePermission();
+      const [registerDrawer, { openDrawer }] = useDrawer();
       const [registerTable, { reload }] = useTable({
         title: '日志列表',
         api: getOpLogPageList,
@@ -30,15 +46,22 @@
           labelWidth: 120,
           schemas: searchFormSchema,
         },
-        striped: false,
+        rowKey: 'id',
         useSearchForm: true,
         showTableSetting: true,
         bordered: true,
         showIndexColumn: false,
-        canResize: true,
+        canResize: false,
         pagination: {
           pageSize: 10,
         },
+        actionColumn: {
+          width: 100,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          fixed: undefined,
+        },
       });
 
       async function handleClear() {
@@ -46,10 +69,19 @@
         reload();
       }
 
+      function handleView(record: Recordable) {
+        openDrawer(true, {
+          record,
+          isUpdate: true,
+        });
+      }
+
       return {
         registerTable,
+        registerDrawer,
         handleClear,
         hasPermission,
+        handleView,
       };
     },
   });

+ 38 - 60
Vben2/src/views/sys/admin/log/oplog/oplog.data.ts

@@ -5,78 +5,42 @@ import { Tag } from 'ant-design-vue';
 
 export const columns: BasicColumn[] = [
   {
-    title: '账号名称',
-    dataIndex: 'userName',
-    width: 100,
-    align: 'left',
+    title: '日志名称',
+    dataIndex: 'logName',
+    width: 200,
   },
   {
-    title: '是否成功',
-    dataIndex: 'success',
-    width: 80,
+    title: '日志级别',
+    dataIndex: 'logLevel',
+    width: 100,
     customRender: ({ record }) => {
-      const success = record.success;
-      const enable = ~~success === 1;
-      const color = enable ? 'green' : 'red';
-      const text = enable ? '成功' : '失败';
-      return h(Tag, { color: color }, () => text);
+      const logLevel = record.logLevel;
+      switch (logLevel) {
+        case 'Information':
+          return h(Tag, { color: 'green' }, () => 'Information');
+        case 'Warning':
+          return h(Tag, { color: 'orange' }, () => 'Warning');
+        case 'Error':
+          return h(Tag, { color: 'red' }, () => 'Error');
+        default:
+          return h(Tag, { color: 'blue' }, () => '未知');
+      }
     },
   },
   {
-    title: 'IP地址',
-    dataIndex: 'ip',
-    width: 100,
-  },
-  {
-    title: '地址',
-    dataIndex: 'location',
-    width: 100,
-  },
-  {
-    title: '浏览器',
-    dataIndex: 'browser',
-    width: 100,
-  },
-  {
-    title: '操作系统',
-    dataIndex: 'os',
-    width: 100,
-  },
-  {
-    title: '请求地址',
-    dataIndex: 'url',
-    width: 200,
-  },
-  {
-    title: '类名',
-    dataIndex: 'className',
-    width: 200,
+    title: '事件Id',
+    dataIndex: 'eventId',
+    width: 150,
   },
   {
-    title: '方法名',
-    dataIndex: 'methodName',
-    width: 200,
-  },
-  {
-    title: '请求方式',
-    dataIndex: 'reqMethod',
-    width: 80,
+    title: '日志消息',
+    dataIndex: 'message',
   },
   {
-    title: '请求参数',
-    dataIndex: 'param',
+    title: '异常对象',
+    dataIndex: 'exception',
     width: 200,
   },
-  {
-    title: '返回结果',
-    dataIndex: 'result',
-    width: 300,
-  },
-  {
-    title: '耗时',
-    dataIndex: 'elapsedTime',
-    width: 50,
-  },
   {
     title: '操作时间',
     dataIndex: 'createTime',
@@ -98,3 +62,17 @@ export const searchFormSchema: FormSchema[] = [
     colProps: { span: 8 },
   },
 ];
+
+export const formSchema: FormSchema[] = [
+  {
+    label: '',
+    field: 'message',
+    component: 'InputTextArea',
+    //dynamicDisabled: true,
+    colProps: { span: 24 },
+    componentProps: {
+      placeholder: '',
+      rows: 200,
+    },
+  },
+];