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;