uniapp门店收银,点击右边商品,商品会进入左边的购物车,并且,当扫码枪扫描商品条形码,商品也会累计进入购物车

news2024/11/24 19:04:11

效果:

代码:

<template>
	<view class="container">
		<view class="top" style="height: 10%; margin-bottom: 20rpx; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);">
			<view class="box" style="flex: 1; background-color: #4CAF50; display: flex; ">
			</view>
			<view class="box" style="flex: 2; background-color: #4CAF50;">
				<view class="inner-box"
					style="background-color: #fafafa; margin: 20rpx 20rpx 15rpx 20rpx; border-radius: 10px; display: flex; flex-direction: column; align-items: center; justify-content: center;"
					@click="toUrl(`/pages/menstore/shouyin`)">
					<view class="sub-inner-box">
						<image src="/static/money.png" class="icon"></image>
						<text class="icon-text">收银</text>
					</view>
				</view>
				<view class="inner-box"
					style="background-color: #fafafa; margin: 20rpx 20rpx 15rpx 20rpx; border-radius: 10px; display: flex; flex-direction: column; align-items: center; justify-content: center;">
					<view class="sub-inner-box" @click="toUrl(`/pages/menstore/store/ceshipage`)">
						<image src="/static/yuangongtotal.png" class="icon"></image>
						<text class="icon-text">测试页面</text>
					</view>
				</view>
			</view>
			<view class="box" style="flex: 2; background-color: #4CAF50;">
				<view class="inner-box-container" style="flex: 1; display: flex; justify-content: flex-end;">
					<view class="inner-box" style="background-color: #4CAF50; margin: 60rpx 20rpx 15rpx 30rpx;">
						<view class="sub-inner-box"
							style="background-color: #4CAF50; width: 50px; height: 30px; margin: 10rpx 20rpx 15rpx 20rpx;">
							<text
								style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 40rpx; font-weight: 600;">{{userData.userName }}</text>
						</view>
					</view>
					<view class="inner-box" style="background-color: #4CAF50; margin: 60rpx 20rpx 15rpx 30rpx;"
						@click="onQuit">
						<view class="sub-inner-box"
							style="background-color: #4CAF50; width: 50px; height: 30px; margin: 10rpx 20rpx 15rpx 20rpx;">
							<text
								style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 40rpx; font-weight: 600;">退出</text>
						</view>
					</view>
				</view>
			</view>
		</view>
		<view class="bottom" style="height: 90% margin-bottom: 10rpx;">
			<view class="left"
				style="width: 34%; margin-right: 20rpx; margin-left: 15rpx; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);">
				<view class="upper"
					style="height: 12%; display: flex; flex-direction: row; background-color: whitesmoke; border-bottom: 2px solid #4CAF50;">
					<view class="avatar-name"
						style="flex: 1; display: flex; align-items: center; justify-content: space-between;">
						<view class="avatar-text"
							style="display: flex; flex-direction: column; align-items: center; margin-right: 10px; ">
							<view
								style="display: flex; flex-direction: row; align-items: center; justify-content: flex-start;">
								<view class="textt" style="margin-left: 15px; font-size: 36rpx;">
									{{ member.userName || '散客' }}
								</view>
								<view class="textt" style="margin-left: 15px; font-size: 30rpx;">
									{{ member.phone || '' }}
								</view>
							</view>
							<view
								style="display: flex; flex-direction: column; flex-start: center; justify-content: flex-start;">
								<view v-if="member && member.userAccountVo" class="textt"
									style="margin-left: 3rpx; font-size: 26rpx;">
									{{ '积分 : ' + member.userAccountVo.principal }}
								</view>
								<view v-if="member && member.userAccountVo" class="textt"
									style="margin-left: 3rpx; font-size: 26rpx;">
									{{ 'ZJT : ' + member.userAccountVo.qtValue }}
								</view>
								<view v-if="member && member.userAccountVo" class="textt"
									style="margin-left: 3rpx; font-size: 26rpx;">
									{{ '代金券 : ' + member.userAccountVo.cashCoupon }}
								</view>
							</view>
						</view>
					</view>
					<view class="login-button" style="flex: 1; display: flex; align-items: center;">
						<view style="flex: 1;"></view>
						<view style="display: flex; flex-direction: column; align-items: center; margin-right: 50rpx;">
						</view>
					</view>
				</view>
				<view class="lower"
					style="height: 87%; background-color: whitesmoke; display: flex; flex-direction: column; justify-content: center; align-items: center;">
					<view style="height: 90%; width: 100%;">
						<view class="shop-cart-no-list"
							style="text-align: center; flex: 1; width: 100%; display: flex; justify-content: center; align-items: center;"
							v-if="dataList.length==0">
							<view>
								<image src="../../../static/cart.png" style="width: 240rpx; height: 240rpx;"></image>
								<view class="con">购物车空空的哦~</view>
							</view>
						</view>
						<view style="height: 1040rpx; overflow: auto;">
							<scroll-view :scroll-y="isScroll" :style="{ height: windowHeight + 'px' }">
								<block :key="item.id" v-for="(item, index) in dataList">
									<view :data-index="index" class="shop-cart-list-item" @touchstart="drawStart"
										@touchmove="drawMove" @touchend="drawEnd" :style="{ right: item.right + 'rpx'}">
										<image :src="item.images[0]" mode="widthFix" class="img"></image>
										<view class="desc">
											<view class="title">{{item.title}}</view>
											<view class="num">
												<view class="price"><text>¥</text> {{item.mallPrice}}</view>
												<view class="shu">
													<text class="jian" :class="item.number==1?'disable':''"
														@click="onJian(item)">-</text>
													<text class="num">{{item.number}}</text>
													<text class="jia" @click="onJia(item)">+</text>
												</view>
											</view>
										</view>
										<view class="content">{{ item.content }}</view>
										<view @click="delItem(index, $event)">
											<view class="remove">删除</view>
										</view>
									</view>
								</block>
							</scroll-view>
							<uni-load-more :status="status" :icon-size="16" :content-text="contentText" />
						</view>
					</view>
					<view class="new-price"
						style="height: 9%; width: 100%; background-color: whitesmoke; border-top: 2px solid #4CAF50; display: flex; justify-content: space-between;">
						<view class="price" style="flex: 1.6; display: flex; align-items: center;">
							<view class="pricetext" style="display: flex; align-items: center; margin-right: 10px;">
								<view>选择共计{{ totalItems }}件</view>
								<view class="texttt" style="margin-left: 15px; font-size: 33rpx;">
									<view>总价¥{{totalPrice}}</view>
									<view>折扣¥0.00</view>
								</view>
							</view>
						</view>
						<!-- 让这两句话在一行显示,你可以使用内联样式,并将它们包裹在一个 <text> 元 -->
						<view class="totleprice"
							style="flex: 1; display: flex; align-items: center; justify-content: flex-end; margin-right: 5px;">
							<text style="color: #000000; font-size: 34rpx;">合计</text>
							<text style="color: #ff5733; font-size: 50rpx;">¥0.00</text>
						</view>
					</view>
				</view>
			</view>
			<view class="right"
				style="width: 76%; margin-left: 4rpx; margin-right: 15rpx; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; align-items: stretch;">
				<view style="flex: 5%; background-color: white; display: flex; justify-content: space-between;">
					<view
						style="display: flex;flex: 60%; background-color: white; margin-left: 80rpx; margin-right: 40rpx; border: 2px solid #4CAF50; justify-content: center; align-items: center;">
						<input confirm-type="search" type="text" @input="handleBarcodeInput" v-model="content" />
					</view>
					<view
						style="flex: 10%; background-color: #4CAF50; margin-left: 40rpx; margin-right: 40rpx; display: flex; justify-content: center; align-items: center;"
						@click="onSearch">
						<text
							style="color: white; font-size: 14px; text-align: center; font-size: 40rpx; font-weight: 600;">查询</text>
					</view>
					<view
						style="flex: 10%; background-color: #4CAF50; margin-left: 40rpx; margin-right: 80rpx; display: flex; justify-content: center; align-items: center;">
						<text
							style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 40rpx; font-weight: 600;">刷新</text>
					</view>
				</view>
				<view style="flex: 75%; background-color: whitesmoke; position: relative;">
					<view style="display: none;">监听到的内容:{{ inputString }}</view>
					<view style="height: 1000rpx; overflow: auto;">
						<view class="index-list">
							<view class="index-list-item" v-for="(item,idx) in listt" :key="idx"
								@click="addToCart(item)">
								<image :src="item.images[0]||'../../static/index_img3.png'" mode="heightFix"
									class="img"></image>
								<view class="title">{{item.title}}</view>
								<view class="num">
									<view class="price"><text>¥</text>{{item.mallPrice}} </view>
									<view>
										<view style="color: #7f7f7f; font-size: 27rpx; margin-right: 20rpx;">
											规格:{{item.specialSpec}}</view>
									</view>
								</view>
							</view>
							<uni-load-more :status="status" :icon-size="16" :content-text="contentText" />
						</view>
					</view>
				</view>
				<view style="flex: 10%; background-color: #ffffff; display: flex; justify-content: space-between;">
					<view
						style="flex: 40%; background-color: #ffffff; display: flex; justify-content: space-between; margin-right: 200rpx;">
					</view>
					<view style="flex: 60%; background-color: #ffffff; display: flex; justify-content: space-between;">
						<view
							style="flex: 33.33%; background-color: #4CAF50; margin: 10rpx 20rpx 15rpx 20rpx; display: flex; justify-content: center; align-items: center;">
							<text
								style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 50rpx; font-weight: 400;">整单取消</text>
						</view>
						<view
							style="flex: 33.33%; background-color: #ffaa00; margin: 10rpx 20rpx 15rpx 20rpx; display: flex; justify-content: center; align-items: center;">
							<text
								style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 50rpx; font-weight: 400;">挂单</text>
						</view>
						<view
							style="flex: 33.33%; background-color: #ff7259; margin: 10rpx 20rpx 15rpx 20rpx; display: flex; justify-content: center; align-items: center;"
							@click="toUrl(`/pages/menstore/jiesuan`)">
							<text
								style="color: white; font-size: 14px; text-align: center; line-height: 50px; font-size: 60rpx; font-weight: 400;">结算</text>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				delBtnWidth: 160,
				// dataList: [{
				// 	id: 1,
				// 	number: '1',
				// 	content: '1',
				// 	right: 0
				// },  ],
				dataList: [],
				isScroll: true,
				windowHeight: 0,
				content: "", //商品搜索条件
				member: {},
				// 
				isReferrer: '1', // 添加会员默认选中第一个
				referrerPhone: '', //添加会员第三个按钮推荐人手机号
				showInput: false, //添加会员第三个按钮推荐人手机号输入框的显示与隐藏
				othersname: null, //添加会员输入会员名
				othersPhone: null, //添加会员输入会员手机号

				inputString: '', //监听到的内容,则是用户最终确认输入后的结果
				inputCache: '', //像是一个正在输入的字符的容器
				userData: null, // 用于存储从本地存储获取的用户数据
				contentText: {
					contentdown: '上拉加载更多',
					contentrefresh: '加载中',
					contentnomore: '没有更多'
				},
				status: 'more',
				checkAll: false,
				listt: [], //仓库的商品数量
				reload: false, //是否下拉重新加载     //reload (Boolean): 一个标志,用来指示是否需要重新加载数据。这通常在下拉刷新时设置为true
				status: 'more', //  用于在列表底部显示加载更多的提示信息。状态(status)
				size: 24, //size (Number): 指定每次从服务器加载数据时获取的项目数量。
				current: 1, //current (Number): 当前加载的数据页码,用于实现分页加载。
				total: 0, //total (Number): 数据的总数量,用于判断是否还有更多数据可加载
				// contentText (Object): 定义了加载更多组件(uni-load-more)的不同状态下显示的文本,如“上拉加载更多”、“加载中”、“没有更多”。
				contentText: {
					contentdown: '上拉加载更多',
					contentrefresh: '加载中',
					contentnomore: '没有更多'
				},
				clockweightdata: '', // 会员手机号
				passwordData: '', // 会员密码
				activeInput: 'phone', // 当前激活的输入框
				showKeyboard: true, // 键盘的显示状态
			};
		},
		onLoad(options) {
			this.getUserData(); //从缓存里面拿到登陆的user信息
			this.getList(); //仓库的商品信息
			wx.getSystemInfo({
				success: res => {
					this.windowHeight = res.windowHeight;
				}
			});
		},
		// 处理下拉刷新
		onPullDownRefresh() {
			this.reload = true;
			this.getList();
		},
		// 上拉加载更多的逻辑
		onReachBottom() {
			this.status = this.listt.length >= this.total ? '' : 'more';
			this.getList();
		},
		computed: {
			// 购物车的数量
		    totalItems() {
		        return this.dataList.reduce((total, item) => total + parseInt(item.number), 0);
		    },
			//购物车的总价
			  totalPrice() {
			        return this.dataList.reduce((total, item) => {
			            return total + (parseFloat(item.mallPrice) * parseInt(item.number));
			        }, 0).toFixed(2); // 结果保留两位小数
			    }
		},
		mounted() {
			// #ifdef APP-PLUS
			plus.key.addEventListener("keyup", this.keypress);
			// #endif 
			// #ifdef H5
			document.addEventListener("keyup", this.keypress);
			// #endif
		},
		watch: {
			isReferrer(newVal) {
				this.showInput = newVal === '3';
			},
		},
		methods: {
			addToCart(item) {
				// 检查商品是否已经在购物车中
				let found = this.dataList.find(cartItem => cartItem.id === item.id);
				if (found) {
					// 如果商品已在购物车中,则增加其数量
					found.number++;
				} else {
					// 如果商品不在购物车中,添加到购物车并设置初始数量为 1
					this.dataList.push({
						...item,
						number: 1
					});
				}
			},
			onSearch() {
				console.log("chahcahchachcha");
				// 检查是否输入了搜索的内容
				if (!this.content) {
					this.common.UshowToast('请输入搜索内容进行查询');
					return;
				}
				console.log("999999");
				// 重置当前页码
				this.current = 1;
				// 构建搜索查询字符串
				let query = `?current=${this.current}&size=${this.size}&content=${this.content}`;
				let url = this.jk.storeMyWarehouse + query;
				// 执行搜索
				this.ajax.get(url).then(res => {
					this.total = res.data.total;
					let list = res.data.records;
					// 使用搜索结果更新listt,而不是将其附加到原有列表
					this.listt = list;

					// 其他必要的状态更新
					if (list.length < this.size) this.status = '';
					this.reload = false;
				})
			},
			// 输入框扫码枪输入商品条形码
			handleBarcodeInput() {},
			getList() {
				uni.stopPullDownRefresh();
				if (this.listt.length != 0 && this.listt.length == this.total)
					return;
				if (this.listt.length < this.total) {
					this.current = this.reload ? 1 : this.current + 1;
				}
				let query =`?current=${this.current}&size=${this.size}`;
				let url = this.jk.storeMyWarehouse + query;
				this.ajax.get(url).then(res => {
					this.total = res.data.total;
					let list = res.data.records;
					this.listt = this.reload ? list : this.listt.concat(list);
					if (list.length < this.size) this.status ='';
					this.reload = false;
				})
			},
			// 添加会员按钮
			onRadioGroupChange(event) {
				// 更新 isReferrer 值
				this.isReferrer = event.target.value;
			},
			keypress(e) {
				if (e.key === 'Enter') {
					this.inputString = this.inputCache;
					// 判断扫码类型
					if (this.isProductBarcode(this.inputString)) {
						// 处理商品条形码
						this.handleProductBarcode(this.inputString);
					} else {
						// 处理会员二维码
						this.handleMemberQRCode(this.inputString);
					}
					this.inputCache = '';
				} else {
					this.inputCache += e.key;
				}
			},
			isProductBarcode(input) {
				// 检查是否全为数字且长度符合商品条形码的常见长度
				return /^\d{12,13}$/.test(input); // 例子中假设商品条形码是12或13位数字
			},
			// 处理会员二维码逻辑
			handleMemberQRCode(code) {
				console.log("这是会员扫码传入的code", code);
				// 对code进行URL编码
				let cleanedResult = this.restoreUpperCase(code);
				console.log("去除Shift后的code", cleanedResult);
				// 对清理后的code进行URL编码
				const encodedData = encodeURIComponent(cleanedResult);
				console.log("URL编码后的code:", encodedData);
				// 调用API或进行其他处理
				this.callApiWithEncodedData(encodedData);
			},
			restoreUpperCase(input) {
				// 首先,处理Shift=的情况,将其转换为+
				input = input.replace(/Shift=/g, '+');
				// 然后,使用正则表达式匹配所有的"Shift"后跟一个小写字母的模式
				return input.replace(/Shift([a-z])/g, (match, p1) => {
					// 将捕获的小写字母转换为大写
					return p1.toUpperCase();
				});
			},
			callApiWithEncodedData(imageData) {
				// console.log("9999999999999999999999999999999999999999999999999999999999999999");
				// 使用 imageData 调用API的逻辑
				// console.log('调用API,传送数据:', imageData);
				this.ajax.get(this.jk.getUserByQRCode + '?qrcode=' + imageData).then(res => {
					this.member = res.data;
					console.log("alalallalalalalalalalalalalalalal");
					console.log(this.member);
					// 其他代码(如果有的话)
				})
				// 例如:axios.post('/your-api-endpoint', { image: imageData });
			},
			handleProductBarcode(barcode) {
					console.log("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
					console.log(this.inputString);
			    // 通过条形码查询商品
			    // 假设 ajax.get(url) 能够根据条形码获取商品信息
			   let query = `?current=${this.current}&size=${this.size}&content=${this.inputString}`;
			    let url = this.jk.storeMyWarehouse + query;
			   this.ajax.get(url).then(res => {
			       let products = res.data.records;
			       if (products.length > 0) {
			           let productToAdd = products[0]; // 假设我们添加第一个商品
			   
			           let found = this.dataList.find(cartItem => cartItem.id === productToAdd.id);
			           if (found) {
			               found.number++;
			           } else {
			               this.dataList.push({
			                   ...productToAdd,
			                   number: 1
			               });
			           }
			       }
			   });
			},
			// 获取用户数据
			getUserData() {
				const user = uni.getStorageSync('user');
				if (user) {
					this.userData = user;
					// 在这里你可以根据 userData 渲染页面
				} else {
					// 用户数据不存在的处理逻辑
					// console.log('No user data found in local storage');6901826888138
				}
			},

			toUrl(url) {
				// 实现跳转逻辑,你可以根据自己的需求来实现
				console.log('跳转到', url);
			},
			getType(categoryId) {
				// 实现获取类型逻辑,你可以根据自己的需求来实现
				return categoryId;
			},
			// 跳转页面
			toUrl(url) {
				this.common.UnavigateTo(url)
			},
			// 退出按钮
			onQuit() {
				uni
					.clearStorage(); //使用uni.clearStorage();清除了UniApp中的本地存储内容。这意味着所有通过uni.setStorageSync(或相似方法)存储的数据都会被清除。它通常用于用户登出或退出应用时清除用户的会话数据或其他敏感信息。
				this.common.UreLaunch('/pages/other/login')
			},
			// 购物车的逻辑
			drawStart: function(e) {
				// console.log("drawStart");
				var touch = e.touches[0];
				console.log(touch, 'touch');
				for (var index in this.dataList) {
					this.dataList[index].right = 0;
				}
				this.startX = touch.clientX;
			},
			drawMove: function(e) {
				var touch = e.touches[0];
				var item = this.dataList[e.currentTarget.dataset.index];
				var disX = this.startX - touch.clientX;

				if (disX >= 20) {
					if (disX > this.delBtnWidth) {
						disX = this.delBtnWidth;
					}
					this.isScroll = false;
					this.dataList[e.currentTarget.dataset.index].right = disX;
				} else {
					this.isScroll = true;
					this.dataList[e.currentTarget.dataset.index].right = 0;
				}
			},
			drawEnd: function(e) {
				var item = this.dataList[e.currentTarget.dataset.index];
				if (item.right >= this.delBtnWidth / 2) {
					this.isScroll = true;
					this.dataList[e.currentTarget.dataset.index].right = this.delBtnWidth;
				} else {
					this.isScroll = true;
					this.dataList[e.currentTarget.dataset.index].right = 0;
				}
			},
			delItem(index, event) {
				console.log("Deleting item at index:", index);
				event.stopPropagation(); // 阻止事件冒泡
				event.preventDefault(); // 阻止默认行为
				this.dataList.splice(index, 1);
			},
			//商品数量变化——加
			onJia(item) {
				item.number = parseInt(item.number) + 1;
			},
			//商品数量变化——减
			onJian(item) {
				if (parseInt(item.number) > 1) {
					item.number = parseInt(item.number) - 1;
				}
			}
		},
		beforeDestroy() {
			// #ifdef APP-PLUS
			plus.key.removeEventListener("keyup", this.keypress);
			// #endif
			// #ifdef H5
			document.removeEventListener("keyup", this.keypress);
			// #endif
		}
	};
</script>

<style lang="less">
	// 刚开始基本样式
	.container {
		display: flex;
		flex-direction: column;
		height: 100vh;
		/* 设置容器高度占满整个视窗 */
		background-color: #f0f0f0;
	}

	.top {
		width: 100%;
		background-color: #4CAF50;
		/* 顶部区域的背景颜色,可根据需求修改 */
		display: flex;
		/* 使用flex布局 */
		justify-content: space-between;
		/* 平均分布子元素 */
	}

	.box {
		height: 100%;
		/* 子盒子高度与父盒子相同 */
		display: flex;
		/* 使用flex布局 */
		align-items: center;
		/* 垂直居中子元素 */
	}

	.image {
		width: 120rpx;
		/* 设置图片宽度,根据需要调整 */
		height: 120rpx;
		/* 设置图片高度,根据需要调整 */
		margin-right: 10rpx;
		/* 设置图片右侧的间距,根据需要调整 */
		margin-left: 10rpx;
		/* 设置图片右侧的间距,根据需要调整 */
	}

	.text {
		font-size: 40rpx;
		/* 设置文本的字体大小,根据需要调整 */
	}

	/* 子盒子样式和底部样式保持不变 */
	.sub-box {
		flex: 1;
		height: 100%;
	}

	/* 内部盒子样式 */
	.inner-box {
		background-color: #ff5733;
		margin: 10rpx;
		display: flex;
		justify-content: space-around;
	}
	.bottom {
		display: flex;
		flex-direction: row;
		flex: 1;
	}

	.left {
		width: 30%;
		/* background-color: white; */
	}


	.avatariimage {
		height: 120rpx;
		width: 120rpx;

	}

	.right {
		width: 70%;
		background-color: white;
	}

	/* 图标样式 */
	.icon {
		margin-top: 5px;
		width: 50rpx;
		height: 50rpx;
	}

	.icon-text {
		font-size: 30rpx;
		text-align: center;
		margin-top: 10px;
		/* 文本距离图标的上边距 */
	}

	/* 修改sub-inner-box样式 */
	.sub-inner-box {
		display: flex;
		flex-direction: column;
		align-items: center;
		margin: 5rpx;
		/* 垂直居中子元素 */
		width: 60px;
		height: 55px;
		/* 让子盒子的高度自适应内容 */
	}

	//仓库商品样式
	.index-list {
		.index-list-item {
			margin: 1%;
			width: 14.67%;
			/* 调整为约14.67% */
			display: inline-block;
			vertical-align: top;
			box-sizing: border-box;
			background-color: #FFFFFF;
			padding-bottom: 10px;
			overflow: hidden;
			text-align: center;
		}

		.img {
			height: 200rpx;
		}

		.title {
			font-size: 28rpx;
			overflow: hidden;
			text-overflow: ellipsis;
			display: -webkit-box;
			-webkit-line-clamp: 2;
			-webkit-box-orient: vertical;
			height: 80rpx;
			padding: 0 10rpx;
			text-align: left;
		}

		.num {
			padding: 0 10rpx;
			display: flex;
			justify-content: space-between;
			align-items: center;

			.price {
				font-size: 32rpx;
				color: #FF1616;
				font-weight: 600;

				/* 修改这里 */
				text {
					font-size: 24rpx;
				}
			}

			.market {
				font-size: 26rpx;
				color: #777;
				margin-top: 10rpx;
				text-decoration: line-through;
			}

			.u {
				font-size: 26rpx;
				color: #FF9800;

				text {
					color: #FFFFFF;
					background-color: #FF9800;
					border-radius: 6rpx;
					margin-right: 10rpx;
				}
			}
		}
	}






	.shop-cart-list-item {
		height: 240rpx;
		width: 100%;
		display: flex;
		position: relative;
		background-color: #FFFFFF;
		transition: all 0.2s;
		margin-bottom: 10rpx;

		.radio {
			line-height: 180rpx;
			margin-right: 20rpx;
		}

		.img {
			width: 180rpx;
			height: 180rpx;
			flex-shrink: 0;
		}

		.desc {
			width: 100%;
			padding: 0 20rpx;

			.title {
				color: #101010;
				overflow: hidden;
				text-overflow: ellipsis;
				display: -webkit-box;
				-webkit-line-clamp: 2;
				-webkit-box-orient: vertical;
			}

			.num {
				display: flex;
				justify-content: space-between;
				margin-top: 20rpx;

				.price {
					font-size: 36rpx;
					color: #FF1616;
					font-weight: bold;
				}

				.shu {
					color: #888888;

					.jian,
					.jia,
					.num {
						width: 40rpx;
						height: 40rpx;
						line-height: 40rpx;
						display: inline-block;
						text-align: center;
						color: #333333;
					}

					.jian,
					.jia {
						border: 1px solid #333333;
						border-radius: 100%;
					}

					.disable {
						border-color: #888888;
						color: #888888;
					}
				}
			}
		}
	}

	.remove {
		width: 180rpx;
		/* 增加宽度 */
		height: 100%;
		background-color: red;
		color: white;
		position: absolute;
		top: 0;
		right: -180rpx;
		/* 根据新的宽度调整 */
		display: flex;
		justify-content: center;
		align-items: center;
		z-index: 100;
		/* 确保是最高 */
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML 怎么调用 C++ 中的内容?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ 先说明一下测试环境 编译器&#xff1a;vs2017x64 开发环境&#xff1a;Qt5.12 这里主要是总结一下&#xff0c;怎么在…

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a;“我会做这种&#xff01;” 原来他会…

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了&#xff0c;近期一直在忙项目的事&#xff0c;才有时间写博客&#xff0c;近期频繁出现sql问题&#xff0c;今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警&#xff0c;有个6千万的日志表&#xff0c;查询耗时大…

YOLO训练results.csv文件可视化(原模型与改进模型对比可视化)

一、单独一个文件可视化&#xff08;源码对应utils文件夹下的plots.py文件的plot_results类&#xff09; from pathlib import Path import matplotlib.pyplot as plt import pandas as pd def plot_results(fileruns/train/exp9/results.csv, dir):# Plot training results.c…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ 可定制化

工程项目管理软件是现代项目管理中不可或缺的工具&#xff0c;它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件&#xff0c;该软件采用先进的Vue、Uniapp、Layui等技术框架&#xff0c;涵盖了项目策划决策、规划设计、施工建设到竣工交付…

机器学习距离度量方法

1. 机器学习中为什么要度量距离&#xff1f; 机器学习算法中&#xff0c;经常需要 判断两个样本之间是否相似 &#xff0c;比如KNN&#xff0c;K-means&#xff0c;推荐算法中的协同过滤等等&#xff0c;常用的套路是 将相似的判断转换成距离的计算 &#xff0c;距离近的样本相…

cdn引入React以及React-dom—数组遍历渲染时setExtraStackFrame报错

在引入react官网提供的cdn后&#xff0c;部分静态页面没有问题&#xff0c;但是使用到 一下循环的页面则会报错。 const devReactCdn [https://unpkg.com/react18/umd/react.development.js,https://unpkg.com/react-dom18/umd/react-dom.development.js, ]; const prodReact…

计算机网络【DHCP动态主机配置协议】

DHCP 出现 电脑或手机需要 IP 地址才能上网。大刘有两台电脑和两台手机&#xff0c;小美有一台笔记本电脑、一台平板电脑和两台手机&#xff0c;老王、阿丽、敏敏也有几台终端设备。如果为每台设备手动配置 IP 地址&#xff0c;那会非常繁琐&#xff0c;一点儿也不方便。特别是…

web前端开发网页制作html/css结课作业

效果图展示&#xff1a; 注意事项&#xff1a; 引用JQuery文件地址和图片地址要更换一下。 百度网盘链接&#xff1a; http://链接&#xff1a;https://pan.baidu.com/s/1wYkmLr7csjBwQY6GmlYm4Q?pwd4332 提取码&#xff1a;4332 html界面展示&#xff1a; main.css代码部…

2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码

题目背景&#xff1a;目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条&#xff0c;聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大…

docker-compose安装及转换为k8s集群部署

docker-compose安装及转换为k8s集群部署 一、docker-compose安装 1、下载 curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 2、指定位置 放入/usr/local/bin/ 路径下&#xff1a; mv docker-compose-linux-x86_64 docke…

pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

一、问题描述 在VS Code中运行Terminal中运行pnpm install&#xff08;npm或yarn也类似&#xff09;报错&#xff1a; S D:\workspace\xxx\xxx> pnpm install pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息…

K8s陈述式资源管理

命令行&#xff1a;kubectl命令行工具 优点&#xff1a;90%以上的场景都可以满足 对资源的增删改查比较方便&#xff0c;对改不是很友好。 缺点&#xff1a;命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式&#xff1a; 看到声明式都是k8s当中的yml文件来实现资源管理…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文&#xff0c;提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类&#xff0c;论文不仅显示了模型还构建了完整的…

无需翻墙|Stable Diffusion WebUI 安装|AI绘画

前言 最近终于有机会从围墙里往外看&#xff0c;了解到外面的世界已经有了天翻地覆的变化&#xff0c;感叹万千&#xff0c;笔者在本地mac&#xff0c;windows&#xff0c;linux&#xff0c;docker部署了不下20遍后&#xff0c;整理出来的linux极简避坑安装方案&#xff0c;供…

一体化、一站式!智能视频客服加码全媒体云呼叫中心能力

凭借对电话、短信、邮件、社交媒体、视频等数种沟通渠道强大的统一集成能力&#xff0c;全媒体云呼叫中心已跃升成为现代企业客户服务的核心工具&#xff0c;高效便捷地为企业提供客户服务。而随着消费者需求愈加多元化和个性化&#xff0c;传统的语音通话方式已无法满足部分消…

雪花算法(Snowflake)介绍和Java实现

1、雪花算法介绍 (1) 雪花算法(SnowFlake)是分布式微服务下生成全局唯一ID&#xff0c;并且可以做到去中心化的常用算法&#xff0c;最早是Twitter公司在其内部的分布式环境下生成ID的方式。 雪花算法的名字可以这么理解&#xff0c;世界上没有两片完全相同的雪花&#xff0c;…

java爬虫(jsoup)如何设置HTTP代理ip爬数据

目录 前言 什么是HTTP代理IP 使用Jsoup设置HTTP代理IP的步骤 1. 导入Jsoup依赖 2. 创建HttpProxy类 3. 设置代理服务器 4. 使用Jsoup进行爬取 结论 前言 在Java中使用Jsoup进行网络爬虫操作时&#xff0c;有时需要使用HTTP代理IP来爬取数据。本文将介绍如何使用Jsoup设…

认识微服务---Spring Cloud

一、服务架构演变 1、单体架构&#xff1a;将业务的所有功能集中在一个项目开发&#xff0c;打包成一个部署。 优点&#xff1a; 架构简单部署成本低 缺点&#xff1a; 耦合度高不利于大型项目开发 2、分布式架构 &#xff1a;根据业务功能对系统进行拆分&#xff0c;每个…

系列十二、Linux中安装Zookeeper

一、Linux中安装Zookeeper 1.1、下载安装包 官网&#xff1a;Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 1.3、解…