Authored by 王涛

浙江大屏

... ... @@ -29,6 +29,14 @@
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
... ...
... ... @@ -25,6 +25,14 @@
<build>
<finalName>zjweb</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
... ...
... ... @@ -12,7 +12,7 @@ server:
key-store-password: Hg0801..
key-password: Hg0801..
url:
gateway: http://127.0.0.1:8080
gateway: http://192.168.0.41:8080
inspection_web: http://127.0.0.1:8082
assetsweb: http://127.0.0.1:8082
mxgraph_editor: http://127.0.0.1:8085
... ...
... ... @@ -32,6 +32,11 @@ const routes = [{
path: '/res/list',
name: 'resList',
component: () => myImport('views/res/list/index')
},
{
path: '/zj/dp',
name: 'resList',
component: () => myImport('views/dp/index')
}
];
... ...
... ... @@ -25,6 +25,14 @@
<build>
<finalName>tjweb</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.honggroup</groupId>
<artifactId>hg-monitor-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.honggroup</groupId>
<artifactId>hg-monitor-web-zj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hg-monitor-web-zj</name>
<description>浙江个性化版本</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.honggroup</groupId>
<artifactId>hg-monitor-web-new</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>zjweb</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
... ...
spring:
application:
name: zjweb
server:
port: 8088
ssl:
enabled: false
key-alias: tomcat_https
key-store: classpath:keystore/tomcat_https.keystore
key-store-type: JKS
key-store-password: Hg0801..
key-password: Hg0801..
url:
gateway: http://192.168.0.41:8080
inspection_web: http://127.0.0.1:8082
assetsweb: http://127.0.0.1:8082
mxgraph_editor: http://127.0.0.1:8085
tingyun: http://127.0.0.1:8088
bigScreen: http://127.0.0.1:8081
#流程系统路径,当ssl.enabled=true时,http要改为https,并修改流程nginx的conf文件
workflow: http://192.168.0.248:8002
# 积木报表工具
jimuReport: http://192.168.0.41:8085
config:
layer:
load:
icon: hg
audio:
mp3: 14039
tingyun:
api_key: aZipZbC18BhpG5GrjtiFAtThL1I0OUfn
secret_key: nbxay44wx8c3x4n5wcxe63mp87a72xed
... ...
<title>浙江大屏</title>
<iframe src="/vue3/index.html#/zj/dp" class="layadmin-iframe"/>
... ...
<div class="assets-configmanager">
<el-form :inline="true" :model="formInline" class="demo-form-inline" style="text-align: left;padding-left: 6px;">
<el-form-item label="" >
<el-input :disabled="initFlag" placeholder="输入关键字" v-model="pageInfo.keyWords" prefix-icon="el-icon-search">
</el-input>
</el-form-item>
<el-form-item label="" :disabled="initFlga">
<res-type-tree multiple clearable collapseTags @callback="getResType" />
</el-form-item>
<el-form-item label="">
<machine-room @callback="getMachineRoom"></machine-room>
</el-form-item>
<el-form-item>
<el-button :disabled="initFlag" type="primary" @click="onBtnSearch()">查询</el-button>
</el-form-item>
</el-form>
<!-- <div style="text-align: right" v-if="loadHead">
<el-popover placement="bottom" trigger="click">
<template #reference>
<el-button icon="el-icon-set-up" plain hairline size="small"></el-button>
</template>
<div slot="content" style="width: 100px;">
<div style="display: flex;flex-direction: column">
{{checkList}}
<el-checkbox-group v-model="checkList">
<el-checkbox :label="item.propName" borderv-for="item in columns"
style="margin: 3px;width: 100px;"></el-checkbox>
</el-checkbox-group>
</div>
</div>
</el-popover>
</div> -->
<el-table :max-height="height" v-loading="loading" :data="tableList" border style="width: 100%;" header-row-class-name="tbl-header-class"
:empty-text="emptyText" :stripe="true">
<el-table-column fixed type="index" v-if="columns.length > 0" :index="(index) => {return index + 1}" label="序号" width="60" align="center"> </el-table-column>
<el-table-column v-for="item in columns" :prop="item.propKey" :label="item.propName"
:width="widths[item.propKey] ? widths[item.propKey] : '120'">
<template #default="scope" v-if="item.propKey =='resName'">
<el-link type="primary" @click="openDetailPage(scope.row)">{{scope.row.resName}}</el-link>
</template>
</el-table-column>
</el-table>
<div style="text-align: center">
<el-pagination @size-change="handleSizeChange"
@prev-click="prePage"
@next-click="nextPage"
@current-change="handleCurrentChange"
:current-page="pageInfo.page" :page-sizes="[50,100, 150, 200]" :page-size="pageInfo.limit"
layout="total, sizes, prev, pager, next, jumper" :total="pageInfo.total" />
</div>
<el-dialog top="2vh" :title="row.title" v-model="centerDialogVisible" custom-class="config-dialog" width="80%" destroy-on-close>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="基本信息" name="jbxx">
<div class="config-tools">
<el-button-group>
<el-button size="mini" icon="el-icon-edit-outline" @click="editConfig('jbxx')"></el-button>
<el-button size="mini" v-if="edits['jbxx'] && edits['jbxx'] === true" icon="el-icon-check" @click="saveConfig('jbxx')"></el-button>
<el-button size="mini" v-if="edits['jbxx'] && edits['jbxx'] === true" icon="el-icon-close" @click="cancelConfig('jbxx')"></el-button>
</el-button-group>
</div>
<div class="config-view">
<div style="display: flex;flex-direction: row;width: 100%;">
<div class="config-header-title">属性</div>
<div class="config-header-content">内容</div>
<div class="config-header-title">属性</div>
<div class="config-header-content">内容</div>
</div>
<div v-if="row.detail.jbxx != undefined" v-for="(item,index) in row.detail.jbxx"
style="display: flex;flex-direction: row;width: 50%;">
<div class="config-content-title">
{{item.propName}} &nbsp;
<i v-if="editKey[item.propKey] && editKey[item.propKey].edit === true" class="el-icon-edit" style="color: #409eff;" />
</div>
<div class="config-content-content">
<property-edit :detail="item" @callback="callback"
:operates="edits['jbxx']"></property-edit>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane v-if="row.detail.name != undefined" v-for="(item,index) in row.detail.name"
:label="item.propName" :name="item.parentPropKey">
<div class="config-tools">
<el-button-group>
<el-button size="mini" @click="addTabDetail(item.parentPropKey)" icon="el-icon-plus"></el-button>
<el-button size="mini" @click="editConfig(item.parentPropKey)" icon="el-icon-edit-outline"></el-button>
<el-button size="mini" @click="saveTabConfig(item.parentPropKey)" v-if="edits[item.parentPropKey] && edits[item.parentPropKey] === true" icon="el-icon-check"></el-button>
<el-button size="mini" @click="cancelConfig(item.parentPropKey)" v-if="tabDelete[item.parentPropKey] && tabDelete[item.parentPropKey] === true" icon="el-icon-close"></el-button>
</el-button-group>
</div>
<div class="config-view">
<div style="display: flex;flex-direction: row;width: 100%;">
<div class="config-header-title"
v-if="row[item.parentPropKey] != undefined && row[item.parentPropKey].name != undefined "
:style="'width:calc(' + 1/row[item.parentPropKey].name.length*100 +'% - ' + 40/row[item.parentPropKey].name.length + 'px)'"
v-for="(propName,index) in row[item.parentPropKey].name" >
{{propName}}
</div>
<div class="config-header-title" style="width: 40px">操作</div>
</div>
<div style="display: flex;flex-direction: row;width: 100%;"
v-if="row[item.parentPropKey] != undefined && row[item.parentPropKey].data != undefined "
v-for="(propList,index) in row[item.parentPropKey].data">
<div class="config-content-content"
:style="'width:calc(' + 1/row[item.parentPropKey].name.length*100 +'% - ' + 40/row[item.parentPropKey].name.length + 'px)'"
v-for="(propInfo,index2) in propList">
<property-edit :detail="propInfo" @callback="callback"
:operates="edits[item.parentPropKey]"></property-edit>
<!--<div v-if="index2 == (propList.length -1) && propInfo.addItem && propInfo.addItem == 1"
style="position: absolute;width: 20px;right: 15px;" >
<el-button size="mini" circle icon="el-icon-delete" @click="deleConfigItem(propList,index,item.parentPropKey)"></el-button>
</div>-->
</div>
<div class="config-content-content" style="width: 40px;">
<el-button size="mini" type="text" icon="el-icon-delete"
v-if="propList[0] && propList[0].addItem && propList[0].addItem == 1"
@click="deleConfigItem(propList,index,item.parentPropKey)"></el-button>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-dialog>
</div>
... ...
export default {
name: 'configmanager',
template: '',
components: {
'property-edit': Vue.defineAsyncComponent(
() => myImport('components/page/assets/propertyedit/index')
),
},
setup() {
const { proxy } = Vue.getCurrentInstance()
let columns = Vue.ref([]);
let tableList = Vue.ref([]);
let emptyText = Vue.ref('数据加载中...');
let resTypeArr = Vue.ref([]);
let machineRoom = Vue.ref('');
let centerDialogVisible = Vue.ref(false);
let loadHead = Vue.ref(false);
let initFlag = Vue.ref(false);
let height = Vue.ref(window.innerHeight - 130);
// 分页信息
const pageInfo = Vue.reactive({
total: 0,
limit: 50,
page: 1,
keyWords:''
})
// 编辑信息
const row = Vue.ref({})
let tabDelete = Vue.ref({});
// 属性列表属性宽度
let widths = Vue.ref({
resName: '350',
admin: "150",
ip: "120",
maintenanceBegin: "180",
maintenanceEnd: "180",
resourceSN: "200",
cabinetPosition: "120",
parentResName:'300',
ULocation: "200"
});
// 筛选列选中的 TODO
let checkList = Vue.ref({})
// 活跃页签
let activeName = Vue.ref('jbxx');
let edits = Vue.ref({})
let editKey = Vue.ref({})
// 搜索
let onSearch = () => {
if(initFlag.value){
return;
}
initFlag.value = true;
// // 加载列表
// proxy.$http.get("/api-web/home/getUserProperties", {
// resTypes: resTypeArr.value
// }, function (res) {
// if (res && res.data) {
// columns.value = res.data;
// emptyText.value = '数据加载中...'
// loadHead.value = true;
// }
// });
//
// // 加载数据
// var params = {
// page: pageInfo.page,
// limit: pageInfo.limit,
// resName: pageInfo.keyWords,
// sortKey: '',
// resType: resTypeArr.value.join(','),
// resPositon: machineRoom.value,
// addr: '',
// maintenanceTimeEnd: '',
// maintenanceTimeStart: '',
// resCategory: 'assets'
// };
// proxy.$http.get("/api-web/home/assets/page/all", params, function (res) {
// if (res && res.data) {
// tableList.value = res.data;
// emptyText.value = "加载完成";
// pageInfo.total = res.count;
// } else {
// emptyText.value = "暂无数据";
// }
// initFlag.value = false;
// })
// 加载数据
var params = {
page: pageInfo.page,
limit: pageInfo.limit,
resName: pageInfo.keyWords,
sortKey: '',
resType: resTypeArr.value.join(','),
resPositon: machineRoom.value,
addr: '',
maintenanceTimeEnd: '',
maintenanceTimeStart: '',
resCategory: 'assets'
};
proxy.$http.get("/api-web/assets/configmanager/list", params, function (res) {
if (res && res.data) {
columns.value = res.map.header;
tableList.value = res.data;
emptyText.value = "加载完成";
pageInfo.total = res.count;
} else {
emptyText.value = "暂无数据";
tableList.value = [];
proxy.$global.showMsg('暂无数据!');
}
initFlag.value = false;
},function (){
proxy.$global.showMsg('没有查询到记录!');
initFlag.value = false;
});
}
// 点击按钮搜索
let onBtnSearch = () =>{
pageInfo.page = 1;
onSearch();
}
let getResType = (arr) => {
console.log(arr);
var types = arr.map(function (v) {
return v.id;
});
resTypeArr.value = types;
onSearch();
}
let getMachineRoom = (code) => {
console.log(code);
machineRoom.value = code;
onSearch();
}
// 每页展示多少条
let handleSizeChange = (val) => {
console.log(`每页 ${val} 条`)
pageInfo.limit = val;
onSearch();
}
// 切换页码
let handleCurrentChange = (val) => {
console.log(`当前页: ${val}`)
pageInfo.page = val;
onSearch();
}
// 切换页码
let prePage = (val) => {
console.log(`当前页: ${val}`)
pageInfo.page = val - 1;
onSearch();
}
// 切换页码
let nextPage = (val) => {
console.log(`当前页: ${val}`)
pageInfo.page = val + 1;
onSearch();
}
// 打开详情页配置
let openDetailPage = (rowDetail) => {
edits.value['jbxx'] = false;
if(row.value.detail && row.value.detail.name){
row.value.detail.name.forEach(function (v) {
edits.value[v] = false;
})
}
let resId = rowDetail.resId;
// 默认基本信息
activeName.value = 'jbxx';
row.value['title'] = rowDetail.resName + '_' + rowDetail.ip;
row.value['resId'] = resId;
let id = encodeURIComponent(resId);
// 获取配置信息
proxy.$http.get(`/api-web/assets/configmanager/resource/assets?resId=${id}`, {}, function (res) {
if (res && res.map) {
row.value['detail'] = res.map;
// 清空其他页签得数据
if(res.map.name){
res.map.name.forEach(function(tab) {
delete row.value[tab.parentPropKey];
})
}
centerDialogVisible.value = true;
}
})
}
// 加载其他页签数据
let handleClick = (tab, event) => {
let tabName = tab.props.name;
let resId = row.value['resId'];
// 已加载
if (row.value[tabName]) {
return;
}
let id = encodeURIComponent(resId);
// 查询其他页签信息
proxy.$http.get(`/api-web/assets/configmanager/tab/detail?resId=${id}&parentKey=${tabName}`, {}, function (
res) {
if (res && res.map) {
edits.value[tabName] = false;
row.value[tabName] = res.map;
}
})
}
// 二维表格添加
let addTabDetail = (tabName) => {
tabDelete.value[tabName] = true;
// // 设置取消状态
// tabDelete.value[tabName] = false;
// 设置编辑状态
edits.value[tabName] = false;
let val = row.value[tabName];
if(val && val.map && val.data){
let rowData = val.map;
let keys = Object.keys(rowData);
let propGroup = (new Date()).getTime();
let arr = [];
keys.forEach(function (k) {
var newProp = Object.create({});
Object.assign(newProp,rowData[k]);
newProp.propGroup = propGroup;
newProp.addItem = 1;
arr.push(newProp);
});
val.data.push(arr);
}
console.log(val);
}
// 点击编辑按钮
let editConfig = (tabName) => {
edits.value[tabName] = true;
}
// 点击取消
let cancelConfig = (tabName) => {
edits.value[tabName] = false;
// 还原数据
let detail = row.value.detail[tabName];
if(detail){
// 基本信息
detail.forEach(function (v) {
var e = editKey.value[v.propKey];
if(e){
detail.propValue = e.oldValue;
detail.propValueText = e.propValueText;
e.edit = false;
}
})
}
// 二维列表信息
detail = row.value[tabName];
if(detail && detail.data){
tabDelete.value[tabName] = false;
let newArr = [];
detail.data.forEach(function (v,i) {
let addItem = detail.data[i][0].addItem;
if(addItem && addItem == 1){
//detail.data.splice(i, 1);
} else {
if(v && v.length > 0){
v.forEach(function(configItem){
var e = editKey.value[configItem.propKey];
if(e){
configItem.propValue = e.oldValue;
configItem.propValueText = e.propValueText;
e.edit = false;
}
})
newArr.push(v);
}
}
});
detail.data = newArr;
}
}
// 点击保存
let saveConfig = (tabName) => {
let resId = row.value['resId'];
let arr = [];
let detail = row.value.detail[tabName];
if(detail){
detail.forEach(function (v) {
arr.push({
resId:resId,
key:v.propKey,
val:v.propValue,
type:v.propType,
parentKey:v.parentPropKey,
parentGroup:v.propGroup,
sort:v.sort
})
});
proxy.$http.post(`/api-web/assets/configmanager/saveConfig`, arr, function (res) {
proxy.$global.showMsg('保存成功!');
editKey.value = {};
centerDialogVisible.value = false;
onSearch();
})
}
}
// 保存二维属性
let saveTabConfig = (tabName) => {
let resId = row.value['resId'];
let arr = [];
let detail = row.value[tabName];
if(detail && detail.data){
detail.data.forEach(function (v) {
if(v && v.length > 0){
v.forEach(function(configItem){
arr.push({
resId:resId,
key:configItem.propKey,
val:configItem.propValue,
type:configItem.propType,
parentKey:configItem.parentPropKey,
parentGroup:configItem.propGroup,
sort:configItem.sort
})
})
}
});
proxy.$http.post(`/api-web/assets/configmanager/saveConfig`, arr, function (res) {
proxy.$global.showMsg('保存成功!');
editKey.value = {};
centerDialogVisible.value = false;
onSearch();
})
}
}
// 二维删除新增得选项
let deleConfigItem = (list,index,tabName) =>{
let detail = row.value[tabName];
if(detail && detail.data){
detail.data.splice(index,1);
}
}
let callback = ( key, propValue,oldValue,propValueText) => {
let resId = row.value['resId'];
console.log("回调", resId, key, propValue,oldValue)
if(propValue == null || propValue == '' || propValue == oldValue){
return;
}
editKey.value[key] = {
edit:true,
val:propValue,
oldValue: oldValue,
propValueText:propValueText == undefined ? oldValue : propValueText
};
}
// 挂载完
Vue.onMounted(() => {
onSearch();
console.log('onMounted');
})
return {
loadHead,
columns,
tableList,
pageInfo,
emptyText,
resTypeArr,
machineRoom,
widths,
onSearch,
getResType,
getMachineRoom,
openDetailPage,
centerDialogVisible,
row,
checkList,
activeName,
handleClick,
edits,
editConfig,
cancelConfig,
saveConfig,
callback,
editKey,
addTabDetail,
deleConfigItem,
saveTabConfig,
tabDelete,
handleSizeChange,
initFlag,
handleCurrentChange,
height,
onBtnSearch
}
}
}
... ...
... ... @@ -19,6 +19,7 @@
<module>hg-monitor-web-base</module>
<module>hg-monitor-web-new</module>
<module>hg-monitor-web-tj</module>
<module>hg-monitor-web-zj</module>
</modules>
<properties>
<java.version>1.8</java.version>
... ... @@ -49,7 +50,7 @@
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
... ...