redmine的工单查询模块

大家好:

       查询功能是redmine中使用频率非常高的一个功能,但是实现起来又相对较复杂,今天R队就以query功能模块为例,跟大家讲一讲如何对Redmine的功能模块进行分析。

一. 业务流程分析

    工单查询模块的主要功能就是根据我们在页面选择的各种查询条件,筛选出订单,然后以列表展示。其中支持的可选条件包括:

  • 过滤器:支持选择Issue的一个或多个字段作为过滤条件进行查询
  • 展示列:可以选择列表中要展示Issue的哪些字段
  • 条件分组:支持选择一个字段,列表会根据此字段把Issue分组展示,且展示每个组的Issue总数

       我们在页面上选择的这些查询条件,都会以GET参数的形式传递给Controller,Controller会创建一个Query来对这些条件进行处理,并查询出我们需要的订单,再交给View进行渲染和展示。整体流程如下:


二. 代码分析

具体的代码实现比较复杂,但是总体而言涉及到以下几个模块的调用:

  • IssueController:任务发起者,调用栈的源头
  • Query:查询的基类,负责处理主要的查询逻辑
  • IssueQuery:继承自Query,负责处理与Issue相关的特殊逻辑
  • QueryColumn:所有查询中需要用到的字段,是通过这个类来包装的,每个实例对应一个具体字段
  • QueryCustomFieldColumn:继承自QueryColumn,专门用于处理自定义属性的查询,同时每个实例都是对一个CustomField对象的包装

关系如下图:


具体的方法调用栈见下图:


  查询的发起是由IssueController触发的,并且最终的结果也会返回给IssueController,然后在View中渲染。

  • 上方蓝色的方法,都是在Controller或相应的helper中调用的,也是整个查询业务的主流程。

  • 绿色的方法都是由IssueQuery所定义的,会处理一部分Issue相关的逻辑,但是主要查询还是由Query完成的
  • 紫色的方法是由Query所定义的,用于处理查询的最核心逻辑。其中又有两个方法最为关键

三. 总结

    整个Query模块的设计,感觉非常符合面向对象解耦的设计思想,每个类都只负责自己处理的事情,IssueQuery负责拼接查询issue的语句,Query则负责处理参数到SQL语句的转化。而每个字段的查询逻辑,都是由他们自己所属的类型决定的,QueryColumn只是对他们进行了包装。

    如果不追求完美设计的话,整个功能其实可以做的非常简单,所有字段的逻辑都可以放在Query中处理,甚至都不需要QueryColumn类,但是如果真这样的话,整个程序的可扩展性和可读性会下降很多。

    在Redmine中很多模块都是像这样按照解耦进行设计的,所以整体的可扩展性非常好。如果大家觉得理解起来有些困难,建议多去了解一些面向对象的基本思想,推荐一本书《松本行弘的程序世界》,里面的第二章对面向对象思想有一些很清楚的解释,可以参考。




猜你喜欢

转载自blog.csdn.net/weixin_42463677/article/details/80996061