init.uts 3.9 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 55 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
// 导入 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"`
      )
    } 
  }

  // #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)
  


  const checkNeedLogin = (url:string):boolean=>{
    if(state.isLogin){
      return false
    }
    const needLogin = config.getArray<string>('needLogin')
    if (needLogin != null) {
      return needLogin.every((item:string):boolean => {
        return item == url || new RegExp(item).test(url)
      })
    }else{
      return false
    }
  }
  
  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)
      }
    }
  })
  
}