Commit e621b58f67294fffbf5bfa688ff521f7d190bcdf

Authored by boyang
1 parent 3b581a76

fix: prod2-42/43

components/MobileProductDetail.vue
@@ -309,7 +309,7 @@ @@ -309,7 +309,7 @@
309 class="d-block" 309 class="d-block"
310 /> 310 />
311 <v-card-text class="tw-text-left font-weight-medium title"> 311 <v-card-text class="tw-text-left font-weight-medium title">
312 - <h4>{{ item[0].name }}</h4> 312 + <h4 class="clamp-text">{{ item[0].name }}</h4>
313 </v-card-text> 313 </v-card-text>
314 </v-card> 314 </v-card>
315 </div> 315 </div>
@@ -370,7 +370,7 @@ @@ -370,7 +370,7 @@
370 class="d-block" 370 class="d-block"
371 /> 371 />
372 <v-card-text class="tw-text-left font-weight-medium title"> 372 <v-card-text class="tw-text-left font-weight-medium title">
373 - <h4>{{ item[0].name }}</h4> 373 + <h4 class="clamp-text">{{ item[0].name }}</h4>
374 </v-card-text> 374 </v-card-text>
375 </v-card> 375 </v-card>
376 </div> 376 </div>
@@ -810,4 +810,14 @@ const hotLength = computed(() =&gt; @@ -810,4 +810,14 @@ const hotLength = computed(() =&gt;
810 .v-card { 810 .v-card {
811 transition: all 0.3s ease-in-out; 811 transition: all 0.3s ease-in-out;
812 } 812 }
  813 +.clamp-text {
  814 + display: -webkit-box; /* 使用弹性盒子 */
  815 + -webkit-box-orient: vertical; /* 设置为垂直方向 */
  816 + -webkit-line-clamp: 3; /* 限制最多显示3行 */
  817 + overflow: hidden; /* 隐藏多余内容 */
  818 + text-overflow: ellipsis; /* 添加省略号 */
  819 + white-space: normal; /* 允许换行 */
  820 + line-height: 1.5em; /* 设置每行的高度 */
  821 + min-height: calc(3 * 1.5em); /* 确保最小高度为3行 */
  822 +}
813 </style> 823 </style>
deploy/prod2.sh
1 #!/bin/bash 1 #!/bin/bash
2 # 变量定义 2 # 变量定义
3 -LAST_TAG="1.0.41"  
4 -TAG="1.0.42" 3 +LAST_TAG="1.0.42"
  4 +TAG="1.0.43"
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/contact.vue
@@ -34,6 +34,35 @@ @@ -34,6 +34,35 @@
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 + <h3 class="text-h5 tw-mb-5 tw-mt-5">Other Platforms</h3>
  38 + <div class="tw-mb-5">
  39 + <label class="text-subtitle-1 tw-mr-4 tw-w-20 tw-inline-block"
  40 + >LinkedIn:</label
  41 + >
  42 + <span>https://www.linkedin.com/company/canrd?originalSubdomain=cn</span>
  43 + </div>
  44 + <div class="tw-mb-5">
  45 + <label class="text-subtitle-1 tw-mr-4 tw-w-20 tw-inline-block"
  46 + >Amazon:</label
  47 + >
  48 + <span
  49 + >https://www.amazon.com/s?me=A3A2SQ086XUS66&marketplaceID=ATVPDKIKX0DER</span
  50 + >
  51 + </div>
  52 + <div class="tw-mb-5">
  53 + <label class="text-subtitle-1 tw-mr-4 tw-w-20 tw-inline-block"
  54 + >Alibaba:</label
  55 + >
  56 + <span
  57 + >https://canrd.en.alibaba.com/company_profile.html?spm=a2700.galleryofferlist.normal_offer.d_companyName.262213a0fqshG2</span
  58 + >
  59 + </div>
  60 + <div class="tw-mb-5">
  61 + <label class="text-subtitle-1 tw-mr-4 tw-w-20 tw-inline-block"
  62 + >Youtube:</label
  63 + >
  64 + <span>https://www.youtube.com/@Canrd_Tech</span>
  65 + </div>
37 <div style="margin-bottom: 10px"> 66 <div style="margin-bottom: 10px">
38 <v-tabs 67 <v-tabs
39 class="tabs2" 68 class="tabs2"
pages/index.vue
@@ -32,118 +32,7 @@ @@ -32,118 +32,7 @@
32 </v-carousel> 32 </v-carousel>
33 </v-rows> 33 </v-rows>
34 <HotProducts /> 34 <HotProducts />
35 - <!-- <v-tabs  
36 - class="tabs"  
37 - v-model="tabRecom"  
38 - color="white"  
39 - bg-color="#eeeeee"  
40 - style="margin-top: 40px"  
41 - slider-color="blue-lighten-1"  
42 - selected-class="active"  
43 - v-if="recommendImages[0] !== null && !isMobile()"  
44 - >  
45 - <v-tab :value="1">Best Sellers</v-tab>  
46 - </v-tabs>  
47 35
48 - <div id="image-container" v-if="recommendImages[0] !== null && !isMobile()">  
49 - <div class="recommend-left-box">  
50 - <v-img  
51 - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png"  
52 - alt="往左移"  
53 - class="recommend-img-left"  
54 - @click="toggleRowLeft"  
55 - />  
56 - </div>  
57 - <div class="image-row" id="row1">  
58 - <div  
59 - v-for="(imageObj, index) in recommendImages"  
60 - :key="'row1-' + index"  
61 - class="imageTotal"  
62 - >  
63 - <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank">  
64 - <img  
65 - :src="imageObj[0]?.url"  
66 - :alt="'Image ' + (index + 1)"  
67 - class="item-imgHot"  
68 - />  
69 - <span class="image-name">  
70 - {{ imageObj[0]?.name }}  
71 - </span>  
72 - </a>  
73 - <div v-else class="image-substitute"></div>  
74 - </div>  
75 - </div>  
76 - <div class="recommend-right-box">  
77 - <v-img  
78 - src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png"  
79 - alt="往右移"  
80 - class="recommend-img-right"  
81 - @click="toggleRowRight"  
82 - />  
83 - </div>  
84 - </div>  
85 - <div style="padding-left: 16px; padding-right: 16px">  
86 - <v-tabs  
87 - class="tabs2"  
88 - ref="tabs2"  
89 - v-model="tabRecom"  
90 - style="margin-top: 25px; margin-bottom: 20px; width: 100%"  
91 - color="white"  
92 - bg-color="#eeeeee"  
93 - slider-color="blue-lighten-1"  
94 - selected-class="active"  
95 - v-if="isMobile()"  
96 - >  
97 - <v-tab :value="1">Best Sellers</v-tab>  
98 - </v-tabs>  
99 - <div class="tw-text-center" v-if="hotLoadingMobile && isMobile()">  
100 - <v-progress-circular  
101 - color="blue-lighten-2"  
102 - indeterminate  
103 - size="64"  
104 - class="tw-m-auto"  
105 - ></v-progress-circular>  
106 - </div>  
107 - <v-item-group multiple v-if="isMobile()">  
108 - <v-row v-if="!hotLoadingMobile">  
109 - <v-col  
110 - v-for="(item, i) in recommendImagesMobile"  
111 - :key="i"  
112 - cols="6"  
113 - lg="3"  
114 - md="4"  
115 - sm="6"  
116 - >  
117 - <div v-if="item !== null">  
118 - <v-card :elevation="4" class="mx-auto" :href="item[0].productUrl">  
119 - <v-img  
120 - :src="item[0].url"  
121 - :alt="item[0].name"  
122 - eager  
123 - class="d-block"  
124 - />  
125 - <v-card-text class="tw-text-left font-weight-medium title">  
126 - <h4 class="clamp-text">{{ item[0].name }}</h4>  
127 - </v-card-text>  
128 - </v-card>  
129 - </div>  
130 - </v-col>  
131 - </v-row>  
132 - </v-item-group>  
133 - <v-row v-if="isMobile()">  
134 - <v-col>  
135 - <v-pagination  
136 - :size="isMobile() ? 'small' : 'default'"  
137 - v-if="hotTotalMobile"  
138 - v-model="currentIndexMobile"  
139 - @update:modelValue="toggleRowMobile"  
140 - :length="hotLength"  
141 - rounded="0"  
142 - class="tw-float-right tw-mt-[32px]"  
143 - total-visible="5"  
144 - ></v-pagination></v-col  
145 - ></v-row>  
146 - </div> -->  
147 <!-- 能源材料 --> 36 <!-- 能源材料 -->
148 <div class="tw-py-8 py-sm-16"> 37 <div class="tw-py-8 py-sm-16">
149 <v-container> 38 <v-container>
@@ -211,159 +100,6 @@ import { useCategoryStore } from &quot;../stores/category&quot;; @@ -211,159 +100,6 @@ import { useCategoryStore } from &quot;../stores/category&quot;;
211 import { computed, onMounted, reactive, ref } from "vue"; 100 import { computed, onMounted, reactive, ref } from "vue";
212 import { isMobile } from "../utils"; 101 import { isMobile } from "../utils";
213 102
214 -const maxPage = ref(1);  
215 -const maxPageMobile = ref(1);  
216 -const tabRecom = ref();  
217 -const recommendList = ref({});  
218 -const recommendImages = ref({});  
219 -const currentIndex = ref(1);  
220 -const hotLoading = ref(false);  
221 -const hotTotal = ref(10);  
222 -const isOrNotMobile = isMobile();  
223 -const recommendListMobile = ref({});  
224 -const recommendImagesMobile = ref({});  
225 -const currentIndexMobile = ref(1);  
226 -const hotLoadingMobile = ref(false);  
227 -const hotTotalMobile = ref(10);  
228 -// const loadHotProducts = async () => {  
229 -// hotLoading.value = true;  
230 -// const pageSize = 5;  
231 -// let { data: hotProducts } = await useAsyncData(  
232 -// "hotProducts",  
233 -// () =>  
234 -// $fetch("/shop/product/hotProducts", {  
235 -// method: "GET",  
236 -// params: {  
237 -// pageNo: currentIndex.value,  
238 -// pageSize: pageSize,  
239 -// },  
240 -// }),  
241 -// {  
242 -// server: true, // 仅在服务器端获取数据  
243 -// }  
244 -// );  
245 -// hotTotal.value = hotProducts.value.data.total;  
246 -// recommendList.value = hotProducts.value.data.records;  
247 -// maxPage.value = hotProducts.value.data.pages;  
248 -// // recommendImages.value = recommendList.value.slice(0, 10).map((item) => {  
249 -// recommendImages.value = Array.from({ length: 5 }).map((_, index) => {  
250 -// const item = recommendList.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 -// hotLoading.value = false;  
274 -// };  
275 -  
276 -// const toggleRowLeft = () => {  
277 -// if (currentIndex.value !== 1) {  
278 -// currentIndex.value--;  
279 -// } else if (currentIndex.value == 1) {  
280 -// currentIndex.value = maxPage.value;  
281 -// }  
282 -// startTimer();  
283 -// };  
284 -// let intervalId: any;  
285 -// const toggleRowRight = () => {  
286 -// if (currentIndex.value < maxPage.value) {  
287 -// currentIndex.value++;  
288 -// } else if (currentIndex.value == maxPage.value) {  
289 -// currentIndex.value = 1;  
290 -// }  
291 -// startTimer();  
292 -// };  
293 -// const startTimer = () => {  
294 -// // 清除已有计时器,防止重复  
295 -// clearInterval(intervalId);  
296 -// intervalId = setInterval(() => {  
297 -// toggleRowRight();  
298 -// }, 5000); // 每6秒调用一次  
299 -// };  
300 -  
301 -// onMounted(() => {  
302 -// startTimer();  
303 -// });  
304 -  
305 -// const toggleRowMobile = (value: number) => {  
306 -// currentIndexMobile.value = value;  
307 -// };  
308 -  
309 -// watch(currentIndex, (newIndex) => {  
310 -// loadHotProducts(); // Call loadHotProducts when currentIndex changes  
311 -// });  
312 -// // Initial load of hot products  
313 -// await loadHotProducts(); // Load hot products the first time  
314 -  
315 -// const loadHotProductsMobile = async () => {  
316 -// hotLoadingMobile.value = true;  
317 -// let { data: hotProductsMobile } = await useAsyncData(  
318 -// "hotProducts",  
319 -// () =>  
320 -// $fetch("/shop/product/hotProducts", {  
321 -// method: "GET",  
322 -// params: {  
323 -// pageNo: currentIndexMobile.value,  
324 -// pageSize: 4,  
325 -// },  
326 -// }),  
327 -// {  
328 -// server: true, // 仅在服务器端获取数据  
329 -// }  
330 -// );  
331 -// hotTotalMobile.value = hotProductsMobile.value.data.total;  
332 -// recommendListMobile.value = hotProductsMobile.value.data.records;  
333 -// maxPageMobile.value = hotProductsMobile.value.data.pages;  
334 -// // recommendImages.value = recommendList.value.slice(0, 10).map((item) => {  
335 -// recommendImagesMobile.value = Array.from({ length: 4 }).map((_, index) => {  
336 -// const item = recommendListMobile.value[index];  
337 -// if (!item) {  
338 -// return null;  
339 -// }  
340 -// // 检查 productimageliststore 是否为字符串格式,如果是,则尝试解析  
341 -// if (typeof item.productimageliststore === "string") {  
342 -// try {  
343 -// item.productimageliststore = JSON.parse(item.productimageliststore);  
344 -// } catch (error) {  
345 -// item.productimageliststore = []; // 解析失败时,设置为空数组  
346 -// }  
347 -// }  
348 -// const ree = (item.productimageliststore = item?.productimageliststore.map(  
349 -// (productItem: ProductImage) => ({  
350 -// ...productItem,  
351 -// // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`,  
352 -// url: `https://www.canrud.com/api/show/image?fileKey=${productItem.fileKey}&psize=p256`,  
353 -// name: item.name,  
354 -// productUrl: `https://www.canrud.com/products/detail/${item.id}`,  
355 -// })  
356 -// ));  
357 -// return ree;  
358 -// });  
359 -// hotLoadingMobile.value = false;  
360 -// };  
361 -// watch(currentIndexMobile, (newIndex) => {  
362 -// loadHotProductsMobile(); // Call loadHotProducts when currentIndex changes  
363 -// });  
364 -// // Initial load of hot products  
365 -// await loadHotProductsMobile(); // Load hot products the first time  
366 -  
367 onMounted(() => { 103 onMounted(() => {
368 console.log( 104 console.log(
369 "%c [ onMounted ]-10", 105 "%c [ onMounted ]-10",
@@ -526,15 +262,6 @@ const packs = [ @@ -526,15 +262,6 @@ const packs = [
526 background-color: #1086e8; 262 background-color: #1086e8;
527 } 263 }
528 264
529 -/* #image-container {  
530 - display: flex;  
531 - align-items: center;  
532 - justify-content: center;  
533 - height: 320px;  
534 - margin: 10px auto 50px;  
535 - width: 80%;  
536 -} */  
537 -  
538 @media screen and (min-width: 1537px) { 265 @media screen and (min-width: 1537px) {
539 #image-container { 266 #image-container {
540 display: flex; 267 display: flex;
pages/products/index.vue
@@ -210,7 +210,6 @@ import { useProductListStore } from &quot;~/stores/product_list&quot;; @@ -210,7 +210,6 @@ import { useProductListStore } from &quot;~/stores/product_list&quot;;
210 import { useCategoryStore } from "~/stores/category"; 210 import { useCategoryStore } from "~/stores/category";
211 import CategoryList from "~/components/CategoryList.vue"; 211 import CategoryList from "~/components/CategoryList.vue";
212 import MobileCategoryList from "~/components/MobileCategoryList.vue"; 212 import MobileCategoryList from "~/components/MobileCategoryList.vue";
213 -import HotProducts from "../components/HotProducts.vue";  
214 import { watchEffect, computed, ref } from "vue"; 213 import { watchEffect, computed, ref } from "vue";
215 214
216 const productStore = useProductListStore(); 215 const productStore = useProductListStore();
@@ -546,46 +545,7 @@ watchEffect(async () =&gt; { @@ -546,46 +545,7 @@ watchEffect(async () =&gt; {
546 isWindowAssigned.value = true; 545 isWindowAssigned.value = true;
547 } 546 }
548 loadProducts(); 547 loadProducts();
549 - // console.log(categoryStore.selectedSubCategory, "5656index-categoryStore");  
550 }); 548 });
551 -// onMounted(() => {  
552 -// // window.selectedSubCategory = categoryStore.selectedSubCategory;  
553 -// // window.selectedFuncCategory = categoryStore.selectedFuncCategory;  
554 -// if (route.query.function) {  
555 -// const functionName = route.query.function.trim();  
556 -// const funcCategoryList = computed(() => {  
557 -// if (categoryStore.selectedCategory) {  
558 -// const tmp = categoryStore.list.filter(  
559 -// (item) => item.categoryDisplayName === categoryStore.selectedCategory  
560 -// );  
561 -// return tmp?.[0]?.productFunctions || [];  
562 -// }  
563 -// return [];  
564 -// });  
565 -// const foundFuncCategory = funcCategoryList.value.find(  
566 -// (func) => func.name === functionName  
567 -// );  
568 -  
569 -// if (foundFuncCategory) {  
570 -// const funcCategoryId = foundFuncCategory.id;  
571 -// if (typeof localStorage !== "undefined") {  
572 -// localStorage.setItem("selectedFuncCategory2", funcCategoryId);  
573 -// localStorage.setItem("selectedFuncCategory3", "1");  
574 -// }  
575 -// // 你可以在这里使用找到的 funcCategoryId  
576 -// }  
577 -// // // 6. 查找对应的功能分类 ID  
578 -// // const foundFuncCategory = funcCategories.find(  
579 -// // (func) => func.name === functionName  
580 -// // );  
581 -  
582 -// // if (foundFuncCategory) {  
583 -// // const funcCategoryId = foundFuncCategory.id;  
584 -// // // 使用找到的 funcCategoryId  
585 -// // categoryStore.updateFuncCategory(funcCategoryId);  
586 -// // }  
587 -// }  
588 -// });  
589 549
590 const length = computed(() => 550 const length = computed(() =>
591 productStore.total ? Math.ceil(productStore.total / productStore.pageSize) : 0 551 productStore.total ? Math.ceil(productStore.total / productStore.pageSize) : 0