Commit 7ca465a9fef3f606ac322bb5ac5d4af5b9ebe6c5

Authored by boyang
1 parent 741479b9

fix: 只有商品详情页保留推荐商品,prod2-58/59

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 () =&gt; { @@ -663,9 +536,6 @@ watchEffect(async () =&gt; {
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>