init.uts 4.7 KB
Newer Older
DCloud_JSON's avatar
init  
DCloud_JSON 已提交
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// 导入 autoReportPushClientId 模块,将再重新登录会 token 续期后自动将客户端上报到服务端
// import reportPushClientId from '@/uni_modules/uni-id-pages-x/lib/autoReportPushClientId.uts'

// 导入配置
import config from '@/uni_modules/uni-id-pages-x/config.uts'

import {state} from '@/uni_modules/uni-id-pages-x/store.uts';

// uni-id的云对象
const uniIdCo = uniCloud.importObject('uni-id-co', {
  customUI: true
})
// 用户配置的登录方式、是否打开调试模式
const loginTypes = config.getArray<string>('loginTypes');
const debug = config.getBoolean('debug') as boolean;

export default async function () {
  // 有打开调试模式的情况下
  if (debug) {
    // 1. 检查本地uni-id-pages中配置的登录方式,服务器端是否已经配置正确。否则提醒并引导去配置
    // 调用云对象,获取服务端已正确配置的登录方式
    const res = await uniIdCo.getSupportedLoginType()
    let supportedLoginType = res.getArray<string>('supportedLoginType')
    if(supportedLoginType == null){
      supportedLoginType = []
    }
    // 登录方式,服务端和客户端的映射关系
    const data:UTSJSONObject = {
      "smsCode": 'mobile-code',
      "univerify": 'univerify',
      "username": 'username-password',
      "weixin": 'weixin',
      "qq": 'qq',
      "xiaomi": 'xiaomi',
      "sinaweibo": 'sinaweibo',
      "taobao": 'taobao',
      "facebook": 'facebook',
      "google": 'google',
      "alipay": 'alipay',
      "apple": 'apple',
      "weixinMobile": 'weixin'
    };
    // 遍历客户端配置的登录方式,与服务端比对。并在错误时抛出错误提示
    const list = loginTypes?.filter((type:string):boolean =>{
      let currentType = data.getString(type);
      if(currentType == null){
        currentType = ""
      }
      return !(supportedLoginType.includes(currentType))
    })
    if (list?.length != 0) {
      console.error(
    		`错误:前端启用的登录方式:${list?.join(',')};没有在服务端完成配置。配置文件路径:"/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json"`
      )
55
    }
DCloud_JSON's avatar
init  
DCloud_JSON 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  }

  // #ifdef UNI-APP-X
  // 如果uni-id-pages配置的登录功能有一键登录,有则执行预登录(异步)
  // if (loginTypes.includes('univerify')) {
  //   // uni.preLogin({
  //   //   provider: 'univerify',
  //   //   complete: e => {
  //   //     // console.log(e);
  //   //   }
  //   // })
  // }
  // #endif

  // // 3. 绑定clientDB错误事件
  // // clientDB对象
  // const db = uniCloud.database()
  // db.on('error', onDBError)
  // // clientDB的错误提示
  // function onDBError ({
  //   code, // 错误码详见https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=returnvalue
  //   message
  // }) {
  //   // console.error('onDBError', {code,message});
  // }
  // // 解绑clientDB错误事件
  // // db.off('error', onDBError)


85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
  // needLogin相关代码-start(此代码仅为版本兼容提示使用,如已知晓可删除)
  const needLogin = config.getArray<string>('needLogin')
  const uniCompileVersionCode = uni.getSystemInfoSync().get('uniCompileVersionCode') as number
  if(needLogin != null && (uniCompileVersionCode > 3.99 || uniCompileVersionCode == 3.99) ){
    const tipText = "uni-id-pages x v1.0.4+ 不再支持配置项config.needLogin,请升级HBuilderX 版本为3.99+,使用更强大 uni-id-router替代。详情查看:https://uniapp.dcloud.net.cn/uniCloud/uni-id/summary.html#uni-id-router"
    console.error(tipText)
    uni.showModal({
      content: tipText,
      showCancel: false,
      confirmText:"知道了"
    });
  }else{
    const checkNeedLogin = (url:string):boolean=>{
      if(state.isLogin){
        return false
DCloud_JSON's avatar
init  
DCloud_JSON 已提交
100
      }
101 102 103
      if (needLogin != null) {
        return needLogin.every((item:string):boolean => {
          return item == url || new RegExp(item).test(url)
DCloud_JSON's avatar
init  
DCloud_JSON 已提交
104
        })
105 106
      }else{
        return false
DCloud_JSON's avatar
init  
DCloud_JSON 已提交
107 108
      }
    }
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    uni.addInterceptor('navigateTo',{
      invoke:(e:NavigateToOptions)=>{
        if (checkNeedLogin(e.url)) {
          uni.showToast({
            title: '请先登录',
            icon: 'none'
          })
          e.url = "/uni_modules/uni-id-pages-x/pages/login/login?uniIdRedirectUrl=" + encodeURIComponent(e.url)
        }
      }
    })
    uni.addInterceptor('redirectTo',{
      invoke:(e:RedirectToOptions)=>{
        if (checkNeedLogin(e.url)) {
          uni.showToast({
            title: '请先登录',
            icon: 'none'
          })
          e.url = "/uni_modules/uni-id-pages-x/pages/login/login?uniIdRedirectUrl=" + encodeURIComponent(e.url)
        }
      }
    })
  }
  // needLogin相关代码-end

DCloud_JSON's avatar
init  
DCloud_JSON 已提交
134
}