Commit 7ca465a9fef3f606ac322bb5ac5d4af5b9ebe6c5
1 parent
741479b9
fix: 只有商品详情页保留推荐商品,prod2-58/59
Showing
7 changed files
with
9 additions
and
804 deletions
components/CategoryList.vue
@@ -70,63 +70,6 @@ | @@ -70,63 +70,6 @@ | ||
70 | </v-col> | 70 | </v-col> |
71 | </v-row> | 71 | </v-row> |
72 | </div> | 72 | </div> |
73 | - <v-tabs | ||
74 | - class="tabs" | ||
75 | - v-model="tabRecom" | ||
76 | - style="margin-top: 25px" | ||
77 | - color="white" | ||
78 | - bg-color="#eeeeee" | ||
79 | - slider-color="blue-lighten-1" | ||
80 | - selected-class="active" | ||
81 | - v-if="recommendImages[0] !== null && !isMobile()" | ||
82 | - > | ||
83 | - <v-tab :value="1">Best Sellers</v-tab> | ||
84 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
85 | - </v-tabs> | ||
86 | - <div id="image-container" v-if="recommendImages[0] !== null && !isMobile()"> | ||
87 | - <div class="recommend-left-box"> | ||
88 | - <v-img | ||
89 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png" | ||
90 | - alt="往左移" | ||
91 | - class="recommend-img-left" | ||
92 | - @click="toggleRowLeft" | ||
93 | - /> | ||
94 | - </div> | ||
95 | - <div class="image-row" id="row1"> | ||
96 | - <!-- <img | ||
97 | - v-for="(imageObj, index) in recommendImages.slice(0, 5)" | ||
98 | - :key="'row1-' + index" | ||
99 | - :src="imageObj[0]?.url" | ||
100 | - :alt="'Image ' + (index + 1)" | ||
101 | - style="margin: 0 5px; width: 200px; height: 200px" | ||
102 | - /> --> | ||
103 | - <div | ||
104 | - v-for="(imageObj, index) in recommendImages" | ||
105 | - :key="'row1-' + index" | ||
106 | - class="imageTotal" | ||
107 | - > | ||
108 | - <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> | ||
109 | - <img | ||
110 | - :src="imageObj[0]?.url" | ||
111 | - :alt="'Image ' + (index + 1)" | ||
112 | - class="item-imgHot" | ||
113 | - /> | ||
114 | - <span class="image-name"> | ||
115 | - {{ imageObj[0]?.name }} | ||
116 | - </span> | ||
117 | - </a> | ||
118 | - <div v-else style="width: 200px; height: 200px"></div> | ||
119 | - </div> | ||
120 | - </div> | ||
121 | - <div class="recommend-right-box"> | ||
122 | - <v-img | ||
123 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png" | ||
124 | - alt="往右移" | ||
125 | - class="recommend-img-right" | ||
126 | - @click="toggleRowRight" | ||
127 | - /> | ||
128 | - </div> | ||
129 | - </div> | ||
130 | </v-container> | 73 | </v-container> |
131 | </template> | 74 | </template> |
132 | 75 |
components/HotProducts.vue deleted
100644 → 0
1 | -<template> | ||
2 | - <v-tabs | ||
3 | - class="tabs" | ||
4 | - v-model="tabRecom" | ||
5 | - color="white" | ||
6 | - bg-color="#eeeeee" | ||
7 | - style="margin-top: 40px" | ||
8 | - slider-color="blue-lighten-1" | ||
9 | - selected-class="active" | ||
10 | - v-if="recommendImages[0] !== null && !isMobile()" | ||
11 | - > | ||
12 | - <v-tab :value="1">Best Sellers</v-tab> | ||
13 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
14 | - </v-tabs> | ||
15 | - <div id="image-container" v-if="recommendImages[0] !== null && !isMobile()"> | ||
16 | - <div class="recommend-left-box"> | ||
17 | - <v-img | ||
18 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png" | ||
19 | - alt="往左移" | ||
20 | - class="recommend-img-left" | ||
21 | - @click="toggleRowLeft" | ||
22 | - /> | ||
23 | - </div> | ||
24 | - <div class="image-row" id="row1"> | ||
25 | - <!-- <img | ||
26 | - v-for="(imageObj, index) in recommendImages.slice(0, 5)" | ||
27 | - :key="'row1-' + index" | ||
28 | - :src="imageObj[0]?.url" | ||
29 | - :alt="'Image ' + (index + 1)" | ||
30 | - style="margin: 0 5px; width: 200px; height: 200px" | ||
31 | - /> --> | ||
32 | - <div | ||
33 | - v-for="(imageObj, index) in recommendImages" | ||
34 | - :key="'row1-' + index" | ||
35 | - class="imageTotal" | ||
36 | - > | ||
37 | - <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> | ||
38 | - <img | ||
39 | - :src="imageObj[0]?.url" | ||
40 | - :alt="'Image ' + (index + 1)" | ||
41 | - class="item-imgHot" | ||
42 | - /> | ||
43 | - <span class="image-name"> | ||
44 | - {{ imageObj[0]?.name }} | ||
45 | - </span> | ||
46 | - </a> | ||
47 | - <div v-else class="image-substitute"></div> | ||
48 | - </div> | ||
49 | - </div> | ||
50 | - <div class="recommend-right-box"> | ||
51 | - <v-img | ||
52 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png" | ||
53 | - alt="往右移" | ||
54 | - class="recommend-img-right" | ||
55 | - @click="toggleRowRight" | ||
56 | - /> | ||
57 | - </div> | ||
58 | - </div> | ||
59 | - <div style="padding-left: 16px; padding-right: 16px"> | ||
60 | - <v-tabs | ||
61 | - class="tabs2" | ||
62 | - ref="tabs2" | ||
63 | - v-model="tabRecom" | ||
64 | - style="margin-top: 25px; margin-bottom: 20px; width: 100%" | ||
65 | - color="white" | ||
66 | - bg-color="#eeeeee" | ||
67 | - slider-color="blue-lighten-1" | ||
68 | - selected-class="active" | ||
69 | - v-if="isMobile()" | ||
70 | - > | ||
71 | - <v-tab :value="1">Best Sellers</v-tab> | ||
72 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
73 | - </v-tabs> | ||
74 | - <div class="tw-text-center" v-if="hotLoadingMobile && isMobile()"> | ||
75 | - <v-progress-circular | ||
76 | - color="blue-lighten-2" | ||
77 | - indeterminate | ||
78 | - size="64" | ||
79 | - class="tw-m-auto" | ||
80 | - ></v-progress-circular> | ||
81 | - </div> | ||
82 | - <v-item-group multiple v-if="isMobile()"> | ||
83 | - <v-row v-if="!hotLoadingMobile"> | ||
84 | - <v-col | ||
85 | - v-for="(item, i) in recommendImagesMobile" | ||
86 | - :key="i" | ||
87 | - cols="6" | ||
88 | - lg="3" | ||
89 | - md="4" | ||
90 | - sm="6" | ||
91 | - > | ||
92 | - <div v-if="item !== null"> | ||
93 | - <v-card :elevation="4" class="mx-auto" :href="item[0].productUrl"> | ||
94 | - <v-img | ||
95 | - :src="item[0].url" | ||
96 | - :alt="item[0].name" | ||
97 | - eager | ||
98 | - class="d-block" | ||
99 | - /> | ||
100 | - <v-card-text class="tw-text-left font-weight-medium title"> | ||
101 | - <h4 class="clamp-text">{{ item[0].name }}</h4> | ||
102 | - </v-card-text> | ||
103 | - </v-card> | ||
104 | - </div> | ||
105 | - </v-col> | ||
106 | - </v-row> | ||
107 | - </v-item-group> | ||
108 | - <v-row v-if="isMobile()"> | ||
109 | - <v-col> | ||
110 | - <v-pagination | ||
111 | - :size="isMobile() ? 'small' : 'default'" | ||
112 | - v-if="hotTotalMobile" | ||
113 | - v-model="currentIndexMobile" | ||
114 | - @update:modelValue="toggleRowMobile" | ||
115 | - :length="hotLength" | ||
116 | - rounded="0" | ||
117 | - class="tw-float-right tw-mt-[32px]" | ||
118 | - total-visible="5" | ||
119 | - ></v-pagination></v-col | ||
120 | - ></v-row> | ||
121 | - </div> | ||
122 | -</template> | ||
123 | - | ||
124 | -<script setup lang="ts"> | ||
125 | -import { computed, onMounted, reactive, ref } from "vue"; | ||
126 | -import { isMobile } from "../utils"; | ||
127 | -import { useRoute } from "vue-router"; | ||
128 | - | ||
129 | -const route = useRoute(); // 获取路由信息 | ||
130 | -const maxPage = ref(1); | ||
131 | -const maxPageMobile = ref(1); | ||
132 | -const tabRecom = ref(); | ||
133 | -const recommendList = ref({}); | ||
134 | -const recommendImages = ref({}); | ||
135 | -const currentIndex = ref(1); | ||
136 | -const hotLoading = ref(false); | ||
137 | -const hotTotal = ref(10); | ||
138 | -const isOrNotMobile = isMobile(); | ||
139 | -const recommendListMobile = ref({}); | ||
140 | -const recommendImagesMobile = ref({}); | ||
141 | -const currentIndexMobile = ref(1); | ||
142 | -const hotLoadingMobile = ref(false); | ||
143 | -const hotTotalMobile = ref(10); | ||
144 | -const loadHotProducts = async () => { | ||
145 | - hotLoading.value = true; | ||
146 | - let { data: hotProducts } = await useAsyncData( | ||
147 | - "hotProducts", | ||
148 | - () => | ||
149 | - $fetch("/shop/product/hotProducts", { | ||
150 | - method: "GET", | ||
151 | - params: { | ||
152 | - pageNo: currentIndex.value, | ||
153 | - pageSize: 5, | ||
154 | - }, | ||
155 | - }), | ||
156 | - { | ||
157 | - server: true, // 仅在服务器端获取数据 | ||
158 | - } | ||
159 | - ); | ||
160 | - hotTotal.value = hotProducts.value.data.total; | ||
161 | - recommendList.value = hotProducts.value.data.records; | ||
162 | - maxPage.value = hotProducts.value.data.pages; | ||
163 | - // recommendImages.value = recommendList.value.slice(0, 10).map((item) => { | ||
164 | - recommendImages.value = Array.from({ length: 5 }).map((_, index) => { | ||
165 | - const item = recommendList.value[index]; | ||
166 | - if (!item) { | ||
167 | - return null; | ||
168 | - } | ||
169 | - // 检查 productimageliststore 是否为字符串格式,如果是,则尝试解析 | ||
170 | - if (typeof item.productimageliststore === "string") { | ||
171 | - try { | ||
172 | - item.productimageliststore = JSON.parse(item.productimageliststore); | ||
173 | - } catch (error) { | ||
174 | - item.productimageliststore = []; // 解析失败时,设置为空数组 | ||
175 | - } | ||
176 | - } | ||
177 | - const ree = (item.productimageliststore = item?.productimageliststore.map( | ||
178 | - (productItem: ProductImage) => ({ | ||
179 | - ...productItem, | ||
180 | - // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`, | ||
181 | - url: `https://www.canrud.com/api/show/image?fileKey=${productItem.fileKey}&psize=p256`, | ||
182 | - name: item.name, | ||
183 | - productUrl: `https://www.canrud.com/products/detail/${item.id}`, | ||
184 | - }) | ||
185 | - )); | ||
186 | - return ree; | ||
187 | - }); | ||
188 | - hotLoading.value = false; | ||
189 | -}; | ||
190 | - | ||
191 | -const toggleRowLeft = () => { | ||
192 | - if (currentIndex.value !== 1) { | ||
193 | - currentIndex.value--; | ||
194 | - } else if (currentIndex.value == 1) { | ||
195 | - currentIndex.value = maxPage.value; | ||
196 | - } | ||
197 | - startTimer(); | ||
198 | -}; | ||
199 | -let intervalId: any; | ||
200 | -const toggleRowRight = () => { | ||
201 | - if (currentIndex.value < maxPage.value) { | ||
202 | - currentIndex.value++; | ||
203 | - } else if (currentIndex.value == maxPage.value) { | ||
204 | - currentIndex.value = 1; | ||
205 | - } | ||
206 | - startTimer(); | ||
207 | -}; | ||
208 | -const startTimer = () => { | ||
209 | - // 清除已有计时器,防止重复 | ||
210 | - clearInterval(intervalId); | ||
211 | - intervalId = setInterval(() => { | ||
212 | - toggleRowRight(); | ||
213 | - }, 5000); // 每6秒调用一次 | ||
214 | -}; | ||
215 | - | ||
216 | -onMounted(() => { | ||
217 | - startTimer(); | ||
218 | -}); | ||
219 | - | ||
220 | -const toggleRowMobile = (value: number) => { | ||
221 | - currentIndexMobile.value = value; | ||
222 | -}; | ||
223 | -const { width } = useDisplay(); | ||
224 | -const firstIndex = ref(true); | ||
225 | -watch(currentIndex, (newIndex) => { | ||
226 | - loadHotProducts(); // Call loadHotProducts when currentIndex changes | ||
227 | -}); | ||
228 | - | ||
229 | -const loadHotProductsMobile = async () => { | ||
230 | - hotLoadingMobile.value = true; | ||
231 | - let { data: hotProductsMobile } = await useAsyncData( | ||
232 | - "hotProducts", | ||
233 | - () => | ||
234 | - $fetch("/shop/product/hotProducts", { | ||
235 | - method: "GET", | ||
236 | - params: { | ||
237 | - pageNo: currentIndexMobile.value, | ||
238 | - pageSize: 4, | ||
239 | - }, | ||
240 | - }), | ||
241 | - { | ||
242 | - server: true, // 仅在服务器端获取数据 | ||
243 | - } | ||
244 | - ); | ||
245 | - hotTotalMobile.value = hotProductsMobile.value.data.total; | ||
246 | - recommendListMobile.value = hotProductsMobile.value.data.records; | ||
247 | - maxPageMobile.value = hotProductsMobile.value.data.pages; | ||
248 | - // recommendImages.value = recommendList.value.slice(0, 10).map((item) => { | ||
249 | - recommendImagesMobile.value = Array.from({ length: 4 }).map((_, index) => { | ||
250 | - const item = recommendListMobile.value[index]; | ||
251 | - if (!item) { | ||
252 | - return null; | ||
253 | - } | ||
254 | - // 检查 productimageliststore 是否为字符串格式,如果是,则尝试解析 | ||
255 | - if (typeof item.productimageliststore === "string") { | ||
256 | - try { | ||
257 | - item.productimageliststore = JSON.parse(item.productimageliststore); | ||
258 | - } catch (error) { | ||
259 | - item.productimageliststore = []; // 解析失败时,设置为空数组 | ||
260 | - } | ||
261 | - } | ||
262 | - const ree = (item.productimageliststore = item?.productimageliststore.map( | ||
263 | - (productItem: ProductImage) => ({ | ||
264 | - ...productItem, | ||
265 | - // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`, | ||
266 | - url: `https://www.canrud.com/api/show/image?fileKey=${productItem.fileKey}&psize=p256`, | ||
267 | - name: item.name, | ||
268 | - productUrl: `https://www.canrud.com/products/detail/${item.id}`, | ||
269 | - }) | ||
270 | - )); | ||
271 | - return ree; | ||
272 | - }); | ||
273 | - hotLoadingMobile.value = false; | ||
274 | -}; | ||
275 | -watch(currentIndexMobile, (newIndex) => { | ||
276 | - loadHotProductsMobile(); // Call loadHotProducts when currentIndex changes | ||
277 | -}); | ||
278 | -watchEffect(async () => { | ||
279 | - console.log("Current route:", route.fullPath, "Width:", width.value); | ||
280 | - | ||
281 | - if (firstIndex.value) { | ||
282 | - if (width.value > 600) { | ||
283 | - await loadHotProducts(); | ||
284 | - } else { | ||
285 | - await loadHotProductsMobile(); | ||
286 | - } | ||
287 | - } | ||
288 | -}); | ||
289 | -// Initial load of hot products | ||
290 | -const hotLength = computed(() => | ||
291 | - hotTotalMobile.value ? Math.ceil(hotTotalMobile.value / 4) : 0 | ||
292 | -); | ||
293 | -</script> | ||
294 | - | ||
295 | -<style lang="scss" scoped> | ||
296 | -@media screen and (min-width: 1537px) { | ||
297 | - .tabs { | ||
298 | - border-bottom: 2px solid #1f88e5; | ||
299 | - margin: 10px auto 100px; | ||
300 | - width: 93%; | ||
301 | - } | ||
302 | -} | ||
303 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
304 | - .tabs { | ||
305 | - border-bottom: 2px solid #1f88e5; | ||
306 | - margin: 10px auto 20px; | ||
307 | - width: 82%; | ||
308 | - } | ||
309 | -} | ||
310 | -@media screen and (max-width: 1280px) { | ||
311 | - .tabs { | ||
312 | - border-bottom: 2px solid #1f88e5; | ||
313 | - margin: 10px auto 0px; | ||
314 | - width: 88%; | ||
315 | - } | ||
316 | -} | ||
317 | - | ||
318 | -.active { | ||
319 | - background-color: #1086e8; | ||
320 | -} | ||
321 | - | ||
322 | -/* #image-container { | ||
323 | - display: flex; | ||
324 | - align-items: center; | ||
325 | - justify-content: center; | ||
326 | - height: 320px; | ||
327 | - margin: 10px auto 50px; | ||
328 | - width: 80%; | ||
329 | -} */ | ||
330 | - | ||
331 | -@media screen and (min-width: 1537px) { | ||
332 | - #image-container { | ||
333 | - display: flex; | ||
334 | - align-items: center; | ||
335 | - justify-content: center; | ||
336 | - height: 320px; | ||
337 | - margin: 10px auto 50px; | ||
338 | - width: 96%; | ||
339 | - } | ||
340 | -} | ||
341 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
342 | - #image-container { | ||
343 | - display: flex; | ||
344 | - align-items: center; | ||
345 | - justify-content: center; | ||
346 | - height: 240px; | ||
347 | - margin: 10px auto 0px; | ||
348 | - width: 80%; | ||
349 | - } | ||
350 | -} | ||
351 | -@media screen and (max-width: 1280px) { | ||
352 | - #image-container { | ||
353 | - display: flex; | ||
354 | - align-items: center; | ||
355 | - justify-content: center; | ||
356 | - height: 260px; | ||
357 | - margin: 10px auto 0px; | ||
358 | - width: 90%; | ||
359 | - } | ||
360 | -} | ||
361 | -.image-row { | ||
362 | - display: flex; | ||
363 | - height: 305px; | ||
364 | -} | ||
365 | -@media screen and (min-width: 1537px) { | ||
366 | - .image-row { | ||
367 | - display: flex; | ||
368 | - height: 305px; | ||
369 | - } | ||
370 | -} | ||
371 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
372 | - .image-row { | ||
373 | - display: flex; | ||
374 | - height: 245px; | ||
375 | - } | ||
376 | -} | ||
377 | -@media screen and (max-width: 1280px) { | ||
378 | - .image-row { | ||
379 | - display: flex; | ||
380 | - height: 220px; | ||
381 | - } | ||
382 | -} | ||
383 | -@media screen and (min-width: 1537px) { | ||
384 | - .imageTotal { | ||
385 | - display: inline-block; | ||
386 | - margin: 0 5px; | ||
387 | - text-align: center; | ||
388 | - width: 315px; | ||
389 | - } | ||
390 | -} | ||
391 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
392 | - .imageTotal { | ||
393 | - display: inline-block; | ||
394 | - margin: 0 5px; | ||
395 | - text-align: center; | ||
396 | - width: 210px; | ||
397 | - } | ||
398 | -} | ||
399 | -@media screen and (max-width: 1280px) { | ||
400 | - .imageTotal { | ||
401 | - display: inline-block; | ||
402 | - margin: 0 5px; | ||
403 | - text-align: center; | ||
404 | - width: 185px; | ||
405 | - } | ||
406 | -} | ||
407 | -@media screen and (min-width: 1537px) { | ||
408 | - .image-row img { | ||
409 | - width: 240px; | ||
410 | - height: 240px; | ||
411 | - } | ||
412 | -} | ||
413 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
414 | - .image-row img { | ||
415 | - width: 180px; | ||
416 | - height: 180px; | ||
417 | - } | ||
418 | -} | ||
419 | - | ||
420 | -@media screen and (min-width: 1537px) { | ||
421 | - .image-row .image-substitute { | ||
422 | - width: 200px; | ||
423 | - height: 200px; | ||
424 | - } | ||
425 | -} | ||
426 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
427 | - .image-row .image-substitute { | ||
428 | - width: 200px; | ||
429 | - height: 200px; | ||
430 | - } | ||
431 | -} | ||
432 | - | ||
433 | -@media screen and (max-width: 1280px) { | ||
434 | - .image-row .image-substitute { | ||
435 | - width: 185px; | ||
436 | - height: 185px; | ||
437 | - } | ||
438 | -} | ||
439 | -@media screen and (max-width: 1280px) { | ||
440 | - .image-row img { | ||
441 | - width: 160px; | ||
442 | - height: 160px; | ||
443 | - margin-left: 10px; | ||
444 | - } | ||
445 | -} | ||
446 | -@media screen and (min-width: 1537px) { | ||
447 | - .image-name { | ||
448 | - display: -webkit-box; /* Enables multi-line text handling */ | ||
449 | - -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ | ||
450 | - -webkit-line-clamp: 3; /* Limits the text to 3 lines */ | ||
451 | - overflow: hidden; /* Hides the overflowed text */ | ||
452 | - text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ | ||
453 | - margin-top: 5px; | ||
454 | - font-size: 16px; | ||
455 | - width: 180px; | ||
456 | - color: #555; | ||
457 | - text-align: center; /* Centers the text horizontally */ | ||
458 | - margin-left: 50px; | ||
459 | - } | ||
460 | -} | ||
461 | -@media screen and (max-width: 1536px) and (min-width: 1281px) { | ||
462 | - .image-name { | ||
463 | - display: -webkit-box; /* Enables multi-line text handling */ | ||
464 | - -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ | ||
465 | - -webkit-line-clamp: 3; /* Limits the text to 3 lines */ | ||
466 | - overflow: hidden; /* Hides the overflowed text */ | ||
467 | - text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ | ||
468 | - margin-top: 5px; | ||
469 | - font-size: 16px; | ||
470 | - width: 180px; | ||
471 | - color: #555; | ||
472 | - text-align: center; /* Centers the text horizontally */ | ||
473 | - margin-left: 10px; | ||
474 | - } | ||
475 | -} | ||
476 | -@media screen and (max-width: 1280px) { | ||
477 | - .image-name { | ||
478 | - display: -webkit-box; /* Enables multi-line text handling */ | ||
479 | - -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ | ||
480 | - -webkit-line-clamp: 3; /* Limits the text to 3 lines */ | ||
481 | - overflow: hidden; /* Hides the overflowed text */ | ||
482 | - text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ | ||
483 | - margin-top: 5px; | ||
484 | - font-size: 16px; | ||
485 | - width: 180px; | ||
486 | - color: #555; | ||
487 | - text-align: center; /* Centers the text horizontally */ | ||
488 | - margin-left: 5px; | ||
489 | - } | ||
490 | -} | ||
491 | -button .recommendButton { | ||
492 | - margin: 0 0px; | ||
493 | - cursor: pointer; | ||
494 | -} | ||
495 | - | ||
496 | -.recommend-left-box { | ||
497 | -} | ||
498 | - | ||
499 | -.recommend-img-left { | ||
500 | - width: 26px; | ||
501 | - height: 27px; | ||
502 | - margin-right: 40px; | ||
503 | -} | ||
504 | - | ||
505 | -.recommend-img-left:hover { | ||
506 | - cursor: pointer; | ||
507 | -} | ||
508 | -.recommend-right-box { | ||
509 | -} | ||
510 | - | ||
511 | -.recommend-img-right { | ||
512 | - width: 26px; | ||
513 | - height: 27px; | ||
514 | - margin-left: 40px; | ||
515 | -} | ||
516 | - | ||
517 | -.recommend-img-right:hover { | ||
518 | - cursor: pointer; | ||
519 | -} | ||
520 | -.image-grid { | ||
521 | - padding: 16px; | ||
522 | -} | ||
523 | - | ||
524 | -.v-card { | ||
525 | - transition: all 0.3s ease-in-out; | ||
526 | -} | ||
527 | -.clamp-text { | ||
528 | - display: -webkit-box; /* 使用弹性盒子 */ | ||
529 | - -webkit-box-orient: vertical; /* 设置为垂直方向 */ | ||
530 | - -webkit-line-clamp: 3; /* 限制最多显示3行 */ | ||
531 | - overflow: hidden; /* 隐藏多余内容 */ | ||
532 | - text-overflow: ellipsis; /* 添加省略号 */ | ||
533 | - white-space: normal; /* 允许换行 */ | ||
534 | - line-height: 1.5em; /* 设置每行的高度 */ | ||
535 | - min-height: calc(3 * 1.5em); /* 确保最小高度为3行 */ | ||
536 | -} | ||
537 | -</style> |
deploy/prod2.sh
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | # 变量定义 | 2 | # 变量定义 |
3 | -LAST_TAG="1.0.57" | ||
4 | -TAG="1.0.58" | 3 | +LAST_TAG="1.0.58" |
4 | +TAG="1.0.59" | ||
5 | TARGET_PATH="/root/web/canrud-outside-nuxt-front" | 5 | TARGET_PATH="/root/web/canrud-outside-nuxt-front" |
6 | DOCKERFILE_PATH="/root/web/canrud-outside-nuxt-front/canrud-nuxt-front" | 6 | DOCKERFILE_PATH="/root/web/canrud-outside-nuxt-front/canrud-nuxt-front" |
7 | IMAGE_NAME="canrud-outside-front" | 7 | IMAGE_NAME="canrud-outside-front" |
pages/about.vue
1 | <template> | 1 | <template> |
2 | - <HotProducts /> | ||
3 | - | ||
4 | <v-container class="pa-0 pa-sm-4"> | 2 | <v-container class="pa-0 pa-sm-4"> |
5 | <div | 3 | <div |
6 | class="my-8 my-sm-16 text-blue-darken-1 text-h4 tw-text-center" | 4 | class="my-8 my-sm-16 text-blue-darken-1 text-h4 tw-text-center" |
@@ -465,7 +463,6 @@ | @@ -465,7 +463,6 @@ | ||
465 | 463 | ||
466 | <script setup lang="ts"> | 464 | <script setup lang="ts"> |
467 | import MainTitle from "../components/MainTitle.vue"; | 465 | import MainTitle from "../components/MainTitle.vue"; |
468 | -import HotProducts from "../components/HotProducts.vue"; | ||
469 | import { isMobile } from "../utils"; | 466 | import { isMobile } from "../utils"; |
470 | 467 | ||
471 | useHead({ | 468 | useHead({ |
pages/contact.vue
@@ -34,7 +34,7 @@ | @@ -34,7 +34,7 @@ | ||
34 | <div class="tw-w-[300px]"> | 34 | <div class="tw-w-[300px]"> |
35 | <v-img src="/wechat.jpg" alt="canrud-wechat"></v-img> | 35 | <v-img src="/wechat.jpg" alt="canrud-wechat"></v-img> |
36 | </div> | 36 | </div> |
37 | - <div style="display: flex; gap: 16px; align-items: center"> | 37 | + <div :class="isMobile() ? 'mobileIcon' : 'icon'"> |
38 | <span class="text-h5 tw-mb-5 tw-mt-5">Other Platforms</span> | 38 | <span class="text-h5 tw-mb-5 tw-mt-5">Other Platforms</span> |
39 | <span class="tw-mt-2"> | 39 | <span class="tw-mt-2"> |
40 | <a | 40 | <a |
@@ -236,134 +236,7 @@ | @@ -236,134 +236,7 @@ | ||
236 | > | 236 | > |
237 | Failed to send! | 237 | Failed to send! |
238 | </v-snackbar> | 238 | </v-snackbar> |
239 | - <div style="margin-bottom: 10px"> | ||
240 | - <v-tabs | ||
241 | - class="tabs2" | ||
242 | - ref="tabs2" | ||
243 | - v-model="tabRecom" | ||
244 | - style="margin-top: 25px; margin-bottom: 20px" | ||
245 | - color="white" | ||
246 | - bg-color="#eeeeee" | ||
247 | - slider-color="blue-lighten-1" | ||
248 | - selected-class="active" | ||
249 | - v-if="isMobile()" | ||
250 | - > | ||
251 | - <v-tab :value="1">Best Sellers</v-tab> | ||
252 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
253 | - </v-tabs> | ||
254 | - <div class="tw-text-center" v-if="hotLoadingMobile && isMobile()"> | ||
255 | - <v-progress-circular | ||
256 | - color="blue-lighten-2" | ||
257 | - indeterminate | ||
258 | - size="64" | ||
259 | - class="tw-m-auto" | ||
260 | - ></v-progress-circular> | ||
261 | - </div> | ||
262 | - <v-item-group multiple v-if="isMobile()"> | ||
263 | - <v-row v-if="!hotLoadingMobile"> | ||
264 | - <v-col | ||
265 | - v-for="(item, i) in recommendImagesMobile" | ||
266 | - :key="i" | ||
267 | - cols="6" | ||
268 | - lg="3" | ||
269 | - md="4" | ||
270 | - sm="6" | ||
271 | - > | ||
272 | - <div v-if="item !== null"> | ||
273 | - <v-card :elevation="4" class="mx-auto" :href="item[0].productUrl"> | ||
274 | - <!-- 设置 eager 属性,确保图片直接加载 --> | ||
275 | - <v-img | ||
276 | - :src="item[0].url" | ||
277 | - :alt="item[0].name" | ||
278 | - eager | ||
279 | - class="d-block" | ||
280 | - /> | ||
281 | - <v-card-text class="tw-text-left font-weight-medium title"> | ||
282 | - <h4 class="clamp-text">{{ item[0].name }}</h4> | ||
283 | - </v-card-text> | ||
284 | - </v-card> | ||
285 | - </div> | ||
286 | - </v-col> | ||
287 | - </v-row> | ||
288 | - <!-- <div | ||
289 | - v-if="!hotTotal" | ||
290 | - class="text-medium-emphasis text-body-1 tw-text-center tw-m-[64px]" | ||
291 | - > | ||
292 | - no data | ||
293 | - </div> --> | ||
294 | - </v-item-group> | ||
295 | - <v-row v-if="isMobile()"> | ||
296 | - <v-col> | ||
297 | - <v-pagination | ||
298 | - :size="isMobile() ? 'small' : 'default'" | ||
299 | - v-if="hotTotalMobile" | ||
300 | - v-model="currentIndexMobile" | ||
301 | - @update:modelValue="toggleRowMobile" | ||
302 | - :length="hotLength" | ||
303 | - rounded="0" | ||
304 | - class="tw-float-right tw-mt-[32px]" | ||
305 | - total-visible="5" | ||
306 | - ></v-pagination></v-col | ||
307 | - ></v-row> | ||
308 | - </div> | ||
309 | </v-card> | 239 | </v-card> |
310 | - <v-tabs | ||
311 | - class="tabs" | ||
312 | - v-model="tabRecom" | ||
313 | - style="margin-top: 25px" | ||
314 | - color="white" | ||
315 | - bg-color="#eeeeee" | ||
316 | - slider-color="blue-lighten-1" | ||
317 | - selected-class="active" | ||
318 | - v-if="recommendImages[0] !== null && !isMobile()" | ||
319 | - > | ||
320 | - <v-tab :value="1">Best Sellers</v-tab> | ||
321 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
322 | - </v-tabs> | ||
323 | - <div id="image-container" v-if="recommendImages[0] !== null && !isMobile()"> | ||
324 | - <div class="recommend-left-box"> | ||
325 | - <v-img | ||
326 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png" | ||
327 | - alt="往左移" | ||
328 | - class="recommend-img-left" | ||
329 | - @click="toggleRowLeft" | ||
330 | - /> | ||
331 | - </div> | ||
332 | - <div class="image-row" id="row1"> | ||
333 | - <!-- <img | ||
334 | - v-for="(imageObj, index) in recommendImages.slice(0, 5)" | ||
335 | - :key="'row1-' + index" | ||
336 | - :src="imageObj[0]?.url" | ||
337 | - :alt="'Image ' + (index + 1)" | ||
338 | - style="margin: 0 5px; width: 200px; height: 200px" | ||
339 | - /> --> | ||
340 | - <div | ||
341 | - v-for="(imageObj, index) in recommendImages" | ||
342 | - :key="'row1-' + index" | ||
343 | - class="imageTotal" | ||
344 | - > | ||
345 | - <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> | ||
346 | - <img | ||
347 | - :src="imageObj[0]?.url" | ||
348 | - :alt="'Image ' + (index + 1)" | ||
349 | - class="item-imgHot" | ||
350 | - /> | ||
351 | - <span class="image-name"> | ||
352 | - {{ imageObj[0]?.name }} | ||
353 | - </span> | ||
354 | - </a> | ||
355 | - <div v-else style="width: 200px; height: 200px"></div> | ||
356 | - </div> | ||
357 | - </div> | ||
358 | - <div class="recommend-right-box"> | ||
359 | - <v-img | ||
360 | - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png" | ||
361 | - alt="往右移" | ||
362 | - class="recommend-img-right" | ||
363 | - @click="toggleRowRight" | ||
364 | - /> | ||
365 | - </div> | ||
366 | - </div> | ||
367 | </template> | 240 | </template> |
368 | 241 | ||
369 | <script setup lang="ts"> | 242 | <script setup lang="ts"> |
@@ -663,9 +536,6 @@ watchEffect(async () => { | @@ -663,9 +536,6 @@ watchEffect(async () => { | ||
663 | useHead({ | 536 | useHead({ |
664 | title: "Contact", | 537 | title: "Contact", |
665 | }); | 538 | }); |
666 | -const hotLength = computed(() => | ||
667 | - hotTotalMobile.value ? Math.ceil(hotTotalMobile.value / 4) : 0 | ||
668 | -); | ||
669 | </script> | 539 | </script> |
670 | 540 | ||
671 | <style lang="scss" scoped> | 541 | <style lang="scss" scoped> |
@@ -878,4 +748,10 @@ button .recommendButton { | @@ -878,4 +748,10 @@ button .recommendButton { | ||
878 | span a { | 748 | span a { |
879 | color: black; | 749 | color: black; |
880 | } | 750 | } |
751 | +.icon{ | ||
752 | + display: flex; gap: 16px; align-items: center | ||
753 | +} | ||
754 | +.mobileIcon{ | ||
755 | + gap: 16px; align-items: center | ||
756 | +} | ||
881 | </style> | 757 | </style> |
pages/index.vue
@@ -31,8 +31,6 @@ | @@ -31,8 +31,6 @@ | ||
31 | </v-carousel-item> | 31 | </v-carousel-item> |
32 | </v-carousel> | 32 | </v-carousel> |
33 | </v-rows> | 33 | </v-rows> |
34 | - <HotProducts /> | ||
35 | - | ||
36 | <!-- 能源材料 --> | 34 | <!-- 能源材料 --> |
37 | <div class="tw-py-8 py-sm-16"> | 35 | <div class="tw-py-8 py-sm-16"> |
38 | <v-container> | 36 | <v-container> |
@@ -95,7 +93,6 @@ | @@ -95,7 +93,6 @@ | ||
95 | <script setup lang="ts"> | 93 | <script setup lang="ts"> |
96 | import MainTitleList from "../components/MainTitleList.vue"; | 94 | import MainTitleList from "../components/MainTitleList.vue"; |
97 | import MainTitleListOdd from "../components/MainTitleListOdd.vue"; | 95 | import MainTitleListOdd from "../components/MainTitleListOdd.vue"; |
98 | -import HotProducts from "../components/HotProducts.vue"; | ||
99 | import { useCategoryStore } from "../stores/category"; | 96 | import { useCategoryStore } from "../stores/category"; |
100 | import { computed, onMounted, reactive, ref } from "vue"; | 97 | import { computed, onMounted, reactive, ref } from "vue"; |
101 | import { isMobile } from "../utils"; | 98 | import { isMobile } from "../utils"; |
@@ -231,9 +228,6 @@ const packs = [ | @@ -231,9 +228,6 @@ const packs = [ | ||
231 | href: "/pack", | 228 | href: "/pack", |
232 | }, | 229 | }, |
233 | ]; | 230 | ]; |
234 | -// const hotLength = computed(() => | ||
235 | -// hotTotal.value ? Math.ceil(hotTotal.value / 4) : 0 | ||
236 | -// ); | ||
237 | </script> | 231 | </script> |
238 | <style scoped> | 232 | <style scoped> |
239 | @media screen and (min-width: 1537px) { | 233 | @media screen and (min-width: 1537px) { |
pages/products/index.vue
@@ -73,74 +73,6 @@ | @@ -73,74 +73,6 @@ | ||
73 | total-visible="5" | 73 | total-visible="5" |
74 | ></v-pagination></v-col | 74 | ></v-pagination></v-col |
75 | ></v-row> | 75 | ></v-row> |
76 | - <v-tabs | ||
77 | - class="tabs2" | ||
78 | - ref="tabs2" | ||
79 | - v-model="tabRecom" | ||
80 | - style="margin-top: 25px; margin-bottom: 20px" | ||
81 | - color="white" | ||
82 | - bg-color="#eeeeee" | ||
83 | - slider-color="blue-lighten-1" | ||
84 | - selected-class="active" | ||
85 | - v-if="isMobile()" | ||
86 | - > | ||
87 | - <v-tab :value="1">Best Sellers</v-tab> | ||
88 | - <!-- <v-tab :value="3">商品百科</v-tab> --> | ||
89 | - </v-tabs> | ||
90 | - <div class="tw-text-center" v-if="hotLoadingMobile && isMobile()"> | ||
91 | - <v-progress-circular | ||
92 | - color="blue-lighten-2" | ||
93 | - indeterminate | ||
94 | - size="64" | ||
95 | - class="tw-m-auto" | ||
96 | - ></v-progress-circular> | ||
97 | - </div> | ||
98 | - <v-item-group multiple v-if="isMobile()"> | ||
99 | - <v-row v-if="!hotLoadingMobile"> | ||
100 | - <v-col | ||
101 | - v-for="(item, i) in recommendImagesMobile" | ||
102 | - :key="i" | ||
103 | - cols="6" | ||
104 | - lg="3" | ||
105 | - md="4" | ||
106 | - sm="6" | ||
107 | - > | ||
108 | - <div v-if="item !== null"> | ||
109 | - <v-card :elevation="4" class="mx-auto" :href="item[0].productUrl"> | ||
110 | - <!-- 设置 eager 属性,确保图片直接加载 --> | ||
111 | - <v-img | ||
112 | - :src="item[0].url" | ||
113 | - :alt="item[0].name" | ||
114 | - eager | ||
115 | - class="d-block" | ||
116 | - /> | ||
117 | - <v-card-text class="tw-text-left font-weight-medium title"> | ||
118 | - <h4 class="clamp-text">{{ item[0].name }}</h4> | ||
119 | - </v-card-text> | ||
120 | - </v-card> | ||
121 | - </div> | ||
122 | - </v-col> | ||
123 | - </v-row> | ||
124 | - <!-- <div | ||
125 | - v-if="!hotTotal" | ||
126 | - class="text-medium-emphasis text-body-1 tw-text-center tw-m-[64px]" | ||
127 | - > | ||
128 | - no data | ||
129 | - </div> --> | ||
130 | - </v-item-group> | ||
131 | - <v-row v-if="isMobile()"> | ||
132 | - <v-col> | ||
133 | - <v-pagination | ||
134 | - :size="isMobile() ? 'small' : 'default'" | ||
135 | - v-if="hotTotalMobile" | ||
136 | - v-model="currentIndexMobile" | ||
137 | - @update:modelValue="toggleRowMobile" | ||
138 | - :length="hotLength" | ||
139 | - rounded="0" | ||
140 | - class="tw-float-right tw-mt-[32px]" | ||
141 | - total-visible="5" | ||
142 | - ></v-pagination></v-col | ||
143 | - ></v-row> | ||
144 | </v-container> | 76 | </v-container> |
145 | </div> | 77 | </div> |
146 | </template> | 78 | </template> |