浏览代码

增加告警展示

xusl 2 年之前
父节点
当前提交
1929e8a87b

+ 79 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysAlarmController.java

@@ -0,0 +1,79 @@
+package com.jiayue.ssi.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jiayue.ssi.annotation.OperateLog;
+import com.jiayue.ssi.backenum.ApproveStatusEnum;
+import com.jiayue.ssi.backenum.AuditType;
+import com.jiayue.ssi.backenum.BusinessType;
+import com.jiayue.ssi.entity.SysAlarm;
+import com.jiayue.ssi.entity.SysApprove;
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.service.SysAlarmService;
+import com.jiayue.ssi.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+/**
+ * 告警消息接口
+ *
+ * @author xsl
+ * @since 2023/03/13
+ */
+@RestController
+@RequestMapping("/sysAlarmController")
+@Slf4j
+public class SysAlarmController {
+    @Autowired
+    SysAlarmService sysAlarmService;
+
+    /**
+     * 获取告警消息
+     *
+     * @return
+     */
+    @GetMapping(value = "/getAll")
+    public ResponseVO getAll() {
+        try {
+            QueryWrapper<SysAlarm> wrapper = new QueryWrapper<>();
+//            wrapper.eq("read_sign", "0");
+            wrapper.orderByDesc("create_time");
+            List<SysAlarm> sysAlarmLis = sysAlarmService.list(wrapper);
+            return ResponseVO.success(sysAlarmLis);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取所有告警消息异常");
+            return ResponseVO.error(null);
+        }
+    }
+    /**
+     * 查收提交
+     */
+    @PostMapping(value = "/readDone")
+    public ResponseVO readDone(Long id) {
+        if (id==null) {
+            return ResponseVO.fail("id不能为空!");
+        }
+        try {
+            SysAlarm sysAlarm = new SysAlarm();
+            sysAlarm.setId(id);
+            boolean bo = sysAlarmService.removeById(sysAlarm);
+            if (bo){
+              return ResponseVO.success("查收成功");
+            }
+            else {
+                log.error("查收失败");
+                return ResponseVO.fail("查收失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("查收异常");
+            return ResponseVO.error(e);
+        }
+    }
+}

+ 2 - 2
backend/src/main/java/com/jiayue/ssi/entity/BaseEntity.java

@@ -29,7 +29,7 @@ public class BaseEntity implements Serializable {
 
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
 
     /** 更新者 */
@@ -38,7 +38,7 @@ public class BaseEntity implements Serializable {
 
     /** 更新时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
     /** 备注 */

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/job/AutoScanMemory.java

@@ -40,7 +40,7 @@ public class AutoScanMemory {
         jvm.setFree(Runtime.getRuntime().freeMemory());
         if ((100-jvm.getUsage())<memoryWarn){
             SysAlarm sysAlarm = new SysAlarm();
-            sysAlarm.setAlarmContent("内存低于"+memoryWarn+"%");
+            sysAlarm.setAlarmContent("当前JVM使用率:"+jvm.getUsage()+"%,低于设定值"+memoryWarn+"%");
             sysAlarm.setReadSign("0");
             // 低于策略设定值则告警
             sysAlarmService.save(sysAlarm);

+ 1 - 0
ui/src/assets/icons/svg/bell.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681954654885" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2647" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M172.361143 800h431.561143c-2.998857 57.856-40.283429 94.72-91.702857 94.72-51.858286 0-88.722286-36.864-92.16-94.72h-66.852572c3.437714 82.285714 68.150857 154.697143 159.012572 154.697143 90.422857 0 155.136-72.411429 158.573714-154.697143h180.845714c40.722286 0 64.731429-20.992 64.731429-51.858286 0-42.861714-43.300571-81.426286-80.585143-119.570285-28.288-29.568-36.004571-90.422857-39.003429-139.702858-3.419429-168.868571-46.701714-278.162286-161.133714-319.305142-14.153143-55.698286-60.434286-100.278857-123.428571-100.278858-63.451429 0-109.293714 44.580571-123.867429 100.278858-113.993143 41.142857-157.714286 150.436571-160.713143 319.286857-3.419429 49.298286-10.715429 110.153143-39.424 139.721143-36.864 38.144-80.566857 76.708571-80.566857 119.588571 0 30.848 24.429714 51.84 64.713143 51.84z m18.852571-64.731429v-5.12c7.716571-12.854857 33.005714-37.723429 55.716572-63.012571 30.427429-34.285714 44.982857-89.142857 48.859428-173.129143 3.419429-186.88 59.136-246.857143 132.845715-266.569143 10.715429-2.578286 16.292571-8.155429 16.713142-18.870857 1.718857-44.982857 27.008-76.288 66.870858-76.288 39.424 0 65.133714 31.286857 66.432 76.288 0.420571 10.715429 6.418286 16.274286 17.133714 18.852572 73.289143 19.730286 129.005714 79.725714 132.864 266.587428 3.419429 83.986286 17.993143 138.843429 48.859428 173.129143 22.272 25.289143 47.981714 50.157714 55.698286 63.012571v5.12z" p-id="2648"></path></svg>

文件差异内容过多而无法显示
+ 0 - 0
ui/src/assets/icons/svg/notice.svg


文件差异内容过多而无法显示
+ 0 - 0
ui/src/assets/icons/svg/notice_none.svg


+ 1 - 0
ui/src/icons/svg/bell.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681954654885" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2647" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M172.361143 800h431.561143c-2.998857 57.856-40.283429 94.72-91.702857 94.72-51.858286 0-88.722286-36.864-92.16-94.72h-66.852572c3.437714 82.285714 68.150857 154.697143 159.012572 154.697143 90.422857 0 155.136-72.411429 158.573714-154.697143h180.845714c40.722286 0 64.731429-20.992 64.731429-51.858286 0-42.861714-43.300571-81.426286-80.585143-119.570285-28.288-29.568-36.004571-90.422857-39.003429-139.702858-3.419429-168.868571-46.701714-278.162286-161.133714-319.305142-14.153143-55.698286-60.434286-100.278857-123.428571-100.278858-63.451429 0-109.293714 44.580571-123.867429 100.278858-113.993143 41.142857-157.714286 150.436571-160.713143 319.286857-3.419429 49.298286-10.715429 110.153143-39.424 139.721143-36.864 38.144-80.566857 76.708571-80.566857 119.588571 0 30.848 24.429714 51.84 64.713143 51.84z m18.852571-64.731429v-5.12c7.716571-12.854857 33.005714-37.723429 55.716572-63.012571 30.427429-34.285714 44.982857-89.142857 48.859428-173.129143 3.419429-186.88 59.136-246.857143 132.845715-266.569143 10.715429-2.578286 16.292571-8.155429 16.713142-18.870857 1.718857-44.982857 27.008-76.288 66.870858-76.288 39.424 0 65.133714 31.286857 66.432 76.288 0.420571 10.715429 6.418286 16.274286 17.133714 18.852572 73.289143 19.730286 129.005714 79.725714 132.864 266.587428 3.419429 83.986286 17.993143 138.843429 48.859428 173.129143 22.272 25.289143 47.981714 50.157714 55.698286 63.012571v5.12z" p-id="2648"></path></svg>

文件差异内容过多而无法显示
+ 0 - 0
ui/src/icons/svg/notice.svg


文件差异内容过多而无法显示
+ 0 - 0
ui/src/icons/svg/notice_none.svg


+ 208 - 29
ui/src/layout/components/Navbar.vue

@@ -18,16 +18,25 @@
 <!--        </el-tooltip>-->
 
       <!-- 消息中心 -->
-      <el-badge is-dot class="item">
-        <span class="el-icon-bell"></span>
-      </el-badge>
-
-
-
-
-
+      <span v-show="alarmIconShow">
+        <span v-if="isMessage" key="1">
+          <el-tooltip content="告警消息" placement="bottom">
+            <a href='javascript:;' @click="showAlarm" >
+              <svg-icon icon-class="notice" class="right-menu-item1 hover-effect1"/>
+            </a>
+          </el-tooltip>
+        </span>
+        <span v-else key="2">
+          <el-tooltip content="告警消息" placement="bottom">
+            <svg-icon icon-class="notice_none" class="right-menu-item1 hover-effect1"/>
+          </el-tooltip>
+        </span>
+      </span>
+
+
+      <el-tooltip content="全屏" placement="bottom">
       <screenfull id="screenfull" class="right-menu-item hover-effect" />
-
+      </el-tooltip>
 <!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
 <!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
 <!--        </el-tooltip>-->
@@ -49,6 +58,41 @@
         </el-dropdown-menu>
       </el-dropdown>
     </div>
+    <el-dialog :title="title" :visible.sync="open" width="750px" append-to-body>
+      <div style="padding-top: 10px">
+        <vxe-table
+          ref="xTable"
+          align="center"
+          :loading="loading"
+          class="mytable-style"
+          auto-resize
+          border
+          resizable
+          export-config
+          highlight-current-row
+          show-overflow
+          max-height="700"
+          :data="alarmList"
+        >
+          <vxe-table-column field="alarmContent" title="告警内容" />
+          <vxe-table-column field="createTime" title="时间" width="200px"/>
+          <vxe-table-column title="操作" width="100px">
+            <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-reading"
+              @click="readDone(scope.row)"
+            >查收
+            </el-button>
+            </template>
+          </vxe-table-column>
+        </vxe-table>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">关 闭</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -59,6 +103,10 @@ import TopNav from '@/components/TopNav'
 import Hamburger from '@/components/Hamburger'
 import {removeToken} from "@/utils/auth";
 import Screenfull from '@/components/Screenfull'
+import XEUtils from 'xe-utils'
+import moment from "moment";
+import {userinfoDecrypt, userinfoEncrypt} from "@/utils/smutil";
+import {debounce} from "lodash";
 // import SizeSelect from '@/components/SizeSelect'
 // import Search from '@/components/HeaderSearch'
 // import RuoYiGit from '@/components/RuoYi/Git'
@@ -67,10 +115,17 @@ import Screenfull from '@/components/Screenfull'
 export default {
   data() {
     return {
+      interval: null,
+      isMessage:false,
+      alarmIconShow:false,
+      title:'告警消息',
+      loading:false,
+      alarmList:null,
+      // 是否显示弹出层
+      open: false,
       message: 2
     }
   },
-
   components: {
     Breadcrumb,
     TopNav,
@@ -81,6 +136,14 @@ export default {
     // RuoYiGit,
     // RuoYiDoc
   },
+  created() {
+    this.getCurrentUser()
+  },
+  beforeDestroy() {
+    if (this.interval) {
+      clearInterval(this.interval)
+    }
+  },
   computed: {
     ...mapGetters([
       'sidebar',
@@ -105,6 +168,116 @@ export default {
     }
   },
   methods: {
+    async getCurrentUser(){
+      var user;
+       await this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
+         user = res.data.sysUser
+        // 用户信息+菜单权限加密存储
+        let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
+        sessionStorage.setItem('active',encryptUserInfo)
+        if (user.lastUpdatePwdTime==null){
+          this.$message({
+            type: 'warning',
+            message: '需要修改初始密码!'
+          });
+          this.$router.push("/user/profile")
+        }
+        else{
+          var dateBegin = new Date(user.lastUpdatePwdTime);
+          var dateEnd = new Date();
+          var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
+          var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
+          if (dayDiff>=30){
+            this.$message({
+              type: 'warning',
+              message: '密码超过30天需要修改!'
+            })
+            this.$router.push("/user/profile")
+          }
+        }
+      }).catch((error) => {
+        this.$message.error('获取当前用户数据出错' + error)
+      })
+
+      // 获取角色是否系统管理员
+      const searchParams = {
+        userId: user.id
+      }
+      this.$axios.get('/sysUserController/getUserRole',{params: searchParams}).then((res) => {
+        let userRole = res.data
+        if (userRole.roleId==1){
+          this.getAlarmData()
+          // 系统管理员角色显示告警图标
+          this.alarmIconShow=true
+          // 增加定时每分钟获取告警消息
+          this.interval = setInterval(() => {
+            if (!this.open){
+              // 窗口关闭可以调用自动查询
+              this.getAlarmData()
+            }
+          }, 60000)
+        }
+        else{
+          this.alarmIconShow=false
+        }
+
+      }).catch((error) => {
+        // this.$message.error(error)
+      })
+    },
+    /**
+     * 删除提交
+     */
+    readDone:debounce(function(row){
+      const param = {
+        id: row.id
+      }
+      this.$axios.post('/sysAlarmController/readDone', param).then((res) => {
+        if (res.code == 0) {
+          this.$message({
+            type: 'success',
+            message: '查收成功!'
+          });
+          this.$refs.xTable.remove(row)
+        } else {
+          this.$message({
+            type: 'error',
+            message: res.data
+          });
+        }
+      }).catch((error) => {
+        this.$message({
+          type: 'error',
+          message: '查收失败!'
+        });
+      })
+    },1000),
+    // 取消按钮
+    cancel() {
+      this.getAlarmData()
+      this.open = false
+    },
+    getAlarmData(){
+      this.loading = true
+      // 查询告警消息
+      this.$axios.get('/sysAlarmController/getAll').then((res) => {
+        this.alarmList = res.data
+        if (res.data.length>0){
+          // 改变消息图标
+          this.isMessage = true;
+        }
+        else{
+          this.isMessage = false;
+        }
+        this.loading = false
+      }).catch((error) => {
+        this.loading = false
+        // this.$message.error(error)
+      })
+    },
+    showAlarm(){
+      this.open = true
+    },
     toggleSideBar() {
       this.$store.dispatch('app/toggleSideBar')
     },
@@ -133,26 +306,14 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.item {
-  margin-top: 0px;
-  margin-right: 15px;
+.right-menu-item1 {
+  position:relative;
+  top:-15px;
+  font-size: 18px;
 }
-.btn-bell{
-  position: relative;
-  text-align: center;
-  border-radius: 15px;
-  cursor: pointer;
-}
-.btn-bell-badge{
-  position: absolute;
-  right: 0;
-  top: -2px;
-  border-radius: 4px;
-  background: #f56c6c;
-  color: #fff;
-}
-.btn-bell .el-icon-bell{
-  color: #fff;
+.item{
+  margin-tip:5px;
+  margin-right:15px;
 }
 .navbar {
   height: 50px;
@@ -238,6 +399,24 @@ export default {
         }
       }
     }
+
+    .right-menu-item1 {
+
+      height: 100%;
+      width: 27px;
+      font-size: 18px;
+      color: #5a5e66;
+      vertical-align: text-bottom;
+      top:0px;
+      &.hover-effect1 {
+        cursor: pointer;
+        transition: background .3s;
+
+        &:hover {
+          background: rgba(0, 0, 0, .025)
+        }
+      }
+    }
   }
 }
 </style>

+ 32 - 32
ui/src/views/dashboard/index.vue

@@ -20,41 +20,41 @@ export default {
     }
   },
   created() {
-    this.getCurrentUser()
+    // this.getCurrentUser()
   },
   methods: {
     /** 获取当前用户的最后修改密码时间 */
-    getCurrentUser() {
-      this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
-        // 用户信息+菜单权限加密存储
-        let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
-        // this.$store.dispatch('user/changeSetting',encryptUserInfo)
-        sessionStorage.setItem('active',encryptUserInfo)
-        var user = res.data.sysUser
-        if (user.lastUpdatePwdTime==null){
-            this.$message({
-              type: 'warning',
-              message: '需要修改初始密码!'
-            });
-          this.$router.push("/user/profile")
-        }
-        else{
-          var dateBegin = new Date(user.lastUpdatePwdTime);
-          var dateEnd = new Date();
-          var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
-          var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
-          if (dayDiff>=30){
-            this.$message({
-              type: 'warning',
-              message: '密码超过30天需要修改!'
-            })
-            this.$router.push("/user/profile")
-          }
-        }
-      }).catch((error) => {
-        this.$message.error('获取数据出错' + error)
-      })
-    }
+    // getCurrentUser() {
+      // this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
+      //   // 用户信息+菜单权限加密存储
+      //   let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
+      //   // this.$store.dispatch('user/changeSetting',encryptUserInfo)
+      //   sessionStorage.setItem('active',encryptUserInfo)
+      //   var user = res.data.sysUser
+      //   if (user.lastUpdatePwdTime==null){
+      //       this.$message({
+      //         type: 'warning',
+      //         message: '需要修改初始密码!'
+      //       });
+      //     this.$router.push("/user/profile")
+      //   }
+      //   else{
+      //     var dateBegin = new Date(user.lastUpdatePwdTime);
+      //     var dateEnd = new Date();
+      //     var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
+      //     var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
+      //     if (dayDiff>=30){
+      //       this.$message({
+      //         type: 'warning',
+      //         message: '密码超过30天需要修改!'
+      //       })
+      //       this.$router.push("/user/profile")
+      //     }
+      //   }
+      // }).catch((error) => {
+      //   this.$message.error('获取数据出错' + error)
+      // })
+    // }
   }
 }
 </script>

部分文件因为文件数量过多而无法显示