Authored by 王涛

青海前端工程

  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <parent>
  6 + <groupId>com.honggroup</groupId>
  7 + <artifactId>hg-monitor-web</artifactId>
  8 + <version>0.0.1-SNAPSHOT</version>
  9 + </parent>
  10 + <groupId>com.honggroup</groupId>
  11 + <artifactId>hg-monitor-web-qh</artifactId>
  12 + <version>0.0.1-SNAPSHOT</version>
  13 + <name>hg-monitor-web-qh</name>
  14 + <description>青海个性化版本</description>
  15 + <properties>
  16 + <java.version>1.8</java.version>
  17 + </properties>
  18 + <dependencies>
  19 + <dependency>
  20 + <groupId>com.honggroup</groupId>
  21 + <artifactId>hg-monitor-web-zj</artifactId>
  22 + <version>0.0.1-SNAPSHOT</version>
  23 + </dependency>
  24 + </dependencies>
  25 +
  26 + <build>
  27 + <finalName>qhweb</finalName>
  28 + <resources>
  29 + <resource>
  30 + <directory>src/main/resources</directory>
  31 + <includes>
  32 + <include>**/**</include>
  33 + </includes>
  34 + </resource>
  35 + </resources>
  36 + <plugins>
  37 + <plugin>
  38 + <groupId>org.springframework.boot</groupId>
  39 + <artifactId>spring-boot-maven-plugin</artifactId>
  40 + </plugin>
  41 + </plugins>
  42 + </build>
  43 +
  44 +</project>
  1 +package com.web;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +
  6 +@SpringBootApplication
  7 +public class HGMonitorQHWebApplication {
  8 +
  9 + public static void main(String[] args) {
  10 + SpringApplication.run(HGMonitorQHWebApplication.class, args);
  11 + }
  12 +
  13 +}
  1 +
  2 +spring:
  3 + application:
  4 + name: zjweb
  5 +server:
  6 + port: 8088
  7 + ssl:
  8 + enabled: false
  9 + key-alias: tomcat_https
  10 + key-store: classpath:keystore/tomcat_https.keystore
  11 + key-store-type: JKS
  12 + key-store-password: Hg0801..
  13 + key-password: Hg0801..
  14 +url:
  15 + gateway: http://127.0.0.1:9200
  16 + inspection_web: http://127.0.0.1:8082
  17 + assetsweb: http://127.0.0.1:8082
  18 + mxgraph_editor: http://127.0.0.1:8085
  19 + tingyun: http://127.0.0.1:8088
  20 + bigScreen: http://127.0.0.1:8081
  21 + #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件
  22 + workflow: http://192.168.0.248:8002
  23 + # 积木报表工具
  24 + jimuReport: http://192.168.0.41:8085
  25 +config:
  26 + layer:
  27 + load:
  28 + icon: mj
  29 + audio:
  30 + mp3: 14039
  31 + tingyun:
  32 + api_key: aZipZbC18BhpG5GrjtiFAtThL1I0OUfn
  33 + secret_key: nbxay44wx8c3x4n5wcxe63mp87a72xed
  1 +/**
  2 +
  3 + @Name:layuiAdmin 公共业务
  4 + @Author:贤心
  5 + @Site:http://www.layui.com/admin/
  6 + @License:LPPL
  7 +
  8 + */
  9 +
  10 +layui.define(['xmSelect', 'md5'], function (exports) {
  11 + var $ = layui.$
  12 + , laytpl = layui.laytpl
  13 + , layer = layui.layer
  14 + , view = layui.view
  15 + , xmSelect = layui.xmSelect
  16 + , md5 = layui.md5
  17 + , form = layui.form
  18 + , commonDetail = layui.commonDetail
  19 + , admin = layui.admin;
  20 + //公共业务的逻辑处理可以写在此处,切换任何页面都会执行
  21 + var obj = {
  22 + domainIpManage: "http://94.12.40.231:8080/zoneportal/",
  23 + domainName: sessionStorage.getItem('domainName'), // gateway地址
  24 + domainInspectionURI: sessionStorage.getItem('domainInspectionURI'), // 巡检系统地址
  25 + domainAssetsManage: sessionStorage.getItem('domainAssetsManage'), // 资产系统地址
  26 + graphEditorOrigin: sessionStorage.getItem('graphEditorOrigin'), // 拓扑系统地址
  27 + workflowName: sessionStorage.getItem('workflow'),//流程系统地址
  28 + domainCMDBName: "http://80.12.147.24:8888/hgkjcmdb", //杭州咨源老cmdb系统地址
  29 + lineTimer: null,//性能曲线图全局定时器
  30 + detailTimer: [],//详细页的全局定时器
  31 + alarmTimer: null,//首页告警刷新定时器
  32 + limit: 50,//全局分页条目数
  33 + limits: [50,100,150,200],//全局分页条目数组
  34 + //base64加密
  35 + Base64: {
  36 + _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  37 + encode: function (e) {
  38 + var t = "";
  39 + var n, r, i, s, o, u, a;
  40 + var f = 0;
  41 + e = obj.Base64._utf8_encode(e);
  42 + while (f < e.length) {
  43 + n = e.charCodeAt(f++);
  44 + r = e.charCodeAt(f++);
  45 + i = e.charCodeAt(f++);
  46 + s = n >> 2;
  47 + o = (n & 3) << 4 | r >> 4;
  48 + u = (r & 15) << 2 | i >> 6;
  49 + a = i & 63;
  50 + if (isNaN(r)) {
  51 + u = a = 64
  52 + } else if (isNaN(i)) {
  53 + a = 64
  54 + }
  55 + t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
  56 + }
  57 + return t
  58 + },
  59 + decode: function (e) {
  60 + var t = "";
  61 + var n, r, i;
  62 + var s, o, u, a;
  63 + var f = 0;
  64 + e = e.replace(/[^A-Za-z0-9+/=]/g, "");
  65 + while (f < e.length) {
  66 + s = this._keyStr.indexOf(e.charAt(f++));
  67 + o = this._keyStr.indexOf(e.charAt(f++));
  68 + u = this._keyStr.indexOf(e.charAt(f++));
  69 + a = this._keyStr.indexOf(e.charAt(f++));
  70 + n = s << 2 | o >> 4;
  71 + r = (o & 15) << 4 | u >> 2;
  72 + i = (u & 3) << 6 | a;
  73 + t = t + String.fromCharCode(n);
  74 + if (u != 64) {
  75 + t = t + String.fromCharCode(r)
  76 + }
  77 + if (a != 64) {
  78 + t = t + String.fromCharCode(i)
  79 + }
  80 + }
  81 + t = obj.Base64._utf8_decode(t);
  82 + return t
  83 + },
  84 + _utf8_encode: function (e) {
  85 + e = e.replace(/rn/g, "n");
  86 + var t = "";
  87 + for (var n = 0; n < e.length; n++) {
  88 + var r = e.charCodeAt(n);
  89 + if (r < 128) {
  90 + t += String.fromCharCode(r)
  91 + } else if (r > 127 && r < 2048) {
  92 + t += String.fromCharCode(r >> 6 | 192);
  93 + t += String.fromCharCode(r & 63 | 128)
  94 + } else {
  95 + t += String.fromCharCode(r >> 12 | 224);
  96 + t += String.fromCharCode(r >> 6 & 63 | 128);
  97 + t += String.fromCharCode(r & 63 | 128)
  98 + }
  99 + }
  100 + return t
  101 + },
  102 + _utf8_decode: function (e) {
  103 + var t = "";
  104 + var n = 0;
  105 + var r = c1 = c2 = 0;
  106 + while (n < e.length) {
  107 + r = e.charCodeAt(n);
  108 + if (r < 128) {
  109 + t += String.fromCharCode(r);
  110 + n++
  111 + } else if (r > 191 && r < 224) {
  112 + c2 = e.charCodeAt(n + 1);
  113 + t += String.fromCharCode((r & 31) << 6 | c2 & 63);
  114 + n += 2
  115 + } else {
  116 + c2 = e.charCodeAt(n + 1);
  117 + c3 = e.charCodeAt(n + 2);
  118 + t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
  119 + n += 3
  120 + }
  121 + }
  122 + return t
  123 + }
  124 + },
  125 + /**
  126 + * 颜色数组
  127 + */
  128 + colorsArr: [
  129 + {
  130 + start: '#46d6d8',
  131 + end: '#2883d0'
  132 + },
  133 + {
  134 + start: '#facf5b',
  135 + end: '#f77623'
  136 + },
  137 + {
  138 + start: '#C04DD8',
  139 + end: '#D81F72'
  140 + },
  141 + {
  142 + start: '#F5A1EB',
  143 + end: '#A04DE2'
  144 + },
  145 + {
  146 + start: '#F36093',
  147 + end: '#FF465C'
  148 + },
  149 + {
  150 + start: '#C2E74D',
  151 + end: '#00AE8B'
  152 + },
  153 + {
  154 + start: '#3DC3FF',
  155 + end: '#01FFFF'
  156 + },
  157 + {
  158 + start: '#B850ED',
  159 + end: '#9062EF'
  160 + },
  161 + {
  162 + start: '#305be6',
  163 + end: '#36a7d3'
  164 + },
  165 + {
  166 + start: '#FFA500',
  167 + end: '#FFEE00'
  168 + },
  169 + {
  170 + start: '#C4E64C',
  171 + end: '#2de078'
  172 + },
  173 + {
  174 + start: '#30ffb3',
  175 + end: '#01FFFF'
  176 + },
  177 + {
  178 + start: '#FF4488',
  179 + end: '#F13EFF'
  180 + },
  181 + {
  182 + start: '#A64CE2',
  183 + end: '#625AE7'
  184 + },
  185 + {
  186 + start: '#5AEBC7',
  187 + end: '#5FC9F8'
  188 + },
  189 + {
  190 + start: '#FFA500',
  191 + end: '#FFEE00'
  192 + },
  193 + {
  194 + start: '#00AAD6',
  195 + end: '#625AE7'
  196 + },
  197 + {
  198 + start: '#E48BDE',
  199 + end: '#FF9262'
  200 + },
  201 + {
  202 + start: '#B2797B',
  203 + end: '#FF4B51'
  204 + },
  205 + {
  206 + start: '#ffe393',
  207 + end: '#feff5b'
  208 + }
  209 + ],
  210 + //资源类型悬浮提示信息定义
  211 + nodeTipsKpiArr: {
  212 + //小型机:主机状态,主机IP、运行状态、磁盘使用率、CPU使用率、网络联通状态、网络带宽占用率、运行时长
  213 + HOST_MINICOMPUTER_SERVER: "KPI1635BB9B,KPI1AF5B3C6,KPIE4B51D5C,KPI2C8A6D17,KPI7054BC34,KPI618689D8,KPID1E6EFA1,KPI1C777D98",
  214 + //小型机分区:主机状态,主机IP、运行状态、磁盘使用率、CPU使用率、网络联通状态、网络带宽占用率、运行时长
  215 + HOST_MINICOMPUTER_PARTITION: "KPI1635BB9B,KPI1AF5B3C6,KPIE4B51D5C,KPI2C8A6D17,KPI7054BC34,KPI618689D8,KPID1E6EFA1,KPI1C777D98",
  216 + //物理服务器:主机状态、主机IP、磁盘使用率、内存使用率、网络连通状态、CPU使用率、服务器与存储间的连通状态、、网络带宽占用率
  217 + HOST_X86SERVER: "KPI1635BB9B,KPI1AF5B3C6,KPI2C8A6D17,KPI31CB8D97,KPI618689D8,KPI7054BC34,KPIA537846F,KPID1E6EFA1",
  218 + //虚拟服务器:主机状态、主机IP、磁盘使用率、内存使用率、网络连通状态、CPU使用率、服务器与存储间的连通状态、、网络带宽占用率
  219 + HOST_X86VIRTUAL: "KPI1635BB9B,KPI1AF5B3C6,KPI2C8A6D17,KPI31CB8D97,KPI618689D8,KPI7054BC34,KPIA537846F,KPID1E6EFA1",
  220 + //华为云:物理机数量
  221 + HUAWEI_CLOUD: "KPI3CF8A73E",
  222 + //华为云物理机:物理主机IP、所属资源池、已分配内存大小、已分配磁盘大小、CPU使用率、内存使用率、磁盘使用率
  223 + HUAWEI_CLOUD_PHYSICSHOST: "KPIEA270DAB,KPID7BE5E90,KPI191373C6,KPI9B34D90F,KPI7054BC34,KPI31CB8D97,KPI2C8A6D17",
  224 + //华为存储 IP地址、总容量、已使用容量、CPU使用率、内存占用率、运行状态
  225 + HUAWEI_CLOUD_STORAGE: "KPI2DC9105C,KPI2D4365CA,KPI008F0D3A,KPI7054BC34,KPI31CB8D97,KPIE4B51D5C",
  226 + //华为交换机:IP地址、管理状态、操作状态、所属区域、CPU平均使用率、内存平均使用率
  227 + HUAWEI_CLOUD_SWITCHBOARD: "KPI2DC9105C,KPI6F17667E,KPIF21A9F60,KPI5364695E,KPI961A9688,KPIE78B29FF",
  228 + //华为防火墙:IP地址、管理状态、操作状态、所属区域、CPU平均使用率、内存平均使用率
  229 + HUAWEI_CLOUD_FIREWALL: "KPI2DC9105C,KPI6F17667E,KPIF21A9F60,KPI5364695E,KPI961A9688,KPIE78B29FF",
  230 + //虚拟化vmware平台:主机数、虚拟机数量、磁盘已使用大小、已使用内存、网络数、磁盘数量、网卡数量、平台运行状态
  231 + VIRTUALIZATION_VMWARE: "KPI02EA188F,KPID4E1FD1D,KPI1988842F,KPI4A216352,KPI63916615,KPIA4D671CC,KPID1BA9510",
  232 + //虚拟化资源池:资源池名称、HA健康监测、主机数、网络数、CPU大小、内存大小、CPU线程数、资源池状态、CPU使用率、内存使用率
  233 + VIRTUALIZATION_VMWARE_CLUSTER: "KPIC3F28B34,KPI26E85604,KPI02EA188F,KPI63916615,KPI98960E55,KPI1584BE1C,KPI15358CE3,KPIEE008133,KPI7054BC34,KPI31CB8D97",
  234 + //虚拟化物理机:所属资源池 、主机状态 、CPU使用率、内存使用率、启动时间
  235 + VIRTUALIZATION_VMWARE_PHYSICSHOST: "KPID7BE5E90,KPI1635BB9B,KPI7054BC34,KPI31CB8D97,KPIF0A20BB4",
  236 + //虚拟化虚拟机:所属资源池、所属物理主机IP、主机状态、运行状态、网卡数量、磁盘数量、CPU使用率、内存使用率
  237 + VIRTUALIZATION_VMWARE_VHOST: "KPID7BE5E90,KPI9BFCAA00,KPI1635BB9B,KPIE4B51D5C,KPICB05513A,KPIA4D671CC,KPI7054BC34,KPI31CB8D97",
  238 + //存储:总容量、已使用容量、已分配容量、已分配未使用容量、磁带库运行状态
  239 + STORAGE: "KPI2D4365CA,KPI008F0D3A,KPIFAFA06EE,KPI358301D0,KPIEFF93409",
  240 + //网络设备路由器:端口数量\所属区域\视频会议期间链路带宽占用率\接收丢包率\端口发送流量\发送丢包率\设备的连通状态\征收期宽带链路占用率\主备链路的通断状态
  241 + NETHARDWARE_ROUTER: "KPI1FC18754,KPI5364695E,KPI59705C06,KPI87312ED9,KPI88D5DF44,KPI89560B13,KPI94AEBD99,KPI9806211A,KPIC37FE51C",
  242 + //网络设备:交换机
  243 + NETHARDWARE_SWITCHBOARD: "KPI1FC18754,KPI5364695E,KPI59705C06,KPI87312ED9,KPI88D5DF44,KPI89560B13,KPI94AEBD99,KPI9806211A,KPIC37FE51C",
  244 + //负载均衡 CPU使用率
  245 + NETHARDWARE_LOADBALANCING: "KPI7054BC34",
  246 + //Oracle 数据库:数据库状态、是否为集群、会话百分比、表空间使用率、归档日志状态、安装的选项、锁数量、活动会话数量
  247 + DATABASE_ORACLE: "KPI7498580B,KPI096EB5BA,KPI18F18278,KPI64B1610A,KPI69E67C68,KPIA52AF07F,KPIA55F9590,KPICFA785F5",
  248 + //DATABASE_MYSQL :mysql运行线程数、mysql当前连接线程数最大连接数、mysql进程执行时间、吞吐量、版本信息
  249 + DATABASE_MYSQL: "KPI08809218,KPIA5980712,KPI8914AC3B,KPIDB9E6D41,KPIFB54AE94,KPIDAC7AC64",
  250 + //weblogic:活动线程数、网络连通性、最大连接数、执行线程数使用率、已打开会话数、队列长度、总队列数
  251 + MIDDLEWARE_WEBLOGIC: "KPI2893A9EC,KPI2DBC270D,KPI8914AC3B,KPI8BF5E027,KPIC0A94965,KPIC18DC28A,KPIFDB4AD23",
  252 + //tomcat:最大线程数、当前线程数、繁忙线程数、已使用heap内存量、Non-heap使用率、heap使用率
  253 + MIDDLEWARE_TOMCAT: "KPI0A144EC2,KPI70500CAA,KPIAAF2D335,KPIA0FB8392,KPI68B432E5,KPIADACC4E3"
  254 + },
  255 + /**
  256 + * 预览附件
  257 + * @param id 附件ID
  258 + */
  259 + openReport: function (id, flag, suffix, code, name, document) {
  260 + var accessToken = '';
  261 + layui.use(['sessions', 'common'], function () {
  262 + var sessions = layui.sessions;
  263 + accessToken = sessions.getToken()['access_token'];
  264 + });
  265 + var url = obj.domainName + '/api-web/home/priviewOfiice/' + id + '?document=' + document + '&access_token=' + accessToken;
  266 + var loadIndex = layer.load(1, {shade: [0.3], content: '文件正在转换...'});
  267 + $.ajax({
  268 + type: "get",
  269 + url: url,
  270 + async: true,
  271 + success: function (data) {
  272 + if (data.code == 0) {
  273 + layer.close(loadIndex);
  274 + window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(data.pdfPath));
  275 + }
  276 + }
  277 + });
  278 + },
  279 + //业务下拉选择数据绑定
  280 + bizTypeSelect: function (targtetId, callback) {
  281 + var options = "<option value=''>=所属业务=</option>";
  282 + admin.req({
  283 + url: this.domainName + '/api-web/home/business/findAllBusType',
  284 + data: {'type': 'per'}
  285 + ,async:false
  286 + }).done(function (res) {
  287 + var bizlist = res.data;
  288 + $.each(bizlist, function (i, v) {
  289 + options += '<option value="' + v.busId + '">' + v.busTypeName + '</option>';
  290 + });
  291 + $('#' + targtetId).html($(options));
  292 + if (callback) {
  293 + callback();
  294 + }
  295 + }).error(function (error) {
  296 + console.error(error);
  297 + });
  298 + },
  299 + //资源类型下拉选择数据绑定
  300 + resTypeSelect: function (targtetId, callback, ajaxParams) {
  301 + var options = "<option value=''>=资源类型=</option>";
  302 + admin.req(Object.assign({
  303 + url: this.domainName + '/api-web/home/restype/getAllResType'
  304 + }, ajaxParams)).done(function (res) {
  305 + var reslist = res.data;
  306 + $.each(reslist, function (i, v) {
  307 + options += '<option value="' + v.resTypeCode + '">' + v.resTypeName + '</option>';
  308 + });
  309 + $('#' + targtetId).html($(options));
  310 + if (callback) {
  311 + callback();
  312 + }
  313 + }).error(function (error) {
  314 + console.error(error);
  315 + });
  316 + },
  317 + resTypeXmSelect: function (xmSelectParams) {
  318 + admin.req({
  319 + url: `${obj.domainName}/api-web/manage/restype/list`,
  320 + async: false,
  321 + success: function (res) {
  322 + // 资源类型下拉框
  323 + var resTypeList = res.data;
  324 + var resTypeTree = obj.pidToChildren(resTypeList, "resTypeCode", "parentId");
  325 + xmSelect.render(Object.assign({
  326 + el: '#',
  327 + tips: '=资源类型=',
  328 + filterable: true,
  329 + radio: false,
  330 + clickClose: false,
  331 + initValue: [],
  332 + prop: {
  333 + name: 'resTypeName',
  334 + value: 'resTypeCode'
  335 + },
  336 + toolbar: {
  337 + show: true,
  338 + list: ['CLEAR']
  339 + },
  340 + tree: {
  341 + show: true,
  342 + showFolderIcon: true,
  343 + showLine: true,
  344 + strict: false,
  345 + indent: 20
  346 + },
  347 + data: resTypeTree,
  348 + on: function (data) {
  349 +
  350 + }
  351 + }, xmSelectParams));
  352 + }
  353 + });
  354 + },
  355 + /**
  356 + * @description 厂商公共方法
  357 + * @author XuHaoJie
  358 + * @date 2021/12/27 15:03
  359 + */
  360 + providerSelect: function (targtetId, callback) {
  361 + var sessions = layui.sessions;
  362 + var accessToken = sessions.getToken()['access_token'];
  363 + var options = "<option value=''>=所属厂商=</option>";
  364 + admin.req({
  365 + url: `${obj.domainName}/api-web/manage/ddic/findSucDdics/provider?access_token=` + accessToken,
  366 + type: 'POST',
  367 + async:false
  368 + }).done(function (res) {
  369 + var list = res.data;
  370 + $.each(list, function (i, v) {
  371 + options += '<option value="' + v.ddicCode + '">' + v.ddicName + '</option>';
  372 + });
  373 + $('#' + targtetId).html($(options));
  374 + if (callback) {
  375 + callback();
  376 + }
  377 + }).error(function (error) {
  378 + console.error(error);
  379 + });
  380 + },
  381 +
  382 + menuXmSelect: function (xmSelectParams, done, username_, roleId_) {
  383 + var username = username_ ? username_ : '';
  384 + var roleId = roleId_ ? roleId_ : '';
  385 + admin.req({
  386 + url: `${obj.domainName}/api-user/menus/findMenus?username=` + username + '&roleIds=' + roleId,
  387 + success: function (res) {
  388 + // 菜单下拉框
  389 + var menuList = res.data;
  390 + // menuList.forEach(item => {
  391 + // item.disabled = item.isLeaf !== 'Y';
  392 + // });
  393 + var menuTree = obj.pidToChildren(menuList, "id", "parentId");
  394 + //XuHaoJie 2021/10/21 添加是否是父节点
  395 + addProperty(menuTree);
  396 + var menuSelect = xmSelect.render(Object.assign({
  397 + el: '#',
  398 + tips: '=菜单=',
  399 + filterable: true,
  400 + radio: false,
  401 + clickClose: false,
  402 + initValue: [],
  403 + prop: {
  404 + name: 'name',
  405 + value: 'id'
  406 + },
  407 + toolbar: {
  408 + show: true,
  409 + list: ['CLEAR']
  410 + },
  411 + tree: {
  412 + show: true,
  413 + showFolderIcon: true,
  414 + showLine: true,
  415 + strict: false,
  416 + indent: 20
  417 + },
  418 + data: menuTree,
  419 + on: function (data) {
  420 +
  421 + }
  422 + }, xmSelectParams));
  423 + if (done) {
  424 + done(menuSelect);
  425 + }
  426 + }
  427 + });
  428 +
  429 + //添加是否是父节点的删除
  430 + function addProperty(list) {
  431 + list.forEach(item => {
  432 + if (item.children && item.children.length > 0) {
  433 + item['isParent'] = 1;
  434 + addProperty(item.children);
  435 + } else {
  436 + item['isParent'] = 0;
  437 + }
  438 + return item;
  439 + })
  440 + }
  441 + },
  442 + relationTypeXmSelect: function (xmSelectParams, done) {
  443 + admin.req({
  444 + url: `${obj.domainName}/api-web/relationType/getAll`,
  445 + success: function (res) {
  446 + var relationTypeList = res.data;
  447 + var relationTypeSelect = xmSelect.render(Object.assign({
  448 + el: '#',
  449 + tips: '=关系=',
  450 + filterable: true,
  451 + radio: false,
  452 + clickClose: false,
  453 + initValue: [],
  454 + prop: {
  455 + name: 'typeName',
  456 + value: 'reType'
  457 + },
  458 + toolbar: {
  459 + show: true,
  460 + list: ['ALL', 'CLEAR']
  461 + },
  462 + data: relationTypeList,
  463 + on: function (data) {
  464 +
  465 + }
  466 + }, xmSelectParams));
  467 + if (done) {
  468 + done(relationTypeSelect);
  469 + }
  470 + }
  471 + });
  472 + },
  473 +
  474 + //绑定拓扑数据
  475 + topoSelect: function (targtetId, callback) {
  476 + var options = "<option value=''>=选择拓扑=</option>";
  477 + admin.req({
  478 + url: this.domainName + "/api-web/topo/jtopo/getListByUser?page=1&limit=50"
  479 + }).done(function (res) {
  480 + var topolist = res.data;
  481 + $.each(topolist, function (i, v) {
  482 + options += '<option value="' + v.jtopoId + '">' + v.topoName + '</option>';
  483 + });
  484 + $('#' + targtetId).html($(options));
  485 + if (callback) {
  486 + callback();
  487 + }
  488 + }).error(function (error) {
  489 + console.error(error);
  490 + });
  491 + },
  492 + //绑定虚拟化平台
  493 + virtualPlatFormSelect: function (targtetId, bizId, callback) {
  494 + var options = "<option value=''>=所属平台=</option>";
  495 + admin.req({
  496 + url: this.domainName + '/api-web/home/virtual/platform'
  497 + }).done(function (res) {
  498 + var virtuallist = res.data;
  499 + $.each(virtuallist, function (i, v) {
  500 + options += '<option value="' + v.resId + '">' + v.resName + '</option>';
  501 + });
  502 + $('#' + targtetId).html($(options));
  503 + if (callback) {
  504 + callback();
  505 + }
  506 + }).error(function (error) {
  507 + console.error(error);
  508 + });
  509 + },
  510 + /**
  511 + * 数据字典下拉选择数据绑定
  512 + *
  513 + * @param targtetId 下拉框id
  514 + * @param ddicCategory 数据类别
  515 + * @param callback 回调函数
  516 + */
  517 + ddicSelect: function (targtetId, ddicCategory, callback) {
  518 + layui.use(['sessions', 'common'], function () {
  519 + var sessions = layui.sessions;
  520 + accessToken = sessions.getToken()['access_token'];
  521 + });
  522 + var options = "<option value=''>=请选择=</option>";
  523 + $.ajax({
  524 + url: `${this.domainName}/api-web/manage/ddic/findSucDdics/${ddicCategory}?access_token=${accessToken}`
  525 + , method: 'POST'
  526 + , success: function (res) {
  527 + if (res && res.data){
  528 + var ddiclist = res.data;
  529 + $.each(ddiclist, function (i, v) {
  530 + options += '<option value="' + v.ddicCode + '">' + v.ddicName + '</option>';
  531 + });
  532 + $('#' + targtetId).html($(options));
  533 + if (callback) {
  534 + callback(ddiclist);
  535 + }
  536 + }
  537 + }
  538 + , error(error) {
  539 + console.error(error);
  540 + }
  541 + });
  542 + },
  543 + // 用户下拉框
  544 + userXmSelect: function (xmSelectParams) {
  545 + var userSelect;
  546 + $.ajax({
  547 + url: this.domainName + '/api-user/users/getAll?access_token=' + localStorage.getItem("access_token"),
  548 + async: false,
  549 + success: function (response) {
  550 + userSelect = xmSelect.render(Object.assign({
  551 + el: '#',
  552 + tips: '=选择用户=',
  553 + prop: {
  554 + name: 'nickname',
  555 + value: 'username'
  556 + },
  557 + autoRow: true,
  558 + filterable: true,
  559 + toolbar: {
  560 + show: true,
  561 + list: ['ALL', 'REVERSE', 'CLEAR']
  562 + },
  563 + data: response,
  564 + on: function (data) {
  565 +
  566 + }
  567 + }, xmSelectParams));
  568 + }
  569 + });
  570 + return userSelect;
  571 + },
  572 + //打开弹框
  573 + openWin: function (url, name, params, btns, fn, cancelfn, area, done, layerParams) {
  574 + if (!name) {
  575 + name = "信息";
  576 + }
  577 + if (!area) {
  578 + area = ['80%', '90%']
  579 + }
  580 + var id = md5(url)
  581 + view('commonViewModel').render(url).then(function (res) {
  582 + layer.open(Object.assign({
  583 + title: [name, 'font-size:18px;'],
  584 + type: 1,
  585 + area: area,
  586 + resize: false,
  587 + shadeClose: true,//开启遮罩层
  588 + id: id,
  589 + content: laytpl(res.body).render(JSON.stringify(params)),
  590 + success: function (layero, index) {
  591 + if (done) {
  592 + done(layero, index);
  593 + }
  594 + },
  595 + yes: function (index, layero) {
  596 + if (fn && fn(index)) {
  597 + layer.close(index);
  598 + }
  599 + },
  600 + cancel: function () {
  601 + $.each(obj.detailTimer, function (i, v) {
  602 + clearTimeout(obj.detailTimer[i]);
  603 + });
  604 + obj.detailTimer.length = 0;
  605 + //取消的回调函数
  606 + if (cancelfn) {
  607 + cancelfn();
  608 + }
  609 + },
  610 + btn: btns
  611 + }, layerParams));
  612 + });
  613 + },
  614 + openMoreBtnWin: function (url, name, params, btns, fn, fn2, cancelfn, area, done, layerParams) {
  615 + if (!name) {
  616 + name = "信息";
  617 + }
  618 + if (!area) {
  619 + area = ['80%', '90%']
  620 + }
  621 + view('commonViewModel').render(url).then(function (res) {
  622 + layer.open(Object.assign({
  623 + title: [name, 'font-size:18px;'],
  624 + type: 1,
  625 + resize: false,
  626 + area: area,
  627 + content: laytpl(res.body).render(JSON.stringify(params)),
  628 + scrollbar: false,
  629 + success: function (layero, index) {
  630 + if (done) {
  631 + done(layero, index);
  632 + }
  633 + },
  634 + yes: function (index, layero) {
  635 + if (fn && fn()) {
  636 + layer.close(index);
  637 + }
  638 + }
  639 + , btn2: function (index, layero) {
  640 + if (fn2 && fn2()) {
  641 + layer.close(index);
  642 + }
  643 + }
  644 + , cancel: function () {
  645 + //取消的回调函数
  646 + if (cancelfn) {
  647 + cancelfn();
  648 + }
  649 + },
  650 + btn: btns
  651 + }, layerParams));
  652 + });
  653 + },
  654 + /**
  655 + * @desc 以layer.open打开弹框,渲染html元素在弹框的内容区域,可以直接传参为html片段
  656 + * @param id 设定一个id,防止重复弹出
  657 + * @param conent html内容
  658 + * @param title 标题,可选
  659 + * @param width 宽度,可选
  660 + * @param height 高度,可选
  661 + * @param btns 按钮组 ,可选
  662 + * @param fn 点击确定回调函数,可选
  663 + * @param successfn 加载成功后的回调处理,可选
  664 + */
  665 + openWindow: function (id, conent, title, width, height, btns, fn, successfn) {
  666 + if (!width) {
  667 + width = '80%'
  668 + }
  669 + if (!height) {
  670 + height = '90%'
  671 + }
  672 + layer.open({
  673 + type: 1
  674 + , title: title //不显示标题栏
  675 + , closeBtn: false
  676 + , area: [width, height]
  677 + , shade: 0.8
  678 + , resize: false
  679 + , id: id //设定一个id,防止重复弹出
  680 + , btn: btns
  681 + , content: conent
  682 + , success: function (layero, index) {
  683 + if (successfn && successfn) {
  684 + successfn();
  685 + }
  686 + }
  687 + , yes: function (index, layero) {
  688 + if (fn && fn()) {
  689 + fn()
  690 + layer.close(index); //如果设定了yes回调,需进行手工关闭
  691 + }
  692 + }
  693 + });
  694 + },
  695 + //详细页地址
  696 + detailPath: function (resType,resId,protocol) {
  697 + //供从详细页配置策略时使用
  698 + localStorage.setItem("currentResType", resType);
  699 + //网络设备
  700 + if (resType.indexOf("NETHARDWARE_") == 0 && resType != 'NETHARDWARE_360SAFE' && resType != 'NETHARDWARE_LOADBALANCING' && resType != 'NETHARDWARE_SAN_SWITCHBOARD') {
  701 + resType = 'NETHARDWARE';
  702 + }
  703 + //安全
  704 + // if (resType != 'NETSAFE_FIREWALL_SUB' && resType.indexOf("NETSAFE_") == 0 && resType !== 'NETSAFE_FIREWALL') {
  705 + // resType = 'NETHARDWARE';
  706 + // }
  707 + //华为云的防火墙和路由器走相同页面
  708 + if (resType == 'HUAWEI_CLOUD_SWITCHBOARD' || resType == 'HUAWEI_CLOUD_FIREWALL') {
  709 + resType = "HUAWEI_CLOUD_NETHARDWARE";
  710 + }
  711 + //小型机分区
  712 + if (resType.indexOf("HOST_MINICOMPUTER_P") != -1) {
  713 + resType = 'HOST_MINICOMPUTER_PARTITION';
  714 + }
  715 + //如果是物理服务器并且配置了ssh和snmp协议。则跳转至tab详情页
  716 + if (resType.indexOf("HOST_X86SERVER") != -1 && protocol && protocol.split(",").length > 1) {
  717 + resType = 'X86SERVER_BMC';
  718 + }
  719 + //如果是HOST_X86SERVER服务器并且协议为snmp,或共享存储则根据厂商和型号判断类型
  720 + if ((resType.indexOf("HOST_X86SERVER") !== -1 && protocol =='SNMP') || resType.indexOf("STORAGE_SHARE") != -1) {
  721 + resType = this.detailPathByProviderAndModel(resType,resId);
  722 + }
  723 + //如果是虚拟化相关资源类型,则根据采集协议判断去那个页面
  724 + var resTypeList = ['VIRTUALIZATION_VMWARE_VHOST','VIRTUALIZATION_HUAWEI_VHOST','HUAWEI_CLOUD_VIRTUALHOST','ALI_CLOUD_ECS'];
  725 + if (resTypeList.indexOf(resType) != -1) {
  726 + if (protocol == 'SSH' || protocol == 'SNMP') {
  727 + resType = 'HOST_X86VIRTUAL';
  728 + }
  729 + }
  730 + //如果是虚拟化虚拟机资源,则直接走X86虚拟机页面
  731 + if (resType.indexOf("VIRTUALIZATION_VHOST") != -1) {
  732 + resType = 'HOST_X86VIRTUAL';
  733 + }
  734 + //如果是oracle数据库,则判定是否配置集群
  735 + if (resType == 'DATABASE_ORACLE'){
  736 + resType = this.checkHasCluster(resType,resId);
  737 + }
  738 +
  739 + return "template/detail/" + resType.toLowerCase();
  740 + },
  741 + checkHasCluster : function(resType,resId) {
  742 + $.ajax({
  743 + url: this.domainName + '/api-web/detail/block?access_token=' + layui.sessions.getToken()['access_token'],
  744 + data: {
  745 + resId: resId,
  746 + kpiId: 'KPI096EB5BA'
  747 + },
  748 + async: false,
  749 + success: function (res) {
  750 +
  751 + if (res && res.data && res.data.length > 0){
  752 + if (res.data[0].value == '是'){
  753 + resType = 'ORACLE_RAC';
  754 + }
  755 + }
  756 + }
  757 + });
  758 + return resType;
  759 + },
  760 + //BMC服务器和共享存储根据厂商和型号跳转不同的详情页
  761 + detailPathByProviderAndModel: function(resType,resId) {
  762 + $.ajax({
  763 + url: this.domainName + '/api-web/manage/resource/findById?access_token=' + layui.sessions.getToken()['access_token'],
  764 + data: {resId: resId},
  765 + async: false,
  766 + success: function (res) {
  767 + var res = res.obj;
  768 + var bean = res['bean'];
  769 +
  770 + //存放BMC服务器厂商和详情页关系的map
  771 + var BMCMap = new Map();
  772 + BMCMap.set('DELL', 'HOST_BMC_DELL');
  773 + BMCMap.set('H3C', 'HOST_BMC_H3C');
  774 + BMCMap.set('HUAWEI', 'HOST_BMC_HUAWEI');
  775 + BMCMap.set('LENOVO', 'HOST_BMC_LENOVO');
  776 + BMCMap.set("IBM", "HOST_BMC_IBM");
  777 + BMCMap.set('Inspur', 'HOST_BMC_INSPUR');
  778 + BMCMap.set('sugon', 'HOST_BMC_SUGON');
  779 + BMCMap.set('HP', 'HOST_BMC_HP');
  780 + BMCMap.set('HP_knifeBox', 'HOST_BMC_HP_KNIFEBOX');
  781 + BMCMap.set('HUAWEI_KNIFEBOX', 'HOST_BMC_HUAWEI_KNIFEBOX');
  782 + BMCMap.set('HUAWEI_BLADE', 'HOST_BMC_HUAWEI_BLADE');
  783 +
  784 + //存放共享存储厂商和详情页关系的map
  785 + var shareMap = new Map();
  786 + shareMap.set('HUAWEI', 'STORAGE_SHARE');
  787 + shareMap.set('Inspur', 'STORAGE_SHARE_INSPUR');
  788 +
  789 + if (resType.indexOf('HOST_X86SERVER') != -1) {
  790 + if (bean.provider == 'HP' && bean.model.split('-')[0] == 'C7000') {
  791 + resType = BMCMap.get('HP_knifeBox');
  792 + } else if (bean.provider == 'H3C' && bean.model.split('-')[1] == 'R690') {
  793 + resType = BMCMap.get('HP');
  794 + } else if (bean.provider === 'HUAWEI' && bean.model === 'E9000') {
  795 + resType = BMCMap.get('HUAWEI_KNIFEBOX');
  796 + } else if (bean.resCode && bean.resCode.indexOf('华为Blade__') && bean.parentId) {
  797 + resType = BMCMap.get('HUAWEI_BLADE');
  798 + } else {
  799 + if(BMCMap.get(bean.provider)){
  800 + resType = BMCMap.get(bean.provider)
  801 + }
  802 + }
  803 + }
  804 + if (resType.indexOf('STORAGE_SHARE') != -1) {
  805 + resType = shareMap.get(bean.provider)
  806 + }
  807 + }
  808 + })
  809 + return resType;
  810 + },
  811 + //打开性能曲线图
  812 + openLineChart: function (title, params) {
  813 + // Start 将对象转成key=value&key1=value1 LSQ 2022/1/17
  814 + let urlParams='';
  815 + for(let key in params){
  816 + if(params[key]){
  817 + urlParams+=key+'='+params[key]+'&'
  818 + }
  819 + }
  820 + urlParams=urlParams.substr(0,urlParams.length-1)
  821 + //End LSQ 2022/1/17
  822 + if (!title) {
  823 + title = "性能曲线图";
  824 + }
  825 + view('commonViewModel').render("template/detail/line").then(function (res) {
  826 + // Start ident==1为性能趋势 LSQ 2022/1/17
  827 + let type=1;
  828 + let content=laytpl(res.body).render(JSON.stringify(params));
  829 + if(params.ident && params.ident == 1){
  830 + type=2;
  831 + content=['/vue3/index.html#/vue3/pieDetailLine?'+urlParams, 'no'];
  832 + }
  833 + //End LSQ 2022/1/17
  834 + layer.open({
  835 + title: [title, 'font-size:18px;'],
  836 + // type: 1,
  837 + type: type,
  838 + area: ['80%', '90%'],
  839 + shadeClose: true,//开启遮罩层
  840 + id: 'line_chart_div',
  841 + // content: laytpl(res.body).render(JSON.stringify(params)),
  842 + content: content,
  843 + cancel: function () {
  844 + clearTimeout(obj.lineTimer);
  845 + }
  846 + });
  847 + });
  848 + },
  849 + //打开性能柱状图
  850 + openBarChart: function (title, params) {
  851 + if (!title) {
  852 + title = "使用情况";
  853 + }
  854 + view('commonViewModel').render("template/detail/bar").then(function (res) {
  855 + layer.open({
  856 + title: [title, 'font-size:18px;'],
  857 + type: 1,
  858 + area: ['90%', '600px'],
  859 + content: laytpl(res.body).render(JSON.stringify(params))
  860 + });
  861 + });
  862 + },
  863 + //将数组切割分组
  864 + splieceGroup: function (array, subLength) {
  865 + var index = 0;
  866 + var newArray = [];
  867 + while (index < array.length) {
  868 + newArray.push(array.slice(index, index += subLength));
  869 + }
  870 + return newArray;
  871 + },
  872 + //判定是否为空或者undefined wtc add
  873 + isNotEmpty: function (data) {
  874 + if (data != '' && data != null && data != undefined) {
  875 + return true
  876 + } else {
  877 + return false
  878 + }
  879 + },
  880 + getPreMonth(date) {
  881 + var arr = date.split('-');
  882 + var year = arr[0]; //获取当前日期的年份
  883 + var month = arr[1]; //获取当前日期的月份
  884 + var day = arr[2]; //获取当前日期的日
  885 + var days = new Date(year, month, 0);
  886 + days = days.getDate(); //获取当前日期中月的天数
  887 + var year2 = year;
  888 + var month2 = parseInt(month) - 1;
  889 + if (month2 == 0) {
  890 + year2 = parseInt(year2) - 1;
  891 + month2 = 12;
  892 + }
  893 + var day2 = day;
  894 + var days2 = new Date(year2, month2, 0);
  895 + days2 = days2.getDate();
  896 + if (day2 > days2) {
  897 + day2 = days2;
  898 + }
  899 + if (month2 < 10) {
  900 + month2 = '0' + month2;
  901 + }
  902 + var t2 = year2 + '年' + month2+'月';
  903 + return t2;
  904 + },
  905 + //生成uuid wtc add
  906 + uuid: function () {
  907 + var s = [];
  908 + var hexDigits = "0123456789abcdef";
  909 + for (var i = 0; i < 36; i++) {
  910 + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  911 + }
  912 + s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
  913 + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
  914 + s[8] = s[13] = s[18] = s[23] = "-";
  915 +
  916 + var uuid = s.join("");
  917 + return uuid;
  918 + },
  919 + //获取当日 joke add 0200422
  920 + getToday: function (type) {
  921 + var date = new Date();
  922 + var year = date.getFullYear();//当前年份
  923 + var month = date.getMonth();//当前月份
  924 + var data = date.getDate();//天
  925 + var hours = date.getHours();//小时
  926 + var minute = date.getMinutes();//分
  927 + var second = date.getSeconds();//秒
  928 + if (type === 'day') {
  929 + return year + "-" + obj.fnW(month + 1) + "-" + obj.fnW(data)
  930 + } else {
  931 + return year + "-" + obj.fnW(month + 1) + "-" + obj.fnW(data) + ' ' + obj.fnW(hours) + ":" + obj.fnW(minute) + ":" + obj.fnW(second);
  932 + }
  933 + },
  934 + //日期时间补0 joke add 0200422
  935 + fnW: function (str) {
  936 + var num;
  937 + str > 9 ? num = str : num = "0" + str;
  938 + return num;
  939 + },
  940 + getUrlParam: function (key) {
  941 + var href = window.location.href;
  942 + href = href.substr(0, href.indexOf("#"));
  943 + var url = href.split("?");
  944 + if (url.length <= 1) {
  945 + return "";
  946 + }
  947 + var params = url[1].split("&");
  948 +
  949 + for (var i = 0; i < params.length; i++) {
  950 + var param = params[i].split("=");
  951 + if (key == param[0]) {
  952 + return param[1];
  953 + }
  954 + }
  955 + return "";
  956 + },
  957 + //保存列
  958 + saveTableCols: function (data,sign) {
  959 + var accessToken = '';
  960 + layui.use(['sessions', 'common'], function () {
  961 + var sessions = layui.sessions;
  962 + accessToken = sessions.getToken()['access_token'];
  963 + });
  964 + var cols = data['cols'][0];
  965 + if(sign === 0){
  966 + var parseData=JSON.parse(data['cols']);
  967 + cols = parseData[0];
  968 + }
  969 + $.each(cols, function (i, e) {
  970 + if (e['isChild']) {
  971 + if (e['isChild'] && typeof e['isChild'] === 'function') {
  972 + e['isChild'] = e['isChild'] + '';
  973 + }
  974 + }
  975 + if (e['children']) {
  976 + $.each(e['children'], function (j, k) {
  977 + if (k['url'] && typeof k['url'] === 'function') {
  978 + k['url'] = k['url'] + '';
  979 + }
  980 + if (k['done'] && typeof k['done'] === 'function') {
  981 + k['done'] = k['done'] + '';
  982 + }
  983 + })
  984 + }
  985 + })
  986 + data['cols'] = JSON.stringify([cols]);
  987 + layer.load(2);
  988 + admin.req({
  989 + url: obj.domainName + '/api-web/bUsercustomTable/save?access_token=' + accessToken
  990 + , type: 'post'
  991 + , contentType: "application/json;charset=UTF-8"//指定消息请求类型
  992 + , data: JSON.stringify(data)
  993 + , error: function (e) {
  994 + layer.closeAll('loading');
  995 + }
  996 + }).done(function (res) {
  997 + layer.closeAll('loading');
  998 + layer.msg("保存成功", {icon: 1, time: 2000})
  999 + });
  1000 + },
  1001 + //获取列
  1002 + getTableCols: function (param, callback) {
  1003 + //获取配置的列
  1004 + admin.req({
  1005 + url: obj.domainName + '/api-web/bUsercustomTable/findByUserNameAndOthers'
  1006 + , data: param
  1007 + }).done(function (res) {
  1008 + var cols = null;
  1009 + if (res.object && res.object.cols) {
  1010 + cols = JSON.parse(res.object.cols)[0];
  1011 + $.each(cols, function (i, e) {
  1012 + if (e['isChild']) {
  1013 + if (e['isChild']) {
  1014 + e['isChild'] = eval("(function(){return " + e['isChild'] + " })()");
  1015 + }
  1016 + }
  1017 + if (e['children']) {
  1018 + $.each(e['children'], function (j, k) {
  1019 + if (k['url']) {
  1020 + k['url'] = eval("(function(){return " + k['url'] + " })()");
  1021 + }
  1022 + if (k['done']) {
  1023 + k['done'] = eval("(function(){return " + k['done'] + " })()");
  1024 + }
  1025 + })
  1026 + }
  1027 + })
  1028 + }
  1029 + if (callback) {
  1030 + callback(cols);
  1031 + }
  1032 + });
  1033 + },
  1034 + //列拖动事件
  1035 + dragCols: function (target) {
  1036 + $(".layui-table th").mousedown(function () {
  1037 + $(".layui-table th").mousemove(function () {
  1038 + $("#" + target).show();
  1039 + $("#" + target).removeClass("hide");
  1040 + });
  1041 + });
  1042 + },
  1043 + // 树表格列拖动/保存事件
  1044 + treeTableDragCols: function (tableTarget, toolBarTarget) {
  1045 + var toolBarHtml = '';
  1046 + if (toolBarTarget) {
  1047 + toolBarHtml = '<div class="layui-table-tool"><div class="layui-table-tool-temp">' + $(toolBarTarget).html() + '</div></div>';
  1048 + } else {
  1049 + toolBarHtml = '<div class="layui-table-tool"><div class="layui-table-tool-temp"><button class="layui-btn layui-btn-primary layui-btn-xs btn_save_cols toolbar-btn" lay-tips="保存列顺序"><i class="iconfont">&#xe633;</i></button></div></div>';
  1050 + }
  1051 + $(tableTarget).next().find('.layui-table-box').before(toolBarHtml);
  1052 + $(".layui-table th").mousedown(function () {
  1053 + $(".layui-table th").mousemove(function () {
  1054 + $(tableTarget).next().find('.layui-table-tool .btn_save_cols').removeClass('hide');
  1055 + $(tableTarget).next().find('.layui-table-tool .btn_save_cols').show();
  1056 + });
  1057 + });
  1058 + },
  1059 +
  1060 + // 普通表格导出到excel
  1061 + exportTableData: function (tableObj, title) {
  1062 + var cols = tableObj.config.cols[0].filter(item => (item.title && item.field));
  1063 + var tableData = layui.table.cache[tableObj.config.id];
  1064 + var headList = cols.map(item => item.title);
  1065 + var rowList = tableData.map(item => {
  1066 + var row = {};
  1067 + cols.forEach(col => {
  1068 + if (!col.templet) {
  1069 + row[col.field] = item[col.field];
  1070 + } else {
  1071 + var renderHtml = laytpl($(col.templet).html()).render(item).replace(/[\r\n]/g, '');
  1072 + if (renderHtml.match(/(<.+>)([^<]+)(<\/.+>)/)) {
  1073 + row[col.field] = renderHtml.match(/(<.+>)([^<]+)(<\/.+>)/)[2];
  1074 + if (!row[col.field].trim()) {
  1075 + row[col.field] = item[col.field];
  1076 + }
  1077 + } else {
  1078 + row[col.field] = renderHtml
  1079 + }
  1080 + }
  1081 + });
  1082 + return row;
  1083 + });
  1084 + obj.exportData(title, headList, rowList);
  1085 + },
  1086 + // 树表格导出到excel
  1087 + exportTreeTableData: function (tableObj, title) {
  1088 + var cols = tableObj.getTreeOptions().cols[0].filter(item => (item.title && item.field));
  1089 + var tableData = tableObj.getTableTreeData();
  1090 + var headList = cols.map(item => item.title);
  1091 + var rowList = [];
  1092 + rowList = treeToList(tableData, rowList, cols);
  1093 + obj.exportData(title, headList, rowList);
  1094 +
  1095 + function treeToList(treeData, rowList, cols) {
  1096 + treeData.forEach(item => {
  1097 + var row = {};
  1098 + cols.forEach(col => {
  1099 + if (!col.templet) {
  1100 + row[col.field] = item[col.field];
  1101 + } else {
  1102 + var renderHtml = laytpl($(col.templet).html()).render(item);
  1103 + var value = '';
  1104 + if (renderHtml.match(/(<.+>|\w)+(.+)(\w|<\/.+>)+/)) {
  1105 + value = renderHtml.match(/(<.+>|\w)+(.+)(\w|<\/.+>)+/)[0];
  1106 + }
  1107 + if (value) {
  1108 + row[col.field] = value
  1109 + } else {
  1110 + row[col.field] = renderHtml
  1111 + }
  1112 + }
  1113 + });
  1114 + rowList.push(row);
  1115 + if (item.children && item.children.length > 0) {
  1116 + treeToList(item.children, rowList, cols);
  1117 + }
  1118 + });
  1119 + return rowList;
  1120 + }
  1121 + },
  1122 +
  1123 + /**
  1124 + * 导出数据至excel
  1125 + *
  1126 + * @return null
  1127 + * @author 惠佳旭
  1128 + * @date 2020/11/23
  1129 + * @param title 导出excel文件名
  1130 + * @param headList 导出excel列头
  1131 + * @param rowList 导出excel数据
  1132 + */
  1133 + exportData: function (title, headList, rowList) {
  1134 + if (rowList.length < 1) {
  1135 + layer.msg('暂无数据导出...', {icon: 0});
  1136 + return;
  1137 + }
  1138 + if (layui.device().ie) {
  1139 + layer.msg('不支持ie导出...', {icon: 0});
  1140 + return;
  1141 + }
  1142 + // 转换bodyData
  1143 + var bodyData = rowList.map(row => Object.values(row).map(item => item ? item.toString().trim().replace(/,/g, ',') : '').join(','));
  1144 + // 创建下载文件的a标签
  1145 + var alink = document.createElement('a');
  1146 + var content = encodeURIComponent(headList.join(',') + '\r\n' + bodyData.join('\r\n'));
  1147 + var contentType = ({csv: 'text/csv', xls: 'application/vnd.ms-excel'})['xls'];
  1148 + alink.href = 'data:' + contentType + ';charset=utf-8,\ufeff' + content;
  1149 + alink.download = title + '.xls';
  1150 + document.body.appendChild(alink);
  1151 + alink.click();
  1152 + document.body.removeChild(alink);
  1153 + },
  1154 +
  1155 + /**检查权限*/
  1156 + checkPermission:function(access_token) {
  1157 + // Start Wang 2021/12/13 19:42 权限列表,如果能从缓存中加载到数据,则获取缓存中的数据
  1158 + var ps = sessionStorage.getItem('permissions');
  1159 + if(ps && ps != '' && ps != null){
  1160 + return ps.split(',');
  1161 + }
  1162 + // End Wang 2021/12/13 19:43 权限列表,如果能从缓存中加载到数据,则获取缓存中的数据
  1163 + var pers = [];
  1164 + $.ajax({
  1165 + type : 'get',
  1166 + url : obj.domainName + '/api-u/users/current?access_token='+access_token,
  1167 + contentType : "application/json; charset=utf-8",
  1168 + async : false,
  1169 + success : function(data) {
  1170 + pers = data.permissions;
  1171 + $("[permission]").each(function () {
  1172 + var per = $(this).attr("permission");
  1173 + if ($.inArray(per, pers) < 0) {
  1174 + $(this).hide();
  1175 + }
  1176 + });
  1177 + }
  1178 + });
  1179 + return pers;
  1180 + },
  1181 + /* pid转children形式 */
  1182 + pidToChildren: function (data, idName, pidName, childName, pId,canNotCheckPranet) {
  1183 + childName || (childName = 'children');
  1184 + var newList = [];
  1185 + for (var i = 0; i < data.length; i++) {
  1186 + (pId == undefined) && (pId = obj.getPids(data, idName, pidName));
  1187 + if (obj.pidEquals(data[i][pidName], pId)) {
  1188 + var children = this.pidToChildren(data, idName, pidName, childName, data[i][idName],canNotCheckPranet);
  1189 + if (canNotCheckPranet === false){ //当不能选择时,设置父节点不可选择
  1190 + if(children.length>0){
  1191 + data[i].disabled = true;
  1192 + }
  1193 + }
  1194 + (children.length > 0) && (data[i][childName] = children);
  1195 + newList.push(data[i]);
  1196 + }
  1197 + }
  1198 + return newList;
  1199 + },
  1200 + /** 获取顶级的pId */
  1201 + getPids: function (list, idName, pidName) {
  1202 + var pids = [];
  1203 + for (var i = 0; i < list.length; i++) {
  1204 + var hasPid = false;
  1205 + for (var j = 0; j < list.length; j++) {
  1206 + if (i != j && list[j][idName] == list[i][pidName]) {
  1207 + hasPid = true;
  1208 + }
  1209 + }
  1210 + if (!hasPid) {
  1211 + pids.push(list[i][pidName]);
  1212 + }
  1213 + }
  1214 + return pids;
  1215 + },
  1216 +
  1217 + /** 判断pId是否相等 */
  1218 + pidEquals: function (pId, pIds) {
  1219 + if (obj.isClass(pIds) == 'Array') {
  1220 + for (var i = 0; i < pIds.length; i++) {
  1221 + if (pId == pIds[i]) {
  1222 + return true;
  1223 + }
  1224 + }
  1225 + } else {
  1226 + return pId == pIds;
  1227 + }
  1228 + return false;
  1229 + },
  1230 + /** 获取变量类型 */
  1231 + isClass: function (o) {
  1232 + if (o === null)
  1233 + return 'Null';
  1234 + if (o === undefined)
  1235 + return 'Undefined';
  1236 + return Object.prototype.toString.call(o).slice(8, -1);
  1237 + },
  1238 + copyText: function (text, formId) {
  1239 + var textarea = document.createElement("textarea"); //创建input对象
  1240 + var currentFocus = document.activeElement; //当前获得焦点的元素
  1241 + var toolBoxwrap = document.getElementById(formId); //将文本框插入到NewsToolBox这个之后
  1242 + toolBoxwrap.appendChild(textarea); //添加元素
  1243 + textarea.value = text;
  1244 + textarea.focus();
  1245 + if (textarea.setSelectionRange) {
  1246 + textarea.setSelectionRange(0, textarea.value.length); //获取光标起始位置到结束位置
  1247 + } else {
  1248 + textarea.select();
  1249 + }
  1250 + try {
  1251 + var flag = document.execCommand("copy"); //执行复制
  1252 + } catch (e) {
  1253 + var flag = false;
  1254 + }
  1255 + toolBoxwrap.removeChild(textarea); //删除元素
  1256 + currentFocus.focus();
  1257 + return flag;
  1258 + },
  1259 + layJump: function (layHref) {
  1260 + var alink = document.createElement('a');
  1261 + var param = '';
  1262 + if (layHref.indexOf('=') !== -1) {
  1263 + param = "=" + encodeURIComponent(layHref.split('=')[1]);
  1264 + }
  1265 + alink.setAttribute("lay-href",layHref.split('=')[0] + param);
  1266 + admin.req({
  1267 + url: obj.domainName + '/api-web/mxgraph/getJtopoInfoById/'+layHref.split('=')[2],
  1268 + success(response) {
  1269 + //LH 修改 弹框展示子拓扑
  1270 + layer.open({
  1271 + title:response.object.topoName,
  1272 + type: 2,
  1273 + area:['90%','90%'],
  1274 + content: obj.graphEditorOrigin + "/jgraph/grapheditor/viewer.html?access_token=" + localStorage.getItem('access_token') + '&id='+layHref.split('=')[2] ,//+ "&layout=organic",
  1275 + })
  1276 + },
  1277 + error() {
  1278 + layer.closeAll('loading');
  1279 + layer.msg('生成资源拓扑失败...', {icon: 2});
  1280 + }
  1281 + });
  1282 +
  1283 + // document.body.appendChild(alink);
  1284 + // alink.click();
  1285 + // document.body.removeChild(alink);
  1286 + },
  1287 +
  1288 + /**
  1289 + * @desc 查看资源详细
  1290 + * @author wangfeng
  1291 + * @date 2020/9/1 15:42
  1292 + **/
  1293 + viewMxGraphNodeResInfo: function (resId) {
  1294 + admin.req({
  1295 + url: obj.domainName + "/api-web/home/resource/findById?resId=" + resId
  1296 + , type: "get"
  1297 + , done: function (res) {
  1298 + if (res.str === 'false') {
  1299 + layer.msg('暂无该资源权限!', {icon: 0});
  1300 + return;
  1301 + }
  1302 + var data = res.object;
  1303 + if (data) {
  1304 + // var resTypeName = data.resTypeName ? data.resTypeName + " | " : "";
  1305 + // var resName = data.resName ? data.resName + " | " : "";
  1306 + // var resIp = data.ip ? data.ip + " | " : "";
  1307 + // var resPositon = data.resPositon ? data.resPositon + " | " : "";
  1308 + // var resLabel = data.resLabel ? data.resLabel + " | " : "";
  1309 + // var admin = data.admin ? data.admin : "";
  1310 + // var title = resTypeName + resName + resIp + resPositon + resLabel + admin;
  1311 + var resId = data.resId;
  1312 + var resType = data.resType;
  1313 + var resName =data.resName;
  1314 + var ip = data.ip;
  1315 + var resTypeName = data.resTypeName;
  1316 + var adminName = data.adminName;
  1317 + var manageIp = data.manageIp;
  1318 + var collProtocol = data.collProtocol;
  1319 + var title = resName;
  1320 + if (title && title != '') {
  1321 + title += '|';
  1322 + }
  1323 + if (resTypeName && resType !== 'HOST_X86SERVER') {
  1324 + title += resTypeName + '|';
  1325 + }
  1326 + if (ip) {
  1327 + if (resType === 'HOST_X86SERVER') {
  1328 + if (collProtocol && (collProtocol.split(",").length > 1 || collProtocol === 'SSH')) {
  1329 + title += '应用IP-' + ip + '|';
  1330 + }
  1331 + } else {
  1332 + title += ip + '|';
  1333 + }
  1334 + }
  1335 + if (resType === 'HOST_X86SERVER' && collProtocol && collProtocol.indexOf('SNMP') !== -1 ) {
  1336 + if (manageIp) {
  1337 + title += '管理IP-' + manageIp + '|';
  1338 + }
  1339 + }
  1340 + if (adminName) {
  1341 + title += adminName + '|';
  1342 + }
  1343 + if (title.length > 0) {
  1344 + title = title.substr(0, title.length - 1);
  1345 + }
  1346 + if (!commonDetail) {
  1347 + commonDetail = layui.commonDetail;
  1348 + }
  1349 + if (data.pingEnable == '2') { //如果pingEnable为2,则进入ping状态详情页面
  1350 + commonDetail.openNewWin('template/detail/pingIndex', title, {'resId': data.resId}, false);
  1351 + } else { //否则进入监控详情页面
  1352 + commonDetail.openDetail(data.resId, data.resType, title);
  1353 + }
  1354 + } else {
  1355 + layer.msg("获取资源详细信息失败,请稍后再试!", {offset: '15px', icon: 7, time: 2000});
  1356 + }
  1357 + }
  1358 + });
  1359 + },
  1360 + viewResTopo: function (resId) {
  1361 + layer.load(2);
  1362 + admin.req({
  1363 + url: obj.domainName + '/api-web/mxgraph/generateByResId',
  1364 + data: {resId},
  1365 + success(response) {
  1366 + layer.closeAll('loading');
  1367 + if (response && response.success) {
  1368 + layer.open({
  1369 + type: 2,
  1370 + content: obj.graphEditorOrigin + "/jgraph/grapheditor/viewer.html?access_token=" + localStorage.getItem('access_token') + '&id=' + response.str + "&layout=organic",
  1371 + area: ['98%', '98%'],
  1372 + title: ''
  1373 + });
  1374 + } else {
  1375 + layer.msg('生成资源拓扑失败!', {icon: 2});
  1376 + }
  1377 + },
  1378 + error() {
  1379 + layer.closeAll('loading');
  1380 + layer.msg('生成资源拓扑失败...', {icon: 2});
  1381 + }
  1382 + });
  1383 + },
  1384 + viewBizTopo: function (busId) {
  1385 + layer.load(2);
  1386 + admin.req({
  1387 + url: obj.domainName + '/api-web/mxgraph/generateByBusId',
  1388 + data: {busId},
  1389 + success(response) {
  1390 + layer.closeAll('loading');
  1391 + if (response && response.success) {
  1392 + layer.open({
  1393 + type: 2,
  1394 + content: obj.graphEditorOrigin + "/jgraph/grapheditor/viewer.html?access_token=" + localStorage.getItem('access_token') + '&id=' + response.str + "&layout=organic",
  1395 + area: ['98%', '98%'],
  1396 + title: ''
  1397 + });
  1398 + } else {
  1399 + layer.msg('生成业务拓扑失败!', {icon: 2});
  1400 + }
  1401 + },
  1402 + error() {
  1403 + layer.closeAll('loading');
  1404 + layer.msg('生成业务拓扑失败...', {icon: 2});
  1405 + }
  1406 + });
  1407 + },
  1408 +
  1409 + /**
  1410 + * @description 采集器选择一级是所属域,第二级别是域下采集器
  1411 + * @author XuHaoJie
  1412 + * @date 2021/6/9 15:43
  1413 + */
  1414 + collectorTree: function (data, parentId, parentName, childName, childId) {
  1415 + var dataList=[];
  1416 + $.each(data,function(i,v){
  1417 + var child=[];
  1418 + $.each(v.children,function (x,y) {
  1419 + child.push({name:y[childName]+' | '+y.deployIp,value:y[childId]})
  1420 + })
  1421 + var val={
  1422 + name:v[parentName],
  1423 + value: i==0?parentId:-(i+1),
  1424 + children: child,
  1425 + }
  1426 + dataList.push(val);
  1427 + })
  1428 + return dataList;
  1429 + },
  1430 +
  1431 + /** 业务下拉选择(tree)
  1432 + *radio传入则为单选,不传或传入false为多选 joke add
  1433 + *strict传入false为非严格父子关系,不传或传入非false为严格父子关系 joke add
  1434 + * canNotCheckPranet传入true为不能选择,传入false为可以选择
  1435 + */
  1436 + busTreeSelect: function (xmSelectParams,canNotCheckPranet) {
  1437 + //绑定业务下拉选择数据
  1438 + admin.req({
  1439 + url: this.domainName + '/api-web/home/business/findAllBusType',
  1440 + async: false,
  1441 + success: function (response) {
  1442 + if (response && response.success) {
  1443 + var bizList = response.data.map(item => {
  1444 + return {
  1445 + name: item.busTypeName,
  1446 + value: item.busId,
  1447 + parentId: item.parentId
  1448 + }
  1449 + });
  1450 + var bizTree = obj.pidToChildren(bizList, 'value', 'parentId',canNotCheckPranet);
  1451 + // 影响业务下拉框
  1452 + xmSelect.render(Object.assign({
  1453 + el: '#',
  1454 + name: '',
  1455 + tips: '=所属业务=',
  1456 + //默认开启多选、选完不关闭下拉
  1457 + radio: false,
  1458 + clickClose: false,
  1459 + //开启搜索
  1460 + filterable: true,
  1461 + direction: 'down',
  1462 + initValue: [],
  1463 + toolbar: {
  1464 + show: true,
  1465 + list: ['ALL', 'REVERSE', 'CLEAR']
  1466 + },
  1467 + height: '400px',
  1468 + tree: {
  1469 + show: true,
  1470 + showFolderIcon: true,
  1471 + showLine: true,
  1472 + strict: true,
  1473 + //间距
  1474 + indent: 20,
  1475 + },
  1476 + data: bizTree,
  1477 + on: function (data) {
  1478 + }
  1479 + }, xmSelectParams));
  1480 + } else {
  1481 + layer.msg('获取业务失败', {icon: 2});
  1482 + }
  1483 + },
  1484 + error: function () {
  1485 + layer.msg('获取业务失败', {icon: 2});
  1486 + }
  1487 + },);
  1488 + },
  1489 + getTingyunToken: function () {
  1490 + var token = '';
  1491 +
  1492 + var api_key = '';
  1493 + var secret_key = '';
  1494 + $.ajax({
  1495 + url: '/config/getConfig',
  1496 + data: {
  1497 + configName: 'config.tingyun'
  1498 + },
  1499 + async: false,
  1500 + success(response) {
  1501 + api_key = response.api_key;
  1502 + secret_key = response.secret_key;
  1503 + }
  1504 + });
  1505 + var timestamp = Date.now();
  1506 + var auth = md5(`api_key=${api_key}&secret_key=${secret_key}&timestamp=${timestamp}`);
  1507 +
  1508 + var formData = new FormData();
  1509 + formData.append("api_key", api_key);
  1510 + formData.append("auth", auth);
  1511 + formData.append("timestamp", timestamp);
  1512 + $.ajax({
  1513 + url: sessionStorage.getItem('tingyun') + '/auth-api/auth/token',
  1514 + type: 'POST',
  1515 + processData: false,
  1516 + mimeType: "multipart/form-data",
  1517 + contentType: false,
  1518 + async: false,
  1519 + data: formData,
  1520 + success(response) {
  1521 + response = JSON.parse(response)
  1522 + if (response && response.code == '200') {
  1523 + token = 'Bearer ' + response.access_token;
  1524 + }
  1525 + }
  1526 + });
  1527 + sessionStorage.setItem("tingyun_token", token);
  1528 + return token;
  1529 + },
  1530 + tingyunReq: function (ajaxParams) {
  1531 + var response = {
  1532 + success: false,
  1533 + msg: '',
  1534 + data: []
  1535 + }
  1536 + var token = sessionStorage.getItem("tingyun_token");
  1537 + if (!token) {
  1538 + token = obj.getTingyunToken();
  1539 + }
  1540 + if (!token) {
  1541 + response.msg = '获取token失败!';
  1542 + ajaxParams.success(response);
  1543 + return;
  1544 + }
  1545 + var successFun = ajaxParams.success;
  1546 + var errorFun = ajaxParams.error;
  1547 + delete ajaxParams.success;
  1548 + delete ajaxParams.error;
  1549 + var failCount = 2;
  1550 + var res = null;
  1551 + var err = null;
  1552 + do {
  1553 + try {
  1554 + $.ajax(Object.assign({
  1555 + url: '',
  1556 + headers: {
  1557 + Authorization: token
  1558 + },
  1559 + async: false,
  1560 + success(response) {
  1561 + res = response;
  1562 + if (response && response.code.toString().startsWith('401')) {
  1563 + throw new Error();
  1564 + }
  1565 + },
  1566 + error(error) {
  1567 + err = error;
  1568 + throw new Error();
  1569 + }
  1570 + }, ajaxParams));
  1571 + } catch (e) {
  1572 + failCount--;
  1573 + if (failCount) {
  1574 + token = obj.getTingyunToken();
  1575 + }
  1576 + continue;
  1577 + }
  1578 + failCount = 0;
  1579 + } while (failCount)
  1580 + if (res) {
  1581 + successFun(res);
  1582 + } else {
  1583 + errorFun();
  1584 + }
  1585 + },
  1586 + //音频播放
  1587 + audioPlayer: function (url) {
  1588 + var audio = document.createElement('audio')
  1589 + if (audio.canPlayType) {
  1590 + var element = document.createElement('source')
  1591 + element.setAttribute('src', url)
  1592 + element.setAttribute('type', 'audio/mpeg')
  1593 + audio.appendChild(element)
  1594 + audio.load()
  1595 + audio.muted=true;
  1596 + audio.playclip = function () {
  1597 + audio.pause();
  1598 + audio.currentTime = 0;
  1599 + audio.play();
  1600 + }
  1601 + return audio
  1602 + }
  1603 + },
  1604 +
  1605 + /**
  1606 + * 导出数据至excel 可以修改sheet
  1607 + *
  1608 + * @return null
  1609 + * @author 徐毫杰
  1610 + * @date 2021/08/01
  1611 + * @param title 导出excel文件名
  1612 + * @param headList 导出excel列头
  1613 + * @param rowList 导出excel数据
  1614 + * @param sheet 导出excel sheet页
  1615 + */
  1616 + exportDataExcel: function (title, headList, rowList, sheetName) {
  1617 + rowList.unshift(headList);
  1618 + var sheet = XLSX.utils.aoa_to_sheet(rowList);
  1619 + openDownloadDialog(sheet2blob(sheet,sheetName), title+'.xlsx');
  1620 + },
  1621 +
  1622 + /**
  1623 + * @description 根据用户资源权限或、业务权限、资源类型权限获取详情页展示页签(优先度由高到低)
  1624 + * @author XuHaoJie
  1625 + * @date 2021/9/23 11:41
  1626 + */
  1627 + getShowType: function (resId,username) {
  1628 + //默认查出全部
  1629 + var value='all';
  1630 + //查找用户资源权限
  1631 + admin.req({
  1632 + url: this.domainName + '/api-web/manage/resource/getShowType?resId='+resId+'&username='+username,
  1633 + async: false,
  1634 + success: function (response) {
  1635 + if (response && response.success) {
  1636 + value = response.str;
  1637 + }
  1638 + },
  1639 + error: function () {
  1640 + layer.msg('获取用户权限失败', {icon: 2});
  1641 + }
  1642 + });
  1643 + return value;
  1644 + },
  1645 +
  1646 + };
  1647 +
  1648 + //通用的打开下载对话框方法,没有测试过具体兼容性
  1649 + //url 下载地址,也可以是一个blob对象,必选
  1650 + //saveName 保存文件名,可选
  1651 + function openDownloadDialog(url, saveName) {
  1652 + if(typeof url == 'object' && url instanceof Blob)
  1653 + {
  1654 + url = URL.createObjectURL(url); // 创建blob地址
  1655 + }
  1656 + var aLink = document.createElement('a');
  1657 + aLink.href = url;
  1658 + aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
  1659 + var event;
  1660 + if(window.MouseEvent) event = new MouseEvent('click');
  1661 + else
  1662 + {
  1663 + event = document.createEvent('MouseEvents');
  1664 + event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  1665 + }
  1666 + aLink.dispatchEvent(event);
  1667 + }
  1668 + // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
  1669 + function sheet2blob(sheet, sheetName) {
  1670 + sheetName = sheetName || 'sheet1';
  1671 + var workbook = {
  1672 + SheetNames: [sheetName],
  1673 + Sheets: {}
  1674 + };
  1675 + workbook.Sheets[sheetName] = sheet;
  1676 + // 生成excel的配置项
  1677 + var wopts = {
  1678 + bookType: 'xlsx', // 要生成的文件类型
  1679 + bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  1680 + type: 'binary'
  1681 + };
  1682 + var wbout = XLSX.write(workbook, wopts);
  1683 + var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
  1684 + // 字符串转ArrayBuffer
  1685 + function s2ab(s) {
  1686 + var buf = new ArrayBuffer(s.length);
  1687 + var view = new Uint8Array(buf);
  1688 + for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  1689 + return buf;
  1690 + }
  1691 + return blob;
  1692 + }
  1693 + //退出
  1694 + admin.events.logout = function () {
  1695 + var logoutIdx = layer.confirm('确定退出登录?', function () {
  1696 + admin.exit();
  1697 + layer.close(logoutIdx);
  1698 + });
  1699 + };
  1700 + //菜单折叠事件
  1701 + admin.events.closeMenu = function () {
  1702 + admin.sideFlexible();
  1703 + };
  1704 +
  1705 + //监听F5刷新
  1706 + $(document).keydown(function (e) {
  1707 + e = e || window.event;
  1708 + if ((e.ctrlKey && e.keyCode == 82) || //ctrl+R
  1709 + e.keyCode == 116) {//F5刷新
  1710 +
  1711 + //获取首页
  1712 + var firstTab = $('.layui-tab-title').children().first().attr('lay-id');
  1713 +
  1714 + if (firstTab === '/index/' || firstTab === '/') {
  1715 +
  1716 + location.hash = "/";
  1717 + } else {
  1718 + //刷新后跳转到首页(用户默认首页)
  1719 + location.hash = firstTab;
  1720 + }
  1721 +
  1722 + if ($.isFunction(admin.closeAllTabs)) {
  1723 + admin.closeAllTabs();
  1724 + }
  1725 +
  1726 + return false;
  1727 + }
  1728 + });
  1729 +
  1730 + //检索条件区域收缩事件
  1731 + $("a.search_expend_icon").on("click", function () {
  1732 + if ($(this).hasClass("expend")) {
  1733 + $(this).parent().css("height", "auto")
  1734 + $(".layui-status .layui-form-item").slideDown(300, 'linear');
  1735 + } else {
  1736 + $(".layui-status .layui-form-item").not(":eq(0)").slideUp(300, 'linear');
  1737 + }
  1738 + $(this).toggleClass("expend");
  1739 + });
  1740 +
  1741 + //解决layui-table-tips不能点击其他地方关闭问题 joke add 20200420
  1742 + document.onclick = function (event) {
  1743 + //如果页面中有layui-table-tips样式,且点击其他的元素不是layui-table-tips或者点击元素的腹肌不是layui-table-tips(资源名称需要判定父级)
  1744 + if ($('.layui-table-tips').length > 0 && event.target.className.indexOf('layui-table-tips') == -1 && event.target.parentNode.className.indexOf('layui-table-tips') == -1) {
  1745 + $('.layui-table-tips-c').click();
  1746 + }
  1747 + };
  1748 +
  1749 + //自动化巡检系统
  1750 + admin.events.inspectionsys = function () {
  1751 + var accessToken = '';
  1752 + layui.use(['sessions', 'common'], function () {
  1753 + var sessions = layui.sessions;
  1754 + accessToken = sessions.getToken()['access_token'];
  1755 + });
  1756 + var url = obj.domainInspectionURI + "/start/index.html#/access_token=" + accessToken;
  1757 + window.open(url);
  1758 + }
  1759 + // 资产管理系统
  1760 + admin.events.assetsmanage = function () {
  1761 + var accessToken = '';
  1762 + layui.use(['sessions', 'common'], function () {
  1763 + var sessions = layui.sessions;
  1764 + accessToken = sessions.getToken()['access_token'];
  1765 + });
  1766 + var url = obj.domainAssetsManage + "/ITAM/index.jsp?access_token=" + accessToken;
  1767 + window.open(url);
  1768 + };
  1769 +
  1770 + // ip管理系统
  1771 + admin.events.ipmanage = function () {
  1772 + var accessToken = '';
  1773 + layui.use(['sessions', 'common'], function () {
  1774 + var sessions = layui.sessions;
  1775 + accessToken = sessions.getToken()['access_token'];
  1776 + });
  1777 + var url = obj.domainIpManage + "?access_token=" + accessToken;
  1778 + window.open(url);
  1779 + };
  1780 +
  1781 + // 科来系统
  1782 + admin.events.kelai = function () {
  1783 + var accessToken = '';
  1784 + layui.use(['sessions', 'common'], function () {
  1785 + var sessions = layui.sessions;
  1786 + accessToken = sessions.getToken()['access_token'];
  1787 + });
  1788 + //查询科来系统账号及密码
  1789 + admin.req({
  1790 + url: obj.domainName + '/api-web/userRefSystem/getByUsernameAndSystem',
  1791 + type: "GET",
  1792 + dataType: "json",
  1793 + data:{
  1794 + username: localStorage.getItem("lgn"),
  1795 + refSystem: 'kelai'
  1796 + },
  1797 + success: function (res) {
  1798 + if (res && res.success && res.object){
  1799 + var url = obj.kelaiTargetUrl;
  1800 + url = url.replace('{USERNAME}',res.object.account).replace('{PASSWORD}',obj.Base64.decode(res.object.password))
  1801 + window.open(url);
  1802 + }else{
  1803 + layer.alert('请先绑定科来账号');
  1804 + }
  1805 + }
  1806 + })
  1807 + };
  1808 +
  1809 + //第三方系统账号绑定 joke add 20210525
  1810 + admin.events.setAccount = function () {
  1811 + view('data-setting-account').render('template/user/accountSet').then(function (res) {
  1812 + layer.open({
  1813 + title: ['第三方账号绑定', 'font-size:18px;'],
  1814 + type: 1,
  1815 + area: ['450px', '300px'],
  1816 + content: res.body
  1817 + });
  1818 + });
  1819 + };
  1820 +
  1821 + /**
  1822 + * 打开第三方系统界面
  1823 + * <p>
  1824 + * 作者: Wang
  1825 + * 时间:2022/2/9 17:10
  1826 + */
  1827 + admin.events.openOtherSystem = function (){
  1828 + let code = $(this).attr("data-code");
  1829 + admin.events[code].call();
  1830 + }
  1831 +
  1832 + //监听浏览器窗口变化
  1833 + $(window).resize(function () { //当浏览器大小变化时
  1834 + resizePageWidth();
  1835 + });
  1836 +
  1837 + function resizePageWidth() {
  1838 + var pagewidth = $('.layui-body').width() - 40;
  1839 + $(".layui-table-page").css({width: pagewidth + "px"});
  1840 + };
  1841 + //修改密码 joke add 20210413
  1842 + admin.events.updtpswd = function () {
  1843 + view('data-setting-pwd').render('template/user/password').then(function (res) {
  1844 + layer.open({
  1845 + title: ['修改密码', 'font-size:18px;'],
  1846 + type: 1,
  1847 + area: ['450px', '300px'],
  1848 + content: res.body
  1849 + });
  1850 + });
  1851 + };
  1852 + //修改基本信息 joke add 20211206
  1853 + admin.events.changeInfo = function () {
  1854 + obj.openWin('baseconfig/user/userChange', '个人信息修改', {id: sessionStorage.getItem('user_id'),type:'userChange'}, ['保存', '取消'], function f() {
  1855 + $("#user_form_save_id").trigger("click");
  1856 + },null,['60%', '45%']);
  1857 + };
  1858 +
  1859 + // 监听拓扑iframe事件
  1860 + window.onmessage = function (messageEvent) {
  1861 + if (messageEvent.data.type === 'function') {
  1862 + // 如果是执行方法
  1863 + var result = eval(messageEvent.data.evalParam);
  1864 + }
  1865 + }
  1866 +
  1867 + //全局搜索框回车事件
  1868 + $('#allSearchKeywords').keydown(function (e) {
  1869 + if (e.keyCode === 13) {
  1870 + $('[layadmin-event="globalSearch"]').trigger("click");
  1871 + }
  1872 + })
  1873 + // 日期个格式化
  1874 + Date.prototype.format = function (fmt,hoursTime) {
  1875 + //12小时制和24小时制
  1876 + var hours=12;
  1877 + if(hoursTime==24){
  1878 + hours=24;
  1879 + }
  1880 + var o = {
  1881 + "M+": this.getMonth() + 1, //月份
  1882 + "d+": this.getDate(), //日
  1883 + "h+": this.getHours() % hours == 0 ? hours : this.getHours() % hours, //小时
  1884 + "H+": this.getHours(), //小时
  1885 + "m+": this.getMinutes(), //分
  1886 + "s+": this.getSeconds(), //秒
  1887 + "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  1888 + "S": this.getMilliseconds() //毫秒
  1889 + };
  1890 + if (/(y+)/.test(fmt))
  1891 + fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  1892 + for (var k in o)
  1893 + if (new RegExp("(" + k + ")").test(fmt))
  1894 + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  1895 + return fmt;
  1896 + }
  1897 +
  1898 + // 表单验证
  1899 + form.verify({
  1900 + json: function (d) {
  1901 + try {
  1902 + if (d) {
  1903 + var obj = JSON.parse(d);
  1904 + }
  1905 + } catch (e) {
  1906 + return "请输入格式正确的JSON"
  1907 + }
  1908 + }
  1909 + });
  1910 + //对外暴露的接口
  1911 + exports('common', obj);
  1912 +});
  1 +<!--默认布局-->
  2 +<div class="layui-layout layui-layout-admin">
  3 + <script>
  4 + var show = location.search.substr(1).split("&")[0].split("=")[1];
  5 + if(show === '0'){
  6 + document.querySelector("body").classList.add("layout-nav-hide");
  7 + }
  8 +
  9 + var editFlag = location.search.substr(1).split("&")[1];
  10 + if(editFlag){
  11 + var name = editFlag.split("=")[0];
  12 + var val = editFlag.split("=")[1] == "true"?true:false;
  13 + if(name === "editFlag"){
  14 + localStorage.setItem("editFlag",val);
  15 + }
  16 + }
  17 + var menuIsopen = 'false';
  18 + layui.use(['jquery'], function () {
  19 + var $ = layui.jquery;
  20 + // 读取配置文件
  21 + $.ajax({
  22 + url: sessionStorage.getItem('domainName') + '/api-web/sysConf/getByCode',
  23 + async: false,
  24 + data: {
  25 + code: 'view_menu_isopen',
  26 + access_token: localStorage.getItem('access_token')
  27 + },
  28 + success(response) {
  29 + if (response && response.success && response.object) {
  30 + menuIsopen = response.object.value;
  31 + }
  32 + }
  33 + });
  34 + });
  35 +
  36 +
  37 + </script>
  38 + <div class="layui-header">
  39 + <!-- 头部区域 -->
  40 + <ul class="layui-nav layui-layout-left">
  41 + <li class="layui-nav-item layadmin-flexible" lay-unselect>
  42 + <a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
  43 + <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
  44 + </a>
  45 + </li>
  46 + <!--判定是否有daping角色,如果有则显示该菜单 joke add 20211203-->
  47 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/checkHasRole?roleCode=daping">
  48 + {{# if(d.count > 0){ }}
  49 + <li class="layui-nav-item" lay-tips="展示大屏">
  50 + <a href="javascript:;" layadmin-event="toBigScreen" ><img src="/src/style/img/icon-daping.png" style="width: 16px;height: 16px"></a>
  51 + </li>
  52 + {{# } }}
  53 + </script>
  54 +
  55 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-web/sxview/getbizListByUser?access_token={{localStorage.getItem('access_token')}}">
  56 +
  57 + {{# if(d.data.length>0){ }}
  58 + <li class="layui-nav-item" >
  59 +
  60 + <div id="toYTHView_div" >
  61 + <dd layadmin-event="toYTHViewScreen" title="一体化监控台"><a><img src="/src/style/img/icon-yitihuadaping.png" style="width: 16px;height: 16px"></a></dd>
  62 + </div>
  63 + </li>
  64 +
  65 + {{# } }}
  66 + </script>
  67 +
  68 +
  69 + <li class="layui-nav-item" lay-unselect>
  70 + <a href="javascript:;" layadmin-event="refresh" title="刷新">
  71 + <i class="layui-icon layui-icon-refresh-3"></i>
  72 + </a>
  73 + </li>
  74 +
  75 + </ul>
  76 + <img src="/src/style/img/logo.png" class="logo">
  77 + <ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
  78 + <!--搜索框检索-->
  79 + <!-- <li class="layui-nav-item layui-hide-xs">-->
  80 + <!-- <input type="text" class="layui-input" id="allSearchKeywords" style="margin-top: 6px">-->
  81 + <!-- </li>-->
  82 + <li class="layui-nav-item layui-hide-xs" lay-tips="全局搜索">
  83 + <a href="javascript:;" layadmin-event="globalSearch"><i class="layui-icon layui-icon-search"></i></a>
  84 + </li>
  85 +<!-- xwx add 首页增加业务健康度入口 2021-10-25 start-->
  86 + <li class="layui-nav-item" lay-unselect>
  87 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken">
  88 + <a href="javascript:;"><img src="/src/style/img/icon-1.png" style="width: 16px;height: 16px;"></a>
  89 + {{#
  90 + var roles = '';
  91 + layui.each(d.object.sysRoles, function(idx, role){
  92 + roles += role.code+",";
  93 + });
  94 + }}
  95 + <li><input type="hidden" id="hq_entrance" value="{{roles}}"></li>
  96 + <dl class="layui-nav-child">
  97 + <!--调整到刷新旁边,此处去掉 lu 屏蔽 20211130-->
  98 + <!-- <dd layadmin-event="toBigScreen" style="text-align: left;"><a><img src="/src/style/img/icon-daping.png" style="width: 16px;height: 16px">&nbsp;&nbsp;大屏</a></dd>-->
  99 + <dd layadmin-event="toDZSWJScreen" style="text-align: left;"><a><img src="/src/style/img/icon-dianzishuiwuju.png" style="width: 16px;height: 16px">&nbsp;&nbsp;电子税务局大屏</a></dd>
  100 + <!--调整到首页旁边,此处去掉 joke 屏蔽 20211129-->
  101 +<!-- <dd layadmin-event="toYTHViewScreen" style="text-align: left;"><a><img src="/src/style/img/icon-yitihuadaping.png" style="width: 16px;height: 16px">&nbsp;&nbsp;一体化视图</a></dd>-->
  102 + <dd layadmin-event="toBiZhEalZhSYS" style="text-align: left;"><a><img src="/src/style/img/icon-YWJKD.png" style="width: 16px;height: 16px">&nbsp;&nbsp;业务健康度</a></dd>
  103 + <dd layadmin-event="toCMDB" style="text-align: left;"><a><img src="/src/style/img/icon-CMDB.png" style="width: 16px;height: 16px">&nbsp;&nbsp;CMDB</a></dd>
  104 + </dl>
  105 + </script>
  106 + </li>
  107 +<!-- xwx add 首页增加业务健康度入口 2021-10-25 end-->
  108 +<!-- <li class="layui-nav-item" lay-tips="一体化视图">-->
  109 +<!-- &lt;!&ndash; <a href="javascript:;" layadmin-event="toYTHViewScreen"><i class="layui-icon layui-icon-chart-screen"></i></a>&ndash;&gt;-->
  110 +<!-- <a href="javascript:;" layadmin-event="toYTHViewScreen" ><img src="/src/style/img/icon-yitihuadaping.png" style="width: 16px;height: 16px"></a>-->
  111 +<!-- </li>-->
  112 +<!-- <li class="layui-nav-item" lay-tips="大屏">-->
  113 +<!-- &lt;!&ndash; <a href="javascript:;" layadmin-event="toBigScreen"><i class="layui-icon layui-icon-chart-screen"></i></a>&ndash;&gt;-->
  114 +<!-- <a href="javascript:;" layadmin-event="toBigScreen" ><img src="/src/style/img/icon-daping.png" style="width: 16px;height: 16px"></a>-->
  115 +<!-- </li>-->
  116 +<!-- <li class="layui-nav-item" lay-tips="电子税务局">-->
  117 +<!-- &lt;!&ndash; <a href="javascript:;" layadmin-event="toBigScreen"><i class="layui-icon layui-icon-chart-screen"></i></a>&ndash;&gt;-->
  118 +<!-- <a href="javascript:;" layadmin-event="toDZSWJScreen" ><img src="/src/style/img/icon-dianzishuiwuju.png" style="width: 16px;height: 16px"></a>-->
  119 +<!-- </li>-->
  120 + <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-unselect>
  121 + <a href="javascript:;" layadmin-event="more"><i class="layui-icon layui-icon-more-vertical"></i></a>
  122 + </li>
  123 + <!-- <li class="layui-nav-item layui-hide-xs" lay-unselect>
  124 + <a href="javascript:;" layadmin-event="theme">
  125 + <i class="layui-icon layui-icon-theme"></i>
  126 + </a>
  127 + </li>-->
  128 + <li class="layui-nav-item layui-hide-xs" lay-unselect>
  129 + <a href="javascript:;" layadmin-event="fullscreen">
  130 + <i class="layui-icon layui-icon-screen-full"></i>
  131 + </a>
  132 + </li>
  133 + <!-- 报表通知统计 -->
  134 + <li class="layui-nav-item" lay-unselect>
  135 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-web/home/messageRemind">
  136 + <a href="javascript:;" class="notice_msg">
  137 + <i class="layui-icon layui-icon-notice"></i><span>{{d.map==null? 0 : d.map.totalCountByUser}}</span>
  138 + </a>
  139 + <dl class="layui-nav-child">
  140 + <dd><a href="javascript:;" lay-href="/alarm/activewarning">活动告警:{{d.map==null? 0 : d.map.totalCountByUser}}</a></dd>
  141 + <!-- <hr>-->
  142 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/monitor/flag=0">未处理报表:{{d.map==null? 0 : d.map.statusCountByUser}}</a></dd>-->
  143 + <!-- <hr>-->
  144 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/workview/read=0/type=1">工作汇报未读:{{d.map==null? 0 : d.map.notReadCountByUser}}</a></dd>-->
  145 + <!-- <hr>-->
  146 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/notice/t=day">今日通知:{{d.map==null? 0 : d.map.countByUserAndToday}}</a></dd>-->
  147 + </dl>
  148 + </script>
  149 + </li>
  150 +
  151 + <li class="layui-nav-item" lay-unselect>
  152 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken"
  153 + lay-done="layui.element.render('nav', 'layadmin-layout-right');">
  154 + <a href="javascript:;">
  155 + 欢迎&nbsp;&nbsp;<cite style="color: #1E9FFF" user-info>{{d.object.nickname}}</cite>
  156 + </a>
  157 + {{#
  158 + var roles = '';
  159 + layui.each(d.object.sysRoles, function(idx, role){
  160 + roles += role.code+",";
  161 + });
  162 + }}
  163 + <li><input type="hidden" id="user_roles" value="{{roles}}"></li>
  164 + <dl class="layui-nav-child">
  165 + <dd layadmin-event="updtpswd" style="text-align: center;"><a>修改密码</a></dd>
  166 + <dd user-info layadmin-event="changeInfo" style="text-align: center;"><a>修改信息</a></dd>
  167 + <dd layadmin-event="logout" style="text-align: center;"><a>退出</a></dd>
  168 + </dl>
  169 + </script>
  170 + </li>
  171 +
  172 + <!-- <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken"-->
  173 + <!-- lay-done="layui.element.render('nav', 'layadmin-text-name');">-->
  174 + <!-- <li class="layui-nav-item layui-hide-xs" lay-unselect lay-filter="layadmin-text-name">-->
  175 + <!-- <a href="javascript:;" style="text-align: center;" >欢迎&nbsp;&nbsp;<b id="user-name" lay-tips="点击退出" layadmin-event="logout" style="color: #3d9fe6">{{d.object.nickname }}</b></a>-->
  176 + <!-- </li>-->
  177 + <!-- </script>-->
  178 + </ul>
  179 + </div>
  180 +
  181 + <!-- 侧边菜单 -->
  182 + <!-- 先获取默认菜单拼接 d.str 返回数据格式 modeleid#path-->
  183 + <!-- 如果配置默认首页,则给默认首页,否则给工作台(moduleid为work,path为work/index)-->
  184 +
  185 + <div class="layui-side layui-side-menu">
  186 + <div class="layui-side-scroll">
  187 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/menus/current?type=1"
  188 + lay-done="layui.element.render('nav', 'layadmin-system-side-menu');" id="TPL_layout">
  189 +
  190 + {{#
  191 + var dataName = layui.setter.response.dataName;
  192 + var fisthref = "/index";
  193 + var defaultMenu = d.str;
  194 + var defaultModuleid = '';
  195 + var defaultPath = '';
  196 + if(defaultMenu && defaultMenu != ''){
  197 + defaultModuleid = d.str.split('#')[0];
  198 + defaultPath = d.str.split('#')[1];
  199 + fisthref = defaultPath;
  200 + }
  201 + }}
  202 +
  203 + <div class="layui-logo" lay-href="{{fisthref}}">
  204 + <span>{{ layui.setter.name || 'layuiAdmin' }}</span>
  205 + </div>
  206 +
  207 + <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu"
  208 + lay-filter="layadmin-system-side-menu">
  209 + {{#
  210 + var show = location.search.substr(1).split("&")[0].split("=")[1];
  211 + if(show == '1') window.history.pushState({} ,'' ,'#');
  212 + if(show != '0') location.hash = "/";
  213 +
  214 + var path = layui.router().path
  215 + ,pathURL = layui.admin.correctRouter(path.join('/'))
  216 + ,dataName = layui.setter.response.dataName;
  217 + var fistModuleid = '';
  218 + if(d && d[dataName].length>0){
  219 + fistModuleid = d[dataName][0].moduleid;
  220 + }
  221 +
  222 + layui.each(d[dataName], function(index, item){
  223 + var isselectd = '';
  224 + var isSelectedModuleid = '';
  225 + if(defaultModuleid != '' || item.moduleid != ''){
  226 + if(item.moduleid == defaultModuleid){
  227 + isselectd = "layui-this";
  228 + }else{
  229 + isselectd = "";
  230 + }
  231 + }else {
  232 + if(!defaultModuleid || defaultModuleid == ''){
  233 + if(index = 0){
  234 + isselectd = "layui-this";
  235 + }
  236 + }else{
  237 + isselectd = "";
  238 + }
  239 + }
  240 + var hasChildren = typeof item.subMenus === 'object' && item.subMenus && item.subMenus.length > 0
  241 + ,classSelected = function(){
  242 + var match = path[0] == item.moduleid || (index == 0 && !path[0]) || (item.path && pathURL ==
  243 + layui.admin.correctRouter(item.path)) || item.spread;
  244 + if(match){
  245 + return hasChildren ? 'layui-nav-itemed' : 'layui-nav-itemed';
  246 + }
  247 + return '';
  248 + }
  249 + ,url = (item.path && typeof item.path === 'string') ? item.path : item.moduleid;
  250 + var closeMenuEvent = '';
  251 + if(item.moduleid == 'biz' || item.moduleid == 'res'){ closeMenuEvent = 'closeMenu'}
  252 + }}
  253 +
  254 + <li data-name="{{ item.moduleid || '' }}" data-jump="{{ item.path || '' }}"
  255 + class="layui-nav-item {{ menuIsopen == 'true' ? 'layui-nav-itemed' : '' }} {{isselectd}}">
  256 +
  257 + {{# if(item.moduleid == 'cmdbsys' || item.moduleid == 'sxview' || item.moduleid == 'dpsys'){ }}
  258 + <a href="javascript:;" layadmin-event="{{item.moduleid}}" lay-tips="{{ item.name
  259 + }}" lay-direction="2">
  260 + <i class="layui-icon {{ item.css }}"></i>
  261 + <cite>{{ item.name }}</cite>
  262 + </a>
  263 + {{# } }}
  264 + {{# if(item.moduleid != 'cmdbsys' && item.moduleid != 'sxview' && item.moduleid != 'dpsys'){ }}
  265 + <a href="javascript:;" {{ hasChildren ? '' : 'lay-href="'+ url +'"' }} layadmin-event="{{closeMenuEvent}}" lay-tips="{{ item.name
  266 + }}" lay-direction="2">
  267 + <i class="layui-icon {{ item.css }}"></i>
  268 + <cite>{{ item.name }}</cite>
  269 + </a>
  270 +
  271 + {{# } }}
  272 +
  273 +
  274 + {{# if(hasChildren){ }}
  275 + <dl class="layui-nav-child">
  276 + {{# layui.each(item.subMenus, function(index2, item2){
  277 + if(item2.moduleid && item2.moduleid == defaultModuleid){
  278 + isselectd = "layui-this";
  279 + }else{
  280 + isselectd = "";
  281 + }
  282 + var hasChildren2 = typeof item2.subMenus == 'object' && item2.subMenus &&
  283 + item2.subMenus.length > 0
  284 + ,classSelected2 = function(){
  285 + var match = (path[0] == item.moduleid && path[1] == item2.moduleid) || (item2.path &&
  286 + pathURL == layui.admin.correctRouter(item2.path)) || item2.spread;
  287 + return '';
  288 + }
  289 + ,url2 = (item2.path && typeof item2.path === 'string')
  290 + ? item2.path
  291 + : [item.moduleid, item2.moduleid, ''].join('/');
  292 + }}
  293 + <dd data-name="{{ item2.moduleid || '' }}" data-jump="{{ item2.path || '' }}"
  294 + class="layui-nav-item {{ classSelected2() }} {{isselectd}}"
  295 + >
  296 + {{# if(item2.menuDesc.indexOf('第三方') == '-1') {}}
  297 + <a href="javascript:;" {{ hasChildren2 ? '' : 'lay-href="'+ url2 +'"' }}>{{ item2.name }}</a>
  298 + {{# }else{ }}
  299 + <a href="javascript:;" {{ hasChildren2 ? '' : 'data-url="'+ url2 +'" layadmin-event="IntegratedEntrance"' }} data-moduleid="{{item2.moduleid}}">{{ item2.name }}</a>
  300 + {{# } }}
  301 + {{# if(hasChildren2){ }}
  302 + <dl class="layui-nav-child {{}}">
  303 + {{# layui.each(item2.subMenus, function(index3, item3){
  304 + var match = (path[0] == item.moduleid && path[1] == item2.moduleid && path[2] ==
  305 + item3.moduleid)
  306 + || (item3.path && pathURL == layui.admin.correctRouter(item3.path))
  307 + ,url3 = (item3.path && typeof item3.path === 'string')
  308 + ? item3.path
  309 + : [item.moduleid, item2.moduleid, item3.moduleid].join('/')
  310 + }}
  311 + <dd data-name="{{ item3.moduleid || '' }}" data-jump="{{ item3.path || '' }}">
  312 + {{# if(item2.menuDesc.indexOf('第三方') == '-1') {}}
  313 + <a href="javascript:;" lay-href="{{ url3 }}" {{ item3.iframe ? 'lay-iframe="true"' : ''}}>{{ item3.name }}</a>
  314 + {{# }else{ }}
  315 + <a href="javascript:;" data-url="{{ url3 }}" layadmin-event="IntegratedEntrance" data-moduleid="{{item3.moduleid}}">{{ item3.name }}</a>
  316 + {{# } }}
  317 + </dd>
  318 + {{# }); }}
  319 + </dl>
  320 + {{# } }}
  321 + </dd>
  322 + {{# }); }}
  323 + </dl>
  324 + {{# } }}
  325 + </li>
  326 + {{# }); }}
  327 + </ul>
  328 + </script>
  329 + </div>
  330 + <div class="right-bottom-tips"></div>
  331 + </div>
  332 +
  333 + <!-- 页面标签 -->
  334 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/menus/findSettingDefaultMenus"
  335 + lay-done="layui.element.render('nav', 'layadmin-pagetabs-nav')">
  336 + <div class="layadmin-pagetabs" id="LAY_app_tabs">
  337 + <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
  338 + <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
  339 + <div class="layui-icon layadmin-tabs-control layui-icon-down">
  340 +
  341 + <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
  342 + <li class="layui-nav-item" lay-unselect>
  343 + <a href="javascript:;"></a>
  344 + <dl class="layui-nav-child layui-anim-fadein">
  345 + <dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
  346 + <dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
  347 + <dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
  348 + </dl>
  349 + </li>
  350 + </ul>
  351 + </div>
  352 +<!-- <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken">-->
  353 +
  354 +<!-- <div id="toYTHView_div" style="padding:0 10px;float: left;">-->
  355 +<!-- <dd layadmin-event="toYTHViewScreen" title="一体化控制台"><a><img src="/src/style/img/icon-yitihuadaping.png" style="width: 16px;height: 16px"></a></dd>-->
  356 +<!-- </div>-->
  357 +
  358 + <div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
  359 +
  360 + <ul class="layui-tab-title" id="LAY_app_tabsheader">
  361 +
  362 + {{# if(d.data.length >= 1 ){ }}
  363 + {{# if(d.data[0].moduleid == 'index'){ }}
  364 + <li lay-id="/"><i class="layui-icon layui-icon-home"></i></li>
  365 + {{# } }}
  366 + {{# if(d.data[0].moduleid != 'index'){ }}
  367 + <li lay-id="/{{d.data[0].moduleid}}/" lay-attr="/{{d.data[0].moduleid}}/"><i class="layui-icon layui-icon-home"></i></li>
  368 + {{# } }}
  369 + {{# } }}
  370 + {{# if(d.data.length == 0){ }}
  371 + <li lay-id="/"><i class="layui-icon layui-icon-home"></i></li>
  372 + {{# } }}
  373 + </ul>
  374 +
  375 +
  376 + </div>
  377 + </div>
  378 + </script>
  379 +
  380 +
  381 + <!-- 主体内容 -->
  382 + <div class="layui-body" id="LAY_app_body">
  383 + <!-- 单页模式接入-->
  384 + <div class="layadmin-tabsbody-item layui-show"></div>
  385 + </div>
  386 +
  387 + <!-- 辅助元素,一般用于移动设备下遮罩 -->
  388 + <div class="layadmin-body-shade" layadmin-event="shade"></div>
  389 +</div>
  390 +
  391 +<!--告警操作记录-->
  392 +<script type="text/html" id="warnViewWinTpl">
  393 + <div class="warn-win">
  394 + <div class="warn-win-item">
  395 + <h5>告警确认【{{d.confirm.length}}</h5>
  396 + {{# layui.each(d.confirm, function(index, item){ }}
  397 + <div class="warn-win-item-con">
  398 + <span>{{layui.util.toDateString(item.confirmTime)}}</span>
  399 + <ul>
  400 + <li>备注:{{item.remark}}</li>
  401 + <li>告警确认人:{{item.confirmUserId}}</li>
  402 + <li>紧急程度:{{item.levelName}}</li>
  403 + </ul>
  404 + </div>
  405 + {{# }); }}
  406 + </div>
  407 + <div class="warn-win-item">
  408 + <h5>告警关闭【{{d.close.length}}</h5>
  409 + {{# layui.each(d.close, function(index, item){ }}
  410 + {{# var closeTypeStr = '告警'}}
  411 + {{# if(item.closeType == 1){ closeTypeStr = '通知' } }}
  412 + <div class="warn-win-item-con">
  413 + <span>备注:{{item.remark}}</span>
  414 + <ul>
  415 + <li>告警关闭时间:{{layui.util.toDateString(item.closeTime)}}</li>
  416 + <li>告警关闭人:{{item.closeUserId}}</li>
  417 + <li>关闭范围:{{closeTypeStr}}</li>
  418 + <li>关闭时长:{{item.closeDuration}}小时</li>
  419 + </ul>
  420 + </div>
  421 + {{# }); }}
  422 + </div>
  423 + <div class="warn-win-item">
  424 + <h5>告警恢复【{{d.resume.length}}</h5>
  425 + {{# layui.each(d.resume, function(index, item){ }}
  426 + {{# var resumeTypeStr = '恢复关闭的活动告警'}}
  427 + {{# if(item.resumeType == 1){resumeTypeStr = '恢复历史告警' } }}
  428 + <div class="warn-win-item-con">
  429 + <span>备注:{{item.remark}}</span>
  430 + <ul>
  431 + <li>告警恢复时间:{{layui.util.toDateString(item.resumeTime)}}</li>
  432 + <li>告警恢复人:{{item.resumeUserId}}</li>
  433 + <li>恢复类型:{{resumeTypeStr}}</li>
  434 + </ul>
  435 + </div>
  436 + {{# }); }}
  437 + </div>
  438 + </div>
  439 +</script>
  440 +
  441 +<!--详细页左侧面板-->
  442 +<script type="text/html" id="detailPageLeftPanel">
  443 + <div class="detail-left-panel">
  444 + <a class="detail-left-panel-btn" href="javascript:void(0)"><i class="layui-icon layui-icon-next"></i></a>
  445 + <div class="detail-left-panel-node" style="display: none">
  446 + {{# layui.each(d.map, function(k, v){ }}
  447 + <div class="left-panel-restype">
  448 + <div class="layui-title">{{v[0].reTypeName}}</div>
  449 + <div class="">
  450 + {{# layui.each(v, function(i, e){ }}
  451 + <div class="info-box link"
  452 + data-resid="{{e.targetId}}"
  453 + data-restype="{{e.resType}}"
  454 + data-restypename="{{e.resTypeName}}"
  455 + data-ip="{{e.ip}}"
  456 + data-admin="{{e.admin}}"
  457 + >
  458 + {{e.targetName}}
  459 + </div>
  460 + {{# }); }}
  461 + </div>
  462 + </div>
  463 + {{# }); }}
  464 + {{# if(!Object.keys(d.map).length) { }}
  465 + <div class="left-panel-restype">
  466 + <div class="desc-box">
  467 + 暂无关联关系
  468 + </div>
  469 + </div>
  470 + {{# } }}
  471 + </div>
  472 + </div>
  473 +</script>
  474 +
  475 +<!--下探top30表格展示内容-->
  476 +<script type="text/html" id="detailKpiTableTpl">
  477 + <table class="layui-table" lay-even="" lay-skin="row">
  478 + <colgroup>
  479 + <col width="100">
  480 + <col width="150">
  481 + <col width="180">
  482 + <col width="180">
  483 + </colgroup>
  484 + <thead>
  485 + <tr>
  486 + <th>序号</th>
  487 + <th>进程号</th>
  488 + <th>所属用户</th>
  489 + {{# if(d.kpi == 'KPI7054BC34'){ }}
  490 + <th>使用率</th>
  491 + {{# } }}
  492 + {{# if(d.kpi != 'KPI7054BC34'){ }}
  493 + <th>使用量</th>
  494 + {{# } }}
  495 + </tr>
  496 + </thead>
  497 + <tbody>
  498 + {{# layui.each(d.data, function(index, item){ }}
  499 + <tr>
  500 + <td>{{index + 1}}</td>
  501 + <td>{{item.pid}}</td>
  502 + <td>{{item.username}}</td>
  503 + <td>{{item.usedPercent}}</td>
  504 + <!--<td>{{item.info}}</td>-->
  505 + </tr>
  506 + {{# }); }}
  507 + </tbody>
  508 + </table>
  509 +</script>
  510 +
  511 +<!--corn表达式-->
  512 +<script type="text/html" id="cronHtml" >
  513 + <div id="cronContent" style="color:#000000">
  514 + <p style="margin: 10px auto; padding: 0px;">
  515 +   <strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);">常用表达式例子</span></strong>
  516 + </p>
  517 + <p style="margin: 10px auto; padding: 0px;">
  518 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0/2 * * * * ?</span></strong>&nbsp;&nbsp;</span>&nbsp;表示每2秒 执行任
  519 + </p>
  520 + <p style="margin: 10px auto; padding: 0px;">
  521 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/2 * * * ? </span></strong>&nbsp;&nbsp;</span>&nbsp;表示每2分钟 执行任
  522 + </p>
  523 +
  524 + <p style="margin: 10px auto; padding: 0px;">
  525 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 2 1 * ?</span></strong>&nbsp;&nbsp;</span>&nbsp;表示在每月的1日的凌晨2点调整任
  526 + </p>
  527 + <p style="margin: 10px auto; padding: 0px;">
  528 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">2</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * MON-FRI</span>&nbsp;</strong>&nbsp; 表示周一到周五每天上午10:15执行作业
  529 + </p>
  530 + <p style="margin: 10px auto; padding: 0px;">
  531 +   (3<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? 6L 2002-2006</span></strong>&nbsp;&nbsp; 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
  532 + </p>
  533 + <p style="margin: 10px auto; padding: 0px;">
  534 +   (4<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 10,14,16 * * ?</span></strong>&nbsp;&nbsp;&nbsp;每天上午10点,下午2点,4&nbsp;
  535 + </p>
  536 + <p style="margin: 10px auto; padding: 0px;">
  537 +   (5<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/30 9-17 * * ?</span></strong>&nbsp;&nbsp; 朝九晚五工作时间内每半小时&nbsp;
  538 + </p>
  539 + <p style="margin: 10px auto; padding: 0px;">
  540 +   (6<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 12 ? * WED</span></strong>&nbsp;&nbsp; &nbsp;表示每个星期三中午12&nbsp;
  541 + </p>
  542 + <p style="margin: 10px auto; padding: 0px;">
  543 +   (7<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 12 * * ?</span></strong>&nbsp;&nbsp;&nbsp;每天中午12点触发&nbsp;
  544 + </p>
  545 + <p style="margin: 10px auto; padding: 0px;">
  546 +   (8<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * * &nbsp;</span></strong>&nbsp;&nbsp;每天上午10:15触发&nbsp;
  547 + </p>
  548 + <p style="margin: 10px auto; padding: 0px;">
  549 +   (9<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 每天上午10:15触发&nbsp;
  550 + </p>
  551 + <p style="margin: 10px auto; padding: 0px;">
  552 +   (10<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ?</span>&nbsp;</strong>&nbsp; &nbsp;每天上午10:15触发&nbsp;
  553 + </p>
  554 + <p style="margin: 10px auto; padding: 0px;">
  555 +   (11<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ? 2005</span></strong>&nbsp;&nbsp; &nbsp;2005年的每天上午10:15触发&nbsp;
  556 + </p>
  557 + <p style="margin: 10px auto; padding: 0px;">
  558 +   (12<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 * 14 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 在每天下午2点到下午2:59期间的每1分钟触发&nbsp;
  559 + </p>
  560 + <p style="margin: 10px auto; padding: 0px;">
  561 +   (13<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/5 14 * * ?</span></strong>&nbsp;&nbsp; &nbsp;在每天下午2点到下午2:55期间的每5分钟触发&nbsp;
  562 + </p>
  563 + <p style="margin: 10px auto; padding: 0px;">
  564 +   (14<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/5 14,18 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发&nbsp;
  565 + </p>
  566 + <p style="margin: 10px auto; padding: 0px;">
  567 +   (15<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0-5 14 * * ?</span>&nbsp;</strong>&nbsp; &nbsp;在每天下午2点到下午2:05期间的每1分钟触发&nbsp;
  568 + </p>
  569 + <p style="margin: 10px auto; padding: 0px;">
  570 +   (16<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 10,44 14 ? 3 WED</span></strong>&nbsp;&nbsp; &nbsp;每年三月的星期三的下午2:102:44触发&nbsp;
  571 + </p>
  572 + <p style="margin: 10px auto; padding: 0px;">
  573 +   (17<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * MON-FRI</span>&nbsp;</strong>&nbsp; &nbsp;周一至周五的上午10:15触发&nbsp;
  574 + </p>
  575 + <p style="margin: 10px auto; padding: 0px;">
  576 +   (18<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 15 * ?</span>&nbsp;</strong>&nbsp; &nbsp;每月15日上午10:15触发&nbsp;
  577 + </p>
  578 + <p style="margin: 10px auto; padding: 0px;">
  579 +   (19<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 L * ?</span>&nbsp;</strong>&nbsp; &nbsp;每月最后一日的上午10:15触发&nbsp;
  580 + </p>
  581 + <p style="margin: 10px auto; padding: 0px;">
  582 +   (20<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6L</span>&nbsp;</strong>&nbsp; &nbsp;每月的最后一个星期五上午10:15触发&nbsp;
  583 + </p>
  584 + <p style="margin: 10px auto; padding: 0px;">
  585 +   (21<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6L 2002-2005</span></strong>&nbsp;&nbsp; 2002年至2005年的每月的最后一个星期五上午10:15触发&nbsp;
  586 + </p>
  587 + <p style="margin: 10px auto; padding: 0px;">
  588 +   (22<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6#3</span></strong>&nbsp;&nbsp; 每月的第三个星期五上午10:15触发
  589 + </p>
  590 + <p style="margin: 10px auto; padding: 0px;">
  591 + &nbsp;
  592 + </p>
  593 + </div>
  594 +</script>
  595 +
  596 +<!--资源名称-->
  597 +<script type="text/html" id="resindex_resName">
  598 + <!-- 更改单元格溢出时的tip跑到左上角 LSQ 2022/1/6-->
  599 + <div id="res-div">
  600 + {{# var urlLast=window.location.hash;
  601 + var w=$(".layui-table thead th[data-field='resName']").data('minwidth');
  602 + if(urlLast=="#/res/index"){
  603 + w=$("[lay-id='resListTable'] table thead th[data-field='resName'").data('minwidth');
  604 +
  605 + }else if(urlLast=="#/biz/index"){
  606 + w=$("[lay-id='bizListTable'] table thead th[data-field='resName'").data('minwidth');
  607 + }
  608 + var maxW=(w-45)+'px';
  609 + var styleW="float: left;max-width: "+maxW+";overflow: hidden; text-overflow: ellipsis; white-space: nowrap;display: inline-block;";
  610 + }}
  611 + <span lay-tips="{{ d.resName }}" style="{{styleW}}" data-zymc="{{ d.resId }}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-childrennum="{{d.childrenNum}}" data-ip="{{ d.ip }}" data-resTypeName="{{ d.resTypeName }}" data-admin="{{ d.admin }}" data-adminname="{{ d.adminName }}" data-pingenable="{{d.pingEnable}}" data-manageIp="{{d.manageIp}}" data-collProtocol="{{d.collProtocol}}" data-provider="{{d.provider}}" data-state="{{d.state}}" class="layui-table-link">{{ d.resName }}</span>
  612 + {{# if (d.favId == null) { }}
  613 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  614 + {{# } else { }}
  615 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 1px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  616 + {{# } }}
  617 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 1px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  618 + <!--{{# if (d.resCategory == 'share' && d.hardwareFlag && d.hardwareFlag.endsWith("Y")) { }}
  619 + <a class="layui-icon reslist-assets-details hide" data-resid="{{d.resId}}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-ip="{{ d.ip }}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>
  620 + {{# } }}-->
  621 + </div>
  622 +</script>
  623 +
  624 +<!--最大文件系统使用率-->
  625 +<script type="text/html" id="fileUseRateTpl">
  626 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI449F5365" data-flag="fs" data-name="{{d.os=='windows'?'磁盘使用情况':'文件系统使用情况'}}" data-showtype="bar" data-barkpiid="{{d.os=='windows'?'KPI29D42042,KPI1988842F':'KPIA91F44E7,KPI98306224'}}" data-barxaxis="{{d.os=='windows'?'KPI9D22EAB6':'KPI7AC1664E'}}"
  627 + data-warning="0" data-ident="1" data-trend="0">
  628 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  629 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_bizfileName" lay-tips="{{d.fileSysUseName}}"
  630 + data-id="{{d.resId}}_bizfileName" data-message="{{d.fileSysUseName}}"><span style="color: #000000;">{{d.fileSysUseName}}</span>
  631 + </div>
  632 + <div class="layui-progress-bar layui-bg-green {{ d.fileSysUseRate >= 98 ? 'layui-bg-red' : (d.fileSysUseRate >= 95 ? 'layui-bg-orange' : (d.fileSysUseRate >= 90 ? 'layui-bg-blue':'')) }}"
  633 + lay-percent="{{ d.fileSysUseRate }}%"
  634 + style="width: {{ d.fileSysUseRate }}%;">
  635 + </div>
  636 + </div>
  637 + <span class="layui-progress-text">{{ (d.fileSysUseRate == null || d.fileSysUseRate == '' || d.fileSysUseRate === '未知' || d.fileSysUseRate === '无' )? '0%' : d.fileSysUseRate +'%' }}</span>
  638 + </div>
  639 +</script>
  640 +<!--CPU使用率-->
  641 +<script type="text/html" id="cpuRateTpl">
  642 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI7054BC34" data-flag="cpu" data-name="CPU使用率"
  643 + data-warning="0" data-ident="1" data-trend="1">
  644 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  645 + <div class="layui-progress-bar layui-bg-green {{ d.cpuRate >= 95 ? 'layui-bg-red' : (d.cpuRate >= 90 ? 'layui-bg-orange' : (d.cpuRate >= 80 ? 'layui-bg-blue':''))}}"
  646 + lay-percent="{{ d.cpuRate }}%"
  647 + style="width: {{ d.cpuRate }}%;">
  648 + </div>
  649 + </div>
  650 + <span class="layui-progress-text">{{ (d.cpuRate == null || d.cpuRate == '' || d.cpuRate === '未知' || d.cpuRate === '无' )? '0%' : d.cpuRate +'%' }}</span>
  651 + </div>
  652 +</script>
  653 +<!--内存使用率-->
  654 +<script type="text/html" id="memoryRateTpl">
  655 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI31CB8D97" data-flag="mem" data-name="内存使用率"
  656 + data-warning="1" data-ident="1" data-trend="1">
  657 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  658 + <div class="layui-progress-bar layui-bg-green {{ d.memoryRate >= 95 ? 'layui-bg-red' : (d.memoryRate >= 90 ? 'layui-bg-orange' : (d.memoryRate >= 80 ? 'layui-bg-blue':''))}}"
  659 + lay-percent="{{ d.memoryRate }}%"
  660 + style="width: {{ d.memoryRate }}%;">
  661 + </div>
  662 + </div>
  663 + <span class="layui-progress-text">{{ (d.memoryRate == null || d.memoryRate == '' || d.memoryRate === '未知' || d.memoryRate === '无' )? '0%' : d.memoryRate +'%' }}</span>
  664 + </div>
  665 +</script>
  666 +<!--虚拟内存使用率-->
  667 +<script type="text/html" id="vmmemoryRateTpl">
  668 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI20352505" data-flag="vmem" data-name="虚拟内存使用率"
  669 + data-warning="1" data-ident="1" data-trend="1">
  670 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  671 + <div class="layui-progress-bar layui-bg-green {{ d.vmmemoryUseRate >= 95 ? 'layui-bg-red' : (d.vmmemoryUseRate >= 90 ? 'layui-bg-orange' : (d.vmmemoryUseRate >= 80 ? 'layui-bg-blue':''))}}"
  672 + lay-percent="{{ d.vmmemoryUseRate }}%"
  673 + style="width: {{ d.vmmemoryUseRate }}%;">
  674 + </div>
  675 + </div>
  676 + <span class="layui-progress-text">{{ (d.vmmemoryUseRate == null || d.vmmemoryUseRate == '' || d.vmmemoryUseRate === '未知' || d.vmmemoryUseRate === '无' )? '0%' : d.vmmemoryUseRate +'%' }}</span>
  677 + </div>
  678 +</script>
  679 +<!--会话百分比-->
  680 +<script type="text/html" id="sessionRateTpl">
  681 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI18F18278" data-name="活动会话百分比" data-flag="session"
  682 + data-warning="0" data-ident="1" data-trend="0">
  683 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  684 + <div class="layui-progress-bar layui-bg-green {{ d.sessionRate >= 80 ? 'layui-bg-red' : (d.sessionRate <= 50 ? '' : 'layui-bg-orange') }}"
  685 + lay-percent="{{ d.sessionRate }}%"
  686 + style="width: {{ d.sessionRate }}%;">
  687 + </div>
  688 + </div>
  689 + <span class="layui-progress-text">{{ (d.sessionRate == null || d.sessionRate == '' || d.sessionRate === '未知' || d.sessionRate === '无' )? '0%' : d.sessionRate +'%' }}</span>
  690 + </div>
  691 +</script>
  692 +<!--CPU分配率-->
  693 +<script type="text/html" id="cpuSetRateTpl">
  694 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPIBFA3F5CD" data-name="CPU分配率" data-flag="cpu"
  695 + data-warning="0" data-ident="1" data-trend="0">
  696 + {{#
  697 + d.cpuSetRate = parseFloat(d.cpuSetRate).toFixed(2);
  698 + }}
  699 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  700 + <div class="layui-progress-bar layui-bg-green {{ d.cpuSetRate >= 80 ? 'layui-bg-red' : (d.cpuSetRate <= 50 ? '' : 'layui-bg-orange') }}"
  701 + lay-percent="{{ d.cpuSetRate }}%"
  702 + style="width: {{ d.cpuSetRate }}%;">
  703 + </div>
  704 + </div>
  705 + <span class="layui-progress-text">{{ (d.cpuSetRate == null || d.cpuSetRate == '' || d.cpuSetRate === '未知' || d.cpuSetRate === '无' )? '0%' : d.cpuSetRate +'%' }}</span>
  706 + </div>
  707 +</script>
  708 +<!--内存分配率-->
  709 +<script type="text/html" id="memorySetRateTpl">
  710 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPIC40A80AC" data-name="内存分配率" data-flag="mem"
  711 + data-warning="0" data-ident="1" data-trend="0">
  712 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  713 + <div class="layui-progress-bar layui-bg-green {{ d.memorySetRate >= 80 ? 'layui-bg-red' : (d.memorySetRate <= 50 ? '' : 'layui-bg-orange') }}"
  714 + lay-percent="{{ d.memorySetRate }}%"
  715 + style="width: {{ d.memorySetRate }}%;">
  716 + </div>
  717 + </div>
  718 + <span class="layui-progress-text">{{ (d.memorySetRate == null || d.memorySetRate == '' || d.memorySetRate === '未知' || d.memorySetRate === '无' )? '0%' : d.memorySetRate +'%' }}</span>
  719 + </div>
  720 +</script>
  721 +<!--存储分配率-->
  722 +<script type="text/html" id="storageSetRateTpl">
  723 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI46BAA9BE" data-name="存储分配率" data-flag="storage"
  724 + data-warning="0" data-ident="1" data-trend="0">
  725 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  726 + <div class="layui-progress-bar layui-bg-green {{ d.storageSetRate >= 80 ? 'layui-bg-red' : (d.storageSetRate <= 50 ? '' : 'layui-bg-orange') }}"
  727 + lay-percent="{{ d.storageSetRate }}%"
  728 + style="width: {{ d.storageSetRate }}%;">
  729 + </div>
  730 + </div>
  731 + <span class="layui-progress-text">{{ (d.storageSetRate == null || d.storageSetRate == '' || d.storageSetRate === '未知' || d.storageSetRate === '无' )? '0%' : d.storageSetRate +'%' }}</span>
  732 + </div>
  733 +</script>
  734 +<!--连接状态-->
  735 +<script type="text/html" id="linkStateTpl">
  736 +{{#
  737 + var linkStateHtml = '';
  738 + var linkStateTips = '无连接信息';
  739 + if(d.linkStateList && d.linkStateList.length >=0 ) {
  740 + linkStateTips = '';
  741 + if(d.linkStateList.length == 1) {
  742 + var linkState = d.linkStateList[0];
  743 + linkStateTips = `${linkState.protocol}: ${linkState.state}`;
  744 + if(linkState.state.indexOf('成功') !== -1) {
  745 + linkStateHtml = '<button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">成功</button>';
  746 + } else {
  747 + linkStateHtml = `<button type="button"
  748 + id="${d.resId}_bizdanger"
  749 + data-message="${d.message}"
  750 + data-state="${d.state}"
  751 + data-id="${d.resId}_bizdanger"
  752 + class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  753 + 失败
  754 + </button>`;
  755 + }
  756 + } else {
  757 + if(d.linkStateList.length == 0){
  758 + if(d.hostState == 'active' || d.hostState == 'connected' || d.hostState == '正常' ){
  759 + linkStateHtml = '<button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">成功</button>';
  760 + linkStateTips += `<li class='li-link-state-tips-red'>自动发现: 连接成功</li>`;
  761 + }else{
  762 + linkStateHtml = `<button type="button"
  763 + id="${d.resId}_bizdanger"
  764 + data-message="${d.message}"
  765 + data-state="${d.state}"
  766 + data-id="${d.resId}_bizdanger"
  767 + class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  768 + 失败
  769 + </button>`;
  770 + if(d.hostState!=''){
  771 + linkStateTips += `<li class='li-link-state-tips-red'>自动发现: 连接失败</li>`;
  772 + }else{
  773 + linkStateTips += `<li class='li-link-state-tips-red'>ssh: 连接失败</li>`;
  774 + }
  775 + }
  776 + }else{
  777 + linkStateTips += `<ul class='ul-link-state-tips'>`;
  778 + layui.each(d.linkStateList, function(index, value) {
  779 + if(value.state.indexOf('成功') !== -1) {
  780 + linkStateTips += `<li class='li-link-state-tips-green'>${value.protocol}: ${value.state}</li>`;
  781 + linkStateHtml += '<span class="layui-badge-dot layui-bg-green"></span>';
  782 + } else {
  783 + linkStateTips += `<li class='li-link-state-tips-red'>${value.protocol}: ${value.state}</li>`;
  784 + linkStateHtml += '<span class="layui-badge-dot layui-bg-red"></span>';
  785 + }
  786 + });
  787 + linkStateTips += '</ul>';
  788 + }
  789 + }
  790 + }
  791 +}}
  792 + <div class="div-link-state-list" lay-tips="{{linkStateTips}}">
  793 + {{linkStateHtml}}
  794 + </div>
  795 +</script>
  796 +<!--详情页面连接状态-->
  797 +<script type="text/html" id="linkStateDetailTpl">
  798 +{{#
  799 + var linkStateHtml = '';
  800 + var linkStateTips = '无连接信息';
  801 + if(d.linkStateList && d.linkStateList.length) {
  802 + linkStateTips = '';
  803 + if(d.linkStateList.length == 1) {
  804 + var linkState = d.linkStateList[0];
  805 + linkStateTips = `${linkState.protocol}: ${linkState.state}`;
  806 + if(linkState.state.indexOf('成功') !== -1) {
  807 + linkStateHtml = `<span class="span-green">${linkState.state}</span>`;
  808 + } else {
  809 + linkStateHtml = `<span class="span-red">${linkState.state}</span>`;
  810 + }
  811 + } else {
  812 + linkStateTips += `<ul class='ul-link-state-tips'>`;
  813 + layui.each(d.linkStateList, function(index, value) {
  814 + if(value.state.indexOf('成功') !== -1) {
  815 + linkStateTips += `<li class='li-link-state-tips-green'>${value.protocol}: ${value.state}</li>`;
  816 + linkStateHtml += '<div class="layui-badge-dot layui-bg-green"></div>';
  817 + } else {
  818 + linkStateTips += `<li class='li-link-state-tips-red'>${value.protocol}: ${value.state}</li>`;
  819 + linkStateHtml += '<div class="layui-badge-dot layui-bg-red"></div>';
  820 + }
  821 + });
  822 + linkStateTips += '</ul>';
  823 + }
  824 + }
  825 +}}
  826 + <div class="div-link-state-list" lay-tips="{{linkStateTips}}">
  827 + {{linkStateHtml}}
  828 + </div>
  829 +</script>
  830 +<!--电源状态-->
  831 +<script type="text/html" id="powerStateTpl">
  832 + {{# if(d.powerState != null && d.powerState == 'poweredOn'){ }}
  833 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">
  834 + 开机
  835 + </button>
  836 + {{# }else if(d.powerState != null && d.powerState == 'poweredOff'){ }}
  837 + <button type="button" class="layui-btn layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  838 + 关机
  839 + </button>
  840 + {{# }else if(d.powerState != null && d.powerState == 'standBy'){ }}
  841 + <button type="button" class="layui-btn layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  842 + 待机
  843 + </button>
  844 + {{# }else if(d.powerState != null && d.powerState == 'unknown'){ }}
  845 + <button type="button" class="layui-btn layui-bg-gray layui-btn-radius layui-btn-xs p-0-15 cant-click">
  846 + 未知
  847 + </button>
  848 + {{# }else{ }}
  849 + <button type="button"
  850 + class="layui-btn layui-btn-radius layui-bg-gray layui-btn-xs p-0-15 cant-click">{{
  851 + '未监控'}}
  852 + </button>
  853 + {{# }}}
  854 +</script>
  855 +<!--健康状态-->
  856 +<script type="text/html" id="healthTpl">
  857 + {{# if(d.state != 'new'){ }}
  858 + {{# if(d.health === '1'){ }}
  859 + <button type="button" class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  860 + </button>
  861 + {{# } }}
  862 + {{# if(d.health === '2'){ }}
  863 + <button type="button" class="layui-btn layui-btn-warm layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  864 + </button>
  865 + {{# } }}
  866 + {{# if(d.health === '3'){ }}
  867 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click"></button>
  868 + {{# } }}
  869 + {{# } }}
  870 +</script>
  871 +<!--主机状态-->
  872 +<script type="text/html" id="hostStateTpl">
  873 + {{# if(d.hostState != null && d.hostState == 'connected'){ }}
  874 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">
  875 + 已连接
  876 + </button>
  877 + {{# }else if(d.hostState != null && d.hostState == 'notResponding'){ }}
  878 + <button type="button" class="layui-btn layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  879 + 未响应
  880 + </button>
  881 + {{# }else if(d.hostState != null && d.hostState == 'disconnected'){ }}
  882 + <button type="button" class="layui-btn layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  883 + 断开连接
  884 + </button>
  885 + {{# }else if(d.hostState != null && d.hostState == '正常'){ }}
  886 + <button type="button" class="layui-btn layui-bg-green layui-btn-radius layui-btn-xs p-0-15 cant-click">
  887 + 正常
  888 + </button>
  889 + {{# }else{ }}
  890 + <button type="button"
  891 + class="layui-btn layui-btn-radius layui-bg-gray layui-btn-xs p-0-15 cant-click">{{
  892 + '未监控'}}
  893 + </button>
  894 + {{# }}}
  895 +</script>
  896 +<!--ping状态-->
  897 +<script type="text/html" id="pingStatusTpl">
  898 + {{# if(d.pingStatus === '正常'){ }}
  899 + <button type="button" class="layui-btn layui-btn-danger layui-bg-green layui-btn-radius layui-btn-xs p-0-15">正常
  900 + </button>
  901 + {{# }else{ }}
  902 + <button type="button" class="layui-btn layui-btn-radius layui-bg-red layui-btn-xs p-0-15">异常</button>
  903 + {{# } }}
  904 +</script>
  905 +<!--资源状态-->
  906 +<script type="text/html" id="resStateTpl">
  907 + {{#
  908 + switch (d.state) {
  909 + case "new" :
  910 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-blue layui-btn-radius layui-btn-xs p-0-15 cant-click">未监控</button> {{#
  911 + break;
  912 + case "monitor" :
  913 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-green layui-btn-radius layui-btn-xs p-0-15 cant-click">监控中</button> {{#
  914 + break;
  915 + case "stop" :
  916 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">暂停监控</button> {{#
  917 + break;
  918 + case "alarmIgnore" :
  919 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">告警压制中</button> {{#
  920 + break;
  921 + }
  922 + }}
  923 +</script>
  924 +<!--判断树结构有无子节点-->
  925 +<script type="text/html" id="bizResNameTpl">
  926 + <div>
  927 + {{# if(d.resType == 'MIDDLEWARE_WEBLOGIC' && (d.parentId == null || d.parentId == '') ){ }}
  928 + <span data-childrennum="{{d.childrenNum}}">{{d.resName}}</span>
  929 + {{# }else{ }}
  930 + <span data-zymc="{{d.resId}}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-ip="{{d.ip}}" data-childrennum="{{d.childrenNum}}" data-resTypeName="{{d.resTypeName}}" data-admin="{{d.admin}}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{d.resName}}</span>
  931 + {{# } }}
  932 + {{# if (d.favId == null) { }}
  933 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  934 + {{# } else { }}
  935 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  936 + {{# } }}
  937 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  938 + </div>
  939 +</script>
  940 +<!--表空间使用率(最大)-->
  941 +<script type="text/html" id="tableSpaceUseRateTpl">
  942 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI64B1610A" data-name="表空间使用率" data-showtype="bar" data-barkpiid="KPI2EC3F15A,KPI6AD9EBD6" data-barxaxis="KPI4332BAC8"
  943 + data-warning="0" data-ident="1" data-trend="0" data-flag="tps" >
  944 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  945 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_bizTableSpaceUseRate" class="showTipsName" data-id="{{d.resId}}_bizTableSpaceUseRate" data-message="{{d.tableSpaceUseName}}"><span style="color: #000000;" >{{d.tableSpaceUseName}}</span></div>
  946 + <div class="layui-progress-bar layui-bg-green {{ d.tableSpaceUseRate >= 80 ? 'layui-bg-red' : (d.tableSpaceUseRate <= 50 ? '' : 'layui-bg-orange') }}"
  947 + lay-percent="{{ d.tableSpaceUseRate }}%"
  948 + style="width: {{ d.tableSpaceUseRate }}%;">
  949 + </div>
  950 + </div>
  951 + <span class="layui-progress-text">{{ (d.tableSpaceUseRate == null || d.tableSpaceUseRate == '' || d.tableSpaceUseRate === '未知' || d.tableSpaceUseRate === '无' )? '0%' : d.tableSpaceUseRate +'%' }}</span>
  952 + </div>
  953 +</script>
  954 +<!--ASM磁盘空间使用率-->
  955 +<script type="text/html" id="asmDiskUsedRateTpl">
  956 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI922F8FF7" data-name="ASM磁盘空间使用率" data-showtype="bar" data-barkpiid="KPI4D710FDA,KPI811E751E" data-barxaxis="KPI50267025"
  957 + data-warning="0" data-ident="1" data-trend="0" data-flag="asm" >
  958 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  959 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_asmDiskUsedRate" class="showTipsName" data-id="{{d.resId}}_asmDiskUsedRate" data-message="{{d.asmDiskUsedRate}}"><span style="color: #000000;" >{{d.asmDiskUsedRateName}}</span></div>
  960 + <div class="layui-progress-bar layui-bg-green {{ d.asmDiskUsedRate >= 80 ? 'layui-bg-red' : (d.asmDiskUsedRate <= 50 ? '' : 'layui-bg-orange') }}"
  961 + lay-percent="{{ d.asmDiskUsedRate }}%"
  962 + style="width: {{ d.asmDiskUsedRate }}%;">
  963 + </div>
  964 + </div>
  965 + <span class="layui-progress-text">{{ (d.asmDiskUsedRate == null || d.asmDiskUsedRate == '' || d.asmDiskUsedRate === '未知' || d.asmDiskUsedRate === '无' )? '0%' : d.asmDiskUsedRate +'%' }}</span>
  966 + </div>
  967 +</script>
  968 +<!--weblogic定制表头-->
  969 +<script type="text/html" id="webLogicResNameTpl">
  970 + <div>
  971 + {{# if(d.resType == 'MIDDLEWARE_WEBLOGIC' && (d.parentId == null || d.parentId == '') ){ }}
  972 + <span data-childrennum="{{d.childrenNum}}">{{d.resName}}</span>
  973 + {{# }else{ }}
  974 + <span data-zymc="{{ d.resId }}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-childrennum="{{d.childrenNum}}" data-ip="{{ d.ip }}" data-resTypeName="{{ d.resTypeName }}" data-admin="{{ d.admin }}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{ d.resName }}</span>
  975 + {{# } }}
  976 + {{# if (d.favId == null) { }}
  977 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  978 + {{# } else { }}
  979 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  980 + {{# } }}
  981 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  982 + </div>
  983 +</script>
  984 +<!--资源池状态-->
  985 +<script type="text/html" id="clusterStateTpl">
  986 + {{# if(d.clusterState === '正常'){ }}
  987 + <button type="button" class="layui-btn layui-btn-danger layui-bg-green layui-btn-radius layui-btn-xs p-0-15">正常
  988 + </button>
  989 + {{# }else{ }}
  990 + <button type="button" class="layui-btn layui-btn-radius layui-bg-red layui-btn-xs p-0-15">异常</button>
  991 + {{# } }}
  992 +</script>
  993 +<!--运行状态-->
  994 +<script type="text/html" id="runStateTpl">
  995 + {{# if(d.runState === '正常'){ }}
  996 + <button type="button" class="layui-btn layui-btn-danger layui-bg-green layui-btn-radius layui-btn-xs p-0-15">正常
  997 + </button>
  998 + {{# }else{ if(d.runState === '运行中'){ }}
  999 + <button type="button" class="layui-btn layui-btn-danger layui-bg-green layui-btn-radius layui-btn-xs p-0-15">运行中</button>
  1000 + {{# }else{ }}
  1001 + <button type="button" class="layui-btn layui-btn-radius layui-bg-red layui-btn-xs p-0-15">异常</button>
  1002 + {{# } }}
  1003 + {{# } }}
  1004 +</script>
  1005 +<script type="text/html" id="weblogicIpTpl">
  1006 + <div>{{d.ip?d.ip:""}}</div>
  1007 +</script>
  1008 +<script type="text/html" id="weblogicListenAddrTpl">
  1009 + <div>{{d.listenAddr?d.listenAddr:""}}</div>
  1010 +</script>
  1011 +<!--cup核心数-->
  1012 +<script type="text/html" id="cpuCoresTpl">
  1013 + <div>{{d.cpuCores?(d.cpuCores+"核"):""}}</div>
  1014 +</script>
  1015 +<!--cup个数-->
  1016 +<script type="text/html" id="cpuNumTpl">
  1017 + <div>{{d.cpuNum?(d.cpuNum+"个"):""}}</div>
  1018 +</script>
  1 +<div class="layadmin-user-login layadmin-user-display-show setting">
  2 + <div class="layadmin-user-login-main">
  3 + <div class="layadmin-user-login-box layadmin-user-login-body layui-form">
  4 + <div class="layui-form-item hide">
  5 + <label class="layadmin-user-login-icon layui-icon layui-icon-password"></label>
  6 + <input type="text" name="username" lay-verify="required" placeholder="监控账号" class="layui-input">
  7 + </div>
  8 + <div class="layui-form-item">
  9 + <div class="">
  10 + <select id="refSystem" name="refSystem" lay-filter="refSystem" lay-verify="required" class="layui-select layui-input"></select>
  11 + </div>
  12 + </div>
  13 + <div class="layui-form-item">
  14 + <label class="layadmin-user-login-icon"></label>
  15 + <input type="text" name="account" lay-verify="required" placeholder="系统账号" class="layui-input">
  16 + </div>
  17 + <div class="layui-form-item">
  18 + <label class="layadmin-user-login-icon"></label>
  19 + <input type="password" name="password" lay-verify="required" placeholder="系统密码" class="layui-input">
  20 + </div>
  21 + <div class="layui-form-item">
  22 + <div class="setting-btn">
  23 + <button class="layui-btn" id="setCommit" lay-submit lay-filter="setAccount">保存</button>
  24 + <button class="layui-btn layui-btn-primary" id="setClose">取消</button>
  25 + </div>
  26 + </div>
  27 + </div>
  28 + </div>
  29 +</div>
  30 +
  31 +<script>
  32 + layui.use(['admin', 'form','common','sessions'], function () {
  33 + var $ = layui.$;
  34 + var admin = layui.admin;
  35 + var form = layui.form;
  36 + var common = layui.common;
  37 + var sessions = layui.sessions;
  38 + var accessToken = sessions.getToken().access_token;
  39 + form.render();
  40 +
  41 + //填充用户监控账号
  42 + var username = localStorage.getItem("lgn");
  43 + $('input[name="username"]').val(username);
  44 +
  45 + //第三方系统下拉框切换事件监听
  46 + form.on('select(refSystem)', function(data){
  47 + if (data.value != ''){
  48 + getOldAccountAndPwd(username,data.value);
  49 + }
  50 + });
  51 +
  52 + //第三方系统下拉框数据填充
  53 + common.ddicSelect('refSystem','systems',function (datalist) {
  54 + if (datalist.length == 1){
  55 + $('#refSystem').val(datalist[0].ddicCode);
  56 + getOldAccountAndPwd(username,datalist[0].ddicCode);
  57 + }
  58 + form.render('select');
  59 + });
  60 +
  61 + $('#setClose').on('click',function () {
  62 + layer.closeAll();
  63 + });
  64 +
  65 + //保存点击事件
  66 + form.on('submit(setAccount)', function (obj) {
  67 + var userRefSystem = {};
  68 + //修改密码
  69 + userRefSystem.username = $('input[name="username"]').val();
  70 + userRefSystem.refSystem = $('#refSystem').val();
  71 + userRefSystem.account = $('input[name="account"]').val();
  72 + userRefSystem.password = $('input[name="password"]').val();
  73 + saveOrUpdate(userRefSystem);
  74 + });
  75 +
  76 + //增加或更细第三方账号关联信息
  77 + function saveOrUpdate(data) {
  78 + admin.req({
  79 + url: common.domainName + '/api-web/userRefSystem/saveOrUpdate?access_token='+accessToken,
  80 + type: "POST",
  81 + dataType: "json",
  82 + contentType: 'application/json; charset=utf-8',
  83 + data: JSON.stringify(data),
  84 + success: function (res) {
  85 + if (res){
  86 + var icon = 7;
  87 + if (res.success){
  88 + icon = 1;
  89 + }
  90 + layer.msg(res.msg, { offset: '15px' , icon: icon , time: 1000 },function (){
  91 + if (res.success){
  92 + layer.closeAll();
  93 + }
  94 + });
  95 + }
  96 +
  97 + }
  98 + })
  99 + }
  100 +
  101 + //根据监控账号及第三方系统,查找关联信息
  102 + function getOldAccountAndPwd(username,refSystem) {
  103 + admin.req({
  104 + url: common.domainName + '/api-web/userRefSystem/getByUsernameAndSystem',
  105 + type: "GET",
  106 + dataType: "json",
  107 + data:{
  108 + username: username,
  109 + refSystem: refSystem
  110 + },
  111 + success: function (res) {
  112 + if (res && res.success){
  113 + if (res.object){ //如果有绑定
  114 + $('#resSystem').val(res.object.refSystem);
  115 + $('input[name="account"]').val(res.object.account);
  116 + $('input[name="password"]').val(common.Base64.decode(res.object.password));
  117 + }else{ //如果未绑定
  118 + $('input[name="account"]').val(localStorage.getItem("lgn"));
  119 + }
  120 + }
  121 + form.render();
  122 + },
  123 + error: function () {
  124 + layer.msg('获取第三方账号异常', { offset: '15px' , icon: 1 , time: 1000 },function (){
  125 + });
  126 + }
  127 + })
  128 + }
  129 + });
  130 +</script>
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
21 <module>hg-monitor-web-tj</module> 21 <module>hg-monitor-web-tj</module>
22 <module>hg-monitor-web-zj</module> 22 <module>hg-monitor-web-zj</module>
23 <module>hg-monitor-web-nx</module> 23 <module>hg-monitor-web-nx</module>
  24 + <module>hg-monitor-web-qh</module>
24 </modules> 25 </modules>
25 <properties> 26 <properties>
26 <java.version>1.8</java.version> 27 <java.version>1.8</java.version>