mojocn / gitalk-db

Apache License 2.0
0 stars 0 forks source link

Go进阶37:重构我的base64Captcha图形验证码项目 #93

Open mojocn opened 3 years ago

mojocn commented 3 years ago

https://mojotv.cn/go/refactor-base64-captcha

qiaocco commented 3 years ago
type memoryStore struct {
    sync.RWMutex
    digitsById map[string]string
    idByTime   *list.List
    // Number of items stored since last collection.
    numStored int
    // Number of saved items that triggers collection.
    collectNum int
    // Expiration time of captchas.
    expiration time.Duration
}

idByTime为什么设置成*list.List类型,有什么好处?

mojocn commented 3 years ago

链表 快速遍历

Meng-Xin commented 2 years ago

不怎么会用,我这样写,报错了

package tool

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/mojocn/base64Captcha"
)

type CaptchaResult struct {
    Id string `json:"id"`
    Base64Blob  string `json:"base_64_blob"`
    VertifyValue string `json:"vertify_value"`
}
type configJsonBody struct {
    Id            string
    CaptchaType   string
    VerifyValue   string
    DriverAudio   *base64Captcha.DriverAudio
    DriverString  *base64Captcha.DriverString
    DriverChinese *base64Captcha.DriverChinese
    DriverMath    *base64Captcha.DriverMath
    DriverDigit   *base64Captcha.DriverDigit
}

var store = base64Captcha.DefaultMemStore

//生成图形验证码
func GenerateCaptcha(ctx *gin.Context)  {
    //配置项 driver ,param
    var driver base64Captcha.Driver
    var param configJsonBody
    driver = param.DriverString.ConvertFonts()

    //生成图形验证码
    c := base64Captcha.NewCaptcha(driver, store)
    captchaId, b64s, err := c.Generate()
    if err != nil {
        fmt.Println("图形验证码生成失败")
        Failed(ctx,"图形验证码生成失败")
        return
    }
    captchaResult := CaptchaResult{Id:captchaId,Base64Blob: b64s}
    Success(ctx,map[string]interface{}{
        "captcha_result" : captchaResult,
    })
}
Meng-Xin commented 2 years ago

请问取消了 configCharacter 这个配置方法以后,怎么自定义一个验证码呢?

mojocn commented 2 years ago

@Meng-Xin 请问取消了 configCharacter 这个配置方法以后,怎么自定义一个验证码呢?

driver = param.DriverString.ConvertFonts() 中的 全部字段填充就可以了

BuxsRen commented 2 years ago

完整实例运行直接报: runtime error: invalid memory address or nil pointer dereference

GuoXiaoBo commented 2 years ago

https://github.com/mojocn/base64Captcha/blob/develop/interface_store.go

最新的1.3.5为什么Get&Verify 仍然不返回error呢,redis store情况下不太友好吧~

xiwang007 commented 2 years ago

作者给的demo需要一点web基础,我这边直接把web相关的抽离了,只剩下验证码的生成和验证给大家交流学习.

创建一个mycaptcha_test.go的文件

然后运行里面TestMyCaptcha单元测试函数

package mycaptcha

import (
    "log"
    "testing"

    "github.com/mojocn/base64Captcha"
)

//configJsonBody json request body.
type configJsonBody struct {
    Id            string
    CaptchaType   string
    VerifyValue   string
    DriverAudio   *base64Captcha.DriverAudio
    DriverString  *base64Captcha.DriverString
    DriverChinese *base64Captcha.DriverChinese
    DriverMath    *base64Captcha.DriverMath
    DriverDigit   *base64Captcha.DriverDigit
}

var store = base64Captcha.DefaultMemStore

// base64Captcha create return id, b64s, err
func GetCaptcha() (string, string, error) {

    //  {
    //      ShowLineOptions: [],
    //      CaptchaType: "string",
    //      Id: '',
    //      VerifyValue: '',
    //      DriverAudio: {
    //          Length: 6,
    //          Language: 'zh'
    //      },
    //      DriverString: {
    //          Height: 60,
    //          Width: 240,
    //          ShowLineOptions: 0,
    //          NoiseCount: 0,
    //          Source: "1234567890qwertyuioplkjhgfdsazxcvbnm",
    //          Length: 6,
    //          Fonts: ["wqy-microhei.ttc"],
    //          BgColor: {R: 0, G: 0, B: 0, A: 0},
    //      },
    //      DriverMath: {
    //          Height: 60,
    //          Width: 240,
    //          ShowLineOptions: 0,
    //          NoiseCount: 0,
    //          Length: 6,
    //          Fonts: ["wqy-microhei.ttc"],
    //          BgColor: {R: 0, G: 0, B: 0, A: 0},
    //      },
    //      DriverChinese: {
    //          Height: 60,
    //          Width: 320,
    //          ShowLineOptions: 0,
    //          NoiseCount: 0,
    //          Source: "设想,你在,处理,消费者,的音,频输,出音,频可,能无,论什,么都,没有,任何,输出,或者,它可,能是,单声道,立体声,或是,环绕立,体声的,,不想要,的值",
    //          Length: 2,
    //          Fonts: ["wqy-microhei.ttc"],
    //          BgColor: {R: 125, G: 125, B: 0, A: 118},
    //      },
    //      DriverDigit: {
    //          Height: 80,
    //          Width: 240,
    //          Length: 5,
    //          MaxSkew: 0.7,
    //          DotCount: 80
    //      }
    //  },
    //  blob: "",
    //  loading: false
    // }

    // https://captcha.mojotv.cn/ 调试配置
    var param configJsonBody = configJsonBody{
        Id:          "",
        CaptchaType: "string",
        VerifyValue: "",
        DriverAudio: &base64Captcha.DriverAudio{},
        DriverString: &base64Captcha.DriverString{
            Length:          4,
            Height:          60,
            Width:           240,
            ShowLineOptions: 2,
            NoiseCount:      0,
            Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm",
        },
        DriverChinese: &base64Captcha.DriverChinese{},
        DriverMath:    &base64Captcha.DriverMath{},
        DriverDigit:   &base64Captcha.DriverDigit{},
    }
    var driver base64Captcha.Driver

    //create base64 encoding captcha
    switch param.CaptchaType {
    case "audio":
        driver = param.DriverAudio
    case "string":
        driver = param.DriverString.ConvertFonts()
    case "math":
        driver = param.DriverMath.ConvertFonts()
    case "chinese":
        driver = param.DriverChinese.ConvertFonts()
    default:
        driver = param.DriverDigit
    }
    c := base64Captcha.NewCaptcha(driver, store)
    return c.Generate()
    // id, b64s, err := c.Generate()

    // body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    // if err != nil {
    //  body = map[string]interface{}{"code": 0, "msg": err.Error()}
    // }
    // var _ = body

    // // log.Println(body)
    // log.Println(1)
    // log.Println(id)

    // log.Printf("store =%+v\n", store)
}

// base64Captcha verify
func VerifyCaptcha(id, VerifyValue string) bool {
    return store.Verify(id, VerifyValue, true)
}

func TestMyCaptcha(t *testing.T) {
    id, b64s, err := GetCaptcha()
    if err != nil {
        return
    }
    var _ = b64s
    log.Println("id =", id)
    log.Println("VerifyValue =", store.Get(id, true))
    result := VerifyCaptcha(id, store.Get(id, true))
    log.Println("result =", result)
}