footer.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <div class="custom-modal" id="languageModal" aria-hidden="true">
  2. <div class="custom-modal-dialog custom-modal-dialog-language">
  3. <div class="custom-modal-box language-modal-box">
  4. <div class="custom-modal-head language-modal-head">
  5. <div>
  6. <h2 class="modal-title">
  7. {:cms_t('choose_language_region','请选择您的国家与地区')}
  8. </h2>
  9. </div>
  10. <button class="custom-modal-close" data-close-modal="languageModal" aria-label="{:cms_t('close','关闭')}">
  11. ×
  12. </button>
  13. </div>
  14. <div class="custom-modal-body">
  15. <div class="language-list premium-language-list">
  16. {if !empty($site_regions)}
  17. {volist name="site_regions" id="region"}
  18. <a class="language-option premium-language-option {if !empty($site_region) && strtoupper($site_region['code']) == strtoupper($region['code'])}active{/if}" href="{:cms_switch_region_url($region['code'])}">
  19. <span class="premium-language-option-country">{$region.name|default=$region.code}</span>
  20. <span class="premium-language-option-lang">{:cms_region_lang_label($region['lang'])}</span>
  21. </a>
  22. {/volist}
  23. {/if}
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="site-floating-tools" aria-label="{:cms_t('floating_tools','快捷操作')}">
  30. <button class="site-floating-tool site-floating-tool-top" type="button" id="backToTopBtn" aria-label="{:cms_t('back_to_top','返回顶部')}">
  31. <span class="site-floating-tool-btn"><i class="bi bi-chevron-up"></i></span>
  32. <span class="site-floating-tool-text">{:cms_t('back_to_top','返回顶部')}</span>
  33. </button>
  34. <div class="site-floating-tool site-floating-tool-service" tabindex="0" aria-label="{:getCategory(58,'catname')}">
  35. <div class="site-floating-tool-panel support-float-panel">
  36. <div class="support-float-card-list">
  37. {yzn module="cms" action="lists" catid="58" cache="3600" order="listorder DESC,id ASC" num="3" return="floatServices" moreinfo="1"}
  38. {volist name="floatServices" id="vo"}
  39. <section class="support-float-card-item">
  40. <div class="support-float-card-icon">
  41. {if !empty($vo.thumb)}
  42. <img src="{$vo.thumb}" alt="{$vo.title}">
  43. {else /}
  44. <i class="bi bi-headset"></i>
  45. {/if}
  46. </div>
  47. <div class="support-float-card-copy">
  48. <h3>{$vo.title}</h3>
  49. {if !empty($vo.title1)}<p>{$vo.title1}</p>{/if}
  50. {if !empty($vo.title2)}<p>{$vo.title2}</p>{/if}
  51. {if !empty($vo.tourl)}
  52. <a href="{$vo.tourl}" target="{$vo.target|default='_self'}">{$vo.title} <i class="bi bi-chevron-right"></i></a>
  53. {/if}
  54. </div>
  55. </section>
  56. {/volist}
  57. {/yzn}
  58. </div>
  59. </div>
  60. <span class="site-floating-tool-avatar">
  61. <img src="/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png" alt="{:getCategory(58,'catname')}">
  62. </span>
  63. <button class="site-floating-tool-btn" type="button" aria-label="{:getCategory(58,'catname')}"><i class="bi bi-headset"></i></button>
  64. <span class="site-floating-tool-text">{:getCategory(58,'catname')}</span>
  65. </div>
  66. <div class="site-floating-tool site-floating-tool-feedback" tabindex="0" aria-label="{:cms_t('support_feedback','评价打分')}">
  67. <div class="site-floating-tool-panel feedback-float-panel">
  68. <form class="feedback-float-form" id="feedbackFloatForm" data-submit-url="{:url('index/feedback/submit')}">
  69. <div class="feedback-float-head">
  70. <h2 class="feedback-float-title">{:cms_t('feedback_title','您要评价哪个方面:')}</h2>
  71. </div>
  72. <div class="feedback-float-options" role="radiogroup" aria-label="{:cms_t('feedback_title','您要评价哪个方面:')}">
  73. <label class="feedback-float-option is-active">
  74. <input type="radio" name="feedback_type" value="website" checked>
  75. <span>{:cms_t('feedback_type_website','官网体验(页面浏览/设计)')}</span>
  76. </label>
  77. <label class="feedback-float-option">
  78. <input type="radio" name="feedback_type" value="service">
  79. <span>{:cms_t('feedback_type_service','服务体验(售后/客服)')}</span>
  80. </label>
  81. <label class="feedback-float-option">
  82. <input type="radio" name="feedback_type" value="product">
  83. <span>{:cms_t('feedback_type_product','产品体验(产品/配套软件)')}</span>
  84. </label>
  85. </div>
  86. <div class="feedback-float-divider"></div>
  87. <div class="feedback-float-rating-block">
  88. <h3>{:cms_t('feedback_rate_prompt','请对“官网体验”进行评价。')}</h3>
  89. <div class="feedback-float-stars" data-rating="0">
  90. <button type="button" class="feedback-star" data-value="1" aria-label="1 星">★</button>
  91. <button type="button" class="feedback-star" data-value="2" aria-label="2 星">★</button>
  92. <button type="button" class="feedback-star" data-value="3" aria-label="3 星">★</button>
  93. <button type="button" class="feedback-star" data-value="4" aria-label="4 星">★</button>
  94. <button type="button" class="feedback-star" data-value="5" aria-label="5 星">★</button>
  95. </div>
  96. <input type="hidden" name="rating" id="feedbackFloatRating" value="0">
  97. <input type="hidden" name="source_page" value="">
  98. </div>
  99. <button class="feedback-float-submit" id="feedbackFloatSubmit" type="submit" disabled>{:cms_t('submit','提交')}</button>
  100. <div class="feedback-float-message" id="feedbackFloatMessage"></div>
  101. </form>
  102. </div>
  103. <button class="site-floating-tool-btn" type="button" aria-label="{:cms_t('support_feedback','评价打分')}"><i class="bi bi-clipboard-check"></i></button>
  104. <span class="site-floating-tool-text">{:cms_t('support_feedback','评价打分')}</span>
  105. </div>
  106. </div>
  107. <footer class="site-footer">
  108. <div class="content-1300-wrap site-footer-inner">
  109. <div class="site-footer-top">
  110. <div class="site-footer-links">
  111. <a href="{:getCategory(42,'url')}">{:getCategory(42,'catname')}</a>
  112. <span class="footer-divider">|</span>
  113. <a href="{:getCategory(45,'url')}">{:getCategory(45,'catname')}</a>
  114. <span class="footer-divider">|</span>
  115. <a href="{:getCategory(44,'url')}">{:getCategory(44,'catname')}</a>
  116. <span class="footer-divider">|</span>
  117. <a href="/d/help/17.html">{:cms_t('cookie_policy','Cookie 政策')}</a>
  118. </div>
  119. <button class="site-footer-locale" type="button" id="openLanguageModalFooter" aria-label="{:cms_t('switch_language_region','切换国家与地区')}">
  120. <i class="bi bi-globe2"></i>
  121. <span>
  122. {if !empty($site_region)}
  123. {:cms_region_display_name($site_region)}
  124. {else /}
  125. {$site_lang|strtoupper}
  126. {/if}
  127. </span>
  128. </button>
  129. </div>
  130. <div class="site-footer-bottom">
  131. <div class="site-footer-meta">
  132. <span>Copyright © 2026 xtu All rights reserved.</span>
  133. <a href="#">粤ICP备 </a>
  134. </div>
  135. <div class="site-footer-note">
  136. {:cms_t('footer_compliance_note','本网站直接或间接向消费者推销商品或者服务的商业宣传均属于广告(包装及参数、售后保障等商品信息除外)')}
  137. </div>
  138. </div>
  139. </div>
  140. </footer>
  141. <script src="/assets/xtu/vendor/bootstrap.bundle.min.js"></script>
  142. <script src="/assets/xtu/vendor/swiper-bundle.min.js"></script>
  143. <script>
  144. (function () {
  145. const form = document.getElementById('footerSubscribeForm');
  146. const emailInput = document.getElementById('footerSubscribeEmail');
  147. const submitBtn = document.getElementById('footerSubscribeBtn');
  148. const messageBox = document.getElementById('footerSubscribeMessage');
  149. const consentInput = document.getElementById('footerSubscribeConsent');
  150. const sourcePageInput = document.getElementById('footerSubscribeSourcePage');
  151. if (!form || !emailInput) {
  152. return;
  153. }
  154. const texts = {
  155. invalid: "{:cms_t('footer_subscribe_invalid_email','请输入正确的邮箱地址')}",
  156. consent: "{:cms_t('footer_subscribe_privacy_required','请先勾选并同意隐私政策')}",
  157. success: "{:cms_t('footer_subscribe_success','订阅成功,请留意邮箱通知')}",
  158. failed: "{:cms_t('footer_subscribe_failed','订阅失败,请稍后再试')}",
  159. sending: "{:cms_t('footer_subscribe_sending','提交中...')}"
  160. };
  161. function setMessage(text, type) {
  162. if (!messageBox) return;
  163. messageBox.textContent = text || '';
  164. messageBox.className = 'footer-subscribe-message' + (type ? ' is-' + type : '');
  165. }
  166. form.addEventListener('submit', async function (e) {
  167. e.preventDefault();
  168. const email = (emailInput.value || '').trim();
  169. if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
  170. emailInput.focus();
  171. setMessage(texts.invalid, 'error');
  172. return;
  173. }
  174. if (consentInput && !consentInput.checked) {
  175. consentInput.focus();
  176. setMessage(texts.consent, 'error');
  177. return;
  178. }
  179. if (sourcePageInput) sourcePageInput.value = window.location.href;
  180. if (submitBtn) submitBtn.disabled = true;
  181. setMessage(texts.sending, 'loading');
  182. try {
  183. const body = new URLSearchParams(new FormData(form));
  184. const res = await fetch("{:url('index/emailsubscribe/submit')}", {
  185. method: 'POST',
  186. headers: {
  187. 'X-Requested-With': 'XMLHttpRequest',
  188. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  189. },
  190. body: body.toString()
  191. });
  192. const data = await res.json();
  193. if (data.code === 1) {
  194. form.reset();
  195. setMessage(data.msg || texts.success, 'success');
  196. } else {
  197. setMessage(data.msg || texts.failed, 'error');
  198. }
  199. } catch (err) {
  200. setMessage(texts.failed, 'error');
  201. } finally {
  202. if (submitBtn) submitBtn.disabled = false;
  203. }
  204. });
  205. })();
  206. </script>
  207. <script src="/assets/xtu/script.js"></script>
  208. </body>
  209. </html>