@puresnake/snake-ui 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/LICENSE +21 -0
  2. package/changelog.md +1 -0
  3. package/components/snake-activity-list/snake-activity-list.vue +365 -0
  4. package/components/snake-activity-list/types.ts +29 -0
  5. package/components/snake-auxiliary-segmentation/snake-auxiliary-segmentation.vue +44 -0
  6. package/components/snake-auxiliary-segmentation/types.ts +5 -0
  7. package/components/snake-button/snake-button.vue +357 -0
  8. package/components/snake-button/types.ts +103 -0
  9. package/components/snake-button-sort/snake-button-sort.vue +72 -0
  10. package/components/snake-button-sort/types.ts +22 -0
  11. package/components/snake-calendar/snake-calendar.vue +998 -0
  12. package/components/snake-calendar/types.ts +189 -0
  13. package/components/snake-cell-group/snake-cell-group.vue +55 -0
  14. package/components/snake-cell-group/types.ts +19 -0
  15. package/components/snake-cell-item/snake-cell-item.vue +159 -0
  16. package/components/snake-cell-item/types.ts +66 -0
  17. package/components/snake-checkbox/snake-checkbox.vue +264 -0
  18. package/components/snake-checkbox/types.ts +70 -0
  19. package/components/snake-checkbox-group/snake-checkbox-group.vue +154 -0
  20. package/components/snake-checkbox-group/types.ts +52 -0
  21. package/components/snake-cms/blocks/v2/cms-v2-carousel.vue +87 -0
  22. package/components/snake-cms/blocks/v2/cms-v2-coupon.vue +25 -0
  23. package/components/snake-cms/blocks/v2/cms-v2-custom.vue +12 -0
  24. package/components/snake-cms/blocks/v2/cms-v2-divider.vue +33 -0
  25. package/components/snake-cms/blocks/v2/cms-v2-floatbutton.vue +28 -0
  26. package/components/snake-cms/blocks/v2/cms-v2-goods-list.vue +150 -0
  27. package/components/snake-cms/blocks/v2/cms-v2-hotzone.vue +41 -0
  28. package/components/snake-cms/blocks/v2/cms-v2-images.vue +41 -0
  29. package/components/snake-cms/blocks/v2/cms-v2-magiccube.vue +93 -0
  30. package/components/snake-cms/blocks/v2/cms-v2-notice.vue +80 -0
  31. package/components/snake-cms/blocks/v2/cms-v2-popup.vue +46 -0
  32. package/components/snake-cms/blocks/v2/cms-v2-richtext.vue +18 -0
  33. package/components/snake-cms/blocks/v2/cms-v2-search.vue +115 -0
  34. package/components/snake-cms/blocks/v2/cms-v2-video.vue +25 -0
  35. package/components/snake-cms/blocks/v2/shared.ts +84 -0
  36. package/components/snake-cms/snake-cms.vue +409 -0
  37. package/components/snake-cms/types.ts +50 -0
  38. package/components/snake-commodity-search/snake-commodity-search.vue +234 -0
  39. package/components/snake-commodity-search/types.ts +11 -0
  40. package/components/snake-config-provider/snake-config-provider.vue +61 -0
  41. package/components/snake-config-provider/types.ts +22 -0
  42. package/components/snake-count-down/snake-count-down.vue +231 -0
  43. package/components/snake-count-down/types.ts +103 -0
  44. package/components/snake-coupon/snake-coupon.vue +209 -0
  45. package/components/snake-coupon/types.ts +21 -0
  46. package/components/snake-custom-module/snake-custom-module.vue +25 -0
  47. package/components/snake-custom-module/types.ts +11 -0
  48. package/components/snake-drop-menu/snake-drop-menu.vue +123 -0
  49. package/components/snake-drop-menu/types.ts +95 -0
  50. package/components/snake-drop-menu-item/snake-drop-menu-item.vue +181 -0
  51. package/components/snake-drop-menu-item/types.ts +48 -0
  52. package/components/snake-empty/snake-empty.vue +100 -0
  53. package/components/snake-empty/types.ts +48 -0
  54. package/components/snake-filter-sorts/filter-page.vue +695 -0
  55. package/components/snake-filter-sorts/snake-filter-sorts.vue +185 -0
  56. package/components/snake-filter-sorts/types.ts +57 -0
  57. package/components/snake-floating-bubble/snake-floating-bubble.vue +157 -0
  58. package/components/snake-floating-bubble/types.ts +43 -0
  59. package/components/snake-follow/snake-follow.vue +18 -0
  60. package/components/snake-follow/types.ts +2 -0
  61. package/components/snake-form/snake-form.vue +124 -0
  62. package/components/snake-form/types.ts +96 -0
  63. package/components/snake-form-item/snake-form-item.vue +331 -0
  64. package/components/snake-form-item/types.ts +70 -0
  65. package/components/snake-goods-list/snake-goods-list.vue +792 -0
  66. package/components/snake-goods-list/types.ts +55 -0
  67. package/components/snake-graphic-navigation/snake-graphic-navigation.vue +198 -0
  68. package/components/snake-graphic-navigation/types.ts +43 -0
  69. package/components/snake-icon/icon-names.ts +222 -0
  70. package/components/snake-icon/snake-icon.vue +220 -0
  71. package/components/snake-icon/types.ts +45 -0
  72. package/components/snake-image/snake-image.vue +230 -0
  73. package/components/snake-image/types.ts +70 -0
  74. package/components/snake-images/snake-images.vue +80 -0
  75. package/components/snake-images/types.ts +5 -0
  76. package/components/snake-index-anchor/snake-index-anchor.vue +83 -0
  77. package/components/snake-index-anchor/types.ts +14 -0
  78. package/components/snake-index-list/anchor-registry.ts +80 -0
  79. package/components/snake-index-list/snake-index-list.vue +259 -0
  80. package/components/snake-index-list/types.ts +115 -0
  81. package/components/snake-index-list-panel/snake-index-list-panel.vue +277 -0
  82. package/components/snake-index-list-panel/types.ts +10 -0
  83. package/components/snake-input/snake-input.vue +225 -0
  84. package/components/snake-input/types.ts +99 -0
  85. package/components/snake-jump-applet/snake-jump-applet.vue +99 -0
  86. package/components/snake-jump-applet/types.ts +17 -0
  87. package/components/snake-line/snake-line.vue +42 -0
  88. package/components/snake-line/types.ts +30 -0
  89. package/components/snake-line-progress/snake-line-progress.vue +105 -0
  90. package/components/snake-line-progress/types.ts +26 -0
  91. package/components/snake-link/snake-link.vue +74 -0
  92. package/components/snake-link/types.ts +30 -0
  93. package/components/snake-list-switching/components/tree-select/index.vue +156 -0
  94. package/components/snake-list-switching/snake-list-switching.vue +1285 -0
  95. package/components/snake-list-switching/types.ts +11 -0
  96. package/components/snake-loading/snake-loading.vue +241 -0
  97. package/components/snake-loading/types.ts +34 -0
  98. package/components/snake-loadmore/snake-loadmore.vue +103 -0
  99. package/components/snake-loadmore/types.ts +56 -0
  100. package/components/snake-magic-cube/snake-magic-cube.vue +622 -0
  101. package/components/snake-magic-cube/types.ts +5 -0
  102. package/components/snake-modal/snake-modal.vue +434 -0
  103. package/components/snake-modal/types.ts +71 -0
  104. package/components/snake-navbar/snake-navbar.vue +194 -0
  105. package/components/snake-navbar/types.ts +54 -0
  106. package/components/snake-no-network/snake-no-network.vue +125 -0
  107. package/components/snake-no-network/types.ts +27 -0
  108. package/components/snake-notice/snake-notice.vue +44 -0
  109. package/components/snake-notice/types.ts +5 -0
  110. package/components/snake-notice-bar/snake-notice-bar.vue +336 -0
  111. package/components/snake-notice-bar/types.ts +82 -0
  112. package/components/snake-overlay/snake-overlay.vue +73 -0
  113. package/components/snake-overlay/types.ts +35 -0
  114. package/components/snake-page-popup/snake-page-popup.vue +146 -0
  115. package/components/snake-page-popup/types.ts +28 -0
  116. package/components/snake-parse/audio/audio.vue +286 -0
  117. package/components/snake-parse/audio/context.js +11 -0
  118. package/components/snake-parse/audio/index.js +34 -0
  119. package/components/snake-parse/node/node.vue +830 -0
  120. package/components/snake-parse/parser.js +1480 -0
  121. package/components/snake-parse/snake-parse.vue +548 -0
  122. package/components/snake-parse/static/app-plus/snake-parse/js/handler.js +109 -0
  123. package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.js +0 -0
  124. package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.min.js +1 -0
  125. package/components/snake-parse/static/app-plus/snake-parse/local.html +3 -0
  126. package/components/snake-parse/style/index.js +132 -0
  127. package/components/snake-parse/style/parser.js +175 -0
  128. package/components/snake-parse/types.ts +49 -0
  129. package/components/snake-picture-ads/snake-picture-ads.vue +292 -0
  130. package/components/snake-picture-ads/types.ts +5 -0
  131. package/components/snake-popup/snake-popup.vue +348 -0
  132. package/components/snake-popup/types.ts +88 -0
  133. package/components/snake-qr-code/qrcode.ts +1214 -0
  134. package/components/snake-qr-code/snake-qr-code.vue +408 -0
  135. package/components/snake-qr-code/types.ts +78 -0
  136. package/components/snake-radio/snake-radio.vue +271 -0
  137. package/components/snake-radio/types.ts +64 -0
  138. package/components/snake-radio-group/snake-radio-group.vue +98 -0
  139. package/components/snake-radio-group/types.ts +48 -0
  140. package/components/snake-read-more/snake-read-more.vue +140 -0
  141. package/components/snake-read-more/types.ts +53 -0
  142. package/components/snake-rich-text/snake-rich-text.vue +24 -0
  143. package/components/snake-rich-text/types.ts +5 -0
  144. package/components/snake-root-portal/snake-root-portal.vue +92 -0
  145. package/components/snake-root-portal/types.ts +9 -0
  146. package/components/snake-search/snake-search.vue +202 -0
  147. package/components/snake-search/types.ts +84 -0
  148. package/components/snake-select/snake-select.vue +371 -0
  149. package/components/snake-select/types.ts +75 -0
  150. package/components/snake-skeleton/snake-skeleton.vue +104 -0
  151. package/components/snake-skeleton/types.ts +32 -0
  152. package/components/snake-skeleton-item/snake-skeleton-item.vue +90 -0
  153. package/components/snake-skeleton-item/types.ts +30 -0
  154. package/components/snake-slider/snake-slider.vue +249 -0
  155. package/components/snake-slider/types.ts +59 -0
  156. package/components/snake-sticky/snake-sticky.vue +178 -0
  157. package/components/snake-sticky/types.ts +48 -0
  158. package/components/snake-subsection/snake-subsection.vue +188 -0
  159. package/components/snake-subsection/types.ts +54 -0
  160. package/components/snake-swiper/snake-swiper.vue +229 -0
  161. package/components/snake-swiper/types.ts +79 -0
  162. package/components/snake-switch/snake-switch.vue +100 -0
  163. package/components/snake-switch/types.ts +41 -0
  164. package/components/snake-tabbar/snake-tabbar.vue +306 -0
  165. package/components/snake-tabbar/types.ts +93 -0
  166. package/components/snake-tabs/snake-tabs.vue +305 -0
  167. package/components/snake-tabs/types.ts +79 -0
  168. package/components/snake-text/snake-text.vue +292 -0
  169. package/components/snake-text/types.ts +100 -0
  170. package/components/snake-textarea/snake-textarea.vue +171 -0
  171. package/components/snake-textarea/types.ts +79 -0
  172. package/components/snake-toast/snake-toast.vue +330 -0
  173. package/components/snake-toast/types.ts +55 -0
  174. package/components/snake-tooltip/position.ts +33 -0
  175. package/components/snake-tooltip/snake-tooltip.vue +339 -0
  176. package/components/snake-tooltip/types.ts +80 -0
  177. package/components/snake-transition/snake-transition.vue +315 -0
  178. package/components/snake-transition/types.ts +65 -0
  179. package/components/snake-upload/snake-upload.vue +1801 -0
  180. package/components/snake-upload/types.ts +256 -0
  181. package/components/snake-videos/snake-videos.vue +122 -0
  182. package/components/snake-videos/types.ts +7 -0
  183. package/iconfont.css +881 -0
  184. package/index.d.ts +7 -0
  185. package/index.scss +26 -0
  186. package/index.ts +94 -0
  187. package/libs/cms/blocks.ts +103 -0
  188. package/libs/cms/config.ts +25 -0
  189. package/libs/cms/index.ts +7 -0
  190. package/libs/cms/normalize.ts +135 -0
  191. package/libs/cms/resolve.ts +12 -0
  192. package/libs/cms/types.ts +164 -0
  193. package/libs/cms/use-commerce.ts +385 -0
  194. package/libs/cms/v2.ts +193 -0
  195. package/libs/config/index.ts +4 -0
  196. package/libs/config/modal.ts +93 -0
  197. package/libs/config/state.ts +33 -0
  198. package/libs/config/theme.ts +351 -0
  199. package/libs/config/toast.ts +71 -0
  200. package/libs/config/types.ts +135 -0
  201. package/libs/config/zIndex.ts +44 -0
  202. package/libs/css/color.scss +105 -0
  203. package/libs/css/common.scss +171 -0
  204. package/libs/css/style.h5.scss +7 -0
  205. package/libs/css/style.mp.scss +7 -0
  206. package/libs/css/style.theme.scss +70 -0
  207. package/libs/css/style.vue.scss +140 -0
  208. package/libs/form/async-validator.min.d.ts +75 -0
  209. package/libs/form/async-validator.min.js +3 -0
  210. package/libs/form/index.ts +3 -0
  211. package/libs/form/path.ts +40 -0
  212. package/libs/form/types.ts +51 -0
  213. package/libs/form/validate.ts +149 -0
  214. package/libs/foundation.ts +96 -0
  215. package/libs/function/$parent.ts +33 -0
  216. package/libs/function/clipboard.ts +13 -0
  217. package/libs/function/color.ts +55 -0
  218. package/libs/function/debounce.ts +34 -0
  219. package/libs/function/deepClone.ts +30 -0
  220. package/libs/function/deepMerge.ts +25 -0
  221. package/libs/function/emitter.ts +30 -0
  222. package/libs/function/format.ts +27 -0
  223. package/libs/function/getParent.ts +53 -0
  224. package/libs/function/getRect.ts +29 -0
  225. package/libs/function/guid.ts +11 -0
  226. package/libs/function/index.ts +31 -0
  227. package/libs/function/queryParams.ts +73 -0
  228. package/libs/function/random.ts +6 -0
  229. package/libs/function/randomArray.ts +14 -0
  230. package/libs/function/route.ts +155 -0
  231. package/libs/function/sleep.ts +7 -0
  232. package/libs/function/style.ts +58 -0
  233. package/libs/function/styleUtils.ts +83 -0
  234. package/libs/function/system.ts +14 -0
  235. package/libs/function/test.ts +202 -0
  236. package/libs/function/throttle.ts +36 -0
  237. package/libs/function/timeFormat.ts +27 -0
  238. package/libs/function/timeFrom.ts +27 -0
  239. package/libs/function/toast.ts +10 -0
  240. package/libs/function/trim.ts +11 -0
  241. package/libs/function/type2icon.ts +11 -0
  242. package/libs/function/unit.ts +45 -0
  243. package/libs/hooks/index.ts +11 -0
  244. package/libs/hooks/useChildren.ts +125 -0
  245. package/libs/hooks/useColor.ts +5 -0
  246. package/libs/hooks/useDebounce.ts +5 -0
  247. package/libs/hooks/useLocale.ts +13 -0
  248. package/libs/hooks/useModal.ts +131 -0
  249. package/libs/hooks/useParent.ts +62 -0
  250. package/libs/hooks/useRect.ts +44 -0
  251. package/libs/hooks/useRouter.ts +5 -0
  252. package/libs/hooks/useTheme.ts +31 -0
  253. package/libs/hooks/useThrottle.ts +5 -0
  254. package/libs/hooks/useToast.ts +116 -0
  255. package/libs/index.ts +18 -0
  256. package/libs/request/auto-http.ts +1 -0
  257. package/libs/request/index.ts +343 -0
  258. package/libs/runtime/accessors.ts +55 -0
  259. package/libs/runtime/context.ts +40 -0
  260. package/libs/runtime/index.ts +18 -0
  261. package/libs/runtime/types.ts +49 -0
  262. package/libs/util/calendar.ts +6 -0
  263. package/locale/index.ts +130 -0
  264. package/locale/lang/en-US.ts +67 -0
  265. package/locale/lang/zh-CN.ts +67 -0
  266. package/package.json +130 -5
  267. package/plugins/index.ts +1 -0
  268. package/plugins/root/README.md +86 -0
  269. package/plugins/root/index.ts +123 -0
  270. package/plugins/root/page.ts +77 -0
  271. package/plugins/root/root.ts +53 -0
  272. package/plugins/root/utils.ts +137 -0
  273. package/readme.md +79 -0
  274. package/theme.scss +118 -0
  275. package/types/components.d.ts +236 -0
  276. package/types/global.d.ts +21 -0
  277. package/types/index.d.ts +6 -0
  278. package/types/uni-app.d.ts +16 -0
  279. package/README.md +0 -3
@@ -0,0 +1,792 @@
1
+ <template>
2
+ <scroll-view v-if="layout === 'swipe'" scroll-x class="goods-list-scroll" :style="{ backgroundColor: bgColor }">
3
+ <view class="goods-list goods-list--swipe" :style="listStyle">
4
+ <block v-for="(item, index) in goodsList" :key="item.id">
5
+ <view
6
+ class="item"
7
+ :style="[itemStyle]"
8
+ role="link"
9
+ tabindex="0"
10
+ :aria-label="`查看商品:${item.name || item.goodsName || item.id || index + 1}`"
11
+ @click.stop="$emit('item-click', item, index)"
12
+ @keydown.enter.prevent="$emit('item-click', item, index)"
13
+ @keydown.space.prevent="$emit('item-click', item, index)"
14
+ >
15
+ <!-- 图片 -->
16
+ <view class="card-img" :style="imageStyle">
17
+ <snake-image
18
+ :src="imageFilter(item)"
19
+ :loading-img="assets.goodsLoading || ''"
20
+ :error-img="assets.goodsError || ''"
21
+ mode="aspectFill"
22
+ width="100%"
23
+ height="100%"
24
+ lazy-load
25
+ ></snake-image>
26
+
27
+ <!-- 直购已出售蒙层 -->
28
+ <template v-if="listType === 'sale' || listType === 'new'">
29
+ <view
30
+ class="mantle"
31
+ v-if="(item.channelStatus === 'off' || item.amount <= 0) && listType === 'sale'"
32
+ >
33
+ <image v-if="assets.goodsSoldOut" class="mantle__image" :src="assets.goodsSoldOut" />
34
+ </view>
35
+ <view v-if="item.newestTime && item.status === 'selling'" class="dailyNew-time">
36
+ {{ item.newestTime }}上新
37
+ </view>
38
+ </template>
39
+
40
+ <!-- 验货标签 -->
41
+ <view style="position: absolute; top: 20rpx; left: 20rpx" v-if="item.saleType === 'send'">
42
+ <image
43
+ v-if="assets.goodsInspection"
44
+ style="width: 80rpx; height: 24rpx"
45
+ :src="assets.goodsInspection"
46
+ mode="widthFix"
47
+ />
48
+ </view>
49
+
50
+ <!-- 拍卖已出售蒙层 -->
51
+ <template v-if="listType === 'auction'">
52
+ <view
53
+ v-if="
54
+ (item.channelStatus === 'off' || item.amount <= 0) &&
55
+ item.activityInfo &&
56
+ item.activityInfo.status === 'init' &&
57
+ item.activityInfo.startTime < Date.now()
58
+ "
59
+ class="mantle"
60
+ >
61
+ <image v-if="assets.goodsSoldOut" class="mantle__image" :src="assets.goodsSoldOut" />
62
+ </view>
63
+
64
+ <!-- 标签 -->
65
+ <view class="auction-tag">
66
+ <view class="image-warp">
67
+ <!-- 新人标签 -->
68
+ <template v-if="item.tag">
69
+ <image
70
+ v-if="assets.goodsNewcomer"
71
+ class="new-image"
72
+ :src="assets.goodsNewcomer"
73
+ />
74
+ <view class="tag-text">{{ item.tag.title }}</view>
75
+ </template>
76
+ <!-- 出价标签 -->
77
+ <template
78
+ v-if="item.activityInfo && item.activityInfo.attendance && attendanceShow"
79
+ >
80
+ <image
81
+ v-if="assets.goodsPopular"
82
+ class="hot-image"
83
+ :src="assets.goodsPopular"
84
+ />
85
+ <view class="tag-text">{{ item.activityInfo.attendance }}人出价中</view>
86
+ </template>
87
+ </view>
88
+ </view>
89
+ <!-- 出价价格 -->
90
+ <view
91
+ v-if="item.activityInfo && item.activityInfo.myRank"
92
+ class="auction__tips"
93
+ :style="tipsStyle(item)"
94
+ >
95
+ <text class="price">{{ item.activityInfo.myRank }}</text>
96
+ </view>
97
+ </template>
98
+ </view>
99
+
100
+ <!-- 内容 -->
101
+ <view class="goods-content">
102
+ <template v-if="listType === 'sale' || listType === 'new'">
103
+ <view class="goods-name line-clamp-2">{{ item.name || item.goodsName }}</view>
104
+
105
+ <view class="goods-desc">
106
+ <view class="price" v-if="isShowPice(item)">
107
+ {{ item.price || item.discountPrice || item.jokerPrice || item.salePrice || 0 }}
108
+ </view>
109
+
110
+ <view class="size" v-if="item.size">
111
+ <view class="line-clamp-1" style="max-width: 100rpx">{{ item.size }}</view>
112
+ <view
113
+ v-if="item.gradeName || item.grade"
114
+ class="line-clamp-1"
115
+ style="max-width: 90rpx"
116
+ >
117
+ · {{ item.gradeName || item.grade }}
118
+ </view>
119
+ </view>
120
+ <view v-if="item.type == 'deep' && item.amount" class="stock">
121
+ 库存 {{ item.amount > 99 ? '99+' : item.amount }}
122
+ </view>
123
+ </view>
124
+ <!-- 标签 -->
125
+ <view class="goods-tag" v-if="listType === 'sale'">
126
+ <view
127
+ v-if="item.jokerDiscount"
128
+ class="item-tags"
129
+ style="background: #26273a; border: none"
130
+ >
131
+ <text
132
+ style="
133
+ font-size: 20rpx;
134
+ line-height: 30rpx;
135
+ color: transparent;
136
+ background: linear-gradient(90deg, #dabda8 0%, #eedacc 100%);
137
+ -webkit-background-clip: text;
138
+ "
139
+ >
140
+ {{ item.jokerDiscount || '99' }}
141
+ </text>
142
+ </view>
143
+ <view
144
+ v-if="showTag && item.activityInfo && item.activityInfo.activityTag"
145
+ class="item-tags"
146
+ >
147
+ {{ item.activityInfo.activityTag }}
148
+ </view>
149
+ <view v-if="item.savePrice" class="item-tags">省¥{{ item.savePrice }}</view>
150
+ <view v-if="showTag && item.activityTag === 'new'" class="item-tags">新人专享</view>
151
+ <view v-if="showTag && item.activityTag === 'discount'" class="item-tags"
152
+ >限时折扣</view
153
+ >
154
+ <view
155
+ v-if="item.packTag === true"
156
+ class="item-tags"
157
+ style="color: #2d57e7; background: #eaf1ff; border: 2rpx solid #2d57e7"
158
+ >
159
+ 支持打包
160
+ </view>
161
+ <view
162
+ v-if="
163
+ item.activityInfo &&
164
+ item.activityInfo.activityType === 'auction' &&
165
+ isEndTime(item)
166
+ "
167
+ class="item-tags"
168
+ style="color: #7a3bff; background: #f3eaff; border: 2rpx solid #f3eaff"
169
+ >
170
+ 捡漏
171
+ </view>
172
+ </view>
173
+ </template>
174
+ <!-- 拍卖 -->
175
+ <template v-if="listType === 'auction'">
176
+ <view class="goods-tag" style="padding-bottom: 10rpx">
177
+ <view
178
+ v-if="item.activityInfo && item.activityInfo.endTime && isEndTime(item)"
179
+ class="item-tags"
180
+ style="color: #7a3bff; background: #f3eaff; border: 2rpx solid #f3eaff"
181
+ >
182
+ 捡漏
183
+ </view>
184
+ </view>
185
+ <view class="goods-name line-clamp-2">{{ item.size }} | {{ item.name }}</view>
186
+ <view class="goods-desc">
187
+ <view class="goods-auction-price">
188
+ <view class="price">
189
+ <text>{{ (item.activityInfo && item.activityInfo.startPrice) || 0 }}</text>
190
+ <text class="text">起报</text>
191
+ </view>
192
+ <text v-if="listType === 'offer'" class="offer__price">¥1200最高还价</text>
193
+ </view>
194
+ <view
195
+ class="auction__btn"
196
+ hover-class="u-hover-class"
197
+ :style="btnBgStyle(item)"
198
+ @click.stop="$emit('handlerOffer', item, index)"
199
+ >
200
+ {{
201
+ item.activityInfo &&
202
+ item.activityInfo.status === 'init' &&
203
+ item.activityInfo.startTime > Date.now()
204
+ ? '未开始'
205
+ : item.activityInfo && item.activityInfo.myPrice
206
+ ? '修改报价'
207
+ : '参与报价'
208
+ }}
209
+ </view>
210
+ </view>
211
+ </template>
212
+ </view>
213
+ </view>
214
+ </block>
215
+ </view>
216
+ </scroll-view>
217
+ <view v-else class="goods-list" :style="listStyle">
218
+ <block v-for="(item, index) in goodsList" :key="item.id">
219
+ <view
220
+ class="item"
221
+ :style="[itemStyle]"
222
+ role="link"
223
+ tabindex="0"
224
+ :aria-label="`查看商品:${item.name || item.goodsName || item.id || index + 1}`"
225
+ @click.stop="$emit('item-click', item, index)"
226
+ @keydown.enter.prevent="$emit('item-click', item, index)"
227
+ @keydown.space.prevent="$emit('item-click', item, index)"
228
+ >
229
+ <!-- 图片 -->
230
+ <view class="card-img" :style="imageStyle">
231
+ <snake-image
232
+ :src="imageFilter(item)"
233
+ :loading-img="assets.goodsLoading || ''"
234
+ :error-img="assets.goodsError || ''"
235
+ mode="aspectFill"
236
+ width="100%"
237
+ height="100%"
238
+ lazy-load
239
+ ></snake-image>
240
+
241
+ <!-- 直购已出售蒙层 -->
242
+ <template v-if="listType === 'sale' || listType === 'new'">
243
+ <view
244
+ class="mantle"
245
+ v-if="(item.channelStatus === 'off' || item.amount <= 0) && listType === 'sale'"
246
+ >
247
+ <image v-if="assets.goodsSoldOut" class="mantle__image" :src="assets.goodsSoldOut" />
248
+ </view>
249
+ <view v-if="item.newestTime && item.status === 'selling'" class="dailyNew-time">
250
+ {{ item.newestTime }}上新
251
+ </view>
252
+ </template>
253
+
254
+ <!-- 验货标签 -->
255
+ <view style="position: absolute; top: 20rpx; left: 20rpx" v-if="item.saleType === 'send'">
256
+ <image
257
+ v-if="assets.goodsInspection"
258
+ style="width: 80rpx; height: 24rpx"
259
+ :src="assets.goodsInspection"
260
+ mode="widthFix"
261
+ />
262
+ </view>
263
+
264
+ <!-- 拍卖已出售蒙层 -->
265
+ <template v-if="listType === 'auction'">
266
+ <view
267
+ v-if="
268
+ (item.channelStatus === 'off' || item.amount <= 0) &&
269
+ item.activityInfo &&
270
+ item.activityInfo.status === 'init' &&
271
+ item.activityInfo.startTime < Date.now()
272
+ "
273
+ class="mantle"
274
+ >
275
+ <image v-if="assets.goodsSoldOut" class="mantle__image" :src="assets.goodsSoldOut" />
276
+ </view>
277
+
278
+ <!-- 标签 -->
279
+ <view class="auction-tag">
280
+ <view class="image-warp">
281
+ <!-- 新人标签 -->
282
+ <template v-if="item.tag">
283
+ <image v-if="assets.goodsNewcomer" class="new-image" :src="assets.goodsNewcomer" />
284
+ <view class="tag-text">{{ item.tag.title }}</view>
285
+ </template>
286
+ <!-- 出价标签 -->
287
+ <template v-if="item.activityInfo && item.activityInfo.attendance && attendanceShow">
288
+ <image v-if="assets.goodsPopular" class="hot-image" :src="assets.goodsPopular" />
289
+ <view class="tag-text">{{ item.activityInfo.attendance }}人出价中</view>
290
+ </template>
291
+ </view>
292
+ </view>
293
+ <!-- 出价价格 -->
294
+ <view
295
+ v-if="item.activityInfo && item.activityInfo.myRank"
296
+ class="auction__tips"
297
+ :style="tipsStyle(item)"
298
+ >
299
+ <text class="price">{{ item.activityInfo.myRank }}</text>
300
+ </view>
301
+ </template>
302
+ </view>
303
+
304
+ <!-- 内容 -->
305
+ <view class="goods-content">
306
+ <template v-if="listType === 'sale' || listType === 'new'">
307
+ <view class="goods-name line-clamp-2">{{ item.name || item.goodsName }}</view>
308
+
309
+ <view class="goods-desc">
310
+ <view class="price" v-if="isShowPice(item)">
311
+ {{ item.price || item.discountPrice || item.jokerPrice || item.salePrice || 0 }}
312
+ </view>
313
+
314
+ <view class="size" v-if="item.size">
315
+ <view class="line-clamp-1" style="max-width: 100rpx">{{ item.size }}</view>
316
+ <view v-if="item.gradeName || item.grade" class="line-clamp-1" style="max-width: 90rpx">
317
+ · {{ item.gradeName || item.grade }}
318
+ </view>
319
+ </view>
320
+ <view v-if="item.type == 'deep' && item.amount" class="stock">
321
+ 库存 {{ item.amount > 99 ? '99+' : item.amount }}
322
+ </view>
323
+ </view>
324
+ <!-- 标签 -->
325
+ <view class="goods-tag" v-if="listType === 'sale'">
326
+ <view v-if="item.jokerDiscount" class="item-tags" style="background: #26273a; border: none">
327
+ <text
328
+ style="
329
+ font-size: 20rpx;
330
+ line-height: 30rpx;
331
+ color: transparent;
332
+ background: linear-gradient(90deg, #dabda8 0%, #eedacc 100%);
333
+ -webkit-background-clip: text;
334
+ "
335
+ >
336
+ {{ item.jokerDiscount || '99' }}
337
+ </text>
338
+ </view>
339
+ <view
340
+ v-if="showTag && item.activityInfo && item.activityInfo.activityTag"
341
+ class="item-tags"
342
+ >
343
+ {{ item.activityInfo.activityTag }}
344
+ </view>
345
+ <view v-if="item.savePrice" class="item-tags">省¥{{ item.savePrice }}</view>
346
+ <view v-if="showTag && item.activityTag === 'new'" class="item-tags">新人专享</view>
347
+ <view v-if="showTag && item.activityTag === 'discount'" class="item-tags">限时折扣</view>
348
+ <view
349
+ v-if="item.packTag === true"
350
+ class="item-tags"
351
+ style="color: #2d57e7; background: #eaf1ff; border: 2rpx solid #2d57e7"
352
+ >
353
+ 支持打包
354
+ </view>
355
+ <view
356
+ v-if="
357
+ item.activityInfo && item.activityInfo.activityType === 'auction' && isEndTime(item)
358
+ "
359
+ class="item-tags"
360
+ style="color: #7a3bff; background: #f3eaff; border: 2rpx solid #f3eaff"
361
+ >
362
+ 捡漏
363
+ </view>
364
+ </view>
365
+ </template>
366
+ <!-- 拍卖 -->
367
+ <template v-if="listType === 'auction'">
368
+ <view class="goods-tag" style="padding-bottom: 10rpx">
369
+ <view
370
+ v-if="item.activityInfo && item.activityInfo.endTime && isEndTime(item)"
371
+ class="item-tags"
372
+ style="color: #7a3bff; background: #f3eaff; border: 2rpx solid #f3eaff"
373
+ >
374
+ 捡漏
375
+ </view>
376
+ </view>
377
+ <view class="goods-name line-clamp-2">{{ item.size }} | {{ item.name }}</view>
378
+ <view class="goods-desc">
379
+ <view class="goods-auction-price">
380
+ <view class="price">
381
+ <text>{{ (item.activityInfo && item.activityInfo.startPrice) || 0 }}</text>
382
+ <text class="text">起报</text>
383
+ </view>
384
+ <text v-if="listType === 'offer'" class="offer__price">¥1200最高还价</text>
385
+ </view>
386
+ <view
387
+ class="auction__btn"
388
+ hover-class="u-hover-class"
389
+ :style="btnBgStyle(item)"
390
+ @click.stop="$emit('handlerOffer', item, index)"
391
+ >
392
+ {{
393
+ item.activityInfo &&
394
+ item.activityInfo.status === 'init' &&
395
+ item.activityInfo.startTime > Date.now()
396
+ ? '未开始'
397
+ : item.activityInfo && item.activityInfo.myPrice
398
+ ? '修改报价'
399
+ : '参与报价'
400
+ }}
401
+ </view>
402
+ </view>
403
+ </template>
404
+ </view>
405
+ </view>
406
+ </block>
407
+ </view>
408
+ </template>
409
+
410
+ <script>
411
+ /**
412
+ * @component GoodsList
413
+ * @description 以自适应卡片网格展示直购、新品或拍卖商品,包含库存、价格、标签和出价状态。
414
+ */
415
+
416
+ export default {
417
+ name: 'GoodsList',
418
+ emits: ['item-click', 'handlerOffer'],
419
+ options: {
420
+ addGlobalClass: true,
421
+ // #ifndef MP-TOUTIAO
422
+ virtualHost: true,
423
+ // #endif
424
+ styleIsolation: 'shared'
425
+ },
426
+ props: {
427
+ goodsList: {
428
+ type: Array,
429
+ default: () => []
430
+ },
431
+ // 背景颜色
432
+ bgColor: {
433
+ type: String,
434
+ default: 'var(--snake-color-background, #f6f6f6)'
435
+ },
436
+ // 商品类型
437
+ listType: {
438
+ type: String,
439
+ default() {
440
+ return 'goods';
441
+ }
442
+ },
443
+ pageMargin: {
444
+ type: Number,
445
+ default: 10
446
+ },
447
+ imageMargin: {
448
+ type: Number,
449
+ default: 10
450
+ },
451
+ commodityType: {
452
+ type: Number,
453
+ default: 0
454
+ },
455
+ attendanceShow: {
456
+ type: Boolean,
457
+ default: true
458
+ },
459
+ assets: {
460
+ type: Object,
461
+ default: () => ({})
462
+ },
463
+ layout: { type: String, default: 'grid' },
464
+ cardRadius: { type: Number, default: 10 },
465
+ showTag: { type: Boolean, default: true }
466
+ },
467
+ data() {
468
+ return {};
469
+ },
470
+ computed: {
471
+ listStyle() {
472
+ return { padding: `15rpx ${this.pageMargin + this.imageMargin}rpx 0`, backgroundColor: this.bgColor };
473
+ },
474
+ itemStyle() {
475
+ const style = {
476
+ width:
477
+ this.layout === 'swipe'
478
+ ? '300rpx'
479
+ : `calc(${100 / (this.commodityType + 2)}% - ${this.imageMargin}rpx)`,
480
+ borderRadius: `${this.cardRadius}rpx`
481
+ };
482
+ return style;
483
+ },
484
+ imageStyle() {
485
+ return { borderRadius: `${this.cardRadius}rpx ${this.cardRadius}rpx 0 0` };
486
+ },
487
+ // 报价按钮背景颜色
488
+ btnBgStyle() {
489
+ return item => {
490
+ const style = {};
491
+ if (!item.activityInfo?.myPrice) {
492
+ style.backgroundColor = '#2d57e7';
493
+ style.color = 'var(--snake-color-white, #fff)';
494
+ }
495
+
496
+ if (item.activityInfo?.status === 'init' && item.activityInfo?.startTime > Date.now()) {
497
+ style.backgroundColor = 'var(--snake-color-surface-muted, #f6f6f6)';
498
+ style.color = 'var(--snake-color-text-muted, #acacb7)';
499
+ style.borderColor = 'var(--snake-color-border, #f6f6f6)';
500
+ }
501
+ return style;
502
+ };
503
+ },
504
+ // 出价中背景颜色
505
+ tipsStyle() {
506
+ return item => {
507
+ const style = {};
508
+ if (item.activityInfo?.myRank) {
509
+ style.backgroundColor = 'var(--snake-color-surface-muted, #e8e8e8)';
510
+ style.color = 'var(--snake-color-text-muted, #888891)';
511
+ }
512
+ return style;
513
+ };
514
+ },
515
+ isEndTime() {
516
+ return item => {
517
+ const currentTime = Date.now();
518
+ const endTime = item.activityInfo?.endTime || '';
519
+ const timeDifference = endTime - currentTime;
520
+ const twoHoursInMilliseconds = 2 * 60 * 60 * 1000; // 2小时 单位毫秒
521
+ return item.activityInfo?.attendance < 3 && timeDifference <= twoHoursInMilliseconds;
522
+ };
523
+ }
524
+ },
525
+ methods: {
526
+ isShowPice(item) {
527
+ return item?.activityInfo?.activityType !== 'pack';
528
+ },
529
+ imageFilter(item) {
530
+ const image = String(item.image || '').replace(/^http:/, 'https:');
531
+ if (image.indexOf('qiuxietang') > -1 || image.indexOf('puresnake') > -1) {
532
+ if (item.name && item.name.includes('潮服')) {
533
+ return `${image}?x-oss-process=style/ys`;
534
+ }
535
+ return `${image}?x-oss-process=style/huidi`;
536
+ }
537
+ return image;
538
+ }
539
+ }
540
+ };
541
+ </script>
542
+
543
+ <style lang="scss" scoped>
544
+ ::v-deep .u-wrap {
545
+ width: 100% !important;
546
+ background-color: var(--snake-color-surface, #fff) !important;
547
+ }
548
+
549
+ .goods-list {
550
+ display: flex;
551
+ flex-wrap: wrap;
552
+ justify-content: space-between;
553
+ padding: 20rpx 20rpx 0;
554
+ }
555
+ .goods-list-scroll {
556
+ width: 100%;
557
+ white-space: nowrap;
558
+ }
559
+ .goods-list--swipe {
560
+ display: inline-flex;
561
+ flex-wrap: nowrap;
562
+ gap: 10rpx;
563
+ min-width: 100%;
564
+ box-sizing: border-box;
565
+ }
566
+ .goods-list--swipe .item {
567
+ display: inline-block;
568
+ flex: 0 0 300rpx;
569
+ white-space: normal;
570
+ }
571
+
572
+ .item {
573
+ margin-bottom: 20rpx;
574
+ // width: calc(50% - 10rpx);
575
+ background: var(--snake-color-surface, #fff);
576
+ border-radius: 10rpx;
577
+ }
578
+
579
+ .card-img {
580
+ position: relative;
581
+ display: flex;
582
+ align-items: center;
583
+ justify-content: center;
584
+ width: 100%;
585
+ height: 345rpx;
586
+ overflow: hidden;
587
+ border-radius: 10rpx 10rpx 0 0;
588
+ }
589
+
590
+ // 已售出蒙层
591
+ .mantle {
592
+ position: absolute;
593
+ top: 0;
594
+ left: 0;
595
+ width: 100%;
596
+ height: 100%;
597
+ background-color: rgba(15, 17, 19, 0.6);
598
+
599
+ .mantle__image {
600
+ position: absolute;
601
+ top: 50%;
602
+ left: 50%;
603
+ width: 155rpx;
604
+ height: 155rpx;
605
+ transform: translate(-50%, -50%);
606
+ }
607
+ }
608
+
609
+ .dailyNew-time {
610
+ position: absolute;
611
+ bottom: 0;
612
+ left: 0;
613
+ z-index: 1;
614
+ display: flex;
615
+ align-items: center;
616
+ justify-content: center;
617
+ width: 362rpx;
618
+ height: 44rpx;
619
+ font-family: PingFangSC-Regular;
620
+ font-size: 24rpx;
621
+ background: rgba(62, 62, 66, 0.7);
622
+ }
623
+
624
+ // 标签
625
+ .auction-tag {
626
+ position: absolute;
627
+ top: 4rpx;
628
+ right: 16rpx;
629
+
630
+ .image-warp {
631
+ position: relative;
632
+
633
+ .new-image {
634
+ width: 158rpx;
635
+ height: 50rpx;
636
+ }
637
+
638
+ .hot-image {
639
+ width: 176rpx;
640
+ height: 50rpx;
641
+ }
642
+
643
+ .tag-text {
644
+ position: absolute;
645
+ top: 16rpx;
646
+ left: 60rpx;
647
+ overflow: hidden;
648
+ font-family: PingFangSC-Regular;
649
+ font-size: 20rpx;
650
+ font-weight: 400;
651
+ color: #ffffff;
652
+ white-space: nowrap;
653
+ }
654
+ }
655
+ }
656
+
657
+ .auction__tips {
658
+ position: absolute;
659
+ bottom: 0;
660
+ display: flex;
661
+ align-items: center;
662
+ justify-content: center;
663
+ width: 100%;
664
+ height: 44rpx;
665
+ font-family: PingFangSC-Regular;
666
+ font-size: 20rpx;
667
+ line-height: 44rpx;
668
+ color: var(--snake-color-text-muted, #888891);
669
+
670
+ .price {
671
+ font-weight: 700;
672
+ }
673
+
674
+ .text {
675
+ margin-left: 6rpx;
676
+ }
677
+ }
678
+
679
+ .goods-content {
680
+ display: flex;
681
+ flex-direction: column;
682
+ justify-content: space-between;
683
+ padding: 12rpx 20rpx 21rpx;
684
+ }
685
+
686
+ .goods-name {
687
+ height: 64rpx;
688
+ font-family: PingFangSC-Regular;
689
+ font-size: 24rpx;
690
+ font-weight: 400;
691
+ line-height: 32rpx;
692
+ color: var(--snake-color-text, #0f1113);
693
+ }
694
+
695
+ .goods-desc {
696
+ display: flex;
697
+ align-items: center;
698
+ justify-content: space-between;
699
+ padding-top: 26rpx;
700
+ color: var(--snake-color-text, #1f1f27);
701
+
702
+ .price {
703
+ font-family: DIN-Bold;
704
+ font-size: 38rpx;
705
+ font-weight: bold;
706
+ color: var(--snake-color-text, #26273a);
707
+
708
+ &::before {
709
+ font-size: 28rpx;
710
+ content: '¥';
711
+ }
712
+ }
713
+
714
+ .size,
715
+ .stock {
716
+ display: flex;
717
+ align-items: center;
718
+ justify-content: flex-end;
719
+ font-family: PingFangSC-Regular;
720
+ font-size: 20rpx;
721
+ font-weight: 400;
722
+ color: var(--snake-color-text-secondary, #646471);
723
+ }
724
+
725
+ .goods-auction-price {
726
+ display: flex;
727
+ flex-direction: column;
728
+
729
+ .price {
730
+ font-family: Arial-BoldMT;
731
+ font-size: 36rpx;
732
+ font-weight: bold;
733
+ color: var(--snake-color-text, #1f1f27);
734
+
735
+ &::before {
736
+ font-size: 24rpx;
737
+ content: '¥';
738
+ }
739
+ }
740
+
741
+ .text {
742
+ margin-left: 2rpx;
743
+ font-family: PingFangSC-Light;
744
+ font-size: 22rpx;
745
+ font-weight: 300;
746
+ color: var(--snake-color-text-secondary, #646471);
747
+ }
748
+
749
+ .offer__price {
750
+ font-size: 24rpx;
751
+ font-weight: 400;
752
+ color: var(--snake-color-text-secondary, #646471);
753
+ }
754
+ }
755
+ }
756
+
757
+ .auction__btn {
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ width: 128rpx;
762
+ height: 44rpx;
763
+ font-family: PingFangSC-Medium;
764
+ font-size: 26rpx;
765
+ font-weight: 500;
766
+ color: #2d57e7;
767
+ text-align: center;
768
+ // line-height: 44rpx;
769
+ border: 2rpx solid #2d57e7;
770
+ border-radius: 2rpx;
771
+ }
772
+
773
+ .goods-tag {
774
+ display: flex;
775
+ align-items: center;
776
+ margin-top: 8rpx;
777
+
778
+ .item-tags {
779
+ display: flex;
780
+ align-items: center;
781
+ height: 32rpx;
782
+ padding: 0 8rpx;
783
+ margin-right: 8rpx;
784
+ font-size: 20rpx;
785
+ color: var(--snake-color-error, #fd5b5b);
786
+ white-space: nowrap;
787
+ background: transparent;
788
+ border: 2rpx solid var(--snake-color-error, #fd5b5b);
789
+ border-radius: 2rpx;
790
+ }
791
+ }
792
+ </style>