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

news2024/11/18 8:19:03

文章目录

  • 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 || "支付失败");
  }
};

在这里插入图片描述

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

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

相关文章

web游戏-飞机大战

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html> <html lang=&q…

lowcode-engine快速开始

https://lowcode-engine.cn/site/docs/guide/quickStart/intro 安装node 需要node 14.17.0 pnpm安装多个node教程 pnpm env add --global 14.17.0下载demo deomo地址 安装依赖包 切换nodejs版本 pnpm env use --global 14.17.0 node -v切换到demo-general&#xff0c;安…

学习java第一天(下载并配置环境+写第一个java程序)

一.安装 1.下载 直接去官网上选择与你电脑符合的版本下载 官网链接Java Archive Downloads - Java SE 8u211 and later &#xff08;拿我的为例 Windows x64版本&#xff09; ​ 2.然后安装好exe&#xff08;要让自己知道在哪&#xff09; 3.配置环境 大佬链接&#xff1…

特种车日常检修VR虚拟互动培训软件节省大量的教学资源和成本

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐融入了各行各业&#xff0c;其中特种车辆的养护教学也从中受益匪浅。VR虚拟仿真教学在特种车辆养护领域的应用&#xff0c;不仅创新了教学方式&#xff0c;还为提高学员的学习效果和实际操作技能提供了强有力的支持。 特…

【C++】STL简介 | STL六大组件 | string类 | string类对象操作

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的缺陷 5. 引出string类 6. 标准库中的string类 6.1 string类简介 6.2 string类对象的构造 6.3. string类对象的容量 6.4. string类对象的遍历 6.5. string类对象的修改 6.6. string类非成员函数 6.7. vs…

数控机床对滚珠丝杆的要求

随着数控机床高速高精度的发展需求&#xff0c;滚珠丝杆作为数控机床的主要进给功能部件之一&#xff0c;为确保机床传动精度&#xff0c;其选型及安装显得尤为重要&#xff1b;那么&#xff0c;数控机床对滚珠丝杆有什么要求呢&#xff1f; 1、精度保持性&#xff1a;滚珠丝杆…

《汇编语言》 第3版 (王爽)实验6解析

第7章 实验6解析 &#xff08;1&#xff09;.编程&#xff0c;完成问题7.9中的程序。 问题7.9 编程&#xff0c;将datasg段中每个单词的前4个字母改为大写字母。 assume cs:codesg,ss:stacksg,ds:datasgstacksg segment ;开辟了栈段空间&#xff0c;容量为16个字节dw 0,0,0,0…

selenium爬取房价收入比可视化

数据来源&#xff1a;聚合数据 from selenium import webdriver from bs4 import BeautifulSoup import csv from selenium import webdriver from fake_useragent import UserAgent import random import subprocess from selenium import webdriver from selenium.webdrive…

面试高频率问答题目

索引&#xff1a; 主键索引&#xff1a;表的id &#xff08;唯一 且 不能为空&#xff09; 唯一索引&#xff1a;表User 假设有account 字段 &#xff0c;用户名不重复 &#xff08;唯一 可以为空&#xff09; 复合索引&#xff1a;where() 的条件 用户名&#xff0c;密码 …

国创证券|黄金概念发力拉升,金贵银业两连板,山东黄金等走高

黄金概念5日盘中发力拉升&#xff0c;到发稿&#xff0c;金贵银业涨停&#xff0c;玉龙股份涨近9%&#xff0c;中润资源涨近6%&#xff0c;山东黄金、银泰黄金涨超3%。 值得注意的是&#xff0c;金贵银业已接连两个买卖日涨停&#xff0c;公司3日晚间公告&#xff0c;根据证券…

大气颗粒物与VOCs PMF源解析:环保行业的新利器

在现今日益严峻的环境问题中&#xff0c;大气颗粒物和臭氧污染尤为突出&#xff0c;它们不仅深刻影响着全球气候和生态环境&#xff0c;更对人体健康构成了严重威胁。为了有效应对这一挑战&#xff0c;我们首先需要深入了解颗粒物和臭氧的来源&#xff0c;特别是臭氧的前体物之…

#QT(智能家居界面上-图片插入)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 (1)添加图片文件&#xff08;图片资源文件&#xff0c;PNG格式为佳&#xff09; &#xff08;2&#xff09;将图片放入工程文件夹 &#xff08;3&#xff09;按如下步骤将图片加入到工程中&#xff08;pic.qrs文件夹&#xff09; &…

CSS实现水波球

使用CSS实现水波球效果&#xff08;单个的水波球&#xff09; 效果如下&#xff1a; <template><div class"indicator" ref"indicator" :style"border-color:${borderCol}"><span class"text">{{ completion }}%…

云桥通+跨国游戏:SDWAN组网解析跨国游戏企业的成功案例

运气通曾服务过一家国际知名的游戏开发公司C&#xff0c;C公司的游戏广受年轻人欢迎&#xff0c;所以&#xff0c;他C公司也顺理成章地拥有全国玩家基础。由于游戏的在线特性和全球用户分布&#xff0c;C公司面临着跨国游戏服务器之间的苦恼——稳定问题和网络连接问题。他们希…

elementUI el-table中的对齐问题

用elementUI时&#xff0c;遇到了一个无法对齐的问题&#xff1a;代码如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"验收结论" prop"checkResult" width"200"> <template slot-sco…

[MRCTF2020]Transform1

a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…

共筑前端学习之路:欢迎加入我们的前端组件学习交流群

共筑前端学习之路&#xff1a;欢迎加入我们的前端组件学习交流群 随着信息技术的飞速发展&#xff0c;前端开发作为构建数字化世界的重要一环&#xff0c;越来越受到广大开发者的关注和重视。为了更好地服务于前端开发者&#xff0c;尤其是那些对前端组件充满热情的粉丝&#x…

数位dp 笔记

小技巧1:求区间[X, Y]可以转换为求F(Y) - F(X-1) F(X)表示0~X中满足条件的数字个数 小技巧2&#xff1a;可以用树的形式来看 遍历最高位&#xff0c;每一位分为两种情况&#xff1a;未达到上界和达到上界 如果走到右边最底端需加1 度的数量 求给定区间 [X,Y]中满足下列条件的…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

【pyinstaller打包记录】Windows系统打包exe后,onnxruntime报警告(Init provider bridge failed)

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…