* * * * *
## 記錄
### 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)

可以提供讓商家報名的功能,還有商家的圈子
~~~
【小程序跳轉拼多多小程序教程】
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://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)
網易考拉在微信上打開詳情頁,顯示分享賺,這是不好的,分享給別人購買,別人看到原來可以分享賺,你是在利用他賺錢,利用信息不對稱,你現在公開了,所以別人會反感,不如自己自推自買,為什么要好了別人呢。其實這個模式根本上就有問題,人人這樣自推自買有什么意義呢,商家愿意嗎,其實有一定道理的,商品的定價,這代表它的價值,如果直接降價你就會認為它不值高價,但是通過其它渠道讓你獲得優惠了,你就會覺得占便宜了,這個模式的意義就在于此,這就是人性,當然這其中也有信息不對稱的功勞。

任務平臺
* * * * *
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問題
- 臨時
- 好文
- 節流防抖