172 lines
4.8 KiB
Go
172 lines
4.8 KiB
Go
|
|
package examples
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"tyapi-server/internal/shared/validator"
|
||
|
|
)
|
||
|
|
|
||
|
|
// UserRegistrationData 用户注册数据示例
|
||
|
|
type UserRegistrationData struct {
|
||
|
|
Phone string `validate:"required,phone"`
|
||
|
|
Password string `validate:"required,strong_password"`
|
||
|
|
ConfirmPassword string `validate:"required,eqfield=Password"`
|
||
|
|
Email string `validate:"omitempty,email"`
|
||
|
|
Username string `validate:"required,username"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ProductData 产品数据示例
|
||
|
|
type ProductData struct {
|
||
|
|
Name string `validate:"required,min=2,max=100"`
|
||
|
|
Code string `validate:"required,product_code"`
|
||
|
|
Price float64 `validate:"price,min=0"`
|
||
|
|
CategoryID string `validate:"required,uuid"`
|
||
|
|
Description string `validate:"omitempty,max=500"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidatorUsageExample 验证器使用示例
|
||
|
|
func ValidatorUsageExample() {
|
||
|
|
// 创建业务验证器实例
|
||
|
|
bv := validator.NewBusinessValidator()
|
||
|
|
|
||
|
|
fmt.Println("=== 验证器使用示例 ===")
|
||
|
|
|
||
|
|
// 1. 使用结构体验证
|
||
|
|
fmt.Println("\n1. 结构体验证示例:")
|
||
|
|
userData := UserRegistrationData{
|
||
|
|
Phone: "13800138000",
|
||
|
|
Password: "Password123",
|
||
|
|
ConfirmPassword: "Password123",
|
||
|
|
Email: "user@example.com",
|
||
|
|
Username: "testuser",
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := bv.ValidateStruct(userData); err != nil {
|
||
|
|
fmt.Printf("验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("用户数据验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 2. 使用单个字段验证
|
||
|
|
fmt.Println("\n2. 单个字段验证示例:")
|
||
|
|
|
||
|
|
// 验证手机号
|
||
|
|
if err := bv.ValidatePhone("13800138000"); err != nil {
|
||
|
|
fmt.Printf("手机号验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("手机号验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证密码
|
||
|
|
if err := bv.ValidatePassword("Password123"); err != nil {
|
||
|
|
fmt.Printf("密码验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("密码验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证统一社会信用代码
|
||
|
|
if err := bv.ValidateSocialCreditCode("91110000123456789X"); err != nil {
|
||
|
|
fmt.Printf("统一社会信用代码验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("统一社会信用代码验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证身份证号
|
||
|
|
if err := bv.ValidateIDCard("110101199001011234"); err != nil {
|
||
|
|
fmt.Printf("身份证号验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("身份证号验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证URL
|
||
|
|
if err := bv.ValidateURL("https://www.example.com"); err != nil {
|
||
|
|
fmt.Printf("URL验证失败: %v\n", err)
|
||
|
|
} else {
|
||
|
|
fmt.Println("URL验证通过")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 3. 验证失败示例
|
||
|
|
fmt.Println("\n3. 验证失败示例:")
|
||
|
|
|
||
|
|
invalidUserData := UserRegistrationData{
|
||
|
|
Phone: "invalid_phone",
|
||
|
|
Password: "weak",
|
||
|
|
ConfirmPassword: "different",
|
||
|
|
Email: "invalid_email",
|
||
|
|
Username: "123invalid", // 数字开头
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := bv.ValidateStruct(invalidUserData); err != nil {
|
||
|
|
fmt.Printf("预期的验证失败: %v\n", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 4. 业务逻辑中的验证示例
|
||
|
|
fmt.Println("\n4. 业务逻辑验证示例:")
|
||
|
|
businessValidationExample(bv)
|
||
|
|
}
|
||
|
|
|
||
|
|
// businessValidationExample 业务逻辑验证示例
|
||
|
|
func businessValidationExample(bv *validator.BusinessValidator) {
|
||
|
|
// 模拟用户注册业务逻辑
|
||
|
|
registerUser := func(phone, password, confirmPassword string) error {
|
||
|
|
// 验证手机号
|
||
|
|
if err := bv.ValidatePhone(phone); err != nil {
|
||
|
|
return fmt.Errorf("手机号验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证密码强度
|
||
|
|
if err := bv.ValidatePassword(password); err != nil {
|
||
|
|
return fmt.Errorf("密码验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证密码确认
|
||
|
|
if password != confirmPassword {
|
||
|
|
return fmt.Errorf("两次输入的密码不一致")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证字符串长度
|
||
|
|
if err := bv.ValidateStringLength(phone, "手机号", 11, 11); err != nil {
|
||
|
|
return fmt.Errorf("手机号长度验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 这里可以添加更多业务逻辑验证...
|
||
|
|
|
||
|
|
fmt.Println("用户注册验证通过,可以继续业务逻辑")
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试用户注册
|
||
|
|
if err := registerUser("13800138000", "Password123", "Password123"); err != nil {
|
||
|
|
fmt.Printf("用户注册失败: %v\n", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 模拟产品创建业务逻辑
|
||
|
|
createProduct := func(name, code string, price float64) error {
|
||
|
|
// 验证必填字段
|
||
|
|
if err := bv.ValidateRequired(name, "产品名称"); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证产品代码
|
||
|
|
if err := bv.ValidateProductCode(code); err != nil {
|
||
|
|
return fmt.Errorf("产品代码验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证价格
|
||
|
|
if err := bv.ValidatePrice(price); err != nil {
|
||
|
|
return fmt.Errorf("价格验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证字符串长度
|
||
|
|
if err := bv.ValidateStringLength(name, "产品名称", 2, 100); err != nil {
|
||
|
|
return fmt.Errorf("产品名称长度验证失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
fmt.Println("产品创建验证通过,可以继续业务逻辑")
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试产品创建
|
||
|
|
if err := createProduct("测试产品", "TEST_PRODUCT_001", 99.99); err != nil {
|
||
|
|
fmt.Printf("产品创建失败: %v\n", err)
|
||
|
|
}
|
||
|
|
}
|