Files
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

526 lines
17 KiB
Markdown

# Personal Blog - Modern Dashboard 设计风格文档
> **设计风格**: Modern SaaS Dashboard
> **参考来源**: [Apex Dashboard](https://apex-dashboard.pages.dev/)
> **版本**: v1.0
> **更新日期**: 2026-04-18
---
## 1. 设计理念
### 1.1 什么是 Modern Dashboard 风格?
Modern Dashboard 是一种现代化的 SaaS 管理后台设计风格,特点包括:
- **深色侧边导航**: 高对比度的深色侧边栏,聚焦内容区域
- **浅色主内容区**: 干净、明亮的白色/浅灰背景
- **柔和圆角**: 8px-16px 圆角,友好且现代
- **微阴影**: 柔和的投影营造层次感
- **绿色主色调**: 代表增长、成功、活力
- **数据驱动**: 强调指标卡片、图表展示
- **简洁图标**: 线性图标,统一风格
### 1.2 与当前 Neobrutalism 风格对比
| 特性 | Neobrutalism (当前) | Modern Dashboard (新风格) |
|------|---------------------|---------------------------|
| 侧边栏 | 奶油色 `#FEF9E7` | 深墨绿 `#0F172A` |
| 主背景 | 奶油色 | 浅灰白 `#F8FAFC` |
| 边框 | 2px 纯黑硬边框 | 1px 浅灰边框或无 |
| 圆角 | 0px (直角) | 8-16px (圆角) |
| 阴影 | 4px 硬阴影 | 柔和弥散阴影 |
| 主色调 | 粉红 `#FF6B9D` | 翠绿 `#10B981` |
| 按钮风格 | 位移点击效果 | 悬停微动 + 渐变 |
| 卡片风格 | 硬边框 + 硬阴影 | 无边框 + 软阴影 |
---
## 2. 色彩系统
### 2.1 主色调
```javascript
// tailwind.config.js - Modern Dashboard 配色
colors: {
'dashboard': {
// 侧边栏深色
'sidebar': '#0F172A', // 深墨绿/深蓝灰
'sidebar-active': '#1E293B', // 激活项背景
'sidebar-text': '#94A3B8', // 侧边栏文字
'sidebar-text-active': '#FFFFFF', // 激活文字
// 主内容区
'bg': '#F8FAFC', // 主背景 - 极浅灰
'card': '#FFFFFF', // 卡片背景 - 纯白
// 强调色
'primary': '#10B981', // 主色调 - 翠绿
'primary-hover': '#059669', // 悬停深绿
'primary-light': '#D1FAE5', // 浅绿背景
// 状态色
'success': '#10B981', // 成功 - 绿
'warning': '#F59E0B', // 警告 - 橙
'danger': '#EF4444', // 危险 - 红
'info': '#3B82F6', // 信息 - 蓝
// 文字
'text-primary': '#0F172A', // 主要文字
'text-secondary': '#64748B', // 次要文字
'text-muted': '#94A3B8', // 弱化文字
// 边框
'border': '#E2E8F0', // 浅色边框
}
}
```
### 2.2 使用规范
| 颜色 | 用途 |
|------|------|
| `dashboard-sidebar` | 侧边栏背景 |
| `dashboard-sidebar-active` | 当前选中菜单项 |
| `dashboard-bg` | 主内容区背景 |
| `dashboard-card` | 卡片、面板背景 |
| `dashboard-primary` | 主按钮、链接、强调 |
| `dashboard-primary-light` | 图标背景、标签背景 |
| `dashboard-success` | 增长指标、成功状态 |
| `dashboard-warning` | 警告提示 |
| `dashboard-danger` | 删除操作、错误提示 |
| `dashboard-text-primary` | 标题、主要内容 |
| `dashboard-text-secondary` | 描述、辅助文字 |
| `dashboard-border` | 分割线、卡片边框 |
---
## 3. 排版系统
### 3.1 字体
```javascript
fontFamily: {
'sans': ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
}
```
- **Inter** 作为主要字体,现代、清晰、专业
- 系统字体栈作为后备
### 3.2 字号规范
| 元素 | 字号 | 字重 | 用途 |
|------|------|------|------|
| 页面标题 | `text-2xl` (24px) | `font-semibold` (600) | Dashboard 标题 |
| 卡片标题 | `text-base` (16px) | `font-medium` (500) | 卡片/面板标题 |
| 大数字 | `text-3xl` (30px) | `font-bold` (700) | 统计数据展示 |
| 正文 | `text-sm` (14px) | `font-normal` (400) | 段落文字 |
| 小字 | `text-xs` (12px) | `font-medium` (500) | 标签、时间戳 |
| 按钮文字 | `text-sm` (14px) | `font-medium` (500) | 按钮内文字 |
| 侧边栏菜单 | `text-sm` (14px) | `font-medium` (500) | 导航菜单 |
---
## 4. 阴影系统
### 4.1 阴影定义
```javascript
boxShadow: {
'card': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
'card-hover': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
'dropdown': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
}
```
### 4.2 使用场景
| 阴影 | 用途 |
|------|------|
| `shadow-card` | 标准卡片、面板 |
| `shadow-card-hover` | 卡片悬停状态 |
| `shadow-dropdown` | 下拉菜单、弹窗 |
---
## 5. 组件规范
### 5.1 按钮 (Button)
```jsx
// 基础样式
const baseClasses = 'inline-flex items-center justify-center font-medium
transition-all duration-200 rounded-lg focus:outline-none focus:ring-2
focus:ring-offset-2'
// 变体
primary: 'bg-dashboard-primary text-white hover:bg-dashboard-primary-hover
focus:ring-dashboard-primary shadow-sm'
secondary: 'bg-white text-dashboard-text-primary border border-dashboard-border
hover:bg-gray-50 focus:ring-dashboard-border'
ghost: 'bg-transparent text-dashboard-text-secondary
hover:bg-gray-100 hover:text-dashboard-text-primary'
danger: 'bg-dashboard-danger text-white hover:bg-red-600
focus:ring-red-500'
// 尺寸
sm: 'px-3 py-1.5 text-xs rounded-md'
md: 'px-4 py-2 text-sm rounded-lg'
lg: 'px-6 py-2.5 text-base rounded-lg'
```
**交互效果**:
- 默认: 轻微阴影
- 悬停: 背景色加深,阴影增强
- 点击: 轻微下沉效果
### 5.2 卡片 (Card)
```jsx
// 样式
'bg-white rounded-xl shadow-card border border-dashboard-border'
// 悬停效果 (可选)
'hover:shadow-card-hover transition-shadow duration-200'
```
**结构组件**:
- `CardHeader`: 头部区域,含标题和可选操作
- `CardContent`: 内容区域
- `CardFooter`: 底部操作区
### 5.3 统计卡片 (Stats Card)
```jsx
// 示例结构
<div className="bg-white rounded-xl shadow-card p-6 border border-dashboard-border">
<div className="flex items-center justify-between">
<div>
<p className="text-sm font-medium text-dashboard-text-secondary">
总文章数
</p>
<p className="text-3xl font-bold text-dashboard-text-primary mt-2">
128
</p>
<div className="flex items-center mt-2 text-sm">
<span className="text-dashboard-success flex items-center">
↑ 12.5%
</span>
<span className="text-dashboard-text-muted ml-2">较上月</span>
</div>
</div>
<div className="p-3 rounded-lg bg-dashboard-primary-light">
<FileText className="w-6 h-6 text-dashboard-primary" />
</div>
</div>
</div>
```
### 5.4 输入框 (Input)
```jsx
// 样式
'w-full px-4 py-2.5 rounded-lg border border-dashboard-border bg-white
text-dashboard-text-primary placeholder:text-dashboard-text-muted
focus:outline-none focus:ring-2 focus:ring-dashboard-primary/20
focus:border-dashboard-primary transition-all duration-200'
```
### 5.5 侧边栏导航
```jsx
// 菜单项样式 - 默认
'flex items-center gap-3 px-4 py-2.5 rounded-lg text-dashboard-sidebar-text
hover:bg-dashboard-sidebar-active hover:text-white transition-colors duration-200'
// 菜单项样式 - 激活
'flex items-center gap-3 px-4 py-2.5 rounded-lg bg-dashboard-sidebar-active
text-white font-medium'
// 分组标题
'px-4 py-2 text-xs font-semibold text-dashboard-text-muted uppercase tracking-wider'
```
---
## 6. 布局系统
### 6.1 后台布局 (Layout)
```
┌─────────────────────────────────────────────────────────┐
│ ┌──────────┐ ┌─────────────────────────────────────┐ │
│ │ │ │ Search [🔔][👤] │ │
│ │ Sidebar │ ├─────────────────────────────────────┤ │
│ │ (dark) │ │ │ │
│ │ │ │ ┌───────────────────────────────┐ │ │
│ │ 🏠 Dashboard │ │ Dashboard │ │ │
│ │ 📝 Posts │ │ Welcome back... │ │ │
│ │ 🏷️ Categories│ │ │ │ │
│ │ 🖼️ Images │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │
│ │ ⚙️ Settings │ │ │Card│ │Card│ │Card│ │Card│ │ │ │
│ │ │ │ └────┘ └────┘ └────┘ └────┘ │ │ │
│ │ ───────── │ │ │ │ │
│ │ 📊 Analytics │ │ ┌───────────────────────┐ │ │ │
│ │ 💼 eCommerce │ │ │ Content Area │ │ │ │
│ │ │ │ └───────────────────────┘ │ │ │
│ └──────────┘ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
**结构**:
- 左侧深色固定侧边栏 (240px)
- 右侧主内容区,可滚动
- 顶部固定 Header,含搜索和用户操作
### 6.2 首页布局 (Home)
两种展示模式:
**卡片模式**:
```
┌─────────────────────────────────────────────────────────┐
│ Logo Search... [分类筛选] │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 封面图 │ │ 封面图 │ │ 封面图 │ │
│ │ │ │ │ │ │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ 标题 │ │ 标题 │ │ 标题 │ │
│ │ 摘要... │ │ 摘要... │ │ 摘要... │ │
│ │ 分类 · 时间 │ │ 分类 · 时间 │ │ 分类 · 时间 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
```
**列表模式**:
```
┌─────────────────────────────────────────────────────────┐
│ 标题 1 2024-01-01 │
│ 摘要预览文字... │
│ 分类 · 标签1 · 标签2 👁 128 │
├─────────────────────────────────────────────────────────┤
│ 标题 2 2024-01-01 │
│ 摘要预览文字... │
│ 分类 · 标签1 · 标签2 👁 256 │
└─────────────────────────────────────────────────────────┘
```
---
## 7. 动效规范
### 7.1 过渡时间
```css
transition-all duration-150 /* 按钮、链接 */
transition-all duration-200 /* 卡片、阴影 */
transition-all duration-300 /* 页面切换、侧边栏 */
```
### 7.2 交互模式
**按钮悬停**:
- 背景色加深
- 轻微阴影增强
- 平滑过渡 200ms
**卡片悬停**:
```css
hover:shadow-card-hover hover:-translate-y-0.5
transition-all duration-200
```
**侧边栏菜单**:
- 默认: 灰色文字
- 悬停: 白色文字 + 深色背景
- 激活: 白色文字 + 更深的背景
**页面加载**:
- 内容区域淡入
- 卡片依次出现 (stagger 100ms)
---
## 8. 响应式设计
### 8.1 断点
使用 Tailwind 默认断点:
- `sm`: 640px
- `md`: 768px
- `lg`: 1024px
- `xl`: 1280px
### 8.2 适配规则
| 元素 | 桌面端 | 平板 | 手机 |
|------|--------|------|------|
| 侧边栏 | 固定显示 240px | 可折叠 | 隐藏/汉堡菜单 |
| 文章网格 | 3列 | 2列 | 1列 |
| 统计卡片 | 4列 | 2列 | 1列 |
| 卡片内边距 | `p-6` | `p-5` | `p-4` |
| 标题字号 | `text-2xl` | `text-xl` | `text-lg` |
---
## 9. 技术栈
### 9.1 前端
| 技术 | 版本 | 用途 |
|------|------|------|
| React | 18.x | UI 框架 |
| Vite | 5.x | 构建工具 |
| React Router | 6.x | 路由管理 |
| Tailwind CSS | 3.x | 样式系统 |
| Lucide React | latest | 图标库 |
| Recharts | latest | 数据图表 (可选) |
### 9.2 后端
| 技术 | 版本 | 用途 |
|------|------|------|
| FastAPI | latest | Web 框架 |
| SQLAlchemy | 2.x | ORM |
| SQLite | 3.x | 数据库 |
| Pydantic | 2.x | 数据验证 |
| JWT | latest | 认证 |
---
## 10. 文件结构
```
personal-blog/
├── DESIGN.md # Neobrutalism 设计文档
├── DESIGN_MODERN.md # 本文档 (Modern Dashboard)
├── backend/ # FastAPI 后端
│ ├── app.py # 主入口
│ ├── models.py # 数据库模型
│ ├── database.py # 数据库连接
│ └── routers/ # API 路由
├── frontend/ # React 前端
│ ├── src/
│ │ ├── components/ # 通用组件
│ │ ├── pages/ # 页面组件
│ │ ├── styles/ # 主题配置
│ │ │ ├── themes/ # 主题文件
│ │ │ │ ├── neobrutalism.js
│ │ │ │ └── modern.js
│ │ │ └── index.js
│ │ └── api/
│ └── tailwind.config.js # Tailwind 配置
└── uploads/
```
---
## 11. 主题切换实现建议
### 11.1 切换方案
**方案 A: CSS 变量切换 (推荐)**
```css
/* styles/themes/neobrutalism.css */
:root[data-theme="neobrutalism"] {
--color-bg: #FEF9E7;
--color-card: #FFFFFF;
--color-primary: #FF6B9D;
--border-width: 2px;
--border-radius: 0px;
--shadow: 4px 4px 0px 0px rgba(0,0,0,1);
}
/* styles/themes/modern.css */
:root[data-theme="modern"] {
--color-bg: #F8FAFC;
--color-card: #FFFFFF;
--color-primary: #10B981;
--border-width: 1px;
--border-radius: 0.75rem;
--shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
}
```
**方案 B: Tailwind 配置切换**
```javascript
// tailwind.config.js
module.exports = {
darkMode: 'class',
theme: {
extend: {
colors: {
// 根据主题动态加载
}
}
}
}
```
### 11.2 存储与切换
```javascript
// 主题切换逻辑
const [theme, setTheme] = useState(() => {
return localStorage.getItem('theme') || 'neobrutalism'
})
useEffect(() => {
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem('theme', theme)
}, [theme])
```
### 11.3 后台切换界面
在设置页面添加主题选择器:
```jsx
<div className="space-y-4">
<h3>界面主题</h3>
<div className="flex gap-4">
<button
onClick={() => setTheme('neobrutalism')}
className={theme === 'neobrutalism' ? 'active' : ''}
>
<div className="w-20 h-16 bg-[#FEF9E7] border-2 border-black" />
<span>新粗野主义</span>
</button>
<button
onClick={() => setTheme('modern')}
className={theme === 'modern' ? 'active' : ''}
>
<div className="w-20 h-16 bg-[#0F172A] rounded-lg" />
<span>现代仪表盘</span>
</button>
</div>
</div>
```
---
## 12. 参考资源
- [Apex Dashboard](https://apex-dashboard.pages.dev/) - 设计参考
- [Tailwind CSS 文档](https://tailwindcss.com/docs)
- [Lucide Icons](https://lucide.dev/)
- [Inter Font](https://rsms.me/inter/)
---
## 13. 更新日志
| 日期 | 版本 | 变更内容 |
|------|------|----------|
| 2026-04-18 | v1.0 | 初始版本,基于 Apex Dashboard |
---
*本文档为 Modern Dashboard 风格设计规范,可与 Neobrutalism 风格并存,通过主题切换实现。*