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
+63 -1
View File
@@ -235,7 +235,8 @@
"users": "账号管理",
"userSync": "用户同步",
"usage": "用量统计",
"embedSlots": "展示位管理"
"embedSlots": "展示位管理",
"ads": "广告位管理"
},
"albums": {
"title": "相册管理",
@@ -922,6 +923,67 @@
"enabledOff": "已停用(configVersion 已递增至 {version},公开端随即 404)"
}
},
"adsManage": {
"list": {
"title": "广告位管理",
"subtitle": "管理相册页广告轮播:图片、跳转链接、投放范围与排序。",
"tableTitle": "广告位列表",
"create": "新建广告位",
"empty": "暂无广告位,点击「新建广告位」创建",
"loadFailed": "广告位列表加载失败",
"retry": "重试",
"colImage": "图片",
"colTitle": "备注名",
"colLink": "跳转链接",
"colScope": "投放范围",
"colEnabled": "启用",
"colActions": "操作",
"scopeGlobal": "全局",
"scopeTargeted": "定向 {n} 相册",
"imageAlt": "广告图",
"actionUp": "上移",
"actionDown": "下移",
"actionEdit": "编辑",
"actionDelete": "删除",
"deleteConfirm": "确定删除广告位「{name}」?删除后不可恢复(数据不保留)。",
"deleted": "广告位已删除"
},
"toast": {
"enabledOn": "广告位已启用",
"enabledOff": "广告位已停用(观众页随即不可见)"
},
"form": {
"imageLabel": "广告图",
"imagePick": "选择图片",
"imageRepick": "重选图片",
"imageHint": "建议 1200×360、不超过 2MB,支持 jpeg/png/heic",
"imageRequired": "请先上传广告图",
"imageInvalidType": "仅支持 jpeg/png/heic 图片",
"imageTooLarge": "图片超过 2MB 上限",
"imageUploadFailed": "图片上传失败:{message}",
"imageStagedTag": "新图待保存",
"linkLabel": "跳转链接",
"linkPlaceholder": "https://example.com/promo",
"linkRequired": "请输入跳转链接",
"linkInvalid": "链接须以 http(s):// 开头且不超过 2048 字符",
"titleLabel": "备注名",
"titlePlaceholder": "如:秋季活动推广(仅后台可见,可空)",
"albumsLabel": "绑定相册",
"albumsPlaceholder": "输入相册标题或 ID 搜索",
"albumsSearching": "搜索中…",
"albumsNoMatch": "无匹配相册",
"albumsHint": "留空=全局投放(全部相册观众页轮播)",
"submit": "保存"
},
"create": {
"title": "新建广告位",
"created": "广告位已创建"
},
"edit": {
"title": "编辑广告位",
"saved": "广告位已保存"
}
},
"apiMsg": {
"AUTH_INVALID_CREDENTIALS": "账号或密码错误",
"AUTH_RATE_LIMITED": "登录失败次数过多,请稍后再试",