Authored by qinchao

mysq监控

  1 +(function($) {
  2 + // 看过jquery源码就可以发现$.fn就是$.prototype, 只是为了兼容早期版本的插件
  3 + // 才保留了jQuery.prototype这个形式
  4 + $.fn.mergeCell = function(options) {
  5 + return this.each(function() {
  6 + var cols = options.cols;
  7 + for ( var i = cols.length - 1; cols[i] != undefined; i--) {
  8 + // fixbug console调试
  9 + // console.debug(cols[i]);
  10 + mergeCell($(this), cols[i]);
  11 + }
  12 + dispose($(this));
  13 + });
  14 + };
  15 + // 如果对javascript的closure和scope概念比较清楚, 这是个插件内部使用的private方法
  16 + // 具体可以参考本人前一篇随笔里介绍的那本书
  17 + function mergeCell($table, colIndex) {
  18 +
  19 + $table.data('col-content', ''); // 存放单元格内容
  20 + $table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
  21 + $table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
  22 + $table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
  23 +
  24 + // 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
  25 + $('tbody tr', $table).each(function(index) {
  26 + // td:eq中的colIndex即列索引
  27 + var $td = $('td:eq(' + colIndex + ')', this);
  28 +
  29 + // 取出单元格的当前内容
  30 + var currentContent = $td.html();
  31 +
  32 + // 第一次时走此分支
  33 + if ($table.data('col-content') == '') {
  34 +
  35 + $table.data('col-content', currentContent);
  36 + $table.data('col-td', $td);
  37 +
  38 + } else {
  39 + // 上一行与当前行内容相同
  40 + if ($table.data('col-content') == currentContent) {
  41 + // 上一行与当前行内容相同则col-rowspan累加, 保存新值
  42 + var rowspan = $table.data('col-rowspan') + 1;
  43 + $table.data('col-rowspan', rowspan);
  44 + // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
  45 + $td.hide();
  46 +
  47 + // 最后一行的情况比较特殊一点
  48 + // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
  49 + if (++index == $table.data('trNum'))
  50 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  51 +
  52 + } else { // 上一行与当前行内容不同
  53 + // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
  54 + if ($table.data('col-rowspan') != 1) {
  55 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  56 + }
  57 + // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
  58 + $table.data('col-td', $td);
  59 + $table.data('col-content', $td.html());
  60 + $table.data('col-rowspan', 1);
  61 + }
  62 + }
  63 + });
  64 + }
  65 +
  66 + // 同样是个private函数 清理内存之用
  67 + function dispose($table) {
  68 + $table.removeData();
  69 + }
  70 +})(jQuery);
@@ -26,6 +26,8 @@ @@ -26,6 +26,8 @@
26 type="text/javascript"></script> 26 type="text/javascript"></script>
27 <script src="<%=basePath%>js/jquery-1.12.0.min.js" charset="UTF-8" 27 <script src="<%=basePath%>js/jquery-1.12.0.min.js" charset="UTF-8"
28 type="text/javascript"></script> 28 type="text/javascript"></script>
  29 + <script src="<%=basePath%>js/jquery.table.mergecell.js" charset="UTF-8"
  30 + type="text/javascript"></script>
29 <script src="<%=basePath%>js/jquery-ui.custom.js" charset="UTF-8" 31 <script src="<%=basePath%>js/jquery-ui.custom.js" charset="UTF-8"
30 type="text/javascript"></script> 32 type="text/javascript"></script>
31 <script src="<%=basePath%>/js/bootstrap.min.js"></script> 33 <script src="<%=basePath%>/js/bootstrap.min.js"></script>
@@ -80,11 +82,11 @@ @@ -80,11 +82,11 @@
80 82
81 <div class="container-fluid"> 83 <div class="container-fluid">
82 <div class="widget-box"> 84 <div class="widget-box">
83 - <div class="widget-title" style="height: 35px;"> 85 + <%--<div class="widget-title" style="height: 35px;">
84 <div> 86 <div>
85 87
86 </div> 88 </div>
87 - </div> 89 + </div>--%>
88 <div class="widget-content"> 90 <div class="widget-content">
89 <div id="mysqlTable" style="overflow-y: auto; overflow-x: hidden; max-height: 800px"></div> 91 <div id="mysqlTable" style="overflow-y: auto; overflow-x: hidden; max-height: 800px"></div>
90 </div> 92 </div>
@@ -113,13 +115,9 @@ @@ -113,13 +115,9 @@
113 loadFilter : function(data) { 115 loadFilter : function(data) {
114 return defaultLoadFilter(data); 116 return defaultLoadFilter(data);
115 }, 117 },
116 - onLoadSuccess : function(data) {  
117 - // var data = $('#table').bootstrapTable('getData', true);  
118 - //合并单元格  
119 - //mergeCells(data, "name", 0, $('#mysqlTable'));  
120 - alert(1);  
121 - MergeCell('mysqlTable',0,0);  
122 - 118 + onLoadSuccess : function() {
  119 + mergeCell2($('#mysqlTable'),1,[0,1]);
  120 + mergeCell($('#mysqlTable'),0);
123 }, 121 },
124 /* queryParams:{ 122 /* queryParams:{
125 "eventName":"测试一下而已" 123 "eventName":"测试一下而已"
@@ -129,44 +127,6 @@ @@ -129,44 +127,6 @@
129 127
130 }); 128 });
131 129
132 - ///合并表格相同行的内容  
133 - ///tableId:表格ID(最好是tbody,避免把表尾给合并了)  
134 - ///startRow:起始行,没有标题就从0开始  
135 - ///endRow:终止行,此参数是递归时检查的范围,一开始时会自动赋值为最后一行  
136 - ///col:当前处理的列  
137 - function MergeCell(tableId, startRow, col,endRow) {  
138 - var tb_jq = $("#mysqlTable div table tbody");  
139 - var tb=tb_jq[0]; //DOM对象  
140 - console.log(tb);  
141 -  
142 - if (col >= tb.rows[0].cells.length) {  
143 - return;  
144 - }  
145 -  
146 -  
147 - //当检查第0列时检查所有行  
148 - if (col == 0 || endRow == 0) {  
149 - endRow = tb.rows.length - 1;  
150 - }  
151 - for (var i = startRow; i < endRow; i++) {  
152 - //程序是自左向右合并  
153 - if (tb.rows[startRow].cells[col].innerHTML == tb.rows[i + 1].cells[col].innerHTML) {  
154 - //如果相同则删除下一行的第0列单元格  
155 - tb.rows[i + 1].cells[col].style.display='none';  
156 - //更新rowSpan属性  
157 - tb.rows[startRow].cells[col].rowSpan = (tb.rows[startRow].cells[col].rowSpan | 0) + 1;  
158 - //当循环到终止行前一行并且起始行和终止行不相同时递归(因为上面的代码已经检查了i+1行,所以此处只到endRow-1)  
159 - if (i == endRow - 1 && startRow != endRow) {  
160 - MergeCell(tableId, startRow, endRow, col + 1);  
161 - }  
162 - } else {  
163 - //起始行,终止行不变,检查下一列  
164 - MergeCell(tableId, startRow, i, col + 1);  
165 - //增加起始行  
166 - startRow = i + 1;  
167 - }  
168 - }  
169 - }  
170 130
171 function getColumns(){ 131 function getColumns(){
172 var columns = [ 132 var columns = [
@@ -181,22 +141,28 @@ @@ -181,22 +141,28 @@
181 } 141 }
182 }, 142 },
183 { 143 {
184 - title : "aws主机",  
185 - field : "awsMObjectInfo",  
186 - width : "40%",  
187 - align:"left",  
188 - alignColumn:"center",  
189 - formatter : function(value, rowData, rowIndex) {  
190 - return fmtHost(rowData.awsMObjectInfo); 144 + title : "归属云",
  145 + field : "cloudType",
  146 + width : "10%",
  147 + styler : function(value, rowData, rowIndex){
  148 + return {
  149 + "vertical-align" : "middle"
  150 + };
191 } 151 }
192 - },{  
193 - title : "qcloud主机",  
194 - field : "qcloudMObjectInfo",  
195 - width : "40%", 152 + },
  153 + {
  154 + title : "主机",
  155 + field : "moHostIp",
  156 + width : "80%",
196 align:"left", 157 align:"left",
197 alignColumn:"center", 158 alignColumn:"center",
198 formatter : function(value, rowData, rowIndex) { 159 formatter : function(value, rowData, rowIndex) {
199 - return fmtHost(rowData.qcloudMObjectInfo); 160 + return fmtHost(value,rowData.moTags);
  161 + },
  162 + styler : function(value, rowData, rowIndex){
  163 + return {
  164 + "vertical-align" : "middle"
  165 + };
200 } 166 }
201 }/*, 167 }/*,
202 { 168 {
@@ -215,66 +181,169 @@ @@ -215,66 +181,169 @@
215 } 181 }
216 182
217 183
218 - function fmtHost(instances) {  
219 - if(instances == null || instances.length == 0){ 184 + function fmtHost(ip,tags) {
  185 + if(ip == null || ip.length == 0){
220 return; 186 return;
221 } 187 }
222 188
223 var masterIps=""; 189 var masterIps="";
224 var slaveIps=""; 190 var slaveIps="";
225 - for(var index = 0;index < instances.length;index++){  
226 - //属性 主机标签 --tags  
227 - var tags = instances[index].moTags;  
228 - var masterFlag=false;  
229 - var masterBadage='<span class="badge" style="background-color: #fff;font-weight:normal;">&nbsp;&nbsp;&nbsp;</span>';  
230 - var tagsBadage="";  
231 - var ipBackgroudColor="#5bc0de";  
232 - if(tags != null && tags!= ""){//展示标签信息  
233 - tagsBadage= "<span class=\"badge\" style=\"background-color: #5bc0de;font-weight:normal;font-size: 13px\";>标签:&nbsp;" + tags +"</span>";  
234 - if(tags.toUpperCase().indexOf("MASTER")>=0){  
235 - masterFlag=true;  
236 - masterBadage='<span class="badge">M</span>';  
237 - ipBackgroudColor="#777";  
238 - } 191 +
  192 + //属性 主机标签 --tags
  193 + var masterFlag=false;
  194 + var masterBadage='<span class="badge" style="background-color: #fff;font-weight:normal;">&nbsp;&nbsp;&nbsp;</span>';
  195 + var tagsBadage="";
  196 + var ipBackgroudColor="#5bc0de";
  197 + if(tags != null && tags!= ""){//展示标签信息
  198 + tagsBadage= "<span class=\"badge\" style=\"background-color: #5bc0de;font-weight:normal;font-size: 13px\";>标签:&nbsp;" + tags +"</span>";
  199 + if(tags.toUpperCase().indexOf("MASTER")>=0){
  200 + masterFlag=true;
  201 + masterBadage='<span class="badge" style="background-color: #5bc0de;font-weight:normal;">M</span>';
  202 + //ipBackgroudColor="#5bc0de";
239 } 203 }
  204 + }
  205 +
  206 + var healthCss=' style="background-color: '+ipBackgroudColor+';font-weight:normal;" ';
  207 + var runningStatusMessage = '&nbsp;&nbsp;<a href="#" title="master"><span class="badge" style="background-color: '+ipBackgroudColor+';font-weight:normal;"><i class="fa fa-check-circle" aria-hidden="true"></i></span></a>';
  208 + /*if("Healthy"!=instances[index].runningStatus){
  209 + healthCss=' style="background-color: #DD514D;font-weight:normal;" ';
  210 + runningStatusMessage='&nbsp;&nbsp;<a href="#" title="异常"><span class="badge" style="background-color: #DD514D;font-weight:normal;"><i class="fa fa-exclamation-circle" aria-hidden="true"></i></span></a>';
  211 + }*/
  212 +
240 213
241 - var healthCss=' style="background-color: '+ipBackgroudColor+';font-weight:normal;" ';  
242 - var runningStatusMessage = '&nbsp;&nbsp;<a href="#" title="master"><span class="badge" style="background-color: '+ipBackgroudColor+';font-weight:normal;"><i class="fa fa-check-circle" aria-hidden="true"></i></span></a>';  
243 - /*if("Healthy"!=instances[index].runningStatus){  
244 - healthCss=' style="background-color: #DD514D;font-weight:normal;" ';  
245 - runningStatusMessage='&nbsp;&nbsp;<a href="#" title="异常"><span class="badge" style="background-color: #DD514D;font-weight:normal;"><i class="fa fa-exclamation-circle" aria-hidden="true"></i></span></a>';  
246 - }*/ 214 + var hostip='<span class="label" style="font-weight:normal;">';
  215 + hostip+= ('<span class="badge" '+healthCss+'>'+ip);
247 216
  217 + for(var i=0;i<=(15-ip.length);i++){
  218 + hostip+="&nbsp;&nbsp;"
  219 + }
  220 +
  221 +
  222 + hostip += runningStatusMessage;
  223 +
  224 + hostip += '</span>';
  225 + hostip += '</span>';
  226 +
  227 +
  228 +
  229 + hostip = hostip +tagsBadage;
  230 +
  231 + var onehost='<h4>'+masterBadage+hostip+'</h4>';
  232 + if(masterFlag){
  233 + masterIps += onehost;
  234 + }else{
  235 + slaveIps += onehost;
  236 + }
  237 +
  238 + return masterIps+slaveIps;
  239 + }
  240 +
  241 +
  242 + // 如果对javascript的closure和scope概念比较清楚, 这是个插件内部使用的private方法
  243 + // 具体可以参考本人前一篇随笔里介绍的那本书
  244 + function mergeCell($table, colIndex) {
  245 +
  246 + $table.data('col-content', ''); // 存放单元格内容
  247 + $table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
  248 + $table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
  249 + $table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
  250 +
  251 + // 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
  252 + $('tbody tr', $table).each(function(index) {
  253 + // td:eq中的colIndex即列索引
  254 + var $td = $('td:eq(' + colIndex + ')', this);
  255 +
  256 + // 取出单元格的当前内容
  257 + var currentContent = $td.html();
248 258
249 - var hostip='<span class="label" style="font-weight:normal;">';  
250 - hostip+= ('<span class="badge" '+healthCss+'>'+instances[index].moHostIp); 259 + // 第一次时走此分支
  260 + if ($table.data('col-content') == '') {
251 261
252 - //在个别机器的chrome版本上instances[index].ip取不到值,很奇怪,因此添加一个if判断,跳过  
253 - if(instances[index]!=null&&instances[index].moHostIp!=null&& instances[index].moHostIp != undefined&&instances[index].moHostIp!=""){  
254 - for(var i=0;i<=(15-instances[index].moHostIp.length);i++){  
255 - hostip+="&nbsp;&nbsp;" 262 + $table.data('col-content', currentContent);
  263 + $table.data('col-td', $td);
  264 +
  265 + } else {
  266 + // 上一行与当前行内容相同
  267 + if ($table.data('col-content') == currentContent) {
  268 + // 上一行与当前行内容相同则col-rowspan累加, 保存新值
  269 + var rowspan = $table.data('col-rowspan') + 1;
  270 + $table.data('col-rowspan', rowspan);
  271 + // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
  272 + $td.hide();
  273 +
  274 + // 最后一行的情况比较特殊一点
  275 + // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
  276 + if (++index == $table.data('trNum'))
  277 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  278 +
  279 + } else { // 上一行与当前行内容不同
  280 + // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
  281 + if ($table.data('col-rowspan') != 1) {
  282 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  283 + }
  284 + // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
  285 + $table.data('col-td', $td);
  286 + $table.data('col-content', $td.html());
  287 + $table.data('col-rowspan', 1);
256 } 288 }
257 } 289 }
  290 + });
  291 + }
  292 +
  293 + function mergeCell2($table, colIndex,checkColsArray) {
  294 +
  295 + $table.data('col-content', ''); // 存放单元格内容
  296 + $table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
  297 + $table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
  298 + $table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
258 299
259 - hostip += runningStatusMessage; 300 + // 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
  301 + $('tbody tr', $table).each(function(index) {
  302 + // td:eq中的colIndex即列索引
  303 + var $td = $('td:eq(' + colIndex + ')', this);
260 304
261 - hostip += '</span>';  
262 - hostip += '</span>'; 305 + // 取出单元格的当前内容
263 306
  307 + var currentContent = "";
  308 + for(var tmp=0;tmp<checkColsArray.length;tmp++){
  309 + var $tmpTd=$('td:eq(' + tmp + ')', this);
  310 + currentContent += $tmpTd.html()
  311 + }
  312 + // 第一次时走此分支
  313 + if ($table.data('col-content') == '') {
  314 +
  315 + $table.data('col-content', currentContent);
  316 + $table.data('col-td', $td);
264 317
  318 + } else {
  319 + // 上一行与当前行内容相同
  320 + if ($table.data('col-content') == currentContent) {
  321 + // 上一行与当前行内容相同则col-rowspan累加, 保存新值
  322 + var rowspan = $table.data('col-rowspan') + 1;
  323 + $table.data('col-rowspan', rowspan);
  324 + // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
  325 + $td.hide();
265 326
266 - hostip = hostip +tagsBadage; 327 + // 最后一行的情况比较特殊一点
  328 + // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
  329 + if (++index == $table.data('trNum'))
  330 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
267 331
268 - var onehost='<h4>'+masterBadage+hostip+'</h4>';  
269 - if(masterFlag){  
270 - masterIps += onehost;  
271 - }else{  
272 - slaveIps += onehost; 332 + } else { // 上一行与当前行内容不同
  333 + // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
  334 + if ($table.data('col-rowspan') != 1) {
  335 + $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  336 + }
  337 + // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
  338 + $table.data('col-td', $td);
  339 + $table.data('col-content', currentContent);
  340 + $table.data('col-rowspan', 1);
  341 + }
273 } 342 }
274 - }  
275 - return masterIps+slaveIps; 343 + });
276 } 344 }
277 345
  346 +
278 </script> 347 </script>
279 </body> 348 </body>
280 </html> 349 </html>