|
|
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"></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}×tamp=${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
|
+}); |