微信小程序——簡易計算器plus


博客班級 https://edu.cnblogs.com/campus/zjcsxy/SE2020
作業要求 https://edu.cnblogs.com/campus/zjcsxy/SE2020/homework/11334
作業目標

編寫一個小程序,可以全新編寫,也可以學習別人的小程序進行修改

熟悉git代碼管理流程,將源代碼上傳到到github

在博客園班級中寫一篇相應的博文

作業源代碼 https://github.com/helios12138/wx2020.git
學號姓名 31801097金欣怡

院系

浙大城市學院計算機系

 

 

 

 

 

 

 

 

 

 

前言:

第一次接觸學習微信小程序的制作,花了較大的時間了解小程序的各個部分。這次小程序是一個簡易計算器,網上大多數微信小程序的計算器僅能完成簡單的四則運算,在此基礎上,我新增了啟動界面和一些新的運算(平方、開根號、階乘等),以及對計算器頁面做了一些調整,完成了我的第一個小程序“簡易計算器plus”。

最終版本地址:https://github.com/helios12138/wx2020.git

開發工具:微信開發者工具

 

效果演示

                    

 

 

全局配置

app.json:

app.json 是對整個小程序的全局配置。可以在這個文件中配置小程序是由哪些頁面組成,配置小程序的窗口背景色,配置導航條樣式,配置默認標題。

pages屬性配置的是頁面,所有頁面都要在這里配置,如果忘記添加了,后面需要頁面跳轉的時候onLoad方法不會執行。

index是首頁啟動頁面;

calc是計算器使用頁面;

history是歷史計算頁面;

 1 {
 2   "pages": [
 3     "pages/index/index",
 4     "pages/calc/calc",
 5     "pages/history/history",
 6     "pages/logs/logs"
 7   ],
 8   "window": {
 9     "backgroundTextStyle": "light",
10     "navigationBarBackgroundColor": "#da7c0c",
11     "navigationBarTitleText": "簡易計算器plus",
12     "navigationBarTextStyle": "white"
13   },
14   
15 }

app.js:

 1 App({
 2   onLaunch: function () {
 3     //調用API從本地緩存中獲取數據
 4     var logs = wx.getStorageSync('logs') || []
 5     logs.unshift(Date.now())
 6     wx.setStorageSync('logs', logs)
 7   },
 8   getUserInfo:function(cb){
 9     var that = this;
10     if(this.globalData.userInfo){
11       typeof cb == "function" && cb(this.globalData.userInfo)
12     }else{
13       //調用登錄接口
14       wx.login({
15         success: function () {
16           wx.getUserInfo({
17             success: function (res) {
18               that.globalData.userInfo = res.userInfo;
19               typeof cb == "function" && cb(that.globalData.userInfo)
20             }
21           })
22         }
23       });
24     }
25   },
26   globalData:{
27     userInfo:null
28   }
29 })

index.js:

這里涉及到一個API——wx.navigateTo,跳轉到一個新的頁面。

 1 //index.js
 2 //獲取應用實例
 3 var app = getApp()
 4 Page({
 5   data: {
 6     
 7     motto: '簡易計算器☞',
 8     userInfo: {},
 9     defaultSize: 'default',
10     disabled: false,
11     iconType:'info_circle'
12   },
13   //事件處理函數
14   toupper: function(){
15     console.log("觸發了toupper");
16   },
17   bindViewTap: function() {
18     wx.navigateTo({
19       url: '../logs/logs'
20     })
21   },
22   toCalc:function(){
23     wx.navigateTo({
24       url:'../calc/calc'
25     })
26   },
27   onLoad: function () {
28     console.log('onLoad');
29     var that = this
30       //調用應用實例的方法獲取全局數據
31     app.getUserInfo(function(userInfo){
32       //更新數據
33       that.setData({
34         userInfo:userInfo
35       })
36     })
37   }
38 })

index.wxml:

啟動頁面的布置,包括首頁的圖片滾動播放,該頁面的文字顏色、圖片位置等設置代碼在index.wxss中,這里就不展示了。

圖片滾動用到的API是swiper(滑塊視圖容器),然后autoplay="true",保證每張圖片可以自動切換。

 1 <!--index.wxml-->
 2 <view class="container">
 3   <view  bindtap="bindViewTap" class="userinfo">
 4     <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
 5     
 6   </view>
 7   <swiper autoplay="true" interval="2000" indicator-dots circular=''>
 8     <swiper-item><image mode="widthFix" src="../../pic/kasha.jpg"></image></swiper-item>
 9     <swiper-item><image mode="widthFix" src="../../pic/ig.jpg"></image></swiper-item>
10     <swiper-item><image mode="widthFix" src="../../pic/swy.jpg"></image></swiper-item>
11   </swiper>
12   <view>
13     <text class="userinfo-nickname">{{userInfo.nickName}}(廣告位在線招租)</text>
14   </view>
15   <view class="usermotto">
16     <!--<text class="user-motto">{{motto}}</text>-->
17     <button type="default" size="{{primarySize}}" plain="{{plain}}" hover-class="button-hover"
18         disabled="{{disabled}}" bindtap="toCalc"> {{motto}} </button>
19   </view>
20   
21 
22 </view>

 calc.wxml:

計算器使用界面的設置,包括計算器的各個按鈕位置顏色等的設置。

在這個界面發現基本上每行都有4個鍵,而最后一行只有3個,如果不修改的話,界面會變成下圖不美觀。所以在calc.wxss中加入.zero{width: 50%;},將按鈕“0”的寬度擴大成界面寬度的一半(原來在item中的width為25%,即界面寬度的四分之一)。

 1   
 2 <view class="content">
 3   <view class="layout-top">
 4     <view class="screen">
 5      {{screenData}}
 6     </view>
 7   </view>
 8     
 9   <view class="layout-bottom">
10     <view class="btnGroup">
11       <view class="item newgry" bindtap="clickBtn" id="{{idc}}">С</view>
12       <view class="item newgry" bindtap="clickBtn" id="{{idb}}">←</view>
13       <!--<view class="item orange" bindtap="clickBtn" id="{{idt}}">+/-</view>-->
14       <view class="item newgry iconBtn" bindtap="history">
15           <icon type="{{iconType}}" color="{{iconColor}}" class="icon" size="25"/>
16       
17         </view>
18       <view class="item orange" bindtap="clickBtn" id="{{idz}}">√ ̄</view>
19     </view>
20     <view class="btnGroup">
21       <view class="item orange" bindtap="clickBtn" id="{{idw}}">x^2</view>
22       <view class="item orange" bindtap="clickBtn" id="{{ids}}">x^3</view>
23       <view class="item orange" bindtap="clickBtn" id="{{idy}}">x!</view>
24       <view class="item orange" bindtap="clickBtn" id="{{idadd}}">+</view>
25     </view>
26     <view class="btnGroup">
27       <view class="item blue" bindtap="clickBtn" id="{{id9}}">9</view>
28       <view class="item blue" bindtap="clickBtn" id="{{id8}}">8</view>
29       <view class="item blue" bindtap="clickBtn" id="{{id7}}">7</view>
30       <view class="item orange" bindtap="clickBtn" id="{{idj}}">-</view>
31     </view>
32     <view class="btnGroup">
33       <view class="item blue" bindtap="clickBtn" id="{{id6}}">6</view>
34       <view class="item blue" bindtap="clickBtn" id="{{id5}}">5</view>
35       <view class="item blue" bindtap="clickBtn" id="{{id4}}">4</view>
36       <view class="item orange" bindtap="clickBtn" id="{{idx}}">×</view>
37     </view>
38     <view class="btnGroup">
39       <view class="item blue" bindtap="clickBtn" id="{{id3}}">3</view>
40       <view class="item blue" bindtap="clickBtn" id="{{id2}}">2</view>
41       <view class="item blue" bindtap="clickBtn" id="{{id1}}">1</view>
42       <view class="item orange" bindtap="clickBtn" id="{{iddiv}}">÷</view>
43     </view>
44     <view class="btnGroup">
45       <view class="item blue zero" bindtap="clickBtn" id="{{id0}}">0</view>
46       <view class="item blue" bindtap="clickBtn" id="{{idd}}">.</view>
47       <view class="item orange" bindtap="clickBtn" id="{{ide}}">=</view>
48     </view>
49   </view>
50 </view>

calc.js:

計算器完成四則運算和階乘等其他運算的代碼。

這里本地儲存保存計算歷史記錄運用到的API是Storage。

計算平方、三次方的值運用了Math.pow()函數;計算開根號的值運用了Math.sqrt()函數;階乘則是用了for循環進行累乘。

  1 Page({
  2   data:{
  3     idb:"back",
  4     idc:"clear",
  5     idt:"toggle",
  6     idz:"sqrt",
  7     idw:"pinfang",
  8     ids:"sanfang",
  9     idy:"jiecheng",
 10     idadd:"+",
 11     id9:"9",
 12     id8:"8",
 13     id7:"7",
 14     idj:"-",
 15     id6:"6",
 16     id5:"5",
 17     id4:"4",
 18     idx:"×",
 19     id3:"3",
 20     id2:"2",
 21     id1:"1",
 22     iddiv:"÷",
 23     id0:"0",
 24     idd:".",
 25     ide:"=",
 26     screenData:"0",
 27     operaSymbo:{"+":"+","-":"-","×":"*","÷":"/",".":"."},
 28     lastIsOperaSymbo:false,
 29     iconType:'waiting_circle',
 30     iconColor:'white',
 31     arr:[],
 32     logs:[]
 33   },
 34   onLoad:function(options){
 35     // 頁面初始化
 36   },
 37   onReady:function(){
 38     // 頁面渲染完成
 39   },
 40   onShow:function(){
 41     // 頁面顯示
 42   },
 43   onHide:function(){
 44     // 頁面隱藏
 45   },
 46   onUnload:function(){
 47     // 頁面關閉
 48   },
 49   clickBtn:function(event){
 50     var id = event.target.id;
 51     if(id == this.data.idb){  //退格←
 52       var data = this.data.screenData;
 53       if(data == "0"){
 54           return;
 55       }
 56       data = data.substring(0,data.length-1);
 57       if(data == "" || data == "-"){
 58           data = 0;
 59       }
 60       this.setData({"screenData":data});
 61       this.data.arr.pop();
 62     }else if(id == this.data.idc){  //清屏C
 63       this.setData({"screenData":"0"});
 64       this.data.arr.length = 0;
 65     }else if(id == this.data.idt){  //正負號+/-
 66       var data = this.data.screenData;
 67       if(data == "0"){
 68           return;
 69       }
 70       var firstWord = data.charAt(0);
 71       if(data == "-"){
 72         data = data.substr(1);
 73         this.data.arr.shift();
 74       }else{
 75         data = "-" + data;
 76         this.data.arr.unshift("-");
 77       }
 78       this.setData({"screenData":data});
 79     }else if(id == this.data.ide){  //等於=
 80       var data = this.data.screenData;
 81       if(data == "0"){
 82           return;
 83       }
 84       
 85       var lastWord = data.charAt(data.length);
 86       if(isNaN(lastWord)){
 87         return;
 88       }
 89 
 90       var num = "";
 91 
 92       var lastOperator = "";
 93       var arr = this.data.arr;
 94       var optarr = [];
 95       for(var i in arr){
 96         if(isNaN(arr[i]) == false || arr[i] == this.data.idd || arr[i] == this.data.idt){
 97           num += arr[i];
 98         }else{
 99           lastOperator = arr[i];
100           optarr.push(num);
101           optarr.push(arr[i]);
102           num = "";
103         }
104       }
105       optarr.push(Number(num));
106       var result = Number(optarr[0])*1.0;
107       console.log(result);
108       for(var i=1; i<optarr.length; i++){
109         if(isNaN(optarr[i])){
110             if(optarr[1] == this.data.idadd){
111                 result += Number(optarr[i + 1]);
112             }else if(optarr[1] == this.data.idj){
113                 result -= Number(optarr[i + 1]);
114             }else if(optarr[1] == this.data.idx){
115                 result *= Number(optarr[i + 1]);
116             }else if(optarr[1] == this.data.iddiv){
117                 result /= Number(optarr[i + 1]);
118             }
119         }
120       }
121       //存儲歷史記錄
122       this.data.logs.push(data + result);
123       wx.setStorageSync("calclogs",this.data.logs);
124 
125       this.data.arr.length = 0;
126       this.data.arr.push(result);
127 
128       this.setData({"screenData":result+""});
129     }else if(id == this.data.idw){//平方
130       var pd=this.data.screenData;
131     var data=Math.pow(pd,2);
132     this.setData({"screenData":data});
133     }else if(id==this.data.ids){//三次方
134       var sd=this.data.screenData;
135     var data=Math.pow(sd,3);
136     this.setData({"screenData":data});
137     }else if(id==this.data.idy){//階乘
138       var jd=this.data.screenData;
139       var result=1;
140       for(var i=1;i<=jd;i++){
141         result *=i;
142       }
143       this.setData({"screenData":result});
144     }else if(id==this.data.idz){//開方
145       var data=Math.sqrt(this.data.screenData);
146       this.setData({"screenData":data});
147     }
148     else{
149       if(this.data.operaSymbo[id]){ //如果是符號+-*/
150         if(this.data.lastIsOperaSymbo || this.data.screenData == "0"){
151           return;
152         }
153       }
154 
155       var sd = this.data.screenData;
156       var data;
157       if(sd == 0){
158         data = id;
159       }else{
160         data = sd + id;
161       }
162       this.setData({"screenData":data});
163       this.data.arr.push(id);
164 
165       if(this.data.operaSymbo[id]){
166         this.setData({"lastIsOperaSymbo":true});
167       }else{
168         this.setData({"lastIsOperaSymbo":false});
169       }
170     }
171   },
172   
173   history:function(){
174     wx.navigateTo({
175       url:'../history/history'
176     })
177   }
178 })

 總結

這是我第一次編寫微信小程序,在一開始也嘗試去b站等網站查找制作小程序的教程,一步步摸索出".js",".json",".wxml",".wxss"這些后綴文件都代表了什么、該寫什么、有什么特殊格式等(.js后綴的是腳本文件,.json后綴的文件是配置文件,.wxss后綴的是樣式表文件, .wxml后綴的文件是頁面結構文件),為了不讓啟動頁面只有一個按鈕這么寡淡,我嘗試去網上查找學習滾動圖片的制作,雖然過程中遇到了點挫折,但是最終呈現出的效果還是挺好的。當然我了解到的還很少,學習的也不全面熟練,僅僅是初學者的第一課,而且這個小程序還是有很多不足的地方,但也是一個新的起點。


免責聲明!

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



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