index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <template>
  2. <div :class="{isMobile: mobile}">
  3. <div v-if="!mobile" class="kaifain">
  4. <div class="topArea">
  5. <div class="bgImage">
  6. <img src="~@/assets/img/kaifain/banner_bj@2x.png" alt="">
  7. </div>
  8. <div class="topContent">
  9. <div class="wordImg">
  10. <img src="~@/assets/img/kaifain/top_name@2x.png" alt="">
  11. </div>
  12. <div class="btnList">
  13. <div class="freeSubmit" @click="isShowToast = true"><p>免费发布需求</p></div>
  14. <div class="bePartner" @click="handleApplyBtnClick"><p>申请入驻</p></div>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="contentArea">
  19. <div class="selectArea" v-if="!isSeoList">
  20. <div class="content" v-for="(key, i) in Object.keys(typeList)">
  21. <div class="left"><p>{{typeList[key].title}}</p></div>
  22. <div class="right">
  23. <div class="cell"
  24. v-for="(item, ii) in typeList[key].list"
  25. :class="{selected: item.id === selected[key]}"
  26. @click="changeIndexSeo(key, item)"
  27. v-if="ii < 8 || expansion[key]"
  28. >
  29. <p>{{item.name}}</p>
  30. </div>
  31. </div>
  32. <div class="more" @click="changeExpansion(key)" v-if="typeList[key].list.length > 8">
  33. {{expansion[key] ? "收起" : "更多"}}
  34. </div>
  35. </div>
  36. </div>
  37. <div class="listArea">
  38. <h1 class="sTitle">{{head.h1 || '解决方案'}}</h1>
  39. <div class="list" v-loading="loading">
  40. <nuxt-link class="cell"
  41. v-for="item in dataList"
  42. :key="item.id"
  43. :to="`/kaifain/s/${item.id}.html`"
  44. target="_blank"
  45. :title="item.name"
  46. >
  47. <div class="left">
  48. <img :src="item.images" alt="解决方案images">
  49. </div>
  50. <div class="right">
  51. <div class="top">
  52. <div class="titleA">
  53. <div class="title">{{item.title}}</div>
  54. <div class="tips" v-if="item.city_op_name">{{item.city_op_name}}</div>
  55. <div class="tips" v-if="item.industry_name">{{item.industry_name}}</div>
  56. <div class="tips" v-if="item.tech_type_name">{{item.tech_type_name}}</div>
  57. </div>
  58. <div class="intro">
  59. <p class="tt">介绍:</p>
  60. <p class="value">{{item.description}}</p>
  61. </div>
  62. <div class="ep">
  63. <p class="tt">案例:</p>
  64. <p class="value">
  65. <span>{{item.successCase || '暂未提供'}}</span>
  66. </p>
  67. </div>
  68. </div>
  69. <div class="bottom">
  70. <div class="icon">
  71. <img :src="item.company_logo" alt="" onerror="this.src='https://stacdn.proginn.com/image/uCenter/company_logo.png'">
  72. </div>
  73. <p class="word">{{item.company_name || '' }}</p>
  74. <p class="status" v-if="item.company_verify_status == 2">{{"已认证"}}</p>
  75. </div>
  76. </div>
  77. </nuxt-link>
  78. <div v-if="dataList.length === 0" class="noneData">
  79. <p>没有数据</p>
  80. </div>
  81. </div>
  82. </div>
  83. <div class="pagination">
  84. <el-pagination v-if="!isSeoList" background layout="prev, pager, next" :total="page.total"
  85. :page-size="page.size" @current-change="pageChange"></el-pagination>
  86. <div v-else>
  87. <div class="list">
  88. <nuxt-link v-for="(item,index) in new Array(Math.ceil(page.total / page.size))"
  89. :to="`/kaifain/s/?page=${index+1}`"
  90. :key="(page)+index"
  91. >
  92. {{index+1}}
  93. </nuxt-link>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. <div class="kaifainMobile" v-else>
  100. <div class="topSelect" v-if="!isSeoList">
  101. <van-dropdown-menu>
  102. <van-dropdown-item v-for="(key, i) in Object.keys(typeList)" v-model="selected[key]"
  103. :options="typeList[key].list" :key="key+i" @change="changeIndex"/>
  104. </van-dropdown-menu>
  105. </div>
  106. <van-pull-refresh v-model="refreshing" @refresh="onRefresh" class="listArea" :class="{noneInWx: !$deviceType.app}">
  107. <div style="text-align: center" v-if="firstLoading">
  108. <van-loading size="24px">加载中...</van-loading>
  109. </div>
  110. <van-list
  111. v-else
  112. v-model="loading"
  113. :finished="finished"
  114. finished-text="没有更多了"
  115. @load="onLoad"
  116. :immediate-check="false"
  117. >
  118. <nuxt-link class="cell"
  119. v-for="item in dataList"
  120. :key="item.id"
  121. :to="`/kaifain/s/${item.id}.html`"
  122. target="_blank"
  123. >
  124. <div class="bodyCont">
  125. <div class="left">
  126. <img :src="item.images" alt="">
  127. </div>
  128. <div class="right">
  129. <div class="cellTitle">{{item.title}}</div>
  130. <div class="spanList">
  131. <div class="tips" v-if="item.city_op_name">{{item.city_op_name}}</div>
  132. <div class="tips" v-if="item.industry_name">{{item.industry_name}}</div>
  133. <div class="tips" v-if="item.tech_type_name">{{item.tech_type_name}}</div>
  134. </div>
  135. <div class="desc">{{item.description}}</div>
  136. </div>
  137. </div>
  138. <div class="bottomCont">
  139. <p class="icon" v-if="item.company_name"></p>
  140. <p class="word" v-if="item.company_name ">{{item.company_name || '' }}</p>
  141. </div>
  142. </nuxt-link>
  143. </van-list>
  144. </van-pull-refresh>
  145. </div>
  146. <ConnectUs :source="'开发屋'" :isShowToast="isShowToast" @close="isShowToast=false" v-if="!isSeoList"></ConnectUs>
  147. <BindMobile ref="bindMobile" v-if="!isSeoList"></BindMobile>
  148. <KaifainFooter style="margin-top: 30px;" :data="footer"/>
  149. </div>
  150. </template>
  151. <script>
  152. import ConnectUs from "@/components/common/connectUs"
  153. import BindMobile from "@/components/common/bindMobile"
  154. import DealSeoData from "@/components/kaifain/dealSeoIndex"
  155. import DealSeoFooter from "@/components/kaifain/dealSeoFooter"
  156. import KaifainFooter from "@/components/SeoFooter"
  157. export default {
  158. layout: "opacity_header",
  159. showCommonFooter: false,
  160. components: { ConnectUs, BindMobile, KaifainFooter },
  161. head() {
  162. let { title = "", keyword = "", descrption = "", h1 = "", canonical="", metaLocation } = this.head || {}
  163. if (this.$deviceType.app) {
  164. title = "开发屋-解决方案"
  165. }
  166. let obj = {
  167. title: title,
  168. meta: [
  169. {
  170. 'name': 'keywords',
  171. 'content': keyword
  172. }, {
  173. 'name': 'descrption',
  174. 'content': descrption
  175. }, {
  176. 'name': 'h1',
  177. 'content': h1
  178. }
  179. ],
  180. link: [
  181. { rel: 'canonical', href: canonical },
  182. ]
  183. }
  184. if (metaLocation) {
  185. obj.meta.push({'name': 'location', 'content': metaLocation })
  186. }
  187. return obj
  188. },
  189. async asyncData({ ...params }) {
  190. try {
  191. params.store.commit("updateNoneCommonFooter", true)
  192. } catch (e) {
  193. console.log("updateNoneCommonFooter", e)
  194. }
  195. let dealDataObj = new DealSeoData(params)
  196. let ans = await dealDataObj.dealData()
  197. let dealSeoFooterObj = new DealSeoFooter(params)
  198. let footer = await dealSeoFooterObj.dealData()
  199. return {
  200. ...ans,
  201. ...footer
  202. }
  203. },
  204. data() {
  205. return {
  206. expansion: {
  207. city: 0,
  208. industry: 0,
  209. techType: 0,
  210. },
  211. isShowToast: false,
  212. name: '',
  213. phone: '',
  214. loading: false,
  215. refreshing: false,
  216. firstLoading: false, //移动端加载loading
  217. }
  218. },
  219. created() {
  220. // this.firstLoading = true
  221. },
  222. mounted() {
  223. if (this.mobile) {
  224. document.body.style = "overflow:hidden;"
  225. }
  226. console.log(this.dataList)
  227. },
  228. methods: {
  229. changeIndex(key, item) {
  230. this.page.page = 1
  231. this.page.total = 0
  232. this.firstLoading = true
  233. if (item) {
  234. this.selected[ key ] = item.id
  235. this.getList()
  236. } else {
  237. this.getList()
  238. }
  239. },
  240. changeIndexSeo(key, item) {
  241. console.log("key:", key, "item:", item, "selected:", this.selected)
  242. this.selected[ key ] = item.id
  243. this.selected[key + 'Slug'] = item.slug
  244. let {citySlug, industrySlug, techTypeSlug} = this.selected
  245. let url = "/kaifain/"
  246. if (citySlug) {
  247. url += citySlug + '/'
  248. }
  249. if (industrySlug) {
  250. url += industrySlug + '/'
  251. }
  252. if (techTypeSlug) {
  253. url += techTypeSlug + '/'
  254. }
  255. location.href = url
  256. },
  257. changeExpansion(key) {
  258. this.expansion[ key ] = !this.expansion[ key ]
  259. },
  260. getList() {
  261. const { page, selected } = this
  262. let p = {
  263. city: selected.city,
  264. tech_type: selected.techType,
  265. industry: selected.industry,
  266. ...page
  267. }
  268. this.loading = true
  269. // let params = new URLSearchParams(p).toString()
  270. this.$axios.post('/api/kaifawu/index', p).then(res => {
  271. if (Number(res.data.status) === 1) {
  272. let data = res.data.data
  273. this.page.total = data.total
  274. let dataList = data.providers || []
  275. dataList.forEach(item => {
  276. item[ 'successCase' ] = ''
  277. if (Array.isArray(item.successful_case)) {
  278. let tem = item.successful_case.map(item => item.title)
  279. item[ 'successCase' ] = tem.join('、')
  280. }
  281. })
  282. if (this.page.page === 1 || !this.mobile) {
  283. this.dataList = [...dataList]
  284. } else {
  285. this.dataList = [ ...this.dataList, ...dataList]
  286. }
  287. this.page.page += 1
  288. if (this.page.total <= this.dataList.length) {
  289. this.finished = true
  290. }
  291. }
  292. }).finally(() => {
  293. this.firstLoading = false
  294. this.refreshing = false
  295. this.loading = false
  296. console.log("this.finished", this.finished)
  297. })
  298. },
  299. pageChange(i) {
  300. this.page.page = i
  301. this.getList()
  302. },
  303. handleApplyBtnClick() {
  304. const { userinfo } = this.$store.state || {}
  305. //检查登录
  306. if (!userinfo || !userinfo.uid) {
  307. this.$message.info('请先登录!')
  308. location.href = '/?loginbox=show'
  309. return
  310. }
  311. //去绑定手机号
  312. if (!userinfo.mobile) {
  313. this.$message.info('请先绑定手机号')
  314. this.$refs.bindMobile.open()
  315. return
  316. }
  317. //判断是否是首次入驻 非首次入驻 跳转到企业主页
  318. if (Number(userinfo.has_attend_service_provider) !== 0) {
  319. location.href = "/company/" + userinfo.uid
  320. return
  321. }
  322. location.href = "/otherpage/companyComplete";
  323. },
  324. /** 移动端下拉刷新 **/
  325. onRefresh() {
  326. // 清空列表数据
  327. this.finished = false;
  328. this.loading = true;
  329. this.onLoad();
  330. },
  331. onLoad() {
  332. this.getList()
  333. },
  334. }
  335. }
  336. </script>
  337. <style scope lang="scss">
  338. @import "../../assets/css/kaifain/index.scss";
  339. </style>
  340. <style lang="scss">
  341. .van-dropdown-menu__title {
  342. color: #666;
  343. }
  344. </style>