前端 快速查询并替换默认组件

可以借助vue的调试工具快速找到对应的组件,请参考这篇文章 使用vue调试工具快速找到对应的组件

Mask默认组件

前端 快速查询并替换默认组件

重写Mask组件

重写AppSwitcherWidget
import Com from './com.vue'
/**
* SPI注册条件保持根 AppSwitcherWidget 一致,即可覆盖
*/
@SPI.ClassFactory(
  MaskWidget.Token({
    widget: 'app-switcher'
  })
)
export class CustomAppSwitcherWidget extends AppSwitcherWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }
}
重写 MenuWidget
import Com from './com.vue'

/**
* SPI注册条件保持根 MenuWidget 一致,即可覆盖
*/
@SPI.ClassFactory(MaskWidget.Token({ widget: 'nav-menu' }))
export class CustomMenuWidget extends MenuWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }
}
重写 NotificationWidget
import Com from './com.vue'

/**
* SPI注册条件保持根 NotificationWidget 一致,即可覆盖
*/
@SPI.ClassFactory(MaskWidget.Token({ widget: 'notification' }))
export class CustomNotificationWidget extends NotificationWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }
}
重写 LanguageWidget
import Com from './com.vue'

/**
* SPI注册条件保持根 LanguageWidget 一致,即可覆盖
*/
@SPI.ClassFactory(MaskWidget.Token({ widget: 'language' }))
export class CustomLanguageWidget extends LanguageWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }
}
重写 UserWidget
import Com from './com.vue'

/**
* SPI注册条件保持根 UserWidget 一致,即可覆盖
*/
@SPI.ClassFactory(MaskWidget.Token({ widget: 'user' }))
export class CustomUserWidget extends UserWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }
}
重写 BreadcrumbWidget
import Com from './com.vue'

/**
* SPI注册条件保持根 BreadcrumbWidget 一致,即可覆盖
*/
@SPI.ClassFactory(MaskWidget.Token({ widget: 'breadcrumb' }))
export class CustomBreadcrumbWidget extends BreadcrumbWidget {
  /**
  * 如果需要重写vue组件,那么可以通过重写initialize方法来实现,如果是修改数据或者逻辑,那么可以删除这个函数
  */
  public initialize(props: any) {
    super.initialize(props);
    this.setComponent(Com)
    return this
  }

视图默认组件

重写 TableWidget(表格视图)

参考文章https://doc.oinone.top/frontend/18386.html

重写 FormWidget(表单视图)

参考文章https://doc.oinone.top/frontend/18386.html

重写 DetailWidget(详情视图)

参考文章https://doc.oinone.top/frontend/18386.html

重写 SearchWidget(搜索区域视图)

参考文章https://doc.oinone.top/frontend/18386.html

重写 GalleryWidget(画廊视图)

参考文章https://doc.oinone.top/frontend/18386.html

字段默认组件

重写字段组件

参考文章https://doc.oinone.top/frontend/18386.html

动作默认组件

前端 快速查询并替换默认组件

重写 RouterViewActionWidget(路由跳转新视图)
@SPI.ClassFactory(
  ActionWidget.Token({
    actionType: ActionType.View,
    target: ViewActionTarget.Router,
    model: '当前模型编码', // 改成当前动作对应的模型编码(action.model)
    name: '名称' // 当前动作的名称 (action.name)
  })
)
export class CustomRouterViewActionWidget extends RouterViewActionWidget {
  protected async clickAction() {
    return super.clickAction()
  }
}
重写 DialogViewActionWidget(弹窗打开视图)
@SPI.ClassFactory(
  ActionWidget.Token({
    actionType: ActionType.View,
    target: ViewActionTarget.Dialog,
    model: '当前模型编码', // 改成当前动作对应的模型编码(action.model)
    name: '名称' // 当前动作的名称 (action.name)
  })
)
export class CustomDialogViewActionWidget extends DialogViewActionWidget {
  protected async clickAction() {
    return super.clickAction()
  }
}
重写 ServerActionWidget (服务端动作)
@SPI.ClassFactory(
  ActionWidget.Token({
    actionType: ActionType.Server,
    model: '当前模型编码', // 改成当前动作对应的模型编码(action.model)
    name: '名称' // 当前动作的名称 (action.name)
  })
)
export class CustomServerActionWidget extends ServerActionWidget {
  protected async clickAction() {
    return super.clickAction()
  }
}
重写 UrlActionWidget (链接动作)
@SPI.ClassFactory(
  ActionWidget.Token({
    actionType: ActionType.URL,
    model: '当前模型编码', // 改成当前动作对应的模型编码(action.model)
    name: '名称' // 当前动作的名称 (action.name)
  })
)
export class CustomUrlActionWidget extends UrlActionWidget {
  protected async clickAction() {
    return super.clickAction()
  }
重写 客户端动作
@SPI.ClassFactory(
  ActionWidget.Token({
    model: 'resource.k2.Model0000011045', // 改成当前动作对应的模型编码(action.model)
    name: ModelDefaultActionName.$$internal_GotoListTableRouter // name需要取当前动作里面的 fun 属性(action.fun)
  })
)
export class CustomBackActionWidget extends BackActionWidget {
  protected async clickAction() {
    return super.clickAction();
  }
}

Oinone社区 作者:汤乾华原创文章,如若转载,请注明出处:https://doc.oinone.top/other/21531.html

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

(0)
汤乾华的头像汤乾华数式员工
上一篇 2025年8月13日 pm5:46
下一篇 2025年8月21日 pm2:13

相关推荐

  • 如何通过业务数据拿到工作流用户任务待办

    在模型里面建一个非存储字段,用来传输工作流用户任务待办ID。。 界面设计器把这个字段拖到列表页里,并在跳转动作上配置上下文参数,把任务待办id传到表单页里。 重写教师模型的queryPage,通过业务数据id查询出每条业务数据的工作流用户任务待办id返回给前端。 @Function.Advanced(displayName = "查询教师列表", type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE, managed = true) @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API}) public Pagination<Teacher> queryPage(Pagination<Teacher> page, IWrapper<Teacher> queryWrapper) { Pagination<Teacher> teacherPagination = new Teacher().queryPage(page, queryWrapper); List<Teacher> content = teacherPagination.getContent(); if (CollectionUtils.isEmpty(content)) { return teacherPagination; } List<Long> teacherIds = content.stream().map(Teacher::getId).collect(Collectors.toList()); List<WorkflowUserTask> workflowUserTasks = Models.data().queryListByWrapper(Pops.<WorkflowUserTask>lambdaQuery() .from(WorkflowUserTask.MODEL_MODEL) .in(WorkflowUserTask::getNodeDataBizId, teacherIds) .orderByDesc(WorkflowUserTask::getCreateDate) ); if (CollectionUtils.isEmpty(workflowUserTasks)) { return teacherPagination; } Map<Long/*业务id*/, WorkflowUserTask> userTaskMap = workflowUserTasks.stream().collect(Collectors.toMap( WorkflowUserTask::getNodeDataBizId, a -> a, (old, n) -> old) ); for (Teacher teacher : content) { if (userTaskMap.containsKey(teacher.getId())) { teacher.setWorkflowUserTaskId(userTaskMap.get(teacher.getId()).getId()); } } return teacherPagination; } 查看效果,任务待办id成功传到表单里面。

    2025年1月10日
    1.6K00
  • 前端自定义组件之锚点分组

    本文将讲解如何通过自定义,实现锚点组件。这个锚点组件会根据界面设计器拖入的分组,动态解析出锚点。 实现路径 整体的实现思路是界面设计器拖个容器类的组件(这里以选项卡为例),自定义这个选项卡,往选项卡里拖拽的每个分组,每个锚点的名称是分组的标题。 1. 界面设计器拖出页面 我们界面设计器拖个选项卡组件,然后在选项页里拖拽任意多个分组。完成后点击右上角九宫格,选中选项卡,填入组件 api 名称,作用是把选项卡切换成我们自定义的锚点分组组件,这里的 api 名称和自定义组件的 widget 对应。最后发布页面,并绑定菜单。 2. 组件实现 widget 组件重写了选项卡,核心函数 renderGroups,通过 DslRender.render 方法渲染界面设计器拖拽的分组。 import { BasePackWidget, DslDefinition, DslRender, SPI, Widget } from '@oinone/kunlun-dependencies'; import TabsParseGroup from './TabsParseGroup.vue'; function fetchGroupChildren(widgets?: DslDefinition[], level = 1): DslDefinition[] { if (!widgets) { return []; } const children: DslDefinition[] = []; for (const widget of widgets) { if (widget.widget === 'group') { children.push(widget); } else if (level >= 1) { fetchGroupChildren(widget.widgets, level – 1).forEach((child) => children.push(child)); } } return children; } @SPI.ClassFactory( BasePackWidget.Token({ widget: 'TabsParseGroup' }) ) export class TabsParseGroupWidget extends BasePackWidget { public initialize(props) { super.initialize(props); this.setComponent(TabsParseGroup); return this; } // 获取分组的子元素 public get groupChildren(): DslDefinition[] { return fetchGroupChildren(this.template?.widgets); } @Widget.Reactive() public get groupTitles() { return this.groupChildren.map((group) => group.title); } // 根据容器子元素渲染左侧 @Widget.Method() public renderGroups() { if (this.groupChildren && this.groupChildren.length) { return this.groupChildren.map((group) => DslRender.render(group)); } } } vue组件核心内容是用component :is属性,渲染出配置的分组组件 <template> <div class="TabsParseGroup"> <a-anchor :affix="false"> <a-anchor-link v-for="(item, index) in groupTitles" :href="`#default-group-${index}`" :title="item" /> </a-anchor> <div v-for="(item, index) in groupComponents" :id="`default-group-${index}`"> <component :is="item" /> </div> </div> </template> <script lang="ts"> import { computed, defineComponent, PropType } from 'vue'; export default…

    2025年7月8日
    12100
  • 模版名称如何翻译

    导出翻译项: mutation { excelExportTaskMutation { createExportTask( data: { workbookDefinition: { model: "file.ExcelWorkbookDefinition" name: "excelLocationTemplate" } } ) { name } } } { "path": "/file", "lang": "en-US" } 导入翻译项: mutation { excelImportTaskMutation { createImportTask( data: { workbookDefinition: { model: "file.ExcelWorkbookDefinition" name: "excelLocationTemplate" } file: { url: "https://minio.oinone.top/pamirs/upload/zbh/test/2024/06/03/导出国际化配置模板_1717390304285_1717391684633.xlsx" } } ) { name } } } PS:导入自行修改url进行导入

    2025年2月7日
    37600
  • IP黑白名单实现拦截三方用户

    已知厂商IP为10.139.0.1,经系统检测122.233.24.28、138.122.12.9为风险IP,需要禁止访问。 白名单配置:10.139.0.1 黑名单配置:122.233.24.28、138.122.12.9 厂商请求到Oinone开放平台请求头需携带X-Forwarded-For和X-Real-IP,例如: X-Forwarded-For 122.233.24.28 X-Real-IP 122.233.24.28 经Nginx代理后,oinone获取的请求头内容: X-Forwarded-For 122.233.24.28, 10.139.0.1 # 代理追加厂商IP到末尾 X-Real-IP 122.233.24.28 # 保持客户端原始值,Nginx不处理 效果:厂商10.139.0.1发送的请求且用户X-Real-IP不在黑名单内才放行。 注意事项 Nginx如果配置X-Real-IP需关闭,否则拿到的永远是厂商IP。 proxy_set_header X-Real-IP $remote_addr; 相关文章 开放应用中的ip黑白名单

    2025年5月15日
    18400
  • 数式Oinone培训前注意事项

    一、快速上手 (建议至少预习 6 小时) 在正式培训之前,建议需要完成以下任务,以便对培训内容有基本了解: 点击阅读:快速启动入门 该文档为学员提供了从入门到实现 demo 的全过程说明,涵盖了开发工具、框架搭建、常见问题解答等内容 开始培训前,请参与人员确保完成以下任务 阅读并理解文档中的每个步骤。 配置好前后端开发环境。 完成 demo 的基础框架搭建,验证是否能够成功运行。 二、预期成果 通过上述预习,大家完成以下事项:• 成功搭建本地开发环境,并能运行前后端的基本 demo。• 对前后端技术栈有初步了解,为正式培训中的深度学习打下基础,并且提出对应的疑问点 三、其他准备工作 1.技术工具检查:请确在本地已安装并配置好必要的开发工具和环境(如 IDE、Node.js、数据库等);2.参与者反馈:在预习过程中,学员如遇到困难或无法解决的问题(前后端疑问),请提前记录并提交,以便培训期间重点解答;3.版本是否是最新的版本,且建议研发人员版本一致,且类型是 mini; ps:部署包相关信息,联系数式相关人员获取

    未分类 2024年8月2日
    2.3K00

Leave a Reply

登录后才能评论