优化模型字典加载缓存

This commit is contained in:
zhangshun
2026-05-27 09:21:11 +08:00
parent efddf5adee
commit 771e290fb9
2 changed files with 42 additions and 9 deletions

View File

@@ -5,8 +5,8 @@ DB_PATH=
# login: show login page
# fixed: auto login with FIXED_LOGIN_USERNAME and open model library directly
APP_AUTH_MODE=fixed
FIXED_LOGIN_USERNAME=viewer
APP_AUTH_MODE=login
FIXED_LOGIN_USERNAME=
FIXED_LOGIN_ROLE=user
ALLOW_USER_EDIT_SYSTEM_LIBRARY=false

View File

@@ -22,6 +22,8 @@ type UploadModelPayload = {
};
const defaultOperationTree = JSON.stringify({ OperationTree: "[]" });
let dictionariesLoaded = false;
let dictionariesLoading: Promise<void> | null = null;
export function bindModelActions() {
const isAdmin = getCurrentUser()?.role === "admin";
@@ -38,7 +40,10 @@ export function bindModelActions() {
document.querySelector("#manageDictionariesBtn")?.addEventListener("click", async () => {
try {
const { openDictionaryManager } = await import("./dictionaries");
await openDictionaryManager(loadModels);
await openDictionaryManager(async () => {
invalidateDictionaries();
await loadModels();
});
} catch (error) {
notifyError(error);
}
@@ -158,12 +163,37 @@ export async function loadModels() {
});
}
async function loadDictionaries() {
const result = await api<DictionaryResponse>("/api/dictionaries");
async function loadDictionaries(force = false) {
if (!force && dictionariesLoaded) {
syncDictionaryFilters();
return;
}
if (!force && dictionariesLoading) {
await dictionariesLoading;
syncDictionaryFilters();
return;
}
dictionariesLoading = api<DictionaryResponse>("/api/dictionaries")
.then((result) => {
appState.brands = result.brands;
appState.types = result.types;
syncDictionarySelect("#brandFilter", result.brands, "全部品牌", appState.filters.brandId);
syncDictionarySelect("#typeFilter", result.types, "全部类型", appState.filters.typeId);
dictionariesLoaded = true;
})
.finally(() => {
dictionariesLoading = null;
});
await dictionariesLoading;
syncDictionaryFilters();
}
function invalidateDictionaries() {
dictionariesLoaded = false;
}
function syncDictionaryFilters() {
syncDictionarySelect("#brandFilter", appState.brands, "全部品牌", appState.filters.brandId);
syncDictionarySelect("#typeFilter", appState.types, "全部类型", appState.filters.typeId);
}
function syncDictionarySelect(selector: string, items: { id: number; name: string }[], emptyText: string, value: string) {
@@ -312,6 +342,7 @@ async function openUploadModelDialog() {
});
if (result) {
invalidateDictionaries();
await loadModels();
}
}
@@ -391,6 +422,7 @@ export async function openProcessModelUploadDialog(input?: {
});
if (result) {
invalidateDictionaries();
await loadModels();
}
}
@@ -565,6 +597,7 @@ async function editModel(id: number) {
}
})
});
invalidateDictionaries();
await loadModels();
}