微信小程序 “萬利商城”實戰之十三: 購物車商品清單的顯示及生成訂單的編碼實現


總體設計 :用戶點到購物車頁面后顯示添加到購物車的商品清單,

用戶可以刪除某個商品,更改購買的商品數量,並勾選商品進行支付。

頁面如下 :

 

頁面代碼如下 :

 1 <view class="container">
 2  
 3  
 4 <checkbox-group class="cbgroup1" bindchange="bindCheck">
 5  <view class="list1" wx:for="{{productList}}" wx:key="produceId">
 6 <view> 7 <checkbox checked="true" value="{{item.productId}}"></checkbox> 8 </view>
 9    <view>
10      <image class="image1" src="{{item.imageUrl}}" 
11      data-productid="{{item.productId}}" bindtap="tapDetail"></image>
12    </view>
13    <view class="detail1">
14 <text>{{index+1}}. {{item.productName}}</text>
15 
16 <view class="priceInfo1"> 17 <text class="price1">¥{{item.price}}</text> 18 <text class="oriPrice1">{{item.originalPrice}}</text> 19 </view>
20 
21      <view class="qtyinfo1">
22        <text class="minus1" data-productid="{{item.productId}}" data-index="{{index}}" bindtap="tapMinus">-</text>
23        <input class="qty1" type="text" data-productid="{{item.productId}}" data-index="{{index}}" value="{{item.productQty}}" />
24        <text class="plus1" data-productid="{{item.productId}}" data-index="{{index}}" bindtap="tapPlus">+</text>      
25      </view>
26  
27     </view>
28 
29   </view>
30 </checkbox-group>
31 
32 
33  
34 <view class="orderInfo1"> 35 <view> 36 <text>總金額:</text> 37 <text class="amount1">{{amount}}</text> 38 </view> 39 <view> 40 <button class="order1" bindtap="bindOrder">下訂單</button> 41 </view> 42 </view>
43  
44  </view>

和之前的index.wxml不同,此頁面中加入一些新的頁面控件(具體見紅色代碼標注的部分 ),

1 .

在小程序中,多選框要放到 <checkbox-group class="cbgroup1" bindchange="bindCheck"> </checkbox-group>之中,

當用戶選擇或取消選擇的時候,會觸發bindchange事件,在該事件要將總金額從新計算后更新到頁面中。

2 .

顯示商品名稱和序號的地方<text>{{index+1}}. {{item.productName}}</text>我們將索引+1使得頁面的編號是從1開始的,

這樣比較符號用戶習慣。

3 .

顯示價格的地方我們對價格的字體加大並用紅色顯示,提醒賣家注意,同時將原價加了刪除線,讓買家有個對比,

增加賣家購買的幾率。

 

<view class="priceInfo1"> <text class="price1">¥{{item.price}}</text> <text class="oriPrice1">{{item.originalPrice}}</text> </view>

4 .

對於底部價格下訂單的部分標記如下:

 

34 <view class="orderInfo1"> 35 <view> 36 <text>總金額:</text> 37 <text class="amount1">{{amount}}</text> 38 </view> 39 <view> 40 <button class="order1" bindtap="bindOrder">下訂單</button> 41 </view> 42 </view>

 

我們定義了一個orderInfo1的樣式,該樣式如下:

 1 .orderInfo1
 2 {
 3   position:fixed; 
 4   bottom: 0; 
 5   width: 100%;
 6   background-color: #f0f0f0;
 7 
 8   display: flex;
 9   flex-direction: row;
10   flex-wrap: nowrap;  
11   justify-content: space-between;
12 }

第3-4行是將該標簽中的內容在頁面底部固定,即使有多個商品滑動,這里也是固定的,便於用戶的操作。

第8-11行是將標簽中的元素分別靠左右兩端展示,便於用戶操作,其余css略。

 

接下來我們再來看shoppingcart.js中的代碼:

1   data: {
2     productList: [],
3     selectedProductId:"0",
4     amount:0
5   },

在data屬性中定義三個變量,productList用來記錄添加到購物車中的商品清單,amount用來記錄商品總金額 ,

selectedProductId用來記錄用戶選中的商品ID,多個以“,”分割,第一次進入時全部選中。

 

多選框的bindCheck事件函數代碼如下:

 1   bindCheck:function(options)
 2   {
 3     let productIds = options.detail.value; 
 4     this.countAmount(productIds);
 5   },
 6 
 7   countAmount:function(ids)
 8   { 
 9     let arr1 = this.data.productList;
10 
11     if(arr1.length<1){return false;}
12 
13     let amt=0.00;
14     let selectIds=""; 
15     for(let i=0;i<arr1.length;i++) {
16       if (ids=="0" || ids.indexOf(arr1[i].productId.toString())>=0)
17       {
18         amt += arr1[i].price*arr1[i].productQty;
19       }
20       selectIds += ","+arr1[i].productId;
21     }
22     selectIds = selectIds.substring(1);
23 
24     //從bindCheck函數調用本函數
25     if(ids!="0") selectIds=ids;
26 
27     this.setData({amount:amt.toFixed(2)});
28     this.setData({selectedProductId:selectIds});
29   },

函數 bindCheck:function(options){}只有兩行代碼,第一行是獲取選中的商品productId值,多個值用“,”連接,
第二行調用countAmount:function(ids){}去重新計算商品總金額,加總后的金額用函數
this.setData({amount:amt.toFixed(2)});設置給data屬性中定義的amount變量達到更新頁面金額的目的。this.setData({selectedProductId:selectIds});的作用是將用戶選中的productId設置到data屬性
中的selectedProductId變量,當用戶點下訂單的時候根據selectedProductId去更新數據庫中購物車表,
確保生成訂單中的商品是用戶勾選的商品,沒有勾選的商品不要生成訂單。

 

注 :用戶第一次進入到購物車頁面的時候要調用countAmout()函數計算amount,見第4行,
(另外,用戶在增加或減少商品數量時也要編寫相關的函數去更新金額)

1 success:function(res){
2         var products=res.data;
3         _this.setData({productList:products}); 
4         _this.countAmount("0");
5 }

下訂單事件函數 bindOrder的代碼如下 :

 1   bindOrder: function () {
 2     let ids = this.data.selectedProductId;
 3     if(ids=="") return false;
 4 
 5     var _this=this;
 6     wx.request({
 7       url: 'http://www.tm.com/webapi/generateOrder',
 8       data:{
 9         'selectedProductId':ids,
10         'selectedProductQty':'11,1'
11       },
12       method:'GET',
13       success:function(res){
14         //var products=res.data;
15         wx.redirectTo({
16           url: '../shoppingcart/orderDetail',
17         })
18       }
19     }) 
20     
21   },

此函數功能很簡單,先根據用戶選擇的商品及數量去更新數據庫並生成商品訂單,
更新成功后調用系統API函數wx.redirectTo()跳轉到訂單支付頁。
我們在shoppingcart文件夾中新建頁面orderDetail就可以看到執行的效果了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM