在实际业务当中,我们经常需要初始化一些原子数据,比如模块a-cms内置提供的文章审批工作流定义,再比如更常用的资源定义

一般而言,可以通过模块的Bean组件version.managerinit方法初始化原子数据。由于这种场景非常常见,为了近一步简化开发,CabloyJS4.0引入了静态原子的概念

静态原子的基本逻辑:通过模块的meta文件,定义一组原子数据,系统在启动时,会自动读取静态原子,并写入数据库

此外,通过atomStaticKey + atomRevision的组合,自动判断静态原子是否有变更,如果有变更,就自动更新数据库里的数据

下面以模块a-cms为例,说明静态原子的具体用法

定义静态原子

定义一个静态原子数组。由于工作流定义的内容比较长,所以,这里将工作流定义分为独立的文件

src/module-system/a-cms/backend/src/config/static/flowDefs.js

const articlePublish = require('./flowDef/articlePublish.js');

module.exports = app => {
  const flowDefs = [
    articlePublish(app),
  ];
  return flowDefs;
};

src/module-system/a-cms/backend/src/config/static/flowDef/articlePublish.js

module.exports = app => {
  const moduleInfo = app.meta.mockUtil.parseInfoFromPackage(__dirname);
  const content = {
    listener: null,
    process: {
      nodes: ...,
      edges: ...,
    },
  };
  const definition = {
    atomName: 'CMS Article Publish',
    atomStaticKey: 'flowArticlePublish',
    atomRevision: 0,
    description: '',
    content: JSON.stringify(content),
  };
  return definition;
};
  • 静态原子的属性清单,与方法ctx.bean.atom.write中参数item的属性清单基本一致

  • atomStaticKey:系统会自动添加模块名称作为前缀,从而形成系统唯一的原子Key,比如这里的:a-cms:flowArticlePublish

  • atomRevision: 从0开始。当静态原子有任何属性变更时,将atomRevision依次递增,系统就会自动更新数据库里的数据

注册静态原子

前面定义好一组静态原子,接下来就需要在模块的meta文件中进行注册

src/module-system/a-cms/backend/src/meta.js

const staticFlowDefs = require('./config/static/flowDefs.js')(app);

const meta = {
  base: {
    statics: {
      'a-flow.flowDef': {
        items: staticFlowDefs,
      },
    },
  },
};
名称 说明
a-flow.flowDef 原子类型的全称。在这里,原子类型flowDef是由模块a-flow提供的
items 静态原子数组