Procházet zdrojové kódy

增加操作日志统计前后端

xusl před 2 roky
rodič
revize
05e127e1cd

+ 57 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysOperlogController.java

@@ -7,6 +7,7 @@ import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.annotation.OperateLog;
 import com.jiayue.ssi.backenum.AuditType;
 import com.jiayue.ssi.backenum.BusinessType;
+import com.jiayue.ssi.entity.SysLogininfor;
 import com.jiayue.ssi.entity.SysOperLog;
 import com.jiayue.ssi.service.SysOperLogService;
 import com.jiayue.ssi.util.DateUtils;
@@ -17,6 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * 操作日志记录
  *
@@ -142,4 +146,57 @@ public class SysOperlogController {
             return ResponseVO.error(e);
         }
     }
+    /**
+     * 操作日志统计分析
+     *
+     * @return 列表信息
+     */
+    @GetMapping(value = "/sysOperlogTotal")
+    @PreAuthorize("@ss.hasPermi('auditManager:sysOperlogTotal:list')")
+    public ResponseVO sysOperlogTotal(String startLoginTime,String endLoginTime) {
+        try {
+            QueryWrapper<SysOperLog> wrapper = new QueryWrapper<>();
+            if (StringUtils.isNotEmpty(startLoginTime)) {
+                wrapper.ge("oper_time", DateUtils.getDayStartTime(DateUtil.parseDate(startLoginTime)));
+            }
+            if (StringUtils.isNotEmpty(endLoginTime)) {
+                wrapper.le("oper_time", DateUtils.getDayLastTime(DateUtil.parseDate(endLoginTime)));
+            }
+            List<SysOperLog> sysOperLogList = sysOperLogService.list(wrapper);
+            Map<String,List<SysOperLog>> map = sysOperLogList.stream().collect(Collectors.groupingBy(item->DateUtil.format(item.getOperTime(),"yyyy-MM-dd")));
+            List<Map<String,String>> resultList = new ArrayList<>();
+            map.forEach((key,value)->{
+                List<SysOperLog> list = value;
+                Map<String,String> recordMap = new HashMap<>();
+                recordMap.put("day",key);
+                // 系统类型统计
+                List<SysOperLog> sysTypeList = list.stream().filter(sysOperLog->sysOperLog.getAuditType()==0).collect(Collectors.toList());
+                recordMap.put("syscount",sysTypeList.size()+"");
+                // 业务类型统计
+                List<SysOperLog> bizTypeList = list.stream().filter(sysOperLog->sysOperLog.getAuditType()==1).collect(Collectors.toList());
+                recordMap.put("bizcount",bizTypeList.size()+"");
+                // 操作成功统计
+                List<SysOperLog> successList = list.stream().filter(sysOperLog->sysOperLog.getStatus()==0).collect(Collectors.toList());
+                recordMap.put("success",successList.size()+"");
+                // 操作失败统计
+                List<SysOperLog> failList = list.stream().filter(sysOperLog->sysOperLog.getStatus()==1).collect(Collectors.toList());
+                recordMap.put("fail",failList.size()+"");
+                // 操作ip个数统计
+                int ips = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s -> s.getOperIp()))), ArrayList::new)).size();
+                recordMap.put("ips",ips+"");
+                resultList.add(recordMap);
+            });
+            Collections.sort(resultList, new Comparator<Map<String, String>>() {
+                @Override
+                public int compare(Map<String, String> o1, Map<String, String> o2) {
+                    return o1.get("day").compareTo(o2.get("day"));
+                }
+            });
+            return ResponseVO.success(resultList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取操作日志统计列表异常");
+            return ResponseVO.error(null);
+        }
+    }
 }

+ 1 - 1
ui/src/views/auditManager/logininforTotal/index.vue

@@ -36,7 +36,7 @@
         <vxe-table-column field="count" title="登录总次数"/>
         <vxe-table-column field="success" title="成功次数"/>
         <vxe-table-column field="fail" title="失败次数"/>
-        <vxe-table-column field="ips" title="ip数"/>
+        <vxe-table-column field="ips" title="ip数"/>
       </vxe-table>
     </div>
   </div>

+ 123 - 0
ui/src/views/auditManager/operlogTotal/index.vue

@@ -0,0 +1,123 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="登录时间">
+        <el-date-picker
+          v-model="dateRange"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+      </el-form-item>
+    </el-form>
+
+    <div style="padding-top: 10px">
+      <vxe-table
+        ref="tables"
+        :loading="loading"
+        align="center"
+        class="mytable-style"
+        auto-resize
+        border
+        resizable
+        export-config
+        highlight-current-row
+        show-overflow
+        max-height="700"
+        :data="list"
+      >
+        <vxe-table-column field="day" title="日期"/>
+        <vxe-table-column field="syscount" title="系统类型次数"/>
+        <vxe-table-column field="bizcount" title="业务类型次数"/>
+        <vxe-table-column field="success" title="成功次数"/>
+        <vxe-table-column field="fail" title="失败次数"/>
+        <vxe-table-column field="ips" title="ip次数"/>
+      </vxe-table>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import {debounce} from "lodash";
+
+export default {
+  name: "Logininfor",
+  data() {
+    return {
+      showTable: true,
+      // 遮罩层
+      loading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 选择用户名
+      selectName: "",
+      // 显示搜索条件
+      showSearch: true,
+      // 表格数据
+      list: [],
+      // 日期范围
+      dateRange: [],
+      // 默认排序
+      defaultSort: {prop: 'loginTime', order: 'descending'},
+      // 查询参数
+      queryParams: {
+      },
+      sortOrder: 'loginTime&asc',
+    };
+  },
+  created() {
+  },
+  methods: {
+    /** 查询登录日志列表 */
+    getList:debounce(function(){
+      if (this.dateRange == null || this.dateRange.length==0) {
+        this.$message({
+          type: 'warning',
+          message: '请选择统计时间范围!'
+        });
+        return
+      }
+      let dateDiff = new Date(this.dateRange[1]).getTime()-new Date(this.dateRange[0]).getTime()
+      let dayDiff = Math.ceil(dateDiff/(24*3600*1000))
+      if (dayDiff>31){
+        this.$message.warning("最多只能统计31天的数据哦!")
+        return
+      }
+
+      this.loading = true;
+      var searchParams = {
+        startLoginTime:this.dateRange[0],
+        endLoginTime:this.dateRange[1]
+      }
+      this.$axios.get('/sysOperlogController/sysOperlogTotal',
+        {params: searchParams}).then((res) => {
+        this.list = res.data
+        if (res.data == '') {
+          this.showTable = false
+        } else {
+          this.showTable = true
+        }
+        this.loading = false
+      }).catch((error) => {
+        // this.$message.error(error)
+      })
+    },1000),
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    }
+  }
+};
+</script>
+