feat(admin): 广告位管理页——上传/链接/绑定相册/开关/排序

Task 11(广告位轮播):admin 后台广告位治理页。

- utils/ads/adsLogic:scopeKind/normalizeAlbumIds/isValidAdLinkUrl 纯逻辑
  (与服务端 dto LINK_URL_PATTERN、albumIds 归一语义同源)+ vitest 6 例
- api/ads + types/api/ads.d.ts:list/create/update/delete/initUpload 五端点
  (对照 embedSlots.ts 逐字风格;列表全量不分页、imageUrl 现签)
- views/system/ads:列表(缩略图/备注名/链接截断/投放范围标签/启停开关
  失败重拉回滚/上移下移 sortOrder 互换/硬删确认)+ 新建编辑对话框
  (staging 直传 init→裸 fetch PUT、Content-Type 与申明一致;相册多选
  远程搜索复用 /v1/albums 分页+本地过滤,绑定 ID 超限/失效以裸 ID 兜底;
  编辑换图才带 image 三字段;albumIds 归一空→null 转全局)
- 路由/菜单:system 组 ads 页(ri:advertisement-line,workspace 分组);
  locales zh/en 补 menus.system.ads + adsManage 子树(键集一致入单测)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-29 01:21:33 +08:00
parent 7f9789eb46
commit 239ef5648f
9 changed files with 1001 additions and 3 deletions
+13 -1
View File
@@ -1,6 +1,6 @@
/**
* 账号治理路由(P4a Task 8:账号管理 + 用户同步;Task 9:用量统计;
* P4b Task 5:展示位管理)
* P4b Task 5:展示位管理;广告位轮播 Task 11:广告位管理)
*/
import { AppRouteRecord } from '@/types/router'
@@ -58,6 +58,18 @@ export const systemRoutes: AppRouteRecord = {
keepAlive: false,
menuGroup: 'workspace'
}
},
{
path: 'ads',
name: 'SystemAds',
component: '/system/ads',
meta: {
title: 'menus.system.ads',
// ri:advertisement-line(Remix 基础集广告语义图标,同 embed-slots 坑位避雷)
icon: 'ri:advertisement-line',
keepAlive: false,
menuGroup: 'workspace'
}
}
]
}