# 插件开发 开发
插件是平台本身开放的一种扩展方式,通过插件可以为平台添加新的功能,或者修改现有的功能。
# 插件使用
插件都是以 .myp
结尾的文件,可以通过平台的插件管理界面上传并启用插件。
# 插件运行时说明
- 同一套插件可以在平台中拥有不同版本,不同版本的插件同一时间只能启用一个。
- 插件的启用和停用都是实时生效的,不需要重启平台。
- 平台中启用的所有插件共享同一套运行时环境,插件之间互相直接调用。同时平台也提供了一些 API 让插件可以调用平台的功能。
# 插件开发
# 目标读者
此文档主要目标读者为希望了解如何进行牧言开发平台插件开发的高级开发者。
# 前置知识
读者需要对 gradle 有一定的了解。以下是相关的参考资料:
# 创建插件
- 基于 platform (opens new window) 平台模板创建项目。
- 插件目录位于
server
,修改插件目录下的build.gradle
配置文件,替换插件的名称、版本、依赖的其他插件等信息。version "0.0.1" group "tech.muyan.plugin"
1
2 - 通过
build.gradle
添加您的第三方依赖,并开始编写您的业务逻辑。
# 数据绑定
在插件源代码中可以定义数据模型,通过数据模型可以和平台内置的 DomainClass 绑定。只需要保证数据模型的 POJO 类和 DomainClass 同名,且实现了 tech.muyan.api.DynamicDomainEntity
接口即可。
下面将给出一些具体的例子以供参考。
首先我们定义好 DomainClass 和 DomainClassField 的 CSV 文件:
# DomainClass
shortName(*),extInfo
SampleDynamicOrderDomain,
1
2
3
2
3
# DomainClassField
domainClass.shortName(*),name(*),dataType,referenceDomain.shortName,nullable,editable,defaultValue,options,extInfo
SampleDynamicOrderDomain,orderId,STRING,,Y,Y,,,
SampleDynamicOrderDomain,isActive,BOOLEAN,,N,N,,,
SampleDynamicOrderDomain,totalAmount,BIG_DECIMAL,,Y,N,,,
SampleDynamicOrderDomain,quantity,INTEGER,,N,Y,,,
SampleDynamicOrderDomain,productId,LONG,,Y,Y,,"[1,2,3]",
SampleDynamicOrderDomain,discountRate,DOUBLE,,Y,Y,,,
SampleDynamicOrderDomain,orderDate,LOCAL_DATE,,Y,Y,,,
SampleDynamicOrderDomain,deliveryDateTime,ZONED_DATETIME,,Y,Y,,,
SampleDynamicOrderDomain,additionalInfo,JSON_STRING,,Y,Y,,,
SampleDynamicOrderDomain,buyerTask,DOMAIN_OBJECT,SampleTask,Y,Y,,,
SampleDynamicOrderDomain,sellerTasks,DOMAIN_OBJECT_LIST,SampleTask,Y,Y,,,
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
接下来我们就可以定义我们的 POJO 类了:
package tech.muyan.plugin
import tech.muyan.api.DynamicDomainEntity
import java.time.LocalDate
import java.time.ZonedDateTime
class SampleDynamicOrderDomain implements DynamicDomainEntity {
Long id
String orderId
Boolean isActive
BigDecimal totalAmount
Integer quantity
Long productId
Double discountRate
LocalDate orderDate
ZonedDateTime deliveryDateTime
String additionalInfo
// SimpleTask 是另一个定义好的 POJO 类,这里只是举个例子,不再给出定义。
// 如果没有定义 SimpleTask 类,可以使用 Object 代替。下面的 sellerTasks 也是同理。
SimpleTask buyerTask
List<SampleTask> sellerTasks
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 使用数据模型绑定
参考 平台AIP 中的 SimpleQuery
工具类,可以通过数据模型绑定的方式来操作数据。例如
SampleDynamicOrderDomain domain = SimpleQuery
.of(SampleDynamicOrderDomain.class)
.eq("orderId", "123456")
.get()
1
2
3
4
2
3
4
或者可以将查询出来的数据转化为一个 POJO 对象:
SampleDynamicOrderDomain domain = SimpleQuery
.of("SampleDynamicOrderDomain")
.eq("orderId", "123456")
.get() as SampleDynamicOrderDomain
1
2
3
4
2
3
4
# 插件打包
开发完成后执行 gradle buildMuyanPlugin
任务打包插件,该项目中的所有第三方依赖包都会被打入插件中。需要注意的是 compileOnly
的第三方依赖打包时不会被包含进去。