张延森 5 年之前
父節點
當前提交
0164da308e
共有 6 個文件被更改,包括 205 次插入167 次删除
  1. 4
    10
      package-lock.json
  2. 53
    0
      src/components/CaseCard.vue
  3. 25
    23
      src/components/Wheelplanting.vue
  4. 1
    2
      src/config/api.js
  5. 62
    85
      src/views/Case.vue
  6. 60
    47
      src/views/Dynamic.vue

+ 4
- 10
package-lock.json 查看文件

@@ -1195,7 +1195,6 @@
1195 1195
           "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz",
1196 1196
           "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
1197 1197
           "dev": true,
1198
-          "optional": true,
1199 1198
           "requires": {
1200 1199
             "co": "^4.6.0",
1201 1200
             "fast-deep-equal": "^1.0.0",
@@ -1207,8 +1206,7 @@
1207 1206
               "version": "4.6.0",
1208 1207
               "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
1209 1208
               "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
1210
-              "dev": true,
1211
-              "optional": true
1209
+              "dev": true
1212 1210
             }
1213 1211
           }
1214 1212
         },
@@ -1417,7 +1415,6 @@
1417 1415
               "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
1418 1416
               "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1419 1417
               "dev": true,
1420
-              "optional": true,
1421 1418
               "requires": {
1422 1419
                 "prelude-ls": "~1.1.2",
1423 1420
                 "type-check": "~0.3.2"
@@ -1552,8 +1549,7 @@
1552 1549
           "version": "1.1.0",
1553 1550
           "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz?cache=0&sync_timestamp=1562517919182&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-1.1.0.tgz",
1554 1551
           "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
1555
-          "dev": true,
1556
-          "optional": true
1552
+          "dev": true
1557 1553
         },
1558 1554
         "figures": {
1559 1555
           "version": "2.0.0",
@@ -1652,8 +1648,7 @@
1652 1648
               "version": "4.0.8",
1653 1649
               "resolved": "http://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz",
1654 1650
               "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
1655
-              "dev": true,
1656
-              "optional": true
1651
+              "dev": true
1657 1652
             },
1658 1653
             "rx-lite-aggregates": {
1659 1654
               "version": "4.0.8",
@@ -1685,8 +1680,7 @@
1685 1680
           "version": "0.3.1",
1686 1681
           "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz",
1687 1682
           "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1688
-          "dev": true,
1689
-          "optional": true
1683
+          "dev": true
1690 1684
         },
1691 1685
         "mute-stream": {
1692 1686
           "version": "0.0.7",

+ 53
- 0
src/components/CaseCard.vue 查看文件

@@ -0,0 +1,53 @@
1
+<template>
2
+  <el-card class="case-card" shadow="hover" :body-style="{ padding: '0px' }">
3
+    <img :src="thumb" class="image">
4
+    <div class="body">
5
+      <h3>{{title}}</h3>
6
+      <div class="bottom clearfix caption">
7
+        {{caption}}
8
+      </div>
9
+    </div>
10
+  </el-card>
11
+</template>
12
+
13
+<script>
14
+export default {
15
+  name: 'CaseCard',
16
+  props: [
17
+    'thumb',
18
+    'title',
19
+    'caption',
20
+  ],
21
+}
22
+</script>
23
+
24
+<style lang="less" scoped>
25
+.case-card {
26
+  width: 100%;
27
+  padding: 0;
28
+
29
+  .image {
30
+    width: 100%;
31
+  }
32
+
33
+  .body {
34
+    padding: 1.5rem;
35
+    text-align: left;
36
+
37
+    h3 {
38
+      margin: 0;
39
+      padding: 0;
40
+      font-weight: 400;
41
+      font-size: 3rem;
42
+      color: #000;
43
+      line-height: 1.2em;
44
+    }
45
+
46
+    .caption {
47
+      font-size: 2.4rem;
48
+      color: #727171;
49
+      line-height: 1.2em;
50
+    }
51
+  }
52
+}
53
+</style>

+ 25
- 23
src/components/Wheelplanting.vue 查看文件

@@ -37,43 +37,45 @@ export default {
37 37
     return {
38 38
       data: '',
39 39
       blogs: {},
40
+      swiper: undefined,
40 41
     };
41 42
   },
42 43
   components: {},
43 44
 
44 45
   mounted () {
45
-
46
-
47
-    new Swiper(".swiper-container", {
48
-      loop: true,
49
-      autoplay: true,
50
-      direction: "vertical",
51
-      observer: true,
52
-      observeSlideChildren: true,
53
-
54
-      pagination: {
55
-        el: ".swiper-pagination",
56
-        hideOnClick: true
57
-      }
58
-    });
59
-
60
-
61
-
62
-
63
-
46
+    this.initSwiper()
64 47
   },
65 48
   created () {
66 49
     // axios.get('http://localhost:8080/pc/carousel/list')
67 50
     request({
68 51
       ...apis.carousel.list,
69 52
     }).then(data => {
70
-
71 53
       this.blogs = data;
54
+      this.initSwiper()
72 55
     })
56
+  },
57
+  methods: {
58
+
59
+    initSwiper () {
60
+      if (!this.swiper) {
61
+        this.swiper = new Swiper(".swiper-container", {
62
+          // loop: true,
63
+          autoplay: true,
64
+          direction: "vertical",
65
+          observer: true,
66
+          observeSlideChildren: true,
67
+
68
+          pagination: {
69
+            el: ".swiper-pagination",
70
+            hideOnClick: true
71
+          }
72
+        });
73
+      } else {
74
+        this.swiper.update(true)
75
+      }
76
+    },
73 77
 
74
-
75
-
76
-  }
78
+  },
77 79
 };
78 80
 </script>
79 81
 

+ 1
- 2
src/config/api.js 查看文件

@@ -8,11 +8,10 @@ const apis = {
8 8
   },
9 9
   case: {
10 10
     cover: {
11
-      url: `${commPrefix}/case/cover`,
11
+      url: `${commPrefix}/cover`,
12 12
       method: 'get',
13 13
     },
14 14
 
15
-
16 15
     list: {
17 16
       url: `${commPrefix}/case/:type/list`,
18 17
       method: 'get',

+ 62
- 85
src/views/Case.vue 查看文件

@@ -7,8 +7,8 @@
7 7
 
8 8
     <div class="border-bottom">
9 9
       <div id="bs-example-navbar-collapse-2">
10
-        <button type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">全部案例</button>
11
-        <button v-for="cas in casetype" :key="cas" @click="classification(cas.typeName)" type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">{{cas.typeName}}</button>
10
+        <button type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px" @click="() => filterCase()">全部案例</button>
11
+        <button v-for="cas in casetype" :key="cas.id" @click="() => filterCase(cas)" type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">{{cas.typeName}}</button>
12 12
       </div>
13 13
     </div>
14 14
 
@@ -20,13 +20,13 @@
20 20
         <el-button class="btn-link" @click="drawer = true" type="button" style="margin-left: 16px;">全部案例</el-button>
21 21
       </div>
22 22
     </div>
23
-    <el-drawer :visible.sync="drawer" :direction="direction" :before-close="handleClose" :show-close="true" size="80%">
23
+    <el-drawer :visible.sync="drawer" :direction="direction" :show-close="true" size="80%">
24 24
       <div>
25 25
         <el-row>
26 26
           <el-col :span="24" :offset="6">
27 27
             <button type="button" class="btn-link" style="color:black;font-size: 24px;">全部案例</button>
28 28
           </el-col>
29
-          <el-col :span="24" :offset="6" v-for="cas in casetype" :key="cas" @click="classification(cas.typeName)">
29
+          <el-col :span="24" :offset="6" v-for="cas in casetype" :key="cas.id" @click="() => filterCase(cas)">
30 30
             <button type="button" class="btn-link" style="color:black;font-size: 24px">{{cas.typeName}}</button>
31 31
           </el-col>
32 32
           <el-col :span="24" :offset="6">
@@ -38,28 +38,15 @@
38 38
 
39 39
     <div class="contanier center-block dyn-main">
40 40
       <div class="row">
41
-        <div v-for="(item,index) in caselist" :key="index">
42
-          <div class="col-md-6 col-xs-6 ph">
43
-            <div class="ph-houver">
44
-              <a href="/details" style="text-decoration:none;">
45
-                <div :style="{background: `url(${item.caseCoverImg})`}" class="case-ph"></div>
46
-                <div class="text-left">
47
-                  <h2>{{item.caseTitle}}</h2>
48
-                  <P>{{item.caseSummary}}</P>
49
-                </div>
50
-              </a>
51
-            </div>
52
-          </div>
41
+        <div class="col-md-6 col-xs-6" v-for="(item,index) in caselist" :key="index" :class="{ marginTP: index > 1 }">
42
+          <case-card :thumb="item.caseCoverImg" :title="item.caseTitle" :caption="item.caseSummary"></case-card>
53 43
         </div>
54 44
       </div>
55 45
     </div>
56 46
 
57 47
     <div>
58
-      <button type="button" v-show="!allLoaded" class="btn btn-default" @click="add(++num)">加载更多</button>
59
-    </div>
60
-
61
-    <div v-show="allLoaded">
62
-      <p>已经到底了~更多案例尽请期待~</p>
48
+      <button type="button" v-if="!allLoaded" class="btn btn-default" @click="more">加载更多</button>
49
+      <p v-else>已经到底了~更多案例尽请期待~</p>
63 50
     </div>
64 51
   </div>
65 52
 </template>
@@ -70,60 +57,51 @@
70 57
 
71 58
 import request from '../../utils/request'
72 59
 import apis from '../config/api'
60
+import CaseCard from '../components/CaseCard'
73 61
 
74 62
 export default {
75
-  name: 'case',
63
+  name: 'Case',
64
+  components: {
65
+    CaseCard,
66
+  },
76 67
   data () {
77 68
     return {
78 69
       cover: {},
79 70
       casetype: [],
80 71
       caselist: [],
81
-      num: 1,
72
+      
73
+      conditions: {
74
+        pageNum: 0,
75
+        pageSize: 8,
76
+        caseType: '',
77
+      },
82 78
 
83 79
       allLoaded: false,//数据全部加载
84 80
       drawer: false,
85 81
       direction: 'rtl',
86 82
     }
87 83
   },
88
-  components: {
89
-
90
-  },
91 84
 
92 85
   created () {
93 86
     // window.console.log(this.cover, "543");
94 87
     // 封面
95 88
     request({
96 89
       ...apis.case.cover,
97
-
90
+      params: { type: 'case' }
98 91
     }).then(data => {
99 92
       this.cover = data[0];
100 93
     })
101 94
 
102
-
103
-    // axios.get('http://localhost:8080/pc/case/cover')
104
-
105 95
     // 分类
106 96
     // axios.get('http://localhost:8080/pc/caseType/list')
107 97
     request({
108 98
       ...apis.caseType.list,
109 99
     })
110 100
       .then(res => {
111
-
112
-        this.casetype = res.records;
113
-
101
+        this.casetype = (res.records || []).filter(x => x.type === 'case');
114 102
       })
115
-    // 内容http://localhost:8080/pc/case/{case}/list
116
-    request({
117
-      ...apis.case.list,
118
-      urlData: { type: 'case' },
119
-      params: { pageNum: this.num, pageSize: 8 }
120
-    }).then(con => {
121
-      // console.log(con,"124")
122
-      this.caselist = con.records;
123
-      // window.console.log(this.caselist, "543");
124
-    }).catch()
125
-
126 103
 
104
+    this.getCaseList()
127 105
   },
128 106
 
129 107
   computed: {
@@ -131,39 +109,43 @@ export default {
131 109
   },
132 110
 
133 111
   methods: {
134
-    add (a) {
135
-
136
-      console.log(this.num, "124")
137
-      request({
138
-        ...apis.case.list,
139
-        urlData: { type: 'case' },
140
-        params: { pageNum: a, pageSize: 8 }
141
-      }).then(con => {
142
-        console.log(con, "124")
143
-        this.caselist = this.caselist.concat(con.records);
144
-        if (con.total % 8) this.allLoaded = true;
145
-
146
-        // this.caselist = con.records;
147
-
112
+    getCaseList(filters = {}) {
113
+      const params = {
114
+            ...this.conditions,
115
+            ...filters
116
+          }
117
+
118
+      return new Promise((resolve, reject) => {
119
+        request({
120
+          ...apis.case.list,
121
+          params,
122
+          urlData: { type: 'case' },
123
+        }).then(con => {
124
+          if (con.current > 1) {
125
+            this.caselist = this.caselist.concat(con.records);
126
+          } else {
127
+            this.caselist = con.records;
128
+          }
129
+
130
+          this.conditions.pageNum = con.current
131
+          this.allLoaded = con.current >= con.pages
132
+          resolve(con)
133
+        }).catch((err) => {
134
+          window.console.error(err)
135
+          reject(err)
136
+        })
148 137
       })
149 138
     },
150 139
 
151
-    classification (Type) {
152
-      request({
153
-        ...apis.case.list,
154
-        urlData: { type: 'case' },
155
-        params: { pageNum: a, pageSize: 8 }
156
-      }).then(con => {
157
-        console.log(con, "124")
158
-        this.caselist = this.caselist.concat(con.records);
159
-
160
-
161
-
162
-
163
-      })
140
+    more () {
141
+      if (!this.allLoaded) {
142
+        this.getCaseList({ pageNum: this.conditions.pageNum + 1 })
143
+      }
164 144
     },
165 145
 
166
-
146
+    filterCase (caseType) {
147
+      this.getCaseList({ pageNum: 1, caseType: caseType ? caseType.id : '' })
148
+    },
167 149
   }
168 150
 
169 151
 
@@ -183,12 +165,10 @@ export default {
183 165
   display: none;
184 166
 }
185 167
 
186
-.ph {
187
-  padding: 4%;
188
-}
189 168
 .text-left {
190 169
   color: #000;
191 170
 }
171
+
192 172
 .case-ph {
193 173
     bottom: 0;
194 174
     width: 100%;
@@ -198,6 +178,12 @@ export default {
198 178
     background-size: 100% 100% !important;
199 179
   }
200 180
 
181
+  
182
+
183
+  .marginTP {
184
+    margin-top: 3rem;
185
+  }
186
+
201 187
 @media (min-width: 992px) {
202 188
   .main {
203 189
     display: -webkit-flex; /* Safari */
@@ -225,16 +211,7 @@ export default {
225 211
     color: #e03723;
226 212
     border: 1px solid #e03723;
227 213
   }
228
-  .ph {
229
-    padding: 12px 34px 0 34px;
230
-  }
231
-
232
-  .ph:hover .ph-houver {
233
-    transform: translate3d(0, -20px, 0);
234
-    /* margin-top: -20px; */
235
-    box-shadow: 0 20px 5px #888888;
236
-  }
237
-
214
+  
238 215
   .dyn-main {
239 216
     padding-top: 55px;
240 217
     width: 80%;

+ 60
- 47
src/views/Dynamic.vue 查看文件

@@ -7,8 +7,8 @@
7 7
 
8 8
     <div class="border-bottom">
9 9
       <div>
10
-        <button type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">全部案例</button>
11
-        <button v-for="cas in casetype" :key="cas" type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">{{cas.typeName}}</button>
10
+        <button type="button" class="btn-link" @click="() => filterCase()" style="color:black;font-size: 24px;padding: 25px">全部动态</button>
11
+        <button v-for="cas in casetype" :key="cas.id" @click="() => filterCase(cas)" type="button" class="btn-link" style="color:black;font-size: 24px;padding: 25px">{{cas.typeName}}</button>
12 12
       </div>
13 13
     </div>
14 14
 
@@ -18,35 +18,22 @@
18 18
           <div>选择想看的案例类型:</div>
19 19
         </div>
20 20
         <div class="col-xs-6">
21
-          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">全部案例</button>
21
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">全部动态</button>
22 22
         </div>
23 23
       </div>
24 24
     </div>
25 25
 
26 26
     <div class="contanier center-block dyn-main">
27 27
       <div class="row">
28
-        <div v-for="(item,index) in caselist" :key="index">
29
-          <div class="col-md-6 col-xs-6 ph">
30
-            <div class="ph-houver">
31
-              <a href="/details" style="text-decoration:none;">
32
-                <img :src="item.caseCoverImg" alt style="width:100%;" />
33
-                <div class="text-left">
34
-                  <h2>{{item.caseTitle}}</h2>
35
-                  <P>{{item.caseSummary}}</P>
36
-                </div>
37
-              </a>
38
-            </div>
39
-          </div>
28
+        <div class="col-md-6 col-xs-6" v-for="(item,index) in caselist" :key="index" :class="{ marginTP: index > 1 }">
29
+          <case-card :thumb="item.caseCoverImg" :title="item.caseTitle" :caption="item.caseSummary"></case-card>
40 30
         </div>
41 31
       </div>
42 32
     </div>
43 33
 
44 34
     <div>
45
-      <button type="button" class="btn btn-default" @click="add">加载更多</button>
46
-    </div>
47
-
48
-    <div v-if="show">
49
-      <p>已经到底了~更多案例尽请期待~</p>
35
+      <button type="button" class="btn btn-default" @click="more" v-if="!allLoaded">加载更多</button>
36
+      <p v-else>已经到底了~更多案例尽请期待~</p>
50 37
     </div>
51 38
   </div>
52 39
 </template>
@@ -57,6 +44,7 @@
57 44
 
58 45
 import request from '../../utils/request'
59 46
 import apis from '../config/api'
47
+import CaseCard from '../components/CaseCard'
60 48
 
61 49
 export default {
62 50
   name: 'dynamic',
@@ -65,20 +53,25 @@ export default {
65 53
       cover: {},
66 54
       casetype: [],
67 55
       caselist: [],
68
-      num: 1,
69
-      show: true,
56
+      
57
+      conditions: {
58
+        pageNum: 0,
59
+        pageSize: 8,
60
+        caseType: '',
61
+      },
62
+
63
+      allLoaded: false,//数据全部加载
70 64
     }
71 65
   },
72 66
   components: {
73
-
67
+    CaseCard,
74 68
   },
75 69
 
76 70
   created () {
77
-    // window.console.log(this.cover, "543");
78 71
     // 封面
79 72
     request({
80 73
       ...apis.case.cover,
81
-
74
+      params: { type: 'movement' },
82 75
     }).then(data => {
83 76
       this.cover = data[0];
84 77
     })
@@ -93,21 +86,11 @@ export default {
93 86
     })
94 87
       .then(res => {
95 88
         
96
-        this.casetype = res.records;
89
+        this.casetype = (res.records || []).filter(x => x.type === 'movement');
97 90
 
98 91
       })
99
-    // 内容http://localhost:8080/pc/case/{case}/list
100
-    request({
101
-      ...apis.case.list,
102
-      urlData: { type: 'case' },
103
-      params: { pageNum: 1, pageSize: 8 }
104
-    }).then(con => {
105
-      // console.log(con,"124")
106
-      this.caselist = con.records;
107
-      // window.console.log(this.caselist, "543");
108
-    }).catch()
109
-
110
-
92
+    
93
+    this.getCaseList()
111 94
   },
112 95
 
113 96
   computed: {
@@ -115,14 +98,43 @@ export default {
115 98
   },
116 99
 
117 100
   methods: {
118
-    add () {
101
+    getCaseList(filters = {}) {
102
+      const params = {
103
+            ...this.conditions,
104
+            ...filters
105
+          }
106
+
107
+      return new Promise((resolve, reject) => {
108
+        request({
109
+          ...apis.case.list,
110
+          params,
111
+          urlData: { type: 'movement' },
112
+        }).then(con => {
113
+          if (con.current > 1) {
114
+            this.caselist = this.caselist.concat(con.records);
115
+          } else {
116
+            this.caselist = con.records;
117
+          }
118
+
119
+          this.conditions.pageNum = con.current
120
+          this.allLoaded = con.current >= con.pages
121
+          resolve(con)
122
+        }).catch((err) => {
123
+          window.console.error(err)
124
+          reject(err)
125
+        })
126
+      })
127
+    },
119 128
 
120
-      // axios.get('http://localhost:8080/pc/case/case/list/?pageNum=2&pageSize=8')
121
-      //   .then(con => {
122
-      //     this.caselist = con.data.data.records;
123
-      //     window.console.log(this.caselist, "543");
124
-      //   })
125
-    }
129
+    more () {
130
+      if (!this.allLoaded) {
131
+        this.getCaseList({ pageNum: this.conditions.pageNum + 1 })
132
+      }
133
+    },
134
+
135
+    filterCase (caseType) {
136
+      this.getCaseList({ pageNum: 1, caseType: caseType ? caseType.id : '' })
137
+    },
126 138
   }
127 139
 
128 140
 
@@ -134,9 +146,10 @@ export default {
134 146
   display: none;
135 147
 }
136 148
 
137
-.ph {
138
-  padding: 4%;
149
+.marginTP {
150
+  margin-top: 3rem;
139 151
 }
152
+
140 153
 .text-left {
141 154
   color: #000;
142 155
 }