1002884655 преди 3 години
родител
ревизия
0c472f92b9
променени са 36 файла, в които са добавени 1133 реда и са изтрити 202 реда
  1. 10
    6
      src/assets/css/iconfont.css
  2. BIN
      src/assets/css/iconfont.eot
  3. 1
    1
      src/assets/css/iconfont.js
  4. 7
    0
      src/assets/css/iconfont.json
  5. 2
    0
      src/assets/css/iconfont.svg
  6. BIN
      src/assets/css/iconfont.ttf
  7. BIN
      src/assets/css/iconfont.woff
  8. BIN
      src/assets/css/iconfont.woff2
  9. 4
    0
      src/constants/api.js
  10. 43
    0
      src/pages/index/buildingList/components/FilterForArea/index.jsx
  11. 25
    0
      src/pages/index/buildingList/components/FilterForArea/index.scss
  12. 40
    0
      src/pages/index/buildingList/components/FilterForHouseType/index.jsx
  13. 25
    0
      src/pages/index/buildingList/components/FilterForHouseType/index.scss
  14. 37
    0
      src/pages/index/buildingList/components/FilterForMore/index.jsx
  15. 25
    0
      src/pages/index/buildingList/components/FilterForMore/index.scss
  16. 99
    0
      src/pages/index/buildingList/components/FilterForPrice/index.jsx
  17. 46
    0
      src/pages/index/buildingList/components/FilterForPrice/index.scss
  18. 109
    40
      src/pages/index/buildingList/index.jsx
  19. 11
    1
      src/pages/index/buildingList/index.scss
  20. 3
    0
      src/pages/index/courseDetail/index.config.js
  21. 86
    0
      src/pages/index/courseDetail/index.jsx
  22. 295
    0
      src/pages/index/courseDetail/index.scss
  23. 0
    7
      src/pages/index/helpToFindHouse/components/BuyHouse/index.jsx
  24. 0
    7
      src/pages/index/helpToFindHouse/components/HousePurchasing/index.jsx
  25. 0
    7
      src/pages/index/helpToFindHouse/components/RentingHouse/index.jsx
  26. 32
    23
      src/pages/index/helpToFindHouse/components/SubmitBuyHouseResult/index.jsx
  27. 12
    4
      src/pages/index/helpToFindHouse/index.jsx
  28. 24
    24
      src/pages/mine/components/MyCollectForActivity/index.jsx
  29. 23
    18
      src/pages/mine/components/MyCollectForBuilding/index.jsx
  30. 45
    11
      src/pages/mine/components/MyCollectForCourse/index.jsx
  31. 23
    18
      src/pages/mine/components/MyCollectForNews/index.jsx
  32. 11
    9
      src/pages/mine/components/MyCourseListItem/index.jsx
  33. 39
    8
      src/pages/mine/feedBack/index.jsx
  34. 45
    12
      src/pages/mine/myCourse/index.jsx
  35. 5
    6
      src/pages/mine/residentManager/index.jsx
  36. 6
    0
      src/routes.js

+ 10
- 6
src/assets/css/iconfont.css
Файловите разлики са ограничени, защото са твърде много
Целия файл


BIN
src/assets/css/iconfont.eot Целия файл


+ 1
- 1
src/assets/css/iconfont.js
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 7
- 0
src/assets/css/iconfont.json Целия файл

@@ -5,6 +5,13 @@
5 5
   "css_prefix_text": "icon-",
6 6
   "description": "",
7 7
   "glyphs": [
8
+    {
9
+      "icon_id": "4282091",
10
+      "name": "勾",
11
+      "font_class": "gou1",
12
+      "unicode": "e83c",
13
+      "unicode_decimal": 59452
14
+    },
8 15
     {
9 16
       "icon_id": "22219715",
10 17
       "name": "电  话",

+ 2
- 0
src/assets/css/iconfont.svg Целия файл

@@ -14,6 +14,8 @@
14 14
     />
15 15
       <missing-glyph />
16 16
       
17
+      <glyph glyph-name="gou1" unicode="&#59452;" d="M53.730509 348.7232a31.93344 31.93344 0 0 1-45.21984-1.7664 32.16896 32.16896 0 0 1 1.76128-45.3632l359.99744-334.01856a31.93344 31.93344 0 0 1 46.9504 3.80416L1017.217229 741.7344a32.16384 32.16384 0 0 1-5.51424 45.056 31.93344 31.93344 0 0 1-44.91776-5.5296L388.194509 38.4 53.730509 348.7232z"  horiz-adv-x="1024" />
18
+      
17 19
       <glyph glyph-name="dianhua1" unicode="&#58889;" d="M512 805.875a421.875 421.875 0 1 0 0-843.75A421.875 421.875 0 1 0 512 805.875zM422.46874982 636.84375027c-20.15624982 3.42187509-37.17187509-3.46875019-63.65624991-20.6249999l-7.59375-4.92187556-6.89062528-4.35937444c-52.50000037-32.43749991-30.32812491-166.12499982 55.3125001-291.46875074 85.35937527-125.06250037 204.14062491-198.18749981 255.93750054-166.21875l17.53124964 10.31250037c22.26562481 13.26562537 34.78125037 24.046875 41.24999982 39.60937491 8.71874973 20.85937537 2.01562482 44.24999991-20.53124973 70.64062536-36.46875037 42.65625009-64.07812491 52.68749991-95.34375 38.4375001a130.40625009 130.40625009 0 0 1-14.29687491-7.68750019l-13.82812482-8.57812527c-10.45312482-6.46875027-42.51562482 24.23437537-80.9531249 80.34375036-37.87499982 55.45312537-54.14062527 95.34375-44.53125046 101.34374936 0.93750018 0.56250027 10.96875 6.65624982 13.78124972 8.4375 39.28125009 24.70312463 45.93749991 51.93750009 15.46875056 109.265625-14.43750019 27.14062527-31.54687482 41.99999963-51.65625037 45.46875064z"  horiz-adv-x="1024" />
18 20
       
19 21
       <glyph glyph-name="pengyouquan" unicode="&#58908;" d="M690.31560747 504.55256533L690.31560747 795.20317973c0 0-142.22810027 76.24640853-308.25584747 17.45678507L690.31560747 504.55256533zM717.24247787 333.56273812999996L717.24247787 783.20184427c0 0 168.13875947-76.1961984 215.5219296-261.2940064L717.24247787 333.56273812999996zM626.7887584 202.86770773l310.38978133 291.89168c0 0 54.92016107-89.28906027-26.97926293-291.89168L626.7887584 202.86770773zM468.2980032 165.85949867l419.21498453 0c0 0-50.60754027-137.16778347-231.73874026-193.8005504L468.2980032 165.85949867zM331.4522208 258.45806719999996l0-273.25822933c0 0 108.87650453-69.72344533 295.33653867-22.91005227L331.4522208 258.45806719999996zM88.9281056 244.32388906999995L301.274784 434.8520416l0-433.28694613C301.274784 1.5661866699999791 172.9843872 46.09829013000001 88.9281056 244.32388906999995zM83.54688 274.79821973c0 0-48.5740256 156.73121493 19.36477333 292.85768107l292.06523307 0L83.54688 274.79821973zM121.26130667 598.20445653c0 0 61.44312427 139.30062613 228.49035733 204.66123947l199.3531456-204.66123947L121.26130667 598.20445653z"  horiz-adv-x="1024" />

BIN
src/assets/css/iconfont.ttf Целия файл


BIN
src/assets/css/iconfont.woff Целия файл


BIN
src/assets/css/iconfont.woff2 Целия файл


+ 4
- 0
src/constants/api.js Целия файл

@@ -12,6 +12,10 @@ export const pathname = '/api/wx'
12 12
 
13 13
 export const resolvePath = api => `${host + pathname}/${api}`
14 14
 
15
+// 课程
16
+export const API_COURSE_LIST = resolvePath('curriculum') // 课程列表
17
+export const API_MY_COLLECT_COURSE_LIST = resolvePath('curriculum/save') // 我收藏的课程列表
18
+
15 19
 // 特价房源
16 20
 export const API_SPECIAL_ROOM_LIST = resolvePath('buildingSpecialRoom') // 特价房源列表
17 21
 

+ 43
- 0
src/pages/index/buildingList/components/FilterForArea/index.jsx Целия файл

@@ -0,0 +1,43 @@
1
+import { useState } from 'react'
2
+import './index.scss'
3
+
4
+export default function FilterForArea (props) {
5
+
6
+  const { change = () => {}, defaultValue = '-' } = props
7
+  const [AreaList] = useState([
8
+    {name: '不限', id: '-'},
9
+    {name: '50㎡以下', id: '0-50'},
10
+    {name: '50-70㎡', id: '50-70'},
11
+    {name: '70-90㎡', id: '70-90'},
12
+    {name: '90-110㎡', id: '90-110'},
13
+    {name: '110-130㎡', id: '110-130'},
14
+    {name: '130-150㎡', id: '130-150'},
15
+    {name: '150-200㎡', id: '150-200'},
16
+    {name: '200㎡以上', id: '200-'},
17
+  ])
18
+  const [CurrentId, setCurrentId] = useState(defaultValue)
19
+
20
+  const CutArea = (id) => {
21
+    return () => {
22
+      setCurrentId(id)
23
+      change({name: 'area', value: id})
24
+    }
25
+  }
26
+
27
+  return (
28
+    <view className='components FilterForArea'>
29
+      {
30
+        AreaList.map((item, index) => (
31
+          <view key={`ListItem${index}`} className={CurrentId === item.id ? 'flex-h active' : 'flex-h'} onClick={CutArea(item.id)}>
32
+            <text>{item.name}</text>
33
+            <view className='flex-item'></view>
34
+            {
35
+              CurrentId === item.id &&
36
+              <text className='iconfont icon-gou1'></text>
37
+            }
38
+          </view>
39
+        ))
40
+      }
41
+    </view>
42
+  )
43
+}

+ 25
- 0
src/pages/index/buildingList/components/FilterForArea/index.scss Целия файл

@@ -0,0 +1,25 @@
1
+.components.FilterForArea {
2
+  padding: 0 30px;
3
+  background: #fff;
4
+  position: relative;
5
+  overflow: hidden;
6
+  >view {
7
+    padding: 0 30px;
8
+    position: relative;
9
+    overflow: hidden;
10
+    border-bottom: 2px solid rgba(0, 0, 0, 0.08);
11
+    align-items: center;
12
+    &.active {
13
+      >text {
14
+        color: #193C83;
15
+        &:first-child {
16
+          font-weight: bold;
17
+        }
18
+      }
19
+    }
20
+    >text {
21
+      font-size: 28px;
22
+      line-height: 80px;
23
+    }
24
+  }
25
+}

+ 40
- 0
src/pages/index/buildingList/components/FilterForHouseType/index.jsx Целия файл

@@ -0,0 +1,40 @@
1
+import { useState } from 'react'
2
+import './index.scss'
3
+
4
+export default function FilterForHouseType (props) {
5
+
6
+  const { change = () => {}, defaultValue = '-' } = props
7
+  const [HouseTypeList] = useState([
8
+    {name: '不限', id: '-'},
9
+    {name: '一室', id: 1},
10
+    {name: '两室', id: 2},
11
+    {name: '三室', id: 3},
12
+    {name: '四室', id: 4},
13
+    {name: '五室以上', id: 5}
14
+  ])
15
+  const [CurrentId, setCurrentId] = useState(defaultValue)
16
+
17
+  const CutArea = (id) => {
18
+    return () => {
19
+      setCurrentId(id)
20
+      change({name: 'houseType', value: id})
21
+    }
22
+  }
23
+
24
+  return (
25
+    <view className='components FilterForHouseType'>
26
+      {
27
+        HouseTypeList.map((item, index) => (
28
+          <view key={`ListItem${index}`} className={CurrentId === item.id ? 'flex-h active' : 'flex-h'} onClick={CutArea(item.id)}>
29
+            <text>{item.name}</text>
30
+            <view className='flex-item'></view>
31
+            {
32
+              CurrentId === item.id &&
33
+              <text className='iconfont icon-gou1'></text>
34
+            }
35
+          </view>
36
+        ))
37
+      }
38
+    </view>
39
+  )
40
+}

+ 25
- 0
src/pages/index/buildingList/components/FilterForHouseType/index.scss Целия файл

@@ -0,0 +1,25 @@
1
+.components.FilterForHouseType {
2
+  padding: 0 30px;
3
+  background: #fff;
4
+  position: relative;
5
+  overflow: hidden;
6
+  >view {
7
+    padding: 0 30px;
8
+    position: relative;
9
+    overflow: hidden;
10
+    border-bottom: 2px solid rgba(0, 0, 0, 0.08);
11
+    align-items: center;
12
+    &.active {
13
+      >text {
14
+        color: #193C83;
15
+        &:first-child {
16
+          font-weight: bold;
17
+        }
18
+      }
19
+    }
20
+    >text {
21
+      font-size: 28px;
22
+      line-height: 80px;
23
+    }
24
+  }
25
+}

+ 37
- 0
src/pages/index/buildingList/components/FilterForMore/index.jsx Целия файл

@@ -0,0 +1,37 @@
1
+import { useState } from 'react'
2
+import './index.scss'
3
+
4
+export default function FilterForMore (props) {
5
+
6
+  const { change = () => {}, defaultValue = '-' } = props
7
+  const [BuildingTypeList] = useState([
8
+    {name: '不限', id: '-'},
9
+    {name: '别墅', id: '1'},
10
+    {name: '高层', id: '2'}
11
+  ])
12
+  const [CurrentId, setCurrentId] = useState(defaultValue)
13
+
14
+  const CutArea = (id) => {
15
+    return () => {
16
+      setCurrentId(id)
17
+      change({name: 'buildingType', value: id})
18
+    }
19
+  }
20
+
21
+  return (
22
+    <view className='components FilterForMore'>
23
+      {
24
+        BuildingTypeList.map((item, index) => (
25
+          <view key={`ListItem${index}`} className={CurrentId === item.id ? 'flex-h active' : 'flex-h'} onClick={CutArea(item.id)}>
26
+            <text>{item.name}</text>
27
+            <view className='flex-item'></view>
28
+            {
29
+              CurrentId === item.id &&
30
+              <text className='iconfont icon-gou1'></text>
31
+            }
32
+          </view>
33
+        ))
34
+      }
35
+    </view>
36
+  )
37
+}

+ 25
- 0
src/pages/index/buildingList/components/FilterForMore/index.scss Целия файл

@@ -0,0 +1,25 @@
1
+.components.FilterForMore {
2
+  padding: 0 30px;
3
+  background: #fff;
4
+  position: relative;
5
+  overflow: hidden;
6
+  >view {
7
+    padding: 0 30px;
8
+    position: relative;
9
+    overflow: hidden;
10
+    border-bottom: 2px solid rgba(0, 0, 0, 0.08);
11
+    align-items: center;
12
+    &.active {
13
+      >text {
14
+        color: #193C83;
15
+        &:first-child {
16
+          font-weight: bold;
17
+        }
18
+      }
19
+    }
20
+    >text {
21
+      font-size: 28px;
22
+      line-height: 80px;
23
+    }
24
+  }
25
+}

+ 99
- 0
src/pages/index/buildingList/components/FilterForPrice/index.jsx Целия файл

@@ -0,0 +1,99 @@
1
+import { useState } from 'react'
2
+import './index.scss'
3
+
4
+export default function FilterForPrice (props) {
5
+
6
+  const { change = () => { }, priceType = 'average', price = '-' } = props
7
+  const [PriceTypeList] = useState([
8
+    { name: '单价', id: 'average' },
9
+    { name: '总价', id: 'total' }
10
+  ])
11
+  const [CurrentTypeId, setCurrentTypeId] = useState(priceType || 'average')
12
+  const [AverageList] = useState([
13
+    { name: '不限', id: '-' },
14
+    { name: '10000/㎡以下', id: '0-10000' },
15
+    { name: '10000-20000元/㎡', id: '10000-20000' },
16
+    { name: '20000-30000元/㎡', id: '20000-30000' },
17
+    { name: '30000-50000元/㎡', id: '30000-50000' },
18
+    { name: '50000-70000元/㎡', id: '50000-70000' },
19
+    { name: '70000-100000元/㎡', id: '70000-100000' },
20
+    { name: '100000元/㎡以上', id: '100000-' },
21
+  ])
22
+  const [TotalList] = useState([
23
+    { name: '不限', id: '-' },
24
+    { name: '100万以下', id: '0-1000000' },
25
+    { name: '100-150万', id: '1000000-1500000' },
26
+    { name: '150-200万', id: '1500000-2000000' },
27
+    { name: '200-250万', id: '2000000-2500000' },
28
+    { name: '250-500万', id: '2500000-5000000' },
29
+    { name: '500-1000万', id: '5000000-10000000' },
30
+    { name: '1000万以上', id: '10000000-' },
31
+  ])
32
+  const [CurrentId, setCurrentId] = useState(price || '-')
33
+
34
+  const CutPrice = (id) => {
35
+    return () => {
36
+      setCurrentId(id)
37
+      change({ priceType: CurrentTypeId, price: id })
38
+    }
39
+  }
40
+
41
+  const CutType = (id) => {
42
+    return () => {
43
+      setCurrentTypeId(id)
44
+    }
45
+  }
46
+
47
+  return (
48
+    <view className='components FilterForPrice flex-h'>
49
+      <view className='TypeList'>
50
+        {
51
+          PriceTypeList.map((item, index) => (
52
+            <text key={`typeItem${index}`} className={CurrentTypeId === item.id ? 'active' : ''} onClick={CutType(item.id)}>{item.name}</text>
53
+          ))
54
+        }
55
+      </view>
56
+      <view className='flex-item'>
57
+
58
+        {/* 单价 */}
59
+        {
60
+          CurrentTypeId === 'average' &&
61
+          <view>
62
+            {
63
+              AverageList.map((item, index) => (
64
+                <view key={`ListItem${index}`} className={CurrentId === item.id ? 'flex-h active' : 'flex-h'} onClick={CutPrice(item.id)}>
65
+                  <text>{item.name}</text>
66
+                  <view className='flex-item'></view>
67
+                  {
68
+                    CurrentId === item.id &&
69
+                    <text className='iconfont icon-gou1'></text>
70
+                  }
71
+                </view>
72
+              ))
73
+            }
74
+          </view>
75
+        }
76
+
77
+        {/* 总价 */}
78
+        {
79
+          CurrentTypeId === 'total' &&
80
+          <view>
81
+            {
82
+              TotalList.map((item, index) => (
83
+                <view key={`ListItem${index}`} className={CurrentId === item.id ? 'flex-h active' : 'flex-h'} onClick={CutPrice(item.id)}>
84
+                  <text>{item.name}</text>
85
+                  <view className='flex-item'></view>
86
+                  {
87
+                    CurrentId === item.id &&
88
+                    <text className='iconfont icon-gou1'></text>
89
+                  }
90
+                </view>
91
+              ))
92
+            }
93
+          </view>
94
+        }
95
+
96
+      </view>
97
+    </view>
98
+  )
99
+}

+ 46
- 0
src/pages/index/buildingList/components/FilterForPrice/index.scss Целия файл

@@ -0,0 +1,46 @@
1
+.components.FilterForPrice {
2
+  padding: 0 30px;
3
+  background: #fff;
4
+  position: relative;
5
+  overflow: hidden;
6
+  align-items: flex-start;
7
+  >.TypeList {
8
+    width: 160px;
9
+    text-align: center;
10
+    >text {
11
+      font-size: 28px;
12
+      line-height: 80px;
13
+      display: block;
14
+      text-align: center;
15
+      border-bottom: 2px solid rgba(0, 0, 0, 0.08);
16
+      &.active {
17
+        color: #193C83;
18
+        font-weight: bold;
19
+      }
20
+    }
21
+  }
22
+  >.flex-item {
23
+    border-left: 2px solid rgba(0, 0, 0, 0.08);
24
+    >view {
25
+      >view {
26
+        position: relative;
27
+        overflow: hidden;
28
+        border-bottom: 2px solid rgba(0, 0, 0, 0.08);
29
+        align-items: center;
30
+        &.active {
31
+          >text {
32
+            color: #193C83;
33
+            &:first-child {
34
+              font-weight: bold;
35
+            }
36
+          }
37
+        }
38
+        >text {
39
+          font-size: 28px;
40
+          line-height: 80px;
41
+          text-indent: 30px;
42
+        }
43
+      }
44
+    }
45
+  }
46
+}

+ 109
- 40
src/pages/index/buildingList/index.jsx Целия файл

@@ -1,43 +1,66 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2 2
 import withLayout from '@/layout'
3
-import './index.scss'
4 3
 import { ScrollView } from '@tarojs/components'
5 4
 import '@/assets/css/iconfont.css'
6
-import ProjectListItem from '../../../components/ProjectListItem/index'
7 5
 import { useSelector } from 'react-redux'
8 6
 import { fetch } from '@/utils/request'
9 7
 import { API_INDEX_PROJECTS } from '@/constants/api'
8
+import ProjectListItem from '@/components/ProjectListItem/index'
9
+import './index.scss'
10
+import FilterForArea from './components/FilterForArea/index'
11
+import FilterForPrice from './components/FilterForPrice/index'
12
+import FilterForHouseType from './components/FilterForHouseType/index'
13
+import FilterForMore from './components/FilterForMore/index'
10 14
 
11
-export default withLayout((props) => {
15
+export default withLayout(() => {
12 16
 
13
-  const [PageProps] = useState(props)
14 17
   const city = useSelector(state => state.city)
15 18
   const [PageList, setPageList] = useState([])
16
-  const [pageNum, setPageNum] = useState(null)
19
+  const [pageNumber, setPageNumber] = useState(1)
17 20
   const [pageSize] = useState(10)
18 21
   const [IsPull, setPull] = useState(false)
19
-  const [DataLock, setDataLock] = useState(false)
20
-  const [PullTimer, setPullTimer] = useState(null)
22
+  const [HasNextPage, setHasNextPage] = useState(true)
23
+  const [FilterMenus] = useState([
24
+    { name: '面积', id: 1 },
25
+    { name: '价格', id: 2 },
26
+    { name: '户型', id: 3 },
27
+    { name: '更多', id: 4 }
28
+  ])
29
+  const [CurrentFilter, setCurrentFilter] = useState(null)
30
+  const [FilterData, setFilterData] = useState({
31
+    area: '-',
32
+    price: '-',
33
+    priceType: null,
34
+    houseType: '-',
35
+    buildingType: '-'
36
+  })
21 37
 
22 38
   useEffect(() => {
23
-    if(city.curCity.name) {
24
-      setPageNum(1)
39
+    if (city.curCity.name) {
40
+      GetProjectList()
25 41
     }
26
-  }, [city])
42
+  }, [pageNumber, city])
27 43
 
28 44
   useEffect(() => {
29
-    if(pageNum !== null && !DataLock) {
30
-      setDataLock(true)
45
+    if(pageNumber === 1) {
31 46
       GetProjectList()
47
+    } else {
48
+      setPageNumber(1)
32 49
     }
33
-  }, [pageNum])
50
+  }, [FilterData])
34 51
 
35 52
   const GetProjectList = () => { // 获取项目列表
36
-    fetch({url: API_INDEX_PROJECTS, method: 'get', payload: {cityId: city.curCity.id, pageNum, pageSize}}).then((res) => {
37
-      setPageList(res.records || [])
38
-      setDataLock(false)
53
+    setHasNextPage(false)
54
+    let Data = {...FilterData}
55
+    for(let key in Data) {
56
+      Data[key] = Data[key] === '-' ? null : Data[key]
57
+    }
58
+    fetch({ url: API_INDEX_PROJECTS, method: 'get', payload: { cityId: city.curCity.id, pageNumber, pageSize, ...Data } }).then((res) => {
59
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
60
+      setHasNextPage(res.current < res.pages)
61
+      setPull(false)
62
+      setCurrentFilter(null)
39 63
     }).catch(() => {
40
-      setDataLock(false)
41 64
     })
42 65
   }
43 66
 
@@ -45,12 +68,39 @@ export default withLayout((props) => {
45 68
     setPull(true)
46 69
   }
47 70
 
71
+  const PageLoadMore = () => { // 页面上拉加载更多
72
+    if (HasNextPage) {
73
+      setPageNumber(pageNumber + 1)
74
+    }
75
+  }
76
+
77
+  const CutFilter = (id) => {
78
+    return () => {
79
+      setCurrentFilter(id === CurrentFilter ? null : id)
80
+    }
81
+  }
82
+
83
+  const FilterChange = (e) => {
84
+    let Data = { ...FilterData }
85
+    Data[e.name] = e.value
86
+    setFilterData(Data)
87
+  }
88
+
89
+  const PriceChange = (e) => {
90
+    let Data = { ...FilterData }
91
+    for (let key in e) {
92
+      Data[key] = e[key]
93
+    }
94
+    setFilterData(Data)
95
+  }
96
+
48 97
   useEffect(() => { // 下拉刷新触发
49 98
     if (IsPull) {
50
-      clearTimeout(PullTimer)
51
-      setPullTimer(setTimeout(() => {
52
-        setPull(false)
53
-      }, 2000))
99
+      if (pageNumber === 1) {
100
+        GetProjectList()
101
+      } else {
102
+        setPageNumber(1)
103
+      }
54 104
     }
55 105
   }, [IsPull])
56 106
 
@@ -66,29 +116,48 @@ export default withLayout((props) => {
66 116
 
67 117
       <view className='Filter'>
68 118
         <view className='flex-h'>
69
-          <view className='flex-item'>
70
-            <text>区域</text>
71
-            <text className='iconfont icon-sanjiaoxingdown'></text>
72
-          </view>
73
-          <view className='flex-item'>
74
-            <text>价格</text>
75
-            <text className='iconfont icon-sanjiaoxingdown'></text>
76
-          </view>
77
-          <view className='flex-item'>
78
-            <text>户型</text>
79
-            <text className='iconfont icon-sanjiaoxingdown'></text>
80
-          </view>
81
-          <view className='flex-item'>
82
-            <text>更多</text>
83
-            <text className='iconfont icon-sanjiaoxingdown'></text>
84
-          </view>
119
+          {
120
+            FilterMenus.map((item, index) => (
121
+              <view className='flex-item' key={`FilterMenusItem-${index}`} onClick={CutFilter(item.id)}>
122
+                <text>{item.name}</text>
123
+                <text className={CurrentFilter === item.id ? 'iconfont icon-sanjiaoxingup' : 'iconfont icon-sanjiaoxingdown'}></text>
124
+              </view>
125
+            ))
126
+          }
85 127
           <text className='iconfont icon-paixu Sort'></text>
86 128
         </view>
87 129
       </view>
88 130
 
89 131
       <view className='flex-item'>
90
-        <view>
91
-          <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
132
+        <view className='FilterContainer' style={{ display: !!CurrentFilter ? 'block' : 'none' }}>
133
+
134
+          {/* 面积 */}
135
+          {
136
+            CurrentFilter === 1 &&
137
+            <FilterForArea change={FilterChange} defaultValue={FilterData.area}></FilterForArea>
138
+          }
139
+
140
+          {/* 价格 */}
141
+          {
142
+            CurrentFilter === 2 &&
143
+            <FilterForPrice change={PriceChange} priceType={FilterData.priceType} price={FilterData.price}></FilterForPrice>
144
+          }
145
+
146
+          {/* 户型 */}
147
+          {
148
+            CurrentFilter === 3 &&
149
+            <FilterForHouseType change={FilterChange} defaultValue={FilterData.houseType}></FilterForHouseType>
150
+          }
151
+
152
+          {/* 更多 */}
153
+          {
154
+            CurrentFilter === 4 &&
155
+            <FilterForMore change={FilterChange} defaultValue={FilterData.buildingType}></FilterForMore>
156
+          }
157
+
158
+        </view>
159
+        <view className='ScrollContainer'>
160
+          <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
92 161
             <view className='PageContent'>
93 162
               <view className='ProjectList'>
94 163
                 {

+ 11
- 1
src/pages/index/buildingList/index.scss Целия файл

@@ -60,12 +60,22 @@
60 60
   > .flex-item {
61 61
     position: relative;
62 62
     overflow: hidden;
63
-    > view {
63
+    >.FilterContainer {
64
+      width: 100%;
65
+      position: absolute;
66
+      left: 0;
67
+      top: 0;
68
+      bottom: 0;
69
+      z-index: 2;
70
+      background: rgba(0, 0, 0, 0.6);
71
+    }
72
+    > .ScrollContainer {
64 73
       width: 100%;
65 74
       position: absolute;
66 75
       left: 0;
67 76
       top: 0;
68 77
       bottom: 0;
78
+      z-index: 1;
69 79
       > scroll-view {
70 80
         width: 100%;
71 81
         height: 100%;

+ 3
- 0
src/pages/index/courseDetail/index.config.js Целия файл

@@ -0,0 +1,3 @@
1
+export default {
2
+  navigationBarTitleText: '课程详情'
3
+}

+ 86
- 0
src/pages/index/courseDetail/index.jsx Целия файл

@@ -0,0 +1,86 @@
1
+
2
+import withLayout from '@/layout'
3
+import { ScrollView, Image, Swiper, SwiperItem } from '@tarojs/components'
4
+// import Taro from '@tarojs/taro'
5
+import { getImgURL } from '@/utils/image'
6
+import '@/assets/css/iconfont.css'
7
+import './index.scss'
8
+
9
+export default withLayout((props) => {
10
+  const { List = [] } = props
11
+
12
+  return (
13
+    <view className='Page courseDetail'>
14
+      <ScrollView scroll-y>
15
+        <view className='Content'>
16
+
17
+          {/* 轮播图 or 主图 */}
18
+          <view className='Banner'>
19
+            <view>
20
+              <Swiper autoplay interval={2000} indicator-dots>
21
+                {
22
+                  List.map((item, index) => (
23
+                    <SwiperItem key={`Banner-${index}`}>
24
+                      <view className='swiper-item'>
25
+                        <Image mode='aspectFill' className='centerLabel' src={getImgURL(item.image)} />
26
+                      </view>
27
+                    </SwiperItem>
28
+                  ))
29
+                }
30
+              </Swiper>
31
+            </view>
32
+          </view>
33
+
34
+          {/* 楼盘信息 */}
35
+          <view className='BuildingInfo'>
36
+
37
+            <view className='flex-h Title'>
38
+              <view className='flex-item'>
39
+                <text className='Name'>句容·恒大养生谷</text>
40
+                <view className='Address flex-h'>
41
+                  <view className='flex-item'>
42
+                    <text>课程内容课程内容课程内容课程内容课程内容课程内容课程内容..</text>
43
+                  </view>
44
+                </view>
45
+                <text className='Time'>4568人在阅读</text>
46
+              </view>
47
+              <view className='Option'>
48
+                <view>
49
+                  <text className='iconfont icon-fenxiang1'></text>
50
+                  <text>分享</text>
51
+                </view>
52
+                <view>
53
+                  <text className='iconfont icon-haibao'></text>
54
+                  <text>海报</text>
55
+                </view>
56
+              </view>
57
+            </view>
58
+
59
+          </view>
60
+
61
+          {/* 详情介绍 */}
62
+          <view className='Desc'>
63
+            <view className='Title'>
64
+              <text>课程详情</text>
65
+            </view>
66
+            <view className='DescContent'></view>
67
+          </view>
68
+
69
+          <view className='Bottom'>
70
+            <view>
71
+              <view>
72
+                <text className='iconfont icon-shengming'></text>
73
+                <text>免责声明</text>
74
+              </view>
75
+              <view>
76
+                <text>&emsp;&emsp;以上价格仅供参考,具体一房一价的信息以售楼处展示为准。房屋位置交通、医疗、教育、商业等配套信息,来源于第三方不作为要约,仅供参考,双方具体权利义务应以法律规定及买卖合同约定为准。本平台对项目周边文化教育的介绍旨在提供相关信息1 意味着信息发布方对就学安排作出承诺。相关教育资首页信息存在调整的可能,应以政府教育主管部门门及办学颁布的政策规定为准。详情请仔细阅读</text>
77
+                <text className='active'>《新联宝使用免责条款》</text>
78
+              </view>
79
+            </view>
80
+          </view>
81
+
82
+        </view>
83
+      </ScrollView>
84
+    </view>
85
+  )
86
+})

+ 295
- 0
src/pages/index/courseDetail/index.scss Целия файл

@@ -0,0 +1,295 @@
1
+.Page.courseDetail {
2
+  width: 100%;
3
+  height: 100%;
4
+  > scroll-view {
5
+    width: 100%;
6
+    height: 100%;
7
+    .Content {
8
+      position: relative;
9
+      overflow: hidden;
10
+      min-height: 100vh;
11
+      >.Banner {
12
+        width: 100%;
13
+        padding-bottom: 56%;
14
+        position: relative;
15
+        overflow: hidden;
16
+        background: #eee;
17
+        >view {
18
+          width: 100%;
19
+          position: absolute;
20
+          left: 0;
21
+          top: 0;
22
+          bottom: 0;
23
+          overflow: hidden;
24
+          > swiper {
25
+            width: 100%;
26
+            height: 100%;
27
+            .swiper-item {
28
+              width: 100%;
29
+              height: 100%;
30
+              position: relative;
31
+              overflow: hidden;
32
+              > image {
33
+                width: 100%;
34
+                height: 100%;
35
+                border-radius: 8px;
36
+              }
37
+            }
38
+          }
39
+        }
40
+      }
41
+      >.BuildingInfo {
42
+        padding: 0 30px;
43
+        position: relative;
44
+        overflow: hidden;
45
+        margin-top: 40px;
46
+        >.Title {
47
+          align-items: center;
48
+          >.flex-item {
49
+            margin-right: 30px;
50
+            position: relative;
51
+            overflow: hidden;
52
+            padding-right: 30px;
53
+            &::after {
54
+              content: '';
55
+              width: 2px;
56
+              height: 100%;
57
+              background: rgba(0, 0, 0, 0.1);
58
+              display: block;
59
+              position: absolute;
60
+              right: 0;
61
+              top: 0;
62
+            }
63
+            >.Name {
64
+              display: block;
65
+              font-size: 34px;
66
+              font-weight: bold;
67
+              line-height: 1;
68
+              white-space: nowrap;
69
+              overflow: hidden;
70
+              text-overflow: ellipsis;
71
+            }
72
+            >.Address {
73
+              align-items: center;
74
+              margin-top: 28px;
75
+              >.iconfont {
76
+                font-size: 20px;
77
+                color: #666;
78
+                line-height: 1.1;
79
+              }
80
+              >.flex-item {
81
+                margin-left: 4px;
82
+                >text {
83
+                  display: block;
84
+                  font-size: 26px;
85
+                  font-weight: bold;
86
+                  white-space: nowrap;
87
+                  overflow: hidden;
88
+                  text-overflow: ellipsis;
89
+                  line-height: 1.1;
90
+                }
91
+              }
92
+              >.Price {
93
+                font-size: 26px;
94
+                font-weight: bold;
95
+                color: #FF0000;
96
+                margin-left: 30px;
97
+                line-height: 1.1;
98
+              }
99
+            }
100
+            >.Time {
101
+              display: block;
102
+              font-size: 24px;
103
+              color: #666;
104
+              white-space: nowrap;
105
+              overflow: hidden;
106
+              text-overflow: ellipsis;
107
+              margin-top: 28px;
108
+            }
109
+          }
110
+          >.Option {
111
+            >view {
112
+              font-size: 0;
113
+              white-space: nowrap;
114
+              text-align: center;
115
+              margin-top: 30px;
116
+              padding-right: 30px;
117
+              &:first-child {
118
+                margin-top: 0;
119
+              }
120
+              >text {
121
+                display: inline-block;
122
+                vertical-align: middle;
123
+                font-size: 24px;
124
+                margin-left: 10px;
125
+                &:first-child {
126
+                  margin-left: 0;
127
+                  font-size: 30px;
128
+                }
129
+              }
130
+            }
131
+          }
132
+        }
133
+        >.CountDown {
134
+          position: relative;
135
+          overflow: hidden;
136
+          background: rgba(25, 60, 131, 0.08);
137
+          padding: 23px 0;
138
+          text-align: center;
139
+          font-size: 0;
140
+          white-space: nowrap;
141
+          margin-top: 44px;
142
+          border-radius: 8px;
143
+          >text {
144
+            display: inline-block;
145
+            vertical-align: middle;
146
+            font-size: 28px;
147
+            line-height: 1;
148
+            margin-left: 10px;
149
+            &:first-child {
150
+              margin-left: 0;
151
+            }
152
+            &.active {
153
+              color: #193C83;
154
+            }
155
+            &.Number {
156
+              color: #fff;
157
+              background: #193C83;
158
+              width: 38px;
159
+              line-height: 38px;
160
+              text-align: center;
161
+              border-radius: 4px;
162
+            }
163
+            &.Red {
164
+              color: #FF0000;
165
+            }
166
+          }
167
+        }
168
+        >.Apply {
169
+          position: relative;
170
+          overflow: hidden;
171
+          background: rgba(25, 60, 131, 0.08);
172
+          align-items: center;
173
+          margin-top: 40px;
174
+          border-radius: 8px;
175
+          >.Collect {
176
+            position: relative;
177
+            overflow: hidden;
178
+            width: 90px;
179
+            &::after {
180
+              content: '';
181
+              width: 2px;
182
+              height: 34px;
183
+              background: rgba(0, 0, 0, 0.08);
184
+              display: block;
185
+              position: absolute;
186
+              right: 0;
187
+              top: 50%;
188
+              transform: translateY(-50%);
189
+              -webkit-transform: translateY(-50%);
190
+            }
191
+            >text {
192
+              display: block;
193
+              text-align: center;
194
+              font-size: 24px;
195
+              line-height: 1;
196
+              margin-top: 10px;
197
+              &:first-child {
198
+                margin-top: 0;
199
+                font-size: 30px;
200
+              }
201
+            }
202
+          }
203
+          >text {
204
+            &.iconfont {
205
+              font-size: 30px;
206
+              color: #193C83;
207
+              margin-left: 24px;
208
+            }
209
+            &.Btn {
210
+              font-size: 32px;
211
+              width: 360px;
212
+              line-height: 92px;
213
+              border-radius: 92px;
214
+              background: #193C83;
215
+              text-align: center;
216
+              margin-left: 0;
217
+              color: #fff;
218
+            }
219
+          }
220
+          >.flex-item {
221
+            margin-left: 12px;
222
+            >text {
223
+              display: block;
224
+              white-space: nowrap;
225
+              overflow: hidden;
226
+              text-overflow: ellipsis;
227
+              font-size: 30px;
228
+            }
229
+          }
230
+        }
231
+      }
232
+      >.Desc {
233
+        padding: 0 30px;
234
+        position: relative;
235
+        overflow: hidden;
236
+        margin-top: 60px;
237
+        >.Title {
238
+          position: relative;
239
+          overflow: hidden;
240
+          text-align: center;
241
+          font-size: 0;
242
+          &::after {
243
+            content: '';
244
+            display: block;
245
+            width: 100%;
246
+            height: 2px;
247
+            border-top: 2px dashed rgba(0, 0, 0, 0.1);
248
+            position: absolute;
249
+            z-index: 1;
250
+            left: 0;
251
+            top: 20px;
252
+          }
253
+          >text {
254
+            display: inline-block;
255
+            font-size: 32px;
256
+            color: #5B717A;
257
+            background: #fff;
258
+            position: relative;
259
+            z-index: 2;
260
+            padding: 0 30px;
261
+          }
262
+        }
263
+        >.DescContent {
264
+          position: relative;
265
+          overflow: hidden;
266
+          margin-top: 30px;
267
+        }
268
+      }
269
+      >.Bottom {
270
+        padding: 0 30px 30px;
271
+        position: relative;
272
+        overflow: hidden;
273
+        margin-top: 60px;
274
+        >view {
275
+          padding: 30px;
276
+          position: relative;
277
+          overflow: hidden;
278
+          background: #F8F8F8;
279
+          border-radius: 8px;
280
+          >view {
281
+            >text {
282
+              font-size: 20px;
283
+              color: #999;
284
+              line-height: 30px;
285
+              letter-spacing: 2px;
286
+              &.active {
287
+                color: #193C83;
288
+              }
289
+            }
290
+          }
291
+        }
292
+      }
293
+    }
294
+  }
295
+}

+ 0
- 7
src/pages/index/helpToFindHouse/components/BuyHouse/index.jsx Целия файл

@@ -2,7 +2,6 @@ import { useState, useEffect } from 'react'
2 2
 import '@/assets/css/iconfont.css'
3 3
 import { Image, Slider, Textarea, Picker } from '@tarojs/components'
4 4
 import './index.scss'
5
-import SubmitBuyHouseResult from '../SubmitBuyHouseResult/index'
6 5
 import questions from './formData'
7 6
 
8 7
 export default function BuyHouse (props) {
@@ -13,8 +12,6 @@ export default function BuyHouse (props) {
13 12
   const [StepId, setStepId] = useState(1)
14 13
   const [StepRange, setStepRange] = useState([0, 4])
15 14
 
16
-  const [ShowPopup, setShowPopup] = useState(false)
17
-
18 15
   const [CityName, setCityName] = useState(null)
19 16
   const [CityId, setCityId] = useState(null)
20 17
 
@@ -79,10 +76,6 @@ export default function BuyHouse (props) {
79 76
 
80 77
   return (
81 78
     <view className='components BuyHouse'>
82
-      {
83
-        ShowPopup &&
84
-        <SubmitBuyHouseResult></SubmitBuyHouseResult>
85
-      }
86 79
       {
87 80
         FormData.map((item, index) => (
88 81
           <view className='Step' key={`Form-${index}`}>

+ 0
- 7
src/pages/index/helpToFindHouse/components/HousePurchasing/index.jsx Целия файл

@@ -2,7 +2,6 @@ import { useState, useEffect } from 'react'
2 2
 import '@/assets/css/iconfont.css'
3 3
 import { Image, Slider, Textarea } from '@tarojs/components'
4 4
 import './index.scss'
5
-import SubmitBuyHouseResult from '../SubmitBuyHouseResult/index'
6 5
 import questions from './formData'
7 6
 
8 7
 export default function HousePurchasing (props) {
@@ -13,8 +12,6 @@ export default function HousePurchasing (props) {
13 12
   const [StepId, setStepId] = useState(1)
14 13
   const [StepRange, setStepRange] = useState([0, 5])
15 14
 
16
-  const [ShowPopup, setShowPopup] = useState(false)
17
-
18 15
   useEffect(() => {
19 16
     if(StepId === 1) {
20 17
       setStepRange([0, 5])
@@ -65,10 +62,6 @@ export default function HousePurchasing (props) {
65 62
 
66 63
   return (
67 64
     <view className='components BuyHouse'>
68
-      {
69
-        ShowPopup &&
70
-        <SubmitBuyHouseResult></SubmitBuyHouseResult>
71
-      }
72 65
       {
73 66
         FormData.map((item, index) => (
74 67
           <view className='Step' key={`Form-${index}`}>

+ 0
- 7
src/pages/index/helpToFindHouse/components/RentingHouse/index.jsx Целия файл

@@ -2,7 +2,6 @@ import { useState, useEffect } from 'react'
2 2
 import '@/assets/css/iconfont.css'
3 3
 import { Image, Slider, Textarea } from '@tarojs/components'
4 4
 import './index.scss'
5
-import SubmitBuyHouseResult from '../SubmitBuyHouseResult/index'
6 5
 import questions from './formData'
7 6
 
8 7
 export default function RentingHouse (props) {
@@ -13,8 +12,6 @@ export default function RentingHouse (props) {
13 12
   const [StepId, setStepId] = useState(1)
14 13
   const [StepRange, setStepRange] = useState([0, 4])
15 14
 
16
-  const [ShowPopup, setShowPopup] = useState(false)
17
-
18 15
   useEffect(() => {
19 16
     if(StepId === 1) {
20 17
       setStepRange([0, 4])
@@ -67,10 +64,6 @@ export default function RentingHouse (props) {
67 64
 
68 65
   return (
69 66
     <view className='components BuyHouse'>
70
-      {
71
-        ShowPopup &&
72
-        <SubmitBuyHouseResult></SubmitBuyHouseResult>
73
-      }
74 67
       {
75 68
         FormData.map((item, index) => (
76 69
           <view className='Step' key={`Form-${index}`}>

+ 32
- 23
src/pages/index/helpToFindHouse/components/SubmitBuyHouseResult/index.jsx Целия файл

@@ -1,10 +1,10 @@
1
-import React, { useState, useEffect } from 'react'
2
-import './index.scss'
1
+
3 2
 import '@/assets/css/iconfont.css'
4
-import { Image } from '@tarojs/components'
3
+import { Image, Block } from '@tarojs/components'
4
+import './index.scss'
5 5
 
6 6
 export default function SubmitBuyHouseResult (props) {
7
-  const { Data = {} } = props
7
+  const { List = [] } = props
8 8
   return (
9 9
     <view className='components SubmitBuyHouseResult'>
10 10
       <view className='centerLabel'>
@@ -28,28 +28,37 @@ export default function SubmitBuyHouseResult (props) {
28 28
             </view>
29 29
 
30 30
             {/* 匹配楼盘 */}
31
-            <view className='Recommend'>
32
-              <view className='Title'>
33
-                <view>
34
-                  <text>匹配楼盘</text>
35
-                </view>
36
-              </view>
37
-              <view className='PlanTitle'>“方案一:综合匹配度<text>99%</text>”</view>
38
-              <view className='RecommendBuildingItem'>
39
-                <view>
40
-                  <view className='Img'>
41
-                    <Image mode='aspectFill' src={null} className='centerLabel'></Image>
42
-                  </view>
43
-                  <view className='Title flex-h'>
44
-                    <view className='flex-item'>
45
-                      <text>奥园金基天著尚居</text>
46
-                    </view>
47
-                    <view className='Price'>约<text>20000/㎡</text></view>
31
+            {
32
+              !!List.length &&
33
+              <view className='Recommend'>
34
+                <view className='Title'>
35
+                  <view>
36
+                    <text>匹配楼盘</text>
48 37
                   </view>
49
-                  <text className='Address'>江宁禄口云熙99路号(诚信大道)</text>
50 38
                 </view>
39
+                {
40
+                  List.map((item, index) => (
41
+                    <Block key={`ListItem-${index}`}>
42
+                      <view className='PlanTitle'>“方案一:综合匹配度<text>99%</text>”</view>
43
+                      <view className='RecommendBuildingItem'>
44
+                        <view>
45
+                          <view className='Img'>
46
+                            <Image mode='aspectFill' src={null} className='centerLabel'></Image>
47
+                          </view>
48
+                          <view className='Title flex-h'>
49
+                            <view className='flex-item'>
50
+                              <text>奥园金基天著尚居</text>
51
+                            </view>
52
+                            <view className='Price'>约<text>20000/㎡</text></view>
53
+                          </view>
54
+                          <text className='Address'>江宁禄口云熙99路号(诚信大道)</text>
55
+                        </view>
56
+                      </view>
57
+                    </Block>
58
+                  ))
59
+                }
51 60
               </view>
52
-            </view>
61
+            }
53 62
 
54 63
           </view>
55 64
         </view>

+ 12
- 4
src/pages/index/helpToFindHouse/index.jsx Целия файл

@@ -8,9 +8,10 @@ import './index.scss'
8 8
 import BuyHouse from './components/BuyHouse/index'
9 9
 import RentingHouse from './components/RentingHouse/index'
10 10
 import HousePurchasing from './components/HousePurchasing/index'
11
+import SubmitBuyHouseResult from './components/SubmitBuyHouseResult/index'
11 12
 
12 13
 export default withLayout(() => {
13
-  
14
+
14 15
   const [DemandList] = useState([
15 16
     { name: '我要买房', id: 1, icon: '', spell: 'MAI FANG' },
16 17
     { name: '我要租房', id: 2, icon: '', spell: 'ZU FANG' },
@@ -19,9 +20,11 @@ export default withLayout(() => {
19 20
   const [CurrentDemandId, setCurrentDemandId] = useState(1)
20 21
   const [ShowDemand, setShowDemand] = useState(true)
21 22
   const [CityList, setCityList] = useState([])
23
+  const [ResultList, setResultList] = useState([])
24
+  const [ShowPopup, setShowPopup] = useState(false)
22 25
 
23 26
   useEffect(() => {
24
-    fetch({url: API_CITY_LIST, method: 'get'}).then((res) => {
27
+    fetch({ url: API_CITY_LIST, method: 'get' }).then((res) => {
25 28
       setCityList(res || [])
26 29
     })
27 30
   }, [])
@@ -42,13 +45,18 @@ export default withLayout(() => {
42 45
     data.map((item) => {
43 46
       params[item.key] = item.result
44 47
     })
45
-    fetch({url: API_HELP_FIND_HOUSE_SUBMIT, method: 'post', payload: {...params, type: CurrentDemandId}}).then(() => {
46
-      
48
+    fetch({ url: API_HELP_FIND_HOUSE_SUBMIT, method: 'post', payload: { ...params, type: CurrentDemandId } }).then((res) => {
49
+      setResultList(res.taBuildingList || [])
50
+      setShowPopup(true)
47 51
     })
48 52
   }
49 53
 
50 54
   return (
51 55
     <view className='Page helpToFindHouse'>
56
+      {
57
+        ShowPopup &&
58
+        <SubmitBuyHouseResult List={ResultList}></SubmitBuyHouseResult>
59
+      }
52 60
 
53 61
       <ScrollView scroll-y refresher-enabled={false}>
54 62
         <view className='PageContent'>

+ 24
- 24
src/pages/mine/components/MyCollectForActivity/index.jsx Целия файл

@@ -10,12 +10,10 @@ export default function MyCollectForActivity () {
10 10
 
11 11
   const user = useSelector(state => state.user)
12 12
   const [PersonId, setPersonId] = useState(null)
13
-  const [pageNumber, setPageNumber] = useState(null)
14
-  const [pageSize] = useState(10)
13
+  const [pageNumber, setPageNumber] = useState(1)
15 14
   const [HasNextPage, setHasNextPage] = useState(true)
16 15
   const [PageList, setPageList] = useState([])
17 16
   const [IsPull, setPull] = useState(false)
18
-  const [PullTimer, setPullTimer] = useState(null)
19 17
 
20 18
   useEffect(() => {
21 19
     if (user?.userInfo?.person?.personId) {
@@ -24,41 +22,43 @@ export default function MyCollectForActivity () {
24 22
   }, [user])
25 23
 
26 24
   useEffect(() => {
27
-    if (PersonId) {
28
-      setPageNumber(1)
25
+    if(PersonId) {
26
+      GetPageList()
29 27
     }
30
-  }, [PersonId])
28
+  }, [pageNumber, PersonId])
31 29
 
32
-  useEffect(() => {
33
-    if (pageNumber && HasNextPage) {
34
-      fetch({ url: API_ACTIVITY_SAVE, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35
-        if (res !== null) {
36
-          setPageList(res.records || [])
37
-          setHasNextPage(res.current < res.pages)
38
-        } else {
39
-          setPageList([])
40
-          setHasNextPage(false)
41
-        }
42
-      })
43
-    }
44
-  }, [pageNumber])
30
+  const GetPageList = () => {
31
+    setHasNextPage(false)
32
+    fetch({ url: API_ACTIVITY_SAVE, method: 'get', payload: { mine: true, pageNumber, pageSize: 10 } }).then((res) => {
33
+      setPageList(pageNumber === 1 ? res?.records || [] : PageList.concat(res?.records || []))
34
+      setHasNextPage(res?.current < res?.pages)
35
+      setPull(false)
36
+    })
37
+  }
45 38
 
46 39
   const PageRefresh = () => { // 页面下拉刷新回调
47 40
     setPull(true)
48 41
   }
49 42
 
43
+  const PageLoadMore = () => { // 页面上拉加载更多
44
+    if(HasNextPage) {
45
+      setPageNumber(pageNumber + 1)
46
+    }
47
+  }
48
+
50 49
   useEffect(() => { // 下拉刷新触发
51 50
     if (IsPull) {
52
-      clearTimeout(PullTimer)
53
-      setPullTimer(setTimeout(() => {
54
-        setPull(false)
55
-      }, 2000))
51
+      if(pageNumber === 1) {
52
+        GetPageList()
53
+      } else {
54
+        setPageNumber(1)
55
+      }
56 56
     }
57 57
   }, [IsPull])
58 58
 
59 59
   return (
60 60
     <view className='components MyCollectForActivity'>
61
-      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
61
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
62 62
         <view className='PageContent'>
63 63
           <view className='List'>
64 64
             {

+ 23
- 18
src/pages/mine/components/MyCollectForBuilding/index.jsx Целия файл

@@ -10,12 +10,10 @@ export default function MyCollectForBuilding () {
10 10
   
11 11
   const user = useSelector(state => state.user)
12 12
   const [PersonId, setPersonId] = useState(null)
13
-  const [pageNumber, setPageNumber] = useState(null)
14
-  const [pageSize] = useState(10)
13
+  const [pageNumber, setPageNumber] = useState(1)
15 14
   const [HasNextPage, setHasNextPage] = useState(true)
16 15
   const [PageList, setPageList] = useState([])
17 16
   const [IsPull, setPull] = useState(false)
18
-  const [PullTimer, setPullTimer] = useState(null)
19 17
 
20 18
   useEffect(() => {
21 19
     if(user?.userInfo?.person?.personId) {
@@ -25,35 +23,42 @@ export default function MyCollectForBuilding () {
25 23
 
26 24
   useEffect(() => {
27 25
     if(PersonId) {
28
-      setPageNumber(1)
26
+      GetPageList()
29 27
     }
30
-  }, [PersonId])
28
+  }, [pageNumber, PersonId])
31 29
 
32
-  useEffect(() => {
33
-    if(pageNumber && HasNextPage) {
34
-      fetch({ url: API_ITEMS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35
-        setPageList(res.records || [])
36
-        setHasNextPage(res.current < res.pages)
37
-      })
38
-    }
39
-  }, [pageNumber])
30
+  const GetPageList = () => {
31
+    setHasNextPage(false)
32
+    fetch({ url: API_ITEMS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize: 10 } }).then((res) => {
33
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
34
+      setHasNextPage(res.current < res.pages)
35
+      setPull(false)
36
+    })
37
+  }
40 38
 
41 39
   const PageRefresh = () => { // 页面下拉刷新回调
42 40
     setPull(true)
43 41
   }
44 42
 
43
+  const PageLoadMore = () => { // 页面上拉加载更多
44
+    if(HasNextPage) {
45
+      setPageNumber(pageNumber + 1)
46
+    }
47
+  }
48
+
45 49
   useEffect(() => { // 下拉刷新触发
46 50
     if (IsPull) {
47
-      clearTimeout(PullTimer)
48
-      setPullTimer(setTimeout(() => {
49
-        setPull(false)
50
-      }, 2000))
51
+      if(pageNumber === 1) {
52
+        GetPageList()
53
+      } else {
54
+        setPageNumber(1)
55
+      }
51 56
     }
52 57
   }, [IsPull])
53 58
 
54 59
   return (
55 60
     <view className='components MyCollectForBuilding'>
56
-      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
61
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
57 62
         <view className='PageContent'>
58 63
           <view className='List'>
59 64
             {

+ 45
- 11
src/pages/mine/components/MyCollectForCourse/index.jsx Целия файл

@@ -1,30 +1,64 @@
1
-import React, { useState, useEffect } from 'react'
2
-import './index.scss'
1
+import { useState, useEffect } from 'react'
3 2
 import { ScrollView } from '@tarojs/components'
3
+import { useSelector } from 'react-redux'
4
+import { fetch } from '@/utils/request'
5
+import { API_MY_COLLECT_COURSE_LIST } from '@/constants/api'
6
+import './index.scss'
4 7
 import MyCourseListItem from '../../components/MyCourseListItem/index'
5 8
 
6
-export default function MyCollectForCourse (props) {
7
-  const { Data = {} } = props
8
-  const [PageList, setPageList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', ''])
9
+export default function MyCollectForCourse () {
10
+  
11
+  const user = useSelector(state => state.user)
12
+  const [PageList, setPageList] = useState([])
9 13
   const [IsPull, setPull] = useState(false)
10
-  const [PullTimer, setPullTimer] = useState(null)
14
+  const [PersonId, setPersonId] = useState(null)
15
+  const [pageNumber, setPageNumber] = useState(1)
16
+  const [HasNextPage, setHasNextPage] = useState(true)
17
+
18
+  useEffect(() => {
19
+    if(user?.userInfo?.person?.personId) {
20
+      setPersonId(user.userInfo.person.personId)
21
+    }
22
+  }, [user])
23
+
24
+  useEffect(() => {
25
+    if(PersonId) {
26
+      GetPageList()
27
+    }
28
+  }, [pageNumber, PersonId])
11 29
 
12 30
   const PageRefresh = () => { // 页面下拉刷新回调
13 31
     setPull(true)
14 32
   }
15 33
 
34
+  const GetPageList = () => {
35
+    setHasNextPage(false)
36
+    fetch({ url: API_MY_COLLECT_COURSE_LIST, method: 'get', payload: { pageNum: pageNumber, pageSize: 10 } }).then((res) => {
37
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
38
+      setHasNextPage(res.current < res.pages)
39
+      setPull(false)
40
+    })
41
+  }
42
+
43
+  const PageLoadMore = () => { // 页面上拉加载更多
44
+    if(HasNextPage) {
45
+      setPageNumber(pageNumber + 1)
46
+    }
47
+  }
48
+
16 49
   useEffect(() => { // 下拉刷新触发
17 50
     if (IsPull) {
18
-      clearTimeout(PullTimer)
19
-      setPullTimer(setTimeout(() => {
20
-        setPull(false)
21
-      }, 2000))
51
+      if(pageNumber === 1) {
52
+        GetPageList()
53
+      } else {
54
+        setPageNumber(1)
55
+      }
22 56
     }
23 57
   }, [IsPull])
24 58
 
25 59
   return (
26 60
     <view className='components MyCollectForCourse'>
27
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
61
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
28 62
         <view className='PageContent'>
29 63
           <view className='List'>
30 64
             {

+ 23
- 18
src/pages/mine/components/MyCollectForNews/index.jsx Целия файл

@@ -10,12 +10,10 @@ export default function MyCollectForNews () {
10 10
   
11 11
   const user = useSelector(state => state.user)
12 12
   const [PersonId, setPersonId] = useState(null)
13
-  const [pageNumber, setPageNumber] = useState(null)
14
-  const [pageSize] = useState(10)
13
+  const [pageNumber, setPageNumber] = useState(1)
15 14
   const [HasNextPage, setHasNextPage] = useState(true)
16 15
   const [PageList, setPageList] = useState([])
17 16
   const [IsPull, setPull] = useState(false)
18
-  const [PullTimer, setPullTimer] = useState(null)
19 17
 
20 18
   useEffect(() => {
21 19
     if(user?.userInfo?.person?.personId) {
@@ -25,35 +23,42 @@ export default function MyCollectForNews () {
25 23
 
26 24
   useEffect(() => {
27 25
     if(PersonId) {
28
-      setPageNumber(1)
26
+      GetPageList()
29 27
     }
30
-  }, [PersonId])
28
+  }, [pageNumber, PersonId])
31 29
 
32
-  useEffect(() => {
33
-    if(pageNumber && HasNextPage) {
34
-      fetch({ url: API_NEWS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35
-        setPageList(res.records || [])
36
-        setHasNextPage(res.current < res.pages)
37
-      })
38
-    }
39
-  }, [pageNumber])
30
+  const GetPageList = () => {
31
+    setHasNextPage(false)
32
+    fetch({ url: API_NEWS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize: 10 } }).then((res) => {
33
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
34
+      setHasNextPage(res.current < res.pages)
35
+      setPull(false)
36
+    })
37
+  }
40 38
 
41 39
   const PageRefresh = () => { // 页面下拉刷新回调
42 40
     setPull(true)
43 41
   }
44 42
 
43
+  const PageLoadMore = () => { // 页面上拉加载更多
44
+    if(HasNextPage) {
45
+      setPageNumber(pageNumber + 1)
46
+    }
47
+  }
48
+
45 49
   useEffect(() => { // 下拉刷新触发
46 50
     if (IsPull) {
47
-      clearTimeout(PullTimer)
48
-      setPullTimer(setTimeout(() => {
49
-        setPull(false)
50
-      }, 2000))
51
+      if(pageNumber === 1) {
52
+        GetPageList()
53
+      } else {
54
+        setPageNumber(1)
55
+      }
51 56
     }
52 57
   }, [IsPull])
53 58
 
54 59
   return (
55 60
     <view className='components MyCollectForNews'>
56
-      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
61
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
57 62
         <view className='PageContent'>
58 63
           <view className='List'>
59 64
             {

+ 11
- 9
src/pages/mine/components/MyCourseListItem/index.jsx Целия файл

@@ -1,33 +1,35 @@
1
-import React, { useState, useEffect } from 'react'
2
-import './index.scss'
1
+
2
+import { Image } from '@tarojs/components'
3 3
 import Taro from '@tarojs/taro'
4
+import { getImgURL } from '@/utils/image'
5
+import './index.scss'
4 6
 
5 7
 export default function MyCourseListItem (props) {
6 8
   const { Data = {} } = props
7 9
   return (
8
-    <view className='components MyCourseListItem flex-h' onClick={() => {Taro.navigateTo({ url: `/pages/index/buildingDetail/index?id=${Data.id}` })}}>
10
+    <view className='components MyCourseListItem flex-h' onClick={() => {Taro.navigateTo({ url: `/pages/index/courseDetail/index?id=${Data.curriculumId}` })}}>
9 11
       <view className='Img'>
10 12
         <view>
11 13
           {
12 14
             Data.img &&
13
-            <Image mode='aspectFill' className='centerLabel' src={Data.img || null} />
15
+            <Image mode='aspectFill' className='centerLabel' src={getImgURL(Data.curriculumImg || null)} />
14 16
           }
15 17
         </view>
16 18
       </view>
17 19
       <view className='flex-item'>
18 20
         <view className='Name flex-h'>
19 21
           <view className='flex-item'>
20
-            <text>课程名称</text>
22
+            <text>{Data.name}</text>
21 23
           </view>
22 24
         </view>
23
-        <text className='Address'>课程描述...</text>
25
+        <text className='Address'>{Data.remark}</text>
24 26
         <view className='ShareInfo'>
25 27
           <view className='Users'>
28
+            {/* <view></view>
26 29
             <view></view>
27
-            <view></view>
28
-            <view></view>
30
+            <view></view> */}
29 31
           </view>
30
-          <text>...9人查看</text>
32
+          <text>...{Data.lookNum}人查看</text>
31 33
         </view>
32 34
       </view>
33 35
     </view>

+ 39
- 8
src/pages/mine/feedBack/index.jsx Целия файл

@@ -1,27 +1,58 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2 2
 import withLayout from '@/layout'
3
-import './index.scss'
4 3
 import { ScrollView, Input } from '@tarojs/components'
4
+import { useSelector } from 'react-redux'
5
+import { fetch } from '@/utils/request'
6
+import { API_FEEDBACK_SUBMIT } from '@/constants/api'
7
+import Taro from '@tarojs/taro'
5 8
 import '@/assets/css/iconfont.css'
9
+import './index.scss'
10
+
11
+export default withLayout(() => {
12
+
13
+  const user = useSelector(state => state.user)
14
+  const [PersonId, setPersonId] = useState(null)
15
+  const [FormData, setFormData] = useState({
16
+    phone: '',
17
+    message: ''
18
+  })
19
+
20
+  useEffect(() => {
21
+    if (user?.userInfo?.person?.personId) {
22
+      setPersonId(user.userInfo.person.personId)
23
+    }
24
+  }, [user])
6 25
 
7
-export default withLayout((props) => {
26
+  const FormChange = (key, e) => {
27
+    let Data = { ...FormData }
28
+    Data[key] = e.detail.value
29
+    setFormData(Data)
30
+  }
8 31
 
9
-  // const [PageProps] = useState(props)
32
+  const Submit = () => {
33
+    fetch({ url: API_FEEDBACK_SUBMIT, method: 'post', payload: FormData }).then(() => {
34
+      Taro.showToast({
35
+        title: '反馈成功', icon: 'none', complete: () => {
36
+          Taro.navigateBack({ delta: 1 })
37
+        }
38
+      })
39
+    })
40
+  }
10 41
 
11 42
   return (
12 43
     <view className='Page feedBack flex-v'>
13 44
 
14 45
       <view className='flex-item'>
15 46
         <view>
16
-          <ScrollView scroll-y={true} refresher-enabled={false} refresher-background='#fff'>
47
+          <ScrollView scroll-y refresher-enabled={false}>
17 48
             <view className='PageContent'>
18 49
               <text className='Title'>问题描述</text>
19 50
               <view>
20
-                <Input placeholder='请填写10个字以上的问题描述以便我们提供更好的帮助'></Input>
51
+                <Input placeholder='请填写10个字以上的问题描述以便我们提供更好的帮助' value={FormData.message} onInput={FormChange.bind(this, 'message')}></Input>
21 52
               </view>
22 53
               <text className='Title'>联系方式(选填)</text>
23 54
               <view>
24
-                <Input placeholder='输入邮箱/手机号方便联系'></Input>
55
+                <Input placeholder='输入邮箱/手机号方便联系' value={FormData.phone} onInput={FormChange.bind(this, 'phone')}></Input>
25 56
               </view>
26 57
             </view>
27 58
           </ScrollView>
@@ -29,7 +60,7 @@ export default withLayout((props) => {
29 60
       </view>
30 61
 
31 62
       <view className='Bottom'>
32
-        <text>提交</text>
63
+        <text onClick={Submit}>提交</text>
33 64
       </view>
34 65
 
35 66
     </view>

+ 45
- 12
src/pages/mine/myCourse/index.jsx Целия файл

@@ -1,34 +1,67 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2 2
 import withLayout from '@/layout'
3
-import './index.scss'
4 3
 import { ScrollView } from '@tarojs/components'
4
+import { useSelector } from 'react-redux'
5
+import { fetch } from '@/utils/request'
6
+import { API_COURSE_LIST } from '@/constants/api'
5 7
 import '@/assets/css/iconfont.css'
8
+import './index.scss'
6 9
 import MyCourseListItem from '../components/MyCourseListItem/index'
7 10
 
8
-export default withLayout((props) => {
9
-
10
-  // const [PageProps] = useState(props)
11
-  const [PageList, setPageList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', ''])
11
+export default withLayout(() => {
12
+  
13
+  const user = useSelector(state => state.user)
14
+  const [PageList, setPageList] = useState([])
12 15
   const [IsPull, setPull] = useState(false)
13
-  const [PullTimer, setPullTimer] = useState(null)
16
+  const [PersonId, setPersonId] = useState(null)
17
+  const [pageNumber, setPageNumber] = useState(1)
18
+  const [HasNextPage, setHasNextPage] = useState(true)
19
+
20
+  useEffect(() => {
21
+    if(user?.userInfo?.person?.personId) {
22
+      setPersonId(user.userInfo.person.personId)
23
+    }
24
+  }, [user])
25
+
26
+  useEffect(() => {
27
+    if(PersonId) {
28
+      GetPageList()
29
+    }
30
+  }, [pageNumber, PersonId])
14 31
 
15 32
   const PageRefresh = () => { // 页面下拉刷新回调
16 33
     setPull(true)
17 34
   }
18 35
 
36
+  const GetPageList = () => {
37
+    setHasNextPage(false)
38
+    fetch({ url: API_COURSE_LIST, method: 'get', payload: { pageNum: pageNumber, pageSize: 10 } }).then((res) => {
39
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
40
+      setHasNextPage(res.current < res.pages)
41
+      setPull(false)
42
+    })
43
+  }
44
+
45
+  const PageLoadMore = () => { // 页面上拉加载更多
46
+    if(HasNextPage) {
47
+      setPageNumber(pageNumber + 1)
48
+    }
49
+  }
50
+
19 51
   useEffect(() => { // 下拉刷新触发
20 52
     if (IsPull) {
21
-      clearTimeout(PullTimer)
22
-      setPullTimer(setTimeout(() => {
23
-        setPull(false)
24
-      }, 2000))
53
+      if(pageNumber === 1) {
54
+        GetPageList()
55
+      } else {
56
+        setPageNumber(1)
57
+      }
25 58
     }
26 59
   }, [IsPull])
27 60
 
28 61
   return (
29 62
     <view className='Page myCourse'>
30 63
 
31
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
64
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
32 65
         <view className='PageContent'>
33 66
           <view className='List'>
34 67
             {

+ 5
- 6
src/pages/mine/residentManager/index.jsx Целия файл

@@ -1,13 +1,12 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2 2
 import withLayout from '@/layout'
3
-import './index.scss'
4 3
 import { ScrollView, Image } from '@tarojs/components'
5 4
 import '@/assets/css/iconfont.css'
5
+import './index.scss'
6 6
 import ResidentListItem from '../components/ResidentListItem/index'
7 7
 
8
-export default withLayout((props) => {
8
+export default withLayout(() => {
9 9
 
10
-  // const [PageProps] = useState(props)
11 10
   const [PageList, setPageList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', ''])
12 11
   const [IsPull, setPull] = useState(false)
13 12
   const [PullTimer, setPullTimer] = useState(null)
@@ -53,7 +52,7 @@ export default withLayout((props) => {
53 52
 
54 53
       <view className='flex-item'>
55 54
         <view>
56
-          <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
55
+          <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
57 56
             <view className='PageContent'>
58 57
 
59 58
               <view className='Filter'>
@@ -65,7 +64,7 @@ export default withLayout((props) => {
65 64
                         <text>{item.name}</text>
66 65
                         {
67 66
                           CurrentFilterMenuId === item.id &&
68
-                          <Image mode='widthFix' src={require('../../../assets/findHouse-icon1.png')}></Image>
67
+                          <Image mode='widthFix' src={require('@/assets/findHouse-icon1.png')}></Image>
69 68
                         }
70 69
                       </view>
71 70
                     ))

+ 6
- 0
src/routes.js Целия файл

@@ -228,6 +228,12 @@ const routes = [
228 228
     pkg: 'main',
229 229
     type: 'building',
230 230
   },
231
+  {
232
+    name: '课程详情',
233
+    page: 'pages/index/courseDetail/index',
234
+    pkg: 'main',
235
+    type: 'mine',
236
+  },
231 237
 
232 238
   //视频
233 239
   {