子表配置功能(基于Anyline动态构建表)

73 阅读4分钟

需求:

成功发起一个流程之后,需要给这个流程配置相关的表单,这个表单在前端的展示就是页面,而在后端会生成数据表,每个子表都是一个表,里面的字段就是表的字段。

例如,请假流程,用户需要上传请假人姓名,时间,原因,相关证明材料等等。

那么这个功能在前端的展示就是让你上传输入这些内容的接口,而数据库表的字段就是这几个。

实现:

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"
    },
  ]
}
  1. 获取表名并创建表:

    java
    String tableName = sysTbForm.getTbName();
    Table table = new Table(TbTool.addPrefix(tableName));
    
    • 从 SysTbForm 对象中获取表名,并将其存储在 tableName 变量中。
    • 使用 TbTool.addPrefix(tableName) 方法给表名添加前缀,然后创建一个新的 Table 对象。
  2. 设置表注释:

    java
    table.setComment(sysTbForm.getRemark());
    
    • 调用 setComment 方法设置表的注释,注释内容来自 SysTbForm 对象的 getRemark() 方法。
  3. 解析表单内容为JSON对象:

    java
    JSONObject formJson = new JSONObject(sysTbForm.getFormContent());
    
    • 使用 JSONObject 类将 SysTbForm 对象的 getFormContent() 方法返回的字符串解析为JSON对象。
  4. 添加ID列:

    java
    table.addColumn("id", "bigint").setPrimaryKey(true).setComment("ID").autoIncrement(true);
    
    • 向表中添加一个名为 id 的列,数据类型为 bigint
    • 通过链式调用设置该列为主键、注释为 "ID",并设置为自增。
  5. 提取表单模型数据:

    java
    JSONArray jsonArray = MyJSONTool.selectJSONByKey(formJson, "__vModel__");
    
    • 使用自定义的 MyJSONTool.selectJSONByKey 方法从 formJson 中提取键为 __vModel__ 的所有项。
  6. 遍历表单模型并添加列:

    java
    for (Object item : jsonArray) {
        JSONObject jsonObject = (JSONObject) item;
        table.addColumn(jsonObject.get("__vModel__").toString(), jsonObject.get("datatype").toString());
    }
    
    • 遍历 jsonArray 中的每个元素。
    • 对于每个元素,将其转换为 JSONObject,并使用 addColumn 方法向表中添加列。列名是 __vModel__ 的值,数据类型是 datatype 的值。
  7. 添加创建时间和更新时间列:

    java
    table.addColumn("create_time", "datetime").setComment("创建时间");
    table.addColumn("update_time", "datetime").setComment("更新时间");
    
    • 向表中添加 create_time 和 update_time 列,数据类型为 datetime,并分别设置注释。
  8. 返回构建的表对象:

    java
    return table;
    
    • 方法返回构建好的 Table 对象,这个对象可以用于后续的数据库操作,如创建表或验证表结构。

3.使用anyline创建

向table对象中添加完之后,调用anyline

anylineService.ddl().create(table); 这行代码是在使用 Anyline 框架进行数据库表结构操作的典型用法。Anyline 是一个 Java 库,它提供了一套简化数据库操作的 API,支持多种数据库操作。

  1. .ddl()

    • 这是 anylineService 的一个方法,用于获取数据库的 DDL(数据定义语言)操作相关的功能。DDL 通常用于定义和管理数据库的结构,如创建、修改或删除表。
  2. .create(table)

    • create 是 DDL 操作的一部分,用于创建新的数据库表。这个方法接收一个 table 对象作为参数,该对象包含了要创建的表的详细结构信息。
  • 创建表:调用 create(table) 方法,并传入之前构建的表对象作为参数。Anyline 框架将根据这个对象中的信息生成相应的SQL CREATE 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直接删,直接查就行