ワンクリックで
add-form-validation-rule
为 Vue 3 + Ant Design Vue 表单系统新增自定义校验规则。支持正则校验、值范围校验、日期校验等。包含类型定义、校验实现、单元测试的完整流程。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
为 Vue 3 + Ant Design Vue 表单系统新增自定义校验规则。支持正则校验、值范围校验、日期校验等。包含类型定义、校验实现、单元测试的完整流程。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
将 AI 聊天内容提炼为结构化技术文档并保存到 Obsidian 知识库。支持三种文档类型:问题解决型、知识学习型、方案对比型。自动推断知识库分类目录,生成符合 Obsidian 规范的 Markdown 文件(含 frontmatter、双链)。适用于:(1) 聊天中解决了技术问题后想记录下来,(2) 学到新知识想沉淀到知识库,(3) 对比了多个方案后想保存决策过程。触发条件:用户说"保存到知识库"、"导出到 Obsidian"、"记录到笔记"、"保存这次对话"、"转成文档"等。
分析给定的 JSON 请求数据是否与 Java 后台 DTO 定义吻合,检查字段缺失、字段名不匹配、类型不匹配、必填校验等问题。
将Excel工作簿按工作表拆分为独立的Excel文件,每个工作表生成一个单独的文件。适用场景:(1) 将多工作表Excel文件拆分为单独文件,(2) 提取特定工作表为独立文件,(3) 分发合并工作簿中的工作表,(4) 为单独处理或分发创建工作表副本。
将 Excel 文件转换为 Markdown 表格,支持合并单元格处理、多工作表输出、基础字体语义(粗体/斜体)与超链接转换。适用于将式样书、数据表转为可读的 Markdown 文档。
自动化 GitHub PR 工作流 - 基于当前分支创建 PR、获取用户输入、检查冲突并自动合并。支持 squash 合并模式,遇到冲突时停止并提示用户。
将 Java DTO 类文件转换为 TypeScript interface,自动处理类型映射、@Required/@Schema 注解、嵌套类,并生成完整的 JSDoc 注释。
| name | add-form-validation-rule |
| description | 为 Vue 3 + Ant Design Vue 表单系统新增自定义校验规则。支持正则校验、值范围校验、日期校验等。包含类型定义、校验实现、单元测试的完整流程。 |
本 skill 提供一套标准的工作流程,用于为项目的表单验证系统添加新的校验规则。
项目采用 Ant Design Vue 4.x + 自定义规则引擎 的表单验证方案:
src/components/atoms/AtmForm/index.ts 中的 BuiltInRules 接口src/hooks/useForm/getAntDFormRules.ts 中的规则转换逻辑src/utils/validation/ 目录下的具体验证实现src/hooks/useForm/getAntDFormRules.spec.ts 中的测试用例位置:src/components/atoms/AtmForm/index.ts
在 BuiltInRules 接口中添加新的规则属性:
export interface BuiltInRules {
// 示例:添加新规则
myNewRule?: string | number | boolean | RegExp
}
规则类型指南:
boolean — 如 email?: booleandateFormat?: string、maxValue?: numberstring(JSON格式)— 如 range?: '[1,10]'RegExp 类型string[] | string — 如 fileExtension?: string | string[]位置:src/hooks/useForm/getAntDFormRules.ts
用于无需参数的规则,在 simpleRules 对象中添加:
const simpleRules: Record<string, Rule> = {
mySimpleRule: {
pattern: /your-regex-pattern/,
message: '错误提示文案',
trigger: 'blur'
}
}
在 getValidationRule 函数返回的规则对象中添加:
myComplexRule: {
validator: (_, value) => {
// 验证逻辑
return validationHelper(validateResult, errorMessage);
},
trigger: rule?.trigger || 'blur',
transform: rule?.transform
}
验证函数调用:优先使用已有验证函数(如 validateDateFormat、validateNumberRange),减少新增文件。
位置:src/hooks/useForm/getAntDFormRules.ts 中的 isBuiltInRule 函数
在添加新规则属性到 BuiltInRules 接口后,必须在 isBuiltInRule 函数中的 ruleKeys 数组里添加对应的属性名:
function isBuiltInRule(value: any): value is RuleOptions {
if (!isObject(value)) return false
const ruleKeys = [
'required',
'pattern',
// ... 其他现有属性 ...
'myNewRule' // ← 添加新属性名
]
// ... 后续逻辑保持不变 ...
}
⚠️ 这一步容易遗漏! 如果不更新
ruleKeys,新规则将被错误地识别为无效对象,导致规则处理失败。
位置:src/utils/validation/ 目录
决策树:
simpleRules 中定义,不需要创建验证函数.ts 文件(date.ts、number.ts、string.ts、file.ts)验证函数特征:
boolean 或 { valid: boolean; message?: string }null、undefined 等边界情况位置:src/hooks/useForm/getAntDFormRules.spec.ts
测试模板:
it('myNewRule 规则正确转换', () => {
const rules: FormRules = {
field: {
myNewRule: true // 或对应的参数值
}
}
const result = getAntDFormRules(rules)
const fieldRules = result!.field as Rule[]
expect(fieldRules).toContainEqual({
pattern: expect.any(RegExp), // 或 validator: expect.any(Function)
message: expect.any(String),
trigger: 'blur'
})
})
// 对于带参数的规则,添加验证器功能测试
it('myNewRule 验证器正确工作', async () => {
const rules: FormRules = {
field: {
myNewRule: 'paramValue'
}
}
const result = getAntDFormRules(rules)
const fieldRules = result!.field as Rule[]
const myRule = fieldRules.find(rule => rule.validator)
// 成功情况
await expect(myRule!.validator!({}, 'validValue', () => {})).resolves.toBeUndefined()
// 失败情况
await expect(myRule!.validator!({}, 'invalidValue', () => {})).rejects.toThrow('错误提示文案')
})
# 运行指定测试文件
npm test -- getAntDFormRules.spec.ts --run
# 运行所有表单相关测试
npm test -- useForm --run
# 查看测试覆盖率
npm test -- --coverage --run
添加一个汉字验证规则:
1. 类型定义 (AtmForm/index.ts):
export interface BuiltInRules {
chineseCharacters?: boolean
}
2. 规则实现 (getAntDFormRules.ts):
const simpleRules: Record<string, Rule> = {
chineseCharacters: {
pattern: /^[\u4e00-\u9fff]+$/,
message: '仅支持汉字输入',
trigger: 'blur'
}
}
3. 单元测试 (getAntDFormRules.spec.ts):
it('chineseCharacters 规则正确转换', () => {
const rules: FormRules = {
name: { chineseCharacters: true }
}
const result = getAntDFormRules(rules)
expect(result!.name).toContainEqual({
pattern: expect.any(RegExp),
message: '仅支持汉字输入',
trigger: 'blur'
})
})
添加一个字符串长度百分比验证规则(例如,验证实际输入不超过最大长度的80%):
1. 类型定义 (AtmForm/index.ts):
export interface BuiltInRules {
percentageLength?: number // 0-100 表示百分比
}
2. 验证函数 (src/utils/validation/string.ts - 复用现有文件):
export function validatePercentageLength(value: unknown, percentage: number): boolean {
if (!value || percentage <= 0 || percentage > 100) return true
const maxLength = Math.ceil((value as string).length / (percentage / 100))
return (value as string).length <= maxLength
}
3. 规则实现 (getAntDFormRules.ts):
// 在 getValidationRule 函数中添加
percentageLength: {
validator: (_, value) => {
if (isNumber(ruleValue)) {
return validationHelper(
validatePercentageLength(value, ruleValue),
`输入长度不能超过最大值的${ruleValue}%`
);
}
return Promise.reject(new Error('percentageLength 规则值必须为数字'));
},
trigger: rule?.trigger || 'blur',
transform: rule?.transform
}
4. 单元测试 (getAntDFormRules.spec.ts):
it('percentageLength 验证器正确工作', async () => {
const rules: FormRules = {
field: { percentageLength: 80 }
}
const result = getAntDFormRules(rules)
const fieldRules = result!.field as Rule[]
const rule = fieldRules.find(r => r.validator)
await expect(rule!.validator!({}, 'test', () => {})).resolves.toBeUndefined()
await expect(rule!.validator!({}, 'x'.repeat(1000), () => {})).rejects.toThrow()
})
BuiltInRules 接口中添加新属性(必须)isBuiltInRule 函数的 ruleKeys 数组中添加对应属性名(必须)getValidationRule 或 simpleRules 中实现规则逻辑(必须)src/utils/validation/*.ts 文件(可选)npm test -- getAntDFormRules.spec.ts --runisBuiltInRule 函数更新:这一步已在核心流程的第 2.1 步中详细说明,添加新规则属性后,必须在 getAntDFormRules.ts 中的 isBuiltInRule 函数的 ruleKeys 数组中添加新属性名,否则规则将被识别为无效对象。
错误消息本地化:所有错误消息应使用日语,可通过以下方式获取:
getMessageByCode() 调用已有的常数消息验证函数复用:优先复用 src/utils/validation/ 中已有的函数,减少代码重复和维护成本。
边界情况处理:验证函数必须正确处理以下情况:
null、undefined → 应返回 true(表示通过,因为非必填)'' → 应返回 true(非必填字段)[] → 应返回 truerequired: true 时才对空值进行拒绝触发时机:根据规则类型选择合适的 trigger:
'blur' — 字符格式、文本长度等验证'change' — 文件上传、枚举选择等['blur', 'change'] — 需要多次触发的验证| 函数 | 位置 | 功能 |
|---|---|---|
validateDateFormat | validation/date.ts | 验证日期格式 |
validateDateRange | validation/date.ts | 验证日期在某个范围内 |
validateNumberRange | validation/number.ts | 验证数值范围 |
validateEmail | validation/string.ts | 验证邮箱格式 |
validateVisualLength | validation/string.ts | 验证可视长度(全角2字符、半角1字符计算) |
valideFileExtension | validation/file.ts | 验证文件扩展名 |