DevOps之动态表单——优雅地把工作量甩给后端

Stella981
• 阅读 414

DevOps之动态表单——优雅地把工作量甩给后端

DevOps之动态表单——优雅地把工作量甩给后端

转载本文需注明出处:微信公众号EAWorld,违者必究。

一个IT公司的日常就是程序员、产品经理、UI等同事们的互相残杀:

DevOps之动态表单——优雅地把工作量甩给后端

有时候程序员内部也会相虐相杀,此话要从前后端分离说起。自从前后端分离的开发模式被广泛应用,不少前端同学就备受煎熬,除了修改需求的魔咒外,还有后端同学的重构和调整接口诅咒,即便需求没改,后端接口或数据结构的调整前端也要巴巴的陪着改,甚至还要为此做大型重构。但是前端重构就真的只是前端重构,和后端一毛钱关系都没有,工作量还是前端的,bug永远是先提给前端,简言之就是,修改需求前端要改,修改接口前端要改,改bug前端要先看(此处省略血泪史一万行)难道我们前端同学就不能反杀一波,摆脱困境了吗?当然可以,答案就是动态表单,自从有了它,我们可甩掉不少工作量(偷笑)。

DevOps之动态表单——优雅地把工作量甩给后端

前端开发最烦人的事之一就是写一堆大同小异的表单,他们使用的控件类型有很强的规律性,同类型控件调用的后端接口类型也非常相似,但是每个表单用到的具体接口、控件种类和控件数量又不尽相同,就算封装控件复用也是杯水车薪,无法提升工作效率。

DevOps之动态表单——优雅地把工作量甩给后端

看过前面卜壮同学的文章的朋友一定知道,前端为了应对后端接口不断调整修改,在框架层上封装了一套接口调用机制,很大程度上降低了后端接口url调整给前端的影响,不论他们怎么改只要接口名称不变,前端统统可以一键搞定,而且还同步建立了数据管理机制,提升前端性能(还没看过的同学传送门在这里)。

这次,面对这些讨厌而又常用的表单,我们前端的态度一样是不能忍的(因为已经被逼疯)。俗话说得好,既然不能躲避,那就想办法解决。因此我们开发了一套动态表单,从表单内容到数据提交统统由后端配置,前端只需要读取解析表单配置渲染相应内容即可,用户完成表单后提交数据发送的请求也是由后端配置,前端做的只是按照要求发送数据即可。这样,前端在表单这一块就再也不用被产品经理和后端同学影响,不论需求怎么改,表单怎么加,都不需要前端在做附加工作了,留下产品经理和后端研发互相伤害,前端同学在一旁观战帮着改改bug就是,这样岂不是美滋滋。

DevOps之动态表单——优雅地把工作量甩给后端

动态表单对很多前端开发人员来说并不陌生,前后端约定好表单配置数据模型,前端只需要实现动态表单解析功能即可。但是一套完整的产品怎么可能只有简简单单的表单配置能,联动表单、表单校验等对前端来说依旧是个比较棘手的问题。今天我们就以DevOps动态表单为例来说说表单联动问题如何解决。

表单联动主要有两种形式,一是表单项的数据联动,再来就是表项显示联动。
我们先来说说表单项数据联动,举个例子:表单中包含代码库和branch/tag/commitId两个输入项,显然后者的显示内容取决于用户选择了哪个代码库,此处就需要前端检测用户对代码库的选择,然后将选定后的数据作为参数向后端发送请求查询branch/tag/commitId项的列表。

DevOps之动态表单——优雅地把工作量甩给后端

这样的功能看着并不复杂,只需要监听代码库的选择实事件然后在事件处理中调用branch/tag/commitId项的查询请求即可。但是,别忘了你现在在写动态表单,一切对你来说都是配置好的模型,不能针对单独的某字段名写if else做特殊处理(否则还叫什么动态表单),代码是固定的,你不能写任何个性化的代码来处理事件,而且这只是一个简简单单的两项联动,真正的项目开发中,多项联动比比皆是。为了解决这一问题,前端在数据模型的设计上做了一定的思考,要求后端在配置动态表单的数据获取url时将需要的参数以冒号加对应表单项的字段名形式配置,示例:api/repo/commit?repoId=:repoId。此后,前端在解析整个表单的时候会给每一个表单项传递完整的表单数据对象,当表单数据中的某项发生改变时,需要向后端发送请求的一些表单项会监听整个表单数据的变化,将与改变的表单项字段名相匹配的url进行重写,替换上对应的值,然后用发生改变的url向后端发送请求获取新的数据。配置示例如下:

[{

再来就是动态表单联动显示问题,如下图显示,当用户选择不同的介质策略时,显示的表单项也是不同的:

DevOps之动态表单——优雅地把工作量甩给后端

DevOps之动态表单——优雅地把工作量甩给后端

针对这一功能,我们目前采用的解决方案是,在配置项上加上指定的eventName,当数据项发生改变时,针对不同的数据情况显示或隐藏表单项,代码如下:

artifactStrategyChange: (attrValue) => {

当然,这部分代码还是免不了要在前端实现,但这已经比一个个的写完整的表单工作量少了太多太多。

我们的DevOps产品的CICD部分全部采用动态表单体系实现,在功能扩展上是极为迅速的,只要后端完成开发,基本整个功能扩展就接近了尾声。经过我们的实践,这套表单体系仍然有许多可优化之处,我们也在不断的进行优化和调整,力求将它应用到更多产品中,尽可能的减少开发人员的工作量,提升产品质量,缩短产品交付时间。

动态表单虽好但是也要充分考虑使用场景和开发代价,不要为了过分抽象代码反而本末倒置,过度设计反而提高了研发成本。

推荐阅读

基于Ansible和Devops的一键测试环境部署实践

DevOps之三方权限集成管理

DevOps平台之测试管理设计

DevOps之动态表单——优雅地把工作量甩给后端 关于作者:夏夏,前端工程师,参与普元DevOps产品开发,以及微服务、容器云等产品开发,负责前端页面设计、架构搭建等工作。善于架构搭建、组件封装及相关算法设计。

DevOps之动态表单——优雅地把工作量甩给后端 关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!

本文分享自微信公众号 - EAWorld(eaworld)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这