diff --git a/web/src/pages/app/dialogs.css b/web/src/pages/app/dialogs.css index 55b5dcb..6342808 100644 --- a/web/src/pages/app/dialogs.css +++ b/web/src/pages/app/dialogs.css @@ -236,6 +236,16 @@ padding: 8px; } +.preview-scene-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.preview-scene-actions > button { + flex: 1; +} + .preview-scene-body > button { width: 100%; } diff --git a/web/src/pages/app/modules/models.ts b/web/src/pages/app/modules/models.ts index a734bf3..70becec 100644 --- a/web/src/pages/app/modules/models.ts +++ b/web/src/pages/app/modules/models.ts @@ -3,6 +3,7 @@ import { renderPagination } from "../../../components/pagination"; import { getCurrentUser } from "../../../services/authState"; import type { DictionaryResponse, ModelItem, ModelListResponse } from "../../../types"; import { confirmDialog, formDialog, notify, notifyError } from "../../../ui/dialogs"; +import { downloadFileFromUrl } from "../../../utils/fileDownload"; import { escapeHtml, modelNameFromFile } from "../../../utils/format"; import { appState } from "../appState"; @@ -192,6 +193,10 @@ function bindModelGridActions(grid: HTMLDivElement) { notify("导入场景数据已输出"); break; } + case "download": + if (!model) return; + await downloadFileFromUrl(model.file_url, model.original_filename || model.name); + break; case "delete": await deleteModel(id); break; @@ -293,6 +298,7 @@ function renderModelCard(item: ModelItem) { ${thumb}