版控体系重构(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 新增已完成项
113 lines
3.7 KiB
TypeScript
113 lines
3.7 KiB
TypeScript
// ============================================================
|
||
// 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>
|
||
);
|
||
}
|