Files
TinyPanda/AGENTS.md

185 lines
6.4 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.

# 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