185 lines
6.4 KiB
Markdown
185 lines
6.4 KiB
Markdown
# TinyPanda 项目上下文
|
||
|
||
## 项目概述
|
||
|
||
TinyPanda 是一个基于 Electron 桌面应用框架的专业图片压缩工具,使用 Tinify API 提供高质量图片压缩服务。
|
||
|
||
**技术栈:**
|
||
- **Electron 32.0.0** - 跨平台桌面应用框架
|
||
- **Tinify API** - 图片压缩服务
|
||
- **JSZip 3.10.1** - 文件打包下载
|
||
- **Electron Store 8.2.0** - 配置持久化
|
||
- **原生 CSS** - Windows 11 Fluent Design 风格 UI
|
||
|
||
**项目作者:** Pandora Studio
|
||
**项目仓库:** https://git.pandorastudio.cn/product/TinyPanda.git
|
||
**API 文档:** https://tinify.cn/developers/reference/nodejs
|
||
|
||
## 核心功能
|
||
|
||
1. **批量图片压缩** - 支持队列管理,可同时处理多张图片
|
||
2. **实时进度显示** - 显示压缩进度和状态
|
||
3. **压缩效果对比** - 显示压缩前后大小对比及节省比例
|
||
4. **打包下载** - 支持将所有压缩后的图片打包为 ZIP 下载
|
||
5. **拖拽上传** - 支持拖拽图片到上传区域
|
||
6. **自定义标题栏** - 无边框窗口,支持最小化、最大化、关闭
|
||
|
||
**支持的图片格式:** JPG/JPEG、PNG、WebP
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
TinyPanda/
|
||
├── src/
|
||
│ ├── main/
|
||
│ │ └── index.js # Electron 主进程(窗口管理、IPC 通信、文件操作)
|
||
│ └── renderer/
|
||
│ ├── index.html # 渲染进程 HTML 结构
|
||
│ ├── styles.css # Windows 11 Fluent Design 风格样式
|
||
│ ├── app.js # 渲染进程逻辑(队列管理、UI 交互)
|
||
│ └── icons.js # 自定义图标 Web Component (tp-icon)
|
||
├── .env # 环境变量(TINIFY_API_KEY)
|
||
├── .gitignore
|
||
├── package.json # 项目配置和依赖
|
||
├── package-lock.json
|
||
├── README.md # 项目说明文档
|
||
└── brief.txt # 项目简要说明
|
||
```
|
||
|
||
## 构建和运行
|
||
|
||
### 安装依赖
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
### 开发模式运行
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
### 打包应用
|
||
```bash
|
||
# 仅打包 Windows 应用
|
||
npm run build:win
|
||
|
||
# 打包所有平台
|
||
npm run build
|
||
```
|
||
|
||
### 注意事项
|
||
- 首次运行需要在 `.env` 文件中配置 `TINIFY_API_KEY`
|
||
- 开发模式下会自动打开开发者工具(当 `NODE_ENV=development`)
|
||
- 打包后的应用会输出到 `dist` 目录
|
||
|
||
## 开发约定
|
||
|
||
### 代码风格
|
||
- 使用 ES6+ JavaScript 语法
|
||
- 主进程和渲染进程通过 IPC (Inter-Process Communication) 通信
|
||
- 使用 `async/await` 处理异步操作
|
||
|
||
### IPC 通信协议
|
||
|
||
**主进程提供的 IPC 处理器:**
|
||
|
||
| 处理器名称 | 参数 | 返回值 | 说明 |
|
||
|-----------|------|--------|------|
|
||
| `get-api-key` | 无 | `{ apiKey: string }` | 获取当前 API Key |
|
||
| `set-api-key` | `key: string` | `{ success: boolean }` | 设置 API Key |
|
||
| `validate-api-key` | `key: string` | `{ valid: boolean }` | 验证 API Key 有效性 |
|
||
| `compress-image` | `filePath: string` | `{ success: boolean, compressedData?: string, error?: string }` | 压缩单张图片 |
|
||
| `get-image-info` | `filePath: string` | `{ success: boolean, size?: number, error?: string }` | 获取图片文件信息 |
|
||
| `save-compressed-image` | `savePath: string, base64Data: string` | `{ success: boolean, error?: string }` | 保存压缩后的图片 |
|
||
| `create-zip` | `files: Array<{name: string, data: string}>` | `{ success: boolean, zipData?: string, error?: string }` | 创建 ZIP 压缩包 |
|
||
| `select-save-directory` | 无 | `{ canceled: boolean, path?: string }` | 选择保存目录 |
|
||
| `select-files` | 无 | `{ canceled: boolean, files?: string[] }` | 选择多个文件 |
|
||
| `window-minimize` | 无 | 无 | 最小化窗口 |
|
||
| `window-maximize` | 无 | 无 | 最大化/还原窗口 |
|
||
| `window-close` | 无 | 无 | 关闭窗口 |
|
||
| `window-is-maximized` | 无 | `boolean` | 获取窗口最大化状态 |
|
||
|
||
### UI 设计规范
|
||
- 遵循 Windows 11 Fluent Design 设计语言
|
||
- 使用自定义 Web Component `<tp-icon>` 渲染图标
|
||
- 状态标签使用颜色编码:
|
||
- `status-pending` - 黄色(待处理)
|
||
- `status-processing` - 蓝色(处理中)
|
||
- `status-completed` - 绿色(已完成)
|
||
- `status-error` - 红色(错误)
|
||
|
||
### 文件命名约定
|
||
- 文件大小格式化函数:`formatSize(bytes)` - 返回格式化字符串(如 "1.5 MB")
|
||
- 队列项结构:
|
||
```javascript
|
||
{
|
||
id: number, // 唯一标识
|
||
name: string, // 文件名
|
||
path: string, // 文件路径
|
||
originalSize: number, // 原始大小(字节)
|
||
compressedSize: number|null, // 压缩后大小(字节)
|
||
compressedData: string|null, // 压缩数据(Base64)
|
||
status: 'pending'|'processing'|'completed'|'error',
|
||
progress: number // 进度(0-100)
|
||
}
|
||
```
|
||
|
||
### API Key 管理
|
||
- API Key 通过 `.env` 文件或运行时设置
|
||
- 每个账户每月有 500 次免费压缩额度
|
||
- 验证 API Key 时,如果返回非 Credentials 错误,则认为 Key 格式正确
|
||
|
||
## Electron 配置
|
||
|
||
**窗口配置:**
|
||
- 尺寸:1200x800
|
||
- 无边框窗口(`frame: false`)
|
||
- 支持自定义标题栏和窗口控制按钮
|
||
- Node 集成启用(`nodeIntegration: true`)
|
||
- 上下文隔离禁用(`contextIsolation: false`)
|
||
|
||
**打包配置:**
|
||
- App ID:`cn.pandorastudio.tinypanda`
|
||
- 产品名称:TinyPanda
|
||
- Windows 目标:NSIS 安装程序
|
||
- 图标:`assets/icon.ico`
|
||
|
||
## 测试建议
|
||
|
||
**手动测试清单:**
|
||
1. API Key 验证功能
|
||
2. 单张图片压缩
|
||
3. 批量图片压缩
|
||
4. 拖拽上传功能
|
||
5. 压缩进度显示
|
||
6. 压缩前后大小对比
|
||
7. 单张下载功能
|
||
8. 打包下载功能
|
||
9. 窗口控制(最小化、最大化、关闭)
|
||
10. 错误处理(无效 API Key、无效文件等)
|
||
|
||
## 常见问题
|
||
|
||
**Q: 如何获取 Tinify API Key?**
|
||
A: 访问 https://tinify.cn/ 注册账号,免费账户每月有 500 次压缩额度。
|
||
|
||
**Q: 压缩失败怎么办?**
|
||
A: 检查 API Key 是否有效、网络连接是否正常、文件格式是否支持。
|
||
|
||
**Q: 如何修改 UI 样式?**
|
||
A: 主要样式在 `src/renderer/styles.css` 中,使用 CSS 变量定义主题色。
|
||
|
||
**Q: 如何添加新的图片格式支持?**
|
||
A: 修改 `src/main/index.js` 中的文件选择器过滤器,以及 Tinify 支持的格式。
|
||
|
||
## 贡献指南
|
||
|
||
如需修改代码,请遵循以下步骤:
|
||
1. 阅读现有代码,理解项目架构
|
||
2. 保持代码风格与现有代码一致
|
||
3. 测试修改后的功能
|
||
4. 确保打包后应用正常运行
|
||
|
||
## 许可证
|
||
|
||
MIT License |