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. 12
      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. 114
      pages/activity/GoodsSeckill/index.vue
  14. 47
      pages/activity/GroupDetails/index.vue
  15. 66
      pages/activity/GroupRule/index.vue
  16. 16
      pages/activity/SeckillDetails/index.vue
  17. 8
      pages/home/index.vue
  18. 38
      pages/order/MyOrder/index.vue
  19. 154
      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. 102
      pages/shop/GoodsCon/index.vue
  24. 2
      pages/shop/HotNewGoods/index.vue
  25. 4
      pages/shop/ShoppingCart/index.vue
  26. 66
      pages/user/User/index.vue
  27. 4
      pages/user/UserAccount/index.vue
  28. 51
      pages/user/address/AddAddress/index.vue
  29. 27
      pages/user/promotion/Poster/index.vue
  30. 15
      store/index.js
  31. 46
      utils/index.js
  32. 27
      utils/request.js

2
api/store.js

@ -69,7 +69,7 @@ export function getHostProducts(page, limit) {
* */
export function getGroomList(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 {
border: 0;
}
@ -1739,18 +1742,21 @@ flex: 0 2.4*100rpx;
width: 100%;
height: 0.86*100rpx;
padding-left: 0.23*100rpx;
padding-right: 0.23*100rpx;
position: fixed;
left: 0;
top: 0;
z-index: 5;
box-sizing: border-box;
}
.productList .search .input {
width: 6.4*100rpx;
flex:1;
height: 0.6*100rpx;
background-color: #fff;
border-radius: 0.5*100rpx;
padding: 0 0.2*100rpx;
margin-right: 0.23*100rpx;
}
.productList .search .input input {
@ -2548,7 +2554,7 @@ flex: 0 2.4*100rpx;
width: 100%;
}
.product-con .product-intro .conter image{
.product-con .product-intro .conter *{
width: 100% !important;
display: block !important;
}
@ -4494,7 +4500,7 @@ flex: 0 2.4*100rpx;
transform: rotate(180deg);
}
.bargain .bargainGang .title .pictrue img,
.bargain .bargainGang .title .pictrue image,
.bargain .goodsDetails .title .pictrue image{
width: 100%;
height: 100%;
@ -6984,7 +6990,7 @@ flex: 0 2.4*100rpx;
}
.product-con .footerRush .bnt {
width: 86%;
width: 100%;
text-align: center;
line-height: 1*100rpx;
height: 100%;
@ -8425,3 +8431,17 @@ flex: 0 2.4*100rpx;
}
.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>
<view class="time">
{{ tipText }}
<text class="styleAll" v-if="isDay === true">{{ day }}</text>
<!-- <text class="timeTxt">{{ dayText }}</text> -->
<text v-if="rtipText">{{ rtipText }}</text>
<text class="styleAll" v-if="risDay === true">{{ rday }}</text>
<text class="timeTxt" v-if="rdayText">{{ rdayText }}</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="timeTxt">{{ minuteText }}</text>
<text class="timeTxt" v-if="rminuteText">{{ rminuteText }}</text>
<text class="styleAll">{{ second }}</text>
<!-- <text class="timeTxt">{{ secondText }}</text> -->
<text class="timeTxt" v-if="rsecondText">{{ rsecondText }}</text>
</view>
</template>
<script>
export default {
name: "CountDown",
props: {
props: [
//
tipText: {
type: String,
default: "倒计时"
},
dayText: {
type: String,
default: "天"
},
hourText: {
type: String,
default: "时"
},
minuteText: {
type: String,
default: "分"
},
secondText: {
type: String,
default: "秒"
},
datatime: {
type: Number,
default: 0
},
isDay: {
type: Boolean,
default: true
}
},
'tipText',
'dayText',
'hourText',
'minuteText',
'secondText',
'datatime',
'isDay'
],
data: function() {
return {
day: "00",
hour: "00",
minute: "00",
second: "00"
second: "00",
rtipText: "倒计时",
rdayText: "天",
rhourText: "时",
rminuteText: "分",
rsecondText: "秒",
rdatatime: 0,
risDay: true
};
},
created: function() {
// this.show_time();
},
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();
},
methods: {

15
components/OrderGoods.vue

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

24
components/ProductWindow.vue

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

12
components/StorePoster.vue

@ -1,6 +1,8 @@
<template>
<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">
<image
src="@/static/images/poster-close.png"
@ -33,7 +35,13 @@
@click="posterImageClose"
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>
<view class="mask"></view>

10
main.js

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

12
pages/activity/BargainRecord/index.vue

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

23
pages/activity/DargainDetails/index.vue

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

3
pages/activity/GoodsBargain/index.vue

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

114
pages/activity/GoodsSeckill/index.vue

@ -5,24 +5,36 @@
</view>
<scroll-view scroll-y="false" scroll-x="true">
<view class="timeScroll">
<view class="" v-for="(item, index) in timeList" :key="index">
<view :class="{'timeItem':true,'active':active==index}" @click="changeTime(index)">
<view class v-for="(item, index) in timeList" :key="index">
<view :class="{'timeItem':true,'active':active==index}" @click="setTime(index)">
<view class="time">{{ item.time }}</view>
<view class="state">{{ item.state }}</view>
</view>
</view>
</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 class="countDown font-color-red acea-row row-center-wrapper">
<view v-if="item.status === 0" class="activity">活动已结束</view>
<count-down :is-day="false" :tip-text="'距结束仅剩 '" :day-text="''" :hour-text="' : '" :minute-text="' : '"
:second-text="''" :datatime="datatime" v-if="item.status === 1"></count-down>
<count-down
:isDay="false"
:tipText="'距结束仅剩 '"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="datatime"
v-if="item.status === 1"
></count-down>
<view v-if="item.status === 2" class="activity">活动即将开始</view>
</view>
<view class="list">
<view class="item acea-row row-between-wrapper" v-for="(itemSeckill, indexSeckill) in seckillList" :key="indexSeckill">
<view
class="item acea-row row-between-wrapper"
v-for="(itemSeckill, indexSeckill) in seckillList"
:key="indexSeckill"
>
<view class="pictrue">
<image :src="itemSeckill.image" />
</view>
@ -37,13 +49,21 @@
<view class="piece font-color-red" v-text="'仅剩' + itemSeckill.stock + '件'"></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 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="noCommodity"
style="background-color: #fff;"
v-if="seckillList.length === 0 && page > 1"
>
<view class="noPictrue">
<image src="@/static/images/noGood.png" class="image" />
</view>
@ -59,23 +79,20 @@
</view>
</template>
<script>
import {
getSeckillConfig,
getSeckillList
} from '@/api/activity';
import CountDown from '@/components/CountDown';
import { getSeckillConfig, getSeckillList } from "@/api/activity";
import CountDown from "@/components/CountDown";
// import { Tab, Tabs } from "vant-weapp";
import Loading from '@/components/Loading';
import Loading from "@/components/Loading";
export default {
name: 'GoodsSeckill',
name: "GoodsSeckill",
components: {
CountDown
},
props: {},
data: function() {
return {
headerImg: '',
headerImg: "",
timeList: [],
sticky: false,
loading: false,
@ -86,7 +103,7 @@
loadingList: false, // false true
page: 1, //
limit: 5, //
title: [],
title: []
};
},
mounted: function() {
@ -97,47 +114,54 @@
},
methods: {
changeTime: function(index) {
this.active = index
console.log(index);
this.active = index;
this.getSeckillList();
},
mountedStart: function() {
var that = this;
uni.showLoading();
getSeckillConfig().then(res => {
that.$set(that, 'headerImg', res.data.lovely);
that.$set(that, 'timeList', res.data.seckillTime);
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 = [];
title = res.data.seckillTime.map((item, index) => {
return {
name: 'div',
name: "div",
attrs: {
class: 'timeItem'
class: "timeItem"
},
children: [{
name: 'div',
children: [
{
name: "div",
attrs: {
class: 'time'
class: "time"
},
children: [{
type: 'text',
children: [
{
type: "text",
text: item.time
}]
}
]
},
{
name: 'div',
name: "div",
attrs: {
class: 'state'
class: "state"
},
children: [{
type: 'text',
children: [
{
type: "text",
text: item.state
}]
}
]
}
]
};
});
that.$set(that, 'title', title);
that.$set(that, "title", title);
that.datatime = that.timeList[that.active].stop;
that.getSeckillList();
that.$nextTick(function() {
@ -146,10 +170,14 @@
});
});
},
setTime: function(event) {
setTime: function(index) {
var that = this;
that.active = event.mp.detail.index;
that.page = 1;
that.loadingList = false;
that.status = false;
that.active = index;
that.datatime = that.timeList[that.active].stop;
this.seckillList=[]
that.getSeckillList();
},
getSeckillList: function() {
@ -171,7 +199,7 @@
var that = this;
var time = that.timeList[that.active].stop;
this.$yrouter.push({
path: '/pages/activity/SeckillDetails/index',
path: "/pages/activity/SeckillDetails/index",
query: {
id,
time
@ -197,9 +225,8 @@
background-color: none;
&.active {
.time {
color: #00c17b
color: #00c17b;
}
.state {
@ -207,12 +234,11 @@
color: #fff;
opacity: 1;
border-radius: 30rpx;
padding: 0 .2*100rpx;
padding: 0 0.2 * 100rpx;
font-weight: 800;
height: .3*100rpx;
line-height: .3*100rpx;
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
}
}

47
pages/activity/GroupDetails/index.vue

@ -50,12 +50,12 @@
<text>人成团</text>
</view>
<count-down
:is-day="false"
:tip-text="'剩余 '"
:day-text="''"
:hour-text="':'"
:minute-text="':'"
:second-text="''"
:isDay="false"
:tipText="'剩余 '"
:dayText="false"
:hourText="':'"
:minuteText="':'"
:secondText="false"
:datatime="item.stopTime"
></count-down>
</view>
@ -104,12 +104,17 @@
<view class="product-intro">
<view class="title">产品介绍</view>
<view class="conter" v-html="storeInfo.description"></view>
<!-- <view class="conter" v-html=""></view> -->
</view>
<view style="height:100rpx;"></view>
<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>客服</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 class="bnt bg-color-violet" @click="openAlone">单独购买</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 { postCartAdd } from "@/api/store";
import { imageBase64 } from "@/api/public";
import {
getCoupon,
getCollectAdd,
getCollectDel,
getUserInfo
} from "@/api/user";
const NAME = "GroupDetails";
export default {
@ -188,7 +199,8 @@ export default {
cart_num: 1
}
},
cartNum: 1
cartNum: 1,
userCollect: false
};
},
watch: {
@ -206,11 +218,27 @@ export default {
openAlone: function() {
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() {
var that = this;
console.log(that)
console.log(that);
let id = that.$yroute.query.id;
getCombinationDetail(id).then(res => {
that.userCollect = res.data.userCollect;
that.$set(that, "storeInfo", res.data.storeInfo);
that.$set(that, "imgUrls", res.data.storeInfo.sliderImageArr);
that.$set(that, "itemNew", res.data.pinkOkList);
@ -330,6 +358,7 @@ export default {
overflow: hidden;
}
.product-con .footer-group .bnt {
// flex:1;
width: 43%;
}
.product-con .footer-group .bnt.bg-color-violet {

66
pages/activity/GroupRule/index.vue

@ -20,16 +20,28 @@
<view class="line"></view>
<view class="name acea-row row-center-wrapper">
<text>剩余</text>
<count-down :is-day="false" :tip-text="''" :day-text="''" :hour-text="' : '" :minute-text="' : '" :second-text="''"
:datatime="pinkT.stopTime"></count-down>
<count-down
:isDay="false"
:tipText="false"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="pinkT.stopTime"
></count-down>
<text>结束</text>
</view>
<view class="line"></view>
</view>
<view class="tips-warp">
<text class="tips font-color-red" v-if="pinkBool === 1">恭喜您拼团成功</text>
<text class="tips" v-else-if="pinkBool === -1">还差{{ count }}拼团失败</text>
<text class="tips font-color-red" v-else-if="pinkBool === 0">拼团中还差{{ count }}人拼团成功</text>
<view class="list acea-row row-middle" :class="[pinkBool === 1 || pinkBool === -1 ? 'result' : '',iShidden ? 'on' : '']">
</view>
<view
class="list acea-row row-middle"
:class="[pinkBool === 1 || pinkBool === -1 ? 'result' : '',iShidden ? 'on' : '']"
>
<view class="pictrue">
<image :src="pinkT.avatar" />
</view>
@ -42,13 +54,29 @@
<image class="img-none" src="@/static/images/vacancy.png" />
</view>
</view>
<view v-if="(pinkBool === 1 || pinkBool === -1) && count > 9" class="lookAll acea-row row-center-wrapper" @click="lookAll">
<view
v-if="(pinkBool === 1 || pinkBool === -1) && count > 9"
class="lookAll acea-row row-center-wrapper"
@click="lookAll"
>
{{ 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="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>
@ -62,18 +90,9 @@
</template>
<script>
import CountDown from "@/components/CountDown";
import {
getCombinationPink,
getCombinationRemove
} from "@/api/activity";
import {
postCartAdd
} from "@/api/store";
import {
isWeixin,
parseQuery,
handleQrCode
} from "@/utils/index";
import { getCombinationPink, getCombinationRemove } from "@/api/activity";
import { postCartAdd } from "@/api/store";
import { isWeixin, parseQuery, handleQrCode } from "@/utils/index";
const NAME = "GroupRule";
export default {
@ -137,7 +156,7 @@
.catch(err => {
uni.showToast({
title: err.msg || err.response.data.msg,
icon: 'none',
icon: "none",
duration: 2000
});
});
@ -218,3 +237,10 @@
}
};
</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>距秒杀结束仅剩</view>
<count-down
:is-day="false"
:tip-text="''"
:day-text="''"
:hour-text="' : '"
:minute-text="' : '"
:second-text="''"
:isDay="false"
:tipText="false"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="datatime"
></count-down>
</view>
@ -39,13 +39,13 @@
</view>
<view style="height:100rpx;"></view>
<view class="footerRush acea-row row-between-wrapper">
<view
<!-- <view
class="customerSer acea-row row-center-wrapper row-column"
@click="routerGo()"
>
<view class="iconfont icon-kefu"></view>
<view>客服</view>
</view>
</view> -->
<view class="bnt bg-color-red" @click="tapBuy">立即购买</view>
</view>
<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>
<view class="title acea-row row-between-wrapper">
<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>
</view>
@ -53,8 +53,8 @@
<view class="newProductsScroll">
<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="pro-info line1">{{ item.storeName }}</view>
<view class="money font-color-red">{{ item.price }}</view>
<view class="pro-info line1"><text>{{ item.storeName }}</text></view>
<view class="money font-color-red"><text>{{ item.price }}</text></view>
</view>
</view>
</scroll-view>
@ -99,7 +99,7 @@
<view class="wrapper" v-if="benefit.length > 0">
<view class="title acea-row row-between-wrapper">
<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>
</view>

38
pages/order/MyOrder/index.vue

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

154
pages/order/OrderDetails/index.vue

@ -20,51 +20,75 @@
<view :class="{ on: status.type === 4 }">已完成</view>
</view>
<view class="progress acea-row row-between-wrapper">
<view class="iconfont" :class="[
<view
class="iconfont"
:class="[
status.type === 0 || status.type === 9
? 'icon-webicon318'
: 'icon-yuandianxiao',
status.type >= 0 ? 'font-color-red' : ''
]"></view>
]"
></view>
<view class="line" :class="{ 'bg-color-red': status.type > 0 && status.type != 9 }"></view>
<view class="iconfont" :class="[
<view
class="iconfont"
:class="[
status.type === 1 ? 'icon-webicon318' : 'icon-yuandianxiao',
status.type >= 1 && status.type != 6 && status.type != 9
? 'font-color-red'
: ''
]"></view>
<view class="line" :class="{
]"
></view>
<view
class="line"
:class="{
'bg-color-red':
status.type > 1 && status.type != 6 && status.type != 9
}"
v-if="orderInfo.shipping_type === 1"></view>
<view class="iconfont" :class="[
v-if="orderInfo.shipping_type === 1"
></view>
<view
class="iconfont"
:class="[
status.type === 2 ? 'icon-webicon318' : 'icon-yuandianxiao',
status.type >= 2 && status.type != 6 && status.type != 9
? 'font-color-red'
: ''
]"
v-if="orderInfo.shippingType === 1"></view>
<view class="line" :class="{
v-if="orderInfo.shippingType === 1"
></view>
<view
class="line"
:class="{
'bg-color-red':
status.type > 2 && status.type != 6 && status.type != 9
}"></view>
<view class="iconfont" :class="[
}"
></view>
<view
class="iconfont"
:class="[
status.type === 3 ? 'icon-webicon318' : 'icon-yuandianxiao',
status.type >= 3 && status.type != 6 && status.type != 9
? 'font-color-red'
: ''
]"></view>
<view class="line" :class="{
]"
></view>
<view
class="line"
:class="{
'bg-color-red':
status.type > 3 && status.type != 6 && status.type != 9
}"></view>
<view class="iconfont" :class="[
}"
></view>
<view
class="iconfont"
:class="[
status.type == 4 ? 'icon-webicon318' : 'icon-yuandianxiao',
status.type >= 4 && status.type != 6 && status.type != 9
? 'font-color-red'
: ''
]"></view>
]"
></view>
</view>
</view>
<!--<view-->
@ -246,21 +270,30 @@
<view class="bnt cancel" @click="goGoodsReturn(orderInfo)">申请退款</view>
</template>
<template v-if="status.type == 2">
<view class="bnt default" @click="
<view
class="bnt default"
@click="
$yrouter.push({ path: '/pages/order/Logistics/index' ,query:{id:orderInfo.orderId }})
">查看物流</view>
"
>查看物流</view>
<view class="bnt bg-color-red" @click="takeOrder">确认收货</view>
</template>
<template v-if="status.type == 3 && orderInfo.deliveryType == 'express'">
<view class="bnt default" @click="
<view
class="bnt default"
@click="
$yrouter.push({ path: '/pages/order/Logistics/index' ,query:{id:orderInfo.orderId }})
">查看物流</view>
"
>查看物流</view>
</template>
<template v-if="status.type == 4">
<view class="bnt cancel" @click="delOrder">删除订单</view>
<view class="bnt default" @click="
<view
class="bnt default"
@click="
$yrouter.push({ path: '/pages/order/Logistics/index' ,query:{id:orderInfo.orderId }})
">查看物流</view>
"
>查看物流</view>
</template>
<template v-if="status.type == 6">
<view class="bnt bg-color-red" @click="goGroupRule(orderInfo)">查看拼团</view>
@ -268,32 +301,16 @@
</view>
<Payment v-model="pay" :types="payType" @checked="toPay" :balance="userInfo.nowMoney"></Payment>
<view class="geoPage" v-if="mapShow">
<iframe width="100%" height="100%" frameborder="0" scrolling="no" :src="'https://apis.map.qq.com/uri/v1/geocoder?coord=' + system_store.latitude + ',' +system_store.longitude +'&referer=' +mapKey"></iframe>
<iframe
width="100%"
height="100%"
frameborder="0"
scrolling="no"
:src="'https://apis.map.qq.com/uri/v1/geocoder?coord=' + system_store.latitude + ',' +system_store.longitude +'&referer=' +mapKey"
></iframe>
</view>
</view>
</template>
<script>
export default {
methods: {
goGoodsReturn(orderInfo) {
this.$yrouter.push({
path: "/pages/order/GoodsReturn/index",
query: {
id: orderInfo.orderId
}
});
},
goGroupRule(orderInfo) {
this.$yrouter.push({
path: "/pages/activity/GroupRule/index",
query: {
id: orderInfo.pinkId
}
});
}
}
};
</script>
<style scoped lang="less">
.geoPage {
position: fixed;
@ -429,18 +446,11 @@
</style>
<script>
import OrderGoods from "@/components/OrderGoods";
import {
orderDetail
} from "@/api/order";
import { orderDetail } from "@/api/order";
import Payment from "@/components/Payment";
import DataFormat from "@/components/DataFormat";
import {
isWeixin,
copyClipboard
} from "@/utils";
import {
mapGetters
} from "vuex";
import { isWeixin, copyClipboard } from "@/utils";
import { mapGetters } from "vuex";
import {
cancelOrderHandle,
takeOrderHandle,
@ -495,6 +505,23 @@
},
methods: {
copyClipboard,
goGoodsReturn(orderInfo) {
this.$yrouter.push({
path: "/pages/order/GoodsReturn/index",
query: {
id: orderInfo.orderId
}
});
},
goGroupRule(orderInfo) {
console.log(orderInfo)
this.$yrouter.push({
path: "/pages/activity/GroupRule/index",
query: {
id: orderInfo.pinkId
}
});
},
showChang: function() {
//
if (isWeixin()) {
@ -508,10 +535,10 @@
if (!this.mapKey)
uni.showToast({
title: "暂无法使用查看地图,请配置您的腾讯地图key",
icon: 'none',
icon: "none",
duration: 2000
});
return
return;
this.mapShow = true;
}
},
@ -519,7 +546,8 @@
const history = this.app.history,
last = history[history.length - 1] || {};
if (last.name === "MyOrder") return this.$yrouter.back();
else return this.$yrouter.replace({
else
return this.$yrouter.replace({
path: "/order/list/"
});
},
@ -559,9 +587,9 @@
delivery_type = orderInfo.deliveryType,
seckill_id = orderInfo.seckillId ? parseInt(orderInfo.seckillId) : 0,
bargain_id = orderInfo.bargainId ? parseInt(orderInfo.bargainId) : 0,
combination_id = orderInfo.combinationId ?
parseInt(orderInfo.combinationId) :
0;
combination_id = orderInfo.combinationId
? parseInt(orderInfo.combinationId)
: 0;
status = {
type: type,
class_status: 0
@ -592,10 +620,10 @@
if (!id) {
uni.showToast({
title: "订单不存在",
icon: 'none',
icon: "none",
duration: 2000
});
return
return;
}
orderDetail(id)
.then(res => {

3
pages/order/OrderSubmission/index.vue

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

2
pages/orderAdmin/OrderIndex/index.vue

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

4
pages/shop/GoodsClass/index.vue

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

102
pages/shop/GoodsCon/index.vue

@ -6,8 +6,15 @@
<view class="money font-color-red">
<text></text>
<text class="num">{{ storeInfo.price }}</text>
<text class="vip-money" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0">{{ storeInfo.vipPrice }}</text>
<image src="@/static/images/vip.png" class="image" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0" />
<text
class="vip-money"
v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0"
>{{ storeInfo.vipPrice }}</text>
<image
src="@/static/images/vip.png"
class="image"
v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0"
/>
</view>
<view class="iconfont icon-fenxiang" @click="listenerActionSheet"></view>
</view>
@ -20,7 +27,11 @@
<view class="coupon acea-row row-between-wrapper" @click="couponTap" v-if="couponList.length">
<text class="hide line1 acea-row">
<text>优惠券</text>
<text class="activity" v-for="(item, couponListEq) in couponList" :key="couponListEq">{{ item.use_min_price }}{{ item.coupon_price }}</text>
<text
class="activity"
v-for="(item, couponListEq) in couponList"
:key="couponListEq"
>{{ item.use_min_price }}{{ item.coupon_price }}</text>
</text>
<view class="iconfont icon-jiantou"></view>
</view>
@ -99,7 +110,11 @@
<view class="iconfont" :class="storeInfo.userCollect ? 'icon-shoucang1' : 'icon-shoucang'"></view>
<text>收藏</text>
</view>
<view @click="goShoppingCart()" class="item animated" :class="animated === true ? 'bounceIn' : ''">
<view
@click="goShoppingCart()"
class="item animated"
:class="animated === true ? 'bounceIn' : ''"
>
<view class="iconfont icon-gouwuche1">
<text class="num bg-color-red" v-if="CartCount > 0">{{CartCount}}</text>
</view>
@ -116,7 +131,11 @@
</view>
<CouponPop v-on:changeFun="changeFun" :coupon="coupon"></CouponPop>
<ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cart_num"></ProductWindow>
<StorePoster v-on:setPosterImageStatus="setPosterImageStatus" :posterImageStatus="posterImageStatus" :posterData="posterData"></StorePoster>
<StorePoster
v-on:setPosterImageStatus="setPosterImageStatus"
:posterImageStatus="posterImageStatus"
:posterData="posterData"
></StorePoster>
<ShareInfo v-on:setShareInfoStatus="setShareInfoStatus" :shareInfoStatus="shareInfoStatus"></ShareInfo>
<view class="generate-posters acea-row row-middle" :class="posters ? 'on' : ''">
<view class="item" v-if="weixinStatus === true" @click="setShareInfoStatus">
@ -130,8 +149,17 @@
</view>
<view class="mask" @touchmove.prevent @click="listenerActionClose" v-show="posters"></view>
<view class="geoPage" v-if="mapShow">
<iframe width="100%" height="100%" frameborder="0" scrolling="no" :src="'https://apis.map.qq.com/uri/v1/geocoder?coord=' +system_store.latitude +',' +system_store.longitude +'&referer=' +mapKey"></iframe>
</view>
<iframe
width="100%"
height="100%"
frameborder="0"
scrolling="no"
:src="'https://apis.map.qq.com/uri/v1/geocoder?coord=' +system_store.latitude +',' +system_store.longitude +'&referer=' +mapKey"
></iframe>
</view>
<div class="posterCanvasWarp">
<canvas class="posterCanvas" canvas-id="myCanvas"></canvas>
</div>
</view>
</template>
@ -156,18 +184,10 @@
getCollectDel,
getUserInfo
} from "@/api/user";
import {
isWeixin,
PosterCanvas,
handleQrCode
} from "@/utils";
import { isWeixin, PosterCanvas, handleQrCode } from "@/utils";
// import { wechatEvevt } from "@/libs/wechat";
import {
imageBase64
} from "@/api/public";
import {
mapGetters
} from "vuex";
import { imageBase64 } from "@/api/public";
import { mapGetters } from "vuex";
export default {
name: "GoodsCon",
@ -237,7 +257,7 @@
},
computed: mapGetters(["isLogin"]),
mounted: function() {
console.log(this)
console.log(this);
let url = handleQrCode();
console.log(url);
if (url && url.productId) {
@ -305,11 +325,11 @@
//
productCon: function() {
let that = this;
let form = {}
if (this.$deviceType == 'app') {
form.form = 'app'
let form = {};
if (this.$deviceType == "app") {
form.form = "app";
}
console.log(form, 2222)
console.log(form, 2222);
getProductDetail(that.id, form)
.then(res => {
that.$set(that, "storeInfo", res.data.storeInfo);
@ -485,27 +505,15 @@
},
//
ChangeAttr: function(res) {
let productSelectValue = this.productValue[res];
if (productSelectValue) {
let productSelect = {
...this.attr.productSelect,
image: productSelectValue.image,
price: productSelectValue.price,
stock: productSelectValue.stock,
unique: productSelectValue.unique,
cart_num: 1
};
let attr = {
...this.attr,
productSelect
};
this.attr = attr;
// this.$set(this.attr.productSelect, "image", productSelect.image);
// this.$set(this.attr.productSelect, "price", productSelect.price);
// this.$set(this.attr.productSelect, "stock", productSelect.stock);
// this.$set(this.attr.productSelect, "unique", productSelect.unique);
// this.$set(this.attr.productSelect, "cart_num", 1);
this.$set(this, "attrValue", res);
let productSelect = this.productValue[res.value];
if (productSelect) {
this.attr.productAttr[res.indexw].index = res.indexn;
this.$set(this.attr.productSelect, "image", productSelect.image);
this.$set(this.attr.productSelect, "price", productSelect.price);
this.$set(this.attr.productSelect, "stock", productSelect.stock);
this.$set(this.attr.productSelect, "unique", productSelect.unique);
this.$set(this.attr.productSelect, "cart_num", 1);
this.$set(this, "attrValue", res.value);
this.$set(this, "attrTxt", "已选择");
} else {
this.$set(this.attr.productSelect, "image", this.storeInfo.image);
@ -569,8 +577,10 @@
productId: that.id,
cartNum: that.attr.productSelect.cart_num,
new: news,
uniqueId: that.attr.productSelect !== undefined ?
that.attr.productSelect.unique : ""
uniqueId:
that.attr.productSelect !== undefined
? that.attr.productSelect.unique
: ""
};
postCartAdd(q)
.then(function(res) {

2
pages/shop/HotNewGoods/index.vue

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

4
pages/shop/ShoppingCart/index.vue

@ -1,6 +1,6 @@
<template>
<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="item">
<text class="iconfont icon-xuanzhong"></text>
@ -130,7 +130,7 @@
<view class="placeOrder bg-color-red" @click="placeOrder">立即下单</view>
</view>
<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>
</view>

66
pages/user/User/index.vue

@ -1,6 +1,6 @@
<template>
<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="picTxt acea-row row-between-wrapper">
<view class="pictrue">
@ -18,7 +18,12 @@
<text>ID{{ userInfo.uid || 0}}</text>
<text class="iconfont icon-bianji1"></text>
</view>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" class="binding" v-else>
<button
open-type="getPhoneNumber"
@getphonenumber="getPhoneNumber"
class="binding"
v-else
>
<text>绑定手机号</text>
</button>
</view>
@ -31,7 +36,11 @@
<text>我的余额</text>
<text class="num">{{ userInfo.nowMoney || 0 }}</text>
</view>
<view @click="goUserPromotion()" class="item" v-if="userInfo.isPromoter === 1 || userInfo.statu === 2">
<view
@click="goUserPromotion()"
class="item"
v-if="userInfo.isPromoter === 1 || userInfo.statu === 2"
>
<text>当前佣金</text>
<text class="num">{{ userInfo.brokeragePrice || 0 }}</text>
</view>
@ -56,35 +65,50 @@
<view @click="goMyOrder(0)" class="item">
<view class="pictrue">
<image src="@/static/images/dfk.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.unpaidCount > 0">{{ userInfo.orderStatusNum.unpaidCount }}</text>
<text
class="order-status-num"
v-if="userInfo.orderStatusNum.unpaidCount > 0"
>{{ userInfo.orderStatusNum.unpaidCount }}</text>
</view>
<view>待付款</view>
</view>
<view @click="goMyOrder(1)" class="item">
<view class="pictrue">
<image src="@/static/images/dfh.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.unshippedCount > 0">{{ userInfo.orderStatusNum.unshippedCount }}</text>
<text
class="order-status-num"
v-if="userInfo.orderStatusNum.unshippedCount > 0"
>{{ userInfo.orderStatusNum.unshippedCount }}</text>
</view>
<view>待发货</view>
</view>
<view @click="goMyOrder(2)" class="item">
<view class="pictrue">
<image src="@/static/images/dsh.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.receivedCount > 0">{{ userInfo.orderStatusNum.receivedCount }}</text>
<text
class="order-status-num"
v-if="userInfo.orderStatusNum.receivedCount > 0"
>{{ userInfo.orderStatusNum.receivedCount }}</text>
</view>
<text>待收货</text>
</view>
<view @click="goMyOrder(3)" class="item">
<view class="pictrue">
<image src="@/static/images/dpj.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.evaluatedCount > 0">{{ userInfo.orderStatusNum.evaluatedCount }}</text>
<text
class="order-status-num"
v-if="userInfo.orderStatusNum.evaluatedCount > 0"
>{{ userInfo.orderStatusNum.evaluatedCount }}</text>
</view>
<text>待评价</text>
</view>
<view @click="goReturnList()" class="item">
<view class="pictrue">
<image src="@/static/images/sh.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.refundCount > 0">{{ userInfo.orderStatusNum.refundCount }}</text>
<text
class="order-status-num"
v-if="userInfo.orderStatusNum.refundCount > 0"
>{{ userInfo.orderStatusNum.refundCount }}</text>
</view>
<text>售后/退款</text>
</view>
@ -96,7 +120,12 @@
</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">
<view
class="item"
:key="MyMenusIndex"
@click="goPages(MyMenusIndex)"
v-if="item.url&&item.id!='230'"
>
<view class="pictrue">
<image :src="item.pic" />
</view>
@ -138,20 +167,11 @@
</view>
</template>
<script>
import {
getUser,
getMenuUser,
bindingPhone
} from "@/api/user";
import {
isWeixin,
VUE_APP_RESOURCES_URL
} from "@/utils";
import { getUser, getMenuUser, bindingPhone } from "@/api/user";
import { isWeixin, VUE_APP_RESOURCES_URL } from "@/utils";
import SwitchWindow from "@/components/SwitchWindow";
import Authorization from "@/pages/authorization/index";
import {
mapGetters
} from "vuex";
import { mapGetters } from "vuex";
const NAME = "User";
@ -304,7 +324,7 @@
}
},
onShow() {
console.log(this.$store.getters.token)
console.log(this.$store.getters.token);
console.log(this.userInfo);
if (this.$store.getters.token) {
this.User();
@ -355,7 +375,7 @@
.by {
text-align: center;
margin-top: 30rpx
margin-top: 30rpx;
}
.by-text {
text-align: center;

4
pages/user/UserAccount/index.vue

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

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

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

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

@ -4,7 +4,12 @@
<swiper indicatorDots="true">
<block v-for="(item, infoIndex) in info" :key="infoIndex">
<swiper-item>
<image class="slide-image" :src="item.wap_poster" mode="widthFix" show-menu-by-longpress />
<image
class="slide-image"
:src="item.wap_poster"
mode="widthFix"
show-menu-by-longpress
/>
</swiper-item>
</block>
</swiper>
@ -14,9 +19,7 @@
</template>
<script>
// import { swiper, swiperSlide } from "vue-awesome-swiper";
import {
getSpreadImg
} from "@/api/user";
import { getSpreadImg } from "@/api/user";
export default {
name: "Poster",
@ -61,9 +64,9 @@
methods: {
getIndex: function() {
let that = this;
let form = {}
if (this.$deviceType == 'app') {
form.form = 'app'
let form = {};
if (this.$deviceType == "app") {
form.form = "app";
}
getSpreadImg(form).then(
res => {
@ -72,7 +75,7 @@
err => {
uni.showToast({
title: err.msg || err.response.data.msg,
icon: 'none',
icon: "none",
duration: 2000
});
}
@ -86,7 +89,8 @@
if (!wx.saveImageToPhotosAlbum) {
uni.showModal({
title: "提示",
content: "当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。"
content:
"当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。"
});
that.openDialogVisible = true;
@ -133,7 +137,10 @@
};
</script>
<style scoped lang="less">
<style lang="less">
page {
height: 100%;
}
.distribution-posters {
height: 100%;
}

15
store/index.js

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

46
utils/index.js

@ -122,6 +122,8 @@ export const replaceLogin = (msg) => {
console.log(uni, 989)
if (Vue.prototype.$deviceType == 'weixin') {
// 如果是微信小程序,跳转到授权页
login({
fail: () => {
replace({
path: '/pages/authorization/index',
query: {
@ -129,6 +131,9 @@ export const replaceLogin = (msg) => {
...parseQuery()
}
})
}
})
} else {
// 如果不是小程序跳转到登录页
push({
@ -218,7 +223,7 @@ export const login = (option) => {
console.log('登录成功4')
store.commit("LOGIN", data.token, dayjs(data.expires_time));
console.log('登录成功5')
console.log(store)
handleGetUserInfo()
}).catch(error => {
@ -259,6 +264,7 @@ export const login = (option) => {
}
export const handleGetUserInfo = () => {
console.log('登录后请求用户信息')
getUser().then(res => {
console.log(res.data, '登录后的样式')
store.dispatch('setUserInfo', res.data)
@ -296,10 +302,17 @@ export const handleGetUserInfo = () => {
path: url,
query
})
if (url == '/pages/home/index' || url == '/pages/shop/GoodsClass/index' || url == '/pages/shop/ShoppingCart/index' || url == '/pages/user/User/index') {
switchTab({
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) => {
console.log(location, '开始健全')
console.log(location, '开始检验权限')
// 不登录可访问的页面
let page = [{
path: '/pages/Loading/index',
@ -374,8 +403,7 @@ export const handleLoginStatus = (location, complete, fail, success) => {
path = location.path
}
console.log(store.getters.userInfo, '用户信息')
if (!store.getters.token) {
if (!auth()) {
page.map((item) => {
console.log(item.path == path)
if (item.path == path) {
@ -534,15 +562,16 @@ export const PosterCanvas = (store, successCallBack) => {
mask: true
});
getImageInfo([store.image, store.code]).then(res => {
console.log(res)
let contentHh = 48 * 1.3
const ctx = uni.createCanvasContext('myCanvas');
const ctx = uni.createCanvasContext('myCanvas')
ctx.clearRect(0, 0, 0, 0);
const WIDTH = 747
const HEIGHT = 1326;
ctx.fillStyle = "#FFFFFF";
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[1].path, 40, 1064, 200, 200);
ctx.save();
let r = 90;
let d = r * 2;
@ -562,10 +591,10 @@ export const PosterCanvas = (store, successCallBack) => {
ctx.setTextAlign('center')
ctx.setFontSize(22);
ctx.setFillStyle('#333333');
console.log('长按识别二维码立即购买')
ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167);
// ctx.drawImage(store.code, 199, 1064, 200, 200);
ctx.save();
ctx.draw(true, function (oi) {
ctx.draw(true, () => {
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
fileType: 'png',
@ -581,6 +610,7 @@ export const PosterCanvas = (store, successCallBack) => {
})
});
})
// uni.getImageInfo({

27
utils/request.js

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

Loading…
Cancel
Save