Authored by 王涛

Merge branch 'master-mj-yjpnew' into 'master-mj'

fix:数据库恢复验证报告,备份实施服务器列表增加根据填入ip补全操作系统和数据库版本信息的优化



See merge request !1134
@@ -4211,6 +4211,11 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -4211,6 +4211,11 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
4211 }); 4211 });
4212 }); 4212 });
4213 }, 4213 },
  4214 + //ip格式正则验证
  4215 + validatorIP: function (ip) {
  4216 + var re = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
  4217 + return re.test(ip);
  4218 + },
4214 validatorPhone: function (phone) { 4219 validatorPhone: function (phone) {
4215 if (/^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])d{8}$/.test(phone)) { 4220 if (/^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])d{8}$/.test(phone)) {
4216 return { 4221 return {
@@ -152,7 +152,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'laydate' @@ -152,7 +152,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'laydate'
152 if (snCode != '' && snCode != undefined) { 152 if (snCode != '' && snCode != undefined) {
153 for (let i = 0; i < devicesBak.length; i++) { 153 for (let i = 0; i < devicesBak.length; i++) {
154 if (devicesBak[i].snCode == snCode) { 154 if (devicesBak[i].snCode == snCode) {
155 - devicesBak.pop(devicesBak[i]); 155 + devicesBak.splice(i,1);
  156 + break;
156 } 157 }
157 } 158 }
158 } 159 }
@@ -213,7 +214,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'laydate' @@ -213,7 +214,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'laydate'
213 if (fittingSN != '' && fittingSN != undefined) { 214 if (fittingSN != '' && fittingSN != undefined) {
214 for (let i = 0; i < fittingsBak.length; i++) { 215 for (let i = 0; i < fittingsBak.length; i++) {
215 if (fittingsBak[i].fittingSN == fittingSN) { 216 if (fittingsBak[i].fittingSN == fittingSN) {
216 - fittingsBak.pop(fittingsBak[i]); 217 + fittingsBak.splice(i,1);
  218 + break;
217 } 219 }
218 } 220 }
219 } 221 }
1 -layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect', 'laydate', 'upload'], function (exports) { 1 +layui.define(['table', 'form', 'admin', 'layer', 'common', 'commonDetail','sessions', 'xmSelect', 'laydate', 'upload'], function (exports) {
2 var $ = layui.$; 2 var $ = layui.$;
3 var form = layui.form; 3 var form = layui.form;
4 var layer = layui.layer; 4 var layer = layui.layer;
@@ -10,7 +10,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -10,7 +10,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
10 var upload = layui.upload; 10 var upload = layui.upload;
11 var domainName = common.domainName; 11 var domainName = common.domainName;
12 var xmSelect = layui.xmSelect; 12 var xmSelect = layui.xmSelect;
13 - 13 + var commonDetail = layui.commonDetail;
14 //对外暴露的接口 14 //对外暴露的接口
15 exports('recoveryverifyAdd', function (data) { 15 exports('recoveryverifyAdd', function (data) {
16 var accessToken = localStorage.getItem("accessToken"); 16 var accessToken = localStorage.getItem("accessToken");
@@ -91,9 +91,38 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -91,9 +91,38 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
91 return 91 return
92 } 92 }
93 deviceSaveCount += 1; 93 deviceSaveCount += 1;
94 - var html = "<tr><td><select class='layui-select' style='display: block' lay-verify = 'required'><option value='0'>备份服务器</option><option value='1'>源端生产服务器</option><option value='2'>恢复服务器</option></select></td><td><input type='text' width='40px' class='layui-input' lay-verify = 'required'/></td><td><input type='text' class='layui-input' width='40px' lay-verify = 'required'/></td><td><input type='text' width='40px' class='layui-input' lay-verify = 'required'/></td><td><input type='button' value='保存' class='edit' style='background-color: #b71010;line-height: 18px'/></td></tr>" 94 + var html = "<tr><td><select class='layui-select' style='display: block' lay-verify = 'required'><option value='0'>备份服务器</option><option value='1'>源端生产服务器</option><option value='2'>恢复服务器</option></select></td><td><input type='text' width='40px' lay-filter='ip' class='layui-input' lay-verify = 'required'/></td><td><input type='text' class='layui-input' width='40px' lay-filter='os' lay-verify = 'required'/></td><td><input type='text' width='40px' lay-filter='databaseVersion' class='layui-input' lay-verify = 'required'/></td><td><input type='button' value='保存' class='edit' style='background-color: #b71010;line-height: 18px'/></td></tr>"
95 $("#device-table").append(html); 95 $("#device-table").append(html);
96 - 96 + $("input[lay-filter='ip']").keyup(function (){
  97 + var ip = $(this).val();
  98 + var os = $(this).closest('tr').find('td').find("input[lay-filter='os']");
  99 + var databaseVersion = $(this).closest('tr').find('td').find("input[lay-filter='databaseVersion']");
  100 + if(commonDetail.validatorIP(ip)){
  101 + //获取资源信息
  102 + admin.req({
  103 + url: domainName + '/api-web/manage/resource/page?page=1&limit=1&resType=DATABASE_ORACLE&ipEquals='+ip
  104 + }).done(function (response) {
  105 + if(response.data!=null && response.data.length>0){
  106 + var resource = response.data[0];
  107 + os.val(resource.os);
  108 + $(this).closest('tr').find('td').find("input[lay-filter='os']").val(resource.os);
  109 + admin.req({
  110 + url: domainName + '/api-web/manage/resource/findById?resId='+resource.resId
  111 + }).done(function (response) {
  112 + if(response.obj !=null && response.obj.proto){
  113 + var obj = response.obj;
  114 + if(obj.proto !=null && obj.proto.JDBC){
  115 + var version = obj.proto.JDBC.filter(obj=>obj.paramCode==='version');
  116 + if(version) {
  117 + databaseVersion.val(version[0].paramValue);
  118 + }
  119 + }
  120 + }
  121 + });
  122 + }
  123 + });
  124 + };
  125 + }).keyup();
97 $("#table-device :button.edit").click(function () { 126 $("#table-device :button.edit").click(function () {
98 var toEdit = this.value == '保存'; 127 var toEdit = this.value == '保存';
99 this.value = toEdit ? '删除' : '保存'; 128 this.value = toEdit ? '删除' : '保存';
@@ -123,7 +152,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -123,7 +152,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
123 if (ip != '' && ip != undefined) { 152 if (ip != '' && ip != undefined) {
124 for (let i = 0; i < devicesBak.length; i++) { 153 for (let i = 0; i < devicesBak.length; i++) {
125 if (devicesBak[i].ip == ip) { 154 if (devicesBak[i].ip == ip) {
126 - devicesBak.pop(devicesBak[i]); 155 + devicesBak.splice(i,1);
  156 + break;
127 } 157 }
128 } 158 }
129 } 159 }
@@ -448,11 +478,47 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -448,11 +478,47 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
448 tdArr.push(this.innerHTML); 478 tdArr.push(this.innerHTML);
449 479
450 } else { 480 } else {
451 - this.innerHTML = '<input type="text" value="' + this.innerHTML.replace(/"/g, '&quot;').replace(/<\/?.+?>/g, '').replace(/ /g, '') + '"/>';  
452 - } 481 + if(t==0){
  482 + this.innerHTML = '<input type="text" lay-filter="ip" width="40px" value="' + this.innerHTML.replace(/"/g, '&quot;').replace(/<\/?.+?>/g, '').replace(/ /g, '') + '"/>';
  483 +
  484 + }else if(t==1){
  485 + this.innerHTML = '<input type="text" lay-filter="os" width="40px" value="' + this.innerHTML.replace(/"/g, '&quot;').replace(/<\/?.+?>/g, '').replace(/ /g, '') + '"/>';
  486 +
  487 + }else {
  488 + this.innerHTML = '<input type="text" lay-filter="databaseVersion" width="40px" value="' + this.innerHTML.replace(/"/g, '&quot;').replace(/<\/?.+?>/g, '').replace(/ /g, '') + '"/>';
  489 + } }
453 }) 490 })
454 if (toEdit) { 491 if (toEdit) {
455 - 492 + $("input[lay-filter='ip']").keyup(function (){
  493 + var ip = $(this).val();
  494 + var os = $(this).closest('tr').find('td').find("input[lay-filter='os']");
  495 + var databaseVersion = $(this).closest('tr').find('td').find("input[lay-filter='databaseVersion']");
  496 + if(commonDetail.validatorIP(ip)){
  497 + //获取资源信息
  498 + admin.req({
  499 + url: domainName + '/api-web/manage/resource/page?page=1&limit=1&resType=DATABASE_ORACLE&ipEquals='+ip
  500 + }).done(function (response) {
  501 + if(response.data!=null && response.data.length>0){
  502 + var resource = response.data[0];
  503 + os.val(resource.os);
  504 + $(this).closest('tr').find('td').find("input[lay-filter='os']").val(resource.os);
  505 + admin.req({
  506 + url: domainName + '/api-web/manage/resource/findById?resId='+resource.resId
  507 + }).done(function (response) {
  508 + if(response.obj !=null && response.obj.proto){
  509 + var obj = response.obj;
  510 + if(obj.proto !=null && obj.proto.JDBC){
  511 + var version = obj.proto.JDBC.filter(obj=>obj.paramCode==='version');
  512 + if(version) {
  513 + databaseVersion.val(version[0].paramValue);
  514 + }
  515 + }
  516 + }
  517 + });
  518 + }
  519 + });
  520 + };
  521 + }).keyup();
456 } else { 522 } else {
457 if (tdArr.length > 0) { 523 if (tdArr.length > 0) {
458 var deviceObj = { 524 var deviceObj = {
@@ -463,12 +529,14 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -463,12 +529,14 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
463 'id': id, 529 'id': id,
464 'recordId': recordId 530 'recordId': recordId
465 } 531 }
466 - devicesBak.forEach(e => { 532 + devicesBak = devicesBak.filter((val)=>val.id!=deviceObj.id);
  533 + devicesBak.push(deviceObj);
  534 + /* devicesBak.forEach(e => {
467 if (deviceObj.id == e.id) { 535 if (deviceObj.id == e.id) {
468 devicesBak.pop(e); 536 devicesBak.pop(e);
469 devicesBak.push(deviceObj); 537 devicesBak.push(deviceObj);
470 } 538 }
471 - }) 539 + })*/
472 } 540 }
473 } 541 }
474 }); 542 });
@@ -129,7 +129,9 @@ layui.define(['table', 'form', 'admin', 'layer', 'common','commonDetail', 'sessi @@ -129,7 +129,9 @@ layui.define(['table', 'form', 'admin', 'layer', 'common','commonDetail', 'sessi
129 if (id > 0 && id != undefined) { 129 if (id > 0 && id != undefined) {
130 for (let i = 0; i < adjustBak.length; i++) { 130 for (let i = 0; i < adjustBak.length; i++) {
131 if (adjustBak[i].id == id) { 131 if (adjustBak[i].id == id) {
132 - adjustBak.pop(adjustBak[i]); 132 + //adjustBak.pop(adjustBak[i]);
  133 + adjustBak.splice(i,1);
  134 + break;
133 } 135 }
134 } 136 }
135 } 137 }
@@ -108,7 +108,9 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'commonDetail','sessi @@ -108,7 +108,9 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'commonDetail','sessi
108 if (name != '' && name != undefined) { 108 if (name != '' && name != undefined) {
109 for (let i = 0; i < staffsBak.length; i++) { 109 for (let i = 0; i < staffsBak.length; i++) {
110 if (staffsBak[i].userName == name) { 110 if (staffsBak[i].userName == name) {
111 - staffsBak.pop(staffsBak[i]); 111 + //staffsBak.pop(staffsBak[i]);
  112 + staffsBak.splice(i,1);
  113 + break;
112 } 114 }
113 } 115 }
114 } 116 }
@@ -130,8 +130,8 @@ @@ -130,8 +130,8 @@
130 </div> 130 </div>
131 <div class="layui-form-item" id="backDiv" hidden> 131 <div class="layui-form-item" id="backDiv" hidden>
132 <div class="layui-inline inline-half"> 132 <div class="layui-inline inline-half">
133 - <label class="layui-form-label" style="width: 160px"><span  
134 - style="color: red;font-size: 16px">*</span>演练前是否备份:</label> 133 + <label class="layui-form-label" style="width: 130px"><span
  134 + style="color: red;font-size: 16px">*</span>演练前备份:</label>
135 <div class="layui-input-block"> 135 <div class="layui-input-block">
136 <input type="radio" lay-filter="isBack" name="isBack" value="0" title="是" checked> 136 <input type="radio" lay-filter="isBack" name="isBack" value="0" title="是" checked>
137 <input type="radio" lay-filter="isBack" name="isBack" value="1" title="否"> 137 <input type="radio" lay-filter="isBack" name="isBack" value="1" title="否">
@@ -147,8 +147,8 @@ @@ -147,8 +147,8 @@
147 </div> 147 </div>
148 <div class="layui-form-item" id="resultDiv" hidden> 148 <div class="layui-form-item" id="resultDiv" hidden>
149 <div class="layui-inline inline-half"> 149 <div class="layui-inline inline-half">
150 - <label class="layui-form-label"><span  
151 - style="color: red;font-size: 16px">*</span>演练结果:</label> 150 + <label class="layui-form-label" style="width: 130px"><span
  151 + style="color: red;font-size: 16px">*</span>演练后结果:</label>
152 <div class="layui-input-block"> 152 <div class="layui-input-block">
153 <input type="radio" name="status" value="0" title="成功" checked> 153 <input type="radio" name="status" value="0" title="成功" checked>
154 <input type="radio" name="status" value="1" title="失败"> 154 <input type="radio" name="status" value="1" title="失败">