# PyTauri **Repository Path**: python_90/py-tauri ## Basic Information - **Project Name**: PyTauri - **Description**: PyTauri 的桌面相册管理应用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-22 - **Last Updated**: 2026-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 本地相册管理系统 基于 PyTauri 的桌面相册管理应用,使用 Python + Vue3 技术栈。 ## 技术栈 - **后端**: Python + PyTauri (IPC 通信) - **前端**: Vue 3 + Element Plus + Pinia - **数据库**: SQLite (Peewee ORM) - **图像处理**: Pillow - **EXIF 解析**: exifread ## 项目结构 ``` PyTauri/ ├── src/ │ ├── backend/ # Python 后端 │ │ ├── commands/ # IPC 命令模块 │ │ │ ├── scan.py # 扫描导入命令 │ │ │ ├── photos.py # 照片管理命令 │ │ │ └── window.py # 窗口管理命令 │ │ ├── utils/ # 工具模块 │ │ │ ├── media_finder.py # 媒体文件查找 │ │ │ ├── exif_parser.py # EXIF 元数据解析 │ │ │ └── thumbnail.py # 缩略图生成 │ │ ├── models.py # Peewee 数据模型 │ │ └── main.py # 应用入口 │ │ │ ├── frontend/ # Vue3 前端 │ │ ├── src/ │ │ │ ├── components/ # Vue 组件 │ │ │ ├── stores/ # Pinia Store │ │ │ ├── utils/ # 工具函数 │ │ │ │ ├── pytauri.js # IPC 封装 │ │ │ │ └── api.js # API 封装 │ │ │ ├── App.vue │ │ │ └── main.js │ │ ├── package.json │ │ └── vite.config.js │ │ │ ├── data/ # 数据目录 │ └── assets/ # 静态资源 │ ├── doc/ # 文档 ├── requirements.txt # Python 依赖 ├── pyproject.toml # 项目配置 └── run.py # 启动脚本 ``` ## PyTauri IPC 通信机制 ### 后端命令定义 ```python from pytauri import Commands, WebviewWindow from pytauri.ipc import Channel, JavaScriptChannelId commands = Commands() @commands.command() async def scan_photos( folder_path: str, recursive: bool, channel_id: JavaScriptChannelId[Msg], webview_window: WebviewWindow ) -> dict: channel = channel_id.channel_on(webview_window.as_ref_webview()) # 发送进度 channel.send_model(Msg(type='progress', message='处理中...')) return {'success': True, 'imported': count} ``` ### 前端调用 ```javascript import { pyInvoke } from "tauri-plugin-pytauri-api"; import { Channel } from "@tauri-apps/api/core"; // 基础调用 const result = await pyInvoke('get_photos', { page: 1, per_page: 50 }); // 带进度回调 const channel = new Channel((message) => { console.log(message.type, message.message); }); await pyInvoke('scan_photos', { folder_path: '/path/to/photos', recursive: true, channel_id: channel }); ``` ## 包管理工具 - **Python**: [uv](https://github.com/astral-sh/uv) - 极速 Python 包管理器 - **前端**: [pnpm](https://pnpm.io/) - 高效的 Node.js 包管理器 ## 安装依赖 ### Python 依赖 (使用 uv) ```bash # 安装 uv(如果尚未安装) pip install uv # 创建虚拟环境并安装依赖 uv venv uv pip install -r requirements.txt # 或使用 pyproject.toml uv pip install -e . ``` ### 前端依赖 (使用 pnpm) ```bash cd src/frontend # 安装 pnpm(如果尚未安装) npm install -g pnpm # 安装依赖 pnpm install ``` ## 运行开发环境 ### 1. 启动前端开发服务器 ```bash cd src/frontend pnpm dev ``` ### 2. 启动后端应用(使用 uv) ```bash # 在虚拟环境中运行 uv run python run.py # 或直接运行(uv 会自动使用虚拟环境) uv run run.py ``` ## 常用命令 ### Python (uv) ```bash # 添加依赖 uv pip install # 更新依赖 uv pip install --upgrade # 生成 requirements.txt uv pip freeze > requirements.txt # 同步依赖 uv pip sync requirements.txt ``` ### 前端 (pnpm) ```bash cd src/frontend # 添加依赖 pnpm add # 添加开发依赖 pnpm add -D # 更新依赖 pnpm update # 清理缓存 pnpm store prune ``` ## 功能特性 ### 已实现 - [x] 照片扫描导入(支持图片和视频) - [x] EXIF 元数据解析(拍摄时间、相机信息、GPS 等) - [x] 缩略图生成 - [x] 照片列表展示(支持分页、排序、筛选) - [x] 收藏功能 - [x] 删除功能(软删除) - [x] 扫描进度实时反馈(Channel 流式传输) ### 待实现 - [ ] 大图预览 - [ ] 地图展示 GPS 位置 - [ ] 相册管理 - [ ] 重复文件检测 - [ ] 视频播放 - [ ] 批量操作 - [ ] 系统托盘 - [ ] 设置面板 ## 数据库模型 ### Photo(照片表) | 字段 | 类型 | 说明 | |------|------|------| | id | INTEGER | 主键 | | path | TEXT | 文件路径(唯一) | | filename | TEXT | 文件名 | | file_type | TEXT | 类型(image/video) | | file_size | INTEGER | 文件大小 | | width | INTEGER | 宽度 | | height | INTEGER | 高度 | | taken_at | DATETIME | 拍摄时间 | | camera_make | TEXT | 相机品牌 | | camera_model | TEXT | 相机型号 | | gps_latitude | REAL | GPS 纬度 | | gps_longitude | REAL | GPS 经度 | | is_favorite | BOOLEAN | 是否收藏 | | is_deleted | BOOLEAN | 是否删除 | | thumbnail_path | TEXT | 缩略图路径 | ## API 列表 ### 扫描导入 - `select_folder()` - 选择文件夹 - `scan_photos(folder_path, recursive, channel_id)` - 扫描照片 - `scan_system_photos(channel_id)` - 扫描系统目录 - `get_scan_preview(folder_path)` - 获取扫描预览 ### 照片管理 - `get_photos(page, per_page, sort_by, ...)` - 获取照片列表 - `get_photo_detail(photo_id)` - 获取照片详情 - `get_photo_image(photo_id, thumbnail)` - 获取图片数据 - `toggle_favorite(photo_id)` - 切换收藏 - `delete_photo(photo_id, permanent)` - 删除照片 - `update_photo_rating(photo_id, rating)` - 更新评分 - `get_photos_stats()` - 获取统计信息 ### 窗口管理 - `minimize_window()` - 最小化窗口 - `maximize_window()` - 最大化/还原窗口 - `close_window()` - 关闭到托盘 - `open_settings_window()` - 打开设置窗口 ## 许可证 MIT License