askbot-dragon 1.1.28 → 1.2.0

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 (82) 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 +12 -0
  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 -351
  22. package/src/components/AskIFrame.vue +15 -15
  23. package/src/components/ConversationContainer.vue +4011 -4011
  24. package/src/components/FileType.vue +86 -86
  25. package/src/components/Message.vue +27 -27
  26. package/src/components/actionSatisfaction.vue +107 -107
  27. package/src/components/actionSendToBot.vue +62 -62
  28. package/src/components/answerDissatisfaction.vue +62 -62
  29. package/src/components/answerRadio.vue +76 -76
  30. package/src/components/ask-components/DissatisfactionOptions.vue +57 -57
  31. package/src/components/ask-components/Msgloading.vue +37 -37
  32. package/src/components/ask-components/SatisfactionV2.vue +15 -15
  33. package/src/components/askVideo.vue +138 -138
  34. package/src/components/assetDetails.vue +370 -370
  35. package/src/components/assetMessage.vue +228 -228
  36. package/src/components/associationIntention.vue +300 -300
  37. package/src/components/attachmentPreview.vue +90 -90
  38. package/src/components/botActionSatisfactor.vue +68 -68
  39. package/src/components/chatContent.vue +513 -513
  40. package/src/components/feedBack.vue +136 -136
  41. package/src/components/fielListView.vue +326 -326
  42. package/src/components/file/AliyunOssComponents.vue +108 -108
  43. package/src/components/formTemplate.vue +3359 -3361
  44. package/src/components/loadingProcess.vue +164 -164
  45. package/src/components/message/ActionAlertIframe.vue +112 -112
  46. package/src/components/message/ShopMessage.vue +164 -164
  47. package/src/components/message/TextMessage.vue +924 -924
  48. package/src/components/message/TicketMessage.vue +177 -177
  49. package/src/components/message/swiper/index.js +4 -4
  50. package/src/components/message/swiper/ticketSwiper.vue +503 -503
  51. package/src/components/message/swiper/ticketSwiperItem.vue +61 -61
  52. package/src/components/msgLoading.vue +231 -231
  53. package/src/components/myPopup.vue +70 -70
  54. package/src/components/popup.vue +227 -227
  55. package/src/components/previewDoc.vue +108 -108
  56. package/src/components/previewPdf.vue +195 -127
  57. package/src/components/receiverMessagePlatform.vue +65 -65
  58. package/src/components/recommend.vue +89 -89
  59. package/src/components/selector/hOption.vue +20 -20
  60. package/src/components/selector/hSelector.vue +199 -199
  61. package/src/components/selector/hWrapper.vue +216 -216
  62. package/src/components/senderMessagePlatform.vue +50 -50
  63. package/src/components/source/BotMessage.vue +24 -24
  64. package/src/components/source/CustomMessage.vue +24 -24
  65. package/src/components/test.vue +260 -260
  66. package/src/components/tree.vue +294 -294
  67. package/src/components/utils/AliyunIssUtil.js +72 -72
  68. package/src/components/utils/ckeditor.js +155 -155
  69. package/src/components/utils/ckeditorImageUpload/command.js +109 -109
  70. package/src/components/utils/ckeditorImageUpload/editing.js +11 -11
  71. package/src/components/utils/ckeditorImageUpload/plugin-image.js +11 -11
  72. package/src/components/utils/ckeditorImageUpload/toolbar-ui.js +40 -40
  73. package/src/components/utils/ckeditorfileUpload/common.js +111 -111
  74. package/src/components/utils/ckeditorfileUpload/editing.js +11 -11
  75. package/src/components/utils/ckeditorfileUpload/plugin_file.js +11 -11
  76. package/src/components/utils/ckeditorfileUpload/toolbar_ui.js +34 -34
  77. package/src/components/utils/format_date.js +25 -25
  78. package/src/components/utils/index.js +6 -6
  79. package/src/components/utils/math_utils.js +29 -29
  80. package/src/components/voiceComponent.vue +119 -119
  81. package/src/main.js +60 -60
  82. 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>