指令系统开发说明书
一、目录结构
directive
|__ dependencies 依赖包
|__ modules 公共模块
|__ booter web启动模块
|__ datatables 指令实现模块(项目核心模块)
|__ utils 公共类
|__ gmybatis mybats封装(已停止使用)
|__ message 消息处理模块
|__ mq mq封装
|__ shiro shiro封装
|__ sms 短信发送
|__ validator 参数验证注解
|__ webjars web包
|__ words 分词处理
|__ programs
|__ executor service启动模块
|__ tester 测试
二、模块设计
datatables
|__ com.juzi.datatables
|__ builder 创建指令实体结构
|__ exception 异常实现
|__ expression SQL语句中的表达式实现
|__ handler 指令逻辑处理
|__ impl 指令调用实现
|__ plugin 插件(未实现)
|__ repository 数据库访问
|__ transfers 数据转发
|__ executor SQL执行
|__ utils 公共类
|__ DirectiveService 接口服务类
utils
|__ com.juzi.utils
|__ HttpUitls
|__ JSONRequest
|__ JSONResponse
|__ JSONStatement
|__ KeyConst
|__ TokenHandler
|__ TokenParser
三、关键类说明
com.juzi.datatables.DirectiveEngine 指令引擎
1. 指令调用入口,DirectiveServiceImpl创建实例,调用engine.execute()
3.1类结构
/**
* transfererManager
* 转发管理器
*/
private TransfererManager transfererManager;
/**
* repository
* 数据库访问
*/
private RoutingRepository repository;
/**
* directiveManager
* 指令管理器
*/
/**
创建engine实例,需要spring提供repository和 directiveManager
*/
public DirectiveEngine(RoutingRepository repository, DirectiveManager directiveManager) {
this.repository = repository;
this.directiveManager = directiveManager;
}
/**
*
* @param st 指令参数,继承自JSONRequest,JSON数据结构,至少包括
* name 指令名,没有指令名无法执行
* 其它参数根据SQL的模板来决定
* 如${product_id},则需要一个product_id的参数
* @return JSONResponse 执行结果
* @throws BaseException 指令异常
*/
public JSONResponse execute(final JSONStatement st) throws BaseException {
if (StringUtils.isEmpty(st.getName())) {
st.setName(st.getString("statement"));
}
// 从数据库中获取指令内容
Directive directiveObject = directiveManager.getDirective(st.getName());
if (null == directiveObject) {
throw new BuilderException("No directive named:" + st.getName());
}
if (null == directiveObject.getContext()) {
throw new BuilderException("Directive content null:" + st.getName());
}
JSONResponse response = new JSONResponse();
// 解析指令
String text = directiveObject.getContext().toString();
DirectiveGroup group = Builder.createDirectiveGroup(directiveObject.getName(), text);
for (DirectiveWrapper wrapper : group.getDirectiveList()) {
// 判断命令是否需要执行
if (null != wrapper.getConditions() && !wrapper.getConditions().isEmpty()) {
if (!checkConditions(wrapper.getConditions(), st)) {
continue;
}
}
// 创建Executor
Executor executor = Builder.createExecutor(wrapper, repository.getRepository(st.getDatasource()));
// 执行命令
Object resultObject = executor.execute(st);
Object convertObject = ResultUtils.convert(wrapper.getResultType(), resultObject);
response.put(wrapper.getResultKey(), convertObject);
// Select 获取记录总数
if (executor instanceof SelectExecutor) {
response.setRecordsFiltered(((SelectExecutor) executor).getRecordsFiltered());
response.setRecordsTotal(((SelectExecutor) executor).getRecordsTotal());
}
if (null != wrapper.getTransfer() && null != transfererManager) {
transfererManager.getTransferer().transfer(wrapper.getTransfer(), resultObject);
}
}
return response;
}
四、编译说明
指令系统是一个maven项目,使用默认的maven插件命令即可
4.1 全工程编译[根目录]
1. mvn complie
image
2. install到本地仓库
mvn install
3. deploy到私有仓库
mvn deploy
4.2 编译datatables
同上,只是目录不同
4.3 编译executor
同上,只是目录不同
4.4 更新版本号
mvn versions:set -DnewVersion=${versionCode}
versionCode=你需要设置的版本号
五、流程图
5.1整体流程
st=>start: 开始
e=>end: 结束
op=>operation: 操作
sub=>subroutine: 子程序
cond=>condition: 是或者不是?
io=>inputoutput: 输出
st(right)->op->cond
cond(yes)->io(right)->e
cond(no)->sub(right)->op
网友评论