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

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

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

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

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

定义静态原子

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

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

  1. 1const articlePublish = require('./flowDef/articlePublish.js');
  2. 2
  3. 3module.exports = app => {
  4. 4 const flowDefs = [
  5. 5 articlePublish(app),
  6. 6 ];
  7. 7 return flowDefs;
  8. 8};

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

  1. 1module.exports = app => {
  2. 2 const moduleInfo = app.meta.mockUtil.parseInfoFromPackage(__dirname);
  3. 3 const content = {
  4. 4 listener: null,
  5. 5 process: {
  6. 6 nodes: ...,
  7. 7 edges: ...,
  8. 8 },
  9. 9 };
  10. 10 const definition = {
  11. 11 atomName: 'CMS Article Publish',
  12. 12 atomStaticKey: 'flowArticlePublish',
  13. 13 atomRevision: 0,
  14. 14 description: '',
  15. 15 content: JSON.stringify(content),
  16. 16 };
  17. 17 return definition;
  18. 18};
名称 说明
atomName 原子数据的标题
atomStaticKey 系统会自动添加模块名称作为前缀,从而形成系统唯一的原子Key,比如这里的:a-cms:flowArticlePublish
atomRevision 从0开始。当静态原子有任何属性变更时,将atomRevision依次递增,系统就会自动更新数据库里的数据
  • 更多属性字段:不同的原子类型有不同的业务字段,都可以在这里设置,与方法ctx.bean.atom.write中参数item的字段清单一致,请参见:原子操作

注册静态原子

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

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

  1. 1const staticFlowDefs = require('./config/static/flowDefs.js')(app);
  2. 2
  3. 3const meta = {
  4. 4 base: {
  5. 5 statics: {
  6. 6 'a-flow.flowDef': {
  7. 7 items: staticFlowDefs,
  8. 8 },
  9. 9 },
  10. 10 },
  11. 11};
名称 说明
a-flow.flowDef 原子类型的全称。在这里,原子类型flowDef是由模块a-flow提供的
items 静态原子数组