From 0512f40da106268ac342377256cf9099d7f90b3e Mon Sep 17 00:00:00 2001 From: xuxueyang <xuxy@fengyuntec.com> Date: 星期五, 18 十月 2024 10:41:35 +0800 Subject: [PATCH] add 首页的定位 --- pages/user/address/address.vue | 284 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 266 insertions(+), 18 deletions(-) diff --git a/pages/user/address/address.vue b/pages/user/address/address.vue index 5a7fc55..6be831d 100644 --- a/pages/user/address/address.vue +++ b/pages/user/address/address.vue @@ -1,10 +1,40 @@ <template> <!-- 收货地址列表 --> <view class="p15 container-address"> + <view class="search-container m-t-12 flex"> + <view class="flex1 input" @click="selectWxAddress('input')"> + <u-input placeholder="小区名/店铺名/写字楼/街道名等" disabled v-model="search_flow"> + <template slot="suffix"> + <uni-icons color="#20613D" type="search" size="24"></uni-icons> + </template> + </u-input> + </view> + </view> + <view class="m-t-12 "> + <view class="desc-gray">当前位置</view> + <view class="flex current-address"> + <view class="flex1"> + {{ addressDesc || (address&&address.id?address.address: '选择地址') }} + + </view> + <view class="flex" @click="changeCurrentAddress"> + <view> + <image style="width: 30rpx;height: 30rpx;" class="m-t-2" + src="https://hmy-flower.oss-cn-shanghai.aliyuncs.com/a2/a248385d4fe748ca81ee058ea5bf8c47icon-address.jpg"> + </image> + </view> + <view>重新定位</view> + </view> + </view> + </view> + <view class="m-t-12 "> + <view class="desc-gray">我的收获地址</view> + + </view> <no-data v-if="!list||list.length==0" style="width: 100%;"></no-data> <!-- 循环 --> - <view v-for="(item,index) of list" :key="index" class="location-each"> + <view v-for="(item,index) of list" :key="index" class="location-each m-t-12"> <view class="flex"> <view class="container-info"> <view class="flex"> @@ -38,7 +68,7 @@ @click="changeDefaultAddress(item,index)"> </view> - <span class="desc">{{ item.isDefault ? '默认地址:' : '当前地址:' }}{{ item.address || '' }}</span> + <span class="desc" style="word-break: break-all;">{{ item.isDefault ? '默认地址:' : '当前地址:' }}</span> <!-- 当前地址/默认地址勾选 --> </view> <view class="desc del t-red" @click="deleteAddress(item)"> @@ -53,8 +83,8 @@ <view style="height: 92rpx;width: 690rpx;"> </view> - <view class="button-green button-fixed-bottom" style="width: 690rpx;line-height: 92rpx;height: 92rpx;" - @click="addAddress">添加收货地址 + <view class="button-green button-fixed-bottom" v-if="currentInfo.id" + style="width: 690rpx;line-height: 92rpx;height: 92rpx;" @click="addAddress">添加收货地址 </view> <uni-popup ref="popup_form" type="top" :mask-click="false"> @@ -78,7 +108,8 @@ 手机号 </view> <view class="form-item-value"> - <input v-model="submitForm.tel" placeholder="请输入收货人手机号" class="form-input"></input> + <input v-model="submitForm.tel" placeholder="请输入收货人手机号" class="form-input" + @blur="validatePhoneNumber()"></input> </view> </view> <view class="form-item"> @@ -97,13 +128,21 @@ </view> - <view class="form-item"> + <view class="form-item" style="height: unset;min-height: 36rpx;"> <view class="form-item-label require"> 详细地址 </view> - <view class="form-item-value"> - <input v-model="submitForm.address" placeholder="请输入详细地址" class="form-input"></input> + <view class="form-item-value flex flex1"> + <input v-model="submitForm.address" placeholder="请输入详细地址" class="form-input flex1"></input> + <!-- <u-textarea v-model="submitForm.address" autoHeight placeholder="请输入详细地址" class="form-input flex1" > + + </u-textarea> + <view class="m-l-15 m-r-0 flex m-t-8" style="min-width: 120rpx;color: #7CC662;text-align: right;" + @click="selectWxAddress('form')"> + <uni-icons color="#7CC662" type="location" size="18"></uni-icons> + 定位 + </view> --> </view> </view> <view class="form-item"> @@ -126,9 +165,12 @@ </template> <script> + // #ifdef PUB_CUSTOMER // import qqmapwx from '@/plugins/qqmap-wx-jssdk.min.js'; - // const lockey = 'VUHBZ-2AMLP-B7AD7-VUQZ7-D4TW5-MFFVN'; //使用在腾讯位置服务申请的key - // const chooseLocation = requirePlugin('chooseLocation'); + // const lockey = 'GSBBZ-CJA3U-NNDVH-GE65N-6FIF6-ZGBCU'; //使用在腾讯位置服务申请的key + // const chooseLocation = requirePlugin('chooseLocation'); + // #endif + import { mapState } from 'vuex' @@ -142,14 +184,54 @@ // this.list = [{}, {}] this.source = options.source || '' this.listApi = '/api/address/list' - await this.getList() + if (!this.currentInfo.id) { + } else { + await this.getList() + + } + + }, + onShow() { + // const location = chooseLocation.getLocation(); // 如果点击确认选点按钮,则返回选点结果对象,否则返回null + // // console.log('onshow location', location, this.tmp_picker_lock_index, this.formcodes["LOC_ONE"]) + // // address: "江苏省苏州市吴中区太湖东路280号" + // // city: "苏州市" + // // district: "吴中区" + // // latitude: 31.262438 + // // longitude: 120.633985 + // // name: "太湖东路280号小区" + // // province: "江苏省" + // if (location && location.address) { + // this.submitForm.address = location.address + // this.submitForm.latitude = location.latitude + // this.submitForm.longitude = location.longitude + // if (!this.submitForm.province && location.province) { + // this.submitForm.province = location.province + // if (!this.submitForm.city && location.city) { + // this.submitForm.city = location.city + // } + // if (!this.submitForm.region && location.district) { + // this.submitForm.region = location.district + // } + // if (!this.submitForm.region && location.city) { + // this.submitForm.region = location.city + // } + // } + // this.$forceUpdate() + // } }, computed: { ...mapState({ address: state => { return state.defaultaddress || {} }, + addressDesc: state => { + return state.addressDesc || '' + }, + // search_flow() { + // return this.addressDesc || '' + // } }), }, @@ -164,13 +246,99 @@ province: '', city: '', region: '', - + latitude: 0, + longitude: 0, }, regionDataPlus: [], list: [], + search_flow: '', }; }, methods: { + selectWxAddress(source) { + let that = this + + { + //表单选择了地址 + wx.chooseLocation({ + success: location => { + console.log('success loc', location) + // address: "江苏省苏州市吴中区太湖东路288号" + // errMsg: "chooseLocation:ok" + // latitude: 31.26249 + // longitude: 120.63212 + // name: "苏州市吴中区人民政府" + if (source === 'form') { + // (location.address || '') + + that.submitForm.address = (location.name || '') + that.submitForm.latitude = location.latitude || 0 + that.submitForm.longitude = location.longitude || 0 + } else if (source === 'input') { + // (location.address || '') + + // that.search_flow = (location.name || '') + that.$store.commit('setAddressDesc', (location.name || '')) + } + + // if (!that.submitForm.province && location.provinceName) { + // that.submitForm.province = location.provinceName + // if (!that.submitForm.city && location.cityName) { + // that.submitForm.city = location.cityName + // } + // if (!that.submitForm.region && location.countyName) { + // that.submitForm.region = location.countyName + // } + // if (!that.submitForm.region && location.cityName) { + // that.submitForm.region = location.cityName + // } + // } + // success loc + // {errMsg: "chooseAddress:ok", userName: "张三", nationalCode: "510000", telNumber: "020-81167888", postalCode: "510000", …} + // cityName: "广州市" + // countyName: "海珠区" + // detailInfo: "新港中路397号" + // errMsg: "chooseAddress:ok" + // nationalCode: "510000" + // postalCode: "510000" + // provinceName: "广东省" + // telNumber: "020-81167888" + // userName: "张三" + }, + fail: e => { + console.log('fail loc', e) + // that.$message.showToast('定位失败') + } + }) + // uni.getLocation({ + // type: 'wgs84', + // success(res) { + // //得到经纬度 + // console.log(res); + // const referer = '花满芫'; //调用插件的app的名称 + // const location = JSON.stringify({ + // latitude: res.latitude, + // longitude: res.longitude + // }); + // const category = '生活服务,娱乐休闲'; + // // &category=${category} + + // wx.navigateTo({ + // url: `plugin://chooseLocation/index?key=${lockey}&referer=${referer}&location=${location}` + // }); + + // } + // }) + } + }, + validatePhoneNumber() { + + // 手机号码正则表达式,可以根据需要调整 + const phoneRegex = /^[1][3-9][0-9]{9}$/; + if (!phoneRegex.test(this.submitForm['tel'])) { + this.$message.showToast('请填写正确手机号码') + } + + }, + addAddress() { delete this.submitForm.id this.submitForm['name'] = '' @@ -181,6 +349,50 @@ this.submitForm['region'] = '' this.submitForm['isDefault'] = false this.openAddressForm() + }, + changeCurrentAddress() { + // if(!this.addressDesc){ + + // } + let that = this + this.$message.showLoading() + uni.getLocation({ + type: 'gcj02', + geocode: true, + success: async (res) => { + // this.location = { + // latitude: res.latitude, + // longitude: res.longitude, + // speed: res.speed, + // accuracy: res.accuracy, + // address: res.address, + // }; + const { + code,data + } = that.$http.request('get', '/api/pub/customer/home/address/parse', { + data: {}, + params: { + // https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=[你的key]&get_poi=1 + location:`${res.latitude},${res.longitude}` + } + }) + console.log('定位成功:', data); + if(data){ + var address = data.address || '' + + that.$store.commit('setAddressDesc', (address || '')) + } + + + }, + fail: (err) => { + this.error = err; + console.error('定位失败:', err); + }, + complete() { + this.$message.hideLoading() + } + }); }, PickArea(item, e) { console.log('PickArea', item, e) @@ -219,12 +431,19 @@ }, async init_area() { if (this.regionDataPlus && this.regionDataPlus.length > 0) { - - }else{ - const res = await this.$http.request('get', '/api/pub/china/area/json') - this.regionDataPlus = res.data && JSON.parse(res.data.replaceAll('code', 'value').replaceAll( - 'name', - 'text')) || [] + + } else { + var a = this.$storage.getItem('cache_area') + if (a) { + this.regionDataPlus = JSON.parse(a) || [] + } else { + const res = await this.$http.request('get', '/api/pub/china/area/json') + // console.log('area', JSON.parse(res.data)) + this.regionDataPlus = res.data && JSON.parse(res.data.replaceAll('code', 'value').replaceAll( + 'name', + 'text')) || [] + this.$storage.setItem('cache_area', JSON.stringify(this.regionDataPlus)) + } } }, @@ -386,6 +605,20 @@ this.$message.showToast('字段未填写完整') return } + if (!this.submitForm['province'] || !this.submitForm['province'] || !this.submitForm['province']) { + this.$message.showToast('省市区未选择完整') + return + } + + // 手机号码正则表达式,可以根据需要调整 + const phoneRegex = /^[1][3-9][0-9]{9}$/; + if (!phoneRegex.test(this.submitForm['tel'])) { + this.$message.showToast('请填写正确手机号码') + return + } + + + this.$message.showLoading() const { code @@ -397,11 +630,18 @@ if (code === 0) { this.$refs.popup_form.close() this.$message.showToast(this.submitForm.id ? '修改成功' : '新增成功') + let tmp = this setTimeout(() => { tmp.page.current = 1 tmp.refreshList() }, 300) + //如果当前选择的地址是这个,需要更新一下数据 + if (this.address.id && this.submitForm.id === this.address.id) { + this.$store.commit('setDefaultAddress', { + ...this.submitForm + }) + } } }, @@ -411,6 +651,14 @@ <style lang="scss" scoped> .container-address { + .current-address { + padding: 20rpx; + background-color: #FFFFFF; + border-radius: 16rpx; + margin-top: 16rpx; + margin-bottom: 20rpx; + } + .popup-address-form { background: #FFFFFF; border-radius: 16rpx; -- Gitblit v1.9.3