3.5.7.5 自定义动作

动作是什么

动作(action)描述了终端用户的各种操作。这些操作可以涉及多个层面,包括但不限于:

  1. 页面间的跳转:用户可以通过动作从一个页面跳转到另一个页面。

  2. 业务交互:动作可以触发与后端服务的交互,例如提交表单、请求数据等。

  3. 界面操作:动作可以用于打开模态对话框、抽屉(侧边栏)等界面元素。

作用场景

Oinone 平台内置了一系列的基础动作,默认实现了常见的功能,如页面跳转、业务交互和界面操作等。这些内置动作旨在满足大多数标准应用场景的需求,简化开发过程,提高开发效率。以下是一些常见的内置动作示例:

  1. 页面跳转:允许用户在不同页面间导航。

  2. 业务交互:支持与后端服务的数据交互,如提交表单。

  3. 界面操作:提供动态返回上一页、校验表单、关闭弹窗等。

自定义动作的需求场景

尽管内置动作覆盖了许多常规需求,但在某些复杂或特定的业务场景中,可能需要更加个性化的处理。这些场景可能包括:

  • 特殊的业务逻辑:需要执行不同于标准流程的特定业务操作。
  • 个性化的用户界面:标准的 UI 组件无法满足特定的设计要求。
  • 高级交互功能:需要实现复杂的用户交互和数据处理。

扩展和定制动作

为了满足这些特定需求,Oinone 平台支持通过继承和扩展来自定义动作。开发者可以通过以下步骤实现自定义动作:

  1. 继承基类:从平台提供的动作基类继承,这为自定义动作提供了基础框架和必要的接口。

  2. 实现业务逻辑:在继承的基础上,添加特定的业务逻辑实现。

  3. 自定义界面:根据需要调整或完全重写界面组件,以符合特定的UI设计。

  4. 集成测试:确保自定义动作在各种情况下的稳定性和性能。

最佳实践

  • 明确需求:在进行扩展之前,清楚地定义业务需求和目标。
  • 重用现有功能:尽可能利用平台的内置功能和组件。
  • 保持一致性:确保自定义动作与平台的整体风格和标准保持一致。
  • 充分测试:进行全面的测试,确保新动作的稳定性和可靠性。

案例分析

假设有一个场景,需要一个特殊的数据提交流程,该流程不仅包括标准的表单提交,还涉及复杂的数据验证和后续处理。在这种情况下,可以创建一个自定义动作,继承基础动作类并实现特定的业务逻辑和用户界面。

自定义动作

自定义跳转动作

示例工程目录

以下是需关注的工程目录示例,main.ts更新导入./action,action/index.ts更新导出./custom-viewactioin:

image.png

图3-5-7-24 自定义跳转动作工程目录示例

步骤 1: 创建自定义动作类

首先,您创建了一个名为 CustomViewAction 的类,这个类继承自 RouterViewActionWidget。这意味着自定义动作是基于路由视图动作的,这通常涉及页面跳转或导航。

import {ActionWidget, RouterViewActionWidget, SPI} from '@kunlun/dependencies';
import CustomViewActionVue from './CustomViewAction.vue';

@SPI.ClassFactory(
    ActionWidget.Token({
        model: 'resource.ResourceCity',
        name: 'redirectCreatePage'
    })
)
export class CustomViewAction extends RouterViewActionWidget {
    public initialize(props) {
        super.initialize(props);
        this.setComponent(CustomViewActionVue);
        return this;
    }
}

图3-5-7-24 自定义跳转动作组件(TS)代码示例

  • @SPI.ClassFactory: 这是一个装饰器,用于向平台注册这个新的动作。
  • ActionWidget.Token: 通过这个Token,指定了这个动作与特定模型 (resource.ResourceCity) 关联,并给这个动作命名 (redirectCreatePage).
步骤 2: 初始化和设置组件

在 initialize 方法中,调用了父类的初始化方法,并设置了自定义的 Vue 组件。

public initialize(props) {
  super.initialize(props);
  this.setComponent(CustomViewActionVue);
  return this;
}

图3-5-7-24 初始化和设置组件

步骤 3: 定义 Vue 组件

在 CustomViewAction.vue 文件中,定义了自定义动作的视觉表示。

<template>
  <div class="view-action-wrapper">
    自定义挑战跳转动作
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
  inheritAttrs: false,
  name: 'ViewActionComponent'
})
</script>

<style lang="scss">
.view-action-wrapper {
}
</style>

图3-5-7-24 自定义跳转动作组件(Vue)代码示例

步骤 4: 效果如下

image.png

图3-5-7-24 自定义跳转动作效果示例

自定义服务器动作

示例工程目录

以下是需关注的工程目录示例,action/index.ts更新导出./custom-serveraction:

image.png

图3-5-7-24 自定义服务器动作工程目录示例

步骤 1: 创建自定义动作类

首先, 创建了一个名为 CustomServerAction 的类,这个类继承自 ServerActionWidget。这表明您的自定义动作主要关注服务器端的逻辑。

import {ActionWidget, ServerActionWidget, SPI, Widget} from '@kunlun/dependencies';
import CustomServerActionVue from './CustomServerAction.vue';

@SPI.ClassFactory(
    ActionWidget.Token({
        model: 'resource.ResourceCity',
        name: 'delete'
    })
)
export class CustomServerAction extends ServerActionWidget {
    public initialize(props) {
        super.initialize(props);
        this.setComponent(CustomServerActionVue);
        return this;
    }

    @Widget.Method()
    public clickAction() {
        // 这里断点试试看
        return super.clickAction()
    }
}

图3-5-7-24 自定义服务器动作组件(TS)示例

  • @SPI.ClassFactory: 这个装饰器用于向平台注册新的动作。

  • ActionWidget.Token: 这里指定了动作与 resource.ResourceCity 模型相关联,动作名为 delete。

步骤 2: 初始化和设置组件

在 initialize 方法中,调用了父类的初始化方法,并将 Vue 组件与动作关联。

public initialize(props) {
  super.initialize(props);
  this.setComponent(CustomServerActionVue);
  return this;
}

图3-5-7-24 初始化和设置组件

步骤 3: 定义动作行为

重写了 clickAction 方法,这是触发服务器动作的主要入口点。在这个方法中,您可以添加自定义逻辑,然后调用 super.clickAction() 来执行默认的服务器动作。

@Widget.Method()
  public clickAction() {
    // 这里可以添加自定义逻辑
    return super.clickAction();
  }

图3-5-7-24 定义动作行为

步骤 4: Vue 组件
<template>
  <div class="server-action-wrapper" @click="clickAction">
    自定义服务器动作
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
  inheritAttrs: false,
  name: 'ServerActionComponent',
  props: ['clickAction']
})
</script>

<style lang="scss">
.server-action-wrapper {
}
</style>

图3-5-7-24 自定义服务器动作组件(Vue)示例

Vue 组件定义了如何在前端显示和触发这个动作。

<style lang="scss">
  .server-action-wrapper {
    // 样式定义
  }
</style>

图3-5-7-24 Vue组件定义显示和触发

  • 这个模板中的 @click="clickAction" 是触发动作的关键部分。
步骤 5: 样式和行为

同样,为该组件定义了样式,并通过 defineComponent 创建了 Vue 组件。

<style lang="scss">
  .server-action-wrapper {
    // 样式定义
  }
</style>

图3-5-7-24 Vue组件定义样式

效果

image.png

图3-5-7-24 自定义服务区动作效果示例

Oinone社区 作者:史, 昂原创文章,如若转载,请注明出处:https://doc.oinone.top/oio4/9268.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
史, 昂's avatar史, 昂数式管理员
Previous 2024年5月23日 am9:10
Next 2024年5月23日 am9:12

相关推荐

  • 第2章 Oinone的技术独特性

    本章的主要目的是通过分析企业商业支撑软件的项目特性和关注点,找到企业软件发展的另一个本质变化——新技术流派的产生。在对“互联网架构做为最佳实践为何失效”的思考基础上,我们分析互联网中台架构的发展历史以及企业实际现状,找出其水土不服的原因。进而引出Oinone的低代码开发平台如何结合互联网架构并完成创新,以满足企业数字化转型的需求。 具体而言,本章包括以下内容: 企业软件发展的另一个本质变化:新技术流派的产生; 最佳实践为何失效?Oinone如何打造具有企业特色的互联网架构; Oinone独特性之源:元数据与设计原则; Oinone独特性之单体与分布式的灵活切换; Oinone独特性之每一个需求都是一个模块; Oinone独特性之低无一体。

    Oinone 7天入门到精通 2024年5月23日
    7.4K00
  • 接口日志

    记录每个PAPI接口执行日志,接口的响应结果、执行时间、执行时长等信息,可查看接口详情。 接口详情

    2023年5月23日
    1.5K00
  • 4.1.18 框架之网关协议-Variables变量

    我们在应用开发过程有一种特殊情况在后端逻辑编写的时候需要知道请求的发起入口,平台利用GQL协议中的Variables属性来传递信息,本文就介绍如何获取。 一、前端附带额外变量 属性名 类型 说明 scene String 菜单入口 表4-1-18-1 前端附带额外变量 图4-1-18-1 variables信息中的scene 二、后端如何接收variables信息 通过PamirsSession.getRequestVariables()可以得到PamirsRequestVariables对象。 三、第一个variable(举例) Step1 修改PetTalentAction,获取得到前端传递的Variables package pro.shushi.pamirs.demo.core.action; ……类引用 @Model.model(PetTalent.MODEL_MODEL) @Component public class PetTalentAction { ……其他代码 @Function.Advanced(type= FunctionTypeEnum.QUERY) @Function.fun(FunctionConstants.queryPage) @Function(openLevel = {FunctionOpenEnum.API}) public Pagination<PetTalent> queryPage(Pagination<PetTalent> page, IWrapper<PetTalent> queryWrapper){ String scene = (String)PamirsSession.getRequestVariables().getVariables().get("scene"); System.out.println("scene: "+ scene); ……其他代码 } ……其他代码 } 图4-1-18-2 修改PetTalentAction Step2 重启验证 点击宠物达人不同菜单入口,查看效果 图4-1-18-3 示例效果(一) 图4-1-18-4 示例效果(二)

    2024年5月23日
    1.9K00
  • 4.1.19 框架之网关协议-后端占位符

    在我们日常开发中会有碰到一些特殊场景,需要由前端来传一些如“当前用户Id”、“当前用户code”诸如此类只有后端才知道值的参数,那么后端占位符就是来解决类似问题的。如前端传${currentUserId},后端会自动替换为当前用户Id。 Step1 后端定义占位符 我们新建一个UserPlaceHolder继承AbstractPlaceHolderParser,用namespace来定义一个“currentUserId”的占位符,其对应值由value()决定为“PamirsSession.getUserId().toString()”,active要为真才有效,priority为优先级 package pro.shushi.pamirs.demo.core.placeholder; import org.springframework.stereotype.Component; import pro.shushi.pamirs.meta.api.session.PamirsSession; import pro.shushi.pamirs.user.api.AbstractPlaceHolderParser; @Component public class UserPlaceHolder extends AbstractPlaceHolderParser { @Override protected String value() { return PamirsSession.getUserId().toString(); } @Override public Integer priority() { return 10; } @Override public Boolean active() { return Boolean.TRUE; } @Override public String namespace() { return "currentUserId"; } } 图4-1-19-1 后端定义占位符 Step2 前端使用后端占位符 我们经常在o2m和m2m中会设置domain来过滤数据,这里案例就是在field中设置来过滤条件,domain="createUid == $#{currentUserId}",注意这里用的是$#{currentUserId} 而不是${currentUserId},这是前端为了区分真正变量和后端占位符,提交的时候会把#过滤掉提交。修改宠物达人表格视图的Template中search部分 <template slot="search" cols="4"> <field data="name" label="达人"/> <field data="petTalentSex" multi="true" label="达人性别"/> <field data="creater" /> <!– <field data="petShops" label="宠物商店" domain="createUid == ${activeRecord.creater.id}"/>–> <field data="petShops" label="宠物商店" domain="createUid == $#{currentUserId}"/> <field data="dataStatus" label="数据状态" multi="true"> <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="创建时间"/> <field data="unStore" /> </template> 图4-1-19-2 前端使用后端占位符 Step3 重启看效果 请求上都带上了createUid==${currentUserId} 图4-1-19-3 示例效果

    2024年5月23日
    2.3K00
  • 流程

    1. 流程介绍 日常工作和生活中到处都存在各种各样的流程,例如业务开展中的产品研发流程、产品制作流程、订单发货流程等,也有管控分险的费用报销流程、员工请假审批流程、项目立项流程等。流程设计器可以帮助公司实现流程的数字化,规范流程操作,减少人工操作并留存痕迹,提高工作效率和安全性。 2. 流程的组成 流程设计器主要包含基本操作和流程设计两个部分。前者包含了流程的新增、删除、复制、停用/启用、编辑、搜索。后者包含单一流程的基础信息修改、流程设计、参数配置、保存、发布。 2.1 流程的基本操作 流程页面有两种显示方式,默认为平铺显示的模式,可以点击切换为列表详情显示的模式。 2.1.1 新增 平铺显示和列表详情模式下点击左上角的创建按钮即可新增一个流程,点击后进入流程设计页面,流程名默认为“未命名流程”,可自行修改。 2.1.2 删除 遇到流程创建有误,没有使用过且将来也不会使用该流程,可以删除流程。需要注意的是,删除流程的前提是该流程已停用,并且该流程从未执行过。 2.1.3 复制 遇到流程节点动作相似度较高的情况可以使用复制流程的功能,点击按钮后生成一个“原流程名-复制”的流程,并且进入新流程的流程设计界面。 2.1.4 停用/启用 流程需要更新或暂时不用时可以使用停用功能。流程停用后将不会执行流程中的动作,正在执行中的流程不受停用影响,会正常执行直到流程结束。 点击启用按钮,流程恢复启用状态,可正常触发。 2.1.5 编辑 点击编辑进入该流程的设计页面。 2.1.6 搜索 页面最上方的是搜索区,可以按照流程名称、触发方式、启用状态、更新状态进行筛选搜素,点击重置按钮修改搜索条件。

    2024年1月20日
    2.4K00

Leave a Reply

Please Login to Comment