266 lines
6.4 KiB
Vue
266 lines
6.4 KiB
Vue
|
<template>
|
|||
|
<view class="integral-mall">
|
|||
|
|
|||
|
<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :up="upOption">
|
|||
|
<view class="header bg-primary flex row-between white">
|
|||
|
<router-link to="/bundle/pages/integral_sign/integral_sign">
|
|||
|
<view class="user-integral flex">
|
|||
|
<u-icon class="m-r-16" :name="require('@/bundle/static/icon_integral.png')" :size="44"></u-icon>
|
|||
|
我的积分:<text class="xxl bold">{{ integral }}</text>
|
|||
|
</view>
|
|||
|
</router-link>
|
|||
|
<router-link to="/bundle/pages/exchange_order/exchange_order">
|
|||
|
兑换订单 <u-icon name="arrow-right"></u-icon>
|
|||
|
</router-link>
|
|||
|
</view>
|
|||
|
<view class="main">
|
|||
|
<view class="sort-bar flex bg-white">
|
|||
|
<view class="sort-bar-item flex-2 flex row-center" v-for="(item, index) in sortConfig" :key="index"
|
|||
|
@tap="handleSort(item)">
|
|||
|
<text :class="item.value ? 'primary' : ''">{{ item.name }}</text>
|
|||
|
<view class="arrow-icon flex-col col-center row-center" v-if="!item.setValue">
|
|||
|
<u-icon name="arrow-up-fill"
|
|||
|
:color="item.value == 'asc' ? colorConfig.primary : colorConfig.normal"></u-icon>
|
|||
|
<u-icon name="arrow-down-fill"
|
|||
|
:color="item.value == 'desc' ? colorConfig.primary : colorConfig.normal"></u-icon>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="flex-1 flex row-center" @tap="changeGoodsType">
|
|||
|
<image class="icon-sm"
|
|||
|
:src="goodsType === 'one' ? '/static/images/icon_double.png' : '/static/images/icon_one.png'">
|
|||
|
</image>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="goods-lists" :class="{
|
|||
|
'goods-lists--one': goodsType === 'one'
|
|||
|
}">
|
|||
|
<view class="goods-item" v-for="(item, index) in goodsLists" :key="index">
|
|||
|
<router-link :to="`/bundle/pages/integral_goods_details/integral_goods_details?id=${item.id}`">
|
|||
|
<view class="goods-item-info">
|
|||
|
<view class="goods-image">
|
|||
|
<view class="image-wrap">
|
|||
|
<u-image :src="item.image" width="100%" height="100%"></u-image>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="goods-info">
|
|||
|
<view class="goods-name line-2">
|
|||
|
{{ item.name }}
|
|||
|
</view>
|
|||
|
<view class="goods-price primary m-t-10">
|
|||
|
<price-format :color="colorConfig.primary" :show-subscript="false"
|
|||
|
:first-size="36" :second-size="24" :price="item.need_integral" />
|
|||
|
<text class="xs">积分</text>
|
|||
|
<block v-if="item.exchange_way === 2">
|
|||
|
<text>+</text>
|
|||
|
<price-format :color="colorConfig.primary" :show-subscript="false"
|
|||
|
:first-size="36" :second-size="24" :price="item.need_money" />
|
|||
|
<text class="xs">元</text>
|
|||
|
</block>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</router-link>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
</mescroll-body>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import {
|
|||
|
getIntegralGoods
|
|||
|
} from '@/api/activity'
|
|||
|
import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins";
|
|||
|
import {trottle} from '@/utils/tools'
|
|||
|
export default {
|
|||
|
mixins: [MescrollMixin],
|
|||
|
data() {
|
|||
|
return {
|
|||
|
sortConfig: [{
|
|||
|
name: '最新',
|
|||
|
type: 'sort_by_new',
|
|||
|
value: 'desc',
|
|||
|
setValue: 'desc'
|
|||
|
},
|
|||
|
{
|
|||
|
name: '积分',
|
|||
|
type: 'sort_by_integral',
|
|||
|
value: ''
|
|||
|
},
|
|||
|
{
|
|||
|
name: '兑换量',
|
|||
|
type: 'sort_by_sales',
|
|||
|
value: '',
|
|||
|
setValue: 'desc'
|
|||
|
}
|
|||
|
],
|
|||
|
goodsType: 'double',
|
|||
|
upOption: {
|
|||
|
noMoreSize: 2,
|
|||
|
auto: false,
|
|||
|
empty: {
|
|||
|
icon: '/static/images/goods_null.png',
|
|||
|
tip: "暂无商品",
|
|||
|
}
|
|||
|
},
|
|||
|
goodsLists: [],
|
|||
|
integral: ''
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
changeGoodsType() {
|
|||
|
this.goodsType = this.goodsType === 'one' ? 'double' : 'one'
|
|||
|
},
|
|||
|
handleSort(current) {
|
|||
|
this.sortConfig.forEach((item) => {
|
|||
|
if(current.type != item.type) {
|
|||
|
item.value = ''
|
|||
|
return
|
|||
|
}
|
|||
|
if(item.setValue) {
|
|||
|
item.value = item.setValue
|
|||
|
return
|
|||
|
}
|
|||
|
if(item.value == 'asc') {
|
|||
|
item.value = 'desc'
|
|||
|
}else{
|
|||
|
item.value ='asc'
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
},
|
|||
|
upCallback(page) {
|
|||
|
const pageNum = page.num; // 页码, 默认从1开始
|
|||
|
const pageSize = page.size; // 页长, 默认每页10条
|
|||
|
const sort = this.sortConfig.find((item) => item.value) || {}
|
|||
|
getIntegralGoods({
|
|||
|
[sort.type]: sort.value,
|
|||
|
page_no: pageNum,
|
|||
|
page_size: pageSize
|
|||
|
}).then(res => {
|
|||
|
if (res.code == 1) {
|
|||
|
const {
|
|||
|
goods,
|
|||
|
integral
|
|||
|
} = res.data
|
|||
|
this.integral = integral
|
|||
|
let curPageData = goods.lists;
|
|||
|
let curPageLen = curPageData.length;
|
|||
|
let hasNext = !!goods.more;
|
|||
|
if (pageNum == 1) this.goodsLists = [];
|
|||
|
this.goodsLists = this.goodsLists.concat(curPageData);
|
|||
|
this.mescroll.endSuccess(curPageLen, hasNext);
|
|||
|
}else{
|
|||
|
this.mescroll.endErr();
|
|||
|
}
|
|||
|
}).catch(() => {
|
|||
|
this.mescroll.endErr();
|
|||
|
})
|
|||
|
},
|
|||
|
},
|
|||
|
watch: {
|
|||
|
sortConfig: {
|
|||
|
handler(val) {
|
|||
|
this.goodsLists = []
|
|||
|
this.mescroll.resetUpScroll()
|
|||
|
},
|
|||
|
deep: true
|
|||
|
}
|
|||
|
},
|
|||
|
onLoad() {
|
|||
|
this.handleSort = trottle(this.handleSort, 500, this);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss">
|
|||
|
page {
|
|||
|
padding: 0;
|
|||
|
}
|
|||
|
$goods-margin: 8rpx;
|
|||
|
|
|||
|
.integral-mall {
|
|||
|
.header {
|
|||
|
padding: 22rpx 24rpx;
|
|||
|
}
|
|||
|
|
|||
|
.main {
|
|||
|
.sort-bar {
|
|||
|
height: 80rpx;
|
|||
|
|
|||
|
.sort-bar-item {
|
|||
|
height: 100%;
|
|||
|
}
|
|||
|
|
|||
|
.arrow-icon {
|
|||
|
transform: scale(0.4);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.goods-lists {
|
|||
|
padding: 20rpx 20rpx 0;
|
|||
|
margin: -$goods-margin;
|
|||
|
display: flex;
|
|||
|
flex-wrap: wrap;
|
|||
|
.goods-item {
|
|||
|
|
|||
|
width: 50%;
|
|||
|
|
|||
|
.goods-item-info {
|
|||
|
margin: $goods-margin;
|
|||
|
border-radius: 14rpx;
|
|||
|
background: #fff;
|
|||
|
overflow: hidden;
|
|||
|
|
|||
|
.goods-image {
|
|||
|
flex: none;
|
|||
|
position: relative;
|
|||
|
height: 0;
|
|||
|
padding-top: 100%;
|
|||
|
|
|||
|
.image-wrap {
|
|||
|
position: absolute;
|
|||
|
top: 0;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
bottom: 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.goods-info {
|
|||
|
padding: 14rpx;
|
|||
|
|
|||
|
.goods-name {
|
|||
|
line-height: 40rpx;
|
|||
|
height: 80rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
&--one {
|
|||
|
.goods-item {
|
|||
|
width: 100%;
|
|||
|
|
|||
|
.goods-item-info {
|
|||
|
display: flex;
|
|||
|
|
|||
|
.goods-image {
|
|||
|
width: 200rpx;
|
|||
|
padding-top: 200rpx;
|
|||
|
}
|
|||
|
|
|||
|
.goods-info {
|
|||
|
padding: 24rpx 20rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|