jufubao-base 1.0.290-beta2 → 1.0.290

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 (30) hide show
  1. package/package.json +1 -1
  2. package/src/components/CusCouponChose/CusCouponChose.vue +1027 -0
  3. package/src/components/CusCouponItem/CusCouponItem.vue +298 -0
  4. package/src/components/CusEnter/CusEnter.vue +360 -0
  5. package/src/components/CusPoster/CusPoster.vue +212 -0
  6. package/src/components/CusPoster/CusSwiperDot.vue +234 -0
  7. package/src/components/CusProduct/CusProduct.vue +372 -0
  8. package/src/components/CusShops/CusShops.vue +518 -0
  9. package/src/components/CusSwiperDot/CusSwiperDot.vue +234 -0
  10. package/src/components/CusTab/CusTab.vue +411 -0
  11. package/src/components/CusVideo/CusVideo.vue +170 -0
  12. package/src/components/JfbBaseFooter/Attr.js +10 -155
  13. package/src/components/JfbBaseFooter/JfbBaseFooter.vue +98 -44
  14. package/src/components/JfbBaseFooter/XdFooterBar.vue +324 -0
  15. package/src/components/JfbBaseFooter/cusAttr/advanced.js +12 -0
  16. package/src/components/JfbBaseFooter/cusAttr/content.js +475 -0
  17. package/src/components/JfbBaseFooter/cusAttr/style.js +7 -0
  18. package/src/components/JfbBaseFooter/cusAttr/tools.js +17 -0
  19. package/src/components/JfbBaseSavingDetail/JfbBaseSavingDetail.vue +2 -14
  20. package/src/components/JfbBaseTfkSearch/Api.js +15 -0
  21. package/src/components/JfbBaseTfkSearch/CustomList.vue +10 -0
  22. package/src/components/JfbBaseTfkSearch/JfbBaseTfkSearch.vue +255 -7
  23. package/src/components/JfbBaseTfkSearch/XdQueryFilter.vue +347 -0
  24. package/src/components/JfbBaseTfkSearch/XdQuerySort.vue +192 -0
  25. package/src/components/JfbBaseTfkSearch/listMixins.js +8 -6
  26. package/src/components/JfbBaseUserInfo/Attr.js +12 -0
  27. package/src/components/JfbBaseUserInfo/JfbBaseUserInfo.vue +8 -2
  28. package/src/mixins/componentsMixins.js +363 -55
  29. package/src/mixins/posterMixins.js +27 -199
  30. package/src/mixins/productCompMixins.js +252 -0
@@ -0,0 +1,212 @@
1
+ <template>
2
+ <view
3
+ class="list-poster"
4
+ v-if="posterList !== null && posterList.length > 0"
5
+ >
6
+ <view
7
+ :style="{width: '100%', height: styleObj.posterSize.height + 'rpx' }"
8
+ class="list-poster-one"
9
+ v-if="posterList.length === 1"
10
+ >
11
+ <image
12
+ @click.stop="handlePosterClick(posterList[0],0)"
13
+ :style="{width: '100%', height: styleObj.posterSize.height + 'rpx' }"
14
+ :src="posterList[0].image_url"
15
+ :alt="posterList[0].content_name"
16
+ ></image>
17
+ </view>
18
+
19
+ <view class="list-poster-more" v-else>
20
+ <cus-swiper-dot
21
+ :style="{width:'100%', height: styleObj.posterSize.height + 'rpx' }"
22
+ :current="current"
23
+ :info="posterList"
24
+ field="content_name"
25
+ :mode="mode"
26
+ :dots-styles="dotStyleData"
27
+ >
28
+ <swiper
29
+ class="swiper xd-swiper-content"
30
+ :style="{width: '100%', height: styleObj.posterSize.height + 'rpx' }"
31
+ :indicator-dots="false"
32
+ :autoplay="styleObj.carouselTime >0"
33
+ :interval="styleObj.carouselTime"
34
+ :duration="500"
35
+ :current="current"
36
+ circular
37
+ @animationfinish="handleAnimationFinish"
38
+ @change="handleChange"
39
+ >
40
+ <swiper-item v-for="(item,index) in posterList" :key="index" @click.stop="handlePosterClick(item,index)">
41
+ <image
42
+ :style="{width: '100%', height: styleObj.posterSize.height + 'rpx' }"
43
+ :src="item['image_url']"
44
+ ></image>
45
+ </swiper-item>
46
+ </swiper>
47
+ </cus-swiper-dot>
48
+ </view>
49
+ </view>
50
+ </template>
51
+
52
+ <script>
53
+
54
+ import CusSwiperDot from "@/components/CusSwiperDot/CusSwiperDot.vue";
55
+ import Color from "color";
56
+
57
+ export default {
58
+ name: "CusPoster",
59
+ components: {
60
+ CusSwiperDot
61
+ },
62
+ props:{
63
+ styleObj:{
64
+ type: Object,
65
+ default(){
66
+ return {}
67
+ }
68
+ },
69
+ posterList:{
70
+ type: Array|null,
71
+ default: null
72
+ },
73
+ mode:{
74
+ type: String,
75
+ default:''
76
+ },
77
+ mainColor:{
78
+ type:String,
79
+ required: true
80
+ }
81
+ },
82
+
83
+ computed:{
84
+ dotStyleData(){
85
+ return this.dotStyleDataConf()[this.mode];
86
+ }
87
+ },
88
+
89
+ data(){
90
+ return {
91
+ current:0,
92
+ dotStyleDataConf(){
93
+ let alpha = 0.6;
94
+ let selectedColor = `rgba(${Color(this.mainColor).alpha(alpha).array().join(',')})`;
95
+ return {
96
+ dot: {
97
+ backgroundColor: 'rgba(166,166,166,.5)',
98
+ border: '0px rgba(166,166,166,.5) solid',
99
+ color: '#fff',
100
+ selectedBackgroundColor: selectedColor,
101
+ selectedBorder: `0px this.mainColor solid`
102
+ },
103
+ default: {
104
+ width: 16,
105
+ backgroundColor: 'rgba(200,200,200,.45)',
106
+ border: '1px rgba(200,200,200,.45) solid',
107
+ color: '#fff',
108
+ selectedBackgroundColor: selectedColor,
109
+ selectedBorder: `1px this.mainColor solid`
110
+ },
111
+ round: {
112
+ backgroundColor: 'rgba(166,166,166,.5)',
113
+ border: '0px rgba(166,166,166,.5) solid',
114
+ color: '#fff',
115
+ selectedBackgroundColor: selectedColor,
116
+ selectedBorder: `0px this.mainColor solid`
117
+ },
118
+ nav: {
119
+ backgroundColor: 'rgba(0,0,0,.5)',
120
+ border: '1px rgba(0,0,0,.5) solid',
121
+ color: '#fff',
122
+ selectedBackgroundColor: 'rgba(255, 255, 255, 1)',
123
+ selectedBorder: '1px rgba(255, 255, 255 1) solid'
124
+ },
125
+ indexes: {
126
+ backgroundColor: 'rgba(0,0,0,.5)',
127
+ border: '0px rgba(0,0,0,.5) solid',
128
+ color: '#aaa',
129
+ selectedBackgroundColor: 'rgba(0,0,0,.8)',
130
+ selectedBorder: '0px rgba(0,0,0,.8) solid',
131
+ selectedColor: '#fff',
132
+ }
133
+ }
134
+ },
135
+ }
136
+ },
137
+ methods:{
138
+ handlePosterClick(item,index){
139
+ if(!item.redirect_data) {
140
+ console.warn(`未配置链接地址: ${item.redirect_data}`);
141
+ console.error(`未配置链接地址: ${item.redirect_data}`);
142
+ return
143
+ }
144
+
145
+ //内部链接跳转地址
146
+ if (item.redirect_type === 'INN') {
147
+ try {
148
+ let url = JSON.parse(item.redirect_data);
149
+ let params = '';
150
+ if(url.page) {
151
+ if (item['redirect_params']) params = `?${item['redirect_params']}`;
152
+ this.$xdUniHelper.navigateTo({url: url.page + params})
153
+ }
154
+ else {
155
+ console.error(`应用链接配置错误: ${url.page}`)
156
+ }
157
+ } catch (e) {
158
+ console.error(`应用链接配置错误: ${item.redirect_data}`)
159
+ }
160
+ }
161
+
162
+ //外部链接
163
+ if (item.redirect_type === 'URL') {
164
+ let reg = /^(http:\/\/|https:\/\/|\/\/)+.+$/;
165
+ let spReg = /(-apiuri\/v)/;
166
+ //#ifdef MP-WEIXIN
167
+ try {
168
+ let url = JSON.parse(item.redirect_data);
169
+ if (reg.test(url.url) || spReg.test(url.url)) {
170
+ console.warn(`广告跳转外站: ${url.url}`)
171
+ this.$xdUniHelper.navigateTo(url);
172
+ } else {
173
+ console.error(`广告跳转外站配置错误: ${url.url}`)
174
+ }
175
+ } catch (e) {
176
+ console.error(`广告跳转外站配置错误: ${item.redirect_data}`)
177
+ }
178
+ //#endif
179
+ //#ifdef H5
180
+ try {
181
+ let url = JSON.parse(item.redirect_data);
182
+ console.warn(`广告跳转外站: ${url.url}`);
183
+ this.$xdUniHelper.redirectTo(url, false)
184
+ } catch (e) {
185
+ console.error(`广告跳转外站配置错误: ${item.redirect_data}`)
186
+ }
187
+ //#endif
188
+
189
+ }
190
+
191
+ //无跳转地址
192
+ if(item.redirect_type === 'EMP') {
193
+ console.warn(`无跳转地址`);
194
+ }
195
+ },
196
+
197
+ handleChange(e){
198
+ this.current = e.detail.current;
199
+ },
200
+
201
+ handleAnimationFinish(e){
202
+ //this.current = e.detail.current;
203
+ },
204
+ }
205
+ }
206
+
207
+ </script>
208
+
209
+
210
+ <style scoped lang="less">
211
+
212
+ </style>
@@ -0,0 +1,234 @@
1
+ <template>
2
+ <view class="uni-swiper__warp">
3
+ <slot />
4
+ <view v-if="mode === 'default'" :style="{'bottom':dots.bottom + 'px'}" class="uni-swiper__dots-box" key='default'>
5
+ <view v-for="(item,index) in info" @click="clickItem(index)" :style="{
6
+ 'width': (index === current? dots.width*1.7: dots.width ) + 'px','height':dots.width*(2/5) +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border-radius':'0px'}"
7
+ :key="index" class="uni-swiper__dots-item uni-swiper__dots-bar" />
8
+ </view>
9
+ <view v-if="mode === 'dot'" :style="{'bottom':dots.bottom + 'px'}" class="uni-swiper__dots-box" key='dot'>
10
+ <view v-for="(item,index) in info" @click="clickItem(index)" :style="{
11
+ 'width': dots.width + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
12
+ :key="index" class="uni-swiper__dots-item" />
13
+ </view>
14
+ <view v-if="mode === 'round'" :style="{'bottom':dots.bottom + 'px'}" class="uni-swiper__dots-box" key='round'>
15
+ <view v-for="(item,index) in info" @click="clickItem(index)" :class="[index === current&&'uni-swiper__dots-long']" :style="{
16
+ 'width':(index === current? dots.width*3:dots.width ) + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
17
+ :key="index" class="uni-swiper__dots-item " />
18
+ </view>
19
+ <view v-if="mode === 'nav'" key='nav' :style="{'background-color':dotsStyles.backgroundColor,'bottom':'0'}" class="uni-swiper__dots-box uni-swiper__dots-nav">
20
+ <text :style="{'color':dotsStyles.color}" class="uni-swiper__dots-nav-item">{{ (current+1)+"/"+info.length }}</text>
21
+ </view>
22
+ <view v-if="mode === 'indexes'" key='indexes' :style="{'bottom':dots.bottom + 'px'}" class="uni-swiper__dots-box">
23
+ <view v-for="(item,index) in info" @click="clickItem(index)" :style="{
24
+ 'width':dots.width + 'rpx','height':dots.height +'rpx' ,'color':index === current?dots.selectedColor:dots.color,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
25
+ :key="index" class="uni-swiper__dots-item uni-swiper__dots-indexes"><text class="uni-swiper__dots-indexes-text">{{ index+1 }}</text></view>
26
+ </view>
27
+ </view>
28
+ </template>
29
+
30
+ <script>
31
+
32
+ /**
33
+ * XdSwiperDot 轮播图指示点
34
+ * @description 自定义轮播图指示点
35
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=284
36
+ * @property {Number} current 当前指示点索引,必须是通过 `swiper` 的 `change` 事件获取到的 `e.detail.current`
37
+ * @property {String} mode = [default|round|nav|indexes] 指示点的类型
38
+ * @value defualt 默认指示点
39
+ * @value round 圆形指示点
40
+ * @value nav 条形指示点
41
+ * @value indexes 索引指示点
42
+ * @property {String} field mode 为 nav 时,显示的内容字段(mode = nav 时必填)
43
+ * @property {String} info 轮播图的数据,通过数组长度决定指示点个数
44
+ * @property {Object} dotsStyles 指示点样式
45
+ * @event {Function} clickItem 组件触发点击事件时触发,e={currentIndex}
46
+ */
47
+
48
+ export default {
49
+ name: 'XdSwiperDot',
50
+ emits:['clickItem'],
51
+ props: {
52
+ info: {
53
+ type: Array,
54
+ default () {
55
+ return []
56
+ }
57
+ },
58
+ current: {
59
+ type: Number,
60
+ default: 0
61
+ },
62
+ dotsStyles: {
63
+ type: Object,
64
+ default () {
65
+ return {}
66
+ }
67
+ },
68
+ // 类型 :default(默认) indexes long nav
69
+ mode: {
70
+ type: String,
71
+ default: 'default'
72
+ },
73
+ // 只在 nav 模式下生效,变量名称
74
+ field: {
75
+ type: String,
76
+ default: ''
77
+ }
78
+ },
79
+ data() {
80
+ return {
81
+ dotsSource: {
82
+ width: 8,
83
+ height: 8,
84
+ bottom: 7,
85
+ color: '#fff',
86
+ backgroundColor: 'rgba(0, 0, 0, .3)',
87
+ border: '1px rgba(0, 0, 0, .3) solid',
88
+ selectedBackgroundColor: '#333',
89
+ selectedBorder: '1px rgba(0, 0, 0, .9) solid'
90
+ },
91
+ dots: { }
92
+ }
93
+ },
94
+ watch: {
95
+ dotsStyles(newVal) {
96
+ this.init(newVal)
97
+ },
98
+ mode() {
99
+ this.init(this.dotsStyles)
100
+ }
101
+
102
+ },
103
+ created() {
104
+ this.init(this.dotsStyles)
105
+ },
106
+ methods: {
107
+ clickItem(index) {
108
+ this.$emit('clickItem', index)
109
+ },
110
+
111
+ init(value){
112
+ let dot = {};
113
+ if (this.mode === 'indexes') {
114
+ dot = {
115
+ width: 34,
116
+ height: 34,
117
+ }
118
+ }
119
+ this.dots = Object.assign(
120
+ JSON.parse(JSON.stringify(this.dotsSource)),
121
+ JSON.parse(JSON.stringify(value)),
122
+ dot
123
+ )
124
+ }
125
+
126
+ }
127
+ }
128
+ </script>
129
+
130
+ <style lang="scss" scoped>
131
+ .uni-swiper__warp {
132
+ /* #ifndef APP-NVUE */
133
+ display: flex;
134
+ /* #endif */
135
+ flex: 1;
136
+ flex-direction: column;
137
+ position: relative;
138
+ overflow: hidden;
139
+ }
140
+
141
+ .uni-swiper__dots-box {
142
+ position: absolute;
143
+ bottom: 10px;
144
+ left: 0;
145
+ right: 0;
146
+ /* #ifndef APP-NVUE */
147
+ display: flex;
148
+ /* #endif */
149
+ flex: 1;
150
+ flex-direction: row;
151
+ justify-content: center;
152
+ align-items: center;
153
+ }
154
+
155
+ .uni-swiper__dots-item {
156
+ width: 8px;
157
+ border-radius: 100px;
158
+ margin-left: 6px;
159
+ background-color: $uni-bg-color-mask;
160
+ /* #ifndef APP-NVUE */
161
+ cursor: pointer;
162
+ /* #endif */
163
+ /* #ifdef H5 */
164
+ // border-width: 5px 0;
165
+ // border-style: solid;
166
+ // border-color: transparent;
167
+ // background-clip: padding-box;
168
+ /* #endif */
169
+ // transition: width 0.2s linear; 不要取消注释,不然会不能变色
170
+ }
171
+
172
+ .uni-swiper__dots-item:first-child {
173
+ margin: 0;
174
+ }
175
+
176
+ .uni-swiper__dots-default {
177
+ border-radius: 100px;
178
+ }
179
+
180
+ .uni-swiper__dots-long {
181
+ border-radius: 50px;
182
+ }
183
+
184
+ .uni-swiper__dots-bar {
185
+ border-radius: 50px;
186
+ }
187
+
188
+ .uni-swiper__dots-nav {
189
+ bottom: 20rpx!important;
190
+ height: 38rpx;
191
+ line-height: 38rpx;
192
+ position: absolute;
193
+ right: 0;
194
+ left: initial;
195
+ /* #ifndef APP-NVUE */
196
+ display: flex;
197
+ /* #endif */
198
+ flex: 1;
199
+ flex-direction: row;
200
+ justify-content: flex-start;
201
+ align-items: center;
202
+ background-color: rgba(0, 0, 0, 0.5);
203
+ border-radius: 6rpx 0 0 6rpx;
204
+
205
+ & > text {
206
+ font-size: 20rpx;
207
+ padding: 0 10px!important;
208
+ margin: 0;
209
+ text-align: center;
210
+ }
211
+ }
212
+
213
+ .uni-swiper__dots-nav-item {
214
+ /* overflow: hidden;
215
+ text-overflow: ellipsis;
216
+ white-space: nowrap; */
217
+ font-size: $uni-font-size-base;
218
+ color: #fff;
219
+ margin: 0 15px;
220
+ }
221
+
222
+ .uni-swiper__dots-indexes {
223
+ /* #ifndef APP-NVUE */
224
+ display: flex;
225
+ /* #endif */
226
+ // flex: 1;
227
+ justify-content: center;
228
+ align-items: center;
229
+ }
230
+
231
+ .uni-swiper__dots-indexes-text {
232
+ font-size: $uni-font-size-sm;
233
+ }
234
+ </style>