This commit is contained in:
2025-09-05 23:35:32 +08:00
parent dba965344a
commit 2b4a3b6f1b
7 changed files with 246 additions and 53 deletions
+96 -16
View File
@@ -2,7 +2,7 @@
<view class="profile-container page-container-unified">
<!-- 用户信息卡片 -->
<view class="user-info-card">
<view class="user-avatar-section" :class="{ 'logged-in': userInfo.nickName }" @click="handleUserAction">
<view class="user-avatar-section" :class="{ 'logged-in': isLoggedIn }" @click="handleUserAction">
<view class="avatar-wrapper">
<u-avatar
:src="userInfo.avatarUrl || ''"
@@ -13,19 +13,19 @@
color="white"
font-size="40"
></u-avatar>
<view class="online-status" v-if="userInfo.nickName">
<view class="online-status" v-if="isLoggedIn">
<view class="status-dot"></view>
</view>
<!-- 登录提示图标,仅在未登录时显示 -->
<view class="login-hint" v-if="!userInfo.nickName">
<view class="login-hint" v-if="!isLoggedIn">
<text class="hint-icon">👋</text>
</view>
</view>
</view>
<view class="user-info-section">
<view class="user-name">{{ userInfo.nickName || '点击头像登录' }}</view>
<view class="user-status">{{ userInfo.nickName ? '已登录' : '未登录' }}</view>
<view class="login-days" v-if="userInfo.nickName">已使用 {{ loginDays }} 天</view>
<view class="user-name">{{ isLoggedIn ? (userInfo.nickName || '用户') : '点击头像登录' }}</view>
<view class="user-status">{{ isLoggedIn ? '已登录' : '未登录' }}</view>
<view class="login-days" v-if="isLoggedIn">已使用 {{ loginDays }} 天</view>
</view>
</view>
@@ -143,7 +143,7 @@
<script>
import { reactive, ref, onMounted, computed } from 'vue'
import { uploadImage } from '@/http/api/common.js'
import { updateUserInfo } from '@/http/api/profile.js'
import { getUserInfo, getWxUserInfo, updateUserInfo } from '@/http/api/profile.js'
export default {
name: 'ProfilePage',
@@ -156,6 +156,11 @@ export default {
const loginDays = ref(0)
// 计算属性
const isLoggedIn = computed(() => {
return !!uni.getStorageSync('token')
})
@@ -182,12 +187,69 @@ export default {
// 方法定义
const initPage = () => {
loadUserInfo()
loadUserStats()
const token = uni.getStorageSync('token')
if (token) {
// 有token时加载用户信息和统计数据
loadUserInfo()
loadUserStats()
} else {
// 没有token时只加载本地缓存的用户信息(如果有)
const savedUserInfo = uni.getStorageSync('userInfo')
if (savedUserInfo) {
userInfo.value = savedUserInfo
}
}
}
const loadUserInfo = () => {
// 尝试从本地存储加载用户信息
const loadUserInfo = async () => {
const token = uni.getStorageSync('token')
if (!token) {
return
}
try {
// 优先获取微信用户信息
const wxUserInfo = await getWxUserInfo({
custom: {
loading: false,
toast: false
}
})
if (wxUserInfo) {
userInfo.value = wxUserInfo
// 同步到本地存储
uni.setStorageSync('userInfo', wxUserInfo)
uni.setStorageSync('wxUserInfo', wxUserInfo)
calculateLoginDays()
return
}
} catch (error) {
console.log('获取微信用户信息失败,尝试获取基本用户信息:', error)
// 微信用户信息获取失败,尝试获取基本用户信息
try {
const apiUserInfo = await getUserInfo({
custom: {
loading: false,
toast: false
}
})
if (apiUserInfo) {
userInfo.value = apiUserInfo
// 同步到本地存储
uni.setStorageSync('userInfo', apiUserInfo)
calculateLoginDays()
return
}
} catch (basicError) {
console.log('获取基本用户信息也失败,使用本地缓存:', basicError)
}
}
// API获取失败时,尝试从本地存储加载用户信息
const savedUserInfo = uni.getStorageSync('userInfo')
if (savedUserInfo) {
userInfo.value = savedUserInfo
@@ -267,9 +329,16 @@ export default {
})
}
const handleUserAction = () => {
// 直接跳转到个人信息设置,如果需要登录会在API调用时自动处理
navigateTo('/pages/profile/user-info')
const handleUserAction = async () => {
const token = uni.getStorageSync('token')
if (token) {
// 有token,直接跳转到个人信息设置
navigateTo('/pages/profile/user-info')
} else {
// 没有token,跳转到登录页面
navigateTo('/pages/login/login')
}
}
// 统一的页面导航方法
@@ -323,11 +392,13 @@ export default {
// 刷新页面数据
const refreshData = () => {
// 只刷新统计数据,用户信息在initPage时已加载
loadUserStats()
}
// 页面显示时刷新数据
const onShow = () => {
// 只刷新数据,不重复调用loadUserInfo
refreshData()
}
@@ -365,6 +436,7 @@ export default {
return {
userInfo,
loginDays,
isLoggedIn,
petStats,
familyStats,
adoptionStats,
@@ -384,11 +456,19 @@ export default {
// 页面生命周期
onShow() {
this.onShow()
// 重新检查登录状态并刷新数据
const token = uni.getStorageSync('token')
if (token) {
// 有token时总是重新获取最新用户信息
this.loadUserInfo()
}
this.refreshData()
},
onPullDownRefresh() {
this.onPullDownRefresh()
this.refreshData()
uni.stopPullDownRefresh()
}
}
</script>