| | |
| | | <template> |
| | | <header class="bg-white shadow-sm flex items-center"> |
| | | <div class="flex w-full"> |
| | | <div class="flex items-center h-20 mx-auto"> |
| | | <header class="bg-white shadow-sm flex header-div"> |
| | | <div class="flex w-full h-full" style="flex-direction: column;"> |
| | | <div class="flex w-full h-full header-layout-div"> |
| | | <!-- Logo --> |
| | | <div class="flex items-center cursor-pointer"> |
| | | <div class="flex items-center cursor-pointer h-full"> |
| | | <router-link to="/"> |
| | | <img :src="headerLogo" alt="Logo" class="h-20 w-auto" /> |
| | | <img :src="headerLogo" alt="Logo" class="header-logo w-auto" /> |
| | | </router-link> |
| | | <!-- <span class="text-extra-large font-bold">工业大数据平台</span> --> |
| | | </div> |
| | |
| | | <nav class="flex ml-8"> |
| | | <el-menu mode="horizontal" :ellipsis="false" class="border-none" router :default-active="activeRoute"> |
| | | <el-menu-item index="/home" class="!px-4">首页</el-menu-item> |
| | | <el-menu-item index="/certified-products" class="!px-4">认证产品</el-menu-item> |
| | | <el-menu-item index="/certified-products" class="!px-4">能效产品</el-menu-item> |
| | | <el-menu-item index="/eec-label-search" class="!px-4">证书查询</el-menu-item> |
| | | <el-menu-item index="/news-detail/99" class="!px-4">补贴政策</el-menu-item> |
| | | <el-menu-item class="!px-4" @click="linkClick(' http://www.xpump.net/web/#/CN/Index')">查泵网</el-menu-item> |
| | | <el-menu-item index="/news-detail/99" class="!px-4">政策文件</el-menu-item> |
| | | <el-menu-item index="/select-selpara" class="!px-4" @click="linkClick">泵选型</el-menu-item> |
| | | <el-menu-item index="/gb19762-2025" class="!px-4">计算工具</el-menu-item> |
| | | </el-menu> |
| | | </nav> |
| | | |
| | | <!-- Search and User Actions --> |
| | | <div class="flex items-center space-x-8 ml-[65px]"> |
| | | <el-input v-model="searchQuery" placeholder="查证书" class="w-48"> |
| | | <el-input v-model="searchQuery" placeholder="查证书" class="w-48" v-if="false"> |
| | | <template #suffix> |
| | | <el-icon class="cursor-pointer" @click="handleSearch"><Search /></el-icon> |
| | | </template> |
| | | </el-input> |
| | | |
| | | <!-- Add shopping cart icon here --> |
| | | <div class="flex items-center gap-4" @click="goToCart"> |
| | | <el-badge :value="cartCount" :max="99" class="cart-badge"> |
| | | <el-button class="flex items-center" link> |
| | | <el-icon class="text-lg" style="font-size: 20px;"><ShoppingCart /></el-icon> |
| | | </el-button> |
| | | </el-badge> |
| | | </div> |
| | | |
| | | <div class="flex items-center text-gray-600 text-sm text-nowrap"> |
| | | <template v-if="!userInfo"> |
| | | <a href="#" class="hover:text-blue-500">注册</a> |
| | | <span class="mx-2">·</span> |
| | | <router-link to="/login" class="hover:text-blue-500">登录</router-link> |
| | | <template v-if="!userInfo.Token"> |
| | | <!-- <a href="#" class="hover:text-blue-500">注册</a> |
| | | <span class="mx-2">·</span> --> |
| | | <a @click="toLogin" class="hover:text-blue-500">登录</a> |
| | | </template> |
| | | <template v-else> |
| | | <span class="text-blue-500 mr-2">{{ userInfo.username }}</span> |
| | | <span class="text-blue-500 mr-2">{{ userInfo.RealName }}</span> |
| | | <a href="#" class="hover:text-blue-500" @click.prevent="handleLogout">退出</a> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 顶部产品搜索框 --> |
| | | <div class="header-tool-div" v-show="false"> |
| | | <div class="search-input-div"> |
| | | <input /> |
| | | <button>搜索</button> |
| | | </div> |
| | | <div></div> |
| | | <div></div> |
| | | </div> |
| | | </div> |
| | | </header> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import headerLogo from '@/assets/logo/header_logo.png'; |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import { Search, ShoppingCart } from '@element-plus/icons-vue'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import { computed, ref } from 'vue'; |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { useRoute, useRouter } from 'vue-router'; |
| | | import { useLogin } from '@/stores/useLogin'; |
| | | import { useCartStore } from '@/stores/useCartStore'; |
| | | |
| | | const loginStore = useLogin(); |
| | | const cartStore = useCartStore(); |
| | | |
| | | const route = useRoute(); |
| | | const router = useRouter(); |
| | |
| | | |
| | | // 获取用户信息 |
| | | const userInfo = computed(() => { |
| | | const info = localStorage.getItem('userInfo'); |
| | | return info ? JSON.parse(info) : null; |
| | | const UserInfo = loginStore.getUserInfo(); |
| | | return UserInfo ? UserInfo : null; |
| | | }); |
| | | |
| | | const toLogin = () => { |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { |
| | | redirectPath: route.fullPath, |
| | | }, |
| | | }); |
| | | }; |
| | | // 处理登出 |
| | | const handleLogout = () => { |
| | | localStorage.removeItem('userInfo'); |
| | | loginStore.logOut(); |
| | | ElMessage.success('已退出登录'); |
| | | router.push('/login'); |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { redirectPath: route.fullPath }, |
| | | }); |
| | | }; |
| | | |
| | | const linkClick = (url) => { |
| | | window.open(url, '_blank'); |
| | | const linkClick = () => { |
| | | if (userInfo.value.Token) { |
| | | router.push('/select-selpara'); |
| | | } else { |
| | | loginStore.logOut(); |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { redirectPath: route.fullPath }, |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | // 从 Pinia store 获取购物车数量 |
| | | const cartCount = computed(() => cartStore.cartItemCount); |
| | | |
| | | const goToCart = () => { |
| | | if (userInfo.value.Token) { |
| | | router.push('/cart'); |
| | | } else { |
| | | loginStore.logOut(); |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { redirectPath: route.fullPath }, |
| | | }); |
| | | return |
| | | } |
| | | |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | <style lang="scss" scoped> |
| | | :deep(.el-menu--horizontal .el-menu-item) { |
| | | height: 64px; |
| | | line-height: 64px; |
| | |
| | | :deep(.el-menu--horizontal) { |
| | | border-bottom: none; |
| | | } |
| | | .header-layout-div{ |
| | | padding-left: 231px; |
| | | height: 87px; |
| | | width: 100%; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .header-logo{ |
| | | height: 68px; |
| | | } |
| | | .header-tool-div{ |
| | | padding-left: 258px; |
| | | width: 100%; |
| | | height: 64px; |
| | | background: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)); |
| | | border: 1px solid rgba(158, 158, 158, 0.4); |
| | | box-sizing: border-box; |
| | | .search-input-div{ |
| | | input { |
| | | width: 482px; |
| | | height: 39px; |
| | | background: #FFFFFF; |
| | | box-shadow: 0px 2px 3px 0px #FFFFFF, 0px 2px 3px 0px rgba(0,0,0,0.4); |
| | | border-radius: 6px; |
| | | } |
| | | button { |
| | | width: 68px; |
| | | height: 42px; |
| | | background: linear-gradient(0deg, rgba(0,0,0,0.8), rgba(255,255,255,0.8)); |
| | | box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.3); |
| | | border: 1px solid; |
| | | border-image: linear-gradient(180deg, #C2C2C2, #989898) 1 1; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | .cart-badge :deep(.el-badge__content) { |
| | | animation: cartBadgeAnimation 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | } |
| | | |
| | | @keyframes cartBadgeAnimation { |
| | | 0% { |
| | | transform: scale(0); |
| | | opacity: 0; |
| | | } |
| | | 50% { |
| | | transform: scale(1.2); |
| | | } |
| | | 100% { |
| | | transform: scale(1); |
| | | opacity: 1; |
| | | } |
| | | } |
| | | </style> |