# 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-09-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 📷 本地相册管理系统
> 基于 **PyTauri** 的桌面相册管理应用,使用 Python + Vue 3 技术栈,纯 Python 方案无需 Rust 编译器即可运行开发环境。
## ✨ 项目介绍
本地相册管理系统是一个跨平台桌面应用,专注于本地照片与视频的扫描、导入、浏览和管理。它把 Python 后端的强大处理能力与 Vue 3 前端的现代 UI 体验结合在一起,通过 PyTauri 的 IPC 机制高效通信。
**核心能力一览:**
- 🔍 **智能扫描导入**:自动识别系统图片/视频目录,支持递归扫描与实时进度反馈
- 🏷️ **EXIF 元数据解析**:拍摄时间、相机品牌型号、GPS 经纬度等一键提取
- 🖼️ **缩略图生成**:本地缓存缩略图,列表加载丝滑流畅
- ⭐ **收藏与软删除**:无损管理你的相册,支持评分
- 📊 **统计信息**:照片数量、收藏数、存储占用一目了然
- 🖥️ **无边框自定义窗口**:现代化 UI,支持最小化/最大化/关闭到托盘
## 🖼️ 界面展示
> 当前版本未附带界面截图,以下为功能界面文字说明,便于快速了解应用形态。
- **主窗口**:1280×760 无边框窗口,顶部自定义标题栏(最小化 / 最大化 / 关闭),左侧导航栏,右侧内容区
- **画廊页(Gallery)**:照片瀑布流网格,支持分页、排序、筛选;悬停显示收藏与删除按钮
- **收藏页(Favorites)**:仅展示已收藏照片,布局与画廊页一致
- **相册页(Albums)**:相册分组管理(开发中)
- **图片详情(PhotoDetail)**:大图预览 + EXIF 信息面板(拍摄时间、相机、GPS)
- **图片查看器(ImageViewer)**:全屏沉浸式浏览
- **视频播放器(VideoPlayer)**:基于 video.js 的本地视频播放
> 📌 **图片排版规则**(后续添加截图时遵循):
> - 1 张图:使用 `
![]()
` 居中展示
> - 多张图:使用 2 列表格等宽排版,每行 2 张
> - 界面展示截图统一放在本节,置于项目介绍之后
## 🛠️ 技术栈
| 层级 | 技术 | 说明 |
|------|------|------|
| 后端 | Python 3.10+ + PyTauri | IPC 通信,纯 Python 方案 |
| 前端 | Vue 3 + Element Plus + Pinia | Composition API,Vite 构建 |
| 数据库 | SQLite + Peewee ORM | 轻量级本地存储 |
| 图像处理 | Pillow | 缩略图生成 |
| EXIF 解析 | exifread | 元数据提取 |
| 包管理 | uv / pnpm | Python 与前端依赖管理 |
| 打包 | Tauri + tauri-cli | 生成 msi / nsis 安装包 |
## 📦 项目结构
```
py-tauri/
├── src/
│ ├── backend/ # Python 后端
│ │ ├── commands/ # IPC 命令模块(scan/photos/window)
│ │ ├── utils/ # 工具模块(media_finder/exif_parser/thumbnail)
│ │ ├── models.py # Peewee 数据模型
│ │ └── main.py # 应用入口
│ ├── frontend/ # Vue 3 前端
│ │ ├── src/
│ │ │ ├── components/ # Vue 组件
│ │ │ ├── views/ # 页面(Gallery/Favorites/Albums/...)
│ │ │ ├── stores/ # Pinia Store
│ │ │ ├── utils/ # pytauri.js / api.js
│ │ │ ├── App.vue
│ │ │ └── main.js
│ │ ├── package.json
│ │ └── vite.config.js
│ ├── data/ # 数据目录(SQLite)
│ └── assets/ # 静态资源 / 缩略图缓存
├── src-tauri/ # Tauri 配置与 Rust 侧代码
├── doc/ # 设计文档
├── pyproject.toml # 项目配置 + uv 镜像
├── requirements.txt # Python 依赖(兼容 pip)
├── build.py # 打包脚本
├── run.py # 启动脚本
└── run.bat # Windows 一键运行
```
## 🚀 小白部署教程(Windows)
> 本教程面向零基础用户,按步骤操作即可跑起来。所有命令在 **PowerShell** 或 **CMD** 中执行。
### 第 0 步:克隆项目
```powershell
git clone https://gitee.com/python_90/py-tauri.git
cd py-tauri
```
### 第 1 步:安装 Python(≥ 3.10)
1. 访问 [python.org](https://www.python.org/downloads/) 下载 Python 3.10 及以上版本
2. 安装时勾选 **Add Python to PATH**
3. 验证:`python --version` 应输出 `Python 3.10.x` 或更高
### 第 2 步:安装 Node.js 与 pnpm
1. 访问 [nodejs.org](https://nodejs.org/) 下载 LTS 版本并安装
2. 验证:`node --version` 与 `npm --version`
3. 安装 pnpm:
```powershell
npm install -g pnpm
pnpm --version
```
### 第 3 步:安装 uv(Python 包管理器)
```powershell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
验证:`uv --version`(如未生效,重开终端)
> 💡 已配置清华镜像(见 `pyproject.toml` 中 `[tool.uv]`),国内安装依赖更快。
### 第 4 步:安装前端依赖
```powershell
cd src\frontend
pnpm install
cd ..\..
```
### 第 5 步:安装 Python 依赖
```powershell
uv sync
```
> 若 `uv sync` 不可用,可使用:`uv pip install -e .`
### 第 6 步:启动开发环境
**方式 A:一键运行(推荐)**
```powershell
.\run.bat
```
**方式 B:手动分终端运行**
- 终端 1(前端开发服务器):
```powershell
cd src\frontend
pnpm dev
```
- 终端 2(后端,需先设置开发服务器地址):
```powershell
$env:DEV_SERVER="http://localhost:5173"
uv run python run.py
```
启动后会弹出 1280×760 的应用窗口,即表示部署成功 🎉
### 第 7 步(可选):打包为独立可执行文件
打包需要 Rust 工具链:
```powershell
irm https://win.rustup.rs | iex
uv run python build.py
```
产物位于 `src-tauri/target/release/bundle/`。
## 📚 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)
```bash
uv sync # 同步依赖(推荐)
uv pip install # 添加依赖
uv pip install --upgrade
uv pip freeze > requirements.txt
uv run python run.py # 运行应用
uv run python build.py # 打包
```
### 前端(pnpm)
```bash
cd src/frontend
pnpm install
pnpm dev # 开发服务器
pnpm build # 生产构建
pnpm add
pnpm update
```
## 🗃️ 数据库模型
### 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()` — 打开设置窗口
## 🌈 功能特性
### 已实现
- [x] 照片扫描导入(支持图片和视频)
- [x] EXIF 元数据解析(拍摄时间、相机信息、GPS 等)
- [x] 缩略图生成
- [x] 照片列表展示(支持分页、排序、筛选)
- [x] 收藏功能
- [x] 删除功能(软删除)
- [x] 扫描进度实时反馈(Channel 流式传输)
### 待实现
- [ ] 大图预览
- [ ] 地图展示 GPS 位置
- [ ] 相册管理
- [ ] 重复文件检测
- [ ] 视频播放
- [ ] 批量操作
- [ ] 系统托盘
- [ ] 设置面板
## 📄 许可证
MIT License