尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Koel Plus 白标(White Labeling)定制指南:应用名称、Logo 与默认封面图

Koel Plus 白标(White Labeling)定制指南:应用名称、Logo 与默认封面图 音视频后端前端【免费下载链接】koelMusic streaming solution that works.项目地址https://gitcode.com/gh_mirrors/ko/koel点击查看免费下载导读白标White Labeling是 Koel Plus 提供的一项品牌定制能力管理员可以在不修改任何代码的前提下将 Koel 换皮成自己的音乐流媒体服务——自定义应用名称、Logo 以及艺术家/专辑等媒体在缺少封面时的默认封面图。本文以 docs/plus/white-labeling.md 为骨架结合仓库源码设置服务、值对象、控制器、PWA Manifest 与测试用例还原其完整实现链路帮助你掌握配置入口、权限模型、底层存储结构与 API 调用方式。什么是 Koel 的白标定制白标White Labeling是指将现成软件重新品牌化后以自有品牌对外提供服务的做法。在 Koel 中这是一项Plus 专属Plus-only能力拥有管理员权限的 Koel Plus 用户可以在Settings设置页面的 Branding品牌分区中修改以下三项内容应用名称app name——显示在界面各处的产品名Logo——应用图标/标志默认封面图default cover image——当艺术家、专辑及其他媒体没有关联封面图时用于填充的占位封面。与修改主题、换肤不同白标定制的是品牌标识层直接决定用户眼中“这是谁家的产品”。前置条件与权限模型1. Plus 许可限制白标功能在代码层面通过#[RequiresPlus]属性强制约束。UpdateBrandingController 的控制器类上直接标注了该属性#[RequiresPlus] class UpdateBrandingController extends Controller这意味着未持有 Plus 许可的实例无法访问品牌更新接口。更彻底的是SettingService::getBranding() 在读取品牌设置时也做了同样的判断return License::isPlus() ? Branding::fromArray(Arr::wrap(Setting::get(branding))) : Branding::make(name: config(app.name));从源码结构可以推断非 Plus 环境即使数据库中存在 branding 设置也会被忽略回退到config(app.name)作为应用名称且没有自定义 Logo 与封面。2. 管理员权限校验控制器在__invoke中先校验权限再执行更新abort_unless($this-user-hasPermissionTo(Permission::MANAGE_SETTINGS), Response::HTTP_FORBIDDEN);只有具备MANAGE_SETTINGS管理设置权限的用户才能修改品牌信息。这一行为有测试佐证tests/Feature/KoelPlus/BrandingSettingTest.php 中的nonAdminCannotSetBranding用例验证了普通用户调用PUT api/settings/branding会返回403 Forbidden。三个可定制项的完整说明应用名称name应用名称是一个必填字符串替换后不仅出现在网页界面还会进入 PWA渐进式 Web 应用清单详见下文“品牌名的全局生效”一节。设置未配置时默认值为config(app.name)对应 config/app.php 中的name项Koel 安装时可配置。Logologo用于替换 Koel 自带品牌图标的图片。文档特别提示了最佳实践为了获得最佳视觉效果Logo 与封面图建议使用至少512×512 像素的正方形图片SVG 完全支持并被推荐。SVG 之所以被推荐是因为矢量图在任意缩放下都不会失真非常适合 Logo 这种需要适配不同尺寸的场景。默认封面图cover当艺术家、专辑及其他媒体没有关联封面图时Koel 会使用这里设置的图片作为默认封面保证界面的品牌一致性。图片校验规则图片并非任意文件都能通过。在 UpdateBrandingRequest 中logo与cover遵循同样的校验逻辑——要么是合法的 URL要么是通过 ValidImageData 校验的有效图片数据如 base64 编码的图片$validImageDataOrUrl static function (string $attribute, mixed $value, Closure $fail): void { if (URL::isValidUrl($value)) { return; } (new ValidImageData())-validate($attribute, $value, $fail); }; return [ name [required, string], logo [sometimes, nullable, $validImageDataOrUrl], cover [sometimes, nullable, $validImageDataOrUrl], ];即name必填logo与cover可选、可空但一旦提供就必须是有效 URL 或合法图片数据。数据模型与存储结构Branding 值对象品牌信息在内存中以不可变值对象 Branding 表示包含name、logo、cover三个字段。它的两个静态工厂方法各有分工Branding::make()当传入的 name 为空时回退到config(app.name)Branding::fromArray(array $settings)从数据库读取的设置数组构造对象name 缺省时同样回退到config(app.name)。值得注意的是构造函数中的 URL 归一化逻辑if ($logo !URL::isValidUrl($logo)) { $this-logo image_storage_url($logo); } if ($cover !URL::isValidUrl($cover)) { $this-cover image_storage_url($cover); }如果存储的是相对文件名而非完整 URL则通过image_storage_url()辅助函数见 app/Helpers.php将其转换为完整可访问的 URL。该函数会依据 config/filesystems.php 中filesystems.disks.images.url的配置决定使用图片专用磁盘的 URL还是回退到static_url(config(koel.image_storage_dir) . / . $fileName)拼接静态资源路径。持久化settings 表品牌设置最终以 JSON 数组形式写入settings表的branding键Setting::set(branding, $branding-toArray());即 SettingService::updateBranding() 的整体流程为读取当前品牌 → 更新名称 → 处理 Logo → 处理封面 → 整体覆盖写入。该实现还包含一个细节未变化的图片不会被重复上传。updateBranding会先比较新值与当前值if ($logo $logo ! $branding-logo) { $branding $branding-withLogo($this-imageStorage-storeImage($logo)); } elseif (!$logo) { $branding $branding-withoutLogo(); }传入了新的图片数据 → 通过ImageStorage::storeImage()上传并存储返回可访问 URL传入的值与当前值相同例如只是改了名称图片 URL 原样提交→ 跳过上传保留原文件未传空值→ 移除该图片withoutLogo()/withoutCover()。这在 tests/Feature/KoelPlus/BrandingSettingTest.php 的updateBrandingWithNoLogoOrCoverChanges用例中得到验证当 Logo/封面原样提交时测试断言存储值仍指向原文件old-logo.png/old-cover.png而不是重新上传。API 调用PUT /api/settings/branding虽然日常操作通过 Web 界面 Settings Branding 分区完成但底层是一个标准的 REST 接口注册于 routes/api.base.phpRoute::put(settings/branding, UpdateBrandingController::class);对应的请求体为 JSON字段类型必填说明namestring是新的应用名称logostring | null否Logo 图片的 URL 或 base64 图片数据coverstring | null否默认封面图的 URL 或 base64 图片数据示例使用 curl需替换为你的访问令牌curl -X PUT https://your-koel.example/api/settings/branding \ -H Authorization: Bearer YOUR_TOKEN \ -H Content-Type: application/json \ -H Accept: application/json \ -d { name: My Music, logo: data:image/svgxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwhLS0gLi4uIC0tPjwvc3ZnPg, cover: https://your-koel.example/uploads/branding/cover.png }成功时返回204 No Content见控制器中的response()-noContent()失败时可能返回403 Forbidden当前用户缺少MANAGE_SETTINGS权限422 Unprocessable Entity参数校验失败如 name 缺失、图片数据非法Plus 许可校验失败相关响应非 Plus 实例访问该接口。品牌名的全局生效koel_branding() 与 PWA Manifest品牌名并不只作用于设置页面本身而是通过辅助函数koel_branding()渗透到整个应用的对外表现。该函数定义于 app/Helpers.php支持null、name、logo、cover四种取值并在单次请求内通过once()缓存解析结果避免重复查询function koel_branding(?string $key null): Branding|string|null { Assert::inArray($key, [null, name, logo, cover]); $branding once(static function (): Branding { $service app(SettingService::class); return $service-getBranding(); }); // ... }一个典型的消费方是 PwaManifestServicePWA 安装清单的name字段直接取自品牌名——应用与“远程遥控器”两个 Manifest 分别使用koel_branding(name)和koel_branding(name) . Remote Controllerpublic function getAppManifest(): array { return $this-buildManifest((string) koel_branding(name), $this-rootUrl()); } public function getRemoteManifest(): array { return $this-buildManifest(koel_branding(name) . Remote Controller, $this-rootUrl() . remote); }这意味着修改品牌名后用户安装到桌面/主屏的 PWA 图标名称也会随之变化实现品牌标识在“安装态”下的统一。该行为由 tests/Feature/KoelPlus/PwaManifestTest.php 覆盖验证。如何验证配置是否生效仓库提供了完整的测试用例可作为验证与回归的依据tests/Feature/KoelPlus/BrandingSettingTest.phpupdateBrandingFromDefault从默认状态更新三项品牌信息断言 name 正确写入、logo 与 cover 被转换为合法 URLupdateBrandingWithNoLogoOrCoverChanges仅改名称、图片原样提交时验证不重复上传updateBrandingReplacingLogoAndCover替换图片后验证存储值指向新文件nonAdminCannotSetBranding普通用户调用接口返回 403。tests/Feature/BrandingSettingTest.php非 Plus 场景下的相关行为验证。tests/Integration/KoelPlus/Services/SettingServiceTest.php从服务层验证getBranding/updateBranding的读写逻辑。在本地开发环境中可以通过运行对应测试快速验证该功能模块的完整性php artisan test --filterBrandingSettingTest小结与注意事项Plus 专属白标能力只在持有 Plus 许可的实例上开放非 Plus 实例会忽略品牌设置并回退到默认应用名管理员专属需要MANAGE_SETTINGS权限普通用户调用 API 会被拒绝图片建议优先使用至少 512×512 像素的正方形图片SVG 完全支持且推荐用于 Logo两种图片来源图片既可以是外部 URL也可以是 base64 图片数据新图片会被上传到图片存储本地目录或对象存储未变化的图片不会被重复上传影响面品牌名不仅显示在网页还同步作用于 PWA Manifest更换 Logo/封面后媒体无封面场景会统一展示新默认封面确保整体品牌一致性。赞分享音视频后端前端【免费下载链接】koelMusic streaming solution that works.项目地址https://gitcode.com/gh_mirrors/ko/koel点击查看免费下载相关推荐ToolJet 白标White Labeling品牌定制指南自托管与云端配置详解ToolJet 白标White Labeling品牌定制指南自托管与云端配置详解 导读 本文聚焦 ToolJet 的 White Labeling白标低代码后端前端AI 应用MCP 服务OHIF Viewer 界面与外观定制完全指南:组件库、主题系统、图标与 White LabelingOHIF Viewer 界面与外观定制完全指南:组件库、主题系统、图标与 White Labeling OHIF 的整套用户界面建立在 ui next 组件库之医疗健康前端音视频ToolJet 如何用 White Labeling 自定义 Logo、Favicon 和登录页品牌ToolJet 如何用 White Labeling 自定义 Logo、Favicon 和登录页品牌 如果你部署了 ToolJet自托管或云版本希望登录低代码后端前端AI 应用MCP 服务上一篇三步打造高颜值导航菜单MahApps.Metro图标与图像项实战指南下一篇Apache SkyWalking 8.7.0 版本深度解析Agent 新插件、OAP 持久化会话重构与性能优化全览创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表