askbot-dragon 1.0.13 → 1.0.14

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 (77) hide show
  1. package/README.md +27 -27
  2. package/babel.config.js +6 -6
  3. package/dragon.iml +7 -7
  4. package/package.json +56 -56
  5. package/public/index.html +43 -43
  6. package/src/App.vue +31 -31
  7. package/src/api/index.js +1 -1
  8. package/src/api/mock.http +2 -2
  9. package/src/api/requestUrl.js +185 -185
  10. package/src/assets/js/AliyunlssUtil.js +92 -92
  11. package/src/assets/js/Base64Util.js +22 -22
  12. package/src/assets/js/script.js +36 -36
  13. package/src/assets/less/common.css +6773 -6773
  14. package/src/assets/less/converSationContainer/common.less +191 -191
  15. package/src/assets/less/converSationContainer/converSatonContainer.less +493 -493
  16. package/src/assets/less/iconfont.css +37 -37
  17. package/src/assets/less/ticketMessage.less +211 -211
  18. package/src/components/ActionAlertIframe.vue +112 -112
  19. package/src/components/AiGuide.vue +467 -467
  20. package/src/components/AskIFrame.vue +15 -15
  21. package/src/components/ConversationContainer.vue +4617 -4617
  22. package/src/components/FileType.vue +86 -86
  23. package/src/components/Message.vue +27 -27
  24. package/src/components/actionSatisfaction.vue +107 -107
  25. package/src/components/actionSendToBot.vue +62 -62
  26. package/src/components/answerDissatisfaction.vue +62 -62
  27. package/src/components/answerRadio.vue +76 -76
  28. package/src/components/ask-components/DissatisfactionOptions.vue +57 -57
  29. package/src/components/ask-components/Msgloading.vue +37 -37
  30. package/src/components/ask-components/SatisfactionV2.vue +15 -15
  31. package/src/components/askVideo.vue +138 -138
  32. package/src/components/assetDetails.vue +370 -370
  33. package/src/components/assetMessage.vue +228 -228
  34. package/src/components/associationIntention.vue +258 -243
  35. package/src/components/botActionSatisfactor.vue +68 -68
  36. package/src/components/chatContent.vue +513 -513
  37. package/src/components/feedBack.vue +136 -136
  38. package/src/components/fielListView.vue +346 -346
  39. package/src/components/file/AliyunOssComponents.vue +108 -108
  40. package/src/components/formTemplate.vue +3344 -3344
  41. package/src/components/loadingProcess.vue +164 -164
  42. package/src/components/message/ActionAlertIframe.vue +112 -112
  43. package/src/components/message/ShopMessage.vue +164 -164
  44. package/src/components/message/TextMessage.vue +924 -924
  45. package/src/components/message/TicketMessage.vue +177 -177
  46. package/src/components/message/swiper/index.js +4 -4
  47. package/src/components/message/swiper/ticketSwiper.vue +503 -503
  48. package/src/components/message/swiper/ticketSwiperItem.vue +61 -61
  49. package/src/components/msgLoading.vue +231 -231
  50. package/src/components/myPopup.vue +70 -70
  51. package/src/components/popup.vue +227 -227
  52. package/src/components/receiverMessagePlatform.vue +65 -65
  53. package/src/components/recommend.vue +89 -89
  54. package/src/components/selector/hOption.vue +20 -20
  55. package/src/components/selector/hSelector.vue +199 -199
  56. package/src/components/selector/hWrapper.vue +216 -216
  57. package/src/components/senderMessagePlatform.vue +50 -50
  58. package/src/components/source/BotMessage.vue +24 -24
  59. package/src/components/source/CustomMessage.vue +24 -24
  60. package/src/components/test.vue +260 -260
  61. package/src/components/tree.vue +247 -247
  62. package/src/components/utils/AliyunIssUtil.js +72 -72
  63. package/src/components/utils/ckeditor.js +155 -155
  64. package/src/components/utils/ckeditorImageUpload/command.js +109 -109
  65. package/src/components/utils/ckeditorImageUpload/editing.js +11 -11
  66. package/src/components/utils/ckeditorImageUpload/plugin-image.js +11 -11
  67. package/src/components/utils/ckeditorImageUpload/toolbar-ui.js +40 -40
  68. package/src/components/utils/ckeditorfileUpload/common.js +111 -111
  69. package/src/components/utils/ckeditorfileUpload/editing.js +11 -11
  70. package/src/components/utils/ckeditorfileUpload/plugin_file.js +11 -11
  71. package/src/components/utils/ckeditorfileUpload/toolbar_ui.js +34 -34
  72. package/src/components/utils/format_date.js +25 -25
  73. package/src/components/utils/index.js +6 -6
  74. package/src/components/utils/math_utils.js +29 -29
  75. package/src/components/voiceComponent.vue +119 -119
  76. package/src/main.js +60 -60
  77. package/vue.config.js +47 -47
@@ -1,503 +1,503 @@
1
- <template>
2
- <div id="pnm_swiper">
3
- <div
4
- class="swiper"
5
- @touchstart="touchStart"
6
- @touchmove="touchMove"
7
- @touchend="touchEnd"
8
-
9
- >
10
- <slot></slot>
11
- </div>
12
- <div v-if="device==='PC'&&content.multiple===true" class="clickBtn">
13
- <div class="preBtn" @click="preClick" style="display: flex">
14
- <i class="el-icon-arrow-left" style="font-size: 18px;font-weight:800;align-self: center;margin: auto"></i>
15
- </div>
16
- <div class="nextBtn" @click="nextClick" style="display: flex">
17
- <i class="el-icon-arrow-right" style="font-size: 18px;font-weight:800;align-self: center;margin: auto" ></i>
18
- </div>
19
- </div>
20
- <div class="bullet" :class="{isPhoneClass:isPhone===true,isPcClass:isPc===true,isAndroidClass:isAndroid===true,isIosClass:isIos===true}">
21
- <div
22
- class="bullet_item"
23
- v-show="slideCount > 1&&content.multiple===true"
24
- v-for="(item, slideIndex) in slideCount"
25
- :class="setBulletActive(slideIndex)"
26
- :key="slideIndex"
27
- ></div>
28
- </div>
29
- </div>
30
-
31
- </template>
32
- <script>
33
- export default {
34
- data() {
35
- return {
36
- currIndex: 1,
37
- swiperStyle: {}, //swiper样式
38
- slideWidth: null, //一张slide的宽度
39
- moveTimer: null,
40
- startPos: 0,
41
- distance: 0,
42
- slideCount: 0,
43
- device:'',
44
- IsmouseOver:false,
45
- IsShowArrowHead:false,
46
- isPhone:false,
47
- isPc:false,
48
- isAndroid:false,
49
- isIos:false,
50
- startX:'',
51
- startY:'',
52
- startTime:''
53
-
54
-
55
- };
56
- },
57
- props: {
58
- moveRatio: {
59
- type: Number,
60
- default: 0.2
61
- },
62
- animDuration: {
63
- type: Number,
64
- default: 300
65
- },
66
- content:{
67
- type:Object,
68
- default(){
69
- return {}
70
- }
71
- },
72
- type:String
73
- },
74
- mounted() {
75
- this.slideOn();
76
- this.isIosOrIsAndroid()
77
-
78
- },
79
- methods: {
80
- // 0. 启动函数
81
-
82
- slideOn() {
83
- this.initDom();
84
- let swiperEls = this.$el;
85
- var touchElement = {};
86
- swiperEls.addEventListener('touchstart',function (e) {
87
- touchElement.startX = e.touches[0].clientX;
88
- touchElement.startY = e.touches[0].clientY;
89
- if (this.slideCount > 1) {
90
- clearInterval(this.moveTimer);
91
- this.startPos = e.touches[0].pageX;
92
- }
93
- })
94
- swiperEls.addEventListener('touchmove',function (e) {
95
- var deltaX = e.touches[0].clientX - touchElement.startX;
96
- var deltaY = e.touches[0].clientY - touchElement.startY;
97
- if (Math.abs(Math.asin(deltaY/deltaX)) <= 15/180*Math.PI && e.cancelable) {
98
- e.preventDefault();
99
- }
100
- if (this.slideCount > 1) {
101
- let movePos = e.touches[0].pageX;
102
- this.distance = movePos - this.startPos;
103
- let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
104
- this.setTransform(moveDistance);
105
- }
106
- })
107
- swiperEls.addEventListener('touchend',function (e) {
108
- if(e.cancelable)
109
- {
110
- e.preventDefault()
111
- }
112
- if (this.slideCount > 1) {
113
- let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
114
- if (this.distance == 0) {
115
- return;
116
- } else if (
117
- this.distance > 0 &&
118
- _Dis > this.slideWidth * this.moveRatio
119
- ) {
120
- this.currIndex--;
121
- console.debug(this.currIndex)
122
- } else if (
123
- this.distance < 0 &&
124
- _Dis > this.slideWidth * this.moveRatio
125
- ) {
126
- this.currIndex++;
127
- }
128
- //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
129
- this.scrollCheck();
130
- //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
131
- /*this.moveAuto();*/
132
- }
133
-
134
-
135
-
136
- })
137
-
138
- },
139
-
140
- // 1. 初始化DOM,并获取必要的数据
141
- initDom() {
142
- this.isMobile()
143
- let swiperEls = this.$el;
144
- console.debug('swiperEls',swiperEls);
145
- let swiperEl=swiperEls.querySelector('.swiper')
146
-
147
- let slides = swiperEl.querySelectorAll(".slide");
148
- this.swiperStyle = swiperEl.style;
149
- this.slideCount = slides.length;
150
- this.slideWidth = swiperEl.offsetWidth;
151
-
152
-
153
- if (this.slideCount > 1) {
154
- let firstSlide = slides[0].cloneNode(true);
155
- let lastSlide = slides[this.slideCount - 1].cloneNode(true);
156
- swiperEl.appendChild(firstSlide);
157
- swiperEl.insertBefore(lastSlide, slides[0]);
158
- //设置开头位置
159
- this.setTransform(-this.slideWidth);
160
- }
161
- console.debug(swiperEl)
162
-
163
- },
164
-
165
- // 2. 自动滚动
166
- /* moveAuto() {
167
- this.moveTimer = setInterval(() => {
168
- this.currIndex++;
169
- //每次滚动都需要先进行检测,真正滚动也会在检测里完成
170
- this.scrollCheck();
171
- }, 1000);
172
- },*/
173
-
174
- // 3. 滚动检测(检测是第一张还是最后一张,让其回滚到正确的位置)
175
- scrollCheck() {
176
- // 开启过渡动画并开始滚动
177
- this.swiperStyle.transition = "transform " + this.animDuration + "ms";
178
- this.setTransform(-this.currIndex * this.slideWidth);
179
-
180
- //设置一个定时器,等过渡动画结束后执行(判断所处位置是第几张)
181
- setTimeout(() => {
182
- this.swiperStyle.transition = "0ms";
183
- //判断第一张,和最后一张
184
- if (this.currIndex <= 0) {
185
- this.currIndex = this.slideCount;
186
- this.setTransform(-this.currIndex * this.slideWidth);
187
- } else if (this.currIndex >= this.slideCount + 1) {
188
- this.currIndex = 1;
189
- this.setTransform(-this.slideWidth);
190
- }
191
- }, this.animDuration);
192
- },
193
-
194
- //设置swiper的transform的滚动距离
195
- setTransform(pos) {
196
- this.swiperStyle.transform = `translateX(${pos}px)`;
197
- },
198
-
199
- //重置子弹的active
200
- setBulletActive(index) {
201
- if (this.currIndex >= this.slideCount + 1) {
202
- //最后一张的情况
203
- return { active: index == 0 };
204
- } else if (this.currIndex <= 0) {
205
- //第0张的情况
206
- return { active: index == this.slideCount - 1 };
207
- } else {
208
- //一般情况
209
- return { active: index == this.currIndex - 1 };
210
- }
211
-
212
- },
213
-
214
- /*
215
- 触屏事件
216
- */
217
-
218
- touchStart(e) {
219
- // 记录下触发的坐标和时间
220
- this.startTime = (new Date()).getTime();
221
- this.startX = e.targetTouches[0].clientX;
222
- this.startY = e.targetTouches[0].clientY;
223
- if (this.slideCount > 1) {
224
- clearInterval(this.moveTimer);
225
- this.startPos = e.touches[0].pageX;
226
- }
227
- },
228
- touchMove(e) {
229
- if (this.slideCount > 1) {
230
- let movePos = e.touches[0].pageX;
231
- this.distance = movePos - this.startPos;
232
- let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
233
- this.setTransform(moveDistance);
234
- this.$emit('touchMove',e)
235
- }
236
- },
237
- touchEnd(e) {
238
- if(e.cancelable)
239
- {
240
- e.preventDefault()
241
- }
242
- var now = (new Date()).getTime();
243
- // 小于300ms可以识别为点击事件的范围 然后判断触摸点的移动距离
244
- if (now - this.startTime < 300) {
245
- var x = (Math.abs(this.startX - e.changedTouches[0].clientX) < 30);
246
- var y = (Math.abs(this.startY - e.changedTouches[0].clientY) < 30);
247
- if (x && y) {
248
- e.changedTouches[0].target.click();
249
- }
250
- else {
251
-
252
- if (this.slideCount > 1) {
253
- let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
254
- if (this.distance == 0) {
255
- return;
256
- } else if (
257
- this.distance > 0 &&
258
- _Dis > this.slideWidth * this.moveRatio
259
- ) {
260
- this.currIndex--;
261
- } else if (
262
- this.distance < 0 &&
263
- _Dis > this.slideWidth * this.moveRatio
264
- ) {
265
- this.currIndex++;
266
- }
267
- //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
268
- this.scrollCheck();
269
- //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
270
- /*this.moveAuto();*/
271
- }
272
- }
273
- this.$emit('touchEnd',this.currIndex)
274
-
275
- }
276
- else {
277
- if (this.slideCount > 1) {
278
- let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
279
-
280
- if (this.distance == 0) {
281
- return;
282
- } else if (
283
- this.distance > 0 &&
284
- _Dis > this.slideWidth * this.moveRatio
285
- ) {
286
- this.currIndex--;
287
- console.debug(this.currIndex)
288
- } else if (
289
- this.distance < 0 &&
290
- _Dis > this.slideWidth * this.moveRatio
291
- ) {
292
- this.currIndex++;
293
- }
294
- //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
295
- this.scrollCheck();
296
- //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
297
- /*this.moveAuto();*/
298
- }
299
- }
300
- },
301
-
302
- preClick(e){
303
- if (this.slideCount > 1) {
304
- let movePos = e.pageX;
305
- this.distance = movePos - this.startPos;
306
- let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
307
- this.setTransform(moveDistance);
308
- }
309
- this.currIndex--;
310
- if (this.slideCount > 1) {
311
-
312
- //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
313
- this.scrollCheck();
314
- //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
315
- /*this.moveAuto();*/
316
- }
317
- },
318
-
319
- nextClick(e){
320
- if (this.slideCount > 1) {
321
- let movePos = e.pageX;
322
- this.distance = movePos - this.startPos;
323
- let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
324
- this.setTransform(moveDistance);
325
- }
326
- if (this.slideCount > 1) {
327
- this.currIndex++;
328
-
329
- //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
330
- this.scrollCheck();
331
- //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
332
- /*this.moveAuto();*/
333
- }
334
- },
335
- //检测设备是PC端还是移动端
336
- isMobile() {
337
- let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
338
- if(flag){
339
- this.isPhone=true
340
- let el=this.$el
341
- el.style.width='calc(100vw - 110px)'
342
- let swiper=document.getElementsByClassName('swiper')
343
- for (let i=0;i<swiper.length;i++)
344
- {
345
- swiper[i].style.width='calc(100vw - 110px)'
346
- }
347
-
348
-
349
- }else{
350
- this.device='PC'
351
- let el=this.$el
352
- this.isPc=true
353
- el.style.width='300px'
354
- let swiper=document.getElementsByClassName('swiper')
355
-
356
- /* let pnm_swiper=document.getElementById('pnm_swiper')*/
357
- /*pnm_swiper.style.width='300px'*/
358
- for (let i=0;i<swiper.length;i++)
359
- {
360
- swiper[i].style.width='300px'
361
- }
362
- }
363
-
364
- },
365
- isIosOrIsAndroid(){
366
- var u = navigator.userAgent;
367
- var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
368
- var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
369
- if(isAndroid){
370
- this.isAndroid=true
371
- }
372
- if(isiOS){
373
-
374
- this.isIos=true
375
-
376
- }
377
- },
378
- }
379
- };
380
- </script>
381
- <style lang="less">
382
-
383
- #pnm_swiper {
384
- overflow: hidden;
385
- position: relative;
386
- margin: 0 auto;
387
- padding: 10px 0;
388
- -webkit-overflow-scrolling: touch;
389
- }
390
- .swiper {
391
- display: flex;
392
- align-items: center;
393
- }
394
- .bullet {
395
- z-index: 999;
396
- display: flex;
397
- position: absolute;
398
- bottom: 0.1rem;
399
- /* 下方2个配合起来可以达到让弹性盒子子元素真正居中 */
400
- justify-content: center;
401
- width: 100%;
402
- }
403
- //机器人中样式
404
- .isPcClass{
405
- .bullet_item {
406
- color: white;
407
- /* background-color: white;*/
408
- border: 1.5px solid #EAEDF3 !important;
409
- border-radius: 0.2rem;
410
- width: 4px;
411
- height: 4px;
412
- margin: 0 3px;
413
- background-color: #EAEDF3;
414
- }
415
- }
416
- /*.typeClassRem{
417
- .bullet_item {
418
- color: white;
419
- background-color: white;
420
- border: 1.5px solid #AAAAAA !important;
421
- border-radius: 0.2rem;
422
- width: 0.08rem;
423
- height: 0.08rem;
424
- margin: 0 0.03rem;
425
- }
426
- }*/
427
- //企业微信的样式
428
- .isAndroidClass{
429
- .bullet_item {
430
- color: white;
431
- background-color: #EAEDF3;
432
- border: 1.5px solid #EAEDF3 !important;
433
- border-radius: 0.2rem;
434
- width: 4px;
435
- height: 4px;
436
- margin: 0 3px;
437
- }
438
- }
439
- .isIosClass{
440
- .bullet_item {
441
- color: white;
442
- background-color: #EAEDF3;
443
- border: 1.5px solid #EAEDF3 !important;
444
- border-radius: 0.2rem;
445
- width: 4px;
446
- height: 4px;
447
- margin: 0 3px;
448
- }
449
- }
450
- .bullet_item.active {
451
- background-color: #366AFF;
452
- border: 1.5px solid #366AFF !important;
453
- }
454
-
455
- .preBtn{
456
- border: none;
457
- outline: none;
458
- padding: 0;
459
- margin: 0;
460
- height: 36px;
461
- width: 36px;
462
- cursor: pointer;
463
- transition: .3s;
464
- border-radius: 50%;
465
- background-color: rgba(31,45,61,.11);
466
- color: #fff;
467
- position: absolute;
468
- top: 50%;
469
- z-index: 10;
470
- transform: translateY(-50%);
471
- text-align: center;
472
- font-size: 12px
473
- }
474
- .nextBtn{
475
- border: none;
476
- outline: none;
477
- padding: 0;
478
- margin: 0;
479
- height: 36px;
480
- width: 36px;
481
- cursor: pointer;
482
- transition: .3s;
483
- border-radius: 50%;
484
- background-color: rgba(31,45,61,.11);
485
- color: #fff;
486
- position: absolute;
487
- top: 50%;
488
- right: 0;
489
- z-index: 10;
490
- transform: translateY(-50%);
491
- text-align: center;
492
- font-size: 12px
493
- }
494
- #pnm_swiper:hover .clickBtn{
495
-
496
- opacity: 1;
497
- transition: opacity 1s;
498
- }
499
- #pnm_swiper .clickBtn{
500
- opacity: 0;
501
- transition: opacity 1s;
502
- }
503
- </style>
1
+ <template>
2
+ <div id="pnm_swiper">
3
+ <div
4
+ class="swiper"
5
+ @touchstart="touchStart"
6
+ @touchmove="touchMove"
7
+ @touchend="touchEnd"
8
+
9
+ >
10
+ <slot></slot>
11
+ </div>
12
+ <div v-if="device==='PC'&&content.multiple===true" class="clickBtn">
13
+ <div class="preBtn" @click="preClick" style="display: flex">
14
+ <i class="el-icon-arrow-left" style="font-size: 18px;font-weight:800;align-self: center;margin: auto"></i>
15
+ </div>
16
+ <div class="nextBtn" @click="nextClick" style="display: flex">
17
+ <i class="el-icon-arrow-right" style="font-size: 18px;font-weight:800;align-self: center;margin: auto" ></i>
18
+ </div>
19
+ </div>
20
+ <div class="bullet" :class="{isPhoneClass:isPhone===true,isPcClass:isPc===true,isAndroidClass:isAndroid===true,isIosClass:isIos===true}">
21
+ <div
22
+ class="bullet_item"
23
+ v-show="slideCount > 1&&content.multiple===true"
24
+ v-for="(item, slideIndex) in slideCount"
25
+ :class="setBulletActive(slideIndex)"
26
+ :key="slideIndex"
27
+ ></div>
28
+ </div>
29
+ </div>
30
+
31
+ </template>
32
+ <script>
33
+ export default {
34
+ data() {
35
+ return {
36
+ currIndex: 1,
37
+ swiperStyle: {}, //swiper样式
38
+ slideWidth: null, //一张slide的宽度
39
+ moveTimer: null,
40
+ startPos: 0,
41
+ distance: 0,
42
+ slideCount: 0,
43
+ device:'',
44
+ IsmouseOver:false,
45
+ IsShowArrowHead:false,
46
+ isPhone:false,
47
+ isPc:false,
48
+ isAndroid:false,
49
+ isIos:false,
50
+ startX:'',
51
+ startY:'',
52
+ startTime:''
53
+
54
+
55
+ };
56
+ },
57
+ props: {
58
+ moveRatio: {
59
+ type: Number,
60
+ default: 0.2
61
+ },
62
+ animDuration: {
63
+ type: Number,
64
+ default: 300
65
+ },
66
+ content:{
67
+ type:Object,
68
+ default(){
69
+ return {}
70
+ }
71
+ },
72
+ type:String
73
+ },
74
+ mounted() {
75
+ this.slideOn();
76
+ this.isIosOrIsAndroid()
77
+
78
+ },
79
+ methods: {
80
+ // 0. 启动函数
81
+
82
+ slideOn() {
83
+ this.initDom();
84
+ let swiperEls = this.$el;
85
+ var touchElement = {};
86
+ swiperEls.addEventListener('touchstart',function (e) {
87
+ touchElement.startX = e.touches[0].clientX;
88
+ touchElement.startY = e.touches[0].clientY;
89
+ if (this.slideCount > 1) {
90
+ clearInterval(this.moveTimer);
91
+ this.startPos = e.touches[0].pageX;
92
+ }
93
+ })
94
+ swiperEls.addEventListener('touchmove',function (e) {
95
+ var deltaX = e.touches[0].clientX - touchElement.startX;
96
+ var deltaY = e.touches[0].clientY - touchElement.startY;
97
+ if (Math.abs(Math.asin(deltaY/deltaX)) <= 15/180*Math.PI && e.cancelable) {
98
+ e.preventDefault();
99
+ }
100
+ if (this.slideCount > 1) {
101
+ let movePos = e.touches[0].pageX;
102
+ this.distance = movePos - this.startPos;
103
+ let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
104
+ this.setTransform(moveDistance);
105
+ }
106
+ })
107
+ swiperEls.addEventListener('touchend',function (e) {
108
+ if(e.cancelable)
109
+ {
110
+ e.preventDefault()
111
+ }
112
+ if (this.slideCount > 1) {
113
+ let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
114
+ if (this.distance == 0) {
115
+ return;
116
+ } else if (
117
+ this.distance > 0 &&
118
+ _Dis > this.slideWidth * this.moveRatio
119
+ ) {
120
+ this.currIndex--;
121
+ console.debug(this.currIndex)
122
+ } else if (
123
+ this.distance < 0 &&
124
+ _Dis > this.slideWidth * this.moveRatio
125
+ ) {
126
+ this.currIndex++;
127
+ }
128
+ //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
129
+ this.scrollCheck();
130
+ //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
131
+ /*this.moveAuto();*/
132
+ }
133
+
134
+
135
+
136
+ })
137
+
138
+ },
139
+
140
+ // 1. 初始化DOM,并获取必要的数据
141
+ initDom() {
142
+ this.isMobile()
143
+ let swiperEls = this.$el;
144
+ console.debug('swiperEls',swiperEls);
145
+ let swiperEl=swiperEls.querySelector('.swiper')
146
+
147
+ let slides = swiperEl.querySelectorAll(".slide");
148
+ this.swiperStyle = swiperEl.style;
149
+ this.slideCount = slides.length;
150
+ this.slideWidth = swiperEl.offsetWidth;
151
+
152
+
153
+ if (this.slideCount > 1) {
154
+ let firstSlide = slides[0].cloneNode(true);
155
+ let lastSlide = slides[this.slideCount - 1].cloneNode(true);
156
+ swiperEl.appendChild(firstSlide);
157
+ swiperEl.insertBefore(lastSlide, slides[0]);
158
+ //设置开头位置
159
+ this.setTransform(-this.slideWidth);
160
+ }
161
+ console.debug(swiperEl)
162
+
163
+ },
164
+
165
+ // 2. 自动滚动
166
+ /* moveAuto() {
167
+ this.moveTimer = setInterval(() => {
168
+ this.currIndex++;
169
+ //每次滚动都需要先进行检测,真正滚动也会在检测里完成
170
+ this.scrollCheck();
171
+ }, 1000);
172
+ },*/
173
+
174
+ // 3. 滚动检测(检测是第一张还是最后一张,让其回滚到正确的位置)
175
+ scrollCheck() {
176
+ // 开启过渡动画并开始滚动
177
+ this.swiperStyle.transition = "transform " + this.animDuration + "ms";
178
+ this.setTransform(-this.currIndex * this.slideWidth);
179
+
180
+ //设置一个定时器,等过渡动画结束后执行(判断所处位置是第几张)
181
+ setTimeout(() => {
182
+ this.swiperStyle.transition = "0ms";
183
+ //判断第一张,和最后一张
184
+ if (this.currIndex <= 0) {
185
+ this.currIndex = this.slideCount;
186
+ this.setTransform(-this.currIndex * this.slideWidth);
187
+ } else if (this.currIndex >= this.slideCount + 1) {
188
+ this.currIndex = 1;
189
+ this.setTransform(-this.slideWidth);
190
+ }
191
+ }, this.animDuration);
192
+ },
193
+
194
+ //设置swiper的transform的滚动距离
195
+ setTransform(pos) {
196
+ this.swiperStyle.transform = `translateX(${pos}px)`;
197
+ },
198
+
199
+ //重置子弹的active
200
+ setBulletActive(index) {
201
+ if (this.currIndex >= this.slideCount + 1) {
202
+ //最后一张的情况
203
+ return { active: index == 0 };
204
+ } else if (this.currIndex <= 0) {
205
+ //第0张的情况
206
+ return { active: index == this.slideCount - 1 };
207
+ } else {
208
+ //一般情况
209
+ return { active: index == this.currIndex - 1 };
210
+ }
211
+
212
+ },
213
+
214
+ /*
215
+ 触屏事件
216
+ */
217
+
218
+ touchStart(e) {
219
+ // 记录下触发的坐标和时间
220
+ this.startTime = (new Date()).getTime();
221
+ this.startX = e.targetTouches[0].clientX;
222
+ this.startY = e.targetTouches[0].clientY;
223
+ if (this.slideCount > 1) {
224
+ clearInterval(this.moveTimer);
225
+ this.startPos = e.touches[0].pageX;
226
+ }
227
+ },
228
+ touchMove(e) {
229
+ if (this.slideCount > 1) {
230
+ let movePos = e.touches[0].pageX;
231
+ this.distance = movePos - this.startPos;
232
+ let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
233
+ this.setTransform(moveDistance);
234
+ this.$emit('touchMove',e)
235
+ }
236
+ },
237
+ touchEnd(e) {
238
+ if(e.cancelable)
239
+ {
240
+ e.preventDefault()
241
+ }
242
+ var now = (new Date()).getTime();
243
+ // 小于300ms可以识别为点击事件的范围 然后判断触摸点的移动距离
244
+ if (now - this.startTime < 300) {
245
+ var x = (Math.abs(this.startX - e.changedTouches[0].clientX) < 30);
246
+ var y = (Math.abs(this.startY - e.changedTouches[0].clientY) < 30);
247
+ if (x && y) {
248
+ e.changedTouches[0].target.click();
249
+ }
250
+ else {
251
+
252
+ if (this.slideCount > 1) {
253
+ let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
254
+ if (this.distance == 0) {
255
+ return;
256
+ } else if (
257
+ this.distance > 0 &&
258
+ _Dis > this.slideWidth * this.moveRatio
259
+ ) {
260
+ this.currIndex--;
261
+ } else if (
262
+ this.distance < 0 &&
263
+ _Dis > this.slideWidth * this.moveRatio
264
+ ) {
265
+ this.currIndex++;
266
+ }
267
+ //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
268
+ this.scrollCheck();
269
+ //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
270
+ /*this.moveAuto();*/
271
+ }
272
+ }
273
+ this.$emit('touchEnd',this.currIndex)
274
+
275
+ }
276
+ else {
277
+ if (this.slideCount > 1) {
278
+ let _Dis = Math.abs(this.distance); //绝对值求出移动的距离
279
+
280
+ if (this.distance == 0) {
281
+ return;
282
+ } else if (
283
+ this.distance > 0 &&
284
+ _Dis > this.slideWidth * this.moveRatio
285
+ ) {
286
+ this.currIndex--;
287
+ console.debug(this.currIndex)
288
+ } else if (
289
+ this.distance < 0 &&
290
+ _Dis > this.slideWidth * this.moveRatio
291
+ ) {
292
+ this.currIndex++;
293
+ }
294
+ //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
295
+ this.scrollCheck();
296
+ //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
297
+ /*this.moveAuto();*/
298
+ }
299
+ }
300
+ },
301
+
302
+ preClick(e){
303
+ if (this.slideCount > 1) {
304
+ let movePos = e.pageX;
305
+ this.distance = movePos - this.startPos;
306
+ let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
307
+ this.setTransform(moveDistance);
308
+ }
309
+ this.currIndex--;
310
+ if (this.slideCount > 1) {
311
+
312
+ //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
313
+ this.scrollCheck();
314
+ //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
315
+ /*this.moveAuto();*/
316
+ }
317
+ },
318
+
319
+ nextClick(e){
320
+ if (this.slideCount > 1) {
321
+ let movePos = e.pageX;
322
+ this.distance = movePos - this.startPos;
323
+ let moveDistance = -(this.currIndex * this.slideWidth) + this.distance;
324
+ this.setTransform(moveDistance);
325
+ }
326
+ if (this.slideCount > 1) {
327
+ this.currIndex++;
328
+
329
+ //在触碰结束时,由于会触碰第一张或者最后一张,所以需要来一个滚动检测
330
+ this.scrollCheck();
331
+ //上述检测完毕,让其在正确位置之后,在执行 自动翻滚
332
+ /*this.moveAuto();*/
333
+ }
334
+ },
335
+ //检测设备是PC端还是移动端
336
+ isMobile() {
337
+ let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
338
+ if(flag){
339
+ this.isPhone=true
340
+ let el=this.$el
341
+ el.style.width='calc(100vw - 110px)'
342
+ let swiper=document.getElementsByClassName('swiper')
343
+ for (let i=0;i<swiper.length;i++)
344
+ {
345
+ swiper[i].style.width='calc(100vw - 110px)'
346
+ }
347
+
348
+
349
+ }else{
350
+ this.device='PC'
351
+ let el=this.$el
352
+ this.isPc=true
353
+ el.style.width='300px'
354
+ let swiper=document.getElementsByClassName('swiper')
355
+
356
+ /* let pnm_swiper=document.getElementById('pnm_swiper')*/
357
+ /*pnm_swiper.style.width='300px'*/
358
+ for (let i=0;i<swiper.length;i++)
359
+ {
360
+ swiper[i].style.width='300px'
361
+ }
362
+ }
363
+
364
+ },
365
+ isIosOrIsAndroid(){
366
+ var u = navigator.userAgent;
367
+ var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
368
+ var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
369
+ if(isAndroid){
370
+ this.isAndroid=true
371
+ }
372
+ if(isiOS){
373
+
374
+ this.isIos=true
375
+
376
+ }
377
+ },
378
+ }
379
+ };
380
+ </script>
381
+ <style lang="less">
382
+
383
+ #pnm_swiper {
384
+ overflow: hidden;
385
+ position: relative;
386
+ margin: 0 auto;
387
+ padding: 10px 0;
388
+ -webkit-overflow-scrolling: touch;
389
+ }
390
+ .swiper {
391
+ display: flex;
392
+ align-items: center;
393
+ }
394
+ .bullet {
395
+ z-index: 999;
396
+ display: flex;
397
+ position: absolute;
398
+ bottom: 0.1rem;
399
+ /* 下方2个配合起来可以达到让弹性盒子子元素真正居中 */
400
+ justify-content: center;
401
+ width: 100%;
402
+ }
403
+ //机器人中样式
404
+ .isPcClass{
405
+ .bullet_item {
406
+ color: white;
407
+ /* background-color: white;*/
408
+ border: 1.5px solid #EAEDF3 !important;
409
+ border-radius: 0.2rem;
410
+ width: 4px;
411
+ height: 4px;
412
+ margin: 0 3px;
413
+ background-color: #EAEDF3;
414
+ }
415
+ }
416
+ /*.typeClassRem{
417
+ .bullet_item {
418
+ color: white;
419
+ background-color: white;
420
+ border: 1.5px solid #AAAAAA !important;
421
+ border-radius: 0.2rem;
422
+ width: 0.08rem;
423
+ height: 0.08rem;
424
+ margin: 0 0.03rem;
425
+ }
426
+ }*/
427
+ //企业微信的样式
428
+ .isAndroidClass{
429
+ .bullet_item {
430
+ color: white;
431
+ background-color: #EAEDF3;
432
+ border: 1.5px solid #EAEDF3 !important;
433
+ border-radius: 0.2rem;
434
+ width: 4px;
435
+ height: 4px;
436
+ margin: 0 3px;
437
+ }
438
+ }
439
+ .isIosClass{
440
+ .bullet_item {
441
+ color: white;
442
+ background-color: #EAEDF3;
443
+ border: 1.5px solid #EAEDF3 !important;
444
+ border-radius: 0.2rem;
445
+ width: 4px;
446
+ height: 4px;
447
+ margin: 0 3px;
448
+ }
449
+ }
450
+ .bullet_item.active {
451
+ background-color: #366AFF;
452
+ border: 1.5px solid #366AFF !important;
453
+ }
454
+
455
+ .preBtn{
456
+ border: none;
457
+ outline: none;
458
+ padding: 0;
459
+ margin: 0;
460
+ height: 36px;
461
+ width: 36px;
462
+ cursor: pointer;
463
+ transition: .3s;
464
+ border-radius: 50%;
465
+ background-color: rgba(31,45,61,.11);
466
+ color: #fff;
467
+ position: absolute;
468
+ top: 50%;
469
+ z-index: 10;
470
+ transform: translateY(-50%);
471
+ text-align: center;
472
+ font-size: 12px
473
+ }
474
+ .nextBtn{
475
+ border: none;
476
+ outline: none;
477
+ padding: 0;
478
+ margin: 0;
479
+ height: 36px;
480
+ width: 36px;
481
+ cursor: pointer;
482
+ transition: .3s;
483
+ border-radius: 50%;
484
+ background-color: rgba(31,45,61,.11);
485
+ color: #fff;
486
+ position: absolute;
487
+ top: 50%;
488
+ right: 0;
489
+ z-index: 10;
490
+ transform: translateY(-50%);
491
+ text-align: center;
492
+ font-size: 12px
493
+ }
494
+ #pnm_swiper:hover .clickBtn{
495
+
496
+ opacity: 1;
497
+ transition: opacity 1s;
498
+ }
499
+ #pnm_swiper .clickBtn{
500
+ opacity: 0;
501
+ transition: opacity 1s;
502
+ }
503
+ </style>