123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- <template>
- <view class="cm-search-container">
- <!-- 搜索框 -->
- <SearchHeader
- :menuList="menuItemList"
- :currentMenu="currentMenu"
- v-model="keyword"
- @clear="onClear"
- @search="onSearch"
- @input="onInput"
- @menuClick="onMenuItemClick"
- />
- <!-- 搜索历史记录 -->
- <view class="display-wrapper" v-show="showDisplay">
- <!-- 搜索历史 -->
- <view class="history" v-if="showHistory">
- <text class="iconfont icon-shanchu" @click="onClearHistory"></text>
- <view class="label">搜索历史</view>
- <view class="content">
- <template v-for="(item, index) in historyList">
- <view class="word" v-text="item.searchWord" :key="index"></view>
- </template>
- </view>
- </view>
- <!-- 热门搜索 -->
- <view class="hot" v-if="showHotPorduct || showHotInstrument">
- <view class="label">热门搜索</view>
- <view class="content">
- <!-- 产品 -->
- <template v-if="showHotPorduct">
- <view class="type-name">产品</view>
- <view class="type-content">
- <template v-for="(item, index) in hotProducts">
- <view class="word" :class="{ light: item.isHot === '1' }" :key="index">
- <text v-text="item.name"></text>
- <text class="iconfont icon-resou"></text>
- </view>
- </template>
- </view>
- </template>
- <!-- 仪器 -->
- <template v-if="showHotInstrument">
- <view class="type-name">仪器</view>
- <view class="type-content">
- <template v-for="(item, index) in hotInstruments">
- <view class="word" :class="{ light: item.isHot === '1' }" :key="index">
- <text v-text="item.name"></text>
- <text class="iconfont icon-resou"></text>
- </view>
- </template>
- </view>
- </template>
- </view>
- </view>
- </view>
- <!-- 搜索列表 -->
- <view class="list-wrapper" v-show="showProduct">
- <ProductFullList :list="productList" @change="onProductFilterItemChange" />
- </view>
- <!-- 列表为空 -->
- <view class="empty-box" v-if="!isLoading && isEmpty">
- <image
- class="empty-image"
- src="https://img.caimei365.com/group1/M00/03/8D/Cmis215XHXWAHCoqAAELHadZ9Xg365.png"
- ></image>
- <text class="empty-text">抱歉,没有相关商品!</text>
- </view>
- <!-- 加载 loading -->
- <template v-if="!isEmpty">
- <tui-loadmore :index="2" :visible="isLoading"></tui-loadmore>
- <tui-nomore
- :text="hasMore ? '上拉加载更多' : '没有更多了'"
- :visible="!isLoading"
- backgroundColor="#f5f5f5"
- ></tui-nomore>
- </template>
- <!-- 商品筛选框 -->
- <tui-drawer mode="right" :visible="showDrawer" @close="showDrawer = false">
- <product-filter :brandList="brandList" @confirm="onDrawerConfirm" @reset="onDrawerConfirm"></product-filter>
- </tui-drawer>
- </view>
- </template>
- <script>
- import SearchHeader from './components/search-header.vue'
- import ProductFilter from './components/product-filter.vue'
- import ProductFullList from './components/product-full-list.vue'
- import { debounce } from '@/common/config/common'
- import { mapGetters } from 'vuex'
- const myDebounce = fn => debounce(fn, 200, false)
- export default {
- components: {
- SearchHeader,
- ProductFilter,
- ProductFullList
- },
- data() {
- const menuItemList = [{ id: 1, name: '产品' }, { id: 2, name: '供应商' }]
- return {
- isLoading: false,
- // 用户信息
- userInfo: {
- userId: 0,
- userIdentity: 1,
- vipFlag: 0,
- firstClubType: 0
- },
- menuItemList: menuItemList,
- currentMenu: 0,
- keyword: '',
- // 产品相关
- showProduct: false,
- showDrawer: false,
- currentSortItem: {},
- brandList: [],
- productList: [],
- total: 0,
- hasMore: true,
- listQuery: {
- identity: 1,
- keyword: '',
- pageNum: 1,
- pageSize: 10,
- sortField: '',
- sortType: 1,
- newType: 1,
- actiType: 1,
- brandIds: '', // 品牌Id
- newFlag: 0, // 查询新品标记,默认0,新品1
- promotionFlag: 0 // 查询促销标记,默认0,促销1
- },
- // 历史记录相关
- showDisplay: true,
- historyList: [], // 热搜词
- hotProducts: [], // 热搜产品
- hotInstruments: [] // 热搜仪器
- }
- },
- computed: {
- showHistory() {
- return this.historyList.length > 0
- },
- showHotPorduct() {
- return this.hotProducts.length > 0
- },
- showHotInstrument() {
- return this.hotInstruments.length > 0
- },
- isEmpty() {
- return this.productList.length === 0
- }
- },
- onLoad() {
- this.initStorage()
- },
- onReachBottom() {},
- methods: {
- initDisplay() {
- this.fetchhistoryList()
- this.fetchHotItemList()
- },
- //查询搜索历史记录
- async fetchhistoryList() {
- try {
- const res = await this.ProductService.GetProductSearchHistory({ userId: this.userInfo.userId })
- this.historyList = res.data
- } catch (e) {
- this.$util.msg(e.msg, 2000)
- }
- },
- // 清空搜索历史
- onClearHistory() {
- //清空历史记录
- this.$util.modal('提示', '确定删除历史记录?', '确定', '取消', true, async () => {
- try {
- await this.ProductService.GetDeleteProductSearchHistory({ userId: this.userInfo.userId })
- this.$util.msg('删除成功', 2000, true, 'success')
- this.historyList = []
- } catch (e) {
- this.$util.msg(e.msg, 2000)
- }
- })
- },
- // 获取热搜
- async fetchHotItemList() {
- try {
- const res = await this.CommonService.GetHomeHotSearchTerms({})
- this.hotInstruments = res.data.instrumentHotSearch
- this.hotProducts = res.data.productHotSearch
- } catch (e) {
- this.$util.msg(e.msg, 2000)
- }
- },
- // 获取用户信息
- async initStorage(option) {
- const userInfo = await this.$api.getStorage()
- if (!userInfo) return
- this.userInfo = { ...this.userInfo, ...userInfo }
- this.initDisplay()
- },
- // 初始化产品列表
- initProductList() {
- this.productList = []
- this.listQuery.pageNum = 1
- this.listQuery.keyword = this.keyword
- this.listQuery.identity = this.userInfo.userIdentity
- this.listQuery.sortType = 1
- this.listQuery.sortField = ''
- this.fetchProductList()
- this.fetchBrandList()
- },
- // 获取产品列表
- fetchProductList: myDebounce(async function() {
- try {
- this.isLoading = true
- const { data } = await this.ProductService.GetProductSearchList(this.productListQuery)
- if (!data) return
- const result = JSON.parse(data)
- this.productTotal = result.total
- this.fetchProductPrice(result.items)
- this.productListQuery.pageNum++
- } catch (e) {
- this.isLoading = false
- }
- }),
- // 产品筛选
- productFilter() {
- this.isLoading = true
- this.productList = []
- this.productListQuery.pageNum = 1
- const sortType = { asc: 0, desc: 1 }
- const currentSortItem = this.currentSortItem
- switch (currentSortItem.id) {
- case 1:
- this.productListQuery.sortField = ''
- this.productListQuery.sortType = 1
- break
- case 2:
- this.productListQuery.sortField = 'sales'
- this.productListQuery.sortType = sortType[currentSortItem.sortType]
- break
- case 3:
- this.productListQuery.sortField = 'favorite'
- this.productListQuery.sortType = sortType[currentSortItem.sortType]
- break
- case 4:
- this.productListQuery.sortField = 'price'
- this.productListQuery.sortType = sortType[currentSortItem.sortType]
- break
- }
- this.fetchProductList()
- },
- // 产品筛选切换
- onProductFilterItemChange(item) {
- if (item.id === 5) {
- this.showDrawer = true
- return
- }
- this.currentSortItem = item
- this.productFilter()
- },
- // 获取品牌列表
- async fetchBrandList() {
- try {
- this.brandListQuery.keyword = this.keyword
- const { data } = await this.ProductService.getCommoditySearchQUeryBrand(this.brandListQuery)
- if (!data) return
- this.brandList = data.map(brand => {
- brand.checked = false
- return brand
- })
- } catch (e) {
- console.log(e)
- }
- },
- // drawer reset or confirm
- onDrawerConfirm(e) {
- this.showDrawer = false
- this.productListQuery.brandIds = e.brandList.map(brand => brand.id).join(',')
- this.productListQuery.promotionFlag = e.promotionFlag
- this.productListQuery.newFlag = e.newFlag
- this.productFilter()
- },
- // 搜索
- onSearch() {},
- // 清空搜索框
- onClear() {
- this.keyword = ''
- },
- // 用户输入
- onInput() {
- this.fetchLibraryWordList()
- },
- // menu-item 点击事件
- onMenuItemClick(index) {
- this.currentMenu = index
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .cm-search-container {
- min-height: 100vh;
- background: #f5f5f5;
- }
- .display-wrapper {
- padding: 32rpx 24rpx;
- background: #fff;
- // max-height: calc(100vh - 86rpx);
- box-sizing: border-box;
- .label {
- font-size: 30rpx;
- font-weight: bold;
- }
- .history {
- position: relative;
- .icon-shanchu {
- position: absolute;
- right: 24rpx;
- top: 0;
- font-size: 36rpx;
- color: #333333;
- }
- .content {
- display: flex;
- flex-wrap: wrap;
- }
- }
- .hot {
- margin-top: 64rpx;
- .type-name {
- font-size: 26rpx;
- color: #333;
- margin-top: 32rpx;
- }
- .type-content {
- display: flex;
- flex-wrap: wrap;
- }
- }
- .history,
- .hot {
- .word {
- display: flex;
- max-width: 200rpx;
- font-size: 24rpx;
- color: #8a8a8a;
- background: #f3f3f3;
- line-height: 48rpx;
- padding: 0 20rpx;
- border-radius: 24rpx;
- margin-right: 24rpx;
- margin-top: 24rpx;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- .icon-resou {
- display: none;
- font-size: 30rpx;
- color: #F3B574;
- margin-left: 12rpx;
- }
- &.light {
- background: #fef6f3;
- color: #F3B574;
- .icon-resou {
- display: block;
- }
- }
- }
- }
- }
- </style>
|