fix(web,plugin): 前端审计修复 — 401 消除 + 统计卡片 crash + 销售漏斗 500 + antd 6 废弃 API
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- API client: proactive token refresh(请求前 30s 检查过期,提前刷新避免 401)
- Plugin store: fetchPlugins promise 去重,防止 StrictMode 并发重复请求
- Home stats: 简化 useEffect 加载逻辑,修复 tagColor undefined crash
- PluginGraphPage: valueStyle → styles.content, Spin tip → description(antd 6)
- DashboardWidgets: trailColor → railColor(antd 6)
- data_service: build_scope_sql 参数索引修复(硬编码 $100 → 动态 values.len()+1)
- erp-core error: Internal 错误添加 tracing::error 日志输出
This commit is contained in:
iven
2026-04-18 20:31:49 +08:00
parent 790991f77c
commit 5ba11f985f
12 changed files with 308 additions and 100 deletions

View File

@@ -27,6 +27,9 @@ interface PluginStore {
refreshMenuItems: () => void;
}
// 请求去重:防止并发重复调用 fetchPlugins
let fetchPluginsPromise: Promise<void> | null = null;
export const usePluginStore = create<PluginStore>((set, get) => ({
plugins: [],
loading: false,
@@ -35,10 +38,16 @@ export const usePluginStore = create<PluginStore>((set, get) => ({
schemaCache: {},
fetchPlugins: async (page = 1, status?: PluginStatus) => {
set({ loading: true });
try {
const result = await listPlugins(page, 100, status);
set({ plugins: result.data });
// 如果已有进行中的请求,复用该 Promise
if (fetchPluginsPromise) {
await fetchPluginsPromise;
return;
}
fetchPluginsPromise = (async () => {
set({ loading: true });
try {
const result = await listPlugins(page, 100, status);
set({ plugins: result.data });
// 先基于 entities 生成回退菜单,确保侧边栏快速渲染
get().refreshMenuItems();
@@ -68,9 +77,12 @@ export const usePluginStore = create<PluginStore>((set, get) => ({
}
set({ schemaCache: schemas });
get().refreshMenuItems();
} finally {
set({ loading: false });
}
} finally {
set({ loading: false });
fetchPluginsPromise = null;
}
})();
await fetchPluginsPromise;
},
refreshMenuItems: () => {