login.ts 3.6 KB

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