hookehuyr

feat(用户信息): 添加未读消息数量提取功能并优化显示逻辑

在多个模块中添加统一的未读消息数量提取函数,支持从不同字段获取未读数量
优化底部导航栏的未读消息显示逻辑,改为计算属性方式
移除冗余代码并更新用户信息处理逻辑
......@@ -39,10 +39,9 @@
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useAuth } from '@/contexts/auth'
import { showToast } from 'vant'
import { useUserInfo } from '@/composables/useUserInfo'
const route = useRoute()
......@@ -50,32 +49,10 @@ const router = useRouter()
const { currentUser } = useAuth()
const { getUserInfoFromLocal } = useUserInfo()
/**
* @var {import('vue').Ref<number>} unread_msg_count
* @description 未读消息数量,来源于 getUserInfoAPI() 的返回值;用于控制"我的"图标右上角红点显示
*/
const unread_msg_count = ref(0)
/**
* @function load_unread_msg_count
* @description 拉取用户信息,提取未读消息数量;未登录或接口失败时默认为 0
* @returns {Promise<void>}
*/
async function load_unread_msg_count() {
try {
const userInfo = getUserInfoFromLocal()
if (userInfo) {
unread_msg_count.value = +userInfo.unread_msg_count || 0
} else {
unread_msg_count.value = 0
}
} catch (e) {
unread_msg_count.value = 0
}
}
onMounted(() => {
load_unread_msg_count()
const unread_msg_count = computed(() => {
const userInfo = currentUser.value || getUserInfoFromLocal()
const count = Number(userInfo?.unread_msg_count || 0)
return Number.isFinite(count) ? count : 0
})
const navItems = [
......
......@@ -21,6 +21,29 @@ export function useUserInfo() {
const error = ref(null)
/**
* 从数据中提取未读消息数量
* @param {Object} data - 包含用户信息的响应数据
* @returns {number|null} 未读消息数量,或 null 如果无法提取
*/
const get_unread_msg_count = (data) => {
const candidates = [
data?.unread_msg_count,
data?.user?.unread_msg_count,
data?.user?.unread,
data?.unread_msg,
data?.unread,
]
for (const value of candidates) {
const num = Number(value)
if (Number.isFinite(num)) return num
}
return null
}
/**
* 刷新用户信息
* @returns {Promise<Object>} 用户信息对象
* @throws {Error} 获取失败时抛出错误
......@@ -40,6 +63,11 @@ export function useUserInfo() {
...data.checkin
}
const unread = get_unread_msg_count(data)
if (unread !== null) {
mergedUser.unread_msg_count = unread
}
// 更新本地存储
localStorage.setItem('currentUser', JSON.stringify(mergedUser))
......
/*
* @Date: 2025-03-20 21:11:31
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-18 11:17:16
* @LastEditTime: 2026-01-18 22:32:53
* @FilePath: /mlaj/src/contexts/auth.js
* @Description: 认证上下文管理模块,提供用户认证状态管理、登录登出功能
*/
......@@ -12,7 +12,6 @@ import { logoutAPI, getUserInfoAPI } from '@/api/users'
import { getAuthInfoAPI } from '@/api/auth'
import { clearAuthHeaders, setAuthHeaders } from '@/utils/axios'
import { applyUserInfoAuth, getUserInfoFromStorage, removeUserInfoFromStorage } from '@/utils/auth_user_info'
import { ONE_DAY_MS } from '@/common/constants'
// 创建认证上下文的Symbol key,用于provide/inject依赖注入
// 使用Symbol确保key的唯一性,避免命名冲突
......@@ -32,6 +31,23 @@ export function provideAuth() {
// 加载状态标志,用于控制加载动画等UI展示
const loading = ref(true)
const get_unread_msg_count = (data) => {
const candidates = [
data?.unread_msg_count,
data?.user?.unread_msg_count,
data?.user?.unread,
data?.unread_msg,
data?.unread,
]
for (const value of candidates) {
const num = Number(value)
if (Number.isFinite(num)) return num
}
return null
}
/**
* 检查登录token是否过期
* @returns {boolean} true表示token有效,false表示token已过期
......@@ -67,7 +83,12 @@ export function provideAuth() {
// 从服务器获取用户信息并更新本地存储
const { code, data } = await getUserInfoAPI();
if (code === 1) {
currentUser.value = { ...data.user, ...data.checkin }
const unread = get_unread_msg_count(data)
currentUser.value = {
...data.user,
...data.checkin,
...(unread !== null ? { unread_msg_count: unread } : {}),
}
localStorage.setItem('currentUser', JSON.stringify(currentUser.value))
// 重新设置认证头
const userInfo = getUserInfoFromStorage()
......@@ -97,7 +118,12 @@ export function provideAuth() {
try {
const userRes = await getUserInfoAPI();
if (userRes.code === 1) {
currentUser.value = { ...userRes.data.user, ...userRes.data.checkin }
const unread = get_unread_msg_count(userRes.data)
currentUser.value = {
...userRes.data.user,
...userRes.data.checkin,
...(unread !== null ? { unread_msg_count: unread } : {}),
}
} else {
currentUser.value = { ...data.user, ...data.checkin }
}
......