1
This commit is contained in:
+148
-8
@@ -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('重置登录状态')
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user