来源:互联网 更新时间:2026-08-03 07:45
这是一个系列 Blog,作者将以一个 PHP 全栈工程师的身份,利用 AI 工具(claude code、codex、deepseek、豆包等):从零开始学习 golang 语言,并最终完成 ai-go-admin(github | gitee)开源项目的制作,全程记录分享。

上一期聊了前端表格组件,这一期轮到数据验证上场。前后端各自该验什么、怎么验,整理清楚了,能省不少返工的麻烦。
服务端的数据验证,主流方案有三种,各有各的适用场景,直接看。
模型层写 binding tag,控制器层用 gin 的 ShouldBindJSON,绑定 JSON 数据的同时就把验证给办了。基控制器的 Create、Update 方法默认已经调用了 ShouldBindJSON,所以模型里写对验证规则就能自动生效。示例:
Username string `gorm:"comment:用户名;type:varchar(64);not null" binding:"required"`
required 表示必填,完整可用规则可以参考 go-playground/validator 文档,或者 gin 模型绑定和验证章节。注意,go-playground/validator 已随 gin 框架内置,直接拿来用就行。
模型定义里写 validate tag,这是 go-playground/validator 原生的写法,规则和 binding 一致。比如:
Username string `gorm:"comment:用户名;type:varchar(64)" validate:"required"`
但和方案一不同的是,验证需要手动触发——在服务层或控制器层重写 Create、Update 等方法,调用 validate.Struct 来完成。示例:
type User struct {
FirstName string `validate:"required"`
Age uint8 `validate:"gte=0,lte=130"`
Email string `validate:"required,email"`
}
validate := validator.New()
user := &User{
Age: 135,
Email: "Badger.Smith@gmail.com",
}
err := validate.Struct(user)
增加 DTO,在 DTO 里定义 binding / validate tag,然后重写控制器或服务层的方法。比如 AdminUpdateRequest 就是一个自定义 DTO,不理解的全局搜索一下就能找到参考。
这是一个很实际的问题,分清楚能让代码结构更清晰。
title、name、type 的必填,放控制器层就足够了。
title、name、type 的必填校验放在控制器层;name 的重复性检查、pid 不能是自己的判断,放在服务层。仓储层呢?不做任何校验,只靠数据库本身的 not null、唯一索引等机制兜底。
前端的数据验证,核心是表单验证。我们准备了一个工具包 src/utils/validate.ts,里面定义了各种验证规则,最重要的是一直导出的验证规则构建器 buildValidatorRule 函数——它能很方便地生成 el-form 表单的常用验证规则。
element plus 的表单验证基于 async-validator。
具体用法参考下面的代码片段:
<script setup lang="ts">
import { regularPassword, buildValidatorRule } from '/@/utils/validate'
import type { FormItemRule } from 'element-plus'
const rules: Partial> = reactive({
username: [buildValidatorRule({ name: 'required', title: '用户名' }), buildValidatorRule({ name: 'account' })],
nickname: [buildValidatorRule({ name: 'required', title: '昵称' })],
email: [buildValidatorRule({ name: 'email', message: '邮箱错误' })],
mobile: [buildValidatorRule({ name: 'mobile', message: '手机号错误' })],
password: [
{
validator: (rule: any, val: string, callback: Function) => {
if (props.manager.form.operate == 'create') {
if (!val) {
return callback(new Error('密码必填'))
}
} else {
if (!val) {
return callback()
}
}
if (!regularPassword(val)) {
return callback(new Error('密码需要 6-32 位,禁止使用特殊符号'))
}
return callback()
},
trigger: 'blur',
},
],
})
</script>
注意密码字段的验证逻辑:创建时必填,编辑时非必填;但只要有值,就必须符合 6-32 位且无特殊符号的规则。这种条件判断在业务中很常见,直接用 validator 函数处理最灵活。
Ondo将于今日上线股票永续合约
暗黑4S14野蛮人终局BD攻略
区块链OTC交易所有哪几家比较正规?
Binance新增15种bStocks代币化证券为杠杆抵押资产
彩云天气怎么看分钟级降雨预报 彩云天气精准预报方法【技巧】
晶核艾尔莎角色盘点 晶核艾尔莎强度分析与实战表现
潜水员戴夫丛林DLC接吻的鱼任务攻略
五千元以下的笔记本几乎消失!经销商:至少一年看不到涨价尽头
Intel喜讯连连:18A工艺良率提升到85%、CPU将涨价15%
遗忘之海密室通关教程 遗忘之海密室全关卡解谜思路与难点解析
华为Mate 70系列首发的红枫镜头下放至千元档:全员普及原色影像
黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元
币安投票上币与下币机制解析:买票争议与规则边界
合集38个项目筹集5.406亿美元 Figure融资2亿
硬刚苹果!华为9月新品阵容出炉:Mate 90系列、全新三折叠
微软Copilot AI漏洞可致敏感数据泄露,企业用户需及时更新
异环伊洛伊阵容怎么搭配
新破天一剑太极刀任务攻略 破天一剑怎么取太极刀
逆战未来s3出什么新角色 逆战未来S3赛季新角色爆料
蚂蚁庄园今日课堂答题2026年7月8日
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc