文章海报生成
BadouCMS 插件:在文章详情页一键生成分享海报,海报包含封面、标题、简介、站点品牌、发布日期和文章二维码,支持浏览器端下载与后台统一管理。
功能
- 文章详情页自动挂载「生成海报」按钮,也可在模板中手动指定位置
- 750 × 1000 竖版海报,封面自适应裁切,标题/简介自动换行与省略
- 自动生成文章二维码,扫码即可阅读原文
- 支持自定义品牌名称、Logo、头部背景图、主题色、底部文案
- 用户生成后自动上传缓存,后台可视化查看、下载、批量删除、一键清空
- 所有图片由服务端转成 data URL,Canvas 不会因跨域被污染,下载不会失败
- 适配 PC / 手机端,无第三方前端依赖(不依赖 jQuery、Layui,主题无需改动)
环境要求
| 项目 | 要求 |
|---|---|
| BadouCMS | 2.4.0 及以上(依赖 ModuleViewFilter HTML 响应钩子) |
| PHP | 8.1+(与 BadouCMS 保持一致) |
| 依赖模块 | cms(提供文章详情与内容模型) |
| 扩展 | GD(生成二维码,系统自带二维码标签同样需要) |
| 目录权限 | public/uploads 可写 |
使用
- 前台:打开任意文章详情页,右下角会出现「生成海报」按钮,点击后预览、保存。
- 后台:「文章海报 → 海报列表」查看已缓存的海报,可预览大图、批量删除。
- 后台:「文章海报 → 海报设置」调整开关与样式,「清空海报」会同时删除数据库记录与图片文件。
配置项
| 配置 | 说明 |
|---|---|
| 启用海报 | 总开关,关闭后不输出按钮与接口数据 |
| 自动缓存 | 用户生成后自动上传保存,后台可统一管理 |
| 品牌名称 / Logo | 留空时读取站点标题与站点 Logo |
| 显示内容 | 封面、简介、发布日期、二维码的独立开关 |
| 标题 / 简介行数 | 1~3 行,超出自动省略 |
| 底部文案 / 二维码提示 / 保存按钮 | 海报与弹窗上的自定义文案 |
目录结构
modules/poster/
├── Poster.php # 插件入口:注入、菜单、安装/启停
├── info.ini # 插件信息
├── install.sql # 海报表与配置表
├── depend.php # 依赖 cms >= 2.4.0
├── README.md
├── .modulerc # 启用后释放到项目根目录的文件清单
├── app/
│ ├── admin/controller/Poster.php # 后台:列表、设置、清空
│ ├── admin/view/poster/ # 后台视图
│ ├── common/library/PosterImage.php # 图片转 data URL、二维码
│ ├── common/model/Poster.php # 海报记录(删除时清理文件)
│ ├── common/model/PosterSetting.php # 配置读写与校验
│ ├── index/controller/Poster.php # 前台接口:data / save
│ └── index/route/poster.php # 前台接口路由
└── public/assets/poster/
├── poster.css # 按钮与弹窗样式(访问地址 /assets/poster/poster.css)
└── poster.js # Canvas 合成、预览、下载、上传启用插件后,app/ 与 public/assets/poster/ 下的文件由框架释放到项目根目录;禁用时自动收回插件目录。
接口
| 方法 | 地址 | 说明 |
|---|---|---|
| GET | /poster/api/data?id=文章ID | 返回标题、简介、封面、二维码、品牌等数据(均为 data URL 或文本) |
| POST | /poster/api/save | 参数 id、image(data URL),保存/覆盖该文章的海报 |
接口为公开接口(海报需要游客也能生成),服务端会校验文章是否已发布、图片格式与大小,并限制单篇文章只保留一张缓存海报。
常见问题
1. 前台没有按钮
- 确认插件已启用,且「海报设置 → 启用海报 / 自动注入」已开启;
- 本插件依赖 BadouCMS 2.4+ 的
ModuleViewFilter,旧版本请升级后台; - 检查详情页 HTML 是否包含
id="bd-poster-app",以及/assets/poster/poster.js是否 404(重新启用插件可重新释放静态资源)。
2. 提示海报保存失败
- 检查
public/uploads/poster目录是否存在且可写; - 确认 PHP
post_max_size不小于 8M(海报以 base64 上传)。
3. 海报里没有封面图
- 文章「缩略图」为空时会尝试读取多图第一张及正文第一张图片;
- 远程图片需允许服务端访问,内网地址会被安全策略拦截。
4. 想换海报尺寸/版式
- 版式在
public/assets/poster/poster.js的draw()中,修改W、H与各区块坐标即可;修改后记得同步提升Poster.php中的VERSION以刷新浏览器缓存。
卸载说明
本地安装的插件无法通过官方模块管理卸载,请按下面步骤手动清理:
- 删除
.modulerc中列出的全局文件(app/admin/...、app/common/...、app/index/...、public/assets/poster/...); - 删除后台菜单:在「权限管理 → 菜单规则」中删除名称为
poster及其子节点; - 如需彻底清理,删除
bd_poster、bd_poster_setting两张表与public/uploads/poster目录; - 将
modules/poster/info.ini的state改回0,删除modules/poster目录; - 清除后台缓存(或删除
runtime下的缓存文件)。
保留两张表与图片时,重新安装后历史海报仍可继续使用。
BadouCMS