各类动作我们都碰到过,但都没有展开讲过。这篇文章我们来系统介绍下oinone涉及到的所有Action类型。
一、动作类型
- 服务器动作ServerAction
- 类似于Spring MVC的控制器Controller,通过模型编码和动作名称路由,定义存储模型或代理模型将为该模型自动生成动作名称为consturct,queryOne,queryPage,create,update,delete,deleteWithFieldBatch的服务器动作。定义传输模型将为该模型自动生成动作名称为consturct的服务器动作
- 窗口动作ViewAction
- 站内跳转,通过模型编码和动作名称路由。系统将为存储模型和代理模型自动生成动作名称为redirectDetailPage的跳转详情页窗口动作,动作名称为redirectListPage的跳转列表页窗口动作,动作名称为redirectCreatePage的跳转新增页窗口动作,动作名称为redirectUpdatePage的跳转更新页窗口动作。
- 跳转动作UrlAction
- 外链跳转
- 客户端动作ClientAction
- 调用客户端函数
二、默认动作
- 如果在UI层级,有开放新增语义函数,则会默认生成新增的窗口动作ViewAction,跳转到新增页面
- 如果在UI层级,有开放更新语义函数,则会默认生成修改的窗口动作ViewAction,跳转到更新页面
- 如果在UI层级,有开放删除语义函数,则会默认生成删除的客户端动作ClientAction,弹出删除确认对话框
三、第一个服务器动作ServerAction
回顾第一个ServerAction
第一个ServerAction是在3.3.2【模型的类型】一文中的“代理模型”部分出现的,再来看下当时的定义代码
package pro.shushi.pamirs.demo.core.action;
……引用类
@Model.model(PetShopProxy.MODEL_MODEL)
@Component
public class PetShopProxyAction extends DataStatusBehavior<PetShopProxy> {
@Override
protected PetShopProxy fetchData(PetShopProxy data) {
return data.queryById();
}
@Action(displayName = "启用")
public PetShopProxy dataStatusEnable(PetShopProxy data){
data = super.dataStatusEnable(data);
data.updateById();
return data;
}
……其他代码
}
-
@Action注解将创建服务器动作,并@Model.model绑定
ServerAction之校验(举例)
Step1 为动作配置校验表达式
使用@Validation注解为PetShopProxyAction的dataStatusEnable服务端动作进行校验表达式配置
package pro.shushi.pamirs.demo.core.action;
……引用类
@Model.model(PetShopProxy.MODEL_MODEL)
@Component
public class PetShopProxyAction extends DataStatusBehavior<PetShopProxy> {
@Override
protected PetShopProxy fetchData(PetShopProxy data) {
return data.queryById();
}
@Validation(ruleWithTips = {
@Validation.Rule(value = "!IS_BLANK(data.code)", error = "编码为必填项"),
@Validation.Rule(value = "LEN(data.shopName) < 128", error = "名称过长,不能超过128位"),
})
@Action(displayName = "启用")
public PetShopProxy dataStatusEnable(PetShopProxy data){
data = super.dataStatusEnable(data);
data.updateById();
return data;
}
……其他代码
}
注:
-
ruleWithTips可以声明多个校验规则及错误提示;
-
IS_BLANK和LEN为内置文本函数,更多内置函数详见4.1.12【函数之内置函数与表达式】一文;
-
当内置函数不满足时参考4.1.13【Action之校验】一文。
Step2 重启看效果
在商店管理页面点击【启用】得到了预期返回错误信息,显示"编码为必填项"
ServerAction之前端展示规则(举例)
既然后端对ServerAction发起提交做了校验,那能不能在前端就不展示呢?当然可以,我们现在就来试下。
Step1 配置PetShopProxyAction的dataStatusEnable的前端出现规则
用注解@Action.Advanced(invisible="!(activeRecord.code !== undefined && !IS_BLANK(activeRecord.code))")来表示,注意这里配对invisible是给前端识别的,所以写法上跟后端的校验有些不一样,但如内置函数IS_BLANK这些是前后端一致实现的,activeRecord在前端用于表示当前记录。
package pro.shushi.pamirs.demo.core.action;
……引用类
@Model.model(PetShopProxy.MODEL_MODEL)
@Component
public class PetShopProxyAction extends DataStatusBehavior<PetShopProxy> {
@Override
protected PetShopProxy fetchData(PetShopProxy data) {
return data.queryById();
}
@Validation(ruleWithTips = {
@Validation.Rule(value = "!IS_BLANK(data.code)", error = "编码为必填项"),
@Validation.Rule(value = "LEN(data.name) < 128", error = "名称过长,不能超过128位"),
})
@Action(displayName = "启用")
@Action.Advanced(invisible="!(activeRecord.code !== undefined && !IS_BLANK(activeRecord.code))")
public PetShopProxy dataStatusEnable(PetShopProxy data){
data = super.dataStatusEnable(data);
data.updateById();
return data;
}
……其他代码
}
Step2 重启看效果
我们发现店铺编码为空的记录,没有了【启用】的操作按钮
ServerAction配置说明
常用配合
- contextType设置动作上下文类型
a. SINGLE(默认)——单行,常用于列表页(展示在每行末尾的操作栏中)和表单页(展示在页面上方)
b. BATCH——多行,常用于列表页(展示在表格上方按钮区)
c. SINGLE_AND_BATCH——单行或多行,常用于列表页(展示在表格上方按钮区)
d. CONTEXT_FREE——上下文无关,常用于列表页(展示在表格上方按钮区)
- bindingType设置按钮所在页面类型(以下仅说明常用类型,详见ViewTypeEnum)
a. TABLE——列表页
b. GALLERY——画廊
c. FORM——表单页
d. DETAIL——详情页
e. CUSTOM——自定义页
注解大全
@Action
├── displayName 显示名称
├── summary 摘要摘要
├── contextType 动作上下文,可选项详见ActionContextTypeEnum
├── bindingType 所在页面类型,可选项详见ViewTypeEnum
├── Advanced 更多配置
│ ├── name 技术名称,默认Java方法名
│ ├── args 参数,默认java参数
│ ├── type 方法类型,默认UPDATE,可选项详见FunctionTypeEnum
│ ├── language 方法实现语言,默认JAVA,可选项详见FunctionLanguageEnum
│ └── invisible 隐藏规则
│ └── bindingView 绑定特定视图
│ └── priority 展示顺序
四、第一个窗口动作ViewAction
回顾第一个ViewAction
第一个ViewAction是在3.3.2【模型的类型】一文中的“传输模型”部分出现的,再来看下当时的定义代码。
package pro.shushi.pamirs.demo.core.init;
……引用类
@Component
public class DemoModuleMetaDataEditor implements MetaDataEditor {
@Override
public void edit(AppLifecycleCommand command, Map<String, Meta> metaMap) {
InitializationUtil util = InitializationUtil.get(metaMap, DemoModule.MODULE_MODULE,DemoModule.MODULE_NAME);
if(util==null){
return;
}
……其他代码
//初始化自定义前端行为
viewActionInit(util);
……其他代码
}
private void viewActionInit(InitializationUtil util){
util.createViewAction("demo_petShop_batch_update","批量更新数据状态", PetShopProxy.MODEL_MODEL,
InitializationUtil.getOptions(ViewTypeEnum.TABLE), PetShopBatchUpdate.MODEL_MODEL,ViewTypeEnum.FORM, ActionContextTypeEnum.SINGLE_AND_BATCH
, ActionTargetEnum.DIALOG,null,null);
}
……其他代码
}
createViewAction参数详解(建议更换为注解方式)
参数名 | 类型 | 说明 |
---|---|---|
name | String | 技术名称,唯一建要求 |
displayName | String | 展示名称 |
originModel | String | ViewAction的绑定模型 |
originViewTypes | List | ViewAction在绑定模型的哪些视图类型上展示 |
targetModel | String | ViewAction跳转到的目标模型 |
targetViewType | ViewTypeEnum | ViewAction跳转到的目标模型的什么类型视图 |
contextType | ActionContextTypeEnum | ViewAction在绑定模型视图上设置展示的动作上下文类型SINGLE(默认)——单行,常用于列表页(展示在每行末尾的操作栏中)和表单页(展示在页面上方)BATCH——多行,常用于列表页(展示在表格上方按钮区)SINGLE_AND_BATCH——单行或多行,常用于列表页(展示在表格上方按钮区)CONTEXT_FREE——上下文无关,常用于列表页(展示在表格上方按钮区) |
pageTarget | ActionTargetEnum | 页面打开方式 ROUTER:页面路由 DIALOG:页面弹窗 OPEN_WINDOW:打开新窗口DRAWER:打开抽屉 |
resViewName | String | ViewAction跳转到的目标模型的指定视图的名称,该视图的类型需要跟targetViewType一致 |
title | String | 页面标题 |
非createViewAction方法的参数,但是ViewAction模型有的属性,可在调用createViewAction以后,在通过setXX属性方法来设置对应属性字段值 | ||
priority | Intget | 展示顺序 |
bindingView | String | 绑定特定视图 |
invisible | String | 隐藏规则 |
load | String | 对于特殊模型的窗口动作进行定制化的加载方式 |
filter | String | 代表后端过滤,是一定会加上的过滤条件,用户无感知 |
domain | String | 代表前端过滤,是默认会加上的过滤条件,用户可以去除该搜索条件 |
注解见:@UxRouteButton(action = @UxAction(),value = @UxRoute())
ViewAction高级参数-Load(下个版本支持)
一般用于以下场景:
-
对于特殊模型的窗口动作进行定制化的加载方式。
-
不同模型间跳转时,可根据上一个模型的数据内容加载另一个模型的数据内容。
使用初始化工具类设置Load函数:
util.modifyViewAction(TestModele.MODEL_MODEL, InitializationUtil.DEFAULT_CREATE,
viewAction -> viewAction.setLoad("createPageLoad"));
注:
所示修改窗口动作方法将TestModel模型的默认创建页的加载函数从construct函数改为了createPageLoad函数。
替代方案:构建模型子类,通过子类来重写construct方法
ViewAction高级参数filter和domain(举例)
filter当前版本支持,domain下个版本支持,之所以放一起讲是因为这是过滤的两种形态。
-
filter代表后端过滤,是一定会加上的过滤条件,用户无感知
-
domain代表前端过滤,是默认会加上的过滤条件,用户可以去除该搜索条件
Step1 修改自定义pet_talent_table.xml查询条件增加name字段
<view name="tableView" model="demo.PetTalent" cols="1" type="TABLE" enableSequence="true" layout="petTalentTableLayout">
……其他代码
<template slot="search" cols="4">
<field data="name" label="达人"/>
<field data="dataStatus" label="数据状态">
<options>
<option name="DRAFT" displayName="草稿" value="DRAFT" state="ACTIVE"/>
<option name="NOT_ENABLED" displayName="未启用" value="NOT_ENABLED" state="ACTIVE"/>
<option name="ENABLED" displayName="已启用" value="ENABLED" state="ACTIVE"/>
<option name="DISABLED" displayName="已禁用" value="DISABLED" state="ACTIVE"/>
</options>
</field>
<field data="createDate" label="创建时间"/>
</template>
</view>
Step2 为宠物达人模型的两个菜单入口分配置filter和domain
把【宠物达人】菜单调整为三个菜单【宠物达人1】、【宠物达人2】、【宠物达人3】分别设置filter和domain
-
修改以菜单【宠物达人1】为入口的ViewAction的filter:
- @UxRoute(filter = "name =like= \’老\’")字符串要符合RSQL
-
修改以菜单【宠狗达人2】为入口的ViewAction的domain:
- @UxRoute(domain = "name =like= \’老\’") 字符串要符合RSQL
-
修改以菜单【宠狗达人3】跟函数结合,设置时间默认过滤条件:
-
@UxRoute(domain = "createDate =ge= \’${ADD_DAY(NOW_STR(),-7)}\’ and createDate =lt= \’${NOW_STR()}\’") 字符串要符合RSQL;
-
createDate =ge= \’${ADD_DAY(NOW_STR(),-7)}\’ and createDate =lt= \’${NOW_STR()}\’
-
用到函数需要用${}装饰;
-
更多函数详见4.1.12【函数之内置函数与表达式】一文。
-
-
-
domain的操作符需要跟页面搜索字段定义的操作符一致,比如name字符串字段搜索默认操作符是=like=,如果配置成其他则无效。
@UxMenu("宠物达人1")@UxRoute(value = PetTalent.MODEL_MODEL,filter = "name =like= '老'") class PetTalentMenu{}
@UxMenu("宠物达人2")@UxRoute(value = PetTalent.MODEL_MODEL,domain = "name =like= '老'") class PetTalent2Menu{}
@UxMenu("宠物达人3")@UxRoute(value = PetTalent.MODEL_MODEL,domain = "createDate =ge= '${ADD_DAY(NOW_STR(),-7)}' and createDate =lt= '${NOW_STR()}'") class PetTalent3Menu{}
Step3 重启看效果
因为【宠物达人1】对应ViewAction加的是Filter,所以只能看到达人名称带“老”字的记录
因为【宠物达人2】对应ViewAction加的是Domain,前端搜索栏里【达人】字段搜索条件为“老”字,达人名称带“老”字的记录,可以手工删除再次搜索全部数据
因为【宠物达人3】对应ViewAction加的是Domain,前端搜索栏里【创建时间】字段带近7天过滤条件,可以手工删除再次搜索全部数据
五、第一个跳转动作UrlAction
回顾第一个UrlAction
在3.5.1【构建第一个Menu】一文中用@UxMenu.url定义了一个百度的菜单,该菜单背后就是一个普通的UrlAction
@UxMenu("Oinone官网")@UxLink(value = "http://www.oinone.top",openType= ActionTargetEnum.OPEN_WINDOW) class SsLink{}
URL计算表达式(暂不支持)
@UxMenu("百度") @UxLink(value = "http://www.baidu.com?wd=${activeRecord.technicalName}",openType= ActionTargetEnum.OPEN_WINDOW) class BaiduLink{}
Compute函数(暂不支持)
@UxMenu("百度") @UxLink(value = "http://www.baidu.com",openType= ActionTargetEnum.OPEN_WINDOW,context = {@Prop(name="wd",value= "activeRecord.technicalName"),compute="computeSearchUrl"}) class BaiduLink{}
@Model.model(PetTalent.MODEL_MODEL)
public class PetTalentAction {
@Function(openLevel = FunctionOpenEnum.API, summary = "计算搜索Url")
@Function.Advanced(type = FunctionTypeEnum.QUERY)
public String computeSearchUrl(TestModel data) {
return "https://www.baidu.com/s?wd=" + data.getName();
}
}
注:
- 代码所示创建链接动作含义为:以新标签页方式跳转至指定URL,该URL值来自于调用后端computeSearchUrl方法的返回值。
六、第一个客户端动作ClientAction
基础客户端动作(举例)
给批量修改店铺状态弹出页面增加一个【自定义返回】和【自定义关闭】按钮,这里注意contextType只能配置为“ActionContextTypeEnum.SINGLE”,因为Form默认只展示contextType为SINGLE的Action
Step1 在PetShopBatchUpdateAction增加@UxClientButton注解
@Model.model(PetShopBatchUpdate.MODEL_MODEL)
@UxClientButton(action = @UxAction(name = "demo_back_test", label = "自定义返回",contextType = ActionContextTypeEnum.SINGLE,bindingType = ViewTypeEnum.FORM),value = @UxClient(value = "$$internal_GotoListTableRouter"))
@UxClientButton(action = @UxAction(name = "demo_close_test", label = "自定义关闭",contextType = ActionContextTypeEnum.SINGLE,bindingType = ViewTypeEnum.FORM),value = @UxClient(value = "$$internal_DialogCancel"))
@Component
public class PetShopBatchUpdateAction {
}
Step2 重启看效果
前端动作之组合动作(举例)
通过自定义View的Template来设置组合动作,同时学习下自定义视图时如何设置需要展示Action,还是以批量修改店铺状态弹出页面为例子,我们只展示一个组合动作按钮【组合动作】,它包含表单校验、提交、关闭并刷新主视图等行为动作
Step1 自定义弹出框View
-
在views/demo_core/template路径下增加一个名为pet_shop_batch_update_form.xml文件
-
再通过数据库查看默认页面定义,找到base_view表,过滤条件设置为model =\’demo.PetShopBatchUpdate\’,我们就看到该模型下对应的所有view,这些是系统根据该模型的ViewAction对应生成的默认视图,找到类型为【表单(type = FORM)】的记录,查看template字段,复制给pet_shop_batch_update_form.xml文件
-
把【
<template slot="actions" autoFill="true"/>
】替换成以下内容
<template slot="actions" >
<action actionType="composition" label="组合动作">
<action actionType="client" name="$$internal_ValidateForm" />
<action name="conform" />
<action actionType="client" name="$$internal_GotoListTableRouter" />
</action>
</template>
Step2 重启看效果
这个页面只保留了【组合动作】一个按钮,其他没有配置的按钮就会隐藏掉。
平台默认前端动作:
有元数据定义名的建议最好用元数据名,比如平台默认前端导入动作“$$internal_GotoListImportDialog”可以用“internalGotoListImportDialog”来替代,这样的好处是管理一致,比如权限等功能设置.
<!-- <action name="$$internal_GotoListImportDialog" label="导入" /> 可以用下面方式替代,可以用于权限 -->
<action name="internalGotoListImportDialog" label="导入" />
name | 适用场景 | 功能描述 | 元数据定义名 |
---|---|---|---|
$$internal_GotoListTableRouter | 通用 | 返回上一个页面 | internalGotoListTableRouter |
$$internal_DeleteOne | 关系字段表格 | 删除绑定的表格的选中数据 | internalDeleteOne |
$$internal_DialogCancel | 弹窗 | 关闭当前弹窗 | |
$$internal_ReloadData | 弹窗 | 刷新当前主视图组件 | |
$$internal_ListInsertOneAndCloseDialog | 通用 | 打开一个创建弹窗 | |
$$internal_GotoM2MListDialog | 多对多关系 表格 | 打开M2M表格的创建弹窗 | |
$$internal_GotoO2MCreateDialog | 一对多关系 表格 | 打开O2M表格的创建弹窗 | |
$$internal_GotoO2MEditDialog | 一对多关系 表格 | 打开O2M表格的编辑弹窗 | |
$$internal_ListInsertOneAndBackToList | 表单 | 校验表单数据,提交到后端,返回表格(新建) | |
$$internal_ListUpdateOneAndBackToList | 表单 | 校验表单数据,提交到后端,返回表格(更新) | |
$$internal_ValidateForm | 表单 | 校验当前表单 | |
$$internal_GotoListExportDialog | 一般用于表格 | 数据导出的action | internal_GotoListImportDialog |
$$internal_GotoListImportDialog | 一般用于表格 | 数据导入的action | internalGotoListImportDialog |
Oinone社区 作者:史, 昂原创文章,如若转载,请注明出处:https://doc.oinone.top/oio4/9255.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验