Преглед изворни кода

fix: 修复样式、空值等判断逻辑

zhangyuhan пре 1 година
родитељ
комит
ac137bafc7

+ 4 - 1
apps/bigmember_pc/src/assets/style/page/article.scss

@@ -231,8 +231,10 @@
     background-color: #fff;
   }
 
+  .default-article-container {
+    min-width: 880px;
+  }
   .article-container {
-    margin: 20px;
     margin-top: 0;
 
     .content-detail-container {
@@ -267,3 +269,4 @@
     }
   }
 }
+

+ 1 - 1
apps/bigmember_pc/src/components/article-item/ArticleItem.vue

@@ -39,7 +39,7 @@
             article.site === '剑鱼信息发布平台' ||
             article.spidercode === 'a_jyxxfbpt_gg'
           "
-          >用户发布</span
+          >业主委托项目</span
         >
         <span class="tag tag-own" v-if="buySubject && article.source === 1"
           >个人订阅</span

+ 15 - 13
apps/bigmember_pc/src/components/common/ContentLayout.vue

@@ -6,21 +6,23 @@
     <div class="content-right ad-container" :class="{ nothing: adShow }">
       <slot name="right">
         <slot name="right-top"></slot>
-        <div class="ad-list" :id="adCodeMap[routerName] || routerName">
-          <div
-            class="ad-item-container"
-            v-for="(item, index) in adList"
-            :key="index"
-          >
-            <a
-              :href="item.s_link"
-              target="_blank"
-              :id="(adCodeMap[routerName] || routerName) + '-' + index"
+        <slot name="right-main">
+          <div class="ad-list" :id="adCodeMap[routerName] || routerName">
+            <div
+              class="ad-item-container"
+              v-for="(item, index) in adList"
+              :key="index"
             >
-              <img :src="item.s_pic" />
-            </a>
+              <a
+                :href="item.s_link"
+                target="_blank"
+                :id="(adCodeMap[routerName] || routerName) + '-' + index"
+              >
+                <img :src="item.s_pic" />
+              </a>
+            </div>
           </div>
-        </div>
+        </slot>
         <slot name="right-bottom"></slot>
       </slot>
     </div>

+ 1 - 1
apps/bigmember_pc/src/components/push-list/ArticleStar.vue

@@ -2,7 +2,7 @@
   <div class="article-star-module">
     <div class="right-actions" v-if="canStar" @click.stop="doChangeStar">
       <i class="icon-collect" :class="{ checked: star }" :dataid="id"></i>
-      <span name="right-action" style="font-size: 14px; margin-left: 4px">{{
+      <span name="right-action" style="margin-left: 4px">{{
         star ? '已收藏' : '收藏'
       }}</span>
     </div>

+ 5 - 2
apps/bigmember_pc/src/composables/down-project-report/component/DownProjectReport.vue

@@ -6,6 +6,10 @@ const props = defineProps({
     type: String,
     default: '下载项目报告'
   },
+  showVip: {
+    type: Boolean,
+    default: false
+  },
   id: String,
   name: String
 })
@@ -24,7 +28,7 @@ const { doClickDown, loading } = useDownProjectReportModel({
     <i class="el-icon-jy-report"></i>
     <i class="el-icon-jy-report-active"></i>
     <span>{{ label }}</span>
-    <i class="el-icon-jy-vip"></i>
+    <i class="el-icon-jy-vip" v-if="showVip"></i>
   </div>
 </template>
 
@@ -34,7 +38,6 @@ const { doClickDown, loading } = useDownProjectReportModel({
 @include diy-icon('report-active', 20, 20);
 .down-project-report {
   cursor: pointer;
-  margin-left: 12px;
   font-size: 14px;
   font-weight: 400;
   color: #686868;

+ 11 - 8
apps/bigmember_pc/src/views/article-content/components/ContentSummary.vue

@@ -36,7 +36,7 @@ const contentSummaryTable = computed(() => {
       type = 'unit'
     }
     if (type === 'contact') {
-      if (item?.expand?.link === false) {
+      if (!item?.expand || item?.expand?.link === false) {
         type = ''
       }
     }
@@ -147,17 +147,19 @@ function doOpenItem(item) {
         :width="item.width"
       >
         <template slot-scope="scope">
-          <div v-if="!scope.row[index]?.type">
+          <div class="ellipsis-2" v-if="!scope.row[index]?.type">
             {{ scope.row[index].label }}
           </div>
           <div v-else>
             <div class="td-unit" v-if="scope.row[index].type === 'unit'">
-              <span @click="doOpenItem(scope.row[index])" class="text--line">{{
-                scope.row[index].label
-              }}</span>
               <span
                 @click="doOpenItem(scope.row[index])"
-                class="go-more-action flex flex-(row items-center)"
+                class="text--line ellipsis-2"
+                >{{ scope.row[index].label }}</span
+              >
+              <span
+                @click="doOpenItem(scope.row[index])"
+                class="go-more-action m-l-16px flex flex-(row items-center shrink-0)"
                 v-if="scope.row[index].label"
               >
                 查看详情
@@ -168,7 +170,7 @@ function doOpenItem(item) {
               class="td-free-view"
               v-if="scope.row[index].type === 'free-view'"
             >
-              <span @click="doOpenItem(scope.row[index])">
+              <span class="ellipsis-2" @click="doOpenItem(scope.row[index])">
                 {{ scope.row[index].label }}
               </span>
             </div>
@@ -178,7 +180,7 @@ function doOpenItem(item) {
               }}</span>
               <span
                 @click="doOpenItem(scope.row[index])"
-                class="go-more-action flex flex-(row items-center)"
+                class="go-more-action flex m-l-16px flex-(row items-center shrink-0)"
                 v-if="scope.row[index].label"
               >
                 更多联系人
@@ -203,6 +205,7 @@ function doOpenItem(item) {
 <style lang="scss" scoped>
 .common-content-summary {
   .summary-header-tip {
+    font-size: 14px;
     cursor: pointer;
   }
   .table-footer-tip {

+ 1 - 0
apps/bigmember_pc/src/views/article-content/components/OriginLink.vue

@@ -272,6 +272,7 @@ export default {
 .origin-link-module {
   ::v-deep {
     .confirmed-dialog.el-dialog {
+      max-width: 380px;
       border-radius: 8px;
     }
     .confirmed-dialog.el-dialog .el-dialog__header {

+ 16 - 11
apps/bigmember_pc/src/views/article-content/components/RecommendEnt.vue

@@ -24,6 +24,7 @@ function getRecommendEntInfo(list) {
           id: resItem?.winnerId || '',
           name: resItem.companyName || item?.name || '',
           time: resItem.timeFrame,
+          link: item.link,
           tags: [
             {
               value: resItem.contactCount || 0,
@@ -50,7 +51,7 @@ function getRecommendEntInfo(list) {
               unit: '个',
               label: '合作企业'
             }
-          ],
+          ].filter((v) => v.value),
           origin: res.data
         }
         recommendList.value = [].concat(resultList)
@@ -60,17 +61,16 @@ function getRecommendEntInfo(list) {
 }
 
 const list = computed(() => {
-  const result = [].concat(
-    SummaryModel.value.buyers,
-    SummaryModel.value.winners
-  )
+  const result = []
+    .concat(SummaryModel.value.buyers, SummaryModel.value.winners.slice(0, 3))
+    .filter((v) => v.link)
   return result
 })
 
 getRecommendEntInfo(list.value)
 
 const recommendEntList = computed(() => {
-  return recommendList.value.filter((v) => v.name)
+  return recommendList.value.filter((v) => v.name && v.tags.length > 0)
 })
 
 function doOpen(item) {
@@ -98,10 +98,11 @@ function doOpen(item) {
           >
             {{ item?.type === 'buyer' ? '采购单位' : '中标单位' }}画像
           </span>
-          <h3>{{ item.name }}</h3>
+          <h3 class="ellipsis" style="max-width: 25em">{{ item.name }}</h3>
           <div class="monitor-action">
             <quick-monitor
               class="action-item"
+              :cache="true"
               :type="item.type === 'buyer' ? 'client' : 'ent'"
               :params="item.type === 'buyer' ? item.name : item.id"
             />
@@ -119,7 +120,12 @@ function doOpen(item) {
             <span>{{ tag.label }}</span>
           </div>
         </div>
-        <el-button class="detail-action" type="primary" @click="doOpen(item)">
+        <el-button
+          class="detail-action"
+          type="primary"
+          @click="doOpen(item)"
+          v-if="item.link"
+        >
           查看详情
         </el-button>
       </div>
@@ -152,7 +158,7 @@ function doOpen(item) {
     display: flex;
     flex-direction: row;
     align-items: center;
-    justify-content: space-between;
+    justify-content: flex-start;
     font-size: 14px;
     line-height: 22px;
     color: #686868;
@@ -167,12 +173,11 @@ function doOpen(item) {
       display: flex;
       flex-direction: row;
       align-items: center;
-      width: 680px;
       height: 78px;
     }
     .number-info-item {
       position: relative;
-      flex: 1;
+      min-width: 136px;
       display: flex;
       flex-direction: column;
       align-items: center;

+ 2 - 0
apps/bigmember_pc/src/views/article-content/components/RecommendOpportunities.vue

@@ -239,6 +239,7 @@ const recommendMaskConfig = {
         <div class="right-quick-more-actions flex flex-(row items-center)">
           <quick-monitor
             v-if="recommendBuyers.name"
+            :cache="true"
             type="client"
             :params="recommendBuyers.name"
           />
@@ -291,6 +292,7 @@ const recommendMaskConfig = {
         <div class="right-quick-more-actions flex flex-(row items-center)">
           <quick-monitor
             v-if="recommendWinners.id"
+            :cache="true"
             type="ent"
             :params="recommendWinners.id"
           />

+ 12 - 7
apps/bigmember_pc/src/views/article-content/composables/useHoverElementClientRect.js

@@ -106,21 +106,26 @@ export function useHoverHighlightTextPopover({
     }
   }
 
-  onMounted(() => {
+  function useElementListener() {
     // 使用事件委托,将事件监听绑定到 parentElement 上
     const parentElement = document.querySelector(parentSelector)
-    parentElement.addEventListener('mouseover', handleMouseOver)
-    parentElement.addEventListener('click', handleClick)
-  })
+    if (parentElement) {
+      parentElement.addEventListener('mouseover', handleMouseOver)
+      parentElement.addEventListener('click', handleClick)
+    }
+  }
 
   onUnmounted(() => {
     // 移除事件监听
     const parentElement = document.querySelector(parentSelector)
-    parentElement.removeEventListener('mouseover', handleMouseOver)
-    parentElement.removeEventListener('click', handleClick)
+    if (parentElement) {
+      parentElement.removeEventListener('mouseover', handleMouseOver)
+      parentElement.removeEventListener('click', handleClick)
+    }
   })
 
   return {
-    elementState
+    elementState,
+    useElementListener
   }
 }

+ 38 - 53
apps/bigmember_pc/src/views/article-content/pages/Article.vue

@@ -8,7 +8,7 @@ import {
 } from 'vue'
 import { useRoute } from 'vue-router/composables'
 import { debounce, throttle } from 'lodash'
-import { replaceKeyword } from '@/utils'
+import { moneyUnit, replaceKeyword } from '@/utils'
 import { dateFromNow } from '@jy/util'
 // 组件引入
 import ContentHeader from '@/views/article-content/components/ContentHeader.vue'
@@ -46,6 +46,7 @@ import ContentHeaderSkeleton from '@/views/article-content/components/ContentHea
 import PoverTimeLine from '@/components/time-line/PoverTimeLine.vue'
 import { useHoverHighlightTextPopover } from '@/views/article-content/composables/useHoverElementClientRect'
 import attachmentDownload from '@/composables/attachment-download/component/AttachmentDownload.vue'
+import ContentRightTimeLine from '@/views/article-content/components/ContentRightTimeLine.vue'
 
 useContentStore()
 // 判断在哪个容器
@@ -71,9 +72,6 @@ const contentTabs = [
   {
     label: '公告正文'
   },
-  {
-    label: '招标/采购进度'
-  },
   {
     label: '投标服务'
   },
@@ -88,7 +86,6 @@ const contentTabs = [
 const tabContentState = ref({
   公告摘要: true,
   公告正文: true,
-  '招标/采购进度': true,
   投标服务: true,
   商机推荐: true,
   客户推荐: true
@@ -101,8 +98,6 @@ const tabContentShow = computed(() => {
       ContentExpandsModel.value.recommendBuyers.total > 0 ||
       ContentExpandsModel.value.recommendWinners.total > 0,
     投标服务: ContentExpandsModel.value.services.length > 0,
-    '招标/采购进度':
-      ContentExpandsModel.value.projectProgress?.list?.length > 0,
     公告摘要: SummaryModel.value.list.filter((v) => v.value).length > 0,
     公告正文: ContentModel.value.content
   }
@@ -147,6 +142,11 @@ const timeLineList = computed(() => {
         ContentExpandsModel.value.projectProgress.name,
         ['<span class="highlight-text">', '</span>']
       ),
+      contentType: [
+        v._data?.toptype ? '招标' + v._data?.toptype : '',
+        v._data?.subtype
+      ].filter((v) => v),
+      money: v?.bidAmount ? moneyUnit(v?.bidAmount) + '元' : '',
       id: v.id,
       s_id: v.id,
       tags: [v.tag],
@@ -312,8 +312,8 @@ const popoverTimeLine = computed(() => {
   }
 })
 
-const { elementState } = useHoverHighlightTextPopover({
-  parentSelector: '.article-page-container',
+const { elementState, useElementListener } = useHoverHighlightTextPopover({
+  parentSelector: '.content-main-container',
   hasClass: 'keyword-underline',
   onChangeHover: debounce((isHover) => {
     popoverElement.value.doChangePopover(isHover)
@@ -330,6 +330,15 @@ const { elementState } = useHoverHighlightTextPopover({
   }
 })
 
+// 事件延迟绑定
+const canAddContentMainEvent = computed(() => {
+  const result = ContentPageLoading.value && tabContentShow.value['公告正文']
+  if (result) {
+    useElementListener()
+  }
+  return result
+})
+
 // 免费查看
 function doClickFreeView() {
   doOpenCollectDialog('peugeot_view_infor')
@@ -337,7 +346,12 @@ function doClickFreeView() {
 </script>
 <template>
   <ContentLayout :need-ad="true" class="article-page-container">
-    <el-skeleton :loading="ContentPageLoading" animated :throttle="500">
+    <el-skeleton
+      class="default-article-container"
+      :loading="ContentPageLoading"
+      animated
+      :throttle="500"
+    >
       <template slot="template">
         <div class="article-container">
           <content-header-skeleton />
@@ -447,43 +461,6 @@ function doClickFreeView() {
                 </div>
               </div>
             </div>
-            <!--  招标/采购进度  -->
-            <div
-              class="content-card watch-tab-content"
-              name="招标/采购进度"
-              v-if="tabContentShow['招标/采购进度']"
-            >
-              <div class="flex flex-(row items-center justify-between)">
-                <div class="content-block-header">招标/采购进度</div>
-                <div
-                  class="report-actions flex flex-(row items-center justify-between)"
-                >
-                  <down-project-report
-                    v-if="ContentModel.projectName"
-                    :id="contentId"
-                    :name="ContentModel.projectName"
-                  ></down-project-report>
-                  <quick-monitor
-                    class="m-l-16px"
-                    :cache="true"
-                    :auto="false"
-                    type="project"
-                    :params="contentId"
-                  />
-                </div>
-              </div>
-              <TimeLine
-                :custom-event="true"
-                :stepList="timeLineList"
-                @open="doOpenArticlePage"
-              >
-                <template v-slot:after="{ item }">
-                  <span class="is-active-time-item" v-if="item.isActive"
-                    >当前信息</span
-                  >
-                </template>
-              </TimeLine>
-            </div>
             <!--  投标服务  -->
             <div
               class="content-card watch-tab-content"
@@ -557,8 +534,16 @@ function doClickFreeView() {
       :id="contentId"
       @click-collect="doOpenCollectDialog"
     ></origin-link>
+    <template #right-top v-if="timeLineList.length > 0">
+      <!--  招标/采购进度  -->
+      <content-right-time-line
+        :content-id="contentId"
+        :time-line-list="timeLineList"
+        @open="doOpenArticlePage"
+      ></content-right-time-line>
+    </template>
     <!--  in-web 容器时右侧注入侧边栏  -->
-    <template #right v-if="InWhichContainer === 'in-web'">
+    <template #right-main v-if="InWhichContainer === 'in-web'">
       <div id="inWebRightElement"></div>
     </template>
   </ContentLayout>
@@ -581,11 +566,11 @@ function doClickFreeView() {
         margin: 0 auto;
       }
     }
-
-    .content-right {
-      width: 200px;
-      margin-left: 16px;
-    }
+  }
+  .content-right {
+    flex-shrink: 0;
+    width: 200px;
+    margin-left: 16px;
   }
 }
 </style>