detail.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. <template>
  2. <div class="page" id="page">
  3. <div class="top-title wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  4. <div class="report-detail-nav top-container">
  5. <n-icon :component="IosFiling" size="40" style="vertical-align: middle" />
  6. <span>{{ t("common.navigate.report") }}</span>
  7. </div>
  8. </div>
  9. <div class="page-nav-container">
  10. <div class="nav-txt wow fadeInLeft" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  11. <n-breadcrumb separator=">">
  12. <n-breadcrumb-item>
  13. <n-icon :component="MdHome" /><router-link to="/home">{{
  14. t("common.navigate.home")
  15. }}</router-link>
  16. </n-breadcrumb-item>
  17. <n-breadcrumb-item>
  18. <n-icon :component="IosFiling" />{{ t("common.navigate.report") }}
  19. </n-breadcrumb-item>
  20. </n-breadcrumb>
  21. </div>
  22. </div>
  23. <div class="report-detail" id="report-detail">
  24. <div class="container detail-container">
  25. <div class="detail-info">
  26. <div class="detail-box wow fadeInLeft" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  27. <div class="img">
  28. <img :src="BaseUrl + '/report/' + record?.fileName" />
  29. </div>
  30. <div class="desc">
  31. <h1>{{ record?.title }}</h1>
  32. <div class="desc-dt-box">
  33. <div class="desc-dt-cnt">
  34. <span><b>{{ t("report.category.trdtitle") }}:</b>{{ record?.publishDate }}</span>
  35. <span class="pt-20"><b>{{ t("report.detail.pageNum") }}:</b>{{ pageNum }}</span>
  36. <span class="pt-20"><b>{{ t("report.detail.chart") }}:</b>{{ chartNum }}</span>
  37. </div>
  38. <div v-if="pcBtnShow" class="desc-btns pc-btns">
  39. <n-space>
  40. <n-button type="warning" @click="handleOrder('1')">{{
  41. t("report.detail.sample")
  42. }}</n-button>
  43. </n-space>
  44. </div>
  45. </div>
  46. <div class="desc-dt-box">
  47. <div class="desc-dt-cnt">
  48. <span><b>{{ t("report.detail.code") }}</b>{{ record?.reportCode }}</span>
  49. <span class="pt-20">
  50. <b>{{ t("report.detail.formTitle") }}</b>
  51. <span class="desc-icon">
  52. <img src="@/assets/images/doc.png" />
  53. <img src="@/assets/images/pdf.png" />
  54. <img src="@/assets/images/xlsx.png" />
  55. </span>
  56. </span>
  57. <span class="pt-20"><b>{{ t("report.detail.deliveyTitle") }}</b>{{ t("report.detail.deliveyDesc") }}</span>
  58. </div>
  59. <div v-if="pcBtnShow" class="desc-btns pc-btns">
  60. <n-space>
  61. <n-button type="info" @click="handleOrder('2')">{{
  62. t("report.detail.custom")
  63. }}</n-button>
  64. </n-space>
  65. </div>
  66. </div>
  67. </div>
  68. <div v-if="!pcBtnShow" class="mobile-btns">
  69. <n-space>
  70. <n-button type="warning" @click="handleOrder('1')">{{
  71. t("report.detail.sample")
  72. }}</n-button>
  73. </n-space>
  74. <n-space>
  75. <n-button type="info" @click="handleOrder('2')">{{
  76. t("report.detail.custom")
  77. }}</n-button>
  78. </n-space>
  79. </div>
  80. <div class="horizontal-line">
  81. <hr />
  82. </div>
  83. <div class="btns">
  84. <a @click="handleIntegrity">{{ t("report.detail.integrity") }}</a>
  85. <a @click="handleBusiness">{{
  86. t("report.detail.btnEnterprise")
  87. }}</a>
  88. </div>
  89. </div>
  90. <div class="detail-price full-version wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  91. <n-table size="large">
  92. <thead>
  93. <tr>
  94. <th class="version-title" @click="showPrice">
  95. {{ t("report.detail.version") }}
  96. </th>
  97. </tr>
  98. </thead>
  99. <transition>
  100. <tbody v-if="tbodyShow">
  101. <tr v-for="vo in priceFullList">
  102. <td class="price-one">
  103. <n-radio size="large" :checked="vo?.configValue === price" @change="handlePrice($event, vo?.configValue)">
  104. {{
  105. vo.configName?.split("-")[3] == "单用户版单价"
  106. ? t("report.detail.singlePrice")
  107. : vo.configName?.split("-")[3] == "多用户版单价"
  108. ? t("report.detail.multiPrice")
  109. : t("report.detail.enterprisePrice02")
  110. }}
  111. </n-radio>
  112. <div class="price-desc">
  113. {{
  114. (lang == "zh-CN" ? "¥ " : "") +
  115. (vo?.configValue + ".00") +
  116. (lang == "en-US" ? " USD" : "")
  117. }}
  118. </div>
  119. </td>
  120. </tr>
  121. <!-- <tr>
  122. <td class="price-one">
  123. <n-radio size="large" :checked="record?.multiPrice === price" @change="handlePrice($event,record?.multiPrice)">{{t('report.detail.multi')}}</n-radio>
  124. <div>¥{{ record?.multiPrice?.toFixed(2) }}</div>
  125. </td>
  126. </tr>
  127. <tr>
  128. <td class="price-one">
  129. <n-radio size="large" :checked="record?.enterprisePrice === price" @change="handlePrice($event,record?.enterprisePrice)">{{ t('report.detail.enterpriseV') }}</n-radio>
  130. <div>¥{{ record?.enterprisePrice?.toFixed(2) }}</div>
  131. </td>
  132. </tr> -->
  133. <tr>
  134. <td class="price-one">
  135. <a class="price-btn price-buy" @click="handleDemand">{{
  136. t("report.detail.buy")
  137. }}</a>
  138. <a class="price-btn" @click="handleDemand">{{
  139. t("report.detail.link")
  140. }}</a>
  141. </td>
  142. </tr>
  143. </tbody>
  144. </transition>
  145. </n-table>
  146. </div>
  147. <div class="detail-price enterprise-price wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  148. <n-table size="large">
  149. <thead>
  150. <tr>
  151. <th class="version-title" @click="showPrice">
  152. {{ t("report.detail.enterprisePrice") }}
  153. </th>
  154. </tr>
  155. </thead>
  156. <transition>
  157. <tbody v-if="tbodyShow">
  158. <tr v-for="vo in priceList">
  159. <td class="price-one">
  160. <n-radio size="large" :checked="vo?.configValue === price" @change="handlePrice($event, vo?.configValue)">
  161. {{
  162. vo.configName?.split("-")[3] == "单用户版单价"
  163. ? t("report.detail.singlePrice")
  164. : vo.configName?.split("-")[3] == "多用户版单价"
  165. ? t("report.detail.multiPrice")
  166. : t("report.detail.enterprisePrice02")
  167. }}
  168. </n-radio>
  169. <div class="price-desc">
  170. {{
  171. (lang == "zh-CN" ? "¥ " : "") +
  172. (vo?.configValue + ".00") +
  173. (lang == "en-US" ? " USD" : "")
  174. }}
  175. </div>
  176. </td>
  177. </tr>
  178. <tr>
  179. <td class="price-one">
  180. <a class="price-btn price-buy" @click="handleDemand">{{
  181. t("report.detail.buy")
  182. }}</a>
  183. <a class="price-btn" @click="handleDemand">{{
  184. t("report.detail.link")
  185. }}</a>
  186. </td>
  187. </tr>
  188. </tbody>
  189. </transition>
  190. </n-table>
  191. </div>
  192. </div>
  193. <div class="detail-statement wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  194. <div class="detail-statement-title">
  195. {{ t("report.detail.statement") }}:
  196. </div>
  197. <div class="detail-statement-content">
  198. {{ t("report.detail.statementCnt") }}
  199. </div>
  200. <div class="detail-statement-attent">
  201. {{ t("report.detail.statementAtn") }}
  202. </div>
  203. </div>
  204. <div class="detail-content wow fadeInDown" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  205. <div class="detail-content-mr">
  206. <div class="detail-integrity" ref="detailIntegrityRef">
  207. <n-tabs justify-content="space-evenly" size="large" pane-style="border-top: 1px solid #e1e1e1;padding: 20px" :animated="true" tab-style="padding:20px;">
  208. <n-tab-pane :name="t('report.detail.scope')" display-directive="show">
  209. <!-- -->
  210. <h2 class="market-title_h2" v-if="record?.marketScale || record?.marketDriven">
  211. {{ t("report.detail.marketOverview") }}
  212. </h2>
  213. <div v-html="record?.reportScopeHtmlCopy"></div>
  214. <!-- <div class="detail-Market-overview" v-if="record?.generalization">
  215. <div class="market-title">
  216. <h2>{{ t('report.detail.marketOverview') }}</h2>
  217. <div class="open-off" @click="offMarketOverview = !offMarketOverview">
  218. {{ offMarketOverview ? t('report.detail.packUp') : t('report.detail.open') }}
  219. <span class="bqfl-iconfont icon-shouqi" :class="{ 'open-icon': offMarketOverview }"></span>
  220. </div>
  221. </div>
  222. <div class="wow fadeInUp" v-html="record?.generalization" v-show="offMarketOverview"></div>
  223. </div> -->
  224. </n-tab-pane>
  225. <n-tab-pane :name="t('report.detail.direct')" display-directive="show">
  226. <!--@click="handleDir" -->
  227. <div class="detail-directory" v-html="record?.directoryHtml"></div>
  228. </n-tab-pane>
  229. <n-tab-pane :name="t('report.detail.chartsDir')" display-directive="show">
  230. <div v-html="record?.chartsHtml"></div>
  231. </n-tab-pane>
  232. </n-tabs>
  233. </div>
  234. <div class="detail-business">
  235. <n-tabs justify-content="space-evenly" size="large" pane-style="border-top: 1px solid #e1e1e1;padding: 20px" :animated="true" tab-style="padding:20px;">
  236. <n-tab-pane :name="t('report.detail.btnEnterprise')">
  237. <div v-html="record?.contextHtml"></div>
  238. </n-tab-pane>
  239. </n-tabs>
  240. </div>
  241. </div>
  242. <div class="detail-content-ml">
  243. <div class="detail-search">
  244. <n-input-group>
  245. <n-button size="large" type="primary" @click="handleSearch" style="padding: 0 10px"><n-icon :component="MdSearch" size="30" color="#fff" /></n-button>
  246. <n-input @keydown.enter="keyDown" type="text" size="large" :placeholder="t('report.content.keyword')" v-model:value="keyword" clearable />
  247. </n-input-group>
  248. </div>
  249. <div class="detail-more">
  250. <div class="more-title">
  251. <h3>{{ t("report.detail.other") }}</h3>
  252. </div>
  253. <div class="more-content">
  254. <template v-for="item in moreList" :key="item">
  255. <a class="more-content-box" :href="
  256. (lang === 'zh-CN' ? '' : '/en') +
  257. '/reports/' +
  258. item.webTitle +
  259. '-' +
  260. item.id
  261. ">
  262. <div class="box-icon">
  263. <n-icon :component="IosRadioButtonOn" color="#18a058" />
  264. </div>
  265. <p class="box-txt">{{ item.title }}</p>
  266. </a>
  267. </template>
  268. </div>
  269. </div>
  270. <div class="detail-process">
  271. <div class="detail-title">
  272. <h3>{{ t("common.navAboutUs.order") }}</h3>
  273. </div>
  274. <div class="detail-content">
  275. <div class="process-box">
  276. <!-- <div class="process-icon"><div class="process-icon-title pt1">{{ t('aboutUs.order.pFstTile') }}</div></div> -->
  277. <h3 class="process-title">
  278. {{ t("aboutUs.order.pFstTile") }}
  279. </h3>
  280. <div class="process-content">
  281. <p>{{ t("aboutUs.order.pFstDesc01") }}</p>
  282. <p>{{ t("aboutUs.order.pFstDesc02") }}</p>
  283. </div>
  284. </div>
  285. <!-- <div class="process-arrow"><span class="icon iconfont icon-iconset0435 f50 color01"></span></div> -->
  286. <div class="process-box">
  287. <!-- <div class="process-icon"><div class="process-icon-title pt2">{{ t('aboutUs.order.pSndTitle') }}</div></div> -->
  288. <h3 class="process-title">
  289. {{ t("aboutUs.order.pSndTitle") }}
  290. </h3>
  291. <div class="process-content">
  292. <p>{{ t("aboutUs.order.pSndDesc01") }}</p>
  293. <p>{{ t("aboutUs.order.pSndDesc02") }}</p>
  294. </div>
  295. </div>
  296. <!-- <div class="process-arrow"><span class="icon iconfont icon-iconset0435 f50 color02"></span></div> -->
  297. <div class="process-box">
  298. <!-- <div class="process-icon"><div class="process-icon-title pt3">{{ t('aboutUs.order.pThrTitle') }}</div></div> -->
  299. <h3 class="process-title">
  300. {{ t("aboutUs.order.pThrTitle") }}
  301. </h3>
  302. <div class="process-content">
  303. <p>{{ t("aboutUs.order.pThrDesc01") }}</p>
  304. <p>{{ t("aboutUs.order.pThrDesc02") }}</p>
  305. <!-- <p>{{ t('aboutUs.order.pThrDesc03') }}</p> -->
  306. </div>
  307. </div>
  308. <!-- <div class="process-arrow"><span class="icon iconfont icon-iconset0435 f50 color03"></span></div> -->
  309. <div class="process-box">
  310. <!-- <div class="process-icon"><div class="process-icon-title pt4">{{ t('aboutUs.order.pForTitle') }}</div></div> -->
  311. <h3 class="process-title">
  312. {{ t("aboutUs.order.pForTitle") }}
  313. </h3>
  314. <div class="process-content">
  315. <p>{{ t("aboutUs.order.pForDesc01") }}</p>
  316. <p>{{ t("aboutUs.order.pForDesc02") }}</p>
  317. <p>{{ t("aboutUs.order.pForDesc03") }}</p>
  318. </div>
  319. </div>
  320. <!-- <div class="process-arrow"><span class="icon iconfont icon-iconset0435 f50 color04"></span></div> -->
  321. <div class="process-box">
  322. <!-- <div class="process-icon"><div class="process-icon-title pt5">{{ t('aboutUs.order.pFivTitle') }}</div></div> -->
  323. <h3 class="process-title">
  324. {{ t("aboutUs.order.pFivTitle") }}
  325. </h3>
  326. <div class="process-content">
  327. <p>{{ t("aboutUs.order.pFivDesc") }}</p>
  328. </div>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </div>
  335. </div>
  336. <div class="home-contact" id="home-contact">
  337. <div class="contact-row wow fadeInDown" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  338. <div class="contact-txt">
  339. <span>{{ t("home.custom.sndtitle") }}</span>
  340. </div>
  341. <div class="contact-btn">
  342. <a @click="handleContact">{{ t("home.custom.contact") }}</a>
  343. </div>
  344. </div>
  345. <div class="contact-img wow fadeInUp" data-wow-duration="2s" data-wow-delay="0s" data-wow-offset="0">
  346. <img src="@/assets/images/swtp.jpg" />
  347. </div>
  348. </div>
  349. <n-modal :show="demandShow" preset="dialog" :title="t('report.detail.subscribe')" @close="demandShow = false" @esc="demandShow = false" @mask-click="demandShow = false" :style="'min-width: 40%'">
  350. <demand :rowId="rowId" :rowPrice="rowPrice" :rowType="rowType" :rowRegion="rowRegion" @closeDialog="handleCloseDiag" />
  351. </n-modal>
  352. </div>
  353. </template>
  354. <script lang="ts" setup>
  355. import {
  356. MdHome,
  357. IosFiling,
  358. MdSearch,
  359. IosKeypad,
  360. IosArrowForward,
  361. IosRadioButtonOn,
  362. } from "@vicons/ionicons4";
  363. // import {
  364. // NBreadcrumb,
  365. // NBreadcrumbItem,
  366. // NIcon,
  367. // NTabs,
  368. // NTabPane,
  369. // NTable,
  370. // NRadio,
  371. // NModal,
  372. // NButton,
  373. // NSpace,
  374. // NInputGroup,
  375. // NInput,
  376. // } from "naive-ui";
  377. import { useRoute, useRouter } from "vue-router";
  378. import { onMounted, ref, onUnmounted, onServerPrefetch, inject } from "vue";
  379. import { useI18n } from "#imports";
  380. import { useUserStore } from "@/store/user";
  381. // import cheerio from "cheerio";
  382. const config = useRuntimeConfig();
  383. const BaseUrl = ref(config.public.baseUrl);
  384. const route = useRoute();
  385. const router = useRouter();
  386. const record = ref<ResearchReport>();
  387. const integrityShow = ref("block"); // 完整性
  388. const businessSHow = ref("none"); // 企业数据
  389. const price = ref<string>(); // 选择价格
  390. const demandShow = ref(false); // 需求
  391. const rowId = ref<string>(); // id
  392. const rowPrice = ref<string>(); // 选择版本
  393. const rowType = ref<string>(); // 类型,1.样本,2.定制
  394. const rowRegion = ref<string>(); //版本
  395. const { t } = useI18n();
  396. const priceList = ref<Config[]>(); // 企业版价格(价格清单)
  397. const priceFullList = ref<Config[]>(); // 完整版价格
  398. const pageNum = ref<string>(),
  399. chartNum = ref<string>(); // 页数图表数
  400. const tbodyShow = ref(true); //tbody
  401. const detailIntegrityRef = ref(); //正文目录
  402. //const detailDirListShow = ref<string>('none'); // 正文目录清单显示
  403. const userStore = useUserStore();
  404. const lang = userStore.getLang;
  405. const keyword = ref<string>(""); //关键字
  406. //let indexKeyword: string;
  407. const pcBtnShow = ref<boolean>(true);
  408. const globalTitleKeywordsDescription = inject("globalTitleKeywordsDescription");
  409. const setTitleKeywordsDescription = inject("setTitleKeywordsDescription");
  410. const moreList = ref<ResearchReport[]>();
  411. const offMarketOverview = ref<boolean>(false);
  412. async function getData() {
  413. try {
  414. pcBtnShow.value = !isMobile();
  415. window.addEventListener("scroll", onScroll);
  416. } catch (error) {}
  417. const webTitle = route.params.webTitle;
  418. const wts = webTitle.split("-");
  419. //indexKeyword = route.params.keyword;
  420. const ret = await researchReportForm({ id: wts[wts.length - 1], lang: lang });
  421. if (ret.vo) {
  422. if (ret.vo.reportScopeHtml) {
  423. ret.vo.reportScopeHtmlCopy = `${ret.vo.marketScale || ""}${
  424. ret.vo.marketDriven || ""
  425. }${ret.vo.reportScopeHtml}`;
  426. }
  427. record.value = ret.vo;
  428. let keys = "",
  429. fullKeys = "",
  430. pageKeys = "";
  431. if (lang == "zh-CN") {
  432. if (ret.vo.reportRegion == "1") {
  433. // 全球与中国,1.企业数据,2.完整
  434. keys =
  435. "cn.global.data.single.price,cn.global.data.multi.price,cn.global.data.enterprise.price";
  436. fullKeys =
  437. "cn.global.full.single.price,cn.global.full.multi.price,cn.global.full.enterprise.price";
  438. pageKeys = "cn.global.page.number,cn.global.chart.number";
  439. } else {
  440. // 中国
  441. keys =
  442. "cn.china.data.single.price,cn.china.data.multi.price,cn.china.data.enterprise.price";
  443. fullKeys =
  444. "cn.china.full.single.price,cn.china.full.multi.price,cn.china.full.enterprise.price";
  445. pageKeys = "cn.china.page.number,cn.china.chart.number";
  446. }
  447. } else {
  448. if (ret.vo.reportRegion == "1") {
  449. // 全球与中国,1.企业数据,2.完整
  450. keys =
  451. "en.global.data.single.price,en.global.data.multi.price,en.global.data.enterprise.price";
  452. fullKeys =
  453. "en.global.full.single.price,en.global.full.multi.price,en.global.full.enterprise.price";
  454. pageKeys = "en.global.page.number,en.global.chart.number";
  455. } else {
  456. // 中国
  457. keys =
  458. "en.china.data.single.price,en.china.data.multi.price,en.china.data.enterprise.price";
  459. fullKeys =
  460. "en.china.full.single.price,en.china.full.multi.price,en.china.full.enterprise.price";
  461. pageKeys = "en.china.page.number,en.china.chart.number";
  462. }
  463. }
  464. const c1 = await configList({ keys: keys });
  465. priceList.value = c1;
  466. const c2 = await configList({ keys: fullKeys });
  467. price.value = c2[0].configValue;
  468. priceFullList.value = c2;
  469. const c3 = await configList({ keys: pageKeys });
  470. pageNum.value = c3[0].configValue;
  471. chartNum.value = c3[1].configValue;
  472. moreList.value = ret.list;
  473. return ret.vo;
  474. } else {
  475. const language = lang === "zh-CN" ? "" : "en";
  476. router.push({ name: "reports", params: { lang: language } });
  477. }
  478. let content =
  479. record.value.reportScopeHtml?.split("<p>")[3].split("</p>")[0] || "";
  480. useHead({
  481. title: record.value.title,
  482. viewport: "width=device-width,initial-scale=1,maximum-scale=1 ",
  483. charset: "utf-8",
  484. meta: [
  485. {
  486. hid: "keywords",
  487. name: "keywords",
  488. content: record.value.context + "、" + t("defaultSettings.keyword"),
  489. },
  490. {
  491. hid: "description",
  492. name: "description",
  493. content: getStringContent(content, "span"),
  494. },
  495. ],
  496. });
  497. }
  498. // onMounted(async () => {
  499. // //window.addEventListener('popstate', goBack);
  500. // const data = await getData();
  501. // const titleMetaInfo = getTitleKeywordsDescription(data);
  502. // document.title = titleMetaInfo.title;
  503. // });
  504. onUnmounted(() => {
  505. window.removeEventListener("scroll", onScroll);
  506. });
  507. //返回上一页
  508. // async function goBack(e: Event){
  509. // const back = router.options.history.state.current || '';
  510. // if(back && back.toString().includes('/report-industries') && indexKeyword){
  511. // e.preventDefault();
  512. // const language = lang === 'zh-CN'?'': 'en';
  513. // await router.push({ name: 'reports', params: { keyword: indexKeyword, lang: language, category: '' } });
  514. // }
  515. // window.removeEventListener('popstate', goBack);
  516. // }
  517. // 完整性
  518. function handleIntegrity() {
  519. integrityShow.value = "block";
  520. businessSHow.value = "none";
  521. price.value = priceFullList.value[0]?.configValue;
  522. }
  523. // 企业数据
  524. function handleBusiness() {
  525. integrityShow.value = "none";
  526. businessSHow.value = "block";
  527. price.value = priceList.value[0].configValue;
  528. }
  529. // 切换版本
  530. function handlePrice(_e: Event, priceValue: string | undefined) {
  531. price.value = priceValue;
  532. }
  533. //关闭diag
  534. function handleCloseDiag() {
  535. demandShow.value = false;
  536. }
  537. // 提交需求
  538. function handleDemand() {
  539. rowId.value = record.value?.id;
  540. rowPrice.value = price.value;
  541. demandShow.value = true;
  542. }
  543. function handleContact() {
  544. demandShow.value = true;
  545. }
  546. function handleOrder(type: string) {
  547. rowId.value = record.value?.id;
  548. rowPrice.value = price.value;
  549. rowType.value = type;
  550. rowRegion.value = record.value?.reportRegion;
  551. demandShow.value = true;
  552. }
  553. // 鼠标滑动
  554. function onScroll() {
  555. // 价格显示隐藏
  556. const scollTop = document.documentElement.scrollTop;
  557. if (scollTop > 370 && pcBtnShow.value) {
  558. tbodyShow.value = false;
  559. } else {
  560. tbodyShow.value = true;
  561. }
  562. // 正文目录滑动时,正文菜单显示隐藏
  563. // const top = detailIntegrityRef.value.getBoundingClientRect().top; // 顶点距离
  564. // const height = detailIntegrityRef.value.clientHeight; // 正文高度
  565. // if(top <= 0 && height >= scollTop - 100){
  566. // detailDirListShow.value = 'block';
  567. // }else{
  568. // detailDirListShow.value = 'none';
  569. // }
  570. // 滑动时自动定位到正文清单
  571. // console.log("顶部距离:"+scollTop);
  572. // const calcTop = Math.trunc(scollTop - 840);
  573. // const childrens = document.getElementsByClassName('bjfl-list')[0]?.children;
  574. // const len = document.getElementsByClassName('bjfl-list')[0]?.children.length;
  575. // if(len && len > 0){
  576. // for(let i = 1; i < len; i++){
  577. // let outId = "c"+i, lastTop = 0;
  578. // if(i < 10){ outId = "c0" +i;}
  579. // const top = document.getElementById(outId)?.offsetTop || 0;
  580. // if(top === calcTop){
  581. // childrens.forEach(item => { item.className = ''; })
  582. // childrens[i].className = 'active';
  583. // break;
  584. // }else{
  585. // if(i > 1){
  586. // // 上一节点到顶部距离
  587. // let lastId = "c"+(i-1);
  588. // if(i < 11){ lastId = "c0"+(i-1); }
  589. // lastTop = document.getElementById(lastId)?.offsetTop || 0;
  590. // //console.log(outId+":"+top);
  591. // // 滑动距离在i和i-1中间,则设置i-1为active,其余为空
  592. // //console.log("outId:"+outId+",top:"+top+",lastTop:"+top);
  593. // if(top > calcTop && lastTop <= calcTop){
  594. // childrens.forEach(item => { item.className = ''; })
  595. // childrens[i-1].className = 'active';
  596. // break;
  597. // }
  598. // }else{
  599. // if(top >= calcTop){
  600. // childrens.forEach(item => { item.className = '';})
  601. // childrens[i].className = 'active';
  602. // break;
  603. // }
  604. // }
  605. // }
  606. // }
  607. // }
  608. }
  609. // 正文目录内容导航点击事件
  610. // function handleDir(e: Event){
  611. // if(e.target.className != 'bjfl-t01'){
  612. // document.getElementsByClassName(e.target.offsetParent.className)[0].childNodes.forEach(item => {
  613. // if(item.className != 'bjfl-t01'){
  614. // item.className = '';
  615. // }
  616. // })
  617. // e.target.className = 'active';
  618. // const outId = e.target.getAttribute('data-id');
  619. // const top = document.getElementById(outId)?.offsetTop || 0;
  620. // document.documentElement.scrollTop = top + 840;
  621. // }
  622. // }
  623. // 显示价格
  624. function showPrice() {
  625. //window.scrollTo(0,0);
  626. let scollTop = document.documentElement.scrollTop;
  627. const timeTop = setInterval(() => {
  628. document.documentElement.scrollTop =
  629. document.documentElement.scrollTop =
  630. scollTop -=
  631. 10;
  632. if (scollTop <= 0) {
  633. clearInterval(timeTop);
  634. }
  635. }, 10);
  636. }
  637. function handleSearch() {
  638. const language = lang === "zh-CN" ? "" : "en";
  639. router.push({
  640. name: "reports",
  641. params: { keyword: keyword.value, lang: language },
  642. });
  643. }
  644. function keyDown() {
  645. handleSearch();
  646. }
  647. // onServerPrefetch(async () => {
  648. // try {
  649. // const data = await getData();
  650. // setTitleKeywordsDescription(getTitleKeywordsDescription(data));
  651. // } catch (error) {
  652. // console.log(error);
  653. // }
  654. // });
  655. // function getTitleKeywordsDescription(data: any) {
  656. // //console.log(window);
  657. // let title, description, keywords;
  658. // try {
  659. // if (data.reportScopeHtml) {
  660. // let $ = cheerio.load(data.reportScopeHtml);
  661. // description = $("p").eq(3).text();
  662. // }
  663. // title = data.title;
  664. // keywords = data.context;
  665. // } catch (error) {
  666. // console.log("getTitleKeywordsDescription", error);
  667. // }
  668. // return {
  669. // title,
  670. // keywords,
  671. // description,
  672. // };
  673. // }
  674. await getData();
  675. // useHead({
  676. // title: record.value.title,
  677. // viewport: "width=device-width,initial-scale=1,maximum-scale=1 ",
  678. // charset: "utf-8",
  679. // meta: [
  680. // { hid: "keywords", name: "keywords", content: record.value.context },
  681. // {
  682. // hid: "description",
  683. // name: "description",
  684. // content: document.getElementsByTagName("p")[3].innerText,
  685. // },
  686. // ],
  687. // });
  688. </script>
  689. <style lang="scss" scoped>
  690. @media only screen and (min-width: 1200px) and (max-width: 1600px) {
  691. #page {
  692. .report-detail-nav,
  693. .detail-container,
  694. .page-nav-container {
  695. max-width: 90%;
  696. }
  697. }
  698. }
  699. @media only screen and (min-width: 1600px) and (max-width: 4000px) {
  700. #page {
  701. .report-detail-nav,
  702. .detail-container,
  703. .page-nav-container {
  704. max-width: 80%;
  705. }
  706. }
  707. }
  708. .report-detail {
  709. background-color: #fff;
  710. margin-top: 10px;
  711. .detail-container {
  712. padding: 50px 0;
  713. background-color: #fff;
  714. .detail-info {
  715. display: flex;
  716. justify-content: space-between;
  717. padding-bottom: 20px;
  718. align-items: flex-end;
  719. flex-wrap: wrap;
  720. .detail-box {
  721. width: 70%;
  722. display: flex;
  723. flex-wrap: wrap;
  724. justify-content: space-between;
  725. .img {
  726. width: 174px;
  727. overflow: hidden;
  728. margin: auto 0;
  729. box-shadow: 7px 0px 15px rgb(0 87 149 / 33%);
  730. img {
  731. width: 100%;
  732. border: none;
  733. vertical-align: middle;
  734. max-height: 200px;
  735. transition: all 0.4s ease;
  736. }
  737. // img:hover{
  738. // transform: scale(1.1);
  739. // }
  740. }
  741. .desc {
  742. width: calc(100% - 214px);
  743. h1 {
  744. margin-top: 0px;
  745. font-size: 29px;
  746. text-overflow: ellipsis;
  747. -webkit-line-clamp: 2;
  748. overflow: hidden;
  749. word-wrap: break-word;
  750. font-weight: 700;
  751. display: -webkit-box;
  752. -webkit-box-orient: vertical;
  753. height: 90px;
  754. //word-break: break-all;
  755. }
  756. .desc-dt-box {
  757. display: flex;
  758. justify-content: space-between;
  759. align-items: center;
  760. padding-bottom: 5px;
  761. .desc-dt-cnt {
  762. font-size: 15px;
  763. .desc-icon {
  764. img {
  765. width: 1.7em;
  766. height: 1.7em;
  767. vertical-align: bottom;
  768. margin-right: 0.6em;
  769. }
  770. }
  771. }
  772. }
  773. }
  774. .horizontal-line {
  775. width: 100%;
  776. padding: 10px 0 30px;
  777. hr {
  778. border: none;
  779. height: 1px;
  780. background-color: #e1e1e1;
  781. }
  782. }
  783. .btns {
  784. width: 100%;
  785. display: flex;
  786. justify-content: space-between;
  787. > a {
  788. width: 48%;
  789. border: 1px solid #18a058;
  790. display: inline-block;
  791. padding: 15px;
  792. text-align: center;
  793. font-size: 16px;
  794. color: #18a058;
  795. font-weight: 600;
  796. &:hover {
  797. background-color: #18a058;
  798. color: #fff;
  799. }
  800. }
  801. }
  802. }
  803. .detail-price {
  804. width: 28%;
  805. .version-title {
  806. text-align: center;
  807. background: #18a058;
  808. color: #fff;
  809. border-bottom: none;
  810. padding: 18px 0;
  811. font-weight: 700;
  812. font-size: 18px;
  813. cursor: pointer;
  814. }
  815. }
  816. }
  817. .detail-statement {
  818. border: 1px solid #e1e1e1;
  819. padding: 25px 15px;
  820. margin-bottom: 20px;
  821. line-height: 25px;
  822. background-color: #f0f0f0;
  823. .detail-statement-title {
  824. font-weight: 600;
  825. padding-bottom: 5px;
  826. }
  827. .detail-statement-attent {
  828. padding-top: 5px;
  829. color: #f00;
  830. }
  831. }
  832. .detail-content {
  833. display: flex;
  834. justify-content: space-between;
  835. flex-wrap: wrap;
  836. .detail-content-mr {
  837. width: 70%;
  838. }
  839. .detail-content-ml {
  840. .detail-search {
  841. padding-bottom: 4em;
  842. }
  843. .detail-more {
  844. border: 1px solid #eee;
  845. margin-bottom: 4em;
  846. .more-title {
  847. > h3 {
  848. margin: 0;
  849. width: 100%;
  850. text-align: center;
  851. background-color: #18a058;
  852. padding: 0.5em 0;
  853. color: #fff;
  854. font-size: 1.28em;
  855. }
  856. }
  857. .more-content {
  858. padding: 0 0.5em;
  859. .more-content-box {
  860. display: flex;
  861. align-items: center;
  862. border-bottom: 1px solid #eee;
  863. .box-icon {
  864. width: 1.2em;
  865. .n-icon {
  866. vertical-align: text-top;
  867. }
  868. }
  869. .box-txt {
  870. width: calc(100% - 1.2em);
  871. white-space: nowrap;
  872. overflow: hidden;
  873. text-overflow: ellipsis;
  874. }
  875. }
  876. }
  877. }
  878. .detail-process {
  879. border: 1px solid #eee;
  880. .detail-title {
  881. h3 {
  882. width: 100%;
  883. text-align: center;
  884. background-color: #18a058;
  885. margin: 0;
  886. padding: 0.5em 0;
  887. color: #fff;
  888. font-size: 1.28em;
  889. }
  890. }
  891. .detail-content {
  892. padding: 0 1em 3em 1em;
  893. p {
  894. margin: 0;
  895. }
  896. }
  897. }
  898. .process-arrow {
  899. padding-left: 15px;
  900. .color01 {
  901. color: #e69601;
  902. }
  903. .color02 {
  904. color: #93a500;
  905. }
  906. .color03 {
  907. color: #24ab9a;
  908. }
  909. .color04 {
  910. color: #23aef5;
  911. }
  912. }
  913. width: 28%;
  914. .process-box {
  915. padding-top: 1em;
  916. .process-icon {
  917. width: 80px;
  918. .process-icon-title {
  919. width: 80px;
  920. height: 80px;
  921. line-height: 80px;
  922. text-align: center;
  923. border-radius: 100%;
  924. color: #fff;
  925. }
  926. .pt1 {
  927. background-color: #e69601;
  928. }
  929. .pt2 {
  930. background-color: #93a500;
  931. }
  932. .pt3 {
  933. background-color: #24ab9a;
  934. padding-top: 20px;
  935. line-height: normal;
  936. }
  937. .pt4 {
  938. background-color: #23aef5;
  939. }
  940. .pt5 {
  941. background-color: #5d98de;
  942. }
  943. }
  944. .process-content {
  945. color: #666;
  946. }
  947. }
  948. }
  949. }
  950. }
  951. }
  952. .price-one {
  953. display: flex;
  954. justify-content: space-between;
  955. background: #d3d3d3;
  956. padding: 16px 12px;
  957. .price-desc {
  958. font-weight: 700;
  959. }
  960. }
  961. .price-btn {
  962. display: inline-block;
  963. width: 48%;
  964. background: #18a058;
  965. color: #fff;
  966. padding: 10px;
  967. text-align: center;
  968. }
  969. .price-buy {
  970. margin-right: 10px;
  971. }
  972. .detail-integrity,
  973. .full-version {
  974. display: v-bind("integrityShow");
  975. }
  976. .detail-business,
  977. .enterprise-price {
  978. display: v-bind("businessSHow");
  979. }
  980. .detail-integrity,
  981. .detail-business {
  982. border: 1px solid #e1e1e1;
  983. }
  984. .detail-Market-overview {
  985. margin-top: 20px;
  986. & > div {
  987. // border: 1px solid #e1e1e1;
  988. // padding: 20px;
  989. :deep(img) {
  990. width: 100%;
  991. }
  992. }
  993. .market-title {
  994. display: flex;
  995. justify-content: space-between;
  996. align-items: center;
  997. margin-bottom: 20px;
  998. border: none;
  999. color: rgb(34, 7, 94);
  1000. h2 {
  1001. margin: 0;
  1002. padding: 0;
  1003. font-size: 19px;
  1004. }
  1005. .open-off {
  1006. display: flex;
  1007. align-items: center;
  1008. padding: 5px 10px;
  1009. border: 1px solid #2f318b;
  1010. border-radius: 8px;
  1011. cursor: pointer;
  1012. span {
  1013. font-size: 14px;
  1014. color: #2f318b;
  1015. font-weight: bold;
  1016. }
  1017. .open-icon {
  1018. transform: rotateX(180deg);
  1019. }
  1020. }
  1021. }
  1022. }
  1023. .market-title_h2 {
  1024. color: rgb(34, 7, 94);
  1025. font-size: 19px;
  1026. // margin: 0;
  1027. // padding: 0;
  1028. }
  1029. .v-enter-active,
  1030. .v-leave-active {
  1031. transition: opacity 0.5s ease;
  1032. }
  1033. .v-enter-from,
  1034. .v-leave-to {
  1035. opacity: 0;
  1036. }
  1037. .home-contact {
  1038. position: relative;
  1039. .contact-row {
  1040. position: absolute;
  1041. left: 12.5%;
  1042. top: 160px;
  1043. width: 1200px;
  1044. display: flex;
  1045. justify-content: space-between;
  1046. align-items: center;
  1047. flex-wrap: wrap;
  1048. .contact-txt {
  1049. width: 40%;
  1050. span {
  1051. font-size: 26px;
  1052. color: #fff;
  1053. font-weight: 600;
  1054. }
  1055. }
  1056. .contact-btn {
  1057. width: 30%;
  1058. > a {
  1059. color: #fff;
  1060. font-size: 26px;
  1061. background: #18a058;
  1062. padding: 15px 25px;
  1063. }
  1064. }
  1065. }
  1066. .contact-img {
  1067. height: 360px;
  1068. overflow: hidden;
  1069. > img {
  1070. height: 100%;
  1071. width: 100%;
  1072. object-fit: cover;
  1073. }
  1074. }
  1075. }
  1076. .n-tabs-wrapper {
  1077. border: 1px solid #e1e1e1;
  1078. }
  1079. </style>
  1080. <style>
  1081. /*正文目录 */
  1082. /* .bjfl{position: relative; width: 60%;}
  1083. .bjfl-t01{font-size: 15px;font-weight: 700;}
  1084. .bjfl-t03{padding-left: 20px;}
  1085. .bjfl-t04{padding-left: 40px;}
  1086. .bjfl-list{position: fixed;bottom: 10%;left: 47%;background-color: #fff;display: v-bind('detailDirListShow');}
  1087. .bjfl-list>p{margin: 0;border-bottom: 1px solid #e1e1e1;height: 35px;line-height: 35px;cursor: pointer;padding: 0 10px;
  1088. overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 1; -webkit-box-orient: vertical;}
  1089. .bjfl-list .active{background-color: #18a058;color: #fff;}
  1090. .bjfl-list p:nth-child(1){background-color: #e1e1e1;}
  1091. html,body{scroll-behavior: smooth;} */
  1092. /**企业数据样式 */
  1093. .detail-business .n-tab-pane table {
  1094. text-align: center;
  1095. border-collapse: collapse;
  1096. border: 1px solid #f0f0f0;
  1097. }
  1098. .detail-business .n-tab-pane table tr:nth-child(1) td {
  1099. padding: 10px;
  1100. border-bottom: 1px solid #f0f0f0;
  1101. background-color: #9296cf;
  1102. font-weight: 700;
  1103. }
  1104. .detail-business .n-tab-pane table tr td {
  1105. border-right: 1px solid #f0f0f0;
  1106. padding: 5px 0;
  1107. }
  1108. .detail-business .n-tab-pane table tr:nth-child(even) {
  1109. background-color: #deebf5;
  1110. }
  1111. .detail-business .n-tab-pane img {
  1112. width: 100%;
  1113. }
  1114. </style>