禅道开源改造
1、禅道介绍
禅道项目管理软件是第一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、 组织管理于一体,在数据可视化、度量、DevOps、文档资产管理和自动化测试等模块的加持下,禅道软件形成了项目流程管理、DevOps 一体化、自动化测试等三大解决方案,完整的覆盖了产品研发的全生命周期管理,并且有完善的 API 可以调用,在国内深受大量企业喜爱使用。
禅道官网目前存在四个版本:开源版、企业版、旗舰版、云禅道,对于这四个版本之间的差异,不是本文介绍的重点,感兴趣的读者可自行查阅官网介绍
https://www.zentao.net/
很多个人使用者或者中小企业,大多数选用的是开源版,开源版的好处:只有你具备开发能力,可以基于实际不同的项目管理需求,来定制系统功能。当然如果企业不差钱或者没有人手可以定制,可以花点钱购买企业版或旗舰版。
2、禅道二开定制机制
今天我们重点来介绍一下,禅道如何进行功能二开定制。
首先,禅道项目管理软件是使用自主开发的zentaoPHP
框架开发的。zentaoPHP
框架实现了功能强大的扩展机制、API调用机制和命令行机制。您可以使用不同的机制来实现对禅道功能的修改、扩展。也可以和其他的系统进行集成,也可以部署各种自动化脚本对禅道进行各种操作。
zentaoPHP
框架的二次开发机制文档可参考:
1. zentaoPHP框架基本使用手册:http://devel.cnezsoft.com/book/zentaophphelp.html
2. zentaoPHP框架二次开发机制:http://devel.cnezsoft.com/book/extension.html
禅道开源版项目源码:
https://github.com/easysoft/zentaopms
一、顶级目录结构:
二、www目录:
三、module目录:
module目录下面总共有30多个模块,分别对应了禅道里面的某一个功能模块。整个禅道的功能,就是由这些模块组合而成。大部分定制功能代码都是在这个模块下来完成的。
3、一键部署禅道及禅道二开定制示例
接下来,以具体示例演示,如何在禅道里面给BUG自定义字段,其他如产品需求、项目任务定制也是一样的逻辑。
3.1 本地Docker一键搭建禅道环境
docker run --name zentao -p 80:80 -p 3306:3306 -v ~/www/zentaopms:/www/zentaopms -v ~/www/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --restart always -d easysoft/zentao:18.3
禅道服务启动后自带MySQL数据库服务,比如进入MySQL容器内:
查看zt_bug表结构
禅道的数据库命名都比较简明扼要,从字面意思应该都可以猜出来表的用途。如果还不是很清楚的话,可以到每个表对应的模块下面的语言文件里面查找。最新版本可以在禅道后台->二次开发->数据库
中查看相应的表介绍,或直接查看官网文档
https://www.zentao.net/book/zentaopmshelp/157/
3.2 对BUG自定义新增字段
示例: 比如原先提交BUG时,无法记录BUG是在哪个阶段被发现的,那么我们可以通过改造禅道,自定义增加一个【BUG发现阶段】字段
改造定制过程:
1、给数据库zt_bug添加新增字段【BUG发现阶段】
ALTER TABLE zt_bug ADD COLUMN stage VARCHAR(50) AFTER title;
2、修改zentaopms/module/bug/lang/zh-cn.php
如下图,新增Bug发现阶段字段,即在合适的位置插入以下代码
接着如下图,在合适的位置插入以下代码
$lang->bug->stageList['review'] = '评审阶段';
$lang->bug->stageList['dev'] = '开发自测';
$lang->bug->stageList['test'] = '测试验证';
$lang->bug->stageList['acceptance'] = '验收阶段';
$lang->bug->stageList['production'] = '生产阶段';
说明:这里定义的是用于存放对应字段select下拉选框中的数据,当在创建Bug/编辑Bug并保存后,会自动被存储到数据库中。笔者使用的禅道,语言设置的是中文,所以仅修改zh-cn.php
3、修改zentaopms/module/bug/view/create.html.php (BUG新建页面)
<div class='table-col'>
<div class='input-group'>
<span class='input-group-addon fix-border'><?php echo $lang->bug->stage?></span>
<?php echo html::select('stage', $lang->bug->stageList, $stage, "class='form-control chosen'");?>
</div>
</div>
展示效果:
4、修改zentaopms/module/bug/view/edit.html.php (BUG编辑页面)
如下图,在合适的位置插入以下代码:
js::set('stage' , $bug->stage);
如下图,在合适的位置插入以下代码
<tr>
<th><?php echo $lang->bug->stage;?></th>
<td><?php echo html::select('stage', $lang->bug->stageList, $bug->stage, "class='form-control'");?></td>
</tr>
<tr>
效果展示:
5、修改zentaopms/module/bug/view/view.html.php (BUG查看页面)
如下图,在合适的位置插入以下代码:
<tr>
<th><?php echo $lang->bug->stage;?></th>
<td><strong><?php echo zget($lang->bug->stageList, $bug->stage, $bug->stage);?></strong></td>
</tr>
效果展示:
6、bug导出报表中增加新增的自定义字段名称
如下,找到$config->bug->config->exportFields
变量,增加新增的自定义字段名称,解决缺陷导出报表中没有新增字段的问题,如下
展示效果:
7、bug搜索过滤条件中增加新增的自定义字段名称
如下,找到global $lang,在其下方合适的位置新增搜索字段,即我们自定义的字段,并给字段设置可选搜索项,解决缺陷搜索中没有新增字段问题。(需要修改两处地方)
$config->bug->search['fields']['stage'] = $lang->bug->stage;
$config->bug->search['params']['stage'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->bug->stageList);
效果展示:
8、bug生成报表时新增自定义字段
添加完字段后,bug的报表统计中没有该字段的信息,无法按照自定义的字段进行bug分析,如何将自定义的字段添加到BUG的统计报表中去。
首先在zh-cn.php中添加新字段报表信息,打开zh-cn.php文件,添加报表统计字段
$lang->bug->report->charts['bugsPerStage'] = '按Bug发现阶段';
紧接着,添加报表以及图表空对象
$lang->bug->report->bugsPerStage = new stdclass();
$lang->bug->report->bugsPerStage->graph = new stdclass();
添加图表显示字段信息
$lang->bug->report->bugsPerStage->graph->xAxisName = '发现阶段';
其次,在module.php中新增字段统计方法, 编辑module.php信息
/**
* Get report data of bugs stage
* 根据BUG发现阶段获取报表
* @access public
* @rerturn array
*/
public function getDataOfBugsPerStage()
{
$datas = $this->dao->select('stage AS name, COUNT(*) AS value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('name')->orderBy('value DESC')->fetchAll('name');
if(!$datas) return array();
foreach($datas as $stage => $data) if(isset($this->lang->bug->stageList[$stage])) $data->name = $this->lang->bug->stageList[$stage];
return $datas;
}
效果展示: