初春图床 Halo 插件
将初春图床(oneimg)集成到 Halo 2.x,支持附件上传与一键同步。
本插件使用 DeepSeek v4 Pro 辅助开发。
关于初春图床
初春图床 是一个基于 Go + Vue 3 的现代化图床管理系统,支持本地/S3/WebDAV/FTP 等多种存储后端,上传图片自动转 WebP,提供 POW 安全验证、剪贴板粘贴上传、数据仪表板等功能,可通过 Docker Compose 一键部署。
功能
- 附件上传 — Halo 中上传的图片自动存储到初春图床
- 附件删除 — Halo 中删除附件不联动图床,仅删除 Halo 侧记录
- 一键同步清理 — 将初春图床中已有图片批量导入 Halo 附件库,实时显示日志,自动跳过已存在图片;同步完成后自动反向清理:对 Halo 中属于初春图床策略的附件,若对应图片在图床中已不存在,则自动删除 Halo 侧的附件记录

TODO
(暂无待办项)
前置条件
- 已部署初春图床服务
- 在初春图床后台「系统设置 → API Token」生成并启用 Token
- Halo >= 2.25.0
安装
应用市场安装
Halo 应用市场搜索本插件名即可安装。
手动安装
- 从 Releases 下载最新 JAR
- Halo 后台「插件管理 → 上传插件」安装
配置
1. 存储策略
Halo 后台「附件 → 存储策略 → 新增」选择「初春图床」:
| 配置项 | 说明 | 必填 |
|---|---|---|
| API 地址 | 初春图床部署地址,务必使用 HTTPS | ✅ |
| API Token | 后台生成的 Token | ✅ |
| 存储桶 ID | 目标存储桶,默认 1 |
✅ |
| 标签 ID | 上传时自动添加的标签(可选) | - |
2. 同步已有图片
插件设置「同步」标签页中点击「开始同步」,将初春图床中所有图片批量导入 Halo 附件库。已存在的图片自动跳过,日志实时滚动显示。
开发
环境
- JDK 21
- Gradle 8.x
- pnpm
构建
# 前端(如修改了 ui/ 目录)
cd ui && pnpm install && pnpm build
cp dist/main.js dist/style.css ../src/main/resources/console/
# 后端
./gradlew build
# 产物位于 build/libs/plugin-oneimg-X.X.X.jar
目录结构
├── ui/ # Vue 3 前端(同步标签页)
│ ├── src/
│ │ ├── index.ts # 插件入口,注册扩展点
│ │ └── SyncView.vue # 同步 UI 组件
│ └── vite.config.ts # IIFE 构建配置
├── src/main/java/io/github/alonenannan/oneimg/
│ ├── OneImgPlugin.java # 插件生命周期
│ ├── OneImgAttachmentHandler.java # 上传/删除附件
│ ├── OneImgSyncEndpoint.java # 同步 REST API
│ └── OneImgUtils.java # 配置校验等工具方法
└── src/main/resources/
├── plugin.yaml # 插件元数据
├── console/ # 前端构建产物
└── extensions/
├── policy-template.yaml # 存储策略表单
└── settings.yaml # 插件设置
技术架构
- 基于 Halo Plugin Framework,实现
AttachmentHandler扩展点 - 上传使用 Spring
WebClient调用初春图床 API(响应式非阻塞) - 同步使用
java.net.http.HttpClient,异步执行 + 前端轮询实时日志,完成后自动反向清理失效附件;API 基于 Spring Security 做登录鉴权 - 前端 Vue 3 + Vite,通过
plugin:self:tabs:create扩展点注册标签页
许可证
GPL-3.0
