Authored by 王涛

Merge branch 'master-500-dev' of http://192.168.1.136:82/monitor_v3/hg-monitor-w…

…eb into master-500-dev
Showing 19 changed files with 355 additions and 84 deletions
@@ -851,9 +851,24 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'soulTable', 'sessions', 'comm @@ -851,9 +851,24 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'soulTable', 'sessions', 'comm
851 $('table tr').hover(function (obj) { 851 $('table tr').hover(function (obj) {
852 $(obj.currentTarget).find('.reslist-view-topo').removeClass('hide'); 852 $(obj.currentTarget).find('.reslist-view-topo').removeClass('hide');
853 $(obj.currentTarget).find('.reslist-assets-details').removeClass('hide'); 853 $(obj.currentTarget).find('.reslist-assets-details').removeClass('hide');
  854 + // Start 资源视图中的资源名称在表格中溢出时给最大宽度限制-更改单元格溢出时的tip跑到左上角 LSQ 2022/1/6
  855 + var w=$(obj.currentTarget).find('#res-div span').innerWidth();
  856 + var spanMaxW=parseInt($(obj.currentTarget).find('#res-div span').css('max-width'));
  857 + //-20是一个图标的宽度,若要增加图标,这里的20需要增加
  858 + var maxW=(w-20)+'px';
  859 + if(w+15>=spanMaxW){
  860 + $(obj.currentTarget).find('#res-div span').css('max-width',maxW)
  861 + }
854 }, function (obj) { 862 }, function (obj) {
855 $(obj.currentTarget).find('.reslist-view-topo').addClass('hide'); 863 $(obj.currentTarget).find('.reslist-view-topo').addClass('hide');
856 $(obj.currentTarget).find('.reslist-assets-details').addClass('hide'); 864 $(obj.currentTarget).find('.reslist-assets-details').addClass('hide');
  865 + var w=$(obj.currentTarget).find('#res-div span').innerWidth();
  866 + var spanMaxW=parseInt($(obj.currentTarget).find('#res-div span').css('max-width'));
  867 + var maxW=(w+20)+'px';
  868 + if(w+15>=spanMaxW){
  869 + $(obj.currentTarget).find('#res-div span').css('max-width',maxW)
  870 + }
  871 + //End LSQ 2022/1/6
857 }) 872 })
858 873
859 // 加入/移出收藏夹 874 // 加入/移出收藏夹
@@ -645,6 +645,7 @@ layui.define(['table', 'form', 'sessions', 'common', 'view', 'admin', 'upload',' @@ -645,6 +645,7 @@ layui.define(['table', 'form', 'sessions', 'common', 'view', 'admin', 'upload','
645 } else { 645 } else {
646 clearInterval(timeTask); 646 clearInterval(timeTask);
647 layer.confirm(response.msg, {icon: 1, offset: '100px'}); 647 layer.confirm(response.msg, {icon: 1, offset: '100px'});
  648 + reloadCollectorTable();
648 resetBtn(); 649 resetBtn();
649 } 650 }
650 } else { 651 } else {
@@ -96,7 +96,7 @@ layui.extend({ @@ -96,7 +96,7 @@ layui.extend({
96 96
97 //请求视图渲染 97 //请求视图渲染
98 view().render(path.join('/')).then(function(res){ 98 view().render(path.join('/')).then(function(res){
99 - 99 +console.log("tag&&&&&&&&&",res,pathURL)
100 //遍历页签选项卡 100 //遍历页签选项卡
101 var matchTo 101 var matchTo
102 ,tabs = $('#LAY_app_tabsheader>li'); 102 ,tabs = $('#LAY_app_tabsheader>li');
@@ -113,7 +113,9 @@ layui.extend({ @@ -113,7 +113,9 @@ layui.extend({
113 try { 113 try {
114 let el = admin.tabsPage.elem; 114 let el = admin.tabsPage.elem;
115 if(el && el.attr('lay-href-type')){ 115 if(el && el.attr('lay-href-type')){
116 - if(el.attr('lay-href-type') == 'menu' && !matchTo){ 116 + //lsq 页面刷新后名称改变 2022-03-29
  117 + // if(el.attr('lay-href-type') == 'menu' && !matchTo){
  118 + if(el.attr('lay-href-type') == 'menu'){
117 tabName= admin.tabsPage.elem.text() 119 tabName= admin.tabsPage.elem.text()
118 } 120 }
119 } 121 }
@@ -533,7 +533,72 @@ @@ -533,7 +533,72 @@
533 </p> 533 </p>
534 </div> 534 </div>
535 </script> 535 </script>
  536 +<!--//start lsq 首页、资源视图、业务视图的资源名称点击进入详情-->
  537 +<!--资源名称-->
  538 +<script type="text/html" id="resindex_resName">
  539 + <!-- 更改单元格溢出时的tip跑到左上角 LSQ 2022/1/6-->
  540 + <div id="res-div">
  541 + {{# var urlLast=window.location.hash;
  542 + var w=$(".layui-table thead th[data-field='resName']").data('minwidth');
  543 + if(urlLast=="#/res/index"){
  544 + w=$("[lay-id='resListTable'] table thead th[data-field='resName'").data('minwidth');
536 545
  546 + }else if(urlLast=="#/biz/index"){
  547 + w=$("[lay-id='bizListTable'] table thead th[data-field='resName'").data('minwidth');
  548 + }else if(urlLast.indexOf("#/biz/list")!=-1){
  549 + w=$("[lay-id='bizResListTable'] table thead th[data-field='resName'").data('minwidth');
  550 + w=w?w:$("[lay-id='bizResListTable'] table thead th[data-field='resName'").innerWidth();
  551 + }
  552 + var maxW=(w-45)+'px';
  553 + var styleW="float: left;max-width: "+maxW+";overflow: hidden; text-overflow: ellipsis; white-space: nowrap;display: inline-block;";
  554 + }}
  555 + <span lay-tips="{{ d.resName }}" style="{{styleW}}" data-zymc="{{ d.resId }}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-childrennum="{{d.childrenNum}}" data-ip="{{ d.ip }}" data-resTypeName="{{ d.resTypeName }}" data-admin="{{ d.admin }}" data-adminname="{{ d.adminName }}" data-pingenable="{{d.pingEnable}}" data-manageIp="{{d.manageIp}}" data-collProtocol="{{d.collProtocol}}" data-provider="{{d.provider}}" data-state="{{d.state}}" class="layui-table-link">{{ d.resName }}</span>
  556 + {{# if (d.favId == null) { }}
  557 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  558 + {{# } else { }}
  559 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 1px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  560 + {{# } }}
  561 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 1px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  562 + <!--{{# if (d.resCategory == 'share' && d.hardwareFlag && d.hardwareFlag.endsWith("Y")) { }}
  563 + <a class="layui-icon reslist-assets-details hide" data-resid="{{d.resId}}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-ip="{{ d.ip }}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>
  564 + {{# } }}-->
  565 + </div>
  566 +</script>
  567 +<!--详情页面连接状态-->
  568 +<script type="text/html" id="linkStateDetailTpl">
  569 + {{#
  570 + var linkStateHtml = '';
  571 + var linkStateTips = '无连接信息';
  572 + if(d.linkStateList && d.linkStateList.length) {
  573 + linkStateTips = '';
  574 + if(d.linkStateList.length == 1) {
  575 + var linkState = d.linkStateList[0];
  576 + linkStateTips = `${linkState.protocol}: ${linkState.state}`;
  577 + if(linkState.state.indexOf('成功') !== -1) {
  578 + linkStateHtml = `<span class="span-green">${linkState.state}</span>`;
  579 + } else {
  580 + linkStateHtml = `<span class="span-red">${linkState.state}</span>`;
  581 + }
  582 + } else {
  583 + linkStateTips += `<ul class='ul-link-state-tips'>`;
  584 + layui.each(d.linkStateList, function(index, value) {
  585 + if(value.state.indexOf('成功') !== -1) {
  586 + linkStateTips += `<li class='li-link-state-tips-green'>${value.protocol}: ${value.state}</li>`;
  587 + linkStateHtml += '<div class="layui-badge-dot layui-bg-green"></div>';
  588 + } else {
  589 + linkStateTips += `<li class='li-link-state-tips-red'>${value.protocol}: ${value.state}</li>`;
  590 + linkStateHtml += '<div class="layui-badge-dot layui-bg-red"></div>';
  591 + }
  592 + });
  593 + linkStateTips += '</ul>';
  594 + }
  595 + }
  596 + }}
  597 + <div class="div-link-state-list" lay-tips="{{linkStateTips}}">
  598 + {{linkStateHtml}}
  599 + </div>
  600 +</script>
  601 +<!--//end lsq 2022-03-29-->
537 <!--最大文件系统使用率--> 602 <!--最大文件系统使用率-->
538 <script type="text/html" id="fileUseRateTpl"> 603 <script type="text/html" id="fileUseRateTpl">
539 <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI449F5365" data-flag="fs" data-name="{{d.os=='windows'?'磁盘使用情况':'文件系统使用情况'}}" data-showtype="bar" data-barkpiid="{{d.os=='windows'?'KPI29D42042,KPI1988842F':'KPIA91F44E7,KPI98306224'}}" data-barxaxis="{{d.os=='windows'?'KPI9D22EAB6':'KPI7AC1664E'}}" 604 <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI449F5365" data-flag="fs" data-name="{{d.os=='windows'?'磁盘使用情况':'文件系统使用情况'}}" data-showtype="bar" data-barkpiid="{{d.os=='windows'?'KPI29D42042,KPI1988842F':'KPIA91F44E7,KPI98306224'}}" data-barxaxis="{{d.os=='windows'?'KPI9D22EAB6':'KPI7AC1664E'}}"
@@ -6,6 +6,13 @@ @@ -6,6 +6,13 @@
6 max-height: 100%; 6 max-height: 100%;
7 overflow: auto; 7 overflow: auto;
8 } 8 }
  9 +.alarmsClearEditor-container .el-button--primary{
  10 + background: #1E9FFF;
  11 + border-color: #1E9FFF;
  12 + }
  13 +.alarmsClearEditor-container .el-tag{
  14 + color:#1E9FFF;
  15 +}
9 .alarmsClearEditor-info{ 16 .alarmsClearEditor-info{
10 /*padding:10px;*/ 17 /*padding:10px;*/
11 } 18 }
@@ -40,6 +47,10 @@ @@ -40,6 +47,10 @@
40 text-align: left; 47 text-align: left;
41 width:100%; 48 width:100%;
42 } 49 }
  50 +.info-item-statistics .el-collapse-item__content{
  51 + max-height:250px;
  52 + overflow: auto;
  53 +}
43 .info-content{ 54 .info-content{
44 margin-bottom: 5px; 55 margin-bottom: 5px;
45 } 56 }
@@ -136,3 +147,32 @@ @@ -136,3 +147,32 @@
136 .apply-btn .el-button{ 147 .apply-btn .el-button{
137 margin:3px; 148 margin:3px;
138 } 149 }
  150 +.clearDetail-container{
  151 + padding:0 15px;
  152 + min-height: 500px;
  153 + max-height:800px;
  154 + overflow: auto;
  155 +}
  156 +.clearDetail-title{
  157 + text-align: left;
  158 + font-size:16px;
  159 +}
  160 +.clearDetail-handlePer{
  161 + display: flex;
  162 + align-items: center;
  163 + justify-content: space-between;
  164 +}
  165 +.clearDetail-handlePer{
  166 + padding:10px 0;
  167 + color:#999999;
  168 +}
  169 +.editor{
  170 + text-align: left;
  171 +}
  172 +.tag-keyword-span{
  173 + padding:5px 10px;
  174 + background: #ecf5ff;
  175 + color:#1E9FFF;
  176 + margin:5px;
  177 + border-radius: 3px;
  178 +}
1 <div class="info-content"> 1 <div class="info-content">
2 <div class="info-content-body"> 2 <div class="info-content-body">
3 <div class="content-body-info"> 3 <div class="content-body-info">
4 - <div class="info-item-notice">通知信息:{{alarmInfo.alarmContent}}</div>  
5 - <div class="info-item-notice">通知人清单:{{alarmInfo.nickName}}</div>  
6 -  
7 - </div>  
8 - </div>  
9 -</div>  
10 -<div class="info-content">  
11 - <div class="info-content-body">  
12 - <div class="content-body-info">  
13 <div class="info-item-statistics"> 4 <div class="info-item-statistics">
14 统计信息:该告警历史上出现了{{statisticsData.alarmCnt?statisticsData.alarmCnt:0}}次 5 统计信息:该告警历史上出现了{{statisticsData.alarmCnt?statisticsData.alarmCnt:0}}次
15 <span v-if="statisticsData.alarmCnt">,平均持续时长{{statisticsData.continueTimeAvg?statisticsData.continueTimeAvg:0}}s, 6 <span v-if="statisticsData.alarmCnt">,平均持续时长{{statisticsData.continueTimeAvg?statisticsData.continueTimeAvg:0}}s,
@@ -6,10 +6,6 @@ export default { @@ -6,10 +6,6 @@ export default {
6 type: String, 6 type: String,
7 default: '' 7 default: ''
8 }, 8 },
9 - alarmInfo:{  
10 - type:Object,  
11 - default:{}  
12 - },  
13 //同类型告警处理审核部分是否显示 9 //同类型告警处理审核部分是否显示
14 isExamine: { 10 isExamine: {
15 type: Boolean, 11 type: Boolean,
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 <template #tools="{scope}" > 40 <template #tools="{scope}" >
41 <div class="apply-btn"> 41 <div class="apply-btn">
42 <el-button v-if="(scope.row.status==1 && scope.row.approver==loginName) || ((scope.row.status==0 || scope.row.status==3) && scope.row.managename==loginName) " @click="handle(scope.row)" size="mini">处理</el-button> 42 <el-button v-if="(scope.row.status==1 && scope.row.approver==loginName) || ((scope.row.status==0 || scope.row.status==3) && scope.row.managename==loginName) " @click="handle(scope.row)" size="mini">处理</el-button>
43 - <el-button v-if="(scope.row.status==1 && scope.row.managename==loginName) || scope.row.status==2 " @click="handle(scope.row)" size="mini">查看</el-button> 43 + <el-button v-if="(scope.row.status==1 && scope.row.managename==loginName) || scope.row.status==2 || (scope.row.status==3 && scope.row.approver==loginName)" @click="handle(scope.row)" size="mini">查看</el-button>
44 </div> 44 </div>
45 45
46 </template> 46 </template>
@@ -52,7 +52,7 @@ @@ -52,7 +52,7 @@
52 <!--新增编辑弹框--> 52 <!--新增编辑弹框-->
53 <cm-dialog :title="dialog.title" :showDialogVisible="dialog.show" @hidedialog="hideDialog" :showFooter="false"> 53 <cm-dialog :title="dialog.title" :showDialogVisible="dialog.show" @hidedialog="hideDialog" :showFooter="false">
54 <template v-slot> 54 <template v-slot>
55 - <alarmsClearEditor :isExamine="true" @saveback='saveback' :status="dialog.amStatus" :amId="dialog.amId" /> 55 + <alarmsClearEditor v-if="dialog.show" :isExamine="true" @saveback='saveback' :status="dialog.amStatus" :amId="dialog.amId" :alarmId="dialog.alarmId"/>
56 </template> 56 </template>
57 </cm-dialog> 57 </cm-dialog>
58 58
@@ -23,7 +23,8 @@ export default { @@ -23,7 +23,8 @@ export default {
23 title : "处理审批", 23 title : "处理审批",
24 show:false, 24 show:false,
25 amId : '', 25 amId : '',
26 - amStatus:0 26 + amStatus:0,
  27 + alarmId:'',
27 }); 28 });
28 29
29 //表格字段 30 //表格字段
@@ -116,6 +117,7 @@ export default { @@ -116,6 +117,7 @@ export default {
116 hideDialog(true); 117 hideDialog(true);
117 dialog.value.amId = row.id; 118 dialog.value.amId = row.id;
118 dialog.value.amStatus = row.status; 119 dialog.value.amStatus = row.status;
  120 + dialog.value.alarmId = row.alarmId;
119 } 121 }
120 //审核保存后关闭弹框 122 //审核保存后关闭弹框
121 let saveback=(val)=>{ 123 let saveback=(val)=>{
  1 +<div class="clearDetail-container">
  2 + <div class="clearDetail-title">消除原因:{{handleInfoObj.reason}}</div>
  3 + <div class="clearDetail-handlePer">
  4 + <div class="handlePer-left">
  5 + <span>处理人:{{handleInfoObj.managenameName}}</span>
  6 + </div>
  7 + <div>
  8 + <span>处理时间:{{handleInfoObj.managetime}}</span>
  9 + </div>
  10 + <div class="handlePer-left">
  11 + <span>审批人:{{handleInfoObj.approverName}}</span>
  12 + </div>
  13 + </div>
  14 + <div class="clearDetail-pcontent" v-html="handleInfoObj.pcontent">
  15 + 图文信息{{handleInfoObj.pcontent}}
  16 + </div>
  17 +</div>
  1 +export default {
  2 + name: 'alarmsClearEditorDetail',
  3 + template: '',
  4 + components: {
  5 +
  6 + },
  7 + props: {
  8 + isExamine: {
  9 + type: Boolean,
  10 + default: false
  11 + },
  12 + amId:{
  13 + type:String,
  14 + default: ''
  15 + }
  16 + },
  17 + setup(props, {attrs, slots, emit}) {
  18 + const {proxy} = Vue.getCurrentInstance();
  19 + let handleInfoObj=Vue.ref('');
  20 + let getDetail=()=>{
  21 + proxy.$http.get(`/api-web/bAlarmManage/getAlarmManageById`, {amId:props.amId}, function (res) {
  22 + if (res && res.code == 0) {
  23 + if(res.object){
  24 + handleInfoObj.value=res.object;
  25 +
  26 + }
  27 + }
  28 + })
  29 + }
  30 + // 挂载完
  31 + Vue.onMounted(() => {
  32 + getDetail();
  33 + })
  34 +
  35 +
  36 + return {
  37 + handleInfoObj,
  38 + getDetail,
  39 + }
  40 + }
  41 +
  42 +}
@@ -61,10 +61,19 @@ @@ -61,10 +61,19 @@
61 </div> 61 </div>
62 </div> 62 </div>
63 </div> 63 </div>
  64 + <div class="info-content">
  65 + <div class="info-content-body">
  66 + <div class="content-body-info">
  67 + <div class="info-item-notice">通知信息:{{alarmInfo.alarmContent}}</div>
  68 + <div class="info-item-notice">通知人清单:{{alarmInfo.nickName}}</div>
  69 +
  70 + </div>
  71 + </div>
  72 + </div>
64 <!--通知统计信息组件--> 73 <!--通知统计信息组件-->
65 - <cm-notice-statistics :alarmId="alarmId" :alarmInfo="alarmInfo" :isExamine="isExamine"></cm-notice-statistics> 74 + <cm-notice-statistics v-if="alarmIdVal" :alarmId="alarmIdVal" :isExamine="isExamine"></cm-notice-statistics>
66 </div> 75 </div>
67 - <div class="alarmsRadio" v-if="alarmInfo.alarmTypeCustom=='active' || status==0 || status==3"> 76 + <div class="alarmsRadio" v-if="alarmInfo.alarmTypeCustom=='active' || alarmInfo.alarmTypeCustom=='his' || status==0 || status==3">
68 <div class="alarmNotice-title">消除原因</div> 77 <div class="alarmNotice-title">消除原因</div>
69 <div class="alarmsNotice"> 78 <div class="alarmsNotice">
70 <div class="alarmsDes"><el-input v-model="reason" placeholder="消除原因" /></div> 79 <div class="alarmsDes"><el-input v-model="reason" placeholder="消除原因" /></div>
@@ -112,10 +121,11 @@ @@ -112,10 +121,11 @@
112 <i class="el-icon-edit-outline update-icon" v-if="!isExamine || status==0 || status==3" @click="showUserDialog(true)" ></i> 121 <i class="el-icon-edit-outline update-icon" v-if="!isExamine || status==0 || status==3" @click="showUserDialog(true)" ></i>
113 </span> 122 </span>
114 </span> 123 </span>
115 - <span class="title-handle-per" v-if="!isExamine || status==0 || status==3">时间:{{dateTime}}</span> 124 + <span class="title-handle-per" v-if="!isExamine || status==0">时间:{{dateTime}}</span>
  125 + <span class="title-handle-per" v-if="status==3">时间:{{handleInfoObj.managetime}}</span>
116 </div> 126 </div>
117 - <cm-wang-editor v-if="!isExamine || status==0 || status==3" v-model="detail" :repositoryInfo="repositoryInfo" :isDisabled="repositoryInto==1?true:false" :isClear="isClear" @change="change" @changetext="changetext"></cm-wang-editor>  
118 - <div class="editor_detail" v-if="isExamine && status!=0 && status!=3" > 127 + <cm-wang-editor v-if="!isExamine || status==0 || (status==3 && handleInfoObj.managename==loginName)" v-model="detail" :repositoryInfo="repositoryInfo" :isDisabled="repositoryInto==1?true:false" :isClear="isClear" @change="change" @changetext="changetext"></cm-wang-editor>
  128 + <div class="editor_detail" v-if="isExamine && status!=0 && (status==3 && approverName==loginName)" >
119 <div v-html="handleInfoObj.pcontent"></div> 129 <div v-html="handleInfoObj.pcontent"></div>
120 </div> 130 </div>
121 </div> 131 </div>
@@ -134,7 +144,10 @@ @@ -134,7 +144,10 @@
134 </div> 144 </div>
135 </div> 145 </div>
136 <div class="alarmsClearTag" v-if="repositoryInto && (!isExamine || status==0 || status==3) "> 146 <div class="alarmsClearTag" v-if="repositoryInto && (!isExamine || status==0 || status==3) ">
137 - <div class="tag-keyword"> 147 + <div class="tag-keyword" v-if="approverName==loginName">
  148 + 关键字:<span class="tag-keyword-span" v-for="tag in dynamicTags">{{tag}}</span>
  149 + </div>
  150 + <div class="tag-keyword" v-if="handleInfoObj.managename==loginName">
138 关键字: 151 关键字:
139 <el-tag 152 <el-tag
140 v-for="tag in dynamicTags" 153 v-for="tag in dynamicTags"
@@ -155,7 +168,7 @@ @@ -155,7 +168,7 @@
155 @keyup.enter="handleInputConfirm" 168 @keyup.enter="handleInputConfirm"
156 @blur="handleInputConfirm" 169 @blur="handleInputConfirm"
157 /> 170 />
158 - <el-button v-else class="button-new-tag ml-1" size="small" @click="showInput"> 171 + <el-button v-else class="button-new-tag ml-1" size="small" @click="showInput" >
159 + 添加 172 + 添加
160 </el-button> 173 </el-button>
161 </div> 174 </div>
@@ -172,13 +185,13 @@ @@ -172,13 +185,13 @@
172 </div> 185 </div>
173 <div class="alarmsClearEditor-btn"> 186 <div class="alarmsClearEditor-btn">
174 <el-button type="primary" @click="saveDetail(0)" v-if="!isExamine" size="small">存为草稿</el-button> 187 <el-button type="primary" @click="saveDetail(0)" v-if="!isExamine" size="small">存为草稿</el-button>
175 - <el-button type="primary" @click="saveDetail(1)" v-if="!isExamine || status==0 ||status==3" size="small">确认</el-button> 188 + <el-button type="primary" @click="saveDetail(1)" v-if="!isExamine || status==0 || (status==3 && handleInfoObj.managename==loginName)" size="small">确认</el-button>
176 {{amStatus}} 189 {{amStatus}}
177 <el-button type="primary" @click="saveDetail(2)" v-if="isExamine && status==1 && approverName==loginName" size="small">通过</el-button> 190 <el-button type="primary" @click="saveDetail(2)" v-if="isExamine && status==1 && approverName==loginName" size="small">通过</el-button>
178 <el-button type="primary" @click="saveDetail(3)" v-if="isExamine && status==1 && approverName==loginName" size="small">不通过</el-button> 191 <el-button type="primary" @click="saveDetail(3)" v-if="isExamine && status==1 && approverName==loginName" size="small">不通过</el-button>
179 <el-button @click="cancleBtn(0)" size="small">取消</el-button> 192 <el-button @click="cancleBtn(0)" size="small">取消</el-button>
180 </div> 193 </div>
181 - <cm-userright title="审批人(不支持多人,多选默认取第一个人)" :titles="titles" :showRole="false" :showGroup="false" :showDialogVisible="showUserDialogVisible" :selectedArr="userFileRight" :userArr="userList" :isUser="false" :showOrg="false" @callback="selectUser" 194 + <cm-userright title="审批人(不支持多人,多选默认取第一个人)" :titles="titles" :buttonTexts="buttonTexts" :showRole="false" :showGroup="false" :showDialogVisible="showUserDialogVisible" :selectedArr="userFileRight" :userArr="userList" :isUser="false" :showOrg="false" @callback="selectUser"
182 @hideDialog="showUserDialog"></cm-userright> 195 @hideDialog="showUserDialog"></cm-userright>
183 <!--关键字提取列表--> 196 <!--关键字提取列表-->
184 <cm-dialog :title="title" width="60%" :showDialogVisible="dialogVisible" :showFooter="true" @okfunc="okfunc" @hidedialog="closeDetail" :showOkBtn="true"> 197 <cm-dialog :title="title" width="60%" :showDialogVisible="dialogVisible" :showFooter="true" @okfunc="okfunc" @hidedialog="closeDetail" :showOkBtn="true">
@@ -15,6 +15,11 @@ export default { @@ -15,6 +15,11 @@ export default {
15 status:{ 15 status:{
16 type:Number, 16 type:Number,
17 default:1 17 default:1
  18 + },
  19 + //告警id
  20 + alarmId:{
  21 + type:String,
  22 + default:''
18 } 23 }
19 }, 24 },
20 data () { 25 data () {
@@ -29,7 +34,7 @@ export default { @@ -29,7 +34,7 @@ export default {
29 let detail=Vue.ref(''); 34 let detail=Vue.ref('');
30 let detailText=Vue.ref(''); 35 let detailText=Vue.ref('');
31 //统计信息及同类型告警的alarmId 36 //统计信息及同类型告警的alarmId
32 - let alarmId=props.amId?Vue.ref(props.amId):''; 37 + let alarmIdVal=Vue.ref('');
33 //审批人 38 //审批人
34 let approver=Vue.ref(''); 39 let approver=Vue.ref('');
35 let approverName=Vue.ref('admin'); 40 let approverName=Vue.ref('admin');
@@ -197,6 +202,7 @@ export default { @@ -197,6 +202,7 @@ export default {
197 } 202 }
198 // 审批人列表 203 // 审批人列表
199 let titles=['选择列表','已选择列表']; 204 let titles=['选择列表','已选择列表'];
  205 + let buttonTexts=['取消', '选择'];
200 let showUserDialogVisible = Vue.ref(false); 206 let showUserDialogVisible = Vue.ref(false);
201 let userFileRight = Vue.ref([]);//已选择的用户 207 let userFileRight = Vue.ref([]);//已选择的用户
202 //获取所有审批人 208 //获取所有审批人
@@ -256,7 +262,6 @@ export default { @@ -256,7 +262,6 @@ export default {
256 let userNames = userObj.user.map(function (v) { 262 let userNames = userObj.user.map(function (v) {
257 return v.nickname; 263 return v.nickname;
258 }); 264 });
259 - console.log("userIds",userObj)  
260 approverName.value=userIds[0]; 265 approverName.value=userIds[0];
261 approverLabel.value=userNames[0]; 266 approverLabel.value=userNames[0];
262 267
@@ -284,10 +289,24 @@ export default { @@ -284,10 +289,24 @@ export default {
284 }else{ 289 }else{
285 // getAlarmStatis(); 290 // getAlarmStatis();
286 } 291 }
  292 + alarmIdVal.value=props.alarmId;
287 getAlarmStatis(); 293 getAlarmStatis();
288 // } 294 // }
289 }else { 295 }else {
290 - alarmInfo.value=proxy.$route.query; 296 + let urlObj=proxy.$route.query;
  297 + if(urlObj){
  298 + for(let key in urlObj){
  299 + urlObj[key]=decodeURIComponent(urlObj[key])
  300 + }
  301 + }
  302 + alarmInfo.value=urlObj;
  303 + if(alarmInfo.value.alarmTypeCustom=='his'){
  304 + let str=alarmInfo.value.alarmContent;
  305 + let startIndex=str.indexOf("消除原因");
  306 + let endIndex=str.indexOf(",消除内容");
  307 + reason.value=str.substring(startIndex+5,endIndex);
  308 + }
  309 + alarmIdVal.value=alarmInfo.value.primaryKey;
291 getUser(); 310 getUser();
292 } 311 }
293 getUserByToken(); 312 getUserByToken();
@@ -403,9 +422,6 @@ export default { @@ -403,9 +422,6 @@ export default {
403 let data=res.object; 422 let data=res.object;
404 if(data){ 423 if(data){
405 alarmInfo.value=data; 424 alarmInfo.value=data;
406 - if(alarmInfo.value.id){  
407 - alarmId.value=alarmInfo.value.id;  
408 - }  
409 if( alarmInfo.value.approver){ 425 if( alarmInfo.value.approver){
410 approverName.value=alarmInfo.value.approver; 426 approverName.value=alarmInfo.value.approver;
411 userList.value.map(item=>{ 427 userList.value.map(item=>{
@@ -448,9 +464,9 @@ export default { @@ -448,9 +464,9 @@ export default {
448 options,inputValue,dynamicTags,inputVisible,handleClose,showInput,handleInputConfirm, 464 options,inputValue,dynamicTags,inputVisible,handleClose,showInput,handleInputConfirm,
449 getKeyword, timer,dateTime,getDateTime,timeFormat, 465 getKeyword, timer,dateTime,getDateTime,timeFormat,
450 title, dialogVisible, height, dataList, columns, closeDetail,okfunc, getPage,selectionChange,dynamicTagsAppend, 466 title, dialogVisible, height, dataList, columns, closeDetail,okfunc, getPage,selectionChange,dynamicTagsAppend,
451 - showUserDialog,showUserDialogVisible,userFileRight,userList,selectUser,getUserList,titles, 467 + showUserDialog,showUserDialogVisible,userFileRight,userList,selectUser,getUserList,titles,buttonTexts,
452 getAlarmInfo,alarmInfo,cascaderValue,propsTrigger,handleChange,cascaderOptions,noticeFlag, 468 getAlarmInfo,alarmInfo,cascaderValue,propsTrigger,handleChange,cascaderOptions,noticeFlag,
453 - getUserByToken,getUser,cancleBtn,repositoryInfo,repositoryId,opinion,getAlarmStatis,handleInfoObj,alarmId 469 + getUserByToken,getUser,cancleBtn,repositoryInfo,repositoryId,opinion,getAlarmStatis,handleInfoObj,alarmIdVal
454 } 470 }
455 } 471 }
456 472
@@ -31,7 +31,8 @@ @@ -31,7 +31,8 @@
31 <template #tools="{scope}"> 31 <template #tools="{scope}">
32 <div class="list-handle"> 32 <div class="list-handle">
33 <span class="icon-bg"> 33 <span class="icon-bg">
34 - <i class="el-icon-delete" title="处理" @click="handleDelete(scope.row)"></i> 34 +<!-- <i class="el-icon-delete" title="处理" @click="handleDelete(scope.row)"></i>-->
  35 + <i class="el-icon-view" title="查看" @click="handleView(scope.row)"></i>
35 </span> 36 </span>
36 </div> 37 </div>
37 </template> 38 </template>
@@ -43,7 +44,7 @@ @@ -43,7 +44,7 @@
43 <!--弹框--> 44 <!--弹框-->
44 <cm-dialog :title="dialog.title" width="40%" :showDialogVisible="dialog.show" @hidedialog="hideDialog" :showFooter="false"> 45 <cm-dialog :title="dialog.title" width="40%" :showDialogVisible="dialog.show" @hidedialog="hideDialog" :showFooter="false">
45 <template v-slot> 46 <template v-slot>
46 - <alarmsClearEditor :isExamine=true :amId="dialog.adId" /> 47 + <clearDetail :isExamine=true :amId="dialog.amId" />
47 </template> 48 </template>
48 </cm-dialog> 49 </cm-dialog>
49 50
@@ -5,8 +5,8 @@ export default { @@ -5,8 +5,8 @@ export default {
5 'resNameComponents': Vue.defineAsyncComponent( 5 'resNameComponents': Vue.defineAsyncComponent(
6 () => myImport('components/page/res/resNameComponents/index') 6 () => myImport('components/page/res/resNameComponents/index')
7 ), 7 ),
8 - 'alarmsClearEditor': Vue.defineAsyncComponent(  
9 - () => myImport('views/alarmsClearEditor/index') 8 + 'clearDetail': Vue.defineAsyncComponent(
  9 + () => myImport('views/alarmsClearEditor/clearDetail/index')
10 ) 10 )
11 }, 11 },
12 props: [], 12 props: [],
@@ -20,7 +20,7 @@ export default { @@ -20,7 +20,7 @@ export default {
20 limit: 10, 20 limit: 10,
21 }); 21 });
22 let dialog = Vue.ref({ 22 let dialog = Vue.ref({
23 - title : "处理审批", 23 + title : "审批详情",
24 show:false, 24 show:false,
25 amId : '' 25 amId : ''
26 }); 26 });
@@ -116,10 +116,13 @@ export default { @@ -116,10 +116,13 @@ export default {
116 // 处理弹框 116 // 处理弹框
117 let handle = (row) =>{ 117 let handle = (row) =>{
118 hideDialog(true); 118 hideDialog(true);
119 - dialog.value.amId = row.amId; 119 + dialog.value.amId = row.amid;
120 } 120 }
121 121
122 - 122 + //查看详情
  123 + let handleView = (row) =>{
  124 + handle(row);
  125 + }
123 // 挂载完 126 // 挂载完
124 Vue.onMounted(() => { 127 Vue.onMounted(() => {
125 getDataList(); 128 getDataList();
@@ -134,7 +137,8 @@ export default { @@ -134,7 +137,8 @@ export default {
134 handle, 137 handle,
135 loaddata, 138 loaddata,
136 tableData, 139 tableData,
137 - getDataList 140 + getDataList,
  141 + handleView
138 } 142 }
139 } 143 }
140 144
@@ -257,7 +257,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -257,7 +257,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
257 code: 'knFlag' 257 code: 'knFlag'
258 }, 258 },
259 done: function (data) { 259 done: function (data) {
260 - console.log("knFlag",data)  
261 let knFlag=data.object.value; 260 let knFlag=data.object.value;
262 if(knFlag == '1'){ 261 if(knFlag == '1'){
263 //开启闭环 262 //开启闭环
@@ -270,10 +269,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -270,10 +269,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
270 return; 269 return;
271 } 270 }
272 let params=paramsData[0]; 271 let params=paramsData[0];
273 - console.log("params",params)  
274 for(let key in params){ 272 for(let key in params){
275 if(params[key]){ 273 if(params[key]){
276 - urlParams+=key+'='+params[key]+'&' 274 + let str=params[key];
  275 + if(typeof str=='string'){
  276 + str= str.replace(/%/g, '%25');
  277 + }
  278 + urlParams+=key+'='+encodeURIComponent(str)+'&'
277 } 279 }
278 } 280 }
279 urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=active'; 281 urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=active';
@@ -1031,8 +1031,23 @@ layui.define(['tree', 'laypage', 'laytpl', 'admin', 'form', 'table', 'commonCols @@ -1031,8 +1031,23 @@ layui.define(['tree', 'laypage', 'laytpl', 'admin', 'form', 'table', 'commonCols
1031 //绑定鼠标移入移出事件 1031 //绑定鼠标移入移出事件
1032 $('table tr').hover(function (obj) { 1032 $('table tr').hover(function (obj) {
1033 $(obj.currentTarget).find('.reslist-view-topo').removeClass('hide'); 1033 $(obj.currentTarget).find('.reslist-view-topo').removeClass('hide');
  1034 + // Start 资源视图中的资源名称在表格中溢出时给最大宽度限制-更改单元格溢出时的tip跑到左上角 LSQ 2022/1/6
  1035 + var w=$(obj.currentTarget).find('#res-div span').innerWidth();
  1036 + var spanMaxW=parseInt($(obj.currentTarget).find('#res-div span').css('max-width'));
  1037 + //-20是一个图标的宽度,若要增加图标,这里的20需要增加
  1038 + var maxW=(w-20)+'px';
  1039 + if(w+15>=spanMaxW){
  1040 + $(obj.currentTarget).find('#res-div span').css('max-width',maxW)
  1041 + }
1034 }, function (obj) { 1042 }, function (obj) {
1035 $(obj.currentTarget).find('.reslist-view-topo').addClass('hide'); 1043 $(obj.currentTarget).find('.reslist-view-topo').addClass('hide');
  1044 + var w=$(obj.currentTarget).find('#res-div span').innerWidth();
  1045 + var spanMaxW=parseInt($(obj.currentTarget).find('#res-div span').css('max-width'));
  1046 + var maxW=(w+20)+'px';
  1047 + if(w+15>=spanMaxW){
  1048 + $(obj.currentTarget).find('#res-div span').css('max-width',maxW)
  1049 + }
  1050 + //End LSQ 2022/1/6
1036 }) 1051 })
1037 1052
1038 // 加入/移出收藏夹 1053 // 加入/移出收藏夹
@@ -21,7 +21,26 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -21,7 +21,26 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
21 var bizId='';//业务Id 21 var bizId='';//业务Id
22 var busIdSelect; 22 var busIdSelect;
23 var busTypeList = []; 23 var busTypeList = [];
24 - 24 + //获取知识库开启状态
  25 + var knFlag=0;
  26 + var minWidthHandle=100;
  27 + function getSysConfCode(){
  28 + admin.req({
  29 + url: common.domainName + '/api-user/sysConf/getByCode',
  30 + type: "get",
  31 + data: {
  32 + code: 'knFlag'
  33 + },
  34 + done: function (data) {
  35 + knFlag = data.object.value;
  36 + if (knFlag == '1') {
  37 + //开启闭环
  38 + minWidthHandle=150;
  39 + }
  40 + }
  41 + })
  42 + }
  43 + getSysConfCode();
25 if (alarmNo) { 44 if (alarmNo) {
26 $("#historywarningkw").val(alarmNo); 45 $("#historywarningkw").val(alarmNo);
27 } 46 }
@@ -229,7 +248,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -229,7 +248,6 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
229 }) 248 })
230 }); 249 });
231 } 250 }
232 -  
233 //渲染表格 251 //渲染表格
234 var historywarningTable; 252 var historywarningTable;
235 //获取配置的列 253 //获取配置的列
@@ -242,6 +260,7 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -242,6 +260,7 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
242 if (retCols) { 260 if (retCols) {
243 cols = retCols; 261 cols = retCols;
244 } else { 262 } else {
  263 +
245 cols = [ 264 cols = [
246 {type: 'checkbox', fixed: 'left'} 265 {type: 'checkbox', fixed: 'left'}
247 , { 266 , {
@@ -281,8 +300,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -281,8 +300,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
281 , {field: 'alarmTime', title: '首次告警时间', align: 'center', minWidth: 180, sort: true} 300 , {field: 'alarmTime', title: '首次告警时间', align: 'center', minWidth: 180, sort: true}
282 , {field: 'durationStr', title: '持续时间', align: 'center', width: 190} 301 , {field: 'durationStr', title: '持续时间', align: 'center', width: 190}
283 , { 302 , {
284 - title: '操作', align: 'center', minWidth: 100,  
285 - templet: '<div><!--<span history-data-warn-clear="{{d.id}}" class="layui-table-link">消除</span>--> <span history-data-warn-view="{{d.id}}" class="layui-table-link">查看</span> <span history-data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span></div>' 303 + title: '操作', align: 'center', minWidth: minWidthHandle,
  304 + templet: `<div>
  305 +
  306 + <span history-data-warn-clear="{{d.id}}" class="layui-table-link">补录</span>
  307 + <span history-data-warn-view="{{d.id}}" class="layui-table-link">查看</span>
  308 + <span history-data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span>
  309 + </div>`
286 } 310 }
287 ]; 311 ];
288 } 312 }
@@ -355,41 +379,48 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -355,41 +379,48 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
355 }); 379 });
356 } 380 }
357 //start lsq 历史告警消除 2022-03-23 381 //start lsq 历史告警消除 2022-03-23
358 - $('[history-data-warn-clear]').unbind("click").on('click', function () {  
359 - // Start 将对象转成key=value&key1=value1 LSQ 2022/03/22  
360 - let urlParams='';  
361 - // let paramsData=table.checkStatus('historywarningTable').data;  
362 - let paramsData= [];  
363 -  
364 - if(resArr){  
365 - resArr.map(item=>{  
366 - if(item.id==$(this).attr('history-data-warn-clear')){  
367 - paramsData.push(item);  
368 - }  
369 - })  
370 - }  
371 - let params=paramsData[0];  
372 - console.log("params",params)  
373 - for(let key in params){  
374 - if(params[key]){  
375 - urlParams+=key+'='+params[key]+'&' 382 + if(knFlag=='1'){
  383 + $('[history-data-warn-clear]').show();
  384 + $('[history-data-warn-clear]').unbind("click").on('click', function () {
  385 + // Start 将对象转成key=value&key1=value1 LSQ 2022/03/22
  386 + let urlParams='';
  387 + // let paramsData=table.checkStatus('historywarningTable').data;
  388 + let paramsData= [];
  389 +
  390 + if(resArr){
  391 + resArr.map(item=>{
  392 + if(item.id==$(this).attr('history-data-warn-clear')){
  393 + paramsData.push(item);
  394 + }
  395 + })
376 } 396 }
377 - }  
378 - urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=his';  
379 - layer.open({  
380 - title: ['告警消除', 'font-size:18px;'],  
381 - type: 2,  
382 - area: ['80%', '90%'],  
383 - shadeClose: true,//开启遮罩层  
384 - id: 'alarms_clear_id',  
385 - // content: laytpl(res.body).render(JSON.stringify(params)),  
386 - content: ['/vue3/index.html#/alarmsClearEditor?'+urlParams, 'no'],  
387 - cancel: function () {  
388 - clearTimeout(); 397 + let params=paramsData[0];
  398 + for(let key in params){
  399 + if(params[key]){
  400 + let str=params[key];
  401 + if(typeof str=='string'){
  402 + str= str.replace(/%/g, '%25');
  403 + }
  404 + urlParams+=key+'='+encodeURIComponent(str)+'&'
  405 + }
389 } 406 }
390 - });  
391 - })  
392 - 407 + urlParams=urlParams.substr(0,urlParams.length-1)+'&alarmTypeCustom=his';
  408 + layer.open({
  409 + title: ['告警消除', 'font-size:18px;'],
  410 + type: 2,
  411 + area: ['80%', '90%'],
  412 + shadeClose: true,//开启遮罩层
  413 + id: 'alarms_clear_id',
  414 + // content: laytpl(res.body).render(JSON.stringify(params)),
  415 + content: ['/vue3/index.html#/alarmsClearEditor?'+urlParams, 'no'],
  416 + cancel: function () {
  417 + clearTimeout();
  418 + }
  419 + });
  420 + })
  421 + }else{
  422 + $('[history-data-warn-clear]').hide();
  423 + }
393 //end lsq 2022-03-23 424 //end lsq 2022-03-23
394 //告警操作日志 425 //告警操作日志
395 $('[history-data-warn-view]').unbind("click").on('click', function () { 426 $('[history-data-warn-view]').unbind("click").on('click', function () {
@@ -596,6 +596,9 @@ @@ -596,6 +596,9 @@
596 596
597 }else if(urlLast=="#/biz/index"){ 597 }else if(urlLast=="#/biz/index"){
598 w=$("[lay-id='bizListTable'] table thead th[data-field='resName'").data('minwidth'); 598 w=$("[lay-id='bizListTable'] table thead th[data-field='resName'").data('minwidth');
  599 + }else if(urlLast.indexOf("#/biz/list")!=-1){
  600 + w=$("[lay-id='bizResListTable'] table thead th[data-field='resName'").data('minwidth');
  601 + w=w?w:$("[lay-id='bizResListTable'] table thead th[data-field='resName'").innerWidth();
599 } 602 }
600 var maxW=(w-45)+'px'; 603 var maxW=(w-45)+'px';
601 var styleW="float: left;max-width: "+maxW+";overflow: hidden; text-overflow: ellipsis; white-space: nowrap;display: inline-block;"; 604 var styleW="float: left;max-width: "+maxW+";overflow: hidden; text-overflow: ellipsis; white-space: nowrap;display: inline-block;";
@@ -728,7 +731,7 @@ @@ -728,7 +731,7 @@
728 {{# 731 {{#
729 var linkStateHtml = ''; 732 var linkStateHtml = '';
730 var linkStateTips = '无连接信息'; 733 var linkStateTips = '无连接信息';
731 - if(d.linkStateList && d.linkStateList.length >=0 ) { 734 + if(d.linkStateList && d.linkStateList.length >=0 && d.resType !== 'MIDDLEWARE_WEBLOGIC') {
732 linkStateTips = ''; 735 linkStateTips = '';
733 if(d.linkStateList.length == 1) { 736 if(d.linkStateList.length == 1) {
734 var linkState = d.linkStateList[0]; 737 var linkState = d.linkStateList[0];
@@ -779,6 +782,21 @@ @@ -779,6 +782,21 @@
779 linkStateTips += '</ul>'; 782 linkStateTips += '</ul>';
780 } 783 }
781 } 784 }
  785 + }else{
  786 + /*对于中间件weblogic来讲,只有控制台有连接状态指标,服务的连接状态是服务对应的服务状态指标,此列表中只展示所有weblogic的服务信息,所以这里直接取视图中的monitorState字段作为连接状态*/
  787 + linkStateTips='连接成功';
  788 + if(d.linkState.indexOf('成功') !== -1) {
  789 + linkStateHtml = '<button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">成功</button>';
  790 + } else {
  791 + linkStateHtml = `<button type="button"
  792 + id="${d.resId}_bizdanger"
  793 + data-message="${d.message}"
  794 + data-state="${d.state}"
  795 + data-id="${d.resId}_bizdanger"
  796 + class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  797 + 失败
  798 + </button>`;
  799 + }
782 } 800 }
783 }} 801 }}
784 <div class="div-link-state-list" lay-tips="{{linkStateTips}}"> 802 <div class="div-link-state-list" lay-tips="{{linkStateTips}}">