基于mongodb的动态表单实现

2023-05-16

文章目录

  • 1. 项目背景
  • 2. 术语表
  • 3. 技术选型
  • 4. 概要设计
    • 4.1. 逻辑架构图
    • 4.2. 系统覆盖图
  • 5. 详细设计
    • 5.1. 元数据样例及说明
    • 5.2. 关于uuid
  • 6. 接口清单
    • 6.1. 表单管理模块
      • 6.1.1. 从excel导入表单元数据
      • 6.1.2. 表单元数据树查询
      • 6.1.3. 表单元数据CRUD
      • 6.1.4. 通过表单配置生成建表sql
    • 6.2. 命名空间模块
    • 6.3. 流程管理模块
  • 7. 承上启下
  • 8. 系统实现
    • 8.1. 使用开源项目“若依”作为Silver系统底座
      • 8.1.1. 关闭验证码
      • 8.1.2. 创建新模块
      • 8.1.3. 通过db table生成代码不转驼峰
      • 8.1.4. 新增生成mongodb控制器controller代码模板
    • 8.2. 系统实现
      • 8.2.1. 设计表单
      • 8.2.2. 将表单导入mongodb
      • 8.2.3. 通过表单配置生成建表sql
      • 8.2.4. 执行建表
      • 8.2.5. 通过db表生成CRUD代码(存储到mongodb)

1. 项目背景

背景:

  1. 项目中存在某些功能模块,不确定客户资料的完整字段清单,或者,当系统投产或销售时,不确定目标客户资料清单,需要有现场配置场景+表单来完成页面展示、页面填充数据保存、回显、修改等功能。
  2. 当解决了动态表单问题时,应该提供流程编辑器功能,将一个比如用户购物流程固化下来:客户注册、收藏、下单、支付、物流、收货、评价等。在每个前述流程中,可能有表单,也可能是系统流程驱动执行。

项目目标:

  1. 经过调研选取动态表单功能。(主体由MongoDB实现:表单元数据存储、表单UI显示、客户表单数据存储CRUD)
  2. 流程驱动执行。(暂定主体由Activiti实现)

2. 术语表

  • silver:

    系统名称,是一个基于Java的系统,承接前端请求,底层存储是MongoDB。是本项目的核心存储引擎。

  • 命名空间namespace:

    开发、测试、生产、预生产。用于区分不同的环境。

  • 系统system:

    即我们常规意义上的系统,微服务模式下,system可指代为每个微服务系统。

  • 模块module:

    system下的服务模块,例如crm下的客户资料管理模块。

  • 元数据meta:

    我们将最小的表单字段称为元数据。(后文,元数据 == 字段

  • 表单form:

    元数据(字段)聚合为表单

  • 表单坐标coordinate:

    命名空间 -> 系统 -> 模块 -> 表单。我们称表单的层级结构为“表单坐标”。元数据必须存在于某个表单坐标下。

    举个例子:命名空间(开发环境) -> 系统(crm) -> 模块(客户模块) -> 表单(客户信息表单)

  • 信息域infomation_domain:

    在表单的同一层级,称为信息域。(用树形结构类比,在树形结构的同一级的,为同一个信息域。)

    举个例子,客户表单的姓名、性别、配偶、学历可以称为一个信息域。学历是一个list,学历项下的list又可以自成一个信息域,只是这个信息域不是独立的字段,而是这样的结构:

    行1(字段1、字段2…)

    行2(字段1、字段2…)

    信息域的使用,是方便项目语言沟通,不会在系统实现上有所体现。

3. 技术选型

直接下结论:

  • 动态表单元数据配置功能。(主体由MongoDB实现:表单元数据存储、表单UI显示、客户表单数据存储CRUD)

    通过MongoDB配置表单(理由是其结构的易水平扩展),将表单数据导入类似ruoyi系统mysql并生成前端表单UI,前端代码提交的数据负载转发到silver

  • 流程驱动执行。(暂定主体由Activiti实现)

4. 概要设计

4.1. 逻辑架构图

4.2. 系统覆盖图

项目的思路核心是极简,尽量减少系统复杂度,减少系统部署难度。

5. 详细设计

5.1. 元数据样例及说明

[{
  "column_name": "customer",
  "form_father": "customer",
  "sort": 0,
  "type": "form",
  "column_desc": "客户营销表单",
  "uuid": "1d91e3bd-d2a6-459f-840a-43bde2f493ba",
  "system_module": "crm",
  "system": "商城管理系统",
  "children_unique": [
    "uuid"
  ],
  "form": "customer_market",
  "parent_column_name": "",
  "namespace": "开发"
},{
  "column_name": "uuid",
  "form_father": "customer",
  "sort": 1,
  "type": "text",
  "column_desc": "客户编号",
  "uuid": "5aecf1d2-95f3-475b-9f15-83db3f1b9972",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "name",
  "form_father": "customer",
  "sort": 2,
  "type": "text",
  "column_desc": "姓名",
  "uuid": "d340a958-f7b3-42d7-ab6a-9c285a65ab78",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "gender",
  "form_father": "customer",
  "sort": 3,
  "type": "text",
  "column_desc": "性别",
  "uuid": "b97dd4bf-3912-41d2-817b-eb481b841f44",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "age",
  "form_father": "customer",
  "sort": 4,
  "type": "int",
  "column_desc": "年龄",
  "uuid": "06536739-0592-4bc0-9fdd-2a3e24c30b59",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "spouse_name",
  "form_father": "customer",
  "sort": 5,
  "type": "text",
  "column_desc": "配偶姓名",
  "uuid": "c2ffa7a4-0da9-4b89-bfc9-8560940cc11f",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "spouse_age",
  "form_father": "customer",
  "sort": 6,
  "type": "int",
  "column_desc": "配偶年龄",
  "uuid": "313a48c8-1c4c-423b-822b-ee4c90717de9",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "mobile",
  "form_father": "customer",
  "sort": 7,
  "type": "text",
  "column_desc": "联系电话",
  "uuid": "4d408495-635f-41e6-ac0e-50c0822dde5e",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "address",
  "form_father": "customer",
  "sort": 8,
  "type": "text",
  "column_desc": "住址",
  "uuid": "80274d13-0ccb-4ba0-96e0-720700e7ec12",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "document_type",
  "choose": [
    "身份证号",
    "统一社会信用代码"
  ],
  "form_father": "customer",
  "sort": 9,
  "type": "select",
  "column_desc": "证件类型",
  "uuid": "02dd4ee6-6ed1-479d-a403-f06321f21814",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_market",
  "parent_column_name": "customer",
  "namespace": "开发"
},{
  "column_name": "customer_visit",
  "form_father": "customer",
  "sort": 0,
  "type": "form",
  "column_desc": "客户拜访表单",
  "uuid": "399129a5-3fbb-4607-bdf7-e32305a71dbf",
  "system_module": "crm",
  "system": "商城管理系统",
  "children_unique": [
    "uuid"
  ],
  "form": "customer_visit",
  "parent_column_name": "",
  "namespace": "开发"
},{
  "column_name": "uuid",
  "form_father": "customer",
  "sort": 1,
  "type": "text",
  "column_desc": "客户编号",
  "uuid": "6219a570-84bb-47c4-8bf4-0e86a2d2c7a9",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_visit",
  "parent_column_name": "customer_visit",
  "namespace": "开发"
},{
  "column_name": "name",
  "form_father": "customer",
  "sort": 2,
  "type": "text",
  "column_desc": "姓名",
  "uuid": "0cdf8171-ac88-4a56-ae1a-ea5bf7fa39a6",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_visit",
  "parent_column_name": "customer_visit",
  "namespace": "开发"
},{
  "column_name": "visit_date",
  "form_father": "customer",
  "sort": 3,
  "type": "text",
  "column_desc": "拜访日期",
  "uuid": "4a9fa7b5-6f4d-4f97-aee2-cb06cad2c853",
  "system_module": "crm",
  "system": "商城管理系统",
  "form": "customer_visit",
  "parent_column_name": "customer_visit",
  "namespace": "开发"
}]
字段字段描述是否必填样例及说明
uuid此元素的唯一key,在整个silver系统表单元数据范围内唯一
提交新的元数据配置时,由后端系统生成此key
fea186a1-fe02-441c-a00d-c455522fac941
column_name元数据的英文名称,在所属“表单坐标”下唯一,否则录入报错
column_desc元数据的描述
parent_column_name父级元数据的column_name表单第一层及的parent=form值
children_unique当此元数据type=table时,表明其子元数据是列表,为了描述列表各行如何识别,存储子元数据的column_name当type=table时必填[“type”,“number”],指代使用type+number作为联合唯一,来确定table中的多行数据唯一性
sort元数据在相同parent下的排序,从小到大,可以是int或float
type元数据类型:表格、文本、富文本、下拉框、单选框、复选框等
当type=form时,是为了表示根节点,此时column_name为form的表名。
choose当type=下拉框或复选框时必填,否则填写""当type=下拉框或复选框时必填[“男”,“女”]
father_form父表单名称customer
form表单名称,要在表单坐标coordinate项下唯一customer_market
namespace开发、测试、生产、预生产生产
system归属系统名crm
system_module模块名客户
add_time添加时间系统后端自动生成
update_time更新时间系统后端自动生成
del_flag逻辑删除标记,0未删除、1已删除系统后端自动生成

5.2. 关于uuid

为了便于数据的CRUD操作,我们固定为每个表都生成uuid,用来表示唯一。

例如:

客户customer表,uuid字段,是系统自动生成,无需前端填写。后续的UD操作,主要根据此字段来匹配。此uuid代表客户编号或客户id

客户product表,uuid字段,是系统自动生成,无需前端填写。后续的UD操作,主要根据此字段来匹配。此uuid代表产品编号或产品id

6. 接口清单

6.1. 表单管理模块

6.1.1. 从excel导入表单元数据

接口路径:

POST /form/importFormExcel

Headers:

参数名称参数值是否必须示例备注
Content-Typemultipart/form-data

Body:

参数名称参数类型是否必须示例备注
file文件导入的excel文件

返回数据

名称类型是否必须默认值备注其他信息
successboolean非必须
codenumber非必须
msgstring非必须
datanull非必须

6.1.2. 表单元数据树查询

接口路径:

POST /form/tree

Headers:

参数名称参数值是否必须示例备注
Content-Typeapplication/json

Body:

名称类型是否必须默认值备注其他信息
namespacestring非必须
systemstring非必须
system_modulestring非必须
formstring非必须

返回数据

入参样例:

{
    "namespace": "开发",
    "system": "商城管理系统",
    "system_module": "crm",
    "form": "customer_market"
}

返参样例:

{
    "success": true,
    "code": 100000,
    "msg": "处理成功",
    "data": {
        "del_flag": 0,
        "column_name": "customer",
        "form_father": "customer",
        "sort": 0,
        "type": "form",
        "column_desc": "客户营销表单",
        "uuid": "1d91e3bd-d2a6-459f-840a-43bde2f493ba",
        "system_module": "crm",
        "update_time": "2022-10-19 09:29:37",
        "system": "商城管理系统",
        "children_unique": [
            "uuid"
        ],
        "form": "customer_market",
        "children": [
            {
                "del_flag": 0,
                "column_name": "uuid",
                "form_father": "customer",
                "sort": 1,
                "type": "text",
                "column_desc": "客户编号",
                "uuid": "5aecf1d2-95f3-475b-9f15-83db3f1b9972",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "name",
                "form_father": "customer",
                "sort": 2,
                "type": "text",
                "column_desc": "姓名",
                "uuid": "d340a958-f7b3-42d7-ab6a-9c285a65ab78",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "gender",
                "form_father": "customer",
                "sort": 3,
                "type": "text",
                "column_desc": "性别",
                "uuid": "b97dd4bf-3912-41d2-817b-eb481b841f44",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "age",
                "form_father": "customer",
                "sort": 4,
                "type": "int",
                "column_desc": "年龄",
                "uuid": "06536739-0592-4bc0-9fdd-2a3e24c30b59",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "spouse_name",
                "form_father": "customer",
                "sort": 5,
                "type": "text",
                "column_desc": "配偶姓名",
                "uuid": "c2ffa7a4-0da9-4b89-bfc9-8560940cc11f",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "spouse_age",
                "form_father": "customer",
                "sort": 6,
                "type": "int",
                "column_desc": "配偶年龄",
                "uuid": "313a48c8-1c4c-423b-822b-ee4c90717de9",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "mobile",
                "form_father": "customer",
                "sort": 7,
                "type": "text",
                "column_desc": "联系电话",
                "uuid": "4d408495-635f-41e6-ac0e-50c0822dde5e",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "address",
                "form_father": "customer",
                "sort": 8,
                "type": "text",
                "column_desc": "住址",
                "uuid": "80274d13-0ccb-4ba0-96e0-720700e7ec12",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            },
            {
                "del_flag": 0,
                "column_name": "document_type",
                "choose": [
                    "身份证号",
                    "统一社会信用代码"
                ],
                "form_father": "customer",
                "sort": 9,
                "type": "select",
                "column_desc": "证件类型",
                "uuid": "02dd4ee6-6ed1-479d-a403-f06321f21814",
                "system_module": "crm",
                "update_time": "2022-10-19 09:29:37",
                "system": "商城管理系统",
                "form": "customer_market",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-19 09:29:37"
            }
        ],
        "parent_column_name": "",
        "namespace": "开发",
        "add_time": "2022-10-19 09:29:37"
    }
}

6.1.3. 表单元数据CRUD

接口路径:

POST /form/update

请求参数

Headers:

参数名称参数值是否必须示例备注
Content-Typeapplication/json

Body:

名称类型是否必须默认值备注其他信息
namespacestring非必须
systemstring非必须
system_modulestring非必须
formstring非必须
addobject []非必须item 类型: object
column_namestring非必须
column_descstring非必须
parent_column_namestring非必须
children_uniquestring非必须
choosestring非必须
sortnumber非必须
typestring非必须
deleteobject []非必须item 类型: object
uuidstring非必须
updateobject []非必须item 类型: object
uuidstring非必须
column_namestring非必须
column_descstring非必须
parent_column_namestring非必须
choosestring非必须
sortnumber非必须
typestring非必须

返回数据

返回的数据,是经过修改之后,此表单的完整表单树。

入参样例:

{
    "namespace": "开发",
    "system": "商城管理系统",
    "system_module": "crm",
    "form": "customer_market",
    "add": [
        {
            "column_name": "document_number",
            "column_desc": "证件号码",
            "parent_column_name": "customer",
            "children_unique": "",
            "choose": "",
            "sort": 9,
            "type": "text"
        }
    ],
    "delete": [
        {
            "uuid": "2022090328542u0n"
        }
    ],
    "update": [
        {
            "uuid": "3872227e-22cf-4e0f-8961-7ddde63c3372",
            "column_name": "document_type",
            "column_desc": "证件类型1112",
            "parent_column_name": "customer",
            "choose": "",
            "sort": 8,
            "type": "text"
        }
    ]
}

返参样例:

{
    "success": true,
    "code": 100000,
    "msg": "处理成功",
    "data": {
        "del_flag": 0,
        "column_name": "customer",
        "sort": 0,
        "type": "form",
        "column_desc": "客户表单",
        "uuid": "9403f91f-a1af-43b8-849f-22e77d6be6ae",
        "system_module": "crm",
        "update_time": "2022-10-12 14:11:07",
        "system": "商城管理系统",
        "children_unique": [
            "customer_number"
        ],
        "form": "客户",
        "children": [
            {
                "del_flag": 0,
                "column_name": "name",
                "sort": 1,
                "type": "text",
                "column_desc": "姓名",
                "uuid": "b8e71151-d9b1-404f-87a0-57558cb7295f",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "age",
                "sort": 2,
                "type": "int",
                "column_desc": "年龄",
                "uuid": "69c56441-c4d7-4ffe-8dfc-4953c0599ebb",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "spouse_name",
                "sort": 3,
                "type": "text",
                "column_desc": "配偶姓名",
                "uuid": "69bbd7b9-cf6e-46b6-b17a-351e224da501",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "spouse_age",
                "sort": 4,
                "type": "text",
                "column_desc": "配偶年龄",
                "uuid": "c3176931-ffdc-497a-add4-12adb7beb8c0",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "degree_list",
                "sort": 5,
                "type": "table",
                "column_desc": "学历",
                "uuid": "f4e36492-e48a-4f95-8ab2-27ab49e481ff",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "children_unique": [
                    "school",
                    "start_time"
                ],
                "form": "客户",
                "children": [
                    {
                        "del_flag": 0,
                        "column_name": "school",
                        "sort": 1,
                        "type": "text",
                        "column_desc": "学校名称",
                        "uuid": "cab5a3b4-a25a-4af3-ad9a-0df981e6935a",
                        "system_module": "crm",
                        "update_time": "2022-10-12 14:11:07",
                        "system": "商城管理系统",
                        "form": "客户",
                        "parent_column_name": "degree_list",
                        "namespace": "开发",
                        "add_time": "2022-10-12 14:11:07"
                    },
                    {
                        "del_flag": 0,
                        "column_name": "degree_name",
                        "sort": 2,
                        "type": "text",
                        "column_desc": "学位信息",
                        "uuid": "d390ec5a-aaf4-4748-8c51-9a30abf325f7",
                        "system_module": "crm",
                        "update_time": "2022-10-12 14:11:07",
                        "system": "商城管理系统",
                        "form": "客户",
                        "parent_column_name": "degree_list",
                        "namespace": "开发",
                        "add_time": "2022-10-12 14:11:07"
                    },
                    {
                        "del_flag": 0,
                        "column_name": "start_time",
                        "sort": 3,
                        "type": "datetime",
                        "column_desc": "学校开始时间",
                        "uuid": "90cf4a33-7a51-40b4-8766-a163d1c97118",
                        "system_module": "crm",
                        "update_time": "2022-10-12 14:11:07",
                        "system": "商城管理系统",
                        "form": "客户",
                        "parent_column_name": "degree_list",
                        "namespace": "开发",
                        "add_time": "2022-10-12 14:11:07"
                    },
                    {
                        "del_flag": 0,
                        "column_name": "end_time",
                        "sort": 4,
                        "type": "datetime",
                        "column_desc": "学校开始时间",
                        "uuid": "1f16ee2e-5e7a-4baa-a465-086cd93d9e40",
                        "system_module": "crm",
                        "update_time": "2022-10-12 14:11:07",
                        "system": "商城管理系统",
                        "form": "客户",
                        "parent_column_name": "degree_list",
                        "namespace": "开发",
                        "add_time": "2022-10-12 14:11:07"
                    }
                ],
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "mobile",
                "sort": 6,
                "type": "text",
                "column_desc": "联系电话",
                "uuid": "a1561894-6492-44fc-a61b-95097ba15014",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "address",
                "sort": 7,
                "type": "text",
                "column_desc": "住址",
                "uuid": "c12e77e7-49e4-42fe-a85a-13d9f37d6ad7",
                "system_module": "crm",
                "update_time": "2022-10-12 14:11:07",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "document_type",
                "choose": "",
                "sort": 8,
                "type": "text",
                "column_desc": "证件类型1112",
                "uuid": "3872227e-22cf-4e0f-8961-7ddde63c3372",
                "system_module": "crm",
                "update_time": "2022-10-13 08:54:40",
                "system": "商城管理系统",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-12 14:11:07"
            },
            {
                "del_flag": 0,
                "column_name": "document_number",
                "choose": "",
                "sort": 9,
                "type": "text",
                "column_desc": "证件号码",
                "uuid": "331fb3a6-3f51-4999-89db-2e65ed22ca9c",
                "system_module": "crm",
                "update_time": "2022-10-13 08:54:39",
                "system": "商城管理系统",
                "children_unique": "",
                "form": "客户",
                "parent_column_name": "customer",
                "namespace": "开发",
                "add_time": "2022-10-13 08:54:39"
            }
        ],
        "parent_column_name": "",
        "namespace": "开发",
        "add_time": "2022-10-12 14:11:07"
    }
}

6.1.4. 通过表单配置生成建表sql

接口路径:

POST /form/2tableSql

Headers:

参数名称参数值是否必须示例备注
Content-Typeapplication/json

Body:

名称类型是否必须默认值备注其他信息
namespacestring非必须
systemstring非必须
system_modulestring非必须
formstring非必须

返回数据

名称类型是否必须默认值备注其他信息
successboolean非必须
codenumber非必须
msgstring非必须
datastring非必须

入参样例:

{
    "namespace": "开发",
    "system": "商城管理系统",
    "system_module": "crm",
    "form": "customer_visit"
}

返参样例:

{
    "success": true,
    "code": 100000,
    "msg": "处理成功",
    "data": "CREATE TABLE if not exists `customer_visit` ( `name`  varchar(512)  COMMENT '姓名',`uuid`  varchar(128)  COMMENT '客户编号',`visit_date`  varchar(512)  COMMENT '拜访日期',   PRIMARY KEY (`uuid`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户拜访表单';"
}

6.2. 命名空间模块

6.3. 流程管理模块

7. 承上启下

  • 问题1:

我们是否需要一个大而全的表单UI,一次性把用户数据都采集好?

  • 问题2:

当表单存在层级时,如何自动生成表单UI?


思路:

  • 对于问题1:

    我相信,大部分的系统,都需要的是分阶段采集数据,而不是1个大表单采集完成。

    那么,我们要做的,应该是建立不同的表单,而这些表单,都是用来描述一个共同的事物。

    举个例子:

    客户信息业务数据结构:
    		表单1:客户编号,元数据1,元数据2.....
    		表单2:客户编号,元数据3,元数据4,元数据2.....(这里元数据2,应该是可以支持配置,并且可以进行填写更新的)
    		表单3:客户编号,元数据5,元数据6,元数据3,元数据4.....(同表单2的情况)
    
    客户信息存储:
    对于客户数据的存储,应该这样的全集:元数据1、元数据2、元数据3、元数据4、元数据5、元数据6.....。这些数据的存储,都在一个宽表中(MongoDB的一个collection)
    
    客户信息查询:
    对于客户数据的查询,可以是:
    		a. 查询全集
    		b. 也可以查询当前表单数据
    		c. 又或者根据元数据来查询
    
  • 对于问题2

    当我们通过问题1的解题思路来处理,那么显然,我们应该是针对不同的表单,去单独生成对应的表单UI。

    但是应该注意,当通过不同的表单采集客户数据的时候,每个表单都需要配置对应的客户主键信息,据此来进行CRUD

8. 系统实现

8.1. 使用开源项目“若依”作为Silver系统底座

8.1.1. 关闭验证码

简化操作,无需验证码

# 安全配置
security:
  # 验证码
  captcha:
    enabled: false

8.1.2. 创建新模块

  • 参考:https://blog.csdn.net/nexttoparadise/article/details/122173256

  • 我们创建的新模块maven坐标是:

    <dependency>
      <groupId>com.metal</groupId>
      <artifactId>silver</artifactId>
      <version>4.7.5</version>
    </dependency>
    
  • 增加对新模块的扫描

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
    //使用注解sql时记得添加mapper扫描
    @ComponentScan({ "com.ruoyi.*", "com.metal.*" })
    @MapperScan({"com.ruoyi.mapper","com.metal.silver.mapper"})
    public class RuoYiApplication
    

8.1.3. 通过db table生成代码不转驼峰

在通过db table自动生成代码时,我们希望保持元数据配置的column_name不要从带下划线转驼峰,那么要做下面的配置修改:

com.ruoyi.generator.util.GenUtils#initColumnField

public static void initColumnField(GenTableColumn column, GenTable table)
    {
        String dataType = getDbType(column.getColumnType());
        String columnName = column.getColumnName();
        column.setTableId(table.getTableId());
        column.setCreateBy(table.getCreateBy());
        // kelvin 不需要驼峰转换 设置java字段名
//        column.setJavaField(StringUtils.toCamelCase(columnName));
        column.setJavaField(columnName);
        // 设置默认类型
        column.setJavaType(GenConstants.TYPE_STRING);
        column.setQueryType(GenConstants.QUERY_EQ);
  			......

8.1.4. 新增生成mongodb控制器controller代码模板

根据代码生成逻辑,我们需要新的controller来接收前端请求的数据,并存储到mongodb中。

此时,需要在根据db生成代码的时候,新增一个模板,来生成一个新的controller。

新的模板存放在这里:

这个模板的改造,是根据我们mongodb的操作需要进行的自定义修改。

8.2. 系统实现

8.2.1. 设计表单

我们一共设计了2个表单,都属于crm模块,一个是customer_market客户营销,一个customer_visit客户拜访,如下:

  • customer_market客户营销

  • customer_visit客户拜访

8.2.2. 将表单导入mongodb

先导入customer_market客户营销

8.2.3. 通过表单配置生成建表sql

获取到的sql语句是:

CREATE TABLE if not exists `customer_market` (
  `address` varchar(512) COMMENT '住址',
  `age` int(4) COMMENT '年龄',
  `document_type` varchar(512) COMMENT '证件类型',
  `gender` varchar(512) COMMENT '性别',
  `mobile` varchar(512) COMMENT '联系电话',
  `name` varchar(512) COMMENT '姓名',
  `spouse_age` int(4) COMMENT '配偶年龄',
  `spouse_name` varchar(512) COMMENT '配偶姓名',
  `uuid` varchar(128) COMMENT '客户编号',
  PRIMARY KEY (`uuid`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '客户营销表单';

8.2.4. 执行建表

将上一步获取到的建表语句,在mysql中执行

8.2.5. 通过db表生成CRUD代码(存储到mongodb)

点击生成代码,并将代码放到我们新建的模块中,重新构建项目。

生成的代码包里面,sql文件也执行一下,这样就能看到菜单了。

至此,常规的页面就呈现好了,为了能将数据保存到mongodb,我们需要改一下生成的html里面代码提交的url,改提交到我们新生成的controller接口上。

  • add.html改动

    为了保持风格一致,我们新的controller接口,是在原先的接口prefix上加一个"2"。

    domain=customer,是为了指明我们这个数据要存到mongodb的哪个collection,这个其实也可以优化,在代码生成时直接指定。

  • edit.html

    同理

  • 列表页

至此,修改就完成了,看一下CRUD效果:

  • 添加

  • 添加后的列表页

  • 添加后,查看mongodb的数据存储

至此,数据已经存储到了mongodb中。

我们按照上面的步骤,再把customer_visit表建好,看看CRUD效果。

打包启动项目:

由于我们使用的是同一个mongodb的collection,所以打开客户拜访就可以看到客户数据

可以进行常规的修改

修改后,查看mongodb的数据情况:

数据已经维护好了,并且也不会影响原先客户营销表单的CRUD

至此,我们完成了对于客户表单信息的采集功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于mongodb的动态表单实现 的相关文章

  • 【注意/切记】 Android JIN开发过程中不要把long当jlong使用

    遇到问题 C C 43 43 调Java方法时直接把long类型的变量 xff0c 传给CallStaticVoidMethod导致对应的Java静态方法接收到了错误的long值 PS 实际的业务场比较复杂 浪费了好多时间去分析才定位到是这
  • Man手册常用快捷键之万事找h键

    最强最核心最根本的快捷键是 gt gt gt gt gt h 最核心 look everything you want to know is here 基本与常用 p 上翻一屏 control 43 p 上滚一行 n下播一屏 control
  • 2023年clang12编译问题与解决的记录

    最近编译clang12以及尝试基于clang开发一个C 43 43 的静态代码分析工具 xff0c 如下是遇到的环境相关的编译问题与解决方案 在此做个记录 xff0c 同时供可能会遇到同样问题的同学参考 环境说明 注 xff1a 如下是最终
  • Clang dump AST需要注意的事项

    Clang dump AST本质上是对一个OC C C 43 43 源文件编译单元执行编译 xff0c 即跟编译相关的配置都是要注意相关的参数 xff0c 比如依赖的头文件的路径 xff0c 特别编译的源文件依赖的其它路径下的头文件 xff
  • URI与URL的区别

    xff08 原网址 xff1a http zhidao baidu com question 38764759 html xff09 Web上可用的每种资源 HTML文档 图像 视频片段 程序等 由一个通过通用资源标志符 xff08 Uni
  • Python datetime  和 str 相互转化

    datetime 转化为 str now 61 datetime datetime now now strftime 39 Y m d H M S 39 print now 输出2012 03 05 16 26 23 870105 strf
  • BASE64编码规则

    Base64编码要求把3个8位字节 xff08 3 8 61 24 xff09 转化为4个6位的字节 xff08 4 6 61 24 xff09 xff0c 之后在6位的前面补两个0 xff0c 形成8位一个字节的形式 例如字符串 张3 x
  • Cygwin基本命令的使用方法

    原文链接 xff1a http blog chinaunix net space php uid 61 25580079 amp do 61 blog amp id 61 190413 基本操作命令 ls 以默认方式显示当前目录文件列表 l
  • 正确设置了charles,使用charles抓包某些app,无法抓到的原因(Android手机)

    Charles配置绝对正确 xff0c 还是使终抓不到包的可能的一种情况是 xff01 xff01 xff01 应用使用的网络库不支持代理 xff0c 所有的网络请求没有走代理 xff0c 而是走的正常wifi直连 当时的情况如下 xff1
  • 拉起抖音APP视频页的scheme

    拉起scheme地协议 snssdk1128 span class hljs regexp aweme span span class hljs regexp detail span span class hljs number 65344
  • 1. Windows下使用Mingw-w64 GCC编译安装Lua5.1.5

    除了一些游戏开发的脚本领域 xff0c 在以OpenResty作为Web框架的后端开发中 xff0c Lua也会大量的使用 xff0c 这就难免要对在Shell中测试 验证Lua语法 为此 xff0c 小编写了一篇在Windows环境下编译
  • VSCode Python3 三方库

    Mac VSCode python3 配置 setting 默认已经安装VSCode背景操作 默认已经安装VSCode 网上已经有好多教程安装使用Python3 这里只记录python3 的配置问题 背景 从想学Python 到实际操刀来
  • SylixOS命令行下内存操作/测试工具

    源头 memAccessCmd是用于SylixOS下对内存 寄存器进行访问和测试的工具 SylixOS下调测程序 xff0c 无论是应用 驱动还是内核 xff0c 如果能查看并操作指定内存 寄存器 xff0c 将是一个非常有效的手段 作者在
  • 博客里程碑

    2022 07 20 周三 排名突破5000好难啊 xff01 2022 07 26 周二 又前进了几名 xff0c 进入4000内了
  • 【bug秘史】UINT8数据超出类型范围输出0x0102

    案发现场 开发一个项目 xff0c 前期测试环境是 xff1a simulator 43 sparc leon3 43 sylxios 里面通信协议用到了很多和校验 xff0c 于是便有如下实现函数 xff1a span class tok
  • Ubuntu18.04 安装 Odoo10

    安装Ubuntu 18 04 xff0c 省略 安装时 xff0c 默认用户名为 odoo ubuntu 16 04 开始 使用 systemd 管理服务 xff0c 但是systemd 兼容 sysv init 脚本 下载 odoo源码
  • Git提交后,文件夹任然有红色叹号提示

    最近用TortoiseGit操作出现一个问题 xff0c 明明全部提交并同步了 xff0c nand文件夹上还是有红色叹号 xff0c 表示该文件下内有未提交内容或错误 查看Git仓库发现有yaffsMount c和yaffsmount c
  • 使用SylixOS虚拟串口,实现系统串口自由

    在博客 开启虚拟机第二串口命令行 讲了如何让虚拟机中的串口对接到Windows系统虚拟串口或物理串口 在simulator中并不是所有平台都有第二串口 xff0c 得bsp支持才行 xff0c 而且最多也只能有第二个而不能有第三第四个 对于
  • 大咖说|翼辉丁晓华:我们已经真正意义上感受到了原始创新带来的巨大价值

    大咖说 翼辉丁晓华 xff1a 我们已经真正意义上感受到了原始创新带来的巨大价值 大咖说 是由工控中国策划发起的人物专访类栏目 xff0c 旨在发掘工业控制系统产业链典型企业家代表 行业专家的前沿洞见 xff0c 通过深度访谈对话 xff0
  • 高效工作学习方法四则

    开始做比准备做更重要 xff0c 不要等到条件完全具备才开始 完成比完美更重要 xff0c 尤其是一开始不要最求完美 xff0c 会严重影响完成进度 一个不能完成的工作连完美的前提都丧失了 去做精力管理而不是时间管理 按精力安排工作而不是按

随机推荐

  • 《XXX重点项目质量保证措施》文档模板

    质量保障措施 研制过程中的质量控制在研制过程中 xff0c 不随意更改技术要求 xff0c 对任何技术要求更改 xff0c 都会与用户单位协商 xff0c 得到认可后方可实施 在研制过程中 xff0c 对影响技术性能的关键指标需外协时 xf
  • VDT (virtual device on tcp) 基于tcp通信的虚拟设备工具集

    概要 VDT virtual device on tcp 基于tcp通信的虚拟设备工具集 DOT device on tcp 创建虚拟字符设备 xff0c 通过tcp收发来读写 DTT device to tcp 打开字符设备 xff0c
  • debian11 安装后必备配置

    debian11 安装后必备配置 运行环境 xff1a PVE v7 2 11 CT容器 系统版本 xff1a Debian 11 standard 11 3 1 amd64 tar zst 启动信息 Debian GNU Linux sp
  • RealEvo许可证协议

    一直使用RealEvo V4 0 0版 xff0c 今天因license到期 xff0c 索性一同安装下新版的IDE 当前最新RealEvo IDE版本为 V5 0 5 xff0c V5 0 0 V5 0 3版本存在一些bug xff0c
  • SylixOS该怎么学

    个人整理的SylixOS学习路线和方法 xff0c 会不定期补充 欢迎大家给出建议
  • sparc-sylixos-elf-gcc平台选项

    sparc sylixos elf gcc exe target help The following options are target specific span class token parameter variable m32
  • Ubuntu18.04 方便好用的截图工具

    安装flameshot 下载地址 xff1a https github com lupoDharkael flameshot 安装命令 xff1a sudo apt get install flameshot 配置快捷键 设置 gt 设备
  • SPARC体系下硬浮点编译故障分析

    问题说明 之前extension版的app工程都是用的软浮点编译的 xff0c 在增加姿控算法库后 xff0c 统一改用硬浮点运行 xff0c 发现之前一个浮点数解析不对了 xff0c 排查发现和工程编译选项有关 xff0c 为软浮点时正常
  • SylixOS下DNS配置

    SylixOS下支持DNS xff08 域名解析 xff09 服务 xff0c 既可以通过域名地址来访问网络地址 测试 先进行一个域名解析的测试 xff1a 由上图可知 xff0c 在其他网络配置正确的情况下 xff0c SylixOS可以
  • SylixOS 教培官网上线

    4月末翼辉创建的包括SylixOS教培在内的文档中心已上线 今天SylixOS教培又上线了 Shell 命令手册 和 IDE 使用手册 方便大家学习和查阅SylixOS相关知识点 SylixOS教培官网 https docs acoinfo
  • SylixOS App 运行时出现“vprocRun() error: can not find entry function.”错误提示原因及解决方法

    针对只使用静态库 xff0c 不使用共享库的业务场景 xff0c 如果libsylixos Output目录下的 libvpmpdm so文件被删除 xff0c SylixOS App程序将自动连接libvpmpdm a文件 xff0c 这
  • 【无标题】

    环境变量 xff08 environment variables xff09 是一组键值对 xff08 key 61 value xff09 列表 xff0c 每一项键值对为一个环境变量 xff0c 分环境变量名和环境变量值 xff0c 两
  • c#爬虫-1688官网自动以图搜图

    背景 在1688有个功能 xff0c 就是上传图片 xff0c 就可以找到类似的商品 如下 网址 xff1a https www 1688 com 这时候 xff0c 我们可以使用程序来代替 xff0c 大批量的完成图片上传功能 实现思路
  • 关于大端序和小段序

    Most Significant Byte 指多字节序列中具有最大权重的 字节 wiki中的解释 xff1a Most Significant Bit 是指一个n位 二进制数字中的n 1位 xff0c 具有最高的权值 与之相反的称之为最低有
  • 使用Project进行项目管理

    文章目录 1 Project可以做哪些 xff1f 1 1 功能清单1 2 本文将会涉及到的内容 2 常见操作2 1 设置 xff1a 自动任务2 2 设置 xff1a 任务的时间格式2 3 日历设置 xff1a 项目开始时间2 4 日历设
  • 进销存小程序(一)项目整体功能和设计

    文章目录 1 设计目标2 功能点说明2 1 首页2 2 登陆2 2 1 微信用户和当前用户绑定的过程2 2 2 获取用户信息 2 3 创建店铺2 4 加入店铺2 5 创建商品2 6 商品信息修改2 7 入库管理2 8 出库管理2 9 库存盘
  • Tomcat的appBase,docBase,path关系

    文章目录 1 结论在最前面2 server xml关于appbase和context配置2 1 war包在webapps目录下 xff1b appbase 61 34 webapps 34 xff1b 无context配置2 2 war包在
  • ubuntu 18.04 LTS 安装搜狗输入法

    首先安装 fcitx xff0c 再安装搜狗输入法 一 检测是否安装fcitx 首先检测是否有 fcitx xff0c 因为搜狗拼音依赖fcitx 在终端中输入 fcitx xff0c 检查 fcitx 是否已有 fcitx 提示 xff1
  • Activiti之一:部署activiti-admin、activiti-app、activiti-rest

    文章目录 各组件版本下载部署将war包放入tomcat 访问 在网上查找activiti相关资料 xff0c 发现对于activiti rest的使用很少 xff0c 而官网对于api的支持还是比较多的 xff0c 如果考虑的是一个纯粹的工
  • 基于mongodb的动态表单实现

    文章目录 1 项目背景2 术语表3 技术选型4 概要设计4 1 逻辑架构图4 2 系统覆盖图 5 详细设计5 1 元数据样例及说明5 2 关于uuid 6 接口清单6 1 表单管理模块6 1 1 从excel导入表单元数据6 1 2 表单元