123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568 |
- <template>
- <view class="bg--w111-000" :class="tempArr.length?'':'h-screen'">
- <view class="fixed-lt w-full bg_mask z-900" :style="{ paddingTop: statusBarHeight + 'px',height: 106 + statusBarHeight + 'px'}">
- <view class="px-20 h-80 flex mt-12 text--w111-999">
- <view class="w-162 h-58 rd-30rpx bg--w111-f5f5f5 flex-center fs-32">
- <image class="w-32 h-32" src="@/static/img/drop_more.png" @tap="openDrower()"></image>
- <text class="text--w111-b3b3b3 px-16">|</text>
- <image class="w-32 h-32" src="@/static/img/cart_icon.png" @tap="goCart()"></image>
- </view>
- <view class="flex-1 h-58 rd-30rpx bg--w111-f5f5f5 ml-14 px-32 flex-y-center" @tap="goSearch">
- <text class="iconfont icon-ic_search fs-28"></text>
- <text class="fs-24 pl-18">请输入商品名称</text>
- </view>
- <!-- 胶囊占据的位置 -->
- <!-- #ifdef MP -->
- <view class="ml-12" :style="'width:'+getHeight.barWidth+'px'"></view>
- <!-- #endif -->
- </view>
- </view>
- <!-- #ifdef MP || APP-PLUS -->
- <view :style="{'height': statusBarHeight + 'px'}"></view>
- <view class="px-20 p-b-20">
- <!-- #endif -->
- <!-- #ifndef MP -->
- <view class="p-20">
- <!-- #endif -->
- <view class="rd-24rpx pro_card" v-for="(item,index) in tempArr" :key="index"
- @click="goDetail(item)">
- <easy-loadimage
- :image-src="item.image"
- :borderSrc="item.activity_frame.image"
- width="100%"
- height="710rpx"
- borderRadius="24rpx 24rpx 0 0"></easy-loadimage>
- <view class="rd-b-24rpx bg--w111-fff p-24">
- <view class="flex-between-center">
- <view class="acea-row row-bottom">
- <baseMoney :money="item.price" symbolSize="36" integerSize="52" decimalSize="36"
- weight></baseMoney>
- <view class="inline-block h-26 lh-28rpx rd-14rpx bg--w111-F7E9CD fs-22 ml-8 mb-10" v-if="item.vip_price && item.vip_price > 0">
- <text class="inline-block h-26 lh-28rpx svip_rd fs-18 bg--w111-484643 text--w111-FDDAA4 px-8">SVIP</text>
- <text class="px-8 SemiBold">¥{{item.vip_price}}</text>
- </view>
- </view>
- <view class="fs-24 lh-34rpx text--w111-999">{{item.sales}}人都在买</view>
- </view>
- <view class="flex-between-center mt-24">
- <view class="w-422 lh-40rpx fs-28 text--w111-333 fw-500 line2">{{item.store_name}}
- </view>
- <view class="flex" v-if="item.cart_button">
- <view class="w-88 h-64 rd-l-32rpx bg-primary-light flex-center"
- @click.stop="goCartDuo(item)" v-if="item.spec_type">
- <text class="iconfont icon-ic_ShoppingCart1 fs-40 text-primary-con"></text>
- </view>
- <view class="w-88 h-64 rd-l-32rpx bg-primary-light flex-center"
- @click.stop="goCartDan(item,index)" v-else>
- <text class="iconfont icon-ic_ShoppingCart1 fs-40 text-primary-con"></text>
- </view>
- <view class="w-112 h-64 rd-r-32rpx bg-color flex-center text--w111-fff fs-24">购买</view>
- </view>
- <view class="w-112 h-64 rd-32rpx bg-color flex-center text--w111-fff fs-24" v-else>购买</view>
- </view>
- </view>
- </view>
- <view class="mt-100rpx" v-if="!tempArr.length && !loading">
- <emptyPage title="暂无商品,去看点别的吧~" ></emptyPage>
- </view>
- <view :style="[conHeights]" class="55"></view>
- </view>
- <base-drawer mode="right"
- :visible="showFilterDrawer"
- background-color="transparent"
- mask maskClosable
- @close="closeDrawer">
- <view class="drawer_box bg--w111-fff h-full">
- <view :style="{height:fixedTop + 'px'}"></view>
- <view class="h-80 flex-center fs-34 fw-500 text--w111-333">筛选</view>
- <view class="list" :style="[listH]">
- <scroll-view scroll-y="true" style="height: 100%">
- <view v-if="level == 3">
- <view class="flex">
- <scroll-view scroll-x="true" class="white-nowrap vertical-middle w-full pl-20 pt-24 pb-24"
- show-scrollbar="false">
- <view class="inline-block mr-8" v-for="(item,index) in categoryList" :key="index"
- @click="tapNav(index,item)">
- <view class="flex-col flex-center">
- <view :class="index == navActive ? 'active_pic' : 'scroll_pic'">
- <image :src="item.pic" mode="aspectFill"></image>
- </view>
- <view class="w-120 h-40 flex-center fs-24 text--w111-333"
- :class="index == navActive ? 'active_cate_text' : ''">{{item.cate_name}}
- </view>
- </view>
- </view>
- </scroll-view>
- </view>
- <view v-for="(item,index) in categoryErList" :key="index">
- <view class="activity_box pt-24 pb-24 pl-32 pr-32"
- v-if="item.children && item.children.length">
- <view class="flex-between-center">
- <view class="fs-28 text--w111-333 fw-500">{{item.cate_name}}</view>
- <view class="fs-20 text--w111-999" v-if="item.children && item.children.length > 3"
- @tap="openShowMore(item)">
- <text>{{item.showMore ? '收起' : '展开'}}</text>
- <text class="iconfont fs-20" :class="item.showMore ? 'icon-ic_uparrow' : 'icon-ic_downarrow'"></text>
- </view>
- </view>
- <view class="grid-column-3 box_gap mt-24" v-show="item.showMore">
- <view class="h-56 rd-28rpx bg--w111-f5f5f5 flex-center fs-24 text--w111-333"
- v-for="cate in item.children" :key="cate.id"
- :class="tid == cate.id ? 'cate_active' : ''" @tap="threeCateClick(cate)">
- {{cate.cate_name}}</view>
- </view>
- <view class="grid-column-3 box_gap mt-24" v-show="!item.showMore">
- <view class="h-56 rd-28rpx bg--w111-f5f5f5 flex-center fs-24 text--w111-333"
- v-for="cate in sliceArr(item.children)" :key="cate.id"
- :class="tid == cate.id ? 'cate_active' : ''" @tap="threeCateClick(cate)">
- {{cate.cate_name}}</view>
- </view>
- </view>
- </view>
- </view>
- <view v-else>
- <view v-for="(item,index) in categoryList" :key="index">
- <view class="activity_box pt-24 pb-24 pl-32 pr-32">
- <view class="flex-between-center">
- <view class="fs-28 text--w111-333 fw-500">{{item.cate_name}}</view>
- <view class="fs-20 text--w111-999" v-if="item.children && item.children.length > 3"
- @tap="openShowMore(item)">
- <text>{{item.showMore ? '收起' : '展开'}}</text>
- <text class="iconfont fs-20" :class="item.showMore ? 'icon-ic_uparrow' : 'icon-ic_downarrow'"></text>
- </view>
- </view>
- <view v-if="item.children && item.children.length">
- <view class="grid-column-3 box_gap mt-24" v-show="item.showMore">
- <view class="h-56 rd-28rpx bg--w111-f5f5f5 flex-center fs-24 text--w111-333"
- v-for="cate in item.children" :key="cate.id"
- :class="sid == cate.id ? 'cate_active' : ''" @tap="twoCateClick(cate)">
- {{cate.cate_name}}</view>
- </view>
- <view class="grid-column-3 box_gap mt-24" v-show="!item.showMore">
- <view class="h-56 rd-28rpx bg--w111-f5f5f5 flex-center fs-24 text--w111-333"
- v-for="cate in sliceArr(item.children)" :key="cate.id"
- :class="sid == cate.id ? 'cate_active' : ''" @tap="twoCateClick(cate)">
- {{cate.cate_name}}</view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </scroll-view>
- </view>
- <view class="fixed-lb pb-safe bg--w111-fff w-full rd-b-40">
- <view class="px-32 flex-between-center h-112">
- <view class="w-296 h-72 rd-40rpx flex-center text-primary-con con_border bg--w111-fff"
- @click="reset">重置</view>
- <view class="w-296 h-72 rd-40rpx flex-center text--w111-fff bg-color" @tap="getList">
- 确定</view>
- </view>
- </view>
- </view>
- </base-drawer>
- <productWindow
- :attr="attr"
- :isShow='1'
- :iSplus='1'
- :iScart='1'
- :is_vip="is_vip"
- :type="2"
- @myevent="onMyEvent"
- @ChangeAttr="ChangeAttr"
- @ChangeCartNum="ChangeCartNumDuo"
- @attrVal="attrVal"
- @iptCartNum="iptCartNum"
- @goCat="goCatNum"
- @getImg="showImg"
- id='product-window' ></productWindow>
- <cusPreviewImg ref="cusPreviewImg" :list="skuArr" @changeSwitch="changeSwitch"></cusPreviewImg>
- </view>
- </view>
- </template>
- <script>
- let sysHeight = uni.getSystemInfoSync().statusBarHeight;
- import baseDrawer from '@/components/tui-drawer/tui-drawer.vue';
- import productWindow from '@/components/productWindow';
- import {
- getCategoryList,
- getProductslist,
- getAttr,
- postCartNum
- } from '@/api/store.js';
- import {goShopDetail} from '@/libs/order.js';
- import {toLogin} from '@/libs/login.js';
- import {mapState,mapGetters} from 'vuex';
- import skuSelect from '@/mixins/skuSelect.js';
- import emptyPage from '@/components/emptyPage.vue';
- import cusPreviewImg from '@/components/cusPreviewImg';
- export default {
- props: {
- level: {
- type: Number,
- default: 2
- },
- isFooter:{
- type:Boolean,
- default:false
- },
- pdHeight:{
- type:Number,
- default:0
- }
- },
- data() {
- return {
- statusBarHeight: sysHeight,
- showFilterDrawer: false,
- navActive: 0,
- categoryList: [],
- categoryErList: [],
- threeCateList: [],
- tempArr: [],
- loading: false,
- loadend: false,
- loadTitle: '加载更多',
- page: 1,
- limit: 10,
- cid: 0, //一级分类
- sid: 0, //二级分类
- tid: 0, //二级分类
- id: 0, //商品id
- storeName: '',
- tabClick: 0,
- attr: {
- cartAttr: false,
- productAttr: [],
- productSelect: {}
- },
- attrValue: '', //已选属性
- productValue: [],
- is_vip: 0, //是否是会员
- cart_num: 0,
- storeInfo: {},
- selectSku: {},
- skuArr: [],
- getHeight: this.$util.getWXStatusHeight()
- }
- },
- mixins: [skuSelect],
- components: {
- baseDrawer,
- productWindow,
- emptyPage,
- cusPreviewImg
- },
- computed: {
- fixedTop() {
- // #ifdef MP || APP-PLUS
- return uni.getSystemInfoSync().statusBarHeight
- // #endif
- // #ifdef H5
- return 20
- // #endif
- },
- ...mapGetters(['isLogin', 'uid', 'cartNum']),
- conHeights(){
- let H = `${this.pdHeight*2+104}rpx`
- let HZ = `calc(100% - env(safe-area-inset-bottom))`
- return{
- height: this.isFooter?H:HZ
- }
- },
- listH(){
- let H = `calc(100% - (${this.fixedTop + 96}px + env(safe-area-inset-bottom)))`
- return{
- height: H
- }
- }
- },
- watch:{
- cartNum(){
- this.getCartList(1);
- }
- },
- mounted() {
- this.getAllCategory();
- },
- methods: {
- // 商品详情接口;
- getAttrs(id) {
- let that = this;
- getAttr(id, 0).then(res => {
- // uni.hideLoading();
- that.$set(that.attr, 'productAttr', res.data.productAttr);
- that.$set(that, 'productValue', res.data.productValue);
- that.$set(that, 'is_vip', res.data.storeInfo.is_vip);
- that.$set(that, 'storeInfo', res.data.storeInfo);
- that.skuArr = [];
- for (let key in res.data.productValue) {
- let obj = res.data.productValue[key];
- that.skuArr.push(obj)
- }
- if (!that.skuArr.length) {
- that.skuArr = [{
- image: this.storeInfo.image,
- suk: this.storeInfo.store_name,
- price: this.storeInfo.price
- }];
- }
- this.$set(this, "selectSku", that.skuArr[0]);
- that.DefaultSelect();
- })
- },
- //点击sku图片打开轮播图
- showImg(index) {
- this.$refs.cusPreviewImg.open(this.selectSku.suk)
- },
- //滑动轮播图选择商品
- changeSwitch(e) {
- let productSelect = this.skuArr[e];
- this.$set(this, 'selectSku', productSelect);
- var skuList = productSelect.suk.split(',');
- skuList.forEach((i, index) => {
- this.$set(this.attr.productAttr[index], 'index', skuList[index]);
- })
- if (productSelect) {
- 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.attr.productSelect, 'vip_price', productSelect.vip_price);
- this.$set(this, 'attrValue', productSelect.suk);
- this.$set(this, 'attrTxt', '已选择');
- }
- },
- getAllCategory() {
- let that = this;
- getCategoryList().then(res => {
- if (!res.data.length) return
- res.data.map(item=>{
- this.$set(item,'showMore',false);
- if(item.children && item.children.length){
- item.children.map(item1=>{
- this.$set(item1,'showMore',false);
- })
- }
- })
- let data = res.data;
- that.categoryTitle = data[0].cate_name;
- that.cid = data[0].id;
- that.sid = 0;
- that.tid = 0;
- that.navActive = 0;
- that.tabClick = 0;
- that.categoryList = data;
- that.categoryErList = res.data[0].children ? res.data[0].children : [];
- that.page = 1;
- that.loadend = false;
- that.tempArr = [];
- that.productslist();
- })
- },
- // 产品列表
- productslist() {
- let that = this;
- if (that.loadend) return;
- if (that.loading) return;
- that.loading = true;
- that.loadTitle = '';
- getProductslist({
- page: that.page,
- limit: that.limit,
- type: 1,
- cid: that.cid,
- sid: that.sid,
- tid: that.tid
- }).then(res => {
- let list = res.data,
- loadend = list.length < that.limit;
- that.tempArr = that.$util.SplitArray(list, that.tempArr);
- that.$set(that, 'tempArr', that.tempArr);
- that.loading = false;
- that.loadend = loadend;
- that.loadTitle = loadend ? "没有更多内容啦~" : "加载更多";
- that.page = that.page + 1;
- }).catch(err => {
- that.loading = false;
- that.loadTitle = '加载更多'
- });
- },
- tapNav(index, item) {
- let list = this.categoryList[index];
- this.navActive = index;
- this.categoryTitle = list.cate_name;
- this.categoryErList = item.children ? item.children : [];
- this.threeCateList = item.children[0].children ? item.children[0].children : [];
- this.tabClick = 0;
- this.tabLeft = 0;
- this.cid = list.id;
- this.sid = 0;
- this.tid = 0;
- },
- threeCateClick(item) {
- this.tid = item.id;
- },
- twoCateClick(item){
- this.sid = item.id;
- },
- openShowMore(item){
- item.showMore = !item.showMore;
- },
- getList() {
- this.page = 1;
- this.loadend = false;
- this.tempArr = [];
- this.productslist();
- this.showFilterDrawer = false;
- if(this.isFooter){
- this.$emit('toggleBar',true);
- }else{
- uni.showTabBar();
- }
- },
- reset() {
- this.cid = this.categoryList[0].id;
- this.sid = 0;
- this.tid = 0;
- this.navActive = 0;
- this.categoryErList = this.categoryList[0].children ? this.categoryList[0].children : [];
- },
- // 去详情页
- goDetail(item) {
- goShopDetail(item, this.uid).catch(res => {
- uni.navigateTo({
- url: `/pages/goods_details/index?id=${item.id}&fromType=1`
- });
- });
- },
- goSearch() {
- uni.navigateTo({
- url: '/pages/goods/goods_search/index'
- })
- },
- goCart(){
- uni.switchTab({
- url: '/pages/order_addcart/order_addcart'
- })
- },
- openDrower() {
- this.showFilterDrawer = true;
- if(this.isFooter){
- this.$emit('toggleBar',false);
- }else{
- uni.hideTabBar();
- }
- },
- closeDrawer() {
- this.showFilterDrawer = false;
- if(this.isFooter){
- this.$emit('toggleBar',true);
- }else{
- uni.showTabBar();
- }
- },
- sliceArr(arr){
- return arr.slice(0,3)
- }
- },
- }
- </script>
- <style lang="scss" scoped>
- .bg_mask {
- background: linear-gradient(180deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0) 100%);
- }
- .list{
- overflow: auto;
- }
- .z-900 {
- z-index: 900;
- }
- .pro_card~.pro_card {
- margin-top: 20rpx;
- }
- .drawer_box {
- width: 668rpx;
- border-radius: 40rpx 0 0 40rpx;
- overflow: auto;
- }
- .bg--w111-484643{
- background: linear-gradient(90deg, #484643 0%, #1F1B17 100%);
- }
- .text--w111-FDDAA4{
- color: #FDDAA4;
- }
- .svip_rd{
- border-radius: 14rpx 0 8rpx 14rpx;
- }
- .box_gap {
- grid-row-gap: 24rpx;
- grid-column-gap: 26rpx;
- }
- .con_border {
- border: 1px solid var(--view-theme);
- }
- .text-primary-con {
- color: var(--view-theme);
- }
- .bg-primary-light {
- background: var(--view-minorColorT);
- }
- .p-b-20 {
- padding-bottom: 20rpx !important;
- }
- .w-598 {
- width: 598rpx;
- }
- .active_pic {
- width: 104rpx;
- height: 104rpx;
- background-color: #fff;
- padding: 3rpx;
- border-radius: 50%;
- border: 3rpx solid var(--view-theme);
- image {
- width: 100%;
- height: 100%;
- border-radius: 50%;
- }
- }
- .scroll_pic {
- image {
- width: 92rpx;
- height: 92rpx;
- border-radius: 50%;
- }
- }
- .active_cate_text {
- background: linear-gradient(90deg, var(--view-gradient) 0, var(--view-theme) 100%);
- color: #fff;
- border-radius: 20rpx;
- margin-top: 8rpx;
- }
- .cate_active {
- color: var(--view-theme);
- background: var(--view-minorColorT);
- border: 1rpx solid var(--view-theme);
- }
- .rd-b-40{
- border-radius: 0 0 0 40rpx;
- }
- </style>
|