|
@@ -1,6 +1,6 @@
|
|
|
<template>
|
|
|
<div class="j-container search-result-bidding top-radius">
|
|
|
- <div
|
|
|
+ <!-- <div
|
|
|
class="bidding-advanced-switch"
|
|
|
v-if="conf.searchGroupList.length"
|
|
|
:class="{ 'loading-mask': listState.loading }"
|
|
@@ -26,8 +26,8 @@
|
|
|
</div>
|
|
|
</van-tab>
|
|
|
</van-tabs>
|
|
|
- </div>
|
|
|
- <div class="j-header linear-main-bg">
|
|
|
+ </div> -->
|
|
|
+ <div class="j-header linear-main-bg" v-show="tabSwitchShow">
|
|
|
<!-- 筛选器 -->
|
|
|
<BiddingSearchFilters
|
|
|
:bidColPower="pageState.bidColPower"
|
|
@@ -38,13 +38,14 @@
|
|
|
@confirm="onFilterConfirm"
|
|
|
@reset="doSearch"
|
|
|
@open="doOpen"
|
|
|
- :defaultFilterState="defaultFilterState"
|
|
|
+ :defaultFilterState="noChangeDefaultFilterState"
|
|
|
:dropdownMenuMaxHeight="conf.maxHeight"
|
|
|
:infoTypeSourceConf="activeSearchGroupInfo"
|
|
|
+ :topSearch="topSearch"
|
|
|
v-model="filters"
|
|
|
/>
|
|
|
<!-- 精简列表/详细列表/表格 -->
|
|
|
- <div v-if="tabSwitchShow" class="tab-switch bg-white border-line-b">
|
|
|
+ <!-- <div v-if="tabSwitchShow" class="tab-switch bg-white border-line-b">
|
|
|
<van-tabs
|
|
|
class="tab-left"
|
|
|
v-model="pageState.listTabActive"
|
|
@@ -69,47 +70,36 @@
|
|
|
<span class="text">保存筛选条件</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ </div> -->
|
|
|
+ <div class="flex flex-justify-between tab-saved" v-if="isLogin">
|
|
|
+ <div class="tab-saved-left ellipsis">
|
|
|
+ <span class="tab-saved-left-label">已选:</span>
|
|
|
+ <span class="tab-saved-left-value">{{ calcFilterText }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="tab-saved-right">
|
|
|
+ <span v-if="!isFree" class="clear-action" @click="onClearFilter"
|
|
|
+ >清空</span
|
|
|
+ >
|
|
|
+ <span class="save-action" @click="saveFilterToHistory">保存</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div class="intercept-tip-container" v-show="interceptTipText">
|
|
|
<AppIcon name="tishi" /> {{ interceptTipText }}
|
|
|
</div>
|
|
|
- <div class="recommend-card-container">
|
|
|
- <!-- 超前项目推荐 & 定制化分析报告 -->
|
|
|
- <RecommendCard
|
|
|
- :key="recommendInfo.key"
|
|
|
- v-if="recommendInfo.show"
|
|
|
- v-model="recommendInfo.showContent"
|
|
|
- :chart-data="recommendInfo.chart"
|
|
|
- :brief-list="recommendInfo.brief"
|
|
|
- :project-list="recommendInfo.project"
|
|
|
- :keys="pageState.splitKeys"
|
|
|
- @do-leave="saveState"
|
|
|
- />
|
|
|
- </div>
|
|
|
</div>
|
|
|
<div class="j-main list-container" ref="listContainer">
|
|
|
- <van-list
|
|
|
- v-model="listState.loading"
|
|
|
- :finished="listState.finished"
|
|
|
- :offset="listState.offset"
|
|
|
- :finished-text="finishedText"
|
|
|
- v-show="
|
|
|
- pageState.listTabActive === 'list' ||
|
|
|
- pageState.listTabActive === 'detailedList'
|
|
|
- "
|
|
|
- @load="getList"
|
|
|
- class="more-list calc-height-1px"
|
|
|
- ref="vanList"
|
|
|
- >
|
|
|
- <div class="tab-search-info" v-show="tabSearchInfoShow">
|
|
|
- <p class="search-total-count">
|
|
|
- <template v-if="listState.total > 0">
|
|
|
- 搜索到<span class="highlight-text">
|
|
|
- {{ calcListTotalText(listState.total) }} </span
|
|
|
- >条信息
|
|
|
- </template>
|
|
|
- </p>
|
|
|
- <div class="tab-right">
|
|
|
+ <div class="tab-search-info" v-show="tabSearchInfoShow">
|
|
|
+ <div
|
|
|
+ class="flex flex-(items-center justify-between) tab-search-info-top"
|
|
|
+ >
|
|
|
+ <div class="flex">
|
|
|
+ <p class="search-total-count">
|
|
|
+ <template v-if="listState.total > 0">
|
|
|
+ 搜索到<span class="highlight-text">
|
|
|
+ {{ calcListTotalText(listState.total) }} </span
|
|
|
+ >条信息
|
|
|
+ </template>
|
|
|
+ </p>
|
|
|
<div
|
|
|
class="data-export clickable"
|
|
|
v-show="!inInjectBI"
|
|
@@ -117,18 +107,47 @@
|
|
|
@click="dataExport"
|
|
|
>
|
|
|
<AppIcon name="shujudaochu_xiao1" />
|
|
|
- <span class="text">数据导出</span>
|
|
|
+ <span class="text">导出</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="tab-right">
|
|
|
+ <van-popover
|
|
|
+ v-model="showPopover"
|
|
|
+ trigger="click"
|
|
|
+ :actions="cardTypeTabList"
|
|
|
+ :offset="[6, 16]"
|
|
|
+ placement="bottom-end"
|
|
|
+ get-container=".tab-search-info"
|
|
|
+ >
|
|
|
+ <div class="tab-column">
|
|
|
+ <div
|
|
|
+ class="tab-column-item"
|
|
|
+ :class="{ active: pageState.listTabActive === tab.name }"
|
|
|
+ v-for="(tab, index) in cardTypeTabList"
|
|
|
+ :name="tab.name"
|
|
|
+ :key="index"
|
|
|
+ @click.stop="onListTabClick(tab.name)"
|
|
|
+ >
|
|
|
+ {{ tab.title }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #reference>
|
|
|
+ <div class="selected-tab-content">
|
|
|
+ <span>{{ listTabActiveText }}</span>
|
|
|
+ <van-icon name="arrow-down" color="#2ABED1" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </van-popover>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div
|
|
|
- class="tip-toggle-search-mode-container"
|
|
|
v-show="toggleBlurModeTip.show"
|
|
|
+ class="tip-toggle-search-mode-container"
|
|
|
>
|
|
|
<div>
|
|
|
- 如需查看更多相关信息,建议您将搜索模式切换为
|
|
|
+ 如需查看更多相关信息,建议您切换至
|
|
|
<div class="tip-action highlight-text">
|
|
|
- “模糊搜索”
|
|
|
+ "模糊搜索"
|
|
|
<AppIcon
|
|
|
class="search-mode-label-icon"
|
|
|
name="help1"
|
|
@@ -136,10 +155,41 @@
|
|
|
>
|
|
|
</AppIcon>
|
|
|
</div>
|
|
|
- 按照当前条件共匹配到{{ toggleBlurModeTip.count }}条公告。
|
|
|
+ 搜索模式 按照当前条件共匹配到{{ toggleBlurModeTip.count }}条公告。
|
|
|
+ <div class="search-model-switch" @click="doToggleSearchBlurMode">
|
|
|
+ <span class="search-model-switch-text">立即切换查看</span>
|
|
|
+ <AppIcon name="youbian" color="#2ABED1" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <button @click="doToggleSearchBlurMode">立即切换查看</button>
|
|
|
</div>
|
|
|
+ </div>
|
|
|
+ <!-- 超前项目推荐 & 定制化分析报告 P611需求:将报告插到列表第一条数据后面位置 -->
|
|
|
+ <div
|
|
|
+ class="recommend-card-container"
|
|
|
+ :style="{ opacity: cardLoaded ? 'unset' : '0' }"
|
|
|
+ >
|
|
|
+ <RecommendCard
|
|
|
+ ref="recommendCardRef"
|
|
|
+ v-if="recommendInfo.show"
|
|
|
+ :key="recommendInfo.key"
|
|
|
+ v-model="recommendInfo.showContent"
|
|
|
+ :chart-data="recommendInfo.chart"
|
|
|
+ :brief-list="recommendInfo.brief"
|
|
|
+ :project-list="recommendInfo.project"
|
|
|
+ :keys="pageState.splitKeys"
|
|
|
+ @do-leave="saveState"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <van-list
|
|
|
+ v-show="pageState.listTabActive !== 'table'"
|
|
|
+ v-model="listState.loading"
|
|
|
+ :finished="listState.finished"
|
|
|
+ :offset="listState.offset"
|
|
|
+ :finished-text="finishedText"
|
|
|
+ @load="getList"
|
|
|
+ class="more-list calc-height-1px"
|
|
|
+ ref="vanList"
|
|
|
+ >
|
|
|
<div class="list-wrapper" ref="listWrapper">
|
|
|
<van-popup
|
|
|
:style="popupHeight"
|
|
@@ -236,10 +286,11 @@
|
|
|
<div
|
|
|
v-else-if="isLogin"
|
|
|
:key="[item.id, index].join('-')"
|
|
|
- v-show="item.show"
|
|
|
+ :data-key="[item.id, index].join('-')"
|
|
|
class="middle-list-container"
|
|
|
>
|
|
|
<AdSingle
|
|
|
+ v-show="item.show"
|
|
|
:class="item.className"
|
|
|
:ad="getContentAdID"
|
|
|
:showCloseIcon="true"
|
|
@@ -282,7 +333,10 @@
|
|
|
>
|
|
|
</AppEmpty>
|
|
|
</van-list>
|
|
|
- <div class="table-container" v-show="pageState.listTabActive === 'table'">
|
|
|
+ <div
|
|
|
+ class="table-container calc-height-1px"
|
|
|
+ v-show="pageState.listTabActive === 'table'"
|
|
|
+ >
|
|
|
<div class="scroll" v-show="listState.list.length">
|
|
|
<table class="table">
|
|
|
<tr class="table-header">
|
|
@@ -313,7 +367,7 @@
|
|
|
<!-- 项目名称 -->
|
|
|
<td
|
|
|
v-html="
|
|
|
- replaceKeyword(
|
|
|
+ highlightText(
|
|
|
item.projectName ? item.projectName : item.title,
|
|
|
pageState.splitKeys
|
|
|
)
|
|
@@ -365,11 +419,20 @@
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
- <div class="to-look-more" v-show="listState.list.length > 20">
|
|
|
+ <div
|
|
|
+ class="to-look-more"
|
|
|
+ :class="{ 'ios-look-more': $envs.inIOS }"
|
|
|
+ v-show="listState.list.length > 20"
|
|
|
+ >
|
|
|
<van-button plain size="small" type="primary" @click="dataExport"
|
|
|
>查看更多</van-button
|
|
|
>
|
|
|
</div>
|
|
|
+ <!-- 占位解决ios回弹底部遮挡 -->
|
|
|
+ <div
|
|
|
+ v-show="listState.list.length > 20 && $envs.inIOS"
|
|
|
+ class="seat"
|
|
|
+ ></div>
|
|
|
<AppEmpty v-show="listState.list.length === 0 && listState.finished">
|
|
|
<div class="empty-text" v-html="emptyText"></div>
|
|
|
<van-button
|
|
@@ -383,7 +446,7 @@
|
|
|
</AppEmpty>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="j-footer">
|
|
|
+ <div class="sub-position">
|
|
|
<!-- 直接订阅 -->
|
|
|
<div class="sub-this-keywords" v-show="subThisNoticeShow">
|
|
|
<AppIcon
|
|
@@ -391,12 +454,15 @@
|
|
|
name="close_touming"
|
|
|
@click="pageState.toSubThisKeyNoticeBarShow = false"
|
|
|
/>
|
|
|
- <div class="center text">如果您对以上结果满意可【直接订阅】。</div>
|
|
|
- <div class="right action clickable" @click="toSubThisKey">直接订阅</div>
|
|
|
+ <div class="center text">如果您对以上结果满意可直接订阅</div>
|
|
|
+ <div class="right action clickable" @click="toSubThisKey">
|
|
|
+ 去订阅
|
|
|
+ <AppIcon name="youbian" color="#2ABED1" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- 客服-->
|
|
|
- <customer-corner :scroll-status="scrollStatus" bottom-position="12%"/>
|
|
|
+ <customer-corner :scroll-status="scrollStatus" bottom-position="18%" />
|
|
|
<SearchFilterHistoryDialog
|
|
|
v-model="pageState.saveFilterDialog"
|
|
|
:beforeClose="beforeFilterHistoryDialogClose"
|
|
@@ -417,7 +483,7 @@
|
|
|
<script>
|
|
|
import qs from 'qs'
|
|
|
import { mapState, mapGetters, mapActions } from 'vuex'
|
|
|
-import { Cell, Tab, Tabs, List, Button, Tag, Popup } from 'vant'
|
|
|
+import { Cell, Tab, Tabs, List, Button, Tag, Popup, Popover, Icon } from 'vant'
|
|
|
import bidStatusNode from '@/components/bid-update/BidUpdate'
|
|
|
import AdSingle from '@/components/ad/Ad'
|
|
|
import BiddingSearchFilters from '@/components/search/bidding/filters'
|
|
@@ -450,7 +516,8 @@ import {
|
|
|
InfoTypeTransform,
|
|
|
FilterHistoryViewModel2AjaxModel,
|
|
|
FilterHistoryAjaxModel2ViewModel,
|
|
|
- filterHistoryNotEmptyFormat
|
|
|
+ filterHistoryNotEmptyFormat,
|
|
|
+ deepCompareInfoType
|
|
|
} from '@/utils'
|
|
|
import {
|
|
|
getBiddingSearchList,
|
|
@@ -479,6 +546,8 @@ export default {
|
|
|
[List.name]: List,
|
|
|
[Tag.name]: Tag,
|
|
|
[Popup.name]: Popup,
|
|
|
+ [Popover.name]: Popover,
|
|
|
+ [Icon.name]: Icon,
|
|
|
BiddingSearchFilters,
|
|
|
SearchFilterHistoryDialog,
|
|
|
OneKeySubscribeDialog,
|
|
@@ -554,12 +623,12 @@ export default {
|
|
|
],
|
|
|
tabList: [
|
|
|
{
|
|
|
- title: '精简列表',
|
|
|
+ title: '精简',
|
|
|
cardType: 'simplify',
|
|
|
name: 'list'
|
|
|
},
|
|
|
{
|
|
|
- title: '详细列表',
|
|
|
+ title: '详细',
|
|
|
name: 'detailedList',
|
|
|
cardType: 'detailed',
|
|
|
needPower: true
|
|
@@ -592,6 +661,30 @@ export default {
|
|
|
buyerList: [],
|
|
|
winnerList: [],
|
|
|
agencyList: []
|
|
|
+ },
|
|
|
+ noChangeDefaultFilterState: {
|
|
|
+ moreKeywordsMode: {},
|
|
|
+ searchMode: ['0'],
|
|
|
+ scope: ['title', 'content'],
|
|
|
+ industry: {},
|
|
|
+ area: {},
|
|
|
+ priceCheckbox: [''],
|
|
|
+ price: {
|
|
|
+ start: '',
|
|
|
+ end: ''
|
|
|
+ },
|
|
|
+ dateTime: {
|
|
|
+ exact: 'thisyear'
|
|
|
+ },
|
|
|
+ infoType: [],
|
|
|
+ buyerClass: [],
|
|
|
+ fileExists: ['0'],
|
|
|
+ winnerConcat: [''],
|
|
|
+ buyerConcat: [''],
|
|
|
+ notKey: [],
|
|
|
+ buyerList: [],
|
|
|
+ winnerList: [],
|
|
|
+ agencyList: []
|
|
|
}
|
|
|
},
|
|
|
// 发送请求整理的数据
|
|
@@ -686,7 +779,11 @@ export default {
|
|
|
show: false,
|
|
|
count: ''
|
|
|
},
|
|
|
- scrollStatus: true
|
|
|
+ scrollStatus: true,
|
|
|
+ showPopover: false,
|
|
|
+ popoverActions: [{ text: '精简' }, { text: '详细' }, { text: '表格' }],
|
|
|
+ lastScroll: 0,
|
|
|
+ cardLoaded: false
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
@@ -878,6 +975,31 @@ export default {
|
|
|
count: this.toggleSearchBlurData.count
|
|
|
}
|
|
|
return result
|
|
|
+ },
|
|
|
+ listTabActiveText() {
|
|
|
+ const { listTabActive } = this.pageState
|
|
|
+ if (listTabActive === 'list') {
|
|
|
+ return '精简'
|
|
|
+ } else if (listTabActive === 'detailedList') {
|
|
|
+ return '详细'
|
|
|
+ } else if (listTabActive === 'table') {
|
|
|
+ return '表格'
|
|
|
+ } else {
|
|
|
+ return '精简'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ calcFilterText() {
|
|
|
+ const params = this.getSaveFilterToHistoryParams()
|
|
|
+ const { label } = this.formatFilterItems(params, 'text')
|
|
|
+ return label
|
|
|
+ },
|
|
|
+ // 默认筛选条件(不可更改赋值)用于清空操作,原defaultFilterState会被缓存赋值(版本需求)
|
|
|
+ noChangeDefaultFilterState() {
|
|
|
+ const { noChangeDefaultFilterState } = this.conf
|
|
|
+ if (!this.isFree) {
|
|
|
+ noChangeDefaultFilterState.dateTime.exact = 'fiveyear'
|
|
|
+ }
|
|
|
+ return noChangeDefaultFilterState
|
|
|
}
|
|
|
},
|
|
|
provide() {
|
|
@@ -904,8 +1026,13 @@ export default {
|
|
|
'推荐使用电脑浏览器访问剑鱼标讯网站\njianyu360.cn查看数据表格,体验更佳。'
|
|
|
})
|
|
|
}
|
|
|
- } else {
|
|
|
- this.$toast.clear()
|
|
|
+ }
|
|
|
+ this.moveRecommendCard(n)
|
|
|
+ },
|
|
|
+ searchList(list) {
|
|
|
+ if (list && list.length && this.pageState.listTabActive === 'list') {
|
|
|
+ // 市场分析报告插到第一条数据后面位置
|
|
|
+ this.moveRecommendCard('list')
|
|
|
}
|
|
|
}
|
|
|
},
|
|
@@ -960,11 +1087,13 @@ export default {
|
|
|
this.calcDropdownMenuMaxHeight()
|
|
|
this.$nextTick(() => {
|
|
|
const scrollWrap = this.$refs.listContainer
|
|
|
- scrollWrap.addEventListener('scroll', throttle(this.scrollWrapFn, 500))
|
|
|
+ scrollWrap.addEventListener('scroll', throttle(this.scrollWrapFn, 300))
|
|
|
})
|
|
|
+ this.getWhiteListInfo()
|
|
|
},
|
|
|
methods: {
|
|
|
...mapActions('search', ['setHistory']),
|
|
|
+ ...mapActions('user', ['getWhiteListInfo']),
|
|
|
formatMoney,
|
|
|
dateFormatter,
|
|
|
replaceKeyword,
|
|
@@ -1057,11 +1186,19 @@ export default {
|
|
|
const filterDOM = searchFilters?.$el
|
|
|
const domTop =
|
|
|
filterDOM.getBoundingClientRect().top + filterDOM.clientHeight
|
|
|
+ console.log(
|
|
|
+ domTop + h5Offset,
|
|
|
+ filterDOM.getBoundingClientRect().top,
|
|
|
+ filterDOM.clientHeight
|
|
|
+ )
|
|
|
this.conf.maxHeight = `calc(100vh - ${domTop + h5Offset}px)`
|
|
|
}
|
|
|
},
|
|
|
initDefaultFilterState() {
|
|
|
- Object.assign(this.filters, JSON.parse(JSON.stringify(this.defaultFilterState)))
|
|
|
+ Object.assign(
|
|
|
+ this.filters,
|
|
|
+ JSON.parse(JSON.stringify(this.defaultFilterState))
|
|
|
+ )
|
|
|
this.$nextTick(() => {
|
|
|
this.filters.keywords = this.topSearch.input
|
|
|
})
|
|
@@ -1200,6 +1337,12 @@ export default {
|
|
|
}
|
|
|
if (filters.price) {
|
|
|
const key = 'price'
|
|
|
+ if (!filters[key].start) {
|
|
|
+ filters[key].start = ''
|
|
|
+ }
|
|
|
+ if (!filters[key].end) {
|
|
|
+ filters[key].end = ''
|
|
|
+ }
|
|
|
if (filters[key].start || filters[key].end) {
|
|
|
this.filters.priceCheckbox = ['custom']
|
|
|
}
|
|
@@ -2052,16 +2195,31 @@ export default {
|
|
|
// --> 新用户-未选择区域-订阅页面
|
|
|
// --> 选择区域-关键词列表
|
|
|
// const { inWX } = this.$envs
|
|
|
+ if (!this.topSearch.input) {
|
|
|
+ return this.$toast('请先输入关键词')
|
|
|
+ }
|
|
|
const superUser = this.isSuper || this.isMember
|
|
|
if (superUser) {
|
|
|
+ const { moreKeywordsMode } = this.filters
|
|
|
+ const { tags, wordsMode } = moreKeywordsMode
|
|
|
+ // 订阅的关键词 = 主关键词 + 多关键词
|
|
|
+ let formatKeyword = ''
|
|
|
+ if (tags && tags.length) {
|
|
|
+ formatKeyword = this.filters.keywords + ' ' + tags.join(' ')
|
|
|
+ } else {
|
|
|
+ formatKeyword = this.filters.keywords
|
|
|
+ }
|
|
|
const params = {
|
|
|
pageType: 'keyWords',
|
|
|
actionType: 'directSubKWS',
|
|
|
- kws_name: this.filters.keywords,
|
|
|
- vSwitch: this.vSwitch
|
|
|
+ kws_name: formatKeyword,
|
|
|
+ vSwitch: this.vSwitch,
|
|
|
+ match_way: wordsMode
|
|
|
}
|
|
|
+ const loading = this.$toast.loading({ duration: 0 })
|
|
|
try {
|
|
|
const { flag } = await setUserSubInfo(params)
|
|
|
+ loading.clear()
|
|
|
if (flag === 'y') {
|
|
|
this.saveState()
|
|
|
openAppOrWxPage(LINKS.关键词列表)
|
|
@@ -2086,10 +2244,26 @@ export default {
|
|
|
if (keyLength >= 10) {
|
|
|
return this.$toast('您已经超过订阅关键字上限')
|
|
|
}
|
|
|
+ // 设置完区域后跳至关键词订阅页面,区域设置成功后关键词要同步设置(要携带参数过去)
|
|
|
+ const { moreKeywordsMode } = this.filters
|
|
|
+ const { tags, wordsMode } = moreKeywordsMode
|
|
|
+ // 订阅的关键词 = 主关键词 + 多关键词
|
|
|
+ let formatKeyword = ''
|
|
|
+ if (tags && tags.length) {
|
|
|
+ formatKeyword = this.filters.keywords + ' ' + tags.join(' ')
|
|
|
+ } else {
|
|
|
+ formatKeyword = this.filters.keywords
|
|
|
+ }
|
|
|
loading.clear()
|
|
|
if (!isSelectArea) {
|
|
|
if (isUpgrade) {
|
|
|
- this.toSetArea()
|
|
|
+ this.toSetArea({
|
|
|
+ query: {
|
|
|
+ url: LINKS.关键词列表[this.$env.platform],
|
|
|
+ keywords: formatKeyword,
|
|
|
+ wordsMode
|
|
|
+ }
|
|
|
+ })
|
|
|
} else {
|
|
|
// 提示去升级
|
|
|
await this.$dialog.confirm({
|
|
@@ -2098,7 +2272,13 @@ export default {
|
|
|
className: 'j-confirm-dialog',
|
|
|
confirmButtonText: '立即升级'
|
|
|
})
|
|
|
- this.toSetArea()
|
|
|
+ this.toSetArea({
|
|
|
+ query: {
|
|
|
+ url: LINKS.关键词列表[this.$env.platform],
|
|
|
+ keywords: formatKeyword,
|
|
|
+ wordsMode
|
|
|
+ }
|
|
|
+ })
|
|
|
return
|
|
|
}
|
|
|
} else {
|
|
@@ -2110,9 +2290,19 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
async toSetFreeKey() {
|
|
|
+ const { moreKeywordsMode } = this.filters
|
|
|
+ const { tags, wordsMode } = moreKeywordsMode
|
|
|
+ // 订阅的关键词 = 主关键词 + 多关键词
|
|
|
+ let formatKeyword = ''
|
|
|
+ if (tags && tags.length) {
|
|
|
+ formatKeyword = this.filters.keywords + ' ' + tags.join(' ')
|
|
|
+ } else {
|
|
|
+ formatKeyword = this.filters.keywords
|
|
|
+ }
|
|
|
const params = {
|
|
|
- keys: this.filters.keywords,
|
|
|
- reqType: 'subscribe'
|
|
|
+ keys: formatKeyword,
|
|
|
+ reqType: 'subscribe',
|
|
|
+ match_way: wordsMode
|
|
|
}
|
|
|
const { area } = this.pageState.freeSubInfo
|
|
|
try {
|
|
@@ -2133,9 +2323,9 @@ export default {
|
|
|
this.saveState()
|
|
|
this.$leaveInfo.toLeaveInfoPage({ source })
|
|
|
},
|
|
|
- toSetArea() {
|
|
|
+ toSetArea(query = {}) {
|
|
|
this.saveState()
|
|
|
- openAppOrWxPage(LINKS.省份订阅包设置省份)
|
|
|
+ openAppOrWxPage(LINKS.省份订阅包设置省份, query)
|
|
|
},
|
|
|
// 去用户反馈页面
|
|
|
feedback() {
|
|
@@ -2193,10 +2383,17 @@ export default {
|
|
|
// 保存筛选条件
|
|
|
async saveFilterToHistory() {
|
|
|
const params = this.getSaveFilterToHistoryParams()
|
|
|
-
|
|
|
- // if (!params.searchvalue) {
|
|
|
- // return this.$toast('请先输入关键词')
|
|
|
- // }
|
|
|
+ console.log(params, 'params')
|
|
|
+ // 如未输入关键词(包含顶部搜索框及更多筛选条件设置的多关键词、采购单位、中标单位和招标代理机构)则toast提示“请输入关键词”
|
|
|
+ if (
|
|
|
+ !params.searchvalue &&
|
|
|
+ !params.additionalWords &&
|
|
|
+ !params.buyer &&
|
|
|
+ !params.winner &&
|
|
|
+ !params.agency
|
|
|
+ ) {
|
|
|
+ return this.$toast('请先输入关键词')
|
|
|
+ }
|
|
|
const { savedFilterListMaxCount: maxCount } = this.conf
|
|
|
if (this.savedFilterListCount >= maxCount) {
|
|
|
return this.$toast(`对不起,最多可保存${maxCount}个筛选条件。`)
|
|
@@ -2261,7 +2458,7 @@ export default {
|
|
|
done()
|
|
|
}
|
|
|
},
|
|
|
- formatFilterItems(item) {
|
|
|
+ formatFilterItems(item, type = 'dialog') {
|
|
|
item.scope = item.selectType
|
|
|
item.infotype = item.subtype
|
|
|
const formatted = FilterHistoryAjaxModel2ViewModel.formatAll(item)
|
|
@@ -2282,12 +2479,43 @@ export default {
|
|
|
)
|
|
|
}
|
|
|
const formattedList = filterHistoryNotEmptyFormat(formattedItem)
|
|
|
- const { keywords, additionalWords, wordsModeText } = formatted
|
|
|
+ const { keywords, additionalWords, wordsModeText, searchModeText } =
|
|
|
+ formatted
|
|
|
const keywordsText = keywords.join(' ')
|
|
|
const allKeywordsArr = [keywordsText]
|
|
|
.concat(additionalWords)
|
|
|
.filter((k) => !!k)
|
|
|
const additionalWordsText = additionalWords.join(' ')
|
|
|
+ const { searchGroup } = this.$route.query
|
|
|
+ /**
|
|
|
+ * 1.从招标采购搜索首页,点击了“超前项目”、“招标预告”、“招标公告”、“招标结果”,则已选结果此处展示点击的类型
|
|
|
+ * 2.输入框有关键词 已选结果才展示搜索范围和搜索模式
|
|
|
+ * */
|
|
|
+ let labelList = formattedList
|
|
|
+ .filter((v) => {
|
|
|
+ if (v.label.includes('信息类型')) {
|
|
|
+ const isChecked = deepCompareInfoType(v.text)
|
|
|
+ v.text = type === 'text' && isChecked ? '' : v.text
|
|
|
+ }
|
|
|
+ if (this.topSearch.input) {
|
|
|
+ return v && v.text
|
|
|
+ } else {
|
|
|
+ return !v.label.includes('搜索范围') && v.text
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .map((item) => item.text)
|
|
|
+ if (searchModeText && this.topSearch.input) {
|
|
|
+ labelList = [searchModeText].concat(labelList)
|
|
|
+ }
|
|
|
+ // console.log(formattedList, 'formattedList')
|
|
|
+ const isHaveInfoType = formattedList.some((v) =>
|
|
|
+ v.label.includes('信息类型')
|
|
|
+ )
|
|
|
+ if (searchGroup > 0 && !isHaveInfoType) {
|
|
|
+ labelList = labelList.concat(this.activeSearchGroupInfo.title)
|
|
|
+ }
|
|
|
+ let label = ''
|
|
|
+ label += labelList.join(',')
|
|
|
return {
|
|
|
...formattedItem,
|
|
|
keywordsText: keywords.join(' '),
|
|
@@ -2295,7 +2523,8 @@ export default {
|
|
|
allKeywordsText: allKeywordsArr.join(','), // 此处用逗号分割
|
|
|
allKeywordsArr,
|
|
|
wordsModeText: additionalWordsText ? wordsModeText : '',
|
|
|
- formattedList
|
|
|
+ formattedList,
|
|
|
+ label
|
|
|
}
|
|
|
},
|
|
|
// 检查一键订阅是否打开(仅免费用户检查)
|
|
@@ -2536,13 +2765,28 @@ export default {
|
|
|
scrollWrapFn(e) {
|
|
|
const scrollDOM = e.target
|
|
|
const scrollTop = scrollDOM.scrollTop
|
|
|
- this.recommendInfo.showContent = false
|
|
|
+ const offsetHeight =
|
|
|
+ document.querySelector('.j-header.linear-main-bg').offsetHeight || 90
|
|
|
+ if (scrollTop < offsetHeight) {
|
|
|
+ window.clearTimeout(this._timer)
|
|
|
+ this._timer = setTimeout(() => {
|
|
|
+ this.setScrollWrapState(e)
|
|
|
+ }, 400)
|
|
|
+ } else {
|
|
|
+ this.setScrollWrapState(e)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setScrollWrapState(e) {
|
|
|
+ const scrollDOM = e.target
|
|
|
+ const scrollTop = scrollDOM.scrollTop
|
|
|
+ // this.recommendInfo.showContent = false
|
|
|
|
|
|
- if (scrollTop >= this.conf.tabSwitchShowOffset) {
|
|
|
+ if (scrollTop > this.lastScroll) {
|
|
|
this.pageState.tabSwitchShow = false
|
|
|
} else {
|
|
|
this.pageState.tabSwitchShow = true
|
|
|
}
|
|
|
+ this.lastScroll = scrollTop
|
|
|
this.scrollStatus = scrollTop < 60
|
|
|
},
|
|
|
// 定制化分析报告&&超前项目推荐数据请求
|
|
@@ -2589,6 +2833,64 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
} catch (error) {}
|
|
|
+ },
|
|
|
+ onListTabClick(name) {
|
|
|
+ const isPass = this.beforeTabActiveChange(name)
|
|
|
+ if (isPass) {
|
|
|
+ this.pageState.listTabActive = name
|
|
|
+ this.onListTabChange(name)
|
|
|
+ this.showPopover = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 清空已选筛选条件,恢复到默认值
|
|
|
+ onClearFilter() {
|
|
|
+ const noChangeDefaultFilterState = this.noChangeDefaultFilterState
|
|
|
+ this.filters.infoType = noChangeDefaultFilterState.infoType
|
|
|
+ this.pageState.searchGroup = '0'
|
|
|
+ for (const key in noChangeDefaultFilterState) {
|
|
|
+ this.$set(this.filters, key, noChangeDefaultFilterState[key])
|
|
|
+ }
|
|
|
+ this.doSearch()
|
|
|
+ },
|
|
|
+ highlightText(value, keyStr) {
|
|
|
+ return replaceKeyword(
|
|
|
+ value,
|
|
|
+ keyStr,
|
|
|
+ '<span class="highlight-text-orange-bd">' + keyStr + '</span>'
|
|
|
+ )
|
|
|
+ },
|
|
|
+ moveRecommendCard(n) {
|
|
|
+ if (n === 'table') {
|
|
|
+ // 市场分析报告插到表格头部位置
|
|
|
+ this.$nextTick(() => {
|
|
|
+ const recommend = document.querySelector('.recommend-card-container')
|
|
|
+ const scroll = document.querySelector('.table-container .scroll')
|
|
|
+ const recommendChild = document.querySelector('.recommend-bg')
|
|
|
+ if (recommend && scroll) {
|
|
|
+ const parentNode = scroll.parentNode
|
|
|
+ parentNode.insertBefore(recommend, scroll)
|
|
|
+ this.cardLoaded = true
|
|
|
+ if (recommendChild) {
|
|
|
+ recommendChild.style.margin = '0 8px'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 市场分析报告插到第一条数据后面位置
|
|
|
+ this.$nextTick(() => {
|
|
|
+ const recommend = document.querySelector('.recommend-card-container')
|
|
|
+ const cellList = document.querySelectorAll('.project-cell')
|
|
|
+ const recommendChild = document.querySelector('.recommend-bg')
|
|
|
+ if (recommend && cellList[0]) {
|
|
|
+ const parentNode = cellList[0].parentNode
|
|
|
+ parentNode.insertBefore(recommend, cellList[0].nextSibling)
|
|
|
+ this.cardLoaded = true
|
|
|
+ if (recommendChild) {
|
|
|
+ recommendChild.style.margin = '8px 8px 0'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2613,27 +2915,22 @@ export default {
|
|
|
<style lang="scss" scoped>
|
|
|
.tip-toggle-search-mode-container {
|
|
|
display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- margin: 8px 16px;
|
|
|
- margin-top: 0;
|
|
|
- padding: 12px 16px;
|
|
|
- background: linear-gradient(180deg, #e8ffff 0%, #ffffff 100%);
|
|
|
- border: 0.5px solid #2abed1;
|
|
|
- border-radius: 8px;
|
|
|
+ margin-top: 8px;
|
|
|
+ //background: linear-gradient(180deg, #e8ffff 0%, #ffffff 100%);
|
|
|
color: #5f5e64;
|
|
|
- font-size: 13px;
|
|
|
- line-height: 20px;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 18px;
|
|
|
.tip-action {
|
|
|
display: inline-flex;
|
|
|
align-items: center;
|
|
|
}
|
|
|
- button {
|
|
|
- margin-top: 12px;
|
|
|
- background: #2abed1;
|
|
|
- padding: 5px 12px;
|
|
|
- border-radius: 4px;
|
|
|
- color: #f7f9fa;
|
|
|
+ .search-model-switch {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ &-text {
|
|
|
+ color: $color_main;
|
|
|
+ text-decoration: underline;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.search-result-bidding {
|
|
@@ -2707,11 +3004,19 @@ export default {
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
}
|
|
|
+.data-export {
|
|
|
+ margin-left: 10px;
|
|
|
+ line-height: 20px;
|
|
|
+ .text {
|
|
|
+ font-size: 11px;
|
|
|
+ }
|
|
|
+}
|
|
|
.tab-switch {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
padding: 2px 16px;
|
|
|
+ margin-top: -1px;
|
|
|
padding-left: 8px;
|
|
|
background: #fff;
|
|
|
.tab-right {
|
|
@@ -2734,18 +3039,57 @@ export default {
|
|
|
}
|
|
|
|
|
|
.tab-search-info {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- padding: 8px 16px;
|
|
|
- line-height: 30px;
|
|
|
+ position: relative;
|
|
|
+ margin: 8px;
|
|
|
+ padding: 8px;
|
|
|
+ line-height: 20px;
|
|
|
+ border-radius: 8px;
|
|
|
+ border: 1px solid transparent;
|
|
|
+ background-clip: padding-box, border-box;
|
|
|
+ background-image: linear-gradient(#e8ffff 40%, #ffffff 100%),
|
|
|
+ linear-gradient(to right, #2abed1, #4de4f84c, #2abed1);
|
|
|
+ background-origin: padding-box, border-box;
|
|
|
.tab-right {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
}
|
|
|
+ ::v-deep {
|
|
|
+ .van-popover__arrow {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ .tab-column {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ width: 88px;
|
|
|
+ &-item {
|
|
|
+ width: 100%;
|
|
|
+ height: 44px;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 44px;
|
|
|
+ text-align: center;
|
|
|
+ letter-spacing: 2px;
|
|
|
+ &:not(:last-child) {
|
|
|
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
|
|
+ }
|
|
|
+ &.active {
|
|
|
+ padding-right: 10px;
|
|
|
+ color: $color_main;
|
|
|
+ background: url(@/assets/image/icon/icon-check.png) no-repeat 58px
|
|
|
+ center;
|
|
|
+ background-size: 16px 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .selected-tab-content {
|
|
|
+ font-size: 11px;
|
|
|
+ line-height: 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
.search-total-count {
|
|
|
- font-size: 14px;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 700;
|
|
|
}
|
|
|
|
|
|
.intercept-tip-container {
|
|
@@ -2761,9 +3105,16 @@ export default {
|
|
|
}
|
|
|
|
|
|
.list-item {
|
|
|
+ margin: 0 8px;
|
|
|
+ border-radius: 12px;
|
|
|
&:not(:first-of-type) {
|
|
|
margin-top: 8px;
|
|
|
}
|
|
|
+ .icon-star-streak,
|
|
|
+ .icon-star-fill {
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
+ }
|
|
|
}
|
|
|
.middle-list-container {
|
|
|
+ .list-item {
|
|
@@ -2793,9 +3144,12 @@ export default {
|
|
|
}
|
|
|
.table {
|
|
|
min-width: 1000px;
|
|
|
- margin: 16px;
|
|
|
+ margin: 8px;
|
|
|
font-size: 14px;
|
|
|
+ background: #fff;
|
|
|
+ border-radius: 12px;
|
|
|
border-collapse: collapse;
|
|
|
+ overflow: hidden;
|
|
|
tr {
|
|
|
td {
|
|
|
padding: 6px 12px;
|
|
@@ -2829,7 +3183,10 @@ export default {
|
|
|
}
|
|
|
.table-header {
|
|
|
font-size: 13px;
|
|
|
- background-color: $gray_1;
|
|
|
+ background-color: #fff;
|
|
|
+ td {
|
|
|
+ color: #9b9ca3;
|
|
|
+ }
|
|
|
}
|
|
|
.table-content-tr {
|
|
|
&.visited {
|
|
@@ -2867,34 +3224,47 @@ export default {
|
|
|
rgba(255, 255, 255, 1),
|
|
|
rgba(255, 255, 255, 1)
|
|
|
);
|
|
|
+ &.ios-look-more {
|
|
|
+ height: 180px;
|
|
|
+ padding-bottom: 50px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.seat {
|
|
|
+ height: 60px;
|
|
|
+ background: #fff;
|
|
|
}
|
|
|
.sub-this-keywords {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
- padding: 8px 16px;
|
|
|
- height: 46px;
|
|
|
- color: #fff;
|
|
|
- background-color: #37c6da;
|
|
|
+ padding: 10px 12px;
|
|
|
+ height: 40px;
|
|
|
+ color: #171826;
|
|
|
+ border: 0.5px solid transparent;
|
|
|
+ background-clip: padding-box, border-box;
|
|
|
+ background-image: linear-gradient(#e8ffff 40%, #ffffff 100%),
|
|
|
+ linear-gradient(to right, #2abed1 10%, #4de4f84c 30%, #2abed1);
|
|
|
+ background-origin: padding-box, border-box;
|
|
|
+ border-radius: 8px;
|
|
|
.left {
|
|
|
- font-size: 22px;
|
|
|
+ font-size: 20px;
|
|
|
+ color: #87dfea;
|
|
|
}
|
|
|
.center {
|
|
|
margin: 0 4px;
|
|
|
flex: 1;
|
|
|
}
|
|
|
.text {
|
|
|
- font-size: 13px;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 18px;
|
|
|
}
|
|
|
.action {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- padding: 0 6px;
|
|
|
- font-size: 13px;
|
|
|
- line-height: 26px;
|
|
|
- border-radius: 16px;
|
|
|
- border: 1px solid $white;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 18px;
|
|
|
+ color: $color_main;
|
|
|
}
|
|
|
}
|
|
|
.right-event {
|
|
@@ -2928,4 +3298,70 @@ export default {
|
|
|
opacity: 0.5;
|
|
|
}
|
|
|
}
|
|
|
+.recommend-card-container,
|
|
|
+.recommend-card-table {
|
|
|
+ ::v-deep {
|
|
|
+ .recommend-bg {
|
|
|
+ padding-bottom: 0;
|
|
|
+ margin: 8px 8px 0;
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.05);
|
|
|
+ border-radius: 12px;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .van-cell {
|
|
|
+ padding: 8px 12px;
|
|
|
+ background: linear-gradient(#ffffff 10%, #f5f5f5 100%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.recommend-card-table {
|
|
|
+ ::v-deep {
|
|
|
+ .recommend-bg {
|
|
|
+ margin-top: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.tab-saved {
|
|
|
+ padding: 2px 12px 8px;
|
|
|
+ background: #fff;
|
|
|
+ &-left {
|
|
|
+ flex: 1;
|
|
|
+ margin-right: 4px;
|
|
|
+ &-label {
|
|
|
+ color: #171826;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 20px;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+ &-value {
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 18px;
|
|
|
+ color: #5f5e64;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &-right {
|
|
|
+ flex-shrink: 0;
|
|
|
+ color: $color_main;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 18px;
|
|
|
+ .clear-action {
|
|
|
+ margin-right: 10px;
|
|
|
+ padding: 1px 4px;
|
|
|
+ }
|
|
|
+ .save-action {
|
|
|
+ padding: 1px 4px;
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid $color_main;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.sub-position {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 40px;
|
|
|
+ left: 12px;
|
|
|
+ right: 12px;
|
|
|
+}
|
|
|
+.customer-corner {
|
|
|
+ z-index: 10;
|
|
|
+}
|
|
|
</style>
|