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

效果:

代码:

<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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark Streaming

目录 一、流计算概述 &#xff08;一&#xff09;静态数据和流数据 &#xff08;二&#xff09;批量计算和实时计算 &#xff08;三&#xff09;流计算概念 &#xff08;四&#xff09;流计算框架 &#xff08;五&#xff09;流计算处理流程 二、Spark Streaming &…

提升数据库性能的关键指南-Oracle AWR报告

文章目录 一、了解AWR报告&#xff1a;数据库性能的仪表盘二、生成AWR报告三、解读AWR报告的关键部分1.报告开头的系统基础信息2.ADDM发现3.负载概览(Load Profile)4.参数文件5.顶级前台等待事件6.SQL 统计信息-顶级SQL7.SGA Advisory AND PAG Advisory 一、了解AWR报告&#x…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 为设计一个安全便捷&#xff0c;并且使用户更好获取本学院…

【笔试强训】Day1_贪心算法_组队竞赛

题目链接&#xff1a;牛客_组队竞赛 目录 题目解析 代码书写 知识补充 题目解析 题目让我们求所有队伍的水平值总和最大 由题可得&#xff1a; 队伍的水平值等于该队伍队员中第二高水平值; 随机给定3*n个数&#xff0c;需要自己组队并且得出队伍水平最大值&#xff1b; 我…

Unity中Shader裁剪空间推导(透视相机到裁剪空间的转化矩阵)

文章目录 前言一、简单看一下 观察空间—>裁剪空间—>屏幕空间 的转化1、观察空间&#xff08;右手坐标系、透视相机&#xff09;2、裁剪空间&#xff08;左手坐标系、且转化为了齐次坐标&#xff09;3、屏幕空间&#xff08;把裁剪坐标归一化设置&#xff09;4、从观察空…

android studio 将含有jni c++ 的library项目封装成jar并调用

请参考博客&#xff1a;android studio 4.1.1 将library项目封装成aar 并调用_android studio 4.1 aar release-CSDN博客 一 . 简单叙述 android studio 中可以创建Module 的两种属性&#xff0c;可以在build.gradle 中查看&#xff1a; 1. application属性&#xff1a;可以独…

字符串转换tuple对象

给定“前导空格分隔的元组字符串”&#xff0c;还原成合法的python元组tuple对象。 (笔记模板由python脚本于2023年12月29日 19:29:03创建&#xff0c;本篇笔记适合熟悉Python元组tuple的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org…

腾讯云标准型S5服务器4核8G配置优惠价格表

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云…

docker入门概念详解

本篇文章对docker的一些基础概念和周边概念进行了详细解释。帮助你可以很好的理解docker是用来干什么的&#xff0c;docker是怎么工作的。其中有docker所运用到的技术解释&#xff0c;docker的不同发展版本&#xff0c;dokcer的架构&#xff0c;docker的生态等等详解。希望本片…

Django 文件上传(十二)

当 Django 处理文件上传时&#xff0c;文件数据最终会被放置在 request.FILES 。 查看文档&#xff1a;文件上传 | Django 文档 | Django Django工程如下&#xff1a; 创建本地存储目录 在static/应用目录下创建uploads目录用于存储接收上传的文件 在settings.py 配置静态目…

Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行-“/”引发的脑裂

引起该不适的一种可能以及解决方案&#xff0c;网上较多&#xff0c;比如&#xff1a; 但按以上方式操作&#xff0c;并经过查看&#xff0c;发现仍然未能解决问题。 因为两种方式执行&#xff0c;有一种能成功&#xff0c;有一种不能&#xff0c;刚开始未怀疑是文件问题&…

写实风格3D模型材质贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 写实3D模型的制作过程包括建模、材质贴图、灯光设置和渲染等步骤。首…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块&#xff0c;像NLP的句子那样按顺序进入transformer&#xff0c;经过MLP后&#xff0c;输出类别。每个小块是16x16&#xff0c;进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息&#xff0c;…

【软件测试】为bug而生

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式

谈一谈Redis的集群模式 ✔️ 谈一谈Redis的集群模式✔️主从模式✔️ 特点✔️Redis主从模式Demo ✔️哨兵模式✔️Redis哨兵模式Demo✔️特点 ✔️Cluster模式✔️Redis Cluster模式Demo✔️特点 ✔️ 谈一谈Redis的集群模式 Redis有三种主要的集群模式&#xff0c;用于在分布…

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域&#xff0c;各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域&#xff0c;不同电气产品的外壳、组件材质采用不同材料&#xff0c;以同为科技&#xff08;TOWE&#xff09;电气产品为例&#xff0c;工业连接器系列产品采用PA6外壳材质、机…

【SD】一致性角色 - 表情差异生成 【1】

原理&#xff1a;通过segment 局部重绘 可以根据lora 产生面部表情图片 模型&#xff1a;sam_vit_h_4b8939.pth 导入图片到segment 开启&#xff1a;Enable GroundingDINO GroundingDINO Detection Prompt &#xff1a;输入 face 然后点击&#xff1a;Preview Segmentation …

如何文件从电脑传到iPhone,这里提供几个方法

本文介绍了如何使用Finder应用程序、iTunes for Windows、iCloud和谷歌照片将照片从Mac或PC传输到iPhone。 如何将照片从Mac传输到iPhone 如果你有一台Mac电脑&#xff0c;里面装满了你想转移到iPhone的照片&#xff0c;这是一件非常简单的事情。只需遵循以下步骤&#xff1a…

LIUNX进程程序替换

1.什么是程序替换 a.一个程序&#xff0c;只能执行自己的代码 b.如果想要一个程序执行&#xff0c;别的程序的代码呢&#xff1f; 我们就可以创建一个子进程&#xff0c;将这个子进程替换为我们想要执行的程序。 2.样例代码-----execl&#xff08;接口&#xff09; 返回值&…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…