123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- /**
- * 认证相关API接口(小程序版本 - 使用模拟数据)
- */
- // 模拟用户数据库
- const users = new Map()
- // 模拟验证码存储 (phone -> {code, expireTime})
- const smsCodes = new Map()
- // 模拟本机号码(实际开发中应该通过运营商API获取)
- const MOCK_PHONE_NUMBER = '18138887353'
- // 生成6位随机验证码
- function generateSmsCode() {
- return Math.random().toString().substr(2, 6)
- }
- // 验证手机号格式
- function validatePhone(phone) {
- const phoneRegex = /^1[3-9]\d{9}$/
- return phoneRegex.test(phone)
- }
- // 检查验证码是否有效
- function isValidSmsCode(phone, code) {
- const smsData = smsCodes.get(phone)
- if (!smsData) return false
-
- const now = Date.now()
- const expired = now > smsData.expireTime
-
- if (expired) {
- smsCodes.delete(phone)
- return false
- }
-
- return smsData.code === code
- }
- // 模拟网络延迟
- const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))
- // 获取本机号码
- export const getPhoneNumber = async () => {
- await delay(500) // 模拟网络延迟
-
- console.log('模拟API: 获取本机号码')
-
- return {
- code: 200,
- message: '获取成功',
- data: {
- phone: MOCK_PHONE_NUMBER,
- maskedPhone: `${MOCK_PHONE_NUMBER.slice(0, 3)}****${MOCK_PHONE_NUMBER.slice(-4)}`
- }
- }
- }
- // 发送验证码
- export const sendSmsCode = async (phone) => {
- await delay(800) // 模拟网络延迟
-
- console.log('模拟API: 发送验证码', { phone })
-
- // 验证手机号格式
- if (!validatePhone(phone)) {
- throw new Error('手机格式不正确')
- }
-
- // 生成验证码
- const code = generateSmsCode()
- const expireTime = Date.now() + 10 * 60 * 1000 // 10分钟有效期
-
- // 存储验证码
- smsCodes.set(phone, { code, expireTime })
-
- console.log(`模拟API: 验证码已发送到 ${phone}: ${code}`)
-
- return {
- code: 200,
- message: '验证码发送成功',
- data: {
- phone,
- // 开发阶段返回验证码,生产环境不应返回
- debugCode: code
- }
- }
- }
- // 验证码登录
- export const smsLogin = async (phone, code) => {
- await delay(1000) // 模拟网络延迟
-
- console.log('模拟API: 验证码登录', { phone, code })
-
- // 验证手机号格式
- if (!validatePhone(phone)) {
- throw new Error('手机格式不正确')
- }
-
- // 验证验证码
- if (!isValidSmsCode(phone, code)) {
- throw new Error('验证码错误')
- }
-
- // 检查用户是否存在
- let user = users.get(phone)
- const isNewUser = !user
-
- if (isNewUser) {
- // 新用户自动注册
- user = {
- id: 'user_' + Date.now(),
- phone,
- nickname: `用户${phone.slice(-4)}`,
- avatar: '',
- registerTime: Date.now(),
- lastLoginTime: Date.now()
- }
- users.set(phone, user)
- console.log('模拟API: 新用户注册', user)
- } else {
- // 老用户更新最近登录时间
- user.lastLoginTime = Date.now()
- users.set(phone, user)
- console.log('模拟API: 老用户登录', user)
- }
-
- // 清除使用过的验证码
- smsCodes.delete(phone)
-
- // 生成token
- const token = 'token_' + Date.now() + '_' + Math.random().toString(36).substr(2)
-
- return {
- code: 200,
- message: isNewUser ? '注册登录成功' : '登录成功',
- data: {
- token,
- user,
- isNewUser
- }
- }
- }
- // 一键登录
- export const oneClickLogin = async (phone) => {
- await delay(1200) // 模拟网络延迟
-
- console.log('模拟API: 一键登录', { phone })
-
- // 验证手机号格式
- if (!validatePhone(phone)) {
- throw new Error('手机格式不正确')
- }
-
- // 检查用户是否存在
- let user = users.get(phone)
- const isNewUser = !user
-
- if (isNewUser) {
- // 新用户自动注册
- user = {
- id: 'user_' + Date.now(),
- phone,
- nickname: `用户${phone.slice(-4)}`,
- avatar: '',
- registerTime: Date.now(),
- lastLoginTime: Date.now()
- }
- users.set(phone, user)
- console.log('模拟API: 一键登录新用户注册', user)
- } else {
- // 老用户更新最近登录时间
- user.lastLoginTime = Date.now()
- users.set(phone, user)
- console.log('模拟API: 一键登录老用户', user)
- }
-
- // 生成token
- const token = 'token_' + Date.now() + '_' + Math.random().toString(36).substr(2)
-
- return {
- code: 200,
- message: isNewUser ? '注册登录成功' : '登录成功',
- data: {
- token,
- user,
- isNewUser
- }
- }
- }
- // 检查登录状态
- export const checkLoginStatus = async (token) => {
- await delay(300) // 模拟网络延迟
-
- console.log('模拟API: 检查登录状态', { token })
-
- if (!token) {
- throw new Error('未登录')
- }
-
- // 简单的token验证(实际项目中应该更复杂)
- return {
- code: 200,
- message: '已登录',
- data: {
- valid: true
- }
- }
- }
- // 获取用户信息
- export const getUserInfo = async () => {
- await delay(400) // 模拟网络延迟
-
- console.log('模拟API: 获取用户信息')
-
- const token = uni.getStorageSync('userToken')
- if (!token) {
- throw new Error('未登录')
- }
-
- // 返回模拟用户信息
- return {
- code: 200,
- message: '获取成功',
- data: {
- id: 'user_' + Date.now(),
- phone: MOCK_PHONE_NUMBER,
- nickname: `用户${MOCK_PHONE_NUMBER.slice(-4)}`,
- avatar: '',
- registerTime: Date.now() - 30 * 24 * 60 * 60 * 1000, // 30天前注册
- lastLoginTime: Date.now()
- }
- }
- }
|