Skip to content

feat(custom-menu): 自定义菜单项支持选择打开方式(内嵌/跳转/新标签页)#3027

Open
bwliangc wants to merge 2 commits into
Wei-Shaw:mainfrom
bwliangc:feat/custom-menu-open-mode
Open

feat(custom-menu): 自定义菜单项支持选择打开方式(内嵌/跳转/新标签页)#3027
bwliangc wants to merge 2 commits into
Wei-Shaw:mainfrom
bwliangc:feat/custom-menu-open-mode

Conversation

@bwliangc

@bwliangc bwliangc commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

自定义菜单项支持选择打开方式(内嵌 / 跳转 / 新标签页)

背景 / Motivation

自定义菜单项此前固定以应用内 iframe 内嵌方式打开外部网址。但部分网址不允许被 iframe 嵌入(X-Frame-Options / CSP frame-ancestors),或本身更适合整页打开。本 PR
为每个自定义菜单项增加「打开方式」选项,让管理员自行选择。

改动 / Changes

CustomMenuItem 新增 open_mode 字段,三选一:

取值 行为
embed(默认) 应用内 iframe 打开,保持原 /custom/:id 行为
redirect 当前标签页直接跳转到该网址
newtab 浏览器新标签页打开(target="_blank" + rel="noopener noreferrer"

Markdown 页面(md: 前缀)始终走应用内渲染,不受该选项影响。

后端

  • dto.CustomMenuItem 新增 OpenMode stringjson:"open_mode,omitempty")。
  • 持久化(marshal)与公开设置过滤(filterUserVisibleMenuItems 经原始 JSON 透传)均完整保留该字段。

前端

  • 管理端「自定义菜单页面」设置项新增「打开方式」下拉选择,并补充中/英文案与说明。
  • 加载旧数据时将缺失的 open_mode 归一化为 embed,保证 <select> 绑定有匹配项。
  • 侧边栏:对 redirect/newtab 的 http(s) 外链渲染为 <a>(复用 buildEmbeddedUrl,携带 token/user_id/theme/lang 等用户上下文参数),其余仍为
    <router-link>。三处导航渲染块(管理员主菜单、管理员个人区、普通用户)统一通过 <component :is> 切换。

兼容性 / Backward Compatibility

  • open_mode 为可选字段,omitempty;存量菜单项无该字段时默认 embed,行为与改动前完全一致。
  • 公开设置(/api/v1/.../public)的 API 契约不变(字段新增且可选)。

测试 / Testing

  • 后端:go build ./... 通过;internal/handler/dtointernal/handler/admin 包测试通过。
  • 前端:vue-tsc --noEmit 0 错误;SettingsViewAppSidebar、stores 等相关单测全部通过。

已知边界 / Notes

直接访问 redirect/newtab 菜单项的 /custom/:id(如旧书签)仍会回退到 iframe 内嵌展示——这是合理兜底。主入口(侧边栏)已正确渲染为外链。

截图 / Screenshots

image image

bwliangc and others added 2 commits June 4, 2026 11:39
为每个自定义菜单项新增 open_mode 选项:
- embed(默认):应用内 iframe 打开,保持原 /custom/:id 行为
- redirect:当前标签页直接跳转到该网址
- newtab:浏览器新标签页打开

Markdown 页面(md: 前缀)始终走应用内渲染,不受影响。

后端:CustomMenuItem 增加 OpenMode 字段并在保存时校验取值;
持久化与公开设置过滤均保留该字段。
前端:管理端设置页新增「打开方式」下拉选择与中英文案;
侧边栏对 redirect/newtab 的 http(s) 外链渲染为 <a>(携带
用户上下文参数,复用 buildEmbeddedUrl),按需带 target/rel。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
为每个自定义菜单项新增 with_user_params 开关,控制打开网址时
是否附加用户上下文参数(token、user_id、theme、lang 等):
- 开启(默认):复用 buildEmbeddedUrl 附加参数,保持原有行为
- 关闭:使用原始网址打开

对三种打开方式(embed/redirect/newtab)均生效。后端 DTO 用 *bool,
nil(旧数据)视为开启以保持向后兼容;前端管理端加载旧数据时归一化为
开启。管理端设置页以 Toggle 呈现,并补充中英文案。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant