| | |
| | | <template> |
| | | <header class="bg-white shadow-sm"> |
| | | <div class="container mx-auto px-40"> |
| | | <div class="flex items-center justify-between h-16"> |
| | | <header class="bg-white shadow-sm flex items-center"> |
| | | <div class="flex w-full"> |
| | | <div class="flex items-center h-20 mx-auto"> |
| | | <!-- Logo --> |
| | | <div class="flex items-center"> |
| | | <div class="flex items-center cursor-pointer"> |
| | | <router-link to="/"> |
| | | <img src="/logo.svg" alt="Logo" class="h-8 w-auto" /> |
| | | <img :src="headerLogo" alt="Logo" class="h-20 w-auto" /> |
| | | </router-link> |
| | | <!-- <span class="text-extra-large font-bold">工业大数据平台</span> --> |
| | | </div> |
| | | |
| | | <!-- Navigation Menu --> |
| | | <nav class="flex-1 ml-8"> |
| | | <nav class="flex ml-8"> |
| | | <el-menu mode="horizontal" :ellipsis="false" class="border-none" router :default-active="activeRoute"> |
| | | <el-menu-item index="/" class="!px-4">首页</el-menu-item> |
| | | <el-menu-item index="/industrial-software" class="!px-4">工业软件|工业APP</el-menu-item> |
| | | <el-menu-item index="/supply-demand" class="!px-4">供需对接</el-menu-item> |
| | | <el-menu-item index="/application" class="!px-4">应用推广</el-menu-item> |
| | | <el-menu-item index="/public-service" class="!px-4">公共服务</el-menu-item> |
| | | <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="/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 index="/select-selpara" class="!px-4" @click="linkClick">泵选型</el-menu-item> |
| | | </el-menu> |
| | | </nav> |
| | | |
| | | <!-- Search and User Actions --> |
| | | <div class="flex items-center space-x-4"> |
| | | <el-input v-model="searchQuery" placeholder="找工业/找大数据" class="w-48"> |
| | | <div class="flex items-center space-x-8 ml-[65px]"> |
| | | <el-input v-model="searchQuery" placeholder="查证书" class="w-48" v-if="false"> |
| | | <template #suffix> |
| | | <el-icon><Search /></el-icon> |
| | | <el-icon class="cursor-pointer" @click="handleSearch"><Search /></el-icon> |
| | | </template> |
| | | </el-input> |
| | | |
| | | <div class="flex items-center text-gray-600 text-sm"> |
| | | <a href="#" class="hover:text-blue-500">注册</a> |
| | | <span class="mx-2">·</span> |
| | | <a href="#" class="hover:text-blue-500">登录</a> |
| | | <!-- 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.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.RealName }}</span> |
| | | <a href="#" class="hover:text-blue-500" @click.prevent="handleLogout">退出</a> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, computed } from 'vue'; |
| | | import { useRoute } from 'vue-router'; |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import headerLogo from '@/assets/logo/header_logo.png'; |
| | | import { Search, ShoppingCart } from '@element-plus/icons-vue'; |
| | | import { ElMessage } from 'element-plus'; |
| | | 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 searchQuery = ref(''); |
| | | |
| | | const handleSearch = () => { |
| | | if (!searchQuery.value) { |
| | | searchQuery.value = '查证书'; |
| | | } |
| | | router.push(`/eec-label-search`); |
| | | }; |
| | | const activeRoute = computed(() => route.path); |
| | | |
| | | // 获取用户信息 |
| | | const userInfo = computed(() => { |
| | | const UserInfo = loginStore.getUserInfo(); |
| | | return UserInfo ? UserInfo : null; |
| | | }); |
| | | |
| | | const toLogin = () => { |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { |
| | | redirectPath: route.fullPath, |
| | | }, |
| | | }); |
| | | }; |
| | | // 处理登出 |
| | | const handleLogout = () => { |
| | | loginStore.logOut(); |
| | | ElMessage.success('已退出登录'); |
| | | router.replace({ |
| | | path: '/login', |
| | | query: { redirectPath: route.fullPath }, |
| | | }); |
| | | }; |
| | | |
| | | 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> |
| | |
| | | :deep(.el-menu--horizontal) { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .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> |