一、引言

在健康管理系统的前端开发中,状态管理是核心环节。随着应用复杂度的提升,如何高效地管理用户健康数据、AI分析结果以及全局配置,成为了一个关键挑战。本文将分享我们在项目中基于 Pinia 的状态管理设计方案,以及如何实现数据的本地持久化与同步。

二、Pinia Store 的模块化设计

2.1 Store 分层架构

我们将状态管理分为三个核心模块:

// stores/healthStore.js - 健康数据状态
// stores/userStore.js - 用户认证状态  
// stores/themeStore.js - 主题配置状态

这种模块化设计带来了以下优势:

  • 职责清晰 :每个 Store 只负责特定领域的数据
  • 便于维护 :修改某一模块不会影响其他部分
  • 性能优化 :按需引入,减少不必要的状态监听

2.2 healthStore 的状态结构设计

在 healthStore.js 中,我们采用了分类存储的方式:

state: () => ({
// 饮食记录
foodRecords: [],
foodLoading: false,
foodError: null,

// 运动记录
exerciseRecords: [],
exerciseLoading: false,
exerciseError: null,

// 睡眠记录
sleepRecords: [],
sleepLoading: false,
sleepError: null,

// AI分析相关
aiAnalysis: loadAiAnalysisFromLocalStorage(),
})

设计要点 :

  • 每种记录类型都有独立的 records 、 loading 、 error 三元组
  • 这种结构使得异步操作的状态管理更加清晰
  • 便于在 UI 层面实现统一的加载和错误提示

三、localStorage 数据持久化策略

3.1 AI 分析结果的持久化

AI 分析是系统的核心功能之一,为了提升用户体验,我们将分析结果持久化到 localStorage:

// 加载函数
const loadAiAnalysisFromLocalStorage = () => {
try {
    const saved = localStorage.getItem('aiAnalysis')
    if (saved) {
    const parsed = JSON.parse(saved)
    return {
        analysisContent: parsed.analysisContent || '',
        healthLevel: parsed.healthLevel || '',
        analysisDate: parsed.analysisDate || '',
        isGenerating: false,  // 重置瞬时状态
        isSaving: false,
        error: null,
        cancelToken: null
    }
    }
} catch (error) {
    console.error('从localStorage加载AI分析数据失败:', error)
}
return getDefaultAiAnalysis()
}

关键设计决策 :

  • 只持久化必要数据 : isGenerating 、 isSaving 等瞬时状态不在持久化范围内
  • 状态重置策略 :页面刷新后,加载状态应重置为 false
  • 异常处理 :解析失败时使用默认值,保证应用稳定性

3.2 数据同步机制

我们建立了完善的数据同步机制:

const saveAiAnalysisToLocalStorage = (aiAnalysis) => {
try {
    const dataToSave = {
    analysisContent: aiAnalysis.analysisContent,
    healthLevel: aiAnalysis.healthLevel,
    analysisDate: aiAnalysis.analysisDate
    }
    localStorage.setItem('aiAnalysis', JSON.stringify(dataToSave))
} catch (error) {
    console.error('保存AI分析数据到localStorage失败:', error)
}
}

同步时机 :

  • AI分析生成完成时
  • 用户取消生成时
  • 保存到数据库成功后

四、异步操作的统一状态管理

4.1 标准化的 CRUD 操作模式

在 healthStore 中,我们为每种记录类型实现了统一的异步操作模式:

async fetchFoodRecords(userId, params) {
this.foodLoading = true
this.foodError = null
try {
    const records = await healthService.food.getRecords(userId, params)
    this.foodRecords = records
    return records
} catch (error) {
    this.foodError = error.message || '获取饮食记录失败'
    throw error
} finally {
    this.foodLoading = false
}
}

模式特点 :

  • 状态三态管理 : loading 、 error 、 data 三位一体
  • 错误处理标准化 :统一的错误消息格式
  • 异常透传 :使用 throw error 向上传递,便于上层处理

4.2 CancelToken 实现请求取消

AI分析可能耗时较长,我们实现了请求取消功能:

async generateAiAnalysis(username, startDate, endDate) {
this.aiAnalysis.isGenerating = true
this.aiAnalysis.error = null

// 创建取消令牌
const source = axios.CancelToken.source()
this.aiAnalysis.cancelToken = source

saveAiAnalysisToLocalStorage(this.aiAnalysis)

try {
    const analysis = await healthService.aiAnalysis.generateAnalysis(
    username, startDate, endDate, source
    )
    // ... 处理结果
} catch (error) {
    if (axios.isCancel(error)) {
    this.aiAnalysis.error = null  // 取消不算错误
    } else {
    this.aiAnalysis.error = error.message || '生成AI分析失败'
    }
    if (!axios.isCancel(error)) {
    throw error
    }
} finally {
    this.aiAnalysis.isGenerating = false
    this.aiAnalysis.cancelToken = null
}
}

取消机制设计 :

  • 使用 axios 的 CancelToken 机制
  • 取消操作不视为错误,不显示错误提示
  • 状态及时清理,避免内存泄漏

五、数据一致性保障

5.1 用户切换时的数据隔离

为了确保数据安全,我们实现了用户级别的数据隔离:

const loadCurrentChat = () => {
const username = localStorage.getItem('username')
const savedChat = localStorage.getItem('aiAssistantCurrentChat')
const savedUser = localStorage.getItem('aiAssistantChatUser')

// 检查是否是同一用户
if (!username || username !== savedUser) {
    clearChatStorage()
    initNewChat()
    return
}

// ... 加载数据
}

隔离策略 :

  • 使用 aiAssistantChatUser 标记当前用户
  • 用户切换时自动清空前一用户数据
  • 防止数据泄露和混淆

5.2 定期同步机制

为保持数据最新,我们实现了定期同步:

syncInterval = setInterval(() => {
const currentUsername = localStorage.getItem('username')
if (currentUsername) {
    syncSettingsFromDB()
}
}, 5 * 60 * 1000)  // 每5分钟同步一次

同步策略 :

  • 后台静默同步,不阻塞 UI
  • 同步失败时使用缓存数据
  • 避免频繁请求,控制服务器压力

六、总结

通过以上设计,我们构建了一套完整的状态管理与数据持久化体系:

  1. 模块化架构 :清晰的职责划分,便于维护和扩展
  2. 分层持久化 :关键数据本地缓存,提升用户体验
  3. 统一异步模式 :标准化的状态管理,降低认知负担
  4. 数据一致性保障 :用户隔离和定期同步确保数据安全
    这套方案在实际项目中表现稳定,有效提升了应用的响应速度和用户体验。在后续开发中,我们还可以引入更多优化策略,如:
  • 使用 IndexedDB 存储更复杂的数据结构
  • 实现数据版本管理和迁移
  • 增加数据加密存储
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐