async function loadComponents(isLanguageChange = false) {
try {
let existingHeader = document.querySelector('header#navbar');
if (!existingHeader) {
try {
const navbarResponse = await fetch('/components/navbar.html');
if (navbarResponse.ok) {
const navbarHTML = await navbarResponse.text();
document.body.insertAdjacentHTML('afterbegin', navbarHTML);
}
} catch (error) {
}
}
let existingFooter = document.querySelector('footer');
if (!existingFooter) {
try {
const footerResponse = await fetch('/components/footer.html');
if (footerResponse.ok) {
const footerHTML = await footerResponse.text();
document.body.insertAdjacentHTML('beforeend', footerHTML);
const footerElement = document.querySelector('footer');
if (footerElement) {
footerElement.classList.add('content-hidden');
}
}
} catch (error) {
}
}
let homePageData = {};
if (!isLanguageChange) {
try {
const currentLang = window.languageManager ? window.languageManager.currentLang : 'zh';
const response = await fetch(`/api/config?lang=${currentLang}`, {
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
});
if (response.ok) {
const data = await response.json();
if (data.success && data.config) {
homePageData = data.config;
localStorage.setItem('homePageData', JSON.stringify(homePageData));
localStorage.setItem('homePageDataLang', currentLang);
}
}
} catch (error) {
homePageData = JSON.parse(localStorage.getItem('homePageData') || '{}');
const currentLang = window.languageManager ? window.languageManager.currentLang : 'zh';
const cachedLang = localStorage.getItem('homePageDataLang');
if (cachedLang && cachedLang !== currentLang) {
try {
const response = await fetch(`/api/config?lang=${currentLang}`, {
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
});
if (response.ok) {
const data = await response.json();
if (data.success && data.config) {
homePageData = data.config;
localStorage.setItem('homePageData', JSON.stringify(homePageData));
localStorage.setItem('homePageDataLang', currentLang);
}
}
} catch (innerError) {
homePageData = {};
}
}
}
} else {
homePageData = JSON.parse(localStorage.getItem('homePageData') || '{}');
const currentLang = window.languageManager ? window.languageManager.currentLang : 'zh';
const cachedLang = localStorage.getItem('homePageDataLang');
if (cachedLang && cachedLang !== currentLang) {
try {
const response = await fetch(`/api/config?lang=${currentLang}`, {
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
});
if (response.ok) {
const data = await response.json();
if (data.success && data.config) {
homePageData = data.config;
localStorage.setItem('homePageData', JSON.stringify(homePageData));
localStorage.setItem('homePageDataLang', currentLang);
}
}
} catch (error) {
homePageData = {};
}
}
}
const footerData = homePageData.footer || {};
const logoImage = document.getElementById('logo-image');
const logoText = document.getElementById('logo-text');
const footerLogoImage = document.getElementById('footer-logo-image');
const footerLogoText = document.getElementById('footer-logo-text');
const footerDesc = document.querySelector('[data-lang-key="footer_desc"]');
const siteSettings = JSON.parse(localStorage.getItem('siteSettings') || '{}');
const logoSrc = siteSettings.logo || homePageData.logo || (footerData.column1 && footerData.column1.logo);
if (logoSrc) {
if (logoImage) {
logoImage.src = logoSrc;
logoImage.style.display = 'block';
logoText.style.display = 'none';
}
if (footerLogoImage) {
footerLogoImage.src = logoSrc;
footerLogoImage.style.display = 'block';
footerLogoText.style.display = 'none';
}
} else {
if (logoImage) {
logoImage.src = '/uploads/config-site-logo-1779330295058.png';
logoImage.style.display = 'block';
logoText.style.display = 'none';
}
if (footerLogoImage) {
footerLogoImage.src = '/uploads/config-site-logo-1779330295058.png';
footerLogoImage.style.display = 'block';
footerLogoText.style.display = 'none';
}
const logoTextContent = siteSettings.logoText || homePageData.logoText || (footerData.column1 && footerData.column1.logoText) || '无穷智能自动售货机';
if (logoText && logoTextContent.includes('智能自动售货机')) {
logoText.innerHTML = logoTextContent.replace('智能自动售货机', '智能自动售货机');
} else if (logoText) {
logoText.textContent = logoTextContent;
}
if (footerLogoText && logoTextContent.includes('智能自动售货机')) {
footerLogoText.innerHTML = logoTextContent.replace('智能自动售货机', '智能自动售货机');
} else if (footerLogoText) {
footerLogoText.textContent = logoTextContent;
}
}
if (footerDesc) {
if (footerData.column1 && footerData.column1.desc) {
footerDesc.textContent = footerData.column1.desc;
} else if (footerData.desc) {
footerDesc.textContent = footerData.desc;
}
}
const quickLinksTitle = document.querySelector('footer [data-lang-key="quick_links"]');
const quickLinksItems = document.querySelectorAll('footer [data-lang-key^="nav_"]');
if (footerData.column2) {
if (footerData.column2.title && quickLinksTitle) {
quickLinksTitle.textContent = footerData.column2.title;
}
if (footerData.column2.links && quickLinksItems) {
footerData.column2.links.forEach((link, index) => {
if (quickLinksItems[index]) {
quickLinksItems[index].textContent = link.text;
quickLinksItems[index].href = link.url || '#';
}
});
}
}
const contactInfoTitle = document.querySelector('footer [data-lang-key="contact_info"]');
const contactAddress = document.querySelector('footer [data-lang-key="contact_address"]');
const contactPhone = document.querySelector('footer [data-lang-key="contact_phone"]');
const contactEmail = document.querySelector('footer [data-lang-key="contact_email"]');
const qrCodeText = document.querySelector('footer .text-neutral-400.text-sm');
if (qrCodeText && !qrCodeText.hasAttribute('data-lang-key')) {
qrCodeText.setAttribute('data-lang-key', 'contact_qrcode_text');
}
const qrCodeElement = document.querySelector('footer .bg-white.p-4.rounded-md.mb-3 .w-32.h-32');
if (footerData.column3) {
if (footerData.column3.title && contactInfoTitle) {
contactInfoTitle.textContent = footerData.column3.title;
}
if (footerData.column3.address && contactAddress) {
contactAddress.textContent = footerData.column3.address;
}
if (footerData.column3.phone && contactPhone) {
contactPhone.textContent = footerData.column3.phone;
}
if (footerData.column3.email && contactEmail) {
contactEmail.textContent = footerData.column3.email;
}
if (footerData.column3.qrCodeText && qrCodeText) {
qrCodeText.textContent = footerData.column3.qrCodeText;
}
if (footerData.column3.qrCode && qrCodeElement) {
qrCodeElement.innerHTML = '';
const qrImg = document.createElement('img');
qrImg.src = footerData.column3.qrCode;
qrImg.alt = '二维码';
qrImg.loading = 'lazy';
qrImg.className = 'w-full h-full object-contain';
qrCodeElement.appendChild(qrImg);
}
}
const copyrightText = document.querySelector('[data-lang-key="copyright"] p');
if (copyrightText) {
if (footerData.copyright) {
copyrightText.innerHTML = footerData.copyright;
} else if (homePageData.footer && homePageData.footer.copyright) {
copyrightText.innerHTML = homePageData.footer.copyright;
}
}
const beianInfo = document.getElementById('beian-info');
if (beianInfo) {
const currentLang = window.languageManager ? window.languageManager.currentLang : 'zh';
fetch(`/api/config?lang=${currentLang}`, {
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
})
.then(response => response.json())
.then(data => {
if (data.success && data.config && data.config.beian) {
beianInfo.innerHTML = data.config.beian;
}
beianInfo.style.display = 'block';
beianInfo.style.visibility = 'visible';
beianInfo.style.opacity = '1';
})
.catch(error => {
});
}
const mallLinks = document.querySelectorAll('[data-lang-key="official_mall"]');
const mallUrl = homePageData.officialMallUrl || (homePageData.images && homePageData.images.officialMallUrl ? homePageData.images.officialMallUrl.url : '#');
mallLinks.forEach(link => {
link.href = mallUrl;
});
window.initMobileMenu = function() {
if (!document.getElementById('mobile-menu-btn') || !document.getElementById('mobile-menu')) {
return;
}
document.getElementById('mobile-menu-btn').onclick = function() {
const mobileMenu = document.getElementById('mobile-menu');
if (mobileMenu.classList.contains('hidden')) {
mobileMenu.classList.remove('hidden');
mobileMenu.style.opacity = '1';
mobileMenu.style.transform = 'translateY(0)';
} else {
mobileMenu.style.opacity = '0';
mobileMenu.style.transform = 'translateY(-10px)';
setTimeout(() => {
mobileMenu.classList.add('hidden');
}, 300);
}
};
const mobileMenuLinks = document.querySelectorAll('#mobile-menu a');
mobileMenuLinks.forEach(link => {
const originalOnClick = link.onclick || function() {};
link.onclick = function(event) {
originalOnClick.call(this, event);
const mobileMenu = document.getElementById('mobile-menu');
if (!mobileMenu.classList.contains('hidden')) {
mobileMenu.style.opacity = '0';
mobileMenu.style.transform = 'translateY(-10px)';
setTimeout(() => {
mobileMenu.classList.add('hidden');
}, 300);
}
};
});
const mobileProductsBtn = document.getElementById('mobile-products-btn');
const mobileProductsDropdown = document.getElementById('mobile-products-dropdown');
const mobileProductsArrow = document.querySelector('#mobile-products-btn i');
if (mobileProductsBtn && mobileProductsDropdown) {
mobileProductsDropdown.style.opacity = '0';
mobileProductsDropdown.style.transform = 'translateY(-10px)';
mobileProductsDropdown.style.transition = 'opacity 300ms ease, transform 300ms ease';
mobileProductsBtn.onclick = function(event) {
event.stopPropagation();
if (mobileProductsDropdown.classList.contains('hidden')) {
mobileProductsDropdown.classList.remove('hidden');
setTimeout(() => {
mobileProductsDropdown.style.opacity = '1';
mobileProductsDropdown.style.transform = 'translateY(0)';
}, 10);
} else {
mobileProductsDropdown.style.opacity = '0';
mobileProductsDropdown.style.transform = 'translateY(-10px)';
setTimeout(() => {
mobileProductsDropdown.classList.add('hidden');
}, 300);
}
if (mobileProductsArrow) {
mobileProductsArrow.classList.toggle('rotate-180');
}
};
}
const mobileProductsLinks = document.querySelectorAll('#mobile-products-dropdown a');
mobileProductsLinks.forEach(link => {
link.onclick = function() {
const mobileMenu = document.getElementById('mobile-menu');
if (!mobileMenu.classList.contains('hidden')) {
mobileMenu.style.opacity = '0';
mobileMenu.style.transform = 'translateY(-10px)';
setTimeout(() => {
mobileMenu.classList.add('hidden');
}, 300);
}
};
});
}
if (window.languageManager) {
window.languageManager.reinit();
}
const footerElement = document.querySelector('footer');
if (footerElement) {
footerElement.classList.remove('content-hidden');
footerElement.classList.add('content-visible');
}
window.initMobileMenu();
} catch (error) {
}
}
window.loadFooterData = loadComponents;