4.8 KiB
4.8 KiB
网站信息和统计数据状态管理使用指南
概述
项目已经实现了网站信息和统计数据的状态管理,使用 Pinia 进行状态管理,避免了在多个组件中重复调用 API。
Store 结构
1. 网站信息 Store (useSiteStore)
位置:src/store/modules/site.ts
功能:
- 缓存网站基本信息(名称、Logo、域名等)
- 自动计算系统运行天数
- 智能缓存管理(默认30分钟有效期)
- 自动更新 localStorage 中的相关信息
主要 API:
const siteStore = useSiteStore();
// 获取网站信息(带缓存)
await siteStore.fetchSiteInfo();
// 强制刷新
await siteStore.fetchSiteInfo(true);
// 获取计算属性
siteStore.websiteName
siteStore.websiteLogo
siteStore.runDays
2. 统计数据 Store (useStatisticsStore)
位置:src/store/modules/statistics.ts
功能:
- 缓存统计数据(用户数、订单数、销售额等)
- 自动刷新机制(默认5分钟间隔)
- 异步更新数据库
- 短期缓存策略
主要 API:
const statisticsStore = useStatisticsStore();
// 获取统计数据
await statisticsStore.fetchStatistics();
// 开始自动刷新(5分钟间隔)
statisticsStore.startAutoRefresh();
// 停止自动刷新
statisticsStore.stopAutoRefresh();
// 获取统计数据
statisticsStore.userCount
statisticsStore.orderCount
statisticsStore.totalSales
使用方式
方式一:直接使用 Store
<template>
<div>
<h1>{{ siteStore.websiteName }}</h1>
<img :src="siteStore.websiteLogo" alt="logo" />
<p>用户总数: {{ statisticsStore.userCount }}</p>
<p>运行天数: {{ siteStore.runDays }}</p>
</div>
</template>
<script setup>
import { useSiteStore } from '@/store/modules/site';
import { useStatisticsStore } from '@/store/modules/statistics';
import { onMounted, onUnmounted } from 'vue';
const siteStore = useSiteStore();
const statisticsStore = useStatisticsStore();
onMounted(async () => {
// 加载数据
await Promise.all([
siteStore.fetchSiteInfo(),
statisticsStore.fetchStatistics()
]);
// 开始自动刷新统计数据
statisticsStore.startAutoRefresh();
});
onUnmounted(() => {
// 停止自动刷新
statisticsStore.stopAutoRefresh();
});
</script>
方式二:使用组合式函数(推荐)
<template>
<div>
<h1>{{ websiteName }}</h1>
<img :src="websiteLogo" alt="logo" />
<p>用户总数: {{ userCount }}</p>
<p>运行天数: {{ runDays }}</p>
<a-spin :spinning="loading">
<!-- 内容 -->
</a-spin>
</div>
</template>
<script setup>
import { useSiteData } from '@/composables/useSiteData';
import { onMounted, onUnmounted } from 'vue';
const {
websiteName,
websiteLogo,
userCount,
runDays,
loading,
refreshAll,
startAutoRefresh,
stopAutoRefresh
} = useSiteData();
onMounted(async () => {
await refreshAll();
startAutoRefresh();
});
onUnmounted(() => {
stopAutoRefresh();
});
</script>
缓存策略
网站信息缓存
- 有效期: 30分钟
- 策略: 长期缓存,信息相对稳定
- 刷新时机: 手动刷新或缓存过期
统计数据缓存
- 有效期: 5分钟
- 策略: 短期缓存 + 自动刷新
- 刷新时机: 自动刷新(5分钟间隔)或手动刷新
最佳实践
1. 组件生命周期管理
onMounted(async () => {
// 加载数据
await refreshAll();
// 开始自动刷新
startAutoRefresh();
});
onUnmounted(() => {
// 清理定时器
stopAutoRefresh();
});
2. 错误处理
try {
await siteStore.fetchSiteInfo();
} catch (error) {
console.error('获取网站信息失败:', error);
// 处理错误
}
3. 强制刷新
// 用户手动刷新时
const handleRefresh = async () => {
await refreshAll(true); // 强制刷新
};
迁移指南
从直接 API 调用迁移
之前:
import { getSiteInfo } from '@/api/layout';
const siteInfo = ref({});
const loadSiteInfo = async () => {
siteInfo.value = await getSiteInfo();
};
现在:
import { useSiteStore } from '@/store/modules/site';
const siteStore = useSiteStore();
// 直接使用 siteStore.siteInfo 或 siteStore.websiteName 等
注意事项
- 自动刷新管理: 确保在组件卸载时停止自动刷新,避免内存泄漏
- 缓存有效性: 可以通过
isCacheValid检查缓存是否有效 - 错误处理: 所有异步操作都应该有适当的错误处理
- 性能优化: 使用计算属性而不是直接访问 store 状态
扩展功能
如需添加新的统计数据或网站信息字段,请:
- 更新对应的 Store 接口
- 添加相应的 getter
- 更新组合式函数
- 更新类型定义