header.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <template>
  2. <header>
  3. <div class="header-wrap">
  4. <div class="header-con xs">
  5. <div class="wrapper1180 flex row-between">
  6. <div class="flex" style="height: 100%">
  7. <template v-if="
  8. publicData.article && publicData.article.length
  9. ">
  10. <img style="
  11. width: 16px;
  12. height: 16px;
  13. margin-right: 10px;
  14. " src="~/static/images/header_notice.png" />
  15. <client-only>
  16. <swiper ref="headerSwiper" :options="swiperOptions">
  17. <swiper-slide class="swiper-item" v-for="(
  18. item, index
  19. ) in publicData.article" :key="index">
  20. <nuxt-link class="flex-col row-center" style="height: 100%" :to="
  21. '/news_list/news_list_detail?id=' +
  22. item.id
  23. ">
  24. <div class="line1">
  25. {{ item.title }}
  26. </div>
  27. </nuxt-link>
  28. </swiper-slide>
  29. </swiper>
  30. </client-only>
  31. </template>
  32. </div>
  33. <div class="user flex flex-none">
  34. <div v-if="config.name">
  35. 您好,欢迎来到 {{ config.name }}!
  36. </div>
  37. <ul class="flex flex-none">
  38. <li>
  39. <nuxt-link to="/">首页</nuxt-link>
  40. </li>
  41. <li>
  42. <nuxt-link to="/">人才看板</nuxt-link>
  43. </li>
  44. <li>
  45. <nuxt-link to="/footprint/footprint">我的足迹</nuxt-link>
  46. </li>
  47. <li>
  48. <div
  49. @click.stop="showCompanyAdd = true">
  50. 企业反馈</div>
  51. </li>
  52. <li>
  53. <div
  54. @click.stop="showFeedbackAdd = true">
  55. 意见反馈</div>
  56. </li>
  57. <li v-if="publicData.nickname">
  58. <el-popover placement="bottom" trigger="hover" width="300">
  59. <!-- 统计 -->
  60. <div class="flex row-around w-full user-count">
  61. <div class="flex-1 flex flex-col col-center"
  62. v-for="(item, index) in publicData.count" :key="index"
  63. @tap="menuJump(item)">
  64. <div class="lg primary">{{ item.count }}</div>
  65. <div>{{ item.title }}</div>
  66. </div>
  67. </div>
  68. <div class="user-nav">
  69. <div class="lighter xs item" @click="onLogout">
  70. 退出登录
  71. </div>
  72. </div>
  73. <div slot="reference">
  74. {{ publicData.nickname }}
  75. <i class="el-icon-arrow-down"></i>
  76. </div>
  77. </el-popover>
  78. </li>
  79. <li v-else>
  80. <nuxt-link to="/account/login">聚才网登录</nuxt-link>
  81. </li>
  82. </ul>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="header-main" :style="{
  87. 'background-image': `url(${config.pc_top_bg})`}">
  88. <div class="wrapper1180 flex flex-col row-center">
  89. <div class="app-name">{{config.name}}</div>
  90. <div class="search-wrap flex row-between">
  91. <!-- <nuxt-link to="/" class="flex row-center">-->
  92. <!-- <img-->
  93. <!-- :src="config.shop_login_logo"-->
  94. <!-- class="logo"-->
  95. <!-- alt="logo"-->
  96. <!-- />-->
  97. <!-- </nuxt-link>-->
  98. <div class="flex">
  99. <div class="search flex">
  100. <input type="text" v-model="name" placeholder="请输入关键字搜索" @focus="toFocus"
  101. @keyup.enter="toSearch" />
  102. <el-button class="search-btn" type="primary" @click="toSearch">
  103. 搜索
  104. </el-button>
  105. </div>
  106. </div>
  107. </div>
  108. <div>热搜词语: 知名企业家人才名录、全国高端人才名录 </div>
  109. </div>
  110. </div>
  111. </div>
  112. <feedback-add v-model="showFeedbackAdd" />
  113. <company-add v-model="showCompanyAdd" />
  114. </header>
  115. </template>
  116. <script>
  117. import {
  118. directive
  119. } from 'vue-awesome-swiper'
  120. import {
  121. mapState,
  122. mapMutations,
  123. mapActions
  124. } from 'vuex'
  125. export default {
  126. directives: {
  127. swiper: directive,
  128. },
  129. data() {
  130. return {
  131. name: '',
  132. search: false,
  133. swiperOptions: {
  134. direction: 'vertical',
  135. // autoHeight: true,
  136. height: 40,
  137. initialSlide: 0,
  138. autoplay: true,
  139. },
  140. showFeedbackAdd: false,
  141. showCompanyAdd: false,
  142. }
  143. },
  144. mounted() {
  145. this.$nuxt.$on('keyword', (val) => {
  146. this.name = val
  147. })
  148. },
  149. methods: {
  150. ...mapMutations(['logout']),
  151. ...mapActions(['getPublicData']),
  152. toSearch() {
  153. // if (!this.name) return this.$message.error('请输入商品名称')
  154. if (this.search) {
  155. this.$nuxt.$emit('search', this.name);
  156. }
  157. },
  158. toFocus() {
  159. if (!this.search) {
  160. this.$router.push({
  161. path: '/search/search',
  162. // query: {
  163. // name: this.name,
  164. // },
  165. })
  166. } else {
  167. this.$nuxt.$emit('searchFouce', true);
  168. }
  169. },
  170. onLogout() {
  171. this.logout()
  172. this.$message({
  173. message: '退出成功',
  174. type: 'success',
  175. })
  176. setTimeout(() => location.reload(), 1500)
  177. },
  178. },
  179. watch: {
  180. $route: {
  181. immediate: true,
  182. handler: function(val) {
  183. console.log(val)
  184. if (val.path == '/search/search') {
  185. this.search = true
  186. } else {
  187. this.search = false
  188. }
  189. },
  190. },
  191. },
  192. computed: {
  193. ...mapState(['publicData', 'config']),
  194. },
  195. }
  196. </script>
  197. <style lang="scss" scoped>
  198. .header-wrap {
  199. min-width: 1180px;
  200. position: relative;
  201. z-index: 1000;
  202. ::v-deep .swiper-container {
  203. margin-left: 0;
  204. margin-right: 0;
  205. height: 100%;
  206. width: 400px;
  207. }
  208. .swiper-item {
  209. color: #ccc;
  210. height: 17px;
  211. }
  212. .header-con {
  213. background-color: rgba(4, 4, 4, 0.56);
  214. border: 1px solid #707070;
  215. height: 57px;
  216. color: #f2f2f2;
  217. >div {
  218. height: 100%;
  219. color: #FFFFFF;
  220. a {
  221. color: #FFFFFF;
  222. &:hover {
  223. color: #fff;
  224. }
  225. }
  226. ul {
  227. li {
  228. margin-left: 20px;
  229. }
  230. #tel-phone-block {
  231. position: relative;
  232. &:hover .float-code {
  233. display: flex;
  234. box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
  235. }
  236. .float-code {
  237. display: none;
  238. position: absolute;
  239. padding: 22px 16px;
  240. background-color: white;
  241. top: 24px;
  242. right: -20px;
  243. &::after {
  244. content: '';
  245. width: 8px;
  246. box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
  247. transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
  248. right: 35px;
  249. top: -4px;
  250. height: 8px;
  251. background-color: #fff;
  252. position: absolute;
  253. }
  254. }
  255. }
  256. }
  257. }
  258. }
  259. .header-main {
  260. height: 360px;
  261. background-size: 100% 100%;
  262. .wrapper1180 {
  263. height: 360px;
  264. .app-name {
  265. font-size: 40px;
  266. font-weight: bold;
  267. color: #FFFFFF;
  268. text-shadow: 1px 1px 2px black;
  269. }
  270. .search-wrap {
  271. margin-top: 30px;
  272. height: 80px;
  273. //.logo {
  274. // height: 48px;
  275. // width: auto;
  276. //}
  277. .search {
  278. width: 460px;
  279. height: 42px;
  280. overflow: hidden;
  281. input {
  282. flex: 1;
  283. height: 100%;
  284. border-radius: 4px 0 0 4px;
  285. border: 1px solid $--color-primary;
  286. border-right-width: 0;
  287. padding: 0 10px;
  288. }
  289. .search-btn {
  290. width: 82px;
  291. height: 42px;
  292. cursor: pointer;
  293. border-radius: 0 4px 4px 0;
  294. }
  295. }
  296. .cart {
  297. cursor: pointer;
  298. border-radius: 4px;
  299. width: 108px;
  300. height: 42px;
  301. margin-left: 16px;
  302. }
  303. }
  304. }
  305. }
  306. .user li {
  307. cursor: pointer;
  308. }
  309. }
  310. .user-nav {
  311. .item {
  312. text-align: center;
  313. line-height: 34px;
  314. display: block;
  315. cursor: pointer;
  316. &:not(:last-child) {
  317. border-bottom: 1px solid #e5e5e5;
  318. }
  319. &:hover {
  320. color: $--color-primary;
  321. }
  322. }
  323. }
  324. .user-opts {
  325. padding: 50rpx;
  326. image {
  327. width: 70rpx;
  328. height: 70rpx;
  329. }
  330. }
  331. .user-count {
  332. color: #5D5D5D;
  333. }
  334. </style>