Filament 如何自定义登录页面
官方的页面太简约了,而且可供修改的范围太少了
通过发布官方资源可以看到
resources/views/vendor/filament-panels/pages/auth/login.blade.php
<x-filament-panels::page.simple>@if (filament()->hasRegistration())<x-slot name="subheading">{{ __('filament-panels::pages/auth/login.actions.register.before') }}{{ $this->registerAction }}</x-slot>@endif<x-filament-panels::form wire:submit="authenticate">{{ $this->form }}<x-filament-panels::form.actions:actions="$this->getCachedFormActions()":full-width="$this->hasFullWidthFormActions()"/></x-filament-panels::form>
</x-filament-panels::page.simple>
你能修改的只有这个form的样式,一般我们都想把登录页面的整体布局修改下,比如加个大背景图啥的
可以看到他继承的是这个文件resources/views/vendor/filament-panels/components/layout/simple.blade.php
但是这个页面可能会被其他地方使用,为了不影响其他组件,我们就只能重写这一块了
首先自定义layout.blade.php
<x-filament-panels::layout.base :livewire="$livewire"><div class="flex flex-row h-screen w-screen full-body"><div class="left-body col- h-screen w-screen"><!-- 左侧内容 --></div><div class="right-body "><div class="bg-white p-6 login-form shadow-xl rounded-xl md:max-w-lg">{{ $slot }}</div><!-- 右侧内容 --></div></div><style>.left-body{width: 70%;background: url("/img/bg.jpg") center;background-size: cover;opacity: 0.8;}.right-body{width: 25%;}.full-body{justify-content: space-between;align-items: center;}.login-form{margin-right: 5rem;}</style>
</x-filament-panels::layout.base>
然后是login.blade.php,就是把原来的form搬过来,如果你懒的话也可以直接用原来的
@props([
'heading' => null,
'subheading' => null,
])<div {{ $attributes->class(['fi-simple-page']) }}><section class="grid auto-cols-fr gap-y-6"><x-filament-panels::header.simple:heading="$heading ??= $this->getHeading()":logo="$this->hasLogo()":subheading="$subheading ??= $this->getSubHeading()"/><div>@if (filament()->hasRegistration())<x-slot name="subheading">{{ __('filament-panels::pages/auth/login.actions.register.before') }}{{ $this->registerAction }}</x-slot>@endif<x-filament-panels::form wire:submit="authenticate">{{ $this->form }}<x-filament-panels::form.actions:actions="$this->getCachedFormActions()":full-width="$this->hasFullWidthFormActions()"/></x-filament-panels::form></div></section></div>
然后是 Login, 其实就是照搬了官方的文件,登录的逻辑都在这个文件内
<?phpnamespace App\Filament\Pages;use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
use DanHarrin\LivewireRateLimiting\WithRateLimiting;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Facades\Filament;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Component;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Http\Responses\Auth\Contracts\LoginResponse;
use Filament\Notifications\Notification;
use Filament\Pages\BasePage;
use Filament\Pages\Concerns\InteractsWithFormActions;
use Filament\Pages\Page;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\HtmlString;
use Illuminate\Validation\ValidationException;/*** @property Form $form*/
class Login extends BasePage
{use InteractsWithFormActions;use WithRateLimiting;protected static string $view = 'filament.pages.login';protected static string $layout = 'components.filament.pages.layout';/*** @var array<string, mixed> | null*/public ?array $data = [];public function hasLogo(): bool{return true;}public function mount(): void{if (Filament::auth()->check()) {redirect()->intended(Filament::getUrl());}$this->form->fill();}public function authenticate(): ?LoginResponse{try {$this->rateLimit(5);} catch (TooManyRequestsException $exception) {Notification::make()->title(__('filament-panels::pages/auth/login.notifications.throttled.title', ['seconds' => $exception->secondsUntilAvailable,'minutes' => ceil($exception->secondsUntilAvailable / 60),]))->body(array_key_exists('body', __('filament-panels::pages/auth/login.notifications.throttled') ?: []) ? __('filament-panels::pages/auth/login.notifications.throttled.body', ['seconds' => $exception->secondsUntilAvailable,'minutes' => ceil($exception->secondsUntilAvailable / 60),]) : null)->danger()->send();return null;}$data = $this->form->getState();if (! Filament::auth()->attempt($this->getCredentialsFromFormData($data), $data['remember'] ?? false)) {throw ValidationException::withMessages(['data.email' => __('filament-panels::pages/auth/login.messages.failed'),]);}session()->regenerate();return app(LoginResponse::class);}public function form(Form $form): Form{return $form->schema([$this->getEmailFormComponent(),$this->getPasswordFormComponent(),$this->getRememberFormComponent(),])->statePath('data');}protected function getEmailFormComponent(): Component{return TextInput::make('email')->label(__('filament-panels::pages/auth/login.form.email.label'))->email()->required()->autocomplete()->autofocus();}protected function getPasswordFormComponent(): Component{return TextInput::make('password')->label(__('filament-panels::pages/auth/login.form.password.label'))->hint(filament()->hasPasswordReset() ? new HtmlString(Blade::render('<x-filament::link :href="filament()->getRequestPasswordResetUrl()"> {{ __(\'filament-panels::pages/auth/login.actions.request_password_reset.label\') }}</x-filament::link>')) : null)->password()->required();}protected function getRememberFormComponent(): Component{return Checkbox::make('remember')->label(__('filament-panels::pages/auth/login.form.remember.label'));}public function registerAction(): Action{return Action::make('register')->link()->label(__('filament-panels::pages/auth/login.actions.register.label'))->url(filament()->getRegistrationUrl());}public function getTitle(): string | Htmlable{return __('filament-panels::pages/auth/login.title');}public function getHeading(): string | Htmlable{return __('filament-panels::pages/auth/login.heading');}/*** @return array<Action | ActionGroup>*/protected function getFormActions(): array{return [$this->getAuthenticateFormAction(),];}protected function getAuthenticateFormAction(): Action{return Action::make('authenticate')->label(__('filament-panels::pages/auth/login.form.actions.authenticate.label'))->submit('authenticate');}protected function hasFullWidthFormActions(): bool{return true;}/*** @param array<string, mixed> $data* @return array<string, mixed>*/protected function getCredentialsFromFormData(array $data): array{return ['name' => $data['name'],'password' => $data['password'],];}
}
最后把Login注册进去就行了Providers/Filament/AdminPanelProvider.php
return $panel->default()->id('admin')->path('admin')->login(Login::class) // 放进去
相关文章:
Filament 如何自定义登录页面
官方的页面太简约了,而且可供修改的范围太少了 通过发布官方资源可以看到 resources/views/vendor/filament-panels/pages/auth/login.blade.php <x-filament-panels::page.simple>if (filament()->hasRegistration())<x-slot name"subheading&…...
百度智能云“千帆大模型平台”最新升级:接入Llama 2等33个模型!
今年3月,百度智能云推出“千帆大模型平台”。作为全球首个一站式的企业级大模型平台,千帆不但提供包括文心一言在内的大模型服务及第三方大模型服务,还提供大模型开发和应用的整套工具链,能够帮助企业解决大模型开发和应用过程中的…...
[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现
描述 读入一个只包含 , -, *, / 的非负整数计算表达式,计算该表达式的值。 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中…...
推出 Elasticsearch 查询语言 (ES|QL)
作者:Costin Leau 我很高兴地宣布,经过大约一年的开发,Elasticsearch 查询语言 (ES|QL) 已准备好与世界共享,并已登陆 Elasticsearch 存储库。 ES|QL 是 Elasticsearch 原生的强大声明性语言,专为可组合性、表现力和速…...
机器学习 day32(神经网络如何解决高方差和高偏差)
解决高偏差和高方差的新方法 之前,我们需要通过选取多项式次数以及正则化参数λ,来平衡高方差和高偏差 只要训练集不是特别大,那么一个大型的神经网络总能很好的适应训练集,即它的Jtrain很低由此可以得出,若要减小Jt…...
Web前端之NodeJS、Vue
文章目录 一、Babel转码器1.1 Babel安装流程1.2 Babel命令行转码 二、Promise对象三、测试方式四、Vue(渐进式JS框架)4.1 准备4.2 创建一个项目4.3 运行一个项目 五、模板语法5.1 文本5.2 原始html5.3 属性Attribute5.4 使用JavaScript表达式 六、条件渲…...
冠达管理:银行定增是利好还是利空?
银行定增是指银行经过向特定投资者定向发行股票的方法进行增发。这种方法被认为可认为银行提供本钱充足、拓展融资渠道、增强抵挡危险的才能。但是,关于银行定增是否对商场和投资者带来积极影响的讨论一向存在。本文将从多个角度进行剖析,以讨论银行定增…...
背上小书包准备run之TypeScript篇
这TypeScript我真不知道面试会咋问。。。 哦以前还写过一篇基础⬇️ Typescript 基础易理解-------冲冲冲_ts和js有什么区别_慢谷的博客-CSDN博客 typescript是啥?与javascript的区别? TypeScript是一个强类型的JavaScript超集,可编译为纯…...
什么是绩效管理?绩效管理包括哪些内容?
阅读本文您可以了解:1、绩效管理的定义;2、绩效管理的内容; 一、什么是绩效管理 绩效管理是一种组织和管理方法,旨在确保员工的工作与组织的目标保持一致,以及激励和提高员工的工作表现。它涉及设定明确的目标和标准&…...
Java基础练习八(二维数组)
1.装水问题 有一个 异形 容器,用一个 n * n 的二维数组来表示。其中 1 表示容器实心部分, 0 表示空心部分。现使用此容器装水,能装多少水(每个元素都表示一份水,只有有挡板的部分能装水)? publi…...
Biopython序列比对
从InterPro网站(https://www.ebi.ac.uk/interpro/download/Pfam/)下载多序列比对文件Pfam-A.seed.gz(含多个多序列比对) wget https://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.seed.gz解压,取第一…...
无法坚持运动?解密肠道菌群影响运动积极性
谷禾健康 运动可以说是最有效和可行的生活方式因素,个人可以利用它来保护自己免受各种疾病的侵害,包括代谢性、心血管、神经退行性和肿瘤性疾病。 世界卫生组织建议,每周进行150-300分钟的中等强度运动。 运动的好处具体不用多说了࿰…...
4-5-tablewidget
文章目录 添加控件,添加行列数widget.cppwidget.h效果 添加控件,添加行列数 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this)…...
前端基础第一天-html-综合案例
通过综合案例,主要复习: 目录文件夹今日所学标签路径锚点链接 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…...
PDF Expert 3.3 for mac
PDF Expert是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 以下是PDF Expert的特点: PDF编辑:PDF Expert提供了丰富的PDF编辑功能,包括添加、删除、移动、旋转、缩放、裁…...
【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面
【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 写在前面的话一、腾讯云 Cloud Studio 介绍1.1 Cloud Studio 应用场景1.2 Cloud Studio 开发优势 二、沉浸式体验开发快速构建 H5 页面2.1 注册与登录 Cloud Studi…...
Word转PDF在线转换如何操作?分享转换技巧
现如今,pdf转换器已成为大家日常办公学习必不可少的工具,市场上的pdf转换器主要有两种类型,一种是需要下载安装的,另一种是网页版,打开就可以使用的,今天小编给大家推荐一个非常好用的网页版pdf转换器&…...
只需5步 真·双开电脑版微信
最近发现,有些小伙伴不仅有双开手机版微信的需求,同时也有电脑版的需求。 今天教大家一个方法,简单好用,只需要跟着图片操作,5步即可!快一起来试试吧~ 1.下载安装ProcessExplorer 2.右键以管理员身份运行…...
如何将JSON字符串转化成对象
在这里只能使用ObjiectMapper这个类才能将Json字符串转成对象的格式进行输出 话不多说,直接上代码 实体类 //实体类 Setter Getter public class UserInfo implements Serializable {private Long id;private String name; //昵称private String phone; //手机转换代码 St…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
