博客班级 | 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后缀的文件是页面结构文件),为了不让启动页面只有一个按钮这么寡淡,我尝试去网上查找学习滚动图片的制作,虽然过程中遇到了点挫折,但是最终呈现出的效果还是挺好的。当然我了解到的还很少,学习的也不全面熟练,仅仅是初学者的第一课,而且这个小程序还是有很多不足的地方,但也是一个新的起点。