@ddd-tool/domain-designer-cli 0.1.0-beta.9 → 0.3.1
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 +19148 -18666
- package/package.json +42 -23
- package/packages/core/dist/README.md +43 -0
- package/packages/core/dist/actor.d.ts +2 -0
- package/packages/core/dist/agg.d.ts +2 -0
- package/packages/core/dist/command.d.ts +3 -0
- package/packages/core/dist/common.d.ts +158 -0
- package/packages/core/dist/event.d.ts +2 -0
- package/packages/core/dist/index.d.ts +33 -0
- package/packages/core/dist/index.js +1980 -0
- package/packages/core/dist/info.d.ts +2 -0
- package/packages/core/dist/note.d.ts +2 -0
- package/packages/core/dist/package.json +21 -0
- package/packages/core/dist/policy.d.ts +2 -0
- package/packages/core/dist/read-model.d.ts +2 -0
- package/packages/core/dist/service.d.ts +2 -0
- package/packages/core/dist/system.d.ts +2 -0
- package/packages/core/dist/types.d.ts +558 -0
- package/packages/playground/.env +1 -0
- package/packages/playground/node_modules/.vite/deps/_metadata.json +34 -0
- package/packages/playground/node_modules/.vite/deps/chunk-F4TQRHS6.js +2147 -0
- package/packages/playground/node_modules/.vite/deps/chunk-F4TQRHS6.js.map +7 -0
- package/packages/playground/node_modules/.vite/deps/chunk-MFAKUPMY.js +12787 -0
- package/packages/playground/node_modules/.vite/deps/chunk-MFAKUPMY.js.map +7 -0
- package/packages/playground/node_modules/.vite/deps/package.json +3 -0
- package/packages/playground/node_modules/.vite/deps/primevue_button.js +1215 -0
- package/packages/playground/node_modules/.vite/deps/primevue_button.js.map +7 -0
- package/packages/playground/node_modules/.vite/deps/primevue_dock.js +1236 -0
- package/packages/playground/node_modules/.vite/deps/primevue_dock.js.map +7 -0
- package/packages/playground/node_modules/.vite/deps/vue.js +346 -0
- package/packages/playground/node_modules/.vite/deps/vue.js.map +7 -0
- package/packages/playground/node_modules/.vue-global-types/vue_3.5_0.d.ts +136 -0
- package/packages/playground/package.json +19 -0
- package/{src → packages/playground/src}/App.vue +12 -12
- package/{src → packages/playground/src}/main.ts +27 -27
- package/{src → packages/playground/src}/views/Index.vue +16 -16
- package/packages/playground/src/views/complex-example-detail/book.ts +383 -0
- package/packages/playground/src/views/complex-example-detail/common.ts +4 -0
- package/packages/playground/src/views/complex-example-detail/user.ts +66 -0
- package/packages/playground/src/views/complex-example.ts +4 -0
- package/{src → packages/playground/src}/views/design-en.ts +110 -99
- package/{src → packages/playground/src}/views/design-zh.ts +97 -91
- package/packages/playground/src/views/index.ts +19 -0
- package/packages/playground/src/views/simple-example.ts +103 -0
- package/packages/playground/tsconfig.json +32 -0
- package/packages/playground/vite-env.d.ts +12 -0
- package/packages/playground/vite.config.ts +22 -0
- package/packages/ui-component/dist/LICENSE +201 -0
- package/packages/ui-component/dist/README.md +5 -0
- package/packages/ui-component/dist/UI.vue.d.ts +29 -0
- package/packages/ui-component/dist/common.d.ts +9 -0
- package/packages/ui-component/dist/components/drag-zoom/Index.vue.d.ts +37 -0
- package/packages/ui-component/dist/components/node-info/Index.vue.d.ts +29 -0
- package/packages/ui-component/dist/components/nomnoml/Index.vue.d.ts +24 -0
- package/packages/ui-component/dist/components/nomnoml/base-style.d.ts +2 -0
- package/packages/ui-component/dist/components/nomnoml/preprocess.d.ts +5 -0
- package/packages/ui-component/dist/components/story-bar/Index.vue.d.ts +28 -0
- package/packages/ui-component/dist/components/tool-bar/Index.vue.d.ts +29 -0
- package/packages/ui-component/dist/domain/common.d.ts +27 -0
- package/packages/ui-component/dist/domain/diagram-agg/gen-code.d.ts +64 -0
- package/packages/ui-component/dist/domain/diagram-agg/index.d.ts +8554 -0
- package/packages/ui-component/dist/domain/diagram-agg/plugins.d.ts +80 -0
- package/packages/ui-component/dist/domain/diagram-agg/types.d.ts +20 -0
- package/packages/ui-component/dist/domain/i18n-agg/index.d.ts +25 -0
- package/packages/ui-component/dist/domain/i18n-agg/locale/en-US.d.ts +3 -0
- package/packages/ui-component/dist/domain/i18n-agg/locale/zh-CN.d.ts +3 -0
- package/packages/ui-component/dist/domain/i18n-agg/message.d.ts +42 -0
- package/packages/ui-component/dist/domain/mount-plugin.d.ts +1 -0
- package/packages/ui-component/dist/favicon.ico +0 -0
- package/packages/ui-component/dist/index.css +144 -0
- package/packages/ui-component/dist/index.d.ts +6 -0
- package/packages/ui-component/dist/index.js +19776 -0
- package/packages/ui-component/dist/package.json +28 -0
- package/packages/ui-component/dist/ui.d.ts +8 -0
- package/scripts/ai-assist-worker.cjs +7123 -0
- package/scripts/sync-version.mjs +22 -0
- package/templates/CLAUDE.md +276 -0
- package/templates/README.md +97 -0
- package/templates/complex-example-detail/book.ts +383 -0
- package/templates/complex-example-detail/common.ts +4 -0
- package/templates/complex-example-detail/user.ts +66 -0
- package/templates/complex-example.ts +4 -0
- package/templates/node_modules/@ddd-tool/domain-designer-core/actor.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/agg.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/command.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/common.d.ts +7 -8
- package/templates/node_modules/@ddd-tool/domain-designer-core/event.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/index.d.ts +3 -3
- package/templates/node_modules/@ddd-tool/domain-designer-core/info.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/note.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/policy.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/read-model.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/service.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/system.d.ts +1 -1
- package/templates/node_modules/@ddd-tool/domain-designer-core/{define.d.ts → types.d.ts} +23 -4
- package/templates/node_modules/version.txt +1 -1
- package/templates/simple-example.ts +103 -0
- package/tsconfig.json +19 -6
- package/scripts/sync-ver.mjs +0 -0
- package/src/views/index.ts +0 -15
- package/templates/example-agg.ts +0 -31
- package/templates/example.ts +0 -91
- package/vite.config.ts +0 -16
- /package/{index.html → packages/playground/index.html} +0 -0
- /package/{src → packages/playground/src}/assets/logo.svg +0 -0
- /package/{src → packages/playground/src}/assets/main.css +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { i, d } from './common'
|
|
2
|
+
|
|
3
|
+
export const userValues = {
|
|
4
|
+
用户id: i.id('userId'),
|
|
5
|
+
逾期次数: i.valueObj('overdueTimes', '正整数,每当用户有逾期行为,自增1'),
|
|
6
|
+
是否暂停: i.valueObj('isSuspended'),
|
|
7
|
+
} as const
|
|
8
|
+
|
|
9
|
+
export const 管理员 = d.actor('管理员')
|
|
10
|
+
export const 会员 = d.actor('会员')
|
|
11
|
+
export const 定时器 = d.actor('定时器')
|
|
12
|
+
|
|
13
|
+
const 会员账户已暂停 = d.event('UserAccountSuspended', ['userId'], '会员账户已暂停')
|
|
14
|
+
|
|
15
|
+
const 会员账户已启用 = d.event('UserAccountResumed', ['userId'], '会员账户已启用')
|
|
16
|
+
|
|
17
|
+
const 启用会员账户 = d.command(
|
|
18
|
+
'ResumeAccount',
|
|
19
|
+
['userId'],
|
|
20
|
+
d.note`启用会员账户
|
|
21
|
+
1.会员账户当前被暂停才能启用`,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export const 用户聚合 = d.agg('userAgg', [
|
|
25
|
+
userValues.用户id,
|
|
26
|
+
userValues.是否暂停,
|
|
27
|
+
userValues.逾期次数,
|
|
28
|
+
])
|
|
29
|
+
|
|
30
|
+
const 会员外部系统 = d.system('UserSystem', '会员外部系统')
|
|
31
|
+
|
|
32
|
+
const 会员账号已创建 = d.event(
|
|
33
|
+
'UserAccountCreatedEvt',
|
|
34
|
+
['会员id : userId', '会员名'],
|
|
35
|
+
'会员账号已创建',
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
export const 会员账号读模型 = d.readModel(
|
|
39
|
+
'UserAccountStatsRM',
|
|
40
|
+
['会员id : userId', '会员名', '是否暂停', '累计逾期次数'],
|
|
41
|
+
'会员账号读模型',
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
const 增加逾期次数 = d.command(
|
|
45
|
+
'IncreaseAccountTimeOutCount',
|
|
46
|
+
[userValues.用户id],
|
|
47
|
+
d.note`增加逾期次数
|
|
48
|
+
1.会员累计逾期达到3次暂停账户
|
|
49
|
+
2.会员账户当前是启用才能被暂停`,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
// ============================= 流程定义 =============================
|
|
53
|
+
|
|
54
|
+
const 创建会员流程 = d.startWorkflow('创建会员流程')
|
|
55
|
+
会员外部系统.event(会员账号已创建).readModel(会员账号读模型)
|
|
56
|
+
|
|
57
|
+
const 暂停会员流程 = d.startWorkflow('暂停会员流程')
|
|
58
|
+
用户聚合.event(会员账户已暂停).readModel(会员账号读模型)
|
|
59
|
+
|
|
60
|
+
const 启动会员流程 = d.startWorkflow('启动会员流程')
|
|
61
|
+
管理员.command(启用会员账户).agg(用户聚合).event(会员账户已启用).readModel(会员账号读模型)
|
|
62
|
+
|
|
63
|
+
const 增加逾期次数流程 = d.startWorkflow('增加逾期次数流程')
|
|
64
|
+
管理员.command(增加逾期次数).agg(用户聚合)
|
|
65
|
+
|
|
66
|
+
d.defineUserStory('会员管理', [创建会员流程, 暂停会员流程, 启动会员流程, 增加逾期次数流程])
|
|
@@ -1,99 +1,110 @@
|
|
|
1
|
-
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
-
|
|
3
|
-
const d = createDomainDesigner()
|
|
4
|
-
const i = d.info
|
|
5
|
-
|
|
6
|
-
// user
|
|
7
|
-
const user = d.actor('user', 'order user')
|
|
8
|
-
|
|
9
|
-
// aggregation
|
|
10
|
-
const userAccount = i.valueObj('userAccount')
|
|
11
|
-
const orderId = i.id('orderId')
|
|
12
|
-
const orderTime = i.valueObj('orderTime')
|
|
13
|
-
const productPrice = i.valueObj('productPrice')
|
|
14
|
-
const productQuantity = i.valueObj('productQuantity')
|
|
15
|
-
const orderAmount = d.info.func('orderAmount', [productPrice, productQuantity])
|
|
16
|
-
const orderAggregation = d.agg(
|
|
17
|
-
'orderAggregation',
|
|
18
|
-
[orderId, orderTime, userAccount, productPrice, productQuantity, orderAmount],
|
|
19
|
-
'this is order aggregation'
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
// command
|
|
23
|
-
const createOrder = d.command('createOrder', [orderAggregation.inner.orderId, userAccount])
|
|
24
|
-
const autoDeduct = d.command('autoDeduct', [orderId])
|
|
25
|
-
|
|
26
|
-
// event
|
|
27
|
-
const orderSuccess = d.event('orderSuccess', [orderId, orderTime])
|
|
28
|
-
const orderFailure = d.event('orderFailure', [orderId, orderTime])
|
|
29
|
-
const deductSuccess = d.event('deductSuccess', [orderId, orderTime])
|
|
30
|
-
const deductFailure = d.event('deductFailure', [orderId, orderTime])
|
|
31
|
-
// rule
|
|
32
|
-
const paymentRule = d.policy(
|
|
33
|
-
'paymentRule',
|
|
34
|
-
d.
|
|
35
|
-
if ${userAccount} has opened the automatic payment service, then automatic payment is initiated
|
|
36
|
-
rule 1:
|
|
37
|
-
rule 2:
|
|
38
|
-
rule 3:
|
|
39
|
-
... ...
|
|
40
|
-
|
|
41
|
-
)
|
|
42
|
-
// service
|
|
43
|
-
const autoDeductService = d.service(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
.command(
|
|
63
|
-
.agg(orderAggregation)
|
|
64
|
-
.event(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
1
|
+
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
+
|
|
3
|
+
const d = createDomainDesigner()
|
|
4
|
+
const i = d.info
|
|
5
|
+
|
|
6
|
+
// user
|
|
7
|
+
const user = d.actor('user', 'order user')
|
|
8
|
+
|
|
9
|
+
// aggregation
|
|
10
|
+
const userAccount = i.valueObj('userAccount')
|
|
11
|
+
const orderId = i.id('orderId')
|
|
12
|
+
const orderTime = i.valueObj('orderTime')
|
|
13
|
+
const productPrice = i.valueObj('productPrice')
|
|
14
|
+
const productQuantity = i.valueObj('productQuantity')
|
|
15
|
+
const orderAmount = d.info.func('orderAmount', [productPrice, productQuantity])
|
|
16
|
+
const orderAggregation = d.agg(
|
|
17
|
+
'orderAggregation',
|
|
18
|
+
[orderId, orderTime, userAccount, productPrice, productQuantity, orderAmount],
|
|
19
|
+
'this is order aggregation',
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
// command
|
|
23
|
+
const createOrder = d.command('createOrder', [orderAggregation.inner.orderId, userAccount])
|
|
24
|
+
const autoDeduct = d.command('autoDeduct', [orderId])
|
|
25
|
+
|
|
26
|
+
// event
|
|
27
|
+
const orderSuccess = d.event('orderSuccess', [orderId, orderTime])
|
|
28
|
+
const orderFailure = d.event('orderFailure', [orderId, orderTime])
|
|
29
|
+
const deductSuccess = d.event('deductSuccess', [orderId, orderTime])
|
|
30
|
+
const deductFailure = d.event('deductFailure', [orderId, orderTime])
|
|
31
|
+
// rule
|
|
32
|
+
const paymentRule = d.policy(
|
|
33
|
+
'paymentRule',
|
|
34
|
+
d.note`
|
|
35
|
+
if ${userAccount} has opened the automatic payment service, then automatic payment is initiated
|
|
36
|
+
rule 1:
|
|
37
|
+
rule 2:
|
|
38
|
+
rule 3:
|
|
39
|
+
... ...
|
|
40
|
+
`,
|
|
41
|
+
)
|
|
42
|
+
// service
|
|
43
|
+
const autoDeductService = d.service(
|
|
44
|
+
'autoDeductService',
|
|
45
|
+
'initiate automatic payment based on payment rule',
|
|
46
|
+
)
|
|
47
|
+
// external system
|
|
48
|
+
const logisticsSystem = d.system('logisticsSystem')
|
|
49
|
+
const mailSystem = d.system('mailSystem')
|
|
50
|
+
|
|
51
|
+
// read model
|
|
52
|
+
const orderDetail = d.readModel('orderDetailReadModel', [orderId, orderTime])
|
|
53
|
+
|
|
54
|
+
const createOrderFailureWorkflow = d.startWorkflow('createOrderFailure')
|
|
55
|
+
user.command(createOrder).agg(orderAggregation).event(orderFailure)
|
|
56
|
+
orderFailure.system(mailSystem)
|
|
57
|
+
|
|
58
|
+
const createOrderSuccess_AutoDeductFailureWorkflow = d.startWorkflow(
|
|
59
|
+
'createOrderSuccess_AutoDeductFailure',
|
|
60
|
+
)
|
|
61
|
+
user
|
|
62
|
+
.command(createOrder)
|
|
63
|
+
.agg(orderAggregation)
|
|
64
|
+
.event(orderSuccess)
|
|
65
|
+
.policy(paymentRule)
|
|
66
|
+
.service(autoDeductService)
|
|
67
|
+
.command(autoDeduct)
|
|
68
|
+
.agg(orderAggregation)
|
|
69
|
+
.event(deductFailure)
|
|
70
|
+
deductFailure.readModel(orderDetail)
|
|
71
|
+
deductFailure.system(mailSystem)
|
|
72
|
+
|
|
73
|
+
const createOrderSuccess_AutoDeductSuccessWorkflow = d.startWorkflow(
|
|
74
|
+
'createOrderSuccess_AutoDeductSuccess',
|
|
75
|
+
)
|
|
76
|
+
user
|
|
77
|
+
.command(createOrder)
|
|
78
|
+
.agg(orderAggregation)
|
|
79
|
+
.event(orderSuccess)
|
|
80
|
+
.policy(paymentRule)
|
|
81
|
+
.service(autoDeductService)
|
|
82
|
+
.command(autoDeduct)
|
|
83
|
+
.agg(orderAggregation)
|
|
84
|
+
.event(deductSuccess)
|
|
85
|
+
deductSuccess.readModel(orderDetail)
|
|
86
|
+
deductSuccess.system(logisticsSystem)
|
|
87
|
+
|
|
88
|
+
d.startWorkflow('unclassifiedWorkflow')
|
|
89
|
+
user.command(createOrder).agg(orderAggregation).event(orderFailure)
|
|
90
|
+
orderFailure.system(mailSystem)
|
|
91
|
+
|
|
92
|
+
d.startWorkflow('readModel')
|
|
93
|
+
const userRead = d.actor('user', 'user (read model)')
|
|
94
|
+
userRead.readModel(orderDetail)
|
|
95
|
+
|
|
96
|
+
d.defineUserStory(
|
|
97
|
+
'as a mall user, I want to place an order and implement automatic payment to get the goods',
|
|
98
|
+
[
|
|
99
|
+
createOrderFailureWorkflow,
|
|
100
|
+
createOrderSuccess_AutoDeductFailureWorkflow,
|
|
101
|
+
createOrderSuccess_AutoDeductSuccessWorkflow,
|
|
102
|
+
],
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
d.defineUserStory(
|
|
106
|
+
'as a mall user, I want to view the order status, so I can know the order status',
|
|
107
|
+
[createOrderSuccess_AutoDeductSuccessWorkflow],
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
export default d
|
|
@@ -1,91 +1,97 @@
|
|
|
1
|
-
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
-
|
|
3
|
-
const d = createDomainDesigner()
|
|
4
|
-
const i = d.info
|
|
5
|
-
|
|
6
|
-
// 用户
|
|
7
|
-
const 用户 = d.actor('用户', '下单用户')
|
|
8
|
-
|
|
9
|
-
// 聚合
|
|
10
|
-
const 用户账号 = i.valueObj('用户账号')
|
|
11
|
-
const 订单号 = i.id('订单号')
|
|
12
|
-
const 下单时间 = i.valueObj('下单时间')
|
|
13
|
-
const 商品价格 = i.valueObj('商品价格')
|
|
14
|
-
const 商品数量 = i.valueObj('商品数量')
|
|
15
|
-
const 订单金额 = d.info.func('订单金额', [商品价格, 商品数量])
|
|
16
|
-
const 订单聚合 = d.agg(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
用户.command(创建订单)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
.
|
|
58
|
-
.
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.
|
|
70
|
-
.
|
|
71
|
-
.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
d.startWorkflow('
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
d.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
1
|
+
import { createDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
+
|
|
3
|
+
const d = createDomainDesigner()
|
|
4
|
+
const i = d.info
|
|
5
|
+
|
|
6
|
+
// 用户
|
|
7
|
+
const 用户 = d.actor('用户', '下单用户')
|
|
8
|
+
|
|
9
|
+
// 聚合
|
|
10
|
+
const 用户账号 = i.valueObj('用户账号')
|
|
11
|
+
const 订单号 = i.id('订单号')
|
|
12
|
+
const 下单时间 = i.valueObj('下单时间')
|
|
13
|
+
const 商品价格 = i.valueObj('商品价格')
|
|
14
|
+
const 商品数量 = i.valueObj('商品数量')
|
|
15
|
+
const 订单金额 = d.info.func('订单金额', [商品价格, 商品数量])
|
|
16
|
+
const 订单聚合 = d.agg(
|
|
17
|
+
'订单聚合',
|
|
18
|
+
[订单号, 下单时间, 用户账号, 商品价格, 商品数量, 订单金额],
|
|
19
|
+
'这是订单聚合',
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
// 命令
|
|
23
|
+
const 创建订单 = d.command('创建订单', [订单聚合.inner.订单号, 用户账号])
|
|
24
|
+
const 自动扣款 = d.command('自动扣款', [订单号])
|
|
25
|
+
|
|
26
|
+
// 事件
|
|
27
|
+
const 下单成功 = d.event('下单成功', [订单号, 下单时间])
|
|
28
|
+
const 下单失败 = d.event('下单失败', [订单号, 下单时间])
|
|
29
|
+
const 扣款成功 = d.event('扣款成功', [订单号, 下单时间])
|
|
30
|
+
const 扣款失败 = d.event('扣款失败', [订单号, 下单时间])
|
|
31
|
+
// 规则
|
|
32
|
+
const 付款规则 = d.policy(
|
|
33
|
+
'付款规则',
|
|
34
|
+
d.note`
|
|
35
|
+
如果${用户账号}开通了自动扣费服务,则发起自动扣款
|
|
36
|
+
规则1:
|
|
37
|
+
规则2:
|
|
38
|
+
规则3:
|
|
39
|
+
... ...
|
|
40
|
+
`,
|
|
41
|
+
)
|
|
42
|
+
// 服务
|
|
43
|
+
const 自动扣款服务 = d.service('自动扣款服务', '根据付款规则发起自动扣款')
|
|
44
|
+
// 外部系统
|
|
45
|
+
const 物流系统 = d.system('物流系统')
|
|
46
|
+
const 邮件系统 = d.system('邮件系统')
|
|
47
|
+
|
|
48
|
+
// 读模型
|
|
49
|
+
const 订单详情 = d.readModel('订单详情读模型', [订单号, 下单时间])
|
|
50
|
+
|
|
51
|
+
const 创建订单失败流程 = d.startWorkflow('创建订单失败')
|
|
52
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
53
|
+
下单失败.system(邮件系统)
|
|
54
|
+
|
|
55
|
+
const 创建订单成功_自动扣款失败流程 = d.startWorkflow('创建订单成功,自动扣款失败')
|
|
56
|
+
用户.command(创建订单)
|
|
57
|
+
.agg(订单聚合)
|
|
58
|
+
.event(下单成功)
|
|
59
|
+
.policy(付款规则)
|
|
60
|
+
.service(自动扣款服务)
|
|
61
|
+
.command(自动扣款)
|
|
62
|
+
.agg(订单聚合)
|
|
63
|
+
.event(扣款失败)
|
|
64
|
+
扣款失败.readModel(订单详情)
|
|
65
|
+
扣款失败.system(邮件系统)
|
|
66
|
+
|
|
67
|
+
const 创建订单成功_自动扣款成功流程 = d.startWorkflow('创建订单成功,自动扣款成功')
|
|
68
|
+
用户.command(创建订单)
|
|
69
|
+
.agg(订单聚合)
|
|
70
|
+
.event(下单成功)
|
|
71
|
+
.policy(付款规则)
|
|
72
|
+
.service(自动扣款服务)
|
|
73
|
+
.command(自动扣款)
|
|
74
|
+
.agg(订单聚合)
|
|
75
|
+
.event(扣款成功)
|
|
76
|
+
扣款成功.readModel(订单详情)
|
|
77
|
+
扣款成功.system(物流系统)
|
|
78
|
+
|
|
79
|
+
d.startWorkflow('未归纳流程')
|
|
80
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
81
|
+
下单失败.system(邮件系统)
|
|
82
|
+
|
|
83
|
+
d.startWorkflow('读模型')
|
|
84
|
+
const 用户读 = d.actor('用户', '用户(读模型)')
|
|
85
|
+
用户读.readModel(订单详情)
|
|
86
|
+
|
|
87
|
+
d.defineUserStory('作为商城用户,我要下单并且实现自动扣款,以便购得心仪得商品', [
|
|
88
|
+
创建订单失败流程,
|
|
89
|
+
创建订单成功_自动扣款失败流程,
|
|
90
|
+
创建订单成功_自动扣款成功流程,
|
|
91
|
+
])
|
|
92
|
+
|
|
93
|
+
d.defineUserStory('作为商城用户,我要查看订单情况,以便了解订单状态', [
|
|
94
|
+
创建订单成功_自动扣款成功流程,
|
|
95
|
+
])
|
|
96
|
+
|
|
97
|
+
export default d
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DomainDesigner, isDomainDesigner } from '@ddd-tool/domain-designer-core'
|
|
2
|
+
|
|
3
|
+
const __d1 = (
|
|
4
|
+
await import('F:/vscode_projects/@ddd-tool/domain-designer-cli-node/demo/complex-example')
|
|
5
|
+
).default
|
|
6
|
+
const __d2 = (
|
|
7
|
+
await import('F:/vscode_projects/@ddd-tool/domain-designer-cli-node/demo/simple-example')
|
|
8
|
+
).default
|
|
9
|
+
|
|
10
|
+
const data: Record<string, DomainDesigner> = {}
|
|
11
|
+
|
|
12
|
+
if (isDomainDesigner(__d1)) {
|
|
13
|
+
data['complex-example'] = __d1
|
|
14
|
+
}
|
|
15
|
+
if (isDomainDesigner(__d2)) {
|
|
16
|
+
data['simple-example'] = __d2
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default data
|
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
[
|
|
27
|
+
订单号,
|
|
28
|
+
下单时间,
|
|
29
|
+
用户账号,
|
|
30
|
+
'商品价格',
|
|
31
|
+
'商品数量',
|
|
32
|
+
d.info.func('订单金额', ['商品价格', '商品数量']),
|
|
33
|
+
],
|
|
34
|
+
'这是订单聚合',
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
// 规则
|
|
38
|
+
const 付款规则 = d.policy(
|
|
39
|
+
'付款规则',
|
|
40
|
+
d.note`
|
|
41
|
+
如果${用户账号}开通了自动扣费服务,则发起自动扣款
|
|
42
|
+
规则1:
|
|
43
|
+
规则2:
|
|
44
|
+
规则3:
|
|
45
|
+
... ...
|
|
46
|
+
`,
|
|
47
|
+
)
|
|
48
|
+
// 服务
|
|
49
|
+
const 自动扣款服务 = d.service('自动扣款服务', '根据付款规则发起自动扣款')
|
|
50
|
+
// 外部系统
|
|
51
|
+
const 物流系统 = d.system('物流系统')
|
|
52
|
+
const 邮件系统 = d.system('邮件系统')
|
|
53
|
+
|
|
54
|
+
// 读模型
|
|
55
|
+
const 订单详情 = d.readModel('订单详情读模型', [订单号, 下单时间])
|
|
56
|
+
|
|
57
|
+
const 创建订单失败流程 = d.startWorkflow('创建订单失败')
|
|
58
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
59
|
+
下单失败.system(邮件系统)
|
|
60
|
+
|
|
61
|
+
const 创建订单成功_自动扣款失败流程 = d.startWorkflow('创建订单成功,自动扣款失败')
|
|
62
|
+
用户.command(创建订单)
|
|
63
|
+
.agg(订单聚合)
|
|
64
|
+
.event(下单成功)
|
|
65
|
+
.policy(付款规则)
|
|
66
|
+
.service(自动扣款服务)
|
|
67
|
+
.command(自动扣款)
|
|
68
|
+
.agg(订单聚合)
|
|
69
|
+
.event(扣款失败)
|
|
70
|
+
扣款失败.readModel(订单详情)
|
|
71
|
+
扣款失败.system(邮件系统)
|
|
72
|
+
|
|
73
|
+
const 创建订单成功_自动扣款成功流程 = d.startWorkflow('创建订单成功,自动扣款成功')
|
|
74
|
+
用户.command(创建订单)
|
|
75
|
+
.agg(订单聚合)
|
|
76
|
+
.event(下单成功)
|
|
77
|
+
.policy(付款规则)
|
|
78
|
+
.service(自动扣款服务)
|
|
79
|
+
.command(自动扣款)
|
|
80
|
+
.agg(订单聚合)
|
|
81
|
+
.event(扣款成功)
|
|
82
|
+
扣款成功.readModel(订单详情)
|
|
83
|
+
扣款成功.system(物流系统)
|
|
84
|
+
|
|
85
|
+
d.startWorkflow('未归纳流程')
|
|
86
|
+
用户.command(创建订单).agg(订单聚合).event(下单失败)
|
|
87
|
+
下单失败.system(邮件系统)
|
|
88
|
+
|
|
89
|
+
d.startWorkflow('读模型相关流程')
|
|
90
|
+
const 用户读 = d.actor('用户', '用户(读模型)')
|
|
91
|
+
用户读.readModel(订单详情)
|
|
92
|
+
|
|
93
|
+
d.defineUserStory('作为商城用户,我要下单并且实现自动扣款,以便购得心仪得商品', [
|
|
94
|
+
创建订单失败流程,
|
|
95
|
+
创建订单成功_自动扣款失败流程,
|
|
96
|
+
创建订单成功_自动扣款成功流程,
|
|
97
|
+
])
|
|
98
|
+
|
|
99
|
+
d.defineUserStory('作为商城用户,我要查看订单情况,以便了解订单状态', [
|
|
100
|
+
创建订单成功_自动扣款成功流程,
|
|
101
|
+
])
|
|
102
|
+
|
|
103
|
+
export default d
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"include": [
|
|
3
|
+
"src/*",
|
|
4
|
+
"src/**/*",
|
|
5
|
+
"__tests__",
|
|
6
|
+
"scripts",
|
|
7
|
+
"vite-env.d.ts"
|
|
8
|
+
],
|
|
9
|
+
"compilerOptions": {
|
|
10
|
+
"strict": true,
|
|
11
|
+
"moduleResolution": "Bundler",
|
|
12
|
+
"module": "ESNext",
|
|
13
|
+
"target": "ESNext",
|
|
14
|
+
"esModuleInterop": true,
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
"sourceMap": true,
|
|
17
|
+
"lib": [
|
|
18
|
+
"DOM"
|
|
19
|
+
],
|
|
20
|
+
"types": [
|
|
21
|
+
"node"
|
|
22
|
+
],
|
|
23
|
+
"paths": {
|
|
24
|
+
"@/*": [
|
|
25
|
+
"./src/*"
|
|
26
|
+
],
|
|
27
|
+
"@ddd-tool/domain-designer-core": [
|
|
28
|
+
"./node_modules/@ddd-tool/domain-designer-core"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { fileURLToPath, URL } from 'node:url'
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from 'vite'
|
|
4
|
+
import vue from '@vitejs/plugin-vue'
|
|
5
|
+
import vueDevTools from 'vite-plugin-vue-devtools'
|
|
6
|
+
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
plugins: [vue(), vueDevTools()],
|
|
9
|
+
esbuild: {
|
|
10
|
+
drop: ['console', 'debugger'], // 移除 console 和 debugger 语句
|
|
11
|
+
},
|
|
12
|
+
dev: {},
|
|
13
|
+
resolve: {
|
|
14
|
+
alias: {
|
|
15
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
16
|
+
'@ddd-tool/domain-designer-core': fileURLToPath(new URL('../core/dist', import.meta.url)),
|
|
17
|
+
'@ddd-tool/domain-designer-ui-component': fileURLToPath(
|
|
18
|
+
new URL('../ui-component/dist', import.meta.url),
|
|
19
|
+
),
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
})
|