chore(scripts): 新增带鉴权的时光机触发脚本,优化本地运维体验

This commit is contained in:
kennethcheng 2026-05-03 00:50:15 +08:00
parent d7f8a338b6
commit ef412b366a
2 changed files with 47 additions and 1 deletions

View File

@ -435,3 +435,11 @@
- **Tooltip 防御性解构**`CustomTooltip` 中的值读取改为 `Number(dataNode.totalValueCny || dataNode._raw?.totalValueCny || 0) || 0`,通过 `_raw` 快照兜底读取,确保 Tooltip 永远能拿到本金和现值的真实数据。 - **Tooltip 防御性解构**`CustomTooltip` 中的值读取改为 `Number(dataNode.totalValueCny || dataNode._raw?.totalValueCny || 0) || 0`,通过 `_raw` 快照兜底读取,确保 Tooltip 永远能拿到本金和现值的真实数据。
- **Snapshot 接口扩展**:新增 `total_value_cny?: string``total_cost_cny?: string` 可选字段,`ChartDatum` 接口新增 `_raw: Snapshot` 字段用于 Tooltip 层 fallback。 - **Snapshot 接口扩展**:新增 `total_value_cny?: string``total_cost_cny?: string` 可选字段,`ChartDatum` 接口新增 `_raw: Snapshot` 字段用于 Tooltip 层 fallback。
- **验收标准**:控制台 `【CHART DATA DEBUG】` 打印出带真实本金(如 5094的字段Tooltip 中投入本金显示真实法币数字,彻底消除 704 旧账残影。 - **验收标准**:控制台 `【CHART DATA DEBUG】` 打印出带真实本金(如 5094的字段Tooltip 中投入本金显示真实法币数字,彻底消除 704 旧账残影。
## 基于现有生产级 API 鉴权,补充开发了 scripts/trigger-rebuild.ts 本地触发脚本,实现了安全、隔离的本地时光机重置工作流 (Task 84)
- 在项目根目录创建 `scripts/trigger-rebuild.ts` 独立触发脚本,作为 `app/api/admin/rebuild-snapshots/route.ts` 的本地运维入口。
- 脚本通过 `dotenv` 强制加载 `.env.local``.env` 环境变量文件,优先读取 `REBUILD_SECRET`,降级读取 `CRON_SECRET`,确保鉴权密钥的安全获取。
- **核心逻辑**:脚本向 `http://localhost:8080/api/admin/rebuild-snapshots` 发送 POST 请求,携带 `Authorization: Bearer <secret>` 请求头,复用生产级 Bearer Token 强校验机制,未配置密钥时提前退出。
- **架构红线**`app/api/admin/rebuild-snapshots/route.ts` 中的生产级 POST + Bearer Token 强校验代码未被修改,保持原有的安全隔离设计。
- **运行方式**`npx tsx scripts/trigger-rebuild.ts`(需确保 `npm run dev` 在另一个终端运行且端口为 8080
- **设计收益**:本地开发者无需记忆 curl 命令或手动构造请求头,通过脚本即可安全触发历史快照重建,降低了运维门槛并保持了与生产鉴权机制的一致性。

View File

@ -0,0 +1,38 @@
import { config } from 'dotenv';
// 强制加载所有可能的本地环境变量文件
config({ path: ['.env.local', '.env'] });
const triggerRebuild = async () => {
// 优先读取 REBUILD_SECRET降级读取 CRON_SECRET
const secret = process.env.REBUILD_SECRET || process.env.CRON_SECRET;
if (!secret) {
console.error('❌ 致命错误: 未在 .env.local 或 .env 找到 REBUILD_SECRET 或 CRON_SECRET');
process.exit(1);
}
console.log('🚀 正在携带合法 Token 请求时光机重置接口...');
try {
// 默认请求本地 8080 端口,确保 Next.js 服务正在运行
const response = await fetch('http://localhost:8080/api/admin/rebuild-snapshots', {
method: 'POST',
headers: {
'Authorization': `Bearer ${secret}`,
'Content-Type': 'application/json'
}
});
const data = await response.json();
if (response.ok) {
console.log('✅ 历史快照重建成功!', JSON.stringify(data, null, 2));
} else {
console.error('❌ 重建失败,服务器返回:', data);
}
} catch (error) {
console.error('❌ 请求发送异常 (请确认 npm run dev 正在运行且端口为 8080):', error);
}
};
triggerRebuild();