尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CodeBeamer 二次开发 实现多环境切换Tracker更多按钮菜单项

CodeBeamer 二次开发 实现多环境切换Tracker更多按钮菜单项
📅 发布时间:2026/6/20 0:58:11

CodeBeamer 二次开发 实现多环境切换Tracker更多按钮菜单项

1. 新增YamlLoader.java

package com.intland.codebeamer.config.yaml;import org.yaml.snakeyaml.Yaml;import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;public class YamlLoader {public final static YamlConfig config = YamlLoader.load();public static YamlConfig load() {// 1. 加载 application.ymlMap<String, Object> mainConfig = load("application.yml");Map<String, Object> config = new HashMap<>(mainConfig);// 2. 获取当前激活的环境String activeProfile = getActiveProfile(mainConfig);// 3. 加载对应环境的配置if (activeProfile != null) {Map<String, Object> profileConfig = load("application-" + activeProfile + ".yml");config.putAll(profileConfig);}return new YamlConfig(config);}private static Map<String, Object> load(String filename) {try (InputStream input = YamlLoader.class.getClassLoader().getResourceAsStream(filename)) {if (input != null) {Yaml yaml = new Yaml();return yaml.load(input);}} catch (Exception e) {throw new RuntimeException("读取配置文件失败:" + filename);}return new HashMap<>();}private static String getActiveProfile(Map<String, Object> config) {return getProperty(config, "spring.profiles.active");}public static String getProperty(Map<String, Object> config, String keyPath) {String[] keys = keyPath.split("\\.");Object current = config;for (String key : keys) {if (current instanceof Map) {current = ((Map<?, ?>) current).get(key);} else {return null;}}return (String) current;}}

2.新增YamlConfig.java

package com.intland.codebeamer.config.yaml;import lombok.AllArgsConstructor;import java.util.Map;@AllArgsConstructor
public class YamlConfig {private Map<String, Object> config;public String getProperty(String property) {return YamlLoader.getProperty(config, property);}}

3.新增 TrackerContentMenuProperties.class

package com.intland.codebeamer.config.menu;import com.intland.codebeamer.config.yaml.YamlLoader;public class TrackerContentMenuProperties {public final static String actives = YamlLoader.config.getProperty("cb.tracker.content-menu.actions");}

4. 新增 TestMoreActionMenuBuilder.class

package com.intland.codebeamer.ui.view.actionmenubuilder;import com.intland.codebeamer.persistence.dto.UserDto;
import com.intland.codebeamer.taglib.actionmenu.model.ActionItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.Map;@Component
public class TestMoreActionMenuBuilder extends TrackerListContextActionMenuBuilder {@Autowiredprivate TrackerMoreMenuActionMenuBuilder trackerMoreMenuActionMenuBuilder;public Map<String, ActionItem> doBuild(HttpServletRequest request, UserDto user, Object subject) throws Exception {// 保留原按钮Map<String, ActionItem> actionMap = trackerMoreMenuActionMenuBuilder.doBuild(request, user, subject);// 新增按钮actionMap.put("testView", new ActionItem("tracker.issues.import.label","#",this.createJavascriptUrl("alert('123');"),"tracker.issues.import.tooltip"));return actionMap;}}

5. 新增 application.yml

spring:profiles:active: test

6. 新增 application-test.yml

cb:tracker:content-menu:actions: testView

7. 编译java为class放入codebeamer目录

 将配置文件与编译后的class文件放入 {CB}/tomcat/webapps/cb/WEB-INF/classes/ 中

imageimage

8.修改Tracker更多按钮菜单项

编辑  {CB}\bugs\tracker\includes\initTrackerContextMenu.jsp 文件
在 41行 新增代码

<%@ page import="com.intland.codebeamer.config.menu.TrackerContentMenuProperties" %>
<%pageContext.setAttribute("customActions",TrackerContentMenuProperties.actives);
%>

修改两处 var 为 actionKeys 的 value,加上 ${customActions},

image

 9.修改菜单项接口ActionMenuBuilder参数

编辑  {CB}\bugs\tracker\browseTrackerAjaxActionMenuHandlers.js 文件
修改变量 MORE_MENU_ACTION_MENU_BUILDER 的值为 testMoreActionMenuBuilder

image

10. 重启 codebeamer

11.验证效果

image

 

相关新闻

  • YOLO模型镜像提供Python SDK,封装GPU复杂调用
  • YOLOv9-e-Slim发布!通道剪枝让GPU推理更快
  • UI.Vision RPA:释放工作潜能的终极自动化神器

最新新闻

  • MPC5604P外部中断与DSPI时序参数深度解析与工程实践
  • DFT仿真实战:从STUCK-AT到AT-SPEED的验证要点解析
  • ReadCat安全最佳实践:终极插件安全与用户数据保护指南
  • 2026 上海权威数据 + 真实用户口碑|靠谱空调维修首选上海迪迅通制冷设备 - 星际AI
  • 从零开始:PaddleX如何让AI开发像搭积木一样简单?
  • 抖店无货源铺货怎么不违规?拼多多商品违规检测新手合规教程 - 抖掌柜

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号