diff --git a/README.md b/README.md index be94114..7e453fa 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ sh build.sh - 依赖 Go 1.25.0+(`go.mod` 指定 1.25.0) - 构建时内嵌 **Windows 版 ffprobe**:`internal/probe/bin/ffprobe.exe`,需提前放置(未入库,见 `.gitignore`) -- `build.sh` 在 **Windows** 下 `go build` 后使用 `upx` 压缩,输出 `kenaito-media-picker.exe` +- `build.sh` 在 **Windows** 下先构建前端、再 `go build` + `upx` 压缩,输出 `kenaito-media-picker.exe`(Web 服务 + 内嵌前端) - 编译所需工具(ffmpeg / upx)压缩包已放在 `doc/` 目录,按需解压使用(upx 放置于项目根目录 `upx`) ## 使用方法 @@ -41,12 +41,57 @@ sh build.sh ```text # 双击有风险, 双击需谨慎 将 kenaito-media-picker.exe 拖拽到需要整理的文件夹内,双击运行即可 - -# 或命令行运行 -kenaito-media-picker.exe ``` -程序启动后有 **5 秒倒计时**,期间可 Ctrl+C 取消;倒计时结束后自动开始整理。 +程序启动后自动打开浏览器进入 **Web 管理界面**(默认 http://localhost:8080), +媒体整理不再是自动执行,而是在页面上点击 **【扫描整理】** 后开始(整理会移动文件,请先备份)。 + +## Web 管理界面 + +项目提供 **Web 管理界面**(Vue 2 + ElementUI,内嵌进程序二进制),负责触发扫描整理与浏览 `media-info.db` 媒体库。 + +### 运行服务 + +```shell +# 需要 Node.js 的机器上先构建前端(dist 会被 go:embed 打入程序) +cd frontend +npm install && npm run build + +# 回到项目根目录编译(Windows 下输出 kenaito-media-picker.exe) +go build . +./kenaito-media-picker.exe +``` + +- 默认监听 `:8080`,启动后自动打开浏览器(配置 `server.autoOpen=false` 可关闭) +- 端口 / 数据库路径 / 自动打开浏览器可在 `application.properties` 配置:`server.port` / `database.dsn`(相对路径相对服务启动目录)/ `server.autoOpen` + +### 开发模式(无需重复构建前端) + +日常开发用 **Vite 开发服务器 + Go 源码运行**,前端改动实时热更新,不需要每次 `npm run build`: + +```shell +# 终端 1:启动后端(源码运行,端口 8080) +go run . + +# 终端 2:启动前端开发服务器(端口 3000,/api 自动代理到 8080) +cd frontend +npm install && npm run dev +``` + +- 浏览器访问 **http://localhost:3000** 即可联调 +- 改前端文件 → Vite 热更新自动生效;改后端 → 重启 `go run .` + +**只有发布时才需要重新构建前端**:执行 `npm run build` 把产物打进 `frontend/dist`,再 `go build .` 重新编译,前端改动才会进入二进制。 + +### 页面功能 + +| 页面 | 功能 | +|------|------| +| 扫描整理 | 点击【开始扫描】触发扫描归类,实时显示运行日志与进度 | +| 统计看板 | 媒体总数/总体积/重复文件、类型/方向/分辨率/编码/格式分布、体积 TOP10 | +| 媒体库 | 按类型/方向/分辨率/编码/格式/文件名筛选,分页 + 列排序 | + +> 分辨率统计与筛选复用归类规则(标准规格 / 1K~19K / 普通 / 原图),与归类结果一致。 ## 整理规则 @@ -107,15 +152,20 @@ lightScore = 亮度 > 175 的像素占比 ## 目录结构 ```text -├── main.go # 程序入口(装配与编排) +├── main.go # 程序入口(Web 服务:Gin + 内嵌前端产物) ├── internal/ │ ├── scanner/ # 文件扫描、MIME 读取、图片/媒体候选过滤 │ ├── probe/ # 媒体探测:图片尺寸 + ffprobe 解析 + 内嵌解码器释放 │ ├── classify/ # 纯函数归类规则(方向 + 标准分辨率 + K档 + 明暗等级) │ ├── organize/ # 整理编排:探测→归类→收集→移动→记录去向 │ ├── mover/ # 文件移动(rename / 跨盘 copy+delete) -│ ├── store/ # SQLite 媒体信息持久化 +│ ├── store/ # SQLite 媒体信息持久化 + 查询/统计 +│ ├── service/ # 后台任务编排(扫描整理任务 + 状态/日志) +│ ├── config/ # Web 服务配置加载(application.properties) +│ ├── api/ # HTTP 接口层(统一响应 / 媒体列表 / 统计 / 扫描触发) │ └── digest/ # 文件 MD5 / 指纹采样 +├── frontend/ # 前端工程(Vue 2 + ElementUI + Vite,dist 内嵌进程序) +├── application.properties # Web 服务配置(端口 / 数据库路径) ├── doc/ # 构建依赖(ffmpeg / upx 压缩包) └── build.sh # 编译脚本(upx 压缩) ``` @@ -124,6 +174,8 @@ lightScore = 亮度 > 175 的像素占比 - 默认使用**移动**模式,原文件会从源目录移走;同名文件跨磁盘时自动降级为复制 + 删除 - 已整理文件全部移动到 `{当前目录名}-picker` 白名单目录内,重复运行会跳过该目录,并将新文件并入已有的分类目录 +- 扫描整理由页面点击触发,整理期间服务会短暂占用较多 CPU/磁盘,属正常现象 +- 同一时间只允许一次扫描整理;重复点击会提示「正在运行中」 - GIF 图片单独归入「图片_GIF」;GIF 视频按方向归入「视频_*_GIF」 - ffprobe 内嵌(Windows),运行前释放到当前目录、结束后自动删除 diff --git a/application.properties b/application.properties new file mode 100644 index 0000000..f08179b --- /dev/null +++ b/application.properties @@ -0,0 +1,7 @@ +# Web 服务基础配置(cmd/server/main.go 使用,CLI 整理功能不读取) +appname=kenaito-media-picker +server.port=8080 +# 启动后自动打开浏览器(false 则不自动打开) +server.autoOpen=true +# 媒体信息数据库路径;留空或相对路径时相对服务启动目录(如 media-info.db) +database.dsn=media-info.db diff --git a/build.sh b/build.sh index 49aa399..919eeb7 100644 --- a/build.sh +++ b/build.sh @@ -1,10 +1,17 @@ #!/bin/sh -# 构建脚本:Windows 平台编译,go build + upx 压缩 → kenaito-media-picker.exe +# 构建脚本:Windows 平台编译,go build + upx 压缩 → kenaito-media-picker.exe / kenaito-media-picker-server.exe # Windows (MINGW/MSYS/CYGWIN): go build + upx 压缩 set -e echo "=== Windows: go build + upx 压缩" + +# 前端构建(需 Node.js;已在 frontend 构建过或无法安装 Node 时可跳过) +if [ -d frontend ] && [ -f frontend/package.json ]; then + (cd frontend && npm install --no-audit --no-fund >/dev/null 2>&1 && npm run build >/dev/null 2>&1) || echo "=== 前端构建失败(缺少Node.js?),将使用已存在的 frontend/dist 产物" +fi + +# 主程序(Web 服务 + 内嵌前端,页面点击触发扫描整理) rm -f kenaito-media-picker.exe kenaito-media-picker-release.exe go build -o kenaito-media-picker-release.exe . ./upx -o kenaito-media-picker.exe kenaito-media-picker-release.exe diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..ce7cf5c --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/* +!dist/.gitkeep diff --git a/frontend/dist/.gitkeep b/frontend/dist/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/embed.go b/frontend/embed.go new file mode 100644 index 0000000..1619bd1 --- /dev/null +++ b/frontend/embed.go @@ -0,0 +1,8 @@ +// Package frontend 内嵌前端构建产物(frontend/dist),实现 Web 服务单二进制部署。 +// 开发时用 `npm run dev` + Vite 代理;生产构建后重新 `go build` 即打入 dist。 +package frontend + +import "embed" + +//go:embed all:dist +var Dist embed.FS diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..7f4ba69 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + +
+ + +