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.
333 lines
9.9 KiB
333 lines
9.9 KiB
11 months ago
|
<script setup lang="ts">
|
||
|
import { ref, reactive, watch,computed } from 'vue'
|
||
|
import { getMerCategoryApi, getMerIndexInfoApi, getMerProListApi, merchantRecommendApi } from '~/server/merchantApi'
|
||
|
import MerchantNews from '~/components/merchantNews.vue'
|
||
|
import { merchantProductSeachDefault } from '~/pages/merchant/defaultMerchant'
|
||
|
import { MerchantProductSeach } from '~/types/merchant'
|
||
|
import { Search } from '@element-plus/icons-vue'
|
||
|
import { ItemObject, PageQuery } from '~/types/global'
|
||
|
import { couponListApi } from '~/server/goodsApi'
|
||
|
import Recommending from './merchant/recommending.vue'
|
||
|
const route = useRoute()
|
||
|
const merId = ref<number>(Number(route.query.merId)) //商户id
|
||
|
const searchValue = ref<string>(<string>route.query.searchValue) //搜索框输入词
|
||
|
const menuList = ref<Array<string>>(['店铺首页', '全部商品', '领优惠券'])
|
||
|
const current = ref<number>(route.query.currentVal?Number(route.query.currentVal):0)
|
||
|
|
||
|
watch(
|
||
|
() => route.query.searchValue,
|
||
|
(newValue) => {
|
||
|
searchValue.value = newValue
|
||
|
searchForm.keyword = newValue
|
||
|
current.value = Number(route.query.currentVal)
|
||
|
refresh()
|
||
|
},
|
||
|
)
|
||
|
|
||
|
//窗口的高度
|
||
|
const { getWindowHeight } = useScrollHeight()
|
||
|
const ScrollHeight = ref<number>(getWindowHeight() - 176 - 60)
|
||
|
|
||
|
// 点击菜单
|
||
|
const handleMenu = (idx: number) => {
|
||
|
current.value = idx
|
||
|
searchForm.cid = null
|
||
|
if(idx<2) refresh()
|
||
|
}
|
||
|
|
||
|
//商户信息
|
||
|
const { data: merchantInfo } = await useAsyncData(async () => getMerIndexInfoApi(merId.value))
|
||
|
|
||
|
//商户分类
|
||
|
const { data: categoryList } = await useAsyncData(async () => getMerCategoryApi(merId.value))
|
||
|
|
||
|
//分类默认全部展开
|
||
|
const opened = computed(()=>{
|
||
|
return categoryList.value.map((i:any)=>{
|
||
|
return i.id
|
||
|
})
|
||
|
})
|
||
|
|
||
|
//商品列表
|
||
|
const sizeData = reactive<ItemObject>({
|
||
|
width: '223px',
|
||
|
height: '223px',
|
||
|
})
|
||
|
const searchForm = reactive<MerchantProductSeach>(Object.assign(merchantProductSeachDefault()))
|
||
|
searchForm.merId = merId.value
|
||
|
searchForm.keyword = searchValue.value ? searchValue.value : searchForm.keyword
|
||
|
const {
|
||
|
data: tableData,
|
||
|
refresh,
|
||
|
pending: listLoading,
|
||
|
} = await useAsyncData(async () => getMerProListApi(searchForm), {
|
||
|
default: () => ({
|
||
|
list: [],
|
||
|
total: 0,
|
||
|
}),
|
||
|
})
|
||
|
// 分页数据
|
||
|
const pageChange = (e: number) => {
|
||
|
searchForm.page = e
|
||
|
refresh()
|
||
|
}
|
||
|
|
||
|
//点击分类
|
||
|
const handleClassify = (e: number) => {
|
||
|
searchForm.cid = e
|
||
|
current.value = 1
|
||
|
refresh()
|
||
|
}
|
||
|
|
||
|
//关注店铺回调
|
||
|
const handleSubmitSuccess = () => {
|
||
|
merchantInfo.value.isCollect = !merchantInfo.value.isCollect
|
||
|
}
|
||
|
|
||
|
//优惠券列表
|
||
|
const where = reactive<PageQuery>({
|
||
|
page: 1,
|
||
|
limit: 12,
|
||
|
merId: merId.value,
|
||
|
category: 0,
|
||
|
})
|
||
|
const {
|
||
|
data: couponLists,
|
||
|
pending: couponlistLoading,
|
||
|
refresh: getCouponList,
|
||
|
} = await useAsyncData(async () => couponListApi(where), {
|
||
|
default: () => ({
|
||
|
list: [],
|
||
|
total: 0,
|
||
|
}),
|
||
|
})
|
||
|
// 分页数据
|
||
|
const pageChangeCoupon = (e: number) => {
|
||
|
where.page = e
|
||
|
getCouponList()
|
||
|
}
|
||
|
//综合排序筛选回调
|
||
|
const handleSubmitSelect = (e: ProductListQuery) => {
|
||
|
Object.assign(where, e)
|
||
|
refresh()
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<template>
|
||
|
<div class="merchant_home">
|
||
|
<div class="w-100% h-40px bg-#333333 mb-20px">
|
||
|
<div class="w-1200px h-40px m-auto acea-row">
|
||
|
<div
|
||
|
v-for="(item, index) in menuList"
|
||
|
:key="index"
|
||
|
class="text-#fff lh-39px w-100px text-center cursors text-14px"
|
||
|
:class="{ 'bg-#E93323': current === index }"
|
||
|
@click="handleMenu(index)"
|
||
|
>
|
||
|
{{ item }}
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="wrapper_1200">
|
||
|
<div v-show="current === 0" class="mb-20px">
|
||
|
<!--轮播-->
|
||
|
<div
|
||
|
v-if="merchantInfo && merchantInfo.bannerList && merchantInfo.bannerList.length"
|
||
|
class="w-1200px h-400px mt-20px"
|
||
|
>
|
||
|
<el-carousel :interval="5000" height="400px" arrow="always">
|
||
|
<el-carousel-item v-for="item in merchantInfo.bannerList" :key="item" class="w-1200px h-400px el-image">
|
||
|
<a v-if="item.linkUrl" :href="item.linkUrl" target="_blank">
|
||
|
<el-image :src="item.imageUrl" class="w-1200px h-400px el-image b-rd-12px" fit="fill" />
|
||
|
</a>
|
||
|
<el-image v-else :src="item.imageUrl" class="w-1200px h-400px el-image b-rd-12px" fit="fill" />
|
||
|
</el-carousel-item>
|
||
|
</el-carousel>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="acea-row">
|
||
|
<!--分类-->
|
||
|
<div class="classify mr-20px">
|
||
|
<div class="mb-20px">
|
||
|
<MerchantNews
|
||
|
:merchantInfo="merchantInfo"
|
||
|
:merId="merId"
|
||
|
@handleSubmitSuccess="handleSubmitSuccess"
|
||
|
></MerchantNews>
|
||
|
</div>
|
||
|
<div class="b-rd-12px overflow-hidden px-30px py-30px bg-#fff">
|
||
|
<el-collapse v-model="opened">
|
||
|
<el-collapse-item
|
||
|
v-for="item in categoryList"
|
||
|
:key="item.id"
|
||
|
:title="item.name"
|
||
|
:name="item.id"
|
||
|
class="mb-40px text-16px lh-16px"
|
||
|
>
|
||
|
<div
|
||
|
@click="handleClassify(items.id)"
|
||
|
v-for="items in item.childList"
|
||
|
:key="items.id"
|
||
|
class="mt-24px text-14px lh-14px cursors font-normal"
|
||
|
:class="searchForm.cid === items.id ? 'font-color' : 'text-#666666'"
|
||
|
>
|
||
|
{{ items.name }}
|
||
|
</div>
|
||
|
</el-collapse-item>
|
||
|
</el-collapse>
|
||
|
</div>
|
||
|
</div>
|
||
|
<!--商品-->
|
||
|
<div class="product" :style="{ minHeight: ScrollHeight + 'px' }">
|
||
|
<!--推荐商品-->
|
||
|
<div v-show="current === 0">
|
||
|
<recommending :merId="merId"></recommending>
|
||
|
</div>
|
||
|
<div v-show="current < 2" class="w-970px b-rd-16px bg-#FFFFFF px-15px py-20px">
|
||
|
<div class="sort flex flex-justify-between bg-#FFFFFF">
|
||
|
<sort-seach :where="searchForm" @handleSubmitSelect="handleSubmitSelect"></sort-seach>
|
||
|
<div class="seachInput">
|
||
|
<el-input
|
||
|
v-model="searchForm.keyword"
|
||
|
style="width: 220px"
|
||
|
placeholder="搜索商品名称"
|
||
|
@keyup.enter="refresh"
|
||
|
>
|
||
|
<template #prefix>
|
||
|
<el-icon class="el-input__icon"><search /></el-icon>
|
||
|
</template>
|
||
|
</el-input>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div v-loading="listLoading">
|
||
|
<div v-if="tableData.total>0">
|
||
|
<div class="grid-column-4 gap-15px proList">
|
||
|
<div v-for="item in tableData.list" :key="item.id" class="cursors">
|
||
|
<product :item="item" :sizeData="sizeData"></product>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="acea-row row-middle mt-20px">
|
||
|
<el-pagination
|
||
|
background
|
||
|
layout="prev, pager, next"
|
||
|
:total="tableData.total"
|
||
|
class="page-item"
|
||
|
:page-size="searchForm.limit"
|
||
|
:current-page="searchForm.page"
|
||
|
@update:current-page="pageChange"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div v-else class="w-100%" :style="{ height: ScrollHeight - 100 + 'px' }">
|
||
|
<empty-page title="暂无商品哟~">
|
||
|
<template v-slot:emptyImage>
|
||
|
<img src="@/assets/images/wushangpin.png" />
|
||
|
</template>
|
||
|
</empty-page>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
</div>
|
||
|
|
||
|
<!--优惠券-->
|
||
|
<div
|
||
|
v-show="current === 2"
|
||
|
class="w-970px b-rd-16px bg-#FFFFFF px-15px py-20px coupon h-100%"
|
||
|
v-loading="couponlistLoading"
|
||
|
>
|
||
|
<div class="" v-if="couponLists.list.length">
|
||
|
<coupon-list :list="couponLists.list" receivedText="去使用"></coupon-list>
|
||
|
<div class="acea-row row-middle mt-20px">
|
||
|
<el-pagination
|
||
|
background
|
||
|
layout="prev, pager, next"
|
||
|
:page-size="where.limit"
|
||
|
:current-page="where.page"
|
||
|
:total="couponLists.total"
|
||
|
@update:current-page="pageChangeCoupon"
|
||
|
class="page-item"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div v-else class="w-100% h-100%">
|
||
|
<empty-page title="暂无优惠券哟~">
|
||
|
<template v-slot:emptyImage>
|
||
|
<img src="@/assets/images/wuyouhui.png" />
|
||
|
</template>
|
||
|
</empty-page>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<style>
|
||
|
html {
|
||
|
background: #f5f5f5;
|
||
|
}
|
||
|
:deep(.merchantNews) {
|
||
|
:deep(.el-dialog__header) {
|
||
|
padding: 30px 0 !important;
|
||
|
}
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<style scoped lang="scss">
|
||
|
:deep(.productTags){
|
||
|
margin-right: 5px !important;
|
||
|
}
|
||
|
:deep(.el-dialog__header) {
|
||
|
padding: 30px 0 !important;
|
||
|
}
|
||
|
:deep(.sortSeach) {
|
||
|
height: auto !important;
|
||
|
}
|
||
|
.coupon {
|
||
|
:deep(.coupon-item) {
|
||
|
margin-right: 10px;
|
||
|
&:nth-child(3n) {
|
||
|
margin-right: 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
.proList {
|
||
|
:deep(.item) {
|
||
|
margin-right: 15px;
|
||
|
&:nth-child(4n) {
|
||
|
margin-right: 0 !important;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
:deep(.el-collapse),
|
||
|
:deep(.el-collapse-item__wrap) {
|
||
|
border: none !important;
|
||
|
}
|
||
|
:deep(.el-collapse-item__header) {
|
||
|
--el-collapse-header-height: auto !important;
|
||
|
border: none !important;
|
||
|
--el-collapse-header-font-size: 16px;
|
||
|
}
|
||
|
:deep(.el-collapse-item__content) {
|
||
|
padding-bottom: 0 !important;
|
||
|
}
|
||
|
.seachInput {
|
||
|
:deep(.el-input__wrapper) {
|
||
|
border: none !important;
|
||
|
box-shadow: none !important;
|
||
|
}
|
||
|
:deep(.el-input) {
|
||
|
--el-fill-color-blank: #f7f7f7 !important;
|
||
|
--el-border-radius-base: 20px;
|
||
|
}
|
||
|
}
|
||
|
:deep(.content) {
|
||
|
border-left: 1px solid #eeeeee;
|
||
|
border-right: 1px solid #eeeeee;
|
||
|
border-bottom: 1px solid #eeeeee;
|
||
|
border-radius: 0 0 16px 16px;
|
||
|
}
|
||
|
</style>
|