hookehuyr

fix(user): 修复冷启动时接口抢在登录态前请求的竞态问题

- 新增 waitForLoginStatusReady 方法供外部等待登录态就绪
- checkLoginStatus 使用 Promise 缓存避免并发重复调用
- 首页 fetchHotArticles 调用前等待登录态初始化完成
- 清除首页残留的导航栏标题配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
/*
* @Date: 2025-06-28 10:33:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2026-01-30 10:07:28
* @LastEditTime: 2026-05-28 17:28:54
* @FilePath: /manulife-weapp/src/app.config.js
* @Description: 小程序配置文件
*/
......@@ -57,7 +57,7 @@ export default {
window: {
backgroundTextStyle: 'light',
navigationBarBackgroundColor: '#fff',
navigationBarTitleText: '西园寺预约',
navigationBarTitleText: '',
navigationBarTextStyle: 'black',
},
// 开发环境开启调试模式
......
......@@ -355,6 +355,10 @@ const hotArticlesLoading = ref(false);
const fetchHotArticles = async () => {
try {
hotArticlesLoading.value = true;
// 冷启动时先等登录态初始化完成,避免 week_hot 抢在 session 建立前发出请求
await userStore.waitForLoginStatusReady();
const res = await weekHotAPI({
page: 0,
limit: 10
......
......@@ -29,9 +29,15 @@ export const useUserStore = defineStore('user', () => {
/** 加载状态 */
const loading = ref(false)
/** 登录态是否已经完成过首次检查 */
const loginStatusChecked = ref(false)
/** 上次获取用户信息的时间戳(用于防抖) */
let lastFetchTime = 0
/** 进行中的登录态检查 Promise,用于并发复用 */
let loginStatusPromise = null
/** 防抖时间间隔(毫秒) */
const FETCH_DEBOUNCE_TIME = 5000
......@@ -48,6 +54,11 @@ export const useUserStore = defineStore('user', () => {
* await userStore.checkLoginStatus()
*/
async function checkLoginStatus() {
if (loginStatusPromise) {
return loginStatusPromise
}
loginStatusPromise = (async () => {
loading.value = true
try {
......@@ -83,6 +94,27 @@ export const useUserStore = defineStore('user', () => {
throw err
} finally {
loading.value = false
loginStatusChecked.value = true
loginStatusPromise = null
}
})()
return loginStatusPromise
}
/**
* 等待登录态初始化完成
* @description 冷启动时复用 App.onLaunch 的登录态检查,避免页面抢跑请求
* @returns {Promise<void>}
*/
async function waitForLoginStatusReady() {
if (loginStatusPromise) {
await loginStatusPromise
return
}
if (!loginStatusChecked.value) {
await checkLoginStatus()
}
}
......@@ -235,12 +267,14 @@ export const useUserStore = defineStore('user', () => {
isOpenid,
isLoggedIn,
loading,
loginStatusChecked,
// 计算属性
tabBarBadges,
// 方法
checkLoginStatus,
waitForLoginStatusReady,
fetchUserInfo,
login,
logout
......