category.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  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" data-value="">
  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. function showOrNoneCPGD() {
  65. if (cpgd.style.display) {
  66. cpgd.style.display = ""
  67. cpd.style.display = "none"
  68. getSkuList()
  69. } else {
  70. cpgd.style.display = "none"
  71. cpd.style.display = ""
  72. console.log(666)
  73. let newUrl = window.location.protocol + '//' +window.location.href;
  74. let number = newUrl.lastIndexOf('/');
  75. newUrl = newUrl.substring(0, number)
  76. history.pushState(null, null, newUrl);
  77. }
  78. }
  79. function getSkuList() {
  80. if (nowGoodsId) {
  81. let newUrl = window.location.protocol + '//' +window.location.host + '/category/' + nowGoodsId;
  82. history.pushState(null, null, newUrl);
  83. }
  84. postCategoryGoodsData(nowGoodsId)
  85. }
  86. document.getElementById("category-goods-detail-header-return").addEventListener("click", function () {
  87. showOrNoneCPGD()
  88. })
  89. function postCategoryData(typeId, pageNum, pageSize) {
  90. // 创建 XMLHttpRequest 对象
  91. var xhr = new XMLHttpRequest();
  92. // 设置请求方法和 URL
  93. xhr.open("POST", "/category", true);
  94. // 设置请求头,告知服务器数据的类型为 JSON
  95. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  96. // 定义请求完成后的回调函数
  97. xhr.onreadystatechange = function () {
  98. // 检查请求是否完成且成功
  99. if (xhr.readyState === 4 && xhr.status === 200) {
  100. try {
  101. // 解析服务器返回的 JSON 数据
  102. var response = JSON.parse(xhr.responseText);
  103. categoryData = response.data
  104. // 在此处理返回的数据对象
  105. addItemsToPage(categoryData)
  106. } catch (e) {
  107. console.error("解析响应时出错:", e);
  108. }
  109. }
  110. };
  111. // 创建请求发送的数据对象
  112. var data = {
  113. typeId: typeId,
  114. pageNum: pageNum,
  115. pageSize: pageSize
  116. };
  117. // 将数据对象转换为 JSON 字符串并发送
  118. xhr.send(JSON.stringify(data));
  119. }
  120. //获取商品列表
  121. function postCategoryGoodsData(goodsId) {
  122. // 创建 XMLHttpRequest 对象
  123. var xhr = new XMLHttpRequest();
  124. // 设置请求方法和 URL
  125. xhr.open("POST", "/category/goods", true);
  126. // 设置请求头,告知服务器数据的类型为 JSON
  127. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  128. // 定义请求完成后的回调函数
  129. xhr.onreadystatechange = function () {
  130. // 检查请求是否完成且成功
  131. if (xhr.readyState === 4 && xhr.status === 200) {
  132. try {
  133. // 解析服务器返回的 JSON 数据
  134. var response = JSON.parse(xhr.responseText);
  135. categoryGoodsData = response.data
  136. generateGoodsStructure(categoryGoodsData)
  137. // 在此处理返回的数据对象
  138. } catch (e) {
  139. console.error("解析响应时出错:", e);
  140. }
  141. }
  142. };
  143. // 创建请求发送的数据对象
  144. var data = {
  145. goodsId: goodsId,
  146. };
  147. // 将数据对象转换为 JSON 字符串并发送
  148. xhr.send(JSON.stringify(data));
  149. }
  150. // 这个函数用于生成 HTML 结构并添加到页面中
  151. function addItemsToPage() {
  152. // 选择页面中 class 为 "first" 的 div
  153. let container = document.getElementById("category-page-body")
  154. container.innerHTML = ""
  155. if (!container) {
  156. console.error("未找到 .first 容器");
  157. return;
  158. }
  159. for (let i = 0; i < categoryData.list.length; i++) {
  160. let item = categoryData.list[i]
  161. // 创建外层 div
  162. var itemDiv = document.createElement("div");
  163. itemDiv.classList.add("category-page-item");
  164. itemDiv.setAttribute("data-value", item.id);
  165. // 创建图片 div,并设置背景图(如果有)
  166. var imageDiv = document.createElement("div");
  167. imageDiv.classList.add("category-page-item-image");
  168. let img = document.createElement("img");
  169. if (item.image) {
  170. img.src = item.image
  171. } else {
  172. img.src = "/api/static/image/def_image.png"
  173. }
  174. imageDiv.appendChild(img)
  175. // 创建名称 div,并设置文本
  176. var nameDiv = document.createElement("div");
  177. nameDiv.classList.add("category-page-item-name");
  178. nameDiv.textContent = item.name;
  179. itemDiv.addEventListener("click", function () {
  180. nowGoodsId = item.id
  181. showOrNoneCPGD()
  182. })
  183. // 将图片和名称 div 添加到外层 div
  184. itemDiv.appendChild(imageDiv);
  185. itemDiv.appendChild(nameDiv);
  186. // 将生成的 item div 添加到 .first 容器中
  187. container.appendChild(itemDiv);
  188. }
  189. }
  190. function generateGoodsStructure(data) {
  191. const container = document.getElementById('category-goods-detail-skus');
  192. // 清空容器,确保不会重复添加
  193. container.innerHTML = '';
  194. if (data.list)
  195. // 遍历返回的商品列表
  196. data.list.forEach(function (item) {
  197. // 创建外层 div
  198. const skuDiv = document.createElement('div');
  199. skuDiv.classList.add('category-goods-detail-sku');
  200. skuDiv.dataset.value = item.id;
  201. // 左侧图片 div
  202. const leftImgDiv = document.createElement('div');
  203. leftImgDiv.classList.add('cgds-left-img');
  204. const imgElement = document.createElement('img');
  205. imgElement.src = item.skuImage; // 设置图片地址
  206. leftImgDiv.appendChild(imgElement);
  207. // 右侧详细信息 div
  208. const rightDetailDiv = document.createElement('div');
  209. rightDetailDiv.classList.add('cgds-right-detail');
  210. // 名称 div
  211. const nameDiv = document.createElement('div');
  212. nameDiv.classList.add('cgds-right-detail-name');
  213. nameDiv.textContent = item.skuName; // 设置商品名称
  214. // 销量 div
  215. const salesNumDiv = document.createElement('div');
  216. salesNumDiv.classList.add('cgds-right-detail-salesnum');
  217. salesNumDiv.textContent = `销量:${item.inventoryNumber}`; // 设置库存信息
  218. // 价格 div
  219. const priceDiv = document.createElement('div');
  220. priceDiv.classList.add('cgds-right-detail-price');
  221. const priceNowDiv = document.createElement('div');
  222. priceNowDiv.classList.add('cgds-right-detail-price-now');
  223. priceNowDiv.textContent = item.price; // 当前价格
  224. const priceHistoryDiv = document.createElement('div');
  225. priceHistoryDiv.classList.add('cgds-right-detail-price-history');
  226. priceHistoryDiv.textContent = item.historicalPrices; // 历史价格
  227. // 将价格 divs 添加到价格容器
  228. priceDiv.appendChild(priceNowDiv);
  229. priceDiv.appendChild(priceHistoryDiv);
  230. // 将名称、销量、价格 div 添加到右侧详细信息 div
  231. rightDetailDiv.appendChild(nameDiv);
  232. rightDetailDiv.appendChild(salesNumDiv);
  233. rightDetailDiv.appendChild(priceDiv);
  234. // 将左侧图片和右侧详细信息 div 添加到外层 sku div
  235. skuDiv.appendChild(leftImgDiv);
  236. skuDiv.appendChild(rightDetailDiv);
  237. // 将生成的 sku div 添加到页面容器中
  238. container.appendChild(skuDiv);
  239. //点击跳转事件
  240. skuDiv.addEventListener("click", function () {
  241. window.location.href = "/detail?skuId="+skuDiv.dataset.value
  242. })
  243. });
  244. }
  245. // 调用函数,传入实际数据
  246. // postCategoryData(1, 1, 10);
  247. function initCategory() {
  248. let ele = null
  249. //获取路由
  250. let path = ""
  251. let host = window.location.host
  252. let href = window.location.href
  253. let number = href.indexOf(host)
  254. if (number === -1) {
  255. ele.click()
  256. } else {
  257. path = href.substring(number + host.length)
  258. }
  259. let strings = path.split("/");
  260. let sign = 0
  261. for (let i = 0; i < categoryMenuItems.length; i++) {
  262. let item = categoryMenuItems[i]
  263. if (strings[strings.length-1] && item.dataset.value===strings[strings.length-1]){
  264. item.classList.add("category-menu-item-select")
  265. }
  266. item.addEventListener("click", function () {
  267. for (let j = 0; j < categoryMenuItems.length; j++) {
  268. let cmi = categoryMenuItems[j]
  269. if (cmi !== item && cmi.classList.contains("category-menu-item-select")) {
  270. cmi.className = "category-menu-item"
  271. }
  272. }
  273. item.className = "category-menu-item category-menu-item-select"
  274. let newUrl =window.location.protocol + '//' + window.location.host + '/category/';
  275. history.pushState(null, "", newUrl + item.dataset.value);
  276. postCategoryData(item.dataset.value, 1, 30)
  277. })
  278. if (i === 0) {
  279. ele = item
  280. }
  281. }
  282. let reg = /^[0-9]*$/
  283. for (let i = 0; i < strings.length; i++) {
  284. if (strings[i] === "category") {
  285. sign = 1
  286. if (i === strings.length - 1) {
  287. let d = ele.getAttribute("data-value");
  288. postCategoryData(d, 1, 30)
  289. let newUrl = window.location.protocol + '//' +window.location.host+ '/category/' + '/' + d;
  290. console.log("ddd",newUrl)
  291. history.pushState(null, "", newUrl);
  292. }
  293. continue
  294. }
  295. if (sign === 1 && reg.test(strings[i])) {
  296. sign++
  297. postCategoryData(strings[i], 1, 30)
  298. continue
  299. }
  300. if (sign === 2 && reg.test(strings[i])) {
  301. sign++
  302. postCategoryGoodsData(strings[i])
  303. showOrNoneCPGD()
  304. break
  305. }
  306. }
  307. }
  308. initCategory()
  309. </script>
  310. </html>