uniapp-商城-34-shop 购物车 选好了 进行订单确认整体

在shop页面选中商品添加到购物车,可选好后,进行确认和支付。具体呈现在shop页面。

1 购物车栏

shop页面代码:

购物车代码:

代码:

<template><view><view class="carlayout"><!-- 车里面 点击购物车 弹出的内容 --><view class="goods" v-if="carShow"><!-- 弹窗列表 --><view class="head"><view class="text">已选商品</view><view class="empty" @click="clearCar">清空</view></view><scroll-view scroll-y="true" class="body"><view calss="scrollContent"><view class="caritem" v-for="item,index in carsList" :key="index"><car-item :item="item"></car-item></view></view></scroll-view></view><!-- 购物车 --><view class="content"><view class="left"><view class="icon" hover-class="iconhover" hover-stay-time="50" hover-start-time="10" @click="onClickCar" v-if="!type"><!-- 鼠标点击就会 触发 iconhover 这个类名   --><!-- hover-stay-time 弹回 就很块了只有 50ms --><u-icon name="shopping-cart" size="50" color="#5ac725"></u-icon><view class="num">{{totalNumValue}}</view></view><view class="price" >合计<text class="text">¥{{totalPrice}}</text></view></view><view class="right"><view class="btn disable" v-if="!type"  @click="goPaypage">选好了</view><view class="btn disable" v-else  @click="confirmPay">支付</view></view></view><view class="safeAreaBottom"></view><!-- 上面安全区域是设置为ios使用的,怕底部的区域被遮挡了 --></view><!-- 遮罩层  u-overlay 通过zindex 来层级显示--><u-overlay :show="carShow" z-index="9" @click="onClickCar" duration="100"></u-overlay></view><!-- 这里有一个遮罩在view外,所以总的来说就还要一个 盒子,这vue2规定只能有一个顶级盒子在template中,不能多个盒子并起来,必须把里面的盒子包裹起来 -->
</template><script>import {mapState,mapMutations,mapGetters} from "vuex"export default {name: "car-Layout",data() {return {carShow:false,};},props:{type:{type:String,default:""}},computed:{...mapGetters(["carsList","totalPrice","totalNumValue"])},methods:{...mapMutations(["setCarsList"]),//确认支付confirmPay(){console.log("确认支付");},//清空购物车clearCar(){this.setCarsList(0);},//点击购物车,改变carShow,进而改变显示状态onClickCar(){this.carShow=!this.carShow;},//点击选好了,跳转到支付页面goPaypage(){uni.navigateTo({url:"/pagesub/pageshop/paypage/paypage"})}}}
</script><style lang="scss" scoped>.carlayout {//有这个 content 下面的css始终不生效    太tmd 想爆粗口了   找了好久这个问题,最后发现是 class写错了  写成了 		<view calss="carlayout">position: relative; //相对定位,不脱离文档流z-index: 10;   //比 u-overlay  遮罩层 高就好.goods {border-bottom: 1rpx solid $border-color-light;padding: 30rpx 30rpx 0;border-radius: 20rpx 20rpx 0 0;background-color: #fff;.head {@include flex-box();color: $text-font-color-3;padding: 25rpx 0;.empty {color: $brand-theme-color-aux;}}.body {height: 500rpx;}}.content {display: flex;justify-content: space-between;align-items: center;padding: 0 30rpx;height: 140rpx;background: #fff;.left {@include flex-box();.iconhover {transform: scale(0.7); //鼠标点击后就缩小到0.8 然后松开鼠标就弹回 1}.icon {width: 80rpx;height: 80rpx;background-color: #eee;border-radius: 10rpx;@include flex-box-set();position: relative; //这里就是相对定位  就是为后面的num  固定到右上角的绝对定位做铺垫   num就是子级  这里的icon 就是父级margin-right: 30rpx;.num {width: 36rpx;height: 36rpx;background: $brand-theme-color;border-radius: 50%; //圆形color: #fff;position: absolute; //这里就是绝对定位   固定到icon右上角的绝对定位  num就是子级  icon 就是父级right: -18rpx;top: -18rpx;@include flex-box-set();font-size: 22rpx;}}.price {font-size: 28rpx;.text {font-size: 32rpx;font-weight: bold;}}}.right {.btn {width: 210rpx;height: 75rpx;background: $brand-theme-color;@include flex-box-set();color: #fff;border-radius: 10rpx;&.disable {opacity: 0.4; //表示透明度    变透明意思是disable了}}}}.safeAreaBottom {//这个是 用来设置ios的安全区域的,安卓是不能执行env(safe-area-inset-bottom)  这句话的width: 100%;height: env(safe-area-inset-bottom);background: #fff;}}//有这个  下面的css始终不生效
</style>

2 购物篮代码解析

2.1、shop就使用了组件

2.2、购物车中,右边的文字就是支付和选好了

选好了跳转到确认订单页面

支付就是在订单页面展现的

实现的是一个组件多个页面共用

3 确认订单页面的代码

3.1、页面组成

a、确认页面,存在外送  自提选项,主要差异:

外送和自提组件:delivery-layout  

自提选项中,需要展示商家地址、 自提时间  还有商家的联系方式

外送选项中,主要就是收货地址 收货人

b、相同点 为 购物车中商品信息(goods-list组件)

c、另外还存在支付选项

支付宝和微信,默认选项为微信

d、购物车中,右边 为支付(在shop页面显示为选好了)

3.2 确认订单具体代码

<template><view class="paypage"><!-- 确认订单,支付订单 --><!-- 配送方式 --><delivery-layout></delivery-layout><!-- 购物列表 --><view class="goodsList"><goods-list></goods-list></view><!-- #ifndef MP-WEIXIN --><view class="payType"><view class="box" :class="item.value==payDefValue ? 'active' : ''" v-for="item,index in payType":key="index" @click="clickBtn(item.value)"><u-icon :name="item.icon" size="26" class="icon":color="item.value==payDefValue ? item.color :''"></u-icon><text class="font">{{item.name}}</text><!-- <u-icon name="weixin-fill" size="26" class="font"></u-icon><text class="font">微信</text>--></view></view><!-- #endif --><view class="payTabbar"><car-Layout type="pay"></car-Layout></view><view class="safeAreaBottom"></view><!-- 上面安全区域是设置为ios使用的,怕底部的区域被遮挡了 --></view>
</template><script>export default {data() {return {// #ifdef MP-WEIXINpayDefValue: "wxpay",// #endif// #ifndef MP-WEIXINpayDefValue: "alipy",// #endifpayType: [{name: "支付宝",value: "alipy", //必须写这个值,后面要用到icon: "zhifubao",color: "#1578ff", //:color="item.value==payDefValue ? item.color :''"},{name: "微  信",value: "wxpay", //必须写这个值,后面要用到icon: "weixin-fill",color: "#04c15f", //:color="item.value==payDefValue ? item.color :''"},]};},methods: {//切换支付方式clickBtn(type) {this.payDefValue = type}}}
</script><style lang="scss">page {background-color: $page-bg-color;}.paypage {padding: 30rpx;.goodsList {margin-top: 30rpx;}.payType {@include flex-box();.box {//box 就两个支付方式    width: 45%; //一个支付方式站49 剩下中间的2的空格height: 75rpx;background: #fff;border-radius: 10rpx;@include flex-box-set();// filter: grayscale(100%);   //滤镜效果  100%把颜色全滤掉      我们已经用了 :color="item.value==payDefValue ? item.color :''"  就不用滤镜了border: 1rpx solid #fff;.font {padding-left: 10rpx;}}//可以这样 当用text时,若用view + style  就不用下面的方式.box:first-child.active {border-color: #1578ff; //边框颜色color: #1578ff;}.box:last-child.active {border-color: #04c15f;color: #04c15f;}}.payTabbar {position: fixed;width: 100%;bottom: 0;left: 0}}
</style>

3.3 配送方式代码:

<template><view class="delivery"><view class="headNav">外送</view><view class="body"><view class="box" @click="goAddress"><view class="left">收货地址</view><view class="center"><view v-if="deliveryInfo.address"><view class="detail">{{deliveryInfo.address}}</view><view class="userinfo">{{deliveryInfo.username + "-" + deliveryInfo.mobile}}</view></view><view class="addressTxt" v-else>请添加收货地址</view></view><view class="right"><u-icon name="arrow-right" color="#999" size="18"></u-icon></view></view></view></view>
</template><script>export default {name:"delivery-layout",data() {return {deliveryInfo:{address:"北京市海定区颐和园路",username:"李晓峰",mobile:null}}},methods:{goAddress(){uni.navigateTo({url:"/pagesub/pageshop/address/addrlist"})}}}
</script><style lang="scss">
.delivery{.headNav{width: 100%;height: 78rpx;background: #fff;@include flex-box-set();color:$brand-theme-color;border-radius: 15rpx 15rpx 0 0;}.body{background: #fff;padding:25rpx;.box{padding:40rpx 20rpx;background: $page-bg-color;border-radius: 10rpx;font-size: 30rpx;@include flex-box();.center{flex:1;padding:0 30rpx;font-size: 30rpx;.userinfo{padding-top:10rpx;}}}}
}
</style>

3.4 收货地址页面:

订单页面需要添加地址时,需跳转到这个页面

<template><view class="selfAddress"><!-- 地址列表 --><view class="headTop"><view class="title">地址簿</view><navigator class="addressBtn" url="/pagesub/pageshop/address/addredit">+ 添加地址</navigator></view><view class="list"><view class="item" v-for="item,index in 3" :key="index"><view class="head"><view class="user">张三,18066668888</view><view class="select"><u-button v-if="false" color="#EC544F" plain size="mini" text="默认地址"></u-button><u-button color="#666" v-else plain size="mini" text="设为默认"></u-button></view></view><view class="more">云南省昆明市高新区XXX楼</view></view></view></view>
</template><script>export default {data() {return {};}}
</script><style lang="scss">
page{background: $page-bg-color;
}
.selfAddress{padding:30rpx;.headTop{@include flex-box();font-size: 30rpx;font-weight: bold;.addressBtn{border:1px solid #000;border-radius: 50rpx;padding:6rpx 15rpx;}}.list{padding-top:30rpx;.item{background: #fff;padding:40rpx 20rpx;margin-bottom: 30rpx;border-radius: 15rpx;.head{@include flex-box();font-weight: bold;}.more{font-size: 28rpx;color:$text-font-color-3;padding-top:10rpx;}}}
}
</style>

3.5 地址页面修改和添加

<template><view class="addressForm"><!-- 地址编辑 --><u--formlabelPosition="top":model="addressForm":rules="addressRules"labelWidth="100"ref="uForm"			><u-form-itemlabel="姓名"prop="username"					><u--inputv-model="addressForm.username"placeholder="请输入姓名"></u--input></u-form-item><u-form-itemlabel="联系电话"prop="mobile"					><u--inputv-model="addressForm.mobile"placeholder="请输入联系电话"></u--input></u-form-item><u-form-itemlabel="详细地址"prop="address"					><u--inputv-model="addressForm.address"placeholder="请输入街道门牌号"></u--input></u-form-item><u-form-item label="是否默认"><u-switch v-model="addressForm.selected"inactiveColor="#eee"></u-switch></u-form-item><u-form-item></u-form-item><u-form-item><u-button type="primary" @click="onSubmit">提交</u-button></u-form-item></u--form></view>
</template><script>export default {data() {return {addressForm:{username:"",mobile:"",address:"",selected:false},addressRules:{username:[{required: true,message: '姓名是必填的',							trigger: ['blur', 'change']},{min: 2,max: 8,message: '长度在2-8个字符之间',trigger: ['blur', 'change']}],mobile:[{required: true,message: '电话是必填的',							trigger: ['blur', 'change']},{							validator: (rule, value, callback) => {								return uni.$u.test.mobile(value);},message: '手机号码不正确',							trigger: ['change','blur']}],address:[{required: true,message: '地址是必填的',							trigger: ['blur', 'change']}]}};},methods:{onSubmit(){this.$refs.uForm.validate().then(res => {uni.$u.toast('校验通过')}).catch(errors => {uni.$u.toast('校验失败')})}}}
</script><style lang="scss">
.addressForm{padding:30rpx;
}
</style>

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

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

相关文章

数据仓库是什么?数据仓库架构有哪些?

目录 数据仓库是什么&#xff1f;数据仓库架构有哪些&#xff1f; 一、数据仓库是什么&#xff1f; 二、数据仓库的架构分层 1. 获取层 2. 数据层 3. 应用层 4. 访问层 三、数据仓库的价值体现 1.决策支持 2.业务优化 3.提升竞争力 四、数据仓库的未来发展趋势 总…

单片机——使用printf调试

配置printf()输出函数 1、来自于<stdio.h> 2、运行C语言时&#xff0c;输出到终端 3、单片机没有终端&#xff0c;需要使用串口&#xff0c;将要输出的内容传到电脑&#xff08;串口调试助手&#xff09;上 例子如下 #include <stdio.h> #include &qu…

人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite

引言 随着人工智能技术的飞速发展&#xff0c;人脸识别技术已广泛应用于安防、金融、教育等多个领域。本文将带领大家利用Python的face-recognition库、OpenCV和SQLite数据库&#xff0c;从零开始构建一个具备异常报警功能的人脸识别考勤系统。该系统能够实时检测视频流中的人…

亲测成功❗❗❗Linux下编译opencv-4.10.0(静态链接库和动态链接库)

1. 安装依赖 在编译之前&#xff0c;确保系统中安装了必要的依赖工具和库。运行以下命令安装&#xff1a; sudo apt update sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config sudo apt-get install libavcodec-dev libavforma…

windows 部署Prometheus+Node-expoter

Prometheus v3.2.1 离线部署方式 通过helm部署prometheus会自动部署Node-expoter只需要添加prometheus的抓取规则&#xff01;&#xff01; 删除&#xff1a; 清除之前安装的 Prometheus 如果你之前已经安装了 Prometheus&#xff0c;需要清除原有的 Prometheus 安装&#xf…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Linux:进程的概念

基本概念 课本概念&#xff1a;程序的一个可执行实例&#xff0c;正在执行的程序。 内核观点&#xff1a;担当分配系统资源实体。 当操作系统要执行程序时&#xff0c;也就是说操作系统要执行代码&#xff0c;但一个操作系统需要执行多个程序&#xff0c;而CPU只有一块&#xf…

前端基础之《Vue(10)—过滤器》

一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项&#xff0c;filters: {}定义&#xff0c;只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…

平板电脑做欧盟网络安全法案(EU)2022/30

平板电脑做欧盟网络安全法案&#xff08;EU&#xff09;2022/30 平板电脑做EN18031,平板电脑做无障碍法规EU2019/882 欧盟委员会于2022年通过补充授权法案 &#xff08;EU&#xff09; 2022/30&#xff0c;明确要求无线电设备需满足网络安全、隐私保护及反欺诈要求。 新规时间轴…

Unity中打可选择的AssetBundle,以及URP中加载AssetBundle包Shader丢失问题显示洋红色的解决方案

在上一篇打AssetBundle中已经实现了简单的打AB包和加载,《Unity中打包AssetBundle并加载》,本篇笔记是进一步上一篇最后提出的问题,进行优化。 一、打可选择的AssetBundle 每次打包都会把设置了AssetBundle名称和后缀的所有文件都打包,这也是现在网上教学最多的 但是有时…

解决cannot find attribute `serde` in this scope记录

问题描述&#xff1a; 在Rust中使用serde做json序列化&#xff0c;需要对一个字段指定序列化方法&#xff0c;添加serde注解后报错: error: cannot find attribute serde in this scope --> src\models\order_model.rs:38:7 | 38 | #[serde(deserialize_with &qu…

基于whisper和ffmpeg语音转文本小程序

目录 一、环境准备 ✅ 第一步&#xff1a;安装并准备 Conda 环境 ✅ 第二步&#xff1a;创建 Whisper 专用的 Conda 虚拟环境 ✅ 第三步&#xff1a;安装 GPU 加速版 PyTorch&#xff08;适配 RTX 4060&#xff09; ✅ 第四步&#xff1a;安装 Whisper 和 FFMPEG 依赖 ✅…

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中&#xff0c;GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架&#xff0c;深入剖析以下核心内容&#xff1a; GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 脚钉-螺栓&#xff08;螺栓头-无扣长-螺纹-螺帽&#xff09;-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm&#xff0c;长度45mm螺栓级别由一个类似浮点数表示&#xff0c;如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1&#xff0e;编写接口程序RunTest.java&#xff0c;通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…