feat(banner): 首页常驻滚动通知与管理配置及类型样式支持
This commit is contained in:
@@ -199,9 +199,18 @@ docker compose -f docker-compose.deploy.yml up -d backend web
|
||||
| `announcements` | 保存管理员发布的系统公告 | `pinned` 只改变排序;`image_resource_id` 只能绑定由当前管理员上传并在发布事务中消费的公告配图草稿 |
|
||||
| `announcement_image_drafts` | 标记尚未发布的公告配图资源 | 发布/更新事务消费草稿;取消编辑显式回收,超过 24 小时的异常遗留草稿由后台清理 |
|
||||
| `user_announcement_reads` | 保存用户已读状态 | 同一用户和公告唯一;公告重新发布时清除旧已读记录 |
|
||||
| `banner_announcements` | 保存首页顶部常驻展示的滚动通知条 | 与系统公告完全独立:只有标题、图标与跳转链接,无正文、无配图、无已读状态;`link` 仅接受 `http(s)` 外链或 `/` 开头的站内路径;`status` 为 `active` / `disabled`,`starts_at` / `ends_at` 构成生效窗口(可预约未来开始);`title_runs` 以 JSON 文本保存标题的样式分段;`notice_type` 决定通知条底色,`icon` 是标题前的图标键 |
|
||||
|
||||
活动公告按置顶状态优先、发布时间倒序返回;置顶不会绕过关闭状态或用户登录校验。公告只要求标题,正文和配图均可为空。用户首次进入工作区时会自动看到未读公告,可以只关闭本次或选择今日不再提醒;主动打开公告中心后才会写入服务端已读状态。替换或移除配图时,公告更新、旧资源记录删除和物理删除任务入队在同一数据库事务完成。
|
||||
|
||||
常驻通知的标题支持按分段设置样式:`title_runs` 是可选的 JSON 数组,每项为 `{ text, fontSize?, fontWeight?, fontFamily?, color? }`,只在有分段时写入,历史数据与纯文本标题保持为空。后端在写入前统一收口取值——字号 10-20、字重 400/500/600/700、字体 `sans` / `serif` / `mono`、颜色 `#RRGGBB`,并合并相邻同样式分段;标题总字数上限 120 与纯文本标题一致。`title` 列始终保存由分段拼接出的纯文本,列表展示与关键字检索不受样式影响,通知条渲染分段时也不依赖该列。
|
||||
|
||||
常驻通知的通知类型与标题图标同样是白名单枚举。`notice_type` 取 `notice`(公告)/ `activity`(活动)/ `update`(更新)/ `warning`(警告),决定通知条底色——四种类型在 `globals.css` 里各有一组明暗两档色值,浅色档按白字 4.5:1 反推,深色档统一压到 7:1 以上。`icon` 取前端 `lib/announcements/banner-notice` 图标库里的键(kebab-case,当前 42 个),前端按下标取 lucide 组件渲染。两个字段都允许为空,后端在写入时补齐默认值(`notice` / `megaphone`),保证行数据始终是可直接渲染的具体取值;白名单在 `backend/internal/app/announcement.go`,与前端注册表的一致性由 `web/test/banner-notice.test.ts` 双向校验,改任一侧都会让测试失败。
|
||||
|
||||
常驻通知由管理后台「运营 → 常驻通知」维护,公开接口 `GET /api/banner-announcements` 按生效窗口返回 `active` 条目(`starts_at <= now <= ends_at`,空窗口视为长期有效),前台工作台顶部布局层轮播展示;点击按 `link` 跳转:外链新窗口打开,站内路径前端路由跳转,无链接则不可点击。
|
||||
|
||||
后台编辑弹窗可选中通知类型(卡片上直接铺出该类型的真实底色)、选中标题文字直接调整样式,并通过工具栏「图标」按钮在光标处插入 emoji 素材(可插入多个、任意位置),全部实时联动到深浅两套主题的预览(含文字对比度提示)。预览与前台通知条共用 `components/layout/banner-announcement-content.tsx` 的展示单元,因此「预览即前台结果」;标题在通知条内固定单行展示,超长按可用宽度裁切。通知条默认不显示任何图标,是否带图标完全由标题内容决定。
|
||||
|
||||
## 资源存储
|
||||
|
||||
| 表 | 用途 | 关键边界 |
|
||||
|
||||
Reference in New Issue
Block a user