Authored by CN守护者

Merge branch 'master' of http://192.168.1.136:82/monitor_v3/hg-monitor-web into wuhl-master

# Conflicts:
#	hg-monitor-web-zj/src/main/resources/static/vue3/src/router/index.js
Showing 36 changed files with 3804 additions and 464 deletions

Too many changes to show.

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

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,10 +6,9 @@ @@ -6,10 +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 - <!--:default-expanded-keys="[currentNodeData.id]"--> 9 + <!---->
10 <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"
11 - :expand-on-click-node="false" :expand-on-click-node="true"  
12 - > 11 + :expand-on-click-node="false" :expand-on-click-node="true" :default-expanded-keys="defaultExpandedKeys">
13 <template #default="{ node, data }"> 12 <template #default="{ node, data }">
14 <div style="display: flex;flex-direction: row;width: 100%;"> 13 <div style="display: flex;flex-direction: row;width: 100%;">
15 <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">
@@ -9,7 +9,7 @@ export default { @@ -9,7 +9,7 @@ export default {
9 // 展示文档类型,默认展示类型 9 // 展示文档类型,默认展示类型
10 types: { 10 types: {
11 type: Array, 11 type: Array,
12 - default: ['fxbg', 'gf', 'gzgl', 'jkjc', 'lxwh', 'pzgl', '', 'rcxj'] 12 + default: ['fxbg', 'gf', 'gzgl', 'jkjc', 'lxwh', 'pzgl', 'rcxj']
13 }, 13 },
14 // 是否是预览模式 14 // 是否是预览模式
15 // 预览模式不展示授权按钮 15 // 预览模式不展示授权按钮
@@ -22,7 +22,12 @@ export default { @@ -22,7 +22,12 @@ export default {
22 viewTypeId: { 22 viewTypeId: {
23 type: String, 23 type: String,
24 default: '' 24 default: ''
  25 + },
  26 + fileIds: {
  27 + type: Array,
  28 + default: []
25 } 29 }
  30 +
26 }, 31 },
27 data() { 32 data() {
28 return { 33 return {
@@ -90,8 +95,12 @@ export default { @@ -90,8 +95,12 @@ export default {
90 'vob': 'icon-avi', 95 'vob': 'icon-avi',
91 'zip': 'icon-zip-full', 96 'zip': 'icon-zip-full',
92 } 97 }
  98 + // 树数据
93 let treeData = Vue.ref([]); 99 let treeData = Vue.ref([]);
  100 + // 当前节点数据
94 let currentNodeData = Vue.ref({}); 101 let currentNodeData = Vue.ref({});
  102 + // 默认打开节点
  103 + let defaultExpandedKeys = Vue.ref([]);
95 104
96 // 获取文件列表或者打开文件 105 // 获取文件列表或者打开文件
97 let getFile = (item) => { 106 let getFile = (item) => {
@@ -148,26 +157,30 @@ export default { @@ -148,26 +157,30 @@ export default {
148 // 左侧树 157 // 左侧树
149 let getTree = () => { 158 let getTree = () => {
150 // 加载列表 159 // 加载列表
151 - 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) {
152 if (res && res.data) { 161 if (res && res.data) {
153 -  
154 treeData.value = res.data; 162 treeData.value = res.data;
155 -  
156 let first = res.data[0]; 163 let first = res.data[0];
157 currentNodeData.value = first; 164 currentNodeData.value = first;
158 165
159 - // 加载所有  
160 - getPage('0'); 166 + let arr = [];
  167 + arr.push(first.id);
  168 + defaultExpandedKeys.value = arr;
  169 +
  170 + // 加载第一个节点数据
  171 + getPage(first.id);
161 } 172 }
162 }) 173 })
163 } 174 }
164 175
165 // 获取表格树 176 // 获取表格树
166 let getPage = (id) => { 177 let getPage = (id) => {
  178 + let docIds = props.fileIds.length == 0 ? '' : props.fileIds.join(',')
167 let params = { 179 let params = {
168 id: id, 180 id: id,
169 name: keyWord.value, 181 name: keyWord.value,
170 - types: props.types.join(',') 182 + types: props.types.join(','),
  183 + docIds:docIds
171 } 184 }
172 // 加载列表 185 // 加载列表
173 proxy.$http.get(`/inspection-report/file/document/list`, params, function (res) { 186 proxy.$http.get(`/inspection-report/file/document/list`, params, function (res) {
@@ -185,6 +198,10 @@ export default { @@ -185,6 +198,10 @@ export default {
185 let nodeClick = (node, data) => { 198 let nodeClick = (node, data) => {
186 let id = data.id; 199 let id = data.id;
187 currentNodeData.value = data; 200 currentNodeData.value = data;
  201 +
  202 + let arr = [];
  203 + arr.push(id);
  204 + defaultExpandedKeys.value = arr;
188 getPage(id); 205 getPage(id);
189 } 206 }
190 207
@@ -236,7 +253,6 @@ export default { @@ -236,7 +253,6 @@ export default {
236 params = info; 253 params = info;
237 } 254 }
238 proxy.$global.confirm(msg, function () { 255 proxy.$global.confirm(msg, function () {
239 - debugger  
240 // ok 256 // ok
241 proxy.$http.post(`/inspection-report/file/change`,params , function (res) { 257 proxy.$http.post(`/inspection-report/file/change`,params , function (res) {
242 if (res && res.code == 0) { 258 if (res && res.code == 0) {
@@ -379,8 +395,6 @@ export default { @@ -379,8 +395,6 @@ export default {
379 proxy.$global.showMsg('授权失败!', 'warning'); 395 proxy.$global.showMsg('授权失败!', 'warning');
380 } 396 }
381 }) 397 })
382 - // 隐藏授权弹框  
383 - showUserDialog(false);  
384 } 398 }
385 399
386 // 上传 400 // 上传
@@ -393,7 +407,8 @@ export default { @@ -393,7 +407,8 @@ export default {
393 } 407 }
394 let uploadCallBack = ({document,fileInfo}) => { 408 let uploadCallBack = ({document,fileInfo}) => {
395 reload(false); 409 reload(false);
396 - console.log(111111111111,document,fileInfo); 410 + // 执行回调
  411 + emit('callback',{document,fileInfo});
397 } 412 }
398 413
399 /** 414 /**
@@ -435,6 +450,11 @@ export default { @@ -435,6 +450,11 @@ export default {
435 left: 0, 450 left: 0,
436 right: 24 451 right: 24
437 } 452 }
  453 + currentNodeData.value = {
  454 + docType: props.viewTypeId,
  455 + docNo: props.viewTypeId,
  456 + id: props.viewTypeId
  457 + }
438 getPage(props.viewTypeId); 458 getPage(props.viewTypeId);
439 } 459 }
440 }) 460 })
@@ -460,6 +480,7 @@ export default { @@ -460,6 +480,7 @@ export default {
460 480
461 downloadFile, 481 downloadFile,
462 482
  483 + defaultExpandedKeys,
463 currentNodeData, 484 currentNodeData,
464 docForm, 485 docForm,
465 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">
@@ -25,3 +26,14 @@ @@ -25,3 +26,14 @@
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
@@ -126,6 +135,17 @@ export default { @@ -126,6 +135,17 @@ export default {
126 let uploadFile = () => { 135 let uploadFile = () => {
127 proxy.$refs.upload.submit() 136 proxy.$refs.upload.submit()
128 } 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 +
129 // 监听编辑状态 149 // 监听编辑状态
130 Vue.watch( 150 Vue.watch(
131 () => props.showDialogVisible, (newValue, oldVlaue) => { 151 () => props.showDialogVisible, (newValue, oldVlaue) => {
@@ -142,10 +162,12 @@ export default { @@ -142,10 +162,12 @@ export default {
142 162
143 163
144 return { 164 return {
  165 + getInsetFile,
145 getFile, 166 getFile,
146 show, 167 show,
147 uploadFile, 168 uploadFile,
148 - hidedialog 169 + hidedialog,
  170 + beforeUpload
149 } 171 }
150 } 172 }
151 } 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,53 +48,59 @@ export default { @@ -26,53 +48,59 @@ 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 = () => {
29 - // 查询全部用户  
30 - proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) {  
31 - if (res && res.data) {  
32 - res.data.map(function (v) {  
33 - let desc = [];  
34 - let orgName = v.orgName;  
35 - let nickname = v.nickname;  
36 - if (orgName) {  
37 - desc.push(orgName);  
38 - }  
39 - if (nickname) {  
40 - desc.push(nickname);  
41 - }  
42 -  
43 - userArr.value.push({  
44 - value: v.username,  
45 - type:'USER',  
46 - desc: `${desc.join(' / ')}`,  
47 - props : v  
48 - })  
49 - });  
50 - }  
51 - }) 51 + if(props.loadUserDta){
  52 + // 查询全部用户
  53 + proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) {
  54 + if (res && res.data) {
  55 + res.data.map(function (v) {
  56 + let desc = [];
  57 + let orgName = v.orgName;
  58 + let nickname = v.nickname;
  59 + if (orgName) {
  60 + desc.push(orgName);
  61 + }
  62 + if (nickname) {
  63 + desc.push(nickname);
  64 + }
  65 +
  66 + userArr.value.push({
  67 + value: v.username,
  68 + type:'USER',
  69 + desc: `${desc.join(' / ')}`,
  70 + props : v
  71 + })
  72 + });
  73 + }
  74 + },function (){},false)
  75 + }
  76 +
  77 + if(props.loadRoleDta){
  78 + // 查询全部角色
  79 + proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) {
  80 + if (res && res.data) {
  81 + res.data.map(function (v) {
  82 + let desc = [];
  83 + let code = v.code;
  84 + let name = v.name;
  85 + if (name) {
  86 + desc.push(name);
  87 + }
  88 + if (code) {
  89 + desc.push(code);
  90 + }
  91 +
  92 + userArr.value.push({
  93 + value: v.id,
  94 + type:'ROLE',
  95 + desc: `${desc.join(' / ')}`,
  96 + props : v
  97 + })
  98 + });
  99 + }
  100 + },function (){},false)
  101 + }
  102 +
52 103
53 - // 查询全部角色  
54 - proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) {  
55 - if (res && res.data) {  
56 - res.data.map(function (v) {  
57 - let desc = [];  
58 - let code = v.code;  
59 - let name = v.name;  
60 - if (name) {  
61 - desc.push(name);  
62 - }  
63 - if (code) {  
64 - desc.push(code);  
65 - }  
66 -  
67 - userArr.value.push({  
68 - value: v.id,  
69 - type:'ROLE',  
70 - desc: `${desc.join(' / ')}`,  
71 - props : v  
72 - })  
73 - });  
74 - }  
75 - })  
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
@@ -12,13 +12,19 @@ let http = { @@ -12,13 +12,19 @@ let http = {
12 window.location.reload(); 12 window.location.reload();
13 } 13 }
14 }, 14 },
15 - post: function (requestUrl, data, callback) { 15 + post: function (requestUrl, data, callback, errFunc,showLoadding) {
16 if (http.proxy == null) { 16 if (http.proxy == null) {
17 const {proxy} = Vue.getCurrentInstance() 17 const {proxy} = Vue.getCurrentInstance()
18 http.proxy = proxy; 18 http.proxy = proxy;
19 } 19 }
20 -  
21 - 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 + }
22 var access_token = 'access_token=' + http.getToken(); 28 var access_token = 'access_token=' + http.getToken();
23 if (requestUrl.indexOf('?') == -1) { 29 if (requestUrl.indexOf('?') == -1) {
24 requestUrl += '?' + access_token; 30 requestUrl += '?' + access_token;
@@ -34,7 +40,12 @@ let http = { @@ -34,7 +40,12 @@ let http = {
34 async: true, 40 async: true,
35 data: JSON.stringify(data), 41 data: JSON.stringify(data),
36 error: function (xhr, textStatus) { 42 error: function (xhr, textStatus) {
37 - loading.close(); 43 + if(showLoadding && showLoadding == true){
  44 + loading.close();
  45 + }
  46 + if (errFunc) {
  47 + errFunc();
  48 + }
38 console.log("==>", requestUrl, xhr, textStatus) 49 console.log("==>", requestUrl, xhr, textStatus)
39 http.reqErr(textStatus.status); 50 http.reqErr(textStatus.status);
40 }, 51 },
@@ -42,19 +53,28 @@ let http = { @@ -42,19 +53,28 @@ let http = {
42 if (callback) { 53 if (callback) {
43 callback(data); 54 callback(data);
44 } 55 }
45 - loading.close() 56 + if(showLoadding && showLoadding == true){
  57 + loading.close();
  58 + }
46 //console.log("==>", requestUrl, jqXHR, textStatus) 59 //console.log("==>", requestUrl, jqXHR, textStatus)
47 60
48 } 61 }
49 }); 62 });
50 63
51 }, 64 },
52 - get: function (requestUrl, data, callback, errFunc) { 65 + get: function (requestUrl, data, callback, errFunc,showLoadding) {
53 if (http.proxy == null) { 66 if (http.proxy == null) {
54 const {proxy} = Vue.getCurrentInstance() 67 const {proxy} = Vue.getCurrentInstance()
55 http.proxy = proxy; 68 http.proxy = proxy;
56 } 69 }
57 - 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 + }
58 var access_token = 'access_token=' + http.getToken(); 78 var access_token = 'access_token=' + http.getToken();
59 if (requestUrl.indexOf('?') == -1) { 79 if (requestUrl.indexOf('?') == -1) {
60 requestUrl += '?' + access_token; 80 requestUrl += '?' + access_token;
@@ -69,7 +89,9 @@ let http = { @@ -69,7 +89,9 @@ let http = {
69 }, 89 },
70 data: data, 90 data: data,
71 error: function (xhr, textStatus) { 91 error: function (xhr, textStatus) {
72 - loading.close(); 92 + if(showLoadding && showLoadding == true){
  93 + loading.close();
  94 + }
73 console.log("==>", requestUrl, xhr, textStatus) 95 console.log("==>", requestUrl, xhr, textStatus)
74 http.reqErr(textStatus.status); 96 http.reqErr(textStatus.status);
75 97
@@ -82,7 +104,9 @@ let http = { @@ -82,7 +104,9 @@ let http = {
82 if (callback) { 104 if (callback) {
83 callback(data); 105 callback(data);
84 } 106 }
85 - loading.close(); 107 + if(showLoadding && showLoadding == true){
  108 + loading.close();
  109 + }
86 //console.log("==>", requestUrl, jqXHR, textStatus) 110 //console.log("==>", requestUrl, jqXHR, textStatus)
87 } 111 }
88 }); 112 });
@@ -146,9 +170,7 @@ let http = { @@ -146,9 +170,7 @@ let http = {
146 return `${keys}`; 170 return `${keys}`;
147 } 171 }
148 let p = formart(parmas); 172 let p = formart(parmas);
149 - debugger  
150 window.open(sessionStorage.getItem('domainName') + requestUrl + "&" + p); 173 window.open(sessionStorage.getItem('domainName') + requestUrl + "&" + p);
151 -  
152 }, 174 },
153 getToken() { 175 getToken() {
154 return localStorage.getItem('access_token'); 176 return localStorage.getItem('access_token');
@@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
5 5
6 @SpringBootApplication 6 @SpringBootApplication
7 public class HGMonitorZJWebApplication { 7 public class HGMonitorZJWebApplication {
8 - 8 +
9 public static void main(String[] args) { 9 public static void main(String[] args) {
10 SpringApplication.run(HGMonitorZJWebApplication.class, args); 10 SpringApplication.run(HGMonitorZJWebApplication.class, args);
11 } 11 }
@@ -12,12 +12,14 @@ server: @@ -12,12 +12,14 @@ server:
12 key-store-password: Hg0801.. 12 key-store-password: Hg0801..
13 key-password: Hg0801.. 13 key-password: Hg0801..
14 url: 14 url:
15 - gateway: http://192.168.0.41:8080 15 + gateway: http://172.16.20.43:8080
16 inspection_web: http://127.0.0.1:8082 16 inspection_web: http://127.0.0.1:8082
17 assetsweb: http://127.0.0.1:8082 17 assetsweb: http://127.0.0.1:8082
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 + # 一体化视图
  22 + ythView: http://192.168.0.69:18089
21 #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件 23 #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件
22 workflow: http://192.168.0.248:8002 24 workflow: http://192.168.0.248:8002
23 # 积木报表工具 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 +<!--默认布局-->
  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 +<!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 +
1 -<div>  
2 - <div>  
3 - 文档管理组件  
4 - </div>  
5 -</div> 1 +<cm-document v-if="initFlg" :isView="true" :viewTypeId="docType" :types="[docType]" :fileIds="docIds" @callback="saveOpsLog"></cm-document>
@@ -5,149 +5,86 @@ export default { @@ -5,149 +5,86 @@ export default {
5 data() { 5 data() {
6 return {} 6 return {}
7 }, 7 },
8 - setup() {  
9 - let height = Vue.ref(window.innerHeight - 130); 8 + props: {
  9 + // 当前节点
  10 + treeNode: {
  11 + type: Object,
  12 + default: {}
  13 + },
  14 + // 当前节点的上级节点
  15 + parentNode: {
  16 + type: Object,
  17 + default: {}
  18 + },
  19 + // 项目id
  20 + projectId: {
  21 + type: String,
  22 + default: ''
  23 + },
  24 + // 文件类型
  25 + docType: {
  26 + type: String,
  27 + default: ''
  28 + },
  29 + },
  30 + setup(props, {attrs, slots, emit}) {
10 31
11 const {proxy} = Vue.getCurrentInstance(); 32 const {proxy} = Vue.getCurrentInstance();
  33 + let docIds = Vue.ref([]);
  34 + let initFlg = Vue.ref(false);
12 35
13 -  
14 - let columns = Vue.ref([  
15 - {  
16 - prop: 'fileName',  
17 - label: '年度',  
18 - sortable: true,  
19 - align: 'left',  
20 - render: function (row) {  
21 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
22 - }  
23 - },  
24 - {  
25 - prop: 'm1',  
26 - label: '1月',  
27 - sortable: true,  
28 - align: 'left',  
29 - render: function (row) {  
30 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
31 - }  
32 - },  
33 - {  
34 - prop: 'm2',  
35 - label: '2月',  
36 - sortable: true,  
37 - align: 'left',  
38 - render: function (row) {  
39 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
40 - }  
41 - },  
42 - {  
43 - prop: 'm3',  
44 - label: '3月',  
45 - sortable: true,  
46 - align: 'left',  
47 - render: function (row) {  
48 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
49 - }  
50 - },  
51 - {  
52 - prop: 'm4',  
53 - label: '4月',  
54 - sortable: true,  
55 - align: 'left',  
56 - render: function (row) {  
57 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
58 - }  
59 - },  
60 - {  
61 - prop: 'm5',  
62 - label: '5月',  
63 - sortable: true,  
64 - align: 'left',  
65 - render: function (row) {  
66 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
67 - }  
68 - },  
69 - {  
70 - prop: 'm6',  
71 - label: '6月',  
72 - sortable: true,  
73 - align: 'left',  
74 - render: function (row) {  
75 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
76 - }  
77 - },  
78 - {  
79 - prop: 'm7',  
80 - label: '7月',  
81 - sortable: true,  
82 - align: 'left',  
83 - render: function (row) {  
84 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
85 - }  
86 - },  
87 - {  
88 - prop: 'm8',  
89 - label: '8月',  
90 - sortable: true,  
91 - align: 'left',  
92 - render: function (row) {  
93 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
94 - }  
95 - },  
96 - {  
97 - prop: 'm9',  
98 - label: '9月',  
99 - sortable: true,  
100 - align: 'left',  
101 - render: function (row) {  
102 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
103 - }  
104 - },  
105 - {  
106 - prop: 'm110',  
107 - label: '10月',  
108 - sortable: true,  
109 - align: 'left',  
110 - render: function (row) {  
111 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
112 - }  
113 - },  
114 - {  
115 - prop: 'm11',  
116 - label: '11月',  
117 - sortable: true,  
118 - align: 'left',  
119 - render: function (row) {  
120 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
121 - }  
122 - },  
123 - {  
124 - prop: 'm12',  
125 - label: '12月',  
126 - sortable: true,  
127 - align: 'left',  
128 - render: function (row) {  
129 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
130 - } 36 + let init = () => {
  37 + // 查询绑定的文件列表
  38 + let params = {
  39 + opsId: props.projectId,
  40 + personId: props.parentNode.id,
  41 + code: props.treeNode.map.nodeType.code
131 } 42 }
132 - ]); 43 + proxy.$http.get('/api-web/bOpsFile/search', params, function (res) {
  44 + if (res && res.code == 0 && res.data) {
133 45
134 - let dataList = Vue.ref([]);  
135 - let currentPage = Vue.ref(1);  
136 - let total = Vue.ref(0);  
137 -  
138 - // 获取表格树  
139 - let getPage = () => { 46 + let ids = res.data.map(function (v) {
  47 + return v.id;
  48 + });
  49 + docIds.value = ids;
  50 + }
  51 + initFlg.value = true;
  52 + })
  53 + }
140 54
  55 + let saveOpsLog = ({document, fileInfo}) => {
  56 + let params = {
  57 + id: document.id,
  58 + personId: props.parentNode.id,
  59 + username: document.createUser,
  60 + opsId: props.projectId,
  61 + name: document.name,
  62 + fileUrl: document.localPath,
  63 + code: props.treeNode.map.nodeType.code
  64 + };
  65 + proxy.$http.post('/api-web/bOpsFile/fileSynchronization', params, function (res) {
  66 + if (res && res.code == 0) {
  67 + // proxy.$global.showMsg("");
  68 + console.log('执行回调成功', res)
  69 + }
  70 + });
141 } 71 }
142 72
  73 + // 监听编辑状态
  74 + Vue.watch(() => props.treeNode, (newValue, oldVlaue) => {
  75 + initFlg.value = false;
  76 + init();
  77 + });
  78 +
  79 + // 挂载完
  80 + Vue.onMounted(() => {
  81 + init();
  82 + })
143 83
144 return { 84 return {
145 - columns,  
146 - height,  
147 - dataList,  
148 - currentPage,  
149 - total,  
150 - getPage 85 + docIds,
  86 + saveOpsLog,
  87 + initFlg
151 } 88 }
152 } 89 }
153 } 90 }
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <!-- 人员信息总汇--> 3 <!-- 人员信息总汇-->
4 <el-divider content-position="left">项目评价汇总</el-divider> 4 <el-divider content-position="left">项目评价汇总</el-divider>
5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true" 5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true"
6 - :showBorder="true" :currentPage="currentPage" :total="total" :loading="true"  
7 - :showPage="true" :height="height - 54"></cm-table-page> 6 + :showBorder="true" :currentPage="currentPage" :total="total" :loading="false"
  7 + :showPage="true" :height="(height - 54)/3"></cm-table-page>
8 </div> 8 </div>
9 </div> 9 </div>
@@ -13,121 +13,82 @@ export default { @@ -13,121 +13,82 @@ export default {
13 13
14 let columns = Vue.ref([ 14 let columns = Vue.ref([
15 { 15 {
16 - prop: 'fileName', 16 + prop: 'opsYear',
17 label: '年度', 17 label: '年度',
18 sortable: true, 18 sortable: true,
19 - align: 'left',  
20 - render: function (row) {  
21 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
22 - } 19 + align: 'center',
23 }, 20 },
24 { 21 {
25 - prop: 'm1', 22 + prop: 'month1',
26 label: '1月', 23 label: '1月',
27 sortable: true, 24 sortable: true,
28 - align: 'left',  
29 - render: function (row) {  
30 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
31 - } 25 + align: 'right',
32 }, 26 },
33 { 27 {
34 - prop: 'm2', 28 + prop: 'month2',
35 label: '2月', 29 label: '2月',
36 sortable: true, 30 sortable: true,
37 - align: 'left',  
38 - render: function (row) {  
39 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
40 - } 31 + align: 'right',
41 }, 32 },
42 { 33 {
43 - prop: 'm3', 34 + prop: 'month3',
44 label: '3月', 35 label: '3月',
45 sortable: true, 36 sortable: true,
46 - align: 'left',  
47 - render: function (row) {  
48 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
49 - } 37 + align: 'right',
50 }, 38 },
51 { 39 {
52 - prop: 'm4', 40 + prop: 'month4',
53 label: '4月', 41 label: '4月',
54 sortable: true, 42 sortable: true,
55 - align: 'left',  
56 - render: function (row) {  
57 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
58 - } 43 + align: 'right',
59 }, 44 },
60 { 45 {
61 - prop: 'm5', 46 + prop: 'month5',
62 label: '5月', 47 label: '5月',
63 sortable: true, 48 sortable: true,
64 - align: 'left',  
65 - render: function (row) {  
66 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
67 - } 49 + align: 'right',
68 }, 50 },
69 { 51 {
70 - prop: 'm6', 52 + prop: 'month6',
71 label: '6月', 53 label: '6月',
72 sortable: true, 54 sortable: true,
73 - align: 'left',  
74 - render: function (row) {  
75 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
76 - } 55 + align: 'right',
77 }, 56 },
78 { 57 {
79 - prop: 'm7', 58 + prop: 'month7',
80 label: '7月', 59 label: '7月',
81 sortable: true, 60 sortable: true,
82 - align: 'left',  
83 - render: function (row) {  
84 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
85 - } 61 + align: 'right',
86 }, 62 },
87 { 63 {
88 - prop: 'm8', 64 + prop: 'month8',
89 label: '8月', 65 label: '8月',
90 sortable: true, 66 sortable: true,
91 - align: 'left',  
92 - render: function (row) {  
93 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
94 - } 67 + align: 'right',
95 }, 68 },
96 { 69 {
97 - prop: 'm9', 70 + prop: 'month9',
98 label: '9月', 71 label: '9月',
99 sortable: true, 72 sortable: true,
100 - align: 'left',  
101 - render: function (row) {  
102 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
103 - } 73 + align: 'right',
104 }, 74 },
105 { 75 {
106 - prop: 'm110', 76 + prop: 'month10',
107 label: '10月', 77 label: '10月',
108 sortable: true, 78 sortable: true,
109 - align: 'left',  
110 - render: function (row) {  
111 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
112 - } 79 + align: 'right',
113 }, 80 },
114 { 81 {
115 - prop: 'm11', 82 + prop: 'month11',
116 label: '11月', 83 label: '11月',
117 sortable: true, 84 sortable: true,
118 - align: 'left',  
119 - render: function (row) {  
120 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
121 - } 85 + align: 'right',
122 }, 86 },
123 { 87 {
124 - prop: 'm12', 88 + prop: 'month12',
125 label: '12月', 89 label: '12月',
126 sortable: true, 90 sortable: true,
127 - align: 'left',  
128 - render: function (row) {  
129 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
130 - } 91 + align: 'right',
131 } 92 }
132 ]); 93 ]);
133 94
@@ -135,11 +96,24 @@ export default { @@ -135,11 +96,24 @@ export default {
135 let currentPage = Vue.ref(1); 96 let currentPage = Vue.ref(1);
136 let total = Vue.ref(0); 97 let total = Vue.ref(0);
137 98
138 - // 获取表格 99 + // 获取表格数据
139 let getPage = () => { 100 let getPage = () => {
140 - 101 + proxy.$http.post("/api-web/bOpsScore/scoreCollect", {
  102 + "page":1,
  103 + "limit":10,
  104 + "projectId":"1"
  105 + }, function (res) {
  106 + if (res && res.data) {
  107 + dataList.value = res.data;
  108 + total.value = res.count;
  109 + }
  110 + });
141 } 111 }
142 112
  113 + // 挂载完
  114 + Vue.onMounted(() => {
  115 + getPage();
  116 + })
143 117
144 return { 118 return {
145 columns, 119 columns,
1 <div> 1 <div>
2 - <el-row>  
3 - <el-col :span="12">  
4 - <div id="main" style="width: 500px;height:600px;"></div> 2 + <el-row :gutter="5">
  3 + <el-col :span="16" >
  4 + <div id="main" :style="{'width':(width/3)*2 + 'px)','height' : height + 'px'}"></div>
5 </el-col> 5 </el-col>
6 - <el-col :span="12">  
7 - <div id="score" style="width: 600px;height:400px;"></div> 6 + <el-col :span="8" >
  7 + <div id="score" :style="{'width':(width/3)+'px','height' : height + 'px'}"></div>
8 </el-col> 8 </el-col>
9 </el-row> 9 </el-row>
10 10
11 - <el-dialog  
12 - v-model="dialogVisible"  
13 - title="3月各项评分"  
14 - width="60%"  
15 - :before-close="handleClose"  
16 - >  
17 - <el-table border :data="tableData" stripe @cell-dblclick='handleCell' header-row-class-name="tbl-header-class" style="width: 100%;margin: 20px 0;">  
18 - <el-table-column prop="date" label="分类" align="center" min-width="100" />  
19 - <el-table-column prop="date" label="项目" align="center" min-width="100" />  
20 - <el-table-column prop="name" label="分值" align="center" min-width="100" />  
21 - <el-table-column prop="name" label="打分人" align="center" min-width="100"/>  
22 - <el-table-column prop="name" label="得分" align="center" min-width="100">  
23 - <template #default="scope">  
24 - <el-input v-model="scope.row.name" style='width: 80px;'></el-input>  
25 - </template>  
26 - </el-table-column>  
27 - <el-table-column prop="name" label="扣分原因" align="center" min-width="100">  
28 - <template #default="scope">  
29 - <el-input v-model="scope.row.name" style='width: 80px;'></el-input>  
30 - </template>  
31 - </el-table-column>  
32 - </el-table>  
33 - <template #footer>  
34 - <span class="dialog-footer">  
35 - <el-button type="primary" size="small" @click="dialogVisible = false">确认</el-button>  
36 - <el-button size="small"@click="dialogVisible = false">关闭</el-button>  
37 - </span> 11 + <cm-dialog :title="title" width="60%" :showDialogVisible="dialogVisible" :showFooter="true" @hidedialog="closeDetail" :showOkBtn="false">
  12 + <template v-slot>
  13 + <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true"
  14 + :showBorder="true"
  15 + :showPage="false" :height="height - 100"></cm-table-page>
38 </template> 16 </template>
39 - </el-dialog> 17 + </cm-dialog>
40 18
41 </div> 19 </div>
@@ -5,59 +5,196 @@ export default { @@ -5,59 +5,196 @@ export default {
5 data() { 5 data() {
6 return {} 6 return {}
7 }, 7 },
8 - setup() { 8 + props: {
  9 + treeNode: {
  10 + type: Object,
  11 + default: {}
  12 + },
  13 + parentNode: {
  14 + type: Object,
  15 + default: {}
  16 + },
  17 + projectId: {
  18 + type: String,
  19 + default: ''
  20 + },
  21 + key: {
  22 + type: String,
  23 + default: ''
  24 + },
  25 + },
  26 + setup(props, {attrs, slots, emit}) {
9 let height = Vue.ref(window.innerHeight - 130); 27 let height = Vue.ref(window.innerHeight - 130);
  28 + let width = Vue.ref(window.innerWidth * 0.6);
  29 + let dialogVisible = Vue.ref(false);
  30 + let title = Vue.ref('');
  31 + let dataList = Vue.ref([]);
  32 +
  33 + let columns = Vue.ref([{
  34 + prop: 'item',
  35 + label: '分类',
  36 + sortable: true,
  37 + },{
  38 + prop: 'standardScore',
  39 + label: '分值',
  40 + sortable: true,
  41 + },{
  42 + prop: 'score',
  43 + label: '得分',
  44 + sortable: true,
  45 + },{
  46 + prop: 'rater',
  47 + label: '打分人',
  48 + sortable: true,
  49 + },{
  50 + prop: 'deduction',
  51 + label: '扣分原因',
  52 + sortable: true,
  53 + },]);
10 54
11 const {proxy} = Vue.getCurrentInstance(); 55 const {proxy} = Vue.getCurrentInstance();
12 56
  57 + // 柱状图
  58 + let main = () => {
13 59
14 - let columns = Vue.ref([  
15 - {  
16 - prop: 'fileName',  
17 - label: '日常资料',  
18 - sortable: true,  
19 - align: 'left',  
20 - render: function (row) {  
21 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
22 - }  
23 - },  
24 - {  
25 - prop: 'm1',  
26 - label: '文档资料',  
27 - sortable: true,  
28 - align: 'left',  
29 - render: function (row) {  
30 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
31 - }  
32 - },  
33 - {  
34 - prop: 'm2',  
35 - label: '项目保密协议',  
36 - sortable: true,  
37 - align: 'left',  
38 - render: function (row) {  
39 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>` 60 + let params = {
  61 + projectId: props.projectId,
  62 + year: props.treeNode.label
  63 + }
  64 + proxy.$http.get("/api-web/bOpsScore/getScoreFindProjectIdYear", params, function (res) {
  65 + if (res && res.map) {
  66 + // 基于准备好的dom,初始化echarts实例
  67 + var myChart = echarts.init(document.getElementById('main'));
  68 +
  69 + // 指定图表的配置项和数据
  70 + var option = {
  71 + xAxis: {
  72 + data: res.map.x
  73 + },
  74 + yAxis: {},
  75 + series: [{
  76 + name: '分值',
  77 + type: 'bar',
  78 + data: res.map.y,
  79 + itemStyle: { //上方显示数值
  80 + normal: {
  81 + label: {
  82 + show: true, //开启显示
  83 + position: 'top', //在上方显示
  84 + textStyle: { //数值样式
  85 + fontSize: 12
  86 + }
  87 + }
  88 + }
  89 + }
  90 + }]
  91 + };
  92 + // 使用刚指定的配置项和数据显示图表。
  93 + myChart.setOption(option);
  94 +
  95 + // 处理点击事件并且弹出数据名称
  96 + myChart.on('click', function (params) {
  97 + console.log(params);
  98 + detail(params);
  99 + });
40 } 100 }
  101 + }, function () {
  102 + proxy.$global.showMsg('没有查询到记录!', 'warning');
  103 + });
  104 + }
  105 +
  106 + let detail = (v) =>{
  107 + let name = v.name;
  108 + let month = parseInt(name)
  109 + title.value = name + "各项评分";
  110 +
  111 +
  112 + let params = {
  113 + projectId: props.projectId,
  114 + opsYear: props.treeNode.label,
  115 + opsMonth:month
41 } 116 }
42 - ]); 117 + proxy.$http.post("/api-web/bOpsScoreDetails/page", params, function (res) {
  118 + if(res && res.code == 0){
  119 + // console.log(res)
  120 + closeDetail(true);
  121 + dataList.value = res.data;
  122 + }
  123 + });
  124 + }
43 125
44 - let dataList = Vue.ref([]);  
45 - let currentPage = Vue.ref(1);  
46 - let total = Vue.ref(0); 126 + let closeDetail = (flg) => {
  127 + dialogVisible.value = flg
  128 + }
47 129
48 - // 获取表格树  
49 - let getPage = () => { 130 + // 柱状图
  131 + let score = () => {
  132 + proxy.$http.post("/api-web/bOpsScore/scoreRatio", {}, function (res) {
  133 + if (res && res.data) {
  134 + let arr = [];
  135 + res.data.forEach(item => {
  136 + arr.push({value: item.ddicDesc, name: item.ddicName})
  137 + })
  138 + // 指定图表的配置项和数据
  139 + var option = {
  140 + title: {
  141 + text: '评分分类值占比'
  142 + },
  143 + tooltip: {
  144 + triggeer: 'item',
  145 + formatter: '{b} : {c} ({d}%)'
  146 + },
  147 + series: [
  148 + {
  149 + name: '评分分类值占比',
  150 + type: 'pie', // 设置图表类型为饼图
  151 + radius: '40%', // 饼图的半径,外半径为可视区尺寸(容器高宽中较小一项)的 55% 长度。
  152 + center: ["45%", "50%"],
  153 + data: arr,
  154 + label: {
  155 + normal: {
  156 + show: true,
  157 + formatter: '{b}:({d}%)'
  158 + },
  159 + labelLine: {show: true}
  160 + }
  161 + }
  162 + ],
  163 + };
  164 +
  165 + var myChart = echarts.init(document.getElementById('score'));
  166 + // 使用刚指定的配置项和数据显示图表。
  167 + myChart.setOption(option);
  168 + } else {
  169 + proxy.$global.showMsg('暂无数据!');
  170 + }
  171 + });
  172 + }
50 173
  174 + let init =() =>{
  175 + main();
  176 + score();
51 } 177 }
52 178
  179 + // 监听编辑状态
  180 + Vue.watch(() => props.treeNode, (newValue, oldVlaue) => {
  181 + init();
  182 + });
  183 +
  184 + // 挂载完
  185 + Vue.onMounted(() => {
  186 + init();
  187 + })
  188 +
53 189
54 return { 190 return {
55 - columns, 191 + width,
56 height, 192 height,
  193 + title,
  194 + dialogVisible,
  195 + columns,
57 dataList, 196 dataList,
58 - currentPage,  
59 - total,  
60 - getPage 197 + closeDetail
61 } 198 }
62 } 199 }
63 } 200 }
1 <div> 1 <div>
2 - <div>  
3 - <!-- 人员信息总汇-->  
4 - <project-ry/>  
5 - </div> 2 + <!-- 人员信息总汇-->
  3 + <project-ry/>
6 </div> 4 </div>
7 <div> 5 <div>
8 <!-- 项目评价总汇--> 6 <!-- 项目评价总汇-->
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <!-- 人员信息总汇--> 3 <!-- 人员信息总汇-->
4 <el-divider content-position="left">人员信息汇总</el-divider> 4 <el-divider content-position="left">人员信息汇总</el-divider>
5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true" 5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true"
6 - :showBorder="true" :currentPage="currentPage" :total="total" :loading="true"  
7 - :showPage="true" :height="height - 54"></cm-table-page> 6 + :showBorder="true" :currentPage="currentPage" :total="total" :loading="false"
  7 + :showPage="true" :height="(height - 54)/3"></cm-table-page>
8 </div> 8 </div>
9 </div> 9 </div>
@@ -9,49 +9,89 @@ export default { @@ -9,49 +9,89 @@ export default {
9 }, 9 },
10 setup() { 10 setup() {
11 let height = Vue.ref(window.innerHeight - 130); 11 let height = Vue.ref(window.innerHeight - 130);
12 -  
13 const {proxy} = Vue.getCurrentInstance(); 12 const {proxy} = Vue.getCurrentInstance();
14 13
15 14
16 let columns = Vue.ref([{ 15 let columns = Vue.ref([{
17 - prop: 'fileName', 16 + prop: 'nickname',
18 label: '运维人员姓名', 17 label: '运维人员姓名',
19 sortable: true, 18 sortable: true,
20 align: 'left', 19 align: 'left',
21 - render: function (row) {  
22 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>`  
23 - }  
24 }, { 20 }, {
25 - prop: 'createUser', 21 + prop: 'state',
26 label: '在职状态', 22 label: '在职状态',
27 sortable: true, 23 sortable: true,
28 - width: '120px' 24 + width: '120px',
  25 + render: function (row) {
  26 + if(row.state==1){
  27 + return "在职";
  28 + }else{
  29 + return "<span style='color: red'>离职</span>";
  30 + }
  31 + }
29 }, { 32 }, {
30 - prop: 'createTime', 33 + prop: 'personalMessage',
31 label: '个人信息', 34 label: '个人信息',
32 sortable: true, 35 sortable: true,
33 - width: '180px' 36 + width: '180px',
  37 + render: function (row) {
  38 + if(row.personalMessage =="YES"){
  39 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  40 + }else{
  41 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  42 + }
  43 + }
  44 +
34 }, { 45 }, {
35 - prop: 'createTime', 46 + prop: 'personalSecrecyBook',
36 label: '个人保密协议书', 47 label: '个人保密协议书',
37 sortable: true, 48 sortable: true,
38 - width: '180px' 49 + width: '180px',
  50 + render: function (row) {
  51 + if(row.personalSecrecyBook =="YES"){
  52 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  53 + }else{
  54 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  55 + }
  56 + }
39 }, { 57 }, {
40 - prop: 'createTime', 58 + prop: 'monthlySummary',
41 label: '月度总结', 59 label: '月度总结',
42 sortable: true, 60 sortable: true,
43 - width: '180px' 61 + width: '180px',
  62 + render: function (row) {
  63 + if(row.monthlySummary =="YES"){
  64 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  65 + }else{
  66 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  67 +
  68 + }
  69 + }
44 }]); 70 }]);
45 71
46 let dataList = Vue.ref([]); 72 let dataList = Vue.ref([]);
47 let currentPage = Vue.ref(1); 73 let currentPage = Vue.ref(1);
48 let total = Vue.ref(0); 74 let total = Vue.ref(0);
49 75
50 - // 获取表格 76 + // 获取表格数据
51 let getPage = () => { 77 let getPage = () => {
52 - 78 + proxy.$http.post("/api-web/bOpsPerson/personCollect", {
  79 + "page":1,
  80 + "limit":10,
  81 + "projectId":"1"
  82 + }, function (res) {
  83 + if (res && res.data) {
  84 + dataList.value = res.data
  85 + total.value = res.count;
  86 + }
  87 + });
53 } 88 }
54 89
  90 + // 挂载完
  91 + Vue.onMounted(() => {
  92 + getPage();
  93 + })
  94 +
55 95
56 return { 96 return {
57 columns, 97 columns,
1 -<div>  
2 - <el-form  
3 - :model="ruleForm"  
4 - label-width="120px"  
5 - size="small"  
6 - > 1 +<div style="padding-top: 20px;">
  2 + <el-form :model="ruleForm" label-width="120px" :size="$global.elementSize">
7 <el-row> 3 <el-row>
8 <el-col :span="8"> 4 <el-col :span="8">
9 <el-form-item label="姓名" prop="nickname" class="form-class"> 5 <el-form-item label="姓名" prop="nickname" class="form-class">
10 - <el-input v-model="ruleForm.nickname" style='width: 190px;'></el-input> 6 + <el-input v-model="ruleForm.nickname" disabled style='width: 190px;'></el-input>
11 </el-form-item> 7 </el-form-item>
12 <el-form-item label="性别" prop="sex" class="form-class"> 8 <el-form-item label="性别" prop="sex" class="form-class">
13 <el-radio-group v-model="ruleForm.sex"> 9 <el-radio-group v-model="ruleForm.sex">
14 - <el-radio label="1"></el-radio>  
15 - <el-radio label="0"></el-radio> 10 + <el-radio :label="1"></el-radio>
  11 + <el-radio :label="0"></el-radio>
16 </el-radio-group> 12 </el-radio-group>
17 </el-form-item> 13 </el-form-item>
18 <el-form-item label="学历" prop="education" class="form-class"> 14 <el-form-item label="学历" prop="education" class="form-class">
19 <el-input v-model="ruleForm.education" style='width: 190px;'></el-input> 15 <el-input v-model="ruleForm.education" style='width: 190px;'></el-input>
20 </el-form-item> 16 </el-form-item>
21 - <el-form-item label="手机号" prop="name" class="form-class">  
22 - <el-input v-model="ruleForm.phone" style='width: 190px;'></el-input> 17 + <el-form-item label="手机号" prop="phone" class="form-class">
  18 + <el-input v-model="ruleForm.phone" disabled style='width: 190px;'></el-input>
23 </el-form-item> 19 </el-form-item>
24 - <el-form-item label="电子邮箱" prop="name" class="form-class"> 20 + <el-form-item label="电子邮箱" prop="email" class="form-class">
25 <el-input v-model="ruleForm.email" style='width: 190px;'></el-input> 21 <el-input v-model="ruleForm.email" style='width: 190px;'></el-input>
26 </el-form-item> 22 </el-form-item>
27 23
28 - <el-form-item label="入职时间" prop="name" class="form-class"> 24 + <el-form-item label="入职时间" prop="entryTime" class="form-class">
29 <el-date-picker 25 <el-date-picker
  26 + disabled
30 v-model="ruleForm.entryTime" 27 v-model="ruleForm.entryTime"
31 type="date" 28 type="date"
32 style='width: 190px;' 29 style='width: 190px;'
33 placeholder="选择日期"> 30 placeholder="选择日期">
34 </el-date-picker> 31 </el-date-picker>
35 </el-form-item> 32 </el-form-item>
36 - <el-form-item label="获得证书" prop="name" class="form-class"> 33 + <el-form-item label="获得证书" prop="certificate" disabled class="form-class">
37 <el-input v-model="ruleForm.certificate" style='width: 190px;'></el-input> 34 <el-input v-model="ruleForm.certificate" style='width: 190px;'></el-input>
38 </el-form-item> 35 </el-form-item>
39 </el-col> 36 </el-col>
40 <el-col :span="8"> 37 <el-col :span="8">
41 - <el-form-item label="所在公司" prop="name" class="form-class">  
42 - <el-input v-model="ruleForm.company" style='width: 190px;'></el-input> 38 + <el-form-item label="所在公司" prop="company" class="form-class">
  39 + <el-input v-model="ruleForm.company" disabled style='width: 190px;'></el-input>
43 </el-form-item> 40 </el-form-item>
44 - <el-form-item label="年龄" prop="name" class="form-class"> 41 + <el-form-item label="年龄" prop="age" class="form-class">
45 <el-input v-model="ruleForm.age" style='width: 190px;'></el-input> 42 <el-input v-model="ruleForm.age" style='width: 190px;'></el-input>
46 </el-form-item> 43 </el-form-item>
47 - <el-form-item label="毕业院校" prop="name" class="form-class">  
48 - <el-input v-model="ruleForm.university" style='width: 190px;'></el-input> 44 + <el-form-item label="毕业院校" prop="university" class="form-class">
  45 + <el-input v-model="ruleForm.university" disabled style='width: 190px;'></el-input>
49 </el-form-item> 46 </el-form-item>
50 - <el-form-item label="座机号码" prop="name" class="form-class"> 47 + <el-form-item label="座机号码" prop="tel" class="form-class">
51 <el-input v-model="ruleForm.tel" style='width: 190px;'></el-input> 48 <el-input v-model="ruleForm.tel" style='width: 190px;'></el-input>
52 </el-form-item> 49 </el-form-item>
53 - <el-form-item label="家庭住址" prop="name" class="form-class"> 50 + <el-form-item label="家庭住址" prop="post" class="form-class">
54 <el-input v-model="ruleForm.post" style='width: 190px;'></el-input> 51 <el-input v-model="ruleForm.post" style='width: 190px;'></el-input>
55 </el-form-item> 52 </el-form-item>
56 - <el-form-item label="离职时间" prop="name" class="form-class"> 53 + <el-form-item label="离职时间" prop="quitTime" class="form-class">
57 <el-date-picker 54 <el-date-picker
58 v-model="ruleForm.quitTime" 55 v-model="ruleForm.quitTime"
  56 + disabled
59 type="date" 57 type="date"
60 style='width: 190px;' 58 style='width: 190px;'
61 placeholder="选择日期"> 59 placeholder="选择日期">
@@ -67,21 +65,16 @@ @@ -67,21 +65,16 @@
67 <el-upload 65 <el-upload
68 class="upload-demo" 66 class="upload-demo"
69 :show-file-list="false" 67 :show-file-list="false"
70 - action=""  
71 - :on-preview="handlePreview"  
72 - :on-remove="handleRemove"  
73 - :before-remove="beforeRemove"  
74 - :http-request="uploadFile"  
75 - multiple  
76 - :limit="3"  
77 - :on-exceed="handleExceed"  
78 - > 68 + :before-upload="beforeAvatarUpload"
  69 + :multiple="false"
  70 + :http-request="getFile"
  71 + :auto-upload="true">
79 <el-button size="small" type="primary">上传照片</el-button> 72 <el-button size="small" type="primary">上传照片</el-button>
80 </el-upload> 73 </el-upload>
81 </el-col> 74 </el-col>
82 </el-row> 75 </el-row>
83 <div style="text-align: center;"> 76 <div style="text-align: center;">
84 - <el-button type="primary" size="small" @click="handleSave">保存</el-button> 77 + <el-button type="primary" size="small" @click="saveUser">保存</el-button>
85 </div> 78 </div>
86 <!-- <el-form-item> 79 <!-- <el-form-item>
87 <el-button type="primary" @click="submitForm('ruleForm')" 80 <el-button type="primary" @click="submitForm('ruleForm')"
@@ -2,34 +2,112 @@ export default { @@ -2,34 +2,112 @@ export default {
2 name: 'projectPJIndex', 2 name: 'projectPJIndex',
3 template: '', 3 template: '',
4 components: {}, 4 components: {},
  5 + props: {
  6 + treeNode: {
  7 + type: Object,
  8 + default: {}
  9 + },
  10 + parentNode: {
  11 + type: Object,
  12 + default: {}
  13 + },
  14 + projectId: {
  15 + type: String,
  16 + default: ''
  17 + },
  18 + },
5 data() { 19 data() {
6 return {} 20 return {}
7 }, 21 },
8 - setup() { 22 + setup(props, {attrs, slots, emit}) {
9 let height = Vue.ref(window.innerHeight - 130); 23 let height = Vue.ref(window.innerHeight - 130);
10 24
11 const {proxy} = Vue.getCurrentInstance(); 25 const {proxy} = Vue.getCurrentInstance();
  26 + let imageUrl = Vue.ref('');
12 27
13 - let ruleForm = Vue.reactive({  
14 - nickname:'',  
15 - sex: '', 28 + let ruleForm = Vue.ref({
  29 + nickname: '',
  30 + sex: 0,
  31 + education: '',
16 phone: '', 32 phone: '',
17 - tel: '',  
18 email: '', 33 email: '',
19 - post: '',  
20 - headImgUrl: '',  
21 - age: '', 34 + entryTime: '',
  35 + certificate: '',
22 university: '', 36 university: '',
23 - education: '',  
24 - quitTime: '',  
25 - entryTime:'', 37 + age: '',
26 company: '', 38 company: '',
27 - certificate: '' 39 + headImgUrl: '',
  40 + post: '',
  41 + projectId: null,
  42 + quitTime: '',
  43 + state: '',
  44 + tel: ''
  45 + })
  46 +
  47 + // 获取表格数据
  48 + let getPage = () => {
  49 + proxy.$http.get("/api-web/bOpsPerson/search", {
  50 + "nickname": props.parentNode.label,
  51 + "projectId": props.projectId
  52 + }, function (res) {
  53 + if (res && res.object) {
  54 + ruleForm.value = res.object
  55 + }
  56 + });
  57 + }
  58 +
  59 +
  60 + // 保存用户信息
  61 + let saveUser = () => {
  62 + console.log(ruleForm.value);
  63 + proxy.$http.post("/api-web/bOpsPerson/saveOrUpdate",ruleForm.value , function (res) {
  64 + if (res && res.code == 0) {
  65 + proxy.$global.showMsg('保存成功!');
  66 + }
  67 + });
  68 + }
  69 +
  70 +
  71 + let getFile = (param) =>{
  72 +
  73 + let fileObj = param.file
  74 +
  75 + getBase64(fileObj).then(res => {
  76 + console.log(res)
  77 + });
  78 +
  79 + imageUrl.value = URL.createObjectURL(fileObj)
  80 +
  81 + }
  82 + let beforeAvatarUpload = (file) =>{
  83 + const isJPG = file.type.indexOf('image/') != -1
  84 +
  85 + if (!isJPG) {
  86 + proxy.$global.showMsg('您上传的不是图片文件,请选择图片!','error');
  87 + }
  88 +
  89 + return isJPG
  90 + }
  91 +
  92 +
  93 +
  94 +
  95 + // // 挂载完
  96 + Vue.onMounted(() => {
  97 + getPage();
28 }) 98 })
29 99
  100 + // 监听编辑状态
  101 + Vue.watch(() => props.projectId, (newValue, oldVlaue) => {
  102 + getPage();
  103 + });
30 104
31 return { 105 return {
32 - ruleForm 106 + imageUrl,
  107 + ruleForm,
  108 + saveUser,
  109 + getFile,
  110 + beforeAvatarUpload,
33 } 111 }
34 } 112 }
35 } 113 }
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <!-- 人员信息总汇--> 3 <!-- 人员信息总汇-->
4 <el-divider content-position="left">项目资料汇总</el-divider> 4 <el-divider content-position="left">项目资料汇总</el-divider>
5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true" 5 <cm-table-page :columns="columns" :dataList="dataList" @loaddata="getPage" :showIndex="true"
6 - :showBorder="true" :currentPage="currentPage" :total="total" :loading="true"  
7 - :showPage="true" :height="height - 54"></cm-table-page> 6 + :showBorder="true" :currentPage="currentPage" :total="total" :loading="false"
  7 + :showPage="false" :height="(height - 54)/3"></cm-table-page>
8 </div> 8 </div>
9 </div> 9 </div>
@@ -13,30 +13,37 @@ export default { @@ -13,30 +13,37 @@ export default {
13 13
14 let columns = Vue.ref([ 14 let columns = Vue.ref([
15 { 15 {
16 - prop: 'fileName', 16 + prop: 'dayMaterial',
17 label: '日常资料', 17 label: '日常资料',
18 - sortable: true,  
19 - align: 'left',  
20 render: function (row) { 18 render: function (row) {
21 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>` 19 + if(row.dayMaterial =="YES"){
  20 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  21 + }else{
  22 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  23 + }
22 } 24 }
  25 +
23 }, 26 },
24 { 27 {
25 - prop: 'm1', 28 + prop: 'documentMaterial',
26 label: '文档资料', 29 label: '文档资料',
27 - sortable: true,  
28 - align: 'left',  
29 render: function (row) { 30 render: function (row) {
30 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>` 31 + if(row.documentMaterial =="YES"){
  32 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  33 + }else{
  34 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  35 + }
31 } 36 }
32 }, 37 },
33 { 38 {
34 - prop: 'm2', 39 + prop: 'nda',
35 label: '项目保密协议', 40 label: '项目保密协议',
36 - sortable: true,  
37 - align: 'left',  
38 render: function (row) { 41 render: function (row) {
39 - return `<i class="iconfont 22222" style="font-size: 22px;margin-right: 10px;"></i><span>${row.fileName}</span>` 42 + if(row.nda =="YES"){
  43 + return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
  44 + }else{
  45 + return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
  46 + }
40 } 47 }
41 } 48 }
42 ]); 49 ]);
@@ -45,11 +52,21 @@ export default { @@ -45,11 +52,21 @@ export default {
45 let currentPage = Vue.ref(1); 52 let currentPage = Vue.ref(1);
46 let total = Vue.ref(0); 53 let total = Vue.ref(0);
47 54
48 - // 获取表格 55 + // 获取表格数据
49 let getPage = () => { 56 let getPage = () => {
50 - 57 + proxy.$http.get("/api-web/bOpsFile/fileCollect?projectId=1", {}, function (res) {
  58 + if (res && res.data) {
  59 + dataList.value = res.data
  60 + total.value = res.count;
  61 + }
  62 + });
51 } 63 }
52 64
  65 + // 挂载完
  66 + Vue.onMounted(() => {
  67 + getPage();
  68 + })
  69 +
53 70
54 return { 71 return {
55 columns, 72 columns,
@@ -48,6 +48,10 @@ const routes = [{ @@ -48,6 +48,10 @@ const routes = [{
48 name: 'operationMaintenance', 48 name: 'operationMaintenance',
49 component: () => myImport('views/operationMaintenance/index') 49 component: () => myImport('views/operationMaintenance/index')
50 },{ 50 },{
  51 + path: '/operationMaintenance/config',
  52 + name: 'operationMaintenanceConfig',
  53 + component: () => myImport('views/operationMaintenance/config/index')
  54 + },{
51 path: '/bigscreen', 55 path: '/bigscreen',
52 name: 'zjBigScreen', 56 name: 'zjBigScreen',
53 component: () => myImport('views/dp/index') 57 component: () => myImport('views/dp/index')
  1 +<div class="container tree-config" :style="{'height':height+'px','max-height':height+'px','overflow':'auto'}" style="background-color: white;padding-top: 50px">
  2 +
  3 + <el-form :rules="formRules"
  4 + label-position="right"
  5 + label-width="220px"
  6 + ref="ruleForm"
  7 + :model="form">
  8 +
  9 + <el-form-item label="是否是乙方运维" prop="isOps">
  10 + <el-switch
  11 + v-model="form.isOps"
  12 + active-text="是"
  13 + inactive-text="否"
  14 + ></el-switch>
  15 + </el-form-item>
  16 + <el-form-item label="项目名称" prop="alias">
  17 + <el-input v-model="form.alias" :disabled="form.isOps == 0" clearable></el-input>
  18 + </el-form-item>
  19 + <el-form-item label="项目编号" prop="code" >
  20 + <el-input v-model="form.code" :disabled="form.isOps == 0" clearable></el-input>
  21 + </el-form-item>
  22 + <el-form-item label="项目负责人" prop="principalName">
  23 + <div style="display: flex">
  24 + <el-input v-model="form.principalName" :disabled="form.isOps == 0" clearable></el-input>
  25 + <el-button style="margin-left: 5px" @click="showUserDialog(true)" :disabled="form.isOps == 0" >选择</el-button>
  26 + </div>
  27 + </el-form-item>
  28 + <el-form-item label="排序" prop="sort">
  29 + <el-input type="number" v-model="form.sort" :disabled="form.isOps == 0" clearable></el-input>
  30 + </el-form-item>
  31 +
  32 + <el-form-item label="描述" prop="remark">
  33 + <el-input v-model="form.remark" type="textarea" :disabled="form.isOps == 0" clearable></el-input>
  34 + </el-form-item>
  35 + <el-form-item>
  36 + <el-button type="primary" @click="onSubmit('ruleForm')">保存配置</el-button>
  37 + </el-form-item>
  38 + </el-form>
  39 +
  40 + <cm-userright :showDialogVisible="showUserDialogFlg" :users="users" @callback="selectUser" title="选择用户"
  41 + :titles="['所有用户', '已添加用户']" :buttonTexts="['删除', '添加']" :loadRoleDta="false"
  42 + @hideDialog="showUserDialog"></cm-userright>
  43 +</div>
  1 +export default {
  2 + name: 'operationMaintenanceConfigIndex',
  3 + template: '',
  4 + components: {},
  5 + data() {
  6 + return {
  7 + formRules: {
  8 + alias: [
  9 + {
  10 + required: true,
  11 + message: '请填项目名称!',
  12 + trigger: 'blur',
  13 + }
  14 + ],
  15 + code: [
  16 + {
  17 + required: true,
  18 + message: '请填项目编号!',
  19 + trigger: 'blur',
  20 + }
  21 + ],
  22 + principalName: [
  23 + {
  24 + required: true,
  25 + message: '请填项目负责人!',
  26 + trigger: 'blur',
  27 + }
  28 + ],
  29 + sort: [
  30 + {
  31 + required: true,
  32 + message: '请填项目负责人!',
  33 + trigger: 'blur',
  34 + }
  35 + ]
  36 + }
  37 + }
  38 + },
  39 + setup() {
  40 + const {proxy} = Vue.getCurrentInstance();
  41 + let showUserDialogFlg = Vue.ref(false);
  42 + let users = Vue.ref([]);
  43 + let form = Vue.ref({
  44 + isOps: 0,
  45 + code: '',
  46 + alias: '',
  47 + principal: '',
  48 + principalName: '',
  49 + busId: '',
  50 + sort: 1,
  51 + remark: ''
  52 + });
  53 +
  54 + let onSubmit = (id) => {
  55 +
  56 + proxy.$refs[id].validate((valid) => {
  57 + if (valid) {
  58 + let params = form.value;
  59 + if (params.isOps) {
  60 + params.isOps = 1;
  61 + } else {
  62 + params.isOps = 0;
  63 + }
  64 +
  65 + // 新增
  66 + proxy.$http.post(`/api-web/bOpsProject/saveOrUpdate`, params, function (res) {
  67 + if (res && res.code == 0) {
  68 + proxy.$global.showMsg("配置成功!");
  69 + }
  70 + })
  71 + } else {
  72 + console.log('error submit!!')
  73 + return false
  74 + }
  75 + })
  76 + }
  77 +
  78 + let init = () => {
  79 + let busId = proxy.$global.getQueryVariable("id")
  80 + //let isOps = proxy.$global.getQueryVariable("isOps")
  81 +
  82 + if (!busId) {
  83 + return;
  84 + }
  85 + // 业务id
  86 + form.value.busId = busId;
  87 + // 是否是乙方运维
  88 + //form.value.isOps = isOps;
  89 + proxy.$http.get("/api-web/bOpsProject/search", {busId: busId}, function (res) {
  90 + if (res && res.object) {
  91 + res.object.isOps = true;
  92 + form.value = res.object
  93 +
  94 + let principal = res.object.principal
  95 + if(principal){
  96 + users.value = principal.split(",")
  97 + }
  98 +
  99 + }
  100 + });
  101 + }
  102 +
  103 + /**
  104 + * 获取用户授权
  105 + */
  106 + let showUserDialog = (flg) => {
  107 + showUserDialogFlg.value = flg;
  108 + }
  109 +
  110 + // 获取用户选择的用户
  111 + let selectUser = (userObj) =>{
  112 +
  113 + let userArr = userObj.user;
  114 + let names = [];
  115 + let nickNames = [];
  116 + userArr.map(function (v) {
  117 + names.push(v.username);
  118 + nickNames.push(v.nickname)
  119 + })
  120 +
  121 + form.value.principal = names.join(',');
  122 + form.value.principalName = nickNames.join(',');
  123 + }
  124 +
  125 + // 挂载完
  126 + Vue.onMounted(() => {
  127 + init();
  128 + })
  129 +
  130 +
  131 + return {
  132 + form,
  133 + onSubmit,
  134 + users,
  135 + selectUser,
  136 + showUserDialog,
  137 + showUserDialogFlg
  138 + }
  139 + }
  140 +}
1 -<div class="assets-configmanagers">  
2 -<!-- 乙方运营-->  
3 - <div>  
4 - <!-- 左侧树结构 -->  
5 - <el-row>  
6 - <el-col :span="4" class='col-class'>  
7 - <el-tree :data="dataSource" :default-expanded-keys="[1]" :props="defaultProps" @node-click="handleNodeClick" />  
8 - </el-col>  
9 - <!-- 右侧显示 -->  
10 - <el-col :span="19" class='col-class'>  
11 - <!-- 失活的组件将会被缓存!-->  
12 - <keep-alive>  
13 - <component v-bind:is="componentName"></component>  
14 - </keep-alive>  
15 - </el-col>  
16 - </el-row>  
17 - </div> 1 +<div class="container" :style="{'height':height+'px','max-height':height+'px','overflow':'auto'}">
  2 + <!-- 乙方运营-->
  3 + <el-row :gutter="5">
  4 + <el-col :span="4">
  5 + <div :style="{'min-height':height+'px','height':'100%','overflow':'auto'}" style="background-color: white;border-radius: 3px">
  6 + <el-tree :data="dataSource" :default-expanded-keys="[1]" :props="defaultProps"
  7 + @node-click="handleNodeClick"/>
  8 + </div>
  9 + </el-col>
  10 + <el-col :span="20" >
  11 + <div :style="{'min-height':height+'px','height':'100%','overflow':'auto'}" style="background-color: white;border-radius: 3px">
  12 + <component v-bind:is="componentName"
  13 + :docType="docType"
  14 + :treeNode="treeNode" :parentNode="parentNode" :projectId="projectId"></component>
  15 + </div>
  16 + </el-col>
  17 + </el-row>
18 </div> 18 </div>