├── LICENSE ├── README.md ├── chaptor_01 ├── README.md ├── app.js ├── app.json ├── app.wxss ├── images │ ├── 1应用生命周期.png │ ├── 2页面生命周期.png │ ├── 3应用与页面生命周期.png │ └── 小程序生命周期.gif ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss └── utils │ └── util.js ├── chaptor_02 ├── README.md ├── app.js ├── app.json ├── app.wxss ├── images │ ├── click.gif │ ├── code1.png │ ├── code2.png │ ├── coor.png │ ├── dbclick.gif │ ├── longtap.gif │ └── shoushi.gif ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss └── utils │ └── util.js ├── chaptor_03 ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── chat │ │ ├── chat.js │ │ ├── chat.json │ │ ├── chat.wxml │ │ └── chat.wxss │ ├── index │ │ ├── index.js │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss └── utils │ └── util.js ├── chaptor_04 ├── app.js ├── app.json ├── app.wxss ├── fonts │ ├── ionicons.eot │ ├── ionicons.svg │ ├── ionicons.ttf │ └── ionicons.woff ├── media │ └── test.mp4 ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss └── utils │ └── util.js ├── chaptor_05 ├── .gitignore ├── README.md ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss ├── utils │ ├── httpclient.js │ └── util.js └── weui.wxss ├── chaptor_06 ├── .gitignore ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss │ ├── route1 │ │ ├── route1.js │ │ ├── route1.json │ │ ├── route1.wxml │ │ └── route1.wxss │ ├── route2 │ │ ├── route2.js │ │ ├── route2.json │ │ ├── route2.wxml │ │ └── route2.wxss │ ├── route3 │ │ ├── route3.js │ │ ├── route3.json │ │ ├── route3.wxml │ │ └── route3.wxss │ ├── route4 │ │ ├── route4.js │ │ ├── route4.json │ │ ├── route4.wxml │ │ └── route4.wxss │ └── route5 │ │ ├── route5.js │ │ ├── route5.json │ │ ├── route5.wxml │ │ └── route5.wxss ├── utils │ └── util.js └── weui.wxss ├── chaptor_07 ├── .gitignore ├── app.js ├── app.json ├── app.wxss ├── images │ ├── 1.png │ ├── 2.jpg │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.png ├── pages │ ├── article │ │ ├── list.js │ │ ├── list.json │ │ ├── list.wxml │ │ └── list.wxss │ ├── articledetail │ │ ├── detail.js │ │ ├── detail.json │ │ ├── detail.wxml │ │ └── detail.wxss │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss ├── utils │ ├── httpclient.js │ └── util.js ├── weui.wxss └── wxParse │ ├── emojis │ ├── 00.gif │ ├── 01.gif │ ├── 02.gif │ ├── 03.gif │ ├── 04.gif │ ├── 05.gif │ ├── 06.gif │ ├── 07.gif │ ├── 08.gif │ ├── 09.gif │ ├── 10.gif │ ├── 100.gif │ ├── 101.gif │ ├── 102.gif │ ├── 103.gif │ ├── 104.gif │ ├── 105.gif │ ├── 106.gif │ ├── 107.gif │ ├── 108.gif │ ├── 109.gif │ ├── 11.gif │ ├── 110.gif │ ├── 111.gif │ ├── 112.gif │ ├── 113.gif │ ├── 114.gif │ ├── 115.gif │ ├── 116.gif │ ├── 117.gif │ ├── 118.gif │ ├── 119.gif │ ├── 12.gif │ ├── 120.gif │ ├── 121.gif │ ├── 122.gif │ ├── 123.gif │ ├── 124.gif │ ├── 125.gif │ ├── 126.gif │ ├── 127.gif │ ├── 128.gif │ ├── 129.gif │ ├── 13.gif │ ├── 130.gif │ ├── 131.gif │ ├── 132.gif │ ├── 133.gif │ ├── 134.gif │ ├── 14.gif │ ├── 15.gif │ ├── 16.gif │ ├── 17.gif │ ├── 18.gif │ ├── 19.gif │ ├── 20.gif │ ├── 21.gif │ ├── 22.gif │ ├── 23.gif │ ├── 24.gif │ ├── 25.gif │ ├── 26.gif │ ├── 27.gif │ ├── 28.gif │ ├── 29.gif │ ├── 30.gif │ ├── 31.gif │ ├── 32.gif │ ├── 33.gif │ ├── 34.gif │ ├── 35.gif │ ├── 36.gif │ ├── 37.gif │ ├── 38.gif │ ├── 39.gif │ ├── 40.gif │ ├── 41.gif │ ├── 42.gif │ ├── 43.gif │ ├── 44.gif │ ├── 45.gif │ ├── 46.gif │ ├── 47.gif │ ├── 48.gif │ ├── 49.gif │ ├── 50.gif │ ├── 51.gif │ ├── 52.gif │ ├── 53.gif │ ├── 54.gif │ ├── 55.gif │ ├── 56.gif │ ├── 57.gif │ ├── 58.gif │ ├── 59.gif │ ├── 60.gif │ ├── 61.gif │ ├── 62.gif │ ├── 63.gif │ ├── 64.gif │ ├── 65.gif │ ├── 66.gif │ ├── 67.gif │ ├── 68.gif │ ├── 69.gif │ ├── 70.gif │ ├── 71.gif │ ├── 72.gif │ ├── 73.gif │ ├── 74.gif │ ├── 75.gif │ ├── 76.gif │ ├── 77.gif │ ├── 78.gif │ ├── 79.gif │ ├── 80.gif │ ├── 81.gif │ ├── 82.gif │ ├── 83.gif │ ├── 84.gif │ ├── 85.gif │ ├── 86.gif │ ├── 87.gif │ ├── 88.gif │ ├── 89.gif │ ├── 90.gif │ ├── 91.gif │ ├── 92.gif │ ├── 93.gif │ ├── 94.gif │ ├── 95.gif │ ├── 96.gif │ ├── 97.gif │ ├── 98.gif │ └── 99.gif │ ├── html2json.js │ ├── htmlparser.js │ ├── showdown.js │ ├── wxDiscode.js │ ├── wxParse.js │ ├── wxParse.wxml │ └── wxParse.wxss ├── chaptor_08 ├── .gitignore ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss └── utils │ ├── localStorage.js │ └── util.js ├── chaptor_10 ├── .gitignore ├── README.md ├── app.js ├── app.json ├── app.wxss ├── images │ ├── test.gif │ └── test.jpeg ├── pages │ ├── canvas1 │ │ ├── canvas1.js │ │ ├── canvas1.json │ │ ├── canvas1.wxml │ │ └── canvas1.wxss │ ├── canvas2 │ │ ├── canvas2.js │ │ ├── canvas2.json │ │ ├── canvas2.wxml │ │ └── canvas2.wxss │ ├── canvas3 │ │ ├── canvas3.js │ │ ├── canvas3.json │ │ ├── canvas3.wxml │ │ └── canvas3.wxss │ ├── canvas4 │ │ ├── canvas4.js │ │ ├── canvas4.json │ │ ├── canvas4.wxml │ │ └── canvas4.wxss │ ├── canvas5 │ │ ├── canvas5.js │ │ ├── canvas5.json │ │ ├── canvas5.wxml │ │ └── canvas5.wxss │ └── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss ├── utils │ └── util.js └── xiaohuangxiang.png ├── chaptor_11 ├── .gitignore ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss │ └── share │ │ ├── share.js │ │ ├── share.json │ │ ├── share.wxml │ │ └── share.wxss └── utils │ └── util.js ├── screenshot ├── chaptor_07-01.gif ├── dingyuhao.JPG └── mapjietu.gif ├── weixin_demo ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── component │ │ ├── button │ │ │ ├── buttons.js │ │ │ ├── buttons.json │ │ │ ├── buttons.wxml │ │ │ └── buttons.wxss │ │ ├── flex │ │ │ ├── myflex.js │ │ │ ├── myflex.json │ │ │ ├── myflex.wxml │ │ │ └── myflex.wxss │ │ ├── labels │ │ │ ├── labels.js │ │ │ ├── labels.json │ │ │ ├── labels.wxml │ │ │ └── labels.wxss │ │ ├── map │ │ │ ├── map.js │ │ │ ├── map.json │ │ │ ├── map.wxml │ │ │ └── map.wxss │ │ ├── myrequest │ │ │ ├── myreq.js │ │ │ ├── myreq.json │ │ │ ├── myreq.wxml │ │ │ └── myreq.wxss │ │ ├── swiper │ │ │ ├── myswiper.js │ │ │ ├── myswiper.json │ │ │ ├── myswiper.wxml │ │ │ └── myswiper.wxss │ │ └── uploadfile │ │ │ ├── uploadfile.js │ │ │ ├── uploadfile.json │ │ │ ├── uploadfile.wxml │ │ │ └── uploadfile.wxss │ ├── index │ │ ├── index.js │ │ ├── index.wxml │ │ └── index.wxss │ └── logs │ │ ├── logs.js │ │ ├── logs.json │ │ ├── logs.wxml │ │ └── logs.wxss ├── utils │ └── util.js └── weui.min.css └── wschat.html /README.md: -------------------------------------------------------------------------------- 1 | # wechat-mini-program-learning 2 | 微信小程序学习系列 3 | 4 | 作者博客:[http://www.cnblogs.com/nosqlcoco](http://www.cnblogs.com/nosqlcoco) 5 | 6 | # 快速入门 7 | 8 | 1. [微信小程序入门正确姿势(一)](http://www.cnblogs.com/nosqlcoco/p/5927249.html) 9 | * [微信小程序开发工具使用与设计规范(二)](http://www.cnblogs.com/nosqlcoco/p/5931952.html) 10 | 11 | # 案例 12 | - chaptor_01: [微信小程序之生命周期(三)](http://www.cnblogs.com/nosqlcoco/p/wxsmallcycle.html) 13 | - chaptor_02: 小程序触控事件 14 | - chaptor_03: 小程序websocket长连接 15 | - chaptor_04: 音乐播放控制 16 | - chaptor_05: 用户敏感数据解密 17 | - chaptor_06: 页面路由 18 | - chaptor_07: 小程序DEMO-小黄象社区 19 | - chaptor_08: 本地缓存 20 | - chaptor_10: canvas 21 | - chaptor_11: 小程序扫码、分享、客服消息 22 | - weixin_Demo: UI组件 23 | 24 | 图片上传和长连接依赖后台接口,请参照另一个项目[springboot-weapp-demo](https://github.com/cocoli/springboot-weapp-demo) 25 | 26 | 小程序交流群:594342242 27 | 28 | 我的订阅号: 29 | ![](https://github.com/cocoli/weixin_smallexe/blob/master/screenshot/dingyuhao.JPG?raw=true) 30 | -------------------------------------------------------------------------------- /chaptor_01/README.md: -------------------------------------------------------------------------------- 1 | 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 2 | 3 | > 通俗的讲,生命周期就是指一个对象的生老病死。 4 | > 从软件的角度来看,生命周期指程序从创建、到开始、暂停、唤起、停止、卸载的过程。 5 | 6 | 下面从一下三个方面介绍微信小程序的生命周期: 7 | 8 | - 应用生命周期 9 | - 页面生命周期 10 | - 应用与页面生命周期 11 | 12 | 》》》应用生命周期 13 | 14 | ![enter description here][1] 15 | 16 | 1. 用户首次打开小程序,触发 onLaunch(全局只触发一次)。 17 | * 小程序初始化完成后,触发onShow方法,监听小程序显示。 18 | * 小程序从前台进入后台,触发 onHide方法。 19 | * 小程序从后台进入前台显示,触发 onShow方法。 20 | * 小程序后台运行一定时间,或系统资源占用过高,会被销毁。 21 | 22 | 前台、后台定义: 当用户点击左上角关闭,或者按了设备 Home 键离开微信,小程序并没有直接销毁,而是进入了后台;当再次进入微信或再次打开小程序,又会从后台进入前台。 23 | 24 | 在整理本文资料的时候,有点不解,为什么不把小程序监听『销毁』方法开放给开发者,我猜测是因为IOS系统限制『按下Home键时,app从活动状态转入后台,会被挂起』;微信也不例外,只要运行一段时间或把微信客户端进程杀掉,就无法通知小程序应用被销毁。 25 | 26 | 》》》页面生命周期 27 | 28 | ![enter description here][2] 29 | 30 | 1. 小程序注册完成后,加载页面,触发onLoad方法。 31 | * 页面载入后触发onShow方法,显示页面。 32 | * 首次显示页面,会触发onReady方法,渲染页面元素和样式,一个页面只会调用一次。 33 | * 当小程序后台运行或跳转到其他页面时,触发onHide方法。 34 | * 当小程序有后台进入到前台运行或重新进入页面时,触发onShow方法。 35 | * 当使用重定向方法wx.redirectTo(OBJECT)或关闭当前页返回上一页wx.navigateBack(),触发onUnload 36 | 37 | 》》》应用生命周期影响页面生命周期 38 | 39 | ![enter description here][3] 40 | 41 | 1. 小程序初始化完成后,页面首次加载触发onLoad,只会触发一次。 42 | * 当小程序进入到后台,先执行页面onHide方法再执行应用onHide方法。 43 | * 当小程序从后台进入到前台,先执行应用onShow方法再执行页面onShow方法。 44 | 45 | 下图是小程序从注册到页面加入,前后台切换流程。 46 | ![enter description here][4] 47 | 48 | 49 | 50 | [1]: ./images/1%E5%BA%94%E7%94%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png "1应用生命周期.png" 51 | [2]: ./images/2%E9%A1%B5%E9%9D%A2%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png "2页面生命周期.png" 52 | [3]: ./images/3%E5%BA%94%E7%94%A8%E4%B8%8E%E9%A1%B5%E9%9D%A2%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png "3应用与页面生命周期.png" 53 | [4]: ./images/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.gif "小程序生命周期.gif" 54 | -------------------------------------------------------------------------------- /chaptor_01/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | console.log('小程序正在启动...') 9 | }, 10 | onShow: function(){ 11 | console.log('进入小程序') 12 | }, 13 | onHide: function(){ 14 | console.log('小程序隐藏了...') 15 | }, 16 | getUserInfo:function(cb){ 17 | var that = this; 18 | if(this.globalData.userInfo){ 19 | typeof cb == "function" && cb(this.globalData.userInfo) 20 | }else{ 21 | //调用登录接口 22 | wx.login({ 23 | success: function () { 24 | wx.getUserInfo({ 25 | success: function (res) { 26 | that.globalData.userInfo = res.userInfo; 27 | typeof cb == "function" && cb(that.globalData.userInfo) 28 | } 29 | }) 30 | } 31 | }); 32 | } 33 | }, 34 | globalData:{ 35 | userInfo:null, 36 | lastStartTime: new Date() 37 | } 38 | }) 39 | -------------------------------------------------------------------------------- /chaptor_01/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs" 5 | ], 6 | "window":{ 7 | "backgroundTextStyle":"light", 8 | "navigationBarBackgroundColor": "#fff", 9 | "navigationBarTitleText": "WeChat", 10 | "navigationBarTextStyle":"black", 11 | "enablePullDownRefresh": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /chaptor_01/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 200rpx 0; 9 | box-sizing: border-box; 10 | } 11 | -------------------------------------------------------------------------------- /chaptor_01/images/1应用生命周期.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_01/images/1应用生命周期.png -------------------------------------------------------------------------------- /chaptor_01/images/2页面生命周期.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_01/images/2页面生命周期.png -------------------------------------------------------------------------------- /chaptor_01/images/3应用与页面生命周期.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_01/images/3应用与页面生命周期.png -------------------------------------------------------------------------------- /chaptor_01/images/小程序生命周期.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_01/images/小程序生命周期.gif -------------------------------------------------------------------------------- /chaptor_01/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | Page({ 5 | data: { 6 | motto: 'Hello World', 7 | userInfo: {} 8 | }, 9 | //事件处理函数 10 | bindViewTap: function() { 11 | wx.navigateTo({ 12 | url: '../logs/logs' 13 | }) 14 | }, 15 | onLoad: function () { 16 | console.log('载入页面') 17 | var that = this 18 | //调用应用实例的方法获取全局数据 19 | app.getUserInfo(function(userInfo){ 20 | //更新数据 21 | that.setData({ 22 | userInfo:userInfo 23 | }) 24 | }) 25 | }, 26 | onReady: function(){ 27 | console.log('页面首次渲染完成') 28 | }, 29 | onShow: function () { 30 | console.log('显示页面') 31 | //console.log(getApp().globalData.lastStartTime) 32 | }, 33 | onHide: function () { 34 | console.log('隐藏页面') 35 | }, 36 | onUnload: function(){ 37 | console.log('卸载页面') 38 | }, 39 | onPullDownRefreash: function(){ 40 | console.log('页面下拉刷新') 41 | } 42 | }) 43 | -------------------------------------------------------------------------------- /chaptor_01/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{userInfo.nickName}} 6 | 7 | 8 | {{motto}} 9 | 10 | 11 | -------------------------------------------------------------------------------- /chaptor_01/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | .userinfo { 3 | display: flex; 4 | flex-direction: column; 5 | align-items: center; 6 | } 7 | 8 | .userinfo-avatar { 9 | width: 128rpx; 10 | height: 128rpx; 11 | margin: 20rpx; 12 | border-radius: 50%; 13 | } 14 | 15 | .userinfo-nickname { 16 | color: #aaa; 17 | } 18 | 19 | .usermotto { 20 | margin-top: 200px; 21 | } -------------------------------------------------------------------------------- /chaptor_01/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | }, 14 | unLoad: function(){ 15 | console.log("log unmout"); 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /chaptor_01/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_01/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_01/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_01/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds(); 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_02/README.md: -------------------------------------------------------------------------------- 1 | ## 微信小程序之事件绑定 2 | 3 | ### 》》》什么是事件 4 | - 事件是视图层到逻辑层的通讯方式。 5 | - 事件可以将用户的行为反馈到逻辑层进行处理。 6 | - 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。 7 | - 事件对象可以携带额外信息,如id, dataset, touches。 8 | 9 | ### 》》》事件分类 10 | - touchstart 手指触摸 11 | - touchmove 手指触摸后移动 12 | - touchcancel 手指触摸动作被打断,如弹窗和来电提醒 13 | - touchend 手指触摸动作结束 14 | - tap 手指触摸后离开 15 | - longtap 手指触摸后后,超过350ms离开 16 | 17 | ### 》》》事件绑定 18 | 19 | 事件绑定的写法同组件的属性,以 key、value 的形式。 20 | 21 | - key 以bind或catch开头,然后跟上事件的类型,如bindtap, catchtouchstart 22 | - value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。 23 | bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。 24 | 25 | 上面简单介绍了小程序事件基础,是时候彰显"事件"的威力: 26 | - 单击(tap) 27 | - 双击(dbtap) 28 | - 长按(longtap) 29 | - 滑动 30 | - 多点触控 31 | 32 | #### 1.单击 33 | 单击事件由touchstart、touchend组成,touchend后触发tap事件。 34 | 35 | ![](./images/click.gif) 36 | 37 | ```html 38 | 39 | 40 | 41 | ``` 42 | 43 | ```javascript 44 | mytouchstart: function(e){ 45 | console.log(e.timeStamp + '- touch start') 46 | }, 47 | mytouchend: function(e){ 48 | console.log(e.timeStamp + '- touch end') 49 | }, 50 | mytap: function(e){ 51 | console.log(e.timeStamp + '- tap') 52 | } 53 | ``` 54 | 55 | #### 2.双击 56 | 双击事件由两个单击事件组成,两次间隔时间小于300ms认为是双击;微信官方文档没有双击事件,需要开发者自己定义处理。 57 | 58 | ![](./images/dbclick.gif) 59 | 60 | ```html 61 | 62 | 63 | 64 | ``` 65 | 66 | ```javascript 67 | Page({ 68 | data: { 69 | //上一次触摸距离页面打开时间毫秒数,默认为为0 70 | lastTapDiffTime: 0 71 | }, 72 | //触摸事件,判断单击还是双击 73 | mytap: function(e){ 74 | //触摸时间距离页面打开时间毫秒数 75 | var curTime = e.timeStamp; 76 | //上一次触摸距离页面打开时间毫秒数 77 | var lastTime = this.data.lastTapDiffTime; 78 | if(lastTime > 0){ 79 | //如果两次单击间隔小于300毫秒,认为是双击 80 | if(curTime - lastTime < 300){ 81 | console.log(e.timeStamp + '- db tap') 82 | }else{ 83 | console.log(e.timeStamp + '- tap') 84 | } 85 | }else{ 86 | console.log(e.timeStamp + '- first tap') 87 | } 88 | //将本次点击触摸时间设置为上一次触摸时间 89 | this.setData({lastTapDiffTime: curTime}); 90 | } 91 | }) 92 | ``` 93 | 94 | #### 3.长按 95 | 长按事件手指触摸后,超过350ms再离开。 96 | 97 | ![](./images/longtap.gif) 98 | 99 | ```html 100 | 101 | 103 | 104 | ``` 105 | 106 | ```javascript 107 | mytouchstart: function(e){ 108 | console.log(e.timeStamp + '- touch start') 109 | }, 110 | //长按事件 111 | mylongtap: function(e){ 112 | console.log(e.timeStamp + '- long tap') 113 | }, 114 | mytouchend: function(e){ 115 | console.log(e.timeStamp + '- touch end') 116 | }, 117 | mytap: function(e){ 118 | console.log(e.timeStamp + '- tap') 119 | } 120 | ``` 121 | 122 | 单击、双击、长按属于点触事件,会触发touchstart、touchend、tap事件,touchcancel事件只能在真机模拟,不多说了。 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 |
事件触发顺序
单击touchstart → touchend → tap
双击touchstart → touchend → tap → touchstart → touchend → tap
长按touchstart → longtap → touchend → tap
141 | 142 | #### 4.滑动 143 | 144 | 手指触摸屏幕并移动,为了简化起见,下面以水平滑动和垂直滑动为例。 145 | 滑动事件由touchstart、touchmove、touchend组成。 146 | 147 | ![](./images/shoushi.gif) 148 | 149 | 坐标图: 150 | ![](./images/coor.png) 151 | 152 | 1. 以屏幕左上角为原点建立直角坐标系。第四象限为手机屏幕,Y轴越往下坐标值越大(注意跟数学象限的区别)。 153 | 2. 假设A点为touchstart事件触摸点,坐标为A(ax,ay),然后手指向上滑动到点B(bx,by),就满足条件by < ay; 154 | 3. 同理,向右滑动到C(cx,cy),满足cx > ax;向下滑动到D(dx,dy),满足dy > ay;向左移动到E(ex,ey)满足ex < ax. 155 | 4. 计算线段AB在Y轴上投影长度为m,在X轴上的投影长度为n 156 | 5. 计算r = m/n,如果r > 1,视为向上滑动。 157 | 6. 同理计算线段AC,AD,AE在Y轴投影长度与X轴的投影长度之比,得出向右向下向左的滑动。 158 | 159 | 以上没考虑r为1的情况。 160 | 161 | ```html 162 | 163 | 164 | 165 | ``` 166 | 167 | ```javascript 168 | Page({ 169 | data: { 170 | //初始化touchstart坐标 171 | startPoint: [0,0] 172 | }, 173 | mytouchstart: function(e){ 174 | //开始触摸,获取触摸点坐标并放入数组中 175 | this.setData({startPoint: [e.touches[0].pageX, e.touches[0].pageY]}); 176 | }, 177 | //触摸点移动 178 | mytouchmove: function(e){ 179 | //当前触摸点坐标 180 | var curPoint = [e.touches[0].pageX,e.touches[0].pageY]; 181 | var startPoint = this.data.startPoint; 182 | //比较pageX值 183 | if(curPoint[0] <= startPoint[0]){ 184 | if(Math.abs(curPoint[0] - startPoint[0]) >= Math.abs(curPoint[1] - startPoint[1])){ 185 | console.log(e.timeStamp + '- touch left move') 186 | }else{ 187 | if(curPoint[1] >= startPoint[1]){ 188 | console.log(e.timeStamp + '- touch down move') 189 | }else{ 190 | console.log(e.timeStamp + '- touch up move') 191 | } 192 | } 193 | }else{ 194 | if(Math.abs(curPoint[0] - startPoint[0]) >= Math.abs(curPoint[1] - startPoint[1])){ 195 | console.log(e.timeStamp + '- touch right move') 196 | }else{ 197 | if(curPoint[1] >= startPoint[1]){ 198 | console.log(e.timeStamp + '- touch down move') 199 | }else{ 200 | console.log(e.timeStamp + '- touch up move') 201 | } 202 | } 203 | } 204 | } 205 | }) 206 | ``` 207 | 208 | #### 5.多点触控 209 | 210 | 由于模拟器尚不支持多点触控,内测开放后,继续补充。 -------------------------------------------------------------------------------- /chaptor_02/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | }, 9 | getUserInfo:function(cb){ 10 | var that = this; 11 | if(this.globalData.userInfo){ 12 | typeof cb == "function" && cb(this.globalData.userInfo) 13 | }else{ 14 | //调用登录接口 15 | wx.login({ 16 | success: function () { 17 | wx.getUserInfo({ 18 | success: function (res) { 19 | that.globalData.userInfo = res.userInfo; 20 | typeof cb == "function" && cb(that.globalData.userInfo) 21 | } 22 | }) 23 | } 24 | }); 25 | } 26 | }, 27 | globalData:{ 28 | userInfo:null 29 | } 30 | }) 31 | -------------------------------------------------------------------------------- /chaptor_02/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs" 5 | ], 6 | "window":{ 7 | "backgroundTextStyle":"dark", 8 | "navigationBarBackgroundColor": "#fff", 9 | "navigationBarTitleText": "WeChat", 10 | "navigationBarTextStyle":"black", 11 | "backgroundColor": "red", 12 | "enablePullDownRefresh": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /chaptor_02/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 200rpx 0; 9 | box-sizing: border-box; 10 | } 11 | -------------------------------------------------------------------------------- /chaptor_02/images/click.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/click.gif -------------------------------------------------------------------------------- /chaptor_02/images/code1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/code1.png -------------------------------------------------------------------------------- /chaptor_02/images/code2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/code2.png -------------------------------------------------------------------------------- /chaptor_02/images/coor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/coor.png -------------------------------------------------------------------------------- /chaptor_02/images/dbclick.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/dbclick.gif -------------------------------------------------------------------------------- /chaptor_02/images/longtap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/longtap.gif -------------------------------------------------------------------------------- /chaptor_02/images/shoushi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_02/images/shoushi.gif -------------------------------------------------------------------------------- /chaptor_02/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | Page({ 5 | data: { 6 | btnWidth: 200, 7 | touchLog:"", 8 | lastTapDiffTime: 0, 9 | startPoint: [0,0] 10 | }, 11 | //事件处理函数 12 | bindViewTap: function() { 13 | wx.navigateTo({ 14 | url: '../logs/logs' 15 | }) 16 | }, 17 | onLoad: function () { 18 | var that = this 19 | //调用应用实例的方法获取全局数据 20 | app.getUserInfo(function(userInfo){ 21 | //更新数据 22 | that.setData({ 23 | userInfo:userInfo 24 | }) 25 | }) 26 | }, 27 | ////触摸事件,判断单击还是双击 28 | mytap: function(e){ 29 | var curTime = e.timeStamp; 30 | var lastTime = this.data.lastTapDiffTime; 31 | if(lastTime > 0){ 32 | //如果两次单击间隔小于300毫秒,认为是双击 33 | if(curTime - lastTime < 300){ 34 | console.log(e.timeStamp + '- db tap') 35 | }else{ 36 | console.log(e.timeStamp + '- tap') 37 | } 38 | }else{ 39 | console.log(e.timeStamp + '- first tap') 40 | } 41 | this.setData({lastTapDiffTime: curTime}); 42 | }, 43 | //识别长按 44 | mylongtap: function(e){ 45 | console.log(e.timeStamp + '- long tap') 46 | }, 47 | //触摸开始 48 | mytouchstart: function(e){ 49 | console.log(e.timeStamp + '- touch start') 50 | console.log(e.touches.length); 51 | this.setData({startPoint: [e.touches[0].pageX, e.touches[0].pageY]}); 52 | }, 53 | //触摸点移动 54 | mytouchmove: function(e){ 55 | //当前触摸点坐标 56 | var curPoint = [e.touches[0].pageX,e.touches[0].pageY]; 57 | var startPoint = this.data.startPoint; 58 | if(curPoint[0] <= this.data.startPoint[0]){ 59 | if(Math.abs(curPoint[0]-startPoint[0])>= Math.abs(curPoint[1]-startPoint[1])){ 60 | console.log(e.timeStamp + '- touch left move') 61 | }else{ 62 | if(curPoint[1]>= startPoint[1]){ 63 | this.setData({btnWidth: this.data.btnWidth-1}) 64 | console.log(e.timeStamp + '- touch down move') 65 | }else{ 66 | this.setData({btnWidth: this.data.btnWidth+1}) 67 | console.log(e.timeStamp + '- touch up move') 68 | } 69 | } 70 | }else{ 71 | if(Math.abs(curPoint[0]-startPoint[0])>= Math.abs(curPoint[1]-startPoint[1])){ 72 | console.log(e.timeStamp + '- touch right move') 73 | }else{ 74 | if(curPoint[1]>= startPoint[1]){ 75 | this.setData({btnWidth: this.data.btnWidth-1}) 76 | console.log(e.timeStamp + '- touch down move') 77 | }else{ 78 | this.setData({btnWidth: this.data.btnWidth+1}) 79 | console.log(e.timeStamp + '- touch up move') 80 | } 81 | } 82 | } 83 | }, 84 | //触摸被中断 85 | mytouchcacel: function(e){ 86 | console.log(e.timeStamp + '- touch cancel') 87 | 88 | }, 89 | //触摸结束 90 | mytouchend: function(e){ 91 | console.log(e.timeStamp + '- touch end') 92 | 93 | }, 94 | onPullDownRefresh: function(e){ 95 | console.log('onPullDownRefresh') 96 | } 97 | }) 98 | -------------------------------------------------------------------------------- /chaptor_02/pages/index/index.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_02/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{item}} 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /chaptor_02/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | .userinfo { 3 | display: flex; 4 | flex-direction: column; 5 | align-items: center; 6 | } 7 | 8 | .userinfo-avatar { 9 | width: 128rpx; 10 | height: 128rpx; 11 | margin: 20rpx; 12 | border-radius: 50%; 13 | } 14 | 15 | .userinfo-nickname { 16 | color: #aaa; 17 | } 18 | 19 | .usermotto { 20 | margin-top: 200px; 21 | } -------------------------------------------------------------------------------- /chaptor_02/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /chaptor_02/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_02/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_02/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_02/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds(); 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_03/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | }, 9 | getUserInfo:function(cb){ 10 | var that = this; 11 | if(this.globalData.userInfo){ 12 | typeof cb == "function" && cb(this.globalData.userInfo) 13 | }else{ 14 | //调用登录接口 15 | wx.login({ 16 | success: function () { 17 | wx.getUserInfo({ 18 | success: function (res) { 19 | that.globalData.userInfo = res.userInfo; 20 | typeof cb == "function" && cb(that.globalData.userInfo) 21 | } 22 | }) 23 | } 24 | }); 25 | } 26 | }, 27 | globalData:{ 28 | userInfo:null, 29 | ws:'wss://localhost:8443' 30 | } 31 | }) 32 | -------------------------------------------------------------------------------- /chaptor_03/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/chat/chat", 5 | "pages/logs/logs" 6 | ], 7 | "window":{ 8 | "backgroundTextStyle":"light", 9 | "navigationBarBackgroundColor": "#fff", 10 | "navigationBarTitleText": "聊天", 11 | "navigationBarTextStyle":"black" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /chaptor_03/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 200rpx 0; 9 | box-sizing: border-box; 10 | } 11 | -------------------------------------------------------------------------------- /chaptor_03/pages/chat/chat.js: -------------------------------------------------------------------------------- 1 | var app = getApp(); 2 | var socketOpen = false; 3 | Page({ 4 | data:{ 5 | // text:"这是一个页面" 6 | inputValue: '', 7 | //消息记录 8 | historyMsgList:[] 9 | }, 10 | onLoad:function(options){ 11 | // 页面初始化 options为页面跳转所带来的参数 12 | this.setData({user: options.user}) 13 | }, 14 | bindKeyInput: function(e) { 15 | this.setData({ 16 | inputValue: e.detail.value 17 | }) 18 | }, 19 | //发送消息 20 | sendtap: function(e){ 21 | var $this = this; 22 | if(socketOpen){ 23 | wx.sendSocketMessage({ 24 | data: JSON.stringify({ 25 | user: $this.data.user, 26 | content:$this.data.inputValue 27 | }), 28 | success: function(res){ 29 | var arr = $this.data.historyMsgList; 30 | arr.push('发送消息登录:' + $this.data.inputValue) 31 | $this.setData({historyMsgList:arr}); 32 | } 33 | }) 34 | } 35 | }, 36 | onReady:function(){ 37 | var $this = this; 38 | var user = this.data.user; 39 | //发起websocket连接 40 | wx.connectSocket({ 41 | url: app.globalData.ws + '/weappservice/websocket?name=' + user, 42 | data: { 43 | x: 'x' 44 | }, 45 | method: 'POST', 46 | header:{ 47 | 'content-type': 'application/text' 48 | } 49 | 50 | }) 51 | wx.onSocketOpen(function(res) { 52 | socketOpen = true; 53 | 54 | var arr = $this.data.historyMsgList; 55 | arr.push(user + '登录成功'); 56 | $this.setData({historyMsgList:arr}); 57 | 58 | console.log('WebSocket连接已打开!'); 59 | }) 60 | wx.onSocketError(function(res){ 61 | console.log('WebSocket连接打开失败,请检查!') 62 | }), 63 | //接收消息 64 | wx.onSocketMessage(function(res){ 65 | var data = JSON.parse(res.data); 66 | var arr = $this.data.historyMsgList; 67 | arr.push('接收到'+data.user+'的消息,Ta说:' + data.content) 68 | $this.setData({historyMsgList:arr}); 69 | }) 70 | }, 71 | onShow:function(){ 72 | // 页面显示 73 | }, 74 | onHide:function(){ 75 | // 页面隐藏 76 | }, 77 | onUnload:function(){ 78 | // 页面关闭 79 | } 80 | }) -------------------------------------------------------------------------------- /chaptor_03/pages/chat/chat.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_03/pages/chat/chat.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{item}} 7 | 8 | -------------------------------------------------------------------------------- /chaptor_03/pages/chat/chat.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_03/pages/chat/chat.wxss -------------------------------------------------------------------------------- /chaptor_03/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | Page({ 5 | data: { 6 | motto: 'Hello 小程序', 7 | userInfo: {}, 8 | inputValue: '' 9 | }, 10 | //事件处理函数 11 | bindViewTap: function() { 12 | wx.navigateTo({ 13 | url: '../logs/logs' 14 | }) 15 | }, 16 | onLoad: function () { 17 | console.log('onLoad') 18 | var that = this 19 | //调用应用实例的方法获取全局数据 20 | app.getUserInfo(function(userInfo){ 21 | //更新数据 22 | that.setData({ 23 | userInfo:userInfo 24 | }) 25 | }) 26 | }, 27 | bindKeyInput: function(e) { 28 | this.setData({ 29 | inputValue: e.detail.value 30 | }) 31 | }, 32 | logintap: function(e){ 33 | wx.redirectTo({ 34 | url: '/pages/chat/chat?user=' + this.data.inputValue 35 | }) 36 | } 37 | }) 38 | -------------------------------------------------------------------------------- /chaptor_03/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /chaptor_03/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | page{ 3 | background-color: #FBF9FE; 4 | } 5 | .userinfo { 6 | display: flex; 7 | flex-direction: column; 8 | align-items: center; 9 | } 10 | 11 | .userinfo-avatar { 12 | width: 128rpx; 13 | height: 128rpx; 14 | margin: 20rpx; 15 | border-radius: 50%; 16 | } 17 | 18 | .userinfo-nickname { 19 | color: #aaa; 20 | } 21 | 22 | .usermotto { 23 | margin-top: 200px; 24 | } 25 | .ipt-cls{ 26 | background-color: #fff; 27 | width: 80%; 28 | height: 40px; 29 | } 30 | .btn-login{ 31 | margin-top: 10px; 32 | width: 80%; 33 | } -------------------------------------------------------------------------------- /chaptor_03/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /chaptor_03/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_03/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_03/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_03/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds(); 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_04/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | }, 9 | getUserInfo:function(cb){ 10 | var that = this; 11 | if(this.globalData.userInfo){ 12 | typeof cb == "function" && cb(this.globalData.userInfo) 13 | }else{ 14 | //调用登录接口 15 | wx.login({ 16 | success: function () { 17 | wx.getUserInfo({ 18 | success: function (res) { 19 | that.globalData.userInfo = res.userInfo; 20 | typeof cb == "function" && cb(that.globalData.userInfo) 21 | } 22 | }) 23 | } 24 | }); 25 | } 26 | }, 27 | globalData:{ 28 | userInfo:null 29 | } 30 | }) 31 | -------------------------------------------------------------------------------- /chaptor_04/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs" 5 | ], 6 | "window":{ 7 | "backgroundTextStyle":"light", 8 | "navigationBarBackgroundColor": "#fff", 9 | "navigationBarTitleText": "音乐播放", 10 | "navigationBarTextStyle":"black" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /chaptor_04/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: row; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 200rpx 0; 9 | box-sizing: border-box; 10 | } 11 | -------------------------------------------------------------------------------- /chaptor_04/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_04/fonts/ionicons.eot -------------------------------------------------------------------------------- /chaptor_04/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_04/fonts/ionicons.ttf -------------------------------------------------------------------------------- /chaptor_04/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_04/fonts/ionicons.woff -------------------------------------------------------------------------------- /chaptor_04/media/test.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_04/media/test.mp4 -------------------------------------------------------------------------------- /chaptor_04/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | Page({ 5 | data: { 6 | motto: 'Hello 小程序', 7 | userInfo: {}, 8 | progressWith: 0, 9 | currenduration: 0, 10 | duration: 0, 11 | //视频路径 12 | videoSrc: '../../media/test.mp4', 13 | intervalId: '' 14 | }, 15 | //事件处理函数 16 | bindViewTap: function() { 17 | wx.navigateTo({ 18 | url: '../logs/logs' 19 | }) 20 | }, 21 | onLoad: function () { 22 | console.log('onLoad') 23 | var that = this 24 | //调用应用实例的方法获取全局数据 25 | app.getUserInfo(function(userInfo){ 26 | //更新数据 27 | that.setData({ 28 | userInfo:userInfo 29 | }) 30 | }) 31 | }, 32 | //开始播放 33 | startplay: function(e){ 34 | var $this = this; 35 | console.log('paly') 36 | 37 | wx.getBackgroundAudioPlayerState({ 38 | success: function(res){ 39 | var s = res.status; 40 | if(s == 0){ 41 | wx.playVoice() 42 | } 43 | $this.setData({duration:Math.ceil(res.duration)}); 44 | } 45 | }) 46 | 47 | wx.playBackgroundAudio({ 48 | dataUrl: 'http://yinyueshiting.baidu.com/data2/music/239833557/739948431476324061128.mp3?xcode=37d73fc57b0c55ac31189f16455400eb', 49 | title: '悟空', 50 | coverImgUrl: 'http://musicdata.baidu.com/data2/pic/89838191/89838191.jpg', 51 | success: function(res){ 52 | var id = $this.setMusicInterval(); 53 | $this.setData({intervalId: id}) 54 | } 55 | }) 56 | }, 57 | //暂停 58 | pauseplay: function(e){ 59 | console.log('pause') 60 | wx.pauseBackgroundAudio() 61 | clearInterval(this.data.intervalId) 62 | }, 63 | //停止播放 64 | stopplay: function(e){ 65 | console.log('stop') 66 | wx.stopBackgroundAudio() 67 | this.setData({currenduration:0, progressWith:0}) 68 | clearInterval(this.data.intervalId) 69 | }, 70 | //快进 71 | forward: function(e){ 72 | var $this = this; 73 | wx.getBackgroundAudioPlayerState({ 74 | success: function(res){ 75 | var duration = res.currentPosition; 76 | 77 | if(duration > $this.data.duration + 5){ 78 | duration = $this.data.duration; 79 | } 80 | wx.seekBackgroundAudio({ 81 | position: duration 82 | }) 83 | } 84 | }) 85 | }, 86 | //快退 87 | backward: function(e){ 88 | wx.getBackgroundAudioPlayerState({ 89 | success: function(res){ 90 | var currentposition = res.currentPosition; 91 | if(currentposition <= 5){ 92 | currentposition = 0; 93 | }else{ 94 | currentposition -= 5; 95 | } 96 | wx.seekBackgroundAudio({ 97 | position: currentposition 98 | }) 99 | } 100 | }) 101 | }, 102 | setMusicInterval: function(){ 103 | var $this = this; 104 | var id = setInterval(function(){ 105 | wx.getBackgroundAudioPlayerState({ 106 | success: function(res){ 107 | console.log(res) 108 | var prog = parseInt(res.currentPosition) / parseInt(res.duration); 109 | console.log(prog) 110 | $this.setData({progressWith:prog * 100,currenduration:Math.ceil(res.currentPosition)}); 111 | } 112 | }) 113 | },1000); 114 | return id; 115 | } 116 | }) 117 | -------------------------------------------------------------------------------- /chaptor_04/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 当前:{{currenduration}}/{{duration}} 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /chaptor_04/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | .userinfo { 3 | display: flex; 4 | flex-direction: column; 5 | align-items: center; 6 | } 7 | 8 | .userinfo-avatar { 9 | width: 128rpx; 10 | height: 128rpx; 11 | margin: 20rpx; 12 | border-radius: 50%; 13 | } 14 | 15 | .userinfo-nickname { 16 | color: #aaa; 17 | } 18 | 19 | .usermotto { 20 | margin-top: 200px; 21 | } 22 | .mycontainer { 23 | flex-direction:row; 24 | flex-wrap: wrap; 25 | justify-content:space-around; 26 | align-items:center; 27 | } 28 | .btncls{ 29 | margin-top: 10px; 30 | } 31 | .weui-progress__bar{ 32 | background-color: 'gray' 33 | } 34 | .myprogress{ 35 | height:5px; 36 | background-color:#1AAD19; 37 | } -------------------------------------------------------------------------------- /chaptor_04/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /chaptor_04/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_04/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_04/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_04/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds(); 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_05/.gitignore: -------------------------------------------------------------------------------- 1 | *swp 2 | -------------------------------------------------------------------------------- /chaptor_05/README.md: -------------------------------------------------------------------------------- 1 | ### 微信小程序用户数据解密(2016-11-24) 2 | - 根据code换取sessionsession_key和openid 3 | - 用户敏感数据解密 -------------------------------------------------------------------------------- /chaptor_05/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | }, 9 | getUserInfo:function(cb){ 10 | var that = this 11 | if(this.globalData.userInfo){ 12 | typeof cb == "function" && cb(this.globalData.userInfo) 13 | }else{ 14 | //调用登录接口 15 | wx.login({ 16 | success: function (res) { 17 | that.globalData.loginCode = res.code 18 | wx.getUserInfo({ 19 | success: function (res) { 20 | that.globalData.userInfo = res.userInfo 21 | that.globalData.iv=res.iv 22 | that.globalData.encryptedData=res.encryptedData 23 | typeof cb == "function" && cb(that.globalData.userInfo) 24 | 25 | } 26 | }) 27 | } 28 | }) 29 | } 30 | }, 31 | globalData:{ 32 | userInfo:null, 33 | loginCode: null, 34 | encryptedData: null, 35 | iv: null, 36 | server: 'https://localhost:8443/weappservice/api/v1', 37 | appId: 'JWEJIJ345QHWJKENVKF', 38 | apiNames : ['WX_CODE','WX_CHECK_USER','WX_DECODE_USERINFO'] 39 | } 40 | }) -------------------------------------------------------------------------------- /chaptor_05/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs" 5 | ], 6 | "window":{ 7 | "backgroundTextStyle":"light", 8 | "navigationBarBackgroundColor": "#fff", 9 | "navigationBarTitleText": "用户信息解密案例", 10 | "navigationBarTextStyle":"black" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /chaptor_05/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | @import 'weui.wxss'; 3 | .container { 4 | height: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | justify-content: space-between; 9 | padding: 200rpx 0; 10 | box-sizing: border-box; 11 | } 12 | -------------------------------------------------------------------------------- /chaptor_05/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | var httpclient = require('../../utils/httpclient.js') 5 | Page({ 6 | data: { 7 | btnType: 'primary', 8 | btnSize: 'default', 9 | btnPlain: false, 10 | 11 | nickname: '', 12 | city: '', 13 | loginCode: '', 14 | 15 | encryptedData:'', 16 | iv:'', 17 | userInfo: {}, 18 | sessionId: '', 19 | openId: '', 20 | unionId: '', 21 | nickname1: '' 22 | }, 23 | //事件处理函数 24 | bindViewTap: function() { 25 | wx.navigateTo({ 26 | url: '../logs/logs' 27 | }) 28 | }, 29 | onLoad: function () { 30 | 31 | }, 32 | //登录 33 | wxlogin: function(e){ 34 | var that = this 35 | 36 | //调用应用实例的方法获取全局数据 37 | app.getUserInfo(function(userInfo){ 38 | //更新数据 39 | that.setData({ 40 | userInfo: userInfo, 41 | nickname: userInfo.nickName, 42 | city: userInfo.city, 43 | loginCode: app.globalData.loginCode, 44 | encryptedData: app.globalData.encryptedData, 45 | iv: app.globalData.iv 46 | }) 47 | }) 48 | }, 49 | // 从服务端获取sessionId 50 | get3rdSessionId: function(e){ 51 | var that = this; 52 | //根据code获取sessionsession_key和openid 53 | wx.showToast({ 54 | title: '正在请求', 55 | icon: 'loading', 56 | duration: 10000 57 | }); 58 | 59 | httpclient.req( 60 | '/wx/getSession', 61 | { 62 | apiName: 'WX_CODE', 63 | code: this.data.loginCode 64 | }, 65 | 'GET', 66 | function(result){ 67 | wx.hideToast() 68 | var sessionId = result.data.data.sessionId; 69 | that.setData({sessionId: sessionId}) 70 | wx.setStorageSync('sessionId', sessionId) 71 | }, 72 | function(result){ 73 | console.log(result) 74 | } 75 | ); 76 | }, 77 | //解密用户敏感数据 78 | getUserAllData: function(e){ 79 | var that = this; 80 | wx.showToast({ 81 | title: '正在请求', 82 | icon: 'loading', 83 | duration: 10000 84 | }) 85 | httpclient.req( 86 | '/wx/decodeUserInfo', 87 | { 88 | apiName: 'WX_DECODE_USERINFO', 89 | encryptedData: this.data.encryptedData, 90 | iv: this.data.iv, 91 | sessionId: wx.getStorageSync('sessionId') 92 | }, 93 | 'GET', 94 | function(result){ 95 | wx.hideToast() 96 | var data = JSON.parse(result.data.data); 97 | that.setData({ 98 | openId: data.openId, 99 | unionId: data.unionId, 100 | nickname1: data.nickName 101 | }) 102 | }, 103 | function(result){ 104 | console.log(result) 105 | } 106 | ); 107 | } 108 | }) 109 | -------------------------------------------------------------------------------- /chaptor_05/pages/index/index.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_05/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 昵称: 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 城市: 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | js_code: 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | sessionId: 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 昵称: 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | openId 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | unionId 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /chaptor_05/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | page{ 3 | background-color: 'gray'; 4 | } 5 | .wrap-item button{ 6 | margin: 10px 0 10px 0; 7 | } -------------------------------------------------------------------------------- /chaptor_05/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /chaptor_05/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_05/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_05/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_05/utils/httpclient.js: -------------------------------------------------------------------------------- 1 | var app = getApp(); 2 | function req(url, data, method, success, fail){ 3 | var mydata = data || {}; 4 | mydata['appId'] = app.globalData.appId; 5 | wx.request({ 6 | url: app.globalData.server + url, 7 | data: mydata, 8 | method: method, 9 | success: success, 10 | fail: fail, 11 | complete: function() { 12 | // complete 13 | } 14 | }) 15 | } 16 | module.exports = { 17 | req: req 18 | } -------------------------------------------------------------------------------- /chaptor_05/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds() 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_06/.gitignore: -------------------------------------------------------------------------------- 1 | *swp 2 | -------------------------------------------------------------------------------- /chaptor_06/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | 3 | var host = 'baidu.com' 4 | App({ 5 | onLaunch: function () { 6 | //调用API从本地缓存中获取数据 7 | var logs = wx.getStorageSync('logs') || [] 8 | logs.unshift(Date.now()) 9 | wx.setStorageSync('logs', logs) 10 | }, 11 | getUserInfo:function(cb){ 12 | var that = this 13 | if(this.globalData.userInfo){ 14 | typeof cb == "function" && cb(this.globalData.userInfo) 15 | }else{ 16 | //调用登录接口 17 | wx.login({ 18 | success: function () { 19 | wx.getUserInfo({ 20 | success: function (res) { 21 | that.globalData.userInfo = res.userInfo 22 | typeof cb == "function" && cb(that.globalData.userInfo) 23 | } 24 | }) 25 | } 26 | }) 27 | } 28 | }, 29 | globalData:{ 30 | userInfo:null, 31 | url: host + 'baidu.com' 32 | } 33 | }) -------------------------------------------------------------------------------- /chaptor_06/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs", 5 | "pages/route1/route1", 6 | "pages/route2/route2", 7 | "pages/route3/route3", 8 | "pages/route4/route4", 9 | "pages/route5/route5" 10 | ], 11 | "window":{ 12 | "backgroundTextStyle":"light", 13 | "navigationBarBackgroundColor": "#fff", 14 | "navigationBarTitleText": "页面路由", 15 | "navigationBarTextStyle":"black" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /chaptor_06/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | @import 'weui.wxss'; 3 | .container { 4 | height: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | justify-content: space-between; 9 | padding: 200rpx 0; 10 | box-sizing: border-box; 11 | } 12 | -------------------------------------------------------------------------------- /chaptor_06/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | var app = getApp() 4 | Page({ 5 | data: { 6 | 7 | }, 8 | //事件处理函数 9 | bindViewTap: function () { 10 | wx.navigateTo({ 11 | url: '../logs/logs' 12 | }) 13 | }, 14 | onLoad: function () { 15 | 16 | }, 17 | toPage1: function (e) { 18 | console.log(e) 19 | wx.navigateTo({ 20 | url: '../route1/route1', 21 | success: function (res) { 22 | console.log(res) 23 | } 24 | }) 25 | } 26 | }) 27 | -------------------------------------------------------------------------------- /chaptor_06/pages/index/index.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /chaptor_06/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | .redbutton{ 3 | color: #ff0000; 4 | } 5 | 6 | .yellowbutton{ 7 | color: #ffff00; 8 | } -------------------------------------------------------------------------------- /chaptor_06/pages/logs/logs.js: -------------------------------------------------------------------------------- 1 | //logs.js 2 | var util = require('../../utils/util.js') 3 | Page({ 4 | data: { 5 | logs: [] 6 | }, 7 | onLoad: function () { 8 | this.setData({ 9 | logs: (wx.getStorageSync('logs') || []).map(function (log) { 10 | return util.formatTime(new Date(log)) 11 | }) 12 | }) 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /chaptor_06/pages/logs/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "查看启动日志" 3 | } -------------------------------------------------------------------------------- /chaptor_06/pages/logs/logs.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{index + 1}}. {{log}} 5 | 6 | 7 | -------------------------------------------------------------------------------- /chaptor_06/pages/logs/logs.wxss: -------------------------------------------------------------------------------- 1 | .log-list { 2 | display: flex; 3 | flex-direction: column; 4 | padding: 40rpx; 5 | } 6 | .log-item { 7 | margin: 10rpx; 8 | } 9 | -------------------------------------------------------------------------------- /chaptor_06/pages/route1/route1.js: -------------------------------------------------------------------------------- 1 | // pages/route1/route1.js 2 | Page({ 3 | data:{}, 4 | onLoad:function(options){ 5 | // 页面初始化 options为页面跳转所带来的参数 6 | }, 7 | onReady:function(){ 8 | // 页面渲染完成 9 | var pages = getCurrentPages(); 10 | }, 11 | onShow:function(){ 12 | // 页面显示 13 | }, 14 | onHide:function(){ 15 | // 页面隐藏 16 | }, 17 | onUnload:function(){ 18 | // 页面关闭 19 | }, 20 | toPage2: function (e) { 21 | console.log(e) 22 | wx.navigateTo({ 23 | url: '../route2/route2', 24 | success: function (res) { 25 | console.log(res) 26 | } 27 | }) 28 | } 29 | }) -------------------------------------------------------------------------------- /chaptor_06/pages/route1/route1.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/route1/route1.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /chaptor_06/pages/route1/route1.wxss: -------------------------------------------------------------------------------- 1 | /* pages/route1/route1.wxss */ -------------------------------------------------------------------------------- /chaptor_06/pages/route2/route2.js: -------------------------------------------------------------------------------- 1 | // pages/route2/route2.js 2 | Page({ 3 | data:{ 4 | total : 0 5 | }, 6 | onLoad:function(options){ 7 | var that = this 8 | // 页面初始化 options为页面跳转所带来的参数 9 | setInterval(function(){ 10 | 11 | that.setData({total: that.data.total + 1}) 12 | console.log(that.data.total) 13 | },1000 ) 14 | }, 15 | onReady:function(){ 16 | // 页面渲染完成 17 | console.log(this.data.name) 18 | }, 19 | onShow:function(){ 20 | // 页面显示 21 | }, 22 | onHide:function(){ 23 | // 页面隐藏 24 | }, 25 | onUnload:function(){ 26 | // 页面关闭 27 | }, 28 | toPage3: function (e) { 29 | console.log(e) 30 | wx.navigateTo({ 31 | url: '../route4/route4', 32 | success: function (res) { 33 | console.log(res) 34 | } 35 | }) 36 | }, 37 | backPage: function(e){ 38 | wx.navigateBack({ 39 | delta: 1, // 回退前 delta(默认为1) 页面 40 | success: function(res){ 41 | // success 42 | }, 43 | fail: function() { 44 | // fail 45 | }, 46 | complete: function() { 47 | // complete 48 | } 49 | }) 50 | } 51 | }) -------------------------------------------------------------------------------- /chaptor_06/pages/route2/route2.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/route2/route2.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chaptor_06/pages/route2/route2.wxss: -------------------------------------------------------------------------------- 1 | /* pages/route2/route2.wxss */ -------------------------------------------------------------------------------- /chaptor_06/pages/route3/route3.js: -------------------------------------------------------------------------------- 1 | // pages/route3/route3.js 2 | Page({ 3 | data:{}, 4 | onLoad:function(options){ 5 | // 页面初始化 options为页面跳转所带来的参数 6 | }, 7 | onReady:function(){ 8 | // 页面渲染完成 9 | }, 10 | onShow:function(){ 11 | // 页面显示 12 | }, 13 | onHide:function(){ 14 | // 页面隐藏 15 | }, 16 | onUnload:function(){ 17 | // 页面关闭 18 | }, 19 | toPage4: function (e) { 20 | console.log(e) 21 | wx.navigateTo({ 22 | url: '../route4/route4', 23 | success: function (res) { 24 | console.log(res) 25 | } 26 | }) 27 | } 28 | }) -------------------------------------------------------------------------------- /chaptor_06/pages/route3/route3.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/route3/route3.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chaptor_06/pages/route3/route3.wxss: -------------------------------------------------------------------------------- 1 | /* pages/route3/route3.wxss */ -------------------------------------------------------------------------------- /chaptor_06/pages/route4/route4.js: -------------------------------------------------------------------------------- 1 | // pages/route4/route4.js 2 | Page({ 3 | data:{}, 4 | onLoad:function(options){ 5 | // 页面初始化 options为页面跳转所带来的参数 6 | console.log(options.url) 7 | console.log(options.name) 8 | }, 9 | onReady:function(){ 10 | // 页面渲染完成 11 | }, 12 | onShow:function(){ 13 | // 页面显示 14 | }, 15 | onHide:function(){ 16 | // 页面隐藏 17 | }, 18 | onUnload:function(){ 19 | // 页面关闭 20 | }, 21 | toPage5: function(e){ 22 | wx.navigateTo({ 23 | url: '../route5/route5', 24 | success: function (res) { 25 | console.log(res) 26 | } 27 | }) 28 | }, 29 | navigateBackPage: function(e){ 30 | wx.navigateBack({ 31 | delta: 2, // 回退前 delta(默认为1) 页面 32 | success: function(res){ 33 | // success 34 | } 35 | }) 36 | }, 37 | redirectPage: function(e){ 38 | wx.redirectTo({ 39 | url: '../route1/route1', 40 | success: function(res){ 41 | // success 42 | } 43 | }) 44 | }, 45 | navigateToPage: function(e){ 46 | wx.navigateTo({ 47 | url: '../route2/route2', 48 | success: function(res){ 49 | // success 50 | } 51 | }) 52 | } 53 | }) -------------------------------------------------------------------------------- /chaptor_06/pages/route4/route4.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/route4/route4.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /chaptor_06/pages/route4/route4.wxss: -------------------------------------------------------------------------------- 1 | /* pages/route4/route4.wxss */ -------------------------------------------------------------------------------- /chaptor_06/pages/route5/route5.js: -------------------------------------------------------------------------------- 1 | // pages/route5/route5.js 2 | Page({ 3 | data:{}, 4 | onLoad:function(options){ 5 | // 页面初始化 options为页面跳转所带来的参数 6 | }, 7 | onReady:function(){ 8 | // 页面渲染完成 9 | }, 10 | onShow:function(){ 11 | // 页面显示 12 | }, 13 | onHide:function(){ 14 | // 页面隐藏 15 | }, 16 | onUnload:function(){ 17 | // 页面关闭 18 | } 19 | }) -------------------------------------------------------------------------------- /chaptor_06/pages/route5/route5.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_06/pages/route5/route5.wxml: -------------------------------------------------------------------------------- 1 | 2 | pages/route5/route5.wxml 3 | -------------------------------------------------------------------------------- /chaptor_06/pages/route5/route5.wxss: -------------------------------------------------------------------------------- 1 | /* pages/route5/route5.wxss */ -------------------------------------------------------------------------------- /chaptor_06/utils/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(date) { 2 | var year = date.getFullYear() 3 | var month = date.getMonth() + 1 4 | var day = date.getDate() 5 | 6 | var hour = date.getHours() 7 | var minute = date.getMinutes() 8 | var second = date.getSeconds() 9 | 10 | 11 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 12 | } 13 | 14 | function formatNumber(n) { 15 | n = n.toString() 16 | return n[1] ? n : '0' + n 17 | } 18 | 19 | module.exports = { 20 | formatTime: formatTime 21 | } 22 | -------------------------------------------------------------------------------- /chaptor_07/.gitignore: -------------------------------------------------------------------------------- 1 | *swp 2 | -------------------------------------------------------------------------------- /chaptor_07/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | //调用API从本地缓存中获取数据 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | }, 9 | getUserInfo:function(cb){ 10 | var that = this 11 | if(this.globalData.userInfo){ 12 | typeof cb == "function" && cb(this.globalData.userInfo) 13 | }else{ 14 | //调用登录接口 15 | wx.login({ 16 | success: function () { 17 | wx.getUserInfo({ 18 | success: function (res) { 19 | that.globalData.userInfo = res.userInfo 20 | typeof cb == "function" && cb(that.globalData.userInfo) 21 | } 22 | }) 23 | } 24 | }) 25 | } 26 | }, 27 | globalData:{ 28 | server: 'https://localhost:8443/weappservice/api/v1', 29 | appId: 'JWEJIJ345QHWJKENVKF' 30 | } 31 | }) -------------------------------------------------------------------------------- /chaptor_07/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/logs/logs", 5 | "pages/article/list", 6 | "pages/articledetail/detail" 7 | ], 8 | "window":{ 9 | "backgroundTextStyle":"light", 10 | "navigationBarBackgroundColor": "#fff", 11 | "navigationBarTitleText": "小黄象-精品专栏", 12 | "navigationBarTextStyle":"black" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /chaptor_07/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | @import 'weui.wxss'; 3 | .container { 4 | height: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | justify-content: space-between; 9 | padding: 200rpx 0; 10 | box-sizing: border-box; 11 | } 12 | -------------------------------------------------------------------------------- /chaptor_07/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/1.png -------------------------------------------------------------------------------- /chaptor_07/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/2.jpg -------------------------------------------------------------------------------- /chaptor_07/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/3.png -------------------------------------------------------------------------------- /chaptor_07/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/4.png -------------------------------------------------------------------------------- /chaptor_07/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/5.png -------------------------------------------------------------------------------- /chaptor_07/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/6.jpg -------------------------------------------------------------------------------- /chaptor_07/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/7.jpg -------------------------------------------------------------------------------- /chaptor_07/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/8.jpg -------------------------------------------------------------------------------- /chaptor_07/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nosqlcoco/wechat-mini-program-learning/41fb2fffe5f4f5ef15823d02d44505f369137a83/chaptor_07/images/9.png -------------------------------------------------------------------------------- /chaptor_07/pages/article/list.js: -------------------------------------------------------------------------------- 1 | // pages/article/list.js 2 | var app = getApp() 3 | var httpclient = require('../../utils/httpclient.js') 4 | Page({ 5 | data:{ 6 | //分页当前页 7 | pageIdx: 0, 8 | //文章列表 9 | articles: [] 10 | }, 11 | onLoad:function(options){ 12 | //传入类型 13 | var type = options.type; 14 | //专栏文章 15 | if(type === 'column'){ 16 | var path = options.path; 17 | this.setData({desc: options.desc}) 18 | //查询数据 19 | this.getColumnArticle(path); 20 | }else if(type === 'search'){//搜索文章 21 | this.setData({desc: options.text}) 22 | //查询数据 23 | this.searchArticle(options.text); 24 | } 25 | }, 26 | onReady:function(){ 27 | // 页面渲染完成 28 | }, 29 | onShow:function(){ 30 | // 页面显示 31 | }, 32 | onHide:function(){ 33 | // 页面隐藏 34 | }, 35 | onUnload:function(){ 36 | // 页面关闭 37 | }, 38 | //根据专栏路径查询 39 | getColumnArticle: function(path){ 40 | var that = this; 41 | httpclient.req( 42 | '/wxclub' + path + '/' + that.data.pageIdx, 43 | { 44 | apiName: 'WX_CLUB_ARTICLES', 45 | }, 46 | 'GET', 47 | function(res){ 48 | var datalist = res.data.data || []; 49 | that.setData({articles: datalist}) 50 | 51 | for(var i = 0; i < datalist.length; i++){ 52 | //将文章放到本地缓存 53 | wx.setStorage({ 54 | key: datalist[i]['id'], 55 | data: datalist[i] 56 | }); 57 | } 58 | } 59 | ) 60 | }, 61 | //根据文章标题查询 62 | searchArticle: function(text){ 63 | var that = this; 64 | httpclient.req( 65 | '/wxclub/column/search/' + that.data.pageIdx, 66 | { 67 | apiName : 'WX_CLUB_SEARCH', 68 | text: text 69 | }, 70 | 'GET', 71 | function(res){ 72 | var datalist = res.data.data || []; 73 | that.setData({articles: datalist}) 74 | 75 | for(var i = 0; i < datalist.length; i++){ 76 | //将文章放到本地缓存 77 | wx.setStorage({ 78 | key: datalist[i]['id'], 79 | data: datalist[i] 80 | }); 81 | } 82 | } 83 | ) 84 | } 85 | }) -------------------------------------------------------------------------------- /chaptor_07/pages/article/list.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_07/pages/article/list.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{desc}} 4 | 5 | 6 | 7 | 8 | 9 | 10 | {{item.title}} 11 | {{item.createTime}} 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /chaptor_07/pages/article/list.wxss: -------------------------------------------------------------------------------- 1 | /* pages/article/list.wxss */ 2 | .page__bd{ 3 | margin-top: 100rpx; 4 | } -------------------------------------------------------------------------------- /chaptor_07/pages/articledetail/detail.js: -------------------------------------------------------------------------------- 1 | // pages/articledetail/detail.js 2 | var WxParse = require('../../wxParse/wxParse.js'); 3 | Page({ 4 | data:{ 5 | avatarUrl: '', 6 | nickName: '', 7 | remark: '' 8 | 9 | }, 10 | onLoad:function(options){ 11 | var that = this; 12 | var id = options.id; 13 | //根据文章ID,从本地缓存中获取文章 14 | wx.getStorage({ 15 | key: id, 16 | success: function(res){ 17 | var data =res.data; 18 | //将标题栏设置为文章标题 19 | wx.setNavigationBarTitle({ 20 | title: data.title, 21 | success: function(res) { 22 | 23 | } 24 | }) 25 | that.setData({ 26 | avatarUrl: data.author.headimg, 27 | nickName: data.author.nickname, 28 | remark: data.author.remark 29 | //content: data.content 30 | }) 31 | //使用wxParse将html转为wxml,请在github上自行参考wxParse 32 | WxParse.wxParse('content', 'html', data.content, that,5); 33 | } 34 | }) 35 | }, 36 | onReady:function(){ 37 | // 页面渲染完成 38 | }, 39 | onShow:function(){ 40 | // 页面显示 41 | }, 42 | onHide:function(){ 43 | // 页面隐藏 44 | }, 45 | onUnload:function(){ 46 | // 页面关闭 47 | } 48 | }) -------------------------------------------------------------------------------- /chaptor_07/pages/articledetail/detail.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /chaptor_07/pages/articledetail/detail.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{nickName}}\n 9 | {{remark}} 10 | 11 | 12 | 13 | 14 | 15 |