@ddd-tool/domain-designer-cli 0.1.0-beta.13 → 0.1.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -20
- package/bin/domain-designer-cli.cjs +6 -5
- package/package.json +2 -2
- package/src/views/complex-example-detail/book.ts +447 -0
- package/src/views/complex-example-detail/common.ts +4 -0
- package/src/views/complex-example-detail/user.ts +83 -0
- package/src/views/complex-example.ts +4 -0
- package/src/views/design-en.ts +1 -1
- package/src/views/design-zh.ts +1 -1
- package/src/views/index.ts +12 -4
- package/src/views/simple-example.ts +94 -0
- package/templates/complex-example-detail/book.ts +447 -0
- package/templates/complex-example-detail/common.ts +4 -0
- package/templates/complex-example-detail/user.ts +83 -0
- package/templates/complex-example.ts +4 -0
- package/templates/node_modules/version.txt +1 -1
- package/templates/simple-example.ts +94 -0
- package/templates/example-agg.ts +0 -31
- package/templates/example.ts +0 -91
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
+
|
|
3
|
+
const d = createDomainDesigner()
|
|
4
|
+
const i = d.info
|
|
5
|
+
|
|
6
|
+
const 用户账号 = i.valueObj('用户账号')
|
|
7
|
+
const 订单号 = i.id('订单号')
|
|
8
|
+
const 下单时间 = i.valueObj('下单时间')
|
|
9
|
+
|
|
10
|
+
// 事件
|
|
11
|
+
const 下单成功 = d.event('下单成功', [订单号, 下单时间])
|
|
12
|
+
const 下单失败 = d.event('下单失败', [订单号, 下单时间])
|
|
13
|
+
const 扣款成功 = d.event('扣款成功', [订单号, 下单时间])
|
|
14
|
+
const 扣款失败 = d.event('扣款失败', [订单号, 下单时间])
|
|
15
|
+
|
|
16
|
+
// 命令
|
|
17
|
+
const 创建订单 = d.command('创建订单', [订单号, 用户账号])
|
|
18
|
+
const 自动扣款 = d.command('自动扣款', [订单号])
|
|
19
|
+
|
|
20
|
+
// 用户
|
|
21
|
+
const 用户 = d.actor('用户', '下单用户')
|
|
22
|
+
|
|
23
|
+
// 聚合
|
|
24
|
+
const 订单聚合 = d.agg(
|
|
25
|
+
'订单聚合',
|
|
26
|
+
[订单号, 下单时间, 用户账号, '商品价格', '商品数量', d.info.func('订单金额', ['商品价格', '商品数量'])],
|
|
27
|
+
'这是订单聚合'
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
// 规则
|
|
31
|
+
const 付款规则 = d.policy(
|
|
32
|
+
'付款规则',
|
|
33
|
+
d.note`
|
|
34
|
+
如果${用户账号}开通了自动扣费服务,则发起自动扣款
|
|
35
|
+
规则1:xxx
|
|
36
|
+
规则2:xxx
|
|
37
|
+
规则3:xxx
|
|
38
|
+
... ...
|
|
39
|
+
`
|
|
40
|
+
)
|
|
41
|
+
// 服务
|
|
42
|
+
const 自动扣款服务 = d.service('自动扣款服务', '根据付款规则发起自动扣款')
|
|
43
|
+
// 外部系统
|
|
44
|
+
const 物流系统 = d.system('物流系统')
|
|
45
|
+
const 邮件系统 = d.system('邮件系统')
|
|
46
|
+
|
|
47
|
+
// 读模型
|
|
48
|
+
const 订单详情 = d.readModel('订单详情读模型', [订单号, 下单时间])
|
|
49
|
+
|
|
50
|
+
const 创建订单失败流程 = d.startWorkflow('创建订单失败')
|
|
51
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
52
|
+
下单失败.system(邮件系统)
|
|
53
|
+
|
|
54
|
+
const 创建订单成功_自动扣款失败流程 = d.startWorkflow('创建订单成功,自动扣款失败')
|
|
55
|
+
用户.command(创建订单)
|
|
56
|
+
.agg(订单聚合)
|
|
57
|
+
.event(下单成功)
|
|
58
|
+
.policy(付款规则)
|
|
59
|
+
.service(自动扣款服务)
|
|
60
|
+
.command(自动扣款)
|
|
61
|
+
.agg(订单聚合)
|
|
62
|
+
.event(扣款失败)
|
|
63
|
+
扣款失败.readModel(订单详情)
|
|
64
|
+
扣款失败.system(邮件系统)
|
|
65
|
+
|
|
66
|
+
const 创建订单成功_自动扣款成功流程 = d.startWorkflow('创建订单成功,自动扣款成功')
|
|
67
|
+
用户.command(创建订单)
|
|
68
|
+
.agg(订单聚合)
|
|
69
|
+
.event(下单成功)
|
|
70
|
+
.policy(付款规则)
|
|
71
|
+
.service(自动扣款服务)
|
|
72
|
+
.command(自动扣款)
|
|
73
|
+
.agg(订单聚合)
|
|
74
|
+
.event(扣款成功)
|
|
75
|
+
扣款成功.readModel(订单详情)
|
|
76
|
+
扣款成功.system(物流系统)
|
|
77
|
+
|
|
78
|
+
d.startWorkflow('未归纳流程')
|
|
79
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
80
|
+
下单失败.system(邮件系统)
|
|
81
|
+
|
|
82
|
+
d.startWorkflow('读模型相关流程')
|
|
83
|
+
const 用户读 = d.actor('用户', '用户(读模型)')
|
|
84
|
+
用户读.readModel(订单详情)
|
|
85
|
+
|
|
86
|
+
d.defineUserStory('作为商城用户,我要下单并且实现自动扣款,以便购得心仪得商品', [
|
|
87
|
+
创建订单失败流程,
|
|
88
|
+
创建订单成功_自动扣款失败流程,
|
|
89
|
+
创建订单成功_自动扣款成功流程,
|
|
90
|
+
])
|
|
91
|
+
|
|
92
|
+
d.defineUserStory('作为商城用户,我要查看订单情况,以便了解订单状态', [创建订单成功_自动扣款成功流程])
|
|
93
|
+
|
|
94
|
+
export default d
|
package/templates/example-agg.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// noinspection NonAsciiCharacters
|
|
2
|
-
|
|
3
|
-
import { DomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
4
|
-
|
|
5
|
-
// 1.可以将聚合与流程分开定义,避免代码混乱、同时也方便比较、思考各个聚合的内部信息
|
|
6
|
-
// 2.根据规则,只有工作空间根目录中默认导出了一个设计器实例的ts文件
|
|
7
|
-
// `export default <DomainDesigner>`
|
|
8
|
-
// 才会被识别为一个'数据源'。其他文件的内容可以自行编排
|
|
9
|
-
export function createOrderAgg(d: DomainDesigner) {
|
|
10
|
-
const i = d.info
|
|
11
|
-
const productPrice = i.valueObj('productPrice', '商品价格')
|
|
12
|
-
const productQuantity = i.valueObj('productQuantity', '商品数量')
|
|
13
|
-
return d.agg('orderAgg', [
|
|
14
|
-
i.id('orderId'),
|
|
15
|
-
'orderTime',
|
|
16
|
-
['userAccount', '用户账号'],
|
|
17
|
-
productPrice,
|
|
18
|
-
productQuantity,
|
|
19
|
-
i.func(
|
|
20
|
-
'orderAmount',
|
|
21
|
-
[productPrice, productQuantity],
|
|
22
|
-
d.note`订单金额 = 商品单价${productPrice} x 商品数量${productQuantity}`
|
|
23
|
-
),
|
|
24
|
-
i.version('updateTime'),
|
|
25
|
-
])
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function createOtherAgg(d: DomainDesigner) {
|
|
29
|
-
const i = d.info
|
|
30
|
-
return d.agg('otherAgg', ['otherId'])
|
|
31
|
-
}
|
package/templates/example.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// noinspection NonAsciiCharacters
|
|
2
|
-
|
|
3
|
-
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
4
|
-
import { createOrderAgg } from './example-agg'
|
|
5
|
-
|
|
6
|
-
// moduleName 用于在代码生成时指定当前领域的分包名称。
|
|
7
|
-
// 也可以不传参数,会默认为当前文件名,所以文件名为中文的时候要指定一下
|
|
8
|
-
// const d = createDomainDesigner()
|
|
9
|
-
const d = createDomainDesigner({ moduleName: 'order' })
|
|
10
|
-
|
|
11
|
-
const 商城用户 = d.actor('user', '商城用户')
|
|
12
|
-
|
|
13
|
-
// 聚合是在另一个ts文件中定义的,我们可以像普通esmodule项目一样正常写 import 和 export
|
|
14
|
-
const 订单聚合 = createOrderAgg(d)
|
|
15
|
-
|
|
16
|
-
// 下面的代码都是“代码即注释”,写起来、读起来不会有什么困难
|
|
17
|
-
// 需要注意的是:`订单聚合.inner.orderId`的写法并不表示谁依赖谁。
|
|
18
|
-
// 这只是为了在业务复杂的时候,表示“这里的orderId就是订单中的orderId”,原因如下:
|
|
19
|
-
// 1 这样写我们就可以借助ts的编译检查来辅助检查,有一定程度的完备性保证
|
|
20
|
-
// 2 在web端的展示中,相同的字段也能同时得到展示方面的加强(加粗闪烁等)
|
|
21
|
-
// 3 经过实践发现ide的智能提示可以轻松地“聚合.inner.字段”,一路“点”出来,
|
|
22
|
-
// 反而比再敲一遍省事,同时避免重复敲会犯错
|
|
23
|
-
|
|
24
|
-
const 邮件系统 = d.system('logisticsSystem', '邮件系统')
|
|
25
|
-
const 物流系统 = d.system('mailSystem', '物流系统')
|
|
26
|
-
|
|
27
|
-
const 创建订单失败流程 = d.startWorkflow('创建订单失败流程')
|
|
28
|
-
const 下单命令 = d.command('createOrderCommand', [订单聚合.inner.orderId, 订单聚合.inner.userAccount])
|
|
29
|
-
const 下单失败事件 = d.event('orderFailedEvent', [订单聚合.inner.orderId, 订单聚合.inner.orderTime])
|
|
30
|
-
商城用户.command(下单命令).agg(订单聚合).event(下单失败事件)
|
|
31
|
-
下单失败事件.system(物流系统)
|
|
32
|
-
|
|
33
|
-
const 创建订单成功_自动扣款失败流程 = d.startWorkflow('创建订单成功_自动扣款失败流程')
|
|
34
|
-
const 自动扣款命令 = d.command('autoDeductCommand', [订单聚合.inner.orderId])
|
|
35
|
-
const 下单成功事件 = d.event('orderSucceedEvent', [订单聚合.inner.orderId, 订单聚合.inner.orderTime])
|
|
36
|
-
const 自动扣款服务 = d.service('autoDeductService', '根据支付规则进行自动扣款')
|
|
37
|
-
const 支付规则 = d.policy(
|
|
38
|
-
'paymentPolicy',
|
|
39
|
-
d.note`
|
|
40
|
-
如果 ${订单聚合.inner.userAccount}启用了自动扣款服务,那么开始自动扣款
|
|
41
|
-
规则 1:
|
|
42
|
-
规则 2:
|
|
43
|
-
规则 3:
|
|
44
|
-
... ...
|
|
45
|
-
`
|
|
46
|
-
)
|
|
47
|
-
const 订单详情读模型 = d.readModel('orderDetailReadModel', [订单聚合.inner.orderId, 订单聚合.inner.orderTime])
|
|
48
|
-
const 扣款失败事件 = d.event('deductFailedEvent', [订单聚合.inner.orderId, 订单聚合.inner.orderTime])
|
|
49
|
-
商城用户
|
|
50
|
-
.command(下单命令)
|
|
51
|
-
.agg(订单聚合)
|
|
52
|
-
.event(下单成功事件)
|
|
53
|
-
.policy(支付规则)
|
|
54
|
-
.service(自动扣款服务)
|
|
55
|
-
.command(自动扣款命令)
|
|
56
|
-
.agg(订单聚合)
|
|
57
|
-
.event(扣款失败事件)
|
|
58
|
-
扣款失败事件.readModel(订单详情读模型)
|
|
59
|
-
扣款失败事件.system(物流系统)
|
|
60
|
-
|
|
61
|
-
const 创建订单成功_自动扣款成功流程 = d.startWorkflow('创建订单成功_自动扣款成功流程')
|
|
62
|
-
const 扣款成功事件 = d.event('deductSucceedEvent', [订单聚合.inner.orderId, 订单聚合.inner.orderTime])
|
|
63
|
-
商城用户
|
|
64
|
-
.command(下单命令)
|
|
65
|
-
.agg(订单聚合)
|
|
66
|
-
.event(下单成功事件)
|
|
67
|
-
.policy(支付规则)
|
|
68
|
-
.service(自动扣款服务)
|
|
69
|
-
.command(自动扣款命令)
|
|
70
|
-
.agg(订单聚合)
|
|
71
|
-
.event(扣款成功事件)
|
|
72
|
-
扣款成功事件.readModel(订单详情读模型)
|
|
73
|
-
扣款成功事件.system(邮件系统)
|
|
74
|
-
|
|
75
|
-
d.startWorkflow('未分类流程')
|
|
76
|
-
商城用户.command(下单命令).agg(订单聚合).event(下单失败事件)
|
|
77
|
-
下单失败事件.system(物流系统)
|
|
78
|
-
|
|
79
|
-
d.startWorkflow('readModel')
|
|
80
|
-
const userRead = d.actor('user', 'user (read model)')
|
|
81
|
-
userRead.readModel(订单详情读模型)
|
|
82
|
-
|
|
83
|
-
d.defineUserStory('作为商城用户,我要下单并且实现自动扣款,以便购得心仪得商品', [
|
|
84
|
-
创建订单失败流程,
|
|
85
|
-
创建订单成功_自动扣款失败流程,
|
|
86
|
-
创建订单成功_自动扣款成功流程,
|
|
87
|
-
])
|
|
88
|
-
|
|
89
|
-
d.defineUserStory('作为商城用户,我要查看订单情况,以便了解订单状态', [创建订单成功_自动扣款成功流程])
|
|
90
|
-
|
|
91
|
-
export default d
|