This commit is contained in:
2025-09-05 22:43:39 +08:00
parent 913c2ba036
commit dba965344a
9 changed files with 432 additions and 396 deletions
+148 -8
View File
@@ -17,6 +17,7 @@ export const STORAGE_KEYS = {
LOGIN_STEP: 'loginStep',
WX_LOGIN_CODE: 'wxLoginCode',
TOKEN: 'token',
REFRESH_TOKEN: 'refreshToken',
PHONE_NUMBER: 'phoneNumber',
WX_USER_INFO: 'wxUserInfo',
USER_INFO: 'userInfo',
@@ -97,17 +98,21 @@ export const saveWxLoginData = (loginData) => {
* @param {Object} phoneData 手机号数据
*/
export const savePhoneAuthData = (phoneData) => {
const { token, userInfo } = phoneData
const { token, refreshToken, userInfo } = phoneData
if (token) {
uni.setStorageSync(STORAGE_KEYS.TOKEN, token)
}
if (refreshToken) {
uni.setStorageSync(STORAGE_KEYS.REFRESH_TOKEN, refreshToken)
}
if (userInfo) {
if (userInfo.phoneNumber) {
uni.setStorageSync(STORAGE_KEYS.PHONE_NUMBER, userInfo.phoneNumber)
}
// 保存微信用户信息供后续使用
const wxUserInfo = {
phoneNumber: userInfo.phoneNumber || '',
@@ -116,10 +121,17 @@ export const savePhoneAuthData = (phoneData) => {
avatarUrl: userInfo.avatarUrl || ''
}
uni.setStorageSync(STORAGE_KEYS.WX_USER_INFO, wxUserInfo)
uni.setStorageSync(STORAGE_KEYS.USER_INFO, userInfo)
}
setLoginStep(LOGIN_STEPS.PHONE_AUTHED)
console.log('保存手机号授权数据:', { token: !!token, userInfo: !!userInfo })
// 根据用户信息完善状态设置登录步骤
if (userInfo && userInfo.profileCompleted) {
setLoginStep(LOGIN_STEPS.PROFILE_COMPLETED)
} else {
setLoginStep(LOGIN_STEPS.PHONE_AUTHED)
}
console.log('保存手机号授权数据:', { token: !!token, refreshToken: !!refreshToken, userInfo: !!userInfo })
}
/**
@@ -151,6 +163,133 @@ export const clearTempLoginData = () => {
console.log('清理临时登录数据')
}
/**
* 检查并验证token有效性
* @returns {Promise<boolean>} token是否有效
*/
export const validateToken = async () => {
const token = uni.getStorageSync(STORAGE_KEYS.TOKEN)
if (!token) {
return false
}
try {
// 调用一个简单的API来验证token
const { getUserInfo } = await import('@/http/api/profile.js')
await getUserInfo({
custom: {
loading: false,
toast: false
}
})
return true
} catch (error) {
console.log('Token验证失败:', error)
return false
}
}
/**
* 尝试刷新token
* @returns {Promise<boolean>} 是否刷新成功
*/
export const tryRefreshToken = async () => {
const refreshToken = uni.getStorageSync(STORAGE_KEYS.REFRESH_TOKEN)
if (!refreshToken) {
return false
}
try {
const { refreshToken: refreshTokenApi } = await import('@/http/api/auth.js')
const result = await refreshTokenApi({
custom: {
loading: false,
toast: false
}
})
if (result && result.token) {
uni.setStorageSync(STORAGE_KEYS.TOKEN, result.token)
if (result.refreshToken) {
uni.setStorageSync(STORAGE_KEYS.REFRESH_TOKEN, result.refreshToken)
}
console.log('Token刷新成功')
return true
}
return false
} catch (error) {
console.log('Token刷新失败:', error)
return false
}
}
/**
* 自动登录(用于用户再次进入小程序)
* @returns {Promise<boolean>} 是否登录成功
*/
export const autoLogin = async () => {
console.log('开始自动登录检查')
// 1. 检查token有效性
if (await validateToken()) {
console.log('Token有效,自动登录成功')
return true
}
// 2. 尝试刷新token
if (await tryRefreshToken()) {
console.log('Token刷新成功,自动登录成功')
return true
}
// 3. 尝试使用微信code重新登录(不需要手机号授权)
try {
const loginRes = await new Promise((resolve, reject) => {
uni.login({
success: resolve,
fail: reject
})
})
if (loginRes.code) {
const { wxLogin } = await import('@/http/api/auth.js')
const result = await wxLogin({
code: loginRes.code
}, {
custom: {
loading: false,
toast: false
}
})
if (result && result.token) {
// 保存新的登录信息
uni.setStorageSync(STORAGE_KEYS.TOKEN, result.token)
if (result.refreshToken) {
uni.setStorageSync(STORAGE_KEYS.REFRESH_TOKEN, result.refreshToken)
}
if (result.userInfo) {
uni.setStorageSync(STORAGE_KEYS.WX_USER_INFO, result.userInfo)
uni.setStorageSync(STORAGE_KEYS.USER_INFO, result.userInfo)
// 如果用户已完善过信息,设置为已完成状态
if (result.userInfo.profileCompleted) {
setLoginStep(LOGIN_STEPS.PROFILE_COMPLETED)
} else {
setLoginStep(LOGIN_STEPS.PHONE_AUTHED)
}
}
console.log('微信code登录成功,自动登录成功')
return true
}
}
} catch (error) {
console.log('微信code登录失败:', error)
}
console.log('自动登录失败,需要用户手动登录')
return false
}
/**
* 完全重置登录状态(用于登出)
*/
@@ -158,11 +297,12 @@ export const resetLoginState = () => {
uni.removeStorageSync(STORAGE_KEYS.LOGIN_STEP)
uni.removeStorageSync(STORAGE_KEYS.WX_LOGIN_CODE)
uni.removeStorageSync(STORAGE_KEYS.TOKEN)
uni.removeStorageSync(STORAGE_KEYS.REFRESH_TOKEN)
uni.removeStorageSync(STORAGE_KEYS.PHONE_NUMBER)
uni.removeStorageSync(STORAGE_KEYS.WX_USER_INFO)
uni.removeStorageSync(STORAGE_KEYS.USER_INFO)
uni.removeStorageSync(STORAGE_KEYS.LOGIN_DATE)
console.log('重置登录状态')
}