vue3微信公众号商城项目实战系列(10)生成订单页面

本篇实现订单确认页面的功能,订单及订单明细表结构如下:

表名

字段

功能

  表名 字段 功能

order

订单表

order_id (int) 订单编号

user_id (int) 用户编号

nickname (varchar) 昵称

mobile (varchar) 联系电话

address (varchar) 收货地址

total_amount (decimal) 订单总金额

order_time (datetime) 下单时间

pay_time (datetime) 付款时间

status (int) 订单状态代号

status_text (varchar)  状态说明

订单表

status取值

0:初始

1:支付

2:支付完成

3:取消

 

order_detail

订单明细

detail_id (int) 明细编号

order_id (int) 订单编号

goods_id (int) 商品编号

goods_name (varchar) 商品名称

photo (varchar) 商品图片

price (decimal) 价格 

qty (int) 数量

amount (decimal) 金额
 

页面效果如下:

 

先到 app.js 中新增抓订单信息、付款的接口方法,如下:

 1 export function orderInfo(data) {
 2   return request({
 3     url: '/order/info', 
 4     method: 'post',
 5     data: data
 6   })
 7 }
 8 
 9 
10 export function orderPay(data) {
11   return request({
12     url: '/order/pay', 
13     method: 'post',
14     data: data
15   })
16 }

Order.vue 代码如下:

布局块代码:

 1 <template>
 2     <div class="order">
 3         <div class="order-address">
 4             <div>收货人 : {{ order.nickname }}</div>
 5             <div>电话 : {{ order.mobile }}</div>
 6             <div>地址 : {{ order.address }}</div>
 7         </div>
 8         <div class="order-list">
 9             <div class="order-item" v-for="(item,index) in detailList">
10                 <div><img class="order-img" :src="item.photo" /></div>
11                 <div class="order-info">
12                     <div><span class="order-name">{{ item.goodsName }}</span></div>
13                     <span class="order-price">¥{{ item.price }}元</span>
14                     <div class="order-qty">
15                         <span>x {{ item.qty }}</span> 
16                         <span class="order-price">{{ item.amount }} 元</span>
17                     </div>  
18                 </div>
19             </div> 
20         </div>  
21         <div class="order-total">
22             <span class="order-price">总价 : {{ totalAmt }}元</span>
23             <input class="btn_order" type="button" value="去付款" @click="onPay" />
24         </div>
25  
26     </div>    
27 </template>

脚本块代码:

 1 <script setup>
 2 import { onMounted, reactive, toRefs, computed } from 'vue';
 3 import { orderInfo, orderPay} from '@/http/api';
 4 import { useRoute, useRouter } from "vue-router"; 
 5 const route = useRoute(); 
 6 const router = useRouter();
 7  
 8 const data = reactive({detailList:[],order:{}})
 9 let { detailList, order } = toRefs(data);
10   
11 const totalAmt = computed(() => {
12     let ttl=0;
13     data.detailList.forEach(function(item, index) {ttl+=item.price * item.qty;});
14     return ttl;
15 })
16   
17 onMounted(() => {
18     let orderId = route.query.oid;
19     let formData={orderId:orderId};  
20     orderInfo(formData).then(res=>{
21         data.detailList=res.orderDetail; 
22         data.order=res.orderinfo;
23     });
24 })
25  
26 function onPay(){ 
27     let orderId = route.query.oid;
28     let formData={orderId:orderId};  
29     orderPay(formData).then(res=>{  
30         router.push({name:'finish'}); 
31     })  
32 }
33 </script>

只拣和之前页面编码不同的部分说明一下:

第 4~5 行 : 路由对象 的 useRoute () 用于创建一个路由参数实例,在 18行、27行使用,获取查询字符串参数用 router.query.xxx 的方式 。

第 30 行:当用户点 "去支付" 按钮的时候 调用微信支付接口完成支付操作,微信支付接口需要先申请接口权限,然后按微信支付文档要求编码就可以了。

 

样式代码块:

 1 <style>
 2 .order-address{
 3     width: 100%; 
 4     padding-left: 8px;
 5     padding-right: 8px;
 6 }
 7 .order-list{
 8     display: flex;
 9     flex-direction: column;
10 }
11 .order-item{
12     display: flex;
13     flex-direction: row;
14     border:solid 1px #E0E0E0;
15     margin-bottom: 6px;
16     padding: 4px 0;
17 }
18 .order-img{
19     width: 100px;
20     height: 100px;
21     vertical-align: middle;
22     border: solid 1px #F0F0F0;
23     border-radius: 4px;
24 }
25 .order-info{
26     width: 100%; 
27     padding-left: 8px;
28     padding-right: 8px;
29 }
30 .order-name{
31     font-weight: bold;
32 }
33 .order-price{
34     font-size: 16px;
35     font-weight: bold;
36     color:orangered;
37  } 
38  .order-qty{ 
39     width: 100%;
40     display: flex;
41     flex-direction: row;
42     justify-content: space-between;
43  } 
44 
45  .order-total{ 
46     width: 368px; 
47     height: 30px;
48     line-height: 30px;
49     position: fixed;
50     left: 3px;
51     bottom: 4px;
52     background-color: #e0fffe;
53 
54     display: flex;
55     flex-direction: row;
56     justify-content: space-between;
57  }
58  .btn_order{
59     width: 70px;
60     height: 30px;
61  }
62 </style>

和之前页面类似,不重复介绍了。

 

posted @ 2023-04-19 18:46  屏风马  阅读(253)  评论(0编辑  收藏  举报