Parcourir la source

增加登录日志统计前后端

xusl il y a 2 ans
Parent
commit
b62a336ca8

+ 52 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysLogininforController.java

@@ -17,6 +17,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;
+
 /**
  * 系统访问记录
  *
@@ -137,4 +140,53 @@ public class SysLogininforController {
             return ResponseVO.error(e);
         }
     }
+
+    /**
+     * 登录日志统计分析
+     *
+     * @return 列表信息
+     */
+    @GetMapping(value = "/logininforTotal")
+    @PreAuthorize("@ss.hasPermi('auditManager:logininforTotal:list')")
+    public ResponseVO logininforTotal(String startLoginTime,String endLoginTime) {
+        try {
+            QueryWrapper<SysLogininfor> wrapper = new QueryWrapper<>();
+            if (StringUtils.isNotEmpty(startLoginTime)) {
+                wrapper.ge("login_time", DateUtils.getDayStartTime(DateUtil.parseDate(startLoginTime)));
+            }
+            if (StringUtils.isNotEmpty(endLoginTime)) {
+                wrapper.le("login_time", DateUtils.getDayLastTime(DateUtil.parseDate(endLoginTime)));
+            }
+            List<SysLogininfor> sysLogininforList = sysLogininforService.list(wrapper);
+            Map<String,List<SysLogininfor>> map = sysLogininforList.stream().collect(Collectors.groupingBy(item->DateUtil.format(item.getLoginTime(),"yyyy-MM-dd")));
+            List<Map<String,String>> resultList = new ArrayList<>();
+            map.forEach((key,value)->{
+                List<SysLogininfor> list = value;
+                Map<String,String> recordMap = new HashMap<>();
+                recordMap.put("day",key);
+                recordMap.put("count",list.size()+"");
+                // 登录成功统计
+                List<SysLogininfor> successList = list.stream().filter(sysLogininfor->"0".equals(sysLogininfor.getStatus())).collect(Collectors.toList());
+                recordMap.put("success",successList.size()+"");
+                // 登录失败统计
+                List<SysLogininfor> failList = list.stream().filter(sysLogininfor->"1".equals(sysLogininfor.getStatus())).collect(Collectors.toList());
+                recordMap.put("fail",failList.size()+"");
+                // 登录ip个数统计
+                int ips = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s -> s.getIpaddr()))), 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);
+        }
+    }
 }

+ 46 - 1
backend/src/test/java/com/jiayue/ssi/service/DataHandleServiceTest.java

@@ -1,12 +1,22 @@
 package com.jiayue.ssi.service;
 
 
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jiayue.ssi.BaseTest;
+import com.jiayue.ssi.entity.SysLogininfor;
+import com.jiayue.ssi.util.DateUtils;
 import com.jiayue.ssi.util.LocalCache;
+import com.jiayue.ssi.util.SpringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
 
-import java.util.List;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -16,5 +26,40 @@ import java.util.List;
  * @version 3.0
  */
 public class DataHandleServiceTest extends BaseTest {
+    @Autowired
+    SysLogininforService sysLogininforService;
 
+    @Test
+    public void test(){
+        String startLoginTime = "2023-03-30";
+        String endLoginTime = "2023-03-31";
+        QueryWrapper<SysLogininfor> wrapper = new QueryWrapper<>();
+        if (StringUtils.isNotEmpty(startLoginTime)) {
+            wrapper.ge("login_time", DateUtils.getDayStartTime(DateUtil.parseDate(startLoginTime)));
+        }
+        if (StringUtils.isNotEmpty(endLoginTime)) {
+            wrapper.le("login_time", DateUtils.getDayLastTime(DateUtil.parseDate(endLoginTime)));
+        }
+        List<SysLogininfor> sysLogininforList = sysLogininforService.list(wrapper);
+        Map<String,List<SysLogininfor>> map = sysLogininforList.stream().collect(Collectors.groupingBy(item->DateUtil.format(item.getLoginTime(),"yyyy-MM-dd")));
+        List<Map<String,String>> resultList = new ArrayList<>();
+        map.forEach((key,value)->{
+            List<SysLogininfor> list = value;
+            Map<String,String> recordMap = new HashMap<>();
+            recordMap.put("day",key);
+            recordMap.put("count",list.size()+"");
+            // 登录成功统计
+            List<SysLogininfor> successList = list.stream().filter(sysLogininfor->"0".equals(sysLogininfor.getStatus())).collect(Collectors.toList());
+            recordMap.put("success",successList.size()+"");
+            // 登录失败统计
+            List<SysLogininfor> failList = list.stream().filter(sysLogininfor->"1".equals(sysLogininfor.getStatus())).collect(Collectors.toList());
+            recordMap.put("fail",failList.size()+"");
+            // 登录ip个数统计
+            int ips = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s -> s.getIpaddr()))), ArrayList::new)).size();
+            recordMap.put("ip",ips+"");
+            resultList.add(recordMap);
+        });
+
+        System.out.println(resultList.toString());
+    }
 }

+ 122 - 0
ui/src/views/auditManager/logininforTotal/index.vue

@@ -0,0 +1,122 @@
+<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="count" 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('/sysLogininforController/logininforTotal',
+        {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>
+