Files
ele-HeiXiu/src/pages/settings/sections/DataManageSetting.tsx
YoungestSongMo 8b697e775d feat: 去除构建时版控变量 + 窗口标题动态版控 + 退出登录保留缓存 (0.0.24)
版控体系重构(13 文件):
- 移除 build.mjs --personal/--enterprise 参数和 EDITION 环境变量
- 统一安装包文件名:船长-HeiXiu-{os}-{版本号}-Setup.{ext}
- 简化 package.json 构建脚本,移除 :enterprise 变体
- scripts/*.mjs 不再接受 edition 参数
- 移除 shared/constants/app.ts 的 parseEdition()

窗口标题动态版控:
- 新格式:船长-HeiXiu-{os}-{版本号}(登录前)/ ·{版控} 后缀(登录后)
- 链路:AppProvider(account_type) → useEffect → appRuntime IPC → main process
- 移除 updater.ts 更新检查 API 的 edition 查询参数

本地存储生命周期修正:
- 退出登录不再自动清空缓存(user_id 隔离,重新登录命中缓存)
- clearUserStorage 添加 isOpen() 竞态守卫
- 移除 closeDatabase() 避免退出→重新登录后数据库不可用
- 手动「清理缓存」按钮保留

文档:
- CHANGELOG.md 新增 0.0.24 条目
- TODO.md 新增已完成项
2026-06-22 13:36:42 +08:00

113 lines
3.7 KiB
TypeScript
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.
// ============================================================
// DataManageSetting — 本地数据管理设置区块
//
// 功能:
// - 展示本地缓存统计(任务/订单/媒体数量)
// - [加载历史数据]各拉首批数据100 条任务、100 条充值订单、100 条 VIP 订单)
// - [清理缓存]:清空当前用户本地数据
// - [保存到磁盘]:手动触发加密落盘
//
// "下一页"逻辑在对应列表页组件中:
// - TaskHistory → 滚动到最后一页本地数据时调 fetchMoreTasks()
// - OrdersPage → 滚动到最后一页本地数据时调 fetchMoreOrders()
// ============================================================
import { useState, useCallback, useEffect } from 'react';
import { Card, Button, Typography, App, Divider } from 'antd';
import { CloudDownloadOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons';
import {
initStorage, getStorageStats, clearUserStorage, saveDatabase,
} from '@/infrastructure/storage';
import { fetchAndSyncTasks, fetchAndSyncRechargeOrders, fetchAndSyncVipOrders } from '@/infrastructure/storage/services/data-sync';
const { Text } = Typography;
// ---------- 组件 ----------
export function DataManageSetting() {
const { message } = App.useApp();
const [loading, setLoading] = useState(false);
const [stats, setStats] = useState(() => getStorageStats());
const refreshStats = useCallback(() => setStats(getStorageStats()), []);
// 一键加载首批数据
const loadAll = useCallback(async () => {
setLoading(true);
try {
await Promise.allSettled([
fetchAndSyncTasks(),
fetchAndSyncRechargeOrders(),
fetchAndSyncVipOrders(),
]);
refreshStats();
} finally {
setLoading(false);
}
}, [refreshStats]);
// 清理缓存
const handleClear = useCallback(() => {
clearUserStorage().then(async () => {
await initStorage();
refreshStats();
message.success('本地缓存已清理');
});
}, [message, refreshStats]);
// 保存到磁盘
const handleSave = useCallback(() => {
saveDatabase().then(ok => {
message[ok ? 'success' : 'error'](ok ? '数据已保存到磁盘' : '保存失败');
});
}, [message]);
useEffect(() => { refreshStats(); }, [refreshStats]);
return (
<Card size="small" title="数据管理" className="rounded-md!">
<div className="flex flex-col gap-3">
{/* ---- 统计 ---- */}
<div className="flex flex-col gap-1">
<Text type="secondary" className="text-xs"></Text>
<div className="flex gap-4">
<Text className="text-xs">
<Text strong>{stats.taskCount}</Text>
</Text>
<Text className="text-xs">
<Text strong>{stats.orderCount}</Text>
</Text>
<Text className="text-xs">
<Text strong>{stats.mediaCount}</Text>
</Text>
</div>
</div>
<Divider style={{ margin: '4px 0' }} />
<Button
size="small"
type="primary"
icon={<CloudDownloadOutlined />}
onClick={loadAll}
loading={loading}
block
>
</Button>
<Divider style={{ margin: '4px 0' }} />
<div className="flex gap-2">
<Button size="small" icon={<ReloadOutlined />} onClick={handleSave}>
</Button>
<Button size="small" danger icon={<DeleteOutlined />} onClick={handleClear}>
</Button>
</div>
</div>
</Card>
);
}