login.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { clearBackendAuthTokens, saveBackendAuthTokens, saveBackendBaseUrl } from '../../utils/backendAuth'
  2. import { loginWechatMini } from '../../utils/backendApi'
  3. import { setGlobalMockDebugBridgeEnabled } from '../../utils/globalMockDebugBridge'
  4. const DEFAULT_BACKEND_BASE_URL = 'https://api.gotomars.xyz'
  5. const DEFAULT_DEVICE_KEY = 'mini-dev-device-001'
  6. const DEFAULT_DEV_CODE = 'dev-workbench-user'
  7. type LoginPageData = {
  8. backendBaseUrl: string
  9. deviceKey: string
  10. loginCode: string
  11. statusText: string
  12. }
  13. function setAppBackendState(baseUrl: string, accessToken: string, refreshToken: string) {
  14. const app = getApp<IAppOption>()
  15. if (app.globalData) {
  16. app.globalData.backendBaseUrl = baseUrl
  17. app.globalData.backendAuthTokens = { accessToken, refreshToken }
  18. }
  19. }
  20. Page({
  21. data: {
  22. backendBaseUrl: DEFAULT_BACKEND_BASE_URL,
  23. deviceKey: DEFAULT_DEVICE_KEY,
  24. loginCode: DEFAULT_DEV_CODE,
  25. statusText: '请先登录后端',
  26. } as LoginPageData,
  27. onLoad() {
  28. const app = getApp<IAppOption>()
  29. this.setData({
  30. backendBaseUrl: app.globalData && app.globalData.backendBaseUrl
  31. ? app.globalData.backendBaseUrl
  32. : DEFAULT_BACKEND_BASE_URL,
  33. })
  34. },
  35. handleBaseUrlInput(event: WechatMiniprogram.Input) {
  36. this.setData({ backendBaseUrl: event.detail.value })
  37. },
  38. handleDeviceKeyInput(event: WechatMiniprogram.Input) {
  39. this.setData({ deviceKey: event.detail.value })
  40. },
  41. handleLoginCodeInput(event: WechatMiniprogram.Input) {
  42. this.setData({ loginCode: event.detail.value })
  43. },
  44. persistBaseUrl(): string {
  45. const normalized = saveBackendBaseUrl(this.data.backendBaseUrl)
  46. const app = getApp<IAppOption>()
  47. if (app.globalData) {
  48. app.globalData.backendBaseUrl = normalized
  49. }
  50. if (normalized !== this.data.backendBaseUrl) {
  51. this.setData({ backendBaseUrl: normalized })
  52. }
  53. return normalized
  54. },
  55. async loginWithCode(code: string, sourceLabel: string) {
  56. const baseUrl = this.persistBaseUrl()
  57. this.setData({
  58. statusText: `正在用 ${sourceLabel} 登录后端`,
  59. })
  60. try {
  61. const result = await loginWechatMini({
  62. baseUrl,
  63. code,
  64. deviceKey: this.data.deviceKey || DEFAULT_DEVICE_KEY,
  65. clientType: 'wechat',
  66. })
  67. const tokens = saveBackendAuthTokens(result.tokens)
  68. setAppBackendState(baseUrl, tokens.accessToken, tokens.refreshToken)
  69. this.setData({
  70. statusText: '登录成功,准备进入首页',
  71. })
  72. wx.redirectTo({
  73. url: '/pages/home/home',
  74. })
  75. } catch (error) {
  76. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  77. this.setData({
  78. statusText: `登录失败:${message}`,
  79. })
  80. }
  81. },
  82. handleLoginWithDevCode() {
  83. this.loginWithCode((this.data.loginCode || DEFAULT_DEV_CODE).trim(), '开发码')
  84. },
  85. handleLoginWithWechat() {
  86. this.setData({
  87. statusText: '正在调用 wx.login',
  88. })
  89. wx.login({
  90. success: (result) => {
  91. const code = result && result.code ? result.code : ''
  92. if (!code) {
  93. this.setData({ statusText: 'wx.login 未返回 code' })
  94. return
  95. }
  96. this.setData({ loginCode: code })
  97. this.loginWithCode(code, 'wx.login code')
  98. },
  99. fail: (error) => {
  100. this.setData({
  101. statusText: `wx.login 失败:${error && error.errMsg ? error.errMsg : '未知错误'}`,
  102. })
  103. },
  104. })
  105. },
  106. handleClearLoginState() {
  107. clearBackendAuthTokens()
  108. setGlobalMockDebugBridgeEnabled(false)
  109. const app = getApp<IAppOption>()
  110. if (app.globalData) {
  111. app.globalData.backendAuthTokens = null
  112. }
  113. this.setData({
  114. statusText: '已清空登录态',
  115. })
  116. },
  117. })