Browse Source

feat:供应搜索联调

yangfeng 1 year ago
parent
commit
dda6943b1d

+ 1 - 1
apps/bigmember_pc/src/views/search/components/search-schema-filter.vue

@@ -62,7 +62,7 @@ const getPrefix = {
           {{ item.label }}
           {{ item.label }}
         </slot>
         </slot>
       </div>
       </div>
-      <div>
+      <div class="flex-1">
         <!-- @component 自定义组件  -->
         <!-- @component 自定义组件  -->
         <!-- @input @change 兼容不同组件的输出  -->
         <!-- @input @change 兼容不同组件的输出  -->
         <Component
         <Component

+ 1 - 0
apps/bigmember_pc/src/views/search/layout/search-list.vue

@@ -47,6 +47,7 @@ const canShowPagination = computed(() => {
   if (props.listState.loading && props.listState.pageNum === 1) {
   if (props.listState.loading && props.listState.pageNum === 1) {
     return false
     return false
   }
   }
+  if (!props.list.length) return false
   return props.listState.total > 0
   return props.listState.total > 0
 })
 })
 </script>
 </script>

+ 4 - 7
apps/bigmember_pc/src/views/search/supply/constant/search-filters.js

@@ -1,5 +1,5 @@
 import SearchScopeSelector from '@/components/filter-items/SearchScopeSelector.vue'
 import SearchScopeSelector from '@/components/filter-items/SearchScopeSelector.vue'
-import AreaSelector from '@/components/selector/AreaSelector.vue'
+import RegionCollapseSelector from '@/components/filter-items/RegionCollapseSelector.vue'
 import TimeSelector from '@/components/selector/TimeSelector.vue'
 import TimeSelector from '@/components/selector/TimeSelector.vue'
 import TagSelector from '@/components/selector/TagSelector.vue'
 import TagSelector from '@/components/selector/TagSelector.vue'
 
 
@@ -35,17 +35,14 @@ const SearchSupplyBaseSchema = [
     }
     }
   },
   },
   {
   {
-    key: 'selectArea',
+    key: 'regionMap',
     label: '选择区域:',
     label: '选择区域:',
     defaultVal: [],
     defaultVal: [],
     _name: 'type',
     _name: 'type',
     _type: 'component',
     _type: 'component',
     expand: {
     expand: {
-      component: AreaSelector,
-      props: {
-        selectorType: 'line',
-        showKey: false
-      },
+      component: RegionCollapseSelector,
+      props: {},
       hooks: {}
       hooks: {}
     }
     }
   },
   },

+ 20 - 14
apps/bigmember_pc/src/views/search/supply/index.vue

@@ -7,7 +7,6 @@ import {
   showFilter,
   showFilter,
   loginFlag,
   loginFlag,
   goToPublish,
   goToPublish,
-  mixinVisited,
   filterState,
   filterState,
   searchTabs,
   searchTabs,
   inputKeywordsState,
   inputKeywordsState,
@@ -20,24 +19,20 @@ import {
 import {
 import {
   SearchSupplyBaseSchema
   SearchSupplyBaseSchema
 } from './constant/search-filters'
 } from './constant/search-filters'
-import { onMounted, ref } from 'vue'
 
 
-const { refreshVisited, pathVisiting, createPathItem } = mixinVisited()
-onMounted(() => {
-  refreshVisited()
-})
 
 
 function goDetail(item) {
 function goDetail(item) {
+  // 一切都好进供应搜索点击列表需要登录,其他不需要登录
+  if (!loginFlag) {
+    const cookieInfo = document.cookie.split('; ');
+    const isPass = cookieInfo.some(item => item.indexOf('channelCode') > -1)
+    if (isPass) {
+      window.location.href = '/notin/page'
+      return
+    }
+  }
   const { id } = item
   const { id } = item
-  item.visited = true
-  pathVisiting(
-    createPathItem(
-      '/demand/detail',
-      `id=${id}`
-    )
-  )
   const routerUrl = `/swordfish/page_web_pc/demand/detail/${id}?matchKey=${inputKeywordsState.value.input}`
   const routerUrl = `/swordfish/page_web_pc/demand/detail/${id}?matchKey=${inputKeywordsState.value.input}`
-
   window.open(routerUrl)
   window.open(routerUrl)
 }
 }
 </script>
 </script>
@@ -92,6 +87,7 @@ function goDetail(item) {
           :tags='item.tags'
           :tags='item.tags'
           :time="item.time"
           :time="item.time"
           :visited="item.visited"
           :visited="item.visited"
+          v-visited:demand="item.id"
           @onClick="goDetail(item)"
           @onClick="goDetail(item)"
         >
         >
         </supply-article-item>
         </supply-article-item>
@@ -109,10 +105,17 @@ function goDetail(item) {
     .toggle-filter{
     .toggle-filter{
       cursor: pointer;
       cursor: pointer;
       color: #686868;
       color: #686868;
+      .icon-zhankai{
+        display: inline-block;
+        margin-left: 2px;
+        transform: rotate(0deg);
+        transition: transform .3s;
+      }
       .rotate180 {
       .rotate180 {
         transform: rotate(180deg);
         transform: rotate(180deg);
       }
       }
     }
     }
+    
     ::v-deep{
     ::v-deep{
       .el-badge__content {
       .el-badge__content {
         padding: 0 6px;
         padding: 0 6px;
@@ -128,6 +131,9 @@ function goDetail(item) {
       .el-badge__content--danger{
       .el-badge__content--danger{
         background-color: #fb483d;
         background-color: #fb483d;
       }
       }
+      .selector-content{
+        margin-left: -5px;
+      }
     }
     }
   }
   }
   .search-header-container{
   .search-header-container{

+ 16 - 6
apps/bigmember_pc/src/views/search/supply/model/index.js

@@ -3,9 +3,7 @@ import useQuickSearchModel from '@jy/data-models/modules/quick-search/model'
 import { useSearchFilterModel } from './modules/filter'
 import { useSearchFilterModel } from './modules/filter'
 import { showFilter, loginFlag, goToPublish } from './modules/search-header'
 import { showFilter, loginFlag, goToPublish } from './modules/search-header'
 import { replaceKeyword, dateFromNow } from '@/utils'
 import { replaceKeyword, dateFromNow } from '@/utils'
-import { mixinVisited } from '@/utils/mixins/visited-setup.js'
 
 
-const { pathVisited, createPathItem } = mixinVisited()
 // 解构基础业务
 // 解构基础业务
 const APIModel = useQuickSearchModel({
 const APIModel = useQuickSearchModel({
   type: 'search-supply'
   type: 'search-supply'
@@ -65,6 +63,11 @@ const formatList = computed(() => {
         value: item.province
         value: item.province
       })
       })
     }
     }
+    if (item.city && item.city.replace('市', '') !== item.province) {
+      tags.push({
+        value: item.city.replace('市', '')
+      })
+    }
     return {
     return {
       id: item.id,
       id: item.id,
       title: replaceKeyword(item.title, inputKeywordsState.value.input, [
       title: replaceKeyword(item.title, inputKeywordsState.value.input, [
@@ -76,14 +79,21 @@ const formatList = computed(() => {
         '</span>'
         '</span>'
       ]) : '',
       ]) : '',
       time: dateFromNow(item.publish_time * 1000),
       time: dateFromNow(item.publish_time * 1000),
-      tags: tags,
-      visited: false
+      tags: tags
     }
     }
   })
   })
 })
 })
 
 
+// 页码总数只在第一页返回-记录保存
+const pageInfo = reactive({
+  total: 0
+})
 // search-list 组件所需参数
 // search-list 组件所需参数
 const searchListProps = computed(() => {
 const searchListProps = computed(() => {
+  if (listState.pageNum === 1) {
+    pageInfo.total = listState.total
+  }
+  listState.total = pageInfo.total
   return {
   return {
     showSelect: false,
     showSelect: false,
     headerActions: [],
     headerActions: [],
@@ -118,12 +128,13 @@ function getParams(params = {}) {
     {
     {
       searchType: 'title',
       searchType: 'title',
       keywords: inputKeywordsState.value.input || '',
       keywords: inputKeywordsState.value.input || '',
-      pageNum: listState.pageNum,
+      pageIndex: listState.pageNum,
       pageSize: listState.pageSize
       pageSize: listState.pageSize
     },
     },
     getFormatAPIParams(),
     getFormatAPIParams(),
     params
     params
   )
   )
+  console.log(result, 'result')
   return result
   return result
 }
 }
 
 
@@ -131,7 +142,6 @@ export {
   showFilter,
   showFilter,
   loginFlag,
   loginFlag,
   goToPublish,
   goToPublish,
-  mixinVisited,
   // 列表
   // 列表
   list,
   list,
   doQuery,
   doQuery,

+ 32 - 4
apps/bigmember_pc/src/views/search/supply/model/modules/filter.js

@@ -8,21 +8,49 @@ export function useSearchFilterModel() {
     status: 0,
     status: 0,
     province: '',
     province: '',
     city: '',
     city: '',
-    time: ''
+    time: '',
+    regionMap: {}
   })
   })
 
 
   function getFormatAPIParams() {
   function getFormatAPIParams() {
+    const { province, city } = getProvinceCity()
     const params = {
     const params = {
       searchType: filterState.value.searchType.toString(),
       searchType: filterState.value.searchType.toString(),
       status: filterState.value.status.toString(),
       status: filterState.value.status.toString(),
-      province: filterState.value.province,
-      city: filterState.value.city,
-      time: filterState.value.time
+      province: province.toString(),
+      city: city.toString(),
+      time: getFilterTime(filterState.value.time)
     }
     }
 
 
     return params
     return params
   }
   }
 
 
+  function getFilterTime(time) {
+    const { start, end } = time
+    if (start && end) {
+      return `${parseInt(start / 1000)}-${parseInt(end / 1000)}`
+    } else {
+      return ''
+    }
+  }
+
+  function getProvinceCity() {
+    const regionMap = filterState.value.regionMap
+    const province = []
+    const city = []
+    for (const key in regionMap) {
+      if (regionMap[key].length === 0) {
+        province.push(key)
+      } else {
+        city.push(...regionMap[key])
+      }
+    }
+    return {
+      province,
+      city
+    }
+  }
+
   return {
   return {
     filterState,
     filterState,
     getFormatAPIParams
     getFormatAPIParams

+ 3 - 8
packages/pc-ui/src/packages/article-item/supply-article-item.vue

@@ -1,9 +1,9 @@
 <template>
 <template>
-  <div class="article-item-container supply-article-item" :class="{ 'visited': visited }">
+  <div class="article-item-container supply-article-item"  @click.stop="onClick">
     <div class="article-item-header">
     <div class="article-item-header">
       <slot name="prefix"></slot>
       <slot name="prefix"></slot>
     </div>
     </div>
-     <div class="article-item-content" :class="{ line: !detail, 'tags-bottom': tagsPosition === 'bottom' }" @click.stop.prevent="onClick">
+     <div class="article-item-content" :class="{ line: !detail, 'tags-bottom': tagsPosition === 'bottom' }">
       <div class="a-i-c-top visited-hd">
       <div class="a-i-c-top visited-hd">
         <div class="ellipsis" v-html="calcTitle"></div>
         <div class="ellipsis" v-html="calcTitle"></div>
         <div class="tags" v-if="tagsPosition === 'bottom'">
         <div class="tags" v-if="tagsPosition === 'bottom'">
@@ -70,11 +70,6 @@ export default {
       type: Array,
       type: Array,
       default: () => []
       default: () => []
     },
     },
-    // 已读
-    visited: {
-      type: Boolean,
-      default: false
-    },
     tagsPosition: {
     tagsPosition: {
       type: String,
       type: String,
       default: 'right'
       default: 'right'
@@ -116,7 +111,7 @@ export default {
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     justify-content: space-between;
     justify-content: space-between;
-    padding: 18px 36px;
+    padding: 18px 26px;
     width: 100%;
     width: 100%;
     cursor: pointer;
     cursor: pointer;