Files
novalon-website/docs/architecture.md
T
张翔 0175799004 docs: 删除过时的文档和测试报告文件
删除不再需要的文档、测试报告和计划文件,包括标题层级规范、颜色优化报告、测试框架文档等
2026-03-07 15:37:19 +08:00

369 lines
12 KiB
Markdown

# 系统架构文档
## 架构概述
Novalon Website 采用现代化的前端架构设计,基于 Next.js 16 的 App Router 模式,实现了一个高性能、可维护的企业官网系统。
## 技术架构
### 整体架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 客户端 (Browser) │
├─────────────────────────────────────────────────────────────┤
│ React 19 + TypeScript + Tailwind CSS + Framer Motion │
├─────────────────────────────────────────────────────────────┤
│ Next.js 16 App Router │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Pages │ │ Layouts │ │ Loading │ │
│ │ (路由页面) │ │ (布局组件) │ │ (加载状态) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 组件层 (Components) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ UI 组件 │ │ 布局组件 │ │ 业务组件 │ │
│ │ (shadcn) │ │ (Layout) │ │ (Sections) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 服务层 (Services) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ API Routes │ │ Server │ │ Utilities │ │
│ │ (Next.js) │ │ Actions │ │ (lib) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 外部服务 (External) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Resend │ │ CDN │ │
│ │ (邮件服务) │ │ (静态资源) │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
### 技术选型理由
| 技术 | 选型理由 |
|------|----------|
| Next.js 16 | 支持 App Router、静态导出、SEO 优化、服务端渲染 |
| React 19 | 最新特性、并发渲染、服务端组件支持 |
| TypeScript | 类型安全、开发体验提升、代码可维护性 |
| Tailwind CSS 4 | 原子化 CSS、快速开发、CSS-in-JS 零运行时 |
| Framer Motion | 声明式动画、手势支持、性能优秀 |
| shadcn/ui | 可定制、无依赖锁定、Radix UI 基础 |
## 目录结构设计
### App Router 路由组织
```
src/app/
├── layout.tsx # 根布局 - 全局 Provider、字体、元数据
├── error.tsx # 全局错误边界
├── not-found.tsx # 404 页面
├── globals.css # 全局样式
├── (marketing)/ # 营销页面路由组
│ ├── layout.tsx # 营销布局 - Header + Footer
│ ├── page.tsx # 首页
│ ├── about/ # 关于我们
│ ├── services/ # 核心业务
│ │ ├── page.tsx # 列表页
│ │ └── [id]/ # 详情页 (动态路由)
│ ├── products/ # 产品服务
│ ├── cases/ # 成功案例
│ ├── news/ # 新闻动态
│ │ ├── page.tsx # 列表页
│ │ └── [slug]/ # 详情页
│ └── contact/ # 联系我们
│ ├── page.tsx # 页面
│ └── actions.ts # Server Actions
├── api/ # API 路由
│ └── contact/route.ts # 联系表单 API
├── privacy/ # 隐私政策
├── terms/ # 服务条款
└── preview/ # 预览页面
```
### 组件目录组织
```
src/components/
├── ui/ # 基础 UI 组件 (shadcn/ui)
│ ├── button.tsx # 按钮
│ ├── card.tsx # 卡片
│ ├── dialog.tsx # 对话框
│ ├── input.tsx # 输入框
│ ├── textarea.tsx # 文本域
│ ├── dropdown-menu.tsx # 下拉菜单
│ ├── toast.tsx # 提示
│ └── ...
├── layout/ # 布局组件
│ ├── header.tsx # 页头导航
│ ├── footer.tsx # 页脚
│ ├── mobile-menu.tsx # 移动端菜单
│ ├── mobile-tab-bar.tsx # 移动端底部导航
│ └── breadcrumb.tsx # 面包屑
├── sections/ # 页面区块组件
│ ├── hero-section.tsx # Hero 区域
│ ├── services-section.tsx # 服务区块
│ ├── products-section.tsx # 产品区块
│ ├── cases-section.tsx # 案例区块
│ ├── about-section.tsx # 关于区块
│ ├── news-section.tsx # 新闻区块
│ └── contact-section.tsx # 联系区块
├── effects/ # 视觉效果组件
│ ├── gradient-flow.tsx # 渐变流动
│ ├── data-particle-flow.tsx # 数据粒子
│ ├── geometric-shapes.tsx # 几何图形
│ ├── glow-effect.tsx # 发光效果
│ └── ...
├── seo/ # SEO 组件
│ └── structured-data.tsx # 结构化数据
└── analytics/ # 分析组件
└── web-vitals.tsx # Web Vitals 监控
```
## 核心模块设计
### 1. 路由系统
#### 路由组 (Route Groups)
使用 `(marketing)` 路由组将营销相关页面组织在一起,共享相同的布局:
```tsx
// src/app/(marketing)/layout.tsx
export default function MarketingLayout({ children }) {
return (
<div className="min-h-screen flex flex-col">
<Header />
<ErrorBoundary>
<main className="flex-1">{children}</main>
</ErrorBoundary>
<Footer />
</div>
);
}
```
#### 动态路由
支持动态路由参数,如服务详情、产品详情、案例详情、新闻详情:
```tsx
// src/app/(marketing)/services/[id]/page.tsx
export default function ServiceDetailPage({ params }) {
return <ServiceDetailClient id={params.id} />;
}
```
### 2. 状态管理
#### Context 使用
- `ThemeProvider` - 主题状态管理
- `WebVitals` - 性能指标监控
#### 本地状态
组件内部使用 React Hooks 管理本地状态:
- `useState` - 组件状态
- `useEffect` - 副作用处理
- `useCallback` - 回调优化
- `useRef` - DOM 引用
### 3. 数据流
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户交互 │ ──▶ │ 表单验证 │ ──▶ │ API 请求 │
└─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ UI 更新 │ ◀── │ 状态更新 │ ◀── │ 响应处理 │
└─────────────┘ └─────────────┘ └─────────────┘
```
### 4. 样式系统
#### Tailwind CSS 配置
- CSS Variables 驱动主题
- 响应式断点:sm, md, lg, xl, 2xl
- 自定义颜色变量
#### 类名管理
使用 `cn()` 工具函数合并类名:
```tsx
import { cn } from '@/lib/utils';
<Button className={cn('base-classes', conditional && 'active-class')} />
```
### 5. 动画系统
#### Framer Motion 集成
- 页面过渡动画
- 滚动触发动画
- 手势交互
- 列表动画
#### 性能优化
- 使用 `dynamic` 动态导入大型动画组件
- `AnimatePresence` 处理组件卸载动画
- `will-change` CSS 属性优化
## 性能优化策略
### 1. 代码分割
```tsx
// 动态导入非首屏组件
const ServicesSection = dynamic(
() => import('@/components/sections/services-section'),
{ loading: () => <SectionSkeleton />, ssr: false }
);
```
### 2. 图片优化
- 使用 Next.js Image 组件
- 支持 WebP/AVIF 格式
- 响应式图片尺寸
- 懒加载
### 3. 字体优化
```tsx
// Google Fonts 优化配置
const notoSansSC = Noto_Sans_SC({
weight: ['400', '500', '700'],
variable: '--font-noto-sans-sc',
subsets: ['latin'],
display: 'swap',
preload: true,
});
```
### 4. 静态导出
```tsx
// next.config.ts
const nextConfig = {
output: 'export',
distDir: 'dist',
images: { unoptimized: true },
};
```
## 安全设计
### 1. XSS 防护
- 使用 DOMPurify 清理用户输入
- React 自动转义
- Content Security Policy
### 2. CSRF 防护
- 表单包含 CSRF Token
- 验证请求来源
### 3. 邮件表单安全
- 蜜罐字段检测机器人
- 提交时间验证
- 数学验证码
## SEO 优化
### 1. 元数据配置
```tsx
export const metadata: Metadata = {
title: { default: '...', template: '%s | ...' },
description: '...',
keywords: ['...'],
openGraph: { ... },
twitter: { ... },
};
```
### 2. 结构化数据
```tsx
// Organization Schema
<OrganizationSchema />
// Website Schema
<WebsiteSchema />
```
### 3. 语义化 HTML
- 正确的标题层级 (h1-h6)
- 语义化标签 (header, main, footer, nav, article)
- ARIA 属性
## 可访问性设计
### WCAG 2.1 AA 合规
- 颜色对比度 ≥ 4.5:1
- 键盘导航支持
- 屏幕阅读器兼容
- 焦点管理
- 跳过链接
### 焦点陷阱
```tsx
// 移动端菜单焦点陷阱
const focusTrapRef = useFocusTrap<HTMLDivElement>(isOpen);
```
## 扩展性设计
### 1. 组件可复用
- UI 组件与业务逻辑分离
- Props 接口设计
- 组合模式
### 2. 配置驱动
```tsx
// src/lib/constants.ts
export const NAVIGATION: NavigationItem[] = [
{ id: 'home', label: '首页', href: '/' },
// ...
];
```
### 3. 类型安全
```tsx
// 类型定义
export interface NewsItem {
id: string;
title: string;
excerpt: string;
date: string;
category: NewsCategory;
image: string;
content: string;
}
```