status: propose created: 2026-05-15 complexity: 🔴复杂
当前 forge-report-ui 的大屏项目是单画布模型:一个项目只保存一份画布配置和组件列表。实际大屏业务通常不是单页展示,而是从总览页点击区域、指标、企业、设备等对象后进入下钻详情页,再支持返回或继续下钻。
目标:
/chart/home/:id 编辑器中创建、复制、删除、重命名、排序和切换页面。pageId 指定打开页面。forge-report-ui/src/router/modules/chart.route.ts:/chart/home/:id(.*)* 进入 views/chart/index.vue 工作空间。forge-report-ui/src/router/modules/preview.route.ts:/chart/preview/:id(.*)* 进入预览包装页。forge-admin-ui/src/views/report/design.vue:后台通过 SSO iframe 嵌入报表子系统,实际多画布能力落在 forge-report-ui。forge-report-ui/src/views/chart/ContentEdit/hooks/useLayout.hook.ts:编辑器加载项目详情,解析 componentData 后调用 useSync().updateComponent() 回填当前画布。forge-report-ui/src/views/preview/utils/storage.ts:预览页按路由项目 ID 从 sessionStorage/localStorage/后端读取 componentData 并回填 store。forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts:store 当前只包含一份 editCanvasConfig、requestGlobalConfig、componentList,getStorageInfo() 也只返回单画布结构。forge-report-ui/src/api/project/index.ts:buildProjectPayload() 将 chartEditStore.getStorageInfo() 序列化后写入 ai_report_project.component_data。forge/forge-report-server/src/main/java/com/mdframe/forge/report/project/domain/ReportProject.java:后端实体只有一个 componentData longtext 字段,可承载升级后的 JSON。forge-report-ui/src/views/preview/components/PreviewRenderList/index.vue:预览页渲染当前 store 的 componentList。forge-report-ui/src/hooks/useLifeHandler.hook.ts:运行时已支持组件基础事件和生命周期事件。forge-report-ui/src/enums/eventEnum.ts:基础事件包含 click、dblclick、mouseenter、mouseleave。forge-report-ui/src/settings/animations/index.ts:项目已内置 animate.css 动画配置,可复用到页面切换动画。componentData JSON 协议并做旧数据兼容。fetchRouteParamsLocation() 通过 hash 最后一段解析项目 ID,预览指定页面应使用 query 参数 pageId,避免破坏 ID 解析。?pageId= 指定页面。pageType=modal,组件动作可打开/关闭弹窗,弹窗内容仍由大屏编辑器页面渲染。homePageId,发布和预览默认打开首页。editCanvasConfig、requestGlobalConfig、componentList 写回当前页面。pageType=modal 页面,不能打开外部 URL。pages 字段时,自动包装成一个默认页面,不改变旧 JSON 读取能力。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 无 | ai_report_project |
- | 继续使用 component_data longtext 保存多页面 JSON |
{
"version": 2,
"homePageId": "page-home",
"activePageId": "page-home",
"pageTransition": "fade",
"pages": [
{
"id": "page-home",
"name": "首页",
"sort": 1,
"pageType": "page",
"editCanvasConfig": {},
"requestGlobalConfig": {},
"componentList": []
},
{
"id": "page-modal",
"name": "详情弹窗",
"sort": 2,
"pageType": "modal",
"modalConfig": {
"width": 720,
"height": 420,
"placement": "center",
"showMask": true,
"maskOpacity": 0.58,
"maskClosable": true,
"showClose": true,
"borderRadius": 8
},
"editCanvasConfig": {},
"requestGlobalConfig": {},
"componentList": []
}
],
"sharedRequestGlobalConfig": {}
}
旧结构:
{
"editCanvasConfig": {},
"requestGlobalConfig": {},
"componentList": []
}
加载时转换为:
{
"version": 2,
"homePageId": "default-page",
"activePageId": "default-page",
"pages": [
{
"id": "default-page",
"name": "首页",
"sort": 1,
"editCanvasConfig": {},
"requestGlobalConfig": {},
"componentList": []
}
]
}
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 复用 | /forge-report-api/report/project/{id} |
GET | 返回原 componentData,前端解析多页面 JSON |
| 复用 | /forge-report-api/report/project |
PUT | 保存升级后的完整 componentData |
| 复用 | /forge-report-api/report/project/publish/{id} |
POST | 发布 URL 仍为项目预览地址 |
forge-report-ui 编辑器 store、页面加载、自动保存、预览、发布、截图。forge-report-ui 组件事件配置面板和预览运行时事件执行。forge-report-ui 动态请求参数解析,新增页面上下文来源。forge-report-ui JSON 导入导出和代码编辑页。forge-report-server 理论上不改表结构和接口,只需回归保存/读取加解密链路。component_data longtext 足够承载。componentData JSON 协议,降低后端和迁移风险。?pageId= 指定页面,保留 /chart/preview/:id 项目入口。actions 配置,不要求用户编写 JS。dynamicRequestParams 机制。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Task 1 | done | forge-report-ui/src/store/modules/chartEditStore/chartEditStore.d.ts, forge-report-ui/src/packages/index.d.ts, forge-report-ui/src/packages/public/publicConfig.ts, forge-report-ui/src/views/chart/hooks/useSync.hook.ts, forge-report-ui/src/utils/reportPages.ts |
多页面协议、结构化动作类型、旧组件 actions 兼容、协议工具;pnpm build 通过 |
| Task 2 | done | forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.d.ts, forge-report-ui/src/views/chart/ContentEdit/hooks/useLayout.hook.ts, forge-report-ui/src/views/preview/utils/storage.ts |
Store 增加页面列表、首页、当前页、页面上下文与切换动作;编辑/预览加载接入多页面协议;pnpm build 通过 |
| Task 3 | done | forge-report-ui/src/views/chart/ContentPages/index.vue, forge-report-ui/src/views/chart/ContentPages/components/PageListItem.vue, forge-report-ui/src/views/chart/index.vue, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts |
编辑器左侧新增画布页面管理面板,支持新增、复制、删除、重命名、设置首页、上移/下移、切换页面;pnpm build 通过 |
| Task 4 | done | forge-report-ui/src/api/project/index.ts, forge-report-ui/src/utils/reportPages.ts, forge-report-ui/src/views/chart/hooks/useAutoSave.hook.ts, forge-report-ui/src/views/chart/ContentHeader/headerRightBtn/index.vue, forge-report-ui/src/views/project/components/ProjectCreateModal/index.vue, forge-report-ui/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.vue |
保存、自动保存、预览、发布链路改为项目级多页面 JSON;新建项目默认写入 v2 协议;pnpm build 通过 |
| Task 5 | done | forge-report-ui/src/views/preview/suspenseIndex.vue, forge-report-ui/src/views/preview/utils/storage.ts, forge-report-ui/src/hooks/useChartDataPondFetch.hook.ts, forge-report-ui/src/utils/reportPages.ts |
预览默认解析首页,支持 ?pageId=,提供运行态切页方法和页面转场;切页重建渲染列表并清理旧数据池 watcher/轮询;pnpm build 通过 |
| Task 6 | done | forge-report-ui/src/enums/eventEnum.ts, forge-report-ui/src/hooks/useLifeHandler.hook.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.d.ts, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventPageAction/index.vue, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventPageAction/index.ts, forge-report-ui/src/views/preview/suspenseIndex.vue, forge-report-ui/src/views/preview/utils/storage.ts |
事件配置新增页面跳转动作面板,支持点击/双击跳转项目内页面并可选转场;运行时合并旧基础事件 JS 与结构化动作;pnpm build 通过 |
| Task 7 | done | forge-report-ui/src/utils/reportDrill.ts, forge-report-ui/src/utils/requestDynamicParams.ts, forge-report-ui/src/hooks/useLifeHandler.hook.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.d.ts, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventPageAction/index.vue, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.vue |
跳转动作支持固定值、组件字段、页面上下文参数绑定;运行时合成 pageContext;动态请求参数新增页面上下文来源;pnpm build 通过 |
| Task 10 | done | forge-report-ui/src/store/modules/chartEditStore/chartEditStore.d.ts, forge-report-ui/src/store/modules/chartEditStore/chartEditStore.ts, forge-report-ui/src/utils/reportPages.ts, forge-report-ui/src/enums/eventEnum.ts, forge-report-ui/src/hooks/useLifeHandler.hook.ts, forge-report-ui/src/views/preview/suspenseIndex.vue, forge-report-ui/src/views/preview/components/PreviewRenderList/index.vue, forge-report-ui/src/views/preview/components/PreviewRenderGroup/index.vue, forge-report-ui/src/views/preview/hooks/useComInstall.hook.ts, forge-report-ui/src/views/preview/utils/storage.ts, forge-report-ui/src/views/chart/ContentPages/index.vue, forge-report-ui/src/views/chart/ContentPages/components/PageListItem.vue, forge-report-ui/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue, forge-report-ui/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventPageAction/index.vue |
新增项目内弹窗页面 pageType=modal,支持新增弹窗页、配置弹窗外壳、组件动作打开/关闭弹窗,预览运行时主页面与弹窗页叠加渲染;pnpm build 通过 |
| Task 8 | done | forge-report-ui/src/views/edit/index.vue, forge-report-ui/src/views/chart/ContentEdit/components/EditTools/index.vue, forge-report-ui/src/views/chart/ContentEdit/components/EditTools/utils/index.ts, forge-report-ui/src/views/chart/ContentEdit/components/EditTools/hooks/useFile.hooks.ts, forge-report-ui/src/views/chart/ContentEdit/components/EditTools/hooks/useSyncUpdate.hook.ts |
JSON 编辑、导入、导出、同步预览统一使用项目级多页面 JSON;旧单页 JSON 经 normalizeProjectStorage() 兼容;目标文件 ESLint 通过 |
待实现后审查。