From 8e5fb21a2bf621291c1ceee396c01e3d42553511 Mon Sep 17 00:00:00 2001 From: web <candymxq888@outlook.com> Date: 星期四, 03 七月 2025 17:23:23 +0800 Subject: [PATCH] 修改首页,添加记录 --- pages/device/index.vue | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 202 insertions(+), 12 deletions(-) diff --git a/pages/device/index.vue b/pages/device/index.vue index 75b83c5..52aab37 100644 --- a/pages/device/index.vue +++ b/pages/device/index.vue @@ -1,33 +1,223 @@ <template> <view class="device"> <Navbar title="设备列表"></Navbar> + <view class="content"> + <view class="list"> + <block v-for="(item,index) in facitilyList" :key="index"> + <view class="item"> + <view class="item-img"> + <image v-if="item.facilityUrl" :src="BASE_URL + '/upload' + item.facilityUrl" alt='' mode="aspectFit"></image> + <image v-else src="../../static/images/facilityImg.svg" alt='' mode="aspectFit"></image> + </view> + <view class="item-info"> + <view class="info-name"> + <view class="name">{{item.facilityName}}</view> + <view class="btn" @click="handleQushui(item.id)">取水</view> + </view> + <view class="info-addr" @click="openMap(item.lat,item.lon)"> + <text class="addr-text">地址:{{item.address}}</text> + <view> + <image src="../../static/images/icon-point.svg" alt=''></image> + <text>{{item.distanceValue}}km</text> + </view> + </view> + </view> + </view> + </block> + </view> + </view> + <uni-popup ref="qushuiDialog" type="dialog"> + <uni-popup-dialog type="info" cancelText="取消" confirmText="确认" title="请输入取水量" + @confirm="dialogConfirm" + @close="dialogClose" + > + <view> + <input v-model="qushuiNum" placeholder="请输入取水量(L)" /> + </view> + </uni-popup-dialog> + </uni-popup> </view> </template> <script setup> import{ ref, onMounted } from 'vue' import Navbar from '../../components/navbar/navbar.vue' + import { getFacitily } from '@/api/index.js' + import { BASE_URL } from '../../config/index.js' const userLocation = ref() + const facitilyList = ref([]) + const qushuiDialog = ref() + const facitilyId = ref() + const qushuiNum = ref() + const getFacitilyList = () => { + const data = { + longitude: userLocation.value?.lon, + latitude: userLocation.value?.lat, + limit: 100, + page: 1 + } + getFacitily(data).then(res => { + if(res.code === 200) { + facitilyList.value = res.data.list + } + }) + } - // 根据经纬度计算距离,根据经纬度计算距离,参数分别为第一点的纬度,经度(用户);第二点的纬度,经度(设备) - const getDistances = (lat1, lon1, lat2, lon2) => { - let EARTH_RADIUS = 6378.137;// 地球半径 - let radLat1 = lat1 * Math.PI / 180.0; //lat1 * Math.PI / 180.0=>弧度计算 - let radLat2 = lat2 * Math.PI / 180.0; - let a = radLat1 - radLat2; - let b = lon1 * Math.PI / 180.0 - lon2 * Math.PI / 180.0; - let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); - s = s * EARTH_RADIUS; - s = Math.round(s * 10000) / 10000;// 输出为公里 - return { m: s * 1000, km: Number(s.toFixed(2)) } + // 取水 + const handleQushui = (id) => { + facitilyId.value = id + qushuiDialog.value.open() + } + + // 取消 + const dialogClose = () => { + facitilyId.value = '' + qushuiNum.value = '' + } + + // 确认 + const dialogConfirm = () => { + + } + + //打开地图导航 + const openMap = (lat,lon) => { + uni.openLocation({ + latitude: parseFloat(lat), + longitude: parseFloat(lon), + scale:18 + }) + } + + //获取用户位置并存储 + const storageLocation = () => { + uni.getLocation({ + type:'gcj02', + isHighAccuracy:true, + success:(res) =>{ + userLocation.value = { + lat: res.latitude, + lon: res.longitude + } + uni.setStorageSync('userLocation',JSON.stringify(userLocation.value)) + }, + fail:(err) =>{ + locationToast() + } + }) + } + //用户拒绝授权 + const locationToast = () => { + uni.showModal({ + title: "请求授权当前位置", + content: "请求获取您的位置,加载附近饮水设备信息!", + confirmText: "前往设置", + success: (res) => { + if (res.confirm) { + uni.openSetting({ + success:(res1) =>{ //打开设置成功 + if (res1.authSetting['scope.userLocation']){ + setTimeout(() =>{ + storageLocation() + },1000) + } + }, + }) + }else{ + uni.showToast({ + title: '请先授权!', + duration: 2000, + icon:'none' + }); + } + }, + }); } onMounted(() => { - userLocation.value = JSON.parse(uni.getStorageSync('userLocation')) + const location = uni.getStorageSync('userLocation') + if(location) { + userLocation.value = JSON.parse(location) + getFacitilyList() + }else{ + locationToast() + } }) </script> <style lang="scss" scoped> + .content{ + width: 100%; + height:calc(100vh - 176rpx); + background:linear-gradient(to top,#FFFFFF,#E8EFFF); + padding:32rpx 32rpx 100rpx; + box-sizing: border-box; + .list{ + width:100%; + height:100%; + overflow: scroll; + // background-color: #f1ffef; + .item{ + height:200rpx; + width:100%; + background-color: #FFFFFF; + border-radius: 24rpx; + padding:0 20rpx; + margin-bottom:20rpx; + box-sizing: border-box; + display: flex; + align-items:center; + .item-img{ + image{ + width:130rpx; + height: 130rpx; + } + } + .item-info{ + display: flex; + flex-direction: column; + margin-left:20rpx; + justify-content: space-between; + .info-name{ + color:#222c35; + display: flex; + justify-content: space-between; + align-items: center; + .btn{ + padding: 10rpx 20rpx; + background-color: $uni-primary; + border-radius: 10rpx; + color: #fff; + } + } + .info-addr{ + display: flex; + justify-content: space-between; + align-items:center; + .addr-text{ + width:340rpx; + height:80rpx; + color: #6a6e75; + font-size:26rpx; + } + view{ + display: flex; + justify-content: space-between; + align-items:center; + image{ + width:50rpx; + height:50rpx; + } + text{ + color: #6a6e75; + font-size:26rpx; + } + } + } + } + } + } + } </style> \ No newline at end of file -- Gitblit v1.9.3