# Online 表单 API 参考文档 本文档是 jeecg-onlform skill 的参考数据,包含完整的 JSON 请求模板和字段枚举。 ## 1. addAll 完整请求体模板(单表) 以下是一个包含所有控件类型的完整示例: ```json { "head": { "tableVersion": "1", "tableName": "表名_snake_case", "tableTxt": "表描述文本", "tableType": 1, "formCategory": "temp", "idType": "UUID", "isCheckbox": "Y", "themeTemplate": "normal", "formTemplate": "1", "scroll": 1, "isPage": "Y", "isTree": "N", "extConfigJson": "{\"reportPrintShow\":0,\"reportPrintUrl\":\"\",\"joinQuery\":0,\"modelFullscreen\":0,\"modalMinWidth\":\"\",\"commentStatus\":0,\"tableFixedAction\":1,\"tableFixedActionType\":\"right\",\"formLabelLengthShow\":0,\"formLabelLength\":null,\"enableExternalLink\":0,\"externalLinkActions\":\"add,edit,detail\"}", "isDesForm": "N", "desFormCode": "" }, "fields": [], "indexs": [], "deleteFieldIds": [], "deleteIndexIds": [] } ``` ### head 字段说明 | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | tableName | string | 是 | - | 数据库表名(snake_case) | | tableTxt | string | 是 | - | 表描述 | | tableType | int | 是 | 1 | 1=单表, 2=主表, 3=子表 | | tableVersion | string | 是 | "1" | 版本号 | | idType | string | 是 | "UUID" | 主键策略: UUID/SEQUENCE/ID_WORKER | | formCategory | string | 否 | "temp" | 表单分类 | | formTemplate | string | 否 | "1" | PC表单模板 1=一列, 2=两列 | | themeTemplate | string | 否 | "normal" | 主题: normal/erp/innerTable/tab | | isCheckbox | string | 否 | "Y" | 是否显示复选框 | | isPage | string | 否 | "Y" | 是否分页 | | isTree | string | 否 | "N" | 是否树形 | | scroll | int | 否 | 1 | 是否有横向滚动条 | | extConfigJson | string | 否 | - | 扩展配置JSON字符串 | | isDesForm | string | 否 | "N" | 是否用设计器表单 | | desFormCode | string | 否 | "" | 设计器表单编码 | ### 主子表额外 head 字段 | 字段 | 说明 | 何时需要 | |------|------|---------| | subTableStr | 子表名列表(逗号分隔) | 主表(tableType=2) | | relationType | 0=一对多, 1=一对一 | 子表(tableType=3) **必填** | | tabOrderNum | 附表排序号 | 子表(tableType=3) **必填** | ### 树表额外 head 字段 | 字段 | 说明 | |------|------| | treeParentIdField | 父ID字段名(如 "pid") | | treeIdField | 是否有子节点字段(如 "has_child") | | treeFieldname | 树展开显示字段(如 "name") | --- ## 2. 系统默认字段(6个,每个表必须包含) ```json [ { "dbFieldName": "id", "dbFieldTxt": "主键", "fieldMustInput": "1", "isShowForm": 0, "isShowList": 0, "isReadOnly": 1, "fieldShowType": "text", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 36, "dbPointLength": 0, "dbType": "string", "dbIsKey": 1, "dbIsNull": 0, "orderNum": 0 }, { "dbFieldName": "create_by", "dbFieldTxt": "创建人", "fieldMustInput": "0", "isShowForm": 0, "isShowList": 0, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "text", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 50, "dbPointLength": 0, "dbType": "string", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 1 }, { "dbFieldName": "create_time", "dbFieldTxt": "创建时间", "fieldMustInput": "0", "isShowForm": 0, "isShowList": 0, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "datetime", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 50, "dbPointLength": 0, "dbType": "Datetime", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 2 }, { "dbFieldName": "update_by", "dbFieldTxt": "更新人", "fieldMustInput": "0", "isShowForm": 0, "isShowList": 0, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "text", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 50, "dbPointLength": 0, "dbType": "string", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 3 }, { "dbFieldName": "update_time", "dbFieldTxt": "更新时间", "fieldMustInput": "0", "isShowForm": 0, "isShowList": 0, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "datetime", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 50, "dbPointLength": 0, "dbType": "Datetime", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 4 }, { "dbFieldName": "sys_org_code", "dbFieldTxt": "所属部门", "fieldMustInput": "0", "isShowForm": 0, "isShowList": 0, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "text", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "dbLength": 50, "dbPointLength": 0, "dbType": "string", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 5 } ] ``` --- ## 3. 业务字段完整属性模板 ```json { "id": "前端生成的短ID", "dbFieldName": "field_name", "dbFieldTxt": "字段标签", "queryShowType": null, "queryDictTable": "", "queryDictField": "", "queryDictText": "", "queryDefVal": "", "queryConfigFlag": "0", "mainTable": "", "mainField": "", "fieldHref": "", "fieldValidType": "", "fieldMustInput": "0", "dictTable": "", "dictField": "", "dictText": "", "isShowForm": 1, "isShowList": 1, "sortFlag": "0", "isReadOnly": 0, "fieldShowType": "text", "fieldLength": 120, "isQuery": 0, "queryMode": "single", "fieldDefaultValue": "", "converter": "", "fieldExtendJson": "", "dbLength": 100, "dbPointLength": 0, "dbType": "string", "dbIsKey": 0, "dbIsNull": 1, "orderNum": 6 } ``` --- ## 4. fieldShowType 控件类型完整清单 ### 基础控件 | fieldShowType | 说明 | 典型 dbType | 典型 dbLength | 字典配置 | |--------------|------|------------|--------------|---------| | `text` | 文本输入框 | string | 100 | 不需要 | | `password` | 密码框 | string | 32 | 不需要 | | `textarea` | 多行文本 | string | 500 | 不需要 | | `date` | 日期选择 | Date | 0 | 不需要 | | `datetime` | 日期时间 | Datetime | 0 | 不需要 | | `time` | 时间选择 | string | 50 | 不需要 | | `switch` | 开关 | string | 50 | fieldExtendJson 配置 | | `file` | 文件上传 | string | 500 | 不需要 | | `image` | 图片上传 | string | 500 | 不需要 | | `umeditor` | 富文本编辑器 | Text | 0 | 不需要 | | `markdown` | Markdown | Blob | 0 | 不需要 | | `pca` | 省市区联动 | string | 100 | 不需要 | ### 字典控件(使用系统字典) | fieldShowType | 说明 | dictField | dictTable | dictText | |--------------|------|-----------|-----------|----------| | `list` | 字典下拉 | 字典code | `""` | `""` | | `radio` | 字典单选 | 字典code | `""` | `""` | | `checkbox` | 字典多选 | 字典code | `""` | `""` | | `list_multi` | 字典下拉多选 | 字典code | `""` | `""` | | `cat_tree` | 分类字典树 | 分类编码 | `""` | `""` | ### 字典表控件(使用数据库表) | fieldShowType | 说明 | dictTable | dictField | dictText | |--------------|------|-----------|-----------|----------| | `list` | 字典表下拉 | 表名 | 存储字段 | 显示字段 | | `radio` | 字典表单选 | 表名 | 存储字段 | 显示字段 | | `checkbox` | 字典表多选 | 表名 | 存储字段 | 显示字段 | | `list_multi` | 字典表下拉多选 | 表名 | 存储字段 | 显示字段 | | `sel_search` | 字典表下拉搜索 | 表名 | 存储字段 | 显示字段 | ### 特殊选择控件 | fieldShowType | 说明 | dictTable | dictField | dictText | |--------------|------|-----------|-----------|----------| | `sel_user` | 用户选择 | `""` | `""` | `""` | | `sel_depart` | 部门选择 | `""` | `""` | `""` | | `sel_tree` | 自定义树 | 树表名 | 根节点值 | `"id,pid,name,has_child"` | | `popup` | Popup弹窗 | 弹窗表名 | 存储字段映射 | 回填字段映射 | | `popup_dict` | Pop字典 | 弹窗表名 | 存储字段 | 显示字段 | ### 关联控件 | fieldShowType | 说明 | dictTable | dictField | dictText | dbIsPersist | |--------------|------|-----------|-----------|----------|-------------| | `link_table` | 关联记录 | 关联表名 | 主键字段 | 显示列(逗号分隔) | 1 | | `link_table_field` | 他表字段 | 本表link_table字段名 | `""` | 显示字段名 | **0** | | `link_down` | 联动下拉 | JSON配置 | `""` | `""` | 1 | --- ## 5. 各控件类型的完整字段配置示例 ### 5.1 text 文本框 ```json {"dbFieldName": "name", "dbFieldTxt": "姓名", "fieldShowType": "text", "dbType": "string", "dbLength": 100, "dbPointLength": 0, "fieldMustInput": "1", "isQuery": 1, "queryMode": "single", "isShowForm": 1, "isShowList": 1} ``` ### 5.2 BigDecimal 金额 ```json {"dbFieldName": "price", "dbFieldTxt": "单价", "fieldShowType": "text", "dbType": "BigDecimal", "dbLength": 10, "dbPointLength": 2, "isShowForm": 1, "isShowList": 1} ``` ### 5.3 int 整数 ```json {"dbFieldName": "quantity", "dbFieldTxt": "数量", "fieldShowType": "text", "dbType": "int", "dbLength": 9, "dbPointLength": 0, "isShowForm": 1, "isShowList": 1} ``` ### 5.4 password 密码 ```json {"dbFieldName": "mi_ma", "dbFieldTxt": "密码", "fieldShowType": "password", "dbType": "string", "dbLength": 32} ``` ### 5.5 list 字典下拉 ```json {"dbFieldName": "status", "dbFieldTxt": "状态", "fieldShowType": "list", "dbType": "string", "dbLength": 50, "dictField": "sex", "dictTable": "", "dictText": "", "isQuery": 1} ``` ### 5.6 list 字典表下拉 ```json {"dbFieldName": "depart", "dbFieldTxt": "部门", "fieldShowType": "list", "dbType": "string", "dbLength": 255, "dictTable": "sys_depart", "dictField": "id", "dictText": "depart_name", "fieldLength": 200} ``` ### 5.7 list 字典表带条件下拉 ```json {"dbFieldName": "user_select", "dbFieldTxt": "用户", "fieldShowType": "list", "dbType": "string", "dbLength": 255, "dictTable": "sys_user where username like '%a%'", "dictField": "username", "dictText": "realname", "fieldLength": 200} ``` ### 5.8 radio 字典单选 ```json {"dbFieldName": "sex", "dbFieldTxt": "性别", "fieldShowType": "radio", "dbType": "string", "dbLength": 50, "dictField": "sex", "dictTable": "", "dictText": ""} ``` ### 5.9 checkbox 字典多选 ```json {"dbFieldName": "tags", "dbFieldTxt": "标签", "fieldShowType": "checkbox", "dbType": "string", "dbLength": 200, "dictField": "urgent_level", "dictTable": "", "dictText": ""} ``` ### 5.10 list_multi 字典下拉多选 ```json {"dbFieldName": "multi", "dbFieldTxt": "多选", "fieldShowType": "list_multi", "dbType": "string", "dbLength": 250, "dictField": "urgent_level", "dictTable": "", "dictText": ""} ``` ### 5.11 switch 开关 ```json {"dbFieldName": "enabled", "dbFieldTxt": "启用", "fieldShowType": "switch", "dbType": "string", "dbLength": 50, "dictField": "", "dictTable": "", "dictText": "", "fieldExtendJson": "[\"Y\",\"N\"]"} ``` ### 5.12 date 日期 ```json {"dbFieldName": "start_date", "dbFieldTxt": "开始日期", "fieldShowType": "date", "dbType": "Date", "dbLength": 0, "isQuery": 1, "queryMode": "group"} ``` ### 5.13 date 年选择 ```json {"dbFieldName": "year", "dbFieldTxt": "年", "fieldShowType": "date", "dbType": "Date", "dbLength": 0, "fieldExtendJson": "{\"labelLength\":6,\"picker\":\"year\"}", "fieldLength": 200} ``` ### 5.14 datetime 日期时间 ```json {"dbFieldName": "order_time", "dbFieldTxt": "下单时间", "fieldShowType": "datetime", "dbType": "Datetime", "dbLength": 0} ``` ### 5.15 time 时间 ```json {"dbFieldName": "check_time", "dbFieldTxt": "签到时间", "fieldShowType": "time", "dbType": "string", "dbLength": 50, "isQuery": 1, "queryMode": "group"} ``` ### 5.16 file 文件上传 ```json {"dbFieldName": "attachment", "dbFieldTxt": "附件", "fieldShowType": "file", "dbType": "string", "dbLength": 500} ``` ### 5.17 image 图片上传 ```json {"dbFieldName": "avatar", "dbFieldTxt": "头像", "fieldShowType": "image", "dbType": "string", "dbLength": 500} ``` ### 5.18 textarea 多行文本 ```json {"dbFieldName": "remark", "dbFieldTxt": "备注", "fieldShowType": "textarea", "dbType": "string", "dbLength": 500} ``` ### 5.19 umeditor 富文本 ```json {"dbFieldName": "content", "dbFieldTxt": "内容", "fieldShowType": "umeditor", "dbType": "Text", "dbLength": 0, "isShowList": 0} ``` ### 5.20 markdown ```json {"dbFieldName": "doc", "dbFieldTxt": "文档", "fieldShowType": "markdown", "dbType": "Blob", "dbLength": 0, "isShowList": 0} ``` ### 5.21 sel_user 用户选择 ```json {"dbFieldName": "approver", "dbFieldTxt": "审批人", "fieldShowType": "sel_user", "dbType": "string", "dbLength": 100, "isQuery": 1} ``` ### 5.22 sel_depart 部门选择 ```json {"dbFieldName": "dept", "dbFieldTxt": "所在部门", "fieldShowType": "sel_depart", "dbType": "string", "dbLength": 100, "isQuery": 1} ``` ### 5.23 pca 省市区 ```json {"dbFieldName": "address", "dbFieldTxt": "地址", "fieldShowType": "pca", "dbType": "string", "dbLength": 100, "isQuery": 1} ``` ### 5.24 sel_search 下拉搜索 ```json {"dbFieldName": "user", "dbFieldTxt": "选择用户", "fieldShowType": "sel_search", "dbType": "string", "dbLength": 50, "dictTable": "sys_user", "dictField": "username", "dictText": "realname", "isQuery": 1} ``` ### 5.25 cat_tree 分类字典树 ```json {"dbFieldName": "category", "dbFieldTxt": "分类", "fieldShowType": "cat_tree", "dbType": "string", "dbLength": 100, "dictField": "B02", "dictTable": "", "dictText": ""} ``` ### 5.26 sel_tree 自定义树 ```json {"dbFieldName": "tree_node", "dbFieldTxt": "树节点", "fieldShowType": "sel_tree", "dbType": "string", "dbLength": 255, "dictTable": "sys_category", "dictField": "0", "dictText": "id,pid,name,has_child"} ``` ### 5.27 popup 弹窗选择 ```json {"dbFieldName": "popup_val", "dbFieldTxt": "弹窗选择", "fieldShowType": "popup", "dbType": "string", "dbLength": 100, "dictTable": "report_user", "dictField": "username,realname", "dictText": "popup_val,popup_back"} ``` 注意:dictText 中的值是本表接收回填的字段名,需要对应创建 popup_back 字段。 ### 5.28 popup_dict Pop字典 ```json {"dbFieldName": "pop_dict", "dbFieldTxt": "Pop字典", "fieldShowType": "popup_dict", "dbType": "string", "dbLength": 100, "dictTable": "report_user", "dictField": "id", "dictText": "realname"} ``` ### 5.29 link_table 关联记录(单选) ```json {"dbFieldName": "related", "dbFieldTxt": "关联记录", "fieldShowType": "link_table", "dbType": "string", "dbLength": 32, "dictTable": "demo_staff", "dictField": "id", "dictText": "name,age,sex", "fieldExtendJson": "{\"showType\":\"card\",\"multiSelect\":false,\"imageField\":\"\"}", "fieldLength": 200} ``` ### 5.30 link_table 关联记录(多选带图) ```json {"dbFieldName": "related_multi", "dbFieldTxt": "关联记录多选", "fieldShowType": "link_table", "dbType": "string", "dbLength": 200, "dictTable": "test_demo", "dictField": "id", "dictText": "name,sex,age", "fieldExtendJson": "{\"showType\":\"card\",\"multiSelect\":true,\"imageField\":\"top_pic\"}", "fieldLength": 200} ``` ### 5.31 link_table_field 他表字段 ```json {"dbFieldName": "ta_field", "dbFieldTxt": "他表字段", "fieldShowType": "link_table_field", "dbType": "string", "dbLength": 32, "dictTable": "related", "dictField": "", "dictText": "name", "fieldLength": 200} ``` 注意:dictTable 填本表中 link_table 控件的**字段名**(不是数据库表名),dbIsPersist=0。 ### 5.32 link_down 联动下拉 ```json {"dbFieldName": "link1", "dbFieldTxt": "联动一", "fieldShowType": "link_down", "dbType": "string", "dbLength": 255, "dictTable": "\n{\n\ttable: \"sys_category\",\n\ttxt: \"name\",\n\tkey: \"id\",\n\tlinkField: \"link2,link3\",\n\tidField: \"id\",\n\tpidField: \"pid\",\n\tcondition:\"pid = '0'\"\n}", "dictField": "", "dictText": ""} ``` 被联动的字段(link2、link3)使用普通 text 控件。 --- ## 6. fieldValidType 校验规则 | 值 | 说明 | |---|------| | `""` | 无校验 | | `only` | 唯一校验(需配合唯一索引) | | `m` | 手机号 | | `e` | 邮箱 | | `n` | 数字 | | `n6-16` | 6-16位数字 | | `*6-16` | 6-16位任意字符 | | `money` | 金额格式 | | `^正则$` | 自定义正则(如 `^[a-z\|A-Z]{2,10}$`) | --- ## 7. fieldDefaultValue 默认值表达式 | 语法 | 说明 | |------|------| | `#{sysUserCode}` | 当前用户账号 | | `#{sysUserName}` | 当前用户姓名 | | `#{sysOrgCode}` | 当前用户部门编码 | | `#{date}` | 当前日期 | | `#{time}` | 当前时间 | | `${规则编码}` | 编码规则(自动流水号) | | `{{JS表达式}}` | 前端JS表达式 | | 纯字符串 | 直接赋值(如 "Y", "10") | --- ## 8. extConfigJson 完整默认配置 ```json { "reportPrintShow": 0, "reportPrintUrl": "", "joinQuery": 0, "modelFullscreen": 0, "modalMinWidth": "", "commentStatus": 0, "tableFixedAction": 1, "tableFixedActionType": "right", "formLabelLengthShow": 0, "formLabelLength": null, "enableExternalLink": 0, "externalLinkActions": "add,edit,detail" } ``` --- ## 9. editAll 与 addAll 的关键差异 | 维度 | addAll (新增) | editAll (编辑) | |------|--------------|----------------| | head.id | 不传,服务端生成 | **必传** | | fields[].id | 前端自定义短ID | 已有字段=32位hex ID,新增字段=前端短ID | | fields[].dbIsPersist | 不传 | 需传(link_table_field=0, 其余=1) | | fields[].dbDefaultVal | 不传 | 需传 | | 空值 | 统一用 `""` | 系统字段用 null,业务字段用 `""` | | head 额外字段 | 无 | 含 isDbSynch、createBy、createTime 等 | | deleteFieldIds | 空数组 | 可含要删除的字段ID | | deleteIndexIds | 空数组 | 可含要删除的索引ID | | 版本号 | 固定 "1" | 服务端自动+1 | ### editAll 新增字段识别规则 - 字段 id 为 32 位 hex → 更新已有字段 - 字段 id 不足 32 位 → 新增字段 - 字段 id 为 "_pk" → 跳过 ### editAll 删除操作 - 要删除的字段ID放入 `deleteFieldIds` - 要删除的索引ID放入 `deleteIndexIds` --- ## 10. 查询现有表单 API ### 按ID查询 ``` GET /online/cgform/api/getByHead?id={headId} ``` 响应: ```json { "success": true, "result": { "head": { ... }, "fields": [ ... ], "indexs": [ ... ] } } ``` ### 查询表单列表 ``` GET /online/cgform/head/list?tableName={表名}&pageNo=1&pageSize=10 ``` 返回 `result.records[0].id` 即为 headId。 --- ## 9. 同步数据库 API 创建或编辑表单配置后,需要调用同步数据库 API 将配置同步为真实数据库表。 ``` POST /online/cgform/api/doDbSynch/{headId}/{syncType} ``` | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | headId | string | 是 | 表单配置的 ID(32位hex,从 addAll 创建后查询获取) | | syncType | string | 是 | `normal` = 普通同步(增量,不丢数据),`force` = 强制同步(删表重建,丢数据!) | **使用流程:** 1. 调用 `addAll` 创建表单配置 → 返回 success 2. 调用 `queryPageList?tableName=xxx` 查询刚创建的表单获取 `headId` 3. 调用 `doDbSynch/{headId}/normal` 同步到数据库 **响应示例:** ```json { "success": true, "message": "同步成功", "code": 200, "result": null, "timestamp": 1773462789925 } ``` **注意事项:** - `normal` 模式:仅增加新字段、修改字段属性,不删除已有字段,不丢失数据 - `force` 模式:删除原表并重建,所有数据丢失!仅开发环境使用 - 编辑表单(editAll)后也需要重新同步数据库 --- ## 10. 菜单 SQL 模板 将 Online 表单配置为系统菜单,使用户可以在左侧菜单中直接访问。 ```sql INSERT INTO sys_permission( id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external ) VALUES ( '{menuId}', -- 菜单ID(32位,可用headId或自定义) NULL, -- 父菜单ID(NULL=一级菜单,填ID=子菜单) '{tableTxt}', -- 菜单名称(表描述) '/online/cgformList/{headId}', -- 路由URL(固定格式) '1', -- component 固定为 '1'(Online组件标识) 'OnlineAutoList', -- component_name 固定值 NULL, -- redirect 0, -- menu_type: 0=菜单 NULL, -- perms 权限编码 '1', -- perms_type: 1=可授权 0.00, -- sort_no 排序 0, -- always_show NULL, -- icon 图标 0, -- is_route: 0(Online组件不走路由) 1, -- is_leaf: 1=叶子节点 0, -- keep_alive 0, -- hidden: 0=显示 0, -- hide_tab: 0=显示tab NULL, -- description '1', -- status: 1=有效 0, -- del_flag: 0=未删除 0, -- rule_flag 'admin', -- create_by now(), -- create_time NULL, -- update_by NULL, -- update_time 0 -- internal_or_external: 0=内部 ); ``` **关键字段说明:** | 字段 | 固定值 | 说明 | |------|--------|------| | url | `/online/cgformList/{headId}` | Online 表单路由,headId 是表单配置ID | | component | `'1'` | 固定值,前端识别为 Online 组件 | | component_name | `'OnlineAutoList'` | 固定值,Online 自动列表组件 | | is_route | `0` | Online 组件不走普通路由 | | is_leaf | `1` | 必须是叶子节点 | | parent_id | `NULL` 或父菜单ID | NULL=一级菜单,指定父ID=子菜单 |