篇文章我们一起学习了 Flowable 中的动态表单,动态表单说白了就是把变量打包定义,零存整取。但是小伙伴们可能很难实实在在 GET 到动态表单一些有创造性的功能,所以今天我们就来继续看看 Flowable 中的外置表单怎么玩,这个跟动态表单有一些本质上的差别。
首先,所谓的外置表单,其实说白了,类似我们平时在 HTML 中写的 form 表单。
现在的 flowable 中,我们既可以利用 JSON 的形式来定义 form 表单,也可以直接就使用 HTML 来定义,都是 OK 的。本文为了直观,松哥这里采用 HTML 来定义表单。
现在假设我有如下一个请假流程:
在开始节点中,我们需要一个表单来输入用户提交的请假信息,在组长审批和经理审批这两个节点中我们希望能够看到用户提交的请假信息,那么我们准备两个表单文件,第一个是提交请假信息的表单文件 askleave.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="">
<table>
<tr>
<td>请假天数:</td>
<td><input type="text" name="days"></td>
</tr>
<tr>
<td>请假理由:</td>
<td><input type="text" name="reason"></td>
</tr>
<tr>
<td>起始时间:</td>
<td><input type="date" name="startTime"></td>
</tr>
<tr>
<td>结束时间:</td>
<td><input type="date" name="endTime"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
小伙伴们看到,这其实就是一个普通的 HTML 页面,这里为了省事,我就没写 form 的 action 了。
还有一个是查看用户提交的请假信息的表单 leader_approval.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="">
<table>
<tr>
<td>请假天数:</td>
<td><input type="text" name="days" value="${days}"></td>
</tr>
<tr>
<td>请假理由:</td>
<td><input type="text" name="reason" value="${reason}"></td>
</tr>
<tr>
<td>起始时间:</td>
<td><input type="date" name="startTime" value="${startTime}"></td>
</tr>
<tr>
<td>结束时间:</td>
<td><input type="date" name="endTime" value="${endTime}"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
和前面的 askleave.html 文件相比,leader_approval.html 文件中,各个表单属性只是多了 value 属性而已,value 给了一个预填的变量,其他都是一样的。
两个表单文件定义完成之后,接下来我们为我们的流程来配置这两个表单文件,如下图,为开始节点设置表单 key 为 askforleave.html,为组长审批和经理审批节点设置表单 key 为 leader_approval.html:
另:在 Spring Boot 项目中,外置表单默认放在 resources/forms 目录下,也就是说,凡是放在这个目录下的表单文件,会被自动部署(要求文件后缀为 .form)。
好啦,这样我们的流程图就准备完成了。
小伙伴们需要注意,外置表单的部署需要和流程图一起部署,只有一起部署,他们才会有相同的 DEPLOYMENT_ID,否则两者的 DEPLOYMENT_ID 不同,在后续的查找中就找不到对应的表单。
因此,我们来修改一下流程部署的接口:
@RestController
public class ProcessDeployController {
@Autowired
RepositoryService repositoryService;
@PostMapping("/deploy")
public RespBean deploy(MultipartFile[] files) throws IOException {
System.out.println(new Date());
DeploymentBuilder deploymentBuilder=repositoryService.createDeployment()
.category("javaboy的工作流分类")
.name("javaboy的工作流名称")
.key("javaboy的工作流key666");
for (int i=0; i < files.length; i++) {
MultipartFile file=files[i];
deploymentBuilder.addInputStream(file.getOriginalFilename(), file.getInputStream());
}
Deployment deployment=deploymentBuilder
.deploy();
return RespBean.ok("部署成功", deployment.getId());
}
}
小伙伴们看到,这里我将上传文件改为了数组,也就是流程图、form 表单等统统都以文件的形式上传,然后在部署的时候,统一都调用 addInputStream 方法进行添加。
我们来看下使用 POSTMAN 部署的方式:
部署成功之后,我们来看下 ACT_GE_BYTEARRAY 表中的记录,如下:
小伙伴们看到,四条记录具有相同的 DEPLOYMENT_ID,这一点尤为重要。
在流程开启之前,我们首先可以通过如下方式查询启动节点上的表单内容:
@Test
void test05() {
ProcessDefinition pd=repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionKey("FormDemo02").singleResult();
String startFormKey=formService.getStartFormKey(pd.getId());
String renderedStartForm=(String) formService.getRenderedStartForm(pd.getId());
System.out.println("startFormKey=" + startFormKey);
System.out.println("renderedStartForm=" + renderedStartForm);
}
控制台输出的内容如下:
可以看到,表单的内容就被输出来了。
如果我们这里是一个 Web 工程,那么可以通过 Ajax 来请求到这个表单数据,并动态渲染到前端,然后在前端输入对应的值,点击提交按钮,就可以在服务端开启一个流程了。
服务端开启流程方式如下:
@Test
void test02() {
ProcessDefinition pd=repositoryService.createProcessDefinitionQuery().processDefinitionKey("FormDemo02").latestVersion().singleResult();
Map<String, String> vars=new HashMap<>();
vars.put("startTime", "2022-10-10 10:10");
vars.put("endTime", "2022-10-12 10:10");
vars.put("reason", "玩两天");
vars.put("days", "3");
ProcessInstance pi=formService.submitStartFormData(pd.getId(), vars);
}
调用 submitStartFormData 方法来开启一个流程,我这里参数直接硬编码了。
流程开启之后,接下来组长 zhangsan 要来审批这个流程,审批之前他需要先查看一下用户提交的表单信息,查看方式如下:
@Test
void test06() {
Task task=taskService.createTaskQuery().taskAssignee("zhangsan").singleResult();
String renderedTaskForm=(String) formService.getRenderedTaskForm(task.getId());
System.out.println("renderedTaskForm=" + renderedTaskForm);
}
小伙伴们注意,这个 getRenderedTaskForm 方法只有外置表单才有,动态表单调用这个方法是没有东西的,因为动态表单单纯的就只是变量的传递,不涉及到渲染问题,我们来看下这里打印出来的结果:
小伙伴们看到,和前面的表单相比,这里的表单都渲染出来了对应的值。如果这是一个 Web 项目,那么我们就可以使用 Ajax 请求这个渲染后的表单,并展示在前端页面。当然实际审批中,这里可以有更多的字段,组长填完之后,进入到下一个环节。
zhangsan 进行流程审批的代码如下:
@Test
void test08() {
Task task=taskService.createTaskQuery().taskAssignee("zhangsan").singleResult();
Map<String, String> vars=new HashMap<>();
vars.put("startTime", "2022-10-30 10:10");
vars.put("endTime", "2022-12-30 10:10");
vars.put("reason", "玩十天");
vars.put("days", "10");
formService.submitTaskFormData(task.getId(),vars);
}
可以使用 formService#submitTaskFormData 方法进行审批,也可以使用 taskService.complete 方法进行审批。
剩下的玩法就和普通流程一样了。
好啦,这就是和大家介绍的外置表单。
arsley.js
Parsley.js是一个轻量级且功能丰富的库,它使用DOM中嵌入的数据属性来实现相同的功能,而不是使用Javascript验证表单。令人惊讶的易于配置的插件还使您可以覆盖几乎所有默认行为,使其符合您的表单要求。
quickValidation.js
quickValidation.js的工作原理类似于上面的Parsley。它没有在Javascript中定义规则,而是通过使用data-validateinput标签中的属性直接分配规则。它将诸如required,number,range=0-99之.quickValidate类的规则串在一起,然后添加类,添加data-name属性以为错误命名字段,然后就可以开始工作了。
jQuery番茄酱插件
Ketchup是一个轻量级(最小3.4KB)插件,附带18种基本验证,但是确实允许您轻松编写自己的验证并覆盖任何默认行为。
默认情况下,插件将检查data-validate表单字段的属性,以查看是否可以找到任何匹配的验证。验证的默认指标是validate(),所有验证都进入该位置,并以逗号分隔。验证也可以带有参数(也用逗号分隔)。
我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。
jQuery验证插件
jQuery Validation是一个“插件”插件,使客户端表单验证非常容易。它附带了一组有用的验证方法,同时还提供了一个API,可轻松编写您自己的API。
开始使用此插件所需要做的就是仅一行jQuery以选择表单并应用该插件,并在每个元素上加上一些注释以指定验证规则。
IV.js – Javascript输入验证
IV.js是一个jQuery库,它提供了一种使用验证过滤器和处理用户输入的直观方法。为了使用IV.js,您需要将IValidate类添加到表单中。
jQuery验证引擎
当涉及到jQuery Validation Engine时,您不必担心表单的结构,因为该插件会创建一个错误,DIV并将其放置在指定输入的右上角,从而使表单代码和验证分开。Phis可能是本文中最简单的验证解决方案。
BootstrapValidator
BootstrapValidator是一个用于验证Bootstrap表单的jQuery插件。
监护人
Guardian是一个灵活且易于扩展的通用表单验证jQuery插件。
验证码
Validatr使用HTML5输入属性来执行验证,以支持color,date,email,number和range。输入类型text,checkbox,radio...。支持,但不需要相同级别的验证。
在可能的情况下,Validatr将使用本机验证,并使用Modernizr来测试支持。如果不支持输入类型,它将使用它自己的规则集来补充本机验证。在两种情况下,都会显示验证消息。
Formance.js
Formance.js是一个基于Stripe的jQuery.payment库并受其启发的用于格式化和验证表单字段的库。
Fields.js
Fields.js带有MIT许可证,并提供了与字段进行交互的抽象方式。
jQuery验证
jQuery Validate是一个jQuery插件,可帮助您使用数据属性轻松而快速地完成表单验证。
jQuery表单验证
jQuery Form Validate是另一个jQuery插件,可让您通过从应用于每个输入的HTML 5数据属性中获取验证规则来验证HTML表单。
一审
单验证是用于一般验证目的的正则表达式的集合。为了进行验证,它将正则表达式分成模式的语义部分。
Validarium
Validarium是一个基于jQuery Validate的简单直接的jQuery验证插件。
验证准系统验证
从名称本身可以明显看出,Validate Barebones Validation是一个可配置和可扩展的准系统jQuery验证插件。
nextVal
nextVal是jQuery的客户端表单验证插件。
jQuery Super Labels插件
在jQuery的超级标贴插件获得焦点淡出输入一个值时,当使整个油田的标签幻灯片。
作者:游X鱼
链接:https://www.jianshu.com/p/d1519bacf66a
单标签
常见的语句:
form:表单标签格式
作用:用来收集用户输入信息如:登入、注册、搜索商品等
action:开始网址
method:get和post等等
text (明文):用户名格式
password :(密文)密码
radio :单选框 性别格式 性别是单选,单选类型是radio,注意name要加上sex
checkbox:复选框
textarea:文本框
file:上传文件
select:下拉选择框
button:按钮
reset:重置
submit:提交
详解:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>表单标签</title>
</head>
<body>
<form action="https://hao.360.com/" method="post">
<p>账号:<input type="text" /></p>
<p>密码:<input type="password" /></p>
<p>
<input type="radio" name="sex" id="" />男
<input type="radio" name="sex" id="" />女
</p>
<p>
<input type="checkbox" name="" id="" value="" />linux
<input type="checkbox" name="" id="" value="" />mysql
<input type="checkbox" name="" id="" value="" />html
<input type="checkbox" name="" id="" value="" />python
</p>
<p>学历
<select name="">
<option value="">请选择学历</option>
<option value="">小学</option>
<option value="">初中</option>
<option value="">高中</option>
<option value="">大学</option>
</select>
</p>
<p>自我介绍:<br />
<textarea name="" rows="10" cols="30"></textarea>
</p>
<input type="reset" value="重置"/>
<input type="submit" value="提交"/>
<input type="button" value="按钮"/>
</form>
</body>
</html>
*请认真填写需求信息,我们会在24小时内与您取得联系。