2025-02-27 04:00:56 +00:00
|
|
|
|
<template>
|
|
|
|
|
<header className="header flex items-center justify-between">
|
|
|
|
|
<div class="logo">
|
|
|
|
|
<img src="@/assets/image/logo.png" alt="logo" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="tabs">
|
|
|
|
|
<div class="tab-item pt-[10px]" @click="handleLanguageChange">
|
|
|
|
|
{{ currentLanguageLabel }}
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-language.png"
|
|
|
|
|
alt="language"
|
|
|
|
|
class="w-[18px] ml-[13px]"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="ml-[53px] cursor" @click="handleMenuClick">
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-menu.png"
|
|
|
|
|
class="w-[115px]"
|
|
|
|
|
alt="logo"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<n-drawer
|
|
|
|
|
v-model:show="state.dialogMenu"
|
|
|
|
|
default-width="100%"
|
|
|
|
|
resizable
|
|
|
|
|
placement="left"
|
|
|
|
|
>
|
|
|
|
|
<n-drawer-content>
|
|
|
|
|
<template #header>
|
|
|
|
|
<div class="flex flex-wrap items-center justify-between px-[143px]">
|
|
|
|
|
<img src="@/assets/image/logo.png" class="w-[270px]" alt="logo" />
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-header-close.png"
|
|
|
|
|
class="w-[35px] h-[35px] cursor"
|
|
|
|
|
alt="close"
|
|
|
|
|
@click="state.dialogMenu = false"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<div class="flex flex-wrap font-semibold text-[35px] text-[#10253E]">
|
|
|
|
|
<div
|
|
|
|
|
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
|
|
|
|
|
@click="handleTabClick('home')"
|
|
|
|
|
>
|
|
|
|
|
{{ t("home.nav.home") }}
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-menu-right.png"
|
|
|
|
|
class="w-[22px] h-[38px]"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="divider3"></div>
|
|
|
|
|
<div
|
|
|
|
|
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
|
|
|
|
|
@click="handleTabClick('companyprofil')"
|
|
|
|
|
>
|
|
|
|
|
{{ t("home.nav.company") }}
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-menu-right.png"
|
|
|
|
|
class="w-[22px] h-[38px]"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="divider3"></div>
|
|
|
|
|
<div
|
|
|
|
|
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
|
|
|
|
|
@click="handleTabClick('businessintroduction')"
|
|
|
|
|
>
|
|
|
|
|
{{ t("home.nav.businessintroduction") }}
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-menu-right.png"
|
|
|
|
|
class="w-[22px] h-[38px]"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
2025-03-14 09:05:00 +00:00
|
|
|
|
<div class="divider3"></div>
|
|
|
|
|
<div
|
|
|
|
|
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
|
|
|
|
|
@click="handleTabClick('investor')"
|
|
|
|
|
>
|
|
|
|
|
投资者关系
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-menu-right.png"
|
|
|
|
|
class="w-[22px] h-[38px]"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
2025-02-27 04:00:56 +00:00
|
|
|
|
<div class="divider3"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</n-drawer-content>
|
|
|
|
|
</n-drawer>
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<!-- 语言选择模态框 - 使用纯div实现 -->
|
|
|
|
|
<div v-if="showLanguageModal" class="language-modal">
|
|
|
|
|
<div class="language-modal-backdrop" @click="closeLanguageModal"></div>
|
|
|
|
|
<div class="language-modal-content">
|
|
|
|
|
<div class="modal-header font-semibold flex items-center">
|
|
|
|
|
{{ $t("home.nav.please_select") }}
|
|
|
|
|
<img
|
|
|
|
|
src="@/assets/image/home/768/icon-close.png"
|
|
|
|
|
alt="close"
|
|
|
|
|
class="close-btn w-[102px]"
|
|
|
|
|
@click="closeLanguageModal"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="language-modal-body">
|
|
|
|
|
<div
|
|
|
|
|
v-for="option in languageOptions"
|
|
|
|
|
:key="option.value"
|
|
|
|
|
class="language-option"
|
|
|
|
|
:class="{ active: selectedLanguage === option.value }"
|
|
|
|
|
@click="selectedLanguage = option.value"
|
|
|
|
|
>
|
|
|
|
|
{{ option.label }}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="language-modal-footer">
|
|
|
|
|
<button class="confirm-btn" @click="confirmLanguageChange">
|
|
|
|
|
{{ $t("home.nav.confirm_select") }}
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import { onUnmounted, ref, watch, onMounted, computed, reactive } from "vue";
|
|
|
|
|
import { useI18n } from "vue-i18n";
|
|
|
|
|
const { t } = useI18n();
|
|
|
|
|
import { useHome } from "@/store/home/index.js";
|
|
|
|
|
const { currentTab } = useHome();
|
|
|
|
|
import { useRouter } from "vue-router";
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
import { useLanguage } from "@/utils/changeLanguage.js";
|
|
|
|
|
import { NDrawer, NDrawerContent } from "naive-ui";
|
|
|
|
|
const {
|
|
|
|
|
languageOptions,
|
|
|
|
|
currentLanguageLabel,
|
|
|
|
|
changeLanguage,
|
|
|
|
|
initLanguage,
|
|
|
|
|
currentLang,
|
|
|
|
|
} = useLanguage();
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
initLanguage();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const state = reactive({
|
|
|
|
|
dialogMenu: false,
|
|
|
|
|
});
|
|
|
|
|
const handleMenuClick = () => {
|
|
|
|
|
state.dialogMenu = true;
|
|
|
|
|
};
|
|
|
|
|
const emit = defineEmits(["triggerLanguageChange"]);
|
|
|
|
|
const handleTabClick = (tab) => {
|
|
|
|
|
currentTab.value = tab;
|
|
|
|
|
router.push("/" + tab);
|
|
|
|
|
};
|
|
|
|
|
// 语言选择模态框相关变量
|
|
|
|
|
const showLanguageModal = ref(false);
|
|
|
|
|
// 默认选中的语言,从localStorage获取,如果没有则默认为简体中文
|
|
|
|
|
const selectedLanguage = ref(localStorage.getItem("language") || "zh");
|
|
|
|
|
|
|
|
|
|
// 打开语言选择模态框
|
|
|
|
|
const handleLanguageChange = () => {
|
|
|
|
|
showLanguageModal.value = true;
|
|
|
|
|
// 打开时设置当前选中的语言
|
|
|
|
|
selectedLanguage.value = localStorage.getItem("language") || "zh";
|
|
|
|
|
// 禁止背景滚动
|
|
|
|
|
document.body.style.overflow = "hidden";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 确认语言选择
|
|
|
|
|
const confirmLanguageChange = () => {
|
|
|
|
|
changeLanguage(selectedLanguage.value);
|
|
|
|
|
emit("triggerLanguageChange", selectedLanguage.value);
|
|
|
|
|
// 关闭模态框
|
|
|
|
|
showLanguageModal.value = false;
|
|
|
|
|
// 恢复背景滚动
|
|
|
|
|
document.body.style.overflow = "";
|
|
|
|
|
window.location.reload(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 关闭语言选择模态框
|
|
|
|
|
const closeLanguageModal = () => {
|
|
|
|
|
showLanguageModal.value = false;
|
|
|
|
|
// 恢复背景滚动
|
|
|
|
|
document.body.style.overflow = "";
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
.header {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 155px;
|
|
|
|
|
position: fixed;
|
|
|
|
|
z-index: 10;
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
right: 0;
|
|
|
|
|
padding: 0 200px 0 188px;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
}
|
|
|
|
|
.logo {
|
|
|
|
|
img {
|
|
|
|
|
width: 270px;
|
|
|
|
|
height: 83px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tabs {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
.tab-item {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
font-size: 30px;
|
|
|
|
|
color: #000000;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
transition: color 0.3s ease;
|
|
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
|
color: #8b59fa;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
|
color: #8b59fa;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 语言选择模态框样式 */
|
|
|
|
|
.language-modal {
|
|
|
|
|
position: fixed;
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
z-index: 1000;
|
|
|
|
|
touch-action: none; /* 防止触摸事件影响背景 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-modal-backdrop {
|
|
|
|
|
position: fixed;
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|
|
|
|
z-index: 1001;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-modal-content {
|
|
|
|
|
position: fixed;
|
|
|
|
|
bottom: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
max-height: 90vh; /* 最大高度为视口高度的90% */
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
z-index: 1002;
|
|
|
|
|
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1);
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
overflow: hidden; /* 内容溢出隐藏 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.modal-header {
|
|
|
|
|
padding: 33px 38px 55px 38px;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
|
|
|
font-size: 40px;
|
|
|
|
|
color: #000000;
|
|
|
|
|
position: relative;
|
|
|
|
|
flex-shrink: 0; /* 不允许头部收缩 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.close-btn {
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-modal-body {
|
|
|
|
|
padding: 10px 0;
|
|
|
|
|
overflow-y: auto; /* 只有内容区域可滚动 */
|
|
|
|
|
-webkit-overflow-scrolling: touch; /* 为iOS设备提供平滑滚动 */
|
|
|
|
|
flex: 1; /* 内容区域填充剩余空间 */
|
|
|
|
|
overscroll-behavior: contain; /* 阻止滚动穿透 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-option {
|
|
|
|
|
padding: 30px 0;
|
|
|
|
|
font-size: 40px;
|
|
|
|
|
color: #333;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
transition: background-color 0.3s;
|
|
|
|
|
text-align: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-option:hover,
|
|
|
|
|
.language-option.active {
|
|
|
|
|
background-color: #f5f5f5;
|
|
|
|
|
color: #8b59f7;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.language-modal-footer {
|
|
|
|
|
padding: 40px 38px;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
flex-shrink: 0; /* 不允许底部收缩 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.confirm-btn {
|
|
|
|
|
background-color: #8b59f7;
|
|
|
|
|
color: white;
|
|
|
|
|
border: none;
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
padding: 23px 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
font-size: 40px;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.confirm-btn:hover {
|
|
|
|
|
background-color: #7a48e6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.divider3 {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 10px;
|
|
|
|
|
background-image: linear-gradient(to right, #e6eaee 50%, transparent 50%);
|
|
|
|
|
background-size: 40px 6px; // 第一个值是宽度,第二个值是虚线的总长度(实线+空白)
|
|
|
|
|
background-repeat: repeat-x;
|
|
|
|
|
}
|
|
|
|
|
</style>
|