Skyroc Admin React
专题能力

表单规则

使用 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.tsxformRules.userNameformRules.pwd
注册或重置密码校验pages/(auth)/login/register.tsxpages/(auth)/login/reset-pwd.tsx
验证码登录pages/(auth)/login/code-login.tsxformRules.phoneformRules.code
新增认证字段规则features/auth/use-auth-form-rules.ts@skyroc/utils 正则常量
修改校验文案packages/web/admin-i18n/src/langs/*/form.jsonapps/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_NAMEREG_PWDREG_PHONEREG_EMAILREG_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_PHONEREG_PWD 等正则@skyroc/utils 的纯校验常量。
t('form.*') 文案@skyroc/web-admin-i18n 提供资源和运行时。
FormRuleFormInstancepassword 字段约定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.Itemrules 消费。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 执行完整校验。

新增规则

新增一个认证字段规则时,按这个顺序做:

  1. 如果需要新正则,先在 @skyroc/utils 增加或复用常量。
  2. packages/web/admin-i18n/src/langs/*/form.json 增加 required / invalid 文案。
  3. apps/admin/src/types/locales/form.d.ts 增加类型。
  4. apps/admin/src/features/auth/use-auth-form-rules.ts 增加 patternRulesformRules
  5. 在页面里只消费 useAuthFormRules(),不要复制正则和文案。

常见误区

误区正确做法
页面里直接写正则和中文文案把认证页公共规则放进 useAuthFormRules(),文案走 i18n。
只改中文 form.json同步英文资源和 form.d.ts,避免语言切换或类型约束漂移。
把复杂业务校验都塞进认证规则认证字段规则放 useAuthFormRules();依赖接口或页面状态的校验留在页面或服务层。
修改确认密码字段名但不改规则当前规则读取 password,字段名不一致会导致校验失效。
用按钮禁用逻辑替代表单校验按钮禁用只是体验优化,提交仍然依赖 Form.Item rules

相关链接

On this page