1 Commits

Author SHA1 Message Date
e263a616f6 tmp: 部分代码与UnishopV5结合,但是代码有严重缺陷 2025-12-20 15:30:39 +08:00
182 changed files with 31397 additions and 18620 deletions

13
App.vue
View File

@@ -40,7 +40,7 @@
// #endif // #endif
// #ifdef H5 // #ifdef H5
if (uni.getSystemInfoSync().platform == 'ios') { if (uni.getDeviceInfo().platform == 'ios') {
uni.setStorageSync('initUrl', location.href); uni.setStorageSync('initUrl', location.href);
} }
// #endif // #endif
@@ -151,7 +151,6 @@
onShow: function(options) { onShow: function(options) {
// #ifdef MP // #ifdef MP
// 自动授权登录 // 自动授权登录
this.getAuthInfo();
if (this.$store.state.token) { if (this.$store.state.token) {
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/member/info', url: '/api/member/info',
@@ -161,6 +160,8 @@
} }
} }
}); });
}else{
this.getAuthInfo();
} }
// #endif // #endif
@@ -177,8 +178,7 @@
// #ifdef H5 // #ifdef H5
if (this.$util.isWeiXin()) { if (this.$util.isWeiXin()) {
this.$util.getUrlCode(urlParams => { this.$util.getUrlCode(urlParams => {
if (urlParams.source_member) uni.setStorageSync('source_member', urlParams if (urlParams.source_member) uni.setStorageSync('source_member', urlParams.source_member);
.source_member);
if (urlParams.code == undefined) { if (urlParams.code == undefined) {
this.$api.sendRequest({ this.$api.sendRequest({
@@ -204,8 +204,7 @@
let data = {}; let data = {};
if (res.data.openid) data.wx_openid = res.data.openid; if (res.data.openid) data.wx_openid = res.data.openid;
if (res.data.unionid) data.wx_unionid = res.data.unionid; if (res.data.unionid) data.wx_unionid = res.data.unionid;
if (res.data.userinfo) Object.assign(data, res.data if (res.data.userinfo) Object.assign(data, res.data.userinfo);
.userinfo);
this.authLogin(data); this.authLogin(data);
} }
} }
@@ -301,7 +300,7 @@
this.shareConfig(); this.shareConfig();
} }
}, },
// 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法 // 代表在watch里声明了firstName这个方法之后立即先去执行handler方法
immediate: true immediate: true
} }
} }

View File

@@ -194,6 +194,11 @@ image {
color: #202021; color: #202021;
font-size: $font-size-toolbar; font-size: $font-size-toolbar;
} }
.store-close-desc{
color: red;
font-size: $font-size-tag;
margin-bottom: 10rpx;
}
.address { .address {
color: #5f6067; color: #5f6067;
font-size: $font-size-tag; font-size: $font-size-tag;
@@ -232,3 +237,69 @@ image {
.page-bottom { .page-bottom {
margin-top: 20rpx; margin-top: 20rpx;
} }
.chain-stores{
.chain-store-popup{
background-color: #fff;
border-top-left-radius: 24rpx;
border-top-right-radius: 24rpx;
overflow: hidden;
.title{
font-size: 36rpx;
line-height: 104rpx;
text-align: center;
color: #000;
font-weight: bold;
}
.body{
padding: 20rpx 30rpx;
background-color: #F4F4F4;
padding-bottom: calc(20rpx + constant(safe-area-inset-bottom)) !important;
padding-bottom: calc(20rpx + env(safe-area-inset-bottom)) !important;
.center{
background-color: #fff;
box-shadow: 4rpx 4rpx 12rpx 4rpx rgba(0,0,0,0.02);
border-radius: 24rpx;
padding-top: 60rpx;
padding-bottom: 23rpx;
.image{
display: flex;
justify-content: center;
}
.text-top{
margin-top: 44rpx;
font-size: 30rpx;
font-weight: bold;
color: #000;
line-height: 42rpx;
text-align: center;
}
.text-bottom{
margin-top: 20rpx;
padding: 0 57rpx;
font-size: 24rpx;
line-height: 34rpx;
color: #999;
text-align: center;
}
.footer{
display: flex;
margin-top: 20rpx;
padding: 0 24rpx;
button{
margin: 0 !important;
box-sizing: border-box;
height: 84rpx;
line-height: 84rpx;
border-radius: 62rpx;
font-size: 30rpx;
flex:1;
}
button.btn-right{
margin-left: 20rpx !important;
}
}
}
}
}
}

View File

@@ -683,6 +683,12 @@
} }
} }
.item-close-desc{
font-size: $font-size-tag;
color: red;
margin-bottom: 10rpx;
}
.item-time { .item-time {
font-size: $font-size-activity-tag; font-size: $font-size-activity-tag;
color: $color-tip; color: $color-tip;
@@ -856,6 +862,9 @@
* { * {
max-width: 100% !important; max-width: 100% !important;
} }
img,image{
display: block;
}
} }
.goods-details.active { .goods-details.active {
min-height: 150rpx; min-height: 150rpx;
@@ -1164,6 +1173,9 @@
&.store-wrap { &.store-wrap {
height: auto; height: auto;
.label{
line-height: 34rpx;
}
.list-wrap { .list-wrap {
padding: 10rpx 0 16rpx; padding: 10rpx 0 16rpx;
width: 80%; width: 80%;
@@ -1186,6 +1198,12 @@
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
} }
}
.close-desc{
color:red;
font-size: $font-size-tag;
margin-top: 4rpx;
} }
.other-wrap { .other-wrap {
display: flex; display: flex;

File diff suppressed because one or more lines are too long

View File

@@ -7,8 +7,8 @@
$margin-both: 24rpx; $margin-both: 24rpx;
input, /deep/ input,
view { /deep/ view {
font-size: $font-size-tag; font-size: $font-size-tag;
} }
@@ -276,7 +276,7 @@ view {
.goods-wrap { .goods-wrap {
display: flex; display: flex;
position: relative; position: relative;
padding: 0rpx 0 10rpx 0; padding: 30rpx 0;
.goods-img { .goods-img {
width: 180rpx; width: 180rpx;
@@ -883,6 +883,9 @@ view {
view { view {
font-size: $font-size-tag; font-size: $font-size-tag;
} }
.close-desc{
color:red;
}
} }
} }
@@ -1066,6 +1069,10 @@ view {
} }
} }
.empty-local{
color: #ff443f;
}
// 配送方式 // 配送方式
.delivery-mode { .delivery-mode {
margin: 0 24rpx; margin: 0 24rpx;
@@ -1213,6 +1220,9 @@ view {
font-size: 26rpx; font-size: 26rpx;
} }
.store-detail{ .store-detail{
.close-desc{
color:red;
}
.address{ .address{
color: $color-sub; color: $color-sub;
width: 100%; width: 100%;

View File

@@ -23,10 +23,8 @@ export default {
}, },
success: res => { success: res => {
if (res.code >= 0) { if (res.code >= 0) {
if (res.data.openid) this.authInfo.weapp_openid = res.data if (res.data.openid) this.authInfo.weapp_openid = res.data.openid;
.openid; if (res.data.unionid) this.authInfo.wx_unionid = res.data.unionid;
if (res.data.unionid) this.authInfo.wx_unionid = res.data
.unionid;
typeof callback == 'function' && callback(this.authInfo); typeof callback == 'function' && callback(this.authInfo);
} else { } else {
this.$util.showToast({ this.$util.showToast({
@@ -62,8 +60,7 @@ export default {
}, },
success: res => { success: res => {
if (res.code >= 0) { if (res.code >= 0) {
if (res.data.user_id) this.authInfo.ali_openid = res.data if (res.data.user_id) this.authInfo.ali_openid = res.data.user_id;
.user_id;
typeof callback == 'function' && callback(this.authInfo); typeof callback == 'function' && callback(this.authInfo);
} else { } else {
this.$util.showToast({ this.$util.showToast({
@@ -74,7 +71,7 @@ export default {
}) })
} }
}, },
fail: (err) => { fail: (res) => {
this.$util.showToast({ this.$util.showToast({
title: res.errMsg title: res.errMsg
}); });

View File

@@ -1,7 +1,14 @@
import WxMap from 'common/js/map-wx-jssdk.js'; import { QQMapWX } from 'common/js/map-wx-jssdk.js';
import Config from '@/common/js/config.js'; import Config from '@/common/js/config.js';
let systemInfo = uni.getSystemInfoSync(); let systemInfo = {};
try {
// 合并设备信息和窗口信息
systemInfo = {...uni.getDeviceInfo(), ...uni.getWindowInfo()};
} catch (e) {
// 兼容旧版本
systemInfo = uni.getSystemInfoSync();
}
export default { export default {
data() { data() {
return { return {
@@ -35,6 +42,7 @@ export default {
latitude: null, // 纬度 latitude: null, // 纬度
longitude: null, // 经度 longitude: null, // 经度
currentPosition: '', // 当前位置 currentPosition: '', // 当前位置
currentStore: null,//当前门店
nearestStore: null, // 离自己最近的门店 nearestStore: null, // 离自己最近的门店
storeTimeOut: null, // 没有获取到定位,则获取默认门店 storeTimeOut: null, // 没有获取到定位,则获取默认门店
@@ -43,6 +51,8 @@ export default {
diyRoute: '', // 页面路由 diyRoute: '', // 页面路由
openBottomNav: false, openBottomNav: false,
isShowCopyRight: false, isShowCopyRight: false,
option: null,
firstDiy: true,
//启动广告 //启动广告
adv: {}, adv: {},
@@ -50,12 +60,17 @@ export default {
}; };
}, },
onLoad(option) { onLoad(option) {
this.option = option;
uni.hideTabBar(); uni.hideTabBar();
// 支付宝小程序传参处理
// #ifdef MP-ALIPAY
let aliapp_option = my.getLaunchOptionsSync();
aliapp_option.query && Object.assign(option, aliapp_option.query);
// #endif
if (option.source_member) uni.setStorageSync('source_member', option.source_member); // 处理分享人数据
if (option.source_member) uni.setStorageSync('source_member', option.source_member);// 分享链接进入
// 小程序扫码进入 if (option.scene) {// 小程序扫码进入
if (option.scene) {
var sceneParams = decodeURIComponent(option.scene); var sceneParams = decodeURIComponent(option.scene);
sceneParams = sceneParams.split('&'); sceneParams = sceneParams.split('&');
if (sceneParams.length) { if (sceneParams.length) {
@@ -65,64 +80,36 @@ export default {
} }
} }
// H5地图选择位置回调
// #ifdef H5 // #ifdef H5
// H5地图选择位置回调数据 // H5地图选择位置回调数据
if (option.module && option.module == 'locationPicker') { if (option.module && option.module == 'locationPicker') {
option.name = ''; // 清空地址 option.name = ''; // 自定义页面传参id和name防止获取地址时变量混淆
this.locationModule = option.module; this.locationModule = option.module;
this.latitude = option.latng.split(',')[0]; this.latitude = option.latng.split(',')[0];
this.longitude = option.latng.split(',')[1]; this.longitude = option.latng.split(',')[1];
} }
// #endif // #endif
//自定义页面的id和名称
this.id = option.id || 0; this.id = option.id || 0;
this.name = option.name || ''; this.name = option.name || '';
uni.removeStorageSync('manual_store_info'); // 清除手动切换门店缓存 //获取当前门店信息 必须是首页且不是手动切换操作
uni.removeStorageSync('manual_change_store'); // 清楚手动切换门店标识 let current_route = this.$util.getCurrentRoute();
let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店
// H5才会执行 if (current_route.path.indexOf('/pages/index/index') > -1 && !manualChangeStore) {
if (this.locationModule == 'locationPicker') { this.getCurrentStore(option);
// H5地图选址后的回调
this.getNearestStore();
this.getCurrentLocation();
} else if (this.mapConfig.wap_is_open == 1) {
// 每次都要定位,获取当前位置
/*this.$util.getLocation({
fail: (res) => {
// 拒绝定位,进入默认总店
this.enterDefaultStore();
} }
});*/
// 如果3秒没有获取到定位则获取默认门店H5使用
// #ifdef H5
this.storeTimeOut = setTimeout(() => {
this.enterDefaultStore();
}, 1000 * 3);
// #endif
} else {
// 关闭定位
this.enterDefaultStore();
}
}, },
onShow() { async onShow() {
if (this.firstDiy) {
this.init(); this.firstDiy = false;
await this.getDiyMethod();
}
await this.onShowMethod();
}, },
onHide() { onHide() {
if (this.storeTimeOut) {
clearTimeout(this.storeTimeOut);
}
// 跳转页面要关闭门店弹出框
this.closeChooseStorePopup();
// 清除限时秒杀定时器 // 清除限时秒杀定时器
this.$store.commit('setDiySeckillInterval', 0); this.$store.commit('setDiySeckillInterval', 0);
}, },
@@ -149,7 +136,7 @@ export default {
return str; return str;
}, },
backgroundUrl() { backgroundUrl() {
var str = this.diyData.global.bgUrl && this.diyData.global.bgUrl != 'transparent' ? 'url(' + this.$util.img(this.diyData.global.bgUrl) + ') ' : ''; var str = this.diyData.global?.bgUrl && this.diyData.global?.bgUrl != 'transparent' ? 'url(' + this.$util.img(this.diyData.global?.bgUrl) + ') ' : '';
return str; return str;
}, },
textNavColor() { textNavColor() {
@@ -187,30 +174,34 @@ export default {
} }
}, },
watch: { watch: {
location: function (nVal) { /* location: function (nVal) {
if (nVal) { if (nVal && !this.latitude && !this.longitude) {
this.latitude = nVal.latitude; this.latitude = nVal.latitude;
this.longitude = nVal.longitude; this.longitude = nVal.longitude;
this.getNearestStore(); this.getStoreInfoByLocation();
this.getCurrentLocation();
} }
}, */
initStatus: function (val) {
if (!this.option.store_id) this.getLocation();
} }
}, },
methods: { methods: {
play(){ async getDiyMethod() {
console.log(123) await this.getDiyInfo();
this.$store.commit('setDiySeckillInterval', 1);
this.$store.commit('setComponentRefresh');
}, },
async init() { async onShowMethod() {
// 定位信息过期后,重新获取定位 // 定位信息过期后,重新获取定位
if(this.mapConfig.wap_is_open == 1 && this.locationStorage && this.locationStorage.is_expired) { // if (this.mapConfig.wap_is_open == 1 && this.locationStorage && this.locationStorage.is_expired) {
this.$util.getLocation({ // this.$util.getLocation({
fail: (res) => { // fail: (res) => {
// 拒绝定位,进入默认总店 // // 失败了不需要做任何处理,保持之前的门店选择即可
this.enterDefaultStore(); // }
} // });
}); // }
}
if (this.storeToken) { if (this.storeToken) {
//记录分享关系 //记录分享关系
@@ -225,17 +216,15 @@ export default {
this.$store.commit('setDiySeckillInterval', 1); this.$store.commit('setDiySeckillInterval', 1);
//小程序分享
// #ifdef MP-WEIXIN
this.$util.getMpShare().then(res => {
this.mpShareData = res;
});
// #endif
let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店 let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店
if (manualChangeStore) { if (manualChangeStore) {
uni.removeStorageSync('manual_change_store'); uni.removeStorageSync('manual_change_store');
let manualStoreInfo = uni.getStorageSync('manual_store_info'); // 手动选择门店
uni.removeStorageSync('manual_store_info');
if (manualStoreInfo) {
this.currentStore = manualStoreInfo;
}
this.closeGetLocationFailPopup();
// 滚动至顶部 // 滚动至顶部
uni.pageScrollTo({ uni.pageScrollTo({
duration: 200, duration: 200,
@@ -267,8 +256,14 @@ export default {
query.select('.page-header').boundingClientRect(data => { query.select('.page-header').boundingClientRect(data => {
if (data && data.height) { if (data && data.height) {
// 从状态栏高度开始算 // 从状态栏高度开始算
if (!this.diyData.global.topNavBg) {
this.paddingTop = 0;
this.marginTop = 0;
} else {
this.paddingTop = data.height + 'px'; this.paddingTop = data.height + 'px';
this.marginTop = -data.height + 'px'; this.marginTop = -data.height + 'px';
}
clearInterval(time); clearInterval(time);
} }
}).exec(); }).exec();
@@ -337,7 +332,7 @@ export default {
this.$langConfig.title(this.diyData.global.title); this.$langConfig.title(this.diyData.global.title);
this.mpCollect = this.diyData.global.mpCollect; this.mpCollect = this.diyData.global.mpCollect;
this.setPublicShare(); this.setPublicShare();
/* if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) { if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) {
// 弹框形式,首次弹出 1每次弹出 0 // 弹框形式,首次弹出 1每次弹出 0
setTimeout(() => { setTimeout(() => {
if (this.diyData.global.popWindow.count == 1) { if (this.diyData.global.popWindow.count == 1) {
@@ -352,7 +347,7 @@ export default {
uni.setStorageSync(this.id + this.name + '_popwindow_count', 0); uni.setStorageSync(this.id + this.name + '_popwindow_count', 0);
} }
}, 500); }, 500);
}*/ }
// 修改diy数据结构排序 // 修改diy数据结构排序
let searchIndex = -1; let searchIndex = -1;
@@ -375,14 +370,15 @@ export default {
this.diyData.value.splice(topCategoryIndex, 1); this.diyData.value.splice(topCategoryIndex, 1);
this.diyData.value.splice(0, 0, ...topCategoryData); this.diyData.value.splice(0, 0, ...topCategoryData);
this.diyData.value.splice(1, 0, ...searchData); this.diyData.value.splice(1, 0, ...searchData);
} else } else {
this.diyData.value.splice(0, 0, ...searchData); this.diyData.value.splice(0, 0, ...searchData);
}
} else if (searchIndex != -1 && topCategoryIndex == -1) { } else if (searchIndex != -1 && topCategoryIndex == -1) {
let searchData = this.diyData.value.slice(searchIndex, searchIndex + 1); let searchData = this.diyData.value.slice(searchIndex, searchIndex + 1);
this.diyData.value.splice(searchIndex, 1); this.diyData.value.splice(searchIndex, 1);
this.diyData.value.splice(0, 0, ...searchData); this.diyData.value.splice(0, 0, ...searchData);
} }
this.topIndexValue = null;
for (var i = 0; i < this.diyData.value.length; i++) { for (var i = 0; i < this.diyData.value.length; i++) {
// 分类导航组件 // 分类导航组件
if (this.diyData.value[i].componentName == 'TopCategory') { if (this.diyData.value[i].componentName == 'TopCategory') {
@@ -402,7 +398,6 @@ export default {
} }
} }
// #ifdef MP // #ifdef MP
//小程序收藏 //小程序收藏
if (!uni.getStorageSync('isCollect') && this.diyData.global.mpCollect) { if (!uni.getStorageSync('isCollect') && this.diyData.global.mpCollect) {
@@ -416,6 +411,45 @@ export default {
this.openBottomNav = this.diyData.global.openBottomNav; this.openBottomNav = this.diyData.global.openBottomNav;
} }
this.isShowCopyRight = true; this.isShowCopyRight = true;
//小程序分享
// #ifdef MP-WEIXIN
let path = this.$util.getCurrentRoute().path;
if (path == '/pages/member/index') {
this.mpShareData = {};
return;
}
let share_path = path;
if (this.$store.state.memberInfo && this.$store.state.memberInfo.member_id) {
share_path = this.$util.getCurrentShareRoute(this.$store.state.memberInfo.member_id).path
}
let appMessageData = {
title: this.diyData.global.weappShareTitle,
path: share_path,
imageUrl: this.$util.img(this.diyData.global.weappShareImage),
success: res => { },
fail: res => { }
}
let timeLineData = {
title: this.diyData.global.weappShareTitle,
query: share_path,
imageUrl: this.$util.img(this.diyData.global.weappShareImage),
}
this.mpShareData = {
appMessage: appMessageData,
timeLine: timeLineData
};
//console.log(this.mpShareData, 'this.mpShareData');
var store_info = this.$store.state.globalStoreInfo;
if (store_info) {
this.mpShareData.appMessage.path += (this.mpShareData.appMessage.path.indexOf('?') > -1 ? '&' : '?') + 'store_id=' + store_info.store_id;
this.mpShareData.timeLine.query += (this.mpShareData.timeLine.query.indexOf('?') > -1 ? '&' : '?') + 'store_id=' + store_info.store_id;
}
//朋友圈不需要页面路径,只要要后面的参数就行
this.mpShareData.timeLine.query = this.mpShareData.timeLine.query.split('?')[1] || '';
// #endif
} }
}, },
closePopupWindow() { closePopupWindow() {
@@ -430,44 +464,131 @@ export default {
this.$util.diyRedirectTo(this.diyData.global.popWindow.link); this.$util.diyRedirectTo(this.diyData.global.popWindow.link);
this.closePopupWindow(); this.closePopupWindow();
}, },
/******************************************** 获取门店相关 START ***************************************************/
/**
* 1、分享携带门店id
* 门店id正确 进入门店
* 门店id错误 通过定位获取门店
* 2、通过定位获取门店
* 开启获取定位
* 同意获取定位 获取最近门店 进入门店
* 拒绝获取定位
* 平台运营模式 进入默认门店
* 连锁门店模式 提示获取定位失败,手动选择门店或引导去开启定位
* 关闭获取定位
* 平台运营模式 进入默认门店
* 连锁门店模式 提示获取定位失败,手动选择门店
*/
getCurrentStore(option) {
if (option.store_id && !isNaN(parseInt(option.store_id))) {
this.getStoreInfoByShare(option.store_id);
} else {
this.getLocation();
}
},
getStoreInfoByShare(store_id) {
this.$api.sendRequest({
url: '/api/store/info',
data: { store_id },
success: res => {
if (res.code >= 0 && res.data) {
this.changeCurrentStore(res.data);
} else {
this.getLocation();
}
},
fail: res => {
this.getLocation();
}
});
},
getLocation() {
if (!this.latitude && !this.longitude && this.initStatus) {
if (this.mapConfig.wap_is_open == 1) {
this.$util.getLocation({
complete: (res) => {
if (res.latitude && res.longitude) {
this.closeGetLocationFailPopup();
this.latitude = res.latitude;
this.longitude = res.longitude;
this.getStoreInfoByLocation();
} else {
let is_h5 = false;
// #ifdef H5
is_h5 = true;
// #endif
if (is_h5) {
//H5同意了也会进入失败所以直接进入默认门店
this.enterDefaultStore();
} else {
this.getLocationFail();
}
}
}
});
// #ifdef H5
//H5有的机型可能根本不会触发getLocation的任何执行包括successfailcompletele
//所以这里如果等待一定时间后还是没有获取到当前门店则进入默认门店
setTimeout(() => {
let current_route = this.$util.getCurrentRoute();
if (this.mapConfig.wap_is_open == 1 && !this.currentStore && current_route.path == '/pages/index/index') {
this.enterDefaultStore();
}
}, 5000);
// #endif
} else {
this.getLocationFail();
}
}
},
getStoreInfoByLocation() {
if (this.latitude && this.longitude) {
this.getNearestStore();
this.getCurrentLocation();
}
},
changeCurrentStore(store_info) {
this.currentStore = store_info;
this.changeStore(store_info);
this.openChooseStorePopup();
},
getLocationFail() {
if (this.globalStoreConfig.store_business == 'shop') {
this.enterDefaultStore();
} else {
this.openGetLocationFailPopup();
}
},
openGetLocationFailPopup() {
if (this.$refs.getLocationFailRef) this.$refs.getLocationFailRef.open();
},
closeGetLocationFailPopup() {
if (this.$refs.getLocationFailRef) this.$refs.getLocationFailRef.close();
},
openChooseStorePopup() { openChooseStorePopup() {
let globalStoreInfo = this.globalStoreInfo;
if (this.globalStoreConfig && this.globalStoreConfig.confirm_popup_control == 1) { if (this.globalStoreConfig && this.globalStoreConfig.confirm_popup_control == 1) {
let storeInfo = this.globalStoreInfo; this.currentStore.show_address = this.currentStore.full_address.replace(/,/g, ' ') + ' ' + this.currentStore.address;
// 首次进入门店,没有门店信息 || 当前位置的门店和缓存门店不一致要弹框
if (!storeInfo || storeInfo && this.nearestStore && storeInfo.store_id != this.nearestStore.store_id) {
if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.open(); if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.open();
} }
}
let manualStoreInfo = uni.getStorageSync('manual_store_info'); // 手动选择门店
if (manualStoreInfo) {
this.nearestStore = manualStoreInfo;
}
this.changeStore(this.nearestStore); // 切换门店数据
}, },
closeChooseStorePopup() { closeChooseStorePopup() {
if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.close(); if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.close();
}, },
// 确认进入门店
enterStore() {
this.closeChooseStorePopup();
},
// 选择其他门店 // 选择其他门店
chooseOtherStore() { chooseOtherStore() {
this.$util.redirectTo('/pages_tool/store/list'); this.$util.redirectTo('/pages_tool/store/list');
this.closeChooseStorePopup(); this.closeChooseStorePopup();
}, },
// 打开地图重新选择位置 // 打开地图重新选择位置
reposition() { reGetLocation() {
// #ifdef MP // #ifdef MP
/*uni.chooseLocation({ uni.chooseLocation({
success: res => { success: res => {
this.latitude = res.latitude; this.latitude = res.latitude;
this.longitude = res.longitude; this.longitude = res.longitude;
this.currentPosition = res.name; this.currentPosition = res.name;
this.getNearestStore(); this.getStoreInfoByLocation();
this.getCurrentLocation();
}, },
fail(res) { fail(res) {
uni.getSetting({ uni.getSetting({
@@ -492,8 +613,7 @@ export default {
this.latitude = res.latitude; this.latitude = res.latitude;
this.longitude = res.longitude; this.longitude = res.longitude;
this.currentPosition = res.name; this.currentPosition = res.name;
this.getNearestStore(); this.getStoreInfoByLocation();
this.getCurrentLocation();
} }
}); });
}, 1000); }, 1000);
@@ -511,7 +631,7 @@ export default {
} }
}); });
} }
});*/ });
// #endif // #endif
// #ifdef H5 // #ifdef H5
@@ -532,9 +652,7 @@ export default {
data: data, data: data,
success: res => { success: res => {
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
this.nearestStore = res.data; this.changeCurrentStore(res.data);
this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address;
this.openChooseStorePopup();
} }
} }
}); });
@@ -547,7 +665,6 @@ export default {
data.latitude = this.latitude; data.latitude = this.latitude;
data.longitude = this.longitude; data.longitude = this.longitude;
} }
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/store/getLocation', url: '/api/store/getLocation',
data: data, data: data,
@@ -563,26 +680,42 @@ export default {
// 定位失败,进入默认门店 // 定位失败,进入默认门店
enterDefaultStore() { enterDefaultStore() {
if (this.defaultStoreInfo) { if (this.defaultStoreInfo) {
if (!this.nearestStore) { this.changeCurrentStore(this.defaultStoreInfo);
this.nearestStore = this.defaultStoreInfo;
this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address;
}
if (this.currentPosition == '') this.currentPosition = '未获取到定位';
this.openChooseStorePopup();
} }
}, },
//连锁门店未定位选择门店
chooseStore() {
this.$util.redirectTo('/pages_tool/store/list');
},
//打开手机设置重新定位
openSetting() {
uni.openSetting({
success: res => {
this.getLocation();
}
})
},
/******************************************** 获取门店相关 END ***************************************************/
// 设置公众号分享 // 设置公众号分享
setPublicShare() { setPublicShare() {
let shareUrl = this.$config.h5Domain + this.diyRoute; let shareUrl = this.$config.h5Domain + this.diyRoute;
if (this.id) shareUrl += '?id=' + this.id; var store_info = this.$store.state.globalStoreInfo;
else if (this.name) shareUrl += '?name=' + this.name; //if (store_info) shareUrl += '?store_id=' + store_info.store_id;
this.$util.setPublicShare({ if (shareUrl.indexOf('?') > 0) {
title: this.diyData.global.title, shareUrl += '&';
desc: '', } else {
link: shareUrl, shareUrl += '?';
imgUrl: this.siteInfo ? this.$util.img(this.siteInfo.logo_square) : ''
});
} }
if (this.id) shareUrl += 'id=' + this.id;
else if (this.name) shareUrl += 'name=' + this.name;
// alert('diydiydiy')
this.$util.setPublicShare({
title: this.diyData.global.wechatShareTitle || this.diyData.global.title,
desc: this.diyData.global.wechatShareDesc,
link: shareUrl,
imgUrl: this.diyData.global.wechatShareImage ? this.$util.img(this.diyData.global.wechatShareImage) : this.$util.img(this.siteInfo.logo_square)
});
},
}, },
onPageScroll(e) { onPageScroll(e) {
this.scrollTop = e.scrollTop; this.scrollTop = e.scrollTop;
@@ -597,6 +730,7 @@ export default {
// 下拉刷新 // 下拉刷新
onPullDownRefresh() { onPullDownRefresh() {
this.$store.commit('setComponentRefresh'); this.$store.commit('setComponentRefresh');
this.getDiyMethod();
setTimeout(() => { setTimeout(() => {
uni.stopPullDownRefresh(); uni.stopPullDownRefresh();
}, 50); }, 50);

View File

@@ -41,6 +41,7 @@ export default {
bgUrl: '', bgUrl: '',
textImgPosLink: 'left' textImgPosLink: 'left'
}, },
goodsFormVal: []
} }
}, },
onLoad(data) { onLoad(data) {
@@ -78,11 +79,13 @@ export default {
onShow() { onShow() {
}, },
methods: { methods: {
detailChangeVal(data) {
this.goodsFormVal = data;
},
// 处理商品详情数据 // 处理商品详情数据
handleGoodsSkuData() { handleGoodsSkuData() {
// this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name; this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
//设置标题 this.$langConfig.title(this.navbarData.title);
// this.$langConfig.title(this.navbarData.title);
if (this.goodsSkuDetail.config) { if (this.goodsSkuDetail.config) {
this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch; this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
} }
@@ -106,7 +109,9 @@ export default {
whetherCollection: this.goodsSkuDetail.is_collect, whetherCollection: this.goodsSkuDetail.is_collect,
evaluateConfig: this.goodsSkuDetail.evaluate_config, evaluateConfig: this.goodsSkuDetail.evaluate_config,
evaluateList: this.goodsSkuDetail.evaluate_list, evaluateList: this.goodsSkuDetail.evaluate_list,
evaluateCount: this.goodsSkuDetail.evaluate_count evaluateCount: this.goodsSkuDetail.evaluate_count,
goods_class : this.goodsSkuDetail.goods_class,
sale_store: this.goodsSkuDetail.sale_store
}); });
//媒体 //媒体
@@ -183,9 +188,10 @@ export default {
}; };
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion); if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare(); this.setPublicShare();
// if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare();
// this.getBarrageData(); this.getBarrageData();
if (this.addonIsExist.form) { if (this.addonIsExist.form) {
this.getGoodsForm(); this.getGoodsForm();
} }
@@ -312,7 +318,8 @@ export default {
setPublicShare() { setPublicShare() {
let shareUrl = this.$config.h5Domain + this.shareUrl; let shareUrl = this.$config.h5Domain + this.shareUrl;
if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id; if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id;
var store_info = this.$store.state.globalStoreInfo;
if (store_info) shareUrl+= '&store_id=' + store_info.store_id;
this.$util.setPublicShare({ this.$util.setPublicShare({
title: this.goodsSkuDetail.goods_name, title: this.goodsSkuDetail.goods_name,
desc: '', desc: '',
@@ -341,6 +348,8 @@ export default {
*/ */
onShareAppMessage(res) { onShareAppMessage(res) {
var path = this.shareUrl; var path = this.shareUrl;
var store_info = this.$store.state.globalStoreInfo;
if (store_info) path+= '&store_id=' + store_info.store_id;
if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id; if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id;
return { return {
title: this.goodsSkuDetail.sku_name, title: this.goodsSkuDetail.sku_name,
@@ -358,6 +367,8 @@ export default {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
onShareTimeline() { onShareTimeline() {
let query = this.shareQuery; let query = this.shareQuery;
var store_info = this.$store.state.globalStoreInfo;
if (store_info) query+= '&store_id=' + store_info.store_id;
if (this.memberInfo && this.memberInfo.member_id) query += '&source_member=' + this.memberInfo.member_id; if (this.memberInfo && this.memberInfo.member_id) query += '&source_member=' + this.memberInfo.member_id;
return { return {
title: this.goodsSkuDetail.sku_name, title: this.goodsSkuDetail.sku_name,

View File

@@ -285,7 +285,7 @@ function replaceAnnotation(html) {
function replaceImage(html) { function replaceImage(html) {
// #ifdef MP // #ifdef MP
let info = uni.getSystemInfoSync(); let info = uni.getWindowInfo();
var screenWidth = info.windowWidth; var screenWidth = info.windowWidth;
screenWidth -= 20; screenWidth -= 20;
screenWidth += 'px'; screenWidth += 'px';
@@ -304,7 +304,7 @@ function replaceImage(html) {
} }
function replaceVideo(html){ function replaceVideo(html){
// #ifdef MP // #ifdef MP
let info = uni.getSystemInfoSync(); let info = uni.getWindowInfo();
var screenWidth = info.windowWidth; var screenWidth = info.windowWidth;
screenWidth -= 20; screenWidth -= 20;
screenWidth += 'px'; screenWidth += 'px';

View File

@@ -1,6 +1,7 @@
import Config from './config.js' import Config from './config.js'
import Util from './util.js' import Util from './util.js'
import store from '@/store/index.js' import store from '@/store/index.js'
import { Utils } from 'common/js/map-wx-jssdk.js';
// #ifdef H5 // #ifdef H5
const app_type = Util.isWeiXin() ? 'wechat' : 'h5'; const app_type = Util.isWeiXin() ? 'wechat' : 'h5';
@@ -187,7 +188,30 @@ export default {
}); });
} }
}, },
needMd5Fn(params,callback) {
uni.request({
url: Config.baseUrl + '/api/config/getApiConfig',
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded;application/json'
},
data: {
app_type,
app_type_name,
},
dataType: 'json',
responseType: 'text',
success: res => {
var sign_str = Utils.hexMD5('key=' + res.data.data.key+'&time='+res.data.data.time)
typeof callback == 'function' && callback(sign_str,res.data.data.time);
},
fail: () => {
typeof params.fail == 'function' && params.fail(res);
}
});
},
uploadBase64(params) { uploadBase64(params) {
this.needMd5Fn(params,(sign_str,time)=>{
uni.request({ uni.request({
url: Config.baseUrl + '/api/upload/headimgBase64', url: Config.baseUrl + '/api/upload/headimgBase64',
method: 'POST', method: 'POST',
@@ -197,7 +221,10 @@ export default {
data: { data: {
app_type, app_type,
app_type_name, app_type_name,
images: params.base64 images: params.base64,
token: store.state.token || '',
sign: sign_str,
time: time
}, },
dataType: 'json', dataType: 'json',
responseType: 'text', responseType: 'text',
@@ -208,8 +235,10 @@ export default {
typeof params.fail == 'function' && params.fail(res); typeof params.fail == 'function' && params.fail(res);
} }
}); });
})
}, },
pullImage(params) { pullImage(params) {
this.needMd5Fn(params,(sign_str,time)=>{
uni.request({ uni.request({
url: Config.baseUrl + '/api/upload/headimgPull', url: Config.baseUrl + '/api/upload/headimgPull',
method: 'POST', method: 'POST',
@@ -219,7 +248,10 @@ export default {
data: { data: {
app_type, app_type,
app_type_name, app_type_name,
path: params.path path: params.path,
token: store.state.token || '',
sign: sign_str,
time: time
}, },
dataType: 'json', dataType: 'json',
responseType: 'text', responseType: 'text',
@@ -230,6 +262,7 @@ export default {
typeof params.fail == 'function' && params.fail(res); typeof params.fail == 'function' && params.fail(res);
} }
}); });
})
}, },
upload(params) { upload(params) {
uni.uploadFile({ uni.uploadFile({
@@ -240,6 +273,7 @@ export default {
formData: { formData: {
app_type, app_type,
app_type_name, app_type_name,
token: store.state.token || ''
}, },
header: { header: {
'content-type': 'application/x-www-form-urlencoded;application/json' 'content-type': 'application/x-www-form-urlencoded;application/json'

View File

@@ -1121,5 +1121,7 @@ class QQMapWX {
Utils.locationProcess(options, locationsuccess); Utils.locationProcess(options, locationsuccess);
} }
}; };
module.exports = {
module.exports = QQMapWX; Utils,
QQMapWX
};

View File

@@ -19,15 +19,15 @@ function openMapByAndroid(latitude, longitude, name) {
if (plus.runtime.isApplicationExist({ if (plus.runtime.isApplicationExist({
pname: 'com.baidu.BaiduMap' pname: 'com.baidu.BaiduMap'
})) { })) {
url = url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo`;
`baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo` identity = 'com.baidu.BaiduMap';
identity = 'com.baidu.BaiduMap'
openURL(url, identity) openURL(url, identity)
} else if (plus.runtime.isApplicationExist({ } else if (plus.runtime.isApplicationExist({
pname: 'com.autonavi.minimap' pname: 'com.autonavi.minimap'
})) { // 高德 })) {
url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` // 高德
identity = 'com.autonavi.minimap' url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
identity = 'com.autonavi.minimap';
openURL(url, identity) openURL(url, identity)
} else { } else {
openMapByDefault(latitude, longitude, name) openMapByDefault(latitude, longitude, name)
@@ -42,13 +42,13 @@ function openMapByIos(latitude, longitude, name) {
if (plus.runtime.isApplicationExist({ if (plus.runtime.isApplicationExist({
action: 'baidumap://' action: 'baidumap://'
})) { })) {
url = url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
`baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
openURL(url, identity) openURL(url, identity)
} else if (plus.runtime.isApplicationExist({ } else if (plus.runtime.isApplicationExist({
action: 'iosamap://' action: 'iosamap://'
})) { // 高德 })) {
url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` // 高德
url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
openURL(url, identity) openURL(url, identity)
} else { } else {
openMapByDefault(latitude, longitude, name) openMapByDefault(latitude, longitude, name)

View File

@@ -42,6 +42,7 @@ export default {
console.log('打开连接'); console.log('打开连接');
// alert('打开连接') // alert('打开连接')
// uni.closeSocket(); // 确保已经关闭后再重新打开 // uni.closeSocket(); // 确保已经关闭后再重新打开
uni.connectSocket({ uni.connectSocket({
url: config.webSocket, url: config.webSocket,
method: 'POST', method: 'POST',
@@ -53,6 +54,12 @@ export default {
console.log('连接失败 connectSocket=', err); console.log('连接失败 connectSocket=', err);
} }
}); });
// 监听 WebSocket 连接错误事件
uni.onSocketError((res)=>{
console.error('WebSocket 连接失败:', res.errMsg);
this.chatListInit();
this.getChatList();
});
// uni.onSocketOpen((res) => { // uni.onSocketOpen((res) => {
// console.log('连接成功', res); // console.log('连接成功', res);
// }); // });
@@ -64,6 +71,7 @@ export default {
let that = this; let that = this;
this.pingInterval = config.pingInterval; this.pingInterval = config.pingInterval;
if(this.timeoutObj) clearInterval(this.timeoutObj);
this.timeoutObj = null; this.timeoutObj = null;
uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods
let msg = JSON.parse(res.data); let msg = JSON.parse(res.data);
@@ -81,7 +89,6 @@ export default {
// 监听到有新服务器消息 // 监听到有新服务器消息
getSocketMsg(reData) { // 监听到服务器消息 getSocketMsg(reData) { // 监听到服务器消息
let that = this; let that = this;
// console.log(reData)
let giveMsg = JSON.parse(reData); let giveMsg = JSON.parse(reData);
let data = { let data = {
isItMe: false, isItMe: false,
@@ -102,6 +109,7 @@ export default {
} else { } else {
that.servicer_id = 0; that.servicer_id = 0;
} }
that.chatListInit();
that.getChatList(); that.getChatList();
} }
}) })

View File

@@ -8,13 +8,13 @@ import {
export default { export default {
/** /**
* 页面跳转 * 页面跳转
* @param {string} to 跳转链接 /pages/idnex/index * @param {string} to 跳转链接 /pages/index/index
* @param {Object} param 参数 {key : value, ...} * @param {Object} param 参数 {key : value, ...}
* @param {string} mode 模式 * @param {string} mode 模式
*/ */
redirectTo(to, param, mode) { redirectTo(to, param, mode) {
let url = to; let url = to;
let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/vr/index', '/pages/contact/contact', '/pages/member/index']; let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/goods/cart', '/pages/member/index'];
if (param != undefined) { if (param != undefined) {
Object.keys(param).forEach(function(key) { Object.keys(param).forEach(function(key) {
if (url.indexOf('?') != -1) { if (url.indexOf('?') != -1) {
@@ -26,6 +26,8 @@ export default {
} }
for (let i = 0; i < tabbarList.length; i++) { for (let i = 0; i < tabbarList.length; i++) {
if (url.indexOf(tabbarList[i]) == 0) { if (url.indexOf(tabbarList[i]) == 0) {
if(url.split('?')[1]) uni.setStorageSync('tabBarParams',url.split('?')[1]);
else uni.removeStorageSync('tabBarParams')
uni.switchTab({ uni.switchTab({
url url
}); });
@@ -64,8 +66,6 @@ export default {
* @param {Object} params 参数针对商品、相册里面的图片区分大中小size: big、mid、small * @param {Object} params 参数针对商品、相册里面的图片区分大中小size: big、mid、small
*/ */
img(img_path, params) { img(img_path, params) {
var path = ""; var path = "";
if (img_path != undefined && img_path != "") { if (img_path != undefined && img_path != "") {
if (img_path.split(',').length > 1) { if (img_path.split(',').length > 1) {
@@ -78,19 +78,17 @@ export default {
arr.pop(); arr.pop();
arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase(); arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase();
arr.push(suffix); arr.push(suffix);
// if(img_path.indexOf('attachment') == -1){ img_path = arr.join(".");
// img_path = arr.join(".");
// }
} }
if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) { if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) {
path = Config.imgDomain + "/" + img_path; path = Config.imgDomain + "/" + img_path;
} else { } else {
// console.log(img_path)
path = img_path; path = img_path;
} }
if (Config.h5Domain.indexOf('https://') != -1) {
path = path.replace('http://', 'https://');
}
} }
// path += '?t=' + parseInt(new Date().getTime() / 1000); // path += '?t=' + parseInt(new Date().getTime() / 1000);
return path; return path;
}, },
@@ -98,7 +96,7 @@ export default {
* 时间戳转日期格式 * 时间戳转日期格式
* @param {Object} timeStamp * @param {Object} timeStamp
*/ */
timeStampTurnTime(timeStamp, type = "") { timeStampTurnTime(timeStamp, format = "Y-m-d H:i:s") {
if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) { if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
var date = new Date(); var date = new Date();
date.setTime(timeStamp * 1000); date.setTime(timeStamp * 1000);
@@ -113,14 +111,15 @@ export default {
var second = date.getSeconds(); var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute; minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second; second = second < 10 ? ('0' + second) : second;
if (type) {
if (type == 'yearMonthDay') { format = format.replace('Y', y);
return y + '年' + m + '' + d + '日'; format = format.replace('m', m);
} format = format.replace('d', d);
return y + '-' + m + '-' + d; format = format.replace('H', h);
} else { format = format.replace('i', minute);
return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; format = format.replace('s', second);
}
return format;
} else { } else {
return ""; return "";
} }
@@ -275,7 +274,7 @@ export default {
count: imgs_num, count: imgs_num,
sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有 sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], //从相册或者拍照 sourceType: ['album', 'camera'], //从相册或者拍照
success: async function (res) { success: async (res) => {
const tempFilePaths = res.tempFilePaths; const tempFilePaths = res.tempFilePaths;
var _data = data; var _data = data;
var imgs = []; var imgs = [];
@@ -283,9 +282,16 @@ export default {
title: '图片上传中' title: '图片上传中'
}) })
for (var i = 0; i < tempFilePaths.length; i++) { for (var i = 0; i < tempFilePaths.length; i++) {
try {
var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path, var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path,
url); url);
imgs.push(path); imgs.push(path);
} catch (e) {
this.showToast({
title: e,
});
break;
}
if (imgs.length == tempFilePaths.length) { if (imgs.length == tempFilePaths.length) {
uni.hideLoading() uni.hideLoading()
uni.showToast({ uni.showToast({
@@ -297,12 +303,13 @@ export default {
} }
}, },
fail: err => { fail: err => {
uni.hideLoading() if (err.errMsg != 'chooseImage:fail cancel') {
uni.showToast({ uni.showToast({
title: '上传失败', title: '上传失败',
icon: 'none' icon: 'none'
}) })
} }
}
}); });
}, },
//上传 //上传
@@ -319,13 +326,25 @@ export default {
name: 'file', name: 'file',
fileType: data.fileType || 'image', fileType: data.fileType || 'image',
formData: data, formData: data,
success: function (res) { success: (res) => {
var path_str = JSON.parse(res.data); var path_str = JSON.parse(res.data);
if (path_str.code >= 0) { if (path_str.code >= 0) {
resolve(path_str.data.pic_path); resolve(path_str.data.pic_path);
typeof callback == 'function' && callback(path_str.data.pic_path);
} else { } else {
reject("error"); reject(path_str.message);
}
uni.hideLoading();
},
fail: (res) => {
if (res.statusCode != 200) {
reject(res.errMsg || '上传错误');
uni.hideLoading();
}
},
complete: (res) => {
if (res.statusCode != 200) {
reject('服务器发生错误');
uni.hideLoading();
} }
} }
}); });
@@ -395,7 +414,7 @@ export default {
* 检测苹果X以上的手机 * 检测苹果X以上的手机
*/ */
isIPhoneX() { isIPhoneX() {
let res = uni.getSystemInfoSync(); let res = uni.getDeviceInfo();
if (res.model.search('iPhone X') != -1) { if (res.model.search('iPhone X') != -1) {
return true; return true;
} }
@@ -403,7 +422,7 @@ export default {
}, },
//判断安卓还是iOS //判断安卓还是iOS
isAndroid() { isAndroid() {
let platform = uni.getSystemInfoSync().platform let platform = uni.getDeviceInfo().platform
if (platform == 'ios') { if (platform == 'ios') {
return false; return false;
} else if (platform == 'android') { } else if (platform == 'android') {
@@ -431,7 +450,6 @@ export default {
} }
return cloneObj return cloneObj
}, },
/** /**
* 打开微信企业客服 * 打开微信企业客服
* @param {Function} fallbackFunc 降级处理函数 * @param {Function} fallbackFunc 降级处理函数
@@ -464,11 +482,11 @@ export default {
* @param {Object} link * @param {Object} link
*/ */
diyRedirectTo(link) { diyRedirectTo(link) {
if (link == null || Object.keys(link).length == 1) return;
//if (link == null || Object.keys(link).length == 1) return;
// 外部链接 // 外部链接
if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('http') != -1) { if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('https') != -1) {
// #ifdef H5 // #ifdef H5
window.location.href = link.wap_url; window.location.href = link.wap_url;
// #endif // #endif
@@ -492,10 +510,8 @@ export default {
uni.makePhoneCall({ uni.makePhoneCall({
phoneNumber: link.mobile, phoneNumber: link.mobile,
success: (res) => { success: (res) => {},
}, fail: (res) => {}
fail: (res) => {
}
}); });
} else if (link.name == 'MEMBER_CONTACT') { } else if (link.name == 'MEMBER_CONTACT') {
@@ -585,9 +601,12 @@ export default {
*/ */
uniappIsIPhoneX() { uniappIsIPhoneX() {
let isIphoneX = false; let isIphoneX = false;
let systemInfo = uni.getSystemInfoSync(); let deviceInfo = uni.getDeviceInfo();
let windowInfo = uni.getWindowInfo();
// #ifdef MP // #ifdef MP
if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model.search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) { if (deviceInfo.model.search('iPhone X') != -1 || deviceInfo.model.search('iPhone 11') != -1 || deviceInfo.model
.search('iPhone 12') != -1 || deviceInfo.model.search('iPhone 13') != -1 || parseInt(deviceInfo.model.split(
'iPhone')[1]) > 13) {
isIphoneX = true; isIphoneX = true;
} }
// #endif // #endif
@@ -596,11 +615,11 @@ export default {
var u = navigator.userAgent; var u = navigator.userAgent;
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
if (isIOS) { if (isIOS) {
if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) { if (windowInfo.screenWidth == 375 && windowInfo.screenHeight == 812 && deviceInfo.pixelRatio == 3) {
isIphoneX = true; isIphoneX = true;
} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) { } else if (windowInfo.screenWidth == 414 && windowInfo.screenHeight == 896 && deviceInfo.pixelRatio == 3) {
isIphoneX = true; isIphoneX = true;
} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) { } else if (windowInfo.screenWidth == 414 && windowInfo.screenHeight == 896 && deviceInfo.pixelRatio == 2) {
isIphoneX = true; isIphoneX = true;
} }
} }
@@ -612,9 +631,9 @@ export default {
*/ */
uniappIsIPhone11() { uniappIsIPhone11() {
let isIphone11 = false; let isIphone11 = false;
let systemInfo = uni.getSystemInfoSync(); let deviceInfo = uni.getDeviceInfo();
// #ifdef MP // #ifdef MP
if (systemInfo.model.search('iPhone 11') != -1) { if (deviceInfo.model.search('iPhone 11') != -1) {
isIphone11 = true; isIphone11 = true;
} }
// #endif // #endif
@@ -623,7 +642,6 @@ export default {
// #ifdef H5 // #ifdef H5
//判断该浏览器是否为safaria浏览器 //判断该浏览器是否为safaria浏览器
isSafari() { isSafari() {
let res = uni.getSystemInfoSync();
var ua = navigator.userAgent.toLowerCase(); var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 && if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 &&
ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 &&
@@ -670,7 +688,6 @@ export default {
} }
}, },
/** /**
*
* @param val 转化时间字符串 (转化时分秒) * @param val 转化时间字符串 (转化时分秒)
* @returns {string} * @returns {string}
*/ */
@@ -689,7 +706,7 @@ export default {
* 获取定位信息 * 获取定位信息
*/ */
getLocation(param = {}) { getLocation(param = {}) {
/*uni.getLocation({ uni.getLocation({
type: param.type ?? 'gcj02', type: param.type ?? 'gcj02',
success: res => { success: res => {
store.commit('setLocation', res); store.commit('setLocation', res);
@@ -701,7 +718,7 @@ export default {
complete: res => { complete: res => {
typeof param.complete == 'function' && param.complete(res); typeof param.complete == 'function' && param.complete(res);
} }
});*/ });
}, },
// 计算两个经纬度之间的距离 // 计算两个经纬度之间的距离
getDistance(lat1, lng1, lat2, lng2) { getDistance(lat1, lng1, lat2, lng2) {
@@ -709,8 +726,8 @@ export default {
var radLat2 = lat2 * Math.PI / 180.0; var radLat2 = lat2 * Math.PI / 180.0;
var a = radLat1 - radLat2; var a = radLat1 - radLat2;
var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); Math.sin(b / 2), 2)));
s = s * 6378.137; // EARTH_RADIUS; s = s * 6378.137; // EARTH_RADIUS;
s = Math.round(s * 10000) / 10000; s = Math.round(s * 10000) / 10000;
return s; return s;
@@ -737,7 +754,7 @@ export default {
/** /**
* 微信订阅消息 * 微信订阅消息
*/ */
subscribeMessage(keywords) { subscribeMessage(keywords, callback) {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
let url = '/weapp/api/weapp/messagetmplids'; let url = '/weapp/api/weapp/messagetmplids';
// #endif // #endif
@@ -759,6 +776,9 @@ export default {
}, },
fail: (res) => { fail: (res) => {
console.log('fail', res) console.log('fail', res)
},
complete: (res) => {
typeof callback == 'function' && callback();
} }
}) })
// #endif // #endif
@@ -771,10 +791,18 @@ export default {
}, },
fail: res => { fail: res => {
console.log('fail', res) console.log('fail', res)
},
complete: (res) => {
typeof callback == 'function' && callback();
} }
}); });
// #endif // #endif
} else {
typeof callback == 'function' && callback();
} }
},
fail: res => {
typeof callback == 'function' && callback();
} }
}) })
}, },
@@ -807,10 +835,8 @@ export default {
title: shareConfig.title, title: shareConfig.title,
path: shareConfig.path, path: shareConfig.path,
imageUrl: shareConfig.imageUrl, imageUrl: shareConfig.imageUrl,
success: res => { success: res => {},
}, fail: res => {}
fail: res => {
}
} }
//分享到朋友圈 //分享到朋友圈
let query = ''; let query = '';
@@ -846,8 +872,7 @@ export default {
Http.sendRequest({ Http.sendRequest({
url: '/wechat/api/wechat/jssdkconfig', url: '/wechat/api/wechat/jssdkconfig',
data: { data: {
url: uni.getSystemInfoSync().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location url: uni.getDeviceInfo().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location.href
.href
}, },
success: res => { success: res => {
if (res.code == 0) { if (res.code == 0) {
@@ -870,7 +895,7 @@ export default {
//获取当前路由 //获取当前路由
getCurrentRoute() { getCurrentRoute() {
let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组 let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组
let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由 let currentRoute = currentRoutes[currentRoutes.length - 1].route; //获取当前页面路由
let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数 let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数
// 拼接参数 // 拼接参数
let param = []; let param = [];
@@ -950,12 +975,10 @@ export default {
var points_D = []; var points_D = [];
var points_E = []; var points_E = [];
const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][ const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][
'y' 'y'], 2));
], 2));
// 邻控制BC点间距 // 邻控制BC点间距
const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][ const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][
'y' 'y'], 2));
], 2));
// D每次在AB方向上移动的距离 // D每次在AB方向上移动的距离
if (points[0]['x'] > points[2]['x']) { if (points[0]['x'] > points[2]['x']) {
var EACH_MOVE_AD = -(DIST_AB / times); var EACH_MOVE_AD = -(DIST_AB / times);
@@ -1017,5 +1040,157 @@ export default {
verifyMobile(mobile) { verifyMobile(mobile) {
var parse = /^\d{11}$/.test(mobile); var parse = /^\d{11}$/.test(mobile);
return parse; return parse;
},
// 获取缓存key
getStorageKey(key) {
return Config.storagePrefix + key;
},
// 重写uni缓存方法
rewriteUniStorageMethod() {
const setStorageSync = uni.setStorageSync;
const setStorage = uni.setStorage;
const getStorage = uni.getStorage;
const getStorageSync = uni.getStorageSync;
const removeStorage = uni.removeStorage;
const removeStorageSync = uni.removeStorageSync;
uni.setStorage = (options) => {
options.key = this.getStorageKey(options.key);
setStorage(options)
};
uni.setStorageSync = (key, data) => {
setStorageSync(this.getStorageKey(key), data)
};
uni.getStorage = (options) => {
options.key = this.getStorageKey(options.key);
getStorage(options)
};
uni.getStorageSync = (key) => {
return getStorageSync(this.getStorageKey(key))
};
uni.removeStorage = (options) => {
options.key = this.getStorageKey(options.key);
removeStorage(options)
};
uni.removeStorageSync = (key) => {
return removeStorageSync(this.getStorageKey(key))
}
},
//生成唯一id
generateUUID() {
var d = new Date().getTime(); //Timestamp
var d2 = (performance && performance.now && (performance.now() * 1000)) ||
0; //Time in microseconds since page-load or 0 if unsupported
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16; //random number between 0 and 16
if (d > 0) { //Use timestamp until depleted
r = (d + r) % 16 | 0;
d = Math.floor(d / 16);
} else { //Use microseconds since page-load if supported
r = (d2 + r) % 16 | 0;
d2 = Math.floor(d2 / 16);
}
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
},
// 获取弹新人礼弹框页面
openRegisterRewardPath(back) {
return uni.getStorageSync('initiateLogin') || back;
},
// 登录完成后返回页面
loginComplete(back, mode) {
let url = uni.getStorageSync('initiateLogin') || back;
uni.removeStorageSync('initiateLogin')
let jump = true;
let arr = getCurrentPages().reverse();
for (let i = 0; i < arr.length; i++) {
if (url.indexOf(arr[i].route) != -1) {
jump = false;
uni.navigateBack({
delta: i
});
break;
}
}
if (jump) {
this.redirectTo(url, {}, 'redirectTo')
}
},
// 微信提现收款
merchantTransfer(data,withdrawInfo,callback) {
Http.sendRequest({
url: '/wechatpay/api/transfer/transfer',
data: data,
success: res => {
if (res.code == 0) {
uni.hideLoading();
// #ifdef MP-WEIXIN
if (wx.canIUse('requestMerchantTransfer')) {
wx.requestMerchantTransfer({
mchId: withdrawInfo.mch_id,
appId: withdrawInfo.app_id,
package: res.data.package_info,
success: (res) => {
typeof callback == 'function' && callback(res);
},
fail: (res) => {
typeof callback == 'function' && callback(res);
},
});
} else {
wx.showModal({
content: '你的微信版本过低,请更新至最新版本。',
showCancel: false,
});
}
// #endif
// #ifdef H5
if (this.isWeiXin()) {
if (uni.getDeviceInfo().platform == 'ios') {
var url = uni.getStorageSync('initUrl');
} else {
var url = location.href;
}
// 获取jssdk配置
Http.sendRequest({
url: '/wechat/api/wechat/jssdkconfig',
data: {
url: url
},
success: jssdkRes => {
var wxJS = new Weixin();
wxJS.init(jssdkRes.data);
wxJS.withdrawWechat({
mch_id: withdrawInfo.mch_id,
wechat_appid: withdrawInfo.app_id,
package_info: res.data.package_info
},
res => {
typeof callback == 'function' && callback(res);
},
);
}
})
}
// #endif
} else {
this.showToast({
title: res.message,
});
}
},
fail: err => {
this.showToast({
title: err.message,
});
}
})
} }
} }

View File

@@ -112,6 +112,29 @@ let Weixin = function () {
}) })
} }
// 提现
this.withdrawWechat = function (data,callback) {
wx.ready(function () {
wx.checkJsApi({
jsApiList: ['requestMerchantTransfer'],
success: function (res) {
if (res.checkResult['requestMerchantTransfer']) {
WeixinJSBridge.invoke('requestMerchantTransfer', {
mchId: data.mch_id,
appId: data.wechat_appid,
package: data.package_info,
},
function (res) {
typeof callback == 'function' && callback(res);
}
);
} else {
alert('你的微信版本过低,请更新至最新版本。');
}
},
});
});
}
} }
export { export {

View File

@@ -1,638 +0,0 @@
<template>
<view class="order-container" :class="{ 'safe-area': isIphoneX }">
<!-- #ifdef MP-WEIXIN -->
<view class="payment-navbar" :style="{ 'padding-top': menuButtonBounding.top + 'px', height: menuButtonBounding.height + 'px' }">
<view class="nav-wrap">
<text class="iconfont icon-back_light" @click="back"></text>
<view class="navbar-title">确认订单</view>
</view>
</view>
<view class="payment-navbar-block" :style="{ height: menuButtonBounding.bottom + 'px' }"></view>
<!-- #endif -->
<scroll-view scroll-y="true" class="order-scroll-container">
<view class="payment-navbar-block"></view>
<template v-if="paymentData">
<template v-if="paymentData.is_virtual">
<!-- 虚拟商品联系方式 -->
<view class="mobile-wrap">
<view class="tips color-base-text">
<text class="iconfont icongantanhao"></text>
购买虚拟类商品需填写手机号方便商家与您联系
</view>
<view class="form-group">
<text class="icon">
<image :src="$util.img('public/uniapp/order/icon-mobile.png')" mode="widthFix"></image>
</text>
<text class="text">手机号码</text>
<input type="number" maxlength="11" placeholder="请输入您的手机号码" placeholder-class="color-tip placeholder" class="input" v-model="orderCreateData.member_address.mobile" />
</view>
</view>
</template>
<template v-else>
<!-- 配送方式 -->
<view class="delivery-mode" v-if="goodsData.delivery.express_type.length > 1">
<view class="action">
<view :class="{ active: item.name == orderCreateData.delivery.delivery_type }" v-for="(item, index) in goodsData.delivery.express_type" :key="index" @click="selectDeliveryType(item)">
{{ item.title }}
<!-- 外圆角 -->
<view class="out-radio"></view>
</view>
</view>
</view>
<view class="address-box" :class="{ 'not-delivery-type': goodsData.delivery.express_type.length <= 1 }" v-if="orderCreateData.delivery.delivery_type == 'express'">
<view class="info-wrap" v-if="memberAddress" @click="selectAddress">
<view class="content">
<text class="name">{{ memberAddress.name ? memberAddress.name : '' }}</text>
<text class="mobile">{{ memberAddress.mobile ? memberAddress.mobile : '' }}</text>
<view class="desc-wrap">
{{ memberAddress.full_address ? memberAddress.full_address : '' }}
{{ memberAddress.address ? memberAddress.address : '' }}
</view>
</view>
<text class="cell-more iconfont icon-right"></text>
</view>
<view class="empty-wrap" v-else @click="selectAddress">
<view class="info">请设置收货地址</view>
<view class="cell-more">
<view class="iconfont icon-right"></view>
</view>
</view>
<image class="address-line" :src="$util.img('public/uniapp/order/address-line.png')"></image>
</view>
<view class="address-box" :class="{ 'not-delivery-type': goodsData.delivery.express_type.length <= 1 }" v-if="orderCreateData.delivery.delivery_type == 'local'">
<view v-if="localMemberAddress">
<block v-if="storeList && Object.keys(storeList).length > 1">
<view class="local-delivery-store" v-if="storeInfo" @click="openPopup('deliveryPopup')">
<view class="info">
<text class="store-name">{{ storeInfo.store_name }}</text>
提供配送
</view>
<view class="cell-more">
<text>点击切换</text>
<text class="iconfont icon-right"></text>
</view>
</view>
<view v-else class="local-delivery-store">
<view class="info">
<text class="store-name">您的附近没有可配送的门店请选择其他配送方式</text>
</view>
</view>
</block>
<view class="info-wrap local" @click="selectAddress">
<view class="content">
<text class="name">{{ localMemberAddress.name ? localMemberAddress.name : '' }}
</text>
<text class="mobile">{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }}
</text>
<view class="desc-wrap">
{{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }}
{{ localMemberAddress.address ? localMemberAddress.address : '' }}
</view>
</view>
<text class="cell-more iconfont icon-right"></text>
</view>
<view class="local-box" v-if="calculateGoodsData.config.local && calculateGoodsData.delivery.local.info.time_is_open == 1">
<view class="pick-block" @click="localtime('')">
<view class="title font-size-base">送达时间</view>
<view class="time-picker">
<text :class="{ 'color-tip': !deliveryTime }">{{ deliveryTime ? deliveryTime : '请选择送达时间' }}</text>
<text class="iconfont icon-right cell-more"></text>
</view>
</view>
</view>
</view>
<view class="empty-wrap" v-else @click="selectAddress">
<view class="info">请设置收货地址</view>
<view class="cell-more">
<view class="iconfont icon-right"></view>
</view>
</view>
<image class="address-line" :src="$util.img('public/uniapp/order/address-line.png')"></image>
</view>
<!-- 门店信息 -->
<view class="store-box" :class="{ 'not-delivery-type': goodsData.delivery.express_type.length <= 1 }" v-if="orderCreateData.delivery.delivery_type == 'store'">
<block v-if="storeInfo">
<view @click="openPopup('deliveryPopup')" class="store-info">
<view class="store-address-info">
<view class="info-wrap">
<view class="title">
<text>{{ storeInfo.store_name }}</text>
</view>
<view class="store-detail">
<view v-if="storeInfo.open_date">营业时间{{ storeInfo.open_date }}</view>
<view class="address">{{ storeInfo.full_address }} {{ storeInfo.address }}
</view>
</view>
</view>
<view class="cell-more iconfont icon-right" v-if="storeList && Object.keys(storeList).length > 1"></view>
</view>
</view>
<view class="mobile-wrap store-mobile" v-if="orderCreateData.member_address">
<view class="form-group">
<text class="text">姓名</text>
<input type="text" placeholder-class="color-tip placeholder" class="input" disabled v-model="orderCreateData.member_address.name" />
</view>
</view>
<view class="mobile-wrap store-mobile" v-if="orderCreateData.member_address">
<view class="form-group">
<text class="text">预留手机</text>
<input type="number" maxlength="11" placeholder="请输入您的手机号码" placeholder-class="color-tip placeholder" class="input" v-model="orderCreateData.member_address.mobile" />
</view>
</view>
<view class="store-time" @click="storetime('')">
<view class="left">提货时间</view>
<view class="right">
{{ deliveryTime }}
<text class="iconfont icon-right"></text>
</view>
</view>
</block>
<view v-else class="empty">当前无自提门店请选择其它配送方式</view>
<image class="address-line" :src="$util.img('public/uniapp/order/address-line.png')"></image>
</view>
</template>
<!-- 店铺 -->
<view class="site-wrap order-goods" v-if="calculateGoodsData">
<view class="site-header">
<view class="iconfont icon-dianpu"></view>
<text class="site-name">门店</text>
</view>
<view class="site-body">
<!-- 商品 -->
<view class="goods-item" v-for="(goodsItem, goodsIndex) in calculateGoodsData.goods_list" :key="goodsIndex">
<view class="goods-wrap">
<view class="goods-img" @click="$util.redirectTo('/pages/goods/detail', { goods_id: goodsItem.goods_id })">
<image :src="$util.img(goodsItem.sku_image, { size: 'mid' })" @error="imageError(goodsIndex)" mode="aspectFill"/>
</view>
<view class="goods-info">
<view class="top-wrap">
<view @click="$util.redirectTo('/pages/goods/detail', { goods_id: goodsItem.goods_id })" class="goods-name">{{ goodsItem.sku_name }}</view>
<view class="sku" v-if="goodsItem.sku_spec_format">
<view class="goods-spec">
<block v-for="(x, i) in goodsItem.sku_spec_format" :key="i">
<view>{{ x.spec_value_name }}</view>
</block>
</view>
</view>
<block v-if="goodsItem.is_virtual == 0">
<view class="error-tips" v-if="orderCreateData.delivery &&
orderCreateData.delivery.delivery_type &&
goodsItem.support_trade_type &&
goodsItem.support_trade_type.indexOf(orderCreateData.delivery.delivery_type) == -1
">
<text class="iconfont icon-gantanhao"></text>
<text>该商品不支持{{ orderCreateData.delivery.delivery_type_name }}</text>
</view>
</block>
<view class="error-tips" v-if="goodsItem.error && goodsItem.error.message">
<text class="iconfont icon-gantanhao"></text>
<text>{{ goodsItem.error.message }}</text>
</view>
</view>
<view class="goods-sub-section">
<view class="color-base-text">
<text class="unit price-style small">{{ $lang('common.currencySymbol') }}</text>
<text class="goods-price price-style large">{{ parseFloat(goodsItem.price).toFixed(2).split('.')[0] }}</text>
<text class="unit price-style small">.{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }}</text>
</view>
<view>
<text class="font-size-tag">x</text>
<text class="font-size-base">{{ goodsItem.num }}</text>
</view>
</view>
</view>
</view>
<view class="member-goods-card order-cell" v-if="calculateGoodsData.goods_list[goodsIndex].member_card_list" @click="selectMemberGoodsCard(goodsIndex)">
<text class="tit">次卡抵扣</text>
<view class="box text-overflow">
<block v-if="calculateGoodsData.goods_list[goodsIndex].card_promotion_money">
<text class="text">次卡抵扣{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}张/{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}次</text>
<text class="price-font">-¥{{ calculateGoodsData.goods_list[goodsIndex].card_promotion_money | moneyFormat }}</text>
</block>
<text class="color-tip" v-else>请选择次卡</text>
</view>
<text class="iconfont icon-right"></text>
</view>
<view class="goods-form" v-if="goodsData.goods_list[goodsIndex].goods_form" @click="editForm(goodsIndex)">
<ns-form :data="goodsData.goods_list[goodsIndex].goods_form.json_data" ref="goodsForm" :custom-attr="{ sku_id: goodsItem.sku_id, form_id: goodsData.goods_list[goodsIndex].goods_form.id }"/>
<text class="cell-more iconfont icon-right"></text>
<view class="shade"></view>
</view>
</view>
</view>
</view>
<view class="site-wrap buyer-message">
<view class="order-cell">
<text class="tit">买家留言</text>
<view class="box text-overflow " @click="openPopup('buyerMessagePopup')">
<text v-if="orderCreateData.buyer_message">{{ orderCreateData.buyer_message }}</text>
<text class="color-sub" v-else>无留言</text>
</view>
<text class="iconfont icon-right"></text>
</view>
</view>
<view v-if="paymentData.system_form" class="system-form-wrap">
<view class="order-cell">
<text class="tit">{{ paymentData.system_form.form_name }}</text>
</view>
<ns-form :data="paymentData.system_form.json_data" ref="form"/>
</view>
<view class="site-wrap" v-if="calculateGoodsData || promotionInfo || (calculateGoodsData && calculateGoodsData.max_usable_point > 0) || goodsData.invoice">
<view class="site-footer">
<view class="order-cell coupon" v-if="modules.indexOf('coupon') != -1">
<text class="tit">优惠券</text>
<view class="box text-overflow" @click="openPopup('couponPopup')">
<template v-if="orderCreateData.coupon && orderCreateData.coupon.coupon_id">
<text>已使用优惠券,优惠</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ (calculateData && calculateData.coupon_money ? calculateData.coupon_money : 0) | moneyFormat }}</text>
</template>
<text v-else>不使用优惠券</text>
</view>
<text class="iconfont icon-right"></text>
</view>
<view class="order-cell" v-if="promotionInfo">
<text class="tit">活动优惠</text>
<view class="box text-overflow" @click="openPopup('promotionPopup')">
<text>{{ promotionInfo.title }}</text>
</view>
<text class="iconfont icon-right"></text>
</view>
<view class="order-cell point" v-if="calculateGoodsData && calculateGoodsData.max_usable_point > 0">
<text class="tit">
<text>使用{{ parseInt(calculateGoodsData.max_usable_point) }}积分可抵扣</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.point_money | moneyFormat }}</text>
</text>
<view class="box"></view>
<ns-switch class="balance-switch" @change="usePoint" :checked="orderCreateData.is_point == 1"/>
</view>
<view class="order-cell order-invoice-cell" v-if="goodsData.invoice.invoice_status == 1">
<text class="tit">发票</text>
<view class="box text-overflow" @click="openPopup('invoicePopup')">
<text v-if="orderCreateData.is_invoice == 1">{{ orderCreateData.invoice_type == 1 ? '纸质' : '电子' }}发票({{ orderCreateData.invoice_content }})</text>
<text v-else>无需发票</text>
</view>
<text class="iconfont icon-right"></text>
</view>
</view>
</view>
<view class="site-wrap box member-card-wrap" v-if="paymentData.recommend_member_card && Object.keys(paymentData.recommend_member_card).length > 0">
<view class="head" @click="selectMemberCard">
<text class="iconfont icon-huiyuan"></text>
<view class="info">
开通{{ paymentData.recommend_member_card.level_name }}
<text>本单预计可省</text>
<text class="price-color">{{ paymentData.recommend_member_card.discount_money | moneyFormat }}</text>
<text>元</text>
</view>
<text class="iconfont" :class="orderCreateData.is_open_card == 1 ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></text>
</view>
<view class="body" v-if="orderCreateData.is_open_card">
<view class="item" :class="{ 'active color-base-border': item.key == orderCreateData.member_card_unit }" v-for="(item, index) in cardChargeType" :key="index" @click="selectMembercardUnit(item.key)">
<view class="title">{{ item.title }}</view>
<view class="price price-font">{{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }}</view>
<text class="iconfont icon-icon color-base-text price-font identify" v-if="item.key == orderCreateData.member_card_unit"></text>
</view>
</view>
</view>
<!-- 订单金额 -->
<template v-if="calculateData">
<view class="order-money">
<view class="order-cell">
<text class="tit">商品金额</text>
<view class="box">
<text class="unit color-title price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money color-title price-font">{{ calculateData.goods_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="calculateData.is_virtual == 0 && calculateData.delivery_money > 0">
<text class="tit">运费</text>
<view class="box color-base-text">
<text class="operator">+</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.delivery_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_money > 0">
<text class="tit">
<text>税费</text>
<text class="color-base-text font-bold price-font">({{ goodsData.invoice.invoice_rate }}%)</text>
</text>
<view class="box color-base-text">
<text class="operator">+</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.invoice_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_delivery_money > 0">
<text class="tit">发票邮寄费</text>
<view class="box color-base-text">
<text class="operator">+</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.invoice_delivery_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="calculateData.promotion_money > 0">
<text class="tit">优惠</text>
<view class="box color-base-text">
<text class="operator">-</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.promotion_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="calculateData.coupon_money">
<text class="tit">优惠券</text>
<view class="box color-base-text">
<text class="operator">-</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.coupon_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="calculateData.point_money > 0">
<text class="tit">积分抵扣</text>
<view class="box color-base-text">
<text class="operator">-</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.point_money | moneyFormat }}</text>
</view>
</view>
<view class="order-cell" v-if="calculateData.member_card_money > 0">
<text class="tit">会员卡</text>
<view class="box color-base-text">
<text class="operator">+</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.member_card_money | moneyFormat }}
</text>
</view>
</view>
</view>
<view v-if="transactionAgreement.title && transactionAgreement.content" class="agreement">购买前请先阅读<text @click="$refs.agreementPopup.open()">《{{ transactionAgreement.title }}》</text>,下单即代表同意该协议</view>
<view class="order-submit bottom-safe-area">
<view class="order-settlement-info">
<text class="font-size-base color-tip margin-right">共{{ calculateData.goods_num }}件</text>
<text class="font-size-base">合计:</text>
<text class=" unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class=" money price-font">{{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[0] }}</text>
<text class=" unit price-font">.{{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[1] }}</text>
</view>
<view class="submit-btn">
<button type="primary" class="mini" size="mini" @click="create()" v-if="!surplusStartMoney()">提交订单</button>
<button v-else class="no-submit mini" size="mini">差{{ surplusStartMoney() | moneyFormat }}起送</button>
</view>
</view>
<view class="order-submit-block"></view>
<payment ref="choosePaymentPopup" @close="payClose" v-if="calculateData"></payment>
</template>
<!-- 活动优惠弹窗 -->
<uni-popup ref="promotionPopup" type="bottom" v-if="promotionInfo">
<view class="promotion-popup popup">
<view class="popup-header">
<text class="tit">活动优惠</text>
<text class="iconfont icon-close" @click="closePopup('promotionPopup')"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view class="order-cell" style="align-items: baseline;">
<view class="tit">
<text class="promotion-mark ns-gradient-promotionpages-payment">{{ promotionInfo.title }}
</text>
</view>
<view class="promotion-content">
<view class="tit tit-content" style="white-space: pre-line;" v-html="promotionInfo.content"></view>
</view>
</view>
</scroll-view>
<view class="popup-footer" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg" @click="closePopup('promotionPopup')">确定</view>
</view>
</view>
</uni-popup>
<!-- 门店列表弹窗 -->
<uni-popup ref="deliveryPopup" type="bottom">
<view class="delivery-popup popup">
<view class="popup-header">
<text class="tit">已为您甄选出附近所有相关门店</text>
<text class="iconfont icon-close" @click="closePopup('deliveryPopup')"></text>
</view>
<view class="popup-body store-popup" :class="{ 'safe-area': isIphoneX }">
<mescroll-uni @getData="getStore" ref="mescroll" top="50px">
<block slot="list">
<view class="delivery-content">
<block v-if="storeData">
<view class="item-wrap" v-for="(item, index) in storeData" :key="index" @click="selectPickupPoint(item)">
<view class="detail">
<view class="name" :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''">
<text>{{ item.store_name }}</text>
<text v-if="item.distance">({{ item.distance }}km)</text>
</view>
<view class="info">
<view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">营业时间:{{ item.open_date }}</view>
<view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">地址:{{ item.full_address }}{{ item.address }}</view>
</view>
</view>
<view class="icon" v-if="item.store_id == orderCreateData.delivery.store_id">
<text class="iconfont icon-yuan_checked color-base-text"></text>
</view>
</view>
</block>
<view v-else class="empty-wrap">
<ns-empty text="所选择收货地址附近没有可以自提的门店" :isIndex="false"></ns-empty>
</view>
</view>
</block>
</mescroll-uni>
</view>
</view>
</uni-popup>
<!-- 留言弹窗 -->
<uni-popup ref="buyerMessagePopup" type="bottom">
<view style="height: auto;" class="buyermessag-popup popup" @touchmove.prevent.stop>
<view class="popup-header">
<text class="tit">买家留言</text>
<text class="iconfont icon-close" @click="closePopup('buyerMessagePopup')"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view>
<view class="buyermessag-cell">
<view class="buyermessag-form-group">
<textarea type="text" maxlength="100" placeholder="留言前建议先与商家协调一致" placeholder-class="color-tip" v-model="orderCreateData.buyer_message"/>
</view>
</view>
</view>
</scroll-view>
<view class="popup-footer" @click="saveBuyerMessage" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg">确定</view>
</view>
</view>
</uni-popup>
<!-- 优惠券弹窗 -->
<uni-popup ref="couponPopup" type="bottom" v-if="calculateGoodsData" :mask-click="false">
<view class="coupon-popup popup" @touchmove.prevent.stop>
<view class="popup-header">
<text class="tit">优惠券</text>
<text class="iconfont icon-close" @click="closePopup('couponPopup')"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view v-if="coupon_list.length > 0">
<view class="coupon-item" v-for="(couponItem, couponIndex) in coupon_list" :key="couponIndex" @click="selectCoupon(couponItem)">
<view class="coupon-info" :style="{ backgroundColor: 'var(--main-color-shallow)' }">
<view class="info-wrap">
<image class="coupon-line" mode="heightFix" :src="$util.img('public/uniapp/coupon/coupon_line.png')"/>
<view class="coupon-money">
<template v-if="couponItem.type == 'divideticket'">
<text class="unit">{{ $lang('common.currencySymbol') }}</text>
<text class="money">{{ parseFloat(couponItem.money) }}</text>
</template>
<template v-else-if="couponItem.type == 'reward'">
<text class="unit">{{ $lang('common.currencySymbol') }}</text>
<text class="money">{{ parseFloat(couponItem.money) }}</text>
</template>
<template v-else-if="couponItem.type == 'discount'">
<text class="money">{{ parseFloat(couponItem.discount) }}</text>
<text class="unit">折</text>
</template>
<view class="at-least">
<template v-if="couponItem.at_least > 0">
满{{ couponItem.at_least }}可用
</template>
<template v-else>
无门槛
</template>
</view>
</view>
</view>
<view class="desc-wrap">
<view class="coupon-name">{{ couponItem.coupon_name }}</view>
<view v-if="couponItem.type == 'discount' && couponItem.discount_limit > 0" class="limit">最多可抵¥{{ couponItem.discount_limit }}</view>
<view class="time font-size-goods-tag">有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }}</view>
</view>
<view class="iconfont" :class="orderCreateData.coupon.coupon_id == couponItem.coupon_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view>
</view>
</view>
</view>
<view v-else class="coupon-empty">暂无可用的优惠券</view>
</scroll-view>
<view class="popup-footer" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg" @click="useCpopon">确定</view>
</view>
</view>
</uni-popup>
<!-- 交易协议 -->
<view @touchmove.prevent>
<uni-popup ref="agreementPopup" type="center" :maskClick="false">
<view class="agreement-conten-box">
<view class="close">
<text class="iconfont icon-close" @click="$refs.agreementPopup.close()"></text>
</view>
<view class="title">{{ transactionAgreement.title }}</view>
<view class="con">
<scroll-view scroll-y="true" class="con">
<rich-text :nodes="transactionAgreement.content"></rich-text>
</scroll-view>
</view>
</view>
</uni-popup>
</view>
<!-- 表单修改弹窗 -->
<uni-popup ref="editFormPopup" type="bottom">
<view style="height: auto;" class="form-popup popup" @touchmove.prevent.stop>
<view class="popup-header">
<text class="tit">买家信息</text>
<text class="iconfont icon-close" @click="$refs.editFormPopup.close()"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<ns-form v-if="tempFormData" :data="tempFormData.json_data" ref="tempForm"></ns-form>
</scroll-view>
<view class="popup-footer" @click="saveForm" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg">确定</view>
</view>
</view>
</uni-popup>
<uni-popup ref="memberGoodsCardPopup" type="bottom">
<view class="member-card-popup popup" @touchmove.prevent.stop>
<view class="popup-header">
<text class="tit">选择次卡</text>
<text class="iconfont icon-close" @click="$refs.memberGoodsCardPopup.close()"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view v-for="(item, index) in selectGoodsCard.cardList" class="card-item" @click="selectGoodsCard.click(item.item_id)">
<view class="content">
<view class="title">{{ item.goods_name }}</view>
<view class="info">
<text v-if="item.card_type == 'timecard'">不限次数</text>
<text v-if="item.card_type == 'oncecard'">剩余{{ item.num - item.use_num }}次</text>
<text v-if="item.card_type == 'commoncard'">剩余{{ item.total_num - item.total_use_num }}次</text>
<text>|</text>
<text>{{ item.end_time ? $util.timeStampTurnTime(item.end_time) : '长期有效' }}</text>
</view>
</view>
<view class="iconfont" :class="selectGoodsCard.itemId == item.item_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view>
</view>
</scroll-view>
<view class="popup-footer" @click="saveMemberGoodsCard" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg">确定</view>
</view>
</view>
</uni-popup>
</template>
</scroll-view>
<!-- 门店自提时间 -->
<ns-select-time @selectTime="selectPickupTime" ref="timePopup"></ns-select-time>
<ns-login ref="login"></ns-login>
<loading-cover ref="loadingCover"></loading-cover>
</view>
</template>
<script>
import payment from './payment.js';
export default {
name: 'common-payment',
data() {
return {};
},
props: {
api: Object,
createDataKey: String
},
mixins: [payment]
};
</script>
<style lang="scss">
@import '@/common/css/order_parment.scss';
.order-cell .promotion-content {
flex: 1;
}
</style>

View File

@@ -64,30 +64,27 @@
<view class="address-box" :class="{ 'not-delivery-type': goodsData.delivery.express_type.length <= 1 }" v-if="orderCreateData.delivery.delivery_type == 'local'"> <view class="address-box" :class="{ 'not-delivery-type': goodsData.delivery.express_type.length <= 1 }" v-if="orderCreateData.delivery.delivery_type == 'local'">
<view v-if="localMemberAddress"> <view v-if="localMemberAddress">
<block v-if="storeList && Object.keys(storeList).length > 1"> <block v-if="storeList && Object.keys(storeList).length > 0">
<view class="local-delivery-store" v-if="storeInfo" @click="openPopup('deliveryPopup')"> <view class="local-delivery-store">
<view class="info"> <view class="info" v-if="storeInfo">
<text class="store-name">{{ storeInfo.store_name }}</text> <text class="store-name">{{ storeInfo.store_name }}</text>
提供配送 提供配送
<view>营业时间{{ storeInfo.open_date }}</view>
</view> </view>
<view class="cell-more"> <view class="info" v-else>
<text class="store-name">超出配送范围请选择其他门店</text>
</view>
<view class="cell-more" v-if="Object.keys(storeList).length > 1" @click="openPopup('deliveryPopup')">
<text>点击切换</text> <text>点击切换</text>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</view> </view>
</view> </view>
<view v-else class="local-delivery-store">
<view class="info">
<text class="store-name">您的附近没有可配送的门店请选择其他配送方式</text>
</view>
</view>
</block> </block>
<view class="info-wrap local" @click="selectAddress"> <view class="info-wrap local" @click="selectAddress">
<view class="content"> <view class="content">
<text class="name">{{ localMemberAddress.name ? localMemberAddress.name : '' }} <text class="name">{{ localMemberAddress.name ? localMemberAddress.name : '' }}</text>
</text> <text class="mobile">{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }}</text>
<text class="mobile">{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }}
</text>
<view class="desc-wrap"> <view class="desc-wrap">
{{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }}
{{ localMemberAddress.address ? localMemberAddress.address : '' }} {{ localMemberAddress.address ? localMemberAddress.address : '' }}
@@ -125,9 +122,9 @@
<text>{{ storeInfo.store_name }}</text> <text>{{ storeInfo.store_name }}</text>
</view> </view>
<view class="store-detail"> <view class="store-detail">
<view class="close-desc" v-if="storeInfo.status == 0 && storeInfo.close_desc">{{ storeInfo.close_desc }}</view>
<view v-if="storeInfo.open_date">营业时间{{ storeInfo.open_date }}</view> <view v-if="storeInfo.open_date">营业时间{{ storeInfo.open_date }}</view>
<view class="address">{{ storeInfo.full_address }} {{ storeInfo.address }} <view class="address">{{ storeInfo.full_address }} {{ storeInfo.address }}</view>
</view>
</view> </view>
</view> </view>
<view class="cell-more iconfont icon-right" v-if="storeList && Object.keys(storeList).length > 1"></view> <view class="cell-more iconfont icon-right" v-if="storeList && Object.keys(storeList).length > 1"></view>
@@ -145,7 +142,14 @@
<input type="number" maxlength="11" placeholder="请输入您的手机号码" placeholder-class="color-tip placeholder" class="input" v-model="orderCreateData.member_address.mobile" /> <input type="number" maxlength="11" placeholder="请输入您的手机号码" placeholder-class="color-tip placeholder" class="input" v-model="orderCreateData.member_address.mobile" />
</view> </view>
</view> </view>
<view class="store-time" @click="storetime('')"> <view class="store-time" v-if="goodsData.jielong_id">
<view class="left">提货时间</view>
<view class="right">
{{ $util.timeStampTurnTime(goodsData.jielong_info.take_start_time,'Y/m/d') }} ~ {{ $util.timeStampTurnTime(goodsData.jielong_info.take_end_time,'Y/m/d') }}
</view>
</view>
<view class="store-time" @click="storetime('')" v-else>
<view class="left">提货时间</view> <view class="left">提货时间</view>
<view class="right"> <view class="right">
{{ deliveryTime }} {{ deliveryTime }}
@@ -159,15 +163,10 @@
</template> </template>
<!-- 店铺 --> <!-- 店铺 -->
<view class="site-wrap order-goods" v-if="calculateGoodsData">
<view class="site-wrap order-goods" v-for="(calculateGoodsData, siteIndex) in shop_goods_list" :key="siteIndex">
<view class="site-header">
<view class="iconfont icon-dianpu"></view>
<text class="site-name">{{calculateGoodsData.site_name}}</text>
</view>
<view class="site-body"> <view class="site-body">
<!-- 商品 --> <!-- 商品 -->
<view class="goods-item" v-for="(goodsItem, goodsIndex) in goodsSpecFormat(calculateGoodsData.goods_list)" :key="goodsIndex"> <view class="goods-item" v-for="(goodsItem, goodsIndex) in calculateGoodsData.goods_list" :key="goodsIndex">
<view class="goods-wrap"> <view class="goods-wrap">
<view class="goods-img" @click="$util.redirectTo('/pages/goods/detail', { goods_id: goodsItem.goods_id })"> <view class="goods-img" @click="$util.redirectTo('/pages/goods/detail', { goods_id: goodsItem.goods_id })">
<image :src="$util.img(goodsItem.sku_image, { size: 'mid' })" @error="imageError(goodsIndex)" mode="aspectFill"/> <image :src="$util.img(goodsItem.sku_image, { size: 'mid' })" @error="imageError(goodsIndex)" mode="aspectFill"/>
@@ -210,6 +209,17 @@
</view> </view>
</view> </view>
</view> </view>
<view class="member-goods-card order-cell" v-if="calculateGoodsData.goods_list[goodsIndex].member_card_list" @click="selectMemberGoodsCard(goodsIndex)">
<text class="tit">次卡抵扣</text>
<view class="box text-overflow">
<block v-if="calculateGoodsData.goods_list[goodsIndex].card_promotion_money">
<text class="text">次卡抵扣{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}张/{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}次</text>
<text class="price-font">-¥{{ calculateGoodsData.goods_list[goodsIndex].card_promotion_money | moneyFormat }}</text>
</block>
<text class="color-tip" v-else>请选择次卡</text>
</view>
<text class="iconfont icon-right"></text>
</view>
<view class="goods-form" v-if="goodsData.goods_list[goodsIndex].goods_form" @click="editForm(goodsIndex)"> <view class="goods-form" v-if="goodsData.goods_list[goodsIndex].goods_form" @click="editForm(goodsIndex)">
<ns-form :data="goodsData.goods_list[goodsIndex].goods_form.json_data" ref="goodsForm" :custom-attr="{ sku_id: goodsItem.sku_id, form_id: goodsData.goods_list[goodsIndex].goods_form.id }"/> <ns-form :data="goodsData.goods_list[goodsIndex].goods_form.json_data" ref="goodsForm" :custom-attr="{ sku_id: goodsItem.sku_id, form_id: goodsData.goods_list[goodsIndex].goods_form.id }"/>
<text class="cell-more iconfont icon-right"></text> <text class="cell-more iconfont icon-right"></text>
@@ -217,48 +227,18 @@
</view> </view>
</view> </view>
</view> </view>
<view class="site-wrap buyer-message">
</view> </view>
<view class="order-money" style="margin: 0;"> <view class="site-wrap buyer-message">
<view class="order-cell"> <view class="order-cell">
<text class="tit">买家留言</text> <text class="tit">买家留言</text>
<view class="box text-overflow " @click="openPopup('buyerMessagePopup')"> <view class="box text-overflow " @click="openPopup('buyerMessagePopup')">
<text v-if="orderCreateData.buyer_message">{{ orderCreateData.buyer_message[calculateGoodsData.merch_id] }}</text> <text v-if="orderCreateData.buyer_message">{{ orderCreateData.buyer_message }}</text>
<text class="color-sub" v-else>无留言</text> <text class="color-sub" v-else>无留言</text>
</view> </view>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</view> </view>
<view class="order-cell coupon" v-if="modules.indexOf('coupon') != -1">
<text class="tit">优惠券</text>
<view class="box text-overflow"@click="openSiteCoupon(calculateGoodsData.merch_id)">
<template v-if="orderCreateData.coupon[calculateGoodsData.merch_id].coupon_id">
<text class="money price-font" style="max-width: 100%;">已选择1张优惠券</text>
<!-- <text class="unit price-font">优惠</text>
<text class="money price-font">{{ (calculateData && calculateData.coupon_money ? calculateData.coupon_money : 0) | moneyFormat }}</text> -->
</template>
<text v-else>不使用优惠券</text>
</view> </view>
<text class="iconfont icon-right"></text>
</view>
</view>
<view class="site-wrap buyer-message">
<view class="order-cell">
<view class="box shop-item">
<text class="color-tip goods-num">共{{ calculateGoodsData.goods_num }}件</text>
<text class="font-size-base">小计:</text>
<text class="color-base-text unit">{{ $lang('common.currencySymbol') }}</text>
<text class="color-base-text money">{{ calculateGoodsData.goods_money | moneyFormat }}</text>
</view>
</view>
</view>
</view>
<view v-if="paymentData.system_form" class="system-form-wrap"> <view v-if="paymentData.system_form" class="system-form-wrap">
<view class="order-cell"> <view class="order-cell">
@@ -267,7 +247,7 @@
<ns-form :data="paymentData.system_form.json_data" ref="form"/> <ns-form :data="paymentData.system_form.json_data" ref="form"/>
</view> </view>
<!-- <view class="site-wrap" v-if="calculateGoodsData || promotionInfo || (calculateGoodsData && calculateGoodsData.max_usable_point > 0) || goodsData.invoice"> <view class="site-wrap" v-if="calculateGoodsData || promotionInfo || (calculateGoodsData && calculateGoodsData.max_usable_point > 0) || goodsData.invoice">
<view class="site-footer"> <view class="site-footer">
<view class="order-cell coupon" v-if="modules.indexOf('coupon') != -1"> <view class="order-cell coupon" v-if="modules.indexOf('coupon') != -1">
<text class="tit">优惠券</text> <text class="tit">优惠券</text>
@@ -306,7 +286,7 @@
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</view> </view>
</view> </view>
</view> --> </view>
<view class="site-wrap box member-card-wrap" v-if="paymentData.recommend_member_card && Object.keys(paymentData.recommend_member_card).length > 0"> <view class="site-wrap box member-card-wrap" v-if="paymentData.recommend_member_card && Object.keys(paymentData.recommend_member_card).length > 0">
<view class="head" @click="selectMemberCard"> <view class="head" @click="selectMemberCard">
@@ -320,7 +300,7 @@
<text class="iconfont" :class="orderCreateData.is_open_card == 1 ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></text> <text class="iconfont" :class="orderCreateData.is_open_card == 1 ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></text>
</view> </view>
<view class="body" v-if="orderCreateData.is_open_card"> <view class="body" v-if="orderCreateData.is_open_card">
<view class="item" :class="{ 'active color-base-border': item.key == orderCreateData.member_card_unit }" v-for="(item, index) in cardChargeType" :key="index" @click="selectMembercardUnit(item.key)"> <view class="item" :class="{ 'active color-base-border': item.key == orderCreateData.member_card_unit }" v-for="(item, index) in cardChargeType" :key="index" @click="selectMemberCardUnit(item.key)">
<view class="title">{{ item.title }}</view> <view class="title">{{ item.title }}</view>
<view class="price price-font">{{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }}</view> <view class="price price-font">{{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }}</view>
<text class="iconfont icon-icon color-base-text price-font identify" v-if="item.key == orderCreateData.member_card_unit"></text> <text class="iconfont icon-icon color-base-text price-font identify" v-if="item.key == orderCreateData.member_card_unit"></text>
@@ -346,7 +326,7 @@
<text class="money price-font">{{ calculateData.delivery_money | moneyFormat }}</text> <text class="money price-font">{{ calculateData.delivery_money | moneyFormat }}</text>
</view> </view>
</view> </view>
<!-- <view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_money > 0"> <view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_money > 0">
<text class="tit"> <text class="tit">
<text>税费</text> <text>税费</text>
<text class="color-base-text font-bold price-font">({{ goodsData.invoice.invoice_rate }}%)</text> <text class="color-base-text font-bold price-font">({{ goodsData.invoice.invoice_rate }}%)</text>
@@ -356,15 +336,15 @@
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text> <text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.invoice_money | moneyFormat }}</text> <text class="money price-font">{{ calculateData.invoice_money | moneyFormat }}</text>
</view> </view>
</view> --> </view>
<!-- <view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_delivery_money > 0"> <view class="order-cell" v-if="orderCreateData.is_invoice && calculateData.invoice_delivery_money > 0">
<text class="tit">发票邮寄费</text> <text class="tit">发票邮寄费</text>
<view class="box color-base-text"> <view class="box color-base-text">
<text class="operator">+</text> <text class="operator">+</text>
<text class="unit price-font">{{ $lang('common.currencySymbol') }}</text> <text class="unit price-font">{{ $lang('common.currencySymbol') }}</text>
<text class="money price-font">{{ calculateData.invoice_delivery_money | moneyFormat }}</text> <text class="money price-font">{{ calculateData.invoice_delivery_money | moneyFormat }}</text>
</view> </view>
</view> --> </view>
<view class="order-cell" v-if="calculateData.promotion_money > 0"> <view class="order-cell" v-if="calculateData.promotion_money > 0">
<text class="tit">优惠</text> <text class="tit">优惠</text>
<view class="box color-base-text"> <view class="box color-base-text">
@@ -389,7 +369,7 @@
<text class="money price-font">{{ calculateData.point_money | moneyFormat }}</text> <text class="money price-font">{{ calculateData.point_money | moneyFormat }}</text>
</view> </view>
</view> </view>
<!-- <view class="order-cell" v-if="calculateData.member_card_money > 0"> <view class="order-cell" v-if="calculateData.member_card_money > 0">
<text class="tit">会员卡</text> <text class="tit">会员卡</text>
<view class="box color-base-text"> <view class="box color-base-text">
<text class="operator">+</text> <text class="operator">+</text>
@@ -397,7 +377,7 @@
<text class="money price-font">{{ calculateData.member_card_money | moneyFormat }} <text class="money price-font">{{ calculateData.member_card_money | moneyFormat }}
</text> </text>
</view> </view>
</view> --> </view>
</view> </view>
<view v-if="transactionAgreement.title && transactionAgreement.content" class="agreement">购买前请先阅读<text @click="$refs.agreementPopup.open()">《{{ transactionAgreement.title }}》</text>,下单即代表同意该协议</view> <view v-if="transactionAgreement.title && transactionAgreement.content" class="agreement">购买前请先阅读<text @click="$refs.agreementPopup.open()">《{{ transactionAgreement.title }}》</text>,下单即代表同意该协议</view>
@@ -412,7 +392,7 @@
</view> </view>
<view class="submit-btn"> <view class="submit-btn">
<button type="primary" class="mini" size="mini" @click="create()" v-if="!surplusStartMoney()">提交订单</button> <button type="primary" class="mini" size="mini" @click="create()" v-if="!surplusStartMoney()">提交订单</button>
<!-- <button v-else class="no-submit mini" size="mini">差{{ surplusStartMoney() | moneyFormat }}起送</button> --> <button v-else class="no-submit mini" size="mini">差{{ surplusStartMoney() | moneyFormat }}起送</button>
</view> </view>
</view> </view>
<view class="order-submit-block"></view> <view class="order-submit-block"></view>
@@ -420,6 +400,68 @@
<payment ref="choosePaymentPopup" @close="payClose" v-if="calculateData"></payment> <payment ref="choosePaymentPopup" @close="payClose" v-if="calculateData"></payment>
</template> </template>
<!-- 发票弹窗 -->
<uni-popup ref="invoicePopup" type="bottom" :mask-click="false">
<view :style="orderCreateData.is_invoice == 1 ? 'height: 83vh;' : 'height: 48vh;'" class="invoice-popup popup" @touchmove.prevent.stop>
<view class="popup-header">
<text class="tit">发票</text>
<text class="iconfont icon-close" @click="closePopup('invoicePopup')"></text>
</view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view>
<view class="invoice-cell" v-if="goodsData.invoice">
<text class="tit">需要发票</text>
<view class="option-grpup">
<view class="option-item" :class="{ 'color-base-bg active': orderCreateData.is_invoice == 0 }" @click="changeIsInvoice">不需要</view>
<view class="option-item" :class="{ 'color-base-bg active': orderCreateData.is_invoice == 1 }" @click="changeIsInvoice">需要</view>
</view>
</view>
<block v-if="orderCreateData.is_invoice == 1">
<view class="invoice-cell">
<text class="tit">发票类型</text>
<view class="option-grpup">
<view class="option-item" :class="{ 'color-base-bg active': orderCreateData.invoice_type == item }" @click="changeInvoiceType(item)" v-for="(item, index) in goodsData.invoice.invoice_type.split(',')" :key="index">
{{ item == 1 ? '纸质' : '电子' }}
</view>
</view>
</view>
<view class="invoice-cell">
<text class="tit">抬头类型</text>
<view class="option-grpup">
<view class="option-item" :class="{ 'color-base-bg active': orderCreateData.invoice_title_type == 1 }" @click="changeInvoiceTitleType(1)">
个人
</view>
<view class="option-item" :class="{ 'color-base-bg active': orderCreateData.invoice_title_type == 2 }" @click="changeInvoiceTitleType(2)">
企业
</view>
</view>
</view>
<view class="invoice-cell">
<text class="tit">发票信息</text>
<view class="invoice-form-group">
<input type="text" placeholder="请填写抬头名称" v-model.trim="orderCreateData.invoice_title" />
<input v-if="orderCreateData.invoice_title_type == 2" type="text" placeholder="请填写纳税人识别号" v-model.trim="orderCreateData.taxpayer_number" />
<input type="text" placeholder="请填写邮寄地址" v-model.trim="orderCreateData.invoice_full_address" v-if="orderCreateData.invoice_type == 1" />
<input type="text" placeholder="请填写邮箱" v-model.trim="orderCreateData.invoice_email" v-if="orderCreateData.invoice_type == 2" />
</view>
</view>
<view class="invoice-cell">
<text class="tit">发票内容</text>
<view class="option-grpup">
<view :key="index" v-for="(item, index) in goodsData.invoice.invoice_content_array" :class="{ 'color-base-bg active': item == orderCreateData.invoice_content }" @click="changeInvoiceContent(item)" class="option-item content">
{{ item }}
</view>
</view>
</view>
</block>
<view class="invoice-tops">发票内容将以根据税法调整,具体请以展示为准,发票内容显示详细商品名 称及价格信息</view>
</view>
</scroll-view>
<view class="popup-footer" @click="saveInvoice" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg">确定</view>
</view>
</view>
</uni-popup>
<!-- 活动优惠弹窗 --> <!-- 活动优惠弹窗 -->
<uni-popup ref="promotionPopup" type="bottom" v-if="promotionInfo"> <uni-popup ref="promotionPopup" type="bottom" v-if="promotionInfo">
@@ -431,8 +473,7 @@
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }"> <scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view class="order-cell" style="align-items: baseline;"> <view class="order-cell" style="align-items: baseline;">
<view class="tit"> <view class="tit">
<text class="promotion-mark ns-gradient-promotionpages-payment">{{ promotionInfo.title }} <text class="promotion-mark ns-gradient-promotionpages-payment">{{ promotionInfo.title }}</text>
</text>
</view> </view>
<view class="promotion-content"> <view class="promotion-content">
<view class="tit tit-content" style="white-space: pre-line;" v-html="promotionInfo.content"></view> <view class="tit tit-content" style="white-space: pre-line;" v-html="promotionInfo.content"></view>
@@ -465,6 +506,7 @@
<text v-if="item.distance">({{ item.distance }}km)</text> <text v-if="item.distance">({{ item.distance }}km)</text>
</view> </view>
<view class="info"> <view class="info">
<view v-if="item.status == 0 && item.close_desc" class="close-desc">{{ item.close_desc }}</view>
<view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">营业时间:{{ item.open_date }}</view> <view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">营业时间:{{ item.open_date }}</view>
<view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">地址:{{ item.full_address }}{{ item.address }}</view> <view :class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''" class="font-size-goods-tag">地址:{{ item.full_address }}{{ item.address }}</view>
</view> </view>
@@ -478,6 +520,33 @@
<ns-empty text="所选择收货地址附近没有可以自提的门店" :isIndex="false"></ns-empty> <ns-empty text="所选择收货地址附近没有可以自提的门店" :isIndex="false"></ns-empty>
</view> </view>
</view> </view>
<!-- <block v-if="storeList">
<view class="item-wrap" v-for="(item, index) in storeList" :key="index"
@click="selectPickupPoint(item)">
<view class="detail">
<view class="name"
:class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''">
<text>{{ item.store_name }}</text>
<text v-if="item.distance">({{ item.distance }}km)</text>
</view>
<view class="info">
<view
:class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''"
class="font-size-goods-tag">
营业时间:{{ item.open_date }}
</view>
<view
:class="item.store_id == orderCreateData.delivery.store_id ? 'color-base-text' : ''"
class="font-size-goods-tag">
地址:{{ item.full_address }}{{ item.address }}
</view>
</view>
</view>
<view class="icon" v-if="item.store_id == orderCreateData.delivery.store_id">
<text class="iconfont icon-yuan_checked color-base-text"></text>
</view>
</view>
</block> -->
</block> </block>
</mescroll-uni> </mescroll-uni>
@@ -509,7 +578,7 @@
</uni-popup> </uni-popup>
<!-- 优惠券弹窗 --> <!-- 优惠券弹窗 -->
<uni-popup ref="couponPopup" type="bottom" :mask-click="false"> <uni-popup ref="couponPopup" type="bottom" v-if="calculateGoodsData" :mask-click="false">
<view class="coupon-popup popup" @touchmove.prevent.stop> <view class="coupon-popup popup" @touchmove.prevent.stop>
<view class="popup-header"> <view class="popup-header">
<text class="tit">优惠券</text> <text class="tit">优惠券</text>
@@ -517,8 +586,8 @@
</view> </view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }"> <scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view v-if="merchCoupon.data.length > 0"> <view v-if="coupon_list.length > 0">
<view class="coupon-item" v-for="(couponItem, couponIndex) in merchCoupon.data" :key="couponIndex" @click="selectCoupon(couponItem,merchCoupon.merch_id)"> <view class="coupon-item" v-for="(couponItem, couponIndex) in coupon_list" :key="couponIndex" @click="selectCoupon(couponItem)">
<view class="coupon-info" :style="{ backgroundColor: 'var(--main-color-shallow)' }"> <view class="coupon-info" :style="{ backgroundColor: 'var(--main-color-shallow)' }">
<view class="info-wrap"> <view class="info-wrap">
<image class="coupon-line" mode="heightFix" :src="$util.img('public/uniapp/coupon/coupon_line.png')"/> <image class="coupon-line" mode="heightFix" :src="$util.img('public/uniapp/coupon/coupon_line.png')"/>
@@ -536,12 +605,8 @@
<text class="unit">折</text> <text class="unit">折</text>
</template> </template>
<view class="at-least"> <view class="at-least">
<template v-if="couponItem.at_least > 0"> <template v-if="couponItem.at_least > 0">满{{ couponItem.at_least }}可用</template>
满{{ couponItem.at_least }}可用 <template v-else>无门槛</template>
</template>
<template v-else>
无门槛
</template>
</view> </view>
</view> </view>
</view> </view>
@@ -550,7 +615,7 @@
<view v-if="couponItem.type == 'discount' && couponItem.discount_limit > 0" class="limit">最多可抵¥{{ couponItem.discount_limit }}</view> <view v-if="couponItem.type == 'discount' && couponItem.discount_limit > 0" class="limit">最多可抵¥{{ couponItem.discount_limit }}</view>
<view class="time font-size-goods-tag">有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }}</view> <view class="time font-size-goods-tag">有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }}</view>
</view> </view>
<view class="iconfont" :class="selectCouponId == couponItem.coupon_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view> <view class="iconfont" :class="orderCreateData.coupon.coupon_id == couponItem.coupon_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view>
</view> </view>
</view> </view>
</view> </view>
@@ -558,7 +623,7 @@
</scroll-view> </scroll-view>
<view class="popup-footer" :class="{ 'bottom-safe-area': isIphoneX }"> <view class="popup-footer" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg" @click="useCpopon">确定</view> <view class="confirm-btn color-base-bg" @click="useCoupon">确定</view>
</view> </view>
</view> </view>
</uni-popup> </uni-popup>
@@ -573,7 +638,7 @@
<view class="title">{{ transactionAgreement.title }}</view> <view class="title">{{ transactionAgreement.title }}</view>
<view class="con"> <view class="con">
<scroll-view scroll-y="true" class="con"> <scroll-view scroll-y="true" class="con">
<rich-text :nodes="transactionAgreement.content"></rich-text> <ns-mp-html :content="transactionAgreement.content"></ns-mp-html>
</scroll-view> </scroll-view>
</view> </view>
</view> </view>
@@ -588,7 +653,7 @@
<text class="iconfont icon-close" @click="$refs.editFormPopup.close()"></text> <text class="iconfont icon-close" @click="$refs.editFormPopup.close()"></text>
</view> </view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }"> <scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<ns-form v-if="tempFormData" :data="tempFormData.json_data" ref="tempForm"></ns-form> <ns-form v-if="tempFormData" :data="tempFormData.json_data" ref="tempForm" />
</scroll-view> </scroll-view>
<view class="popup-footer" @click="saveForm" :class="{ 'bottom-safe-area': isIphoneX }"> <view class="popup-footer" @click="saveForm" :class="{ 'bottom-safe-area': isIphoneX }">
<view class="confirm-btn color-base-bg">确定</view> <view class="confirm-btn color-base-bg">确定</view>
@@ -603,7 +668,7 @@
<text class="iconfont icon-close" @click="$refs.memberGoodsCardPopup.close()"></text> <text class="iconfont icon-close" @click="$refs.memberGoodsCardPopup.close()"></text>
</view> </view>
<scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }"> <scroll-view scroll-y="true" class="popup-body" :class="{ 'safe-area': isIphoneX }">
<view v-for="(item, index) in selectGoodsCard.cardList" class="card-item" @click="selectGoodsCard.click(item.item_id)"> <view v-for="(item, index) in selectGoodsCard.cardList" class="card-item" @click="selectGoodsCard.click(item.item_id)" :key="item.item_id">
<view class="content"> <view class="content">
<view class="title">{{ item.goods_name }}</view> <view class="title">{{ item.goods_name }}</view>
<view class="info"> <view class="info">

View File

@@ -1,5 +1,6 @@
<template> <template>
<x-skeleton data-component-name="diy-article" type="list" :loading="loading" :configs="skeletonConfig"> <view :style="value.pageStyle" v-if="loading || (list && list.length)">
<x-skeleton type="list" :loading="loading" :configs="skeletonConfig">
<view class="article-wrap" :style="warpCss"> <view class="article-wrap" :style="warpCss">
<view :class="['list-wrap', value.style]" :style="warpCss"> <view :class="['list-wrap', value.style]" :style="warpCss">
<view :class="['item', value.ornament.type]" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :style="itemCss"> <view :class="['item', value.ornament.type]" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :style="itemCss">
@@ -8,19 +9,19 @@
</view> </view>
<view class="info-wrap"> <view class="info-wrap">
<text class="title">{{ item.article_title }}</text> <text class="title">{{ item.article_title }}</text>
<text class="desc" style="color:#888;font-size: 24rpx; display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;overflow: hidden;text-overflow: ellipsis;">{{ item.article_abstract }}</text>
<view class="read-wrap"> <view class="read-wrap">
<block v-if="item.category_name"> <block v-if="item.category_name">
<text class="category-icon"></text> <text class="category-icon"></text>
<text>{{ item.category_name }}</text> <text>{{ item.category_name }}</text>
</block> </block>
<text class="date">{{ $util.timeStampTurnTime(item.create_time, 'date') }}</text> <text class="date">{{ $util.timeStampTurnTime(item.create_time, 'Y-m-d') }}</text>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</x-skeleton> </x-skeleton>
</view>
</template> </template>
<script> <script>
@@ -29,7 +30,10 @@
name: 'diy-article', name: 'diy-article',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,4 +1,5 @@
<template> <template>
<view :style="value.pageStyle" v-if="loading || (list && list.length)">
<x-skeleton data-component-name="diy-bargain" :type="skeletonType" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-bargain" :type="skeletonType" :loading="loading" :configs="skeletonConfig">
<view class="diy-bargain" :class="[value.template, value.style]" :style="warpCss"> <view class="diy-bargain" :class="[value.template, value.style]" :style="warpCss">
@@ -123,6 +124,7 @@
</view> </view>
</x-skeleton> </x-skeleton>
</view>
</template> </template>
<script> <script>
@@ -130,7 +132,10 @@
name: 'diy-bargain', name: 'diy-bargain',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -33,14 +33,13 @@
</block> </block>
<block v-if="type == 'goods'"> <block v-if="type == 'goods'">
<view class="categoty-goods-wrap" v-if="loadType == 'part'" <view class="categoty-goods-wrap" v-if="loadType == 'part'" :style="'padding-top:' + (value.search ? 0 : '20rpx')">
:style="'padding-top:' + (value.search ? 0 : '20rpx')">
<!-- 分类筛选 --> <!-- 分类筛选 -->
<block v-if="category.child_list && value.goodsLevel == 2"> <block v-if="category.child_list && value.goodsLevel == 2">
<view class="screen-category-wrap"> <view class="screen-category-wrap">
<scroll-view scroll-x="true" class="screen-category" :class="{ 'screen-category-4': value.template == 4 }" :scroll-with-animation="true" :scroll-into-view="scrollIntoView"> <scroll-view scroll-x="true" class="screen-category" :class="{ 'screen-category-4': value.template == 4 }" :scroll-with-animation="true" :scroll-into-view="scrollIntoView">
<view class="item" id="category-2--1" :class="{ selected: categoryId == -1 }" @click="selectCategoey(-1)">全部</view> <view class="item" id="category-2--1" :class="{ selected: categoryId == -1 }" @click="selectCategory(-1)">全部</view>
<view class="item" :id="'category-2-' + oneIndex" :class="{ selected: categoryId == oneIndex }" @click="selectCategoey(oneIndex)" v-for="(one, oneIndex) in category.child_list" :key="oneIndex"> <view class="item" :id="'category-2-' + oneIndex" :class="{ selected: categoryId == oneIndex }" @click="selectCategory(oneIndex)" v-for="(one, oneIndex) in category.child_list" :key="oneIndex">
{{ one.category_name }} {{ one.category_name }}
</view> </view>
</scroll-view> </scroll-view>
@@ -50,14 +49,14 @@
<view class="screen-category-popup" @click="$refs.screenCategoryPopup.close()"> <view class="screen-category-popup" @click="$refs.screenCategoryPopup.close()">
<scroll-view scroll-y="true" class="screen-category" :class="{ 'screen-category-4': value.template == 4 }"> <scroll-view scroll-y="true" class="screen-category" :class="{ 'screen-category-4': value.template == 4 }">
<view class="title">全部</view> <view class="title">全部</view>
<view class="item" :class="{ selected: categoryId == oneIndex }" @click="selectCategoey(oneIndex)" v-for="(one, oneIndex) in category.child_list" :key="oneIndex"> <view class="item" :class="{ selected: categoryId == oneIndex }" @click="selectCategory(oneIndex)" v-for="(one, oneIndex) in category.child_list" :key="oneIndex">
{{ one.category_name }} {{ one.category_name }}
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
</uni-popup> </uni-popup>
</block> </block>
<!---->
<scroll-view scroll-y="true" class="scroll-goods-view" lower-threshold="300" :scroll-top="scrollTop" @scrolltolower="scrolltolower" @touchstart="touchstart" @touchend="touchend" @scroll="listenScroll"> <scroll-view scroll-y="true" class="scroll-goods-view" lower-threshold="300" :scroll-top="scrollTop" @scrolltolower="scrolltolower" @touchstart="touchstart" @touchend="touchend" @scroll="listenScroll">
<!--一级分类展示商品显示--> <!--一级分类展示商品显示-->
@@ -70,6 +69,9 @@
<view class="goods-img" @click="toDetail(item)"> <view class="goods-img" @click="toDetail(item)">
<image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)"/> <image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)"/>
<view class="color-base-bg goods-tag" v-if="item.label_name">{{ item.label_name }}</view> <view class="color-base-bg goods-tag" v-if="item.label_name">{{ item.label_name }}</view>
<view class="sell-out" v-if="item.goods_stock <= 0">
<text class="iconfont icon-shuqing"></text>
</view>
</view> </view>
<view class="info-wrap"> <view class="info-wrap">
<view class="name-wrap" @click="toDetail(item)"> <view class="name-wrap" @click="toDetail(item)">
@@ -293,7 +295,7 @@
oneCategorySelect: function() { oneCategorySelect: function() {
this.scrollTop = -1; this.scrollTop = -1;
this.goodsList = []; this.goodsList = [];
this.selectCategoey(-1); this.selectCategory(-1);
}, },
select: function() { select: function() {
if (this.index == this.select) { if (this.index == this.select) {
@@ -607,7 +609,7 @@
} }
this.$emit('selectsku', data); this.$emit('selectsku', data);
}, },
selectCategoey(index) { selectCategory(index) {
this.categoryId = index; this.categoryId = index;
this.pageIndex = 0; this.pageIndex = 0;
this.totalPage = 1; this.totalPage = 1;
@@ -667,7 +669,7 @@
this.$emit('switch', index); this.$emit('switch', index);
} else { } else {
let index = this.categoryId - 1; let index = this.categoryId - 1;
this.selectCategoey(index); this.selectCategory(index);
} }
} else { } else {
if (this.categoryId == -1 || (this.category.child_list && this.categoryId == this.category.child_list.length - 1)) { if (this.categoryId == -1 || (this.category.child_list && this.categoryId == this.category.child_list.length - 1)) {
@@ -675,7 +677,7 @@
this.$emit('switch', index); this.$emit('switch', index);
} else { } else {
let index = this.categoryId + 1; let index = this.categoryId + 1;
this.selectCategoey(index); this.selectCategory(index);
} }
} }
}, },
@@ -995,7 +997,27 @@
height: 100%; height: 100%;
} }
} }
.sell-out{
position: absolute;
z-index: 1;
width: 180rpx;
height: 180rpx;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.5);
border-radius: $border-radius;
text{
color: #fff;
font-size: 150rpx;
position: absolute;
left:50%;
top:50%;
transform: translateX(-50%) translateY(-50%);
}
}
.info-wrap { .info-wrap {
flex: 1; flex: 1;
display: flex; display: flex;
@@ -1171,10 +1193,28 @@
height: auto; height: auto;
margin-right: 0; margin-right: 0;
line-height: 1; line-height: 1;
position: relative;
image { image {
border-radius: 8rpx; border-radius: 8rpx;
} }
.sell-out{
position: absolute;
z-index: 1;
width: 100%;
height: auto;
top: 0;
left: 0;
bottom:0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.5);
border-radius: $border-radius;
text{
color: #fff;
font-size: 240rpx;
}
}
} }
.select-sku { .select-sku {
@@ -1200,7 +1240,7 @@
.screen-category-wrap { .screen-category-wrap {
display: flex; display: flex;
padding-top: 20rpx;
.icon-unfold { .icon-unfold {
font-size: 24rpx; font-size: 24rpx;
color: #999; color: #999;

View File

@@ -2,20 +2,20 @@
<view data-component-name="diy-category" :class="['category-page-wrap', 'category-template-' + value.template]" <view data-component-name="diy-category" :class="['category-page-wrap', 'category-template-' + value.template]"
:style="{height: 'calc(100vh - '+ tabBarHeight +')' }"> :style="{height: 'calc(100vh - '+ tabBarHeight +')' }">
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<!-- <block v-if="value.template == 4"> <block v-if="value.template == 4">
<view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')" :style="navbarInnerStyle"> <view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')" :style="navbarInnerStyle">
<view class="search-content"> <view class="search-content">
<input type="text" class="uni-input font-size-tag" maxlength="50" :placeholder="$lang('search')" confirm-type="search" disabled="true" /> <input type="text" class="uni-input font-size-tag" maxlength="50" :placeholder="$lang('search')" confirm-type="search" readonly="true" disabled="true" />
<text class="iconfont icon-sousuo3"></text> <text class="iconfont icon-sousuo3"></text>
</view> </view>
</view> </view>
<view :style="navbarInnerStyle" v-if="!value.search">商品分类</view> <view :style="navbarInnerStyle" v-if="!value.search">商品分类</view>
</block> --> </block>
<block v-if="value.template != 4"> <block v-if="value.template != 4">
<!-- <view :style="navbarInnerStyle">商品分类</view> --> <view :style="navbarInnerStyle">商品分类</view>
<view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')" :style="wxSearchHeight"> <view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')" :style="wxSearchHeight">
<view class="search-content"> <view class="search-content">
<input type="text" class="uni-input" maxlength="50" :placeholder="$lang('search')" confirm-type="search" disabled="true" /> <input type="text" class="uni-input" maxlength="50" :placeholder="$lang('search')" confirm-type="search" readonly="true" disabled="true" />
<text class="iconfont icon-sousuo3"></text> <text class="iconfont icon-sousuo3"></text>
</view> </view>
</view> </view>
@@ -24,11 +24,12 @@
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
<view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')"> <view class="search-box" v-if="value.search" @click="$util.redirectTo('/pages_tool/goods/search')">
<view class="search-content"> <view class="search-content">
<input type="text" class="uni-input" maxlength="50" :placeholder="$lang('search')" confirm-type="search" disabled="true" /> <input type="text" class="uni-input" maxlength="50" :placeholder="$lang('search')" confirm-type="search" readonly="true" disabled="true" />
<text class="iconfont icon-sousuo3"></text> <text class="iconfont icon-sousuo3"></text>
</view> </view>
</view> </view>
<!-- #endif --> <!-- #endif -->
<view class="template-four wx" v-if="value.template == 4"> <view class="template-four wx" v-if="value.template == 4">
<scroll-view scroll-x="true" class="template-four-wrap" :scroll-with-animation="true" :scroll-into-view="'category-one-' + oneCategorySelect" enable-flex="true"> <scroll-view scroll-x="true" class="template-four-wrap" :scroll-with-animation="true" :scroll-into-view="'category-one-' + oneCategorySelect" enable-flex="true">
<view class="category-item" :id="'category-one-' + index" v-for="(item, index) in templateFourData" :key="index" :class="{ select: oneCategorySelect == index }" @click="templateFourOneFn(index)"> <view class="category-item" :id="'category-one-' + index" v-for="(item, index) in templateFourData" :key="index" :class="{ select: oneCategorySelect == index }" @click="templateFourOneFn(index)">
@@ -71,12 +72,13 @@
{ 'border-bottom': value.template == 4 && select + 1 === index }, { 'border-bottom': value.template == 4 && select + 1 === index },
{ 'border-top': value.template == 4 && select - 1 === index } { 'border-top': value.template == 4 && select - 1 === index }
]" @click="switchOneCategory(index)"> ]" @click="switchOneCategory(index)">
<view class="">{{ item.category_name }}</view> <view>{{ item.category_name }}</view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<view class="right-flex-wrap"> <view class="right-flex-wrap">
<scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 1 || loadType == 'all'" <scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 1 || loadType == 'all'"
ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true" ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true"
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true" @scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
@@ -113,8 +115,8 @@
<image :src="$util.img('public/uniapp/category/empty.png')" mode="widthFix"></image> <image :src="$util.img('public/uniapp/category/empty.png')" mode="widthFix"></image>
<view class="tips">暂时没有分类哦</view> <view class="tips">暂时没有分类哦</view>
</view> </view>
<view class="cart-bottom-block" v-if="(value.template == 2 || value.template == 4) && value.quickBuy && storeToken && categoryTree && categoryTree.length"></view>
<!-- <view class="cart-box" v-if="(value.template == 2 || value.template == 4) && value.quickBuy && storeToken && categoryTree && categoryTree.length"> <view class="cart-box" v-if="(value.template == 2 || value.template == 4) && value.quickBuy && storeToken && categoryTree && categoryTree.length" :style="{ bottom: tabBarHeight }" :class="{ active: isIphoneX }">
<view class="left-wrap"> <view class="left-wrap">
<view class="cart-icon" ref="cartIcon" :animation="cartAnimation" @click="$util.redirectTo('/pages/goods/cart')"> <view class="cart-icon" ref="cartIcon" :animation="cartAnimation" @click="$util.redirectTo('/pages/goods/cart')">
<text class="iconfont icon-ziyuan1"></text> <text class="iconfont icon-ziyuan1"></text>
@@ -127,9 +129,10 @@
<text class="unit font-size-tag price-font">.{{ cartTotalMoney[1] ? cartTotalMoney[1] : '00' }}</text> <text class="unit font-size-tag price-font">.{{ cartTotalMoney[1] ? cartTotalMoney[1] : '00' }}</text>
</view> </view>
</view> </view>
<view class="right-wrap"><button type="primary" class="settlement-btn" @click="settlement">去结算</button> <view class="right-wrap">
<button type="primary" class="settlement-btn" @click="settlement">去结算</button>
</view>
</view> </view>
</view> -->
<view class="cart-point" :style="{ left: item.left + 'px', top: item.top + 'px' }" :key="index" v-for="(item, index) in carIconList"></view> <view class="cart-point" :style="{ left: item.left + 'px', top: item.top + 'px' }" :key="index" v-for="(item, index) in carIconList"></view>
@@ -176,34 +179,27 @@
cartAnimation: {}, cartAnimation: {},
loadType: '', loadType: '',
templateFourData: [], templateFourData: [],
isIphoneX: false, //判断手机是否是iphoneX以上,
lang:uni.getStorageSync("lang")//en-us 英文 lang:uni.getStorageSync("lang")//en-us 英文
}; };
}, },
created() { created() {
this.isIphoneX = this.$util.uniappIsIPhoneX();
this.getCategoryTree(); this.getCategoryTree();
this.loadType = this.value.goodsLevel == 1 && this.value.loadType == 'all' ? 'all' : 'part'; this.loadType = this.value.goodsLevel == 1 && this.value.loadType == 'all' ? 'all' : 'part';
}, },
mounted() { mounted() {
query = uni.createSelectorQuery().in(this); query = uni.createSelectorQuery().in(this);
query query.select('.content-wrap').boundingClientRect(data => {
.select('.content-wrap')
.boundingClientRect(data => {
if (data) contentWrapHeight = data.height; if (data) contentWrapHeight = data.height;
}) }).exec();
.exec();
setTimeout(() => { setTimeout(() => {
query query.select('.end-tips').boundingClientRect(data => {
.select('.end-tips')
.boundingClientRect(data => {
if (data && data.top > contentWrapHeight) this.endTips = 1; if (data && data.top > contentWrapHeight) this.endTips = 1;
}) }).exec();
.exec(); query.select('.cart-icon').boundingClientRect(data => {
query
.select('.cart-icon')
.boundingClientRect(data => {
if (data) cartPosition = data; if (data) cartPosition = data;
}) }).exec();
.exec();
if (this.value.template == 1) this.getHeightArea(-1); if (this.value.template == 1) this.getHeightArea(-1);
}, 500); }, 500);
}, },
@@ -250,7 +246,7 @@
style += 'padding-top:' + this.navbarHeight + 'px;'; style += 'padding-top:' + this.navbarHeight + 'px;';
style += 'text-align: center;'; style += 'text-align: center;';
style += 'line-height:' + menuButtonInfo.height * 2 + 'rpx;'; style += 'line-height:' + menuButtonInfo.height * 2 + 'rpx;';
style += 'font-size: 14px;'; style += 'font-size: 16px;';
style += 'padding-bottom: 10rpx;'; style += 'padding-bottom: 10rpx;';
} }
return style; return style;
@@ -282,27 +278,48 @@
pageShow() { pageShow() {
this.$store.dispatch('getCartNumber'); this.$store.dispatch('getCartNumber');
if (!this.heightArea.length) this.getHeightArea(-1); if (!this.heightArea.length) this.getHeightArea(-1);
this.dealCategoryData()
},
dealCategoryData() {
if (uni.getStorageSync('tabBarParams')) {
if (this.value.template != 4) {
this.categoryTree.forEach((item,index) => {
if(item.category_id == uni.getStorageSync('tabBarParams').split('=')[1]) {
this.select = index;
this.categoryId = 'category-' + index;
// 阻止切换分类之后滚动事件也立即执行
}
})
} else {
this.templateFourData.forEach((item,index) => {
if(item.category_id == uni.getStorageSync('tabBarParams').split('=')[1]) {
this.oneCategorySelect = index;
this.categoryId = 'category-' + index;
// 阻止切换分类之后滚动事件也立即执行
this.categoryTree = this.templateFourData[index].child_list || [];
this.select = 0;
}
})
}
uni.removeStorageSync('tabBarParams')
}
}, },
/** /**
* 获取高度区间 * 获取高度区间
*/ */
getHeightArea(index) { getHeightArea(index) {
let heightArea = []; let heightArea = [];
query query.selectAll('.content-wrap .child-category').boundingClientRect(data => {
.selectAll('.content-wrap .child-category')
.boundingClientRect(data => {
if (data && data.length) { if (data && data.length) {
data.forEach((item, index) => { data.forEach((item, index) => {
if (index == 0) heightArea.push([0, item.height]); if (index == 0) heightArea.push([0, item.height]);
else heightArea.push([heightArea[index - 1][1], heightArea[index - 1][1] + else heightArea.push([heightArea[index - 1][1], heightArea[index - 1][1] + item.height]);
item.height
]);
}); });
} }
}) }).exec();
.exec();
this.heightArea = heightArea; this.heightArea = heightArea;
if (index != -1 && index < this.categoryTree.length - 1) this.$refs.categoryItem[index + 1].getGoodsList(); if (index != -1 && index < this.categoryTree.length - 1) this.$refs.categoryItem[index + 1].getGoodsList();
this.refreshData();
}, },
/** /**
* 获取全部分类 * 获取全部分类
@@ -332,6 +349,7 @@
return item; return item;
}); });
} }
this.dealCategoryData()
} }
} }
}); });
@@ -364,8 +382,7 @@
break; break;
} }
} }
if (this.value.template != 1 && this.value.loadType == 'all' && this.heightArea[this.select][1] - if (this.value.template != 1 && this.value.loadType == 'all' && this.heightArea[this.select][1] - scrollTop - contentWrapHeight < 300) {
scrollTop - contentWrapHeight < 300) {
this.$refs.categoryItem[this.select].getGoodsList(); this.$refs.categoryItem[this.select].getGoodsList();
} }
} }
@@ -433,6 +450,37 @@
}); });
}, },
settlement() { settlement() {
// 是否有商品库存不足 不足最小购买数 超过最大购买数
var no_buy = false;
for (let k in this.cartList) {
let item = this.cartList[k];
for (let sku in item) {
if (item.max_buy && item.num > item.max_buy){
no_buy = true;
this.$util.showToast({title: '商品' + item.goods_name+'商品最多可购买'+item.max_buy+'件'})
break;
}
if (typeof item[sku] == 'object') {
if (item[sku].num > item[sku].stock){
no_buy = true;
this.$util.showToast({title: '商品' + item.goods_name+'库存不足'})
break;
}
if (item[sku].min_buy && item[sku].num < item[sku].min_buy){
no_buy = true;
this.$util.showToast({title: '商品' + item.goods_name+'商品最少要购买'+item[sku].min_buy+'件'})
break;
}
}
}
}
if(no_buy) return;
if (!this.cartIds.length || this.isSub) return; if (!this.cartIds.length || this.isSub) return;
this.isSub = true; this.isSub = true;
@@ -520,7 +568,7 @@
}, },
// 操作多规格商品弹框后,刷新商品数据 // 操作多规格商品弹框后,刷新商品数据
refreshData() { refreshData() {
this.$refs.categoryItem[this.select].loadGoodsCartNum(true); if(this.$refs.categoryItem) this.$refs.categoryItem[this.select].loadGoodsCartNum(true);
} }
} }
}; };
@@ -529,7 +577,8 @@
<style lang="scss"> <style lang="scss">
.category-page-wrap { .category-page-wrap {
width: 100vw; width: 100vw;
// height: calc(100vh - var(--tab-bar-height, 0)); height: 100vh;
box-sizing: border-box;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background-color: #fff; background-color: #fff;
@@ -584,10 +633,16 @@
view { view {
color: #222222; color: #222222;
width: 100%; width: 100%;
white-space: nowrap; // white-space: nowrap;
text-overflow: ellipsis; // text-overflow: ellipsis;
line-height: 1.3;
overflow: hidden; overflow: hidden;
text-align: center; text-align: center;
// display: -webkit-box;
// -webkit-line-clamp: 2;
// -webkit-box-orient: vertical;
word-break: break-all;
max-height: 100rpx;
} }
&.border-top { &.border-top {
@@ -667,6 +722,11 @@
.cart-box { .cart-box {
height: 100rpx; height: 100rpx;
width: 100%; width: 100%;
position: fixed;
left: 0;
bottom: var(--tab-bar-height, 0);
// bottom: calc( constant(safe-area-inset-bottom) + 110rpx );
// bottom: calc( env(safe-area-inset-bottom) + 110rpx );
background: #fff; background: #fff;
border-top: 1px solid #f5f5f5; border-top: 1px solid #f5f5f5;
box-sizing: border-box; box-sizing: border-box;
@@ -739,6 +799,11 @@
} }
} }
.cart-box.active {
bottom: calc(constant(safe-area-inset-bottom) + 110rpx) !important;
bottom: calc(env(safe-area-inset-bottom) + 110rpx) !important;
}
.cart-point { .cart-point {
width: 26rpx; width: 26rpx;
height: 26rpx; height: 26rpx;
@@ -785,7 +850,7 @@
} }
.cart-box { .cart-box {
position: relative; // position: relative;
z-index: 2; z-index: 2;
} }
@@ -865,15 +930,30 @@
} }
.text { .text {
padding: 2rpx 16rpx; padding: 2rpx 0;
border-radius: 40rpx; border-radius: 40rpx;
font-size: $font-size-tag; font-size: $font-size-tag;
box-sizing: border-box;
width: 100%;
box-sizing: border-box;
text-align: center;
overflow: hidden;
}
.ellipsis {
// text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
} }
&.selected { &.selected {
.text { .text {
background-color: $base-color; background-color: $base-color;
color: var(--btn-text-color); color: var(--btn-text-color);
line-height: 1.3;
border: 4rpx solid transparent;
border-color: $base-color;
} }
} }
} }
@@ -1004,4 +1084,7 @@
border-bottom-right-radius: 8rpx; border-bottom-right-radius: 8rpx;
} }
} }
.cart-bottom-block {
height: 100rpx;
}
</style> </style>

View File

@@ -1,5 +1,7 @@
<template> <template>
<view data-component-name="diy-comp-extend"></view> <view data-component-name="diy-comp-extend" :style="value.pageStyle">
<view></view>
</view>
</template> </template>
<script> <script>
@@ -8,7 +10,10 @@ export default {
name: 'diy-comp-extend', name: 'diy-comp-extend',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,5 +1,6 @@
<template> <template>
<x-skeleton data-component-name="diy-coupon" type="banner" :loading="loading" :configs="skeletonConfig"> <view :style="value.pageStyle" v-if="loading || (computedCouponList && computedCouponList.length)">
<x-skeleton type="banner" :loading="loading" :configs="skeletonConfig">
<view class="coupon-wrap" :class="'coupon-box-' + value.style" :style="[ <view class="coupon-wrap" :class="'coupon-box-' + value.style" :style="[
value.couponType == 'img' && { backgroundImage: 'url(' + $util.img(value.couponBgUrl) + ')' }, value.couponType == 'img' && { backgroundImage: 'url(' + $util.img(value.couponBgUrl) + ')' },
value.couponType == 'color' && { backgroundColor: value.couponBgColor } value.couponType == 'color' && { backgroundColor: value.couponBgColor }
@@ -9,8 +10,7 @@
<swiper class="coupon-style-one" circular> <swiper class="coupon-style-one" circular>
<swiper-item v-for="(numItem, numIndex) in Math.ceil(computedCouponList.length / 3)" :key="numIndex" class="coupon-item-box"> <swiper-item v-for="(numItem, numIndex) in Math.ceil(computedCouponList.length / 3)" :key="numIndex" class="coupon-item-box">
<view v-for="(item, index) in computedCouponList" class="coupon-item" <view v-for="(item, index) in computedCouponList" class="coupon-item" v-if="index >= [numIndex * 3] && index < [(numIndex + 1) * 3]" :style="{
v-if="index >= [numIndex * 3] && index < [(numIndex + 1) * 3]" :style="{
color: value.moneyColor, color: value.moneyColor,
backgroundImage: 'url(' + $util.img('public/uniapp/coupon/style1-bg.png') + ')', backgroundImage: 'url(' + $util.img('public/uniapp/coupon/style1-bg.png') + ')',
marginRight: couponItemHeight + 'px', marginRight: couponItemHeight + 'px',
@@ -30,10 +30,12 @@
{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }}
</view> </view>
</view> </view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0">
{{ value.btnStyle.text }} <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text }}</view>
</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</swiper-item> </swiper-item>
@@ -63,11 +65,12 @@
{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }}
</view> </view>
</view> </view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0">
{{ value.btnStyle.text || '领取' }} <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '领取' }}</view>
</view> <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
<view class="coupon-get use" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用 <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
</view> <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
@@ -93,15 +96,14 @@
</view> </view>
<view class="coupon-type font-size-tag"> <view class="coupon-type font-size-tag">
<text :style="{ color: value.limitColor }">{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }}</text> <text :style="{ color: value.limitColor }">{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }}</text>
<view class="item-text" v-if="item.goods_type == 1">所有商品可用</view> <view class="item-text">{{item.goods_type_name}}</view>
<view class="item-text" v-else-if="item.goods_type == 2">指定商品可用</view>
<view class="item-text" v-else-if="item.goods_type == 3">指定商品不可用</view>
</view> </view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0"> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '领取' }}</view>
{{ value.btnStyle.text || '领取' }} <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
@@ -130,10 +132,12 @@
{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }}
</view> </view>
</view> </view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0">
{{ value.btnStyle.text || '立即使用' }} <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '立即领取' }}</view>
</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
@@ -163,8 +167,12 @@
<text class="coupon-least" :style="{ color: value.limitColor }" v-if="item.at_least > 0">{{ Number(item.at_least) }}元可用</text> <text class="coupon-least" :style="{ color: value.limitColor }" v-if="item.at_least > 0">{{ Number(item.at_least) }}元可用</text>
<text class="coupon-least" :style="{ color: value.limitColor }" v-else>无门槛优惠券</text> <text class="coupon-least" :style="{ color: value.limitColor }" v-else>无门槛优惠券</text>
</view> </view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '立即领取' }}</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '立即领取' }}</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用</view> <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</view> </view>
</view> </view>
@@ -190,7 +198,7 @@
</view> </view>
<text class="text">优惠券</text> <text class="text">优惠券</text>
</view> </view>
<text class="btn" v-if="item.useState == 0" :style="{ <!-- <text class="btn" v-if="item.useState == 0" :style="{
color: value.btnStyle.textColor, color: value.btnStyle.textColor,
backgroundColor: value.btnStyle.bgColor, backgroundColor: value.btnStyle.bgColor,
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx', borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
@@ -205,7 +213,43 @@
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx' borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}"> }">
<text class="btn-content">去使用</text> <text class="btn-content">去使用</text>
</text> -->
<text class="btn" v-if="item.useState == 0" :style="{
color: value.btnStyle.textColor,
backgroundColor: value.btnStyle.bgColor,
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}">
<text class="btn-content">{{ value.btnStyle.text }}</text>
</text> </text>
<text class="btn to-use" v-if="item.useState == 1" :style="{
color: value.btnStyle.textColor,
backgroundColor: value.btnStyle.bgColor,
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}">
<text class="btn-content">去使用</text>
</text>
<text class="btn disabled" v-if="item.useState == 2" :style="{
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}">
<text class="btn-content">已抢光</text>
</text>
<text class="btn disabled" v-if="item.useState == 3" :style="{
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}">
<text class="btn-content">已失效</text>
</text>
<text class="btn disabled" v-if="item.useState == 4" :style="{
borderTopLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx',
borderBottomLeftRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}">
<text class="btn-content">已使用</text>
</text>
<text class="limit" :style="{ color: value.limitColor }" v-if="parseFloat(item.at_least) > 0">{{ item.at_least | moneyConduct }}元使用</text> <text class="limit" :style="{ color: value.limitColor }" v-if="parseFloat(item.at_least) > 0">{{ item.at_least | moneyConduct }}元使用</text>
<text class="limit" :style="{ color: value.limitColor }" v-else>无门槛使用</text> <text class="limit" :style="{ color: value.limitColor }" v-else>无门槛使用</text>
</view> </view>
@@ -246,14 +290,17 @@
<view class="coupon-type"> <view class="coupon-type">
<text class="coupon-name" :style="{ color: value.limitColor }" v-if="item.at_least > 0">{{ Number(item.at_least) }}元可用</text> <text class="coupon-name" :style="{ color: value.limitColor }" v-if="item.at_least > 0">{{ Number(item.at_least) }}元可用</text>
<text class="coupon-name" :style="{ color: value.limitColor }" v-else>无门槛优惠券</text> <text class="coupon-name" :style="{ color: value.limitColor }" v-else>无门槛优惠券</text>
<view class="coupon-least" :style="{ color: value.limitColor }">有效期至{{ $util.timeStampTurnTime(item.end_time, 'yearmonthday') }}</view> <view class="coupon-least" v-if="item.validity_type == 0" :style="{ color: value.limitColor }">有效期至{{ $util.timeStampTurnTime(item.end_time, 'Y-m-d') }}</view>
<view class="coupon-least" v-else-if="item.validity_type == 1" :style="{ color: value.limitColor }">领取后{{ item.fixed_term }}天有效</view>
<view class="coupon-least" v-else :style="{ color: value.limitColor }">领取后长期有效</view>
</view> </view>
<view class="coupon-line"></view> <view class="coupon-line"></view>
<view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0">
{{ value.btnStyle.text || '立即领取' }} <view class="coupon-get" :style="couponBtnStyle" v-if="item.useState == 0" >{{ value.btnStyle.text || '立即领取' }}</view>
</view> <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 1" >去使用</view>
<view class="coupon-get" :style="couponBtnStyle" v-if="parseInt(item.useState)">去使用 <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 2">已抢光</view>
</view> <view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 3">已失效</view>
<view class="coupon-get three-text" :style="couponBtnStyle" v-if="item.useState == 4">已使用</view>
</view> </view>
</view> </view>
</view> </view>
@@ -265,6 +312,7 @@
</view> </view>
</x-skeleton> </x-skeleton>
</view>
</template> </template>
<script> <script>
@@ -313,17 +361,11 @@
couponItemHeight() { couponItemHeight() {
var width = ''; var width = '';
const screenWidth = uni.getSystemInfoSync().windowWidth; const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.style == '1') width = [screenWidth - this.rpxUpPx(210) * 3 - this.rpxUpPx(this.value.margin if (this.value.style == '1') width = [screenWidth - this.rpxUpPx(210) * 3 - this.rpxUpPx(this.value.margin.both * 2) * 2] / 6;
.both * 2) * 2] / 6; else if (this.value.style == '2') width = [screenWidth - this.rpxUpPx(210) * 3 - this.rpxUpPx(this.value.margin.both * 2) * 2] / 6;
else if (this.value.style == '2') width = [screenWidth - this.rpxUpPx(210) * 3 - this.rpxUpPx(this.value else if (this.value.style == '3') width = [screenWidth - this.rpxUpPx(24) * 2 - this.rpxUpPx(194) * 3 - this.rpxUpPx(this.value.margin.both * 2) * 2] / 6;
.margin.both * 2) * 2] / 6; else if (this.value.style == '4') width = [screenWidth - this.rpxUpPx(206) * 3 - this.rpxUpPx(this.value.margin.both * 2) * 2] / 6;
else if (this.value.style == '3') width = [screenWidth - this.rpxUpPx(24) * 2 - this.rpxUpPx(194) * 3 - else if (this.value.style == '6') width = [screenWidth - this.rpxUpPx(208) * 3 - this.rpxUpPx(this.value.margin.both * 2) * 2] / 6;
this.rpxUpPx(this.value.margin.both * 2) * 2
] / 6;
else if (this.value.style == '4') width = [screenWidth - this.rpxUpPx(206) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
else if (this.value.style == '6') width = [screenWidth - this.rpxUpPx(208) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
return width; return width;
}, },
@@ -357,12 +399,18 @@
if (data != null) { if (data != null) {
this.couponList = data; this.couponList = data;
this.couponList.forEach(v => { this.couponList.forEach(v => {
if (v.max_fetch != 0 && v.member_coupon_num && v.member_coupon_num >= v // if (v.count == v.lead_count) v.useState = 2;
.max_fetch) { // else if (v.max_fetch != 0 && v.member_coupon_num && v.member_coupon_num >= v.max_fetch) v.useState = 1;
v.useState = 1; // else v.useState = 0;
} else { // if(v.received_type && v.received_type == 'expire'){
v.useState = 0; // v.useState = 2;
} // }
if (v.count == v.lead_count) v.useState = 2;
else if (v.max_fetch == 0 || (v.max_fetch != 0 && !v.member_coupon_num) || (v.max_fetch != 0 && v.member_coupon_num && v.max_fetch > v.member_coupon_num)) v.useState = 0;
else if (v.wait_coupon_num) v.useState = 1
else if (v.lose_coupon_num) v.useState = 3;
else if (v.use_coupon_num) v.useState = 4;
}); });
} }
this.loading = false; this.loading = false;
@@ -372,18 +420,34 @@
couponAction(item, index) { couponAction(item, index) {
if (item.useState == 0) { if (item.useState == 0) {
this.receiveCoupon(item, index); this.receiveCoupon(item, index);
} else if (parseInt(item.useState)) { } else {
this.couponTap(item, index); this.couponTap(item, index);
} }
// if(item.received_type == 'out'){
// this.$util.showToast({
// title: '该优惠券已抢光'
// });
// }else if(item.received_type == 'expire'){
// this.$util.showToast({
// title: '该优惠券已过期'
// });
// }else if(item.received_type == 'limit'){
// this.$util.showToast({
// title: '该优惠券领取已达上限'
// });
// }
}, },
couponTap(item, index) { couponTap(item, index) {
if (item.count == item.lead_count) { if(item.useState == 2){
this.$util.showToast({ this.$util.showToast({
title: '该优惠券已抢光' title: '该优惠券已抢光'
}); });
return; return;
} }
if (item.useState == 0) this.receiveCoupon(item, index); if (item.useState == 0) this.receiveCoupon(item, index);
else if (item.useState == 3 || item.useState == 4) this.$util.redirectTo('/pages_tool/member/coupon',{state: item.useState == 4 ? 2 : item.useState})
else this.toGoodsList(item); else this.toGoodsList(item);
}, },
// 领取优惠券 // 领取优惠券
@@ -527,7 +591,7 @@
.coupon-get { .coupon-get {
position: relative; position: relative;
top: 2rpx; top: 0;
right: 12rpx; right: 12rpx;
font-size: 24rpx; font-size: 24rpx;
letter-spacing: 16rpx; letter-spacing: 16rpx;
@@ -538,6 +602,10 @@
right: 4rpx; right: 4rpx;
letter-spacing: 4rpx; letter-spacing: 4rpx;
} }
&.three-text {
line-height: 1.2;
}
} }
.coupon-info { .coupon-info {
@@ -873,6 +941,12 @@
line-height: 1; line-height: 1;
transform: scale(0.8); transform: scale(0.8);
} }
&.disabled {
background-color: #eee;
color: #909399;
}
} }
.coupon-content { .coupon-content {
@@ -1045,6 +1119,11 @@
font-size: $font-size-tag; font-size: $font-size-tag;
box-sizing: border-box; box-sizing: border-box;
flex-shrink: 0; flex-shrink: 0;
&.three-text {
writing-mode: vertical-rl;
}
} }
} }
} }

View File

@@ -0,0 +1,276 @@
<template>
<view :style="componentStyle">
<scroll-view
:class="['graphic-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content">
<view
v-for="(item, index) in value.list"
:key="index"
:class="['graphic-nav-item', value.mode, value.mode === 'text' ? 'newright' : '']"
:style="{ width: (100 / value.rowCount + '%') + ';' }"
>
<view style="display:flex;">
<view :style="{
'line-height': '1.2;',
'font-size': (value.font.titlesize * 2 + 'rpx') + ';',
'font-weight': '600;',
'color': value.font.titlecolor + ';'
}">
<uv-count-to
:ref="`countTo-${index}`"
:autoplay="true"
:startVal="30"
:endVal="item.title"
:decimals="getvalue(item.title)"
decimal="."
></uv-count-to>
<text :style="{
'margin-left': '4rpx;',
'font-size': (value.font.unitsize * 2 + 'rpx') + ';',
'font-weight': value.font.weight + ';',
'color': value.font.unitcolor + ';'
}">{{ item.unit }}</text>
</view>
</view>
<view class="graphic-text">
<text :style="{
'font-size': (value.font.descsize * 2 + 'rpx') + ';',
'font-weight': value.font.weight + ';',
'color': value.font.desccolor + ';'
}">{{ item.desc }}</text>
</view>
</view>
</view>
</scroll-view>
<ns-login ref="login"></ns-login>
</view>
</template>
<script>
import uvCountTo from '@/components/uv-count-to/uv-count-to.vue'
import nsLogin from '@/components/ns-login/ns-login.vue'
export default {
name: 'diy-digit',
components: {
uvCountTo,
nsLogin
},
props: {
value: {
type: Object,
default: () => ({})
}
},
data() {
return {
pageWidth: '',
indicatorDots: false,
swiperCurrent: 0
}
},
created() {
// 组件创建时的逻辑
},
watch: {
componentRefresh(newValue) {
// 监听组件刷新
}
},
computed: {
componentStyle() {
let style = '';
style += 'background-image:url(' + this.$util.img(this.value.imageUrl) + ');background-size:100% 100%;';
if (this.value.componentAngle == 'round') {
style += 'border-top-left-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-top-right-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-bottom-left-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
style += 'border-bottom-right-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
}
style += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament.color : '') + ';';
style += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color : '') + ';';
return style;
}
},
methods: {
// 获取小数位数
getvalue(value) {
return value % 1 !== 0 ? 2 : 0;
},
// 页面跳转
redirectTo(item) {
if (!item.wap_url || this.$util.getCurrRoute() != 'pages/member/index' || this.storeToken) {
console.log(item);
this.$util.diyRedirectTo(item);
} else {
this.$refs.login.open(item.wap_url);
}
},
// 轮播切换
swiperChange(event) {
this.swiperCurrent = event.detail.current;
}
}
}
</script>
<style lang="scss" scoped>
.graphic-nav {
padding: 16rpx;
box-sizing: border-box;
&.fixed-layout {
.uni-scroll-view-content {
display: flex;
flex-wrap: wrap;
}
}
&.singleSlide {
.uni-scroll-view-content {
display: flex;
}
.graphic-nav-item {
flex-shrink: 0;
}
}
&.pageSlide {
position: relative;
.uni-swiper-dots-horizontal {
bottom: 0rpx;
}
&.straightLine {
.uni-swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.uni-swiper-dot {
width: 14rpx;
height: 14rpx;
}
}
}
.graphic-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
.graphic-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.graphic-text {
line-height: 1.3;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone {
padding-top: 0;
}
}
&.text {
.graphic-text {
padding-top: 0;
}
}
.graphic-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100rpx;
height: 100rpx;
font-size: 90rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
-webkit-transform: scale(0.8);
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: #606266;
}
}
}
&.pageSlide {
.graphic-nav-item {
flex-shrink: 0;
}
}
}
.newright {
margin-right: 16rpx;
}
.swiper-dot-box {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
margin-top: -20rpx;
padding-bottom: 8rpx;
.swiper-dot {
background-color: rgba(0, 0, 0, 0.3);
margin: 8rpx;
&.active {
background-color: #000;
}
}
&.straightLine {
.swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.swiper-dot {
width: 15rpx;
border-radius: 50%;
height: 15rpx;
}
}
}
</style>

View File

@@ -1,5 +1,6 @@
<template> <template>
<view data-component-name="diy-fenxiao-goods-list" class="diy-fenxiao" v-if="list.length" :class="['goods-list', value.template, value.style]" :style="goodsListWarpCss"> <view :style="value.pageStyle" v-if="list && list.length">
<view class="diy-fenxiao" v-if="list.length" :class="['goods-list', value.template, value.style]" :style="goodsListWarpCss">
<view class="goods-item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="goods-item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss">
<view class="goods-img" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="goods-img" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imgError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imgError(index)"/>
@@ -26,8 +27,7 @@
color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '', color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '',
borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx' borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}" }"
@click.stop="followGoods(item, index)" @click.stop="followGoods(item, index)">
>
关注 关注
</view> </view>
<view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 1" <view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 1"
@@ -36,8 +36,7 @@
color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '', color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '',
borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx' borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
}" }"
@click.stop="delFollowTip(item, index)" @click.stop="delFollowTip(item, index)">
>
取消关注 取消关注
</view> </view>
</view> </view>
@@ -48,6 +47,7 @@
</view> </view>
</view> </view>
</view> </view>
</view>
</template> </template>
<script> <script>
@@ -55,7 +55,10 @@ export default {
name: 'diy-fenxiao-goods-list', name: 'diy-fenxiao-goods-list',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,13 +1,14 @@
<template> <template>
<view data-component-name="diy-float-btn" class="float-btn" :class="{ left_top: value.bottomPosition == 1, right_top: value.bottomPosition == 2, left_bottom: value.bottomPosition == 3, right_bottom: value.bottomPosition == 4 }" :style="style"> <view :style="value.pageStyle">
<view class="float-btn" :class="{ left_top: value.bottomPosition == 1, right_top: value.bottomPosition == 2, left_bottom: value.bottomPosition == 3, right_bottom: value.bottomPosition == 4 }" :style="style">
<block v-for="(item, index) in value.list" :key="index"> <block v-for="(item, index) in value.list" :key="index">
<view class="button-box" @click="$util.diyRedirectTo(item.link)" :style="{ width: value.imageSize + 'px', height: value.imageSize + 'px', fontSize: value.imageSize + 'px' }"> <view class="button-box" @click="$util.diyRedirectTo(item.link)" :style="{ width: value.imageSize + 'px', height: value.imageSize + 'px', fontSize: value.imageSize + 'px' }">
<image v-if="!item.iconType || item.iconType == 'img'" :src="$util.img(item.imageUrl)" mode="aspectFit" :show-menu-by-longpress="true"/> <image v-if="!item.iconType || item.iconType == 'img'" :src="$util.img(item.imageUrl)" mode="aspectFit" :show-menu-by-longpress="true"/>
<diy-icon v-else-if="item.iconType && item.iconType == 'icon'" :icon="item.icon" <diy-icon v-else-if="item.iconType && item.iconType == 'icon'" :icon="item.icon" :value="item.style ? item.style : null"></diy-icon>
:value="item.style ? item.style : null"></diy-icon>
</view> </view>
</block> </block>
</view> </view>
</view>
</template> </template>
<script> <script>

View File

@@ -1,8 +1,10 @@
<template> <template>
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view data-component-name="diy-follow-official-account" v-if="value.isShow"> <view :style="value.pageStyle">
<view v-if="value.isShow">
<official-account></official-account> <official-account></official-account>
</view> </view>
</view>
<!--#endif --> <!--#endif -->
</template> </template>
@@ -12,7 +14,10 @@
name: 'diy-follow-official-account', name: 'diy-follow-official-account',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,17 +1,18 @@
<template> <template>
<x-skeleton data-component-name="diy-goods-brand" type="waterfall" :loading="loading" :configs="skeletonConfig"> <view :style="value.pageStyle" v-if="loading || (list && list.length)">
<x-skeleton type="waterfall" :loading="loading" :configs="skeletonConfig">
<view :class="['brand-wrap', value.ornament.type]" :style="warpCss"> <view :class="['brand-wrap', value.ornament.type]" :style="warpCss">
<view :class="[value.style]"> <view :class="[value.style]">
<view class="title-wrap" v-show="value.title" :style="{ color: value.textColor, fontWeight: value.fontWeight ? 'bold' : '' }">{{ value.title }} <view class="title-wrap" v-show="value.title" :style="{ color: value.textColor, fontWeight: value.fontWeight ? 'bold' : '' }">{{ value.title }}</view>
</view>
<view class="ul-wrap"> <view class="ul-wrap">
<view class="li-item" v-for="(item, index) in list" :key="index"> <view class="li-item" v-for="(item, index) in list" :key="index">
<image class="brand-pic" :src="$util.img(item.image_url)" mode="aspectFit" @click="handlerClick(item)" @tap="handlerClick(item)" @error="imgError(index)" :style="itemCss"/> <image class="brand-pic" :src="$util.img(item.image_url)" mode="aspectFit" @click="toDetail(item)" @error="imgError(index)" :style="itemCss"/>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</x-skeleton> </x-skeleton>
</view>
</template> </template>
<script> <script>
@@ -25,7 +26,10 @@
name: 'diy-goods-brand', name: 'diy-goods-brand',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
components: { components: {

View File

@@ -3,7 +3,7 @@
<block v-if="value.showStyle == 'pageSlide'"> <block v-if="value.showStyle == 'pageSlide'">
<swiper :class="['graphic-nav', 'pageSlide', value.carousel.type]" circular :indicator-dots="false" :style="swiperHeight" @change="swiperChange"> <swiper :class="['graphic-nav', 'pageSlide', value.carousel.type]" circular :indicator-dots="false" :style="swiperHeight" @change="swiperChange">
<swiper-item class="graphic-nav-wrap" <swiper-item class="graphic-nav-wrap"
v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))"> v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))" :key="numIndex">
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list" <view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list"
:key="index" :key="index"

View File

@@ -0,0 +1,290 @@
<template>
<view :style="componentStyle">
<scroll-view
:class="['image-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content">
<view
v-for="(item, index) in value.list"
:key="index"
:class="['image-nav-item', value.mode]"
style="margin-right: 28rpx;"
>
<!-- 图片部分 -->
<view v-if="value.mode != 'text'" class="image-img" :style="{
'font-size': (value.imageSize * 2 + 'rpx') + ';',
'width': (item.imgWidth / 2 + 'rpx') + ';',
'height': (item.imgHeight / 2 + 'rpx') + ';'
}">
<image
v-if="item.link.wap_url"
:style="{
'width': (item.imgWidth / 2 + 'rpx') + ';',
'height': (item.imgHeight / 2 + 'rpx') + ';'
}"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
:show-menu-by-longpress="true"
@tap="redirectTo(item.link)"
></image>
<image
v-else
:style="{
'width': (item.imgWidth / 2 + 'rpx') + ';',
'height': (item.imgHeight / 2 + 'rpx') + ';'
}"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
:show-menu-by-longpress="true"
@tap="previewImg(item.imageUrl)"
></image>
</view>
<!-- 文字部分 -->
<text class="image-text" :style="{
'width': (item.imgWidth / 2 + 'rpx') + ';',
'font-size': (value.font.size * 2 + 'rpx') + ';',
'font-weight': value.font.weight + ';',
'color': value.font.color + ';'
}">{{ item.title }}</text>
</view>
</view>
</scroll-view>
<ns-login ref="login"></ns-login>
</view>
</template>
<script>
import nsLogin from '@/components/ns-login/ns-login.vue'
export default {
name: 'diy-image-nav',
components: {
nsLogin
},
props: {
value: {
type: Object,
default: () => ({})
}
},
data() {
return {
pageWidth: '',
indicatorDots: false,
swiperCurrent: 0
}
},
created() {
// 组件创建时的逻辑
},
watch: {
componentRefresh(newValue) {
// 监听组件刷新
}
},
computed: {
componentStyle() {
let style = '';
style += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
style += 'border-top-left-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-top-right-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-bottom-left-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
style += 'border-bottom-right-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
}
style += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament.color : '') + ';';
style += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color : '') + ';';
return style;
},
swiperHeight() {
let height = 0;
if (this.value.mode == 'graphic') {
height = (49 + this.value.imageSize) * this.value.pageCount;
} else if (this.value.mode == 'img') {
height = (22 + this.value.imageSize) * this.value.pageCount;
} else if (this.value.mode == 'text') {
height = 43 * this.value.pageCount;
}
return 'height:' + (2 * height) + 'rpx';
},
isIndicatorDots() {
return this.value.carousel.type != 'hide' &&
1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount));
}
},
methods: {
// 预览图片
previewImg(imageUrl) {
uni.previewImage({
current: 0,
urls: [this.$util.img(imageUrl)],
success: (res) => {},
fail: (res) => {},
complete: (res) => {}
});
},
// 页面跳转
redirectTo(link) {
if (!link.wap_url || this.$util.getCurrRoute() != 'pages/member/index' || this.storeToken) {
this.$util.diyRedirectTo(link);
} else {
this.$refs.login.open(link.wap_url);
}
},
// 轮播切换
swiperChange(event) {
this.swiperCurrent = event.detail.current;
}
}
}
</script>
<style lang="scss" scoped>
.image-nav {
padding: 16rpx;
box-sizing: border-box;
&.fixed-layout {
.uni-scroll-view-content {
display: flex;
flex-wrap: wrap;
}
}
&.singleSlide {
.uni-scroll-view-content {
display: flex;
}
.image-nav-item {
flex-shrink: 0;
}
}
&.pageSlide {
position: relative;
.uni-swiper-dots-horizontal {
bottom: 0rpx;
}
&.straightLine {
.uni-swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.uni-swiper-dot {
width: 14rpx;
height: 14rpx;
}
}
}
.image-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
.image-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.image-text {
padding-top: 12rpx;
line-height: 1.5;
text-overflow: ellipsis;
overflow: hidden;
text-align: center;
&.alone {
padding-top: 0;
}
}
&.text {
.image-text {
padding-top: 0;
}
}
.image-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
font-size: 90rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
-webkit-transform: scale(0.8);
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: #606266;
}
}
}
}
.swiper-dot-box {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
margin-top: -20rpx;
padding-bottom: 8rpx;
.swiper-dot {
background-color: rgba(0, 0, 0, 0.3);
margin: 8rpx;
&.active {
background-color: #000;
}
}
&.straightLine {
.swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.swiper-dot {
width: 15rpx;
border-radius: 50%;
height: 15rpx;
}
}
}
</style>

View File

@@ -268,7 +268,7 @@
.exec(); .exec();
}); });
this.setModuleLocatinoFn(); this.setModuleLocationFn();
}, },
methods: { methods: {
initPageIndex() { initPageIndex() {
@@ -415,7 +415,7 @@
this.isUnfold = !this.isUnfold; this.isUnfold = !this.isUnfold;
}, },
// 向vuex中的diyIndexPositionObj增加分类导航组件定位位置 // 向vuex中的diyIndexPositionObj增加分类导航组件定位位置
setModuleLocatinoFn() { setModuleLocationFn() {
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query.select('.nav-top-category') query.select('.nav-top-category')
.boundingClientRect(data => { .boundingClientRect(data => {

View File

@@ -1,6 +1,6 @@
<template> <template>
<view data-component-name="diy-kefu" class="diy-kefu" :style="style"> <view data-component-name="diy-kefu" class="diy-kefu" :style="style">
<view class="fui-list-group merchgroup" v-for="(item,index) in value.list"> <view class="fui-list-group merchgroup" v-for="(item,index) in value.list" :key="index">
<view class="fui-list jump" v-if="index == 0"> <view class="fui-list jump" v-if="index == 0">
<view class="fui-list-media"> <view class="fui-list-media">
<image class="round" :src="$util.img(item.imageUrl)" style="border-radius:6rpx"></image> <image class="round" :src="$util.img(item.imageUrl)" style="border-radius:6rpx"></image>

View File

@@ -3,7 +3,7 @@
<view class="fui-cell-group"> <view class="fui-cell-group">
<!-- <image mode="widthFix" style="width: 100%;" :src="$util.img(item.imageUrl)"></image> --> <!-- <image mode="widthFix" style="width: 100%;" :src="$util.img(item.imageUrl)"></image> -->
<view v-for="(item,index) in value.list" @click="redirectTo(item.link)" class="fui-cell" :class="item.iconType == 'img'?'img-cell':''"> <view v-for="(item,index) in value.list" @click="redirectTo(item.link)" class="fui-cell" :class="item.iconType == 'img'?'img-cell':''" :key="index">
<view class="fui-cell-icon" style="color:diyitem.style.iconcolo"> <view class="fui-cell-icon" style="color:diyitem.style.iconcolo">
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" <diy-icon v-if="item.iconType == 'icon'" :icon="item.icon"
:value="item.style ? item.style : null" :value="item.style ? item.style : null"

View File

@@ -1,6 +1,6 @@
<template> <template>
<view data-component-name="diy-map" class="diy-map" :style="style"> <view data-component-name="diy-map" class="diy-map" :style="style">
<view class="fui-list-group merchgroup" style="margin-top:0" v-for="(item,index) in value.list"> <view class="fui-list-group merchgroup" style="margin-top:0" v-for="(item,index) in value.list" :key="index">
<map <map
id="map" id="map"
style="width: 100%; height:600rpx" style="width: 100%; height:600rpx"

View File

@@ -1,7 +1,7 @@
<template> <template>
<view data-component-name="diy-picture" class="diy-picture" :style="style"> <view data-component-name="diy-picture" class="diy-picture" :style="style">
<view class="fui-picture"> <view class="fui-picture">
<view v-for="(item,index) in value.list" style="line-height: 0;"> <view v-for="(item,index) in value.list" style="line-height: 0;" :key="index">
<image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-if="item.link.wap_url" @click="handlerClick(item)" @tap="handlerClick(item)"></image> <image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-if="item.link.wap_url" @click="handlerClick(item)" @tap="handlerClick(item)"></image>
<image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-else @click="handlerClick(item)" @tap="handlerClick(item)"></image> <image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-else @click="handlerClick(item)" @tap="handlerClick(item)"></image>
</view> </view>

View File

@@ -173,7 +173,7 @@
if (this.value.ornament.type == 'stroke') { if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';'; obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
} }
const screenWidth = uni.getSystemInfoSync().windowWidth; const screenWidth = uni.getWindowInfo().windowWidth;
if (this.value.template == 'horizontal-slide') { if (this.value.template == 'horizontal-slide') {
var width = ""; var width = "";
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy')
@@ -217,7 +217,7 @@
} }
}, },
rpxUpPx(res) { rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth; const screenWidth = uni.getWindowInfo().windowWidth;
var data = screenWidth * parseInt(res) / 750; var data = screenWidth * parseInt(res) / 750;
return Math.floor(data); return Math.floor(data);
}, },

View File

@@ -1,4 +1,5 @@
<template> <template>
<view :style="value.pageStyle">
<view data-component-name="diy-search" class="diy-search"> <view data-component-name="diy-search" class="diy-search">
<view class="diy-search-wrap" :class="value.positionWay" :style="fixedCss"> <view class="diy-search-wrap" :class="value.positionWay" :style="fixedCss">
<view :class="['search-box','search-box-'+value.searchStyle]" :style="searchWrapCss" @click="handlerSearchClick" @tap="handlerSearchClick"> <view :class="['search-box','search-box-'+value.searchStyle]" :style="searchWrapCss" @click="handlerSearchClick" @tap="handlerSearchClick">
@@ -33,11 +34,19 @@
<view v-if="value.positionWay == 'fixed'" class="u-navbar-placeholder" :style="{ width: '100%', paddingTop: moduleHeight }"></view> <view v-if="value.positionWay == 'fixed'" class="u-navbar-placeholder" :style="{ width: '100%', paddingTop: moduleHeight }"></view>
<ns-login ref="login"></ns-login> <ns-login ref="login"></ns-login>
</view> </view>
</view>
</template> </template>
<script> <script>
// 获取系统状态栏的高度 // 获取系统状态栏的高度
let systemInfo = uni.getSystemInfoSync(); let systemInfo = {};
try {
// 合并设备信息和窗口信息
systemInfo = {...uni.getDeviceInfo(), ...uni.getWindowInfo()};
} catch (e) {
// 兼容旧版本
systemInfo = uni.getSystemInfoSync();
}
let menuButtonInfo = {}; let menuButtonInfo = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容) // 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容)
// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ // #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ
@@ -125,7 +134,7 @@
}, },
fixedTop() { fixedTop() {
let diyPositionObj = this.$store.state.diyGroupPositionObj; let diyPositionObj = this.$store.state.diyGroupPositionObj;
let data = 0 let data = 0;
if (diyPositionObj.diySearch && diyPositionObj.diyIndexPage && diyPositionObj.nsNavbar) { if (diyPositionObj.diySearch && diyPositionObj.diyIndexPage && diyPositionObj.nsNavbar) {
if (diyPositionObj.diySearch.moduleIndex > diyPositionObj.diyIndexPage.moduleIndex) { if (diyPositionObj.diySearch.moduleIndex > diyPositionObj.diyIndexPage.moduleIndex) {
data = diyPositionObj.nsNavbar.originalVal + diyPositionObj.diyIndexPage.originalVal; data = diyPositionObj.nsNavbar.originalVal + diyPositionObj.diyIndexPage.originalVal;
@@ -175,7 +184,7 @@
}, },
mounted() { mounted() {
if (this.value.positionWay == 'fixed') if (this.value.positionWay == 'fixed')
this.setModuleLocatinoFn(); this.setModuleLocationFn();
}, },
methods: { methods: {
search() { search() {
@@ -204,7 +213,7 @@
}); });
}, },
// 向vuex中的diyIndexPositionObj增加搜索组件定位位置 // 向vuex中的diyIndexPositionObj增加搜索组件定位位置
setModuleLocatinoFn() { setModuleLocationFn() {
this.$nextTick(() => { this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query.select('.diy-search-wrap') query.select('.diy-search-wrap')

View File

@@ -258,7 +258,7 @@
if (this.value.ornament.type == 'stroke') { if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';'; obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
} }
const screenWidth = uni.getSystemInfoSync().windowWidth; const screenWidth = uni.getWindowInfo().windowWidth;
if (this.value.template == 'horizontal-slide') { if (this.value.template == 'horizontal-slide') {
var width = ''; var width = '';
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this.value.goodsMarginNum * 2); if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this.value.goodsMarginNum * 2);
@@ -312,7 +312,7 @@
} }
}, },
rpxUpPx(res) { rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().screenWidth; const screenWidth = uni.getWindowInfo().screenWidth;
var data = (screenWidth * parseInt(res)) / 750; var data = (screenWidth * parseInt(res)) / 750;
return Math.floor(data); return Math.floor(data);
}, },

View File

@@ -1,9 +1,10 @@
<template> <template>
<view :style="value.pageStyle">
<x-skeleton data-component-name="diy-store-label" type="banner" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-store-label" type="banner" :loading="loading" :configs="skeletonConfig">
<view class="diy-store-label"> <view class="diy-store-label">
<block v-if="businessConfig.store_business == 'store'"> <block v-if="businessConfig.store_business == 'store'">
<scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true"> <scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true">
<view v-for="(item, index) in storeLabel" :class="['item']"> <view v-for="(item, index) in storeLabel" :class="['item']" :key="index">
<diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon> <diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon>
<text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item }}</text> <text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item }}</text>
</view> </view>
@@ -11,7 +12,7 @@
</block> </block>
<block v-else> <block v-else>
<scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true"> <scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true">
<view v-for="(item, index) in list" :class="['item']"> <view v-for="(item, index) in list" :class="['item']" :key="item.label_id || index">
<diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon> <diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon>
<text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item.label_name }}</text> <text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item.label_name }}</text>
</view> </view>
@@ -19,6 +20,7 @@
</block> </block>
</view> </view>
</x-skeleton> </x-skeleton>
</view>
</template> </template>
<script> <script>
// 门店标签 // 门店标签
@@ -26,7 +28,10 @@
name: 'diy-store-label', name: 'diy-store-label',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,4 +1,5 @@
<template> <template>
<view :style="value.pageStyle">
<view data-component-name="diy-store" class="store-wrap"> <view data-component-name="diy-store" class="store-wrap">
<block v-if="value.style == 1"> <block v-if="value.style == 1">
<view class="store-box store-one"> <view class="store-box store-one">
@@ -65,6 +66,7 @@
</view> </view>
</block> </block>
</view> </view>
</view>
</template> </template>
<script> <script>
@@ -74,7 +76,10 @@ export default {
name: 'diy-store', name: 'diy-store',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -1,4 +1,5 @@
<template> <template>
<view :style="value.pageStyle">
<view data-component-name="diy-text" class="diy-text" @click="handlerClick(value.link)" @tap="handlerClick(value.link)" :style="warpCss"> <view data-component-name="diy-text" class="diy-text" @click="handlerClick(value.link)" @tap="handlerClick(value.link)" :style="warpCss">
<view :class="value.style == 'style-8' ? 'title2' : 'title'" :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor }"> <view :class="value.style == 'style-8' ? 'title2' : 'title'" :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor }">
<block v-if="value.style == 'style-0'" style="height: 40rpx; line-height: 40rpx;"> <block v-if="value.style == 'style-0'" style="height: 40rpx; line-height: 40rpx;">
@@ -254,6 +255,7 @@
</view> </view>
</view> </view>
</view> </view>
</view>
</template> </template>
<script> <script>
@@ -263,7 +265,10 @@ export default {
name: 'diy-text', name: 'diy-text',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -0,0 +1,704 @@
<template>
<view :style="componentStyle">
<!-- 固定布局模式 -->
<view v-if="value.showStyle == 'fixed'" :class="['goods-list', 'row1-of' + value.rowCount]" style="padding:20rpx;">
<view
v-for="(item, index) in value.list"
:key="index"
class="goods-item"
@tap="showVideo(item)"
>
<view class="goods-img-wrap">
<image
class="goods-img"
style="border-radius:10rpx 10rpx 0 0;"
:src="$util.img(item.imageUrl)"
mode="widthFix"
@error="imgError(index)"
></image>
<view style="position:absolute;top:10rpx;right:10rpx;">
<image style="width:30rpx;" :src="$util.img('addon/personnel/shop/view/enterprise/play.png')" mode="widthFix"></image>
</view>
</view>
<view class="info-wrap">
<view
class="goods-name"
:style="{
'font-size': (value.font.size * 2 + 'rpx') + ';',
'font-weight': value.font.weight + ';',
'color': value.font.color + ';'
}"
>{{ item.title }}</view>
</view>
</view>
</view>
<!-- 其他布局模式 -->
<scroll-view
v-else
:class="['video-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content">
<view
v-for="(item, index) in value.list"
:key="index"
:class="['video-nav-item', value.mode]"
:style="{ width: (100 / value.rowCount + '%') + ';' }"
@tap="showVideo(item)"
>
<view class="video-img">
<image
v-if="item.iconType == 'img'"
:style="{
'max-width': '200rpx;',
'max-height': '200rpx;',
'border-radius': '8rpx;'
}"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
mode="widthFix"
:show-menu-by-longpress="true"
></image>
<view style="position:absolute;top:10rpx;right:10rpx;">
<image style="width:30rpx;" :src="$util.img('addon/personnel/shop/view/enterprise/play.png')" mode="widthFix"></image>
</view>
</view>
<view
class="video-text"
:style="{
'margin-left': '16rpx;',
'font-size': (value.font.size * 2 + 'rpx') + ';',
'font-weight': value.font.weight + ';',
'color': value.font.color + ';'
}"
>{{ item.title }}</view>
</view>
</view>
</scroll-view>
<!-- 视频播放弹窗 -->
<uni-popup
ref="videoPopup"
type="center"
style="background:transparent;width:100%;height:100%;"
>
<view class="video-container" style="position:fixed;top:30%;width:100%;left:0;">
<video
class="adaptive-video"
:autoPauseIfNavigate="true"
:autoPauseIfOpenNative="true"
:autoplay="false"
:enableAutoRotation="true"
id="myVideo"
:src="video_url"
:controls="true"
></video>
</view>
</uni-popup>
</view>
</template>
<script>
import uniPopup from '@/components/uni-popup/uni-popup.vue'
export default {
name: 'diy-video-list',
components: {
uniPopup
},
props: {
value: {
type: Object,
default: () => ({})
}
},
data() {
return {
pageWidth: '',
indicatorDots: false,
swiperCurrent: 0,
video_url: ''
}
},
created() {
// 组件创建时的逻辑
},
watch: {
componentRefresh(newValue) {
// 监听组件刷新
}
},
computed: {
componentStyle() {
let style = '';
style += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
style += 'border-top-left-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-top-right-radius:' + (2 * this.value.topAroundRadius) + 'rpx;';
style += 'border-bottom-left-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
style += 'border-bottom-right-radius:' + (2 * this.value.bottomAroundRadius) + 'rpx;';
}
style += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament.color : '') + ';';
style += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color : '') + ';';
console.log(this.value);
return style;
},
swiperHeight() {
let height = 0;
if (this.value.mode == 'graphic') {
height = (49 + this.value.imageSize) * this.value.pageCount;
} else if (this.value.mode == 'img') {
height = (22 + this.value.imageSize) * this.value.pageCount;
} else if (this.value.mode == 'text') {
height = 43 * this.value.pageCount;
}
return 'height:' + (2 * height) + 'rpx';
},
isIndicatorDots() {
return this.value.carousel.type != 'hide' &&
1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount));
}
},
methods: {
// 显示视频播放弹窗
showVideo(item) {
this.video_url = item.videoUrl;
this.$refs.videoPopup.open();
},
// 图片加载错误处理
imgError(index) {
// 图片加载失败的处理逻辑
console.log('图片加载失败:', index);
}
}
}
</script>
<style lang="scss" scoped>
.goods-name {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.goods-list {
&.row1-of3 {
display: flex;
flex-wrap: wrap;
.goods-item {
position: relative;
display: flex;
flex-direction: column;
margin-top: 20rpx;
width: calc(33.3333333% - 14rpx);
box-sizing: border-box;
&:nth-child(3n + 3) {
width: calc(33.33% - 15rpx);
}
&:nth-of-type(1), &:nth-of-type(2), &:nth-of-type(3) {
margin-top: 0;
}
&:nth-child(3n) {
width: calc(33.3333333% - 15rpx);
}
&:nth-child(3n-1) {
margin-left: 20rpx;
margin-right: 20rpx;
}
&.shadow {
width: calc(33.3333333% - 18rpx);
&:nth-of-type(1), &:nth-of-type(2), &:nth-of-type(3) {
margin-top: 8rpx;
}
&:nth-child(1n) {
margin-left: 8rpx;
}
&:nth-child(3n-1) {
margin-left: 20rpx;
margin-right: 20rpx;
}
&:nth-child(3n) {
margin-right: 0;
margin-left: 0;
}
}
.goods-img-wrap {
position: relative;
overflow: hidden;
height: 220rpx;
}
.goods-img {
width: 100%;
}
.info-wrap {
display: flex;
flex-direction: column;
flex: 1;
.pro-info {
margin-top: auto;
display: flex;
flex-direction: column;
justify-content: space-between;
.discount-price {
display: flex;
justify-content: space-between;
align-items: center;
.price-wrap {
white-space: nowrap;
.unit {
font-size: 24rpx !important;
}
.price {
font-size: 32rpx;
text {
font-weight: 700;
}
}
}
}
.delete-price {
text-decoration: line-through;
flex: 1;
line-height: 28rpx;
color: #909399;
font-size: 20rpx;
}
}
}
}
&.style-1 {
.pro-info {
.price-wrap {
line-height: 1;
}
.discount-price {
justify-content: unset !important;
align-items: baseline !important;
flex-wrap: wrap;
}
.delete-price {
margin-left: 10rpx;
}
}
}
&.style-2 {
.pro-info {
position: relative;
flex-direction: row !important;
align-items: center;
.price-wrap {
line-height: 1;
}
.discount-price {
align-items: flex-end !important;
flex-wrap: wrap;
justify-content: unset !important;
}
.delete-price {
margin: 20rpx 0;
flex-basis: 100% !important;
}
.buy-btn {
min-width: 112rpx;
height: 52rpx;
padding: 0 20rpx;
line-height: 52rpx;
text-align: center;
box-sizing: border-box;
}
}
}
.sell-out {
text {
font-size: 150rpx;
}
}
}
&.row1-of2 {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.goods-item {
position: relative;
margin-top: 20rpx;
width: calc(50% - 10rpx);
display: flex;
flex-direction: column;
box-sizing: border-box;
&:nth-child(2n) {
margin-right: 0 !important;
}
&:nth-of-type(1), &:nth-of-type(2) {
margin-top: 0;
}
&.shadow {
width: calc(50% - 18rpx);
&:nth-child(2n-1) {
margin-left: 8rpx;
}
&:nth-child(2n) {
margin-right: 8rpx !important;
}
&:nth-of-type(1), &:nth-of-type(2) {
margin-top: 8rpx;
}
}
.goods-img-wrap {
position: relative;
overflow: hidden;
height: 340rpx;
}
.goods-img {
width: 100%;
}
.info-wrap {
display: flex;
flex-direction: column;
flex: 1;
.sale {
flex-basis: 100%;
}
.pro-info {
margin-top: auto;
display: flex;
flex-direction: row;
justify-content: space-between;
.discount-price {
.price-wrap {
white-space: nowrap;
.unit {
font-weight: 700;
font-size: 24rpx !important;
}
.price {
font-weight: 700;
font-size: 32rpx !important;
}
}
}
.delete-price {
text-decoration: line-through;
flex: 1;
line-height: 28rpx;
color: #909399;
font-size: 20rpx;
}
}
}
}
&.style-1 {
.pro-info {
.discount-price {
display: flex;
flex-wrap: wrap;
align-items: baseline;
.price-wrap {
display: inline-block;
text {
font-weight: 700;
}
line-height: 1;
}
}
.delete-price {
margin-top: 6rpx;
flex-basis: 100% !important;
}
}
}
&.style-2 {
.pro-info {
position: relative;
align-items: center;
.price-wrap {
line-height: 1;
}
.discount-price {
display: flex;
flex-wrap: wrap;
align-items: baseline;
}
.delete-price {
margin-top: 4rpx;
flex-basis: 100% !important;
}
.sale {
line-height: 1;
margin-top: 10rpx;
}
.buy-btn {
min-width: 140rpx;
height: 52rpx;
padding: 0 20rpx;
line-height: 52rpx;
text-align: center;
box-sizing: border-box;
}
}
}
&.style-3 {
.pro-info {
.member-price {
margin-right: auto;
align-self: flex-end;
margin-bottom: 4rpx;
}
.sale {
line-height: 1;
align-self: center;
margin-top: 8rpx;
}
.discount-price {
display: flex;
flex-wrap: wrap;
flex: 1;
align-content: center;
.price-wrap {
display: flex;
align-items: baseline;
line-height: 1;
align-self: center;
}
}
}
.swiper {
padding: 20rpx 0;
}
}
.sell-out {
text {
font-size: 250rpx;
}
}
}
}
.video-container {
width: 100%;
height: 300px;
position: relative;
}
.adaptive-video {
width: 100%;
height: 100%;
object-fit: contain;
position: absolute;
top: 0;
left: 0;
}
.video-nav {
padding: 16rpx;
box-sizing: border-box;
&.fixed-layout {
.uni-scroll-view-content {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
}
&.singleSlide {
.uni-scroll-view-content {
display: flex;
}
.video-nav-item {
flex-shrink: 0;
}
}
&.pageSlide {
position: relative;
.uni-swiper-dots-horizontal {
bottom: 0rpx;
}
&.straightLine {
.uni-swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.uni-swiper-dot {
width: 14rpx;
height: 14rpx;
}
}
}
.video-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
.video-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.video-text {
padding-top: 12rpx;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone {
padding-top: 0;
}
}
&.text {
.video-text {
padding-top: 0;
}
}
.video-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
font-size: 90rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
-webkit-transform: scale(0.8);
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: #606266;
}
}
}
}
.swiper-dot-box {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
margin-top: -20rpx;
padding-bottom: 8rpx;
.swiper-dot {
background-color: rgba(0, 0, 0, 0.3);
margin: 8rpx;
&.active {
background-color: #000;
}
}
&.straightLine {
.swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.swiper-dot {
width: 15rpx;
border-radius: 50%;
height: 15rpx;
}
}
}
</style>

View File

@@ -1,5 +1,7 @@
<template> <template>
<view :style="value.pageStyle">
<video data-component-name="diy-video" class="diy-video" :src="$util.img(value.videoUrl)" :poster="$util.img(value.imageUrl)" :style="videoWarpCss" objectFit="cover" @click="handlerClick(value.videoUrl)" @tap="handlerClick(value.videoUrl)"></video> <video data-component-name="diy-video" class="diy-video" :src="$util.img(value.videoUrl)" :poster="$util.img(value.imageUrl)" :style="videoWarpCss" objectFit="cover" @click="handlerClick(value.videoUrl)" @tap="handlerClick(value.videoUrl)"></video>
</view>
</template> </template>
<script> <script>
@@ -9,7 +11,10 @@
name: 'diy-video', name: 'diy-video',
props: { props: {
value: { value: {
type: Object type: Object,
default: () => {
return {};
}
} }
}, },
data() { data() {

View File

@@ -64,7 +64,10 @@ export default {
longitude: null, // 经度 longitude: null, // 经度
evaluateCount: 0, // 商品评论数量 evaluateCount: 0, // 商品评论数量
deliveryType: null, // 配送方式 deliveryType: null, // 配送方式
isVirtual: 0 //是否为虚拟商品 isVirtual: 0 ,//是否为虚拟商品
hasGlobalStore:false,
saleStore:'all',
isInitStoreData:false,
} }
}, },
created() { created() {
@@ -73,10 +76,7 @@ export default {
if (this.location) { if (this.location) {
this.latitude = this.location.latitude; this.latitude = this.location.latitude;
this.longitude = this.location.longitude; this.longitude = this.location.longitude;
} else {
this.$util.getLocation();
} }
this.getStoreData();
}, },
watch: { watch: {
location: function (nVal) { location: function (nVal) {
@@ -102,19 +102,17 @@ export default {
this.isVirtual = params.isVirtual; this.isVirtual = params.isVirtual;
this.deliveryType = params.deliveryType; this.deliveryType = params.deliveryType;
this.evaluateConfig = params.evaluateConfig; this.evaluateConfig = params.evaluateConfig;
this.saleStore = params.sale_store;
if (this.evaluateConfig.evaluate_show == 1) { if (this.evaluateConfig.evaluate_show == 1) {
//商品评论 //商品评论
this.getGoodsEvaluate(params.evaluateList); this.getGoodsEvaluate(params.evaluateList);
this.evaluateCount = params.evaluateCount; this.evaluateCount = params.evaluateCount;
} }
if( params.goods_class != 2 && params.goods_class !=3) this.isShowStore = true;
for (let k in this.deliveryType) { if(!this.isInitStoreData){
if (k == 'store') { this.isInitStoreData = true;
this.isShowStore = true; this.getStoreData();
} }
}
this.getService(); this.getService();
this.videoContext = uni.createVideoContext('goodsVideo'); this.videoContext = uni.createVideoContext('goodsVideo');
@@ -148,7 +146,8 @@ export default {
//门店列表 //门店列表
let data = { let data = {
page: this.storeList.page, page: this.storeList.page,
page_size: this.storeList.page_size page_size: this.storeList.page_size,
store_ids:this.saleStore
}; };
if (this.latitude && this.longitude) { if (this.latitude && this.longitude) {
data.latitude = this.latitude; data.latitude = this.latitude;
@@ -161,6 +160,9 @@ export default {
if (this.storeList.page == 1) this.storeList.data == []; if (this.storeList.page == 1) this.storeList.data == [];
if (res.code >= 0 && res.data) { if (res.code >= 0 && res.data) {
this.storeList.data = this.storeList.data.concat(res.data.list); this.storeList.data = this.storeList.data.concat(res.data.list);
res.data.list.forEach(item=>{
if(item.store_id == this.globalStoreInfo.store_id) this.hasGlobalStore = true;
})
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.message title: res.message
@@ -189,9 +191,6 @@ export default {
if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images = this.goodsEvaluate[index].images.split(","); if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images = this.goodsEvaluate[index].images.split(",");
if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[index].member_name = this.goodsEvaluate[index].member_name.replace(this.goodsEvaluate[index].member_name.substring(1, this.goodsEvaluate[index].member_name.length - 1), '***') if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[index].member_name = this.goodsEvaluate[index].member_name.replace(this.goodsEvaluate[index].member_name.substring(1, this.goodsEvaluate[index].member_name.length - 1), '***')
}) })
// if (this.goodsEvaluate.images) this.goodsEvaluate.images = this.goodsEvaluate.images.split(",");
// if (this.goodsEvaluate.is_anonymous == 1) this.goodsEvaluate.member_name = this.goodsEvaluate.member_name.replace(
// this.goodsEvaluate.member_name.substring(1, this.goodsEvaluate.member_name.length - 1), '***')
} }
}, },
// 预览评价图片 // 预览评价图片
@@ -263,6 +262,8 @@ export default {
copyUrl() { copyUrl() {
let text = this.$config.h5Domain + this.shareUrl; let text = this.$config.h5Domain + this.shareUrl;
if (this.memberInfo && this.memberInfo.member_id) text += '&source_member=' + this.memberInfo.member_id; if (this.memberInfo && this.memberInfo.member_id) text += '&source_member=' + this.memberInfo.member_id;
var store_info = this.$store.state.globalStoreInfo;
if (store_info) text += '&store_id=' + store_info.store_id;
this.$util.copy(text, () => { this.$util.copy(text, () => {
this.closeSharePopup(); this.closeSharePopup();
}); });
@@ -283,10 +284,11 @@ export default {
getGoodsPoster() { getGoodsPoster() {
uni.showLoading({ uni.showLoading({
'title': '海报生成中...' 'title': '海报生成中...'
}) });
//活动海报信息 //活动海报信息
if (this.memberInfo && this.memberInfo.member_id) this.posterParams.source_member = this.memberInfo.member_id; if (this.memberInfo && this.memberInfo.member_id) this.posterParams.source_member = this.memberInfo.member_id;
var store_info = this.$store.state.globalStoreInfo;
if (store_info) this.posterParams.store_id= store_info.store_id;
this.$api.sendRequest({ this.$api.sendRequest({
url: this.posterApi, url: this.posterApi,
data: { data: {

View File

@@ -39,37 +39,37 @@
<slot name="price"></slot> <slot name="price"></slot>
</view> </view>
<view class="newdetail margin-bottom" v-if="goodsSkuDetail.isinformation == 0"> <view class="newdetail margin-bottom">
<!-- 入口区域 --> <!-- 入口区域 -->
<slot name="entrance"></slot> <slot name="entrance"></slot>
<!-- 配送 --> <!-- 配送 -->
<!-- @click="$refs.deliveryType.open()" --> <view class="item delivery-type" v-if="goodsSkuDetail.is_virtual == 0" @click="$refs.deliveryType.open()">
<view class="item delivery-type" v-if="goodsSkuDetail.is_virtual == 0" > <view class="label">配送</view>
<view class="label">{{$lang('send')}}</view>
<block v-if="deliveryType"> <block v-if="deliveryType">
<view class="box"> <view class="box">
<block v-for="(item, index) in deliveryType" :key="index"> <block v-for="(item, index) in deliveryType" :key="index">
<text v-if="goodsSkuDetail.support_trade_type.indexOf(index) != -1">{{$lang('express')}}</text> <text v-if="goodsSkuDetail.support_trade_type.indexOf(index) != -1">{{ item.name }}</text>
<!-- {{ item.name }} -->
</block> </block>
</view> </view>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</block> </block>
<block v-else> <block v-else>
<view class="box">未配置</view> <view class="box">商家未配置配送方式</view>
</block> </block>
</view> </view>
<!-- 门店 --> <!-- 门店 -->
<!-- <view class="item store-wrap" @click="openStoreListPopup()" v-if="addonIsExist.store && globalStoreInfo && isShowStore"> <view class="item store-wrap" @click="openStoreListPopup()" v-if="addonIsExist.store && globalStoreInfo && isShowStore">
<view class="label">门店</view> <view class="label">适用门店</view>
<view class="list-wrap"> <view class="list-wrap" v-if="hasGlobalStore">
<view class="name-wrap"> <view class="name-wrap">
<text class="icondiy icon-system-shop"></text> <text class="icondiy icon-system-shop"></text>
<text class="name">{{ globalStoreInfo.store_name}}</text> <text class="name">{{ globalStoreInfo.store_name}}</text>
</view> </view>
<view class="close-desc" v-if="globalStoreInfo.status == 0 && globalStoreInfo.close_desc">
{{ globalStoreInfo.close_desc }}
</view>
<view class="other-wrap"> <view class="other-wrap">
<text class="distance" v-if="parseFloat(globalStoreInfo.distance)">距离{{ globalStoreInfo.distance > 1 ? globalStoreInfo.distance + 'km' : globalStoreInfo.distance * 1000 + 'm' }}</text> <text class="distance" v-if="parseFloat(globalStoreInfo.distance)">距离{{ globalStoreInfo.distance > 1 ? globalStoreInfo.distance + 'km' : globalStoreInfo.distance * 1000 + 'm' }}</text>
<text class="decorate" v-if="parseFloat(globalStoreInfo.distance)">.</text> <text class="decorate" v-if="parseFloat(globalStoreInfo.distance)">.</text>
@@ -77,8 +77,23 @@
</view> </view>
</view> </view>
</view> </view>
<view class="list-wrap" v-else-if="storeList && storeList.data.length">
<view class="name-wrap">
<text class="icondiy icon-system-shop"></text>
<text class="name">{{ storeList.data[0].store_name}}</text>
</view>
<view class="close-desc" v-if="storeList.data[0].status == 0 && storeList.data[0].close_desc">
{{ storeList.data[0].close_desc }}
</view>
<view class="other-wrap">
<text class="distance" v-if="parseFloat(storeList.data[0].distance)">距离{{ storeList.data[0].distance > 1 ? storeList.data[0].distance + 'km' : storeList.data[0].distance * 1000 + 'm' }}</text>
<text class="decorate" v-if="parseFloat(storeList.data[0].distance)">.</text>
<view class="address">{{ storeList.data[0].full_address + storeList.data[0].address }}
</view>
</view>
</view>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</view> --> </view>
<view class="item service" @click="openMerchantsServicePopup()" v-if="goodsSkuDetail.goods_service.length"> <view class="item service" @click="openMerchantsServicePopup()" v-if="goodsSkuDetail.goods_service.length">
<view class="label">服务</view> <view class="label">服务</view>
@@ -96,34 +111,6 @@
</view> </view>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
</view> </view>
</view>
<!--多规格区域-->
<view class="newdetail margin-bottom" v-if="goodsSkuDetail.sku_spec_format">
<!-- 入口区域 -->
<slot name="skuspec"></slot>
</view>
<view class="newdetail margin-bottom" v-if="goodsSkuDetail.merch_id > 0">
<!-- 入口区域 -->
<slot name="entrance"></slot>
<!-- 商家 -->
<view class="item store-wrap" @click="$util.redirectTo('/pages_promotion/merch/detail', { merch_id: goodsSkuDetail.merch_id })">
<view class="list-wrap" style="display: flex;">
<view class="name-wrap">
<image :src="$util.img(goodsSkuDetail.merchinfo.merch_image)" mode="widthFix" style="width: 100rpx;height: 100rpx;border-radius: 50rpx;"></image>
</view>
<view class="other-wrap">
<view class="address" style="margin-left: 30rpx;">
<view>{{goodsSkuDetail.merchinfo.merch_name}}</view>
<view style="font-size: 24rpx;color: #888;">官方认证商家值得信赖</view>
</view>
</view>
</view>
<text class="iconfont icon-right"></text>
</view>
</view> </view>
<!-- 配送方式 --> <!-- 配送方式 -->
@@ -182,7 +169,7 @@
<uni-popup ref="storeListPopup" type="bottom"> <uni-popup ref="storeListPopup" type="bottom">
<view class="goods-merchants-service-popup-layer popup-layer store-list-wrap"> <view class="goods-merchants-service-popup-layer popup-layer store-list-wrap">
<view class="head-wrap" @click="closeStoreListPopup()"> <view class="head-wrap" @click="closeStoreListPopup()">
<text>门店列表</text> <text>适用门店</text>
<text class="iconfont icon-close"></text> <text class="iconfont icon-close"></text>
</view> </view>
<scroll-view scroll-y> <scroll-view scroll-y>
@@ -200,6 +187,8 @@
距离{{ item.distance > 1 ? item.distance + 'km' : item.distance * 1000 + 'm' }} 距离{{ item.distance > 1 ? item.distance + 'km' : item.distance * 1000 + 'm' }}
</text> </text>
</view> </view>
<view class="item-close-desc" v-if="item.status == 0 && item.close_desc">{{ item.close_desc }}
</view>
<view class="item-time" v-if="item.open_date">营业时间{{ item.open_date }} <view class="item-time" v-if="item.open_date">营业时间{{ item.open_date }}
</view> </view>
<view class="item-address">{{ item.full_address + item.address }}</view> <view class="item-address">{{ item.full_address + item.address }}</view>
@@ -228,7 +217,7 @@
</view> </view>
<!-- 促销 --> <!-- 促销 -->
<!-- <view class="community-model" @touchmove.prevent.stop @click.stop="onCloseCommunity()" v-show="isCommunity"> <view class="community-model" @touchmove.prevent.stop @click.stop="onCloseCommunity()" v-show="isCommunity">
<view class="community-model-content" @click.stop> <view class="community-model-content" @click.stop>
<view class="community-model-content-radius"> <view class="community-model-content-radius">
<view>添加社群</view> <view>添加社群</view>
@@ -241,13 +230,13 @@
<view class="community-model-close" @click.stop="onCloseCommunity()"> <view class="community-model-close" @click.stop="onCloseCommunity()">
<text class="iconfont icon-close"></text> <text class="iconfont icon-close"></text>
</view> </view>
</view> --> </view>
<!-- 参与流程 --> <!-- 参与流程 -->
<slot name="articipation"></slot> <slot name="articipation"></slot>
<!-- 商品评价 --> <!-- 商品评价 -->
<view class="group-wrap" v-if="evaluateConfig.evaluate_show == 1 && goodsSkuDetail.isinformation == 0" style="display: none;"> <view class="group-wrap" v-if="evaluateConfig.evaluate_show == 1">
<view class="goods-evaluate" @click="toEvaluateDetail(goodsSkuDetail.goods_id)"> <view class="goods-evaluate" @click="toEvaluateDetail(goodsSkuDetail.goods_id)">
<view class="tit"> <view class="tit">
<!-- <view class="tit" :class="{ active: goodsEvaluate.content }"> --> <!-- <view class="tit" :class="{ active: goodsEvaluate.content }"> -->
@@ -263,8 +252,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="evaluate-item" v-for="(item, index) in goodsEvaluate" :key="index" <view class="evaluate-item" v-for="(item, index) in goodsEvaluate" :key="index" v-if="item.content">
v-if="item.content">
<view class="evaluator"> <view class="evaluator">
<view class="evaluator-info"> <view class="evaluator-info">
<view class="evaluator-face"> <view class="evaluator-face">
@@ -315,24 +303,19 @@
</view> </view>
</view> </view>
<!-- 详情 --> <!-- 详情 -->
<view class="goods-detail-tab"> <view class="goods-detail-tab">
<view class="detail-tab"> <view class="detail-tab">
<view class="tab-item">{{$lang('details')}}</view> <view class="tab-item">商品详情</view>
</view> </view>
<view class="detail-content active"> <view class="detail-content active">
<view class="detail-content-item"> <view class="detail-content-item">
<view class="goods-details" v-if="goodsSkuDetail.goods_content"> <view class="goods-details" v-if="goodsSkuDetail.goods_content">
<!-- <rich-text :nodes="goodsSkuDetail.goods_content" @click="showImg($event)" :data-nodes="goodsSkuDetail.goods_content"></rich-text> --> <ns-mp-html :content="goodsSkuDetail.goods_content"></ns-mp-html>
<!-- {{goodsSkuDetail.goods_content}} -->
<mp-html :content="goodsSkuDetail.goods_content" />
<!-- :loading="loading" @preview="preview" @navigate="navigate" -->
</view> </view>
<view class="goods-details active" v-else></view> <view class="goods-details active" v-else>该商家暂无上传相关详情哦</view>
<view class="goods-details" v-if="service && service.is_display == 1 && service.content"> <view class="goods-details" v-if="service && service.is_display == 1 && service.content">
<rich-text :nodes="service.content" @click="showImg($event)" :data-nodes="service.content"></rich-text> <ns-mp-html :content="service.content"></ns-mp-html>
</view> </view>
</view> </view>
</view> </view>

View File

@@ -1,23 +1,21 @@
<template> <template>
<view v-if="pageCount == 1 || need" class="fixed-box" :style="{ height: fixBtnShow ? (isH5 ? '180rpx' : '330rpx') : '120rpx' }"> <view v-if="pageCount == 1 || need" class="fixed-box" :style="{ height: fixBtnShow ? (isH5 ? '180rpx' : '330rpx') : '120rpx' }">
<!-- 统一的客服耳机按钮H5和小程序共用 -->
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<!-- 微信小程序根据配置自动选择官方客服/自定义客服 -->
<button <button
class="btn-item" class="btn-item"
v-if="fixBtnShow" v-if="fixBtnShow"
hoverClass="none" hoverClass="none"
:open-type="weappOfficialService ? 'contact' : ''" :open-type="weappOfficialService ? 'contact' : ''"
@click="handleWeappCustomerClick" @click="weappOfficialService ? '' : handleWeappCustomerService"
:style="{ backgroundImage: 'url(' + (kefuimg ? kefuimg : '') + ')', backgroundSize: '100% 100%' }" :style="{ backgroundImage: 'url(' + (kefuimg ? kefuimg : '') + ')', backgroundSize: '100% 100%' }"
> >
<text class="icox icox-kefu" v-if="!kefuimg"></text> <text class="icox icox-kefu" v-if="!kefuimg"></text>
<view v-if="unreadCount > 0 && isDifyService" class="unread-badge">
<text class="badge-text">{{ unreadCount > 99 ? '99+' : unreadCount }}</text>
</view>
</button> </button>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
<!-- H5逻辑保持不变 -->
<button <button
class="btn-item" class="btn-item"
v-if="fixBtnShow" v-if="fixBtnShow"
@@ -32,6 +30,20 @@
</button> </button>
<!-- #endif --> <!-- #endif -->
<!-- #ifndef H5 -->
<view
class="btn-item"
v-if="fixBtnShow && isDifyService"
@click="handleCustomerService"
:style="{ backgroundImage: 'url(' + (aiAgentimg ? aiAgentimg : '') + ')', backgroundSize: '100% 100%' }"
>
<text class="ai-icon" v-if="!aiAgentimg">🤖</text>
<view v-if="unreadCount > 0" class="unread-badge">
<text class="badge-text">{{ unreadCount > 99 ? '99+' : unreadCount }}</text>
</view>
</view>
<!-- #endif -->
<view <view
class="btn-item" class="btn-item"
v-if="fixBtnShow" v-if="fixBtnShow"
@@ -87,10 +99,11 @@ export default {
// 3. 获取店铺电话 // 3. 获取店铺电话
this.getShopTel(); this.getShopTel();
// 4. 首次加载获取最新配置(小程序强制请求最新配置,避免缓存) // 4. 首次加载获取最新配置
this.getLatestConfig(true).then(config => { this.getLatestConfig().then(config => {
this.latestConfig = config; this.latestConfig = config;
this.initCustomerService(config); this.initCustomerService(config);
// 微信小程序:判断是否使用官方客服
this.initWeappServiceType(); this.initWeappServiceType();
}); });
}, },
@@ -115,20 +128,12 @@ export default {
'setAiUnreadCount' 'setAiUnreadCount'
]), ]),
/** /**
* 修复:微信小程序客服点击事件(直接触发客服逻辑 * 获取最新配置H5禁用缓存小程序保留默认
*/ */
handleWeappCustomerClick() { async getLatestConfig() {
if (!this.weappOfficialService) {
// 直接调用客服处理逻辑
this.handleCustomerService();
}
},
/**
* 修复:获取最新配置(支持强制刷新,解决小程序缓存问题)
*/
async getLatestConfig(forceRefresh = false) {
return new Promise((resolve) => { return new Promise((resolve) => {
// H5/小程序强制请求最新配置,避免缓存 // H5强制请求最新配置小程序优先用vuex缓存
if (this.isH5) {
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/site/getServicerConfig', url: '/api/site/getServicerConfig',
header: { header: {
@@ -139,29 +144,32 @@ export default {
data: { t: new Date().getTime() }, data: { t: new Date().getTime() },
success: (res) => { success: (res) => {
const config = res.code === 0 ? res.data : this.$store.state.servicerConfig || {}; const config = res.code === 0 ? res.data : this.$store.state.servicerConfig || {};
this.$store.commit('UPDATE_SERVICER_CONFIG', config); this.$store.commit('setServicerConfig', config);
resolve(config); resolve(config);
}, },
fail: () => resolve(this.$store.state.servicerConfig || {}) fail: () => resolve(this.$store.state.servicerConfig || {})
}); });
} else {
// 小程序直接用vuex缓存后台修改后需重启开发者工具
resolve(this.$store.state.servicerConfig || {});
}
}); });
}, },
/** /**
* 初始化客服服务(确保实例正确创建) * 初始化客服服务
*/ */
initCustomerService(config = null) { initCustomerService(config = null) {
// 强制重新创建客服实例
this.customerService = null;
this.customerService = createCustomerService(this, config || this.latestConfig); this.customerService = createCustomerService(this, config || this.latestConfig);
this.platformConfig = this.customerService.refreshConfig(config || this.latestConfig); this.platformConfig = this.customerService.refreshConfig(config || this.latestConfig);
this.buttonConfig = this.customerService.getButtonConfig(); this.buttonConfig = this.customerService.getButtonConfig();
}, },
/** /**
* 微信小程序:初始化服务类型(修复判断逻辑 * 微信小程序:初始化服务类型(官方/自定义
*/ */
initWeappServiceType() { initWeappServiceType() {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
this.weappOfficialService = this.buttonConfig?.openType === 'contact' && !this.isDifyService; // 从buttonConfig中获取官方客服标识
this.weappOfficialService = this.buttonConfig?.openType === 'contact';
// #endif // #endif
}, },
/** /**
@@ -195,57 +203,76 @@ export default {
}); });
}, },
/** /**
* 客服点击逻辑(修复:确保小程序端正确执行 * H5客服点击逻辑(保持不变
*/ */
async handleCustomerService() { async handleCustomerService() {
if (this.isH5) {
uni.showLoading({ title: '加载中...', mask: true }); uni.showLoading({ title: '加载中...', mask: true });
try { try {
// 再次获取最新配置确保是dify模式 const newConfig = await this.getLatestConfig();
const newConfig = await this.getLatestConfig(true); this.latestConfig = newConfig;
this.initCustomerService(newConfig); this.initCustomerService(newConfig);
// 强制触发客服点击
if (this.customerService) {
this.customerService.handleCustomerClick(); this.customerService.handleCustomerClick();
}
} catch (e) { } catch (e) {
uni.showToast({ title: '操作失败', icon: 'none' }); uni.showToast({ title: '操作失败', icon: 'none' });
} finally { } finally {
uni.hideLoading(); uni.hideLoading();
} }
} else {
// 小程序:直接调用客服逻辑
this.customerService.handleCustomerClick();
}
},
/**
* 微信小程序自定义客服点击逻辑
*/
handleWeappCustomerService() {
// #ifdef MP-WEIXIN
this.customerService.handleCustomerClick();
// #endif
} }
} }
}; };
</script> </script>
<style scoped> <style scoped>
/* 样式保持不变 */ /* 父容器:不限制高度,避免挤压按钮 */
.fixed-box { .fixed-box {
position: fixed; position: fixed;
right: 20rpx; right: 20rpx; /* 增加右侧边距,避免贴边 */
bottom: 200rpx; bottom: 200rpx;
z-index: 9999; z-index: 9999;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
gap: 14rpx; gap: 14rpx; /* 替代margin更稳定 */
} }
/* 核心:强制按钮为正方形+正圆 */
.btn-item { .btn-item {
/* 宽高强制相等,必须是正方形 */
width: 88rpx !important; width: 88rpx !important;
height: 88rpx !important; height: 88rpx !important;
/* 强制正圆(优先级最高) */
border-radius: 50% !important; border-radius: 50% !important;
/* 白色背景(确保是圆) */
background-color: #ffffff !important; background-color: #ffffff !important;
/* 背景图居中显示,不拉伸 */
background-size: 60% 60% !important; background-size: 60% 60% !important;
background-position: center !important; background-position: center !important;
background-repeat: no-repeat !important; background-repeat: no-repeat !important;
/* 清除默认样式 */
border: none !important; border: none !important;
padding: 0 !important; padding: 0 !important;
margin: 0 !important; margin: 0 !important;
/* 居中内容 */
display: flex !important; display: flex !important;
justify-content: center !important; justify-content: center !important;
align-items: center !important; align-items: center !important;
/* 阴影增强视觉(可选) */
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1); box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1);
} }
/* 清除button标签的默认点击样式微信小程序/浏览器) */
.btn-item::after { .btn-item::after {
border: none !important; border: none !important;
} }
@@ -267,6 +294,7 @@ export default {
z-index: 1; z-index: 1;
} }
/* 微信小程序字体适配 */
/* #ifdef MP-WEIXIN */ /* #ifdef MP-WEIXIN */
.unread-badge { .unread-badge {
font-size: 20rpx; font-size: 20rpx;

View File

@@ -51,18 +51,14 @@
<block v-for="(item, index) in birthday.coupon_list" :key="index"> <block v-for="(item, index) in birthday.coupon_list" :key="index">
<view class="content"> <view class="content">
<view class="info"> <view class="info">
<block v-if="item.type == 'reward'"> <text class="num" v-if="item.type == 'reward'">
<text class="num">
{{ parseFloat(item.money) }} {{ parseFloat(item.money) }}
<text class="type">元优惠劵</text> <text class="type">元优惠劵</text>
</text> </text>
</block> <text class="num" v-else-if="item.type == 'discount'">
<block v-else-if="item.type == 'discount'">
<text class="num">
{{ item.discount }} {{ item.discount }}
<text class="type"></text> <text class="type"></text>
</text> </text>
</block>
<view class="desc">用于下单时抵现或兑换商品等</view> <view class="desc">用于下单时抵现或兑换商品等</view>
</view> </view>
<view class="tip" @click="closeRewardPopup('3')">立即查看</view> <view class="tip" @click="closeRewardPopup('3')">立即查看</view>
@@ -93,7 +89,8 @@
birthday: { birthday: {
flag: false, flag: false,
coupon_list: {} coupon_list: {}
} },
callback: null
}; };
}, },
computed: { computed: {
@@ -117,7 +114,8 @@
this.init(); this.init();
}, },
methods: { methods: {
init() { init(callback = null) {
if (callback) this.callback = callback;
this.getBirthdayGift(); this.getBirthdayGift();
}, },
cancel() { cancel() {
@@ -148,7 +146,9 @@
data: { data: {
id: this.birthday.id id: this.birthday.id
}, },
success: res => {} success: res => {
if (this.callback) this.callback();
}
}); });
} }
}, },
@@ -170,7 +170,7 @@
} }
.register-box { .register-box {
max-height: 300rpx; max-height: 320rpx;
overflow-y: scroll; overflow-y: scroll;
/* margin-top:350rpx; */ /* margin-top:350rpx; */
} }
@@ -187,12 +187,12 @@
<style lang="scss"> <style lang="scss">
.reward-wrap { .reward-wrap {
width: 85vw; width: 600rpx;
height: auto; height: auto;
.wrap { .wrap {
width: 100%; width: 600rpx;
height: auto; height: 932rpx;
background-size: 100%; background-size: 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
padding-bottom: 40rpx; padding-bottom: 40rpx;
@@ -266,7 +266,8 @@
background: #fff; background: #fff;
border-radius: 10rpx; border-radius: 10rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
box-sizing: border-box;
height: 136rpx;
.info { .info {
flex: 1; flex: 1;
} }
@@ -323,13 +324,6 @@
height: 40rpx; height: 40rpx;
margin: 0 auto; margin: 0 auto;
line-height: 40rpx; line-height: 40rpx;
/* margin: 20rpx 140rpx;
border: none;
background: linear-gradient(90deg, #FF6A00, #FF3C00);
border-radius: 40rpx;
display: flex;
align-items: center;
justify-content: center; */
} }
} }
} }

View File

@@ -47,9 +47,6 @@ export default {
} else { } else {
this.$util.redirectTo('/pages/index/index'); this.$util.redirectTo('/pages/index/index');
} }
},
re(text) {
this.text = text;
} }
} }
}; };

View File

@@ -220,7 +220,7 @@
}, },
data() { data() {
return { return {
formData: this.data formData:[]
}; };
}, },
created() { created() {
@@ -229,23 +229,26 @@
watch: { watch: {
data: function() { data: function() {
this.setFormData(); this.setFormData();
},
formData: {
handler(newVal, oldVal) {
this.$emit('changeFormVal',newVal)
},
deep: true
} }
}, },
methods: { methods: {
setFormData() { setFormData() {
this.formData = this.data; let formData = JSON.parse(JSON.stringify(this.data));
formData.forEach(item => {
this.formData.forEach(item => {
if (!item.val) item.val = item.value.default ? item.value.default : ''; if (!item.val) item.val = item.value.default ? item.value.default : '';
if (item.value.options) { if (item.value.options) {
item.option_lists = []; item.option_lists = [];
item.value.options.forEach((v, k) => { item.value.options.forEach((v, k) => {
var obj = {}; var obj = {};
obj.value = v; obj.value = v;
obj.checked = false; obj.checked = false;
if (item.controller == 'Radio' && ((!item.val && k == 0) || (item.val && if (item.controller == 'Radio' && ((!item.val && k == 0) || (item.val && item.val == v))) {
item.val == v))) {
obj.checked = true; obj.checked = true;
item.val = v; item.val = v;
} }
@@ -359,6 +362,7 @@
else item.default_regions = []; else item.default_regions = [];
} }
}); });
this.formData = JSON.parse(JSON.stringify(formData))
}, },
verify() { verify() {
let verify = true; let verify = true;
@@ -392,6 +396,7 @@
} }
// 验证手机号 // 验证手机号
if (item.name == 'MOBILE' && this.$util.verifyMobile(item.val) === false) { if (item.name == 'MOBILE' && this.$util.verifyMobile(item.val) === false) {
verify = !item.value.required; verify = !item.value.required;
if (verify == false) { if (verify == false) {
@@ -515,7 +520,7 @@
} }
} }
} }
console.log(verify)
if (verify) { if (verify) {
return this.formData; return this.formData;
} else return verify; } else return verify;
@@ -678,7 +683,7 @@
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
border-bottom: solid 1px #eee; border-bottom: 0;
} }
&.align-top { &.align-top {
@@ -836,6 +841,9 @@
checkbox { checkbox {
display: none; display: none;
} }
label {
padding:10rpx 0;
}
.checkbox { .checkbox {
display: flex; display: flex;

View File

@@ -1,6 +1,6 @@
<template> <template>
<view> <view>
<block v-if="text == '客服'"> <block v-if="text == '客服' || text == 'Contact'">
<!-- <ns-contact :niushop="chatParam" :send-message-title="sendData.title" :send-message-path="sendData.path" :send-message-img="sendData.img"> --> <!-- <ns-contact :niushop="chatParam" :send-message-title="sendData.title" :send-message-path="sendData.path" :send-message-img="sendData.img"> -->
<button hoverClass="none" openType="contact" sessionFrom="weapp" showMessageCard="true" class="action-icon-wrap" style="background: transparent;padding: 0;margin: 0;"> <button hoverClass="none" openType="contact" sessionFrom="weapp" showMessageCard="true" class="action-icon-wrap" style="background: transparent;padding: 0;margin: 0;">
<view class="iconfont color-title" :class="icon"></view> <view class="iconfont color-title" :class="icon"></view>
@@ -11,7 +11,7 @@
</block> </block>
<block v-else> <block v-else>
<view class="action-icon-wrap" @click="clickEvent"> <view class="action-icon-wrap" @click="clickEvent">
<view class="iconfont " :class="icon"></view> <view class="iconfont color-title" :class="icon"></view>
<text>{{ text }}</text> <text>{{ text }}</text>
<view class="corner-mark color-base-bg" :class="{'max' : parseInt(cornerMark)>99}" v-if="cornerMark.length" :style="{ background: cornerMarkBg+'!important', color: cornerMarkColor }">{{ cornerMark > 99 ? '99+' : cornerMark }}</view> <view class="corner-mark color-base-bg" :class="{'max' : parseInt(cornerMark)>99}" v-if="cornerMark.length" :style="{ background: cornerMarkBg+'!important', color: cornerMarkColor }">{{ cornerMark > 99 ? '99+' : cornerMark }}</view>
</view> </view>

View File

@@ -79,8 +79,6 @@ export default {
<style lang="scss"> <style lang="scss">
.ns-goods-promotion { .ns-goods-promotion {
background-color: #fff; background-color: #fff;
& > view {
}
.item { .item {
display: flex; display: flex;
font-size: $font-size-base; font-size: $font-size-base;

View File

@@ -1,5 +1,93 @@
<template> <template>
<view></view> <view class="goods-recommend" v-if="list.length">
<view class="goods-recommend-title">
<text class="title">{{ config.title }}</text>
</view>
<view class="goods-list double-column">
<view class="goods-item margin-bottom" v-for="(item, index) in list" :key="index" @click="toDetail(item)">
<view class="goods-img">
<image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)" :lazy-load="true" />
<view class="color-base-bg goods-tag" v-if="goodsTag(item) != ''">{{ goodsTag(item) }}</view>
<view class="sell-out" v-if="item.goods_stock <= 0">
<text class="iconfont icon-shuqing"></text>
</view>
</view>
<view class="info-wrap">
<view class="goods-name" :class="[{ 'using-hidden': config.nameLineMode == 'single' }, { 'multi-hidden': config.nameLineMode == 'multiple' }]">
{{ item.goods_name }}
</view>
<view class="lineheight-clear">
<view class="discount-price">
<text class="unit price-style small">{{ $lang('common.currencySymbol') }}</text>
<text class="price price-style large">{{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }}</text>
<text class="unit price-style small">.{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }}</text>
</view>
<view class="member-price-tag" v-if="item.member_price && item.member_price == showPrice(item)">
<image :src="$util.img('public/uniapp/index/VIP.png')" mode="widthFix"/>
</view>
<view class="member-price-tag" v-else-if="item.promotion_type == 1">
<image :src="$util.img('public/uniapp/index/discount.png')" mode="widthFix"/>
</view>
<view class="delete-price font-size-activity-tag color-tip price-font" v-if="showMarketPrice(item)">
<text class="unit">{{ $lang('common.currencySymbol') }}</text>
<text>{{ showMarketPrice(item) }}</text>
</view>
</view>
<view class="pro-info">
<view class="block-wrap">
<view class="sale font-size-activity-tag color-tip" v-if="item.sale_show">已售{{ item.sale_num }}{{ item.unit ? item.unit : '' }}</view>
</view>
<view class="cart-action-wrap" v-if="config.control && item.is_virtual == 0">
<!-- 购物车图标 -->
<view v-if="config.style == 'icon-cart'" :style="{
color: config.theme == 'diy' ? config.textColor : '',
borderColor: config.theme == 'diy' ? config.textColor : ''
}" class="cart shopping-cart-btn iconfont icon-gouwuche click-wrap" :id="'goods-' + item.id"
@click.stop="$refs.goodsSkuIndex.addCart(config.cartEvent, item, $event)">
<view class="click-event"></view>
</view>
<!--加号图标 -->
<view v-else-if="config.style == 'icon-add'" :style="{
color: config.theme == 'diy' ? config.textColor : '',
borderColor: config.theme == 'diy' ? config.textColor : ''
}" class="cart plus-sign-btn iconfont icon-add1 click-wrap" :id="'goods-' + item.id"
@click.stop="$refs.goodsSkuIndex.addCart(config.cartEvent, item, $event)">
<view class="click-event"></view>
</view>
<!-- 按钮 -->
<view v-else-if="config.style == 'button'" :style="{
backgroundColor: config.theme == 'diy' ? config.bgColor : '',
color: config.theme == 'diy' ? config.textColor : '',
fontWeight: config.theme == 'diy' ? (config.fontWeight ? 'bold' : 'normal') : '',
padding: config.theme == 'diy' ? '12rpx ' + config.padding * 2 + 'rpx' : ''
}" class="cart buy-btn click-wrap" :id="'goods-' + item.id"
@click.stop="$refs.goodsSkuIndex.addCart(config.cartEvent, item, $event)">
{{ config.text }}
<view class="click-event"></view>
</view>
<!--自定义图标 -->
<view v-else-if="config.style == 'icon-diy'" :style="{
color: config.theme == 'diy' ? config.textColor : ''
}" class="icon-diy click-wrap" :id="'goods-' + item.id"
@click.stop="$refs.goodsSkuIndex.addCart(config.cartEvent, item, $event)">
<view class="click-event"></view>
<diy-icon :icon="config.iconDiy.icon" :value="config.iconDiy.style ? config.iconDiy.style : null"></diy-icon>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="circle-box" v-if="showLoading && load"><ns-loading></ns-loading></view>
<ns-goods-sku-index ref="goodsSkuIndex" @cartListChange="cartListChange" @addCart="addCart"></ns-goods-sku-index>
</view>
</template> </template>
<script> <script>
@@ -256,6 +344,22 @@
right: 0; right: 0;
// transform: translateY(-50%); // transform: translateY(-50%);
} }
.sell-out{
position: absolute;
z-index: 1;
width: 100%;
height: 100%;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.5);
text{
color: #fff;
font-size: 220rpx;
}
}
} }
.goods-tag { .goods-tag {

View File

@@ -31,9 +31,11 @@
@click="change(item_value.sku_id, item_value.spec_id)"> @click="change(item_value.sku_id, item_value.spec_id)">
<image v-if="item_value.image" :src="$util.img(item_value.image, { size: 'small' })" @error="valueImageError(index, index_value)" /> <image v-if="item_value.image" :src="$util.img(item_value.image, { size: 'small' })" @error="valueImageError(index, index_value)" />
<text>{{ item_value.spec_value_name }}</text> <text>{{ item_value.spec_value_name }}</text>
<view class="empty-stock" v-if="item_value.stock == 0">缺货</view>
</view> </view>
</view> </view>
</view> </view>
<ns-form :data="goodsForm" v-if="goodsForm" ref="form"></ns-form>
</scroll-view> </scroll-view>
</view> </view>
<view class="footer"> <view class="footer">
@@ -50,12 +52,12 @@
</view> </view>
</view> </view>
<view class="footer-right"> <view class="footer-right">
<view class="change_num" v-if="number > 0"> <view class="change_num" v-if="cartInputLock">
<view class="num-action" @click="changeNum('-')"> <view class="num-action" @click="changeNum('-')">
<text class="desc iconfont icon-jianshao color-base-text"></text> <text class="desc iconfont icon-jianshao color-base-text"></text>
<view class="click-event"></view> <view class="click-event"></view>
</view> </view>
<input type="number" class="uni-input" @blur="blur" v-model="number" placeholder="0" @input="keyInput(false)" /> <input type="number" class="uni-input" @blur="blur" v-model.lazy="number" placeholder="0" @input="keyInput(false,null,true)" />
<view class="num-action" :id="'select-sku-num-' + goodsDetail.goods_id" @click="changeNum('+', $event)"> <view class="num-action" :id="'select-sku-num-' + goodsDetail.goods_id" @click="changeNum('+', $event)">
<text class="add iconfont icon-add-fill color-base-text change_hover"></text> <text class="add iconfont icon-add-fill color-base-text change_hover"></text>
<view class="click-event"></view> <view class="click-event"></view>
@@ -115,7 +117,9 @@
maxBuy: 0, maxBuy: 0,
minBuy: 0, minBuy: 0,
isLoad: false, isLoad: false,
timeout: null timeout: null,
goodsForm: null,
skuList: []
}; };
}, },
created() { created() {
@@ -124,21 +128,44 @@
watch: { watch: {
pointLimit(newNum, oldNum) { pointLimit(newNum, oldNum) {
this.limitNumber = Number(newNum); this.limitNumber = Number(newNum);
},
minBuy(newData, oldData) {
if (this.minBuy > 1) {
this.number = Number(this.minBuy);
} }
},
computed:{
cartInputLock:function() {
if(!this.isLoad){
return true
}else if(this.number>0){
return true
}else{
return false
}
} }
}, },
methods: { methods: {
calcSkuStock() {
if(this.goodsDetail.goods_spec_format && this.goodsDetail.goods_spec_format.length){
this.goodsDetail.goods_spec_format.forEach(spec => {
spec.value.forEach(val => {
this.skuList.forEach(sku => {
if (val.sku_id == sku.sku_id) {
this.$set(val,'stock',sku.stock);
}
})
})
})
}
},
show(data) { show(data) {
this.number = 0 ; // 每次打开要初始化
this.isLoad = true; this.isLoad = true;
this.goodsDetail = data; this.goodsDetail = data;
this.goodsId = this.goodsDetail.goods_id; this.goodsId = this.goodsDetail.goods_id;
this.skuId = this.goodsDetail.sku_id; this.skuId = this.goodsDetail.sku_id;
this.maxBuy = this.goodsDetail.max_buy; this.maxBuy = this.goodsDetail.max_buy;
this.minBuy = this.goodsDetail.min_buy; this.minBuy = this.goodsDetail.min_buy;
this.goodsForm = null
this.getGoodsForm()
this.getGoodsSkuList(this.goodsId); this.getGoodsSkuList(this.goodsId);
this.keyInput(false); this.keyInput(false);
if (this.getCurrentCart()) { if (this.getCurrentCart()) {
@@ -146,6 +173,19 @@
} }
this.$refs.skuPopup.open(); this.$refs.skuPopup.open();
}, },
getGoodsForm(){
this.$api.sendRequest({
url: "/form/api/form/goodsform",
data: {
goods_id: this.goodsDetail.goods_id
},
success: res => {
if (res.code == 0 && res.data) {
this.goodsForm = res.data
}
}
});
},
hide() { hide() {
if(this.$refs.skuPopup) this.$refs.skuPopup.close(); if(this.$refs.skuPopup) this.$refs.skuPopup.close();
}, },
@@ -175,6 +215,7 @@
} else { } else {
this.number = 0; this.number = 0;
} }
this.calcSkuStock()
}, },
//查看规格图片 //查看规格图片
previewMedia() { previewMedia() {
@@ -228,6 +269,8 @@
obj['sku_' + item.sku_id] = item; obj['sku_' + item.sku_id] = item;
}); });
this.goodsSkuList = obj; this.goodsSkuList = obj;
this.skuList = res.data;
this.calcSkuStock();
} }
} }
}); });
@@ -281,8 +324,7 @@
} }
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query.select('#' + event.currentTarget.id + ' .click-event') query.select('#' + event.currentTarget.id + ' .click-event').boundingClientRect(data => {
.boundingClientRect(data => {
if (data) { if (data) {
this.$emit('addCart', data.left, data.top); this.$emit('addCart', data.left, data.top);
} }
@@ -325,14 +367,16 @@
let newNumber = parseInt(this.number); let newNumber = parseInt(this.number);
this.isLoad = false; this.isLoad = true;
setTimeout(() => { setTimeout(() => {
this.number = newNumber; this.number = newNumber;
this.cartNumChange(this.number); this.cartNumChange(this.number);
}, 0); }, 0);
}, },
//输入数量 //输入数量
keyInput(flag, callback) { keyInput(flag, callback,isInput) {
if(isInput) this.isLoad = false
setTimeout(() => { setTimeout(() => {
var stock = this.goodsDetail.stock; var stock = this.goodsDetail.stock;
@@ -352,7 +396,7 @@
this.number = stock; this.number = stock;
} }
// 商品起售数 // 商品起售数
if (this.minBuy > 1 && this.number < this.minBuy) { if (flag && this.minBuy > 1 && this.number < this.minBuy) {
this.number = this.minBuy; this.number = this.minBuy;
} }
@@ -374,7 +418,13 @@
}); });
return; return;
} }
if (this.$refs.form) {
if (!this.$refs.form.verify()) return;
uni.setStorageSync('goodFormData', {
goods_id: this.goodsDetail.goods_id,
form_data: this.$refs.form.formData
});
}
this.number = 1; this.number = 1;
//纠正数量 //纠正数量
this.keyInput(true, () => { this.keyInput(true, () => {
@@ -677,6 +727,19 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
.body-item .sku-list-wrap .empty-stock{
font-size: 18rpx;
line-height: 22rpx;
position: absolute;
right: 0;
top: 0;
border-radius: 4rpx;
transform: translateY(-50%);
padding: 0 2rpx;
color: #989898;
background-color: #f0f1f2;
}
.sku-layer .body-item .sku-list-wrap .items { .sku-layer .body-item .sku-list-wrap .items {
text-align: center; text-align: center;
position: relative; position: relative;

View File

@@ -51,12 +51,7 @@
* @param {Object} data 商品项 * @param {Object} data 商品项
*/ */
singleSpecificationGoods(data, event) { singleSpecificationGoods(data, event) {
let cart = let cart = this.cartList['goods_' + data.goods_id] && this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] ? this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] : null;
this.cartList['goods_' + data.goods_id] && this.cartList['goods_' + data.goods_id]['sku_' + data
.sku_id
] ?
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id] :
null;
let cartNum = cart ? cart.num : 0; let cartNum = cart ? cart.num : 0;
let api = cart && cart.cart_id ? '/api/cart/edit' : '/api/cart/add'; let api = cart && cart.cart_id ? '/api/cart/edit' : '/api/cart/add';
@@ -66,6 +61,7 @@
if(cart && cart.cart_id){ if(cart && cart.cart_id){
_num = _num + (data.min_buy > 0 ? data.min_buy : 1) _num = _num + (data.min_buy > 0 ? data.min_buy : 1)
} }
let cart_id = cart ? cart.cart_id : 0; let cart_id = cart ? cart.cart_id : 0;
if (_num > parseInt(data.stock)) { if (_num > parseInt(data.stock)) {
this.$util.showToast({ this.$util.showToast({
@@ -119,8 +115,7 @@
this.isRepeat = false; this.isRepeat = false;
if (res.code == 0) { if (res.code == 0) {
if (cart_id == 0) { if (cart_id == 0) {
this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].cart_id = this.cartList['goods_' + data.goods_id]['sku_' + data.sku_id].cart_id = res.data;
res.data;
} }
this.$util.showToast({ this.$util.showToast({
title: "商品添加购物车成功" title: "商品添加购物车成功"

View File

@@ -153,6 +153,7 @@
}" class="items" @click="change(item_value.sku_id, item_value.spec_id)"> }" class="items" @click="change(item_value.sku_id, item_value.spec_id)">
<image v-if="item_value.image" :src="$util.img(item_value.image, { size: 'small' })" @error="valueImageError(index, index_value)" /> <image v-if="item_value.image" :src="$util.img(item_value.image, { size: 'small' })" @error="valueImageError(index, index_value)" />
<text>{{ item_value.spec_value_name }}</text> <text>{{ item_value.spec_value_name }}</text>
<view class="empty-stock" v-if="item_value.stock == 0">缺货</view>
</view> </view>
</view> </view>
@@ -174,7 +175,7 @@
</view> </view>
</view> </view>
<ns-form :data="goodsForm" v-if="goodsForm" ref="form"></ns-form> <ns-form :data="goodsForm" v-if="goodsForm" ref="form" @changeFormVal="changeFormVal"></ns-form>
</scroll-view> </scroll-view>
</view> </view>
<view class="footer" @click="confirm()"> <view class="footer" @click="confirm()">
@@ -182,7 +183,8 @@
<block v-if="type == 'point'"> <block v-if="type == 'point'">
<block v-if="goodsDetail.type == 1"> <block v-if="goodsDetail.type == 1">
<!-- 兑换商品 --> <!-- 兑换商品 -->
<button v-if="goodsDetail.stock && goodsDetail.stock != 0" type="primary">兑换</button> <button v-if="goodsDetail.point * number > memberPoint" disabled="true" type="primary">积分不足</button>
<button v-else-if="goodsDetail.stock && goodsDetail.stock != 0" type="primary">兑换</button>
<button type="primary" v-else disabled="true">库存不足</button> <button type="primary" v-else disabled="true">库存不足</button>
</block> </block>
<block v-else-if="goodsDetail.type == 2 || goodsDetail.type == 3"> <block v-else-if="goodsDetail.type == 2 || goodsDetail.type == 3">
@@ -195,7 +197,8 @@
<button type="primary" v-else-if="goodsDetail.stock && goodsDetail.stock != 0 && type == 'buy_now'">立即购买</button> <button type="primary" v-else-if="goodsDetail.stock && goodsDetail.stock != 0 && type == 'buy_now'">立即购买</button>
<button type="primary" v-else-if="goodsDetail.stock && goodsDetail.stock != 0 && type == 'confirm'">确认</button> <button type="primary" v-else-if="goodsDetail.stock && goodsDetail.stock != 0 && type == 'confirm'">确认</button>
<template v-else-if="goodsDetail.stock && goodsDetail.stock != 0"> <template v-else-if="goodsDetail.stock && goodsDetail.stock != 0">
<template v-if="goodsDetail.buy_num"> <!-- 拼团和拼返的buy_num代表最大购买数量不是最小购买数量 -->
<template v-if="type != 'pintuan' && type != 'pinfan' && goodsDetail.buy_num">
<button type="primary" v-if="goodsDetail.buy_num <= goodsDetail.stock">立即抢购</button> <button type="primary" v-if="goodsDetail.buy_num <= goodsDetail.stock">立即抢购</button>
<button type="primary" v-else disabled="true">库存不足</button> <button type="primary" v-else disabled="true">库存不足</button>
</template> </template>
@@ -226,6 +229,10 @@
type: [Number, String], type: [Number, String],
default: 0 default: 0
}, },
memberPoint: {
type: [Number, String],
default: 0
},
goodsDetail: { goodsDetail: {
type: Object, type: Object,
default: null default: null
@@ -244,6 +251,12 @@
minBuy: { minBuy: {
type: Number, type: Number,
default: 0 default: 0
},
goodsFormVal: {
type: Array,
default () {
return [];
}
} }
}, },
data() { data() {
@@ -265,7 +278,8 @@
pintuan_num_field: 'pintuan_num', pintuan_num_field: 'pintuan_num',
goodsSkuInfo: null, //所有的商品规格信息 goodsSkuInfo: null, //所有的商品规格信息
goodsForm: null, goodsForm: null,
isLoad: false // 是否首次加载 isLoad: false ,// 是否首次加载
skuList: [],//所有规格数据
}; };
}, },
created() { created() {
@@ -310,8 +324,8 @@
this.pintuan_num_field = newData.pintuan_num_field; this.pintuan_num_field = newData.pintuan_num_field;
} }
if (this.goodsDetail.goods_form && !this.goodsForm) this.goodsForm = this.goodsDetail.goods_form; if (this.goodsDetail.goods_form && !this.goodsForm) this.goodsForm = this.goodsDetail.goods_form;
// 切换商品,重新赋值 // 切换商品,重新赋值
this.calcSkuStock()
if (newData.goods_id != oldData.goods_id) { if (newData.goods_id != oldData.goods_id) {
if (this.goodsDetail.pintuan_id) { if (this.goodsDetail.pintuan_id) {
this.getPintuanGoodsSkuList(); this.getPintuanGoodsSkuList();
@@ -378,6 +392,34 @@
} }
}, },
methods: { methods: {
calcSkuStock() {
if(this.goodsDetail.goods_spec_format && this.goodsDetail.goods_spec_format.length){
this.goodsDetail.goods_spec_format.forEach(spec => {
spec.value.forEach(val => {
this.skuList.forEach(sku => {
if (val.sku_id == sku.sku_id) {
this.$set(val,'stock',sku.stock);
}
})
})
})
}
},
changeFormVal(e) {
this.$emit('detailChangeVal',e)
},
getGoodsForm(){
this.$api.sendRequest({
url: "/form/api/form/goodsform",
data: {
goods_id: this.goodsDetail.goods_id
},
success: res => {
if (res.code == 0 && res.data) this.$set(this.goodsDetail, 'goods_form', res.data);
if(this.goodsFormVal.length) Object.assign(this.goodsDetail.goods_form,this.goodsFormVal)
}
});
},
//【普通商品】获取所有规格信息 //【普通商品】获取所有规格信息
getGeneralGoodsSkuList(callback) { getGeneralGoodsSkuList(callback) {
this.$api.sendRequest({ this.$api.sendRequest({
@@ -387,9 +429,7 @@
}, },
success: res => { success: res => {
if (res.code >= 0) { if (res.code >= 0) {
let data = res.data, let obj = {};
obj = {};
res.data.forEach((item, index) => { res.data.forEach((item, index) => {
item = this.handleData(item); item = this.handleData(item);
@@ -415,6 +455,8 @@
if (this.skuId == 0) this.skuId = res.data[0].sku_id; if (this.skuId == 0) this.skuId = res.data[0].sku_id;
this.goodsSkuInfo = obj; this.goodsSkuInfo = obj;
this.isLoad = false; this.isLoad = false;
this.skuList = res.data;
this.calcSkuStock();
if (callback) callback(); if (callback) callback();
} else { } else {
this.$util.redirectTo('/pages/index/index'); this.$util.redirectTo('/pages/index/index');
@@ -493,7 +535,7 @@
item = this.handleData(item); item = this.handleData(item);
item.show_price = this.goodsDetail.groupbuy_price; item.show_price = this.goodsDetail.groupbuy_price;
item.save_price = item.price - item.show_price > 0 ? (item.price - item.show_price).toFixed(2) : 0; item.save_price = item.price - item.show_price > 0 ? (item.price - item.show_price).toFixed(2) : 0;
//团购buy_num指最少购买数量
if (data.stock > data.buy_num) { if (data.stock > data.buy_num) {
this.number = this.goodsDetail.buy_num; this.number = this.goodsDetail.buy_num;
this.minNumber = this.goodsDetail.buy_num; this.minNumber = this.goodsDetail.buy_num;
@@ -730,6 +772,9 @@
popclose() { popclose() {
if (this.$refs.skuPopup.showPopup) { if (this.$refs.skuPopup.showPopup) {
this.$emit('hideSkuPop'); this.$emit('hideSkuPop');
}else{
this.goodsForm = null
this.getGoodsForm()
} }
}, },
//查看规格图片 //查看规格图片
@@ -766,7 +811,6 @@
} }
} }
} }
this.goodsSkuDetail = this.goodsSkuInfo['sku_' + this.skuId]; this.goodsSkuDetail = this.goodsSkuInfo['sku_' + this.skuId];
this.$emit('refresh', this.goodsSkuDetail); this.$emit('refresh', this.goodsSkuDetail);
this.$emit('getSkuId', this.skuId); this.$emit('getSkuId', this.skuId);
@@ -781,6 +825,7 @@
this.confirmDisabled = false; this.confirmDisabled = false;
} }
} }
this.keyInput(true); this.keyInput(true);
}, },
showPrice(price) { showPrice(price) {
@@ -1013,7 +1058,7 @@
return; return;
} }
if (this.goodsDetail.buy_num > this.goodsDetail.stock) { if (this.type != 'pintuan' && this.type != 'pinfan' && this.goodsDetail.buy_num > this.goodsDetail.stock) {
this.$util.showToast({ this.$util.showToast({
title: '库存小于最低购买数量' title: '库存小于最低购买数量'
}); });
@@ -1077,7 +1122,7 @@
title: '加入购物车成功' title: '加入购物车成功'
}); });
this.cartNum += this.number; this.cartNum += this.number;
this.$store.dispatch('getCartNumber');
let discount_price = this.goodsDetail.discount_price; let discount_price = this.goodsDetail.discount_price;
if (this.goodsDetail.member_price > 0 && Number(this.goodsDetail.member_price) <= Number(this.goodsDetail.discount_price)) { if (this.goodsDetail.member_price > 0 && Number(this.goodsDetail.member_price) <= Number(this.goodsDetail.discount_price)) {
discount_price = this.goodsDetail.member_price; discount_price = this.goodsDetail.member_price;
@@ -1213,6 +1258,9 @@
}); });
} else if (this.type == 'bargain') { } else if (this.type == 'bargain') {
// 砍价 // 砍价
if (this.callback) {
this.callback();
}else {
this.$api.sendRequest({ this.$api.sendRequest({
url: '/bargain/api/bargain/launch', url: '/bargain/api/bargain/launch',
data: { data: {
@@ -1221,13 +1269,10 @@
success: res => { success: res => {
this.btnSwitch = false; this.btnSwitch = false;
if (res.code == 0) { if (res.code == 0) {
this.$util.redirectTo( this.$util.redirectTo('/pages_promotion/bargain/detail', {
'/pages_promotion/bargain/detail', {
b_id: this.goodsDetail.bargain_id, b_id: this.goodsDetail.bargain_id,
l_id: res.data l_id: res.data
}, }, 'redirectTo');
'redirectTo'
);
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.message title: res.message
@@ -1235,6 +1280,7 @@
} }
} }
}); });
}
} else if (this.type == 'point') { } else if (this.type == 'point') {
// 积分兑换 // 积分兑换
var data = { var data = {
@@ -1399,6 +1445,7 @@
.body-item .sku-list-wrap { .body-item .sku-list-wrap {
padding-bottom: 0rpx; padding-bottom: 0rpx;
position: relative;
} }
.body-item .sku-list-wrap .title { .body-item .sku-list-wrap .title {
@@ -1406,6 +1453,19 @@
display: block; display: block;
} }
.body-item .sku-list-wrap .empty-stock{
font-size: 18rpx;
line-height: 22rpx;
position: absolute;
right: 0;
top: 0;
border-radius: 4rpx;
transform: translateY(-50%);
padding: 0 2rpx;
color: #989898;
background-color: #f0f1f2;
}
.body-item .sku-list-wrap .items { .body-item .sku-list-wrap .items {
position: relative; position: relative;
display: inline-block; display: inline-block;

View File

@@ -34,15 +34,11 @@
<view class="head"> <view class="head">
<text class="title"> <text class="title">
获取您的昵称头像 获取您的昵称头像
<template v-if="forceBindingMobileControl"> <template v-if="forceBindingMobileControl">手机号</template>
手机号
</template>
</text> </text>
<text class="color-tip tips"> <text class="color-tip tips">
获取用户头像昵称 获取用户头像昵称
<template v-if="forceBindingMobileControl"> <template v-if="forceBindingMobileControl">手机号</template>
手机号
</template>
完善个人资料主要用于向用户提供具有辨识度的用户中心界面 完善个人资料主要用于向用户提供具有辨识度的用户中心界面
</text> </text>
<text class="iconfont icon-close color-tip" @click="cancelCompleteInfo"></text> <text class="iconfont icon-close color-tip" @click="cancelCompleteInfo"></text>
@@ -156,7 +152,7 @@
}, },
immediate: true, immediate: true,
deep: true deep: true
} },
}, },
computed: { computed: {
// 控制按钮是否禁用 // 控制按钮是否禁用
@@ -182,10 +178,13 @@
return false; return false;
}, },
forceBindingMobileControl() { forceBindingMobileControl() {
if (this.registerConfig && this.registerConfig.third_party == 1 && this.registerConfig.bind_mobile == 1) if (this.registerConfig && this.registerConfig.third_party == 1 && this.registerConfig.bind_mobile == 1) return true;
return true;
else return false; else return false;
} },
wechatConfigStatus() {
return this.$store.state.wechatConfigStatus;
},
}, },
methods: { methods: {
// 获取注册配置 // 获取注册配置
@@ -200,8 +199,15 @@
} }
}); });
}, },
open(url) { open(url,isMiddleIndex = false) {
if (url) this.url = url; if(!url) url = this.$util.getCurrentRoute().path;
this.url = url;
if(this.url) uni.setStorageSync('initiateLogin',this.url)
if(!isMiddleIndex){
this.toLogin();
return;
}
// #ifdef MP // #ifdef MP
this.getCode(authData => { this.getCode(authData => {
this.authLogin(authData, 'authOnlyLogin'); this.authLogin(authData, 'authOnlyLogin');
@@ -209,7 +215,7 @@
// #endif // #endif
// #ifdef H5 // #ifdef H5
if (this.$util.isWeiXin()) { if (this.$util.isWeiXin() && this.wechatConfigStatus) {
let authData = uni.getStorageSync('authInfo'); let authData = uni.getStorageSync('authInfo');
if (authData) this.authLogin(authData); if (authData) this.authLogin(authData);
else this.getCode(); else this.getCode();
@@ -217,7 +223,6 @@
this.toLogin(); this.toLogin();
} }
// #endif // #endif
// #ifndef MP || H5 // #ifndef MP || H5
this.toLogin(); this.toLogin();
// #endif // #endif
@@ -440,7 +445,12 @@
this.$store.dispatch('getCartNumber'); this.$store.dispatch('getCartNumber');
this.$refs.completeInfoPopup.close(); this.$refs.completeInfoPopup.close();
this.$store.commit('setBottomNavHidden', false); // 显示底部导航 this.$store.commit('setBottomNavHidden', false); // 显示底部导航
if (res.data.is_register) this.$refs.registerReward.open(this.url); if (res.data.is_register) {
this.$store.commit('setCanReceiveRegistergiftInfo',{status: true,path: this.$util.openRegisterRewardPath('/pages/index/index')});
this.$util.loginComplete('/pages/index/index','redirectTo');
}
// if (res.data.is_register) this.$refs.registerReward.open(this.url);
} else { } else {
this.isSub = false; this.isSub = false;
this.getCaptcha(); this.getCaptcha();
@@ -457,7 +467,6 @@
}, },
// 微信小程序获取手机号 // 微信小程序获取手机号
getPhoneNumber(e) { getPhoneNumber(e) {
console.log(e)
if (e.detail.errMsg == 'getPhoneNumber:ok') { if (e.detail.errMsg == 'getPhoneNumber:ok') {
let authData = uni.getStorageSync('authInfo'); let authData = uni.getStorageSync('authInfo');
if (authData) Object.assign(this.authMobileData, authData, e.detail); if (authData) Object.assign(this.authMobileData, authData, e.detail);
@@ -479,7 +488,7 @@
}); });
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: e.detail.errMsg title: '为了保证您账户的统一性,取消授权将无法为您提供服务'
}) })
} }
}, },
@@ -500,7 +509,11 @@
this.getMemberInfo(); this.getMemberInfo();
this.$store.dispatch('getCartNumber'); this.$store.dispatch('getCartNumber');
this.cancelCompleteInfo(); this.cancelCompleteInfo();
if (res.data.is_register) this.$refs.registerReward.open(this.url); if (res.data.is_register) {
this.$store.commit('setCanReceiveRegistergiftInfo',{status: true,path:this.$util.openRegisterRewardPath('/pages/index/index')});
this.$util.loginComplete('/pages/index/index','redirectTo');
}
// if (res.data.is_register) this.$refs.registerReward.open(this.url);
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.message title: res.message
@@ -523,7 +536,6 @@
}); });
uni.setStorageSync('authInfo', data); uni.setStorageSync('authInfo', data);
if (uni.getStorageSync('source_member')) data.source_member = uni.getStorageSync('source_member'); if (uni.getStorageSync('source_member')) data.source_member = uni.getStorageSync('source_member');
this.$api.sendRequest({ this.$api.sendRequest({
url: type == 'authLogin' ? '/api/login/auth' : '/api/login/authonlylogin', url: type == 'authLogin' ? '/api/login/auth' : '/api/login/authonlylogin',
data, data,
@@ -532,9 +544,18 @@
this.$store.commit('setToken', res.data.token); this.$store.commit('setToken', res.data.token);
this.getMemberInfo(); this.getMemberInfo();
this.$store.dispatch('getCartNumber'); this.$store.dispatch('getCartNumber');
if (res.data.is_register) this.$refs.registerReward.open(this if (res.data.is_register){
.url); this.$store.commit('setCanReceiveRegistergiftInfo',{status: true,path:this.$util.openRegisterRewardPath('/pages/index/index')});
this.$util.loginComplete('/pages/index/index','redirectTo');
// this.$refs.registerReward.open(this.url);
}else{
// if(this.url) this.$util.redirectTo(this.url,{},'redirectTo')
// else this.$util.redirectTo('/pages/member/index',{},'redirectTo')
if(this.url) this.$util.loginComplete(this.url,{},'redirectTo');
else this.$util.loginComplete('/pages/member/index/index',{},'redirectTo')
}
this.cancelCompleteInfo(); this.cancelCompleteInfo();
setTimeout(() => { setTimeout(() => {
uni.hideLoading(); uni.hideLoading();
}, 1000); }, 1000);

View File

@@ -0,0 +1,25 @@
<template>
<view class="mp-html">
<mp-html :content="content"></mp-html>
</view>
</template>
<script>
export default {
props: {
content: {
type: String,
default: '',
}
},
}
</script>
<style lang="scss">
.mp-html{
/deep/ img{
width:100% !important;
display:block;
}
}
</style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<!-- <view class="ns-navbar-wrap" :class="'style-' + data.navStyle"> <view class="ns-navbar-wrap" :class="'style-' + data.navStyle">
<!-- #ifndef MP-ALIPAY -->
<view class="u-navbar" :style="{ backgroundColor: bgColor, paddingTop: navbarHeight + 'px' }"> <view class="u-navbar" :style="{ backgroundColor: bgColor, paddingTop: navbarHeight + 'px' }">
<view class="navbar-inner" :style="navbarInnerStyle"> <view class="navbar-inner" :style="navbarInnerStyle">
<view class="back-wrap" v-if="isBack && isBackShow" @tap="goBack"> <view class="back-wrap" v-if="isBack && isBackShow" @tap="goBack">
@@ -8,7 +8,7 @@
</view> </view>
<view v-if="data.navStyle == 1" class="content-wrap" :class="[data.textImgPosLink, isBack && isBackShow ? 'have-back' : '']" @click="toLink(data.moreLink.wap_url)"> <view v-if="data.navStyle == 1" class="content-wrap" :class="[data.textImgPosLink, isBack && isBackShow ? 'have-back' : '']" @click="toLink(data.moreLink.wap_url)">
<view class="title-wrap" :style="{ fontSize: '14px', color: data.textNavColor, textAlign: data.textImgPosLink }"> <view class="title-wrap" :style="{ fontSize: '16px', color: data.textNavColor, textAlign: data.textImgPosLink }">
{{ data.title }} {{ data.title }}
</view> </view>
</view> </view>
@@ -43,9 +43,10 @@
</view> </view>
</view> </view>
<!-- 解决fixed定位后导航栏塌陷的问题 -->
<view class="u-navbar-placeholder" :style="{ width: '100%', paddingTop: placeholderHeight + 'px' }"></view> <view class="u-navbar-placeholder" :style="{ width: '100%', paddingTop: placeholderHeight + 'px' }"></view>
<!-- #endif -->
</view> --> </view>
</template> </template>
<script> <script>
@@ -145,14 +146,14 @@ export default {
} }
}, },
created(e) { created(e) {
// var pages = getCurrentPages(); var pages = getCurrentPages();
// if (pages.length > 1) { if (pages.length > 1) {
// this.isBackShow = true; this.isBackShow = true;
// } }
// this.navbarPlaceholderHeight(); this.navbarPlaceholderHeight();
}, },
mounted() { mounted() {
// this.setModuleLocatinoFn(); this.setModuleLocationFn();
}, },
methods: { methods: {
toLink(val) { toLink(val) {
@@ -178,23 +179,18 @@ export default {
} }
}, },
navbarPlaceholderHeight() { navbarPlaceholderHeight() {
let height = 0;
setTimeout(() => { setTimeout(() => {
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query query.select('.ns-navbar-wrap .u-navbar').boundingClientRect(data => {
.select('.ns-navbar-wrap .u-navbar')
.boundingClientRect(data => {
// 获取公告自身高度 // 获取公告自身高度
this.placeholderHeight = data.height; this.placeholderHeight = data.height;
}) }).exec();
.exec();
}); });
}, },
// 向vuex中的diyIndexPositionObj增加公告导航组件定位位置 // 向vuex中的diyIndexPositionObj增加公告导航组件定位位置
setModuleLocatinoFn() { setModuleLocationFn() {
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query.select('.ns-navbar-wrap .u-navbar') query.select('.ns-navbar-wrap .u-navbar').boundingClientRect(data => {
.boundingClientRect(data => {
let diyIndexPage = { let diyIndexPage = {
originalVal: data.height || 0, //自身高度 px originalVal: data.height || 0, //自身高度 px
currVal: 0 //定位高度 currVal: 0 //定位高度

View File

@@ -93,6 +93,7 @@
}, },
bgHight: '940rpx !important', bgHight: '940rpx !important',
bytesCount: null, bytesCount: null,
callback: null
}; };
}, },
filters: { filters: {
@@ -125,7 +126,8 @@
this.init(); this.init();
}, },
methods: { methods: {
init() { init(callback = null) {
if (callback) this.callback = callback;
this.getHolidayGift(); this.getHolidayGift();
}, },
// 查询节日有礼设置 // 查询节日有礼设置
@@ -154,7 +156,9 @@
data: { data: {
festival_id: this.newgift.festival_id festival_id: this.newgift.festival_id
}, },
success: res => {} success: res => {
if (this.callback) this.callback();
}
}); });
} }
}, },
@@ -329,12 +333,8 @@
z-index: 500; z-index: 500;
.btn { .btn {
/* margin: 0 50rpx;
background: linear-gradient(90deg,#ff4100,#ff6a00) ;
border: none; */
color: #fff; color: #fff;
font-size: 40rpx; font-size: 40rpx;
// padding: 100px;
border: 4rpx solid #fff; border: 4rpx solid #fff;
border-radius: 50%; border-radius: 50%;
padding: 10rpx; padding: 10rpx;

View File

@@ -0,0 +1,933 @@
<template>
<view class="form-wrap form-component">
<view v-for="(item, index) in formData" :key="index">
<!-- 文本输入框 -->
<view v-if="item.controller == 'Text'" class="order-wrap">
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box">
<input
type="text"
:placeholder="item.value.placeholder"
placeholder-class="placeholder color-tip"
v-model="item.val"
/>
</view>
</view>
</view>
<!-- 多行文本输入框 -->
<view v-if="item.controller == 'Textarea'" class="order-wrap">
<view class="order-cell flex-box textarea">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box">
<textarea
:placeholder="item.value.placeholder"
placeholder-class="placeholder color-tip"
v-model="item.val"
></textarea>
</view>
</view>
</view>
<!-- 下拉选择器 -->
<view v-if="item.controller == 'Select'" class="order-wrap">
<picker
mode="selector"
:range="item.value.options"
@change="pickerChange($event, index)"
>
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box">
<text v-if="item.val != ''">{{ item.val }}</text>
<text v-else class="color-tip">请选择</text>
</view>
<text class="iconfont icon-right"></text>
</view>
</picker>
</view>
<!-- 复选框 -->
<view v-if="item.controller == 'Checkbox'" class="order-wrap">
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box check-group-box">
<checkbox-group @change="checkboxChange($event, index)">
<label v-for="(v, k) in item.option_lists" :key="k">
<checkbox :value="v.value" :checked="v.checked"></checkbox>
<view class="checkbox">
<text
:class="[
'iconfont',
!v.checked ? 'icon-fuxuankuang2' : '',
v.checked ? 'icon-fuxuankuang1 color-base-text' : ''
]"
></text>
{{ v.value }}
</view>
</label>
</checkbox-group>
</view>
</view>
</view>
<!-- 单选框 -->
<view v-if="item.controller == 'Radio'" class="order-wrap">
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box radio-group-box">
<radio-group @change="radioChange($event, index)">
<label v-for="(v, k) in item.option_lists" :key="k">
<radio :value="v.value" :checked="item.val == v.value"></radio>
<view class="radio-box">
<text
:class="[
'iconfont',
item.val != v.value ? 'icon-yuan_checkbox' : '',
item.val == v.value ? 'icon-yuan_checked color-base-text' : ''
]"
></text>
{{ v.value }}
</view>
</label>
</radio-group>
</view>
</view>
</view>
<!-- 图片上传 -->
<view v-if="item.controller == 'Img'" class="order-wrap">
<view class="order-cell flex-box">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box img-boxs">
<view v-for="(v, k) in item.img_lists" :key="k" class="img-box" @tap="uploadImg(index)">
<image :src="$util.img(v)" mode="aspectFill"></image>
<text class="iconfont icon-guanbi" @tap.stop="delImg(k, index)"></text>
</view>
<view class="img-box" @tap="addImg(index)">
<text class="iconfont icon-add1"></text>
</view>
</view>
</view>
</view>
<!-- 日期选择器 -->
<view v-if="item.controller == 'Date'" class="order-wrap">
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box box-flex">
<picker
mode="date"
:value="item.val"
@change="bindDateChange($event, index)"
>
<view :class="['uni-input', !item.val ? 'color-tip' : '']">
{{ item.val ? item.val : item.value.placeholder }}
</view>
</picker>
</view>
<text class="iconfont icon-right"></text>
</view>
</view>
<!-- 日期范围选择器 -->
<view v-if="item.controller == 'Datelimit'" class="order-wrap">
<view class="order-cell flex-box">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box date-boxs">
<view class="date-box">
<picker
mode="date"
:value="item.start_date"
@change="bindStartDateChange($event, index)"
>
<view class="picker-box">
<view :class="['uni-input', !item.start_date ? 'color-tip' : '']">
{{ item.start_date ? item.start_date : item.value.placeholder_start }}
</view>
</view>
</picker>
</view>
<view class="interval iconfont icon-jian"></view>
<view class="date-box">
<picker
mode="date"
:value="item.end_date"
@change="bindEndDateChange($event, index)"
>
<view class="picker-box">
<view :class="['uni-input', !item.end_date ? 'color-tip' : '']">
{{ item.end_date ? item.end_date : item.value.placeholder_end }}
</view>
</view>
</picker>
</view>
</view>
</view>
</view>
<!-- 时间选择器 -->
<view v-if="item.controller == 'Time'" class="order-wrap">
<view class="order-cell">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box box-flex">
<picker
mode="time"
:value="item.val"
@change="bindTimeChange($event, index)"
>
<view :class="['uni-input', !item.val ? 'color-tip' : '']">
{{ item.val ? item.val : item.value.placeholder }}
</view>
</picker>
</view>
<text class="iconfont icon-right"></text>
</view>
</view>
<!-- 时间范围选择器 -->
<view v-if="item.controller == 'Timelimit'" class="order-wrap">
<view class="order-cell flex-box">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box date-boxs">
<view class="date-box">
<picker
mode="time"
:value="item.start_time"
@change="bindStartTimeChange($event, index)"
>
<view class="picker-box">
<view :class="['uni-input', !item.start_time ? 'color-tip' : '']">
{{ item.start_time ? item.start_time : item.value.placeholder_start }}
</view>
</view>
</picker>
</view>
<view class="interval iconfont icon-jian"></view>
<view class="date-box">
<picker
mode="time"
:value="item.end_time"
@change="bindEndTimeChange($event, index)"
>
<view class="picker-box">
<view :class="['uni-input', !item.end_time ? 'color-tip' : '']">
{{ item.end_time ? item.end_time : item.value.placeholder_end }}
</view>
</view>
</picker>
</view>
</view>
</view>
</view>
<!-- 城市选择器 -->
<view v-if="item.controller == 'City'" class="order-wrap">
<view class="order-cell box-flex">
<view class="name">
<text class="tit">{{ item.value.title }}</text>
<text class="required">{{ item.value.required ? '*' : '' }}</text>
</view>
<view class="box">
<pick-regions
:defaultRegions="item.default_regions"
:selectArr="item.select_arr"
@getRegions="handleGetRegions($event, index)"
>
<view :class="['select-address', !item.val ? 'empty' : '', !item.val ? 'color-tip' : '']">
{{ item.val ? item.val : (item.select_arr == '2' ? '请选择省市' : '请选择省市区/县') }}
</view>
</pick-regions>
</view>
<text class="iconfont icon-right"></text>
</view>
</view>
</view>
</view>
</template>
<script>
import pickRegions from '@/components/pick-regions/pick-regions.vue'
export default {
name: 'ns-form',
components: {
pickRegions
},
props: {
data: {
type: Array,
default: () => ({})
},
customAttr: {
type: Object,
default: () => ({})
}
},
data() {
return {
formData: this.data
}
},
created() {
this.setFormData();
},
watch: {
data: {
handler() {
this.setFormData();
},
deep: true
}
},
methods: {
setFormData() {
this.formData = this.data;
this.formData.forEach((item) => {
// 初始化默认值
if (!item.val) {
item.val = item.value.default ? item.value.default : '';
}
// 处理选项列表
if (item.value.options) {
item.option_lists = [];
item.value.options.forEach((option, index) => {
let optionItem = {};
optionItem.value = option;
optionItem.checked = false;
if (item.controller == 'Radio') {
if ((!item.val && index == 0) || (item.val && item.val == option)) {
optionItem.checked = true;
item.val = option;
}
}
if (item.controller == 'Checkbox' && item.val) {
let valArray = item.val.split(',');
optionItem.checked = valArray.indexOf(option) != -1;
}
item.option_lists.push(optionItem);
});
}
// 处理图片列表
if (item.controller == 'Img') {
item.img_lists = item.val ? item.val.split(',') : [];
}
// 处理日期
if (item.controller == 'Date' && !item.val) {
if (item.value.is_show_default) {
if (item.value.is_current) {
item.val = this.getDate();
} else {
item.val = item.value.default;
}
} else {
item.val = '';
}
}
// 处理日期范围
if (item.controller == 'Datelimit') {
if (item.val) {
let dateArray = item.val.split(' - ');
item.start_date = dateArray[0];
item.end_date = dateArray[1];
} else {
item.val = '';
// 开始日期
if (item.value.is_show_default_start) {
if (item.value.is_current_start) {
item.start_date = this.getDate();
} else {
item.start_date = item.value.default_start;
}
} else {
item.start_date = '';
}
// 结束日期
if (item.value.is_show_default_end) {
if (item.value.is_current_end) {
item.end_date = this.getDate();
} else {
item.end_date = item.value.default_end;
}
} else {
item.end_date = '';
}
if (item.start_date && item.end_date) {
item.val = item.start_date + ' - ' + item.end_date;
}
}
}
// 处理时间
if (item.controller == 'Time' && !item.val) {
if (item.value.is_show_default) {
if (item.value.is_current) {
item.val = this.getTime();
} else {
item.val = item.value.default;
}
} else {
item.val = '';
}
}
// 处理时间范围
if (item.controller == 'Timelimit') {
if (item.val) {
let timeArray = item.val.split(' - ');
item.start_time = timeArray[0];
item.end_time = timeArray[1];
} else {
item.val = '';
// 开始时间
if (item.value.is_show_default_start) {
if (item.value.is_current_start) {
item.start_time = this.getTime();
} else {
item.start_time = item.value.default_start;
}
} else {
item.start_time = '';
}
// 结束时间
if (item.value.is_show_default_end) {
if (item.value.is_current_end) {
item.end_time = this.getTime();
} else {
item.end_time = item.value.default_end;
}
} else {
item.end_time = '';
}
if (item.start_time && item.end_time) {
item.val = item.start_time + ' - ' + item.end_time;
}
}
}
// 处理城市选择
if (item.controller == 'City') {
item.full_address = '';
item.select_arr = item.value.default_type == 1 ? '2' : '3';
if (item.val) {
item.default_regions = item.val.split('-');
} else {
item.default_regions = [];
}
}
});
},
// 表单验证
verify() {
for (let i = 0; i < this.formData.length; i++) {
let item = this.formData[i];
// 文本验证
if (item.controller == 'Text') {
if (item.value.required && !item.val) {
this.$util.showToast({ title: '请输入' + item.value.title });
return false;
}
if (item.name == 'ID_CARD' && !/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(item.val)) {
if (!item.value.required) {
this.$util.showToast({ title: '身份证输入不合法' });
return false;
}
if (item.val != '') {
this.$util.showToast({ title: '身份证输入不合法' });
return false;
}
}
if (item.name == 'MOBILE' && !this.$util.verifyMobile(item.val)) {
if (!item.value.required) {
this.$util.showToast({ title: '手机号输入不合法' });
return false;
}
if (item.val != '') {
this.$util.showToast({ title: '手机号输入不合法' });
return false;
}
}
}
// 多行文本验证
if (item.controller == 'Textarea' && item.value.required && !item.val) {
this.$util.showToast({ title: '请输入' + item.value.title });
return false;
}
// 下拉选择验证
if (item.controller == 'Select' && item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
// 复选框验证
if (item.controller == 'Checkbox' && item.value.required && !item.val) {
this.$util.showToast({ title: '请至少选择一个' + item.value.title });
return false;
}
// 图片上传验证
if (item.controller == 'Img' && item.value.required && !item.val) {
this.$util.showToast({ title: '请至少上传一张' + item.value.title });
return false;
}
// 日期验证
if (item.controller == 'Date' && item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
// 日期范围验证
if (item.controller == 'Datelimit') {
if (item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
if (this.$util.timeTurnTimeStamp(item.start_date) > this.$util.timeTurnTimeStamp(item.end_date)) {
this.$util.showToast({ title: '结束日期不能小于开始日期' });
return false;
}
}
// 时间验证
if (item.controller == 'Time' && item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
// 时间范围验证
if (item.controller == 'Timelimit') {
if (item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
if (item.start_time >= item.end_time) {
this.$util.showToast({ title: '结束时间必须大于开始时间' });
return false;
}
}
// 城市选择验证
if (item.controller == 'City' && item.value.required && !item.val) {
this.$util.showToast({ title: '请选择' + item.value.title });
return false;
}
}
return this.formData;
},
// 下拉选择改变
pickerChange(event, index) {
this.formData[index].val = this.data[index].value.options[event.detail.value];
this.$forceUpdate();
},
// 复选框改变
checkboxChange(event, index) {
this.formData[index].val = event.detail.value.toString();
this.formData[index].option_lists.forEach((option) => {
option.checked = event.detail.value.indexOf(option.value) != -1;
});
this.$forceUpdate();
},
// 单选框改变
radioChange(event, index) {
this.formData[index].val = event.detail.value;
this.$forceUpdate();
},
// 上传图片
uploadImg(index) {
let self = this;
this.$util.upload(Number(this.formData[index].value.max_count), { path: 'evaluateimg' }, function(res) {
if (res.length > 0) {
res.forEach(function(img) {
if (self.formData[index].img_lists.length >= Number(self.formData[index].value.max_count)) {
self.$util.showToast({ title: '最多上传' + self.formData[index].value.max_count + '张图片' });
return false;
}
self.formData[index].img_lists.push(img);
});
self.formData[index].val = self.formData[index].img_lists.toString();
self.$forceUpdate();
}
});
},
// 添加图片
addImg(index) {
let self = this;
if (this.formData[index].img_lists.length >= Number(this.formData[index].value.max_count)) {
this.$util.showToast({ title: '最多上传' + this.formData[index].value.max_count + '张图片' });
return false;
}
this.$util.upload(Number(this.formData[index].value.max_count), { path: 'evaluateimg' }, function(res) {
if (res.length > 0) {
res.forEach(function(img) {
self.formData[index].img_lists.push(img);
});
self.formData[index].val = self.formData[index].img_lists.toString();
self.$forceUpdate();
}
});
},
// 删除图片
delImg(imgIndex, formIndex) {
this.formData[formIndex].img_lists.splice(imgIndex, 1);
this.formData[formIndex].val = this.formData[formIndex].img_lists.toString();
this.$forceUpdate();
},
// 获取当前日期
getDate() {
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
// 获取当前时间
getTime() {
let date = new Date();
let hours = date.getHours();
let minutes = date.getMinutes();
hours = hours > 9 ? hours : '0' + hours;
minutes = minutes > 9 ? minutes : '0' + minutes;
return `${hours}:${minutes}`;
},
// 日期改变
bindDateChange(event, index) {
this.formData[index].val = event.detail.value;
this.$forceUpdate();
},
// 开始日期改变
bindStartDateChange(event, index) {
this.$set(this.formData[index], 'start_date', event.detail.value);
this.$set(this.formData[index], 'val', this.formData[index].start_date + ' - ' + this.formData[index].end_date);
this.$forceUpdate();
},
// 结束日期改变
bindEndDateChange(event, index) {
this.$set(this.formData[index], 'end_date', event.detail.value);
this.$set(this.formData[index], 'val', this.formData[index].start_date + ' - ' + this.formData[index].end_date);
this.$forceUpdate();
},
// 时间改变
bindTimeChange(event, index) {
this.formData[index].val = event.detail.value;
this.$forceUpdate();
},
// 开始时间改变
bindStartTimeChange(event, index) {
this.formData[index].start_time = event.detail.value;
this.$forceUpdate();
},
// 结束时间改变
bindEndTimeChange(event, index) {
this.formData[index].end_time = event.detail.value;
this.formData[index].val = this.formData[index].start_time + ' - ' + this.formData[index].end_time;
this.$forceUpdate();
},
// 处理地区选择
handleGetRegions(regions, index) {
this.formData[index].val = '';
this.formData[index].val += regions[0] != undefined ? regions[0].label : '';
this.formData[index].val += regions[1] != undefined ? '-' + regions[1].label : '';
this.formData[index].val += regions[2] != undefined ? '-' + regions[2].label : '';
this.$forceUpdate();
}
}
}
</script>
<style lang="scss" scoped>
.order-wrap {
padding: 20rpx 0;
&:last-child {
margin-bottom: 0;
border-bottom: 0;
}
.order-cell {
align-items: center;
background: #fff;
position: relative;
&.textarea {
align-items: unset;
}
&.clear-flex {
display: block;
.box {
margin-top: 16rpx;
text-align: left;
}
}
&:last-child {
margin-bottom: 0;
border-bottom: solid 1px #eee;
}
&.align-top {
align-items: flex-start;
}
text {
font-size: 28rpx;
}
.name {
width: 160rpx;
margin-bottom: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.tit {
text-align: left;
font-size: 32rpx;
color: #888;
text {
font-size: 28rpx;
}
}
.required {
color: red;
font-size: 28rpx;
margin-left: 4rpx;
width: 14rpx;
text-align: left;
display: inline-block;
}
}
.box {
flex: 1;
padding: 0 0rpx;
line-height: inherit;
text-align: left;
input {
font-size: 28rpx;
text-align: left;
height: 70rpx;
border: solid 2rpx #eee;
line-height: 70rpx;
padding: 0 16rpx;
}
textarea {
font-size: 28rpx;
width: 100%;
height: 88rpx;
line-height: 44rpx;
text-align: left;
}
checkbox-group {
display: flex;
flex-wrap: wrap;
}
radio-group {
display: flex;
flex-wrap: wrap;
}
label {
display: flex;
align-items: center;
line-height: 1;
margin-right: 30rpx;
}
&.img-boxs {
display: flex;
align-items: center;
flex-wrap: wrap;
.img-box {
margin: 10rpx 20rpx 10rpx 0;
display: flex;
justify-content: center;
align-items: center;
width: 100rpx;
height: 100rpx;
border: 1rpx solid #eee;
border-radius: 4rpx;
position: relative;
.icon-guanbi {
position: absolute;
top: -14rpx;
right: -14rpx;
display: inline-block;
width: 28rpx;
height: 28rpx;
line-height: 28rpx;
color: #909399;
}
.icon-add1 {
font-size: 40rpx;
}
image {
width: 100%;
height: 100%;
}
}
}
&.box-flex {
display: flex;
align-items: center;
justify-content: space-between;
}
&.date-boxs {
padding: 0 10rpx;
display: flex;
align-items: center;
.interval {
margin: 0 12rpx;
color: #000;
font-weight: 700;
}
.date-box {
.picker-box {
display: flex;
align-items: center;
justify-content: flex-end;
}
}
}
}
.radio-group-box {
radio {
display: none;
}
.radio-box {
display: flex;
align-items: center;
line-height: 1;
.iconfont {
font-size: 32rpx;
margin-right: 10rpx;
}
}
}
.check-group-box {
checkbox {
display: none;
}
.checkbox {
display: flex;
align-items: center;
line-height: 1;
.iconfont {
font-size: 32rpx;
margin-right: 10rpx;
}
}
}
.iconfont {
color: #909399;
font-size: 28rpx;
}
.box-flex {
picker {
display: block;
width: 100%;
}
}
.icon-right {
line-height: 1;
position: unset;
}
}
}
</style>

View File

@@ -183,7 +183,13 @@
success: res => { success: res => {
if (res.code >= 0 && res.data) { if (res.code >= 0 && res.data) {
this.payInfo = res.data; this.payInfo = res.data;
if(this.payInfo['pay_status'] == 2){
this.$util.redirectTo('/pages_tool/pay/result', {
code: this.payInfo.out_trade_no
}, '', 'redirectTo');
}else{
this.pay(); this.pay();
}
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: '未获取到支付信息!' title: '未获取到支付信息!'
@@ -226,6 +232,7 @@
pay() { pay() {
var payType = this.payTypeList[this.payIndex]; var payType = this.payTypeList[this.payIndex];
if (!payType) return; if (!payType) return;
var return_url = ''; var return_url = '';
if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') { if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') {
return_url = '/pages_promotion/blindbox/index?outTradeNo='; return_url = '/pages_promotion/blindbox/index?outTradeNo=';
@@ -378,19 +385,13 @@
success: res => { success: res => {
uni.removeStorage({key: 'is_test'}) uni.removeStorage({key: 'is_test'})
if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') { if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') {
this.$util.redirectTo( this.$util.redirectTo('/pages_promotion/blindbox/index', {
'/pages_promotion/blindbox/index', { outTradeNo: this.payInfo.out_trade_no
outTradeNo: this }, '', 'redirectTo');
.payInfo.out_trade_no
}, '',
'redirectTo');
} else { } else {
this.$util.redirectTo( this.$util.redirectTo('/pages_tool/pay/result', {
'/pages_tool/pay/result', { code: this.payInfo.out_trade_no
code: this }, '', 'redirectTo');
.payInfo.out_trade_no
}, '',
'redirectTo');
} }
}, },
fail: res => { fail: res => {
@@ -425,9 +426,15 @@
provider: payType.provider, provider: payType.provider,
...payData, ...payData,
success: res => { success: res => {
if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') {
this.$util.redirectTo('/pages_promotion/blindbox/index', {
outTradeNo: this.payInfo.out_trade_no
}, '', 'redirectTo');
} else {
this.$util.redirectTo('/pages_tool/pay/result', { this.$util.redirectTo('/pages_tool/pay/result', {
code: this.payInfo.out_trade_no code: this.payInfo.out_trade_no
}, '', 'redirectTo'); }, '', 'redirectTo');
}
}, },
fail: res => { fail: res => {
this.flag = false; this.flag = false;
@@ -440,10 +447,15 @@
}); });
} }
setTimeout(() => { setTimeout(() => {
if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') {
this.$util.redirectTo('/pages_promotion/blindbox/index', {
outTradeNo: this.payInfo.out_trade_no
}, '', 'redirectTo');
} else {
this.$util.redirectTo('/pages_tool/pay/result', { this.$util.redirectTo('/pages_tool/pay/result', {
code: this.payInfo.out_trade_no code: this.payInfo.out_trade_no
}, }, '', 'redirectTo');
'redirectTo'); }
}, 2000); }, 2000);
} }
}); });

View File

@@ -91,11 +91,11 @@ export default {
let obj = this.dayData[this.key]; let obj = this.dayData[this.key];
obj.time = this.timeData[this.keys]; obj.time = this.timeData[this.keys];
let time = obj.time.replace('立即配送(','').replace('',''); let time = obj.time.replace('立即配送(','').replace('','');
let dateTime = new Date();
var dateTime = new Date(); let format = time.split('-');
var format = time.split('-'); let startHours = format[0].split(':');
var startHours = format[0].split(':'); let endHours = format[1].split(':');
var endHours = format[1].split(':');
let timeData = obj.month.split('月'); let timeData = obj.month.split('月');
let month = timeData[0]; let month = timeData[0];
@@ -119,6 +119,23 @@ export default {
this.toTime(judge); this.toTime(judge);
let obj = this.dayData[0]; let obj = this.dayData[0];
obj.time = this.timeData[0]; obj.time = this.timeData[0];
let dateTime = new Date();
let format = obj.time.replace('立即配送(','').replace('','').split('-');
let startHours = format[0].split(':');
let endHours = format[1].split(':');
let timeData = obj.month.split('月');
let month = timeData[0];
let date = timeData[1].split('日')[0];
// 开始时间戳
dateTime.setHours(startHours[0],startHours[1],0,0);
obj.start_time = dateTime.getTime()/1000;
obj.start_date = dateTime.getFullYear() + '-' + month + '-' + date + ' ' + format[0];
// 结束时间戳
dateTime.setHours(endHours[0],endHours[1],0,0);
obj.end_time = dateTime.getTime()/1000;
obj.end_date = dateTime.getFullYear() + '-' + month + '-' + date + ' ' + format[1];
this.$emit('selectTime', { data: obj, type: judge }); this.$emit('selectTime', { data: obj, type: judge });
} }
this.$forceUpdate(); this.$forceUpdate();
@@ -165,6 +182,7 @@ export default {
} }
//判断当天是否能够配送、自提 //判断当天是否能够配送、自提
if (type == 0 || judge || obj.indexOf(nowDay.toString()) != -1) { if (type == 0 || judge || obj.indexOf(nowDay.toString()) != -1) {
let endTime = this.obj.dataTime.delivery_time[ (this.obj.dataTime.delivery_time.length - 1) ].end_time; let endTime = this.obj.dataTime.delivery_time[ (this.obj.dataTime.delivery_time.length - 1) ].end_time;
endTime -= this.obj.dataTime.time_interval * 60; endTime -= this.obj.dataTime.time_interval * 60;
switch (num) { switch (num) {
@@ -227,7 +245,6 @@ export default {
this.judge = true; this.judge = true;
} }
} }
this.toTime(); //处理右侧时间数据 this.toTime(); //处理右侧时间数据
}, },
/** /**

View File

@@ -15,19 +15,21 @@
<view class="payment-item" v-if="balanceDeduct > 0 && balanceUsable && balanceConfig == 1"> <view class="payment-item" v-if="balanceDeduct > 0 && balanceUsable && balanceConfig == 1">
<view class="iconfont icon-yue"></view> <view class="iconfont icon-yue"></view>
<view class="info-wrap"> <view class="info-wrap">
<text class="name">余额支付</text> <text class="name">余额抵扣</text>
<view class="money">可用¥{{ balanceDeduct|moneyFormat }}</view> <view class="money">可用¥{{ balanceDeduct|moneyFormat }}</view>
</view> </view>
<ns-switch class="balance-switch" @change="useBalance" :checked="isBalance == 1"></ns-switch> <ns-switch class="balance-switch" @change="useBalance" :checked="isBalance == 1"></ns-switch>
</view> </view>
<block v-if="payMoney > 0"> <block v-if="payMoney > 0">
<block v-if="payTypeList.length"> <block v-if="payTypeList.length">
<view class="payment-item" v-for="(item, index) in payTypeList" :key="index" @click="payIndex = index"> <block v-for="(item, index) in payTypeList">
<view v-if="offlineShow||item.type!='offlinepay'" class="payment-item" :key="index" @click="payIndex = index">
<view class="iconfont" :class="item.icon"></view> <view class="iconfont" :class="item.icon"></view>
<text class="name">{{ item.name }}</text> <text class="name">{{ item.name }}</text>
<text class="iconfont" :class="payIndex == index ? 'icon-yuan_checked color-base-text' : 'icon-checkboxblank'"></text> <text class="iconfont" :class="payIndex == index ? 'icon-yuan_checked color-base-text' : 'icon-checkboxblank'"></text>
</view> </view>
</block> </block>
</block>
<block v-else> <block v-else>
<view class="empty">平台尚未配置支付方式</view> <view class="empty">平台尚未配置支付方式</view>
</block> </block>
@@ -63,47 +65,44 @@
balanceUsable: { balanceUsable: {
type: Boolean, type: Boolean,
default: true default: true
} },
}, },
data() { data() {
return { return {
payIndex: 0, payIndex: 0,
// #ifdef H5 payTypeList: [
payTypeList: [{ // #ifdef H5 || MP-ALIPAY
{
name: '支付宝支付', name: '支付宝支付',
icon: 'icon-zhifubaozhifu-', icon: 'icon-zhifubaozhifu-',
type: 'alipay' type: 'alipay'
}, },
// #endif
// #ifdef H5 || MP-WEIXIN
{ {
name: '微信支付', name: '微信支付',
icon: 'icon-weixin1', icon: 'icon-weixin1',
type: 'wechatpay' type: 'wechatpay'
} },
// #endif
{
name: '线下支付',
icon: 'icondiy icon-yuezhifu',
type: 'offlinepay'
},
], ],
// #ifdef H5
timer: null, timer: null,
// #endif // #endif
// #ifdef MP-WEIXIN
payTypeList: [{
name: '微信支付',
provider: 'wxpay',
icon: 'icon-weixin1',
type: 'wechatpay'
}],
// #endif
// #ifdef MP-ALIPAY
payTypeList: [{
name: '支付宝支付',
icon: 'icon-zhifubaozhifu-',
type: 'alipay',
provider: 'alipay'
}],
// #endif
payInfo: null, payInfo: null,
balanceConfig: 0, balanceConfig: 0,
// 预售页面判断 // 预售页面判断
sale: true, sale: true,
isBalance: 0, isBalance: 0,
balance: 0 balance: 0,
//重置是否已完成没有完成不能调用api/pay/pay
resetPayComplete:true,
repeatFlag:false,
}; };
}, },
created(e) { created(e) {
@@ -127,9 +126,32 @@
} }
} }
return money; return money;
},
offlineShow(){
// 获取当前页面栈实例数组
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
// 获取页面路由路径
let routePath = currentPage.route;
return this.$store.state.offlineWhiteList.length?this.$store.state.offlineWhiteList.includes(routePath):false
} }
}, },
methods: { methods: {
/**
* 父级页面onShow调用
*/
pageShow() {
if(this.payInfo){
let offlinepay = uni.getStorageSync('offlinepay');
if(offlinepay){
uni.removeStorageSync('offlinepay');
this.close()
}
}else{
uni.removeStorageSync('offlinepay');
}
},
close() { close() {
this.$emit('close'); this.$emit('close');
this.$refs.choosePaymentPopup.close(); this.$refs.choosePaymentPopup.close();
@@ -146,14 +168,22 @@
}); });
return; return;
} }
if(this.resetPayComplete == false){
this.$util.showToast({
title: '支付取消中,请稍后再试!'
});
return;
}
uni.showLoading({ uni.showLoading({
title: '支付中...', title: '支付中...',
mask: true mask: true
}); });
if(this.repeatFlag) return;
this.repeatFlag = true;
this.pay(); this.pay();
uni.setStorageSync('pay_flag', 1); uni.setStorageSync('pay_flag', 1);
}, },
getPayInfo(out_trade_no) { getPayInfo(out_trade_no, callback) {
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/pay/info', url: '/api/pay/info',
data: { data: {
@@ -165,6 +195,7 @@
if (this.balanceConfig && this.balanceUsable) this.getMemberBalance(); if (this.balanceConfig && this.balanceUsable) this.getMemberBalance();
setTimeout(() => { setTimeout(() => {
this.$refs.choosePaymentPopup.open(); this.$refs.choosePaymentPopup.open();
if(typeof callback == 'function') callback();
}) })
} else { } else {
this.$util.showToast({ this.$util.showToast({
@@ -178,7 +209,6 @@
* 获取余额配置 * 获取余额配置
*/ */
getBalanceConfig() { getBalanceConfig() {
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/pay/getBalanceConfig', url: '/api/pay/getBalanceConfig',
data: {}, data: {},
@@ -196,10 +226,6 @@
success: res => { success: res => {
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
this.balance = parseFloat(res.data.usable_balance); this.balance = parseFloat(res.data.usable_balance);
//余额不足以抵扣整个订单时不显示
if(parseFloat(this.payMoney) > this.balance){
this.balanceConfig = 0
}
} }
} }
}) })
@@ -215,10 +241,8 @@
if (res.data.pay_type == '') { if (res.data.pay_type == '') {
this.payTypeList = []; this.payTypeList = [];
} else { } else {
this.payTypeList.forEach((val, key) => { this.payTypeList = this.payTypeList.filter((val, key) => {
if (res.data.pay_type.indexOf(val.type) == -1) { return res.data.pay_type.indexOf(val.type) != -1
this.payTypeList.splice(key, 1);
}
}); });
} }
} }
@@ -239,8 +263,7 @@
data: { data: {
out_trade_no: this.payInfo.out_trade_no, out_trade_no: this.payInfo.out_trade_no,
pay_type: payType ? payType.type : '', pay_type: payType ? payType.type : '',
return_url: encodeURIComponent(this.$config.h5Domain + return_url + this.payInfo return_url: encodeURIComponent(this.$config.h5Domain + return_url + this.payInfo.out_trade_no),
.out_trade_no),
is_balance: this.isBalance is_balance: this.isBalance
}, },
success: res => { success: res => {
@@ -258,7 +281,9 @@
wx_alipay: wx_alipay, wx_alipay: wx_alipay,
out_trade_no: this.payInfo.out_trade_no out_trade_no: this.payInfo.out_trade_no
}, '', 'redirectTo'); }, '', 'redirectTo');
this.repeatFlag = false;
} else { } else {
this.repeatFlag = false;
location.href = res.data.data; location.href = res.data.data;
this.checkPayStatus(); this.checkPayStatus();
} }
@@ -290,12 +315,14 @@
res => { res => {
if (res.errMsg == 'chooseWXPay:ok') { if (res.errMsg == 'chooseWXPay:ok') {
this.paySuccess(); this.paySuccess();
this.repeatFlag = false;
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.errMsg title: res.errMsg
}); });
setTimeout(() => { setTimeout(() => {
this.close(); this.close();
this.repeatFlag = false;
}, 1500) }, 1500)
} }
}, },
@@ -304,20 +331,30 @@
title: '您已取消支付' title: '您已取消支付'
}); });
this.resetpay(); this.resetpay();
this.repeatFlag = false;
} }
); );
} }
}); });
} else { } else {
this.repeatFlag = false;
location.href = res.data.url; location.href = res.data.url;
this.checkPayStatus(); this.checkPayStatus();
} }
break; break;
case 'offlinepay':
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
outTradeNo: this.payInfo.out_trade_no
});
this.repeatFlag = false;
break;
} }
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.message title: res.message
}); });
this.repeatFlag = false;
} }
}, },
fail: res => { fail: res => {
@@ -325,6 +362,7 @@
this.$util.showToast({ this.$util.showToast({
title: 'request:fail' title: 'request:fail'
}); });
this.repeatFlag = false;
} }
}); });
}, },
@@ -365,8 +403,15 @@
if (res.code >= 0) { if (res.code >= 0) {
if (res.data.pay_success) { if (res.data.pay_success) {
this.paySuccess(); this.paySuccess();
this.repeatFlag = false;
return; return;
} }
if (payType.type=='offlinepay') {
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
outTradeNo: this.payInfo.out_trade_no
});
this.repeatFlag = false;
}else{
var payData = res.data.data; var payData = res.data.data;
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
@@ -380,6 +425,7 @@
paySign: payData.paySign, paySign: payData.paySign,
success: res => { success: res => {
this.paySuccess(); this.paySuccess();
this.repeatFlag = false;
}, },
fail: res => { fail: res => {
this.flag = false; this.flag = false;
@@ -388,6 +434,7 @@
title: '您已取消支付' title: '您已取消支付'
}); });
this.resetpay(); this.resetpay();
this.repeatFlag = false;
} else { } else {
uni.showModal({ uni.showModal({
content: '支付失败,失败原因: ' + res.errMsg, content: '支付失败,失败原因: ' + res.errMsg,
@@ -395,6 +442,7 @@
}); });
setTimeout(() => { setTimeout(() => {
this.close(); this.close();
this.repeatFlag = false;
}, 1500) }, 1500)
} }
} }
@@ -408,6 +456,7 @@
...payData, ...payData,
success: res => { success: res => {
this.paySuccess(); this.paySuccess();
this.repeatFlag = false;
}, },
fail: res => { fail: res => {
this.flag = false; this.flag = false;
@@ -416,6 +465,7 @@
title: '您已取消支付' title: '您已取消支付'
}); });
this.resetpay(); this.resetpay();
this.repeatFlag = false;
} else { } else {
uni.showModal({ uni.showModal({
content: '支付失败,失败原因: ' + res.errMsg, content: '支付失败,失败原因: ' + res.errMsg,
@@ -423,14 +473,17 @@
}); });
setTimeout(() => { setTimeout(() => {
this.close(); this.close();
this.repeatFlag = false;
}, 1500) }, 1500)
} }
} }
}); });
}
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: res.message title: res.message
}); });
this.repeatFlag = false;
} }
}, },
fail: res => { fail: res => {
@@ -438,6 +491,7 @@
this.$util.showToast({ this.$util.showToast({
title: 'request:fail' title: 'request:fail'
}); });
this.repeatFlag = false;
} }
}); });
}, },
@@ -463,13 +517,23 @@
* 重置支付单据 * 重置支付单据
*/ */
resetpay() { resetpay() {
this.resetPayComplete = false;
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/pay/resetpay', url: '/api/pay/resetpay',
data: { data: {
out_trade_no: this.payInfo.out_trade_no, out_trade_no: this.payInfo.out_trade_no,
}, },
success: res => { success: res => {
if (res.code == 0) this.getPayInfo(res.data); if (res.code == 0) {
this.getPayInfo(res.data, ()=>{
this.resetPayComplete = true;
});
}else{
this.resetPayComplete = true;
}
},
fail:res =>{
this.resetPayComplete = true;
} }
}) })
} }
@@ -569,7 +633,9 @@
.icon-weixin1 { .icon-weixin1 {
color: #24af41; color: #24af41;
} }
.icon-yuezhifu{
color: #f9a647;
}
.icon-zhifubaozhifu- { .icon-zhifubaozhifu- {
color: #00a0e9; color: #00a0e9;
} }

View File

@@ -124,15 +124,10 @@ export default {
setTimeout(() => { setTimeout(() => {
//消失 //消失
// #ifndef APP-NVUE // #ifndef APP-NVUE
this.animationData = uni this.animationData = uni.createAnimation({
.createAnimation({
duration: this.duration / 2, duration: this.duration / 2,
timingFunction: 'ease' timingFunction: 'ease'
}) }).top(this.top - this.radius * 2).opacity(0).step().export();
.top(this.top - this.radius * 2)
.opacity(0)
.step()
.export();
// #endif // #endif
@@ -155,15 +150,10 @@ export default {
// console.log('this.radius', this.radius); // console.log('this.radius', this.radius);
setTimeout(() => { setTimeout(() => {
this.animationData = uni this.animationData = uni.createAnimation({
.createAnimation({
duration: this.duration / 2, duration: this.duration / 2,
timingFunction: 'ease' timingFunction: 'ease'
}) }).top(this.top).opacity(0).step().export();
.top(this.top)
.opacity(0)
.step()
.export();
}, 2800); }, 2800);
}, },
closeTimer() { closeTimer() {

View File

@@ -1,7 +1,7 @@
<template> <template>
<view> <view>
<view @touchmove.prevent.stop class="reward-popup" v-if="reward"> <view @touchmove.prevent.stop class="reward-popup" v-if="reward">
<uni-popup ref="registerReward" type="center" :maskClick="false"> <uni-popup ref="registerRewardpopup" type="center" :maskClick="false">
<view class="reward-wrap"> <view class="reward-wrap">
<image :src="$util.img('public/uniapp/register_reward/register_reward_img.png')" mode="widthFix" class="bg-img-head"/> <image :src="$util.img('public/uniapp/register_reward/register_reward_img.png')" mode="widthFix" class="bg-img-head"/>
<image :src="$util.img('public/uniapp/register_reward/register_reward_money.png')" mode="widthFix" class="bg-img-money"/> <image :src="$util.img('public/uniapp/register_reward/register_reward_money.png')" mode="widthFix" class="bg-img-money"/>
@@ -89,10 +89,34 @@
data() { data() {
return { return {
reward: null, reward: null,
back: '' back: '',
path: '',
}; };
}, },
created() {}, created() {
let pages = getCurrentPages();
let currentPage = pages[pages.length - 1].route;
this.path = '/'+currentPage;
},
watch: {
'canReceiveRegistergift': {
handler(newValue, oldValue) {
if (newValue.status && newValue.status != oldValue.status && newValue.path.split('?')[0] == this.path) {
this.$store.commit('setCanReceiveRegistergiftInfo',{status:false,path:''});
// this.$nextTick(()=>{
this.open()
// })
}
},
deep: true
}
},
computed: {
canReceiveRegistergift() {
return this.$store.state.canReceiveRegistergiftInfo;
},
},
methods: { methods: {
open(back) { open(back) {
if (back) this.back = back; if (back) this.back = back;
@@ -103,7 +127,7 @@
} }
}, },
cancel() { cancel() {
this.$refs.registerReward.close(); this.$refs.registerRewardpopup.close();
}, },
/** /**
* 获取新人礼配置 * 获取新人礼配置
@@ -114,20 +138,27 @@
success: res => { success: res => {
if (res.code >= 0) { if (res.code >= 0) {
let data = res.data; let data = res.data;
if (data.is_use == 1 && (data.value.point > 0 || data.value.balance > 0 || data if (data.is_use == 1 && (data.value.point > 0 || data.value.balance > 0 || data.value.growth > 0 || data.value.coupon_list.length > 0)) {
.value.growth > 0 || data.value.coupon_list.length > 0)) {
this.reward = data.value; this.reward = data.value;
this.$forceUpdate()
this.$nextTick(()=>{ this.$nextTick(()=>{
if(this.$refs.registerReward) this.$refs.registerReward.open(); setTimeout(() => {
this.$refs.registerRewardpopup.open();
}); });
} })
}
} else {
this.closeRewardPopup(); this.closeRewardPopup();
} }
}else{
this.closeRewardPopup();
}
}
}); });
}, },
closeRewardPopup(type) { closeRewardPopup(type) {
if (this.$refs.registerReward) this.$refs.registerReward.close(); if (this.$refs.registerRewardpopup) this.$refs.registerRewardpopup.close();
if(!type) return;
switch (type) { switch (type) {
case 'point': case 'point':
this.$util.redirectTo('/pages_tool/member/point_detail', {}); this.$util.redirectTo('/pages_tool/member/point_detail', {});
@@ -142,8 +173,9 @@
this.$util.redirectTo('/pages_tool/member/coupon', {}); this.$util.redirectTo('/pages_tool/member/coupon', {});
break; break;
default: default:
if (this.back) this.$util.redirectTo(decodeURIComponent(this.back), {}, 'redirectTo'); this.$util.loginComplete('/pages/index/index','redirectTo');
else this.$util.redirectTo('/pages/index/index'); // if (this.back) this.$util.redirectTo(decodeURIComponent(this.back), {}, 'redirectTo');
// else this.$util.redirectTo('/pages/index/index');
break; break;
} }
} }

View File

@@ -67,11 +67,7 @@ export default {
this.$emit('change', e); this.$emit('change', e);
}, },
_getSize(fn) { _getSize(fn) {
uni.createSelectorQuery() uni.createSelectorQuery().in(this).select(`#${this.elId}`).boundingClientRect().exec(ret => {
.in(this)
.select(`#${this.elId}`)
.boundingClientRect()
.exec(ret => {
if (!ret[0]) { if (!ret[0]) {
setTimeout(this._getSize(fn)); setTimeout(this._getSize(fn));
return; return;

File diff suppressed because one or more lines are too long

View File

@@ -112,6 +112,7 @@
} }
this.inputValue = value / scale; this.inputValue = value / scale;
this.$emit('change', this.inputValue);
}, },
_getDecimalScale() { _getDecimalScale() {
let scale = 1; let scale = 1;
@@ -147,6 +148,7 @@
this.inputValue = value; this.inputValue = value;
this.$forceUpdate(); this.$forceUpdate();
this.$emit('change', value);
}, 0); }, 0);
} }
} }

View File

@@ -33,7 +33,6 @@
type: Boolean, type: Boolean,
default: false default: false
}, },
// maskClick
maskClick: { maskClick: {
type: Boolean, type: Boolean,
default: true default: true

View File

@@ -38,22 +38,22 @@ export default {
disabled: { disabled: {
// 是否为禁用状态 // 是否为禁用状态
type: [String, Boolean], type: [String, Boolean],
defalut: false default: false
}, },
inverted: { inverted: {
// 是否为空心 // 是否为空心
type: [String, Boolean], type: [String, Boolean],
defalut: false default: false
}, },
circle: { circle: {
// 是否为圆角样式 // 是否为圆角样式
type: [String, Boolean], type: [String, Boolean],
defalut: false default: false
}, },
mark: { mark: {
// 是否为标记样式 // 是否为标记样式
type: [String, Boolean], type: [String, Boolean],
defalut: false default: false
} }
}, },
methods: { methods: {

View File

@@ -0,0 +1,218 @@
<template>
<text
class="uv-count-num"
:style="textStyle"
>
{{ displayValue }}
</text>
</template>
<script>
export default {
name: 'uv-count-to',
props: {
startVal: {
type: [String, Number],
default: 0
},
endVal: {
type: [String, Number],
default: 0
},
duration: {
type: [String, Number],
default: 2000
},
autoplay: {
type: Boolean,
default: true
},
decimals: {
type: [String, Number],
default: 0
},
useEasing: {
type: Boolean,
default: true
},
decimal: {
type: [String, Number],
default: '.'
},
color: {
type: String,
default: '#606266'
},
fontSize: {
type: [String, Number],
default: 22
},
bold: {
type: Boolean,
default: false
},
separator: {
type: String,
default: ''
}
},
data() {
return {
localStartVal: this.startVal,
displayValue: this.formatNumber(this.startVal),
printVal: null,
paused: false,
localDuration: Number(this.duration),
startTime: null,
timestamp: null,
remaining: null,
rAF: null,
lastTime: 0
}
},
computed: {
countDown() {
return this.startVal > this.endVal
},
textStyle() {
return {
fontSize: this.fontSize + 'px',
fontWeight: this.bold ? 'bold' : 'normal',
color: this.color
}
}
},
watch: {
startVal() {
if (this.autoplay) {
this.start()
}
},
endVal() {
console.log(123)
if (this.autoplay) {
this.start()
}
}
},
mounted() {
if (this.autoplay) {
this.start()
}
},
methods: {
easingFn(t, b, c, d) {
return c * (1 - Math.pow(2, -10 * t / d)) * 1024 / 1023 + b
},
requestAnimationFrame(callback) {
const currTime = new Date().getTime()
const timeToCall = Math.max(0, 16 - (currTime - this.lastTime))
const id = setTimeout(() => {
callback(currTime + timeToCall)
}, timeToCall)
this.lastTime = currTime + timeToCall
return id
},
cancelAnimationFrame(id) {
clearTimeout(id)
},
start() {
this.localStartVal = this.startVal
this.startTime = null
this.localDuration = this.duration
this.paused = false
this.rAF = this.requestAnimationFrame(this.count)
},
restart() {
if (this.paused) {
this.resume()
this.paused = false
} else {
this.stop()
this.paused = true
}
},
stop() {
this.cancelAnimationFrame(this.rAF)
this.paused = true
},
resume() {
if (this.remaining) {
this.startTime = 0
this.localDuration = this.remaining
this.localStartVal = this.printVal
this.requestAnimationFrame(this.count)
}
},
reset() {
this.startTime = null
this.cancelAnimationFrame(this.rAF)
this.displayValue = this.formatNumber(this.startVal)
},
count(timestamp) {
if (!this.startTime) this.startTime = timestamp
this.timestamp = timestamp
const progress = timestamp - this.startTime
this.remaining = this.localDuration - progress
if (this.useEasing) {
if (this.countDown) {
this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration)
} else {
this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration)
}
} else {
if (this.countDown) {
this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration)
} else {
this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration)
}
}
if (this.countDown) {
this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal
} else {
this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal
}
this.displayValue = this.formatNumber(this.printVal) || 0
if (progress < this.localDuration) {
this.rAF = this.requestAnimationFrame(this.count)
} else {
this.$emit('end')
}
},
isNumber(val) {
return !isNaN(parseFloat(val))
},
formatNumber(num) {
num = Number(num)
num = num.toFixed(Number(this.decimals))
num += ''
const x = num.split('.')
let x1 = x[0]
const x2 = x.length > 1 ? this.decimal + x[1] : ''
const rgx = /(\d+)(\d{3})/
if (this.separator && !this.isNumber(this.separator)) {
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + this.separator + '$2')
}
}
return x1 + x2
}
},
destroyed() {
this.cancelAnimationFrame(this.rAF)
}
}
</script>
<style scoped>
.uv-count-num {
display: inline-flex;
text-align: center;
}
</style>

View File

@@ -9,6 +9,8 @@ export const lang = {
telephonePlaceholder: '收货人固定电话(选填)', telephonePlaceholder: '收货人固定电话(选填)',
receivingCity: '地区', receivingCity: '地区',
address: '详细地址', address: '详细地址',
house:'门牌号',
housePlaceholder:'请输入楼层门牌号',
addressPlaceholder: '小区、街道、写字楼', addressPlaceholder: '小区、街道、写字楼',
save: '保存' save: '保存'
} }

View File

@@ -1,7 +1,7 @@
export const lang = { export const lang = {
//title为每个页面的标题 //title为每个页面的标题
title: '会员中心', title: '会员中心',
login: '登录/注册', login: '立即登录',
loginTpis: '点击登录 享受更多精彩信息', loginTpis: '点击登录 享受更多精彩信息',
memberLevel: '会员等级', memberLevel: '会员等级',
moreAuthority: '更多权限', moreAuthority: '更多权限',

View File

@@ -9,5 +9,6 @@ export const lang = {
waitEvaluate: '待评价', waitEvaluate: '待评价',
waitUse: '待使用', waitUse: '待使用',
update: "释放刷新", update: "释放刷新",
updateIng: "加载中..." updateIng: "加载中...",
toLogin: "去登录"
} }

View File

@@ -38,12 +38,15 @@ Vue.mixin(globalConfig);
App.mpType = 'app'; App.mpType = 'app';
// 重写存储,增加前缀 // 重写存储,增加前缀
uniStorage(); Util.rewriteUniStorageMethod();
//常用组件 //常用组件
import loadingCover from '@/components/loading-cover/loading-cover.vue'; import loadingCover from '@/components/loading-cover/loading-cover.vue';
Vue.component('loading-cover', loadingCover); Vue.component('loading-cover', loadingCover);
import nsMpHtml from '@/components/ns-mp-html/ns-mp-html.vue';
Vue.component('ns-mp-html', nsMpHtml);
import nsEmpty from '@/components/ns-empty/ns-empty.vue'; import nsEmpty from '@/components/ns-empty/ns-empty.vue';
Vue.component('ns-empty', nsEmpty); Vue.component('ns-empty', nsEmpty);

View File

@@ -58,12 +58,14 @@
"quickapp" : {}, "quickapp" : {},
/* */ /* */
"mp-weixin" : { "mp-weixin" : {
"appid" : "wxa8f94045d9c2fc10", "appid" : "wx29215aa1bd97bbd6",
"setting" : { "setting" : {
"urlCheck" : false, "urlCheck" : false,
"postcss" : false, "postcss" : false,
"es6" : true, "es6" : true,
"minified" : true "minified" : true,
"codeSigning" : true,
"uglifyFileName" : true
}, },
"usingComponents" : true, "usingComponents" : true,
"permission" : { "permission" : {
@@ -108,7 +110,7 @@
}, },
"optimization" : { "optimization" : {
"treeShaking" : { "treeShaking" : {
"enable" : false "enable" : true
} }
}, },
"domain" : " ", "domain" : " ",

View File

@@ -3,7 +3,7 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
// "navigationStyle": "custom", "navigationStyle": "custom",
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
}, },
@@ -28,15 +28,17 @@
"path": "pages/goods/category", "path": "pages/goods/category",
"style": { "style": {
"disableScroll": true, "disableScroll": true,
"navigationStyle": "custom",
"navigationBarTitleText": "商品分类", "navigationBarTitleText": "商品分类",
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
}, },
// 商品详情 // 商品详情、限时折扣、预售
{ {
"path": "pages/goods/detail", "path": "pages/goods/detail",
"style": { "style": {
"navigationStyle": "custom",
"navigationBarTitleText": "商品详情" "navigationBarTitleText": "商品详情"
} }
}, },
@@ -54,6 +56,7 @@
{ {
"path": "pages/member/index", "path": "pages/member/index",
"style": { "style": {
"navigationStyle": "custom",
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
}, },
@@ -112,6 +115,55 @@
//******************营销活动模块26****************** //******************营销活动模块26******************
"root": "pages_promotion", "root": "pages_promotion",
"pages": [ "pages": [
//----------组合套餐模块2----------
{
"path": "bundling/detail",
"style": {
// #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
{
"path": "bundling/payment",
"style": {
// #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
//----------砍价模块5----------
{
"path": "bargain/list",
"style": {
// #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
{
"path": "bargain/detail",
"style": {
// #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
{
"path": "bargain/my_bargain",
"style": {
// #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
{
"path": "bargain/payment",
"style": {
"navigationStyle": "custom"
}
},
//----------积分模块2---------- //----------积分模块2----------
{ {
@@ -710,11 +762,21 @@
// #endif // #endif
} }
}, },
//******************聊天4******************
{
"path": "chat/room",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"softinputMode": "adjustResize"
}
},
//******************支付模块2****************** //******************支付模块2******************
{ {
"path": "pay/index", "path": "pay/index",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -722,7 +784,7 @@
{ {
"path": "pay/wx_pay", "path": "pay/wx_pay",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -730,7 +792,7 @@
{ {
"path": "pay/result", "path": "pay/result",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -738,7 +800,15 @@
{ {
"path": "pay/cashier", "path": "pay/cashier",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom"
// #endif
}
},
{
"path": "pay/offlinepay",
"style": {
// #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -746,7 +816,7 @@
{ {
"path": "storeclose/storeclose", "path": "storeclose/storeclose",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -755,7 +825,7 @@
{ {
"path": "order/logistics", "path": "order/logistics",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -763,7 +833,7 @@
{ {
"path": "order/evaluate", "path": "order/evaluate",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -771,7 +841,7 @@
{ {
"path": "order/refund", "path": "order/refund",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -779,7 +849,7 @@
{ {
"path": "order/refund_goods_select", "path": "order/refund_goods_select",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -787,7 +857,7 @@
{ {
"path": "order/refund_type_select", "path": "order/refund_type_select",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -795,7 +865,7 @@
{ {
"path": "order/refund_batch", "path": "order/refund_batch",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -803,7 +873,7 @@
{ {
"path": "order/refund_detail", "path": "order/refund_detail",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
@@ -811,38 +881,130 @@
{ {
"path": "order/activist", "path": "order/activist",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom", "navigationStyle": "custom",
// #endif // #endif
"navigationBarTitleText": "退款" "navigationBarTitleText": "退款"
} }
}, },
{
"path": "order/detail_virtual",
"style": {
// #ifdef APP-PLUS
"navigationStyle": "custom"
// #endif
}
},
//******************登录模块3****************** //******************登录模块3******************
{ {
"path": "login/login", "path": "login/index",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom", "navigationStyle": "custom",
// #endif // #endif
"navigationBarTitleText": "登录" "navigationBarTitleText": "登录"
} }
}, },
{
"path": "login/aggrement",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "协议"
}
},
{
"path": "login/login",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "登录"
}
},
{
"path": "login/register",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "注册"
}
},
{ {
"path": "form/form", "path": "form/form",
"style": { "style": {
// #ifdef APP-PLUS // #ifdef H5
"navigationStyle": "custom" "navigationStyle": "custom"
// #endif // #endif
} }
}, },
{
"path": "store/list",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "门店列表"
}
},
{
"path": "store/detail",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "门店详情"
}
},
{
"path": "store/store_payment",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "门店付款"
}
},
{
"path": "store/payment_qrcode",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "付款码"
}
},
//******************核销模块4******************
{
"path": "verification/index",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "核销台"
}
},
{
"path": "verification/list",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "核销列表"
}
},
{
"path": "verification/detail",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "核销详情"
}
},
{
"path": "weapp/order_shipping",
"style": {
// #ifdef H5
"navigationStyle": "custom",
// #endif
"navigationBarTitleText": "小程序发货"
}
},
//******************AI客服****************** //******************AI客服******************
{ {
"path": "ai-chat/index", "path": "ai-chat/index",
@@ -879,7 +1041,7 @@
"text": "" "text": ""
}, },
{ {
"pagePath": "pages/contact/contact", "pagePath": "pages/goods/cart",
"text": "" "text": ""
}, },
{ {

View File

@@ -14,13 +14,13 @@
<view class="dite-button" @click="officialAccountsOpen">关注公众号</view> <view class="dite-button" @click="officialAccountsOpen">关注公众号</view>
</view> </view>
<!-- <view class="page-header" v-if="diyData.global && diyData.global.navBarSwitch" :style="{ backgroundImage: bgImg }"> <view class="page-header" v-if="diyData.global && diyData.global.navBarSwitch" :style="{ backgroundImage: bgImg }">
<ns-navbar :title-color="textNavColor" :data="diyData.global" :scrollTop="scrollTop" :isBack="false"/> <ns-navbar :title-color="textNavColor" :data="diyData.global" :scrollTop="scrollTop" :isBack="false"/>
</view> --> </view>
<diy-index-page v-if="topIndexValue" ref="indexPage" :value="topIndexValue" :bgUrl="bgUrl" :scrollTop="scrollTop" :diyGlobal="diyData.global" class="diy-index-page"> <diy-index-page v-if="topIndexValue" ref="indexPage" :value="topIndexValue" :bgUrl="bgUrl" :scrollTop="scrollTop" :diyGlobal="diyData.global" class="diy-index-page">
<template v-slot:components> <template v-slot:components>
<diy-group ref="diyGroup" v-if="diyData.value" :diyData="diyData" :scrollTop="scrollTop" :haveTopCategory="true" :followOfficialAccount="followOfficialAccount"/> <diy-group ref="diyGroup" v-if="diyData.value" :refresh="refresh" :diyData="diyData" :scrollTop="scrollTop" :haveTopCategory="true" :followOfficialAccount="followOfficialAccount"/>
</template> </template>
<template v-slot:default> <template v-slot:default>
<ns-copyright v-show="isShowCopyRight"/> <ns-copyright v-show="isShowCopyRight"/>
@@ -94,26 +94,27 @@
<!-- 选择门店弹出框定位当前位置展示最近的一个门店 --> <!-- 选择门店弹出框定位当前位置展示最近的一个门店 -->
<view @touchmove.prevent.stop class="choose-store"> <view @touchmove.prevent.stop class="choose-store">
<uni-popup ref="chooseStorePopup" type="center" :maskClick="false" class="choose-store"> <uni-popup ref="chooseStorePopup" type="center" :maskClick="false" class="choose-store">
<view class="choose-store-popup"> <view class="choose-store-popup" v-if="currentStore">
<view class="head-wrap" @click="closeChooseStorePopup">请确认门店</view> <view class="head-wrap">请确认门店</view>
<view class="position-wrap"> <view class="position-wrap">
<text class="iconfont icon-dizhi"></text> <text class="iconfont icon-dizhi"></text>
<text class="address">{{ currentPosition }}</text> <text class="address">{{ currentPosition || currentStore.show_address }}</text>
<view class="reposition" @click="reposition" v-if="globalStoreConfig && globalStoreConfig.is_allow_change == 1"> <view class="reposition" @click="reGetLocation" v-if="globalStoreConfig && globalStoreConfig.is_allow_change == 1">
<text class="iconfont icon-dingwei"></text> <text class="iconfont icon-dingwei"></text>
<text>重新定位</text> <text>重新定位</text>
</view> </view>
</view> </view>
<view class="store-wrap" v-if="nearestStore"> <view class="store-wrap" v-if="currentStore">
<text class="tag">当前门店</text> <text class="tag">当前门店</text>
<view class="store-name">{{ nearestStore.store_name }}</view> <view class="store-name">{{ currentStore.store_name }}</view>
<view class="address">{{ nearestStore.show_address }}</view> <view class="store-close-desc" v-if="currentStore.status == 0 && currentStore.close_desc">{{ currentStore.close_desc }}</view>
<view class="distance" v-if="nearestStore.distance"> <view class="address">{{ currentStore.show_address }}</view>
<view class="distance" v-if="currentStore.distance">
<text class="iconfont icon-dizhi"></text> <text class="iconfont icon-dizhi"></text>
<text>{{ nearestStore.distance > 1 ? nearestStore.distance + 'km' : nearestStore.distance * 1000 + 'm' }}</text> <text>{{ currentStore.distance > 1 ? currentStore.distance + 'km' : currentStore.distance * 1000 + 'm' }}</text>
</view> </view>
</view> </view>
<button type="primary" @click="enterStore">确认进入</button> <button type="primary" @click="closeChooseStorePopup">确认进入</button>
<view class="other-store" @click="chooseOtherStore" v-if="globalStoreConfig && globalStoreConfig.is_allow_change == 1"> <view class="other-store" @click="chooseOtherStore" v-if="globalStoreConfig && globalStoreConfig.is_allow_change == 1">
<text>选择其他门店</text> <text>选择其他门店</text>
<text class="iconfont icon-right"></text> <text class="iconfont icon-right"></text>
@@ -121,7 +122,29 @@
</view> </view>
</uni-popup> </uni-popup>
</view> </view>
<hover-nav></hover-nav> <!-- 连锁门店未开启定位或定位失败弹框 -->
<view @touchmove.prevent.stop class="chain-stores">
<uni-popup ref="getLocationFailRef" type="bottom" :maskClick="false" class="choose-store">
<view class="chain-store-popup">
<view class="title">获取位置失败</view>
<view class="body">
<view class="center">
<view class="image">
<image width="341rpx" :src="$util.img('public/uniapp/index/no_location_tips.png')" mode="aspectFit"/>
</view>
<view class="text-top">系统暂时定位不到您的位置</view>
<view class="text-bottom" v-if="mapConfig.wap_is_open == 1">请确认定位服务已经打开或者您可手动选择附近的门店以便我们提供更精确的服务</view>
<view class="text-bottom" v-else>请手动选择附近的门店以便我们提供更精确的服务</view>
<view class="footer">
<button :type="mapConfig.wap_is_open == 1?'default':'primary'" @click="chooseStore">选择门店</button>
<button v-if="mapConfig.wap_is_open == 1" type="primary" class="btn-right" @click="openSetting">开启定位</button>
</view>
</view>
</view>
</view>
</uni-popup>
</view>
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<!-- 小程序隐私协议 --> <!-- 小程序隐私协议 -->
<privacy-popup ref="privacyPopup"></privacy-popup> <privacy-popup ref="privacyPopup"></privacy-popup>
@@ -251,6 +274,14 @@
max-height: unset !important; max-height: unset !important;
} }
/deep/ .chain-stores .uni-popup__mask{
backdrop-filter: blur(10rpx);
}
/deep/ .chain-stores .uni-popup__wrapper.uni-custom.bottom .uni-popup__wrapper-box, .uni-popup__wrapper.uni-custom.top .uni-popup__wrapper-box{
max-height: 100vh !important;
}
/deep/ .mescroll-totop { /deep/ .mescroll-totop {
right: 24rpx!important; right: 24rpx!important;
bottom: 182rpx!important; bottom: 182rpx!important;

View File

@@ -3,7 +3,8 @@ export default {
return { return {
minScrollTop: 100, // 设置回到顶端按钮显示要求,最小页面滚动距离 minScrollTop: 100, // 设置回到顶端按钮显示要求,最小页面滚动距离
wechatQrcode: '', // 公众号二维码 wechatQrcode: '', // 公众号二维码
diyRoute: '/pages/index/index' diyRoute: '/pages/index/index',
refresh:false,
}; };
}, },
onLoad(option) { onLoad(option) {
@@ -41,6 +42,9 @@ export default {
if (this.unsubscribe) this.unsubscribe(); if (this.unsubscribe) this.unsubscribe();
}, },
methods: { methods: {
changeCategoryNav(e){
if(e == 0) this.refresh = !this.refresh;
},
// 关注公众号 // 关注公众号
getFollowQrcode() { getFollowQrcode() {
if (!this.$util.isWeiXin()) return; if (!this.$util.isWeiXin()) return;

View File

@@ -2,7 +2,7 @@
<page-meta :page-style="themeColor"></page-meta> <page-meta :page-style="themeColor"></page-meta>
<view :style="{ backgroundColor: bgColor, minHeight: openBottomNav ? 'calc(100vh - 55px)' : '' }" class="page-img"> <view :style="{ backgroundColor: bgColor, minHeight: openBottomNav ? 'calc(100vh - 55px)' : '' }" class="page-img">
<view class="page-header" v-if="diyData.global && diyData.global.navBarSwitch" :style="{ backgroundImage: bgImg }"> <view class="page-header" v-if="diyData.global && diyData.global.navBarSwitch" :style="{ backgroundImage: bgImg }">
<ns-navbar :title-color="textNavColor" :data="diyData.global" :scrollTop="scrollTop" :isBack="true"/> <ns-navbar :title-color="textNavColor" :data="diyData.global" :scrollTop="scrollTop" :isBack="false"/>
</view> </view>
<diy-index-page v-if="topIndexValue" ref="indexPage" :value="topIndexValue" :bgUrl="bgUrl" :scrollTop="scrollTop" :diyGlobal="diyData.global" class="diy-index-page"> <diy-index-page v-if="topIndexValue" ref="indexPage" :value="topIndexValue" :bgUrl="bgUrl" :scrollTop="scrollTop" :diyGlobal="diyData.global" class="diy-index-page">

View File

@@ -9,15 +9,11 @@ export default {
storeToken: function(nVal, oVal) { storeToken: function(nVal, oVal) {
if (nVal) { if (nVal) {
this.initData(); this.initData();
if (uni.getStorageSync('source_member')) this.$util.onSourceMember(uni.getStorageSync( if (uni.getStorageSync('source_member')) this.$util.onSourceMember(uni.getStorageSync('source_member'));
'source_member'));
} }
} }
}, },
onLoad(data) { onLoad(data) {
//刷新多语言
this.$langConfig.refresh();
uni.hideTabBar(); uni.hideTabBar();
this.name = 'DIY_VIEW_MEMBER_INDEX'; this.name = 'DIY_VIEW_MEMBER_INDEX';
if (data.code) { if (data.code) {
@@ -29,15 +25,13 @@ export default {
success: res => { success: res => {
if (res.code >= 0) { if (res.code >= 0) {
if (res.data.userinfo.nickName) this.modifyNickname(res.data.userinfo.nickName); if (res.data.userinfo.nickName) this.modifyNickname(res.data.userinfo.nickName);
if (res.data.userinfo.avatarUrl) this.modifyHeadimg(res.data.userinfo if (res.data.userinfo.avatarUrl) this.modifyHeadimg(res.data.userinfo.avatarUrl);
.avatarUrl);
} }
} }
}); });
} }
}, },
onShow() { onShow() {
// 刷新会员数据 // 刷新会员数据
if (this.$refs.diyGroup) { if (this.$refs.diyGroup) {
if (this.$refs.diyGroup.$refs.diyMemberIndex) this.$refs.diyGroup.$refs.diyMemberIndex[0].init(); if (this.$refs.diyGroup.$refs.diyMemberIndex) this.$refs.diyGroup.$refs.diyMemberIndex[0].init();
@@ -51,8 +45,16 @@ export default {
initData() { initData() {
if (this.storeToken) { if (this.storeToken) {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.nsNewGift.init(); let callback = () => {
this.$refs.birthdayGift.init(); // 刷新会员数据
if (this.$refs.diyGroup) {
if (this.$refs.diyGroup.$refs.diyMemberIndex) {
this.$refs.diyGroup.$refs.diyMemberIndex[0].init();
}
}
}
this.$refs.nsNewGift.init(callback);
this.$refs.birthdayGift.init(callback);
}); });
} }
}, },

View File

@@ -11,12 +11,12 @@
<text v-if="orderData.promotion_status_name">{{ orderData.promotion_status_name }}</text> <text v-if="orderData.promotion_status_name">{{ orderData.promotion_status_name }}</text>
</view> </view>
<view class="desc" v-if="orderData.promotion_type == 'presale' && orderData.order_status == 1"> <view class="desc" v-if="orderData.promotion_type == 'presale' && orderData.order_status == 1">
预计{{ $util.timeStampTurnTime(orderData.predict_delivery_time, true) }}日后发货 预计{{ $util.timeStampTurnTime(orderData.predict_delivery_time, 'Y-m-d') }}发货
</view> </view>
<view class="desc" v-if="orderData.close_cause">订单关闭原因{{ orderData.close_cause }}</view> <view class="desc" v-if="orderData.close_cause">订单关闭原因{{ orderData.close_cause }}</view>
</view> </view>
</view> </view>
<view class="order-time" v-if="orderData.order_status == 0" id="action-date"> <view class="order-time" v-if="orderData.order_status == 0 && orderData.pay_type != 'offlinepay'" id="action-date">
剩余时间 剩余时间
<uni-count-down :day="orderData.closeTimeMachine.d" :hour="orderData.closeTimeMachine.h" <uni-count-down :day="orderData.closeTimeMachine.d" :hour="orderData.closeTimeMachine.h"
:minute="orderData.closeTimeMachine.i" :second="orderData.closeTimeMachine.s" color="#fff" :minute="orderData.closeTimeMachine.i" :second="orderData.closeTimeMachine.s" color="#fff"
@@ -42,7 +42,7 @@
<view class="font-size-base">送达时间</view> <view class="font-size-base">送达时间</view>
<view class="last-child">{{ orderData.buyer_ask_delivery_time }}</view> <view class="last-child">{{ orderData.buyer_ask_delivery_time }}</view>
</view> </view>
<block v-if="orderData.package_list"> <block v-if="orderData.package_list.deliverer">
<view class="pick-block"> <view class="pick-block">
<view>配送员</view> <view>配送员</view>
<view class="last-child">{{ orderData.package_list.deliverer }}</view> <view class="last-child">{{ orderData.package_list.deliverer }}</view>
@@ -133,6 +133,10 @@
{{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }}
</block> </block>
</view> </view>
<view class="goods-num">
<text class="iconfont icon-close"></text>
<text>{{ goodsItem.num }}</text>
</view>
</view> </view>
<view class="goods-sub-section"> <view class="goods-sub-section">
<view> <view>
@@ -142,11 +146,9 @@
<text class="unit price-style small">.{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }}</text> <text class="unit price-style small">.{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }}</text>
</text> </text>
</view> </view>
<view> <view v-if="orderData.order_type == 1 && orderData.order_status == 1 && goodsItem.delivery_status == 1"
<text class="font-size-base"> class="delivery-status color-base-text">
<text class="iconfont icon-close"></text> {{goodsItem.delivery_status_name}}
{{ goodsItem.num }}
</text>
</view> </view>
</view> </view>
<view v-if="goodsItem.card_item_id" class="goods-card"> <view v-if="goodsItem.card_item_id" class="goods-card">
@@ -176,15 +178,11 @@
</view> </view>
<view class="goods-action"> <view class="goods-action">
<block v-if="orderData.is_enable_refund"> <view class="order-box-btn" @click="goRefund(goodsItem.order_goods_id)" v-if="orderData.is_enable_refund && orderData.order_scene == 'online' && goodsItem.refund_status == 0 && orderData.promotion_type != 'blindbox'">
<view @click="goRefund(goodsItem.order_goods_id)" v-if="orderData.order_scene == 'online' && (goodsItem.refund_status == 0 || goodsItem.refund_status == -1)">
<view class="order-box-btn" v-if="orderData.promotion_type != 'blindbox'">
{{ orderData.order_status == 10 ? '申请售后' : '申请退款' }} {{ orderData.order_status == 10 ? '申请售后' : '申请退款' }}
</view> </view>
</view> <view class="order-box-btn" @click="goRefundDetail(goodsItem.order_goods_id)" v-if="goodsItem.refund_status != 0">
</block> {{ goodsItem.refund_status_name }}
<view @click="goRefundDetail(goodsItem.order_goods_id)" v-if="goodsItem.refund_status != 0 && goodsItem.refund_status != -1">
<view class="order-box-btn">{{ orderData.order_status == 10 ? '查看售后' : '查看退款' }}</view>
</view> </view>
</view> </view>
</view> </view>
@@ -319,15 +317,36 @@
<view class="box"><text class="color-base-text" @click="$util.redirectTo('/pages_promotion/cardservice/card/my_card')">查看</text></view> <view class="box"><text class="color-base-text" @click="$util.redirectTo('/pages_promotion/cardservice/card/my_card')">查看</text></view>
</view> </view>
</block> </block>
<block v-if="orderData.pay_type=='offlinepay' && orderData.offline_pay_info">
<view class="hr"></view>
<view class="order-cell">
<text class="tit">支付方式</text>
<view class="box">
<text class="color-title">线下支付</text>
</view>
</view>
<view class="order-cell">
<text class="tit">支付状态</text>
<view class="box">
<text class="color-title">{{orderData.offline_pay_info.status_info.name}}</text>
</view>
</view>
<view class="order-cell remark" v-if="orderData.offline_pay_info.status_info.const=='AUDIT_REFUSE'">
<text class="tit">审核备注</text>
<view class="box">
<text class="color-title">{{orderData.offline_pay_info.audit_remark}}</text>
</view>
</view>
</block>
<!-- 联系客服 --> <!-- 联系客服 -->
<!-- <ns-contact :niushop="{ order_id: orderData.order_id }"> <ns-contact :niushop="{ order_id: orderData.order_id }">
<view class="kefu"> <view class="kefu">
<view> <view>
<text class="iconfont icon-ziyuan"></text> <text class="iconfont icon-ziyuan"></text>
<text>联系客服</text> <text>联系客服</text>
</view> </view>
</view> </view>
</ns-contact> --> </ns-contact>
</view> </view>
<block v-if="orderData.virtual_goods && orderData.goods_class == 2 && orderData.virtual_goods.is_veirfy == 0"> <block v-if="orderData.virtual_goods && orderData.goods_class == 2 && orderData.virtual_goods.is_veirfy == 0">
@@ -598,8 +617,7 @@
</view> </view>
<!-- 订单 --> <!-- 订单 -->
<view class="fixed-bottom-box bottom-safe-area" v-if="orderData.action.length > 0 || (orderData.is_evaluate == 1 && evaluateConfig.evaluate_status == 1)"> <view class="fixed-bottom-box bottom-safe-area" v-if="orderData.action.length > 0 || (orderData.is_evaluate == 1 && evaluateConfig.evaluate_status == 1)"></view>
</view>
<ns-goods-recommend ref="goodrecommend" route="order_detail"></ns-goods-recommend> <ns-goods-recommend ref="goodrecommend" route="order_detail"></ns-goods-recommend>
<!-- 选择支付方式弹窗 --> <!-- 选择支付方式弹窗 -->
@@ -646,6 +664,12 @@
if (option.order_id) this.orderId = option.order_id; if (option.order_id) this.orderId = option.order_id;
if (option.merchant_trade_no) this.merchantTradeNo = option.merchant_trade_no; if (option.merchant_trade_no) this.merchantTradeNo = option.merchant_trade_no;
}, },
onPullDownRefresh() {
this.getOrderData();
setTimeout(function () {
uni.stopPullDownRefresh();
}, 50);
},
onShow() { onShow() {
this.isIphoneX = this.$util.uniappIsIPhoneX(); this.isIphoneX = this.$util.uniappIsIPhoneX();
@@ -657,6 +681,7 @@
back: '/pages/order/detail?order_id=' + this.orderId + '&merchant_trade_no=' + this.merchantTradeNo back: '/pages/order/detail?order_id=' + this.orderId + '&merchant_trade_no=' + this.merchantTradeNo
}); });
} }
if(this.$refs.choosePaymentPopup) this.$refs.choosePaymentPopup.pageShow()
}, },
methods: { methods: {
goDetail(e) { goDetail(e) {
@@ -733,11 +758,20 @@
/** /**
* 下拉刷新 * 下拉刷新
*/ */
onPullDownRefresh() {
this.getOrderData();
},
operation(action) { operation(action) {
switch (action) { switch (action) {
case 'orderDelete':
this.orderDelete(this.orderData.order_id, () => {
setTimeout(()=>{
if (getCurrentPages().length == 1) {
this.$util.redirectTo('/pages/member/index')
} else {
uni.navigateBack();
}
},500)
});
break;
case 'orderPay': // 支付 case 'orderPay': // 支付
this.orderPay(this.orderData); this.orderPay(this.orderData);
break; break;
@@ -772,6 +806,11 @@
this.getOrderData(); this.getOrderData();
}); });
break; break;
case 'orderOfflinePay':
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
outTradeNo: this.orderData.out_trade_no
});
break;
} }
}, },
imageError(index) { imageError(index) {

View File

@@ -80,14 +80,14 @@
</view> </view>
</view> </view>
<!-- 联系客服 --> <!-- 联系客服 -->
<!-- <ns-contact :niushop="{ order_id: orderData.order_id }"> <ns-contact :niushop="{ order_id: orderData.order_id }">
<view class="kefu"> <view class="kefu">
<view> <view>
<text class="iconfont icon-ziyuan"></text> <text class="iconfont icon-ziyuan"></text>
<text>联系客服</text> <text>联系客服</text>
</view> </view>
</view> </view>
</ns-contact> --> </ns-contact>
</view> </view>
<!-- 订单金额 --> <!-- 订单金额 -->
@@ -127,8 +127,7 @@
<ns-goods-recommend ref="goodrecommend" route="order_detail"></ns-goods-recommend> <ns-goods-recommend ref="goodrecommend" route="order_detail"></ns-goods-recommend>
<!-- 选择支付方式弹窗 --> <!-- 选择支付方式弹窗 -->
<ns-payment ref="choosePaymentPopup" :payMoney="orderData.order_money" <ns-payment ref="choosePaymentPopup" :payMoney="orderData.order_money" @confirm="orderPay(orderData)"></ns-payment>
@confirm="orderPay(orderData)"></ns-payment>
<loading-cover ref="loadingCover"></loading-cover> <loading-cover ref="loadingCover"></loading-cover>
</view> </view>
</template> </template>

View File

@@ -1,7 +1,7 @@
<template> <template>
<page-meta :page-style="themeColor"></page-meta> <page-meta :page-style="themeColor"></page-meta>
<view class="order-container"> <view class="order-container">
<view class="cate-search"> <view class="cate-search" v-if="storeToken">
<view class="search-box"> <view class="search-box">
<input class="uni-input" maxlength="50" v-model="searchText" confirm-type="search" placeholder="请输入商品名称/订单编号" @confirm="search()" /> <input class="uni-input" maxlength="50" v-model="searchText" confirm-type="search" placeholder="请输入商品名称/订单编号" @confirm="search()" />
<text class="iconfont icon-sousuo3" @click="search()"></text> <text class="iconfont icon-sousuo3" @click="search()"></text>
@@ -95,7 +95,7 @@
</view> </view>
</view> </view>
<view class="order-action" v-if="orderItem.action.length > 0"> <view class="order-action" v-if="orderItem.action.length > 0">
<view class="order-time" v-if="orderItem.order_status == 0" id="action-date"> <view class="order-time" v-if="orderItem.order_status == 0 && orderItem.pay_type !== 'offlinepay'" id="action-date">
<image :src="$util.img('public/uniapp/order/time.png')"></image> <image :src="$util.img('public/uniapp/order/time.png')"></image>
剩余时间 剩余时间
<uni-count-down :day="orderItem.discountTimeMachine.d" <uni-count-down :day="orderItem.discountTimeMachine.d"
@@ -132,14 +132,15 @@
<view v-else><ns-empty :isIndex="false" :text="$lang('emptyTips')"></ns-empty></view> <view v-else><ns-empty :isIndex="false" :text="$lang('emptyTips')"></ns-empty></view>
</block> </block>
</mescroll-uni> </mescroll-uni>
<view v-if="!storeToken" class="no-login">
<view><ns-empty :isIndex="false" :text="$lang('emptyTips')"></ns-empty></view>
<button type="primary" size="mini" class="button mini" @click="toLogin">去登录</button>
</view>
<!-- <view class="order-batch-action" :class="{ 'bottom-safe-area': isIphoneX }" v-if="mergePayOrder.length">
<view class="action-btn color-base-text color-base-border" @click="mergePay()">合并付款</view>
</view> -->
<!-- 选择支付方式弹窗 --> <!-- 选择支付方式弹窗 -->
<ns-payment ref="choosePaymentPopup"></ns-payment> <payment ref="choosePaymentPopup"></payment>
<ns-payment ref="choosePaymentMergePopup"></ns-payment>
<ns-login ref="login"></ns-login> <ns-login ref="login"></ns-login>
<loading-cover ref="loadingCover"></loading-cover> <loading-cover ref="loadingCover"></loading-cover>
@@ -148,7 +149,7 @@
<script> <script>
import orderMethod from './public/js/orderMethod.js'; import orderMethod from './public/js/orderMethod.js';
import nsPayment from '@/components/payment/payment.vue'; import payment from '@/components/payment/payment.vue';
export default { export default {
data() { data() {
@@ -176,7 +177,7 @@
}; };
}, },
components: { components: {
nsPayment payment
}, },
mixins: [orderMethod], mixins: [orderMethod],
onLoad(option) { onLoad(option) {
@@ -192,14 +193,19 @@
if (this.$refs.mescroll) this.$refs.mescroll.refresh(); if (this.$refs.mescroll) this.$refs.mescroll.refresh();
} else { } else {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.login.open('/pages/order/list?status=' + this.orderStatus); if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
// this.$refs.login.open('/pages/order/list?status=' + this.orderStatus);
}) })
} }
if(this.$refs.choosePaymentPopup) this.$refs.choosePaymentPopup.pageShow()
}, },
onUnload() { onUnload() {
if (!this.storeToken && this.$refs.login) this.$refs.login.cancelCompleteInfo(); if (!this.storeToken && this.$refs.login) this.$refs.login.cancelCompleteInfo();
}, },
methods: { methods: {
toLogin() {
this.$refs.login.open();
},
ontabtap(e) { ontabtap(e) {
let index = e.target.dataset.current || e.currentTarget.dataset.current; let index = e.target.dataset.current || e.currentTarget.dataset.current;
this.orderStatus = this.statusList[index].status; this.orderStatus = this.statusList[index].status;
@@ -268,39 +274,39 @@
getOrderStatus() { getOrderStatus() {
this.statusList = [{ this.statusList = [{
status: 'all', status: 'all',
name:'全部', name: this.$lang('all'),
id: 'status_0' id: 'status_0'
}, },
{ {
status: 'waitpay', status: 'waitpay',
name: '待付款', name: this.$lang('waitPay'),
id: 'status_1' id: 'status_1'
}, },
{ {
status: 'waitsend', status: 'waitsend',
name: '待发货', name: this.$lang('readyDelivery'),
id: 'status_2' id: 'status_2'
}, },
{ {
status: 'waitconfirm', status: 'waitconfirm',
name: '待收货', name: this.$lang('waitDelivery'),
id: 'status_3' id: 'status_3'
}, },
{ {
status: 'waitrate',
name: '已完成',
id: 'status_4'
},
/*{
status: 'wait_use', status: 'wait_use',
name: '待使用', name: this.$lang('waitUse'),
id: 'status_4' id: 'status_4'
}*/ }
]; ];
}, },
operation(action, orderData) { operation(action, orderData) {
let index = this.status; let index = this.status;
switch (action) { switch (action) {
case 'orderDelete':
this.orderDelete(orderData.order_id, () => {
this.$refs.mescroll.refresh();
});
break;
case 'orderPay': // 支付 case 'orderPay': // 支付
this.orderData = orderData; this.orderData = orderData;
this.payMoney = parseFloat(orderData.pay_money); this.payMoney = parseFloat(orderData.pay_money);
@@ -339,34 +345,18 @@
this.$refs.mescroll.refresh(); this.$refs.mescroll.refresh();
}); });
break; break;
case 'orderOfflinePay':
this.orderData = orderData;
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
outTradeNo: this.orderData.out_trade_no
});
break;
} }
}, },
orderDetail(data) { orderDetail(data) {
switch (parseInt(data.order_type)) {
case 2:
// 自提订单
this.$util.redirectTo('/pages/order/detail_pickup', {
order_id: data.order_id
});
break;
case 3:
// 本地配送订单
this.$util.redirectTo('/pages/order/detail_local_delivery', {
order_id: data.order_id
});
break;
case 4:
// 虚拟订单
this.$util.redirectTo('/pages_tool/order/detail_virtual', {
order_id: data.order_id
});
break;
default:
this.$util.redirectTo('/pages/order/detail', { this.$util.redirectTo('/pages/order/detail', {
order_id: data.order_id order_id: data.order_id
}); });
break;
}
}, },
/** /**
* 选择订单 * 选择订单
@@ -381,28 +371,6 @@
this.mergePayOrder.push(orderId); this.mergePayOrder.push(orderId);
} }
}, },
/**
* 合并支付
*/
mergePay() {
if (this.mergePayOrder.length) {
this.$api.sendRequest({
url: '/api/order/pay',
data: {
order_ids: this.mergePayOrder.toString()
},
success: res => {
if (res.code >= 0) {
this.$refs.choosePaymentMergePopup.getPayInfo(res.data);
} else {
this.$util.showToast({
title: res.message
});
}
}
});
}
},
imageError(orderIndex, goodsIndex) { imageError(orderIndex, goodsIndex) {
this.orderList[orderIndex].order_goods[goodsIndex].sku_image = this.$util.getDefaultImage().goods; this.orderList[orderIndex].order_goods[goodsIndex].sku_image = this.$util.getDefaultImage().goods;
this.$forceUpdate(); this.$forceUpdate();
@@ -450,4 +418,18 @@
/deep/ .mescroll-upwarp { /deep/ .mescroll-upwarp {
padding-bottom: 100rpx; padding-bottom: 100rpx;
} }
.no-login{
display: flex;
flex-direction: column;
align-items: center;
}
.no-login .button{
width: 300rpx;
margin-top: 100rpx;
height: 70rpx;
line-height: 70rpx !important;
font-size: 28rpx;
border-radius: 50rpx;
}
</style> </style>

View File

@@ -435,7 +435,7 @@ view {
line-height: 1.3; line-height: 1.3;
display: flex; display: flex;
margin-top: 20rpx; margin-top: 20rpx;
align-items: center;
.goods-price { .goods-price {
font-weight: 700; font-weight: 700;
font-size: $font-size-activity-tag; font-size: $font-size-activity-tag;
@@ -525,7 +525,9 @@ view {
align-items: center; align-items: center;
background: #fff; background: #fff;
line-height: 40rpx; line-height: 40rpx;
&.remark{
align-items: flex-start !important;
}
.tit { .tit {
text-align: left; text-align: left;
} }
@@ -847,7 +849,13 @@ view {
white-space: nowrap; white-space: nowrap;
flex: 1; flex: 1;
} }
.goods-num{
font-size: 22rpx;
margin-left: 20rpx;
}
.delivery-status{
line-height: 1.3;
}
.fixed-bottom { .fixed-bottom {
width: 100%; width: 100%;
position: fixed; position: fixed;

View File

@@ -1,5 +1,36 @@
export default { export default {
methods: { methods: {
/**
* 删除订单
* @param {Object} orderData
*/
orderDelete(order_id, callback) {
uni.showModal({
title: '提示',
content: '您确定要删除该订单吗?',
success: res => {
if (res.confirm) {
this.$api.sendRequest({
url: '/api/order/delete',
data: {
order_id
},
success: res => {
if (res.code >= 0) {
this.$util.showToast({title:'删除订单成功'})
typeof callback == 'function' && callback();
} else {
this.$util.showToast({
title: '删除订单失败,' + res.message,
duration: 2000
})
}
}
})
}
}
})
},
/** /**
* 订单支付 * 订单支付
* @param {Object} orderData * @param {Object} orderData
@@ -57,8 +88,7 @@ export default {
typeof callback == 'function' && callback(); typeof callback == 'function' && callback();
} else { } else {
this.$util.showToast({ this.$util.showToast({
title: '当前订单可能存在拼团,维权等操作' + res.message + title: '关闭失败' + res.message,
'不可以关闭哦!',
duration: 2000 duration: 2000
}) })
} }

View File

@@ -0,0 +1,471 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view class="bargain">
<view class="bargain_top" :style="{ backgroundImage: 'url(' + $util.img('public/uniapp/bargain/bargain_background.png') + ')' }">
<view>{{ goodsDetail ? goodsDetail.browse_num : 0 }}人查看</view>
<view>|</view>
<view>{{ goodsDetail ? goodsDetail.share_num : 0 }}人分享</view>
<view>|</view>
<view>{{ goodsDetail ? goodsDetail.join_num : 0 }}人参与</view>
</view>
<view class="rule-mark-enter" @click="openRulePopup">活动规则</view>
<view class="bargin_content">
<view class="uer_info_base" v-if="launchInfo">
<view class="user_info_img">
<image :src="launchInfo.headimg == '' ? $util.img($util.getDefaultImage().head) : $util.img(launchInfo.headimg)" mode="widthFix"></image>
</view>
<text class="user_info_name">{{ launchInfo.nickname }}</text>
</view>
<!-- 宣传语 -->
<view class="bargin_propaganda" v-if="launchInfo">
<text class="marks"></text>
<text>我发现一件好物快来帮我砍一刀</text>
<text class="marks"></text>
</view>
<!-- 商品 -->
<view class="goods" v-if="goodsDetail">
<view class="goods_img"><image :src="$util.img(goodsDetail.sku_image, { size: 'mid' })" mode="aspectFit"></image></view>
<view class="goods_content" v-if="launchInfo">
<view class="goods_title">{{ goodsDetail.sku_name }}</view>
<view class="goods_price">
<view>
原价
<text class="original_price">{{ $lang('common.currencySymbol') }}{{ launchInfo.price }}</text>
</view>
<view>
最低可砍至
<text class="bottom_price">{{ $lang('common.currencySymbol') }}{{ launchInfo.floor_price }}</text>
</view>
</view>
<view class="partake_num" v-if="launchInfo">
已有
<text class="ident">{{ launchInfo.curr_num }}</text>
人帮砍
<text class="residue-num">
剩余库存
<text class="ident">{{ goodsDetail.bargain_stock }}{{ goodsDetail.unit }}</text>
</text>
</view>
<view v-if="launchInfo && timeMachine && goodsDetail.bargain_status == 1" class="count-down">
<uni-count-down
:day="timeMachine.d"
:hour="timeMachine.h"
:minute="timeMachine.i"
:second="timeMachine.s"
color="#fff"
splitorColor="#333 !important"
backgroundColor="#000"
border-color="transparent"
@timeup="timeUp()"
></uni-count-down>
<text>后结束</text>
</view>
</view>
<view class="goods_content launch" v-else>
<view class="goods_title">{{ goodsDetail.sku_name }}</view>
<view class="goods_price">
<view>
原价
<text class="original_price price-font">
<text class="price-style small">{{ $lang('common.currencySymbol') }}</text>
<text class="price price-style small">{{ parseFloat(goodsDetail.price).toFixed(2).split('.')[0] }}</text>
<text class="price-symbol price-style small">.{{ parseFloat(goodsDetail.price).toFixed(2).split('.')[1] }}</text>
</text>
</view>
<view>
最低可砍至
<text class="bottom_price price-style small">{{ $lang('common.currencySymbol') }}{{ goodsDetail.floor_price }}</text>
</view>
</view>
</view>
</view>
<!-- 进度 -->
<view class="progress">
<view class="progress_item" :style="{ width: (progress > 2 ? progress : 2) + '%' }"><text class="icon-futou iconfont"></text></view>
<view class="progress-point"></view>
</view>
<view class="info-bottom" v-if="goodsDetail">
<view class="price-box" v-if="launchInfo">
<view class="discount-price">
已砍
<text class="price price-font">
{{ $lang('common.currencySymbol') }}{{ parseFloat(parseFloat(launchInfo.price) - parseFloat(launchInfo.curr_price)).toFixed(2) }}
</text>
</view>
<view class="delete-price ">
还剩
<text class="price price-font">
{{ $lang('common.currencySymbol')
}}{{
parseFloat(
parseFloat(launchInfo.price) - parseFloat(launchInfo.floor_price) - (parseFloat(launchInfo.price) - parseFloat(launchInfo.curr_price))
).toFixed(2)
}}
</text>
</view>
</view>
<view class="price-box" v-else>
<view class="discount-price">
已砍
<text class="price price-font">{{ $lang('common.currencySymbol') }}0</text>
</view>
<view class="delete-price ">
还剩
<text class="price price-font">
{{ $lang('common.currencySymbol') }} {{ parseFloat(parseFloat(goodsDetail.price) - parseFloat(goodsDetail.floor_price)).toFixed(2) }}
</text>
</view>
</view>
<view class="pro-info" v-if="!parseFloat(goodsDetail.floor_price)"><view class="button-border">免费拿</view></view>
</view>
<!-- 邀请新用户 -->
<view class="invitation_peo" v-if="launchInfo">
<!-- <view class="tip">邀请新用户砍掉金额更多哦~</view> -->
<block v-if="launchInfo.self">
<view class="bargain-success" v-if="launchInfo.status == 1">
<text class="iconfont icon-kanjiachenggong"></text>
<text>恭喜您砍价成功快去支付吧</text>
</view>
<view class="bargain-success" v-if="launchInfo.status == 2">
<text class="iconfont icon-biaoqing_nanguo"></text>
<text v-if="launchInfo.buy_type == 0 && launchInfo.order_id == 0">很遗憾未能砍至最低价可立即支付带走您心仪的宝贝</text>
<text v-else-if="launchInfo.buy_type == 0 && launchInfo.order_id > 0">很遗憾未能砍至最低价</text>
<text v-else>很遗憾砍价未成单</text>
</view>
<view class="launch-success" v-if="launchInfo.status == 2 && launchInfo.buy_type == 0 && launchInfo.order_id > 0">恭喜您通过立即支付带走您心仪的宝贝</view>
</block>
<block v-if="goodsDetail.bargain_status == 1">
<view v-if="launchInfo.self" class="flex-box" :class="{ success: launchInfo.status == 1 }">
<block v-if="launchInfo.status != 1 && (goodsDetail.bargain_status != 1 || goodsDetail.bargain_stock == 0)">
<block v-if="goodsDetail.bargain_status != 1">
<button class="btn-vice disabled">活动已结束</button>
<button class="btn" @click="$util.redirectTo('/pages_promotion/bargain/list')">更多砍价商品</button>
</block>
<block v-else-if="goodsDetail.bargain_stock == 0">
<button class="btn-vice disabled">已售罄</button>
<button class="btn" @click="$util.redirectTo('/pages_promotion/bargain/list')">更多砍价商品</button>
</block>
</block>
<block v-else>
<block v-if="launchInfo.status == 0">
<button class="btn-vice" v-if="launchInfo.buy_type == 0" @click="buyNow">不砍了直接买</button>
<button class="btn" @click="openSharePopup">喊好友砍一刀</button>
</block>
<block v-if="launchInfo.status == 1">
<button class="btn" @click="buyNow" v-if="launchInfo.order_id == 0">立即支付</button>
<button class="btn" v-if="launchInfo.order_id > 0" @click="$util.redirectTo('/pages/order/detail', { order_id: launchInfo.order_id })">
查看订单
</button>
<button class="btn-vice" @click="$util.redirectTo('/pages/index/index')">低价拿更多商品</button>
</block>
<block v-if="launchInfo.status == 2">
<button class="btn" v-if="launchInfo.order_id > 0" @click="$util.redirectTo('/pages/order/detail', { order_id: launchInfo.order_id })">
查看订单
</button>
<button class="btn" @click="$util.redirectTo('/pages/index/index')">低价拿更多商品</button>
</block>
</block>
</view>
<view v-else class="flex-box">
<block v-if="launchInfo.status == 0">
<button class="btn" @click="bargain" v-if="!launchInfo.cut">帮好友砍一刀</button>
<button class="btn-vice" @click="$util.redirectTo('/pages_promotion/bargain/list')" v-else>我也要低价拿</button>
</block>
<button v-else class="btn" @click="$util.redirectTo('/pages_promotion/bargain/list')">我也要低价拿</button>
</view>
</block>
<block v-else>
<view class="flex-box success">
<button class="btn" v-if="launchInfo.self && launchInfo.order_id > 0" @click="$util.redirectTo('/pages/order/detail', { order_id: launchInfo.order_id })">
查看订单
</button>
<button class="btn-vice disabled">活动已结束</button>
</view>
</block>
</view>
<view class="invitation_peo" v-else>
<view class="flex-box">
<button class="btn" v-if="goodsDetail && goodsDetail.bargain_status == 1" @click="createBargain()">立即参与砍价</button>
<button class="btn-vice disabled" v-else>活动已结束</button>
</view>
</view>
</view>
<view class="bargin_introduction" v-if="launchInfo">
<view class="bargin_introduction_title">帮砍记录</view>
<view class="bargin_introduction_content">
<view class="bargin_invitation" v-if="bargainRecord.length">
<view class="item" v-for="(item, index) in bargainRecord" :key="index">
<view class="item_left">
<image :src="item.headimg == '' ? $util.img($util.getDefaultImage().head) : $util.img(item.headimg)"></image>
<view class="bargin_info">
<view>{{ item.nickname[0] }}*{{ item.nickname[item.nickname.length - 1] }}</view>
<view>{{ $util.timeStampTurnTime(item.bargain_time) }}</view>
</view>
</view>
<view class="item_right">
<image :src="$util.img('public/uniapp/bargain/bargain-icon.png')" class="bargain-icon"></image>
帮砍
<text>{{ item.money }}</text>
</view>
</view>
<view class="item_more" v-if="showMore" @click="scrolltolower()">加载更多</view>
</view>
<view v-else class="record-empty">现在还没有砍价记录</view>
</view>
</view>
<view class="bargin_introduction">
<view class="bargin_introduction_title">砍价流程</view>
<view class="bargin_introduction_content">
<view class="flow">
<view class="flow_item">
<image :src="$util.img('public/uniapp/bargain/bargain_kanjia.png')"></image>
<view>发起商品砍价</view>
</view>
<view class="flow_item">
<image :src="$util.img('public/uniapp/bargain/bargain_friend.png')"></image>
<view>邀请好友砍价达要求</view>
</view>
<view class="flow_item">
<image :src="$util.img('public/uniapp/bargain/bargain_good.png')"></image>
<view>领取商品带回家</view>
</view>
</view>
</view>
</view>
<view class="bargin_introduction" v-if="launchList && launchList.length > 0">
<view class="bargin_introduction_title">砍成晒单</view>
<view class="bargin_introduction_content">
<view class="bargain-list">
<swiper vertical="true" autoplay="true" interval="3000" :display-multiple-items="showNum" :circular="true" :class="'swiper-' + launchList.length">
<swiper-item v-for="(item, index) in launchList" :key="index">
<view class="bargain-item">
<view>
<view class="bargain-head"><image :src="item.headimg == '' ? $util.img($util.getDefaultImage().head) : $util.img(item.headimg)"></image></view>
<view class="bargain-info">
<view class="bargain-title">{{ item.nickname[0] }}*{{ item.nickname[item.nickname.length - 1] }}</view>
<view class="bargain-desc">{{ $util.timeStampTurnTime(item.end_time) }}</view>
</view>
</view>
<view class="bargain-price">
成功砍至
<text>{{ parseFloat(item.curr_price).toFixed(2) }}</text>
</view>
</view>
</swiper-item>
</swiper>
</view>
</view>
</view>
<view class="bargin_introduction">
<view class="bargin_introduction_title">商品详情</view>
<view class="bargin_introduction_content">
<view class="detail-content">
<view class="goods-details" v-if="goodsDetail && goodsDetail.goods_content">
<ns-mp-html :content="goodsDetail.goods_content"></ns-mp-html>
</view>
<view class="goods-details active" v-else>该商家暂无上传相关详情哦</view>
</view>
</view>
</view>
<ns-goods-sku
ref="goodsSku"
v-if="goodsDetail"
@refresh="refreshGoodsSkuDetail"
:goods-id="goodsDetail.goods_id"
:goods-detail="goodsDetail"
:maxBuy="maxBuy"
></ns-goods-sku>
<!-- 帮砍弹出 -->
<uni-popup ref="uniHelpPopup" type="center" :maskClick="false">
<view class="bargain-popup self help">
<image :src="$util.img('public/uniapp/bargain/bargain-pop-1.png')" mode="widthFix" class="head"></image>
<view class="bargain-content">
<view class="uer_info_base" v-if="launchInfo">
<view class="user_info_img">
<image :src="launchInfo.headimg == '' ? $util.img($util.getDefaultImage().head) : $util.img(launchInfo.headimg)" mode="widthFix"></image>
</view>
<text class="user_info_name">{{ launchInfo.nickname }}</text>
</view>
<view v-if="goodsDetail && launchInfo && timeMachine && goodsDetail.bargain_status == 1" class="count-down">
<text>还剩</text>
<uni-count-down
:day="timeMachine.d"
:hour="timeMachine.h"
:minute="timeMachine.i"
:second="timeMachine.s"
color="#fff"
splitorColor="#333 !important"
backgroundColor="#000"
border-color="transparent"
@timeup="timeUp()"
></uni-count-down>
<text>结束</text>
</view>
</view>
<button class="bargain-btn" type="primary" @click="bargain()">帮他砍价</button>
</view>
<text class="iconfont icon-round-close" @click="$refs.uniHelpPopup.close()"></text>
</uni-popup>
<!-- 帮砍成功 -->
<uni-popup ref="uniPopup" type="center" :maskClick="false">
<view class="bargain-popup self">
<image :src="$util.img('public/uniapp/bargain/bargain-pop-2.png')" mode="widthFix" class="head"></image>
<view class="bargain-content">
<text>您已帮砍</text>
<text class="money color-base-text">{{ bargainMoney }}</text>
<text>您也可以参与砍价快去挑选心仪的宝贝吧~~~</text>
</view>
<button class="bargain-btn" type="primary" @click="$util.redirectTo('/pages_promotion/bargain/list')">我也要参与</button>
</view>
<text class="iconfont icon-round-close" @click="closePopup"></text>
</uni-popup>
<!-- 自砍一刀展示 -->
<uni-popup ref="uniSelfBargainPopup" type="center" :maskClick="false">
<view class="bargain-popup self">
<image :src="$util.img('public/uniapp/bargain/bargain-pop-2.png')" mode="widthFix" class="head"></image>
<view class="bargain-content">
<text>您已砍掉</text>
<text class="money color-base-text">{{ my_bargain_money }}</text>
<text>听说分享次数越多砍价成功的机会越大哦</text>
</view>
<button class="bargain-btn" type="primary" @click="openSharePopup">邀请好友帮砍价</button>
</view>
<text class="iconfont icon-round-close" @click="closeSelfPop"></text>
</uni-popup>
<!-- 分享弹窗 -->
<view @touchmove.prevent.stop>
<uni-popup ref="sharePopup" type="bottom" class="share-popup">
<view>
<view class="share-title">分享</view>
<view class="share-content">
<!-- #ifdef MP -->
<view class="share-box">
<button class="share-btn" :plain="true" open-type="share">
<view class="iconfont icon-share-friend"></view>
<text>分享给好友</text>
</button>
</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view class="share-box" @click="copyUrl">
<button class="share-btn" :plain="true">
<view class="iconfont icon-fuzhilianjie"></view>
<text>复制链接</text>
</button>
</view>
<!-- #endif -->
<view class="share-box" @click="openPosterPopup">
<button class="share-btn" :plain="true">
<view class="iconfont icon-pengyouquan"></view>
<text>生成分享海报</text>
</button>
</view>
</view>
<view class="share-footer" @click="closeSharePopup"><text>取消分享</text></view>
</view>
</uni-popup>
</view>
<!-- 海报 -->
<view @touchmove.prevent.stop class="poster-layer">
<uni-popup ref="posterPopup" type="center">
<template v-if="poster != '-1'">
<view class="poster-wrap">
<view class="image-wrap">
<image :src="$util.img(poster)" :show-menu-by-longpress="true" mode="widthFix" />
<view class="close iconfont icon-close" @click="closePosterPopup()"></view>
</view>
<!-- #ifdef MP || APP-PLUS -->
<view class="save-btn" @click="saveGoodsPoster()">保存图片</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view class="save-btn">长按图片进行保存</view>
<!-- #endif -->
</view>
</template>
</uni-popup>
</view>
<!-- 悬浮按钮 -->
<hover-nav :need="true"></hover-nav>
<!-- 活动规则 -->
<uni-popup ref="rulePopup" type="center" :maskClick="false">
<view class="rule-wrap">
<view class="content-wrap">
<image :src="$util.img('public/uniapp/common/promotion_rule_head.png')" mode="widthFix" class="rule-head"></image>
<scroll-view scroll-y="true" class="rule">
<view class="text" v-if="goodsDetail && goodsDetail.remark != ''">{{ goodsDetail.remark }}</view>
</scroll-view>
<text class="iconfont icon-round-close" @click="closeRulePopup"></text>
</view>
</view>
</uni-popup>
<loading-cover ref="loadingCover"></loading-cover>
<ns-login ref="login"></ns-login>
<!-- #ifdef MP-WEIXIN -->
<!-- 小程序隐私协议 -->
<privacy-popup ref="privacyPopup"></privacy-popup>
<!-- #endif -->
</view>
</template>
<script>
import LTime from '@/pages_promotion/components/l-time/l-time.vue';
import uniPopup from '@/components/uni-popup/uni-popup.vue';
import goodsSku from '@/components/ns-goods-sku/ns-goods-sku.vue';
import detail from './public/js/detail.js';
export default {
components: {
LTime,
goodsSku,
uniPopup
},
mixins: [detail]
};
</script>
<style lang="scss">
@import './public/css/detail.scss';
</style>
<style scoped>
/deep/ .sku-layer .uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
max-height: unset !important;
}
/deep/.uni-popup__wrapper.uni-custom.center .uni-popup__wrapper-box {
overflow-y: unset;
background: none !important;
}
.detail-content >>> img {
max-width: 100% !important;
}
.detail-content >>> image {
max-width: 100% !important;
}
/deep/.uni-countdown__number {
padding: 0 4rpx;
line-height: 36rpx;
height: 36rpx;
}
/deep/ .uni-countdown__splitor.day {
line-height: 36rpx;
}
</style>

View File

@@ -0,0 +1,357 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view class="page" :style="{ background: bgColor }">
<mescroll-uni @getData="getData" ref="mescroll" :size="10" v-if="addonIsExist.bargain">
<block slot="list">
<ns-adv keyword="NS_BARGAIN" class-name="adv-wrap"></ns-adv>
<block v-if="dataList.length > 0 || dataListing.length > 0">
<view class="goods-list single-column" v-if="dataListing.length">
<view class="goods-item margin-bottom" v-for="(item, index) in dataListing" :key="index">
<view class="goods-item-content">
<view class="goods-img" @click="toDetailP(item)">
<image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)"/>
<view class="color-base-bg goods-tag" v-if="goodsTag(item) != ''">{{ goodsTag(item) }}</view>
</view>
<view class="info-wrap">
<view class="name-wrap">
<view class="goods-name" @click="toDetailP(item)">{{ item.goods_name }}</view>
<text class="info-sub-title">已有{{ item.join_num }}人参与</text>
<view class="progress-wrap">
<progress percent="20" :show-info="false" stroke-width="8"
backgroundColor="#FFF4F4" :activeColor="themeStyle.main_color"
border-radius="6" :percent="progressP(item)" />
<view class="progress-point"></view>
<view class="progress-select icon"
:style="{ left: 'calc(' + progressP(item) + '% - 16rpx)' }">
<text class="iconfont icon-futou"></text>
</view>
</view>
</view>
<view class="info-bottom">
<view class="price-box">
<view class="discount-price">已砍<text class="price price-font">{{ (item.price - item.curr_price).toFixed(2) }}</text></view>
<view class="delete-price ">还剩<text class="price price-font">{{ $lang('common.currencySymbol') }}{{ (item.curr_price - item.floor_price).toFixed(2) }}</text></view>
</view>
<view class="pro-info">
<view class="button-border">免费拿</view>
</view>
</view>
</view>
</view>
<view class="goods-item-bottom">
<view class="item-bottom-left">
<uni-count-down :day="item.time.d" :hour="item.time.h" :minute="item.time.i" :second="item.time.s" color="#fff" borderColor="none" splitorColor="#303133" backgroundColor="#303133" />
<view class="color-sub txt">后结束</view>
</view>
<view class="item-bottom-right">
<button type="primary" @click="toDetailP(item)" size="mini" class="mini">继续砍价</button>
</view>
</view>
</view>
</view>
<view class="goods-list single-column" v-if="dataList.length">
<view class="goods-item margin-bottom" v-for="(item, index) in dataList" :key="index">
<view class="goods-item-content">
<view class="goods-img" @click="toDetail(item)">
<image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)"/>
<view class="color-base-bg goods-tag" v-if="goodsTag(item) != ''">{{ goodsTag(item) }}</view>
</view>
<view class="info-wrap">
<view class="name-wrap">
<view class="goods-name" @click="toDetail(item)">{{ item.sku_name }}</view>
<text class="info-sub-title">已有{{ item.join_num }}人参与</text>
<view class="progress-wrap"><progress percent="20" :show-info="false" stroke-width="8" backgroundColor="#FFF4F4" :activeColor="themeStyle.main_color" border-radius="6" :percent="progress(item)" />
<view class="progress-point"></view>
<view class="progress-select icon" :style="{ left: 'calc(' + progress(item) + '% - 8rpx)' }">
<text class="iconfont icon-futou"></text>
</view>
</view>
</view>
<view class="info-bottom">
<view class="sale-box price-font">已砍{{ item.sale_num }}</view>
<view class="pro-info">
<view class="button-border">免费拿</view>
</view>
</view>
</view>
</view>
<view class="goods-item-bottom">
<view class="item-bottom-left">
<view class="txt">底价</view>
<text class="unit price-style small">{{ $lang('common.currencySymbol') }}</text>
<text class="price price-style large">{{ parseFloat(item.floor_price).toFixed(2).split('.')[0] }}</text>
<text class="unit price-style large">.{{ parseFloat(item.floor_price).toFixed(2).split('.')[1] }}</text>
<view class="delete-pirce">{{ $lang('common.currencySymbol') }}{{ item.price }}</view>
</view>
<view class="item-bottom-right">
<button type="primary" @click="toDetail(item)" size="mini" class="mini">去砍价</button>
</view>
</view>
</view>
</view>
</block>
<ns-empty v-else-if="isLoad && isLoading" textColor="#fff" :isIndex="false" text="暂无砍价商品"></ns-empty>
</block>
</mescroll-uni>
<!-- 悬浮按钮 -->
<hover-nav></hover-nav>
<loading-cover ref="loadingCover"></loading-cover>
<!-- #ifdef MP-WEIXIN -->
<!-- 小程序隐私协议 -->
<privacy-popup ref="privacyPopup"></privacy-popup>
<!-- #endif -->
</view>
</template>
<script>
import uniCountDown from '@/components/uni-count-down/uni-count-down.vue';
export default {
components: {
uniCountDown
},
data() {
return {
dataList: [],
dataListing: [],
isLoading: false,
isLoad: false,
skuId: 0,
mpShareData: null, //小程序分享数据
progressBorder: '10',
bgColor: ''
};
},
onLoad(option) {
//小程序分享接收source_member
if (option.source_member) {
uni.setStorageSync('source_member', option.source_member);
}
// 小程序扫码进入接收source_member
if (option.scene) {
var sceneParams = decodeURIComponent(option.scene);
sceneParams = sceneParams.split('&');
if (sceneParams.length) {
sceneParams.forEach(item => {
if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1];
if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]);
if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1);
});
}
}
},
async onShow() {
setTimeout( () => {
if (!this.addonIsExist.bargain) {
this.$util.showToast({
title: '商家未开启砍价',
mask: true,
duration: 2000
});
setTimeout(() => {
this.$util.redirectTo('/pages/index/index');
}, 2000);
}
},1000);
//记录分享关系
if (this.storeToken && uni.getStorageSync('source_member')) {
this.$util.onSourceMember(uni.getStorageSync('source_member'));
}
//小程序分享
// #ifdef MP-WEIXIN
this.$util.getMpShare().then(res => {
this.mpShareData = res;
});
// #endif
await this.getZoneConfig();
if (this.$refs.mescroll) this.$refs.mescroll.refresh();
this.getDataing();
},
//分享给好友
onShareAppMessage() {
return this.mpShareData.appMessage;
},
//分享到朋友圈
onShareTimeline() {
return this.mpShareData.timeLine;
},
methods: {
// 活动页面配置
async getZoneConfig() {
let res = await this.$api.sendRequest({
url: '/api/config/promotionZoneConfig',
data: {
name: 'bargain'
},
async: false
});
let data = res.data;
if (data) {
this.bgColor = data.bg_color;
}
},
getData(mescroll) {
this.$api.sendRequest({
url: '/bargain/api/goods/page',
data: {
page_size: mescroll.size,
page: mescroll.num,
is_exclude_bargaining: 1
},
success: res => {
let newArr = [];
let msg = res.message;
if (res.code == 0 && res.data) {
newArr = res.data.list;
} else {
this.$util.showToast({
title: msg
});
}
if (mescroll.endSuccess) mescroll.endSuccess(newArr.length);
//设置列表数据
if (mescroll.num == 1) this.dataList = []; //如果是第一页需手动制空列表
this.dataList = this.dataList.concat(newArr); //追加新数据
this.isLoad = true;
this.$forceUpdate();
setTimeout(() => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}, 300);
},
fail() {
//联网失败的回调
if (mescroll.endErr) mescroll.endErr();
setTimeout(() => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}, 300);
}
});
},
getDataing() {
this.$api.sendRequest({
url: '/bargain/api/goods/bargainingList',
data: {},
success: res => {
this.dataListing = res.data;
for (var index in res.data) {
this.dataListing[index].time = this.$util.countDown(res.data[index].end_time - res.timestamp);
}
this.isLoading = true;
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
},
fail() {
//联网失败的回调
mescroll.endErr();
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
toDetail(e) {
this.$util.redirectTo('/pages_promotion/bargain/detail', {
b_id: e.bargain_id
});
},
toDetailP(e) {
this.$util.redirectTo('/pages_promotion/bargain/detail', {
b_id: e.bargain_id,
l_id: e.launch_id
});
},
imgError(index) {
this.dataList[index].goods_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
},
goodsImg(imgStr) {
let imgs = imgStr.split(',');
return imgs[0] ? this.$util.img(imgs[0], {
size: 'mid'
}) : this.$util.getDefaultImage().goods;
},
progress(data) {
let progress = ((parseInt(data.sale_num) / (parseInt(data.bargain_stock) + parseInt(data.sale_num))) * 100).toFixed();
if (progress == 'NaN') {
progress = 0;
}
return progress;
},
progressP(data) {
let progress = (((parseFloat(data.price) - parseFloat(data.curr_price)) / parseFloat(data.price)) * 100).toFixed();
if (progress == 'NaN') {
progress = 0;
}
return progress;
},
goodsTag(data) {
return data.label_name || '';
}
},
onHide() {
if (this.$refs.loadingCover) this.$refs.loadingCover.show();
}
};
</script>
<style lang="scss">
@import './public/css/list.scss';
</style>
<style lang="scss" scoped>
/deep/ .fixed {
position: relative;
top: 0;
}
/deep/ .empty {
margin-top: 0 !important;
}
.clockrun {
.delete-price {
max-width: 60%;
}
}
/deep/ .uni-countdown__number {
min-width: 32rpx;
height: 32rpx;
text-align: center;
line-height: 32rpx;
border-radius: 4px;
display: inline-block;
padding: 4rpx;
margin: 0;
border: none !important;
}
/deep/ .uni-countdown__splitor {
width: 10rpx;
height: 32rpx;
line-height: 36rpx;
text-align: center;
display: inline-block;
}
/deep/ .uni-countdown__splitor.day {
width: initial;
}
</style>
<style>
.progress-wrap>>>.uni-progress .uni-progress-bar {
border-radius: 16rpx;
overflow: hidden;
}
.progress-wrap>>>.uni-progress-bar .uni-progress-inner-bar {
background: linear-gradient(to left, var(--bargain-promotion-color), var(--bargain-promotion-aux-color)) !important;
}
</style>

View File

@@ -0,0 +1,432 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view>
<view class="my_spell_category" v-if="storeToken">
<view class="category-item" v-for="(item, index) in statusList" :key="index" @click="categoryChange(item.id)">
<view class="item-con" :class="item.id == status ? 'active color-base-text color-base-bg-before' : ''">{{ item.name }}</view>
</view>
</view>
<mescroll-uni @getData="getData" top="90" ref="mescroll" :size="10" v-if="storeToken">
<block slot="list">
<view class="goods-list" v-for="(item, index) in dataList" :key="index">
<view class="goods-item-content" @click="goBargainDetail(item)">
<view class="goods-item-state">
<text class="state-time">发起砍价 {{ $util.timeStampTurnTime(item.start_time) }}</text>
<text class="state-sign" :style="{ color: bargainState[item.status].color }">{{ bargainState[item.status].text }}</text>
</view>
<view class="goods-item-wrap">
<view class="image-wrap">
<image :src="$util.img(item.sku_image,{'size':'mid'})" mode="aspectFit" @error="imageError(index)"></image>
</view>
<view class="content">
<view class="title">{{ item.sku_name }}</view>
<text class="residue-price color-base-text">已砍至{{ item.curr_price }}</text>
<view class="price-box">
<text class="original-price" v-if="item.status">{{ $lang('common.currencySymbol') }}{{ item.price }}</text>
<view class="time" v-if="item.timeMachine && item.status == 0">
<uni-count-down :day="item.timeMachine.d" :hour="item.timeMachine.h"
:minute="item.timeMachine.i" :second="item.timeMachine.s" color="#fff"
splitorColor="#000 !important" backgroundColorClass="color-base-bg"
border-color="transparent" />
<text class="end-txt">后结束</text>
</view>
</view>
</view>
</view>
</view>
<view class="goods-item-action">
<view class="invitation-bargain">
<image :src="recordItem.headimg == '' ? $util.img($util.getDefaultImage().head) : $util.img(recordItem.headimg)" v-for="(recordItem, recordIndex) in item.bargain_record" :key="recordIndex" @error="memberImageError(index, recordIndex)"/>
<text class="invitation-bargain-end color-base-text color-base-border" v-if="item.status == 0">+</text>
<text class="invitation-bargain-end color-base-text color-base-border " v-else>
<text class="icon-ellipsis iconfont"></text>
</text>
</view>
<button class="btn" type="default" v-if="item.status == 0 && item.bargain_status == 1" @click="goBargainDetail(item)">继续砍价</button>
<block v-if="item.status == 1 && item.bargain_status == 1">
<button class="btn" type="default" v-if="item.order_id == 0" @click="goBargainDetail(item)">购买商品</button>
<button class="btn" type="default" v-else @click="goBargainDetail(item)">查看详情</button>
</block>
<button class="btn" type="default" v-if="item.status == 2 && item.bargain_status == 1" @click="$util.redirectTo('/pages_promotion/bargain/list')">重新砍价</button>
</view>
</view>
<ns-empty v-if="dataList.length == 0" :isIndex="true" :emptyBtn="{url: '/pages_promotion/bargain/list',text: '去逛逛'}" text="暂无砍价订单"></ns-empty>
</block>
</mescroll-uni>
<ns-login ref="login"></ns-login>
<loading-cover ref="loadingCover"></loading-cover>
</view>
</template>
<script>
import uniCountDown from '@/components/uni-count-down/uni-count-down.vue';
export default {
components: {
uniCountDown
},
data() {
return {
mescroll: null,
dataList: [],
statusList: [{
id: 'all',
name: '全部'
},
{
id: 0,
name: '正在砍价'
},
{
id: 1,
name: '砍价成功'
},
{
id: 2,
name: '砍价失败'
}
],
status: 'all',
bargainState: [{
color: '#FFA044',
text: '正在砍价'
},
{
color: '#11BD64',
text: '砍价成功'
},
{
color: '#FF4544',
text: '砍价失败'
}
],
};
},
onShow() {
setTimeout( () => {
if (!this.addonIsExist.bargain) {
this.$util.showToast({
title: '商家未开启砍价',
mask: true,
duration: 2000
});
setTimeout(() => {
this.$util.redirectTo('/pages/index/index');
}, 2000);
}
},1000);
if (!this.storeToken) {
this.$nextTick(() => {
this.$refs.login.open('/pages_promotion/bargain/my_bargain');
});
}
},
methods: {
//请求列表数据
getData(mescroll) {
this.mescroll = mescroll;
this.$api.sendRequest({
url: '/bargain/api/bargain/launchPage',
data: {
page_size: mescroll.size,
page: mescroll.num,
status: this.status
},
success: res => {
let newArr = [];
let msg = res.message;
if (res.code == 0 && res.data) {
newArr = res.data.list;
} else {
this.$util.showToast({
title: msg
});
}
mescroll.endSuccess(newArr.length);
//设置列表数据
if (mescroll.num == 1) this.dataList = []; //如果是第一页需手动制空列表
newArr.forEach(v => {
if (v.end_time > res.timestamp) {
v.timeMachine = this.$util.countDown(v.end_time - res.timestamp);
} else {
v.timeMachine = null;
}
});
this.dataList = this.dataList.concat(newArr); //追加新数据
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
},
fail() {
//联网失败的回调
mescroll.endErr();
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
//砍价详情
goBargainDetail(data) {
this.$util.redirectTo('/pages_promotion/bargain/detail', {
l_id: data.launch_id,
b_id: data.bargain_id
});
},
//切换分类
categoryChange(e) {
this.status = e;
this.mescroll.resetUpScroll();
},
imageError(index) {
this.dataList[index].sku_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
},
memberImageError(index, j) {
this.dataList[index].bargain_record[j].headimg = this.$util.getDefaultImage().head;
this.$forceUpdate();
}
},
onBackPress(options) {
if (options.from === 'navigateBack') {
return false;
}
this.$util.redirectTo('/pages/member/index');
return true;
},
watch: {
storeToken: function(nVal, oVal) {
if (nVal) {
this.$refs.mescroll.refresh();
}
}
}
};
</script>
<style lang="scss">
.my_spell_category {
width: 100%;
height: 88rpx;
display: flex;
justify-content: space-around;
background: #fff;
position: fixed;
top: 0;
z-index: 999;
box-sizing: border-box;
.category-item {
width: 130rpx;
text-align: center;
.item-con {
display: inline-block;
height: 88rpx;
font-size: 30rpx;
position: relative;
line-height: 88rpx;
}
.item-con.active:after {
content: '';
display: block;
width: 100%;
height: 4rpx;
border-radius: 6rpx;
position: absolute;
left: 0;
bottom: 0;
}
&:last-of-type {
margin-right: 0;
}
}
}
.goods-list {
margin: 20rpx 30rpx 20rpx;
background-color: #fff;
border-radius: 10rpx;
height: 358rpx;
padding: 30rpx;
}
.goods-list .goods-item-content {
background-color: #fff;
border-radius: 10rpx;
box-sizing: border-box;
.goods-item-state {
display: flex;
align-items: center;
justify-content: space-between;
.state-time {
font-size: $font-size-base;
color: $color-title;
}
.state-sign {
font-size: $font-size-tag;
}
}
.goods-item-wrap {
display: flex;
margin-top: 42rpx;
}
.image-wrap {
display: flex;
align-items: center;
justify-content: center;
width: 170rpx;
height: 170rpx;
margin-right: 18rpx;
border-radius: 10rpx;
overflow: hidden;
image {
width: 170rpx;
height: 170rpx;
}
}
.content {
flex: 1;
position: relative;
line-height: 1;
width: calc(100% - 220rpx);
.title {
margin-top: -8rpx;
height: 84rpx;
font-size: $font-size-base;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
line-height: 42rpx;
color: $color-title;
}
.residue-price {
display: inline-block;
margin-top: 16rpx;
font-size: $font-size-sub;
padding: 2rpx 4rpx;
}
.price-box {
position: absolute;
bottom: 0;
line-height: 1.6;
font-size: $font-size-tag;
width: 100%;
.original-price {
color: $color-tip;
font-size: $font-size-tag;
text-decoration: line-through;
}
.time {
display: flex;
align-items: center;
margin-bottom: -12rpx;
font-size: $font-size-goods-tag;
.uni-countdown {
display: flex;
align-items: center;
}
.end-txt {
font-size: $font-size-base;
margin-left: 10rpx;
}
}
}
}
}
.goods-list .goods-item-action {
display: flex;
align-items: center;
justify-content: space-between;
height: 120rpx;
box-sizing: border-box;
.invitation-bargain {
display: flex;
flex-flow: wrap;
width: 510rpx;
image {
border: 2rpx solid #fff;
}
image,
.invitation-bargain-end {
margin-right: -24rpx;
width: 50rpx;
height: 50rpx;
border-radius: 50%;
border: 2rpx solid #fff;
}
.invitation-bargain-end {
display: flex;
align-items: center;
justify-content: center;
border: 2rpx dashed;
font-size: 24rpx;
background-color: #fff;
z-index: 999;
}
}
.btn {
display: flex;
justify-content: center;
align-items: center;
margin: 0;
padding: 0;
width: 130rpx;
height: 60rpx;
line-height: 1;
font-size: $font-size-tag;
border-radius: 60rpx;
border-color: #999999;
&.fail {
background-color: #aaa;
}
}
}
</style>
<style scoped>
>>>.uni-countdown__number,
>>>.uni-countdown__splitor {
margin: 0;
padding: 0;
}
.time>>>.uni-countdown__number {
min-width: 28rpx;
height: 28rpx;
text-align: center;
line-height: 28rpx;
background: #000;
border-radius: 4px;
display: inline-block;
padding: 4rpx;
margin: 0;
border: none;
}
.time>>>.uni-countdown__splitor {
margin: 0 4rpx;
}
</style>

View File

@@ -0,0 +1,52 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view>
<common-payment :api="api" create-data-key="bargainOrderCreateData" ref="payment"></common-payment>
</view>
</template>
<script>
export default {
data() {
return {
api: {
payment: '/bargain/api/ordercreate/payment',
calculate: '/bargain/api/ordercreate/calculate',
create: '/bargain/api/ordercreate/create'
}
}
},
provide() {
return {
promotion: this.promotion.bind(this)
}
},
onShow() {
if (this.$refs.payment) this.$refs.payment.pageShow();
},
methods:{
/**
* 处理活动信息 如不需要则留空
*/
promotion(data){
if(data.bargain_info){
return {title: '砍价活动', content: '该商品参与砍价活动'}
}
}
}
};
</script>
<style scoped lang="scss">
/deep/ .uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
background: none;
max-height: unset !important;
overflow-y: hidden !important;
}
/deep/ .uni-popup__wrapper {
border-radius: 20rpx 20rpx 0 0;
}
/deep/ .uni-popup {
z-index: 8;
}
</style>

View File

@@ -0,0 +1,989 @@
.bargain {
background-size: cover;
background-repeat: repeat-y;
padding-bottom: 100rpx;
background: var(--bargain-promotion-color);
.bargain_top {
height: 360rpx;
background-size: 100% auto;
background-repeat: no-repeat;
display: flex;
color: #fff;
justify-content: center;
position: relative;
line-height: 1;
view {
color: #fff;
line-height: 50rpx;
height: 50rpx;
display: flex;
align-items: center;
font-size: 24rpx;
margin: 26rpx 2rpx;
}
}
.bargin_content {
background-color: #fff;
border-radius: 20rpx;
margin: 24rpx;
padding-bottom: 60rpx;
padding-top: 30rpx;
margin-top: 0;
.uer_info_base {
display: flex;
position: relative;
padding: 0 0;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
.user_info_img {
background-color: #fff;
width: 120rpx;
height: 120rpx;
margin-top: -80rpx;
margin-left: 0;
border-radius: 50%;
border: 2px solid #fff;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.user_info_name {
margin-left: 0;
color: $color-tip;
align-self: center;
}
.rule_detail {
position: absolute;
height: 34rpx;
line-height: 34rpx;
padding: 0 12rpx;
font-size: 18rpx;
border: 1px solid;
right: 24rpx;
top: 30rpx;
border-radius: 34rpx;
}
}
.bargin_propaganda {
display: flex;
justify-content: space-between;
margin: 0 27rpx 30rpx;
font-size: 34rpx;
color: #333333;
font-weight: bold;
.marks {
font-size: 60rpx;
line-height: 1;
color: #b0b0b0;
}
}
.goods {
display: flex;
margin-top: 0;
margin-left: 24rpx;
margin-right: 24rpx;
padding: 24rpx;
background-color: #fafafa;
border-radius: 10rpx;
overflow: hidden;
.goods_img {
min-width: 180rpx;
width: 230rpx;
height: 230rpx;
margin-right: 20rpx;
border-radius: 10rpx;
image {
width: 100%;
height: 100%;
}
}
.goods_content {
flex: 1;
overflow: hidden;
.goods_title {
line-height: 1.3;
font-size: 30rpx;
margin-bottom: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
display: -moz-box;
-moz-line-clamp: 2;
-moz-box-orient: vertical;
word-wrap: break-word;
word-break: break-all;
white-space: normal;
height: 78rpx;
}
.goods_price {
display: flex;
> view {
color: #666666;
font-size: 22rpx;
.original_price {
margin-left: 3rpx;
}
.bottom_price {
color: var(--price-color);
margin-left: 3rpx;
}
&:first-child {
margin-right: 10rpx;
}
}
}
.partake_num {
font-size: 22rpx;
color: #666666;
margin-top: 4rpx;
.residue-num {
margin-left: 10rpx;
}
.ident {
color: #fe0b42;
margin: 0 4rpx;
}
}
.count-down {
color: #666666;
margin-top: 6rpx;
text {
margin-left: 16rpx;
}
}
&.launch {
.goods_price {
flex-direction: column;
.original_price {
text-decoration: unset;
color: var(--price-color);
}
}
}
}
}
.progress_info {
display: flex;
justify-content: space-between;
margin: 40rpx 24rpx 0;
> view {
font-size: $font-size-tag;
color: #666666;
text {
color: var(--price-color);
}
}
}
.progress {
position: relative;
margin: 40rpx 35rpx 0;
height: 20rpx;
background-color: #fff4f4;
border-radius: 30rpx;
.progress_item {
width: 5%;
position: absolute;
left: 0;
border-radius: 30rpx;
height: 20rpx;
background: linear-gradient(to left, var(--bargain-promotion-color), var(--bargain-promotion-aux-color));
animation: all 1s forwards;
.iconfont {
position: absolute;
right: -20rpx;
top: -10rpx;
height: 40rpx;
width: 40rpx;
color: #fff;
background-color: var(--bargain-promotion-color);
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
border-radius: 50%;
font-size: 24rpx;
z-index: 1;
}
}
.progress-point {
position: absolute;
background-color: var(--bargain-promotion-color);
height: 26rpx;
width: 26rpx;
border-radius: 50%;
right: -13rpx;
top: -4rpx;
}
}
.info-bottom {
display: flex;
justify-content: space-between;
margin: 10px 12px 0;
align-items: center;
.sale-box {
color: var(--bargain-promotion-color);
}
.price-box {
display: flex;
line-height: 1;
.discount-price {
display: flex;
font-size: 26rpx;
line-height: 1;
margin-top: 4rpx;
.price {
}
}
.delete-price {
display: flex;
font-size: 26rpx;
line-height: 1;
margin-top: 4rpx;
}
.price {
line-height: 1.2;
color: var(--bargain-promotion-color);
}
}
.pro-info {
line-height: 1;
display: flex;
align-items: center;
.button-border {
border: 2rpx solid var(--bargain-promotion-color);
color: var(--bargain-promotion-color);
font-size: 24rpx;
padding: 4rpx 6rpx;
line-height: 1;
border-radius: 4rpx;
background-color: #fff4f4;
position: relative;
border-top-right-radius: 0;
}
.button-border::before {
content: '';
display: block;
position: absolute;
top: -10rpx;
right: -2rpx;
border-left: 10rpx solid transparent;
border-right: 0 solid transparent;
border-bottom: 10rpx solid var(--bargain-promotion-color);
}
.button-border::after {
content: '';
display: block;
position: absolute;
top: -6rpx;
right: 0rpx;
border-left: 10rpx solid transparent;
border-right: 0 solid transparent;
border-bottom: 10rpx solid #fff4f4;
}
}
}
.bragain_recode {
display: flex;
align-items: center;
justify-content: space-between;
margin: 58rpx 24rpx 20rpx;
.bragain_recode_list {
display: flex;
margin: 0 26rpx;
.bragain_recode_add {
margin-left: 44rpx;
}
image {
width: 84rpx;
height: 84rpx;
border: 4rpx solid #fe0b42;
border-radius: 50%;
margin-left: -22rpx;
&:first-child {
margin-left: 0;
}
}
}
.bragain_recode_more {
width: 84rpx;
height: 84rpx;
line-height: 84rpx;
text-align: center;
font-size: 12rpx;
color: #999999;
}
.bragain_recode_add {
width: 84rpx;
height: 84rpx;
line-height: 76rpx;
text-align: center;
border-radius: 50%;
border: 1px dashed #e6e6e6;
font-size: 60rpx;
color: #e6e6e6;
}
}
.bragain_recode_detail {
font-size: 24rpx;
color: #000;
margin: 0 34rpx 0;
.iconfont {
font-size: 24rpx;
color: #333333;
}
}
.invitation_peo {
margin: 28rpx 30rpx 0;
.bargain-success {
display: flex;
align-items: center;
justify-content: center;
font-size: $font-size-tag;
margin: 40rpx 0 0;
.iconfont {
margin-right: 8rpx;
color: rgb(250, 26, 26);
}
> view {
text-align: center;
}
}
.launch-success {
text-align: center;
font-size: $font-size-tag;
}
.tip {
text-align: center;
color: #fe0b42;
font-size: $font-size-goods-tag;
}
.flex-box {
display: flex;
margin-top: 20rpx;
button {
flex: 1;
&:nth-child(2) {
margin-left: 20rpx;
}
}
&.success {
flex-direction: column;
.btn {
margin: 0 !important;
}
.btn-vice {
background-color: #fff;
border: 2rpx solid var(--bargain-promotion-color);
color: var(--bargain-promotion-color);
margin: 0 !important;
margin-top: 20rpx !important;
}
}
}
.btn {
height: 80rpx;
line-height: 80rpx;
background: var(--bargain-promotion-color);
border-radius: $border-radius;
text-align: center;
font-size: 30rpx;
color: #fff;
font-weight: bold;
margin: 20rpx 0;
}
.btn-vice {
height: 80rpx;
line-height: 80rpx;
background: var(--bargain-promotion-aux-color);
border-radius: $border-radius;
text-align: center;
font-size: 30rpx;
color: #fff;
font-weight: bold;
margin: 20rpx 0;
}
}
}
.bargin_introduction {
margin: 24rpx;
background-color: #fff;
border-radius: 20rpx;
.record-empty {
text-align: center;
font-size: $font-size-tag;
color: #999;
padding: 100rpx 0;
background-color: #fff;
border-radius: 20rpx;
}
.bargin_introduction_title {
display: flex;
align-items: center;
justify-content: center;
font-size: 34rpx;
color: #222222;
padding: 36rpx 0 0;
font-weight: bold;
&::before {
content: '';
background-color: #222222;
width: 20rpx;
height: 5rpx;
display: block;
margin-right: 10rpx;
}
&::after {
content: '';
background-color: #222222;
width: 20rpx;
height: 5rpx;
display: block;
margin-left: 10rpx;
}
}
.detail-content {
padding: 20rpx;
overflow: hidden;
* {
max-width: 100%;
}
img {
width: 100%;
}
}
.flow {
display: flex;
background-color: #fff;
border-radius: 20rpx;
padding: 40rpx 0;
.flow_item {
position: relative;
flex: 1;
text-align: center;
image {
width: 88rpx;
height: 88rpx;
margin-bottom: 20rpx;
}
> view {
color: #333333;
font-size: 24rpx;
}
&::after {
position: absolute;
content: '';
height: 2rpx;
width: 100rpx;
background-color: #fd0742;
top: 44rpx;
right: -22%;
}
&:last-child::after {
width: 0;
}
}
}
.bargin_invitation {
background-color: #fff;
border-radius: 20rpx;
padding: 27rpx;
.item {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 2rpx solid rgba(237, 237, 237, 0.5);
&:last-child {
border-bottom: 0;
}
.item_left {
flex: 1;
display: flex;
overflow: hidden;
align-items: center;
image {
height: 70rpx;
width: 70rpx;
border: 2rpx solid #979797;
border-radius: 50%;
margin-right: 20rpx;
}
> view {
overflow: hidden;
align-items: center;
display: flex;
color: #6d7278;
white-space: nowrap;
/* 不换行 */
text-overflow: ellipsis;
.tip {
font-size: 20rpx;
color: #666666;
}
}
.bargin_info {
display: flex;
flex-direction: column;
justify-content: left;
align-items: flex-start;
> view:last-child {
color: #999999;
font-size: $font-size-tag;
}
}
}
.item_right {
min-width: 100rpx;
color: var(--bargain-promotion-color);
font-size: $font-size-base;
font-weight: bold;
display: flex;
align-items: center;
text {
font-size: $font-size-base;
color: var(--bargain-promotion-color);
font-weight: bold;
}
.bargain-icon {
width: 44rpx;
height: 44rpx;
margin-right: 14rpx;
}
}
}
.item_more {
margin-top: 20rpx;
text-align: center;
font-size: $font-size-tag;
color: #999999;
}
}
.bargain-list {
padding: 40rpx 0;
margin: 0 24rpx;
swiper {
height: 360rpx;
&.swiper-1 {
height: 120rpx;
}
&.swiper-2 {
height: 240rpx;
}
}
.bargain-item {
background-color: #f2f2f2;
display: flex;
align-items: center;
justify-content: space-between;
padding: 16rpx 24rpx;
> view:first-child {
display: flex;
align-items: center;
}
.bargain-head {
width: 60rpx;
height: 60rpx;
margin-right: 20rpx;
border: 2rpx solid #979797;
border-radius: 50%;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.bargain-info {
.bargain-title {
font-size: 24rpx;
color: #333333;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 260rpx;
}
.bargain-desc {
font-size: 22rpx;
color: #6d7278;
}
}
.bargain-price {
text {
color: var(--bargain-promotion-color);
margin-left: 4rpx;
}
}
}
}
}
}
.bargain-popup {
width: 70vw;
background-color: #fff;
position: relative;
box-sizing: border-box;
border-radius: 20rpx;
height: 650rpx;
.head {
width: 55%;
position: absolute;
left: 50%;
top: 0;
transform: translate(-50%, -70%);
}
.title {
text-align: center;
font-size: 38rpx;
margin-top: 40rpx;
}
.money {
text-align: center;
.num {
font-size: 36rpx;
font-weight: 600;
}
.unit {
font-size: 24rpx;
margin-left: 8rpx;
}
}
&.self {
.head {
position: unset;
transform: unset;
top: 0;
left: 0;
width: 100%;
max-height: 350rpx;
}
.bargain-content {
text-align: center;
padding: 60rpx 40rpx;
.money {
font-weight: bold;
}
}
.bargain-btn {
width: max-content;
margin: 0 auto;
font-weight: bold;
padding: 0 60rpx;
background-color: var(--bargain-promotion-color);
color: #ffffff;
}
}
&.help {
.bargain-content {
.uer_info_base {
display: flex;
position: relative;
padding: 0 0;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
.user_info_img {
background-color: #fff;
width: 120rpx;
height: 120rpx;
margin-top: -240rpx;
margin-left: 0;
border-radius: 50%;
border: 2px solid var(--bargain-promotion-color);
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.user_info_name {
margin-left: 0;
align-self: center;
font-size: 30rpx;
font-weight: bold;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 100%;
}
}
.count-down {
> text {
color: #666;
margin: 0 6rpx;
}
}
}
}
}
.icon-round-close {
display: block;
font-size: 60rpx;
color: #ffffff;
text-align: center;
}
.share-popup,
.uni-popup__wrapper-box {
.share-title {
line-height: 60rpx;
font-size: $font-size-toolbar;
padding: 15rpx 0;
text-align: center;
}
.share-content {
display: flex;
display: -webkit-flex;
-webkit-flex-wrap: wrap;
-moz-flex-wrap: wrap;
-ms-flex-wrap: wrap;
-o-flex-wrap: wrap;
flex-wrap: wrap;
padding: 15rpx;
.share-box {
flex: 1;
text-align: center;
.share-btn {
margin: 0;
padding: 0;
border: none;
line-height: 1;
height: auto;
background-color: unset;
text {
margin-top: 20rpx;
font-size: $font-size-tag;
display: block;
color: $color-title;
}
}
.iconfont {
font-size: 80rpx;
line-height: initial;
}
.icon-fuzhilianjie,
.icon-pengyouquan,
.icon-haowuquan,
.icon-share-friend {
color: #07c160;
}
}
}
.share-footer {
height: 90rpx;
line-height: 90rpx;
border-top: 2rpx #f5f5f5 solid;
text-align: center;
color: #666;
}
}
.poster-layer {
/deep/ .uni-popup__wrapper.center {
width: 100vw!important;
height: 100vh!important;
background: none!important;
}
/deep/ .uni-popup__wrapper.uni-custom.center .uni-popup__wrapper-box {
max-width: 100vw!important;
max-height: 100vh!important;
background: none!important;
width: 100vw;
height: 100vh;
}
.poster-wrap {
display: flex;
align-items: center;
justify-content: center;
width: 100vw;
height: 100vh;
flex-direction: column;
}
.generate-poster {
padding: 40rpx 0;
.iconfont {
font-size: 80rpx;
color: #07c160;
line-height: initial;
}
> view {
text-align: center;
&:last-child {
margin-top: 20rpx;
}
}
}
.image-wrap {
width: 80%;
position: relative;
image {
width: 100%;
line-height: 1;
border-radius: 10rpx;
overflow: hidden;
}
}
.msg {
padding: 40rpx;
}
.save-btn {
text-align: center;
height: 80rpx;
line-height: 80rpx;
background-color: $base-color;
border-radius: 10rpx;
width: 80%;
color: #fff;
margin-top: 30rpx;
}
.save-text {
color: #fff;
margin-top: 10rpx;
}
.close {
position: absolute;
top: 0;
right: 20rpx;
width: 40rpx;
height: 80rpx;
font-size: 50rpx;
color: #999;
}
}
.goods-details img {
max-width: 100%;
}
.rule-mark-enter {
position: absolute;
top: 120rpx;
right: 0;
width: 20rpx;
height: 100rpx;
line-height: 1;
background: #fff4f4;
padding: 10rpx 20rpx 10rpx 20rpx;
border-radius: 20rpx 0 0 20rpx;
color: var(--bargain-promotion-color);
font-size: $font-size-tag;
z-index: 100;
}
.rule-wrap {
border-radius: 10rpx;
background-color: #fff;
width: 80vw;
padding: 12rpx;
box-sizing: border-box;
.content-wrap {
width: 100%;
border-radius: 8rpx;
position: relative;
.rule-head {
width: 100%;
position: absolute;
transform: translateY(-50%);
left: 0;
top: 0;
}
.rule {
max-height: 880rpx;
overflow: hidden;
padding: 80rpx 30rpx 0 30rpx;
box-sizing: border-box;
.text {
font-size: $font-size-sub;
}
}
.icon-round-close {
color: #fff;
text-align: center;
position: absolute;
bottom: -150rpx;
left: 50%;
transform: translateX(-50%);
font-size: 70rpx;
}
}
}

View File

@@ -0,0 +1,243 @@
.page {
width: 100%;
min-height: 100vh;
background: var(--bargain-promotion-color);
}
.adv-wrap {
margin: $margin-updown $margin-both;
width: auto;
}
.lineheight-clear {
line-height: 1 !important;
}
// 商品列表单列样式
.goods-list.single-column {
.goods-item {
padding: 26rpx 26rpx 20rpx;
background: #fff;
margin: $margin-updown $margin-both;
border-radius: 24rpx;
display: flex;
position: relative;
flex-direction: column;
.goods-item-content {
display: flex;
}
.goods-item-bottom {
display: flex;
justify-content: space-between;
margin-top: 10rpx;
line-height: 1;
.item-bottom-left {
display: flex;
align-items: baseline;
margin-top: 10rpx;
.delete-pirce {
text-decoration: line-through;
color: $color-sub;
margin-left: 20rpx;
}
.txt {
margin-left: 10rpx;
font-weight: 26rpx;
}
.unit,
.price {
color: var(--bargain-promotion-color) !important;
}
}
.item-bottom-right {
display: flex;
align-items: center;
font-weight: bold;
button {
color: #fff;
background-color: var(--bargain-promotion-color);
}
}
}
.goods-img {
width: 200rpx;
height: 200rpx;
overflow: hidden;
border-radius: $border-radius;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.goods-tag {
color: #fff;
line-height: 1;
padding: 8rpx 12rpx;
position: absolute;
border-top-left-radius: $border-radius;
border-bottom-right-radius: $border-radius;
top: 26rpx;
left: 26rpx;
font-size: $font-size-goods-tag;
}
.info-wrap {
flex: 1;
display: flex;
flex-direction: column;
width: calc(100% - 220rpx);
.info-sub-title {
color: $color-tip;
font-size: $font-size-tag;
margin-top: 6rpx;
}
}
.info-bottom {
display: flex;
justify-content: space-between;
margin-top: 10rpx;
align-items: center;
.sale-box {
color: var(--bargain-promotion-color);
}
.price-box {
display: flex;
line-height: 1;
.discount-price {
display: flex;
font-size: 26rpx;
line-height: 1;
margin-top: 4rpx;
}
.delete-price {
display: flex;
font-size: 26rpx;
line-height: 1;
margin-top: 4rpx;
}
.price {
line-height: 1.2;
color: var(--bargain-promotion-color);
}
}
.pro-info {
line-height: 1;
display: flex;
align-items: center;
.button-border {
border: 2rpx solid var(--bargain-promotion-color);
color: var(--bargain-promotion-color);
font-size: 24rpx;
padding: 4rpx 6rpx;
line-height: 1;
border-radius: 4rpx;
background-color: var(--bargain-promotion-color-shallow);
position: relative;
border-top-right-radius: 0;
}
.button-border::before {
content: '';
display: block;
position: absolute;
top: -10rpx;
right: -2rpx;
border-left: 10rpx solid transparent;
border-right: 0 solid transparent;
border-bottom: 10rpx solid var(--bargain-promotion-color);
}
.button-border::after {
content: '';
display: block;
position: absolute;
top: -6rpx;
right: 0rpx;
border-left: 10rpx solid transparent;
border-right: 0 solid transparent;
border-bottom: 10rpx solid var(--bargain-promotion-color-shallow);
}
}
}
.name-wrap {
flex: 1;
}
.goods-name {
font-size: $font-size-base;
line-height: 1.4;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
font-weight: bold;
word-wrap: break-word;
height: 80rpx;
}
.progress-wrap {
display: flex;
position: relative;
width: calc(100% - 32rpx);
margin: 10rpx auto;
progress {
flex: 1;
}
.progress-point {
background: var(--bargain-promotion-color);
width: 24rpx;
height: 24rpx;
border-radius: 50%;
position: absolute;
right: -12rpx;
top: -4rpx;
z-index: 1;
}
.progress-select {
background-color: var(--bargain-promotion-color);
color: var(--bargain-promotion-aux-color);
width: 24rpx;
height: 24rpx;
border-radius: 50%;
position: absolute;
left: 0;
top: -4rpx;
font-size: 24rpx;
z-index: 11;
&.icon {
width: 34rpx;
height: 34rpx;
display: flex;
align-items: center;
justify-content: center;
top: -10rpx;
}
.iconfont {
background-color: unset;
color: #fff;
font-size: 20rpx;
}
}
.txt {
margin: 0 100rpx 0 20rpx;
}
}
.member-price-tag {
display: inline-block;
width: 60rpx;
line-height: 1;
margin-left: 6rpx;
image {
width: 100%;
}
}
}
}

View File

@@ -0,0 +1,537 @@
import htmlParser from '@/common/js/html-parser';
export default {
data() {
return {
windowHeight: 0,
launch_id: 0,
bargain_id: 0,
info: {
headimg: ''
},
bargainRecord: [],
page: 1,
totalPage: 1,
load: false,
timeMachine: null,
bargainMoney: '0.00',
poster: '-1', //海报
posterMsg: '', //海报错误信息
posterHeight: 0,
goodsDetail: null,
launchInfo: null,
maxBuy: 1,
launchList: null,
showMore: false,
isOwn: 0, //是否自己砍了一刀
my_bargain_money: 0,
shareImg: ''
};
},
onLoad(data) {
setTimeout(() => {
if (!this.addonIsExist.bargain) {
this.$util.showToast({
title: '商家未开启砍价',
mask: true,
duration: 2000
});
setTimeout(() => {
this.$util.redirectTo('/pages/index/index');
}, 2000);
}
}, 1000);
// #ifdef MP-ALIPAY
let options = my.getLaunchOptionsSync();
options.query && Object.assign(data, options.query);
// #endif
this.getHeight();
if (data.l_id) this.launch_id = data.l_id;
if (data.b_id) this.bargain_id = data.b_id;
if (data.is_own) this.isOwn = data.is_own;
if (data.scene) {
var sceneParams = decodeURIComponent(data.scene);
sceneParams = sceneParams.split('&');
if (sceneParams.length) {
sceneParams.forEach(item => {
if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]);
if (item.indexOf('l_id') != -1) this.id = item.split('-')[1];
if (item.indexOf('b_id') != -1) this.bargain_id = item.split('-')[1];
if (item.indexOf('is_own') != -1) this.isOwn = item.split('-')[1];
});
}
}
// #ifdef MP-WEIXIN
this.getShareImg();
// #endif
},
onShow() {
this.getBargainInfo();
},
computed: {
progress() {
if (this.launchInfo && this.goodsDetail) {
let total = this.goodsDetail.price - this.launchInfo.floor_price,
progress = parseInt(((this.goodsDetail.price - this.launchInfo.curr_price) / total) * 100);
return isNaN(progress) ? 0 : progress;
} else {
return 0;
}
},
showNum() {
if (this.launchList && this.launchList.length < 3) {
return this.launchList.length;
} else {
return 3;
}
}
},
methods: {
timeUp() {
this.getBargainInfo();
},
getHeight() {
var self = this;
uni.getSystemInfo({
success: function (res) {
self.windowHeight = res.windowHeight - 44;
if (self.iphoneX) {
self.windowHeight = self.windowHeight - 33;
}
}
});
},
getBargainInfo() {
if (this.load) return;
this.load = true;
this.$api.sendRequest({
url: '/bargain/api/bargain/detail',
data: {
launch_id: this.launch_id,
bargain_id: this.bargain_id
},
success: res => {
if (res.code == 0) {
this.goodsDetail = res.data.goods_sku_detail;
if (this.goodsDetail.sku_spec_format) this.goodsDetail.sku_spec_format = JSON.parse(this.goodsDetail.sku_spec_format);
this.$langConfig.title(this.goodsDetail.sku_name);
this.goodsDetail.unit = this.goodsDetail.unit || "件";
// 商品SKU格式
if (this.goodsDetail.goods_spec_format) this.goodsDetail.goods_spec_format = JSON.parse(this.goodsDetail.goods_spec_format);
// if (this.goodsDetail.goods_content) this.goodsDetail.goods_content = htmlParser(this.goodsDetail.goods_content);
if (this.addonIsExist.form) {
this.getGoodsForm();
}
if (res.data.launch_info && Object.keys(res.data.launch_info).length > 0) {
this.launchInfo = res.data.launch_info;
if (this.launchInfo.status == 0) {
this.timeMachine = this.$util.countDown(this.launchInfo.end_time - res.timestamp);
}
this.launch_id = this.launchInfo.launch_id;
}
if (res.data.launch_list && Object.keys(res.data.launch_list).length > 0) {
this.launchList = res.data.launch_list;
}
//发起砍价后自砍一刀展示
if (this.isOwn && this.goodsDetail.is_own > 0 && this.launchInfo && this.launchInfo.self && this.launchInfo.my_bargain_money) {
this.my_bargain_money = this.launchInfo.my_bargain_money;
this.$refs.uniSelfBargainPopup.open();
}
//好友进来后帮砍弹出
if (this.launchInfo && !this.launchInfo.self && !this.launchInfo.cut && this.goodsDetail.bargain_status == 1) this.$refs.uniHelpPopup.open();
this.load = false;
this.getBargainRecord(1);
this.setPublicShare();
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
} else {
this.load = false;
this.$util.redirectTo('/pages_promotion/bargain/my_bargain');
}
},
fail: res => {
this.load = false;
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
getBargainRecord(page) {
if (this.load) return;
if (!this.launchInfo) return;
this.load = true;
this.$api.sendRequest({
url: '/bargain/api/bargain/record',
data: {
page: page,
id: this.launchInfo.launch_id
},
success: res => {
this.load = false;
this.totalPage = res.data.page_count;
this.page = page;
if (res.code == 0 && res.data.list.length) {
if (page == 1) {
this.bargainRecord = res.data.list;
} else {
this.bargainRecord = this.bargainRecord.concat(res.data.list);
}
}
this.showMore = false;
if (page < this.totalPage) {
this.showMore = true;
}
}
});
},
scrolltolower() {
let next = this.page + 1;
if (!this.load && next <= this.totalPage) {
this.getBargainRecord(next);
}
},
browse() {
this.$api.sendRequest({
url: '/bargain/api/bargain/browse',
data: {
bargain_id: this.goodsDetail.bargain_id
},
success: res => {
}
});
},
share() {
this.$api.sendRequest({
url: '/bargain/api/bargain/share',
data: {
bargain_id: this.goodsDetail.bargain_id
},
success: res => {
}
});
},
/**
* 刷新商品详情数据
* @param {Object} goodsSkuDetail
*/
refreshGoodsSkuDetail(goodsSkuDetail) {
Object.assign(this.goodsDetail, goodsSkuDetail);
},
// 发起砍价
createBargain() {
if (!this.storeToken) {
this.$refs.login.open('/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id);
return;
}
// #ifdef MP
this.$util.subscribeMessage('BARGAIN_COMPLETE');
// #endif
if (this.goodsDetail.sku_spec_format || this.goodsDetail.goods_form) {
this.$refs.goodsSku.show('bargain');
} else {
this.$api.sendRequest({
url: '/bargain/api/bargain/launch',
data: {
id: this.goodsDetail.id
},
success: res => {
if (res.code == 0) {
let params = {
l_id: res.data,
b_id: this.bargain_id
};
if (this.goodsDetail.is_own) params.is_own = 1;
this.$util.redirectTo('/pages_promotion/bargain/detail', params, 'redirectTo');
} else {
this.$util.showToast({
title: res.message
});
}
}
});
}
},
/**
* 立即购买,不砍了,直接买
*/
buyNow() {
let goodsFormData = uni.getStorageSync('goodFormData');
let fn = ()=>{
uni.setStorage({
key: 'bargainOrderCreateData',
data: {
launch_id: this.launchInfo.launch_id
},
success: () => {
this.$util.redirectTo('/pages_promotion/bargain/payment');
}
});
};
if(!goodsFormData && this.goodsDetail.goods_form){
this.$refs.goodsSku.show('bargain',()=>{
fn();
});
}else{
fn();
}
},
/**
* 帮好友砍价
*/
bargain() {
if (this.storeToken) {
this.$api.sendRequest({
url: '/bargain/api/bargain/bargain',
data: {
id: this.launchInfo.launch_id
},
success: res => {
if (res.code == 0) {
this.bargainMoney = parseFloat(res.data.bargain_money).toFixed(2);
this.$refs.uniHelpPopup.close();
this.$refs.uniPopup.open();
this.getBargainInfo();
} else {
this.$util.showToast({
title: res.message
});
}
}
});
} else {
this.$refs.login.open('/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id);
}
},
closePopup() {
this.$refs.uniPopup.close();
},
closeSelfPop() {
this.$refs.uniSelfBargainPopup.close();
},
// 打开分享弹出层
openSharePopup() {
this.$refs.uniSelfBargainPopup.close();
this.$refs.sharePopup.open();
this.share();
},
// 关闭分享弹出层
closeSharePopup() {
this.$refs.sharePopup.close();
},
copyUrl() {
let text = '嘿!朋友就差你这一刀了,帮一下忙呗~' + this.$config.h5Domain + '/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id;
if (this.memberInfo && this.memberInfo.member_id) text += '&source_member=' + this.memberInfo.member_id;
this.$util.copy(text, () => {
this.closeSharePopup();
});
},
toBargainRecode() {
let view = uni.createSelectorQuery().select('.bargin_introduction');
view.boundingClientRect(data => {
uni.pageScrollTo({
duration: 100,
scrollTop: data.top + 100
});
}).exec();
},
/**
* 设置公众号分享
*/
setPublicShare() {
let shareUrl = this.$config.h5Domain + '/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id;
if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id;
this.$util.setPublicShare({
title: this.goodsDetail.sku_name,
desc: '嘿!朋友就差你这一刀了,帮一下忙呗~',
link: shareUrl,
imgUrl: this.goodsDetail.sku_image
},
res => {
// console.log('公众号分享成功');
// this.share();
}
);
},
//-------------------------------------海报-------------------------------------
// 打开海报弹出层
openPosterPopup() {
this.getGoodsPoster();
this.$refs.sharePopup.close();
},
// 关闭海报弹出层
closePosterPopup() {
this.$refs.posterPopup.close();
},
/**
* 获取海报
*/
getGoodsPoster() {
uni.showLoading({
title: '海报生成中...'
});
//活动海报信息
let posterParams = {
l_id: this.launch_id,
b_id: this.bargain_id,
bargain_id: this.goodsDetail.bargain_id
};
if (this.memberInfo && this.memberInfo.member_id) posterParams.source_member = this.memberInfo.member_id;
this.$api.sendRequest({
url: '/bargain/api/goods/poster',
data: {
page: '/pages_promotion/bargain/detail',
qrcode_param: JSON.stringify(posterParams)
},
success: res => {
if (res.code == 0) {
this.poster = res.data.path + '?time=' + new Date().getTime();
this.$refs.posterPopup.open();
} else {
this.posterMsg = res.message;
this.$util.showToast({
title: this.posterMsg
})
}
uni.hideLoading();
},
fail: err => {
uni.hideLoading();
}
});
},
getNewArray(array, subGroupLength) {
if (array) {
let index = 0;
let newArray = [];
while (index < array.length) {
newArray.push(array.slice(index, (index += subGroupLength)));
}
return newArray;
}
},
toDetail(goods_id) {
this.$util.redirectTo('/pages/goods/detail', {
goods_id: goods_id
});
},
/**
* 获取分享图
*/
getShareImg() {
let posterParams = {
l_id: this.launch_id,
b_id: this.bargain_id,
bargain_id: this.bargain_id
};
this.$api.sendRequest({
url: '/bargain/api/goods/shareimg',
data: {
page: '/pages_promotion/bargain/launch',
qrcode_param: JSON.stringify(posterParams)
},
success: res => {
if (res.code == 0) this.shareImg = res.data.path;
}
});
},
openRulePopup() {
this.$refs.rulePopup.open();
},
closeRulePopup() {
this.$refs.rulePopup.close();
},
/**
* 获取商品表单
*/
getGoodsForm() {
this.$api.sendRequest({
url: "/form/api/form/goodsform",
data: {
goods_id: this.goodsDetail.goods_id
},
success: res => {
if (res.code == 0 && res.data) {
this.$set(this.goodsDetail, 'goods_form', res.data);
let goodsFormData = uni.getStorageSync('goodFormData');
// 检测是否填写过自定义表单,已经发起砍价后,禁止切换规格
if (!goodsFormData && this.launchInfo && this.goodsDetail.goods_spec_format) {
this.goodsDetail.goods_spec_format.forEach(item => {
item.value.forEach(specItem => {
for (var i = 0; i < this.goodsDetail.sku_spec_format.length; i++) {
let skuItem = this.goodsDetail.sku_spec_format[i];
if (skuItem.spec_id == specItem.spec_id && skuItem.spec_value_id != specItem.spec_value_id) {
specItem.disabled = true;
break;
}
}
});
});
}
}
}
});
}
},
filters: {
/**
* 字符掩饰输出
* @param {Object} str
*/
cover(str) {
if (typeof str == 'string' && str.length > 0) {
return str.substr(0, 1) + '******' + str.substr(-1);
} else {
return '';
}
}
},
/**
* 自定义分享内容
*/
onShareAppMessage() {
var path = '/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id;
if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id;
this.share();
return {
title: '嘿!朋友就差你这一刀了,帮一下忙呗~',
imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsDetail.sku_image, {
size: 'big'
}),
path: path,
success: res => {
},
fail: res => {
},
complete: res => {
}
};
}
}

View File

@@ -0,0 +1,340 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view>
<view class="combo-package" :class="isIphoneX ? 'combo-iphonex' : ''">
<view class="combo-package-content">
<view class="combo-package-name color-title">{{ combo.bl_name }}</view>
<view v-for="(item, index) in combo.bundling_goods" :key="index" class="goods-info" @click="toGoodsDetail(item)">
<view class="goods-img">
<view class="img-wrap"><image :src="$util.img(item.sku_image, { size: 'mid' })" @error="imageError(index)" mode="aspectFit" /></view>
</view>
<view class="data-info">
<view class="goods-name">{{ item.sku_name }}</view>
<view class="price-wrap">
<text class="unit price-style small">{{ $lang('common.currencySymbol') }}</text>
<text class="price price-style large">{{ parseFloat(item.price).toFixed(2).split(".")[0] }}</text>
<text class="unit price-style small">.{{ parseFloat(item.price).toFixed(2).split(".")[1] }}</text>
<text class="num">x1</text>
</view>
<view class="stock-tips color-base-text" v-if="item.stock < num">
库存不足剩余{{ item.stock }}
<block v-if="item.unit">{{ item.unit }}</block>
<block v-else></block>
</view>
</view>
</view>
</view>
<view class="footer" :class="isIphoneX ? 'padding-bottom' : ''">
<view class="price-wrap">
<text class="label">套餐价</text>
<text class="unit price-color">{{ $lang('common.currencySymbol') }}</text>
<text class="price price-color">{{ parseFloat(packagePrice).toFixed(2).split(".")[0] }}</text>
<text class="unit price-color">.{{ parseFloat(packagePrice).toFixed(2).split(".")[1] }}</text>
<!-- <text class="info-num">为您节省{{ $lang('common.currencySymbol') }} {{ saveThePrice }}</text> -->
</view>
<button class="footer-btn mini" v-if="isDisabled" type="primary" @click="comboBuy()" size="mini">立即购买</button>
<button class="footer-btn mini" v-else disabled>立即购买</button>
</view>
</view>
<!-- 悬浮按钮 -->
<hover-nav></hover-nav>
<loading-cover ref="loadingCover"></loading-cover>
<ns-login ref="login"></ns-login>
<!-- #ifdef MP-WEIXIN -->
<!-- 小程序隐私协议 -->
<privacy-popup ref="privacyPopup"></privacy-popup>
<!-- #endif -->
</view>
</template>
<script>
export default {
data() {
return {
num: 1, //购买数量
blId: 0, //商品id
combo: [],
packagePrice: [], //套餐价
saveThePrice: 0, //节省价格
isDisabled: false, //按钮失效
isIphoneX: false //判断是否是iphoneX以上的设备
};
},
onLoad(e) {
this.blId = e.bl_id || 0;
this.isIphoneX = this.$util.uniappIsIPhoneX();
},
onShow() {
setTimeout( () => {
if (!this.addonIsExist.bundling) {
this.$util.showToast({
title: '商家未开启组合套餐',
mask: true,
duration: 2000
});
setTimeout(() => {
this.$util.redirectTo('/pages/index/index');
}, 2000);
}
},1000);
this.getDetail();
},
onHide() {
this.btnSwitch = true;
},
methods: {
// 获取套餐详情
getDetail() {
this.$api.sendRequest({
url: '/bundling/api/bundling/detail',
data: {
bl_id: this.blId
},
success: res => {
if (res.data) {
this.combo = res.data;
this.numberChange();
} else {
this.$util.showToast({
title: res.message
});
}
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
},
fail: res => {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
}
});
},
toGoodsDetail(e) {
this.$util.redirectTo('/pages/goods/detail', { goods_id: e.goods_id });
},
numberChange(flag, callback) {
setTimeout(() => {
var disabledCount = 0;
// 防止空
if (flag && this.num.length == 0) {
this.num = 1;
disabledCount++;
}
// 防止输入0和负数、非法输入
if (flag && (this.num <= 0 || isNaN(this.num))) {
this.number = 1;
disabledCount++;
}
if (flag) this.num = parseInt(this.num);
var price = 0;
for (var i = 0; i < this.combo.bundling_goods.length; i++) {
price += parseFloat(this.combo.bundling_goods[i].price);
//检测库存
if (this.combo.bundling_goods[i].stock < this.num) disabledCount++;
}
this.isDisabled = !(disabledCount > 0);
this.saveThePrice = ((price - this.combo.bl_price) * this.num).toFixed(2);
this.packagePrice = (this.combo.bl_price * this.num).toFixed(2);
if (callback) callback();
}, 0);
},
// 套餐立即购买点击
async comboBuy() {
if (!this.isDisabled) return;
//纠正数量
this.numberChange(true, () => {
if (!this.storeToken) {
this.$refs.login.open('/pages_promotion/bundling/detail?bl_id=' + this.blId);
return;
}
if (this.btnSwitch == false) return;
this.btnSwitch = false;
var data = {
bl_id: this.blId,
num: this.num
};
uni.setStorage({
key: 'comboOrderCreateData',
data: data,
success: () => {
this.$util.redirectTo('/pages_promotion/bundling/payment');
this.btnSwitch = true;
}
});
});
},
imageError(index) {
this.combo.bundling_goods[index].sku_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
}
},
onShareAppMessage(res) {
var title = '购买套餐,优惠多多哦';
var path = '/pages_promotion/combo/detail?bl_id=' + this.blId;
return {
title: title,
path: path,
success: res => {},
fail: res => {}
};
}
};
</script>
<style lang="scss">
.combo-package {
border-radius: $border-radius;
margin: 20rpx 30rpx;
margin-bottom: 160rpx;
background: #ffffff;
&.combo-iphonex {
margin-bottom: 230rpx;
}
.combo-package-content {
// padding-bottom: 40rpx;
.combo-package-name {
padding: 20rpx 30rpx;
}
.goods-info {
overflow: hidden;
padding: $padding 30rpx;
border-radius: $border-radius;
.goods-img {
display: inline-block;
width: 30%;
text-align: center;
line-height: 100%;
float: left;
.img-wrap {
display: inline-block;
width: 180rpx;
height: 180rpx;
text-align: center;
border-radius: $border-radius;
image {
height: 100%;
width: 100%;
vertical-align: middle;
}
}
}
.data-info {
display: inline-block;
width: 66%;
float: left;
position: relative;
margin-left: 20rpx;
height: 180rpx;
.goods-name {
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
display: -webkit-box;
line-height: 150%;
// margin-bottom: 20rpx;
}
.stock-tips {
position: absolute;
width: 100%;
bottom: 50rpx;
height: 40rpx;
line-height: 40rpx;
font-size: $font-size-tag;
}
.price-wrap {
height: 50rpx;
line-height: 50rpx;
position: absolute;
width: 100%;
bottom: 0;
.unit {
font-weight: bold;
font-size: $font-size-tag;
margin-right: 4rpx;
}
.price {
font-weight: bold;
font-size: $font-size-toolbar;
}
.num {
float: right;
}
}
}
}
}
.footer {
width: 100%;
background: #fff;
display: flex;
justify-content: space-between;
padding: 20rpx 24rpx;
box-sizing: border-box;
position: fixed;
bottom: 0;
left: 0;
.price-wrap {
flex: 1;
text-align: right;
vertical-align: middle;
line-height: 70rpx;
margin-right: 30rpx;
.label {
font-size: $font-size-base;
}
.unit {
font-weight: bold;
font-size: $font-size-tag;
margin-right: 4rpx;
}
.price {
font-weight: bold;
font-size: $font-size-toolbar;
}
.info-num {
font-size: $font-size-activity-tag;
color: $color-tip;
line-height: 1;
margin-top: 12rpx;
}
}
.footer-btn {
display: flex;
align-items: center;
justify-content: center;
height: 70rpx;
line-height: 70rpx;
}
}
.padding-bottom {
padding-bottom: 80rpx;
}
}
</style>

View File

@@ -0,0 +1,49 @@
<template>
<page-meta :page-style="themeColor"></page-meta>
<view>
<common-payment :api="api" create-data-key="comboOrderCreateData" ref="payment"></common-payment>
</view>
</template>
<script>
export default {
data() {
return {
api: {
payment: '/bundling/api/ordercreate/payment',
calculate: '/bundling/api/ordercreate/calculate',
create: '/bundling/api/ordercreate/create'
}
}
},
provide() {
return {
promotion: this.promotion.bind(this)
}
},
onShow() {
if (this.$refs.payment) this.$refs.payment.pageShow();
},
methods: {
promotion(data){
if (data.bunding_info) {
return {title: '组合套餐', content: data.bunding_info.bl_name}
}
}
}
};
</script>
<style scoped lang="scss">
/deep/ .uni-popup__wrapper.uni-custom .uni-popup__wrapper-box {
background: none;
max-height: unset !important;
overflow-y: hidden !important;
}
/deep/ .uni-popup__wrapper {
border-radius: 20rpx 20rpx 0 0;
}
/deep/ .uni-popup {
z-index: 8;
}
</style>

View File

@@ -33,14 +33,11 @@ Date.prototype.pattern = function(fmt) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
} }
if (/(E+)/.test(fmt)) { if (/(E+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[this.getDay() + ""]);
"") +
week[this.getDay() + ""]);
} }
for (var k in o) { for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) { if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
.length)));
} }
} }
return fmt; return fmt;
@@ -110,7 +107,7 @@ const resDateStr = function(timer, constTime) {
return Math.floor(timer / 60 / 60) + "小时前"; return Math.floor(timer / 60 / 60) + "小时前";
} else { } else {
return 'next' return 'next'
}; }
} }
let _dd = function(timer, constTime) { let _dd = function(timer, constTime) {
let today = _time_.getTodayUnix(); let today = _time_.getTodayUnix();
@@ -141,6 +138,7 @@ timeProto.getFormatTime = function(constTime, max) {
break; break;
case 'String': case 'String':
constTime = constTime.replace(reg, "/"); constTime = constTime.replace(reg, "/");
break;
default: default:
constTime = new Date(constTime).getTime(); constTime = new Date(constTime).getTime();
break; break;

View File

@@ -56,8 +56,7 @@ export function initData(appointedDay = '') {
const timeObj = {} const timeObj = {}
timeObj.date = timeStamp(now + timeStr * i).date //保存日期 timeObj.date = timeStamp(now + timeStr * i).date //保存日期
timeObj.timeStamp = now + timeStr * i //保存时间戳 timeObj.timeStamp = now + timeStr * i //保存时间戳
timeObj.week = appointedDay == '' ? (obj[i] ?? timeStamp(now + timeStr * i).day) : timeStamp(now + timeStr * i) timeObj.week = appointedDay == '' ? (obj[i] ?? timeStamp(now + timeStr * i).day) : timeStamp(now + timeStr * i).day
.day
time.push(timeObj) time.push(timeObj)
} }
return time return time

View File

@@ -12,6 +12,7 @@
<view <view
class="quick-nav-item" class="quick-nav-item"
v-for="item in categoryList" v-for="item in categoryList"
:key="item.category_id"
:class="{ selected: categoryId == item.category_id }" :class="{ selected: categoryId == item.category_id }"
@click="changeCategory(item.category_id)" @click="changeCategory(item.category_id)"
> >

View File

@@ -26,7 +26,7 @@
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true" @scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh" refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh"
@refresherrestore="onRestore"> @refresherrestore="onRestore">
<view class="child-category" v-for="(item, index) in categoryTree" :id="'category-' + index" v-if="item.child_list.length > 0"> <view class="child-category" v-for="(item, index) in categoryTree" :id="'category-' + index" v-if="item.child_list.length > 0" :key="item.category_id || index">
<!----> <!---->
<view class="item-wrap category"> <view class="item-wrap category">
<view class="category-title">{{ item.category_name }}</view> <view class="category-title">{{ item.category_name }}</view>

View File

@@ -5,7 +5,10 @@
<view class="help-meta" v-if="detail.is_show_release_time == 1"> <view class="help-meta" v-if="detail.is_show_release_time == 1">
<text class="help-time">发表时间: {{ $util.timeStampTurnTime(detail.create_time) }}</text> <text class="help-time">发表时间: {{ $util.timeStampTurnTime(detail.create_time) }}</text>
</view> </view>
<view class="help-content"><rich-text :nodes="content"></rich-text></view> <view class="help-content">
<!-- <rich-text :nodes="content"></rich-text> -->
<ns-mp-html :content="content"></ns-mp-html>
</view>
<view class="bottom-area"> <view class="bottom-area">
<view v-if="detail.is_show_read_num == 1"> <view v-if="detail.is_show_read_num == 1">
阅读 阅读
@@ -16,6 +19,8 @@
人已赞 人已赞
</view> </view>
</view> </view>
<!-- 悬浮按钮 -->
<hover-nav></hover-nav>
<loading-cover ref="loadingCover"></loading-cover> <loading-cover ref="loadingCover"></loading-cover>
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
@@ -60,7 +65,8 @@
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
this.detail = res.data; this.detail = res.data;
this.$langConfig.title(this.detail.article_title); this.$langConfig.title(this.detail.article_title);
this.content = htmlParser(this.detail.article_content); // this.content = htmlParser(this.detail.article_content);
this.content = this.detail.article_content;
this.setPublicShare(); this.setPublicShare();
} else { } else {
this.$util.showToast({ this.$util.showToast({

Some files were not shown because too many files have changed in this diff Show More