hd-miniprogram/src/pages/home/index.vue
2025-03-29 17:22:49 +08:00

507 lines
12 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 id="mancont">
<view>
<up-swiper
height="500rpx"
keyName="picUrl"
:list="imglist"
indicatorMode="line"
radius="0"
:indicator="false"
circular
/>
</view>
<view v-if="!islogin" class="kuaijrk" style="position: relative;margin-top: -50rpx;background: #fff;">
<view style="display: flex;align-items: center;">
<view style="width: 70rpx;height: 70rpx;border-radius: 50%;overflow: hidden;">
<image style="width: 100%;height: 100%;" src="../../static/img/jrwm.png" />
</view>
<view>未登录</view>
</view>
<!--@tap="getUser"-->
<view @tap="topage('/pages/login/index')" style="width: 180rpx;height:64rpx;background: #00aa7f;text-align:center;color:#fff;border-radius:10rpx;line-height: 64rpx;">去登录</view>
</view>
<view v-else class="kuaijrk" style="position: relative;margin-top: -50rpx;align-items:center;background: #fff;">
<view @tap="topage('/minePages/userInfor/index')" style="display: flex;width:50%;align-items: center;">
<view style="width: 70rpx;height: 70rpx;border-radius: 50%;overflow: hidden;">
<image style="width: 100%;height: 100%;" :src="toux()" />
</view>
<view class="niche">{{username()}}</view>
</view>
<!-- <view>
<view style="font-size: 36rpx;">5</view>
<view style="font-size: 26rpx;color: #8e8a8a;">优惠券</view>
</view> -->
<view @tap="topage('/minePages/account/index')">
<view style="font-size: 36rpx;">{{account.totalAmount?account.totalAmount/100:0}}</view>
<view style="font-size: 26rpx;color: #8e8a8a;">余额</view>
</view>
</view>
<view class="kuaijrk">
<template v-if="islogin">
<view @tap="topage('/minePages/order/index')">
<image src="../../static/img/cd2.png" />
<view>我的订单</view>
</view>
<view @tap="topage('/minePages/recharge/index')">
<image src="../../static/img/chongz.png" />
<view>充值中心</view>
</view>
<view @tap="topage('/minePages/reserlist/index')">
<image src="../../static/img/shiyxy.png" />
<view>预约记录</view>
</view>
</template>
<template v-else>
<view @tap="wdltip()">
<image src="../../static/img/cd2.png" />
<view>我的订单</view>
</view>
<view @tap="wdltip()">
<image src="../../static/img/chongz.png" />
<view>充值中心</view>
</view>
<view @tap="wdltip()">
<image src="../../static/img/shiyxy.png" />
<view>预约记录</view>
</view>
</template>
<view>
<image src="../../static/img/kefu.png" />
<view>客服中心</view>
</view>
<!--topage('/homePages/agreement/index')-->
<!-- <view @tap="showxy()">
<image src="../../static/img/shiyxy.png" />
<view>使用协议</view>
</view> -->
<!-- <view>
<image src="../../static/img/jrwm.png" />
<view>加入我们</view>
</view> -->
</view>
</view>
<!-- @callouttap="getdh()"-->
<map
:style="{width:'100%',height: height}"
:latitude="latitude"
:longitude="longitude"
:markers="covers"
:scale="10"
:show-location="true"
@markertap="markertap"
>
<!-- <template #callout>
<cover-view style="width:200px;height:200px;background:#fff;" :marker-id="0">
<cover-view>1号换电站</cover-view>
<cover-view style="width: 100rpx;height:60rpx;line-height:60rpx;text-align:center;background:#00aa00;color:#fff;">导航</cover-view>
</cover-view>
</template> -->
</map>
<view v-if="showxq" class="dibucoten">
<view style="margin-bottom: 10rpx;padding-bottom:10rpx;font-size: 38rpx;color: #00aa7f;border-bottom:1px #00aa7f dashed;">{{hdzname}}</view>
<view>营业时间:<text style="color: #5f5f5f;">8:30 - 17:30</text></view>
<view style="display: flex;justify-content: space-between;">
<view style="padding-top: 8rpx;">距您 <text style="color: #5f5f5f;">4.5km</text></view>
<view @tap="getdh()" style="width: 150rpx;height: 60rpx;line-height: 60rpx;text-align: center;background: #00aa7f;color: #fff;border-radius: 10rpx;">导航</view>
</view>
</view>
<view v-if="islogin" @tap="topage(`/homePages/reservation/index?hdzcode=${hdzcode}&phoneNumber=${userInfo.phoneNumber}`)" class="yuyue">预 约</view>
<view v-else @tap="wdltip()" class="yuyue">预约</view>
<!--xyshow-->
<up-popup
:show="xyshow"
mode="bottom"
round="50"
:closeOnClickOverlay="true"
>
<view style="box-sizing: border-box;padding: 20rpx;background: #fff;">
<view style="margin-bottom: 20rpx;padding-bottom:20rpx;font-size: 40rpx;text-align: center;color: #00aa7f;border-bottom: 1px #00aa7f dashed;">伊特换电使用协议</view>
<view style="height: 600rpx;overflow-y: auto;">
<view style="padding: 25rpx 25rpx 50rpx;font-size: 26rpx;">
<view style="padding-bottom: 30rpx;font-weight: bold;text-align: center;">{{xyobj.title}}</view>
<scroll-view scroll-y="true" style="height: 600rpx;">
<up-parse :content="decodeURIComponent(xyobj.content)"></up-parse>
</scroll-view>
</view>
</view>
<!-- <view style="display: flex;align-items: center;;padding-top: 10rpx;">
<label class="radio"><radio value="r1" checked="true">已阅读并同意</radio></label>
<view @tap="topage('/minePages/agreement/index?type=1')" style="padding: 0 10rpx;color: #ffaa00;">《服务条款》</view>
<view @tap="topage('/minePages/agreement/index?type=2')" style="color: #ffaa00;">《隐私协议》</view>
</view> -->
<view class="xybtns">
<view @tap="btnshan(2)" style="background: #fff;border:1px #8e8a8a solid;color: #000;">取消</view>
<view @tap="btnshan(1)">同意</view>
</view>
</view>
</up-popup>
</template>
<script setup lang="ts">
import { ref,reactive,watch,getCurrentInstance } from 'vue'
import { onLoad,onShow,onTabItemTap } from '@dcloudio/uni-app'
import {
login,
getUser,
gethdz,
loginstate,
swiperimg,
agreement,
getInfo,
getaccou
} from '@/utils/service'
let height = ref('')
let islogin = ref(false)
let PhoneNumber = ref('')
let covers =ref<any[]>([])
let hdzcode = ref('')
let imglist = ref<any[]>([])
uni.removeStorageSync('wxuid')
uni.removeStorageSync('wxToken')
uni.removeStorageSync('PhoneNumber')
uni.removeStorageSync('Init')
let xyobj = ref<any>({})
let account = ref<any>({})
let isinit = true
onLoad((opt:any) => {
hdzcode.value = opt.hdzcode
if(uni.getStorageSync('wxuid')){
loginstate({
wuid:uni.getStorageSync('wxuid')
}).then((rps:any) => {
if(rps.data && rps.data.wxToken){
uni.setStorageSync('wxToken',rps.data.wxToken)
}
getinfo()
})
}
})
onShow(() => {
xyshow.value = false
uni.showTabBar()
//判断是否登录
if(uni.getStorageSync('wxuid')){
islogin.value = true
getinfo() //??
// if(!isinit){
// getinfo()
// }else{
// isinit = false
// }
}else{
islogin.value = false
PhoneNumber.value = ''
covers.value = []
//hdzcode.value = ''
imglist.value = []
if(!uni.getStorageSync('Init')){
showxy()
}
}
const instance = getCurrentInstance()
const query = uni.createSelectorQuery().in((instance as any).proxy)
query.select('#mancont').boundingClientRect(v => {
uni.getSystemInfo({
success: n => {
// 屏幕可用高度 减去 其他元素高度
height.value = (n.windowHeight - (v as any).height + 20)+'px'
}
})
})
.exec()
})
//获取经纬度
let latitude = ref(37.844522)
let longitude = ref(114.530428)
let hdzname = ref('')
let xyshow = ref(false)
let userInfo = reactive<any>({
phoneNumber:'',
avatarUrl:'',
name:'',
nickName:''
})
function username() {
if(userInfo.phoneNumber){
return userInfo.phoneNumber
}else if(userInfo.nickName){
return userInfo.nickName
}else if(userInfo.name){
return userInfo.name
}
return '微信用户'
}
function getinfo(){
//获取轮播图
swiperimg({
appid:'wx2ab384cf1e6f85a1',
type:2
}).then((rps:any) => {
imglist.value = rps.data
})
//获取换电站
covers.value.splice(0)
gethdz({
//plateNum:formdata.plateNum
}).then((rps:any) => {
if(rps.data && rps.data.length > 0){
rps.data.forEach((n:any,i:any) => {
let jwd = n.locationPoint?n.locationPoint.split(','):[]
covers.value.push({
id:i,
latitude: jwd[0]?jwd[0]:'',
longitude: jwd[1]?jwd[1]:'',
width:20,
height:30,
options: {
isStore: true,
status: 1,
xian: 12,
all: 20
},
callout: {
content: n.name,
bgColor:'#00aa7f',
color:'#fff',
fontSize:'30rpx',
padding:'10rpx',
borderRadius:'20rpx',
display: 'BYCLICK' //点击显示
}
})
})
}
})
//获取用户信息
getInfo({
wuid:uni.getStorageSync('wxuid')
}).then((rps:any) => {
uni.setStorageSync('userInfor',rps.data)
userInfo.phoneNumber = rps.data.phoneNumber?rps.data.phoneNumber:''
userInfo.nickName = rps.data.nickName?rps.data.nickName:''
userInfo.avatarUrl = rps.data.avatarUrl?rps.data.avatarUrl:''
userInfo.name = rps.data.name?rps.data.name:''
})
//获取账户信息
getaccou(uni.getStorageSync('wxuid')).then((rps:any) => {
if(rps.data.records){
account.value = rps.data.records[0]
uni.setStorageSync('totalAmount', rps.data.records[0].totalAmount)
uni.setStorageSync('walletCode', rps.data.records[0].code)
}
})
}
function toux() {
return userInfo.avatarUrl?userInfo.avatarUrl:'../../static/img/toux.png'
}
//页面跳转
function topage(url:string){
uni.navigateTo({
url
})
}
function wdltip() {
uni.showToast({
title:'请您先登录',
icon:'none'
})
}
function getdh() {
uni.openLocation({
latitude:latitude.value*1,
longitude:longitude.value*1,
address:hdzname.value,
success() {
console.log('success');
},
fail(err) {
console.error('打开地图失败', err);
}
})
}
//点击地图标注
let showxq = ref(false)
function markertap(v:any) {
showxq.value = true
const markerId = v.markerId
// 更新markers数组重新渲染地图
covers.value = covers.value.map((n:any) => {
if(n.id === markerId) {
console.log(n,'123')
// 当前点击的标注显示气泡
n.callout.display = 'ALWAYS'
hdzname.value = n.callout.content
latitude.value = n.latitude
longitude.value = n.longitude
}else{
// 其他标注隐藏气泡
n.callout.display = 'BYCLICK'
}
return n
})
}
//协议
function showxy() {
agreement({
appid:'wx2ab384cf1e6f85a1', //uni.getStorageSync('wxuid'),
type:'1'
}).then((rps:any) => {
xyobj.value = rps.data[0]
uni.hideTabBar()
xyshow.value = true
})
}
function btnshan(type:number = 1) {
if(type == 1){
getUser().then(() => {
xyshow.value = false
uni.showTabBar()
islogin.value = true
//是否初次使用
uni.setStorageSync('Init',true)
getinfo()
setTimeout(()=> {
uni.getLocation({
type: 'wgs84',
success(res) {
longitude.value = res.longitude
latitude.value = res.latitude
},
fail(rps) {
console.log(rps)
}
})
},1000)
})
}else{
uni.exitMiniProgram({
success: function() {
console.log('退出小程序成功')
},
fail: function(err) {
console.log('退出小程序失败', err)
}
})
// xyshow.value = false
// uni.showTabBar()
}
}
</script>
<style lang="scss" scoped>
page{
background: #ccc;
}
.top {
width: 100%;
background: #00aa00;
view{
padding: 30rpx 0;
font-size: 40rpx;
color: #fff;
text-align: center;
}
}
.kuaijrk{
display: flex;
justify-content: space-between;
margin: 20rpx;
padding: 20rpx;
border-radius: 20rpx;
font-size: 30rpx;
box-shadow: 0 0 20px 2px rgba(0, 170, 0, 0.5);
>view{
width: 25%;
text-align: center;
//color: #00aa00;
//font-weight: bold;
image{
width: 70rpx;
height: 70rpx;
}
}
}
.dibucoten{
box-sizing: border-box;
position: fixed;
width: 90%;
//height: 200rpx;
padding: 30rpx;
border-radius: 10rpx;
background:#fff; //#00aa00;
left: 5%;
bottom: 20rpx;
box-shadow: 0 0 20px 2px rgba(0, 170, 0, 0.5);
}
.xybtns{
box-sizing: border-box;
display: flex;
width: 100%;
justify-content: space-between;
padding:20rpx 0 100rpx 0;
>view{
display: flex;
box-sizing: border-box;
width: 300rpx;
height: 80rpx;
align-items: center;
justify-content: center;
border-radius: 50rpx;
color: #fff;
background: #00aa00;
}
}
.yuyue{
position: fixed;
right: 5%;
bottom: 300rpx;
width: 120rpx;
height: 120rpx;
line-height: 120rpx;
text-align: center;
background: #00aa00;
border-radius: 50%;
color: #fff;
box-shadow: 0 0 20px 2px rgba(0, 170, 0, 0.5);
}
.niche{
width: 200rpx;
padding-left: 20rpx;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-align: left;
}
</style>