defalut页面是一个专门用于授权的页面,只有loading状态和授权状态
逻辑全部在appjs的onshow中处理,
appjs的onshow如果show的options中的pmscode和当前不同,全局缓存存储该options,然后重新进行绑定逻辑,然后如果options中的路径是default,则跳转到首页,如果是其他路径,则不处理,app会自己到其他路径页面。如果没有(没有的话就将当前options中的code设置为缓存中已经存在的code,使两者作为code相同的场景处理)或者相同的话判断当前路径是不是前往default页面的,若果是的话就跳转到首页,如果不是的话就不用处理,就让app自己进入当前路径(可能是分享中带的路径也可能是最近使用中的路径)
================================
知识点:
- 小程序二维码中的参数如code=123,根据小程序文档可以知道code=123会通过编码后赋值给scene=,然后放在query中,可以通过appjs中onshow中的options.query的scene属性中访问到或者页面的onload事件中默认参数query对象的scene属性访问到,多个参数可以通过&符号区分,如code=1&name=2或者1&2
- 其他通过在路径后加path/demo/index?code=2&path=fenxiang/index后加参数的情况,code和path参数都是直接做为属性放在query对象中的,并不像二维码中的那样放在query下的scene中,如做分享功能时参数就是放在路径后边,可以通过appjs中onshow中的options.query对象直接访问相关属性或者页面的onload事件中默认参数query对象访问相关属性访
- 小程序页面的onload是可以拿到当前路径后带的参数。
- 小程序从某一个页面切出去后重新通过扫码、分享、搜索等场景进入时如果这些场景中都没有配置特定路径的话都会重新从默认页面进入,除非从最近使用中重新进入时才会返回上次的页面,当然如果小程序已经销毁的话,即使从最近使用中进入也是会重新从默认页面进入。
此项目的约定
1. 二维码的参数是code=123
2. 分享的参数为path/default/index?code=2&path=fenxiang/index,分享页面路径是进入默认页面,通过path带入真正页面路径
3. 由于通过checkbind会判断用户以前是否绑定过,如果已经绑定过绕开登录直接进入首页,所以cookie是要通过checkbind返回成功的结果时带给前端的,不能通过绑定页面(即输入账号和密码的页面)点击绑定按钮来获取cookie,因为已经绑定过的用户是会绕开绑定页面的,所以在绑定页面点击绑定按钮绑定成功后还需要调一次checkbind拿到cookie存在前端。
app.js:
onShow: function(options){
// 公共方法 开始
let getAuthInfo = async (self) => {
let result = {
isAuth: false,
userInfo: null,
pmsUser: null
}
let code = await login()
let isSettingUserInfo = await getSetting()
if (isSettingUserInfo) {
let userInfo = await getUserInfo()
result = {
result,
...userInfo,
code,
isAuth: userInfo || false
}
}
self.globalData.authInfo = result
//已经加载了默认页面
if (self.userInfoReadyCallback) {
self.userInfoReadyCallback(result)
}
return result
}
let getPmsCode = () => {
let options = getLocalSync(appOptionsKey)
const pmsInfoCode = decodeURIComponent(options.query.scene)
return pmsInfoCode
}
let getCurrOlderPmsCode= (options) => {
let olderOptions = getLocalSync(appOptionsKey) || {
query: {
code:null
}
}
let currPmsCode = ''
let olderPmsCode = olderOptions.query.code //小程序二维码中的code是要通过scene属性配置
if(options.query.scene){//说明是从小程序二维码中扫码进入的
let code = decodeURIComponent(options.query.scene )
currPmsCode = code.split('=')[1]
}else{//分享或者其他没有参数的情况
currPmsCode = options.query.code
}
let newOptions = {...options,query:{code:currPmsCode}} //将options参数组装成我们需要的,即去除二维码中query的scnen参数,在query中加入code,使其与分享中的参数保持一致
let setValue = currPmsCode && currPmsCode !== olderPmsCode ? newOptions : olderOptions
return {olderPmsCode, currPmsCode,optionsValue:setValue}
}
//公共方法结束
// onshow时的主流程开始,
let { currPmsCode, olderPmsCode, optionsValue} = getCurrOlderPmsCode(options)
if(currPmsCode === olderPmsCode ){//code相同
if( options.path==='pages/defalut/index'){
if(options.query.path){//是分享过来的页面
wx.redirectTo({url:options.query.path})//真正的分享页面,
}
wx.redirectTo({url:'pages/home/index'})
return
}
if( options.path !=='pages/defalut/index'){
return
}
}
if(currPmsCode !== olderPmsCode){
setLocalSync(appOptionsKey, optionsValue)
// 重新登录
let result = await getAuthInfo(this)
//如果已授权去拿用户绑定关系,否则会显示授权页面
if (!result.isAuth) {
return
}
let pmsCode = getPmsCode(options) || ''
//获取绑定关系
let bindInfo = await getBindInfo({//请求后端接口
...result,
pmsCode: pmsCode
})
if(bindInfo.Code === bindStatus.ok) {//后端判断之前已经绑定过的,可以直接跳过绑定账号页面直接进入主页或相关页面
if(options.path !=='pages/defalut/index'){
return //不需要跳转,会默认进入options中的path中的页面,这种情况发生在从最近使用中进入小程序
}
if(options.path ==='pages/defalut/index'){//因为我们分享页面默认是进入过渡页面也就是defalut页面,登录成功后再进入真正的分享页面,所以要下面判断
if(options.query.path){//是分享过来的页面
wx.redirectTo({url:options.query.path})//真正的分享页面,
}
wx.redirectTo({url:'pages/home/index'})//跳转主页
return //不需要跳转,会默认进入options中的path中的页面
}
}
}
},