glhcp/pc/components/layout/header.vue

369 lines
14 KiB
Vue
Raw Normal View History

2023-08-10 06:59:52 +00:00
<template>
<header>
<div class="header-wrap">
<div class="header-con xs">
<div class="wrapper1180 flex row-between">
<div class="flex" style="height: 100%">
<template
v-if="
publicData.article && publicData.article.length
"
>
<img
style="
width: 16px;
height: 16px;
margin-right: 10px;
"
src="~/static/images/header_notice.png"
/>
<client-only>
<swiper
ref="headerSwiper"
:options="swiperOptions"
>
<swiper-slide
class="swiper-item"
v-for="(
item, index
) in publicData.article"
:key="index"
>
<nuxt-link
class="flex-col row-center"
style="height: 100%"
:to="
'/news_list/news_list_detail?id=' +
item.id
"
>
<div class="line1">
{{ item.title }}
</div>
</nuxt-link>
</swiper-slide>
</swiper>
</client-only>
</template>
</div>
<div class="user flex flex-none">
<div v-if="publicData.name">
您好欢迎来到 {{ publicData.name }}
</div>
<ul class="flex flex-none">
<li v-if="publicData.nickname">
<el-popover placement="bottom" trigger="hover">
<div class="user-nav">
<nuxt-link
class="lighter xs item"
to="/user/user_wallet"
>我的钱包</nuxt-link
>
<nuxt-link
class="lighter xs item"
to="/user/coupons"
>优惠券({{
publicData.coupon_num
}})</nuxt-link
>
<nuxt-link
class="lighter xs item"
to="/user/collection"
>我的收藏</nuxt-link
>
<div
class="lighter xs item"
@click="onLogout"
>
退出登录
</div>
</div>
<nuxt-link
slot="reference"
to="/user/profile"
>
{{ publicData.nickname }}
<i class="el-icon-arrow-down"></i>
</nuxt-link>
</el-popover>
</li>
<li v-else>
<nuxt-link to="/account/login">登录</nuxt-link>
<nuxt-link to="/account/register"
>注册</nuxt-link
>
</li>
<li>
<nuxt-link to="/user/order">我的订单</nuxt-link>
</li>
<li>
<nuxt-link to="/user/profile"
>个人中心</nuxt-link
>
</li>
<li>
<nuxt-link to="/help_center"
>帮助中心</nuxt-link
>
</li>
<li>
<nuxt-link to="/store_settled"
>商家入驻</nuxt-link
>
</li>
2023-08-22 10:14:17 +00:00
<li>
<nuxt-link to="/about_us"
>关于我们</nuxt-link
>
</li>
<!-- <li
2023-08-10 06:59:52 +00:00
id="tel-phone-block"
v-if="
publicData.mnp_qr_code ||
publicData.oa_qr_code
"
>
<nuxt-link to="/"
>手机端
<i class="el-icon-arrow-down"></i>
</nuxt-link>
<div class="float-code flex bg-white">
<div
class="flex-col col-center bg-white"
v-if="publicData.mnp_qr_code"
>
<img
style="width: 100px; height: 100px"
:src="publicData.mnp_qr_code"
alt=""
/>
<div class="lighter m-t-10">
官方小程序
</div>
</div>
</div>
2023-08-22 10:14:17 +00:00
</li> -->
2023-08-10 06:59:52 +00:00
<li>
<nuxt-link to="/">返回官网</nuxt-link>
</li>
</ul>
</div>
</div>
</div>
<div class="header-main bg-white">
<div class="wrapper1180">
<div class="search-wrap flex row-between">
<nuxt-link to="/" class="flex row-center">
<img
:src="config.shop_login_logo"
class="logo"
alt="logo"
/>
</nuxt-link>
<div class="flex">
<div class="search flex">
<input
type="text"
v-model="name"
placeholder="请输入要搜索的商品名称"
@keyup.enter="toSearch"
/>
<el-button
class="search-btn"
type="primary"
@click="toSearch"
>
搜索
</el-button>
</div>
<el-button type="primary" plain class="cart">
<nuxt-link to="/shop_cart"
>购物车({{
publicData.cart_num
}})</nuxt-link
>
</el-button>
</div>
</div>
</div>
</div>
</div>
</header>
</template>
<script>
import { directive } from 'vue-awesome-swiper'
import { mapState, mapMutations, mapActions } from 'vuex'
export default {
directives: {
swiper: directive,
},
data() {
return {
name: '',
swiperOptions: {
direction: 'vertical',
// autoHeight: true,
height: 40,
initialSlide: 0,
autoplay: true,
},
}
},
methods: {
...mapMutations(['logout']),
...mapActions(['getPublicData']),
toSearch() {
if (!this.name) return this.$message.error('请输入商品名称')
this.$router.push({
2023-09-28 03:22:06 +00:00
path: '/search_goodsList',
2023-08-10 06:59:52 +00:00
query: {
name: this.name,
},
})
},
onLogout() {
this.logout()
this.$message({
message: '退出成功',
type: 'success',
})
setTimeout(() => location.reload(), 1500)
},
},
watch: {
$route: {
immediate: true,
handler: function (val) {
console.log(val)
if (val.path == '/goods_list') {
this.name = val.query.name
} else {
this.name = ''
}
},
},
},
computed: {
...mapState(['publicData', 'config']),
},
}
</script>
<style lang="scss" scoped>
.header-wrap {
min-width: 1180px;
position: relative;
z-index: 1000;
::v-deep .swiper-container {
margin-left: 0;
margin-right: 0;
height: 100%;
width: 400px;
}
.swiper-item {
color: #ccc;
height: 17px;
}
.header-con {
background-color: #101010;
height: 40px;
color: #f2f2f2;
> div {
height: 100%;
color: #cccccc;
a {
color: #cccccc;
&:hover {
color: #fff;
}
}
ul {
li {
margin-left: 20px;
}
#tel-phone-block {
position: relative;
&:hover .float-code {
display: flex;
box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
}
.float-code {
display: none;
position: absolute;
padding: 22px 16px;
background-color: white;
top: 24px;
right: -20px;
&::after {
content: '';
width: 8px;
box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
right: 35px;
top: -4px;
height: 8px;
background-color: #fff;
position: absolute;
}
}
}
}
}
}
.header-main {
.search-wrap {
height: 80px;
.logo {
height: 48px;
width: auto;
}
.search {
width: 460px;
height: 42px;
overflow: hidden;
input {
flex: 1;
height: 100%;
border-radius: 4px 0 0 4px;
border: 1px solid $--color-primary;
border-right-width: 0;
padding: 0 10px;
}
.search-btn {
width: 82px;
height: 42px;
cursor: pointer;
border-radius: 0 4px 4px 0;
}
}
.cart {
cursor: pointer;
border-radius: 4px;
width: 108px;
height: 42px;
margin-left: 16px;
}
}
}
}
.user-nav {
.item {
text-align: center;
line-height: 34px;
display: block;
cursor: pointer;
&:not(:last-child) {
border-bottom: 1px solid #e5e5e5;
}
&:hover {
color: $--color-primary;
}
}
}
</style>