1. 概述

1.1 项目背景

本项目是一个 设计模式图文学习系统,旨在通过图文并茂的形式,帮助开发者系统化学习 23 种经典的 GoF 设计模式。系统以卡片式布局展示设计模式,支持分类筛选、关键词搜索,并提供了每种模式的核心思想、应用场景、经典案例及代码示例。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2 项目目标

目标 说明
内容全面 覆盖 23 种经典设计模式(5 创建型 + 7 结构型 + 11 行为型)
图文并茂 每种设计模式配有精心设计的插图
交互友好 支持分类过滤、关键词搜索、详情弹窗
响应式布局 适配桌面端、平板端、移动端
可扩展 数据层与 UI 层解耦,便于扩展新模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 设计模式覆盖

分类 数量 模式列表
创建型 (Creational) 5 单例、工厂、抽象工厂、建造者、原型
结构型 (Structural) 7 适配器、装饰器、代理、外观、桥接、组合、享元
行为型 (Behavioral) 11 观察者、策略、命令、责任链、状态、模板方法、迭代器、访问者、中介者、备忘录、解释器

2. 技术栈

2.1 核心技术

技术 版本 用途
Next.js ^16.1.1 React 全栈框架,SSR/SSG/Standalone
React ^19.0.0 UI 渲染框架
TypeScript ^5 类型安全
Tailwind CSS ^4 原子化 CSS 框架
shadcn/ui 基于 Radix UI 的组件库
Bun JavaScript/TypeScript 运行时与包管理
Prisma ^6.11.1 ORM 数据库访问层
SQLite 嵌入式关系型数据库
Caddy 反向代理 Web 服务器

2.2 关键依赖

依赖 用途
framer-motion 页面动画与过渡效果
recharts 数据可视化图表
react-markdown Markdown 内容渲染
react-syntax-highlighter 代码语法高亮
zustand 轻量级状态管理
@tanstack/react-query 服务端状态/缓存管理
next-auth 认证鉴权
next-intl 国际化支持
@dnd-kit 拖拽排序功能
lucide-react SVG 图标库
zod 运行时数据校验

3. 系统架构

3.1 整体架构图

┌─────────────────────────────────────────────────────────┐
│                       Caddy (Port 81)                    │
│                   反向代理 & 路由转发                      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌──────────────────┐    ┌──────────────────────────┐   │
│  │   Next.js App     │    │     Mini-Services          │   │
│  │   (Port 3000)     │    │   (独立后端微服务)           │   │
│  │                   │    │                            │   │
│  │  ┌─────────────┐  │    │  ┌──────────────────────┐  │   │
│  │  │  React 页面   │  │    │  │  Service A            │  │   │
│  │  │  (SSR/CSR)   │  │    │  │  (bun run dev)        │  │   │
│  │  └──────┬──────┘  │    │  └──────────────────────┘  │   │
│  │         │         │    │                            │   │
│  │  ┌──────▼──────┐  │    │  ┌──────────────────────┐  │   │
│  │  │  API Routes  │  │    │  │  Service B            │  │   │
│  │  │  (/api/*)    │  │    │  │  (bun run dev)        │  │   │
│  │  └──────┬──────┘  │    │  └──────────────────────┘  │   │
│  │         │         │    │                            │   │
│  │  ┌──────▼──────┐  │    │                            │   │
│  │  │   Prisma     │  │    │                            │   │
│  │  │   ORM        │  │    │                            │   │
│  │  └──────┬──────┘  │    │                            │   │
│  │         │         │    │                            │   │
│  │  ┌──────▼──────┐  │    │                            │   │
│  │  │   SQLite     │  │    │                            │   │
│  │  │   (custom.db)│  │    │                            │   │
│  │  └─────────────┘  │    │                            │   │
│  └──────────────────┘    └──────────────────────────┘   │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.2 架构分层

┌──────────────────────────────────────────────┐
│              表示层 (Presentation)              │
│  page.tsx  │  layout.tsx  │  UI Components     │
├──────────────────────────────────────────────┤
│             业务逻辑层 (Business Logic)         │
│  design-patterns.ts  │  Hooks  │  State       │
├──────────────────────────────────────────────┤
│              数据访问层 (Data Access)           │
│  Prisma Client  │  db.ts  │  SQL              │
├──────────────────────────────────────────────┤
│              数据存储层 (Data Storage)          │
│  SQLite (custom.db)  │  Static JSON/TS Data   │
├──────────────────────────────────────────────┤
│            基础设施层 (Infrastructure)          │
│  Caddy  │  Next.js Server  │  Bun Runtime     │
└──────────────────────────────────────────────┘

3.3 数据流

用户交互 → React Component → State/Hook → 数据查询
    │                                         │
    ▼                                         ▼
搜索/筛选                        design-patterns.ts (静态数据)
    │                           / API Routes → Prisma → SQLite
    ▼                                         │
重新渲染 UI ← framer-motion 动画 ← ───────────┘

4. 目录结构

my-project/
├── .env                          # 环境变量(DATABASE_URL)
├── .gitignore                    # Git 忽略配置
├── Caddyfile                     # Caddy 反向代理配置
├── bun.lock                      # Bun 依赖锁文件
├── components.json               # shadcn/ui 组件配置
├── next.config.ts                # Next.js 配置
├── package.json                  # 项目依赖与脚本
├── postcss.config.mjs            # PostCSS 配置
├── tailwind.config.ts            # Tailwind CSS 配置
├── tsconfig.json                 # TypeScript 配置
│
├── .zscripts/                    # 构建与部署脚本
│   ├── build.sh                  # 生产构建脚本
│   ├── dev.sh                    # 开发环境启动脚本
│   ├── start.sh                  # 生产环境启动脚本
│   ├── mini-services-install.sh  # Mini-services 依赖安装
│   ├── mini-services-build.sh    # Mini-services 构建
│   ├── mini-services-start.sh    # Mini-services 启动
│   └── dev.pid                   # 开发进程 PID 文件
│
├── db/
│   └── custom.db                 # SQLite 数据库文件
│
├── download/
│   └── README.md                 # 下载说明
│
├── examples/
│   └── websocket/
│       ├── frontend.tsx          # WebSocket 前端示例
│       └── server.ts             # WebSocket 服务端示例
│
├── mini-services/                # 微服务扩展目录
│   └── .gitkeep
│
├── prisma/
│   └── schema.prisma             # Prisma 数据库 Schema
│
├── public/                       # 静态资源
│   ├── logo.svg
│   ├── robots.txt
│   └── patterns/                 # 设计模式插图(23张)
│       ├── singleton.png
│       ├── factory.png
│       ├── abstract-factory.png
│       ├── builder.png
│       ├── prototype.png
│       ├── adapter.png
│       ├── bridge.png
│       ├── composite.png
│       ├── decorator.png
│       ├── facade.png
│       ├── flyweight.png
│       ├── proxy.png
│       ├── observer.png
│       ├── strategy.png
│       ├── command.png
│       ├── chain.png
│       ├── state.png
│       ├── template.png
│       ├── iterator.png
│       ├── visitor.png
│       ├── mediator.png
│       ├── memento.png
│       └── interpreter.png
│
└── src/
    ├── app/
    │   ├── globals.css           # 全局样式(Tailwind + CSS 变量)
    │   ├── layout.tsx            # 根布局(字体、元数据、Toaster)
    │   ├── page.tsx              # 主页面(设计模式展示系统)
    │   └── api/
    │       └── route.ts          # API 路由入口
    │
    ├── components/
    │   └── ui/                   # shadcn/ui 组件(50+)
    │       ├── accordion.tsx
    │       ├── alert-dialog.tsx
    │       ├── badge.tsx
    │       ├── button.tsx
    │       ├── card.tsx
    │       ├── dialog.tsx
    │       ├── input.tsx
    │       ├── scroll-area.tsx
    │       ├── tabs.tsx
    │       └── ... (40+ 其他组件)
    │
    ├── data/
    │   ├── design-patterns.ts    # 设计模式核心数据(23种模式完整信息)
    │   └── pattern-images.ts    # 设计模式图片映射
    │
    ├── hooks/
    │   ├── use-mobile.ts         # 移动端检测 Hook
    │   └── use-toast.ts          # Toast 提示 Hook
    │
    └── lib/
        ├── db.ts                 # Prisma 客户端单例
        └── utils.ts              # 通用工具函数(cn 类名合并)

5. 核心模块设计

5.1 数据层

5.1.1 设计模式数据模型 (design-patterns.ts)
interface DesignPattern {
  id: string;                    // 唯一标识(如 'singleton')
  name: string;                  // 中文名称(如 '单例模式')
  nameEn: string;                // 英文名称(如 'Singleton')
  category: 'creational' | 'structural' | 'behavioral';
  categoryName: string;          // 分类中文名(如 '创建型模式')
  coreIdea: string;              // 核心思想
  applicationScenarios: string[];// 应用场景
  classicCases: string[];        // 经典案例
  description: string;           // 详细描述
  codeExample: string;           // 代码示例(Java 语法高亮)
  imagePrompt: string;           // 图片生成提示词
}
5.1.2 分类信息 (categoryInfo)
const categoryInfo = {
  creational: {
    name: '创建型模式',
    description: '专注于对象创建机制,隐藏创建逻辑...',
    color: 'from-emerald-500 to-teal-600',
    bgColor: 'bg-emerald-50 dark:bg-emerald-950/30',
    borderColor: 'border-emerald-200 dark:border-emerald-800',
    icon: 'Layers',
  },
  structural: { /* 结构型 */ },
  behavioral: { /* 行为型 */ },
};
5.1.3 数据查询接口
函数 参数 返回值 说明
getPatternsByCategory(category) 分类ID DesignPattern[] 按类别获取模式列表
getPatternById(id) 模式ID DesignPattern | undefined 根据ID获取单个模式
searchPatterns(query) 搜索关键词 DesignPattern[] 在名称、核心思想、应用场景中搜索
5.1.4 图片映射 (pattern-images.ts)

将 23 种设计模式 ID 映射到 /public/patterns/ 下的对应图片文件,通过 getPatternImage(id) 函数获取图片路径。


5.2 UI 组件层

5.2.1 shadcn/ui 组件

项目集成 50+ shadcn/ui 组件,基于 Radix UI 原语:

类型 组件
基础组件 Button, Input, Label, Badge, Separator, Skeleton
布局组件 Card, ScrollArea, Resizable, AspectRatio
导航组件 Breadcrumb, NavigationMenu, Pagination, Sidebar, Tabs
表单组件 Checkbox, Form, InputOTP, RadioGroup, Select, Slider, Switch, Textarea, Toggle
浮层组件 AlertDialog, Dialog, Drawer, DropdownMenu, HoverCard, Menubar, Popover, Sheet, Tooltip
反馈组件 Alert, Progress, Skeleton, Sonner, Toast
数据展示 Avatar, Calendar, Carousel, Chart, Command, ContextMenu, Table
辅助组件 Accordion, Collapsible, ToggleGroup
5.2.2 核心页面组件结构
Home (page.tsx)
├── Header(搜索栏 + Logo)
│   ├── Logo(BookOpen 图标 + 标题)
│   └── SearchBar(Input + Search 图标 + 清除按钮)
├── Stats Cards(4 张统计卡片:总模式数 + 三类模式数)
├── Category Filter Pills(分类筛选按钮)
├── Pattern Grid(模式卡片网格)
│   ├── CategorySection(分类展示区域)
│   │   └── PatternCard(设计模式卡片)
│   └── FilteredView(筛选/搜索视图)
└── PatternDetail Dialog(模式详情弹窗)
    ├── Header Image(大图 + 渐隐效果)
    ├── Title & Badge(标题 + 分类标签)
    └── Tabs(概述 / 应用场景 / 经典案例 / 代码示例)

5.3 页面与路由

路由 组件 功能
/ page.tsx 主页面 — 设计模式展示系统
/api/* api/route.ts API 路由入口
layout layout.tsx 根布局(字体、metadata、Toaster)

当前项目为单页应用(SPA)架构,所有设计模式内容在主页面以卡片形式展示,详情通过 Dialog 弹窗呈现。


5.4 状态管理

5.4.1 页面级状态 (React useState + useMemo)
// 搜索状态
const [searchQuery, setSearchQuery] = useState('');

// 选中模式
const [selectedPattern, setSelectedPattern] = useState<DesignPattern | null>(null);

// 活跃分类
const [activeCategory, setActiveCategory] = useState<'creational' | 'structural' | 'behavioral' | 'all'>('all');

// 计算属性(useMemo 缓存)
const filteredPatterns    // 按搜索词和分类筛选
const patternsByCategory  // 按分类分组
const stats              // 统计各分类数量
5.4.2 全局状态 (Zustand + TanStack Query)
  • Zustand (^5.0.6):轻量级全局状态管理,用于跨组件共享状态
  • @tanstack/react-query (^5.82.0):服务端状态管理与请求缓存

5.5 数据库设计

5.5.1 Prisma Schema

使用 SQLite 数据库,通过 Prisma ORM 操作:

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Post {
  id        String   @id @default(cuid())
  title     String
  content   String?
  published Boolean  @default(false)
  authorId  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
5.5.2 数据库操作
用途
User 用户信息(邮箱唯一,支持 name)
Post 文章/帖子(支持发布状态、关联作者)
5.5.3 数据库脚本
命令 说明
bun run db:push 直接推送 Schema 到数据库(开发用)
bun run db:generate 生成 Prisma Client
bun run db:migrate 创建数据库迁移
bun run db:reset 重置数据库

5.6 API 层

API 路由位于 src/app/api/route.ts,基于 Next.js App Router 的 Route Handlers。支架提供了可扩展的 API 端点基础。


5.7 Mini-Services

项目支持通过 mini-services/ 目录挂载独立的微服务扩展:

  • 发现机制:构建脚本扫描 mini-services/ 下所有包含 package.json 的子目录
  • 运行方式:每个服务独立进程,通过 bun run dev 运行
  • 日志输出mini-service-{name}.log
  • 生产构建:通过 mini-services-install.sh 安装依赖 → mini-services-build.sh 构建

6. 设计模式内容模型

6.1 数据示例(单例模式)

{
  "id": "singleton",
  "name": "单例模式",
  "nameEn": "Singleton",
  "category": "creational",
  "categoryName": "创建型模式",
  "coreIdea": "确保一个类只有一个实例,提供一个全局访问点...",
  "applicationScenarios": [
    "配置管理器 - 应用程序只需要一个配置实例",
    "日志记录器 - 统一管理日志输出",
    "数据库连接池 - 控制数据库连接数量",
    "线程池 - 管理线程资源",
    "缓存系统 - 统一的缓存管理"
  ],
  "classicCases": [
    "Windows任务管理器",
    "Java的Runtime类",
    "Spring框架中的Bean默认单例",
    "浏览器中的window对象"
  ],
  "description": "单例模式保证一个类仅有一个实例...",
  "codeExample": "public class Singleton { ... }",
  "imagePrompt": "A minimalist illustration of a single glowing cube..."
}

6.2 内容结构

每种设计模式包含 7 个信息维度

  1. 核心思想 — 一句话概括模式本质
  2. 详细描述 — 完整阐述模式的工作原理和使用时机
  3. 应用场景(5 个)— 实际开发中的典型场景
  4. 经典案例(4 个)— 业界知名框架/工具中的模式应用
  5. 代码示例 — Java 代码展示模式的典型实现
  6. 配图 — AI 生成的插画,直观展示模式概念
  7. 分类归属 — 创建型 / 结构型 / 行为型

7. 交互设计

7.1 主要交互

交互 行为 实现
分类过滤 点击统计卡片或筛选按钮切换分类 setActiveCategory + useMemo
关键词搜索 实时搜索,在名称、英文名、核心思想、场景中匹配 searchPatterns()
模式详情 点击模式卡片弹出详情 Dialog Dialog + setSelectedPattern
Tab 切换 详情中切换概述/应用/案例/代码 Tabs 组件
动画效果 卡片入场/鼠标悬停/页面过渡 framer-motion

7.2 响应式设计

断点 布局
< 640px (sm) 单列卡片
640px - 1024px (md) 双列卡片
1024px - 1280px (lg) 三列/四列卡片
> 1280px (xl) 四列/五列卡片

8. 性能与优化

优化策略 实现
静态数据 设计模式数据以 TypeScript 静态常量定义,零网络请求
useMemo 缓存 筛选结果、分类分组、统计数据均使用 useMemo 避免重复计算
Standalone 构建 Next.js output: "standalone",减小部署体积
图片优化 使用 Next.js <img> + public/ 静态托管
懒加载动画 whileInView 仅在元素进入视口时触发动画
CSS 原子化 Tailwind CSS v4,按需生成,极致压缩

9. 安全设计

措施 说明
环境变量 数据库连接等敏感信息通过 .env 管理
TypeScript 严格模式 "strict": true 编译时类型检查
Caddy 反向代理 统一入口,隐藏内部端口
认证预留 next-auth 已引入,支持后续接入 OAuth
数据校验 zod 运行时 Schema 校验

10. 配置与环境变量

10.1 Next.js 配置 (next.config.ts)

const nextConfig: NextConfig = {
  output: "standalone",        // 独立部署模式
  typescript: {
    ignoreBuildErrors: true,   // 构建时忽略 TS 错误
  },
  reactStrictMode: false,      // 关闭严格模式
};

10.2 环境变量 (.env)

DATABASE_URL=file:/home/z/my-project/db/custom.db

10.3 shadcn/ui 配置 (components.json)

  • 样式:New York 风格
  • CSS 变量:启用
  • 基础色:neutral
  • 图标库:lucide

10.4 Tailwind 配置

  • 暗黑模式class 策略
  • 动画插件tailwindcss-animate
  • 自定义主题色:CSS 变量驱动(background、foreground、card、primary、muted 等)
  • 圆角:CSS 变量 --radius 驱动

附录 A:依赖列表

A.1 运行时依赖

next, react, react-dom          — 核心框架
@prisma/client                  — 数据库 ORM
@radix-ui/* (20+)                — UI 原语组件
framer-motion                   — 动画库
recharts                        — 图表库
react-markdown                  — Markdown 渲染
react-syntax-highlighter        — 代码高亮
zustand                         — 状态管理
@tanstack/react-query           — 请求缓存
next-auth                       — 认证
next-intl                       — 国际化
@dnd-kit/*                      — 拖拽
lucide-react                    — 图标
zod                             — 数据校验

A.2 开发依赖

typescript, @types/react, @types/react-dom
eslint, eslint-config-next
tailwindcss, @tailwindcss/postcss
tw-animate-css
bun-types
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐