yuantianjiao 6 年前
父节点
当前提交
784a95ccf3

二进制
src/common/icon/Rectangle.png 查看文件


二进制
src/common/icon/pointer.png 查看文件


+ 265
- 0
src/components/vue-load-more/index.vue 查看文件

@@ -0,0 +1,265 @@
1
+<template>
2
+  <div class="yo-scroll" :class="{'down':(state===0),'up':(state==1),refresh:(state===2),touch:touching}" @touchstart="touchStart($event)" @touchmove="touchMove($event)" @touchend="touchEnd($event)">
3
+    <section class="inner">
4
+      <header class="pull-refresh">
5
+        <slot name="pull-refresh">
6
+          <span class="down-tip">下拉更新</span>
7
+          <span class="up-tip">松开刷新数据</span>
8
+          <span class="refresh-tip">加载中……</span>
9
+        </slot>
10
+      </header>
11
+      <slot>
12
+      </slot>
13
+      <footer class="load-more">
14
+        <slot name="load-more">
15
+          <span v-show="downFlag === false">上拉加载更多</span>
16
+          <span v-show="downFlag === true">加载中……</span>
17
+        </slot>
18
+      </footer>
19
+      <div class="nullData" v-show="dataList.noFlag">暂无更多数据</div>
20
+    </section>
21
+  </div>
22
+</template>
23
+
24
+<script>
25
+export default {
26
+  props: {
27
+    offset: { // 默认高度
28
+      type: Number,
29
+      default: 100
30
+    },
31
+    enableInfinite: { // 上拉加载
32
+      type: Boolean,
33
+      default: false
34
+    },
35
+    enableRefresh: { // 下拉刷新
36
+      type: Boolean,
37
+      default: true
38
+    },
39
+    dataList: { // 数据列表
40
+      default: false,
41
+      required: false
42
+    },
43
+    onRefresh: { // 加载方法
44
+      type: Function,
45
+      default: undefined,
46
+      required: false
47
+    },
48
+    onInfinite: { // 刷新方法
49
+      type: Function,
50
+      default: undefined,
51
+      require: false
52
+    }
53
+  },
54
+  data () {
55
+    return {
56
+      top: 0,
57
+      state: 0,
58
+      startX: 0,
59
+      startY: 0,
60
+      touching: false,
61
+      infiniteLoading: false,
62
+      downFlag: false // 用来显示是否加载中
63
+    }
64
+  },
65
+  created () {
66
+
67
+  },
68
+  methods: {
69
+    touchStart (e) {
70
+      this.startY = e.targetTouches[0].pageY
71
+      this.startX = e.targetTouches[0].pageX
72
+      this.startScroll = this.$el.scrollTop || 0
73
+      this.touching = true // 留着有用,不能删除
74
+
75
+      this.dataList.noFlag = false
76
+      this.$el.querySelector('.load-more').style.display = 'block'
77
+    },
78
+    touchMove (e) {
79
+      if (this.dataList.noFlag || !this.touching) {
80
+        return
81
+      }
82
+      let diff = e.targetTouches[0].pageY - this.startY - this.startScroll
83
+      if (diff > 0) e.preventDefault()
84
+      this.top = Math.pow(diff, 0.8) + (this.state === 2 ? this.offset : 0)
85
+      if (this.state === 2) { // in refreshing
86
+        return
87
+      }
88
+      console.log(123)
89
+      if (this.top >= this.offset) {
90
+        this.state = 1
91
+      } else {
92
+        this.state = 0
93
+      }
94
+
95
+      let more = this.$el.querySelector('.load-more')
96
+      if (!this.top && this.state === 0) {
97
+        more.style.display = 'block'
98
+      } else {
99
+        more.style.display = 'none'
100
+      }
101
+    },
102
+    touchEnd (e) {
103
+      // if (!this.enableRefresh) {
104
+      //   return
105
+      // }
106
+      this.touching = false
107
+      if (this.state === 2) { // in refreshing
108
+        this.state = 2
109
+        this.top = this.offset
110
+        return
111
+      }
112
+      if (this.top >= this.offset) { // do refresh
113
+        this.refresh()
114
+      } else { // cancel refresh
115
+        this.state = 0
116
+        this.top = 0
117
+      }
118
+
119
+      // 用于判断滑动是否在原地 ----begin
120
+      let endX = e.changedTouches[0].pageX
121
+      let endY = e.changedTouches[0].pageY
122
+      let dy = this.startY - endY
123
+      let dx = endX - this.startX
124
+      // 如果滑动距离太短
125
+      if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
126
+        // console.log("滑动距离太短")
127
+        this.downFlag = false
128
+        return
129
+      }
130
+      // --------end--------
131
+
132
+      if (!this.enableInfinite || this.infiniteLoading) {
133
+        return
134
+      }
135
+
136
+      let outerHeight = this.$el.clientHeight
137
+      let innerHeight = this.$el.querySelector('.inner').clientHeight
138
+      let scrollTop = this.$el.scrollTop
139
+      let ptrHeight = this.onRefresh ? this.$el.querySelector('.pull-refresh').clientHeight : 0
140
+      let bottom = innerHeight - outerHeight - scrollTop - ptrHeight
141
+
142
+      // console.log(bottom + " __ " + this.offset)
143
+
144
+      if (bottom <= this.offset && this.state === 0) {
145
+        this.downFlag = true
146
+        this.infinite()
147
+      } else {
148
+        this.$el.querySelector('.load-more').style.display = 'none'
149
+        this.downFlag = false
150
+      }
151
+    },
152
+    refresh () {
153
+      this.state = 2
154
+      this.top = this.offset
155
+      setTimeout(() => {
156
+        this.onRefresh(this.refreshDone)
157
+      }, 1000)
158
+    },
159
+    refreshDone () {
160
+      this.state = 0
161
+      this.top = 0
162
+    },
163
+
164
+    infinite () {
165
+      this.infiniteLoading = true
166
+
167
+      setTimeout(() => {
168
+        this.onInfinite(this.infiniteDone)
169
+      }, 2000)
170
+    },
171
+
172
+    infiniteDone () {
173
+      this.infiniteLoading = false
174
+    }
175
+  }
176
+}
177
+</script>
178
+
179
+<style lang="scss" scoped>
180
+.yo-scroll {
181
+  font-size: 0.24rem;
182
+  position: absolute;
183
+  top: 0;
184
+  right: 0;
185
+  bottom: 0;
186
+  left: 0;
187
+  overflow: auto;
188
+  z-index: 100;
189
+  height: auto;
190
+  -webkit-overflow-scrolling: touch;
191
+  .inner {
192
+    position: absolute;
193
+    top: -0.5rem;
194
+    width: 100%;
195
+    height: auto;
196
+    transition-duration: 300ms;
197
+    .pull-refresh {
198
+      position: relative;
199
+      left: 0;
200
+      top: 0;
201
+      width: 100%;
202
+      height: 0.5rem;
203
+      display: flex;
204
+      display: -webkit-flex;
205
+      align-items: center;
206
+      justify-content: center;
207
+    }
208
+    .load-more {
209
+      height: 0.5rem;
210
+      line-height: 0.5rem;
211
+      display: flex;
212
+      text-align: center;
213
+      align-items: center;
214
+      justify-content: center;
215
+      display: none;
216
+    }
217
+    .nullData {
218
+      // 暂无更多数据样式
219
+      font-size: 0.13rem;
220
+      color: #999999;
221
+      height: 0.5rem;
222
+      line-height: 0.5rem;
223
+      text-align: center;
224
+    }
225
+    .down-tip,
226
+    .refresh-tip,
227
+    .up-tip {
228
+      display: none;
229
+    }
230
+    .up-tip:before,
231
+    .refresh-tip:before {
232
+      content: "";
233
+      display: inline-block;
234
+      width: 1.6rem;
235
+      height: 0.7rem;
236
+      background-size: 70% !important;
237
+      position: absolute;
238
+      top: 0;
239
+      left: 20%;
240
+    }
241
+    // .up-tip:before {
242
+    //   background: url(./loading.gif) no-repeat center;
243
+    // }
244
+    // .refresh-tip:before {
245
+    //   background: url(./loading.gif) no-repeat center;
246
+    // }
247
+  }
248
+}
249
+
250
+.yo-scroll.touch .inner {
251
+  transition-duration: 0;
252
+}
253
+
254
+.yo-scroll.down .down-tip {
255
+  display: block;
256
+}
257
+
258
+.yo-scroll.up .up-tip {
259
+  display: block;
260
+}
261
+
262
+.yo-scroll.refresh .refresh-tip {
263
+  display: block;
264
+}
265
+</style>

二进制
src/components/vue-load-more/loading.gif 查看文件


+ 67
- 36
src/pages/user/mainPage/libraryIndex/index.vue 查看文件

@@ -1,37 +1,44 @@
1 1
 <template>
2 2
   <div class="mainPage">
3 3
     <div>
4
-      <div class="header flex-h">
5
-        <div class="flex-item flex-h">
6
-          <i class="iconfont icon-sousuo"></i>
7
-          <router-link
8
-            class="flex-item"
9
-            :to="{name: 'booksSearch', query: {caseid: currentCaseId}}"
10
-          >{{indexSearchKey}}</router-link>
4
+      <loadMore :on-infinite="onInfinite" :dataList="books.list">
5
+        <div class="header flex-h">
6
+          <div class="flex-item flex-h">
7
+            <i class="iconfont icon-sousuo"></i>
8
+            <router-link
9
+              class="flex-item"
10
+              :to="{name: 'booksSearch', query: {caseid: currentCaseId}}"
11
+            >{{indexSearchKey}}</router-link>
12
+          </div>
13
+          <a @click="showDialog = true">
14
+            <i class="iconfont icon-dingwei"></i>
15
+            <span>{{currentCaseName}}</span>
16
+          </a>
17
+        </div>
18
+        <nav class="nav">
19
+          <a
20
+            v-for="(item, index) in navList"
21
+            v-if="(navList || []).length < 9 || index<7"
22
+            :key="index"
23
+            @click="navClick(item)"
24
+          >
25
+            <img :src="item.BookTypeImg" alt>
26
+            <span>{{item.BookTypeName}}</span>
27
+          </a>
28
+          <a v-if="(navList || []).length >8 " @click="moreNav()">
29
+            <img src="https://spaceofcheng.oss-cn-beijing.aliyuncs.com/test-icon8.png" alt>
30
+            <span>更多</span>
31
+          </a>
32
+        </nav>
33
+        <div class="list">
34
+          <h1>精选推荐</h1>
35
+          <ul>
36
+            <li v-for="(item, index) in books.list" :key="index">
37
+              <libraryListItem :data="item" @appointmentBook="appointmentBook"></libraryListItem>
38
+            </li>
39
+          </ul>
11 40
         </div>
12
-        <a @click="showDialog = true">
13
-          <i class="iconfont icon-dingwei"></i>
14
-          <span>{{currentCaseName}}</span>
15
-        </a>
16
-      </div>
17
-      <nav class="nav">
18
-        <a v-for="(item, index) in navList" v-if="(navList || []).length < 9 || index<7" :key="index" @click="navClick(item)">
19
-          <img :src="item.BookTypeImg" alt>
20
-          <span>{{item.BookTypeName}}</span>
21
-        </a>
22
-        <a v-if="(navList || []).length >8 " @click="moreNav()">
23
-          <img src="https://spaceofcheng.oss-cn-beijing.aliyuncs.com/test-icon8.png" alt>
24
-          <span>更多</span>
25
-        </a>
26
-      </nav>
27
-      <div class="list">
28
-        <h1>精选推荐</h1>
29
-        <ul>
30
-          <li v-for="(item, index) in books.list" :key="index">
31
-            <libraryListItem :data="item" @appointmentBook="appointmentBook"></libraryListItem>
32
-          </li>
33
-        </ul>
34
-      </div>
41
+      </loadMore>
35 42
       <van-dialog v-model="showDialog" :show-confirm-button="false">
36 43
         <div class="dialogContent">
37 44
           <span class="title">选择案场</span>
@@ -60,6 +67,7 @@
60 67
 </template>
61 68
 
62 69
 <script>
70
+import loadMore from '@/components/vue-load-more/index'
63 71
 import libraryListItem from '../../../../components/libraryListItem/index'
64 72
 import radio from '../../../../components/radio/index'
65 73
 import { mapState, createNamespacedHelpers } from 'vuex'
@@ -76,8 +84,11 @@ export default {
76 84
       currentCaseName: '',
77 85
       cases: [],
78 86
       indexSearchKey: '',
79
-      page: 1,
80
-      pagesize: 10,
87
+      page: 0,
88
+      pagesize: 2,
89
+      scrollData: {
90
+        noFlag: false // 暂无更多数据显示
91
+      }
81 92
     }
82 93
   },
83 94
   computed: {
@@ -92,7 +103,8 @@ export default {
92 103
   },
93 104
   components: {
94 105
     libraryListItem,
95
-    radio
106
+    radio,
107
+    loadMore
96 108
   },
97 109
   created () {
98 110
     if (!this.CaseList.length || this.CaseList === null) {
@@ -122,8 +134,8 @@ export default {
122 134
   methods: {
123 135
     ...mapAppActions(['getCaseList']),
124 136
     ...mapBookActions([
125
-      'getBookType', 
126
-      'getRecommendBook', 
137
+      'getBookType',
138
+      'getRecommendBook',
127 139
       'getMineBook',
128 140
     ]),
129 141
     selectCaseId () { // 选择案场
@@ -143,10 +155,29 @@ export default {
143 155
         page: 1,
144 156
         pagesize: 10,
145 157
       })
158
+      // this.getRecommendBook({
159
+      //   caseid: this.currentCaseId,
160
+      //   page: this.page,
161
+      //   pagesize: this.pagesize,
162
+      // })
163
+      this.onInfinite()
164
+    },
165
+    onInfinite () {
166
+      this.page++
167
+      let more = this.$el.querySelector('.load-more')
146 168
       this.getRecommendBook({
147 169
         caseid: this.currentCaseId,
148 170
         page: this.page,
149 171
         pagesize: this.pagesize,
172
+      }).then((res) => {
173
+        console.log(res)
174
+        if (res.list.length < res.pageSize) {
175
+          console.log(res.list.length)
176
+          more.style.display = 'none' // 隐藏加载条
177
+        } else {
178
+          console.log(res.list.length)
179
+          this.scrollData.noFlag = true
180
+        }
150 181
       })
151 182
     },
152 183
     appointmentBook () { // 预约图书
@@ -159,7 +190,7 @@ export default {
159 190
       this.$router.push({ name: 'booksList', query: { type: item.BookTypeId, caseid: this.currentCaseId } })
160 191
     },
161 192
     moreNav () {
162
-      this.$router.push({ name: 'libraryNavList', query: {caseid: this.currentCaseId} })
193
+      this.$router.push({ name: 'libraryNavList', query: { caseid: this.currentCaseId } })
163 194
     }
164 195
   }
165 196
 }

+ 5
- 2
src/pages/user/mainPage/userCenter/index.vue 查看文件

@@ -12,7 +12,10 @@
12 12
               <div v-if="user.Phone">{{user.Phone}}</div>
13 13
               <div v-else>未绑定</div>
14 14
             </div>
15
-            <div></div>
15
+            <div class="vip">
16
+              <span>vip1</span>
17
+              <img src="../../../../common/icon/Rectangle.png" alt="">
18
+            </div>
16 19
           </div>
17 20
           <div v-if="user.Phone" class="code">
18 21
             <div>卡号:2334546456456</div>
@@ -52,7 +55,7 @@
52 55
         <div class="flex-item privilege-item">
53 56
           <!-- <i class="iconfont icon-01" @click.stop="toVip"></i> -->
54 57
           <div class="img-box">
55
-            <img src="../../../../common/icon/userCenter-icon-3.png" width="100%" height="100%" alt>
58
+            <img src="../../../../common/icon/pointer.png" width="100%" height="100%" alt>
56 59
           </div>
57 60
           <span>积分</span>
58 61
           <span>

+ 22
- 2
src/pages/user/mainPage/userCenter/page.scss 查看文件

@@ -29,7 +29,7 @@
29 29
   >div:nth-of-type(1){
30 30
     display: flex;
31 31
     margin-bottom: .1rem;
32
-    img{
32
+    >img{
33 33
       width: .56rem;
34 34
       height: .56rem;
35 35
       margin-right: .1rem;
@@ -43,6 +43,23 @@
43 43
       color: #000;
44 44
       font-size: .18rem;
45 45
     }
46
+    .vip{
47
+      width: .24rem;
48
+      position: relative;
49
+      span{
50
+        position: absolute;
51
+        top: 0;
52
+        left: 0;
53
+        font-size: .09rem;
54
+        text-align: center;
55
+        width: 100%;
56
+        line-height: .22rem;
57
+        color: #fff;
58
+      }
59
+      img{
60
+        width: 100%;
61
+      }
62
+    }
46 63
   }
47 64
   .code{
48 65
     text-align: center;
@@ -151,8 +168,11 @@
151 168
       font-size: .18rem;
152 169
     }
153 170
     .img-box {
154
-      width: 0.24rem;
171
+      width: 0.2rem;
155 172
       height: 0.18rem;
173
+      img{
174
+        object-fit: contain;
175
+      }
156 176
     }
157 177
     span:nth-of-type(1){
158 178
       font-size: .14rem;

+ 4
- 2
src/store/book/index.js 查看文件

@@ -5,7 +5,9 @@ export default {
5 5
   namespaced: true,
6 6
   state: {
7 7
     types: {},
8
-    recommends: {},
8
+    recommends: {
9
+      list: []
10
+    },
9 11
     books: {},
10 12
     minebooks: {},
11 13
   },
@@ -14,7 +16,7 @@ export default {
14 16
       state.types = payload
15 17
     },
16 18
     updateRecommendBooks (state, payload) {
17
-      state.recommends = payload
19
+      state.recommends.list = state.recommends.list.concat(payload.list)
18 20
     },
19 21
     updateBookList (state, payload) {
20 22
       state.books = payload