智慧菜单:核心逻辑备忘录

信息发布 · 36 次浏览
韩道友 创建于 9天4小时前

(这是生成菜单树的核心逻辑,方便后续维护,特此记录!)

1. 身份判定:容器 vs 叶子

这是逻辑的起点,决定了节点如何处理判定条件:

  • 容器(Container):只要该节点有子菜单,它就是容器。它不看自己的匹配规则(URL/标题/文本)。它的存活完全取决于:“我的子孙里还有活着的吗?”

  • 叶子(Leaf/执行项):没有子菜单的最终执行节点。它的存活取决于:“我是否完全符合当前的物理环境?”


2. 五维空间过滤(物理环境匹配)

对于叶子节点,必须通过以下所有“安检”才能存活:

维度 对应字段 过滤逻辑
场景标签 Tags 节点的标签库中必须包含当前环境激活的标签(如 chrome, file, global 等)。
文件路径 matchExt / matchPath 如果设置了,当前选中的文件后缀或路径必须符合正则匹配。
浏览器网址 matchUrl 在浏览器环境下,当前 Tab 的 URL 必须包含字段定义的关键词(如 taobao.com)。
窗口标题 matchTitle 当前活动窗口的 Title 必须符合正则匹配(如 旺店通, Photoshop)。
选中文本 matchText 如果设置了,选中的内容必须符合定义的正则(如匹配商品 ID 的数字)。

特殊规则:文本强制过滤

若节点拥有 text 标签,但当前并未选中文本,该节点会强制隐藏,防止文本工具在非编辑场景下霸占菜单。


3. 递归存活协议(自下而上)

这是解决你提到的“父子显示冲突”的关键:

  1. 标签链条一致性:递归过程中,每一层都会检查 Tags。只有子项包含了当前场景标签(或父级的 UUID 标签),它才被允许进入候选名单。

  2. 存活向上汇报

    • 底层叶子节点进行“五维过滤”。

    • 通过过滤的叶子向父级报告:“我活着”。

    • 父级(容器)收到至少一个“活着的报告”,自己才会被渲染。

    • 如果子项全军覆没,父级即便标签匹配也会销毁自身


4. 排序与进化(智能排序)

对于最终存活下来的节点,会根据热度算法进行排序:

  • 半衰期算法:利用 usageCount(使用次数)和 updatedAt(更新时间)。

  • 权重逻辑:最近常用的功能排在前面,久不使用的功能会随时间流逝逐渐下沉。


5. 数据动态注入

  • 占位符替换:如果叶子节点是 action(动作)类型且 Data 为空,脚本会自动将 selectedText(选中文本)注入到 Data 中。这让你在查商品、查订单时,点一下就自动带入参数。


逻辑速记口诀

容器看子项,叶子看环境。

标签是门票,正则定生死。

文本没选中,text 标签全清空。

常用排在前,老旧后面站。


维护提醒

如果你发现某个菜单(如“多功能查询”)在不该出现的时候出现了,按以下步骤排查:

  1. 查标签:子项是否有不属于该环境的标签(如 chrome)?

  2. 查条件:子项是否漏设了 matchTextmatchUrl

  3. 查 UUID 关联:子项的 Tags 里是否正确关联了父项的 uuid

这个逻辑确保了你的 e-commerce 菜单(如商品下载、订单登记)只在淘宝/天猫后台且标签匹配时浮现,保持界面的极简高效。

韩道友 最后更新于 2026/4/23

回复内容
暂无回复
回复主贴