diff --git a/compoment/captcha_store.go b/compoment/captcha_store.go new file mode 100644 index 0000000..380b951 --- /dev/null +++ b/compoment/captcha_store.go @@ -0,0 +1,42 @@ +package compoment + +import ( + "context" + "fmt" + "time" + "wireguard-dashboard/client" + "wireguard-dashboard/constant" +) + +type CaptchaStore struct{} + +// Set +// @description: 验证码放入指定存储 +// @receiver CaptchaStore +// @param id +// @param value +// @return error +func (CaptchaStore) Set(id string, value string) error { + return client.Redis.Set(context.Background(), fmt.Sprintf("%s:%s", constant.Captcha, id), value, time.Minute).Err() +} + +// Get +// @description: 获取验证码信息 +// @receiver CaptchaStore +// @param id +// @param clear +// @return string +func (CaptchaStore) Get(id string, clear bool) string { + +} + +// Verify +// @description: 校验 +// @receiver CaptchaStore +// @param id +// @param answer +// @param clear +// @return bool +func (CaptchaStore) Verify(id, answer string, clear bool) bool { + +} diff --git a/constant/cache_prefix.go b/constant/cache_prefix.go new file mode 100644 index 0000000..11e6dda --- /dev/null +++ b/constant/cache_prefix.go @@ -0,0 +1,5 @@ +package constant + +const ( + Captcha = "captcha:" +) diff --git a/go.mod b/go.mod index c899eee..faeb644 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/go-resty/resty/v2 v2.11.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -36,6 +37,7 @@ require ( github.com/mdlayher/socket v0.4.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mojocn/base64Captcha v1.3.6 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/redis/go-redis/v9 v9.5.1 // indirect github.com/satori/go.uuid v1.2.0 // indirect @@ -45,10 +47,11 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.14.0 // indirect + golang.org/x/image v0.15.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.zx2c4.com/wireguard v0.0.0-20230325221338-052af4a8072b // indirect golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 // indirect diff --git a/go.sum b/go.sum index ad15764..200ec33 100644 --- a/go.sum +++ b/go.sum @@ -33,6 +33,8 @@ github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= @@ -77,6 +79,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw= +github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -114,6 +118,9 @@ golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -157,6 +164,7 @@ golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/http/api/user.go b/http/api/user.go new file mode 100644 index 0000000..5733cc0 --- /dev/null +++ b/http/api/user.go @@ -0,0 +1,26 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "wireguard-dashboard/http/param" + "wireguard-dashboard/utils" +) + +type user struct{} + +func UserApi() user { + return user{} +} + +// Login +// @description: 登陆 +// @receiver u +// @param c +func (u user) Login(c *gin.Context) { + var p param.Login + if err := c.ShouldBind(&p); err != nil { + utils.GinResponse(c).FailedWithErr("参数错误", err) + return + } + utils.GinResponse(c).OKWithData("不准") +} diff --git a/http/param/user.go b/http/param/user.go new file mode 100644 index 0000000..3f4261a --- /dev/null +++ b/http/param/user.go @@ -0,0 +1,6 @@ +package param + +type Login struct { + Account string `json:"account" form:"account" binding:"required"` + Password string `json:"password" form:"password" binding:"required"` +} diff --git a/main.go b/main.go index 9bedc5d..07d82f6 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,9 @@ func init() { } func main() { - route.IncludeRouters() + route.IncludeRouters( + route.UserApi, + ) handler := route.InitRouter() httpServe := http.Server{ diff --git a/route/user.go b/route/user.go new file mode 100644 index 0000000..f53a738 --- /dev/null +++ b/route/user.go @@ -0,0 +1,13 @@ +package route + +import ( + "github.com/gin-gonic/gin" + "wireguard-dashboard/http/api" +) + +func UserApi(r *gin.Engine) { + userApi := r.Group("user") + { + userApi.POST("/login", api.UserApi().Login) // 登陆 + } +} diff --git a/utils/gin_response.go b/utils/gin_response.go new file mode 100644 index 0000000..155db52 --- /dev/null +++ b/utils/gin_response.go @@ -0,0 +1,44 @@ +package utils + +import ( + "fmt" + "github.com/gin-gonic/gin" + "net/http" +) + +type ginResponse struct { + c *gin.Context +} + +func GinResponse(c *gin.Context) ginResponse { + return ginResponse{c: c} +} + +func (r ginResponse) OK() { + r.c.JSON(http.StatusOK, gin.H{ + "code": http.StatusOK, + "message": "success", + }) +} + +func (r ginResponse) Failed() { + r.c.JSON(http.StatusBadRequest, gin.H{ + "code": http.StatusBadRequest, + "message": "bad request", + }) +} + +func (r ginResponse) FailedWithErr(msg string, err error) { + r.c.JSON(http.StatusBadRequest, gin.H{ + "code": http.StatusBadRequest, + "message": fmt.Errorf("%s: %s", msg, err.Error()), + }) +} + +func (r ginResponse) OKWithData(data any) { + r.c.JSON(http.StatusOK, gin.H{ + "code": http.StatusOK, + "message": "success", + "data": data, + }) +}