Files
afilmory/README.md
2025-06-10 20:11:16 +08:00

361 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Iris Photo Gallery
一个现代化的照片画廊网站,采用 React + TypeScript 构建支持从多种存储源S3、GitHub自动同步照片具有高性能 WebGL 渲染、瀑布流布局、EXIF 信息展示、缩略图生成等功能。
## 🌟 特性
### 核心功能
- 🖼️ **高性能 WebGL 图像渲染器** - 基于自研 WebGL 组件,支持流畅的缩放、平移操作
- 📱 **响应式瀑布流布局** - 采用 Masonic 实现,自适应不同屏幕尺寸
- 🎨 **现代化 UI 设计** - 基于 Tailwind CSS 和 Radix UI 组件库
-**增量同步** - 智能检测文件变化,仅处理新增或修改的照片
### 图像处理
- 🔄 **HEIC/HEIF 格式支持** - 自动转换 Apple 设备的 HEIC 格式
- 🖼️ **智能缩略图生成** - 多尺寸缩略图,优化加载性能
- 📊 **EXIF 信息展示** - 完整的拍摄参数,包括相机型号、焦距、光圈等
- 🌈 **Blurhash 占位符** - 优雅的图片加载体验
- 📱 **Live Photo 支持** - 检测并展示 iPhone Live Photo
### 高级功能
- 🎛️ **富士胶片模拟** - 读取和展示富士相机的胶片模拟设置
- 🔍 **全屏查看器** - 支持手势操作的图片查看器
- 🏷️ **智能标签** - 基于 EXIF 数据自动生成标签
-**并发处理** - 支持多进程/多线程并发处理
- 🗂️ **多存储支持** - S3、GitHub 等多种存储后端
## 🏗️ 技术架构
### 前端技术栈
- **React 19** - 使用最新的 React 版本和 Compiler
- **TypeScript** - 完整的类型安全
- **Vite** - 现代化构建工具
- **Tailwind CSS** - 原子化 CSS 框架
- **Radix UI** - 无障碍组件库
- **Jotai** - 状态管理
- **TanStack Query** - 数据获取和缓存
- **React Router 7** - 路由管理
### 构建系统
- **Node.js** - 服务端运行时
- **Sharp** - 高性能图像处理
- **AWS SDK** - S3 存储操作
- **Worker Threads/Cluster** - 并发处理
- **EXIF-Reader** - EXIF 数据提取
### 存储架构
采用适配器模式设计,支持多种存储后端:
- **S3 兼容存储** - AWS S3、MinIO、阿里云 OSS 等
- **GitHub 存储** - 使用 GitHub 仓库作为图片存储
## 📦 项目结构
```
photo-gallery-site/
├── apps/web/ # 主应用
│ ├── src/
│ │ ├── components/ # React 组件
│ │ │ ├── ui/ # UI 组件库
│ │ │ └── common/ # 通用组件
│ │ ├── core/ # 核心构建系统
│ │ │ ├── builder/ # 主构建器
│ │ │ ├── storage/ # 存储适配器
│ │ │ ├── image/ # 图像处理
│ │ │ ├── photo/ # 照片处理
│ │ │ └── worker/ # 并发处理
│ │ ├── modules/ # 功能模块
│ │ ├── pages/ # 页面组件
│ ├── public/ # 静态资源
│ └── scripts/ # 构建脚本
├── packages/webgl-viewer/ # WebGL 图像查看器
├── config/ # 配置文件
└── docs/ # 文档
```
## 🚀 快速开始
### 环境要求
- Node.js 18+
- 至少 4GB RAM用于图像处理
### 1. 克隆项目
```bash
git clone https://github.com/Iris-Photo-Gallery/Iris.git
cd photo-gallery-site
```
### 2. 安装依赖
```bash
pnpm install
```
### 3. 环境配置
创建 `.env` 文件:
```env
# S3 存储配置
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=your_access_key_id
S3_SECRET_ACCESS_KEY=your_secret_access_key
S3_ENDPOINT=https://s3.amazonaws.com
S3_BUCKET_NAME=your_bucket_name
S3_PREFIX=photos/
S3_CUSTOM_DOMAIN=your_custom_domain.com
```
### 4. 站点配置
复制并编辑配置文件:
```bash
cp config.example.json config.json
```
编辑 `config.json`
```json
{
"name": "我的照片画廊",
"title": "我的照片画廊",
"description": "记录生活中的美好瞬间",
"url": "https://gallery.example.com",
"accentColor": "#007bff",
"author": {
"name": "Your Name",
"url": "https://example.com"
},
"social": {
"twitter": "@yourusername"
}
}
```
### 5. 构建照片清单
```bash
# 首次构建
pnpm run build:manifest
# 增量更新
pnpm run build:manifest
# 强制全量更新
pnpm run build:manifest -- --force
```
### 6. 启动开发服务器
```bash
pnpm dev
```
## ⚙️ 配置选项
### 构建器配置
创建 `builder.config.json` 文件进行高级配置:
```json
{
"repo": {
"enable": false,
"url": "https://github.com/username/gallery-assets"
},
"storage": {
"provider": "s3",
"bucket": "my-photos",
"region": "us-east-1",
"prefix": "photos/",
"customDomain": "cdn.example.com"
},
"options": {
"defaultConcurrency": 8,
"enableLivePhotoDetection": true,
"showProgress": true,
"showDetailedStats": true
},
"logging": {
"verbose": true,
"level": "info",
"outputToFile": false
},
"performance": {
"worker": {
"workerCount": 8,
"timeout": 30000,
"useClusterMode": true,
"workerConcurrency": 2
}
}
}
```
### 配置选项说明
#### 存储配置 (`storage`)
- `provider`: 存储提供商 (`s3` | `github`)
- `bucket`: S3 存储桶名称
- `region`: S3 区域
- `endpoint`: S3 端点(可选)
- `prefix`: 文件前缀
- `customDomain`: 自定义域名
#### 构建选项 (`options`)
- `defaultConcurrency`: 默认并发数
- `enableLivePhotoDetection`: 启用 Live Photo 检测
- `showProgress`: 显示构建进度
- `showDetailedStats`: 显示详细统计信息
#### 性能配置 (`performance`)
- `worker.workerCount`: Worker 进程数
- `worker.timeout`: Worker 超时时间(毫秒)
- `worker.useClusterMode`: 启用集群模式
#### 日志配置 (`logging`)
- `verbose`: 详细日志
- `level`: 日志级别 (`info` | `warn` | `error` | `debug`)
- `outputToFile`: 输出到文件
### 远程资源库配置
如果你有独立的资源仓库存储缩略图和清单:
```json
{
"repo": {
"enable": true,
"url": "https://github.com/username/gallery-assets"
}
}
```
这将自动从远程仓库拉取资源,避免每次构建。
## 📋 CLI 命令
### 构建命令
```bash
# 查看帮助
pnpm run build:manifest -- --help
# 增量更新(默认)
pnpm run build:manifest
# 强制全量更新
pnpm run build:manifest -- --force
# 仅重新生成缩略图
pnpm run build:manifest -- --force-thumbnails
# 仅重新生成清单
pnpm run build:manifest -- --force-manifest
```
### 开发命令
```bash
# 启动开发服务器
pnpm dev
# 构建生产版本
pnpm build
```
## 🚀 部署指南
### Vercel 部署(推荐)
1. **Fork 项目**
- 访问 [GitHub 仓库](https://github.com/Iris-Photo-Gallery/Iris)
- 点击右上角的 "Fork" 按钮,将项目 fork 到你的 GitHub 账户
2. **在 Vercel 部署**
- 访问 [Vercel](https://vercel.com/)
- 使用 GitHub 账户登录
- 点击 "New Project",选择你刚才 fork 的仓库
- 在项目设置中添加以下环境变量(如果你使用 S3 存储):
```env
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=你的 S3 访问密钥 ID
S3_SECRET_ACCESS_KEY=你的 S3 秘密访问密钥
S3_ENDPOINT=https://s3.amazonaws.com
S3_BUCKET_NAME=你的 S3 存储桶名称
S3_PREFIX=photos/
S3_CUSTOM_DOMAIN=你的自定义域名(可选)
```
3. **触发部署**
- 配置完环境变量后Vercel 会自动开始部署
- 等待部署完成,你的照片画廊就上线了!
### 注意事项
- 确保你的 S3 存储桶已经包含照片文件
- 如果使用远程资源库,需要先配置 `builder.config.json`
## 🔧 高级用法
### 自定义存储提供商
实现 `StorageProvider` 接口以支持新的存储后端:
```typescript
import { StorageProvider } from './src/core/storage/interfaces'
class MyStorageProvider implements StorageProvider {
async getFile(key: string): Promise<Buffer | null> {
// 实现文件获取逻辑
}
async listImages(): Promise<StorageObject[]> {
// 实现图片列表获取逻辑
}
// ... 其他方法
}
```
### 自定义图像处理
`src/core/image/` 目录下添加自定义处理器:
```typescript
export async function customImageProcessor(buffer: Buffer) {
// 自定义图像处理逻辑
return processedBuffer
}
```
## 📄 许可证
MIT License © 2025 Innei
## 🔗 相关链接
- [在线演示](https://gallery.innei.in)
- [个人网站](https://innei.in)
- [GitHub](https://github.com/innei)
- [问题反馈](https://github.com/Iris-Photo-Gallery/Iris/issues)
---
如果这个项目对你有帮助,请给个 ⭐️ Star 支持一下!