国内市场双十一活动仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
5.7 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <link rel="icon" href="/favicon.ico" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  7. <title>新时代、新龙头、新节奏</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. body {
  15. font-family: "Microsoft Yahei", sans-serif;
  16. }
  17. /* 落地页 */
  18. .landing-page {
  19. width: 375px;
  20. height: auto;
  21. margin: 0 auto;
  22. overflow-y: auto;
  23. overflow-x: hidden;
  24. }
  25. .landing-page img {
  26. width: 100%;
  27. height: auto;
  28. display: block;
  29. }
  30. /* 弹窗 */
  31. .popup {
  32. display: none;
  33. position: fixed;
  34. top: 0;
  35. left: 0;
  36. width: 100%;
  37. height: 100%;
  38. background: rgba(0, 0, 0, 0.7);
  39. justify-content: center;
  40. align-items: center;
  41. z-index: 999;
  42. }
  43. .popup.show {
  44. display: flex;
  45. }
  46. .popup-content {
  47. width: 320px;
  48. text-align: center;
  49. }
  50. .popup-content img {
  51. width: 100%;
  52. height: auto;
  53. margin-bottom: 15px;
  54. }
  55. .popup-content img#closeBtn {
  56. width: 60%;
  57. margin-bottom: 5px;
  58. }
  59. </style>
  60. </head>
  61. <body>
  62. <!-- 落地页 -->
  63. <div class="landing-page">
  64. <img id="landingImage" />
  65. </div>
  66. <!-- 弹窗样式 -->
  67. <div class="popup" id="popup">
  68. <div class="popup-content">
  69. <img id="popupImage" />
  70. <img src="./assent/开心收下.png" id="closeBtn"/>
  71. </div>
  72. </div>
  73. <script type="module">
  74. // 导入API函数
  75. import { getImageApi, acceptCardApi } from './src/api/member.js';
  76. const userAgent = navigator.userAgent;
  77. // 获取弹窗元素
  78. const landingImage = document.getElementById('landingImage');
  79. const popupImage = document.getElementById('popupImage');
  80. const popup = document.getElementById("popup");
  81. const closeBtn = document.getElementById("closeBtn");
  82. // 防抖多次点击
  83. let isClickable = true;
  84. // 记录页面打开时间
  85. const pageOpenTime = getBeijingTime();
  86. // 获取北京时间(东八区)的函数
  87. function getBeijingTime() {
  88. const date = new Date();
  89. const beijingTime = new Date(date.getTime() + 8 * 60 * 60 * 1000);
  90. return beijingTime.toISOString();
  91. }
  92. // 缓存键名
  93. const CACHE_KEY = 'landing_image';
  94. // 从缓存获取落地图
  95. function getLandingImageFromCache() {
  96. const cached = localStorage.getItem(CACHE_KEY);
  97. return cached ? JSON.parse(cached) : null;
  98. }
  99. // 将落地图存入缓存
  100. function saveLandingImageToCache(imageUrl) {
  101. localStorage.setItem(CACHE_KEY, JSON.stringify({
  102. url: imageUrl,
  103. }));
  104. }
  105. // 获取图片方法
  106. async function getImage() {
  107. try {
  108. const res = await getImageApi({
  109. id:3
  110. });
  111. console.log(res.data)
  112. if (res.code == 200 && res.data) {
  113. return {
  114. landingImageUrl: res.data.list[0].landing_page,
  115. popupImageUrl: res.data.list[0].landing_page_popup
  116. };
  117. } else {
  118. console.warn('网络错误,请稍后重试');
  119. return null;
  120. }
  121. } catch (error) {
  122. console.error('网络错误,请稍后重试');
  123. return null
  124. }
  125. }
  126. // 加载
  127. window.onload = async function () {
  128. try {
  129. await acceptCardApi({
  130. user_info:userAgent,
  131. state: 0,
  132. });
  133. // 缓存
  134. const cachedImage = getLandingImageFromCache();
  135. // 接口
  136. const imagePaths = await getImage();
  137. // 确定最终落地图和是否展示弹窗
  138. let finalLandingUrl;
  139. let shouldShowPopup = false;
  140. if (imagePaths?.landingImageUrl) {
  141. finalLandingUrl = imagePaths.landingImageUrl;
  142. if (!cachedImage || cachedImage.url !== finalLandingUrl) {
  143. shouldShowPopup = true;
  144. saveLandingImageToCache(finalLandingUrl);
  145. popupImage.src = imagePaths.popupImageUrl;
  146. }
  147. } else {
  148. // 接口失败时使用缓存(如果有)
  149. finalLandingUrl = cachedImage?.url;
  150. }
  151. // 4. 设置落地图
  152. landingImage.src = finalLandingUrl;
  153. // 5. 新增:根据对比结果决定是否展示弹窗
  154. if (shouldShowPopup) {
  155. setTimeout(() => {
  156. popup.classList.add("show");
  157. }, 500);
  158. }
  159. } catch (err) {
  160. console.error('页面初始化失败');
  161. }
  162. };
  163. // 点击"开心收下",关闭弹窗
  164. closeBtn.addEventListener('click', closePopupAndSendData);
  165. // 点击弹窗空白处,关闭弹窗
  166. popup.addEventListener('click', function(e) {
  167. if (e.target === popup) {
  168. closePopupAndSendData();
  169. }
  170. });
  171. // 关闭弹窗并发送数据
  172. async function closePopupAndSendData() {
  173. if (!isClickable) {
  174. return;
  175. }
  176. // 关闭弹窗
  177. popup.classList.remove("show");
  178. // 发送页面打开时间到后端
  179. try {
  180. await acceptCardApi({
  181. user_info:userAgent,
  182. state: 1,
  183. });
  184. } catch (error) {
  185. console.error('发送失败', pageOpenTime);
  186. }
  187. // 设置点击冷却
  188. isClickable = false;
  189. setTimeout(() => {
  190. isClickable = true;
  191. }, 10000);
  192. }
  193. </script>
  194. </body>
  195. </html>