login.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import config from '@/common/config.js'
  2. import {
  3. isWechat, objToUrlQuery
  4. } from '@/util/squ.js'
  5. import {
  6. getCurQuery, getCurQueryAll, routeWithParams, getStorageSync, toast
  7. } from '@/util/squni.js'
  8. import {
  9. post
  10. } from '@/util/request.js'
  11. import store from '@/store'
  12. export const LoginAlready = 'LoginAlready'
  13. export const LoginSuccess = 'LoginSuccess'
  14. export const LoginUnBind = 'LoginUnBind'
  15. export const LoginRedirect = 'LoginRedirect'
  16. export const LoginError = 'LoginError'
  17. // 开始登录
  18. export const login = (force) => {
  19. return new Promise((resolve) => {
  20. if (!force && getStorageSync('token')) {
  21. console.debug('本地已存在token, 则认为已经登录')
  22. resolve(LoginAlready)
  23. return
  24. }
  25. // #ifdef H5
  26. const accessToken = getCurQuery('accessToken')
  27. if (!force && accessToken) {
  28. console.debug('请求参数中包含accessToken, 则认为登录成功')
  29. store.commit('setToken', accessToken)
  30. resolve(LoginSuccess)
  31. } else if (config.appIdWxMp && isWechat()) {
  32. h5WxLogin().then((res) => {
  33. resolve(res)
  34. })
  35. } else {
  36. h5Login().then((res) => {
  37. resolve(res)
  38. })
  39. }
  40. // #endif
  41. // #ifdef MP-WEIXIN
  42. // 获取进入不同平台的登录方法
  43. uni.getProvider({
  44. service: 'oauth',
  45. success: function(res) {
  46. // 当前只做微信小程序
  47. if (~res.provider.indexOf('weixin')) {
  48. uni.login({
  49. provider: 'weixin',
  50. success: function(loginRes) {
  51. // 前端获取到微信登录临时码,传至后台换openId和sessionId
  52. let code = loginRes.code
  53. doLogin('WxMa', { code }).then((wxRes) => {
  54. resolve(wxRes)
  55. })
  56. },
  57. })
  58. }
  59. },
  60. })
  61. // #endif
  62. })
  63. }
  64. // 请求后台登录
  65. export const doLogin = (loginType, params) => {
  66. return new Promise((resolve) => {
  67. let inviterUserId = getCurQuery('inviterUserId')
  68. console.debug(`请求登录. inviterUserId=${inviterUserId || ''}`)
  69. post(`/core/user/login?loginType=${loginType}`, Object.assign({}, {
  70. appid: config[`appId${loginType}`],
  71. inviterUserId: inviterUserId,
  72. autoRegister: 'true'
  73. }, params)).then((res) => {
  74. console.log(res);
  75. if (res.status === 'success') {
  76. // 调用成功,根据是否有token判断跳转的页面
  77. let data = res.data
  78. store.commit('setOpenid', data.openid)
  79. if (data.tokenInfo) {
  80. // tokenInfo不为空,可直接进入首页
  81. console.debug('登录成功. loginType=' + loginType)
  82. store.commit('setToken', data.tokenInfo.tokenValue)
  83. store.commit('setRefreshToken', data.refreshToken)
  84. resolve(LoginSuccess)
  85. } else {
  86. console.debug('登录失败. loginType=' + loginType + ", openid=" + data.openid)
  87. resolve(LoginUnBind)
  88. }
  89. } else {
  90. resolve({ status: LoginError, data: res})
  91. }
  92. })
  93. })
  94. }
  95. // H5微信登录(公众号)
  96. export const h5WxLogin = () => {
  97. const code = getCurQuery('code')
  98. if (!code) {
  99. console.debug('微信公众号登录. 不包含code,需进行用户授权')
  100. // 授权获取openid
  101. const redirectUri = encodeURIComponent(window.location.href)
  102. const scope = 'snsapi_base' // snsapi_base snsapi_userinfo // 静默授权 用户无感知
  103. const state = 'sqbiz' // 自定义参数,回调时会带上
  104. const url =
  105. `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appIdWxMp}&redirect_uri=${redirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`
  106. window.location.href = url
  107. } else {
  108. console.debug('微信公众号登录. 包含code,执行登录')
  109. return doLogin('WxMp', { code })
  110. }
  111. }
  112. // H5登录
  113. export const h5Login = () => {
  114. routeWithParams(config.loginPath)
  115. return new Promise((resolve) => {
  116. resolve(LoginRedirect)
  117. })
  118. }