search.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template lang="pug">
  2. .view.search-result#view
  3. Topnav(
  4. :q="q"
  5. :fixed="topnavFixed"
  6. @search-change="onSearchChange"
  7. @publish-click="connectPopupVisible = true"
  8. )
  9. .main
  10. Toolbar(
  11. :cities="cities"
  12. :city-id.sync="cityId"
  13. :sort-type.sync="sortType"
  14. :is-choice.sync="isChoice"
  15. )
  16. .container.is-content
  17. .hits-msg 为您找到 {{solutionTotal}} 个 "{{q}}" 解决方案
  18. #solution-list.list.container.is-content
  19. SolutionCell(
  20. v-for="row in solutionList"
  21. :key="row.hash_id"
  22. :data="row"
  23. )
  24. Pagination(
  25. mode="query"
  26. :page="page || 1"
  27. :total="solutionTotal"
  28. )
  29. KaifainFooter(:data="footer")
  30. ConnectUs(
  31. source="开发屋-搜索"
  32. :isShowToast="connectPopupVisible"
  33. @close="connectPopupVisible = false"
  34. )
  35. </template>
  36. <script lang="ts">
  37. import Vue from 'vue'
  38. import Topnav from '../components/Topnav.vue'
  39. import Carousel from '../components/Carousel.vue'
  40. import SearchBox from '../components/SearchBox.vue'
  41. import CategoryNav from '../components/CategoryNav.vue'
  42. import Toolbar from '../components/Toolbar.vue'
  43. import SolutionCell from '../components/SolutionCell.vue'
  44. import Pagination from '../components/Pagination.vue'
  45. import { listBanners, listSearchKeywords, getInitParameters } from '../apis/common'
  46. import { listSolutions } from '../apis/solution'
  47. import { SolutionListMixin } from '../mixins/solution'
  48. import { scrollToElement } from '../utils/misc'
  49. import { genDocumentFooterData } from '../helpers/seoHelper'
  50. import ConnectUs from '@/components/common/connectUs.vue'
  51. import KaifainFooter from '@/components/SeoFooter.vue'
  52. export default SolutionListMixin.extend({
  53. name: 'Search',
  54. components: {
  55. Topnav,
  56. Carousel,
  57. SearchBox,
  58. CategoryNav,
  59. Toolbar,
  60. SolutionCell,
  61. Pagination,
  62. ConnectUs,
  63. KaifainFooter
  64. },
  65. layout: 'kaifain_v2',
  66. head() {
  67. return {
  68. title: `${this.q} - 开发屋搜索`
  69. }
  70. },
  71. data() {
  72. return {
  73. topnavFixed: true,
  74. connectPopupVisible: false
  75. }
  76. },
  77. watch: {
  78. ['$route.query.page'](val) {
  79. if (val) {
  80. this.getSolutionList({
  81. page: ~~val,
  82. updateUrl: false
  83. })
  84. .then(() => {
  85. scrollToElement('#view')
  86. })
  87. }
  88. }
  89. },
  90. async asyncData(ctx: any) {
  91. const { store, query, error } = ctx
  92. const {
  93. q = '',
  94. page = 0,
  95. sort = 0,
  96. city_id,
  97. is_choice
  98. } = query as any
  99. if (!store.state.kaifain.inited) {
  100. await store.dispatch('parameters:load')
  101. }
  102. const { cities, classes, serviceTypes } = store.state.kaifain
  103. const solutionRes = await listSolutions({
  104. cat_id: undefined,
  105. q,
  106. sort,
  107. city_id,
  108. is_choice: is_choice ? 1 : undefined,
  109. page: ~~page || 1,
  110. size: 10
  111. })
  112. if (!solutionRes) {
  113. throw error({ statusCode: 404, message: 'Post not found (no data)' })
  114. }
  115. const footer = genDocumentFooterData({
  116. ctx,
  117. classes
  118. })
  119. return {
  120. q,
  121. page: ~~page,
  122. sortType: ~~sort,
  123. cityId: city_id || null,
  124. isChoice: !!is_choice || false,
  125. cities,
  126. classes,
  127. serviceTypes,
  128. solutionList: solutionRes.list || [],
  129. solutionTotal: ~~solutionRes.total,
  130. footer
  131. }
  132. },
  133. methods: {
  134. async onSearchChange(val) {
  135. if (!val) {
  136. return
  137. }
  138. this.q = val
  139. await this.getSolutionList({
  140. reset: true
  141. })
  142. }
  143. }
  144. })
  145. </script>
  146. <style lang="scss">
  147. .kaifain-view {
  148. .search-result {
  149. .main {
  150. padding-top: 54px;
  151. min-height: 720px;
  152. }
  153. .hits-msg {
  154. color: #444;
  155. font-size: 0.8125rem;
  156. font-weight: 500;
  157. padding: 1.25rem 0.75rem 0.75rem;
  158. }
  159. }
  160. }
  161. </style>