# 模块划分
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中进行。
特别说明
- QueryFilter和PageBean等辅助查询对象只到manager层,不允许在dao层中使用;
- PageBean和Page都是分页辅助类,前者用作分页查询使用,后者为返回分页信息使用,构建分页查询条件时使用PageBean,不允许使用Page;
- 实体类需要转为json数据,json数据也需要实例化为实体类,整个项目使用jackson作为json处理框架,不允许再引入gson或fastjson;
- 实体类与json的转换过程中,有属性不参与转换时在该属性的get方法上添加@JsonIgnore注解;
- 实体类与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资源,这里指定的资源采用懒加载的方式,只有访问到该页面的时候才会加载这些资源。