_tid.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <div :class="{kaifainPreviewCaseMobile: mobile, kaifainPreviewCase: !mobile}">
  3. <div class="kaifain-view">
  4. <Topnav :fixed="topnavFixed" @publish-click="isShowToast=true" />
  5. </div>
  6. <div class="topArea">
  7. <div class="bannerBg">
  8. <img src="~@/assets/img/kaifain/detail/banner@2x.png" alt="" v-if="!mobile">
  9. <img src="~@/assets/img/kaifain/detail/banner_h5@2x.png" alt="" v-else>
  10. </div>
  11. <div class="topContent">
  12. <div class="left">
  13. <h1 class="title">{{detail.title || ""}}</h1>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="contentArea">
  18. <div class="introArea">
  19. <div class="title">
  20. <p class="word">案例介绍</p>
  21. <p class="line"></p>
  22. </div>
  23. <div class="introContent ql-editor" v-html="detail.description || ''">
  24. </div>
  25. </div>
  26. </div>
  27. <KaifainFooter style="margin-top: 30px;" :data="footer"/>
  28. <ConnectUs
  29. :source="'开发屋案例'"
  30. :isShowToast="isShowToast"
  31. @close="isShowToast=false"
  32. :sourceId="tid"
  33. ></ConnectUs>
  34. </div>
  35. </template>
  36. <script lang="ts">
  37. import "quill/dist/quill.core.css";
  38. import "quill/dist/quill.snow.css";
  39. import ConnectUs from "@/components/common/connectUsKaifain.vue";
  40. import KaifainFooter from "@/components/SeoFooter.vue"
  41. import {HashIDUtil, GenType} from "../../../plugins/genHashId"
  42. import Topnav from '@/kaifain_v2/components/Topnav.vue'
  43. import { genDocumentFooterData } from '@/kaifain_v2/helpers/seoHelper'
  44. export default {
  45. layout: "opacity_header",
  46. components: {ConnectUs, KaifainFooter, Topnav},
  47. head() {
  48. const { title = '' } = this.detail || {}
  49. return {
  50. title: (title ? `${title}-` : '') + '开发屋',
  51. meta: [ {
  52. 'name': 'keywords',
  53. 'content': '定制化Saas、PasS、API、行业技术解决方案'
  54. }, {
  55. 'name': 'descrption',
  56. 'content': '开发屋为企业提供行业内领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障企业在降低人力开发成本的同时,得到优质的项目开发实力。'
  57. }, {
  58. 'name': 'h1',
  59. 'content': '开发屋'
  60. } ]
  61. }
  62. },
  63. async asyncData(ctx) {
  64. const params = ctx
  65. try {
  66. params.store.commit("updateNoneCommonFooter", true)
  67. } catch (e) {
  68. console.log("updateNoneCommonFooter", e)
  69. }
  70. let {tid: newTid} = params.app.context.route.params || {}
  71. let tid = newTid.replace(".html", "")
  72. if (process.server) {
  73. const {path, fullPath} = params.app.context && params.app.context.route || {}
  74. //将id都转到hashId
  75. if (tid && tid.length !== 12 && Number(tid) === Number(tid)) {
  76. let genHashId = new HashIDUtil()
  77. let nowId = genHashId.getHashID(GenType.TYPE_SERVICE_CASE, tid)
  78. let path1 = path.replace(newTid, nowId)
  79. let reditUrl = path.replace(path, path1)
  80. params.redirect(301, reditUrl)
  81. return
  82. }
  83. }
  84. if (!ctx.store.state.kaifain.inited) {
  85. await ctx.store.dispatch('parameters:load')
  86. }
  87. const { classes } = ctx.store.state.kaifain
  88. const footer = genDocumentFooterData({
  89. ctx,
  90. classes
  91. })
  92. let detail = {}
  93. let errInfo = ""
  94. let res = await params.$axios.post('/api/kaifawu/get_public_case?id='+ tid, {id: tid})
  95. if (Number(res.data.status) === 1) {
  96. let data = res.data.data
  97. if (!Array.isArray(data.successful_case)) {
  98. if (data.successful_case && typeof data.successful_case === "object") {
  99. data.successful_case = [ data.successful_case ]
  100. } else {
  101. data.successful_case = []
  102. }
  103. }
  104. detail = data || {}
  105. } else {
  106. errInfo = res.data && res.data.info || "服务异常"
  107. }
  108. return {
  109. tid,
  110. footer,
  111. mobile: params.app.$deviceType.isMobile(),
  112. detail,
  113. errInfo
  114. };
  115. },
  116. data() {
  117. return {
  118. isShowToast: false,
  119. topnavFixed: false
  120. }
  121. },
  122. created() {
  123. },
  124. mounted() {
  125. if (!this.detail || !this.detail.id) {
  126. this.$message.error(this.errInfo)
  127. }
  128. const fixHeight = Math.min(520, window.screen.availHeight)
  129. window.addEventListener('scroll', () => {
  130. this.topnavFixed = window.scrollY > fixHeight
  131. })
  132. },
  133. computed: {
  134. haveCase() {
  135. const {successful_case = []} = this.detail
  136. return successful_case.length > 0
  137. }
  138. },
  139. methods: {
  140. openPDF(item) {
  141. const {file} = item
  142. window.open(file, 'pdf' + Math.random())
  143. return false
  144. }
  145. }
  146. }
  147. </script>
  148. <style scope lang="scss">
  149. @import "../../../assets/css/kaifain/previewCase.scss";
  150. </style>