Appearance
流程系统前端结构说明
本文对流程系统前端的主要功能模块、技术栈及核心逻辑进行拆解说明,用于快速理解系统整体架构与运行机制。
主功能
查询模块
系统主页主要提供基础数据查询能力。
本质上属于标准的 数据库 CRUD(增删改查)功能,用于展示及管理系统中的流程相关数据。
该模块结构相对简单,以列表查询、筛选及基础操作为主。
相关配置
用于维护流程运行过程中所依赖的基础配置数据,例如:
- 角色配置
- 权限配置
- 定时任务
- 条件配置
这些配置本质上是为流程节点提供可复用的 预设配置集合。
从前端实现角度来看,这一类页面结构基本一致:
- 表单查询
- 列表展示
- 数据库增删改查
整体属于 标准后台管理页面模式。
编辑版本
用于维护流程的 版本管理体系。
该模块主要从三个维度管理流程:
- 流程版本
- 流程状态
- 角色权限
三者共同决定一个流程版本的可用状态与可操作权限。
由于不同配置维度对应的 操作按钮与交互逻辑不同,系统通过维护一份 JSON 配置文件,统一定义各类操作按钮及其行为映射,从而避免在页面中写死逻辑,提高可维护性。
编辑流程
该模块是整个流程平台复杂度最高的部分。
核心能力为 流程图可视化编辑器,用户可以通过图形化方式配置流程节点与节点之间的流转关系。
技术实现上,编辑器基于 AntV X6 图编辑引擎 进行二次封装,并结合系统业务逻辑进行扩展。
流程系统详解
技术栈
系统主要技术栈如下:
- React
用于构建整体前端应用框架。 - Redux
用于全局状态管理,负责跨组件共享数据及流程上下文状态维护。 - AntV X6
图编辑引擎,用于构建流程图编辑器,并进行了业务层二次封装。 - 低代码表单平台
用于节点内部表单配置,实现流程节点表单的动态化生成。
代码逻辑链路
流程系统在运行过程中,大致可以分为三个阶段:
- 初始化阶段
- 编辑阶段
- 运行阶段
1. 初始化阶段
系统加载流程时会执行一系列初始化操作。
内容校验
当从接口获取原始 JSON 数据后,需要进行两层校验:
- 格式校验
如果流程 JSON 结构不符合规范,则直接提示用户提交工单,由开发人员进行排查。
- 版本校验
如果流程版本与当前系统版本不匹配,则提示用户升级流程版本。
在版本不兼容情况下,系统仅允许用户 只读查看。
系统引擎初始化
校验完成后,数据会被传递给 流程引擎。
流程引擎负责将原始 JSON 数据转换为 UI 层可渲染的节点结构,并生成图编辑器所需的数据模型。
数据预处理
在初始化阶段,还会加载并缓存一些高频使用的数据,例如:
- 用户权限
- 常用配置列表
- 节点相关上下文数据
由于部分节点配置会依赖整体流程上下文,因此需要在此阶段进行统一处理并缓存。
2. 编辑阶段
在流程编辑过程中,系统主要围绕以下几个方面进行管理。
显示状态管理
根据当前用户权限,系统会控制页面元素的状态:
- 只读显示
- 可编辑状态
不同权限用户所能进行的操作不同。
保存机制
系统采用分层保存策略:
- 流程整体信息(UI结构、节点关系等)
实时保存 - 节点内部表单数据
通过按钮手动保存
这样可以在保证数据安全的同时,减少不必要的接口请求。
错误提示机制
当用户操作导致流程结构异常时,系统会提供可视化提示:
- 黄色警告
表示某些节点配置失效,并会定位到具体节点。
- 红色警告
表示流程结构无法形成完整闭环,流程逻辑存在严重错误。
数据联动更新
当节点顺序发生变化时,可能会影响后续节点的表单配置。
系统需要实时检测这种依赖关系,并及时更新相关节点数据,以保证流程配置的正确性。
3. 运行阶段
在流程实际运行时,系统根据以下信息进行展示:
- 当前流程配置
- 当前节点状态
- 当前用户角色
系统会在对应节点展示:
- 历史填写信息
- 当前用户可执行的操作按钮
- 流程流转状态
从而完成整个流程的业务执行。
难点解析
1. 数据流转链路与生命周期管理
这是整个项目的基础。
流程系统涉及大量状态数据,包括:
- 流程结构数据
- 节点配置数据
- 用户输入数据
- 全局缓存数据
如果开发者不熟悉 数据流转路径与生命周期,在维护过程中很容易:
- 重复实现已有逻辑
- 在错误的阶段修改状态
- 产生隐性 Bug
该部分难度属于 中等,主要难点不在算法,而在:
- 代码体量较大
- 状态层级复杂
- 生命周期较多
开发效率很大程度依赖开发者对项目结构的熟悉程度。
随着 智能代码工具 + IDE 的辅助,这部分理解成本已经有所降低。
2. 版本更新算法
随着项目迭代,流程数据结构会不断演进。
为了兼容历史流程数据,需要维护一套 数据结构升级算法,用于在加载流程时自动完成数据迁移。
其核心工作包括:
- 旧版本数据结构解析
- 新结构字段补全
- 不兼容字段转换
在实现上通常采用 管道式(Pipe)更新机制:
旧版本数据
↓
版本1升级函数
↓
版本2升级函数
↓
版本3升级函数
↓
当前版本数据
这种方式可以保证:
- 每个版本升级逻辑独立
- 历史数据能够逐步升级
- 系统可维护性更高
该部分难度同样属于 中等,主要考验开发者:
- 数据结构设计能力
- 算法组织能力
- 代码的可维护性
整体逻辑本身并不复杂,但需要严谨实现。