小区左侧与楼栋联动

master
许宏杰 4 weeks ago
parent af9ad3da30
commit 6645e98de9

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

@ -1,45 +1,46 @@
<template>
<div class="navigation-bar">
<div class="navigation-left" v-show="showLeft">
<el-badge
:value="item.title == '预警中心' ? yjTotal : ''"
class="item"
v-for="(item, index) in leftBtnList"
:key="index"
>
<el-button type="text" @click="handleSearch(item.title)">{{
item.title
}}</el-button>
</el-badge>
</div>
<div class="navigation-title">
<div class="main-title" :text="mainTitle">{{ mainTitle }}</div>
<div class="sub-title" :text="subTitle">{{ subTitle }}</div>
</div>
<div class="navigation-right" v-show="showRight">
<div class="reset"></div>
<el-button type="text">后台管理</el-button>
<el-button type="text" v-show="showStreet"></el-button>
<el-button type="text" @click="handleBack()" v-show="!showStreet"
>返回街道</el-button
<div class="navigation-bac">
<div class="navigation-bar">
<div class="navigation-left" v-show="showLeft">
<el-badge
:value="item.title == '预警中心' ? yjTotal : ''"
class="item"
v-for="(item, index) in leftBtnList"
:key="index"
>
<el-button type="text" @click="handleSearch(item.title)">{{
item.title
}}</el-button>
</el-badge>
</div>
<div class="navigation-title">
<div class="main-title" :text="mainTitle">{{ mainTitle }}</div>
<div class="sub-title" :text="subTitle">{{ subTitle }}</div>
</div>
<div class="navigation-right" v-show="showRight">
<div class="reset"></div>
<el-button type="text">后台管理</el-button>
<el-button type="text" v-show="showStreet"></el-button>
<el-button type="text" @click="handleBack()" v-show="!showStreet"
>返回街道</el-button
>
<userModel :name="name" />
</div>
<!-- 四个中心 -->
<el-dialog
:visible.sync="open"
:modal="false"
custom-class="taicang-dialog"
>
<userModel :name="name" />
<div class="dialog-main">
<div class="dialog-title"><span></span> {{ title }}</div>
<peopleCentre v-if="title == ''" />
<warningCentre v-if="title == ''" />
<recycleCentre v-if="title == ''" />
<logCentre v-if="title == ''" />
</div>
</el-dialog>
</div>
<!-- 四个中心 -->
<el-dialog
:visible.sync="open"
:modal="false"
custom-class="taicang-dialog"
>
<div class="dialog-main">
<div class="dialog-title"><span></span> {{ title }}</div>
<peopleCentre v-if="title == ''" />
<warningCentre v-if="title == ''" />
<recycleCentre v-if="title == ''" />
<logCentre v-if="title == ''" />
</div>
</el-dialog>
</div>
</template>
@ -116,12 +117,16 @@ export default {
</script>
<style lang="scss" scoped>
.navigation-bar {
.navigation-bac {
position: fixed;
top: 0;
z-index: 100;
height: 120px;
width: 100%;
}
.navigation-bar {
height: 100%;
width: 100%;
background: url("~@/assets/images/ui/navigation.png");
background-size: cover;
display: flex;

@ -25,5 +25,6 @@ const getters = {
threeCell: (state) => state.taicang.threeCell,
pie: (state) => state.taicang.pie,
queryParamsIndex: (state) => state.taicang.queryParams,
queryParamsXiaoqu: (state) => state.xiaoqu.queryParmas,
};
export default getters;

@ -37,7 +37,9 @@ const taicang = {
xiaoquIntroduce: {
intro: {
shequ: {},
kaiguo: {},
kaiguo: {
zhuzhai: {},
},
},
},
colorListL: [],

@ -1,6 +1,25 @@
const xiaoqu = {
state: {},
mutations: {},
state: {
//页面接口参数
queryParmas: {},
},
mutations: {
//参数变化
CHANGE_QUERY: (state, query) => {
for (let key in query) {
state.queryParmas[key] = query[key];
}
},
//重置参数
RESET_QUERY: (state, query) => {
state.queryParmas = {
xiaoquId: undefined, //小区
parentid: undefined, //网格
buildingid: undefined, //楼栋
deptId: undefined, //苑id
};
},
},
actions: {},
};

@ -0,0 +1,73 @@
<template>
<div class="foldPane-bottom">
<div class="panel-container">
<!-- <div class="fold-btn" @click="togglePanel()">
<img
:src="
isCollapsed
? require('@/assets/images/ui/arrow_left.jpg')
: require('@/assets/images/ui/arrow_right.jpg')
"
alt=""
/>
</div> -->
<div :class="['panel-main', { collapsed: isCollapsed }]"></div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isCollapsed: true,
};
},
methods: {
togglePanel() {
this.isCollapsed = !this.isCollapsed;
},
},
};
</script>
<style lang="scss" scoped>
.foldPane-bottom {
position: absolute;
left: 50%;
bottom: 0;
z-index: 10;
transform: translateX(-50%);
width: calc(100% - (390px * 2));
.panel-container {
position: relative;
width: 100%;
box-sizing: border-box;
.fold-btn {
cursor: pointer;
margin: auto;
transform: translateY(10px) rotate(-90deg);
height: 40px;
width: 20px;
img {
display: block;
height: 100%;
width: 100%;
}
}
.panel-main {
position: relative;
width: 100%;
height: 250px;
overflow: hidden;
transition: width 0.3s ease;
background: url("~@/assets/images/ui/panel_bottom.png");
background-size: 100% 100%;
transition: height 0.3s ease;
}
.collapsed {
height: 0;
}
}
}
</style>

@ -1,10 +1,7 @@
<template>
<div class="fold-panel">
<div class="panel-container">
<div
class="panel-main"
:class="['panel-main', { collapsed: isCollapsed }]"
>
<div :class="['panel-main', { collapsed: isCollapsed }]">
<div class="panel-box">
<introduceTitle
:title="title"
@ -69,7 +66,7 @@ export default {
height: 100%;
.fold-btn {
position: absolute;
right: -21px;
right: -20px;
top: 50%;
transform: translateY(-50%);
height: 40px;

@ -61,7 +61,7 @@ export default {
height: 100%;
.fold-btn {
position: absolute;
left: -21px;
left: -20px;
top: 50%;
transform: translateY(-50%);
height: 40px;

@ -1,5 +1,10 @@
export { default as foldpanelLeft } from "./foldpanelLeft";
export { default as foldpanelRight } from "./foldpanelRight";
export { default as foldPaneBottom } from "./foldPaneBottom";
export { default as IndexModelLeft } from "./IndexModel/left.vue";
export { default as IndexModelRight } from "./IndexModel/right.vue";
export { default as xiaoquInfo } from "./xiaoqu/leftData/xiaoquInfo";
export { default as networkInfo } from "./xiaoqu/leftData/networkInfo";
export { default as buildingStatistics } from "./xiaoqu/leftData/buildingStatistics";

@ -0,0 +1,9 @@
<template>
<div class="info-container">楼栋统计</div>
</template>
<script>
export default {};
</script>
<style></style>

@ -0,0 +1,9 @@
<template>
<div class="info-container">网格信息</div>
</template>
<script>
export default {};
</script>
<style></style>

@ -0,0 +1,248 @@
<template>
<div class="info-container">
<div>
<introduceTitle title="小区概况" />
<div class="info-box">
<div class="introduction">
{{ xiaoquIntroduce.intro.kaiguo.text | filterData }}
</div>
<div class="area-row">
<div class="area-row-item">
<div class="area-icon-name">
<img src="" alt="" />
占地面积
</div>
<div class="area-data">
<span class="unit-num">{{
xiaoquIntroduce.intro.kaiguo.zhandi || 0
}}</span>
<span class="unit-text"> 万平方米</span>
</div>
</div>
<div class="area-row-item">
<div class="area-icon-name">
<img src="" alt="" />
建筑总面积
</div>
<div class="area-data">
<span class="unit-num">{{
xiaoquIntroduce.intro.kaiguo.jianzhu || 0
}}</span>
<span class="unit-text"> 万平方米</span>
</div>
</div>
<div class="area-row-item">
<div class="area-icon-name">
<img src="" alt="" />
住宅楼
</div>
<div class="area-data">
<span class="unit-num">{{
xiaoquIntroduce.intro.kaiguo.zhuzhai.mainZ || 0
}}</span>
<span class="unit-text"> 其中多层 </span>
<span class="unit-num">{{
xiaoquIntroduce.intro.kaiguo.zhuzhai.duoc || 0
}}</span>
<span class="unit-text"> 高层 </span>
<span class="unit-num">{{
xiaoquIntroduce.intro.kaiguo.zhuzhai.gaoc || 0
}}</span>
<span class="unit-text"> </span>
</div>
</div>
</div>
</div>
</div>
<div>
<introduceTitle title="居住情况" />
<div class="info-box flex-row">
<div class="flex-row-item">
<img src="" alt="" class="row-item-icon" />
<div class="row-item-data">
<div class="row-item-name">小区总人口</div>
<div class="row-item-value">
<span class="unit-num" style="color: #00ffe4">1.8</span>
<span class="unit-text" style="color: #fff"> 万人</span>
</div>
</div>
</div>
<div class="flex-row-item">
<img src="" alt="" class="row-item-icon" />
<div class="row-item-data">
<div class="row-item-name">暂住人口</div>
<div class="row-item-value">
<span class="unit-num" style="color: #00ffe4">1.2</span>
<span class="unit-text" style="color: #fff"> 万人</span>
</div>
</div>
</div>
<div class="flex-row-item">
<img src="" alt="" class="row-item-icon" />
<div class="row-item-data">
<div class="row-item-name">常住人口</div>
<div class="row-item-value">
<span class="unit-num" style="color: #00ffe4">0.6</span>
<span class="unit-text" style="color: #fff"> 万人</span>
</div>
</div>
</div>
</div>
</div>
<div>
<introduceTitle title="物业管理" />
<div class="info-box flex-row">
<div class="describe-text">
{{ xiaoquIntroduce.intro.wuye | filterData }}
</div>
<img src="" alt="" class="describe-icon" />
</div>
</div>
<div>
<introduceTitle title="配套设施" />
<div class="info-box">
<div class="describe-text">
{{ xiaoquIntroduce.intro.peitao | filterData }}
</div>
</div>
</div>
</div>
</template>
<script>
import introduceTitle from "@/views/components/introduceTitle/subTtile.vue";
import { mapGetters } from "vuex";
export default {
data() {
return {};
},
components: {
introduceTitle,
},
computed: {
...mapGetters(["queryParamsXiaoqu", "xiaoquIntroduce"]),
},
filters: {
filterData(target) {
return target ? target : "暂无数据";
},
},
mounted() {
this.$store.dispatch("GetXiaoquInfo", this.queryParamsXiaoqu.xiaoquId); //
},
};
</script>
<style lang="scss" scoped>
.info-container {
flex: 1;
box-sizing: border-box;
padding: 15px 0;
display: flex;
flex-direction: column;
overflow: hidden;
& > div {
height: 20%;
.info-box {
padding: 0 8px;
padding-top: 8px;
height: calc(100% - 40px);
overflow-y: auto;
}
.item-flex {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.introduction {
font-size: 14px;
color: #d3e9ff;
font-weight: 400;
}
.area-row {
margin-top: 8px;
display: flex;
flex-wrap: wrap;
.area-row-item {
width: 50%;
.area-icon-name {
display: flex;
align-items: center;
font-size: 14px;
color: #ffffff;
font-weight: 500;
img {
height: 20px;
width: 20px;
margin-right: 6px;
}
}
.area-data {
margin-top: 4px;
}
}
& > :last-child {
flex: 1;
margin-top: 8px;
}
}
.flex-row {
display: flex;
align-items: center;
justify-content: space-between;
.flex-row-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.row-item-icon {
height: 60px;
width: 58px;
margin-bottom: 4px;
}
.row-item-name {
font-size: 14px;
font-weight: 500;
color: #ffffff;
}
.describe-icon {
margin-left: 8px;
width: 58px;
height: 60px;
}
}
}
& > div:first-child {
height: 27%;
}
& > div:nth-child(2) {
height: 22%;
}
& > div:nth-child(3) {
height: 15%;
}
& > div:last-child {
height: 36%;
}
.describe-text {
font-size: 14px;
color: #d3e9ff;
font-weight: 400;
overflow-y: auto;
}
.unit-num {
font-size: 18px;
color: #ffc500;
font-family: "din-bold-2.ttf";
}
.unit-text {
font-size: 12px;
color: #dddddd;
font-weight: 400;
}
}
</style>

@ -8,7 +8,8 @@
import configJson from "./map-config.json";
import garden from "./garden.json";
import MarsMap from "@/components/mars-map";
import stylus from "highlight.js/lib/languages/stylus";
import { listDept } from "@/api/system/dept.js";
import { listBuilding } from "@/api/taicangpop/building.js";
export default {
props: {
xiaoquId: {
@ -65,9 +66,9 @@ export default {
},
});
map.on(mars3d.EventType.click, function (e) {
if (!e.id) {
map.getLayerById("dth").clear(); //
}
// if (!e.id ) {
// map.getLayerById("dth").clear(); //
// }
});
},
//
@ -100,9 +101,9 @@ export default {
// this.addNetworkLayer();
this.addbuildingLayer();
this.add3DXiaoqu();
// this.add3DXiaoqu();
this.addDTH();
// this.addDTH();
},
//
addshop() {
@ -299,6 +300,14 @@ export default {
},
});
this.mapLayer.plane.addGraphic(polygon);
polygon.on(mars3d.EventType.highlightClose, function (e) {
_this.$store.commit("CHANGE_QUERY", {
buildingid: undefined,
deptId: undefined,
}); //
});
const point = new mars3d.graphic.BillboardEntity({
id: item.attr["幢号"],
position: polygon.centerPoint,
@ -328,30 +337,49 @@ export default {
},
},
attr: {
...item.attr,
...{
id: index,
yuanName: yuanName,
buildingNumber: buildingNumber,
},
id: index,
yuanName: yuanName,
buildingNumber: buildingNumber,
floorNum: item.attr["层数"],
},
});
point.on(mars3d.EventType.click, function (e) {
point.on(mars3d.EventType.click, async function (e) {
let buildingItem = _this.mapLayer.plane.getGraphicByAttr(e.id);
if (_this.mapLayer.tiles3dLayer.show) {
const geojson = buildingItem.toGeoJSON();
_this.map
.getLayerById("dth")
.loadGeoJSON(geojson, { clear: true });
} else {
buildingItem.openHighlight({
color: "#FFA200",
opacity: 0.3,
outline: true,
outlineColor: "#F5DC02",
outlineWidth: 2,
});
}
// if (_this.mapLayer.tiles3dLayer.show) {
// const geojson = buildingItem.toGeoJSON();
// _this.map
// .getLayerById("dth")
// .loadGeoJSON(geojson, { clear: true });
// } else {
// buildingItem.openHighlight({
// color: "#FFA200",
// opacity: 0.3,
// outline: true,
// outlineColor: "#F5DC02",
// outlineWidth: 2,
// });
// }
buildingItem.openHighlight({
color: "#FFA200",
opacity: 0.3,
outline: true,
outlineColor: "#F5DC02",
outlineWidth: 2,
});
let deptData = await _this.getDeptId({
xiaoquId: _this.xiaoquId,
deptName: e.target.attr.yuanName,
});
let buildingData = await _this.getBuildingId({
name: e.target.attr.buildingNumber + "幢",
deptId: deptData.deptId,
});
_this.$store.commit("CHANGE_QUERY", {
buildingid: buildingData.id,
deptId: deptData.deptId,
}); //
});
this.mapLayer.planePoint.addGraphic(point);
});
@ -418,7 +446,7 @@ export default {
this.mapLayer.planePoint.eachGraphic((graphic) => {
let attr = graphic.attr;
var centerPoint = graphic.centerPoint;
centerPoint.alt = Number(attr["层数"]) * 3 + 10;
centerPoint.alt = Number(attr.floorNum) * 3 + 10;
graphic.setOptions({
position: centerPoint,
style: {
@ -457,6 +485,17 @@ export default {
this.map.addLayer(geoJsonLayerDTH);
},
// id
async getDeptId(query) {
let res = await listDept(query);
return res.data[0];
},
//id
async getBuildingId(query) {
let res = await listBuilding(query);
return res.rows[0];
},
// handlezs() {
// // this.mapLayer.zhengsheLayer.show = true;
// this.addZhengsheLayer();

@ -4,11 +4,25 @@
:mainTitle="xiaoquIntroduce.deptName + '人口数据管理系统'"
:showStreet="false"
></NavigationBar>
<mars-map ref="map" :xiaoquId="queryParamsIndex.xiaoquId"></mars-map>
<mars-map ref="map" :xiaoquId="queryParamsXiaoqu.xiaoquId"></mars-map>
<foldpanelLeft :title="filterTitle()">
<!-- 左侧显示逻辑 1.小区简介 < 2.网格简介 < 3.楼栋统计分析 -->
<xiaoquInfo
v-if="
queryParamsXiaoqu.xiaoquId &&
!queryParamsXiaoqu.parentid &&
!queryParamsXiaoqu.buildingid
"
/>
<networkInfo
v-if="queryParamsXiaoqu.parentid && !queryParamsXiaoqu.buildingid"
/>
<buildingStatistics v-if="queryParamsXiaoqu.buildingid" />
</foldpanelLeft>
<foldpanelRight></foldpanelRight>
<foldPaneBottom></foldPaneBottom>
<div class="buttom-group">
<button @click="handle3D()"></button>
<button @click="handlezs()"></button>
</div>
</div>
</template>
@ -17,6 +31,14 @@
import { mapGetters } from "vuex";
import NavigationBar from "@/components/NavigationBar/index.vue";
import MarsMap from "@/views/components/xiaoqu/map/index.vue";
import {
foldpanelLeft,
foldpanelRight,
foldPaneBottom,
xiaoquInfo,
networkInfo,
buildingStatistics,
} from "@/views/components/index.js";
export default {
data() {
return {};
@ -24,27 +46,39 @@ export default {
components: {
MarsMap,
NavigationBar,
foldpanelLeft,
foldpanelRight,
foldPaneBottom,
xiaoquInfo,
networkInfo,
buildingStatistics,
},
computed: {
...mapGetters(["xiaoquIntroduce", "queryParamsIndex"]),
...mapGetters(["xiaoquIntroduce", "queryParamsXiaoqu"]),
},
created() {
this.$store.commit("RESET_QUERY"); //
let id = this.$route.query.xiaoquId;
this.$store.commit("CHANGE_QUERY", { xiaoquId: parseInt(id) }); //
this.$store.commit("SET_QUERY_PARAMS", {
xiaoquId: parseInt(id),
});
this.$store.dispatch("GetXiaoquInfo", id);
this.$store.dispatch("GetYjtotal", {
xiaoquId: id,
});
}); //
},
methods: {
filterTitle() {
return !this.queryParamsXiaoqu.parentid &&
!this.queryParamsXiaoqu.buildingid
? "小区简介"
: this.queryParamsXiaoqu.parentid
? "网格简介"
: "统计分析";
},
handle3D() {
this.$refs.map.handle3dPoint();
},
handlezs() {
this.$refs.map.handlezs();
},
},
};
</script>

Loading…
Cancel
Save