ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

致远OA表单维护实战:从表单设计到安全排查的完整指南

致远OA表单维护实战:从表单设计到安全排查的完整指南 接手公司致远OA系统维护之后我发现自己很大一部分日常工作量都围着“表单”打转。这个模块看着人畜无害无非就是填个流程、做个审批但等真的需要自己上手配置、排查问题、处理脏数据的时候才会意识到里面的门道比想象中多得多。今天这篇先梳理第一轮表单相关操作偏向基础侧适合刚接手致远OA维护、或者打算系统性整理表单体系的朋友。后续出二的时候再往下钻二开和进阶排错。我先把这次涉及的核心内容摆在前面表单引擎的入口理解、三种表单类型的选择逻辑、数据操作中的批量处理和导入导出、校验规则的落地写法以及一个容易踩的存储型XSS隐患排查。顺带把JavaScript表单提交和H5表单的差异也聊一下因为我发现很多人虽然在写脚本但根本没搞清楚这两套机制在OA里分别被用在什么位置。1. 表单引擎的入口与一套表单的完整生命周期1.1 表单设计器里最容易被忽视的基础配置致远OA的表单设计器位置不难找系统菜单路径一般是在“系统管理-表单管理-表单设计器”或者是“流程管理-表单管理”下不同版本叫法会有差异但核心功能一致。打开之后很多人第一反应就是拖控件、画界面但其实有几项配置决定了这个表单能不能被正确调用优先级甚至比界面布局还高。第一个是“表单Code”也就是表单编码。这个东西是表单在系统内的唯一标识流程绑定、数据权限、甚至第三方接口调用时全靠它。如果编码乱起后期做接口对接或者数据表关联会非常痛苦。我的习惯是统一用form_前缀加业务缩写比如form_leave_apply一眼就能看出是请假申请。写编码的时候也别用中文系统虽然部分版本允许但后续在数据库里查表名、写SQL都会很别扭。第二个是“数据表”设置。致远OA的表单分为两种情况一种是有独立物理表的一种是无物理表、纯流程数据的。设计器里系统一般会提示你需要确认是否单独生成数据表这个决定很关键。如果只是流程审批后续不需要做统计、不需要跨流程查询那就没必要生成独立物理表数据会存在流程实例里。但如果后续要写报表、做BI分析、或者多个流程公用一套数据建议一开始就生成独立表。很多管理员一开始怕麻烦不建表后期想加统计报表时才发现数据捞不出来只能被迫重建表单或者写复杂视图教训相当深刻。第三个是“附件上传”开关。这个我要单独说表单里挂附件是高频需求但附件控件的存储机制不同。有些版本附件是直接挂在表单数据里的有些是挂在流程附件区域的导出表单数据的时候前者能跟着结构化数据一起导出后者只能单独下载。如果你们有归档需求先确认清楚附件存储位置不然后期做电子归档会疯掉。1.2 从空白表单到正式上线我建议的落地顺序如果是第一次在致远OA里建一套表单别急着画界面按这个顺序来会顺很多先把业务流程画出来确定有多少个节点、每个节点需要录入哪些字段、哪些字段只读、哪些字段可改。再建表单草稿字段全部先摆上去先不调样式。字段与流程节点权限的匹配比界面好不好看重要得多。配置表单校验规则至少把必填、格式类校验做掉这个放到后面会容易漏字段。绑定流程确认每个节点对表单字段的编辑权限、可见权限。这一步出错的话流转到一半会出现“字段失踪”或者“无法编辑”这类怪问题。先在自己账号下跑一遍完整流程然后再拿测试账号跑一遍千万不要直接发布全员。发布后设置好版本表单版本管理在致远OA里是可以回溯的别随便覆盖历史版本。这套顺序看起来啰嗦但能省掉大量返工。我见过太多运维同事开始就调样式结果流程绑完之后发现漏字段又回去加加完还得把流程里已经流转完的老数据对齐极其痛苦。2. 三种主流表单类型的选择逻辑别一上来就用流程表单2.1 自定义表单、标准表单和流程表单的适用边界致远OA里的表单类型表面上都是“表单”实际上底层逻辑差异非常大。我按使用频率和业务场景拆一下表单类型核心特征适用场景典型痛点自定义表单无流程或挂简单流程数据独立存储信息收集、登记台账、投票、问卷权限模型较简单复杂审批绑不上标准表单系统预置的基础表单模板如请假、报销标准人事/行政流程快速起步字段改动受限定制不灵活流程表单表单与审批流强绑定表单随流程流转采购审批、合同审批、多级审核配置复杂一处改错全局受影响先说自定义表单。这种最灵活可以自己在设计器里拖字段设置分类、显示规则、关联数据。但它最大的问题是如果后续要挂审批流程流程节点是按“数据状态”或“流程步骤”来驱动权限的自定义表单如果一开始没预留流程绑定相关设置后面强行挂流程会出现节点权限识别不了字段的问题。所以如果你预判这套表迟早要上审批建议从一开始就按流程表单来设计不要抱着“先建表、后绑流”的想法。标准表单是致远OA开箱即用的模板覆盖了请假、加班、出差、用章、报销等常规场景。这类表单最大的价值是“省事”但坑也在这里。标准表单的很多字段是系统级字段比如“请假天数”的计算逻辑是系统写死的你想改成按小时计算改起来比重做一个表单还麻烦。所以标准表单适合“业务逻辑与系统默认一致”的场景一旦出现个性化业务规则尽早弃用。流程表单是我日常处理最多的类型。它的核心特点是表单内容随着流程节点动态变化——同一个字段在发起人那里可见可编辑到了审批人那里就变成只读到了会签人那里可能干脆不显示。这种权限控制非常细但配置复杂度也最高。设置节点字段权限的时候入口在“流程设置-节点属性-表单字段权限”里里面有“可见可编辑”“可见只读”“不可见”三档别漏配。2.2 表单与流程集成时的关键注意点流程表单绑定时有几个点容易踩第一流程启动方式。很多场景下流程不是主动发起的而是“数据触发的”比如表单里某个字段等于某值时自动启动一个审批流程。致远OA系统里这个能力一般通过“触发器”或“事件脚本”实现。我配置的时候会先确认目标流程的启动标识然后利用系统提供的脚本接口去触发。这里要注意触发脚本抛出异常时整个流程可能会卡住最好在脚本里做一层异常拦截保证意外情况不会直接中断业务。第二流程节点上的“字段锁定”。流程流转到某个节点时审批人只允许查看、不能修改记录。这个不能只依赖表单的只读属性因为致远OA的表单只读属性和流程节点权限是两套体系只改表单不改进程表单照样可能被人改了。操作习惯上我在完成表单配置后一定会逐节点核对“表单权限”里每个字段的状态。第三多人节点上的“并发编辑”。一个节点多个人同时审批同一个流程如果有人修改了表单内容另一个人看到的是旧内容还是新内容取决于系统版本和缓存设置。我遇到过的旧版本是直接读取流程实例里的表单快照这种情况下后提交的人会直接覆盖先提交的人的内容。解决方法是尽量设置节点对应的“可编辑表单字段”只对第一处理人开放或者干脆把该节点表单整体设为只读。3. 表单数据实操从批量处理到导入导出再到清空内容3.1 批量修改表单数据一个安全又高效的操作路径表单跑了一段时间业务部门提需求说“历史数据要批量改字段”这活儿看着简单实际翻车率极高。我处理时不是直接在业务界面里一条条改而是在致远OA自带的“数据维护”或者“数据管理”模块里做的。具体路径一般是系统管理-数据管理-表单数据维护然后选择目标表单按条件过滤出需要调整的数据。系统会让你选择修改哪些字段填入统一的新值或者通过脚本表达式处理。比如需要把老数据里的“部门”字段从旧部门名称替换为新部门名称直接在字段值的表达式里写替换逻辑就行。但这里我要特别强调一个点修改前一定要备份。虽然系统有操作日志但日志只记录谁在什么时候改了什么不会帮你回滚到修改前快照。我现在的习惯是在做任何批量修改前先利用表单自带的导出功能导一份原数据留存再把导出文件按照批次编号存好。这步操作十分钟都花不到但真出问题的时候能救命。批量修改脚本如果涉及到公式重算比如改了单价总价要跟着变注意系统是否会默认重算固化字段。有些版本里总价一旦审批过就会固化重新计算需要在脚本里显式调用计算函数不然会出现单价变了、总价纹丝不动的诡异现象。3.2 Excel导入导出最容易翻车的几个地方表单数据的Excel导入导出算是我“表单操作记录”里被问得最多的一块了。导出通常没什么问题直接选择表单数据Excel导出即可。真正坑的是导入尤其是第一次做增量导入的时候。导入常见翻车点有三个模板表头必须严格一致。很多同事从导出文件里改了几个值就想导回去但忽略了必填字段里包含“系统编码”这类隐藏列导回来时编码为空系统直接拒绝导入。解决办法是在导入模板说明里确认哪些列是必填的Excel加载后先扫一遍必填列是否都非空。日期格式。致远OA默认读取Excel里的日期格式是yyyy-MM-dd HH:mm:ss如果你在Excel里手动写了2024年5月1日这种格式系统大概率识别不了。导入前必须统一用文本型日期格式或者在导入映射里指定日期格式。数据重复。有没有唯一性约束完全取决于表单设计时有没有设置“字段唯一校验”。如果没设置导入了两条重复数据不会报错但后续流程关联时就会出现一对多。我的建议是在表单设计阶段凡是“单号、合同号、员工号”这类应该有唯一性的字段务必在“字段属性-唯一性”里勾上。导入前最好先小批量试导三到五条不要一上来就导几千条。别问我是怎么知道的——有一次直接导入两万行数据全进去了但发现某个映射字段搞错了结局就是又写了个脚本批量纠正前前后后折腾了一整晚。3.3 清空表单内容的正确姿势“清空表单内容”这个需求出现得比想象中频繁业务部门说“我们这些测试数据不要了你帮我清一下”。这里要分清两种清空一种是设计阶段清空设计器里的缓存字段。表单设计器操作时偶尔会出现你明明删掉了一个字段但预览还是能看到。这通常是浏览器缓存或者版本发布缓存的问题。处理方式是先发布一次新版本再强刷浏览器CtrlF5问题基本就能解决。另一种是清空某张表里的存量业务数据。我的建议是绝对不要直接进数据库删表即使你拥有数据库权限。正确路径是在系统后台的数据管理模块找到对应表单按条件筛选后执行删除操作。如果数据量很大系统可能会超时这时需要分批删除比如按创建时间分段删除每次控制在500条以内。删除前还是在系统里做一次完整导出备份。提示数据删除操作不可恢复。即使备份了Excel重新导入后的数据ID也会发生变化流程关联关系大概率会断掉。所以清空数据前务必和业务方确认“这些数据确实不要了”最好留存确认消息记录。4. 表单校验规则与脚本设计从必填到动态联动4.1 内置校验规则的使用边界致远OA表单设计器里附带了基础的校验规则包括必填、长度限制、数值范围等这些内置规则适合简单场景。但如果你用过宜搭、若依这类平台再回来看致远OA的校验会明显感觉“够用但不够聪明”。内置校验的边界主要体现在它只能对单个字段做条件判断跨字段联动校验几乎做不了。比如“申请金额大于5000时必须有主管审批备注”这种规则内置校验实现不了。这种时候就得靠脚本校验。4.2 动态执行脚本在表单里挂一段可复用的逻辑致远OA的“表单脚本”功能可以在表单加载、字段变更、表单提交等时机执行自定义JavaScript。这就是它被搜索热词“若依 表单设计器动态执行脚本”反复提及的同类能力——平台允许你在表单设计器里直接写脚本回调到数据校验和字段联动。举个例子一个费用申请表单希望“费用类型”选择“差旅费”时自动带出“出差地点”输入框选择“业务招待费”时自动带出“招待对象输入框”。这个联动在致远OA里就是标准的脚本场景。写法思路大概如下先在字段属性里给“费用类型”注册一个Change事件。然后写一段JavaScript通过业界常见的DOM遍历方式找到目标div块根据当前选中值去控制显隐。实际开发中我更喜欢给控件设置固定的ID前缀或class标记这样脚本查询目标会更稳定避免因页面渲染层级变化导致查不到元素。脚本写的时候还要注意一个版本问题有的老版本浏览器或OA客户端容器不兼容ES6建议写法尽量用ES5或者打包转译后再贴进去不然实际跑的时候会报语法错又不太好排查。4.3 手机号验证这类高频校验怎么写“宜搭表单手机号验证”“php语言之表单基础”这些热词背后反映的是大家在不同平台上的同一类困惑手机号这类格式数据到底怎么校验。在致远OA表单里手机号校验比较稳妥的方式是在“自定义校验规则”里写正则。目前国内手机号一般用^1[3-9]\d{9}$来校验兼容了基础的号段情况。如果你要考虑带座机就另写一个规则做联合判断。值得说的一点是前端脚本校验只是辅助真正可靠的校验逻辑仍然要在服务端保留一份。这句话不是口头工整而是我自己踩过坑之后总结出来的前端脚本很容易被绕过如果表单接入的通道不是只有OA页面还有移动端、接口推送那前端的正则写得再漂亮也没用必须靠服务端脚本或后端判断来兜底。致远OA里可以通过在保存节点做服务端校验拦截不符合规则的数据。5. 表单安全一个存储型XSS的排查实录5.1 事故描述与初步定位有一天业务反馈某张申请表里填了一段文字说明审批人打开表单的时候页面上弹出了一个奇怪的alert框。立刻意识到这是典型的存储型XSS——恶意脚本被当成表单内容存进了数据库其他人打开表单时脚本被执行。就这个场景先说下存储型XSS在OA系统里危险在哪OA系统通常挂在内部网络但同样面对员工提交数据不可控的问题。如果有人在表单备注里写入scriptalert(document.cookie)/script之类的内容系统如果没有转义输出那每一个打开这条数据的人浏览器都会执行这个脚本。更恶劣一点脚本还能把当前用户的信息发到外部比如模拟退登、钓鱼页面跳转都是可实现的。5.2 排查链路为什么脚本能被存进去还能被执行这里的完整排查链我拆成四段第一段确认脚本是否原样入库。在数据管理后台直接把这条记录导出或查看原文结果发现字段内容里确实有完整的script标签原文一点没转义。第二段检查列表页是否渲染了HTML。致远OA有的列表控件是支持富文本渲染的如果字段类型配置成富文本系统会按HTML解析那script标签就可能被直接执行。我们这条记录的“说明”字段里配置的是“多行文本”正常逻辑是不该渲染HTML标签的。第三段追查输出端转义逻辑。最后发现支持标记语言富文本的字段在列表页、详情页会走HTML渲染通道而老版本为了兼容一些用户贴图文内容的需求在HTML过滤器里默认放行script标签的一部分操作。也就是过滤逻辑存在白名单漏洞。第四段验证修复。我们采取的方案是全局更新过滤规则把所有非富文本字段强制转义输出对富文本字段启用系统自带的危险标签过滤功能。修复后重放之前的POC脚本在详情页和列表页均不再执行。注意XSS问题在表单领域是个老生常谈但架不住仍然有系统默认配置存在风险。新接手OA系统建议第一时间检查的内容就是——所有“多行文本”字段是否允许富文本如果允许务必确认系统已开启输出过滤。测试手法也简单在某条测试数据里提交一段scriptalert(1)/script看保存后再打开是否弹窗。弹窗了就说明当前环境是有洞的需要赶紧处理。5.3 顺带聊聊JavaScript表单提交和H5表单的区别排查这个XSS的时候我顺便查了一下项目里引用的前端提交方式发现有些人分不清楚JavaScript表单提交和H5表单提交在OA二开时写混了。简单说H5表单提交指的是HTML5原生新增的form交互能力比如required属性、pattern属性、typeemail这种浏览器自带校验。它纯粹依赖浏览器解析不需要额外脚本。但浏览器校验也只在前端层面生效且不同浏览器对原生校验提示的样式和时机有差异。JavaScript表单提交则是通过JS代码控制校验逻辑再调用form.submit()或AJAX异步提交。优势是完全可控、兼容性好、随时可以接入额外业务逻辑比如校验完手机号再去请求一次接口确认是否在黑名单里H5原生做不到这类联动。在致远OA表单脚本里绝大多数场景都应该用JavaScript方式来控制提交。因为H5表单校验如果校验失败浏览器会阻止表单提交事件这个行为会导致OA自带的保存流程不受控甚至出现“点了保存没反应”的假象。我遇到过一次最后定位到是老页面里包含了input required某个老浏览器版本对required校验的逻辑异常表单一直无法提交。改成JS校验后问题立刻消失。6. 表单维护中的常见报错与排查顺序6.1 表单数据在列表里不显示的排查顺序表单数据在流程里流转正常但管理员在数据管理列表里查不到。这种问题优先级很高但排查方向其实就那几个按顺序来就好先确认查询条件有没有选错表单。有人说这不是废话吗但实际工作中真的有多次选了相似名称的另一个表单。确认数据是否存在表单数据集里还是挂在流程实例里。如果没有独立物理表数据管理模块默认查的可能是表单数据表跨表单查询不到。检查数据权限范围。管理员账号如果被限制在某一个部门/组织节点下那默认只能看到该范围内的数据。有时候列表被“数据权限”过滤得干干净净不是没数据而是权限不匹配。核对表单的“启用状态”。表单被停用后历史数据默认不会出现在普通查询列表里需要在查询条件里勾选“包含停用表单数据”。6.2 表单内容被莫名清空的可能原因“用户填好的表单第二天打开发现内容空了”这种工单容易被理解为系统bug但多数情况其实有固定解释。第一种原因是浏览器本地草稿机制。致远OA部分版本前端会在用户输入时把内容暂存到浏览器localStorage如果用户在未提交前清理了浏览器缓存或者浏览器崩溃草稿内容就没了。遇到这种反馈我一般先问“是否有刷新或换设备操作”对方多半就明白了。第二种原因是流程节点重新分配导致表单重新初始化。部分流程在“转办”或者“退回重填”时会把表单刷新成某个历史版本的数据快照如果填表人没有注意当前是退回分支就会看到内容像是被清空。这种情况其实不是清空是表单回到了旧版本快照。第三种原因才是真bug多级审批时前一个节点改了字段后一个节点的字段权限设置为“强制隐藏”导致数据展示层读取不到。这种本质上不是数据被清空了是“显示”清空了。排查时查下数据库里的字段值是否还在如果在就是渲染层问题。6.3 表单改动后流程不生效的处理改动了一个字段标签或脚本然后发起流程时发现还是旧界面。八成是表单版本没发布成功。致远OA的表单流程绑定关系在表单设计器里改了之后还需要到流程设置中重新“重新加载表单版本”。如果不做这步流程继续沿用发布前的表单版本。操作路径一般在流程管理-流程设置-找到对应流程-表单设置-重新选择表单版本并保存。更新完之后建议先废弃旧流程实例再发起新流程验证一遍。我在这个过程里遇到过因为“流程分类”有多级缓存改了不生效的情况最后把服务器上的流程缓存清理项也处理一遍才彻底正常。写到这里的几句真心话表单这个东西在致远OA里看着只是个“录入页面”但往深处走牵涉到流程引擎、数据存储、前端脚本、服务端校验和安全过滤一环扣一环。我接手以来最大的体会就是所有稳定的表单操作习惯最后都归结到“动手前先备份配置前先理清流程上线前先全链路测试”。这三句话看着土但每条都是拿加班换来的。这篇是第一辑主要覆盖了表单设计的基础概念、类型选择、数据导入导出、校验规则脚本和XSS安全排查。后面有机会再更新第二篇重点结合表单脚本二开和移动端适配继续写。现在如果你手头有卡住的表单问题不妨先按文章里的排查顺序过一遍大概率能解决一大半。
返回列表