# 2022-02-12

### 1.3.5 开源社区版:
无
### 0.1.7 会员专业版:
【新增】表【CoreCmsUserShip】增加【精度longitude】【纬度latitude】【街道street】三字段。
【新增】用户地址新增及编辑增加地图选择获取街道及经纬度坐标功能。
【新增】【平台设置-订单管理】,新增【同城配送运费设置】,可设置2公里内,5公里内,10公里内,15公里内,20公里内不同距离运费。根据用户地址坐标与门店坐标进行计算。
【新增】商品详情轮播图增加视频图片混播结合功能,类似淘宝打开商品详情后显示视频并支持播放,左右滑动切换图片,实现混播。
【新增】商品添加/删除面板增加视频上传功能。
This commit is contained in:
JianWeie
2022-02-12 02:25:01 +08:00
parent 534cf303ba
commit a07106127e
31 changed files with 924 additions and 181 deletions

View File

@@ -257,20 +257,20 @@
"navigationBarTitleText": "打赏"
}
},
{
"path": "pages/activity/solitaire/list/list",
"style": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "接龙"
}
},
{
"path": "pages/activity/solitaire/solitaireDetails/solitaireDetails",
"style": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "接龙详情"
}
},
{
"path": "pages/activity/solitaire/list/list",
"style": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "接龙"
}
},
{
"path": "pages/activity/solitaire/solitaireDetails/solitaireDetails",
"style": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "接龙详情"
}
},
{
"path": "pages/template",
"style": {
@@ -375,6 +375,13 @@
"navigationBarTitleText": "修改地址"
}
},
{
"path": "address/map/map",
"style": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "选取街道"
}
},
{
"path": "setting/index/index",
"style": {

View File

@@ -12,7 +12,7 @@
</u-navbar>
<!--幻灯片-->
<view class="coreshop-full-screen-banner-swiper-box">
<u-swiper height="325" :list="goodsInfo.album" indicator indicatorMode="line" circular @click="clickImg"></u-swiper>
<u-swiper height="325" :list="goodsInfo.album" :autoplay="autoplay" indicator indicatorMode="line" circular @click="clickImg"></u-swiper>
</view>
<!--限时秒杀-->
<view class="coreshop-limited-seckill-box coreshop-bg-red">
@@ -435,7 +435,8 @@
commonQuestion: [],
delivery: [],
service: [],
}
},
autoplay: true
}
},
onLoad(options) {
@@ -587,6 +588,12 @@
let info = res.data;
let products = res.data.product;
_this.goodsInfo = info;
if (_this.goodsInfo.album && _this.goodsInfo.video) {
_this.goodsInfo.album.unshift(_this.goodsInfo.video);
_this.autoplay = false;
}
_this.isfav = res.data.isFav;
_this.product = _this.spesClassHandle(products);
@@ -611,6 +618,12 @@
let info = res.data;
let products = res.data.product;
_this.goodsInfo = info;
if (_this.goodsInfo.album && _this.goodsInfo.video) {
_this.goodsInfo.album.unshift(_this.goodsInfo.video);
_this.autoplay = false;
}
_this.isfav = res.data.isFav;
_this.product = _this.spesClassHandle(products);

View File

@@ -38,6 +38,33 @@
<!-- #endif -->
</u-form-item>
<u-form-item label="选取街道" borderBottom>
<!-- 注意由于兼容性差异如果需要使用前后插槽nvue下需使用u--input非nvue下需使用u-input -->
<!-- #ifndef APP-NVUE -->
<u-input :value="form.street" type="text" disabled placeholder="请选择街道">
<template slot="suffix">
<u-button text="选择" type="success" size="mini" @click="toMap"></u-button>
</template>
</u-input>
<!-- #endif -->
<!-- #ifdef APP-NVUE -->
<u--input :value="form.street" type="text" disabled placeholder="请选择街道">
<template slot="suffix">
<u-button text="选择" type="success" size="mini" @click="toMap"></u-button>
</template>
</u--input>
<!-- #endif -->
</u-form-item>
<u-form-item label="经度" prop="longitude" borderBottom>
<u--input v-model="form.longitude" disabled placeholder="请选择街道获取经度" />
</u-form-item>
<u-form-item label="纬度" prop="latitude" disabled borderBottom>
<u--input v-model="form.latitude" disabled placeholder="请选择街道获取纬度" />
</u-form-item>
<u-form-item label="详细地址" prop="address" borderBottom clearValidate>
<u--textarea v-model="form.address" placeholder="请输入内容"></u--textarea>
<!--<u--input v-model="form.address" placeholder="请填写收货详细地址" type="textarea" />-->
@@ -65,6 +92,9 @@
mobile: '',
address: '',
isDefault: 2,
longitude: '',
latitude: '',
street: ''
},
region: ['湖南省', '怀化市', '鹤城区'],
areaId: 0,
@@ -132,7 +162,6 @@
//this.pickerValue = this.region[0] + " " + this.region[1] + " " + this.region[2];
//this.init();
}
console.log(this.pickerList);
},
computed: {},
onReady() {
@@ -140,7 +169,6 @@
},
methods: {
onConfirm(e) {
console.log(e);
let provinceName = e[0].label;
let cityName = e[1].label;
let countyName = e[2].label;
@@ -150,7 +178,6 @@
cityName: cityName,
countyName: countyName
}
//let regionName = [provinceName, cityName, countyName];
this.$u.api.getAreaId(data).then(res => {
if (res.status) {
this.areaId = res.data;
@@ -180,6 +207,9 @@
this.pickerValue = this.region[0] + " " + this.region[1] + " " + this.region[2]
this.form.address = res.data.address;
this.form.isDefault = res.data.isDefault;
this.form.longitude = res.data.longitude;
this.form.latitude = res.data.latitude;
this.form.street = res.data.street;
if (res.data.isDefault) {
this.checked = true;
this.isDefault = 1;
@@ -235,8 +265,14 @@
} else if (this.areaId <= 0) {
this.$u.toast('请选择地区信息')
return false
} else if (!this.form.address) {
this.$u.toast('请输入收货地址详细信息')
} else if (!this.form.street) {
this.$u.toast('请选择街道')
return false
} else if (!this.form.latitude) {
this.$u.toast('请选择街道获取纬度')
return false
} else if (!this.form.longitude) {
this.$u.toast('请选择街道获取经度')
return false
}
let data = {
@@ -244,7 +280,10 @@
address: this.form.address,
mobile: this.form.mobile,
isDefault: this.form.isDefault,
areaId: this.areaId
areaId: this.areaId,
longitude: this.form.longitude,
latitude: this.form.latitude,
street: this.form.street,
}
if (this.id && this.id != 0) {
//编辑存储
@@ -324,8 +363,16 @@
init() {
this.getFullPath(this.areaId, this.province);
this.pickerIndex = [this.provinceKey, this.cityKey, this.areaKey];
console.log(this.pickerIndex);
},
toMap() {
if (!this.pickerValue) {
this.$u.toast('请先获取省市区信息');
return false;
} else {
this.$u.route('/pages/member/address/map/map', { pickerValue: this.pickerValue, });
}
}
},
}

View File

@@ -21,7 +21,7 @@
</view>
</view>
<view class="bottom" @click="isSelect(item)">
{{item.areaName + item.address}}
{{item.areaName }} {{item.street}} {{item.address}}
<u-icon name="edit-pen-fill" :size="20" color="#999999" v-show="type != 'order'" @click="toEdit(item.id)"></u-icon>
</view>
</view>
@@ -30,13 +30,11 @@
<view class="coreshop-emptybox" v-else>
<u-empty :icon="$globalConstVars.apiFilesUrl+'/static/images/empty/address.png'" icon-size="150" text="暂无地址信息" mode="list"></u-empty>
</view>
<view class="coreshop-bottomBox">
<!-- #ifdef MP-WEIXIN -->
<button class="coreshop-btn coreshop-btn-square coreshop-btn-b" @click="wechatAddress">从微信获取</button>
<!-- #endif -->
<button class="coreshop-btn coreshop-btn-square coreshop-btn-w" @click="toAdd()">新增收货地址</button>
</view>
<!--按钮-->
<view class="coreshop-bg-white coreshop-footer-fixed coreshop-foot-padding-bottom">
<u-button class="coreshop-percent-100" type="error" size="normal" @click="toAdd">新增收货地址</u-button>
</view>
</view>
</view>
</template>

View File

@@ -0,0 +1,21 @@
.controls-location { height: 30px; width: 30px; position: absolute; }
.server-place { position: fixed; left: 0; top: 0; height: 100vh; width: 100%; background: #ffffff; z-index: 999;
.map-tools { position: fixed; width: 100%; bottom: 30rpx; left: 0; display: flex; justify-content: center; align-items: center; flex-direction: column;
.my-location { width: 90%; margin: 0 auto; height: 120rpx; box-shadow: 0px 3px 20px rgba(0, 0, 0, 0.2); background: #fff; border-radius: 20rpx; display: flex; justify-content: flex-start; align-items: center; overflow: hidden;
.left { background: #3384ff; height: 120rpx; width: 120rpx; }
.right { margin-left: 20rpx; color: #111; display: flex; justify-content: center; align-items: flex-start; flex-direction: column;
.title { font-size: 28rpx; font-weight: bold; }
.text { font-size: 26rpx; width: 500rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: #3384FF; margin-top: 10rpx; }
}
}
.start-place { width: 85%; margin: 0 auto; margin: 0 auto; margin-top: 20rpx; box-shadow: 0px 3px 20px rgba(0, 0, 0, 0.2); background: #fff; border-radius: 20rpx; padding: 20rpx;
.place { display: flex; justify-content: flex-start; align-items: center;
.title { font-size: 28rpx; font-weight: bold; color: #111; }
.text { font-size: 28rpx; color: #3384FF; font-weight: bold; width: 450rpx; display: inline-block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
}
.tip { font-size: 22rpx; color: #666; margin-top: 15rpx; }
.sure { margin-top: 15rpx; color: #FFFFFF; background: #212121; font-weight: blod; font-size: 32rpx; }
}
}
}

View File

@@ -0,0 +1,292 @@
<template>
<view class="server-place">
<u-toast ref="uToast" /><u-no-network></u-no-network>
<u-navbar title="我的位置" safeAreaInsetTop fixed placeholder>
<view class="coreshop-navbar-left-slot" slot="left">
<u-icon name="arrow-left" size="19" @click="goNavigateBack"></u-icon>
<u-line direction="column" :hairline="false" length="16" margin="0 8px"></u-line>
<u-icon name="home" size="22" @click="goHome"></u-icon>
</view>
<view slot="right">
</view>
</u-navbar>
<map id='map'
ref='map'
v-bind:style="{height: mapH + 'px'}"
style="width: 100%;"
:latitude="latitude"
:longitude="longitude"
:controls='controls'
:markers="covers"
@regionchange='mapChange'>
</map>
<!-- #ifndef APP-PLUS -->
<cover-image v-bind:style="{left: controlsLeft + 'px', top: controlsTop + 'px'}" class="controls-location" :src="positionIcon"></cover-image>
<!-- #endif -->
<view class="map-tools">
<view class="my-location" @tap="toMyLocation">
<image class="left" :src="myPositionIcon" mode=""></image>
<view class="right">
<text class="title">我的位置</text>
<text class="text">{{myAddress}}</text>
</view>
</view>
<view class="start-place">
<view class="place">
<text class="title">{{tipText}}</text>
<text class="text">{{addressObj.address}}</text>
</view>
<view class="tip">{{descText}}</view>
<button @tap="submitAdress" class="sure" type="primary">确认选择</button>
</view>
</view>
</view>
</template>
<script>
var QQMapWX = require('./qqmap-wx-jssdk.min.js')
var qqmapsdk = new QQMapWX({
key: 'SJTBZ-6H5C2-3F5UG-CCJIS-RZPXJ-I6FBY'
})
export default {
data() {
return {
mapH: 0,// 地图高度可在initMapH()中设置高度
mapW: 0, // 屏幕宽度
longitude: 0, // 初始经度
latitude: 0, // 初始纬度
myAddress: '', // 初始地址信息
addressObj: { // 地图选点信息
longitude: '',
latitude: '',
address: ''
},
// cover-image的默认 超出屏幕外 不然会有闪烁出现
controlsLeft: 1000,
controlsTop: 1000,
controls: [], // 地图中心点图标, 可更换iconPath, 详情见官方文档关于map组件的介绍
tipText: '选择位置',
descText: '使用当前定位或在地图上标记位置',
positionIcon: 'https://files.cdn.coreshop.cn/static/images/map/positionIcon.png',
myPositionIcon: 'https://files.cdn.coreshop.cn/static/images/map/myPositionIcon.png',
covers: [{
'longitude': 0,
'latitude': 0
}],
};
},
onLoad(e) {
console.log(e);
this.getLocation()
this.initMapH()
this.initPositionIcon();
},
methods: {
// 初始化地图中心位置的定位图片
initPositionIcon() {
setTimeout(() => {
// H5 微信小程序 使用<cover-image>
// #ifndef APP-PLUS
this.controlsLeft = this.mapW / 2 - 10
this.controlsTop = this.mapH / 2
// #endif
// App使用map的controls
// #ifdef APP-PLUS
var controls = {
id: '1',
iconPath: this.positionIcon,
position: {
left: this.mapW / 2 - 10,
top: this.mapH / 2 - 100,
width: 30,
height: 30,
},
clickable: false
}
this.controls.push(controls)
console.log(this.controls, '==========');
// #endif
}, 100)
},
// 查询现在的位置
getLocation() {
let this_ = this
uni.getLocation({
// type: 'gcj02', // 返回国测局坐标
geocode: true,
success: function (res) {
this_.initMap(res)
console.log(res);
},
fail: function (e) {
uni.showToast({
icon: 'none',
title: '获取地址失败, 请检查是否开启定位权限~~'
})
}
})
},
// 初始化我的位置
async initMap(res) {
this.longitude = res.longitude;
this.latitude = res.latitude;
this.myAddress = await this.getAddressName(res);
this.addressObj = Object.assign({}, this.addressObj, {
longitude: res.longitude,
latitude: res.latitude,
address: this.myAddress
})
},
// 地图选择位置后 查询地点名称
async checkMap(res) {
this.addressObj = Object.assign({}, this.addressObj, {
longitude: res.longitude,
latitude: res.latitude,
address: await this.getAddressName(res)
})
console.log('当前位置:' + res.latitude + '|' + res.longitude);
},
// 监听地图位置变化
mapChange(e) {
let that = this
clearTimeout(this.timer)
this.timer = setTimeout(() => {
if (e.type == 'regionchange' || e.type == 'end') {
that.mapCtx = uni.createMapContext('map', this)
that.mapCtx.getCenterLocation({
success: res => {
this.checkMap(res)
console.log(res);
},
fail: err => {
console.log(err);
}
})
}
}, 200)
},
// 查询地图中心点的名称
getAddressName(addressObj) {
return new Promise((res) => {
// #ifdef APP-PLUS
qqmapsdk.reverseGeocoder({
location: {
latitude: addressObj.latitude,
longitude: addressObj.longitude
},
get_poi: 1,
poi_options: "page_size=1;page_index=1",
output: 'jsonp',
success: (e) => {
res(e.result.formatted_addresses.recommend);
},
fail: err => {
res(err);
}
})
// #endif
// #ifdef H5
// ======================== jsonp跨域 ========================
const KEY = 'SJTBZ-6H5C2-3F5UG-CCJIS-RZPXJ-I6FBY'
let locationObj = addressObj.latitude + ',' + addressObj.longitude
let url = 'https://apis.map.qq.com/ws/geocoder/v1?coord_type=5&get_poi=1&output=jsonp&poi_options=page_size=1;page_index=1';
this.$jsonp(url, {
key: KEY,
location: locationObj
}).then(e => {
res(e.result.formatted_addresses.recommend);
})
.catch(err => {
res(err);
})
// #endif
// #ifdef MP-WEIXIN
console.log(addressObj, '======================');
qqmapsdk.reverseGeocoder({
location: {
latitude: addressObj.latitude,
longitude: addressObj.longitude
},
get_poi: 1,
poi_options: "page_size=1;page_index=1",
output: 'jsonp',
success: (e) => {
res(e.result.formatted_addresses.recommend);
},
fail: err => {
res(err);
}
})
// #endif
})
},
// 计算地图的高度
initMapH() {
// #ifdef APP-PLUS
this.mapW = uni.getSystemInfoSync().windowWidth
this.mapH = uni.getSystemInfoSync().windowHeight - 210;
// #endif
// #ifndef APP-PLUS
this.mapW = uni.getSystemInfoSync().windowWidth
this.mapH = uni.getSystemInfoSync().windowHeight - 170;
// #endif
// #ifdef MP-WEIXIN
this.mapW = uni.getSystemInfoSync().windowWidth
this.mapH = uni.getSystemInfoSync().windowHeight - 210;
// #endif
},
// 移动到我的位置
toMyLocation() {
this.getLocation()
},
// 提交
submitAdress() {
console.log(this.addressObj);
this.controls = []
//setTimeout(() => {
// this.$emit('updateAddress', this.addressObj)
//}, 100)
let pages = getCurrentPages();//当前页
let beforePage = pages[pages.length - 2];//上个页面
// #ifdef MP-ALIPAY || MP-TOUTIAO
this.$db.set('addressObj', this.addressObj, true);
// #endif
// #ifdef H5 || APP-PLUS || APP-PLUS-NVUE
this.$store.commit("addressObj", this.addressObj)
// #endif
// #ifdef MP-WEIXIN
beforePage.$vm.form.longitude = this.addressObj.longitude;
beforePage.$vm.form.latitude = this.addressObj.latitude;
beforePage.$vm.form.street = this.addressObj.address;
// #endif
uni.navigateBack({
delta: 1
});
}
}
};
</script>
<style scoped lang="scss">
@import "map.scss";
</style>

File diff suppressed because one or more lines are too long

View File

@@ -30,7 +30,7 @@
<text class="coreshop-margin-left-10">{{ userShip.mobile || ''}}</text>
</view>
<view class="coreshop-text-gray coreshop-font-sm flex">
<view class="u-line-1">{{ userShip.areaName || ''}} {{userShip.address || ''}}</view>
<view class="u-line-2">{{ userShip.areaName || ''}} {{userShip.street || ''}} {{userShip.address || ''}}</view>
</view>
</view>
<view class="action coreshop-text-gray">
@@ -65,7 +65,7 @@
<text class="coreshop-margin-left-10">{{store.mobile|| ''}}</text>
</view>
<view class="coreshop-text-gray coreshop-font-sm flex">
<view class="u-line-1">{{store.address|| ''}}</view>
<view class="u-line-2">{{store.address|| ''}}</view>
</view>
</view>
<view class="action coreshop-text-gray">
@@ -263,6 +263,7 @@
receiptType: 1, // 订单类型 1快递物流发货订单2同城配送3是门店自提订单
params: {
ids: 0, // 传递过来的购物车id
userShipId: 0,
areaId: 0, // 收货地址id
couponCode: '', // 优惠券码列表(string)多张逗号分隔
point: 0,// 抵扣积分额
@@ -352,6 +353,7 @@
let userShip = this.$db.get('addressUserShip', true);
if (userShip) {
this.userShip = userShip;
this.params.userShipId = userShip.id;
this.params.areaId = userShip.areaId;
this.$db.del('addressUserShip', true);
}
@@ -370,6 +372,7 @@
let userShip = this.$store.state.userShip;
if (userShip) {
this.userShip = userShip;
this.params.userShipId = userShip.id;
this.params.areaId = userShip.areaId;
}
let userInvoice = this.$store.state.invoice;
@@ -445,6 +448,7 @@
this.$u.api.userDefaultShip().then(res => {
if (res.status && res.data && Object.keys(res.data).length) {
this.userShip = res.data
this.params.userShipId = this.userShip.id;
this.params.areaId = this.userShip.areaId
this.storePick.name = res.data.name;