|
@@ -1,139 +1,114 @@
|
|
|
<template>
|
|
|
- <custom-header v-if="isExpert" name="飞鸟管家"></custom-header>
|
|
|
- <div class="home-index" :style="{ height: isExpert ? `calc(100vh - 40px)` : `calc(100vh - ${tabBarHeight}px - 50px)` }">
|
|
|
- <!-- 地图 -->
|
|
|
- <div class="map-container" ref="mapContainer"></div>
|
|
|
- <!-- 新建按钮 -->
|
|
|
- <div class="add-button" v-show="showAddButton && !isExpert" @click="toSubPage">
|
|
|
- <el-icon class="add-button-icon"><CircleCloseFilled /></el-icon>
|
|
|
- <span>创建我的农场</span>
|
|
|
- </div>
|
|
|
+ <div class="home-index" :style="{ height: `calc(100vh - ${tabBarHeight}px)` }">
|
|
|
+ <img class="banner" src="@/assets/img/home/banner.png" alt="" />
|
|
|
<!-- 天气遮罩 -->
|
|
|
<div class="weather-mask" v-show="isExpanded"></div>
|
|
|
<!-- 天气 -->
|
|
|
- <weather-info class="weather-info" @weatherExpanded="weatherExpanded"></weather-info>
|
|
|
- <!-- 操作按钮 -->
|
|
|
- <div class="operation-button">
|
|
|
- <div class="button-group">
|
|
|
- <div class="button-item" @click="toFarmInfo">
|
|
|
- <img class="button-icon" src="@/assets/img/tab_bar/home-active.png" alt="">
|
|
|
- <span>基本信息</span>
|
|
|
- </div>
|
|
|
- <div class="button-item" @click="toFarmPhoto">
|
|
|
- <img class="button-icon" src="@/assets/img/home/photo-icon.png" alt="">
|
|
|
- <span>农场相册</span>
|
|
|
+ <weather-info class="weather-info" @weatherExpanded="weatherExpanded" :isGarden="false"></weather-info>
|
|
|
+ <div class="farm-monitor-container">
|
|
|
+ <div class="farm-monitor-left" @click="handleCardClick(monitorCards.left)">
|
|
|
+ <div class="title">{{ monitorCards.left.title }}</div>
|
|
|
+ <div class="content">{{ monitorCards.left.content }}</div>
|
|
|
+ <div class="arrow">
|
|
|
+ <el-icon class="icon"><ArrowRightBold /></el-icon>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="add-farm-button" v-show="!isExpert">
|
|
|
- <el-icon class="icon"><CircleCloseFilled /></el-icon>
|
|
|
- <span>新增农场</span>
|
|
|
+ <div class="farm-monitor-right">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in monitorCards.right"
|
|
|
+ :key="index"
|
|
|
+ class="right-item"
|
|
|
+ :class="{ expert: index === 1 }"
|
|
|
+ @click="handleCardClick(item)"
|
|
|
+ >
|
|
|
+ <div class="title">
|
|
|
+ <span>{{ item.title }}</span>
|
|
|
+ <el-icon class="icon"><ArrowRightBold /></el-icon>
|
|
|
+ </div>
|
|
|
+ <div class="content">{{ item.content }}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <!-- 浮动面板 -->
|
|
|
- <home-floating-panel
|
|
|
- :isExpert="isExpert"
|
|
|
- class="home-floating-panel"
|
|
|
- :style="{ zIndex: zIndex }"
|
|
|
- @heightChange="heightChange"
|
|
|
- ></home-floating-panel>
|
|
|
- <!-- 问题提醒 -->
|
|
|
- <problem-reminder></problem-reminder>
|
|
|
- <!-- 农场信息 -->
|
|
|
- <farm-info-popup ref="farmInfoRef"></farm-info-popup>
|
|
|
+ <AgriculturalDynamics />
|
|
|
</div>
|
|
|
+ <!-- 创建农场弹窗 -->
|
|
|
+ <popup v-model:show="showFarmPopup" round class="create-farm-popup">
|
|
|
+ <template v-if="farmPopupType === 'create'">
|
|
|
+ <img class="create-farm-icon" src="@/assets/img/home/create-farm-icon.png" alt="" />
|
|
|
+ <div class="create-farm-text">
|
|
|
+ <div>您当前还没有农场</div>
|
|
|
+ <div>请先创建农场</div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <img class="farm-check-icon" src="@/assets/img/home/right.png" alt="">
|
|
|
+ <div class="create-farm-text success-text">农场创建成功</div>
|
|
|
+ </template>
|
|
|
+ <div class="create-farm-btn">{{ farmPopupType === 'create' ? '去创建农场' : '我知道了' }}</div>
|
|
|
+ </popup>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import IndexMap from "./map/index.js";
|
|
|
-import { onMounted, computed, ref } from "vue";
|
|
|
+import { ref, computed, onMounted } from "vue";
|
|
|
import { useStore } from "vuex";
|
|
|
-import { useRouter,useRoute } from "vue-router";
|
|
|
-import customHeader from "@/components/customHeader.vue";
|
|
|
+import { Popup } from "vant";
|
|
|
import weatherInfo from "@/components/weatherInfo.vue";
|
|
|
-import homeFloatingPanel from "./components/homeFloatingPanel.vue";
|
|
|
-import problemReminder from "./components/problemReminder.vue";
|
|
|
-import farmInfoPopup from "./components/farmInfoPopup.vue";
|
|
|
-const router = useRouter();
|
|
|
-const route = useRoute();
|
|
|
+import AgriculturalDynamics from "./components/AgriculturalDynamics.vue";
|
|
|
+import { useRouter } from "vue-router";
|
|
|
+
|
|
|
const store = useStore();
|
|
|
const tabBarHeight = computed(() => store.state.home.tabBarHeight);
|
|
|
-const farmInfoRef = ref(null);
|
|
|
-const indexMap = new IndexMap();
|
|
|
-const mapContainer = ref(null);
|
|
|
+const router = useRouter();
|
|
|
|
|
|
-const isExpert = ref(false);
|
|
|
-if (route.query.type) {
|
|
|
- isExpert.value = true;
|
|
|
-}
|
|
|
-onMounted(() => {
|
|
|
- const point = store.state.home.miniUserLocationPoint
|
|
|
- indexMap.initMap(point, mapContainer.value);
|
|
|
+const showFarmPopup = ref(false);
|
|
|
+const farmPopupType = ref("create");
|
|
|
+
|
|
|
+// 监测卡片数据
|
|
|
+const monitorCards = ref({
|
|
|
+ left: {
|
|
|
+ title: "农场监测",
|
|
|
+ content: "实时监测农场环境和作物生长情况",
|
|
|
+ route: "/monitor",
|
|
|
+ },
|
|
|
+ right: [
|
|
|
+ {
|
|
|
+ title: "病虫识别",
|
|
|
+ content: "智能识别病虫害,提供防治建议",
|
|
|
+ route: "/pest-recognition",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "专家咨询",
|
|
|
+ content: "专业农技专家在线解答疑问",
|
|
|
+ route: "/expert-consultation",
|
|
|
+ },
|
|
|
+ ],
|
|
|
});
|
|
|
|
|
|
+// 卡片点击事件
|
|
|
+const handleCardClick = (card) => {
|
|
|
+ router.push(card.route);
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(() => {});
|
|
|
+
|
|
|
const isExpanded = ref(false);
|
|
|
const weatherExpanded = (isExpandedValue) => {
|
|
|
isExpanded.value = isExpandedValue;
|
|
|
};
|
|
|
-
|
|
|
-const zIndex = ref(1);
|
|
|
-const showAddButton = ref(true);
|
|
|
-const heightChange = (height) => {
|
|
|
- zIndex.value = 1;
|
|
|
- showAddButton.value = true;
|
|
|
- if (height === 0) {
|
|
|
- showAddButton.value = false;
|
|
|
- } else if (height > 310 + tabBarHeight.value) {
|
|
|
- zIndex.value = 3;
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-function toSubPage() {
|
|
|
- router.push("/create_farm?isFromHome=true");
|
|
|
-}
|
|
|
-
|
|
|
-function toFarmPhoto() {
|
|
|
- router.push({
|
|
|
- path: "/farm_photo",
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function toFarmInfo() {
|
|
|
- farmInfoRef.value.handleShow();
|
|
|
-}
|
|
|
</script>
|
|
|
|
|
|
-<style lang="scss" scoped>
|
|
|
+<style scoped lang="scss">
|
|
|
.home-index {
|
|
|
- position: relative;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
- overflow: hidden;
|
|
|
- .map-container {
|
|
|
+ .banner {
|
|
|
width: 100%;
|
|
|
- height: 100%;
|
|
|
- }
|
|
|
- .add-button {
|
|
|
- position: absolute;
|
|
|
- bottom: 20px;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- z-index: 2;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- color: #fff;
|
|
|
- background-image: linear-gradient(180deg, #70bffe 0%, #2199f8 100%);
|
|
|
- border-radius: 25px;
|
|
|
- padding: 12px 0;
|
|
|
- width: 187px;
|
|
|
- .add-button-icon {
|
|
|
- font-size: 20px;
|
|
|
- margin-right: 5px;
|
|
|
- transform: rotate(45deg);
|
|
|
- }
|
|
|
+ height: 200px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
}
|
|
|
.weather-mask {
|
|
|
- position: absolute;
|
|
|
+ position: fixed;
|
|
|
top: 0;
|
|
|
left: 0;
|
|
|
width: 100%;
|
|
@@ -142,68 +117,112 @@ function toFarmInfo() {
|
|
|
z-index: 2;
|
|
|
}
|
|
|
.weather-info {
|
|
|
+ width: calc(100% - 20px);
|
|
|
position: absolute;
|
|
|
- top: 12px;
|
|
|
- left: 12px;
|
|
|
- width: calc(100% - 24px);
|
|
|
- z-index: 2;
|
|
|
+ top: calc(200px - 28px);
|
|
|
+ left: 10px;
|
|
|
+ z-index: 3;
|
|
|
}
|
|
|
- .operation-button{
|
|
|
- position: absolute;
|
|
|
- top: 117px;
|
|
|
- left: 12px;
|
|
|
- width: calc(100% - 24px);
|
|
|
- z-index: 1;
|
|
|
+ .farm-monitor-container {
|
|
|
+ padding-top: 60px;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- font-size: 12px;
|
|
|
- font-weight: 500;
|
|
|
- .button-group{
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- .button-item{
|
|
|
+ gap: 7px;
|
|
|
+ margin: 10px;
|
|
|
+ height: 170px;
|
|
|
+ .farm-monitor-left,
|
|
|
+ .farm-monitor-right {
|
|
|
+ .title {
|
|
|
+ font-size: 16px;
|
|
|
+ color: #1d2129;
|
|
|
+ font-weight: 500;
|
|
|
+ .icon {
|
|
|
+ font-size: 12px;
|
|
|
+ margin-left: 2px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .content {
|
|
|
+ margin-top: 6px;
|
|
|
+ font-size: 12px;
|
|
|
+ color: rgba(29, 33, 41, 0.5);
|
|
|
+ line-height: 1.5;
|
|
|
+ }
|
|
|
+ .arrow {
|
|
|
+ border-radius: 5px;
|
|
|
+ background: #fff;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- gap: 4px;
|
|
|
- color: rgba(0, 0, 0, 0.8);
|
|
|
- background-color: #fff;
|
|
|
- .button-icon{
|
|
|
- width: 13px;
|
|
|
- height: 13px;
|
|
|
- }
|
|
|
- }
|
|
|
- .button-item:first-child{
|
|
|
- margin-right: 10px;
|
|
|
+ width: 34px;
|
|
|
+ height: 25px;
|
|
|
+ margin-top: 10px;
|
|
|
+ font-size: 11px;
|
|
|
}
|
|
|
}
|
|
|
- .add-farm-button{
|
|
|
+ .farm-monitor-left {
|
|
|
+ flex: 1;
|
|
|
+ height: 100%;
|
|
|
+ padding: 25px 10px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: url("@/assets/img/home/farm-bg-1.png") no-repeat center center / 100% 100%;
|
|
|
+ }
|
|
|
+ .farm-monitor-right {
|
|
|
+ flex: 1;
|
|
|
+ height: 100%;
|
|
|
display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- gap: 4px;
|
|
|
- background: rgba(0, 0, 0, 0.5);
|
|
|
- border: 1px solid rgba(255, 255, 255, 0.5);
|
|
|
- color: #fff;
|
|
|
- .icon{
|
|
|
- font-size: 16px;
|
|
|
- transform: rotate(45deg);
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 7px;
|
|
|
+ .right-item {
|
|
|
+ padding: 10px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ flex: 1;
|
|
|
+ background: url("@/assets/img/home/farm-bg-2.png") no-repeat center center / 100% 100%;
|
|
|
+ }
|
|
|
+ .expert {
|
|
|
+ background: url("@/assets/img/home/farm-bg-3.png") no-repeat center center / 100% 100%;
|
|
|
}
|
|
|
}
|
|
|
- .button-item,
|
|
|
- .add-farm-button{
|
|
|
- border-radius: 25px;
|
|
|
- padding: 8px 12px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.create-farm-popup {
|
|
|
+ width: 75%;
|
|
|
+ padding: 28px 28px 20px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ .create-farm-icon{
|
|
|
+ width: 40px;
|
|
|
+ height: 40px;
|
|
|
+ margin-bottom: 12px;
|
|
|
+ }
|
|
|
+ .farm-check-icon{
|
|
|
+ width: 68px;
|
|
|
+ height: 68px;
|
|
|
+ margin-bottom: 12px;
|
|
|
+ }
|
|
|
+ .create-farm-text{
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: 500;
|
|
|
+ margin-bottom: 32px;
|
|
|
+ text-align: center;
|
|
|
+ &.success-text{
|
|
|
+ font-size: 23px;
|
|
|
+ font-weight: 400;
|
|
|
}
|
|
|
}
|
|
|
- .home-floating-panel {
|
|
|
- position: fixed;
|
|
|
- bottom: 0;
|
|
|
- left: 0;
|
|
|
+ .create-farm-btn{
|
|
|
width: 100%;
|
|
|
- z-index: 1;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 8px;
|
|
|
+ border-radius: 25px;
|
|
|
+ font-size: 16px;
|
|
|
+ background: #2199F8;
|
|
|
+ color: #fff;
|
|
|
+ text-align: center;
|
|
|
}
|
|
|
}
|
|
|
</style>
|