gin 多结构体嵌套 效验范例
作者工作中遇到需求,需要多级别效验 结构体,但是范例很少,特意留下范例,写得不好,请轻喷
版本: github.com/go-playground/validator/v10
主结构体
type SceneProcessUpdateRequest struct {Chat *Chat `json:"chat" form:"chat" binding:"required_without=Name"` // 流程jsonUpdateNote *NodeList `json:"update_note" form:"update_note" binding:"required_without_all=Name DeleteNote"` // 需要更新的节点 ,Name DeleteNote 不存在时必传DeleteNote *DeleteNote `json:"delete_note" form:"delete_note" binding:"required_without_all=Name UpdateNote"` // 需要删除的节点ID string `json:"id" form:"id" binding:"required"` // 流程IDSceneID string `json:"scene_id" form:"scene_id" binding:"required"` // 场景IDName string `json:"name" form:"name" binding:"required_without=Chat"` // 名称IsComplete int32 `json:"is_complete" form:"is_complete" binding:"required_with=Chat,omitempty,oneof=1 2"` // "是否完整,1是 2否" Chat存在时必须存在,不存在时,可为空
}type Chat struct {NodeList []NodeList `json:"node_list" form:"node_list" binding:"required,gte=1,dive,required"` // 节点 数组LineList []LineList `json:"line_list" form:"line_list" binding:"required,gte=1,dive,required"` // 前端定义ID string `json:"id" form:"id" binding:"required"` // 流程ID
}
type LineList struct {From string `json:"from" form:"from" binding:"required"` // 来源 IDTo string `json:"to" form:"to" binding:"required"` // 跳转 ID
}type NodeList struct {TalkData *ai_scene_node_repo.TalkData `json:"talk_data" form:"talk_data" binding:"required_if=Type talk"` // 对话节点 数据KeyData *ai_scene_node_repo.KeyData `json:"key_data" form:"key_data" binding:"required_if=Type key"` // 按键节点 数据ArtificialData *ai_scene_node_repo.ArtificialData `json:"artificial_data" form:"artificial_data" binding:"required_if=Type artificial"` // 人工节点 数据NoteData *ai_scene_node_repo.NoteData `json:"note_data" form:"note_data" binding:"required_if=Type note"` // 短信节点 数据StartData *ai_scene_node_repo.StartData `json:"start_data" form:"start_data" binding:"required_if=Type start"` // 开始节点 数据JumpData *ai_scene_node_repo.JumpData `json:"jump_data" form:"jump_data" binding:"required_if=Type jump"` // 跳转节点 数据EndData *ai_scene_node_repo.EndData `json:"end_data" form:"end_data" binding:"required_if=Type end"` // 结束节点 数据Type string `json:"type" form:"type" binding:"required,eq=talk|eq=artificial|eq=note|eq=start|eq=jump|eq=end"` // 节点类型 start:开始 talk:对话 artificial:人工 note:短信 key:按键 jump:跳转 end:结束Tag string `json:"tag" form:"tag" binding:"required"` // 节点标记(标签)Name string `json:"name" form:"name" binding:"required"` // 节点名称ID string `json:"id" form:"id" binding:"required"` // 节点IDLeft string `json:"left" form:"left"` // 前端自定义Top string `json:"top" form:"top"` // 前端自定义Ico string `json:"ico" form:"ico"` // 前端自定义State string `json:"state" form:"state"` // 前端自定义
}type DeleteNote struct {ID string `json:"id" form:"id" binding:"required"` // 节点IDTag string `json:"tag" form:"tag" binding:"required"` // 节点标签
}
package ai_scene_node_repo// 开始
type StartData struct {JumpNodeID string `json:"jump_node_id" form:"jump_node_id" binding:"required"` // 跳转至
}// 对话
type TalkData struct {Rule []NodeRule `json:"rule" form:"rule" binding:"required,dive,required"` // 跳转规则ExceptionTag []string `json:"exception_tag" form:"exception_tag"` // 异常标签Words string `json:"words" form:"words" binding:"required"` // 节点话术RepeatWords string `json:"repeat_words" form:"repeat_words"` // 重新播报话术ExceptionAnswer string `json:"exception_answer" form:"exception_answer" binding:"required"` // 发生异常时,机器人回答ExceptionNum int16 `json:"exception_num" form:"exception_num" binding:"required"` // 异常会话次数ExceptionHand int8 `json:"exception_hand" form:"exception_hand" binding:"required"` // 异常处理方式 1、人工 2、挂机IsInterrupt int8 `json:"is_interrupt" form:"is_interrupt" binding:"required"` // 是否打断 1、是 2、否
}// 人工
type ArtificialData struct {Words string `json:"words" form:"words" binding:"required"` // 机器人回答Phone int32 `json:"phone" form:"phone" binding:"required_if=ArtificialType 1"` // 呼叫转移Extension int32 `json:"extension" form:"extension" binding:"required_if=ArtificialType 2"` // 分机号ArtificialType int8 `json:"artificial_type" form:"artificial_type" binding:"required"` // 1、呼叫转移 2、转接分机
}// 短信
type NoteData struct {Words string `json:"words" form:"words" binding:"required"` // 机器人回答NoteWord string `json:"note_word" form:"note_word" binding:"required"` //短信内容
}// 按键
type KeyData struct {Rule []KeyRule `json:"rule" form:"rule" binding:"required,dive,required"` // 跳转规则ExceptionTag []string `json:"exception_tag" form:"exception_tag"` // 异常标签Words string `json:"words" form:"words" binding:"required"` // 节点话术RepeatWords string `json:"repeat_words" form:"repeat_words" binding:"required"` // 重新播报话术ExceptionAnswer string `json:"exception_answer" form:"exception_answer" binding:"required"` // 发生异常时,机器人回答ExceptionNum int16 `json:"exception_num" form:"exception_num" binding:"required"` // 异常会话次数ExceptionHand int8 `json:"exception_hand" form:"exception_hand" binding:"required"` // 异常处理方式 1、人工 2、挂机IsInterrupt int8 `json:"is_interrupt" form:"is_interrupt" binding:"required"` // 是否打断 1、是 2、否
}// 跳转子流程
type JumpData struct {JumpNodeID string `json:"jump_node_id" form:"jump_node_id" binding:"required"` // 跳转至
}// 结束
type EndData struct {Words string `json:"words" form:"words" binding:"required"` // 机器人回答
}// 节点规则
type NodeRule struct {Conditions []Conditions `json:"conditions" form:"conditions" binding:"required,dive,required"` // 以下条件跳转Tag []string `json:"tag" form:"tag" ` // 标签JumpNodeID string `json:"jump_node_id" form:"jump_node_id" binding:"required"` // 跳转至JumpName string `json:"jump_name" form:"jump_name" binding:"required"` // 跳转名称Conform int8 `json:"conform" form:"conform" binding:"required"` // 符合 1、任意 2、全部}// 条件
type Conditions struct {IntentionID string `json:"intention_id" form:"intention_id" binding:"required"` // 意图ID -1 全部异常意图If int8 `json:"if" form:"if" binding:"required"` // 如果 1、意图Compare int8 `json:"compare" form:"compare" binding:"required"` // 比较方式 1、等于Content int8 `json:"content" form:"content" binding:"required"` // 内容 1、自定义意图 2、异常意图
}// 按键规则
type KeyRule struct {Conditions []KeyConditions `json:"conditions" form:"conditions" binding:"required,dive,required"` // 以下条件跳转Tag []string `json:"tag" form:"tag"` // 标签JumpNodeID string `json:"jump_node_id" form:"jump_node_id" binding:"required"` // 跳转至JumpName string `json:"jump_name" form:"jump_name" binding:"required"` // 跳转名称Conform int8 `json:"conform" form:"conform" binding:"required"` // 符合 1、任意 2、全部}type KeyConditions struct {Key string `json:"key" form:"key" binding:"required"` // 内容If int8 `json:"if" form:"if" binding:"required"` // 如果 1、按键Compare int8 `json:"compare" form:"compare" binding:"required"` // 比较方式 1、等于
}
gin 多结构体嵌套 效验范例相关推荐
- C 结构体嵌套一级指针 二级指针 动态分配内存
https://blog.csdn.net/xielinhua88/article/details/51364623 点击打开链接 #define _CRT_SECURE_NO_WARNINGS #i ...
- c++结构体嵌套结构体_Go学习每日一问(13)-结构体嵌套
每次学习并整理一个Golang的知识点,每天进步一点点.今天学习一个go结构体嵌套的知识点. 日省吾身 1.下面这段代码的输出结果? func main() { a := -7 b := +7 fmt ...
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...
- c语言嵌套结构体生日,第09天C语言(17):结构体嵌套
#pragma mark 结构体嵌套 ###pragma mark 概念 ###pragma mark 代码 #include int main() { #warning 结构体嵌套 /* // st ...
- 结构体04:结构体嵌套结构体
#include<iostream> #include<string> using namespace std;//定义结构体 学生 struct Student{string ...
- c中的结构体嵌套问题_C中的结构
c中的结构体嵌套问题 Structures in C language are basically user-defined data types that enables the user to c ...
- 结构体学习笔记6——结构体嵌套
结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- c语言嵌套结构体数组,第22节 C语言结构体之结构体嵌套、结构体指针与结构体数组的代码实现...
结构体 #include //第一步 struct Student { //学号 int no; //姓名 char name[20]; //性别 char sex[10]; //成绩 double ...
最新文章
- LINUX网络状态工具SS命令使用详解
- c++ 常见问题之string
- CSS+js弹出居中的背景半透明div层
- 程序员的自我进化——补上最短的那块情商木板
- php artisan快捷命令
- 信息学奥赛一本通(2064:【例2.1】交换值)
- python获取网页源码被拒绝_Python3 请求网页源码 目标计算机积极拒绝,无法连接...
- Sklearn 与 TensorFlow 机器学习实用指南第二版
- idea打开hierarchy面板
- BZOJ2209 [Jsoi2011]括号序列 splay
- npm命令用于卸载或修剪Node.js中未使用的包
- ElasticSearch 入门总结
- 计算机维吾尔语键盘用法,超实用丨手机电脑如何安装、使用维吾尔语输入法
- 猿创征文|【FreeSwitch开发实践】使用sipp对FreeSwitch进行压力测试
- matlab中uigetfile的使用
- esp32 camera_ESP32操作L298N以及示例程序说明
- Mac谷歌浏览器添加JSONView的插件以提高开发的效率
- java 如何将word 转换为ftl_使用FreeMarker导出word文档(支持导出图片)
- 要有遥不可及的梦想,也要有脚踏实地的本事
- win10 SystemParametersInfo 设置屏保 不好使_Win10:Classic Shell是一款非常不错的系统UI定制工具...
热门文章
- KV存储-Aerospike之索引(Index)
- OpenAPI SDK组件介绍
- 【尚硅谷云原生Java架构师的第一课 4 2021-09-28】KubeSphere三种安装,docker,k8s,nfs安装,metrics。KubeKey一键单 多节点安装。
- 区块链难在落地,亟需补人才缺口迎爬升期
- Netty进阶 黏包与半包问题的处理,数据解码器详解
- 手把手教你用pandas处理缺失值
- PYTHON 打印三角形大全
- Microsoft Word 中如何自由移动图片
- iphone出现android文件夹,如何才能在iphone上看到文件,难道不能像android,塞班一样下个文件管理器,随意看文件吗...
- Tigase注册流程总结