1. 先弄明白 Designers 到底在管理什么
不少人第一次接触 SAP Fiori Launchpad Designer 的时候,第一反应是"这不就是个画磁贴的工具吗"。这种理解不算错,但很容易把后续的方向带偏。Launchpad Designer 的真正价值不是视觉排版,而是企业级应用入口的内容建模和分层治理。你能不能在系统里快速给一个新入职的销售搭出"我的销售工作台",能不能在季度末把几十个混乱的磁贴重新归位,能不能保证生产环境里的入口内容和开发环境完全一致——这些问题的答案,全都藏在你对 Launchpad 内容体系的理解深度上。
Fiori 体系的整个入口逻辑,可以拆成四层:内容层(Content)、传输层(Transport)、运行时层(Runtime)、个性化层(Personalization)。Designer 主要管的是内容层和一部分运行时配置。所谓内容建模,就是你先定义"这个应用是什么、能干什么、什么角色能用",然后通过目录、分组、角色、目标映射这些概念把这些语义落成一套结构。听起来抽象,其实每家公司实施 Fiori 的时候都绕不开这套动作。
在你打开设计器之前,必须先问自己三个问题:这个系统里有哪些 Fiori 应用?这些应用分别解决什么业务问题?谁应该在哪个菜单层级看到这些应用?这三个问题回答清楚了,才轮到设计器登场。
2. 核心概念拆解:语义对象、目录、分组与目标映射
2.1 语义对象与动作:入口不管"系统"只管"人话"
很多刚接触 Fiori 的人会纠结一个问题:我为什么不直接在磁贴上放一个 URL?为什么要搞出语义对象(Semantic Object)和动作(Action)这一套?因为 URL 是写给系统看的,语义对象是写给人和业务看的。
比如"销售订单审批"这件事,业务人员的理解是"我要看公文包里有几单待审"。如果你给每个用户都硬编码一个 URL,那一旦应用地址变了、系统迁移了、或者同一个应用在测试环境和生产环境路径不同,你就得把所有磁贴改一遍。而语义对象加动作的组合,本质上是一种"逻辑地址"。语义对象定义为"销售订单",动作定义为"审批",系统在运行时通过条件解析去匹配真正的应用地址。哪个系统环境里配了哪个 URL,那是系统层面的事情,内容建模不需要关心。
这里我建议你在实际项目中按"名词+动词"去拆。名词就是语义对象(比如物料、销售订单、采购申请),动词就是动作(显示、审批、追补)。不要搞出"销售订单审批总览"这种既是名词又是动词、边界模糊的对象,到后面你会被自己在语义层制造的混乱反噬。
2.2 目录与分组:逻辑归类和物理呈现完全两回事
目录(Catalog)解决的授权问题,分组(Group)解决的呈现问题。这两个概念放一起说,是因为几乎所有人都会在这里犯同一个错——把目录当菜单用。
目录是内容集合,它决定了一个用户能访问什么应用,通常挂到业务角色(Business Role)下面。分组是用户启动界面上的"页签"或者"工作区",在这个区域里你可以把不同目录中的磁贴进行二次编排、排序、分页签。
举一个实际例子:你有一百个 Fiori 应用,分成财务、物流、人事三个目录。销售部门的角色只需要财务里的发票查询和物流里的发货跟踪,那你给销售角色挂这两个目录就行。如果不下发任何分组,销售用户登录后只能看到"目录"样式的产品页,体验非常差。所以在角色里你还要绑定分组,把销售相关的磁贴放到"销售工作台"这个组里。这样用户一登录就直达常用功能,而不是在整张目录清单里翻找。
这里有一个非常关键的经验:Catalog 要做得细,Group 要做得粗。目录小了,授权灵活,你可以给不同角色组合出不同权限面;组大了,前台界面干净,用户不用一屏看几十个 tiles。我见过一些项目,把目录建得无比巨大,每个目录塞两百个应用,结果每次权限调整都要动一堆角色,运维成本直线上升。反过来,有些项目把分组拆得极细,页签变成二三十个,用户自己都找不到功能藏在哪里。
2.3 目标映射:磁贴背后的"路由中枢"
目标映射(Target Mapping)才是 Fiori Launchpad 里真正的技术核心。一个 Tile 只是前台的门面,真正负责"点了这个磁贴之后,系统把用户带到哪去"的是目标映射。
一个目标映射由语义对象、动作、应用类型(Application Type)和参数组成。配置的时候,你要注意应用类型直接影响运行时的渲染方式。最常见的类型是 SAPUI5 Component,输入 Component 名称和 Usage ID 即可,适合标准 Fiori 应用;URL 类型适合跳转到外部系统或者老的 GUI 页面;还有一种是自定义页面类型,适合嵌入 HTML 片段。
配置目标映射时最容易踩的坑是参数定义方式。比如你希望用户从磁贴点击后直接带出公司代码,有人会把公司代码直接写死在 URL 里,这样做基建环境没问题,但一到生产环境或者换了公司主体,你就要全量重配。正确做法是在目标映射里用占位符参数(Placeholder Parameter),比如?CompanyCode={CompanyCode},然后在磁贴级或者角色级填充默认值,运行时再通过上下文解析替主人拿真实数据。这一步做好了,你的 Fiori 入口才真正具备模型化、可移植的潜力。
2.4 磁贴类型选择:信息呈现的层次感
Fiori Launchpad 里的磁贴不是只有一种图标加文字。标准磁贴(Static Tile)是最简单、最常见的形式,基本等于一个带图标的入口。如果你只做导航,用这个没错。但如果你希望用户在启动页上直接看到业务数据,就要考虑动态磁贴了。
动态磁贴分为两种:一种是基于 OData 服务的数值磁贴(Numeric Tile),它会实时显示一个数字(比如待审批单据数、未读邮件数),再配一个趋势标;一种是带图表的丰富动态磁贴(Rich Tile),可以显示柱形图或环形图的一部分。这类磁贴适合做 KPI 层面的最浅层展示,它不替代 Fiori 应用,但能让用户打开启动台的第一眼就获得信息。
在配置动态磁贴时,要特别关心 OData 服务的响应时间。磁贴数据请求如果设计得不好,会出现一种尴尬情况:磁贴内容比应用本身加载还慢。生产环境中我一般建议对动态磁贴的数据服务做额外缓存设置,并严格控制返回行数。你不希望用户在启动页触发几十个 OData 请求,那会让登录体验瞬间变糟。
3. 分层治理:从单张磁贴到企业级入口体系
3.1 为什么需要分层:混乱的根源在哪里
很多企业搞 Fiori 建设,第一年是热情高涨的试点阶段,各种部门都来提需求:我要一张报销磁贴、我要一张物料查询磁贴、我要一张生产工单磁贴。如果没有分层治理的框架,一年之后你面对的就是几百张磁贴散落在各种目录里,连创建人都说不清某个磁贴给谁用、参数怎么配,更糟的是同一个应用被重复创建了十几次目标映射,每次的组件版本还不一致。
我见过某企业上线两年后的 Fiori 内容库,Catalog 数量超过一百五十个,其中一半只有一两个磁贴;Tile 数量接近两千,大量重复入口。这样的内容库不只是混乱,还会直接导致运行时性能退化、权限审计困难、故障定位难。你根本没法跟审计人员说清楚"为什么这个用户能访问这五百个磁贴"。
分层治理的含义,是在混乱发生之前就把内容管理的规则定清楚。谁有权限创建 Catalog 和 Group?命名规范是什么?内容是否要走传输链?哪类内容属于基础架构层,哪类属于业务能力层,哪类仅仅属于本地临时微调?每一层都有不同的管理策略和责任人。
3.2 内容层级规划:基座层、业务层、部门层
基于实操经验,我把 Fiori 内容规划分成三个层级,供你参考。
基座层是指那些被所有用户共享的基础内容,比如通用的"首页""我的待办""个人设置"这些入口。这一层的 Catalog 应该保持非常精简,由核心管理员统一建立和修改,不开放给项目组成员自由创建,目的是维持入口体系的一致性。
业务层是按业务流程组织的 Catalog 和 Group,比如"采购业务""销售业务""财务管理"。这一层通常由各业务域的 Fiori 负责人来管理。他们要负责维护本域的语义对象字典、确保本域的 Target Mapping 引用的应用都是最新版本、清理废弃的磁贴。业务层的 Catalog 命名我建议用"业务域缩写_场景",比如FIN_PAYABLE表示财务应付场景。
部门层是可以稍微灵活的个性化区域,比如某个团队单独需要一个"临时项目工作区"。这层内容允许团队管理员自行创建分组,但 Catalog 依然要经过审批,避免产生孤岛式内容。
这三层之间不是物理隔离,而是管理责任和变更控制策略的分层。基座层不允许随便改,业务层要定期盘点,部门层允许适度自服务,这才是"治理"而非"遏制"。
3.3 命名规范与维护策略:治理的落地抓手
治理不能停留在口头要求上,必须沉淀成可执行的规范。我强烈建议在你的项目 Wiki 里维护一张命名规范表,至少包含以下几类:
- Catalog 命名:
业务域_场景,全部大写,下划线分隔。例如FIN_AP_AR、MM_PURCHASING。 - Group 命名:
用户视角名称,例如"我的采购任务""财务月结工作台"。分组名是用户直接看得到的,尽量用自然语言。 - Target Mapping 命名:建议用
语义对象_动作_后缀。例如Material_Display_MainView。这样排序之后所有同一对象的映射会聚在一起,排查效率高。 - Tile 命名:可以用业务标题 + 目标映射简称,但关键是磁贴 ID 要具备唯一性和可读性,尽量避免无意义的 UUID。
命名规范在项目前期看起来像形式主义,但等到内容库上百个条目时,合理的命名能让你在搜索和过滤器里快速定位。单个系统里没什么感觉,跨服务器传输的时候你就知道有一个统一标识体系有多重要了。
3.4 跨环境传输:内容也要走"代码上线流程"
不少新手在项目实施时把 Fiori 内容建在开发机上,然后直接在生产机上再手动敲一遍。短期是小系统问题不大,但一旦内容量变大,手工重建就是灾难源。SAP Fiori 内容对象和其他 ABAP 对象一样,可以通过请求号被传送到后续环境。只要你在创建 Catalog、Group、Target Mapping 时把它们放到同一个传输请求里,就能通过标准流程往质量保证环境和生产环境推送。
在传输中最容易出问题的是"字典表"不一致。你开发环境的语义对象在生产环境没有激活,或者目标映射里引用了另一个还没传走的应用组件,接收方会出现启动失败。所以推送之前,我会先做一次依赖检查:目标映射引用了哪些应用?这些应用的组件是否已经存在于目标系统?Catalog 里引用的 Tile 是否都完整?依赖检查不是 SAP 设计器自动帮你做的,这需要项目自己积累一套检查清单。
如果你在实施 SAP S/4HANA 新项目,还可能会遇到 Fiori Content 的交付模式差异。云版本通常语义对象和 Catalog 是预交付的,你更多是做选择与配置;而本地部署版本里,你需要从空白开始或者基于激活的 Fiori 内容手动去整合。搞清楚你所在环境的交付模式,会直接影响你内容建模的方式。
4. 实操指南:从零开始玩转 Launchpad Designer
4.1 前置环境确认:哪些系统版本支持 Designer
新版 Fiori Launchpad Designer(也叫 FLP Designer)是一个基于 SAPUI5 Flex 功能的 Web 工具,它替代了老旧的 FLP 内容管理器(即原来的/defaultsap/site配置界面)。判断你的系统用的是新设计器还是老工具,一个简单的方法是看启动页地址。如果登录后直接是/sap/bc/ui2/flp并且能通过 FLP 右侧的"配置"按钮进入可视化编辑界面,说明你已经有新版 Designer 能力。
新版 Designer 支持的 Fiori 应用类型更多,尤其是基于 SAP Fiori elements 的应用。它不仅能建磁贴,还能直接修改应用内部的页面布局,比如新增自定义字段、调整列表列顺序、配置过滤器默认值。这种"扩展能力"是旧版内容管理器完全不具备的。如果你在老旧版本上还看不到 "Configure" 按钮,需要先确认前端组件版本是否符合要求。
4.2 三种进入方式:浏览器直接访问和条件配置
进入 Launchpad Designer,最常见的方式是从 Fiori Launchpad 页面右侧点击用户头像,在下拉菜单里找到"配置"链接。这个入口只有在你有SAP_FLP_ADMIN或具备相应角色权限时才会显示。
如果你是管理员,也可以直接通过 URL 访问设计器页面,避免反复点击。通过/sap/bc/ui2/flp_cmp_content可以进入内容管理侧,通过/sap/bc/ui2/flp进入启动页。你不需要记所有 URL,只要知道设计器是基于 Web 的,权限到位之后一定有入口就行。
这里我提一个实操心得:在开发或者配置环境里,尽量给自己分配一个专用的管理账号,不要在日常使用的业务账号上做内容配置。原因很简单,设计器的变更实时生效,而你日常账号往往挂着很多业务角色,一旦误操作,改了公共分组或者删了别人正在用的磁贴,连排查都费劲。
4.3 创建目录与分组的完整流程
在 Designers 左侧面板中,你会看到四个页签:Tile、Catalog、Group、Target Mapping。这是新版和旧版的最大区别之一——旧版是先建分组再挂内容,新版则是内容对象独立存在,再在 Catalog 和 Group 里引用。
创建 Catalog 的流程是:进入 Catalog 页签,点击新建,输入名称和 ID。这时你可以把已经存在的 Tile 拖入该目录。注意 Catalog 本身不包含权限控制,它是资产归集。真正把 Catalog 授给用户,是在业务角色的"应用权限"里选择这个目录。针对你只想让一个人或者一个小组看到某几个磁贴的场景,不要单独建一个只含一张磁贴的 Catalog,这会导致一两年后 Catalog 数量失控。灵活的做法是用同一个细分 Catalog 比如"销售订单查询",挂到多个角色下面,权限粒度通过角色来区分。
创建 Group 的流程类似:进入 Group 页签,新建分组,输入标题,然后在"页面分配"里勾选你想放的 Catalog 和 Tile。分组是可以嵌套页签的,最顶层的 Tab 就是你登录后看到的导航区。设计器支持拖拽排序,这在视觉呈现上很方便,但要注意配置保存后有一定的延迟才能在运行时看到效果。
4.4 创建目标映射和磁贴的关键路径
创建目标映射的路径是:Target Mapping 页签 → 新建 → 填写语义对象、动作、应用类型、参数等字段。这里有一个重要的输入项叫"使用应用 ID"(Usage ID)。如果你是 SAP Fiori elements 或者使用标准应用,这里通常填一个逻辑名,比如审批中心的F0402或某个自定义应用的 usage。真正渲染的时候系统会通过 Usage ID 去解析 UI5 组件。
很多项目实施中,我发现大家经常把"Tile 名称"和"Target Mapping 标题"搞混。Tile 名称是显示在启动台上的文案,Target Mapping 标题是后台逻辑对象的描述。两者可以不同,但我在实际项目中会尽量保持一致,或者 Tile 名称用业务长名,Target Mapping 标题用简短唯一名。这样在后台排查时,搜索结果的辨识度会大幅提升。
磁贴创建还有一个小细节:如果你希望磁贴能带一组默认参数,比如从磁贴直接打开物料清单页面,可以在目标映射级别配置参数值。但同时在磁贴级别有一个"参数组"的概念,不同用户看到同样的磁贴可能会被分发不同参数,这个是后台在授权时动态替换的。实际使用中,我见过不少因为没有理解这个参数替换机制,导致某个用户点击磁贴报"缺少公司代码"的错误,其实不是授权问题,是参数组没配好。
4.5 角色分配到用户:最终一步往往被轻视
内容建模建得再好,如果角色分配没跟上,用户在启动页还是什么都看不到。Fiori 上的角色分配其实分为两层:PFCG 角色和 Fiori 业务角色。传统 ABAP 环境中,你要在 PFCG 里给角色分配菜单(也就是 Catalog 和 Group),然后通过 SU01 把用户分配给角色。
在进行角色分配时,最影响使用体验的是"默认分组"的设定。一个角色可以关联多个分组,但用户登录后启动页只展示选中的主分组(Default Group)。如果你一个用户被分配了多个角色,每个角色都有默认分组,系统会挑其中一个作为启动页主分组,其他分组会出现在下拉菜单或者页面页签里。这个"默认"到底是哪个角色说了算,很多项目都没跟用户讲明白,所以经常出现"我明明有销售权限,但升级之后打开启动页却默认在采购页面"的问题。
我给你的建议是,在角色设计阶段就把"登录默认落地页面"这个信息体现在角色命名里,例如加一个_HOME后缀的群组专门作为默认首页,其他业务功能都通过页签方式呈现。这样,无论用户有多少角色,默认分组都是统一的首页入口,不会因为某个角色的默认分组而出现"每次登录都到不同页"的怪象。
5. 常见问题与排查技巧
5.1 创建的内容消失了:缓存与同步时间
新手大概率会经历这么一件事:在 Designers 里明明新建了一个分组,也把磁贴放进去了,但退出再登录,启动页上什么都没有。不要先怀疑自己操作错了,先考虑缓存问题。
Fiori Launchpad 是前端渲染模式,它的内容存储在后台但不一定会触发浏览器立即重新拉取。最直接的排查方式是按Ctrl+F5强制刷新,或者清除浏览器本地存储里的FLP缓存。如果还是没有,检查这个用户关联的业务角色是否包含新创建的 Catalog 或 Group。记住一个原则:Designer 里的内容只是"配方",用户能不能看到"菜品",完全取决于角色这道"授权链"有没有传给"厨师"。
另外,如果你修改了现有目录里磁贴的顺序或者新增磁贴,有时候在前台看到的变化会有延迟。SAP 后台有缓存机制,需要等一段时间才会刷新,或者你可以手动清除 Gateway 系统上的缓存。不过这个操作建议谨慎,在繁忙时段不要随便清理,影响面比较大。
5.2 组件不一致:为什么刷新后磁贴直接报错
另一个高频问题:磁贴在某个环境里点开是正常的,到了另一个环境就报错。这种情况很大概率是目标映射指向的应用组件版本在目标系统里没有激活,或者是语义对象没有同步过去。
排查顺序建议为:先在启动台后台打开 Tile 对应的 Target Mapping,查看它引用的应用类型和组件名。然后去目标系统的/sap/bc/ui2/flp_cmp_content检查该组件是否存在。如果组件存在但版本不同,需要确认前端构建和部署时间线是否已完成。Fiori 前端应用发布时通常要经过独立构建部署,不是内容传输完成后立刻生效。
如果是目标映射没有问题,再看 OData 服务是否激活。很常见的一种错误是,组件虽已部署,但服务没有在/n/IWFND/MAINT_SERVICE里激活,结果磁贴加载到了但数据请求失败。这也是我强烈建议每个 Fiori 项目建立一个"应用上线检查表"的原因。没有检查表,上面任何一个环节缺失都会让一个简单磁贴变成难解之谜。
5.3 多人协作时的覆盖冲突
Designer 支持多人同时编辑同一个内容库,这种灵活性的代价是容易互相覆盖。你们项目如果有多个人同时维护 Catalog 和分组,我建议做一个简单的内部约定:建立内容变更申请记录。谁在哪个时间点修改了哪个 Catalog 或者 Target Mapping,至少要在团队通信渠道里喊一声。
系统本身没有强制的锁机制,当你保存一个目录时,不会提醒你"有人在你之后改过这个内容"。所以覆盖是静默发生的。如果你想稍微稳一点,可以在做出重大修改之前,先把当前内容导出(Designer 支持 JSON 导出),保存一份快照。等修改确认没有问题后再删除快照。这样即便出了问题,恢复是五分钟以内的事情。
5.4 传输请求遗漏:生产怎么找都对不上
最后聊聊传输环节的排查。配置机改了内容,目标机看不到,首先不要怀疑系统问题,大概率是请求没有释放或者传输途中被跳过。去传输管理界面看一下这个请求的状态,是"已释放"还是"可修改"。有时候两个内容对象在同一个请求里,其中一个传输失败会导致另一个也被回滚。
如果传输状态正常但内容依然缺失,再去检查目标系统的包分配。因为 Fiori 内容对象必须有软件组件归属,如果对象被放到了本地包(Local Package),它就不会出现在传输请求里。这个坑非常隐蔽,因为你在开发机上能正常看到内容,一传到生产就消失。排查办法是查看对象的包属性,确保属于可传输的软件组件。
提示:我自己在项目中会把所有 Fiori 内容对象固定在同一个自定义软件组件里,不分散到多个包。这样在传输时只需要跟踪一个组件,管理成本极低。
6. 我的实操心得与底层建议
Fiori Launchpad Designer 用熟了之后,你会发现这个工具的设计哲学跟它表面上呈现的"拖拽式配置"完全不同。它真正要求你具备的,是把业务应用抽象成语义对象的建模能力,是把大量内容梳理成分层结构的治理能力,是让内容变化带着添加上线流程一起走的管控能力。
我个人在实际操作中体会最深的是:不要在实施第一天就把所有 Catalog 和分组搭好。先挑一个真实的业务场景(比如采购员工作台),完整地走一遍建模、建目录、建分组、建映射、角色分配、跨环境传输的全链路。场景跑通了,你再批量复制时,所有流程的坑都已经踩平了。
再分享一个高频生效的小技巧:在实际交付给用户之前,至少用一个"测试用户"登录验证一遍,而且要刻意使用一个非管理员的低权限用户验证。因为管理员账号往往因为权限过大而掩盖很多内容缺失的问题。用测试用户过一遍场景,你才能看到用户真正看到的世界。
Fiori 的内容建模和治理这件事,不会有做完的一天。新的应用会加进来,旧的功能会被替换,组织架构调整会改变角色权限。但只要你的底层设计是分层清晰、命名规范、传输可控的,这些变化就只是日常维护,而不是一次又一次的返工重建。从一个磁贴的快感中抽身出来,站在整套入口体系的视角去管理内容,你才算是真正掌握了 Launchpad Designer 的正确打开方式。