Browse Source

Merge branch 'dev' into 'master'

Dev

See merge request uniapp/yshop-uniapp!1
master
Administrator 5 years ago
parent
commit
bdc694552c
  1. 2
      api/store.js
  2. 2
      assets/css/style.css
  3. 2
      assets/css/style.css.map
  4. 28
      assets/css/style.less
  5. 69
      components/CountDown.vue
  6. 15
      components/OrderGoods.vue
  7. 24
      components/ProductWindow.vue
  8. 58
      components/StorePoster.vue
  9. 10
      main.js
  10. 12
      pages/activity/BargainRecord/index.vue
  11. 23
      pages/activity/DargainDetails/index.vue
  12. 3
      pages/activity/GoodsBargain/index.vue
  13. 464
      pages/activity/GoodsSeckill/index.vue
  14. 49
      pages/activity/GroupDetails/index.vue
  15. 456
      pages/activity/GroupRule/index.vue
  16. 16
      pages/activity/SeckillDetails/index.vue
  17. 8
      pages/home/index.vue
  18. 54
      pages/order/MyOrder/index.vue
  19. 1172
      pages/order/OrderDetails/index.vue
  20. 3
      pages/order/OrderSubmission/index.vue
  21. 2
      pages/orderAdmin/OrderIndex/index.vue
  22. 4
      pages/shop/GoodsClass/index.vue
  23. 1686
      pages/shop/GoodsCon/index.vue
  24. 2
      pages/shop/HotNewGoods/index.vue
  25. 4
      pages/shop/ShoppingCart/index.vue
  26. 708
      pages/user/User/index.vue
  27. 4
      pages/user/UserAccount/index.vue
  28. 65
      pages/user/address/AddAddress/index.vue
  29. 285
      pages/user/promotion/Poster/index.vue
  30. 15
      store/index.js
  31. 64
      utils/index.js
  32. 31
      utils/request.js

2
api/store.js

@ -69,7 +69,7 @@ export function getHostProducts(page, limit) {
* */ * */
export function getGroomList(type) { export function getGroomList(type) {
return request.get("/groom/list/" + type, {}, { return request.get("/groom/list/" + type, {}, {
login: false login: true
}); });
} }

2
assets/css/style.css

File diff suppressed because one or more lines are too long

2
assets/css/style.css.map

File diff suppressed because one or more lines are too long

28
assets/css/style.less

@ -1,3 +1,6 @@
page {
background: #f5f5f5;
}
.newsList .newsSwitch .van-hairline--top-bottom::after { .newsList .newsSwitch .van-hairline--top-bottom::after {
border: 0; border: 0;
} }
@ -1739,18 +1742,21 @@ flex: 0 2.4*100rpx;
width: 100%; width: 100%;
height: 0.86*100rpx; height: 0.86*100rpx;
padding-left: 0.23*100rpx; padding-left: 0.23*100rpx;
padding-right: 0.23*100rpx;
position: fixed; position: fixed;
left: 0; left: 0;
top: 0; top: 0;
z-index: 5; z-index: 5;
box-sizing: border-box;
} }
.productList .search .input { .productList .search .input {
width: 6.4*100rpx; flex:1;
height: 0.6*100rpx; height: 0.6*100rpx;
background-color: #fff; background-color: #fff;
border-radius: 0.5*100rpx; border-radius: 0.5*100rpx;
padding: 0 0.2*100rpx; padding: 0 0.2*100rpx;
margin-right: 0.23*100rpx;
} }
.productList .search .input input { .productList .search .input input {
@ -2548,7 +2554,7 @@ flex: 0 2.4*100rpx;
width: 100%; width: 100%;
} }
.product-con .product-intro .conter image{ .product-con .product-intro .conter *{
width: 100% !important; width: 100% !important;
display: block !important; display: block !important;
} }
@ -4494,7 +4500,7 @@ flex: 0 2.4*100rpx;
transform: rotate(180deg); transform: rotate(180deg);
} }
.bargain .bargainGang .title .pictrue img, .bargain .bargainGang .title .pictrue image,
.bargain .goodsDetails .title .pictrue image{ .bargain .goodsDetails .title .pictrue image{
width: 100%; width: 100%;
height: 100%; height: 100%;
@ -6984,7 +6990,7 @@ flex: 0 2.4*100rpx;
} }
.product-con .footerRush .bnt { .product-con .footerRush .bnt {
width: 86%; width: 100%;
text-align: center; text-align: center;
line-height: 1*100rpx; line-height: 1*100rpx;
height: 100%; height: 100%;
@ -8425,3 +8431,17 @@ flex: 0 2.4*100rpx;
} }
.swiper-wrapper {} .swiper-wrapper {}
.posterCanvasWarp{
position: relative;
width:0;
height:0;
overflow: hidden;
.posterCanvas{
position: absolute;
left:0;
top:0;
width:747px !important;
height:1326px !important;
}
}

69
components/CountDown.vue

@ -1,62 +1,57 @@
<template> <template>
<view class="time"> <view class="time">
{{ tipText }} <text v-if="rtipText">{{ rtipText }}</text>
<text class="styleAll" v-if="isDay === true">{{ day }}</text> <text class="styleAll" v-if="risDay === true">{{ rday }}</text>
<!-- <text class="timeTxt">{{ dayText }}</text> --> <text class="timeTxt" v-if="rdayText">{{ rdayText }}</text>
<text class="styleAll">{{ hour }}</text> <text class="styleAll">{{ hour }}</text>
<text class="timeTxt">{{ hourText }}</text> <text class="timeTxt" v-if="rhourText">{{ rhourText }}</text>
<text class="styleAll">{{ minute }}</text> <text class="styleAll">{{ minute }}</text>
<text class="timeTxt">{{ minuteText }}</text> <text class="timeTxt" v-if="rminuteText">{{ rminuteText }}</text>
<text class="styleAll">{{ second }}</text> <text class="styleAll">{{ second }}</text>
<!-- <text class="timeTxt">{{ secondText }}</text> --> <text class="timeTxt" v-if="rsecondText">{{ rsecondText }}</text>
</view> </view>
</template> </template>
<script> <script>
export default { export default {
name: "CountDown", name: "CountDown",
props: { props: [
// //
tipText: { 'tipText',
type: String, 'dayText',
default: "倒计时" 'hourText',
}, 'minuteText',
dayText: { 'secondText',
type: String, 'datatime',
default: "天" 'isDay'
}, ],
hourText: {
type: String,
default: "时"
},
minuteText: {
type: String,
default: "分"
},
secondText: {
type: String,
default: "秒"
},
datatime: {
type: Number,
default: 0
},
isDay: {
type: Boolean,
default: true
}
},
data: function() { data: function() {
return { return {
day: "00", day: "00",
hour: "00", hour: "00",
minute: "00", minute: "00",
second: "00" second: "00",
rtipText: "倒计时",
rdayText: "天",
rhourText: "时",
rminuteText: "分",
rsecondText: "秒",
rdatatime: 0,
risDay: true
}; };
}, },
created: function() { created: function() {
// this.show_time(); // this.show_time();
}, },
mounted: function() { mounted: function() {
console.log(this)
this.rtipText = this.$props.tipText;
this.rdayText = this.$props.dayText;
this.rhourText = this.$props.hourText;
this.rminuteText = this.$props.minuteText;
this.rsecondText = this.$props.secondText;
this.rdatatime = this.$props.datatime;
this.risDay = this.$props.isDay;
console.log(this.rdayText)
this.show_time(); this.show_time();
}, },
methods: { methods: {

15
components/OrderGoods.vue

@ -16,11 +16,7 @@
v-if="cart.productInfo.attrInfo" v-if="cart.productInfo.attrInfo"
>{{ cart.productInfo.attrInfo.suk }}</view> >{{ cart.productInfo.attrInfo.suk }}</view>
<view class="money font-color-red">{{ cart.truePrice }}</view> <view class="money font-color-red">{{ cart.truePrice }}</view>
<view <view class="evaluate" v-if="evaluate == 3" @click="routerGo(cart)">评价</view>
class="evaluate"
v-if="evaluate == 3"
@click="routerGo(cart)"
>评价</view>
</view> </view>
</view> </view>
</view> </view>
@ -41,9 +37,12 @@ export default {
}, },
mounted: function() {}, mounted: function() {},
methods: { methods: {
routerGo(item) { routerGo(cart) {
this.$yrouter.push({ path: '/pages/shop/GoodsEvaluate/index',query:{id:cart.unique} }); this.$yrouter.push({
}, path: "/pages/shop/GoodsEvaluate/index",
query: { id: cart.unique }
});
}
} }
}; };
</script> </script>

24
components/ProductWindow.vue

@ -65,13 +65,8 @@ export default {
data: function() { data: function() {
return {}; return {};
}, },
watch: {
attr:function(ne){
console.log(ne)
}
},
mounted: function() { mounted: function() {
console.log(this.attr) console.log(this.attr);
}, },
methods: { methods: {
closeAttr: function() { closeAttr: function() {
@ -84,16 +79,23 @@ export default {
this.$emit("changeFun", { action: "ChangeCartNum", value: 1 }); this.$emit("changeFun", { action: "ChangeCartNum", value: 1 });
}, },
tapAttr: function(indexw, indexn) { tapAttr: function(indexw, indexn) {
//
// H5attrH5
// props
// this.attr.productAttr[res.indexw].index = res.indexn;
let that = this; let that = this;
console.log(that.attr.productAttr);
console.log(that.attr.productAttr[indexw], indexw, indexn);
that.attr.productAttr[indexw].index = indexn;
let value = that let value = that
.getCheckedValue() .getCheckedValue()
.sort() .sort()
.join(","); .join(",");
console.log(value); that.$emit("changeFun", {
that.$emit("changeFun", { action: "ChangeAttr", value: value }); action: "ChangeAttr",
value: {
value,
indexw,
indexn
}
});
}, },
// //
getCheckedValue: function() { getCheckedValue: function() {

58
components/StorePoster.vue

@ -1,6 +1,8 @@
<template> <template>
<view v-if="posterImageStatus" class="poster-first"> <view v-if="posterImageStatus" class="poster-first">
<canvas style="width:747px;height:1326px" canvas-id="myCanvas"></canvas> <div class="posterCanvasWarp">
<canvas class="posterCanvas" canvas-id="myCanvas"></canvas>
</div>
<!-- <view class="poster-pop" v-show="!canvasStatus"> <!-- <view class="poster-pop" v-show="!canvasStatus">
<image <image
src="@/static/images/poster-close.png" src="@/static/images/poster-close.png"
@ -25,7 +27,7 @@
</view> </view>
</view> </view>
<view class="save-poster" @click="savePosterPath">生成图片</view> <view class="save-poster" @click="savePosterPath">生成图片</view>
</view> --> </view>-->
<view class="poster-pop" v-show="canvasStatus"> <view class="poster-pop" v-show="canvasStatus">
<img <img
src="@/static/images/poster-close.png" src="@/static/images/poster-close.png"
@ -33,7 +35,13 @@
@click="posterImageClose" @click="posterImageClose"
mode="widthFix" mode="widthFix"
/> />
<image :src="posterImage" alt="tp" class="poster-image" show-menu-by-longpress mode="widthFix" /> <image
:src="posterImage"
alt="tp"
class="poster-image"
show-menu-by-longpress
mode="widthFix"
/>
<view class="keep">长按图片可以保存到手机</view> <view class="keep">长按图片可以保存到手机</view>
</view> </view>
<view class="mask"></view> <view class="mask"></view>
@ -44,78 +52,78 @@
overscroll-behavior: contain; overscroll-behavior: contain;
} }
.poster-pop { .poster-pop {
width: 4.5*100rpx; width: 4.5 * 100rpx;
height: 8*100rpx; height: 8 * 100rpx;
position: fixed; position: fixed;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
z-index: 99; z-index: 99;
top: 50%; top: 50%;
margin-top: -4.6*100rpx; margin-top: -4.6 * 100rpx;
} }
.poster-pop .canvas { .poster-pop .canvas {
background-color: #ffffff; background-color: #ffffff;
height: 8*100rpx; height: 8 * 100rpx;
} }
.poster-pop .poster-image { .poster-pop .poster-image {
width: 100%; width: 100%;
height: auto; height: auto;
} }
.poster-pop .canvas .image { .poster-pop .canvas .image {
width: 4.5*100rpx; width: 4.5 * 100rpx;
height: 4.5*100rpx; height: 4.5 * 100rpx;
display: block; display: block;
} }
.poster-pop .canvas .text { .poster-pop .canvas .text {
text-align: center; text-align: center;
color: #000000; color: #000000;
margin-top: 0.32*100rpx; margin-top: 0.32 * 100rpx;
} }
.poster-pop .canvas .text.black { .poster-pop .canvas .text.black {
height: 0.68*100rpx; height: 0.68 * 100rpx;
} }
.poster-pop .canvas .text.rad { .poster-pop .canvas .text.rad {
color: #ff0000; color: #ff0000;
} }
.poster-pop .canvas .code { .poster-pop .canvas .code {
height: 1.4*100rpx; height: 1.4 * 100rpx;
display: flex; display: flex;
} }
.poster-pop .canvas .code .code-img { .poster-pop .canvas .code .code-img {
width: 33%; width: 33%;
padding: 0.06*100rpx; padding: 0.06 * 100rpx;
} }
.poster-pop .canvas .code .code-img image{ .poster-pop .canvas .code .code-img image {
width: 100%; width: 100%;
} }
.poster-pop .canvas .code .code-text { .poster-pop .canvas .code .code-text {
width: 60%; width: 60%;
font-size: 0.12*100rpx; font-size: 0.12 * 100rpx;
line-height: 1.64*100rpx; line-height: 1.64 * 100rpx;
} }
.poster-pop .close { .poster-pop .close {
width: 0.46*100rpx; width: 0.46 * 100rpx;
height: 0.75*100rpx; height: 0.75 * 100rpx;
position: fixed; position: fixed;
right: 0; right: 0;
top: -0.73*100rpx; top: -0.73 * 100rpx;
display: block; display: block;
} }
.poster-pop .save-poster { .poster-pop .save-poster {
background-color: #df2d0a; background-color: #df2d0a;
font-size: 0.22*100rpx; font-size: 0.22 * 100rpx;
color: #fff; color: #fff;
text-align: center; text-align: center;
height: 0.76*100rpx; height: 0.76 * 100rpx;
line-height: 0.76*100rpx; line-height: 0.76 * 100rpx;
width: 100%; width: 100%;
margin-top: -0.04*100rpx; margin-top: -0.04 * 100rpx;
} }
.poster-pop .keep { .poster-pop .keep {
color: #fff; color: #fff;
text-align: center; text-align: center;
font-size: 0.25*100rpx; font-size: 0.25 * 100rpx;
margin-top: 0.1*100rpx; margin-top: 0.1 * 100rpx;
} }
.mask { .mask {
position: fixed; position: fixed;

10
main.js

@ -31,12 +31,12 @@ Vue.prototype.$validator = function(rule) {
return new schema(rule); return new schema(rule);
}; };
const CACHE_KEY = "clear_0.0.1"; // const CACHE_KEY = "clear_0.0.1";
if (!cookie.has(CACHE_KEY)) { // if (!cookie.has(CACHE_KEY)) {
cookie.clearAll(); // cookie.clearAll();
cookie.set(CACHE_KEY, 1); // cookie.set(CACHE_KEY, 1);
} // }
Vue.config.productionTip = false Vue.config.productionTip = false

12
pages/activity/BargainRecord/index.vue

@ -8,12 +8,12 @@
<view class="text acea-row row-column-around"> <view class="text acea-row row-column-around">
<view class="line1">{{ item.title }}</view> <view class="line1">{{ item.title }}</view>
<count-down <count-down
:is-day="true" :isDay="true"
:tip-text="'倒计时 '" :tipText="'倒计时 '"
:day-text="' 天 '" :dayText="' 天 '"
:hour-text="' 时 '" :hourText="' 时 '"
:minute-text="' 分 '" :minuteText="' 分 '"
:second-text="' 秒'" :secondText="' 秒'"
:datatime="item.datatime" :datatime="item.datatime"
></count-down> ></count-down>
<view class="money font-color-red"> <view class="money font-color-red">

23
pages/activity/DargainDetails/index.vue

@ -14,12 +14,12 @@
</view> </view>
</view> </view>
<count-down <count-down
:is-day="true" :isDay="true"
:tip-text="'倒计时 '" :tipText="'倒计时 '"
:day-text="' 天 '" :dayText="' 天 '"
:hour-text="' 时 '" :hourText="' 时 '"
:minute-text="' 分 '" :minuteText="' 分 '"
:second-text="' 秒'" :secondText="' 秒'"
:datatime="datatime" :datatime="datatime"
></count-down> ></count-down>
</view> </view>
@ -84,9 +84,9 @@
<image src="@/static/images/left.png" /> <image src="@/static/images/left.png" />
</view> </view>
<view class="titleCon">砍价帮</view> <view class="titleCon">砍价帮</view>
<view class="pictrue on"> <!-- <view class="pictrue on">
<image src="@/static/images/left.png" /> <image src="@/static/images/left.png" />
</view> </view> -->
</view> </view>
<view class="list"> <view class="list">
<view <view
@ -142,10 +142,10 @@
<view class="conter" v-html="bargain.rule"></view> <view class="conter" v-html="bargain.rule"></view>
</view> </view>
<view class="bargainTip" :class="active === true ? 'on' : ''"> <view class="bargainTip" :class="active === true ? 'on' : ''">
<view class="pictrue"> <!-- <view class="pictrue">
<image src="@/static/images/bargainBg.jpg" /> <image src="@/static/images/bargainBg.jpg" />
<view class="iconfont icon-guanbi" @click="close"></view> <view class="iconfont icon-guanbi" @click="close"></view>
</view> </view> -->
<view class="cutOff" v-if="bargainPartake === userInfo.uid"> <view class="cutOff" v-if="bargainPartake === userInfo.uid">
您已砍掉 您已砍掉
<text class="font-color-red" v-text="bargainHelpPrice"></text>听说分享次数越多砍价成功的机会越大哦 <text class="font-color-red" v-text="bargainHelpPrice"></text>听说分享次数越多砍价成功的机会越大哦
@ -507,6 +507,9 @@ export default {
</script> </script>
<style lang="less"> <style lang="less">
.bargain{
background: #00c17b;
}
.bargainBnts { .bargainBnts {
display: flex; display: flex;
align-items: center; align-items: center;

3
pages/activity/GoodsBargain/index.vue

@ -78,4 +78,7 @@ export default {
</script> </script>
<style > <style >
page{
background: #00c17b;
}
</style> </style>

464
pages/activity/GoodsSeckill/index.vue

@ -1,238 +1,264 @@
<template> <template>
<view class="flash-sale" ref="container"> <view class="flash-sale" ref="container">
<view class="header" v-if="headerImg"> <view class="header" v-if="headerImg">
<image :src="headerImg" /> <image :src="headerImg" />
</view> </view>
<scroll-view scroll-y="false" scroll-x="true"> <scroll-view scroll-y="false" scroll-x="true">
<view class="timeScroll"> <view class="timeScroll">
<view class="" v-for="(item, index) in timeList" :key="index"> <view class v-for="(item, index) in timeList" :key="index">
<view :class="{'timeItem':true,'active':active==index}" @click="changeTime(index)"> <view :class="{'timeItem':true,'active':active==index}" @click="setTime(index)">
<view class="time">{{ item.time }}</view> <view class="time">{{ item.time }}</view>
<view class="state">{{ item.state }}</view> <view class="state">{{ item.state }}</view>
</view> </view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<view class="" v-for="(item, index) in timeList" :key="index"> <view class v-for="(item, index) in timeList" :key="index">
<view v-if="active == index"> <view v-if="active == index">
<view class="countDown font-color-red acea-row row-center-wrapper"> <view class="countDown font-color-red acea-row row-center-wrapper">
<view v-if="item.status === 0" class="activity">活动已结束</view> <view v-if="item.status === 0" class="activity">活动已结束</view>
<count-down :is-day="false" :tip-text="'距结束仅剩 '" :day-text="''" :hour-text="' : '" :minute-text="' : '" <count-down
:second-text="''" :datatime="datatime" v-if="item.status === 1"></count-down> :isDay="false"
<view v-if="item.status === 2" class="activity">活动即将开始</view> :tipText="'距结束仅剩 '"
</view> :dayText="false"
<view class="list"> :hourText="' : '"
<view class="item acea-row row-between-wrapper" v-for="(itemSeckill, indexSeckill) in seckillList" :key="indexSeckill"> :minuteText="' : '"
<view class="pictrue"> :secondText="false"
<image :src="itemSeckill.image" /> :datatime="datatime"
</view> v-if="item.status === 1"
<view class="text acea-row row-column-around"> ></count-down>
<view class="line1" v-text="itemSeckill.title"></view> <view v-if="item.status === 2" class="activity">活动即将开始</view>
<view class="money"> </view>
限时价 <view class="list">
<text class="num font-color-red" v-text="'¥' + itemSeckill.price"></text> <view
</view> class="item acea-row row-between-wrapper"
<view class="progress cart-color"> v-for="(itemSeckill, indexSeckill) in seckillList"
<view class="bg-red" :style="{ width: loading ? itemSeckill.percent + '%' : '' }"></view> :key="indexSeckill"
<view class="piece font-color-red" v-text="'仅剩' + itemSeckill.stock + '件'"></view> >
</view> <view class="pictrue">
</view> <image :src="itemSeckill.image" />
<view class="grab bg-color-red" v-if="item.status === 1 && itemSeckill.stock > 0" @click="goDetail(itemSeckill.id)">马上抢</view> </view>
<view class="grab" v-if="item.status === 1 && itemSeckill.stock <= 0">已售磬</view> <view class="text acea-row row-column-around">
<view class="grab bg-color-red" v-if="item.status === 2">即将开始</view> <view class="line1" v-text="itemSeckill.title"></view>
<view class="grab bg-color-red" v-if="item.status === 0">已结束</view> <view class="money">
</view> 限时价
</view> <text class="num font-color-red" v-text="'¥' + itemSeckill.price"></text>
<view class="noCommodity" style="background-color: #fff;" v-if="seckillList.length === 0 && page > 1"> </view>
<view class="noPictrue"> <view class="progress cart-color">
<image src="@/static/images/noGood.png" class="image" /> <view class="bg-red" :style="{ width: loading ? itemSeckill.percent + '%' : '' }"></view>
</view> <view class="piece font-color-red" v-text="'仅剩' + itemSeckill.stock + '件'"></view>
</view> </view>
</view> </view>
</view> <view
<!-- class="grab bg-color-red"
v-if="item.status === 1 && itemSeckill.stock > 0"
@click="goDetail(itemSeckill.id)"
>马上抢</view>
<view class="grab" v-if="item.status === 1 && itemSeckill.stock <= 0">已售磬</view>
<view class="grab bg-color-red" v-if="item.status === 2">即将开始</view>
<view class="grab bg-color-red" v-if="item.status === 0">已结束</view>
</view>
</view>
<view
class="noCommodity"
style="background-color: #fff;"
v-if="seckillList.length === 0 && page > 1"
>
<view class="noPictrue">
<image src="@/static/images/noGood.png" class="image" />
</view>
</view>
</view>
</view>
<!--
<vant-tabs :active="active" @change="setTime" :sticky="sticky" animated line-height="2" :ellipsis="false"> <vant-tabs :active="active" @change="setTime" :sticky="sticky" animated line-height="2" :ellipsis="false">
<vant-tab :ellipsis="false" :title="[title[index]]"> <vant-tab :ellipsis="false" :title="[title[index]]">
</vant-tab> </vant-tab>
</vant-tabs> --> </vant-tabs>-->
</view> </view>
</template> </template>
<script> <script>
import { import { getSeckillConfig, getSeckillList } from "@/api/activity";
getSeckillConfig, import CountDown from "@/components/CountDown";
getSeckillList // import { Tab, Tabs } from "vant-weapp";
} from '@/api/activity'; import Loading from "@/components/Loading";
import CountDown from '@/components/CountDown';
// import { Tab, Tabs } from "vant-weapp";
import Loading from '@/components/Loading';
export default { export default {
name: 'GoodsSeckill', name: "GoodsSeckill",
components: { components: {
CountDown CountDown
}, },
props: {}, props: {},
data: function() { data: function() {
return { return {
headerImg: '', headerImg: "",
timeList: [], timeList: [],
sticky: false, sticky: false,
loading: false, loading: false,
datatime: 0, datatime: 0,
active: 0, active: 0,
seckillList: [], seckillList: [],
status: false, // false true status: false, // false true
loadingList: false, // false true loadingList: false, // false true
page: 1, // page: 1, //
limit: 5, // limit: 5, //
title: [], title: []
}; };
}, },
mounted: function() { mounted: function() {
this.mountedStart(); this.mountedStart();
}, },
onReachBottom() { onReachBottom() {
!this.loadingList && this.getSeckillList(); !this.loadingList && this.getSeckillList();
}, },
methods: { methods: {
changeTime: function(index) { changeTime: function(index) {
this.active = index console.log(index);
}, this.active = index;
mountedStart: function() { this.getSeckillList();
var that = this; },
uni.showLoading(); mountedStart: function() {
getSeckillConfig().then(res => { var that = this;
that.$set(that, 'headerImg', res.data.lovely); uni.showLoading();
that.$set(that, 'timeList', res.data.seckillTime); getSeckillConfig().then(res => {
that.$set(that, 'active', res.data.seckillTimeIndex); that.$set(that, "headerImg", res.data.lovely);
that.$set(that, "timeList", res.data.seckillTime);
that.$set(that, "active", res.data.seckillTimeIndex);
let title = []; let title = [];
title = res.data.seckillTime.map((item, index) => { title = res.data.seckillTime.map((item, index) => {
return { return {
name: 'div', name: "div",
attrs: { attrs: {
class: 'timeItem' class: "timeItem"
}, },
children: [{ children: [
name: 'div', {
attrs: { name: "div",
class: 'time' attrs: {
}, class: "time"
children: [{ },
type: 'text', children: [
text: item.time {
}] type: "text",
}, text: item.time
{ }
name: 'div', ]
attrs: { },
class: 'state' {
}, name: "div",
children: [{ attrs: {
type: 'text', class: "state"
text: item.state },
}] children: [
} {
] type: "text",
}; text: item.state
}); }
that.$set(that, 'title', title); ]
that.datatime = that.timeList[that.active].stop; }
that.getSeckillList(); ]
that.$nextTick(function() { };
that.sticky = true; });
uni.hideLoading(); that.$set(that, "title", title);
}); that.datatime = that.timeList[that.active].stop;
}); that.getSeckillList();
}, that.$nextTick(function() {
setTime: function(event) { that.sticky = true;
var that = this; uni.hideLoading();
that.active = event.mp.detail.index; });
that.datatime = that.timeList[that.active].stop; });
that.getSeckillList(); },
}, setTime: function(index) {
getSeckillList: function() { var that = this;
var that = this; that.page = 1;
if (that.loadingList) return; that.loadingList = false;
if (that.status) return; that.status = false;
var time = that.timeList[that.active].id; that.active = index;
getSeckillList(time, { that.datatime = that.timeList[that.active].stop;
page: that.page, this.seckillList=[]
limit: that.limit that.getSeckillList();
}).then(res => { },
that.status = res.data.length < that.limit; getSeckillList: function() {
that.seckillList.push.apply(that.seckillList, res.data); var that = this;
that.page++; if (that.loadingList) return;
uni.hideLoading(); if (that.status) return;
}); var time = that.timeList[that.active].id;
}, getSeckillList(time, {
goDetail: function(id) { page: that.page,
var that = this; limit: that.limit
var time = that.timeList[that.active].stop; }).then(res => {
this.$yrouter.push({ that.status = res.data.length < that.limit;
path: '/pages/activity/SeckillDetails/index', that.seckillList.push.apply(that.seckillList, res.data);
query: { that.page++;
id, uni.hideLoading();
time });
} },
}); goDetail: function(id) {
} var that = this;
} var time = that.timeList[that.active].stop;
}; this.$yrouter.push({
path: "/pages/activity/SeckillDetails/index",
query: {
id,
time
}
});
}
}
};
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.timeScroll { .timeScroll {
display: flex; display: flex;
align-items: center; align-items: center;
flex-direction: row; flex-direction: row;
} }
.timeItem { .timeItem {
font-size: 0.22 * 100rpx; font-size: 0.22 * 100rpx;
color: #282828; color: #282828;
width: 150rpx; width: 150rpx;
text-align: center; text-align: center;
padding: 0.11 * 100rpx 0; padding: 0.11 * 100rpx 0;
background-color: none; background-color: none;
&.active { &.active {
.time {
color: #00c17b;
}
.time { .state {
color: #00c17b background-color: #00c17b;
} color: #fff;
opacity: 1;
border-radius: 30rpx;
padding: 0 0.2 * 100rpx;
font-weight: 800;
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
}
}
.state { .timeItem .time {
background-color: #00c17b; font-size: 0.32 * 100rpx;
color: #fff; font-weight: bold;
opacity: 1; height: 0.37 * 100rpx;
border-radius: 30rpx; line-height: 0.37 * 100rpx;
padding: 0 .2*100rpx; }
font-weight: 800;
height: .3*100rpx;
line-height: .3*100rpx;
}
} .timeItem .state {
} height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
.timeItem .time { .activity {
font-size: 0.32 * 100rpx; color: #333;
font-weight: bold; }
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
.timeItem .state { .flash-sale .list .item .grab {
height: 0.37 * 100rpx; background-color: #999;
line-height: 0.37 * 100rpx; }
}
.activity {
color: #333;
}
.flash-sale .list .item .grab {
background-color: #999;
}
</style> </style>

49
pages/activity/GroupDetails/index.vue

@ -50,12 +50,12 @@
<text>人成团</text> <text>人成团</text>
</view> </view>
<count-down <count-down
:is-day="false" :isDay="false"
:tip-text="'剩余 '" :tipText="'剩余 '"
:day-text="''" :dayText="false"
:hour-text="':'" :hourText="':'"
:minute-text="':'" :minuteText="':'"
:second-text="''" :secondText="false"
:datatime="item.stopTime" :datatime="item.stopTime"
></count-down> ></count-down>
</view> </view>
@ -104,12 +104,17 @@
<view class="product-intro"> <view class="product-intro">
<view class="title">产品介绍</view> <view class="title">产品介绍</view>
<view class="conter" v-html="storeInfo.description"></view> <view class="conter" v-html="storeInfo.description"></view>
<!-- <view class="conter" v-html=""></view> -->
</view> </view>
<view style="height:100rpx;"></view> <view style="height:100rpx;"></view>
<view class="footer-group acea-row row-between-wrapper"> <view class="footer-group acea-row row-between-wrapper">
<view class="customerSer acea-row row-center-wrapper row-column"> <!-- <view class="customerSer acea-row row-center-wrapper row-column">
<view class="iconfont icon-kefu"></view> <view class="iconfont icon-kefu"></view>
<view>客服</view> <view>客服</view>
</view>-->
<view class="customerSer acea-row row-center-wrapper row-column" @click="setCollect">
<view class="iconfont" :class="userCollect ? 'icon-shoucang1' : 'icon-shoucang'"></view>
<text>收藏</text>
</view> </view>
<view class="bnt bg-color-violet" @click="openAlone">单独购买</view> <view class="bnt bg-color-violet" @click="openAlone">单独购买</view>
<view class="bnt bg-color-red" @click="openTeam">立即开团</view> <view class="bnt bg-color-red" @click="openTeam">立即开团</view>
@ -134,6 +139,12 @@ import StorePoster from "@/components/StorePoster";
import { getCombinationDetail } from "@/api/activity"; import { getCombinationDetail } from "@/api/activity";
import { postCartAdd } from "@/api/store"; import { postCartAdd } from "@/api/store";
import { imageBase64 } from "@/api/public"; import { imageBase64 } from "@/api/public";
import {
getCoupon,
getCollectAdd,
getCollectDel,
getUserInfo
} from "@/api/user";
const NAME = "GroupDetails"; const NAME = "GroupDetails";
export default { export default {
@ -188,7 +199,8 @@ export default {
cart_num: 1 cart_num: 1
} }
}, },
cartNum: 1 cartNum: 1,
userCollect: false
}; };
}, },
watch: { watch: {
@ -206,11 +218,27 @@ export default {
openAlone: function() { openAlone: function() {
this.$yrouter.replace({ path: "/detail/" + this.storeInfo.productId }); this.$yrouter.replace({ path: "/detail/" + this.storeInfo.productId });
}, },
//
setCollect: function() {
let that = this,
id = that.storeInfo.id,
category = "product";
if (that.userCollect) {
getCollectDel(id, category).then(function() {
that.userCollect = !that.userCollect;
});
} else {
getCollectAdd(id, category).then(function() {
that.userCollect = !that.userCollect;
});
}
},
mountedStart: function() { mountedStart: function() {
var that = this; var that = this;
console.log(that) console.log(that);
let id = that.$yroute.query.id; let id = that.$yroute.query.id;
getCombinationDetail(id).then(res => { getCombinationDetail(id).then(res => {
that.userCollect = res.data.userCollect;
that.$set(that, "storeInfo", res.data.storeInfo); that.$set(that, "storeInfo", res.data.storeInfo);
that.$set(that, "imgUrls", res.data.storeInfo.sliderImageArr); that.$set(that, "imgUrls", res.data.storeInfo.sliderImageArr);
that.$set(that, "itemNew", res.data.pinkOkList); that.$set(that, "itemNew", res.data.pinkOkList);
@ -323,13 +351,14 @@ export default {
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.product-con .wrapper { .product-con .wrapper {
padding-bottom: 0.26*100rpx; padding-bottom: 0.26 * 100rpx;
} }
.noscroll { .noscroll {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
} }
.product-con .footer-group .bnt { .product-con .footer-group .bnt {
// flex:1;
width: 43%; width: 43%;
} }
.product-con .footer-group .bnt.bg-color-violet { .product-con .footer-group .bnt.bg-color-violet {

456
pages/activity/GroupRule/index.vue

@ -1,220 +1,246 @@
<template> <template>
<view class="group-con"> <view class="group-con">
<view class="header acea-row row-between-wrapper"> <view class="header acea-row row-between-wrapper">
<view class="pictrue"> <view class="pictrue">
<image :src="storeCombination.image" /> <image :src="storeCombination.image" />
</view> </view>
<view class="text"> <view class="text">
<view class="line1" v-text="storeCombination.title"></view> <view class="line1" v-text="storeCombination.title"></view>
<view class="money"> <view class="money">
<text></text> <text></text>
<text class="num" v-text="storeCombination.price"></text> <text class="num" v-text="storeCombination.price"></text>
<text class="team cart-color" v-text="storeCombination.people + '人拼'"></text> <text class="team cart-color" v-text="storeCombination.people + '人拼'"></text>
</view> </view>
</view> </view>
<view v-if="pinkBool === -1" class="iconfont icon-pintuanshibai"></view> <view v-if="pinkBool === -1" class="iconfont icon-pintuanshibai"></view>
<view v-else-if="pinkBool === 1" class="iconfont icon-pintuanchenggong font-color-red"></view> <view v-else-if="pinkBool === 1" class="iconfont icon-pintuanchenggong font-color-red"></view>
</view> </view>
<view class="wrapper"> <view class="wrapper">
<view class="title acea-row row-center-wrapper"> <view class="title acea-row row-center-wrapper">
<view class="line"></view> <view class="line"></view>
<view class="name acea-row row-center-wrapper"> <view class="name acea-row row-center-wrapper">
<text>剩余</text> <text>剩余</text>
<count-down :is-day="false" :tip-text="''" :day-text="''" :hour-text="' : '" :minute-text="' : '" :second-text="''" <count-down
:datatime="pinkT.stopTime"></count-down> :isDay="false"
<text>结束</text> :tipText="false"
</view> :dayText="false"
<view class="line"></view> :hourText="' : '"
</view> :minuteText="' : '"
<text class="tips font-color-red" v-if="pinkBool === 1">恭喜您拼团成功</text> :secondText="false"
<text class="tips" v-else-if="pinkBool === -1">还差{{ count }}拼团失败</text> :datatime="pinkT.stopTime"
<text class="tips font-color-red" v-else-if="pinkBool === 0">拼团中还差{{ count }}人拼团成功</text> ></count-down>
<view class="list acea-row row-middle" :class="[pinkBool === 1 || pinkBool === -1 ? 'result' : '',iShidden ? 'on' : '']"> <text>结束</text>
<view class="pictrue"> </view>
<image :src="pinkT.avatar" /> <view class="line"></view>
</view> </view>
<view class="acea-row row-middle" v-if="pinkAll.length > 0"> <view class="tips-warp">
<view class="pictrue" v-for="(item, pinkAllIndex) in pinkAll" :key="pinkAllIndex"> <text class="tips font-color-red" v-if="pinkBool === 1">恭喜您拼团成功</text>
<image :src="item.avatar" /> <text class="tips" v-else-if="pinkBool === -1">还差{{ count }}拼团失败</text>
</view> <text class="tips font-color-red" v-else-if="pinkBool === 0">拼团中还差{{ count }}人拼团成功</text>
</view> </view>
<view class="pictrue" v-for="countIndex in count" :key="countIndex"> <view
<image class="img-none" src="@/static/images/vacancy.png" /> class="list acea-row row-middle"
</view> :class="[pinkBool === 1 || pinkBool === -1 ? 'result' : '',iShidden ? 'on' : '']"
</view> >
<view v-if="(pinkBool === 1 || pinkBool === -1) && count > 9" class="lookAll acea-row row-center-wrapper" @click="lookAll"> <view class="pictrue">
{{ iShidden ? "收起" : "查看全部" }} <image :src="pinkT.avatar" />
<text class="iconfont" :class="iShidden ? 'icon-xiangshang' : 'icon-xiangxia'"></text> </view>
</view> <view class="acea-row row-middle" v-if="pinkAll.length > 0">
<view class="teamBnt bg-color-red" v-if="userBool === 1 && isOk == 0 && pinkBool === 0" @click="goPoster">邀请好友参团</view> <view class="pictrue" v-for="(item, pinkAllIndex) in pinkAll" :key="pinkAllIndex">
<view class="teamBnt bg-color-red" v-else-if="userBool === 0 && pinkBool === 0 && count > 0" @click="pay">我要参团</view> <image :src="item.avatar" />
<view class="teamBnt bg-color-red" v-if="pinkBool === 1 || pinkBool === -1" @click="goDetail(storeCombination.id)">再次开团</view> </view>
<view class="cancel" @click="getCombinationRemove" v-if="pinkBool === 0 && userBool === 1"> </view>
<text class="iconfont icon-guanbi3"></text> <view class="pictrue" v-for="countIndex in count" :key="countIndex">
<text>取消开团</text> <image class="img-none" src="@/static/images/vacancy.png" />
</view> </view>
<view class="lookOrder" v-if="pinkBool === 1" @click="goOrder"> </view>
<text>查看订单信息</text> <view
<text class="iconfont icon-xiangyou"></text> v-if="(pinkBool === 1 || pinkBool === -1) && count > 9"
</view> class="lookAll acea-row row-center-wrapper"
</view> @click="lookAll"
</view> >
{{ iShidden ? "收起" : "查看全部" }}
<text class="iconfont" :class="iShidden ? 'icon-xiangshang' : 'icon-xiangxia'"></text>
</view>
<view
class="teamBnt bg-color-red"
v-if="userBool === 1 && isOk == 0 && pinkBool === 0"
@click="goPoster"
>邀请好友参团</view>
<view
class="teamBnt bg-color-red"
v-else-if="userBool === 0 && pinkBool === 0 && count > 0"
@click="pay"
>我要参团</view>
<view
class="teamBnt bg-color-red"
v-if="pinkBool === 1 || pinkBool === -1"
@click="goDetail(storeCombination.id)"
>再次开团</view>
<view class="cancel" @click="getCombinationRemove" v-if="pinkBool === 0 && userBool === 1">
<text class="iconfont icon-guanbi3"></text>
<text>取消开团</text>
</view>
<view class="lookOrder" v-if="pinkBool === 1" @click="goOrder">
<text>查看订单信息</text>
<text class="iconfont icon-xiangyou"></text>
</view>
</view>
</view>
</template> </template>
<script> <script>
import CountDown from "@/components/CountDown"; import CountDown from "@/components/CountDown";
import { import { getCombinationPink, getCombinationRemove } from "@/api/activity";
getCombinationPink, import { postCartAdd } from "@/api/store";
getCombinationRemove import { isWeixin, parseQuery, handleQrCode } from "@/utils/index";
} from "@/api/activity";
import {
postCartAdd
} from "@/api/store";
import {
isWeixin,
parseQuery,
handleQrCode
} from "@/utils/index";
const NAME = "GroupRule"; const NAME = "GroupRule";
export default { export default {
name: NAME, name: NAME,
components: { components: {
CountDown CountDown
}, },
props: {}, props: {},
data: function() { data: function() {
return { return {
currentPinkOrder: "", // currentPinkOrder: "", //
isOk: 0, // isOk: 0, //
pinkBool: 0, //|0=,1= pinkBool: 0, //|0=,1=
userBool: 0, //|0=,1= userBool: 0, //|0=,1=
pinkAll: [], // pinkAll: [], //
pinkT: [], // pinkT: [], //
storeCombination: [], // storeCombination: [], //
pinkId: 0, pinkId: 0,
count: 0, // count: 0, //
iShidden: false iShidden: false
}; };
}, },
watch: { watch: {
$yroute(n) { $yroute(n) {
var that = this; var that = this;
if (n.name === NAME) { if (n.name === NAME) {
that.pinkId = that.$yroute.query.id; that.pinkId = that.$yroute.query.id;
that.getCombinationPink(); that.getCombinationPink();
} }
} }
}, },
mounted: function() { mounted: function() {
var that = this; var that = this;
let url = handleQrCode(); let url = handleQrCode();
if (url) { if (url) {
that.pinkId = url.pinkId; that.pinkId = url.pinkId;
} else { } else {
that.pinkId = that.$yroute.query.id; that.pinkId = that.$yroute.query.id;
} }
that.getCombinationPink(); that.getCombinationPink();
}, },
methods: { methods: {
pay: function() { pay: function() {
var that = this; var that = this;
var data = {}; var data = {};
data.productId = that.storeCombination.productId; data.productId = that.storeCombination.productId;
data.cartNum = that.pinkT.totalNum; data.cartNum = that.pinkT.totalNum;
data.uniqueId = ""; data.uniqueId = "";
data.combinationId = that.storeCombination.id; data.combinationId = that.storeCombination.id;
data.new = 1; data.new = 1;
postCartAdd(data) postCartAdd(data)
.then(res => { .then(res => {
that.$yrouter.push({ that.$yrouter.push({
path: "/pages/order/OrderSubmission/index", path: "/pages/order/OrderSubmission/index",
query: { query: {
id: res.data.cartId, id: res.data.cartId,
pinkid: that.pinkId pinkid: that.pinkId
} }
}); });
}) })
.catch(err => { .catch(err => {
uni.showToast({ uni.showToast({
title: err.msg || err.response.data.msg, title: err.msg || err.response.data.msg,
icon: 'none', icon: "none",
duration: 2000 duration: 2000
}); });
}); });
}, },
goPoster: function() { goPoster: function() {
var that = this; var that = this;
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/activity/Poster/index", path: "/pages/activity/Poster/index",
query: { query: {
id: that.pinkId, id: that.pinkId,
type: 1 type: 1
} }
}); });
}, },
goOrder: function() { goOrder: function() {
var that = this; var that = this;
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/order/OrderDetails/index", path: "/pages/order/OrderDetails/index",
query: { query: {
id: that.currentPinkOrder id: that.currentPinkOrder
} }
}); });
}, },
// //
goList: function() { goList: function() {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/activity/GoodsGroup/index" path: "/pages/activity/GoodsGroup/index"
}); });
}, },
// //
goDetail: function(id) { goDetail: function(id) {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/activity/GroupDetails/index", path: "/pages/activity/GroupDetails/index",
query: { query: {
id id
} }
}); });
}, },
// //
getCombinationPink: function() { getCombinationPink: function() {
var that = this; var that = this;
getCombinationPink(that.pinkId).then(res => { getCombinationPink(that.pinkId).then(res => {
that.$set(that, "storeCombination", res.data.storeCombination); that.$set(that, "storeCombination", res.data.storeCombination);
that.$set(that, "pinkT", res.data.pinkT); that.$set(that, "pinkT", res.data.pinkT);
that.$set(that, "pinkAll", res.data.pinkAll); that.$set(that, "pinkAll", res.data.pinkAll);
that.$set(that, "count", res.data.count); that.$set(that, "count", res.data.count);
that.$set(that, "userBool", res.data.userBool); that.$set(that, "userBool", res.data.userBool);
that.$set(that, "pinkBool", res.data.pinkBool); that.$set(that, "pinkBool", res.data.pinkBool);
that.$set(that, "isOk", res.data.isOk); that.$set(that, "isOk", res.data.isOk);
that.$set(that, "currentPinkOrder", res.data.currentPinkOrder); that.$set(that, "currentPinkOrder", res.data.currentPinkOrder);
}); });
}, },
// //
getCombinationRemove: function() { getCombinationRemove: function() {
var that = this; var that = this;
getCombinationRemove({ getCombinationRemove({
id: that.pinkId, id: that.pinkId,
cid: that.storeCombination.id cid: that.storeCombination.id
}) })
.then(res => { .then(res => {
uni.showToast({ uni.showToast({
title: res.msg, title: res.msg,
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
}) })
.catch(res => { .catch(res => {
uni.showToast({ uni.showToast({
title: res.msg, title: res.msg,
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
}); });
}, },
lookAll: function() { lookAll: function() {
this.iShidden = !this.iShidden; this.iShidden = !this.iShidden;
} }
} }
}; };
</script> </script>
<style lang="less">
.tips-warp{
text-align: center;
margin-top: 20rpx;
}
</style>

16
pages/activity/SeckillDetails/index.vue

@ -11,12 +11,12 @@
<view class="times"> <view class="times">
<view>距秒杀结束仅剩</view> <view>距秒杀结束仅剩</view>
<count-down <count-down
:is-day="false" :isDay="false"
:tip-text="''" :tipText="false"
:day-text="''" :dayText="false"
:hour-text="' : '" :hourText="' : '"
:minute-text="' : '" :minuteText="' : '"
:second-text="''" :secondText="false"
:datatime="datatime" :datatime="datatime"
></count-down> ></count-down>
</view> </view>
@ -39,13 +39,13 @@
</view> </view>
<view style="height:100rpx;"></view> <view style="height:100rpx;"></view>
<view class="footerRush acea-row row-between-wrapper"> <view class="footerRush acea-row row-between-wrapper">
<view <!-- <view
class="customerSer acea-row row-center-wrapper row-column" class="customerSer acea-row row-center-wrapper row-column"
@click="routerGo()" @click="routerGo()"
> >
<view class="iconfont icon-kefu"></view> <view class="iconfont icon-kefu"></view>
<view>客服</view> <view>客服</view>
</view> </view> -->
<view class="bnt bg-color-red" @click="tapBuy">立即购买</view> <view class="bnt bg-color-red" @click="tapBuy">立即购买</view>
</view> </view>
<ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cartNum"></ProductWindow> <ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cartNum"></ProductWindow>

8
pages/home/index.vue

@ -43,7 +43,7 @@
<image class="bg" src="../../static/images/index-bg.png" mode="widthFix"></image> <image class="bg" src="../../static/images/index-bg.png" mode="widthFix"></image>
<view class="title acea-row row-between-wrapper"> <view class="title acea-row row-between-wrapper">
<view class="text"><view class="name line1">热门榜单</view></view> <view class="text"><view class="name line1">热门榜单</view></view>
<view @click="goHotNewGoods()" class="more"> <view @click="goHotNewGoods(2)" class="more">
更多 更多
<text class="iconfont icon-jiantou"></text> <text class="iconfont icon-jiantou"></text>
</view> </view>
@ -53,8 +53,8 @@
<view class="newProductsScroll"> <view class="newProductsScroll">
<view @click="goGoodsCon(item)" class="newProductsItem" v-for="(item, likeInfoIndex) in likeInfo" :key="likeInfoIndex"> <view @click="goGoodsCon(item)" class="newProductsItem" v-for="(item, likeInfoIndex) in likeInfo" :key="likeInfoIndex">
<view class="img-box"><image :src="item.image" /></view> <view class="img-box"><image :src="item.image" /></view>
<view class="pro-info line1">{{ item.storeName }}</view> <view class="pro-info line1"><text>{{ item.storeName }}</text></view>
<view class="money font-color-red">{{ item.price }}</view> <view class="money font-color-red"><text>{{ item.price }}</text></view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
@ -99,7 +99,7 @@
<view class="wrapper" v-if="benefit.length > 0"> <view class="wrapper" v-if="benefit.length > 0">
<view class="title acea-row row-between-wrapper"> <view class="title acea-row row-between-wrapper">
<view class="text"><view class="name line1">促销单品</view></view> <view class="text"><view class="name line1">促销单品</view></view>
<view @click="goGoodsPromotion()" class="more"> <view @click="goGoodsPromotion(4)" class="more">
更多 更多
<text class="iconfont icon-jiantou"></text> <text class="iconfont icon-jiantou"></text>
</view> </view>

54
pages/order/MyOrder/index.vue

@ -107,31 +107,18 @@
</view> </view>
<view class="totalPrice"> <view class="totalPrice">
{{ order.cartInfo.length || 0 }}件商品总金额 {{ order.cartInfo.length || 0 }}件商品总金额
<text <text class="money font-color-red">{{ order.payPrice }}</text>
class="money font-color-red"
>{{ order.payPrice }}</text>
</view> </view>
<view class="bottom acea-row row-right row-middle"> <view class="bottom acea-row row-right row-middle">
<template v-if="order._status._type == 0"> <template v-if="order._status._type == 0">
<view class="bnt cancelBnt" @click="cancelOrder(order)">取消订单</view> <view class="bnt cancelBnt" @click="cancelOrder(order)">取消订单</view>
<view <view class="bnt bg-color-red" @click="goOrderDetails(order)">立即付款</view>
class="bnt bg-color-red"
@click="goOrderDetails(order)"
>立即付款</view>
</template> </template>
<template v-if="order._status._type == 1 || order._status._type == 9"> <template v-if="order._status._type == 1 || order._status._type == 9">
<view <view class="bnt bg-color-red" @click="goOrderDetails(order)">查看详情</view>
class="bnt bg-color-red"
@click="goOrderDetails(order)"
>查看详情</view>
</template> </template>
<template v-if="order._status._type == 2"> <template v-if="order._status._type == 2">
<view <view class="bnt default" @click="goLogistics(order)">查看物流</view>
class="bnt default"
@click="
$yrouter.push({ path: '/pages/order/Logistics/index',query:{id:order.orderId}})
"
>查看物流</view>
<view class="bnt bg-color-red" @click="takeOrder(order)">确认收货</view> <view class="bnt bg-color-red" @click="takeOrder(order)">确认收货</view>
</template> </template>
<template v-if="order._status._type == 3"> <template v-if="order._status._type == 3">
@ -144,16 +131,10 @@
<!--&gt;--> <!--&gt;-->
<!--查看物流--> <!--查看物流-->
<!--</view>--> <!--</view>-->
<view <view class="bnt bg-color-red" @click="goOrderDetails(order)">去评价</view>
class="bnt bg-color-red"
@click="goOrderDetails(order)"
>去评价</view>
</template> </template>
<template v-if="order._status._type === 4"> <template v-if="order._status._type === 4">
<view <view class="bnt bg-color-red" @click="goOrderDetails(order)">查看订单</view>
class="bnt bg-color-red"
@click="goOrderDetails(order)"
>查看订单</view>
</template> </template>
</view> </view>
</view> </view>
@ -231,6 +212,12 @@ export default {
type() {} type() {}
}, },
methods: { methods: {
goLogistics(order) {
this.$yrouter.push({
path: "/pages/order/Logistics/index",
query: { id: order.orderId }
});
},
goOrderDetails(order) { goOrderDetails(order) {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/order/OrderDetails/index", path: "/pages/order/OrderDetails/index",
@ -333,20 +320,21 @@ export default {
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.noCart { .noCart {
margin-top: 0.17*100rpx; margin-top: 0.17 * 100rpx;
padding-top: 0.1*100rpx; padding-top: 0.1 * 100rpx;
} }
.noCart .pictrue { .noCart .pictrue {
width: 4*100rpx; width: 4 * 100rpx;
height: 3*100rpx; height: 3 * 100rpx;
overflow: hidden; overflow: hidden;
margin: 0.7*100rpx auto 0.5*100rpx auto; margin: 0.7 * 100rpx auto 0.5 * 100rpx auto;
} }
.noCart .pictrue image{ .noCart .pictrue image {
width: 4*100rpx; width: 4 * 100rpx;
height: 3*100rpx; height: 3 * 100rpx;
} }
</style> </style>

1172
pages/order/OrderDetails/index.vue

File diff suppressed because it is too large Load Diff

3
pages/order/OrderSubmission/index.vue

@ -58,7 +58,7 @@
当前积分 当前积分
<text class="num font-color-red">{{ userInfo.integral || 0 }}</text> <text class="num font-color-red">{{ userInfo.integral || 0 }}</text>
</text> </text>
<checkbox value :checked="useIntegral ? true : false"></checkbox> <checkbox value="true" :checked="useIntegral ? true : false"></checkbox>
</label> </label>
</checkbox-group> </checkbox-group>
</view> </view>
@ -345,6 +345,7 @@
}, },
changeUseIntegral: function(e) { changeUseIntegral: function(e) {
// this.computedPrice(); // this.computedPrice();
console.log(e)
this.useIntegral = e.mp.detail.value[0]; this.useIntegral = e.mp.detail.value[0];
}, },
computedPrice() { computedPrice() {

2
pages/orderAdmin/OrderIndex/index.vue

@ -17,7 +17,7 @@
<view class="num">{{ census.orderCount.evaluatedCount }}</view> <view class="num">{{ census.orderCount.evaluatedCount }}</view>
<view>待评价</view> <view>待评价</view>
</view> </view>
<view class="item" @click="goAdminOrderList(3)"> <view class="item" @click="goAdminOrderList(4)">
<view class="num">{{ census.orderCount.refundCount }}</view> <view class="num">{{ census.orderCount.refundCount }}</view>
<view>退款</view> <view>退款</view>
</view> </view>

4
pages/shop/GoodsClass/index.vue

@ -20,8 +20,8 @@
</view> </view>
</view> </view>
<view class="conter"> <view class="conter">
<view class="listw" v-for="(item, eq) in category" :key="eq"> <view v-for="(item, eq) in category" :key="eq">
<view v-if="eq === navActive"> <view class="listw" v-if="eq === navActive">
<view class="title acea-row row-center-wrapper" ref="title"> <view class="title acea-row row-center-wrapper" ref="title">
<view class="line"></view> <view class="line"></view>
<view class="name">{{ item.cateName }}</view> <view class="name">{{ item.cateName }}</view>

1686
pages/shop/GoodsCon/index.vue

File diff suppressed because it is too large Load Diff

2
pages/shop/HotNewGoods/index.vue

@ -56,7 +56,7 @@ export default {
} else if (type === "2") { } else if (type === "2") {
this.name = "热门榜单"; this.name = "热门榜单";
this.icon = "icon-remen"; this.icon = "icon-remen";
document.title = "热门榜单"; // document.title = "";
} else if (type === "3") { } else if (type === "3") {
this.name = "首发新品"; this.name = "首发新品";
this.icon = "icon-xinpin"; this.icon = "icon-xinpin";

4
pages/shop/ShoppingCart/index.vue

@ -1,6 +1,6 @@
<template> <template>
<view class="shoppingCart"> <view class="shoppingCart">
<view class v-if="userInfo.uid"> <view v-if="$store.getters.token||userInfo.uid">
<view class="labelNav acea-row row-around row-middle"> <view class="labelNav acea-row row-around row-middle">
<view class="item"> <view class="item">
<text class="iconfont icon-xuanzhong"></text> <text class="iconfont icon-xuanzhong"></text>
@ -130,7 +130,7 @@
<view class="placeOrder bg-color-red" @click="placeOrder">立即下单</view> <view class="placeOrder bg-color-red" @click="placeOrder">立即下单</view>
</view> </view>
<view class="button acea-row row-middle" v-else> <view class="button acea-row row-middle" v-else>
<view class="bnt cart-color" @click="collectAll">收藏</view> <!-- <view class="bnt cart-color" @click="collectAll">收藏</view> -->
<view class="bnt" @click="delgoods">删除</view> <view class="bnt" @click="delgoods">删除</view>
</view> </view>
</view> </view>

708
pages/user/User/index.vue

@ -1,364 +1,384 @@
<template> <template>
<view class="user"> <view class="user">
<view v-if="userInfo.uid"> <view v-if="$store.getters.token||userInfo.uid">
<view class="header bg-color-red acea-row row-between-wrapper"> <view class="header bg-color-red acea-row row-between-wrapper">
<view class="picTxt acea-row row-between-wrapper"> <view class="picTxt acea-row row-between-wrapper">
<view class="pictrue"> <view class="pictrue">
<image :src="userInfo.avatar" /> <image :src="userInfo.avatar" />
</view> </view>
<view class="text"> <view class="text">
<view class="acea-row row-middle"> <view class="acea-row row-middle">
<view class="name line1">{{ userInfo.nickname }}</view> <view class="name line1">{{ userInfo.nickname }}</view>
<view class="member acea-row row-middle" v-if="userInfo.vip"> <view class="member acea-row row-middle" v-if="userInfo.vip">
<image :src="userInfo.vipIcon" /> <image :src="userInfo.vipIcon" />
<text>{{ userInfo.vipName }}</text> <text>{{ userInfo.vipName }}</text>
</view> </view>
</view> </view>
<view @click="goPersonalData()" class="id" v-if="userInfo.phone"> <view @click="goPersonalData()" class="id" v-if="userInfo.phone">
<text>ID{{ userInfo.uid || 0}}</text> <text>ID{{ userInfo.uid || 0}}</text>
<text class="iconfont icon-bianji1"></text> <text class="iconfont icon-bianji1"></text>
</view> </view>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" class="binding" v-else> <button
<text>绑定手机号</text> open-type="getPhoneNumber"
</button> @getphonenumber="getPhoneNumber"
</view> class="binding"
</view> v-else
<text class="iconfont icon-shezhi" @click="goPersonalData()"></text> >
</view> <text>绑定手机号</text>
<view class="wrapper"> </button>
<view class="nav acea-row row-middle"> </view>
<view @click="goUserAccount()" class="item"> </view>
<text>我的余额</text> <text class="iconfont icon-shezhi" @click="goPersonalData()"></text>
<text class="num">{{ userInfo.nowMoney || 0 }}</text> </view>
</view> <view class="wrapper">
<view @click="goUserPromotion()" class="item" v-if="userInfo.isPromoter === 1 || userInfo.statu === 2"> <view class="nav acea-row row-middle">
<text>当前佣金</text> <view @click="goUserAccount()" class="item">
<text class="num">{{ userInfo.brokeragePrice || 0 }}</text> <text>我的余额</text>
</view> <text class="num">{{ userInfo.nowMoney || 0 }}</text>
<view @click="goIntegral()" class="item" v-else> </view>
<text>当前积分</text> <view
<text class="num">{{ userInfo.integral || 0 }}</text> @click="goUserPromotion()"
</view> class="item"
<view @click="goUserCoupon()" class="item"> v-if="userInfo.isPromoter === 1 || userInfo.statu === 2"
<text>优惠券</text> >
<text class="num">{{ userInfo.couponCount || 0 }}</text> <text>当前佣金</text>
</view> <text class="num">{{ userInfo.brokeragePrice || 0 }}</text>
</view> </view>
<view class="myOrder"> <view @click="goIntegral()" class="item" v-else>
<view class="title acea-row row-between-wrapper"> <text>当前积分</text>
<text>我的订单</text> <text class="num">{{ userInfo.integral || 0 }}</text>
<text @click="goMyOrder()" class="allOrder"> </view>
<text>全部订单</text> <view @click="goUserCoupon()" class="item">
<text class="iconfont icon-jiantou"></text> <text>优惠券</text>
</text> <text class="num">{{ userInfo.couponCount || 0 }}</text>
</view> </view>
<view class="orderState acea-row row-middle"> </view>
<view @click="goMyOrder(0)" class="item"> <view class="myOrder">
<view class="pictrue"> <view class="title acea-row row-between-wrapper">
<image src="@/static/images/dfk.png" /> <text>我的订单</text>
<text class="order-status-num" v-if="userInfo.orderStatusNum.unpaidCount > 0">{{ userInfo.orderStatusNum.unpaidCount }}</text> <text @click="goMyOrder()" class="allOrder">
</view> <text>全部订单</text>
<view>待付款</view> <text class="iconfont icon-jiantou"></text>
</view> </text>
<view @click="goMyOrder(1)" class="item"> </view>
<view class="pictrue"> <view class="orderState acea-row row-middle">
<image src="@/static/images/dfh.png" /> <view @click="goMyOrder(0)" class="item">
<text class="order-status-num" v-if="userInfo.orderStatusNum.unshippedCount > 0">{{ userInfo.orderStatusNum.unshippedCount }}</text> <view class="pictrue">
</view> <image src="@/static/images/dfk.png" />
<view>待发货</view> <text
</view> class="order-status-num"
<view @click="goMyOrder(2)" class="item"> v-if="userInfo.orderStatusNum.unpaidCount > 0"
<view class="pictrue"> >{{ userInfo.orderStatusNum.unpaidCount }}</text>
<image src="@/static/images/dsh.png" /> </view>
<text class="order-status-num" v-if="userInfo.orderStatusNum.receivedCount > 0">{{ userInfo.orderStatusNum.receivedCount }}</text> <view>待付款</view>
</view> </view>
<text>待收货</text> <view @click="goMyOrder(1)" class="item">
</view> <view class="pictrue">
<view @click="goMyOrder(3)" class="item"> <image src="@/static/images/dfh.png" />
<view class="pictrue"> <text
<image src="@/static/images/dpj.png" /> class="order-status-num"
<text class="order-status-num" v-if="userInfo.orderStatusNum.evaluatedCount > 0">{{ userInfo.orderStatusNum.evaluatedCount }}</text> v-if="userInfo.orderStatusNum.unshippedCount > 0"
</view> >{{ userInfo.orderStatusNum.unshippedCount }}</text>
<text>待评价</text> </view>
</view> <view>待发货</view>
<view @click="goReturnList()" class="item"> </view>
<view class="pictrue"> <view @click="goMyOrder(2)" class="item">
<image src="@/static/images/sh.png" /> <view class="pictrue">
<text class="order-status-num" v-if="userInfo.orderStatusNum.refundCount > 0">{{ userInfo.orderStatusNum.refundCount }}</text> <image src="@/static/images/dsh.png" />
</view> <text
<text>售后/退款</text> class="order-status-num"
</view> v-if="userInfo.orderStatusNum.receivedCount > 0"
</view> >{{ userInfo.orderStatusNum.receivedCount }}</text>
</view> </view>
<view class="myService"> <text>待收货</text>
<view class="title acea-row row-middle"> </view>
<text>我的服务</text> <view @click="goMyOrder(3)" class="item">
</view> <view class="pictrue">
<view class="serviceList acea-row row-middle"> <image src="@/static/images/dpj.png" />
<template v-for="(item, MyMenusIndex) in MyMenus"> <text
<view class="item" :key="MyMenusIndex" @click="goPages(MyMenusIndex)" v-if="item.url"> class="order-status-num"
<view class="pictrue"> v-if="userInfo.orderStatusNum.evaluatedCount > 0"
<image :src="item.pic" /> >{{ userInfo.orderStatusNum.evaluatedCount }}</text>
</view> </view>
<view>{{ item.name }}</view> <text>待评价</text>
</view> </view>
</template> <view @click="goReturnList()" class="item">
</view> <view class="pictrue">
</view> <image src="@/static/images/sh.png" />
<!--<view --> <text
<!--class="item"--> class="order-status-num"
<!--@click="changeswitch(true)"--> v-if="userInfo.orderStatusNum.refundCount > 0"
<!--v-if="userInfo.phone && isWeixin"--> >{{ userInfo.orderStatusNum.refundCount }}</text>
<!--&gt;--> </view>
<!--<view class="pictrue"><image src="@/static/images/switch.png" /></view>--> <text>售后/退款</text>
<!--<view>账号切换</!--<view>--> </view>
<!--</!--<view>--> </view>
<!-- </view> </view>
<view class="myService">
<view class="title acea-row row-middle">
<text>我的服务</text>
</view>
<view class="serviceList acea-row row-middle">
<template v-for="(item, MyMenusIndex) in MyMenus">
<view
class="item"
:key="MyMenusIndex"
@click="goPages(MyMenusIndex)"
v-if="item.url&&item.id!='230'"
>
<view class="pictrue">
<image :src="item.pic" />
</view>
<view>{{ item.name }}</view>
</view>
</template>
</view>
</view>
<!--<view -->
<!--class="item"-->
<!--@click="changeswitch(true)"-->
<!--v-if="userInfo.phone && isWeixin"-->
<!--&gt;-->
<!--<view class="pictrue"><image src="@/static/images/switch.png" /></view>-->
<!--<view>账号切换</!--<view>-->
<!--</!--<view>-->
<!-- </view>
</view>--> </view>-->
</view> </view>
<view class="by"> <view class="by">
<text class="by-text">By@意象</text> <text class="by-text">By@意象</text>
</view> </view>
<view class="by"> <view class="by">
<view> <view>
<text class="by-text">Copyright © 2020</text> <text class="by-text">Copyright © 2020</text>
</view> </view>
<view> <view>
<text class="by-text">漯河市大有前途网络科技有限公司</text> <text class="by-text">漯河市大有前途网络科技有限公司</text>
</view> </view>
</view> </view>
<view class="footer-line-height"></view> <view class="footer-line-height"></view>
<!-- <SwitchWindow <!-- <SwitchWindow
v-on:changeswitch="changeswitch" v-on:changeswitch="changeswitch"
:switchActive="switchActive" :switchActive="switchActive"
:login_type="userInfo.login_type" :login_type="userInfo.login_type"
></SwitchWindow> --> ></SwitchWindow>-->
</view> </view>
<Authorization v-if="!$store.getters.token" /> <Authorization v-if="!$store.getters.token" />
</view> </view>
</template> </template>
<script> <script>
import { import { getUser, getMenuUser, bindingPhone } from "@/api/user";
getUser, import { isWeixin, VUE_APP_RESOURCES_URL } from "@/utils";
getMenuUser, import SwitchWindow from "@/components/SwitchWindow";
bindingPhone import Authorization from "@/pages/authorization/index";
} from "@/api/user"; import { mapGetters } from "vuex";
import {
isWeixin,
VUE_APP_RESOURCES_URL
} from "@/utils";
import SwitchWindow from "@/components/SwitchWindow";
import Authorization from "@/pages/authorization/index";
import {
mapGetters
} from "vuex";
const NAME = "User"; const NAME = "User";
export default { export default {
name: NAME, name: NAME,
components: { components: {
SwitchWindow, SwitchWindow,
Authorization Authorization
}, },
props: {}, props: {},
data: function() { data: function() {
return { return {
MyMenus: [], MyMenus: [],
switchActive: false, switchActive: false,
isWeixin: false isWeixin: false
}; };
}, },
computed: mapGetters(["userInfo"]), computed: mapGetters(["userInfo"]),
methods: { methods: {
goReturnList() { goReturnList() {
this.$yrouter.push("/pages/order/ReturnList/index"); this.$yrouter.push("/pages/order/ReturnList/index");
}, },
goMyOrder(type) { goMyOrder(type) {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/order/MyOrder/index", path: "/pages/order/MyOrder/index",
query: { query: {
type type
} }
}); });
}, },
goUserCoupon() { goUserCoupon() {
this.$yrouter.push("/pages/user/coupon/UserCoupon/index"); this.$yrouter.push("/pages/user/coupon/UserCoupon/index");
}, },
goIntegral() { goIntegral() {
this.$yrouter.push("/pages/user/signIn/Integral/index"); this.$yrouter.push("/pages/user/signIn/Integral/index");
}, },
goUserPromotion() { goUserPromotion() {
this.$yrouter.push("/pages/user/promotion/UserPromotion/index"); this.$yrouter.push("/pages/user/promotion/UserPromotion/index");
}, },
goUserAccount() { goUserAccount() {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/user/UserAccount/index" path: "/pages/user/UserAccount/index"
}); });
}, },
goPersonalData() { goPersonalData() {
this.$yrouter.push("/pages/user/PersonalData/index"); this.$yrouter.push("/pages/user/PersonalData/index");
}, },
getPhoneNumber: function(e) { getPhoneNumber: function(e) {
console.log(e.mp.detail); console.log(e.mp.detail);
// //
if (e.mp.detail.errMsg == "getPhoneNumber:ok") { if (e.mp.detail.errMsg == "getPhoneNumber:ok") {
uni.showLoading({ uni.showLoading({
title: "绑定中" title: "绑定中"
}); });
// //
uni.getProvider({ uni.getProvider({
service: "oauth", service: "oauth",
success: function(res) { success: function(res) {
console.log(res.provider); console.log(res.provider);
// h5 // h5
if (res.provider) { if (res.provider) {
uni.login({ uni.login({
success: loginRes => { success: loginRes => {
bindingPhone({ bindingPhone({
code: loginRes.code, code: loginRes.code,
encryptedData: e.mp.detail.encryptedData, encryptedData: e.mp.detail.encryptedData,
iv: e.mp.detail.iv iv: e.mp.detail.iv
}) })
.then(res => { .then(res => {
this.User(); this.User();
uni.hideLoading(); uni.hideLoading();
uni.showToast({ uni.showToast({
title: res.msg, title: res.msg,
icon: "success", icon: "success",
duration: 2000 duration: 2000
}); });
}) })
.catch(error => { .catch(error => {
uni.showToast({ uni.showToast({
title: error.msg || error.response.data.msg, title: error.msg || error.response.data.msg,
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
}); });
} }
}); });
} }
} }
}); });
} else { } else {
uni.showToast({ uni.showToast({
title: "已拒绝授权", title: "已拒绝授权",
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
} }
}, },
changeswitch: function(data) { changeswitch: function(data) {
this.switchActive = data; this.switchActive = data;
}, },
User: function() { User: function() {
let that = this; let that = this;
// getUser().then(res => { // getUser().then(res => {
// that.user = res.data; // that.user = res.data;
// that.orderStatusNum = res.data.orderStatusNum; // that.orderStatusNum = res.data.orderStatusNum;
// }); // });
}, },
MenuUser: function() { MenuUser: function() {
let that = this; let that = this;
getMenuUser().then(res => { getMenuUser().then(res => {
that.MyMenus = res.data.routine_my_menus; that.MyMenus = res.data.routine_my_menus;
}); });
}, },
goPages: function(index) { goPages: function(index) {
let url = this.MyMenus[index].uniapp_url; let url = this.MyMenus[index].uniapp_url;
if ( if (
url === "/pages/user/promotion/UserPromotion/index" && url === "/pages/user/promotion/UserPromotion/index" &&
this.userInfo.statu === 1 this.userInfo.statu === 1
) { ) {
if (!this.userInfo.isPromoter) { if (!this.userInfo.isPromoter) {
uni.showToast({ uni.showToast({
title: "您还没有推广权限!!", title: "您还没有推广权限!!",
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
return; return;
} }
} }
if ( if (
url === "/pages/orderAdmin/OrderIndex/index" && url === "/pages/orderAdmin/OrderIndex/index" &&
!this.userInfo.adminid !this.userInfo.adminid
) { ) {
uni.showToast({ uni.showToast({
title: "您还不是管理员!!", title: "您还不是管理员!!",
icon: "none", icon: "none",
duration: 2000 duration: 2000
}); });
return; return;
} }
this.$yrouter.push({ this.$yrouter.push({
path: this.MyMenus[index].uniapp_url path: this.MyMenus[index].uniapp_url
}); });
} }
}, },
watch: { watch: {
userInfo() { userInfo() {
this.MenuUser(); this.MenuUser();
} }
}, },
onShow() { onShow() {
console.log(this.$store.getters.token) console.log(this.$store.getters.token);
console.log(this.userInfo); console.log(this.userInfo);
if (this.$store.getters.token) { if (this.$store.getters.token) {
this.User(); this.User();
this.MenuUser(); this.MenuUser();
this.isWeixin = isWeixin(); this.isWeixin = isWeixin();
} }
} }
}; };
</script> </script>
<style lang="less"> <style lang="less">
.footer-line-height { .footer-line-height {
height: 1*100rpx; height: 1 * 100rpx;
} }
.order-status-num { .order-status-num {
min-width: 0.33*100rpx; min-width: 0.33 * 100rpx;
background-color: #fff; background-color: #fff;
color: #00c17b; color: #00c17b;
border-radius: 15px; border-radius: 15px;
position: absolute; position: absolute;
right: -0.14*100rpx; right: -0.14 * 100rpx;
top: -0.15*100rpx; top: -0.15 * 100rpx;
font-size: 0.2*100rpx; font-size: 0.2 * 100rpx;
padding: 0 0.08*100rpx; padding: 0 0.08 * 100rpx;
border: 1px solid #00c17b; border: 1px solid #00c17b;
} }
.pictrue { .pictrue {
position: relative; position: relative;
} }
.switch-h5 { .switch-h5 {
margin-left: 0.2*100rpx; margin-left: 0.2 * 100rpx;
} }
.binding { .binding {
margin-top: 0.1*100rpx; margin-top: 0.1 * 100rpx;
display: inline-block; display: inline-block;
padding: 0.05*100rpx 0.2*100rpx; padding: 0.05 * 100rpx 0.2 * 100rpx;
background-color: #ca1f10; background-color: #ca1f10;
border-radius: 50px; border-radius: 50px;
font-size: 0.22*100rpx; font-size: 0.22 * 100rpx;
line-height: 1.5; line-height: 1.5;
border: 1px solid #e8695e; border: 1px solid #e8695e;
color: #ffffff; color: #ffffff;
} }
.by{ .by {
text-align:center; text-align: center;
margin-top: 30rpx margin-top: 30rpx;
} }
.by-text{ .by-text {
text-align:center; text-align: center;
font-size: 30rpx; font-size: 30rpx;
} }
</style> </style>

4
pages/user/UserAccount/index.vue

@ -62,8 +62,8 @@ export default {
this.getActivity(); this.getActivity();
}, },
methods: { methods: {
goUserBill(id) { goUserBill(types) {
this.$yrouter.push({ path: "/pages/user/UserBill/index", query: { id } }); this.$yrouter.push({ path: "/pages/user/UserBill/index", query: { types } });
}, },
getIndex: function() { getIndex: function() {
let that = this; let that = this;

65
pages/user/address/AddAddress/index.vue

@ -12,7 +12,7 @@
<view class="item acea-row row-between-wrapper"> <view class="item acea-row row-between-wrapper">
<view class="name">所在地区</view> <view class="name">所在地区</view>
<view class="picker acea-row row-between-wrapper select-value form-control"> <view class="picker acea-row row-between-wrapper select-value form-control">
<view class="address"> <view class="address" @tap="openAddres">
<!-- <picker <!-- <picker
@columnchange="addRessColumnchange" @columnchange="addRessColumnchange"
@change="changeAddress" @change="changeAddress"
@ -23,7 +23,7 @@
<text class="uni-input" v-if="model2">{{model2}}</text> <text class="uni-input" v-if="model2">{{model2}}</text>
<text class="uni-input" v-else>请选择地区</text> <text class="uni-input" v-else>请选择地区</text>
</picker>--> </picker>-->
<text class="uni-input" @tap="openAddres2" >{{model2||'请选择'}}</text> <text class="uni-input">{{model2||'请选择'}}</text>
<simple-address <simple-address
ref="simpleAddress" ref="simpleAddress"
:pickerValueDefault="cityPickerValueDefault" :pickerValueDefault="cityPickerValueDefault"
@ -102,40 +102,40 @@ export default {
}, },
methods: { methods: {
openAddres() { openAddres() {
this.cityPickerValueDefault = [0, 0, 1];
this.$refs.simpleAddress.open();
},
openAddres2() {
// label // label
if (this.address.province) {
// city
if(this.address.province){ try {
let str = "市";
var index = this.$refs.simpleAddress.queryIndex( let city = this.address.city;
[this.address.province, this.address.city, this.address.district], if (this.address.province.indexOf(str) != -1) {
"label" city = "市辖区";
); }
console.log(index); var index = this.$refs.simpleAddress.queryIndex(
this.cityPickerValueDefault = index.index; [this.address.province, city, this.address.district],
} "label"
this.$refs.simpleAddress.open(); );
}, this.cityPickerValueDefault = index.index;
openAddres3() { } catch (error) {}
// value }
var index = this.$refs.simpleAddress.queryIndex(
[13, 1302, 130203],
"value"
);
console.log(index);
this.cityPickerValueDefault = index.index;
this.$refs.simpleAddress.open(); this.$refs.simpleAddress.open();
// var index = this.$refs.simpleAddress.queryIndex(
// [13, 1302, 130203],
// "value"
// );
// this.cityPickerValueDefault = index.index;
// this.$refs.simpleAddress.open();
}, },
onConfirm(e) { onConfirm(e) {
this.pickerText = JSON.stringify(e); this.pickerText = JSON.stringify(e);
this.model2 = e.label; this.model2 = e.label;
this.address.province = e.labelArr[0] || "";
this.address.city = e.labelArr[1] || "";
this.address.district = e.labelArr[2] || "";
console.log(this.pickerText); console.log(this.pickerText);
}, },
getUserAddress: function() { getUserAddress: function() {
if (!this.id) return false; if (!this.id) return false;
let that = this; let that = this;
getAddress(that.id).then(res => { getAddress(that.id).then(res => {
@ -226,3 +226,12 @@ if(this.address.province){
} }
}; };
</script> </script>
<style lang="less">
.address {
text {
width: 100%;
display: block;
}
}
</style>

285
pages/user/promotion/Poster/index.vue

@ -1,153 +1,160 @@
<template> <template>
<view class="distribution-posters"> <view class="distribution-posters">
<view class="slider-banner banner"> <view class="slider-banner banner">
<swiper indicatorDots="true"> <swiper indicatorDots="true">
<block v-for="(item, infoIndex) in info" :key="infoIndex"> <block v-for="(item, infoIndex) in info" :key="infoIndex">
<swiper-item> <swiper-item>
<image class="slide-image" :src="item.wap_poster" mode="widthFix" show-menu-by-longpress /> <image
</swiper-item> class="slide-image"
</block> :src="item.wap_poster"
</swiper> mode="widthFix"
</view> show-menu-by-longpress
<view class="keep bg-color-red" @click="saveImg">保存海报</view> />
</view> </swiper-item>
</block>
</swiper>
</view>
<view class="keep bg-color-red" @click="saveImg">保存海报</view>
</view>
</template> </template>
<script> <script>
// import { swiper, swiperSlide } from "vue-awesome-swiper"; // import { swiper, swiperSlide } from "vue-awesome-swiper";
import { import { getSpreadImg } from "@/api/user";
getSpreadImg
} from "@/api/user";
export default { export default {
name: "Poster", name: "Poster",
components: { components: {
// swiper, // swiper,
// swiperSlide // swiperSlide
}, },
props: {}, props: {},
data: function() { data: function() {
return { return {
swiperPosters: { swiperPosters: {
speed: 1000, speed: 1000,
effect: "coverflow", effect: "coverflow",
slidesPerView: "auto", slidesPerView: "auto",
centeredSlides: true, centeredSlides: true,
coverflowEffect: { coverflowEffect: {
rotate: 0, // rotate: 0, //
stretch: -20, // stretch: -20, //
depth: 100, // depth: 100, //
modifier: 3, // modifier: 3, //
slideShadows: false // slideShadows: false //
}, },
observer: true, observer: true,
observeParents: true observeParents: true
}, },
info: [], info: [],
activeIndex: 0 activeIndex: 0
}; };
}, },
mounted: function() { mounted: function() {
this.getIndex(); this.getIndex();
let that = this; let that = this;
// this.swiper.on("slideChange", function() { // this.swiper.on("slideChange", function() {
// that.activeIndex = that.swiper.activeIndex; // that.activeIndex = that.swiper.activeIndex;
// }); // });
}, },
computed: { computed: {
swiper() { swiper() {
// return this.$refs.mySwiper.swiper; // return this.$refs.mySwiper.swiper;
} }
}, },
methods: { methods: {
getIndex: function() { getIndex: function() {
let that = this; let that = this;
let form = {} let form = {};
if (this.$deviceType == 'app') { if (this.$deviceType == "app") {
form.form = 'app' form.form = "app";
} }
getSpreadImg(form).then( getSpreadImg(form).then(
res => { res => {
that.info = res.data; that.info = res.data;
}, },
err => { err => {
uni.showToast({ uni.showToast({
title: err.msg || err.response.data.msg, title: err.msg || err.response.data.msg,
icon: 'none', icon: "none",
duration: 2000 duration: 2000
}); });
} }
); );
}, },
downloadIamge: function(imgsrc, name) { downloadIamge: function(imgsrc, name) {
var that = this; var that = this;
this.isDown = true; this.isDown = true;
var downloadUrl = imgsrc; var downloadUrl = imgsrc;
if (!wx.saveImageToPhotosAlbum) { if (!wx.saveImageToPhotosAlbum) {
uni.showModal({ uni.showModal({
title: "提示", title: "提示",
content: "当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。" content:
}); "当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。"
that.openDialogVisible = true; });
that.openDialogVisible = true;
return; return;
} }
// wx.getSetting "scope.writePhotosAlbum" scope // wx.getSetting "scope.writePhotosAlbum" scope
wx.getSetting({ wx.getSetting({
success(res) { success(res) {
if (!res.authSetting["scope.writePhotosAlbum"]) { if (!res.authSetting["scope.writePhotosAlbum"]) {
that.openDialogVisible = true; that.openDialogVisible = true;
// //
wx.authorize({ wx.authorize({
scope: "scope.writePhotosAlbum", scope: "scope.writePhotosAlbum",
success() { success() {
that.downloadImage(downloadUrl); that.downloadImage(downloadUrl);
}, },
fail() { fail() {
// //
// //
wx.openSetting({ wx.openSetting({
success: function(data) {}, success: function(data) {},
fail: function(data) {} fail: function(data) {}
}); });
} }
}); });
} else { } else {
that.downloadImage(downloadUrl); that.downloadImage(downloadUrl);
} }
}, },
fail(res) { fail(res) {
that.openDialogVisible = true; that.openDialogVisible = true;
} }
}); });
}, },
saveImg: function() { saveImg: function() {
this.downloadIamge( this.downloadIamge(
this.info[this.activeIndex].wap_poster, this.info[this.activeIndex].wap_poster,
"poster" + this.activeIndex "poster" + this.activeIndex
); );
} }
} }
}; };
</script> </script>
<style scoped lang="less"> <style lang="less">
.distribution-posters { page {
height: 100%; height: 100%;
} }
.distribution-posters {
height: 100%;
}
.banenr { .banenr {
height: 100%; height: 100%;
} }
.banner swiper { .banner swiper {
height: 100%; height: 100%;
} }
.banner .slide-image { .banner .slide-image {
width: 100%; width: 100%;
height: auto; height: auto;
} }
</style> </style>

15
store/index.js

@ -4,7 +4,7 @@ import Vuex from "vuex";
Vue.use(Vuex); Vue.use(Vuex);
const debug = process.env.NODE_ENV !== "production"; const debug = process.env.NODE_ENV !== "production";
import store from "@/utils/store/cookie"; import cookie from "@/utils/store/cookie";
import { import {
getUserInfo getUserInfo
} from "@/api/user"; } from "@/api/user";
@ -18,8 +18,9 @@ const vuexStore = new Vuex.Store({
isAuthorizationPage: false, isAuthorizationPage: false,
// 是否授权 // 是否授权
isAuthorization: false, isAuthorization: false,
token: store.get(LOGIN_KEY) || null, // 不建议从这里取 token,但是删除掉会影响其他的页面
userInfo: store.get('userInfo'), token: cookie.get(LOGIN_KEY) || null,
userInfo: cookie.get('userInfo'),
$deviceType: null, $deviceType: null,
}, },
mutations: { mutations: {
@ -46,12 +47,12 @@ const vuexStore = new Vuex.Store({
}, },
LOGIN(state, token, expires_time) { LOGIN(state, token, expires_time) {
state.token = token; state.token = token;
store.set(LOGIN_KEY, token, expires_time); cookie.set(LOGIN_KEY, token, expires_time);
}, },
LOGOUT(state) { LOGOUT(state) {
state.token = null; state.token = null;
state.userInfo = null state.userInfo = null
store.clearAll() cookie.clearAll()
}, },
BACKGROUND_COLOR(state, color) { BACKGROUND_COLOR(state, color) {
state.color = color; state.color = color;
@ -99,9 +100,9 @@ const vuexStore = new Vuex.Store({
}, user) { }, user) {
commit("UPDATE_USERINFO", user); commit("UPDATE_USERINFO", user);
if (user) { if (user) {
store.set('userInfo', user) cookie.set('userInfo', user)
} else { } else {
store.set('userInfo', null) cookie.set('userInfo', null)
} }
}, },
changeAuthorizationPage({ changeAuthorizationPage({

64
utils/index.js

@ -122,13 +122,18 @@ export const replaceLogin = (msg) => {
console.log(uni, 989) console.log(uni, 989)
if (Vue.prototype.$deviceType == 'weixin') { if (Vue.prototype.$deviceType == 'weixin') {
// 如果是微信小程序,跳转到授权页 // 如果是微信小程序,跳转到授权页
replace({ login({
path: '/pages/authorization/index', fail: () => {
query: { replace({
redirect: `/${getCurrentPageUrl()}`, path: '/pages/authorization/index',
...parseQuery() query: {
redirect: `/${getCurrentPageUrl()}`,
...parseQuery()
}
})
} }
}) })
} else { } else {
// 如果不是小程序跳转到登录页 // 如果不是小程序跳转到登录页
push({ push({
@ -218,7 +223,7 @@ export const login = (option) => {
console.log('登录成功4') console.log('登录成功4')
store.commit("LOGIN", data.token, dayjs(data.expires_time)); store.commit("LOGIN", data.token, dayjs(data.expires_time));
console.log('登录成功5') console.log('登录成功5')
console.log(store)
handleGetUserInfo() handleGetUserInfo()
}).catch(error => { }).catch(error => {
@ -259,6 +264,7 @@ export const login = (option) => {
} }
export const handleGetUserInfo = () => { export const handleGetUserInfo = () => {
console.log('登录后请求用户信息')
getUser().then(res => { getUser().then(res => {
console.log(res.data, '登录后的样式') console.log(res.data, '登录后的样式')
store.dispatch('setUserInfo', res.data) store.dispatch('setUserInfo', res.data)
@ -296,10 +302,17 @@ export const handleGetUserInfo = () => {
path: url, path: url,
query query
}) })
switchTab({ if (url == '/pages/home/index' || url == '/pages/shop/GoodsClass/index' || url == '/pages/shop/ShoppingCart/index' || url == '/pages/user/User/index') {
path: `${url}`, switchTab({
query path: `${url}`,
}); query
});
} else {
push({
path: `${url}`,
query
})
}
}) })
} }
@ -341,9 +354,25 @@ export function parseRoute($mp) {
} }
} }
export function auth() {
/**
* 如何判断权限?
* 用户如果登录了系统会留下两个东西一个是token一个是userInfo
* token存在会过期的问题如果长时间没有打开小程序会导致登录失效出现打开一个页面瞬间跳转到授权页面的问题
* 解决办法保存token的时候加上过期时间每次请求都取一下缓存里的token
* userInfo只是用来限时用户信息作用并不是很大
* ps只需要判断 token 是否存在即可
*/
console.log(cookie.get('login_status'), 'token')
if (cookie.get('login_status')) {
return true
}
return false
}
export const handleLoginStatus = (location, complete, fail, success) => { export const handleLoginStatus = (location, complete, fail, success) => {
console.log(location, '开始健全') console.log(location, '开始检验权限')
// 不登录可访问的页面 // 不登录可访问的页面
let page = [{ let page = [{
path: '/pages/Loading/index', path: '/pages/Loading/index',
@ -374,8 +403,7 @@ export const handleLoginStatus = (location, complete, fail, success) => {
path = location.path path = location.path
} }
console.log(store.getters.userInfo, '用户信息') if (!auth()) {
if (!store.getters.token) {
page.map((item) => { page.map((item) => {
console.log(item.path == path) console.log(item.path == path)
if (item.path == path) { if (item.path == path) {
@ -534,15 +562,16 @@ export const PosterCanvas = (store, successCallBack) => {
mask: true mask: true
}); });
getImageInfo([store.image, store.code]).then(res => { getImageInfo([store.image, store.code]).then(res => {
console.log(res)
let contentHh = 48 * 1.3 let contentHh = 48 * 1.3
const ctx = uni.createCanvasContext('myCanvas'); const ctx = uni.createCanvasContext('myCanvas')
ctx.clearRect(0, 0, 0, 0); ctx.clearRect(0, 0, 0, 0);
const WIDTH = 747 const WIDTH = 747
const HEIGHT = 1326; const HEIGHT = 1326;
ctx.fillStyle = "#FFFFFF"; ctx.fillStyle = "#FFFFFF";
ctx.fillRect(0, 0, WIDTH, HEIGHT); ctx.fillRect(0, 0, WIDTH, HEIGHT);
ctx.drawImage(res[1].path, 40, 1064, 200, 200);
ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH); ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH);
ctx.drawImage(res[1].path, 40, 1064, 200, 200);
ctx.save(); ctx.save();
let r = 90; let r = 90;
let d = r * 2; let d = r * 2;
@ -562,10 +591,10 @@ export const PosterCanvas = (store, successCallBack) => {
ctx.setTextAlign('center') ctx.setTextAlign('center')
ctx.setFontSize(22); ctx.setFontSize(22);
ctx.setFillStyle('#333333'); ctx.setFillStyle('#333333');
console.log('长按识别二维码立即购买')
ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167); ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167);
// ctx.drawImage(store.code, 199, 1064, 200, 200);
ctx.save(); ctx.save();
ctx.draw(true, function (oi) { ctx.draw(true, () => {
uni.canvasToTempFilePath({ uni.canvasToTempFilePath({
canvasId: 'myCanvas', canvasId: 'myCanvas',
fileType: 'png', fileType: 'png',
@ -581,6 +610,7 @@ export const PosterCanvas = (store, successCallBack) => {
}) })
}); });
}) })
// uni.getImageInfo({ // uni.getImageInfo({

31
utils/request.js

@ -2,6 +2,7 @@ import Fly from "flyio/dist/npm/wx";
import $store from "../store"; import $store from "../store";
import toLogin from "@/libs/login"; import toLogin from "@/libs/login";
import { VUE_APP_API_URL } from "@/config"; import { VUE_APP_API_URL } from "@/config";
import cookie from "@/utils/store/cookie";
const fly = new Fly() const fly = new Fly()
@ -28,28 +29,38 @@ fly.interceptors.response.use(
const defaultOpt = { login: true }; const defaultOpt = { login: true };
function baseRequest(options) { function baseRequest(options) {
const token = $store.state.token;
const headers = options.headers || {}; // 从缓存中获取 token 防止 token 失效后还会继续请求的情况
if (options.login) { const token = cookie.get('login_status');
headers["Authorization"] = "Bearer " + token;
// 合并传参过来的 headers
// 如果接口需要登录,携带 token 去请求
options.headers = {
...options.headers,
Authorization: "Bearer " + token
} }
options.headers = headers; // 如果需要登录才可访问的接口没有拿到 token 视为登录失效
if (options.login && !token) { if (options.login === true && !token) {
// 跳转到登录或授权页面
toLogin(); toLogin();
// 提示错误信息
return Promise.reject({ msg: "未登录", toLogin: true }); return Promise.reject({ msg: "未登录", toLogin: true });
} }
// 结构请求需要的参数
const { url, params, data, login, ...option } = options const { url, params, data, login, ...option } = options
// 发起请求
return fly.request(url, params || data, { return fly.request(url, params || data, {
...option ...option
}).then(res => { }).then(res => {
console.log(res) console.log(res)
// console.log(url,params,data, ...option) // console.log(url,params,data, ...option)
const data = res.data || {}; const data = res.data || {};
if (res.status !== 200) if (res.status !== 200) {
return Promise.reject({ msg: "请求失败", res, data }); return Promise.reject({ msg: "请求失败", res, data });
}
if ([410000, 410001, 410002].indexOf(data.status) !== -1) { if ([410000, 410001, 410002].indexOf(data.status) !== -1) {
toLogin(); toLogin();
return Promise.reject({ msg: res.data.msg, res, data, toLogin: true }); return Promise.reject({ msg: res.data.msg, res, data, toLogin: true });

Loading…
Cancel
Save