Files
mp-vue/docs/store-usage.md

229 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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