<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>Halo - 强大易用的开源建站工具 | 应用市场 | 全能右键 | 版本发布</title><link>https://www.halo.run</link><atom:link href="https://www.halo.run/feed/app-store/apps/app-v6yiklcj/releases.xml" rel="self" type="application/rss+xml"/><description>Halo - 强大易用的开源建站工具 | 应用市场 | 全能右键 | 版本发布</description><generator>Halo v2.25.4</generator><language>zh-cn</language><image><url>https://www.halo.run/upload/logo.png</url><title>Halo - 强大易用的开源建站工具 | 应用市场 | 全能右键 | 版本发布</title><link>https://www.halo.run</link></image><lastBuildDate>Sat, 11 Jul 2026 08:20:45 GMT</lastBuildDate><follow_challenge><feedId>69597013489248256</feedId><userId>41706424548048896</userId></follow_challenge><item><title><![CDATA[全能右键 1.0.0-beta1 发布]]></title><link>https://www.halo.run/store/apps/app-v6yiklcj/releases/app-release-ltxoruic</link><description><![CDATA[<img src="https://www.halo.run/plugins/feed/assets/telemetry.gif?title=%E5%85%A8%E8%83%BD%E5%8F%B3%E9%94%AE%201.0.0-beta1%20%E5%8F%91%E5%B8%83&amp;url=/store/apps/app-v6yiklcj/releases/app-release-ltxoruic" width="1" height="1" alt="" style="opacity:0;">
<h1 id="%E5%85%A8%E8%83%BD%E5%8F%B3%E9%94%AE" tabindex="-1">全能右键</h1>
<p>为 Halo 主题页面注入一套可配置的自定义右键菜单。插件通过 Halo 的 <code>TemplateHeadProcessor</code> 自动注入运行时资源，不需要改主题模板。</p>
<h2 id="%E4%BA%A4%E6%B5%81%E7%BE%A4" tabindex="-1">交流群</h2>
<p><a href="https://qm.qq.com/q/wuC7NZr0sw">点击链接加入群聊【halo博客-lywq插件】</a></p>
<img src="https://www.halo.run/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fbf162401-07fd-49ec-b50f-5218c9510937&amp;size=m" style="height: 400px !important; width: auto; object-fit: contain;">
<h2 id="%E5%8A%9F%E8%83%BD%E7%89%B9%E6%80%A7" tabindex="-1">功能特性</h2>
<ul>
 <li>自定义右键菜单：支持通用、选中文本、链接、图片 4 类显示场景。</li>
 <li>内置常用动作：复制页面链接、复制标题和链接、复制选中文本、复制图片地址、打开图片、复制链接地址、打开链接、返回顶部、刷新页面、返回首页、搜索、自定义链接。</li>
 <li>可选插件联动：支持会员收藏、会员签到、友链自助提交。</li>
 <li>路径控制：支持启用路径、排除路径，并且排除规则优先。</li>
 <li>样式配置：支持浅色、深色、跟随系统，支持强调色、菜单宽度、圆角配置。</li>
 <li>PJAX 兼容：监听 <code>pjax:complete</code>、<code>pjax:end</code>、<code>turbo:load</code>、<code>swup:contentReplaced</code> 后重新初始化。</li>
 <li>编辑区域保护：可在输入框、文本域、可编辑区域保留浏览器原生右键菜单。</li>
</ul>
<h2 id="%E5%85%BC%E5%AE%B9%E8%A6%81%E6%B1%82" tabindex="-1">兼容要求</h2>
<table>
 <thead>
  <tr>
   <th>项目</th>
   <th>要求</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>Halo</td>
   <td><code>&gt;= 2.25.0</code></td>
  </tr>
  <tr>
   <td>Java</td>
   <td>21</td>
  </tr>
  <tr>
   <td>Node.js</td>
   <td>推荐 24，CI 使用 24</td>
  </tr>
  <tr>
   <td>pnpm</td>
   <td>推荐 10，项目锁定 <code>pnpm@10.12.4</code></td>
  </tr>
 </tbody>
</table>
<p>可选依赖：</p>
<table>
 <thead>
  <tr>
   <th>插件</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>PluginMember &gt;= 1.1.4-alpha6</code></td>
   <td>会员收藏、会员签到</td>
  </tr>
  <tr>
   <td><code>LinksSubmit &gt;= 2.3.5</code></td>
   <td>申请友链</td>
  </tr>
 </tbody>
</table>
<p>这些依赖是可选的。没装也能使用基础右键功能，只是对应菜单项会提示依赖不可用。</p>
<h2 id="%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8" tabindex="-1">安装使用</h2>
<ol>
 <li>从 GitHub Release 下载插件 JAR。</li>
 <li>进入 Halo 控制台，打开“插件”页面。</li>
 <li>上传并启用插件。</li>
 <li>进入插件设置页，按需调整启用路径、菜单项和样式。</li>
 <li>回到前台主题页面，右键检查菜单是否出现。</li>
</ol>
<p>本地构建安装：</p>
<pre><code class="language-bash">./gradlew build
</code></pre>
<p>构建产物位于 <code>build/libs</code>，上传生成的 JAR 即可。</p>
<h2 id="%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">配置说明</h2>
<h3 id="%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE" tabindex="-1">基本设置</h3>
<table>
 <thead>
  <tr>
   <th>配置项</th>
   <th>说明</th>
   <th>默认值</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>启用全能右键</td>
   <td>总开关，关闭后不注入右键菜单</td>
   <td>开启</td>
  </tr>
  <tr>
   <td>启用路径</td>
   <td>留空表示全站主题页面启用</td>
   <td><code>[]</code></td>
  </tr>
  <tr>
   <td>排除路径</td>
   <td>命中后不启用，优先级高于启用路径</td>
   <td><code>/console/**</code>、<code>/uc/**</code>、<code>/apis/**</code></td>
  </tr>
  <tr>
   <td>PJAX 兼容模式</td>
   <td>前台路由切换后重新读取配置并初始化</td>
   <td>开启</td>
  </tr>
  <tr>
   <td>编辑区域保留系统右键</td>
   <td>输入框、文本域、可编辑区域不拦截右键</td>
   <td>开启</td>
  </tr>
 </tbody>
</table>
<h3 id="%E8%B7%AF%E5%BE%84%E8%A7%84%E5%88%99" tabindex="-1">路径规则</h3>
<p>支持以下写法：</p>
<table>
 <thead>
  <tr>
   <th>写法</th>
   <th>示例</th>
   <th>含义</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>精确路径</td>
   <td><code>/about</code></td>
   <td>仅匹配 <code>/about</code></td>
  </tr>
  <tr>
   <td>递归匹配</td>
   <td><code>/posts/**</code></td>
   <td>匹配 <code>/posts</code> 以及 <code>/posts/hello</code>、<code>/posts/a/b</code></td>
  </tr>
  <tr>
   <td>单层匹配</td>
   <td><code>/photos/*</code></td>
   <td>匹配 <code>/photos/a</code>，不匹配 <code>/photos/a/b</code></td>
  </tr>
  <tr>
   <td>路径变量</td>
   <td><code>/archives/{slug}</code></td>
   <td>匹配 <code>/archives/hello</code></td>
  </tr>
 </tbody>
</table>
<p>排除规则永远优先。比如启用路径配置 <code>/posts/**</code>，排除路径配置 <code>/posts/private/**</code>，那么 <code>/posts/private/secret</code> 不会启用菜单。</p>
<h3 id="%E8%8F%9C%E5%8D%95%E9%A1%B9%E5%AD%97%E6%AE%B5" tabindex="-1">菜单项字段</h3>
<table>
 <thead>
  <tr>
   <th>字段</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>enabled</code></td>
   <td>是否启用当前菜单项</td>
  </tr>
  <tr>
   <td><code>id</code></td>
   <td>菜单项标识，留空会自动生成</td>
  </tr>
  <tr>
   <td><code>label</code></td>
   <td>菜单显示名称</td>
  </tr>
  <tr>
   <td><code>action</code></td>
   <td>点击后执行的动作</td>
  </tr>
  <tr>
   <td><code>context</code></td>
   <td>显示场景：<code>common</code>、<code>text</code>、<code>link</code>、<code>image</code></td>
  </tr>
  <tr>
   <td><code>icon</code></td>
   <td>图标，推荐使用 Iconify 名称，例如 <code>ri:link</code></td>
  </tr>
  <tr>
   <td><code>url</code></td>
   <td>自定义链接动作使用</td>
  </tr>
  <tr>
   <td><code>target</code></td>
   <td>打开方式：<code>_self</code> 或 <code>_blank</code></td>
  </tr>
  <tr>
   <td><code>order</code></td>
   <td>排序值，越小越靠前</td>
  </tr>
 </tbody>
</table>
<p>图标支持 Iconify 名称、<code>http(s)</code> 图片地址、站内绝对路径、<code>data:image/*</code> 和内联 SVG。默认菜单使用的部分 Remix Icon 会内置为 SVG，其他 Iconify 图标会从 <code>https://api.iconify.design</code> 加载。</p>
<h3 id="%E5%86%85%E7%BD%AE%E5%8A%A8%E4%BD%9C" tabindex="-1">内置动作</h3>
<table>
 <thead>
  <tr>
   <th>动作</th>
   <th>显示场景建议</th>
   <th>行为</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>copyPageLink</code></td>
   <td><code>common</code></td>
   <td>复制当前页面链接</td>
  </tr>
  <tr>
   <td><code>copyPageTitleLink</code></td>
   <td><code>common</code></td>
   <td>复制当前页面标题和链接</td>
  </tr>
  <tr>
   <td><code>copySelection</code></td>
   <td><code>text</code></td>
   <td>复制当前选中的文本</td>
  </tr>
  <tr>
   <td><code>copyImageUrl</code></td>
   <td><code>image</code></td>
   <td>复制当前图片地址</td>
  </tr>
  <tr>
   <td><code>openImage</code></td>
   <td><code>image</code></td>
   <td>打开当前图片</td>
  </tr>
  <tr>
   <td><code>copyLinkUrl</code></td>
   <td><code>link</code></td>
   <td>复制当前链接地址</td>
  </tr>
  <tr>
   <td><code>openLink</code></td>
   <td><code>link</code></td>
   <td>打开当前链接</td>
  </tr>
  <tr>
   <td><code>scrollTop</code></td>
   <td><code>common</code></td>
   <td>平滑返回页面顶部</td>
  </tr>
  <tr>
   <td><code>reload</code></td>
   <td><code>common</code></td>
   <td>刷新当前页面</td>
  </tr>
  <tr>
   <td><code>home</code></td>
   <td><code>common</code></td>
   <td>跳转到 <code>/</code></td>
  </tr>
  <tr>
   <td><code>search</code></td>
   <td><code>common</code> 或 <code>text</code></td>
   <td>有选中文本时跳转到 <code>/search?keyword=...</code>，否则跳转到 <code>/search</code></td>
  </tr>
  <tr>
   <td><code>customLink</code></td>
   <td><code>common</code></td>
   <td>打开自定义链接</td>
  </tr>
  <tr>
   <td><code>memberFavorite</code></td>
   <td><code>common</code></td>
   <td>调用会员插件收藏能力</td>
  </tr>
  <tr>
   <td><code>memberSignIn</code></td>
   <td><code>common</code></td>
   <td>调用会员插件签到能力</td>
  </tr>
  <tr>
   <td><code>openLinksSubmit</code></td>
   <td><code>common</code></td>
   <td>打开友链自助提交弹窗</td>
  </tr>
 </tbody>
</table>
<p><code>customLink</code> 的 <code>url</code> 支持占位符：</p>
<pre><code class="language-text">{url}        当前页面链接，已 URL 编码
{title}      当前页面标题，已 URL 编码
{selection}  当前选中文本，已 URL 编码
</code></pre>
<p>示例：</p>
<pre><code class="language-text">https://example.com/share?title={title}&amp;url={url}
</code></pre>
<h2 id="%E5%8F%AF%E9%80%89%E6%8F%92%E4%BB%B6%E8%81%94%E5%8A%A8" tabindex="-1">可选插件联动</h2>
<h3 id="%E4%BC%9A%E5%91%98%E6%94%B6%E8%97%8F" tabindex="-1">会员收藏</h3>
<p><code>memberFavorite</code> 会优先使用当前 Halo 文章上下文作为收藏对象。插件会从主题模板变量 <code>post</code> 中读取：</p>
<ul>
 <li><code>metadata.name</code></li>
 <li><code>spec.title</code></li>
 <li><code>status.permalink</code></li>
 <li><code>spec.cover</code></li>
</ul>
<p>如果当前页面没有 <code>post</code> 变量，运行时会尝试读取页面中的 <code>data-member-favorite-subject</code> 作为备用文章标识。</p>
<h3 id="%E4%BC%9A%E5%91%98%E7%AD%BE%E5%88%B0" tabindex="-1">会员签到</h3>
<p><code>memberSignIn</code> 会等待会员插件前台 API 就绪，再执行签到。用户未登录时会跳转到登录页。</p>
<h3 id="%E5%8F%8B%E9%93%BE%E8%87%AA%E5%8A%A9%E6%8F%90%E4%BA%A4" tabindex="-1">友链自助提交</h3>
<p><code>openLinksSubmit</code> 会尝试调用 <code>window.LinksSubmit.openLinksSubmitOverlay()</code>，也兼容 <code>window.openLinksSubmitOverlay()</code>。如果主题页面没有注入友链弹窗，会提示“友链申请弹窗未注入”。</p>
<h2 id="%E4%B8%BB%E9%A2%98%E5%85%BC%E5%AE%B9%E8%AF%B4%E6%98%8E" tabindex="-1">主题兼容说明</h2>
<p>插件会向主题页面 <code>&lt;head&gt;</code> 注入：</p>
<ul>
 <li><code>/plugins/right-menu/assets/static/right-menu/right-menu.css</code></li>
 <li>内联 JSON 配置脚本 <code>#right-menu-config</code></li>
 <li><code>/plugins/right-menu/assets/static/right-menu/right-menu.js</code></li>
</ul>
<p>默认不会在 <code>/console/**</code>、<code>/uc/**</code>、<code>/apis/**</code> 生效。右键菜单挂载在 <code>document.body</code> 下，层级较高，通常不需要主题额外适配。</p>
<p>如果菜单没有显示，优先检查：</p>
<ol>
 <li>插件是否启用。</li>
 <li>当前路径是否被排除规则命中。</li>
 <li>主题页面源码中是否存在 <code>right-menu-config</code> 和 <code>right-menu-runtime</code>。</li>
 <li>浏览器控制台是否能访问 <code>/plugins/right-menu/assets/static/right-menu/right-menu.js</code>。</li>
 <li>当前右键位置是否在输入框、文本域或可编辑区域。</li>
</ol>
<h2 id="%E5%BC%80%E5%8F%91" tabindex="-1">开发</h2>
<p>启动 Halo 开发环境：</p>
<pre><code class="language-bash">./gradlew haloServer
</code></pre>
<p>前端依赖安装与监听构建：</p>
<pre><code class="language-bash">cd ui
pnpm install
pnpm dev
</code></pre>
<p>项目结构：</p>
<table>
 <thead>
  <tr>
   <th>路径</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>src/main/resources/plugin.yaml</code></td>
   <td>插件元信息、Halo 版本要求、可选依赖</td>
  </tr>
  <tr>
   <td><code>src/main/resources/extensions/settings.yaml</code></td>
   <td>插件设置表单</td>
  </tr>
  <tr>
   <td><code>src/main/resources/extensions/reverseProxy.yaml</code></td>
   <td>静态资源反向代理</td>
  </tr>
  <tr>
   <td><code>src/main/java/site/muyin/rightmenu/processor/RightMenuHeadProcessor.java</code></td>
   <td>主题 <code>&lt;head&gt;</code> 注入入口</td>
  </tr>
  <tr>
   <td><code>src/main/java/site/muyin/rightmenu/setting/RightMenuSetting.java</code></td>
   <td>设置模型与默认菜单</td>
  </tr>
  <tr>
   <td><code>src/main/java/site/muyin/rightmenu/support/RightMenuPathMatcher.java</code></td>
   <td>路径匹配规则</td>
  </tr>
  <tr>
   <td><code>src/main/java/site/muyin/rightmenu/support/RightMenuPostContextExtractor.java</code></td>
   <td>文章上下文提取</td>
  </tr>
  <tr>
   <td><code>src/main/java/site/muyin/rightmenu/template/RightMenuHtmlTpl.java</code></td>
   <td>注入 HTML 片段生成</td>
  </tr>
  <tr>
   <td><code>src/main/resources/static/right-menu/right-menu.js</code></td>
   <td>前台运行时</td>
  </tr>
  <tr>
   <td><code>src/main/resources/static/right-menu/right-menu.css</code></td>
   <td>前台样式</td>
  </tr>
  <tr>
   <td><code>ui/src/__tests__/right-menu-runtime.test.ts</code></td>
   <td>前台运行时单元测试</td>
  </tr>
 </tbody>
</table>
<p>常用命令：</p>
<pre><code class="language-bash"># 后端单元测试
./gradlew test

# 后端 + 前端校验
./gradlew check

# 完整构建插件 JAR
./gradlew build

# 前端运行时测试
cd ui
pnpm test:unit
</code></pre>
<p><code>./gradlew build</code> 会先执行 <code>ui</code> 模块的 <code>assemble</code>，再把前端产物复制到插件资源目录。</p>
<h2 id="%E5%8F%91%E5%B8%83" tabindex="-1">发布</h2>
<ol>
 <li>更新 <code>gradle.properties</code> 中的 <code>version</code>。</li>
 <li>执行 <code>./gradlew check</code> 和 <code>./gradlew build</code>。</li>
 <li>创建 GitHub Release。</li>
 <li>CD 工作流会构建并上传插件产物；当前配置默认跳过 Halo 应用市场发布。</li>
</ol>
<h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2>
<h3 id="%E8%8F%9C%E5%8D%95%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%88%96%E7%94%A8%E6%88%B7%E4%B8%AD%E5%BF%83%E4%B8%8D%E6%98%BE%E7%A4%BA" tabindex="-1">菜单在控制台或用户中心不显示</h3>
<p>这是默认行为。插件默认排除了 <code>/console/**</code> 和 <code>/uc/**</code>，避免影响 Halo 后台和用户中心。</p>
<h3 id="%E5%9B%BE%E7%89%87%E6%88%96%E9%93%BE%E6%8E%A5%E8%8F%9C%E5%8D%95%E9%A1%B9%E4%B8%8D%E5%87%BA%E7%8E%B0" tabindex="-1">图片或链接菜单项不出现</h3>
<p>菜单项按 <code>context</code> 判断是否显示。<code>image</code> 只在图片上右键出现，<code>link</code> 只在链接上右键出现，<code>text</code> 需要页面存在选中文本。</p>
<h3 id="%E5%A4%8D%E5%88%B6%E5%A4%B1%E8%B4%A5" tabindex="-1">复制失败</h3>
<p>插件优先使用 <code>navigator.clipboard.writeText</code>，失败后会回退到 <code>document.execCommand('copy')</code>。如果浏览器权限、非安全上下文或主题脚本拦截复制行为，仍可能失败。</p>
<h3 id="iconify-%E5%9B%BE%E6%A0%87%E4%B8%8D%E6%98%BE%E7%A4%BA" tabindex="-1">Iconify 图标不显示</h3>
<p>默认内置图标不依赖网络。非内置 Iconify 图标会请求 <code>https://api.iconify.design</code>，如果站点网络策略拦截该域名，建议改用站内图片路径或内联 SVG。</p>
<h3 id="%E4%BC%9A%E5%91%98%E6%94%B6%E8%97%8F%E6%8F%90%E7%A4%BA%E6%B2%A1%E6%9C%89%E5%8F%AF%E6%94%B6%E8%97%8F%E7%9A%84%E6%96%87%E7%AB%A0" tabindex="-1">会员收藏提示没有可收藏的文章</h3>
<p>当前页面需要是 Halo 文章页，并且主题上下文里存在 <code>post</code> 变量；或者页面中提供 <code>data-member-favorite-subject</code> 作为备用文章标识。</p>
<h2 id="%E8%AE%B8%E5%8F%AF%E8%AF%81" tabindex="-1">许可证</h2>
<p><a href="https://www.halo.run/./LICENSE">GPL-3.0</a> © Lywq</p>
<hr>
<p><a href="https://www.halo.run/store/apps/app-v6yiklcj/releases/app-release-ltxoruic">查看版本详情</a></p>]]></description><guid isPermaLink="false">store.halo.run/Release/app-release-ltxoruic</guid><pubDate>Tue, 23 Jun 2026 06:50:32 GMT</pubDate></item></channel></rss>