需求:
成功发起一个流程之后,需要给这个流程配置相关的表单,这个表单在前端的展示就是页面,而在后端会生成数据表,每个子表都是一个表,里面的字段就是表的字段。
例如,请假流程,用户需要上传请假人姓名,时间,原因,相关证明材料等等。
那么这个功能在前端的展示就是让你上传输入这些内容的接口,而数据库表的字段就是这几个。
实现:
1.新增
1.controller
SysTbForm sysTbForm1 = new SysTbForm();
sysTbForm1.setTbName("gen_" + sysTbForm.getTbName());
List<SysTbForm> list = sysTbFormService.selectSysTbFormList(sysTbForm1);
if (list.size() > 0) {return AjaxResult.error().put("msg", "子表名称已存在"); }
return toAjax(sysTbFormService.insertSysTbForm(sysTbForm));
设置表名,判断已有的子表中有没有这个名称,有的话让用户重新取名,没有生成
2.配置table对象:
Table table = this.columnsBuilder(sysTbForm);
anylineService.ddl().create(table);
sysTbForm.setCreateTime(DateUtils.getNowDate());
return sysTbFormMapper.insertSysTbForm(sysTbForm);
private Table columnsBuilder(SysTbForm sysTbForm) throws Exception {
String tableName=sysTbForm.getTbName();
Table table = new Table(TbTool.addPrefix(tableName));
table.setComment(sysTbForm.getRemark());
JSONObject formJson=new JSONObject(sysTbForm.getFormContent());
table.addColumn("id","bigint").setPrimaryKey(true).setComment("ID").autoIncrement(true);
JSONArray jsonArray=MyJSONTool.selectJSONByKey(formJson,"__vModel__");
for (Object item : jsonArray) {
JSONObject jsonObject = (JSONObject) item;
table.addColumn(jsonObject.get("__vModel__").toString(), jsonObject.get("datatype").toString());
}
table.addColumn("create_time","datetime").setComment("创建时间");
table.addColumn("update_time","datetime").setComment("更新时间");
return table;
}
前端传过来的是一个json数据,包含表名称,表id,以及一个以“vModel”为键的字段,值就是代表的数据库字段。
大概类似这种的
{
"name": qingjia,
"id":xx,
"__vModel__": [
{
"__vModel__": "请假人",
"datatype": "varchar"
},
{
"__vModel__": "请假时间",
"datatype": "data"
},
{
"__vModel__": "请假理由",
"datatype": "varchar"
},
]
}
-
获取表名并创建表:
java String tableName = sysTbForm.getTbName(); Table table = new Table(TbTool.addPrefix(tableName));- 从
SysTbForm对象中获取表名,并将其存储在tableName变量中。 - 使用
TbTool.addPrefix(tableName)方法给表名添加前缀,然后创建一个新的Table对象。
- 从
-
设置表注释:
java table.setComment(sysTbForm.getRemark());- 调用
setComment方法设置表的注释,注释内容来自SysTbForm对象的getRemark()方法。
- 调用
-
解析表单内容为JSON对象:
java JSONObject formJson = new JSONObject(sysTbForm.getFormContent());- 使用
JSONObject类将SysTbForm对象的getFormContent()方法返回的字符串解析为JSON对象。
- 使用
-
添加ID列:
java table.addColumn("id", "bigint").setPrimaryKey(true).setComment("ID").autoIncrement(true);- 向表中添加一个名为
id的列,数据类型为bigint。 - 通过链式调用设置该列为主键、注释为
"ID",并设置为自增。
- 向表中添加一个名为
-
提取表单模型数据:
java JSONArray jsonArray = MyJSONTool.selectJSONByKey(formJson, "__vModel__");- 使用自定义的
MyJSONTool.selectJSONByKey方法从formJson中提取键为__vModel__的所有项。
- 使用自定义的
-
遍历表单模型并添加列:
java for (Object item : jsonArray) { JSONObject jsonObject = (JSONObject) item; table.addColumn(jsonObject.get("__vModel__").toString(), jsonObject.get("datatype").toString()); }- 遍历
jsonArray中的每个元素。 - 对于每个元素,将其转换为
JSONObject,并使用addColumn方法向表中添加列。列名是__vModel__的值,数据类型是datatype的值。
- 遍历
-
添加创建时间和更新时间列:
java table.addColumn("create_time", "datetime").setComment("创建时间"); table.addColumn("update_time", "datetime").setComment("更新时间");- 向表中添加
create_time和update_time列,数据类型为datetime,并分别设置注释。
- 向表中添加
-
返回构建的表对象:
java return table;- 方法返回构建好的
Table对象,这个对象可以用于后续的数据库操作,如创建表或验证表结构。
- 方法返回构建好的
3.使用anyline创建
向table对象中添加完之后,调用anyline
anylineService.ddl().create(table); 这行代码是在使用 Anyline 框架进行数据库表结构操作的典型用法。Anyline 是一个 Java 库,它提供了一套简化数据库操作的 API,支持多种数据库操作。
-
.ddl() :
- 这是
anylineService的一个方法,用于获取数据库的 DDL(数据定义语言)操作相关的功能。DDL 通常用于定义和管理数据库的结构,如创建、修改或删除表。
- 这是
-
.create(table) :
create是 DDL 操作的一部分,用于创建新的数据库表。这个方法接收一个table对象作为参数,该对象包含了要创建的表的详细结构信息。
- 创建表:调用
create(table)方法,并传入之前构建的表对象作为参数。Anyline 框架将根据这个对象中的信息生成相应的SQLCREATE TABLE语句,并执行它来在数据库中创建新的表。
2.修改:
sysTbForm.setUpdateTime(DateUtils.getNowDate());
Table table=this.columnsBuilder(sysTbForm);
//修改时, 判断原表是否存在 '流程状态'字段, 如果存在, 则在修改表结构时,不能删除这一列
//只能整体将整张表的结构查出来
Table tableData = anylineService.metadata().table(table.getName(), true);
if(tableData != null){
Column column = tableData.getColumn(Constants.TB_RECORD_PROCESS_STATUS);
if(column != null){
table.addColumn(column);
}
table.setAutoDropColumn(true);
anylineService.ddl().save(table);
}
sTbFormMapper.updateSysTbForm(sysTbForm);
其他的都不变,只是如果 流程状态不为空(在流程状态),不能删除这一列,把这一列添加到table中。
3.删除,查询
删除查询就简单了,mybatis直接删,直接查就行