购物车下单实现思路【vue】

文章目录

  • 1、购物车
    • 1.1 使用pinia来存储购物车的状态
    • 1.2 用户将商品加入购物车的时候
  • 2、点击结算按钮
  • 3、封装支付

1、购物车

  • 在购物车页面会有一个点 提示当前购物车内商品的数量
  • 购物车内商品的展示
  • 购物车内商品的选中

1.1 使用pinia来存储购物车的状态

  state: () => ({
    // 首页订货单元信息 这个主要是用来展示购物车的数量的
    cartMetaInfo: <AnyObject>{},
    // 订货单列表 存储完整的购物车数据
    orderList: <AnyObject[]>[],
    // 点击结算的时候冻结选择的订单和数量进行结算
    freezeOrders: <AnyObject[]>[],
    // 设置一个值来保存用户的选中状态
    selectedOrders:[]
  }),

1.2 用户将商品加入购物车的时候

  • 1、调用添加商品的API 将商品添加到购物车
  • 2、添加成功后更新购物车内商品数量(这个数量也是存储在后端的)在pinia有一个state来记录这个数值 所以更新数量的方法写在action中
   // 获取首页订货单元信息
    async getCartMeta() {
      try {
        this.cartMetaInfo = await OrderAPI.getCartMeta();
      } catch (e) {
        const err = e as AnyObject;
        showMessage("获取订货单信息失败");
      }
    },
  • 3、刷新购物车列表

注意点: 需要保存用户的选中状态,这个选中状态只是保存在vuex,并没有保存到后端,因为选中状态保存在前端所以购物车的数据都是从vuex中拿到的

这个方法用来修改购物车中的某个数据 如选中状态

 // action
 // 设置单个订货单数据
    setOrder(index: number, data: AnyObject) {
      Object.assign(this.orderList[index], data);
      this.selectedOrders = state.orderList.filter((o) => o.checked)
    },
   // getter
    // 在订货单页面选中的订货单
    selectedOrders(state) {
      return state.orderList.filter((o) => o.checked);
    },

    // 在订货单页面选中的订货单的id数组
    selectedOrderIds() {
      const selectedOrders = this.selectedOrders as AnyObject[];
      return selectedOrders.map((o) => o.sku_id);
    },

// 单选状态改变
const handleChangeChecked = (index: number) => {
  const flag = list.value[index].checked;
  orderStore.setOrder(index, { checked: !flag });
};
  • pinia中有一个action来修改购物车列表
    // 设置订货单
    setOrderList(orderList: AnyObject[], isRefresh = true) {
      if (isRefresh) {
        this.orderList = orderList;
      } else {
        this.orderList.push(...orderList);
      }
    },

当点击加入购物车的时候会向后端发送网络请求,将商品加入到购物车,之后保存上一次已经选中的商品,重新获取购物车显示的商品个数,(这个步骤也可以等到切换到购物车在做:清空购物车list,重新获取购物车列表,确保购物车中的数据与数据库中的一致,获取到的商品判断是否和之前选中的一样如何一样则将其绑定选中状态)

2、点击结算按钮

  • 1、当点击结算按钮的时候跳转到订单页面,将已经选择的商品的id去向后端发送网络请求拿到具体的信息
    在这里插入图片描述

  • 2、请求用户余额和返点余额,如果用户已经填写收货地址,就创建订单。

  • 3、如果用户的余额和返点余额抵扣后没有剩余需要支付的则直接生成订单

  • 4、如果还有剩下需要支付的则弹出付款界面使用微信支付。

3、封装支付

  • 1、将所有的关于关于支付的方法都封装到组件里面,通过判断什么时候调用哪个接口
const getRealOperation = (): {
  sendData: AnyObject;
  apiFn: (...args: any[]) => Promise<unknown>;
} => {
  let sendData = {
    ...omit(params.value, "amount", "showAmount", "type", "success", "fail"),
    pay_type: selectedPayType.value,
  };
  console.log(sendData, "????????");
  let apiFn: (...args: any[]) => Promise<unknown>;
  switch (params.value.type) {
    case "continue":
      // 订单继续支付
      apiFn = OrderAPI.payOrder;
      return { sendData, apiFn };

    case "recharge":
      // 余额充值
      apiFn = BalanceAPI.recharge;
      return { sendData, apiFn };

    case "continueRecharge":
      // 余额充值
      apiFn = BalanceAPI.continueRecharge;
      return { sendData, apiFn };

    default:
      // 创建订单
      apiFn = OrderAPI.submitOrder;
      return { sendData, apiFn };
  }
};
// 提交订单、创建订单
const handleSubmitOrder = async () => {
  showLoading();

  const { run, data, error, isSuccess, isError } = useAsync();
  const { sendData, apiFn } = getRealOperation();
  if (
    params.value.type == "recharge" ||
    params.value.type == "continueRecharge"
  ) {
    await run(apiFn({ ...omit(sendData) }));
  } else {
    await run(apiFn({ ...omit(sendData, "pay_type") }));
  }
  uni.hideLoading();

  if (isSuccess.value) {
    const res = data.value as AnyObject;
    console.log("submit order result: ", res);
    console.log(sendData, "sendData");

    if (selectedPayType.value === PayType.BALANCE) {
      await userStore.getDealerBalance();
      toPage("my-order", {}, { prefix: "/order-core", target: 2 });
    } else if (selectedPayType.value === PayType.WX_PAY) {
    // 返回预支付id
      await handlePay(res as OrderResParams);
    }
  }

在这里插入图片描述

const handlePay = async (info: OrderResParams) => {
  showLoading();

  const { run, data, error, isSuccess, isError } = useAsync();
  await run(PayAPI.getPrepayInfo(info.pay_serial_id));

  if (isSuccess.value) {
    console.log("预支付信息:", data.value);
    const payInfo = data.value as AnyObject;

    showLoading("购买中");
    uni.requestPayment({
      // 时间戳
      timeStamp: "",
      // 随机字符串
      nonceStr: "",
      // 统一下单接口返回的 prepay_id 参数值
      package: "",
      // 签名类型
      signType: "",
      // 签名
      paySign: "",
      // 调用成功回调
      success() {},
      // 失败回调
      fail() {},
      // 接口调用结束回调
      complete() {},
    });
  }

  if (isError.value) {
    uni.hideLoading();
    console.log("预支付失败:", error.value);
    const err = error.value as AnyObject;
    showMessage(err?.msg || "支付失败");
  }
};

在这里插入图片描述

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

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

相关文章

DevOps中集成自动化测试的具体案例

在DevOps中集成自动化测试的具体案例可以从多个角度进行分析,包括金融行业、分布式系统、大型企业等不同领域的实践。以下是几个具体的案例: 金融行业的DevOps实践:在金融行业中,DevOps被广泛应用于提升软件开发和运营的效率。例如,通过解析后台接口代码日志格式,自动化生…

ROS读书记录1:机器人SLAM导航核心技术与实战1

机器人SLAM导航核心技术与实战1 第一章第2章 ROS简介 视频参考&#xff1a; 《机器人SLAM导航核心技术与实战》书籍配套教学视频 第一章 第2章 ROS简介 ROS:机器人开发平台 ①ROS是一个分布式通信框架(最核心的本质 ②ROS是一个开发工具的集台 ③ROS是一系列开源软件包 计算…

C++的晨曦之旅:开启编程的新篇章

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0…

无极低码:低代码开发平台现状

无极低码&#xff1a;wheart.cn无极低代码开发平台&#xff0c;无极低码是一个面向开发者的工具&#xff0c;旨在为开发者、创业者或研发企业&#xff0c;提供快速&#xff0c;高效&#xff0c;标准化&#xff0c;可定制&#xff0c;私有化部署的平台&#xff0c;在兼顾开发速度…

面向万物智联的可信连接关键技术研究

文章目录 前言一、万物智联的安全性需求分析二、可信连接技术的发展三、面向万物智联的可信连接关键技术前言 随着5G网络、人工智能以及云计算与容器化等技术的快速进步,物联网的能力与边界已经大大地被拓展,“万物智联”时代正在开启。万物智联在提高生产力的同时,承受的安…

Java Swing游戏开发学习8

内容来自RyiSnow视频讲解 上一节提到的bug&#xff0c;不知道有没有人发现&#xff1f; 在播放音乐和音效的时候使用的是同一个clip对象&#xff0c;播放背景音乐在前&#xff0c;后续播放音效&#xff0c;clip对象就被覆盖了&#xff0c;因此导致调用停止播放背景音乐的时候&a…

SwiftUI中的边框、圆角、阴影与渐变色的应用

在SwiftUI中&#xff0c;可以使用边框、圆角、阴影和渐变色来增强视图的外观和风格。 边框&#xff1a; 可以通过在视图上应用边框样式来创建边框效果。使用border()修饰符&#xff0c;并指定边框的颜色、线条宽度和圆角半径&#xff0c;例如&#xff1a; Text("Hello, …

计算机组成原理之机器:计算机系统的基本概念

计算机组成原理之机器 笔记来源&#xff1a;哈尔滨工业大学计算机组成原理&#xff08;哈工大刘宏伟&#xff09; Chapter1&#xff1a;计算机系统的基本概念 1.1 计算机系统简介 从物理构成的角度对计算机系统分层 计算机组成原理主要关注微体系结构&#xff08;Mirco-arc…

瑞_Redis_短信登录(一)

文章目录 项目介绍1 短信登录1.1 项目准备1.1.1 导入SQL1.1.2 导入后端项目1.1.3 导入前端项目 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识&#xff0c;所以本系…

mac上更改vscode快捷键

以移动当前行代码为例 mac上的vscode&#xff0c;默认移动当前行代码的快捷键是⌥↑即option↑按键 现在我想改成command↑ 步骤如下 1.打开vscode-code-首选项-键盘快捷键 2.打开快捷键列表 3.输入move line&#xff0c;找到要改动的这个快捷键 当前行-右键-更改键绑定&…

HTML极速入门

HTML基础 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言. 超文本:比文本更强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包括图片,音频,或者自己经审阅过它的学者所加的评注,补充或脚注等. 标记语言:由标签构成的语言 HTML的标…

C++入门全集(5):内存管理

前言 一、内存区域划分 二、C的内存管理方式 2.1 对内置类型 2.2 对自定义类型 三、new和delete的底层实现 四、new和delete的原理 五、定位new 六、malloc/free和new/delete 前言 在C中&#xff0c;内存管理是不可避免的一门必修课。C对内存的自由度使其获得了更高的…

面向对象编程-Java

面向对象编程 面向对象 & 面向过程 面向过程思想&#xff08;线性思维&#xff09; 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么……面向过程适合处理一些较为简单的问题 面向对象思想 物以类聚&#xff0c;分类的思维模式&#xff0c;思考问题首先会解…

mybatis的xml文件如何配置能被识别

为了让MyBatis能够识别和使用XML Mapper文件&#xff0c;你需要确保这些文件被正确放置和配置。下面是确保MyBatis XML Mapper文件被识别的步骤&#xff1a; 1. 正确放置XML Mapper文件 通常&#xff0c;XML Mapper文件应该放在src/main/resources目录下。为了更好的组织这些…

【STM32+OPENMV】二维云台颜色识别及追踪

一、准备工作 有关OPENMV最大色块追踪及与STM32通信内容&#xff0c;详情见【STM32HAL】与OpenMV通信 有关七针OLED屏显示内容&#xff0c;详情见【STM32HAL】七针OLED(SSD1306)配置(SPI版) 二、所用工具 1、芯片&#xff1a;STM32F407ZGT6 2、CUBEMX配置软件 3、KEIL5 4…

VUE读取静态文件技巧

背景&#xff1a; 现在有一个文件123.jpg在assets目录&#xff0c;我需要在bbb.vue里面去引用他&#xff0c;直接使用../方法无法获取该文件&#xff0c;且页面不能正常显示。文件目录如下&#xff1a; 解决办法&#xff1a;使用require方法&#xff1a; require(../assets/1…

基于springboot+vue的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【STM32F103】WDG看门狗

本系列在之前介绍时钟树的文章中有稍微提一下看门狗WDG&#xff08;Watch Door Dog&#xff09;。 简单来说&#xff0c;可以当成是一个计数器&#xff0c;一旦这个计数器溢出则单片机复位。因为我们需要每隔一段时间就把这个计数器的值清零&#xff08;喂狗&#xff09;。 I…

C++命名空间

在C/C中&#xff0c;变量&#xff0c;函数和和类这些名称都存在于全局作用域中&#xff0c;可能会导致很多冲突&#xff0c;使用命名空间的目的是对标识符的名称进行本地化&#xff0c;避免命名冲突或名字污染&#xff0c;namespace关键字就是解决这种问题的。如下程序并无问题…

低代码平台开发实践:基于React的高效构建与创新【文末送书-29】

文章目录 背景低代码平台简介基于React的优势低代码平台的实际应用 低代码平台开发实践&#xff1a;基于React【文末送书-29】 背景 随着技术的不断进步和业务需求的日益复杂&#xff0c;低代码平台成为现代软件开发领域中备受关注的工具之一。在这个快节奏的时代&#xff0c;…