目录

  • 交易页面
  • 提交订单
  • 支付页面
  • 微信支付
  • 个人中心
    • 我的订单

交易页面

1、静态组件及路由跳转
2、获取交易页数据
(1)接口

//获取用户地址信息  地址:/api/user/userAddress/auth/findUserAddressList   请求方式:GET  参数:无
export const reqAddressInfo = ()=> requests({url:'/user/userAddress/auth/findUserAddressList',method:'GET'})//获取商品清单  地址:/api/order/auth/trade   请求方式:GET   参数:无
export const reqOrderInfo = ()=> requests({url:'/order/auth/trade',method:'GET'})

(2)新建小仓库trade.js书写vuex三连环

import {reqAddressInfo,reqOrderInfo} from '@/api/index'
const state ={adress:[],orderInfo:[]
}
const mutations ={GETUSERADDRESS(state,adress){state.adress == adress},GETORDERINFO(state,orderInfo){state.orderInfo = orderInfo}
}
const actions ={//获取用户地址信息async getUserAddress({commit}){let result = await reqAddressInfo()if(result.code == 200){commit('GETUSERADDRESS',result.data)}},//获取商品清单async getOrderInfo({commit}){let result = await reqOrderInfo()if(result.code == 200){commit('GETORDERINFO',result.data)}}
}
const getters ={}
export default {state,mutations,actions,getters
}

(3)路由跳转时派发action,即交易页面挂载完毕

mounted(){this.$store.dispatch('getUserAddress')this.$store.dispatch('getOrderInfo')
}

3、映射数据

  ...mapState({addressInfo:state => state.trade.address,orderInfo:state => state.trade.orderInfo}),

4、展示数据

  //提交订单时的地址userDefaultAddress(){return this.addressInfo.find(item=> item.isDefault == 1) || {} }

5、给地址添加点击事件,点击时边框变红并设置为默认地址

//修改默认地址changeDefault(address,addressInfo){//全部的isDefault为0addressInfo.forEach(item => item.isDefault = 0);address.isDefault = 1}

find:查找数组中符合条件的元素返回作为最终结果

提交订单

1、路由跳转
2、点击提交订单时,还需要向服务器发起一次请求并将支付的信息传递给服务器
(1)接口

 //提交订单  地址:/api/order/auth/submitOrder?tradeNo={tradeNo}   请求方式:POST   参数:有
export const reqSubmitOrder = (tradeNo,data)=> requests({url:`/order/auth/submitOrder?tradeNo=${tradeNo}`,data,method:'POST'})

(2)组件内调用请求函数

  1. 将api文件夹里面全部请求函数统一引入在main.js文件中
//统一引入api文件夹里的全部请求函数
import * as API from '@/api'
  1. 全局事件总线所有API挂载到Vue原型上
Vue.prototype.$API = API

支付页面

1、静态组件
2、使用编程式路由跳转
3、在组件内调用请求函数

  //提交订单async submitOrder(){//需要带参let {tradeNo} = this.orderInfolet data = {consignee:this.userDefaultAddress.consignee,consigneeTel:this.userDefaultAddress.phoneNum,deliveryAddress:this.userDefaultAddress.fullAddress,paymentWay:'ONLINE',orderComment:this.msg,orderDetailList:this.orderInfo.detailArrayList}let result = await this.$API.reqSubmitOrder(tradeNo,data)if(result.code == 200){this.orderId = result.data//路由跳转+传参this.$router.push('/pay?orderId='+this.orderId)}else{alert(result.data)}}

4、数据展示orderId
5、拿着orderId向服务器发请求获取订单信息
(1)接口

//获取支付信息  地址:/api/payment/weixin/createNative/{orderId}  请求方式:GET   参数:有
export const reqPayInfo = (orderId)=> requests({url:`/payment/weixin/createNative/${orderId}`,method:'GET'})

(2)在ThePay组件挂载完毕之后发请求

mounted(){this.getPayInfo()
},
methods:{async getPayInfo(){let result = await this.$API.reqPayInfo(this.orderId)//如果成功在组件当中存储支付信息if(result.code == 200){this.payInfo = result.data}}
}

别在生命周期函数中async

6、展示信息

微信支付

1、编程式导航
2、elementUI使用
安装:cnpm install --save element-ui
按需加载:
(1)借助babel-plugin-component,所以需要安装
cnpm install babel-plugin-component -D
(2)将babel.config.js文件修改一下,加入以下内容

  'plugins': [['component',{'libraryName': 'element-ui','styleLibraryName': 'theme-chalk'}]

在main.js文件中全局注册想要的组件
重启项目
引入注册:
(1)main.js文件里引入import {MessageBox} from 'element-ui'
(2)注册

Vue.prototype.$msgbox = MessageBox
Vue.prototype.$alert = MessageBox.alert

使用:

  //弹出框open(){this.$alert('HTML',{dangerouslyUseHTMLString:true,center:true,//是否显示取消按钮showCancelButton:true,//取消按钮的文本内容cancelButtonText:'支付遇见问题',confirmButtonText:'已完成支付',//是否保留右上角取消按钮showClose:false})}

React(Vue):antd[PC端]----antd-mobile[移动端]
Vue:ElementUI[PC端]----vant[移动端]

3、利用插件生成二维码
安装:cnpm i qrcode --save
引入: import QRCode from 'qrcode'
使用:

   //生成二维码(地址)let url = await QRCode.toDataURL(this.payInfo.codeUrl)this.$alert(`<img src=${url} />`,'请你微信支付',{

4、二维码生成之后需要知道成功或失败,如果支付成功就路由跳转如果支付失败弹出提示信息,所以此时需要向服务器发请求。
(1)接口

//获取订单支付状态  地址:/api/payment/weixin/queryPayStatus/{orderId}  请求方式:GET   参数:有
export const reqPayStatus = (orderId)=>requests({url:`/payment/weixin/queryPayStatus/${orderId}`,method:'GET'})

(2)支付成功页面的静态组件已经路由配置
(3)发请求

if(!this.timer){this.timer = setInterval( async ()=>{//发请求获取用户状态let result = await this.$API.reqPayStatus(this.orderId)console.log(result);if(result.code==200){//第一步:清除定时器clearInterval(this.timer)this.timer = null//第二步:保存支付成功返回的codethis.code = result.code//第三步:关闭弹出框this.$msgbox.close()//第四步:跳转到下一个路由this.$router.push('/paysuccess')}},1000)
}

(4)弹出框按钮的相关工作,在element UI 方法里添加beforeClose属性

  //关闭弹出框的配置 第一参数:取消或完成  第二参数:当前组件实例  第三参数:关闭弹出框的方法beforeClose:(type,instance,done)=>{if(type=='cancel'){alert('请联系qq账号 3165281613')//清除定时器clearInterval(this.timer)this.timer = null//关闭弹出框done()}else{//判断是否真的支付了if(this.code == 200){//清除定时器clearInterval(this.timer)this.timer = nulldone()//路由跳转this.$router.push('/paysuccess')}}

此时需要使用到定时器,当用户没有支付即服务器返回的是未支付成功,此时需要一直向服务器发送请求,直到支付完成或是取消支付

个人中心

1、静态展示以及路由跳转,即从支付成功页面点击查看订单跳转到个人中心页面
2、将个人中心右侧展示拆分成两个子路由,在center文件夹内新建myOrder和groupOrder文件夹
3、注册子路由并且设置访问center时自动访问myorder

//二级路由
children:[{path:'myorder',component:MyOrder,},{path:'grouporder',component:GroupOrder,},{path:'/center',redirect:'/center/myorder'}
]

4、声名式导航

<dd><router-link to="/center/myorder">我的订单</router-link>
</dd>
<dd><router-link to="/center/grouporder">团购订单</router-link>
</dd>

我的订单

1、接口,获取我的订单列表

//获取个人中心的数据  地址:/api/order/auth/{page}/{limit}  请求方式:GET   参数:有
export const reqMyOrderList = (page,limit)=>requests({url:`/order/auth/${page}/${limit}`,method:'GET'})

2、在MyOrder组件挂载完毕或是点击页码后发送请求

  data(){return{//当前第几页page:1,//每一页展示个数limit:3,//存储我的订单的数据myOrder:{}}},mounted(){//获取我的订单的数据的方法this.getData()},methods:{//获取我的订单的数据async getData(){//结构参数const{page,limit} = thislet result = await this.$API.reqMyOrderList(page,limit)if(result.code == 200){this.myOrder = result.data}}}

3、数据展示

  <div class="orders"><table class="order-item" v-for="order in myOrder.records" :key="order.id"><thead><tr><th colspan="5"><span class="ordertitle">{{order.createTime}} 订单编号:{{order.outTradeNo}}<span class="pull-right delete"><img src="../images/delete.png" /></span></span></th></tr></thead><tbody><tr v-for="(cart,index) in order.orderDetailList" :key="cart.id"><td width="60%"><div class="typographic"><img :src="cart.imgUrl" style="width:100px;height:100px;"/><a href="#" class="block-text">{{cart.skuName}}</a><span>x1</span><a href="#" class="service">售后申请</a></div></td><td :rowspan="order.orderDetailList.length" v-if="index == 0" width="8%" class="center">{{order.consignee}}</td><td :rowspan="order.orderDetailList.length" v-if="index == 0" width="13%" class="center"><ul class="unstyled"><li>总金额¥{{order.totalAmount}}</li><li>在线支付</li></ul></td><td :rowspan="order.orderDetailList.length" v-if="index == 0" width="8%" class="center"><a href="#" class="btn">{{order.orderStatusName}}</a></td><td :rowspan="order.orderDetailList.length" v-if="index == 0" width="13%" class="center"><ul class="unstyled"><li><a href="mycomment.html" target="_blank">评价|晒单</a></li></ul></td></tr></tbody></table></div>

4、设置分页器

  <div class="choose-order"><!-- 分页器 --><PagiNation:pageNo="page":pageSize="limit":total="myOrder.total":continues="5"@getPageNo="getPageNo"/></div>
//获取点击哪一页
getPageNo(page){//修改组件响应式数据this.page = pagethis.getData()
}

面试题:是否封装过组件?即可回答封装过如分页器、日历

Vue项目流程7,交易页面,提交订单,支付页面,利用element UI 以及 QRCode 完成微信支付,弹出框按钮的相关工作,个人中心以及子路由我的订单相关推荐

  1. element ui select 自动向上向下弹出_达观数据:Selenium使用技巧与机器人流程自动化实战...

    背景 北京时间晚上十一点,突然电脑右下角的QQ弹出了一条消息,"在?" 都9012年了还会有人单独发个"在"然后人就失踪了?有事情找就直接说事情嘛,你不说事情, ...

  2. [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面

    引言 查看项目代码的时候,发现项目中用到JqueryUi的弹出框,可拖拽,可设置模式对话框,就想着使用它弄一个登录页面. 弹出框 在Jquery Ui官网可定制下载弹出框,下载和弹出框下载相关的js文 ...

  3. ui vue 创建项目教程 并关闭语法_创建vue项目流程

    创建vue项目流程 1.使用构建工具vue-cli创建项目脚手架 vue-cli是一个官方发布vue.js项目脚手架,使用vue-cli可以快速创建vue项目. (1)安装 确认已安装了node.js ...

  4. VUE项目学习(四):编写个人页面和配置路由

    VUE项目学习(四):编写个人页面和配置路由 1.准备工作,下载vue项目 先配置好node.js开发环境,并使用VUE-Cli下载好VUE项目,具体流程可以参考博客https://blog.csdn ...

  5. vue项目dist编译文件部署到服务器:页面空白、F5刷新报错404、403报错、等等bug - 总结篇

    文章目录 问题一. vue编译打包dist文件之后部署到线上服务器 ,访问页面却是空白? 问题二.如果不是空白,页面F5之后就又变成空白? 以Nginx服务器为例,(如下图FTP所示) `404报错: ...

  6. java list数据的更新_新增页面提交数据 list页面没有更新数据

    工作共遇到一个问题 ,新增页面提交数据 list页面没有更新数据,需要手动刷新数据才会提交展示出来.在页面试过很多刷新的方法都不是很好使,求大神解答.代码如下: add:的页面代码 rel=" ...

  7. QTP的那些事---页面弹出框的处理,页面等待加载的处理

    处理方法:先判断父类对象是否存在,如果存在,判断相关的static文本对象是否存在,如果存在,则点击弹出框中的按钮即可: 例如如下的代码: 设置循环判断dialog对象是否存在,如果存在,就去点击相关 ...

  8. layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

    咋说呢,因为对 layui 不太熟悉,这个弹出框搞了好久,看了好多解决方案,大致尝试了一下其中几种,在坑中无法自拔...总之终于搞出来了,在这里分享一下我的笔记. 着急的直接 戳这里 看解决代码. 尝 ...

  9. OA系统二十四:请假审批五:【点击“审批”后的审批弹出框】的后台逻辑;(审批结果提交的Dao层和Service层逻辑)

    本篇博客的主要内容是:[请假审批内嵌页面],[审批弹出框]的点击"确认提交"后,后台的逻辑:主要是Dao层和Service层这些后台逻辑:  说明: (1)目前来看,为了实现某个功 ...

最新文章

  1. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)
  2. 得到一个数组里面相同元素的个数
  3. 解析软件测试需要变革的因素
  4. 内联函数有什么优点?内联函数与宏定义的区别?
  5. c语言发牌思路,C语言发牌机程序求详细解析
  6. 运维工程师如果将web服务http专变为https
  7. record.php play.php,record.php
  8. powershell目录带空格_精心构造的PS1文件名导致Powershell命令执行
  9. ffmpeg 源代码简单分析 : avcodec_register_all()
  10. VMware黑屏解决方法
  11. 【收藏向】LaTeX 符号大全
  12. Hbase与Hadoop版本对应
  13. 【最佳实践】瀚高数据库安全版v4.5.8非root用户运行的安装配置
  14. matlab在solver,matlab的solver
  15. 【Java学习笔记1】Java概述 -背景+环境搭建
  16. jsoup爬取豆瓣电影top250
  17. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
  18. Smalltalk for Everyone Else
  19. linux对 pow 未定义的引用,未定义引用`pow’和`floor’
  20. 汽车的调谐器技术-Tuner

热门文章

  1. 两个电脑主机共用一个显示器
  2. gsoc 任务_gsoc20第3集从谱线中识别元素
  3. 【异常分析】Springboot中使用测试类报空指针(at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs)
  4. hadoop 历史版本下载
  5. Zabbix监控之从zookeeper中获取Kafka消费进度和lag
  6. xinetd.d详解
  7. Spline(三次样条插值)
  8. 泰迪熊Parker、“哈雷熊”,AR技术能否成为实体玩具的救命稻草?
  9. ProgressDialog在线程里下载图片
  10. 尾递归优化 - 尾递归优化