Sfoglia il codice sorgente

Merge branch 'dev' of http://git.ycjcjy.com/shigongli/miniapp-v2 into dev

吃个甘蔗嚼一年 3 anni fa
parent
commit
2ffe69369f

+ 27
- 4
src/hotel/components/HouseManage/houseManage.jsx Vedi File

@@ -7,7 +7,8 @@ import iconsearch from '@/assets/icons/housemantj/search.png'
7 7
 import './houseManage.less'
8 8
 import {useState, useEffect,useRef } from 'react'
9 9
 import {useDidShow } from '@tarojs/taro'
10
-import {getRoomList} from '@/services/landlord'
10
+import {getRoomList,deleteRoom} from '@/services/landlord'
11
+import ShareRoom from '../shareRoom/ShareRoom.jsx'
11 12
 
12 13
 
13 14
 export default (props) => {
@@ -19,6 +20,27 @@ export default (props) => {
19 20
   const handelClick=()=>{
20 21
     Taro.navigateTo({ url: `/hotel/pages/landlord/addRoom/addRoom?hotelId=${hotel.hotelId}&hotelName=${hotel.hotelName}` });
21 22
   }
23
+  const handelDelete=(roomId)=>{
24
+    deleteRoom(roomId).then(()=>{
25
+      Taro.showToast({
26
+        title: '删除房源成功',
27
+        icon: 'none',
28
+      })
29
+      getRoomList({hotelId:hotel.hotelId}).then((res)=>{
30
+        setDetail(res.records||[])
31
+      })
32
+    })
33
+  }
34
+
35
+  const [showCutover, setShowCutover] = useState(false)
36
+  const [roomId, setRoomId] = useState()
37
+  const ShowMoldeOn = (roomId) => {
38
+    setRoomId(roomId)
39
+    setShowCutover(true)
40
+  }
41
+  const onClose = () => {
42
+    setShowCutover(false)
43
+  }
22 44
   useEffect(()=>{
23 45
     //首次加载页面时
24 46
     if (!mounted.current && hotel.hotelId) {
@@ -46,6 +68,7 @@ export default (props) => {
46 68
             <image className='searchicon' src={iconsearch} />
47 69
             <view className="searchword">请输入关键字搜索</view>
48 70
           </view>
71
+          <ShareRoom showCutover={showCutover} onClose={onClose}  roomId={roomId}/>
49 72
         <scroll-view scroll-y="true" scroll-view='true' bindscrolltoupper="upper" bindscrolltolower="lower" bindscroll="scroll" style={{ height: 'calc(100vh - 255px)' }}>
50 73
 
51 74
           <view>
@@ -54,9 +77,9 @@ export default (props) => {
54 77
               <view className='houseCard'>
55 78
               <view className='houseName'>{item.roomName}</view>
56 79
               <view className='operation'>
57
-                <view><image src={see} /><text>查看入住人</text></view>
58
-                <view><image src={share} /><text>分享链接</text></view>
59
-                <view><image src={del} /><text>删除房源</text></view>
80
+                <view><image src={see} />查看入住人</view>
81
+                <view onClick={()=>ShowMoldeOn(item.roomId)}><image src={share}/>分享链接</view>
82
+                <view onClick={()=>{handelDelete(item.roomId)}}><image src={del} />删除房源</view>
60 83
               </view>
61 84
             </view>
62 85
               )

+ 2
- 4
src/hotel/components/HouseManage/houseManage.less Vedi File

@@ -40,6 +40,8 @@
40 40
   }
41 41
   .operation{
42 42
     column-count: 3;
43
+    font-size: 28px;
44
+    color: #202020;
43 45
     image{
44 46
       width: 28px;
45 47
       height: 28px;
@@ -47,10 +49,6 @@
47 49
       position: relative;
48 50
       top: 5px;
49 51
     }
50
-    text{      
51
-      font-size: 28px;
52
-      color: #202020;
53
-    }
54 52
   }
55 53
 }
56 54
 .addHouse{

+ 12
- 10
src/hotel/components/Income/income.jsx Vedi File

@@ -6,6 +6,8 @@ import sImg from '@/assets/icons/landlord/我的收入2.png'
6 6
 import cutoverUser from '@/assets/icons/UserCenter/cutoverUser.png'
7 7
 import ToggleRole from '@/components/toggleRole/ToggleRole'
8 8
 import Picker from '@/components/Picker'
9
+import formatTime from "@/utils/formatTime";
10
+
9 11
 
10 12
 export default (props) => {
11 13
   const { hotelList, hotel, account, onHotelChange, accountlog } = props
@@ -57,17 +59,17 @@ export default (props) => {
57 59
                 </view></view>
58 60
             </view>
59 61
           </view>
60
-
61
-          <view className='title' >{accountlog.length != '' ? '推广收入记录' : '暂无推广收入'}</view>
62
-          {
63
-            accountlog?.map((item) =>
64
-              <view className='spreadCard'>
65
-                <view className='card'>
66
-                  <view className='spreadTime'>时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;间:<text>{item.createDate}</text></view>
67
-                  <view className='spreadMoney'>收入金额:<text>{parseFloat((item.amount / 100).toFixed(2))}</text>元</view>
68
-                  <image className='spreadImg' src={sImg} />
62
+          
63
+          <view className='title' >{accountlog.length!=''?'推广收入记录':'暂无推广收入'}</view>
64
+            {
65
+              accountlog?.map((item) => 
66
+                <view className='spreadCard'>
67
+                  <view className='card'>
68
+                    <view className='spreadTime'>时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;间:<text>{formatTime(item.createDate,'yyyy/MM/dd hh:mm:ss')}</text></view>
69
+                    <view className='spreadMoney'>收入金额:<text>{parseFloat((item.amount/100).toFixed(2))}</text>元</view>
70
+                    <image className='spreadImg' src={sImg} />
71
+                  </view>
69 72
                 </view>
70
-              </view>
71 73
             )
72 74
           }
73 75
           {accountlog.length != '' ? <view className='botton'>已经到底了~</view> : ''}

+ 35
- 0
src/hotel/components/shareRoom/ShareRoom.jsx Vedi File

@@ -0,0 +1,35 @@
1
+import React from 'react'
2
+import Popup from '@/components/Popup'
3
+import Taro from '@tarojs/taro'
4
+import { Input, Button, View, Picker, Label } from '@tarojs/components'
5
+import './ShareRoom.less'
6
+import { useState } from 'react'
7
+
8
+
9
+export default (props) => {
10
+  const { showCutover, onClose,roomId } = props
11
+  const [date, setDate] = useState('')
12
+  const [roomNum, setRoomNum] = useState(0)
13
+  const handelDate = (e) => {
14
+    setDate(e.detail.value)
15
+  }
16
+const handelShare=()=>{
17
+  if(roomNum!=0&&date!=''){
18
+    console.log(roomNum,date,roomId)
19
+  }
20
+}
21
+  return (
22
+    <Popup show={showCutover} onClose={onClose}>
23
+      <View><Label>入住人数:</Label><Input focus dataField='nm' onInput={(e) => setRoomNum(e.detail.value )} value={roomNum} type='number' placeholder='请输入入住人数' /></View>
24
+      <View>
25
+        <Label>入住时间:</Label>
26
+        <Picker mode='date' onChange={handelDate}>
27
+          <View className='picker'  >
28
+            {date == '' ? '请选择入住时间' : date}
29
+          </View>
30
+        </Picker>
31
+      </View>
32
+      <View><Button className='btn' onClick={onClose}>取消</Button><Button className='btn' onClick={handelShare}>分享</Button></View>
33
+    </Popup>
34
+  )
35
+}

+ 17
- 0
src/hotel/components/shareRoom/ShareRoom.less Vedi File

@@ -0,0 +1,17 @@
1
+  .from-room{
2
+    width: 100%;
3
+    box-shadow: 0px 8px 32px 0px rgba(0, 0, 0, 0.08);
4
+    border-radius: 24px;
5
+    font-size: 1.1em;
6
+    padding: 20px;
7
+    .btn {
8
+      width: 100px;
9
+      height: 92px;
10
+      background: #1A3B83;
11
+      line-height: 92px;
12
+      border-radius: 12px;
13
+      font-size: 40px;
14
+      color: #ffffff;
15
+    }
16
+  }
17
+  

+ 21
- 14
src/hotel/pages/landlord/addRoom/addRoom.jsx Vedi File

@@ -32,21 +32,28 @@ export default withLayout((props) => {
32 32
     })
33 33
   }
34 34
   const sumbit = () => {
35
-    //判断每一项是否为空Object.values(roomModel).filter返回一个数组如果有空属性就是数组长度就不为0
36
-    Object.values(roomModel).filter(item => item == '').length != 0 ?
37
-      Taro.showToast({
38
-        title: '每一项都是必填项哦',
39
-        icon: 'none',
40
-      }) :
41
-      saveRoom(roomModel).then(() => {
42
-       
43
-          Taro.showToast({
35
+    if(
36
+    roomModel.roomName!=''&&
37
+    roomModel.address!=''&&
38
+    roomModel.location!=''&&
39
+    roomModel.weight!=''
40
+    )
41
+     { 
42
+      saveRoom(roomModel).then(() => {       
43
+          Taro.showModal({
44 44
             title: '保存成功',
45
-            icon: 'success',
45
+            showCancel:false
46 46
           }).then(() => {
47 47
             Taro.navigateBack()
48 48
           })
49
+      })       
50
+     } else{
51
+       Taro.showToast({
52
+        title: '有必填项未填哦',
53
+        icon: 'none',
49 54
       })
55
+     }
56
+      
50 57
   }
51 58
   return (
52 59
     <view className='page-index'>
@@ -55,13 +62,13 @@ export default withLayout((props) => {
55 62
         <mp-form models={roomModel} >
56 63
           <mp-cells title='请填写新增的房源信息' footer='  ' >
57 64
             <mp-cell prop='roomName' title='房屋名称:' extClass='font'>
58
-              <input focus dataField='roomName' onInput={(e) => setRoomModel({ ...roomModel, roomName: e.detail.value })} value={roomModel.roomName}  placeholder='请输入房屋名称' />
65
+              <input focus dataField='roomName' onInput={(e) => setRoomModel({ ...roomModel, roomName: e.detail.value })} value={roomModel.roomName}  placeholder='请输入房屋名称(必填)' />
59 66
             </mp-cell>
60 67
             <mp-cell prop='address' title='位置信息:' extClass='font'>
61
-              <input dataField='address' onInput={(e) => setRoomModel({ ...roomModel, address: e.detail.value })} value={roomModel.address}  placeholder='请输入房屋位置' />
68
+              <input dataField='address' onInput={(e) => setRoomModel({ ...roomModel, address: e.detail.value })} value={roomModel.address}  placeholder='请输入房屋位置(必填)' />
62 69
             </mp-cell>
63 70
             <mp-cell prop='location' title='定位经纬度:' extClass='font'>
64
-              <label onClick={onRoomMap}>{roomModel.location == '' ? '房间定位' : roomModel.location}</label>
71
+              <label onClick={onRoomMap}>{roomModel.location == '' ? '房间定位(必填)' : roomModel.location}</label>
65 72
             </mp-cell>
66 73
             <mp-cell prop='parkingAddress' title='停车场位置:' extClass='font'>
67 74
               <input dataField='parkingAddress' onInput={(e) => setRoomModel({ ...roomModel, parkingAddress: e.detail.value })} value={roomModel.parkingAddress}  placeholder='请输入停车场位置' />
@@ -76,7 +83,7 @@ export default withLayout((props) => {
76 83
               <input dataField='wifiPassword' onInput={(e) => setRoomModel({ ...roomModel, wifiPassword: e.detail.value })} value={roomModel.wifiPassword}  placeholder='请输入wifi密码' />
77 84
             </mp-cell>
78 85
             <mp-cell prop='weight' title='权重:' extClass='font'>
79
-              <input type='number' dataField='weight'  onInput={(e) => setRoomModel({ ...roomModel, weight: e.detail.value })} placeholder='请输入权重' />
86
+              <input type='number' dataField='weight'  onInput={(e) => setRoomModel({ ...roomModel, weight: e.detail.value })} placeholder='请输入权重(必填)' />
80 87
             </mp-cell>
81 88
             <mp-cell>
82 89
               <button className='button-OK' onClick={sumbit}>确定</button>

+ 13
- 1
src/layouts/index.jsx Vedi File

@@ -2,14 +2,26 @@
2 2
 import { useMemo } from 'react'
3 3
 import Taro from '@tarojs/taro'
4 4
 import { useModel } from '@/store'
5
+import { getQueryString } from '@/utils'
5 6
 import useRouter from '@/utils/hooks/useRouter'
7
+import useTrackPage from '@/utils/hooks/useTrackPage'
6 8
 import Loading from './Loading'
7 9
 import { getPageBy, getIndexPageOf } from '../routes'
8 10
 
9 11
 export default (Child) => (props) => {
12
+  const location = Taro.getStorageSync('location')
13
+
10 14
   const { person } = useModel('person')
11 15
   const router = useRouter()
12 16
 
17
+  // 埋点页面访问
18
+  const trackPageData = {
19
+    page: router.path,
20
+    params: getQueryString(router.params),
21
+    location,
22
+  }
23
+  useTrackPage(trackPageData)
24
+
13 25
   // 确保人员信息到位
14 26
   const loading = !person?.personRole;
15 27
 
@@ -48,5 +60,5 @@ export default (Child) => (props) => {
48 60
     })
49 61
   }
50 62
 
51
-  return loading ? <Loading /> : <Child {...props} person={person} router={router} />
63
+  return loading ? <Loading /> : <Child {...props} person={person} router={router} location={location} />
52 64
 }

+ 1
- 0
src/pages/index/index.config.js Vedi File

@@ -4,6 +4,7 @@ export default {
4 4
   styleIsolation: 'shared',
5 5
   usingComponents: {
6 6
     "mp-tabbar": "weui-miniprogram/tabbar/tabbar",
7
+    "mp-tabs": "../../../components/tabs/index",
7 8
     "mp-checkbox-group": "weui-miniprogram/checkbox-group/checkbox-group",
8 9
     "mp-checkbox": "weui-miniprogram/checkbox/checkbox",
9 10
     "mp-cells": "weui-miniprogram/cells/cells",

+ 21
- 2
src/pages/index/index.jsx Vedi File

@@ -1,4 +1,4 @@
1
-import React, { useState, useEffect } from 'react'
1
+import React, { useState, useEffect,useRef } from 'react'
2 2
 import Taro from '@tarojs/taro'
3 3
 import CustomNav from '@/components/CustomNav'
4 4
 import logo from '@/assets/icons/comm/logo_small.png'
@@ -8,6 +8,10 @@ import Guide from './tabs/Guide'
8 8
 import Mine from './tabs/Mine'
9 9
 import Recommend from './tabs/Recommend'
10 10
 import './index.less'
11
+import { getLocation } from '@/utils/location'
12
+import { getIndexType,  getResourceList } from '@/services/home'
13
+
14
+
11 15
 
12 16
 export default withLayout((props) => {
13 17
   const { router, person } = props
@@ -16,12 +20,27 @@ export default withLayout((props) => {
16 20
 
17 21
   const [currentTab, setCurrentTab] = useState(0)
18 22
 
23
+  const locRef = useRef()
24
+
19 25
 
20 26
   const handleTabChange = (e) => {
21 27
     const { index } = e.detail
22 28
     setCurrentTab(index)
23 29
   }
24 30
 
31
+  const [queryParams, setQueryParams] = useState({ location: '', pageNum: 1, pageSize: 10, typeId: '' })
32
+
33
+
34
+  useEffect(() => {
35
+    getLocation().then((res) => {
36
+      locRef.current = `${res.longitude},${res.latitude}`
37
+      setQueryParams({
38
+        ...queryParams,
39
+        location: locRef.current
40
+      })
41
+    })  
42
+  }, [])
43
+
25 44
   useEffect(() => {
26 45
     if (tab) {
27 46
       setCurrentTab(tab - 0)
@@ -33,7 +52,7 @@ export default withLayout((props) => {
33 52
         <CustomNav logo={logo} title='十公里' />
34 53
       </view>
35 54
       <view className='index-container'>
36
-        {currentTab === 0 && <Recommend />}
55
+        {currentTab === 0 && <Recommend loc={locRef} qp={queryParams}/>}
37 56
         {currentTab === 1 && <Guide person={person} router={router} />}
38 57
         {/* {currentTab === 2 && <Strategy />} */}
39 58
         {currentTab === 2 && <Mine person={person} />}

+ 10
- 15
src/pages/index/tabs/Recommend.jsx Vedi File

@@ -11,15 +11,20 @@ import './less/Recommend.less'
11 11
 
12 12
 
13 13
 export default (props) => {
14
-  const { router, person } = props
14
+  const { router, person, loc,qp } = props
15 15
   const [activeTab, setActiveTab] = useState(0)
16 16
   const { params } = useRouter()
17 17
   const { tabJump } = params || {}
18 18
   const [typeList, setTypeList] = useState([])
19 19
   
20
-  const locRef = useRef()
21
-
22
-  const [queryParams, setQueryParams] = useState({ location: '', pageNum: 1, pageSize: 10, typeId: '' })
20
+  const locRef = useRef(loc)
21
+  // if(locRef.current==null){
22
+  //     Taro.showLoading()
23
+  //   }
24
+  //   if (locRef.current!=null) {
25
+  //     Taro.hideLoading()
26
+  //   }
27
+  const [queryParams, setQueryParams] = useState(qp)
23 28
 
24 29
   // 获取资源表信息
25 30
   const [alllist, setAllList] = useState([])
@@ -40,14 +45,7 @@ export default (props) => {
40 45
   }
41 46
 
42 47
   useEffect(() => {
43
-    getLocation().then((res) => {
44
-      locRef.current = `${res.longitude},${res.latitude}`
45
-      setQueryParams({
46
-        ...queryParams,
47
-        location: locRef.current
48
-      })
49
-    })
50
-
48
+    
51 49
     //查询分类标签表
52 50
     getIndexType({ pageSize: 20 }).then((res) => {
53 51
       setTypeList(res.records || [])
@@ -78,9 +76,6 @@ export default (props) => {
78 76
   }
79 77
 
80 78
 
81
-  const RefreshCard=()=>{
82
-    console.log(1111)
83
-  }
84 79
 
85 80
   
86 81
   return (

+ 2
- 2
src/pages/index/tabs/less/Recommend.less Vedi File

@@ -141,7 +141,7 @@
141 141
     }
142 142
   }
143 143
   .tabs-Unselected {
144
-    width: 20vw;      
144
+    width: 25vw;      
145 145
     font-weight: bold;
146 146
     color: #C0C8D3; 
147 147
     text-align: center;
@@ -154,7 +154,7 @@
154 154
   .tabs-Selected {
155 155
     font-size: 32px;
156 156
     color: #4C4C4C;
157
-    width: 20vw;      
157
+    width: 25vw;      
158 158
     font-weight: bold;
159 159
     text-align: center;
160 160
     border-bottom: 6px solid #4C4C4C;

+ 15
- 0
src/services/track.js Vedi File

@@ -0,0 +1,15 @@
1
+import request from '@/utils/request'
2
+
3
+/**
4
+ * 埋点页面访问
5
+ * @param {*} data 
6
+ * @returns 
7
+ */
8
+export const trackPage = (data) => request('/track/page', { data, method: 'post', skipError: true })
9
+
10
+/**
11
+ * 更新埋点访问
12
+ * @param {*} id 
13
+ * @returns 
14
+ */
15
+export const updateTrackPage = (id) => request(`/track/page/${id}`, { method: 'put', skipError: true })

+ 25
- 0
src/utils/hooks/useTrackPage.js Vedi File

@@ -0,0 +1,25 @@
1
+
2
+import { useRef } from 'react'
3
+import { useDidShow, useDidHide, nextTick } from '@tarojs/taro'
4
+import { trackPage, updateTrackPage } from '@/services/track'
5
+
6
+export default (payload) => {
7
+  const payloadRef = useRef()
8
+  const resRef = useRef()
9
+  payloadRef.current = payload
10
+
11
+  useDidShow(() => {
12
+    trackPage(payloadRef.current).then((res) => {
13
+      resRef.current = res;
14
+    }).catch((err) => {
15
+      console.error(err);
16
+    })
17
+  })
18
+
19
+  useDidHide(() => {
20
+    if (resRef.current) {
21
+      updateTrackPage(resRef.current.trackId)
22
+      resRef.current = undefined
23
+    }
24
+  })
25
+}

+ 22
- 0
src/utils/index.js Vedi File

@@ -1,4 +1,9 @@
1 1
 
2
+/**
3
+ * queryString 转 object
4
+ * @param {*} queryStr 
5
+ * @returns 
6
+ */
2 7
 export function parseQueryString(queryStr) {
3 8
   if (!queryStr) {
4 9
     return;
@@ -20,3 +25,20 @@ export function parseQueryString(queryStr) {
20 25
   }, {});
21 26
   return params;
22 27
 }
28
+
29
+/**
30
+ * object 转 queryStr
31
+ * @param {*} params 
32
+ * @returns 
33
+ */
34
+export function getQueryString(params) {
35
+  if (!params) return ;
36
+
37
+  const keys = Object.keys(params)
38
+  const arr = keys.map((key) => {
39
+    const val = params[key]
40
+    return `${key}=${encodeURIComponent(val)}`
41
+  })
42
+
43
+  return arr.join('&')
44
+}

+ 17
- 1
src/utils/preFetchData.js Vedi File

@@ -5,7 +5,23 @@ export default () => {
5 5
   const personId = Taro.getStorageSync('personId')
6 6
   const openid = Taro.getStorageSync('openid')
7 7
 
8
-  return Promise.resolve({ personId, openid })
8
+  return new Promise((resolve, reject) => {
9
+    Taro.getLocation({
10
+      success(res) {
11
+        const location = `${res.longitude},${res.latitude}`
12
+        Taro.setStorageSync('location', location)
13
+        resolve({
14
+          location,
15
+          personId,
16
+          openid
17
+        })
18
+      },
19
+      fail(err) {
20
+        console.error(err)
21
+        reject(err)
22
+      }
23
+    })
24
+  })
9 25
 
10 26
   // return new Promise((resolve, reject) => {
11 27
   //   Taro.getBackgroundFetchData({

+ 2
- 13
src/utils/request.js Vedi File

@@ -1,23 +1,12 @@
1 1
 
2 2
 import Taro from '@tarojs/taro'
3
+import { getQueryString } from '.'
3 4
 
4 5
 const logger = Taro.getRealtimeLogManager()
5 6
 
6
-const object2QueryString = (params) => {
7
-  if (!params) return ;
8
-
9
-  const keys = Object.keys(params)
10
-  const arr = keys.map((key) => {
11
-    const val = params[key]
12
-    return `${key}=${encodeURIComponent(val)}`
13
-  })
14
-
15
-  return arr.join('&')
16
-}
17
-
18 7
 export default (url, options) => {
19 8
   const { params, skipError, header, ...leftOptions } = options || {}
20
-  const queryStr = object2QueryString(params)
9
+  const queryStr = getQueryString(params)
21 10
 
22 11
   const urlWithParams = queryStr ? `${url}?${queryStr}` : url;
23 12
   const nwUrl = `${HOST}/api/wx${urlWithParams}`