Эх сурвалжийг харах

fix: 测试4

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 3 сар өмнө
parent
commit
6a90ed136a

+ 1023 - 0
apps/mobile/src/views/article/content.vue

@@ -0,0 +1,1023 @@
+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>