1. 先想清楚:这一页到底该装什么,不该装什么
这几年我接过不少 Fiori 相关的交付,最频繁听到的需求几乎长一个样:“我们能不能做一个页面,把订单、库存、发货、对账全放到一起,打开就能看到今天有没有出事。”乍一听很像普通列表或者看板,但真去落地的时候,才发现列表页一个数据源撑到底根本组合不起来;真正能用到的,是 SAP Fiori Overview Page 这套以卡片为最小单元的页面模式,再加上 UI Adaptation 来做页面级的个性化适配。
先把结论放在前面:Overview Page(下面统称 OVP)本质上不是一个“能塞多少东西进去”的页面,而是一个“如何让彼此独立的多块业务信息,在同一页里互不打扰地工作”的页面框架。UI Adaptation 则是这个框架里成本最低的调整手段——它不需要你去改 CDS 视图、不需要动前端控制器,用户拖一拖、勾一勾、保存一下,页面结构就按他们团队习惯固定下来了。
这个内容适合谁看?如果你手里正有一个基于 Fiori Elements 的项目,或者你正在评估把几个高频业务查询合并成一屏的可行性,又或者你是负责给业务顾问/Key User 培训“页面怎么自己改”的人,这篇文章都值得看完。我会把 OVP 的适用边界、UI Adaptation 的底层机制、可落地的操作步骤,以及我实际交付中踩过的一组现场坑,从头到尾讲清楚。
1.1 从列表页到聚合页:一个页面模式是被需求逼出来的
理解 OVP 之前,先回顾一下 Fiori 常见页面长什么样。列表报表(List Report)也好、Analytical List Page 也好,它们的交互主线都是“一个数据集合——筛选——进入明细”。这种页面有一个隐含前提:用户心里已经知道他要看什么,进来之后做查询动作。
但运营管理岗不是这样工作的。一个车间主任早晨打开系统,他先要快速判断的是“今天有没有异常”,而不是“我要查询某个订单”。他可能需要同时看到:今天有多少订单逾期、库存低于安全线的物料有哪些、在途物流有没有延迟、质检有几个批次被扣留。这些数据来自完全不同的业务对象和服务,强行做在一张列表里只会产生一张巨大且没人能看懂的界面,这不是设计问题,是数据模型层面就不该捏在一起。
OVP 把这个问题拆成了另一条路:页面不承载业务对象的完整操作,只承载“卡片”。每张卡片各管一个业务视角,卡片和卡片之间不需要强关联,它们共享一个页面顶部的筛选条件,但各自可以有自己的内部筛选和跳转目标。这样,业务复杂性被卡片天然隔离了,一个页面从“一个巨大的表格”变成“一组彼此独立但有叙事顺序的信息块”。
1.2 卡片是“分而治之”的容器,不是装饰品
做 OVP 设计时最常见的误区,是把卡片当成传统的 dashboard 组件,觉得图表放得越多越好。实际跑过一版你就会明白,卡片的价值在于它强制你给每块信息划定边界:这张卡片负责展示什么指标、哪些字段是必须露出来的、哪些只作为跳转明细的入口、刷新频率怎么控制。
这种边界约束听起来像限制,实际上是救命稻草。一个页面里如果同时出现表格卡片、分析卡片和数量卡片,它们的数据源、后端服务、加载时机都是独立的,页面不会因为一块数据慢而被整体拖死。而且卡片有明确的尺寸规格,同一页里大卡片放核心指标,小卡片放次要信息,视觉层级是天然清晰,不需要 UI 设计再额外反复调整布局。
在我侧后文讲 UI Adaptation 的时候,你会看到这套“卡片即容器”的设计正是适配功能能成立的关键——因为每块信息都是独立单元,用户才可以自由地调整它们的位置、大小和可见性,而不用担心中间的数据耦合被改断。
1.3 什么场景别硬用 OVP:边界比能力更重要
不是所有复杂业务都适合 OVP。如果你需要的不是一个“信息总览”,而是一个“流程操作站”,比如要连续修改一张单据的多个行项目,或者要做多步骤向导式录入,那 OVP 就不合适,因为卡片的交互能力上限就是展示+跳转+轻量操作,指望它承载复杂前端逻辑会非常别扭。
另外一类要警惕的场景是强联动分析。如果业务方要求“点这块图表,那块表格立刻跟着过滤”,卡片之间的联动在标准 OVP 里并没有一个低成本方案搞定,非要去实现只能上自定义卡片加控制器扩展,开发和测试成本一下就上去了。
我的经验是,拿到需求先问三个问题:用户打开这个页面是为了“看”还是为了“做”?如果是看,信息是否需要来自多个业务对象?这些业务对象是否有独立的操作入口?三个全是肯定答案,OVP 才值得上;只要有一个偏“做”,就得重新考虑交互载体。
2. UI Adaptation 在改什么:页面变体与卡片渲染的底层逻辑
很多人第一次接触 UI Adaptation 会觉得它很“玄”:页面跑得好好的,点一下右上角设置,页面就进入一个可以拖拖拽拽的编辑状态,保存后整个团队的页面布局都变了。这感觉很像是在调一个网页设计器,但背后的机制完全不是前端在设计器里改模板,而是一套运行时的“配置覆盖层”。
搞清楚这层逻辑,你做适配时才不会出现“明明保存了,换个人打开怎么还是老样子”这种现场翻车事故。所以我先花一整章讲原理,不直接给步骤。
2.1 一次“配置”背后到底发生了什么
先说结论:UI Adaptation 保存的不是代码,也不是页面本身,而是一个描述“页面该怎么改变”的变体配置体。
以一次典型的适配操作为例,你在卡片右上角把一张表格卡片的两个字段列调整了顺序,或者把某张卡片从页面中间拖到了页面右侧,点击保存后,前端会做这样几件事:
- 采集你在当前页面所做的全部界面操作,转成标准结构描述(通常是一段配置数据,包含卡片 ID、旧位置/新位置、显隐状态之类);
- 把这些描述数据发送给后端适配器存储接口,写入与本页面关联的变体存储;
- 页面继续用原始渲染逻辑加载,但在渲染到具体卡片时,优先读这份变体配置,按覆盖后的结果显示。
这意味着,原始页面始终还是原始页面,配置只是“盖”在它上面的一层滤镜。这样有一大好处:某个 Key User 把页面改坏了,只需要删除或重置对应变体,原始页面瞬间恢复,不会影响代码质量,也不需要重新发布前端。
注意:不同发行版本里,适配存储的具体实现和后台表名不一样,但“配置与代码解耦”的模型是通用的。这地方值得在项目初期就确认清楚,特别是上云或者跨版本升级的时候。
2.2 页面变体的生命周期:个人变体、全局变体与谁来决定
UI Adaptation 的修改默认只对操作者自己可见,这本身是一个“个人变体”。但它真正的价值是把团队的操作习惯固化下来,所以需要把个人变体“发布”出去,变成对指定角色或所有用户生效的全局变体。
在我项目里,这个流程通常是这样设计的:
业务顾问先在配置环境里把一张 OVP 页面按业务规范调整好(显隐哪些卡片、卡片排成什么顺序、默认哪些字段展示),保存成变体,再通过页面的变体管理功能发布给指定角色。之后该角色成员打开同一张页面,看到的默认布局就是发布后的版本;如果他们自己有偏好,依然可以在自己的个人变体里继续调整,互不覆盖。
权限上要区分两种角色:能“使用变体”的普通用户,和能“创建并发布变体”的 Key User。后者的权限如果没配好,最常见的现象就是前文说的——按钮看得到,点进去却报错或者无反应。这个我在第 5 章会专门给出排查链路。
2.3 不写代码也能改页面的前提:Fiori Elements 的“声明式结构”
理解了配置覆盖层,你还会追问一个更底层的问题:凭什么拖拖拽拽就能改变页面?这里的功臣是 Fiori Elements 的声明式渲染模型。
Fiori Elements 页面不是像传统前端那样一行行硬编码出来,而是由后端元数据驱动:CDS 视图通过注解声明“哪里是头部字段、哪里是表格列、哪块区域是一张分析卡片”,前端框架按注解组装出页面。OVP 更是把这种组装发挥到极致——页面级结构、卡片级元数据全部描述化。
因为这个原因,页面对“结构改变”这件事天然是开放的。UI Adaptation 做的事情不过是读到了这份结构清单,允许你在清单上做重排和显隐标记,再把新标记写回配置层。就好比同样是搭乐高,普通页面是一块块固定死的墙,Fiori Elements 是一盒能反复重组的积木,UI Adaptation 则是你手上那张改了搭法的图纸。
2.4 破除迷思:Adaptation 能做的和不能做的
实际交付中,业务方经常把 UI Adaptation 当成“万能修改器”,这往往导致项目后期需求膨胀,所以我建议在项目一开始就把边界讲清楚。
能做的事包括:调整卡片在页面中的位置和尺寸,调整卡片标题的显示,显示或隐藏卡片,表格卡片里列的显隐与顺序,分析卡片的图表类型切换,卡片与明细跳转链接的调整,以及页面的默认筛选可见性。
不能做的事包括:给一张卡片凭空增加一个数据模型里不存在的字段,改变卡片数据源的过滤逻辑(除非投入开发扩展),在卡片内部加入全新交互组件,以及改变跨卡片的联动行为。
总之一句话:UI Adaptation 是页面现有能力的调度器,不是内容创造器。听明白这句,后面做卡片的“幕后接线”(第 4 章的 Annotation),你就知道哪些事是需要交给开发去做的。
3. 一次完整的适配实操:从进入 Adapt 模式到发布全局变体
原理讲完,上实操。我按一次真实交付里的标准动作来拆解,尽量做到你拿着这套步骤能在你自己的环境里走通。当然,不同项目的前端版本、后端网关配置会有细微差别,我会把容易出问题的地方都标出来。
3.1 准备清单:先别急着拖卡片,确认这几件事
进入适配模式之前,先按清单过一遍,能省掉后面大量排查时间。
- 你是 Key User 角色,或有被授予 UI Adaptation 的使用权限;
- 当前环境里 OVP 页面本身已经正常打开,卡片数据能加载;
- 浏览器访问的是 Fiori Launchpad(FLP)环境,而非无壳单页访问;
- 确认你对当前页面的访问方式,是通过某个 App(语义对象+动作)还是直接页面路由进入,这会影响变体归属的判断;
- 明确这个页面有没有被发布过限制性的全局变体,如果有,要先在配置环境调整,而不是在用户环境硬改。
这些里最容易遗漏的是最后一项。我曾经在一个交付项目里帮忙排查了很久“有个用户改了布局,其他用户看不到”,最后发现该页面在客户环境上线前就被初始发布过一个“全字段显示”的全局变体,业务顾问改的个人内容被全局变体优先级压住了。所以做适配前,先查清变体现状再动手,是职业习惯。
3.2 实操一:进入 UI Adaptation 模式并完成一次卡片拖拽
步骤非常简单,难的是理解页面状态。
- 打开目标 OVP 页面,点击页面右上角的用户设置或“更多操作”入口,选择“UI Adaptation”或“Adapt”相关的菜单项,页面会进入适配编辑态——此时页面外围会出现编辑框,卡片右上角会出现操作菜单,有些版本还会在卡片顶部出现拖拽手柄。
- 找到你想移动的卡片,按住卡片标题区域的拖拽控件,拖到目标位置。拖动过程中页面会用占位框提示新位置是否合法,比如是否跨过了卡片所在的分栏边界。
- 拖动完成后,先不要急于退出。直接点击页面顶部的保存按钮,将该操作写入当前个人变体。
- 保存后,点击退出适配模式,回到正常的查看态。确认卡片已经停留在新位置。
这里有个很不起眼但高频踩坑的点:有些版本里,卡片尺寸调整不是全靠拖拽,而是要在适配模式下点击卡片右上角的设置图标,通过菜单里的“调整大小”选项选定 Small/Medium/Large。如果业务反馈“卡片只能整块移动、没法变大变小”,先确认你操作的是不是图标菜单,而不是硬拖卡片边缘。
3.3 实操二:表格卡片里字段的显隐、重排与固定列
OVP 里最常见的卡片类型是表格卡片——它本质上是一张内嵌的表格列表,显示的是某个实体集合的高优先级列。适配模式下,你可以像配置普通表格变体一样调整它。
具体操作:点击卡片编辑菜单里的“设置”,进入卡片配置表;在字段栏里解除不必要列的勾选、并把需要的列按优先级排序;如果某一列信息很关键,希望横向滚动时始终看到,可以勾选固定列选项。
这里值得展开说一下“哪些列该保留”的经验:卡片不是明细页,它的列应当经过克制筛选,默认只保留 5 到 8 列,并且首列尽量是能明确点击进入明细的对象标识,比如订单号、物料号。很多业务顾问适配时嫌字段不够,把十几列全勾上,结果卡片在小尺寸下连首列都显示不全,反倒要横向拖半天。我在现场的经验是:“一个卡片看三行,消息即价值”——列少一点,用户扫一眼能判断业务健康度,这才是总览页的意义。
3.4 实操三:卡片标题、明细跳转与页面筛选的统一管理
除了表格字段,OVP 卡片还有一批可调整的“皮囊级属性”,它们虽然简单,但对最终体验影响很大。
- 卡片标题:确保标题就是业务用户的口头叫法,比如“发货延误清单”而不是底层表名。适配模式下直接修改标题文本,保存即生效。
- 明细跳转:标准 OVP 卡片能配置点击记录后的目标应用。比如在“库存预警卡片”里点一条物料,进入对应的物料凭证 App。跳转配置通常维护在卡片的“目标实体”或语义对象定义里,但不同版本入口差异较大,如果找不到,先回业务侧确认语义对象是否已映射目标应用。
- 页面顶部筛选:OVP 页面通常有全局筛选栏,同一筛选条件理论上会传递给能响应它的卡片。在适配模式下可以调整筛选的默认展开项。注意:不是每张卡片都会响应全局筛选,这个机制我在第 4 章讲注解时会具体说。
3.5 发布:把个人变体变成团队默认布局
所有针对性的调整保存之后,最后一步是把个人变体发布为全局可见。操作路径一般在这个页面的变体管理里:找到你保存的个人变体,点击发布/保存为全局变体;发布时选择目标角色和用户组。一旦发布成功,目标用户打开页面,默认看到的是这份全局变体。
关键提示:发布操作要谨慎。全局变体覆盖的不是某个人的临时偏好,而是整个角色组的默认打开状态。如果在这个环境里还有未完成的自定义卡片开发,建议等开发验收后再发布,否则用户会默认看到一张内容异常的半成品页面。
4. 卡片内容的“幕后接线”:Annotation 与 CDS 视图决定卡片行为
前面章节能让你把已有卡片调好,但你会很自然地碰到一个新问题:有些场景下的卡片长得不对,或者页面里压根没有想要的那张卡片。这时候你需要的不是更多适配技巧,而是理解卡片是怎么被“变”出来的——也就是 CDS 视图里的注解如何被 OVP 渲染成卡片。
这一章我不会把全部注解清单抄出来,而是帮你看懂“数据源 → 卡片类型 → 页面承载”这三层对应关系,附上几个最关键的可直接参考片段。注意:以下代码是简化示意,不同组件版本在细节上会有差异,请以你环境里的实际元数据检查为准。
4.1 从表格卡片反推 CDS 注解
先看一张最普通的表格卡片是怎么产生的。OVP 页面的主体内容其实是由 CDS 视图的注解声明出来的,前端读到注解后,把满足条件的字段组合成一张表格卡片。
@UI: { headerInfo: { typeName: '销售订单', typeNamePlural: '销售订单' }, lineItem: [ { value: 'SalesOrderID', label: '订单号', position: 10 }, { value: 'CustomerName', label: '客户', position: 20 }, { value: 'NetAmount', label: '净额', position: 30 }, { value: 'Status', label: '状态', position: 40 } ] } define view ZC_OVP_SalesOrder as select from ekko { ... };在 OVP 页面配置里,如果某块区域被声明成“表格卡片”并绑定到这个视图,那么这张卡片默认展示的列就是@UI.lineItem里的字段;字段的显隐顺序由position决定。你现在应该能理解,为什么纯 UI Adaptation 没办法给卡片增加一个找不到的字段了——如果字段压根不存在于后端视图的注解列表里,前端没有东西可配置。
所以做 OVP 项目的正确姿势是:页面布局由 Key User 用 UI Adaptation 调整,但“这张卡片能展示哪些字段”的问题,必须在 CDS 视图开发阶段就定好。字段越多,Adaptation 的自由度反而越低——因为适配只是把已有选项做显隐,而不是无中生有。
4.2 从分析卡片与数量卡片看注解驱动的“多面性”
OVP 比其他 Fiori Elements 页面更有意思的一点是:同一个实体,你可以通过声明不同类型注解,让它同时呈现成不同的卡片形态。同一个销售订单视图,既可以用@UI.lineItem渲染成表格卡片,也可以用@UI.chart渲染成分析卡片。
@UI: { chart: [ { chartType: #COLUMN, measures: [{ value: 'NetAmount', role: #AXIS_1 }], dimensions: [ { value: 'Region', role: #CATEGORY } ] } ] } define view ZC_OVP_SalesOrderChart as select from ZC_OVP_SalesOrder { ... };数字卡片(Number Card)则是另一个更轻量的形态,通常只需要一个关键指标值再加上一个对比趋势值,比如“今日订单金额 1,204,500”再加一个环比;它在 CDS 里一般通过直接暴露计算字段加简单指标注解实现。
这里有个实战规律可以分享:相同业务对象,在 OVP 页面里同时放表格卡片和数字卡片是非常常见的设计组合,但一旦数据源里的指标特别多,多到超过 15 个以上,我建议优先安排表格卡片,而不是堆三张图表卡片,原因很简单——信息熵越高,图表反而越难读。
4.3 标准卡片满足不了时,什么时候必须上自定义卡片
业务一路升级,难免会碰到标准 OVP 卡片装不下的需求。比如卡片内部要展示一个多步骤状态的时间轴,或者要嵌入一段自定义交互的输入项,这时候就要动自定义卡片(Custom Card)了。
自定义卡片的本质,是你在 OVP 页面里预留出来的一个扩展容器,通过页面级配置指向一个独立的 UI5 片段(Fragment)。卡片的内容、数据获取、交互全部由这个片段的控制器处理,跟标准卡片的注解完全解耦。
做这类开发时,我特别提醒三点:
- 自定义卡片必须自己处理数据绑定和异常状态,标准卡片的加载状态不会自动帮你覆盖到;
- 自定义卡片的数据请求要控制时机,不要和页面全局加载抢并发,否则整页加载速度会明显下降;
- 自定义卡片里如果有用户操作入口,比如按钮“批准”,要格外注意业务权限校验是否在后端也做了,别只依赖前端按钮隐藏。
自定义卡片开发完成后,一样可以被 UI Adaptation 拖动、调尺寸、显隐。换句话说,适配层和扩展层是叠加关系:扩展负责新增能力,适配负责把新能力放到最合适的位置。
4.4 全局筛选条件是怎么“漏”到卡片里的
OVP 页面顶部的筛选条件,本质是通过数据上下文的绑定关系传递给各卡片的。全局筛选条件里如果包含订单类型、日期区间、客户等维度,后端在响应卡片数据请求时,会根据 CDS 模型的参数绑定关系自动过滤。
但关键点在于:不是所有字段都能过滤所有卡片。只有 CDS 视图里明确暴露了对应参数/元素,筛选条件才能生效。如果视图模型没有该维度,页面顶部的筛选框看起来在,实际选下去后某些卡片数据不动,这不是 bug,是元数据根本没接上。
因此,在项目初期定义 OVP 页面时,业务方最常提的全局筛选维度(组织、部门、日期、状态),一定要让后端建模人员提前确认:这几个维度是公共口径,所有卡片的数据源都要统一支持。否则等界面做完了,你才发现某张卡片的过滤完全对不上,返工成本会比想象中高很多。
5. 适配失效、缓存与权限:一组必须现场排查的真实场景
前四章把“怎么用、怎么配、怎么扩展”都梳理完了,按理说事情到这就该收尾了。但以我实际接触的项目来看,OVP 与 UI Adaptation 最消耗资源的往往不是设计阶段,而是上线前后的适配失效类问题。这一章我把最常遇到的三种现场场景,逐一按“症状 → 排查链路 → 解决”的形式讲清楚,这也是我这篇实战全解里最想拿出来跟同行交换的一批经验。
5.1 场景一:保存了适配,退出后页面毫无变化
这种现象最常发生在首次使用 UI Adaptation 的环境里。先不要怀疑操作错了,按以下顺序排查:
第一,检查是否保存进了正确的变体。适配模式下你操作完后,如果页面没有任何保存成功提示,或者保存后被系统提示“无更改项”,那通常是你把所有卡片都拖了一轮但最终拖回了原位,系统认为变体为空——不要笑,这种“看着每个卡片动了一下,最后等于没动”的情况在演示环境里经常出现。
第二,检查浏览器缓存和前端资源缓存。Fiori Launchpad 对静态资源和配置有强缓存策略,适配保存后,有时候界面没有立即反映,刷新几次不见效就需要强制刷新或清掉应用缓存。
第三,确认页面当前打开的方式。如果这个 OVP 页面是以技术路由方式直开的,绕过了 Fiori Launchpad 的 tile 上下文,变体归属可能对不上,也会出现“保存成功但打开没变”的诡异现象。换成正式的 FLP tile 入口再试一次。
如果这三步都没问题,再看是不是被全局变体覆盖。我之前遇到过一个现场案例:Key User 改完保存后自己能看到,其他用户看不到,最后查出来问题是这个页面在系统初始配置时已经被发布过一个全局变体,全局变体优先级高于个人变体,其他用户一直读的是全局那份。处理方式不是让每个人再去改一遍,而是让 Key User 把自己调整后的版本重新发布成全局变体。
5.2 场景二:卡片能拖、能调,但一刷新就复位
这个场景听起来和 5.1 很像,但症状不同——你在当次会话里确实看到了适配效果,只是页面重新加载后打回原形。这基本可以断定是变体存储没有持久化,而不是渲染逻辑的问题。
排查链路如下:
优先检查用户名的会话信息,确认当前用户不是以匿名或者共享账号方式登录。共享账号在 Fiori 环境里是灾难,多个用户共用一个账号时,变体存储对个人识别的粒度根本没法区分,今天 B 保存的适配,第二天 A 打开就会被覆盖,而且还会出现“动不动就恢复原样”的假象。
接着检查后端适配存储是否正常。你可以用一个测试账号重新做一次最小的适配操作,比如只修改一张卡片标题,保存后去后端查对应变体表里是否新增了记录。如果没有落库,多半是适配服务没运行或网关配置有问题,需要系统管理员介入检查。
有一种比较隐蔽的原因是页面级锁定:当 OVP 页面处于另一个用户正在编辑并发布的状态时,其他用户的保存可能被拒绝或被静默丢弃。这种情况下页面上会偶尔有提示,但也可能没有任何明显报错。先让当前编辑者退出适配模式并完成发布,再重新适配。
5.3 场景三:用户看得到“Adapt”按钮,但点进去失败或没反应
这类问题的核心基本都在权限和授权,而且提示往往很模糊。
首先要明确:能看到按钮不代表有权限。用户界面上按钮是否出现,通常取决于前端功能开关和页面本身是否允许适配;但真正进入适配模式时,前端要向后端发起适配会话请求,这个请求要经过网关权限校验。如果用户在后端没有被授予 Key User 的适配相关权限,按钮照常显示,点击后却不会有任何反馈或直接报错。
你需要做的动作是检查用户角色是否包含 UI Adaptation 相关的权限继承项。不同版本的角色权限名称不同,但排查思路一致:先看当前用户有没有对应的 Fiori 业务目录/角色实例,再看该实例里是否包含 OVP 页面和适配相关权限;另外要特别检查是否为外部目录用户(比如云平台身份认证用户),这类用户在网关侧的权限映射往往比本地用户更容易漏配。
如果权限配了还不行,再看适配服务的配置会话是否跟 FLP 统一。有个很典型的坑:某些环境里,页面通过 BSP 应用直接访问,而适配服务只被注册在 ICF 节点上,导致适配调用的服务路径对不上。这个环节如果排查到,需要后台管理员检查 ICF 服务节点状态,确认适配相关路径已经激活。
5.4 十步排查清单,贴给项目组少走弯路
上面三个场景是我建议优先排查的高频问题,但它们不是全部。为了让日常支持更省力,我把多年积累的排查顺序浓缩成一个通用清单,你可以把它挂到项目运维文档里:
- 确认当前账号不是共享/匿名账号,建议用专用测试用户复现;
- 确认适配操作保存有成功反馈,且变体中确实存在变更记录;
- 强制刷新并清理浏览器缓存后再打开页面;
- 检查是否以 Fiori Launchpad tile 方式进入,而非直开技术路由;
- 确认当前页面没有被外部发布的高优先级全局变体锁住;
- 检查当前用户角色是否包含页面访问权限与适配权限;
- 检查后端适配服务/网关服务的运行状态,确认请求能正常落库;
- 排除页面编辑锁:确认没有其他用户正停留在编辑态;
- 在另一个浏览器/设备上用同一账号试一次,排除单机缓存问题;
- 如果以上全查过还不行,抓取前端网络请求,看适配保存请求返回的具体错误码和提示文本,再按错误码定位后端日志。
这个清单看起来平凡,但实际排障中只要按顺序走完,九成以上适配类问题都能定位到一个明确的方向,剩下的那一成往往涉及自定义卡片扩展,需要把开发也拉进来一起查前后端接口协议。
刚开始做 OVP 项目时,我也总觉得 UI Adaptation 就是个“给业务配置页面”的小功能,直到后来在几个交付项目里反复被缓存、权限和变体优先级问题绊倒,才真正意识到:这项能力的技术难点不在拖拽操作本身,而在于你能否讲清楚“页面默认长什么样”这件事由谁决定。你在项目里把这一章用到位的底气,来自前四章对“卡片容器、配置覆盖层、注解驱动”三个概念的理解——这三者串起来,才是 UI Adaptation 实战全解的全貌。