一、文件后缀构成
JSON:
1.app.json小程序配置
page——小程序所有的页面路径
window——小程序所有页面的顶部背景颜色,文字颜色
1 { 2 "pages": [ 3 4 "pages/index/index", 5 "pages/logs/logs", 6 "pages/hvscore/hvscore", 7 "pages/historyscore/his_score", 8 "pages/index/page1" 9 ], 10 "window": { 11 "backgroundTextStyle": "light", 12 "navigationBarBackgroundColor": "#fff", 13 "navigationBarTitleText": "小河儿航旅分查询", 14 "navigationBarTextStyle": "black", 15 "enablePullDownRefresh": "true", 16 "backgroundColor": "#eeeeee" 17 }, 18 19 "networkTimeout": { 20 "request": 10000, 21 "downloadFile": 10000 22 }, 23 "debug": true 24 }
2. project.config.json工具配置
工具就自动会帮你恢复到当时你开发项目时的个性化配置,其中会包括编辑器的颜色、代码上传时自动压缩等等一系列选项。
3.page.json页面配置
用来表示 pages/logs 目录下的 logs.json 这类和小程序页面相关的配置;开发者可以独立定义每个页面的一些属性,例如刚刚说的顶部颜色、是否允许下拉刷新等等。
首页示例
前台:
1 <view class='box3'> 2 3 <view class="container"> 4 <view class="page-body"> 5 <view class="index-hd"> 6 <image class="logo-avatar" src="../images/hanglvlogo.png"></image> 7 </view> 8 9 <form bindsubmit="formSubmit" bindreset="formReset"> 10 <view class="page-section boder"> 11 <input style='text-align:center;' type="number" value='{{mobile}}' class="weui-input" name="mobile" confirm-type='next' placeholder="输入手机号查询您的航旅分" bindinput ="mobile" /> 12 </view> 13 <view class='lab1'>您输入的手机号用于确保是您本人在进行查询,航旅分会对您的信息进行保护,绝不会向他人泄漏</view> 14 15 <view class="btn1"> 16 <button type='primary' loading='{{loading}}' form-type='submit'>下一步</button> 17 </view> 18 19 <view class='lab1'>航旅分是一个航旅人群的评分系统,通过大数据分析方法,用分值来对乘客在航旅市场的出行行为价值进行度量</view> 20 </form> 21 22 </view> 23 </view> 24 </view>
后台:
1 import WxValidate from '../../utils/WxValidate.js' 2 const scoreUrl = require('../../config').scoreUrl 3 4 var Validate = ""; 5 6 var app =getApp(); 7 Page({ 8 9 /** 10 * 页面的初始数据 11 */ 12 data: { 13 mobile:"" 14 }, 15 16 mobile: function (e) { 17 this.setData({ 18 mobile: e.detail.value 19 }) 20 }, 21 22 /** 23 * 生命周期函数--监听页面加载 24 */ 25 onLoad: function (options) { 26 27 28 29 // 验证字段的规则 30 const rules = { 31 mobile: { 32 required: true, 33 tel: true, 34 }, 35 } 36 37 // 验证字段的提示信息,若不传则调用默认的信息 38 const messages = { 39 mobile: { 40 required: '请输入手机号', 41 tel: '输入正确的号码', 42 }, 43 } 44 // 创建实例对象 45 Validate = new WxValidate(rules, messages) 46 47 48 49 //是否绑定WXid 50 51 wx.showToast({ 52 title: '读取账号信息', //标题 53 icon: 'loading', //图标,支持"success"、"loading" 54 mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false 55 duration: 3000, 56 success: function() { }, //接口调用成功的回调函数 57 58 }); 59 60 61 //获取用户信息 62 wx.getUserInfo({ 63 success: function (result) { 64 var nickName = result.userInfo.nickName; 65 var openid = getApp().globalData.openid; 66 if (openid=="") 67 { 68 openid = wx.getStorageSync("openid"); 69 } 70 71 if (openid=="") 72 { 73 console.warn("openid为空"); 74 return false; 75 } 76 wx.request({ 77 url: scoreUrl,//请求地址 78 data: {//发送给后台的数据 79 nickName: nickName, 80 openid: openid, 81 }, 82 header: {//请求头 83 "Content-Type": "application/x-www-form-urlencoded" 84 }, 85 method: "POST",//get为默认方法/POST 86 success: function (res) { 87 console.log(res.data);//res.data相当于ajax里面的data,为后台返回的数据 88 if (res.data.Err_code == "200") { 89 var auuid = res.data.Err_content.split("/"); 90 wx.redirectTo({ 91 url: '../hvscore/hvscore?uuid=' + auuid[0] + '&huuid=' + auuid[1] + "&nickName=" + nickName 92 }) 93 } 94 95 } 96 }) 97 98 } 99 }) 100 }, 101 102 /** 103 * 生命周期函数--监听页面初次渲染完成 104 */ 105 onReady: function () { 106 107 108 109 110 111 112 }, 113 114 /** 115 * 生命周期函数--监听页面显示 116 */ 117 onShow: function () { 118 119 }, 120 121 /** 122 * 生命周期函数--监听页面隐藏 123 */ 124 onHide: function () { 125 126 }, 127 128 /** 129 * 生命周期函数--监听页面卸载 130 */ 131 onUnload: function () { 132 133 }, 134 135 /** 136 * 页面相关事件处理函数--监听用户下拉动作 137 */ 138 onPullDownRefresh: function () { 139 140 }, 141 142 /** 143 * 页面上拉触底事件的处理函数 144 */ 145 onReachBottom: function () { 146 147 }, 148 149 /** 150 * 用户点击右上角分享 151 */ 152 onShareAppMessage: function () { 153 154 }, 155 formSubmit: function (event) { 156 var that = this; 157 158 if (!Validate.checkForm(event)) { 159 const error = Validate.errorList[0] 160 //提示信息 161 //console.log("我没通过验证:" + error); 162 wx.showToast({ 163 title: `${error.msg} `, 164 duration: 2000 165 }) 166 167 return false 168 } 169 170 wx.navigateTo({ 171 url: 'indexs2?mobile=' + that.data.mobile 172 }) 173 } 174 })
chart图示例
前台:
1 <!--pages/historyscore/his_score.wxml--> 2 <view class="container"> 3 <view class="page-body"> 4 5 <view class='title_center'>历史分值变化</view> 6 7 <view class='line'> 8 <canvas canvas-id="lineCanvas" class="canvas"></canvas> 9 </view> 10 11 </view> 12 </view>
后台:
1 // pages/historyscore/his_score.js 2 3 const util = require('../../utils/util.js') 4 const wxCharts = require('../../utils/wxcharts-min.js') 5 6 let windowWidth = 500; 7 try { 8 let res = wx.getSystemInfoSync(); 9 windowWidth = res.windowWidth; 10 } catch (e) { 11 console.warn("我出错了") 12 } 13 var app = getApp() 14 15 Page({ 16 17 /** 18 * 页面的初始数据 19 */ 20 data: { 21 score: [], 22 months: [], 23 nowmax: 0, 24 nowmin: 0 25 }, 26 27 touchHandler: function (e) { 28 console.log(lineChart.getCurrentDataIndex(e)); 29 lineChart.showToolTip(e, { 30 format: function (item, category) { 31 return category + ' ' + item.name + ':' + item.data 32 } 33 }); 34 }, 35 36 /** 37 * 生命周期函数--监听页面加载 38 */ 39 onLoad: function (options) { 40 var that = this; 41 var uuid = options.huuid; 42 //uuid = "9ad923f1d62b49d9bb17ff80b52fae8c"; 43 44 //调用接口获取图表数据 45 wx.request({ 46 url: 'https://www.xiaoheer.com/hanglvscore/getsharescore.ashx', 47 data: { 48 uuid: uuid 49 }, 50 method: "POST", 51 header: { 52 "Content-Type": "application/x-www-form-urlencoded" //post 53 }, 54 success: function (res) { 55 if (res.data.ErrorRes.Err_code == 200) { 56 var myArray = new Array(); 57 //Y轴数据 58 for (var i = 0; i < res.data.flightscore.length; i++) { 59 myArray[i] = res.data.flightscore[i].scoreinfo[5].score; 60 } 61 var max = myArray[0]; 62 var min = myArray[0]; 63 for (var i = 0; i < myArray.length; i++) { 64 if (myArray[i] > max) { 65 max = myArray[i]; 66 }; 67 if (myArray[i] < min) { 68 min = myArray[i] 69 }; 70 } 71 max = parseInt(max) + 1; 72 min = parseInt(min) - 1; 73 that.setData({ nowmax: max }); 74 that.setData({ nowmin: min }); 75 76 //X轴数据 77 var armonth = new Array(); 78 for (var i = 0; i < res.data.flightscore.length; i++) { 79 armonth[i] = res.data.flightscore[i].basicinfo.reportDate; 80 81 } 82 myArray = myArray.reverse(); 83 armonth = armonth.reverse(); 84 85 var windowWidth = 120; 86 try { 87 var res = wx.getSystemInfoSync(); 88 windowWidth = res.windowWidth; 89 } catch (e) { 90 console.error('getSystemInfoSync failed!'); 91 } 92 console.log(armonth); 93 //实例化图表 94 new wxCharts({ 95 canvasId: 'lineCanvas', 96 type: 'line', 97 categories: armonth, 98 animation: true, 99 background: 'White', 100 series: [{ 101 name: '报告日期', 102 data: myArray, 103 format: function (val, name) { 104 return val.toFixed(1); 105 } 106 } 107 ], 108 xAxis: { 109 disableGrid: true 110 }, 111 yAxis: { 112 title: '航旅分数', 113 format: function (val) { 114 return val.toFixed(1); 115 }, 116 min: min, 117 max: max 118 }, 119 dataLabel: true, 120 windowWidth, 121 height: 500, 122 dataPointShape: true, 123 extra: { 124 lineStyle: 'curve' 125 } 126 }); 127 } 128 } 129 }) 130 131 }, 132 133 /** 134 * 生命周期函数--监听页面初次渲染完成 135 */ 136 onReady: function () { 137 138 }, 139 140 /** 141 * 生命周期函数--监听页面显示 142 */ 143 onShow: function () { 144 145 }, 146 147 /** 148 * 生命周期函数--监听页面隐藏 149 */ 150 onHide: function () { 151 152 }, 153 154 /** 155 * 生命周期函数--监听页面卸载 156 */ 157 onUnload: function () { 158 159 }, 160 161 /** 162 * 页面相关事件处理函数--监听用户下拉动作 163 */ 164 onPullDownRefresh: function () { 165 166 }, 167 168 /** 169 * 页面上拉触底事件的处理函数 170 */ 171 onReachBottom: function () { 172 173 }, 174 175 /** 176 * 用户点击右上角分享 177 */ 178 onShareAppMessage: function () { 179 180 } 181 })
WXML:HTML(页面结构)
1 <view class='box3'> 2 3 <view class="container"> 4 <view class="page-body"> 5 6 <view class="index-hd"> 7 <image class="logo-avatar" src="../images/hanglvlogo.png"></image> 8 </view> 9 10 <form bindsubmit="formSubmit" bindreset="formReset"> 11 12 <view class="page-section"> 13 <view class="weui-cells weui-cells_after-title"> 14 <view class="weui-cell weui-cell_input"> 15 <view class="weui-cell__bd" style='border-collapse:separate'> 16 <label class='weui-cjr' style='float:left; margin-top:21px;'>乘机人</label> 17 <input style='padding-left:30px; padding-top:9px;' type="text" class="weui-input" name="username" confirm-type='next' placeholder="请输入你的姓名" /> 18 </view> 19 </view> 20 </view> 21 22 <view class="weui-cells weui-cells_after-title"> 23 <view class="weui-cell weui-cell_input"> 24 <view class="weui-cell__bd"> 25 <label class='weui-sfz' style='float:left; margin-top:21px;'>身份证</label> 26 <input style='padding-left:30px; padding-top:9px;' type="idcard" class="weui-input" name="idcard" confirm-type='next' placeholder="请输入你的身份证" /> 27 </view> 28 </view> 29 </view> 30 31 <view class="weui-cells weui-cells_after-title"> 32 <view class="weui-cell weui-cell_input"> 33 <view class="weui-cell__bd"> 34 <label class='weui-sjh' style='float:left; margin-top:21px;'>手机号</label> 35 <input style='padding-left:30px; padding-top:9px;' type="number" class="weui-input" name="mobile" confirm-type='next' placeholder="请输入你的手机号" /> 36 </view> 37 </view> 38 </view> 39 40 </view> 41 42 <view class="btn-area"> 43 <button type='primary' loading='{{loading}}' form-type='submit'>查看我的航旅分</button> 44 </view> 45 46 </form> 47 </view> 48 </view> 49 </view>
WXSS:CSS(页面样式)
1 @import "../common/lib/weui.wxss"; 2 @import "../common/index.wxss"; 3 4 .userinfo-avatar { 5 width: 178rpx; 6 height: 178rpx; 7 margin: 20rpx; 8 border-radius: 50%; 9 } 10 11 .logo-avatar { 12 width: 236rpx; 13 height: 75rpx; 14 margin: 20rpx; 15 } 16 17 .page-section-title { 18 padding-top: 5px; 19 } 20 21 .box3 { 22 background-color: white; 23 -webkit-box-shadow: 1px 1px 1px #fff; 24 -moz-box-shadow: 1px 1px 1px #fff; 25 width: 96%; 26 height: 70%; 27 margin-top: 7px; 28 margin-left: 7px; 29 border-radius: 10px 10px 10px 10px; /**左上角-右上角-左下角-右下角*/ 30 }
JS:JS(页面逻辑交互)
1 // pages/test/test1.js 2 import WxValidate from '../../utils/WxValidate.js' 3 const scoreUrl = require('../../config').scoreUrl 4 5 var Validate = ""; 6 7 Page({ 8 /** 9 * 页面的初始数据 10 */ 11 data: { 12 13 }, 14 15 16 formSubmit: function (e) { 17 var that = this; 18 var formData = e.detail.value; 19 console.log(formData.username); 20 21 if (!Validate.checkForm(e)) { 22 const error = Validate.errorList[0] 23 //提示信息 24 //console.log("我没通过验证:" + error); 25 wx.showToast({ 26 title: `${error.msg} `, 27 duration: 2000 28 }) 29 30 return false 31 } 32 33 34 that.setData( 35 { loading: true } 36 ); 37 38 39 wx.request({ 40 url: scoreUrl, 41 data: { 42 name: formData.username, 43 idcard: formData.idcard, 44 mobile: formData.mobile 45 }, 46 header: { 47 'Content-Type': 'application/json' 48 }, 49 success: function (res) { 50 //console.log(res.data); 51 52 that.setData( 53 { loading: false } 54 ); 55 var uuid = ""; 56 if (res.data.Err_code == "200") { 57 uuid = res.data.Err_content; 58 var auuid = uuid.split("/"); 59 wx.navigateTo({ 60 url: '../hvscore/hvscore?uuid=' + auuid[0] + "&huuid=" + auuid[1], 61 }); 62 63 } else { 64 var msg = res.data.Err_content; 65 if (res.data.Err_content == "NODATA") { 66 msg = "未查到航旅分"; 67 } 68 wx.showToast({ 69 title: msg, 70 duration: 2000 71 }) 72 73 } 74 //console.log("uuid=" + uuid); 75 76 77 } 78 }); 79 80 }, 81 formReset: function () { 82 console.log('form发生了reset事件'); 83 this.modalTap2(); 84 }, 85 /** 86 * 生命周期函数--监听页面加载 87 */ 88 onLoad: function (options) { 89 90 var app = getApp(); 91 var that = this; 92 wx.getUserInfo({ 93 success: function (res) { 94 // success 95 switch (res.userInfo.gender) { 96 case 0: 97 res.userInfo.sex = "未知" 98 break; 99 case 1: 100 res.userInfo.sex = "男" 101 break; 102 case 2: 103 res.userInfo.sex = "女" 104 break; 105 } 106 app.globalData.userInfo = res.userInfo; 107 }, 108 }) 109 // 验证字段的规则 110 const rules = { 111 username: { 112 required: true, 113 }, 114 115 idcard: { 116 required: true, 117 idcard: true, 118 }, 119 mobile: { 120 required: true, 121 tel: true, 122 }, 123 } 124 125 // 验证字段的提示信息,若不传则调用默认的信息 126 const messages = { 127 username: { 128 required: '请输入姓名', 129 }, 130 idcard: { 131 required: '请输入身份证号码', 132 idcard: '身份证号码输入有误', 133 }, 134 mobile: { 135 required: '请输入手机号', 136 tel: '手机号输入有误', 137 }, 138 } 139 // 创建实例对象 140 Validate = new WxValidate(rules, messages) 141 142 143 144 }, 145 /** 146 * 生命周期函数--监听页面初次渲染完成 147 */ 148 onReady: function () { 149 150 }, 151 152 /** 153 * 生命周期函数--监听页面显示 154 */ 155 onShow: function () { 156 157 }, 158 159 /** 160 * 生命周期函数--监听页面隐藏 161 */ 162 onHide: function () { 163 164 }, 165 166 /** 167 * 生命周期函数--监听页面卸载 168 */ 169 onUnload: function () { 170 171 }, 172 173 /** 174 * 页面相关事件处理函数--监听用户下拉动作 175 */ 176 onPullDownRefresh: function () { 177 178 }, 179 180 /** 181 * 页面上拉触底事件的处理函数 182 */ 183 onReachBottom: function () { 184 185 }, 186 187 /** 188 * 用户点击右上角分享 189 */ 190 onShareAppMessage: function () { 191 192 } 193 })
引入微信表单验证以及提交跳转页面
1 import WxValidate from '../../utils/WxValidate.js' 2 const scoreUrl = require('../../config').scoreUrl 3 4 var Validate = ""; 5 6 // 验证字段的规则 7 const rules = { 8 mobile: { 9 required: true, 10 tel: true, 11 }, 12 } 13 14 // 验证字段的提示信息,若不传则调用默认的信息 15 const messages = { 16 mobile: { 17 required: '请输入手机号', 18 tel: '输入正确的号码', 19 }, 20 } 21 // 创建实例对象 22 Validate = new WxValidate(rules, messages) 23 24 formSubmit: function (event) { 25 var that = this; 26 27 if (!Validate.checkForm(event)) { 28 const error = Validate.errorList[0] 29 //提示信息 30 //console.log("我没通过验证:" + error); 31 wx.showToast({ 32 title: `${error.msg} `, 33 duration: 2000 34 }) 35 36 return false 37 } 38 39 wx.navigateTo({ 40 url: 'indexs2?mobile=' + that.data.mobile 41 }) 42 }
调用接口
1 wx.request({ 2 url: scoreUrl,//请求地址 3 data: {//发送给后台的数据 4 nickName: nickName, 5 openid: openid, 6 }, 7 header: {//请求头 8 "Content-Type": "application/x-www-form-urlencoded" 9 }, 10 method: "POST",//get为默认方法/POST 11 success: function (res) { 12 console.log(res.data);//res.data相当于ajax里面的data,为后台返回的数据 13 if (res.data.Err_code == "200") { 14 var auuid = res.data.Err_content.split("/"); 15 wx.redirectTo({ 16 url: '../hvscore/hvscore?uuid=' + auuid[0] + '&huuid=' + auuid[1] + "&nickName=" + nickName 17 }) 18 } 19 20 } 21 })
接口
1 public class getopenid : IHttpHandler 2 { 3 4 public void ProcessRequest(HttpContext context) 5 { 6 context.Response.ContentType = "text/plain"; 7 8 string code = context.Request.QueryString["code"]; 9 bllhanglv bll = new bllhanglv(); 10 11 string result = bll.getopenid(code); 12 context.Response.Write(result); 13 } 14 15 public bool IsReusable 16 { 17 get 18 { 19 return false; 20 } 21 } 22 23 }
app.js配置
1 //app.js 2 3 4 App({ 5 6 7 onLaunch: function () { 8 var that = this; 9 // 展示本地存储能力 10 var logs = wx.getStorageSync('logs') || [] 11 logs.unshift(Date.now()) 12 wx.setStorageSync('logs', logs); 13 14 // 登录 15 wx.login({ 16 success: res => { 17 // 发送 res.code 到后台换取 openId, sessionKey, unionId 18 //var setURL = "https://api.weixin.qq.com/sns/jscode2session"; 19 var setURL = "https://www.xiaoheer.com/hanglvscore/getopenid.ashx?code=" + res.code; 20 wx.request({ 21 url: setURL, 22 method:'GET', 23 success: function (res) { 24 wx.setStorageSync("session_key",res.data.session_key); 25 wx.setStorageSync("openid", res.data.openid); 26 that.globalData.openid = res.data.openid; 27 28 } 29 30 31 }) 32 } 33 }) 34 // 获取用户信息 35 wx.getSetting({ 36 success: res => { 37 if (res.authSetting['scope.userInfo']) { 38 // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 39 wx.getUserInfo({ 40 success: res => { 41 // 可以将 res 发送给后台解码出 unionId 42 this.globalData.userInfo = res.userInfo; 43 wx.setStorageSync("encryptedData", res.encryptedData) 44 wx.setStorageSync("iv", res.iv) 45 // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 46 // 所以此处加入 callback 以防止这种情况 47 if (this.userInfoReadyCallback) { 48 this.userInfoReadyCallback(res) 49 } 50 console.log(this.globalData.userInfo); 51 } 52 }) 53 } 54 } 55 }) 56 }, 57 globalData: { 58 userInfo:null, 59 encryptedData:"", 60 iv:"", 61 session_key:"", 62 openid:"" 63 } 64 })