表单规则
使用 apps/admin 的 useAuthFormRules、Ant Design Form 和共享正则常量维护登录、注册和重置密码校验
这一页说明 apps/admin 当前的认证表单校验入口。它不是通用表单库文档,而是解释应用内 features/auth/use-auth-form-rules.ts 如何把共享正则、i18n 文案和 Ant Design Form 规则组合起来。
当前事实:useAuthFormRules() 只被登录、验证码登录、注册和重置密码页面使用。管理页列表里的搜索表单由 表格与表单 说明;这里聚焦认证场景的字段级校验规则。
只想查
useAuthFormRules()的返回值、预设规则集合和规则工厂签名,直接看 表单规则 API。
适用场景
| 场景 | 重点位置 |
|---|---|
| 登录页用户名和密码校验 | pages/(auth)/login/index.tsx、formRules.userName、formRules.pwd |
| 注册或重置密码校验 | pages/(auth)/login/register.tsx、pages/(auth)/login/reset-pwd.tsx |
| 验证码登录 | pages/(auth)/login/code-login.tsx、formRules.phone、formRules.code |
| 新增认证字段规则 | features/auth/use-auth-form-rules.ts、@skyroc/utils 正则常量 |
| 修改校验文案 | packages/web/admin-i18n/src/langs/*/form.json、apps/admin/src/types/locales/form.d.ts |
当前实现位置
| 文件 | 职责 |
|---|---|
apps/admin/src/features/auth/use-auth-form-rules.ts | 创建认证页使用的 Ant Design Form 规则。 |
packages/@core/utils/src/reg.ts | 提供 REG_USER_NAME、REG_PWD、REG_PHONE、REG_EMAIL、REG_CODE_SIX。 |
packages/web/admin-i18n/src/langs/zh-cn/form.json | 中文校验文案。 |
packages/web/admin-i18n/src/langs/en-us/form.json | 英文校验文案。 |
apps/admin/src/types/locales/form.d.ts | 约束表单文案 key 的类型。 |
apps/admin/src/pages/(auth)/login/* | 当前真实消费表单规则的页面。 |
为什么不放进 admin-i18n
packages/web/admin-i18n 只负责 i18next 初始化、语言状态、语言切换 UI 和 locale 资源。form.json 放在那里是因为它是翻译资源;Ant Design FormRule、字段名和确认密码逻辑不属于 i18n 运行时。
useAuthFormRules() 同时依赖三类东西:
| 依赖 | 所属边界 |
|---|---|
REG_PHONE、REG_PWD 等正则 | @skyroc/utils 的纯校验常量。 |
t('form.*') 文案 | @skyroc/web-admin-i18n 提供资源和运行时。 |
FormRule、FormInstance、password 字段约定 | apps/admin 的认证表单实现。 |
因此当前最佳位置是 apps/admin/src/features/auth。如果未来多个页面、多个应用或多个包都需要通用规则工厂,再考虑抽出纯工厂能力,例如 createRequiredRule(message)、createPatternRule(options)、createConfirmFieldRule(options);认证字段集合仍应留在应用或认证模块里。
核心概念
useAuthFormRules() 返回五类能力:
| 返回值 | 用途 |
|---|---|
formRules | 必填 + 格式校验,适合大多数登录和注册字段。 |
patternRules | 只做格式校验,不包含必填。 |
defaultRequiredRule | 当前语言下的通用必填规则。 |
createRequiredRule(message) | 用指定文案创建必填规则。 |
createConfirmPwdRule(form) | 校验确认密码是否等于 password 字段。 |
规则本身是 Ant Design FormRule,因此最终仍交给 Form.Item 的 rules 消费。useAuthFormRules() 只负责把认证页常用模式收口。
最小可用示例
登录页当前用法可以简化成:
import { useAuthFormRules } from '@/features/auth/use-auth-form-rules';
interface LoginFormModel {
/** 用户登录名。 */
userName: string;
/** 用户登录密码。 */
password: string;
}
const LoginForm = () => {
const [form] = AForm.useForm<LoginFormModel>();
const {
formRules: { pwd, userName }
} = useAuthFormRules();
function handleSubmit(params: LoginFormModel) {
login(params);
}
return (
<AForm form={form} onFinish={handleSubmit}>
<AForm.Item name="userName" rules={userName}>
<AInput size="large" />
</AForm.Item>
<AForm.Item name="password" rules={pwd}>
<AInput.Password autoComplete="password" size="large" />
</AForm.Item>
</AForm>
);
};页面不需要重复写用户名和密码正则,也不需要自己拼 i18n key。
预设规则
formRules 当前包含:
| 字段 | 规则组合 | 典型页面 |
|---|---|---|
userName | 必填 + 用户名格式 | 账号密码登录。 |
pwd | 必填 + 密码格式 | 登录、注册、重置密码。 |
phone | 必填 + 手机号格式 | 验证码登录、注册、重置密码。 |
email | 必填 + 邮箱格式 | 需要邮箱认证字段时复用。 |
code | 必填 + 6 位验证码格式 | 验证码登录、注册、重置密码。 |
如果只需要格式校验,使用 patternRules。例如可选邮箱字段可以这样写:
const { patternRules } = useAuthFormRules();
<AForm.Item name="email" rules={[patternRules.email]}>
<AInput allowClear />
</AForm.Item>;确认密码规则
createConfirmPwdRule(form) 当前读取的是表单里的 password 字段:
const pwd = form.getFieldValue('password');因此使用它时,主密码字段必须叫 password:
const { createConfirmPwdRule, formRules } = useAuthFormRules();
<AForm form={form}>
<AForm.Item name="password" rules={formRules.pwd}>
<AInput.Password />
</AForm.Item>
<AForm.Item name="confirmPassword" rules={createConfirmPwdRule(form)}>
<AInput.Password />
</AForm.Item>
</AForm>;如果业务表单里的主密码字段不叫 password,不要在页面里偷改 Form 值。要么保持字段命名一致,要么先扩展 createConfirmPwdRule() 的入参,让规则能显式接收源字段名。
验证码按钮
注册和验证码登录页面除了 Form 规则,还会用 REG_PHONE 判断发送验证码按钮是否可点:
const phone = AForm.useWatch('phone', form);
const isValidPhone = REG_PHONE.test(phone);这只是交互层的即时判断,不替代 formRules.phone。提交时仍然应由 Ant Design Form 执行完整校验。
新增规则
新增一个认证字段规则时,按这个顺序做:
- 如果需要新正则,先在
@skyroc/utils增加或复用常量。 - 在
packages/web/admin-i18n/src/langs/*/form.json增加 required / invalid 文案。 - 在
apps/admin/src/types/locales/form.d.ts增加类型。 - 在
apps/admin/src/features/auth/use-auth-form-rules.ts增加patternRules和formRules。 - 在页面里只消费
useAuthFormRules(),不要复制正则和文案。
常见误区
| 误区 | 正确做法 |
|---|---|
| 页面里直接写正则和中文文案 | 把认证页公共规则放进 useAuthFormRules(),文案走 i18n。 |
只改中文 form.json | 同步英文资源和 form.d.ts,避免语言切换或类型约束漂移。 |
| 把复杂业务校验都塞进认证规则 | 认证字段规则放 useAuthFormRules();依赖接口或页面状态的校验留在页面或服务层。 |
| 修改确认密码字段名但不改规则 | 当前规则读取 password,字段名不一致会导致校验失效。 |
| 用按钮禁用逻辑替代表单校验 | 按钮禁用只是体验优化,提交仍然依赖 Form.Item rules。 |