Browse Source

修改bug3-16

Alex 9 months ago
parent
commit
b873e57c5d
100 changed files with 429 additions and 142 deletions
  1. 1 1
      .env.dev.js
  2. 1 1
      .env.prod.js
  3. 1 0
      App.vue
  4. 5 0
      components/pageScroll/index.vue
  5. 16 0
      pages-home/pages/book-order.vue
  6. 23 1
      pages-home/pages/order-success.vue
  7. 3 1
      pages-mine/components/book-list.vue
  8. 5 1
      pages-mine/components/order-return-actions.vue
  9. 1 1
      pages-mine/components/order-return-item.vue
  10. 142 99
      pages-mine/pages/complaint.vue
  11. 1 1
      pages-mine/pages/feedback.vue
  12. 12 3
      pages-mine/pages/order-detail.vue
  13. 1 1
      pages-mine/pages/partner/partner-home.vue
  14. 1 1
      pages-mine/pages/pay-success.vue
  15. 4 4
      pages-mine/pages/return-detail.vue
  16. 1 1
      pages-mine/pages/return-select.vue
  17. 24 5
      pages-mine/pages/rules-for-sellbooks.vue
  18. 1 1
      pages-mine/pages/setting.vue
  19. 10 3
      pages-mine/pages/wallet.vue
  20. 3 2
      pages-mine/pages/withdraw.vue
  21. 2 1
      pages/home/components/BookItem.vue
  22. 12 2
      pages/home/components/InputIsbn.vue
  23. 23 8
      pages/home/components/ServiceInfo.vue
  24. 136 4
      pages/home/index.vue
  25. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  26. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  27. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  28. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/common-dialog.js.map
  29. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/loadmore.js.map
  30. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/no-data.js.map
  31. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/pageScroll/index.js.map
  32. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/title-operate.js.map
  33. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookItem.js.map
  34. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookListItem.js.map
  35. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/OrderSuccessPopup.js.map
  36. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/PickupTimePicker.js.map
  37. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/SubmitConfirm.js.map
  38. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/about-us.js.map
  39. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/book-order.js.map
  40. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/order-success.js.map
  41. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/scaned-book.js.map
  42. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/user-agreement.js.map
  43. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/address-card.js.map
  44. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/book-list.js.map
  45. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/category-popup.js.map
  46. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/city-picker.js.map
  47. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/detail-book-item.js.map
  48. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-actions.js.map
  49. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-item.js.map
  50. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-return-actions.js.map
  51. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-return-item.js.map
  52. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-timeline.js.map
  53. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/partner-order-item.js.map
  54. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/return-notice.js.map
  55. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/select-book-item.js.map
  56. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/address/add-or-update.js.map
  57. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/address/list.js.map
  58. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/apply-return.js.map
  59. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/apply.js.map
  60. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/cashier-desk.js.map
  61. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/complaint.js.map
  62. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/feedback.js.map
  63. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/notice.js.map
  64. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/order-detail.js.map
  65. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/order-page.js.map
  66. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/income-detail.js.map
  67. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/order-detail.js.map
  68. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-apply.js.map
  69. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-home.js.map
  70. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-rule.js.map
  71. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-status.js.map
  72. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/pay-success.js.map
  73. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/return-detail.js.map
  74. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/return-select.js.map
  75. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/rules-for-sellbooks.js.map
  76. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/setting.js.map
  77. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/wallet.js.map
  78. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/withdraw-detail.js.map
  79. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/withdraw.js.map
  80. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/BookItem.js.map
  81. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ConfirmBooks.js.map
  82. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/FirstOrderFreePopup.js.map
  83. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/InputIsbn.js.map
  84. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/KindReminder.js.map
  85. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ScanBookList.js.map
  86. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ServiceGuarantee.js.map
  87. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ServiceInfo.js.map
  88. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/notScanned.js.map
  89. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/index.js.map
  90. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map
  91. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map
  92. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.js.map
  93. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.js.map
  94. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map
  95. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map
  96. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-action-sheet/u-action-sheet.js.map
  97. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-avatar/u-avatar.js.map
  98. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-badge/u-badge.js.map
  99. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-button/u-button.js.map
  100. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-cell-group/u-cell-group.js.map

+ 1 - 1
.env.dev.js

@@ -1,5 +1,5 @@
 export default {
     "NODE_ENV": 'development',
-    "apiUrl":"http://bk.shuhi.com",
+    "apiUrl":"https://bpi.shuhi.com",
     "apiUrlPrefix":"/api",
 };

+ 1 - 1
.env.prod.js

@@ -1,5 +1,5 @@
 export default {
     "NODE_ENV": 'production',
-    "apiUrl":"https://book.shuhi.com",
+    "apiUrl":"https://bpi.shuhi.com",
     "apiUrlPrefix":"/api",
 };

+ 1 - 0
App.vue

@@ -48,6 +48,7 @@ export default {
             (that.globalData.navBarHeight + that.globalData.menuTop + that.globalData.menuBotton);
 
         const inviteCode = options.inviteCode || "";
+        console.log(inviteCode, options, "inviteCode");
         this.slientLogin(inviteCode);
     },
     methods: {

+ 5 - 0
components/pageScroll/index.vue

@@ -7,6 +7,7 @@
         :refresher-triggered="isRefreshing"
         @refresherrefresh="onRefresh"
         @scrolltolower="onLoadMore"
+        :style="{ height: height }"
     >
         <!-- 空状态 -->
 
@@ -40,6 +41,10 @@ export default {
         };
     },
     props: {
+        height: {
+            type: String,
+            default: "calc(100vh - 88rpx)",
+        },
         bgColor: {
             type: String,
             default: "#F5F5F5",

+ 16 - 0
pages-home/pages/book-order.vue

@@ -83,6 +83,7 @@
                     共<text class="price">{{ totalBooks }}</text
                     >件 预估回收价
                     <text class="price">¥{{ totalPrice }}</text>
+                    <u-icon name="question-circle-fill" color="#333333" size="36" @click="showRules"></u-icon>
                 </view>
                 <u-button type="primary" @click="submitOrder" :custom-style="{ margin: 0 }">提交订单</u-button>
             </view>
@@ -151,6 +152,11 @@ export default {
         },
     },
     methods: {
+        showRules() {
+            uni.navigateTo({
+                url: '/pages-mine/pages/rules-for-sellbooks'
+            })
+        },
         //时间选择
         onTimeConfirm(data) {
             this.selectedTime = data;
@@ -275,6 +281,16 @@ export default {
             this.defaultAddr = selectAddr;
             this.submitData.addressId = selectAddr.id;
         }
+
+        //处理从/pages-home/pages/order-success页面返回的情况,在执行返回一级页面
+        let pages = getCurrentPages();
+        let currentPage = pages[pages.length - 1];
+        console.log(pages, currentPage, "currentPage");
+        if (currentPage.route == "pages-home/pages/order-success") {
+            uni.navigateBack({
+                delta: 1,
+            });
+        }
     },
 };
 </script>

+ 23 - 1
pages-home/pages/order-success.vue

@@ -1,5 +1,5 @@
 <template>
-    <view class="order-success">
+    <view class="order-success" @touchstart="touchStart" @touchend="touchEnd">
         <image class="success-icon" src="../static/success.png" mode="widthFix"></image>
         <text class="success-title">订单提交成功</text>
         <text class="success-message">您的订单已提交,书嗨稍后将安排快递上门取书!</text>
@@ -28,10 +28,31 @@
 <script>
 import OrderSuccessPopup from "../components/OrderSuccessPopup.vue";
 export default {
+    data() {
+        return {
+            startX: 0,
+        };
+    },
     components: {
         OrderSuccessPopup,
     },
+    onUnload() {
+        uni.navigateTo({
+            url: "/pages/home/index",
+        });
+    },
     methods: {
+        touchStart(e) {
+            this.startX = e.touches[0].clientX;
+        },
+        touchEnd(e) {
+            const endX = e.changedTouches[0].clientX;
+            if (this.startX - endX > 50) {
+                // 左滑距离超过50px
+                uni.navigateBack({ delta: 2 }); // 返回两级
+            }
+        },
+
         notifyStatusChange() {
             // 处理状态变更通知逻辑
             console.log("状态变更通知");
@@ -71,6 +92,7 @@ export default {
     align-items: center;
     background-color: #ffffff;
     padding: 34rpx 0 44rpx 0;
+    height: 100vh;
 
     .success-icon {
         width: 200rpx;

+ 3 - 1
pages-mine/components/book-list.vue

@@ -49,7 +49,9 @@ export default {
     },
     methods: {
         showRules() {
-            console.log('showRules');
+            uni.navigateTo({
+                url: '/pages-mine/pages/rules-for-sellbooks'
+            })
         },
         toggleExpand() {
             this.isExpanded = !this.isExpanded;

+ 5 - 1
pages-mine/components/order-return-actions.vue

@@ -30,6 +30,10 @@ export default {
         size: {
             type: String,
             default: 'normal'
+        },
+        isDetail: {
+            type: Boolean,
+            default: false
         }
     },
     methods: {
@@ -38,7 +42,7 @@ export default {
                 //先校验支付参数
                 if (this.order.orderId) {
                     uni.$u.http.post('/token/order/refundGoPay', {
-                        refundOrderId: this.order.orderId
+                        refundOrderId: this.isDetail ? this.order.refundOrderId : this.order.orderId
                     }).then(res => {
                         if (res.code == 200) {
                             //如果有微信订单,则跳转去微信支付

+ 1 - 1
pages-mine/components/order-return-item.vue

@@ -2,7 +2,7 @@
     <view class="order-return-item" @click="goToDetail">
         <!-- 订单头部 -->
         <view class="order-header">
-            <text class="common-text-2 font-30" v-if="!hasReturn">卖书编号:{{ order.orderId }}</text>
+            <text class="common-text-2 font-30" v-if="hasReturn">卖书编号:{{ order.orderId }}</text>
             <text class="common-text-2 font-30" v-else>退书编号:{{ order.orderId }}</text>
             <text class="order-status" style="color: #FF000C" v-if="showAction">{{ statusTextMap[order.status]
                 }}</text>

+ 142 - 99
pages-mine/pages/complaint.vue

@@ -1,8 +1,8 @@
 <template>
     <view class="complaint-page">
-        <template v-if="complaintInfo.complaintsStatus == 1">
+        <template v-if="showComplaintList">
             <!-- 处理状态展示 -->
-            <view class="status-block" v-if="complaintInfo.disposeLogList && complaintInfo.disposeLogList.length">
+            <view class="status-block" v-if="complaintInfo.disposeLogList[0].userType == 1">
                 <view class="status-title">书嗨处理</view>
                 <view class="time">--</view>
 
@@ -13,7 +13,7 @@
                     </view>
                     <view class="info-row">
                         <text class="label">平台回复:</text>
-                        <text class="value">{{ complaintInfo.description || '暂无' }}</text>
+                        <text class="value">{{ complaintInfo.description || "暂无" }}</text>
                     </view>
                 </view>
             </view>
@@ -24,7 +24,7 @@
                 <view class="complaint-item" v-for="(item, index) in complaintInfo.disposeLogList" :key="index">
                     <view class="complaint-header">
                         <view class="header-main">
-                            <text class="title">{{ item.userType == 1 ? '我的投诉' : '客服回复' }}</text>
+                            <text class="title">{{ item.userType == 1 ? "我的投诉" : "客服回复" }}</text>
                             <text class="time">{{ item.createTime }}</text>
                         </view>
                     </view>
@@ -44,14 +44,26 @@
                         <view class="info-row image-list" v-if="item.imgList && item.imgList.length">
                             <text class="label">上传凭证:</text>
                             <view class="images">
-                                <image v-for="(img, imgIndex) in item.imgList" :key="imgIndex" :src="img"
-                                    mode="aspectFill" @click="previewImage(item.imgList, imgIndex)">
+                                <image
+                                    v-for="(img, imgIndex) in item.imgList"
+                                    :key="imgIndex"
+                                    :src="img"
+                                    mode="aspectFill"
+                                    @click="previewImage(item.imgList, imgIndex)"
+                                >
                                 </image>
                             </view>
                         </view>
                     </view>
                 </view>
             </view>
+
+            <view
+                class="bottom-fixed-con"
+                v-if="complaintInfo.complaintsStatus == 2 && complaintInfo.disposeLogList[0].userType == 2"
+            >
+                <u-button type="primary" @click="continueComplaint">继续投诉</u-button>
+            </view>
         </template>
 
         <!-- 新投诉表单,仅在status为1时显示 -->
@@ -71,26 +83,47 @@
 
             <view class="form-block">
                 <!-- 联系方式 -->
-                <view class="form-item flex-a" style="padding:14rpx 0">
+                <view class="form-item flex-a" style="padding: 14rpx 0">
                     <view class="common-text-2 required">联系方式</view>
-                    <u-input class="flex-1" input-align="right" placeholder-style="color:#999;font-size:28rpx;"
-                        v-model="phone" placeholder="请输入联系方式" :border="false" type="number" maxlength="11"></u-input>
+                    <u-input
+                        class="flex-1"
+                        input-align="right"
+                        placeholder-style="color:#999;font-size:28rpx;"
+                        v-model="phone"
+                        placeholder="请输入联系方式"
+                        :border="false"
+                        type="number"
+                        maxlength="11"
+                    ></u-input>
                 </view>
             </view>
 
             <view class="common-text-2 required mb-20">投诉说明</view>
-            <view class="form-block" style="padding: 20rpx;">
+            <view class="form-block" style="padding: 20rpx">
                 <!-- 投诉说明 -->
-                <u-input v-model="description" type="textarea" placeholder="请描述投诉情况,有助于客服更快处理" :height="200"
-                    :border="false"></u-input>
+                <u-input
+                    v-model="description"
+                    type="textarea"
+                    placeholder="请描述投诉情况,有助于客服更快处理"
+                    :height="200"
+                    :border="false"
+                ></u-input>
             </view>
 
             <!-- 图片上传 -->
             <view class="common-text-2 required mb-20">上传凭证(最多3张)</view>
 
-            <u-upload class="upload-image" :fileList="fileList" @on-choose-complete="afterRead" @delete="deletePic"
-                :maxCount="3" :auto-upload="false" :previewFullImage="true" uploadText="点击上传"
-                @on-uploaded="onUploaded"></u-upload>
+            <u-upload
+                class="upload-image"
+                :fileList="fileList"
+                @on-choose-complete="afterRead"
+                @delete="deletePic"
+                :maxCount="3"
+                :auto-upload="false"
+                :previewFullImage="true"
+                uploadText="点击上传"
+                @on-uploaded="onUploaded"
+            ></u-upload>
 
             <!-- 底部按钮 -->
             <view class="bottom-fixed-con">
@@ -98,136 +131,147 @@
             </view>
 
             <!-- 投诉原因选择器 -->
-            <u-picker v-model="showPicker" mode="selector" :range="reasonList" @confirm="confirmReason"
-                @cancel="showPicker = false"></u-picker>
+            <u-picker
+                v-model="showPicker"
+                mode="selector"
+                :range="reasonList"
+                @confirm="confirmReason"
+                @cancel="showPicker = false"
+            ></u-picker>
         </template>
     </view>
 </template>
 
 <script>
-import ENV_CONFIG from '@/.env.js'
+import ENV_CONFIG from "@/.env.js";
 // api前缀
-const env = ENV_CONFIG[process.env.ENV_TYPE || 'dev'];
+const env = ENV_CONFIG[process.env.ENV_TYPE || "dev"];
 export default {
     data() {
         return {
-            complaintReason: '',
-            phone: '',
-            description: '',
+            showComplaintList: false,
+            complaintReason: "",
+            phone: "",
+            description: "",
             fileList: [],
             showPicker: false,
             reasonList: [],
-            orderId: '',
+            orderId: "",
             complaintInfo: {
                 status: 1,
-                platformReply: '',
-                disposeLogList: []
-            }
-        }
+                platformReply: "",
+                disposeLogList: [],
+            },
+        };
     },
     computed: {
         complaintStatusText() {
             const status = this.complaintInfo.complaintsStatus;
             const statusMap = {
-                "0": '未投诉过',
-                "1": '待处理',
-                "2": '处理中',
-                "3": '已完结'
+                0: "未投诉过",
+                1: "待处理",
+                2: "处理中",
+                3: "已完结",
             };
-            return statusMap[status] || '未知状态';
-        }
+            return statusMap[status] || "未知状态";
+        },
     },
     onLoad(ops) {
         if (ops.orderId) {
-            this.orderId = ops.orderId
-            this.getComplaintInfo()
+            this.orderId = ops.orderId;
+            this.getComplaintInfo();
         }
-        this.getComplaintsOptions()
+        this.getComplaintsOptions();
     },
     methods: {
+        continueComplaint() {
+            this.showComplaintList = false;
+        },
         // 获取投诉信息
         getComplaintInfo() {
-            uni.$u.http.get(`/token/order/getComplaintsInfo?orderId=${this.orderId}&type=1`)
-                .then(res => {
-                    if (res.code === 200) {
-                        this.complaintInfo = res.data
-                    }
-                })
+            uni.$u.http.get(`/token/order/getComplaintsInfo?orderId=${this.orderId}&type=1`).then((res) => {
+                if (res.code === 200) {
+                    this.complaintInfo = res.data;
+                    this.showComplaintList = res.data.complaintsStatus != 0;
+                }
+            });
         },
         //根据code获取字典 /token/common/getDictOptions
         getDict(code) {
-            return uni.$u.http.get('/token/common/getDictOptions?type=' + code)
+            return uni.$u.http.get("/token/common/getDictOptions?type=" + code);
         },
         //获取投诉选项 complaints_options
         getComplaintsOptions() {
-            this.getDict('complaints_options').then(res => {
+            this.getDict("complaints_options").then((res) => {
                 if (res.code === 200) {
-                    this.reasonList = res.data.map(item => item.dictLabel)
+                    this.reasonList = res.data.map((item) => item.dictLabel);
                 }
-            })
+            });
         },
 
         showReasonPicker() {
-            this.showPicker = true
+            this.showPicker = true;
         },
         confirmReason(e) {
-            this.complaintReason = this.reasonList[e[0]]
-            this.showPicker = false
+            this.complaintReason = this.reasonList[e[0]];
+            this.showPicker = false;
         },
         onUploaded(lists, name) {
-            console.log(lists, name, 'xx111x')
+            console.log(lists, name, "xx111x");
         },
         afterRead(lists) {
             // 先检查token是否存在
-            const token = uni.getStorageSync('token');
+            const token = uni.getStorageSync("token");
 
-            const uploadTasks = lists.map(item => {
+            const uploadTasks = lists.map((item) => {
                 return new Promise((resolve, reject) => {
-                    console.log(item, env.apiUrl + `/api/token/order/complaintUpload/${this.orderId}`, 'xx111x')
+                    console.log(item, env.apiUrl + `/api/token/order/complaintUpload/${this.orderId}`, "xx111x");
                     uni.uploadFile({
                         url: env.apiUrl + `/api/token/order/complaintUpload/${this.orderId}`,
                         filePath: item.url,
-                        name: 'file',
+                        name: "file",
                         header: {
-                            Authorization: 'Bearer ' + token
+                            Authorization: "Bearer " + token,
                         },
                         success: (res) => {
                             const result = JSON.parse(res.data);
                             if (result.code === 200 && result.data) {
                                 resolve(result.data);
                             } else {
-                                uni.$u.toast(result.msg || '上传失败');
-                                reject(new Error(result.msg || '上传失败'));
+                                uni.$u.toast(result.msg || "上传失败");
+                                reject(new Error(result.msg || "上传失败"));
                             }
                         },
                         fail: (err) => {
-                            uni.$u.toast('上传失败');
+                            uni.$u.toast("上传失败");
                             reject(err);
-                        }
+                        },
                     });
                 });
             });
 
-            Promise.all(uploadTasks).then(results => {
-                this.uploadSuccessList = results.flat();
-                this.fileList = lists;
-                console.log(this.fileList, 'xx111x', results)
-            }).catch(err => {
-                console.error('Upload failed:', err);
-            });
+            Promise.all(uploadTasks)
+                .then((results) => {
+                    this.uploadSuccessList = results.flat();
+                    this.fileList = lists;
+                    console.log(this.fileList, "xx111x", results);
+                })
+                .catch((err) => {
+                    console.error("Upload failed:", err);
+                });
         },
         deletePic(event) {
-            this.fileList.splice(event.index, 1)
+            this.fileList.splice(event.index, 1);
         },
         submitComplaint() {
             if (!this.complaintReason) {
-                return uni.$u.toast('请选择投诉原因')
+                return uni.$u.toast("请选择投诉原因");
             }
             if (!this.phone) {
-                return uni.$u.toast('请输入联系方式')
+                return uni.$u.toast("请输入联系方式");
             }
             if (!this.description) {
-                return uni.$u.toast('请输入投诉说明')
+                return uni.$u.toast("请输入投诉说明");
             }
 
             // 准备投诉数据
@@ -236,45 +280,44 @@ export default {
                 reason: this.complaintReason,
                 description: this.description,
                 contactNumber: this.phone,
-                fileUrls: this.uploadSuccessList
-            }
+                fileUrls: this.uploadSuccessList,
+            };
 
             // 提交投诉
-            uni.$u.http.post('/token/order/addComplaints', complaintData)
-                .then(res => {
-                    if (res.code === 200) {
-                        uni.$u.toast('投诉上报已上报给管理员')
-                        // 返回订单页
-                        setTimeout(() => {
-                            uni.navigateBack({
-                                delta: 1
-                            })
-                        }, 1500)
-                    } else {
-                        uni.$u.toast(res.msg || '提交失败')
-                    }
-                })
+            uni.$u.http.post("/token/order/addComplaints", complaintData).then((res) => {
+                if (res.code === 200) {
+                    uni.$u.toast("投诉上报已上报给管理员");
+                    // 返回订单页
+                    setTimeout(() => {
+                        uni.navigateBack({
+                            delta: 1,
+                        });
+                    }, 1500);
+                } else {
+                    uni.$u.toast(res.msg || "提交失败");
+                }
+            });
         },
         // 图片预览
         previewImage(urls, current) {
             uni.previewImage({
                 urls: urls,
-                current: current
+                current: current,
             });
-        }
-    }
-}
+        },
+    },
+};
 </script>
 
 <style lang="scss">
 .complaint-page {
     min-height: 100vh;
-    background: #F8F8F8;
+    background: #f8f8f8;
     padding: 20rpx;
     padding-bottom: 120rpx;
 
     .status-block {
-        background: #FFFFFF;
+        background: #ffffff;
         border-radius: 12rpx;
         padding: 30rpx;
         margin-bottom: 20rpx;
@@ -287,7 +330,7 @@ export default {
 
         .divider {
             height: 2rpx;
-            background: #EEEEEE;
+            background: #eeeeee;
             margin: 20rpx 0;
         }
 
@@ -308,7 +351,7 @@ export default {
                 }
 
                 .status-text {
-                    color: #FF5B5B;
+                    color: #ff5b5b;
                 }
             }
         }
@@ -316,7 +359,7 @@ export default {
 
     .complaint-records {
         .complaint-item {
-            background: #FFFFFF;
+            background: #ffffff;
             border-radius: 12rpx;
             padding: 30rpx;
             margin-bottom: 20rpx;
@@ -385,15 +428,15 @@ export default {
     }
 
     .form-block {
-        background: #FFFFFF;
+        background: #ffffff;
         border-radius: 12rpx;
         padding: 0 30rpx;
         margin-bottom: 20rpx;
     }
 
     .required::before {
-        content: '*';
-        color: #FF5B5B;
+        content: "*";
+        color: #ff5b5b;
         margin-right: 4rpx;
     }
 
@@ -419,4 +462,4 @@ export default {
         background: #ffffff !important;
     }
 }
-</style>
+</style>

+ 1 - 1
pages-mine/pages/feedback.vue

@@ -3,7 +3,7 @@
         <!-- 顶部banner -->
         <view class="banner">
             <image src="https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/feedback.png" mode="aspectFill" class="banner-img"></image>
-            <text class="history-btn" @click="goToHistory">我的历史反馈</text>
+            <!-- <text class="history-btn" @click="goToHistory">我的历史反馈</text> -->
         </view>
 
         <!-- 反馈类型区域 -->

+ 12 - 3
pages-mine/pages/order-detail.vue

@@ -24,7 +24,7 @@
                 <view class="flex-a flex-j-b">
                     <view class="common-text-2 font-26">
                         预估书款:
-                        <u-icon name="question-circle-fill" color="#333333" size="36"></u-icon>
+                        <u-icon name="question-circle-fill" color="#333333" size="36" @click="showRules"></u-icon>
                     </view>
                     <text class="common-text-2 font-26">¥{{ orderInfo.expectMoney }}</text>
                 </view>
@@ -66,7 +66,7 @@
 
         <!-- 底部操作栏 -->
         <view class="bottom-fixed-con detail-bottom flex-d">
-            <service-info></service-info>
+            <service-info :firstOrder="orderInfo.firstOrder"></service-info>
             <view class="flex-a" style="width: 100%;padding: 0 30rpx;">
                 <order-actions size="large" :order="orderInfo" :status="orderInfo.status" @action="handleAction"
                     style="width: 100%;" @success="getOrderInfo"></order-actions>
@@ -132,15 +132,24 @@ export default {
     methods: {
         copyOrderNo() {
             uni.setClipboardData({
-                data: this.orderInfo.orderId,
+                data: this.orderInfo.orderId.toString(),
                 success: () => {
                     uni.$u.toast('复制成功')
+                },
+                fail: (error) => {
+                    console.log(error, "error");
+                    uni.$u.toast('复制失败')
                 }
             })
         },
         successFeedback() {
             this.getOrderInfo()
         },
+        showRules() {
+            uni.navigateTo({
+                url: '/pages-mine/pages/rules-for-sellbooks'
+            })
+        },
 
         //获取订单信息
         getOrderInfo() {

+ 1 - 1
pages-mine/pages/partner/partner-home.vue

@@ -185,7 +185,7 @@ export default {
                                 ctx.setFillStyle("#333333");
 
                                 let nickName = userInfo.nickName || "书嗨";
-                                let canvasStr = `${nickName}邀请你加入书嗨合伙人`;
+                                let canvasStr = `${nickName}邀请你加入`;
 
                                 let firstLine = canvasStr.slice(0, 16);
                                 let secondLine = canvasStr.slice(16);

+ 1 - 1
pages-mine/pages/pay-success.vue

@@ -4,7 +4,7 @@
             <image src="../static/pay-success.png" mode="aspectFit"></image>
         </view>
         <view class="success-title">支付成功</view>
-        <view class="success-desc">您发书籍将邮寄,请坐等快递</view>
+        <view class="success-desc">您的书籍将邮寄,请耐心等待</view>
         <view class="action-buttons">
             <button class="btn-return" @click="handleReturn">返回首页</button>
             <button class="btn-view" @click="handleViewOrder">查看订单</button>

+ 4 - 4
pages-mine/pages/return-detail.vue

@@ -57,10 +57,10 @@
 
         <!-- 底部操作栏 -->
         <view class="bottom-fixed-con detail-bottom flex-d">
-            <service-info></service-info>
+            <service-info :firstOrder="orderInfo.firstOrder"></service-info>
             <view class="flex-a" style="width: 100%;padding: 0 30rpx;">
                 <order-return-actions :order="orderInfo" :status="orderInfo.status" @action="handleAction"
-                    style="width: 100%;" size="large"></order-return-actions>
+                    style="width: 100%;" size="large" isDetail></order-return-actions>
             </view>
         </view>
 
@@ -107,7 +107,7 @@ export default {
     methods: {
         copyOrderNo() {
             uni.setClipboardData({
-                data: this.orderInfo.orderId,
+                data: this.orderInfo.orderId.toString(),
                 success: () => {
                     uni.$u.toast('复制成功')
                 }
@@ -116,7 +116,7 @@ export default {
         //复制退回编号
         copyRefundNo() {
             uni.setClipboardData({
-                data: this.orderInfo.refundOrderId,
+                data: this.orderInfo.refundOrderId.toString(),
                 success: () => {
                     uni.$u.toast('复制成功')
                 }

+ 1 - 1
pages-mine/pages/return-select.vue

@@ -94,7 +94,7 @@ export default {
     methods: {
         copyOrderNo() {
             uni.setClipboardData({
-                data: this.orderInfo.orderId,
+                data: this.orderInfo.orderId.toString(),
                 success: () => {
                     uni.$u.toast('复制成功')
                 }

+ 24 - 5
pages-mine/pages/rules-for-sellbooks.vue

@@ -9,7 +9,8 @@
                     :title="item.subTitle"
                     :index="index"
                     :arrow="true"
-                    name="标题"
+                    :name="index"
+                    :class="{ 'active-item': selectedIndex == index }"
                 >
                     <template #title>
                         <view class="custom-title">
@@ -18,7 +19,8 @@
                         </view>
                     </template>
                     <view class="collapse-content">
-                        <rich-text :nodes="item.subContent" class="rich-text-style"></rich-text>
+                        <u-parse :html="item.subContent" class="rich-text-style"></u-parse>
+                        <!-- <rich-text :nodes="item.subContent" class="rich-text-style"></rich-text> -->
                     </view>
                 </u-collapse-item>
             </u-collapse>
@@ -49,6 +51,7 @@ export default {
             pageTitle: "卖书规则",
             faqList: [], // FAQ列表数据
             loading: false,
+            selectedIndex: -1,
         };
     },
     onLoad() {
@@ -87,6 +90,7 @@ export default {
         // 折叠面板变化事件
         changeHandler(index) {
             console.log("当前打开的是第" + index + "个");
+            this.selectedIndex = index;
         },
     },
 };
@@ -187,19 +191,34 @@ export default {
     color: #444444;
     font-size: 28rpx;
     padding: 10rpx 0;
+    height: auto;
+    overflow: visible;
 }
-.rich-text-style img {
+.rich-text-style {
     width: 100%;
-    height: 100%;
+}
+.rich-text-style img {
+    max-width: 100%;
+    height: auto !important;
     border-radius: 10rpx;
     margin-top: 10rpx;
+    display: block;
 }
 
 /deep/ .u-collapse-item {
     margin-bottom: 20rpx;
     border-radius: 10rpx;
-    overflow: hidden;
+    overflow: visible;
     background-color: #ffffff;
     padding: 0 30rpx;
 }
+
+/deep/ .active-item .u-collapse-body {
+    height: fit-content !important;
+}
+
+/* 添加rich-text内容样式 */
+/deep/ .rich-text-style {
+    width: 100%;
+}
 </style>

+ 1 - 1
pages-mine/pages/setting.vue

@@ -84,7 +84,7 @@ export default {
         // 复制用户ID
         copyUserId() {
             uni.setClipboardData({
-                data: this.userInfo.userId + '',
+                data: this.userInfo.userId.toString(),
                 success: () => {
                     uni.$u.toast('复制成功')
                 },

+ 10 - 3
pages-mine/pages/wallet.vue

@@ -36,7 +36,7 @@
             </view>
 
             <page-scroll @updateList="handleUpdateList" ref="pageRef" slotEmpty url="/token/user/accountChangeList"
-                :immediate="false" bgColor="#ffffff">
+                :immediate="false" bgColor="#ffffff" :height="height">
                 <view class="detail-list">
                     <view class="detail-item" v-for="(item, index) in detailList" :key="index"
                         @click="goToDetail(item)">
@@ -77,7 +77,8 @@ export default {
             detailList: [],
             otherParams: {
                 queryTypes: ''
-            }
+            },
+            height: 'calc(100vh - 540rpx)'
         }
     },
     onLoad() {
@@ -172,16 +173,20 @@ export default {
 
 <style lang="scss" scoped>
 .wallet-page {
-    min-height: 100vh;
+    height: 100vh;
     background: #F5F5F5;
     padding: 10rpx 30rpx;
     box-sizing: border-box;
+    overflow: hidden;
 
     .balance-card {
         background: #38C148;
         border-radius: 20rpx;
         padding: 30rpx 40rpx;
         color: #FFFFFF;
+        z-index: 9;
+        position: sticky;
+        top: 10rpx;
 
         .card-header {
             display: flex;
@@ -232,6 +237,8 @@ export default {
         border-radius: 20rpx;
         margin-top: 20rpx;
         padding: 0 30rpx;
+        height: calc(100vh - 400rpx);
+        overflow-y: auto;
 
         .section-header {
             display: flex;

+ 3 - 2
pages-mine/pages/withdraw.vue

@@ -15,9 +15,9 @@
             <view class="label">提现金额</view>
             <view class="input-box flex-a">
                 <text class="currency">¥</text>
-                <u-input class="flex-1" v-model="withdrawAmount" type="number" :border="false" placeholder="请输入提现金额"
+                <u-input class="flex-1" v-model="withdrawAmount" type="digit" :border="false" placeholder="请输入提现金额"
                     @input="onAmountInput" placeholder-style="font-size:50rpx;color:#c1c1c1;font-weight:400"
-                    :custom-style="{ fontSize: '50rpx' }"></u-input>
+                    :custom-style="{ fontSize: '50rpx' }" :max="userInfo.restMoney"></u-input>
                 <text class="all-btn" @click="withdrawAll">全部提现</text>
             </view>
 
@@ -95,6 +95,7 @@ export default {
             uni.$u.http.post('/token/user/withdrawApply', {
                 money: this.withdrawAmount
             }).then(res => {
+                console.log(res, "res");
                 if (res.code === 200) {
                     uni.showToast({ title: '提现申请成功', icon: 'success' })
                     setTimeout(() => {

+ 2 - 1
pages/home/components/BookItem.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="book-item">
 		<view class="book-info">
-			<u-image width="140rpx" height="196rpx" :src="book.cover" mode="aspectFill" />
+			<u-image width="160rpx" height="160rpx" :src="book.cover" mode="aspectFill" />
 			<view class="book-detail">
 				<view class="top-info">
 					<view class="book-title">{{ book.bookName }}</view>
@@ -92,6 +92,7 @@
 
 		.book-info {
 			display: flex;
+            align-items: center;
 			position: relative;
 
 			.book-cover {

+ 12 - 2
pages/home/components/InputIsbn.vue

@@ -2,11 +2,11 @@
 	<u-popup v-model="showPopup" @close="closePopup" @open="openPopup" mode="center" border-radius="20" width="85%">
 		<view class="popup-content">
 			<view class="popup-title">请输入图书ISBN编码</view>
-			<view class="desc-text">请输入不含“-”符号的13位或10位ISBN编码</view>
+			<view class="desc-text">请输入以"9787"开头的13位或10位ISBN编码(不含"-"符号)</view>
 			<image src="https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/barcode.png" alt="ISBN Barcode"
 				style="height:200rpx;margin-bottom: 20rpx" mode="heightFix" />
 			<u-input v-model="isbn" placeholder="在此输入ISBN编码" class="popup-input" input-align="center"
-				:custom-style="{'border-radius': '10rpx',height:'80rpx'}" border />
+				:custom-style="{'border-radius': '10rpx',height:'80rpx'}" type="number" border maxlength="13" />
 			<view class="buttons">
 				<button @click="cancel">取消</button>
 				<button @click="submit">提交</button>
@@ -43,6 +43,16 @@
 					});
 					return;
 				}
+				
+				// Validate ISBN format
+				if (!/^9787\d{9}$|^9787\d{6}$/.test(this.isbn)) {
+					uni.showToast({
+						title: '请输入以9787开头的13位或10位ISBN编码',
+						icon: 'none'
+					});
+					return;
+				}
+				
 				// Handle ISBN submission
 				this.$emit('submit', this.isbn)
 				this.closePopup();

+ 23 - 8
pages/home/components/ServiceInfo.vue

@@ -1,13 +1,24 @@
 <template>
     <view class="service-info">
-        <view class="service-icons">
-            <view class="icon-item" v-for="(item, index) in serviceItems" :key="index" @tap="showServiceGuarantee">
-                <image
-                    :src="`/static/img/${index + 1}.png`"
-                    mode="widthFix"
-                    style="width: 30rpx; height: 30rpx"
-                ></image>
-                <text style="margin-left: 6rpx">{{ item.text }}</text>
+        <view class="service-icons" @tap="showServiceGuarantee">
+            <view class="icon-item" v-if="firstOrder == 1">
+                <image src="/static/img/1.png" mode="widthFix" style="width: 30rpx; height: 30rpx"></image>
+                <text style="margin-left: 6rpx">免费退回</text>
+                <text style="margin-left: 4rpx"> > </text>
+            </view>
+            <view class="icon-item">
+                <image src="/static/img/2.png" mode="widthFix" style="width: 30rpx; height: 30rpx"></image>
+                <text style="margin-left: 6rpx">24小时验</text>
+                <text style="margin-left: 4rpx"> > </text>
+            </view>
+            <view class="icon-item">
+                <image src="/static/img/3.png" mode="widthFix" style="width: 30rpx; height: 30rpx"></image>
+                <text style="margin-left: 6rpx">极速打款</text>
+                <text style="margin-left: 4rpx"> > </text>
+            </view>
+            <view class="icon-item">
+                <image src="/static/img/4.png" mode="widthFix" style="width: 30rpx; height: 30rpx"></image>
+                <text style="margin-left: 6rpx">卖亏必赔</text>
                 <text style="margin-left: 4rpx"> > </text>
             </view>
         </view>
@@ -29,6 +40,10 @@ export default {
             type: Array,
             default: () => [],
         },
+        firstOrder: {
+            type: [Number, String],
+            default: 0,
+        },
     },
     data() {
         return {

+ 136 - 4
pages/home/index.vue

@@ -37,7 +37,7 @@
                 <button class="scan-btn next-btn" @click="onNext" :disabled="isDisabled">下一步</button>
             </view>
 
-            <service-info v-if="bookList.length" :serviceList="serviceList"></service-info>
+            <service-info v-if="bookList.length" :serviceList="serviceList" :firstOrder="orderInfo.firstOrder"></service-info>
         </view>
 
         <InputIsbn ref="isbnPopup" @submit="checkBookISBN" />
@@ -76,7 +76,13 @@
         <!-- 温馨提示弹窗 -->
         <KindReminder ref="kindReminder" @start="handleStartSelling" @viewRules="handleViewRules" />
 
-        <view class="customer-service">
+        <view 
+            class="customer-service" 
+            :style="{ left: servicePosition.left + 'px', right: servicePosition.right + 'px', bottom: servicePosition.bottom + 'px' }"
+            @touchstart="touchStart"
+            @touchmove="touchMove"
+            @touchend="touchEnd"
+        >
             <button class="service-btn" open-type="contact">
                 <image src="/static/img/kf.png" mode="widthFix" style="width: 126rpx; height: 140rpx"></image>
             </button>
@@ -119,6 +125,23 @@ export default {
             bookList: [],
             serviceList: [],
             currentBook: {},
+            // 客服按钮位置
+            servicePosition: {
+                left: 'auto',
+                right: 0,
+                bottom: '20%'
+            },
+            // 触摸开始位置
+            startX: 0,
+            startY: 0,
+            // 屏幕宽度和高度
+            screenWidth: 0,
+            screenHeight: 0,
+            // 初始位置记录,用于计算拖动
+            initialLeft: 0,
+            initialBottom: 0,
+            // 是否正在更新位置,用于防止频繁更新
+            isUpdatingPosition: false,
         };
     },
     computed: {
@@ -151,7 +174,117 @@ export default {
             this.scrollTop = e.scrollTop;
         });
     },
+    onReady() {
+        // 获取屏幕宽度和高度
+        uni.getSystemInfo({
+            success: (res) => {
+                this.screenWidth = res.windowWidth;
+                this.screenHeight = res.windowHeight;
+            }
+        });
+    },
     methods: {
+        // 触摸开始
+        touchStart(e) {
+            const touch = e.touches[0];
+            this.startX = touch.clientX;
+            this.startY = touch.clientY;
+            
+            // 记录初始位置,用于计算移动距离
+            if (this.servicePosition.right !== 'auto') {
+                // 如果是靠右定位,记录当前位置但不立即改变显示位置
+                // 只在内部计算中使用,避免视觉上的位置跳动
+                this.initialLeft = this.screenWidth - 126;
+            } else {
+                this.initialLeft = parseFloat(this.servicePosition.left);
+            }
+            
+            // 如果bottom是百分比,转换为具体像素值,但不改变显示位置
+            if (typeof this.servicePosition.bottom === 'string' && this.servicePosition.bottom.includes('%')) {
+                const percentage = parseFloat(this.servicePosition.bottom) / 100;
+                this.initialBottom = this.screenHeight * percentage;
+            } else {
+                this.initialBottom = parseFloat(this.servicePosition.bottom);
+            }
+        },
+        
+        // 触摸移动
+        touchMove(e) {
+            // 阻止默认行为,防止页面滚动
+            e.preventDefault && e.preventDefault();
+            e.stopPropagation && e.stopPropagation();
+            
+            const touch = e.touches[0];
+            
+            // 计算移动距离
+            const deltaX = touch.clientX - this.startX;
+            const deltaY = touch.clientY - this.startY;
+            
+            // 使用初始位置计算新位置,避免累积误差
+            let newLeft = this.initialLeft + deltaX;
+            let newBottom = this.initialBottom - deltaY; // 注意:y轴方向是相反的
+            
+            // 确保按钮不超出屏幕边界
+            if (newLeft < 0) {
+                newLeft = 0;
+            } else if (newLeft > this.screenWidth - 126) {
+                newLeft = this.screenWidth - 126;
+            }
+            
+            // 确保按钮不超出屏幕垂直边界
+            if (newBottom < 20) {
+                newBottom = 20;
+            } else if (newBottom > this.screenHeight - 160) {
+                newBottom = this.screenHeight - 160;
+            }
+            
+            // 使用节流方式更新位置,避免过于频繁的更新
+            if (!this.isUpdatingPosition) {
+                this.isUpdatingPosition = true;
+                
+                // 更新位置 - 第一次移动时才真正改变right为auto
+                this.servicePosition = {
+                    left: newLeft,
+                    right: 'auto',
+                    bottom: newBottom
+                };
+                
+                // 使用setTimeout代替requestAnimationFrame,在微信小程序中更兼容
+                setTimeout(() => {
+                    this.isUpdatingPosition = false;
+                }, 16); // 约等于60fps的刷新率
+            }
+            
+            // 不更新起始点,保持相对于初始触摸点的位移计算
+            // 这样可以避免累积误差,使拖动更精确
+        },
+        
+        // 触摸结束,实现吸附效果
+        touchEnd() {
+            // 确保不再有待处理的更新
+            this.isUpdatingPosition = false;
+            
+            const buttonCenter = this.servicePosition.left + 63; // 按钮中心位置
+            const halfScreen = this.screenWidth / 2;
+            
+            // 判断是吸附到左边还是右边
+            if (buttonCenter < halfScreen) {
+                // 吸附到左边
+                this.servicePosition = {
+                    left: 0,
+                    right: 'auto',
+                    bottom: this.servicePosition.bottom
+                };
+            } else {
+                // 吸附到右边
+                this.servicePosition = {
+                    left: 'auto',
+                    right: 0,
+                    bottom: this.servicePosition.bottom
+                };
+            }
+        },
+        
         handleStart() {
             this.showPopup = true;
         },
@@ -307,9 +440,8 @@ export default {
     width: 126rpx;
     height: 140rpx;
     bottom: 20%;
-    right: 0;
-    z-index: 9;
     z-index: 999;
+    transition: all 0.3s ease; /* 添加过渡效果使吸附更平滑 */
     button {
         height: max-content;
         background-color: transparent;

File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/common-dialog.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/loadmore.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/no-data.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/pageScroll/index.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/title-operate.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookItem.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookListItem.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/OrderSuccessPopup.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/PickupTimePicker.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/SubmitConfirm.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/about-us.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/book-order.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/order-success.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/scaned-book.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/user-agreement.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/address-card.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/book-list.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/category-popup.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/city-picker.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/detail-book-item.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-actions.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-item.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-return-actions.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-return-item.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/order-timeline.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/partner-order-item.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/return-notice.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/select-book-item.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/address/add-or-update.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/address/list.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/apply-return.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/apply.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/cashier-desk.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/complaint.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/feedback.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/notice.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/order-detail.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/order-page.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/income-detail.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/order-detail.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-apply.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-home.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-rule.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/partner/partner-status.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/pay-success.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/return-detail.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/return-select.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/rules-for-sellbooks.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/setting.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/wallet.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/withdraw-detail.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/pages/withdraw.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/BookItem.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ConfirmBooks.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/FirstOrderFreePopup.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/InputIsbn.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/KindReminder.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ScanBookList.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ServiceGuarantee.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/ServiceInfo.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/components/notScanned.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/home/index.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-action-sheet/u-action-sheet.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-avatar/u-avatar.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-badge/u-badge.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-button/u-button.js.map


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uview-ui/components/u-cell-group/u-cell-group.js.map


Some files were not shown because too many files changed in this diff