禅道开源改造

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;
  }


效果展示:

posted @ 2024-01-31 11:12  狂师  阅读(1378)  评论(1编辑  收藏  举报