# 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 `` 渲染图标 - 状态标签使用颜色编码: - `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