auth.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /**
  2. * 认证相关API接口(小程序版本 - 使用模拟数据)
  3. */
  4. // 模拟用户数据库
  5. const users = new Map()
  6. // 模拟验证码存储 (phone -> {code, expireTime})
  7. const smsCodes = new Map()
  8. // 模拟本机号码(实际开发中应该通过运营商API获取)
  9. const MOCK_PHONE_NUMBER = '18138887353'
  10. // 生成6位随机验证码
  11. function generateSmsCode() {
  12. return Math.random().toString().substr(2, 6)
  13. }
  14. // 验证手机号格式
  15. function validatePhone(phone) {
  16. const phoneRegex = /^1[3-9]\d{9}$/
  17. return phoneRegex.test(phone)
  18. }
  19. // 检查验证码是否有效
  20. function isValidSmsCode(phone, code) {
  21. const smsData = smsCodes.get(phone)
  22. if (!smsData) return false
  23. const now = Date.now()
  24. const expired = now > smsData.expireTime
  25. if (expired) {
  26. smsCodes.delete(phone)
  27. return false
  28. }
  29. return smsData.code === code
  30. }
  31. // 模拟网络延迟
  32. const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))
  33. // 获取本机号码
  34. export const getPhoneNumber = async () => {
  35. await delay(500) // 模拟网络延迟
  36. console.log('模拟API: 获取本机号码')
  37. return {
  38. code: 200,
  39. message: '获取成功',
  40. data: {
  41. phone: MOCK_PHONE_NUMBER,
  42. maskedPhone: `${MOCK_PHONE_NUMBER.slice(0, 3)}****${MOCK_PHONE_NUMBER.slice(-4)}`
  43. }
  44. }
  45. }
  46. // 发送验证码
  47. export const sendSmsCode = async (phone) => {
  48. await delay(800) // 模拟网络延迟
  49. console.log('模拟API: 发送验证码', { phone })
  50. // 验证手机号格式
  51. if (!validatePhone(phone)) {
  52. throw new Error('手机格式不正确')
  53. }
  54. // 生成验证码
  55. const code = generateSmsCode()
  56. const expireTime = Date.now() + 10 * 60 * 1000 // 10分钟有效期
  57. // 存储验证码
  58. smsCodes.set(phone, { code, expireTime })
  59. console.log(`模拟API: 验证码已发送到 ${phone}: ${code}`)
  60. return {
  61. code: 200,
  62. message: '验证码发送成功',
  63. data: {
  64. phone,
  65. // 开发阶段返回验证码,生产环境不应返回
  66. debugCode: code
  67. }
  68. }
  69. }
  70. // 验证码登录
  71. export const smsLogin = async (phone, code) => {
  72. await delay(1000) // 模拟网络延迟
  73. console.log('模拟API: 验证码登录', { phone, code })
  74. // 验证手机号格式
  75. if (!validatePhone(phone)) {
  76. throw new Error('手机格式不正确')
  77. }
  78. // 验证验证码
  79. if (!isValidSmsCode(phone, code)) {
  80. throw new Error('验证码错误')
  81. }
  82. // 检查用户是否存在
  83. let user = users.get(phone)
  84. const isNewUser = !user
  85. if (isNewUser) {
  86. // 新用户自动注册
  87. user = {
  88. id: 'user_' + Date.now(),
  89. phone,
  90. nickname: `用户${phone.slice(-4)}`,
  91. avatar: '',
  92. registerTime: Date.now(),
  93. lastLoginTime: Date.now()
  94. }
  95. users.set(phone, user)
  96. console.log('模拟API: 新用户注册', user)
  97. } else {
  98. // 老用户更新最近登录时间
  99. user.lastLoginTime = Date.now()
  100. users.set(phone, user)
  101. console.log('模拟API: 老用户登录', user)
  102. }
  103. // 清除使用过的验证码
  104. smsCodes.delete(phone)
  105. // 生成token
  106. const token = 'token_' + Date.now() + '_' + Math.random().toString(36).substr(2)
  107. return {
  108. code: 200,
  109. message: isNewUser ? '注册登录成功' : '登录成功',
  110. data: {
  111. token,
  112. user,
  113. isNewUser
  114. }
  115. }
  116. }
  117. // 一键登录
  118. export const oneClickLogin = async (phone) => {
  119. await delay(1200) // 模拟网络延迟
  120. console.log('模拟API: 一键登录', { phone })
  121. // 验证手机号格式
  122. if (!validatePhone(phone)) {
  123. throw new Error('手机格式不正确')
  124. }
  125. // 检查用户是否存在
  126. let user = users.get(phone)
  127. const isNewUser = !user
  128. if (isNewUser) {
  129. // 新用户自动注册
  130. user = {
  131. id: 'user_' + Date.now(),
  132. phone,
  133. nickname: `用户${phone.slice(-4)}`,
  134. avatar: '',
  135. registerTime: Date.now(),
  136. lastLoginTime: Date.now()
  137. }
  138. users.set(phone, user)
  139. console.log('模拟API: 一键登录新用户注册', user)
  140. } else {
  141. // 老用户更新最近登录时间
  142. user.lastLoginTime = Date.now()
  143. users.set(phone, user)
  144. console.log('模拟API: 一键登录老用户', user)
  145. }
  146. // 生成token
  147. const token = 'token_' + Date.now() + '_' + Math.random().toString(36).substr(2)
  148. return {
  149. code: 200,
  150. message: isNewUser ? '注册登录成功' : '登录成功',
  151. data: {
  152. token,
  153. user,
  154. isNewUser
  155. }
  156. }
  157. }
  158. // 检查登录状态
  159. export const checkLoginStatus = async (token) => {
  160. await delay(300) // 模拟网络延迟
  161. console.log('模拟API: 检查登录状态', { token })
  162. if (!token) {
  163. throw new Error('未登录')
  164. }
  165. // 简单的token验证(实际项目中应该更复杂)
  166. return {
  167. code: 200,
  168. message: '已登录',
  169. data: {
  170. valid: true
  171. }
  172. }
  173. }
  174. // 获取用户信息
  175. export const getUserInfo = async () => {
  176. await delay(400) // 模拟网络延迟
  177. console.log('模拟API: 获取用户信息')
  178. const token = uni.getStorageSync('userToken')
  179. if (!token) {
  180. throw new Error('未登录')
  181. }
  182. // 返回模拟用户信息
  183. return {
  184. code: 200,
  185. message: '获取成功',
  186. data: {
  187. id: 'user_' + Date.now(),
  188. phone: MOCK_PHONE_NUMBER,
  189. nickname: `用户${MOCK_PHONE_NUMBER.slice(-4)}`,
  190. avatar: '',
  191. registerTime: Date.now() - 30 * 24 * 60 * 60 * 1000, // 30天前注册
  192. lastLoginTime: Date.now()
  193. }
  194. }
  195. }