ui-web 租户控制台
目录
简介
本文件为 ui-web 租户控制台的系统化技术文档,面向前端工程师与全栈开发者,覆盖应用架构、App Router 路由体系、页面与布局设计、Dashboard 网格布局与可拖拽组件、实时数据展示、状态管理(Zustand)、响应式与主题、国际化、组件开发规范、API 调用示例以及与后端 bi-* 服务的集成方式与数据流处理。文档同时提供从基础组件使用到复杂 dashboard 构建的学习路径。
项目结构
ui-web 采用 Next.js 16 + React 19 的 App Router 架构,结合 TypeScript、TailwindCSS、Arco Design、ECharts、Zustand 等技术栈,围绕租户控制台场景构建可视化与交互能力。
图示来源
- [[[[layout.tsx]]]]
- [[[[AppLayout.tsx]]]]
- [[[[dashboard/page.tsx]]]]
- [[[[KPICard.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[DataTable.tsx]]]]
- [[[[RealtimeChart.tsx]]]]
- [[[[index.ts]]]]
- [[[[useBiStore.ts]]]]
- [[[[useCommonStore.ts]]]]
- [[[[useSitePromotionStore.ts]]]]
- [[[[env.ts]]]]
- [[[[RequestInterceptorProvider.tsx]]]]
- [[[[NavigationContext.tsx]]]]
- [[[[ChatContext.tsx]]]]
- [[[[AuthGuard.tsx]]]]
- [[[[CommonStoreInitializer.tsx]]]]
- [[[[BiInitializer.tsx]]]]
章节来源
核心组件
- 根布局与字体:全局字体变量注入、强制动态渲染、图标字体引入。
- 主布局容器:侧边栏、顶部导航、主内容区、浮动聊天按钮、鉴权与初始化。
- 仪表板页面:网格布局、KPI 卡片、折线/柱状/饼图、实时图表、表格。
- 状态管理:Zustand Store 组合,按功能域拆分(BI、通用、站点推广)。
- 请求拦截与环境配置:统一重写规则、代理目标、运行时环境切换。
- 上下文与守卫:导航、聊天、请求拦截、登录守卫。
章节来源
- [[[[layout.tsx]]]]
- [[[[AppLayout.tsx]]]]
- [[[[dashboard/page.tsx]]]]
- [[[[KPICard.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[DataTable.tsx]]]]
- [[[[index.ts]]]]
- [[[[useBiStore.ts]]]]
- [[[[useCommonStore.ts]]]]
- [[[[useSitePromotionStore.ts]]]]
- [[[[next.config.ts]]]]
- [[[[env.ts]]]]
架构总览
ui-web 通过 App Router 实现页面级路由与并行加载,配合 Zustand 进行轻量状态管理;通过 ECharts 与 Arco Design 提供丰富的可视化与交互控件;通过 Next.js 重写规则对接多后端 bi-* 服务,形成“前端可视化 + 轻状态 + 后端聚合”的架构。
图示来源
- [[[[layout.tsx]]]]
- [[[[AppLayout.tsx]]]]
- [[[[dashboard/page.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[next.config.ts]]]]
- [[[[env.ts]]]]
详细组件分析
App Router 与页面结构
- 动态渲染:根布局强制动态渲染,确保 SSR/ISR 不影响客户端交互。
- 页面组织:dashboard/page.tsx 作为主面板,其他如 analysis/basic 等按功能域划分。
- 响应式网格:Arco Design Grid 提供响应式栅格,适配不同屏幕尺寸。
图示来源
章节来源
布局设计与主框架
- 三段式布局:左侧固定宽度侧边栏、右侧内容区(顶部导航 + 主体滚动区)。
- 浮动聊天按钮:右下角悬浮入口,提升交互可达性。
- 守卫与初始化:登录守卫、请求拦截器、通用与 BI 初始化器贯穿主布局。
图示来源
- [[[[AppLayout.tsx]]]]
- [[[[Sidebar.tsx]]]]
- [[[[TopNav.tsx]]]]
- [[[[FloatingChatButton.tsx]]]]
- [[[[AuthGuard.tsx]]]]
- [[[[RequestInterceptorProvider.tsx]]]]
- [[[[CommonStoreInitializer.tsx]]]]
- [[[[BiInitializer.tsx]]]]
章节来源
Dashboard 网格布局与组件
- 网格系统:Arco Design Grid.Row/Col 提供响应式断点,支持移动端到大屏自适应。
- KPI 卡片:格式化数值、趋势图标与颜色、变化率展示。
- 图表组件:ECharts 封装,支持折线、柱状、饼图、面积图,自动监听窗口 resize。
- 数据表格:动态列生成、分页、边框单元格样式。
- 实时图表:基于时间序列的增量更新,保持滑动窗口长度。
图示来源
- [[[[dashboard/page.tsx]]]]
- [[[[KPICard.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[DataTable.tsx]]]]
- [[[[RealtimeChart.tsx]]]]
章节来源
状态管理与组件通信(Zustand)
- Store 组织:按领域拆分 store,避免全局状态臃肿。
- 订阅与派发:组件通过 hook 订阅 store,触发动作更新状态。
- 通信模式:跨组件共享筛选条件、选中项、实时数据等,减少 props drilling。
图示来源
- [[[[dashboard/page.tsx]]]]
- [[[[useBiStore.ts]]]]
- [[[[useCommonStore.ts]]]]
- [[[[useSitePromotionStore.ts]]]]
- [[[[next.config.ts]]]]
章节来源
可拖拽组件与网格系统
- 可拖拽能力:仓库包含 @dnd-kit 相关依赖,可用于实现仪表板小部件的拖拽排序与布局。
- 网格系统:Arco Design Grid 提供响应式栅格,结合卡片容器实现模块化布局。
- 实践建议:将每个可视化组件封装为可拖拽块,通过 store 记录布局元数据,实现持久化布局。
章节来源
实时数据展示机制
- 数据源:dashboard 页面内置定时器模拟实时数据更新,生产环境替换为 WebSocket 或轮询。
- 展示策略:滑动窗口保留最近 N 个点,移除最旧点并追加新点,保证图表流畅滚动。
- 性能要点:限制数据点数量、节流 resize 事件、在组件卸载时清理定时器与图表实例。
图示来源
章节来源
响应式设计与主题切换
- 响应式:Arco Design Grid 断点与 Flex 布局,适配移动端到桌面端。
- 主题:通过 CSS 变量与 Arco Design 主题系统实现浅色/深色主题切换(需在工程中启用对应配置)。
- 字体:Geist 字体变量注入,保证一致排版体验。
章节来源
国际化支持
- 当前项目未发现独立的 i18n 配置文件或语言包;若需要国际化,建议引入 next-i18next 或类似方案,并在 App Router 中按页面维度配置语言切换。
章节来源
组件开发指南
- 基础组件:遵循受控/非受控模式,暴露最小必要 props,内部处理状态与副作用。
- 可视化组件:封装 ECharts 初始化/销毁与 resize 监听,避免内存泄漏。
- 表格组件:动态列生成、分页参数标准化、rowKey 设定。
- 交互守卫:登录态校验、权限拦截、请求拦截器统一处理错误与重试。
章节来源
- [[[[KPICard.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[DataTable.tsx]]]]
- [[[[AuthGuard.tsx]]]]
- [[[[RequestInterceptorProvider.tsx]]]]
API 接口调用示例
- 重写规则:Next.js 在非网关模式下将 /api/* 重写到各 bi-* 服务地址,便于本地联调与多服务聚合。
- 环境配置:通过 env.ts 读取运行时环境,决定代理目标与开关。
- 调用流程:页面组件发起请求 -> RequestInterceptorProvider 统一拦截 -> next.config.ts 重写 -> bi-* 服务返回。
图示来源
章节来源
与后端 bi-* 服务的集成
- 服务范围:/api/v1/tenant、/api/v1/anls、/api/v1/basic、/api/v1/sys、/api/v1/auth 等。
- 集成方式:通过 next.config.ts 的 rewrite 将前端请求代理到对应 bi-* 服务,实现统一入口与跨域处理。
- 数据流:前端页面 -> Store -> API 层 -> 服务层 -> 数据库/缓存,返回结果回填 UI。
章节来源
依赖关系分析
图示来源
- [[[[package.json]]]]
- [[[[next.config.ts]]]]
- [[[[layout.tsx]]]]
- [[[[AppLayout.tsx]]]]
- [[[[dashboard/page.tsx]]]]
章节来源
性能考虑
- 图表性能:ECharts 实例在组件卸载时释放,避免内存泄漏;监听 resize 时进行节流。
- 网格与滚动:主内容区使用 overflow auto,避免布局抖动;卡片容器设置最小高度与内边距。
- 状态管理:Zustand 仅存储必要状态,避免过度订阅;组件按需订阅,减少重渲染。
- 资源优化:Arco Design 包启用 transpilePackages 与 optimizePackageImports,降低打包体积与循环依赖风险。
- 缓存与懒加载:对不常访问的功能采用懒加载与缓存策略,缩短首屏时间。
章节来源
故障排查指南
- 登录态异常:检查 AuthGuard 是否正确包裹页面,确认登录状态与 Token 传递链路。
- 请求拦截失败:确认 RequestInterceptorProvider 是否在 AppLayout 中启用,next.config.ts 重写是否生效。
- 图表不显示:检查 ECharts 初始化时机与容器尺寸,确保在组件挂载后执行初始化并在卸载时 dispose。
- 网格布局错位:检查 Arco Design Grid 的断点与 Col span 设置,确认父容器的 flex 与 overflow 配置。
- 环境变量问题:核对 NEXT_PUBLIC_APP_ENV 与 config/env.ts 的映射,确认代理 URL 正确。
章节来源
- [[[[AuthGuard.tsx]]]]
- [[[[RequestInterceptorProvider.tsx]]]]
- [[[[ChartComponent.tsx]]]]
- [[[[AppLayout.tsx]]]]
- [[[[next.config.ts]]]]
- [[[[env.ts]]]]
结论
ui-web 租户控制台以 Next.js 16 + React 19 为基础,结合 Arco Design 与 ECharts 构建了高可用的可视化界面;通过 App Router 的页面化组织与 Zustand 的轻量状态管理,实现了清晰的职责分离与良好的扩展性。配合统一的 API 重写与拦截器,能够高效对接多后端 bi-* 服务。建议后续完善国际化、可拖拽布局持久化与主题切换配置,进一步提升用户体验与可维护性。
附录
- 学习路径建议
- 基础:阅读 layout.tsx 与 AppLayout.tsx,理解主框架与上下文。
- 组件:学习 KPICard/ChartComponent/DataTable 的封装与使用。
- 状态:掌握 useBiStore/useCommonStore/useSitePromotionStore 的订阅与更新。
- 路由:熟悉 dashboard/page.tsx 的网格布局与数据流。
- 集成:研究 next.config.ts 的重写规则与 API 层调用。
- 进阶:引入可拖拽布局、主题切换、国际化与性能优化实践。
章节来源