黑马程序员前端 Vue3 小兔鲜电商项目——(十一)支付页

news2024/11/18 11:27:39

文章目录

    • 基础数据渲染
      • 封装接口
      • 数据渲染
    • 支付功能实现
      • 支付携带参数
      • 支付宝沙箱账号信息
    • 支付结果页展示
      • 模版代码
      • 绑定路由
      • 渲染数据
    • 倒计时逻辑函数封装

image.png

支付页有俩个关键数据,一个是要支付的钱数,一个是倒计时数据(超时不支付商品释放)。

基础数据渲染

封装接口

在 src\apis\pay.js 文件中添加获取订单信息的接口,参数为订单 id:

import request from '@/utils/http'

export const getOrderAPI = (id) => {
  return request({
    url: `/member/order/${id}`
  })
}

数据渲染

在 src\views\Pay\index.vue 中调用封装好的接口,获取订单信息,并进行渲染:

<script setup>
import { ref, onMounted } from 'vue'
import { getOrderAPI } from '@/apis/pay'
import { useRoute } from 'vue-router';

const route = useRoute()
const payInfo = ref({})
const getPayInfo = async () => {
    const res = await getOrderAPI(route.query.id)
    payInfo.value = res.result
}
onMounted(() => { getPayInfo() })
</script>

支付功能实现

支付携带参数

src\views\Pay\index.vue 中添加支付参数,拼接成为支付链接地址:

// 支付地址
const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const backURL = 'http://127.0.0.1:5173/paycallback'
const redirectUrl = encodeURIComponent(backURL)
const payUrl = `${baseURL}pay/aliPay?orderId=${route.query.id}&redirect=${redirectUrl}`

支付宝按钮绑定支付链接,支付成功后跳转到回调地址:

<a class="btn alipay" :href="payUrl"></a>

支付宝沙箱账号信息

账号jfjbwb4477@sandbox.com
登录密码111111
支付密码111111

使用支付宝沙箱进行支付测试,付款时登录支付宝账号:

image-20230626150503095

支付结果页展示

模版代码

新建 src\views\Pay\PayBack.vue 文件,粘贴一下代码,显示支付结果信息:

<script setup>

</script>

<template>
  <div class="xtx-pay-page">
    <div class="container">
      <!-- 支付结果 -->
      <div class="pay-result">
        <span class="iconfont icon-queren2 green"></span>
        <span class="iconfont icon-shanchu red"></span>
        <p class="tit">支付成功</p>
        <p class="tip">我们将尽快为您发货,收货期间请保持手机畅通</p>
        <p>支付方式:<span>支付宝</span></p>
        <p>支付金额:<span>¥200.00</span></p>
        <div class="btn">
          <el-button type="primary" style="margin-right:20px">查看订单</el-button>
          <el-button>进入首页</el-button>
        </div>
        <p class="alert">
          <span class="iconfont icon-tip"></span>
          温馨提示:小兔鲜儿不会以订单异常、系统升级为由要求您点击任何网址链接进行退款操作,保护资产、谨慎操作。
        </p>
      </div>
    </div>
  </div>
</template>

<style scoped lang="scss">
.pay-result {
  padding: 100px 0;
  background: #fff;
  text-align: center;
  margin-top: 20px;

  >.iconfont {
    font-size: 100px;
  }

  .green {
    color: #1dc779;
  }

  .red {
    color: $priceColor;
  }

  .tit {
    font-size: 24px;
  }

  .tip {
    color: #999;
  }

  p {
    line-height: 40px;
    font-size: 16px;
  }

  .btn {
    margin-top: 50px;
  }

  .alert {
    font-size: 12px;
    color: #999;
    margin-top: 50px;
  }
}
</style>

绑定路由

src\router\index.js 中添加支付结果页面得路由,必须是 ‘/paycallback’,此处需要和支付回调得地址相同:

{
  path: 'paycallback', // 注意路径,必须是paycallback
  component: PayBack
}

渲染数据

在 src\views\Pay\PayBack.vue 中调用订单接口通过订单id参数获取订单信息,渲染数据到页面:

<script setup>
import { getOrderAPI } from '@/apis/pay'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const orderInfo = ref({})

const getOrderInfo = async () => {
  const res = await getOrderAPI(route.query.orderId)
  orderInfo.value = res.result
}

onMounted(() => getOrderInfo())

</script>
<template>
  <div class="xtx-pay-page">
    <div class="container">
      <!-- 支付结果 -->
      <div class="pay-result">
        <!-- 路由参数获取到的是字符串而不是布尔值 -->
        <span class="iconfont icon-queren2 green" v-if="$route.query.payResult === 'true'"></span>
        <span class="iconfont icon-shanchu red" v-else></span>
        <p class="tit">支付{{ $route.query.payResult === 'true' ? '成功' : '失败' }}</p>
        <p class="tip">我们将尽快为您发货,收货期间请保持手机畅通</p>
        <p>支付方式:<span>支付宝</span></p>
        <p>支付金额:<span>¥{{ orderInfo.payMoney?.toFixed(2) }}</span></p>
        <div class="btn">
          <el-button type="primary" style="margin-right:20px">查看订单</el-button>
          <el-button>进入首页</el-button>
        </div>
        <p class="alert">
          <span class="iconfont icon-tip"></span>
          温馨提示:小兔鲜儿不会以订单异常、系统升级为由要求您点击任何网址链接进行退款操作,保护资产、谨慎操作。
        </p>
      </div>
    </div>
  </div>
</template>

倒计时逻辑函数封装

安装时间格式化插件:

npm i dayjs

新建 src\composables\useCountDown.js 文件并编写一个函数 useCountDown 可以把秒数格式化为倒计时的显示状态:

// 封装倒计时逻辑函数
import { computed, onUnmounted, ref } from 'vue'
import dayjs from 'dayjs'
export const useCountDown = () => {
  // 1. 响应式的数据
  let timer = null
  const time = ref(0)
  // 格式化时间 为 xx分xx秒
  const formatTime = computed(() => dayjs.unix(time.value).format('mm分ss秒'))
  // 2. 开启倒计时的函数
  const start = (currentTime) => {
    // 开始倒计时的逻辑
    // 核心逻辑的编写:每隔1s就减一
    time.value = currentTime
    timer = setInterval(() => {
      time.value--
    }, 1000)
  }
  // 组件销毁时清除定时器
  onUnmounted(() => {
    timer && clearInterval(timer)
  })
  return {
    formatTime,
    start
  }
}

在 src\views\Pay\index.vue 中调用倒计时函数:

import { useCountDown } from '@/composables/useCountDown'

const { formatTime, start } = useCountDown
//获取订单数据
const route = useRoute()
const payInfo = ref({})
const getPayInfo = async () => {
    const res = await getOrderAPI(route.query.id)
    payInfo.value = res.result
    //初始化倒计时秒数
    start(res.result.countdown)
}

并在模板代码中进行渲染:

<p>支付还剩 <span>{{ formatTime }}</span>, 超时后将取消订单</p>

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

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

相关文章

Tomcat项目更新Tomcat版本,重新配置conf,并在Idea运行项目,服务器替换SSL证书

Tomcat项目更新Tomcat版本&#xff0c;重新配置conf&#xff0c;并在Idea运行项目 1.下载Tomcat包2.Tomcat配置-ssi配置3.Idea运行 Tomcat 项目4.服务器Tomcat替换SSL证书4. Tomcat 项目重启 1.下载Tomcat包 Tomcat 官网 - https://tomcat.apache.org/ jdk1.8.0_191 我选择的…

如何在电脑、手机《酷游链接》录制屏幕?一看就会!也有剪辑录制视频的方法哦!

最近&#xff0c;我的生活中出现了许多需要录制电脑屏幕的场景&#xff01; 『酷游链kw9㍠N͜E͜T提供』娜娜友善提醒&#xff0c;要自己输入才会显示出来&#xff01;比如会议&#xff0c;教学等场景。这些场景我们可以通过Windows10的内建软体来解决。另外&#xff0c;也出现…

Python小白应该怎么学习字典

1.Python 字典 字典 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。 例子:创建并打印字典 thisdict {"brand": "Porsche","model": "911","year": 1963 } pr…

MUR20100DC-ASEMI快恢复二极管MUR20100DC

编辑-Z MUR20100DC在TO-263封装里采用的2个芯片&#xff0c;其尺寸都是102MIL&#xff0c;是一款共阴极快恢复对管。MUR20100DC的浪涌电流Ifsm为200A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR20100DC采用抗冲击硅芯片材质&#xff0c;…

技术管理第二板斧建团队-沟通

一、沟通的核心原则 我认为&#xff0c;沟通是内心想法和思考逻辑的外延&#xff0c;如果你有良好的沟通能力&#xff0c;可以在整个团队中营造公开透明的信任氛围&#xff0c;让信息透明的同时&#xff0c;也让团队成员愿意发出自己的声音。 但实际情况中&#xff0c;很多人…

TypeScript 中对【函数类型】的约束使用解读

概述 函数是JavaScript 中的 一等公民 概念&#xff1a;函数类型的概念是指给函数添加类型注解&#xff0c;本质上就是给函数的参数和返回值添加类型约束 声明式函数: 在 TypeScript 中&#xff0c;一个函数有输入和输出&#xff0c;需要对其进行约束&#xff0c;需要把输入和…

电力载波远程控制系统

随着电力技术的不断发展&#xff0c;电力载波远程控制系统成为了现代电力系统中的重要组成部分。电力载波远程控制系统是一种利用电力载波技术实现远程控制的系统&#xff0c;可以对电力系统中的各种设备进行实时监测、控制和管理&#xff0c;提高电力系统的安全性、可靠性和效…

Efficient Video Transformers with Spatial-Temporal Token Selection阅读笔记

摘要 Video Transformers在主要视频识别基准测试中取得了令人印象深刻的结果&#xff0c;但其计算成本很高。 在本文中&#xff0c;我们提出了 STTS&#xff0c;这是一种令牌选择框架&#xff0c;它根据输入视频样本在时间和空间维度上动态选择一些信息丰富的令牌。 具体来说&…

Qt/C++编写视频监控系统78-视频推流到流媒体服务器

一、前言 视频推流作为独立的模块&#xff0c;目前并没有集成到视频监控系统中&#xff0c;目前是可以搭配监控系统一起使用&#xff0c;一般是将添加好的摄像头通道视频流地址打开后&#xff0c;读取视频流重新推到流媒体服务器&#xff0c;然后第三方可以从流媒体服务器拉取…

博世中国×牛客:精准人才简历增长100%!智能制造大揭秘

当一家智能制造巨头&#xff0c;在面向人工物联网企业的全面转型中&#xff0c;人才需求发生变化&#xff0c;年轻的校园顶尖科技人才成为刚需。 此时&#xff0c;内部需求激增&#xff0c;人才要求高还翻倍增长&#xff0c;但外部供需失衡&#xff0c;人才供给极少。尽管已然…

编译原理二:有限状态机

文章目录 1. 有限状态机介绍1.1. 确定性有限状态机&#xff08;DFA&#xff09;1.2. 非确定性有限状态机&#xff08;NFA&#xff09;1.3. 有限状态机的应用 2. 例子&#xff1a;实现一个简易版本的分词 1. 有限状态机介绍 有限状态机是一种计算模型&#xff0c;它可以接受一串…

脑机接口科普0023——黑门03:伦理道德中的电车难题

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 脑机接口科普0022——黑门02&#xff1a;伦理道德问题_sgmcy的博客-CSDN博客 前文中&#xff0c;罗列了一下脑机接口这个技术中&#xff0c;会遇到哪些伦理道德的问题。 前文末&#xff0c;以黑门…

Stable Diffusion 对图像进行风格化

风格化是基于现有图像转换成另一种风格的操作方法&#xff0c;通常应用于img2img中&#xff0c;将文字提示中特定的新风格应用于原图像上进行修改。在这个过程中并非使用随机的潜在状态&#xff0c;而是采用原始图像去编码初始潜在状态。在此基础上通过加入少量的随机性&#x…

【观察】新华三:数据中心可组合架构创新,提供多元算力的“最优解”

今天&#xff0c;以ChatGPT为代表的AIGC大模型&#xff0c;已经在国内形成了“海啸效应”&#xff0c;几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力&#xff0c;就在于大模型的最大价值在于普遍提升个人生产力&#xff0c;而各行各业的公司都在积极寻找应…

linux下照片添加水印乱码

java程序给图片添加中文文字水印显示乱码 原因&#xff1a;linux服务器没有对应的文字 解决步骤 在windows系统下文字中选一个文字&#xff08;微软雅黑&#xff09; windows文字保存路径&#xff1a;C:\Windows\Fonts 上传到linux服务器&#xff1a;/usr/share/fonts 新建…

Revit做基坑放坡开挖方法及快速生成基坑

一、Revit做基坑放坡开挖方法 1、建立基坑顶与基坑底轮廓参照线&#xff0c;使用地形表面工具通过放置点创建原始平整场地过后的地形(有坐标点可以直接导入)。 2、修改原始地形名称为&#xff1a;开挖前&#xff0c;阶段化&#xff1a;现有类型。 3、使用平整区域&#xff0c;弹…

video-从入门到精通-不管任何项目奇葩需求,这一专栏就够了

在日常我们的开发中&#xff0c;我们会遇到类似这样的功能&#xff0c;视频播放了这种情况&#xff0c;但是如果只是简单的实现的话&#xff0c;ui不满意&#xff0c;因为&#xff0c;别人有的&#xff0c;就是代表这是能实现的&#xff0c;你必须完成&#xff08;苦der程序员&…

享趣闻 | 神秘感十足的5个博物馆,其中一个还是在水上?

大家好&#xff0c;此po是乐于分享的建模助手。 小编发现&#xff0c;在日常的推文里&#xff0c;除了BIM插件相关的推送深受各位喜爱之外&#xff0c;一些建筑行业相关的文章热度也蛮高的。 那本期咱们就来聊聊博物馆。 博物馆是一个能直接感受历史和文明的地方&#xff0c;一…

ATX Server2-多设备集群环境搭建

一、简介 ATX Server2是⼀个移动设备管理平台&#xff0c;主要是Python3NodeJSRethinkDB开发。用于集中管理我们的设备&#xff0c;以及远程运行测试用例。 官方文档&#xff1a;https://github.com/openatx/atxserver2 搭建这样⼀套系统&#xff0c;需要&#xff1a; 1、at…

高通工具QXDM的使用

目录 1.什么是QXDM 2.QXDM抓取log的步骤 1.将手机连接在电脑上 2.进行Connect 3.Connect后就能够抓取log 4.断开连接 5.保存log文件 1.什么是QXDM QXDM&#xff0c;the qualcomm extensible diagnostic monitor&#xff1a;高通可扩展诊断监视器 是高通公司&#xff0…