You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
4.2 KiB

11 months ago
<script setup lang="ts">
import { productListApi, productListBeforeApi } from '~/server/goodsApi'
import { reactive, ref, watch } from 'vue'
import { ProductListQuery } from '~/types/goods'
const route = useRoute()
const searchValue = ref<string>(<string>route.query.searchValue) //搜索框输入词
const productCid = ref<string>(<string>route.query.productCid) //商品分类id,三级分类id
//窗口的高度
const { getWindowHeight } = useScrollHeight()
const ScrollHeight = ref<number>(getWindowHeight() - 176 - 140)
watch(
() => route.query.searchValue,
(newValue) => {
searchValue.value = newValue
where.keyword = newValue
where.cid = null
where.brandId = null
where.tagId = null
getProductListBefore()
refresh()
},
)
watch(
() => route.query.productCid,
(newValue) => {
if (newValue) {
where.cid = newValue
refresh()
}
},
)
/**
* 列表
*/
const where = reactive<ProductListQuery>({
page: 1,
limit: 10,
brandId: '',
cid: productCid.value,
keyword: searchValue.value,
maxPrice: null,
merId: '',
minPrice: null,
priceOrder: '',
salesOrder: '',
tagId: null,
})
const {
data: tableData,
refresh,
pending: listLoading,
} = await useAsyncData(async () => productListApi(where), {
default: () => ({
list: [],
total: 0,
}),
})
// 分页数据
const pageChange = (e: number) => {
where.page = e
refresh()
}
const seachLists = reactive([
{
name: '商品品牌',
list: [],
checked: [],
type: 'productBrand',
multiple: true, //是否是多选
showMore: true, //true显示展开
isShowBtnMore: false
},
{
name: '商品分类',
list: [],
checked: [],
type: 'productCategory',
multiple: true,
showMore: true, //true显示展开
isShowBtnMore: false
},
{
name: '商品标签',
list: [],
checked: [],
type: 'productTagList',
multiple: false,
showMore: true, //true显示展开
isShowBtnMore: false
},
])
//搜索品牌、分类 筛选数据/
const getProductListBefore = async () => {
let data = await productListBeforeApi({ keyword: searchValue.value })
seachLists[0].list = data?.brandList
seachLists[1].list = data?.categoryList
seachLists[2].list = data?.productTagList
}
getProductListBefore()
//获取搜索选中结果
const handleSubmitChecked = (list: number[] | number) => {
where.cid = list.productCategory ? list.productCategory.toString() : ''
where.brandId = list.productBrand ? list.productBrand.toString() : ''
where.tagId = list.productTagList
refresh()
}
//综合排序筛选回调
const handleSubmitSelect = (e: ProductListQuery) => {
Object.assign(where, e)
refresh()
}
</script>
<template>
<div class="product_list h-100%">
<div class="wrapper_1200 h-100%">
<page-header title="全部结果"></page-header>
<div class="b-rd-16px bg-#FFFFFF mb-20px">
<seach-list :list="seachLists" v-if="(seachLists[0].list&&seachLists[0].list.length>0) || (seachLists[1].list&&seachLists[1].list.length>0) || (seachLists[2].list&&seachLists[2].list.length>0)" @handleSubmitChecked="handleSubmitChecked"></seach-list>
</div>
<div class="acea-row sort items-center w-100% h-50px bg-#FFFFFF b-rd-12px pl-20px">
<sort-seach :where="where" @handleSubmitSelect="handleSubmitSelect"></sort-seach>
</div>
<div v-loading="listLoading" class="h-70%">
<div v-if="tableData.total>0">
<ProductSeach :list="tableData.list"></ProductSeach>
<div class="acea-row row-middle mt-20px pb-10px">
<el-pagination
background
layout="prev, pager, next"
:total="tableData.total"
class="page-item"
:page-size="where.limit"
:current-page="where.page"
@update:current-page="pageChange"
/>
</div>
</div>
<div v-else class="w-100%" :style="{ height: ScrollHeight + 'px' }">
<empty-page title="暂无商品哟~">
<template v-slot:emptyImage>
<img src="@/assets/images/wushangpin.png" />
</template>
</empty-page>
</div>
</div>
</div>
</div>
</template>
<style scoped lang="scss"></style>