From 903962a46b55fe153145c1a5bc86736204cb9424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Wed, 23 Sep 2026 13:37:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(embed-slots):=20soft-delete=20slots=20?= =?UTF-8?q?=E2=80=94=20admin=20entry,=20ov=20shutdown=20via=20enabled=3Dfa?= =?UTF-8?q?lse=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 契约 deleteEmbedSlot(DELETE /admin/embed-slots/{id} → 204 幂等;admin 专属) - cn schema:embed_slots.deletedAt(迁移 20260923120000,本地已应用) - softDelete:乐观锁 claim + outbox slot.updated(payload enabled 强制 false ——ov 副本无墓碑,enabled=false 快照即公开端 404 下线;priority=high)+ audit - 列表/加载/更新过滤 deletedAt → 同码 404 - Admin 列表操作「删除」(确认:已接入网站将停止展示、不可恢复) - API 56/56、admin 87/87 + build 全绿 Co-Authored-By: Claude Code --- apps/admin/src/api/embedSlots.ts | 5 + apps/admin/src/locales/langs/en.json | 5 +- apps/admin/src/locales/langs/zh.json | 5 +- .../src/views/system/embed-slots/index.vue | 27 +++- apps/viewer/src/components/PhotoLightbox.vue | 124 ------------------ packages/contracts/openapi.yaml | 27 ++++ packages/contracts/src/generated/openapi.d.ts | 46 ++++++- .../migration.sql | 2 + packages/db-cn/prisma/schema.prisma | 19 +-- services/api/src/embed/embed.controller.ts | 12 ++ services/api/src/embed/embed.service.ts | 70 +++++++++- services/api/src/sync/payloads.ts | 5 +- 12 files changed, 205 insertions(+), 142 deletions(-) create mode 100644 packages/db-cn/prisma/migrations/20260923120000_embed_slots_soft_delete/migration.sql diff --git a/apps/admin/src/api/embedSlots.ts b/apps/admin/src/api/embedSlots.ts index 520101f..9225564 100644 --- a/apps/admin/src/api/embedSlots.ts +++ b/apps/admin/src/api/embedSlots.ts @@ -23,3 +23,8 @@ export function fetchCreateEmbedSlot(data: Api.EmbedSlot.CreatePayload) { export function fetchUpdateEmbedSlot(id: string, data: Api.EmbedSlot.UpdatePayload) { return request.patch({ url: `/v1/admin/embed-slots/${id}`, data }) } + +/** 软删除展示位(deletedAt 标记:列表隐藏、ov 快照下线;幂等 204) */ +export function fetchDeleteEmbedSlot(id: string) { + return request.del({ url: `/v1/admin/embed-slots/${id}` }) +} diff --git a/apps/admin/src/locales/langs/en.json b/apps/admin/src/locales/langs/en.json index 10eeea5..5061555 100644 --- a/apps/admin/src/locales/langs/en.json +++ b/apps/admin/src/locales/langs/en.json @@ -820,7 +820,10 @@ "actionBind": "Bind Album", "actionCode": "Embed Code", "subtitle": "Manage floating photo widgets: album binding, toggles and embed code.", - "tableTitle": "Slots" + "tableTitle": "Slots", + "actionDelete": "Delete", + "deleteConfirm": "Delete slot \"{name}\"? Sites using it will stop showing it; this cannot be undone.", + "deleted": "Slot deleted" }, "form": { "nameLabel": "Name", diff --git a/apps/admin/src/locales/langs/zh.json b/apps/admin/src/locales/langs/zh.json index 0d51a74..110c842 100644 --- a/apps/admin/src/locales/langs/zh.json +++ b/apps/admin/src/locales/langs/zh.json @@ -820,7 +820,10 @@ "actionBind": "绑定相册", "actionCode": "嵌入代码", "subtitle": "管理官网悬浮照片展示位:绑定相册、启停与接入代码。", - "tableTitle": "展示位列表" + "tableTitle": "展示位列表", + "actionDelete": "删除", + "deleteConfirm": "确定删除展示位「{name}」?删除后已接入的网站将停止展示,且不可恢复。", + "deleted": "展示位已删除" }, "form": { "nameLabel": "名称", diff --git a/apps/admin/src/views/system/embed-slots/index.vue b/apps/admin/src/views/system/embed-slots/index.vue index 641a5fe..d763b96 100644 --- a/apps/admin/src/views/system/embed-slots/index.vue +++ b/apps/admin/src/views/system/embed-slots/index.vue @@ -89,6 +89,9 @@ {{ $t('embedSlotsManage.list.actionCode') }} + + {{ $t('embedSlotsManage.list.actionDelete') }} + @@ -124,11 +127,11 @@