feat(admin): embed slot management with code snippet
P4b Task 5:/system/embed-slots 管理页(Task 8/9 页面模式:useCursorList
游标累积 + 对话框治理)。列表(名称/绑定相册/启停/configVersion/更新时间,
启停开关行内 PATCH → configVersion+1 toast 提示)+ 新建/编辑对话框
(设置表单位置/尺寸/间隔/语言/默认收起,intervalMs 契约区间夹取;编辑按
整体替换语义提交完整 settings)+ 绑定相册对话框(相册标题/ID 搜索选中 →
确认框携带 A22 文案「configVersion 将递增,官网无需改动」;清空即解绑)+
嵌入代码卡({EMBED_ORIGIN}/embed/v1/loader.js + data-slot 令牌,一键复制;
EMBED_ORIGIN=VITE_EMBED_ORIGIN 缺省本机 viewer dev,.env.example 登记)。
- API 层 src/api/embedSlots.ts + types/api/embedSlot.d.ts(契约镜像)
- vitest 9 例:表单→载荷(缺省+夹取)、编辑载荷收敛、snippet 拼接、
环境基址兜底、绑定变更分类、zh/en 键一致 + A22 短语断言
- Playwright e2e(真实 cn+ov 后端):新建→绑定(gov-photos 直种 +
seed-fixture 新增 sync-flush 模式经 bootstrap/真实发送管线投影 photos_ov)
→嵌入代码卡含 token→ov 公开 feed 返回相册照片→换绑 configVersion+1 +
feed 切换(A22)→停用 feed 404;admin playwright 配置补 ov webServer
- i18n zh/en(embedSlotsManage.* + menus.system.embedSlots)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* 展示位管理接口(对齐 @photo/contracts tags [embed-slots]:listEmbedSlots /
|
||||
* createEmbedSlot / updateEmbedSlot,P4b Task 5;仅公司 admin 可用)
|
||||
*
|
||||
* - 列表为 createdAt+ID 稳定倒序键集游标
|
||||
* - PATCH 为部分更新:name/enabled/settings/albumId 任一变更均递增
|
||||
* configVersion 并触发 slot-state 同步(嵌入端配置版本变化即整体重置)
|
||||
* - settings 整体替换(提供时字段齐全);albumId null=解绑(公开端 404)
|
||||
*/
|
||||
import request from '@/utils/http'
|
||||
|
||||
/** 展示位列表(游标分页) */
|
||||
export function fetchEmbedSlots(params: { cursor?: string; limit?: number }) {
|
||||
return request.get<Api.EmbedSlot.ListResponse>({ url: '/v1/admin/embed-slots', params })
|
||||
}
|
||||
|
||||
/** 创建展示位(publicToken 服务端生成;初始未绑定、configVersion=1) */
|
||||
export function fetchCreateEmbedSlot(data: Api.EmbedSlot.CreatePayload) {
|
||||
return request.post<Api.EmbedSlot.Item>({ url: '/v1/admin/embed-slots', data })
|
||||
}
|
||||
|
||||
/** 更新展示位(部分更新;任一管理面变更递增 configVersion) */
|
||||
export function fetchUpdateEmbedSlot(id: string, data: Api.EmbedSlot.UpdatePayload) {
|
||||
return request.patch<Api.EmbedSlot.Item>({ url: `/v1/admin/embed-slots/${id}`, data })
|
||||
}
|
||||
Reference in New Issue
Block a user