Skip to content

ui-web 租户控制台

**本文引用的文件** - [[package.json]](../file/ui-web/package.json) - [[next.config.ts]](../file/ui-web/next.config.ts) - [[layout.tsx]](../file/ui-web/src/app/layout.tsx) - [[AppLayout.tsx]](../file/ui-web/src/components/layout/applayout.tsx) - [[dashboard/page.tsx]](../file/ui-web/src/app/dashboard/page.tsx) - [[KPICard.tsx]](../file/ui-web/src/components/kpicard.tsx) - [[ChartComponent.tsx]](../file/ui-web/src/components/chartcomponent.tsx) - [[DataTable.tsx]](../file/ui-web/src/components/datatable.tsx) - [[index.ts]](../file/ui-web/src/store/index.ts) - [[useBiStore.ts]](../file/ui-web/src/store/usebistore.ts) - [[useCommonStore.ts]](../file/ui-web/src/store/usecommonstore.ts) - [[useSitePromotionStore.ts]](../file/ui-web/src/store/usesitepromotionstore.ts) - [[env.ts]](../file/ui-web/src/config/env.ts) - [[AuthGuard.tsx]](../file/ui-web/src/components/authguard.tsx) - [[FloatingChatButton.tsx]](../file/ui-web/src/components/floatingchatbutton.tsx) - [[RequestInterceptorProvider.tsx]](../file/ui-web/src/components/providers/requestinterceptorprovider.tsx) - [[NavigationContext.tsx]](../file/ui-web/src/context/navigationcontext.tsx) - [[ChatContext.tsx]](../file/ui-web/src/context/chatcontext.tsx) - [[CommonStoreInitializer.tsx]](../file/ui-web/src/components/common/commonstoreinitializer.tsx) - [[BiInitializer.tsx]](../file/ui-web/src/components/common/biinitializer.tsx) - [[Sidebar.tsx]](../file/ui-web/src/components/layout/sidebar.tsx) - [[TopNav.tsx]](../file/ui-web/src/components/layout/topnav.tsx) - [[RealtimeChart.tsx]](../file/ui-web/src/components/realtimechart.tsx) - [[hooks/table.ts]](../file/ui-web/src/hooks/table.ts) - [[hooks/useECharts.ts]](../file/ui-web/src/hooks/useecharts.ts) - [[hooks/useWidgetDateRange.ts]](../file/ui-web/src/hooks/usewidgetdaterange.ts) - [[hooks/usePersonalization.ts]](../file/ui-web/src/hooks/usepersonalization.ts) - [[hooks/useBizStatus.ts]](../file/ui-web/src/hooks/usebizstatus.ts) - [[hooks/useCollect.ts]](../file/ui-web/src/hooks/usecollect.ts) - [[hooks/useCustomMetrics.ts]](../file/ui-web/src/hooks/usecustommetrics.ts) - [[hooks/useTableFieldUtils.ts]](../file/ui-web/src/hooks/usetablefieldutils.ts) - [[hooks/useTableGrouping.ts]](../file/ui-web/src/hooks/usetablegrouping.ts) - [[hooks/useLineChartParams.ts]](../file/ui-web/src/hooks/uselinechartparams.ts) - [[api目录]](../file/ui-web/src/api) - [[mock目录]](../file/ui-web/src/mock) - [[public目录]](../file/ui-web/public)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件为 ui-web 租户控制台的系统化技术文档,面向前端工程师与全栈开发者,覆盖应用架构、App Router 路由体系、页面与布局设计、Dashboard 网格布局与可拖拽组件、实时数据展示、状态管理(Zustand)、响应式与主题、国际化、组件开发规范、API 调用示例以及与后端 bi-* 服务的集成方式与数据流处理。文档同时提供从基础组件使用到复杂 dashboard 构建的学习路径。

项目结构

ui-web 采用 Next.js 16 + React 19 的 App Router 架构,结合 TypeScript、TailwindCSS、Arco Design、ECharts、Zustand 等技术栈,围绕租户控制台场景构建可视化与交互能力。

图示来源

章节来源

核心组件

  • 根布局与字体:全局字体变量注入、强制动态渲染、图标字体引入。
  • 主布局容器:侧边栏、顶部导航、主内容区、浮动聊天按钮、鉴权与初始化。
  • 仪表板页面:网格布局、KPI 卡片、折线/柱状/饼图、实时图表、表格。
  • 状态管理:Zustand Store 组合,按功能域拆分(BI、通用、站点推广)。
  • 请求拦截与环境配置:统一重写规则、代理目标、运行时环境切换。
  • 上下文与守卫:导航、聊天、请求拦截、登录守卫。

章节来源

架构总览

ui-web 通过 App Router 实现页面级路由与并行加载,配合 Zustand 进行轻量状态管理;通过 ECharts 与 Arco Design 提供丰富的可视化与交互控件;通过 Next.js 重写规则对接多后端 bi-* 服务,形成“前端可视化 + 轻状态 + 后端聚合”的架构。

图示来源

详细组件分析

App Router 与页面结构

  • 动态渲染:根布局强制动态渲染,确保 SSR/ISR 不影响客户端交互。
  • 页面组织:dashboard/page.tsx 作为主面板,其他如 analysis/basic 等按功能域划分。
  • 响应式网格:Arco Design Grid 提供响应式栅格,适配不同屏幕尺寸。

图示来源

章节来源

布局设计与主框架

  • 三段式布局:左侧固定宽度侧边栏、右侧内容区(顶部导航 + 主体滚动区)。
  • 浮动聊天按钮:右下角悬浮入口,提升交互可达性。
  • 守卫与初始化:登录守卫、请求拦截器、通用与 BI 初始化器贯穿主布局。

图示来源

章节来源

Dashboard 网格布局与组件

  • 网格系统:Arco Design Grid.Row/Col 提供响应式断点,支持移动端到大屏自适应。
  • KPI 卡片:格式化数值、趋势图标与颜色、变化率展示。
  • 图表组件:ECharts 封装,支持折线、柱状、饼图、面积图,自动监听窗口 resize。
  • 数据表格:动态列生成、分页、边框单元格样式。
  • 实时图表:基于时间序列的增量更新,保持滑动窗口长度。

图示来源

章节来源

状态管理与组件通信(Zustand)

  • Store 组织:按领域拆分 store,避免全局状态臃肿。
  • 订阅与派发:组件通过 hook 订阅 store,触发动作更新状态。
  • 通信模式:跨组件共享筛选条件、选中项、实时数据等,减少 props drilling。

图示来源

章节来源

可拖拽组件与网格系统

  • 可拖拽能力:仓库包含 @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 设定。
  • 交互守卫:登录态校验、权限拦截、请求拦截器统一处理错误与重试。

章节来源

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。

章节来源

依赖关系分析

图示来源

章节来源

性能考虑

  • 图表性能: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 正确。

章节来源

结论

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 层调用。
    • 进阶:引入可拖拽布局、主题切换、国际化与性能优化实践。

章节来源