优维低代码实践:编排优化Plus

news2024/11/29 22:44:44

 优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。

优维低代码实践连载第⑤期

《编排优化Plus》

在上一章节中,我们编排完成了任务列表的查询,以及新增任务实例这两功能,在本章节中,我们将对其进行功能的完善,包括:任务修改,任务删除,点击任务跳转至任务详情页面,搜索查询能力完善等,那么下面让我们开始学习吧!

一、任务修改

 

在上一章节的最后一点我们完成了任务实例的新增,接下来我们要用对任务进行修改,需要我们在编排开辟新的入口(Tabel增加操作列),并调用相关的Proivder接口进行修改,下面跟着我的编排快速过下吧~

Table属性参数修改

属性面板-属性:
# ...
  columns:
    - dataIndex: name
      key: name
      title: 任务名称
    - dataIndex: state
      key: state
      title: 状态
    - dataIndex: assignee
      key: assignee
      title: 负责人
    # 新增项
    - dataIndex: operator
      title: 操作
      key: operator
      # useChildren&useBrick用法,后续章节会展开讲解
      useChildren: '[operator]'
# ...

Table下新增构件并进行属性修改

将鼠标移入构件树上的Table构件,右侧将出现+图标, 点击图标添加构件, 将出现新增构件弹窗,参数如下:

# 父节点默认不可修改
父节点: Table
# 挂载点等于useChildren的值,useChildren的值需要大括号包裹
挂载点: [operator]
# 选择构件
构件: basic-bricks.general-button
示例(选择可快速创建构件): 随便选择一个

新增完构件后,我们需要对这个构件进行属性编辑

数据名称: isEdit
类型: Value
Value: false

然后对我们刚刚新增的构件进行属性编辑

属性面板-属性:
  buttonIcon:
    lib: easyops
    category: default
    icon: edit
    color: blue
  buttonType: text
  # 构件样式,设置为行内元素
  style:
    display: inline-block
事件面板-生命周期:
  general.button.click:
    # 将 CTX.isEdit 设置为true,涉及数据逻辑联动,下面会有说明
    - action: context.replace
      args:
        - isEdit
        - true
    # 设置表单的静态值
    - target: '#AddTaskForm'
      properties:
        staticValues:
          # 说明一下表达式含义:设置实例ID字段等于行数组的实例ID
          # DATA为特殊表达式,尽在useChildren或useBrick下面进行使用
          # 可以获取其父元素传递的值
          # 这里 DATA = { 
          #   rowData: { instanceId: 'xxx', name: 'xxx', ... },
          #   ...
          # }
          # 因此可以使用以下表达式获取该行的实例ID
          instanceId: <% DATA.rowData.instanceId %>
    - target: '#AddTaskForm'
      method: setInitValue
      args:
        # 设置表单初始值
        - <% DATA.rowData %>
      # 打开弹窗
    - target: '#modalAddTask'
      method: open

弹窗&添加按钮修改

属性面板-属性:
  id: modalAddTask
  # 修改此行数据
  # "track context" 为特殊表达式,用以监听用户自定义变量的值
  # 若监听的值发生更新,则会更新后续表达式中的内容
  # 从而引起构件的变化
  # 下方为三元表达式语法,含义为:
  # 当 CTX.isEdit 等于 true 时,弹窗名称为:编辑任务
  # 当 CTX.isEdit 等于 false 时, 弹窗名称为:添加任务
  modalTitle: '<% "track context", CTX.isEdit ? "编辑任务" : "添加任务" %>'
  closeWhenOk: false
  maskClosable: false
事件面板-事件:
general.button.click:
  # 新增项
  - action: context.replace
    args:
      - isEdit
      - false
  # ...

Form表单修改

事件面板-事件:
  validate.error:
    - action: message.error
      args:
        - 表单填写失败
  validate.success:
    - target: '#modalAddTask'
      properties:
        okDisabled: true
    # 新增if逻辑,这里表示,如果 CTX.isEdit是false的话,则代表是新建状态
    # 调用创建实例接口
    - if: <% !CTX.isEdit %>
      useProvider: providers-of-cmdb.instance-api-create-instance
      # 上个章节的内容,这里不做展开
      # ...
    # ======== 分割线 ==============
    # 新增if逻辑,这里表示,如果 CTX.isEdit是true的话,则代表是编辑状态
    # 调用编辑实例接口
    - if: <% CTX.isEdit %>
      useProvider: providers-of-cmdb.instance-api-update-instance
      args:
        - TASK_FOR_VB_LESSON
        - <% EVENT.detail.instanceId %>
        - |-
          # 这里是入参,获取表单暴露的数据中指定的字段
          # _.pick 是第三方工具库 lodash 提供的处理数据的函数
          # 在表达式中可以直接使用,用以处理数据
          <%
            _.pick(EVENT.detail, [
              "name",
              "state",
              "assignee",
              "reporter",
              "time",
              "description",
            ])
          %>
      callback:
        success:
          # 回调方法,同新增逻辑一致
          - action: message.success
            args:
              - 任务修改成功
          - target: '#modalAddTask'
            properties:
              okDisabled: false
          - action: context.refresh
            args:
              - taskList
          - target: '#modalAddTask'
            method: close
        error:
          - action: handleHttpError

二、任务删除

为Table新增删除按钮

在做完修改功能后,增删改查我们就剩最后一个删除功能了,我们就已最简单的实现结束这块功能吧~

我们要在刚刚Table操作列新增的编辑按钮后面加上一个删除按钮;在构件树上找到 Table 下挂在点为: [operator], 然后在它下面新增构件, 弹窗参数如下:

# 父节点默认不可修改
父节点: Table
# 挂载点等于useChildren的值,useChildren的值需要大括号包裹
挂载点: [operator]
# 选择构件
构件: basic-bricks.general-button
示例(选择可快速创建构件): 随便选择一个

删除按钮入参修改

属性面板-属性:
  buttonIcon:
    lib: easyops
    category: default
    icon: delete
    color: red
  buttonType: text
  style:
    display: inline-block
事件面板-事件:
  general.button.click:
    # 这里简单实现,点击删除按钮,直接调用删除接口,进行删除
    # 然后触发 taskList 重新请求数据,完成渲染
    - useProvider: providers-of-cmdb.instance-api-delete-instance
      args:
        - TASK_FOR_VB_LESSON
        - <% DATA.rowData.instanceId %>
      callback:
        success:
          - action: message.success
            args:
              - 任务删除成功
          - action: context.refresh
            args:
              - taskList
        error:
          action: handleHttpError

三、任务详情页面跳转

URL动态参数详解

在完成了增删改查之后,我们要对我们的功能进一步完善,现在我们需要一个任务详情页面,入口是从任务列表页面进行跳转,那么我们要怎么做呢?首先我们要思考一个问题,一个详情页面,我们要怎么知道当前页面是哪一条实例的详情呢?

最常用的方式就是在 URL 上面携带信息,然后详情页面从 URL 中获取信息,然后进行接口请求,获取信息后再渲染页面上,编排也是如此;在之前的章节中,我们已经介绍了一种方式,通过 QUERY 表达式,可以获取 URL 上面的参数,现在我们介绍另外一种可以从 URL 上面动态参数的表达式 PATH,他们的使用示例如下:

QUERY表达式获取参数:
  # 路由 page1 参数设置
  path: '${APP.homepage}/page1'
  # 实际渲染时,用户根据自己需求,添加动态参数 { a:1, b:2, c: helloWorld }
  # URL将识别成以下格式
  URL: 'https://admin.easyops.local/next/page1?a=1&b=2&c=helloWorld'
  # 则 QUERY.a = 1, QUERY.b = 2, QUERY.c = helloWorld
  
# =========== 分割线 ===========
PATH表达式获取参数:
  # 路由 page2 参数设置
  # 请注意 path 上面的 :a, :b, :c, 这几个就是我们认为的动态路由参数
  path: '${APP.homepage}/page2/:a/task/:b/detail/:c/edit'
  # 实际渲染时,用户根据自己需求,添加动态参数 { a:1, b:2, c: helloWorld }
  # URL将识别成以下格式
  URL: 'https://admin.easyops.local/next/page2/1/task/2/detail/helloWorld/edit'
  # 则 PATH.a = 1, PATH.b = 2, PATH.c = helloWorld

新增路由页面(任务详情)

在介绍完这两个表达式之后,我们将使用 PATH 的方式,创建新的路由页面,并完成任务详情跳转这个功能,下面进入编排步骤:

别名: 任务详情
path: "${APP.homepage}/task/:instanceId/detail"
选择主题: UI8.0主题下的详情页

DATA面板添加数据

在新增完路由后,打开在左侧 DATA 面板,添加数据 taskDetail,入参如下:

数据名称: taskDetail
类型: Provider
Provider(接口): providers-of-cmdb.instance-api-get-detail
Args(参数):
  - TASK_FOR_VB_LESSON
  # 这里路径上面已经配置了 :instanceId, 所以我们可以根据通过 PATH 表达式获取到具体的值
  - <% PATH.instanceId %>

构件属性修改

然后从构件树上找到 brick-descriptions 构件,将其属性修改如下:

属性面板-属性:
  column: 4
  dataSource: <% CTX.taskDetail %>
  itemList:
    - label: 任务名称
      field: name
    - label: 任务描述
      field: description
    - label: 状态
      useChildren: '[tag]'
    - label: 工时
      field: time
    - label: 负责人
      field: assignee
    - label: 汇报人
      field: reporter

任务列表页面编排修改

在做完这一切之后,我们回到任务列表的编排页面中,进行页面编排修改,首先定位到 Table 构件,将其属性入参修改为如下:

columns:
  - dataIndex: name
    key: name
    title: 任务名称
    # 新增项
    useChildren: '[name]'
  # 其他不做修改,只需要增加这一行属性即可
  # ...

然后在 TABLE 的节点下新增 Link 构件

# 父节点默认不可修改
父节点: Table
# 挂载点等于useChildren的值,useChildren的值需要大括号包裹
挂载点: [name]
# 选择构件
构件: presentational-bricks.brick-link
示例(选择可快速创建构件): 随便选择一个

并将新增 Link 构件的属性修改为:

属性面板-属性:
  label: <% DATA.rowData.name %>
  # url由动态参数由列表行数据提供
  url: '<% `${APP.homepage}/task/${DATA.rowData.instanceId}/detail` %>'
  hideExternalIcon: true

四、为Table增加查询条件

之前我们做的查询其实只是批量地将数据查询回来并进行展示,相对来说还比较粗糙,现在我们需要将查询细致化,增加多一些查询条件,方便能够精准定位到我们需要的数据,那么接下来也开始关于这块的编排吧!

相信大家看到左侧DATA面板一直有两个参数filters跟query,但是我们之前的章节一直没有提及;本节课将利用这两个参数,结合taskList,进行数据查询,那么我们要怎么做呢?跟着我一起修改编排吧

DATA属性修改

数据名: filters
类型: Value
Args(参数):
  assignee: <% QUERY.assignee %>
  name: <% QUERY.name %>
数据名: query
类型: Value
Args(参数):
  |-
    <%
      {
        $and: [
          {
            ...(CTX.filters.name
              ? {
                  name: {
                    $like: `%${CTX.filters.name}%`,
                  },
                }
              : {}),
            ...(CTX.filters.assignee
              ? {
                  assignee: {
                    $eq: `${CTX.filters.assignee}`,
                  },
                }
              : {}),
          },
        ],
      }
    %>

数据名称: taskList
类型: Provider
Provider(接口): providers-of-cmdb.instance-api-post-search-v3
Args(参数):
  - TASK_FOR_VB_LESSON
  - fields:
      - name
      - state
      - assignee
      - reporter
      - description
    page: '${QUERY.page=1|number}'
    pageSize: '${QUERY.pageSize=20|number}'
    # 新增项
    query: <% CTX.query %>
Extra provider settings(额外的接口配置):
  lazy: true
Extra basic settings(额外的基础配置):
  track: true

构件属性修改

找到 Table 上放的两个构件,Input & Select, 分别对他们进行修改,如下

属性面板-属性:
  placeholder: 输入任务名称
  q: <% CTX.filters.name %>
  shouldUpdateUrlParams: false
事件面板-事件:
  filter.update:
    # history.pushQuery 为系统提供的方法,用以更新 URL 上的动态参数
    # 若原先 url: http://admin.easyop.local/next/page1?name=1
    # 执行完下面事件后,url将变为: 
    # http://admin.easyops.local/next/page1?name=xxx&page=1
    - action: history.pushQuery
      args:
        - name: <% EVENT.detail.query %>
          page: 1
        # history.pushQuery 第二个入参,notify默认为true
        # 设置成false代表更新完URL后不触发页面更新
        - notify: false
    # context的语法之一,表示更新 CTX.filters 中的 name
    - action: context.assign
      args:
        - filters
        - name: <% EVENT.detail.query %>
属性面板-属性:
  placeholder: 筛选负责人
  objectId: USER
  inputBoxStyle:
    width: 200px
  instanceQuery:
    state: valid
  fields:
    label:
      - name
    value: name
  labelTemplate: '#{name}'
  value: <% CTX.filters.assignee %>
  allowClear: true
事件面板-事件:
  forms.cmdb-instance-select.change:
    # 逻辑同上,不做展开
    - action: history.pushQuery
      args:
        - assignee: '${EVENT.detail}'
          page: 1
        - notify: false
    - action: context.assign
      args:
        - filters
        - assignee: '${EVENT.detail}'

做完这一切编排修改后,我们的查询功能也就丰富完善啦!

五、结语

通过本章节,您已学会查询,编辑,删除,路由页面跳转等高级操作啦,这已经能够满足日常编排工作的大部分场景啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理项目-加载菜单

人事管理项目-加载菜单 引入ElementUI菜单1&#xff0e;菜单模板 引入ElementUI 数据成功访问后&#xff0c;引入ElementUI组件对数据进行渲染&#xff0c;首先引入其依赖&#xff1a; npm install element-ui -S 依赖添加成功后&#xff0c;接着在main.js中引入ElementUI&a…

G2上看看Notes/Domino

大家好&#xff0c;才是真的好。 Engageug2023正在如火如荼进行&#xff0c;今年的主题是“The Future is Now”。 开场就发布了很多Notes/Domino以及相关产品的全新路线图&#xff0c;例如今年第四季度发布的新的Domino 14会直接集成Verse邮箱支持、Nomad Web功能&#xff0…

MySQL学习-数据库创建-数据库增删改查语句-事务-索引

MySQL学习 前言 SQL是结构化查询语言的缩写&#xff0c;用于管理关系数据库(RDBMS)中的数据。SQL语言由IBM公司的Donald Chamberlin和Raymond Boyce于20世纪70年代开发而来&#xff0c;是关系型数据库最常用的管理语言。 使用SQL语言可以实现关系型数据库中的数据处理、数据…

MySQL模糊查询再也不用like+%了

前言 倒排索引 全文检索 创建全文索引 使用全文索引 删除全文索引 小结 前言 我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效&#xff0c;但有时需求就是如此&#xff0c;类似这样的需求还有很多&#xff0c;例如&#xff0c;搜索引擎需要根基…

记录一个Invalid bound statement (not found)问题

SpringBootMyBatisPlus项目&#xff0c;非常简单&#xff0c;没有任何业务逻辑&#xff1a; 1. pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.…

Windows定时执行Python脚本

在Linux环境下我们可以使用crontab工具来定时的执行脚本&#xff0c;可以很轻松的管理各个虚拟环境下的py文件在Windows上可以使用任务计划程序来定时执行我们的脚本 关于这个的基本使用可以查看我前面的博客 https://blog.csdn.net/wyh1618/article/details/125725967?spm10…

单片机编程小错记录1:漏写串口中断服务函数

问题描述&#xff1a; 原本单独测试没问题的定时器程序&#xff0c;但在加上串口程序后出现了问题&#xff0c;发现定时器貌似没有在正常工作...... 问题发现&#xff1a; 程序如下&#xff1a; 该程序主要想实现的功能是&#xff1a; 1.串口在初始化时发送"welcome\r…

crossover软件2023跨电脑系统兼容工具好用吗?

CrossOver是一款系统兼容软件 让您可以在 Mac 和 Linux 系统上运行 Windows 应用&#xff0c;不必购买 Windows授权&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过 CrossOver&#xff0c; 您可以从 dock 直接启动 Windows 应用&#xff0c;与您的 Mac 和 Linux 系统…

Java中this和super区别(面试题)

1.super 关键字可以理解为&#xff1a;父类的 2.可以用来调用的结构&#xff1a;属性、方法、构造器 3.super调用属性、方法&#xff1a; 3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式&#xff0c;显式的调用父类中声…

每日一练 | 华为认证真题练习Day54

1、现有一台交换机通过一个端口和对端设备的指定端口直连&#xff0c;但是该端口不转发任何报文&#xff0c;却可以通过接收BPDU来监听网络变化&#xff0c;那么该端口的角色应该是&#xff08;&#xff09;。 A. Root端口 B. Designated端口 C. Alternate端口 D. Disable端…

day1 计算机硬件基础

目录 课程回顾 嵌入式系统分层 ARM体系结构与接口技术 计算的组成 总线 CPU工作概述 课程回顾 嵌入式系统分层 操作系统的作用&#xff1a; 向下管理硬件、向上提供接口&#xff08;API&#xff09; Linux子系统&#xff1a; 进程管理&#xff1a;管理进程的创建、调度…

【MySQL数据库 | 第二篇】 启动与停止

目录 ​编辑 &#x1f914; 启动与停止&#xff1a; &#x1f642;1.WIN加R调用windows命令行&#xff0c;输入&#xff1a;services.msc &#x1f642;2.可以在cmd&#xff08;管理员模式&#xff09;中输入以下指令&#xff1a; &#x1f914; 启动MySQ后的操作步骤&…

Es elasticsearch 十九 kibana 可视化配置图表 及功能 集群部署

目录 Es kibana 可视化 下载zip 解压 bin/kibana.bat 启动 管理索引管理 吧logstash 存进来的数据 按照 xxx-* 方式 保存索引模式 通过 discove 配置可视化界面 图表数据实时刷新 时序图配置 饼图配置 表格数据配置 添加仪表盘 图表样例 使用后模拟绘制方法好看些 …

线程的相关函数pthread

一、线程相关函数 头文件&#xff1a;#include <pthread.h> 注意&#xff1a;在编译时注意加上-lpthread参数&#xff0c;以调用静态链接库。因为pthread并非linux系统的默认库。 1、pthread_create 函数声明&#xff1a;int pthread_create(pthread_t *thread, const…

这所院校复试只刷低分,有9人擦线竟直接放弃复试!

本期为大家整理唯一个处于东部发达地区入选“双一流建设”的原双非类的综合类大学-“宁波大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度…

kubelet源码分析 kuberuntime的syncpod、createSandbox/createContainer函数(三)

kubelet源码分析 kuberuntime的syncpod、createSandbox/createContainer函数&#xff08;三&#xff09; 上一篇介绍了killContainer容器部分。当kill后&#xff0c;就需要重新创建sandbox和container&#xff0c;今天介绍最后一部分&#xff0c;创建容器。 这篇也是整个上面的…

通达信自动包络线指标公式以及ATR通道指标

根据亚历山大埃尔德在其著作《以交易为生》中的描述&#xff0c;自动包络线的设计思路是将通道看作试穿衬衫一样&#xff0c;寻找那些穿起来既不过松也不过紧的衬衫&#xff0c;只让手腕和脖子露在外面。自动包络线能够适应最近的行情波动&#xff0c;只有在极端情况下&#xf…

修电脑屏幕记

21年的时候媳妇买了台联想小新16Pro&#xff0c;最近发现屏幕闪&#xff0c;查了查售后政策&#xff0c;好在屏幕质保两年。 找维修点 从高德地图里搜联想售后很正常吧&#xff01;看看图片带着Lenovo的图片&#xff0c;是不是感觉是官方售后&#xff1f;拨打电话打到的是总部…

AI生成的二维码,真的太好看了!

今天我们迫不及待要和大家分享一组图片。 这是一位二维码开发者——倪豪 Isle of Chaos&#xff0c;与几位同学和老师们一起&#xff0c;使用最新的AI技术生成的非常惊艳的图片。最重要的是&#xff0c;这些图片里面都暗藏了一个可识别的二维码&#xff01; 总之&#xff0c;…

回归分析处理

线性回归 最小二乘法 对于某数据量 有呈线性关系的输出量 &#xff0c;且 &#xff0c;现有对这些数据量的采集序列&#xff0c;这些采集量会存在随机误差&#xff0c;线性回归的目的便是找到保证使误差最小的情况下的回归系数 。 即通过下列方程组求 可利用最小二乘法&a…