You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
flowchart LR
A["React + TypeScript + Vite"] --> B["web/src/api.ts"]
B --> C["FastAPI app.py"]
C --> D["ImageService"]
D --> E["本地文件系统"]
D --> F["Pillow / imageio / 缓存目录"]
A --> G["Zustand Store"]
A --> H["TanStack Query"]
A --> I["WebSocket Events"]
flowchart LR
A["start_local.bat"] --> B["start_local.py"]
B --> C["src/mulimgviewer/__main__.py"]
C --> D["wxPython Desktop UI"]
Loading
说明
本地版不依赖浏览器
启动的是 wxPython 窗口
主要沿用原项目逻辑
11.2 Web 版启动链路
flowchart LR
A["start_web.bat"] --> B["start_web.py"]
B --> C["检查 Python 依赖"]
B --> D["检查 web/dist"]
D --> E["必要时 npm run build"]
B --> F["FastAPI + Uvicorn"]
F --> G["浏览器打开 http://127.0.0.1:8000"]
Loading
说明
Web 版启动后,浏览器是主界面
start_web.py 已经处理 src 布局的导入问题
不需要再手动设置 PYTHONPATH
12. 常见错误与排查
12.1 ModuleNotFoundError: No module named 'mulimgviewer'
原因:
直接使用了 python -m mulimgviewer.web
当前环境没有安装包
没有设置 PYTHONPATH
解决:
优先改用:
.\start_web.bat
或:
python .\start_web.py
12.2 favicon.ico 404报错
原因:
浏览器会自动请求标签页图标
当前状态:
已在 app.py 中处理为非致命响应
12.3 缩略图偶发 416 Requested Range Not Satisfiable报错
原因:
浏览器缓存 / Range 请求与文件变化时机重叠
当前缓解:
缩略图与预览 URL 已加版本参数
12.4 资源管理器输入了路径,列表又跳回旧目录
原因:
异步请求先后返回顺序不同造成旧结果回写
当前修复:
BrowseDialog.tsx 中已限制只有当前请求对应路径才刷新地址栏
13. 测试与验证
13.1 后端测试
python -m pytest tests\test_web_api.py -q
覆盖:
会话打开
目录递归扫描
缩略图 / 预览 / 渲染 / 保存
浏览器接口
文件夹自动同步
13.2 前端构建
cd web
npm run build
13.3 E2E
cd web
npm run test:e2e
说明:
Playwright 使用独立测试端口,避免误复用你本机已启动的旧服务
14. 当前版本总结
version2026.4.23.1 相比初始 Web MVP,已经把“能打开”推进到了“能稳定用”:
建议开发MulimgViewer的web同步版本,web前端技术可以实现我们传统pythonwxformbuilder实现不了的视觉冲击和性能
更新后的图片导入功能 更加美观和现代化
[
](url)

更新后的主界面更加美观,功能拓展丰富
很容易便实现了繁体中文和简体中文以及English的支持
MulimgViewer Web 技术文档
Version:
2026.4.23.1Last Updated:
2026-04-231. 文档目标
本文档用于说明当前 Web 版的:
2. 两个版本怎么区分
MulimgViewer 应有两种启动形态。
wxPython桌面窗口start_local.bat/start_local.pysrc/mulimgviewer/__main__.pyReact + FastAPIstart_web.bat/start_web.pysrc/mulimgviewer/web/__main__.py、src/mulimgviewer/web/app.py最直观的区别
http://127.0.0.1:8000,那是 Web 版。3. 为什么以前
python -m mulimgviewer.web容易报错仓库采用的是
src/布局:这意味着:
python -m mulimgviewer.webPYTHONPATH=.\srcPython 就会找不到
mulimgviewer,报:为了解决这个问题,当前web版本新增了两套启动器:
start_local.py/start_local.batstart_web.py/start_web.bat它们会自动把仓库路径和
src路径处理好,所以后续不再推荐直接手敲python -m mulimgviewer.web。4. 一键启动脚本
4.1 新增文件
位于仓库根目录:
4.2 脚本职责
start_local.py职责:
--check自检start_web.py职责:
src加入 Python 搜索路径web/dist不存在则自动执行一次npm run build--check.bat包装脚本职责:
python建议:
mulimgviewer环境,请先手动执行:然后再运行
.bat或.py启动器。5. 推荐启动方式
5.1 原有本地版
双击方式
直接双击:
终端方式
.\start_local.bat或:
自检
或:
python .\start_local.py --check5.2 Web 版
双击方式
直接双击:
终端方式
.\start_web.bat或:
常用参数
6. Web 版总体架构
flowchart LR A["React + TypeScript + Vite"] --> B["web/src/api.ts"] B --> C["FastAPI app.py"] C --> D["ImageService"] D --> E["本地文件系统"] D --> F["Pillow / imageio / 缓存目录"] A --> G["Zustand Store"] A --> H["TanStack Query"] A --> I["WebSocket Events"]架构职责
web/dist。ImageService负责目录扫描、媒体元数据、缓存、渲染、保存和同步刷新。7. 技术栈
7.1 前端
ReactTypeScriptViteTailwind CSSRadix UIlucide-reactZustandTanStack Query@tanstack/react-virtualPlaywright7.2 后端
FastAPIUvicornPydanticPillowimageio设计选择
React + TS:适合把工具型桌面界面拆成独立模块Zustand:很适合 viewer 这种本地交互状态多的页面TanStack Query:适合轮询同步会话状态FastAPI + Pydantic:接口与模型定义清晰Pillow + imageio:可以较低成本复用现有 Python 图像处理逻辑,并扩展到视频首帧8. 代码结构
8.1 Web 前端目录
8.2 Python Web 模块目录
8.3 根目录新增启动器
9. 分层架构
9.1 前端分层
1) 视图层
文件:
web/src/App.tsxweb/src/components/*.tsx职责:
2) 状态层
文件:
web/src/store.ts职责:
3) 数据访问层
文件:
web/src/api.ts职责:
4) 通信与同步层
文件:
web/src/App.tsxweb/src/hooks/useSessionEvents.ts职责:
9.2 后端分层
1) API 层
文件:
src/mulimgviewer/web/app.py职责:
2) 业务服务层
文件:
src/mulimgviewer/web/image_service.py职责:
3) 模型层
文件:
src/mulimgviewer/web/models.pyweb/src/types.ts职责:
10. 主要功能与代码位置
10.1 Explorer 风格资源管理器
主要文件:
web/src/components/BrowseDialog.tsxsrc/mulimgviewer/web/image_service.pysrc/mulimgviewer/web/app.py实现内容:
10.2 图片 + 视频统一浏览
主要文件:
src/mulimgviewer/web/image_service.pyweb/src/components/PreviewCanvas.tsxweb/src/components/ThumbnailStrip.tsxweb/src/components/BrowseDialog.tsx实现内容:
10.3 排序 / 筛选 / 搜索
主要文件:
web/src/components/BrowseDialog.tsx实现内容:
10.4 文件夹增删自动同步
主要文件:
src/mulimgviewer/web/image_service.pyweb/src/App.tsxweb/src/store.ts实现内容:
get_session()时调用_refresh_state()updated_at真变化时同步状态10.5 多语言
主要文件:
web/src/i18n.tsweb/src/components/Sidebar.tsxweb/src/components/SettingsPanel.tsxweb/src/components/BrowseDialog.tsxweb/src/components/TopToolbar.tsx实现内容:
10.6 拼接与保存
主要文件:
src/mulimgviewer/web/image_service.pysrc/mulimgviewer/web/app.pyweb/src/App.tsxweb/src/components/RenderedPreview.tsx实现内容:
11. 启动与运行逻辑
11.1 原有本地版启动链路
flowchart LR A["start_local.bat"] --> B["start_local.py"] B --> C["src/mulimgviewer/__main__.py"] C --> D["wxPython Desktop UI"]说明
wxPython窗口11.2 Web 版启动链路
flowchart LR A["start_web.bat"] --> B["start_web.py"] B --> C["检查 Python 依赖"] B --> D["检查 web/dist"] D --> E["必要时 npm run build"] B --> F["FastAPI + Uvicorn"] F --> G["浏览器打开 http://127.0.0.1:8000"]说明
start_web.py已经处理src布局的导入问题PYTHONPATH12. 常见错误与排查
12.1
ModuleNotFoundError: No module named 'mulimgviewer'原因:
python -m mulimgviewer.webPYTHONPATH解决:
优先改用:
.\start_web.bat或:
12.2
favicon.ico 404报错原因:
当前状态:
app.py中处理为非致命响应12.3 缩略图偶发
416 Requested Range Not Satisfiable报错原因:
当前缓解:
12.4 资源管理器输入了路径,列表又跳回旧目录
原因:
当前修复:
BrowseDialog.tsx中已限制只有当前请求对应路径才刷新地址栏13. 测试与验证
13.1 后端测试
覆盖:
13.2 前端构建
13.3 E2E
说明:
14. 当前版本总结
version2026.4.23.1相比初始 Web MVP,已经把“能打开”推进到了“能稳定用”:src布局导致的启动痛点后续继续扩展
Compare / Sequence / Batch时,建议继续沿用当前这套: