FIT2CLOUD
绘画空间 的图标

绘画空间

162
40

在线绘画创作、作品画廊与异步你画我猜,支持嵌入 Halo 页面。

绘画空间

为 Halo 2.27+ 提供在线画板、作品画廊和异步你画我猜。访客可以浏览作品,登录用户可以创作、保存草稿、发布作品和参与猜题;站长负责审核、举报处理及前台配色。

通过默认编辑器插入文章或自定义页面,展示地址由站长设置,跟随博客主题的浅色、深色模式。

当前版本:1.0.1,要求 Halo 2.27.0+。通过编辑器组件展示,页面地址由站长自行设置。

演示与交流

功能

  • 画板:鼠标、触屏和笔输入;圆滑笔迹、橡皮擦、颜色/粗细、撤销/重做、尺寸/背景、缩放和 PNG 导出。
  • 全屏:画板右上角可进入/退出全屏,保留笔迹;不支持原生全屏时使用展开模式,Esc 返回。
  • 创作:浏览器自动草稿、账号草稿、继续编辑、发布审核和删除。
  • 作品展示:画板下方展示最新公开作品,发布审核后自动进入画廊。账号草稿、待审作品与公开作品分别显示状态。
  • 画廊:真实作品、最新/热门排序、作者筛选、分页、懒加载、点赞、分享、举报和 Halo 原生评论。
  • 画谜:作者填写谜底和提示,服务端判题、尝试次数限制、一次性积分、积分榜、作者猜题统计和手动揭晓。关闭游客猜题时,未登录访客会显示登录入口。
  • 作品详情:完整画作展示、作者与发布状态、独立猜题区域;猜题统计使用弹窗,揭晓和删除操作二次确认,提交期间防止重复操作。
  • 后台:作品审核管理、举报处理、Halo 原生插件设置;浅色和深色可分别自定义 UI 配色。

画谜按作品异步进行,作者与猜题者无需同时在线。插件使用 Halo 现有账号、附件与数据存储,无需额外部署服务。

界面预览

截图来自本地 Halo 2.27.0 的实际页面,展示已有作品和默认配色;手机图为 390px 浏览器视口预览。

在线画板

画笔、橡皮擦、撤销重做、缩放和导出集中在工作区,右侧可切换绘画工具与发布设置。

在线画板:编辑已有作品,顶部可保存草稿和发布

作品画廊

按最新发布或最多喜欢浏览作品,支持查看作者画廊、打开详情和继续创作。

作品画廊:真实作品列表、排序与创作入口

画谜详情

画作、提示、审核状态和作者操作分区展示。截图为作者查看待审核作品;作品公开后,其他用户可按站点权限参与猜题。

画谜详情:待审核状态、提示和作者操作

查看深色模式、手机布局和操作确认

组件跟随主题深色模式,画作本身的颜色保持原样。

深色模式下的画谜详情

窄屏下画作与信息上下排列,猜题和作者操作保持可用。

390px 手机视口下的画谜详情

揭晓前说明操作结果,支持取消、Esc 和点击遮罩关闭;实际提交时锁定弹窗。

页面内的揭晓确认弹窗

查看站长配色设置

在插件设置的「前台外观」中启用自定义配色,分别设置浅色和深色的强调色、按钮、背景和正文颜色。留空采用默认值。

Halo 插件设置中的前台外观与配色字段

编辑器组件与创建指引

在后台点击「新建展示页面」,使用默认编辑器的「绘画空间」组件。可选择首次打开画廊、画谜或画板,发布后的地址由当前页面决定。

默认编辑器中的绘画空间组件

后台作品管理直接显示创建步骤,方便站长完成页面设置。

后台的页面创建指引和新建展示页面入口

构建与安装

要求 Java 21、Node.js >= 22.12、pnpm 10.33,最低 Halo 2.27.0。

./gradlew build

也可从 Releases 下载 plugin-drawing-board-1.0.1.jar,在 Halo Console 的插件管理中安装并启用。

自行构建时生成 build/libs/plugin-drawing-board-1.0.1.jar,包含服务端、Vue Console 和 Svelte 嵌入组件。启用后,到「绘画空间 → 插件设置」选择附件存储策略、审核、发布和猜题权限。

管理员默认审核新作品及修改后的作品。普通账号只能编辑自己的作品;委派管理员可分配「管理绘画作品与举报」权限。谜底揭晓前不会进入公开作品响应。

图片使用 Halo 附件,私有绘画指令存放于 ${halo.work-dir}/drawing-board/documents。备份时同时备份 Halo 数据库、附件和该目录。不要将草稿 PNG 的附件链接视作私密文件存储。

使用流程

  1. 配置插件:安装并启用后,进入「绘画空间 → 插件设置」,选择作品图片存储策略,确认发布权限、审核开关和猜题次数。
  2. 创建展示页面:进入「页面 → 自定义页面」新建页面,自行设置标题和地址。使用默认编辑器,点击「插入内容 → 绘画空间」或输入 /绘画空间,选择首次打开的模块后发布,再把页面加入站点菜单。文章中也可插入组件。
  3. 创作与发布:登录后开始绘画,可保存账号草稿,或点击「发布作品」填写描述并确认。开启审核时,作品先进入待审核状态,由管理员公开后展示。
  4. 创建画谜:进入「你画我猜 → 发布画谜」,填写正确答案与可选提示。其他用户在详情页提交答案,作者通过「猜题情况」查看记录。
  5. 管理谜底:画谜首次发布后不能再修改题面或谜底。作者可主动揭晓,揭晓后所有人可见答案,该作品停止接受猜题。

作品公开后可点赞、分享和评论;登录用户可举报他人作品。草稿、待审核与隐藏作品只向作者及有管理权限的账号展示。访客猜题默认关闭,站长可按需开启;访客不计排行榜积分。

嵌入 Halo 页面

先创建文章或自定义页面,再在 Halo 默认编辑器中点击「插入内容 → 绘画空间」,或输入 /绘画空间 插入组件。卡片内的「首次打开」决定访客初次进入时显示画廊、画谜或画板;已分享的内部链接保留当前位置。

也可在自定义页面的 HTML 内容中加入:

<drawing-space></drawing-space>

插件通过 Halo 的 TemplateHeadProcessor 自动注册组件。没有组件的页面只加载小型注册脚本;Svelte 和业务资源在组件出现时才加载。

也可以在主题模板中放置同一标签。无需 iframe、复制构建文件或导入全局 CSS。

<!-- 默认打开画谜;可选值为 gallery、play、create -->
<drawing-space page="play"></drawing-space>
  • 使用 Shadow DOM 隔离样式,不改变主题的 html/body、页头、页脚、字体设置或配色开关。
  • 默认跟随主题浅色/深色状态,也可设置 theme="light" 或 theme="dark"。
  • 按父容器宽度自适应,支持带侧栏的主题内容区。
  • 详情、创作、返回、分享和登录返回均保留当前页面路径,用组件自己的查询参数保存位置,刷新可恢复;不注册前台固定路径。
  • 同一页面有多个组件时使用不同的 route-key,例如 <drawing-space route-key="gallery-a">。

站长自定义配色

站长可在「绘画空间 → 插件设置 → 前台外观」开启「自定义配色」,使用拾色器设置颜色,无需编写 CSS。

  • 浅色与深色各自支持:强调色、主按钮背景、主按钮文字、页面背景、面板背景、正文颜色。
  • 留空使用默认颜色;关闭「自定义配色」立即恢复默认方案,保留已填写颜色。
  • 保存后刷新包含组件的页面即可生效。页面背景默认透明。
  • 配色只影响绘画空间 UI,不修改主题页头/页脚,也不改变画布背景、画笔颜色和已发布作品。主按钮文字与背景颜色请搭配设置。

单个组件覆盖

单个组件仍可通过宿主 CSS 变量覆盖全站设置,优先级为「宿主变量 → 后台配色 → 默认颜色」:

drawing-space {
    --drawing-accent: #36796c;
    --drawing-button: #303638;
    --drawing-button-text: #ffffff;
    --drawing-font: inherit;
    /* 可选:--drawing-background、--drawing-surface、--drawing-color */
}

从默认入口迁移

当前源码不再注册 /drawing、/drawing/create、/drawing/play 或作品详情等前台路由,页面地址完全交给 Halo 的文章和自定义页面管理。自行创建 /drawing 页面也不会被插件覆盖。

之前使用插件默认入口的站点,升级后需先新建展示页面、插入组件并发布,再将站点菜单更新为该页面地址。已有作品、草稿、谜底及积分数据继续保留;旧的固定详情链接需要从新页面重新分享。

后台作品与举报通过弹窗预览。绘画作品的评论主体保留标题,不再生成指向默认前台路由的链接;读者可从组件内分享实际作品地址。

本地开发与验证

scripts/start-local-halo.sh
python3 scripts/prepare-local-acceptance.py
./gradlew build
python3 scripts/deploy-local.py
python3 scripts/acceptance-api.py

隔离服务为 http://localhost:8096,后台为 /console/drawing-board。准备脚本只初始化本机测试环境;本地测试凭据、数据库和验收证据位于被忽略的 build/,README 展示截图位于 docs/images/。执行 ./gradlew clean 会删除这份本地测试数据,需要时先备份 build/dev/halo。

pnpm -C ui dev:frontend        # Svelte 组件调试
pnpm -C ui dev                 # Vue Console 构建监听
./gradlew generateApiClient -x build  # 从实际本地 OpenAPI 重新生成客户端
pnpm -C ui exec eslint src
pnpm -C ui exec oxlint src --ignore-pattern src/api/generated

前台使用 Svelte 5 Web Component,后台使用 Halo 原生 Vue Console。两套 UI 均复用 Halo axiosInstance 和实际 OpenAPI 生成的客户端。不要编辑生成客户端或构建资源。

数据和接口见 架构说明。真实手机、压感笔、大规模并发和云存储供应商尚未验收;访客猜题默认关闭且不进入积分榜,不适用于有奖活动。前台评论提供顶级评论。

GPL-3.0 © Handsome


讨论(0)

这是一个开源应用,我们推荐优先在开源仓库中提交 issue,以便开发者更好地接收和跟进问题。

去提交 issue