原子标记的意义
可以通过两个场景来说明原子标记
的意义
不使用原子标记
定义一种场景需求,其流程及权限设计如下:
- 用户新建
party
原子条目,此时处于草稿
状态 - 提交原子条目后,处于
正常
状态 - 在
正常
状态下,被授予read
权限的用户可以查看此原子条目 - 在
正常
状态下,被授予print
权限的用户可以print
此原子条目
对于扩展指令
print
而言,就不需要设置原子标记
使用原子标记
在前面定义的场景需求中增加一个环节,当原子转为正常
状态时,需要review
之后,才允许print
- 用户新建
party
原子条目,此时处于草稿
状态 - 提交原子条目后,处于
正常
状态,此时设原子标记
=1
- 在
原子标记
=1
时,被授予review
权限的用户可以review
此原子条目 - 当
review
完成后,设原子标记
=2
- 在
原子标记
=2
时,被授予print
权限的用户可以打印
此原子条目
名称 | 说明 |
---|---|
原子标记=1 | 等待review |
原子标记=2 | 已经review |
原子标记的特性
原子指令
与原子标记
关联- 如果
原子指令
没有指定原子标记
:在正常
状态下,凡是被授予权限的原子指令
均有效 - 如果
原子指令
指定了原子标记
:在正常
状态下,先匹配与当前原子标记
对应的原子指令
,再判断用户针对此原子指令
是否有授权 原子指令
可以关联多个原子标记
原子标记的定义
如模块test-party
中原子类型party
相关的指令及标记配置如下:
modules/test-party/backend/src/meta.js
const meta = {
base: {
atoms: {
party: {
actions: {
review: {
code: 101,
title: 'Review',
flag: '1',
},
},
flags: {
1: {
title: 'Reviewing',
},
2: {
title: 'Reviewed',
},
},
},
},
},
};
名称 | 说明 |
---|---|
review.code | 扩展指令代码,从101开始分配 |
review.title | 扩展指令标题 |
review.flag | 原子标记:当原子标记等于1 时,指令review 才有效。支持多个原子标记 |
flags | 原子标记定义 |
简单流程
原子标记
和原子指令
的配合可以实现简单流程
,但还有一个细节需要处理:
在前面的
场景二
中,当原子条目提交到正常
状态时,需要进行review
操作,但此时,拥有read
权限的用户是否允许read
此原子条目?
- 通过开启
简单流程
,就可以确保在指令review
完成之后,原子才可以被拥有read
权限的用户read
此原子条目
简单流程配置
默认情况下不开启简单流程
,开启简单流程
如下:
src/suite-vendor/test-party/modules/test-party/backend/src/meta.js
base: {
atoms: {
party: {
info: {
title: 'Party',
tableName: 'testPartyView',
flow: 1,
},
},
},
},
名称 | 说明 |
---|---|
info.flow=1 | 开启简单流程 |
简单流程逻辑
开启简单流程
的原子类型,其流程逻辑如下:
- 当新建原子时,原子字段
atomFlow
值自动设置为1
- 原子提交到
正常
状态后,自动进入简单流程
处理环节 原子标记
标记了当前流程需要处理的原子指令
- 此时,只有经过授权的用户可以操作与
原子标记
相对应的原子指令
- 当最后一个
原子指令
执行完毕,需要将原子字段atomFlow
值设置为0
,从而标识流程已经处理完毕
- 此时,授予
read
权限的用户才可以read
此原子条目
简单流程开发
我们需要在enable
和action
这两个业务逻辑中做少量的处理,从而将整个简单流程
串起来
src/suite-vendor/test-party/modules/test-party/backend/src/service/party.js
module.exports = app => {
class Party extends app.Service {
async enable({ atomClass, key, atom, user }) {
// 将`原子标记`设置为1
await this.ctx.meta.atom.flag({
key,
atom: { atomFlag: 1 },
user,
});
}
async action({ action, atomClass, key, user }) {
// 原子指令:review
if (action === 101) {
// 将`原子标记`设置为2
await this.ctx.meta.atom.flag({
key,
atom: { atomFlag: 2 },
user,
});
// 将`简单流程`设为0,表示已完成`流程`处理
await this.ctx.meta.atom.flow({
key,
atom: { atomFlow: 0 },
user,
});
}
}
}
return Party;
};
评论: