healthapp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

71 lines
2.0 KiB

// 认证模块 API
import { post } from './request'
import { setToken, setRefreshToken, clearTokens, ApiResponse } from './config'
import type { User } from '../types'
export interface LoginRequest {
phone: string
password?: string // 密码登录
code?: string // 验证码登录
}
export interface RegisterRequest {
phone: string
password: string
code: string
}
// 后端实际返回的响应结构
export interface AuthResponse {
token: string // JWT Token 直接字符串
user_id: number
nickname: string
avatar: string
survey_completed: boolean
}
// 发送验证码
export async function sendCode(phone: string, type: 'login' | 'register' = 'login') {
return post<null>('/auth/send-code', { phone, type })
}
// 用户登录(支持密码或验证码)
export async function login(data: LoginRequest): Promise<ApiResponse<AuthResponse>> {
// 如果只传了code,将code作为password发送(验证码登录模式)
const loginData = {
phone: data.phone,
password: data.password || data.code, // 验证码登录时,code作为password
}
console.log('[Login] 请求数据:', JSON.stringify(loginData))
const result = await post<AuthResponse>('/auth/login', loginData)
console.log('[Login] 响应结果:', JSON.stringify(result))
// 后端直接返回 token 字符串,不是对象
if (result.code === 0 && result.data?.token) {
console.log('[Login] 准备保存Token:', result.data.token.substring(0, 30) + '...')
await setToken(result.data.token)
console.log('[Login] Token已保存')
}
return result
}
// 用户注册
export async function register(data: RegisterRequest): Promise<ApiResponse<AuthResponse>> {
const result = await post<AuthResponse>('/auth/register', data)
// 后端直接返回 token 字符串
if (result.code === 0 && result.data?.token) {
await setToken(result.data.token)
}
return result
}
// 退出登录
export async function logout() {
await clearTokens()
}