指令系统

2018-02-07  本文已影响0人  汤小刀

指令系统开发说明书

一、目录结构

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
上一篇下一篇

猜你喜欢

热点阅读