shish 6 сар өмнө
parent
commit
34793a7db5

+ 262 - 233
ghsApp/src/admin/changePrice/changeHide.vue

@@ -1,5 +1,6 @@
 <template>
-<view class="app-content" style="background:white;">
+<view class="app-content">
+    <!-- 顶部筛选标签 -->
     <view class="modern-tabs-container">
         <view class="modern-tabs">
             <view class="modern-tab" :class="{ 'active': globalLookStock === 0 }" @click="changeHasStock(0)">
@@ -19,62 +20,80 @@
             </view>
         </view>
     </view>
+
+    <!-- 主容器 -->
 	<view class="billing_box_bg">
-    <view class="input-wrap">
-			<view style="padding:0upx 0upx 0upx 0upx;margin-right:10upx;" >
+        <!-- 搜索栏 -->
+        <view class="input-wrap">
+			<view style="padding:0upx 0upx 0upx 0upx;margin-right:10upx;">
 				<button class="admin-button-com middle blue" @click="selectFlowerNumFn()">图片分类</button>
 			</view>
 			<view class="search-bar">
 				<app-search-module ref="globalSearchRef" v-model="globalPy" placeholder="这里搜索" @input="globalSearch" />
 			</view>
 		</view>
+
+        <!-- 主内容区 -->
 		<view class="scroll-middle_bx">
 			<scroll-view scroll-y scroll-with-animation class="tab-view">
-				<div v-for="(item, index) in globalClassData" :key="index" class="tab-bar-item" :class="[globalClassIndex == index ? 'active' : '']" :data-current="index" @tap.stop="currentSwitchClass(index,item)">
+				<div v-for="(item, index) in globalClassData" :key="index" class="tab-bar-item" :class="[globalClassIndex == index ? 'active' : '']" @tap.stop="currentSwitchClass(index,item)">
 					<text>{{ item.name || "" }}</text>
 				</div>
 			</scroll-view>
-				<scroll-view scroll-y class="right-box"
-					:scroll-top="globalScrollTopPlace"
-					@scroll="globalGetScroll"
-					:scroll-into-view="scroll_into_view" 
-					scroll-with-animation="true"
-					lower-threshold="100"
-					@scrolltolower="globalScrollBottom">
 
+			<scroll-view scroll-y class="right-box"
+				:scroll-top="globalScrollTopPlace"
+				@scroll="globalGetScroll"
+				:scroll-into-view="scroll_into_view" 
+				scroll-with-animation="true"
+				lower-threshold="100"
+				@scrolltolower="globalScrollBottom">
+
+                <!-- 内容列表 -->
 				<block v-if="!$util.isEmpty(globalItemData)">
-					<view class="item_list_bx selectAll">
-						<view v-if="!$util.isEmpty(globalItemData)">
-							<template v-for="(productItem, productIndex) in globalItemData">
-								<view class="item_list_title" v-if="productItem.className && productItem.className!=''">{{ productItem.className }}</view>
-								<view style="height:190upx" :key="productIndex">
-									<ItemComponent :isPrice="false" :info="productItem" @saveStock="saveStock" :ref="`productRef${productItem.id}`" 
-									@hideChangeFn="hideChangeFn" @cancelPreSellFn="cancelPreSellFn">
-								</ItemComponent>
-								</view>
-							</template>
-						</view>
-						<view v-else>
-							<view style="height:260upx;text-align:center;color:#CCCCCC;position: relative;">
-								<view style="position: absolute;margin:auto;top:130upx;left:0;right:0;bottom:0;">暂无花材</view>
-							</view>
-						</view>
+					<view class="item_list_bx">
+                        <!-- 按分类分组显示 -->
+                        <view v-for="(groupData, groupIndex) in itemGroups" :key="groupIndex">
+                            <!-- 分类标题 + 全选按钮 -->
+                            <view class="item_list_title" v-if="groupData.className">
+                                <view class="title-row">
+                                    <text class="class-name">{{ groupData.className }}</text>
+                                    <text class="select-all-btn" @click.stop="toggleGroupSelection(groupIndex)">
+                                        {{ isGroupAllSelected(groupIndex) ? '全不选' : '全选' }}
+                                    </text>
+                                </view>
+                            </view>
 
+                            <!-- 分类下的商品 -->
+                            <view v-for="(productItem, itemIndex) in groupData.items" :key="productItem.id" style="height:190upx">
+                                <ItemComponent 
+                                    :isPrice="false" 
+                                    :info="productItem" 
+                                    :isChecked="isItemChecked(productItem.id)"
+                                    @checkChange="handleItemCheck(productItem, $event)"
+                                    @hideChangeFn="hideChangeFn" 
+                                    @cancelPreSellFn="cancelPreSellFn">
+                                </ItemComponent>
+                            </view>
+                        </view>
 					</view>
 				</block>
+                <!-- 空状态 -->
 				<block v-else>
 					<view style="width: 100%">
-						<app-wrapper-empty  title="暂无数据" :is-empty="$util.isEmpty(globalItemData)"/>
+						<app-wrapper-empty title="暂无数据" :is-empty="$util.isEmpty(globalItemData)"/>
 					</view>
 				</block>
 
 			</scroll-view>
 		</view>
 
-      <div class="app-footer">
-        <button class="admin-button-com big blue" @click="commitPrice">批量隐藏</button>
-      </div>
+        <!-- 底部按钮 -->
+        <div class="app-footer">
+            <button class="admin-button-com big blue" @click="commitPrice">批量隐藏 ({{ selectedCount }})</button>
+        </div>
 
+        <!-- 分类选择弹窗 -->
 		<uni-popup ref="globalClassImgRef" background-color="#fff" type="center" :animation="false" class="class-popup-style">
 			<view style="display:flex;padding:20upx;height:auto;justify-content: space-between;align-items:center;flex-wrap:wrap;max-height:100vh;overflow:auto;">
 				<view v-for="(item, index) in globalClassData" :key="index" @tap.stop="currentChangeClass(index,item)" style="margin-bottom:20upx;margin-left:3upx;">
@@ -84,22 +103,21 @@
 			</view>
 		</uni-popup>
 
-		<image v-if="showClassRemind" @click="hideClassRemind" style="position:absolute;width:610upx;height:699upx;top:225upx;left:80upx;z-index:9999;" :src="`${constant.imgUrl}/class_remind.png`"></image>
-
 	</view>
 </view>
 </template>
+
 <script>
 import AppSearchModule from "@/components/module/app-search";
 import AppWrapperEmpty from "@/components/app-wrapper-empty";
 import ItemComponent from "./components/changeHide";
 import productMins from "@/mixins/product2";
 import { mapGetters } from "vuex";
-import { checkOrderApi } from "@/api/inventory";
-import { changeFrontHide } from "@/api/item";
+import { changeFrontHide, batchStopItem } from "@/api/item";
 import { cancelPreSell } from '@/api/product'
+
 export default {
-	name: "item_list",
+	name: "changeHide",
 	components: {
 		AppSearchModule,
 		AppWrapperEmpty,
@@ -110,100 +128,143 @@ export default {
 		return {
 			autoLoad: false,
 			selectJobType: "stock",
-			tabIndex: 0,
-			stockArr:[],
-			showClassRemind:false
+            selectedIdsSet: new Set()
 		};
 	},
-	computed:{
+	computed: {
 		...mapGetters(["getMyShopInfo","getLoginInfo"]),
+		
+		selectedCount() {
+			return this.selectedIdsSet.size;
+		},
+		
+        itemGroups() {
+            if (this.$util.isEmpty(this.globalItemData)) {
+                return [];
+            }
+            
+            const groups = [];
+            let currentGroup = null;
+            
+            this.globalItemData.forEach((item) => {
+                if (item.className && item.className !== '') {
+                    currentGroup = {
+                        className: item.className,
+                        items: [item]
+                    };
+                    groups.push(currentGroup);
+                } else if (currentGroup) {
+                    currentGroup.items.push(item);
+                }
+            });
+            
+            return groups;
+        }
 	},
 	onLoad() {
 		this.initProduct()
 	},
 	methods: {
+        isItemChecked(itemId) {
+            return this.selectedIdsSet.has(itemId);
+        },
+
+        handleItemCheck(productItem, isChecked) {
+            const id = productItem.id;
+            if (isChecked) {
+                this.selectedIdsSet.add(id);
+            } else {
+                this.selectedIdsSet.delete(id);
+            }
+            this.$forceUpdate();
+        },
+
+        isGroupAllSelected(groupIndex) {
+            const group = this.itemGroups[groupIndex];
+            if (!group || group.items.length === 0) return false;
+            
+            return group.items.every(item => this.selectedIdsSet.has(item.id));
+        },
+
+        toggleGroupSelection(groupIndex) {
+            const group = this.itemGroups[groupIndex];
+            if (!group) return;
+            
+            const isAllSelected = this.isGroupAllSelected(groupIndex);
+            
+            group.items.forEach(item => {
+                if (isAllSelected) {
+                    this.selectedIdsSet.delete(item.id);
+                } else {
+                    this.selectedIdsSet.add(item.id);
+                }
+            });
+            
+            this.$forceUpdate();
+        },
+
 		selectFlowerNumFn(){
 			this.$refs.globalClassImgRef.open('top')
 		},
+		
 		changeHasStock(check){
 			this.globalLookStock = check
 			this.reGetGlobalProductList()
 		},
-		hideClassRemind(){
-		},
+		
 		cancelPreSellFn(item){
-			let that = this
 			this.$util.confirmModal({content:'确认取消预售?'},() => {
 				cancelPreSell({id:item.id}).then(res=>{
 					if(res.code == 1){
-						that.$msg(res.msg)
+						this.$msg(res.msg)
 					}
 				})
 			})
 		},
+		
 		hideChangeFn(item,status){
-			let that = this
 			changeFrontHide({id:item.id,status:status}).then(res=>{
 				if(res.code == 1){
-					that.$refs[`productRef${item.id}`][0].frontHide = status
+					this.$msg('操作成功')
+					item.frontHide = status
 				}
 			})
 		},
+		
 		initProduct(){
 			this.globalRequestType = 'itemList'
 			this.initData()
 			uni.hideLoading()
 		},
+		
 		commitPrice(){
-			let that = this
-			if(this.stockArr.length == 0){
-				this.$msg('没有修改')
+			if(this.selectedIdsSet.size === 0){
+				this.$msg('请选择花材')
 				return;
 			}
-			this.$util.confirmModal({content:'确认修改?'},() => {
-				that.commitChange()
+			this.$util.confirmModal({content:'确认批量隐藏 ' + this.selectedIdsSet.size + ' 个花材?'},() => {
+				this.commitChange()
 			})
 		},
+		
 		commitChange(){
-			let that = this
-			let data = JSON.stringify(this.stockArr);
-			checkOrderApi({pdType:'',itemInfo:data,remark:'修改库存'}).then(res => {
+            const ids = Array.from(this.selectedIdsSet);
+			batchStopItem({ids:JSON.stringify(ids)}).then(res=>{
 				if(res.code == 1){
-					that.clearPrice()
-					that.reGetGlobalProductList()
+					this.selectedIdsSet.clear()
+					this.$msg(res.msg)
+					this.reGetGlobalProductList()
 				}
-				this.$msg(res.msg)					
 			})
 		},
+		
 		currentSwitchClass(index,item){
-			this.clearPrice()
 			this.globalSwitchClass(index,item)
 		},
+		
 		currentChangeClass(index,item){
-			this.clearPrice()
-			this.globalChangeClass(index,item)
-		},
-		clearPrice(){
-			let that = this
-			this.stockArr.forEach(function(value,index,array){
-				that.$refs[`productRef${value.productId}`][0].modifyStock = ''
-			})
-			that.stockArr = []
-		},
-		saveStock(stock,id){
-			if(this.stockArr.length > 0){
-				this.stockArr.forEach(function(value,index,array){
-					if(value.productId == id){
-						array.splice(index,1)
-					}
-				});
-			}
-			this.stockArr.push({productId:id,bigNum:stock,smallNum:null})
-		},
-		affirm(val) {
-			if (val.index === 0) {
-				this.modalCancel();
-			}
+			this.$refs.globalClassImgRef.close()
+			this.globalSwitchClass(index,item)
 		}
 	}
 };
@@ -215,10 +276,66 @@ export default {
 	flex-direction: column;
 	height: 100vh;
 	overflow: hidden;
+	background: white;
 }
 
 .modern-tabs-container {
 	flex-shrink: 0;
+    padding: 0;
+    background-color: #f8f9fa;
+    width: 100%;
+}
+
+.modern-tabs {
+    display: flex;
+    background-color: #ffffff;
+    padding: 6upx;
+    box-shadow: 0 2upx 12upx rgba(0, 0, 0, 0.06);
+    border: 2upx solid #f0f2f5;
+    position: relative;
+    z-index: 5;
+    width: 100%;
+}
+
+.modern-tab {
+    flex: 1;
+    text-align: center;
+    padding: 30upx 0;
+    position: relative;
+    transition: all 0.35s cubic-bezier(0.25, 1, 0.5, 1);
+    border-radius: 12upx;
+    margin: 0 2upx;
+    background-color: #e2dfdf;
+    border: 2upx solid #f2f4f7;
+    box-shadow: none;
+    
+    .tab-content {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+    }
+    
+    .tab-text {
+        font-size: 30upx;
+        color: #666;
+        font-weight: 700;
+    }
+    
+    &.active {
+        background: #3385FF;
+        
+        .tab-text {
+            color: #ffffff;
+            font-weight: 700;
+            font-size: 30upx;
+        }
+    }
+    
+    &:not(.active):hover {
+        background-color: #f6f7f9;
+        border-color: #e9ecef;
+    }
 }
 
 .billing_box_bg {
@@ -227,38 +344,30 @@ export default {
 	display: flex;
 	flex-direction: column;
 	overflow: hidden;
+
 	.input-wrap {
 		display: flex;
 		padding: 22upx 20upx 22upx 13upx;
+		flex-shrink: 0;
+		
 		.search-bar {
 			flex: 1;
 		}
-		.city-select {
-			display: flex;
-			flex-shrink: 0;
-			align-items: center;
-			margin-right: 15upx;
-			margin-left: 45upx;
-			background-color: #ffff;
-			.iconfont {
-				margin-left: 20upx;
-				font-size: 30upx;
-			}
-		}
 	}
+
 	.scroll-middle_bx {
 		flex: 1;
 		display: flex;
 		width: 100%;
-		height: 100%;
 		overflow: hidden;
 	}
+
 	.tab-view {
-		padding-bottom:100upx;
-		// height: calc(100vh - 140upx);
 		width: 170upx;
 		flex-shrink: 0;
 		background-color: #f0f2f6;
+		padding-bottom: 100upx;
+
 		.tab-bar-item {
 			position: relative;
 			width: 170upx;
@@ -270,160 +379,80 @@ export default {
 			font-size: 26upx;
 			color: #444;
 			font-weight: 400;
-			.tag {
-				display: flex;
-				padding: 0 20upx;
-				align-items: center;
-				position: absolute;
-				right: 0;
-				top: 0;
-				height: 32upx;
-				background: #ff2842;
-				border-radius: 16upx;
-				color: #fff;
-				font-size: 20upx;
+
+			&:last-child {
+				margin-bottom: 110upx;
 			}
-      &:last-child{
-        margin-bottom: 110upx;
-      }
-		}
 
-		.active {
-			position: relative;
-			color: $mainColor;
-			font-size: 26upx;
-			background: #fff;
-		}
+			&.active {
+				position: relative;
+				color: $mainColor;
+				font-size: 26upx;
+				background: #fff;
 
-		.active::before {
-			content: "";
-			position: absolute;
-			border-left: 8upx solid $mainColor;
-			height: 100%;
-			left: 0;
+				&::before {
+					content: "";
+					position: absolute;
+					border-left: 8upx solid $mainColor;
+					height: 100%;
+					left: 0;
+				}
+			}
 		}
 	}
+
 	.right-box {
-		// height: calc(100vh - 200upx);
 		flex: 1;
 		box-sizing: border-box;
 	}
+
 	.item_list_bx {
 		padding: 40upx 16upx;
+
+        .item_list_title {
+            margin-bottom: 20upx;
+            font-size: 30upx;
+            font-weight: 600;
+            color: #3385FF;
+
+            .title-row {
+                width: 100%;
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+            }
+
+            .class-name {
+                flex: 1;
+            }
+
+            .select-all-btn {
+                color: #3385FF;
+                font-size: 28upx;
+                font-weight: 700;
+                padding: 8upx 16upx;
+                white-space: nowrap;
+                background: #E8F2FF;
+                border-radius: 8upx;
+            }
+        }
 	}
-	.item_list_title {
-			margin-bottom: 20upx;
-			font-size: 30upx;
-			font-weight: 600;
-			color: #3385FF;
-	}
-	.select-cmd_bx {
-		& .kc {
-			color: #999999;
-			font-size: 28upx;
-			font-weight: 400;
-			margin-bottom: 60upx;
-			text-align: center;
-			margin-top: 10upx;
-		}
-		& .num_bx {
-			display: flex;
-			align-items: center;
-			margin-bottom: 80upx;
-			& > input {
-				width: 212upx;
-				height: 80upx;
-				border: 1upx solid #dddddd;
-				border-radius: 4upx;
-				text-align: center;
-				margin-right: 24upx;
-			}
-		}
-	}
+
 	.app-footer {
 		justify-content: space-evenly;
 		z-index: 9999;
-		.admin-button-com {
-			width: 60%;
-		}
-		button{
-			width:600upx;
+		flex-shrink: 0;
+		padding: 20upx;
+		background: white;
+		box-shadow: 0 -2upx 8upx rgba(0, 0, 0, 0.1);
+
+		button {
+			width: 600upx;
 		}
 	}
 }
-.class-popup-style{
-	z-index:999999;
-}
-
-.modern-tabs-container {
-  padding: 0;
-  background-color: #f8f9fa;
-  width: 100%;
-  flex-shrink: 0;
-}
-
-.modern-tabs {
-  display: flex;
-  background-color: #ffffff;
-  padding: 6upx;
-  box-shadow: 0 2upx 12upx rgba(0, 0, 0, 0.06);
-  border: 2upx solid #f0f2f5;
-  position: relative;
-  z-index: 5;
-  width: 100%;
-}
 
-.modern-tab {
-  flex: 1;
-  text-align: center;
-  padding: 30upx 0;
-  position: relative;
-  transition: all 0.35s cubic-bezier(0.25, 1, 0.5, 1);
-  border-radius: 12upx;
-  margin: 0 2upx;
-  background-color: #e2dfdf; /* 未选中态背景 */
-  border: 2upx solid #f2f4f7; /* 未选中态边框 */
-  box-shadow: none;
-  
-  .tab-content {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-  }
-  
-  .tab-icon {
-    font-size: 32upx;
-    margin-bottom: 4upx;
-    display: block;
-    opacity: 0.85; /* 未选中态图标降低对比 */
-  }
-  
-  &.active .tab-icon {
-    filter: brightness(1.15);
-    opacity: 1;
-  }
-  
-  .tab-text {
-    font-size: 30upx;
-    color: #666;
-    font-weight: 700;
-  }
-  
-  &.active {
-    background: #3385FF;
-    
-    .tab-text {
-      color: #ffffff;
-      font-weight: 700;
-      font-size: 30upx;
-    }
-  }
-  
-  /* H5 未选中态悬停效果(其它端不影响) */
-  &:not(.active):hover {
-    background-color: #f6f7f9;
-    border-color: #e9ecef;
-  }
+.class-popup-style {
+	z-index: 999999;
 }
 </style>

+ 155 - 187
ghsApp/src/admin/changePrice/components/changeHide.vue

@@ -1,7 +1,8 @@
 <template>
 <view class="product">
 	<view class="item-cmd_bx">
-		<view class="img_bx" @click="pageTo({url: '/admin/item/detail?id='+info.id})">
+		<!-- 图片区域 -->
+		<view class="img_bx" @click.stop="pageTo({url: '/admin/item/detail?id='+info.id})">
 			<block v-if="info.status == 2">
 				<view class="sold-out">
 					<view class="sold-out-xj">已下架</view>
@@ -14,37 +15,41 @@
 			</block>
 			<image :src="info.cover" style="width:160upx;height:160upx;" lazy-load="true" :lazy-load-margin="0"></image>
 		</view>
+
+		<!-- 信息区域 -->
 		<view class="cmd-info_bx">
+			<!-- 商品标题 -->
 			<view class="tit">
-				<text style="font-size:22upx;border:1upx solid #3385ff;color:white;background-color:#3385ff;margin-right:5upx;padding-left:5upx;padding-right:5upx;" 
-				v-if="info.presell == 1">预售</text>
+				<text v-if="info.presell == 1" class="presell-tag">预售</text>
 				{{ info.name || "" }}
 			</view>
+
+			<!-- 价格 -->
 			<view class="kc">¥{{ parseFloat(info.price) }}</view>
+
+			<!-- 隐藏/显示按钮 -->
 			<view class="num-open_bx">
 				<view>
-					<view class="open-bx" >
-						<text style="color:#333333;">¥{{ parseFloat(info.skPrice) }}</text>
-						<view class="hd-price-area">
-							<input class="change-input" @click.stop @blur="saveStock" placeholder-style="color:#CCCCCC" v-model="modifyStock" type="digit" placeholder="填写数量" @focus="clear()" />
-						</view>
-						<text v-if="info.frontHide == 1" class="front-hide-color">隐</text>
+					<view class="open-bx">
+						<view class="front-hide-color" @click.stop="toggleHideStatus" v-if="info.frontHide == 1">显示</view>
+						<view class="front-hide-color" @click.stop="toggleHideStatus" v-else>隐藏</view>
 					</view>
 				</view>
 			</view>
-			<text style="position:absolute;right:70upx;color:#333333;font-weight:bold;bottom:0upx;">
-			剩余 {{info.stock?parseFloat(info.stock):0}}
-			</text>
+
+			<!-- 选择框 -->
+			<view class="details-select" @click.stop="toggleCheck">
+				<text class="iconfont iconxuanzhong" v-if="isChecked"> </text>
+				<text class="iconfont iconweixuanzhong" v-else> </text>
+			</view>
 		</view>
 	</view>
-
 </view>
 </template>
+
 <script>
 export default {
-	name: "item",
-	components: {
-	},
+	name: "changeHideItem",
 	props: {
 		isPrice: {
 			type: Boolean,
@@ -55,202 +60,165 @@ export default {
 			default: true
 		},
 		info: {
+			type: Object,
 			required: true
+		},
+		// 从父组件接收选中状态
+		isChecked: {
+			type: Boolean,
+			default: false
 		}
 	},
-	data() {
-		return {
-			modifyStock:''
-		};
-	},
 	methods: {
-		clear(){
-			this.modifyStock = ''
-		},
-		cancelPreSellFn(item){
-			this.$emit("cancelPreSellFn",item)
+		// 切换选中状态
+		toggleCheck() {
+			// 触发父组件的 checkChange 事件,传递新的状态
+			this.$emit("checkChange", !this.isChecked);
 		},
-		hideChangeFn(item,status){
-			this.$emit("hideChangeFn",item,status)
+
+		// 切换隐藏/显示状态
+		toggleHideStatus() {
+			const newStatus = this.info.frontHide === 1 ? 0 : 1;
+			this.$emit("hideChangeFn", this.info, newStatus);
 		},
-		saveStock() {
-			if(Number(this.modifyStock)>=0){
-				this.$emit("saveStock",this.modifyStock,this.info.id)
-			}
+
+		cancelPreSellFn(item) {
+			this.$emit("cancelPreSellFn", item)
 		}
 	}
 };
 </script>
+
 <style lang="scss" scoped>
-.product{
-	height:230upx;
-	.level-price{
-		display:flex;
-		color:#CCCCCC;
-		text-align: right;
-		font-size:24upx;
-		justify-content:space-around;
-	}
-}
-.item-cmd_bx {
-	height:160upx;
-	position: relative;
-	margin-bottom: 20upx;
-	.img_bx {
-		z-index:999;
+.product {
+	height: 190upx;
+
+	.item-cmd_bx {
 		height: 160upx;
-		width: 160upx;
-		position: absolute;
-		left: 0upx;
-		top: 0upx;
-		.sold-out{
-			z-index:10;
-			width:160upx;
-			height:160upx;
-			background-color:black;
-			position:absolute;
-			top:0;
-			left:0;
-			opacity: 0.6;
-			color:white;
-			text-align:center;
-			.sold-out-xj{
-				line-height:160upx;
-				font-size:28upx;
-			}
-			.hide{
-				line-height:160upx;
-				font-size:30upx;
-			}
-		}
-	}
-	.cmd-info_bx {
 		position: relative;
-		padding-left: 177upx;
-		&.active{
-			&:before{
-				content: ' ';
-				height: 22upx;
-				width: 22upx;
-				border-width: 2upx 2upx 0 0;
-				border-color: #b2b2b2;
-				border-style: solid;
-				-webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
-				transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+		margin-bottom: 20upx;
+		display: flex;
+		align-items: flex-start;
+
+		// 图片区域
+		.img_bx {
+			z-index: 10;
+			height: 160upx;
+			width: 160upx;
+			position: relative;
+			flex-shrink: 0;
+
+			.sold-out {
+				z-index: 10;
+				width: 160upx;
+				height: 160upx;
+				background-color: rgba(0, 0, 0, 0.6);
 				position: absolute;
-				top: 50%;
-				margin-top: -12upx;
-				right: 30upx;
+				top: 0;
+				left: 0;
+				color: white;
+				text-align: center;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.sold-out-xj,
+				.hide {
+					font-size: 28upx;
+					font-weight: bold;
+				}
+			}
+
+			image {
+				display: block;
 			}
 		}
-		& .tit {
-			font-size: 30upx;
-			font-weight: bold;
-			color: #333333;
-			padding-top: 0upx;
-			overflow: hidden;
-			white-space: nowrap;
-			text-overflow: ellipsis;
-			width:360upx;
-		}
-		.front-hide-color{
-			position:absolute;
-			top:52upx;
-			right:206upx;
-			display:inline-block;
-			width:56upx;
-			padding:10upx 0;
-			background-color:#3385ff;
-			border:none;
-			margin-left:8upx;
-			color:white;
-			text-align:center;
-			border-radius:10upx;
-		}
-		& .kc {
-			color:red;
-			font-size: 31upx;
-			padding: 17upx 0 24upx;
-			font-weight: 700;
-		}
-		& .num-open_bx {
+
+		// 信息区域
+		.cmd-info_bx {
+			position: relative;
+			flex: 1;
+			padding-left: 16upx;
 			display: flex;
-			align-items: center;
-			& .price {
-				font-size: 30upx;
+			flex-direction: column;
+			justify-content: flex-start;
+
+			.tit {
+				font-size: 28upx;
+				font-weight: 600;
+				color: #333333;
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+				margin-bottom: 8upx;
+				display: flex;
+				align-items: center;
+				padding-right: 60upx;
+
+				.presell-tag {
+					font-size: 18upx;
+					border: 1upx solid #3385ff;
+					color: white;
+					background-color: #3385ff;
+					padding: 2upx 4upx;
+					margin-right: 6upx;
+					flex-shrink: 0;
+				}
+			}
+
+			// 价格
+			.kc {
 				color: red;
-				flex: 1;
+				font-size: 28upx;
+				font-weight: 700;
+				margin-bottom: 8upx;
 			}
-			& .open-bx {
-				color:#999999;
-				width:300upx;
-				text{
-					font-size: 24upx;
-				}
-				*.warn {
-					color: $redColor;
-				}
-				.hd-price-area{
-					width:190upx;
-					position: absolute;
-					top:50upx;
-					right:-10upx;
-					/* #ifdef MP-WEIXIN */
-					/* #ifdef APP-PLUS */
-					/* #else */
-					// 苹果微信小程序特殊处理 - 防止滚动问题
-					position: relative;
-					z-index: 1;
-					/* #endif */
-					/* #endif */
-					.change-input {
-						width: 150upx;
-						height: 60upx;
-						line-height: 60upx;
+
+			// 操作区域
+			.num-open_bx {
+				display: flex;
+				align-items: center;
+
+				.open-bx {
+					display: flex;
+					gap: 8upx;
+
+					.front-hide-color {
+						display: inline-block;
+						width: 50upx;
+						height: 32upx;
+						line-height: 32upx;
+						background-color: #3385ff;
+						color: white;
 						text-align: center;
-						background: #ffffff;
-						border: 1upx solid #b4b4b4;
-						border-radius: 4upx;
-						font-size: 25upx;
-						color:#777777;
-						display:inline-block;
-						/* #ifdef MP-WEIXIN */
-						/* #ifdef APP-PLUS */
-						/* #else */
-						// 苹果微信小程序 iOS WebKit 特殊修复
-						-webkit-appearance: none;
-						-webkit-tap-highlight-color: transparent;
-						-webkit-user-select: none;
-						/* #endif */
-						/* #endif */
-					}
-					.change-text{
-						font-size:22upx;
+						border-radius: 6upx;
+						font-size: 22upx;
+						flex-shrink: 0;
 					}
 				}
-				.sk-price-area{
-					width:190upx;
-					position: absolute;
-					top:100upx;
-					right:-10upx;
-					.change-input {
-						width: 150upx;
-						height: 60upx;
-						line-height: 60upx;
-						text-align: center;
-						background: #ffffff;
-						border: 1upx solid #b4b4b4;
-						border-radius: 4upx;
-						font-size: 25upx;
-						color:#777777;
-						display:inline-block;
-					}
-					.change-text{
-						font-size:22upx;
+			}
+
+			// 选择框
+			.details-select {
+				position: absolute;
+				top: 8upx;
+				right: 8upx;
+				width: 44upx;
+				height: 44upx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.iconfont {
+					font-size: 40upx;
+					color: #dddddd;
+
+					&.iconxuanzhong {
+						color: $mainColor;
 					}
 				}
 			}
 		}
 	}
 }
-</style>
+</style>