xll 1 일 전
부모
커밋
1d271cd924
49개의 변경된 파일1752개의 추가작업 그리고 858개의 파일을 삭제
  1. 2 1
      app.json
  2. 66 39
      nova-tourism/components/collect/index.js
  3. 2 2
      nova-tourism/components/collect/index.less
  4. 39 36
      nova-tourism/components/collect/index.wxml
  5. 0 0
      nova-tourism/components/collect/index.wxss
  6. 108 10
      nova-tourism/components/dev-route/index.js
  7. 106 94
      nova-tourism/components/dev-route/index.less
  8. 82 52
      nova-tourism/components/dev-route/index.wxml
  9. 7 0
      nova-tourism/components/dev-route/index.wxss
  10. 2 1
      nova-tourism/components/homestay/index.less
  11. 2 0
      nova-tourism/components/homestay/index.wxss
  12. 32 3
      nova-tourism/components/suggest/index.js
  13. 1 1
      nova-tourism/components/suggest/index.less
  14. 29 21
      nova-tourism/components/suggest/index.wxml
  15. 0 1
      nova-tourism/components/suggest/index.wxss
  16. 1 1
      nova-tourism/pages/collect/collect-detail/index.less
  17. 3 3
      nova-tourism/pages/collect/collect-detail/index.wxml
  18. 1 1
      nova-tourism/pages/collect/collect-detail/index.wxss
  19. 153 0
      nova-tourism/pages/collect/good-list/index.js
  20. 10 0
      nova-tourism/pages/collect/good-list/index.json
  21. 90 0
      nova-tourism/pages/collect/good-list/index.less
  22. 32 0
      nova-tourism/pages/collect/good-list/index.wxml
  23. 89 0
      nova-tourism/pages/collect/good-list/index.wxss
  24. 1 2
      nova-tourism/pages/homestay/homestay-detail/index.js
  25. 6 29
      nova-tourism/pages/homestay/homestay-detail/index.wxml
  26. 149 106
      nova-tourism/pages/my/merchant/code-verify/index.js
  27. 27 0
      nova-tourism/pages/my/merchant/code-verify/index.less
  28. 69 38
      nova-tourism/pages/my/merchant/code-verify/index.wxml
  29. 81 1
      nova-tourism/pages/my/merchant/code-verify/index.wxss
  30. 69 42
      nova-tourism/pages/my/merchant/merchant-home/account/index.js
  31. 2 1
      nova-tourism/pages/my/merchant/merchant-home/account/index.json
  32. 2 2
      nova-tourism/pages/my/merchant/merchant-home/account/index.less
  33. 16 6
      nova-tourism/pages/my/merchant/merchant-home/account/index.wxml
  34. 58 1
      nova-tourism/pages/my/merchant/merchant-home/account/index.wxss
  35. 1 1
      nova-tourism/pages/my/merchant/merchant-home/index.js
  36. 1 1
      nova-tourism/pages/my/merchant/room-manage/index.js
  37. 14 7
      nova-tourism/pages/my/merchant/room-manage/room-edit/index.js
  38. 2 1
      nova-tourism/pages/my/merchant/room-manage/room-edit/index.json
  39. 56 66
      nova-tourism/pages/my/merchant/room-manage/room-edit/index.wxml
  40. 39 11
      nova-tourism/pages/my/my-order/index.js
  41. 5 4
      nova-tourism/pages/my/my-order/index.wxml
  42. 238 180
      nova-tourism/pages/my/my-order/order-detail/index.js
  43. 4 1
      nova-tourism/pages/my/my-order/order-detail/index.json
  44. 20 0
      nova-tourism/pages/my/my-order/order-detail/index.less
  45. 23 87
      nova-tourism/pages/my/my-order/order-detail/index.wxml
  46. 0 0
      nova-tourism/pages/my/my-order/order-detail/index.wxss
  47. 1 1
      nova-tourism/pages/my/my-wallet/index.wxml
  48. 1 1
      nova-tourism/pages/my/my-wallet/loose-change/index.wxml
  49. 10 3
      project.private.config.json

+ 2 - 1
app.json

@@ -39,7 +39,8 @@
         "pages/my/my-order/order-detail-good/index",
         "pages/my/my-order/my-refund/refund-good/index",
         "pages/my/merchant/good/good-edit/index",
-        "pages/my/merchant/good/good-list/index"
+        "pages/my/merchant/good/good-list/index",
+        "pages/collect/good-list/index"
       ]
     },
     {

+ 66 - 39
nova-tourism/components/collect/index.js

@@ -17,22 +17,28 @@ Component({
    */
   data: {
     taps: [{
+        id: 'gift',
+        top:900,
         url: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20241230/r1kr6b044821198.png',
         tex: '望仙礼遇',
       },
       {
+        id: 'makeup',
         url: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20241230/r1on6t044840728.png',
         tex: '妆造旅拍',
       },
       {
+        id: 'vegetable',
         url: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20241230/v16vb1044858389.png',
         tex: '望仙果蔬',
       },
       {
+        id: 'serve',
         url: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20241230/dm2ol9044926231.png',
         tex: '房务服务',
       },
       {
+        id: 'school',
         url: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20241231/1pglm9032750560.png',
         tex: '商学院',
       },
@@ -49,9 +55,9 @@ Component({
     istoday: true,
     daysBetween: 1,
     currentTab: 0, // 云上风物/我的收藏
-    banner:[],//热门推荐
-    giftBanner:[],//望仙礼遇-轮播图
-    gift:[],//望仙礼遇-商品
+    banner: [], //热门推荐
+    giftBanner: [], //望仙礼遇-轮播图
+    gift: [], //望仙礼遇-商品
   },
   lifetimes: {
     detached: function () {},
@@ -66,7 +72,7 @@ Component({
    * 组件的方法列表
    */
   methods: {
-    refersh(){
+    refersh() {
       this.getBanner()
       this.getGiftBanner()
       this.getGift()
@@ -78,42 +84,53 @@ Component({
         currentTab: index
       });
     },
-/**获取热门推荐 */
-async getBanner(){
-  let query = new Parse.Query('Banner')
-  query.equalTo('company',company)
-  query.notEqualTo('isDeleted',true)
-  query.equalTo('isEnabled',true)
-  query.equalTo('type','season')
-  query.include('shopGoods')
-  let d = await query.find()
-  let banner = []
-  banner=d?.map(item=>{
-    let obj = {}
-    obj.image = item?.get('image')||item?.get('shopGoods')?.get('image')
-    obj.url = item?.get('url')||`/nova-tourism/pages/collect/collect-detail/index?gid=${item?.get('shopGoods')?.id}`
-    return obj
-  })
-  this.setData({banner})
-},
-/**获取望仙礼遇-轮播图 */
-async getGiftBanner(){
-  let sql = `SELECT good."objectId",good."image"
+    /**获取热门推荐 */
+    async getBanner() {
+      let query = new Parse.Query('Banner')
+      query.equalTo('company', company)
+      query.notEqualTo('isDeleted', true)
+      query.equalTo('isEnabled', true)
+      query.equalTo('type', 'season')
+      query.include('shopGoods')
+      let d = await query.find()
+      let banner = []
+      banner = d?.map(item => {
+        let obj = {}
+        obj.image = item?.get('image') || item?.get('shopGoods')?.get('image')
+        // obj.url = item?.get('url')||`/nova-tourism/pages/collect/collect-detail/index?gid=${item?.get('shopGoods')?.id}`
+        if (item?.get('url')) {
+          obj.url = item?.get('url')
+        } else if (item?.get('shopGoods')?.id) {
+          obj.url = `/nova-tourism/pages/collect/collect-detail/index?gid=${item?.get('shopGoods')?.id}`
+        } else {
+          obj.url = ''
+        }
+        return obj
+      })
+      this.setData({
+        banner
+      })
+    },
+    /**获取望仙礼遇-轮播图 */
+    async getGiftBanner() {
+      let sql = `SELECT good."objectId",good."image"
   FROM "ShopGoods" good
-  WHERE good."company" = 'EbxZUK5lBI'
+  WHERE good."company" = '${company}'
   AND good."isDeleted" IS NOT TRUE
   AND good."status" IS TRUE
   ORDER BY COALESCE(good."isRecom", FALSE) DESC,
   CASE WHEN good."top"= 0 THEN 1 ELSE 0 END,
   good."top" ASC
   LIMIT 8`
-  let giftBanner = await req.customSQL(sql)||[]
-  this.setData({giftBanner})
-  console.log(giftBanner)
-},
-/** 获取望仙礼遇-商品*/
-async getGift(){
-  let sql = `SELECT good."objectId",good."name",good."price",good."image"
+      let giftBanner = await req.customSQL(sql) || []
+      this.setData({
+        giftBanner
+      })
+      console.log(giftBanner)
+    },
+    /** 获取望仙礼遇-商品*/
+    async getGift() {
+      let sql = `SELECT good."objectId",good."name",good."price",good."image"
   FROM "ShopGoods" good
   WHERE good."company" = '${company}'
   AND good."isDeleted" IS NOT TRUE
@@ -122,12 +139,22 @@ async getGift(){
   CASE WHEN good."top"= 0 THEN 1 ELSE 0 END,
   good."top" ASC,good."createdAt"
   LIMIT 4`
-  let gift = await req.customSQL(sql)||[]
-  console.log(gift)
-  this.setData({gift})
-},
-
-
+      let gift = await req.customSQL(sql) || []
+      console.log(gift)
+      this.setData({
+        gift
+      })
+    },
+    /**锚点跳转 */
+    anchors(e) {
+      let {
+        top
+      } = e.currentTarget.dataset
+      wx.pageScrollTo({
+        scrollTop:top,
+        duration: 300
+      });
+    },
 
 
     //获取收藏店铺消息

+ 2 - 2
nova-tourism/components/collect/index.less

@@ -54,11 +54,11 @@
         }
         .picturebox{
             width: 700rpx;
-            height: 714rpx;
+            height: 908rpx;
             position: relative;
             .img{
                 width: 100%;
-                height: 714rpx;
+                height: 908rpx;
                 image{
                     width: 100%;
                     height: 100%;

+ 39 - 36
nova-tourism/components/collect/index.wxml

@@ -14,7 +14,7 @@
     <view class="box">
       <view class="taps">
         <block wx:for="{{taps}}" wx:key="index">
-          <view class="tap">
+          <view class="tap" data-top="{{item.top}}" bind:tap="anchors">
             <image src="{{item.url}}"></image>
             <view class="tap-tex">{{item.tex}}</view>
           </view>
@@ -31,45 +31,48 @@
         </swiper>
       </view>
 
-      <view class="wangbox">
-        <view class="wang">望仙礼遇</view>
-        <view class="wang2">望日w望月w来望仙w</view>
-      </view>
-      <view class="picturebox2">
-        <swiper autoplay="{{true}}" indicator-dots='{{true}}' indicator-color='#D9D9D9' indicator-active-color='#F8DA7F' interval="{{5000}}" circular duration="{{500}}" class="img">
-          <block wx:for="{{giftBanner}}" wx:key="index" wx:for-item="gifban">
-            <swiper-item class="img">
-              <image style="border-radius: 10rpx;" src="{{gifban.image}}" mode="aspectFill"></image>
-            </swiper-item>
-          </block>
-        </swiper>
-      </view>
-
-      <view class="wang-cardbox">
-        <block wx:for="{{gift}}" wx:key="index">
-          <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
-            <image src="{{item.image||'https://img95.699pic.com/photo/60072/5330.jpg_wh860.jpg'}}" mode="aspectFill"></image>
-            <view class="wang-catex">{{item.name}}</view>
-            <view class="wang-numbox">
-              <view class="wang-num">
-                <view class="wang-num1">¥</view>
-                <view class="wang-num2">{{item.price||0}}</view>
+      <view id="gift">
+        <view class="wangbox">
+          <view class="wang">望仙礼遇</view>
+          <view class="wang2">望日w望月w来望仙w</view>
+        </view>
+        <view class="picturebox2">
+          <swiper autoplay="{{true}}" indicator-dots='{{true}}' indicator-color='#D9D9D9' indicator-active-color='#F8DA7F' interval="{{5000}}" circular duration="{{500}}" class="img">
+            <block wx:for="{{giftBanner}}" wx:key="index" wx:for-item="gifban">
+              <swiper-item class="img">
+                {{}}
+                <image data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{gifban.objectId}}" bindtap="tourl" style="border-radius: 10rpx;" src="{{gifban.image||'https://file-cloud.fmode.cn/EbxZUK5lBI/20250411/frvr1u080411965.jpg'}}" mode="aspectFill"></image>
+              </swiper-item>
+            </block>
+          </swiper>
+        </view>
+        <view class="wang-cardbox">
+          <block wx:for="{{gift}}" wx:key="index">
+            <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
+              <image src="{{item.image||'https://img95.699pic.com/photo/60072/5330.jpg_wh860.jpg'}}" mode="aspectFill"></image>
+              <view class="wang-catex">{{item.name}}</view>
+              <view class="wang-numbox">
+                <view class="wang-num">
+                  <view class="wang-num1">¥</view>
+                  <view class="wang-num2">{{item.price||0}}</view>
+                </view>
+                <view class="wang-submit">购买</view>
               </view>
-              <view class="wang-submit">购买</view>
             </view>
-          </view>
-        </block>
-      </view>
-
-      <view class="more">
-        <view class="more-tex">查看更多 ></view>
+          </block>
+        </view>
+        <view class="more" data-url="/nova-tourism/pages/collect/good-list/index" bind:tap="tourl">
+          <view class="more-tex">查看更多 ></view>
+        </view>
       </view>
-
-      <view class="wangbox">
-        <view class="wang">妆造旅拍</view>
+      <view id="makeup">
+        <view class="wangbox">
+          <view class="wang">妆造旅拍</view>
+        </view>
       </view>
-
-
+      <view id="vegetable"></view>
+      <view id="serve"></view>
+      <view id="school"></view>
     </view>
   </view>
   <view wx:if="{{currentTab == 1}}">

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
nova-tourism/components/collect/index.wxss


+ 108 - 10
nova-tourism/components/dev-route/index.js

@@ -4,7 +4,15 @@ const company = getApp().globalData.company
 const uid = Parse.User.current()?.id
 const req = require('../../../utils/request')
 Component({
-
+  //字段编辑对象示例:
+  // edit_field_map: {
+  //   isRecom:{
+  //     isHide:true,//是否隐藏 - 此项非DevRouter编辑
+  //     disabled: true,//禁止编辑
+  //     required: true,//必填项
+  //     default:true,//默认值
+  //   },
+  // }, 
   /**
    * 组件的属性列表
    */
@@ -35,6 +43,17 @@ Component({
   lifetimes: {
     detached: function () {},
     attached: async function () {
+      console.log(`
+      //字段编辑对象示例:
+      // edit_field_map: {
+      //   isRecom:{
+      //     isHide:true,//是否隐藏 - 此项非DevRouter编辑
+      //     disabled: true,//禁止编辑
+      //     required: true,//必填项
+      //     default:true,//默认值
+      //   },
+      // }, 
+      `)
       this.getToken()
       setTimeout(() => {
         this.refersh()
@@ -71,7 +90,7 @@ Component({
       let editFieldsList = []
       for (let i in devRoute?.editFields) {
         let item = devRoute?.editFields[i]
-        if (item.key in edit_field_map) { //如果当前字段存在于父组件传递的默认编辑字段之内
+        if (edit_field_map && item.key in edit_field_map) { //如果当前字段存在于父组件传递的默认编辑字段之内
           if (('isHide' in edit_field_map[item.key]) && edit_field_map[item.key]['isHide']) {} else { //排除isHide为true的字段,其他字段使用父组件默认编辑
             for (let map_key in edit_field_map[item.key]) {
               devRoute.editFields[i][map_key] = edit_field_map[item.key][map_key]
@@ -516,7 +535,54 @@ Component({
       })
     },
 
-    //#region ShopGoods表specMap字段编辑  ================================================
+    /**选择位置 */
+    chooseGeoPoint(e) {
+      let {
+        editMap
+      } = this.data
+      let {
+        key
+      } = e.currentTarget.dataset
+      let that = this
+      wx.chooseLocation({
+        latitude: 0,
+        longitude: 0,
+        success: (res) => {
+          console.log(res)
+          editMap[key].val = {
+            __type: 'GeoPoint',
+            latitude: res.latitude || 0,
+            longitude: res.longitude || 0
+          }
+          editMap[key].text = (res.address || '') + (res.name || '')
+          that.setData({
+            editMap
+          })
+        }
+      })
+    },
+    /** textarea改变 - Object类型内属性值改变 */
+    changeJsonTextarea(e) {
+      let {
+        editMap
+      } = this.data
+      console.log(e)
+      let {
+        key,
+        json_key
+      } = e.currentTarget.dataset
+      let {
+        value
+      } = e.detail
+      let obj = editMap[key].val||{}
+      obj[json_key] = value
+      editMap[key].val=obj
+      this.setData({
+        editMap
+      })
+    },
+
+    //#region Object类型 规格specMap编辑  ================================================
     /**添加属性 - specMap字段 */
     addKey_ShopGoods_specMap(e) {
       console.log(e)
@@ -554,7 +620,6 @@ Component({
       console.log(key, spec_index)
       let text = editMap[key].val.specList[spec_index]
       console.log(text)
-
       delete editMap[key].val[text]
       editMap[key].val.specList.splice(spec_index, 1)
       this.setData({
@@ -668,7 +733,6 @@ Component({
       }
       for (let i in editFields) {
         let item = editFields[i]
-
         if (item.required && ((!editMap[item.key].val) || editMap[item.key].val?.length <= 0)) {
           wx.showToast({
             title: `${item.name} 为必填项,请补充`,
@@ -676,10 +740,14 @@ Component({
           })
           return
         }
-        if((!editMap[item.key].val) || editMap[item.key].val?.length <= 0) continue
+        if ((!editMap[item.key].val) || editMap[item.key].val?.length <= 0) continue
         if (item.type == 'Number') {
           editMapParse[item.key] = parseFloat(editMap[item.key].val)
-        } else if (item.type == 'String' && item.view == 'edit-image') {
+        }
+        else if(item.type == 'Pointer'){
+          editMapParse[item.key] = {__type:'Pointer',className:item?.targetClass,objectId:editMap[item.key].val?.objectId}
+        }
+        else if (item.type == 'String' && item.view == 'edit-image') {
           editMapParse[item.key] = editMap[item.key].val[0]?.url
         } else if (item.type == 'Array') {
           if (item.view == 'edit-image') {
@@ -694,6 +762,7 @@ Component({
             })
           }
         }
+        console.log(item.key, editMapParse[item.key] || editMap[item.key].val)
         queryParamsData.set(item.key, editMapParse[item.key] || editMap[item.key].val)
       }
       console.log(editMap)
@@ -704,8 +773,37 @@ Component({
           delta: 1
         })
       }, 1000);
-     
-    }
-
+    },
+    /** 复制*/
+    copyStr(e) {
+      let {
+        str
+      } = e.currentTarget.dataset
+      if (str) {
+        wx.setClipboardData({
+          data: str,
+          success: () => {
+            wx.showToast({
+              title: '复制成功',
+              icon: 'success',
+            });
+          },
+          fail: (err) => {
+            console.error('复制失败:', err);
+            wx.showToast({
+              title: '复制失败',
+              icon: 'none',
+              duration: 2000
+            });
+          }
+        });
+      } else {
+        wx.showToast({
+          title: '文本为空',
+          icon: 'none',
+          duration: 2000
+        });
+      }
+    },
   }
 })

+ 106 - 94
nova-tourism/components/dev-route/index.less

@@ -12,134 +12,146 @@
         font-size: @name-size;
         padding-bottom: 10rpx;
     }
-.content{
-    padding: 0 20rpx;
-    .text {
-        display: flex;
-        align-items: flex-end;
-
-        >textarea {
-            width: 550rpx;
-            padding: 10rpx;
-            margin: 5rpx 0;
-            font-size: @text-size;
-            min-height: 100rpx;
-            background: whitesmoke;
-        }
 
-        .btn {
-            margin: 0 10rpx;
-            padding: 5rpx 10rpx;
-            font-size: @text-size;
-            background: @main-color;
-        }
+    .content {
+        padding: 0 20rpx;
 
-        .title {
-            margin-right: 20rpx;
-            font-size: @text-size;
-        }
-    }
+        .text {
+            display: flex;
+            align-items: flex-end;
 
-    .radioGroup {
-        .radio {
-            font-size: @text-size;
-            padding: 5rpx;
-        }
-    }
+            >textarea {
+                width: 550rpx;
+                padding: 10rpx;
+                margin: 5rpx 0;
+                font-size: @text-size;
+                min-height: 100rpx;
+                background: whitesmoke;
+            }
 
-    .tags {
-        margin-bottom: 10rpx;
+            .btn {
+                margin: 0 10rpx;
+                padding: 5rpx 10rpx;
+                font-size: @text-size;
+                background: @main-color;
+            }
 
-        van-tag {
-            margin-right: 10rpx;
+            .title {
+                margin-right: 20rpx;
+                font-size: @text-size;
+            }
         }
-    }
 
-    .btn_Pointer {
-        width: 50vw;
-
-        button {
-            font-size: 26rpx;
-            width: 50vw;
+        .radioGroup {
+            .radio {
+                font-size: @text-size;
+                padding: 5rpx;
+            }
         }
-    }
 
-    .specMap {
-        .tip {
-            font-size: @text-size;
-            color: red;
+        .tags {
+            margin-bottom: 10rpx;
+
+            van-tag {
+                margin-right: 10rpx;
+            }
         }
 
-        .list {
-            .tags {
-                .title {
-                    font-weight: bold;
-                    font-size: @text-size;
-                }
+        .btn_Pointer {
+            width: 50vw;
+
+            button {
+                font-size: 26rpx;
+                width: 50vw;
             }
         }
 
-        .obj {
-            .title {
-                margin: 10rpx 0;
-                font-weight: bold;
+        .specMap {
+            .tip {
                 font-size: @text-size;
+                color: red;
             }
 
-            .obj_item {
-                margin: 10rpx;
-                padding: 10rpx;
-                background: whitesmoke;
+            .list {
+                .tags {
+                    .title {
+                        font-weight: bold;
+                        font-size: @text-size;
+                    }
+                }
+            }
 
-                .key {
+            .obj {
+                .title {
+                    margin: 10rpx 0;
                     font-weight: bold;
                     font-size: @text-size;
                 }
 
-                .info {
-                    .info_item {
-                        display: flex;
-                        padding: 10rpx 0;
-                        border-bottom: 1rpx solid white;
-                        position: relative;
+                .obj_item {
+                    margin: 10rpx;
+                    padding: 10rpx;
+                    background: whitesmoke;
 
-                        >view {
-                            margin: 0 3rpx;
-                            >text {
-                                font-size: @text-size;
-                            }
+                    .key {
+                        font-weight: bold;
+                        font-size: @text-size;
+                    }
 
-                            >input {
-                                border: 1rpx solid rgb(201, 201, 201);
-                                padding: 10rpx;
-                                font-size: @text-size;
+                    .info {
+                        .info_item {
+                            display: flex;
+                            padding: 10rpx 0;
+                            border-bottom: 1rpx solid white;
+                            position: relative;
+
+                            >view {
+                                margin: 0 3rpx;
 
+                                >text {
+                                    font-size: @text-size;
+                                }
+
+                                >input {
+                                    border: 1rpx solid rgb(201, 201, 201);
+                                    padding: 10rpx;
+                                    font-size: @text-size;
+
+                                }
                             }
-                        }
 
-                        .del {
-                            width: 40rpx;
-                            height: 40rpx;
-                            background: rgb(207, 207, 207);
-                            display: flex;
-                            justify-content: center;
-                            position: absolute;
-                            right: 0;
-                            top: 0;
+                            .del {
+                                width: 40rpx;
+                                height: 40rpx;
+                                background: rgb(207, 207, 207);
+                                display: flex;
+                                justify-content: center;
+                                position: absolute;
+                                right: 0;
+                                top: 0;
+                            }
                         }
-                    }
-                    .btn_specMap{
-                        width: 50%;
-                        >button{
-                            font-size: @text-size;
+
+                        .btn_specMap {
+                            width: 50%;
+
+                            >button {
+                                font-size: @text-size;
+                            }
                         }
                     }
                 }
             }
         }
+        .geoPoint{
+                margin-top: 10rpx;
+                font-size: @text-size;
+            >view{
+                margin-top: 10rpx;
+            }
+        }
     }
-}
- 
+
 }
 
 .popup {

+ 82 - 52
nova-tourism/components/dev-route/index.wxml

@@ -1,58 +1,7 @@
 <view class="item" wx:for="{{editFields}}" wx:key="index">
   <view class="name"> <text wx:if="{{item.required}}" style="color: red;">*</text> {{item.name}}:</view>
   <view class="content">
-    <block wx:if="{{className=='ShopGoods'&&item.key=='specMap'}}">
-      <view class="specMap">
-        <view class="tip">不同规格价格不同可在规格属性里面填写价格,价格一样可不填写,编辑完之后需要保存</view>
-        <view class="list">
-          <view class="tags">
-            <text class="title">属性名称:</text>
-            <block wx:for="{{editMap[item.key].val.specList}}" wx:for-item="spec_item" wx:for-index="spec_index" wx:key="spec_item">
-              <van-tag closeable="{{!item.disabled}}" type="primary" size="medium" color="{{color}}" text-color="{{text_color}}" data-key="{{item.key}}" data-spec_index="{{spec_index}}" bind:close="delKey_ShopGoods_specMap">{{spec_item}}</van-tag>
-            </block>
-          </view>
-          <view class="text">
-            <textarea disabled="{{item.disabled}}" confirm-type="点击添加" data-key="{{item.key}}" bindconfirm="addKey_ShopGoods_specMap" placeholder="请输入规格名称(可填多个)" auto-height></textarea>
-          </view>
-        </view>
-        <view class="obj">
-          <view class="title">属性对象:</view>
-          <block wx:for="{{editMap[item.key].val.specList}}" wx:for-item="spec_item" wx:for-index="spec_index" wx:key="spec_item">
-            <view class="obj_item">
-              <view class="key">{{spec_item}}:</view>
-              <view class="info">
-                <block wx:for="{{editMap[item.key].val[spec_item]}}" wx:for-item="spec_map_item" wx:for-index="spec_map_index" wx:key="spec_map_item">
-                  <view class="info_item">
-                    <view>
-                      <text>属性值:</text>
-                      <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setValue" value="{{spec_map_item.value}}" placeholder="输入属性值" type="text" />
-                    </view>
-                    <view>
-                      <text>价格:</text>
-                      <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setPrice" value="{{spec_map_item.price}}" placeholder="输入价格" type="digit" />
-                    </view>                                                
-                    <view>
-                      <text>会员价格:</text>
-                      <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setVipPrice" value="{{spec_map_item.vipPrice}}" placeholder="输入会员价格" type="digit" />
-                    </view>
-                    <view wx:if="{{editMap[item.key].val[spec_item].length>1&&!item.disabled}}" class="del" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bind:tap="delSpecMapItem">
-                      <van-icon name="cross" />
-                    </view>
-                  </view>
-                </block>
-                <view wx:if="{{!item.disabled}}" class="btn_specMap" style="border:1rpx solid {{color}};">
-                  <button data-key="{{item.key}}" data-spec="{{spec_item}}" bind:tap="addSpecMap" style="color: {{color}};">
-                    <van-icon name="plus" />添加
-                  </button>
-                </view>
-              </view>
-            </view>
-          </block>
-
-        </view>
-      </view>
-    </block>
-    <block wx:elif="{{item.type=='String'}}">
+    <block wx:if="{{item.type=='String'}}">
       <block wx:if="{{!item.view}}">
         <view class="text">
           <textarea value="{{editMap[item.key].val}}" data-key="{{item.key}}" bindblur="changeTextarea" placeholder="请输入{{item.name}}" auto-height disabled="{{item.disabled}}"></textarea>
@@ -121,6 +70,87 @@
         <van-icon name="arrow" />
       </view>
     </block>
+    <block wx:elif="{{item.type=='GeoPoint'}}">
+      <view class="btn_Pointer" wx:if="{{!item.disabled}}">
+        <button data-index="{{index}}" data-key="{{item.key}}" bind:tap="chooseGeoPoint" style="background: {{color}};color: {{text_color}};">
+          选择{{item.name}}
+        </button>
+      </view>
+      <view class="geoPoint" wx:if="{{editMap[item.key].val.longitude&&editMap[item.key].val.latitude}}">
+        <block wx:if="{{editMap[item.key].val.longitude}}">
+          经:{{editMap[item.key].val.longitude}}
+        </block>
+        <block wx:if="{{editMap[item.key].val.latitude}}">
+          纬:{{editMap[item.key].val.latitude}}
+        </block>
+        <view wx:if="{{editMap[item.key].text}}" data-str="{{editMap[item.key].text}}" bind:tap="copyStr">
+          {{editMap[item.key].text}}
+          <van-icon name="orders-o" />
+        </view>
+      </view>
+    </block>
+    <block wx:elif="{{item.type=='Object'}}">
+      <block wx:if="{{item.view=='edit-spec'}}">
+        <view class="specMap">
+          <view class="tip">不同规格价格不同可在规格属性里面填写价格,价格一样可不填写,编辑完之后需要保存</view>
+          <view class="list">
+            <view class="tags">
+              <text class="title">属性名称:</text>
+              <block wx:for="{{editMap[item.key].val.specList}}" wx:for-item="spec_item" wx:for-index="spec_index" wx:key="spec_item">
+                <van-tag closeable="{{!item.disabled}}" type="primary" size="medium" color="{{color}}" text-color="{{text_color}}" data-key="{{item.key}}" data-spec_index="{{spec_index}}" bind:close="delKey_ShopGoods_specMap">{{spec_item}}</van-tag>
+              </block>
+            </view>
+            <view class="text">
+              <textarea disabled="{{item.disabled}}" confirm-type="点击添加" data-key="{{item.key}}" bindconfirm="addKey_ShopGoods_specMap" placeholder="请输入规格名称(可填多个)" auto-height></textarea>
+            </view>
+          </view>
+          <view class="obj">
+            <view class="title">属性对象:</view>
+            <block wx:for="{{editMap[item.key].val.specList}}" wx:for-item="spec_item" wx:for-index="spec_index" wx:key="spec_item">
+              <view class="obj_item">
+                <view class="key">{{spec_item}}:</view>
+                <view class="info">
+                  <block wx:for="{{editMap[item.key].val[spec_item]}}" wx:for-item="spec_map_item" wx:for-index="spec_map_index" wx:key="spec_map_item">
+                    <view class="info_item">
+                      <view>
+                        <text>属性值:</text>
+                        <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setValue" value="{{spec_map_item.value}}" placeholder="输入属性值" type="text" />
+                      </view>
+                      <view>
+                        <text>价格:</text>
+                        <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setPrice" value="{{spec_map_item.price}}" placeholder="输入价格" type="digit" />
+                      </view>
+                      <view>
+                        <text>会员价格:</text>
+                        <input disabled="{{item.disabled}}" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bindinput="setVipPrice" value="{{spec_map_item.vipPrice}}" placeholder="输入会员价格" type="digit" />
+                      </view>
+                      <view wx:if="{{editMap[item.key].val[spec_item].length>1&&!item.disabled}}" class="del" data-key="{{item.key}}" data-spec="{{spec_item}}" data-spec_map_index="{{spec_map_index}}" bind:tap="delSpecMapItem">
+                        <van-icon name="cross" />
+                      </view>
+                    </view>
+                  </block>
+                  <view wx:if="{{!item.disabled}}" class="btn_specMap" style="border:1rpx solid {{color}};">
+                    <button data-key="{{item.key}}" data-spec="{{spec_item}}" bind:tap="addSpecMap" style="color: {{color}};">
+                      <van-icon name="plus" />添加
+                    </button>
+                  </view>
+                </view>
+              </view>
+            </block>
+          </view>
+        </view>
+      </block>
+      <block wx:elif="{{item.view=='json-object'}}">
+        <view class="jsonObj">
+          <block wx:for="{{item.jsonArr}}" wx:for-item="json_item" wx:for-index="json_index" wx:key="json_item">
+            <view class="">{{json_item.label}}:</view>
+            <view class="text">
+              <textarea value="{{editMap[item.key].val[json_item.key]}}" data-json_key="{{json_item.key}}" data-key="{{item.key}}" bindblur="changeJsonTextarea" placeholder="{{json_item.value}}" auto-height disabled="{{item.disabled}}"></textarea>
+            </view>
+          </block>
+        </view>
+      </block>
+    </block>
   </view>
 </view>
 <block wx:if="{{is_btn}}">

+ 7 - 0
nova-tourism/components/dev-route/index.wxss

@@ -104,6 +104,13 @@
 .item .content .specMap .obj .obj_item .info .btn_specMap > button {
   font-size: 26rpx;
 }
+.item .content .geoPoint {
+  margin-top: 10rpx;
+  font-size: 26rpx;
+}
+.item .content .geoPoint > view {
+  margin-top: 10rpx;
+}
 .popup {
   width: 100%;
   height: 70vh;

+ 2 - 1
nova-tourism/components/homestay/index.less

@@ -152,7 +152,8 @@
             display: flex;
             flex-direction: column;
             margin-bottom: 20rpx;
-
+            -webkit-column-break-inside: avoid;
+            break-inside: avoid;
             .cardbox {
                 width: 100%;
                 background-color:whitesmoke;

+ 2 - 0
nova-tourism/components/homestay/index.wxss

@@ -131,6 +131,8 @@
   display: flex;
   flex-direction: column;
   margin-bottom: 20rpx;
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
 }
 .all .Legendary-Information .container .cardbox {
   width: 100%;

+ 32 - 3
nova-tourism/components/suggest/index.js

@@ -19,13 +19,18 @@ Component({
    */
   data: {
     gift: [], //望仙礼遇-商品
+    swiper:1,//左右滑动遍历次数
+    skip:0,
   },
 
   lifetimes: {
     detached: function () {},
     attached: async function () {
       setTimeout(() => {
+        let {store_id}=this.properties
+        this.setData({store_id})
         this.getGift()
+        this.getCount()
       }, 800);
    
     },
@@ -39,6 +44,7 @@ Component({
       let {
         store_id
       } = this.properties
+      let {skip}=this.data
       console.log(store_id)
       let sql = `SELECT good."objectId",good."name",good."price",good."image"
   FROM "ShopGoods" good
@@ -46,16 +52,39 @@ Component({
   AND good."isDeleted" IS NOT TRUE
   AND good."status" IS TRUE
   AND good."shopStore"='${store_id}'
-  ORDER BY COALESCE(good."isHome", FALSE) DESC,
+  ORDER BY COALESCE(good."isRecom", FALSE) DESC,
   CASE WHEN good."top"= 0 THEN 1 ELSE 0 END,
   good."top" ASC,good."createdAt"
-  LIMIT 4`
+  LIMIT 4 OFFSET ${skip}`
       let gift = await req.customSQL(sql) || []
       console.log(gift)
       this.setData({
         gift
       })
-    
+    },
+
+/**获取商品总量 */
+async getCount(){
+  let {
+    store_id
+  } = this.properties
+  let query = new Parse.Query('ShopGoods')
+  query.equalTo('company',company)
+  query.notEqualTo('isDeleted',true)
+  query.equalTo('status',true)
+  query.equalTo('shopStore',store_id)
+  let count = await query.count()
+  console.log(count)
+  let swiper = Math.ceil(count / 4)||1
+  if(swiper>10) swiper = 10//最多10个内切换,40个商品
+  this.setData({swiper,count})
+},
+    /**切换Swiper */
+    changeSwiper(e){
+      let {current} = e.detail
+      let skip = current * 4
+      this.setData({skip})
+      this.getGift()
     },
     /** 跳转*/
     tourl(e) {

+ 1 - 1
nova-tourism/components/suggest/index.less

@@ -29,7 +29,7 @@ page{
     }
 }
 .wang-cardbox{
-    margin-top: 40rpx;
+    // margin-top: 40rpx;
     width: 100%;
     background-color: white;
     overflow-y: hidden;

+ 29 - 21
nova-tourism/components/suggest/index.wxml

@@ -1,22 +1,30 @@
-<view class="wangbox">
-  <view class="wang">望仙礼遇</view>
-  <view class="wang2">望日w望月w来望仙w</view>
-</view>
-<view class="wang-cardbox">
-  <block wx:for="{{gift}}" wx:key="index">
-    <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
-      <image src="{{item.image||'https://img95.699pic.com/photo/60072/5330.jpg_wh860.jpg'}}" mode="aspectFill"></image>
-      <view class="wang-catex">{{item.name}}</view>
-      <view class="wang-numbox">
-        <view class="wang-num">
-          <view class="wang-num1">¥</view>
-          <view class="wang-num2">{{item.price||0}}</view>
+<block wx:if="{{count}}">
+  <view class="wangbox">
+    <view class="wang">望仙礼遇</view>
+    <view class="wang2">(左右滑动更换推荐)</view>
+  </view>
+  <swiper bindchange="changeSwiper" style=" height:750rpx;" autoplay="{{true}}" indicator-dots='{{false}}' interval="{{20000}}" circular duration="{{500}}">
+    <block wx:for="{{swiper}}" wx:for-item="swiper_item" wx:key="swiper_item">
+      <swiper-item>
+        <view class="wang-cardbox">
+          <block wx:for="{{gift}}" wx:key="index">
+            <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
+              <image src="{{item.image||'https://file-cloud.fmode.cn/EbxZUK5lBI/20250321/vdq1j1110711455.jpg'}}" mode="aspectFill"></image>
+              <view class="wang-catex">{{item.name}}</view>
+              <view class="wang-numbox">
+                <view class="wang-num">
+                  <view class="wang-num1">¥</view>
+                  <view class="wang-num2">{{item.price||0}}</view>
+                </view>
+                <view class="wang-submit">购买</view>
+              </view>
+            </view>
+          </block>
         </view>
-        <view class="wang-submit">购买</view>
-      </view>
-    </view>
-  </block>
-</view>
-<view class="more">
-  <view class="more-tex">查看更多 ></view>
-</view>
+      </swiper-item>
+    </block>
+  </swiper>
+  <view class="more" data-url="/nova-tourism/pages/collect/good-list/index" bindtap="tourl">
+    <view class="more-tex">云上风物 ></view>
+  </view>
+</block>

+ 0 - 1
nova-tourism/components/suggest/index.wxss

@@ -29,7 +29,6 @@ page {
   color: #969696;
 }
 .wang-cardbox {
-  margin-top: 40rpx;
   width: 100%;
   background-color: white;
   overflow-y: hidden;

+ 1 - 1
nova-tourism/pages/collect/collect-detail/index.less

@@ -240,7 +240,7 @@
                     align-items: center;
 
                     image {
-                        width: 150rpx;
+                        width: 120rpx;
                         margin: 40rpx 10rpx;
                     }
                 }

+ 3 - 3
nova-tourism/pages/collect/collect-detail/index.wxml

@@ -94,11 +94,11 @@
         </view>
         <view class="qrBox">
           <view class="logo">
-            <image src="{{good.about_qr[0]}}" mode="widthFix" />
+            <image src="{{good.code}}" mode="widthFix" />
           </view>
           <view class="qr">
             <block wx:for="{{good.about_qr}}" wx:key="index">
-              <image wx:if="{{index>0}}" src="{{item}}" mode="widthFix" />
+              <image src="{{item}}" mode="widthFix" />
             </block>
           </view>
         </view>
@@ -153,7 +153,7 @@
       <view class="address">
         <view class="add">
           <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20250320/1kjb1k101141655.png" mode="" />
-          <view>{{store.storeAddress}}</view>
+          <view>{{store.storeName}} - {{store.storeAddress}}</view>
         </view>
         <van-icon name="arrow" />
       </view>

+ 1 - 1
nova-tourism/pages/collect/collect-detail/index.wxss

@@ -205,7 +205,7 @@
   align-items: center;
 }
 .bax .all .box .tipbox2 .qrBox image {
-  width: 150rpx;
+  width: 120rpx;
   margin: 40rpx 10rpx;
 }
 .bax .paybox {

+ 153 - 0
nova-tourism/pages/collect/good-list/index.js

@@ -0,0 +1,153 @@
+// nova-tourism/pages/collect/good-list/index.js
+const Parse = getApp().Parse;
+const company = getApp().globalData.company;
+const uid = Parse.User.current()?.id
+const req = require('../../../../utils/request')
+
+let {
+  statusBarHeight,
+  screenHeight,
+  screenWidth,
+  safeArea
+} = wx.getSystemInfoSync()
+let custom = wx.getMenuButtonBoundingClientRect()
+let customHeight = custom.height
+let customWidth = custom.width
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    goodList: [],
+    searchTimeOut: null,
+    value:'',
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    let nav_px = statusBarHeight + customHeight + 10
+    let scroll_px = +safeArea.bottom - statusBarHeight - customHeight
+    let {store_id}=options
+    this.setData({
+      nav_px,
+      scroll_px,
+      cart_buttom: 120,
+      statusBarHeight,
+      customWidth,
+      store_id
+    })
+    this.getGood()
+  },
+
+
+  /**搜索框输入内容 */
+  searchInput() {
+    let {
+      searchTimeOut
+    } = this.data
+    if (searchTimeOut) clearTimeout(searchTimeOut)
+    let that = this
+    let timeOut = setTimeout(() => {
+      that.setData({
+        goodList: []
+      })
+      that.getGood()
+    }, 500);
+    this.setData({
+      searchTimeOut: timeOut
+    })
+  },
+
+  /**获取商品 */
+  async getGood() {
+    let {
+      goodList,
+      store_id,
+      value
+    } = this.data
+    if (value && value != '') {}
+    let sql = `SELECT good."objectId",good."name",good."price",good."image"
+    FROM "ShopGoods" good
+    WHERE good."company" = '${company}'
+    AND good."isDeleted" IS NOT TRUE
+    ${store_id?`AND good."shopStore" = '${store_id}'`:''}
+    AND good."status" IS TRUE
+    AND good."name" LIKE '%${value}%'
+    ORDER BY COALESCE(good."isRecom", FALSE) DESC,
+    CASE WHEN good."top"= 0 THEN 1 ELSE 0 END,
+    good."top" ASC
+    LIMIT 30 OFFSET ${goodList?.length||0}`
+    let list = await req.customSQL(sql)||[]
+    console.log(list)
+    this.setData({
+      goodList:[...(goodList||[]),...list]
+    })
+  },
+
+     /** 跳转*/
+     tourl(e) {
+      const url = e.currentTarget.dataset.url
+      wx.navigateTo({
+        url: `${url}` // 目标页面的路径
+      });
+    },
+  goback() {
+    wx.navigateBack({
+      delta: 1
+    });
+  },
+
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+    this.getGood()
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 10 - 0
nova-tourism/pages/collect/good-list/index.json

@@ -0,0 +1,10 @@
+{
+  "usingComponents": {
+    "van-search": "@vant/weapp/search/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-stepper": "@vant/weapp/stepper/index",
+    "van-loading": "@vant/weapp/loading/index",
+    "van-empty": "@vant/weapp/empty/index"
+  }
+  
+}

+ 90 - 0
nova-tourism/pages/collect/good-list/index.less

@@ -0,0 +1,90 @@
+.nav {
+    background: white;
+    position: fixed;
+    top: 0rpx;
+    z-index: 999;
+    // background: #7F56B2;
+    width: 100vw;
+
+    .shop {
+        display: flex;
+        align-items: center;
+        >view {
+            font-size: 33rpx;
+            font-weight: bold;
+            margin: 0 10rpx;
+        }
+    }
+
+    .search {
+        height: 60rpx;
+        overflow: hidden;
+        align-items: center;
+        background: whitesmoke;
+        padding: 5rpx 10rpx;
+        border-radius: 100rpx;
+        display: flex;
+        align-items: center;
+
+        input {
+            margin-left: 10rpx;
+            height: 100rpx;
+            font-size: 28rpx;
+        }
+    }
+}
+.wang-cardbox{
+    padding: 20rpx;
+    width: 100%;
+    background-color: white;
+    overflow-y: hidden;
+    padding-bottom: 40rpx;
+    column-count: 2; /* 设置列数 */
+    column-gap: 16rpx; /* 设置列间距 */
+    .wang-card{
+        break-inside: avoid; /* 防止卡片在列之间断裂 */
+        margin-bottom: 20rpx; /* 设置卡片底部间距 */
+        width: 100%; /* 确保卡片宽度为100% */
+        
+        image{
+            width: 100%;
+            height: 204rpx;
+            border-radius: 10rpx;
+        }
+        .wang-catex{
+            font-size: 26rpx;
+            font-weight: 400;
+            height: 76rpx;
+        }
+        .wang-numbox{
+            width: 100%;
+            display: flex;
+            align-items: center;
+            .wang-num{
+                display: flex;
+                justify-content: flex-end;
+                align-items: flex-end;
+                color: #C5262Ced;
+                font-size: 30rpx;
+                .wang-num1{
+                    font-size: 32rpx;
+                }
+                .wang-num2{
+                    font-size: 40rpx;
+                }
+            }
+            .wang-submit{
+                width: 102rpx;
+                height: 48rpx;
+                font-size: 28rpx;
+                color: white;
+                background-color: #F8DA7F;
+                border-radius: 15rpx;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                margin-left: auto;
+            }
+        }
+    }
+}

+ 32 - 0
nova-tourism/pages/collect/good-list/index.wxml

@@ -0,0 +1,32 @@
+<!--nova-tourism/pages/collect/good-list/index.wxml-->
+<view class="nav" style="height:calc( {{nav_px+'px'}} + 20rpx );">
+  <view style="position: absolute;top: {{statusBarHeight+5+'px'}};width: 100vw;display: flex;justify-content: start;">
+    <view class="shop" bind:tap="goback">
+      <van-icon name="arrow-left" size="50rpx" />
+      <view>{{store_id?'店铺商品':'云上风物'}}</view>
+    </view>
+    <view class="search" style="width:calc( 100vw - {{customWidth +'px'}} - 240rpx );margin-left: 10rpx;">
+      <van-icon name="search" size="30rpx" />
+      <input placeholder="关键字搜索" bindinput="searchInput" model:value="{{value}}" />
+    </view>
+  </view>
+</view>
+<view style="height:calc( {{nav_px+'px'}});"></view>
+
+<view class="wang-cardbox">
+  <block wx:for="{{goodList}}" wx:key="index">
+    <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
+      <image src="{{item.image||'https://img95.699pic.com/photo/60072/5330.jpg_wh860.jpg'}}" mode="aspectFill"></image>
+      <view class="wang-catex">{{item.name}}</view>
+      <view class="wang-numbox">
+        <view class="wang-num">
+          <view class="wang-num1">¥</view>
+          <view class="wang-num2">{{item.price||0}}</view>
+        </view>
+        <view class="wang-submit">购买</view>
+      </view>
+    </view>
+  </block>
+</view>
+
+<van-empty wx:if="{{goodList.length<=0}}" description="商品为空" />

+ 89 - 0
nova-tourism/pages/collect/good-list/index.wxss

@@ -0,0 +1,89 @@
+.nav {
+  background: white;
+  position: fixed;
+  top: 0rpx;
+  z-index: 999;
+  width: 100vw;
+}
+.nav .shop {
+  display: flex;
+  align-items: center;
+}
+.nav .shop > view {
+  font-size: 33rpx;
+  font-weight: bold;
+  margin: 0 10rpx;
+}
+.nav .search {
+  height: 60rpx;
+  overflow: hidden;
+  background: whitesmoke;
+  padding: 5rpx 10rpx;
+  border-radius: 100rpx;
+  display: flex;
+  align-items: center;
+}
+.nav .search input {
+  margin-left: 10rpx;
+  height: 100rpx;
+  font-size: 28rpx;
+}
+.wang-cardbox {
+  padding: 20rpx;
+  width: 100%;
+  background-color: white;
+  overflow-y: hidden;
+  padding-bottom: 40rpx;
+  column-count: 2;
+  /* 设置列数 */
+  column-gap: 16rpx;
+  /* 设置列间距 */
+}
+.wang-cardbox .wang-card {
+  break-inside: avoid;
+  /* 防止卡片在列之间断裂 */
+  margin-bottom: 20rpx;
+  /* 设置卡片底部间距 */
+  width: 100%;
+  /* 确保卡片宽度为100% */
+}
+.wang-cardbox .wang-card image {
+  width: 100%;
+  height: 204rpx;
+  border-radius: 10rpx;
+}
+.wang-cardbox .wang-card .wang-catex {
+  font-size: 26rpx;
+  font-weight: 400;
+  height: 76rpx;
+}
+.wang-cardbox .wang-card .wang-numbox {
+  width: 100%;
+  display: flex;
+  align-items: center;
+}
+.wang-cardbox .wang-card .wang-numbox .wang-num {
+  display: flex;
+  justify-content: flex-end;
+  align-items: flex-end;
+  color: #C5262Ced;
+  font-size: 30rpx;
+}
+.wang-cardbox .wang-card .wang-numbox .wang-num .wang-num1 {
+  font-size: 32rpx;
+}
+.wang-cardbox .wang-card .wang-numbox .wang-num .wang-num2 {
+  font-size: 40rpx;
+}
+.wang-cardbox .wang-card .wang-numbox .wang-submit {
+  width: 102rpx;
+  height: 48rpx;
+  font-size: 28rpx;
+  color: white;
+  background-color: #F8DA7F;
+  border-radius: 15rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-left: auto;
+}

+ 1 - 2
nova-tourism/pages/homestay/homestay-detail/index.js

@@ -291,8 +291,7 @@ Page({
   },
   /**拨打电话 */
   phone() {
-    let phone = this.data.storeList[0].mobile
-    console.log(phone);
+    let phone = this.data.shopStore.mobile
     wx.makePhoneCall({
       phoneNumber: phone
     })

+ 6 - 29
nova-tourism/pages/homestay/homestay-detail/index.wxml

@@ -65,8 +65,8 @@
               </view>
               <view class="room-card-textbox-label">
                 <block>
-                  <view class="room-card-textbox-label2" wx:if="{{item.benefitMap.discount.length>0}}">
-                    {{item.benefitMap.discount}}
+                  <view class="room-card-textbox-label2" wx:if="{{item.benefitMap.discount}}">
+                    首单优惠¥{{item.benefitMap.discount}}
                   </view>
                   <view class="room-card-textbox-label2" wx:if="{{item.benefitMap.gift.length>0}}">
                     {{item.benefitMap.gift}}
@@ -89,30 +89,7 @@
           </block>
         </view>
       </block>
-
       <suggest store_id="{{objectId}}"></suggest>
-      <!-- <view class="wangbox">
-        <view class="wang">望仙礼遇</view>
-        <view class="wang2">望日w望月w来望仙w</view>
-      </view>
-      <view class="wang-cardbox">
-        <block wx:for="{{gift}}" wx:key="index">
-          <view class="wang-card" data-url="/nova-tourism/pages/collect/collect-detail/index?gid={{item.objectId}}" bindtap="tourl">
-            <image src="{{item.image||'https://img95.699pic.com/photo/60072/5330.jpg_wh860.jpg'}}" mode="aspectFill"></image>
-            <view class="wang-catex">{{item.name}}</view>
-            <view class="wang-numbox">
-              <view class="wang-num">
-                <view class="wang-num1">¥</view>
-                <view class="wang-num2">{{item.price||0}}</view>
-              </view>
-              <view class="wang-submit">购买</view>
-            </view>
-          </view>
-        </block>
-      </view>
-      <view class="more">
-        <view class="more-tex">查看更多 ></view>
-      </view> -->
     </view>
   </view>
 </view>
@@ -168,20 +145,20 @@
       <view class="sub_title">以下规则由房东制定,请仔细阅读并遵守</view>
       <view class="list">
         <view class="key">入离</view>
-        <view class="value">{{chickRoom.open_time||'12:00后入住,12:00前退房'}}</view>
+        <view class="value">{{chickRoom.book_rules.time||'12:00后入住,12:00前退房'}}</view>
       </view>
       <view class="list">
         <view class="key">发票</view>
-        <view class="value">发票由民宿经营者(房东)提供</view>
+        <view class="value">{{chickRoom.book_rules.ticket||'发票由民宿经营者(房东)提供'}}</view>
       </view>
       <view class="list">
         <view class="key">退订</view>
-        <view class="value" style="color: #7E9F86;">仅限30分钟内免费取消</view>
+        <view class="value" style="color: #7E9F86;">{{chickRoom.book_rules.unsubscribe||'仅限30分钟内免费取消'}}</view>
       </view>
       <view class="list">
         <view class="key">     </view>
         <view class="value">
-          <text>订单确认30分钟后,取消订单将扣除当日全部房费(订单需\n等商家确认后生效,订单确认结果以公众号,短信为准,\n如订单不确认将全额退款至您的付款账号)</text>
+          <text>{{chickRoom.book_rules.other_1||'订单确认30分钟后,取消订单将扣除当日全部房费(订单需等商家确认后生效,订单确认结果以公众号,短信为准,如订单不确认将全额退款至您的付款账号)'}}</text>
         </view>
       </view>
     </view>

+ 149 - 106
nova-tourism/pages/my/merchant/code-verify/index.js

@@ -6,113 +6,156 @@ const dateF = require('../../../../../utils/date')
 const dateServ = require('../../../../../utils/date')
 Page({
 
-    /**
-     * 页面的初始数据
-     */
-    data: {
-        id: "",
-        order: null,
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    statusMap: {
+      100: '未入住',
+      200: '已入住',
+      400: '已退房',
+      500: '申请退款',
+      601: '退款审核通过',
+      602: '退款已驳回',
+      700: '退款成功',
+      800: '已完成',
+      101: '已取消支付',
+      102: '申请退房',
+      103: '退房成功',
+      104: '退房被驳回',
+      105: '未支付',
     },
-    async getRoomOrder() {
-        let id = this.data.id
-        console.log(id, 12222323);
-        let RoomOrder = new Parse.Query('RoomOrder')
-        RoomOrder.include('room')
-        RoomOrder.include('shopStore')
-        let roomOrder = await RoomOrder.get(id)
-        console.log(roomOrder, 666666);
-        let Order = roomOrder.toJSON()
-        Order.createdAt = dateF.formatTime("YYYY-mm-dd HH:MM:SS", Order.createdAt)
-        Order.room.note = rechText.formatRichText(Order.room.note)
-        Order['day'] = parseInt((new Date(Order.endTime.iso).getTime() - new Date(Order.startTime.iso).getTime()) / (1000 * 60 * 60 * 24));
-        Order.startTime = dateServ.formatTime('YYYY-mm-dd', Order.startTime.iso)
-        Order.endTime = dateServ.formatTime('YYYY-mm-dd', Order.endTime.iso)
-        this.setData({
-            order: Order
+    id: "",
+    order: null,
+  },
+  async getRoomOrder() {
+    let id = this.data.id
+    console.log(id, 12222323);
+    let RoomOrder = new Parse.Query('RoomOrder')
+    RoomOrder.include('room')
+    RoomOrder.include('shopStore')
+    let roomOrder = await RoomOrder.get(id)
+    console.log(roomOrder, 666666);
+    let Order = roomOrder.toJSON()
+    Order.createdAt = dateF.formatTime("YYYY-mm-dd HH:MM:SS", Order.createdAt)
+    // Order.room.note = rechText.formatRichText(Order.room.note)
+    Order['day'] = parseInt((new Date(Order.endTime.iso).getTime() - new Date(Order.startTime.iso).getTime()) / (1000 * 60 * 60 * 24));
+    Order.startTime = dateServ.formatTime('YYYY-mm-dd HH:MM', Order.startTime.iso)
+    Order.endTime = dateServ.formatTime('mm-dd HH:MM', Order.endTime.iso)
+    this.setData({
+      order: Order
+    })
+    console.log(this.data.order);
+  },
+
+  async submit() {
+    try {
+      let id = this.data.id
+      let {order,statusMap}=this.data
+      let RoomOrder = new Parse.Query("RoomOrder")
+      let roomOrder = await RoomOrder.get(id)
+      if((order.status == 100 || order.status == 500 || order.status == 602)&&roomOrder?.get('status') == 200){
+        wx.showToast({
+          title: '已执行入住操作,无需重复',
+          icon:'none'
         })
-        console.log(this.data.order);
-    },
-    async submit() {
-        try {
-            let id = this.data.id
-            let RoomOrder = new Parse.Query("RoomOrder")
-            let roomOrder = await RoomOrder.get(id)
-            roomOrder.set("status", 400)
-            await roomOrder.save()
-            console.log(res)
-            wx.showToast({
-                title: '核销成功',
-                icon: 'none'
-            })
-        } catch (error) {
-            wx.showToast({
-                title: '核销失败',
-                icon: 'none'
-            })
-        }
-
-        wx.navigateBack({
-            delta: 1,
-
-        });
-
-
-    },
-    /**
-     * 生命周期函数--监听页面加载
-     */
-    onLoad: function(options) {
-        let id = options.id
-        this.setData({ id: id })
-        this.getRoomOrder()
-    },
-
-    /**
-     * 生命周期函数--监听页面初次渲染完成
-     */
-    onReady: function() {
-
-    },
-
-    /**
-     * 生命周期函数--监听页面显示
-     */
-    onShow: function() {
-
-    },
-
-    /**
-     * 生命周期函数--监听页面隐藏
-     */
-    onHide: function() {
-
-    },
-
-    /**
-     * 生命周期函数--监听页面卸载
-     */
-    onUnload: function() {
-
-    },
-
-    /**
-     * 页面相关事件处理函数--监听用户下拉动作
-     */
-    onPullDownRefresh: function() {
-
-    },
-
-    /**
-     * 页面上拉触底事件的处理函数
-     */
-    onReachBottom: function() {
-
-    },
-
-    /**
-     * 用户点击右上角分享
-     */
-    onShareAppMessage: function() {
-
+        return
+      }
+      if (roomOrder?.get('status') == 100 || roomOrder?.get('status') == 500 || roomOrder?.get('status') == 602) {
+        roomOrder.set("status", 200)
+        await roomOrder.save()
+        wx.showToast({
+          title: '已入住',
+          icon: 'success'
+        })
+        setTimeout(() => {
+          wx.navigateBack({
+            delta: 1
+          })
+        }, 1000);
+      } else if (roomOrder?.get('status') == 200 || roomOrder?.get('status') == 102 || roomOrder?.get('status') == 104) {
+        roomOrder.set("status", 400)
+        await roomOrder.save()
+        wx.showToast({
+          title: '退房成功',
+          icon: 'success'
+        })
+        setTimeout(() => {
+          wx.navigateBack({
+            delta: 1
+          })
+        }, 1000);
+      }else{
+        wx.showToast({
+          title: `当前订单 ${statusMap[roomOrder?.get('status')]} 无法操作。`,
+          icon: 'none'
+        })
+      }
+    } catch (error) {
+      wx.showToast({
+        title: '核销失败',
+        icon: 'none'
+      })
     }
+   
+  },
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    let id = options.id
+    this.setData({
+      id: id
+    })
+    this.getRoomOrder()
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
 })

+ 27 - 0
nova-tourism/pages/my/merchant/code-verify/index.less

@@ -36,7 +36,27 @@ page {
         }
     }
 }
+.ruleBox {
+    margin: 30rpx;
+    padding: 20rpx;
+    border-radius: 30rpx;
+    background: #ffffff;
+
+    .list {
+        display: flex;
+
+        .key {
+            font-size: 25rpx;
+            font-weight: bold;
+            width: 66rpx;
+            height: 53rpx;
+        }
 
+        .value {
+            font-size: 25rpx;
+        }
+    }
+}
 .order-prompt {
     margin: 30rpx;
     padding: 20rpx;
@@ -68,4 +88,11 @@ page {
     background: #46a9a4;
     padding: 30rpx 0;
     text-align: center;
+}
+.orderBox{
+    .list{
+        .key{
+            width: 150rpx;
+        }
+    }
 }

+ 69 - 38
nova-tourism/pages/my/merchant/code-verify/index.wxml

@@ -1,44 +1,75 @@
 <nav type="back" background-color="#46a9a4" title="核销" />
 <block wx:if="{{id}}">
-    <view class="top">
-        <image class="top-image" src="{{order.images[0]}}"></image>
-        <view class="title">
-            <view class="order-name">{{order.name}}</view>
-            <view class="order-time">营业时间:{{order.shopStore.workingTime}}</view>
-            <view class="order-price">¥{{order.price}}</view>
-        </view>
-    </view>
-    <view class="order-prompt">
-        <view class="prompt-title">订房须知</view>
-        <block>
-            <rich-text nodes="{{order.room.note}}" style="width: 100%;height: 100%; margin-right: 0 auto;"></rich-text>
-        </block>
-    </view>
-    <view class="order-prompt">
-        <view class="prompt-title">订单信息</view>
-        <view class="order-number">
-            订单编号:
-            <view class="number">{{order.orderNum}}</view>
-        </view>
-        <view class="order-number">
-            下单时间:
-            <view class="number">{{order.createdAt}}</view>
-        </view>
-        <view class="order-number">
-            入住时间:
-            <view class="number">{{order.startTime}}——{{order.endTime}}</view>
-        </view>
-        <view class="order-number">
-            数量:
-            <view class="number">{{order.day}}</view>
-        </view>
-        <view class="order-number">
-            总价:
-            <view class="number">¥{{order.price}}</view>
-        </view>
+  <view class="top">
+    <image class="top-image" src="{{order.room.images[0]||'https://file-cloud.fmode.cn/EbxZUK5lBI/20250412/e1hjn1052809193.jpg'}}" mode="aspectFit"></image>
+    <view class="title">
+      <view class="order-name">{{order.room.name}}</view>
+      <view class="order-time">营业时间:{{order.room.open_time}}</view>
+      <view class="order-price">房间单价:¥{{order.room.price}}</view>
     </view>
+  </view>
+
+  <view class="ruleBox">
+    <view style="margin-bottom: 10rpx;">订房须知</view>
+    <view class="list">
+      <view class="key">入离</view>
+      <view class="value">{{chickRoom.book_rules.time||'12:00后入住,12:00前退房'}}</view>
+    </view>
+    <view class="list">
+      <view class="key">发票</view>
+      <view class="value">{{chickRoom.book_rules.ticket||'发票由民宿经营者(房东)提供'}}</view>
+    </view>
+    <view class="list">
+      <view class="key">退订</view>
+      <view class="value" style="color: #7E9F86;">{{chickRoom.book_rules.unsubscribe||'仅限30分钟内免费取消'}}</view>
+    </view>
+    <view class="list">
+      <view class="key">     </view>
+      <view class="value">
+        <text>{{chickRoom.book_rules.other_1||'订单确认30分钟后,取消订单将扣除当日全部房费(订单需等商家确认后生效,订单确认结果以公众号,短信为准,如订单不确认将全额退款至您的付款账号)'}}</text>
+      </view>
+    </view>
+  </view>
+
+  <view class="ruleBox orderBox">
+    <view style="margin-bottom: 10rpx;">订单信息</view>
+    <view class="list">
+      <view class="key">订单编号:</view>
+      <view class="value">{{order.orderNum}}</view>
+    </view>
+    <view class="list">
+      <view class="key">订单状态:</view>
+      <view class="value">{{statusMap[order.status]}}</view>
+    </view>
+    <view class="list">
+      <view class="key">入住人姓名:</view>
+      <view class="value">{{order.name||order.mobile||order.user.nickname||order.user.mobile}}</view>
+    </view>
+    <view class="list">
+      <view class="key">下单时间:</view>
+      <view class="value">{{order.createdAt}}</view>
+    </view>
+    <view class="list">
+      <view class="key">入住时间:</view>
+      <view class="value">{{order.startTime}} - {{order.endTime}}</view>
+    </view>
+    <view class="list">
+      <view class="key">入住天数:</view>
+      <view class="value">{{order.day}}</view>
+    </view>
+    <view class="list">
+      <view class="key">订单总额:</view>
+      <view class="value">¥{{order.price}}</view>
+    </view>
+  </view>
 </block>
 <block wx:if="{{!id}}">
-    <van-empty description="暂无" />
+  <van-empty description="暂无" />
+</block>
+
+<block wx:if="{{order.status==100||order.status==500||order.status==602}}">
+  <view class="bommon" bindtap="submit">登记入住</view>
 </block>
-<view class="bommon" bindtap="submit">确认核销</view>
+<block wx:if="{{order.status==200||order.status==102||order.status==104}}">
+  <view class="bommon" bindtap="submit">确认核销</view>
+</block>

+ 81 - 1
nova-tourism/pages/my/merchant/code-verify/index.wxss

@@ -1 +1,81 @@
-page{background:#f6f6f6}.top{display:flex;background:#ffffff;margin:30rpx;border-radius:30rpx;padding:20rpx}.top .top-image{width:240rpx;height:180rpx;margin-right:20rpx}.top .title .order-name{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}.top .title .order-time{font-size:26rpx;color:#666666;margin-top:30rpx}.top .title .order-price{color:red;margin-top:30rpx}.order-prompt{margin:30rpx;padding:20rpx;border-radius:30rpx;background:#ffffff}.order-prompt .prompt-title{font-size:30rpx}.order-prompt .prompt{margin-top:20rpx}.order-prompt .order-number{margin-top:20rpx;font-size:30rpx;color:#666666;display:flex}.order-prompt .order-number .number{color:black}.bommon{position:fixed;bottom:0;width:100%;background:#46a9a4;padding:30rpx 0;text-align:center}
+page {
+  background: #f6f6f6;
+}
+.top {
+  display: flex;
+  background: #ffffff;
+  margin: 30rpx;
+  border-radius: 30rpx;
+  padding: 20rpx;
+}
+.top .top-image {
+  width: 240rpx;
+  height: 180rpx;
+  margin-right: 20rpx;
+}
+.top .title .order-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical;
+}
+.top .title .order-time {
+  font-size: 26rpx;
+  color: #666666;
+  margin-top: 30rpx;
+}
+.top .title .order-price {
+  color: red;
+  margin-top: 30rpx;
+}
+.ruleBox {
+  margin: 30rpx;
+  padding: 20rpx;
+  border-radius: 30rpx;
+  background: #ffffff;
+}
+.ruleBox .list {
+  display: flex;
+}
+.ruleBox .list .key {
+  font-size: 25rpx;
+  font-weight: bold;
+  width: 66rpx;
+  height: 53rpx;
+}
+.ruleBox .list .value {
+  font-size: 25rpx;
+}
+.order-prompt {
+  margin: 30rpx;
+  padding: 20rpx;
+  border-radius: 30rpx;
+  background: #ffffff;
+}
+.order-prompt .prompt-title {
+  font-size: 30rpx;
+}
+.order-prompt .prompt {
+  margin-top: 20rpx;
+}
+.order-prompt .order-number {
+  margin-top: 20rpx;
+  font-size: 30rpx;
+  color: #666666;
+  display: flex;
+}
+.order-prompt .order-number .number {
+  color: black;
+}
+.bommon {
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  background: #46a9a4;
+  padding: 30rpx 0;
+  text-align: center;
+}
+.orderBox .list .key {
+  width: 150rpx;
+}

+ 69 - 42
nova-tourism/pages/my/merchant/merchant-home/account/index.js

@@ -29,6 +29,17 @@ Page({
         id: null,
         address: '',
         locations: null,
+
+        edit_field_map:{
+          storeAddress:{disabled:false,},
+          type:{isHide:true},
+          score:{isHide:true},
+          user:{isHide:true},
+          department:{isHide:true},
+          vrUrl:{isHide:true},
+          isShow:{isHide:true},
+          isVerified:{isHide:true},
+        }
     },
     // getHtml(e) { //从组件获取值
     //     let html = e.detail.content.html
@@ -178,52 +189,68 @@ Page({
      * 生命周期函数--监听页面加载
      */
     onLoad: async function (options) {
+      let store = wx.getStorageSync('store')
+      this.setData({store_id:store.objectId,store})
+
+      let merchant = wx.getStorageSync('merchant')
+    if (!merchant) {
+      wx.showToast({
+        title: '商户有误',
+        icon: 'error'
+      })
+      setTimeout(() => {
+        wx.reLaunch({
+          url: `/nova-tourism/pages/index/index`
+        })
+      }, 1000);
+      return
+    }
 
 
 
-        let merchant = wx.getStorageSync('merchant'); //用户
-        let ShopStore = new Parse.Query('ShopStore')
-        ShopStore.notEqualTo('isDeleted', "true")
-        ShopStore.equalTo('company', company)
-        ShopStore.include('user')
-        ShopStore.equalTo('user', merchant.objectId)
-        let store = await ShopStore.first()
-        store = store.toJSON()
-        console.log(store);
-        let imageList = []
-        let licenseList = []
-        // store.cover[0].forEach(i => {
-        imageList.push({
-            url: store.cover
-        })
+        // let merchant = wx.getStorageSync('merchant'); //用户
+        // let ShopStore = new Parse.Query('ShopStore')
+        // ShopStore.notEqualTo('isDeleted', "true")
+        // ShopStore.equalTo('company', company)
+        // ShopStore.include('user')
+        // ShopStore.equalTo('user', merchant.objectId)
+        // let store = await ShopStore.first()
+        // store = store.toJSON()
+        // console.log(store);
+        // let imageList = []
+        // let licenseList = []
+        // // store.cover[0].forEach(i => {
+        // imageList.push({
+        //     url: store.cover
         // })
-        console.log(imageList);
-        store.image.forEach(i => {
-            licenseList.push({
-                url: i
-            })
-        })
-        this.setData({
-            imageList: imageList,
-            store: store,
-            cover: store.cover,
-            image: store.image,
-            // perCapita: store.perCapita,
-            storeName: store.storeName,
-            perCapita: store.perCapita,
-            desc: store.desc,
-            name: store.name,
-            workingTime: store.workingTime,
-            html: store.content,
-            id: store.objectId,
-            licenseList: licenseList,
-            locations: store.location,
-            address:store.storeAddress
-        })
-        console.log('首页', this.data.locations);
-        // this.Getlocation()
-        // this.selectComponent('#hf_editor').setHtml(this.data.html);
-        this.getQiniuOption()
+        // // })
+        // console.log(imageList);
+        // store.image.forEach(i => {
+        //     licenseList.push({
+        //         url: i
+        //     })
+        // })
+        // this.setData({
+        //     imageList: imageList,
+        //     store: store,
+        //     cover: store.cover,
+        //     image: store.image,
+        //     // perCapita: store.perCapita,
+        //     storeName: store.storeName,
+        //     perCapita: store.perCapita,
+        //     desc: store.desc,
+        //     name: store.name,
+        //     workingTime: store.workingTime,
+        //     html: store.content,
+        //     id: store.objectId,
+        //     licenseList: licenseList,
+        //     locations: store.location,
+        //     address:store.storeAddress
+        // })
+        // console.log('首页', this.data.locations);
+        // // this.Getlocation()
+        // // this.selectComponent('#hf_editor').setHtml(this.data.html);
+        // this.getQiniuOption()
     },
     async getQiniuOption() {
         let uploadData = await this.getUptoken()

+ 2 - 1
nova-tourism/pages/my/merchant/merchant-home/account/index.json

@@ -2,6 +2,7 @@
   "usingComponents": {
       "van-icon": "@vant/weapp/icon/index",
       "diy-editor": "/components/diy-editor/index",
-      "van-button": "@vant/weapp/button/index"
+      "van-button": "@vant/weapp/button/index",
+      "dev-route":"../../../../../components/dev-route/index"
   }
 }

+ 2 - 2
nova-tourism/pages/my/merchant/merchant-home/account/index.less

@@ -1,7 +1,7 @@
 
     page {
-        background: #f6f6f6;
-        padding-bottom: 148rpx;
+        // background: #f6f6f6;
+        // padding-bottom: 148rpx;
     }
     
     .top {

+ 16 - 6
nova-tourism/pages/my/merchant/merchant-home/account/index.wxml

@@ -1,6 +1,17 @@
 <nav type="back" background-color="#46a9a4" title="账户管理" />
+<view class="password" bindtap="password" style="font-size: 28rpx; display: flex;justify-content: space-between;padding: 20rpx;border-bottom: 1rpx solid whitesmoke;">
+  重置密码
+  <van-icon name="arrow" />
+</view>
+
+
+
+<dev-route rid='8CVQgfbThx' object_id="{{store_id}}" edit_field_map="{{edit_field_map}}" is_btn="{{true}}"></dev-route>
 
 
+
+
+<!-- 
 <view class="top" style="color: #382E2E;">
     <view class="top-figure">店铺首图</view>
     <upload bind:onChangeFile="changeFile" fileList="{{imageList}}" accept="image" maxCount="1" uploadURL="{{uploadURL}}" domain="{{domain}}" uptokenURL="{{uptokenURL}}"></upload>
@@ -41,7 +52,7 @@
     <view class="top-deails" bindtap="mobile">
         <view class="top-name">
             <view class="name">绑定手机号:</view>
-            <!-- <input bindblur="blur" type="text" class="input" data-name="store.mobile" value="{{store.mobile}}" placeholder="绑定手机号"></input> -->
+          
             <view class="content">{{store.mobile}}</view>
         </view>
         <van-icon name="arrow" />
@@ -50,7 +61,7 @@
         <view class="top-name">
             <view class="name">用户账号:</view>
             <view class="content">{{store.user.username}}</view>
-            <!-- <input bindblur="blur" type="text" class="input" data-name="store.user.username" value="{{store.user.username}}" placeholder="用户账号"></input> -->
+       
         </view>
         <van-icon name="arrow" />
     </view>
@@ -58,7 +69,7 @@
         <view class="top-name">
             <view class="name">重置密码:</view>
             <view class="content">{{store.user.password}}</view>
-            <!-- <input bindblur="blur" type="text" class="input" data-name="store.user.password" value="{{store.user.password}}" placeholder="登录密码"></input> -->
+       
         </view>
         <van-icon name="arrow" />
     </view>
@@ -71,8 +82,7 @@
     <view class="top-figure">店铺图片</view>
     <upload bind:onChangeFile="changeFiles" fileList="{{licenseList}}" accept="image" maxCount="9" uploadURL="{{uploadURL}}" domain="{{domain}}" uptokenURL="{{uptokenURL}}"></upload>
 </view>
-<!-- <diy-editor width="100%" height="600rpx" insertPicture="{{true}}" placeholder="开始输入..." bind:Content="getHtml" bind:insertImage="insertImage" id="hf_editor" uploadURL="{{uploadURL}}" domain="{{domain}}" uptokenURL="{{uptokenURL}}" /> -->
-<!-- <diy-editor width="100%" height="600rpx" insertPicture="{{true}}" placeholder="编写文章..." data-field="{{field.key}}" bind:Content="getHtml" bind:insertImage="insertImage" id="editor{{field.key}}" /> -->
+
 <view class="bommon" style="color: #382E2E;">
     <view class="bommon-name" bindtap="determine">确定</view>
-</view>
+</view> -->

+ 58 - 1
nova-tourism/pages/my/merchant/merchant-home/account/index.wxss

@@ -1 +1,58 @@
-page{background:#f6f6f6;padding-bottom:148rpx}.top{padding:20rpx 30rpx;background:#ffffff}.top .top-figure{margin:20rpx 0}.top .top-deails{display:flex;justify-content:space-between;border-bottom:1rpx solid #adabab}.top .top-deails .top-name{display:flex;justify-content:space-between;margin:30rpx 0 0 0;padding-bottom:30rpx;width:93%}.top .top-deails .top-name .input{width:500rpx;text-align:right;color:#382E2E}.top .top-deails .top-name .name{width:200rpx;margin:auto 0}.top .top-deails .top-name .content{text-align:right}.top .top-deails .top-names{margin:30rpx 0 0 0;padding-bottom:30rpx;width:93%}.top .top-deails .top-names .input{margin-top:20rpx}.top .top-deails .top-names .name{width:200rpx}.bommon{position:fixed;bottom:0;width:100%;background:#ffffff;text-align:center;z-index:999;padding:10rpx 0}.bommon .bommon-name{background:#46a9a4;padding:30rpx 60rpx;border-radius:30rpx;width:500rpx;margin:0 auto}
+.top {
+  padding: 20rpx 30rpx;
+  background: #ffffff;
+}
+.top .top-figure {
+  margin: 20rpx 0;
+}
+.top .top-deails {
+  display: flex;
+  justify-content: space-between;
+  border-bottom: 1rpx solid #adabab;
+}
+.top .top-deails .top-name {
+  display: flex;
+  justify-content: space-between;
+  margin: 30rpx 0 0 0;
+  padding-bottom: 30rpx;
+  width: 93%;
+}
+.top .top-deails .top-name .input {
+  width: 500rpx;
+  text-align: right;
+  color: #382E2E;
+}
+.top .top-deails .top-name .name {
+  width: 200rpx;
+  margin: auto 0;
+}
+.top .top-deails .top-name .content {
+  text-align: right;
+}
+.top .top-deails .top-names {
+  margin: 30rpx 0 0 0;
+  padding-bottom: 30rpx;
+  width: 93%;
+}
+.top .top-deails .top-names .input {
+  margin-top: 20rpx;
+}
+.top .top-deails .top-names .name {
+  width: 200rpx;
+}
+.bommon {
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  background: #ffffff;
+  text-align: center;
+  z-index: 999;
+  padding: 10rpx 0;
+}
+.bommon .bommon-name {
+  background: #46a9a4;
+  padding: 30rpx 60rpx;
+  border-radius: 30rpx;
+  width: 500rpx;
+  margin: 0 auto;
+}

+ 1 - 1
nova-tourism/pages/my/merchant/merchant-home/index.js

@@ -255,7 +255,7 @@ Page({
             success(res) {
                 let content = res.result
                 console.log(content)
-                let code1 = content.match(/\id=(.*)/)[1]
+                let code1 =content|| content.match(/\id=(.*)/)[1]
                 console.log(code1);
                 switch (that.data.store.type) {
                     case 'stay':

+ 1 - 1
nova-tourism/pages/my/merchant/room-manage/index.js

@@ -20,7 +20,7 @@ Page({
     let merchant = wx.getStorageSync('merchant')
     let store = wx.getStorageSync('store')
     if (!merchant) {
-      wx.navigateTo({
+      wx.reLaunch({
         url: `/nova-tourism/pages/index/index`
       })
     }

+ 14 - 7
nova-tourism/pages/my/merchant/room-manage/room-edit/index.js

@@ -13,7 +13,12 @@ Page({
         routeId: 'm1D72HCXcL',
         roomId: null,
         storeId: null,
-        oldimages:[]
+        oldimages:[],
+        edit_field_map:{
+          tags:{default:['提供早餐','免费wifi','禁烟','宠物友好']},
+          service:{default:['冰箱','液晶电视机','免费停车位','暖气','牙具']},
+          shop:{disabled:true,default:{className:'ShopStore',__type:'Pointer',objectId:''}}
+        }
     },
 
     /**
@@ -24,15 +29,19 @@ Page({
             roomId,
             storeId
         } = options
-        console.log(roomId);
+        console.log(options);
+        let store = wx.getStorageSync('store')
+        let {edit_field_map}=this.data
+        edit_field_map.shop.default = {className:'ShopStore',__type:'Pointer',objectId:store?.objectId}
+        this.setData({edit_field_map})
         if (!storeId && !roomId) {
-            wx.navigateTo({
+            wx.reLaunch({
                 url: `/nova-tourism/pages/index/index`
             })
+            return
         }
         if (!storeId && roomId) {
             let pageType = 'edit'
-            let store = wx.getStorageSync('store')
             this.setData({
                 roomId,
                 storeId: store.objectId,
@@ -44,9 +53,7 @@ Page({
                 storeId
             })
         }
-        this.initData()
-
-
+        // this.initData()
     },
     async initData() {
         let store;

+ 2 - 1
nova-tourism/pages/my/merchant/room-manage/room-edit/index.json

@@ -7,6 +7,7 @@
     "van-tag": "@vant/weapp/tag/index",
     "van-button": "@vant/weapp/button/index",
     "van-uploader": "@vant/weapp/uploader/index",
-    "van-switch": "@vant/weapp/switch/index"
+    "van-switch": "@vant/weapp/switch/index",
+    "dev-route":"../../../../../components/dev-route/index"
   }
 }

+ 56 - 66
nova-tourism/pages/my/merchant/room-manage/room-edit/index.wxml

@@ -1,69 +1,59 @@
 <nav type="back" background-color="#46a9a4" title="{{pageType == 'add'?'添加房型':'编辑详情'}}" />
-<view class="page-section form" style="color:#382E2E; ">
-    <block wx:for="{{route['editFields']}}" wx:key="index" wx:for-item="field">
-        <!-- <block wx:if="{{route.editTabs}} " wx:key="index" wx:for-item="tab">{{tab==field['editTab']}} -->
-            <!-- <block wx:if="{{tab==field['editTab']}}"> -->
-                <view class="form-item {{field.type == 'Number'?'col-12':''}}" wx:if="{{field.key != ( 'shop' || 'company' ||  'department')}}">
-                    <view class="form-label" >
-                        <text wx:if="{{field.required}}" class="red required">*</text>
-                        <text class="form-label-text">{{field.name}}:</text>
-                    </view>
-                    <view class="form-field">
-                        <block wx:if="{{field.type == 'String'}}">
-                            <block wx:if="{{!field.view}}">
-                                <input class="form-input" border="{{true}}"
-                                value="{{ formData[field.key] }}"
-                                placeholder="请输入{{field.name}}"  data-field="{{field.key}}" data-type="{{field.type}}"
-                                bindinput="onChange"/>
-                            </block>
-                            <!-- <block wx:if="{{field.view == 'editor-tinymce'}}">
-                                <diy-editor width="100%" height="600rpx" insertPicture="{{true}}" placeholder="编写文章..." data-field="{{field.key}}" bind:Content="getHtml" bind:insertImage="insertImage" id="editor{{field.key}}"/>
-                            </block> -->
-                        </block>
-                        <block wx:if="{{field.type == 'Number'}}">
-                            <block wx:if="{{!field.view}}">
-                                <input class="form-input form-input-num" min="0" type="number" border="{{true}}"
-                                value="{{ formData[field.key] }}" 
-                                placeholder="请输入{{field.name}}" data-field="{{field.key}}" data-type="{{field.type}}"
-                                bindinput="onChange"/>
-                            </block>
-                        </block>
-                        <block wx:if="{{field.type == 'Boolean'}}">
-                            <block wx:if="{{!field.view}}">
-                                <van-switch checked="{{ formData[field.key] }}" data-field="{{field.key}}"  data-type="{{field.type}}" active-color="#07c160"  size="24px" bind:change="onChange" />
-                            </block>
-                        </block>
-                        <block wx:if="{{field.type == 'Array'}}">
-                            <block wx:if="{{!field.view}}">
-                                <view class="tag-wrapper">
-                                    <view class="tags">
-                                        <block wx:for="{{formData[field.key]}}" wx:key="index" wx:for-item="tag">
-                                            <van-tag plain size="large" closeable data-field="{{field.key}}" data-index="{{index}}" bind:close="tagClose"  class="tag" type="primary">{{tag}}</van-tag>
-                                        </block>
-                                    </view>
-                                    <van-button plain type="primary" data-field="{{field.key}}" data-name="{{field.name}}"  bindtap="showTagEdit"  class="add-btn">添加{{field.name}}</van-button>
-        
-                                </view>
-                            </block>
-                            <block wx:if="{{field.view == 'edit-filemanager'}}">
-                                <upload data-field="{{field.key}}" bind:onChangeFile="changeFile" fileList="{{ formData[field.key] }}" accept="image" maxCount="9" uploadURL="{{uploadURL}}" domain="{{domain}}" uptokenURL="{{uptokenURL}}"></upload>
-                            </block>
-                        </block>
-                        <block wx:if="{{field.type == 'GeoPoint'}}">
-                            <block wx:if="{{!field.view}}">
-                                <van-button data-field="{{field.key}}" bind:tap="chooseGeoPoint" type="primary" size="small">选择{{field.name}}</van-button>
-                                <view>
-                                    <text class="text-small grey">{{formData['address']}}</text>
-                                </view>
-                            </block>
-                        </block>
-                    </view>
-                </view>
-            <!-- </block> -->
-        <!-- </block> -->
-    </block>
+
+<dev-route rid='m1D72HCXcL' object_id="{{roomId}}" edit_field_map="{{edit_field_map}}" is_btn="{{true}}"></dev-route>
+
+
+<!-- <view class="page-section form" style="color:#382E2E; ">
+  <block wx:for="{{route['editFields']}}" wx:key="index" wx:for-item="field">
+    <view class="form-item {{field.type == 'Number'?'col-12':''}}" wx:if="{{field.key != ( 'shop' || 'company' ||  'department')}}">
+      <view class="form-label">
+        <text wx:if="{{field.required}}" class="red required">*</text>
+        <text class="form-label-text">{{field.name}}:</text>
+      </view>
+      <view class="form-field">
+        <block wx:if="{{field.type == 'String'}}">
+          <block wx:if="{{!field.view}}">
+            <input class="form-input" border="{{true}}" value="{{ formData[field.key] }}" placeholder="请输入{{field.name}}" data-field="{{field.key}}" data-type="{{field.type}}" bindinput="onChange" />
+          </block>
+        </block>
+        <block wx:if="{{field.type == 'Number'}}">
+          <block wx:if="{{!field.view}}">
+            <input class="form-input form-input-num" min="0" type="number" border="{{true}}" value="{{ formData[field.key] }}" placeholder="请输入{{field.name}}" data-field="{{field.key}}" data-type="{{field.type}}" bindinput="onChange" />
+          </block>
+        </block>
+        <block wx:if="{{field.type == 'Boolean'}}">
+          <block wx:if="{{!field.view}}">
+            <van-switch checked="{{ formData[field.key] }}" data-field="{{field.key}}" data-type="{{field.type}}" active-color="#07c160" size="24px" bind:change="onChange" />
+          </block>
+        </block>
+        <block wx:if="{{field.type == 'Array'}}">
+          <block wx:if="{{!field.view}}">
+            <view class="tag-wrapper">
+              <view class="tags">
+                <block wx:for="{{formData[field.key]}}" wx:key="index" wx:for-item="tag">
+                  <van-tag plain size="large" closeable data-field="{{field.key}}" data-index="{{index}}" bind:close="tagClose" class="tag" type="primary">{{tag}}</van-tag>
+                </block>
+              </view>
+              <van-button plain type="primary" data-field="{{field.key}}" data-name="{{field.name}}" bindtap="showTagEdit" class="add-btn">添加{{field.name}}</van-button>
+
+            </view>
+          </block>
+          <block wx:if="{{field.view == 'edit-filemanager'}}">
+            <upload data-field="{{field.key}}" bind:onChangeFile="changeFile" fileList="{{ formData[field.key] }}" accept="image" maxCount="9" uploadURL="{{uploadURL}}" domain="{{domain}}" uptokenURL="{{uptokenURL}}"></upload>
+          </block>
+        </block>
+        <block wx:if="{{field.type == 'GeoPoint'}}">
+          <block wx:if="{{!field.view}}">
+            <van-button data-field="{{field.key}}" bind:tap="chooseGeoPoint" type="primary" size="small">选择{{field.name}}</van-button>
+            <view>
+              <text class="text-small grey">{{formData['address']}}</text>
+            </view>
+          </block>
+        </block>
+      </view>
+    </view>
+  </block>
 </view>
-<!-- editFields -->
 <view class="footer">
-    <van-button class="btn" size="large" color="#46a9a4" bindtap="submit">提交</van-button>
-</view>
+  <van-button class="btn" size="large" color="#46a9a4" bindtap="submit">提交</van-button>
+</view> -->

+ 39 - 11
nova-tourism/pages/my/my-order/index.js

@@ -15,6 +15,22 @@ Page({
     roomList: [],
     show: false,
     showid: null,
+    statusMap:{
+      100:'已支付',
+      200:'已入住',
+      300:'续住',
+      400:'已退房',
+      500:'申请退款',
+      601:'退款审核通过',
+      602:'退款已驳回',
+      700:'退款成功',
+      800:'已完成',
+      101:'已取消支付',
+      102:'已完申请退房成',
+      103:'退房成功',
+      104:'退房被驳回',
+      105:'未支付',
+    },
     roomTabMap: {
       0: "(100,500,601,602)", //已支付,申请退款,退款审核通过,退款已驳回
       1: "(200,102,104)", //已入住,申请退房,退房被驳回
@@ -33,12 +49,11 @@ Page({
     });
   },
   ONShow(e) {
-    const id = e.currentTarget.dataset.item.objectId
+    let {oid} = e.currentTarget.dataset
     this.setData({
-      showid: id,
+      showid: oid,
       show: true,
     }); // 设置弹窗显示
-    console.log(this.data.showid);
   },
   //订单完成
   async ordercom(e) {
@@ -124,9 +139,8 @@ Page({
   LIMIT 20 OFFSET ${order?.length||0}`
     let d = await req.customSQL(sql) || []
     d?.map(item => {
-      console.log(item)
-      if(item.list){
-        item.list = JSON.parse(item.list||'[]')||[]
+      if (item.list) {
+        item.list = JSON.parse(item.list || '[]') || []
       }
       if (item.startTime && item.endTime) {
         item.fromto = `${dateF.formatTime('YYYY年mm月dd日',item.startTime)}入住 - ${dateF.formatTime('YYYY年mm月dd日',item.endTime)}离店`
@@ -134,7 +148,7 @@ Page({
       return item
     })
     console.log(d)
-    
+
     this.setData({
       order: [...order, ...(d || [])]
     })
@@ -144,18 +158,32 @@ Page({
     const index = e.currentTarget.dataset.index;
     await this.setData({
       currentTab: index,
-      order:[]
+      order: []
     });
-   this.getOrder()
+    this.getOrder()
+  },
+  /**已支付订单100-退款 */
+  async checkout100(e) {
+    console.log(e)
+    let {oid} = e.currentTarget.dataset
+    let query = new Parse.Query('RoomOrder')
+    let order = await query.get(oid)
+    order.set('status',500)
+    await order.save()
+    await this.setData({
+      order: [],
+      show: false,
+    });
+    this.getOrder()
   },
 
-  tourl(e){
+  tourl(e) {
     let url = e.currentTarget.dataset.url
     wx.navigateTo({
       url: `${url}`,
     });
   },
- 
+
   /**
    * 生命周期函数--监听页面初次渲染完成
    */

+ 5 - 4
nova-tourism/pages/my/my-order/index.wxml

@@ -18,8 +18,9 @@
       <!-- 民宿 -->
       <block wx:if="{{item.table!='order'}}">
         <view class="cardbox">
-          <view class="title">{{item.table||''}}
-            <!-- <view style="margin-left: auto;">已完成</view> -->
+          <view class="title">
+            {{item.table||''}}
+            <text wx:if="{{statusMap[item.status]}}"> - {{statusMap[item.status]}}</text>
           </view>
           <view class="roombox">
             <image src="{{item.image||'https://file-cloud.fmode.cn/EbxZUK5lBI/20250228/j4pbsl030249178.jpg?imageView2/1/w/200/h/200'}}"></image>
@@ -38,11 +39,11 @@
             <view class="price">实付款¥{{item.totalPrice||0}}</view>
           </view>
           <view class="sumbitbox">
-            <view class="sumbit" bindtap="ONShow" data-item="{{item}}">申请退房</view>
+            <view wx:if="{{item.status=='100'}}" class="sumbit" bindtap="ONShow" data-oid="{{item.objectId}}">申请退款</view>
             <view wx:if="{{currentTab==0||currentTab==2}}" class="sumbit" style="margin-left: 15rpx;" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/order-detail/index?value=民宿&objectId='+item.objectId}}">订单详情</view>
             <view wx:if="{{currentTab==1}}" class="sumbit" style="margin-left: 15rpx;" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/order-detail/index?value=民宿&objectId='+item.objectId}}">变更订单</view>
           </view>
-          <van-dialog wx:if="{{showid==item.objectId}}" message='仅支持线下退款,确定退房吗?' data-item="{{item}}" show="{{ show }}" show-cancel-button bind:cancel="onClose" bind:confirm="ordercom">
+          <van-dialog message='仅支持线下退款,确认退房并提交退款申请吗?' data-oid="{{item.objectId}}" show="{{ showid==item.objectId&&show }}" show-cancel-button bind:cancel="onClose" bind:confirm="checkout100">
           </van-dialog>
         </view>
       </block>

+ 238 - 180
nova-tourism/pages/my/my-order/order-detail/index.js

@@ -1,206 +1,264 @@
 // nova-tourism/pages/my/my-order/order-detail/index.js
 let Parse = getApp().Parse;
 const company = getApp().globalData.company
+const dateF = require("../../../../../utils/date")
+
+
+
 Page({
 
-    /**
-     * 页面的初始数据
-     */
-    data: {
-        statusBarHeight: 0,
-        screenHeight: 0,
-        customHeight: 0,
-        bottomNavHeight: 0,
-        contentHeight: 0,
-
-        objectId:'',
-        value:'',
-        roomList:{},
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    statusBarHeight: 0,
+    screenHeight: 0,
+    customHeight: 0,
+    bottomNavHeight: 0,
+    contentHeight: 0,
+
+    objectId: '',
+    value: '',
+    roomList: {},
+    isQr: false, //二维码弹框
+    statusMap: {
+      100: '未入住',
+      200: '已入住',
+      300: '续住',
+      400: '已退房',
+      500: '申请退款',
+      601: '退款审核通过',
+      602: '退款已驳回',
+      700: '退款成功',
+      800: '已完成',
+      101: '已取消支付',
+      102: '已完申请退房成',
+      103: '退房成功',
+      104: '退房被驳回',
+      105: '未支付',
     },
+  },
 
-    /**
-     * 生命周期函数--监听页面加载
-     */
-    onLoad: function (options) {
-        const {
-            objectId,
-            value
-        } = options;
-        const Value = decodeURIComponent(value);
-        this.setData({
-            objectId,
-            value:Value
-        })
-        console.log(this.data.value,this.data.objectId);
-
-        const systemInfo = wx.getSystemInfoSync();
-        const statusBarHeight = systemInfo.statusBarHeight || 0;
-        const screenHeight = systemInfo.screenHeight || 0;
-        const custom = wx.getMenuButtonBoundingClientRect();
-        const customHeight = custom.height + 10 + 2 || 0;
-        const bottomNavHeight = systemInfo.screenHeight - systemInfo.safeArea.bottom || 0;
-
-        const contentHeight = (screenHeight - bottomNavHeight - statusBarHeight - customHeight) * 750 / systemInfo.windowWidth;
-        this.setData({
-            statusBarHeight,
-            screenHeight,
-            customHeight,
-            bottomNavHeight,
-            contentHeight
-        });
-        if(this.data.value=='民宿'){
-            this.getRoomOrder()
-        }
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    const {
+      objectId,
+      value
+    } = options;
+    const Value = decodeURIComponent(value);
+    this.setData({
+      objectId,
+      value: Value
+    })
+    console.log(this.data.value, this.data.objectId);
 
-    },
-    async getRoomOrder() {
-        let Order = new Parse.Query('RoomOrder');
-        Order.equalTo('company', company);
-        Order.equalTo('objectId', this.data.objectId);
-        Order.include('room');
-        Order.equalTo('user', Parse.User.current().id);
-        Order.include('shopStore');
-        let room = await Order.find();
-        let roomList = room.map(async item => {
-            let roomItme = item.toJSON();
-            roomItme.tiem = await this.formatDate2(roomItme.startTime.iso, roomItme.endTime.iso)
-            roomItme.startTime = await this.formatDate(roomItme.startTime.iso)
-            roomItme.endTime = await this.formatDate(roomItme.endTime.iso)
-            return roomItme
-        });
-        let roomList2 = await Promise.all(roomList);
-        this.setData({
-            roomList: roomList2[0]
-        })
-        console.log(this.data.roomList);
-    },
-    formatDate2(date1, date2) {
-        date1 = new Date(date1);
-        date2 = new Date(date2);
+    const systemInfo = wx.getSystemInfoSync();
+    const statusBarHeight = systemInfo.statusBarHeight || 0;
+    const screenHeight = systemInfo.screenHeight || 0;
+    const custom = wx.getMenuButtonBoundingClientRect();
+    const customHeight = custom.height + 10 + 2 || 0;
+    const bottomNavHeight = systemInfo.screenHeight - systemInfo.safeArea.bottom || 0;
 
-        // 获取年份、月份和日期
-        const year1 = date1.getFullYear();
-        const month1 = date1.getMonth() + 1; // 月份从0开始,所以要加1
-        const day1 = date1.getDate();
+    const contentHeight = (screenHeight - bottomNavHeight - statusBarHeight - customHeight) * 750 / systemInfo.windowWidth;
+    this.setData({
+      statusBarHeight,
+      screenHeight,
+      customHeight,
+      bottomNavHeight,
+      contentHeight
+    });
+    if (this.data.value == '民宿') {
+      this.getRoomOrder()
+    }
+  },
+  async getRoomOrder() {
+    let Order = new Parse.Query('RoomOrder');
+    Order.equalTo('company', company);
+    Order.equalTo('objectId', this.data.objectId);
+    Order.include('room');
+    Order.equalTo('user', Parse.User.current().id);
+    Order.include('shopStore');
+    let room = await Order.find();
+    let roomList = room.map(async item => {
+      let roomItme = item.toJSON();
+      roomItme.tiem = await this.formatDate2(roomItme.startTime.iso, roomItme.endTime.iso)
+      roomItme.startTime = await this.formatDate(roomItme.startTime.iso)
+      roomItme.endTime = await this.formatDate(roomItme.endTime.iso)
+      return roomItme
+    });
+    let roomList2 = await Promise.all(roomList);
+    this.setData({
+      roomList: roomList2[0]
+    })
+    console.log(this.data.roomList);
+  },
+  formatDate2(date1, date2) {
+    date1 = new Date(date1);
+    date2 = new Date(date2);
 
-        const year2 = date2.getFullYear();
-        const month2 = date2.getMonth() + 1; // 月份从0开始,所以要加1
-        const day2 = date2.getDate();
+    // 获取年份、月份和日期
+    const year1 = date1.getFullYear();
+    const month1 = date1.getMonth() + 1; // 月份从0开始,所以要加1
+    const day1 = date1.getDate();
 
-        // 返回格式化的字符串
-        return `${year1}年${month1}月${day1}日入住 - ${year2}年${month2}月${day2}日离店`;
-    },
-     formatDate(isoString) {
-        const date = new Date(isoString);
-        const year = date.getUTCFullYear();
-        const month = String(date.getUTCMonth() + 1).padStart(2, '0'); // 月份从0开始
-        const day = String(date.getUTCDate()).padStart(2, '0');
-        const hours = String(date.getUTCHours()).padStart(2, '0');
-        const minutes = String(date.getUTCMinutes()).padStart(2, '0');
-        const seconds = String(date.getUTCSeconds()).padStart(2, '0');
-    
-        return `${year}-${month}-${day} 14:00:00`;
-    },
-    //复制
-    copyOrderNum() {
-        const orderNum = this.data.roomList.orderNum; // 获取订单编号
-        if (orderNum) {
-            wx.setClipboardData({
-                data: orderNum,
-                success: () => {
-                    wx.showToast({
-                        title: '复制成功',
-                        icon: 'success',
-                        duration: 2000
-                    });
-                },
-                fail: (err) => {
-                    console.error('复制失败:', err);
-                    wx.showToast({
-                        title: '复制失败',
-                        icon: 'none',
-                        duration: 2000
-                    });
-                }
-            });
-        } else {
-            wx.showToast({
-                title: '没有订单编号',
-                icon: 'none',
-                duration: 2000
-            });
+    const year2 = date2.getFullYear();
+    const month2 = date2.getMonth() + 1; // 月份从0开始,所以要加1
+    const day2 = date2.getDate();
+
+    // 返回格式化的字符串
+    return `${year1}年${month1}月${day1}日入住 - ${year2}年${month2}月${day2}日离店`;
+  },
+  formatDate(isoString) {
+    const date = new Date(isoString);
+    const year = date.getUTCFullYear();
+    const month = String(date.getUTCMonth() + 1).padStart(2, '0'); // 月份从0开始
+    const day = String(date.getUTCDate()).padStart(2, '0');
+    const hours = String(date.getUTCHours()).padStart(2, '0');
+    const minutes = String(date.getUTCMinutes()).padStart(2, '0');
+    const seconds = String(date.getUTCSeconds()).padStart(2, '0');
+
+    return `${year}-${month}-${day} 14:00:00`;
+  },
+  //复制
+  copyOrderNum() {
+    const orderNum = this.data.roomList.orderNum; // 获取订单编号
+    if (orderNum) {
+      wx.setClipboardData({
+        data: orderNum,
+        success: () => {
+          wx.showToast({
+            title: '复制成功',
+            icon: 'success',
+            duration: 2000
+          });
+        },
+        fail: (err) => {
+          console.error('复制失败:', err);
+          wx.showToast({
+            title: '复制失败',
+            icon: 'none',
+            duration: 2000
+          });
         }
-    },
-    //续住
-    gourl() {
-        const start = new Date(this.data.roomList.endTime);
-        const end = new Date(start); // 复制 start 日期
-        end.setDate(start.getDate() + 1); // 将 end 设置为 start 的后一天
-    
-        // 构造要传递的信息
-        const info = {
-            objectId: this.data.roomList.room.objectId,
-            date_start: start.toISOString(), // 转换为 ISO 格式字符串
-            date_end: end.toISOString(), // 转换为 ISO 格式字符串
-        };
-        console.log('info', info);
-    
-        // 将信息转为查询字符串
-        var queryString = Object.keys(info)
-            .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(info[key])}`)
-            .join('&');
-        console.log(queryString);
-        
-        wx.navigateTo({
-            url: `../../../homestay/homestay-order2/index?${queryString}`
-        });
-    },
-    /**
-     * 生命周期函数--监听页面初次渲染完成
-     */
-    onReady: function () {
+      });
+    } else {
+      wx.showToast({
+        title: '没有订单编号',
+        icon: 'none',
+        duration: 2000
+      });
+    }
+  },
+  //续住
+  gourl() {
+    const start = new Date();
+    const end = new Date(start); // 复制 start 日期
+    end.setDate(start.getDate() + 1); // 将 end 设置为 start 的后一天
+    // 构造要传递的信息
+    const info = {
+      objectId: this.data.roomList.room.objectId,
+      date_start: dateF.formatTime('YYYY-mm-dd', start),
+      date_end: dateF.formatTime('YYYY-mm-dd', end),
+    };
+    console.log('info', info);
+    wx.navigateTo({
+      url: `../../../homestay/homestay-order2/index?objectId=${info.objectId}&date_start=${info.date_start}&date_end=${info.date_end}`
+    });
+  },
+  /**展开订单二维码 */
+  async openQr() {
+    let {
+      qr
+    } = this.data
+    if (qr) {
+      this.setData({
+        isQr: true
+      })
+      return
+    }
+    let that = this
+    let {
+      roomList
+    } = this.data
+    let url = 'https://server.fmode.cn/api/common/qrcode'
+    wx.request({
+      url: url,
+      data: {
+        qrCode: roomList?.objectId || '',
+        darkColor: "#000000",
+        lightColor: "#ffffff"
+      },
+      method: 'GET',
+      header: {
+        'content-type': 'application/json'
+      },
+      success: function (res) {
+        let qr = res.data.data
+        that.setData({
+          qr,
+          isQr: true,
+        })
+      },
+      fail: function () {
+        wx.showToast({
+          title: '请求二维码失败,请稍后再试',
+        })
+      }
+    })
+  },
+  closeQr() {
+    this.setData({
+      isQr: false
+    })
+  },
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
 
-    },
+  },
 
-    /**
-     * 生命周期函数--监听页面显示
-     */
-    onShow: function () {
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
 
-    },
+  },
 
-    /**
-     * 生命周期函数--监听页面隐藏
-     */
-    onHide: function () {
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
 
-    },
+  },
 
-    /**
-     * 生命周期函数--监听页面卸载
-     */
-    onUnload: function () {
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
 
-    },
+  },
 
-    /**
-     * 页面相关事件处理函数--监听用户下拉动作
-     */
-    onPullDownRefresh: function () {
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
 
-    },
+  },
 
-    /**
-     * 页面上拉触底事件的处理函数
-     */
-    onReachBottom: function () {
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
 
-    },
+  },
 
-    /**
-     * 用户点击右上角分享
-     */
-    onShareAppMessage: function () {
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
 
-    }
+  }
 })

+ 4 - 1
nova-tourism/pages/my/my-order/order-detail/index.json

@@ -1,3 +1,6 @@
 {
-  "usingComponents": {}
+  "usingComponents": {
+    "van-popup": "@vant/weapp/popup/index",
+    "van-notice-bar": "@vant/weapp/notice-bar/index"
+  }
 }

+ 20 - 0
nova-tourism/pages/my/my-order/order-detail/index.less

@@ -199,4 +199,24 @@
             }
         }
     }
+}
+.qr{
+    .title{
+        padding: 20rpx;
+        border-bottom: 1rpx solid whitesmoke;
+        text-align: center;
+        font-weight: bold;
+    }
+    .tip{
+        margin: 20rpx;
+        font-size: 25rpx;
+    }
+    .image{
+        display: flex;
+        justify-content: center;
+        image{
+            height: calc( 50vh - 200rpx );
+        }
+    }
+    
 }

+ 23 - 87
nova-tourism/pages/my/my-order/order-detail/index.wxml

@@ -10,9 +10,9 @@
       <view class="roombox">
         <image src="{{roomList.room.images[0]}}"></image>
         <view class="room">
-          <view class="room-name">{{roomList.room.name}}</view>
+          <view class="room-name">{{roomList.room.name||''}} - {{statusMap[roomList.status]}}</view>
           <view class="room-tag">
-            <block wx:for="{{roomList.room.tags}}">
+            <block wx:for="{{roomList.room.tags}}" wx:key="index">
               {{item}}
             </block>
           </view>
@@ -25,6 +25,12 @@
           <view class="tex1">实付款</view>
           <view class="tex2">¥{{roomList.price}}</view>
         </view>
+        <view class="text1" bind:tap="openQr" wx:if="{{roomList.status=='100'||roomList.status=='200'}}">
+          <view class="tex1">出具二维码</view>
+          <view class="tex3">
+            <van-icon name="arrow" />
+          </view>
+        </view>
         <view class="text1">
           <view class="tex1">订单编号</view>
           <view class="tex3">
@@ -33,11 +39,11 @@
           </view>
         </view>
         <!-- <view class="text1">
-                    <view class="tex1">付款时间</view>
-                    <view class="tex3">
-                        2024-12-03 12:05:43
-                    </view>
-                </view> -->
+          <view class="tex1">付款时间</view>
+          <view class="tex3">
+            {{roomList.payTime}}
+          </view>
+        </view> -->
         <view class="text1">
           <view class="tex1">入住时间</view>
           <view class="tex3">
@@ -61,86 +67,16 @@
         </view>
       </view>
     </block>
+  </view>
+</view>
 
-    <block wx:if="{{value=='物品'}}">
-      <view class="title2">{{item.shopStore.storeName}}</view>
-      <view class="roombox">
-        <image src="{{roomList.room.images[0]}}"></image>
-        <view class="room">
-          <view class="room-name">{{roomList.room.name}}</view>
-          <view class="room-tag">
-            <block wx:for="{{roomList.room.tags}}">
-              {{item}}
-            </block>
-          </view>
-          <view class="room-text">{{roomList.tiem}}</view>
-        </view>
-      </view>
-      <view class="textbox">
-        <view class="text1">
-          <view class="tex1">实付款</view>
-          <view class="tex2">¥1999.99</view>
-        </view>
-        <view class="text1">
-          <view class="tex1">订单编号</view>
-          <view class="tex3">
-            <view class="tex3-1">4150502930640735137 |</view>
-            <view class="tex3-2">复制</view>
-          </view>
-        </view>
-        <view class="text1">
-          <view class="tex1">付款时间</view>
-          <view class="tex3">
-            2024-12-03 12:05:43
-          </view>
-        </view>
-        <view class="text1">
-          <view class="tex1">发货时间</view>
-          <view class="tex3">
-            2024-12-03 12:05:43
-          </view>
-        </view>
-        <view class="text1">
-          <view class="tex1">物流单号</view>
-          <view class="tex3">
-            <view class="tex3-1">4150502930640735137 |</view>
-            <view class="tex3-2">复制</view>
-          </view>
-        </view>
-        <view class="text1">
-          <view class="tex1">申请开票</view>
-          <view class="tex3">
-            本订单由商家开具,无法显示开票
-          </view>
-        </view>
-        <view class="text2">
-          <view class="tex1">收货地址</view>
-          <view class="tex4">
-            发货地址发货地址发货地址发货地址发货地址发货地址
-          </view>
-        </view>
-
-      </view>
-    </block>
 
+<van-popup closeable position="bottom" round show="{{ isQr }}" bind:close="closeQr">
+  <view class="qr" style="height: 50vh;">
+    <view class="title">订单二维码</view>
+    <van-notice-bar color="#F37B40" background="#fff" left-icon="info-o" text="入住以及退房时请出示订单二维码" />
+    <view class="image">
+      <image src="{{qr||'https://file-cloud.fmode.cn/EbxZUK5lBI/20250412/6brmu4035238241.jpg'}}" mode="aspectFit" />
+    </view>
   </view>
-
-  <!-- 望仙礼遇 -->
-  <!-- <view class="box">
-        <view class="wang-cardbox">
-            <block wx:for="{{4}}">
-                <view class="wang-card" bindtap="gourl2">
-                    <image src="https://file-cloud.fmode.cn//tmp/srFPqGFAzeT5958c828d985e451ed4c0b452e39ff57a.jpeg"></image>
-                    <view class="wang-catex">粉黛胖挑主人杯(无礼盒)·手做</view>
-                    <view class="wang-numbox">
-                        <view class="wang-num">
-                            <view class="wang-num1">¥</view>
-                            <view class="wang-num2">19900</view>
-                        </view>
-                        <view class="wang-submit">购买</view>
-                    </view>
-                </view>
-            </block>
-        </view>
-    </view> -->
-</view>
+</van-popup>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
nova-tourism/pages/my/my-order/order-detail/index.wxss


+ 1 - 1
nova-tourism/pages/my/my-wallet/index.wxml

@@ -5,7 +5,7 @@
         <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20241212/qjtn9s104029899.png"></image>
         <view class="text">
         零钱
-        <view>¥10000000000.55 <van-icon name="arrow" /></view>
+        <view>¥0 <van-icon name="arrow" /></view>
         </view>
     </view>
     <view class="textbox">

+ 1 - 1
nova-tourism/pages/my/my-wallet/loose-change/index.wxml

@@ -4,7 +4,7 @@
 <view class="moneyBox">
   <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20241212/qjtn9s104029899.png"></image>
   <view class="subTitle">我的零钱</view>
-  <view class="money">¥10000000000.66</view>
+  <view class="money">¥0</view>
 </view>
 <view class="btnBox">
   <button class="top_up">充值</button>

+ 10 - 3
project.private.config.json

@@ -8,9 +8,16 @@
     "miniprogram": {
       "list": [
         {
-          "name": "nova-tourism/pages/my/merchant/good/good-list/index",
-          "pathName": "nova-tourism/pages/my/merchant/good/good-list/index",
-          "query": "",
+          "name": "nova-tourism/pages/my/merchant/code-verify/index",
+          "pathName": "nova-tourism/pages/my/merchant/code-verify/index",
+          "query": "id=JiwYYEE69D",
+          "launchMode": "default",
+          "scene": null
+        },
+        {
+          "name": "nova-tourism/pages/my/my-order/order-detail/index",
+          "pathName": "nova-tourism/pages/my/my-order/order-detail/index",
+          "query": "value=%E6%B0%91%E5%AE%BF&objectId=JiwYYEE69D",
           "launchMode": "default",
           "scene": null
         }

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.