From 131a28347f2c3ce272f61fce425a6eea4fa5e51c Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期五, 18 九月 2026 15:01:10 +0800
Subject: [PATCH] 更新....

---
 rencaika_merchant/pages/product-detail/product-detail.uvue |   34 ++++++++++++++++++++++++----------
 1 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/rencaika_merchant/pages/product-detail/product-detail.uvue b/rencaika_merchant/pages/product-detail/product-detail.uvue
index e40e878..1a6f97b 100644
--- a/rencaika_merchant/pages/product-detail/product-detail.uvue
+++ b/rencaika_merchant/pages/product-detail/product-detail.uvue
@@ -55,7 +55,8 @@
 		</scroll-view>
 
 		<view v-if="loadState == 'success'" class="bottom-actions">
-			<view class="offline-button" :class="submitting ? 'action-disabled' : ''" @tap="offlineProduct"><text>商品下架</text></view>
+			<!-- 按钮按商品当前状态取反:已下架显示「商品上架」,已上架显示「商品下架」。 -->
+			<view class="offline-button" :class="[productStatus == 'offline' ? 'is-online' : '', submitting ? 'action-disabled' : '']" @tap="toggleProductStatus"><text>{{productStatus == 'offline' ? '商品上架' : '商品下架'}}</text></view>
 			<view class="save-button" :class="submitting ? 'action-disabled' : ''" @tap="saveProduct"><text>{{submitting ? '保存中' : '保存'}}</text></view>
 		</view>
 	</view>
@@ -83,6 +84,8 @@
 	const amountError = ref('')
 	const coverError = ref('')
 	const initialSnapshot = ref('')
+	// 商品当前上下架状态:'online' / 'offline',决定底部按钮显示「商品下架」还是「商品上架」。
+	const productStatus = ref('')
 	const loadState = ref('loading')
 	const traceId = ref('')
 	const submitting = ref(false)
@@ -96,6 +99,7 @@
 	}
 
 	const applyDetail = (detail: MerchantProductDetail) => {
+		productStatus.value = detail.status
 		productName.value = detail.productName
 		productAmount.value = detail.salePrice.toFixed(2)
 		detailText.value = detail.detailText
@@ -254,13 +258,17 @@
 		})
 	}
 
-	const offlineProduct = () => {
+	// 底部按钮按当前状态取反:已下架就上架,已上架就下架(后端 PATCH 支持 online/offline,
+	// 上架时后端会校验商品必须已审核通过)。
+	const toggleProductStatus = () => {
 		if (submitting.value) return
+		const goingOnline = productStatus.value == 'offline'
+		const nextStatus = goingOnline ? 'online' : 'offline'
 		uni.showModal({
-			title: '商品下架',
-			content: '确认下架当前商品吗?',
-			confirmText: '确认下架',
-			confirmColor: '#F25353',
+			title: goingOnline ? '商品上架' : '商品下架',
+			content: goingOnline ? '确认上架当前商品吗?' : '确认下架当前商品吗?',
+			confirmText: goingOnline ? '确认上架' : '确认下架',
+			confirmColor: goingOnline ? '#F07A2E' : '#F25353',
 			success: (result: any) => {
 				if (!result.confirm) return
 				submitting.value = true
@@ -268,16 +276,20 @@
 					submitting.value = false
 					initialSnapshot.value = buildSnapshot()
 					uni.removeStorageSync(getDraftStorageKey())
-					uni.showToast({ title: '商品已下架', icon: 'success' })
+					uni.showToast({ title: goingOnline ? '商品已上架' : '商品已下架', icon: 'success' })
 				}
 				if (useDemoData) {
-					updateDemoMerchantProductStatus(productId.value, 'offline')
+					const updated = updateDemoMerchantProductStatus(productId.value, nextStatus)
+					if (updated != null) productStatus.value = updated.status
 					finish()
 					return
 				}
-				updateMerchantProductStatus(productId.value, 'offline', (_product: MerchantProductDetail, _traceId: string) => finish(), (error: any) => {
+				updateMerchantProductStatus(productId.value, nextStatus, (product: MerchantProductDetail, _traceId: string) => {
+					productStatus.value = product.status
+					finish()
+				}, (error: any) => {
 					submitting.value = false
-					uni.showToast({ title: error.message != null ? error.message : '商品下架失败', icon: 'none' })
+					uni.showToast({ title: error.message != null ? error.message : (goingOnline ? '商品上架失败' : '商品下架失败'), icon: 'none' })
 				})
 			}
 		})
@@ -406,6 +418,8 @@
 	.bottom-actions { display: flex; height: 142rpx; padding: 20rpx 34rpx 28rpx; flex-direction: row; background-color: #FFFFFF; box-shadow: 0 -8rpx 24rpx rgba(41, 51, 67, 0.04); box-sizing: border-box; position: fixed; left: 0; right: 0; bottom: 0; z-index: 20; }
 	.offline-button, .save-button { display: flex; height: 84rpx; justify-content: center; align-items: center; border-radius: 44rpx; font-size: 29rpx; line-height: 40rpx; font-weight: 700; box-sizing: border-box; }
 	.offline-button { width: 218rpx; margin-right: 22rpx; border-width: 1rpx; border-style: solid; border-color: #FFB7B4; color: #F25353; background-color: #FFF6F5; }
+	/* 已下架时按钮是「商品上架」,用中性偏正向的橙色,和下架的红色区分开。 */
+	.offline-button.is-online { border-color: #FFC79A; color: #F07A2E; background-color: #FFF7EF; }
 	.save-button { flex: 1; color: #FFFFFF; background-image: linear-gradient(90deg, #FF8B1F 0%, #FF4A37 100%); box-shadow: 0 12rpx 22rpx rgba(255, 94, 47, 0.18); }
 	.input-placeholder { color: #B9BEC8; }
 	.input-invalid { border-color: #F0746D; background-color: #FFF9F8; }

--
Gitblit v1.7.1