🔔欢迎

HaloLight 多框架管理后台文档已上线!

支持 12+ 框架版本,欢迎体验。

Skip to content

Next.js 版本

HaloLight Next.js 版本基于 Next.js 14 App Router 构建,采用 React 18 + TypeScript。

在线预览https://halolight.h7ml.cn/

GitHubhttps://github.com/halolight/halolight

技术栈

技术版本说明
Next.js14.xReact 全栈框架 (App Router)
React18.xUI 库
TypeScript5.x类型安全
Tailwind CSS4.x原子化 CSS
shadcn/uilatestUI 组件库 (28 组件)
Zustand5.x状态管理 (6 Store)
TanStack Query5.x服务端状态
React Hook Form7.x表单处理
Zod4.x数据验证
react-grid-layout1.x拖拽布局
Recharts3.x图表可视化
Framer Motion12.x动画效果
Mock.js1.x数据模拟
next-pwa5.xPWA 支持

目录结构

halolight/
├── src/
│   ├── app/                      # App Router 页面
│   │   ├── (auth)/              # 认证路由组
│   │   │   ├── login/           # 登录
│   │   │   ├── register/        # 注册
│   │   │   ├── forgot-password/ # 忘记密码
│   │   │   ├── reset-password/  # 重置密码
│   │   │   └── layout.tsx       # 认证布局
│   │   ├── (dashboard)/         # 仪表盘路由组
│   │   │   ├── page.tsx         # 仪表盘首页(可配置)
│   │   │   ├── accounts/        # 账户与权限
│   │   │   ├── analytics/       # 数据分析
│   │   │   ├── calendar/        # 日程管理
│   │   │   ├── docs/            # 帮助文档
│   │   │   ├── documents/       # 文档管理
│   │   │   ├── files/           # 文件存储
│   │   │   ├── messages/        # 消息中心
│   │   │   ├── notifications/   # 通知中心
│   │   │   ├── profile/         # 个人资料
│   │   │   ├── users/           # 用户管理
│   │   │   ├── settings/        # 系统设置
│   │   │   │   └── teams/       # 团队管理
│   │   │   │       └── roles/   # 角色管理
│   │   │   └── layout.tsx       # 仪表盘布局
│   │   ├── (legal)/             # 法律条款路由组
│   │   │   ├── privacy/         # 隐私政策
│   │   │   ├── terms/           # 服务条款
│   │   │   └── layout.tsx
│   │   ├── layout.tsx           # 根布局
│   │   ├── error.tsx            # 错误页面
│   │   └── not-found.tsx        # 404 页面
│   ├── components/
│   │   ├── ui/                  # shadcn/ui 组件 (28 个)
│   │   ├── layout/              # 布局组件 (11 个)
│   │   │   ├── admin-layout.tsx # 管理后台布局
│   │   │   ├── sidebar.tsx      # 可折叠侧边栏
│   │   │   ├── header.tsx       # 页头(通知/错误/用户菜单)
│   │   │   ├── footer.tsx       # 页脚
│   │   │   ├── tab-bar.tsx      # 多标签导航
│   │   │   ├── command-menu.tsx # 命令面板 (⌘K)
│   │   │   ├── quick-settings.tsx # 界面设置面板
│   │   │   ├── theme-toggle.tsx # 主题切换
│   │   │   └── pending-overlay.tsx # 加载遮罩
│   │   ├── dashboard/           # 仪表盘组件
│   │   │   ├── configurable-dashboard.tsx # 可配置仪表盘
│   │   │   ├── charts.tsx       # 图表组件
│   │   │   ├── stats-card.tsx   # 统计卡片
│   │   │   └── recent-activity.tsx # 最近活动
│   │   └── shared/              # 共享组件
│   ├── hooks/                   # React Hooks (15 个)
│   │   ├── use-users.ts         # 用户 CRUD
│   │   ├── use-teams.ts         # 团队管理
│   │   ├── use-messages.ts      # 消息管理
│   │   ├── use-notifications.ts # 通知管理
│   │   ├── use-calendar.ts      # 日历数据
│   │   ├── use-documents.ts     # 文档管理
│   │   ├── use-files.ts         # 文件管理
│   │   ├── use-dashboard.ts     # 仪表盘状态
│   │   ├── use-dashboard-data.ts # 仪表盘数据 Hook 集合
│   │   ├── use-chart-palette.ts # 图表配色(主题感知)
│   │   ├── use-action-mutation.ts # Server Action 封装
│   │   ├── use-keep-alive.tsx   # 页面状态缓存
│   │   ├── use-tdk.ts           # TDK 管理
│   │   └── use-title.ts         # 页面标题
│   ├── stores/                  # Zustand Stores (6 个)
│   │   ├── auth-store.ts        # 认证状态(含多账户)
│   │   ├── ui-settings-store.ts # UI 设置
│   │   ├── dashboard-store.ts   # 仪表盘状态
│   │   ├── navigation-store.ts  # 导航状态
│   │   ├── tabs-store.ts        # 标签页状态
│   │   └── error-store.ts       # 错误收集
│   ├── providers/               # React Providers (8 个)
│   │   ├── app-providers.tsx    # Provider 聚合
│   │   ├── auth-provider.tsx    # 认证 Provider
│   │   ├── theme-provider.tsx   # 主题 Provider
│   │   ├── query-provider.tsx   # TanStack Query
│   │   ├── error-provider.tsx   # 错误处理
│   │   ├── permission-provider.tsx # 权限检查
│   │   ├── websocket-provider.tsx # WebSocket 实时通知
│   │   └── keep-alive-provider.tsx # 页面保活
│   ├── actions/                 # Server Actions
│   ├── config/                  # 配置文件
│   │   ├── routes.ts            # 路由与权限配置
│   │   └── tdk.ts               # TDK 配置
│   ├── lib/                     # 工具库
│   │   └── api/                 # API 客户端
│   ├── mock/                    # Mock 数据 (9 模块)
│   └── middleware.ts            # 中间件(认证+安全头)
├── public/
│   ├── manifest.json            # PWA 清单
│   ├── sw.js                    # Service Worker
│   ├── icons/                   # PWA 图标 (8 尺寸)
│   ├── screenshots/             # PWA 截图
│   └── fonts/                   # 自托管字体
├── next.config.mjs              # Next.js + PWA 配置
├── tailwind.config.js
├── tsconfig.json
└── package.json

快速开始

安装

bash
git clone https://github.com/halolight/halolight.git
cd halolight
pnpm install

环境变量

bash
cp .env.example .env.local
env
# .env.local 示例
NEXT_PUBLIC_API_URL=/api
NEXT_PUBLIC_MOCK=true              # 开启 Mock 数据
NEXT_PUBLIC_DEMO_EMAIL=admin@halolight.h7ml.cn
NEXT_PUBLIC_DEMO_PASSWORD=123456
NEXT_PUBLIC_SHOW_DEMO_HINT=false
NEXT_PUBLIC_WS_URL=                # WebSocket 地址
NEXT_PUBLIC_APP_TITLE=Admin Pro
NEXT_PUBLIC_BRAND_NAME=Halolight

启动开发

bash
pnpm dev

访问 http://localhost:3000

构建生产

bash
pnpm build
pnpm start

核心功能

1。可配置仪表盘

支持 9 种小部件类型,可自由拖拽、调整大小、添加删除:

小部件类型说明数据来源
stats数据统计卡片(4 指标)useDashboardStats
chart-line折线图(访问趋势)useDashboardVisits
chart-bar柱状图(销售统计)useDashboardSales
chart-pie饼图(流量占比)useDashboardPie
recent-users最近用户列表useDashboardUsers
notifications通知列表useDashboardNotifications
tasks待办任务useDashboardTasks
calendar今日日程useDashboardCalendar
quick-actions快捷操作入口静态配置
tsx
// 仪表盘编辑模式
const { isEditing, setIsEditing, addWidget, removeWidget, resetToDefault } = useDashboardStore()

// 响应式布局 (列数自动适配)
// lg: 12列, md: 8列, sm: 4列, xs: 2列, mobile: 1列

2。多账户认证系统

tsx
// stores/auth-store.ts
interface AuthState {
  user: AccountWithToken | null
  accounts: AccountWithToken[]        // 多账户列表
  activeAccountId: string | null      // 当前账户

  login: (data: LoginRequest) => Promise<void>
  register: (data: RegisterRequest) => Promise<void>
  logout: () => Promise<void>
  switchAccount: (accountId: string) => Promise<void>  // 快速切换账户
  forgotPassword: (email: string) => Promise<void>
  resetPassword: (token: string, password: string) => Promise<void>
  checkAuth: () => Promise<void>
}

// 使用 Cookie 存储 Token,支持"记住我"(7天/1天)
Cookies.set("token", response.token, {
  expires: data.remember ? 7 : 1,
  secure: process.env.NODE_ENV === "production",
  sameSite: "strict",
})

3。多标签导航

tsx
// stores/tabs-store.ts
interface Tab {
  id: string
  title: string
  path: string
  icon?: string
  closable?: boolean  // 首页不可关闭
}

// 右键菜单功能
- 刷新页面
- 关闭标签
- 关闭其他
- 关闭右侧
- 关闭所有

4。页面状态缓存 (Keep-Alive)

tsx
// hooks/use-keep-alive.tsx

// 自动保存/恢复滚动位置
useScrollRestore()

// 保存表单状态
const [values, saveValues, clearCache] = useFormCache('filter-form', initialValues)

// 保存自定义状态
const [state, setState] = useStateCache('my-key', initialValue)

5。命令面板 (⌘K)

支持键盘快速导航、主题切换、账户切换、退出登录等操作。

6。界面设置面板

tsx
// 主题模式
setTheme('light' | 'dark' | 'system')

// 皮肤切换(带 View Transitions 动画)
setSkin(skinPreset)

// 布局控制
setShowFooter(boolean)      // 显示/隐藏底部
setShowTabBar(boolean)      // 显示/隐藏标签栏
setMobileHeaderFixed(boolean)   // 移动端固定头部
setMobileTabBarFixed(boolean)   // 移动端固定标签栏

7。实时通知 (WebSocket)

tsx
// providers/websocket-provider.tsx
const { status, lastMessage, sendMessage, reconnect } = useWebSocket()

// 监听新通知
useRealtimeNotifications((notification) => {
  console.log('新通知:', notification)
})

8。权限系统

tsx
// 路由权限配置
export const ROUTE_PERMISSIONS: Record<string, Permission> = {
  "/": "dashboard:view",
  "/users": "users:view",
  "/analytics": "analytics:view",
  // ...
}

// 权限检查
const { hasPermission } = usePermission()
if (hasPermission("users:delete")) {
  // 显示删除按钮
}

// 权限守卫组件
<PermissionGuard permission="users:delete" fallback={<Disabled />}>
  <DeleteButton />
</PermissionGuard>

皮肤预设

支持 11 种皮肤预设,带实时预览和平滑过渡动画:

预设名称说明
defaultShadcn · Neutral官方默认中性色
blueShadcn · Blue蓝色主色 + Charts 冷色调
emeraldShadcn · Emerald清新绿色,适合数据展示
amberShadcn · Amber琥珀/橙色,温暖明快
violetShadcn · Violet紫色高饱和,科技感
roseShadcn · Rose玫红主色,图表撞色
tealShadcn · Teal青色主色,现代感
slateShadcn · Slate低饱和灰蓝,工具感
ocean旧 · 深海蓝蓝绿渐变
sunset旧 · 暮光橙橙粉撞色
aurora旧 · 极光绿青绿 + 紫色

UI 组件

基于 shadcn/ui,已集成 28 个组件:

  • 表单:Button,Input,InputClear,Textarea,Select,Checkbox,Switch,Label
  • 数据展示:Table,Card,Badge,Avatar,Skeleton
  • 反馈:Dialog,Sheet,AlertDialog,Tooltip,Popover
  • 导航:Tabs,DropdownMenu,ContextMenu,Command,ScrollArea
  • 布局:Separator
  • 增强:BackToTop,CookieConsent,CommandInputClear,InputClearForm

页面路由

路径页面权限
/重定向到仪表盘-
/login登录公开
/register注册公开
/forgot-password忘记密码公开
/reset-password重置密码公开
/dashboard可配置仪表盘dashboard:view
/accounts账号与权限settings:view
/analytics数据分析analytics:view
/calendar日程管理calendar:view
/documents文档管理documents:view
/files文件存储files:view
/messages消息中心messages:view
/notifications通知中心notifications:view
/users用户管理users:view
/settings系统设置settings:view
/settings/teams团队设置settings:view
/settings/teams/roles角色管理settings:view
/profile个人资料settings:view
/docs帮助文档documents:view
/privacy隐私政策公开
/terms服务条款公开

PWA 支持

项目已完整集成 PWA 功能:

配置

js
// next.config.mjs
import withPWA from "next-pwa"

const pwaConfig = withPWA({
  dest: "public",
  register: true,
  skipWaiting: true,
  disable: process.env.NODE_ENV === "development",
  runtimeCaching: [
    // 字体缓存 (1年)
    { urlPattern: /\.(?:woff|woff2|ttf)$/i, handler: "CacheFirst", ... },
    // 图片缓存 (24小时)
    { urlPattern: /\.(?:jpg|png|svg|webp)$/i, handler: "StaleWhileRevalidate", ... },
    // Next.js 静态资源 (1年)
    { urlPattern: /\/_next\/static\/.+\.(js|css)$/i, handler: "CacheFirst", ... },
    // 页面数据 (1小时)
    { urlPattern: /\/_next\/data\/.+\.json$/i, handler: "NetworkFirst", ... },
  ],
})

功能特性

  • 离线访问:Service Worker 缓存静态资源
  • 安装到桌面:支持 Add to Home Screen
  • 自托管字体:Inter + JetBrains Mono
  • 图标支持:8 种尺寸 (72x72 ~ 512x512)
  • 截图展示:桌面端 + 移动端

manifest.json

json
{
  "name": "Admin Pro 后台管理系统",
  "short_name": "Admin Pro",
  "display": "standalone",
  "orientation": "portrait-primary",
  "categories": ["business", "productivity"],
  "lang": "zh-CN"
}

安全特性

中间件安全头

ts
// middleware.ts
response.headers.set("Content-Security-Policy", csp)
response.headers.set("X-Content-Type-Options", "nosniff")
response.headers.set("X-Frame-Options", "DENY")
response.headers.set("Referrer-Policy", "strict-origin-when-cross-origin")
response.headers.set("X-XSS-Protection", "1; mode=block")
response.headers.set("Permissions-Policy", "camera=(), microphone=(), geolocation=()")

认证保护

  • Cookie 安全属性 (securesameSite: strict)
  • 已登录用户不能访问登录页
  • 未登录用户重定向到登录页 (带 redirect 参数)

构建优化

js
// next.config.mjs
{
  // 包导入优化 - 减少打包体积
  experimental: {
    optimizePackageImports: [
      "@radix-ui/react-*",
      "lucide-react",
      "framer-motion",
      "@tanstack/react-query",
      "recharts",
      "zustand",
    ],
  },

  // 生产环境移除 console
  compiler: {
    removeConsole: { exclude: ["error", "warn"] },
  },

  // 关闭 source map
  productionBrowserSourceMaps: false,

  // 图片优化
  images: {
    formats: ["image/avif", "image/webp"],
  },
}

部署

Vercel (推荐)

bash
vercel

Docker

dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]

Cloudflare Pages

项目支持部署到 Cloudflare Pages,详见 Cloudflare 版本

bash
pnpm cf:build
pnpm cf:deploy

静态导出

bash
# next.config.mjs
export default { output: 'export' }

pnpm build
# 输出到 out/ 目录