aa4befa0ff
- 下载资源管理与 /download/{slug} 下载链接
- 下载统计(次数/去重人数/明细/CSV 导出)
- 按资源邮箱验证(Halo 通知中心发信,互认评论插件已验证邮箱)
- 本地附件防直链(/upload/** 404)
- 文章引用扫描
- Console 前端:Vue3 + ui-plugin-bundler-kit
sharelink console UI
Halo 2.x 插件「资源下载管理」的 console 后台前端(Vue 3 + rsbuild +
@halo-dev/ui-plugin-bundler-kit)。工程结构照搬
blog-comment/packages/ui。
命令
pnpm install
pnpm build # 产物输出到 ../src/main/resources/console(打进插件 jar)
pnpm dev # watch 模式,输出到 ../build/resources/main/console
pnpm type-check # vue-tsc 类型检查(构建流程不依赖)
路由与权限
- 路由:
/download-manager,挂在Root下,菜单组content,priority 52 - 权限 meta:
plugin:sharelink:view(见src/main/resources/extensions/role-templates.yaml的role-template-sharelink-view) - 注意:角色的
ui-permissions里还定义了plugin:sharelink:manage,但 console 菜单只挂了 view 权限;前端未对 manage 操作做按钮级权限隐藏, 写操作是否放行完全由后端 RBAC 决定。
API 契约(后端并行开发中)
Base:/apis/console.api.sharelink.halo.run/v1alpha1
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /download-resources |
{ items: [...], total }(非标准 ListResult) |
| POST | /download-resources |
创建,前端只提交 { metadata: { name: '' }, spec },name 由后端生成 |
| GET/PUT/DELETE | /download-resources/{name} |
单资源读写删,PUT 提交完整对象 |
| GET | /download-records?resourceSlug=&page=&size= |
Halo 标准 ListResult |
| DELETE | /download-records/{name} |
删除单条记录 |
| GET | /download-records/-/export?resourceSlug= |
CSV,前端用 window.open 直接导航下载 |
| GET | /references |
{ slug: [{ postName, title, permalink, editorUrl }] } |
| POST | /references/-/refresh |
强制重扫,返回同上 |
前端字段假设(联调时若与后端不一致,以此为准核对)
DownloadResource.spec:slug、displayName、description、attachmentName、requireEmailVerify、enabled;status.downloadCount;stats.downloaderCount、stats.referenceCount。其中stats是 Halo 自定义资源里不常见的顶层字段(与status平级),若后端改为放进status,需同步修改src/types.ts和DownloadManager.vue的两处取值。- 列表 GET
/download-resources返回{ items, total },不带分页参数, 前端一次性拉全量。 references的 key 是 slug(不是 metadata.name)。- 引用项
editorUrl/permalink均为可直接打开的相对或绝对路径, 前端target="_blank"打开。 - 下载记录
spec.downloadedAt为 ISO 时间字符串;spec.email可能为空 (匿名下载)。 - CSV 导出端点接受 session cookie 直接 GET 导航,无需 axios blob 下载。
- 附件选择:
AttachmentSelectorModal是 Halo Console 全局注册的业务 组件(不从@halo-dev/components导出),v-model:visible控制显隐,@select回调附件数组,前端存attachment.metadata.name到spec.attachmentName。