企业级 Web 界面模式:菜单、权限与重载表格
ERP 界面不是落地页。用户一天在它面前坐八小时,靠肌肉记忆导航,用"两千行的库存台账滚动卡不卡"来评判整个系统。企业级 Web 界面的大部分工作量集中在三个问题上:权限驱动的菜单、承载真实数据量的表格、不能丢工作的表单。逐个说我们的做法。
菜单:由权限生成,而非硬编码
在有角色权限的 ERP 里,菜单树就是权限模型的可视化。在前端硬编码菜单项,等于保证有人在加角色的第一天制造漂移。正确做法:
- 菜单树归后端所有。每个菜单项映射一个权限码;前端只渲染用户权限集返回的内容。
- 禁用的就直接隐藏。用户打不开的菜单项根本不渲染。靠隐藏做安全不是安全,但一屏灰掉的禁用项是噪音;真正的 enforcement 在路由守卫。
- 收藏和最近访问放客户端。让老用户把每天用的五个屏钉在顶部——成本为零,每天省好几分钟。
树要浅——三级是用户不迷路的实际极限。如果模块需要更深,用标签页或页内二级导航,不要把树挖得更深。这镜像了模块化单体的模块结构:每个后端模块对应一条路由子树。
重载表格:虚拟化不是可选项
企业表格随便就是几百列、几万行。DOM 节点是敌人:
- 行虚拟化——只渲染可视窗口加一小段 overscan 缓冲。手写还是上库随意,这是单项最大的收益。
- 宽网格做列虚拟化——四十列以上的财务台账横向虚拟化同样有收益。
- 分页仍然正当——对操作型列表,50–200 条一页加服务端排序过滤,常常比无限虚拟滚动体验更好、内存更省。
- 粘性表头与冻结首列——实现便宜,扫宽台账时的可用性收益不成比例地大。
- 列显示/隐藏与布局保存——让每个用户自己裁剪网格;按用户、按界面持久化。
用真实数据测量再优化:一张"500 行就卡"的表格,问题通常是单元格渲染(组件没 memo、每格格式化太贵),而不是缺虚拟化。
主从界面与脏状态保护
ERP 的驮马屏幕是主从结构:上面或左边是订单列表,选中行的明细在下面或右边。两条规则让它不疯:
- 一屏一个脏表单。用户编辑了未保存的单据又点了另一行,弹对话框拦截:"放弃修改 / 保存 / 取消"。一次误点击丢一张改了一半的订单,是那种用户永远不原谅的 bug——把它实现成路由级守卫,键盘导航也绕不过。
- 草稿自动保存。长单据每分钟或失焦时把草稿存到服务端。角落里一个"已保存 14:32",把焦虑变成信任。
一致性胜过新奇
企业用户不想要惊喜,想要"不意外"。锁定一套小组件词汇表——一个表格组件、一种表单布局、一种对话框样式、一种日期和数字格式(按 locale)——让所有界面都从这套东西里长出来。审批中心、MRP 例外清单和电商集成的监控大屏,应该感觉上是同一个应用,因为它们就是。前端一致性是后端边界纪律在 UI 层的投影:底下是同一个工作流引擎,上面是同一套模式。
结语
菜单来自权限、表格做虚拟化、表单永不丢工作、组件词汇表小到能背下来。没有一条光鲜,但正是这些让 Web 版 ERP 用起来像工具而不是障碍。这四件事做到位,界面就不再是用户第一个抱怨的东西。