46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import http, { clearToken, getToken, setToken } from '../request'
|
||
|
||
export { getToken }
|
||
|
||
export interface LoginResult {
|
||
accessToken: string
|
||
isNewUser: boolean // 首次登录(未设资料)为 true,前端需引导补填头像/姓名
|
||
nickname: string | null
|
||
avatar: string | null
|
||
}
|
||
|
||
/**
|
||
* 登录:把 wx.login() 的 code 交给后端,后端用 code2Session 换 openid,
|
||
* 自动注册/续登并签发 accessToken(个人主体无需手机号)。
|
||
* 返回 isNewUser 供前端判断是否需补全资料。
|
||
*/
|
||
export async function login(code: string): Promise<LoginResult> {
|
||
const data = await http.post<LoginResult>('/api/auth/login', { code }, { auth: false })
|
||
if (data?.accessToken) {
|
||
setToken(data.accessToken)
|
||
}
|
||
return data
|
||
}
|
||
|
||
/**
|
||
* 首次注册:用 registerTicket + wx.getPhoneNumber 的 code 验证手机号,完成后自动登录
|
||
*/
|
||
export async function registerWithPhone(
|
||
registerTicket: string,
|
||
phoneCode: string,
|
||
profile?: { nickname?: string; avatar?: string },
|
||
): Promise<{ accessToken: string }> {
|
||
const data = await http.post<{ accessToken: string }>(
|
||
'/api/auth/register',
|
||
{ registerTicket, phoneCode, ...profile },
|
||
{ auth: false },
|
||
)
|
||
setToken(data.accessToken)
|
||
return data
|
||
}
|
||
|
||
/** 登出:仅清除本地 token(后端 JWT 无状态,无需撤销) */
|
||
export function logout(): void {
|
||
clearToken()
|
||
}
|