Authored by kstsixeam

Merge branch 'master' of http://hgroup:82/monitor_v3/hg-monitor-web into master-huijiaxu

 Conflicts:
	hg-monitor-web-zj/src/main/resources/application.yml
Showing 38 changed files with 3892 additions and 130 deletions

Too many changes to show.

To preserve performance only 38 of 38+ files are displayed.

  1 +文档管理组件
  2 +1、预览模式 浏览器参数docId(不展示左侧树)
  1 +表格组件,组件参数:
  2 +// 展示分页
  3 +showPage: {
  4 + type: Boolean,
  5 + default: true
  6 +},
  7 +showBorder: {
  8 + type: Boolean,
  9 + default: true
  10 +},
  11 +// 高度
  12 +height: {
  13 + type: Number,
  14 + default: window.innerHeight
  15 +},
  16 +// 展示下标
  17 +showIndex: {
  18 + type: Boolean,
  19 + default: true
  20 +},
  21 +indexLabel: {
  22 + type: String,
  23 + default: '序号'
  24 +},
  25 +currentPage: {
  26 + type: Number,
  27 + default: 1
  28 +},
  29 +// 分页页码设置
  30 +pageSizes: {
  31 + type: Array,
  32 + default: [50,100, 200, 300, 400]
  33 +},
  34 +// 默认展示
  35 +pageSize: {
  36 + type: Number,
  37 + default: 100
  38 +},
  39 +// 总数
  40 +total: {
  41 + type: Number,
  42 + default: 0
  43 +},
  44 +// 展示组件
  45 +layout: {
  46 + type: String,
  47 + default: "total, sizes, prev, pager, next, jumper"
  48 +},
  49 +// 列
  50 +columns: {
  51 + type: Array,
  52 + default: []
  53 +},
  54 +// 数据
  55 +dataList: {
  56 + type: Array,
  57 + default: []
  58 +},
  59 +// 加载
  60 +loading:{
  61 + type: Boolean,
  62 + default: false
  63 +},
  64 +--------------------------------------------------------------------
  65 +columns参数说明:
  66 +// 单元绑定数据key
  67 +prop: 'fileName',
  68 +// 表头展示名称
  69 +label: '文档名称',
  70 +sortable:true,
  71 +// 对其方式 left center right
  72 +align:'left',
  73 +click:function (row) {
  74 + // 单元格点击出发的函数 row,当前行的数据
  75 +},
  76 +render:function (row){
  77 + // 表格个性化展示,返回html
  78 + return html;
  79 +}
@@ -671,7 +671,7 @@ layui.define(['xmSelect', 'md5'], function (exports) { @@ -671,7 +671,7 @@ layui.define(['xmSelect', 'md5'], function (exports) {
671 resType = 'X86SERVER_BMC'; 671 resType = 'X86SERVER_BMC';
672 } 672 }
673 //如果是HOST_X86SERVER服务器并且协议为snmp,或共享存储则根据厂商和型号判断类型 673 //如果是HOST_X86SERVER服务器并且协议为snmp,或共享存储则根据厂商和型号判断类型
674 - if (resType.indexOf("HOST_X86SERVER") !== -1 || resType.indexOf("STORAGE_SHARE") != -1) { 674 + if ((resType.indexOf("HOST_X86SERVER") !== -1 && protocol =='SNMP') || resType.indexOf("STORAGE_SHARE") != -1) {
675 resType = this.detailPathByProviderAndModel(resType,resId); 675 resType = this.detailPathByProviderAndModel(resType,resId);
676 } 676 }
677 //如果是虚拟化相关资源类型,则根据采集协议判断去那个页面 677 //如果是虚拟化相关资源类型,则根据采集协议判断去那个页面
@@ -2517,6 +2517,58 @@ layui.define(['soulTable', 'commonDetail', 'common', 'laytpl', 'view', 'admin', @@ -2517,6 +2517,58 @@ layui.define(['soulTable', 'commonDetail', 'common', 'laytpl', 'view', 'admin',
2517 {field: 'lastColTime', title: '最近采集时间', minWidth: x_170, align: 'center', sort: true}, 2517 {field: 'lastColTime', title: '最近采集时间', minWidth: x_170, align: 'center', sort: true},
2518 {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_120, templet: '#linkStateTpl', sort: true} 2518 {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_120, templet: '#linkStateTpl', sort: true}
2519 ], 2519 ],
  2520 + "HUAWEI_CLOUD_PLAT":[
  2521 + {field: 'ip', title: 'IP地址', minWidth: x_130, align: 'center', sort: true},
  2522 + {
  2523 + field: 'resName', title: '资源名称', minWidth: x_300, sort: true,
  2524 + templet: '#resindex_resName'
  2525 + },
  2526 + {field: 'health', title: '健康状态', minWidth: x_110, align: 'center', sort: true, templet: '#healthTpl'},
  2527 + // {field: 'diskSize', title: '磁盘总大小', minWidth: 120, align: 'center'},
  2528 + {field: 'fileSysUseRate', title: '文件系统使用率(最大)', align: 'center', minWidth: x_185, templet: '#fileUseRateTpl', sort: true},
  2529 + {field: 'diskBusyRate', title: '磁盘繁忙率(最大)', minWidth: x_160, align: 'center', sort: true, templet: '<div>{{d.diskBusyRate}}%</div>'},
  2530 + {field: 'cpuCores', title: '单个CPU核数', align: 'center', minWidth: x_140, sort: true, templet: '#cpuCoresTpl'},
  2531 + {field: 'cpuNum', title: '主机CPU总核数', align: 'center', minWidth: x_150, sort: true, templet: '#cpuNumTpl'},
  2532 + {field: 'cpuRate', title: 'CPU使用率', align: 'center', minWidth: x_120, templet: '#cpuRateTpl', sort: true},
  2533 + {field: 'memorySize', title: '内存大小', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.memorySize}} GB</div>'},
  2534 + {field: 'cacheUsed', title: '缓存总大小', align: 'center', minWidth: x_120, sort: true, templet: '<div>{{d.cacheUsed}} GB</div>'},
  2535 + {field: 'memoryRate', title: '内存使用率', align: 'center', minWidth: x_120, templet: '#memoryRateTpl', sort: true},
  2536 + {field: 'vmmemoryUseRate', title: '虚拟内存使用率', align: 'center', minWidth: x_165, templet: '#vmmemoryRateTpl', sort: true},
  2537 + {field: 'maxNetCardUpRate', title: '上行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardUpRate}} kb/s</div>'},
  2538 + {field: 'maxNetCardDownRate', title: '下行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardDownRate}} kb/s</div>'},
  2539 + {field: 'lastColTime', title: '最近采集时间', minWidth: x_160, align: 'center', sort: true},
  2540 + {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_110, templet: '#linkStateTpl', sort: true},
  2541 + {field: 'adminName', title: '负责人', minWidth: x_120, align: 'center', sort: true},
  2542 + {field: 'adminPhone', title: '负责人电话', minWidth: x_130, align: 'center', sort: true},
  2543 + {field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'},
  2544 + {field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'}
  2545 + ],
  2546 + "ALI_CLOUD_PLAT":[
  2547 + {field: 'ip', title: 'IP地址', minWidth: x_130, align: 'center', sort: true},
  2548 + {
  2549 + field: 'resName', title: '资源名称', minWidth: x_300, sort: true,
  2550 + templet: '#resindex_resName'
  2551 + },
  2552 + {field: 'health', title: '健康状态', minWidth: x_110, align: 'center', sort: true, templet: '#healthTpl'},
  2553 + // {field: 'diskSize', title: '磁盘总大小', minWidth: 120, align: 'center'},
  2554 + {field: 'fileSysUseRate', title: '文件系统使用率(最大)', align: 'center', minWidth: x_185, templet: '#fileUseRateTpl', sort: true},
  2555 + {field: 'diskBusyRate', title: '磁盘繁忙率(最大)', minWidth: x_160, align: 'center', sort: true, templet: '<div>{{d.diskBusyRate}}%</div>'},
  2556 + {field: 'cpuCores', title: '单个CPU核数', align: 'center', minWidth: x_140, sort: true, templet: '#cpuCoresTpl'},
  2557 + {field: 'cpuNum', title: '主机CPU总核数', align: 'center', minWidth: x_150, sort: true, templet: '#cpuNumTpl'},
  2558 + {field: 'cpuRate', title: 'CPU使用率', align: 'center', minWidth: x_120, templet: '#cpuRateTpl', sort: true},
  2559 + {field: 'memorySize', title: '内存大小', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.memorySize}} GB</div>'},
  2560 + {field: 'cacheUsed', title: '缓存总大小', align: 'center', minWidth: x_120, sort: true, templet: '<div>{{d.cacheUsed}} GB</div>'},
  2561 + {field: 'memoryRate', title: '内存使用率', align: 'center', minWidth: x_120, templet: '#memoryRateTpl', sort: true},
  2562 + {field: 'vmmemoryUseRate', title: '虚拟内存使用率', align: 'center', minWidth: x_165, templet: '#vmmemoryRateTpl', sort: true},
  2563 + {field: 'maxNetCardUpRate', title: '上行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardUpRate}} kb/s</div>'},
  2564 + {field: 'maxNetCardDownRate', title: '下行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardDownRate}} kb/s</div>'},
  2565 + {field: 'lastColTime', title: '最近采集时间', minWidth: x_160, align: 'center', sort: true},
  2566 + {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_110, templet: '#linkStateTpl', sort: true},
  2567 + {field: 'adminName', title: '负责人', minWidth: x_120, align: 'center', sort: true},
  2568 + {field: 'adminPhone', title: '负责人电话', minWidth: x_130, align: 'center', sort: true},
  2569 + {field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'},
  2570 + {field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'}
  2571 + ],
2520 }, 2572 },
2521 //列点击事件 2573 //列点击事件
2522 colsClickEvent: function (editFlag) { 2574 colsClickEvent: function (editFlag) {
1 <el-dialog :top="top" :title="title" v-model="show" custom-class="config-dialog" 1 <el-dialog :top="top" :title="title" v-model="show" custom-class="config-dialog"
2 - :fullscreen="fullscreen" :show-close="showFooter" 2 + :fullscreen="fullscreen" :show-close="showFooter" @close="hideElDialog"
3 :width="width" destroy-on-close @before-close="hideElDialog" :close-on-click-modal="false" :close-on-press-escape="false"> 3 :width="width" destroy-on-close @before-close="hideElDialog" :close-on-click-modal="false" :close-on-press-escape="false">
4 <slot>弹框内容</slot> 4 <slot>弹框内容</slot>
5 5
6 <template #footer v-if="showFooter"> 6 <template #footer v-if="showFooter">
7 <span class="dialog-footer"> 7 <span class="dialog-footer">
8 - <el-button @click="hideElDialog">{{cancelText}}</el-button>  
9 - <el-button type="primary" @click="okFunc">{{okText}}</el-button> 8 + <el-button @click="hideElDialog" v-if="showCancelBtn">{{cancelText}}</el-button>
  9 + <el-button type="primary" @click="okFunc" v-if="showOkBtn">{{okText}}</el-button>
10 </span> 10 </span>
11 </template> 11 </template>
12 </el-dialog> 12 </el-dialog>
@@ -15,11 +15,21 @@ export default { @@ -15,11 +15,21 @@ export default {
15 type: String, 15 type: String,
16 default: "新建" 16 default: "新建"
17 }, 17 },
  18 + // 展示取消按钮
  19 + showCancelBtn: {
  20 + type: Boolean,
  21 + default: true
  22 + },
18 // 取消文本 23 // 取消文本
19 cancelText: { 24 cancelText: {
20 type: String, 25 type: String,
21 default: "取消" 26 default: "取消"
22 }, 27 },
  28 + // 展示确定按钮
  29 + showOkBtn: {
  30 + type: Boolean,
  31 + default: true
  32 + },
23 // 确定文本 33 // 确定文本
24 okText: { 34 okText: {
25 type: String, 35 type: String,
@@ -6,9 +6,9 @@ @@ -6,9 +6,9 @@
6 <div style="text-align: left;padding-left: 10px;padding-top: 3px;font-weight: bold"> 6 <div style="text-align: left;padding-left: 10px;padding-top: 3px;font-weight: bold">
7 <el-link type="info" :underline="false"><i class="iconfont icon-ziliaoku"></i> 文档管理</el-link> 7 <el-link type="info" :underline="false"><i class="iconfont icon-ziliaoku"></i> 文档管理</el-link>
8 </div> 8 </div>
  9 + <!---->
9 <el-tree ref="tree" style="padding:6px;" :props="props" :data="treeData" node-key="id" 10 <el-tree ref="tree" style="padding:6px;" :props="props" :data="treeData" node-key="id"
10 - :expand-on-click-node="false" :expand-on-click-node="true"  
11 - :default-expanded-keys="[defaultKeys]" > 11 + :expand-on-click-node="false" :expand-on-click-node="true" :default-expanded-keys="defaultExpandedKeys">
12 <template #default="{ node, data }"> 12 <template #default="{ node, data }">
13 <div style="display: flex;flex-direction: row;width: 100%;"> 13 <div style="display: flex;flex-direction: row;width: 100%;">
14 <div style="width: calc(100% - 85px);max-width: calc(100% - 85px);overflow: hidden;text-overflow: ellipsis;text-align: left;" @click="nodeClick(node, data)" :title="node.label"> 14 <div style="width: calc(100% - 85px);max-width: calc(100% - 85px);overflow: hidden;text-overflow: ellipsis;text-align: left;" @click="nodeClick(node, data)" :title="node.label">
@@ -35,11 +35,11 @@ @@ -35,11 +35,11 @@
35 <el-input v-model="keyWord" placeholder="请输入关键字" :size="$global.elementSize" 35 <el-input v-model="keyWord" placeholder="请输入关键字" :size="$global.elementSize"
36 style="width: 220px;margin-right:10px" clearable/> 36 style="width: 220px;margin-right:10px" clearable/>
37 <el-button icon="el-icon-search" :size="$global.elementSize" @click="searchFile">搜索</el-button> 37 <el-button icon="el-icon-search" :size="$global.elementSize" @click="searchFile">搜索</el-button>
38 - <el-button :size="$global.elementSize" @click="showUserDialog(true)"> 38 + <el-button :size="$global.elementSize" @click="showUserDialog(true)" v-if="!isView">
39 <i class="iconfont icon-icon--quanxian"></i> 39 <i class="iconfont icon-icon--quanxian"></i>
40 授权 40 授权
41 </el-button> 41 </el-button>
42 - <el-button :size="$global.elementSize" @click="uploadFile"> 42 + <el-button :size="$global.elementSize" @click="downloadFile">
43 <i class="iconfont icon-icon--download"></i> 43 <i class="iconfont icon-icon--download"></i>
44 下载 44 下载
45 </el-button> 45 </el-button>
@@ -47,6 +47,10 @@ @@ -47,6 +47,10 @@
47 <i class="iconfont icon-icon--shangchuan"></i> 47 <i class="iconfont icon-icon--shangchuan"></i>
48 上传 48 上传
49 </el-button> 49 </el-button>
  50 + <el-button type="danger" :size="$global.elementSize" @click="deleteDocument('','file')">
  51 + <i class="iconfont icon-shanchuwenjianjia"></i>
  52 + 删除
  53 + </el-button>
50 </div> 54 </div>
51 <div style="text-align: right;width: 150px"> 55 <div style="text-align: right;width: 150px">
52 <el-button-group> 56 <el-button-group>
@@ -130,5 +134,7 @@ @@ -130,5 +134,7 @@
130 <cm-userright :showDialogVisible="showUserDialogVisible" :users="userFileRight.usernames" @callback="selectUser" 134 <cm-userright :showDialogVisible="showUserDialogVisible" :users="userFileRight.usernames" @callback="selectUser"
131 @hideDialog="showUserDialog"></cm-userright> 135 @hideDialog="showUserDialog"></cm-userright>
132 136
133 - <cm-upload :showDialogVisible="showUploadDialogVisible" @callback="uploadCallBack" @hideDialog="showUploadFile(false)"></cm-upload> 137 + <cm-upload :showDialogVisible="showUploadDialogVisible" @callback="uploadCallBack" @hideDialog="showUploadFile"
  138 + :type="currentNodeData.docType" :docNo="currentNodeData.docNo"
  139 + :category="currentNodeData.id"></cm-upload>
134 </div> 140 </div>
@@ -5,7 +5,30 @@ export default { @@ -5,7 +5,30 @@ export default {
5 name: 'DocumentIndex', 5 name: 'DocumentIndex',
6 template: '', 6 template: '',
7 components: {}, 7 components: {},
8 - props: {}, 8 + props: {
  9 + // 展示文档类型,默认展示类型
  10 + types: {
  11 + type: Array,
  12 + default: ['fxbg', 'gf', 'gzgl', 'jkjc', 'lxwh', 'pzgl', 'rcxj']
  13 + },
  14 + // 是否是预览模式
  15 + // 预览模式不展示授权按钮
  16 + isView: {
  17 + type: Boolean,
  18 + default: false
  19 + },
  20 + // 文件类型id(展示该类型下的文件信息)
  21 + // 是否是预览模式 == true,viewDocId,必须传入
  22 + viewTypeId: {
  23 + type: String,
  24 + default: ''
  25 + },
  26 + fileIds: {
  27 + type: Array,
  28 + default: []
  29 + }
  30 +
  31 + },
9 data() { 32 data() {
10 return { 33 return {
11 props: { 34 props: {
@@ -23,10 +46,9 @@ export default { @@ -23,10 +46,9 @@ export default {
23 } 46 }
24 } 47 }
25 }, 48 },
26 - setup() { 49 + setup(props, {attrs, slots, emit}) {
27 const {proxy} = Vue.getCurrentInstance(); 50 const {proxy} = Vue.getCurrentInstance();
28 let height = Vue.ref(window.innerHeight - 20); 51 let height = Vue.ref(window.innerHeight - 20);
29 - let defaultKeys = Vue.ref('');  
30 let iconclass = { 52 let iconclass = {
31 'folder': 'icon-wenjianjia', 53 'folder': 'icon-wenjianjia',
32 'docx': 'icon-word-full', 54 'docx': 'icon-word-full',
@@ -73,8 +95,12 @@ export default { @@ -73,8 +95,12 @@ export default {
73 'vob': 'icon-avi', 95 'vob': 'icon-avi',
74 'zip': 'icon-zip-full', 96 'zip': 'icon-zip-full',
75 } 97 }
  98 + // 树数据
76 let treeData = Vue.ref([]); 99 let treeData = Vue.ref([]);
  100 + // 当前节点数据
77 let currentNodeData = Vue.ref({}); 101 let currentNodeData = Vue.ref({});
  102 + // 默认打开节点
  103 + let defaultExpandedKeys = Vue.ref([]);
78 104
79 // 获取文件列表或者打开文件 105 // 获取文件列表或者打开文件
80 let getFile = (item) => { 106 let getFile = (item) => {
@@ -131,28 +157,33 @@ export default { @@ -131,28 +157,33 @@ export default {
131 // 左侧树 157 // 左侧树
132 let getTree = () => { 158 let getTree = () => {
133 // 加载列表 159 // 加载列表
134 - proxy.$http.get("/inspection-report/doc/type/tree", {}, function (res) { 160 + proxy.$http.get("/inspection-report/doc/type/tree", {types: props.types.join(',')}, function (res) {
135 if (res && res.data) { 161 if (res && res.data) {
136 treeData.value = res.data; 162 treeData.value = res.data;
137 - currentNodeData.value = res.data[0];  
138 - let firstId = res.data[0].id;  
139 - defaultKeys.value = firstId; 163 + let first = res.data[0];
  164 + currentNodeData.value = first;
140 165
141 - // 加载所有  
142 - getPage(''); 166 + let arr = [];
  167 + arr.push(first.id);
  168 + defaultExpandedKeys.value = arr;
  169 +
  170 + // 加载第一个节点数据
  171 + getPage(first.id);
143 } 172 }
144 }) 173 })
145 } 174 }
146 175
147 // 获取表格树 176 // 获取表格树
148 let getPage = (id) => { 177 let getPage = (id) => {
  178 + let docIds = props.fileIds.length == 0 ? '' : props.fileIds.join(',')
149 let params = { 179 let params = {
150 id: id, 180 id: id,
151 name: keyWord.value, 181 name: keyWord.value,
152 - types:null 182 + types: props.types.join(','),
  183 + docIds:docIds
153 } 184 }
154 // 加载列表 185 // 加载列表
155 - proxy.$http.get(`/inspection-report/file/file/documentPage`, params, function (res) { 186 + proxy.$http.get(`/inspection-report/file/document/list`, params, function (res) {
156 if (res && res.data) { 187 if (res && res.data) {
157 dataList.value = res.data; 188 dataList.value = res.data;
158 } 189 }
@@ -167,6 +198,10 @@ export default { @@ -167,6 +198,10 @@ export default {
167 let nodeClick = (node, data) => { 198 let nodeClick = (node, data) => {
168 let id = data.id; 199 let id = data.id;
169 currentNodeData.value = data; 200 currentNodeData.value = data;
  201 +
  202 + let arr = [];
  203 + arr.push(id);
  204 + defaultExpandedKeys.value = arr;
170 getPage(id); 205 getPage(id);
171 } 206 }
172 207
@@ -179,34 +214,51 @@ export default { @@ -179,34 +214,51 @@ export default {
179 } 214 }
180 215
181 // 刷新 216 // 刷新
182 - let reload = () => { 217 + let reload = (loadTree) => {
183 // 属性tree 218 // 属性tree
184 setTimeout(function () { 219 setTimeout(function () {
185 let id = currentNodeData.value.id; 220 let id = currentNodeData.value.id;
186 getPage(id); 221 getPage(id);
187 222
  223 + if(loadTree && loadTree == true){
188 getTree(); 224 getTree();
  225 + }
  226 +
189 }, 1000) 227 }, 1000)
190 } 228 }
191 229
192 230
193 /** 231 /**
194 - * 删除文档 232 + * 将文档放入回收站
195 * @param id 文档id 233 * @param id 文档id
196 * @param type 文件夹或者文档 234 * @param type 文件夹或者文档
197 */ 235 */
198 let deleteDocument = (id, type) => { 236 let deleteDocument = (id, type) => {
  237 + let params = null;
  238 +
199 let msg = "您确认删除该文件?"; 239 let msg = "您确认删除该文件?";
200 if (type == 'folder') { 240 if (type == 'folder') {
201 msg = "您确认删除该文件以及文件下的文件?"; 241 msg = "您确认删除该文件以及文件下的文件?";
  242 + params = {id: id, type: type}
  243 + } else {
  244 + // 删除文件
  245 + let arr = getCheckedFile();
  246 + let info = [];
  247 + arr.map(function (v) {
  248 + info.push({
  249 + id:v.id,
  250 + type:v.type
  251 + })
  252 + })
  253 + params = info;
202 } 254 }
203 proxy.$global.confirm(msg, function () { 255 proxy.$global.confirm(msg, function () {
204 // ok 256 // ok
205 - proxy.$http.get(`/inspection-report/file/file/delete`, {id: id, type: type}, function (res) { 257 + proxy.$http.post(`/inspection-report/file/change`,params , function (res) {
206 if (res && res.code == 0) { 258 if (res && res.code == 0) {
207 proxy.$global.showMsg('删除成功!'); 259 proxy.$global.showMsg('删除成功!');
208 260
209 - reload(); 261 + reload(false);
210 } 262 }
211 }) 263 })
212 264
@@ -253,7 +305,7 @@ export default { @@ -253,7 +305,7 @@ export default {
253 }) 305 })
254 306
255 // 属性tree 307 // 属性tree
256 - reload(); 308 + reload(true);
257 showFolder(false); 309 showFolder(false);
258 } else { 310 } else {
259 console.log('error submit!!') 311 console.log('error submit!!')
@@ -267,44 +319,31 @@ export default { @@ -267,44 +319,31 @@ export default {
267 */ 319 */
268 let searchFile = () => { 320 let searchFile = () => {
269 getPage(''); 321 getPage('');
270 - // let id = currentNodeData.value.id;  
271 - // if (id) {  
272 - // getPage(id);  
273 - // } else {  
274 - // // 浏览器地址传文档id参数  
275 - // let docId = proxy.$global.getQueryVariable('docId');  
276 - // if (docId) {  
277 - // getPage(docId);  
278 - // } else {  
279 - // proxy.$global.showMsg('请选择文档类型!', 'warning');  
280 - // }  
281 - // }  
282 322
283 } 323 }
284 324
285 325
286 -  
287 // 用户授权 326 // 用户授权
288 let showUserDialogVisible = Vue.ref(false); 327 let showUserDialogVisible = Vue.ref(false);
289 let userFileRight = Vue.ref({}); // {roleIds: ["1"], usernames: ["admin"]} 328 let userFileRight = Vue.ref({}); // {roleIds: ["1"], usernames: ["admin"]}
290 let getCheckedFile = () => { 329 let getCheckedFile = () => {
291 - let arr = dataList.value.filter(function (v){  
292 - if(v.checked != undefined && v.checked == true){ 330 + let arr = dataList.value.filter(function (v) {
  331 + if (v.checked != undefined && v.checked == true) {
293 return v; 332 return v;
294 } 333 }
295 }) 334 })
296 335
297 - if(arr.length == 0){  
298 - proxy.$global.showMsg('请选择需要授权的文档!', 'warning'); 336 + if (arr.length == 0) {
  337 + proxy.$global.showMsg('请选择需要操作的文档!', 'warning');
299 return; 338 return;
300 } 339 }
301 340
302 - if(arr.length == 1){ 341 + if (arr.length == 1) {
303 // 查询文件的权限 342 // 查询文件的权限
304 - proxy.$http.get(`/inspection-report/doc/doc/auth/getGrant`, {docId:arr[0].id}, function (res) { 343 + proxy.$http.get(`/inspection-report/doc/doc/auth/getGrant`, {docId: arr[0].id}, function (res) {
305 if (res && res.code == 0) { 344 if (res && res.code == 0) {
306 let map = res.map; 345 let map = res.map;
307 - if(map){ 346 + if (map) {
308 userFileRight.value = res.map; 347 userFileRight.value = res.map;
309 } 348 }
310 } 349 }
@@ -317,9 +356,9 @@ export default { @@ -317,9 +356,9 @@ export default {
317 } 356 }
318 // 用户授权弹框 357 // 用户授权弹框
319 let showUserDialog = (flg) => { 358 let showUserDialog = (flg) => {
320 - if(flg){ 359 + if (flg) {
321 let arr = getCheckedFile(); 360 let arr = getCheckedFile();
322 - if(arr && arr.length > 0){ 361 + if (arr && arr.length > 0) {
323 showUserDialogVisible.value = flg; 362 showUserDialogVisible.value = flg;
324 } 363 }
325 } else { 364 } else {
@@ -338,16 +377,16 @@ export default { @@ -338,16 +377,16 @@ export default {
338 return v.code; 377 return v.code;
339 }); 378 });
340 379
341 - let docIds = getCheckedFile().map(function (v){ 380 + let docIds = getCheckedFile().map(function (v) {
342 return v.id; 381 return v.id;
343 }); 382 });
344 383
345 384
346 // 保存用户权限 385 // 保存用户权限
347 let params = { 386 let params = {
348 - docIds:docIds.join(','),  
349 - roleIds:roleCodes.join(','),  
350 - usernames:userIds.join(',') 387 + docIds: docIds.join(','),
  388 + roleIds: roleCodes.join(','),
  389 + usernames: userIds.join(',')
351 } 390 }
352 proxy.$http.get(`/inspection-report/doc/doc/auth/grant`, params, function (res) { 391 proxy.$http.get(`/inspection-report/doc/doc/auth/grant`, params, function (res) {
353 if (res && res.code == 0) { 392 if (res && res.code == 0) {
@@ -356,8 +395,6 @@ export default { @@ -356,8 +395,6 @@ export default {
356 proxy.$global.showMsg('授权失败!', 'warning'); 395 proxy.$global.showMsg('授权失败!', 'warning');
357 } 396 }
358 }) 397 })
359 - // 隐藏授权弹框  
360 - showUserDialog(false);  
361 } 398 }
362 399
363 // 上传 400 // 上传
@@ -368,7 +405,35 @@ export default { @@ -368,7 +405,35 @@ export default {
368 let showUploadFile = (flg) => { 405 let showUploadFile = (flg) => {
369 showUploadDialogVisible.value = flg; 406 showUploadDialogVisible.value = flg;
370 } 407 }
371 - let uploadCallBack = () =>{ 408 + let uploadCallBack = ({document,fileInfo}) => {
  409 + reload(false);
  410 + // 执行回调
  411 + emit('callback',{document,fileInfo});
  412 + }
  413 +
  414 + /**
  415 + * 文件下载
  416 + */
  417 + let downloadFile = () =>{
  418 + let arr = getCheckedFile();
  419 +
  420 + let info = [];
  421 + arr.map(function (v) {
  422 + // info.push({
  423 + // id:v.id,
  424 + // type:v.type
  425 + // })
  426 +
  427 + info.push(`${v.id}__${v.type}`);
  428 + })
  429 +
  430 + let params = {
  431 + info : info.join(","),
  432 + fileName:''
  433 + }
  434 +
  435 + proxy.$http.downloadFile('/inspection-report/file/download',params);
  436 +
372 437
373 } 438 }
374 439
@@ -377,16 +442,20 @@ export default { @@ -377,16 +442,20 @@ export default {
377 * 挂载完 442 * 挂载完
378 */ 443 */
379 Vue.onMounted(() => { 444 Vue.onMounted(() => {
380 - // 参数是否传文档id  
381 - let docId = proxy.$global.getQueryVariable('docId');  
382 - if (!docId) { 445 + // 预览模式 不展示左侧树
  446 + if (!props.isView) {
383 getTree(); 447 getTree();
384 } else { 448 } else {
385 layout.value = { 449 layout.value = {
386 left: 0, 450 left: 0,
387 right: 24 451 right: 24
388 } 452 }
389 - getPage(docId); 453 + currentNodeData.value = {
  454 + docType: props.viewTypeId,
  455 + docNo: props.viewTypeId,
  456 + id: props.viewTypeId
  457 + }
  458 + getPage(props.viewTypeId);
390 } 459 }
391 }) 460 })
392 461
@@ -400,7 +469,6 @@ export default { @@ -400,7 +469,6 @@ export default {
400 columns, 469 columns,
401 dataList, 470 dataList,
402 total, 471 total,
403 - defaultKeys,  
404 nodeClick, 472 nodeClick,
405 keyWord, 473 keyWord,
406 searchFile, 474 searchFile,
@@ -408,7 +476,11 @@ export default { @@ -408,7 +476,11 @@ export default {
408 activeBtn, 476 activeBtn,
409 activeModel, 477 activeModel,
410 deleteDocument, 478 deleteDocument,
  479 + uploadCallBack,
  480 +
  481 + downloadFile,
411 482
  483 + defaultExpandedKeys,
412 currentNodeData, 484 currentNodeData,
413 docForm, 485 docForm,
414 addFolder, 486 addFolder,
@@ -14,10 +14,10 @@ @@ -14,10 +14,10 @@
14 14
15 <div v-if="typeof(item.render) == 'function'" > 15 <div v-if="typeof(item.render) == 'function'" >
16 <div v-if="typeof(item.click) == 'function'"> 16 <div v-if="typeof(item.click) == 'function'">
17 - <el-link type="primary" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link> 17 + <el-link :type="linkType" :underline="isLink" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link>
18 </div> 18 </div>
19 <div v-else> 19 <div v-else>
20 - <el-link type="primary" v-html="item.render(scope.row)"></el-link> 20 + <el-link :type="linkType" :underline="isLink" v-html="item.render(scope.row)"></el-link>
21 </div> 21 </div>
22 </div> 22 </div>
23 <span v-else> 23 <span v-else>
@@ -45,7 +45,7 @@ export default { @@ -45,7 +45,7 @@ export default {
45 // 默认展示 45 // 默认展示
46 pageSize: { 46 pageSize: {
47 type: Number, 47 type: Number,
48 - default: 100 48 + default: 50
49 }, 49 },
50 // 总数 50 // 总数
51 total: { 51 total: {
@@ -67,10 +67,21 @@ export default { @@ -67,10 +67,21 @@ export default {
67 type: Array, 67 type: Array,
68 default: [] 68 default: []
69 }, 69 },
  70 + // 是否展示加载
70 loading:{ 71 loading:{
71 type: Boolean, 72 type: Boolean,
72 default: false 73 default: false
73 }, 74 },
  75 + // 是否展示链接
  76 + isLink:{
  77 + type: Boolean,
  78 + default: false
  79 + },
  80 + // 是否展示链接
  81 + linkType:{
  82 + type: String,
  83 + default: 'primary'
  84 + },
74 }, 85 },
75 data() { 86 data() {
76 return {} 87 return {}
1 -<cm-dialog title="文件上传" width="500px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="uploadFile" okText="上传"> 1 +<cm-dialog v-if="!isInset" title="文件上传" width="500px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="uploadFile" okText="上传">
2 <template v-slot> 2 <template v-slot>
3 3
4 <el-upload 4 <el-upload
@@ -6,9 +6,10 @@ @@ -6,9 +6,10 @@
6 ref="upload" 6 ref="upload"
7 :http-request="getFile" 7 :http-request="getFile"
8 :multiple="true" 8 :multiple="true"
  9 + :before-upload="beforeUpload"
9 :auto-upload="false"> 10 :auto-upload="false">
10 <template #trigger> 11 <template #trigger>
11 - <el-button size="small" type="primary">选择文件</el-button> 12 + <el-button size="small" type="primary">{{btnText}}</el-button>
12 </template> 13 </template>
13 支持格式: 14 支持格式:
14 <el-tooltip placement="top" effect="light"> 15 <el-tooltip placement="top" effect="light">
@@ -18,10 +19,21 @@ @@ -18,10 +19,21 @@
18 <i class="el-icon-chat-round"></i> 19 <i class="el-icon-chat-round"></i>
19 </el-tooltip> 20 </el-tooltip>
20 <template #tip> 21 <template #tip>
21 -<!-- <div class="el-upload__tip">-->  
22 -<!-- 文件命名规范建议:以文档编号+"-" 开头,如:3101-基本信息.xls-->  
23 -<!-- </div>--> 22 + <div class="el-upload__tip" v-if="tips != null && tips != ''">
  23 + {{tips}}
  24 + </div>
24 </template> 25 </template>
25 </el-upload> 26 </el-upload>
26 </template> 27 </template>
27 </cm-dialog> 28 </cm-dialog>
  29 +
  30 +<!--页面嵌套方式-->
  31 +<el-upload
  32 + v-if="isInset"
  33 + :show-file-list="false"
  34 + :before-upload="beforeUpload"
  35 + :multiple="false"
  36 + :http-request="getInsetFile"
  37 + :auto-upload="true">
  38 + <el-button size="small" type="primary">上传照片</el-button>
  39 +</el-upload>
@@ -6,6 +6,15 @@ export default { @@ -6,6 +6,15 @@ export default {
6 template: '', 6 template: '',
7 components: {}, 7 components: {},
8 props: { 8 props: {
  9 + // 嵌套方式
  10 + isInset: {
  11 + type: Boolean,
  12 + default: false
  13 + },
  14 + btnText:{
  15 + type: String,
  16 + default: '选择文件'
  17 + },
9 showDialogVisible: { 18 showDialogVisible: {
10 type: Boolean, 19 type: Boolean,
11 default: false 20 default: false
@@ -18,6 +27,25 @@ export default { @@ -18,6 +27,25 @@ export default {
18 type: String, 27 type: String,
19 default: '' 28 default: ''
20 }, 29 },
  30 + // 文件分类
  31 + type: {
  32 + type: String,
  33 + default: ''
  34 + },
  35 + // 父级Id
  36 + category: {
  37 + type: String,
  38 + default: ''
  39 + },
  40 + // 文档编号
  41 + docNo: {
  42 + type: String,
  43 + default: ''
  44 + },
  45 + tips: {
  46 + type: String,
  47 + default: ''
  48 + },
21 accept: { 49 accept: {
22 type: String, 50 type: String,
23 default: [".3gpp", 51 default: [".3gpp",
@@ -85,14 +113,39 @@ export default { @@ -85,14 +113,39 @@ export default {
85 emit('hideDialog', false); 113 emit('hideDialog', false);
86 } 114 }
87 let getFile = (param) =>{ 115 let getFile = (param) =>{
88 - console.log(param)  
89 let fileObj = param.file 116 let fileObj = param.file
  117 + let params = {
  118 + file:fileObj,
  119 + type:props.type,
  120 + category:props.category,
  121 + docNo:props.docNo
  122 + }
  123 + // 上传文件
  124 + proxy.$http.uploadFile("/inspection-report/file/upload", params, function (res) {
  125 + if (res && res.code == 0) {
  126 + proxy.$global.showMsg(res.msg);
  127 + // 调用回调
  128 + emit('callback',res.object)
  129 + hidedialog();
  130 + }
  131 + })
90 } 132 }
91 133
92 // 上传按钮点击 134 // 上传按钮点击
93 let uploadFile = () => { 135 let uploadFile = () => {
94 proxy.$refs.upload.submit() 136 proxy.$refs.upload.submit()
95 } 137 }
  138 +
  139 + // 提交前的验证
  140 + let beforeUpload = (file) =>{
  141 + return emit('beforeUpload',file)
  142 + }
  143 +
  144 + let getInsetFile = (param) =>{
  145 + let fileObj = param.file
  146 + emit('callback',fileObj)
  147 + }
  148 +
96 // 监听编辑状态 149 // 监听编辑状态
97 Vue.watch( 150 Vue.watch(
98 () => props.showDialogVisible, (newValue, oldVlaue) => { 151 () => props.showDialogVisible, (newValue, oldVlaue) => {
@@ -109,10 +162,12 @@ export default { @@ -109,10 +162,12 @@ export default {
109 162
110 163
111 return { 164 return {
  165 + getInsetFile,
112 getFile, 166 getFile,
113 show, 167 show,
114 uploadFile, 168 uploadFile,
115 - hidedialog 169 + hidedialog,
  170 + beforeUpload
116 } 171 }
117 } 172 }
118 } 173 }
1 -<cm-dialog title="用户授权" width="900px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="getUser"> 1 +<cm-dialog :title="title" width="900px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="getUser">
2 <template v-slot> 2 <template v-slot>
3 <el-transfer v-model="value" :props="props" filterable 3 <el-transfer v-model="value" :props="props" filterable
4 :render-content="renderFunc" 4 :render-content="renderFunc"
5 - :data="userArr" :titles="['所有用户/角色', '已授权用户/角色']"  
6 - :button-texts="['取消', '授权']"> 5 + :data="userArr" :titles="titles"
  6 + :button-texts="buttonTexts">
7 <!--<template #left-footer> 7 <!--<template #left-footer>
8 <el-button class="transfer-footer" size="small">Operation</el-button> 8 <el-button class="transfer-footer" size="small">Operation</el-button>
9 </template>--> 9 </template>-->
@@ -13,7 +13,29 @@ export default { @@ -13,7 +13,29 @@ export default {
13 users: { 13 users: {
14 type: Array, 14 type: Array,
15 default: [] 15 default: []
16 - } 16 + },
  17 + // 加载用户数据
  18 + loadUserDta: {
  19 + type: Boolean,
  20 + default: true
  21 + },
  22 + title: {
  23 + type: String,
  24 + default: '添加授权'
  25 + },
  26 + // 加载角色数据
  27 + loadRoleDta: {
  28 + type: Boolean,
  29 + default: true
  30 + },
  31 + titles: {
  32 + type: Array,
  33 + default: ['所有用户/角色', '已授权用户/角色']
  34 + },
  35 + buttonTexts: {
  36 + type: Array,
  37 + default: ['取消', '授权']
  38 + },
17 }, 39 },
18 data() { 40 data() {
19 return { 41 return {
@@ -26,6 +48,7 @@ export default { @@ -26,6 +48,7 @@ export default {
26 let v = Vue.ref(props.users); 48 let v = Vue.ref(props.users);
27 let userArr = Vue.ref([]); 49 let userArr = Vue.ref([]);
28 const getAllUser = () => { 50 const getAllUser = () => {
  51 + if(props.loadUserDta){
29 // 查询全部用户 52 // 查询全部用户
30 proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) { 53 proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) {
31 if (res && res.data) { 54 if (res && res.data) {
@@ -48,8 +71,10 @@ export default { @@ -48,8 +71,10 @@ export default {
48 }) 71 })
49 }); 72 });
50 } 73 }
51 - }) 74 + },function (){},false)
  75 + }
52 76
  77 + if(props.loadRoleDta){
53 // 查询全部角色 78 // 查询全部角色
54 proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) { 79 proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) {
55 if (res && res.data) { 80 if (res && res.data) {
@@ -72,7 +97,10 @@ export default { @@ -72,7 +97,10 @@ export default {
72 }) 97 })
73 }); 98 });
74 } 99 }
75 - }) 100 + },function (){},false)
  101 + }
  102 +
  103 +
76 104
77 } 105 }
78 106
@@ -106,6 +134,8 @@ export default { @@ -106,6 +134,8 @@ export default {
106 } 134 }
107 135
108 emit('callback', data); 136 emit('callback', data);
  137 +
  138 + emit('hideDialog', false);
109 } 139 }
110 140
111 let renderFunc = (h, option) =>{ 141 let renderFunc = (h, option) =>{
@@ -165,7 +195,7 @@ export default { @@ -165,7 +195,7 @@ export default {
165 userArr, 195 userArr,
166 value: v, 196 value: v,
167 getUser, 197 getUser,
168 - renderFunc 198 + renderFunc,
169 } 199 }
170 } 200 }
171 } 201 }
@@ -94,6 +94,18 @@ global.confirm = (msg,okFunc,cancelFunc) =>{ @@ -94,6 +94,18 @@ global.confirm = (msg,okFunc,cancelFunc) =>{
94 */ 94 */
95 global.getQueryVariable = (variable) => { 95 global.getQueryVariable = (variable) => {
96 var query = window.location.search.substring(1); 96 var query = window.location.search.substring(1);
  97 +
  98 + if(query == ''){
  99 + query = document.location.href
  100 + let arr = query.split('?');
  101 + for (var i = 0; i < arr.length; i++) {
  102 + var pair = arr[i].split("=");
  103 + if (pair[0] == variable) {
  104 + return pair[1];
  105 + }
  106 + }
  107 + return (false);
  108 + }
97 var vars = query.split("&"); 109 var vars = query.split("&");
98 for (var i = 0; i < vars.length; i++) { 110 for (var i = 0; i < vars.length; i++) {
99 var pair = vars[i].split("="); 111 var pair = vars[i].split("=");
@@ -104,10 +116,38 @@ global.getQueryVariable = (variable) => { @@ -104,10 +116,38 @@ global.getQueryVariable = (variable) => {
104 return (false); 116 return (false);
105 } 117 }
106 118
  119 +/**
  120 + * 文件预览
  121 + * @param path
  122 + */
107 global.viewer = (path) =>{ 123 global.viewer = (path) =>{
108 window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(path)); 124 window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(path));
109 } 125 }
110 126
  127 +/**
  128 + * 将文件转成base64
  129 + * @param file
  130 + * @returns {Promise<String>}
  131 + */
  132 +global.getBase64 = (file) =>{
  133 + return new Promise(function(resolve, reject) {
  134 + let reader = new FileReader();
  135 + let imgResult = "";
  136 + reader.readAsDataURL(file);
  137 + reader.onload = function() {
  138 + imgResult = reader.result;
  139 + };
  140 + reader.onerror = function(error) {
  141 + reject(error);
  142 + };
  143 + reader.onloadend = function() {
  144 + resolve(imgResult);
  145 + };
  146 + });
  147 +}
  148 +
  149 +
  150 +
111 // 组件默认大小 151 // 组件默认大小
112 global.elementSize = 'small'; 152 global.elementSize = 'small';
113 153
1 -  
2 let http = { 1 let http = {
3 proxy: null, 2 proxy: null,
4 - isJson: function(obj) {  
5 - var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == 3 + isJson: function (obj) {
  4 + var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() ==
6 "[object object]" && 5 "[object object]" &&
7 !obj.length; 6 !obj.length;
8 return isjson; 7 return isjson;
9 }, 8 },
10 - reqErr : function(status){  
11 - if(status && status == '401'){ 9 + reqErr: function (status) {
  10 + if (status && status == '401') {
12 // 登录超时,刷新当前页面===>跳转到登录页面 11 // 登录超时,刷新当前页面===>跳转到登录页面
13 window.location.reload(); 12 window.location.reload();
14 } 13 }
15 }, 14 },
16 - post: function(requestUrl, data, callback) {  
17 - if(http.proxy == null){  
18 - const { proxy } = Vue.getCurrentInstance() 15 + post: function (requestUrl, data, callback, errFunc,showLoadding) {
  16 + if (http.proxy == null) {
  17 + const {proxy} = Vue.getCurrentInstance()
19 http.proxy = proxy; 18 http.proxy = proxy;
20 } 19 }
21 -  
22 - const loading = http.proxy.$global.showLoading(); 20 + // 默认展示加载狂
  21 + if(showLoadding == undefined){
  22 + showLoadding = true;
  23 + }
  24 + let loading = null;
  25 + if(showLoadding && showLoadding == true){
  26 + loading = http.proxy.$global.showLoading();
  27 + }
23 var access_token = 'access_token=' + http.getToken(); 28 var access_token = 'access_token=' + http.getToken();
24 if (requestUrl.indexOf('?') == -1) { 29 if (requestUrl.indexOf('?') == -1) {
25 requestUrl += '?' + access_token; 30 requestUrl += '?' + access_token;
@@ -34,28 +39,42 @@ let http = { @@ -34,28 +39,42 @@ let http = {
34 dataType: "JSON", 39 dataType: "JSON",
35 async: true, 40 async: true,
36 data: JSON.stringify(data), 41 data: JSON.stringify(data),
37 - error: function(xhr, textStatus) { 42 + error: function (xhr, textStatus) {
  43 + if(showLoadding && showLoadding == true){
38 loading.close(); 44 loading.close();
39 - console.log("==>",requestUrl, xhr, textStatus) 45 + }
  46 + if (errFunc) {
  47 + errFunc();
  48 + }
  49 + console.log("==>", requestUrl, xhr, textStatus)
40 http.reqErr(textStatus.status); 50 http.reqErr(textStatus.status);
41 }, 51 },
42 - success: function(data, textStatus, jqXHR) { 52 + success: function (data, textStatus, jqXHR) {
43 if (callback) { 53 if (callback) {
44 callback(data); 54 callback(data);
45 } 55 }
46 - loading.close() 56 + if(showLoadding && showLoadding == true){
  57 + loading.close();
  58 + }
47 //console.log("==>", requestUrl, jqXHR, textStatus) 59 //console.log("==>", requestUrl, jqXHR, textStatus)
48 60
49 } 61 }
50 }); 62 });
51 63
52 }, 64 },
53 - get: function(requestUrl, data, callback,errFunc) {  
54 - if(http.proxy == null){  
55 - const { proxy } = Vue.getCurrentInstance() 65 + get: function (requestUrl, data, callback, errFunc,showLoadding) {
  66 + if (http.proxy == null) {
  67 + const {proxy} = Vue.getCurrentInstance()
56 http.proxy = proxy; 68 http.proxy = proxy;
57 } 69 }
58 - const loading = http.proxy.$global.showLoading(); 70 + // 默认展示加载狂
  71 + if(showLoadding == undefined){
  72 + showLoadding = true;
  73 + }
  74 + let loading = null;
  75 + if(showLoadding == true){
  76 + loading = http.proxy.$global.showLoading();
  77 + }
59 var access_token = 'access_token=' + http.getToken(); 78 var access_token = 'access_token=' + http.getToken();
60 if (requestUrl.indexOf('?') == -1) { 79 if (requestUrl.indexOf('?') == -1) {
61 requestUrl += '?' + access_token; 80 requestUrl += '?' + access_token;
@@ -69,59 +88,93 @@ let http = { @@ -69,59 +88,93 @@ let http = {
69 "Authorization": "Bearer " + http.getToken() + "" 88 "Authorization": "Bearer " + http.getToken() + ""
70 }, 89 },
71 data: data, 90 data: data,
72 - error: function(xhr, textStatus) { 91 + error: function (xhr, textStatus) {
  92 + if(showLoadding && showLoadding == true){
73 loading.close(); 93 loading.close();
74 - console.log("==>",requestUrl, xhr, textStatus) 94 + }
  95 + console.log("==>", requestUrl, xhr, textStatus)
75 http.reqErr(textStatus.status); 96 http.reqErr(textStatus.status);
76 97
77 - if(errFunc){ 98 + if (errFunc) {
78 errFunc(); 99 errFunc();
79 } 100 }
80 101
81 }, 102 },
82 - success: function(data, textStatus, jqXHR) { 103 + success: function (data, textStatus, jqXHR) {
83 if (callback) { 104 if (callback) {
84 callback(data); 105 callback(data);
85 } 106 }
  107 + if(showLoadding && showLoadding == true){
86 loading.close(); 108 loading.close();
  109 + }
87 //console.log("==>", requestUrl, jqXHR, textStatus) 110 //console.log("==>", requestUrl, jqXHR, textStatus)
88 } 111 }
89 }); 112 });
90 }, 113 },
91 114
92 - downloadFile(fileName, content) {  
93 - var filename = fileName;  
94 - var a = document.createElement('a')  
95 - var blob = new Blob([content])  
96 - a.download = filename  
97 - a.href = URL.createObjectURL(blob)  
98 - a.click()  
99 - URL.revokeObjectURL(blob) 115 + uploadFile(requestUrl, parmas,callback) {
  116 + if (http.proxy == null) {
  117 + const {proxy} = Vue.getCurrentInstance()
  118 + http.proxy = proxy;
  119 + }
  120 + const loading = http.proxy.$global.showLoading();
  121 + var access_token = 'access_token=' + http.getToken();
  122 + if (requestUrl.indexOf('?') == -1) {
  123 + requestUrl += '?' + access_token;
  124 + } else {
  125 + requestUrl += '&' + access_token;
  126 + }
  127 +
  128 + var formData = new FormData();
  129 + (function (ps) {
  130 + Object.keys(ps).map(_ => formData.append(_, ps[_]) );
  131 + })(parmas);
  132 +
  133 + $.ajax({
  134 + url: sessionStorage.getItem('domainName') + requestUrl,
  135 + type: 'POST',
  136 + processData: false,
  137 + mimeType: "multipart/form-data",
  138 + contentType: false,
  139 + async: false,
  140 + data: formData,
  141 + error: function (xhr, textStatus) {
  142 + loading.close();
  143 + console.log("==>", requestUrl, xhr, textStatus)
  144 + http.reqErr(textStatus.status);
  145 + },
  146 + success: function (data, textStatus, jqXHR) {
  147 + if (callback) {
  148 + let d = data;
  149 + try {
  150 + d = JSON.parse(data);
  151 + }catch (e) {
  152 + console.log(e);
  153 + }
  154 + callback(d);
  155 + }
  156 + loading.close()
  157 + }
  158 + });
  159 + },
  160 +
  161 + downloadFile(requestUrl, parmas) {
  162 + var access_token = 'access_token=' + http.getToken();
  163 + if (requestUrl.indexOf('?') == -1) {
  164 + requestUrl += '?' + access_token;
  165 + } else {
  166 + requestUrl += '&' + access_token;
  167 + }
  168 + let formart = function (ps) {
  169 + const keys = Object.keys(ps).map(_ => `${_}=${ps[_]}`).join('&');
  170 + return `${keys}`;
  171 + }
  172 + let p = formart(parmas);
  173 + window.open(sessionStorage.getItem('domainName') + requestUrl + "&" + p);
100 }, 174 },
101 getToken() { 175 getToken() {
102 return localStorage.getItem('access_token'); 176 return localStorage.getItem('access_token');
103 }, 177 },
104 -  
105 - // showMsg(msg, type = 'success') {  
106 - // ElementPlus.ElMessage.success({  
107 - // message: msg,  
108 - // type: type,  
109 - // })  
110 - // },  
111 -  
112 - // showLoading(callback) {  
113 - // const loading = ElementPlus.ElLoading.service({  
114 - // lock: true,  
115 - // text: '加载中...',  
116 - // spinner: 'el-icon-loading',  
117 - // background: 'rgba(0, 0, 0, 0.7)',  
118 - // });  
119 -  
120 - // if (callback) {  
121 - // callback(loading);  
122 - // }  
123 - // return loading;  
124 - // }  
125 } 178 }
126 179
127 export default http 180 export default http
@@ -18,7 +18,8 @@ url: @@ -18,7 +18,8 @@ url:
18 mxgraph_editor: http://127.0.0.1:8085 18 mxgraph_editor: http://127.0.0.1:8085
19 tingyun: http://127.0.0.1:8088 19 tingyun: http://127.0.0.1:8088
20 bigScreen: http://127.0.0.1:8081 20 bigScreen: http://127.0.0.1:8081
21 - sxView: http://127.0.0.1:8089 21 + # 一体化视图
  22 + ythView: http://192.168.0.69:18089
22 #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件 23 #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件
23 workflow: http://192.168.0.248:8002 24 workflow: http://192.168.0.248:8002
24 # 积木报表工具 25 # 积木报表工具
  1 +// 业务类型管理
  2 +layui.define(['table', 'form', 'admin', 'layer', 'laytpl', 'common', 'view', 'sessions', 'commonDetail', 'treeTable', 'xmSelect', 'userlist', 'reslist'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var layer = layui.layer;
  6 + var admin = layui.admin;
  7 + var table = layui.table;
  8 + var treeTable = layui.treeTable;
  9 + var xmSelect = layui.xmSelect;
  10 + var laytpl = layui.laytpl;
  11 + var view = layui.view;
  12 + var common = layui.common;
  13 + var commonDetail = layui.commonDetail;
  14 + var domainName = common.domainName;
  15 + // 业务类型展示表格
  16 + var busTypeTable;
  17 + // 对外暴露的接口
  18 + exports('bustype', function (data) {
  19 + var sessions = layui.sessions;
  20 + var accessToken = sessions.getToken()['access_token'];
  21 +
  22 + var cutoverId = '', targetType = '';
  23 + if (data && data.cutoverId) {
  24 + cutoverId = data.cutoverId;
  25 + targetType = data.targetType;
  26 + }
  27 + var mode = (data && data.mode) ? data.mode : '';
  28 + var username = (data && data.username) ? data.username : '';
  29 + //展示类型
  30 + var showTypeList=[];
  31 + var dataBusType=[];
  32 + initShowType();
  33 +
  34 + // 查询条件
  35 + var conditions = {busTypeName: ''};
  36 + // 加载遮罩
  37 + var loading;
  38 + var checkList = common.checkPermission(accessToken);
  39 +
  40 + loadBusTypeTable();
  41 + // 查询条件框回车查询事件
  42 + $('#condition-bustype-name').keydown(function (e) {
  43 + if (e.keyCode === 13) {
  44 + loadBusTypeTable();
  45 + return false;
  46 + }
  47 + });
  48 +
  49 + //查询按钮点击事件 joke add 20210428
  50 + $('#bustypeQueryBtn').on('click',function () {
  51 + loadBusTypeTable();
  52 + });
  53 +
  54 + // 删除按钮删除事件
  55 + $('#btn-bustype-delete').click(function () {
  56 + var checks = busTypeTable.checkStatus(false);
  57 + var busId = $.map(checks, function (item) {
  58 + return item.busId;
  59 + });
  60 + deleteBusTypeByIds(busId);
  61 + });
  62 + //授权按钮事件
  63 + $("#btn-bustype-authorization").click(function () {
  64 + var checks = busTypeTable.checkStatus(false);
  65 + var busId = [];
  66 + var j = 0;
  67 + var number = 0;
  68 + for (var i = 0; i < checks.length; i++) {
  69 + if (checks[i].children != null) {
  70 + j++;
  71 + number = checks[i].children.length;
  72 + }
  73 + }
  74 + if (j = 1 && checks.length - number == 1) {
  75 + busId = checks[0].busId;
  76 + } else {
  77 + busId = $.map(checks, function (item) {
  78 + return item.busId;
  79 + });
  80 + }
  81 + if (busId.length == 0) {
  82 + layer.msg('请先选择数据', {icon: 0, timeout: 3000});
  83 + return;
  84 + } else if (busId.length == 1) {
  85 + busId = busId[0];
  86 + } else {
  87 + busId = busId.toString();
  88 + }
  89 + authorizationIndex(busId)
  90 + })
  91 +
  92 + var cols = []
  93 + if (!mode) {
  94 + cols.push({
  95 + type: 'checkbox'
  96 + })
  97 + }
  98 + cols = cols.concat([{
  99 + type: 'numbers', title: '序号', align: 'center', width: 70
  100 + }, {
  101 + field: 'busTypeName', title: '名称', align: 'left',
  102 + templet:
  103 + '<div>' +
  104 + ' <span' +
  105 + ' data-code="{{d.busTypeCode}}"' +
  106 + ' class="layui-table-link btn-bustype-edit">{{d.busTypeName}}' +
  107 + ' </span>' +
  108 + '</div>'
  109 + }, {
  110 + field: 'nickname', title: '负责人', align: 'center'
  111 + }, {
  112 + field: 'busTypeDesc', title: '业务类型描述', align: 'left'
  113 + }, {
  114 + field: 'isOps', title: '乙方运维', align: 'center',width: 120,
  115 + templet: function (d) {
  116 + if(d.isOps==0){
  117 + return '否';
  118 + }else{
  119 + return '是';
  120 + }
  121 +
  122 + }
  123 + }, {
  124 + field: 'isUse', title: '是否使用', align: 'center',width: 120,
  125 + templet: function (d) {
  126 + switch (d.isUse) {
  127 + case 0:
  128 + return '否';
  129 + case 1:
  130 + return '是';
  131 + default:
  132 + return '';
  133 + }
  134 + }
  135 + }, {
  136 + field: 'important', title: '重要程度', align: 'center', width: 120,
  137 + templet: function (d) {
  138 + switch (d.important) {
  139 + case 1:
  140 + return '核心';
  141 + case 2:
  142 + return '重要';
  143 + case 3:
  144 + return '一般';
  145 + case 9:
  146 + return '虚拟业务';
  147 + default:
  148 + return '';
  149 + }
  150 + }
  151 + }, {
  152 + field: 'sort', title: '排序', align: 'right', width: 120,
  153 + }])
  154 + if (!mode) {
  155 + cols.push({
  156 + title: '操作', align: 'center', fixed: 'right', width: '10%',
  157 + templet: function (d) {
  158 + if (d.isLeaf) {
  159 + return '' +
  160 + '<div>' +
  161 + '<button data-id="' + d.busId + '" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-delete"><i class="layui-icon layui-icon-delete"></i></button>' +
  162 + '<button data-id="' + d.busId + '" lay-tips="资源分配" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-res-config"><i class="layui-icon layui-icon-menu-fill"></i></button>' +
  163 + '<button data-id="' + d.busId + '" lay-tips="授权" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-authorize"><i class="layui-icon layui-icon-auz"></i></button>' +
  164 + '<button data-id="' + d.busId + '" lay-tips="乙方运维配置" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-yf-config"><i class="layui-icon layui-icon-auz"></i></button>' +
  165 + '</div>'
  166 + } else {
  167 + return '' +
  168 + '<div class="layui-row">' +
  169 + '<button data-id="' + d.busId + '" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-delete"><i class="layui-icon layui-icon-delete"></i></button>' +
  170 + '<button data-id="' + d.busId + '" lay-tips="授权" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-authorize"><i class="layui-icon layui-icon-auz"></i></button>' +
  171 + '</div>'
  172 + }
  173 + }
  174 + });
  175 + } else {
  176 + cols.push({field: 'showType', title: '展示类型', align: 'center',sort:true,width:210,
  177 + templet: function (d) {
  178 + if(d.parentId == '0' && dataBusType.indexOf(d.busId)>-1){
  179 + return '';
  180 + }else{
  181 + //初始化select内容
  182 + var html='<div><select lay-ignore data-index="99" name="showType" class="layui-input resourceType_showType" style="min-width: 150px;display:inline">';
  183 + $.each(showTypeList,function (i,v) {
  184 + if(d.showType == v.value){
  185 + html += '<option value="' + v.value + '" selected>' + v.name + '</option> '
  186 + }else{
  187 + html += '<option value="' + v.value + '">' + v.name + '</option> '
  188 + }
  189 + });
  190 + html+='</select></div>';
  191 + return html;
  192 + }
  193 + }
  194 + });
  195 + cols.push({
  196 + title: '操作', align: 'center', fixed: 'right', width: '10%',
  197 + templet: function (d) {
  198 + if (d.userCount) {
  199 + return '' +
  200 + '<div class="layui-row">' +
  201 + '<button data-id="' + d.busId + '" type="button" class="layui-btn layui-btn-xs btn-bustype-bind hide" lay-tips="未授权,点击授权"><i class="layui-icon layui-icon-link"></i> 添加授权</button>' +
  202 + '<button data-id="' + d.busId + '" type="button" style="margin-left: 0" class="layui-btn layui-btn-xs layui-btn-danger btn-bustype-unbind" lay-tips="已授权,点击解除授权"><i class="layui-icon layui-icon-unlink"></i> 解除授权</button>' +
  203 + '</div>';
  204 + } else {
  205 + return '' +
  206 + '<div class="layui-row">' +
  207 + '<button data-id="' + d.busId + '" type="button" class="layui-btn layui-btn-xs btn-bustype-bind" lay-tips="未授权,点击授权"><i class="layui-icon layui-icon-link"></i> 添加授权</button>' +
  208 + '<button data-id="' + d.busId + '" type="button" style="margin-left: 0" class="layui-btn layui-btn-xs layui-btn-danger btn-bustype-unbind hide" lay-tips="已授权,点击解除授权"><i class="layui-icon layui-icon-unlink"></i> 解除授权</button>' +
  209 + '</div>';
  210 + }
  211 + }
  212 + });
  213 + }
  214 +
  215 + /**
  216 + * 加载业务类型表格
  217 + */
  218 + function loadBusTypeTable() {
  219 + conditions = {
  220 + busTypeName: $('#condition-bustype-name').val() ? $('#condition-bustype-name').val().trim() : '',
  221 + access_token: accessToken,
  222 + cutoverId: cutoverId,
  223 + targetType: targetType,
  224 + username: username,
  225 + page: -1,
  226 + limit: -1
  227 + };
  228 + conditions.limit = -1;
  229 + admin.req({
  230 + url: domainName + '/api-web/manage/bustype/page',
  231 + data: conditions
  232 + }).done(function (response) {
  233 + $.each(response.data,function (i,v) {
  234 + dataBusType.push(v.parentId);
  235 + })
  236 + // 设置总数
  237 + $('#span-bustype-total').html('共 ' + response.data.length + ' 个业务');
  238 + // 渲染表格
  239 + busTypeTable = treeTable.render({
  240 + elem: '#bustype-table',
  241 + data: response.data,
  242 + page: {
  243 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
  244 + theme: '#1E9FFF'
  245 + },
  246 + tree: {
  247 + iconIndex: mode ? 1 : 2, // 折叠图标显示在第几列
  248 + isPidData: true, // 是否是id、pid形式数据
  249 + idName: 'busId', // id字段名称
  250 + pidName: 'parentId', // pid字段名称
  251 + onlyIconControl: true // 仅允许点击图标折叠
  252 + },
  253 + cols: cols
  254 + });
  255 +
  256 + //回填数据
  257 + if (data && data.username) {
  258 + if (data.username.length == 1) {
  259 + $.ajax({
  260 + type: "get",
  261 + url: domainName + "/api-web/manage/bustype/getBusTypeByUser?access_token=" + accessToken + "&username=" + data.username[0],
  262 + success: function (res) {
  263 + if (res && res.success) {
  264 + var busTypeData = res.data;
  265 + busTypeTable.setChecked(busTypeData.map(item => item.busId))
  266 + }
  267 + },
  268 + })
  269 + }
  270 + }
  271 +
  272 + // 点击编号编辑事件
  273 + $('.btn-bustype-edit').click(function () {
  274 + if ($.inArray('back:bustype:update', checkList) == -1) {
  275 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  276 + return;
  277 + }
  278 + var busTypeCode = $(this).data('code');
  279 + saveBusType(busTypeCode);
  280 + });
  281 + // 删除事件
  282 + $('.btn-bustype-delete').click(function () {
  283 + var busId = $(this).data('id');
  284 + deleteBusTypeByIds([busId]);
  285 + });
  286 + // 授权事件
  287 + $('.btn-bustype-authorize').click(function () {
  288 + loading = layer.load(2);
  289 + var busId = $(this).data('id')
  290 +
  291 + authorizationIndex(busId)
  292 + });
  293 + // 乙方运维配置
  294 + $('.btn-bustype-yf-config').click(function () {
  295 + var busId = $(this).data('id');
  296 + layer.open({
  297 + type: 2
  298 + ,title: "乙方运维配置"
  299 + ,closeBtn: true
  300 + ,area: ['50%', '70%']
  301 + ,shade: 0.8
  302 + ,id: 'operationMaintenance-config' //设定一个id,防止重复弹出
  303 + ,content:`/vue3/index.html#/operationMaintenance/config?id=${busId}`
  304 + , success: function (layero, index) {
  305 + }
  306 + ,yes: function(index, layero){
  307 + layer.closeAll();
  308 + return false;
  309 + }
  310 + });
  311 +
  312 + });
  313 +
  314 + $('.btn-bustype-bind').unbind('click').on('click', function () {
  315 + var $this = $(this);
  316 + var busId = $this.data('id')
  317 +
  318 + layer.load(2);
  319 + admin.req({
  320 + url: domainName + '/api-web/manage/bustype/bindUser/' + busId,
  321 + data: {username},
  322 + success(response) {
  323 + layer.closeAll('loading');
  324 + if (response && response.success) {
  325 + $this.addClass('hide');
  326 + $this.parent().find('.btn-bustype-unbind').removeClass('hide')
  327 + var $child = $('tr[data-pid="' + busId + '"] .btn-bustype-bind');
  328 + $child.addClass('hide')
  329 + $child.parent().find('.btn-bustype-unbind').removeClass('hide')
  330 + } else {
  331 + layer.msg('授权失败!', {icon: 2});
  332 + }
  333 + },
  334 + error() {
  335 + layer.closeAll('loading');
  336 + }
  337 + })
  338 + });
  339 + $('.btn-bustype-unbind').unbind('click').on('click', function () {
  340 + var $this = $(this);
  341 + var busId = $this.data('id')
  342 +
  343 + layer.load(2);
  344 + admin.req({
  345 + url: domainName + '/api-web/manage/bustype/unBindUser/' + busId,
  346 + data: {username},
  347 + success(response) {
  348 + layer.closeAll('loading');
  349 + if (response && response.success) {
  350 + $this.addClass('hide');
  351 + $this.parent().find('.btn-bustype-bind').removeClass('hide')
  352 + } else {
  353 + layer.msg('取消授权失败!', {icon: 2});
  354 + }
  355 + },
  356 + error() {
  357 + layer.closeAll('loading');
  358 + }
  359 + })
  360 + });
  361 + // 资源分配事件
  362 + // $('.btn-bustype-res-config').click(function () {
  363 + // var busId = $(this).data('id');
  364 + // var bustypeReslist = layui.reslist({busId: busId, idSuffix: 1})
  365 + // // 展示资源页面layerindex
  366 + // var bustypeReslayerIndex;
  367 + // common.openWin("template/res/reslist", "当前绑定的资源", {busId: busId, idSuffix: 1}, ["完成", "取消"], function () {
  368 + // layer.close(bustypeReslayerIndex);
  369 + // }, null, ['80%', '90%'],
  370 + // function (layero, layerIndex) {
  371 + // bustypeReslayerIndex = layerIndex;
  372 + // // 新增按钮
  373 + // $("#bustype-reslist-add").click(function () {
  374 + // var reslist = layui.reslist();
  375 + // // 添加绑定页面的layerindex
  376 + // var addResLayerIndex;
  377 + // common.openWin("template/res/reslist", "添加绑定", {}, ["添加", "取消"], function () {
  378 + // loading = layer.load(2);
  379 + // // 当前选中的资源
  380 + // var checks = reslist.getData();
  381 + // // 之前已经选择过的资源
  382 + // var oldResIdList = [];
  383 + // admin.req({
  384 + // url: domainName + '/api-web/manage/bustype/resourceList/' + busId,
  385 + // async: false,
  386 + // error: function () {
  387 + // layer.close(loading);
  388 + // }
  389 + // }).done(function (response) {
  390 + // $.each(response.data, function (index, value) {
  391 + // oldResIdList.push(value.resId);
  392 + // });
  393 + // });
  394 + // // 需要进行插入的资源
  395 + // var inserts = [];
  396 + // var insertCount = 0;
  397 + // var isExistCount = 0;
  398 + // $.each(checks, function (index, value) {
  399 + // if (oldResIdList.indexOf(value.resId) === -1) {
  400 + // inserts.push(value.resId);
  401 + // insertCount++;
  402 + // } else {
  403 + // isExistCount++;
  404 + // }
  405 + // });
  406 + // if (inserts.length === 0) {
  407 + // layer.msg('所选的都已存在,无需重复添加!', {icon: 7, time: 5000});
  408 + // layer.close(loading);
  409 + // return;
  410 + // }
  411 + // // 发送请求添加绑定
  412 + // admin.req({
  413 + // url: domainName + '/api-web/manage/bustype/addResource/' + busId + '?access_token=' + accessToken,
  414 + // type: 'POST',
  415 + // contentType: 'application/json',
  416 + // data: JSON.stringify(inserts),
  417 + // error: function () {
  418 + // layer.close(loading);
  419 + // }
  420 + // }).done(function (response) {
  421 + // layer.close(loading);
  422 + // if (response.success) {
  423 + // layer.msg('添加绑定成功!此次添加了' + insertCount + '个新资源' + (isExistCount > 0 ? ',有' + isExistCount + '个已经存在。' : ''), {icon: 1, time: 5000});
  424 + // layer.close(addResLayerIndex);
  425 + // bustypeReslist.reloadResTable();
  426 + // } else {
  427 + // layer.msg('添加绑定失败!', {icon: 2, time: 3000});
  428 + // }
  429 + // });
  430 + // }, null, ['90%', '80%'], function (layero, layerIndex) {
  431 + // addResLayerIndex = layerIndex
  432 + // });
  433 + // });
  434 + // // 取消绑定按钮
  435 + // $("#bustype-reslist-unbind").click(function () {
  436 + // // 需要取消绑定的资源id集合
  437 + // var deletes = [];
  438 + // $.each(bustypeReslist.getData(), function (index, value) {
  439 + // deletes.push(value.resId);
  440 + // });
  441 + // admin.req({
  442 + // url: domainName + '/api-web/manage/bustype/deleteResource/' + busId + '?access_token=' + accessToken,
  443 + // type: 'POST',
  444 + // contentType: 'application/json',
  445 + // data: JSON.stringify(deletes)
  446 + // }).done(function (response) {
  447 + // if (response.success) {
  448 + // layer.msg('取消绑定成功!', {icon: 1, time: 3000});
  449 + // bustypeReslist.reloadResTable();
  450 + // } else {
  451 + // layer.msg('取消绑定失败!', {icon: 2, time: 3000});
  452 + // }
  453 + // });
  454 + // });
  455 + // });
  456 + // });
  457 +
  458 + //资源分配
  459 + $('.btn-bustype-res-config').click(function () {
  460 + if ($.inArray('back:bustype:resource', checkList) == -1) {
  461 + layer.closeAll();
  462 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  463 + return;
  464 + }
  465 + var busId = $(this).data('id');
  466 + layer.open({
  467 + title: '当前绑定的资源',
  468 + type: 1,
  469 + content: $('#bustype-reslist-table').html(),
  470 + btn: ['完成'],
  471 + area: ['80%', '90%'],
  472 + success: function () {
  473 + // 表格
  474 + var resType = 'all';
  475 + $("#bustype_reslist_resListBizTypes").attr("disabled",true);
  476 + form.render();
  477 + //绑定业务下拉选择数据
  478 + common.bizTypeSelect("bustype_reslist_resListBizTypes",function () {
  479 + $("#bustype_reslist_resListBizTypes").val(busId);
  480 + form.render("select");
  481 + });
  482 + //绑定资源类型下拉选择
  483 + common.resTypeSelect("bustype_reslist_restype",function () {
  484 + form.render("select");
  485 + });
  486 + //回车搜索
  487 + $('#bustype_reslist_keyword').keydown(function (e) {
  488 + if (e.keyCode === 13) {
  489 + reloadTable(resType);
  490 + }
  491 + });
  492 + //选择框搜索事件
  493 + bindSelectEvent();
  494 + //渲染表格
  495 + table.render({
  496 + elem: '#bustype_reslist_resListTable'
  497 + , url: common.domainName + '/api-web/home/res-list/' + resType
  498 + , where: {
  499 + access_token: accessToken,
  500 + resName: $("#bustype_reslist_keyword").val(),
  501 + busId: busId,
  502 + resHealth: $("#bustype_reslist_resStatus").val()
  503 + }
  504 + , height: 'full-300'
  505 + , cellMinWidth: 80
  506 + , page: {
  507 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  508 + , theme: '#1E9FFF'
  509 + }
  510 + , limit: common.limit
  511 + , limits: common.limits
  512 + , cols: [[
  513 + {type: 'checkbox'},
  514 + {type: 'numbers', title: '序号', align: 'center'}
  515 + , {field: 'resName', title: '资源名称', minWidth: 300, align: 'center'}
  516 + , {field: 'ip', title: 'IP地址', align: 'center'}
  517 + , {field: 'admin', title: '负责人', align: 'center'}
  518 + , {field: 'resTypeName', title: '资源类型', align: 'center'}
  519 + , {field: 'healthDesc', title: '资源状态', align: 'center'}
  520 + ]]
  521 + });
  522 + //绑定下拉搜索事件
  523 + function bindSelectEvent() {
  524 + // 资源状态
  525 + form.on('select(bustype_reslist_resStatus)', function(data){
  526 + reloadTable(resType);
  527 + });
  528 + // 资源类型
  529 + form.on('select(bustype_reslist_restype)', function(data){
  530 + resType = data.value;
  531 + reloadTable(resType);
  532 + });
  533 + }
  534 + //刷新表格
  535 + function reloadTable(resType) {
  536 + table.reload('bustype_reslist_resListTable', {
  537 + url: common.domainName + '/api-web/home/res-list/' + (resType ? resType : 'all'),
  538 + where: {
  539 + access_token: accessToken,
  540 + resName: $("#bustype_reslist_keyword").val(),
  541 + busId: busId,
  542 + resHealth: $("#bustype_reslist_resStatus").val()
  543 + }
  544 + });
  545 + }
  546 +
  547 +
  548 + // 新增按钮
  549 + $("#bustype-reslist-add").click(function () {
  550 + var reslist = layui.reslist();
  551 + // 添加绑定页面的layerindex
  552 + var addResLayerIndex;
  553 + common.openWin("template/res/reslist", "添加绑定", {}, ["添加", "取消"], function () {
  554 + loading = layer.load(2);
  555 + // 当前选中的资源
  556 + var checks = reslist.getData();
  557 + if (checks.length ==0) {
  558 + layer.msg('请先选择资源后,再进行添加!', {icon: 7, time: 3000});
  559 + layer.close(loading);
  560 + return;
  561 + }
  562 + // 之前已经选择过的资源
  563 + var oldResIdList = [];
  564 + admin.req({
  565 + url: domainName + '/api-web/manage/bustype/resourceList/' + busId,
  566 + async: false,
  567 + error: function () {
  568 + layer.close(loading);
  569 + }
  570 + }).done(function (response) {
  571 + $.each(response.data, function (index, value) {
  572 + oldResIdList.push(value.resId);
  573 + });
  574 + });
  575 + // 需要进行插入的资源
  576 + var inserts = [];
  577 + var insertCount = 0;
  578 + var isExistCount = 0;
  579 + var resTypes=[];
  580 + var parentIds=[];
  581 + $.each(checks, function (index, value) {
  582 + if (oldResIdList.indexOf(value.resId) === -1) {
  583 + resTypes.push(value.resType);
  584 + parentIds.push(value.parentId);
  585 + inserts.push(value.resId);
  586 + insertCount++;
  587 + } else {
  588 + isExistCount++;
  589 + }
  590 + });
  591 + if (inserts.length === 0) {
  592 + layer.msg('所选的都已存在,无需重复添加!', {icon: 7, time: 5000});
  593 + layer.close(loading);
  594 + return;
  595 + }
  596 + var ArrIndex=[];
  597 + if(resTypes.length>0){
  598 + var identify=0;
  599 + $.each(resTypes,function (i,v) {
  600 + if(v=='MIDDLEWARE_WEBLOGIC' && parentIds[i]==''){
  601 + identify=1;
  602 + ArrIndex.push(i);
  603 + }
  604 + });
  605 + if(identify==1){
  606 + //询问框
  607 + layer.confirm('选择的资源中包含weblogic控制台,是否将控制台下的服务一起分配到当前业务下?', {
  608 + btn: ['是','否'] //按钮
  609 + }, function(){//是
  610 + //获得控制台下所有服务的resID
  611 + //如果选择将控制台下的服务一起分配到当前业务下
  612 + var arrResIds=[];
  613 + $.each(ArrIndex,function (i,v) {
  614 + arrResIds.push(inserts[v]);
  615 + })
  616 + var map={
  617 + resIds: arrResIds.toString()
  618 + };
  619 + admin.req({
  620 + url: common.domainName + '/api-web/bResource/resourceByResId?access_token='+accessToken,
  621 + type:'post',
  622 + data:JSON.stringify(map),
  623 + contentType: "application/json;charset=utf-8",
  624 + async:false,
  625 + error: function () {
  626 + layer.msg('获取控制台下所有服务失败', {icon: 2});
  627 + layer.close(layer.index);
  628 + }
  629 + }).done(function (response) {
  630 + if(response.success && response.data && response.data.length>0){
  631 + $.each(response.data,function (i,v) {
  632 + inserts.push(v.resId);
  633 + insertCount++;
  634 + });
  635 + }
  636 + inserts=Array.from(new Set(inserts));
  637 + isExistCount = insertCount-inserts;
  638 + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType);
  639 + layer.close(layer.index);
  640 + })
  641 + }, function(){//否
  642 + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType);
  643 + layer.close(layer.index);
  644 + });
  645 + }else{
  646 + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType);
  647 + }
  648 + }
  649 +
  650 + }, null, ['90%', '80%'], function (layero, layerIndex) {
  651 + addResLayerIndex = layerIndex
  652 + });
  653 + });
  654 + // 取消绑定按钮
  655 + $("#bustype-reslist-unbind").click(function () {
  656 + // 需要取消绑定的资源id集合
  657 + var deletes = [];
  658 + var resTypes=[];
  659 + var parentIds=[];
  660 + $.each(table.checkStatus('bustype_reslist_resListTable').data, function (index, value) {
  661 + deletes.push(value.resId);
  662 + resTypes.push(value.resType);
  663 + parentIds.push(value.parentId);
  664 + });
  665 + if(deletes.length<1){
  666 + layer.msg('请选择要解除绑定的数据!', {icon: 7, time: 3000});
  667 + layer.close(loading);
  668 + return;
  669 + }
  670 + var ArrIndex=[];
  671 + if(resTypes.length>0){
  672 + var identify=0;
  673 + $.each(resTypes,function (i,v) {
  674 + if(v=='MIDDLEWARE_WEBLOGIC' && parentIds[i]==''){
  675 + identify=1;
  676 + ArrIndex.push(i);
  677 + }
  678 + });
  679 + if(identify==1){
  680 + //询问框
  681 + layer.confirm('选择的资源中包含weblogic控制台,是否将控制台下的服务一起取消?', {
  682 + btn: ['是','否'] //按钮
  683 + }, function(){//是
  684 + //获得控制台下所有服务的resID
  685 + //如果选择将控制台下的服务一起取消
  686 + var arrResIds=[];
  687 + $.each(ArrIndex,function (i,v) {
  688 + arrResIds.push(deletes[v]);
  689 + })
  690 + var map={
  691 + resIds: arrResIds.toString()
  692 + };
  693 + admin.req({
  694 + url: common.domainName + '/api-web/bResource/resourceByResId?access_token='+accessToken,
  695 + type:'post',
  696 + data:JSON.stringify(map),
  697 + contentType: "application/json;charset=utf-8",
  698 + async:false,
  699 + error: function () {
  700 + layer.msg('获取控制台下所有服务失败', {icon: 2});
  701 + layer.close(layer.index);
  702 + }
  703 + }).done(function (response) {
  704 + if(response.success && response.data && response.data.length>0){
  705 + $.each(response.data,function (i,v) {
  706 + deletes.push(v.resId);
  707 + });
  708 + }
  709 + deletes=Array.from(new Set(deletes));
  710 + del(busId,deletes,resType);
  711 + layer.close(layer.index);
  712 + })
  713 + }, function(){//否
  714 + del(busId,deletes,resType);
  715 + layer.close(layer.index);
  716 + });
  717 + }else{
  718 + del(busId,deletes,resType);
  719 + }
  720 + }
  721 +
  722 + });
  723 + },
  724 + yes: function (index) {
  725 + layer.close(index);
  726 + }
  727 + });
  728 + });
  729 + });
  730 + }
  731 +
  732 + //授权页面
  733 + function authorizationIndex(busId) {
  734 + if ($.inArray('back:bustype:impower', checkList) == -1) {
  735 + layer.closeAll();
  736 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  737 + return;
  738 + }
  739 + var params = {
  740 + oldUsers: [],
  741 + bindUrl: '/api-web/manage/bustype/bindUser/' + busId,
  742 + unBindUrl: '/api-web/manage/bustype/unBindUser/' + busId
  743 + };
  744 + // 获取当前资源类型的权限用于回显
  745 + admin.req({
  746 + url: domainName + '/api-web/manage/bustype/getUsersByBusId',
  747 + async: false,
  748 + data: {
  749 + busId: busId
  750 + }
  751 + }).done(function (response) {
  752 + $.each(response.data, function (index, value) {
  753 + params.oldUsers.push(value.userAccount);
  754 + })
  755 + return false;
  756 + });
  757 + layer.close(loading);
  758 + var userlist;
  759 + layer.open({
  760 + title: '授权',
  761 + id: 'busType-role-config-layer',
  762 + type: 1,
  763 + area: ['80%', '90%'],
  764 + btn: ['关闭'],
  765 + scrollbar: false,
  766 + success: function () {
  767 + view(this.id).render('/template/user/userlist').done(function () {
  768 + userlist = layui.userlist(params);
  769 + });
  770 + },
  771 + yes: function (index, layero) {
  772 + layer.close(index);
  773 + }
  774 + });
  775 + }
  776 +
  777 + // 新增按钮
  778 + $('#bustype-create').click(function () {
  779 + if ($.inArray('back:bustype:save', checkList) == -1) {
  780 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  781 + return;
  782 + }
  783 + saveBusType();
  784 + });
  785 +
  786 + // 刷新表格按钮
  787 + $('#btn-bustype-reload-table').click(function () {
  788 + loadBusTypeTable();
  789 + });
  790 +
  791 + /**
  792 + * 新增或者编辑业务类型
  793 + *
  794 + * @param busTypeCode 业务类型编号
  795 + */
  796 + function saveBusType(busTypeCode) {
  797 + // 打开(新增/编辑)窗口
  798 + common.openWin('/baseconfig/bustype/add', '<a class="layui-icon layui-icon-edit win_title_icon"></a>' + busTypeCode ? '编辑' : '新增',
  799 + {busTypeCode: busTypeCode}, ['保存', '取消'], function () {
  800 + $('#btn-bustype-submit').click();
  801 + }, null, ['40%', 'auto']);
  802 + }
  803 +
  804 + function deleteBusTypeByIds(busIds) {
  805 + if ($.inArray('back:bustype:delete', checkList) == -1) {
  806 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  807 + return;
  808 + }
  809 + if (busIds.length == 0) {
  810 + layer.msg('请先选择数据,再点击删除。', {icon: 0, timeout: 3000});
  811 + return;
  812 + }
  813 + layer.confirm('确认要删除吗?', {icon: 3, title: '提示'}, function () {
  814 + loading = layer.load(2);
  815 + admin.req({
  816 + url: domainName + '/api-web/manage/bustype/deleteByIds?access_token=' + accessToken,
  817 + type: 'POST',
  818 + contentType: 'application/json',
  819 + data: JSON.stringify(busIds),
  820 + success: function () {
  821 + layer.close(loading);
  822 + },
  823 + error: function () {
  824 + layer.close(loading);
  825 + }
  826 + }).done(function (response) {
  827 + if (response.success) {
  828 + layer.msg('删除成功!', {icon: 1, time: 3000});
  829 + loadBusTypeTable();
  830 + } else {
  831 + layer.msg('删除失败!', {icon: 2, time: 3000});
  832 + }
  833 + });
  834 + });
  835 + }
  836 + //添加绑定
  837 + function add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType) {
  838 + // 发送请求添加绑定
  839 + admin.req({
  840 + url: domainName + '/api-web/manage/bustype/addResource/' + busId + '?access_token=' + accessToken,
  841 + type: 'POST',
  842 + async: false,
  843 + contentType: 'application/json',
  844 + data: JSON.stringify(inserts),
  845 + error: function () {
  846 + layer.close(layer.index);
  847 + }
  848 + }).done(function (response) {
  849 + layer.close(loading);
  850 + if (response.success) {
  851 + layer.msg('添加绑定成功!此次添加了' + insertCount + '个新资源' + (isExistCount > 0 ? ',有' + isExistCount + '个已经存在。' : ''), {icon: 1, time: 5000});
  852 + layer.close(addResLayerIndex);
  853 + reloadTable(resType,busId);
  854 + } else {
  855 + layer.msg('添加绑定失败!', {icon: 2, time: 3000});
  856 + }
  857 + });
  858 + }
  859 +
  860 + //取消绑定
  861 + function del(busId,deletes,resType) {
  862 + admin.req({
  863 + url: domainName + '/api-web/manage/bustype/deleteResource/' + busId + '?access_token=' + accessToken,
  864 + type: 'POST',
  865 + async: false,
  866 + contentType: 'application/json',
  867 + data: JSON.stringify(deletes)
  868 + }).done(function (response) {
  869 + if (response.success) {
  870 + layer.msg('取消绑定成功!', {icon: 1, time: 3000});
  871 +
  872 + reloadTable(resType,busId);
  873 + } else {
  874 + layer.msg('取消绑定失败!', {icon: 2, time: 3000});
  875 + }
  876 + });
  877 + }
  878 + //获取展示类型的字典数据
  879 + function initShowType(){
  880 + if(mode){//如果不展示字段就不去请求
  881 + admin.req({
  882 + url: domainName + '/api-web/manage/ddic/findSucDdics/DETAILS_POWER'
  883 + , method: 'POST'
  884 + , async: false
  885 + , success: function (res) {
  886 + $.each(res.data, function (i, v) {
  887 + showTypeList.push({
  888 + name: v.ddicName
  889 + ,value: v.ddicCode.substring(v.ddicCode.lastIndexOf("_")+1,v.ddicCode.length)
  890 + })
  891 + });
  892 + }
  893 + });
  894 + }
  895 + }
  896 + //刷新表格
  897 + function reloadTable(resType,busId) {
  898 + table.reload('bustype_reslist_resListTable', {
  899 + url: common.domainName + '/api-web/home/res-list/' + (resType ? resType : 'all'),
  900 + where: {
  901 + access_token: accessToken,
  902 + resName: $("#bustype_reslist_keyword").val(),
  903 + busId: busId,
  904 + resHealth: $("#bustype_reslist_resStatus").val()
  905 + }
  906 + });
  907 + }
  908 + //获取选中的数据
  909 + function getCheckData() {
  910 + if(mode){
  911 + //获取改变的值
  912 + var str='';
  913 + var $tr=$('#bustype-table').next().find('tbody tr');
  914 + $.each($tr,function (i,v) {
  915 + var $btn=$(this).find('.btn-bustype-unbind');
  916 + var showType=$(this).find('.resourceType_showType') && $(this).find('.resourceType_showType').eq(0) && $(this).find('.resourceType_showType').eq(0).val() ? $(this).find('.resourceType_showType').eq(0).val():'<';
  917 + if(!$btn.hasClass('hide')){
  918 + str += $btn.attr("data-id")+'_'+showType+',';
  919 + }
  920 + });
  921 + if(str!=''){
  922 + str=str.substring(0,str.length-1);
  923 + }
  924 + return str;
  925 + }else{
  926 + return busTypeTable.checkStatus(false);
  927 + }
  928 +
  929 + }
  930 +
  931 + return {getData: getCheckData};
  932 + });
  933 +});
  1 +/**
  2 +
  3 + @Name:layuiAdmin 核心模块
  4 + @Author:贤心
  5 + @Site:http://www.layui.com/admin/
  6 + @License:LPPL
  7 +
  8 + */
  9 +
  10 +layui.define(['view'], function(exports){
  11 + var $ = layui.jquery
  12 + ,laytpl = layui.laytpl
  13 + ,element = layui.element
  14 + ,setter = layui.setter
  15 + ,view = layui.view
  16 + ,layer = layui.layer
  17 + ,sessions = layui.sessions
  18 + ,device = layui.device()
  19 +
  20 + ,$win = $(window), $body = $('body')
  21 + ,container = $('#'+ setter.container)
  22 +
  23 + ,SHOW = 'layui-show', HIDE = 'layui-hide', THIS = 'layui-this', DISABLED = 'layui-disabled', TEMP = 'template'
  24 + ,APP_BODY = '#LAY_app_body', APP_FLEXIBLE = 'LAY_app_flexible'
  25 + ,FILTER_TAB_TBAS = 'layadmin-layout-tabs'
  26 + ,APP_SPREAD_SM = 'layadmin-side-spread-sm', TABS_BODY = 'layadmin-tabsbody-item'
  27 + ,ICON_SHRINK = 'layui-icon-shrink-right', ICON_SPREAD = 'layui-icon-spread-left'
  28 + ,SIDE_SHRINK = 'layadmin-side-shrink', SIDE_MENU = 'LAY-system-side-menu'
  29 + // ,accessToken = sessions.getToken()['access_token']
  30 +
  31 + //通用方法
  32 + ,admin = {
  33 + domainName: sessionStorage.getItem('domainName'), // gateway地址
  34 + v: '1.2.1 pro'
  35 +
  36 + //数据的异步请求
  37 + ,req: view.req
  38 +
  39 + //清除本地 token,并跳转到登入页
  40 + ,exit: view.exit
  41 +
  42 + //xss 转义
  43 + ,escape: function(html){
  44 + return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
  45 + .replace(/</g, '&lt;').replace(/>/g, '&gt;')
  46 + .replace(/'/g, '&#39;').replace(/"/g, '&quot;');
  47 + }
  48 +
  49 + //事件监听
  50 + ,on: function(events, callback){
  51 + return layui.onevent.call(this, setter.MOD_NAME, events, callback);
  52 + }
  53 +
  54 + //弹出面板
  55 + ,popup: view.popup
  56 +
  57 + //右侧面板
  58 + ,popupRight: function(options){
  59 + //layer.close(admin.popup.index);
  60 + return admin.popup.index = layer.open($.extend({
  61 + type: 1
  62 + ,id: 'LAY_adminPopupR'
  63 + ,anim: -1
  64 + ,title: false
  65 + ,closeBtn: false
  66 + ,offset: 'r'
  67 + ,shade: 0.1
  68 + ,shadeClose: true
  69 + ,skin: 'layui-anim layui-anim-rl layui-layer-adminRight'
  70 + ,area: '300px'
  71 + }, options));
  72 + }
  73 +
  74 + //发送验证码
  75 + ,sendAuthCode: function(options){
  76 + options = $.extend({
  77 + seconds: 60
  78 + ,elemPhone: '#LAY_phone'
  79 + ,elemVercode: '#LAY_vercode'
  80 + }, options);
  81 +
  82 + var seconds = options.seconds
  83 + ,token = null
  84 + ,timer, countDown = function(loop){
  85 + var btn = $(options.elem)
  86 + seconds--;
  87 + if(seconds < 0){
  88 + btn.removeClass(DISABLED).html('获取验证码');
  89 + seconds = options.seconds;
  90 + clearInterval(timer);
  91 + } else {
  92 + btn.addClass(DISABLED).html(seconds + '秒后重获');
  93 + }
  94 +
  95 + if(!loop){
  96 + timer = setInterval(function(){
  97 + countDown(true);
  98 + }, 1000);
  99 + }
  100 + };
  101 +
  102 + $body.off('click', options.elem).on('click', options.elem, function(){
  103 + options.elemPhone = $(options.elemPhone);
  104 + options.elemVercode = $(options.elemVercode);
  105 +
  106 + var elemPhone = options.elemPhone
  107 + ,value = elemPhone.val();
  108 +
  109 + if(seconds !== options.seconds || $(this).hasClass(DISABLED)) return;
  110 +
  111 + if(!/^1\d{10}$/.test(value)){
  112 + elemPhone.focus();
  113 + return layer.msg('请输入正确的手机号')
  114 + };
  115 +
  116 + if(typeof options.ajax === 'object'){
  117 + var success = options.ajax.success;
  118 + delete options.ajax.success;
  119 + }
  120 +
  121 + admin.req($.extend(true, {
  122 + url: '/auth/code'
  123 + ,type: 'get'
  124 + ,data: {
  125 + phone: value
  126 + }
  127 + ,success: function(res){
  128 + layer.msg('验证码已发送至你的手机,请注意查收', {
  129 + icon: 1
  130 + ,shade: 0
  131 + });
  132 + options.elemVercode.focus();
  133 + countDown();
  134 + success && success(res);
  135 + }
  136 + }, options.ajax));
  137 + });
  138 + }
  139 +
  140 + //屏幕类型
  141 + ,screen: function(){
  142 + var width = $win.width();
  143 + if(width > 1200){
  144 + return 3; //大屏幕
  145 + } else if(width > 992){
  146 + return 2; //中屏幕
  147 + } else if(width > 768){
  148 + return 1; //小屏幕
  149 + } else {
  150 + return 0; //超小屏幕
  151 + }
  152 + }
  153 +
  154 + //侧边伸缩
  155 + ,sideFlexible: function(status){
  156 + var app = container
  157 + ,iconElem = $('#'+ APP_FLEXIBLE)
  158 + ,screen = admin.screen();
  159 +
  160 + //设置状态,PC:默认展开、移动:默认收缩
  161 + if(status === 'spread'){
  162 + //切换到展开状态的 icon,箭头:←
  163 + iconElem.removeClass(ICON_SPREAD).addClass(ICON_SHRINK);
  164 +
  165 + //移动:从左到右位移;PC:清除多余选择器恢复默认
  166 + if(screen < 2){
  167 + app.addClass(APP_SPREAD_SM);
  168 + } else {
  169 + app.removeClass(APP_SPREAD_SM);
  170 + }
  171 +
  172 + app.removeClass(SIDE_SHRINK)
  173 + } else {
  174 + //切换到搜索状态的 icon,箭头:→
  175 + iconElem.removeClass(ICON_SHRINK).addClass(ICON_SPREAD);
  176 +
  177 + //移动:清除多余选择器恢复默认;PC:从右往左收缩
  178 + if(screen < 2){
  179 + app.removeClass(SIDE_SHRINK);
  180 + } else {
  181 + app.addClass(SIDE_SHRINK);
  182 + }
  183 +
  184 + app.removeClass(APP_SPREAD_SM)
  185 + }
  186 +
  187 + layui.event.call(this, setter.MOD_NAME, 'side({*})', {
  188 + status: status
  189 + });
  190 + }
  191 +
  192 + //重置主体区域表格尺寸
  193 + ,resizeTable: function(delay){
  194 + var that = this, runResizeTable = function(){
  195 + that.tabsBody(admin.tabsPage.index).find('.layui-table-view').each(function(){
  196 + var tableID = $(this).attr('lay-id');
  197 + layui.table.resize(tableID);
  198 + });
  199 + };
  200 + if(!layui.table) return;
  201 + delay ? setTimeout(runResizeTable, delay) : runResizeTable();
  202 + }
  203 +
  204 + //主题设置
  205 + ,theme: function(options){
  206 + var theme = setter.theme
  207 + ,local = layui.data(setter.tableName)
  208 + ,id = 'LAY_layadmin_theme'
  209 + ,style = document.createElement('style')
  210 + ,styleText = laytpl([
  211 + //主题色
  212 + '.layui-side-menu,'
  213 + ,'.layadmin-pagetabs .layui-tab-title li:after,'
  214 + ,'.layadmin-pagetabs .layui-tab-title li.layui-this:after,'
  215 + ,'.layui-layer-admin .layui-layer-title,'
  216 + ,'.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child'
  217 + ,'{background-color:{{d.color.main}} !important;}'
  218 +
  219 + //选中色
  220 + ,'.layui-nav-tree .layui-this,'
  221 + ,'.layui-nav-tree .layui-this>a,'
  222 + ,'.layui-nav-tree .layui-nav-child dd.layui-this,'
  223 + ,'.layui-nav-tree .layui-nav-child dd.layui-this a'
  224 + ,'{background-color:{{d.color.selected}} !important;}'
  225 +
  226 + //logo
  227 + ,'.layui-layout-admin .layui-logo{background-color:{{d.color.logo || d.color.main}} !important;}'
  228 +
  229 + //头部色
  230 + ,'{{# if(d.color.header){ }}'
  231 + ,'.layui-layout-admin .layui-header{background-color:{{ d.color.header }};}'
  232 + ,'.layui-layout-admin .layui-header a,'
  233 + ,'.layui-layout-admin .layui-header a cite{color: #f8f8f8;}'
  234 + ,'.layui-layout-admin .layui-header a:hover{color: #fff;}'
  235 + ,'.layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color: #fbfbfb;}'
  236 + ,'.layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color: transparent; border-bottom-color: #fbfbfb;}'
  237 + ,'.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar{background-color: #fff; background-color: rgba(255,255,255,.5);}'
  238 + ,'.layadmin-pagetabs .layui-tab-title li:after{display: none;}'
  239 + ,'{{# } }}'
  240 + ].join('')).render(options = $.extend({}, local.theme, options))
  241 + ,styleElem = document.getElementById(id);
  242 +
  243 + //添加主题样式
  244 + if('styleSheet' in style){
  245 + style.setAttribute('type', 'text/css');
  246 + style.styleSheet.cssText = styleText;
  247 + } else {
  248 + style.innerHTML = styleText;
  249 + }
  250 + style.id = id;
  251 +
  252 + styleElem && $body[0].removeChild(styleElem);
  253 + $body[0].appendChild(style);
  254 + $body.attr('layadmin-themealias', options.color.alias);
  255 +
  256 + //本地存储记录
  257 + local.theme = local.theme || {};
  258 + layui.each(options, function(key, value){
  259 + local.theme[key] = value;
  260 + });
  261 + layui.data(setter.tableName, {
  262 + key: 'theme'
  263 + ,value: local.theme
  264 + });
  265 + }
  266 +
  267 + //初始化主题
  268 + ,initTheme: function(index){
  269 + var theme = setter.theme;
  270 + index = index || 0;
  271 + if(theme.color[index]){
  272 + theme.color[index].index = index;
  273 + admin.theme({
  274 + color: theme.color[index]
  275 + });
  276 + }
  277 + }
  278 +
  279 + //记录最近一次点击的页面标签数据
  280 + ,tabsPage: {}
  281 + //wtc 给主页判断使用
  282 + ,mainTabsPage: {}
  283 + //获取标签页的头元素
  284 + ,tabsHeader: function(index){
  285 + return $('#LAY_app_tabsheader').children('li').eq(index || 0);
  286 + }
  287 +
  288 + //获取页面标签主体元素
  289 + ,tabsBody: function(index){
  290 + return $(APP_BODY).find('.'+ TABS_BODY).eq(index || 0);
  291 + }
  292 +
  293 + //切换页面标签主体
  294 + ,tabsBodyChange: function(index){
  295 + admin.tabsHeader(index).attr('lay-attr', layui.router().href);
  296 + admin.tabsBody(index).addClass(SHOW).siblings().removeClass(SHOW);
  297 + events.rollPage('auto', index);
  298 + }
  299 +
  300 + //resize事件管理
  301 + ,resize: function(fn){
  302 + var router = layui.router()
  303 + ,key = router.path.join('-');
  304 +
  305 + if(admin.resizeFn[key]){
  306 + $win.off('resize', admin.resizeFn[key]);
  307 + delete admin.resizeFn[key];
  308 + }
  309 +
  310 + if(fn === 'off') return; //如果是清除 resize 事件,则终止往下执行
  311 +
  312 + fn(), admin.resizeFn[key] = fn;
  313 + $win.on('resize', admin.resizeFn[key]);
  314 + }
  315 + ,resizeFn: {}
  316 + ,runResize: function(){
  317 + var router = layui.router()
  318 + ,key = router.path.join('-');
  319 + admin.resizeFn[key] && admin.resizeFn[key]();
  320 + }
  321 + ,delResize: function(){
  322 + this.resize('off');
  323 + }
  324 +
  325 + //关闭当前 pageTabs
  326 + ,closeThisTabs: function(){
  327 + if(!admin.tabsPage.index) return;
  328 + $(TABS_HEADER).eq(admin.tabsPage.index).find('.layui-tab-close').trigger('click');
  329 + }
  330 +
  331 + //全屏
  332 + ,fullScreen: function(){
  333 + var ele = document.documentElement
  334 + ,reqFullScreen = ele.requestFullScreen || ele.webkitRequestFullScreen
  335 + || ele.mozRequestFullScreen || ele.msRequestFullscreen;
  336 + if(typeof reqFullScreen !== 'undefined' && reqFullScreen) {
  337 + reqFullScreen.call(ele);
  338 + };
  339 + }
  340 +
  341 + //退出全屏
  342 + ,exitScreen: function(){
  343 + var ele = document.documentElement
  344 + if (document.exitFullscreen) {
  345 + document.exitFullscreen();
  346 + } else if (document.mozCancelFullScreen) {
  347 + document.mozCancelFullScreen();
  348 + } else if (document.webkitCancelFullScreen) {
  349 + document.webkitCancelFullScreen();
  350 + } else if (document.msExitFullscreen) {
  351 + document.msExitFullscreen();
  352 + }
  353 + }
  354 +
  355 + //纠正单页路由格式
  356 + ,correctRouter: function(href){
  357 + if(!/^\//.test(href)) href = '/' + href;
  358 +
  359 + //纠正首尾
  360 + return href.replace(/^(\/+)/, '/')
  361 + .replace(new RegExp('\/' + setter.entry + '$'), '/'); //过滤路由最后的默认视图文件名(如:index)
  362 + }
  363 +
  364 + //……
  365 + };
  366 +
  367 + //事件
  368 + var events = admin.events = {
  369 + //伸缩
  370 + flexible: function(othis){
  371 + var iconElem = othis.find('#'+ APP_FLEXIBLE)
  372 + ,isSpread = iconElem.hasClass(ICON_SPREAD);
  373 + admin.sideFlexible(isSpread ? 'spread' : null); //控制伸缩
  374 + admin.resizeTable(350);
  375 +
  376 + setTimeout(function () {
  377 + // 伸缩导致页面变化重新绘制下页面上对尺寸敏感的元素
  378 + window.resizeEventFn();
  379 + }, 500);
  380 + }
  381 +
  382 + //刷新
  383 + ,refresh: function(){
  384 + layui.index.render();
  385 + }
  386 +
  387 + //输入框搜索
  388 + ,serach: function(othis){
  389 + othis.off('keypress').on('keypress',function(e){
  390 + if(!this.value.replace(/\s/g, '')) return;
  391 + //回车跳转
  392 + if(e.keyCode === 13){
  393 + var href = othis.attr('lay-action')
  394 + ,text = othis.attr('lay-text') || '搜索';
  395 +
  396 + href = href + this.value;
  397 + text = text + ' <span style="color: #FF5722;">'+ admin.escape(this.value) +'</span>';
  398 +
  399 + //打开标签页
  400 + location.hash = admin.correctRouter(href)
  401 +
  402 + //如果搜索关键词已经打开,则刷新页面即可
  403 + events.serach.keys || (events.serach.keys = {});
  404 + events.serach.keys[admin.tabsPage.index] = this.value;
  405 + if(this.value === events.serach.keys[admin.tabsPage.index]){
  406 + events.refresh(othis);
  407 + }
  408 +
  409 + //清空输入框
  410 + this.value = '';
  411 + }
  412 + });
  413 + }
  414 +
  415 + //点击消息
  416 + ,message: function(othis){
  417 + othis.find('.layui-badge-dot').remove();
  418 + }
  419 +
  420 + //弹出主题面板
  421 + ,theme: function(){
  422 + admin.popupRight({
  423 + id: 'LAY_adminPopupTheme'
  424 + ,success: function(){
  425 + view(this.id).render('system/theme')
  426 + }
  427 + });
  428 + }
  429 +
  430 + //便签
  431 + ,note: function(othis){
  432 + var mobile = admin.screen() < 2
  433 + ,note = layui.data(setter.tableName).note;
  434 +
  435 + events.note.index = admin.popup({
  436 + title: '便签'
  437 + ,shade: 0
  438 + ,offset: [
  439 + '41px'
  440 + ,(mobile ? null : (othis.offset().left - 250) + 'px')
  441 + ]
  442 + ,anim: -1
  443 + ,id: 'LAY_adminNote'
  444 + ,skin: 'layadmin-note layui-anim layui-anim-upbit'
  445 + ,content: '<textarea placeholder="内容"></textarea>'
  446 + ,resize: false
  447 + ,success: function(layero, index){
  448 + var textarea = layero.find('textarea')
  449 + ,value = note === undefined ? '便签中的内容会存储在本地,这样即便你关掉了浏览器,在下次打开时,依然会读取到上一次的记录。是个非常小巧实用的本地备忘录' : note;
  450 +
  451 + textarea.val(value).focus().on('keyup', function(){
  452 + layui.data(setter.tableName, {
  453 + key: 'note'
  454 + ,value: this.value
  455 + });
  456 + });
  457 + }
  458 + })
  459 + }
  460 +
  461 + //全屏
  462 + ,fullscreen: function(othis){
  463 + var SCREEN_FULL = 'layui-icon-screen-full'
  464 + ,SCREEN_REST = 'layui-icon-screen-restore'
  465 + ,iconElem = othis.children("i");
  466 +
  467 + if(iconElem.hasClass(SCREEN_FULL)){
  468 + admin.fullScreen();
  469 + iconElem.addClass(SCREEN_REST).removeClass(SCREEN_FULL);
  470 + } else {
  471 + admin.exitScreen();
  472 + iconElem.addClass(SCREEN_FULL).removeClass(SCREEN_REST);
  473 + }
  474 + }
  475 +
  476 + //弹出关于面板
  477 + ,about: function(){
  478 + admin.popupRight({
  479 + id: 'LAY_adminPopupAbout'
  480 + ,success: function(){
  481 + view(this.id).render('system/about')
  482 + }
  483 + });
  484 + }
  485 +
  486 + //弹出更多面板
  487 + ,more: function(){
  488 + admin.popupRight({
  489 + id: 'LAY_adminPopupMore'
  490 + ,success: function(){
  491 + view(this.id).render('system/more')
  492 + }
  493 + });
  494 + }
  495 +
  496 + //返回上一页
  497 + ,back: function(){
  498 + history.back();
  499 + }
  500 +
  501 + //主题设置
  502 + ,setTheme: function(othis){
  503 + var index = othis.data('index')
  504 + ,nextIndex = othis.siblings('.layui-this').data('index');
  505 +
  506 + if(othis.hasClass(THIS)) return;
  507 +
  508 + othis.addClass(THIS).siblings('.layui-this').removeClass(THIS);
  509 + admin.initTheme(index);
  510 + }
  511 +
  512 + //左右滚动页面标签
  513 + ,rollPage: function(type, index){
  514 + var tabsHeader = $('#LAY_app_tabsheader')
  515 + ,liItem = tabsHeader.children('li')
  516 + ,scrollWidth = tabsHeader.prop('scrollWidth')
  517 + ,outerWidth = tabsHeader.outerWidth()
  518 + ,tabsLeft = parseFloat(tabsHeader.css('left'));
  519 +
  520 + //右左往右
  521 + if(type === 'left'){
  522 + if(!tabsLeft && tabsLeft <=0) return;
  523 +
  524 + //当前的left减去可视宽度,用于与上一轮的页标比较
  525 + var prefLeft = -tabsLeft - outerWidth;
  526 +
  527 + liItem.each(function(index, item){
  528 + var li = $(item)
  529 + ,left = li.position().left;
  530 +
  531 + if(left >= prefLeft){
  532 + tabsHeader.css('left', -left);
  533 + return false;
  534 + }
  535 + });
  536 + } else if(type === 'auto'){ //自动滚动
  537 + (function(){
  538 + var thisLi = liItem.eq(index), thisLeft;
  539 +
  540 + if(!thisLi[0]) return;
  541 + thisLeft = thisLi.position().left;
  542 +
  543 + //当目标标签在可视区域左侧时
  544 + if(thisLeft < -tabsLeft){
  545 + return tabsHeader.css('left', -thisLeft);
  546 + }
  547 +
  548 + //当目标标签在可视区域右侧时
  549 + if(thisLeft + thisLi.outerWidth() >= outerWidth - tabsLeft){
  550 + var subLeft = thisLeft + thisLi.outerWidth() - (outerWidth - tabsLeft);
  551 + liItem.each(function(i, item){
  552 + var li = $(item)
  553 + ,left = li.position().left;
  554 +
  555 + //从当前可视区域的最左第二个节点遍历,如果减去最左节点的差 > 目标在右侧不可见的宽度,则将该节点放置可视区域最左
  556 + if(left + tabsLeft > 0){
  557 + if(left - tabsLeft > subLeft){
  558 + tabsHeader.css('left', -left);
  559 + return false;
  560 + }
  561 + }
  562 + });
  563 + }
  564 + }());
  565 + } else {
  566 + //默认向左滚动
  567 + liItem.each(function(i, item){
  568 + var li = $(item)
  569 + ,left = li.position().left;
  570 +
  571 + if(left + li.outerWidth() >= outerWidth - tabsLeft){
  572 + tabsHeader.css('left', -left);
  573 + return false;
  574 + }
  575 + });
  576 + }
  577 + }
  578 + , globalSearch: function (type, index) {
  579 + var othis = $(this);
  580 + var href="globalSearch/index"
  581 + //搜索框检索,暂时不用
  582 + // var keywords = $('#allSearchKeywords').val();
  583 + // if (keywords.trim() === '') {
  584 + // return false;
  585 + // } else {
  586 + // var loading = layer.load(2);
  587 + // $.ajax({
  588 + // url: admin.domainName + '/api-web/home/hasResult?keywords=' + keywords + '&access_token=' + localStorage.getItem('access_token'),
  589 + // type: 'get',
  590 + // async: false,
  591 + // success: function (res) {
  592 + // layer.close(loading);
  593 + // if (res) {
  594 + // if (res.count === 0) {
  595 + // layer.msg('未查到任何数据!', { offset: '15px' , icon: 7, time: 2000});
  596 + // } else {
  597 + // admin.tabsPage.elem = othis;
  598 + // //执行跳转
  599 + // sessionStorage.setItem('keywords',keywords);
  600 + // href = admin.correctRouter(href);
  601 + // if(location.hash !== '#' + href) {
  602 + // location.hash = href;
  603 + // } else {
  604 + // layui.index.render();
  605 + // }
  606 + // }
  607 + // }
  608 + // }
  609 + // })
  610 + // }
  611 + layer.prompt({
  612 + id: "all_search_id",
  613 + title: '全局关键字搜索',
  614 + formType: 0,
  615 + area: ['300px','200px'],
  616 + offset: 'auto'
  617 + }, function (value, index) {
  618 + if (value.trim() !== '') {
  619 + layer.close(index);
  620 + var loading = layer.load(2);
  621 + $.ajax({
  622 + url: admin.domainName + '/api-web/home/hasResult?keywords=' + value + '&access_token=' + localStorage.getItem('access_token'),
  623 + type: 'get',
  624 + async: false,
  625 + success: function (res) {
  626 + layer.close(loading);
  627 + if (res) {
  628 + if (res.count === 0) {
  629 + layer.msg('未查到任何数据!', { offset: '15px' , icon: 7, time: 2000});
  630 + } else {
  631 + admin.tabsPage.elem = othis;
  632 + //执行跳转
  633 + sessionStorage.setItem('keywords',value);
  634 + href = admin.correctRouter(href);
  635 + if(location.hash !== '#' + href) {
  636 + location.hash = href;
  637 + } else {
  638 + layui.index.render();
  639 + }
  640 + }
  641 + }
  642 + }
  643 + })
  644 + } else {
  645 + return false;
  646 + }
  647 + });
  648 + $("#all_search_id").find('input.layui-layer-input').attr("placeholder", "关键字查询(必填)").attr("autocomplete","off");
  649 + $("#all_search_id").find('input.layui-layer-input').attr("id", "allSearchConfirm");
  650 + $("#all_search_id").find('input.layui-layer-input').css("width",'96%');
  651 + $("#all_search_id").append('<br/>' +
  652 + '<div style="margin-top: 25px"><span>注:支持资源名称、别名、资源类型、业务类型、ip地址等关键字查询!</span></div>');
  653 + //全局搜索框弹窗回车事件
  654 + $("#all_search_id").find('input.layui-layer-input').keydown(function (e) {
  655 + if (e.keyCode === 13) {
  656 + $("#all_search_id").next().next().find('.layui-layer-btn0').trigger("click");
  657 + }
  658 + })
  659 +
  660 + }
  661 + , toBigScreen: function () {
  662 + window.open(sessionStorage.getItem("bigScreen") + '?access_token=' + localStorage.getItem("access_token"));
  663 + }
  664 + , toYTHViewScreen: function () {
  665 + window.open(sessionStorage.getItem("ythView") + '?access_token=' + localStorage.getItem("access_token"));
  666 + }
  667 +
  668 + //向右滚动页面标签
  669 + , leftPage: function () {
  670 + events.rollPage('left');
  671 + }
  672 +
  673 + //向左滚动页面标签
  674 + , rightPage: function () {
  675 + events.rollPage();
  676 + }
  677 +
  678 + //关闭当前标签页
  679 + , closeThisTabs: function () {
  680 + admin.closeThisTabs();
  681 + }
  682 +
  683 + //关闭其它标签页
  684 + , closeOtherTabs: function (type) {
  685 + var TABS_REMOVE = 'LAY-system-pagetabs-remove';
  686 + if(type === 'all'){
  687 + $(TABS_HEADER+ ':gt(0)').remove();
  688 + $(APP_BODY).find('.'+ TABS_BODY+ ':gt(0)').remove();
  689 + } else {
  690 + $(TABS_HEADER).each(function(index, item){
  691 + if(index && index != admin.tabsPage.index){
  692 + $(item).addClass(TABS_REMOVE);
  693 + admin.tabsBody(index).addClass(TABS_REMOVE);
  694 + }
  695 + });
  696 + $('.'+ TABS_REMOVE).remove();
  697 + }
  698 + }
  699 +
  700 + //关闭全部标签页
  701 + ,closeAllTabs: function(){
  702 + events.closeOtherTabs('all');
  703 + location.hash = '';
  704 + }
  705 +
  706 + //遮罩
  707 + ,shade: function(){
  708 + admin.sideFlexible();
  709 + }
  710 + };
  711 +
  712 + //初始
  713 + !function(){
  714 + //主题初始化,本地主题记录优先,其次为 initColorIndex
  715 + var local = layui.data(setter.tableName);
  716 + if(local.theme){
  717 + admin.theme(local.theme);
  718 + } else if(setter.theme){
  719 + admin.initTheme(setter.theme.initColorIndex);
  720 + }
  721 +
  722 + //禁止水平滚动
  723 + $body.addClass('layui-layout-body');
  724 +
  725 + //移动端强制不开启页面标签功能
  726 + if(admin.screen() < 1){
  727 + delete setter.pageTabs;
  728 + }
  729 +
  730 + //不开启页面标签时
  731 + if(!setter.pageTabs){
  732 + container.addClass('layadmin-tabspage-none');
  733 + }
  734 +
  735 + //低版本IE提示
  736 + if(device.ie && device.ie < 10){
  737 + view.error('IE'+ device.ie + '下访问可能不佳,推荐使用:Chrome / Firefox / Edge 等高级浏览器', {
  738 + offset: 'auto'
  739 + ,id: 'LAY_errorIE'
  740 + });
  741 + }
  742 +
  743 + }();
  744 +
  745 + //admin.prevRouter = {}; //上一个路由
  746 +
  747 + //监听 hash 改变侧边状态
  748 + admin.on('hash(side)', function(router){
  749 + var path = router.path, getData = function(item){
  750 + return {
  751 + list: item.children('.layui-nav-child')
  752 + ,name: item.data('name')
  753 + ,jump: item.data('jump')
  754 + }
  755 + }
  756 + ,sideMenu = $('#'+ SIDE_MENU)
  757 + ,SIDE_NAV_ITEMD = 'layui-nav-itemed'
  758 +
  759 + //捕获对应菜单
  760 + ,matchMenu = function(list){
  761 + var pathURL = admin.correctRouter(path.join('/'));
  762 + list.each(function(index1, item1){
  763 + var othis1 = $(item1)
  764 + ,data1 = getData(othis1)
  765 + ,listChildren1 = data1.list.children('dd')
  766 + ,matched1 = path[0] == data1.name || (index1 === 0 && !path[0])
  767 + || (data1.jump && pathURL == admin.correctRouter(data1.jump));
  768 +
  769 + listChildren1.each(function(index2, item2){
  770 + var othis2 = $(item2)
  771 + ,data2 = getData(othis2)
  772 + ,listChildren2 = data2.list.children('dd')
  773 + ,matched2 = (path[0] == data1.name && path[1] == data2.name)
  774 + || (data2.jump && pathURL == admin.correctRouter(data2.jump));
  775 +
  776 + listChildren2.each(function(index3, item3){
  777 + var othis3 = $(item3)
  778 + ,data3 = getData(othis3)
  779 + ,matched3 = (path[0] == data1.name && path[1] == data2.name && path[2] == data3.name)
  780 + || (data3.jump && pathURL == admin.correctRouter(data3.jump))
  781 +
  782 + if(matched3){
  783 + var selected = data3.list[0] ? SIDE_NAV_ITEMD : THIS;
  784 + othis3.addClass(selected).siblings().removeClass(selected); //标记选择器
  785 + return false;
  786 + }
  787 +
  788 + });
  789 +
  790 + if(matched2){
  791 + var selected = data2.list[0] ? SIDE_NAV_ITEMD : THIS;
  792 + othis2.addClass(selected).siblings().removeClass(selected); //标记选择器
  793 + return false
  794 + }
  795 +
  796 + });
  797 +
  798 + if(matched1){
  799 + var selected = data1.list[0] ? SIDE_NAV_ITEMD : THIS;
  800 + if(selected !== SIDE_NAV_ITEMD){
  801 + othis1.addClass(selected).siblings().removeClass(selected); //标记选择器
  802 + }else{
  803 + othis1.addClass(selected);
  804 + }
  805 + // othis1.addClass(selected).siblings().removeClass(selected); //标记选择器
  806 + return false;
  807 + }
  808 +
  809 + });
  810 + }
  811 +
  812 + //重置状态
  813 + sideMenu.find('.'+ THIS).removeClass(THIS);
  814 +
  815 + //移动端点击菜单时自动收缩
  816 + if(admin.screen() < 2) admin.sideFlexible();
  817 +
  818 + //开始捕获
  819 + matchMenu(sideMenu.children('li'));
  820 + });
  821 +
  822 + //监听侧边导航点击事件
  823 + element.on('nav(layadmin-system-side-menu)', function(elem){
  824 + if(elem.siblings('.layui-nav-child')[0] && container.hasClass(SIDE_SHRINK)){
  825 + admin.sideFlexible('spread');
  826 + layer.close(elem.data('index'));
  827 + };
  828 + admin.tabsPage.type = 'nav';
  829 + admin.mainTabsPage.type = 'nav';
  830 + });
  831 +
  832 + //监听选项卡的更多操作
  833 + element.on('nav(layadmin-pagetabs-nav)', function(elem){
  834 + var dd = elem.parent();
  835 + dd.removeClass(THIS);
  836 + dd.parent().removeClass(SHOW);
  837 + });
  838 +
  839 + //同步路由
  840 + var setThisRouter = function(othis){
  841 + var layid = othis.attr('lay-id')
  842 + ,attr = othis.attr('lay-attr')
  843 + ,index = othis.index();
  844 +
  845 + location.hash = layid === setter.entry ? '/' : (attr || '/');
  846 + admin.tabsBodyChange(index);
  847 + }
  848 + ,TABS_HEADER = '#LAY_app_tabsheader>li';
  849 +
  850 + //页面标签点击
  851 + $body.on('click', TABS_HEADER, function(){
  852 + var othis = $(this)
  853 + ,index = othis.index();
  854 +
  855 + admin.tabsPage.type = 'tab';
  856 + admin.mainTabsPage.type = 'tab';
  857 + admin.tabsPage.index = index;
  858 +
  859 + //如果是iframe类型的标签页
  860 + if(othis.attr('lay-attr') === 'iframe'){
  861 + return admin.tabsBodyChange(index);
  862 + };
  863 +
  864 +
  865 + setThisRouter(othis); //同步路由
  866 + admin.runResize(); //执行resize事件,如果存在的话
  867 + admin.resizeTable(); //重置当前主体区域的表格尺寸
  868 + });
  869 +
  870 + //监听 tabspage 删除
  871 + element.on('tabDelete(layadmin-layout-tabs)', function(obj){
  872 + var othis = $(TABS_HEADER+ '.layui-this');
  873 +
  874 + obj.index && admin.tabsBody(obj.index).remove();
  875 + setThisRouter(othis);
  876 +
  877 + //移除resize事件
  878 + admin.delResize();
  879 + });
  880 +
  881 + //页面跳转
  882 + $body.on('click', '*[lay-href]', function(){
  883 + var othis = $(this)
  884 + ,href = othis.attr('lay-href')
  885 + ,router = layui.router();
  886 +
  887 + admin.tabsPage.elem = othis;
  888 + //admin.prevRouter[router.path[0]] = router.href; //记录上一次各菜单的路由信息
  889 +
  890 + //执行跳转
  891 + location.hash = admin.correctRouter(href);
  892 + });
  893 +
  894 + //点击事件
  895 + $body.on('click', '*[layadmin-event]', function(){
  896 + var othis = $(this)
  897 + ,attrEvent = othis.attr('layadmin-event');
  898 + events[attrEvent] && events[attrEvent].call(this, othis);
  899 + });
  900 +
  901 + //tips
  902 + $body.on('mouseenter', '*[lay-tips]', function(){
  903 + var othis = $(this);
  904 +
  905 + if(othis.parent().hasClass('layui-nav-item') && !container.hasClass(SIDE_SHRINK)) return;
  906 +
  907 + var tips = othis.attr('lay-tips')
  908 + ,offset = othis.attr('lay-offset')
  909 + ,direction = othis.attr('lay-direction')
  910 + ,index = layer.tips(tips, this, {
  911 + tips: direction || 1
  912 + ,time: -1
  913 + ,success: function(layero, index){
  914 + if(offset){
  915 + layero.css('margin-left', offset + 'px');
  916 + }
  917 + }
  918 + });
  919 + othis.data('index', index);
  920 + }).on('mouseleave', '*[lay-tips]', function(){
  921 + layer.close($(this).data('index'));
  922 + });
  923 +
  924 + //点击A-view3.1收缩菜单栏
  925 + admin.events.lefMenuflexible = function () {
  926 + var leftbox = $("#LAY_app");
  927 + if(leftbox.hasClass("layadmin-side-shrink")){
  928 + leftbox.removeClass("layadmin-side-shrink");
  929 + }else{
  930 + leftbox.addClass("layadmin-side-shrink");
  931 + }
  932 + }
  933 +
  934 + //窗口resize事件
  935 + var resizeSystem = layui.data.resizeSystem = function(){
  936 + //layer.close(events.note.index);
  937 + layer.closeAll('tips');
  938 +
  939 + if(!resizeSystem.lock){
  940 + setTimeout(function(){
  941 + admin.sideFlexible(admin.screen() < 2 ? '' : 'spread');
  942 + delete resizeSystem.lock;
  943 + }, 100);
  944 + }
  945 +
  946 + resizeSystem.lock = true;
  947 + }
  948 + $win.on('resize', layui.data.resizeSystem);
  949 +
  950 + //接口输出
  951 + exports('admin', admin);
  952 +});
1 <title>浙江大屏</title> 1 <title>浙江大屏</title>
2 -<iframe src="/vue3/index.html#/zj/dp" class="layadmin-iframe"/> 2 +<iframe src="/vue3/index.html#/bigscreen" class="layadmin-iframe"/>
  1 +<!--默认布局-->
  2 +<div class="layui-layout layui-layout-admin">
  3 + <script>
  4 + var show = location.search.substr(1).split("&")[0].split("=")[1];
  5 + if(show === '0'){
  6 + document.querySelector("body").classList.add("layout-nav-hide");
  7 + }
  8 +
  9 + var editFlag = location.search.substr(1).split("&")[1];
  10 + if(editFlag){
  11 + var name = editFlag.split("=")[0];
  12 + var val = editFlag.split("=")[1] == "true"?true:false;
  13 + if(name === "editFlag"){
  14 + localStorage.setItem("editFlag",val);
  15 + }
  16 + }
  17 + var menuIsopen = 'false';
  18 + layui.use(['jquery'], function () {
  19 + var $ = layui.jquery;
  20 + // 读取配置文件
  21 + $.ajax({
  22 + url: sessionStorage.getItem('domainName') + '/api-web/sysConf/getByCode',
  23 + async: false,
  24 + data: {
  25 + code: 'view_menu_isopen',
  26 + access_token: localStorage.getItem('access_token')
  27 + },
  28 + success(response) {
  29 + if (response && response.success && response.object) {
  30 + menuIsopen = response.object.value;
  31 + }
  32 + }
  33 + });
  34 + });
  35 +
  36 +
  37 + </script>
  38 + <div class="layui-header">
  39 + <!-- 头部区域 -->
  40 + <ul class="layui-nav layui-layout-left">
  41 + <li class="layui-nav-item layadmin-flexible" lay-unselect>
  42 + <a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
  43 + <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
  44 + </a>
  45 + </li>
  46 + <li class="layui-nav-item" lay-unselect>
  47 + <a href="javascript:;" layadmin-event="refresh" title="刷新">
  48 + <i class="layui-icon layui-icon-refresh-3"></i>
  49 + </a>
  50 + </li>
  51 + </ul>
  52 + <img src="/src/style/img/logo-tj.png" class="logo">
  53 + <ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
  54 + <!--搜索框检索-->
  55 + <!-- <li class="layui-nav-item layui-hide-xs">-->
  56 + <!-- <input type="text" class="layui-input" id="allSearchKeywords" style="margin-top: 6px">-->
  57 + <!-- </li>-->
  58 + <li class="layui-nav-item layui-hide-xs" lay-tips="全局搜索">
  59 + <a href="javascript:;" layadmin-event="globalSearch"><i class="layui-icon layui-icon-search"></i></a>
  60 + </li>
  61 + <li class="layui-nav-item" lay-tips="一体化视图">
  62 + <a href="javascript:;" layadmin-event="toYTHViewScreen"><i class="layui-icon layui-icon-chart-screen"></i></a>
  63 + </li>
  64 + <li class="layui-nav-item" lay-tips="大屏">
  65 + <a href="javascript:;" layadmin-event="toBigScreen"><i class="layui-icon layui-icon-chart-screen"></i></a>
  66 + </li>
  67 + <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-unselect>
  68 + <a href="javascript:;" layadmin-event="more"><i class="layui-icon layui-icon-more-vertical"></i></a>
  69 + </li>
  70 + <li class="layui-nav-item layui-hide-xs" lay-unselect>
  71 + <a href="javascript:;" layadmin-event="theme">
  72 + <i class="layui-icon layui-icon-theme"></i>
  73 + </a>
  74 + </li>
  75 + <li class="layui-nav-item layui-hide-xs" lay-unselect>
  76 + <a href="javascript:;" layadmin-event="fullscreen">
  77 + <i class="layui-icon layui-icon-screen-full"></i>
  78 + </a>
  79 + </li>
  80 + <!-- 报表通知统计 -->
  81 + <li class="layui-nav-item" lay-unselect>
  82 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-web/home/messageRemind">
  83 + <a href="javascript:;" class="notice_msg">
  84 + <i class="layui-icon layui-icon-notice"></i><span>{{d.map==null? 0 : d.map.totalCountByUser}}</span>
  85 + </a>
  86 + <dl class="layui-nav-child">
  87 + <dd><a href="javascript:;" lay-href="/alarm/activewarning">活动告警:{{d.map==null? 0 : d.map.totalCountByUser}}</a></dd>
  88 + <!-- <hr>-->
  89 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/monitor/flag=0">未处理报表:{{d.map==null? 0 : d.map.statusCountByUser}}</a></dd>-->
  90 + <!-- <hr>-->
  91 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/workview/read=0/type=1">工作汇报未读:{{d.map==null? 0 : d.map.notReadCountByUser}}</a></dd>-->
  92 + <!-- <hr>-->
  93 + <!-- <dd><a href="javascript:;" lay-href="/iframe/insp/notice/t=day">今日通知:{{d.map==null? 0 : d.map.countByUserAndToday}}</a></dd>-->
  94 + </dl>
  95 + </script>
  96 + </li>
  97 +
  98 + <li class="layui-nav-item" lay-unselect>
  99 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken"
  100 + lay-done="layui.element.render('nav', 'layadmin-layout-right');">
  101 + <a href="javascript:;">
  102 + 欢迎&nbsp;&nbsp;<cite style="color: #1E9FFF">{{d.object.nickname}}</cite>
  103 + </a>
  104 + {{#
  105 + var roles = '';
  106 + layui.each(d.object.sysRoles, function(idx, role){
  107 + roles += role.code+",";
  108 + });
  109 + }}
  110 + <li><input type="hidden" id="user_roles" value="{{roles}}"></li>
  111 + <dl class="layui-nav-child">
  112 + <dd layadmin-event="updtpswd" style="text-align: center;"><a>修改密码</a></dd>
  113 + <dd layadmin-event="logout" style="text-align: center;"><a>退出</a></dd>
  114 + </dl>
  115 + </script>
  116 + </li>
  117 +
  118 + <!-- <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/users/getUserByToken"-->
  119 + <!-- lay-done="layui.element.render('nav', 'layadmin-text-name');">-->
  120 + <!-- <li class="layui-nav-item layui-hide-xs" lay-unselect lay-filter="layadmin-text-name">-->
  121 + <!-- <a href="javascript:;" style="text-align: center;" >欢迎&nbsp;&nbsp;<b id="user-name" lay-tips="点击退出" layadmin-event="logout" style="color: #3d9fe6">{{d.object.nickname }}</b></a>-->
  122 + <!-- </li>-->
  123 + <!-- </script>-->
  124 + </ul>
  125 + </div>
  126 +
  127 + <!-- 侧边菜单 -->
  128 + <!-- 先获取默认菜单拼接 d.str 返回数据格式 modeleid#path-->
  129 + <!-- 如果配置默认首页,则给默认首页,否则给工作台(moduleid为work,path为work/index)-->
  130 +
  131 + <div class="layui-side layui-side-menu">
  132 + <div class="layui-side-scroll">
  133 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/menus/current?type=1"
  134 + lay-done="layui.element.render('nav', 'layadmin-system-side-menu');" id="TPL_layout">
  135 +
  136 + {{#
  137 + var dataName = layui.setter.response.dataName;
  138 + var fisthref = "/index";
  139 + var defaultMenu = d.str;
  140 + var defaultModuleid = '';
  141 + var defaultPath = '';
  142 + if(defaultMenu && defaultMenu != ''){
  143 + defaultModuleid = d.str.split('#')[0];
  144 + defaultPath = d.str.split('#')[1];
  145 + fisthref = defaultPath;
  146 + }
  147 + }}
  148 +
  149 + <div class="layui-logo" lay-href="{{fisthref}}">
  150 + <span>{{ layui.setter.name || 'layuiAdmin' }}</span>
  151 + </div>
  152 +
  153 + <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu"
  154 + lay-filter="layadmin-system-side-menu">
  155 + {{#
  156 + var show = location.search.substr(1).split("&")[0].split("=")[1];
  157 + if(show == '1') window.history.pushState({} ,'' ,'#');
  158 + if(show != '0') location.hash = "/";
  159 +
  160 + var path = layui.router().path
  161 + ,pathURL = layui.admin.correctRouter(path.join('/'))
  162 + ,dataName = layui.setter.response.dataName;
  163 + var fistModuleid = '';
  164 + if(d && d[dataName].length>0){
  165 + fistModuleid = d[dataName][0].moduleid;
  166 + }
  167 +
  168 + layui.each(d[dataName], function(index, item){
  169 + var isselectd = '';
  170 + var isSelectedModuleid = '';
  171 + if(defaultModuleid != '' || item.moduleid != ''){
  172 + if(item.moduleid == defaultModuleid){
  173 + isselectd = "layui-this";
  174 + }else{
  175 + isselectd = "";
  176 + }
  177 + }else {
  178 + if(!defaultModuleid || defaultModuleid == ''){
  179 + if(index = 0){
  180 + isselectd = "layui-this";
  181 + }
  182 + }else{
  183 + isselectd = "";
  184 + }
  185 + }
  186 + var hasChildren = typeof item.subMenus === 'object' && item.subMenus && item.subMenus.length > 0
  187 + ,classSelected = function(){
  188 + var match = path[0] == item.moduleid || (index == 0 && !path[0]) || (item.path && pathURL ==
  189 + layui.admin.correctRouter(item.path)) || item.spread;
  190 + if(match){
  191 + return hasChildren ? 'layui-nav-itemed' : 'layui-nav-itemed';
  192 + }
  193 + return '';
  194 + }
  195 + ,url = (item.path && typeof item.path === 'string') ? item.path : item.moduleid;
  196 + var closeMenuEvent = '';
  197 + if(item.moduleid == 'biz' || item.moduleid == 'res'){ closeMenuEvent = 'closeMenu'}
  198 + }}
  199 +
  200 + <li data-name="{{ item.moduleid || '' }}" data-jump="{{ item.path || '' }}"
  201 + class="layui-nav-item {{ menuIsopen == 'true' ? 'layui-nav-itemed' : '' }} {{isselectd}}">
  202 +
  203 + {{# if(item.moduleid == 'cmdbsys' || item.moduleid == 'sxview' || item.moduleid == 'dpsys'){ }}
  204 + <a href="javascript:;" layadmin-event="{{item.moduleid}}" lay-tips="{{ item.name
  205 + }}" lay-direction="2">
  206 + <i class="layui-icon {{ item.css }}"></i>
  207 + <cite>{{ item.name }}</cite>
  208 + </a>
  209 + {{# } }}
  210 + {{# if(item.moduleid != 'cmdbsys' && item.moduleid != 'sxview' && item.moduleid != 'dpsys'){ }}
  211 + <a href="javascript:;" {{ hasChildren ? '' : 'lay-href="'+ url +'"' }} layadmin-event="{{closeMenuEvent}}" lay-tips="{{ item.name
  212 + }}" lay-direction="2">
  213 + <i class="layui-icon {{ item.css }}"></i>
  214 + <cite>{{ item.name }}</cite>
  215 + </a>
  216 +
  217 + {{# } }}
  218 +
  219 +
  220 + {{# if(hasChildren){ }}
  221 + <dl class="layui-nav-child">
  222 + {{# layui.each(item.subMenus, function(index2, item2){
  223 + if(item2.moduleid && item2.moduleid == defaultModuleid){
  224 + isselectd = "layui-this";
  225 + }else{
  226 + isselectd = "";
  227 + }
  228 + var hasChildren2 = typeof item2.subMenus == 'object' && item2.subMenus &&
  229 + item2.subMenus.length > 0
  230 + ,classSelected2 = function(){
  231 + var match = (path[0] == item.moduleid && path[1] == item2.moduleid) || (item2.path &&
  232 + pathURL == layui.admin.correctRouter(item2.path)) || item2.spread;
  233 + return '';
  234 + }
  235 + ,url2 = (item2.path && typeof item2.path === 'string')
  236 + ? item2.path
  237 + : [item.moduleid, item2.moduleid, ''].join('/');
  238 + }}
  239 + <dd data-name="{{ item2.moduleid || '' }}" data-jump="{{ item2.path || '' }}"
  240 + class="layui-nav-item {{ classSelected2() }} {{isselectd}}"
  241 + >
  242 + {{# if(item2.menuDesc.indexOf('第三方') == '-1') {}}
  243 + <a href="javascript:;" {{ hasChildren2 ? '' : 'lay-href="'+ url2 +'"' }}>{{ item2.name }}</a>
  244 + {{# }else{ }}
  245 + <a href="javascript:;" {{ hasChildren2 ? '' : 'data-url="'+ url2 +'" layadmin-event="IntegratedEntrance"' }} data-moduleid="{{item2.moduleid}}">{{ item2.name }}</a>
  246 + {{# } }}
  247 + {{# if(hasChildren2){ }}
  248 + <dl class="layui-nav-child {{}}">
  249 + {{# layui.each(item2.subMenus, function(index3, item3){
  250 + var match = (path[0] == item.moduleid && path[1] == item2.moduleid && path[2] ==
  251 + item3.moduleid)
  252 + || (item3.path && pathURL == layui.admin.correctRouter(item3.path))
  253 + ,url3 = (item3.path && typeof item3.path === 'string')
  254 + ? item3.path
  255 + : [item.moduleid, item2.moduleid, item3.moduleid].join('/')
  256 + }}
  257 + <dd data-name="{{ item3.moduleid || '' }}" data-jump="{{ item3.path || '' }}">
  258 + {{# if(item2.menuDesc.indexOf('第三方') == '-1') {}}
  259 + <a href="javascript:;" lay-href="{{ url3 }}" {{ item3.iframe ? 'lay-iframe="true"' : ''}}>{{ item3.name }}</a>
  260 + {{# }else{ }}
  261 + <a href="javascript:;" data-url="{{ url3 }}" layadmin-event="IntegratedEntrance" data-moduleid="{{item3.moduleid}}">{{ item3.name }}</a>
  262 + {{# } }}
  263 + </dd>
  264 + {{# }); }}
  265 + </dl>
  266 + {{# } }}
  267 + </dd>
  268 + {{# }); }}
  269 + </dl>
  270 + {{# } }}
  271 + </li>
  272 + {{# }); }}
  273 + </ul>
  274 + </script>
  275 + </div>
  276 + <div class="right-bottom-tips"></div>
  277 + </div>
  278 +
  279 + <!-- 页面标签 -->
  280 + <script type="text/html" template lay-url="{{sessionStorage.getItem('domainName')}}/api-user/menus/findSettingDefaultMenus"
  281 + lay-done="layui.element.render('nav', 'layadmin-pagetabs-nav')">
  282 + <div class="layadmin-pagetabs" id="LAY_app_tabs">
  283 + <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
  284 + <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
  285 + <div class="layui-icon layadmin-tabs-control layui-icon-down">
  286 + <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
  287 + <li class="layui-nav-item" lay-unselect>
  288 + <a href="javascript:;"></a>
  289 + <dl class="layui-nav-child layui-anim-fadein">
  290 + <dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
  291 + <dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
  292 + <dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
  293 + </dl>
  294 + </li>
  295 + </ul>
  296 + </div>
  297 + <div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
  298 + <ul class="layui-tab-title" id="LAY_app_tabsheader">
  299 + {{# if(d.data.length >= 1 ){ }}
  300 + {{# if(d.data[0].moduleid == 'index'){ }}
  301 + <li lay-id="/"><i class="layui-icon layui-icon-home"></i></li>
  302 + {{# } }}
  303 + {{# if(d.data[0].moduleid != 'index'){ }}
  304 + <li lay-id="/{{d.data[0].moduleid}}/" lay-attr="/{{d.data[0].moduleid}}/"><i class="layui-icon layui-icon-home"></i></li>
  305 + {{# } }}
  306 + {{# } }}
  307 + {{# if(d.data.length == 0){ }}
  308 + <li lay-id="/"><i class="layui-icon layui-icon-home"></i></li>
  309 + {{# } }}
  310 + </ul>
  311 + </div>
  312 + </div>
  313 + </script>
  314 +
  315 + <!-- 主体内容 -->
  316 + <div class="layui-body" id="LAY_app_body">
  317 + <!-- 单页模式接入-->
  318 + <div class="layadmin-tabsbody-item layui-show"></div>
  319 + </div>
  320 +
  321 + <!-- 辅助元素,一般用于移动设备下遮罩 -->
  322 + <div class="layadmin-body-shade" layadmin-event="shade"></div>
  323 +</div>
  324 +
  325 +<!--告警操作记录-->
  326 +<script type="text/html" id="warnViewWinTpl">
  327 + <div class="warn-win">
  328 + <div class="warn-win-item">
  329 + <h5>告警确认【{{d.confirm.length}}</h5>
  330 + {{# layui.each(d.confirm, function(index, item){ }}
  331 + <div class="warn-win-item-con">
  332 + <span>{{layui.util.toDateString(item.confirmTime)}}</span>
  333 + <ul>
  334 + <li>备注:{{item.remark}}</li>
  335 + <li>告警确认人:{{item.confirmUserId}}</li>
  336 + <li>紧急程度:{{item.levelName}}</li>
  337 + </ul>
  338 + </div>
  339 + {{# }); }}
  340 + </div>
  341 + <div class="warn-win-item">
  342 + <h5>告警关闭【{{d.close.length}}</h5>
  343 + {{# layui.each(d.close, function(index, item){ }}
  344 + {{# var closeTypeStr = '告警'}}
  345 + {{# if(item.closeType == 1){ closeTypeStr = '通知' } }}
  346 + <div class="warn-win-item-con">
  347 + <span>备注:{{item.remark}}</span>
  348 + <ul>
  349 + <li>告警关闭时间:{{layui.util.toDateString(item.closeTime)}}</li>
  350 + <li>告警关闭人:{{item.closeUserId}}</li>
  351 + <li>关闭范围:{{closeTypeStr}}</li>
  352 + <li>关闭时长:{{item.closeDuration}}小时</li>
  353 + </ul>
  354 + </div>
  355 + {{# }); }}
  356 + </div>
  357 + <div class="warn-win-item">
  358 + <h5>告警恢复【{{d.resume.length}}</h5>
  359 + {{# layui.each(d.resume, function(index, item){ }}
  360 + {{# var resumeTypeStr = '恢复关闭的活动告警'}}
  361 + {{# if(item.resumeType == 1){resumeTypeStr = '恢复历史告警' } }}
  362 + <div class="warn-win-item-con">
  363 + <span>备注:{{item.remark}}</span>
  364 + <ul>
  365 + <li>告警恢复时间:{{layui.util.toDateString(item.resumeTime)}}</li>
  366 + <li>告警恢复人:{{item.resumeUserId}}</li>
  367 + <li>恢复类型:{{resumeTypeStr}}</li>
  368 + </ul>
  369 + </div>
  370 + {{# }); }}
  371 + </div>
  372 + </div>
  373 +</script>
  374 +
  375 +<!--详细页左侧面板-->
  376 +<script type="text/html" id="detailPageLeftPanel">
  377 + <div class="detail-left-panel">
  378 + <a class="detail-left-panel-btn" href="javascript:void(0)"><i class="layui-icon layui-icon-next"></i></a>
  379 + <div class="detail-left-panel-node" style="display: none">
  380 + {{# layui.each(d.map, function(k, v){ }}
  381 + <div class="left-panel-restype">
  382 + <div class="layui-title">{{v[0].reTypeName}}</div>
  383 + <div class="">
  384 + {{# layui.each(v, function(i, e){ }}
  385 + <div class="info-box link"
  386 + data-resid="{{e.targetId}}"
  387 + data-restype="{{e.resType}}"
  388 + data-restypename="{{e.resTypeName}}"
  389 + data-ip="{{e.ip}}"
  390 + data-admin="{{e.admin}}"
  391 + >
  392 + {{e.targetName}}
  393 + </div>
  394 + {{# }); }}
  395 + </div>
  396 + </div>
  397 + {{# }); }}
  398 + {{# if(!Object.keys(d.map).length) { }}
  399 + <div class="left-panel-restype">
  400 + <div class="desc-box">
  401 + 暂无关联关系
  402 + </div>
  403 + </div>
  404 + {{# } }}
  405 + </div>
  406 + </div>
  407 +</script>
  408 +
  409 +<!--下探top30表格展示内容-->
  410 +<script type="text/html" id="detailKpiTableTpl">
  411 + <table class="layui-table" lay-even="" lay-skin="row">
  412 + <colgroup>
  413 + <col width="100">
  414 + <col width="150">
  415 + <col width="180">
  416 + <col width="180">
  417 + </colgroup>
  418 + <thead>
  419 + <tr>
  420 + <th>序号</th>
  421 + <th>进程号</th>
  422 + <th>所属用户</th>
  423 + {{# if(d.kpi == 'KPI7054BC34'){ }}
  424 + <th>使用率</th>
  425 + {{# } }}
  426 + {{# if(d.kpi != 'KPI7054BC34'){ }}
  427 + <th>使用量</th>
  428 + {{# } }}
  429 + </tr>
  430 + </thead>
  431 + <tbody>
  432 + {{# layui.each(d.data, function(index, item){ }}
  433 + <tr>
  434 + <td>{{index + 1}}</td>
  435 + <td>{{item.pid}}</td>
  436 + <td>{{item.username}}</td>
  437 + <td>{{item.usedPercent}}</td>
  438 + <!--<td>{{item.info}}</td>-->
  439 + </tr>
  440 + {{# }); }}
  441 + </tbody>
  442 + </table>
  443 +</script>
  444 +
  445 +<!--corn表达式-->
  446 +<script type="text/html" id="cronHtml" >
  447 + <div id="cronContent" style="color:#000000">
  448 + <p style="margin: 10px auto; padding: 0px;">
  449 +   <strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);">常用表达式例子</span></strong>
  450 + </p>
  451 + <p style="margin: 10px auto; padding: 0px;">
  452 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0/2 * * * * ?</span></strong>&nbsp;&nbsp;</span>&nbsp;表示每2秒 执行任
  453 + </p>
  454 + <p style="margin: 10px auto; padding: 0px;">
  455 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/2 * * * ? </span></strong>&nbsp;&nbsp;</span>&nbsp;表示每2分钟 执行任
  456 + </p>
  457 +
  458 + <p style="margin: 10px auto; padding: 0px;">
  459 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(255, 0, 0);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">1</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 2 1 * ?</span></strong>&nbsp;&nbsp;</span>&nbsp;表示在每月的1日的凌晨2点调整任
  460 + </p>
  461 + <p style="margin: 10px auto; padding: 0px;">
  462 +   <span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 0);">2</span></span><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * MON-FRI</span>&nbsp;</strong>&nbsp; 表示周一到周五每天上午10:15执行作业
  463 + </p>
  464 + <p style="margin: 10px auto; padding: 0px;">
  465 +   (3<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? 6L 2002-2006</span></strong>&nbsp;&nbsp; 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
  466 + </p>
  467 + <p style="margin: 10px auto; padding: 0px;">
  468 +   (4<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 10,14,16 * * ?</span></strong>&nbsp;&nbsp;&nbsp;每天上午10点,下午2点,4&nbsp;
  469 + </p>
  470 + <p style="margin: 10px auto; padding: 0px;">
  471 +   (5<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/30 9-17 * * ?</span></strong>&nbsp;&nbsp; 朝九晚五工作时间内每半小时&nbsp;
  472 + </p>
  473 + <p style="margin: 10px auto; padding: 0px;">
  474 +   (6<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 12 ? * WED</span></strong>&nbsp;&nbsp; &nbsp;表示每个星期三中午12&nbsp;
  475 + </p>
  476 + <p style="margin: 10px auto; padding: 0px;">
  477 +   (7<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0 12 * * ?</span></strong>&nbsp;&nbsp;&nbsp;每天中午12点触发&nbsp;
  478 + </p>
  479 + <p style="margin: 10px auto; padding: 0px;">
  480 +   (8<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * * &nbsp;</span></strong>&nbsp;&nbsp;每天上午10:15触发&nbsp;
  481 + </p>
  482 + <p style="margin: 10px auto; padding: 0px;">
  483 +   (9<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 每天上午10:15触发&nbsp;
  484 + </p>
  485 + <p style="margin: 10px auto; padding: 0px;">
  486 +   (10<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ?</span>&nbsp;</strong>&nbsp; &nbsp;每天上午10:15触发&nbsp;
  487 + </p>
  488 + <p style="margin: 10px auto; padding: 0px;">
  489 +   (11<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 * * ? 2005</span></strong>&nbsp;&nbsp; &nbsp;2005年的每天上午10:15触发&nbsp;
  490 + </p>
  491 + <p style="margin: 10px auto; padding: 0px;">
  492 +   (12<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 * 14 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 在每天下午2点到下午2:59期间的每1分钟触发&nbsp;
  493 + </p>
  494 + <p style="margin: 10px auto; padding: 0px;">
  495 +   (13<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/5 14 * * ?</span></strong>&nbsp;&nbsp; &nbsp;在每天下午2点到下午2:55期间的每5分钟触发&nbsp;
  496 + </p>
  497 + <p style="margin: 10px auto; padding: 0px;">
  498 +   (14<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0/5 14,18 * * ?</span></strong>&nbsp;&nbsp; &nbsp; 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发&nbsp;
  499 + </p>
  500 + <p style="margin: 10px auto; padding: 0px;">
  501 +   (15<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 0-5 14 * * ?</span>&nbsp;</strong>&nbsp; &nbsp;在每天下午2点到下午2:05期间的每1分钟触发&nbsp;
  502 + </p>
  503 + <p style="margin: 10px auto; padding: 0px;">
  504 +   (16<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 10,44 14 ? 3 WED</span></strong>&nbsp;&nbsp; &nbsp;每年三月的星期三的下午2:102:44触发&nbsp;
  505 + </p>
  506 + <p style="margin: 10px auto; padding: 0px;">
  507 +   (17<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * MON-FRI</span>&nbsp;</strong>&nbsp; &nbsp;周一至周五的上午10:15触发&nbsp;
  508 + </p>
  509 + <p style="margin: 10px auto; padding: 0px;">
  510 +   (18<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 15 * ?</span>&nbsp;</strong>&nbsp; &nbsp;每月15日上午10:15触发&nbsp;
  511 + </p>
  512 + <p style="margin: 10px auto; padding: 0px;">
  513 +   (19<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 L * ?</span>&nbsp;</strong>&nbsp; &nbsp;每月最后一日的上午10:15触发&nbsp;
  514 + </p>
  515 + <p style="margin: 10px auto; padding: 0px;">
  516 +   (20<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6L</span>&nbsp;</strong>&nbsp; &nbsp;每月的最后一个星期五上午10:15触发&nbsp;
  517 + </p>
  518 + <p style="margin: 10px auto; padding: 0px;">
  519 +   (21<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6L 2002-2005</span></strong>&nbsp;&nbsp; 2002年至2005年的每月的最后一个星期五上午10:15触发&nbsp;
  520 + </p>
  521 + <p style="margin: 10px auto; padding: 0px;">
  522 +   (22<strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 18px; color: rgb(0, 0, 255);">0 15 10 ? * 6#3</span></strong>&nbsp;&nbsp; 每月的第三个星期五上午10:15触发
  523 + </p>
  524 + <p style="margin: 10px auto; padding: 0px;">
  525 + &nbsp;
  526 + </p>
  527 + </div>
  528 +</script>
  529 +
  530 +<!--资源名称-->
  531 +<script type="text/html" id="resindex_resName">
  532 + <div>
  533 + <span data-zymc="{{ d.resId }}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-childrennum="{{d.childrenNum}}" data-ip="{{ d.ip }}" data-resTypeName="{{ d.resTypeName }}" data-admin="{{ d.admin }}" data-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>
  534 + {{# if (d.favId == null) { }}
  535 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  536 + {{# } else { }}
  537 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  538 + {{# } }}
  539 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  540 + {{# if (d.resCategory == 'share' && d.hardwareFlag && d.hardwareFlag.endsWith("Y")) { }}
  541 + <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>
  542 + {{# } }}
  543 + </div>
  544 +</script>
  545 +
  546 +<!--最大文件系统使用率-->
  547 +<script type="text/html" id="fileUseRateTpl">
  548 + <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'}}"
  549 + data-warning="0" data-ident="1" data-trend="0">
  550 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  551 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_bizfileName" lay-tips="{{d.fileSysUseName}}"
  552 + data-id="{{d.resId}}_bizfileName" data-message="{{d.fileSysUseName}}"><span style="color: #000000;">{{d.fileSysUseName}}</span>
  553 + </div>
  554 + <div class="layui-progress-bar layui-bg-green {{ d.fileSysUseRate >= 98 ? 'layui-bg-red' : (d.fileSysUseRate >= 95 ? 'layui-bg-orange' : (d.fileSysUseRate >= 90 ? 'layui-bg-blue':'')) }}"
  555 + lay-percent="{{ d.fileSysUseRate }}%"
  556 + style="width: {{ d.fileSysUseRate }}%;">
  557 + </div>
  558 + </div>
  559 + <span class="layui-progress-text">{{ (d.fileSysUseRate == null || d.fileSysUseRate == '' || d.fileSysUseRate === '未知' || d.fileSysUseRate === '无' )? '0%' : d.fileSysUseRate +'%' }}</span>
  560 + </div>
  561 +</script>
  562 +<!--CPU使用率-->
  563 +<script type="text/html" id="cpuRateTpl">
  564 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI7054BC34" data-flag="cpu" data-name="CPU使用率"
  565 + data-warning="0" data-ident="1" data-trend="1">
  566 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  567 + <div class="layui-progress-bar layui-bg-green {{ d.cpuRate >= 95 ? 'layui-bg-red' : (d.cpuRate >= 90 ? 'layui-bg-orange' : (d.cpuRate >= 80 ? 'layui-bg-blue':''))}}"
  568 + lay-percent="{{ d.cpuRate }}%"
  569 + style="width: {{ d.cpuRate }}%;">
  570 + </div>
  571 + </div>
  572 + <span class="layui-progress-text">{{ (d.cpuRate == null || d.cpuRate == '' || d.cpuRate === '未知' || d.cpuRate === '无' )? '0%' : d.cpuRate +'%' }}</span>
  573 + </div>
  574 +</script>
  575 +<!--内存使用率-->
  576 +<script type="text/html" id="memoryRateTpl">
  577 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI31CB8D97" data-flag="mem" data-name="内存使用率"
  578 + data-warning="1" data-ident="1" data-trend="1">
  579 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  580 + <div class="layui-progress-bar layui-bg-green {{ d.memoryRate >= 95 ? 'layui-bg-red' : (d.memoryRate >= 90 ? 'layui-bg-orange' : (d.memoryRate >= 80 ? 'layui-bg-blue':''))}}"
  581 + lay-percent="{{ d.memoryRate }}%"
  582 + style="width: {{ d.memoryRate }}%;">
  583 + </div>
  584 + </div>
  585 + <span class="layui-progress-text">{{ (d.memoryRate == null || d.memoryRate == '' || d.memoryRate === '未知' || d.memoryRate === '无' )? '0%' : d.memoryRate +'%' }}</span>
  586 + </div>
  587 +</script>
  588 +<!--虚拟内存使用率-->
  589 +<script type="text/html" id="vmmemoryRateTpl">
  590 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI20352505" data-flag="vmem" data-name="虚拟内存使用率"
  591 + data-warning="1" data-ident="1" data-trend="1">
  592 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  593 + <div class="layui-progress-bar layui-bg-green {{ d.vmmemoryUseRate >= 95 ? 'layui-bg-red' : (d.vmmemoryUseRate >= 90 ? 'layui-bg-orange' : (d.vmmemoryUseRate >= 80 ? 'layui-bg-blue':''))}}"
  594 + lay-percent="{{ d.vmmemoryUseRate }}%"
  595 + style="width: {{ d.vmmemoryUseRate }}%;">
  596 + </div>
  597 + </div>
  598 + <span class="layui-progress-text">{{ (d.vmmemoryUseRate == null || d.vmmemoryUseRate == '' || d.vmmemoryUseRate === '未知' || d.vmmemoryUseRate === '无' )? '0%' : d.vmmemoryUseRate +'%' }}</span>
  599 + </div>
  600 +</script>
  601 +<!--会话百分比-->
  602 +<script type="text/html" id="sessionRateTpl">
  603 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI18F18278" data-name="活动会话百分比" data-flag="session"
  604 + data-warning="0" data-ident="1" data-trend="0">
  605 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  606 + <div class="layui-progress-bar layui-bg-green {{ d.sessionRate >= 80 ? 'layui-bg-red' : (d.sessionRate <= 50 ? '' : 'layui-bg-orange') }}"
  607 + lay-percent="{{ d.sessionRate }}%"
  608 + style="width: {{ d.sessionRate }}%;">
  609 + </div>
  610 + </div>
  611 + <span class="layui-progress-text">{{ (d.sessionRate == null || d.sessionRate == '' || d.sessionRate === '未知' || d.sessionRate === '无' )? '0%' : d.sessionRate +'%' }}</span>
  612 + </div>
  613 +</script>
  614 +<!--CPU分配率-->
  615 +<script type="text/html" id="cpuSetRateTpl">
  616 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPIBFA3F5CD" data-name="CPU分配率" data-flag="cpu"
  617 + data-warning="0" data-ident="1" data-trend="0">
  618 + {{#
  619 + d.cpuSetRate = parseFloat(d.cpuSetRate).toFixed(2);
  620 + }}
  621 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  622 + <div class="layui-progress-bar layui-bg-green {{ d.cpuSetRate >= 80 ? 'layui-bg-red' : (d.cpuSetRate <= 50 ? '' : 'layui-bg-orange') }}"
  623 + lay-percent="{{ d.cpuSetRate }}%"
  624 + style="width: {{ d.cpuSetRate }}%;">
  625 + </div>
  626 + </div>
  627 + <span class="layui-progress-text">{{ (d.cpuSetRate == null || d.cpuSetRate == '' || d.cpuSetRate === '未知' || d.cpuSetRate === '无' )? '0%' : d.cpuSetRate +'%' }}</span>
  628 + </div>
  629 +</script>
  630 +<!--内存分配率-->
  631 +<script type="text/html" id="memorySetRateTpl">
  632 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPIC40A80AC" data-name="内存分配率" data-flag="mem"
  633 + data-warning="0" data-ident="1" data-trend="0">
  634 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  635 + <div class="layui-progress-bar layui-bg-green {{ d.memorySetRate >= 80 ? 'layui-bg-red' : (d.memorySetRate <= 50 ? '' : 'layui-bg-orange') }}"
  636 + lay-percent="{{ d.memorySetRate }}%"
  637 + style="width: {{ d.memorySetRate }}%;">
  638 + </div>
  639 + </div>
  640 + <span class="layui-progress-text">{{ (d.memorySetRate == null || d.memorySetRate == '' || d.memorySetRate === '未知' || d.memorySetRate === '无' )? '0%' : d.memorySetRate +'%' }}</span>
  641 + </div>
  642 +</script>
  643 +<!--存储分配率-->
  644 +<script type="text/html" id="storageSetRateTpl">
  645 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI46BAA9BE" data-name="存储分配率" data-flag="storage"
  646 + data-warning="0" data-ident="1" data-trend="0">
  647 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  648 + <div class="layui-progress-bar layui-bg-green {{ d.storageSetRate >= 80 ? 'layui-bg-red' : (d.storageSetRate <= 50 ? '' : 'layui-bg-orange') }}"
  649 + lay-percent="{{ d.storageSetRate }}%"
  650 + style="width: {{ d.storageSetRate }}%;">
  651 + </div>
  652 + </div>
  653 + <span class="layui-progress-text">{{ (d.storageSetRate == null || d.storageSetRate == '' || d.storageSetRate === '未知' || d.storageSetRate === '无' )? '0%' : d.storageSetRate +'%' }}</span>
  654 + </div>
  655 +</script>
  656 +<!--连接状态-->
  657 +<script type="text/html" id="linkStateTpl">
  658 +{{#
  659 + var linkStateHtml = '';
  660 + var linkStateTips = '无连接信息';
  661 + if(d.linkStateList && d.linkStateList.length) {
  662 + linkStateTips = '';
  663 + if(d.linkStateList.length == 1) {
  664 + var linkState = d.linkStateList[0];
  665 + linkStateTips = `${linkState.protocol}: ${linkState.state}`;
  666 + if(linkState.state.indexOf('成功') !== -1) {
  667 + linkStateHtml = '<button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">成功</button>';
  668 + } else {
  669 + linkStateHtml = `<button type="button"
  670 + id="${d.resId}_bizdanger"
  671 + data-message="${d.message}"
  672 + data-state="${d.state}"
  673 + data-id="${d.resId}_bizdanger"
  674 + class="layui-btn showTip layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  675 + 失败
  676 + </button>`;
  677 + }
  678 + } else {
  679 + linkStateTips += `<ul class='ul-link-state-tips'>`;
  680 + layui.each(d.linkStateList, function(index, value) {
  681 + if(value.state.indexOf('成功') !== -1) {
  682 + linkStateTips += `<li class='li-link-state-tips-green'>${value.protocol}: ${value.state}</li>`;
  683 + linkStateHtml += '<span class="layui-badge-dot layui-bg-green"></span>';
  684 + } else {
  685 + linkStateTips += `<li class='li-link-state-tips-red'>${value.protocol}: ${value.state}</li>`;
  686 + linkStateHtml += '<span class="layui-badge-dot layui-bg-red"></span>';
  687 + }
  688 + });
  689 + linkStateTips += '</ul>';
  690 + }
  691 + }
  692 +}}
  693 + <div class="div-link-state-list" lay-tips="{{linkStateTips}}">
  694 + {{linkStateHtml}}
  695 + </div>
  696 +</script>
  697 +<!--详情页面连接状态-->
  698 +<script type="text/html" id="linkStateDetailTpl">
  699 +{{#
  700 + var linkStateHtml = '';
  701 + var linkStateTips = '无连接信息';
  702 + if(d.linkStateList && d.linkStateList.length) {
  703 + linkStateTips = '';
  704 + if(d.linkStateList.length == 1) {
  705 + var linkState = d.linkStateList[0];
  706 + linkStateTips = `${linkState.protocol}: ${linkState.state}`;
  707 + if(linkState.state.indexOf('成功') !== -1) {
  708 + linkStateHtml = `<span class="span-green">${linkState.state}</span>`;
  709 + } else {
  710 + linkStateHtml = `<span class="span-red">${linkState.state}</span>`;
  711 + }
  712 + } else {
  713 + linkStateTips += `<ul class='ul-link-state-tips'>`;
  714 + layui.each(d.linkStateList, function(index, value) {
  715 + if(value.state.indexOf('成功') !== -1) {
  716 + linkStateTips += `<li class='li-link-state-tips-green'>${value.protocol}: ${value.state}</li>`;
  717 + linkStateHtml += '<div class="layui-badge-dot layui-bg-green"></div>';
  718 + } else {
  719 + linkStateTips += `<li class='li-link-state-tips-red'>${value.protocol}: ${value.state}</li>`;
  720 + linkStateHtml += '<div class="layui-badge-dot layui-bg-red"></div>';
  721 + }
  722 + });
  723 + linkStateTips += '</ul>';
  724 + }
  725 + }
  726 +}}
  727 + <div class="div-link-state-list" lay-tips="{{linkStateTips}}">
  728 + {{linkStateHtml}}
  729 + </div>
  730 +</script>
  731 +<!--电源状态-->
  732 +<script type="text/html" id="powerStateTpl">
  733 + {{# if(d.powerState != null && d.powerState == 'poweredOn'){ }}
  734 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">
  735 + 开机
  736 + </button>
  737 + {{# }else if(d.powerState != null && d.powerState == 'poweredOff'){ }}
  738 + <button type="button" class="layui-btn layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  739 + 关机
  740 + </button>
  741 + {{# }else if(d.powerState != null && d.powerState == 'standBy'){ }}
  742 + <button type="button" class="layui-btn layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  743 + 待机
  744 + </button>
  745 + {{# }else if(d.powerState != null && d.powerState == 'unknown'){ }}
  746 + <button type="button" class="layui-btn layui-bg-gray layui-btn-radius layui-btn-xs p-0-15 cant-click">
  747 + 未知
  748 + </button>
  749 + {{# }else{ }}
  750 + <button type="button"
  751 + class="layui-btn layui-btn-radius layui-bg-gray layui-btn-xs p-0-15 cant-click">{{
  752 + '未监控'}}
  753 + </button>
  754 + {{# }}}
  755 +</script>
  756 +<!--健康状态-->
  757 +<script type="text/html" id="healthTpl">
  758 + {{# if(d.state != 'new'){ }}
  759 + {{# if(d.health === '1'){ }}
  760 + <button type="button" class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  761 + </button>
  762 + {{# } }}
  763 + {{# if(d.health === '2'){ }}
  764 + <button type="button" class="layui-btn layui-btn-warm layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  765 + </button>
  766 + {{# } }}
  767 + {{# if(d.health === '3'){ }}
  768 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click"></button>
  769 + {{# } }}
  770 + {{# } }}
  771 +</script>
  772 +<!--主机状态-->
  773 +<script type="text/html" id="hostStateTpl">
  774 + {{# if(d.hostState != null && d.hostState == 'connected'){ }}
  775 + <button type="button" class="layui-btn layui-btn-radius layui-bg-green layui-btn-xs p-0-15 cant-click">
  776 + 已连接
  777 + </button>
  778 + {{# }else if(d.hostState != null && d.hostState == 'notResponding'){ }}
  779 + <button type="button" class="layui-btn layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">
  780 + 未响应
  781 + </button>
  782 + {{# }else if(d.hostState != null && d.hostState == 'disconnected'){ }}
  783 + <button type="button" class="layui-btn layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
  784 + 断开连接
  785 + </button>
  786 + {{# }else{ }}
  787 + <button type="button"
  788 + class="layui-btn layui-btn-radius layui-bg-gray layui-btn-xs p-0-15 cant-click">{{
  789 + '未监控'}}
  790 + </button>
  791 + {{# }}}
  792 +</script>
  793 +<!--ping状态-->
  794 +<script type="text/html" id="pingStatusTpl">
  795 + {{# if(d.pingStatus === '正常'){ }}
  796 + <button type="button" class="layui-btn layui-btn-danger layui-bg-green layui-btn-radius layui-btn-xs p-0-15">正常
  797 + </button>
  798 + {{# }else{ }}
  799 + <button type="button" class="layui-btn layui-btn-radius layui-bg-red layui-btn-xs p-0-15">异常</button>
  800 + {{# } }}
  801 +</script>
  802 +<!--资源状态-->
  803 +<script type="text/html" id="resStateTpl">
  804 + {{#
  805 + switch (d.state) {
  806 + case "new" :
  807 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-blue layui-btn-radius layui-btn-xs p-0-15 cant-click">未监控</button> {{#
  808 + break;
  809 + case "monitor" :
  810 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-green layui-btn-radius layui-btn-xs p-0-15 cant-click">监控中</button> {{#
  811 + break;
  812 + case "stop" :
  813 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">暂停监控</button> {{#
  814 + break;
  815 + case "alarmIgnore" :
  816 + }} <button type="button" class="layui-btn layui-btn-warm layui-bg-orange layui-btn-radius layui-btn-xs p-0-15 cant-click">告警压制中</button> {{#
  817 + break;
  818 + }
  819 + }}
  820 +</script>
  821 +<!--判断树结构有无子节点-->
  822 +<script type="text/html" id="bizResNameTpl">
  823 + <div>
  824 + {{# if(d.resType == 'MIDDLEWARE_WEBLOGIC' && (d.parentId == null || d.parentId == '') ){ }}
  825 + <span data-childrennum="{{d.childrenNum}}">{{d.resName}}</span>
  826 + {{# }else{ }}
  827 + <span data-zymc="{{d.resId}}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-ip="{{d.ip}}" data-childrennum="{{d.childrenNum}}" data-resTypeName="{{d.resTypeName}}" data-admin="{{d.admin}}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{d.resName}}</span>
  828 + {{# } }}
  829 + {{# if (d.favId == null) { }}
  830 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  831 + {{# } else { }}
  832 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  833 + {{# } }}
  834 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  835 + </div>
  836 +</script>
  837 +<!--表空间使用率(最大)-->
  838 +<script type="text/html" id="tableSpaceUseRateTpl">
  839 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI64B1610A" data-name="表空间使用率" data-showtype="bar" data-barkpiid="KPI2EC3F15A,KPI6AD9EBD6" data-barxaxis="KPI4332BAC8"
  840 + data-warning="0" data-ident="1" data-trend="0" data-flag="tps" >
  841 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  842 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_bizTableSpaceUseRate" class="showTipsName" data-id="{{d.resId}}_bizTableSpaceUseRate" data-message="{{d.tableSpaceUseName}}"><span style="color: #000000;" >{{d.tableSpaceUseName}}</span></div>
  843 + <div class="layui-progress-bar layui-bg-green {{ d.tableSpaceUseRate >= 80 ? 'layui-bg-red' : (d.tableSpaceUseRate <= 50 ? '' : 'layui-bg-orange') }}"
  844 + lay-percent="{{ d.tableSpaceUseRate }}%"
  845 + style="width: {{ d.tableSpaceUseRate }}%;">
  846 + </div>
  847 + </div>
  848 + <span class="layui-progress-text">{{ (d.tableSpaceUseRate == null || d.tableSpaceUseRate == '' || d.tableSpaceUseRate === '未知' || d.tableSpaceUseRate === '无' )? '0%' : d.tableSpaceUseRate +'%' }}</span>
  849 + </div>
  850 +</script>
  851 +<!--ASM磁盘空间使用率-->
  852 +<script type="text/html" id="asmDiskUsedRateTpl">
  853 + <div class="layui-progress-wrap kpiSubDiv" data-resid={{d.resId}} data-kpiid="KPI922F8FF7" data-name="ASM磁盘空间使用率" data-showtype="bar" data-barkpiid="KPI4D710FDA,KPI811E751E" data-barxaxis="KPI50267025"
  854 + data-warning="0" data-ident="1" data-trend="0" data-flag="asm" >
  855 + <div class="layui-progress layui-progress-big" lay-showpercent="true">
  856 + <div style="position:absolute; z-index:1;width: 100%" id="{{d.resId}}_asmDiskUsedRate" class="showTipsName" data-id="{{d.resId}}_asmDiskUsedRate" data-message="{{d.asmDiskUsedRate}}"><span style="color: #000000;" >{{d.asmDiskUsedRateName}}</span></div>
  857 + <div class="layui-progress-bar layui-bg-green {{ d.asmDiskUsedRate >= 80 ? 'layui-bg-red' : (d.asmDiskUsedRate <= 50 ? '' : 'layui-bg-orange') }}"
  858 + lay-percent="{{ d.asmDiskUsedRate }}%"
  859 + style="width: {{ d.asmDiskUsedRate }}%;">
  860 + </div>
  861 + </div>
  862 + <span class="layui-progress-text">{{ (d.asmDiskUsedRate == null || d.asmDiskUsedRate == '' || d.asmDiskUsedRate === '未知' || d.asmDiskUsedRate === '无' )? '0%' : d.asmDiskUsedRate +'%' }}</span>
  863 + </div>
  864 +</script>
  865 +<!--weblogic定制表头-->
  866 +<script type="text/html" id="webLogicResNameTpl">
  867 + <div>
  868 + {{# if(d.resType == 'MIDDLEWARE_WEBLOGIC' && (d.parentId == null || d.parentId == '') ){ }}
  869 + <span data-childrennum="{{d.childrenNum}}">{{d.resName}}</span>
  870 + {{# }else{ }}
  871 + <span data-zymc="{{ d.resId }}" data-restype="{{d.resType}}" data-name="{{d.resName}}" data-childrennum="{{d.childrenNum}}" data-ip="{{ d.ip }}" data-resTypeName="{{ d.resTypeName }}" data-admin="{{ d.admin }}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{ d.resName }}</span>
  872 + {{# } }}
  873 + {{# if (d.favId == null) { }}
  874 + <a class="layui-icon layui-icon-rate hide" data-favid="{{d.favId}}" data-id="{{d.resId}}" lay-tips="加入收藏夹" style="font-size: 14px"></a>
  875 + {{# } else { }}
  876 + <a class="layui-icon layui-icon-rate-solid" data-favid="{{d.favId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" data-id="{{d.resId}}" lay-tips="移出收藏夹"></a>
  877 + {{# } }}
  878 + <a class="layui-icon reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"><i class="iconfont">&#XE515;</i></a>
  879 + </div>
  880 +</script>
  881 +<script type="text/html" id="weblogicIpTpl">
  882 + <div>{{d.ip?d.ip:""}}</div>
  883 +</script>
  884 +<script type="text/html" id="weblogicListenAddrTpl">
  885 + <div>{{d.listenAddr?d.listenAddr:""}}</div>
  886 +</script>
  887 +<!--cup核心数-->
  888 +<script type="text/html" id="cpuCoresTpl">
  889 + <div>{{d.cpuCores?(d.cpuCores+"核"):""}}</div>
  890 +</script>
  891 +<!--cup个数-->
  892 +<script type="text/html" id="cpuNumTpl">
  893 + <div>{{d.cpuNum?(d.cpuNum+"个"):""}}</div>
  894 +</script>
1 <title>乙方运维</title> 1 <title>乙方运维</title>
2 -<iframe src="/vue3/index.html#/operationMaintenance" class="layadmin-iframe"/> 2 +<iframe src="/vue3/index.html#/operationMaintenance" class="layadmin-iframe" style="height: 99.5%!important;"/>
  1 +<!--杭州业务管理-->
  2 +<title>业务管理</title>
  3 +<script type="text/html" template>
  4 + {{#
  5 + var access_token = "";
  6 + var workflowPath = "";
  7 + layui.use(['sessions','common','admin'], function () {
  8 + var $ = layui.$;
  9 + var common = layui.common;
  10 + var admin = layui.admin;
  11 + access_token = layui.sessions.getToken()['access_token'];
  12 + workflowPath = common.workflowName;
  13 + $('#businessListHzIframe').attr('src',workflowPath+'/itsm/index.html#/businessListHz?access_token='+access_token);
  14 + });
  15 + }}
  16 + <iframe id="businessListHzIframe" src="{{workflowPath}}/itsm/index.html#/businessListHz?access_token={{access_token}}" frameborder="0" class="layadmin-iframe"></iframe>
  17 +</script>
  1 +<!DOCTYPE html>
  2 +<html>
  3 +<head>
  4 + <meta charset="utf-8">
  5 + <title>综合监控管理平台</title>
  6 + <link rel="shortcut icon" href="../src/style/res/shui.png">
  7 + <meta name="renderer" content="webkit">
  8 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  9 + <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  10 + <link rel="stylesheet" href="/start/layui/css/layui.css" media="all">
  11 + <script>
  12 + /^http(s*):\/\//.test(location.href) || alert('请先部署到 localhost 下再访问');
  13 + </script>
  14 +</head>
  15 +<body>
  16 + <div id="LAY_app"></div>
  17 + <script src="/start/layui/layui.js"></script>
  18 + <script>
  19 + layui.use(['jquery'], function () {
  20 + var $ = layui.jquery;
  21 + // 读取配置文件
  22 + $.when(
  23 + $.ajax({
  24 + url: '/config/getConfig',
  25 + data: {
  26 + configName: 'url'
  27 + },
  28 + async: false
  29 + }),$.ajax({
  30 + url: '/config/getConfig',
  31 + data: {
  32 + configName: 'config.audio'
  33 + },
  34 + }),
  35 + ).done(function (res1,res2) {
  36 + sessionStorage.setItem('domainName', res1[0].gateway);
  37 + sessionStorage.setItem('domainInspectionURI', res1[0].inspection_web);
  38 + sessionStorage.setItem('domainAssetsManage', res1[0].assetsweb);
  39 + sessionStorage.setItem('graphEditorOrigin', res1[0].mxgraph_editor);
  40 + sessionStorage.setItem('tingyun', res1[0].tingyun);
  41 + sessionStorage.setItem('bigScreen', res1[0].bigScreen);
  42 + sessionStorage.setItem('ythView', res1[0].ythView);
  43 + sessionStorage.setItem('workflow', res1[0].workflow);
  44 + sessionStorage.setItem('mp3', res2[0].mp3);
  45 + sessionStorage.setItem('jimuReport', res1[0].jimuReport);
  46 + })
  47 + });
  48 + layui.config({
  49 + base: '../src/' //指定 layuiAdmin 项目路径,本地开发用 src,线上用 dist
  50 +// ,version: '1.2.1'//运行环境用个固定版本号
  51 + ,version: new Date().getTime()//本地开发环境,避免改动后的文件未及时生效,所以用时间戳作为版本
  52 + }).use('index');
  53 + </script>
  54 +</body>
  55 +</html>
  56 +
  57 +
@@ -5,3 +5,16 @@ @@ -5,3 +5,16 @@
5 5
6 /*乙方运维*/ 6 /*乙方运维*/
7 @import "../css/operationMaintenance.css"; 7 @import "../css/operationMaintenance.css";
  8 +
  9 +/*电子大屏*/
  10 +@import "../css/bigscreen.css";
  11 +
  12 +@import "../css/topfive.css";
  13 +
  14 +@import "../css/global.css";
  15 +
  16 +@import "../css/deduction.css";
  17 +
  18 +@import "../css/businessVolume.css";
  19 +
  20 +@import "../css/digitalboard.css";
  1 +/* 大屏配置 ---start */
  2 +.com-page {
  3 + width: 100%;
  4 + height: 100%;
  5 + overflow: hidden;
  6 +}
  7 +
  8 +.com-container {
  9 + width: 100%;
  10 + height: 100%;
  11 + overflow: hidden;
  12 +}
  13 +
  14 +.com-chart {
  15 + width: 100%;
  16 + height: 100%;
  17 + overflow: hidden;
  18 +}
  19 +/* 大屏配置 ---end */
  20 +
  21 +.screen-container {
  22 + width: 100%;
  23 + height: 100%;
  24 + padding: 0 0.2%;
  25 + background: url(bg_backgroud.png);
  26 + background-size: 100% 100%;
  27 + color: #fff;
  28 + box-sizing: border-box;
  29 +}
  30 +
  31 +.screen-header {
  32 + width: 100%;
  33 + position: relative;
  34 +}
  35 +.screen-header .title{
  36 + position: absolute;
  37 + left: 50%;
  38 + top: 56%;
  39 + transform: translate(-50%, -50%);
  40 +}
  41 +.screen-header .title-left{
  42 + display: flex;
  43 + align-items: center;
  44 + position:absolute;
  45 + transform: translateY(-80%);
  46 + left: 1%;
  47 + top: 55%;
  48 +}
  49 +.screen-header .timelog{
  50 + cursor: pointer;
  51 +}
  52 +
  53 +.screen-body {
  54 + width: 100%;
  55 + height: 60%;
  56 + display: flex;
  57 + margin-bottom: 0.2%;
  58 +}
  59 +.screen-left {
  60 + height: 100%;
  61 + width: 30%;
  62 +}
  63 +.screen-left #left-top {
  64 + height: 56%;
  65 + position: relative;
  66 +}
  67 +.screen-left #left-bottom {
  68 + height: 43.8%;
  69 + position: relative;
  70 +}
  71 +.screen-middle {
  72 + height: 100%;
  73 + width: 40%;
  74 + margin-top: 0.5%;
  75 + margin-left: 0.2%;
  76 + margin-right: 0.2%;
  77 +}
  78 +.screen-middle #middle-top {
  79 + width: 100%;
  80 + height: 32.4%;
  81 + position: relative;
  82 +}
  83 +.screen-middle #middle-center {
  84 + width: 100%;
  85 + height: 32.4%;
  86 + position: relative;
  87 +}
  88 +.screen-middle #middle-bottom {
  89 + width: 100%;
  90 + height: 34%;
  91 + position: relative;
  92 +}
  93 +
  94 +.screen-right {
  95 + height: 100%;
  96 + width: 30%;
  97 +}
  98 +
  99 +.screen-right #right-top {
  100 + height: 26%;
  101 + position: relative;
  102 +}
  103 +.screen-right #right-center {
  104 + height: 37%;
  105 + position: relative;
  106 +}
  107 +.screen-right #right-bottom {
  108 + height: 37%;
  109 + position: relative;
  110 +}
  111 +
  112 +.screen-bottom {
  113 + width: 100%;
  114 + height: 34%;
  115 + display: flex;
  116 +}
  117 +.screen-bottom #bottom-one {
  118 + height: 100%;
  119 + width: 25%;
  120 + position: relative;
  121 +}
  122 +.screen-bottom #bottom-two {
  123 + height: 100%;
  124 + width: 25%;
  125 + position: relative;
  126 +}
  127 +.screen-bottom #bottom-three {
  128 + height: 100%;
  129 + width: 25%;
  130 + position: relative;
  131 +}
  132 +.screen-bottom #bottom-four {
  133 + height: 100%;
  134 + width: 25%;
  135 + position: relative;
  136 +}
  1 +.busniess-title-size {
  2 + position: absolute;
  3 + left: 13%;
  4 + top: 3%;
  5 +}
  6 +.busniess-title-img {
  7 + position: absolute;
  8 + left: 5%;
  9 + top: 2%;
  10 +}
  11 +.busniess-box-title {
  12 + margin-left: 8%;
  13 +}
  14 +.busniess-circle-left {
  15 + position: absolute;
  16 + left: 19%;
  17 + top: 59%;
  18 +}
  19 +.busniess-circle-right {
  20 + position: absolute;
  21 + left: 63%;
  22 + top: 59%;
  23 +}
  24 +.busniess-circle-text {
  25 + text-align: center;
  26 +}
  1 +.com-box {
  2 + text-align: center;
  3 +}
  4 +.deduction-box-title {
  5 + position: absolute;
  6 + left: 2%;
  7 + top: 1%;
  8 +}
  9 +.deduction-title-size {
  10 + position: absolute;
  11 + left: 9%;
  12 + top: 20%;
  13 +}
  14 +.deduction-box-text-left {
  15 + position: absolute;
  16 + left: 12%;
  17 + top: 45%;
  18 +}
  19 +.deduction-box-text-right {
  20 + position: absolute;
  21 + left: 60%;
  22 + top: 45%;
  23 +}
  24 +.deduction-text-number {
  25 + color: #01E6E6;
  26 +}
  1 +.com-box {
  2 + text-align: center;
  3 +}
  4 +.com-box-right {
  5 + text-align: right;
  6 +}
  7 +.span-box-title {
  8 + position: absolute;
  9 + color: #FEFEFE;
  10 + top: 1%;
  11 + left: 6%;
  12 +}
  13 +
  14 +@font-face{
  15 + font-family: yjsz;
  16 + /*src: url('../assets/font/DS-DIGIT.TTF');*/
  17 + src: url(DS-DIGIT.TTF);
  18 +}
  1 +html, body, #app {
  2 + width: 100%;
  3 + height: 100%;
  4 + padding: 0;
  5 + margin: 0;
  6 + overflow: hidden;
  7 +}
  8 +
  9 +.com-page {
  10 + width: 100%;
  11 + height: 100%;
  12 + overflow: hidden;
  13 +}
  14 +
  15 +.com-container {
  16 + width: 100%;
  17 + height: 100%;
  18 + overflow: hidden;
  19 +}
  20 +
  21 +.com-chart {
  22 + width: 100%;
  23 + height: 100%;
  24 + overflow: hidden;
  25 +}
  26 +
  27 +canvas {
  28 + border-radius: 20px;
  29 +}
  1 +.topfive-title-size {
  2 + position: absolute;
  3 + left: 16%;
  4 + top: 7%;
  5 +}
  6 +.topfive-title-img {
  7 + position: absolute;
  8 + left: 5%;
  9 + top: 5%;
  10 +}
  1 +@charset "utf-8";
  2 +/* CSS Document */
  3 +*{
  4 + -webkit-box-sizing: border-box;
  5 + -moz-box-sizing: border-box;
  6 + box-sizing: border-box}
  7 +*,body{padding:0px; margin:0px;color: #222;font-family: "微软雅黑";}
  8 +@font-face{font-family:electronicFont;src:url(../font/DS-DIGIT.TTF)}
  9 +body{ background:#000d4a url(../images/bg.jpg) center top; background-size:cover;color:#666;font-size: .1rem;}
  10 +li{ list-style-type:none;}
  11 +table{}
  12 +i{ margin:0px; padding:0px; text-indent:0px;}
  13 +img{ border:none; max-width: 100%;}
  14 +a{ text-decoration:none; color:#399bff;}
  15 +a.active,a:focus{ outline:none!important; text-decoration:none;}
  16 +ol,ul,p,h1,h2,h3,h4,h5,h6{ padding:0; margin:0}
  17 +a:hover{ color:#06c; text-decoration: none!important}
  18 +
  19 +
  20 +.clearfix:after, .clearfix:before {
  21 + display: table;
  22 + content: " "
  23 +}
  24 + .clearfix:after {
  25 + clear: both
  26 +}
  27 +.pulll_left{float:left;}
  28 +.pulll_right{float:right;}
  29 +/*谷哥滚动条样式*/
  30 +
  31 + ::-webkit-scrollbar {width:5px;height:5px;position:absolute}
  32 + ::-webkit-scrollbar-thumb {background-color:#5bc0de}
  33 + ::-webkit-scrollbar-track {background-color:#ddd}
  34 +
  35 +/***/
  36 +.canvas{position: absolute; width:100%; left: 0; top: 0; height: 99%; z-index: 1;}
  37 +
  38 +.allnav{height: calc(100% - 30px);}
  39 +.loading{position:fixed; left:0; top:0; font-size:18px; z-index:100000000;width:100%; height:100%; background:#1a1a1c; text-align:center;}
  40 +.loadbox{position:absolute; width:160px;height:150px; color: #aaa; left:50%; top:50%; margin-top:-100px; margin-left:-75px;}
  41 +.loadbox img{ margin:10px auto; display:block; width:40px;}
  42 +
  43 +.copyright{ background:rgba(19,31,64,.32); border: 1px solid rgba(255,255,255,.05); line-height:.5rem; text-align: center; padding-right: 15px; bottom: 0; color:rgba(255,255,255,.7); font-size: .16rem; }
  44 +
  45 +.head{ height:1.05rem; background: url(../images/head_bg.png) no-repeat center center; background-size: 100% 100%; position: relative; z-index: 100;}
  46 +.head h1{ color:#fff; text-align: center; font-size: .4rem; line-height:.8rem;}
  47 +.head h1 img{ width:1.5rem; display: inline-block; vertical-align: middle; margin-right: .2rem}
  48 +.weather{ position:absolute; right:.3rem; top:0; line-height: .75rem;}
  49 +.weather img{ width:.37rem; display: inline-block; vertical-align: middle;}
  50 +.weather span{color:rgba(255,255,255,.7); font-size: .18rem; padding-right: .1rem;}
  51 +.mainbox{ padding:.1rem .1rem 0rem .1rem;}
  52 +.mainbox>ul{}
  53 +.mainbox>ul>li{ float: left; padding: 0 .1rem}
  54 +
  55 +.mainbox>ul>li{ width: 30%}
  56 +.mainbox>ul>li:nth-child(2){ width: 40%;padding: 0}
  57 +
  58 +.boxall{ border: 1px solid rgba(25,186,139,.17); padding:0 .2rem .4rem .15rem; background: rgba(255,255,255,.04) url(../images/line.png); background-size: 100% auto; position: relative; margin-bottom: .15rem; z-index: 10;}
  59 +.boxall:before,
  60 +.boxall:after{ position:absolute; width: .1rem; height: .1rem; content: ""; border-top: 2px solid #02a6b5; top: 0;}
  61 +.boxall:before,.boxfoot:before{border-left: 2px solid #02a6b5;left: 0;}
  62 +.boxall:after,.boxfoot:after{border-right: 2px solid #02a6b5; right: 0;}
  63 +.alltitle{ font-size:.2rem; color:#fff; text-align: center; line-height: .5rem;}
  64 +
  65 +.boxfoot{ position:absolute; bottom: 0; width: 100%; left: 0;}
  66 +.boxfoot:before,
  67 +.boxfoot:after{ position:absolute; width: .1rem; height: .1rem; content: "";border-bottom: 2px solid #02a6b5; bottom: 0;}
  68 +
  69 +.bar{background:rgba(101,132,226,.1); padding: .15rem;}
  70 +.barbox li,.barbox2 li{ width:50%; text-align: center; position: relative; z-index: 100;}
  71 +.barbox:before,
  72 +.barbox:after{ position:absolute; width: .3rem; height: .1rem; content: ""; }
  73 +.barbox:before{border-left: 2px solid #02a6b5;left: 0;border-top: 2px solid #02a6b5; }
  74 +.barbox:after{border-right: 2px solid #02a6b5; right: 0; bottom: 0;border-bottom: 2px solid #02a6b5; }
  75 +
  76 +.barbox li:first-child:before{ position:absolute; content: ""; height:50%; width: 1px; background: rgba(255,255,255,.2); right: 0; top: 25%;}
  77 +
  78 +.barbox{ border: 1px solid rgba(25,186,139,.17); position: relative;}
  79 +.barbox li{ font-size: .7rem; color: #ffeb7b; padding: .05rem 0; font-family:electronicFont; font-weight: bold;}
  80 +.barbox2 li{ font-size: .19rem; color:rgba(255,255,255,.7); padding-top: .1rem;}
  81 +
  82 +.map{ position:relative; height: 7.2rem; z-index: 9;}
  83 +.map4{ width: 200%; height:7rem; position: relative; left: -50%; top: 4%; margin-top: .2rem; z-index: 5;}
  84 +.map1,.map2,.map3{ position:absolute; opacity: .5}
  85 +.map1{ width:6.43rem; z-index: 2;top:.45rem; left: .7rem; animation: myfirst2 15s infinite linear;}
  86 +.map2{ width:5.66rem; top:.85rem; left:1.2rem; z-index: 3; opacity: 0.2; animation: myfirst 10s infinite linear;}
  87 +.map3{ width:5.18rem; top:1.07rem; left: 1.4rem; z-index: 1;}
  88 +
  89 +
  90 +
  91 +
  92 +
  93 +.tabs { text-align: center; padding: .1rem 0 0 0;}
  94 +.tabs a {
  95 + position: relative;
  96 + display: inline-block;
  97 + margin-left: 1px;
  98 + padding:.05rem .2rem;
  99 + color: #898989;
  100 + transition: all .3s ease-out 0s;
  101 + font-size: 14px;
  102 +}
  103 +.tabs li{ display:inline-block;}
  104 +.tabs a:after {
  105 + position: absolute;
  106 + width: 1px;
  107 + height: 10px;
  108 + background-color: rgba(255,255,255,.1);
  109 + content: '';
  110 + margin-left:0; right:-1px; margin-top: 7px;
  111 +
  112 +
  113 +}
  114 +.tabs li a.active {border: 1px solid rgba(25,186,139,.17); background: rgba(255,255,255,.05); color:#fff;}
  115 +
  116 +.tit02{ text-align:center; margin: .1rem 0; position: relative}
  117 +.tit02 span{border: 1px solid rgba(25,186,139,.17); letter-spacing: 2px; padding: .01rem .2rem; background: rgba(255,255,255,.05); font-size: .18rem; color: #49bcf7;}
  118 +.tit02:before,.tit02:after{ position:absolute; width:26%; height: 1px;background: rgba(25,186,139,.2); content: ""; top: .12rem;}
  119 +.tit02:after{ right:0;}
  120 +.tit02:before{ left:0;}
  121 +
  122 +.wrap{ height:2.54rem; overflow: hidden;}
  123 +.wrap li{ line-height:.42rem; height:.42rem; font-size: .18rem; text-indent: .24rem; margin-bottom: .1rem; }
  124 +.wrap li p{border: 1px solid rgba(25,186,139,.17);color: rgba(255,255,255,.6); }
  125 +.sy{ float:left; width: 33%; height:95%; margin-top: .25rem;}
  126 +
  127 +
  128 +.adduser{ height:1.5rem; overflow: hidden;}
  129 +.adduser li{height:.5rem;}
  130 +.adduser img{ width: .40rem; border-radius: .5rem; margin-right: .1rem; display: inline-block; vertical-align: middle;}
  131 +.adduser span{ line-height:.5rem; font-size: .18rem;color: rgba(255,255,255,.6); }
  132 +
  133 +.sycm ul{ margin-left:-.5rem;margin-right:-.5rem; padding: .16rem 0;}
  134 +.sycm li{ float: left; width: 33.33%; text-align: center; position: relative}
  135 +.sycm li:before{ position:absolute; content: ""; height:30%; width: 1px; background: rgba(255,255,255,.1); right: 0; top: 15%;}
  136 +.sycm li:last-child:before{ width: 0;}
  137 +
  138 +.sycm li h2{ font-size:.3rem; color: #c5ccff;}
  139 +.sycm li span{ font-size:.18rem; color: #fff; opacity: .5;}
  140 +
  141 +@keyframes myfirst2
  142 +{
  143 +from {transform: rotate(0deg);}
  144 +to {transform: rotate(359deg);}
  145 +}
  146 +
  147 +@keyframes myfirst
  148 +{
  149 +from {transform: rotate(0deg);}
  150 +to {transform: rotate(-359deg);}
  151 +}
  152 +
  153 +/*Plugin CSS*/
  154 +.str_wrap {
  155 + overflow:hidden;
  156 + width:100%;
  157 + position:relative;
  158 + -moz-user-select: none;
  159 + -khtml-user-select: none;
  160 + user-select: none;
  161 + white-space:nowrap;
  162 +}
  163 +
  164 +
  165 +.str_move {
  166 + white-space:nowrap;
  167 + position:absolute;
  168 + top:0;
  169 + left:0;
  170 + cursor:move;
  171 +}
  172 +.str_move_clone {
  173 + display:inline-block;
  174 + vertical-align:top;
  175 + position:absolute;
  176 + left:100%;
  177 + top:0;
  178 +}
  179 +.str_vertical .str_move_clone {
  180 + left:0;
  181 + top:100%;
  182 +}
  183 +.str_down .str_move_clone {
  184 + left:0;
  185 + bottom:100%;
  186 +}
  187 +.str_vertical .str_move,
  188 +.str_down .str_move {
  189 + white-space:normal;
  190 + width:100%;
  191 +}
  192 +.str_static .str_move,
  193 +.no_drag .str_move,
  194 +.noStop .str_move{
  195 + cursor:inherit;
  196 +}
  197 +.str_wrap img {
  198 + max-width:none !important;
  199 +}
  1 +html, body, #app {
  2 + width: 100%;
  3 + height: 100%;
  4 + padding: 0;
  5 + margin: 0;
  6 + overflow: hidden;
  7 +}
  8 +
  9 +.com-page {
  10 + width: 100%;
  11 + height: 100%;
  12 + overflow: hidden;
  13 +}
  14 +
  15 +.com-container {
  16 + width: 100%;
  17 + height: 100%;
  18 + overflow: hidden;
  19 +}
  20 +
  21 +.com-chart {
  22 + width: 100%;
  23 + height: 100%;
  24 + overflow: hidden;
  25 +}
  26 +
  27 +canvas {
  28 + border-radius: 20px;
  29 +}