feat(user): 登录后获取用户信息、App启动刷新、我的页面下拉刷新

- 用户store新增fetchUserInfo action,调用/userInfo接口获取完整用户信息
- 登录页修复:LoginResponse只有token和userId,登录成功后调用fetchUserInfo获取资料
- App.vue启动时若已登录自动刷新用户信息
- 我的页面onShow时刷新用户信息,新增下拉刷新支持
- pages.json为我的页面启用enablePullDownRefresh
This commit is contained in:
zpc 2026-02-20 22:56:47 +08:00
parent d35fbe319a
commit ddf1a092b1
6 changed files with 64 additions and 21 deletions

View File

@ -12,6 +12,11 @@
//
const userStore = useUserStore()
userStore.restoreFromStorage()
//
if (userStore.isLoggedIn) {
userStore.fetchUserInfo()
}
},
onShow: function() {
console.log('App Show')

View File

@ -4,6 +4,14 @@
import { get, post } from './request'
/**
* 获取当前登录用户信息
* @returns {Promise<Object>} 用户信息
*/
export function getUserInfo() {
return get('/userInfo')
}
/**
* 获取用户详情
*/

View File

@ -19,7 +19,8 @@
"path": "pages/mine/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "我的"
"navigationBarTitleText": "我的",
"enablePullDownRefresh": true
}
},
{

View File

@ -129,30 +129,26 @@ async function handleGetPhoneNumber(e) {
uni.hideLoading()
if (res && res.code === 0 && res.data) {
// refreshToken
// LoginResponse token userId
userStore.login({
token: res.data.token,
refreshToken: res.data.refreshToken,
userInfo: {
userId: res.data.userId,
uid: res.data.uid,
nickname: res.data.nickname,
avatar: res.data.avatar,
phone: res.data.phone,
userLevel: res.data.userLevel || 1
userId: res.data.userId
}
})
//
await userStore.fetchUserInfo()
uni.showToast({ title: '登录成功', icon: 'success' })
//
setTimeout(() => {
if (redirectUrl.value) {
//
uni.redirectTo({
url: redirectUrl.value,
fail: () => {
// tabBar 使 switchTab
uni.switchTab({
url: redirectUrl.value,
fail: () => {
@ -162,7 +158,6 @@ async function handleGetPhoneNumber(e) {
}
})
} else {
//
uni.navigateBack()
}
}, 1000)
@ -216,20 +211,18 @@ async function handleLogin() {
uni.hideLoading()
if (res && res.code === 0 && res.data) {
// refreshToken
// LoginResponse token userId
userStore.login({
token: res.data.token,
refreshToken: res.data.refreshToken,
userInfo: {
userId: res.data.userId,
uid: res.data.uid,
nickname: res.data.nickname,
avatar: res.data.avatar,
phone: res.data.phone,
userLevel: res.data.userLevel || 1
userId: res.data.userId
}
})
//
await userStore.fetchUserInfo()
uni.showToast({ title: '登录成功', icon: 'success' })
//

View File

@ -106,7 +106,7 @@
* 展示用户信息和功能入口
*/
import { ref, computed, onMounted } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import { onShow, onPullDownRefresh } from '@dcloudio/uni-app'
import { useUserStore } from '@/store/user.js'
import { useNavbar } from '@/composables/useNavbar.js'
@ -249,10 +249,22 @@ function handleLogout() {
}
/**
* 页面显示时恢复用户状态
* 页面显示时刷新用户信息
*/
onShow(() => {
userStore.restoreFromStorage()
if (userStore.isLoggedIn) {
userStore.fetchUserInfo()
}
})
/**
* 下拉刷新
*/
onPullDownRefresh(async () => {
if (userStore.isLoggedIn) {
await userStore.fetchUserInfo()
}
uni.stopPullDownRefresh()
})
/**

View File

@ -8,6 +8,7 @@ import {
getRefreshToken, setRefreshToken, removeRefreshToken,
getUserInfo, setUserInfo, removeUserInfo
} from '../utils/storage.js'
import { getUserInfo as fetchUserInfoApi } from '../api/user.js'
/** 用户等级常量 */
export const USER_LEVEL = {
@ -111,6 +112,29 @@ export const useUserStore = defineStore('user', {
})
},
/**
* 从服务器获取用户信息
* 登录后App启动时下拉刷新时调用
*/
async fetchUserInfo() {
try {
const res = await fetchUserInfoApi()
if (res && res.code === 0 && res.data) {
const d = res.data
this.updateUserInfo({
userId: d.Id ?? d.id,
uid: d.Uid ?? d.uid,
nickname: d.Nickname ?? d.nickname,
avatar: d.Headimg ?? d.headimg,
phone: d.Mobile ?? d.mobile,
userLevel: d.Vip ?? d.vip ?? USER_LEVEL.NORMAL
})
}
} catch (e) {
console.warn('获取用户信息失败:', e)
}
},
/**
* 从存储恢复用户状态
*/