Merge remote-tracking branch 'remotes/origin/dev/1.0' into dev/1.0
This commit is contained in:
@@ -127,11 +127,23 @@ const localDevConfig = ({
|
|||||||
uniacid: 2821,
|
uniacid: 2821,
|
||||||
domain: 'https://xcx.aigc-quickapp.com/',
|
domain: 'https://xcx.aigc-quickapp.com/',
|
||||||
},
|
},
|
||||||
|
'18': { // 测试平台
|
||||||
|
uniacid: 18,
|
||||||
|
domain: 'https://test.aigc-quickapp.com',
|
||||||
|
},
|
||||||
|
'2': { // 测试平台
|
||||||
|
uniacid: 2,
|
||||||
|
domain: 'https://test.aigc-quickapp.com',
|
||||||
|
},
|
||||||
|
'48': { // 测试平台
|
||||||
|
uniacid: 48,
|
||||||
|
domain: 'https://test.aigc-quickapp.com',
|
||||||
|
},
|
||||||
// })['5g-237']; // 商品分类,没有立即咨询文字
|
// })['5g-237']; // 商品分类,没有立即咨询文字
|
||||||
// })['5g-97']; // 大宗商品贸易,支持自定义字体大小、颜色
|
// })['5g-97']; // 大宗商品贸易,支持自定义字体大小、颜色
|
||||||
// })['5g-50']; // 燃气安全产品机器人,购物车无反应
|
// })['5g-50']; // 燃气安全产品机器人,购物车无反应
|
||||||
// })['2821']; // 离型纸硅油纸
|
// })['2821']; // 离型纸硅油纸
|
||||||
})['2482']; // 低空经济
|
})['48']; // 离型纸硅油纸
|
||||||
// })['2485']; // 验证电子表单前后端数据一致性
|
// })['2485']; // 验证电子表单前后端数据一致性
|
||||||
// })['5g-11']; // 数码
|
// })['5g-11']; // 数码
|
||||||
// })['5g-213']; // 选择要使用的环境配置
|
// })['5g-213']; // 选择要使用的环境配置
|
||||||
|
|||||||
@@ -2,10 +2,50 @@
|
|||||||
<view data-component-name="diy-category-item" class="item-wrap" :class="type">
|
<view data-component-name="diy-category-item" class="item-wrap" :class="type">
|
||||||
<block v-if="type == 'category' && category.child_list && category.child_list.length">
|
<block v-if="type == 'category' && category.child_list && category.child_list.length">
|
||||||
<view class="category-adv" v-if="category.image_adv" @tap.stop="diyRedirectTo(category.link_url)">
|
<view class="category-adv" v-if="category.image_adv" @tap.stop="diyRedirectTo(category.link_url)">
|
||||||
<image :src="$util.img(category.image_adv)" mode="widthFix" show-menu-by-longpress />
|
<image :src="$util.img(category.image_adv)" mode="widthFix" show-menu-by-longpress />
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<block v-if="value.level == 2">
|
<block v-if="value.template == 99">
|
||||||
|
<view class="second-category-btns">
|
||||||
|
<view class="second-category-btn"
|
||||||
|
v-for="(one, oneIndex) in category.child_list"
|
||||||
|
:key="oneIndex"
|
||||||
|
:class="{ selected: selectedSecondCategory == one.category_id }"
|
||||||
|
@tap="selectSecondCategory(one)">
|
||||||
|
{{ one.category_name }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="category-goods-list" v-if="selectedSecondCategory">
|
||||||
|
<view class="goods-list double-column show" :data-template="value.template" v-if="secondCategoryGoodsList.length">
|
||||||
|
<view class="goods-item" v-for="(item, index) in secondCategoryGoodsList" :key="index">
|
||||||
|
<view class="goods-img" @tap.stop="toDetail(item)">
|
||||||
|
<image :src="goodsImg(item.goods_image)" mode="widthFix" @error="imgError(index)" show-menu-by-longpress />
|
||||||
|
<view class="color-base-bg goods-tag" v-if="item.label_name">{{ item.label_name }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="info-wrap">
|
||||||
|
<view class="name-wrap" @tap.stop="toDetail(item)">
|
||||||
|
<view class="goods-name">{{ isEnEnv ? item.en_goods_name : item.goods_name }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="price-wrap">
|
||||||
|
<view class="discount-price">
|
||||||
|
<block v-if="item.isinformation == 0">
|
||||||
|
<text class="unit price-style small">{{ $lang('common.currencySymbol') }}</text>
|
||||||
|
<text class="price price-style large">{{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }}</text>
|
||||||
|
<text class="unit price-style small">.{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }}</text>
|
||||||
|
</block>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="category-goods-empty" v-if="selectedSecondCategory && !secondCategoryGoodsList.length && !loading">
|
||||||
|
<image :src="$util.img('public/uniapp/category/empty.png')" mode="widthFix" show-menu-by-longpress></image>
|
||||||
|
<view class="tips">{{ $lang('components-diy.diy-category.noCategory') }}</view>
|
||||||
|
</view>
|
||||||
|
</block>
|
||||||
|
|
||||||
|
<block v-else-if="value.level == 2">
|
||||||
<view class="category-title">{{ category.category_name }}</view>
|
<view class="category-title">{{ category.category_name }}</view>
|
||||||
<view class="category-list">
|
<view class="category-list">
|
||||||
<view class="category-item" v-for="(one, oneIndex) in category.child_list" :key="oneIndex"
|
<view class="category-item" v-for="(one, oneIndex) in category.child_list" :key="oneIndex"
|
||||||
@@ -18,7 +58,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</block>
|
</block>
|
||||||
|
|
||||||
<block v-if="value.level == 3">
|
<block v-else-if="value.level == 3">
|
||||||
<block v-for="(one, oneIndex) in category.child_list" :key="oneIndex">
|
<block v-for="(one, oneIndex) in category.child_list" :key="oneIndex">
|
||||||
<view class="category-title">{{ one.category_name }}</view>
|
<view class="category-title">{{ one.category_name }}</view>
|
||||||
<view class="category-list">
|
<view class="category-list">
|
||||||
@@ -296,6 +336,14 @@ export default {
|
|||||||
isList: {
|
isList: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
lastSecondCategoryName: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
currentOneCategory: {
|
||||||
|
type: Object,
|
||||||
|
default: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mixins: [DiyMinx],
|
mixins: [DiyMinx],
|
||||||
@@ -316,13 +364,28 @@ export default {
|
|||||||
scrollTop: 0,
|
scrollTop: 0,
|
||||||
loadType: '',
|
loadType: '',
|
||||||
timeout: {},
|
timeout: {},
|
||||||
cartEditRepeat: false
|
cartEditRepeat: false,
|
||||||
|
selectedSecondCategory: null,
|
||||||
|
secondCategoryGoodsList: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.type = this.value.template == 1 ? 'category' : 'goods';
|
this.type = this.value.template == 1 || this.value.template == 99 ? 'category' : 'goods';
|
||||||
if (this.index == this.select && this.pageIndex == 0) this.getGoodsList();
|
if (this.index == this.select && this.pageIndex == 0) this.getGoodsList();
|
||||||
this.loadType = this.value.goodsLevel == 1 && this.value.loadType == 'all' ? 'all' : 'part';
|
this.loadType = this.value.goodsLevel == 1 && this.value.loadType == 'all' ? 'all' : 'part';
|
||||||
|
if (this.value.template == 99 && this.index == this.select && this.category.child_list && this.category.child_list.length > 0) {
|
||||||
|
let targetCategory = null;
|
||||||
|
if (this.lastSecondCategoryName) {
|
||||||
|
targetCategory = this.category.child_list.find(item => item.category_name === this.lastSecondCategoryName);
|
||||||
|
}
|
||||||
|
if (!targetCategory) {
|
||||||
|
targetCategory = this.category.child_list[0];
|
||||||
|
}
|
||||||
|
this.selectedSecondCategory = targetCategory.category_id;
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
// 用当前一级分类下同名二级分类的 id 查商品(而非全局按钮的 id)
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -332,6 +395,18 @@ export default {
|
|||||||
if (data) this.contentWrapHeight = data.height;
|
if (data) this.contentWrapHeight = data.height;
|
||||||
}).exec();
|
}).exec();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
if (this.value.template == 99 && this.category.child_list && this.category.child_list.length > 0) {
|
||||||
|
let targetCategory = null;
|
||||||
|
if (this.lastSecondCategoryName) {
|
||||||
|
targetCategory = this.category.child_list.find(item => item.category_name === this.lastSecondCategoryName);
|
||||||
|
}
|
||||||
|
if (!targetCategory) {
|
||||||
|
targetCategory = this.category.child_list[0];
|
||||||
|
}
|
||||||
|
this.selectedSecondCategory = targetCategory.category_id;
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
this.getSecondCategoryGoods(targetCategory.category_id);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
oneCategorySelect: function () {
|
oneCategorySelect: function () {
|
||||||
@@ -360,6 +435,27 @@ export default {
|
|||||||
} else if (this.loadType == 'part') {
|
} else if (this.loadType == 'part') {
|
||||||
this.scrollTop = -1;
|
this.scrollTop = -1;
|
||||||
}
|
}
|
||||||
|
if (this.value.template == 99 && this.category.child_list && this.category.child_list.length > 0) {
|
||||||
|
let targetCategory = null;
|
||||||
|
if (this.lastSecondCategoryName) {
|
||||||
|
targetCategory = this.category.child_list.find(item => item.category_name === this.lastSecondCategoryName);
|
||||||
|
}
|
||||||
|
if (!targetCategory) {
|
||||||
|
targetCategory = this.category.child_list[0];
|
||||||
|
}
|
||||||
|
this.selectedSecondCategory = targetCategory.category_id;
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 切换一级分类时, 根据当前一级分类下同名二级分类重新加载商品
|
||||||
|
currentOneCategory: {
|
||||||
|
handler() {
|
||||||
|
if (this.value.template == 99) {
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
},
|
},
|
||||||
'globalStoreInfo.store_id': {
|
'globalStoreInfo.store_id': {
|
||||||
handler(nval, oval) {
|
handler(nval, oval) {
|
||||||
@@ -739,6 +835,82 @@ export default {
|
|||||||
if (!link) return;
|
if (!link) return;
|
||||||
this.$util.diyRedirectTo(JSON.parse(link));
|
this.$util.diyRedirectTo(JSON.parse(link));
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 根据当前一级分类(currentOneCategory)下与选中按钮同名的二级分类, 加载对应商品
|
||||||
|
* 按钮是全局去重的(选中状态用全局 category_id), 但商品只显示当前一级分类下的
|
||||||
|
* 当前一级分类下若没有同名二级分类, 则商品清空(按钮保持选中)
|
||||||
|
*/
|
||||||
|
refreshGoodsByCurrentCategory() {
|
||||||
|
if (this.selectedSecondCategory == null) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 取当前选中按钮的名称
|
||||||
|
const cur = (this.category.child_list || []).find(c => c.category_id === this.selectedSecondCategory);
|
||||||
|
if (!cur) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const one = this.currentOneCategory;
|
||||||
|
if (!one || !one.child_list || one.child_list.length === 0) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const match = one.child_list.find(c => c.category_name === cur.category_name);
|
||||||
|
if (match) {
|
||||||
|
this.getSecondCategoryGoods(match.category_id);
|
||||||
|
} else {
|
||||||
|
// 当前一级分类下没有该二级分类, 商品清空(按钮仍保持选中)
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectSecondCategory(category) {
|
||||||
|
if (this.selectedSecondCategory === category.category_id) {
|
||||||
|
this.selectedSecondCategory = null;
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
} else {
|
||||||
|
this.selectedSecondCategory = category.category_id;
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
this.$emit('saveSecondCategory', category.category_name);
|
||||||
|
// 用当前一级分类下同名 category_id 查商品
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getSecondCategoryGoods(categoryId) {
|
||||||
|
this.loading = true;
|
||||||
|
let order = '';
|
||||||
|
let sort = '';
|
||||||
|
if (this.value.sortWay) {
|
||||||
|
if (this.value.sortWay == 'default') {
|
||||||
|
order = '';
|
||||||
|
sort = '';
|
||||||
|
} else if (this.value.sortWay == 'sales') {
|
||||||
|
order = 'sales';
|
||||||
|
sort = 'desc';
|
||||||
|
} else if (this.value.sortWay == 'price') {
|
||||||
|
order = 'min_price';
|
||||||
|
sort = this.value.sortType == 'desc' ? 'desc' : 'asc';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$api.sendRequest({
|
||||||
|
url: '/api/goodssku/pageByCategory',
|
||||||
|
data: {
|
||||||
|
category_id: categoryId,
|
||||||
|
page: 1,
|
||||||
|
page_size: this.pageSize,
|
||||||
|
order: order,
|
||||||
|
sort: sort
|
||||||
|
},
|
||||||
|
success: res => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.code == 0 && res.data && res.data.list) {
|
||||||
|
this.secondCategoryGoodsList = res.data.list;
|
||||||
|
} else {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
//加载商品在购物车的总数量
|
//加载商品在购物车的总数量
|
||||||
loadGoodsCartNum(isRefresh = false) {
|
loadGoodsCartNum(isRefresh = false) {
|
||||||
this.goodsList.forEach((item) => {
|
this.goodsList.forEach((item) => {
|
||||||
@@ -1465,4 +1637,147 @@ export default {
|
|||||||
.price-font {
|
.price-font {
|
||||||
font-weight: var(--diy-category-item-price-font-weight, 500) !important;
|
font-weight: var(--diy-category-item-price-font-weight, 500) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===================== 模板99 商品分类样式 =====================
|
||||||
|
.second-category-btns {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 20rpx 20rpx 10rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-bottom: 1rpx solid #f0f0f0;
|
||||||
|
|
||||||
|
.second-category-btn {
|
||||||
|
padding: 14rpx 32rpx;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: #666;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
margin: 0 16rpx 16rpx 0;
|
||||||
|
max-width: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-goods-list {
|
||||||
|
padding: 20rpx;
|
||||||
|
background: #f5f5f5;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.goods-list {
|
||||||
|
margin: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.goods-item {
|
||||||
|
width: calc(50% - 10rpx);
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.goods-img {
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
padding-top: 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #fff;
|
||||||
|
border-top-left-radius: 12rpx;
|
||||||
|
border-top-right-radius: 12rpx;
|
||||||
|
|
||||||
|
image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.goods-tag {
|
||||||
|
position: absolute;
|
||||||
|
top: 10rpx;
|
||||||
|
left: 10rpx;
|
||||||
|
padding: 4rpx 12rpx;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 22rpx;
|
||||||
|
border-radius: 6rpx;
|
||||||
|
background: #FF6B35;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-wrap {
|
||||||
|
flex: 1;
|
||||||
|
padding: 16rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.name-wrap {
|
||||||
|
.goods-name {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #333;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
line-height: 1.4;
|
||||||
|
margin-top: 0;
|
||||||
|
white-space: normal;
|
||||||
|
text-overflow: clip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-wrap {
|
||||||
|
margin-top: 10rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.discount-price {
|
||||||
|
color: #FF6B35;
|
||||||
|
font-size: 30rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
.unit {
|
||||||
|
font-size: 22rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-goods-empty {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 80rpx 0;
|
||||||
|
background: #f5f5f5;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
image {
|
||||||
|
width: 280rpx;
|
||||||
|
height: 252rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tips {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #999;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -92,17 +92,30 @@
|
|||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
<view class="right-flex-wrap">
|
<view class="right-flex-wrap">
|
||||||
<scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 1 || loadType == 'all'"
|
<!-- 模板99 + 二级分类: 全局二级分类按钮(去重, 一直显示) + 商品列表 -->
|
||||||
|
<scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 99 && template99Category"
|
||||||
|
:refresher-enabled="true" refresher-default-style="none"
|
||||||
|
:refresher-triggered="triggered" @refresherrefresh="onRefresh" @refresherrestore="onRestore">
|
||||||
|
<diy-category-item :category="template99Category" :value="value" ref="categoryItem" :index="0" :select="0"
|
||||||
|
:oneCategorySelect="oneCategorySelect" :isList="isList"
|
||||||
|
:currentOneCategory="categoryTree && categoryTree[select] ? categoryTree[select] : null"
|
||||||
|
:lastSecondCategoryName="lastSecondCategoryName"
|
||||||
|
@tologin="toLogin" @selectsku="selectSku($event, 0)" @addCart="addCartPoint"
|
||||||
|
@saveSecondCategory="saveSecondCategoryName"></diy-category-item>
|
||||||
|
</scroll-view>
|
||||||
|
|
||||||
|
<scroll-view scroll-y="true" class="content-wrap" v-else-if="value.template == 1 || value.template == 99 || loadType == 'all'"
|
||||||
ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true"
|
ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true"
|
||||||
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
|
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
|
||||||
refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh"
|
refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh"
|
||||||
@refresherrestore="onRestore">
|
@refresherrestore="onRestore">
|
||||||
<view class="child-category" v-for="(item, index) in categoryTree" :key="index"
|
<view class="child-category" v-for="(item, index) in categoryTree" :key="index"
|
||||||
:id="'category-' + index">
|
:id="'category-' + index" :style="{ display: value.template == 99 && select != index ? 'none' : 'block' }">
|
||||||
<diy-category-item :category="item" :value="value" ref="categoryItem" :index="index"
|
<diy-category-item :category="item" :value="value" ref="categoryItem" :index="index"
|
||||||
:select="select" :oneCategorySelect="oneCategorySelect" :isList="isList"
|
:select="select" :oneCategorySelect="oneCategorySelect" :isList="isList"
|
||||||
|
:lastSecondCategoryName="value.template == 99 ? lastSecondCategoryName : ''"
|
||||||
@tologin="toLogin" @selectsku="selectSku($event, index)" @addCart="addCartPoint"
|
@tologin="toLogin" @selectsku="selectSku($event, index)" @addCart="addCartPoint"
|
||||||
@loadfinish="getHeightArea"></diy-category-item>
|
@loadfinish="getHeightArea" @saveSecondCategory="saveSecondCategoryName"></diy-category-item>
|
||||||
</view>
|
</view>
|
||||||
<view class="end-tips" ref="endTips" :style="{ opacity: endTips }">{{ $lang('components-diy.diy-category.reachedBottom') }}</view>
|
<view class="end-tips" ref="endTips" :style="{ opacity: endTips }">{{ $lang('components-diy.diy-category.reachedBottom') }}</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
@@ -194,7 +207,9 @@ export default {
|
|||||||
loadType: '',
|
loadType: '',
|
||||||
templateFourData: [],
|
templateFourData: [],
|
||||||
isList: false,
|
isList: false,
|
||||||
lang: uni.getStorageSync("lang")//en-us 英文
|
lang: uni.getStorageSync("lang"),
|
||||||
|
lastSecondCategoryName: '',
|
||||||
|
template99Category: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -331,7 +346,7 @@ export default {
|
|||||||
})
|
})
|
||||||
.exec();
|
.exec();
|
||||||
this.heightArea = heightArea;
|
this.heightArea = heightArea;
|
||||||
if (index != -1 && index < this.categoryTree.length - 1) this.$refs.categoryItem[index + 1].getGoodsList();
|
if (index != -1 && index < this.categoryTree.length - 1 && Array.isArray(this.$refs.categoryItem) && this.$refs.categoryItem[index + 1]) this.$refs.categoryItem[index + 1].getGoodsList();
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* 获取全部分类
|
* 获取全部分类
|
||||||
@@ -361,10 +376,77 @@ export default {
|
|||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 模板99 + 二级分类: 全局查询所有有商品的二级分类(去重), 按钮一直显示
|
||||||
|
if (this.value.template == 99) {
|
||||||
|
this.loadGlobalSecondCategoryBtns();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 全局查询所有有商品的二级分类, 按名称去重, 汇总成虚拟分类供 template99 渲染按钮
|
||||||
|
* 只要任何商品属于该二级分类, 按钮就显示; 切换一级分类时按钮不变(一直显示)
|
||||||
|
* 新增的二级分类只要有商品也会自动包含
|
||||||
|
*/
|
||||||
|
loadGlobalSecondCategoryBtns() {
|
||||||
|
if (!this.categoryTree || !this.categoryTree.length) {
|
||||||
|
this.template99Category = { category_name: '', child_list: [] };
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 收集所有二级分类(保留原始顺序, 不去重, 查询所有同名后再去重)
|
||||||
|
const allSecond = [];
|
||||||
|
this.categoryTree.forEach(one => {
|
||||||
|
if (one.child_list && one.child_list.length) {
|
||||||
|
one.child_list.forEach(two => {
|
||||||
|
allSecond.push(Object.assign({ _origIndex: allSecond.length }, two));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!allSecond.length) {
|
||||||
|
this.template99Category = { category_name: '', child_list: [] };
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let pending = allSecond.length;
|
||||||
|
const results = [];
|
||||||
|
const finishOne = () => {
|
||||||
|
pending--;
|
||||||
|
if (pending <= 0) {
|
||||||
|
results.sort((a, b) => a._origIndex - b._origIndex);
|
||||||
|
// 按名称去重, 同名只保留第一个有商品的(只要任一同名有商品就显示)
|
||||||
|
const deduped = [];
|
||||||
|
const seenNames = {};
|
||||||
|
results.forEach(item => {
|
||||||
|
if (!seenNames[item.category_name]) {
|
||||||
|
seenNames[item.category_name] = true;
|
||||||
|
deduped.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.template99Category = {
|
||||||
|
category_name: '',
|
||||||
|
child_list: deduped
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
allSecond.forEach(two => {
|
||||||
|
this.$api.sendRequest({
|
||||||
|
url: '/api/goodssku/pageByCategory',
|
||||||
|
data: {
|
||||||
|
category_id: two.category_id,
|
||||||
|
page: 1,
|
||||||
|
page_size: 1
|
||||||
|
},
|
||||||
|
success: res => {
|
||||||
|
if (res && res.code == 0 && res.data && res.data.list && res.data.list.length > 0) {
|
||||||
|
results.push(two);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
complete: () => {
|
||||||
|
finishOne();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* 切换一级分类
|
* 切换一级分类
|
||||||
* @param {Object} index
|
* @param {Object} index
|
||||||
@@ -373,9 +455,11 @@ export default {
|
|||||||
if (index >= this.categoryTree.length) return;
|
if (index >= this.categoryTree.length) return;
|
||||||
this.select = index;
|
this.select = index;
|
||||||
this.categoryId = 'category-' + index;
|
this.categoryId = 'category-' + index;
|
||||||
// 阻止切换分类之后滚动事件也立即执行
|
|
||||||
this.scrollLock = true;
|
this.scrollLock = true;
|
||||||
},
|
},
|
||||||
|
saveSecondCategoryName(name) {
|
||||||
|
this.lastSecondCategoryName = name;
|
||||||
|
},
|
||||||
touchStart() {
|
touchStart() {
|
||||||
this.scrollLock = false;
|
this.scrollLock = false;
|
||||||
},
|
},
|
||||||
@@ -393,10 +477,10 @@ export default {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.value.template != 1 && this.value.loadType == 'all' && this.heightArea[this.select][1] -
|
if (this.value.template != 1 && this.value.loadType == 'all' && this.heightArea[this.select][1] -
|
||||||
scrollTop - contentWrapHeight < 300) {
|
scrollTop - contentWrapHeight < 300) {
|
||||||
this.$refs.categoryItem[this.select].getGoodsList();
|
if (Array.isArray(this.$refs.categoryItem) && this.$refs.categoryItem[this.select]) this.$refs.categoryItem[this.select].getGoodsList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onRefresh() {
|
onRefresh() {
|
||||||
@@ -549,7 +633,7 @@ export default {
|
|||||||
},
|
},
|
||||||
// 操作多规格商品弹框后,刷新商品数据
|
// 操作多规格商品弹框后,刷新商品数据
|
||||||
refreshData() {
|
refreshData() {
|
||||||
this.$refs.categoryItem[this.select].loadGoodsCartNum(true);
|
if (Array.isArray(this.$refs.categoryItem) && this.$refs.categoryItem[this.select]) this.$refs.categoryItem[this.select].loadGoodsCartNum(true);
|
||||||
},
|
},
|
||||||
changeListStyle() {
|
changeListStyle() {
|
||||||
this.isList = !this.isList;
|
this.isList = !this.isList;
|
||||||
@@ -1050,4 +1134,99 @@ export default {
|
|||||||
border-bottom-right-radius: 8rpx;
|
border-bottom-right-radius: 8rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===================== 模板99 商品分类样式 =====================
|
||||||
|
.category-template-99 {
|
||||||
|
.search-box {
|
||||||
|
padding: 20rpx 24rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-bottom: 1rpx solid #f0f0f0;
|
||||||
|
|
||||||
|
.search-content {
|
||||||
|
height: 64rpx;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
|
||||||
|
input {
|
||||||
|
height: 64rpx;
|
||||||
|
line-height: 64rpx;
|
||||||
|
padding: 0 80rpx 0 30rpx;
|
||||||
|
background: #f5f5f5;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #89899a;
|
||||||
|
width: 70rpx;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .iconfont {
|
||||||
|
font-size: 40rpx;
|
||||||
|
color: #666;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
.tree-wrap {
|
||||||
|
width: 200rpx;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-flex-wrap {
|
||||||
|
flex: 1;
|
||||||
|
width: 0;
|
||||||
|
background: #f5f5f5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-wrap .category-item {
|
||||||
|
padding: 30rpx 16rpx;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
|
||||||
|
view {
|
||||||
|
color: #333;
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.select {
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
view {
|
||||||
|
color: #FF6B35;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: ' ';
|
||||||
|
width: 6rpx;
|
||||||
|
height: 36rpx;
|
||||||
|
background: #FF6B35;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
border-radius: 0 6rpx 6rpx 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-wrap {
|
||||||
|
background: #f5f5f5;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.child-category {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
12
pages.json
12
pages.json
@@ -147,13 +147,13 @@
|
|||||||
"diy-store-label": "view",
|
"diy-store-label": "view",
|
||||||
"diy-tab": "view",
|
"diy-tab": "view",
|
||||||
"diy-text": "view",
|
"diy-text": "view",
|
||||||
"diy-video": "view",
|
"diy-video": "view",
|
||||||
"diy-video-list": "view"
|
"diy-video-list": "view"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
{
|
},
|
||||||
"path": "cart",
|
{
|
||||||
|
"path": "cart",
|
||||||
"style": {
|
"style": {
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom",
|
||||||
|
|||||||
Reference in New Issue
Block a user