ylj20011123 c71b240880 update
2025-05-26 11:48:45 +08:00

1054 lines
32 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="main">
<view :class="showListPage ? 'mapBox moveLeft' : 'mapBox'" v-show="!showListPage">
<view class="topBox">
<view class="topRight">
<image class="searchIcon" src="https://eshangtech.com/wanmeiyizhanImg/home/searchIcon.png" />
<input style="margin-left: 16rpx; font-size: 28rpx" placeholder="请输入服务区" v-model="searchText"
@confirm="handleConfirm" />
<!-- <span class="searchText">请输入服务区</span> -->
</view>
<view class="listBox" @click="handleChangePageType">
<image class="listIcon" src="/static/home/listIcon.svg" />
<text class="text">列表</text>
</view>
</view>
<view style="width: 100vw; height: calc(100vh - 55px - 400rpx);position: relative;">
<map id="myMap" :longitude="longitude" :latitude="latitude" class="map" :scale="17" :show-location="true"
:markers="markers" :enable-scroll="!isDragging" @markertap="handleClickMarker"></map>
<cover-view class="statusBox" :style="{ left: showListPage ? '-2000px' : '' }">
<cover-view>
<!-- 国网 -->
<cover-view class="statusItem" style="margin: 0 16rpx;">
<!-- <image
class="statusIcon"
src="https://eshangtech.com/minTestImg/stateGridIcon.png"
/> -->
<cover-view class="colorBox" style="background-color: #ff9929"></cover-view>
<cover-view class="brandCharge">国网</cover-view>
<cover-view class="empty">空</cover-view>
<cover-view class="valueBox">
<cover-view class="emptyValue">{{
chargeData && chargeData.GWDetail
? chargeData.GWDetail.GWEmpty
: 0
}}
</cover-view>
<cover-view class="sum">/{{
chargeData && chargeData.GWDetail
? chargeData.GWDetail.GWSum
: 0
}}</cover-view>
</cover-view>
</cover-view>
<!-- 理想 -->
<cover-view class="statusItem" style="margin: 0 16rpx;">
<cover-view class="colorBox" style="background-color: #d81e06"></cover-view>
<!-- <image
class="statusIcon"
src="https://eshangtech.com/minTestImg/LXIcon.png"
/> -->
<cover-view class="brandCharge">理想</cover-view>
<cover-view class="empty">空</cover-view>
<cover-view class="valueBox">
<cover-view class="emptyValue">{{
chargeData && chargeData.LXDetail
? chargeData.LXDetail.LXEmpty
: 0
}}</cover-view>
<cover-view class="sum">/{{
chargeData && chargeData.LXDetail
? chargeData.LXDetail.LXSum
: 0
}}</cover-view>
</cover-view>
</cover-view>
<!-- 蔚来 -->
<cover-view class="statusItem">
<!-- <image
class="statusIcon"
src="https://eshangtech.com/minTestImg/WLIcon.png"
/> -->
<cover-view class="colorBox" style="background-color: #f4ea2a;margin: 0 16rpx;"></cover-view>
<cover-view class="brandCharge">蔚来</cover-view>
<cover-view class="empty">空</cover-view>
<cover-view class="valueBox">
<cover-view class="emptyValue">{{
chargeData && chargeData.WLDetail
? chargeData.WLDetail.WLEmpty
? chargeData.WLDetail.WLEmpty
: 0
: 0
}}</cover-view>
<cover-view class="sum">/{{
chargeData && chargeData.WLDetail
? chargeData.WLDetail.WLSum
? chargeData.WLDetail.WLSum
: 0
: 0
}}</cover-view>
</cover-view>
</cover-view>
<!-- 交控 -->
<cover-view class="statusItem" style="margin: 0 16rpx;">
<!-- <image
class="statusIcon"
src="https://eshangtech.com/wanmeiyizhanImg/home/sunIcon.svg"
/> -->
<cover-view class="colorBox" style="background-color: #57d16e"></cover-view>
<cover-view class="brandCharge">交控新能源</cover-view>
<cover-view class="empty">空</cover-view>
<cover-view class="valueBox">
<cover-view class="emptyValue">{{
chargeData && chargeData.JKDetail
? chargeData.JKDetail.JKEmpty
: 0
}}
</cover-view>
<cover-view class="sum">/{{
chargeData && chargeData.JKDetail
? chargeData.JKDetail.JKSum
: 0
}}</cover-view>
</cover-view>
</cover-view>
</cover-view>
</cover-view>
<!-- @allLXDataList="handleLXAddMarker"
@allJKDataList="handleJKAddMarker"
@allGWDataList="handleGWAddMarker" -->
<!-- <cover-view class="scanBox" direction="all" @change="handleChangeScanBox" :x="positionX || 16"
:y="positionY || 60" :damping="100" :friction="100" :inertia="false">
<cover-view class="scanIconBox" @click="handleScan">
<img class="scanIcon" src="/static/home/scanCodeIcon.svg" />
</cover-view>
</cover-view>
<cover-view class="localPosition" @click="handleShowLocal">
<img class="localIcon" src="/static/home/localPosition.svg" />
</cover-view> -->
</view>
<view style="display: flex;align-items: flex-start;justify-content: space-between;">
<view style="width: calc(100%- 120rpx)">
<view class="serviceDetailBox" v-if="showChargeBox">
<charge-box :serviceAreaList="currentServiceList" :pageType="'mapIndex'"
@allChargeData="handleGetChargeData" />
</view>
</view>
<view style="width: 120rpx">
<view style="margin-top: 16rpx;" class="scanBox" direction="all" @change="handleChangeScanBox"
:x="positionX || 16" :y="positionY || 60" :damping="100" :friction="100" :inertia="false">
<view class="scanIconBox" @click="handleScan">
<image class="scanIcon" src="/static/home/scanCodeIcon.svg" />
</view>
</view>
<view style="margin-top: 16rpx;" class="localPosition" @click="handleShowLocal">
<image class="localIcon" src="/static/home/localPosition.svg" />
</view>
</view>
</view>
</view>
<view :class="showListPage ? 'listPage moveRight' : 'listPage '" v-show="showListPage">
<!-- 搜索框 -->
<view class="searchBox">
<view class="topRight">
<image class="searchIcon" src="https://eshangtech.com/wanmeiyizhanImg/home/searchIcon.png" />
<input style="margin-left: 16rpx; font-size: 28rpx" placeholder="请输入服务区" v-model="searchText"
@confirm="handleConfirm" />
<!-- <span class="searchText">请输入服务区</span> -->
</view>
<view class="listBox" @click="handleChangePageType">
<image class="listIcon" src="/static/home/mapFixed.svg" />
<text class="text">地图</text>
</view>
</view>
<scroll-view class="scrollListBox" :scroll-y="true" @scrolltolower="handleScrollToBottom">
<view v-if="showChargeList">
<charge-box ref="chargeBoxRef" :serviceAreaList="allServiceNameList" :pageStyleType="1"
:pageType="'mapList'" />
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import { mapGetters } from "vuex";
import ChargeBox from "../../components/chargeBox.vue";
let systemInfo = uni.getSystemInfoSync();
export default {
components: { ChargeBox },
data() {
return {
longitude: "",
latitude: "",
seatInfo: {}, // 经纬度数据
currentServiceObj: {}, // 当前选择的服务区
currentServiceList: [], // 当前服务区的名称数组
allServiceNameList: [], // 全部服务区的名字列表
defaultAllServiceNameList: [], // 所有服务区的名称列表
chargeData: {}, // 理想的数据
markers: [], // 点位数据
serviceList: [], // 所有服务区的数据
searchText: "", // 搜索的内容
showChargeBox: true,
showChargeList: true,
showListPage: false, // 是否显示列表页面
isTouchMove: false, // 用于判断是否开始拖动
loginType: "",
menu: {},
startX: 0, // 拖动开始时的 X 坐标
startY: 0, // 拖动开始时的 Y 坐标
positionX: systemInfo.safeArea.width - 130, // 元素当前的 X 坐标
positionY: 140, // 元素当前的 Y 坐标
isDragging: false, // 是否正在拖动
screenWidth: 0, // 屏幕宽度
screenHeight: 0, // 屏幕高度
lastMoveTime: 0, // 上次移动的时间戳,用于节流
lastMoveTime: 0, // 上次移动的时间戳,用于节流
pageIndex: 1,
isHaveMore: false,
isShowAllData: true, // 判断是否点击了服务区 没有点击 就显示全部的数据 点击了 就显示单个服务区的具体每个品牌的数据
};
},
onLoad() {
let systemInfo = uni.getSystemInfoSync();
// this.positionX = systemInfo.safeArea.width - 66;
this.screenWidth = systemInfo.safeArea.width;
this.screenHeight = systemInfo.safeArea.height;
let storgeList = uni.getStorageSync("serviceList");
if (storgeList) {
this.serviceList = JSON.parse(storgeList);
this.handleAddServiceMarkers();
}
let nearService = uni.getStorageSync("nearService");
let seatInfo = uni.getStorageSync("seatInfo");
if (seatInfo) {
let res = seatInfo;
this.seatInfo = {
longitude: res.longitude,
latitude: res.latitude,
};
this.longitude = this.seatInfo.longitude;
this.latitude = this.seatInfo.latitude;
// this.longitude = 116.894166;
// this.latitude = 31.920213;
// this.currentServiceList = ["新桥服务区"];
// 全部服务区的名称
this.handleGetServiceNameList();
}
if (nearService) {
this.currentServiceObj = nearService;
this.currentServiceList = [nearService.SERVERPART_NAME];
}
this.$utils.addUserBehaviorNew();
},
computed: {
...mapGetters({
user: "user",
}),
},
methods: {
// 显示自己的定位
handleShowLocal() {
let seatInfo = uni.getStorageSync("seatInfo");
if (seatInfo) {
// let res = JSON.parse(seatInfo);
let res = seatInfo
this.seatInfo = {
longitude: Number(res.longitude),
latitude: Number(res.latitude),
};
this.longitude = this.seatInfo.longitude;
this.latitude = this.seatInfo.latitude;
let _this = this
setTimeout(() => {
uni.createMapContext("myMap", this).moveToLocation({
longitude: _this.longitude,
latitude: _this.latitude,
});
}, 300); // 300ms 延迟
}
this.$forceUpdate();
},
// 给服务区添加点位
handleAddServiceMarkers() {
let list = [];
if (this.serviceList && this.serviceList.length > 0) {
this.serviceList.forEach((item) => {
list.push({
id: Number(`${item.SERVERPART_ID}`), // 使用时间戳作为唯一ID
serviceId: item.SERVERPART_ID,
serviceName: `${item.SERVERPART_NAME}`,
latitude: item.SERVERPART_Y,
longitude: item.SERVERPART_X,
iconPath: "/static/home/redFixed.svg",
width: 30,
height: 30,
});
});
}
this.markers = list;
},
handleChangeScanBox(e) {
this.positionX = e.target.offsetLeft;
this.positionY = e.target.offsetTop;
},
touchStart(e) {
this.isDragging = true;
const touch = e.touches[0];
this.startX = touch.clientX - this.positionX;
this.startY = touch.clientY - this.positionY;
},
touchMove(e) {
if (!this.isDragging) return;
// 使用时间戳进行节流每16ms约60fps更新一次位置
const touch = e.touches[0];
let newPosX = touch.clientX - this.startX;
let newPosY = touch.clientY - this.startY;
// 限制拖动范围,不让元素移出屏幕
newPosX = Math.max(0, Math.min(newPosX, this.screenWidth - 50)); // 限制 X 轴范围
newPosY = Math.max(0, Math.min(newPosY, this.screenHeight - 50)); // 限制 Y 轴范围
this.positionX = newPosX;
this.positionY = newPosY;
},
touchEnd(e) {
this.isDragging = false;
},
// 取问号后面的参数
getQueryParams(url) {
let queryStr = url.split("?")[1]; // 获取 ? 后面的部分
let params = {};
if (queryStr) {
let pairs = queryStr.split("&");
pairs.forEach((pair) => {
let [key, value] = pair.split("=");
params[key] = decodeURIComponent(value || "");
});
}
return params;
},
// 扫码
handleScan() {
let _this = this;
uni.scanCode({
success: function (res) {
console.log('res', res);
let url = res.result;
if (url.indexOf("lixiang") !== -1) {
let obj = _this.getQueryParams(url);
uni.showModal({
title: "",
content: `识别二维码类型为【理想】,确认跳转?`,
success(res) {
let str = url
console.log('strstrstrstr', url);
//"https://www.lixiang.com/business/charge/start?channelCode=169006&devType=hpc&qrcode=81003867"
plus.runtime.openURL('http://saas.eshangtech.com/openWxLx.html?' + str.split('?')[1]);
// uni.navigateToMiniProgram({
// appId: "wxefd5d8119561aaca",
// path: `/pages/electricity/pile/index?connectorId=${obj.qrcode}`,
// success(res) {
// plus.runtime.openURL('http://saas.eshangtech.com/openWxLx.html');
// },
// });
},
});
} else if (url.indexOf("jksdxny") !== -1) {
// 交控
uni.showModal({
title: "",
content: `识别二维码类型为【交控新能源】,确认跳转?`,
success(res) {
plus.runtime.openURL('http://saas.eshangtech.com/openWxJK.html');
// uni.navigateToMiniProgram({
// appId: "wx01617ba079061ca9",
// path: `/pages/map/index`,
// success(res) { },
// });
},
});
} else if (url.indexOf("app.nio") !== -1) {
// 蔚来
uni.showModal({
title: "",
content: `识别二维码类型为【蔚来】,确认跳转?`,
success(res) {
plus.runtime.openURL('http://saas.eshangtech.com/openWxWL.html');
// uni.navigateToMiniProgram({
// appId: "wx35849c7f0cf7f7a9",
// path: `/pages/index/index`,
// success(res) { },
// });
},
});
} else if (url.indexOf("hlht://") !== -1) {
// 国网
uni.showModal({
title: "",
content: `识别二维码类型为【国网】,确认跳转?`,
success(res) {
// plus.runtime.openURL(`https://dipper.in.ah.cn/wsth5/#/${_this.user.MEMBERSHIP_MOBILEPHONE}`);
uni.navigateTo({
url: `/pages/thirdParty/chargAndSwapp`,
});
// uni.navigateToMiniProgram({
// appId: "wx35849c7f0cf7f7a9",
// path: `/pages/index/index`,
// success(res) { },
// });
},
});
}
},
});
},
// 拿到全部服务区的名称
handleGetServiceNameList() {
let name = [];
if (this.serviceList && this.serviceList.length > 0) {
this.serviceList.forEach((item) => {
name.push(item.SERVERPART_NAME);
});
}
let res = JSON.parse(JSON.stringify(name));
this.defaultAllServiceNameList = res;
this.allServiceNameList = name.splice(0, this.pageIndex * 10 - 1);
},
// 滚动到底部
async handleScrollToBottom() {
if (this.isHaveMore) {
return;
}
this.isHaveMore = true;
this.pageIndex = this.pageIndex += 1;
let res = JSON.parse(JSON.stringify(this.defaultAllServiceNameList));
this.allServiceNameList = res.splice(0, this.pageIndex * 10 - 1);
await this.$refs.chargeBoxRef.handldGetData();
this.isHaveMore = false;
this.$forceUpdate();
},
// 改变页面显示的内容
handleChangePageType() {
this.showListPage = !this.showListPage;
},
// 搜索服务区的方法
async handleConfirm() {
if (this.showListPage) {
this.showChargeList = false;
} else {
this.showChargeBox = false;
}
this.chaegeBoxList = [];
let req = {
// longitude: this.longitude,
Province_Code: "340000",
longitude: this.seatInfo.longitude,
latitude: this.seatInfo.latitude,
Serverpart_Name: this.searchText,
ShowService: true,
};
// const data = await this.$api.$get(
// "/CommercialApi/BaseInfo/GetServerpartList",
// req
// );
let data = await this.$api.$javaGet2('/third-party/getServerPartList', req)
let list = data.Result_Data.List;
this.pageIndex = 1;
let obj = list[0];
if (this.showListPage) {
this.showChargeList = true;
if (this.searchText) {
this.allServiceNameList = [obj.SERVERPART_NAME];
} else {
this.handleGetServiceNameList();
}
} else {
this.seatInfo = {
longitude: obj.SERVERPART_X,
latitude: obj.SERVERPART_Y,
};
this.longitude = this.seatInfo.longitude;
this.latitude = this.seatInfo.latitude;
this.currentServiceObj = obj;
this.currentServiceList = [obj.SERVERPART_NAME];
this.showChargeBox = true;
}
this.searchText = "";
},
// 给理想的充电站标点
handleLXAddMarker(e) {
let stationList = e.res;
let pointList = [];
// 确保一个服务区点位 只用加一个
let pointIdList = [];
if (this.serviceList && this.serviceList.length > 0) {
this.serviceList.forEach((item) => {
if (stationList && stationList.length > 0) {
stationList.forEach((subItem) => {
if (subItem.Address.indexOf(item.SERVERPART_NAME) !== -1) {
const date = new Date();
if (
pointIdList.indexOf(Number(`1${item.SERVERPART_ID}`)) === -1
) {
pointIdList.push(Number(`1${item.SERVERPART_ID}`));
pointList.push({
id: Number(`1${item.SERVERPART_ID}`), // 使用时间戳作为唯一ID
markerId: `${item.SERVERPART_ID}LX`,
serviceId: item.SERVERPART_ID,
serviceName: `${item.SERVERPART_NAME}`,
latitude: subItem.StationLat,
longitude: subItem.StationLng,
iconPath: "/static/home/redFixed.svg",
width: 30,
height: 30,
// label: {
// // 文本标签
// content: "",
// color: "#3EC273",
// fontSize: 14,
// bgColor: "#ffffff",
// borderRadius: 4,
// padding: 5,
// textAlign: "center",
// },
});
}
}
});
}
});
}
this.markers = this.markers.concat(pointList);
},
// 给交控的充电站标点
handleJKAddMarker(e) {
let stationList = e.res;
let pointList = [];
// 确保一个服务区点位 只用加一个
let pointIdList = [];
if (this.serviceList && this.serviceList.length > 0) {
this.serviceList.forEach((item) => {
if (stationList && stationList.length > 0) {
stationList.forEach((subItem) => {
if (subItem.areaName.indexOf(item.SERVERPART_NAME) !== -1) {
const date = new Date();
if (
pointIdList.indexOf(Number(`2${item.SERVERPART_ID}`)) === -1
) {
pointIdList.push(Number(`2${item.SERVERPART_ID}`));
pointList.push({
id: Number(`2${item.SERVERPART_ID}`), // 使用时间戳作为唯一ID
markerId: `${item.SERVERPART_ID}JK`,
serviceId: item.SERVERPART_ID,
serviceName: `${item.SERVERPART_NAME}`,
latitude: subItem.lat,
longitude: subItem.lng,
iconPath: "/static/home/greenFixed.svg",
width: 30,
height: 30,
});
}
}
});
}
});
}
this.markers = this.markers.concat(pointList);
},
// 给国网的充电站标点
handleGWAddMarker(e) {
let stationList = e.res.data.Data.StationInfos;
let pointList = [];
// 确保一个服务区点位 只用加一个
let pointIdList = [];
if (this.serviceList && this.serviceList.length > 0) {
this.serviceList.forEach((item) => {
if (stationList && stationList.length > 0) {
stationList.forEach((subItem) => {
if (subItem.Address.indexOf(item.SERVERPART_NAME) !== -1) {
if (
pointIdList.indexOf(Number(`3${item.SERVERPART_ID}`)) === -1
) {
pointIdList.push(Number(`3${item.SERVERPART_ID}`));
pointList.push({
id: Number(`3${item.SERVERPART_ID}`), // 使用时间戳作为唯一ID
markerId: `${item.SERVERPART_ID}GW`,
serviceId: item.SERVERPART_ID,
serviceName: `${item.SERVERPART_NAME}`,
latitude: subItem.StationLat,
longitude: subItem.StationLng,
iconPath: "/static/home/orangeFixed.svg",
width: 30,
height: 30,
});
}
}
});
}
});
}
this.markers = this.markers.concat(pointList);
},
// 拿到当前服务区的充电数据
handleGetChargeData(e) {
let obj = e.res[0];
// 因为只返回一个服务区 所以直接e[0]就可以拿到服务区数据
this.chargeData = obj;
// this.markers = [
// {
// id: Number(obj.ServerPart_Id), // 使用时间戳作为唯一ID
// latitude: obj.SERVERPART_Y,
// longitude: obj.SERVERPART_X,
// width: 20,
// height: 30,
// label: {
// // 文本标签
// content: obj.name,
// color: "#3EC273",
// fontSize: 14,
// bgColor: "#ffffff",
// borderRadius: 4,
// padding: 5,
// textAlign: "center",
// },
// },
// ];
},
// 点击地图上的锚点
handleClickMarker(e) {
const clickedMarker = this.markers.find(
(item) => item.id === e.detail.markerId // 用小程序返回的id匹配
);
this.showChargeBox = false;
const serviceDetail = this.serviceList.find(
(item) => item.SERVERPART_ID === Number(clickedMarker.serviceId) // 用小程序返回的id匹配
);
this.longitude = this.longitude;
this.latitude = this.latitude;
this.currentServiceObj = serviceDetail;
this.currentServiceList = [clickedMarker.serviceName];
let _this = this;
setTimeout(() => {
_this.showChargeBox = true;
}, 500);
},
},
};
</script>
<style scoped lang="less">
.main {
width: 100vw;
height: 100vh;
overflow: hidden;
background: #f8f8f8;
.mapBox {
width: 100vw;
height: 100vh;
transition: transform 0.5s ease;
.map {
width: 100%;
height: 100%;
// height: calc(100vh - 55px - 300rpx);
position: absolute;
top: 0;
left: 0;
z-index: 1;
}
.topBox {
width: 100%;
height: 55px;
z-index: 2;
box-sizing: border-box;
padding: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
.topRight {
width: calc(100% - 240rpx);
height: 72rpx;
background: #fff;
border-radius: 36rpx;
box-sizing: border-box;
padding: 16rpx 20rpx;
display: flex;
align-items: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
.searchIcon {
width: 32rpx;
height: 32rpx;
}
.searchText {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 28rpx;
color: #9fa1aa;
line-height: 40rpx;
text-align: left;
font-style: normal;
margin-left: 8rpx;
}
}
.listBox {
width: 180rpx;
height: 72rpx;
background: #fff;
border-radius: 36rpx;
box-sizing: border-box;
padding: 16rpx 20rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
.listIcon {
width: 40rpx;
height: 40rpx;
margin-right: 12rpx;
}
.text {
font-family: "PingFangSC";
font-weight: 400;
font-size: 30rpx;
color: #130f05;
line-height: 36rpx;
text-align: justify;
font-style: normal;
}
}
}
.statusBox {
box-sizing: border-box;
padding: 16rpx;
border-radius: 16rpx;
background: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
position: absolute;
top: 40rpx;
right: 16rpx;
z-index: 2;
.statusItem {
display: flex;
align-items: center;
padding: 8rpx 0;
.colorBox {
width: 18rpx;
height: 18rpx;
border-radius: 50%;
overflow: hidden;
margin-right: 16rpx;
}
.statusIcon {
width: 40rpx;
height: 40rpx;
border-radius: 50%;
overflow: hidden;
margin-right: 16rpx;
}
.brandCharge {
font-family: "PingFang SC", "Noto Sans CJK SC", "Microsoft YaHei",
sans-serif;
font-weight: 400;
font-size: 24rpx;
color: #130f05;
line-height: 40rpx;
font-style: normal;
display: inline-block;
width: 120rpx;
margin-right: 16rpx;
}
.empty {
font-family: "PingFangSC";
font-weight: 400;
font-size: 24rpx;
color: #130f05;
line-height: 36rpx;
text-align: left;
font-style: normal;
margin-right: 4rpx;
}
.valueBox {
display: flex;
justify-content: flex-end;
width: 100rpx;
.emptyValue {
font-family: "DINAlternate";
font-weight: 400;
font-size: 28rpx;
color: #130f05;
line-height: 36rpx;
text-align: left;
font-style: normal;
margin-right: 4rpx;
}
.sum {
font-family: "DINAlternate";
font-weight: 400;
font-size: 28rpx;
color: #716f69;
line-height: 36rpx;
text-align: left;
font-style: normal;
}
}
}
}
.localPosition {
width: 100rpx;
height: 100rpx;
box-sizing: border-box;
padding: 16rpx;
border-radius: 16rpx;
background: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
// position: absolute;
display: flex;
justify-content: center;
align-items: center;
// top: 280rpx;
// right: 16rpx;
z-index: 1;
.localIcon {
width: 60rpx;
height: 60rpx;
}
}
.serviceDetailBox {
width: 100%;
// width: calc(100% - 80rpx);
height: 450rpx;
box-sizing: border-box;
padding: 16rpx;
border-radius: 16rpx;
background: #fff;
box-sizing: border-box;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
.scanBox {
// width: 100%;
width: 100rpx;
height: 100rpx;
// height: 100rpx;
display: flex;
justify-content: center;
align-items: center;
// position: absolute;
// top: 280rpx;
// right: 160rpx;
// bottom: 40rpx;
// top: 0;
// left: 0;
// left: 0;
z-index: 1;
.scanIconBox {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
background: #ba922f;
display: flex;
justify-content: center;
align-items: center;
position: relative;
.scanIcon {
width: 80rpx;
height: 80rpx;
}
.scanBox {
position: absolute;
width: 40rpx;
height: 40rpx;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: #ba922f;
overflow: hidden;
.line {
position: absolute;
width: 37rpx;
height: 4rpx;
background: #fff;
animation: moveUpDown 2s linear infinite;
}
@keyframes moveUpDown {
0% {
top: 8rpx;
}
50% {
top: calc(100% - 12rpx);
/* 40rpx(容器高度) - 4rpx(线条高度) */
}
100% {
top: 8rpx;
}
}
}
}
}
}
.moveLeft {
transform: translateX(-100%);
}
.listPage {
width: 100%;
height: 100vh;
position: absolute;
top: 0;
left: 100%;
transition: transform 0.5s ease;
box-sizing: border-box;
padding: 16rpx;
z-index: 2;
background-color: #fff;
.searchBox {
width: 100%;
height: 72rpx;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
.topRight {
width: calc(100% - 240rpx);
height: 72rpx;
background: #fff;
border-radius: 36rpx;
box-sizing: border-box;
padding: 16rpx 20rpx;
display: flex;
align-items: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
.searchIcon {
width: 32rpx;
height: 32rpx;
}
.searchText {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 28rpx;
color: #9fa1aa;
line-height: 40rpx;
text-align: left;
font-style: normal;
margin-left: 8rpx;
}
}
.listBox {
width: 180rpx;
height: 72rpx;
// background: #fff;
background-image: url("https://eshangtech.com/minTestImg/mapBg.png");
background-repeat: no-repeat;
background-size: 100% 100%;
border-radius: 36rpx;
box-sizing: border-box;
padding: 16rpx 20rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
.listIcon {
width: 40rpx;
height: 40rpx;
margin-right: 12rpx;
}
.text {
font-family: "PingFangSC";
font-weight: 400;
font-size: 30rpx;
color: #130f05;
line-height: 36rpx;
text-align: justify;
font-style: normal;
}
}
}
.scrollListBox {
width: 100%;
height: calc(100% - 100rpx);
margin-top: 16rpx;
}
}
.moveRight {
transform: translateX(-100%);
}
}
</style>