🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* * * * * ## 记录 ### 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&timestamp=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&timestamp=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