syncLepaoAccountFromToken.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**
  2. * 用 JKES token 拉取 getMyInfo 并更新 lepao_account(哪吒乐跑 / JKES 唯一数据源)
  3. */
  4. const db = require('../DataBase/db.js')
  5. const { jkesRequest } = require('./request.js')
  6. const DEFAULT_AVATAR =
  7. 'https://lepao-cloud.xxoo365.top/view.php/25aa126dc406974ff3579a99a2c6501a.png'
  8. const LOGIN_EXPIRED_MSG = '乐跑账号登录失效,请重新使用乐跑登录器进行登录'
  9. async function markLoginExpiredByToken(token) {
  10. const tokenClean = String(token ?? '').trim()
  11. if (!tokenClean) return
  12. await db.query('UPDATE lepao_account SET state = 0 WHERE token = ?', [tokenClean])
  13. }
  14. /**
  15. * @param {string} token
  16. * @param {{ userAgent?: string, deviceModel?: string }} [device]
  17. * @returns {Promise<
  18. * | { ok: false, msg: string, jkesRes?: object }
  19. * | {
  20. * ok: true
  21. * student_num: string
  22. * findRows: object[]
  23. * profile: {
  24. * name: string
  25. * academy_name: string
  26. * grade_id: any
  27. * class_id: any
  28. * sex: number
  29. * user_avatar: string
  30. * }
  31. * }
  32. * >}
  33. */
  34. async function syncLepaoAccountFromToken(token, device = {}) {
  35. let jkesRes
  36. try {
  37. jkesRes = await jkesRequest('/sys/user/getMyInfo', {}, token)
  38. } catch (error) {
  39. if (error?.loginExpired) {
  40. await markLoginExpiredByToken(token)
  41. return {
  42. ok: false,
  43. msg: LOGIN_EXPIRED_MSG
  44. }
  45. }
  46. throw error
  47. }
  48. if (!jkesRes || jkesRes.code !== 0 || !jkesRes.data || !jkesRes.data.info) {
  49. return {
  50. ok: false,
  51. msg: jkesRes?.message || '获取用户信息失败,请稍后重试或联系客服',
  52. jkesRes
  53. }
  54. }
  55. const {
  56. code,
  57. realName,
  58. identifyCode,
  59. mobileNumber,
  60. gender,
  61. gradeYear,
  62. collegeCode,
  63. classCode,
  64. homeAddr
  65. } = jkesRes.data.info
  66. const sex = gender?.label === '男' ? 1 : 2
  67. const name = realName
  68. const academy_name = collegeCode?.name ?? ''
  69. const grade_id = gradeYear
  70. const class_id = classCode?.className ?? ''
  71. const student_num = code
  72. const user_avatar = DEFAULT_AVATAR
  73. const findSql = `
  74. SELECT
  75. a.email, a.create_user, a.auto_run, a.auto_day, a.notice_type, a.target_count,
  76. a.auto_run_distance_min_km, a.auto_run_distance_max_km, a.pace_min_sec_per_km, a.pace_max_sec_per_km,
  77. e.bot_umo
  78. FROM
  79. lepao_account a
  80. LEFT JOIN
  81. lepao_extra e
  82. ON
  83. a.student_num = e.student_num
  84. WHERE
  85. a.student_num = ? AND a.create_user IS NOT NULL
  86. `
  87. const findRows = await db.query(findSql, [student_num])
  88. if (!findRows) {
  89. return { ok: false, msg: '无法获取用户数据,请重试' }
  90. }
  91. if (findRows.length === 0) {
  92. return {
  93. ok: false,
  94. msg: '该乐跑账号尚未在哪吒乐跑中添加,请先前往 https://jkes.xxoo365.top/ 添加你的账户'
  95. }
  96. }
  97. const time = Date.now()
  98. const ua = device.userAgent
  99. const dm = device.deviceModel
  100. let updateSql =
  101. 'UPDATE lepao_account SET token = ?, name = ?, grade_id = ?, class_id = ?, sex = ?, academy_name = ?, update_time = ?, user_avatar = ?, identifyCode = ?, mobileNumber = ?, homeAddr = ?, state = 1'
  102. const params = [
  103. token,
  104. name,
  105. grade_id,
  106. class_id,
  107. sex,
  108. academy_name,
  109. time,
  110. user_avatar,
  111. identifyCode,
  112. mobileNumber,
  113. homeAddr
  114. ]
  115. if (ua != null && ua !== '') {
  116. updateSql += ', userAgent = ?'
  117. params.push(ua)
  118. }
  119. if (dm != null && dm !== '') {
  120. updateSql += ', deviceModel = ?'
  121. params.push(dm)
  122. }
  123. updateSql += ' WHERE student_num = ?'
  124. params.push(student_num)
  125. const updateRows = await db.query(updateSql, params)
  126. if (!updateRows || updateRows.affectedRows < 1) {
  127. return { ok: false, msg: '更新账号信息失败,请重试' }
  128. }
  129. return {
  130. ok: true,
  131. student_num,
  132. findRows,
  133. profile: {
  134. name,
  135. academy_name,
  136. grade_id,
  137. class_id,
  138. sex,
  139. user_avatar
  140. }
  141. }
  142. }
  143. module.exports = {
  144. syncLepaoAccountFromToken,
  145. DEFAULT_AVATAR
  146. }