原子标记的意义
可以通过两个场景来说明原子标记的意义
不使用原子标记
定义一种场景需求,其流程及权限设计如下:
- 用户新建
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;
};
评论: