Files
omni-notify/PRD.md
home-PC c353845fad feat(app): 初始化本地通知桌面应用
搭建 .NET 8 WPF 应用骨架,加入系统托盘、单实例启动与主控制面板。
实现本地 HTTP /notify 消息接入、频道严格匹配、免打扰、熔断限流与历史持久化。
补充弹窗样式配置、队列/推挤/替换展示、溢出处理、应用图标和项目文档。

Initial-Commit: true
2026-05-19 01:32:41 +08:00

68 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📦 Omni-Notify 产品需求与交互说明书 (PRD)
## 一、 产品定位与全局原则
* **产品名称:** Omni-Notify
* **核心功能:** 接收本机其他应用的格式化信息,进行高度自定义的视觉弹窗展示。
* **适用系统:** windows10以上系统。
* **全局核心原则:**
1. **绝对零交互:** 弹窗纯视觉展示,绝对不抢夺焦点,不可点击,不可交互。
2. **扁平化频道制:** 弹窗样式与“频道Channel”一对一强绑定。
3. **性能优先:** 具备完善的日志清理与全局熔断保护机制。
---
## 二、 核心模块拆解与业务逻辑
### 模块 1全局设置与托盘 (Tray & Global Settings)
* **系统托盘入口:**
* 左键:呼出主控面板。
* 右键菜单打开主控面板、全局设置、免打扰DND开关、**解除熔断(动态显示,仅熔断时高亮)**、退出软件。
* **全局设置面板:**
* **基础设置:** 开机自启。
* **历史清理策略:** 设定阈值(如保留最近 X 天,或最多保留 X 条),超限自动静默清理。
* **免打扰模式 (DND)** 开启后,所有接收到的消息不触发弹窗,但正常静默写入“历史面板”。
* **防刷屏熔断机制Rate Limit**
* **设定:** 全局阈值(如“每秒最多处理 X 条信息”)。
* **触发表现:** 超限瞬间,系统直接抛弃后续所有新消息(不弹窗、不进历史面板)。
* **熔断通知:** 触发瞬间,系统生成一条不受熔断限制的“系统级弹窗”(固定文案:检测到大量垃圾消息,已开启熔断保护)。
* **解除方式:** 必须由用户手动在“托盘右键菜单”或“全局设置面板”点击【解除熔断】方可恢复。
### 模块 2频道管理 (Channel Management)
* **信息接收匹配逻辑:**
* 采用**“主动创建,严格匹配”**模式。
* 用户需在主控面板新建频道,自定义“频道名”(唯一标识符)。其他应用发来的信息必须包含该频道名。
* **异常处理(严格模式):** 收到未注册/拼写错误的频道信息,直接丢弃不弹窗,并在历史面板记录一条报错日志(标记为:非法来源/未匹配频道)。
* **主控面板列表:** 展示所有已建频道,提供新建、删除、重命名、编辑弹窗样式等基础管理功能。
### 模块 3弹窗样式设计器 (Profile Designer) - 核心
本模块为频道提供独立的样式配置表单。无需“所见即所得”预览,依赖外部发送测试信息验证。
**3.1 弹窗内容构成**
* 仅支持纯文本,严格划分为:**标题Title** 与 **正文Body** 两个区块。不支持图标等非文本元素。
**3.2 UI 配置参数分组**
1. **多屏与位置:** 指定显示器(主屏/副屏1/副屏2...)、屏幕九宫格位置(左上、上中、右下等)、屏幕边距(位置在边中央时为一个值,在角落时为两个值,在屏幕正中央时无需值)。
2. **尺寸与排版:** 宽度、最大高度。
3. **视觉样式:** 内边距、字体类型、字号(标题/正文可分设)、文字颜色、背景颜色与透明度、边框样式/颜色/透明度、整体透明度。
4. **时间与动画:** 存在时间X秒、出现动画淡入/滑入/放大等)、消失动画。
**3.3 高级行为规则多消息堆叠模式3选1**
1. **队列排队:** 同一位置只显 1 条。新消息入队,上一条消失后,下一条按原动画出现。
2. **推挤平移:** 新消息出现将老消息推挤开。**核心细节:**如果新消息先消失,老消息需重新滑回原位置。**边界规则:**无视屏幕物理边界,超限的老消息在屏幕外继续维持其存在时间与坐标逻辑,不强制销毁。
3. **直接覆盖:** 新消息直接替换当前弹窗的标题与正文,并重新开始倒计时。
**3.4 高级行为规则溢出处理模式3选1**
*前提:当正文内容过多,达到设定的“最大高度”时触发。*
1. **截断:** 超出最大高度的内容隐藏,末尾显示“...”。
2. **跑马灯:** 文本在弹窗内匀速滚动。**核心细节(时间动态补偿):**
* 若设定存在时间 < 滚动显示完所需时间:滚动完毕后,停留 X 秒(用户设定)再消失。
* 若设定存在时间 > 滚动显示完所需时间:等待原有存在时间耗尽后再消失。
3. **分割信息:** 严格按“最大高度所能容纳的最大行数”为标准切断。切割后的多段信息,以一定间隔时间(用户设定)依次作为独立弹窗展示。
### 模块 4历史信息面板 (History Panel)
* **数据展示:** 列表形态,字段包含:接收时间、频道来源、状态(成功展示 / 免打扰静默 / 非法拦截)。
* **查询检索:** 支持按时间段、按频道来源、按状态进行高级筛选;支持关键字搜索。
* **交互操作(右键菜单):**
1. **复制完整内容:** 将该条信息的 Title 和 Body 复制到剪贴板。
2. **重新显示该弹窗(复播):** 纯视觉回放,按照该频道当前的样式重新走一遍弹窗流程,**不**在历史面板生成新的接收记录。