hookehuyr

refactor(用户信息): 重构用户信息获取逻辑,使用组合式函数替代直接API调用

将直接调用getUserInfoAPI改为使用useUserInfo组合式函数,统一用户信息获取逻辑
移除重复的图片错误处理代码,使用useImageLoader组合式函数
......@@ -43,15 +43,16 @@ import { ref, computed, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useAuth } from '@/contexts/auth'
import { showToast } from 'vant'
import { getUserInfoAPI } from '@/api/users'
import { useUserInfo } from '@/composables/useUserInfo'
const route = useRoute()
const router = useRouter()
const { currentUser } = useAuth()
const { getUserInfoFromLocal } = useUserInfo()
/**
* @var {import('vue').Ref<number>} unread_msg_count
* @description 未读消息数量,来源于 getUserInfoAPI() 的返回值;用于控制“我的”图标右上角红点显示
* @description 未读消息数量,来源于 getUserInfoAPI() 的返回值;用于控制"我的"图标右上角红点显示
*/
const unread_msg_count = ref(0)
......@@ -62,9 +63,9 @@ const unread_msg_count = ref(0)
*/
async function load_unread_msg_count() {
try {
const { code, data } = await getUserInfoAPI()
if (code === 1) {
unread_msg_count.value = +data.unread_msg_count || 0
const userInfo = getUserInfoFromLocal()
if (userInfo) {
unread_msg_count.value = +userInfo.unread_msg_count || 0
} else {
unread_msg_count.value = 0
}
......
......@@ -141,13 +141,20 @@ import { useAuth } from "@/contexts/auth";
import CheckInDialog from "@/components/ui/CheckInDialog.vue";
import { getUserInfoAPI } from "@/api/users";
import { showToast } from "vant";
import { useTitle } from "@vueuse/core";
import { useImageLoader } from "@/composables/useImageLoader";
import { useUserInfo } from "@/composables/useUserInfo";
const router = useRouter();
const $route = useRoute();
useTitle($route.meta.title);
// 图片加载错误处理
const { handleImageError } = useImageLoader()
// 用户信息获取
const { userInfo, refreshUserInfo } = useUserInfo()
const profile = ref({});
const checkIns = ref({});
const isTeacher = ref(false);
......@@ -158,18 +165,19 @@ const formatCheckInCount = (count) => {
};
onMounted(async () => {
const { code, data } = await getUserInfoAPI();
if (code === 1) {
profile.value = data.user;
checkIns.value = data.checkin;
checkIns.value.total_days = data.checkin.total_days || 0
checkIns.value.consecutive_days = data.checkin.consecutive_days || 0
checkIns.value.longest_consecutive_days = data.checkin.longest_consecutive_days || 0
isTeacher.value = data.is_teacher;
const userData = await refreshUserInfo();
if (userData) {
profile.value = userData;
checkIns.value = {
total_days: userData.total_days || 0,
consecutive_days: userData.consecutive_days || 0,
longest_consecutive_days: userData.longest_consecutive_days || 0
};
isTeacher.value = userData.is_teacher;
// 处理消息中心的未读消息数量
menuItems2.value.forEach(item => {
if (item.path === '/profile/messages') {
item.badge = +data.unread_msg_count || 0;
item.badge = +(userData?.unread_msg_count || 0);
}
});
}
......@@ -217,12 +225,6 @@ const handleMenuClick = (path) => {
}
};
// Handle image error
const handleImageError = (e) => {
e.target.onerror = null;
e.target.src = "https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg";
};
// Handle check-in type click
const handleCheckInClick = (path) => {
router.push(path);
......