金诚优选前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

755 lines
20 KiB

<template>
<view>
<view id="store-list">
<view class="commodity-top" catchtouchmove="move">
<view class="sidebar mx-1px-bottom">
<view class="sidebar-left">
<span class="iconfont icon-fenzu" @tap="classF">
</span>
</view>
<view class="sidebar-right">
<view class="right-seek iconfont icon-sousuo" @tap="search">
</view>
<view class="right-cart iconfont icon-gouwuche" @tap="cart">
</view>
<view class="right-cart iconfont icon-qiehuan1" v-if="arrangement == 'rank'" @tap="changeRange">
</view>
<view class="right-cart iconfont icon-qiehuanduotuSVG" v-if="arrangement == 'vertical'" @tap="changeRange">
</view>
</view>
</view>
<view class="filter-box">
<view class="filter-item mx-1px-right" data-type="updated_at" @tap="changeOrderBy">
<view class="left" :class=" orderBy === 'updated_at' ? 'active' : ''">最新</view>
<view class="right" :class="(orderBy === 'updated_at' && sort === 'desc') ? 'desc' : ''"></view>
</view>
<view class="filter-item mx-1px-right" data-type="sell_price" @tap="changeOrderBy">
<view class="left" :class=" orderBy === 'sell_price' ? 'active' : ''">价格</view>
<view class="right" :class="(orderBy === 'sell_price' && sort === 'desc') ? 'desc' : ''"></view>
</view>
<view class="filter-item mx-1px-right" data-type="sale" @tap="changeOrderBy">
<view class="left" :class=" orderBy === 'sale' ? 'active' : ''">销量</view>
<view class="right" :class="(orderBy === 'sale' && sort === 'desc') ? 'desc' : ''"></view>
</view>
<view class="filter-item big-filter" :class="c_id ? '' : 'dis'" @tap="showFilterF">
筛选 ▼
</view>
</view>
</view>
<view class="commodity-bottom" :hidden="showFilter">
<!-- 一排显示1个 -->
<view v-for="(items, idx) in storeList" :key="idx" v-if="arrangement == 'rank'">
<view class="commodity-out" :data-id="item.id" v-for="(item, index) in storeList[idx]" :key="index" @tap="jump">
<view class="commodity-box">
<view class="commodity-img">
<image mode="widthFix" :src="item.img"></image>
</view>
<view class="commodity-name">
{{item.name}}
</view>
<view class="commodity-money">
<view class="money">
¥{{item.sell_price}}
<view class="origin-money">
¥{{item.market_price}}
</view>
</view>
<!-- <view class="discount-tags">
<span class="tags-item" v-for="(tags, index) in item.discount_tags" :key="index" >{{tags}}</span>
</view> -->
</view>
</view>
</view>
</view>
<!-- 一排显示一个 -->
<view v-for="(items, idx) in storeList" :key="idx" v-if="arrangement == 'vertical'">
<view class="commodity-out-vertical" :data-id="item.id" v-for="(item, index) in storeList[idx]" :key="index" @tap="jump">
<view class="img-box">
<image mode="widthFix" :src="item.img"></image>
</view>
<view class="right-box">
<view class="goods-name">
{{item.name}}
</view>
<view class="goods-money">
¥{{item.sell_price}}
<view class="origin-money">
¥{{item.market_price}}
</view>
</view>
</view>
</view>
</view>
<view class="loadingbox" :hidden="!show">
正在加载下一页数据
</view>
</view>
</view>
<view class="right-filter-box" :hidden="!showFilter">
<view class="box">
<view>
<view class="title">
价格区间
</view>
<view class="list">
<view class="list-block">
<view data-num="200-500" :class="shadows.price == '200-500' ? 'selected' : ''" @tap="checkPrice">200-500元</view>
</view>
<view class="list-block">
<view data-num="501-1000" :class="shadows.price == '501-1000' ? 'selected' : ''" @tap="checkPrice">501-1000元</view>
</view>
<view class="list-block">
<view data-num="1001-1500" :class="shadows.price == '1001-1500' ? 'selected' : ''" @tap="checkPrice">1001-1500元</view>
</view>
<view class="list-block">
<view data-num="1501-2000" :class="shadows.price == '1501-2000' ? 'selected' : ''" @tap="checkPrice">1501-2000元</view>
</view>
<view class="list-block">
<view data-num="2000-" :class="shadows.price == '2000-' ? 'selected' : ''" @tap="checkPrice">2000-元以上</view>
</view>
<!-- <view class="price-inputs">
<input type="number" data-type="0" bindinput="modifyPrice" />
<view class="minus">
-
</view>
<input type="number" data-type="1" bindinput="modifyPrice" />
</view> -->
</view>
</view>
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
<view v-for="(item, index) in filter" :key="index">
<view class="title">
{{item.key}}
</view>
<view class="list">
<view class="list-block" v-for="(obj, index) in item.values" :key="index">
<view :class="!!selections[obj.id] ? 'selected' : ''" :data-id="obj.id" :data-type="obj" @tap="check">
{{obj.text}}
</view>
</view>
</view>
</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view v-for="(item, index) in filter" :key="index">
<view class="title">
{{item.key}}
</view>
<view class="list">
<view class="list-block" v-for="(obj, index) in item.values" :key="index">
<view :class="!!selections[obj.id] ? 'selected' : ''" :data-id="obj.id" :data-type="obj" @tap="check(obj)">
{{obj.text}}
</view>
</view>
</view>
</view>
<!-- #endif -->
<view class="button-box">
<button type="default" @tap="cancel">取消</button>
<button type="primary" @tap="confirm">确定</button>
</view>
</view>
</view>
</view>
</template>
<script>
var app = getApp();
import {pageLogin, getUrl,config,is} from '@/common/js/utils.js';
import Animation from '@/common/js/animation.js';
export default {
data() {
return {
page: 1,
storeList: [],
orderBy: '',
sort: '',
c_id: '',
meta: '',
show: false,
showFilter: false,
filter: null,
price:{},
priceCache:{},
shadows: {},
selections:{},
arrangement:'rank',//判断当前的排列方式,是横列 还是 竖列
};
},
onReachBottom() {
var hasMore = this.meta.pagination.total_pages > this.meta.pagination.current_page;
if (!this.showFilter) {
if (hasMore) {
this.setData({
show: true
});
var query = {
sort: this.sort,
orderBy: this.orderBy,
c_id: this.c_id
};
var page = this.meta.pagination.current_page + 1;
this.queryCommodityList(query, page);
} else {
wx.showToast({
image: '../../../static/error.png',
title: '再拉也没有啦'
});
}
}
},
onReady() {
var query = {
sort: this.sort,
orderBy: this.orderBy,
c_id: this.c_id
};
this.queryCommodityList(query);
},
onLoad(e) {
if (e.c_id) {
this.setData({
c_id: e.c_id
});
}
if (e.orderBy) {
this.setData({
orderBy: e.orderBy,
sort: e.sort
});
}
var price = {
min: '',
max: ''
};
var shadows = {
attr: {},
specs: {}
};
if (e.attr) {
e.attr.forEach(v => shadows.attr[v] = true);
}
Object.keys(e).forEach(key => {
let ret = /^specs\[([^\]]+)]$/.exec(key);
if (ret) {
let name = ret[1];
shadows.specs[name] = e[key];
}
});
var priceList = ['200-500', '501-1000', '1001-1500', '1501-2000', '2000-'];
shadows.price = e.price || '';
if (!~priceList.indexOf(shadows.price)) {
var parts = shadows.price.split(/\s*\-\s*/);
price.min = parts[0] || '';
price.max = parts[1] || '';
}
// this.setData({
// price: price,
// shadows: shadows,
// selections: {},
// priceList: priceList,
// priceCache: {}
// });
this.price=price;
this.shadows=shadows;
this.selections={};
this.priceList=priceList;
this.priceCache={};
},
onShareAppMessage() {
var url = decodeURIComponent(getUrl());
return {
title: '商品列表',
path: '/' + url
};
},
methods: {
//点击切换排列方式
changeRange(){
if(this.arrangement == 'rank'){
this.arrangement = 'vertical'
} else if(this.arrangement == 'vertical'){
this.arrangement = 'rank'
}
},
// 价格点击
checkPrice(e) {
var num = e.currentTarget.dataset.num;
if (this.shadows.price == num) {
console.log("gaehgae");
this.setData({
'priceCache.value': num
});
if (this.priceCache.min !== undefined) {
this.setData({
'price.min': this.priceCache.min
});
}
if (this.priceCache.max !== undefined) {
this.setData({
'price.min': this.priceCache.max
});
}
// this.setData({
// 'shadows.price': ''
// });
this.shadows={price:''}
} else {
console.log(46846846846846);
if (this.price.min !== '') {
// this.setData({
// 'priceCache.min': this.priceCache.min
// });
this.priceCache.min=this.priceCache.min;
}
if (this.price.max !== '') {
// this.setData({
// 'priceCache.max': this.priceCache.max
// });
this.priceCache.max=this.priceCache.max;
}
// this.setData({
// 'price.min': '',
// 'price.max': '',
// 'shadows.price': num
// });
//
this.price.min='';
this.price.max='';
this.shadows.price=num;
}
},
// 价格输入
modifyPrice(e) {
var type = e.currentTarget.dataset.type;
var val = this.price[type ? 'max' : 'min'];
val = parseFloat(val);
if (isNaN(val)) val = '';
if (this.price[type] == 'max') {
// this.setData({
// 'price.max': val
// });
this.price={max:val};
} else {
// this.setData({
// 'price.min': val
// });
this.price={min:val};
}
// this.setData({
// 'shadows.price': ''
// });
//
this.shadows={price:''}
},
// 点击筛选条件
// #ifdef APP-PLUS || MP-WEIXIN
check(e) {
var type = e.currentTarget.dataset.type;
var id = type.id;
var selections = Object.assign({}, this.selections);
if (!selections[id]) {
for (let k in selections) {
if (selections.hasOwnProperty(k)) {
let o = selections[k]
if (o.type === type.type && o.key === type.key) {
delete selections[k];
}
}
}
selections[id] = {
key: type.key,
type: type.type,
value: type.value,
field: type.field
}
} else {
delete selections[id];
}
this.setData({
selections: Object.assign({}, selections)
})
},
// #endif
// #ifdef H5
check(e) {
var type = e;
var id = type.id;
var selections = Object.assign({}, this.selections);
if (!selections[id]) {
for (let k in selections) {
if (selections.hasOwnProperty(k)) {
let o = selections[k];
if (o.type === type.type && o.key === type.key) {
delete selections[k];
}
}
}
selections[id] = {
key: type.key,
type: type.type,
value: type.value,
field: type.field
};
} else {
delete selections[id];
}
this.setData({
selections: Object.assign({}, selections)
});
/* this.selections=Object.assign({}, selections); */
},
// #endif
// 取消
cancel() {
// var animation = new Animation('show');
// animation.right().then(() => {
this.setData({
showFilter: false,
selections: {},
shadows: {}
});
// });
},
// 确定
confirm() {
var attr = [],
specs = {};
for (let k in this.selections) {
if (this.selections.hasOwnProperty(k)) {
let o = this.selections[k];
if (o.type === 'attr') {
attr.push(o.value);
} else {
specs['specs[' + o.field + ']'] = o.value;
}
}
}
attr = attr.join(',');
var price = this.shadows.price;
if (attr.length) {
var query = Object.assign({}, {
attr
}, {
c_id: this.c_id,
orderBy: this.orderBy,
sort: this.sort,
price: price
}, specs);
} else {
var query = Object.assign({}, {
c_id: this.c_id,
orderBy: this.orderBy,
sort: this.sort,
price: price
}, specs);
}
console.log(query);
this.queryCommodityList(query);
},
changeOrderBy(e) {
var field = e.currentTarget.dataset.type;
if (this.orderBy === field) {
this.setData({
sort: this.sort === 'desc' ? 'asc' : 'desc'
});
} else {
this.setData({
orderBy: field,
sort: 'desc'
});
}
wx.redirectTo({
url: '/pages/store/list/list?orderBy=' + this.orderBy + '&sort=' + this.sort + '&c_id=' + this.c_id
});
},
jump(e) {
var id = e.currentTarget.dataset.id;
wx.navigateTo({
url: '/pages/store/detail/detail?id=' + id
});
},
classF() {
wx.switchTab({
url: '/pages/index/classification/classification'
});
},
search() {
wx.navigateTo({
url: '/pages/store/search/search'
});
},
cart() {
wx.switchTab({
url: '/pages/store/cart/cart'
});
},
showFilterF() {
if (this.c_id) {
this.setData({
showFilter: true
});
// var animation = new Animation('show');
// animation.Pullleft();
}
},
move() {},
loadMore() {
this.$http.get({
api: "api/store/list?page=" + (this.page + 1)
});
},
// 查询商品列表
queryCommodityList(query = {}, page = 1) {
var token = this.$cookieStorage.get('user_token') || '';
var params = Object.assign({}, query, {
page
});
wx.showLoading({
title: '加载中',
mask: true
});
this.$http.get({
api: 'api/store/list',
data: params,
header: {
Authorization: token
}
}).then(res => {
if (res.statusCode == 200) {
res = res.data;
if (res.status) {
// 商品列表页赋值
this.setData({
[`storeList.${page - 1}`]: res.data,
meta: res.meta
}); // 右侧筛选赋值
if (res.meta && res.meta.filter) {
if (Array.isArray(res.meta.filter)) {
this.setData({
filter: null
});
} else {
let filter = res.meta.filter;
let list = [];
if (filter.attr && filter.attr.keys) {
let type = 'attr';
filter.attr.keys.forEach(key => {
let arr = [];
let arrText = [];
for (let attr in filter.attr.values[key]) {
!!attr && arrText.push(filter.attr.values[key][attr]);
!!attr && arr.push(attr);
}
list.push({
key,
values: arr.map((v, index) => {
return {
id: [type, key, v].join('-'),
key,
type,
value: v,
text: arrText[index]
};
})
});
});
}
if (filter.specs && filter.specs.keys) {
let type = 'specs';
filter.specs.keys.forEach(key => {
let entries = key.split(':');
let field = entries[1];
key = entries[0];
var newKey = key + ':' + field;
let specs = [];
let specsText = [];
for (let spec in filter.specs.values[newKey]) {
!!spec && specsText.push(filter.specs.values[newKey][spec]);
!!spec && specs.push(spec);
}
list.push({
key,
values: specs.map((v, index) => {
return {
id: [type, key, v].join('-'),
key,
type,
field,
value: v,
text: specsText[index]
};
})
});
});
}
this.setData({
filter: list
});
}
}
this.setData({
showFilter: false
});
} else {
wx.showModal({
title: '',
content: res.message,
showCancel: false
});
}
} else {
wx.showModal({
title: '',
content: "请求失败",
showCancel: false
});
}
this.setData({
show: false
});
wx.hideLoading();
}).catch(rej => {
wx.showModal({
title: '',
content: '请求失败',
success: res => {
if (res.confirm) {}
}
});
this.setData({
show: false
});
wx.hideLoading();
});
},
setData: function (obj) {
let that = this;
let keys = [];
let val, data;
Object.keys(obj).forEach(function (key) {
keys = key.split('.');
val = obj[key];
data = that.$data;
keys.forEach(function (key2, index) {
if (index + 1 == keys.length) {
that.$set(data, key2, val);
} else {
if (!data[key2]) {
that.$set(data, key2, {});
}
}
data = data[key2];
});
});
}
},
computed: {},
watch: {}
};
</script>
<style rel="stylesheet/less" lang="less">
@import "list";
</style>