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…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...