349 lines
8.0 KiB
Markdown
349 lines
8.0 KiB
Markdown
# My Live Photos - 实时文件共享系统
|
||
|
||
一个轻量级的实时文件共享系统,支持图片和视频文件的上传与实时分享。
|
||
|
||
## 🚀 功能特性
|
||
|
||
### 核心功能
|
||
- **实时文件上传**: 支持图片和视频文件的拖拽上传和点击上传
|
||
- **WebSocket 实时推送**: 文件上传后立即推送给所有在线用户
|
||
- **响应式现代UI设计**: 基于Tailwind CSS的现代化界面,支持移动端和桌面端
|
||
- **管理员面板**: 提供文件管理功能,包括文件状态控制
|
||
- **SQLite 数据存储**: 轻量级数据库存储文件元数据
|
||
- **文件隐藏/显示控制**: 管理员可以控制文件的可见性
|
||
- **文件删除功能**: 支持安全删除文件及其记录
|
||
|
||
### 技术亮点
|
||
- 实时双向通信,低延迟
|
||
- 文件上传进度显示
|
||
- 图片预览和视频播放
|
||
- 文件分类和筛选
|
||
- 响应式网格布局
|
||
- 暗色/亮色主题切换
|
||
|
||
## 🛠 技术栈
|
||
|
||
### 前端
|
||
- **Next.js 14+**: React全栈框架,支持SSR和静态生成
|
||
- **TypeScript**: 类型安全的JavaScript
|
||
- **Tailwind CSS**: 实用优先的CSS框架
|
||
- **Socket.io Client**: 实时通信客户端
|
||
- **React Hook Form**: 高性能表单处理
|
||
- **Lucide React**: 现代化图标库
|
||
|
||
### 后端
|
||
- **Next.js API Routes**: 内置API路由
|
||
- **Socket.io Server**: WebSocket服务器
|
||
- **SQLite**: 轻量级关系型数据库
|
||
- **Prisma**: 数据库ORM和迁移工具
|
||
- **Multer**: 文件上传中间件
|
||
- **Sharp**: 图片处理库
|
||
|
||
### 开发工具
|
||
- **ESLint**: 代码质量检查
|
||
- **Prettier**: 代码格式化
|
||
- **Husky**: Git hooks管理
|
||
- **Commitlint**: 提交信息规范
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
my-live-photos/
|
||
├── README.md
|
||
├── package.json
|
||
├── next.config.js
|
||
├── tailwind.config.js
|
||
├── tsconfig.json
|
||
├── .env.local
|
||
├── .env.example
|
||
├── prisma/
|
||
│ ├── schema.prisma
|
||
│ ├── migrations/
|
||
│ └── seed.ts
|
||
├── public/
|
||
│ ├── uploads/
|
||
│ │ ├── images/
|
||
│ │ └── videos/
|
||
│ ├── favicon.ico
|
||
│ └── robots.txt
|
||
├── src/
|
||
│ ├── app/
|
||
│ │ ├── globals.css
|
||
│ │ ├── layout.tsx
|
||
│ │ ├── page.tsx
|
||
│ │ └── admin/
|
||
│ │ ├── layout.tsx
|
||
│ │ └── page.tsx
|
||
│ ├── components/
|
||
│ │ ├── ui/
|
||
│ │ │ ├── button.tsx
|
||
│ │ │ ├── card.tsx
|
||
│ │ │ ├── dialog.tsx
|
||
│ │ │ ├── dropdown-menu.tsx
|
||
│ │ │ ├── input.tsx
|
||
│ │ │ ├── toast.tsx
|
||
│ │ │ └── tooltip.tsx
|
||
│ │ ├── FileCard.tsx
|
||
│ │ ├── FileGrid.tsx
|
||
│ │ ├── FileUpload.tsx
|
||
│ │ ├── Header.tsx
|
||
│ │ ├── AdminPanel.tsx
|
||
│ │ ├── ThemeToggle.tsx
|
||
│ │ └── SocketProvider.tsx
|
||
│ ├── lib/
|
||
│ │ ├── db.ts
|
||
│ │ ├── socket.ts
|
||
│ │ ├── utils.ts
|
||
│ │ └── validations.ts
|
||
│ ├── types/
|
||
│ │ ├── file.ts
|
||
│ │ └── api.ts
|
||
│ ├── hooks/
|
||
│ │ ├── useFiles.ts
|
||
│ │ ├── useUpload.ts
|
||
│ │ └── useTheme.ts
|
||
│ └── api/
|
||
│ ├── files/
|
||
│ │ ├── route.ts
|
||
│ │ └── [id]/route.ts
|
||
│ └── upload/
|
||
│ └── route.ts
|
||
└── .gitignore
|
||
```
|
||
|
||
## 🗄 数据库设计
|
||
|
||
### 文件表 (files)
|
||
```sql
|
||
CREATE TABLE files (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
filename VARCHAR(255) NOT NULL,
|
||
original_name VARCHAR(255) NOT NULL,
|
||
file_type VARCHAR(50) NOT NULL,
|
||
file_size INTEGER NOT NULL,
|
||
file_path VARCHAR(500) NOT NULL,
|
||
mime_type VARCHAR(100) NOT NULL,
|
||
is_visible BOOLEAN DEFAULT true,
|
||
is_deleted BOOLEAN DEFAULT false,
|
||
uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 索引设计
|
||
```sql
|
||
CREATE INDEX idx_files_type ON files(file_type);
|
||
CREATE INDEX idx_files_visible ON files(is_visible);
|
||
CREATE INDEX idx_files_uploaded_at ON files(uploaded_at DESC);
|
||
```
|
||
|
||
## 🔌 API 设计
|
||
|
||
### 文件上传 API
|
||
```
|
||
POST /api/upload
|
||
Content-Type: multipart/form-data
|
||
|
||
请求体:
|
||
- file: 文件对象
|
||
- metadata: JSON字符串(可选)
|
||
|
||
响应:
|
||
{
|
||
"success": true,
|
||
"file": {
|
||
"id": 1,
|
||
"filename": "uuid_filename.jpg",
|
||
"originalName": "photo.jpg",
|
||
"fileType": "image",
|
||
"fileSize": 1024000,
|
||
"filePath": "/uploads/images/uuid_filename.jpg",
|
||
"mimeType": "image/jpeg",
|
||
"isVisible": true,
|
||
"uploadedAt": "2024-01-01T00:00:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 获取文件列表 API
|
||
```
|
||
GET /api/files?type=image&page=1&limit=20
|
||
|
||
响应:
|
||
{
|
||
"success": true,
|
||
"files": [...],
|
||
"pagination": {
|
||
"page": 1,
|
||
"limit": 20,
|
||
"total": 100,
|
||
"totalPages": 5
|
||
}
|
||
}
|
||
```
|
||
|
||
### 文件管理 API
|
||
```
|
||
PUT /api/files/[id]
|
||
{
|
||
"isVisible": false
|
||
}
|
||
|
||
DELETE /api/files/[id]
|
||
```
|
||
|
||
## 📡 WebSocket 事件
|
||
|
||
### 客户端事件
|
||
- `file:upload`: 文件上传
|
||
- `file:delete`: 文件删除
|
||
- `file:toggle:visibility`: 切换文件可见性
|
||
|
||
### 服务器事件
|
||
- `file:uploaded`: 新文件上传通知
|
||
- `file:deleted`: 文件删除通知
|
||
- `file:visibility:changed`: 文件可见性变更通知
|
||
- `user:connected`: 用户连接通知
|
||
- `user:disconnected`: 用户断开连接通知
|
||
|
||
## 🎨 UI/UX 设计
|
||
|
||
### 颜色主题
|
||
```css
|
||
:root {
|
||
--primary: #3b82f6;
|
||
--primary-dark: #2563eb;
|
||
--secondary: #64748b;
|
||
--background: #ffffff;
|
||
--surface: #f8fafc;
|
||
--text: #1e293b;
|
||
--text-secondary: #64748b;
|
||
--border: #e2e8f0;
|
||
--success: #10b981;
|
||
--warning: #f59e0b;
|
||
--error: #ef4444;
|
||
}
|
||
|
||
.dark {
|
||
--background: #0f172a;
|
||
--surface: #1e293b;
|
||
--text: #f1f5f9;
|
||
--text-secondary: #94a3b8;
|
||
--border: #334155;
|
||
}
|
||
```
|
||
|
||
### 组件设计
|
||
1. **文件卡片**: 显示文件预览、基本信息和操作按钮
|
||
2. **上传区域**: 拖拽上传区域,支持点击选择文件
|
||
3. **文件网格**: 响应式网格布局,自适应不同屏幕尺寸
|
||
4. **管理面板**: 文件列表管理界面,支持批量操作
|
||
5. **实时通知**: Toast通知系统,显示实时更新
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 环境要求
|
||
- Node.js 18+
|
||
- npm 或 yarn
|
||
|
||
### 安装依赖
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
### 环境配置
|
||
```bash
|
||
cp .env.example .env.local
|
||
# 编辑 .env.local 文件,配置数据库连接等
|
||
```
|
||
|
||
### 数据库初始化
|
||
```bash
|
||
npx prisma generate
|
||
npx prisma db push
|
||
npx prisma db seed
|
||
```
|
||
|
||
### 启动开发服务器
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
访问 http://localhost:3000 查看应用
|
||
|
||
### 构建生产版本
|
||
```bash
|
||
npm run build
|
||
npm start
|
||
```
|
||
|
||
## 🔧 开发指南
|
||
|
||
### 添加新功能
|
||
1. 在 `src/types/` 中定义类型
|
||
2. 在 `src/lib/validations.ts` 中添加验证规则
|
||
3. 在 `src/api/` 中创建API路由
|
||
4. 在 `src/components/` 中创建UI组件
|
||
5. 在 `src/hooks/` 中创建自定义Hook
|
||
|
||
### 代码规范
|
||
- 使用 TypeScript 严格模式
|
||
- 遵循 ESLint 和 Prettier 规则
|
||
- 使用 Conventional Commits 提交规范
|
||
- 编写组件和函数的 JSDoc 注释
|
||
|
||
### 测试策略
|
||
- 单元测试: Jest + React Testing Library
|
||
- 集成测试: Playwright
|
||
- API测试: Supertest
|
||
|
||
## 📈 性能优化
|
||
|
||
### 前端优化
|
||
- 图片懒加载和压缩
|
||
- 虚拟滚动处理大量文件
|
||
- 代码分割和懒加载
|
||
- 缓存策略优化
|
||
|
||
### 后端优化
|
||
- 文件上传大小限制和类型验证
|
||
- 数据库查询优化和索引
|
||
- WebSocket连接管理
|
||
- CDN集成静态资源
|
||
|
||
## 🔒 安全考虑
|
||
|
||
### 文件上传安全
|
||
- 文件类型白名单验证
|
||
- 文件大小限制
|
||
- 文件名消毒处理
|
||
- 病毒扫描集成
|
||
|
||
### 数据安全
|
||
- SQL注入防护
|
||
- XSS攻击防护
|
||
- CSRF保护
|
||
- 认证和授权
|
||
|
||
## 📄 许可证
|
||
|
||
MIT License
|
||
|
||
## 🤝 贡献指南
|
||
|
||
1. Fork 项目
|
||
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
|
||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||
5. 创建 Pull Request
|
||
|
||
## 📞 联系方式
|
||
|
||
如有问题或建议,请通过以下方式联系:
|
||
- 创建 Issue
|
||
- 发送邮件
|
||
- 提交 Pull Request
|
||
|
||
---
|
||
|
||
**My Live Photos** - 让分享更简单,让回忆更鲜活。 |