1002884655 3 lat temu
rodzic
commit
78a1a87bff
27 zmienionych plików z 777 dodań i 336 usunięć
  1. 5
    0
      package-lock.json
  2. 1
    0
      package.json
  3. 1
    0
      src/constants/api.js
  4. 24
    11
      src/pages/mine/components/FollowCustomer/index.jsx
  5. 11
    0
      src/pages/mine/components/FollowCustomer/index.scss
  6. 1
    1
      src/pages/mine/components/MyCollectForActivity/index.jsx
  7. 1
    1
      src/pages/mine/components/MyCollectForBuilding/index.jsx
  8. 1
    1
      src/pages/mine/components/MyCollectForNews/index.jsx
  9. 7
    5
      src/pages/mine/components/StatCustomerListItem/index.jsx
  10. 33
    12
      src/pages/mine/components/TransactedCustomer/index.jsx
  11. 40
    21
      src/pages/mine/components/UserDetailActivityInfo/index.jsx
  12. 6
    0
      src/pages/mine/components/UserDetailActivityInfo/index.scss
  13. 14
    15
      src/pages/mine/components/UserDetailBasicInfo/index.jsx
  14. 48
    21
      src/pages/mine/components/UserDetailFollowRecord/index.jsx
  15. 54
    52
      src/pages/mine/components/UserDetailViewRecord/index.jsx
  16. 6
    0
      src/pages/mine/components/UserDetailViewRecord/index.scss
  17. 86
    15
      src/pages/mine/customerDetail/index.jsx
  18. 68
    0
      src/pages/mine/customerDetail/index.scss
  19. 3
    0
      src/pages/mine/customerInfo/index.config.js
  20. 171
    0
      src/pages/mine/customerInfo/index.jsx
  21. 64
    0
      src/pages/mine/customerInfo/index.scss
  22. 24
    19
      src/pages/mine/myActivity/index.jsx
  23. 2
    2
      src/pages/mine/myHomepage/index.jsx
  24. 24
    19
      src/pages/mine/myShare/index.jsx
  25. 1
    1
      src/pages/mine/userInfo/index.config.js
  26. 50
    125
      src/pages/mine/userInfo/index.jsx
  27. 31
    15
      src/pages/mine/userInfo/index.scss

+ 5
- 0
package-lock.json Wyświetl plik

@@ -5650,6 +5650,11 @@
5650 5650
         "whatwg-url": "^7.0.0"
5651 5651
       }
5652 5652
     },
5653
+    "dayjs": {
5654
+      "version": "1.10.6",
5655
+      "resolved": "https://registry.nlark.com/dayjs/download/dayjs-1.10.6.tgz",
5656
+      "integrity": "sha1-KIsqqC8thBimydTfWJjAc3rQKmM="
5657
+    },
5653 5658
     "debug": {
5654 5659
       "version": "4.3.1",
5655 5660
       "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566571506&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz",

+ 1
- 0
package.json Wyświetl plik

@@ -41,6 +41,7 @@
41 41
     "@tarojs/react": "3.2.8",
42 42
     "@tarojs/runtime": "3.2.8",
43 43
     "@tarojs/taro": "3.2.8",
44
+    "dayjs": "^1.8.14",
44 45
     "classnames": "^2.3.1",
45 46
     "react": "^17.0.0",
46 47
     "react-dom": "^17.0.0",

+ 1
- 0
src/constants/api.js Wyświetl plik

@@ -228,6 +228,7 @@ export const API_GROUP_CREATE = resolvePath('taShareRecord')
228 228
 export const API_GROUP_JOIN = resolvePath('taShareChildRecord')
229 229
 
230 230
 //person
231
+export const API_CUSTOMER_DETAILINFO = resolvePath('customer')
231 232
 export const API_MY_CUSTOMER = resolvePath('inventory/customer/statistics')
232 233
 export const API_CUSTOMER_LIST = resolvePath('inventory/customer/statistics')
233 234
 export const API_CUSTOMER_DETAIL = resolvePath('inventory/customer')

+ 24
- 11
src/pages/mine/components/FollowCustomer/index.jsx Wyświetl plik

@@ -1,6 +1,6 @@
1 1
 import { useState, useEffect } from 'react'
2 2
 // import Taro from '@tarojs/taro'
3
-import { ScrollView, Image } from '@tarojs/components'
3
+import { ScrollView, Image, Input } from '@tarojs/components'
4 4
 import { fetch } from '@/utils/request'
5 5
 import { API_CUSTOMER_LIST } from '@/constants/api'
6 6
 import './index.scss'
@@ -12,7 +12,6 @@ export default function FollowCustomer () {
12 12
   const [pageNumber, setPageNumber] = useState(1)
13 13
   const [HasNextPage, setHasNextPage] = useState(true)
14 14
   const [IsPull, setPull] = useState(false)
15
-  const [PullTimer, setPullTimer] = useState(null)
16 15
 
17 16
   const [StatusMenu] = useState([
18 17
     { name: '全部状态', id: 0 },
@@ -42,9 +41,11 @@ export default function FollowCustomer () {
42 41
   }, [FormData])
43 42
 
44 43
   const GetPageList = () => {
44
+    setHasNextPage(false)
45 45
     fetch({ url: `${API_CUSTOMER_LIST}/follow`, method: 'get', payload: { pageNumber, pageSize: 10, ...FormData, day: FormData.day === 1 ? '' : FormData.day } }).then((res) => {
46
-      setPageList(res.records || [])
47
-      setHasNextPage(res.current >= res.pages)
46
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
47
+      setHasNextPage(res.current < res.pages)
48
+      setPull(false)
48 49
     })
49 50
   }
50 51
 
@@ -64,24 +65,36 @@ export default function FollowCustomer () {
64 65
     }
65 66
   }
66 67
 
68
+  const SearchConfirm = (e) => {
69
+    setFormData({...FormData, name: e.detail.value})
70
+  }
71
+
72
+  const PageLoadMore = () => { // 页面上拉加载更多
73
+    if(HasNextPage) {
74
+      setPageNumber(pageNumber + 1)
75
+    }
76
+  }
77
+
67 78
   useEffect(() => { // 下拉刷新触发
68 79
     if (IsPull) {
69
-      clearTimeout(PullTimer)
70
-      setPullTimer(setTimeout(() => {
71
-        setPull(false)
72
-      }, 2000))
80
+      if(pageNumber === 1) {
81
+        GetPageList()
82
+      } else {
83
+        setPageNumber(1)
84
+      }
73 85
     }
74 86
   }, [IsPull])
75 87
 
76 88
   return (
77 89
     <view className='components FollowCustomer'>
78
-      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
90
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
79 91
         <view className='PageContent'>
80 92
 
81 93
           <view className='Search'>
82 94
             <view>
83 95
               <text className='iconfont icon-sousuo'></text>
84
-              <text>请输入用户名/手机号/到访时间搜索</text>
96
+              {/* <text>请输入用户名/手机号/到访时间搜索</text> */}
97
+              <Input confirm-type='search' placeholder='请输入用户名/手机号/到访时间搜索' onConfirm={SearchConfirm}></Input>
85 98
             </view>
86 99
           </view>
87 100
 
@@ -93,7 +106,7 @@ export default function FollowCustomer () {
93 106
                   <text>{item.name}</text>
94 107
                   {
95 108
                     FormData.status === item.id &&
96
-                    <Image mode='widthFix' src={require('../../../../assets/findHouse-icon1.png')}></Image>
109
+                    <Image mode='widthFix' src={require('@/assets/findHouse-icon1.png')}></Image>
97 110
                   }
98 111
                 </view>
99 112
               ))

+ 11
- 0
src/pages/mine/components/FollowCustomer/index.scss Wyświetl plik

@@ -35,6 +35,17 @@
35 35
               font-size: 28px;
36 36
             }
37 37
           }
38
+          >input {
39
+            display: inline-block;
40
+            vertical-align: middle;
41
+            font-size: 20px;
42
+            color: #999;
43
+            line-height: 44px;
44
+            height: 44px;
45
+            margin-left: 10px;
46
+            text-align: left;
47
+            width: 320px;
48
+          }
38 49
         }
39 50
       }
40 51
       > text {

+ 1
- 1
src/pages/mine/components/MyCollectForActivity/index.jsx Wyświetl plik

@@ -34,7 +34,7 @@ export default function MyCollectForActivity () {
34 34
       fetch({ url: API_ACTIVITY_SAVE, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35 35
         if (res !== null) {
36 36
           setPageList(res.records || [])
37
-          setHasNextPage(res.current >= res.pages)
37
+          setHasNextPage(res.current < res.pages)
38 38
         } else {
39 39
           setPageList([])
40 40
           setHasNextPage(false)

+ 1
- 1
src/pages/mine/components/MyCollectForBuilding/index.jsx Wyświetl plik

@@ -33,7 +33,7 @@ export default function MyCollectForBuilding () {
33 33
     if(pageNumber && HasNextPage) {
34 34
       fetch({ url: API_ITEMS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35 35
         setPageList(res.records || [])
36
-        setHasNextPage(res.current >= res.pages)
36
+        setHasNextPage(res.current < res.pages)
37 37
       })
38 38
     }
39 39
   }, [pageNumber])

+ 1
- 1
src/pages/mine/components/MyCollectForNews/index.jsx Wyświetl plik

@@ -33,7 +33,7 @@ export default function MyCollectForNews () {
33 33
     if(pageNumber && HasNextPage) {
34 34
       fetch({ url: API_NEWS_LIST, method: 'get', payload: { mine: true, pageNumber, pageSize } }).then((res) => {
35 35
         setPageList(res.records || [])
36
-        setHasNextPage(res.current >= res.pages)
36
+        setHasNextPage(res.current < res.pages)
37 37
       })
38 38
     }
39 39
   }, [pageNumber])

+ 7
- 5
src/pages/mine/components/StatCustomerListItem/index.jsx Wyświetl plik

@@ -4,24 +4,26 @@ import { Image } from '@tarojs/components'
4 4
 import './index.scss'
5 5
 
6 6
 export default function StatCustomerListItem (props) {
7
+
7 8
   const { data = {}, showStatus = false } = props
9
+
8 10
   return (
9 11
     <view className='components StatCustomerListItem flex-h'>
10
-      <view className='Icon' onClick={() => { Taro.navigateTo({url: `/pages/mine/customerDetail/index?id=${data.customerId}`}) }}>
12
+      <view className='Icon' onClick={() => { Taro.navigateTo({ url: `/pages/mine/customerDetail/index?id=${data.customerId}` }) }}>
11 13
         <Image mode='scaleToFill' src={data.avatarurl}></Image>
12 14
       </view>
13
-      <view className='flex-item' onClick={() => { Taro.navigateTo({url: `/pages/mine/customerDetail/index?id=${data.customerId}`}) }}>
15
+      <view className='flex-item' onClick={() => { Taro.navigateTo({ url: `/pages/mine/customerDetail/index?id=${data.customerId}` }) }}>
14 16
         <view>
15 17
           <text>{data.name}</text>
16
-          <text className='iconfont icon-yonghu'></text>
18
+          <text className={data.sex === 1 ? 'iconfont icon-nanxing' : 'iconfont icon-nvxing'}></text>
17 19
         </view>
18 20
         <text>{data.phone}</text>
19 21
       </view>
20 22
       <text className='iconfont icon-liaotian'></text>
21
-      <text className='iconfont icon-dianhua active'></text>
23
+      <text className='iconfont icon-dianhua active' onClick={() => { Taro.makePhoneCall({ phoneNumber: data.phone }) }}></text>
22 24
       {
23 25
         showStatus &&
24
-        <text className='Status' onClick={() => { Taro.navigateTo({url: `/pages/mine/customerDetail/index?id=${data.customerId}`}) }}>报备</text>
26
+        <text className='Status'>{data.status === 0 ? '' : data.status === 1 ? '报备' : data.status === 2 ? '到访' : data.status === 3 ? '认筹' : '签约'}</text>
25 27
       }
26 28
     </view>
27 29
   )

+ 33
- 12
src/pages/mine/components/TransactedCustomer/index.jsx Wyświetl plik

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

+ 40
- 21
src/pages/mine/components/UserDetailActivityInfo/index.jsx Wyświetl plik

@@ -1,51 +1,70 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+import { ScrollView } from '@tarojs/components'
3
+import { fetch } from '@/utils/request'
4
+import { API_ACTIVITY_LIST_CUSTOMER } from '@/constants/api'
2 5
 import './index.scss'
3
-import Taro from '@tarojs/taro'
4
-import { ScrollView, Image } from '@tarojs/components'
5 6
 
6 7
 export default function UserDetailActivityInfo (props) {
7
-  const { Data = {} } = props
8
-  const [PageList, setPageList] = useState([
9
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
10
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
11
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
12
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
13
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
14
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' }
15
-  ])
8
+  const { CustomerId = null, AddFollow = () => {} } = props
9
+  const [PageList, setPageList] = useState([])
16 10
   const [IsPull, setPull] = useState(false)
17
-  const [PullTimer, setPullTimer] = useState(null)
11
+  const [pageNumber, setPageNumber] = useState(1)
12
+  const [HasNextPage, setHasNextPage] = useState(true)
13
+
14
+  useEffect(() => {
15
+    GetPageList()
16
+  }, [pageNumber])
17
+
18
+  const GetPageList = () => {
19
+    setHasNextPage(false)
20
+    fetch({ url: API_ACTIVITY_LIST_CUSTOMER, method: 'get', payload: { pageNumber, pageSize: 10, customerId: CustomerId } }).then((res) => {
21
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
22
+      setHasNextPage(res.current < res.pages)
23
+      setPull(false)
24
+    })
25
+  }
18 26
 
19 27
   const PageRefresh = () => { // 页面下拉刷新回调
20 28
     setPull(true)
21 29
   }
22 30
 
31
+  const PageLoadMore = () => { // 页面上拉加载更多
32
+    if(HasNextPage) {
33
+      setPageNumber(pageNumber + 1)
34
+    }
35
+  }
36
+
23 37
   useEffect(() => { // 下拉刷新触发
24 38
     if (IsPull) {
25
-      clearTimeout(PullTimer)
26
-      setPullTimer(setTimeout(() => {
27
-        setPull(false)
28
-      }, 2000))
39
+      if (pageNumber === 1) {
40
+        GetPageList()
41
+      } else {
42
+        setPageNumber(1)
43
+      }
29 44
     }
30 45
   }, [IsPull])
31 46
 
32 47
   return (
33 48
     <view className='components UserDetailActivityInfo'>
34
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
49
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
35 50
         <view className='PageContent'>
36 51
 
37 52
           <view className='Content'>
53
+            {
54
+              !PageList.length &&
55
+              <text>暂无数据</text>
56
+            }
38 57
             {
39 58
               PageList.map((item, index) => (
40 59
                 <view className='flex-h' key={`Item-${index}`}>
41 60
                   <view className='flex-item'>
42
-                    <text>{item.time}</text>
61
+                    <text>{item.startDate}</text>
43 62
                   </view>
44 63
                   <view className='Line'>
45 64
                     <view></view>
46 65
                   </view>
47 66
                   <view className='flex-item'>
48
-                    <text className='active'>{item.content}</text>
67
+                    <text className='active'>{item.title}</text>
49 68
                   </view>
50 69
                 </view>
51 70
               ))
@@ -53,7 +72,7 @@ export default function UserDetailActivityInfo (props) {
53 72
           </view>
54 73
 
55 74
           <view className='Btn'>
56
-            <text className='active'>添加跟进</text>
75
+            <text className='active' onClick={AddFollow}>添加跟进</text>
57 76
           </view>
58 77
 
59 78
         </view>

+ 6
- 0
src/pages/mine/components/UserDetailActivityInfo/index.scss Wyświetl plik

@@ -20,6 +20,12 @@
20 20
         border-radius: 16px;
21 21
         box-shadow: 0 0 6px 6px rgba(0, 0, 0, 0.03);
22 22
         padding: 50px 30px;
23
+        >text {
24
+          display: block;
25
+          text-align: center;
26
+          font-size: 28px;
27
+          color: #666;
28
+        }
23 29
         >.flex-h {
24 30
           position: relative;
25 31
           overflow: hidden;

+ 14
- 15
src/pages/mine/components/UserDetailBasicInfo/index.jsx Wyświetl plik

@@ -1,11 +1,10 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+import { ScrollView } from '@tarojs/components'
2 3
 import './index.scss'
3
-import Taro from '@tarojs/taro'
4
-import { ScrollView, Image } from '@tarojs/components'
5 4
 import EditUserDetailBasicInfo from '../EditUserDetailBasicInfo/index'
6 5
 
7 6
 export default function UserDetailBasicInfo (props) {
8
-  const { Data = {} } = props
7
+  const { CustomerInfo = {}, AddFollow = () => {} } = props
9 8
   const [ShowEditPopup, setShowEditPopup] = useState(false)
10 9
   const [IsPull, setPull] = useState(false)
11 10
   const [PullTimer, setPullTimer] = useState(null)
@@ -25,7 +24,7 @@ export default function UserDetailBasicInfo (props) {
25 24
 
26 25
   return (
27 26
     <view className='components UserDetailBasicInfo'>
28
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
27
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
29 28
         <view className='PageContent'>
30 29
 
31 30
           <view className='Content'>
@@ -33,7 +32,7 @@ export default function UserDetailBasicInfo (props) {
33 32
               <text>姓名</text>
34 33
               <text>:</text>
35 34
               <view className='flex-item'>
36
-                <text>范丞丞</text>
35
+                <text>{CustomerInfo.name || '-'}</text>
37 36
               </view>
38 37
               <text className='iconfont icon-xiugai active' onClick={() => {setShowEditPopup(true)}}></text>
39 38
               <text className='active' onClick={() => {setShowEditPopup(true)}}>修改</text>
@@ -42,49 +41,49 @@ export default function UserDetailBasicInfo (props) {
42 41
               <text>昵称</text>
43 42
               <text>:</text>
44 43
               <view className='flex-item'>
45
-                <text>Tomorrow</text>
44
+                <text>{CustomerInfo.nickname || '-'}</text>
46 45
               </view>
47 46
             </view>
48 47
             <view className='flex-h'>
49 48
               <text>手机号码</text>
50 49
               <text>:</text>
51 50
               <view className='flex-item'>
52
-                <text>13613949434</text>
51
+                <text>{CustomerInfo.phone || '-'}</text>
53 52
               </view>
54 53
             </view>
55 54
             <view className='flex-h'>
56 55
               <text>性别</text>
57 56
               <text>:</text>
58 57
               <view className='flex-item'>
59
-                <text>男</text>
58
+                <text>{CustomerInfo.sex === 1 ? '' : '女'}</text>
60 59
               </view>
61 60
             </view>
62 61
             <view className='flex-h'>
63 62
               <text>家庭住址</text>
64 63
               <text>:</text>
65 64
               <view className='flex-item'>
66
-                <text>江苏省南京市雨花台区铁心桥街道韩府坊小区</text>
65
+                <text>{CustomerInfo.address || '-'}</text>
67 66
               </view>
68 67
             </view>
69 68
             <view className='flex-h'>
70 69
               <text>工作地址</text>
71 70
               <text>:</text>
72 71
               <view className='flex-item'>
73
-                <text>江苏省南京市雨花台区</text>
72
+                <text>{CustomerInfo.company || '-'}</text>
74 73
               </view>
75 74
             </view>
76 75
             <view className='flex-h'>
77 76
               <text>年龄段</text>
78 77
               <text>:</text>
79 78
               <view className='flex-item'>
80
-                <text>18-25</text>
79
+                <text>{CustomerInfo.age || '-'}</text>
81 80
               </view>
82 81
             </view>
83 82
             <view className='flex-h'>
84 83
               <text>职业</text>
85 84
               <text>:</text>
86 85
               <view className='flex-item'>
87
-                <text>演员</text>
86
+                <text>{CustomerInfo.work || '-'}</text>
88 87
               </view>
89 88
             </view>
90 89
             <view className='flex-h'>
@@ -160,8 +159,8 @@ export default function UserDetailBasicInfo (props) {
160 159
           </view>
161 160
 
162 161
           <view className='Btn'>
163
-            <text className='active'>添加跟进</text>
164
-            <text>变更状态</text>
162
+            <text className='active' onClick={AddFollow}>添加跟进</text>
163
+            {/* <text>变更状态</text> */}
165 164
           </view>
166 165
 
167 166
         </view>

+ 48
- 21
src/pages/mine/components/UserDetailFollowRecord/index.jsx Wyświetl plik

@@ -1,37 +1,63 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+import { ScrollView } from '@tarojs/components'
3
+import { fetch } from '@/utils/request'
4
+import { API_FOLLOW_LIST } from '@/constants/api'
5
+import dayjs from 'dayjs'
2 6
 import './index.scss'
3
-import Taro from '@tarojs/taro'
4
-import { ScrollView, Image } from '@tarojs/components'
5 7
 
6 8
 export default function UserDetailFollowRecord (props) {
7
-  const { Data = {} } = props
8
-  const [PageList, setPageList] = useState([
9
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
10
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
11
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
12
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
13
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' },
14
-    { content: '参加了5D沉浸式 剧场', time: '2019年7月12日 12:30:00' }
15
-  ])
9
+  const { CustomerId = null, AddFollow = () => {}, AddFollowCounts = 0 } = props
10
+  const [PageList, setPageList] = useState([])
16 11
   const [IsPull, setPull] = useState(false)
17
-  const [PullTimer, setPullTimer] = useState(null)
12
+  const [pageNumber, setPageNumber] = useState(1)
13
+  const [HasNextPage, setHasNextPage] = useState(true)
14
+
15
+  useEffect(() => {
16
+    GetPageList()
17
+  }, [pageNumber])
18
+
19
+  useEffect(() => {
20
+    if(AddFollowCounts) {
21
+      if(pageNumber === 1) {
22
+        GetPageList()
23
+      } else {
24
+        setPageNumber(1)
25
+      }
26
+    }
27
+  }, [AddFollowCounts])
28
+
29
+  const GetPageList = () => {
30
+    setHasNextPage(false)
31
+    fetch({ url: API_FOLLOW_LIST, method: 'get', payload: { pageNumber, pageSize: 10, customerId: CustomerId } }).then((res) => {
32
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
33
+      setHasNextPage(res.current < res.pages)
34
+      setPull(false)
35
+    })
36
+  }
18 37
 
19 38
   const PageRefresh = () => { // 页面下拉刷新回调
20 39
     setPull(true)
21 40
   }
22 41
 
42
+  const PageLoadMore = () => { // 页面上拉加载更多
43
+    if(HasNextPage) {
44
+      setPageNumber(pageNumber + 1)
45
+    }
46
+  }
47
+
23 48
   useEffect(() => { // 下拉刷新触发
24 49
     if (IsPull) {
25
-      clearTimeout(PullTimer)
26
-      setPullTimer(setTimeout(() => {
27
-        setPull(false)
28
-      }, 2000))
50
+      if (pageNumber === 1) {
51
+        GetPageList()
52
+      } else {
53
+        setPageNumber(1)
54
+      }
29 55
     }
30 56
   }, [IsPull])
31 57
 
32 58
   return (
33 59
     <view className='components UserDetailFollowRecord'>
34
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
60
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
35 61
         <view className='PageContent'>
36 62
 
37 63
           <view className='Content'>
@@ -39,13 +65,14 @@ export default function UserDetailFollowRecord (props) {
39 65
               PageList.map((item, index) => (
40 66
                 <view className='flex-h' key={`Item-${index}`}>
41 67
                   <view className='flex-item'>
42
-                    <text>{item.time}</text>
68
+                    <text>{dayjs(item.createDate).format('YYYY年MM月DD日 HH:mm:ss')}</text>
43 69
                   </view>
44 70
                   <view className='Line'>
45 71
                     <view></view>
46 72
                   </view>
47 73
                   <view className='flex-item'>
48
-                    <text className='active'>{item.content}</text>
74
+                    <text className='active' style={{textAlign: 'left'}}>{item.recordType}</text>
75
+                    <text style={{textAlign: 'left'}}>{item.recordContent}</text>
49 76
                   </view>
50 77
                 </view>
51 78
               ))
@@ -53,7 +80,7 @@ export default function UserDetailFollowRecord (props) {
53 80
           </view>
54 81
 
55 82
           <view className='Btn'>
56
-            <text className='active'>添加跟进</text>
83
+            <text className='active' onClick={AddFollow}>添加跟进</text>
57 84
           </view>
58 85
 
59 86
         </view>

+ 54
- 52
src/pages/mine/components/UserDetailViewRecord/index.jsx Wyświetl plik

@@ -1,77 +1,79 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+// import Taro from '@tarojs/taro'
3
+import { ScrollView } from '@tarojs/components'
4
+import { fetch } from '@/utils/request'
5
+import { API_VISIT_RECORD } from '@/constants/api'
2 6
 import './index.scss'
3
-import Taro from '@tarojs/taro'
4
-import { ScrollView, Image } from '@tarojs/components'
5 7
 
6 8
 export default function UserDetailViewRecord (props) {
7
-  const { Data = {} } = props
8
-  const [PageList, setPageList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', ''])
9
+  const { CustomerId = null, AddFollow = () => {} } = props
10
+  const [PageList, setPageList] = useState([])
9 11
   const [IsPull, setPull] = useState(false)
10
-  const [PullTimer, setPullTimer] = useState(null)
12
+  const [pageNumber, setPageNumber] = useState(1)
13
+  const [HasNextPage, setHasNextPage] = useState(true)
14
+
15
+  useEffect(() => {
16
+    GetPageList()
17
+  }, [pageNumber])
18
+
19
+  const GetPageList = () => {
20
+    setHasNextPage(false)
21
+    fetch({ url: API_VISIT_RECORD, method: 'get', payload: { pageNumber, pageSize: 10, customerId: CustomerId } }).then((res) => {
22
+      setPageList(pageNumber === 1 ? res.records || [] : PageList.concat(res.records || []))
23
+      setHasNextPage(res.current < res.pages)
24
+      setPull(false)
25
+    })
26
+  }
11 27
 
12 28
   const PageRefresh = () => { // 页面下拉刷新回调
13 29
     setPull(true)
14 30
   }
15 31
 
32
+  const PageLoadMore = () => { // 页面上拉加载更多
33
+    if(HasNextPage) {
34
+      setPageNumber(pageNumber + 1)
35
+    }
36
+  }
37
+
16 38
   useEffect(() => { // 下拉刷新触发
17 39
     if (IsPull) {
18
-      clearTimeout(PullTimer)
19
-      setPullTimer(setTimeout(() => {
20
-        setPull(false)
21
-      }, 2000))
40
+      if (pageNumber === 1) {
41
+        GetPageList()
42
+      } else {
43
+        setPageNumber(1)
44
+      }
22 45
     }
23 46
   }, [IsPull])
24 47
 
25 48
   return (
26 49
     <view className='components UserDetailViewRecord'>
27
-      <ScrollView scroll-y={true} refresher-enabled={true} refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
50
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#fff'>
28 51
         <view className='PageContent'>
29 52
 
30 53
           <view className='Content'>
31
-            <view className='flex-h'>
32
-              <text>查看项目详情</text>
33
-              <text>:</text>
34
-              <view className='flex-item'>
35
-                <text>银城悦见山</text>
36
-              </view>
37
-              <text>2021/05/21 13:00</text>
38
-            </view>
39
-            <view className='flex-h'>
40
-              <text>查看户型图</text>
41
-              <text>:</text>
42
-              <view className='flex-item'>
43
-                <text>银城悦见山</text>
44
-              </view>
45
-              <text>2021/05/21 13:00</text>
46
-            </view>
47
-            <view className='flex-h'>
48
-              <text>报名活动</text>
49
-              <text>:</text>
50
-              <view className='flex-item'>
51
-                <text>银城悦见山</text>
52
-              </view>
53
-              <text>2021/05/21 13:00</text>
54
-            </view>
55
-            <view className='flex-h'>
56
-              <text>在线沟通</text>
57
-              <text>:</text>
58
-              <view className='flex-item'>
59
-                <text>银城悦见山</text>
60
-              </view>
61
-              <text>2021/05/21 13:00</text>
62
-            </view>
63
-            <view className='flex-h'>
64
-              <text>在线咨询</text>
65
-              <text>:</text>
66
-              <view className='flex-item'>
67
-                <text>银城悦见山</text>
68
-              </view>
69
-              <text>2021/05/21 13:00</text>
70
-            </view>
54
+            {
55
+              !PageList.length &&
56
+              <text>暂无数据</text>
57
+            }
58
+            {
59
+              PageList.map((item, index) => (
60
+                <view className='flex-h' key={`ListItem-${index}`}>
61
+                  <text>{item.activity}</text>
62
+                  {
63
+                    (item.activityName || item.buildingName) &&
64
+                    <text>:</text>
65
+                  }
66
+                  <view className='flex-item'>
67
+                    <text>{item.activityName || item.buildingName}</text>
68
+                  </view>
69
+                  <text>{item.visitTime}</text>
70
+                </view>
71
+              ))
72
+            }
71 73
           </view>
72 74
 
73 75
           <view className='Btn'>
74
-            <text className='active'>添加跟进</text>
76
+            <text className='active' onClick={AddFollow}>添加跟进</text>
75 77
           </view>
76 78
 
77 79
         </view>

+ 6
- 0
src/pages/mine/components/UserDetailViewRecord/index.scss Wyświetl plik

@@ -20,6 +20,12 @@
20 20
         border-radius: 16px;
21 21
         box-shadow: 0 0 6px 6px rgba(0, 0, 0, 0.03);
22 22
         padding: 30px;
23
+        >text {
24
+          display: block;
25
+          text-align: center;
26
+          font-size: 28px;
27
+          color: #666;
28
+        }
23 29
         >.flex-h {
24 30
           align-items: flex-start;
25 31
           margin-top: 30px;

+ 86
- 15
src/pages/mine/customerDetail/index.jsx Wyświetl plik

@@ -1,16 +1,21 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+import Taro from "@tarojs/taro";
2 3
 import withLayout from '@/layout'
3
-import './index.scss'
4 4
 import '@/assets/css/iconfont.css'
5
-import { Image } from '@tarojs/components'
5
+import { Image, Textarea } from '@tarojs/components'
6
+import { fetch } from '@/utils/request'
7
+import { API_CUSTOMER_DETAILINFO, API_FOLLOW_LIST } from '@/constants/api'
8
+import { getImgURL } from '@/utils/image'
9
+import './index.scss'
6 10
 import UserDetailBasicInfo from '../components/UserDetailBasicInfo/index'
7 11
 import UserDetailViewRecord from '../components/UserDetailViewRecord/index'
8 12
 import UserDetailActivityInfo from '../components/UserDetailActivityInfo/index'
9 13
 import UserDetailFollowRecord from '../components/UserDetailFollowRecord/index'
10 14
 
11 15
 export default withLayout((props) => {
12
-
13
-  // const [PageProps] = useState(props)
16
+  const [CustomerId] = useState(props.router.params.id)
17
+  const [CustomerInfo, setCustomerInfo] = useState({})
18
+  const [ShowAddFollow, setShowAddFollow] = useState(false)
14 19
   const [MenuList] = useState([
15 20
     { name: '基本信息', id: 1 },
16 21
     { name: '访问记录', id: 2 },
@@ -18,6 +23,16 @@ export default withLayout((props) => {
18 23
     { name: '跟进记录', id: 4 }
19 24
   ])
20 25
   const [CurrentMenuId, setCurrentMenuId] = useState(1)
26
+  const [FollowContent, setFollowContent] = useState('')
27
+  const [FollowAddCounts, setFollowAddCounts] = useState(0)
28
+
29
+  useEffect(() => {
30
+    if (CustomerId) {
31
+      fetch({ url: `${API_CUSTOMER_DETAILINFO}/${CustomerId}` }).then((res) => {
32
+        setCustomerInfo(res)
33
+      })
34
+    }
35
+  }, [CustomerId])
21 36
 
22 37
   const CutMenu = (item) => {
23 38
     return () => {
@@ -25,6 +40,38 @@ export default withLayout((props) => {
25 40
     }
26 41
   }
27 42
 
43
+  const AddFollow = () => {
44
+    setShowAddFollow(true)
45
+  }
46
+
47
+  const FollowInput = (e) => {
48
+    setFollowContent(e.detail.value.substring(0, 10))
49
+  }
50
+
51
+  const SaveFollow = () => {
52
+    fetch({ url: API_FOLLOW_LIST, method: 'post', payload: { recordType: '添加跟进', recordContent: FollowContent, customerSex: CustomerInfo.sex, customerId: CustomerId } }).then((res) => {
53
+      Taro.showToast({
54
+        title: '添加跟进成功',
55
+        icon: 'none'
56
+      })
57
+      setShowAddFollow(false)
58
+      setFollowContent('')
59
+      if (CurrentMenuId === 4) {
60
+        setFollowAddCounts(FollowAddCounts + 1)
61
+      }
62
+    }).catch(() => {
63
+      Taro.showToast({
64
+        title: '添加跟进失败',
65
+        icon: 'none'
66
+      })
67
+    })
68
+  }
69
+
70
+  const CancelAddFollow = () => {
71
+    setShowAddFollow(false)
72
+    setFollowContent('')
73
+  }
74
+
28 75
   return (
29 76
     <view className='Page customerDetail flex-v'>
30 77
 
@@ -34,20 +81,20 @@ export default withLayout((props) => {
34 81
             <view className='centerLabel'>
35 82
               <view className='flex-h'>
36 83
                 <view className='Icon'>
37
-                  <Image mode='aspectFill' src={null}></Image>
84
+                  <Image mode='aspectFill' src={getImgURL(CustomerInfo.avatarurl)}></Image>
38 85
                 </view>
39 86
                 <view className='flex-item'>
40 87
                   <view>
41
-                    <text>徐慧慧</text>
42
-                    <text className='iconfont icon-nvxing'></text>
88
+                    <text>{CustomerInfo.name}</text>
89
+                    <text className={CustomerInfo.sex === 1 ? 'iconfont icon-nanxing' : 'iconfont icon-nvxing'}></text>
43 90
                   </view>
44
-                  <text>136 1394 9434</text>
91
+                  <text>{CustomerInfo.phone}</text>
45 92
                 </view>
46 93
                 <text className='iconfont icon-liaotian'></text>
47
-                <text className='iconfont icon-dianhua'></text>
94
+                <text className='iconfont icon-dianhua' onClick={() => { Taro.makePhoneCall({ phoneNumber: CustomerInfo.phone }) }}></text>
48 95
               </view>
49 96
             </view>
50
-            <text className='Status'>已到访</text>
97
+            <text className='Status'>{CustomerInfo.status === 1 || CustomerInfo.status === 0 ? '已报备' : CustomerInfo.status === 2 ? '已到访' : CustomerInfo.status === 3 ? '已认筹' : '已签约'}</text>
51 98
             <text className='Tips'>NEW</text>
52 99
             <text className='Tips'>NEW</text>
53 100
           </view>
@@ -70,29 +117,53 @@ export default withLayout((props) => {
70 117
           {/* 基本信息 */}
71 118
           {
72 119
             CurrentMenuId === 1 &&
73
-            <UserDetailBasicInfo></UserDetailBasicInfo>
120
+            <UserDetailBasicInfo CustomerId={CustomerId} CustomerInfo={CustomerInfo} AddFollow={AddFollow}></UserDetailBasicInfo>
74 121
           }
75 122
 
76 123
           {/* 访问记录 */}
77 124
           {
78 125
             CurrentMenuId === 2 &&
79
-            <UserDetailViewRecord></UserDetailViewRecord>
126
+            <UserDetailViewRecord CustomerId={CustomerId} AddFollow={AddFollow}></UserDetailViewRecord>
80 127
           }
81 128
 
82 129
           {/* 活动信息 */}
83 130
           {
84 131
             CurrentMenuId === 3 &&
85
-            <UserDetailActivityInfo></UserDetailActivityInfo>
132
+            <UserDetailActivityInfo CustomerId={CustomerId} AddFollow={AddFollow}></UserDetailActivityInfo>
86 133
           }
87 134
 
88 135
           {/* 跟进记录 */}
89 136
           {
90 137
             CurrentMenuId === 4 &&
91
-            <UserDetailFollowRecord></UserDetailFollowRecord>
138
+            <UserDetailFollowRecord CustomerId={CustomerId} AddFollow={AddFollow} AddFollowCounts={FollowAddCounts}></UserDetailFollowRecord>
92 139
           }
93 140
         </view>
94 141
       </view>
95 142
 
143
+      {
144
+        ShowAddFollow &&
145
+        <view className='AddFollow'>
146
+          <view className='centerLabel'>
147
+            <view>
148
+              <view>
149
+                <text>跟进内容</text>
150
+                <view className='FollowContent'>
151
+                  <Textarea placeholder='不超过150字' maxLength={150} value={FollowContent} onInput={FollowInput} />
152
+                </view>
153
+                <view className='Save flex-h'>
154
+                  <view className='flex-item'>
155
+                    <text onClick={CancelAddFollow}>取消</text>
156
+                  </view>
157
+                  <view className='flex-item'>
158
+                    <text onClick={SaveFollow}>保存</text>
159
+                  </view>
160
+                </view>
161
+              </view>
162
+            </view>
163
+          </view>
164
+        </view>
165
+      }
166
+
96 167
     </view>
97 168
   )
98 169
 })

+ 68
- 0
src/pages/mine/customerDetail/index.scss Wyświetl plik

@@ -171,4 +171,72 @@
171 171
       bottom: 0;
172 172
     }
173 173
   }
174
+  >.AddFollow {
175
+    position: fixed;
176
+    width: 100%;
177
+    left: 0;
178
+    top: 0;
179
+    bottom: 0;
180
+    z-index: 100;
181
+    background: rgba(0, 0, 0, 0.6);
182
+    >view {
183
+      width: 100%;
184
+      overflow: hidden;
185
+      >view {
186
+        padding: 0 30px;
187
+        position: relative;
188
+        overflow: hidden;
189
+        >view {
190
+          padding: 30px;
191
+          position: relative;
192
+          overflow: hidden;
193
+          border-radius: 12px;
194
+          background: #fff;
195
+          >text {
196
+            display: block;
197
+            font-size: 30px;
198
+            font-weight: bold;
199
+            white-space: nowrap;
200
+          }
201
+          >.FollowContent {
202
+            position: relative;
203
+            overflow: hidden;
204
+            margin-top: 20px;
205
+            border: 2px solid rgba(0, 0, 0, 0.1);
206
+            padding: 20px;
207
+            box-sizing: border-box;
208
+            >textarea {
209
+              font-size: 28px;
210
+              line-height: 40px;
211
+            }
212
+          }
213
+          >.Save {
214
+            position: relative;
215
+            overflow: hidden;
216
+            margin-top: 30px;
217
+            align-items: center;
218
+            >view {
219
+              margin-left: 60px;
220
+              &:first-child {
221
+                margin-left: 0;
222
+                >text {
223
+                  background: #ccc;
224
+                  color: #333;
225
+                }
226
+              }
227
+              >text {
228
+                display: block;
229
+                text-align: center;
230
+                font-size: 32px;
231
+                line-height: 80px;
232
+                background: #1A3B83;
233
+                color: #fff;
234
+                border-radius: 8px;
235
+              }
236
+            }
237
+          }
238
+        }
239
+      }
240
+    }
241
+  }
174 242
 }

+ 3
- 0
src/pages/mine/customerInfo/index.config.js Wyświetl plik

@@ -0,0 +1,3 @@
1
+export default {
2
+  navigationBarTitleText: '客户基本信息'
3
+}

+ 171
- 0
src/pages/mine/customerInfo/index.jsx Wyświetl plik

@@ -0,0 +1,171 @@
1
+import React, { useState, useEffect } from 'react'
2
+import { useSelector } from 'react-redux'
3
+import withLayout from '@/layout'
4
+import { ScrollView, Input } from '@tarojs/components'
5
+import '@/assets/css/iconfont.css'
6
+import './index.scss'
7
+
8
+export default withLayout(() => {
9
+
10
+  const user = useSelector(state => state.user)
11
+  const [UserInfo, setUserInfo] =useState({
12
+    name: '',
13
+    nickname: '',
14
+    phone: '',
15
+    sex: '',
16
+    address: '',
17
+    company: '',
18
+    agentCode: '',
19
+  })
20
+
21
+  useEffect(() => {
22
+    setUserInfo(user?.userInfo?.person)
23
+  }, [user])
24
+
25
+  return (
26
+    <view className='Page customerInfo'>
27
+
28
+      <ScrollView scroll-y>
29
+        <view className='PageContent'>
30
+
31
+          <text>姓名</text>
32
+          <view className='FormLine flex-h'>
33
+            <view className='flex-item'>
34
+              <Input placeholder='请输入姓名'></Input>
35
+            </view>
36
+          </view>
37
+
38
+          <text>昵称</text>
39
+          <view className='FormLine flex-h'>
40
+            <view className='flex-item'>
41
+              <Input placeholder='请输入昵称'></Input>
42
+            </view>
43
+          </view>
44
+
45
+          <text>手机号码</text>
46
+          <view className='FormLine flex-h'>
47
+            <view className='flex-item'>
48
+              <Input placeholder='请输入手机号码'></Input>
49
+            </view>
50
+          </view>
51
+
52
+          <text>性别</text>
53
+          <view className='FormLine flex-h'>
54
+            <view className='flex-item'>
55
+              <text>请选择</text>
56
+            </view>
57
+            <text className='iconfont icon-jiantoudown'></text>
58
+          </view>
59
+
60
+          <text>家庭住址</text>
61
+          <view className='FormLine flex-h'>
62
+            <view className='flex-item'>
63
+              <Input placeholder='请输入家庭住址'></Input>
64
+            </view>
65
+          </view>
66
+
67
+          <text>工作地址</text>
68
+          <view className='FormLine flex-h'>
69
+            <view className='flex-item'>
70
+              <Input placeholder='请输入工作地址'></Input>
71
+            </view>
72
+          </view>
73
+
74
+          <text>年龄段</text>
75
+          <view className='FormLine flex-h'>
76
+            <view className='flex-item'>
77
+              <text>请选择</text>
78
+            </view>
79
+            <text className='iconfont icon-jiantoudown'></text>
80
+          </view>
81
+
82
+          <text>职业</text>
83
+          <view className='FormLine flex-h'>
84
+            <view className='flex-item'>
85
+              <Input placeholder='请输入职业'></Input>
86
+            </view>
87
+          </view>
88
+
89
+          <text>家庭年收入范围</text>
90
+          <view className='FormLine flex-h'>
91
+            <view className='flex-item'>
92
+              <text>请选择</text>
93
+            </view>
94
+            <text className='iconfont icon-jiantoudown'></text>
95
+          </view>
96
+
97
+          <text>家庭成员数</text>
98
+          <view className='FormLine flex-h'>
99
+            <view className='flex-item'>
100
+              <Input placeholder='请输入家庭成员数'></Input>
101
+            </view>
102
+          </view>
103
+
104
+          <text>已有房产数</text>
105
+          <view className='FormLine flex-h'>
106
+            <view className='flex-item'>
107
+              <Input placeholder='请输入已有房产数'></Input>
108
+            </view>
109
+          </view>
110
+
111
+          <text>已有车辆数</text>
112
+          <view className='FormLine flex-h'>
113
+            <view className='flex-item'>
114
+              <Input placeholder='请输入已有车辆数'></Input>
115
+            </view>
116
+          </view>
117
+
118
+          <text>预计购房时间</text>
119
+          <view className='FormLine flex-h'>
120
+            <view className='flex-item'>
121
+              <text>请选择</text>
122
+            </view>
123
+            <text className='iconfont icon-jiantoudown'></text>
124
+          </view>
125
+
126
+          <text>客户咨询重点</text>
127
+          <view className='FormLine flex-h'>
128
+            <view className='flex-item'>
129
+              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
130
+            </view>
131
+          </view>
132
+
133
+          <text>购房动机</text>
134
+          <view className='FormLine flex-h'>
135
+            <view className='flex-item'>
136
+              <text>请选择</text>
137
+            </view>
138
+            <text className='iconfont icon-jiantoudown'></text>
139
+          </view>
140
+
141
+          <text>客户抗性分析</text>
142
+          <view className='FormLine flex-h'>
143
+            <view className='flex-item'>
144
+              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
145
+            </view>
146
+          </view>
147
+
148
+          <text>客户对项目认可点</text>
149
+          <view className='FormLine flex-h'>
150
+            <view className='flex-item'>
151
+              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
152
+            </view>
153
+          </view>
154
+
155
+          <text>备注</text>
156
+          <view className='FormLine flex-h'>
157
+            <view className='flex-item'>
158
+              <Input placeholder='补充说明(选填)'></Input>
159
+            </view>
160
+          </view>
161
+
162
+          <view className='Btn'>
163
+            <text>提交</text>
164
+          </view>
165
+
166
+        </view>
167
+      </ScrollView>
168
+
169
+    </view>
170
+  )
171
+})

+ 64
- 0
src/pages/mine/customerInfo/index.scss Wyświetl plik

@@ -0,0 +1,64 @@
1
+.Page.customerInfo {
2
+  background: #fff;
3
+  height: 100vh;
4
+  width: 100%;
5
+  > scroll-view {
6
+    width: 100%;
7
+    height: 100%;
8
+    .PageContent {
9
+      position: relative;
10
+      overflow: hidden;
11
+      min-height: 100vh;
12
+      > text {
13
+        font-size: 34px;
14
+        font-weight: bold;
15
+        color: #333;
16
+        display: block;
17
+        text-indent: 40px;
18
+        margin-top: 30px;
19
+      }
20
+      > .flex-h {
21
+        padding: 20px 40px;
22
+        border-bottom: 2px solid rgba(0, 0, 0, 0.12);
23
+        margin-top: 10px;
24
+        align-items: center;
25
+        >view {
26
+          > input {
27
+            display: block;
28
+            width: 100%;
29
+            background: none;
30
+            font-size: 26px;
31
+            line-height: 40px;
32
+            height: 40px;
33
+          }
34
+          >text {
35
+            display: block;
36
+            width: 100%;
37
+            background: none;
38
+            font-size: 26px;
39
+            line-height: 40px;
40
+            height: 40px;
41
+          }
42
+        }
43
+        >text {
44
+          font-size: 30px;
45
+        }
46
+      }
47
+      .Btn {
48
+        padding: 40px;
49
+        position: relative;
50
+        overflow: hidden;
51
+        >text {
52
+          display: block;
53
+          text-align: center;
54
+          font-size: 32px;
55
+          line-height: 92px;
56
+          background: #193C83;
57
+          color: #fff;
58
+          font-weight: bold;
59
+          border-radius: 92px;
60
+        }
61
+      }
62
+    }
63
+  }
64
+}

+ 24
- 19
src/pages/mine/myActivity/index.jsx Wyświetl plik

@@ -13,10 +13,8 @@ export default withLayout(() => {
13 13
   const user = useSelector(state => state.user)
14 14
   const [PageList, setPageList] = useState([])
15 15
   const [IsPull, setPull] = useState(false)
16
-  const [PullTimer, setPullTimer] = useState(null)
17 16
   const [PersonId, setPersonId] = useState(null)
18
-  const [pageNumber, setPageNumber] = useState(null)
19
-  const [pageSize] = useState(10)
17
+  const [pageNumber, setPageNumber] = useState(1)
20 18
   const [HasNextPage, setHasNextPage] = useState(true)
21 19
 
22 20
   useEffect(() => {
@@ -27,36 +25,43 @@ export default withLayout(() => {
27 25
 
28 26
   useEffect(() => {
29 27
     if(PersonId) {
30
-      setPageNumber(1)
28
+      GetPageList()
31 29
     }
32
-  }, [PersonId])
33
-
34
-  useEffect(() => {
35
-    if(pageNumber && HasNextPage) {
36
-      fetch({ url: API_ACTIVITY_LIST_CUSTOMER, method: 'get', payload: { customerId: PersonId, pageNumber, pageSize } }).then((res) => {
37
-        setPageList(res.records || [])
38
-        setHasNextPage(res.current >= res.pages)
39
-      })
40
-    }
41
-  }, [pageNumber])
30
+  }, [pageNumber, PersonId])
42 31
 
43 32
   const PageRefresh = () => { // 页面下拉刷新回调
44 33
     setPull(true)
45 34
   }
46 35
 
36
+  const GetPageList = () => {
37
+    setHasNextPage(false)
38
+    fetch({ url: API_ACTIVITY_LIST_CUSTOMER, method: 'get', payload: { customerId: PersonId, 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
+
47 51
   useEffect(() => { // 下拉刷新触发
48 52
     if (IsPull) {
49
-      clearTimeout(PullTimer)
50
-      setPullTimer(setTimeout(() => {
51
-        setPull(false)
52
-      }, 2000))
53
+      if(pageNumber === 1) {
54
+        GetPageList()
55
+      } else {
56
+        setPageNumber(1)
57
+      }
53 58
     }
54 59
   }, [IsPull])
55 60
 
56 61
   return (
57 62
     <view className='Page myActivity'>
58 63
 
59
-      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#f8f8f8'>
64
+      <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} onscrolltolower={PageLoadMore} refresher-background='#f8f8f8'>
60 65
         <view className='PageContent'>
61 66
           <view className='List'>
62 67
             {

+ 2
- 2
src/pages/mine/myHomepage/index.jsx Wyświetl plik

@@ -163,9 +163,9 @@ export default withLayout(() => {
163 163
             <text>已经到底了~</text>
164 164
           </view>
165 165
 
166
-          <view className='Share'>
166
+          {/* <view className='Share'>
167 167
             <text onClick={() => { setShowPopup(true) }}>生成海报分享好友</text>
168
-          </view>
168
+          </view> */}
169 169
 
170 170
         </view>
171 171
       </ScrollView>

+ 24
- 19
src/pages/mine/myShare/index.jsx Wyświetl plik

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

+ 1
- 1
src/pages/mine/userInfo/index.config.js Wyświetl plik

@@ -1,3 +1,3 @@
1 1
 export default {
2
-  navigationBarTitleText: '基本信息'
2
+  navigationBarTitleText: '个人信息'
3 3
 }

+ 50
- 125
src/pages/mine/userInfo/index.jsx Wyświetl plik

@@ -1,154 +1,79 @@
1
-import React, { useState, useEffect } from 'react'
1
+import { useState, useEffect } from 'react'
2
+import Taro from '@tarojs/taro'
3
+import { useSelector } from 'react-redux'
2 4
 import withLayout from '@/layout'
3
-import './index.scss'
4
-import { ScrollView, Input } from '@tarojs/components'
5
+import { ScrollView, Input, Image } from '@tarojs/components'
6
+import { getImgURL } from '@/utils/image'
7
+import { fetch } from '@/utils/request'
8
+import login from '@/utils/login'
9
+import { API_EDIT_AGENT } from '@/constants/api'
5 10
 import '@/assets/css/iconfont.css'
11
+import './index.scss'
6 12
 
7
-export default withLayout((props) => {
8
-
9
-  // const [PageProps] = useState(props)
13
+export default withLayout(() => {
14
+
15
+  const user = useSelector(state => state.user)
16
+  const [UserInfo, setUserInfo] = useState({})
17
+  const [FormData, setFormData] = useState({
18
+    name: '',
19
+    phone: ''
20
+  })
21
+
22
+  useEffect(() => {
23
+    setUserInfo(user?.userInfo?.person)
24
+    setFormData({name: user?.userInfo?.person.name, phone: user?.userInfo?.person.phone})
25
+  }, [user])
26
+
27
+  const Save = () => {
28
+    fetch({ url: `${API_EDIT_AGENT}?name=${FormData.name}&phone=${FormData.phone}`, method: 'put' }).then(() => {
29
+      Taro.showToast({
30
+        title: '修改成功',
31
+        icon: 'none'
32
+      })
33
+      login({path: '', scene: ''})
34
+    })
35
+  }
36
+
37
+  const FormChange = (key, e) => {
38
+    let Data = {...FormData}
39
+    Data[key] = e.detail.value
40
+    setFormData(Data)
41
+  }
10 42
 
11 43
   return (
12 44
     <view className='Page UserInfo'>
13 45
 
14
-      <ScrollView scroll-y={true} refresher-enabled={false} refresher-background='#fff'>
46
+      <ScrollView scroll-y>
15 47
         <view className='PageContent'>
16 48
 
17
-          <text>姓名</text>
49
+          <text>头像</text>
18 50
           <view className='FormLine flex-h'>
19 51
             <view className='flex-item'>
20
-              <Input placeholder='请输入姓名'></Input>
52
+              <view className='Icon'>
53
+                <Image mode='aspectFill' src={getImgURL(UserInfo.avatarurl)}></Image>
54
+              </view>
21 55
             </view>
56
+            {/* <text className='iconfont icon-jiantouright'></text> */}
22 57
           </view>
23 58
 
24
-          <text>昵称</text>
59
+          <text>用户名</text>
25 60
           <view className='FormLine flex-h'>
26 61
             <view className='flex-item'>
27
-              <Input placeholder='请输入昵称'></Input>
62
+              <Input placeholder='请输入用户名' value={FormData.name} onInput={FormChange.bind(this, 'name')}></Input>
28 63
             </view>
29 64
           </view>
30 65
 
31 66
           <text>手机号码</text>
32 67
           <view className='FormLine flex-h'>
33 68
             <view className='flex-item'>
34
-              <Input placeholder='请输入手机号码'></Input>
35
-            </view>
36
-          </view>
37
-
38
-          <text>性别</text>
39
-          <view className='FormLine flex-h'>
40
-            <view className='flex-item'>
41
-              <text>请选择</text>
42
-            </view>
43
-            <text className='iconfont icon-jiantoudown'></text>
44
-          </view>
45
-
46
-          <text>家庭住址</text>
47
-          <view className='FormLine flex-h'>
48
-            <view className='flex-item'>
49
-              <Input placeholder='请输入家庭住址'></Input>
50
-            </view>
51
-          </view>
52
-
53
-          <text>工作地址</text>
54
-          <view className='FormLine flex-h'>
55
-            <view className='flex-item'>
56
-              <Input placeholder='请输入工作地址'></Input>
57
-            </view>
58
-          </view>
59
-
60
-          <text>年龄段</text>
61
-          <view className='FormLine flex-h'>
62
-            <view className='flex-item'>
63
-              <text>请选择</text>
64
-            </view>
65
-            <text className='iconfont icon-jiantoudown'></text>
66
-          </view>
67
-
68
-          <text>职业</text>
69
-          <view className='FormLine flex-h'>
70
-            <view className='flex-item'>
71
-              <Input placeholder='请输入职业'></Input>
72
-            </view>
73
-          </view>
74
-
75
-          <text>家庭年收入范围</text>
76
-          <view className='FormLine flex-h'>
77
-            <view className='flex-item'>
78
-              <text>请选择</text>
79
-            </view>
80
-            <text className='iconfont icon-jiantoudown'></text>
81
-          </view>
82
-
83
-          <text>家庭成员数</text>
84
-          <view className='FormLine flex-h'>
85
-            <view className='flex-item'>
86
-              <Input placeholder='请输入家庭成员数'></Input>
87
-            </view>
88
-          </view>
89
-
90
-          <text>已有房产数</text>
91
-          <view className='FormLine flex-h'>
92
-            <view className='flex-item'>
93
-              <Input placeholder='请输入已有房产数'></Input>
94
-            </view>
95
-          </view>
96
-
97
-          <text>已有车辆数</text>
98
-          <view className='FormLine flex-h'>
99
-            <view className='flex-item'>
100
-              <Input placeholder='请输入已有车辆数'></Input>
101
-            </view>
102
-          </view>
103
-
104
-          <text>预计购房时间</text>
105
-          <view className='FormLine flex-h'>
106
-            <view className='flex-item'>
107
-              <text>请选择</text>
108
-            </view>
109
-            <text className='iconfont icon-jiantoudown'></text>
110
-          </view>
111
-
112
-          <text>客户咨询重点</text>
113
-          <view className='FormLine flex-h'>
114
-            <view className='flex-item'>
115
-              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
116
-            </view>
117
-          </view>
118
-
119
-          <text>购房动机</text>
120
-          <view className='FormLine flex-h'>
121
-            <view className='flex-item'>
122
-              <text>请选择</text>
123
-            </view>
124
-            <text className='iconfont icon-jiantoudown'></text>
125
-          </view>
126
-
127
-          <text>客户抗性分析</text>
128
-          <view className='FormLine flex-h'>
129
-            <view className='flex-item'>
130
-              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
131
-            </view>
132
-          </view>
133
-
134
-          <text>客户对项目认可点</text>
135
-          <view className='FormLine flex-h'>
136
-            <view className='flex-item'>
137
-              <Input placeholder='请填写  如:地段、交通、社区配套、户型、价格等;'></Input>
138
-            </view>
139
-          </view>
140
-
141
-          <text>备注</text>
142
-          <view className='FormLine flex-h'>
143
-            <view className='flex-item'>
144
-              <Input placeholder='补充说明(选填)'></Input>
69
+              <Input placeholder='请输入手机号码' value={FormData.phone} onInput={FormChange.bind(this, 'phone')}></Input>
145 70
             </view>
146 71
           </view>
147 72
 
148
-          <view className='Btn'>
149
-            <text>提交</text>
150
-          </view>
73
+        </view>
151 74
 
75
+        <view className='Btn'>
76
+          <text onClick={Save}>保存</text>
152 77
         </view>
153 78
       </ScrollView>
154 79
 

+ 31
- 15
src/pages/mine/userInfo/index.scss Wyświetl plik

@@ -8,7 +8,9 @@
8 8
     .PageContent {
9 9
       position: relative;
10 10
       overflow: hidden;
11
-      min-height: 100vh;
11
+      min-height: calc(100vh - 100px);
12
+      z-index: 1;
13
+      padding-bottom: 100px;
12 14
       > text {
13 15
         font-size: 34px;
14 16
         font-weight: bold;
@@ -23,6 +25,18 @@
23 25
         margin-top: 10px;
24 26
         align-items: center;
25 27
         >view {
28
+          >.Icon {
29
+            width: 92px;
30
+            height: 92px;
31
+            position: relative;
32
+            overflow: hidden;
33
+            border-radius: 100%;
34
+            background: #eee;
35
+            >image {
36
+              width: 100%;
37
+              height: 100%;
38
+            }
39
+          }
26 40
           > input {
27 41
             display: block;
28 42
             width: 100%;
@@ -44,20 +58,22 @@
44 58
           font-size: 30px;
45 59
         }
46 60
       }
47
-      .Btn {
48
-        padding: 40px;
49
-        position: relative;
50
-        overflow: hidden;
51
-        >text {
52
-          display: block;
53
-          text-align: center;
54
-          font-size: 32px;
55
-          line-height: 92px;
56
-          background: #193C83;
57
-          color: #fff;
58
-          font-weight: bold;
59
-          border-radius: 92px;
60
-        }
61
+    }
62
+    .Btn {
63
+      padding: 0 40px;
64
+      position: relative;
65
+      overflow: hidden;
66
+      z-index: 2;
67
+      margin-top: -100px;
68
+      >text {
69
+        display: block;
70
+        text-align: center;
71
+        font-size: 32px;
72
+        line-height: 92px;
73
+        background: #193C83;
74
+        color: #fff;
75
+        font-weight: bold;
76
+        border-radius: 92px;
61 77
       }
62 78
     }
63 79
   }