许成详 6 years ago
parent
commit
b734bbd47e
3 changed files with 309 additions and 81 deletions
  1. 6
    2
      config/index.js
  2. 228
    47
      src/assets/css/reset.css
  3. 75
    32
      src/pages/page3.vue

+ 6
- 2
config/index.js View File

@@ -12,12 +12,16 @@ module.exports = {
12 12
     assetsPublicPath: '/',
13 13
     proxyTable: {
14 14
       '/api': {
15
-        target: 'http://192.168.0.11:8080', 
15
+        target: 'http://192.168.0.11', 
16 16
         changeOrigin: true,
17 17
         pathRewrite: {
18
-          '^/api': '/'
18
+          '^/api': '/api',
19 19
         },
20 20
       },
21
+      '/audio': {
22
+        target: 'http://192.168.0.11', 
23
+        changeOrigin: true
24
+      },
21 25
     },
22 26
 
23 27
     // Various Dev Server settings

+ 228
- 47
src/assets/css/reset.css View File

@@ -1,48 +1,229 @@
1 1
 @charset"utf-8";
2
-html,body{width:100%;height:100%;width:100vw;height:100vh;-webkit-text-size-adjust:100%;position:relative;overflow-x:hidden;font-size:100px;}
3
-
4
-@media screen and(max-width:320px){html,body{font-size:85px;}}
5
-@media screen and(min-width:375px){html,body{font-size:100px;}}
6
-@media screen and(min-width:414px){html,body{font-size:110px;}}
7
-
8
-*{margin:0;padding:0;font-family:"微软雅黑";-webkit-tap-highlight-color:rgba(255,0,0,0);-webkit-font-smoothing:antialiased;}
9
-body *{font-size:.15rem;}
10
-a{text-decoration:none;}
11
-a:hover{cursor:pointer;}
12
-em{font-style:normal;}
13
-li{list-style:none;}
14
-img{border:0;vertical-align:middle;}
15
-table{border-collapse:collapse;border-spacing:0;}
16
-p{word-wrap:break-word;}
17
-b{font-weight:normal;}
18
-input,textarea{border:0;-webkit-appearance:none;}
19
-input[type=input]{-webkit-appearance:none;}
20
-input[type=checkbox]{-webkit-appearance:checkbox;}
21
-input:focus,textarea:focus,select:focus{outline:none;}
22
-textarea{resize:none;}
23
-select{direction:rtl;}
24
-select option{direction:ltr;}
25
-::-webkit-scrollbar{display:none;}
26
-
27
-.text-overflow-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
28
-.centerLabel{display:block;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);}
29
-.flex-h{display:flex;display:-webkit-flex;}
30
-.flex-v{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;}
31
-.flex-item{flex:1;-webkit-flex:1;position:relative;overflow:hidden;}
32
-*[class*="text-overflowEllipsis-line"]{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;}
33
-.text-overflowEllipsis-line2{-webkit-line-clamp:2;}
34
-.text-overflowEllipsis-line3{-webkit-line-clamp:3;}
35
-.text-overflowEllipsis-line4{-webkit-line-clamp:4;}
36
-*[class*="overflow-scroll-y"]{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;}
37
-*[class*="overflow-scroll-x"]{overflow-y:hidden;overflow-x:scroll;-webkit-overflow-scrolling:touch;}
38
-.overflow-scroll-y-3d,.overflow-scroll-x-3d{transform:translateZ(0);-webkit-transform:translateZ(0);}
39
-.overflow-scroll-x::-webkit-scrollbar,.overflow-scroll-x-3d::-webkit-scrollbar{width:0;height:0;color:transparent;display:none;}
40
-*>img.cover{width:100%;height:100%;object-fit:cover;}
41
-*>img.contain{width:100%;height:100%;object-fit:contain;}
42
-
43
-.mainPage{width:100%;height:100%;position:relative;background:#fff;}
44
-
45
-.van-toast div{color:white;}
46
-.van-toast i{color:white;}
47
-.van-dialog__message{text-align:center;}
48
-.van-dialog__message.van-dialog__message--has-title{text-align:center;}
2
+html,
3
+body {
4
+  width: 100%;
5
+  height: 100%;
6
+  width: 100vw;
7
+  height: 100vh;
8
+  -webkit-text-size-adjust: 100%;
9
+  position: relative;
10
+  overflow-x: hidden;
11
+  font-size: 100px;
12
+}
13
+
14
+@media screen and(max-width:320px) {
15
+  html,
16
+  body {
17
+    font-size: 85px;
18
+  }
19
+}
20
+
21
+@media screen and(min-width:375px) {
22
+  html,
23
+  body {
24
+    font-size: 100px;
25
+  }
26
+}
27
+
28
+@media screen and(min-width:414px) {
29
+  html,
30
+  body {
31
+    font-size: 110px;
32
+  }
33
+}
34
+
35
+* {
36
+  margin: 0;
37
+  padding: 0;
38
+  font-family: "微软雅黑";
39
+  -webkit-tap-highlight-color: rgba(255, 0, 0, 0);
40
+  -webkit-font-smoothing: antialiased;
41
+}
42
+
43
+body * {
44
+  font-size: .15rem;
45
+}
46
+
47
+a {
48
+  text-decoration: none;
49
+}
50
+
51
+a:hover {
52
+  cursor: pointer;
53
+}
54
+
55
+em {
56
+  font-style: normal;
57
+}
58
+
59
+li {
60
+  list-style: none;
61
+}
62
+
63
+img {
64
+  border: 0;
65
+  vertical-align: middle;
66
+}
67
+
68
+table {
69
+  border-collapse: collapse;
70
+  border-spacing: 0;
71
+}
72
+
73
+p {
74
+  word-wrap: break-word;
75
+}
76
+
77
+b {
78
+  font-weight: normal;
79
+}
80
+
81
+input,
82
+textarea {
83
+  border: 0;
84
+  -webkit-appearance: none;
85
+}
86
+
87
+input[type=input] {
88
+  -webkit-appearance: none;
89
+}
90
+
91
+input[type=checkbox] {
92
+  -webkit-appearance: checkbox;
93
+}
94
+
95
+input:focus,
96
+textarea:focus,
97
+select:focus {
98
+  outline: none;
99
+}
100
+
101
+textarea {
102
+  resize: none;
103
+}
104
+
105
+select {
106
+  direction: rtl;
107
+}
108
+
109
+select option {
110
+  direction: ltr;
111
+}
112
+
113
+::-webkit-scrollbar {
114
+  display: none;
115
+}
116
+
117
+.text-overflow-ellipsis {
118
+  overflow: hidden;
119
+  white-space: nowrap;
120
+  text-overflow: ellipsis;
121
+}
122
+
123
+.centerLabel {
124
+  display: block;
125
+  position: absolute;
126
+  left: 50%;
127
+  top: 50%;
128
+  transform: translate(-50%, -50%);
129
+  -webkit-transform: translate(-50%, -50%);
130
+}
131
+
132
+.flex-h {
133
+  display: flex;
134
+  display: -webkit-flex;
135
+}
136
+
137
+.flex-v {
138
+  display: flex;
139
+  display: -webkit-flex;
140
+  flex-direction: column;
141
+  -webkit-flex-direction: column;
142
+}
143
+
144
+.flex-item {
145
+  flex: 1;
146
+  -webkit-flex: 1;
147
+  position: relative;
148
+  overflow: hidden;
149
+}
150
+
151
+*[class*="text-overflowEllipsis-line"] {
152
+  overflow: hidden;
153
+  text-overflow: ellipsis;
154
+  display: -webkit-box;
155
+  -webkit-box-orient: vertical;
156
+}
157
+
158
+.text-overflowEllipsis-line2 {
159
+  -webkit-line-clamp: 2;
160
+}
161
+
162
+.text-overflowEllipsis-line3 {
163
+  -webkit-line-clamp: 3;
164
+}
165
+
166
+.text-overflowEllipsis-line4 {
167
+  -webkit-line-clamp: 4;
168
+}
169
+
170
+*[class*="overflow-scroll-y"] {
171
+  overflow-x: hidden;
172
+  overflow-y: scroll;
173
+  -webkit-overflow-scrolling: touch;
174
+}
175
+
176
+*[class*="overflow-scroll-x"] {
177
+  overflow-y: hidden;
178
+  overflow-x: scroll;
179
+  -webkit-overflow-scrolling: touch;
180
+}
181
+
182
+.overflow-scroll-y-3d,
183
+.overflow-scroll-x-3d {
184
+  transform: translateZ(0);
185
+  -webkit-transform: translateZ(0);
186
+}
187
+
188
+.overflow-scroll-x::-webkit-scrollbar,
189
+.overflow-scroll-x-3d::-webkit-scrollbar {
190
+  width: 0;
191
+  height: 0;
192
+  color: transparent;
193
+  display: none;
194
+}
195
+
196
+*>img.cover {
197
+  width: 100%;
198
+  height: 100%;
199
+  object-fit: cover;
200
+}
201
+
202
+*>img.contain {
203
+  width: 100%;
204
+  height: 100%;
205
+  object-fit: contain;
206
+}
207
+
208
+.mainPage {
209
+  width: 100%;
210
+  height: 100%;
211
+  position: relative;
212
+  background: #fff;
213
+}
214
+
215
+.van-toast div {
216
+  color: white;
217
+}
218
+
219
+.van-toast i {
220
+  color: white;
221
+}
222
+
223
+.van-dialog__message {
224
+  text-align: center;
225
+}
226
+
227
+.van-dialog__message.van-dialog__message--has-title {
228
+  text-align: center;
229
+}

+ 75
- 32
src/pages/page3.vue View File

@@ -44,7 +44,7 @@
44 44
         </div>
45 45
       </div>
46 46
       <div class="flex-item">
47
-        <div :hidden="!showSlide" v-if="pageDetail !== null">
47
+        <div :hidden="!!users.length" v-if="pageDetail !== null">
48 48
           <swiper :options="swiperOption" ref="mySwiper">
49 49
             <swiper-slide class="swiper-slide" v-for="(item, index) in pageDetail.content" :key="index">
50 50
               <img v-if="pageDetail.detail.contentType === 'image'" class="centerLabel" width="100%" height="100%" :src="item.content" alt>
@@ -54,10 +54,20 @@
54 54
             </swiper-slide>
55 55
           </swiper>
56 56
         </div>
57
-        <div :hidden="showSlide">
58
-          <ul class="centerLabel userList">
59
-            <!-- <userList></userList> -->
60
-          </ul>
57
+        <div :hidden="!users.length">
58
+          <transition-group class="centerLabel userList" tag="ul" name="fade">
59
+            <li v-for="(user, k) in users" :key="k" class="fade-item">
60
+              <span>{{user.name}}</span>
61
+              <span>{{user.words}}</span>
62
+            </li>
63
+          </transition-group>
64
+          <div v-if="audios.length > 0" :hidden="true">
65
+            <div v-for="(audio, k) in audios" :key="k">
66
+              <audio v-if="audio.isShow" @ended="audioEnd(k)">
67
+                <source :src="audio.url">
68
+              </audio>
69
+            </div>
70
+          </div>
61 71
         </div>
62 72
       </div>
63 73
     </div>
@@ -69,7 +79,6 @@ import { createNamespacedHelpers } from 'vuex'
69 79
 import 'swiper/dist/css/swiper.css'
70 80
 import { swiper, swiperSlide } from 'vue-awesome-swiper'
71 81
 import solarLunar from 'solarLunar'
72
-import userList from '../components/userList'
73 82
 import XWebSocket from '../util/websocket'
74 83
 const { mapState: mapPageState, mapActions: mapPageActions, mapMutations: mapPageMutations } = createNamespacedHelpers('newIndex')
75 84
 export default {
@@ -77,23 +86,13 @@ export default {
77 86
   data () {
78 87
     return {
79 88
       ws: null,
80
-      userList: [{
81
-        firstName: '111',
82
-        gender: '1',
83
-        show: false
84
-      }, {
85
-        firstName: '111',
86
-        gender: '1',
87
-        show: false
88
-      }, {
89
-        firstName: '111',
90
-        gender: '1',
91
-        show: false
92
-      }],
89
+      users: [],
90
+      audios: [],
91
+      diffM: 5000,
93 92
       currentDate: '',
94 93
       currentWeek: '',
95 94
       currentChineseDate: '',
96
-      showSlide: true,
95
+      showSlide: false,
97 96
       currentTimeTamp: Date.now(),
98 97
       activeIndex: 0,
99 98
       timer: null,
@@ -133,10 +132,20 @@ export default {
133 132
   },
134 133
   components: {
135 134
     swiper,
136
-    swiperSlide,
137
-    userList
135
+    swiperSlide
138 136
   },
139 137
   created () {
138
+    const _that = this
139
+    window.setInterval(() => {
140
+      let dels = _that.users.filter(x => Date.parse(new Date()) - x.createdata > this.diffM)
141
+      dels.map(x => {
142
+        _that.users.splice(this.users.findIndex(i => i.createdata === x.createdata), 1)
143
+      })
144
+      let delaudios = _that.audios.filter(x => Date.parse(new Date()) - x.createdata > this.diffM)
145
+      delaudios.map(x => {
146
+        _that.audios.splice(this.audios.findIndex(i => i.createdata === x.createdata), 1)
147
+      })
148
+    }, 100)
140 149
     this.ws = new XWebSocket({
141 150
       message: this.receviedMsg.bind(this),
142 151
       delay: 10,
@@ -168,9 +177,40 @@ export default {
168 177
     ...mapPageMutations([
169 178
       'emptyPageDetail'
170 179
     ]),
180
+    newData (info) {
181
+      if (info.classId === '1' && this.users.filter(x => x.classId === '1').length > 0) {
182
+        this.users = this.users.map((x) => {
183
+          if (x.classId === '1') {
184
+            return { ...x, createdata: Date.parse(new Date()) }
185
+          } else {
186
+            return x
187
+          }
188
+        })
189
+      } else {
190
+        if (this.users.length >= 3) {
191
+          this.users.splice(0, 1)
192
+        }
193
+        this.users = [...this.users, { ...info, createdata: Date.parse(new Date()) }]
194
+        this.audios = [...this.audios, { ...info, isShow: true, createdata: Date.parse(new Date()) }]
195
+      }
196
+    },
197
+    audioEnd (index) {
198
+      let as = this.audios
199
+      this.audios = as.map((x, i) => {
200
+        if (i === index) {
201
+          x.isShow = false
202
+        }
203
+      })
204
+    },
171 205
     receviedMsg (e) {
172 206
       let res = JSON.parse(e.data)
173 207
       console.log(res)
208
+      this.newData({
209
+        name: !res.person.name ? '' : res.person.name,
210
+        classId: res.person.typeId,
211
+        words: res.taVisitingWords.words,
212
+        url: res.audio
213
+      })
174 214
     },
175 215
     init () { // 初始化
176 216
       this.emptyPageDetail()
@@ -275,6 +315,17 @@ export default {
275 315
   height: 100%;
276 316
   position: relative;
277 317
   overflow: hidden;
318
+  .fade-item {
319
+    transition: all 1s;
320
+    display: inline-block;
321
+  }
322
+  .fade-enter,
323
+  .fade-leave-to {
324
+    opacity: 0;
325
+  }
326
+  .fade-leave-active {
327
+    position: absolute;
328
+  }
278 329
   .bg {
279 330
     z-index: 1;
280 331
   }
@@ -438,26 +489,18 @@ export default {
438 489
             background: rgba(255, 255, 255, 0.15);
439 490
             margin: 1.8vh auto 0;
440 491
             padding: 9vh 0;
441
-            transform: translateY(100vh);
442
-            -webkit-transform: translateY(100vh);
443
-            transition: all 0.3s linear;
444
-            -webkit-transition: all 0.3s linear;
445 492
             &:first-child {
446 493
               margin-top: 0;
447 494
             }
448
-            &.active {
449
-              transform: translateY(0);
450
-              -webkit-transform: translateY(0);
451
-            }
452 495
             span {
453 496
               width: 100%;
454 497
               display: block;
455 498
               color: #fff;
456 499
               text-align: center;
457 500
               line-height: 1.45;
458
-              font-size: 2.3vw;
501
+              font-size: 2.6vw;
459 502
               &:first-child {
460
-                font-size: 2.8vw;
503
+                font-size: 3.2vw;
461 504
                 line-height: 1.3;
462 505
               }
463 506
             }