hookehuyr

refactor(auth): 将用户信息构建逻辑提取到单独的可组合函数中

......@@ -10,24 +10,20 @@ import { ref } from 'vue'
import { getUserInfoAPI } from '@/api/users'
/**
* @function useUserInfo
* @description 提供用户信息获取功能
* @returns {Object} 包含用户信息状态和方法的对象
*/
export function useUserInfo() {
// 用户信息状态
const userInfo = ref(null)
const loading = ref(false)
const error = ref(null)
/**
* 从数据中提取未读消息数量
* 构建当前用户对象
* @param {Object} data - 包含用户信息的响应数据
* @returns {number|null} 未读消息数量,或 null 如果无法提取
* @returns {Object|null} 合并后的当前用户对象,或 null 如果无法构建
*/
const get_unread_msg_count = (data) => {
const candidates = [
export const build_current_user = (data) => {
if (!data || typeof data !== 'object') return null
const merged_user = {
...(data.user && typeof data.user === 'object' ? data.user : {}),
...(data.checkin && typeof data.checkin === 'object' ? data.checkin : {}),
}
const unread_candidates = [
data?.unread_msg_count,
data?.user?.unread_msg_count,
data?.user?.unread,
......@@ -35,32 +31,51 @@ export function useUserInfo() {
data?.unread,
]
for (const value of candidates) {
for (const value of unread_candidates) {
const num = Number(value)
if (Number.isFinite(num)) return num
if (Number.isFinite(num)) {
merged_user.unread_msg_count = num
break
}
return null
}
const get_is_teacher = (data) => {
const candidates = [
const teacher_candidates = [
data?.is_teacher,
data?.user?.is_teacher,
data?.user?.teacher,
]
for (const value of candidates) {
for (const value of teacher_candidates) {
if (value === null || value === undefined) continue
if (value === true || value === 'true') return 1
if (value === false || value === 'false') return 0
if (value === true || value === 'true') {
merged_user.is_teacher = 1
break
}
if (value === false || value === 'false') {
merged_user.is_teacher = 0
break
}
const num = Number(value)
if (Number.isFinite(num)) return num ? 1 : 0
if (Number.isFinite(num)) {
merged_user.is_teacher = num ? 1 : 0
break
}
return null
}
return merged_user
}
/**
* @function useUserInfo
* @description 提供用户信息获取功能
* @returns {Object} 包含用户信息状态和方法的对象
*/
export function useUserInfo() {
// 用户信息状态
const userInfo = ref(null)
const loading = ref(false)
const error = ref(null)
/**
* 刷新用户信息
* @returns {Promise<Object>} 用户信息对象
......@@ -75,24 +90,12 @@ export function useUserInfo() {
if (code === 1) {
userInfo.value = data
// 合并用户和打卡数据
const mergedUser = {
...data.user,
...data.checkin
}
const unread = get_unread_msg_count(data)
if (unread !== null) {
mergedUser.unread_msg_count = unread
}
const is_teacher = get_is_teacher(data)
if (is_teacher !== null) {
mergedUser.is_teacher = is_teacher
}
const mergedUser = build_current_user(data)
// 更新本地存储
if (mergedUser) {
localStorage.setItem('currentUser', JSON.stringify(mergedUser))
}
loading.value = false
return mergedUser
......
......@@ -12,6 +12,7 @@ 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 { build_current_user } from '@/composables/useUserInfo'
// 创建认证上下文的Symbol key,用于provide/inject依赖注入
// 使用Symbol确保key的唯一性,避免命名冲突
......@@ -31,41 +32,6 @@ 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
}
const get_is_teacher = (data) => {
const candidates = [
data?.is_teacher,
data?.user?.is_teacher,
data?.user?.teacher,
]
for (const value of candidates) {
if (value === null || value === undefined) continue
if (value === true || value === 'true') return 1
if (value === false || value === 'false') return 0
const num = Number(value)
if (Number.isFinite(num)) return num ? 1 : 0
}
return null
}
/**
* 检查登录token是否过期
* @returns {boolean} true表示token有效,false表示token已过期
......@@ -101,15 +67,10 @@ export function provideAuth() {
// 从服务器获取用户信息并更新本地存储
const { code, data } = await getUserInfoAPI();
if (code === 1) {
const unread = get_unread_msg_count(data)
const is_teacher = get_is_teacher(data)
currentUser.value = {
...data.user,
...data.checkin,
...(unread !== null ? { unread_msg_count: unread } : {}),
...(is_teacher !== null ? { is_teacher } : {}),
}
currentUser.value = build_current_user(data)
if (currentUser.value) {
localStorage.setItem('currentUser', JSON.stringify(currentUser.value))
}
// 重新设置认证头
const userInfo = getUserInfoFromStorage()
if (userInfo && userInfo.user_id && userInfo.HTTP_USER_TOKEN) {
......@@ -138,14 +99,7 @@ export function provideAuth() {
try {
const userRes = await getUserInfoAPI();
if (userRes.code === 1) {
const unread = get_unread_msg_count(userRes.data)
const is_teacher = get_is_teacher(userRes.data)
currentUser.value = {
...userRes.data.user,
...userRes.data.checkin,
...(unread !== null ? { unread_msg_count: unread } : {}),
...(is_teacher !== null ? { is_teacher } : {}),
}
currentUser.value = build_current_user(userRes.data)
} else {
currentUser.value = { ...data.user, ...data.checkin }
}
......@@ -154,10 +108,12 @@ export function provideAuth() {
currentUser.value = { ...data.user, ...data.checkin }
}
if (currentUser.value) {
localStorage.setItem('currentUser', JSON.stringify(currentUser.value))
}
}
}
}
// 初始化完成,关闭加载状态
loading.value = false
})
......