askbot-dragon 1.2.9 → 1.3.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 (83) 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/common.js +11 -11
  13. package/src/assets/js/script.js +36 -36
  14. package/src/assets/less/common.css +6773 -6773
  15. package/src/assets/less/converSationContainer/common.less +191 -191
  16. package/src/assets/less/converSationContainer/converSatonContainer.less +493 -493
  17. package/src/assets/less/iconfont.css +37 -37
  18. package/src/assets/less/ticketMessage.less +211 -211
  19. package/src/components/ActionAlertIframe.vue +112 -112
  20. package/src/components/AiGuide.vue +467 -467
  21. package/src/components/AnswerDocknowledge.vue +362 -362
  22. package/src/components/AnswerVoice.vue +254 -0
  23. package/src/components/AskIFrame.vue +15 -15
  24. package/src/components/ConversationContainer.vue +4024 -4011
  25. package/src/components/FileType.vue +86 -86
  26. package/src/components/Message.vue +27 -27
  27. package/src/components/actionSatisfaction.vue +107 -107
  28. package/src/components/actionSendToBot.vue +62 -62
  29. package/src/components/answerDissatisfaction.vue +62 -62
  30. package/src/components/answerRadio.vue +76 -76
  31. package/src/components/ask-components/DissatisfactionOptions.vue +57 -57
  32. package/src/components/ask-components/Msgloading.vue +37 -37
  33. package/src/components/ask-components/SatisfactionV2.vue +15 -15
  34. package/src/components/askVideo.vue +138 -138
  35. package/src/components/assetDetails.vue +370 -370
  36. package/src/components/assetMessage.vue +228 -228
  37. package/src/components/associationIntention.vue +323 -323
  38. package/src/components/attachmentPreview.vue +90 -90
  39. package/src/components/botActionSatisfactor.vue +68 -68
  40. package/src/components/chatContent.vue +513 -513
  41. package/src/components/feedBack.vue +136 -136
  42. package/src/components/fielListView.vue +344 -344
  43. package/src/components/file/AliyunOssComponents.vue +108 -108
  44. package/src/components/formTemplate.vue +3363 -3363
  45. package/src/components/loadingProcess.vue +164 -164
  46. package/src/components/message/ActionAlertIframe.vue +112 -112
  47. package/src/components/message/ShopMessage.vue +164 -164
  48. package/src/components/message/TextMessage.vue +924 -924
  49. package/src/components/message/TicketMessage.vue +177 -177
  50. package/src/components/message/swiper/index.js +4 -4
  51. package/src/components/message/swiper/ticketSwiper.vue +503 -503
  52. package/src/components/message/swiper/ticketSwiperItem.vue +61 -61
  53. package/src/components/msgLoading.vue +231 -231
  54. package/src/components/myPopup.vue +70 -70
  55. package/src/components/popup.vue +227 -227
  56. package/src/components/previewDoc.vue +108 -112
  57. package/src/components/previewPdf.vue +205 -205
  58. package/src/components/receiverMessagePlatform.vue +65 -65
  59. package/src/components/recommend.vue +89 -89
  60. package/src/components/selector/hOption.vue +20 -20
  61. package/src/components/selector/hSelector.vue +199 -199
  62. package/src/components/selector/hWrapper.vue +216 -216
  63. package/src/components/senderMessagePlatform.vue +50 -50
  64. package/src/components/source/BotMessage.vue +24 -24
  65. package/src/components/source/CustomMessage.vue +24 -24
  66. package/src/components/test.vue +260 -260
  67. package/src/components/tree.vue +294 -294
  68. package/src/components/utils/AliyunIssUtil.js +72 -72
  69. package/src/components/utils/ckeditor.js +155 -155
  70. package/src/components/utils/ckeditorImageUpload/command.js +109 -109
  71. package/src/components/utils/ckeditorImageUpload/editing.js +11 -11
  72. package/src/components/utils/ckeditorImageUpload/plugin-image.js +11 -11
  73. package/src/components/utils/ckeditorImageUpload/toolbar-ui.js +40 -40
  74. package/src/components/utils/ckeditorfileUpload/common.js +111 -111
  75. package/src/components/utils/ckeditorfileUpload/editing.js +11 -11
  76. package/src/components/utils/ckeditorfileUpload/plugin_file.js +11 -11
  77. package/src/components/utils/ckeditorfileUpload/toolbar_ui.js +34 -34
  78. package/src/components/utils/format_date.js +25 -25
  79. package/src/components/utils/index.js +6 -6
  80. package/src/components/utils/math_utils.js +29 -29
  81. package/src/components/voiceComponent.vue +119 -119
  82. package/src/main.js +60 -60
  83. package/vue.config.js +55 -55
@@ -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>