基于 Vue 3、TypeScript 和 Tauri 2 的对话式图片生成应用。项目同时支持 Web 运行时和桌面运行时:Web 端保留浏览器体验,桌面端将配置、历史记录和生成图片保存在本机,并提供本地文件管理、zip 导入导出和存储清理能力。
- 对话式图片生成:输入描述后调用兼容 OpenAI 图片生成 API 的端点生成图片。
- 自定义 API 配置:支持配置 API Endpoint、API Key 和模型名称。
- 图片生成选项:支持尺寸、质量、数量和风格模板。
- 对话历史:支持当前对话和历史列表管理。
- 桌面本地保存:Tauri 端将生成图片写入应用数据目录下的
images/。 - 桌面密钥保护:API Key 保存到 macOS Keychain,应用数据文件只保留非敏感配置。
- 桌面导入导出:Tauri 端使用 zip 包导出历史和图片,Web 端继续使用 JSON。
- 本地图片操作:桌面端可打开图片、在文件管理器中显示、另存为、复制到剪贴板。
- 存储清理:设置页可查看数据目录、图片数量、占用空间,并清理孤儿图片。
- 原生桌面体验:融合式标题栏、macOS 菜单、窗口状态恢复、单实例和后台生成通知。
- 自动更新:通过 GitHub Releases 检查、下载并安装签名更新。
- 主题切换:支持浅色、深色和跟随系统主题。
- 前端框架:Vue 3 + TypeScript
- 构建工具:Vite
- 状态管理:Pinia
- 桌面框架:Tauri 2
- 元数据存储:Web 使用 localStorage,桌面使用 Tauri Store
- 图片文件存储:桌面使用 Tauri AppData 下的
images/ - 文件能力:Tauri fs、dialog、opener、clipboard-manager 插件
- 网络能力:Web 使用浏览器
fetch,桌面使用 Tauri HTTP 插件 - 测试:Vitest
npm installnpm run devnpm run tauri:devnpm run buildnpm run build:desktopnpm run tauri:build:unsigned该命令仅在 src-tauri/target/unsigned/ 下生成未签名的 macOS .app,不生成 DMG 或 updater artifacts,也不读取仓库内的 updater 私钥。独立的 target 目录可以避免把历史签名构建产物误认为本次输出。
配置 updater 签名、Apple Developer ID 和 notarization 环境变量后运行:
npm run tauri:buildtauri:build 保留为完整签名发布入口;没有签名凭据时请使用上面的 unsigned 命令。
发布前可检查 package.json、Cargo 和 Git tag 的版本是否一致:
npm run version:checknpm test首次使用需要配置 API:
- 打开右上角设置。
- 输入 API 端点,例如
https://api.openai.com。 - 输入 API Key。
- 按需调整模型名称。
- 点击“测试连接”验证配置,再保存。
Web 端配置保存在浏览器 localStorage。桌面端的 Endpoint、模型和配置名称保存在 Tauri Store,API Key 单独保存在 macOS Keychain,不会写入应用数据文件或上传到应用服务器。
当前仍处于首次发布前开发阶段。Keychain 存储切换会保留旧配置的 Endpoint、模型和名称,但不会迁移旧 API Key,升级开发构建后需要重新填写 API Key;聊天记录、历史和本地图片不会被清空。
- 在输入框中描述需要生成的图片。
- 选择尺寸、质量、数量和风格模板。
- 发送后生成结果会进入当前对话。
- 点击图片可放大预览。
- 桌面端本地图片在预览弹窗中支持打开、显示、另存为和复制。
桌面端会把图片保存到系统应用数据目录下的 images/ 子目录。实际数据目录会显示在设置页的“本地存储”区域,也可以从设置页直接打开。
桌面端保存的数据包括:
- API 配置和用户偏好。
- 当前对话和历史列表。
- 生成图片文件。
- 导入 zip 后写入本机的图片文件。
删除消息、删除历史和清空历史会尝试清理不再被引用的本地图片。设置页还提供孤儿图片统计和手动清理入口,清理前会显示数量和预计释放空间。
Web 端:
- 导出为 JSON。
- 适合浏览器内简单备份。
- 不包含桌面端本地图片文件目录结构。
桌面端:
- 导出为 zip 包。
- zip 内包含
history.json和images/。 - 图片引用使用相对路径,便于迁移到另一台机器。
- 导入支持 replace 和 merge 模式。
- 导入失败时不会破坏当前数据。
图片生成请求使用兼容 OpenAI 图片生成 API 的格式:
POST {endpoint}/v1/images/generations
Authorization: Bearer {api_key}
Content-Type: application/json{
"model": "gpt-image-2",
"prompt": "图片描述",
"n": 1,
"size": "1024x1024",
"quality": "standard",
"response_format": "b64_json"
}图片编辑使用 multipart form data 调用 {endpoint}/v1/images/edits。
- 应用名:
AI 图片生成助手 - Bundle identifier:
com.chatimage.desktop - 当前版本:
0.1.0 - 本地 unsigned
.app:src-tauri/target/unsigned/release/bundle/macos/AI 图片生成助手.app - 签名发布 DMG:
src-tauri/target/universal-apple-darwin/release/bundle/dmg/AI 图片生成助手_0.1.0_universal.dmg
推送 v* tag 会触发 .github/workflows/release-desktop.yml:CI 先构建 universal macOS 安装包并创建 draft Release,验证应用签名、公证票据、DMG、updater 签名和 latest.json 后才公开发布。仓库需要配置以下 Secrets:
TAURI_SIGNING_PRIVATE_KEY、TAURI_SIGNING_PRIVATE_KEY_PASSWORDAPPLE_CERTIFICATE、APPLE_CERTIFICATE_PASSWORD、APPLE_SIGNING_IDENTITYAPPLE_ID、APPLE_PASSWORD、APPLE_TEAM_ID
updater 公钥已提交到 src-tauri/.updater/chat-image.key.pub;对应私钥文件匹配 src-tauri/.updater/*.key 的 gitignore 规则,必须以 0600 权限安全备份。构建脚本不会自动读取该文件,发布时由 CI Secrets 提供 TAURI_SIGNING_PRIVATE_KEY。
Web 端仍受浏览器 CORS 限制。如果 API 端点不允许浏览器跨域请求,需要使用支持 CORS 的端点或代理服务。
桌面端使用 Tauri HTTP 插件发起请求,通常可以减少 CORS、代理和证书兼容问题。
桌面端图片依赖本地 images/ 文件。不要手动删除应用数据目录中的图片文件。若出现孤儿图片或空间占用异常,可在设置页刷新存储统计并执行清理。
请确认 zip 包来自桌面端导出,并包含有效的 history.json 和 images/ 文件。损坏或缺失图片的 zip 会被拒绝或给出错误提示。
src/
components/ Vue 组件
composables/ 组合式逻辑
platform/ Web/Tauri 平台能力封装
services/ API 服务
stores/ Pinia 状态
types/ TypeScript 类型
utils/ 工具函数
src-tauri/
capabilities/ Tauri 权限配置
icons/ 桌面应用图标
src/ Tauri Rust 入口
MIT License