来源:docs/PLATFORM_GAPS_FROM_TEMPLATES.md 第 27 条(P0)。
实证发现自 helpdesk(最尖锐)、compliance(外审)、contracts(甲乙双方)、procurement(供应商 portal)。
现象
平台没有「外部用户门户」机制。当同一个 app 同时被员工和外部用户(客户 / 审计员 / 供应商 / 合作方)使用时:
- 外部用户登录后看到的是和员工一样的 Console:同样的顶栏、同样的左侧导航、同样的应用网格、同样的搜索框。
- 权限只能靠
profile 隐藏字段 / 视图 / 应用入口,但视觉层(chrome / navigation / 入口)无法换肤。
- 没法给客户做一个干净的「我的工单 + 提交工单 + 浏览知识库」自助页面。
helpdesk 模板的 customer_portal profile 是空壳——除了限制能看哪些字段,体验上和 admin 同屋。
复现
cd packages/helpdesk && pnpm dev
# 创建一个 profile=customer_portal 的账号登录
# 看到的还是 /_console/...,左侧有 Tickets / Messages / Customers / KB / Teams / SLA 全套导航
# 没有「外部用户专属布局」可选
当前 workaround
只能:
- 起一个第二份模板包(如
helpdesk-portal),独立部署、独立端口。
- 代价:双倍部署、数据要么共享 DB 要么走 API 同步、SSO 状态分裂。
- 或者在 profile 里关掉绝大部分入口,让外部用户看到一片空白 + 一个对象——但仍然顶着 Console 的 ObjectStack chrome,UX 像「内部系统给你开了一道缝」。
两种都不达标 B2B/B2C SaaS 体验。
建议范围
M1:Portal 概念
- 在 spec 引入
portal: { id, label, themeOverrides?, layoutKind: 'minimal' | 'embedded' | 'console' }。
- 同一份 app metadata 能挂多个 portal,每个 portal 有独立路由前缀(如
/portal/customer/...)。
- 每个 portal 绑定一组 profiles。
M2:Portal-aware Layout
minimal 布局:去掉应用网格 / 跨应用导航 / 顶栏品牌部分可换肤。
- 路由根据 portal id 切换:
/portal/customer/helpdesk/... vs /_console/apps/helpdesk/...。
- 同一对象的同一视图能在两个 portal 用不同的 view 名称引用。
M3:Portal 默认页 + 公开入口
验收
关联
现象
平台没有「外部用户门户」机制。当同一个 app 同时被员工和外部用户(客户 / 审计员 / 供应商 / 合作方)使用时:
profile隐藏字段 / 视图 / 应用入口,但视觉层(chrome / navigation / 入口)无法换肤。helpdesk模板的customer_portalprofile 是空壳——除了限制能看哪些字段,体验上和 admin 同屋。复现
当前 workaround
只能:
helpdesk-portal),独立部署、独立端口。两种都不达标 B2B/B2C SaaS 体验。
建议范围
M1:Portal 概念
portal: { id, label, themeOverrides?, layoutKind: 'minimal' | 'embedded' | 'console' }。/portal/customer/...)。M2:Portal-aware Layout
minimal布局:去掉应用网格 / 跨应用导航 / 顶栏品牌部分可换肤。/portal/customer/helpdesk/...vs/_console/apps/helpdesk/...。M3:Portal 默认页 + 公开入口
entryView: 'helpdesk_ticket.list'与entryAction: 'create_ticket'。验收
helpdesk模板新增customer_portalportal,路由/portal/helpdesk-customer/...,左导航只显示「我的工单 / 提交工单 / 知识库」三项compliance模板新增auditor_portal:外审人员只能看到只读证据关联