|
@@ -1,1023 +0,0 @@
|
|
-small-tab
|
|
|
|
-<template>
|
|
|
|
- <div class="article-content">
|
|
|
|
- <van-skeleton
|
|
|
|
- :row="4"
|
|
|
|
- :row-width="['100%', '100%', '60%', '20%']"
|
|
|
|
- :class="{ 'bg-white': reqState.loading }"
|
|
|
|
- :loading="reqState.loading"
|
|
|
|
- >
|
|
|
|
- <Error v-if="isError" :error-text="errorText" />
|
|
|
|
- <div v-else class="j-container page-container">
|
|
|
|
- <div
|
|
|
|
- ref="scrollWrapper"
|
|
|
|
- class="j-main article-content-main"
|
|
|
|
- :class="{
|
|
|
|
- 'show-underline': otherModel.hasProject,
|
|
|
|
- 'no-scroll': showBindPhone,
|
|
|
|
- }"
|
|
|
|
- @click="onScrollWrapperClick"
|
|
|
|
- @scroll.passive="onScroll"
|
|
|
|
- >
|
|
|
|
- <ContentHeader
|
|
|
|
- :class="{ 'z-index10': showBindPhone }"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <ContentHeaderBannerTip
|
|
|
|
- v-if="showContentHeaderBannerTip"
|
|
|
|
- :id="pageState.id"
|
|
|
|
- :class="{ 'z-index10': showBindPhone }"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <OneClickBinding
|
|
|
|
- v-if="showBindPhone"
|
|
|
|
- :class="{ 'z-index10': showBindPhone }"
|
|
|
|
- />
|
|
|
|
- <van-overlay
|
|
|
|
- class-name="custom-overlay"
|
|
|
|
- :show="showBindPhone"
|
|
|
|
- :lock-scroll="false"
|
|
|
|
- />
|
|
|
|
-
|
|
|
|
- <van-tabs
|
|
|
|
- v-if="canReadConf.show"
|
|
|
|
- v-model="pageState.tabActive"
|
|
|
|
- :class="{ 'small-tab': yyszbContent }"
|
|
|
|
- :offset-top="offsetTop"
|
|
|
|
- scrollspy
|
|
|
|
- sticky
|
|
|
|
- >
|
|
|
|
- <!-- 摘要 -->
|
|
|
|
- <van-tab v-if="baseModuleShow.summary" key="abstract" title="摘要">
|
|
|
|
- <div class="tab-module">
|
|
|
|
- <ContentAbstract
|
|
|
|
- :custom-skip="toBCustom"
|
|
|
|
- class="content-abstract-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <section
|
|
|
|
- v-if="!toBCustom"
|
|
|
|
- class="content-abstract-other bg-white"
|
|
|
|
- >
|
|
|
|
- <ContentAbstractEntList
|
|
|
|
- v-if="!toBCustom"
|
|
|
|
- class="content-abstract-ent-list-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <section class="data-export-banner-module">
|
|
|
|
- <DataExportBanner :before-leave-page="beforeLeavePage" />
|
|
|
|
- </section>
|
|
|
|
- </section>
|
|
|
|
- </div>
|
|
|
|
- </van-tab>
|
|
|
|
- <!-- 正文 -->
|
|
|
|
- <van-tab v-if="baseModuleShow.content" key="mainText" title="正文">
|
|
|
|
- <ContentMainText
|
|
|
|
- class="tab-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- :show-mask="!canReadConf.showContentModule"
|
|
|
|
- />
|
|
|
|
- <NpsCard
|
|
|
|
- v-if="canShowNpsModule"
|
|
|
|
- ref="npsCard"
|
|
|
|
- class="nps-module"
|
|
|
|
- />
|
|
|
|
- </van-tab>
|
|
|
|
- <!-- 进度 -->
|
|
|
|
- <van-tab
|
|
|
|
- v-if="advancedModuleShow.timeline"
|
|
|
|
- key="timeline"
|
|
|
|
- title="进度"
|
|
|
|
- >
|
|
|
|
- <ContentProjectTimeline
|
|
|
|
- class="tab-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- </van-tab>
|
|
|
|
- <!-- 商机推荐 -->
|
|
|
|
- <van-tab
|
|
|
|
- v-if="advancedModuleShow.zbRecommend"
|
|
|
|
- key="businessRecommend"
|
|
|
|
- title="商机推荐"
|
|
|
|
- >
|
|
|
|
- <ContentBusinessRecommend
|
|
|
|
- class="tab-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- </van-tab>
|
|
|
|
- <!-- 客户推荐 -->
|
|
|
|
- <van-tab
|
|
|
|
- v-if="customerRecommendModuleShow"
|
|
|
|
- key="customerRecommend"
|
|
|
|
- title="客户推荐"
|
|
|
|
- >
|
|
|
|
- <ContentCustomerRecommend
|
|
|
|
- class="tab-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- </van-tab>
|
|
|
|
- <!-- 投标服务 -->
|
|
|
|
- <van-tab
|
|
|
|
- v-if="advancedModuleShow.tbService"
|
|
|
|
- key="tbService"
|
|
|
|
- title="投标服务"
|
|
|
|
- >
|
|
|
|
- <ContentTouBiaoService
|
|
|
|
- class="tab-module"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- </van-tab>
|
|
|
|
- </van-tabs>
|
|
|
|
- <template v-if="!canReadConf.show">
|
|
|
|
- <FreeUserAdvancedMask
|
|
|
|
- v-if="content.isNiJian || content.isCaigouyixiang"
|
|
|
|
- :type="content.isNiJian ? 'nijian' : 'caigouyixiang'"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <FreeUserBiddingMask v-else :before-leave-page="beforeLeavePage" />
|
|
|
|
- </template>
|
|
|
|
- <AdSingle
|
|
|
|
- v-if="!toBCustom"
|
|
|
|
- :ad="getContentAdID"
|
|
|
|
- :show-close-icon="false"
|
|
|
|
- radius
|
|
|
|
- :before-open="beforeLeavePage"
|
|
|
|
- class="mg-box"
|
|
|
|
- />
|
|
|
|
- </div>
|
|
|
|
- <div class="j-footer article-content-footer">
|
|
|
|
- <TabActions
|
|
|
|
- v-if="showTabActions"
|
|
|
|
- :show-monitor="showMonitor"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </van-skeleton>
|
|
|
|
- <!-- 客服 -->
|
|
|
|
- <CustomerCorner :scroll-status="scrollStatus" bottom-position="12%" />
|
|
|
|
- <ThirdPartyVerifyPopup
|
|
|
|
- v-model="popup.thirdPartyVerify"
|
|
|
|
- :before-leave-page="beforeLeavePage"
|
|
|
|
- />
|
|
|
|
- <CheckUserDialog />
|
|
|
|
- <appShareSheet
|
|
|
|
- v-model="shareShow"
|
|
|
|
- popup-title="分享有礼"
|
|
|
|
- :share-title="shareConf.title"
|
|
|
|
- :share-content="shareConf.content"
|
|
|
|
- :share-link="shareConf.link"
|
|
|
|
- @share="calcAppShareInfo"
|
|
|
|
- >
|
|
|
|
- <div slot="subtitle" class="share-subtitle-container">
|
|
|
|
- <span class="share-subtitle-left j-icon icon-points" />
|
|
|
|
- <span class="share-subtitle-content">
|
|
|
|
- 分享招标信息及文档,好友访问立得剑鱼币
|
|
|
|
- </span>
|
|
|
|
- <a href="/page_points_mobile/share" class="share-subtitle-right">
|
|
|
|
- 了解详情
|
|
|
|
- </a>
|
|
|
|
- </div>
|
|
|
|
- </appShareSheet>
|
|
|
|
- <wxShareGuide v-model="guideMask" />
|
|
|
|
- </div>
|
|
|
|
-</template>
|
|
|
|
-
|
|
|
|
-<script>
|
|
|
|
-import { Icon, Overlay, Skeleton, Tab, Tabs } from 'vant'
|
|
|
|
-import { checkAncestorClass, isElementInScrollArea } from '@jy/util'
|
|
|
|
-import { throttle } from 'lodash'
|
|
|
|
-import { mapActions, mapGetters, mapMutations, mapState } from 'vuex'
|
|
|
|
-import { mixinHeader } from '@/utils/mixins/header'
|
|
|
|
-import { appWxShareMixin } from '@/utils/mixins/modules/app-wx-share'
|
|
|
|
-import ContentHeader from '@/views/article/components/ContentHeader.vue'
|
|
|
|
-import ContentHeaderBannerTip from '@/views/article/components/ContentHeaderBannerTip.vue'
|
|
|
|
-import ContentAbstract from '@/views/article/components/ContentAbstract.vue'
|
|
|
|
-import DataExportBanner from '@/views/article/components/DataExportBanner.vue'
|
|
|
|
-import ContentAbstractEntList from '@/views/article/components/ContentAbstractEntList.vue'
|
|
|
|
-import ContentMainText from '@/views/article/components/ContentMainText.vue'
|
|
|
|
-import ContentProjectTimeline from '@/views/article/components/ContentProjectTimeline.vue'
|
|
|
|
-import ContentTouBiaoService from '@/views/article/components/ContentTouBiaoService.vue'
|
|
|
|
-import ContentBusinessRecommend from '@/views/article/components/ContentBusinessRecommend.vue'
|
|
|
|
-import ContentCustomerRecommend from '@/views/article/components/ContentCustomerRecommend.vue'
|
|
|
|
-import NpsCard from '@/views/article/components/NpsCard.vue'
|
|
|
|
-import TabActions from '@/views/article/components/TabActions.vue'
|
|
|
|
-import AdSingle from '@/components/ad/Ad.vue'
|
|
|
|
-import FreeUserBiddingMask from '@/views/article/components/FreeUserBiddingMask.vue'
|
|
|
|
-import FreeUserAdvancedMask from '@/views/article/components/FreeUserAdvancedMask.vue'
|
|
|
|
-import ThirdPartyVerifyPopup from '@/views/article/components/ThirdPartyVerifyPopup.vue'
|
|
|
|
-import CheckUserDialog from '@/views/identity/components/CheckUserDialog'
|
|
|
|
-import CustomerCorner from '@/components/customer/index'
|
|
|
|
-import Error from '@/views/article/components/Error.vue'
|
|
|
|
-import OneClickBinding from '@/components/one-click-binding/index'
|
|
|
|
-import {
|
|
|
|
- getArticleShareInfo,
|
|
|
|
- getContentShareEncrypt
|
|
|
|
-} from '@/api/modules/article'
|
|
|
|
-import { LINKS } from '@/data'
|
|
|
|
-import { openAppOrWxPage } from '@/utils/'
|
|
|
|
-import setPageTdk from '@/utils/mixins/modules/set-tdk'
|
|
|
|
-
|
|
|
|
-export default {
|
|
|
|
- name: 'ArticleContent',
|
|
|
|
- components: {
|
|
|
|
- [Tabs.name]: Tabs,
|
|
|
|
- [Tab.name]: Tab,
|
|
|
|
- [Icon.name]: Icon,
|
|
|
|
- [Skeleton.name]: Skeleton,
|
|
|
|
- [Overlay.name]: Overlay,
|
|
|
|
- ContentHeader,
|
|
|
|
- ContentHeaderBannerTip,
|
|
|
|
- ContentAbstract,
|
|
|
|
- DataExportBanner,
|
|
|
|
- ContentMainText,
|
|
|
|
- ContentAbstractEntList,
|
|
|
|
- ContentProjectTimeline,
|
|
|
|
- ContentTouBiaoService,
|
|
|
|
- ContentBusinessRecommend,
|
|
|
|
- ContentCustomerRecommend,
|
|
|
|
- FreeUserBiddingMask,
|
|
|
|
- FreeUserAdvancedMask,
|
|
|
|
- ThirdPartyVerifyPopup,
|
|
|
|
- CheckUserDialog,
|
|
|
|
- NpsCard,
|
|
|
|
- TabActions,
|
|
|
|
- AdSingle,
|
|
|
|
- CustomerCorner,
|
|
|
|
- Error,
|
|
|
|
- OneClickBinding
|
|
|
|
- },
|
|
|
|
- mixins: [mixinHeader, setPageTdk, appWxShareMixin],
|
|
|
|
- data() {
|
|
|
|
- const { inApp } = this.$envs
|
|
|
|
- return {
|
|
|
|
- pageLayoutConf: {
|
|
|
|
- actionRightStyle: {
|
|
|
|
- display: 'flex',
|
|
|
|
- flexDirection: 'column',
|
|
|
|
- alignItems: 'center',
|
|
|
|
- color: '#171826',
|
|
|
|
- fontSize: '10px',
|
|
|
|
- lineHeight: '18px'
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- shareEnableConf: {
|
|
|
|
- shareActionImmediate: false,
|
|
|
|
- getDomainImmediate: inApp,
|
|
|
|
- app: true, // 开启app分享
|
|
|
|
- wx: true // 开启wx分享
|
|
|
|
- },
|
|
|
|
- shareConf: {
|
|
|
|
- fetchDomain: true,
|
|
|
|
- title: '',
|
|
|
|
- content: '',
|
|
|
|
- pathname: '',
|
|
|
|
- origin: location.origin,
|
|
|
|
- link: ''
|
|
|
|
- },
|
|
|
|
- shareInfoRes: {},
|
|
|
|
- offsetTop: 0,
|
|
|
|
- // tabList: [
|
|
|
|
- // {
|
|
|
|
- // label: '摘要',
|
|
|
|
- // value: 'abstract'
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // label: '正文',
|
|
|
|
- // value: 'mainText'
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // label: '进度',
|
|
|
|
- // value: 'timeline'
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // label: '投标服务',
|
|
|
|
- // value: 'service'
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // label: '商机推荐',
|
|
|
|
- // value: 'businessRecommend'
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // label: '客户推荐',
|
|
|
|
- // value: 'customerRecommend'
|
|
|
|
- // }
|
|
|
|
- // ],
|
|
|
|
- reqState: {
|
|
|
|
- loading: true,
|
|
|
|
- loaded: false
|
|
|
|
- },
|
|
|
|
- popup: {
|
|
|
|
- thirdPartyVerify: false
|
|
|
|
- },
|
|
|
|
- wxShareCache: {
|
|
|
|
- encryptid: '',
|
|
|
|
- subhref: ''
|
|
|
|
- },
|
|
|
|
- pageState: {
|
|
|
|
- id: '',
|
|
|
|
- tabActive: ''
|
|
|
|
- },
|
|
|
|
- scrollStatus: true,
|
|
|
|
- isError: false,
|
|
|
|
- errorText: ''
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- computed: {
|
|
|
|
- ...mapState({
|
|
|
|
- preAgentInfo: state => state.article.preAgentInfo,
|
|
|
|
- content: state => state.article.mainModel.content,
|
|
|
|
- summary: state => state.article.mainModel.summary,
|
|
|
|
- mainModel: state => state.article.mainModel,
|
|
|
|
- expandModel: state => state.article.expandModel,
|
|
|
|
- otherModel: state => state.article.otherModel,
|
|
|
|
- bindPhone: state => state.article.bindPhone
|
|
|
|
- }),
|
|
|
|
- IsCustomTopNet() {
|
|
|
|
- return this.content.IsCustomTopNet || false
|
|
|
|
- },
|
|
|
|
- yyszbContent() {
|
|
|
|
- return this.content.yyszbContent || location.pathname.includes('/yyszb')
|
|
|
|
- },
|
|
|
|
- toBCustom() {
|
|
|
|
- return (
|
|
|
|
- this.IsCustomTopNet || this.yyszbContent || this.IsSunPublishContent
|
|
|
|
- )
|
|
|
|
- },
|
|
|
|
- showMonitor() {
|
|
|
|
- return !this.yyszbContent
|
|
|
|
- },
|
|
|
|
- hasPowerToReadSunPublishContent() {
|
|
|
|
- return this.content.hasPowerToReadSunPublishContent || false
|
|
|
|
- },
|
|
|
|
- IsSunPublishContent() {
|
|
|
|
- return this.content.IsSunPublishContent || false
|
|
|
|
- },
|
|
|
|
- showContentHeaderBannerTip() {
|
|
|
|
- if (this.toBCustom) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- return this.content.recommendedService
|
|
|
|
- },
|
|
|
|
- openid() {
|
|
|
|
- return this.preAgentInfo.openid
|
|
|
|
- },
|
|
|
|
- ...mapGetters('user', [
|
|
|
|
- 'isLogin',
|
|
|
|
- 'isSuper',
|
|
|
|
- 'isMember',
|
|
|
|
- 'isNewBusiness',
|
|
|
|
- 'bigMemberPower'
|
|
|
|
- ]),
|
|
|
|
- canReadConf() {
|
|
|
|
- if (this.IsSunPublishContent) {
|
|
|
|
- return {
|
|
|
|
- show: this.content.isCanRead, // 是否展示全部内容
|
|
|
|
- showContentModule: this.hasPowerToReadSunPublishContent
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return {
|
|
|
|
- show: this.content.isCanRead,
|
|
|
|
- showContentModule: true
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- canShowNpsModule() {
|
|
|
|
- if (this.IsCustomTopNet) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- if (this.yyszbContent) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- return this.canReadConf.show
|
|
|
|
- },
|
|
|
|
- showTabActions() {
|
|
|
|
- if (this.toBCustom) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- return this.canReadConf.show
|
|
|
|
- },
|
|
|
|
- baseModuleShow() {
|
|
|
|
- return this.mainModel.moduleShow
|
|
|
|
- },
|
|
|
|
- advancedModuleShow() {
|
|
|
|
- const { tbService, customerRecommend, timeline, zbRecommend }
|
|
|
|
- = this.expandModel.moduleShow
|
|
|
|
- const toBCustom
|
|
|
|
- = this.IsCustomTopNet || this.IsSunPublishContent || this.yyszbContent
|
|
|
|
- return Object.assign({}, this.expandModel.moduleShow, {
|
|
|
|
- tbService: toBCustom ? false : tbService,
|
|
|
|
- customerRecommend: toBCustom ? false : customerRecommend,
|
|
|
|
- timeline: toBCustom ? false : timeline,
|
|
|
|
- zbRecommend: toBCustom ? false : zbRecommend
|
|
|
|
- })
|
|
|
|
- },
|
|
|
|
- // 客户推荐模块是否展示
|
|
|
|
- customerRecommendModuleShow() {
|
|
|
|
- if (this.IsCustomTopNet) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- if (this.toBCustom) {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- // 如果是有权限用户(权限7),则有数据展示,无数据不展示。无权限7用户则一直展示,展示广告引导
|
|
|
|
- if (this.hasCustomerModulePower) {
|
|
|
|
- return this.advancedModuleShow.customerRecommend
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- hasCustomerModulePower() {
|
|
|
|
- // 潜在客户挖掘权限。权限7
|
|
|
|
- return this.expandModel.recommendCustomers?.isPower
|
|
|
|
- },
|
|
|
|
- getContentAdID() {
|
|
|
|
- const sun = this.IsSunPublishContent ? '-sun' : ''
|
|
|
|
- return `${this.$envs.inWX ? 'jy' : 'jyapp'}${sun}-wxcontent-bottom`
|
|
|
|
- },
|
|
|
|
- getContentAdID() {
|
|
|
|
- return `${this.$envs.inWX ? 'jy' : 'jyapp'}-wxcontent-bottom`
|
|
|
|
- },
|
|
|
|
- // 是否展示绑定手机号弹窗
|
|
|
|
- showBindPhone() {
|
|
|
|
- const { wxpush } = this.$route?.query
|
|
|
|
- return wxpush === 'bind' && this.$envs.inWX && !this.isBindPhone
|
|
|
|
- },
|
|
|
|
- // 从baseInfo获取是否绑定手机号(P607新增)
|
|
|
|
- isBindPhone() {
|
|
|
|
- return this.bindPhone
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- async created() {
|
|
|
|
- this.appHeaderActions()
|
|
|
|
- await this.getPageState()
|
|
|
|
- this.initAppWxShare()
|
|
|
|
- },
|
|
|
|
- mounted() {
|
|
|
|
- this.getStickyOffset()
|
|
|
|
- this.restoreScrollTop()
|
|
|
|
- },
|
|
|
|
- methods: {
|
|
|
|
- ...mapMutations('article', [
|
|
|
|
- 'setOtherModelChild',
|
|
|
|
- 'setMainContentModelChild'
|
|
|
|
- ]),
|
|
|
|
- ...mapActions('article', [
|
|
|
|
- 'pageStateReset',
|
|
|
|
- 'pageStateRestore',
|
|
|
|
- 'saveStateToStorage',
|
|
|
|
- 'getPreAgentInfo',
|
|
|
|
- 'getBaseInfo',
|
|
|
|
- 'getAdvancedInfo'
|
|
|
|
- ]),
|
|
|
|
- finishLoading() {
|
|
|
|
- this.reqState.loading = false
|
|
|
|
- this.reqState.loaded = true
|
|
|
|
- },
|
|
|
|
- async getPageState() {
|
|
|
|
- // 1. 重置数据
|
|
|
|
- await this.pageStateReset()
|
|
|
|
- this.getParams()
|
|
|
|
- // 2. 检测缓存
|
|
|
|
- this.storage = await this.pageStateRestore()
|
|
|
|
- if (this.storage) {
|
|
|
|
- // 缓存中获取,恢复滚动高度
|
|
|
|
- this.finishLoading()
|
|
|
|
- this.$nextTick(() => {
|
|
|
|
- // console.log('恢复滚动高度', this.storage)
|
|
|
|
- const scrollWrapper = this.$refs.scrollWrapper
|
|
|
|
- if (scrollWrapper) {
|
|
|
|
- scrollWrapper.scrollTop = this.otherModel.scrollTop
|
|
|
|
- }
|
|
|
|
- this.checkNpsView()
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- try {
|
|
|
|
- await this.getPreAgentInfo()
|
|
|
|
- const { data, msg } = await this.getBaseInfo()
|
|
|
|
- if (data) {
|
|
|
|
- this.finishLoading()
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.finishLoading()
|
|
|
|
- this.isError = true
|
|
|
|
- // 无效参数 = d解析错误
|
|
|
|
- // 未查到当前招标信息 = 文章不存在
|
|
|
|
- if (msg.includes('未查到当前招标信息')) {
|
|
|
|
- this.errorText = '由于相关部门要求,该信息已下架,敬请原谅'
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.errorText = '该页面信息不存在'
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- catch (error) {
|
|
|
|
- console.error(error)
|
|
|
|
- }
|
|
|
|
- finally {
|
|
|
|
- // console.log('基础接口请求完成')
|
|
|
|
- }
|
|
|
|
- if (this.canReadConf.show) {
|
|
|
|
- this.getAdvancedInfo()
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- this.changeTdk()
|
|
|
|
- },
|
|
|
|
- changeTdk() {
|
|
|
|
- const { title, keywords, description } = this.content.tdk || {}
|
|
|
|
- const { listShareTitle } = this.content
|
|
|
|
- this.setPageTdkCall({
|
|
|
|
- title,
|
|
|
|
- keywords,
|
|
|
|
- description
|
|
|
|
- })
|
|
|
|
- this.setAMiniProgramShareTitle(title, listShareTitle)
|
|
|
|
- },
|
|
|
|
- setAMiniProgramShareTitle(title, otherTitle) {
|
|
|
|
- // if (!this.$envs.inWxMini) return
|
|
|
|
- let subType = ''
|
|
|
|
- try {
|
|
|
|
- subType = this.content?._ob?.subType
|
|
|
|
- }
|
|
|
|
- catch (error) {
|
|
|
|
- console.log(error)
|
|
|
|
- }
|
|
|
|
- let prefix = ''
|
|
|
|
- if (subType) {
|
|
|
|
- prefix = `【${subType}】`
|
|
|
|
- }
|
|
|
|
- const newTitle = prefix + title
|
|
|
|
- if (otherTitle) {
|
|
|
|
- this.postMessageToMiniProgram(otherTitle)
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.postMessageToMiniProgram(newTitle)
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- postMessageToMiniProgram(title) {
|
|
|
|
- try {
|
|
|
|
- wx.miniProgram.postMessage({
|
|
|
|
- data: {
|
|
|
|
- post: 'share',
|
|
|
|
- type: 'common',
|
|
|
|
- desc: '标讯详情',
|
|
|
|
- title
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- catch (e) {
|
|
|
|
- console.log(e)
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- getParams() {
|
|
|
|
- const { params } = this.$route
|
|
|
|
- // 保持获取到的id和接口返回的id一致
|
|
|
|
- this.pageState.id = params.id
|
|
|
|
- this.setMainContentModelChild({ key: 'id', data: this.pageState.id })
|
|
|
|
- },
|
|
|
|
- appHeaderActions() {
|
|
|
|
- const { $envs } = this
|
|
|
|
- if (!$envs.inApp)
|
|
|
|
- return
|
|
|
|
- if (this.yyszbContent) {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- const actionRightConf = {
|
|
|
|
- actionRightText:
|
|
|
|
- '<div class="j-icon icon-points" style="width:24px;height:24px"></div><p>分享有礼</p>',
|
|
|
|
- onClickRight: this.clickRight
|
|
|
|
- }
|
|
|
|
- for (const key in actionRightConf) {
|
|
|
|
- this.$set(this.pageLayoutConf, key, actionRightConf[key])
|
|
|
|
- }
|
|
|
|
- this.mergePageConf()
|
|
|
|
- },
|
|
|
|
- getStickyOffset() {
|
|
|
|
- const header = document.querySelector('.common-app-header')
|
|
|
|
- if (header) {
|
|
|
|
- const offsetTop = header?.clientHeight || 0
|
|
|
|
- if (offsetTop > 0) {
|
|
|
|
- this.offsetTop = offsetTop - 1
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- onScrollWrapperClick(e) {
|
|
|
|
- const checkUnderline = checkAncestorClass(e, 'keyword-underline', 3)
|
|
|
|
- // project-name事件委托
|
|
|
|
- if (checkUnderline.status) {
|
|
|
|
- this.clickKeywordUnderline(e)
|
|
|
|
- }
|
|
|
|
- else if (e.target.classList.contains('free-view')) {
|
|
|
|
- this.clickFreeView(e)
|
|
|
|
- }
|
|
|
|
- else if (e.target.className.includes('third-party-popover')) {
|
|
|
|
- this.popup.thirdPartyVerify = true
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- // 页面下划线高内容亮事件委托
|
|
|
|
- clickKeywordUnderline(e) {
|
|
|
|
- const checkProjectName = checkAncestorClass(e, 'project-name', 3)
|
|
|
|
- const checkWinnerName = checkAncestorClass(e, 'winner-name', 3)
|
|
|
|
- if (checkProjectName.status) {
|
|
|
|
- // 标题跳转添加ABTest手机号绑定弹框
|
|
|
|
- this.$testBindPhone({
|
|
|
|
- props: {
|
|
|
|
- name: '标讯详情页-标题'
|
|
|
|
- },
|
|
|
|
- next: () => {
|
|
|
|
- this.goMemberFollowPage()
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- else if (checkWinnerName.status) {
|
|
|
|
- this.goToEntPortraitPage(checkWinnerName.target)
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- goMemberFollowPage() {
|
|
|
|
- const { _ob } = this.content || {}
|
|
|
|
- const { fid, id } = this.otherModel.projectFollowState || {}
|
|
|
|
- const params = {
|
|
|
|
- fid,
|
|
|
|
- sid: id
|
|
|
|
- }
|
|
|
|
- sessionStorage.setItem('bigvip-fid', JSON.stringify(params))
|
|
|
|
- this.beforeLeavePage()
|
|
|
|
- if (this.isNewBusiness) {
|
|
|
|
- openAppOrWxPage(LINKS.商机管理项目进度监控, {
|
|
|
|
- query: {
|
|
|
|
- from: 'client',
|
|
|
|
- industry: _ob ? _ob.buyerClass : undefined
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- openAppOrWxPage(LINKS.项目详情页)
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- goToEntPortraitPage(target) {
|
|
|
|
- const id = target.dataset.eid
|
|
|
|
- const eName = target.innerText
|
|
|
|
- ?.replace(/#/g, '%23')
|
|
|
|
- ?.replace(/\?/g, '%3F')
|
|
|
|
- if (!id) {
|
|
|
|
- return this.$toast('暂无数据')
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- const noPower
|
|
|
|
- = !this.bigMemberPower.includes(4)
|
|
|
|
- && !this.bigMemberPower.includes(12)
|
|
|
|
- && !this.bigMemberPower.includes(13)
|
|
|
|
- if (this.isMember && noPower) {
|
|
|
|
- if (eName) {
|
|
|
|
- this.beforeLeavePage()
|
|
|
|
- openAppOrWxPage({
|
|
|
|
- wx: LINKS.旧版企业信息前缀.wx + eName,
|
|
|
|
- app: LINKS.旧版企业信息前缀.app + eName,
|
|
|
|
- h5: LINKS.旧版企业信息前缀.h5 + eName
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return this.$toast('暂无数据')
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.beforeLeavePage()
|
|
|
|
- sessionStorage.removeItem('$data-ent_portrait')
|
|
|
|
- openAppOrWxPage(LINKS.企业画像页面, {
|
|
|
|
- query: {
|
|
|
|
- eId: id
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- clickFreeView() {
|
|
|
|
- this.$testBindPhone({
|
|
|
|
- props: {
|
|
|
|
- name: '标讯详情页-采购联系人/联系电话'
|
|
|
|
- },
|
|
|
|
- next: () => {
|
|
|
|
- this.beforeLeavePage()
|
|
|
|
- let source = 'peugeot_view_infor'
|
|
|
|
- if (this.toBCustom) {
|
|
|
|
- source = `${this.$env.platform}_sunlight_viewdetails`
|
|
|
|
- }
|
|
|
|
- openAppOrWxPage(LINKS.留资, {
|
|
|
|
- query: {
|
|
|
|
- source,
|
|
|
|
- infoid: this.content.id
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- },
|
|
|
|
- beforeLeavePage() {
|
|
|
|
- this.saveStateToStorage()
|
|
|
|
- // 返回true,广告位才能正常跳转
|
|
|
|
- return true
|
|
|
|
- },
|
|
|
|
- clickRight() {
|
|
|
|
- this.checkTestBindPhone('标讯详情页-分享有礼', this.doShare)
|
|
|
|
- },
|
|
|
|
- doShare() {
|
|
|
|
- this.shareShow = true
|
|
|
|
- },
|
|
|
|
- async initAppWxShare() {
|
|
|
|
- if (this.$envs.inWX) {
|
|
|
|
- try {
|
|
|
|
- await this.getShareInfoReq()
|
|
|
|
- }
|
|
|
|
- catch (error) {
|
|
|
|
- console.log(error)
|
|
|
|
- }
|
|
|
|
- await this.calcWxShareInfo()
|
|
|
|
- this.initShareMixin()
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.getShareInfoReq()
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- async getShareInfoReq() {
|
|
|
|
- const {
|
|
|
|
- data = {},
|
|
|
|
- error_code: code,
|
|
|
|
- error_msg: msg = ''
|
|
|
|
- } = await getArticleShareInfo()
|
|
|
|
- if (code === 0 && data) {
|
|
|
|
- this.shareInfoRes = data
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- async calcWxShareInfo() {
|
|
|
|
- const host = location.host
|
|
|
|
- const id = this.content.id
|
|
|
|
- const openid = this.openid ? encodeURIComponent(this.openid) : '-1'
|
|
|
|
-
|
|
|
|
- // 计算title
|
|
|
|
- const title = this.content.title
|
|
|
|
- .replace(/<\/?.+?>/g, '')
|
|
|
|
- .replace(/ /g, '')
|
|
|
|
-
|
|
|
|
- // 计算content
|
|
|
|
- const contentList = ['您的好友']
|
|
|
|
- // 分享到微信或者朋友圈带上昵称
|
|
|
|
- if (this.shareInfoRes.nickname) {
|
|
|
|
- contentList.push(this.shareInfoRes.nickname)
|
|
|
|
- }
|
|
|
|
- contentList.push('向您推荐了剑鱼标讯')
|
|
|
|
- const content = contentList.join('')
|
|
|
|
-
|
|
|
|
- let link = `${host}/swordfish/about?param=${openid}__jy_extend&qrcodeType=wx_infocontent_timeline_z`
|
|
|
|
- if (window.location.href.includes('open_infocontent')) {
|
|
|
|
- const query = window.location.search.slice(1)
|
|
|
|
- link += `${query}`
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- link += '&source=wx_infocontentshare'
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- let subhref = location.href
|
|
|
|
- let encryptid = ''
|
|
|
|
- if (id) {
|
|
|
|
- try {
|
|
|
|
- const data = await getContentShareEncrypt({ id })
|
|
|
|
- if (data.flag === 'T') {
|
|
|
|
- encryptid = data.sid_openid
|
|
|
|
- this.wxShareCache.encryptid = encryptid
|
|
|
|
- const add1 = subhref.substring(0, subhref.indexOf('/content/'))
|
|
|
|
- const add2 = subhref.substring(subhref.indexOf('.html'))
|
|
|
|
- subhref = `${add1}/content/${encryptid}${add2}`
|
|
|
|
- this.wxShareCache.subhref = subhref
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- catch (error) {
|
|
|
|
- console.warn(error)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (encryptid) {
|
|
|
|
- link = subhref
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- link = window.location.href
|
|
|
|
- }
|
|
|
|
- if (!link.includes('?')) {
|
|
|
|
- link += '?'
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- link += '&'
|
|
|
|
- }
|
|
|
|
- if (!encryptid) {
|
|
|
|
- link += `openid=${openid}&`
|
|
|
|
- }
|
|
|
|
- link += 'source=wx_infocontentshare'
|
|
|
|
-
|
|
|
|
- this.shareConf.title = title
|
|
|
|
- this.shareConf.content = content
|
|
|
|
- this.shareConf.link = link
|
|
|
|
-
|
|
|
|
- // const url = new URL(link)
|
|
|
|
- // this.shareConf.pathname = url.pathname
|
|
|
|
- // this.refreshShareLink()
|
|
|
|
- console.log(JSON.stringify(this.shareConf))
|
|
|
|
- },
|
|
|
|
- calcAppShareInfo(t) {
|
|
|
|
- const shareType = t.id
|
|
|
|
-
|
|
|
|
- const contentList = ['您的好友']
|
|
|
|
- // 分享到微信或者朋友圈带上昵称
|
|
|
|
- if (this.shareInfoRes.nickname && shareType !== 2) {
|
|
|
|
- contentList.push(this.shareInfoRes.nickname)
|
|
|
|
- }
|
|
|
|
- contentList.push('向您推荐了剑鱼标讯')
|
|
|
|
- const content = contentList.join('')
|
|
|
|
-
|
|
|
|
- const shareToWx = shareType === 1 || shareType === 3
|
|
|
|
-
|
|
|
|
- let link = `/swordfish/about?source=app_infocontentshare&from=${
|
|
|
|
- this.shareInfoRes.userId || ''
|
|
|
|
- }`
|
|
|
|
- let shareTitle = this.content.title
|
|
|
|
- .replace(/<\/?.+?>/g, '')
|
|
|
|
- .replace(/ /g, '')
|
|
|
|
- if (shareType === 1) {
|
|
|
|
- // 分享给微信好友
|
|
|
|
- link = location.pathname
|
|
|
|
- .replace(import.meta.env.VITE_APP_BASE_URL, '')
|
|
|
|
- .replace('/jyapp', '')
|
|
|
|
- if (location.search) {
|
|
|
|
- link += `${location.search}&source=app_infocontentshare&from=${
|
|
|
|
- this.shareInfoRes.userId || ''
|
|
|
|
- }`
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- link += `?source=app_infocontentshare&from=${
|
|
|
|
- this.shareInfoRes.userId || ''
|
|
|
|
- }`
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else if (shareType === 3) {
|
|
|
|
- // 分享到朋友圈
|
|
|
|
- link += '&qrcodeType=app_infocontent_timeline_z'
|
|
|
|
- shareTitle = this.getRandomShareText()
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- this.shareConf.title = shareTitle
|
|
|
|
- this.shareConf.content = content
|
|
|
|
- this.shareConf.pathname = link
|
|
|
|
- // this.shareConf.link = link
|
|
|
|
- if (this.$envs.inApp && shareToWx) {
|
|
|
|
- this.refreshShareLink(this.domainConf.wx)
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.refreshShareLink()
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- onScroll: throttle(function (e) {
|
|
|
|
- this.checkNpsView()
|
|
|
|
- this.saveScrollTop()
|
|
|
|
- this.scrollStatus = e.target.scrollTop < 60
|
|
|
|
- }, 300),
|
|
|
|
- saveScrollTop() {
|
|
|
|
- const scrollWrapper = this.$refs.scrollWrapper
|
|
|
|
- const scrollTop = scrollWrapper.scrollTop
|
|
|
|
- this.setOtherModelChild({
|
|
|
|
- key: 'scrollTop',
|
|
|
|
- data: Number.parseInt(scrollTop)
|
|
|
|
- })
|
|
|
|
- },
|
|
|
|
- restoreScrollTop() {
|
|
|
|
- // const toDayShow = this.$storage.get(this.cacheKey, false)
|
|
|
|
- // const scrollWrapper = this.$refs.scrollWrapper
|
|
|
|
- },
|
|
|
|
- checkNpsView() {
|
|
|
|
- const targetVm = this.$refs.npsCard
|
|
|
|
- if (!targetVm)
|
|
|
|
- return
|
|
|
|
- const target = targetVm.$el
|
|
|
|
- const scrollWrapper = this.$refs.scrollWrapper
|
|
|
|
- const visible = isElementInScrollArea(target, scrollWrapper)
|
|
|
|
- if (visible) {
|
|
|
|
- targetVm.getIsView()
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- checkTestBindPhone(name, next) {
|
|
|
|
- this.$testBindPhone({
|
|
|
|
- props: {
|
|
|
|
- name
|
|
|
|
- },
|
|
|
|
- next
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-</script>
|
|
|
|
-
|
|
|
|
-<style lang="scss" scoped>
|
|
|
|
-::v-deep {
|
|
|
|
- .van-tabs__wrap {
|
|
|
|
- padding-bottom: 4px;
|
|
|
|
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
|
|
|
- }
|
|
|
|
- .van-tabs__line {
|
|
|
|
- width: 24px;
|
|
|
|
- }
|
|
|
|
- .van-tab {
|
|
|
|
- padding: 0 8px;
|
|
|
|
- color: #5f5e64;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- .tab-module.content-module-card {
|
|
|
|
- margin-top: 8px;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- .keyword-underline {
|
|
|
|
- border-bottom: 1px solid $main;
|
|
|
|
- padding-bottom: 1px;
|
|
|
|
- }
|
|
|
|
- .keyword.hide-underline {
|
|
|
|
- border-bottom-width: 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- .van-skeleton {
|
|
|
|
- padding-top: 24px;
|
|
|
|
- height: 100%;
|
|
|
|
- .van-skeleton__row {
|
|
|
|
- height: 20px;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.show-underline {
|
|
|
|
- ::v-deep {
|
|
|
|
- .hide-underline {
|
|
|
|
- border-bottom-width: 1px;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.small-tab {
|
|
|
|
- ::v-deep {
|
|
|
|
- .van-tab {
|
|
|
|
- flex: none;
|
|
|
|
- }
|
|
|
|
- .van-tabs__nav {
|
|
|
|
- padding-left: 16px;
|
|
|
|
- padding-right: 16px;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.page-container {
|
|
|
|
- height: calc(100% - 1px - 1px);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.nps-module {
|
|
|
|
- margin-top: 8px;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.content-abstract-ent-list-module + .data-export-banner-module {
|
|
|
|
- padding-top: 0;
|
|
|
|
-}
|
|
|
|
-.content-abstract-other {
|
|
|
|
- border-top: 0.5px solid rgba(0, 0, 0, 0.05);
|
|
|
|
- padding: 12px;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.share-subtitle-container {
|
|
|
|
- display: flex;
|
|
|
|
- align-items: center;
|
|
|
|
- white-space: nowrap;
|
|
|
|
- font-size: 13px;
|
|
|
|
- padding: 0 16px;
|
|
|
|
- .share-subtitle-content {
|
|
|
|
- margin: 0 6px;
|
|
|
|
- }
|
|
|
|
- .share-subtitle-right {
|
|
|
|
- color: $main;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.mg-box {
|
|
|
|
- margin: 8px 16px;
|
|
|
|
- margin-bottom: 32px;
|
|
|
|
-}
|
|
|
|
-.custom-overlay {
|
|
|
|
- background: linear-gradient(#ededed66 80%, #f9f9f9 100%);
|
|
|
|
-}
|
|
|
|
-.z-index10 {
|
|
|
|
- position: relative;
|
|
|
|
- z-index: 10;
|
|
|
|
-}
|
|
|
|
-.no-scroll {
|
|
|
|
- overflow: hidden;
|
|
|
|
-}
|
|
|
|
-</style>
|
|
|
|
-
|
|
|
|
-<style>
|
|
|
|
-.no-select {
|
|
|
|
- user-select: unset !important;
|
|
|
|
-}
|
|
|
|
-</style>
|
|
|