Commit bf3f2d86 authored by 徐光星's avatar 徐光星

Merge branch 'feat/group-buy' into 'master'

Feat/group buy

See merge request !5
parents 23e7529f 905e024b
src/assets/images/defeat.png

12.7 KB | W: | H:

src/assets/images/defeat.png

16.8 KB | W: | H:

src/assets/images/defeat.png
src/assets/images/defeat.png
src/assets/images/defeat.png
src/assets/images/defeat.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/success.png

16.2 KB | W: | H:

src/assets/images/success.png

21.4 KB | W: | H:

src/assets/images/success.png
src/assets/images/success.png
src/assets/images/success.png
src/assets/images/success.png
  • 2-up
  • Swipe
  • Onion skin
<template> <template>
<div class="avator-group"> <div class="avator-group">
<div <div v-for="(item, index) in avators.slice(0, 9)" :key="index" class="avator-item">
v-for="(item, index) in avators.slice(0, 9)"
:key="index"
class="avator-item"
:style="widthStyle"
>
<cr-image <cr-image
class="avator-img" class="avator-img"
:class="{ avator: index == 0 }" :class="{ avator: index == 0 }"
...@@ -32,13 +27,12 @@ ...@@ -32,13 +27,12 @@
</div> </div>
</div> </div>
<div <div
v-for="n in placeholderNum" v-for="(val, idx) in placeholderNum"
:key="`placeholder-${n}`" :key="`placeholder-${idx}`"
class="placeholder" class="placeholder"
:class="{ leader: avators.length == 0 }" :class="{ leader: avators.length == 0 }"
:style="widthStyle"
> >
<template v-if="avators.length == 0 && n == 1"> <template v-if="avators.length == 0 && idx == 0">
<div class="is-leader"> <div class="is-leader">
<cr-image class="crown" width="" height="" src="@/assets/images/leaderIcon.png" /> <cr-image class="crown" width="" height="" src="@/assets/images/leaderIcon.png" />
</div> </div>
...@@ -52,9 +46,9 @@ ...@@ -52,9 +46,9 @@
</div> </div>
<div class="border" /> <div class="border" />
</template> </template>
<div class="content" :class="{ avator: avators.length == 0 && n == 1 }">?</div> <div class="content" :class="{ avator: avators.length == 0 && idx == 0 }">?</div>
</div> </div>
<div v-if="groupHC >= 10" class="more" :style="widthStyle" @click="showMoreAvator"> <div v-if="groupHC >= 10" class="more" @click="showMoreAvator">
<div class="content" /> <div class="content" />
</div> </div>
<template v-if="showDialogSlot"> <template v-if="showDialogSlot">
...@@ -71,12 +65,7 @@ ...@@ -71,12 +65,7 @@
justify-content: center; justify-content: center;
" "
> >
<div <div v-for="(item, index) in avators" :key="index" class="avator-item">
v-for="(item, index) in avators"
:key="index"
class="avator-item"
:style="widthStyle"
>
<cr-image <cr-image
:key="index" :key="index"
:class="{ avator: index == 0 }" :class="{ avator: index == 0 }"
...@@ -99,6 +88,7 @@ ...@@ -99,6 +88,7 @@
src="@/assets/images/leader-name.png" src="@/assets/images/leader-name.png"
/> />
</div> </div>
<div class="border" />
</div> </div>
</div> </div>
</cr-dialog> </cr-dialog>
...@@ -126,16 +116,18 @@ export default { ...@@ -126,16 +116,18 @@ export default {
computed: { computed: {
placeholderNum() { placeholderNum() {
// 问号头像展位数量 // 问号头像展位数量
let num = 0;
if (this.groupHC >= 10) { if (this.groupHC >= 10) {
// 用9去减是因为有个展示更多的按钮 // 用9去减是因为有个展示更多的按钮
return 9 - this.avators.length < 0 ? 0 : 9 - this.avators.length; num = 9 - this.avators.length < 0 ? 0 : 9 - this.avators.length;
} else { } else {
return this.groupHC - this.avators.length < 0 ? 0 : this.groupHC - this.avators.length; num = this.groupHC - this.avators.length < 0 ? 0 : this.groupHC - this.avators.length;
}
const arr = [];
for (let i = 0; i < num; i++) {
arr.push({});
} }
}, return arr;
widthStyle() {
// 用于单个头像不能占一排
return this.avators.length == 6 ? { width: '25%' } : { width: '20%' };
} }
}, },
created() { created() {
...@@ -168,14 +160,14 @@ export default { ...@@ -168,14 +160,14 @@ export default {
} }
.border { .border {
position: absolute; position: absolute;
top: 0; top: -1px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
background: url('../assets/images/leaderBorder.png'); background: url('../assets/images/leaderBorder.png');
background-size: cover; background-size: cover;
z-index: 2; z-index: 2;
width: 44px; width: 48px;
height: 100%; height: 48px;
} }
.avator { .avator {
// background: url('../assets/images/leaderBorder.png'); // background: url('../assets/images/leaderBorder.png');
...@@ -201,8 +193,8 @@ export default { ...@@ -201,8 +193,8 @@ export default {
} }
.is-leader { .is-leader {
position: absolute; position: absolute;
right: 4px; right: 2px;
top: -9px; top: -10px;
z-index: 3; z-index: 3;
.crown { .crown {
width: 22px; width: 22px;
......
...@@ -170,8 +170,8 @@ export default { ...@@ -170,8 +170,8 @@ export default {
// 获取地址列表 // 获取地址列表
async getAddrList(addrId = '', index = 0) { async getAddrList(addrId = '', index = 0) {
const areaData = JSON.parse(JSON.stringify(this.areaData)); // 浅拷贝 const areaData = JSON.parse(JSON.stringify(this.areaData)); // 浅拷贝
const res = await address.zoneList(addrId); // 获取地址列表默认取一级 const [res] = await address.zoneList(addrId); // 获取地址列表默认取一级
const addrList = res[0].addrList || []; const addrList = res.addrList || [];
areaData[index] = addrList; areaData[index] = addrList;
if (addrList && addrList.length) { if (addrList && addrList.length) {
// 点击最后一级别addrId 所得addrList数据为空 // 点击最后一级别addrId 所得addrList数据为空
......
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
</template> </template>
</div> </div>
<div <div
v-for="num in maxCount - avatorList.length" v-for="(val, idx) in placeholderArr"
:key="`placeholder${num}`" :key="`placeholder${idx}`"
class="item placeholder" class="item placeholder"
style="width: 94px;height: 94px;margin: 0 21px;font-size: 34px;" style="width: 94px;height: 94px;margin: 0 21px;font-size: 34px;"
/> />
...@@ -59,8 +59,8 @@ ...@@ -59,8 +59,8 @@
</div> </div>
</div> </div>
<div <div
v-for="num in maxCount - avatorList.length" v-for="(val, idx) in placeholderArr"
:key="`placeholder${num}`" :key="`placeholder${idx}`"
class="item placeholder" class="item placeholder"
style="width: 94px;height: 94px;margin: 0 21px;font-size: 34px;" style="width: 94px;height: 94px;margin: 0 21px;font-size: 34px;"
/> />
...@@ -143,6 +143,16 @@ export default { ...@@ -143,6 +143,16 @@ export default {
skuName: '' // 兼容safari做的特殊处理,每个文字都加一个span标签 skuName: '' // 兼容safari做的特殊处理,每个文字都加一个span标签
}; };
}, },
computed: {
placeholderArr() {
const arr = [];
const num = this.maxCount - this.avatorList.length;
for (let i = 0; i < num; i++) {
arr.push({});
}
return arr;
}
},
methods: { methods: {
// 参团人数小于7时,头像全部显示;大于时展示6个头像... // 参团人数小于7时,头像全部显示;大于时展示6个头像...
handleAvator(sharePicData) { handleAvator(sharePicData) {
...@@ -167,48 +177,70 @@ export default { ...@@ -167,48 +177,70 @@ export default {
} }
return n; return n;
}, },
async prepare(rawData) { // async prepare(rawData) {
this.sharePicData = rawData; // this.sharePicData = rawData;
// this.handleAvator(rawData);
this.handleAvator(rawData); // // 将每个字符套入行内标签,用于解决canvas fillText的不换行问题
// let skuName = '';
// const originSkuName = rawData.skuName || '';
// for (let i = 0; i < originSkuName.length; i++) {
// skuName += `<span>${originSkuName[i]}</span>`;
// }
// this.skuName = skuName;
// const [endTimeYMD, endTimeHMS = ''] = (rawData.endTime && rawData.endTime.split(' ')) || [];
// if (endTimeYMD) {
// const day = new Date(endTimeYMD);
// this.endTime = `${day.getMonth() + 1}月${day.getDate()}日 ${endTimeHMS}`;
// }
// const [qrcodeUrl] = await groupBuyApi.getQrcodeUrl(rawData);
// this.qrcodeUrl = qrcodeUrl;
// },
async createAndUploadPic(sharePicData) {
console.log(JSON.stringify(sharePicData), '分享海报所需数据');
this.$store.dispatch('change_loading_pic', true);
this.sharePicData = sharePicData;
this.handleAvator(sharePicData);
// 将每个字符套入行内标签,用于解决canvas fillText的不换行问题 // 将每个字符套入行内标签,用于解决canvas fillText的不换行问题
let skuName = ''; let skuName = '';
const originSkuName = rawData.skuName || ''; const originSkuName = sharePicData.skuName || '';
for (let i = 0; i < originSkuName.length; i++) { for (let i = 0; i < originSkuName.length; i++) {
skuName += `<span>${originSkuName[i]}</span>`; skuName += `<span>${originSkuName[i]}</span>`;
} }
this.skuName = skuName; this.skuName = skuName;
const [endTimeYMD, endTimeHMS = ''] = (rawData.endTime && rawData.endTime.split(' ')) || []; const [endTimeYMD, endTimeHMS = ''] =
(sharePicData.endTime && sharePicData.endTime.split(' ')) || [];
if (endTimeYMD) { if (endTimeYMD) {
const day = new Date(endTimeYMD); const day = new Date(endTimeYMD);
this.endTime = `${day.getMonth() + 1}${day.getDate()}${endTimeHMS}`; this.endTime = `${day.getMonth() + 1}${day.getDate()}${endTimeHMS}`;
} }
const [qrcodeUrl] = await groupBuyApi.getQrcodeUrl(rawData); const [qrcodeUrl] = await groupBuyApi.getQrcodeUrl(sharePicData);
this.qrcodeUrl = qrcodeUrl; this.qrcodeUrl = qrcodeUrl;
},
async createAndUploadPic(sharePicData) {
this.$store.dispatch('change_loading_pic', true);
await this.prepare(sharePicData);
this.$nextTick(() => { this.$nextTick(() => {
html2canvas(this.$refs.sharePic, { setTimeout(() => {
width: 1080, html2canvas(this.$refs.sharePic, {
height: 1920, width: 1080,
useCORS: true, height: 1920,
scale: 1, useCORS: true,
allowTaint: false scale: 1,
}) allowTaint: false
.then(canvas => {
canvas.name = `${this.randomString()}.jpeg`;
canvas.toBlob(blob => this.uploadPic(blob), 'image/jpeg', 0.85);
}) })
.catch(error => { .then(canvas => {
this.errorHandler(error); canvas.name = `${this.randomString()}.jpeg`;
}); canvas.toBlob(blob => this.uploadPic(blob), 'image/jpeg', 0.85);
})
.catch(error => {
this.errorHandler(error);
});
}, 300);
}); });
}, },
// 上传海报到七牛,成功后触发outputPicUr事件,参数是七牛文件地址 // 上传海报到七牛,成功后触发outputPicUr事件,参数是七牛文件地址
......
...@@ -12,6 +12,7 @@ import Raven from 'raven-js'; ...@@ -12,6 +12,7 @@ import Raven from 'raven-js';
import RavenVue from 'raven-js/plugins/vue'; import RavenVue from 'raven-js/plugins/vue';
import { release } from '../.sentryclirc'; import { release } from '../.sentryclirc';
import lazyload from '@qg/cherry-ui/src/lazyload/index'; import lazyload from '@qg/cherry-ui/src/lazyload/index';
import 'intersection-observer';
if (process.env.SENTRY_ENV !== 'test' && process.env.NODE_ENV === 'production') { if (process.env.SENTRY_ENV !== 'test' && process.env.NODE_ENV === 'production') {
Raven.config('//8d1b2a5f74bb42ad806e52a11b1173f2@sentry.q-gp.com/80', { Raven.config('//8d1b2a5f74bb42ad806e52a11b1173f2@sentry.q-gp.com/80', {
release, release,
......
...@@ -55,6 +55,7 @@ export default { ...@@ -55,6 +55,7 @@ export default {
const params = { const params = {
editAddress: item editAddress: item
}; };
console.log(params, JSON.stringify(params));
this.$router.push({ this.$router.push({
name: 'addressManage', name: 'addressManage',
params, params,
......
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
v-model="address.receiverPhoneNo" v-model="address.receiverPhoneNo"
class="address-input" class="address-input"
name="手机号码" name="手机号码"
type="tel"
max-length="11"
label="手机号码" label="手机号码"
placeholder="请输入收货人手机号码" placeholder="请输入收货人手机号码"
/> />
...@@ -99,13 +97,15 @@ export default { ...@@ -99,13 +97,15 @@ export default {
firstGroupShare(); firstGroupShare();
this.type = this.$route.query.type || ''; this.type = this.$route.query.type || '';
this.order = this.$route.query.type || false; this.order = this.$route.query.type || false;
console.log(this.order);
if (this.type === 'edit') { if (this.type === 'edit') {
console.log(this.$route.params);
const data = { ...this.$route.params.editAddress }; const data = { ...this.$route.params.editAddress };
data.addrFullName = data.addrFullName if (data.addrFullName) {
.substring(0, data.addrFullName.length - data.detail.length) data.addrFullName = data.addrFullName
.replace(/()/g, ''); .substring(0, data.addrFullName.length - data.detail.length)
this.address = data; .replace(/()/g, '');
this.address = data;
}
} }
}, },
methods: { methods: {
......
...@@ -50,25 +50,26 @@ ...@@ -50,25 +50,26 @@
</template> </template>
<template v-else> <template v-else>
<cr-button <cr-button
v-if="info.groupBuyStatus == 1" class="mutiplie"
shape="circle" shape="circle"
plain
:disabled="disabled" :disabled="disabled"
type="primary" type="primary"
block block
@click="shareTo" @click="toList"
> >
邀请好友 查看活动详情
</cr-button> </cr-button>
<cr-button <cr-button
v-if="info.groupBuyStatus != 1 && !timeIsOver" v-if="info.groupBuyStatus == 1"
class="mutiplie"
shape="circle" shape="circle"
plain
:disabled="disabled" :disabled="disabled"
type="primary" type="primary"
block block
@click="toList" @click="shareTo"
> >
查看其他商品 邀请好友
</cr-button> </cr-button>
</template> </template>
</div> </div>
...@@ -110,18 +111,9 @@ export default { ...@@ -110,18 +111,9 @@ export default {
}, },
data() { data() {
return { return {
nativeBridge: null, nativeBridge: null
timeIsOver: false
}; };
}, },
created() {
if (this.status == 2) {
// 订单详情页
const currentTime = new Date(this.currentTime.replace(/\-/g, '/')).getTime();
const endTime = new Date(this.endTime.replace(/\-/g, '/')).getTime();
this.timeIsOver = currentTime >= endTime ? true : false;
}
},
methods: { methods: {
toList() { toList() {
const { activityId } = this.$route.query || ''; const { activityId } = this.$route.query || '';
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
<div class="group-info-desc"> <div class="group-info-desc">
<div class="desc-item"> <div class="desc-item">
<template v-if="groupInfo.groupBuyStatus == 1"> <template v-if="groupInfo.groupBuyStatus == 1">
<!-- 拼团中状态 -->
<template v-if="!groupInfo.joinGroup && !groupInfo.canJoinGroupBuyAgain"> <template v-if="!groupInfo.joinGroup && !groupInfo.canJoinGroupBuyAgain">
<!-- 您不符合参与此团的条件 --> <!-- 您不符合参与此团的条件 -->
</template> </template>
<template v-else> <template v-else>
<p class="desc"> <p class="desc inProcess">
还差<span>{{ groupInfo.groupBuyNeedUserCount }}</span>成团,距结束仅剩 还差<span>{{ groupInfo.groupBuyNeedUserCount }}</span>成团,距结束仅剩
</p> </p>
<countDown v-if="!!timestemp" :block-no-bg="true" :end-time="timestemp" from="desc" /> <countDown v-if="!!timestemp" :block-no-bg="true" :end-time="timestemp" from="desc" />
...@@ -14,11 +15,16 @@ ...@@ -14,11 +15,16 @@
</template> </template>
<template v-else> <template v-else>
<template v-if="groupInfo.groupBuyStatus != 2"> <template v-if="groupInfo.groupBuyStatus != 2">
<p class="desc"> <!-- 拼团非成功状态 -->
<p v-if="groupInfo.groupBuyStatus == 3" class="desc">
{{ groupInfo.failedReason || statusTextMap[groupInfo.groupBuyStatus] }}
</p>
<p v-else class="desc">
{{ statusTextMap[groupInfo.groupBuyStatus] }} {{ statusTextMap[groupInfo.groupBuyStatus] }}
</p> </p>
</template> </template>
<template v-else> <template v-else>
<!-- 拼团成功 -->
<p v-if="groupInfo.joinGroup" class="desc"> <p v-if="groupInfo.joinGroup" class="desc">
{{ statusTextMap[groupInfo.groupBuyStatus] }} {{ statusTextMap[groupInfo.groupBuyStatus] }}
</p> </p>
...@@ -26,36 +32,40 @@ ...@@ -26,36 +32,40 @@
</template> </template>
</template> </template>
</div> </div>
<div class="gourp-rules"> <div
<template v-if="groupInfo.groupBuyStatus == 1 || groupInfo.groupBuyStatus == 0"> v-if="
<p>成团条件:{{ groupInfo.groupBuyCondition || '' }}</p> (groupInfo.groupBuyStatus == 1 || groupInfo.groupBuyStatus == 0) &&
<cr-image src="@/assets/images/flag.png" width="13px" /> groupInfo.groupBuyNeedNewUserCount
</template> "
<!-- </template> --> class="gourp-rules"
>
<p>成团条件:{{ groupInfo.groupBuyCondition || '' }}</p>
<cr-image src="@/assets/images/flag.png" width="13px" />
</div> </div>
<div v-if="showButtonGroup" ref="buttonArea" class="button-area"> <div v-if="showButtonGroup" ref="buttonArea" class="button-area">
<cr-button <div v-if="groupInfo.groupBuyStatus == 1" class="shareToButton">
v-if="groupInfo.groupBuyStatus == 1" <cr-button block shape="circle" type="primary" @click="share">邀请好友</cr-button>
block </div>
shape="circle" <div class="toListButton">
type="primary" <cr-button
@click="share" plain
>邀请好友</cr-button block
> shape="circle"
<cr-button type="default"
v-if="groupInfo.groupBuyStatus != 1 && !timeIsOver" class="toOrderList"
plain @click="toOrderList"
block >查看我的拼团</cr-button
shape="circle" >
type="primary" <cr-button plain block shape="circle" type="primary" @click="toList"
@click="toList" >返回活动列表</cr-button
>查看其他商品</cr-button >
> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import countDown from '@/components/countDown'; import countDown from '@/components/countDown';
import { saTrackEvent } from '@/service/sa.service';
export default { export default {
components: { components: {
countDown countDown
...@@ -75,11 +85,7 @@ export default { ...@@ -75,11 +85,7 @@ export default {
return {}; return {};
} }
}, },
endTime: { skuNo: {
type: String,
default: ''
},
currentTime: {
type: String, type: String,
default: '' default: ''
} }
...@@ -92,34 +98,33 @@ export default { ...@@ -92,34 +98,33 @@ export default {
2: '恭喜成团!', 2: '恭喜成团!',
3: '哎呀,拼团时间已过,尚未成团!', 3: '哎呀,拼团时间已过,尚未成团!',
4: '已发货' 4: '已发货'
}, }
timeIsOver: false
}; };
}, },
created() {
const currentTime = new Date(this.currentTime.replace(/\-/g, '/')).getTime();
const endTime = new Date(this.endTime.replace(/\-/g, '/')).getTime();
this.timeIsOver = currentTime >= endTime ? true : false;
},
mounted() { mounted() {
this.$nextTick(() => { this.$nextTick(() => {
if (this.$refs.buttonArea) { if (this.$refs.buttonArea) {
this.observer = new IntersectionObserver(entries => { if (IntersectionObserver) {
entries.forEach(item => { this.observer &&
if (item.intersectionRatio == 0) { this.observer.unobserve &&
this.$emit('changeButtonVisible', true); this.observer.unobserve(this.$refs.buttonArea);
} else { this.observer = new IntersectionObserver(entries => {
this.$emit('changeButtonVisible', false); entries.forEach(item => {
} if (item.intersectionRatio == 0) {
this.$emit('changeButtonVisible', true);
} else {
this.$emit('changeButtonVisible', false);
}
});
}); });
}); }
this.observer.USE_MUTATION_OBSERVER = false; this.observer.USE_MUTATION_OBSERVER = false;
this.observer.observe(this.$refs.buttonArea); this.observer.observe(this.$refs.buttonArea);
} }
}); });
}, },
beforeDestroy() { beforeDestroy() {
if (this.$refs.buttonArea) { if (this.$refs.buttonArea && this.observer) {
this.observer.unobserve(this.$refs.buttonArea); this.observer.unobserve(this.$refs.buttonArea);
} }
}, },
...@@ -130,7 +135,16 @@ export default { ...@@ -130,7 +135,16 @@ export default {
this.$router.push({ name: 'groupBuyList', query: { activityId } }); this.$router.push({ name: 'groupBuyList', query: { activityId } });
} }
}, },
toOrderList() {
this.$router.push('/orderList/0');
},
share() { share() {
if (this.skuNo) {
saTrackEvent('H5_GroupDetailPageInviteFriendsBtnClick', {
sku_no: this.skuNo,
group_id: this.groupInfo?.groupId || ''
});
}
this.$emit('share'); this.$emit('share');
} }
} }
...@@ -141,10 +155,19 @@ export default { ...@@ -141,10 +155,19 @@ export default {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 24px;
line-height: 24px;
margin-bottom: @padding-xs; margin-bottom: @padding-xs;
.desc { .desc {
margin-right: @padding-unit; text-align: center;
height: 100%;
line-height: 24px;
font-size: 14px;
&.inProcess {
margin-right: @padding-unit;
}
span { span {
font-size: 14px;
color: @red-dark; color: @red-dark;
margin: 0 @padding-unit; margin: 0 @padding-unit;
} }
...@@ -156,12 +179,23 @@ export default { ...@@ -156,12 +179,23 @@ export default {
align-items: center; align-items: center;
color: @gray-4; color: @gray-4;
.text-12(); .text-12();
margin-bottom: @padding-md; margin-bottom: @padding-sm;
} }
.button-area { .button-area {
button { button {
font-size: 16px; font-size: 16px !important;
margin-bottom: @padding-md; margin-bottom: @padding-sm;
}
.toListButton {
display: flex;
flex-direction: row;
justify-content: space-between;
button {
width: 48%;
&.toOrderList {
color: @gray-4;
}
}
} }
} }
</style> </style>
...@@ -345,7 +345,7 @@ export default { ...@@ -345,7 +345,7 @@ export default {
delete checkParams.activityHundredGroupId; delete checkParams.activityHundredGroupId;
} }
const [checkStatus] = await goods.checkGroupBuyCreateOrder(checkParams); const [checkStatus] = await goods.checkGroupBuyCreateOrder(checkParams);
if (!checkStatus.verifyResult) { if (checkStatus && !checkStatus.verifyResult) {
// 校验是否允许开团或者参团 // 校验是否允许开团或者参团
this.$dialog({ this.$dialog({
message: checkStatus.failedReason || '', message: checkStatus.failedReason || '',
......
...@@ -171,12 +171,13 @@ ...@@ -171,12 +171,13 @@
background: @white; background: @white;
border-radius: @border-radius; border-radius: @border-radius;
position: relative; position: relative;
overflow: hidden;
&-status { &-status {
width: 80px; width: 80px;
height: 80px; height: 80px;
position: absolute; position: absolute;
right: -13px; right: -10px;
top: -18px; top: -20px;
z-index: 2; z-index: 2;
} }
} }
......
...@@ -74,9 +74,8 @@ ...@@ -74,9 +74,8 @@
<group-desc-info <group-desc-info
:group-info="detailInfo.groupBuyInfo || {}" :group-info="detailInfo.groupBuyInfo || {}"
:timestemp="groupTimestemp" :timestemp="groupTimestemp"
:current-time="detailInfo.currentTime"
:end-time="detailInfo.endTime"
:show-button-group="true" :show-button-group="true"
:sku-no="detailParam.skuNo"
@changeButtonVisible="changeButtonVisible" @changeButtonVisible="changeButtonVisible"
@share="setShareData" @share="setShareData"
/> />
...@@ -182,7 +181,7 @@ export default { ...@@ -182,7 +181,7 @@ export default {
methods: { methods: {
setShareData() { setShareData() {
const avatorList = []; const avatorList = [];
if (this.detailInfo.groupBuyInfo.groupBuyValidUserInfoList) { if (this.detailInfo?.groupBuyInfo?.groupBuyValidUserInfoList) {
this.detailInfo.groupBuyInfo.groupBuyValidUserInfoList.map(v => { this.detailInfo.groupBuyInfo.groupBuyValidUserInfoList.map(v => {
avatorList.push(v.avatar); avatorList.push(v.avatar);
}); });
...@@ -245,6 +244,7 @@ export default { ...@@ -245,6 +244,7 @@ export default {
'https://' 'https://'
); );
const detailImages = await goods.getDetailPic(this.detailInfo.contentDetailUrl); const detailImages = await goods.getDetailPic(this.detailInfo.contentDetailUrl);
console.log(detailImages);
// const imgReg = new RegExp('(?<=src=").[^"]*', 'g'); // const imgReg = new RegExp('(?<=src=").[^"]*', 'g');
// this.detailImgList = (detailImages || '').match(imgReg); // this.detailImgList = (detailImages || '').match(imgReg);
let imgReg = /<img.*?(?:>|\/>)/gi; let imgReg = /<img.*?(?:>|\/>)/gi;
......
...@@ -15,7 +15,9 @@ ...@@ -15,7 +15,9 @@
:show-pivot="false" :show-pivot="false"
:percentage="handleProgressByStatus(goodsItem)" :percentage="handleProgressByStatus(goodsItem)"
/> />
<div class="group-item-already">已拼{{ goodsItem.groupBuySuccessCount }}</div> <div class="group-item-already">
已拼{{ topicCfg.hasStart ? goodsItem.groupBuySuccessCount : 0 }}
</div>
<div class="group-item-price">成团价 ¥ <sup class="group-item-sup">0</sup></div> <div class="group-item-price">成团价 ¥ <sup class="group-item-sup">0</sup></div>
<div class="group-item-delprice">售价¥{{ goodsItem.activityPrice }}</div> <div class="group-item-delprice">售价¥{{ goodsItem.activityPrice }}</div>
<!-- 立即开团 --> <!-- 立即开团 -->
...@@ -78,6 +80,10 @@ export default { ...@@ -78,6 +80,10 @@ export default {
}, },
methods: { methods: {
handleProgressByStatus(item) { handleProgressByStatus(item) {
if (!this.topicCfg.hasStart) {
// 用于处理活动未开始,虚假数据造成的进度条错误
return 100;
}
if (!item) return 0; if (!item) return 0;
let percentage = 0; let percentage = 0;
// saleCount / activitySkuTotalCount // saleCount / activitySkuTotalCount
......
...@@ -76,8 +76,6 @@ import localStorage from '@/service/localStorage.service'; ...@@ -76,8 +76,6 @@ import localStorage from '@/service/localStorage.service';
import goodsCheckMixin from '@/mixins/goodsCheck.mixin'; import goodsCheckMixin from '@/mixins/goodsCheck.mixin';
import { setAppTitleColor, EventBus, firstGroupShare } from '@/service/utils.service'; import { setAppTitleColor, EventBus, firstGroupShare } from '@/service/utils.service';
import { saTrackEvent } from '@/service/sa.service'; import { saTrackEvent } from '@/service/sa.service';
// import { isNull } from '@/service/validation.service';
// let topicIndex;
export default { export default {
// eslint-disable-next-line vue/name-property-casing // eslint-disable-next-line vue/name-property-casing
name: 'groupBuyList', name: 'groupBuyList',
...@@ -121,15 +119,6 @@ export default { ...@@ -121,15 +119,6 @@ export default {
return +new Date(endTime || 0); return +new Date(endTime || 0);
} }
}, },
watch: {
// $route(to) {
// if (to.name !== 'groupBuyList') {
// this.setTitleColor();
// return;
// }
// this.setTitleColor(this.goodsTemp.bgcolor);
// }
},
created() { created() {
this.showLoops = true; this.showLoops = true;
this.reload = true; this.reload = true;
...@@ -137,12 +126,6 @@ export default { ...@@ -137,12 +126,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.setTitleColor(); this.setTitleColor();
}, },
// deactivated() {
// this.showLoops = false;
// },
// activated() {
// this.showLoops = true;
// },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
const { activityId } = to.query; const { activityId } = to.query;
if (!activityId || isNaN(activityId)) { if (!activityId || isNaN(activityId)) {
...@@ -153,17 +136,6 @@ export default { ...@@ -153,17 +136,6 @@ export default {
return; return;
} else { } else {
getActivityList(to.query, next); getActivityList(to.query, next);
// if (isNull(topicIndex)) {
// getActivityList(to.query, next);
// } else {
// if (localStorage.get('activityId') !== +activityId) {
// getActivityList(to.query, next);
// return;
// }
// next(vm => {
// store.commit('CHANGE_TITLE', vm.goodsTemp.title || '活动页');
// });
// }
} }
}, },
methods: { methods: {
...@@ -319,33 +291,6 @@ async function getActivityList(urlQuery, next) { ...@@ -319,33 +291,6 @@ async function getActivityList(urlQuery, next) {
// t.endTime = '2021-09-23 19:17:20'; // t.endTime = '2021-09-23 19:17:20';
t = await computedTemplate(t); t = await computedTemplate(t);
t.groupBuyUserInfoList = (t.groupBuyUserInfoList || []).reverse(); t.groupBuyUserInfoList = (t.groupBuyUserInfoList || []).reverse();
// t.groupBuyUserInfoList = [
// {
// name: '皱眉',
// avatar:
// 'https://img.lkbang.net/avator/0c8c1cfeb1cfdfffd77ac74af83377a17812a3585027-OKt5j9_fw658.jpeg'
// },
// {
// name: '空白人生',
// avatar:
// 'https://img.lkbang.net/avator/e684de0d4db0fcd3a04945ff7ed394abb678ce577dba5-VJbncW_fw658.jpeg'
// },
// {
// name: '逅黄昏',
// avatar:
// 'https://img.lkbang.net/avator/900b3be08740dbe4e38f7c3b7a73b613538a2f2edac3-yXzWfB_fw658.jpeg'
// },
// {
// name: '桑过后正年轻',
// avatar:
// 'https://img.lkbang.net/avator/7ca48321827385f386d0317a40d3f6201f442fddf99a-xXvv37_fw658.jpeg'
// },
// {
// name: '年少就是不服输',
// avatar:
// 'https://img.lkbang.net/avator/e33db7b617e42367d888e3821e1acd89b4b20319cb42-esiOS3_fw658.jpeg'
// }
// ];
store.commit('CHANGE_TITLE', t.title || '活动页'); store.commit('CHANGE_TITLE', t.title || '活动页');
nextFns(vm => { nextFns(vm => {
// topicIndex = 0; // topicIndex = 0;
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
</div> </div>
</div> </div>
</div> </div>
<template v-if="orderInfo.calcFeeInfo.totalSkuFee !== '0.00'"> <template v-if="orderInfo.calcFeeInfo && orderInfo.calcFeeInfo.totalSkuFee !== '0.00'">
<FeeInfo :calc-fee-info="orderInfo.calcFeeInfo" /> <FeeInfo :calc-fee-info="orderInfo.calcFeeInfo" />
</template> </template>
<div v-if="orderInfo.invalidSkuList && orderInfo.invalidSkuList.length" class="confirm-body"> <div v-if="orderInfo.invalidSkuList && orderInfo.invalidSkuList.length" class="confirm-body">
...@@ -80,7 +80,6 @@ import localStorage from '@/service/localStorage.service'; ...@@ -80,7 +80,6 @@ import localStorage from '@/service/localStorage.service';
import historyRecordMixins from '@/mixins/historyRecord.mixins'; import historyRecordMixins from '@/mixins/historyRecord.mixins';
import FeeInfo from './components/feeInfo.vue'; import FeeInfo from './components/feeInfo.vue';
import { HAS_DISCOUNT } from '@/constants/order'; import { HAS_DISCOUNT } from '@/constants/order';
import cookies from '@/service/cookieStorage.service';
import { isApp, isWxMp } from '@/service/validation.service'; import { isApp, isWxMp } from '@/service/validation.service';
import { mapState } from 'vuex'; import { mapState } from 'vuex';
import { saTrackEvent } from '@/service/sa.service'; import { saTrackEvent } from '@/service/sa.service';
...@@ -173,10 +172,13 @@ export default { ...@@ -173,10 +172,13 @@ export default {
invalidSkuList, invalidSkuList,
shopSkuList: [] shopSkuList: []
}; };
shopSkuList.forEach(item => {
if (!item) return; if (shopSkuList) {
orderInfo.shopSkuList = [...orderInfo.shopSkuList, ...item.skuList]; shopSkuList.forEach(item => {
}); if (!item) return;
orderInfo.shopSkuList = [...orderInfo.shopSkuList, ...item.skuList];
});
}
console.log(orderInfo); console.log(orderInfo);
this.$set(this, 'orderInfo', orderInfo); this.$set(this, 'orderInfo', orderInfo);
this.isOutBuy = false; this.isOutBuy = false;
...@@ -230,7 +232,6 @@ export default { ...@@ -230,7 +232,6 @@ export default {
console.log(params); console.log(params);
const [data] = await order.orderSubmit(params); const [data] = await order.orderSubmit(params);
if (data && data.orderNo) { if (data && data.orderNo) {
cookies.set('skuID', params.skuList[0].skuNo);
if (isWxMp) { if (isWxMp) {
this.nativeBridge.openNewUrl({ this.nativeBridge.openNewUrl({
newUrl: `/pages/pay/index?orderNo=${data.orderNo}` newUrl: `/pages/pay/index?orderNo=${data.orderNo}`
......
<template> <template>
<div> <div class="pay-result">
<div v-if="isSuccess" class="card"> <div v-if="isSuccess" class="card">
<div class="info"> <div class="info">
<cr-image <cr-image
...@@ -18,11 +18,21 @@ ...@@ -18,11 +18,21 @@
拼团成功即可退款0元拿,拼团失败立即退款 拼团成功即可退款0元拿,拼团失败立即退款
</p> </p>
<div class="actions"> <div class="actions">
<cr-button shape="circle" type="default" @click="goPage(1)">我的拼团</cr-button> <cr-button shape="circle" class="actions__share" type="primary" @click="share"
<cr-button shape="circle" class="actions__back" :plain="true" type="primary" @click="share"
>邀请好友</cr-button >邀请好友</cr-button
> >
</div> </div>
<div class="actions">
<cr-button shape="circle" type="default" @click="goGroupList">返回活动列表</cr-button>
<cr-button
shape="circle"
class="actions__back"
:plain="true"
type="primary"
@click="goPage(1)"
>查看我的拼团</cr-button
>
</div>
</div> </div>
<div v-else class="card"> <div v-else class="card">
<div class="info"> <div class="info">
...@@ -135,6 +145,10 @@ export default { ...@@ -135,6 +145,10 @@ export default {
this.shareInfo = res; this.shareInfo = res;
firstGroupShare(res, 3); firstGroupShare(res, 3);
}, },
goGroupList() {
const { activityId } = this.shareInfo;
this.$router.push(`/groupBuy/list?activityId=${activityId}`);
},
goPage(type) { goPage(type) {
if (type == 1) { if (type == 1) {
this.$router.replace({ path: '/orderList/0' }); this.$router.replace({ path: '/orderList/0' });
...@@ -170,25 +184,31 @@ export default { ...@@ -170,25 +184,31 @@ export default {
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.pay-result {
height: 100%;
}
.card { .card {
margin: @padding-sm; // margin: @padding-sm;
height: 100%;
background-color: @white; background-color: @white;
border-radius: @border-radius-sm; // border-radius: @border-radius-sm;
padding: 28px @padding-sm @padding-sm @padding-sm; padding: 28px @padding-sm @padding-sm @padding-sm;
box-sizing: border-box;
.info { .info {
display: flex; display: flex;
flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
&__image { &__image {
width: 100px; width: 100px;
height: 100px; height: 100px;
margin: @padding-xl 0;
} }
&__text { &__text {
.text-16; .text-16;
margin-left: @padding-md; // margin-left: @padding-md;
} }
&__desc { &__desc {
...@@ -200,6 +220,7 @@ export default { ...@@ -200,6 +220,7 @@ export default {
margin-top: @padding-xs; margin-top: @padding-xs;
} }
&__free { &__free {
text-align: center;
.text-13; .text-13;
margin-top: @padding-xs; margin-top: @padding-xs;
color: @font-color-light; color: @font-color-light;
...@@ -209,7 +230,7 @@ export default { ...@@ -209,7 +230,7 @@ export default {
.tips { .tips {
.text-12; .text-12;
text-align: center; text-align: center;
margin-top: @padding-lg; margin-top: @padding-xs;
color: @font-color-light; color: @font-color-light;
} }
...@@ -231,7 +252,11 @@ export default { ...@@ -231,7 +252,11 @@ export default {
button { button {
// flex: 1; // flex: 1;
.text-16; .text-16;
width: 161px; width: 170px;
line-height: normal;
}
&__share {
width: 100% !important;
} }
} }
.info_button { .info_button {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment