微信小程序項目和后台管理系統總結


  入職一段時間了,才進新公司的做的項目就是小程序,第一周寫了靜態頁面,我的地址和新增地址兩個頁面的js邏輯用緩存寫的,起初沒想到那么細的邏輯,居然斷斷續續寫了兩天,后來來了個新同事寫了購物車頁面的邏輯。第二周由於公司其他人在趕其他小程序的項目,我和新同事的小程序項目就放了兩天,組長讓我們寫用vue做的后台管理系統的幾個頁面,先是看代碼,話說vue我只看教程寫過外賣app的項目,當時搭建框架我還過了三四遍才懂(前端新手從接觸前端開始完全自學的,這個公司也是我做前端找的第一個公司),拉下后台管理系統的代碼之后看的第一感覺是代碼量好大,好多組件好復雜,怎么辦我可能看不懂,更要命的是當時才換了pro的新電腦,webstorm還沒裝破解版的,nodejs也沒弄,還有環境變量沒設置,感覺所有頭痛的問題全碰到了!環境變量那個找網上教程怎么弄都沒弄好,到現在我也覺得很奇怪,nodejs安裝好了,直接npm install命令行能用了,直接仔細看代碼了,這次看代碼發現好多我還是能看懂的。

  1是路由搭建跟自己試手的項目原理差不多的,由於實際項目頁面多很多,因此配置的頁面也非常多,第一次看到這種代碼真的嚇到了。

  2是url用到了原型鏈,在入口函數main.js加了Vue.prototype.url = “”,后面頁面調用直接,this.url,之前為了面試倒是惡補了原型鏈繼承的知識點,但是實際到底怎么用沒接觸過,這算是學習到了

  3是后台系統進入初始化登錄,是通過監聽$route屬性的變化進入登錄界面

watch: {
$route() {
if (!localStorage.getItem("login")) {
this.$router.push("/login");
}
}
}

This.$router.push({path:””}

  4是請求用了axios,由於這個項目的好多一級目錄和二級目錄都寫好了,因此新寫頁面倒是簡單,看着模版寫就是了,敲代碼發現還有跨域處理設置

This.axios.post(url, params,{“widthCredentials”:true}).then(()=>{}).catch(()=>{})

  5是整個項目用到了element-ui,這個聽在深圳的好基友提到過(同樣是自學她比我厲害多了),找到文檔試着寫頁面發現確實很好用,可以節省好多css代碼,每個組件的樣式部分的style標簽標有scoped屬性時表明style里的css樣式只適用於當前組件元素,公司的這個項目主要用到了el-table

二、微信小程序部分

vue的頁面寫完之后繼續寫小程序,第一天寫接口完全是懵逼狀態,公司發的api文檔是以前項目用的模版,有一些地方沒有改,第一天我完全不在狀態,又請教同事,第二天寫起來就好多了,下面總結一下小程序的坑,小程序很多坑文檔中是沒有的

1、去掉button的默認樣式,在css樣式加

    button::after{
      border:none;
      line-height: 0;
    }

2、navigator點擊時會有個默認背景,去掉默認樣式添加屬性hover-class="none"

3、切換既有輪播效果又可以自己點擊切換 

  首先內容板塊用輪播圖結構包起來,每個swiper-item對應一個板塊內容,經常遇到的問題一是swiper-item里面的內容如果是數組渲染出來,默認高度無法撐開,我采用的辦法是添加css<swiper-item class='item' style="position:absolute;height:{{array.length*111}}px">swiper-item對應的數組個數*每一條的高度(高度自己在css設置),同時swiper也加上這個高度,這樣內容就能撐開了;二是輪播圖滑動的時候上面的導航自動切換,方法是在swiper上綁定事件bindchange='tabIndex’,e.detail.current為輪播圖的當前索引,這樣即可實現雙向切換

  tabIndex(e){

      const current = e.detail.current;

      this.setData({ currentTab: current});

   }

 

4、富文本插件wxParse解析html標簽拼接圖片使用的bug

  解析連續圖片的時候,會發現圖片之間會有間隔,這是因為微信小程序本身的img標簽自帶間隔

  解決:在通用wxss中設置

  .wxParse-img{

    display: flex;

  }

5、金額格式化

顏色:金額紅色#e64340綠色#5dae6c

金額格式化

fmoney(s,n){

    n=n>0&&n<=20?n:2;

    s=parseFloat((s+'').replace(/[^\d\.-]/g,'')).toFixed(n)+'';

    var l=s.split('.')[0].split('').reverse();

    var r=s.split('.')[1];

    var t='';

    for(let i=0;i<l.length;i++){

      t+=l[i]+((i+1)%3==0&&(i+1)!=l.length?',':'');

    }

    return t.split('').reverse().join('')+'.'+r;

  },

6、微信支付過程

調用公司自己的接口傳總價(返回生成付款接口所需參數值)——成功——調用微信付款接口(wx.requestPayment)——成功提示付款成功——成功回調改變訂單狀態——跳轉到訂單列表頁面

                                    調用微信付款接口(wx.requestPayment)——失敗提示“已取消支付”

如果是在微信開發者工具測試支付,接口調用成功會出現生成的付款二維碼,如果是手機微信上測試會直接彈出微信付款的界面,當時第一次用完全瓜了,以為手機微信上測試和微信開發者工具上測試一樣,心想難不成手機微信上支付還要拿個手機再掃碼付款么?誰會那么瓜,沒錯,是我了。

7、商品頁常見功能:

規格彈出后選擇好默認規格,選擇數量,增加和減少數量按鈕都必須加一個判斷函數

加入購物車、立即購買點擊后彈出規格界面,規格界面的確認按鈕條件渲染出來的,分別對應加入購物車和立即購買兩種類型;

加入購物車后購物車圖標有徽章顯示當前商品添加的商品數量;進入購物車通過結算跳轉到確認訂單頁面;

立即購買的確認后跳轉到確認訂單頁面

8、生成訂單邏輯:

a從商品詳情頁立即購買跳轉到確認訂單頁面

b是當商品詳情頁添加數量后跳轉購物車頁面,在購物車頁面點擊結算跳轉到確認訂單頁面

c確認訂單頁面收到的訂單狀態分這兩個方向;

9、滾動穿透bug

商品詳情頁規格彈出層包括三部分:商品介紹+規格部分+按鈕,規格部分用view,overflow:scroll/auto;達到滾動效果,規格部分所有點擊事件用的bind會冒泡,導致底部商品介紹頁跟着滾動;百度了方法,主要有兩種,1是給遮罩層加catchtouchmove屬性,值為“{{true}}”,2是catchtouchmove=“move”,js部分寫一個move名的空函數,這兩種我都試了發現有bug,雖然規格部分滾動底部頁面起效果了,當規格部分滾動到底部再往上滑時,底部的介紹頁還是會跟着滑動;並且彈出層的商品介紹和按鈕滑動底部還是會滑;如果在整個彈出層加上catchtouchmove,規格部分又不能滾動了;

解決辦法:規格部分用scroll-view來寫,scroll-view、遮罩層、整個彈出層都加上catchtouchmove=“move”(js部分寫一個move名的空函數),整個彈出層滾動的確不會讓底部滾動,但還是會出現規格部分滾動到規格底部時,介紹頁又出現滑動,只能說總體上好一點,最好的辦法還是彈出層寫事件不用冒泡的就不會出底部滑動的效果

10、獲取用戶頭像、昵稱

直接用open-data組件可在頁面顯示,具體查看文檔

11、返回頁面時將當前頁面的數據傳遞給上一層頁面,代碼如下,做項目是在下單時選擇地址時用到的,有個疑問是下單已有地址情況下進入地址列表——再新添地址——保存新地址頁面,再返回到下單頁面就不是隔一層頁面了,所以我最先寫的s[s.length - 3],測試后發現沒效果,打印s查看發現雖然我從下單頁面跳轉了兩次頁面,但是s[s.length - 2]才是下單頁面,查資料明白s頁面第一個元素為首頁,最后一個元素為當前頁面。

const s = getCurrentPages();//返回值是數組
s[s.length - 2].setData({
address: address,
addressDetail: addressDetail,
showAddress: true
})
wx.navigateBack({});

12、詳情頁面購買彈出層

過渡對display屬性不起效果

13、小程序圖表

有個小項目是基於微信小程序的數據做分析,后來也做成圖表類的小程序了,起初項目用了echarts,體積超級大,都超過2M了,於是跟一起開發的妹子說我這邊重新在網上找個圖表插件,然后發現了wxcharts,地址https://github.com/xiaolin3303/wx-charts-demo

charts2: function() {
var query = wx.createSelectorQuery();
var that = this;
query.select('.chart').boundingClientRect(function(rect) {
that.setData({
canvasWidth: rect.width,
canvasHeight: rect.height
})
//租賃額
new wxCharts({
canvasId: 'canvas2',
type: 'line',
categories: that.data.categories2,
series: [{
name: '租賃量',
data: that.data.leaseData,
format: function(val) {
return val.toFixed(2) + '元';
}
}],
yAxis: {
title: '租賃金額 (元)',
format: function(val) {
return val.toFixed(2);
},
min: 0
},
width: rect.width,
height: rect.height
});
}).exec();
}


免責聲明!

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



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