登录注册页常被当成"补一个页面",但它在管理后台里是多条主线的总入口:既是表单练习场,也是后续高级表单校验、权限控制、统一登录和退出系统的真实落点。设计这类页面时,第一步不是抠视觉细节,而是先想清楚"登录方式如何组织",再把页面结构收敛成视觉区、表单区、辅助入口区三个区块。
本章从产品视角拆解后台登录页的组织规律,落到 Form + Input + Button + Tabs 的基础技术结构,并强调管理后台应优先保证表单第一屏可操作,第三方登录等补充入口用数组驱动渲染而非写死。
Tabs 承载互斥的登录方式,用数组驱动第三方登录入口它的意义不只是补齐页面,而是给后续主线搭入口:复习页面创建与路由接入、为高级表单校验做准备、为权限控制与统一退出补真实落点,让顶部菜单的"退出"不再是空入口。认证入口页一旦建立在一堆演示页面之上,路由和菜单就会残留噪音,所以接入前应先清理临时调试页面。
登录页越早接入,后续权限链路越容易串起来。不要把它只当成样式页面,它后面会连接很多真实业务能力。
观察真实产品登录页,重点不是照抄样式,而是总结登录方式如何被组织。常见做法有扫码 + 手机号同时展示、账号 / 短信通过 Tabs 切换、账号登录放主入口短信放次级、第三方放底部补充。对管理后台、OA、子账号系统,主路径通常是账号密码、手机验证码,第三方作为补充——因为这类系统更强调主账号、子账号、企业统一登录。
登录方式的组织顺序本质是在表达产品优先级,不同系统主登录方式不同,不能机械照搬。管理后台通常更应把"账号登录"放在更靠前的位置。
登录页布局变量很多(图在左还是右、是否独立卡片、注册入口放哪),但都能收敛成三个区块:视觉区(品牌图、插画、欢迎语)、表单区(标题、Tabs、输入框、提交按钮)、辅助入口区(注册、忘记密码、第三方登录)。表单区必须是主角,辅助入口不要抢主路径;标题、插画、品牌词属于可选强化项,不是刚需。
Login Page
├─ Visual Area 品牌 / 插画
├─ Form Area 标题 + Tabs + 输入 + 提交
└─ Extra Actions 注册 / 忘记密码 / 第三方某些后台框架在移动端让插画占据大半个屏幕,用户还要滚动才能看到登录表单。这种做法在营销页可以接受,但后台登录页不是最优解。更合理的优先级是:用户一打开先看到账号密码主表单,插画作为辅助而非主导视口;移动端优先保留表单、弱化或缩小图像区。
登录页是任务页不是宣传页,移动端输入效率应优先于品牌展示。若必须保留视觉区,也要控制它在移动端的占比。
登录注册页本质就是 Form、Input、Button 加点击事件;支持多种登录方式时再加 Tabs 承载互斥的登录方式。Tabs 更适合承载互斥选项,而不是手写条件块到处切换。先把表单基础结构跑通,再谈校验、权限和接口联调。
<el-form>
<el-tabs v-model="activeTab" stretch>
<el-tab-pane label="账号登录" name="account">
<el-input v-model="accountForm.username" />
<el-input v-model="accountForm.password" type="password" show-password />
</el-tab-pane>
<el-tab-pane label="手机号登录" name="phone">
<el-input v-model="phoneForm.phone" />
<el-input v-model="phoneForm.code" />
</el-tab-pane>
</el-tabs>
<el-button type="primary" class="w-full">登录</el-button>
</el-form>不同产品把"免费注册"放在顶部、底部或右下角,本质是在做层级区分。登录页优先级通常是:主登录方式 → 忘记密码 / 注册 → 第三方登录。辅助入口必须有,但不应压过登录按钮的主视觉地位;注册入口位置可变,语义上始终是次级路径;第三方登录更适合独立成区,而不是混进主表单。
第三方登录支持的入口差别很大(微信、GitHub、企业微信、飞书、钉钉),若全部写死,后续增删很麻烦。让页面传一个配置数组进来,图标和链接都成为配置项,后续更易与权限、环境开关联动。即便当前只支持一种,也建议一开始按数组结构设计。
const otherLoginMethods = [
{ icon: "i-logos-github-icon", label: "GitHub", href: "#" },
{ icon: "i-logos-wechat", label: "微信", href: "#" }
]切换登录方式时加滑入、浮入动画本身没问题,但角色应是强化切换感、帮助理解当前模式,而不是增加等待感或让首屏交互拖沓。登录页属于强任务型页面,动画优先级低于输入效率;若加入切换动画,建议只包裹表单内容区而非整页,服务结构理解而非为了酷炫牺牲可用性。
登录页不是终点,而是权限链路的起点。登录成功后要决定跳去哪:回到来源页、去首页、还是去首次引导页,这个决策要提前想清楚。更重要的是,登录页应和路由守卫形成呼应——未登录访问受保护路由时跳回登录页,登录后带回来源。这套机制不一定要在登录页里全写完,但要在设计阶段就预留 redirect 参数与守卫触发的接口,否则后面补权限会反复改登录页。
// 登录成功后回跳来源页,无则回首页
const redirect = (route.query.redirect as string) || "/"
router.replace(redirect)| 问题 | 原因 | 解决方案 |
|---|---|---|
| 登录页看起来很复杂,不知从哪下手 | 当成完整业务系统而非基础表单页 | 先拆成"登录方式组织 + 表单结构 + 辅助入口"三部分 |
| 移动端要滚动很久才看到表单 | 把插画区当主内容 | 优先保证表单进首屏,视觉区降级处理 |
| 账号登录、短信登录写在一个表单里越来越乱 | 不同方式字段和行为混在一起 | 用 Tabs 切换并拆成两套表单模型 |
| 第三方登录越加越乱 | 每种方式都手写一套按钮 | 改成数组驱动渲染 |
| 注册入口不知道放哪 | 与主登录流程放同一视觉层级 | 保持注册为次级入口,标题旁或表单底部均可 |
| 登录页动画很酷但很难用 | 切换动画优先级过高 | 动画只做轻量辅助,不干扰首屏输入效率 |
| 登录后不知道跳哪 | 没规划 redirect | 用 route.query.redirect 回跳来源页 |
| 临时调试页面残留路由 | 接入前没清理 | 登录页接入前先删临时页面 |
| 守卫和登录页脱节 | 二者设计时没呼应 | 预留 redirect 与守卫触发接口 |