# 模块划分

EIP系统划分为五个微服务,通过这五个微服务为用户提供灵活、开放、稳定可靠的企业级业务流程自动化及管理体系。

图 EIP微服务划分
在上图中,红色模块为类库包,蓝色的为系统包。在下表中通过对比几个方面来描述两者之间的区别与联系。
类库包(红色) 系统包(蓝色)
角色 不实现具体的业务功能,每个类库包只提供相对单一的通用功能,例如:缓存处理、附件处理、物理表操作等等。 提供具体的业务功能,比如设计一张表单、配置一个流程、添加一个用户等等。
标准 按照Java interface提供接口或者直接提供实现类供其他包使用 按照http标准提供接口服务
原则 1. 可以依赖另外一个类库包,不能依赖系统包;
2. 可以实现另外一个类库包中的接口;
3. 依赖关系只能单向,不能相互依赖,也不能循环依赖。
1. 只能依赖类库包,不能依赖另外的系统包;
2. 需要用到其他系统包的接口服务时,通过调用http服务实现。
建议 1. 每个包职责相对单一;
2. 一个通用功能有多种实现方式时,定义为接口,通过独立的包来实现接口。
有一些类库包的部分功能也需要发布为http接口服务,可以在类库包中实现功能(实现rest controller),在系统包中装配(扫描对应的controller)

# 技术框架

整个平台采用微服务架构,使用Spring Boot 2.X作为基础框架,其他主要框架如下表所示:

框架 版本 说明
Spring Boot系列 2.0.1.Release 微服务基础框架
Spring Cloud系列 2.0.1.Release 微服务治理框架
Spring Web系列 5.0.5.Release Web框架
MyBatis 3.4.5 ORM框架
PageHelper 5.1.3 分页框架
Druid 1.1.8 数据库连接池
Jackson 2.9.5 Json框架
Groovy 2.1.6 动态脚本框架
Logback 1.2.3 日志框架
Freemarker 2.3.28 模板框架
Swagger 2.8.0 API文档工具框架

# 分层结构

# 微服务端

微服务端采用了标准的Spring MVC三层结构,由dao manager controller标准的三层构成,另外在类库包中对外提供的接口封装了一层service方便其他类库包或系统包引用。

实体层

如下所示,实体类均继承自BaseModel,并指定泛型主键类型,实体类必须使用swagger的注解@ApiModel说明该实体类的作用,所有的属性都用注解@ApiModelProperty进行描述,对于必填的属性需要在注解中注明required=true,对于有可选值得属性可以指定allowableValues进行值范围约束。

dao层

mapper文件的命名方式为 实体类名Mapper.xml 的格式,统一放在每个包的 src/main/resources/mapper 目录下面。mapper文件中namespace指向dao类,dao的命名方式为实体类名Dao.java,如下图所示:

dao文件为一个接口,不是一个实现类,这个接口继承自MyBatisDao,在MyBatisDao中提供了基础的增删改查方法。dao有两个泛型需要指定,第一个泛型是主键的类型,第二个泛型是对应的实体类。

manager层

manager分为接口和实现类,manager的命名方式为实体类名Manager.java,例如BoDefManager接口和BoDefManagerImpl实现类,其中接口扩展自Manager,实现类继承自AbstractManagerImpl类并实现BoDefManager接口。在接口和实现类中均需指定两个泛型,第一个为主键的数据类型,第二个为对应的实体类。

controller层

controller层的命名方式为实体类Controller.java,继承自BaseController,类上有三个注解:

  • @RestController 表明其是一个restful控制类

  • @RequestMapping("/bo/def/v1/") 标明了其映射的路径

  • @Api(tags="BoDefController") 用以生成swagger在线接口文档

在每一个方法上需要添加两个注解:

  • @RequestMapping(value="list", method=RequestMethod.POST, produces={"application/json; charset=utf-8" }) 该方法对应的地址,该方法对应的restful请求类型及支持的数据格式

  • @ApiOperation(value = "获取bo定义列表(带分页信息)", httpMethod = "POST", notes = "获取bo定义列表" 用于生成swagger文档

列表方法使用QueryFilter作为入参,该参数封装了通用查询和分页信息;返回值为PageList<?>,该参数的泛型为对应的实体类,在该返回值中包含了分页信息和列表数据。
方法可以直接throws异常信息,异常消息的处理和记录会统一在BaseController中进行。

特别说明

  1. QueryFilter和PageBean等辅助查询对象只到manager层,不允许在dao层中使用;
  2. PageBean和Page都是分页辅助类,前者用作分页查询使用,后者为返回分页信息使用,构建分页查询条件时使用PageBean,不允许使用Page;
  3. 实体类需要转为json数据,json数据也需要实例化为实体类,整个项目使用jackson作为json处理框架,不允许再引入gson或fastjson;
  4. 实体类与json的转换过程中,有属性不参与转换时在该属性的get方法上添加@JsonIgnore注解;

  1. 实体类与json转换中,有的属性需要另外命名为其他名称时使用@JsonProperty注解。

# 页面端

前端页面采用单页面应用的结构,样式框架采用Bootstrap3 + Font-awesome图标库。JavaScript框架采用了AngularJs 1.5 + jQuery 3.1.1。
整个系统只有一个index.html是完整的页面,通用的css文件和js文件在该页面引入,如下图所示:

其他的功能页面只有html片段,通过ui-router实现前端路由。功能页面的html代码如下图所示。

在ui-router中注册路由时,可以指定页面需要加载的js、css资源,这里指定的资源采用懒加载的方式,只有访问到该页面的时候才会加载这些资源。