* * * * *
## 记录
### Page.data 与 Page.onLoad 是同步的
`Page.data` 与 `Page.onLoad` 共存亡,页面卸载时 `Page.data` 也会清除,页面加载时 `onLoad` 执行,此后只要页面没卸载,`Page.data` 就一直在,`onLoad` 也不会在执行,所以说 `Page.data` 与 `onLoad` 是同步的。根据这点,我们把页面数据 放在 `onLoad` 里面初始化,数据的有效期就等同于页面的有效期。`onLoad` 就相当于浏览器的标签页,打开时执行一次,如果关闭,再打开也会执行一次,但是切换到其标签在切换回来就不会执行。
路由操作里的关闭页面,其实就是卸载页面。
* * * * *
### 多页应用与网页的思考
> 如果小程序是一个多 tab 应用(客户端窗口的底部或顶部有 tab 栏可以切换页面),可以通过 [tabBar 配置项](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#全局配置) 指定 tab 栏的表现,以及 tab 切换时显示的对应页面。
多tab应用其实就是多页应用,这有点像一个浏览器开多个标签打开网页(浏览器每个标签都有一个单独的进程),这样看的话,其实很多APP都是这样的,比如微信,支付宝,QQ等等,下方的 tab 栏就是多个独立页面,点进去就是其他的内页面。这就和浏览器的多个标签一模一样。
传统的网页只有一个首页,那么APP就有多个“首页”,每个tab也就是一个“首页”,而第一个tab页就是 **第一首页**。
所以如果要以理解网站的思路去理解app的话,可以这样理解:app就是一个开了多个标签的浏览器,标签数量就为tab数量,内页间可以相互跳转,就和网页一样,也可以和tab页相互跳转,普通的页面跳转可能并不会关闭当前页面,打开过的页面在内存中,系统会管理内存,可能会在合适的时机回收打开的页面。
* * * * *
### 无打断的操作体验
当前没有授权的才需要跳转到login页面,因为需要用户点击 `button.open-type.getUserInfo` 按钮。已经同意授权了的可以在当前页面直接登录,这样不至于打断当前操作。
只要本地 `user_info` 和 `session_id`(本地和服务器的会话凭证) 存在就可以认为是登录的,这个用户信息同步要到 `app.globalData.userInfo` 上。**如果服务器登录态失效了,在此后的网络请求中是能发现的,所以这么做没有问题。**
不打断操作的做法: `api.request()` 发现需要登录时,`wx.getSetting()` 检测授权状态,已授权 就直接当前页面完成 oauth登录,否则跳转到login页面去完成 oauth登录。(其实还可以优化,当前页面的按钮做成 `button.open-type.getUserInfo` 就可以了,比如 立即预约按钮,这样直接在当前弹出授权询问框,而无需跳转了)。
```
// bindGetUserInfo回调里面判断用户是否授权,未授权会弹出授权框,授权后完成oauth登录,然后进行预约按钮逻辑
<button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">立即预约</button>
```
另外,能不让用户登录的就无需登录。
* * * * *
### 操作按钮即是授权按钮
wxml文件:
```
<button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo" hover-class="none" data-call="buy" data-id="12">立即购买</button>
```
js文件:
```
buy: function (e, res) {
log.s('index buy ', e);
log.s('index buy ', res);
},
bindGetUserInfo: function (e) {
var that = this;
if (e.detail.errMsg == 'getUserInfo:ok') {
log.w('my > bindGetUserInfo() 用户同意授权! ', e)
var call = e.target.dataset.call; // 需要调用的操作
call = that[call];
// 需要登录才能进行的操作,如:that.buy()
that.ensureLogin(call, e);
} else {
log.e('my > bindGetUserInfo() 用户拒绝授权! ', e);
wx.showToast({
title: '需要收取才能继续操作!',
icon: 'none',
duration: 4000,
});
}
},
// 确保登录才能继续操作
ensureLogin: function (call, e) {
app.ensureGetUserInfo(function (res) {
log.s('index ensureLogin:s ', res);
call(e, res);
}, function (res) {
log.e('index ensureLogin:e ', res.errMsg);
if (res.errMsg == 'scope.userInfo:false') {
// 不会到这儿来。若不授权是调用不到这儿的
} else {
// 弹出错误!
wx.showToast({
title: '登录出错!',
icon: 'none',
duration: 2500,
});
}
});
},
```
能触发“需要登录的网络请求的”操作按钮,都做成 `button.open-type.getUserInfo` 按钮,方法都是 `bindgetuserinfo` 方法,确保已授权登录才能继续操作。
不过这可能出现,当前登录态有效,但授权过期的情况,这时本来是无需授权的,只有需要登录无授权情况下才需要授权,现在也无故授权一次,不过这种情况可能性很小,就算是这样,授权一次又怎么样,所以无需担心这个问题。
* * * * *
### 数据一致性与全局数据共享规范
`app.globalData` 数据 所有页面共享,既能访问也能更改,全局数据的存取如果没有规范的话,会很容易造成数据不同步。
例如 `Page.data.x: app.globalData.x` 页面渲染时,初始化数据来源于全局,这样的做法很危险,如果全局数据被其他页面修改了,这边不能得到更新,毕竟全局没有 `setData()` 方法。
等等问题,所以对于全局数据的共享有必要建立一个规范:
1. 对于全局数据的读取和更改,只能使用由app自身提供的全局方法对数据进行操作,不能直接使用 `app.globalData` 。
2. 页面初始化数据不能使用全局数据或方法,并且也不要使用其他任何方法和计算表达式,请在 `onLoad` 中通过 `setData()` 设置。
规范不知强制的,但是遵循统一的规范有利于开发和维护。
>[tip] app实例只能在/pages/内的页面中获取和使用。
* * * * *
### 授权按钮可以坐在逻辑按钮上
把需要登录操作的按钮做成授权按钮 `button.open-type.getUserInfo` 也是可以的,这样就无需跳转到登录页面了,这样才是终极的无打断操作解决方案。
还可以通过微信授权获取用户的手机号码 `button.open-type.getPhoneNumber` 按钮,手机号码有效性的验证短信由微信发送,体验比较好。
```
<button open-type="getPhoneNumber" bindgetphonenumber="bindGetPhoneNumber">获取手机号码</button>
// 弹出授权询问框完成用户授权
<button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">一键登录</button>
```
* * * * *
### sessionKey理解以及处理方式
`sessionKey` 是微信帮用户储存在微信的服务器上的,有效期不对外公开,只有微信自己知道。通过 `code` 换取后 `sessionKey`,我们服务器也会给用户储存一份,也就是说,`sessionKey` 只在两个位置存放,一个在微信服务器,一个在我们的服务器。
oauth登录时就暂时不检测密匙有效性了 `wx.checkSession` ,**即使是过期了也没事 ,反正服务端oauth认证时会获取新的密匙,oauth流程中的校验与解密操作是不会出现 `sessionKey` 无效的情况的。**
以后其它地方有需要的话再主动检测密匙状态,如解密分享接口的数据。
* * * * *
### 服务端的登录态
服务端的登录态通常是session机制,在浏览器上一般都是cookie-session机制,浏览器上有一个名为 `PHPSESSID` 的cookie,内容为 `session_id`,即:`cookie{PHPSESSID: session_id}` ,服务器就是一句这个会话id作为标识,和浏览器进行认证和保持登录状态的。
我们可认为服务端的登录态只要不退出就是永久的。当然也可以自定义登录态,如多长时间没活跃自动下线,另外还有一种情况会导致登录会话失效,比如服务器故障导致session文件丢失,或者php cg自动删除session文件等。
所以只要我们本地的 `session_id` 一直存在,就可以一直和服务器保持登录状态。
* * * * *
### 能保存用户的openid到本地吗?
Oauth登录过程主要是调用 `wx.login()` 获取临时code,然后在服务端通过 **开放接口** 换取用户的openid和临时的session_key,加入我们将用户的openid存放在本地,只要一直存在,不就可以一直能Oauth登录,而无需再调用 **开放接口** 了吗?
可以是可以,但这样就没有最新的session_key了,假如过期了就不能据此解析用户的加密数据,无法得到用户的最新信息了,只是能完成Oauth登录而已,不过Oauth登录也只需要openid。
但这样不得不考虑另外一个问题,那就是openid能不能这样泄露,会不会有安全问题。
一般不考虑这样做吧。
* * * * *
#### “跳转”页面生命周期
| 名称 | 功能说明 |
| --- | --- |
| [wx.switchTab](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab.html) | 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 |
| [wx.reLaunch](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.reLaunch.html) | 关闭所有页面,打开到应用内的某个页面 |
| [wx.redirectTo](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html) | 关闭当前页面,跳转到应用内的某个页面 |
| [wx.navigateTo](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html) | 保留当前页面,跳转到应用内的某个页面 |
| [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html) | 关闭当前页面,返回上一页面或多级页面 |
只要是跳转都会触发页面加载,如 `wx.navigateTo` 会触发页面 `onLoad`
`wx.switchTab`:如果目标 tab页没有关闭,则不会触发页面 `onLoad`,否则会触发。会触发onShow。
`wx.navigateBack` 也不会触发页面 `onLoad`,这跟后退按钮是一样的,所以一些需要检测数据变化的操作不能放在 `onLoad` ,而要在 `onShow`。
所有都会触发 `onShow`
----
[微信小程序30分钟从陌生到熟悉(下)](https://mp.weixin.qq.com/s/_C0E5LfGs83wNTwPqkdvDA)
能触发需要登录的网络请求的操作按钮,都做成op按钮,方法都是gu方法,确保已授权登录才能操作。不过可能出现,当前登录态有效,但授权过期的情况,这时本来是无需授权的,需要登录无授权情况下才需要授权。
[http://juanxy.taojingkong.com/pdd/index.html](http://juanxy.taojingkong.com/pdd/index.html)(拼多多优惠券-域名未绑定)
[http://m.pin18pin.com/index.html?t=180701&opt\_id=-1&sort\_type=1](http://m.pin18pin.com/index.html?t=180701&opt_id=-1&sort_type=1)
http://web.haoquants.com/first?invitationCode=144975
https://migmkt.qq.com/act/csr_spread.html?sdi_from=0&sdi_sc=1
https://mobile.yangkeduo.com/duo_cms_mall.html?pid=1532122_14087879&cpsSign=CM1532122_14087879_3b21b70f855ca06f2c59216dfe6e5ed1&duoduo_type=2&_wv=41729&_wvx=10&refer_share_id=ivk2i6A8lDGCKNsYNc0yqnP4wwX6381k&refer_share_uid=0&refer_share_channel=message
只有一条母消息,其它为消息状态,这样的消息为广播消息。
[https://youhui.pinduoduo.com/goods/goods-detail?goodsId=80642375937&pid=1673256\_44315941&authDuoId=230001&cpsSign=CM1673256\_44315941\_7a486bd28da21964386a7804548683b9&duoduo\_type=2](https://youhui.pinduoduo.com/goods/goods-detail?goodsId=80642375937&pid=1673256_44315941&authDuoId=230001&cpsSign=CM1673256_44315941_7a486bd28da21964386a7804548683b9&duoduo_type=2)
> 可以爬信息
[小区里捡到“淘宝天猫充值卡”?这“套路”……](https://m.toutiaocdn.cn/group/6587530685076996616/?iid=33124962994&app=news_article_lite×tamp=1533819128&group_id=6587530685076996616&wxshare_count=1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_android&utm_campaign=client_share)
![](http://cdn.aipin100.cn/0b39fbdd5afa1c3334258a5dbf0600f4)
可以提供让商家报名的功能,还有商家的圈子
~~~
【小程序跳转拼多多小程序教程】
https://developers.weixin.qq.com/miniprogram/dev/api/navigateToMiniProgram.html
1、你们小程序所属的公众号需先关联拼多多小程序
拼多多小程序appId: 'wx32540bd863b27570',
2、关联的时候不要勾选在资料页展现!!
不要勾选在资料页展现!!
3、发起关联后,按照格式提供以下内容。
公众号名称:
注册公司名称:
多多客ID:
注册账号:
4、关联好后,pdd.ddk.goods.promotion.url.generate(多多进宝推广链接生成)这个I 接口入参增加字段:generate_we_app ,值为true。响应参数中有page_path,即为需要传的path。
----
设计算法,得到下级收入的百分比作为奖励收入
实际佣金
佣金 = 实际佣金 * Z
利润 = 实际佣金 * (1 - Z)
父奖励 = 佣金 * F
爷奖励 = 佣金 * Y
所以实际总放出 = 佣金 + 父奖励 + 爷奖励
即 佣金 * (1 + F + Y)
要保证系统利润必须满足 实际佣金 > 实际总放出
实际佣金 > 实际佣金 * Z * (1 + F + Y)
即 1 > Z * (1 + F + Y)
~~~
----
![](http://cdn.aipin100.cn/ccf2e46d0645f3a32d1f0b00c4e18342)
这广告和快递单一起的,百世快递也做这个啊
有人利用在快递包裹上贴广告的方式来做这种返利了。
在今日头条上做广告的是卖软件的,以创业赚钱吸引人,其他的大部分以返利省钱为口号吸引普通用户(也有发展下机赚钱的功能,但是主要宣传口号还是返利省钱来吸引直接目标客户,也就是整个链中产生交易的一环用户),还有同样以赚钱创业为口号吸引发展下线。每个角色都有自己的目的,不同的角色推广方式不同。
他们有时会发一个小红包以吸引用户使用他们的返利功能,然后朋友圈不断。
我就说,除了普通账号的微信机器人,肯定还有直接做公众号的,公众号有接口能力,但是公众号不能发朋友圈,推广方面没有个人号灵活了,所以两者可以一起做,可以互补。其实也不需要机器人号,用普通账号做客服来发朋友圈推广就可以。
http://adshare.toutiao.com/group/6542747856673964301/?iid=33124962994&app=news_article_lite×tamp=1527426801&wxshare_count=1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_android&utm_campaign=client_share
[致好券推手全体同胞的一封信](https://mp.weixin.qq.com/s/_R4kKRFMoU5WMXAUzHH8tg)
网易考拉在微信上打开详情页,显示分享赚,这是不好的,分享给别人购买,别人看到原来可以分享赚,你是在利用他赚钱,利用信息不对称,你现在公开了,所以别人会反感,不如自己自推自买,为什么要好了别人呢。其实这个模式根本上就有问题,人人这样自推自买有什么意义呢,商家愿意吗,其实有一定道理的,商品的定价,这代表它的价值,如果直接降价你就会认为它不值高价,但是通过其它渠道让你获得优惠了,你就会觉得占便宜了,这个模式的意义就在于此,这就是人性,当然这其中也有信息不对称的功劳。
![](http://cdn.aipin100.cn/85ffbb530abdcce8f35bb924f7478ce8)
任务平台
* * * * *
last update:2018-9-11 22:14:10
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖