123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 |
- <template>
- <view>
- <view id="top"
- style="background-image: url(https://kxmalls.oss-cn-hangzhou.aliyuncs.com/bg/top.png);background-repeat: no-repeat; background-size: cover; width: 750rpx;position: fixed;top: 0;z-index: 999;">
- <view class="status-bar"></view>
- <!-- #ifndef H5 -->
- <view class="flex align-center justify-center text-white"
- style="font-size: 36rpx;font-weight: 500; position: absolute;width: 750rpx;"
- :style="'top:'+navbarTop+'px;height:'+navHeight+'px;'">
- 商品品类
- </view>
- <!-- #endif -->
- <view :style="'margin-top:'+MT2+'px;'" class="padding-lr" style="padding-bottom: 22rpx;padding-top: 24rpx;">
- <view @click="naviageToPage('/pages/product/search')" style="height: 64rpx;"
- class="bg-white round flex align-center">
- <view class="flex align-center padding-left">
- <text class="yticon icon-sousuo" style="margin-right: 10rpx;"></text><text class="lem-text-gray"
- style="font-size: 26rpx;">新鲜,搜一下就涞了</text>
- </view>
- </view>
- </view>
- </view>
- <view :style="'height: '+topHeight+'px;'" style="width: 750rpx;display: flex; position: relative;"></view>
- <view v-if="storage" class="bg-white">
- <view style="position: fixed;left:0;" :style="'top:'+topHeight+'px;'">
- <scroll-view scroll-y class="left-aside" :style="'height:'+scollHeight+'px;'">
- <view v-for="item in flist" :key="item.id" class="f-item " :class="{active: item.id === currentId}"
- @click="tabtap(item)">
- {{item.cateName}}
- </view>
- </scroll-view>
- </view>
- <view @click="showCover" class="flex align-center justify-center" :style="'top:'+topHeight+'px;'"
- style="background-color: rgba(255,255,255,0.9);margin: 24rpx 0;box-sizing: content-box; position: fixed; right: 0;z-index: 999;height: 50rpx;width: 70rpx;padding-right: 10rpx;">
- <image v-if="!cover" src="../../static/category/arrow_down.png" mode="aspectFit"
- style="width: 22rpx;height: 14rpx;"></image>
- <image v-if="cover" src="../../static/category/arrow_up.png" mode="aspectFit"
- style="width: 22rpx;height: 14rpx;"></image>
- </view>
- <scroll-view scroll-with-animation scroll-x :scroll-into-view="curentTabView" class="bg-white"
- style="width: 600rpx;right:0;position: fixed; height: 100rpx;overflow-x: scroll;"
- :style="'top:'+topHeight+'px;'">
- <view class="flex align-start padding-left-sm">
- <view v-for="item in slist" :key="item.id" @click="sTabTap(item)" :id="'id'+item.id"
- :class="{actived: item.id === currentIded}" class="flex align-center justify-center margin-left-sm"
- style="padding: 20rpx 0; box-sizing: border-box;width: auto;flex-shrink: 0;">
- <view style="font-size: 28rpx;line-height: 40rpx;">{{item.cateName}}</view>
- </view>
- <view class="flex align-center justify-center margin-left-sm"
- style="padding: 20rpx 0; box-sizing: border-box;width: auto;flex-shrink: 0;width: 70rpx;">
- <view style="font-size: 28rpx;line-height: 40rpx;"></view>
- </view>
- </view>
- </scroll-view>
- <view v-if="cover"
- style="z-index: 9999; position: fixed;right: 0;width: 600rpx;margin-top: 90rpx;background-color: rgba(255,255,255,0.9);"
- :style="'top:'+topHeight+'px;height:'+scollHeight+'px;'">
- <view class="bg-white flex flex-wrap padding-bottom padding-top-sm solid-bottom padding-left-xs">
- <view v-for="item in slist" :key="item.id" @click="sTabTap(item)"
- class="lem-btn round margin-bottom-sm margin-lr-xs" style="width: 28%;"
- :class="{'line-green': item.id === currentIded}">{{item.cateName}}</view>
- </view>
- </view>
- <view :style="'top:'+topHeight+'px;'" style="padding-left: 140rpx;padding-top: 90rpx;">
- <image src="https://nontax.oss-cn-beijing.aliyuncs.com/kxmall/G2uavD.png" mode="aspectFit"
- style="margin: 30rpx;width: 550rpx;height: 160rpx;border-radius: 15rpx;"></image>
- <view style="padding:0rpx 20rpx 30rpx 20rpx;">
- {{sTitle}}
- </view>
- <view v-for="(item,index) in tlist" :key="index" @click="navToDetail(item.id)"
- class="margin-lr padding-tb-sm padding-lr-xs flex"
- style="width: 558rpx;height: 180rpx;border-bottom: solid #E6E6E6 1rpx;">
- <image :src="JSON.parse(item.image)[0].url" mode="aspectFill" class="round"
- style="width: 144rpx;height: 144rpx;margin-right: 50rpx;"></image>
- <view style="padding-top: 4rpx;padding-bottom: 2rpx;flex-grow: 1;">
- <view class="text-black padding-bottom-xs text-cut"
- style="font-size: 30rpx;line-height: 42rpx;width: 300rpx;font-weight: bold;">{{item.storeName}}</view>
- <view style="font-size: 24rpx;line-height: 34rpx;width: 300rpx;">
- <view class="text-gray text-cut" style="width: 50%;display: inline-block;vertical-align: middle;">
- {{item.storeInfo}}
- </view>
- <view class="text-red" v-if="item.kxStockVo.stock<=10"
- style="width: 50%;display: inline-block;border-radius: 8px;border:1px solid red;text-align: center;vertical-align: middle;position: relative;overflow: hidden;">
- <view style="background-color: red;position: absolute;left:0;height: 100%;"
- :style="{width:item.kxStockVo.stock+'%'}">
- </view>
- 库存 {{item.kxStockVo.stock}}%
- </view>
- </view>
- <view class="flex justify-between" style="width: 100%;padding-top: 12rpx;">
- <view style="flex-grow: 1;" class="flex align-center">
- <view class="text-black padding-right-sm" style="font-size: 30rpx;line-height: 42rpx;color: red; font-weight: bold; font-family: 'Arial', sans-serif;">
- ¥{{item.kxStockVo.price}}</view>
- <!-- <view style="border: solid #FC6620 2rpx;color: #FC6620;border-radius: 4rpx;width: 80rpx;height: 30rpx;font-size: 20rpx;line-height: auto;text-align: center;">
- 专享价
- </view> -->
- <view
- style="color: #AEAEAE;font-size: 24rpx;line-height: 44rpx;padding: 0 10rpx;text-decoration: line-through;">
- ¥{{item.otPrice}}
- </view>
- </view>
- <view v-if="item.kxStockVo.stock===0"
- style="float: right;color: #AEAEAE;font-size: 24rpx;line-height: 44rpx;padding: 0 10rpx;">
- 即将到货
- </view>
- <uni-number-box class="number-box" :min="0" :value="item.num" :isMin="item.num==0" :index="index"
- @eventChange="numberChange" v-if="item.num!=0"></uni-number-box>
- <image @click.stop="addCart(index)" src="/static/add.png" mode="aspectFit"
- style="width: 44rpx;height: 44rpx;" v-if="item.num==0 && item.kxStockVo.stock"></image>
- </view>
- </view>
- </view>
- </view>
- </view>
- <view v-else style="padding-top: 180rpx;padding-bottom: 180rpx;">
- <missing :buttonName="'换个地址试试吧~'" :handlerName="'buttonClick'" @buttonClick="chooseLocation"
- :imgUrl="'http://qiniuoss.nauzone.cn/%E7%BB%84%204%20%E6%8B%B7%E8%B4%9D@3x.png'" :desc="'当前地区不在配送范围哦'">
- </missing>
- </view>
- <view v-show="false">{{cartNums}}</view>
- </view>
- </template>
- <script>
- import missing from "@/components/missing.vue"
- import uniNumberBox from '@/components/uni-number-box.vue'
- export default {
- data() {
- return {
- isUpdating: false, // 新增状态字段
- sizeCalcState: false,
- tabScrollTop: 0,
- currentId: 1,
- flist: [],
- slist: [],
- sTitle: '',
- tlist: [],
- rawData: [],
- storage: true,
- currentIded: 0,
- //自适应头部
- navbarTop: 26,
- navHeight: 32,
- navBottom: 58,
- MT: 38,
- MT2: 20,
- statusHeight: 20,
- topHeight: 156,
- scollHeight: 500,
- count: 1,
- pageNo: 1,
- pageSize: 10,
- cover: false,
- curentTabView: '',
- cartNums: '',
- loaded: false,
- banner: {
- imgUrl: ''
- }
- }
- },
- components: {
- missing,
- uniNumberBox
- },
- onReachBottom() {
- if (this.isUpdating) return; // 防止重复加载
- // 如果当前分类还有更多商品未加载
- if (this.pageNo < this.count) {
- this.pageNo++;
- this.loadMoreProducts();
- return;
- }
- // 当前分类已加载完毕,尝试切换到下一个分类
- this.loadNextCategoryProducts();
- },
- onReady() {
- const res = uni.getSystemInfoSync();
- console.log(res.statusBarHeight);
- this.statusHeight = res.statusBarHeight
- // #ifdef MP-WEIXIN
- console.log('状态栏高度')
- console.log(this.statusHeight + 'px')
- this.navbarTop = wx.getMenuButtonBoundingClientRect().top
- this.navHeight = wx.getMenuButtonBoundingClientRect().height
- console.log('标题栏高度')
- console.log(this.navHeight + 'px')
- this.navBottom = wx.getMenuButtonBoundingClientRect().bottom
- console.log('底部坐标')
- console.log(this.navBottom + 'px')
- this.MT = this.navBottom
- console.log('定位栏外边框高度')
- console.log(this.MT + 'px')
- // #endif
- this.MT2 = this.MT - 20
- // #ifdef APP-PLUS
- this.navbarTop = this.statusHeight
- this.navHeight = 44
- // this.navBottom = this.navHeight + 20
- // this.MT = this.navBottom
- this.navBottom = this.navHeight
- this.MT2 = this.navBottom
- // #endif
- const that = this
- const query = uni.createSelectorQuery().in(this);
- query.select('#top').boundingClientRect(data => {
- console.log("得到布局位置信息" + JSON.stringify(data));
- console.log("节点离页面顶部的距离为" + data.top);
- that.topHeight = data.height + that.statusHeight - 2
- that.scollHeight = res.screenHeight - 75 - that.topHeight
- // #ifdef APP-PLUS
- that.topHeight = data.height + (that.statusHeight / 2)
- // that.topHeight = 146
- that.scollHeight = res.screenHeight - that.topHeight
- // #endif
- console.log('可使用高度为:')
- console.log(that.scollHeight)
- }).exec();
- },
- onLoad() {
- // console.log(this.$store.state.storageId)
- this.loadData();
- this.$api.request('get', 'carousel/app/getCarouselActive', {
- adType: 7
- }).then(res => {
- this.banner = res.data[0]
- })
- },
- onShow() {
- this.$store.state.storageId ? this.storage = true : this.storage = false
- //如果用户已登录,获取购物车数量
- if (this.$store.state.userInfo.accessToken) {
- this.countTabNum()
- }
- if (this.loaded) {
- this.loadCartData()
- }
- },
- methods: {
- // 加载当前分类的更多商品
- loadMoreProducts() {
- this.isUpdating = true;
- uni.showLoading({ title: '加载中...' });
- this.$api.request('get', 'storage/position/getGoodsPageByStorage', {
- storageId: this.$store.state.storageId,
- categoryId: this.currentIded || this.currentId,
- pageNo: this.pageNo,
- pageSize: this.pageSize
- }).then(res => {
- this.tlist = this.tlist.concat(res.data.rows);
- this.loadCartData();
- this.count = Math.ceil(res.data.total / this.pageSize);
- }).finally(() => {
- this.isUpdating = false;
- uni.hideLoading();
- });
- },
- // 加载下一个分类的商品
- loadNextCategoryProducts() {
- // 如果是一级分类
- const currentIndex = this.flist.findIndex(item => item.id === this.currentId);
- if (currentIndex < this.flist.length - 1) {
- // 切换到下一个一级分类
- this.tabtapNoRefresh(this.flist[currentIndex + 1]);
- } else {
- uni.showToast({ title: '已加载全部商品', icon: 'none' });
- }
- },
- loadData() {
- const that = this
- this.$api.request('get', 'product/app/categoryList').then(res => {
- that.rawData = res.data
- that.flist = res.data
- that.currentId = res.data[0].id
- that.slist[0] = {
- cateName: '全部',
- id: that.currentId
- }
- that.slist = that.slist.concat(res.data[0].children)
- that.sTitle = that.slist[1].cateName
- that.sTabTap(that.slist[0])
- console.log(that.slist)
- })
- },
- // 修改原有的sTabTap方法,重置分页参数
- sTabTap(item) {
- this.isUpdating = true;
- uni.showLoading({ title: '加载中...' });
- this.currentIded = item.id;
- this.sTitle = item.cateName;
- this.curentTabView = 'id' + item.id;
- this.pageNo = 1; // 重置页码
- this.$api.request('get', 'storage/position/getGoodsPageByStorage', {
- storageId: this.$store.state.storageId,
- categoryId: item.id,
- pageSize: this.pageSize
- }).then(res => {
- this.tlist = res.data.rows;
- for (let i = 0; i < this.tlist.length; i++) {
- this.tlist[i].num = 0;
- }
- this.loadCartData();
- this.count = Math.ceil(res.data.total / this.pageSize);
- }).finally(() => {
- this.isUpdating = false;
- uni.hideLoading();
- if (!this.loaded) {
- this.loaded = true;
- }
- });
- },
- // 修改原有的sTabTap方法,重置分页参数
- sTabTapNoRefresh(item) {
- const that = this
- this.isUpdating = true;
- uni.showLoading({ title: '加载中...' });
- this.currentIded = item.id;
- this.sTitle = item.cateName;
- this.curentTabView = 'id' + item.id;
- this.pageNo = 1; // 重置页码
- this.$api.request('get', 'storage/position/getGoodsPageByStorage', {
- storageId: this.$store.state.storageId,
- categoryId: item.id,
- pageSize: this.pageSize
- }).then(res => {
- this.tlist = this.tlist.concat(res.data.rows);
- for (let i = 0; i < this.tlist.length; i++) {
- this.tlist[i].num = 0;
- }
- this.loadCartData();
- this.count = Math.ceil(res.data.total / this.pageSize);
- }).finally(() => {
- this.isUpdating = false;
- uni.hideLoading();
- if (!this.loaded) {
- this.loaded = true;
- }
- });
- },
- // 修改原有的tabtap方法,重置分页参数
- tabtap(item) {
- this.currentId = item.id;
- this.slist = [];
- this.slist[0] = {
- cateName: '全部',
- id: this.currentId
- };
- if (item.children) {
- this.slist = this.slist.concat(item.children);
- this.sTitle = this.slist[1].cateName;
- }
- this.pageNo = 1; // 重置页码
- this.sTabTap(this.slist[0]);
- this.tabScrollTop = this.tabScrollTop === 0 ? 1 : 0;
- },
- tabtapNoRefresh(item) {
- this.currentId = item.id;
- this.slist = [];
- this.slist[0] = {
- cateName: '全部',
- id: this.currentId
- };
- if (item.children) {
- this.slist = this.slist.concat(item.children);
- this.sTitle = this.slist[1].cateName;
- }
- this.pageNo = 1; // 重置页码
- this.sTabTapNoRefresh(this.slist[0]);
- this.tabScrollTop = this.tabScrollTop === 0 ? 1 : 0;
- },
- navToList(tid) {
- uni.navigateTo({
- url: `/pages/product/list?tid=${tid}`
- })
- },
- navToDetail(id) {
- // console.log()
- uni.navigateTo({
- url: `../product/detail?id=${id}`
- })
- },
- naviageToPage(page) {
- uni.navigateTo({
- url: page
- })
- },
- showCover() {
- this.cover ? this.cover = false : this.cover = true
- },
- cartNumFn() {
- let cartNum = 0
- this.tlist.forEach((item, i) => {
- cartNum += item.num
- })
- this.cartNums = cartNum
- },
- addCart(index) {
- const that = this
- that.$api.request('get', 'cart/app/addCartItem', {
- productId: that.tlist[index].id,
- // activityId:that.tlist[index].skuDto.activityId,
- // couponId:that.tlist[index].skuDto.couponId,
- num: 1
- }).then(res => {
- that.$api.msg('添加购物车成功')
- this.tlist[index].num++
- this.cartNumFn()
- this.tlist[index].cartId = res.data.id
- console.log(that.tlist)
- var cartNum = this.$store.state.cartNum + 1
- that.$store.commit('addCart', cartNum)
- uni.setTabBarBadge({
- index: 2,
- text: cartNum + ''
- })
- })
- },
- //数量
- numberChange(data) {
- const that = this
- const index = data.index;
- const item = this.tlist[index];
- // 如果正在更新,直接返回
- if (item.isUpdating) return;
- // 标记为更新中
- item.isUpdating = true;
- if (data.number == 0) {
- this.deleteCartItem(data.index)
- item.isUpdating = false; // 删除操作后重置状态
- return
- }
- that.$api.request('get', 'cart/app/updateCartItemNum', {
- cartId: this.tlist[data.index].cartId,
- num: data.number
- }).then(res => {
- this.tlist[data.index].num = data.number
- this.cartNumFn()
- this.countTabNum()
- }).catch(err => {
- console.error("更新购物车失败:", err);
- }).finally(() => {
- item.isUpdating = false; // 无论成功失败,重置状态
- });
- },
- loadCartData() {
- const that = this
- that.$api.request('get', 'cart/app/getCartList', {
- storageId: this.$store.state.storageId
- }).then(res => {
- //遍历查询当前展示的商品中是否有数量
- var cartIds = []
- var goodsIds = []
- for (var i = 0; i < res.data.length; i++) {
- cartIds.push(res.data[i].productId)
- for (var j = 0; j < that.tlist.length; j++) {
- if (that.tlist[j].id === res.data[i].productId) {
- that.tlist[j].num = res.data[i].cartNum
- that.tlist[j].cartId = res.data[i].id
- console.log(that.tlist[j])
- }
- }
- }
- for (var j = 0; j < that.tlist.length; j++) {
- if (!cartIds.includes(that.tlist[j].id)) {
- that.tlist[j].num = 0
- that.tlist[j].cartId = 0
- }
- }
- //触发视图更新
- that.cartNums += 1
- console.log(that.tlist)
- })
- },
- //删除
- deleteCartItem(index) {
- const that = this
- that.$api.request('get', 'cart/app/removeCartItem', {
- cartId: that.tlist[index].cartId
- }).then(res => {
- // that.tlist.splice(index, 1);
- // that.calcTotal();
- that.tlist[index].num = 0
- that.cartNumFn()
- this.countTabNum()
- //uni.hideLoading();
- })
- },
- countTabNum() {
- this.$api.request('get', 'cart/app/countCart', {
- storageId: this.$store.state.storageId
- }).then(res => {
- if (res.data > 0) {
- uni.setTabBarBadge({
- index: 2,
- text: res.data + ''
- })
- } else if (res.data <= 0) {
- uni.removeTabBarBadge({
- index: 2
- })
- }
- this.$store.commit('addCart', res.data)
- }).catch(err => {
- // this.$api.msg('请求失败,请稍后再试')
- })
- },
- //配送外区域选择区域
- chooseLocation() {
- uni.chooseLocation({
- success: (res1) => {
- console.log(res1)
- this.district = res1.name
- uni.showLoading({
- title: "加载中..."
- })
- this.$api.request('get', 'storage/position/getRecentlyStorage', {
- lng: res1.longitude,
- lat: res1.latitude
- }, failres => {
- uni.hideLoading()
- this.logining = false
- this.$api.msg(failres.msg)
- this.storage ? this.storage = false : this.storage = true
- }).then(res => {
- uni.hideLoading()
- console.log(res)
- // res.data.id = 11
- this.$store.commit('setStorage', res.data.id)
- this.newTop = []
- this.cheapRecommend = []
- this.salesTop = []
- this.loadData(res.data.id)
- if (!res.data.id) {
- this.storage = false
- } else {
- this.storage ? this.storage = false : this.storage = true
- // this.loadRecommand('refresh')
- }
- })
- }
- });
- }
- }
- }
- </script>
- <style lang='scss'>
- page,
- .content {
- min-height: 50%;
- background-color: #f8f8f8;
- }
- .number-box {
- width: 73px;
- }
- .actived {
- font-size: 28rpx;
- color: #2AAC34;
- border-bottom: #2AAC34 solid 8rpx;
- }
- .line-orange::after,
- .lines-orange::after {
- border-color: #FC6620;
- }
- .solid-bottom::after {
- border-bottom: 1rpx solid rgba(0, 0, 0, 0.1);
- }
- .content {
- display: flex;
- }
- .left-aside {
- flex-shrink: 0;
- width: 150upx;
- height: 100%;
- background-color: #f8f8f8;
- }
- .f-item {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 100upx;
- font-size: 28upx;
- color: $font-color-base;
- position: relative;
- &.active {
- color: $base-color;
- background: #fff;
- &:before {
- content: '';
- position: absolute;
- left: 0;
- top: 50%;
- transform: translateY(-50%);
- height: 30upx;
- width: 8upx;
- background-color: $base-color;
- opacity: .8;
- }
- }
- }
- .right-aside {
- flex: 1;
- overflow: hidden;
- padding-left: 20upx;
- }
- .s-item {
- display: flex;
- align-items: center;
- height: 70upx;
- padding-top: 8upx;
- font-size: 28upx;
- color: $font-color-dark;
- }
- .t-list {
- display: flex;
- flex-wrap: wrap;
- width: 100%;
- background: #fff;
- padding-top: 12upx;
- &:after {
- content: '';
- flex: 99;
- height: 0;
- }
- }
- .t-item {
- flex-shrink: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- width: 176upx;
- font-size: 26upx;
- color: #666;
- padding-bottom: 20upx;
- image {
- width: 140upx;
- height: 140upx;
- }
- }
- </style>
|