本文不谈用哪种设计器,先谈一张表单由什么组成:控件、数据与业务逻辑,以及三者各自的元数据载体。
选设计器之前,先问一句:一张表单到底装了什么?
答案固定是三块——
要素 | 一句话 | 典型内容 |
|---|---|---|
控件 | 界面上能看见、能操作的东西 | 文本框、下拉框、单选、评分、从表、附件 |
数据 | 控件背后落库的内容 | 主表数据、从表数据、附件数据 |
业务逻辑 | 控件之间的交互与计算关系 | 级联、单价×数量=小计、Pop 弹窗回填 |
《五大设计器》讲的是造车厢的车间;本文讲的是车厢里三样货怎么摆。车间可以换,货的分类不变。
低代码轨道上,三要素全部落在数据库元数据表里:
Sys_MapData (No, PTable)
├─ Sys_MapAttr → 字段控件(主表/从表列)
├─ Sys_MapDtl → 从表容器
├─ Sys_FrmAttachment → 附件区
├─ Sys_GroupField → 布局分组(可挂 Dtl / Ath)
└─ Sys_MapExt → 挂在字段上的扩展逻辑起点 | 作用 | 落点 |
|---|---|---|
控件 | 渲染 · 读写 | 数据 |
业务逻辑 | 级联 / 计算 / Pop | 控件 |
业务逻辑 | 填充 / 校验 | 数据 |
数据是三要素里最稳的那一层:换设计器、换皮肤,物理表结构通常不动。
层级 | 元数据 | 物理落点 | 行键怎么挂 |
|---|---|---|---|
主表 | Sys_MapData(No + PTable) | PTable 上一行业务数据 | 主键多为 OID(流程 WorkID) |
从表 | Sys_MapDtl(FK_MapData + 自己的 PTable) | 多行明细 | OID + RefPK → 主表 OID;合流等用 FID |
附件 | Sys_FrmAttachment | 文件元数据在 Sys_FrmAttachmentDB | RefPKVal + 表单 + 附件标识 |
请假演示流程里:节点表单 ND101(填写请假申请单)的 PTable 是 ND1Rpt;后续节点 ND102~ND104 往往共用同一张物理表,差异在各节点自己的 MapAttr 与权限方案——业务数据仍然是 ND1Rpt 的一行。
口诀:
MapData.No是逻辑表单 ID,PTable才是真正 INSERT/UPDATE 的表名。 多节点可以「多张逻辑表单、一张物理表」。
每个字段是 Sys_MapAttr 的一行,三个正交维度一起定「这列是什么」:
维度 | 字段 | 作用 |
|---|---|---|
控件形态 | UIContralType | 用哪个界面组件渲染 |
存储类型 | MyDataType | 物理列类型(字符串/整型/日期/金额…) |
逻辑类型 | LGType(FieldTypeS) | 普通 0 / 枚举 1 / 外键 2,常配 UIBindKey |
MyDataType 常用值(与 wiki 一致):
值 | 常量 | 含义 |
|---|---|---|
1 | AppString | 字符串 |
2 | AppInt | 整型 |
3 | AppFloat | 浮点 |
4 | AppBoolean | 布尔 |
5 | AppDouble | 双精度 |
6 | AppDate | 日期 |
7 | AppDateTime | 日期时间 |
8 | AppMoney | 金额 |
9 | AppRate | 比率 |
例如请假 demo:QingJiaRiQiCong(请假日期从)是 UIContralType=0(TB)+ MyDataType=6(日期);QingJiaTianShu 是浮点天数;QingJiaYuanYin 是大块文本。
GEEntity(frmID) / GEEntityOID:按 MapData.GenerHisMap() 把 Sys_MapAttr 投影成动态 EnMap,读写 PTable。GEDtl:从表行,带 RefPK / FID / OID。FrmAttachmentDB.RefPKVal 挂到主表主键。从表、附件在布局上通过 Sys_GroupField.CtrlType = 'Dtl' | 'Ath' 挂到分组里——它们是容器级数据,不是普通文本框的一种 UIContralType。
你在设计 | 实际在改 |
|---|---|
加一个「请假天数」 | Sys_MapAttr 一行 + PTable 一列 |
加「行程明细」从表 | Sys_MapDtl + 从表自己的 MapAttr 集合 |
加「病假条」上传区 | Sys_FrmAttachment + 运行时写 FrmAttachmentDB |
节点换皮、字段显隐 | 多半只动元数据/权限,不动已落库的 ND1Rpt 行结构 |
控件回答的是:用户看见什么、点什么。
UIContralType服务端定义在 数据引擎/En/EnumLab.cs,前端有对应 TS 枚举;傻瓜设计器面板还会按业务再分组。
族 | 典型值 | 常量 | 说明 |
|---|---|---|---|
输入 | 0 | TB | 文本框(再由 MyDataType 分化成日期/金额/整数等) |
选择 | 1 / 2 / 3 | DDL / CheckBok / RadioBtn | 下拉、复选、单选 |
附件与手写 | 6 / 8 / 12 / 600 | AthShow / HandWriting / FrmImgAth / AthTable | 字段附件、签名、图片附件、附件表 |
展示 | 10 / 11 / 60 | Lab / FrmImg / BigText | 标签、图片、说明性大块 HTML |
流程与公文 | 14 / 15 / 17 / 110 / 50 / 200 | SignCheck / FlowBBS / DocWord / GovDocFile / JobSchedule / FlowRefLink | 签批、评论、文号、正文、进度、关联流程 |
其他 | 4 / 5 / 7 / 9 / 13 / 16 / 101 | MapPin / MicHot / MobilePhoto / HyperLink / IDCard / Location / Score | 定位、录音、拍照、链接、身份证、系统定位、评分 |
粗算:C# 命名常量约 26 种;前端/设计器面板再加按钮、色标等扩展后约 30+。产品上「能拖进画布的基础字段」不止枚举字面量——同一个 TB,配不同 MyDataType,就是不同输入体验。
类型 | 元数据 | 设计器分组(FormTypeMap) |
|---|---|---|
从表 Dtl | Sys_MapDtl | CtrlType='Dtl' → slave/table |
附件区 Ath | Sys_FrmAttachment | CtrlType='Ath' → appendix/table |
字段级附件 | MapAttr + AthShow(6) 等 | 仍是字段行 |
傻瓜设计器入口:
Vue3/.../FoolFormDesigner/props/form/FormComponents.tsCreateFieldFunctions.ts → 写 Sys_MapAttrcomponents/widgets/registry.ts右键字段属性不是一张万能表:EditPageMap 按 UIContralType 打开不同 EnMap(MapAttrString / MapAttrEnum / MapAttrSFTable / 评分 / 签批 / 公文…)。控件类型决定你能配哪些扩展入口——例如外键下拉才挂「级联 ActiveDDL」,文本框才挂「Pop / TBFullCtrl」。
误区 | 实际 |
|---|---|
「控件 = 界面皮肤」 | 控件行同时决定渲染组件和落库列语义 |
「从表也是一种 UIContralType」 | 从表是 MapDtl + GroupField,字段在从表自己的 MapAttr 里 |
「五种设计器五种控件库」 | 设计器换车间;控件元数据仍是 MapAttr 这一套(开发者/VSTO 是换呈现,不是另起字段体系) |
业务逻辑回答的是:改了 A,B 和 C 怎么办?
载体是 Sys_MapExt:挂在表单/字段上,用 ExtModel(及兼容字段 ExtType) 告诉运行时走哪条分支。CCForm 侧主解析在 OneMapAttr.vue(DealMapExtBySelect、NumberORDateChange 等);复杂 SQL/树数据进 Sys_GenerDBSrc。
常量清单见 MapExtXmlList(MapExtXml.cs),设计器向导见 GPN_ComponentMapExt.ts。
ActiveDDL / 级联选择器GPE_ActiveDDL;AttrOfOper 为驱动字段,AttrsOfActive 为被刷新字段。GetActionDLLData → 刷新下游 DDL。GPN_ComponentMapExt.CityDesc)。AutoFull / ReqDaysXiaoJi:自动建名称/单价/数量/小计四列,并写入:ExtModel = AutoFull
AttrOfOper = {前缀}Sum
Tag = @{前缀}Unit*@{前缀}NumReqDays:向导 DTFromToDD(页面占位名就是「请假日期」)创建从、到、天数字段,并挂 ExtModel=ReqDays。AutoFullDtlField 把明细列汇总回主表。产品提示词与 AI 工具里也沿用同一套表达式习惯:
@单价*@数量——逻辑写在元数据里,而不是散落在页面脚本。
Pop / PopFullCtrl / TBFullCtrlPopBranches / PopTreeEns)、分组列表(PopGroupList)、表格(PopTable)、自定义 URL(PopSelfUrl)等。ExtModel 为 Pop / TBFullCtrl / DDLFullCtrl 时走 GetFullData,再 ChangeParentAttr(..., 'FullData') 回填其它控件。ExtModel | 干什么 |
|---|---|
AutoFullDLL | 动态/过滤填充下拉选项 |
PageLoadFull / PageLoadFullMainTable / PageLoadFullDtl | 打开表单时预填 |
FullData / FullDataDtl | 填充其它控件或从表 |
RBAction / EnumHidItems | 单选/枚举联动显隐 |
BindFunction | 绑定 change/blur 等前端函数 |
RegularExpression / InputCheck | 校验 |
DateFieldInputRole | 日期输入约束(如禁止历史日) |
你想表达的业务 | 优先落点 |
|---|---|
A 变了 B 的选项要变 | ActiveDDL / 级联选择器 |
A、B 算出 C | AutoFull / ReqDays |
弹窗选一条,填一串字段 | Pop + FullData |
打开单子就带默认值 | PageLoadFull* |
选了「病假」才显示附件 | RBAction / 枚举显隐 |
高代码轨道另有 EnMapExt(useMapExtHandler.ts),语义相近(联动、自动计算、弹窗填充),配置面在实体 EnMap 上——与低代码 Sys_MapExt 同属 数据引擎 家族,配置入口不同。
用「请假」把三层钉死(对照演示包与组合向导):
# | 业务点 | 控件 | 数据 | 逻辑 |
|---|---|---|---|---|
1 | 请假日期从 | TB + 日期 | ND1Rpt 列 QingJiaRiQiCong | 可加 DateFieldInputRole |
2 | 请假到 + 天数 | 两日期 + 数值 TB | 三列 | ReqDays 自动算天 |
3 | 请假原因 | 大块文本 TB | 字符串列 | 可选 BindFunction 校验 |
4 | 所属部门 | DDL + 外键 | FK_Dept 等 | 可 ActiveDDL 到人员 |
5 | 请假类型 | 枚举 Radio/DDL | 枚举值列 | RBAction 控制证明材料显隐 |
6 | 代理人 | 文本 + Pop | 人员编号/名称 | PopTreeEns 回填 |
7 | 病假条 | 附件区 Ath | FrmAttachmentDB | 无计算,容器级数据 |
8 | (类比)明细小计 | 单价/数量/小计 | 三列金额/数值 | AutoFull:@Unit*@Num |
同一套三要素,换到合同/检验单只是字段更多、逻辑更密,不是另一套理论:合同用章节设计器排「章—节」,检验用 VSTO 扛公式——MapAttr / PTable / MapExt 仍然是三根柱子。
文档 | 回答的问题 |
|---|---|
本文 · 三要素 | 一张表单里面有什么(控件 / 数据 / 逻辑) |
三大范式 | 表单规则写在文件、数据库,还是实体规则里 |
五大设计器 | 用哪种车间把表单造出来(经典 / 开发者 / 章节 / VSTO / 手机) |
选型顺序建议:
Sys_MapAttr(外加 Dtl/Ath 容器);形态看 UIContralType,类型看 MyDataType,字典/外键看 LGType。MapData.PTable + 从表 RefPK + 附件 RefPKVal;逻辑表单 ID 可以多个,物理表可以共用。Sys_MapExt.ExtModel:级联、AutoFull、Pop/回填、装载填充、显隐与校验。本文依据当前仓库 数据引擎 与 Vue3 表单运行时静态整理;具体菜单文案与向导页以你部署的版本为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。