category.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>易租租-分类</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <link rel="stylesheet" href="/api/static/css/index.css">
  8. <link rel="stylesheet" href="/api/static/css/category.css">
  9. </head>
  10. <body>
  11. {{template "NavigationBar.tmpl" .}}
  12. <div class="category-page">
  13. <div class="category-page-menu">
  14. {{- range $index, $menu := .menus}}
  15. <div class="category-menu-item" data-value="{{$menu.id}}">{{$menu.typeName}}</div>
  16. {{- end}}
  17. </div>
  18. <div class="category-page-body" id="category-page-body">
  19. <div class="category-page-item" data-value="1">
  20. <div class="category-page-item-image">
  21. <img src="" alt="">
  22. </div>
  23. <div class="category-page-item-name"></div>
  24. </div>
  25. </div>
  26. </div>
  27. <!--商品详情-->
  28. <div class="category-page-goods-detail" id="category-page-goods-detail" style="display: none">
  29. <div class="category-goods-detail-header">
  30. <div class="header-return" id="category-goods-detail-header-return"></div>
  31. <div class="header-title">一个朴实无华的标题 一个朴实无华的标题一个朴实无华的标题</div>
  32. </div>
  33. <div class="category-goods-detail-header-interval"></div>
  34. <div class="category-goods-detail-handler">
  35. <div class="cgdh-tab-item cgdh-tab-item-selected">按销量由高到低</div>
  36. <div class="cgdh-tab-item">按价格由高到低</div>
  37. <div class="cgdh-tab-item">按价格由低到高</div>
  38. </div>
  39. <div class="category-goods-detail-skus" id="category-goods-detail-skus">
  40. <div class="category-goods-detail-sku">
  41. <div class="cgds-left-img">
  42. <img src=""/>
  43. </div>
  44. <div class="cgds-right-detail">
  45. <div class="cgds-right-detail-name">steam充值卡</div>
  46. <div class="cgds-right-detail-salesnum">销量:233</div>
  47. <div class="cgds-right-detail-price">
  48. <div class="cgds-right-detail-price-now">2199</div>
  49. <div class="cgds-right-detail-price-history">2666</div>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. {{template "FooterBar.tmpl" .}}
  56. </body>
  57. <script>
  58. let categoryMenuItems = document.getElementsByClassName("category-menu-item")
  59. let cpd = document.getElementById("category-page-body");
  60. let cpgd = document.getElementById("category-page-goods-detail");
  61. let categoryData = null
  62. let categoryGoodsData = null
  63. let nowGoodsId = null
  64. for (let i = 0; i < categoryMenuItems.length; i++) {
  65. let item = categoryMenuItems[i]
  66. item.addEventListener("click", function () {
  67. for (let j = 0; j < categoryMenuItems.length; j++) {
  68. let cmi = categoryMenuItems[j]
  69. if (cmi !== item && cmi.classList.contains("category-menu-item-select")) {
  70. cmi.className = "category-menu-item"
  71. }
  72. }
  73. this.className = "category-menu-item category-menu-item-select"
  74. var newUrl = window.location.origin + '/category/';
  75. history.pushState(null, null, newUrl + item.dataset.value);
  76. postCategoryData(item.dataset.value, 1, 30)
  77. })
  78. if (i === 0) {
  79. item.click()
  80. }
  81. }
  82. function showOrNoneCPGD() {
  83. if (cpgd.style.display) {
  84. cpgd.style.display = ""
  85. cpd.style.display = "none"
  86. getSkuList()
  87. } else {
  88. cpgd.style.display = "none"
  89. cpd.style.display = ""
  90. var newUrl = window.location + '/' + nowGoodsId;
  91. let number = newUrl.lastIndexOf('/');
  92. newUrl = newUrl.substring(0, number)
  93. history.pushState(null, null, newUrl);
  94. }
  95. }
  96. function getSkuList() {
  97. var newUrl = window.location + '/' + nowGoodsId;
  98. history.pushState(null, null, newUrl);
  99. postCategoryGoodsData(nowGoodsId)
  100. }
  101. document.getElementById("category-goods-detail-header-return").addEventListener("click", function () {
  102. showOrNoneCPGD()
  103. })
  104. function postCategoryData(typeId, pageNum, pageSize) {
  105. // 创建 XMLHttpRequest 对象
  106. var xhr = new XMLHttpRequest();
  107. // 设置请求方法和 URL
  108. xhr.open("POST", "/category", true);
  109. // 设置请求头,告知服务器数据的类型为 JSON
  110. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  111. // 定义请求完成后的回调函数
  112. xhr.onreadystatechange = function () {
  113. // 检查请求是否完成且成功
  114. if (xhr.readyState === 4 && xhr.status === 200) {
  115. try {
  116. // 解析服务器返回的 JSON 数据
  117. var response = JSON.parse(xhr.responseText);
  118. categoryData = response.data
  119. // 在此处理返回的数据对象
  120. addItemsToPage(categoryData)
  121. } catch (e) {
  122. console.error("解析响应时出错:", e);
  123. }
  124. }
  125. };
  126. // 创建请求发送的数据对象
  127. var data = {
  128. typeId: typeId,
  129. pageNum: pageNum,
  130. pageSize: pageSize
  131. };
  132. // 将数据对象转换为 JSON 字符串并发送
  133. xhr.send(JSON.stringify(data));
  134. }
  135. function postCategoryGoodsData(goodsId) {
  136. // 创建 XMLHttpRequest 对象
  137. var xhr = new XMLHttpRequest();
  138. // 设置请求方法和 URL
  139. xhr.open("POST", "/category/goods", true);
  140. // 设置请求头,告知服务器数据的类型为 JSON
  141. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  142. // 定义请求完成后的回调函数
  143. xhr.onreadystatechange = function () {
  144. // 检查请求是否完成且成功
  145. if (xhr.readyState === 4 && xhr.status === 200) {
  146. try {
  147. // 解析服务器返回的 JSON 数据
  148. var response = JSON.parse(xhr.responseText);
  149. categoryGoodsData = response.data
  150. console.log(categoryGoodsData)
  151. generateGoodsStructure(categoryGoodsData)
  152. // 在此处理返回的数据对象
  153. } catch (e) {
  154. console.error("解析响应时出错:", e);
  155. }
  156. }
  157. };
  158. // 创建请求发送的数据对象
  159. var data = {
  160. goodsId: goodsId,
  161. };
  162. // 将数据对象转换为 JSON 字符串并发送
  163. xhr.send(JSON.stringify(data));
  164. }
  165. // 这个函数用于生成 HTML 结构并添加到页面中
  166. function addItemsToPage() {
  167. // 选择页面中 class 为 "first" 的 div
  168. let container = document.getElementById("category-page-body")
  169. container.innerHTML = ""
  170. if (!container) {
  171. console.error("未找到 .first 容器");
  172. return;
  173. }
  174. console.log(categoryData)
  175. for (let i = 0; i < categoryData.list.length; i++) {
  176. let item = categoryData.list[i]
  177. // 创建外层 div
  178. var itemDiv = document.createElement("div");
  179. itemDiv.classList.add("category-page-item");
  180. itemDiv.setAttribute("data-value", item.id);
  181. // 创建图片 div,并设置背景图(如果有)
  182. var imageDiv = document.createElement("div");
  183. imageDiv.classList.add("category-page-item-image");
  184. let img = document.createElement("img");
  185. if (item.image) {
  186. img.src = item.image
  187. } else {
  188. img.src = "/api/static/image/def_image.png"
  189. }
  190. imageDiv.appendChild(img)
  191. // 创建名称 div,并设置文本
  192. var nameDiv = document.createElement("div");
  193. nameDiv.classList.add("category-page-item-name");
  194. nameDiv.textContent = item.name;
  195. itemDiv.addEventListener("click", function () {
  196. nowGoodsId = item.id
  197. showOrNoneCPGD()
  198. })
  199. // 将图片和名称 div 添加到外层 div
  200. itemDiv.appendChild(imageDiv);
  201. itemDiv.appendChild(nameDiv);
  202. // 将生成的 item div 添加到 .first 容器中
  203. container.appendChild(itemDiv);
  204. }
  205. }
  206. function generateGoodsStructure(data) {
  207. const container = document.getElementById('category-goods-detail-skus');
  208. // 清空容器,确保不会重复添加
  209. container.innerHTML = '';
  210. // 遍历返回的商品列表
  211. data.list.forEach(function (item) {
  212. // 创建外层 div
  213. const skuDiv = document.createElement('div');
  214. skuDiv.classList.add('category-goods-detail-sku');
  215. // 左侧图片 div
  216. const leftImgDiv = document.createElement('div');
  217. leftImgDiv.classList.add('cgds-left-img');
  218. const imgElement = document.createElement('img');
  219. imgElement.src = item.skuImage; // 设置图片地址
  220. leftImgDiv.appendChild(imgElement);
  221. // 右侧详细信息 div
  222. const rightDetailDiv = document.createElement('div');
  223. rightDetailDiv.classList.add('cgds-right-detail');
  224. // 名称 div
  225. const nameDiv = document.createElement('div');
  226. nameDiv.classList.add('cgds-right-detail-name');
  227. nameDiv.textContent = item.skuName; // 设置商品名称
  228. // 销量 div
  229. const salesNumDiv = document.createElement('div');
  230. salesNumDiv.classList.add('cgds-right-detail-salesnum');
  231. salesNumDiv.textContent = `销量:${item.inventoryNumber}`; // 设置库存信息
  232. // 价格 div
  233. const priceDiv = document.createElement('div');
  234. priceDiv.classList.add('cgds-right-detail-price');
  235. const priceNowDiv = document.createElement('div');
  236. priceNowDiv.classList.add('cgds-right-detail-price-now');
  237. priceNowDiv.textContent = item.price; // 当前价格
  238. const priceHistoryDiv = document.createElement('div');
  239. priceHistoryDiv.classList.add('cgds-right-detail-price-history');
  240. priceHistoryDiv.textContent = item.historicalPrices; // 历史价格
  241. // 将价格 divs 添加到价格容器
  242. priceDiv.appendChild(priceNowDiv);
  243. priceDiv.appendChild(priceHistoryDiv);
  244. // 将名称、销量、价格 div 添加到右侧详细信息 div
  245. rightDetailDiv.appendChild(nameDiv);
  246. rightDetailDiv.appendChild(salesNumDiv);
  247. rightDetailDiv.appendChild(priceDiv);
  248. // 将左侧图片和右侧详细信息 div 添加到外层 sku div
  249. skuDiv.appendChild(leftImgDiv);
  250. skuDiv.appendChild(rightDetailDiv);
  251. // 将生成的 sku div 添加到页面容器中
  252. container.appendChild(skuDiv);
  253. });
  254. }
  255. // 调用函数,传入实际数据
  256. postCategoryData(1, 1, 10);
  257. </script>
  258. </html>