kaiguan-zfb/pages/shouye/index.vue
2024-06-05 18:07:50 +08:00

817 lines
18 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="page">
<!-- 用户首页显示 -->
<view class="useryonghu">
<u-navbar :is-back="false" title="首页" :border-bottom="false" :background="bgc" title-color='#fff'
title-size='44' height='50'></u-navbar>
<view class="ditu">
<view class="dtxs">
<map class='map' id="map" :latitude="latitude" :longitude="longitude" @markertap="handleMarkerClick"
:show-location="true" :markers="covers" :scale="mapScale" />
</view>
<view class="fujin">
<image src="https://api.ccttiot.com/smartmeter/img/static/uqv3e5ThWL8DqrRNBfoA" mode=""
@click="btnindex(5)"></image>
<image src="https://api.ccttiot.com/smartmeter/img/static/u7yxUJZqgPzESeI4tmiz" mode=""
@click="btnindex(6)" v-if="isMch"></image>
<image @click="onControltap" style="width: 76rpx;height: 76rpx;position: absolute;right: 40rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/uOS9p7Sy1K9WpVQgD3b9" mode=""></image>
</view>
<view class="tubiao">
<view class="gr" @click="btnindex(1)">
<image src="https://api.ccttiot.com/smartmeter/img/static/uJBKoGWpRH2lM1NpQU0I" mode=""
style="width: 96rpx;height:98rpx;"></image>
<!-- 个人中心 -->
</view>
<view class="gr" @click="btnindex(2)">
<image src="https://api.ccttiot.com/smartmeter/img/static/u8rWtdPtHabALkII23Zr" mode=""
style="width: 96rpx;height:102rpx;"></image>
<!-- 我的订单 -->
</view>
<view class="gr" @click="btnindex(3)">
<image src="https://api.ccttiot.com/smartmeter/img/static/uphoDfOVnT6VEyj6glfF" mode=""
style="width: 96rpx;height:98rpx;"></image>
<!-- 附近门店 -->
</view>
<view class="gr" @click="btnindex(4)">
<image src="https://api.ccttiot.com/smartmeter/img/static/uBN46m7mPVlbbPth80FC" mode=""
style="width: 96rpx;height:94rpx;"></image>
<!-- 联系客服 -->
</view>
</view>
<view class="guangg" @click="btnad">
<image :src="imgad" mode=""></image>
</view>
<view class="saoma" @click="scanQRCode">
<view>
<image src="https://api.ccttiot.com/smartmeter/img/static/uBh15vzRx6gV0wRQj7gi" mode=""></image>
扫一扫
</view>
</view>
</view>
<view class="tip_box" v-if="czflag">
<view class="top">
<view class="txt">
系统检测到您的设备未联网或者为蓝牙版本,金额充值失败,请靠近设备进行蓝牙充值
</view>
</view>
<view class="bot">
<view class="bot_left" @click="czflag = false">
取消
</view>
<view class="bot_right" @click="tocz()">
蓝牙充值
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
params: {
year: true,
month: true,
day: true,
hour: false,
minute: false,
second: false
},
dateindex: 1,
latitude: '', // 初始纬度
longitude: '', // 初始经度
covers: [], // 覆盖物数组
jinweidu: '',
userType: '',
isMch: false,
imgad: '',
listmap: [],
mapScale: 15,
czflag: false,
datetime: 0,
dingobj: '',
mapContext: null,
mapScaleInterval: null,
bgc: {
backgroundColor: "#8883F0",
},
};
},
onLoad() {
// this.initOtherCovers(); // 初始化其他覆盖物
},
onShow() {
this.logins();
this.getad()
this.gethuidaio()
},
onReady() {
this.mapContext = uni.createMapContext('map', this);
this.mapScaleInterval = setInterval(this.updateMarkers, 1000);
},
beforeDestroy() {
// 在组件卸载前清除定时器
if (this.mapScaleInterval) {
clearInterval(this.mapScaleInterval);
this.mapScaleInterval = null;
}
},
methods: {
btnad() {
this.$u.get("/app/ad").then((res) => {
if (res.code == 200) {
if (res.data.urlType == 1) {
uni.navigateTo({
url: '/page_fenbao/webview?url=' + res.data.url
})
} else {
uni.navigateTo({
url: res.data.url
})
}
}
})
},
updateMarkers() {
this.mapContext.getScale({
success: (res) => {
this.covers = [];
if (res.scale <= 14) {
this.addMarkersWithoutLabels();
} else {
this.addMarkersWithLabels();
}
},
fail: (error) => {
// console.error('获取地图缩放级别失败:', error);
},
});
},
addMarkersWithoutLabels() {
this.listmap.forEach((item) => {
const shopCover = {
id: parseFloat(item.storeId),
latitude: item.lat,
longitude: item.lng,
width: 25,
height: 30,
iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uZXgsJE6hXbRSwbKILB4',
};
this.covers.push(shopCover);
});
},
addMarkersWithLabels() {
this.listmap.forEach((item) => {
const shopCover = {
id: parseFloat(item.storeId),
latitude: item.lat,
longitude: item.lng,
width: 25,
height: 30,
iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uZXgsJE6hXbRSwbKILB4',
label: {
content: item.name,
anchorX: this.calculateAnchorX(item.name),
fontWeight: 700,
color: '#8883F0',
textShadow: '2px 2px 0px #000, -2px -2px 0px #000, 2px -2px 0px #000, -2px 2px 0px #000',
rotate: 20
}
}
this.covers.push(shopCover);
});
},
calculateAnchorX(name) {
let chineseLength = 0;
let englishLength = 0;
for (let i = 0; i < name.length; i++) {
const charCode = name.charCodeAt(i);
if (charCode >= 0x4e00 && charCode <= 0x9fa5) {
chineseLength++;
} else if (/[a-zA-Z]/.test(name[i])) {
englishLength = englishLength + 0.3; // 英文长度加1但视为两个中文字符长度
// console.log(englishLength);
}
}
const totalLength = chineseLength + englishLength * 2;
return -totalLength * 6.5; // 假设每个中文字符对应的 anchorX 偏移是 -7
},
scanQRCode() {
uni.scanCode({
onlyFromCamera: true,
scanType: ['qrCode'],
success: res => {
function getQueryParam(url, paramName) {
let regex = new RegExp(`[?&]${paramName}=([^&]*)`);
let results = regex.exec(url);
return results ? decodeURIComponent(results[1].replace(/\+/g, ' ')) : null;
}
let sceneValue = res.result
let decodedValue = decodeURIComponent(sceneValue);
let id = getQueryParam(decodedValue, 's')
console.log(res, id);
this.$u.get(`/app/device/${id}/withSuitList`).then((res) => {
if (res.code == 200) {
uni.navigateTo({
url: '/page_components/fuwu/index?id=' + id
})
}
})
},
fail: err => {
console.error('扫描失败:', err);
uni.showToast({
title: '扫描失败',
icon: 'none'
});
}
});
},
getad() {
this.$u.get("/app/ad").then((res) => {
if (res.code == 200) {
this.imgad = res.data.picture
}
})
},
btnindex(num) {
if (num == 2) {
uni.navigateTo({
url: '/page_fenbao/statulist/question/index'
})
} else if (num == 3) {
uni.navigateTo({
url: '/page_fenbao/statulist/about/index'
})
} else if (num == 1) {
uni.navigateTo({
url: '/page_fenbao/statulist/myorder/index'
})
} else if (num == 4) {
uni.navigateTo({
url: '/page_fenbao/statulist/merchant/index'
})
} else if (num == 5) {
uni.navigateTo({
url: '/page_fenbao/statulist/nearby/index'
})
} else if (num == 6) {
uni.switchTab({
url: '/pages/index/index'
})
} else if (num == 7) {
uni.navigateTo({
url: '/page_fenbao/statulist/fault/yichang/index'
})
}
},
onControltap(control) {
this.setMapScale()
// uni.createMapContext("map", this).moveToLocation({
// longitude: this.longitude,
// latitude: this.latitude,
// })
},
// 地图回正
async setMapScale(e, val) {
let mapContext = uni.createMapContext('map', this);
let setScale = () => {
return new Promise((resolve, reject) => {
mapContext.getScale({
success: r => {
resolve()
}
})
})
};
await setScale();
mapContext.moveToLocation({
success: (res) => {
const timer = setTimeout(() => {
clearTimeout(timer);
}, 500);
}
})
},
getMyLocation() {
uni.getLocation({
type: 'wgs84',
success: (res) => {
// this.jinweidu = res.longitude + ',' + res.latitude;
// this.latitude = res.latitude;
// this.longitude = res.longitude;
this.jinweidu = res.longitude + ',' + res.latitude
this.latitude = Number(res.latitude.toFixed(5)) - 0.005
this.longitude = Number(res.longitude.toFixed(5)) + 0.005
// 请求附近的店铺
this.$u.get("/app/store/listNearBy?center=" + this.jinweidu + '&radius=' + 1000).then(
res => {
if (res.code == 200) {
this.listmap = res.data
res.data.forEach(item => {
const shopCover = {
id: parseFloat(item.storeId),
latitude: item.lat,
longitude: item.lng,
width: 25,
height: 30,
iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uZXgsJE6hXbRSwbKILB4',
label: {
content: item.name,
anchorX: (() => {
if (item.name.length <= 2) {
return -12
} else if (item.name.length <= 3) {
return -20
} else if (item.name.length <= 4) {
return -25
} else if (item.name.length <= 5) {
return -30
} else if (item.name.length <= 6) {
return -35
} else if (item.name.length <= 8) {
return -40
} else if (item.name.length <=
10) {
return -45
} else {
return -item.name.length * 6
}
})(),
fontWeight: 700,
color: '#8883F0',
textShadow: '2px 2px 0px white, -2px -2px 0px white, 2px -2px 0px white, -2px 2px 0px white',
style: {
},
}
};
this.covers.push(shopCover)
});
}
});
},
fail: (err) => {
console.error('获取位置失败:', err);
}
});
},
handleMarkerClick(event) {
let markerId = event.markerId;
uni.navigateTo({
url: '/page_user/mapditu/index?markerId=' + markerId
})
},
logins() {
if (uni.getStorageSync('userType')) {
this.userType = uni.getStorageSync('userType')
this.userType = '01'
if (this.userType == '01') {
this.getDeviceList()
} else if (this.userType == '00') {
this.getdevice()
}
} else {
}
this.getuserinfo()
},
getuserinfo() {
this.$u.get("/app/user/userInfo").then((res) => {
if (res.code == 200) {
this.isMch = res.data.isMch
uni.setStorageSync('userType', res.data.userType)
this.userType = res.data.userType
if (this.userType == '01') {
this.getDeviceList()
} else if (this.userType == '00') {
this.getdevice()
}
} else {
this.jmlogin()
}
});
},
jmlogin() {
let taht = this
wx.login({
success(res) {
if (res.code) {
let data = {
loginCode: res.code,
};
taht.$u.post('/app/auth/wxLogin', data).then(res => {
if (res.code == 10003) {
// uni.navigateTo({
// url: '/pages/login/login'
// })
} else if (res.code == 200) {
uni.setStorageSync('token', res.token);
taht.logins()
}
});
}
},
});
},
gethuidaio() {
this.$u.get('/app/bill/recharge/device/fail/list').then(res => {
if (res.code == 200) {
if (res.data.length > 0) {
this.czflag = true
this.dingobj = res.data
} else {
uni.removeStorageSync('time')
}
}
})
},
tocz() {
this.czflag = false
uni.navigateTo({
url: '/page_fenbao/chongzhi?dingobj=' + JSON.stringify(this.dingobj)
})
},
},
mounted() {
this.getMyLocation(); // 获取并设置自身位置的覆盖物
}
};
</script>
<style lang="scss">
/deep/ .u-title {
padding-bottom: 22rpx;
}
/deep/ .u-icon__icon {
padding-bottom: 22rpx;
}
/deep/ .map {
width: 100%;
height: 100%;
}
.dateactive {
background: #E1F3ED;
}
page {
background: linear-gradient(180deg, #8883F0 10%, rgba(255, 255, 255, 0) 100%);
border-radius: 0rpx 0rpx 0rpx 0rpx;
}
.page {
width: 750rpx;
padding-left: 34rpx;
padding-right: 34rpx;
box-sizing: border-box;
height: 100%;
.tip_box {
position: fixed;
left: 72rpx;
top: 700rpx;
width: 610rpx;
background: #F7FAFE;
border-radius: 30rpx 30rpx 30rpx 30rpx;
z-index: 10000000;
.top {
padding: 52rpx 38rpx 42rpx 36rpx;
.txt {
width: 100%;
text-align: center;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
}
}
.bot {
border-top: 2rpx solid #D8D8D8;
display: flex;
flex-wrap: nowrap;
height: 100%;
.bot_left {
width: 50%;
height: 98rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
}
.bot_right {
width: 50%;
height: 98rpx;
display: flex;
align-items: center;
justify-content: center;
border-left: 2rpx solid #D8D8D8;
font-weight: 500;
font-size: 36rpx;
color: #8883F0;
}
}
}
.userdaili {
.gongneng {
width: 680rpx;
height: 304rpx;
background: #FFFFFF;
border-radius: 24rpx 24rpx 24rpx 24rpx;
padding: 0 50rpx;
box-sizing: border-box;
.icons {
display: inline-block;
width: 145rpx;
text-align: center;
image {
margin-top: 34rpx;
width: 50px;
height: 50px;
}
}
}
.ordertongji {
width: 680rpx;
height: 342rpx;
background: #FFFFFF;
border-radius: 24rpx 24rpx 24rpx 24rpx;
.shuju {
display: flex;
justify-content: space-between;
padding: 0 40rpx;
box-sizing: border-box;
margin-top: 24rpx;
.ddje {
text-align: center;
.shu {
font-weight: 500;
font-size: 40rpx;
color: #3D3D3D;
}
.sb {
margin-top: 20rpx;
font-weight: 500;
font-size: 20rpx;
color: #3D3D3D;
}
}
}
.date {
padding-left: 80rpx;
padding-right: 80rpx;
box-sizing: border-box;
display: flex;
justify-content: space-between;
margin-top: 26rpx;
text {
padding: 6rpx 18rpx;
box-sizing: border-box;
background: #eee;
border-radius: 10rpx 10rpx 10rpx 10rpx;
font-size: 26rpx;
color: #808080;
}
}
.orderday {
display: flex;
justify-content: space-between;
width: 100%;
padding: 10rpx 12rpx;
box-sizing: border-box;
text {
margin-right: 10rpx;
border-radius: 20rpx;
text-align: center;
display: inline-block;
width: 148rpx;
height: 84rpx;
text-align: center;
line-height: 84rpx;
}
}
}
.dttitle {
margin: 36rpx 0;
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
}
.zhanghu {
margin-top: 32rpx;
width: 680rpx;
height: 264rpx;
background: #FFFFFF;
border-radius: 24rpx 24rpx 24rpx 24rpx;
padding: 36rpx 38rpx;
box-sizing: border-box;
.zhtitle {
display: flex;
justify-content: space-between;
.sj {
display: flex;
justify-content: space-between;
text {
font-size: 26rpx;
color: #3D3D3D;
}
}
.tx {
font-size: 26rpx;
color: #27D089;
}
}
.zhje {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #ccc;
padding-bottom: 20rpx;
text {
font-weight: 500;
font-size: 48rpx;
color: #3D3D3D;
}
.btntx {
width: 156rpx;
height: 42rpx;
background: linear-gradient(270deg, #54DAA1 0%, #19CD82 100%);
border-radius: 40rpx 40rpx 40rpx 40rpx;
font-size: 26rpx;
color: #FFFFFF;
text-align: center;
line-height: 42rpx;
margin-top: 10rpx;
}
}
.buc {
margin-top: 20rpx;
font-size: 26rpx;
color: #979797;
}
}
}
//样式结束
.title {
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
line-height: 50rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.guangg {
margin-top: 10rpx;
margin-bottom: 10rpx;
image {
border-radius: 30rpx;
width: 680rpx;
height: 218rpx;
}
}
.saoma {
width: 750rpx;
height: 166rpx;
background: #FFFFFF;
position: relative;
left: -34rpx;
padding-top: 22rpx;
border-radius: 54rpx 54rpx 0 0;
margin-top: 20rpx;
view {
text-align: center;
width: 676rpx;
height: 102rpx;
background: linear-gradient(270deg, #8883F0 0%, #8883F0 100%);
border-radius: 54rpx 54rpx 54rpx 54rpx;
font-weight: 500;
font-size: 40rpx;
color: #FFFFFF;
margin: auto;
line-height: 102rpx;
}
image {
width: 56rpx;
height: 56rpx;
vertical-align: middle;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
}
.ditu {
width: 100%;
height: 980rpx;
background: #FFFFFF;
border-radius: 38rpx 38rpx 38rpx 38rpx;
padding-top: 16rpx;
position: relative;
.fujin {
position: absolute;
top: 730rpx;
padding-left: 30rpx;
width: 100%;
image {
width: 210rpx;
height: 74rpx;
}
}
.dtxs {
width: 642rpx;
height: 812rpx;
margin: auto;
border-radius: 30rpx;
overflow: hidden;
}
.tubiao {
display: flex;
justify-content: space-between;
padding: 30rpx 50rpx;
box-sizing: border-box;
.gr {
text-align: center;
width: 100%;
font-weight: 400;
font-size: 26rpx;
color: #3D3D3D;
image {
display: block;
margin: auto;
margin-bottom: 14rpx;
}
}
}
}
}
</style>