Alex hace 11 meses
padre
commit
9e5b204f0a
Se han modificado 100 ficheros con 1479 adiciones y 824 borrados
  1. 0 1
      api/modules/other.js
  2. 64 56
      components/pageScroll/index.vue
  3. 66 47
      pages-home/components/SubmitConfirm.vue
  4. 111 92
      pages-home/pages/book-order.vue
  5. 72 0
      pages-home/pages/user-agreement.vue
  6. 164 162
      pages-mine/components/address-card.vue
  7. 4 3
      pages-mine/components/order-actions.vue
  8. 118 105
      pages-mine/mixin/btnAction.js
  9. 1 1
      pages-mine/pages/address/add-or-update.vue
  10. 120 155
      pages-mine/pages/notice.vue
  11. 7 3
      pages-mine/pages/order-detail.vue
  12. 4 5
      pages-mine/pages/partner/partner-apply.vue
  13. 39 21
      pages-mine/pages/partner/partner-home.vue
  14. 3 3
      pages-mine/pages/return-detail.vue
  15. 205 0
      pages-mine/pages/rules-for-sellbooks.vue
  16. 0 1
      pages-mine/pages/setting.vue
  17. 14 1
      pages.json
  18. 1 1
      pages/home/components/BookItem.vue
  19. 139 0
      pages/home/components/KindReminder.vue
  20. 1 1
      pages/home/components/ScanBookList.vue
  21. 24 15
      pages/home/components/ServiceGuarantee.vue
  22. 81 0
      pages/home/components/ServiceInfo.vue
  23. 3 3
      pages/home/components/notScanned.vue
  24. 162 132
      pages/home/index.vue
  25. 76 16
      pages/mine/index.vue
  26. BIN
      static/img/1-1.png
  27. BIN
      static/img/1-2.png
  28. BIN
      static/img/1-3.png
  29. BIN
      static/img/1-4.png
  30. BIN
      static/img/1.png
  31. BIN
      static/img/2.png
  32. BIN
      static/img/3.png
  33. BIN
      static/img/4.png
  34. BIN
      static/img/bg.png
  35. BIN
      static/img/kf.png
  36. BIN
      static/img/no-data.png
  37. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  38. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  39. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  40. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/common-dialog.js.map
  41. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/img-swiper.js.map
  42. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/loadmore.js.map
  43. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/nav/dial-nav.js.map
  44. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/navbar/navbar-search.js.map
  45. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/navbar/navbar-top-search.js.map
  46. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/no-data.js.map
  47. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/pageScroll/index.js.map
  48. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/search/search.js.map
  49. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/select-reason.js.map
  50. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/tag.js.map
  51. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/title-operate.js.map
  52. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookItem.js.map
  53. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookListItem.js.map
  54. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/PickupTimePicker.js.map
  55. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/SubmitConfirm.js.map
  56. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/book-order.js.map
  57. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/order-success.js.map
  58. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/scaned-book.js.map
  59. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/user-agreement.js.map
  60. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/apply-reason.js.map
  61. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/back-goods.js.map
  62. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/back-status.js.map
  63. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/select-goods-pop.js.map
  64. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/select-item.js.map
  65. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/express/list.js.map
  66. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-info.js.map
  67. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-select-sku.js.map
  68. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-select.js.map
  69. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/submitBar.js.map
  70. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/line-info-operate.js.map
  71. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/navbar-tab-search.js.map
  72. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/express-goods-card.js.map
  73. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-card.js.map
  74. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-goods-card.js.map
  75. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-operate.js.map
  76. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-status.js.map
  77. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/orderdetail-goods-card.js.map
  78. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/sel-coupon-popup.js.map
  79. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-discounts.js.map
  80. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-goods-card.js.map
  81. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-operate.js.map
  82. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/apply-status.js.map
  83. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/apply.js.map
  84. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/back.js.map
  85. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/components/setExpress.js.map
  86. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/list.js.map
  87. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/success.js.map
  88. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/goods/detail.js.map
  89. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/detail.js.map
  90. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/express.js.map
  91. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/list.js.map
  92. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/pay-result.js.map
  93. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/pay.js.map
  94. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/submit.js.map
  95. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/zone/zone.js.map
  96. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/common/vendor.js.map
  97. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/address-card.js.map
  98. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/book-list.js.map
  99. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/category-popup.js.map
  100. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/city-picker.js.map

+ 0 - 1
api/modules/other.js

@@ -8,6 +8,5 @@ export const useOtherApi = (Vue, vm) => {
 		getArticleListAjax: (json) => vm.$u.post('/client/index/getArticleList',json),
 		// 获取快递类型列表
 		getExpressListAjax: () => vm.$u.post('/client/index/getExpressList'),
-		
 	}
 }

+ 64 - 56
components/pageScroll/index.vue

@@ -1,13 +1,19 @@
 <template>
     <!-- 列表 -->
-    <scroll-view class="scroll-view" scroll-y refresher-enabled :refresher-triggered="isRefreshing"
-        @refresherrefresh="onRefresh" @scrolltolower="onLoadMore">
+    <scroll-view
+        class="scroll-view"
+        scroll-y
+        refresher-enabled
+        :refresher-triggered="isRefreshing"
+        @refresherrefresh="onRefresh"
+        @scrolltolower="onLoadMore"
+    >
         <!-- 空状态 -->
 
         <view v-if="!loading && !dataList.length" class="empty-state">
-            <view class="flex-d flex-a-c" style="padding-top: 25vh;" v-if="slotEmpty">
-                <image src="@/pages-home/static/no-data.png" style="width:100%;height:260rpx" mode="heightFix"></image>
-                <view class="common-title" style="padding:33rpx 0 20rpx 0">暂无内容</view>
+            <view class="flex-d flex-a-c" style="padding-top: 25vh" v-if="slotEmpty">
+                <image src="/static/img/no-data.png" style="width: 100%; height: 260rpx" mode="heightFix"></image>
+                <view class="common-title" style="padding: 33rpx 0 20rpx 0">暂无内容</view>
                 <view class="common-text" v-if="emptyText">{{ emptyText }}</view>
             </view>
             <u-empty v-else mode="list" text="暂无扫描记录" margin-top="200"></u-empty>
@@ -17,7 +23,7 @@
 
         <!-- 加载更多 -->
         <view class="load-more" v-if="dataList.length > 0">
-            <u-divider :bg-color="bgColor">{{ hasMore ? '加载中...' : '我是有底线的' }}</u-divider>
+            <u-divider :bg-color="bgColor">{{ hasMore ? "加载中..." : "我是有底线的" }}</u-divider>
         </view>
     </scroll-view>
 </template>
@@ -31,75 +37,75 @@ export default {
             page: 1,
             hasMore: true,
             dataList: [],
-        }
+        };
     },
     props: {
         bgColor: {
             type: String,
-            default: '#F5F5F5'
+            default: "#F5F5F5",
         },
         url: {
             type: String,
             required: true,
-            default: '/token/order/scanLogs'
+            default: "/token/order/scanLogs",
         },
         pageSize: {
             type: Number,
-            default: 10
+            default: 10,
         },
         slotEmpty: {
             type: Boolean,
-            default: false
+            default: false,
         },
         emptyText: {
             type: String,
         },
         params: {
             type: Object,
-            default: {}
+            default: {},
         },
         immediate: {
             type: Boolean,
-            default: true
-        }
+            default: true,
+        },
     },
     mounted() {
-        console.log(this.immediate, 'immediate')
+        console.log(this.immediate, "immediate");
         if (this.immediate) {
-            this.loadData(true)
+            this.loadData(true);
         }
     },
     methods: {
         // 加载数据
         async loadData(isRefresh = false, params = {}) {
             if (isRefresh) {
-                this.page = 1
-                this.hasMore = true
+                this.page = 1;
+                this.hasMore = true;
             }
-            if (!this.hasMore || this.loading) return
+            if (!this.hasMore || this.loading) return;
 
-            this.loading = true
+            this.loading = true;
             try {
-                const res = await this.fetchBookList(params)
+                const res = await this.fetchBookList(params);
 
                 if (isRefresh) {
-                    this.dataList = res.list
+                    this.dataList = res.list;
                 } else {
-                    this.dataList = [...this.dataList, ...res.list]
+                    this.dataList = [...this.dataList, ...res.list];
                 }
-                this.$emit('updateList', this.dataList)
+                this.$emit("updateList", this.dataList);
 
-                this.hasMore = res.hasMore
-                this.page++
+                this.hasMore = res.hasMore;
+                this.page++;
             } catch (error) {
                 uni.showToast({
-                    title: '加载失败',
-                    icon: 'none'
-                })
+                    title: "加载失败",
+                    icon: "none",
+                });
             } finally {
-                this.loading = false
+                this.loading = false;
                 if (isRefresh) {
-                    this.isRefreshing = false
+                    this.isRefreshing = false;
                 }
             }
         },
@@ -108,43 +114,45 @@ export default {
         fetchBookList(params = {}) {
             return new Promise((resolve) => {
                 uni.showLoading({
-                    title: '加载中...',
-                })
-                uni.$u.http.get(this.url, {
-                    pageSize: this.pageSize,
-                    pageNum: this.page,
-                    ...params
-                }).then(res => {
-                    resolve({
-                        list: res.rows,
-                        hasMore: res.rows ? res.rows.length < res.total - this.dataList
-                            .length : false
+                    title: "加载中...",
+                });
+                uni.$u.http
+                    .get(this.url, {
+                        pageSize: this.pageSize,
+                        pageNum: this.page,
+                        ...params,
                     })
-                }).finally(() => {
-                    uni.hideLoading()
-                })
-            })
+                    .then((res) => {
+                        resolve({
+                            list: res.rows,
+                            hasMore: res.rows ? res.rows.length < res.total - this.dataList.length : false,
+                        });
+                    })
+                    .finally(() => {
+                        uni.hideLoading();
+                    });
+            });
         },
 
         reloadData() {
-            this.page = 1
-            this.fetchBookList()
+            this.page = 1;
+            this.fetchBookList();
         },
 
         // 下拉刷新
         async onRefresh() {
-            if (this.loading) return
-            this.isRefreshing = true
-            await this.loadData(true, this.params)
+            if (this.loading) return;
+            this.isRefreshing = true;
+            await this.loadData(true, this.params);
         },
 
         // 上拉加载更多
         async onLoadMore() {
-            if (this.loading || !this.hasMore) return
-            await this.loadData(false, this.params)
+            if (this.loading || !this.hasMore) return;
+            await this.loadData(false, this.params);
         },
-    }
-}
+    },
+};
 </script>
 
 <style lang="scss">
@@ -161,4 +169,4 @@ export default {
     justify-content: center;
     padding-bottom: calc(env(safe-area-inset-bottom) + 30rpx);
 }
-</style>
+</style>

+ 66 - 47
pages-home/components/SubmitConfirm.vue

@@ -1,25 +1,34 @@
 <template>
-    <u-popup v-model="showPopup" @close="closePopup" mode="center" border-radius="20" :width="width">
+    <u-popup v-model="showPopup" @close="closePopup" mode="center" border-radius="30" :width="width">
         <view class="submit-confirm">
-            <view class="icon-wrapper">
-                <image src="/static/tabbar/home2.png" class="tip-icon"></image>
-                <text class="tip-text">温馨提示</text>
-            </view>
+            <view class="container-form">
+                <view class="icon-wrapper">
+                    <image src="/static/tabbar/home2.png" class="tip-icon"></image>
+                    <text class="tip-text">温馨提示</text>
+                </view>
 
-            <view class="content">
-                <view>目前回收订单在包裹签收后<span class="highlight">15天内</span>完成品相审核与打款,审核时效内<span class="highlight">勿催~</span>
+                <view class="content">
+                    <view
+                        >目前回收订单在包裹签收后<span class="highlight">15天内</span
+                        >完成品相审核与打款,审核时效内<span class="highlight">勿催~</span>
+                    </view>
+                    <view class="mt-20"
+                        >为避免混单,影响审核到账时间,您需核对订单书籍,<span class="highlight">自行打包</span
+                        >后,交给取件员(<span class="highlight">包装上备注书嗨+物流单号</span
+                        >)。如随意放置包裹导致订单书籍遗失,平台概不负责。</view
+                    >
+                    <view class="mt-20"
+                        ><span class="highlight">卖书运费(不含包装费)由书嗨承担</span
+                        >,我们会安排京东、德邦或顺丰上门取件(不支持自寄和到付件),不需要您垫付运费。</view
+                    >
                 </view>
-                <view class="mt-20">为避免混单,影响审核到账时间,您需核对订单书籍,<span class="highlight">自行打包</span>后,交给取件员(<span
-                        class="highlight">包装上备注书嗨+物流单号</span>)。如随意放置包裹导致订单书籍遗失,平台概不负责。</view>
-                <view class="mt-20"><span
-                        class="highlight">卖书运费(不含包装费)由书嗨承担</span>,我们会安排京东、德邦或顺丰上门取件(不支持自寄和到付件),不需要您垫付运费。</view>
-            </view>
 
-            <view class="footer">
-                <button class="cancel-btn" @click="handleCancel">取消</button>
-                <button class="confirm-btn" :disabled="countdown > 0" @click="handleConfirm">
-                    确定提交{{ countdown > 0 ? `(${countdown}s)` : '' }}
-                </button>
+                <view class="footer">
+                    <button class="cancel-btn" @click="handleCancel">取消</button>
+                    <button class="confirm-btn" :disabled="countdown > 0" @click="handleConfirm">
+                        确定提交{{ countdown > 0 ? `(${countdown}s)` : "" }}
+                    </button>
+                </view>
             </view>
         </view>
     </u-popup>
@@ -30,52 +39,59 @@ export default {
     props: {
         width: {
             type: String,
-            default: '92%'
-        }
+            default: "92%",
+        },
     },
     data() {
         return {
             showPopup: false,
-            countdown: 15
-        }
+            countdown: 15,
+        };
     },
     methods: {
         openPopup() {
-            this.showPopup = true
-            this.startCountdown()
+            this.showPopup = true;
+            this.startCountdown();
         },
         closePopup() {
-            this.showPopup = false
-            this.countdown = 15
+            this.showPopup = false;
+            this.countdown = 15;
         },
         handleConfirm() {
-            this.$emit('confirm')
-            this.closePopup()
+            this.$emit("confirm");
+            this.closePopup();
         },
         handleCancel() {
-            this.$emit('cancel')
-            this.closePopup()
+            this.$emit("cancel");
+            this.closePopup();
         },
         startCountdown() {
-            this.countdown = 15
+            this.countdown = 15;
             const timer = setInterval(() => {
                 if (this.countdown > 0) {
-                    this.countdown--
+                    this.countdown--;
                 } else {
-                    clearInterval(timer)
+                    clearInterval(timer);
                 }
-            }, 1000)
-        }
-    }
-}
+            }, 1000);
+        },
+    },
+};
 </script>
 
 <style lang="scss" scoped>
 .submit-confirm {
-    background: #FFFFFF;
-    border-radius: 20rpx;
+    background: #ffffff;
+    border-radius: 26rpx;
     overflow: hidden;
-    padding: 30rpx;
+    padding: 16rpx;
+    background: linear-gradient(-90deg, #98e05f, #0de3ac);
+    .container-form {
+        background: #effcf3;
+        border-radius: 26rpx;
+        padding: 30rpx;
+        padding-bottom: 40rpx;
+    }
 
     .icon-wrapper {
         display: flex;
@@ -93,7 +109,7 @@ export default {
             font-family: Source Han Sans CN;
             font-weight: bold;
             font-size: 36rpx;
-            color: #37C148;
+            color: #37c148;
         }
     }
 
@@ -102,11 +118,11 @@ export default {
         font-size: 32rpx;
         color: #333333;
         line-height: 48rpx;
-        view{
+        view {
             font-size: 32rpx;
         }
         .highlight {
-            color: #FF0000;
+            color: #ff0000;
         }
     }
 
@@ -121,7 +137,6 @@ export default {
         padding: 0 10rpx;
 
         button {
-            flex: 1;
             height: 88rpx;
             line-height: 88rpx;
             font-size: 32rpx;
@@ -133,13 +148,17 @@ export default {
             }
 
             &.cancel-btn {
-                background-color: #F5F5F5;
-                color: #333333;
+                flex: 1;
+                background-color: #E3E3E3;
+                color: #ffffff;
+                width: 135rpx;
             }
 
             &.confirm-btn {
-                background-color: #38C148;
-                color: #FFFFFF;
+                flex: 2.5;
+                width: 335rpx;
+                background-color: #38c148;
+                color: #ffffff;
 
                 &:disabled {
                     opacity: 0.7;

+ 111 - 92
pages-home/pages/book-order.vue

@@ -3,9 +3,9 @@
         <!-- 取货地址部分 -->
         <view class="section-card">
             <view class="flex-a flex-j-b mb-20" @click="handleAddress" v-if="defaultAddr.id">
-                <image src="../static/adderss.png" style="width:40rpx;height: 40rpx;"></image>
-                <view class="flex-d flex-1 ml-24" style="margin-right: 90rpx;">
-                    <view class="flex-a flex-j-b  mb-10">
+                <image src="../static/adderss.png" style="width: 40rpx; height: 40rpx"></image>
+                <view class="flex-d flex-1 ml-24" style="margin-right: 90rpx">
+                    <view class="flex-a flex-j-b mb-10">
                         <view :style="titleStyle">发货人:{{ defaultAddr.name }}</view>
                         <view :style="titleStyle">{{ defaultAddr.mobile }}</view>
                     </view>
@@ -31,15 +31,15 @@
                 <view class="pickup-title">免费上门取货</view>
                 <view class="pickup-desc">书嗨将预约指定快递上门取件,邮费由书嗨承担</view>
             </view>
-            <view class="flex-a flex-j-b time-card" style="padding:0 10rpx" @click="showTimePicker = true">
+            <view class="flex-a flex-j-b time-card" style="padding: 0 10rpx" @click="showTimePicker = true">
                 <view class="flex-a">
                     <view :style="titleStyle" class="ml-10 font-28">取件时间</view>
                     <text class="u-required">*</text>
                 </view>
 
                 <view class="flex-a">
-
-                    <view v-if="selectedTime.day" :style="titleStyle" class="ml-10">{{ selectedTime.day }}
+                    <view v-if="selectedTime.day" :style="titleStyle" class="ml-10"
+                        >{{ selectedTime.day }}
                         {{ selectedTime.time }}
                     </view>
                     <view v-else :style="titleStyle" class="ml-10">请选择快递上门取件时间</view>
@@ -56,11 +56,13 @@
                 </view>
 
                 <view class="flex-a">
-                    <view :style="titleStyle" class="ml-10">{{ submitData.expressDelivery || '请选择' }}</view>
+                    <view :style="titleStyle" class="ml-10">{{ submitData.expressDelivery || "请选择" }}</view>
                     <u-icon name="arrow-right" :size="28" color="#666" top="3"></u-icon>
                 </view>
             </view>
-            <view class="express-desc">请从【顺丰】或【京东】中选择可正常收寄的快递,如您不选择,则由系统根据区域情况自动分配</view>
+            <view class="express-desc"
+                >请从【顺丰】或【京东】中选择可正常收寄的快递,如您不选择,则由系统根据区域情况自动分配</view
+            >
         </view>
 
         <!-- 书籍列表 -->
@@ -73,12 +75,13 @@
             <view class="agreement">
                 <u-checkbox v-model="agreed" shape="circle">
                     <text class="agreement-text">我已阅读并同意</text>
-                    <text class="agreement-link">《书嗨用户协议》</text>
+                    <text class="agreement-link" @click="goToAgreement">《书嗨用户协议》</text>
                 </u-checkbox>
             </view>
             <view class="order-summary">
                 <view class="total">
-                    共<text class="price">{{ totalBooks }}</text>件 预估回收价
+                    共<text class="price">{{ totalBooks }}</text
+                    >件 预估回收价
                     <text class="price">¥{{ totalPrice }}</text>
                 </view>
                 <u-button type="primary" @click="submitOrder" :custom-style="{ margin: 0 }">提交订单</u-button>
@@ -86,8 +89,14 @@
         </view>
 
         <!-- 添加快递选择器 -->
-        <u-picker v-model="showPicker" mode="selector" :range="expressList" @confirm="onExpressConfirm"
-            @cancel="showPicker = false" range-key="name"></u-picker>
+        <u-picker
+            v-model="showPicker"
+            mode="selector"
+            :range="expressList"
+            @confirm="onExpressConfirm"
+            @cancel="showPicker = false"
+            range-key="name"
+        ></u-picker>
 
         <pickup-time-picker :show.sync="showTimePicker" @confirm="onTimeConfirm"></pickup-time-picker>
 
@@ -96,22 +105,22 @@
 </template>
 
 <script>
-import bookItem from '@/pages-home/components/BookItem.vue'
-import pickupTimePicker from '@/pages-home/components/PickupTimePicker.vue'
-import SubmitConfirm from '@/pages-home/components/SubmitConfirm.vue'
+import bookItem from "@/pages-home/components/BookItem.vue";
+import pickupTimePicker from "@/pages-home/components/PickupTimePicker.vue";
+import SubmitConfirm from "@/pages-home/components/SubmitConfirm.vue";
 
 export default {
     components: {
         bookItem,
         pickupTimePicker,
-        SubmitConfirm
+        SubmitConfirm,
     },
     data() {
         return {
             titleStyle: {
-                'font-family': 'PingFang SC',
-                'font-weight': 400,
-                color: '#333333',
+                "font-family": "PingFang SC",
+                "font-weight": 400,
+                color: "#333333",
             },
             agreed: false,
             books: [],
@@ -123,141 +132,151 @@ export default {
             defaultAddr: {},
 
             submitData: {
-                expressDelivery: '',
-                "orderId": "",
-                "addressId": "",
-                "schedulePickupStartTime": "",
-                "schedulePickupEndTime": "",
-                "expressDelivery": "",
-                "remark": ""
-            }
-        }
+                expressDelivery: "",
+                orderId: "",
+                addressId: "",
+                schedulePickupStartTime: "",
+                schedulePickupEndTime: "",
+                expressDelivery: "",
+                remark: "",
+            },
+        };
     },
     computed: {
         totalBooks() {
-            return this.books.reduce((sum, book) => sum + (book.num || 1), 0)
+            return this.books.reduce((sum, book) => sum + (book.num || 1), 0);
         },
         totalPrice() {
-            return this.books.reduce((sum, book) => sum + book.recycleMoney, 0).toFixed(2)
-        }
+            return this.books.reduce((sum, book) => sum + book.recycleMoney, 0).toFixed(2);
+        },
     },
     methods: {
         //时间选择
         onTimeConfirm(data) {
-            this.selectedTime = data
+            this.selectedTime = data;
             //格式化提交数据的时间
-            let date = this.$u.timeFormat(data.date, 'yyyy-mm-dd')
-            let times = data.time.split('-')
+            let date = this.$u.timeFormat(data.date, "yyyy-mm-dd");
+            let times = data.time.split("-");
 
-            this.submitData.schedulePickupStartTime = `${date} ${times[0]}`
-            this.submitData.schedulePickupEndTime = `${date} ${times[1]}`
-            console.log(date, this.submitData, 'data')
+            this.submitData.schedulePickupStartTime = `${date} ${times[0]}`;
+            this.submitData.schedulePickupEndTime = `${date} ${times[1]}`;
+            console.log(date, this.submitData, "data");
         },
 
         //打开快递选择器
         showExpressPicker() {
-            this.showPicker = true
+            this.showPicker = true;
         },
-        //确认选择快递  
+        //确认选择快递
         onExpressConfirm(e) {
-            if (!e.length) return
-            let item = this.expressList[e[0]]
-            this.submitData.expressDelivery = item.name
-            this.showPicker = false
+            if (!e.length) return;
+            let item = this.expressList[e[0]];
+            this.submitData.expressDelivery = item.name;
+            this.showPicker = false;
         },
         //添加或者选择地址
         handleAddress() {
             uni.navigateTo({
-                url: `/pages-mine/pages/address/list?id=${this.defaultAddr.id}&isSelect=1`
-            })
+                url: `/pages-mine/pages/address/list?id=${this.defaultAddr.id}&isSelect=1`,
+            });
         },
 
         calculateTotal() {
-            this.totalBooks = this.books.reduce((sum, book) => sum + book.quantity, 0)
+            this.totalBooks = this.books.reduce((sum, book) => sum + book.quantity, 0);
             this.totalPrice = this.books
                 .reduce((sum, book) => sum + book.quantity * parseFloat(book.price), 0)
-                .toFixed(2)
+                .toFixed(2);
         },
         submitOrder() {
+            if (!this.submitData.addressId) {
+                this.$u.toast("请选择取货地址");
+                return;
+            }
             if (!this.selectedTime.day) {
-                this.$u.toast('请选择取件时间')
-                return
+                this.$u.toast("请选择取件时间");
+                return;
             }
             if (!this.agreed) {
-                this.$u.toast('请先同意用户协议')
-                return
+                this.$u.toast("请先同意用户协议");
+                return;
             }
             // 显示确认弹窗
-            this.$refs.submitConfirmDialog.openPopup()
+            this.$refs.submitConfirmDialog.openPopup();
         },
-        
+
         // 确认提交订单
         handleConfirmSubmit() {
             // 处理订单提交
-            uni.$u.http.post('/token/order/submitOrder', this.submitData).then(res => {
+            uni.$u.http.post("/token/order/submitOrder", this.submitData).then((res) => {
                 if (res.code == 200) {
                     uni.navigateTo({
-                        url: "/pages-home/pages/order-success"
-                    })
-                    uni.removeStorageSync('selectAddr')
+                        url: "/pages-home/pages/order-success",
+                    });
+                    uni.removeStorageSync("selectAddr");
                 } else {
                     uni.showToast({
                         title: res.msg,
-                        icon: 'none'
-                    })
+                        icon: "none",
+                    });
                 }
-            })
+            });
         },
         //获取默认地址 /api/token/user/address/getDefault
         getDefaultAddress() {
-            uni.$u.http.get('/token/user/address/getDefault').then(res => {
+            uni.$u.http.get("/token/user/address/getDefault").then((res) => {
                 if (res.code == 200) {
-                    this.defaultAddr = res.data
-                    this.submitData.addressId = this.defaultAddr.id
+                    this.defaultAddr = res.data;
+                    this.submitData.addressId = this.defaultAddr.id;
                 }
-            })
+            });
         },
         //获取当前用户未提交订单 /api/token/order/lastOrder
         getLastOrder() {
-            uni.$u.http.get('/token/order/lastOrder').then(res => {
+            uni.$u.http.get("/token/order/lastOrder").then((res) => {
                 if (res.code == 200) {
-                    this.books = res.data?.orderDetailList ? res.data.orderDetailList?.map(v => {
-                        v.orderId = res.data.orderId
-                        return v
-                    }) : [],
-
-                        this.submitData.orderId = this.books[0].orderId
+                    this.books = res.data?.orderDetailList
+                        ? res.data.orderDetailList?.map((v) => {
+                              v.orderId = res.data.orderId;
+                              return v;
+                          })
+                        : [];
+
+                    this.submitData.orderId = this.books[0].orderId;
                 }
-            })
+            });
         },
         //获取预提交订单
         getPreSubmitOrder() {
-            let orderId = uni.getStorageSync('orderId')
-            uni.$u.http.get('/token/order/preSubmit?orderId=' + orderId).then(res => {
-                this.submitData.orderId = orderId
-                this.defaultAddr = res.data.defaultAddress
-                this.submitData.addressId = this.defaultAddr.id
-
-                this.books = res.data.orderDetailList
-                this.expressList = res.data.expressTypes.map(v => ({
-                    name: v
-                }))
-            })
+            let orderId = uni.getStorageSync("orderId");
+            uni.$u.http.get("/token/order/preSubmit?orderId=" + orderId).then((res) => {
+                this.submitData.orderId = orderId;
+                this.defaultAddr = res.data.defaultAddress;
+                this.submitData.addressId = this.defaultAddr.id;
+
+                this.books = res.data.orderDetailList;
+                this.expressList = res.data.expressTypes.map((v) => ({
+                    name: v,
+                }));
+            });
+        },
+        goToAgreement() {
+            uni.navigateTo({
+                url: "/pages-home/pages/user-agreement",
+            });
         },
-
     },
     mounted() {
-        this.getPreSubmitOrder()
+        this.getPreSubmitOrder();
     },
 
     onShow() {
-        let selectAddr = uni.getStorageSync('selectAddr')
+        let selectAddr = uni.getStorageSync("selectAddr");
         if (selectAddr) {
-            this.defaultAddr = selectAddr
-            this.submitData.addressId = selectAddr.id
+            this.defaultAddr = selectAddr;
+            this.submitData.addressId = selectAddr.id;
         }
     },
-}
+};
 </script>
 
 <style lang="scss">
@@ -277,13 +296,13 @@ export default {
 }
 
 .u-required {
-    color: #FF0000;
+    color: #ff0000;
     margin-left: 8rpx;
 }
 
 .time-card {
     height: 80rpx;
-    background: #F8F8F8;
+    background: #f8f8f8;
     border-radius: 10rpx;
 }
 
@@ -344,4 +363,4 @@ export default {
         }
     }
 }
-</style>
+</style>

+ 72 - 0
pages-home/pages/user-agreement.vue

@@ -0,0 +1,72 @@
+<template>
+    <view class="user-agreement">
+        <view class="agreement-title">{{ agreementData.title }}</view>
+        <view class="agreement-content">
+            <rich-text :nodes="agreementData.content"></rich-text>
+        </view>
+    </view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            agreementData: {
+                title: "",
+                content: "",
+            },
+        };
+    },
+    onLoad() {
+        this.getOrderAgreement();
+    },
+    methods: {
+        // 获取下单协议
+        getOrderAgreement() {
+            uni.showLoading({
+                title: "加载中...",
+            });
+            uni.$u.http
+                .get("/token/getOrderAgreement")
+                .then((res) => {
+                    console.log(res);
+                    if (res.code === 200) {
+                        this.agreementData = res.data;
+                    } else {
+                        this.$u.toast(res.msg || "获取协议内容失败");
+                    }
+                })
+                .finally(() => {
+                    uni.hideLoading();
+                });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.user-agreement {
+    min-height: 100vh;
+    background-color: $app-theme-bg-color;
+    padding: 30rpx;
+    padding-bottom: 50px;
+
+    .agreement-title {
+        font-size: 36rpx;
+        font-weight: bold;
+        color: $app-theme-text-color;
+        text-align: center;
+        margin-bottom: 40rpx;
+    }
+
+    .agreement-content {
+        font-size: 28rpx;
+        color: $app-theme-text-color;
+        line-height: 1.8;
+
+        :deep(rich-text) {
+            width: 100%;
+        }
+    }
+}
+</style>

+ 164 - 162
pages-mine/components/address-card.vue

@@ -1,169 +1,171 @@
 <template>
-	<view class="address-card" :class="{ 'address-card--selected': selected }">
-		<!-- 选中状态的勾 -->
-		<view class="selected-icon no-select-icon" v-if="isSelect==1" @tap="handleClick">
-			<u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
-		</view>
-
-		<view class="selected-icon" v-if="selected" @tap="handleClick">
-			<u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
-		</view>
-
-		<!-- 主要内容区 -->
-		<view class="content flex-a" @click="updateAddress">
-			<image src="../static/adderss.png" style="width:40rpx;height: 40rpx;"></image>
-
-			<view class="flex-1 mr-40 ml-24 flex-d">
-				<view class="header flex-a flex-1 mb-24">
-					<view class="name-phone">
-						<text class="common-text-2">{{ address.name }}</text>
-						<text class="common-text-2 ml-20">{{ address.mobile }}</text>
-					</view>
-					<view class="status ml-40" v-if="address.defaultFlag==1">默认</view>
-				</view>
-				<view class="common-text-2">{{ address.fullAddress }}</view>
-			</view>
-
-			<!-- 右侧箭头 -->
-			<u-icon name="arrow-right" size="32" color="#999"></u-icon>
-		</view>
-
-		<!-- 底部操作区 -->
-		<view class="footer flex-a flex-j-b">
-			<view class="common-text-2">
-				<u-checkbox v-model="isDefault" @change="onDefaultChange" shape="circle"
-					active-color="#38C148">默认地址</u-checkbox>
-			</view>
-			<view class="common-text-2" @click.stop="onDelete">删除</view>
-		</view>
-	</view>
+    <view class="address-card" :class="{ 'address-card--selected': selected }">
+        <!-- 选中状态的勾 -->
+        <view class="selected-icon no-select-icon" v-if="isSelect == 1" @tap="handleClick">
+            <u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
+        </view>
+
+        <view class="selected-icon" v-if="selected" @tap="handleClick">
+            <u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
+        </view>
+
+        <!-- 主要内容区 -->
+        <view class="content flex-a" @click="updateAddress">
+            <image src="../static/adderss.png" style="width: 40rpx; height: 40rpx"></image>
+
+            <view class="flex-1 mr-40 ml-24 flex-d">
+                <view class="header flex-a flex-1 mb-24">
+                    <view class="name-phone">
+                        <text class="common-text-2">{{ address.name }}</text>
+                        <text class="common-text-2 ml-20">{{ address.mobile }}</text>
+                    </view>
+                    <view class="status ml-40" v-if="address.defaultFlag == 1">默认</view>
+                </view>
+                <view class="common-text-2">{{ address.fullAddress }}</view>
+            </view>
+
+            <!-- 右侧箭头 -->
+            <u-icon name="arrow-right" size="32" color="#999"></u-icon>
+        </view>
+
+        <!-- 底部操作区 -->
+        <view class="footer flex-a flex-j-b">
+            <view class="common-text-2">
+                <u-checkbox v-model="isDefault" @change="onDefaultChange" shape="circle" active-color="#38C148"
+                    >默认地址</u-checkbox
+                >
+            </view>
+            <view class="common-text-2" @click.stop="onDelete">删除</view>
+        </view>
+    </view>
 </template>
 
 <script>
-	export default {
-		name: 'address-item',
-		props: {
-			address: {
-				type: Object,
-				default: () => ({})
-			},
-			selected: {
-				type: Boolean,
-				default: false
-			},
-			isSelect: {
-				type: [Boolean, Number,String],
-				default: false
-			},
-		},
-		data() {
-			return {
-				isDefault: false,
-			}
-		},
-		watch: {
-			address: {
-				handler(value) {
-					this.isDefault = value.defaultFlag == 1
-				},
-				deep: true,
-				immediate: true
-			}
-		},
-		methods: {
-			handleClick() {
-				this.$emit('tapItem', this.address)
-			},
-
-			//更新地址
-			updateAddress() {
-				if (!this.isSelect) {
-					uni.navigateTo({
-						url: '/pages-mine/pages/address/add-or-update?id=' + this.address.id
-					})
-				} else {
-					this.$emit('tapItem', this.address)
-				}
-			},
-
-			onDefaultChange(value) {
-				if (this.address.defaultFlag == 1) return this.isDefault = true
-
-				let id = this.address.id
-				uni.$u.http.post(`/token/user/address/setDefault/${id}`).then(res => {
-					if (res.code == 200) {
-						uni.showToast({
-							icon: "none",
-							title: "设置默认地址成功"
-						})
-						this.$emit('success')
-					} else {
-						uni.showToast({
-							icon: "none",
-							title: res.msg
-						})
-						this.isDefault = false
-					}
-				})
-			},
-			onDelete() {
-				this.$emit('delete', this.address.id)
-			}
-		}
-	}
+export default {
+    name: "address-item",
+    props: {
+        address: {
+            type: Object,
+            default: () => ({}),
+        },
+        selected: {
+            type: Boolean,
+            default: false,
+        },
+        isSelect: {
+            type: [Boolean, Number, String],
+            default: false,
+        },
+    },
+    data() {
+        return {
+            isDefault: false,
+        };
+    },
+    watch: {
+        address: {
+            handler(value) {
+                this.isDefault = value.defaultFlag == 1;
+            },
+            deep: true,
+            immediate: true,
+        },
+    },
+    methods: {
+        handleClick() {
+            this.$emit("tapItem", this.address);
+        },
+
+        //更新地址
+        updateAddress() {
+            uni.navigateTo({
+                url: "/pages-mine/pages/address/add-or-update?id=" + this.address.id,
+            });
+            return
+            if (!this.isSelect) {
+                uni.navigateTo({
+                    url: "/pages-mine/pages/address/add-or-update?id=" + this.address.id,
+                });
+            } else {
+                this.$emit("tapItem", this.address);
+            }
+        },
+
+        onDefaultChange(value) {
+            if (this.address.defaultFlag == 1) return (this.isDefault = true);
+
+            let id = this.address.id;
+            uni.$u.http.post(`/token/user/address/setDefault/${id}`).then((res) => {
+                if (res.code == 200) {
+                    uni.showToast({
+                        icon: "none",
+                        title: "设置默认地址成功",
+                    });
+                    this.$emit("success");
+                } else {
+                    uni.showToast({
+                        icon: "none",
+                        title: res.msg,
+                    });
+                    this.isDefault = false;
+                }
+            });
+        },
+        onDelete() {
+            this.$emit("delete", this.address.id);
+        },
+    },
+};
 </script>
 
 <style lang="scss" scoped>
-	.address-card {
-		position: relative;
-		background-color: #FFFFFF;
-		padding: 20rpx 30rpx;
-		margin-bottom: 20rpx;
-		border-radius: 12rpx;
-		border: 2rpx solid transparent;
-		transition: all 0.3s;
-		margin-bottom: 20rpx;
-
-		// 选中状态样式
-		&--selected {
-			border-color: #38C148;
-			background-color: rgba(56, 193, 72, 0.05);
-		}
-
-		// 选中状态的勾
-		.selected-icon {
-			position: absolute;
-			right: -2rpx;
-			top: -2rpx;
-			width: 40rpx;
-			height: 40rpx;
-			background-color: #38C148;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			border-bottom-left-radius: 12rpx;
-			border-top-right-radius: 12rpx;
-
-			&.no-select-icon {
-				background-color: #d8d8d8;
-			}
-		}
-
-
-
-		.status {
-			font-size: 24rpx;
-			color: #38C148;
-			padding: 4rpx 12rpx;
-			border: 1px solid #38C148;
-			border-radius: 6rpx;
-		}
-
-
-		.footer {
-			margin-top: 20rpx;
-			padding-top: 20rpx;
-			border-top: 1rpx solid #EEEEEE;
-		}
-	}
-</style>
+.address-card {
+    position: relative;
+    background-color: #ffffff;
+    padding: 20rpx 30rpx;
+    margin-bottom: 20rpx;
+    border-radius: 12rpx;
+    border: 2rpx solid transparent;
+    transition: all 0.3s;
+    margin-bottom: 20rpx;
+
+    // 选中状态样式
+    &--selected {
+        border-color: #38c148;
+        background-color: rgba(56, 193, 72, 0.05);
+    }
+
+    // 选中状态的勾
+    .selected-icon {
+        position: absolute;
+        right: -2rpx;
+        top: -2rpx;
+        width: 40rpx;
+        height: 40rpx;
+        background-color: #38c148;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-bottom-left-radius: 12rpx;
+        border-top-right-radius: 12rpx;
+
+        &.no-select-icon {
+            background-color: #d8d8d8;
+        }
+    }
+
+    .status {
+        font-size: 24rpx;
+        color: #38c148;
+        padding: 4rpx 12rpx;
+        border: 1px solid #38c148;
+        border-radius: 6rpx;
+    }
+
+    .footer {
+        margin-top: 20rpx;
+        padding-top: 20rpx;
+        border-top: 1rpx solid #eeeeee;
+    }
+}
+</style>

+ 4 - 3
pages-mine/components/order-actions.vue

@@ -79,7 +79,8 @@ export default {
     display: flex;
     justify-content: flex-end;
     gap: 10px;
-    padding: 10px 0;
+    padding: 16rpx 0;
+    padding-bottom: 10rpx;
     width: 100%;
 
     .w-full {
@@ -127,8 +128,8 @@ export default {
     .order-actions {
         .action-btn {
             max-width: 200rpx;
-            height: 80rpx;
-            line-height: 80rpx;
+            height: 72rpx;
+            line-height: 72rpx;
         }
     }
 }

+ 118 - 105
pages-mine/mixin/btnAction.js

@@ -3,174 +3,187 @@ export default {
         return {
             actionList: [],
             showReportSheet: false,
-            order: {}
-        }
+            order: {},
+        };
     },
     onShow() {
-        let selectEditAddr = uni.getStorageSync('selectEditAddr')
+        let selectEditAddr = uni.getStorageSync("selectEditAddr");
         if (selectEditAddr.id) {
-            this.handleAddressSubmit(selectEditAddr.id)
+            this.handleAddressSubmit(selectEditAddr.id);
         }
     },
     methods: {
         //操作成功之后的回调
         successFeedback() {
-            uni.$emit('btnActionSuccess')
+            uni.$emit("btnActionSuccess");
         },
 
         //修改地址
         handleAddressSubmit(addressId) {
             const params = {
                 orderId: this.order.orderId,
-                addressId
-            }
-            uni.$u.http.post('/token/order/modifyAddress', params).then(res => {
-                if (res.code === 200) {
-                    uni.showToast({
-                        title: '地址修改成功',
-                        icon: 'none'
-                    })
-                    this.$emit('success')
-                    this.successFeedback()
-                    uni.removeStorageSync('selectEditAddr')
-                } else {
-                    uni.showToast({
-                        title: res.msg,
-                        icon: 'none'
-                    })
-                }
-            }).finally(() => {
-                uni.removeStorageSync('selectEditAddr')
-                uni.hideLoading()
-            })
+                addressId,
+            };
+            uni.$u.http
+                .post("/token/order/modifyAddress", params)
+                .then((res) => {
+                    if (res.code === 200) {
+                        uni.showToast({
+                            title: "地址修改成功",
+                            icon: "none",
+                        });
+                        this.$emit("success");
+                        this.successFeedback();
+                        uni.removeStorageSync("selectEditAddr");
+                    } else {
+                        uni.showToast({
+                            title: res.msg,
+                            icon: "none",
+                        });
+                    }
+                })
+                .finally(() => {
+                    uni.removeStorageSync("selectEditAddr");
+                    uni.hideLoading();
+                });
         },
         //根据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);
         },
         //获取一键上报的选项 code user_report_options
         getReportOptions() {
-            this.getDict('user_report_options').then(res => {
+            this.getDict("user_report_options").then((res) => {
                 if (res.code === 200) {
-                    this.actionList = res.data.map(item => ({
+                    this.actionList = res.data.map((item) => ({
                         text: item.dictLabel,
-                        value: item.dictValue
-                    }))
+                        value: item.dictValue,
+                    }));
                 }
-            })
+            });
         },
         //一键上报相关操作
         handleReportSelect(index) {
-            this.showReportSheet = false
-            let reason = this.actionList[index].value
+            this.showReportSheet = false;
+            let reason = this.actionList[index].value;
             if (this.actionList[index]?.isCancel) {
-                this.submitCancel(reason)
+                this.submitCancel(reason);
             } else {
-                this.submitReport(reason)
+                this.submitReport(reason);
             }
         },
         submitReport(reason) {
             const params = {
                 orderId: this.order.orderId,
-                reason: reason
-            }
-            uni.$u.http.post('/token/order/userReport', params).then(res => {
+                reason: reason,
+            };
+            uni.$u.http.post("/token/order/userReport", params).then((res) => {
                 if (res.code === 200) {
                     uni.showToast({
-                        title: '一键上报已上报给管理员',
-                        icon: 'none'
-                    })
-                    this.$emit('success')
-                    this.successFeedback()
+                        title: "一键上报已上报给管理员",
+                        icon: "none",
+                    });
+                    this.$emit("success");
+                    this.successFeedback();
                 }
-            })
+            });
         },
 
         //订单取消字典 order_cancel_reason_user
         getCancelReason() {
-            this.getDict('order_cancel_reason_user').then(res => {
+            this.getDict("order_cancel_reason_user").then((res) => {
                 if (res.code === 200) {
-                    this.actionList = res.data.map(item => ({
+                    this.actionList = res.data.map((item) => ({
                         text: item.dictLabel,
                         value: item.dictValue,
-                        isCancel: true
-                    }))
+                        isCancel: true,
+                    }));
                 }
-            })
+            });
         },
 
         // 订单操作方法
         handleAction({ type, order }) {
-            console.log('handleAction', type, order)
-            this.order = order
+            console.log("handleAction", type, order);
+            this.order = order;
             switch (type) {
-                case 'submit':
+                case "submit":
                     uni.navigateTo({
-                        url: "/pages-home/pages/book-order"
-                    })
-                    uni.setStorageSync('orderId', this.order.orderId)
-                    break
-                case 'editAddress':
+                        url: "/pages-home/pages/book-order",
+                    });
+                    uni.setStorageSync("orderId", this.order.orderId);
+                    break;
+                case "editAddress":
                     uni.navigateTo({
-                        url: `/pages-mine/pages/address/list?id=${this.order.addressId}&isSelect=1&editAddress=1`
-                    })
-                    break
-                case 'cancel':
-                    this.showReportSheet = true
-                    this.getCancelReason()
-                    break
-                case 'report':
-                    this.showReportSheet = true
-                    this.getReportOptions()
-                    break
-                case 'remindAudit':
-                    this.submitRemindAudit()
-                    break
-                case 'complaint':
+                        url: `/pages-mine/pages/address/list?id=${this.order.addressId}&isSelect=1&editAddress=1`,
+                    });
+                    break;
+                case "cancel":
+                    uni.showModal({
+                        title: "提示",
+                        content: "确定取消订单吗?",
+                        success: (res) => {
+                            if (res.confirm) {
+                                this.showReportSheet = true;
+                                this.getCancelReason();
+                            }
+                        },
+                    });
+                    break;
+                case "report":
+                    this.showReportSheet = true;
+                    this.getReportOptions();
+                    break;
+                case "remindAudit":
+                    this.submitRemindAudit();
+                    break;
+                case "complaint":
                     uni.navigateTo({
-                        url: `/pages-mine/pages/complaint?orderId=${this.order.orderId}`
-                    })
-                    break
-                case 'compensation':
-                    this.$emit('compensation', this.order)
-                    break
+                        url: `/pages-mine/pages/complaint?orderId=${this.order.orderId}`,
+                    });
+                    break;
+                case "compensation":
+                    this.$emit("compensation", this.order);
+                    break;
             }
         },
 
         submitCancel(reason) {
             const params = {
                 orderId: this.order.orderId,
-                reason: reason
-            }
-            uni.$u.http.post('/token/order/userCancel', params).then(res => {
+                reason: reason,
+            };
+            uni.$u.http.post("/token/order/userCancel", params).then((res) => {
                 if (res.code === 200) {
                     uni.showToast({
-                        title: '您的订单已取消',
-                        icon: 'none'
-                    })
-                    this.$emit('success')
-                    this.successFeedback()
+                        title: "您的订单已取消",
+                        icon: "none",
+                    });
+                    this.$emit("success");
+                    this.successFeedback();
                 }
-            })
+            });
         },
 
         //提醒审核
         submitRemindAudit() {
-            uni.$u.http.post('/api/token/order/urgeOrder', {
-                orderId: this.order.orderId
-            }).then(res => {
-                if (res.code === 200) {
-                    uni.showToast({
-                        title: '已提醒给管理员进行加急审核',
-                        icon: 'none'
-                    })
-                } else {
-                    uni.showToast({
-                        title: res.msg,
-                        icon: 'none'
-                    })
-                }
-            })
+            uni.$u.http
+                .post("/api/token/order/urgeOrder", {
+                    orderId: this.order.orderId,
+                })
+                .then((res) => {
+                    if (res.code === 200) {
+                        uni.showToast({
+                            title: "已提醒给管理员进行加急审核",
+                            icon: "none",
+                        });
+                    } else {
+                        uni.showToast({
+                            title: res.msg,
+                            icon: "none",
+                        });
+                    }
+                });
         },
-    }
-}
+    },
+};

+ 1 - 1
pages-mine/pages/address/add-or-update.vue

@@ -6,7 +6,7 @@
                     <u-input v-model="form.name" placeholder="请输入收货人姓名" />
                 </u-form-item>
                 <u-form-item label="联系方式" prop="mobile">
-                    <u-input v-model="form.mobile" placeholder="请输入联系方式" />
+                    <u-input type="number" v-model="form.mobile" placeholder="请输入联系方式" />
                 </u-form-item>
                 <u-form-item label="所在地区">
                     <uni-data-picker v-model="selAddressCodes" :localdata="dataList" placeholder="请选择所在地区"

+ 120 - 155
pages-mine/pages/notice.vue

@@ -1,162 +1,127 @@
 <template>
-	<view class="notice-page">
-		<scroll-view scroll-y class="notice-scroll" @scrolltolower="loadMore" refresher-enabled
-			:refresher-triggered="isRefreshing" @refresherrefresh="onRefresh">
-			<block v-if="noticeList.length > 0">
-				<!-- 时间分割线 -->
-
-				<view class="notice-bar" v-for="(item, index) in noticeList" :key="index">
-					<view class="time-divider">{{ item.time }}</view>
-
-					<!-- 消息列表 -->
-					<view class="notice-item flex-d">
-						<!-- 通知图标 -->
-						<view class="flex-a notice-header">
-							<image src="../static/notice.png" style="width:44rpx;height:44rpx"></image>
-							<view class="notice-title">通知</view>
-						</view>
-						<!-- 通知内容 -->
-						<view class="notice-content">
-							<view class="notice-text">
-								<text>{{item.content}}</text>
-								<text>\n您也可以随时在</text>
-								<text class="notice-link" @click="goToOrder">【我的订单】</text>
-								<text>中查看订单状态</text>
-							</view>
-						</view>
-					</view>
-				</view>
-
-			</block>
-
-			<!-- 空状态 -->
-			<u-empty v-else mode="message" text="暂无消息"></u-empty>
-		</scroll-view>
-	</view>
+    <view class="notice-page">
+        <page-scroll
+            url="/token/message/mymsg"
+            :immediate="true"
+            @updateList="handleUpdateList"
+            ref="pageScroll"
+            slotEmpty
+            emptyText="暂无消息"
+        >
+            <!-- 时间分割线 -->
+            <view class="notice-bar" v-for="(item, index) in noticeList" :key="index">
+                <view class="time-divider">{{ item.createTime }}</view>
+
+                <!-- 消息列表 -->
+                <view class="notice-item flex-d">
+                    <!-- 通知图标 -->
+                    <view class="flex-a notice-header">
+                        <image src="../static/notice.png" style="width: 44rpx; height: 44rpx"></image>
+                        <view class="notice-title">通知</view>
+                    </view>
+                    <!-- 通知内容 -->
+                    <view class="notice-content">
+                        <view class="notice-text">
+                            <text>{{ item.messageInfo }}</text>
+                            <!-- <text>\n您也可以随时在</text>
+                            <text class="notice-link" @click="goToOrder">【我的订单】</text>
+                            <text>中查看订单状态</text> -->
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </page-scroll>
+    </view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				noticeList: [{
-					id: 1,
-					type: 'notice',
-					content: '亲,您的订单已经收到,感谢您对我们的支持,我们将尽快为您发出',
-					time: '2024-10-16 23:32:28'
-				}],
-				page: 1,
-				pageSize: 10,
-				isRefreshing: false,
-				hasMore: true
-			}
-		},
-		onLoad() {
-			this.loadNotices()
-		},
-		methods: {
-			// 加载消息列表
-			loadNotices() {
-				// 模拟数据
-				const mockData = [{
-					id: 1,
-					type: 'notice',
-					content: '亲,您的订单已经收到,感谢您对我们的支持,我们将尽快为您发出',
-					time: '2024-10-16 23:32:28'
-				}]
-
-				// 实际开发时替换为接口调用
-				setTimeout(() => {
-					this.noticeList = [...this.noticeList, ...mockData]
-					this.hasMore = mockData.length === this.pageSize
-					this.isRefreshing = false
-				}, 500)
-			},
-
-			// 下拉刷新
-			onRefresh() {
-				this.isRefreshing = true
-				this.page = 1
-				this.noticeList = []
-				this.loadNotices()
-			},
-
-			// 加载更多
-			loadMore() {
-				if (!this.hasMore) return
-				this.page++
-				this.loadNotices()
-			},
-
-			// 跳转到订单页面
-			goToOrder() {
-				uni.navigateTo({
-					url: '/pages-mine/pages/order-page'
-				})
-			}
-		}
-	}
+import pageScroll from "@/components/pageScroll/index.vue";
+
+export default {
+    components: {
+        pageScroll,
+    },
+    data() {
+        return {
+            noticeList: [],
+        };
+    },
+    methods: {
+        // 处理列表更新
+        handleUpdateList(list = []) {
+            this.noticeList = list;
+        },
+
+        // 格式化时间
+        formatTime(time) {
+            if (!time) return "";
+            return time.replace("T", " ").substring(0, 19);
+        },
+
+        // 跳转到订单页面
+        goToOrder() {
+            uni.navigateTo({
+                url: "/pages-mine/pages/order-page",
+            });
+        },
+    },
+};
 </script>
 
 <style lang="scss" scoped>
-	.notice-page {
-		min-height: 100vh;
-		background-color: #F5F5F5;
-		padding: 20rpx 0;
-
-		.notice-scroll {
-			height: 100vh;
-		}
-
-		.time-divider {
-			text-align: center;
-			font-family: PingFang SC;
-			font-weight: 500;
-			font-size: 26rpx;
-			color: #333333;
-			padding: 20rpx 0;
-		}
-
-		.notice-item {
-			margin: 0 20rpx;
-			padding: 30rpx;
-			background: #FFFFFF;
-			border-radius: 12rpx;
-
-			.notice-icon {
-				margin-right: 20rpx;
-				padding-top: 6rpx;
-			}
-
-			.notice-header {
-				border-bottom: 1px solid #f8f8f8;
-				padding-bottom: 14rpx;
-			}
-
-			.notice-title {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: #333333;
-				padding-left: 10rpx;
-				font-family: PingFang SC;
-			}
-
-
-			.notice-content {
-				padding-top: 14rpx;
-				flex: 1;
-
-				.notice-text {
-					font-size: 28rpx;
-					color: #666666;
-					line-height: 1.6;
-
-					.notice-link {
-						color: #38C148;
-						padding: 0 4rpx;
-					}
-				}
-			}
-		}
-	}
-</style>
+.notice-page {
+    min-height: 100vh;
+    background-color: #f5f5f5;
+    padding: 20rpx 0;
+
+    .time-divider {
+        text-align: center;
+        font-family: PingFang SC;
+        font-weight: 500;
+        font-size: 26rpx;
+        color: #333333;
+        padding: 20rpx 0;
+    }
+
+    .notice-item {
+        margin: 0 20rpx;
+        padding: 30rpx;
+        background: #ffffff;
+        border-radius: 12rpx;
+
+        .notice-icon {
+            margin-right: 20rpx;
+            padding-top: 6rpx;
+        }
+
+        .notice-header {
+            border-bottom: 1px solid #f8f8f8;
+            padding-bottom: 14rpx;
+        }
+
+        .notice-title {
+            font-size: 30rpx;
+            font-weight: bold;
+            color: #333333;
+            padding-left: 10rpx;
+            font-family: PingFang SC;
+        }
+
+        .notice-content {
+            padding-top: 14rpx;
+            flex: 1;
+
+            .notice-text {
+                font-size: 28rpx;
+                color: #666666;
+                line-height: 1.6;
+
+                .notice-link {
+                    color: #38c148;
+                    padding: 0 4rpx;
+                }
+            }
+        }
+    }
+}
+</style>

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

@@ -66,7 +66,7 @@
 
         <!-- 底部操作栏 -->
         <view class="bottom-fixed-con detail-bottom flex-d">
-            <service-promise></service-promise>
+            <service-info></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>
@@ -100,7 +100,7 @@
 import OrderTimeline from '../components/order-timeline.vue'
 import BookList from '../components/book-list.vue'
 import ReturnNotice from '../components/return-notice.vue';
-import ServicePromise from '../components/service-promise.vue';
+import ServiceInfo from '@/pages/home/components/ServiceInfo.vue';
 import btnAction from '../mixin/btnAction';
 import OrderActions from '../components/order-actions.vue';
 import CommonDialog from '@/components/common-dialog.vue';
@@ -111,7 +111,7 @@ export default {
         OrderTimeline,
         BookList,
         ReturnNotice,
-        ServicePromise,
+        ServiceInfo,
         OrderActions,
         CommonDialog
     },
@@ -138,6 +138,10 @@ export default {
                 }
             })
         },
+        successFeedback() {
+            this.getOrderInfo()
+        },
+
         //获取订单信息
         getOrderInfo() {
             uni.$u.http.get('/token/order/getOrderDetail?orderId=' + this.orderId).then(res => {

+ 4 - 5
pages-mine/pages/partner/partner-apply.vue

@@ -48,7 +48,7 @@
         <view class="agreement">
             <u-checkbox v-model="agreement" shape="circle">
                 <text>我已阅读并同意</text>
-                <text class="agreement-link" @click="openAgreement">《书嗨用户协议》</text>
+                <text class="agreement-link" @click="goToAgreement">《书嗨用户协议》</text>
             </u-checkbox>
         </view>
 
@@ -160,11 +160,10 @@ export default {
             }, 1000);
         },
 
-        openAgreement() {
-            // 打开用户协议页面
+        goToAgreement() {
             uni.navigateTo({
-                url: "/pages/agreement/index",
-            });
+                url: '/pages-home/pages/user-agreement'
+            })
         },
 
         async submit() {

+ 39 - 21
pages-mine/pages/partner/partner-home.vue

@@ -146,26 +146,39 @@ export default {
                                 const adjustY = (y) => y * scale;
                                 const adjustSize = (size) => size * scale;
 
-                                // 绘制微信头像
-                                ctx.save();
-                                ctx.beginPath();
-                                ctx.arc(
-                                    adjustX(data.headImgPosX),
-                                    adjustY(data.headImgPosY),
-                                    adjustSize(20),
-                                    0,
-                                    2 * Math.PI
-                                );
-                                ctx.clip();
-                                let avatar = userInfo.imgPath || "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t11.png";
-                                ctx.drawImage(
-                                    avatar,
-                                    adjustX(data.headImgPosX),
-                                    adjustY(data.headImgPosY),
-                                    adjustSize(30),
-                                    adjustSize(30)
-                                );
-                                ctx.restore();
+                                let avatar =
+                                    userInfo.imgPath || "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t11.png";
+                                uni.downloadFile({
+                                    url: avatar,
+                                    success: (avatarRes) => {
+                                        console.log("头像下载成功:", avatarRes);
+                                        // 绘制微信头像
+                                        ctx.save();
+                                        ctx.beginPath();
+                                        // Adjust the position and size for the circular clipping path
+                                        const avatarRadius = adjustSize(15);
+                                        const avatarX = adjustX(data.headImgPosX);
+                                        const avatarY = adjustY(data.headImgPosY);
+                                        ctx.arc(
+                                            avatarX + avatarRadius,
+                                            avatarY + avatarRadius,
+                                            avatarRadius,
+                                            0,
+                                            2 * Math.PI
+                                        );
+                                        ctx.clip();
+
+                                        ctx.drawImage(
+                                            avatarRes.tempFilePath,
+                                            avatarX,
+                                            avatarY,
+                                            adjustSize(30), // Ensure the size matches the clipping path
+                                            adjustSize(30)
+                                        );
+                                        ctx.restore();
+                                        ctx.draw(true);
+                                    },
+                                });
 
                                 // 绘制微信昵称
                                 ctx.setFontSize(adjustSize(14));
@@ -173,7 +186,12 @@ export default {
 
                                 let nickName = userInfo.nickName || "书嗨";
                                 let canvasStr = `${nickName}邀请你加入书嗨合伙人`;
-                                ctx.fillText(canvasStr, adjustX(data.nickNamePosX), adjustY(data.nickNamePosY));
+
+                                let firstLine = canvasStr.slice(0, 16);
+                                let secondLine = canvasStr.slice(16);
+
+                                ctx.fillText(firstLine, adjustX(data.nickNamePosX), adjustY(data.nickNamePosY + 12));
+                                ctx.fillText(secondLine, adjustX(data.nickNamePosX), adjustY(data.nickNamePosY + 30));
 
                                 // 绘制二维码
                                 ctx.save(); // Save the current canvas state

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

@@ -57,7 +57,7 @@
 
         <!-- 底部操作栏 -->
         <view class="bottom-fixed-con detail-bottom flex-d">
-            <service-promise></service-promise>
+            <service-info></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>
@@ -72,7 +72,7 @@
 <script>
 import OrderTimeline from '../components/order-timeline.vue'
 import BookList from '../components/book-list.vue'
-import ServicePromise from '../components/service-promise.vue';
+import ServiceInfo from '@/pages/home/components/ServiceInfo.vue';
 import OrderReturnActions from '../components/order-return-actions.vue';
 import CommonDialog from '@/components/common-dialog.vue';
 
@@ -80,7 +80,7 @@ export default {
     components: {
         OrderTimeline,
         BookList,
-        ServicePromise,
+        ServiceInfo,
         OrderReturnActions,
         CommonDialog
     },

+ 205 - 0
pages-mine/pages/rules-for-sellbooks.vue

@@ -0,0 +1,205 @@
+<template>
+    <view class="rules-page" v-if="!loading">
+        <!-- 折叠面板 -->
+        <view class="collapse-container">
+            <u-collapse :accordion="true" @change="changeHandler">
+                <u-collapse-item
+                    v-for="(item, index) in faqList"
+                    :key="index"
+                    :title="item.subTitle"
+                    :index="index"
+                    :arrow="true"
+                    name="标题"
+                >
+                    <template #title>
+                        <view class="custom-title">
+                            <view class="number-circle">{{ index + 1 }}</view>
+                            <text class="title-text">{{ item.subTitle }}</text>
+                        </view>
+                    </template>
+                    <view class="collapse-content">
+                        <rich-text :nodes="item.subContent" class="rich-text-style"></rich-text>
+                    </view>
+                </u-collapse-item>
+            </u-collapse>
+        </view>
+
+        <!-- 空状态 -->
+        <view v-if="faqList.length === 0" class="empty-state">
+            <u-empty mode="data" text="暂无数据"></u-empty>
+        </view>
+
+        <!-- 客服按钮 -->
+        <view class="customer-service">
+            <button class="service-btn" open-type="contact">
+                <view class="service-title">在线客服</view>
+                <view class="service-time">需要帮助?联系在线客服,每日8:00-24:00在线</view>
+            </button>
+        </view>
+
+        <!-- 加载中 -->
+        <u-loading-page :loading="loading"></u-loading-page>
+    </view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            pageTitle: "卖书规则",
+            faqList: [], // FAQ列表数据
+            loading: false,
+        };
+    },
+    onLoad() {
+        this.getFaqData();
+    },
+    methods: {
+        // 获取FAQ数据
+        getFaqData() {
+            this.loading = true;
+            this.$u.http
+                .get("/token/getFaq")
+                .then((res) => {
+                    if (res.code === 200) {
+                        // 根据接口返回的数据结构进行处理
+                        this.pageTitle = res.data.title || "卖书规则";
+
+                        // 根据接口返回的数据结构处理
+                        if (res.data.subArticleList && res.data.subArticleList.length > 0) {
+                            this.faqList = res.data.subArticleList;
+                        } else {
+                            this.faqList = [];
+                        }
+                    } else {
+                        this.$u.toast(res.msg || "获取数据失败");
+                    }
+                })
+                .catch((err) => {
+                    console.error("获取FAQ数据失败", err);
+                    this.$u.toast("获取数据失败");
+                })
+                .finally(() => {
+                    this.loading = false;
+                });
+        },
+
+        // 折叠面板变化事件
+        changeHandler(index) {
+            console.log("当前打开的是第" + index + "个");
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.rules-page {
+    min-height: 100vh;
+    background-color: #f5f5f5;
+    padding: 20rpx 30rpx;
+    padding-bottom: 120rpx;
+}
+
+.rules-container {
+    padding: 30rpx;
+}
+
+.page-title {
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333;
+    margin-bottom: 30rpx;
+    text-align: center;
+}
+
+.collapse-container {
+    background-color: #f5f5f5;
+    overflow: hidden;
+}
+
+.custom-title {
+    display: flex;
+    align-items: center;
+    flex: 1;
+}
+
+.number-circle {
+    width: 40rpx;
+    height: 40rpx;
+    border-radius: 50%;
+    background-color: #38c148;
+    color: white;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 28rpx;
+    margin-right: 20rpx;
+    flex-shrink: 0;
+}
+
+.title-text {
+    font-size: 28rpx;
+    color: #333;
+    flex: 1;
+}
+
+.sub-content {
+    font-size: 26rpx;
+    color: #666;
+    line-height: 1.6;
+}
+
+.empty-state {
+    margin-top: 100rpx;
+}
+
+.customer-service {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    padding: 24rpx;
+    background-color: #fff;
+    box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
+    z-index: 10;
+    padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+}
+
+.service-btn {
+    width: 100%;
+    height: 90rpx;
+    line-height: 32rpx;
+    background-color: #4caf50;
+    color: white;
+    font-size: 36rpx;
+    border-radius: 10rpx;
+    text-align: center;
+    margin-bottom: 15rpx;
+    padding-top: 16rpx;
+}
+
+.service-time {
+    font-size: 22rpx;
+    color: #ffffff;
+    text-align: center;
+}
+.collapse-content {
+    color: #444444;
+    font-size: 28rpx;
+    padding: 10rpx 0;
+}
+.rich-text-style img {
+    width: 100%;
+    height: 100%;
+    border-radius: 10rpx;
+    margin-top: 10rpx;
+}
+
+/deep/ .u-collapse-item {
+    margin-bottom: 20rpx;
+    border-radius: 10rpx;
+    overflow: hidden;
+    background-color: #ffffff;
+    padding: 0 30rpx;
+}
+</style>

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

@@ -224,7 +224,6 @@ export default {
         flex: 1;
         background: #FFFFFF;
         border-radius: 12rpx;
-        padding: 20rpx 0;
 
         .value {
             display: flex;

+ 14 - 1
pages.json

@@ -22,7 +22,8 @@
             "style": {
                 "navigationBarTitleText": "我的",
                 "navigationBarBackgroundColor": "#38C148",
-                "navigationBarTextStyle": "white"
+                "navigationBarTextStyle": "white",
+                "navigationStyle": "custom"
             }
         },
         {
@@ -274,6 +275,12 @@
                     "style": {
                         "navigationBarTitleText": "订单明细"
                     }
+                },
+                {
+                    "path": "pages/rules-for-sellbooks",
+                    "style": {
+                        "navigationBarTitleText": "卖书规则"
+                    }
                 }
             ]
         },
@@ -308,6 +315,12 @@
                     "style": {
                         "navigationBarTitleText": "卖书订单提交成功"
                     }
+                },
+                {
+                    "path": "pages/user-agreement",
+                    "style": {
+                        "navigationBarTitleText": "用户协议"
+                    }
                 }
             ]
         }

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

@@ -12,7 +12,7 @@
 				</view>
 
 				<view class="flex flex-j-b flex-a-c">
-					<view class="book-price">回收价: ¥{{ recycleMoney }}</view>
+					<view class="book-price">回收价 <text style="font-weight: 600;color: #FF0000;margin-left: 8rpx;"> ¥{{ recycleMoney }}</text></view>
 					<u-number-box class="number-box" bg-color="#38c148" color="#ffffff" v-model="book.num" :min="1"
 						:max="book.maxNum||40" @blur="onQuantityChange" @minus="addReduceNum(-1)"
 						@plus="addReduceNum(1)"></u-number-box>

+ 139 - 0
pages/home/components/KindReminder.vue

@@ -0,0 +1,139 @@
+<template>
+    <u-popup v-model="showPopup" @close="closePopup" mode="center" border-radius="30" :width="width">
+        <view class="kind-reminder">
+            <view class="container-form">
+                <view class="icon-wrapper">
+                    <image src="/static/tabbar/home2.png" class="tip-icon"></image>
+                    <text class="tip-text">温馨提示</text>
+                </view>
+
+                <view class="content">
+                    <view class="reminder-text">
+                        卖书前请务必仔细阅读
+                    </view>
+                    <text class="highlight">《书嗨卖书答疑》</text>
+                </view>
+
+                <view class="footer">
+                    <button class="rule-btn" @click="handleViewRules">查看规则</button>
+                    <button class="start-btn" @click="handleStartSelling">开始卖书</button>
+                </view>
+            </view>
+        </view>
+    </u-popup>
+</template>
+
+<script>
+export default {
+    props: {
+        width: {
+            type: String,
+            default: "80%",
+        },
+    },
+    data() {
+        return {
+            showPopup: false,
+        };
+    },
+    methods: {
+        openPopup() {
+            this.showPopup = true;
+        },
+        closePopup() {
+            this.showPopup = false;
+        },
+        handleStartSelling() {
+            this.$emit("start");
+            this.closePopup();
+        },
+        handleViewRules() {
+            this.$emit("viewRules");
+            uni.navigateTo({
+                url: '/pages-mine/pages/rules-for-sellbooks'
+            });
+            this.closePopup();
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.kind-reminder {
+    background: #ffffff;
+    border-radius: 26rpx;
+    overflow: hidden;
+    padding: 16rpx;
+    background: linear-gradient(-90deg, #98e05f, #0de3ac);
+    .container-form {
+        background: #effcf3;
+        border-radius: 26rpx;
+        padding: 30rpx;
+        padding-bottom: 40rpx;
+    }
+
+    .icon-wrapper {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        margin-bottom: 20rpx;
+
+        .tip-icon {
+            width: 48rpx;
+            height: 48rpx;
+            margin-right: 10rpx;
+        }
+
+        .tip-text {
+            font-family: Source Han Sans CN;
+            font-weight: bold;
+            font-size: 36rpx;
+            color: #37c148;
+        }
+    }
+
+    .content {
+        padding: 20rpx 10rpx;
+        font-size: 32rpx;
+        color: #333333;
+        line-height: 48rpx;
+        text-align: center;
+        
+        .reminder-text {
+            font-size: 36rpx;
+            font-weight: 500;
+        }
+    }
+
+    .footer {
+        display: flex;
+        gap: 30rpx;
+        margin-top: 30rpx;
+        padding: 0 10rpx;
+
+        button {
+            height: 88rpx;
+            line-height: 88rpx;
+            font-size: 32rpx;
+            border: none;
+            border-radius: 10rpx;
+
+            &::after {
+                border: none;
+            }
+
+            &.rule-btn {
+                flex: 1;
+                background-color: rgba(56, 193, 72, 0.4);
+                color: #ffffff;
+            }
+
+            &.start-btn {
+                flex: 1;
+                background-color: #38c148;
+                color: #ffffff;
+            }
+        }
+    }
+}
+</style>

+ 1 - 1
pages/home/components/ScanBookList.vue

@@ -74,7 +74,7 @@
 			},
 			goToRules() {
 				uni.navigateTo({
-					url: '/pages/rules/index'
+					url: '/pages-mine/pages/rules-for-sellbooks'
 				})
 			},
 		}

+ 24 - 15
pages/home/components/ServiceGuarantee.vue

@@ -7,7 +7,7 @@
                 <!-- 免费退回 -->
                 <view class="guarantee-item">
                     <view class="item-header">
-                        <u-icon name="gift-fill" size="40" color="#333"></u-icon>
+                        <image src="/static/img/1-1.png" mode="widthFix" class="item-icon"></image>
                         <text class="item-title">免费退回</text>
                     </view>
                     <view class="item-desc">本单不合格书籍可免费退回,您可在订单审核完成后,提交申请退回。</view>
@@ -16,7 +16,7 @@
                 <!-- 24小时验 -->
                 <view class="guarantee-item">
                     <view class="item-header">
-                        <u-icon name="clock-fill" size="40" color="#333"></u-icon>
+                        <image src="/static/img/1-2.png" mode="widthFix" class="item-icon"></image>
                         <text class="item-title">24小时验</text>
                     </view>
                     <view class="item-desc">本单获得24小时验资格,订单将在"到仓签收"后24小时内验货完毕,未完成验货将获得3元补贴到余额,可随验货书款一起提现。</view>
@@ -25,7 +25,7 @@
                 <!-- 极速打款 -->
                 <view class="guarantee-item">
                     <view class="item-header">
-                        <u-icon name="rmb-circle-fill" size="40" color="#333"></u-icon>
+                        <image src="/static/img/1-3.png" mode="widthFix" class="item-icon"></image>
                         <text class="item-title">极速打款</text>
                     </view>
                     <view class="item-desc">余额提现后,将在24小时内到账。</view>
@@ -34,7 +34,7 @@
                 <!-- 卖亏必赔 -->
                 <view class="guarantee-item">
                     <view class="item-header">
-                        <u-icon name="shield-fill" size="40" color="#333"></u-icon>
+                        <image src="/static/img/1-4.png" mode="widthFix" class="item-icon"></image>
                         <text class="item-title">卖亏必赔</text>
                     </view>
                     <view class="item-desc">订单完成后15天内,若发现订单内所售书籍发生涨价,可以申请补差。</view>
@@ -67,13 +67,15 @@ export default {
 <style lang="scss">
 .popup-content {
     background: #FFFFFF;
-    padding: 40rpx;
+    padding: 30rpx;
     width: 600rpx;
+    border-radius: 20rpx;
+    padding-left: 46rpx;
 
     .popup-title {
-        font-size: 32rpx;
+        font-size: 34rpx;
         color: #333333;
-        font-weight: 500;
+        font-weight: 600;
         text-align: center;
         margin-bottom: 30rpx;
     }
@@ -87,33 +89,40 @@ export default {
                 align-items: center;
                 margin-bottom: 10rpx;
 
+                .item-icon {
+                    width: 28rpx;
+                    height: 28rpx;
+                }
+
                 .item-title {
-                    font-size: 28rpx;
+                    font-size: 30rpx;
                     color: #333333;
-                    font-weight: 500;
+                    font-weight: 600;
                     margin-left: 10rpx;
                 }
             }
 
             .item-desc {
                 font-size: 26rpx;
-                color: #666666;
+                color: #333333;
+                font-weight: 400;
                 line-height: 1.5;
-                padding-left: 50rpx;
             }
         }
     }
 
     .confirm-btn {
-        width: 100%;
-        height: 88rpx;
-        line-height: 88rpx;
-        background-color: #38C148;
+        width: 280rpx;
+        height: 80rpx;
+        line-height: 80rpx;
+        background-color: #4CD964;
         color: #FFFFFF;
         font-size: 32rpx;
         border-radius: 10rpx;
         border: none;
         margin-top: 20rpx;
+        margin-left: 50%;
+        transform: translateX(-50%);
     }
 }
 </style>

+ 81 - 0
pages/home/components/ServiceInfo.vue

@@ -0,0 +1,81 @@
+<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>
+                <text style="margin-left: 4rpx"> > </text>
+            </view>
+        </view>
+
+        <!-- 服务保障弹窗 -->
+        <ServiceGuarantee ref="serviceGuarantee" />
+    </view>
+</template>
+
+<script>
+import ServiceGuarantee from "./ServiceGuarantee.vue";
+
+export default {
+    components: {
+        ServiceGuarantee,
+    },
+    props: {
+        serviceList: {
+            type: Array,
+            default: () => [],
+        },
+    },
+    data() {
+        return {
+            serviceItems: [
+                {
+                    icon: "/static/img/1.png",
+                    text: "免费退回",
+                },
+                {
+                    icon: "/static/img/2.png",
+                    text: "24小时验",
+                },
+                {
+                    icon: "/static/img/3.png",
+                    text: "极速打款",
+                },
+                {
+                    icon: "/static/img/4.png",
+                    text: "卖亏必赔",
+                },
+            ],
+        };
+    },
+    methods: {
+        showServiceGuarantee() {
+            this.$refs.serviceGuarantee.openPopup();
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.service-icons {
+    display: flex;
+    justify-content: center;
+    padding: 14rpx;
+    background: #1f1303;
+    box-sizing: border-box;
+    gap: 14px;
+
+    .icon-item {
+        display: flex;
+        align-items: center;
+        font-family: Source Han Sans CN;
+        font-weight: 400;
+        font-size: 24rpx;
+        color: #fff6ed;
+    }
+}
+</style>

+ 3 - 3
pages/home/components/notScanned.vue

@@ -57,7 +57,7 @@
 						<text class="step-text">第三步</text>
 					</view>
 					<view class="step-title">审核到账</view>
-					<view class="step-desc">到账后15天内卖必赔</view>
+					<view class="step-desc">到账后15天内卖必赔</view>
 					<view class="collapse-header" @click="toggleCollapse('step3')">
 						<text class="collapse-title">什么是审核?</text>
 						<u-icon :name="collapseState.step3 ? 'arrow-up' : 'arrow-down'" size="14"
@@ -67,7 +67,7 @@
 			</view>
 
 			<view class="rule-list" v-if="collapseState.step3">
-				<text class="rule-item">1、书嗨会在收到您寄的卖书快递包裹后对书籍进行审核,审核的内容包卖书本的数量、种类和品相。</text>
+				<text class="rule-item">1、书嗨会在收到您寄的卖书快递包裹后对书籍进行审核,审核的内容包卖书本的数量、种类和品相。</text>
 				<text class="rule-item">2、书的品相将被分为品相良好和品相不通过</text>
 				<text class="rule-item">3、品相不通过的书籍会被拒收,首单可以在收到书款后48小时内申请免费退回拒收书籍,后续订单需要自付邮费。</text>
 			</view>
@@ -102,7 +102,7 @@
 			},
 			goToRules() {
 				uni.navigateTo({
-					url: '/pages/rules/index'
+					url: '/pages-mine/pages/rules-for-sellbooks'
 				})
 			},
 		}

+ 162 - 132
pages/home/index.vue

@@ -5,8 +5,12 @@
         </u-navbar>
 
         <not-scanned v-if="!bookList.length"></not-scanned>
-        <scan-book-list v-else @updateBooks="updateBooksList" @deleted="getLastOrder"
-            :bookList="bookList"></scan-book-list>
+        <scan-book-list
+            v-else
+            @updateBooks="updateBooksList"
+            @deleted="getLastOrder"
+            :bookList="bookList"
+        ></scan-book-list>
         <!-- 底部固定按钮 -->
         <view class="bottom-fixed">
             <view class="btn-wrap mb-20">
@@ -20,30 +24,27 @@
                 </button>
             </view>
 
-            <view class="flex-a flex-j-b pad-20" style="padding-top:0 ;" v-if="bookList.length">
-                <view class="left-info">
+            <view class="flex-a flex-j-b pad-20" style="padding-top: 0" v-if="bookList.length">
+                <view class="left-info" style="min-width: 194px;">
                     <view class="flex-a common-text">
-                        共<text class="color-red">{{ totalBooks }}</text>件
-                        预估回收价 <text class="color-red">¥{{ totalPrice || 0 }}</text>
+                        共<text class="color-red">{{ totalBooks }}</text
+                        >件 预估回收价 <text class="color-red">¥{{ totalPrice || 0 }}</text>
                     </view>
-                    <text class="common-text tip">*旧书预估价格满30元起收</text>
+                    <text class="common-text tip">*旧书预估价格满 {{ orderInfo.minOrderMoney }} 元起收</text>
                 </view>
 
-                <button class="scan-btn next-btn" @click="onNext">下一步</button>
+                <button class="scan-btn next-btn" @click="onNext" :disabled="isDisabled">下一步</button>
             </view>
 
-            <view class="service-icons" v-if="bookList.length">
-                <view class="icon-item" v-for="(item, index) in serviceItems" :key="index" @tap="showServiceGuarantee">
-                    <u-icon :name="item.icon" size="32" color="#FFF6ED"></u-icon>
-                    <text style="margin-left: 6rpx;">{{ item.text }}</text>
-                </view>
-            </view>
+            <service-info v-if="bookList.length" :serviceList="serviceList"></service-info>
         </view>
 
         <InputIsbn ref="isbnPopup" @submit="checkBookISBN" />
         <!-- 套装书说明弹窗 -->
         <CommonDialog ref="setBookDialog" title="套装书说明" :showCancel="false">
-            <text>套装书(ISBN码相同的系列书箱)只需扫描其中一册,扫码价即套装价。打包时请把所有单册统在一起或放在一个袋子里寄出。</text>
+            <text
+                >套装书(ISBN码相同的系列书箱)只需扫描其中一册,扫码价即套装价。打包时请把所有单册统在一起或放在一个袋子里寄出。</text
+            >
         </CommonDialog>
 
         <!-- 暂不回收弹窗 -->
@@ -53,206 +54,246 @@
 
         <!-- 暂无信息弹窗 -->
         <CommonDialog ref="noInfoDialog" title="暂无信息" :showCancel="false">
-            <text>抱歉,没有该书的信息,书会定期补充图书信息,请您过段时间再来试试~</text>
+            <text>抱歉,没有该书的信息,书会定期补充图书信息,请您过段时间再来试试~</text>
         </CommonDialog>
 
         <!-- 扫累了弹窗 -->
-        <CommonDialog ref="tiredDialog" title="暂不回收" :showCancel="false">
+        <CommonDialog ref="tiredDialog" title="温馨提示" :showCancel="false">
             <text>扫累了,休息休息吧~</text>
         </CommonDialog>
 
         <!-- 该书超出最大回收本数  maxAcceptDialog-->
-        <CommonDialog ref="maxAcceptDialog" title="提示" :showCancel="false">
+        <CommonDialog ref="maxAcceptDialog" title="温馨提示" :showCancel="false">
             <text>该书超出最大回收本数</text>
         </CommonDialog>
 
         <!-- 单个订单最多40本书  orderMaxNumDialog-->
-        <CommonDialog ref="orderMaxNumDialog" title="提示" :showCancel="false">
+        <CommonDialog ref="orderMaxNumDialog" title="温馨提示" :showCancel="false">
             <text>单个订单最多40本书</text>
         </CommonDialog>
+
+        <!-- 温馨提示弹窗 -->
+        <KindReminder ref="kindReminder" @start="handleStartSelling" @viewRules="handleViewRules" />
+
+        <view class="customer-service">
+            <button class="service-btn" open-type="contact">
+                <image src="/static/img/kf.png" mode="widthFix" style="width: 126rpx; height: 140rpx"></image>
+            </button>
+        </view>
     </view>
 </template>
 
 <script>
-import notScanned from './components/notScanned.vue'
-import InputIsbn from './components/InputIsbn.vue';
-import ScanBookList from './components/ScanBookList.vue';
-import CommonDialog from '@/components/common-dialog.vue';
+import notScanned from "./components/notScanned.vue";
+import InputIsbn from "./components/InputIsbn.vue";
+import ScanBookList from "./components/ScanBookList.vue";
+import CommonDialog from "@/components/common-dialog.vue";
+import KindReminder from "./components/KindReminder.vue";
+import ServiceInfo from "./components/ServiceInfo.vue";
 export default {
     components: {
         notScanned,
         InputIsbn,
         ScanBookList,
-        CommonDialog
+        CommonDialog,
+        KindReminder,
+        ServiceInfo,
     },
     data() {
         return {
+            orderInfo: {},
             collapseState: {
                 step1: false,
-                step3: false
+                step3: false,
             },
             scrollTop: 0,
             bookList: [],
-            serviceItems: [{
-                icon: 'gift',
-                text: '免费退回'
-            },
-            {
-                icon: 'clock',
-                text: '24小时验'
-            },
-            {
-                icon: 'rmb-circle',
-                text: '极速打款'
-            },
-            {
-                icon: 'shield',
-                text: '卖亏必赔'
-            }
-            ]
-        }
+            serviceList: [],
+        };
     },
     computed: {
         navbarBackground() {
             if (this.scrollTop > 0) {
-                return 'linear-gradient(180deg, #4CD964 0%, #5ff178 100%)'
+                return "linear-gradient(180deg, #4CD964 0%, #5ff178 100%)";
             }
-            return 'transparent'
+            return "transparent";
         },
         containerBg() {
-            return this.bookList.length > 0 ? 'linear-gradient(180deg, #4CD964 0%, #F8F8F8 25%)' :
-                'linear-gradient(180deg, #4CD964 0%, #ffffff 25%)'
+            return this.bookList.length > 0
+                ? "linear-gradient(180deg, #4CD964 0%, #F8F8F8 25%)"
+                : "linear-gradient(180deg, #4CD964 0%, #ffffff 25%)";
         },
         containerPb() {
-            return this.bookList.length > 0 ? '300rpx' : '110rpx'
+            return this.bookList.length > 0 ? "300rpx" : "110rpx";
         },
         totalBooks() {
-            return this.bookList.reduce((sum, book) => sum + (book.num || 1), 0)
+            return this.bookList.reduce((sum, book) => sum + (book.num || 1), 0);
         },
         totalPrice() {
-            return this.bookList.reduce((sum, book) => sum + book.recyclePrice * (book.num || 1), 0).toFixed(2)
-        }
+            return this.bookList.reduce((sum, book) => sum + book.recyclePrice * (book.num || 1), 0).toFixed(2);
+        },
+        isDisabled() {
+            return this.totalPrice < this.orderInfo.minOrderMoney;
+        },
     },
     onPageScroll(e) {
         this.$nextTick(() => {
-            this.scrollTop = e.scrollTop
-        })
+            this.scrollTop = e.scrollTop;
+        });
     },
     methods: {
         //提交
         onNext() {
-            let orderId = this.bookList[0].orderId
+            let orderId = this.orderInfo.orderId;
             //预提交
-            uni.$u.http.get('/token/order/preSubmit?orderId=' + orderId).then(res => {
+            uni.$u.http.get("/token/order/preSubmit?orderId=" + orderId).then((res) => {
                 if (res.code == 200) {
                     if (res.data.code == 1 || res.data.code == 2) {
                         uni.navigateTo({
-                            url: "/pages-home/pages/book-order"
-                        })
-                        uni.setStorageSync('orderId', orderId)
+                            url: "/pages-home/pages/book-order",
+                        });
+                        uni.setStorageSync("orderId", orderId);
                     } else {
                         uni.showToast({
-                            icon: 'none',
-                            title: res.msg
-                        })
+                            icon: "none",
+                            title: res.msg,
+                        });
                     }
                 } else {
                     uni.showToast({
-                        icon: 'none',
-                        title: res.msg
-                    })
+                        icon: "none",
+                        title: res.msg,
+                    });
                 }
-            })
+            });
         },
 
         updateBooksList(data) {
-            this.bookList = data
+            this.bookList = data;
         },
 
         toggleCollapse(step) {
-            this.$set(this.collapseState, step, !this.collapseState[step])
+            this.$set(this.collapseState, step, !this.collapseState[step]);
         },
         handleScan() {
             uni.scanCode({
-                scanType: ['barCode'],
+                scanType: ["barCode"],
                 success: (res) => {
-                    this.checkBookISBN(res.result)
+                    this.checkBookISBN(res.result);
                 },
                 fail: () => {
                     uni.showToast({
-                        title: '扫码失败',
-                        icon: 'none'
-                    })
-                }
-            })
+                        title: "扫码失败",
+                        icon: "none",
+                    });
+                },
+            });
         },
         checkBookISBN(isbn) {
-            uni.$u.http.get('/token/order/scanIsbn?isbn=' + isbn).then(res => {
+            uni.$u.http.get("/token/order/scanIsbn?isbn=" + isbn).then((res) => {
                 if (res.code == 200) {
-                    let code = res.data.code
+                    let code = res.data.code;
                     if (code == 1) {
-                        res.data.num = 1
-                        this.bookList.push(res.data)
+                        res.data.num = 1;
+                        res.data.recyclePrice = res.data.recycleMoney;
+                        this.bookList.push(res.data);
                     } else if (code == 2) {
-                        let item = this.bookList.find(v => v.isbn === isbn)
-                        item.num = item.num + 1
+                        let item = this.bookList.find((v) => v.isbn === isbn);
+                        item.num = item.num + 1;
                     } else {
-                        this.handleBookCode(res.data.code)
+                        this.handleBookCode(res.data.code);
                     }
                 }
-            })
+            });
         },
         //处理扫码之后不同的状态 0-扫码频繁 1-成功 2-本单已有该书,数量+1  3-没有该书 4-本书暂不回收 5-超过每单最大可卖数量  6-单个订单最多40本书
         handleBookCode(code) {
             if (code == 1) {
-                this.bookList.push()
+                this.bookList.push();
             }
-            let tempKeys = ['tiredDialog', '', '', 'noInfoDialog', "notAcceptDialog", 'maxAcceptDialog',
-                'orderMaxNumDialog'
-            ]
-            let key = tempKeys[code]
+            let tempKeys = [
+                "tiredDialog",
+                "",
+                "",
+                "noInfoDialog",
+                "notAcceptDialog",
+                "maxAcceptDialog",
+                "orderMaxNumDialog",
+            ];
+            let key = tempKeys[code];
             if (key) {
-                this.$refs[key].openPopup()
+                this.$refs[key].openPopup();
             }
         },
         //获取当前用户未提交订单 /api/token/order/lastOrder
         getLastOrder() {
-            uni.$u.http.get('/token/order/lastOrder').then(res => {
+            uni.$u.http.get("/token/order/lastOrder").then((res) => {
                 if (res.code == 200) {
-                    this.bookList = res.data?.orderDetailList ? res.data.orderDetailList.map(v => {
-                        v.orderId = res.data.orderId
-                        return v
-                    }) : []
+                    this.orderInfo = res.data;
+                    this.bookList = res.data?.orderDetailList
+                        ? res.data.orderDetailList.map((v) => {
+                              v.orderId = res.data.orderId;
+                              return v;
+                          })
+                        : [];
+                    this.serviceList = res.data.serviceList || [];
                 }
-            })
+            });
         },
 
         goToScannedBooks() {
             uni.navigateTo({
-                url: '/pages-home/pages/scaned-book'
-            })
+                url: "/pages-home/pages/scaned-book",
+            });
         },
         goToRules() {
             uni.navigateTo({
-                url: '/pages/rules/index'
-            })
-        },
-        showServiceGuarantee() {
-            this.$refs.serviceGuarantee.openPopup()
+                url: "/pages/rules/index",
+            });
         },
         goToInputISBN() {
-            this.$refs.isbnPopup.openPopup()
-        }
+            this.$refs.isbnPopup.openPopup();
+        },
+        handleStartSelling() {
+            // 标记已显示过温馨提示
+            uni.setStorageSync('kindReminderShown', true);
+        },
+        
+        handleViewRules() {
+            // 可以在这里添加额外的逻辑,如果需要的话
+        },
     },
     onShow() {
+        // 获取上一个订单
         setTimeout(() => {
-            this.getLastOrder()
-        }, 300)
-    }
-}
+            this.getLastOrder();
+        }, 300);
+        
+        // 显示温馨提示弹窗
+        if (!uni.getStorageSync('kindReminderShown')) {
+            this.$nextTick(() => {
+                this.$refs.kindReminder.openPopup();
+            });
+        }
+    },
+};
 </script>
 
 <style lang="scss" scoped>
+.customer-service {
+    position: fixed;
+    width: 126rpx;
+    height: 140rpx;
+    bottom: 20%;
+    right: 0;
+    z-index: 9;
+    z-index: 999;
+    button {
+        height: max-content;
+        background-color: transparent;
+        padding: 0;
+    }
+}
 .container {
     height: 100%;
     position: relative;
@@ -271,12 +312,11 @@ export default {
 
     padding-bottom: 130rpx;
 
-
     .nav-title {
         font-family: PingFang SC;
         font-weight: bold;
         font-size: 34rpx;
-        color: #FFFFFF;
+        color: #ffffff;
         padding-left: 40rpx;
     }
 }
@@ -288,7 +328,7 @@ export default {
     color: #999999;
 
     &.tip {
-        color: #FF8A4B;
+        color: #ff8a4b;
     }
 }
 
@@ -334,37 +374,27 @@ export default {
         }
 
         .isbn-btn {
-            background-color: #FFFFFF;
-            color: #4CD964;
-            border: 3rpx solid #4CD964;
+            background-color: #ffffff;
+            color: #4cd964;
+            border: 3rpx solid #4cd964;
         }
     }
 
     .scan-btn {
-        background-color: #4CD964;
-        color: #FFFFFF;
+        background-color: #4cd964;
+        color: #ffffff;
     }
 
     .next-btn {
         margin: 0;
         margin-left: 20rpx;
-    }
-}
-
-.service-icons {
-    display: flex;
-    justify-content: space-around;
-    padding: 14rpx;
-    background: #1F1303;
-    box-sizing: border-box;
 
-    .icon-item {
-        display: flex;
-        align-items: center;
-        font-family: Source Han Sans CN;
-        font-weight: 400;
-        font-size: 24rpx;
-        color: #FFF6ED;
+        &[aria-disabled="true"] {
+            background-color: #cccccc;
+            color: #ffffff;
+            opacity: 0.7;
+            cursor: not-allowed;
+        }
     }
 }
-</style>
+</style>

+ 76 - 16
pages/mine/index.vue

@@ -1,14 +1,23 @@
 <template>
     <view class="mine-page">
+        <!-- <u-navbar title="我的" bgColor="transparent" titleBold></u-navbar> -->
         <!-- 顶部用户信息 -->
         <view class="user-info">
             <view class="user-header" @tap="handleUpdateUserInfo">
                 <view class="user-avatar">
                     <image
                         class="avatar"
-                        :src="userInfo.imgPath || 'https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/logo3.png'"
+                        :src="userInfo.imgPath"
                         mode="aspectFill"
-                        style="width: 100%; height: 100%; display: block;"
+                        v-if="userInfo.imgPath"
+                        style="width: 100%; height: 100%; display: block"
+                    ></image>
+                    <image
+                        class="avatar"
+                        src="https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/logo3.png"
+                        mode="heightFix"
+                        v-else
+                        style="width: 100%; height: 116rpx; display: block; border-radius: 10%"
                     ></image>
                 </view>
                 <view class="user-detail">
@@ -125,22 +134,68 @@ export default {
                     key: "payNum",
                     path: "/pages-mine/pages/order-page?status=10",
                 },
-                { name: "申请退回", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/5.png", badge: 0, key: "refundNum", path: "/pages-mine/pages/apply-return" },
+                {
+                    name: "申请退回",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/5.png",
+                    badge: 0,
+                    key: "refundNum",
+                    path: "/pages-mine/pages/apply-return",
+                },
             ],
             tools: [
-                { name: "消息通知", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t1.png", path: "/pages-mine/pages/notice" },
+                {
+                    name: "消息通知",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t1.png",
+                    path: "/pages-mine/pages/notice",
+                },
                 { name: "我的收藏", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t2.png", path: "" },
                 { name: "我的足迹", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t3.png", path: "" },
-                { name: "我的地址", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t4.png", path: "/pages-mine/pages/address/list" },
+                {
+                    name: "我的地址",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t4.png",
+                    path: "/pages-mine/pages/address/list",
+                },
                 { name: "我的优惠券", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t5.png", path: "" },
-                { name: "联系客服", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t6.png", path: "/pages/tools/service" },
-                { name: "意见反馈", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t7.png", path: "/pages-mine/pages/feedback" },
-                { name: "到货提醒", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t8.png", path: "/pages/tools/arrival-notice" },
-                { name: "合伙人计划", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t9.png", path: "/pages-mine/pages/partner/partner-rule" },
-                { name: "买卖答疑", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t10.png", path: "/pages/tools/faq" },
-                { name: "关于书嗨", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t11.png", path: "/pages/tools/about" },
-                { name: "我的余额", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t12.png", path: "/pages-mine/pages/wallet" },
-                { name: "用户设置", icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t13.png", path: "/pages/tools/settings" },
+                {
+                    name: "联系客服",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t6.png",
+                    path: "/pages/tools/service",
+                },
+                {
+                    name: "意见反馈",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t7.png",
+                    path: "/pages-mine/pages/feedback",
+                },
+                {
+                    name: "到货提醒",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t8.png",
+                    path: "/pages/tools/arrival-notice",
+                },
+                {
+                    name: "合伙人计划",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t9.png",
+                    path: "/pages-mine/pages/partner/partner-rule",
+                },
+                {
+                    name: "买卖答疑",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t10.png",
+                    path: "/pages-mine/pages/rules-for-sellbooks",
+                },
+                {
+                    name: "关于书嗨",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t11.png",
+                    path: "/pages/tools/about",
+                },
+                {
+                    name: "我的余额",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t12.png",
+                    path: "/pages-mine/pages/wallet",
+                },
+                {
+                    name: "用户设置",
+                    icon: "https://shuhi.oss-cn-qingdao.aliyuncs.com/mini/t13.png",
+                    path: "/pages-mine/pages/setting",
+                },
             ],
         };
     },
@@ -199,7 +254,7 @@ export default {
             uni.$u.get("/token/getUserPartnerInfo").then((res) => {
                 if (res.code == 200) {
                     let { status } = res.data;
-                    if (status == -1) {
+                    if (status == -1 || status == 4) {
                         item.path = "/pages-mine/pages/partner/partner-rule";
                     } else if (status == 1) {
                         item.path = "/pages-mine/pages/partner/partner-home";
@@ -231,10 +286,15 @@ export default {
     background-color: #f5f5f5;
 
     .user-info {
-        background-color: #38c148;
+        background: url("/static/img/bg.png") no-repeat center center;
+        background-size: 100% 100%;
+        position: absolute;
+        top: 0;
+        left: 0;
         padding: 20rpx 50rpx 120rpx;
         color: #fff;
         position: relative;
+        padding-top: 160rpx;
 
         &::after {
             width: 140%;
@@ -328,7 +388,7 @@ export default {
     }
 
     .order-section {
-        margin: -80rpx 30rpx 20rpx;
+        margin: -90rpx 30rpx 20rpx;
         background: #fff;
         border-radius: 12rpx;
         padding: 30rpx;

BIN
static/img/1-1.png


BIN
static/img/1-2.png


BIN
static/img/1-3.png


BIN
static/img/1-4.png


BIN
static/img/1.png


BIN
static/img/2.png


BIN
static/img/3.png


BIN
static/img/4.png


BIN
static/img/bg.png


BIN
static/img/kf.png


BIN
static/img/no-data.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/common-dialog.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/img-swiper.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/loadmore.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/nav/dial-nav.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/navbar/navbar-search.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/navbar/navbar-top-search.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/no-data.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/pageScroll/index.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/search/search.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/select-reason.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/tag.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/title-operate.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookItem.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/BookListItem.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/PickupTimePicker.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/components/SubmitConfirm.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/book-order.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/order-success.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/scaned-book.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-home/pages/user-agreement.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/apply-reason.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/back-goods.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/back-status.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/select-goods-pop.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/after-sales/select-item.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/express/list.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-info.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-select-sku.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/goods-select.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/goods/submitBar.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/line-info-operate.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/navbar-tab-search.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/express-goods-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-goods-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-operate.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/order-status.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/orderdetail-goods-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/sel-coupon-popup.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-discounts.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-goods-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/components/order/submit-operate.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/apply-status.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/apply.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/back.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/components/setExpress.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/list.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/after-sales/success.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/goods/detail.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/detail.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/express.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/list.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/pay-result.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/pay.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/order/submit.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mall/pages/zone/zone.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/common/vendor.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/address-card.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/book-list.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/category-popup.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages-mine/components/city-picker.js.map


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio