Merge branch 'master' of http://hgroup:82/monitor_v3/hg-monitor-web into master-huijiaxu
Conflicts: hg-monitor-web-zj/src/main/resources/application.yml
Showing
38 changed files
with
3892 additions
and
130 deletions
Too many changes to show.
To preserve performance only 38 of 38+ files are displayed.
doc/组件/文档管理.txt
0 → 100644
doc/组件/用户授权.txt
0 → 100644
doc/组件/表格组件.txt
0 → 100644
1 | +表格组件,组件参数: | ||
2 | +// 展示分页 | ||
3 | +showPage: { | ||
4 | + type: Boolean, | ||
5 | + default: true | ||
6 | +}, | ||
7 | +showBorder: { | ||
8 | + type: Boolean, | ||
9 | + default: true | ||
10 | +}, | ||
11 | +// 高度 | ||
12 | +height: { | ||
13 | + type: Number, | ||
14 | + default: window.innerHeight | ||
15 | +}, | ||
16 | +// 展示下标 | ||
17 | +showIndex: { | ||
18 | + type: Boolean, | ||
19 | + default: true | ||
20 | +}, | ||
21 | +indexLabel: { | ||
22 | + type: String, | ||
23 | + default: '序号' | ||
24 | +}, | ||
25 | +currentPage: { | ||
26 | + type: Number, | ||
27 | + default: 1 | ||
28 | +}, | ||
29 | +// 分页页码设置 | ||
30 | +pageSizes: { | ||
31 | + type: Array, | ||
32 | + default: [50,100, 200, 300, 400] | ||
33 | +}, | ||
34 | +// 默认展示 | ||
35 | +pageSize: { | ||
36 | + type: Number, | ||
37 | + default: 100 | ||
38 | +}, | ||
39 | +// 总数 | ||
40 | +total: { | ||
41 | + type: Number, | ||
42 | + default: 0 | ||
43 | +}, | ||
44 | +// 展示组件 | ||
45 | +layout: { | ||
46 | + type: String, | ||
47 | + default: "total, sizes, prev, pager, next, jumper" | ||
48 | +}, | ||
49 | +// 列 | ||
50 | +columns: { | ||
51 | + type: Array, | ||
52 | + default: [] | ||
53 | +}, | ||
54 | +// 数据 | ||
55 | +dataList: { | ||
56 | + type: Array, | ||
57 | + default: [] | ||
58 | +}, | ||
59 | +// 加载 | ||
60 | +loading:{ | ||
61 | + type: Boolean, | ||
62 | + default: false | ||
63 | +}, | ||
64 | +-------------------------------------------------------------------- | ||
65 | +columns参数说明: | ||
66 | +// 单元绑定数据key | ||
67 | +prop: 'fileName', | ||
68 | +// 表头展示名称 | ||
69 | +label: '文档名称', | ||
70 | +sortable:true, | ||
71 | +// 对其方式 left center right | ||
72 | +align:'left', | ||
73 | +click:function (row) { | ||
74 | + // 单元格点击出发的函数 row,当前行的数据 | ||
75 | +}, | ||
76 | +render:function (row){ | ||
77 | + // 表格个性化展示,返回html | ||
78 | + return html; | ||
79 | +} |
@@ -671,7 +671,7 @@ layui.define(['xmSelect', 'md5'], function (exports) { | @@ -671,7 +671,7 @@ layui.define(['xmSelect', 'md5'], function (exports) { | ||
671 | resType = 'X86SERVER_BMC'; | 671 | resType = 'X86SERVER_BMC'; |
672 | } | 672 | } |
673 | //如果是HOST_X86SERVER服务器并且协议为snmp,或共享存储则根据厂商和型号判断类型 | 673 | //如果是HOST_X86SERVER服务器并且协议为snmp,或共享存储则根据厂商和型号判断类型 |
674 | - if (resType.indexOf("HOST_X86SERVER") !== -1 || resType.indexOf("STORAGE_SHARE") != -1) { | 674 | + if ((resType.indexOf("HOST_X86SERVER") !== -1 && protocol =='SNMP') || resType.indexOf("STORAGE_SHARE") != -1) { |
675 | resType = this.detailPathByProviderAndModel(resType,resId); | 675 | resType = this.detailPathByProviderAndModel(resType,resId); |
676 | } | 676 | } |
677 | //如果是虚拟化相关资源类型,则根据采集协议判断去那个页面 | 677 | //如果是虚拟化相关资源类型,则根据采集协议判断去那个页面 |
@@ -2517,6 +2517,58 @@ layui.define(['soulTable', 'commonDetail', 'common', 'laytpl', 'view', 'admin', | @@ -2517,6 +2517,58 @@ layui.define(['soulTable', 'commonDetail', 'common', 'laytpl', 'view', 'admin', | ||
2517 | {field: 'lastColTime', title: '最近采集时间', minWidth: x_170, align: 'center', sort: true}, | 2517 | {field: 'lastColTime', title: '最近采集时间', minWidth: x_170, align: 'center', sort: true}, |
2518 | {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_120, templet: '#linkStateTpl', sort: true} | 2518 | {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_120, templet: '#linkStateTpl', sort: true} |
2519 | ], | 2519 | ], |
2520 | + "HUAWEI_CLOUD_PLAT":[ | ||
2521 | + {field: 'ip', title: 'IP地址', minWidth: x_130, align: 'center', sort: true}, | ||
2522 | + { | ||
2523 | + field: 'resName', title: '资源名称', minWidth: x_300, sort: true, | ||
2524 | + templet: '#resindex_resName' | ||
2525 | + }, | ||
2526 | + {field: 'health', title: '健康状态', minWidth: x_110, align: 'center', sort: true, templet: '#healthTpl'}, | ||
2527 | + // {field: 'diskSize', title: '磁盘总大小', minWidth: 120, align: 'center'}, | ||
2528 | + {field: 'fileSysUseRate', title: '文件系统使用率(最大)', align: 'center', minWidth: x_185, templet: '#fileUseRateTpl', sort: true}, | ||
2529 | + {field: 'diskBusyRate', title: '磁盘繁忙率(最大)', minWidth: x_160, align: 'center', sort: true, templet: '<div>{{d.diskBusyRate}}%</div>'}, | ||
2530 | + {field: 'cpuCores', title: '单个CPU核数', align: 'center', minWidth: x_140, sort: true, templet: '#cpuCoresTpl'}, | ||
2531 | + {field: 'cpuNum', title: '主机CPU总核数', align: 'center', minWidth: x_150, sort: true, templet: '#cpuNumTpl'}, | ||
2532 | + {field: 'cpuRate', title: 'CPU使用率', align: 'center', minWidth: x_120, templet: '#cpuRateTpl', sort: true}, | ||
2533 | + {field: 'memorySize', title: '内存大小', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.memorySize}} GB</div>'}, | ||
2534 | + {field: 'cacheUsed', title: '缓存总大小', align: 'center', minWidth: x_120, sort: true, templet: '<div>{{d.cacheUsed}} GB</div>'}, | ||
2535 | + {field: 'memoryRate', title: '内存使用率', align: 'center', minWidth: x_120, templet: '#memoryRateTpl', sort: true}, | ||
2536 | + {field: 'vmmemoryUseRate', title: '虚拟内存使用率', align: 'center', minWidth: x_165, templet: '#vmmemoryRateTpl', sort: true}, | ||
2537 | + {field: 'maxNetCardUpRate', title: '上行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardUpRate}} kb/s</div>'}, | ||
2538 | + {field: 'maxNetCardDownRate', title: '下行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardDownRate}} kb/s</div>'}, | ||
2539 | + {field: 'lastColTime', title: '最近采集时间', minWidth: x_160, align: 'center', sort: true}, | ||
2540 | + {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_110, templet: '#linkStateTpl', sort: true}, | ||
2541 | + {field: 'adminName', title: '负责人', minWidth: x_120, align: 'center', sort: true}, | ||
2542 | + {field: 'adminPhone', title: '负责人电话', minWidth: x_130, align: 'center', sort: true}, | ||
2543 | + {field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'}, | ||
2544 | + {field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'} | ||
2545 | + ], | ||
2546 | + "ALI_CLOUD_PLAT":[ | ||
2547 | + {field: 'ip', title: 'IP地址', minWidth: x_130, align: 'center', sort: true}, | ||
2548 | + { | ||
2549 | + field: 'resName', title: '资源名称', minWidth: x_300, sort: true, | ||
2550 | + templet: '#resindex_resName' | ||
2551 | + }, | ||
2552 | + {field: 'health', title: '健康状态', minWidth: x_110, align: 'center', sort: true, templet: '#healthTpl'}, | ||
2553 | + // {field: 'diskSize', title: '磁盘总大小', minWidth: 120, align: 'center'}, | ||
2554 | + {field: 'fileSysUseRate', title: '文件系统使用率(最大)', align: 'center', minWidth: x_185, templet: '#fileUseRateTpl', sort: true}, | ||
2555 | + {field: 'diskBusyRate', title: '磁盘繁忙率(最大)', minWidth: x_160, align: 'center', sort: true, templet: '<div>{{d.diskBusyRate}}%</div>'}, | ||
2556 | + {field: 'cpuCores', title: '单个CPU核数', align: 'center', minWidth: x_140, sort: true, templet: '#cpuCoresTpl'}, | ||
2557 | + {field: 'cpuNum', title: '主机CPU总核数', align: 'center', minWidth: x_150, sort: true, templet: '#cpuNumTpl'}, | ||
2558 | + {field: 'cpuRate', title: 'CPU使用率', align: 'center', minWidth: x_120, templet: '#cpuRateTpl', sort: true}, | ||
2559 | + {field: 'memorySize', title: '内存大小', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.memorySize}} GB</div>'}, | ||
2560 | + {field: 'cacheUsed', title: '缓存总大小', align: 'center', minWidth: x_120, sort: true, templet: '<div>{{d.cacheUsed}} GB</div>'}, | ||
2561 | + {field: 'memoryRate', title: '内存使用率', align: 'center', minWidth: x_120, templet: '#memoryRateTpl', sort: true}, | ||
2562 | + {field: 'vmmemoryUseRate', title: '虚拟内存使用率', align: 'center', minWidth: x_165, templet: '#vmmemoryRateTpl', sort: true}, | ||
2563 | + {field: 'maxNetCardUpRate', title: '上行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardUpRate}} kb/s</div>'}, | ||
2564 | + {field: 'maxNetCardDownRate', title: '下行速率', align: 'center', minWidth: x_110, sort: true, templet: '<div>{{d.maxNetCardDownRate}} kb/s</div>'}, | ||
2565 | + {field: 'lastColTime', title: '最近采集时间', minWidth: x_160, align: 'center', sort: true}, | ||
2566 | + {field: 'linkState', title: '连接状态', align: 'center', minWidth: x_110, templet: '#linkStateTpl', sort: true}, | ||
2567 | + {field: 'adminName', title: '负责人', minWidth: x_120, align: 'center', sort: true}, | ||
2568 | + {field: 'adminPhone', title: '负责人电话', minWidth: x_130, align: 'center', sort: true}, | ||
2569 | + {field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'}, | ||
2570 | + {field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'} | ||
2571 | + ], | ||
2520 | }, | 2572 | }, |
2521 | //列点击事件 | 2573 | //列点击事件 |
2522 | colsClickEvent: function (editFlag) { | 2574 | colsClickEvent: function (editFlag) { |
1 | <el-dialog :top="top" :title="title" v-model="show" custom-class="config-dialog" | 1 | <el-dialog :top="top" :title="title" v-model="show" custom-class="config-dialog" |
2 | - :fullscreen="fullscreen" :show-close="showFooter" | 2 | + :fullscreen="fullscreen" :show-close="showFooter" @close="hideElDialog" |
3 | :width="width" destroy-on-close @before-close="hideElDialog" :close-on-click-modal="false" :close-on-press-escape="false"> | 3 | :width="width" destroy-on-close @before-close="hideElDialog" :close-on-click-modal="false" :close-on-press-escape="false"> |
4 | <slot>弹框内容</slot> | 4 | <slot>弹框内容</slot> |
5 | 5 | ||
6 | <template #footer v-if="showFooter"> | 6 | <template #footer v-if="showFooter"> |
7 | <span class="dialog-footer"> | 7 | <span class="dialog-footer"> |
8 | - <el-button @click="hideElDialog">{{cancelText}}</el-button> | ||
9 | - <el-button type="primary" @click="okFunc">{{okText}}</el-button> | 8 | + <el-button @click="hideElDialog" v-if="showCancelBtn">{{cancelText}}</el-button> |
9 | + <el-button type="primary" @click="okFunc" v-if="showOkBtn">{{okText}}</el-button> | ||
10 | </span> | 10 | </span> |
11 | </template> | 11 | </template> |
12 | </el-dialog> | 12 | </el-dialog> |
@@ -15,11 +15,21 @@ export default { | @@ -15,11 +15,21 @@ export default { | ||
15 | type: String, | 15 | type: String, |
16 | default: "新建" | 16 | default: "新建" |
17 | }, | 17 | }, |
18 | + // 展示取消按钮 | ||
19 | + showCancelBtn: { | ||
20 | + type: Boolean, | ||
21 | + default: true | ||
22 | + }, | ||
18 | // 取消文本 | 23 | // 取消文本 |
19 | cancelText: { | 24 | cancelText: { |
20 | type: String, | 25 | type: String, |
21 | default: "取消" | 26 | default: "取消" |
22 | }, | 27 | }, |
28 | + // 展示确定按钮 | ||
29 | + showOkBtn: { | ||
30 | + type: Boolean, | ||
31 | + default: true | ||
32 | + }, | ||
23 | // 确定文本 | 33 | // 确定文本 |
24 | okText: { | 34 | okText: { |
25 | type: String, | 35 | type: String, |
@@ -6,9 +6,9 @@ | @@ -6,9 +6,9 @@ | ||
6 | <div style="text-align: left;padding-left: 10px;padding-top: 3px;font-weight: bold"> | 6 | <div style="text-align: left;padding-left: 10px;padding-top: 3px;font-weight: bold"> |
7 | <el-link type="info" :underline="false"><i class="iconfont icon-ziliaoku"></i> 文档管理</el-link> | 7 | <el-link type="info" :underline="false"><i class="iconfont icon-ziliaoku"></i> 文档管理</el-link> |
8 | </div> | 8 | </div> |
9 | + <!----> | ||
9 | <el-tree ref="tree" style="padding:6px;" :props="props" :data="treeData" node-key="id" | 10 | <el-tree ref="tree" style="padding:6px;" :props="props" :data="treeData" node-key="id" |
10 | - :expand-on-click-node="false" :expand-on-click-node="true" | ||
11 | - :default-expanded-keys="[defaultKeys]" > | 11 | + :expand-on-click-node="false" :expand-on-click-node="true" :default-expanded-keys="defaultExpandedKeys"> |
12 | <template #default="{ node, data }"> | 12 | <template #default="{ node, data }"> |
13 | <div style="display: flex;flex-direction: row;width: 100%;"> | 13 | <div style="display: flex;flex-direction: row;width: 100%;"> |
14 | <div style="width: calc(100% - 85px);max-width: calc(100% - 85px);overflow: hidden;text-overflow: ellipsis;text-align: left;" @click="nodeClick(node, data)" :title="node.label"> | 14 | <div style="width: calc(100% - 85px);max-width: calc(100% - 85px);overflow: hidden;text-overflow: ellipsis;text-align: left;" @click="nodeClick(node, data)" :title="node.label"> |
@@ -35,11 +35,11 @@ | @@ -35,11 +35,11 @@ | ||
35 | <el-input v-model="keyWord" placeholder="请输入关键字" :size="$global.elementSize" | 35 | <el-input v-model="keyWord" placeholder="请输入关键字" :size="$global.elementSize" |
36 | style="width: 220px;margin-right:10px" clearable/> | 36 | style="width: 220px;margin-right:10px" clearable/> |
37 | <el-button icon="el-icon-search" :size="$global.elementSize" @click="searchFile">搜索</el-button> | 37 | <el-button icon="el-icon-search" :size="$global.elementSize" @click="searchFile">搜索</el-button> |
38 | - <el-button :size="$global.elementSize" @click="showUserDialog(true)"> | 38 | + <el-button :size="$global.elementSize" @click="showUserDialog(true)" v-if="!isView"> |
39 | <i class="iconfont icon-icon--quanxian"></i> | 39 | <i class="iconfont icon-icon--quanxian"></i> |
40 | 授权 | 40 | 授权 |
41 | </el-button> | 41 | </el-button> |
42 | - <el-button :size="$global.elementSize" @click="uploadFile"> | 42 | + <el-button :size="$global.elementSize" @click="downloadFile"> |
43 | <i class="iconfont icon-icon--download"></i> | 43 | <i class="iconfont icon-icon--download"></i> |
44 | 下载 | 44 | 下载 |
45 | </el-button> | 45 | </el-button> |
@@ -47,6 +47,10 @@ | @@ -47,6 +47,10 @@ | ||
47 | <i class="iconfont icon-icon--shangchuan"></i> | 47 | <i class="iconfont icon-icon--shangchuan"></i> |
48 | 上传 | 48 | 上传 |
49 | </el-button> | 49 | </el-button> |
50 | + <el-button type="danger" :size="$global.elementSize" @click="deleteDocument('','file')"> | ||
51 | + <i class="iconfont icon-shanchuwenjianjia"></i> | ||
52 | + 删除 | ||
53 | + </el-button> | ||
50 | </div> | 54 | </div> |
51 | <div style="text-align: right;width: 150px"> | 55 | <div style="text-align: right;width: 150px"> |
52 | <el-button-group> | 56 | <el-button-group> |
@@ -130,5 +134,7 @@ | @@ -130,5 +134,7 @@ | ||
130 | <cm-userright :showDialogVisible="showUserDialogVisible" :users="userFileRight.usernames" @callback="selectUser" | 134 | <cm-userright :showDialogVisible="showUserDialogVisible" :users="userFileRight.usernames" @callback="selectUser" |
131 | @hideDialog="showUserDialog"></cm-userright> | 135 | @hideDialog="showUserDialog"></cm-userright> |
132 | 136 | ||
133 | - <cm-upload :showDialogVisible="showUploadDialogVisible" @callback="uploadCallBack" @hideDialog="showUploadFile(false)"></cm-upload> | 137 | + <cm-upload :showDialogVisible="showUploadDialogVisible" @callback="uploadCallBack" @hideDialog="showUploadFile" |
138 | + :type="currentNodeData.docType" :docNo="currentNodeData.docNo" | ||
139 | + :category="currentNodeData.id"></cm-upload> | ||
134 | </div> | 140 | </div> |
@@ -5,7 +5,30 @@ export default { | @@ -5,7 +5,30 @@ export default { | ||
5 | name: 'DocumentIndex', | 5 | name: 'DocumentIndex', |
6 | template: '', | 6 | template: '', |
7 | components: {}, | 7 | components: {}, |
8 | - props: {}, | 8 | + props: { |
9 | + // 展示文档类型,默认展示类型 | ||
10 | + types: { | ||
11 | + type: Array, | ||
12 | + default: ['fxbg', 'gf', 'gzgl', 'jkjc', 'lxwh', 'pzgl', 'rcxj'] | ||
13 | + }, | ||
14 | + // 是否是预览模式 | ||
15 | + // 预览模式不展示授权按钮 | ||
16 | + isView: { | ||
17 | + type: Boolean, | ||
18 | + default: false | ||
19 | + }, | ||
20 | + // 文件类型id(展示该类型下的文件信息) | ||
21 | + // 是否是预览模式 == true,viewDocId,必须传入 | ||
22 | + viewTypeId: { | ||
23 | + type: String, | ||
24 | + default: '' | ||
25 | + }, | ||
26 | + fileIds: { | ||
27 | + type: Array, | ||
28 | + default: [] | ||
29 | + } | ||
30 | + | ||
31 | + }, | ||
9 | data() { | 32 | data() { |
10 | return { | 33 | return { |
11 | props: { | 34 | props: { |
@@ -23,10 +46,9 @@ export default { | @@ -23,10 +46,9 @@ export default { | ||
23 | } | 46 | } |
24 | } | 47 | } |
25 | }, | 48 | }, |
26 | - setup() { | 49 | + setup(props, {attrs, slots, emit}) { |
27 | const {proxy} = Vue.getCurrentInstance(); | 50 | const {proxy} = Vue.getCurrentInstance(); |
28 | let height = Vue.ref(window.innerHeight - 20); | 51 | let height = Vue.ref(window.innerHeight - 20); |
29 | - let defaultKeys = Vue.ref(''); | ||
30 | let iconclass = { | 52 | let iconclass = { |
31 | 'folder': 'icon-wenjianjia', | 53 | 'folder': 'icon-wenjianjia', |
32 | 'docx': 'icon-word-full', | 54 | 'docx': 'icon-word-full', |
@@ -73,8 +95,12 @@ export default { | @@ -73,8 +95,12 @@ export default { | ||
73 | 'vob': 'icon-avi', | 95 | 'vob': 'icon-avi', |
74 | 'zip': 'icon-zip-full', | 96 | 'zip': 'icon-zip-full', |
75 | } | 97 | } |
98 | + // 树数据 | ||
76 | let treeData = Vue.ref([]); | 99 | let treeData = Vue.ref([]); |
100 | + // 当前节点数据 | ||
77 | let currentNodeData = Vue.ref({}); | 101 | let currentNodeData = Vue.ref({}); |
102 | + // 默认打开节点 | ||
103 | + let defaultExpandedKeys = Vue.ref([]); | ||
78 | 104 | ||
79 | // 获取文件列表或者打开文件 | 105 | // 获取文件列表或者打开文件 |
80 | let getFile = (item) => { | 106 | let getFile = (item) => { |
@@ -131,28 +157,33 @@ export default { | @@ -131,28 +157,33 @@ export default { | ||
131 | // 左侧树 | 157 | // 左侧树 |
132 | let getTree = () => { | 158 | let getTree = () => { |
133 | // 加载列表 | 159 | // 加载列表 |
134 | - proxy.$http.get("/inspection-report/doc/type/tree", {}, function (res) { | 160 | + proxy.$http.get("/inspection-report/doc/type/tree", {types: props.types.join(',')}, function (res) { |
135 | if (res && res.data) { | 161 | if (res && res.data) { |
136 | treeData.value = res.data; | 162 | treeData.value = res.data; |
137 | - currentNodeData.value = res.data[0]; | ||
138 | - let firstId = res.data[0].id; | ||
139 | - defaultKeys.value = firstId; | 163 | + let first = res.data[0]; |
164 | + currentNodeData.value = first; | ||
140 | 165 | ||
141 | - // 加载所有 | ||
142 | - getPage(''); | 166 | + let arr = []; |
167 | + arr.push(first.id); | ||
168 | + defaultExpandedKeys.value = arr; | ||
169 | + | ||
170 | + // 加载第一个节点数据 | ||
171 | + getPage(first.id); | ||
143 | } | 172 | } |
144 | }) | 173 | }) |
145 | } | 174 | } |
146 | 175 | ||
147 | // 获取表格树 | 176 | // 获取表格树 |
148 | let getPage = (id) => { | 177 | let getPage = (id) => { |
178 | + let docIds = props.fileIds.length == 0 ? '' : props.fileIds.join(',') | ||
149 | let params = { | 179 | let params = { |
150 | id: id, | 180 | id: id, |
151 | name: keyWord.value, | 181 | name: keyWord.value, |
152 | - types:null | 182 | + types: props.types.join(','), |
183 | + docIds:docIds | ||
153 | } | 184 | } |
154 | // 加载列表 | 185 | // 加载列表 |
155 | - proxy.$http.get(`/inspection-report/file/file/documentPage`, params, function (res) { | 186 | + proxy.$http.get(`/inspection-report/file/document/list`, params, function (res) { |
156 | if (res && res.data) { | 187 | if (res && res.data) { |
157 | dataList.value = res.data; | 188 | dataList.value = res.data; |
158 | } | 189 | } |
@@ -167,6 +198,10 @@ export default { | @@ -167,6 +198,10 @@ export default { | ||
167 | let nodeClick = (node, data) => { | 198 | let nodeClick = (node, data) => { |
168 | let id = data.id; | 199 | let id = data.id; |
169 | currentNodeData.value = data; | 200 | currentNodeData.value = data; |
201 | + | ||
202 | + let arr = []; | ||
203 | + arr.push(id); | ||
204 | + defaultExpandedKeys.value = arr; | ||
170 | getPage(id); | 205 | getPage(id); |
171 | } | 206 | } |
172 | 207 | ||
@@ -179,34 +214,51 @@ export default { | @@ -179,34 +214,51 @@ export default { | ||
179 | } | 214 | } |
180 | 215 | ||
181 | // 刷新 | 216 | // 刷新 |
182 | - let reload = () => { | 217 | + let reload = (loadTree) => { |
183 | // 属性tree | 218 | // 属性tree |
184 | setTimeout(function () { | 219 | setTimeout(function () { |
185 | let id = currentNodeData.value.id; | 220 | let id = currentNodeData.value.id; |
186 | getPage(id); | 221 | getPage(id); |
187 | 222 | ||
223 | + if(loadTree && loadTree == true){ | ||
188 | getTree(); | 224 | getTree(); |
225 | + } | ||
226 | + | ||
189 | }, 1000) | 227 | }, 1000) |
190 | } | 228 | } |
191 | 229 | ||
192 | 230 | ||
193 | /** | 231 | /** |
194 | - * 删除文档 | 232 | + * 将文档放入回收站 |
195 | * @param id 文档id | 233 | * @param id 文档id |
196 | * @param type 文件夹或者文档 | 234 | * @param type 文件夹或者文档 |
197 | */ | 235 | */ |
198 | let deleteDocument = (id, type) => { | 236 | let deleteDocument = (id, type) => { |
237 | + let params = null; | ||
238 | + | ||
199 | let msg = "您确认删除该文件?"; | 239 | let msg = "您确认删除该文件?"; |
200 | if (type == 'folder') { | 240 | if (type == 'folder') { |
201 | msg = "您确认删除该文件以及文件下的文件?"; | 241 | msg = "您确认删除该文件以及文件下的文件?"; |
242 | + params = {id: id, type: type} | ||
243 | + } else { | ||
244 | + // 删除文件 | ||
245 | + let arr = getCheckedFile(); | ||
246 | + let info = []; | ||
247 | + arr.map(function (v) { | ||
248 | + info.push({ | ||
249 | + id:v.id, | ||
250 | + type:v.type | ||
251 | + }) | ||
252 | + }) | ||
253 | + params = info; | ||
202 | } | 254 | } |
203 | proxy.$global.confirm(msg, function () { | 255 | proxy.$global.confirm(msg, function () { |
204 | // ok | 256 | // ok |
205 | - proxy.$http.get(`/inspection-report/file/file/delete`, {id: id, type: type}, function (res) { | 257 | + proxy.$http.post(`/inspection-report/file/change`,params , function (res) { |
206 | if (res && res.code == 0) { | 258 | if (res && res.code == 0) { |
207 | proxy.$global.showMsg('删除成功!'); | 259 | proxy.$global.showMsg('删除成功!'); |
208 | 260 | ||
209 | - reload(); | 261 | + reload(false); |
210 | } | 262 | } |
211 | }) | 263 | }) |
212 | 264 | ||
@@ -253,7 +305,7 @@ export default { | @@ -253,7 +305,7 @@ export default { | ||
253 | }) | 305 | }) |
254 | 306 | ||
255 | // 属性tree | 307 | // 属性tree |
256 | - reload(); | 308 | + reload(true); |
257 | showFolder(false); | 309 | showFolder(false); |
258 | } else { | 310 | } else { |
259 | console.log('error submit!!') | 311 | console.log('error submit!!') |
@@ -267,44 +319,31 @@ export default { | @@ -267,44 +319,31 @@ export default { | ||
267 | */ | 319 | */ |
268 | let searchFile = () => { | 320 | let searchFile = () => { |
269 | getPage(''); | 321 | getPage(''); |
270 | - // let id = currentNodeData.value.id; | ||
271 | - // if (id) { | ||
272 | - // getPage(id); | ||
273 | - // } else { | ||
274 | - // // 浏览器地址传文档id参数 | ||
275 | - // let docId = proxy.$global.getQueryVariable('docId'); | ||
276 | - // if (docId) { | ||
277 | - // getPage(docId); | ||
278 | - // } else { | ||
279 | - // proxy.$global.showMsg('请选择文档类型!', 'warning'); | ||
280 | - // } | ||
281 | - // } | ||
282 | 322 | ||
283 | } | 323 | } |
284 | 324 | ||
285 | 325 | ||
286 | - | ||
287 | // 用户授权 | 326 | // 用户授权 |
288 | let showUserDialogVisible = Vue.ref(false); | 327 | let showUserDialogVisible = Vue.ref(false); |
289 | let userFileRight = Vue.ref({}); // {roleIds: ["1"], usernames: ["admin"]} | 328 | let userFileRight = Vue.ref({}); // {roleIds: ["1"], usernames: ["admin"]} |
290 | let getCheckedFile = () => { | 329 | let getCheckedFile = () => { |
291 | - let arr = dataList.value.filter(function (v){ | ||
292 | - if(v.checked != undefined && v.checked == true){ | 330 | + let arr = dataList.value.filter(function (v) { |
331 | + if (v.checked != undefined && v.checked == true) { | ||
293 | return v; | 332 | return v; |
294 | } | 333 | } |
295 | }) | 334 | }) |
296 | 335 | ||
297 | - if(arr.length == 0){ | ||
298 | - proxy.$global.showMsg('请选择需要授权的文档!', 'warning'); | 336 | + if (arr.length == 0) { |
337 | + proxy.$global.showMsg('请选择需要操作的文档!', 'warning'); | ||
299 | return; | 338 | return; |
300 | } | 339 | } |
301 | 340 | ||
302 | - if(arr.length == 1){ | 341 | + if (arr.length == 1) { |
303 | // 查询文件的权限 | 342 | // 查询文件的权限 |
304 | - proxy.$http.get(`/inspection-report/doc/doc/auth/getGrant`, {docId:arr[0].id}, function (res) { | 343 | + proxy.$http.get(`/inspection-report/doc/doc/auth/getGrant`, {docId: arr[0].id}, function (res) { |
305 | if (res && res.code == 0) { | 344 | if (res && res.code == 0) { |
306 | let map = res.map; | 345 | let map = res.map; |
307 | - if(map){ | 346 | + if (map) { |
308 | userFileRight.value = res.map; | 347 | userFileRight.value = res.map; |
309 | } | 348 | } |
310 | } | 349 | } |
@@ -317,9 +356,9 @@ export default { | @@ -317,9 +356,9 @@ export default { | ||
317 | } | 356 | } |
318 | // 用户授权弹框 | 357 | // 用户授权弹框 |
319 | let showUserDialog = (flg) => { | 358 | let showUserDialog = (flg) => { |
320 | - if(flg){ | 359 | + if (flg) { |
321 | let arr = getCheckedFile(); | 360 | let arr = getCheckedFile(); |
322 | - if(arr && arr.length > 0){ | 361 | + if (arr && arr.length > 0) { |
323 | showUserDialogVisible.value = flg; | 362 | showUserDialogVisible.value = flg; |
324 | } | 363 | } |
325 | } else { | 364 | } else { |
@@ -338,16 +377,16 @@ export default { | @@ -338,16 +377,16 @@ export default { | ||
338 | return v.code; | 377 | return v.code; |
339 | }); | 378 | }); |
340 | 379 | ||
341 | - let docIds = getCheckedFile().map(function (v){ | 380 | + let docIds = getCheckedFile().map(function (v) { |
342 | return v.id; | 381 | return v.id; |
343 | }); | 382 | }); |
344 | 383 | ||
345 | 384 | ||
346 | // 保存用户权限 | 385 | // 保存用户权限 |
347 | let params = { | 386 | let params = { |
348 | - docIds:docIds.join(','), | ||
349 | - roleIds:roleCodes.join(','), | ||
350 | - usernames:userIds.join(',') | 387 | + docIds: docIds.join(','), |
388 | + roleIds: roleCodes.join(','), | ||
389 | + usernames: userIds.join(',') | ||
351 | } | 390 | } |
352 | proxy.$http.get(`/inspection-report/doc/doc/auth/grant`, params, function (res) { | 391 | proxy.$http.get(`/inspection-report/doc/doc/auth/grant`, params, function (res) { |
353 | if (res && res.code == 0) { | 392 | if (res && res.code == 0) { |
@@ -356,8 +395,6 @@ export default { | @@ -356,8 +395,6 @@ export default { | ||
356 | proxy.$global.showMsg('授权失败!', 'warning'); | 395 | proxy.$global.showMsg('授权失败!', 'warning'); |
357 | } | 396 | } |
358 | }) | 397 | }) |
359 | - // 隐藏授权弹框 | ||
360 | - showUserDialog(false); | ||
361 | } | 398 | } |
362 | 399 | ||
363 | // 上传 | 400 | // 上传 |
@@ -368,7 +405,35 @@ export default { | @@ -368,7 +405,35 @@ export default { | ||
368 | let showUploadFile = (flg) => { | 405 | let showUploadFile = (flg) => { |
369 | showUploadDialogVisible.value = flg; | 406 | showUploadDialogVisible.value = flg; |
370 | } | 407 | } |
371 | - let uploadCallBack = () =>{ | 408 | + let uploadCallBack = ({document,fileInfo}) => { |
409 | + reload(false); | ||
410 | + // 执行回调 | ||
411 | + emit('callback',{document,fileInfo}); | ||
412 | + } | ||
413 | + | ||
414 | + /** | ||
415 | + * 文件下载 | ||
416 | + */ | ||
417 | + let downloadFile = () =>{ | ||
418 | + let arr = getCheckedFile(); | ||
419 | + | ||
420 | + let info = []; | ||
421 | + arr.map(function (v) { | ||
422 | + // info.push({ | ||
423 | + // id:v.id, | ||
424 | + // type:v.type | ||
425 | + // }) | ||
426 | + | ||
427 | + info.push(`${v.id}__${v.type}`); | ||
428 | + }) | ||
429 | + | ||
430 | + let params = { | ||
431 | + info : info.join(","), | ||
432 | + fileName:'' | ||
433 | + } | ||
434 | + | ||
435 | + proxy.$http.downloadFile('/inspection-report/file/download',params); | ||
436 | + | ||
372 | 437 | ||
373 | } | 438 | } |
374 | 439 | ||
@@ -377,16 +442,20 @@ export default { | @@ -377,16 +442,20 @@ export default { | ||
377 | * 挂载完 | 442 | * 挂载完 |
378 | */ | 443 | */ |
379 | Vue.onMounted(() => { | 444 | Vue.onMounted(() => { |
380 | - // 参数是否传文档id | ||
381 | - let docId = proxy.$global.getQueryVariable('docId'); | ||
382 | - if (!docId) { | 445 | + // 预览模式 不展示左侧树 |
446 | + if (!props.isView) { | ||
383 | getTree(); | 447 | getTree(); |
384 | } else { | 448 | } else { |
385 | layout.value = { | 449 | layout.value = { |
386 | left: 0, | 450 | left: 0, |
387 | right: 24 | 451 | right: 24 |
388 | } | 452 | } |
389 | - getPage(docId); | 453 | + currentNodeData.value = { |
454 | + docType: props.viewTypeId, | ||
455 | + docNo: props.viewTypeId, | ||
456 | + id: props.viewTypeId | ||
457 | + } | ||
458 | + getPage(props.viewTypeId); | ||
390 | } | 459 | } |
391 | }) | 460 | }) |
392 | 461 | ||
@@ -400,7 +469,6 @@ export default { | @@ -400,7 +469,6 @@ export default { | ||
400 | columns, | 469 | columns, |
401 | dataList, | 470 | dataList, |
402 | total, | 471 | total, |
403 | - defaultKeys, | ||
404 | nodeClick, | 472 | nodeClick, |
405 | keyWord, | 473 | keyWord, |
406 | searchFile, | 474 | searchFile, |
@@ -408,7 +476,11 @@ export default { | @@ -408,7 +476,11 @@ export default { | ||
408 | activeBtn, | 476 | activeBtn, |
409 | activeModel, | 477 | activeModel, |
410 | deleteDocument, | 478 | deleteDocument, |
479 | + uploadCallBack, | ||
480 | + | ||
481 | + downloadFile, | ||
411 | 482 | ||
483 | + defaultExpandedKeys, | ||
412 | currentNodeData, | 484 | currentNodeData, |
413 | docForm, | 485 | docForm, |
414 | addFolder, | 486 | addFolder, |
@@ -14,10 +14,10 @@ | @@ -14,10 +14,10 @@ | ||
14 | 14 | ||
15 | <div v-if="typeof(item.render) == 'function'" > | 15 | <div v-if="typeof(item.render) == 'function'" > |
16 | <div v-if="typeof(item.click) == 'function'"> | 16 | <div v-if="typeof(item.click) == 'function'"> |
17 | - <el-link type="primary" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link> | 17 | + <el-link :type="linkType" :underline="isLink" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link> |
18 | </div> | 18 | </div> |
19 | <div v-else> | 19 | <div v-else> |
20 | - <el-link type="primary" v-html="item.render(scope.row)"></el-link> | 20 | + <el-link :type="linkType" :underline="isLink" v-html="item.render(scope.row)"></el-link> |
21 | </div> | 21 | </div> |
22 | </div> | 22 | </div> |
23 | <span v-else> | 23 | <span v-else> |
@@ -45,7 +45,7 @@ export default { | @@ -45,7 +45,7 @@ export default { | ||
45 | // 默认展示 | 45 | // 默认展示 |
46 | pageSize: { | 46 | pageSize: { |
47 | type: Number, | 47 | type: Number, |
48 | - default: 100 | 48 | + default: 50 |
49 | }, | 49 | }, |
50 | // 总数 | 50 | // 总数 |
51 | total: { | 51 | total: { |
@@ -67,10 +67,21 @@ export default { | @@ -67,10 +67,21 @@ export default { | ||
67 | type: Array, | 67 | type: Array, |
68 | default: [] | 68 | default: [] |
69 | }, | 69 | }, |
70 | + // 是否展示加载 | ||
70 | loading:{ | 71 | loading:{ |
71 | type: Boolean, | 72 | type: Boolean, |
72 | default: false | 73 | default: false |
73 | }, | 74 | }, |
75 | + // 是否展示链接 | ||
76 | + isLink:{ | ||
77 | + type: Boolean, | ||
78 | + default: false | ||
79 | + }, | ||
80 | + // 是否展示链接 | ||
81 | + linkType:{ | ||
82 | + type: String, | ||
83 | + default: 'primary' | ||
84 | + }, | ||
74 | }, | 85 | }, |
75 | data() { | 86 | data() { |
76 | return {} | 87 | return {} |
1 | -<cm-dialog title="文件上传" width="500px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="uploadFile" okText="上传"> | 1 | +<cm-dialog v-if="!isInset" title="文件上传" width="500px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="uploadFile" okText="上传"> |
2 | <template v-slot> | 2 | <template v-slot> |
3 | 3 | ||
4 | <el-upload | 4 | <el-upload |
@@ -6,9 +6,10 @@ | @@ -6,9 +6,10 @@ | ||
6 | ref="upload" | 6 | ref="upload" |
7 | :http-request="getFile" | 7 | :http-request="getFile" |
8 | :multiple="true" | 8 | :multiple="true" |
9 | + :before-upload="beforeUpload" | ||
9 | :auto-upload="false"> | 10 | :auto-upload="false"> |
10 | <template #trigger> | 11 | <template #trigger> |
11 | - <el-button size="small" type="primary">选择文件</el-button> | 12 | + <el-button size="small" type="primary">{{btnText}}</el-button> |
12 | </template> | 13 | </template> |
13 | 支持格式: | 14 | 支持格式: |
14 | <el-tooltip placement="top" effect="light"> | 15 | <el-tooltip placement="top" effect="light"> |
@@ -18,10 +19,21 @@ | @@ -18,10 +19,21 @@ | ||
18 | <i class="el-icon-chat-round"></i> | 19 | <i class="el-icon-chat-round"></i> |
19 | </el-tooltip> | 20 | </el-tooltip> |
20 | <template #tip> | 21 | <template #tip> |
21 | -<!-- <div class="el-upload__tip">--> | ||
22 | -<!-- 文件命名规范建议:以文档编号+"-" 开头,如:3101-基本信息.xls--> | ||
23 | -<!-- </div>--> | 22 | + <div class="el-upload__tip" v-if="tips != null && tips != ''"> |
23 | + {{tips}} | ||
24 | + </div> | ||
24 | </template> | 25 | </template> |
25 | </el-upload> | 26 | </el-upload> |
26 | </template> | 27 | </template> |
27 | </cm-dialog> | 28 | </cm-dialog> |
29 | + | ||
30 | +<!--页面嵌套方式--> | ||
31 | +<el-upload | ||
32 | + v-if="isInset" | ||
33 | + :show-file-list="false" | ||
34 | + :before-upload="beforeUpload" | ||
35 | + :multiple="false" | ||
36 | + :http-request="getInsetFile" | ||
37 | + :auto-upload="true"> | ||
38 | + <el-button size="small" type="primary">上传照片</el-button> | ||
39 | +</el-upload> |
@@ -6,6 +6,15 @@ export default { | @@ -6,6 +6,15 @@ export default { | ||
6 | template: '', | 6 | template: '', |
7 | components: {}, | 7 | components: {}, |
8 | props: { | 8 | props: { |
9 | + // 嵌套方式 | ||
10 | + isInset: { | ||
11 | + type: Boolean, | ||
12 | + default: false | ||
13 | + }, | ||
14 | + btnText:{ | ||
15 | + type: String, | ||
16 | + default: '选择文件' | ||
17 | + }, | ||
9 | showDialogVisible: { | 18 | showDialogVisible: { |
10 | type: Boolean, | 19 | type: Boolean, |
11 | default: false | 20 | default: false |
@@ -18,6 +27,25 @@ export default { | @@ -18,6 +27,25 @@ export default { | ||
18 | type: String, | 27 | type: String, |
19 | default: '' | 28 | default: '' |
20 | }, | 29 | }, |
30 | + // 文件分类 | ||
31 | + type: { | ||
32 | + type: String, | ||
33 | + default: '' | ||
34 | + }, | ||
35 | + // 父级Id | ||
36 | + category: { | ||
37 | + type: String, | ||
38 | + default: '' | ||
39 | + }, | ||
40 | + // 文档编号 | ||
41 | + docNo: { | ||
42 | + type: String, | ||
43 | + default: '' | ||
44 | + }, | ||
45 | + tips: { | ||
46 | + type: String, | ||
47 | + default: '' | ||
48 | + }, | ||
21 | accept: { | 49 | accept: { |
22 | type: String, | 50 | type: String, |
23 | default: [".3gpp", | 51 | default: [".3gpp", |
@@ -85,14 +113,39 @@ export default { | @@ -85,14 +113,39 @@ export default { | ||
85 | emit('hideDialog', false); | 113 | emit('hideDialog', false); |
86 | } | 114 | } |
87 | let getFile = (param) =>{ | 115 | let getFile = (param) =>{ |
88 | - console.log(param) | ||
89 | let fileObj = param.file | 116 | let fileObj = param.file |
117 | + let params = { | ||
118 | + file:fileObj, | ||
119 | + type:props.type, | ||
120 | + category:props.category, | ||
121 | + docNo:props.docNo | ||
122 | + } | ||
123 | + // 上传文件 | ||
124 | + proxy.$http.uploadFile("/inspection-report/file/upload", params, function (res) { | ||
125 | + if (res && res.code == 0) { | ||
126 | + proxy.$global.showMsg(res.msg); | ||
127 | + // 调用回调 | ||
128 | + emit('callback',res.object) | ||
129 | + hidedialog(); | ||
130 | + } | ||
131 | + }) | ||
90 | } | 132 | } |
91 | 133 | ||
92 | // 上传按钮点击 | 134 | // 上传按钮点击 |
93 | let uploadFile = () => { | 135 | let uploadFile = () => { |
94 | proxy.$refs.upload.submit() | 136 | proxy.$refs.upload.submit() |
95 | } | 137 | } |
138 | + | ||
139 | + // 提交前的验证 | ||
140 | + let beforeUpload = (file) =>{ | ||
141 | + return emit('beforeUpload',file) | ||
142 | + } | ||
143 | + | ||
144 | + let getInsetFile = (param) =>{ | ||
145 | + let fileObj = param.file | ||
146 | + emit('callback',fileObj) | ||
147 | + } | ||
148 | + | ||
96 | // 监听编辑状态 | 149 | // 监听编辑状态 |
97 | Vue.watch( | 150 | Vue.watch( |
98 | () => props.showDialogVisible, (newValue, oldVlaue) => { | 151 | () => props.showDialogVisible, (newValue, oldVlaue) => { |
@@ -109,10 +162,12 @@ export default { | @@ -109,10 +162,12 @@ export default { | ||
109 | 162 | ||
110 | 163 | ||
111 | return { | 164 | return { |
165 | + getInsetFile, | ||
112 | getFile, | 166 | getFile, |
113 | show, | 167 | show, |
114 | uploadFile, | 168 | uploadFile, |
115 | - hidedialog | 169 | + hidedialog, |
170 | + beforeUpload | ||
116 | } | 171 | } |
117 | } | 172 | } |
118 | } | 173 | } |
1 | -<cm-dialog title="用户授权" width="900px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="getUser"> | 1 | +<cm-dialog :title="title" width="900px" :showDialogVisible="show" @hidedialog="hidedialog" @okfunc="getUser"> |
2 | <template v-slot> | 2 | <template v-slot> |
3 | <el-transfer v-model="value" :props="props" filterable | 3 | <el-transfer v-model="value" :props="props" filterable |
4 | :render-content="renderFunc" | 4 | :render-content="renderFunc" |
5 | - :data="userArr" :titles="['所有用户/角色', '已授权用户/角色']" | ||
6 | - :button-texts="['取消', '授权']"> | 5 | + :data="userArr" :titles="titles" |
6 | + :button-texts="buttonTexts"> | ||
7 | <!--<template #left-footer> | 7 | <!--<template #left-footer> |
8 | <el-button class="transfer-footer" size="small">Operation</el-button> | 8 | <el-button class="transfer-footer" size="small">Operation</el-button> |
9 | </template>--> | 9 | </template>--> |
@@ -13,7 +13,29 @@ export default { | @@ -13,7 +13,29 @@ export default { | ||
13 | users: { | 13 | users: { |
14 | type: Array, | 14 | type: Array, |
15 | default: [] | 15 | default: [] |
16 | - } | 16 | + }, |
17 | + // 加载用户数据 | ||
18 | + loadUserDta: { | ||
19 | + type: Boolean, | ||
20 | + default: true | ||
21 | + }, | ||
22 | + title: { | ||
23 | + type: String, | ||
24 | + default: '添加授权' | ||
25 | + }, | ||
26 | + // 加载角色数据 | ||
27 | + loadRoleDta: { | ||
28 | + type: Boolean, | ||
29 | + default: true | ||
30 | + }, | ||
31 | + titles: { | ||
32 | + type: Array, | ||
33 | + default: ['所有用户/角色', '已授权用户/角色'] | ||
34 | + }, | ||
35 | + buttonTexts: { | ||
36 | + type: Array, | ||
37 | + default: ['取消', '授权'] | ||
38 | + }, | ||
17 | }, | 39 | }, |
18 | data() { | 40 | data() { |
19 | return { | 41 | return { |
@@ -26,6 +48,7 @@ export default { | @@ -26,6 +48,7 @@ export default { | ||
26 | let v = Vue.ref(props.users); | 48 | let v = Vue.ref(props.users); |
27 | let userArr = Vue.ref([]); | 49 | let userArr = Vue.ref([]); |
28 | const getAllUser = () => { | 50 | const getAllUser = () => { |
51 | + if(props.loadUserDta){ | ||
29 | // 查询全部用户 | 52 | // 查询全部用户 |
30 | proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) { | 53 | proxy.$http.get("/api-user/users?page=1&limit=10000&username=&nickname=&enabled=&orgId=&roles=", {}, function (res) { |
31 | if (res && res.data) { | 54 | if (res && res.data) { |
@@ -48,8 +71,10 @@ export default { | @@ -48,8 +71,10 @@ export default { | ||
48 | }) | 71 | }) |
49 | }); | 72 | }); |
50 | } | 73 | } |
51 | - }) | 74 | + },function (){},false) |
75 | + } | ||
52 | 76 | ||
77 | + if(props.loadRoleDta){ | ||
53 | // 查询全部角色 | 78 | // 查询全部角色 |
54 | proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) { | 79 | proxy.$http.get("/api-user/roles?page=1&limit=10000", {}, function (res) { |
55 | if (res && res.data) { | 80 | if (res && res.data) { |
@@ -72,7 +97,10 @@ export default { | @@ -72,7 +97,10 @@ export default { | ||
72 | }) | 97 | }) |
73 | }); | 98 | }); |
74 | } | 99 | } |
75 | - }) | 100 | + },function (){},false) |
101 | + } | ||
102 | + | ||
103 | + | ||
76 | 104 | ||
77 | } | 105 | } |
78 | 106 | ||
@@ -106,6 +134,8 @@ export default { | @@ -106,6 +134,8 @@ export default { | ||
106 | } | 134 | } |
107 | 135 | ||
108 | emit('callback', data); | 136 | emit('callback', data); |
137 | + | ||
138 | + emit('hideDialog', false); | ||
109 | } | 139 | } |
110 | 140 | ||
111 | let renderFunc = (h, option) =>{ | 141 | let renderFunc = (h, option) =>{ |
@@ -165,7 +195,7 @@ export default { | @@ -165,7 +195,7 @@ export default { | ||
165 | userArr, | 195 | userArr, |
166 | value: v, | 196 | value: v, |
167 | getUser, | 197 | getUser, |
168 | - renderFunc | 198 | + renderFunc, |
169 | } | 199 | } |
170 | } | 200 | } |
171 | } | 201 | } |
@@ -94,6 +94,18 @@ global.confirm = (msg,okFunc,cancelFunc) =>{ | @@ -94,6 +94,18 @@ global.confirm = (msg,okFunc,cancelFunc) =>{ | ||
94 | */ | 94 | */ |
95 | global.getQueryVariable = (variable) => { | 95 | global.getQueryVariable = (variable) => { |
96 | var query = window.location.search.substring(1); | 96 | var query = window.location.search.substring(1); |
97 | + | ||
98 | + if(query == ''){ | ||
99 | + query = document.location.href | ||
100 | + let arr = query.split('?'); | ||
101 | + for (var i = 0; i < arr.length; i++) { | ||
102 | + var pair = arr[i].split("="); | ||
103 | + if (pair[0] == variable) { | ||
104 | + return pair[1]; | ||
105 | + } | ||
106 | + } | ||
107 | + return (false); | ||
108 | + } | ||
97 | var vars = query.split("&"); | 109 | var vars = query.split("&"); |
98 | for (var i = 0; i < vars.length; i++) { | 110 | for (var i = 0; i < vars.length; i++) { |
99 | var pair = vars[i].split("="); | 111 | var pair = vars[i].split("="); |
@@ -104,10 +116,38 @@ global.getQueryVariable = (variable) => { | @@ -104,10 +116,38 @@ global.getQueryVariable = (variable) => { | ||
104 | return (false); | 116 | return (false); |
105 | } | 117 | } |
106 | 118 | ||
119 | +/** | ||
120 | + * 文件预览 | ||
121 | + * @param path | ||
122 | + */ | ||
107 | global.viewer = (path) =>{ | 123 | global.viewer = (path) =>{ |
108 | window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(path)); | 124 | window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(path)); |
109 | } | 125 | } |
110 | 126 | ||
127 | +/** | ||
128 | + * 将文件转成base64 | ||
129 | + * @param file | ||
130 | + * @returns {Promise<String>} | ||
131 | + */ | ||
132 | +global.getBase64 = (file) =>{ | ||
133 | + return new Promise(function(resolve, reject) { | ||
134 | + let reader = new FileReader(); | ||
135 | + let imgResult = ""; | ||
136 | + reader.readAsDataURL(file); | ||
137 | + reader.onload = function() { | ||
138 | + imgResult = reader.result; | ||
139 | + }; | ||
140 | + reader.onerror = function(error) { | ||
141 | + reject(error); | ||
142 | + }; | ||
143 | + reader.onloadend = function() { | ||
144 | + resolve(imgResult); | ||
145 | + }; | ||
146 | + }); | ||
147 | +} | ||
148 | + | ||
149 | + | ||
150 | + | ||
111 | // 组件默认大小 | 151 | // 组件默认大小 |
112 | global.elementSize = 'small'; | 152 | global.elementSize = 'small'; |
113 | 153 |
1 | - | ||
2 | let http = { | 1 | let http = { |
3 | proxy: null, | 2 | proxy: null, |
4 | - isJson: function(obj) { | ||
5 | - var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == | 3 | + isJson: function (obj) { |
4 | + var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == | ||
6 | "[object object]" && | 5 | "[object object]" && |
7 | !obj.length; | 6 | !obj.length; |
8 | return isjson; | 7 | return isjson; |
9 | }, | 8 | }, |
10 | - reqErr : function(status){ | ||
11 | - if(status && status == '401'){ | 9 | + reqErr: function (status) { |
10 | + if (status && status == '401') { | ||
12 | // 登录超时,刷新当前页面===>跳转到登录页面 | 11 | // 登录超时,刷新当前页面===>跳转到登录页面 |
13 | window.location.reload(); | 12 | window.location.reload(); |
14 | } | 13 | } |
15 | }, | 14 | }, |
16 | - post: function(requestUrl, data, callback) { | ||
17 | - if(http.proxy == null){ | ||
18 | - const { proxy } = Vue.getCurrentInstance() | 15 | + post: function (requestUrl, data, callback, errFunc,showLoadding) { |
16 | + if (http.proxy == null) { | ||
17 | + const {proxy} = Vue.getCurrentInstance() | ||
19 | http.proxy = proxy; | 18 | http.proxy = proxy; |
20 | } | 19 | } |
21 | - | ||
22 | - const loading = http.proxy.$global.showLoading(); | 20 | + // 默认展示加载狂 |
21 | + if(showLoadding == undefined){ | ||
22 | + showLoadding = true; | ||
23 | + } | ||
24 | + let loading = null; | ||
25 | + if(showLoadding && showLoadding == true){ | ||
26 | + loading = http.proxy.$global.showLoading(); | ||
27 | + } | ||
23 | var access_token = 'access_token=' + http.getToken(); | 28 | var access_token = 'access_token=' + http.getToken(); |
24 | if (requestUrl.indexOf('?') == -1) { | 29 | if (requestUrl.indexOf('?') == -1) { |
25 | requestUrl += '?' + access_token; | 30 | requestUrl += '?' + access_token; |
@@ -34,28 +39,42 @@ let http = { | @@ -34,28 +39,42 @@ let http = { | ||
34 | dataType: "JSON", | 39 | dataType: "JSON", |
35 | async: true, | 40 | async: true, |
36 | data: JSON.stringify(data), | 41 | data: JSON.stringify(data), |
37 | - error: function(xhr, textStatus) { | 42 | + error: function (xhr, textStatus) { |
43 | + if(showLoadding && showLoadding == true){ | ||
38 | loading.close(); | 44 | loading.close(); |
39 | - console.log("==>",requestUrl, xhr, textStatus) | 45 | + } |
46 | + if (errFunc) { | ||
47 | + errFunc(); | ||
48 | + } | ||
49 | + console.log("==>", requestUrl, xhr, textStatus) | ||
40 | http.reqErr(textStatus.status); | 50 | http.reqErr(textStatus.status); |
41 | }, | 51 | }, |
42 | - success: function(data, textStatus, jqXHR) { | 52 | + success: function (data, textStatus, jqXHR) { |
43 | if (callback) { | 53 | if (callback) { |
44 | callback(data); | 54 | callback(data); |
45 | } | 55 | } |
46 | - loading.close() | 56 | + if(showLoadding && showLoadding == true){ |
57 | + loading.close(); | ||
58 | + } | ||
47 | //console.log("==>", requestUrl, jqXHR, textStatus) | 59 | //console.log("==>", requestUrl, jqXHR, textStatus) |
48 | 60 | ||
49 | } | 61 | } |
50 | }); | 62 | }); |
51 | 63 | ||
52 | }, | 64 | }, |
53 | - get: function(requestUrl, data, callback,errFunc) { | ||
54 | - if(http.proxy == null){ | ||
55 | - const { proxy } = Vue.getCurrentInstance() | 65 | + get: function (requestUrl, data, callback, errFunc,showLoadding) { |
66 | + if (http.proxy == null) { | ||
67 | + const {proxy} = Vue.getCurrentInstance() | ||
56 | http.proxy = proxy; | 68 | http.proxy = proxy; |
57 | } | 69 | } |
58 | - const loading = http.proxy.$global.showLoading(); | 70 | + // 默认展示加载狂 |
71 | + if(showLoadding == undefined){ | ||
72 | + showLoadding = true; | ||
73 | + } | ||
74 | + let loading = null; | ||
75 | + if(showLoadding == true){ | ||
76 | + loading = http.proxy.$global.showLoading(); | ||
77 | + } | ||
59 | var access_token = 'access_token=' + http.getToken(); | 78 | var access_token = 'access_token=' + http.getToken(); |
60 | if (requestUrl.indexOf('?') == -1) { | 79 | if (requestUrl.indexOf('?') == -1) { |
61 | requestUrl += '?' + access_token; | 80 | requestUrl += '?' + access_token; |
@@ -69,59 +88,93 @@ let http = { | @@ -69,59 +88,93 @@ let http = { | ||
69 | "Authorization": "Bearer " + http.getToken() + "" | 88 | "Authorization": "Bearer " + http.getToken() + "" |
70 | }, | 89 | }, |
71 | data: data, | 90 | data: data, |
72 | - error: function(xhr, textStatus) { | 91 | + error: function (xhr, textStatus) { |
92 | + if(showLoadding && showLoadding == true){ | ||
73 | loading.close(); | 93 | loading.close(); |
74 | - console.log("==>",requestUrl, xhr, textStatus) | 94 | + } |
95 | + console.log("==>", requestUrl, xhr, textStatus) | ||
75 | http.reqErr(textStatus.status); | 96 | http.reqErr(textStatus.status); |
76 | 97 | ||
77 | - if(errFunc){ | 98 | + if (errFunc) { |
78 | errFunc(); | 99 | errFunc(); |
79 | } | 100 | } |
80 | 101 | ||
81 | }, | 102 | }, |
82 | - success: function(data, textStatus, jqXHR) { | 103 | + success: function (data, textStatus, jqXHR) { |
83 | if (callback) { | 104 | if (callback) { |
84 | callback(data); | 105 | callback(data); |
85 | } | 106 | } |
107 | + if(showLoadding && showLoadding == true){ | ||
86 | loading.close(); | 108 | loading.close(); |
109 | + } | ||
87 | //console.log("==>", requestUrl, jqXHR, textStatus) | 110 | //console.log("==>", requestUrl, jqXHR, textStatus) |
88 | } | 111 | } |
89 | }); | 112 | }); |
90 | }, | 113 | }, |
91 | 114 | ||
92 | - downloadFile(fileName, content) { | ||
93 | - var filename = fileName; | ||
94 | - var a = document.createElement('a') | ||
95 | - var blob = new Blob([content]) | ||
96 | - a.download = filename | ||
97 | - a.href = URL.createObjectURL(blob) | ||
98 | - a.click() | ||
99 | - URL.revokeObjectURL(blob) | 115 | + uploadFile(requestUrl, parmas,callback) { |
116 | + if (http.proxy == null) { | ||
117 | + const {proxy} = Vue.getCurrentInstance() | ||
118 | + http.proxy = proxy; | ||
119 | + } | ||
120 | + const loading = http.proxy.$global.showLoading(); | ||
121 | + var access_token = 'access_token=' + http.getToken(); | ||
122 | + if (requestUrl.indexOf('?') == -1) { | ||
123 | + requestUrl += '?' + access_token; | ||
124 | + } else { | ||
125 | + requestUrl += '&' + access_token; | ||
126 | + } | ||
127 | + | ||
128 | + var formData = new FormData(); | ||
129 | + (function (ps) { | ||
130 | + Object.keys(ps).map(_ => formData.append(_, ps[_]) ); | ||
131 | + })(parmas); | ||
132 | + | ||
133 | + $.ajax({ | ||
134 | + url: sessionStorage.getItem('domainName') + requestUrl, | ||
135 | + type: 'POST', | ||
136 | + processData: false, | ||
137 | + mimeType: "multipart/form-data", | ||
138 | + contentType: false, | ||
139 | + async: false, | ||
140 | + data: formData, | ||
141 | + error: function (xhr, textStatus) { | ||
142 | + loading.close(); | ||
143 | + console.log("==>", requestUrl, xhr, textStatus) | ||
144 | + http.reqErr(textStatus.status); | ||
145 | + }, | ||
146 | + success: function (data, textStatus, jqXHR) { | ||
147 | + if (callback) { | ||
148 | + let d = data; | ||
149 | + try { | ||
150 | + d = JSON.parse(data); | ||
151 | + }catch (e) { | ||
152 | + console.log(e); | ||
153 | + } | ||
154 | + callback(d); | ||
155 | + } | ||
156 | + loading.close() | ||
157 | + } | ||
158 | + }); | ||
159 | + }, | ||
160 | + | ||
161 | + downloadFile(requestUrl, parmas) { | ||
162 | + var access_token = 'access_token=' + http.getToken(); | ||
163 | + if (requestUrl.indexOf('?') == -1) { | ||
164 | + requestUrl += '?' + access_token; | ||
165 | + } else { | ||
166 | + requestUrl += '&' + access_token; | ||
167 | + } | ||
168 | + let formart = function (ps) { | ||
169 | + const keys = Object.keys(ps).map(_ => `${_}=${ps[_]}`).join('&'); | ||
170 | + return `${keys}`; | ||
171 | + } | ||
172 | + let p = formart(parmas); | ||
173 | + window.open(sessionStorage.getItem('domainName') + requestUrl + "&" + p); | ||
100 | }, | 174 | }, |
101 | getToken() { | 175 | getToken() { |
102 | return localStorage.getItem('access_token'); | 176 | return localStorage.getItem('access_token'); |
103 | }, | 177 | }, |
104 | - | ||
105 | - // showMsg(msg, type = 'success') { | ||
106 | - // ElementPlus.ElMessage.success({ | ||
107 | - // message: msg, | ||
108 | - // type: type, | ||
109 | - // }) | ||
110 | - // }, | ||
111 | - | ||
112 | - // showLoading(callback) { | ||
113 | - // const loading = ElementPlus.ElLoading.service({ | ||
114 | - // lock: true, | ||
115 | - // text: '加载中...', | ||
116 | - // spinner: 'el-icon-loading', | ||
117 | - // background: 'rgba(0, 0, 0, 0.7)', | ||
118 | - // }); | ||
119 | - | ||
120 | - // if (callback) { | ||
121 | - // callback(loading); | ||
122 | - // } | ||
123 | - // return loading; | ||
124 | - // } | ||
125 | } | 178 | } |
126 | 179 | ||
127 | export default http | 180 | export default http |
@@ -18,7 +18,8 @@ url: | @@ -18,7 +18,8 @@ url: | ||
18 | mxgraph_editor: http://127.0.0.1:8085 | 18 | mxgraph_editor: http://127.0.0.1:8085 |
19 | tingyun: http://127.0.0.1:8088 | 19 | tingyun: http://127.0.0.1:8088 |
20 | bigScreen: http://127.0.0.1:8081 | 20 | bigScreen: http://127.0.0.1:8081 |
21 | - sxView: http://127.0.0.1:8089 | 21 | + # 一体化视图 |
22 | + ythView: http://192.168.0.69:18089 | ||
22 | #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件 | 23 | #流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件 |
23 | workflow: http://192.168.0.248:8002 | 24 | workflow: http://192.168.0.248:8002 |
24 | # 积木报表工具 | 25 | # 积木报表工具 |
1 | +// 业务类型管理 | ||
2 | +layui.define(['table', 'form', 'admin', 'layer', 'laytpl', 'common', 'view', 'sessions', 'commonDetail', 'treeTable', 'xmSelect', 'userlist', 'reslist'], function (exports) { | ||
3 | + var $ = layui.$; | ||
4 | + var form = layui.form; | ||
5 | + var layer = layui.layer; | ||
6 | + var admin = layui.admin; | ||
7 | + var table = layui.table; | ||
8 | + var treeTable = layui.treeTable; | ||
9 | + var xmSelect = layui.xmSelect; | ||
10 | + var laytpl = layui.laytpl; | ||
11 | + var view = layui.view; | ||
12 | + var common = layui.common; | ||
13 | + var commonDetail = layui.commonDetail; | ||
14 | + var domainName = common.domainName; | ||
15 | + // 业务类型展示表格 | ||
16 | + var busTypeTable; | ||
17 | + // 对外暴露的接口 | ||
18 | + exports('bustype', function (data) { | ||
19 | + var sessions = layui.sessions; | ||
20 | + var accessToken = sessions.getToken()['access_token']; | ||
21 | + | ||
22 | + var cutoverId = '', targetType = ''; | ||
23 | + if (data && data.cutoverId) { | ||
24 | + cutoverId = data.cutoverId; | ||
25 | + targetType = data.targetType; | ||
26 | + } | ||
27 | + var mode = (data && data.mode) ? data.mode : ''; | ||
28 | + var username = (data && data.username) ? data.username : ''; | ||
29 | + //展示类型 | ||
30 | + var showTypeList=[]; | ||
31 | + var dataBusType=[]; | ||
32 | + initShowType(); | ||
33 | + | ||
34 | + // 查询条件 | ||
35 | + var conditions = {busTypeName: ''}; | ||
36 | + // 加载遮罩 | ||
37 | + var loading; | ||
38 | + var checkList = common.checkPermission(accessToken); | ||
39 | + | ||
40 | + loadBusTypeTable(); | ||
41 | + // 查询条件框回车查询事件 | ||
42 | + $('#condition-bustype-name').keydown(function (e) { | ||
43 | + if (e.keyCode === 13) { | ||
44 | + loadBusTypeTable(); | ||
45 | + return false; | ||
46 | + } | ||
47 | + }); | ||
48 | + | ||
49 | + //查询按钮点击事件 joke add 20210428 | ||
50 | + $('#bustypeQueryBtn').on('click',function () { | ||
51 | + loadBusTypeTable(); | ||
52 | + }); | ||
53 | + | ||
54 | + // 删除按钮删除事件 | ||
55 | + $('#btn-bustype-delete').click(function () { | ||
56 | + var checks = busTypeTable.checkStatus(false); | ||
57 | + var busId = $.map(checks, function (item) { | ||
58 | + return item.busId; | ||
59 | + }); | ||
60 | + deleteBusTypeByIds(busId); | ||
61 | + }); | ||
62 | + //授权按钮事件 | ||
63 | + $("#btn-bustype-authorization").click(function () { | ||
64 | + var checks = busTypeTable.checkStatus(false); | ||
65 | + var busId = []; | ||
66 | + var j = 0; | ||
67 | + var number = 0; | ||
68 | + for (var i = 0; i < checks.length; i++) { | ||
69 | + if (checks[i].children != null) { | ||
70 | + j++; | ||
71 | + number = checks[i].children.length; | ||
72 | + } | ||
73 | + } | ||
74 | + if (j = 1 && checks.length - number == 1) { | ||
75 | + busId = checks[0].busId; | ||
76 | + } else { | ||
77 | + busId = $.map(checks, function (item) { | ||
78 | + return item.busId; | ||
79 | + }); | ||
80 | + } | ||
81 | + if (busId.length == 0) { | ||
82 | + layer.msg('请先选择数据', {icon: 0, timeout: 3000}); | ||
83 | + return; | ||
84 | + } else if (busId.length == 1) { | ||
85 | + busId = busId[0]; | ||
86 | + } else { | ||
87 | + busId = busId.toString(); | ||
88 | + } | ||
89 | + authorizationIndex(busId) | ||
90 | + }) | ||
91 | + | ||
92 | + var cols = [] | ||
93 | + if (!mode) { | ||
94 | + cols.push({ | ||
95 | + type: 'checkbox' | ||
96 | + }) | ||
97 | + } | ||
98 | + cols = cols.concat([{ | ||
99 | + type: 'numbers', title: '序号', align: 'center', width: 70 | ||
100 | + }, { | ||
101 | + field: 'busTypeName', title: '名称', align: 'left', | ||
102 | + templet: | ||
103 | + '<div>' + | ||
104 | + ' <span' + | ||
105 | + ' data-code="{{d.busTypeCode}}"' + | ||
106 | + ' class="layui-table-link btn-bustype-edit">{{d.busTypeName}}' + | ||
107 | + ' </span>' + | ||
108 | + '</div>' | ||
109 | + }, { | ||
110 | + field: 'nickname', title: '负责人', align: 'center' | ||
111 | + }, { | ||
112 | + field: 'busTypeDesc', title: '业务类型描述', align: 'left' | ||
113 | + }, { | ||
114 | + field: 'isOps', title: '乙方运维', align: 'center',width: 120, | ||
115 | + templet: function (d) { | ||
116 | + if(d.isOps==0){ | ||
117 | + return '否'; | ||
118 | + }else{ | ||
119 | + return '是'; | ||
120 | + } | ||
121 | + | ||
122 | + } | ||
123 | + }, { | ||
124 | + field: 'isUse', title: '是否使用', align: 'center',width: 120, | ||
125 | + templet: function (d) { | ||
126 | + switch (d.isUse) { | ||
127 | + case 0: | ||
128 | + return '否'; | ||
129 | + case 1: | ||
130 | + return '是'; | ||
131 | + default: | ||
132 | + return ''; | ||
133 | + } | ||
134 | + } | ||
135 | + }, { | ||
136 | + field: 'important', title: '重要程度', align: 'center', width: 120, | ||
137 | + templet: function (d) { | ||
138 | + switch (d.important) { | ||
139 | + case 1: | ||
140 | + return '核心'; | ||
141 | + case 2: | ||
142 | + return '重要'; | ||
143 | + case 3: | ||
144 | + return '一般'; | ||
145 | + case 9: | ||
146 | + return '虚拟业务'; | ||
147 | + default: | ||
148 | + return ''; | ||
149 | + } | ||
150 | + } | ||
151 | + }, { | ||
152 | + field: 'sort', title: '排序', align: 'right', width: 120, | ||
153 | + }]) | ||
154 | + if (!mode) { | ||
155 | + cols.push({ | ||
156 | + title: '操作', align: 'center', fixed: 'right', width: '10%', | ||
157 | + templet: function (d) { | ||
158 | + if (d.isLeaf) { | ||
159 | + return '' + | ||
160 | + '<div>' + | ||
161 | + '<button data-id="' + d.busId + '" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-delete"><i class="layui-icon layui-icon-delete"></i></button>' + | ||
162 | + '<button data-id="' + d.busId + '" lay-tips="资源分配" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-res-config"><i class="layui-icon layui-icon-menu-fill"></i></button>' + | ||
163 | + '<button data-id="' + d.busId + '" lay-tips="授权" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-authorize"><i class="layui-icon layui-icon-auz"></i></button>' + | ||
164 | + '<button data-id="' + d.busId + '" lay-tips="乙方运维配置" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-yf-config"><i class="layui-icon layui-icon-auz"></i></button>' + | ||
165 | + '</div>' | ||
166 | + } else { | ||
167 | + return '' + | ||
168 | + '<div class="layui-row">' + | ||
169 | + '<button data-id="' + d.busId + '" lay-tips="删除" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-delete"><i class="layui-icon layui-icon-delete"></i></button>' + | ||
170 | + '<button data-id="' + d.busId + '" lay-tips="授权" type="button" class="layui-btn layui-btn-xs layui-btn-normal btn-bustype-authorize"><i class="layui-icon layui-icon-auz"></i></button>' + | ||
171 | + '</div>' | ||
172 | + } | ||
173 | + } | ||
174 | + }); | ||
175 | + } else { | ||
176 | + cols.push({field: 'showType', title: '展示类型', align: 'center',sort:true,width:210, | ||
177 | + templet: function (d) { | ||
178 | + if(d.parentId == '0' && dataBusType.indexOf(d.busId)>-1){ | ||
179 | + return ''; | ||
180 | + }else{ | ||
181 | + //初始化select内容 | ||
182 | + var html='<div><select lay-ignore data-index="99" name="showType" class="layui-input resourceType_showType" style="min-width: 150px;display:inline">'; | ||
183 | + $.each(showTypeList,function (i,v) { | ||
184 | + if(d.showType == v.value){ | ||
185 | + html += '<option value="' + v.value + '" selected>' + v.name + '</option> ' | ||
186 | + }else{ | ||
187 | + html += '<option value="' + v.value + '">' + v.name + '</option> ' | ||
188 | + } | ||
189 | + }); | ||
190 | + html+='</select></div>'; | ||
191 | + return html; | ||
192 | + } | ||
193 | + } | ||
194 | + }); | ||
195 | + cols.push({ | ||
196 | + title: '操作', align: 'center', fixed: 'right', width: '10%', | ||
197 | + templet: function (d) { | ||
198 | + if (d.userCount) { | ||
199 | + return '' + | ||
200 | + '<div class="layui-row">' + | ||
201 | + '<button data-id="' + d.busId + '" type="button" class="layui-btn layui-btn-xs btn-bustype-bind hide" lay-tips="未授权,点击授权"><i class="layui-icon layui-icon-link"></i> 添加授权</button>' + | ||
202 | + '<button data-id="' + d.busId + '" type="button" style="margin-left: 0" class="layui-btn layui-btn-xs layui-btn-danger btn-bustype-unbind" lay-tips="已授权,点击解除授权"><i class="layui-icon layui-icon-unlink"></i> 解除授权</button>' + | ||
203 | + '</div>'; | ||
204 | + } else { | ||
205 | + return '' + | ||
206 | + '<div class="layui-row">' + | ||
207 | + '<button data-id="' + d.busId + '" type="button" class="layui-btn layui-btn-xs btn-bustype-bind" lay-tips="未授权,点击授权"><i class="layui-icon layui-icon-link"></i> 添加授权</button>' + | ||
208 | + '<button data-id="' + d.busId + '" type="button" style="margin-left: 0" class="layui-btn layui-btn-xs layui-btn-danger btn-bustype-unbind hide" lay-tips="已授权,点击解除授权"><i class="layui-icon layui-icon-unlink"></i> 解除授权</button>' + | ||
209 | + '</div>'; | ||
210 | + } | ||
211 | + } | ||
212 | + }); | ||
213 | + } | ||
214 | + | ||
215 | + /** | ||
216 | + * 加载业务类型表格 | ||
217 | + */ | ||
218 | + function loadBusTypeTable() { | ||
219 | + conditions = { | ||
220 | + busTypeName: $('#condition-bustype-name').val() ? $('#condition-bustype-name').val().trim() : '', | ||
221 | + access_token: accessToken, | ||
222 | + cutoverId: cutoverId, | ||
223 | + targetType: targetType, | ||
224 | + username: username, | ||
225 | + page: -1, | ||
226 | + limit: -1 | ||
227 | + }; | ||
228 | + conditions.limit = -1; | ||
229 | + admin.req({ | ||
230 | + url: domainName + '/api-web/manage/bustype/page', | ||
231 | + data: conditions | ||
232 | + }).done(function (response) { | ||
233 | + $.each(response.data,function (i,v) { | ||
234 | + dataBusType.push(v.parentId); | ||
235 | + }) | ||
236 | + // 设置总数 | ||
237 | + $('#span-bustype-total').html('共 ' + response.data.length + ' 个业务'); | ||
238 | + // 渲染表格 | ||
239 | + busTypeTable = treeTable.render({ | ||
240 | + elem: '#bustype-table', | ||
241 | + data: response.data, | ||
242 | + page: { | ||
243 | + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'], | ||
244 | + theme: '#1E9FFF' | ||
245 | + }, | ||
246 | + tree: { | ||
247 | + iconIndex: mode ? 1 : 2, // 折叠图标显示在第几列 | ||
248 | + isPidData: true, // 是否是id、pid形式数据 | ||
249 | + idName: 'busId', // id字段名称 | ||
250 | + pidName: 'parentId', // pid字段名称 | ||
251 | + onlyIconControl: true // 仅允许点击图标折叠 | ||
252 | + }, | ||
253 | + cols: cols | ||
254 | + }); | ||
255 | + | ||
256 | + //回填数据 | ||
257 | + if (data && data.username) { | ||
258 | + if (data.username.length == 1) { | ||
259 | + $.ajax({ | ||
260 | + type: "get", | ||
261 | + url: domainName + "/api-web/manage/bustype/getBusTypeByUser?access_token=" + accessToken + "&username=" + data.username[0], | ||
262 | + success: function (res) { | ||
263 | + if (res && res.success) { | ||
264 | + var busTypeData = res.data; | ||
265 | + busTypeTable.setChecked(busTypeData.map(item => item.busId)) | ||
266 | + } | ||
267 | + }, | ||
268 | + }) | ||
269 | + } | ||
270 | + } | ||
271 | + | ||
272 | + // 点击编号编辑事件 | ||
273 | + $('.btn-bustype-edit').click(function () { | ||
274 | + if ($.inArray('back:bustype:update', checkList) == -1) { | ||
275 | + layer.msg('暂无权限!', {icon: 7, time: 3000}); | ||
276 | + return; | ||
277 | + } | ||
278 | + var busTypeCode = $(this).data('code'); | ||
279 | + saveBusType(busTypeCode); | ||
280 | + }); | ||
281 | + // 删除事件 | ||
282 | + $('.btn-bustype-delete').click(function () { | ||
283 | + var busId = $(this).data('id'); | ||
284 | + deleteBusTypeByIds([busId]); | ||
285 | + }); | ||
286 | + // 授权事件 | ||
287 | + $('.btn-bustype-authorize').click(function () { | ||
288 | + loading = layer.load(2); | ||
289 | + var busId = $(this).data('id') | ||
290 | + | ||
291 | + authorizationIndex(busId) | ||
292 | + }); | ||
293 | + // 乙方运维配置 | ||
294 | + $('.btn-bustype-yf-config').click(function () { | ||
295 | + var busId = $(this).data('id'); | ||
296 | + layer.open({ | ||
297 | + type: 2 | ||
298 | + ,title: "乙方运维配置" | ||
299 | + ,closeBtn: true | ||
300 | + ,area: ['50%', '70%'] | ||
301 | + ,shade: 0.8 | ||
302 | + ,id: 'operationMaintenance-config' //设定一个id,防止重复弹出 | ||
303 | + ,content:`/vue3/index.html#/operationMaintenance/config?id=${busId}` | ||
304 | + , success: function (layero, index) { | ||
305 | + } | ||
306 | + ,yes: function(index, layero){ | ||
307 | + layer.closeAll(); | ||
308 | + return false; | ||
309 | + } | ||
310 | + }); | ||
311 | + | ||
312 | + }); | ||
313 | + | ||
314 | + $('.btn-bustype-bind').unbind('click').on('click', function () { | ||
315 | + var $this = $(this); | ||
316 | + var busId = $this.data('id') | ||
317 | + | ||
318 | + layer.load(2); | ||
319 | + admin.req({ | ||
320 | + url: domainName + '/api-web/manage/bustype/bindUser/' + busId, | ||
321 | + data: {username}, | ||
322 | + success(response) { | ||
323 | + layer.closeAll('loading'); | ||
324 | + if (response && response.success) { | ||
325 | + $this.addClass('hide'); | ||
326 | + $this.parent().find('.btn-bustype-unbind').removeClass('hide') | ||
327 | + var $child = $('tr[data-pid="' + busId + '"] .btn-bustype-bind'); | ||
328 | + $child.addClass('hide') | ||
329 | + $child.parent().find('.btn-bustype-unbind').removeClass('hide') | ||
330 | + } else { | ||
331 | + layer.msg('授权失败!', {icon: 2}); | ||
332 | + } | ||
333 | + }, | ||
334 | + error() { | ||
335 | + layer.closeAll('loading'); | ||
336 | + } | ||
337 | + }) | ||
338 | + }); | ||
339 | + $('.btn-bustype-unbind').unbind('click').on('click', function () { | ||
340 | + var $this = $(this); | ||
341 | + var busId = $this.data('id') | ||
342 | + | ||
343 | + layer.load(2); | ||
344 | + admin.req({ | ||
345 | + url: domainName + '/api-web/manage/bustype/unBindUser/' + busId, | ||
346 | + data: {username}, | ||
347 | + success(response) { | ||
348 | + layer.closeAll('loading'); | ||
349 | + if (response && response.success) { | ||
350 | + $this.addClass('hide'); | ||
351 | + $this.parent().find('.btn-bustype-bind').removeClass('hide') | ||
352 | + } else { | ||
353 | + layer.msg('取消授权失败!', {icon: 2}); | ||
354 | + } | ||
355 | + }, | ||
356 | + error() { | ||
357 | + layer.closeAll('loading'); | ||
358 | + } | ||
359 | + }) | ||
360 | + }); | ||
361 | + // 资源分配事件 | ||
362 | + // $('.btn-bustype-res-config').click(function () { | ||
363 | + // var busId = $(this).data('id'); | ||
364 | + // var bustypeReslist = layui.reslist({busId: busId, idSuffix: 1}) | ||
365 | + // // 展示资源页面layerindex | ||
366 | + // var bustypeReslayerIndex; | ||
367 | + // common.openWin("template/res/reslist", "当前绑定的资源", {busId: busId, idSuffix: 1}, ["完成", "取消"], function () { | ||
368 | + // layer.close(bustypeReslayerIndex); | ||
369 | + // }, null, ['80%', '90%'], | ||
370 | + // function (layero, layerIndex) { | ||
371 | + // bustypeReslayerIndex = layerIndex; | ||
372 | + // // 新增按钮 | ||
373 | + // $("#bustype-reslist-add").click(function () { | ||
374 | + // var reslist = layui.reslist(); | ||
375 | + // // 添加绑定页面的layerindex | ||
376 | + // var addResLayerIndex; | ||
377 | + // common.openWin("template/res/reslist", "添加绑定", {}, ["添加", "取消"], function () { | ||
378 | + // loading = layer.load(2); | ||
379 | + // // 当前选中的资源 | ||
380 | + // var checks = reslist.getData(); | ||
381 | + // // 之前已经选择过的资源 | ||
382 | + // var oldResIdList = []; | ||
383 | + // admin.req({ | ||
384 | + // url: domainName + '/api-web/manage/bustype/resourceList/' + busId, | ||
385 | + // async: false, | ||
386 | + // error: function () { | ||
387 | + // layer.close(loading); | ||
388 | + // } | ||
389 | + // }).done(function (response) { | ||
390 | + // $.each(response.data, function (index, value) { | ||
391 | + // oldResIdList.push(value.resId); | ||
392 | + // }); | ||
393 | + // }); | ||
394 | + // // 需要进行插入的资源 | ||
395 | + // var inserts = []; | ||
396 | + // var insertCount = 0; | ||
397 | + // var isExistCount = 0; | ||
398 | + // $.each(checks, function (index, value) { | ||
399 | + // if (oldResIdList.indexOf(value.resId) === -1) { | ||
400 | + // inserts.push(value.resId); | ||
401 | + // insertCount++; | ||
402 | + // } else { | ||
403 | + // isExistCount++; | ||
404 | + // } | ||
405 | + // }); | ||
406 | + // if (inserts.length === 0) { | ||
407 | + // layer.msg('所选的都已存在,无需重复添加!', {icon: 7, time: 5000}); | ||
408 | + // layer.close(loading); | ||
409 | + // return; | ||
410 | + // } | ||
411 | + // // 发送请求添加绑定 | ||
412 | + // admin.req({ | ||
413 | + // url: domainName + '/api-web/manage/bustype/addResource/' + busId + '?access_token=' + accessToken, | ||
414 | + // type: 'POST', | ||
415 | + // contentType: 'application/json', | ||
416 | + // data: JSON.stringify(inserts), | ||
417 | + // error: function () { | ||
418 | + // layer.close(loading); | ||
419 | + // } | ||
420 | + // }).done(function (response) { | ||
421 | + // layer.close(loading); | ||
422 | + // if (response.success) { | ||
423 | + // layer.msg('添加绑定成功!此次添加了' + insertCount + '个新资源' + (isExistCount > 0 ? ',有' + isExistCount + '个已经存在。' : ''), {icon: 1, time: 5000}); | ||
424 | + // layer.close(addResLayerIndex); | ||
425 | + // bustypeReslist.reloadResTable(); | ||
426 | + // } else { | ||
427 | + // layer.msg('添加绑定失败!', {icon: 2, time: 3000}); | ||
428 | + // } | ||
429 | + // }); | ||
430 | + // }, null, ['90%', '80%'], function (layero, layerIndex) { | ||
431 | + // addResLayerIndex = layerIndex | ||
432 | + // }); | ||
433 | + // }); | ||
434 | + // // 取消绑定按钮 | ||
435 | + // $("#bustype-reslist-unbind").click(function () { | ||
436 | + // // 需要取消绑定的资源id集合 | ||
437 | + // var deletes = []; | ||
438 | + // $.each(bustypeReslist.getData(), function (index, value) { | ||
439 | + // deletes.push(value.resId); | ||
440 | + // }); | ||
441 | + // admin.req({ | ||
442 | + // url: domainName + '/api-web/manage/bustype/deleteResource/' + busId + '?access_token=' + accessToken, | ||
443 | + // type: 'POST', | ||
444 | + // contentType: 'application/json', | ||
445 | + // data: JSON.stringify(deletes) | ||
446 | + // }).done(function (response) { | ||
447 | + // if (response.success) { | ||
448 | + // layer.msg('取消绑定成功!', {icon: 1, time: 3000}); | ||
449 | + // bustypeReslist.reloadResTable(); | ||
450 | + // } else { | ||
451 | + // layer.msg('取消绑定失败!', {icon: 2, time: 3000}); | ||
452 | + // } | ||
453 | + // }); | ||
454 | + // }); | ||
455 | + // }); | ||
456 | + // }); | ||
457 | + | ||
458 | + //资源分配 | ||
459 | + $('.btn-bustype-res-config').click(function () { | ||
460 | + if ($.inArray('back:bustype:resource', checkList) == -1) { | ||
461 | + layer.closeAll(); | ||
462 | + layer.msg('暂无权限!', {icon: 7, time: 3000}); | ||
463 | + return; | ||
464 | + } | ||
465 | + var busId = $(this).data('id'); | ||
466 | + layer.open({ | ||
467 | + title: '当前绑定的资源', | ||
468 | + type: 1, | ||
469 | + content: $('#bustype-reslist-table').html(), | ||
470 | + btn: ['完成'], | ||
471 | + area: ['80%', '90%'], | ||
472 | + success: function () { | ||
473 | + // 表格 | ||
474 | + var resType = 'all'; | ||
475 | + $("#bustype_reslist_resListBizTypes").attr("disabled",true); | ||
476 | + form.render(); | ||
477 | + //绑定业务下拉选择数据 | ||
478 | + common.bizTypeSelect("bustype_reslist_resListBizTypes",function () { | ||
479 | + $("#bustype_reslist_resListBizTypes").val(busId); | ||
480 | + form.render("select"); | ||
481 | + }); | ||
482 | + //绑定资源类型下拉选择 | ||
483 | + common.resTypeSelect("bustype_reslist_restype",function () { | ||
484 | + form.render("select"); | ||
485 | + }); | ||
486 | + //回车搜索 | ||
487 | + $('#bustype_reslist_keyword').keydown(function (e) { | ||
488 | + if (e.keyCode === 13) { | ||
489 | + reloadTable(resType); | ||
490 | + } | ||
491 | + }); | ||
492 | + //选择框搜索事件 | ||
493 | + bindSelectEvent(); | ||
494 | + //渲染表格 | ||
495 | + table.render({ | ||
496 | + elem: '#bustype_reslist_resListTable' | ||
497 | + , url: common.domainName + '/api-web/home/res-list/' + resType | ||
498 | + , where: { | ||
499 | + access_token: accessToken, | ||
500 | + resName: $("#bustype_reslist_keyword").val(), | ||
501 | + busId: busId, | ||
502 | + resHealth: $("#bustype_reslist_resStatus").val() | ||
503 | + } | ||
504 | + , height: 'full-300' | ||
505 | + , cellMinWidth: 80 | ||
506 | + , page: { | ||
507 | + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'] | ||
508 | + , theme: '#1E9FFF' | ||
509 | + } | ||
510 | + , limit: common.limit | ||
511 | + , limits: common.limits | ||
512 | + , cols: [[ | ||
513 | + {type: 'checkbox'}, | ||
514 | + {type: 'numbers', title: '序号', align: 'center'} | ||
515 | + , {field: 'resName', title: '资源名称', minWidth: 300, align: 'center'} | ||
516 | + , {field: 'ip', title: 'IP地址', align: 'center'} | ||
517 | + , {field: 'admin', title: '负责人', align: 'center'} | ||
518 | + , {field: 'resTypeName', title: '资源类型', align: 'center'} | ||
519 | + , {field: 'healthDesc', title: '资源状态', align: 'center'} | ||
520 | + ]] | ||
521 | + }); | ||
522 | + //绑定下拉搜索事件 | ||
523 | + function bindSelectEvent() { | ||
524 | + // 资源状态 | ||
525 | + form.on('select(bustype_reslist_resStatus)', function(data){ | ||
526 | + reloadTable(resType); | ||
527 | + }); | ||
528 | + // 资源类型 | ||
529 | + form.on('select(bustype_reslist_restype)', function(data){ | ||
530 | + resType = data.value; | ||
531 | + reloadTable(resType); | ||
532 | + }); | ||
533 | + } | ||
534 | + //刷新表格 | ||
535 | + function reloadTable(resType) { | ||
536 | + table.reload('bustype_reslist_resListTable', { | ||
537 | + url: common.domainName + '/api-web/home/res-list/' + (resType ? resType : 'all'), | ||
538 | + where: { | ||
539 | + access_token: accessToken, | ||
540 | + resName: $("#bustype_reslist_keyword").val(), | ||
541 | + busId: busId, | ||
542 | + resHealth: $("#bustype_reslist_resStatus").val() | ||
543 | + } | ||
544 | + }); | ||
545 | + } | ||
546 | + | ||
547 | + | ||
548 | + // 新增按钮 | ||
549 | + $("#bustype-reslist-add").click(function () { | ||
550 | + var reslist = layui.reslist(); | ||
551 | + // 添加绑定页面的layerindex | ||
552 | + var addResLayerIndex; | ||
553 | + common.openWin("template/res/reslist", "添加绑定", {}, ["添加", "取消"], function () { | ||
554 | + loading = layer.load(2); | ||
555 | + // 当前选中的资源 | ||
556 | + var checks = reslist.getData(); | ||
557 | + if (checks.length ==0) { | ||
558 | + layer.msg('请先选择资源后,再进行添加!', {icon: 7, time: 3000}); | ||
559 | + layer.close(loading); | ||
560 | + return; | ||
561 | + } | ||
562 | + // 之前已经选择过的资源 | ||
563 | + var oldResIdList = []; | ||
564 | + admin.req({ | ||
565 | + url: domainName + '/api-web/manage/bustype/resourceList/' + busId, | ||
566 | + async: false, | ||
567 | + error: function () { | ||
568 | + layer.close(loading); | ||
569 | + } | ||
570 | + }).done(function (response) { | ||
571 | + $.each(response.data, function (index, value) { | ||
572 | + oldResIdList.push(value.resId); | ||
573 | + }); | ||
574 | + }); | ||
575 | + // 需要进行插入的资源 | ||
576 | + var inserts = []; | ||
577 | + var insertCount = 0; | ||
578 | + var isExistCount = 0; | ||
579 | + var resTypes=[]; | ||
580 | + var parentIds=[]; | ||
581 | + $.each(checks, function (index, value) { | ||
582 | + if (oldResIdList.indexOf(value.resId) === -1) { | ||
583 | + resTypes.push(value.resType); | ||
584 | + parentIds.push(value.parentId); | ||
585 | + inserts.push(value.resId); | ||
586 | + insertCount++; | ||
587 | + } else { | ||
588 | + isExistCount++; | ||
589 | + } | ||
590 | + }); | ||
591 | + if (inserts.length === 0) { | ||
592 | + layer.msg('所选的都已存在,无需重复添加!', {icon: 7, time: 5000}); | ||
593 | + layer.close(loading); | ||
594 | + return; | ||
595 | + } | ||
596 | + var ArrIndex=[]; | ||
597 | + if(resTypes.length>0){ | ||
598 | + var identify=0; | ||
599 | + $.each(resTypes,function (i,v) { | ||
600 | + if(v=='MIDDLEWARE_WEBLOGIC' && parentIds[i]==''){ | ||
601 | + identify=1; | ||
602 | + ArrIndex.push(i); | ||
603 | + } | ||
604 | + }); | ||
605 | + if(identify==1){ | ||
606 | + //询问框 | ||
607 | + layer.confirm('选择的资源中包含weblogic控制台,是否将控制台下的服务一起分配到当前业务下?', { | ||
608 | + btn: ['是','否'] //按钮 | ||
609 | + }, function(){//是 | ||
610 | + //获得控制台下所有服务的resID | ||
611 | + //如果选择将控制台下的服务一起分配到当前业务下 | ||
612 | + var arrResIds=[]; | ||
613 | + $.each(ArrIndex,function (i,v) { | ||
614 | + arrResIds.push(inserts[v]); | ||
615 | + }) | ||
616 | + var map={ | ||
617 | + resIds: arrResIds.toString() | ||
618 | + }; | ||
619 | + admin.req({ | ||
620 | + url: common.domainName + '/api-web/bResource/resourceByResId?access_token='+accessToken, | ||
621 | + type:'post', | ||
622 | + data:JSON.stringify(map), | ||
623 | + contentType: "application/json;charset=utf-8", | ||
624 | + async:false, | ||
625 | + error: function () { | ||
626 | + layer.msg('获取控制台下所有服务失败', {icon: 2}); | ||
627 | + layer.close(layer.index); | ||
628 | + } | ||
629 | + }).done(function (response) { | ||
630 | + if(response.success && response.data && response.data.length>0){ | ||
631 | + $.each(response.data,function (i,v) { | ||
632 | + inserts.push(v.resId); | ||
633 | + insertCount++; | ||
634 | + }); | ||
635 | + } | ||
636 | + inserts=Array.from(new Set(inserts)); | ||
637 | + isExistCount = insertCount-inserts; | ||
638 | + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType); | ||
639 | + layer.close(layer.index); | ||
640 | + }) | ||
641 | + }, function(){//否 | ||
642 | + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType); | ||
643 | + layer.close(layer.index); | ||
644 | + }); | ||
645 | + }else{ | ||
646 | + add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType); | ||
647 | + } | ||
648 | + } | ||
649 | + | ||
650 | + }, null, ['90%', '80%'], function (layero, layerIndex) { | ||
651 | + addResLayerIndex = layerIndex | ||
652 | + }); | ||
653 | + }); | ||
654 | + // 取消绑定按钮 | ||
655 | + $("#bustype-reslist-unbind").click(function () { | ||
656 | + // 需要取消绑定的资源id集合 | ||
657 | + var deletes = []; | ||
658 | + var resTypes=[]; | ||
659 | + var parentIds=[]; | ||
660 | + $.each(table.checkStatus('bustype_reslist_resListTable').data, function (index, value) { | ||
661 | + deletes.push(value.resId); | ||
662 | + resTypes.push(value.resType); | ||
663 | + parentIds.push(value.parentId); | ||
664 | + }); | ||
665 | + if(deletes.length<1){ | ||
666 | + layer.msg('请选择要解除绑定的数据!', {icon: 7, time: 3000}); | ||
667 | + layer.close(loading); | ||
668 | + return; | ||
669 | + } | ||
670 | + var ArrIndex=[]; | ||
671 | + if(resTypes.length>0){ | ||
672 | + var identify=0; | ||
673 | + $.each(resTypes,function (i,v) { | ||
674 | + if(v=='MIDDLEWARE_WEBLOGIC' && parentIds[i]==''){ | ||
675 | + identify=1; | ||
676 | + ArrIndex.push(i); | ||
677 | + } | ||
678 | + }); | ||
679 | + if(identify==1){ | ||
680 | + //询问框 | ||
681 | + layer.confirm('选择的资源中包含weblogic控制台,是否将控制台下的服务一起取消?', { | ||
682 | + btn: ['是','否'] //按钮 | ||
683 | + }, function(){//是 | ||
684 | + //获得控制台下所有服务的resID | ||
685 | + //如果选择将控制台下的服务一起取消 | ||
686 | + var arrResIds=[]; | ||
687 | + $.each(ArrIndex,function (i,v) { | ||
688 | + arrResIds.push(deletes[v]); | ||
689 | + }) | ||
690 | + var map={ | ||
691 | + resIds: arrResIds.toString() | ||
692 | + }; | ||
693 | + admin.req({ | ||
694 | + url: common.domainName + '/api-web/bResource/resourceByResId?access_token='+accessToken, | ||
695 | + type:'post', | ||
696 | + data:JSON.stringify(map), | ||
697 | + contentType: "application/json;charset=utf-8", | ||
698 | + async:false, | ||
699 | + error: function () { | ||
700 | + layer.msg('获取控制台下所有服务失败', {icon: 2}); | ||
701 | + layer.close(layer.index); | ||
702 | + } | ||
703 | + }).done(function (response) { | ||
704 | + if(response.success && response.data && response.data.length>0){ | ||
705 | + $.each(response.data,function (i,v) { | ||
706 | + deletes.push(v.resId); | ||
707 | + }); | ||
708 | + } | ||
709 | + deletes=Array.from(new Set(deletes)); | ||
710 | + del(busId,deletes,resType); | ||
711 | + layer.close(layer.index); | ||
712 | + }) | ||
713 | + }, function(){//否 | ||
714 | + del(busId,deletes,resType); | ||
715 | + layer.close(layer.index); | ||
716 | + }); | ||
717 | + }else{ | ||
718 | + del(busId,deletes,resType); | ||
719 | + } | ||
720 | + } | ||
721 | + | ||
722 | + }); | ||
723 | + }, | ||
724 | + yes: function (index) { | ||
725 | + layer.close(index); | ||
726 | + } | ||
727 | + }); | ||
728 | + }); | ||
729 | + }); | ||
730 | + } | ||
731 | + | ||
732 | + //授权页面 | ||
733 | + function authorizationIndex(busId) { | ||
734 | + if ($.inArray('back:bustype:impower', checkList) == -1) { | ||
735 | + layer.closeAll(); | ||
736 | + layer.msg('暂无权限!', {icon: 7, time: 3000}); | ||
737 | + return; | ||
738 | + } | ||
739 | + var params = { | ||
740 | + oldUsers: [], | ||
741 | + bindUrl: '/api-web/manage/bustype/bindUser/' + busId, | ||
742 | + unBindUrl: '/api-web/manage/bustype/unBindUser/' + busId | ||
743 | + }; | ||
744 | + // 获取当前资源类型的权限用于回显 | ||
745 | + admin.req({ | ||
746 | + url: domainName + '/api-web/manage/bustype/getUsersByBusId', | ||
747 | + async: false, | ||
748 | + data: { | ||
749 | + busId: busId | ||
750 | + } | ||
751 | + }).done(function (response) { | ||
752 | + $.each(response.data, function (index, value) { | ||
753 | + params.oldUsers.push(value.userAccount); | ||
754 | + }) | ||
755 | + return false; | ||
756 | + }); | ||
757 | + layer.close(loading); | ||
758 | + var userlist; | ||
759 | + layer.open({ | ||
760 | + title: '授权', | ||
761 | + id: 'busType-role-config-layer', | ||
762 | + type: 1, | ||
763 | + area: ['80%', '90%'], | ||
764 | + btn: ['关闭'], | ||
765 | + scrollbar: false, | ||
766 | + success: function () { | ||
767 | + view(this.id).render('/template/user/userlist').done(function () { | ||
768 | + userlist = layui.userlist(params); | ||
769 | + }); | ||
770 | + }, | ||
771 | + yes: function (index, layero) { | ||
772 | + layer.close(index); | ||
773 | + } | ||
774 | + }); | ||
775 | + } | ||
776 | + | ||
777 | + // 新增按钮 | ||
778 | + $('#bustype-create').click(function () { | ||
779 | + if ($.inArray('back:bustype:save', checkList) == -1) { | ||
780 | + layer.msg('暂无权限!', {icon: 7, time: 3000}); | ||
781 | + return; | ||
782 | + } | ||
783 | + saveBusType(); | ||
784 | + }); | ||
785 | + | ||
786 | + // 刷新表格按钮 | ||
787 | + $('#btn-bustype-reload-table').click(function () { | ||
788 | + loadBusTypeTable(); | ||
789 | + }); | ||
790 | + | ||
791 | + /** | ||
792 | + * 新增或者编辑业务类型 | ||
793 | + * | ||
794 | + * @param busTypeCode 业务类型编号 | ||
795 | + */ | ||
796 | + function saveBusType(busTypeCode) { | ||
797 | + // 打开(新增/编辑)窗口 | ||
798 | + common.openWin('/baseconfig/bustype/add', '<a class="layui-icon layui-icon-edit win_title_icon"></a>' + busTypeCode ? '编辑' : '新增', | ||
799 | + {busTypeCode: busTypeCode}, ['保存', '取消'], function () { | ||
800 | + $('#btn-bustype-submit').click(); | ||
801 | + }, null, ['40%', 'auto']); | ||
802 | + } | ||
803 | + | ||
804 | + function deleteBusTypeByIds(busIds) { | ||
805 | + if ($.inArray('back:bustype:delete', checkList) == -1) { | ||
806 | + layer.msg('暂无权限!', {icon: 7, time: 3000}); | ||
807 | + return; | ||
808 | + } | ||
809 | + if (busIds.length == 0) { | ||
810 | + layer.msg('请先选择数据,再点击删除。', {icon: 0, timeout: 3000}); | ||
811 | + return; | ||
812 | + } | ||
813 | + layer.confirm('确认要删除吗?', {icon: 3, title: '提示'}, function () { | ||
814 | + loading = layer.load(2); | ||
815 | + admin.req({ | ||
816 | + url: domainName + '/api-web/manage/bustype/deleteByIds?access_token=' + accessToken, | ||
817 | + type: 'POST', | ||
818 | + contentType: 'application/json', | ||
819 | + data: JSON.stringify(busIds), | ||
820 | + success: function () { | ||
821 | + layer.close(loading); | ||
822 | + }, | ||
823 | + error: function () { | ||
824 | + layer.close(loading); | ||
825 | + } | ||
826 | + }).done(function (response) { | ||
827 | + if (response.success) { | ||
828 | + layer.msg('删除成功!', {icon: 1, time: 3000}); | ||
829 | + loadBusTypeTable(); | ||
830 | + } else { | ||
831 | + layer.msg('删除失败!', {icon: 2, time: 3000}); | ||
832 | + } | ||
833 | + }); | ||
834 | + }); | ||
835 | + } | ||
836 | + //添加绑定 | ||
837 | + function add(addResLayerIndex,inserts,busId,insertCount,isExistCount,resType) { | ||
838 | + // 发送请求添加绑定 | ||
839 | + admin.req({ | ||
840 | + url: domainName + '/api-web/manage/bustype/addResource/' + busId + '?access_token=' + accessToken, | ||
841 | + type: 'POST', | ||
842 | + async: false, | ||
843 | + contentType: 'application/json', | ||
844 | + data: JSON.stringify(inserts), | ||
845 | + error: function () { | ||
846 | + layer.close(layer.index); | ||
847 | + } | ||
848 | + }).done(function (response) { | ||
849 | + layer.close(loading); | ||
850 | + if (response.success) { | ||
851 | + layer.msg('添加绑定成功!此次添加了' + insertCount + '个新资源' + (isExistCount > 0 ? ',有' + isExistCount + '个已经存在。' : ''), {icon: 1, time: 5000}); | ||
852 | + layer.close(addResLayerIndex); | ||
853 | + reloadTable(resType,busId); | ||
854 | + } else { | ||
855 | + layer.msg('添加绑定失败!', {icon: 2, time: 3000}); | ||
856 | + } | ||
857 | + }); | ||
858 | + } | ||
859 | + | ||
860 | + //取消绑定 | ||
861 | + function del(busId,deletes,resType) { | ||
862 | + admin.req({ | ||
863 | + url: domainName + '/api-web/manage/bustype/deleteResource/' + busId + '?access_token=' + accessToken, | ||
864 | + type: 'POST', | ||
865 | + async: false, | ||
866 | + contentType: 'application/json', | ||
867 | + data: JSON.stringify(deletes) | ||
868 | + }).done(function (response) { | ||
869 | + if (response.success) { | ||
870 | + layer.msg('取消绑定成功!', {icon: 1, time: 3000}); | ||
871 | + | ||
872 | + reloadTable(resType,busId); | ||
873 | + } else { | ||
874 | + layer.msg('取消绑定失败!', {icon: 2, time: 3000}); | ||
875 | + } | ||
876 | + }); | ||
877 | + } | ||
878 | + //获取展示类型的字典数据 | ||
879 | + function initShowType(){ | ||
880 | + if(mode){//如果不展示字段就不去请求 | ||
881 | + admin.req({ | ||
882 | + url: domainName + '/api-web/manage/ddic/findSucDdics/DETAILS_POWER' | ||
883 | + , method: 'POST' | ||
884 | + , async: false | ||
885 | + , success: function (res) { | ||
886 | + $.each(res.data, function (i, v) { | ||
887 | + showTypeList.push({ | ||
888 | + name: v.ddicName | ||
889 | + ,value: v.ddicCode.substring(v.ddicCode.lastIndexOf("_")+1,v.ddicCode.length) | ||
890 | + }) | ||
891 | + }); | ||
892 | + } | ||
893 | + }); | ||
894 | + } | ||
895 | + } | ||
896 | + //刷新表格 | ||
897 | + function reloadTable(resType,busId) { | ||
898 | + table.reload('bustype_reslist_resListTable', { | ||
899 | + url: common.domainName + '/api-web/home/res-list/' + (resType ? resType : 'all'), | ||
900 | + where: { | ||
901 | + access_token: accessToken, | ||
902 | + resName: $("#bustype_reslist_keyword").val(), | ||
903 | + busId: busId, | ||
904 | + resHealth: $("#bustype_reslist_resStatus").val() | ||
905 | + } | ||
906 | + }); | ||
907 | + } | ||
908 | + //获取选中的数据 | ||
909 | + function getCheckData() { | ||
910 | + if(mode){ | ||
911 | + //获取改变的值 | ||
912 | + var str=''; | ||
913 | + var $tr=$('#bustype-table').next().find('tbody tr'); | ||
914 | + $.each($tr,function (i,v) { | ||
915 | + var $btn=$(this).find('.btn-bustype-unbind'); | ||
916 | + var showType=$(this).find('.resourceType_showType') && $(this).find('.resourceType_showType').eq(0) && $(this).find('.resourceType_showType').eq(0).val() ? $(this).find('.resourceType_showType').eq(0).val():'<'; | ||
917 | + if(!$btn.hasClass('hide')){ | ||
918 | + str += $btn.attr("data-id")+'_'+showType+','; | ||
919 | + } | ||
920 | + }); | ||
921 | + if(str!=''){ | ||
922 | + str=str.substring(0,str.length-1); | ||
923 | + } | ||
924 | + return str; | ||
925 | + }else{ | ||
926 | + return busTypeTable.checkStatus(false); | ||
927 | + } | ||
928 | + | ||
929 | + } | ||
930 | + | ||
931 | + return {getData: getCheckData}; | ||
932 | + }); | ||
933 | +}); |
1 | +/** | ||
2 | + | ||
3 | + @Name:layuiAdmin 核心模块 | ||
4 | + @Author:贤心 | ||
5 | + @Site:http://www.layui.com/admin/ | ||
6 | + @License:LPPL | ||
7 | + | ||
8 | + */ | ||
9 | + | ||
10 | +layui.define(['view'], function(exports){ | ||
11 | + var $ = layui.jquery | ||
12 | + ,laytpl = layui.laytpl | ||
13 | + ,element = layui.element | ||
14 | + ,setter = layui.setter | ||
15 | + ,view = layui.view | ||
16 | + ,layer = layui.layer | ||
17 | + ,sessions = layui.sessions | ||
18 | + ,device = layui.device() | ||
19 | + | ||
20 | + ,$win = $(window), $body = $('body') | ||
21 | + ,container = $('#'+ setter.container) | ||
22 | + | ||
23 | + ,SHOW = 'layui-show', HIDE = 'layui-hide', THIS = 'layui-this', DISABLED = 'layui-disabled', TEMP = 'template' | ||
24 | + ,APP_BODY = '#LAY_app_body', APP_FLEXIBLE = 'LAY_app_flexible' | ||
25 | + ,FILTER_TAB_TBAS = 'layadmin-layout-tabs' | ||
26 | + ,APP_SPREAD_SM = 'layadmin-side-spread-sm', TABS_BODY = 'layadmin-tabsbody-item' | ||
27 | + ,ICON_SHRINK = 'layui-icon-shrink-right', ICON_SPREAD = 'layui-icon-spread-left' | ||
28 | + ,SIDE_SHRINK = 'layadmin-side-shrink', SIDE_MENU = 'LAY-system-side-menu' | ||
29 | + // ,accessToken = sessions.getToken()['access_token'] | ||
30 | + | ||
31 | + //通用方法 | ||
32 | + ,admin = { | ||
33 | + domainName: sessionStorage.getItem('domainName'), // gateway地址 | ||
34 | + v: '1.2.1 pro' | ||
35 | + | ||
36 | + //数据的异步请求 | ||
37 | + ,req: view.req | ||
38 | + | ||
39 | + //清除本地 token,并跳转到登入页 | ||
40 | + ,exit: view.exit | ||
41 | + | ||
42 | + //xss 转义 | ||
43 | + ,escape: function(html){ | ||
44 | + return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&') | ||
45 | + .replace(/</g, '<').replace(/>/g, '>') | ||
46 | + .replace(/'/g, ''').replace(/"/g, '"'); | ||
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 | + 欢迎 <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;" >欢迎 <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> </span> 表示每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> </span> 表示每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> </span> 表示在每月的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> </strong> 表示周一到周五每天上午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> 表示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> 每天上午10点,下午2点,4点 | ||
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> 朝九晚五工作时间内每半小时 | ||
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> 表示每个星期三中午12点 | ||
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> 每天中午12点触发 | ||
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 ? * * </span></strong> 每天上午10:15触发 | ||
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> 每天上午10:15触发 | ||
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> </strong> 每天上午10:15触发 | ||
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> 2005年的每天上午10:15触发 | ||
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> 在每天下午2点到下午2:59期间的每1分钟触发 | ||
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> 在每天下午2点到下午2:55期间的每5分钟触发 | ||
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> 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 | ||
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> </strong> 在每天下午2点到下午2:05期间的每1分钟触发 | ||
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> 每年三月的星期三的下午2:10和2:44触发 | ||
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> </strong> 周一至周五的上午10:15触发 | ||
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> </strong> 每月15日上午10:15触发 | ||
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> </strong> 每月最后一日的上午10:15触发 | ||
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> </strong> 每月的最后一个星期五上午10:15触发 | ||
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> 2002年至2005年的每月的最后一个星期五上午10:15触发 | ||
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> 每月的第三个星期五上午10:15触发 | ||
523 | + </p> | ||
524 | + <p style="margin: 10px auto; padding: 0px;"> | ||
525 | + | ||
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"></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"></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"></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"></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 | +<!--杭州业务管理--> | ||
2 | +<title>业务管理</title> | ||
3 | +<script type="text/html" template> | ||
4 | + {{# | ||
5 | + var access_token = ""; | ||
6 | + var workflowPath = ""; | ||
7 | + layui.use(['sessions','common','admin'], function () { | ||
8 | + var $ = layui.$; | ||
9 | + var common = layui.common; | ||
10 | + var admin = layui.admin; | ||
11 | + access_token = layui.sessions.getToken()['access_token']; | ||
12 | + workflowPath = common.workflowName; | ||
13 | + $('#businessListHzIframe').attr('src',workflowPath+'/itsm/index.html#/businessListHz?access_token='+access_token); | ||
14 | + }); | ||
15 | + }} | ||
16 | + <iframe id="businessListHzIframe" src="{{workflowPath}}/itsm/index.html#/businessListHz?access_token={{access_token}}" frameborder="0" class="layadmin-iframe"></iframe> | ||
17 | +</script> |
1 | +<!DOCTYPE html> | ||
2 | +<html> | ||
3 | +<head> | ||
4 | + <meta charset="utf-8"> | ||
5 | + <title>综合监控管理平台</title> | ||
6 | + <link rel="shortcut icon" href="../src/style/res/shui.png"> | ||
7 | + <meta name="renderer" content="webkit"> | ||
8 | + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||
9 | + <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> | ||
10 | + <link rel="stylesheet" href="/start/layui/css/layui.css" media="all"> | ||
11 | + <script> | ||
12 | + /^http(s*):\/\//.test(location.href) || alert('请先部署到 localhost 下再访问'); | ||
13 | + </script> | ||
14 | +</head> | ||
15 | +<body> | ||
16 | + <div id="LAY_app"></div> | ||
17 | + <script src="/start/layui/layui.js"></script> | ||
18 | + <script> | ||
19 | + layui.use(['jquery'], function () { | ||
20 | + var $ = layui.jquery; | ||
21 | + // 读取配置文件 | ||
22 | + $.when( | ||
23 | + $.ajax({ | ||
24 | + url: '/config/getConfig', | ||
25 | + data: { | ||
26 | + configName: 'url' | ||
27 | + }, | ||
28 | + async: false | ||
29 | + }),$.ajax({ | ||
30 | + url: '/config/getConfig', | ||
31 | + data: { | ||
32 | + configName: 'config.audio' | ||
33 | + }, | ||
34 | + }), | ||
35 | + ).done(function (res1,res2) { | ||
36 | + sessionStorage.setItem('domainName', res1[0].gateway); | ||
37 | + sessionStorage.setItem('domainInspectionURI', res1[0].inspection_web); | ||
38 | + sessionStorage.setItem('domainAssetsManage', res1[0].assetsweb); | ||
39 | + sessionStorage.setItem('graphEditorOrigin', res1[0].mxgraph_editor); | ||
40 | + sessionStorage.setItem('tingyun', res1[0].tingyun); | ||
41 | + sessionStorage.setItem('bigScreen', res1[0].bigScreen); | ||
42 | + sessionStorage.setItem('ythView', res1[0].ythView); | ||
43 | + sessionStorage.setItem('workflow', res1[0].workflow); | ||
44 | + sessionStorage.setItem('mp3', res2[0].mp3); | ||
45 | + sessionStorage.setItem('jimuReport', res1[0].jimuReport); | ||
46 | + }) | ||
47 | + }); | ||
48 | + layui.config({ | ||
49 | + base: '../src/' //指定 layuiAdmin 项目路径,本地开发用 src,线上用 dist | ||
50 | +// ,version: '1.2.1'//运行环境用个固定版本号 | ||
51 | + ,version: new Date().getTime()//本地开发环境,避免改动后的文件未及时生效,所以用时间戳作为版本 | ||
52 | + }).use('index'); | ||
53 | + </script> | ||
54 | +</body> | ||
55 | +</html> | ||
56 | + | ||
57 | + |
@@ -5,3 +5,16 @@ | @@ -5,3 +5,16 @@ | ||
5 | 5 | ||
6 | /*乙方运维*/ | 6 | /*乙方运维*/ |
7 | @import "../css/operationMaintenance.css"; | 7 | @import "../css/operationMaintenance.css"; |
8 | + | ||
9 | +/*电子大屏*/ | ||
10 | +@import "../css/bigscreen.css"; | ||
11 | + | ||
12 | +@import "../css/topfive.css"; | ||
13 | + | ||
14 | +@import "../css/global.css"; | ||
15 | + | ||
16 | +@import "../css/deduction.css"; | ||
17 | + | ||
18 | +@import "../css/businessVolume.css"; | ||
19 | + | ||
20 | +@import "../css/digitalboard.css"; |
No preview for this file type
1 | +/* 大屏配置 ---start */ | ||
2 | +.com-page { | ||
3 | + width: 100%; | ||
4 | + height: 100%; | ||
5 | + overflow: hidden; | ||
6 | +} | ||
7 | + | ||
8 | +.com-container { | ||
9 | + width: 100%; | ||
10 | + height: 100%; | ||
11 | + overflow: hidden; | ||
12 | +} | ||
13 | + | ||
14 | +.com-chart { | ||
15 | + width: 100%; | ||
16 | + height: 100%; | ||
17 | + overflow: hidden; | ||
18 | +} | ||
19 | +/* 大屏配置 ---end */ | ||
20 | + | ||
21 | +.screen-container { | ||
22 | + width: 100%; | ||
23 | + height: 100%; | ||
24 | + padding: 0 0.2%; | ||
25 | + background: url(bg_backgroud.png); | ||
26 | + background-size: 100% 100%; | ||
27 | + color: #fff; | ||
28 | + box-sizing: border-box; | ||
29 | +} | ||
30 | + | ||
31 | +.screen-header { | ||
32 | + width: 100%; | ||
33 | + position: relative; | ||
34 | +} | ||
35 | +.screen-header .title{ | ||
36 | + position: absolute; | ||
37 | + left: 50%; | ||
38 | + top: 56%; | ||
39 | + transform: translate(-50%, -50%); | ||
40 | +} | ||
41 | +.screen-header .title-left{ | ||
42 | + display: flex; | ||
43 | + align-items: center; | ||
44 | + position:absolute; | ||
45 | + transform: translateY(-80%); | ||
46 | + left: 1%; | ||
47 | + top: 55%; | ||
48 | +} | ||
49 | +.screen-header .timelog{ | ||
50 | + cursor: pointer; | ||
51 | +} | ||
52 | + | ||
53 | +.screen-body { | ||
54 | + width: 100%; | ||
55 | + height: 60%; | ||
56 | + display: flex; | ||
57 | + margin-bottom: 0.2%; | ||
58 | +} | ||
59 | +.screen-left { | ||
60 | + height: 100%; | ||
61 | + width: 30%; | ||
62 | +} | ||
63 | +.screen-left #left-top { | ||
64 | + height: 56%; | ||
65 | + position: relative; | ||
66 | +} | ||
67 | +.screen-left #left-bottom { | ||
68 | + height: 43.8%; | ||
69 | + position: relative; | ||
70 | +} | ||
71 | +.screen-middle { | ||
72 | + height: 100%; | ||
73 | + width: 40%; | ||
74 | + margin-top: 0.5%; | ||
75 | + margin-left: 0.2%; | ||
76 | + margin-right: 0.2%; | ||
77 | +} | ||
78 | +.screen-middle #middle-top { | ||
79 | + width: 100%; | ||
80 | + height: 32.4%; | ||
81 | + position: relative; | ||
82 | +} | ||
83 | +.screen-middle #middle-center { | ||
84 | + width: 100%; | ||
85 | + height: 32.4%; | ||
86 | + position: relative; | ||
87 | +} | ||
88 | +.screen-middle #middle-bottom { | ||
89 | + width: 100%; | ||
90 | + height: 34%; | ||
91 | + position: relative; | ||
92 | +} | ||
93 | + | ||
94 | +.screen-right { | ||
95 | + height: 100%; | ||
96 | + width: 30%; | ||
97 | +} | ||
98 | + | ||
99 | +.screen-right #right-top { | ||
100 | + height: 26%; | ||
101 | + position: relative; | ||
102 | +} | ||
103 | +.screen-right #right-center { | ||
104 | + height: 37%; | ||
105 | + position: relative; | ||
106 | +} | ||
107 | +.screen-right #right-bottom { | ||
108 | + height: 37%; | ||
109 | + position: relative; | ||
110 | +} | ||
111 | + | ||
112 | +.screen-bottom { | ||
113 | + width: 100%; | ||
114 | + height: 34%; | ||
115 | + display: flex; | ||
116 | +} | ||
117 | +.screen-bottom #bottom-one { | ||
118 | + height: 100%; | ||
119 | + width: 25%; | ||
120 | + position: relative; | ||
121 | +} | ||
122 | +.screen-bottom #bottom-two { | ||
123 | + height: 100%; | ||
124 | + width: 25%; | ||
125 | + position: relative; | ||
126 | +} | ||
127 | +.screen-bottom #bottom-three { | ||
128 | + height: 100%; | ||
129 | + width: 25%; | ||
130 | + position: relative; | ||
131 | +} | ||
132 | +.screen-bottom #bottom-four { | ||
133 | + height: 100%; | ||
134 | + width: 25%; | ||
135 | + position: relative; | ||
136 | +} |
1 | +.busniess-title-size { | ||
2 | + position: absolute; | ||
3 | + left: 13%; | ||
4 | + top: 3%; | ||
5 | +} | ||
6 | +.busniess-title-img { | ||
7 | + position: absolute; | ||
8 | + left: 5%; | ||
9 | + top: 2%; | ||
10 | +} | ||
11 | +.busniess-box-title { | ||
12 | + margin-left: 8%; | ||
13 | +} | ||
14 | +.busniess-circle-left { | ||
15 | + position: absolute; | ||
16 | + left: 19%; | ||
17 | + top: 59%; | ||
18 | +} | ||
19 | +.busniess-circle-right { | ||
20 | + position: absolute; | ||
21 | + left: 63%; | ||
22 | + top: 59%; | ||
23 | +} | ||
24 | +.busniess-circle-text { | ||
25 | + text-align: center; | ||
26 | +} |
1 | +.com-box { | ||
2 | + text-align: center; | ||
3 | +} | ||
4 | +.deduction-box-title { | ||
5 | + position: absolute; | ||
6 | + left: 2%; | ||
7 | + top: 1%; | ||
8 | +} | ||
9 | +.deduction-title-size { | ||
10 | + position: absolute; | ||
11 | + left: 9%; | ||
12 | + top: 20%; | ||
13 | +} | ||
14 | +.deduction-box-text-left { | ||
15 | + position: absolute; | ||
16 | + left: 12%; | ||
17 | + top: 45%; | ||
18 | +} | ||
19 | +.deduction-box-text-right { | ||
20 | + position: absolute; | ||
21 | + left: 60%; | ||
22 | + top: 45%; | ||
23 | +} | ||
24 | +.deduction-text-number { | ||
25 | + color: #01E6E6; | ||
26 | +} |
1 | +.com-box { | ||
2 | + text-align: center; | ||
3 | +} | ||
4 | +.com-box-right { | ||
5 | + text-align: right; | ||
6 | +} | ||
7 | +.span-box-title { | ||
8 | + position: absolute; | ||
9 | + color: #FEFEFE; | ||
10 | + top: 1%; | ||
11 | + left: 6%; | ||
12 | +} | ||
13 | + | ||
14 | +@font-face{ | ||
15 | + font-family: yjsz; | ||
16 | + /*src: url('../assets/font/DS-DIGIT.TTF');*/ | ||
17 | + src: url(DS-DIGIT.TTF); | ||
18 | +} |
1 | +html, body, #app { | ||
2 | + width: 100%; | ||
3 | + height: 100%; | ||
4 | + padding: 0; | ||
5 | + margin: 0; | ||
6 | + overflow: hidden; | ||
7 | +} | ||
8 | + | ||
9 | +.com-page { | ||
10 | + width: 100%; | ||
11 | + height: 100%; | ||
12 | + overflow: hidden; | ||
13 | +} | ||
14 | + | ||
15 | +.com-container { | ||
16 | + width: 100%; | ||
17 | + height: 100%; | ||
18 | + overflow: hidden; | ||
19 | +} | ||
20 | + | ||
21 | +.com-chart { | ||
22 | + width: 100%; | ||
23 | + height: 100%; | ||
24 | + overflow: hidden; | ||
25 | +} | ||
26 | + | ||
27 | +canvas { | ||
28 | + border-radius: 20px; | ||
29 | +} |
1 | +@charset "utf-8"; | ||
2 | +/* CSS Document */ | ||
3 | +*{ | ||
4 | + -webkit-box-sizing: border-box; | ||
5 | + -moz-box-sizing: border-box; | ||
6 | + box-sizing: border-box} | ||
7 | +*,body{padding:0px; margin:0px;color: #222;font-family: "微软雅黑";} | ||
8 | +@font-face{font-family:electronicFont;src:url(../font/DS-DIGIT.TTF)} | ||
9 | +body{ background:#000d4a url(../images/bg.jpg) center top; background-size:cover;color:#666;font-size: .1rem;} | ||
10 | +li{ list-style-type:none;} | ||
11 | +table{} | ||
12 | +i{ margin:0px; padding:0px; text-indent:0px;} | ||
13 | +img{ border:none; max-width: 100%;} | ||
14 | +a{ text-decoration:none; color:#399bff;} | ||
15 | +a.active,a:focus{ outline:none!important; text-decoration:none;} | ||
16 | +ol,ul,p,h1,h2,h3,h4,h5,h6{ padding:0; margin:0} | ||
17 | +a:hover{ color:#06c; text-decoration: none!important} | ||
18 | + | ||
19 | + | ||
20 | +.clearfix:after, .clearfix:before { | ||
21 | + display: table; | ||
22 | + content: " " | ||
23 | +} | ||
24 | + .clearfix:after { | ||
25 | + clear: both | ||
26 | +} | ||
27 | +.pulll_left{float:left;} | ||
28 | +.pulll_right{float:right;} | ||
29 | +/*谷哥滚动条样式*/ | ||
30 | + | ||
31 | + ::-webkit-scrollbar {width:5px;height:5px;position:absolute} | ||
32 | + ::-webkit-scrollbar-thumb {background-color:#5bc0de} | ||
33 | + ::-webkit-scrollbar-track {background-color:#ddd} | ||
34 | + | ||
35 | +/***/ | ||
36 | +.canvas{position: absolute; width:100%; left: 0; top: 0; height: 99%; z-index: 1;} | ||
37 | + | ||
38 | +.allnav{height: calc(100% - 30px);} | ||
39 | +.loading{position:fixed; left:0; top:0; font-size:18px; z-index:100000000;width:100%; height:100%; background:#1a1a1c; text-align:center;} | ||
40 | +.loadbox{position:absolute; width:160px;height:150px; color: #aaa; left:50%; top:50%; margin-top:-100px; margin-left:-75px;} | ||
41 | +.loadbox img{ margin:10px auto; display:block; width:40px;} | ||
42 | + | ||
43 | +.copyright{ background:rgba(19,31,64,.32); border: 1px solid rgba(255,255,255,.05); line-height:.5rem; text-align: center; padding-right: 15px; bottom: 0; color:rgba(255,255,255,.7); font-size: .16rem; } | ||
44 | + | ||
45 | +.head{ height:1.05rem; background: url(../images/head_bg.png) no-repeat center center; background-size: 100% 100%; position: relative; z-index: 100;} | ||
46 | +.head h1{ color:#fff; text-align: center; font-size: .4rem; line-height:.8rem;} | ||
47 | +.head h1 img{ width:1.5rem; display: inline-block; vertical-align: middle; margin-right: .2rem} | ||
48 | +.weather{ position:absolute; right:.3rem; top:0; line-height: .75rem;} | ||
49 | +.weather img{ width:.37rem; display: inline-block; vertical-align: middle;} | ||
50 | +.weather span{color:rgba(255,255,255,.7); font-size: .18rem; padding-right: .1rem;} | ||
51 | +.mainbox{ padding:.1rem .1rem 0rem .1rem;} | ||
52 | +.mainbox>ul{} | ||
53 | +.mainbox>ul>li{ float: left; padding: 0 .1rem} | ||
54 | + | ||
55 | +.mainbox>ul>li{ width: 30%} | ||
56 | +.mainbox>ul>li:nth-child(2){ width: 40%;padding: 0} | ||
57 | + | ||
58 | +.boxall{ border: 1px solid rgba(25,186,139,.17); padding:0 .2rem .4rem .15rem; background: rgba(255,255,255,.04) url(../images/line.png); background-size: 100% auto; position: relative; margin-bottom: .15rem; z-index: 10;} | ||
59 | +.boxall:before, | ||
60 | +.boxall:after{ position:absolute; width: .1rem; height: .1rem; content: ""; border-top: 2px solid #02a6b5; top: 0;} | ||
61 | +.boxall:before,.boxfoot:before{border-left: 2px solid #02a6b5;left: 0;} | ||
62 | +.boxall:after,.boxfoot:after{border-right: 2px solid #02a6b5; right: 0;} | ||
63 | +.alltitle{ font-size:.2rem; color:#fff; text-align: center; line-height: .5rem;} | ||
64 | + | ||
65 | +.boxfoot{ position:absolute; bottom: 0; width: 100%; left: 0;} | ||
66 | +.boxfoot:before, | ||
67 | +.boxfoot:after{ position:absolute; width: .1rem; height: .1rem; content: "";border-bottom: 2px solid #02a6b5; bottom: 0;} | ||
68 | + | ||
69 | +.bar{background:rgba(101,132,226,.1); padding: .15rem;} | ||
70 | +.barbox li,.barbox2 li{ width:50%; text-align: center; position: relative; z-index: 100;} | ||
71 | +.barbox:before, | ||
72 | +.barbox:after{ position:absolute; width: .3rem; height: .1rem; content: ""; } | ||
73 | +.barbox:before{border-left: 2px solid #02a6b5;left: 0;border-top: 2px solid #02a6b5; } | ||
74 | +.barbox:after{border-right: 2px solid #02a6b5; right: 0; bottom: 0;border-bottom: 2px solid #02a6b5; } | ||
75 | + | ||
76 | +.barbox li:first-child:before{ position:absolute; content: ""; height:50%; width: 1px; background: rgba(255,255,255,.2); right: 0; top: 25%;} | ||
77 | + | ||
78 | +.barbox{ border: 1px solid rgba(25,186,139,.17); position: relative;} | ||
79 | +.barbox li{ font-size: .7rem; color: #ffeb7b; padding: .05rem 0; font-family:electronicFont; font-weight: bold;} | ||
80 | +.barbox2 li{ font-size: .19rem; color:rgba(255,255,255,.7); padding-top: .1rem;} | ||
81 | + | ||
82 | +.map{ position:relative; height: 7.2rem; z-index: 9;} | ||
83 | +.map4{ width: 200%; height:7rem; position: relative; left: -50%; top: 4%; margin-top: .2rem; z-index: 5;} | ||
84 | +.map1,.map2,.map3{ position:absolute; opacity: .5} | ||
85 | +.map1{ width:6.43rem; z-index: 2;top:.45rem; left: .7rem; animation: myfirst2 15s infinite linear;} | ||
86 | +.map2{ width:5.66rem; top:.85rem; left:1.2rem; z-index: 3; opacity: 0.2; animation: myfirst 10s infinite linear;} | ||
87 | +.map3{ width:5.18rem; top:1.07rem; left: 1.4rem; z-index: 1;} | ||
88 | + | ||
89 | + | ||
90 | + | ||
91 | + | ||
92 | + | ||
93 | +.tabs { text-align: center; padding: .1rem 0 0 0;} | ||
94 | +.tabs a { | ||
95 | + position: relative; | ||
96 | + display: inline-block; | ||
97 | + margin-left: 1px; | ||
98 | + padding:.05rem .2rem; | ||
99 | + color: #898989; | ||
100 | + transition: all .3s ease-out 0s; | ||
101 | + font-size: 14px; | ||
102 | +} | ||
103 | +.tabs li{ display:inline-block;} | ||
104 | +.tabs a:after { | ||
105 | + position: absolute; | ||
106 | + width: 1px; | ||
107 | + height: 10px; | ||
108 | + background-color: rgba(255,255,255,.1); | ||
109 | + content: ''; | ||
110 | + margin-left:0; right:-1px; margin-top: 7px; | ||
111 | + | ||
112 | + | ||
113 | +} | ||
114 | +.tabs li a.active {border: 1px solid rgba(25,186,139,.17); background: rgba(255,255,255,.05); color:#fff;} | ||
115 | + | ||
116 | +.tit02{ text-align:center; margin: .1rem 0; position: relative} | ||
117 | +.tit02 span{border: 1px solid rgba(25,186,139,.17); letter-spacing: 2px; padding: .01rem .2rem; background: rgba(255,255,255,.05); font-size: .18rem; color: #49bcf7;} | ||
118 | +.tit02:before,.tit02:after{ position:absolute; width:26%; height: 1px;background: rgba(25,186,139,.2); content: ""; top: .12rem;} | ||
119 | +.tit02:after{ right:0;} | ||
120 | +.tit02:before{ left:0;} | ||
121 | + | ||
122 | +.wrap{ height:2.54rem; overflow: hidden;} | ||
123 | +.wrap li{ line-height:.42rem; height:.42rem; font-size: .18rem; text-indent: .24rem; margin-bottom: .1rem; } | ||
124 | +.wrap li p{border: 1px solid rgba(25,186,139,.17);color: rgba(255,255,255,.6); } | ||
125 | +.sy{ float:left; width: 33%; height:95%; margin-top: .25rem;} | ||
126 | + | ||
127 | + | ||
128 | +.adduser{ height:1.5rem; overflow: hidden;} | ||
129 | +.adduser li{height:.5rem;} | ||
130 | +.adduser img{ width: .40rem; border-radius: .5rem; margin-right: .1rem; display: inline-block; vertical-align: middle;} | ||
131 | +.adduser span{ line-height:.5rem; font-size: .18rem;color: rgba(255,255,255,.6); } | ||
132 | + | ||
133 | +.sycm ul{ margin-left:-.5rem;margin-right:-.5rem; padding: .16rem 0;} | ||
134 | +.sycm li{ float: left; width: 33.33%; text-align: center; position: relative} | ||
135 | +.sycm li:before{ position:absolute; content: ""; height:30%; width: 1px; background: rgba(255,255,255,.1); right: 0; top: 15%;} | ||
136 | +.sycm li:last-child:before{ width: 0;} | ||
137 | + | ||
138 | +.sycm li h2{ font-size:.3rem; color: #c5ccff;} | ||
139 | +.sycm li span{ font-size:.18rem; color: #fff; opacity: .5;} | ||
140 | + | ||
141 | +@keyframes myfirst2 | ||
142 | +{ | ||
143 | +from {transform: rotate(0deg);} | ||
144 | +to {transform: rotate(359deg);} | ||
145 | +} | ||
146 | + | ||
147 | +@keyframes myfirst | ||
148 | +{ | ||
149 | +from {transform: rotate(0deg);} | ||
150 | +to {transform: rotate(-359deg);} | ||
151 | +} | ||
152 | + | ||
153 | +/*Plugin CSS*/ | ||
154 | +.str_wrap { | ||
155 | + overflow:hidden; | ||
156 | + width:100%; | ||
157 | + position:relative; | ||
158 | + -moz-user-select: none; | ||
159 | + -khtml-user-select: none; | ||
160 | + user-select: none; | ||
161 | + white-space:nowrap; | ||
162 | +} | ||
163 | + | ||
164 | + | ||
165 | +.str_move { | ||
166 | + white-space:nowrap; | ||
167 | + position:absolute; | ||
168 | + top:0; | ||
169 | + left:0; | ||
170 | + cursor:move; | ||
171 | +} | ||
172 | +.str_move_clone { | ||
173 | + display:inline-block; | ||
174 | + vertical-align:top; | ||
175 | + position:absolute; | ||
176 | + left:100%; | ||
177 | + top:0; | ||
178 | +} | ||
179 | +.str_vertical .str_move_clone { | ||
180 | + left:0; | ||
181 | + top:100%; | ||
182 | +} | ||
183 | +.str_down .str_move_clone { | ||
184 | + left:0; | ||
185 | + bottom:100%; | ||
186 | +} | ||
187 | +.str_vertical .str_move, | ||
188 | +.str_down .str_move { | ||
189 | + white-space:normal; | ||
190 | + width:100%; | ||
191 | +} | ||
192 | +.str_static .str_move, | ||
193 | +.no_drag .str_move, | ||
194 | +.noStop .str_move{ | ||
195 | + cursor:inherit; | ||
196 | +} | ||
197 | +.str_wrap img { | ||
198 | + max-width:none !important; | ||
199 | +} |
1 | +html, body, #app { | ||
2 | + width: 100%; | ||
3 | + height: 100%; | ||
4 | + padding: 0; | ||
5 | + margin: 0; | ||
6 | + overflow: hidden; | ||
7 | +} | ||
8 | + | ||
9 | +.com-page { | ||
10 | + width: 100%; | ||
11 | + height: 100%; | ||
12 | + overflow: hidden; | ||
13 | +} | ||
14 | + | ||
15 | +.com-container { | ||
16 | + width: 100%; | ||
17 | + height: 100%; | ||
18 | + overflow: hidden; | ||
19 | +} | ||
20 | + | ||
21 | +.com-chart { | ||
22 | + width: 100%; | ||
23 | + height: 100%; | ||
24 | + overflow: hidden; | ||
25 | +} | ||
26 | + | ||
27 | +canvas { | ||
28 | + border-radius: 20px; | ||
29 | +} |
No preview for this file type
-
Please register or login to post a comment