xll преди 1 ден
родител
ревизия
e2c6b80375
променени са 24 файла, в които са добавени 1483 реда и са изтрити 43 реда
  1. 3 1
      app.json
  2. 3 0
      common-page/pages/sharing/index.js
  3. 1 1
      nova-tourism/components/collect/index.wxml
  4. 2 1
      nova-tourism/components/my/index.wxml
  5. 9 2
      nova-tourism/pages/homestay/homestay-detail/index.less
  6. 7 2
      nova-tourism/pages/homestay/homestay-detail/index.wxss
  7. 3 1
      nova-tourism/pages/my/merchant/merchant-home/index.wxml
  8. 71 22
      nova-tourism/pages/my/my-order/index.js
  9. 2 1
      nova-tourism/pages/my/my-order/index.less
  10. 8 3
      nova-tourism/pages/my/my-order/index.wxml
  11. 2 1
      nova-tourism/pages/my/my-order/index.wxss
  12. 3 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/index.js
  13. 286 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.js
  14. 9 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.json
  15. 218 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.less
  16. 97 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.wxml
  17. 189 0
      nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.wxss
  18. 2 2
      nova-tourism/pages/my/my-order/order-detail-good/index.wxml
  19. 401 0
      nova-tourism/pages/my/sharing/index.js
  20. 3 0
      nova-tourism/pages/my/sharing/index.json
  21. 71 0
      nova-tourism/pages/my/sharing/index.less
  22. 28 0
      nova-tourism/pages/my/sharing/index.wxml
  23. 59 0
      nova-tourism/pages/my/sharing/index.wxss
  24. 6 6
      project.private.config.json

+ 3 - 1
app.json

@@ -40,7 +40,9 @@
         "pages/my/my-order/my-refund/refund-good/index",
         "pages/my/merchant/good/good-edit/index",
         "pages/my/merchant/good/good-list/index",
-        "pages/collect/good-list/index"
+        "pages/collect/good-list/index",
+        "pages/my/sharing/index",
+        "pages/my/my-order/my-refund/refund-good/refund-express/index"
       ]
     },
     {

+ 3 - 0
common-page/pages/sharing/index.js

@@ -39,6 +39,7 @@ Page({
     if(this.data.noBind){
       qrCodeUrl = `https://pwa.fmode.cn/gomini/${path}/`;
     }
+    console.log(qrCodeUrl)
     if(route){
       if(this.data.noBind){
         qrCodeUrl = qrCodeUrl+`?route=${route}`
@@ -55,6 +56,7 @@ Page({
         lightColor: cColor || "#000000"
       },
       async success(res) {
+        console.log(res.data.data)
         if (res.data.code == 1) {
           let that = this;
           //把base64文件转图片
@@ -64,6 +66,7 @@ Page({
             data: res.data.data.slice(22),
             encoding: 'base64',
             success: res => {
+              console.log(wx.env.USER_DATA_PATH + '/qr_code.png')
               _this.setData({
                 xcxcode: wx.env.USER_DATA_PATH + '/qr_code.png'
               })

+ 1 - 1
nova-tourism/components/collect/index.wxml

@@ -78,7 +78,7 @@
   <view wx:if="{{currentTab == 1}}">
     <!-- 卡片 -->
     <view class="Legendary-Information" wx:if="{{storeList.length!=0}}">
-      <block wx:for="{{storeList}}" wx:if="{{item.isCollect&&item.homestayStore.isShow}}">
+      <block wx:for="{{storeList}}" wx:key="index" wx:if="{{item.isCollect&&item.homestayStore.isShow}}">
         <view class="cardbox">
           <image class="pic" src="{{item.homestayStore.cover}}" data-id="{{item.homestayStore.objectId}}" data-url="../../pages/homestay/homestay-detail/index" bindtap="gourl"></image>
           <view class="textobx">

+ 2 - 1
nova-tourism/components/my/index.wxml

@@ -45,7 +45,8 @@
 
 
   </view>
-  <view class="tuiguangbox" data-url="/common-page/pages/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl">
+  <!-- <view class="tuiguangbox" data-url="/common-page/pages/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl"> -->
+  <view class="tuiguangbox" data-url="../../pages/my/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl">
     <view class="tuibox">
       <view class="tui-title">推广中心</view>
       <view class="tuiguang-tex">成为推广达人,获取佣金返利</view>

+ 9 - 2
nova-tourism/pages/homestay/homestay-detail/index.less

@@ -477,12 +477,19 @@
 
             .tag {
                 width: 50%;
-                height: 53rpx;
+                // height: 53rpx;
+                margin: 13rpx 0;
             }
 
             .tag2 {
                 width: 33%;
-                height: 53rpx;
+                // height: 53rpx;
+                margin: 13rpx 0;
+                display:-webkit-box;
+                overflow:hidden;
+                text-overflow:ellipsis;
+                -webkit-line-clamp:1;
+                -webkit-box-orient:vertical;
             }
         }
     }

+ 7 - 2
nova-tourism/pages/homestay/homestay-detail/index.wxss

@@ -426,11 +426,16 @@
 }
 .roomBox .tagBox .tags .tag {
   width: 50%;
-  height: 53rpx;
+  margin: 13rpx 0;
 }
 .roomBox .tagBox .tags .tag2 {
   width: 33%;
-  height: 53rpx;
+  margin: 13rpx 0;
+  display: -webkit-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical;
 }
 .roomBox .serverBox {
   margin-top: 30rpx;

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

@@ -144,7 +144,9 @@
       </view>
       <van-icon name="arrow" />
     </view>
-    <view class="box-title" data-url="/common-page/pages/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl">
+    
+    <!-- <view class="box-title" data-url="/common-page/pages/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl"> -->
+    <view class="box-title" data-url="/nova-tourism/pages/my/sharing/index?path=yswx&uid={{uid}}" bindtap="gourl">
       <view class="box-details">
         <van-icon name="https://file-cloud.fmode.cn/EbxZUK5lBI/20241211/i18ml9095731989.png" size="20" />
         <view class="name">推广本店</view>

+ 71 - 22
nova-tourism/pages/my/my-order/index.js

@@ -15,21 +15,32 @@ Page({
     roomList: [],
     show: false,
     showid: null,
-    statusMap:{
-      100:'已支付',
-      200:'已入住',
-      300:'续住',
-      400:'已退房',
-      500:'申请退款',
-      601:'退款审核通过',
-      602:'退款已驳回',
-      700:'退款成功',
-      800:'已完成',
-      101:'已取消支付',
-      102:'已完申请退房成',
-      103:'退房成功',
-      104:'退房被驳回',
-      105:'未支付',
+    statusMap: {
+      100: '已支付',
+      200: '已入住',
+      300: '续住',
+      400: '已退房',
+      500: '申请退款',
+      601: '退款审核通过',
+      602: '退款已驳回',
+      700: '退款成功',
+      800: '已完成',
+      101: '已取消支付',
+      102: '已完申请退房成',
+      103: '退房成功',
+      104: '退房被驳回',
+      105: '未支付',
+    },
+    statusMap_shop: {
+      '100': '待支付',
+      '200': '已支付',
+      '300': '已发货',
+      '400': '已收货',
+      '500': '申请退款',
+      '601': '退款申请通过',
+      '602': '退款被驳回',
+      '700': '退款成功',
+      '800': '订单完成',
     },
     roomTabMap: {
       0: "(100,500,601,602)", //已支付,申请退款,退款审核通过,退款已驳回
@@ -49,7 +60,9 @@ Page({
     });
   },
   ONShow(e) {
-    let {oid} = e.currentTarget.dataset
+    let {
+      oid
+    } = e.currentTarget.dataset
     this.setData({
       showid: oid,
       show: true,
@@ -88,7 +101,6 @@ Page({
   },
   async refersh() {
     this.getOrder()
-
   },
   /**获取订单 */
   async getOrder() {
@@ -101,9 +113,9 @@ Page({
     let rosql = `AND ro."status" IN ${roomTabMap[currentTab]}`
     let gosql = `AND o."status" IN ${goodTabMap[currentTab]}`
     let sql = `WITH "order" AS(
-    SELECT t1."objectId",t1."createdAt",t1."startTime",t1."endTime",t1."status",t1."totalPrice",sg."name",'order' AS "table",sg."image",sg."tag"::jsonb AS "tags",(t1."spec"::jsonb->'spec')::text AS "spec",(t1."spec"::jsonb->'list')::text AS "list"
+    SELECT t1."objectId",t1."createdAt",t1."startTime",t1."endTime",t1."status",t1."totalPrice",sg."name",ss."storeName" AS "table",sg."image",sg."tag"::jsonb AS "tags",(t1."spec"::jsonb->'spec')::text AS "spec",(t1."spec"::jsonb->'list')::text AS "list",'good' AS "ot"
     FROM (
-      SELECT o."objectId",o."createdAt",o."status"::text,o."totalPrice"::text,o."startTime",o."endTime",
+      SELECT o."objectId",o."createdAt",o."status"::text,o."totalPrice"::text,o."startTime",o."endTime",o."store",
       jsonb_array_elements(o."targetObject")::json->>'objectId' AS "gid",spec.value AS "spec"
       FROM "Order" o,
       jsonb_each(o."specMap") AS spec (key, value)
@@ -115,11 +127,12 @@ Page({
       AND o."isPay" IS TRUE
     )t1
     LEFT JOIN "ShopGoods" sg ON sg."objectId" = t1."gid"
+    LEFT JOIN "ShopStore" ss ON ss."objectId" = t1."store"
   ),
   "room_order" AS(
     SELECT ro."objectId",ro."createdAt",ro."startTime",ro."endTime",
     ro."status"::text,ro."price"::text AS "totalPrice",r."name",store."storeName" AS "table",
-    r."images"->> 0 AS "image",r."tags"::jsonb AS "tags",''::text AS "spec",''::text AS "list"
+    r."images"->> 0 AS "image",r."tags"::jsonb AS "tags",''::text AS "spec",''::text AS "list",'room' AS "ot"
     FROM "RoomOrder" ro
     LEFT JOIN "ShopRoom" r ON r."objectId"=ro."room" 
     LEFT JOIN "ShopStore" store ON store."objectId"=r."shop"
@@ -165,10 +178,12 @@ Page({
   /**已支付订单100-退款 */
   async checkout100(e) {
     console.log(e)
-    let {oid} = e.currentTarget.dataset
+    let {
+      oid
+    } = e.currentTarget.dataset
     let query = new Parse.Query('RoomOrder')
     let order = await query.get(oid)
-    order.set('status',500)
+    order.set('status', 500)
     await order.save()
     await this.setData({
       order: [],
@@ -176,6 +191,40 @@ Page({
     });
     this.getOrder()
   },
+/**商品订单 - 退款详情 */
+refundGift(e){
+
+},
+  /**商品订单-确认收货 */
+  receiving(e) {
+    console.log(e)
+    let {
+      oid
+    } = e.currentTarget.dataset
+    wx.showModal({
+      content: '确认收货吗?',
+      success:async (res)=> {
+        if (res.confirm) {
+          wx.showLoading({
+            title: '加载中...',
+          })
+          let query = new Parse.Query('Order')
+          let order = await query.get(oid)
+          order.set('status', '400')
+          await order.save()
+          await this.setData({
+            order: [],
+            show: false,
+          });
+          await this.getOrder()
+          wx.hideLoading()
+        } else if (res.cancel) {
+          console.log('用户点击取消')
+        }
+      }
+    })
+
+  },
 
   tourl(e) {
     let url = e.currentTarget.dataset.url

+ 2 - 1
nova-tourism/pages/my/my-order/index.less

@@ -76,7 +76,7 @@
 
     .cardbox {
         width: 100%;
-        height: 428rpx;
+        height: 450rpx;
         padding-left: 30rpx;
         padding-right: 30rpx;
         padding-top: 24rpx;
@@ -183,6 +183,7 @@
                 display: flex;
                 align-items: center;
                 justify-content: center;
+                margin: 0 10rpx;
             }
         }
     }

+ 8 - 3
nova-tourism/pages/my/my-order/index.wxml

@@ -16,7 +16,7 @@
   <view>
     <block wx:for="{{order}}" wx:key="index">
       <!-- 民宿 -->
-      <block wx:if="{{item.table!='order'}}">
+      <block wx:if="{{item.ot=='room'}}">
         <view class="cardbox">
           <view class="title">
             {{item.table||''}}
@@ -50,7 +50,10 @@
       <!-- 礼物 -->
       <block wx:else>
         <view class="cardbox">
-          <view class="title">望仙礼遇</view>
+          <view class="title">
+            {{item.table||'望仙礼遇'}}
+            <text wx:if="{{statusMap_shop[item.status]}}"> - {{statusMap_shop[item.status]}}</text>
+          </view>
           <view class="roombox">
             <image src="{{item.image||'https://file-cloud.fmode.cn//tmp/mqHkA2qV3Q8nca3dc59bad49de6e5ae57afa81d78ae8.jpeg?imageView2/1/w/200/h/200'}}"></image>
             <view class="room">
@@ -69,7 +72,9 @@
             <view class="price">实付款¥{{item.totalPrice}}</view>
           </view>
           <view class="sumbitbox">
-            <view wx:if="{{currentTab==0||currentTab==2}}" class="sumbit" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/order-detail-good/index?objectId='+item.objectId}}">订单详细</view>
+            <view wx:if="{{currentTab==0||currentTab==2}}" class="sumbit" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/order-detail-good/index?objectId='+item.objectId}}">订单详情</view>
+            <view wx:if="{{item.status=='200'||item.status=='300'||item.status=='602'}}" class="sumbit" data-oid="{{item.objectId}}" bind:tap="receiving" >确认收货</view>
+            <view wx:if="{{item.status=='601'}}" class="sumbit" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index?oid='+item.objectId}}" >退款详情</view>
             <view wx:if="{{currentTab==1}}" class="sumbit" bindtap="tourl" data-url="{{'/nova-tourism/pages/my/my-order/order-detail-good/index?objectId='+item.objectId}}">查看物流</view>
           </view>
         </view>

+ 2 - 1
nova-tourism/pages/my/my-order/index.wxss

@@ -64,7 +64,7 @@
 }
 .all .cardbox {
   width: 100%;
-  height: 428rpx;
+  height: 450rpx;
   padding-left: 30rpx;
   padding-right: 30rpx;
   padding-top: 24rpx;
@@ -158,6 +158,7 @@
   display: flex;
   align-items: center;
   justify-content: center;
+  margin: 0 10rpx;
 }
 .all .box {
   width: 100%;

+ 3 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/index.js

@@ -22,6 +22,9 @@ Page({
       {
         name: '换货'
       },
+      {
+        name: '店内退换'
+      },
     ], //可选退换方式
     cause: '不想要了', //原因
     causeList: [{

+ 286 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.js

@@ -0,0 +1,286 @@
+// nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.js
+let Parse = getApp().Parse;
+const company = getApp().globalData.company
+const uid = Parse.User.current()?.id
+const dateF = require("../../../../../../../utils/date")
+const qiniuUploader = require("../../../../../../../utils/qiniuUploader");
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+    order: null, //订单
+    expressNum: null, //快递单号
+
+    isShowExpress: false, //快递公司弹框
+    expVal: '', //快递公司搜索关键字
+    timeout: null, //搜索框计时器
+    expComList: [], //快递公司列表
+    checkExp: null, //选中的公司
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+
+    let {
+      oid
+    } = options
+    console.log(options)
+    this.setData({
+      oid
+    })
+    this.getOrder()
+  },
+
+  /**提交 */
+  async submit() {
+    let {
+      expressNum,order,checkExp
+    } = this.data
+    console.log(expressNum)
+    if(order.way!='店内退换') {
+      if(!expressNum){
+        wx.showToast({
+          title: '请填写快递单号',
+          icon:'none'
+        })
+        return
+      }
+      if(!checkExp?.objectId){
+        wx.showToast({
+          title: '请选择快递公司',
+          icon:'none'
+        })
+        return
+      }
+    }else{
+      wx.showToast({
+        title: '请前往店内退换',
+        icon:'none'
+      })
+      return
+    }
+    let content = `退换方式:${order.way}。原因:${order.cause}。描述:${order.text}。快递公司:${checkExp.name}。快递公司代码:${checkExp.code}。快递单号:${expressNum}。`
+    let query = new Parse.Query('Order')
+    let o = await query.get(order.objectId)
+    o.set('content',content)
+    await o.save()
+    await wx.showToast({
+      title: '提交成功,等待商家收货。',
+      icon: 'none'
+    })
+    setTimeout(() => {
+      wx.navigateBack({
+        delta: 1,
+      })
+    }, 800);
+  
+  },
+/**确认退款 */
+async submit02(){
+  let {
+    order
+  } = this.data
+  let query = new Parse.Query('Order')
+    let o = await query.get(order.objectId)
+    o.set('status','700')
+    await o.save()
+    await wx.showToast({
+      title: '操作成功',
+      icon: 'success'
+    })
+    setTimeout(() => {
+      wx.navigateBack({
+        delta: 1,
+      })
+    }, 800);
+},
+
+
+  /**获取订单 */
+  async getOrder() {
+    let {
+      oid,expressNum,checkExp
+    } = this.data
+    let query = new Parse.Query('Order')
+    query.include('targetObject', 'store', 'store.user')
+    let d = await query.get(oid)
+    let order = d?.toJSON()
+    console.log(order)
+
+    let parts = order?.content?.split('。')
+    order.way = parts[0]?.split(':')[1]
+    order.cause = parts[1]?.split(':')[1]
+    order.text = parts[2]?.split(':')[1]
+    let exp_name = parts[3]?.split(':')[1]||''
+    let exp_code = parts[4]?.split(':')[1]||''
+    expressNum = parts[5]?.split(':')[1]||''
+    if(exp_name&&exp_code){
+      let exp_query = new Parse.Query('ExpressCompany')
+      exp_query.equalTo('name',exp_name)
+      exp_query.equalTo('code',exp_code)
+      let e = await exp_query.first()
+      if(e?.id) checkExp = e.toJSON()
+    }
+    this.setData({
+      order,
+      orderParse: d,expressNum,checkExp
+    })
+  },
+
+  closeExpress() {
+    this.setData({
+      isShowExpress: false
+    });
+  },
+  openExpress() {
+    this.getPointerItem()
+    this.setData({
+      isShowExpress: true
+    });
+  },
+
+  /**指针搜索框变化 */
+  async valChange(e) {
+    await this.setData({
+      expVal: e.detail || ''
+    })
+    let {
+      timeout
+    } = this.data
+    clearTimeout(timeout)
+    timeout = setTimeout(async () => {
+      await this.setData({
+        expComList: [],
+      })
+      this.getPointerItem()
+    }, 1000);
+    this.setData({
+      timeout
+    })
+  },
+  /**选中快递公司 */
+  checkPointer(e) {
+    let {
+      index
+    } = e.currentTarget.dataset
+    let {
+      expComList
+    } = this.data
+    this.setData({
+      checkExp: expComList[index]
+    })
+    this.closeExpress()
+  },
+  /** 查询快递公司*/
+  async getPointerItem() {
+    let {
+      expVal,
+      expComList
+    } = this.data
+    let query = new Parse.Query('ExpressCompany')
+    query.contains('name', expVal)
+    query.limit(30)
+    query.skip(expComList?.length || 0)
+    let d = await query.find()
+    let list = d?.map(item => item.toJSON())
+    this.setData({
+      expComList: [...(expComList || []), ...(list || [])]
+    })
+  },
+
+  /**查看图片 */
+  previewImage(e) {
+    let {
+      src,
+      urls
+    } = e.currentTarget.dataset
+    wx.previewImage({
+      current: src, // 当前显示图片的http链接
+      urls: urls || [] // 需要预览的图片http链接列表
+    })
+  },
+  /** 复制*/
+  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
+      });
+    }
+  },
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 9 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.json

@@ -0,0 +1,9 @@
+{
+  "usingComponents": {
+    "van-divider": "@vant/weapp/divider/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-search": "@vant/weapp/search/index"
+
+  }
+}

+ 218 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.less

@@ -0,0 +1,218 @@
+/* nova-tourism/pages/my/my-order/my-refund/refund-detail/index.wxss */
+page {
+    background: white;
+    font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", sans-serif;
+
+}
+
+.title {
+    width: 100%;
+    font-size: 36rpx;
+    background-color: white;
+    display: flex;
+    justify-content: center;
+    padding-bottom: 25rpx;
+    border-bottom: #F4F4F4 20rpx solid;
+}
+
+.cardbox {
+    width: 100%;
+    padding-left: 30rpx;
+    padding-right: 30rpx;
+    padding-top: 20rpx;
+    padding-bottom: 10rpx;
+    margin-top: 20rpx;
+    background-color: white;
+
+    .title2 {
+        width: 100%;
+        font-size: 30rpx;
+        display: flex;
+        align-items: center;
+        margin-bottom: 30rpx;
+    }
+
+    .roombox {
+        width: 100%;
+        display: flex;
+        margin-top: 20rpx ;
+        padding-bottom: 20rpx;
+        margin-bottom: 20rpx;
+        border-bottom: 1rpx solid #D9D9D9;
+        image {
+            width: 150rpx;
+            height: 150rpx;
+        }
+
+        .room {
+            margin-left: 20rpx;
+
+            .room-name {
+                width: 460rpx;
+                font-size: 24rpx;
+                margin-bottom: 10rpx;
+                color: #000000;
+
+            }
+
+            .room-tag {
+                font-size: 26rpx;
+                width: 460rpx;
+                color: #F37B40;
+                margin-bottom: 10rpx;
+            }
+
+            .room-text {
+                width: 460rpx;
+                font-size: 26rpx;
+                color: #737373;
+            }
+
+            .room-text2 {
+                width: 460rpx;
+                font-size: 20rpx;
+                margin-top: 100rpx;
+                color: #979797;
+            }
+        }
+    }
+
+    .text1 {
+        padding: 5rpx 0;
+        width: 100%;
+        font-size: 24rpx;
+        display: flex;
+        color: #000000;
+        margin-bottom: 20rpx;
+
+        .tex1 {
+            white-space:nowrap;
+            display: flex;
+            margin-right: 20rpx;
+            .tex1-1 {
+                color: #E22525;
+                margin-left: 4rpx;
+            }
+
+        }
+
+        .tex2 {
+            margin-left: auto;
+            font-size: 24rpx;
+            color: #F05C14;
+
+        }
+
+        .tex3 {
+            margin-left: auto;
+            font-size: 24rpx;
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+
+        }
+
+    }
+
+    .areabox {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        position: relative;
+
+        textarea {
+            font-size: 24rpx;
+            background-color: #F4F4F4;
+            width: 100%;
+            padding: 15rpx;
+            border-radius: 5rpx;
+            min-height: 100rpx;
+        }
+
+        .number {
+            color: gray;
+            position: absolute;
+            bottom: 5rpx;
+            right: 20rpx;
+            font-size: 26rpx;
+        }
+    }
+
+    .uploadbox {
+        width: 100vw;
+        margin-top: 20rpx;
+        display: flex;
+        justify-content: space-between;
+        .up{
+            width: 160rpx;
+        }
+        .box{
+            width:560rpx ;
+            display: flex;
+            flex-wrap: wrap;
+            .image{
+                position: relative;
+                image{
+                    margin: 5rpx;
+                    width: 160rpx;
+                    height: 160rpx;
+                }
+                van-icon{
+                    position: absolute;
+                    right: 0rpx;
+                    background: rgba(255, 255, 255, 0.87);
+                    border-radius: 0 0 0 30rpx;
+                    padding: 8rpx;
+                    font-size: 25rpx;
+                }
+            }
+          
+        }
+    }
+}
+
+.submitbox {
+    margin-top: 20rpx;
+    width: 100%;
+    height: 110rpx;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    padding-bottom: 30rpx;
+
+    .submit {
+        background-color: #F89B7F;
+        color: white;
+        width: 50%;
+        height: 100%;
+        border-radius: 20rpx;
+        font-size: 30rpx;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+    }
+}
+.popup {
+    width: 100%;
+    height: 70vh;
+
+    .title {
+        font-size: 30rpx;
+        height: 90rpx;
+        line-height: 90rpx;
+        text-align: center;
+        border-bottom: 1rpx solid whitesmoke;
+    }
+
+    .itemBox {
+        overflow-y: auto;
+        height: calc(70vh - 250rpx);
+
+        .item {
+            padding: 20rpx;
+            font-size: 28rpx;
+            border-bottom: 1rpx solid whitesmoke;
+        }
+    }
+}

+ 97 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.wxml

@@ -0,0 +1,97 @@
+<nav type="back" background-color="#ffffff" frontColor="#000000" title="退款/售后" />
+<view class="title">确认界面</view>
+<view class="cardbox">
+  <view class="title2">确认退换信息</view>
+  <view class="roombox">
+    <image src="{{order.targetObject[0].image||'https://file-cloud.fmode.cn//tmp/mqHkA2qV3Q8nca3dc59bad49de6e5ae57afa81d78ae8.jpeg'}}"></image>
+    <view class="room">
+      <view class="room-name">{{order.targetObject[0].name}}</view>
+      <view class="room-text2">
+        <block wx:if="{{order.specMap[order.targetObject[0].objectId].spec}}">
+          {{order.specMap[order.targetObject[0].objectId].spec}}
+          <van-icon name="cross" />{{order.specMap[order.targetObject[0].objectId].count}}
+        </block>
+        <block wx:for="{{order.specMap[order.targetObject[0].objectId].list}}" wx:key="index">
+          {{item.spec}}
+          <van-icon name="cross" />{{item.count}}
+        </block>
+      </view>
+    </view>
+  </view>
+  <view class="text1">
+    <view class="tex1">退换方式</view>
+    <view class="tex3">{{order.way}}</view>
+  </view>
+  <view class="text1">
+    <view class="tex1">退货退款的原因</view>
+    <view class="tex3">{{order.cause}}</view>
+  </view>
+
+  <!-- <view class="text1">
+    <view class="tex1">描述和凭证</view>
+    <view class="tex3">{{order.text}}</view>
+  </view>
+  <view class="uploadbox">
+    <view class="box">
+      <block wx:for="{{order.refundImgs}}" wx:key="index">
+        <view class="image">
+          <image data-src="{{item}}" data-urls="{{order.refundImgs}}" bind:tap="previewImage" src="{{item}}" mode="" />
+        </view>
+      </block>
+    </view>
+  </view> -->
+  <view class="text1">
+    <view class="tex1">店铺地址</view>
+    <view class="tex3">
+      <view data-str="{{order.store.storeAddress}}" bind:tap="copyStr">
+        {{order.store.storeAddress||'暂未上传,请联系客服'}}
+        <van-icon name="orders-o" />
+      </view>
+      <view>收件人:<text data-str="{{order.store.user.realname}}" bind:tap="copyStr"> {{order.store.user.realname}} </text> <text data-str="{{order.store.user.mobile}}" bind:tap="copyStr"> {{order.store.user.mobile}} </text></view>
+    </view>
+  </view>
+  <block wx:if="{{order.way!='店内退换'}}">
+    <view class="text1" bind:tap="openExpress">
+      <view class="tex1">
+        快递公司
+        <view class="tex1-1">*</view>
+      </view>
+      <view class="tex3">
+        <view>{{checkExp.name}}
+          <van-icon name="arrow" custom-style='margin-left:10rpx' />
+        </view>
+      </view>
+    </view>
+    <view class="text1">
+      <view class="tex1">
+        快递单号
+        <view class="tex1-1">*</view>
+      </view>
+    </view>
+    <view class="areabox">
+      <textarea placeholder="请输入快递单号" auto-height model:value='{{expressNum}}'></textarea>
+    </view>
+  </block>
+
+
+
+</view>
+<view class="submitbox">
+  <view class="submit" bind:tap="submit">提交</view>
+</view>
+
+<!-- 指针查询 -->
+<van-popup show="{{ isShowExpress }}" position="bottom" bind:close="closeExpress" round>
+  <view class="popup">
+    <view class="title">选择快递公司</view>
+    <van-search bind:change="valChange" placeholder="请输入搜索关键词" />
+    <scroll-view class="itemBox" bindscrolltolower="getPointerItem" scroll-y>
+      <block wx:for="{{expComList}}" wx:for-item="pointer_item" wx:key="pointer_item">
+        <view class="item" data-index="{{index}}" bind:tap="checkPointer" style="color:{{checkExp.objectId==pointer_item.objectId?'#F89B7F':'black'}};">
+          {{pointer_item.name}}
+          <van-icon name="success" wx:if="{{checkExp.objectId==pointer_item.objectId}}" color="#F89B7F" />
+        </view>
+      </block>
+    </scroll-view>
+  </view>
+</van-popup>

+ 189 - 0
nova-tourism/pages/my/my-order/my-refund/refund-good/refund-express/index.wxss

@@ -0,0 +1,189 @@
+/* nova-tourism/pages/my/my-order/my-refund/refund-detail/index.wxss */
+page {
+  background: white;
+  font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", sans-serif;
+}
+.title {
+  width: 100%;
+  font-size: 36rpx;
+  background-color: white;
+  display: flex;
+  justify-content: center;
+  padding-bottom: 25rpx;
+  border-bottom: #F4F4F4 20rpx solid;
+}
+.cardbox {
+  width: 100%;
+  padding-left: 30rpx;
+  padding-right: 30rpx;
+  padding-top: 20rpx;
+  padding-bottom: 10rpx;
+  margin-top: 20rpx;
+  background-color: white;
+}
+.cardbox .title2 {
+  width: 100%;
+  font-size: 30rpx;
+  display: flex;
+  align-items: center;
+  margin-bottom: 30rpx;
+}
+.cardbox .roombox {
+  width: 100%;
+  display: flex;
+  margin-top: 20rpx ;
+  padding-bottom: 20rpx;
+  margin-bottom: 20rpx;
+  border-bottom: 1rpx solid #D9D9D9;
+}
+.cardbox .roombox image {
+  width: 150rpx;
+  height: 150rpx;
+}
+.cardbox .roombox .room {
+  margin-left: 20rpx;
+}
+.cardbox .roombox .room .room-name {
+  width: 460rpx;
+  font-size: 24rpx;
+  margin-bottom: 10rpx;
+  color: #000000;
+}
+.cardbox .roombox .room .room-tag {
+  font-size: 26rpx;
+  width: 460rpx;
+  color: #F37B40;
+  margin-bottom: 10rpx;
+}
+.cardbox .roombox .room .room-text {
+  width: 460rpx;
+  font-size: 26rpx;
+  color: #737373;
+}
+.cardbox .roombox .room .room-text2 {
+  width: 460rpx;
+  font-size: 20rpx;
+  margin-top: 100rpx;
+  color: #979797;
+}
+.cardbox .text1 {
+  padding: 5rpx 0;
+  width: 100%;
+  font-size: 24rpx;
+  display: flex;
+  color: #000000;
+  margin-bottom: 20rpx;
+}
+.cardbox .text1 .tex1 {
+  white-space: nowrap;
+  display: flex;
+  margin-right: 20rpx;
+}
+.cardbox .text1 .tex1 .tex1-1 {
+  color: #E22525;
+  margin-left: 4rpx;
+}
+.cardbox .text1 .tex2 {
+  margin-left: auto;
+  font-size: 24rpx;
+  color: #F05C14;
+}
+.cardbox .text1 .tex3 {
+  margin-left: auto;
+  font-size: 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.cardbox .areabox {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+}
+.cardbox .areabox textarea {
+  font-size: 24rpx;
+  background-color: #F4F4F4;
+  width: 100%;
+  padding: 15rpx;
+  border-radius: 5rpx;
+  min-height: 100rpx;
+}
+.cardbox .areabox .number {
+  color: gray;
+  position: absolute;
+  bottom: 5rpx;
+  right: 20rpx;
+  font-size: 26rpx;
+}
+.cardbox .uploadbox {
+  width: 100vw;
+  margin-top: 20rpx;
+  display: flex;
+  justify-content: space-between;
+}
+.cardbox .uploadbox .up {
+  width: 160rpx;
+}
+.cardbox .uploadbox .box {
+  width: 560rpx ;
+  display: flex;
+  flex-wrap: wrap;
+}
+.cardbox .uploadbox .box .image {
+  position: relative;
+}
+.cardbox .uploadbox .box .image image {
+  margin: 5rpx;
+  width: 160rpx;
+  height: 160rpx;
+}
+.cardbox .uploadbox .box .image van-icon {
+  position: absolute;
+  right: 0rpx;
+  background: rgba(255, 255, 255, 0.87);
+  border-radius: 0 0 0 30rpx;
+  padding: 8rpx;
+  font-size: 25rpx;
+}
+.submitbox {
+  margin-top: 20rpx;
+  width: 100%;
+  height: 110rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-bottom: 30rpx;
+}
+.submitbox .submit {
+  background-color: #F89B7F;
+  color: white;
+  width: 50%;
+  height: 100%;
+  border-radius: 20rpx;
+  font-size: 30rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.popup {
+  width: 100%;
+  height: 70vh;
+}
+.popup .title {
+  font-size: 30rpx;
+  height: 90rpx;
+  line-height: 90rpx;
+  text-align: center;
+  border-bottom: 1rpx solid whitesmoke;
+}
+.popup .itemBox {
+  overflow-y: auto;
+  height: calc(70vh - 250rpx);
+}
+.popup .itemBox .item {
+  padding: 20rpx;
+  font-size: 28rpx;
+  border-bottom: 1rpx solid whitesmoke;
+}

+ 2 - 2
nova-tourism/pages/my/my-order/order-detail-good/index.wxml

@@ -42,7 +42,7 @@
         </view>
       </view>
       <!-- <view class="text1" data-url="/common/pages/nova-express/index?num=YT8746219700214&com=yuantong" bind:tap="tourl"> -->
-      <view class="text1" bind:tap="toExpress">
+      <view wx:if="{{order.distributeType=='delivery'}}" class="text1" bind:tap="toExpress">
         <view class="tex1">发货时间</view>
         <view class="tex3">
           {{order.startTime||statusMap[order.status]}}
@@ -72,7 +72,7 @@
         </view>
       </view>
       <view class="btn">
-        <block wx:if="{{order.status=='400'||order.status=='700'||order.status=='800'}}">
+        <block wx:if="{{order.status=='400'||order.status=='800'}}">
           <view data-url="/nova-tourism/pages/my/my-order/my-refund/refund-good/index?oid={{order.objectId}}" bind:tap="tourl">退换</view>
         </block>
       </view>

+ 401 - 0
nova-tourism/pages/my/sharing/index.js

@@ -0,0 +1,401 @@
+// nova-tourism/pages/my/sharing/index.js
+let {
+  statusBarHeight,
+  screenHeight
+} = wx.getSystemInfoSync()
+let custom = wx.getMenuButtonBoundingClientRect()
+let customHeight = custom.height
+let Parse = getApp().Parse;
+let company = getApp().globalData.company
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    navHeight: 0, //导航高度_px
+
+    canv_sty: {
+      w: 0,
+      h: 0,
+    },
+    canv_bg: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/pj1b4v042627175.png',
+    canv_qr: '',
+    canv_avatar: 'https://file-cloud.fmode.cn/EbxZUK5lBI/20250411/frvr1u080411965.jpg?imageView2/1/w/200/h/200',
+    canv_name: '微信用户',
+    canv_uid: '',
+    canv_tag: '云仙客',
+    canvas: null, //画布-下载所需
+
+    noBind: false, //不绑定关系
+    qrCodeUrl: '', //二维码原文
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    let navHeight = statusBarHeight + customHeight + 10
+    let canv_sty = {
+      w: screenHeight * 0.38 - 2,
+      h: screenHeight * 0.60
+    }
+    this.setData({
+      navHeight,
+      canv_sty
+    })
+    console.log(options);
+    let {
+      path,
+      noBind,
+      route, //扫码携带路径
+      uid
+    } = options
+    this.setData({
+      path,
+      noBind,
+      route,
+      uid
+    });
+    let qrCodeUrl = `https://pwa.fmode.cn/gomini/${path}/?invite=${uid}`;
+    if (this.data.noBind) {
+      qrCodeUrl = `https://pwa.fmode.cn/gomini/${path}/`;
+    }
+    if (route) {
+      if (this.data.noBind) {
+        qrCodeUrl = qrCodeUrl + `?route=${route}`
+      } else {
+        qrCodeUrl = qrCodeUrl + `&route=${route}`
+      }
+    }
+    console.log(qrCodeUrl);
+    this.setData({
+      qrCodeUrl
+    })
+
+    this.refersh()
+  },
+
+  async refersh() {
+    let {
+      uid,
+      canv_avatar,
+      canv_name,
+      canv_uid,
+      canv_tag,
+    } = this.data
+    if (!uid) {
+      wx.showToast({
+        title: 'UID错误',
+        icon: 'error'
+      })
+      return
+    }
+    let query = new Parse.Query('_User')
+    let u = await query.get(uid)
+    canv_avatar = u?.get('avatar') || 'https://file-cloud.fmode.cn/EbxZUK5lBI/20250411/frvr1u080411965.jpg?imageView2/1/w/200/h/200'
+    canv_name = u?.get('nickname') || '微信用户'
+    canv_uid = uid
+    canv_tag = '云仙客'
+    if (u?.get('type') == 'shop-admin') {
+      let s_query = new Parse.Query('ShopStore')
+      s_query.equalTo('company', company);
+      s_query.equalTo('user', uid);
+      s_query.equalTo('isVerified', true);
+      s_query.notEqualTo('isDeleted', true);
+      let s = await s_query.first()
+      if (!s?.id) {
+        wx.showToast({
+          title: '暂无营业店铺',
+          icon: 'error'
+        })
+        return
+      }
+      canv_avatar = s?.get('cover') || 'https://file-cloud.fmode.cn/EbxZUK5lBI/20250411/frvr1u080411965.jpg?imageView2/1/w/200/h/200'
+      canv_name = u?.get('username') || '微信用户'
+      canv_tag = '民宿主'
+    }
+    this.setData({
+      canv_avatar,
+      canv_name,
+      canv_uid,
+      canv_tag,
+    })
+
+    this.getQr()
+  },
+
+  /**获取二维码 */
+  async getQr() {
+    let {
+      qrCodeUrl
+    } = this.data
+    let that = this;
+    wx.request({
+      url: "https://server.fmode.cn/api/common/qrcode",
+      data: {
+        qrCode: qrCodeUrl,
+        darkColor: "#000",
+        lightColor: "#fff"
+      },
+      async success(res) {
+        console.log(res)
+        if (res.data.code == 1) {
+          that.setData({
+            canv_qr: res?.data.data
+          })
+          that.draw()
+        } else {
+          wx.showToast({
+            title: '请先删除小程序重新授权后重试',
+            icon: 'none'
+          })
+        }
+      },
+    });
+  },
+  /**复制链接 */
+  onCopy() {
+    let {
+      uid
+    } = this.data
+    if (!uid) {
+      wx.showToast({
+        title: 'UID为空,请退出重试',
+        icon: 'none'
+      })
+      return
+    }
+    let url = 'https://server.fmode.cn/api/wxapp/wechat/urlLink'
+    let query = `invite=${uid}`
+    if (this.data.noBind) {
+      query = ``
+    }
+    wx.request({
+      url: url,
+      data: {
+        company: company,
+        path: 'index',
+        query: query,
+      },
+      header: {
+        'content-type': 'application/json'
+      },
+      method: 'POST',
+      dataType: 'json',
+      responseType: 'text',
+      success: (result) => {
+        console.log(result);
+        if (result?.data?.url_link) {
+          let path = result.data.url_link
+          wx.setClipboardData({
+            data: path,
+            success: function (res) {
+              wx.getClipboardData({
+                success: function (res) {
+                  wx.showToast({
+                    title: '复制成功',
+                  })
+                }
+              })
+            }
+          })
+          return
+        }
+        wx.showToast({
+          title: '复制错误',
+          icon: 'error',
+          image: '',
+          duration: 1500,
+          mask: false,
+        });
+      },
+      fail: () => {},
+      complete: () => {}
+    });
+  },
+
+  /**保存图片 */
+  saveCanvas() {
+    let {
+      canvas
+    } = this.data
+    let that = this
+    wx.canvasToTempFilePath({
+      canvas: canvas,
+      success(res) {
+        that.setData({
+          saveimage: res.tempFilePath
+        })
+        wx.saveImageToPhotosAlbum({
+          filePath: res.tempFilePath,
+          success: (res) => {
+            wx.showToast({
+              title: '已下载图片',
+              icon: 'none'
+            })
+          },
+          fail: (err) => {
+            // console.log('err',err)
+          }
+        })
+      },
+      fail: (err) => {
+        console.log(err)
+      }
+    })
+  },
+
+  /**绘制canvas */
+  draw() {
+    let {
+      canv_bg,
+      canv_qr,
+      canv_avatar,
+      canv_name,
+      canv_uid,
+      canv_tag,
+    } = this.data
+    let that = this
+    wx.createSelectorQuery()
+      .select('#myCanvas')
+      .fields({
+        node: true,
+        size: true
+      })
+      .exec((res) => {
+        const canvas = res[0].node
+        const ctx = canvas.getContext('2d')
+        const width = res[0].width
+        const height = res[0].height
+        // 初始化画布大小
+        const dpr = wx.getWindowInfo().pixelRatio
+        canvas.width = width * dpr
+        canvas.height = height * dpr
+        ctx.scale(dpr, dpr)
+        ctx.clearRect(0, 0, width, height)
+        //========背景=====
+        let bg = canvas.createImage()
+        bg.onload = () => {
+          ctx.drawImage(bg, 0, 0, width, height)
+          //========头像=========
+          let x = width * 0.06
+          let y = width * 0.06
+          let w = width * 0.25
+          let h = width * 0.25
+          let avatar = canvas.createImage();
+          avatar.onload = () => {
+            ctx.save();
+            let r = 10
+            ctx.beginPath()
+            ctx.moveTo(x + r, y)
+            ctx.arcTo(x + w, y, x + w, y + h, r)
+            ctx.arcTo(x + w, y + h, x, y + h, r)
+            ctx.arcTo(x, y + h, x, y, r)
+            ctx.arcTo(x, y, x + w, y, r)
+            ctx.closePath()
+            ctx.clip()
+            ctx.drawImage(avatar, x, y, w, h)
+            ctx.restore()
+            ctx.draw()
+          }
+          avatar.src = canv_avatar
+          //========文字========
+          // ctx.fillStyle = '#4F9AF7';
+          ctx.font = `${h*0.25}px bold Arial`;
+          ctx.fillText(canv_name, x + w + 8, y + (h * 0.36));
+          ctx.font = `${h*0.15}px Arial`;
+          ctx.fillText(`UID:${canv_uid}`, x + w + 8, y + (h * 0.63));
+          // 标签
+          let tag = canvas.createImage()
+          tag.onload = () => {
+            ctx.drawImage(tag, x + w + 8, y + (h * 0.7), h * 0.36+6, h * 0.21)
+            ctx.fillStyle = '#fff';
+            ctx.font = `${h*0.12}px bold Arial`;
+            ctx.fillText(canv_tag, x + w + 8+3, y + (h * 0.85));
+          }
+          tag.src = 'https://file-cloud.fmode.cn/EbxZUK5lBI/20250418/f1d8n1042110554.png'
+
+          //二维码
+          let qr = canvas.createImage()
+          qr.onload = () => {
+            ctx.drawImage(qr, width * 0.25, height * 0.5, width * 0.5, width * 0.5)
+          }
+          qr.src = canv_qr
+        }
+        bg.src = canv_bg
+        that.setData({
+          canvas
+        })
+      })
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+    let {
+      uid
+    } = this.data
+
+    let path = `index?invite=${uid}`
+    if (this.data.noBind) {
+      path = 'index'
+    }
+    if (this.data.route) {
+      if (this.data.noBind) {
+        qrCodeUrl = qrCodeUrl + `?route=${this.data.route}`
+      } else {
+        qrCodeUrl = qrCodeUrl + `&route=${this.data.route}`
+      }
+    }
+    return {
+      title: '邀请好友',
+      path: path,
+      imageUrl: '',
+    }
+  }
+})

+ 3 - 0
nova-tourism/pages/my/sharing/index.json

@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}

+ 71 - 0
nova-tourism/pages/my/sharing/index.less

@@ -0,0 +1,71 @@
+page {
+    height: 100vh;
+    background-image: url(https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/4bh2fu042627507.png);
+    background-repeat: no-repeat;
+    background-size: 100%;
+}
+
+.page {
+    width: 100vw;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    .box {
+        width: 90vw;
+        height: 70vh;
+        position: relative;
+
+        .btnBox {
+            position: absolute;
+            transform: translateX(-50%);
+            left: 50%;
+            bottom: 0;
+            width: 90vw;
+            height: 30vw;
+            background-image: url(https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/ejjshl042627409.png);
+            background-repeat: no-repeat;
+            background-size: 100% 100%;
+            display: flex;
+            align-items: flex-end;
+            justify-content: center;
+            padding: 0 50rpx;
+
+            .li {
+                display: flex;
+                flex-direction: column;
+                justify-content: center;
+                align-items: center;
+                margin: 20rpx 30rpx;
+                .btn {
+                    background: none;
+                    width: 80rpx;
+                    height: 80rpx;
+                    padding: 0;
+                    margin: 0;
+
+                    >image {
+                        width: 100%;
+                    }
+                }
+
+                .text {
+                    font-size: 25rpx;
+                    font-weight: bold;
+                }
+            }
+        }
+
+        .posters {
+            position: absolute;
+            transform: translateX(-50%);
+            left: 50%;
+            top: 0;
+            // background: rgba(0, 128, 0, 0.432);
+            // width: 38vh;
+            // height: 60vh;
+            // background-image: url(https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/pj1b4v042627175.png);
+            // background-size: auto 100%;
+        }
+    }
+}

+ 28 - 0
nova-tourism/pages/my/sharing/index.wxml

@@ -0,0 +1,28 @@
+<nav type="back" background-color="#ffffff" frontColor="#000000" title="分享推广" />
+<view class="page" style="height:calc( 100vh - {{navHeight}}px );">
+  <view class="box">
+    <view class="btnBox">
+      <view class="li">
+        <button class="btn" open-type="share">
+          <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/ff1ji8042627631.png?imageView2/1/w/200/h/200" mode="widthFix" />
+        </button>
+        <view class="text">微信</view>
+      </view>
+      <view class="li">
+        <button class="btn" bind:tap="onCopy">
+          <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/q1dei1042627731.png?imageView2/1/w/200/h/200" mode="widthFix" />
+        </button>
+        <view class="text">复制链接</view>
+      </view>
+      <view class="li">
+        <button class="btn" bind:tap="saveCanvas">
+          <image src="https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/dd15rf042626959.png?imageView2/1/w/200/h/200" mode="widthFix" />
+        </button>
+        <view class="text">保存图片</view>
+      </view>
+    </view>
+    <block wx:if="{{canv_sty.w&&canv_sty.h}}">
+      <canvas id="myCanvas" class="posters" style="width:{{canv_sty.w}}px; height: {{canv_sty.h}}px;" type="2d" />
+    </block>
+  </view>
+</view>

+ 59 - 0
nova-tourism/pages/my/sharing/index.wxss

@@ -0,0 +1,59 @@
+page {
+  height: 100vh;
+  background-image: url(https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/4bh2fu042627507.png);
+  background-repeat: no-repeat;
+  background-size: 100%;
+}
+.page {
+  width: 100vw;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.page .box {
+  width: 90vw;
+  height: 70vh;
+  position: relative;
+}
+.page .box .btnBox {
+  position: absolute;
+  transform: translateX(-50%);
+  left: 50%;
+  bottom: 0;
+  width: 90vw;
+  height: 30vw;
+  background-image: url(https://file-cloud.fmode.cn/EbxZUK5lBI/20250416/ejjshl042627409.png);
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  display: flex;
+  align-items: flex-end;
+  justify-content: center;
+  padding: 0 50rpx;
+}
+.page .box .btnBox .li {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  margin: 20rpx 30rpx;
+}
+.page .box .btnBox .li .btn {
+  background: none;
+  width: 80rpx;
+  height: 80rpx;
+  padding: 0;
+  margin: 0;
+}
+.page .box .btnBox .li .btn > image {
+  width: 100%;
+}
+.page .box .btnBox .li .text {
+  font-size: 25rpx;
+  font-weight: bold;
+}
+.page .box .posters {
+  position: absolute;
+  transform: translateX(-50%);
+  left: 50%;
+  top: 0;
+}

+ 6 - 6
project.private.config.json

@@ -8,16 +8,16 @@
     "miniprogram": {
       "list": [
         {
-          "name": "nova-tourism/pages/my/merchant/code-verify/index",
-          "pathName": "nova-tourism/pages/my/merchant/code-verify/index",
-          "query": "id=JiwYYEE69D",
+          "name": "nova-tourism/pages/homestay/homestay-detail/index",
+          "pathName": "nova-tourism/pages/homestay/homestay-detail/index",
+          "query": "store_id=6XHZx7FkON&start=2025-04-18&end=2025-04-19",
           "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",
+          "name": "nova-tourism/pages/my/sharing/index",
+          "pathName": "nova-tourism/pages/my/sharing/index",
+          "query": "path=yswx&uid=lfBs1y1d3y",
           "launchMode": "default",
           "scene": null
         }