# 仓库指南 ## 项目概述 NetBird Dashboard 是 NetBird 管理服务的 Web 界面。这是一个 Next.js 应用程序,为 NetBird 网络提供网络管理、对等节点监控、访问控制和配置功能。 **在线版本:** https://app.netbird.io/ **源代码:** https://github.com/netbirdio/dashboard ## 架构与数据流 ### 技术栈 - **框架:** Next.js 13+ 使用 App Router - **语言:** TypeScript - **样式:** Tailwind CSS + shadcn/ui 组件 - **状态管理:** React Context + SWR 用于服务器状态 - **认证:** OIDC 通过 @axa-fr/react-oidc - **国际化:** next-intl - **测试:** Cypress (E2E) - **部署:** Docker + Nginx ### 高级结构 ``` src/ ├── app/ # Next.js App Router 页面 │ ├── (dashboard)/ # 主仪表板路由(分组布局) │ ├── (remote-access)/ # 远程访问路由 │ ├── install/ # 安装向导 │ ├── invite/ # 用户邀请流程 │ └── setup/ # 初始设置流程 ├── assets/ # 静态资源(图标、图片、字体) ├── auth/ # OIDC 认证组件 ├── components/ # 共享 UI 组件(基于 shadcn/ui) ├── contexts/ # React Context 提供者 ├── hooks/ # 自定义 React 钩子 ├── i18n/ # 国际化配置和消息 ├── interfaces/ # TypeScript 类型定义 ├── layouts/ # 布局组件 ├── modules/ # 功能模块(领域特定) └── utils/ # 工具函数 ``` ### 数据流 1. **认证:** OIDC 提供者处理认证 → 令牌存储在内存中 2. **API 调用:** `useFetchApi` 钩子 → SWR → OIDC 请求 → 管理 API 3. **状态:** 服务器状态通过 SWR 缓存,UI 状态通过 React Context 4. **渲染:** 默认使用服务器组件,需要时使用客户端组件 ## 关键目录 ### `src/app/` - 页面和路由 - 使用 Next.js App Router 和路由分组 - `(dashboard)/` 包含主要应用页面和共享布局 - 每个路由有 `page.tsx` 和可选的 `layout.tsx` - 通过 `error/page.tsx` 实现错误边界 ### `src/modules/` - 功能模块 按功能组织的领域特定组件: - `peers/` - 对等节点管理组件 - `networks/` - 网络配置 - `access-control/` - ACL 策略 - `dns/` - DNS 管理 - `routes/` - 网络路由 - `users/` - 用户管理 - `groups/` - 分组管理 - `setup-keys/` - 设置密钥管理 - `activity/` - 活动日志 - `settings/` - 账户设置 ### `src/components/` - 共享 UI 组件 基于 shadcn/ui 构建,具有自定义变体: - `Input.tsx` - 带验证的表单输入 - `Select.tsx` - 下拉选择 - `Dialog.tsx` - 模态对话框 - `Table.tsx` - 数据表格 - `Button.tsx` - 操作按钮 - `Badge.tsx` - 状态徽章 - `Tooltip.tsx` - 信息提示 ### `src/contexts/` - 状态提供者 全局状态的 React Context 提供者: - `ApplicationProvider.tsx` - 应用级配置 - `PeersProvider.tsx` - 对等节点数据 - `GroupsProvider.tsx` - 分组数据 - `RoutesProvider.tsx` - 路由数据 - `PoliciesProvider.tsx` - ACL 策略 - `PermissionsProvider.tsx` - 用户权限 - `GlobalThemeProvider.tsx` - 主题管理 - `LocaleProvider.tsx` - 语言/区域设置 ### `src/hooks/` - 自定义钩子 可复用的 React 钩子: - `useLocalStorage.tsx` - 持久化本地存储 - `useDebounce.tsx` - 防抖值 - `useSearch.ts` - 搜索功能 - `useCopyToClipboard.ts` - 剪贴板操作 - `useElementSize.ts` - DOM 元素尺寸 - `useIntersectionObserver.ts` - 可见性检测 ### `src/interfaces/` - 类型定义 领域模型的 TypeScript 接口: - `Peer.ts` - 网络对等节点 - `Group.ts` - 对等节点分组 - `Route.ts` - 网络路由 - `Nameserver.ts` - DNS 名称服务器 - `Account.ts` - 用户账户 - `SetupKey.ts` - 设置密钥 - `AccessToken.ts` - API 访问令牌 ### `src/utils/` - 工具函数 辅助函数: - `api.tsx` - 集成 SWR 的 API 客户端 - `helpers.ts` - 通用工具(cn, randomString 等) - `config.ts` - 配置加载器 - `ip.ts` - IP 地址工具 - `wireguard.ts` - WireGuard 辅助函数 - `version.ts` - 版本比较 ## 开发命令 ```bash # 安装依赖 npm install # 启动开发服务器(端口 3000) npm run dev # 使用 Turbopack 启动(更快) npm run turbo # 构建生产版本 npm run build # 启动生产服务器 npm start # 运行代码检查 npm run lint # 打开 Cypress 测试运行器 npm run cypress:open # 复制 OIDC 服务工作者(认证必需) npm run copy npm run copytrusted ``` ## 代码规范和常见模式 ### 组件模式 ```tsx // 使用 shadcn/ui 和 class-variance-authority 实现变体 import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "@utils/helpers"; const buttonVariants = cva("base-classes", { variants: { variant: { default: "default-classes", destructive: "destructive-classes", }, }, }); interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps {} export function Button({ className, variant, ...props }: ButtonProps) { return (