<template> <view class="container"> <view class="sort-right-box"> <view class="search-box"> <uni-search-bar radius="5" placeholder="搜索" clearButton="auto" cancelButton="none" bgColor="#F8F8F8" @confirm="search" class="search-bar" /> </view> <view class="sort-left-box"> <view class="sort-left-row" :class="sortFirstCode == item.cateCode ? 'sort-left-row-active' : ''" v-for="(item,index) in sortFirstList" @click="checkFirstSort(item)" :key="index"> <text>{{item.cateValue}}</text> </view> </view> <view class="sort-right-row"> <!-- <view style="padding-top: 20px;background-color: #909399;" v-if="sortSecondList.length<=0"> <u-divider color="#909399" border-color="#909399">没有更多了</u-divider> </view> --> <view class="sort-right-col" :class="sortSecondCode == item.cateCode ? 'sort-right-col-active' : ''" v-for="(item,index) in sortSecondList" :key="index" @click="checkSecondSort(item)">{{item.cateValue}}</view> </view> <scroll-view class="goods-box" scroll-y="true" @scrolltolower="handleLoadMore()"> <view class="goods-row" v-for="(item, index) in goodsList" :key="index" @click="goToGoodDetails(item)"> <image class="goods-img" :src="item.imgPath" mode="aspectFill"></image> <view class="goods-info"> <view class="goods-name">{{item.productName}}</view> <view class="goods-details">{{item.productDescribe}}</view> <view class="goods-number"> <text class="goods-icon">¥</text> <text class="goods-spec">{{item.bizPrice}}/{{item.unit}}</text> <text class="goods-sales">{{item.sellCount}}人付款</text> </view> </view> <view class="goods-cart"> <view class="cart-button" @click.stop="addCart(item)"> <view class="iconfont icongouwuche"></view> </view> </view> </view> <view style="padding-top: 20px;background-color: #FFFFFF;" v-if="isOver"> <u-divider color="#909399" border-color="#909399">没有更多了</u-divider> </view> </scroll-view> </view> <u-modal v-model="modalShow" content="是否将该商品添加至购物车" @confirm="submitAddCart()" :async-close="true" :show-cancel-button="true"></u-modal> <u-top-tips ref="uTips"></u-top-tips> </view> </template> <script> const NET = require('../../utils/request') const API = require('../../config/api') export default { data() { return { pageIndex: 1, isOver: false, goodName: '', sortFirstCode: '', sortFirstList: [], sortSecondCode: '', sortSecondList: [], goodsList: [], modalShow: false, goodItem: null, } }, onShow() { this.getBaseData() }, onPullDownRefresh() { this.getBaseData() uni.stopPullDownRefresh(); }, methods: { // 获取全部数据 getBaseData() { this.pageIndex = 1 this.sortFirstList = [] this.sortSecondList = [] this.goodsList = [] NET.request(API.getSortList, {}, 'POST').then(res => { this.sortFirstList = res.data if (res.data.length) { this.checkFirstSort(res.data[0]) } else { this.$refs.uTips.show({ title: '获取商品分类失败', type: 'warning', }) } }).catch(error => { this.$refs.uTips.show({ title: '获取商品分类失败', type: 'warning', }) }) }, // 切换一级分类 checkFirstSort(item) { this.sortFirstCode = item.cateCode this.sortSecondList = [] if (item.oneCategory.length) { this.sortSecondList = item.oneCategory this.checkSecondSort(item.oneCategory[0]) } }, // 切换二级分类 checkSecondSort(item) { this.sortSecondCode = item.cateCode this.goodsList = [] if (this.triggered = 'restore') { this.pageIndex = 1 this.getGoodsList() } }, // 搜索商品 search(data) { this.goodName = data.value this.goodsList = [] this.pageIndex = 1 this.getGoodsList() }, // 懒加载 handleLoadMore() { if (!this.isOver) { this.pageIndex++ this.getGoodsList() } }, // 获取商品 getGoodsList() { NET.request(API.getGoodsBySort, { name: this.goodName, oneId: this.sortFirstCode, twoId: this.sortSecondCode, pageIndex: this.pageIndex, pageSize: 10, }, 'POST').then(res => { this.isOver = res.data.list.length != 10 this.goodsList = this.goodsList.concat(res.data.list) }).catch(res => { this.$refs.uTips.show({ title: '获取商品列表失败', type: 'warning', }) }) }, // 添加购物车 addCart(item) { this.goodItem = { productId: item.id, productName: item.productName, imgUrl: item.imgPath, bizPrice: item.bizPrice, originalPrice: item.originalPrice, productType: item.productType, tenantCode: item.tenantCode, buyNum: 1 } this.modalShow = true }, // 提交购物车 submitAddCart() { NET.request(API.addCart, this.goodItem, 'POST').then(res => { this.$refs.uTips.show({ title: '加入购物车成功', type: 'success', }) this.modalShow = false }).catch(res => { this.modalShow = false this.$refs.uTips.show({ title: '加入购物车失败', type: 'warning', }) }) }, // 跳转商品详情 goToGoodDetails(item) { uni.navigateTo({ url: '/pagesGood/goodDetails?goodId=' + item.id }); } } } </script> <style lang="less" scoped> page { width: 100%; height: 100%; } .container { width: 100%; height: calc(100% - 70px); float: left; position: relative; .search-box { width: 100%; height: 58px; box-sizing: border-box; background-color: #FFFFFF; padding: 2px 12px 1px 12px; border-bottom: 1px solid #DDDDDD; position: fixed; z-index: 2; left: 0; top: 0; /deep/.search-bar { .uni-searchbar__box { border-color: #F8F8F8; } } } .sort-left-box { width: 80px; height: calc(100vh - 58px); border-right: 1px solid #DDDDDD; background-color: #FFFFFF; float: left; overflow-y: auto; position: fixed; z-index: 2; left: 0; top: 58px; .sort-left-row { width: 100%; height: 45px; box-sizing: border-box; padding-left: 9px; border-left: 3px solid #FFFFFF; font-size: 15px; font-family: PingFang SC; color: #333333; line-height: 16px; align-items: center; display: flex; } .sort-left-row-active { color: #51A539; border-left: 3px solid #51A539; } } .sort-right-box { width: 100vw; float: left; position: relative; padding: 102px 0 0 81px; .sort-right-row { width: calc(100vw - 81px); height: 44px; padding: 9px 2px 0px 7px; box-sizing: border-box; background-color: #FFFFFF; white-space: nowrap; float: left; position: fixed; z-index: 2; left: 81px; top: 58px; overflow-y: auto; .sort-right-col { height: 26px; margin-right: 10px; display: inline-block; border: 1px solid #DCDCDC; border-radius: 13px; padding: 0 25px; box-sizing: border-box; font-size: 12px; font-family: PingFang SC; color: #666666; line-height: 24px; } .sort-right-col-active { color: #FFFFFF; background: #52A63A; border: 1px solid #51A539; } } .goods-box { width: 100%; padding: 6px 0 0px 0; box-sizing: border-box; float: left; overflow-y: auto; position: relative; .goods-row { width: calc(100% - 24px); float: left; padding: 11px 11px 11px 7px; box-sizing: border-box; margin: 4px 0 12px 12px; background: #FFFFFF; box-shadow: 0px 1px 5px 0px rgba(102, 102, 102, 0.43); border-radius: 15px; position: relative; .goods-img { width: 84px; height: 84px; float: left; border-radius: 5px; } .goods-info { width: calc(100% - 108px); box-sizing: border-box; padding-left: 6px; float: left; .goods-name { width: calc(100% + 24px); height: 18px; font-size: 15px; font-family: PingFang SC; color: #333333; line-height: 18px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .goods-details { height: 28px; font-size: 12px; font-family: PingFang SC; color: #999999; line-height: 14px; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; word-wrap: break-word; margin: 4px 0 12px 0; } .goods-number { // width: calc(100% + 25px); font-family: PingFang SC; line-height: 16px; .goods-icon { font-size: 12px; color: #52A63A; } .goods-spec { font-size: 15px; color: #52A63A; margin-right: 15px; } .goods-sales { font-size: 12px; color: #999999; } } } .goods-cart { width: 24px; height: 84px; float: left; .cart-button { width: 24px; height: 24px; margin-top: 30px; background-color: #52A63A; border-radius: 50%; text-align: center; .iconfont { color: #FFFFFF; font-size: 18px; line-height: 24px; } } } } } } } </style>