java-mall-app/pages/product/list.vue
2024-11-01 16:35:40 +08:00

517 lines
14 KiB
Vue

<template>
<view>
<tp-search id="tp-search" class="tp-search" :search-text="options.pname" :placeholder="tpSearchPlaceholder" :style="tpSearchStyle" @change="search"></tp-search>
<scroll-view scroll-y="true" class="m-product-all u-pa" @scrolltolower="scrollbottom" :scroll-top="scposition"
@scroll="scroll" scroll-with-animation="true" :style="ptSearchStyle">
<view class="fixPaddingTop" v-if="loadPageFlag">
<diy id="diy" :BgConfig="BgConfig" :PageContent="PageContent" :pageId="pageId" :PageNav="PageNav"
:loadPageFlag="loadPageFlag"></diy>
</view>
<!--第七个模版-->
<scroll-view scroll-x="true" v-if="cat_self.length>0 || cat_child.length>0"
:class="{'box-grids':1, 'box-grids-border':0, fixPaddingTop:!loadPageFlag}">
<view>
<!-- 当前分类 -->
<view :class="{'box-grid':1, 'box-grid-border':0}" v-for="(items, ii) in cat_self"
:key="items.id"
:style="{width:((100/5))+'%','padding-top':(10)+'px','padding-bottom':(10)+'px','padding-left':(10)+'px','padding-right':(10)+'px','background-color':'transparent'}"
@click="onCategory(items.category_id)">
<view class="box-grid-icon">
<image lazy-load :src="($.img(items.category_image, 80, 80))"></image>
</view>
<label class="box-grid-label">{{ items.category_name }}</label>
</view>
<!-- 子分类 -->
<view :class="{'box-grid':1, 'box-grid-border':0}" v-for="(items, ii) in cat_child"
:key="items.id"
:style="{width:((100/5))+'%','padding-top':(10)+'px','padding-bottom':(10)+'px','padding-left':(10)+'px','padding-right':(10)+'px','background-color':'transparent'}"
@click="onCategory(items.category_id)">
<view class="box-grid-icon">
<image lazy-load :src="($.img(items.category_image, 80, 80))"></image>
</view>
<label class="box-grid-label">{{ items.category_name }}</label>
</view>
</view>
</scroll-view>
<!--第七个模版-->
<!--301模板-->
<product-list v-if="loaded" ref="productList" :showCatFlag="true" :uniId="ptConfig.uniId" :isFilterFixed="ptConfig.isFilterFixed" :fix-top="ptConfig.topDistance"
:isShowFilter="ptConfig.isShowFilter" :isShowLoading="ptConfig.isShowLoading"
:options="ptConfig.options" :viewtype="ptConfig.viewtype" :titleText="ptConfig.titleText"
:titleColor="ptConfig.titleColor" :bgColor="ptConfig.bgColor" :paddingLeft="ptConfig.paddingLeft"
:paddingRight="ptConfig.paddingRight" :css="ptConfig.css"
:style="{backgroundColor: 'transparent'}"></product-list>
<!--301模板-->
</scroll-view>
<view class="u-top-default">
</view>
<view class="u-top">
<movable-area class="movableArea">
<movable-view class="movableView" @touchmove.stop.prevent="doNothing" direction="all" :x="returnPos.initX"
:y="returnPos.initY">
<image src='https://static.lancerdt.com/xcxfile/appicon/nav/black/nav_gotop.png'
:class='(isQuickNav?"quicknav":"hide")' @tap="returnTop"></image>
</movable-view>
</movable-area>
</view>
</view>
</template>
<script>
import uniDrawer from '@/components/uni-drawer.vue';
import uniTag from '@/components/uni-tag/uni-tag.vue';
import diy from '@/components/themes/diy.vue'
import ProductList from "@/components/product-list";
import {mapMutations, mapState} from 'vuex';
import SearchBox from "@/uni_modules/search-box/components/search-box/search-box";
import TpSearch from "@/components/tp-search/tp-search";
export default {
data() {
return {
options: {},
viewtype: 1,
cat_self: [],
cat_child: [],
sort: 2,
PageContent: [],
BgConfig: {BackgroundObj: {type: 1, bgColor: '#ffffff', "pathColor": "#f8f8f8", "path": ""}},
PageNav: {
window: {
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "",
"backgroundColor": "#f8f8f8",
"backgroundTextStyle": "dark"
}
},
loadPageFlag: false,
loaded: false,
pageId: 0,
shareImg: "",
shareTitle: "",
chatUrl: '',
timer: null,
ptConfig: {
uniId: 'category',
isFilterFixed: true,
topDistance:44,
isShowFilter: true,
isShowLoading: true,
options: {},
viewtype: 1,
titleText: '',
titleColor: '',
bgColor: '',
paddingLeft: 0,
paddingRight: 0,
css: {padding: "0 10rpx"},
},
returnPos: {
initX: '690',
initY: '1336',
},
scposition: 0,
screenHeight: 0,
oldscposition: 0,
isQuickNav: false,
opacity: 1,
background: "f1f1f1",
ptSearchStyle:"z-index: 5;",
tpSearchStyle:"z-index: 5;",
tpSearchPlaceholder:"",
};
},
components: {
TpSearch,
SearchBox,
uniDrawer,
uniTag,
diy,
ProductList
},
computed: mapState([
'Config',
'StateCode',
'notice',
'plantformInfo',
'shopInfo',
'userInfo',
'hasLogin'
]),
mounted() {
this.initReturnPos();
uni.$on('onOpenFilter', data => {
if (data) {
this.tpSearchStyle = "z-index: 5;"
this.ptSearchStyle = "z-index: 6;"
} else {
this.tpSearchStyle = "z-index: 6;"
this.ptSearchStyle = "z-index: 5;"
}
})
},
async onLoad(options) {
await this.$onLaunched;
this.loaded = true;
// #ifdef MP-WEIXIN || MP-ALIPAY
this.ptConfig.topDistance = (this.statusBar - 7 + 44);
// #endif
uni.setNavigationBarTitle({
title: this.__('商品列表')
});
var that = this;
this.setData({options: options});
this.pageId = options.page_id ? options.page_id : 0;
that.$.setNavigationBarTitle({title: options.pname || options.cname || this.__('商品列表')});
that.$.getSystemInfo({
success: function (t) {
that.setData({screenHeight: t.screenHeight})
}
});
/*
that.$.setNavigationBarColor({
frontColor: that.PageNav.window.navigationBarTextStyle == "white" ? "#ffffff" : "#000000",
backgroundColor: that.PageNav.window.navigationBarBackgroundColor
});
*/
var post = this.post;
that.ptConfig.options = {
store_id: options.store_id,
sidx: 'product_sale_num',
sort: 'DESC',
keywords: options.pname,
store_category_ids: options.store_category_id,
category_id: options.category_id,
brand_id: options.brand_id,
product_tag_ids: options.tag_id ? [options.tag_id] : [],
kind_id: options.kind_id,
store_type: options.store_type,
page: 1,
product_unit_price_min: options.product_unit_price_min ? options.product_unit_price_min : '',
product_unit_price_max: options.product_unit_price_max ? options.product_unit_price_max : '',
sp_from: options.sp_from ? options.sp_from : '',
sp_to: options.sp_to ? options.sp_to : '',
points_from: options.points_from ? options.points_from : '',
points_to: options.points_to ? options.points_to : '',
virtual: options.virtual ? options.virtual : 0,
activity_type_ids: options.activity_type_id ? [options.activity_type_id] : [],
contract_type_ids: options.contract_type_id ? [options.contract_type_id] : [],
market_category_ids: options.market_category_id ? [options.market_category_id] : [],
item_ids: options.item_ids ? options.item_ids : '',
// assist: []
}
if (this.pageId) {
//this.getPageInfo(false);
}
this.tpSearchPlaceholder = this.$.__('请输入商品名称')
if (options.category_id && options.cname) {
this.tpSearchPlaceholder = that.$.sprintf(this.$.__('请输入分类 %s 下商品名称'), options.cname)
}
// this.GetPlist(function() {
// that.pdlist.length == 0 ? that.setData({ isdata: false }) : that.setData({ isdata: true });
// });
},
methods: {
...mapMutations(['login', 'logout', 'getPlantformInfo', 'forceUserInfo', 'getUserInfo']),
initReturnPos: function () {
let view = uni.createSelectorQuery().in(this).select(".movableArea");
let that = this;
view.fields({
size: true,
scrollOffset: true
}, data => {
if (data) {
that.returnPos.initX = data.width;
that.returnPos.initY = data.height - 100;
}
}).exec();
uni.$on('returnTop', function (data) {
that.returnTop();
})
},
getPageInfo: function (force_refresh) {
var that = this;
if (that.pageId <= 0) {
return;
}
var params = {
page_id: that.pageId
};
that.$.request({
url: this.Config.URL.minipage,
data: params,
ajaxCache: {
timeout: this.Config.CACHE_EXPIRE,
forceRefresh: force_refresh
},
success: function (data, status, msg, code) {
that.$.stopPullDownRefresh();
if (200 == status) {
that.setData({
loadPageFlag: true,
pageId: data.page_id,
PageContent: that.$.parseJSON(data.page_code),
BgConfig: that.$.parseJSON(data.page_config),
PageNav: that.$.parseJSON(data.page_nav),
shareImg: data.page_share_image,
shareTitle: data.page_share_title
});
if (that.PageNav.window.navigationBarTextStyle == 'black') {
that.PageNav.window.navigationBarTextStyle = '#000000'
}
if (that.PageNav.window.navigationBarTextStyle == 'white') {
that.PageNav.window.navigationBarTextStyle = '#ffffff'
}
that.$.setNavigationBarColor({
frontColor: that.PageNav.window.navigationBarTextStyle,
backgroundColor: that.PageNav.window.navigationBarBackgroundColor
})
if (data.page_name) {
that.$.setNavigationBarTitle({
title: data.page_name
});
}
if (that.hasLogin && data.im_enable) {
var perm_id = that.$.getStorageSync('uid');
var perm_key = that.$.getStorageSync('ukey');
let chat_url = that.$.sprintf("/im/chat/chat?uid=%s", data.im_user_id);
that.setData({
chatUrl: chat_url
});
}
}
}
});
},
/**
* 分类过滤
*/
onCategory: function (category_id) {
var post = this.post;
post.category_id = category_id;
post.page = 1;
this.setData({
pdlist: [],
ispage: true, //loading
post: post
});
this.GetPlist();
},
doNothing() {
},
scroll: function (t) {
let that = this;
that.setData({oldscposition: t.detail.scrollTop});
if (100 < t.detail.scrollTop) {
that.setData({opacity: 1, background: "f8f8f8"});
} else {
that.setData({
opacity: 0,
background: "fff"
})
}
if (t.detail.scrollTop >= this.screenHeight) {
this.setData({isQuickNav: true})
} else {
this.setData({isQuickNav: false})
}
},
scrollbottom: function (e) {
let that = this;
uni.$emit('diy-scrollbottom', {uniId: that.ptConfig.uniId})
},
search: function (e) {
uni.$emit('returnTop')
let that = this;
let opts = Object.assign({}, that.ptConfig.options);
opts.keywords = e;
that.ptConfig.options = opts
that.$forceUpdate() //二维数组,开启强制渲染
},
returnTop: function () {
let that = this;
//视图会发生重新渲染
that.scposition = that.oldscposition
//当视图渲染结束 重新设置为0
that.$nextTick(() => {
that.scposition = 0
});
this.setData({isQuickNav: false})
},
}
};
</script>
<style lang="scss">
@import '../../styles/_variables.scss';
.m-product-all{
margin-top: 44px;
height: calc(100% - var(--window-top) - 44px);
}
.m-listv .ts-sty {
.ts-top-box {
background: linear-gradient(to right, #dbc4aa, #ba9877);
line-height: 1.2;
.tag {
border-radius: 0;
margin-top: 0;
padding: 2px 5px;
background: none;
height: 1.2;
line-height: 1.2;
font-size: 22rpx;
}
}
}
/*Grid*/
.box-grids {
position: relative;
overflow: hidden;
clear: both;
height: 230rpx;
background-color: #ffffff;
white-space: nowrap;
width: 100%;
.box-grid {
padding: 40rpx 20rpx;
width: 33.33333333%;
box-sizing: border-box;
display: inline-block;
text-align: center;
font-size: 36rpx;
&.active {
.box-grid-label {
color: #c0a080;
// background-color: pink;
}
}
}
.box-grid-border {
border-right: 1rpx solid #d9d9d9;
border-bottom: 1rpx solid #d9d9d9;
}
.box-grid:active {
background-color: #ececec;
}
.box-grid-icon {
width: 68rpx;
height: 68rpx;
margin: 0 auto;
image {
display: block;
width: 100%;
height: 100%;
}
}
.box-grid-label {
margin-top: 10rpx;
}
.box-grid-label {
display: block;
text-align: center;
color: #000;
font-size: 24rpx;
line-height: 40rpx;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}
.box-grids-border {
border-top: 1rpx solid #d9d9d9;
border-left: 1rpx solid #d9d9d9;
}
.active {
background-color: #c0a080;
}
</style>