Explorar o código

feat(订单): 新增极速退款与催发货功能并优化订单详情页

- 在订单列表页添加极速退款弹窗和催发货弹窗组件
- 新增退款详情页面,展示退款进度和操作按钮
- 扩展通用对话框组件,支持隐藏标题
- 重构商城API模块,移除旧接口并新增极速退款和退款详情接口
- 优化订单项组件,支持单本书展示和品相显示
- 更新开发环境API地址配置
- 推荐图书专题页面接入真实数据并添加分页加载
ylong hai 18 horas
pai
achega
173b00fab5

+ 1 - 1
.env.dev.js

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

+ 8 - 151
api/modules/mall.js

@@ -1,158 +1,12 @@
 export const useMallApi = (Vue, vm) => {
 	return {
-		// 查询商城轮播图
-		getMallSwiperAjax: () => vm.$u.post('/client/index/getBaseElementList',{element_type:1}),
-		// 2=按钮组(金刚区)
-		getMallMenuAjax: () => vm.$u.post('/client/index/getBaseElementList',{element_type:2}),
-		// 三图接口
-		getSelfElementListAjax: () => vm.$u.post('/client/index/getSelfElementList'),
-		// 查询分类
-		getCateListAjax: () => vm.$u.post('/client/index/getCateList'),
-				
-		// 获取购物车数量
-		getCartNumsAjax: () => vm.$u.post('/client/shop_cart/getCartNums'),
-		/**商品列表
-		 * id	否	string	商品id
-		 * title	否	string	书名
-		 * cate_id	否	string	分类列表中的id 不是分类列表中的cate_id
-		 * tags_type 是	string	标签类型: default=默认,hot=热门,recommend=推荐
-		 * price_sc 否	string	desc=降序 asc=升序 (不传默认综合排序)
-		 * sales_sc否	string	desc=降序 asc=升序 (不传默认综合排序)
-		 * page	否	int	页码
-		 **/
-		getGoodsListAjax: (json) => vm.$u.post('/client/shopGoods/getList',json),
-/* 		// 热门商品,便于维护,分开来写,同商品列表接口,tags_type字段传 host
-		getHotListAjax: (json) => vm.$u.post('/client/shopGoods/getList',{
-			...json,
-			tags_type:'hot',
-		}),
-		// 推荐商品,便于维护,分开来写,同商品列表接口,tags_type字段传 host
-		getRecommendListAjax: (json) => vm.$u.post('/client/shopGoods/getList',{
-			...json,
-			tags_type:'recommend',
-		}), */
-		
-		// 商品详情
-		getGoodsDetailAjax: (id) => vm.$u.post('/client/shopGoods/getGoodsDetail',{id:id}),
-		
-		// 提交订单
-		submitOrderAjax: (json) => vm.$u.post('/client/shop_order/submitOrder',json),
-		
-		// 发起支付
-		payAjax: (order_no) => vm.$u.post('/client/pay/pay',{order_no:order_no}),
-		
-		// 加入购物车
-		addCartAjax: (json) => vm.$u.post('/client/shop_cart/addCart',json),
-
 		// 新版加入购物车
 		addShopCartAjax: (json) => vm.$u.post('/token/shop/cart/add',json),
-		
-		// 购物车列表
-		getCartListAjax: (page) => vm.$u.post('/client/shop_cart/getCartList',{page:page}),
-		
-		// 变更购物车数量
-		updateCartNumsAjax: (json) => vm.$u.post('/client/shop_cart/updateCartNums',json),
-		
-		// 删除购物车商品
-		delCartGoodsAjax: (ids) => vm.$u.post('/client/shop_cart/delCartGoods',{cart_ids:ids}),
-		
-		/**
-		 * 提交购物车订单
-		 * address_id	地址id
-		 * cart_ids	购物车id串
-		 * remark	备注
-		 * user_coupon_id 用户优惠券id
-		 **/		
-		submitCartOrderAjax: (json) => vm.$u.post('/client/shop_order/submitCartOrder',json),
-		
-		/** 
-		 * 订单列表
-		 * status string	订单状态  不传则输出所有订单,10=待付款, 11=待发货, 12=待收货, 13=已完成,
-		 * page	int 页码
-		 **/		
-		getOrderListAjax: ({status,page}) => vm.$u.post('/client/shop_order/getOrderList',{status,page}),
-		
-		
-		/**
-		 * 订单详情
-		 * order_id int	订单id
-		 **/		
-		getOrderDetailAjax: (order_id) => vm.$u.post('/client/shop_order/getOrderDetail',{order_id:order_id}),
-		
-		/**
-		 * 取消订单
-		 * order_id int	订单id
-		 **/		
-		cancelOrderAjax: (order_id) => vm.$u.post('/client/shop_order/cancelOrder',{order_id:order_id}),
-		
-		/**
-		 * 申请售后
-		 * order_id int	订单id
-		 * order_detail_ids string	订单详情id串 用逗号隔开  1,2
-		 * refund_type int	售后类型:1=仅退款,2=退货
-		 * reason string	退款原因
-		 */		
-		refundOrderAjax: (json) => vm.$u.post('/client/shop_order/refundOrder',json),
-		
-		/**
-		 * 设置退货快递单号
-		 * order_detail_id int	订单详情id
-		 * expressCode string	快递单号
-		 **/		
-		setExpressCodeAjax: (json) => vm.$u.post('/client/shop_order/setExpressCode',json),
-
-		/**
-		 * 退款/售后订单列表
-		 * status string	订单状态: 不传则输出所有订单 10=待付款, 11=待发货, 12=待收货, 13=已完成,
-		 * page	int 页码
-		 * 
-		 *  返回事例: 子订单状态sub_status:
-		 * 10=正常(非售后订单),20=仅退款,21=卖家同意,22=卖家驳回,30=退货退款,
-		 * 31=卖家同意(用户填写退货单号),32=卖家驳回,33=等待卖家收货确认中,
-		 * 34=卖家确认收货,验货没问题金额已原路退回
-		 **/
-		getRefundOrderListAjax: (json) => vm.$u.post('/client/shop_order/getRefundOrderList',json),
-
-		/**
-		 * 查看物流
-		 * order_id int 订单id
-		 **/
-		getExpressDetailAjax: (order_id) => vm.$u.post('/client/shop_order/getExpressDetail',{order_id:order_id}),
-		
-		
-		/**确认收货 
-		 *		 order_id	是	int	订单id
-				order_detail_ids	是	string	确认收货的订单详情id串 多个用逗号隔开
-		 */
-		
-		orderConfirmAjax: (json) => vm.$u.post('/client/shop_order/orderConfirm',json),
-		
-		
-		
-		/**
-		 * 收藏商品列表 
-		 */
-		
-		collectionListAjax: (json) => vm.$u.post('/client/shopGoods/getCollectionList'),
-		
-		/**
-		 * 收藏/取消收藏商品列表 
-		 */
-		
-		collectonAjax: (id) => vm.$u.post('/client/shopGoods/collection',{goods_id:id}),
-		
-		/**
-		 * 批量删除收藏
-		 * ids :收藏列表id串,多个用逗号隔开
-		 **/
-		delCollectionAjax: (ids) => vm.$u.post('/client/shopGoods/delCollection',{ids:ids}),
-		
-		
-		/**
-		 * 售后详情
-		 * id :退款售后列表中的id
-		 **/
-		getRefundOrderDetailAjax: (id) => vm.$u.post('/client/shopOrder/getRefundOrderDetail',{id:id}),
+		// 极速退款
+		fastRefundAjax: (json) => vm.$u.post('/token/shop/order/fastRefund', json),
+	
+		// 售后详情 (新版)
+		getNewRefundOrderDetailAjax: (params) => vm.$u.get('/token/shop/order/getRefundOrderDetail', params),
 		
 		// 热门搜索列表
 		getHotSearchListAjax: () => vm.$u.get('/token/shop/user/hotSearchList'),
@@ -195,5 +49,8 @@ export const useMallApi = (Vue, vm) => {
 
         // 搜索推荐
         getSearchRecommendAjax: () => vm.$u.get('/token/shop/user/searchRecommend'),
+
+		// 根据专题id获取专题下的图书 (带分页)
+		getBookListByCateIdAjax: (params) => vm.$u.get('/token/shop/showIndex/getBookListByCateId', params),
 	}
 }

+ 5 - 1
components/common-dialog.vue

@@ -4,7 +4,7 @@
             <image v-if="bgImage" :src="bgImage" class="dialog-bg-image" mode="scaleToFill"></image>
             
             <!-- 标题 -->
-            <view v-if="title" class="dialog-title">{{ title }}</view>
+            <view v-if="title && showTitle" class="dialog-title">{{ title }}</view>
 
             <!-- 内容插槽 -->
             <view class="dialog-body">
@@ -28,6 +28,10 @@ export default {
             type: String,
             default: '580rpx'
         },
+        showTitle: {
+            type: Boolean,
+            default: true
+        },
         // 弹窗标题
         title: {
             type: String,

+ 275 - 154
pages-car/components/buy-order-item.vue

@@ -8,206 +8,327 @@
 
         <!-- 商品信息 -->
         <view class="goods-list">
-            <scroll-view scroll-x class="goods-scroll">
+            <scroll-view scroll-x class="goods-scroll" v-if="order.detailCoverList && order.detailCoverList.length > 0">
                 <view class="goods-wrapper">
                     <image v-for="(cover, index) in order.detailCoverList" :key="index" :src="cover || defaultCover"
                         mode="aspectFill" class="goods-cover"></image>
                 </view>
             </scroll-view>
+
+            <!-- 单本书样式 -->
+            <view class="single-book" v-else>
+                <image :src="order.bookCover || defaultCover" mode="aspectFit" class="book-cover"></image>
+                <view class="book-info">
+                    <view class="info-top">
+                        <text class="book-name u-line-2">{{ order.bookName }}</text>
+                        <view class="price-box">
+                            <text class="price">¥ {{ order.bookPrice || '0.00' }}</text>
+                            <text class="num">x{{ order.bookNum }}</text>
+                        </view>
+                    </view>
+                    <view class="book-sku" v-if="order.bookConditionType">
+                        品相:{{ qualityNames[order.bookConditionType] || '未知' }}
+                    </view>
+                </view>
+            </view>
         </view>
 
         <!-- 价格汇总 -->
         <view class="order-total">
-            <text>共{{ order.totalNum }}本</text>
+            <text class="ml-20">总价 ¥{{ order.totalMoney || 0 }}</text>
             <text class="ml-20">实付款 ¥{{ order.payMoney || 0 }}</text>
         </view>
 
         <!-- 操作按钮 -->
         <view class="action-box">
-            <!-- 修改地址 -->
-            <u-button v-if="order.showModifyAddress == 1" size="mini" shape="circle" plain :custom-style="btnStyle" @click.stop="handleAction('address')">修改地址</u-button>
-            
-            <!-- 投诉 -->
-            <u-button v-if="order.showComplaint == 1" size="mini" shape="circle" plain :custom-style="btnStyle" @click.stop="handleAction('complaint')">投诉</u-button>
-            
-            <!-- 申请开票 -->
-            <u-button v-if="order.showApplyInvoice == 1" size="mini" shape="circle" plain :custom-style="btnStyle" @click.stop="handleAction('invoice')">申请开票</u-button>
-            
+            <!-- 付款 (未包含在Flags中,保留原逻辑: 待付款且未取消) -->
+            <u-button v-if="order.status == '1' && order.cancelStatus == '0'" size="mini" shape="circle"
+                :custom-style="themeBtnStyle" @click.stop="handleAction('pay')">付款</u-button>
+
+            <!-- 确认收货 -->
+            <u-button v-if="order.showConfirmShop == 1" size="mini" shape="circle" :custom-style="themeBtnStyle"
+                @click.stop="handleAction('confirm')">确认收货</u-button>
+
+            <!-- 加入购物车 -->
+            <u-button v-if="order.showAddToCart == 1" size="mini" shape="circle" :custom-style="themeBtnStyle"
+                @click.stop="handleAction('addToCart')">加入购物车</u-button>
+
+            <!-- 再来一单 -->
+            <u-button v-if="order.showBuyAgain == 1" size="mini" shape="circle" type="primary" plain
+                :custom-style="btnStyle" @click.stop="handleAction('rebuy')">再买一单</u-button>
+
+            <!-- 评价 -->
+            <u-button v-if="order.showEvaluation == 1" size="mini" shape="circle" type="primary" plain
+                :custom-style="btnStyle" @click.stop="handleAction('evaluate')">评价</u-button>
+
+            <!-- 查看物流 -->
+            <u-button v-if="order.showCheckExpress == 1 && order.status != '4'" size="mini" shape="circle"
+                type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('logistics')">查看物流</u-button>
+
+            <!-- 延长收货 -->
+            <u-button v-if="order.showExtendReceivingTime == 1" size="mini" shape="circle" plain
+                :custom-style="btnStyle" @click.stop="handleAction('extend')">延长收货</u-button>
+
+            <!-- 催发货 -->
+            <u-button v-if="order.showUrge == 1" size="mini" shape="circle" type="warning" plain
+                :custom-style="btnStyle" @click.stop="handleAction('remind')">催发货</u-button>
+
+            <!-- 更多操作 (仅在已完成状态下显示) -->
+            <u-button v-if="order.status == '4'" size="mini" shape="circle" plain :custom-style="btnStyle"
+                @click.stop="handleMoreAction">更多</u-button>
+
+            <!-- 申请售后 -->
+            <u-button v-if="order.showAfterSales == 1 && order.status != '4'" size="mini" shape="circle" type="error"
+                plain :custom-style="btnStyle" @click.stop="handleAction('refund')">申请售后</u-button>
+
+            <!-- 取消订单 (未包含在Flags中,保留原逻辑: 待付款且未取消) -->
+            <u-button v-if="order.status == '1' && order.cancelStatus == '0'" size="mini" shape="circle" type="error"
+                plain :custom-style="btnStyle" @click.stop="handleAction('cancel')">取消订单</u-button>
+
+            <!-- 删除订单 (未包含在Flags中,保留原逻辑) -->
+            <u-button v-if="order.cancelStatus == '1'" size="mini" shape="circle" type="error" plain
+                :custom-style="btnStyle" @click.stop="handleAction('delete')">删除订单</u-button>
+
             <!-- 钱款去向 -->
-            <u-button v-if="order.showMoneyDestination == 1" size="mini" shape="circle" type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('moneyWhere')">钱款去向</u-button>
-            
+            <u-button v-if="order.showMoneyDestination == 1" size="mini" shape="circle" type="primary" plain
+                :custom-style="btnStyle" @click.stop="handleAction('moneyWhere')">钱款去向</u-button>
+
             <!-- 查看详情 -->
-            <u-button v-if="order.showShowDetail == 1" size="mini" shape="circle" type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('detail')">查看详情</u-button>
-            
-            <!-- 删除订单 (未包含在Flags中,保留原逻辑) -->
-            <u-button v-if="order.cancelStatus == '1'" size="mini" shape="circle" type="error" plain :custom-style="btnStyle" @click.stop="handleAction('delete')">删除订单</u-button>
-            
-            <!-- 取消订单 (未包含在Flags中,保留原逻辑: 待付款且未取消) -->
-            <u-button v-if="order.status == '1' && order.cancelStatus == '0'" size="mini" shape="circle" type="error" plain :custom-style="btnStyle" @click.stop="handleAction('cancel')">取消订单</u-button>
-            
-            <!-- 申请售后 -->
-            <u-button v-if="order.showAfterSales == 1" size="mini" shape="circle" type="error" plain :custom-style="btnStyle" @click.stop="handleAction('refund')">申请售后</u-button>
-            
-            <!-- 催发货 -->
-            <u-button v-if="order.showUrge == 1" size="mini" shape="circle" type="warning" plain :custom-style="btnStyle" @click.stop="handleAction('remind')">催发货</u-button>
-            
-            <!-- 延长收货 -->
-            <u-button v-if="order.showExtendReceivingTime == 1" size="mini" shape="circle" plain :custom-style="btnStyle" @click.stop="handleAction('extend')">延长收货</u-button>
-            
-            <!-- 查看物流 -->
-            <u-button v-if="order.showCheckExpress == 1" size="mini" shape="circle" type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('logistics')">查看物流</u-button>
-            
-            <!-- 评价 -->
-            <u-button v-if="order.showEvaluation == 1" size="mini" shape="circle" type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('evaluate')">评价</u-button>
-            
-            <!-- 再来一单 -->
-            <u-button v-if="order.showBuyAgain == 1" size="mini" shape="circle" type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('rebuy')">再买一单</u-button>
-            
-            <!-- 加入购物车 -->
-            <u-button v-if="order.showAddToCart == 1" size="mini" shape="circle" :custom-style="themeBtnStyle" @click.stop="handleAction('addToCart')">加入购物车</u-button>
-            
-            <!-- 确认收货 -->
-            <u-button v-if="order.showConfirmShop == 1" size="mini" shape="circle" :custom-style="themeBtnStyle" @click.stop="handleAction('confirm')">确认收货</u-button>
-            
-            <!-- 付款 (未包含在Flags中,保留原逻辑: 待付款且未取消) -->
-            <u-button v-if="order.status == '1' && order.cancelStatus == '0'" size="mini" shape="circle" :custom-style="themeBtnStyle" @click.stop="handleAction('pay')">付款</u-button>
+            <u-button v-if="order.showShowDetail == 1" size="mini" shape="circle" plain
+                :custom-style="btnStyle" @click.stop="handleAction('detail')">查看详情</u-button>
+
+            <!-- 申请开票 -->
+            <u-button v-if="order.showApplyInvoice == 1 && order.status != '4'" size="mini" shape="circle" plain
+                :custom-style="btnStyle" @click.stop="handleAction('invoice')">申请开票</u-button>
+
+            <!-- 投诉 -->
+            <u-button v-if="order.showComplaint == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+                @click.stop="handleAction('complaint')">投诉</u-button>
+
+            <!-- 修改地址 -->
+            <u-button v-if="order.showModifyAddress == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+                @click.stop="handleAction('address')">修改地址</u-button>
         </view>
     </view>
 </template>
 
 <script>
-export default {
-    props: {
-        order: {
-            type: Object,
-            required: true
-        }
-    },
-    data() {
-        return {
-            defaultCover: 'https://uviewui.com/album/1.jpg',
-            btnStyle: {
-                marginLeft: '20rpx',
-                height: '60rpx',
-                lineHeight: '60rpx',
-                padding: '0 24rpx',
-                fontSize:'26rpx',
-            },
-            themeBtnStyle: {
-                marginLeft: '20rpx',
-                height: '60rpx',
-                lineHeight: '60rpx',
-                padding: '0 30rpx',
-                backgroundColor: '#38C148',
-                color: '#fff',
-                fontSize:'26rpx',
+    export default {
+        props: {
+            order: {
+                type: Object,
+                required: true
             }
-        }
-    },
-    methods: {
-        goToDetail() {
-            uni.navigateTo({
-                url: `/pages-car/pages/order-detail?orderId=${this.order.orderId}`
-            })
         },
-        getStatusText(order) {
-            if (order.cancelStatus == '1') return '已取消';
-            if (order.refundStatus == '2') return '退款中';
-            if (order.refundStatus == '3') return '已退款';
-            
-            const map = {
-                '1': '待付款',
-                '2': '待发货',
-                '3': '待收货',
-                '4': '已完成'
+        data() {
+            return {
+                //1-良好 2-中等 3-次品 4-全新
+                qualityNames: {
+                    '1': '良好',
+                    '2': '中等',
+                    '3': '次品',
+                    '4': '全新',
+                },
+                defaultCover: 'https://uviewui.com/album/1.jpg',
+                btnStyle: {
+                    marginLeft: '20rpx',
+                    height: '60rpx',
+                    lineHeight: '60rpx',
+                    padding: '0 24rpx',
+                    fontSize: '26rpx',
+                },
+                themeBtnStyle: {
+                    marginLeft: '20rpx',
+                    height: '60rpx',
+                    lineHeight: '60rpx',
+                    padding: '0 30rpx',
+                    backgroundColor: '#38C148',
+                    color: '#fff',
+                    fontSize: '26rpx',
+                }
             }
-            return map[order.status] || '未知状态'
         },
-        handleAction(type, data) {
-            if (type === 'complaint') {
-                uni.setStorageSync('tempComplaintOrder', this.order);
+        methods: {
+            goToDetail() {
                 uni.navigateTo({
-                    url: `/pages-car/pages/complaint?orderId=${this.order.orderId}`
-                });
-                return;
+                    url: `/pages-car/pages/order-detail?orderId=${this.order.orderId}`
+                })
+            },
+            getStatusText(order) {
+                if (order.cancelStatus == '1') return '已取消';
+                if (order.refundStatus == '2') return '退款中';
+                if (order.refundStatus == '3') return '已退款';
+
+                const map = {
+                    '1': '待付款',
+                    '2': '待发货',
+                    '3': '待收货',
+                    '4': '已完成'
+                }
+                return map[order.status] || '未知状态'
+            },
+            handleAction(type, data) {
+                if (type === 'complaint') {
+                    uni.setStorageSync('tempComplaintOrder', this.order);
+                    uni.navigateTo({
+                        url: `/pages-car/pages/complaint?orderId=${this.order.orderId}`
+                    });
+                    return;
+                }
+                if (type === 'detail') {
+                    // 跳转至退款详情页
+                    const id = this.order.refundOrderId || this.order.orderId;
+                    uni.navigateTo({
+                        url: `/pages-car/pages/refund-detail?refundOrderId=${id}`
+                    });
+                    return;
+                }
+                this.$emit('action', { type, order: this.order, data })
+            },
+            handleMoreAction() {
+                // 收集更多按钮下的操作
+                const actions = [];
+                if (this.order.showAfterSales == 1) actions.push('applyAfterSales');
+                if (this.order.showCheckExpress == 1) actions.push('logistics');
+                if (this.order.showApplyInvoice == 1) actions.push('invoice');
+
+                this.$emit('action', { type: 'more', order: this.order, data: actions });
             }
-            this.$emit('action', { type, order: this.order, data })
         }
     }
-}
 </script>
 
 <style lang="scss" scoped>
-.buy-order-item {
-    background-color: #fff;
-    border-radius: 16rpx;
-    padding: 30rpx 20rpx;
-    margin-bottom: 20rpx;
-
-    .order-header {
-        display: flex;
-        justify-content: space-between;
+    .buy-order-item {
+        background-color: #fff;
+        border-radius: 16rpx;
+        padding: 30rpx 20rpx;
         margin-bottom: 20rpx;
-        font-size: 28rpx;
 
-        .order-no {
-            color: #333;
-            font-weight: 500;
-        }
+        .order-header {
+            display: flex;
+            justify-content: space-between;
+            margin-bottom: 20rpx;
+            font-size: 28rpx;
+
+            .order-no {
+                color: #333;
+                font-weight: 500;
+            }
 
-        .order-status {
-            color: #999;
+            .order-status {
+                color: #999;
+            }
         }
-    }
 
-    .goods-list {
-        margin-bottom: 20rpx;
+        .goods-list {
+            margin-bottom: 20rpx;
 
-        .goods-scroll {
-            width: 100%;
-            white-space: nowrap;
-        }
+            .goods-scroll {
+                white-space: nowrap;
+                width: 100%;
 
-        .goods-wrapper {
-            display: flex;
-        }
+                .goods-wrapper {
+                    display: flex;
+                }
 
-        .goods-cover {
-            width: 140rpx;
-            height: 170rpx;
-            border-radius: 8rpx;
-            margin-right: 20rpx;
-            background-color: #eee;
-            display: inline-block;
-        }
-    }
+                .goods-cover {
+                    width: 140rpx;
+                    height: 140rpx;
+                    margin-right: 20rpx;
+                    border-radius: 8rpx;
+                    flex-shrink: 0;
+                }
+            }
 
-    .order-total {
-        text-align: right;
-        font-size: 26rpx;
-        color: #333;
-        margin-bottom: 20rpx;
+            .single-book {
+                display: flex;
 
-        .ml-20 {
-            margin-left: 20rpx;
-            font-weight: 500;
-        }
-    }
+                .book-cover {
+                    width: 140rpx;
+                    height: 140rpx;
+                    margin-right: 10rpx;
+                    border-radius: 8rpx;
+                    flex-shrink: 0;
+                }
+
+                .book-info {
+                    flex: 1;
+                    display: flex;
+                    flex-direction: column;
+                    justify-content: space-between;
+
+                    .info-top {
+                        display: flex;
+                        justify-content: space-between;
+
+                        .book-name {
+                            flex: 1;
+                            font-size: 28rpx;
+                            color: #333;
+                            font-weight: bold;
+                            margin-right: 30rpx;
+                        }
+
+                        .price-box {
+                            text-align: right;
+                            display: flex;
+                            flex-direction: column;
+                            align-items: flex-end;
+
+                            .price {
+                                font-size: 28rpx;
+                                color: #333;
+                                font-weight: 500;
+                            }
+
+                            .num {
+                                font-size: 24rpx;
+                                color: #999;
+                                margin-top: 6rpx;
+                            }
+                        }
+                    }
 
-    .action-box {
-        display: flex;
-        justify-content: flex-end;
-        align-items: center;
-        flex-wrap: wrap; // 防止按钮过多换行问题
-        
-        u-button {
-             margin-bottom: 10rpx; // 如果换行,增加间距
+                    .book-sku {
+                        background: rgb(56, 193, 72, 0.1);
+                        color: #333;
+                        font-size: 24rpx;
+                        padding: 4rpx 12rpx;
+                        border-radius: 4rpx;
+                        align-self: flex-start;
+                        margin-top: 10rpx;
+                    }
+                }
+            }
         }
 
-        .status-desc {
+        .order-total {
+            text-align: right;
             font-size: 26rpx;
-            color: #999;
+            color: #333;
+            margin-bottom: 20rpx;
+
+            .ml-20 {
+                margin-left: 20rpx;
+                font-weight: 500;
+            }
+        }
+
+        .action-box {
+            display: flex;
+            justify-content: flex-end;
+            align-items: center;
+            flex-wrap: wrap; // 防止按钮过多换行问题
+
+            u-button {
+                margin-bottom: 10rpx; // 如果换行,增加间距
+            }
+
+            .status-desc {
+                font-size: 26rpx;
+                color: #999;
+            }
         }
     }
-}
 </style>

+ 111 - 0
pages-car/components/fast-refund-dialog.vue

@@ -0,0 +1,111 @@
+<template>
+    <common-dialog ref="refundDialog" :showTitle="false" :showFooter="false" :showCancel="false" width="620rpx"
+        :custom-style="{ padding: '0', borderRadius: '20rpx' }">
+        <view class="refund-dialog-box">
+            <view class="icon-area">
+                <u-icon name="checkmark-circle-fill" size="100" color="#ff9900"></u-icon>
+            </view>
+            <view class="refund-title">
+                尊敬的用户 您可享极速到账
+            </view>
+            <view class="refund-desc">
+                商品未发货,本次退款尊享未发秒退服务
+            </view>
+            <button class="confirm-refund-btn" @click="confirmRefund">
+                确认退款 ¥ {{ order ? order.payMoney : '0.00' }}
+            </button>
+        </view>
+    </common-dialog>
+</template>
+
+<script>
+    import CommonDialog from '@/components/common-dialog.vue';
+    export default {
+        components: {
+            CommonDialog
+        },
+        data() {
+            return {
+                order: null
+            };
+        },
+        methods: {
+            open(order) {
+                this.order = order;
+                this.$refs.refundDialog.openPopup();
+            },
+            closePopup() {
+                this.$refs.refundDialog.closePopup();
+            },
+            confirmRefund() {
+                if (!this.order) return;
+                this.$u.api.fastRefundAjax({
+                    orderId: this.order.orderId
+                }).then(res => {
+                    if (res.code == 200) {
+                        this.$u.toast('退款申请提交成功');
+                        this.closePopup();
+                        this.$emit('refresh');
+                    } else {
+                        this.$u.toast(res.msg || '退款申请失败');
+                    }
+                });
+            }
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .refund-dialog-box {
+        padding: 50rpx 40rpx 80rpx;
+        position: relative;
+        background: #fff;
+
+        .close-btn {
+            position: absolute;
+            top: 20rpx;
+            right: 20rpx;
+            padding: 10rpx;
+            z-index: 10;
+        }
+
+        .icon-area {
+            display: flex;
+            justify-content: center;
+            margin-bottom: 30rpx;
+        }
+
+        .refund-title {
+            font-size: 36rpx;
+            font-weight: bold;
+            color: #333;
+            margin-bottom: 20rpx;
+            text-align: center;
+        }
+
+        .refund-desc {
+            font-size: 26rpx;
+            color: #999;
+            margin-bottom: 50rpx;
+            text-align: center;
+        }
+
+        .confirm-refund-btn {
+            background: #333;
+            color: #FFE4B5;
+            font-size: 30rpx;
+            border-radius: 44rpx;
+            height: 88rpx;
+            line-height: 88rpx;
+            font-weight: 500;
+
+            &::after {
+                border: none;
+            }
+
+            &:active {
+                opacity: 0.9;
+            }
+        }
+    }
+</style>

+ 152 - 0
pages-car/components/urge-delivery-dialog.vue

@@ -0,0 +1,152 @@
+<template>
+    <common-dialog ref="urgeDialog" :showTitle="false" :showFooter="false" :showCancel="false" width="600rpx"
+        :custom-style="{ padding: '0', borderRadius: '20rpx' }">
+        <view class="urge-dialog-box">
+            <view class="icon-area">
+                <u-icon name="checkmark-circle-fill" size="100" color="#ff4500"></u-icon>
+            </view>
+            <view class="urge-title">
+                平台跟进发货中
+            </view>
+            <view class="urge-desc">
+                卖家应在{{ deadlineTime }}前发货,若超时未发货,平台客服将主动联系卖家处理,查看<text class="highlight">进度详情</text>
+            </view>
+
+            <view class="btn-group">
+                <button class="action-btn contact-btn" @click="handleContact">
+                    继续联系卖家
+                </button>
+                <button class="action-btn confirm-btn" @click="closePopup">
+                    我知道了
+                </button>
+            </view>
+        </view>
+    </common-dialog>
+</template>
+
+<script>
+    import CommonDialog from '@/components/common-dialog.vue';
+    export default {
+        components: {
+            CommonDialog
+        },
+        data() {
+            return {
+                order: null,
+                deadlineTime: ''
+            };
+        },
+        methods: {
+            open(order) {
+                this.order = order;
+                // 计算发货截止时间,这里假设是下单时间+48小时,如果有字段则直接使用
+                // 如果没有 createTime,则默认为当前时间+48小时
+                let baseTime = new Date();
+                if (order && order.createTime) {
+                    // 兼容处理 ios 时间格式
+                    baseTime = new Date(order.createTime.replace(/-/g, '/'));
+                }
+                // 加48小时
+                const deadline = new Date(baseTime.getTime() + 48 * 60 * 60 * 1000);
+                this.deadlineTime = this.formatDate(deadline);
+
+                this.$refs.urgeDialog.openPopup();
+            },
+            closePopup() {
+                this.$refs.urgeDialog.closePopup();
+            },
+            handleContact() {
+                // 联系卖家逻辑,目前仅提示
+                this.$u.toast('正在跳转联系卖家...');
+                this.closePopup();
+            },
+            formatDate(date) {
+                const month = (date.getMonth() + 1).toString().padStart(2, '0');
+                const day = date.getDate().toString().padStart(2, '0');
+                const hours = date.getHours().toString().padStart(2, '0');
+                const minutes = date.getMinutes().toString().padStart(2, '0');
+                return `${month}月${day}日 ${hours}:${minutes}`;
+            }
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .urge-dialog-box {
+        padding: 50rpx 40rpx 40rpx;
+        position: relative;
+        background: #fff;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        .close-btn {
+            position: absolute;
+            top: 20rpx;
+            right: 20rpx;
+            padding: 10rpx;
+            z-index: 10;
+        }
+
+        .icon-area {
+            margin-bottom: 30rpx;
+        }
+
+        .urge-title {
+            font-size: 36rpx;
+            font-weight: bold;
+            color: #333;
+            margin-bottom: 20rpx;
+            text-align: center;
+        }
+
+        .urge-desc {
+            font-size: 26rpx;
+            color: #666;
+            margin-bottom: 50rpx;
+            text-align: center;
+            line-height: 1.5;
+            padding: 0 20rpx;
+
+            .highlight {
+                color: #ff4500;
+                margin-left: 10rpx;
+            }
+        }
+
+        .btn-group {
+            display: flex;
+            width: 100%;
+            justify-content: space-between;
+
+            .action-btn {
+                flex: 1;
+                height: 80rpx;
+                line-height: 80rpx;
+                border-radius: 40rpx;
+                font-size: 28rpx;
+                font-weight: 500;
+                margin: 0 15rpx;
+
+                &::after {
+                    border: none;
+                }
+
+                &:active {
+                    opacity: 0.9;
+                }
+            }
+
+            .contact-btn {
+                background: #ffb800;
+                color: #fff;
+                flex: 1.5;
+            }
+
+            .confirm-btn {
+                background: #ff4500;
+                color: #fff;
+            }
+        }
+    }
+</style>

+ 18 - 4
pages-car/pages/my-order.vue

@@ -2,7 +2,8 @@
     <view class="my-order-page">
         <!-- 标签页 -->
         <view class="tabs-wrapper">
-            <u-tabs :list="tabList" :current="currentTab" @change="handleTabChange" active-color="#38C148" bar-width="60"></u-tabs>
+            <u-tabs :list="tabList" :current="currentTab" @change="handleTabChange" active-color="#38C148"
+                bar-width="60"></u-tabs>
         </view>
 
         <!-- 订单列表 -->
@@ -17,17 +18,27 @@
         <!-- 更多操作菜单 -->
         <u-action-sheet :list="actionSheetList" v-model="showActionSheet"
             @click="handleActionSheetClick"></u-action-sheet>
+
+        <!-- 极速退款弹窗 -->
+        <fast-refund-dialog ref="refundDialog" @refresh="loadOrders(true, params)"></fast-refund-dialog>
+        
+        <!-- 催发货弹窗 -->
+        <urge-delivery-dialog ref="urgeDialog"></urge-delivery-dialog>
     </view>
 </template>
 
 <script>
     import BuyOrderItem from '../components/buy-order-item.vue';
     import pageScroll from '@/components/pageScroll/index.vue';
+    import FastRefundDialog from '../components/fast-refund-dialog.vue';
+    import UrgeDeliveryDialog from '../components/urge-delivery-dialog.vue';
 
     export default {
         components: {
             BuyOrderItem,
-            pageScroll
+            pageScroll,
+            FastRefundDialog,
+            UrgeDeliveryDialog
         },
         data() {
             return {
@@ -117,9 +128,12 @@
                         }
                     });
                 } else if (type === 'remind') {
-                    uni.showToast({ title: '已提醒商家发货', icon: 'none' });
+                    // uni.showToast({ title: '已提醒商家发货', icon: 'none' });
+                    this.$refs.urgeDialog.open(order);
                 } else if (type === 'refund') {
-                    uni.showToast({ title: '进入极速退款/售后流程', icon: 'none' });
+                    if (order.status == '2') {
+                        this.$refs.refundDialog.open(order);
+                    }
                 } else if (type === 'confirm') {
                     uni.showModal({
                         title: '提示',

+ 456 - 0
pages-car/pages/refund-detail.vue

@@ -0,0 +1,456 @@
+<template>
+	<view class="refund-detail-page">
+		<!-- 状态头部 -->
+		<view class="status-header">
+			<template v-if="orderInfo.status == '1'">
+				<view class="status-title">请等待平台处理</view>
+				<!-- 倒计时 -->
+				<view class="status-desc" v-if="orderInfo.restAuditSecond > 0">
+					{{ formatCountDown(orderInfo.restAuditSecond) }}后平台未处理将自动同意
+				</view>
+				<view class="status-tip">您已成功发起退款申请,请耐心等待平台处理</view>
+			</template>
+			<template v-else>
+				<view class="status-title">{{ getStatusText(orderInfo.status) }}</view>
+				<!-- 退款成功金额展示 -->
+				<view class="refund-amount-box" v-if="orderInfo.status == '6' || orderInfo.status == '2'">
+					<view class="amount-row">
+						<text class="label">退回余额</text>
+						<text class="value">¥{{ orderInfo.refundMoney }}</text>
+					</view>
+				</view>
+			</template>
+		</view>
+
+		<!-- 商品列表 -->
+		<view class="info-card goods-card">
+			<view class="goods-item" v-for="(goods, index) in orderInfo.detailList" :key="index">
+				<image :src="goods.cover" mode="aspectFill" class="goods-cover"></image>
+				<view class="goods-info">
+					<view class="goods-title u-line-2">{{ goods.bookName }}</view>
+					<view class="goods-sku" v-if="goods.isbn">品相:{{ goods.conditionName || '默认' }}</view>
+					<view class="price-box">
+						<text class="price">¥{{ goods.price }}</text>
+						<text class="num">x{{ goods.refundNum }}</text>
+					</view>
+					<!-- 状态Badge -->
+					<view class="refund-status-tag red-tag" v-if="orderInfo.status == '1'">
+						<text>退款中</text>
+					</view>
+					<view class="refund-status-tag" v-if="orderInfo.status == '6'">退款成功</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 退款信息 (包含协商历史) -->
+		<view class="info-card detail-card">
+			<!-- 协商历史 -->
+			<view class="row history-row" @click="goToHistory">
+				<text class="label">协商历史</text>
+				<view class="value flex-row link-text">
+					<text>查看</text>
+					<!-- <u-icon name="arrow-right" color="#38C148" size="24"></u-icon> -->
+					<image src="/static/images/arrow-right-green.png" style="width: 24rpx; height: 24rpx;" v-if="false"></image> 
+					<!-- 使用文字或默认图标 -->
+					<u-icon name="lightning-fill" color="#38C148" size="28" style="margin-left: 6rpx;"></u-icon>
+				</view>
+			</view>
+			
+			<view class="row">
+				<text class="label">退款原因</text>
+				<text class="value">{{ orderInfo.refundReason }}</text>
+			</view>
+			<view class="row">
+				<text class="label">申请金额</text>
+				<text class="value">共{{ orderInfo.refundMoney }}元</text>
+			</view>
+			<view class="row">
+				<text class="label">申请时间</text>
+				<text class="value">{{ orderInfo.createTime }}</text>
+			</view>
+			<view class="row">
+				<text class="label">退款编号</text>
+				<view class="value flex-row">
+					<text>{{ orderInfo.refundOrderId }}</text>
+					<u-icon name="copy" size="28" color="#333" style="margin-left: 10rpx;" @click="copyOrderNo"></u-icon>
+				</view>
+			</view>
+		</view>
+
+		<!-- 底部操作栏 -->
+		<view class="bottom-bar" v-if="showBottomBar">
+			<view class="service-btn" @click="contactService">
+				<!-- 假设有一个客服图标 -->
+				<u-icon name="server-man" size="60" color="#666"></u-icon>
+			</view>
+			<view class="btn-group">
+				<u-button v-if="orderInfo.showComplaint == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+					@click="handleAction('complaint')">投诉</u-button>
+				
+				<u-button v-if="orderInfo.showCancel == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+					@click="handleAction('cancel')">撤销申请</u-button>
+				
+				<u-button v-if="orderInfo.showModifyApply == 1" size="mini" shape="circle" type="success" :custom-style="primaryBtnStyle"
+					@click="handleAction('modify')">修改申请</u-button>
+					
+				<u-button v-if="orderInfo.showClose == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+					@click="handleAction('close')">关闭退款</u-button>
+			</view>
+		</view>
+		
+		<!-- 占位符 -->
+		<view style="height: 120rpx;" v-if="showBottomBar"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				refundOrderId: '',
+				orderInfo: {
+					status: '',
+					restAuditSecond: 0,
+					detailList: [],
+					refundMoney: 0,
+					refundReason: '',
+					createTime: '',
+					refundOrderId: '',
+					showCancel: 0,
+					showModifyApply: 0,
+					showComplaint: 0,
+					showClose: 0
+				},
+				timer: null,
+				btnStyle: {
+					marginLeft: '20rpx',
+					minWidth: '160rpx',
+					height: '64rpx',
+					lineHeight: '64rpx',
+					padding: '0 20rpx',
+					color: '#666',
+					borderColor: '#ccc'
+				},
+				primaryBtnStyle: {
+					marginLeft: '20rpx',
+					minWidth: '160rpx',
+					height: '64rpx',
+					lineHeight: '64rpx',
+					padding: '0 20rpx',
+					backgroundColor: '#38C148',
+					color: '#fff',
+					border: 'none'
+				}
+			};
+		},
+		computed: {
+			showBottomBar() {
+				const { showCancel, showModifyApply, showComplaint, showClose } = this.orderInfo;
+				return showCancel == 1 || showModifyApply == 1 || showComplaint == 1 || showClose == 1;
+			}
+		},
+		onLoad(options) {
+			if (options.refundOrderId) {
+				this.refundOrderId = options.refundOrderId;
+				this.getDetail();
+			} else if (options.orderId) {
+				// 兼容处理:如果传入的是 orderId,尝试通过 orderId 获取退款单(如果后端支持)
+				// 或者提示错误
+				// 假设暂时用 refundOrderId
+				this.refundOrderId = options.orderId; // 尝试用这个ID
+				this.getDetail();
+			}
+		},
+		onUnload() {
+			if (this.timer) clearInterval(this.timer);
+		},
+		methods: {
+			getDetail() {
+				this.$u.api.getNewRefundOrderDetailAjax({
+					refundOrderId: this.refundOrderId
+				}).then(res => {
+					if (res.code == 200) {
+						this.orderInfo = res.data;
+						if (this.orderInfo.restAuditSecond > 0) {
+							this.startTimer();
+						}
+					}
+				});
+			},
+			getStatusText(status) {
+				// 状态 1-申请退款 2-审核通过 3-审核驳回 4-超时关闭 5-卖家已发货 6-已完成
+				const map = {
+					'1': '待卖家处理',
+					'2': '审核通过',
+					'3': '审核驳回',
+					'4': '退款关闭', // 超时关闭
+					'5': '卖家已发货', // 可能是换货场景
+					'6': '退款成功'
+				};
+				return map[status] || '处理中';
+			},
+			formatCountDown(seconds) {
+				if (seconds <= 0) return '0分';
+				const d = Math.floor(seconds / 86400);
+				const h = Math.floor((seconds % 86400) / 3600);
+				const m = Math.floor((seconds % 3600) / 60);
+				
+				let str = '';
+				if (d > 0) str += `${d}天`;
+				if (h > 0) str += `${h}时`;
+				if (m > 0) str += `${m}分`;
+				if (!str) str = '即将';
+				return str;
+			},
+			startTimer() {
+				if (this.timer) clearInterval(this.timer);
+				this.timer = setInterval(() => {
+					if (this.orderInfo.restAuditSecond > 0) {
+						this.orderInfo.restAuditSecond--;
+					} else {
+						clearInterval(this.timer);
+						// 倒计时结束,刷新页面
+						this.getDetail();
+					}
+				}, 1000);
+			},
+			copyOrderNo() {
+				uni.setClipboardData({
+					data: String(this.orderInfo.refundOrderId || ''),
+					success: () => {
+						uni.showToast({ title: '复制成功', icon: 'none' });
+					}
+				});
+			},
+			goToHistory() {
+				// 跳转协商历史页面 (如果有)
+				uni.showToast({ title: '协商历史功能开发中', icon: 'none' });
+			},
+			contactService() {
+				// 联系客服
+				uni.navigateTo({
+					url: '/pages/service/index'
+				});
+			},
+			handleAction(type) {
+				switch (type) {
+					case 'cancel':
+						// 撤销申请逻辑
+						uni.showModal({
+							title: '提示',
+							content: '确定要撤销退款申请吗?',
+							success: (res) => {
+								if (res.confirm) {
+									// 调用撤销接口 (需确认接口名)
+									// 假设: cancelRefundAjax
+									uni.showToast({ title: '撤销申请', icon: 'none' });
+								}
+							}
+						});
+						break;
+					case 'modify':
+						// 修改申请
+						uni.showToast({ title: '修改申请', icon: 'none' });
+						break;
+					case 'complaint':
+						// 投诉
+						uni.navigateTo({
+							url: `/pages-car/pages/complaint?orderId=${this.orderInfo.orderId}`
+						});
+						break;
+					case 'close':
+						// 关闭退款
+						uni.showToast({ title: '关闭退款', icon: 'none' });
+						break;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.refund-detail-page {
+		min-height: 100vh;
+		background-color: #F5F5F5;
+		padding-bottom: 20rpx;
+		
+		.status-header {
+			background-color: #fff;
+			padding: 40rpx 30rpx;
+			text-align: center;
+			margin-bottom: 20rpx;
+			
+			.status-title {
+				font-size: 36rpx;
+				font-weight: bold;
+				color: #333;
+				margin-bottom: 20rpx;
+			}
+			
+			.status-desc {
+				font-size: 26rpx;
+				color: #999;
+				margin-bottom: 10rpx;
+			}
+			
+			.status-tip {
+				font-size: 24rpx;
+				color: #999;
+			}
+			
+			.refund-amount-box {
+				margin-top: 30rpx;
+				border-top: 1rpx solid #eee;
+				padding-top: 30rpx;
+				
+				.amount-row {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					font-size: 30rpx;
+					
+					.label {
+						color: #333;
+					}
+					
+					.value {
+						color: #333;
+						font-weight: bold;
+					}
+				}
+			}
+		}
+		
+		.info-card {
+			background-color: #fff;
+			margin: 20rpx;
+			border-radius: 16rpx;
+			padding: 30rpx;
+			
+			&.goods-card {
+				.goods-item {
+					display: flex;
+					margin-bottom: 20rpx;
+					
+					&:last-child {
+						margin-bottom: 0;
+					}
+					
+					.goods-cover {
+						width: 140rpx;
+						height: 140rpx;
+						border-radius: 8rpx;
+						margin-right: 20rpx;
+						flex-shrink: 0;
+					}
+					
+					.goods-info {
+						flex: 1;
+						position: relative;
+						
+						.goods-title {
+							font-size: 28rpx;
+							color: #333;
+							margin-bottom: 10rpx;
+						}
+						
+						.goods-sku {
+							font-size: 24rpx;
+							color: #999;
+							margin-bottom: 10rpx;
+						}
+						
+						.price-box {
+							display: flex;
+							justify-content: space-between;
+							align-items: center;
+							
+							.price {
+								font-size: 28rpx;
+								color: #333;
+							}
+							
+							.num {
+								font-size: 24rpx;
+								color: #999;
+							}
+						}
+						
+						.refund-status-tag {
+							position: absolute;
+							right: 0;
+							top: 50%; // Adjust as needed
+							transform: translateY(-50%);
+							font-size: 24rpx;
+							color: #999;
+							
+							&.red-tag {
+								color: #ff3b30;
+								border: 1rpx solid #ff3b30;
+								padding: 2rpx 10rpx;
+								border-radius: 6rpx;
+								font-size: 22rpx;
+							}
+						}
+					}
+				}
+			}
+			
+			&.detail-card {
+				.row {
+					display: flex;
+					justify-content: space-between;
+					margin-bottom: 20rpx;
+					font-size: 26rpx;
+					
+					&:last-child {
+						margin-bottom: 0;
+					}
+					
+					.label {
+						color: #999;
+					}
+					
+					.value {
+						color: #333;
+						
+						&.flex-row {
+							display: flex;
+							align-items: center;
+						}
+						
+						&.link-text {
+							color: #38C148; // 使用主题色
+							display: flex;
+							align-items: center;
+						}
+					}
+				}
+			}
+		}
+		
+		.bottom-bar {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			background-color: #fff;
+			padding: 20rpx 30rpx;
+			padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.05);
+			z-index: 100;
+			
+			.service-btn {
+				padding: 10rpx;
+			}
+			
+			.btn-group {
+				display: flex;
+				align-items: center;
+			}
+		}
+	}
+</style>

+ 96 - 56
pages-sell/pages/recommend.vue

@@ -7,23 +7,24 @@
         <!-- Custom Navbar -->
         <Navbar title="推荐图书专题"></Navbar>
 
-        <!-- Header Content -->
-        <view class="header-content">
-            <image class="header-image" :src="imageUrl" mode="aspectFill"></image>
-            <view class="header-desc">
-                <view class="title-row">
-                    <text class="title-text">山河岁月</text>
-                    <image class="share-icon" src="/pages-sell/static/recommend/icon-share.png" mode="aspectFit"></image>
-                </view>
-                <text class="desc-text">《命若等弦》是一部微文集,作者是史铁生.作者史铁生曾发去文学作品《我的还远的清平湾》、《奶奶的星星》、《我与地坛》等。在这部书坐,他用残缺的身体。</text>
-            </view>
-        </view>
+		<!-- Header Content -->
+		<view class="header-content">
+			<image class="header-image" :src="imageUrl" mode="aspectFill"></image>
+			<view class="header-desc">
+				<view class="title-row">
+					<text class="title-text">{{ showName }}</text>
+					<image class="share-icon" src="/pages-sell/static/recommend/icon-share.png" mode="aspectFit"></image>
+				</view>
+				<text class="desc-text">{{ remark }}</text>
+			</view>
+		</view>
 
-        <!-- List Content -->
-        <view class="list-container">
-            <recommend-item v-for="(item, index) in bookList" :key="index" :item="item"></recommend-item>
-        </view>
-    </view>
+		<!-- List Content -->
+		<view class="list-container">
+			<recommend-item v-for="(item, index) in bookList" :key="index" :item="item"></recommend-item>
+			<u-loadmore :status="loadStatus" margin-top="30" margin-bottom="30"></u-loadmore>
+		</view>
+	</view>
 </template>
 
 <script>
@@ -31,46 +32,85 @@ import RecommendItem from '../components/recommend-item/index.vue'
 import Navbar from '@/components/navbar/navbar.vue';
 
 export default {
-    components: {
-        RecommendItem,
-        Navbar
-    },
-    data() {
-        return {
-            imageUrl: "https://img.yzcdn.cn/vant/cat.jpeg",
-            bookList: [
-                {
-                    title: '山河岁月',
-                    author: '本书编写组',
-                    price: '6.80',
-                    originalPrice: '36.80',
-                    cover: 'https://img.yzcdn.cn/vant/cat.jpeg', // Placeholder or use local if available
-                    desc: '《命若琴弦》是一部微文集,作者是史铁生。作者史铁生曾发表文学作品《我的遥远的清平湾》、《奶奶的星星》、《我与地坛》等。在这部书坐,他用残缺的身体,说出了最为健全而丰满的思想。他体验到的是生命的苦难,去达出的却是存在的明朗和欢乐。他喜智的言辞,照亮的反而是我们日益围暗的内心。'
-                },
-                {
-                    title: '山河岁月',
-                    author: '本书编写组',
-                    price: '6.80',
-                    originalPrice: '36.80',
-                    cover: 'https://img.yzcdn.cn/vant/cat.jpeg',
-                    desc: '《命若琴弦》是一部微文集,作者是史铁生。作者史铁生曾发表文学作品《我的遥远的清平湾》、《奶奶的星星》、《我与地坛》等。在这部书坐,他用残缺的身体,说出了最为健全而丰满的思想。他体验到的是生命的苦难,去达出的却是存在的明朗和欢乐。他喜智的言辞,照亮的反而是我们日益围暗的内心。'
-                },
-                {
-                    title: '山河岁月',
-                    author: '本书编写组',
-                    price: '6.80',
-                    originalPrice: '36.80',
-                    cover: 'https://img.yzcdn.cn/vant/cat.jpeg',
-                    desc: '《命若琴弦》是一部微文集,作者是史铁生。作者史铁生曾发表文学作品《我的遥远的清平湾》、《奶奶的星星》、《我与地坛》等。在这部书坐,他用残缺的身体,说出了最为健全而丰满的思想。他体验到的是生命的苦难,去达出的却是存在的明朗和欢乐。他喜智的言辞,照亮的反而是我们日益围暗的内心。'
-                }
-            ]
-        }
-    },
-    methods: {
-        goBack() {
-            uni.navigateBack();
-        }
-    }
+	components: {
+		RecommendItem,
+		Navbar
+	},
+	data() {
+		return {
+			cateId: '',
+			pageNum: 1,
+			pageSize: 10,
+			loadStatus: 'loadmore',
+			
+			imageUrl: "",
+			showName: "",
+			remark: "",
+			bookList: []
+		}
+	},
+	onLoad(options) {
+		if(options.cateId || options.id) {
+			this.cateId = options.cateId || options.id;
+			this.loadData();
+		}
+	},
+	onReachBottom() {
+		if(this.loadStatus == 'loadmore') {
+			this.loadData();
+		}
+	},
+	methods: {
+		loadData() {
+			this.loadStatus = 'loading';
+			this.$u.api.getBookListByCateIdAjax({
+				cateId: this.cateId,
+				pageNum: this.pageNum,
+				pageSize: this.pageSize
+			}).then(res => {
+				if(res.code == 200) {
+					const data = res.data;
+					// Update header info (only needed on first page, but safe to update every time or check pageNum)
+					if(this.pageNum == 1) {
+						this.imageUrl = data.imgUrl;
+						this.showName = data.showName;
+						this.remark = data.remark;
+						this.bookList = [];
+					}
+					
+					const list = data.bookPageList.rows.map(item => {
+						return {
+							title: item.bookName,
+							author: '', // API doesn't return author currently
+							price: item.bookPrice,
+							originalPrice: item.bookOriginalPrice,
+							cover: item.bookImg,
+							desc: item.bookShortReview,
+							// Pass other props if needed by item component
+							id: item.bookId || item.id, // Assuming there might be an ID
+							isbn: item.bookIsbn
+						}
+					});
+					
+					this.bookList = [...this.bookList, ...list];
+					
+					if(this.bookList.length >= data.bookPageList.total) {
+						this.loadStatus = 'nomore';
+					} else {
+						this.loadStatus = 'loadmore';
+						this.pageNum++;
+					}
+				} else {
+					this.loadStatus = 'nomore';
+				}
+			}).catch(() => {
+				this.loadStatus = 'nomore';
+			});
+		},
+		goBack() {
+			uni.navigateBack();
+		}
+	}
 }
 </script>
 

+ 6 - 0
pages.json

@@ -362,6 +362,12 @@
                     "style": {
                         "navigationBarTitleText": "订单投诉"
                     }
+                },
+                {
+                    "path": "pages/refund-detail",
+                    "style": {
+                        "navigationBarTitleText": "订单详情"
+                    }
                 }
             ]
         },