| | |
| | | <template> |
| | | <view class="index-page"> |
| | | <view class="top-gradient-bg" :style="{ backgroundImage: 'url(' + backgroundImage + ')' }"></view> |
| | | <image class="top-gradient-bg" src="/static/image/bg_home@2x.png" mode="aspectFill"></image> |
| | | <view class="top-hero"> |
| | | <view :style="{ height: statusbarHeight + 'px' }"></view> |
| | | <view class="hero-bar" :style="{ height: navHeight + 'px' }"> |
| | | <view class="location-chip" @tap="handleLocation"> |
| | | <view class="location-chip" @click="chooseLocation"> |
| | | <image src="/static/icon/home1_ic_location@2x.png" mode="aspectFit"></image> |
| | | <text>{{ currentAddress }}</text> |
| | | <u-icon name="arrow-right" size="14" color="#ffffff"></u-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="search-box" @tap="goStoragePage"> |
| | | <view class="search-box" @click="goStoragePage"> |
| | | <image src="/static/icon/home_ic_search@2x.png" mode="aspectFit"></image> |
| | | <text class="search-text">搜索寄存点名称或地址</text> |
| | | </view> |
| | | |
| | | <view class="banner-card hero-banner"> |
| | | <swiper class="banner-swiper" :indicator-dots="true" :autoplay="true" :interval="3000" :duration="500" :circular="true" :indicator-color="'rgba(255, 255, 255, 0.5)'" :indicator-active-color="'#ffffff'"> |
| | | <swiper-item v-for="(item, index) in bannerList" :key="index"> |
| | | <swiper-item v-for="(item, index) in bannerList" :key="index" @click="jumpBannerDetail(item)"> |
| | | <image class="banner-image" :src="item.imgurlFull" mode="aspectFill"></image> |
| | | </swiper-item> |
| | | </swiper> |
| | |
| | | <view class="service-card deposit-card" @click="jumpxiadan"> |
| | | <image class="service-image" src="/static/image/home_ic_jicun@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | <view class="service-card retrieve-card"> |
| | | <view class="service-card retrieve-card" @click="jumpOrderList(3)"> |
| | | <image class="service-image" src="/static/image/home_ic_qujian@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="notice-card"> |
| | | <view class="notice-card" v-if="ingOrder && ingOrder.orderId" @click="jumpOrderDetail(ingOrder.orderId)"> |
| | | <view class="notice-icon-wrap"> |
| | | <image src="/static/icon/home_ic_daizhifu@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | <view class="notice-copy"> |
| | | <text class="notice-title">待支付</text> |
| | | <text class="notice-text">请在 10 分钟内完成支付,超时订单将自动取消</text> |
| | | <text class="notice-title">{{ingOrder.statusDesc || ''}}</text> |
| | | <text class="notice-text">{{ingOrder.tip || ''}}</text> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | </view> |
| | | |
| | | <view class="recommend-list"> |
| | | <view v-for="(item, index) in pointList" :key="index" class="point-card" @click="goStoragePage(item)"> |
| | | <view class="point-thumb"> |
| | | <image class="point-thumb-image" :src="item.coverImg" mode="widthFix"></image> |
| | | </view> |
| | | <view class="point-main"> |
| | | <view class="point-head"> |
| | | <text class="point-name">{{ item.name }}</text> |
| | | <text class="point-distance">{{ item.distanceText }}</text> |
| | | <template v-if="pointList.length > 0"> |
| | | <view v-for="(item, index) in pointList" :key="index" class="point-card" @click="goShopDetails(item)"> |
| | | <view class="point-thumb"> |
| | | <image class="point-thumb-image" :src="item.coverImg" mode="widthFix"></image> |
| | | </view> |
| | | <view class="point-address"> |
| | | <image src="/static/icon/home_ic_location3@2x.png" mode="aspectFit"></image> |
| | | <text>{{ item.address }}</text> |
| | | <view class="point-main"> |
| | | <view class="point-head"> |
| | | <text class="point-name">{{ item.name ||'' }}</text> |
| | | <text class="point-distance">{{ item.distanceText ||''}}</text> |
| | | </view> |
| | | <view class="point-address"> |
| | | <image src="/static/icon/home_ic_location3@2x.png" mode="aspectFit"></image> |
| | | <text>{{ item.address ||''}}</text> |
| | | </view> |
| | | <text class="point-time">{{ item.shopHours ||'' }}</text> |
| | | </view> |
| | | <text class="point-time">{{ item.shopHours }}</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | <template v-else> |
| | | <view class="no-data"> |
| | | <image src="/static/image/default_nodata_white@2x.png" mode="widthFix"></image> |
| | | </view> |
| | | </template> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | </view> |
| | | <view class="toast-btn" @click="handleLocation">开启定位</view> |
| | | </view> |
| | | <auth-login :show="showLogin" @close="showLogin = false"></auth-login> |
| | | <custom-tabbar></custom-tabbar> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { mapState } from 'vuex' |
| | | import amapFile from '@/utils/amap-wx.130.js' |
| | | import CustomTabbar from '@/components/custom-tabbar/custom-tabbar.vue' |
| | | |
| | | export default { |
| | | components: { |
| | | CustomTabbar |
| | | }, |
| | | computed: { |
| | | ...mapState(['navHeight', 'statusbarHeight', 'address', 'latitude', 'cityId', 'longitude']), |
| | | ...mapState(['navHeight', 'statusbarHeight', 'address', 'latitude', 'cityId', 'longitude', 'token']), |
| | | currentAddress() { |
| | | return this.address && this.address !== '定位中' ? this.address : '获取定位' |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | backgroundImage: require('@/static/image/bg_home@2x.png'), |
| | | bannerList: [], |
| | | pointList: [], |
| | | page: 1, |
| | | isRequest: true |
| | | ingOrder: null, |
| | | showLogin: false, |
| | | pendingNavigate: null |
| | | } |
| | | }, |
| | | async onLoad() { |
| | | await this.$onLaunched |
| | | await this.getBannerList() |
| | | await this.getNearbyShopList() |
| | | if (this.cityId && this.latitude && this.longitude) { |
| | | await this.getNearbyShopList() |
| | | } |
| | | }, |
| | | onReachBottom() { |
| | | this.getNearbyShopList() |
| | | onShow() { |
| | | this.ingOrder =null |
| | | this.getIngorder() |
| | | }, |
| | | watch: { |
| | | token(newToken) { |
| | | if (newToken && this.pendingNavigate) { |
| | | const fn = this.pendingNavigate |
| | | this.pendingNavigate = null |
| | | this.showLogin = false |
| | | fn() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | jumpBannerDetail(item) { |
| | | if(!item.content || item.content =='' || item.type==0){ |
| | | return |
| | | } |
| | | if (item.type == 1) { |
| | | uni.navigateTo({ |
| | | url: '/shop/pages/article-details/article-details?id=' + item.id |
| | | }) |
| | | } else if(item.type == 2) { |
| | | uni.navigateTo({ |
| | | url: '/shop/pages/webview/webview?url=' + item.content |
| | | }) |
| | | } |
| | | }, |
| | | jumpOrderDetail(id){ |
| | | uni.navigateTo({ |
| | | url:'/pages/delivery-order-detail/delivery-order-detail?userType=0&id='+id |
| | | }) |
| | | }, |
| | | async getIngorder(){ |
| | | var that =this |
| | | let res = await that.$u.api.getActiveOrderTip() |
| | | if (res && res.code === 200) { |
| | | this.ingOrder = res.data |
| | | } |
| | | }, |
| | | jumpOrderList(status){ |
| | | if (!this.token) { |
| | | this.pendingNavigate = () => this.jumpOrderList(status) |
| | | this.showLogin = true |
| | | return |
| | | } |
| | | uni.setStorageSync("orderStatus",status) |
| | | uni.switchTab({ |
| | | url: '/pages/itinerary/itinerary' |
| | | }) |
| | | }, |
| | | jumpxiadan() { |
| | | if (!this.token) { |
| | | this.pendingNavigate = () => this.jumpxiadan() |
| | | this.showLogin = true |
| | | return |
| | | } |
| | | if (!this.cityId) return uni.showToast({ |
| | | title: '当前城市暂未开通', |
| | | icon: 'none' |
| | | }) |
| | | uni.navigateTo({ |
| | | url: '/pages/luggage-storage/luggage-storage' |
| | | }) |
| | |
| | | } |
| | | }, |
| | | async getNearbyShopList() { |
| | | if (!this.isRequest) return; |
| | | const res = await this.$u.api.getNearbyShopList({ |
| | | capacity: 10, |
| | | page: this.page, |
| | | capacity: 5, |
| | | page: 1, |
| | | model: { |
| | | latitude: this.latitude, |
| | | longitude: this.longitude, |
| | |
| | | }) |
| | | if (res.code === 200) { |
| | | this.pointList = res.data.records || [] |
| | | this.page++ |
| | | if (res.data.total <= this.pointList.length) { |
| | | this.isRequest = false |
| | | } |
| | | } |
| | | }, |
| | | jumpJC() { |
| | | if (!this.cityId) return uni.showToast({ |
| | | title: '当前城市暂未开通', |
| | | icon: 'none' |
| | | }) |
| | | uni.navigateTo({ |
| | | url: '/pages/storage-point/storage-point' |
| | | }) |
| | |
| | | } |
| | | }); |
| | | }, |
| | | chooseLocation() { |
| | | var that = this; |
| | | uni.chooseLocation({ |
| | | type: 'gcj02', |
| | | success: async function(addr) { |
| | | console.log(addr, '==================uniapp选择位置成功'); |
| | | if (addr.errMsg === 'chooseLocation:ok' && addr.latitude) { |
| | | const locParam = { latitude: addr.latitude, longitude: addr.longitude }; |
| | | var myAmapFun = new amapFile.AMapWX({ key: that.$gaodeMapKey }); |
| | | myAmapFun.getRegeo({ |
| | | location: addr.longitude + ',' + addr.latitude, |
| | | success: async function(data) { |
| | | console.log(data, '==================选择地址逆解析'); |
| | | let info = data[0]; |
| | | locParam.province = info.province; |
| | | locParam.city = (info.regeocodeData.addressComponent.city && typeof info.regeocodeData.addressComponent.city === 'string') |
| | | ? info.regeocodeData.addressComponent.city |
| | | : info.regeocodeData.addressComponent.province; |
| | | var ta = addr.name || '地址获取失败'; |
| | | locParam.address = ta |
| | | const resCity = await that.$u.api.getCityByName({ cityName: locParam.city }) |
| | | if (resCity.code === 200 && resCity.data) { |
| | | locParam.cityId = resCity.data.id |
| | | that.$store.commit('setPosition', locParam) |
| | | that.pointList = [] |
| | | that.getNearbyShopList() |
| | | } else { |
| | | that.$store.commit('setPosition', locParam) |
| | | that.$store.commit('clearCityId') |
| | | that.pointList = [] |
| | | } |
| | | }, |
| | | fail: function(err) { |
| | | console.error('获取位置失败===========', err); |
| | | that.$store.commit('setPosition', locParam) |
| | | that.pointList = [] |
| | | that.getNearbyShopList() |
| | | } |
| | | }); |
| | | } |
| | | }, |
| | | fail: function(err) { |
| | | console.error('选择位置失败===========', err); |
| | | } |
| | | }); |
| | | }, |
| | | // 定位 |
| | | positioning() { |
| | | var that = this; |
| | |
| | | isHighAccuracy: true, |
| | | success: function (addr) { |
| | | const locParam = { latitude: addr.latitude, longitude: addr.longitude }; |
| | | const qqmapsdk = new QQMapWX({ |
| | | key: 'WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE' |
| | | }); |
| | | qqmapsdk.reverseGeocoder({ |
| | | locParam, |
| | | success: async function(res) { |
| | | console.log(res, '==================获取地址'); |
| | | let info = res.result; |
| | | locParam.province = info.address_component.province; |
| | | locParam.city = info.address_component.city; |
| | | locParam.area = info.address_component.district; |
| | | locParam.street = info.address_component.street; |
| | | var ta = info.address || '地址获取失败' ; |
| | | if(info.formatted_addresses && info.formatted_addresses.recommend){ |
| | | ta =info.formatted_addresses.recommend |
| | | } |
| | | locParam.address = ta |
| | | var myAmapFun = new amapFile.AMapWX({ key: 'f2e6c0bfcac14c27b4f0d6d0d5b9d7d' }); |
| | | myAmapFun.getRegeo({ |
| | | location: addr.longitude + ',' + addr.latitude, |
| | | success: async function(data) { |
| | | console.log(data, '==================获取地址'); |
| | | let info = data[0]; |
| | | locParam.province = info.province; |
| | | locParam.city = info.city; |
| | | locParam.area = info.district; |
| | | locParam.street = info.street; |
| | | var ta = info.name || '地址获取失败'; |
| | | locParam.address = ta |
| | | const resCity = await that.$u.api.getCityByName({ cityName: locParam.city }) |
| | | if (resCity.code === 200) { |
| | | locParam.cityId = resCity.data.id |
| | | } |
| | | that.$store.commit('setPosition',locParam) |
| | | } |
| | | that.$store.commit('setPosition', locParam) |
| | | that.$isResolve() |
| | | }, |
| | | fail: (err) => { |
| | |
| | | } |
| | | }); |
| | | }, |
| | | goShopDetails(item){ |
| | | uni.navigateTo({ |
| | | url: '/pages/storage-point-detail/storage-point-detail?id='+item.id |
| | | }) |
| | | }, |
| | | goStoragePage() { |
| | | if (!this.cityId) return uni.showToast({ |
| | | title: '当前城市暂未开通', |
| | | icon: 'none' |
| | | }) |
| | | uni.navigateTo({ |
| | | url: '/pages/storage-point/storage-point' |
| | | }) |
| | |
| | | margin-top: 32rpx; |
| | | } |
| | | |
| | | .no-data { |
| | | width: 100%; |
| | | margin-top: 80rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | image { |
| | | width: 320rpx; |
| | | height: 320rpx; |
| | | } |
| | | } |
| | | |
| | | .point-card { |
| | | display: flex; |
| | | gap: 18rpx; |