搭建 .NET 8 WPF 应用骨架,加入系统托盘、单实例启动与主控制面板。 实现本地 HTTP /notify 消息接入、频道严格匹配、免打扰、熔断限流与历史持久化。 补充弹窗样式配置、队列/推挤/替换展示、溢出处理、应用图标和项目文档。 Initial-Commit: true
68 lines
5.3 KiB
Markdown
68 lines
5.3 KiB
Markdown
# 📦 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. **重新显示该弹窗(复播):** 纯视觉回放,按照该频道当前的样式重新走一遍弹窗流程,**不**在历史面板生成新的接收记录。
|