diff --git a/README.md b/README.md index d616c44..bdfa004 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ## TODO +后端默认用户名不能是完整手机号 + 前端需要 token 化改造,以避免每次 basic 认证流程中 bcrypt 对比导致的性能对比 优化中间件,配置通用限速 diff --git a/go.mod b/go.mod index 1e22672..6721e4a 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/go-redsync/redsync/v4 v4.14.1 github.com/gofiber/contrib/otelfiber/v2 v2.2.3 github.com/gofiber/fiber/v2 v2.52.10 + github.com/gofiber/template/html/v2 v2.1.3 github.com/google/uuid v1.6.0 github.com/hibiken/asynq v0.25.1 github.com/jdcloud-api/jdcloud-sdk-go v1.64.0 @@ -54,6 +55,8 @@ require ( github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/gofiber/template v1.8.3 // indirect + github.com/gofiber/utils v1.1.0 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gomodule/redigo v2.0.0+incompatible // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect diff --git a/go.sum b/go.sum index a131922..a3c5094 100644 --- a/go.sum +++ b/go.sum @@ -115,6 +115,12 @@ github.com/gofiber/contrib/otelfiber/v2 v2.2.3 h1:WKW1XezHFAoohGZwnvC0R8TFJcNkab github.com/gofiber/contrib/otelfiber/v2 v2.2.3/go.mod h1:WdQ1tYbL83IYC6oBaWvKBMVGSAYvSTRuUWTcr0wK1T4= github.com/gofiber/fiber/v2 v2.52.10 h1:jRHROi2BuNti6NYXmZ6gbNSfT3zj/8c0xy94GOU5elY= github.com/gofiber/fiber/v2 v2.52.10/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= +github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= +github.com/gofiber/template/html/v2 v2.1.3 h1:n1LYBtmr9C0V/k/3qBblXyMxV5B0o/gpb6dFLp8ea+o= +github.com/gofiber/template/html/v2 v2.1.3/go.mod h1:U5Fxgc5KpyujU9OqKzy6Kn6Qup6Tm7zdsISR+VpnHRE= +github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= +github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= diff --git a/web/handlers/iden.go b/web/handlers/iden.go index 5e5c2ee..1250157 100644 --- a/web/handlers/iden.go +++ b/web/handlers/iden.go @@ -101,6 +101,18 @@ func Identify(c *fiber.Ctx) error { // endregion +type idenResultData struct { + Success bool + Message string +} + +func renderIdenResult(c *fiber.Ctx, success bool, message string) error { + return c.Render("views/iden-result", idenResultData{ + Success: success, + Message: message, + }) +} + // IdentifyCallbackNew 更新用户实名认证状态 func IdentifyCallbackNew(c *fiber.Ctx) error { @@ -110,18 +122,17 @@ func IdentifyCallbackNew(c *fiber.Ctx) error { Success bool `json:"success" validate:"required"` }) if err := c.QueryParser(req); err != nil { - return core.NewBizErr("解析请求参数失败", err) + return renderIdenResult(c, false, "解析请求参数失败") } // 获取 token infoStr, err := g.Redis.GetDel(c.Context(), idenKey(req.Id)).Bytes() if err != nil { - return core.NewBizErr("实名认证状态已失效", err) + return renderIdenResult(c, false, "实名认证状态已失效,请重新发起认证") } info := idenInfo{} - err = json.Unmarshal(infoStr, &info) - if err != nil { - return core.NewServErr("解析实名认证信息失败", err) + if err = json.Unmarshal(infoStr, &info); err != nil { + return renderIdenResult(c, false, "解析实名认证信息失败,请重新发起认证") } // 获取认证结果 @@ -131,13 +142,13 @@ func IdentifyCallbackNew(c *fiber.Ctx) error { info.Token, )) if err != nil { - return core.NewServErr("获取实名认证结果失败", err) + return renderIdenResult(c, false, "获取实名认证结果失败,请重新发起认证") } if resp.Error.Code != 0 { - return core.NewServErr(fmt.Sprintf("获取实名认证结果失败: %s", resp.Error.Message)) + return renderIdenResult(c, false, fmt.Sprintf("获取实名认证结果失败:%s", resp.Error.Message)) } if resp.Result.H5Result != "ok" || resp.Result.SmResult != "ok" || resp.Result.RxResult != "ok" { - return core.NewBizErr(fmt.Sprintf("实名认证失败: %s", resp.Result.Desc)) + return renderIdenResult(c, false, fmt.Sprintf("实名认证未通过:%s", resp.Result.Desc)) } // 更新用户实名认证状态 @@ -150,11 +161,11 @@ func IdentifyCallbackNew(c *fiber.Ctx) error { q.User.IDToken.Value(info.Token), ) if err != nil { - return core.NewServErr("更新用户实名信息失败", err) + return renderIdenResult(c, false, "保存实名认证信息失败,请联系客服处理") } // 返回结果页面 - return c.SendString("🎉认证成功!现在可以安全关闭这个页面") + return renderIdenResult(c, true, "实名认证成功,请在扫码页面点击按钮完成认证") } func idenKey(id string) string { diff --git a/web/handlers/resource.go b/web/handlers/resource.go index 6f3a3fb..5f4c081 100644 --- a/web/handlers/resource.go +++ b/web/handlers/resource.go @@ -55,6 +55,19 @@ func PageResourceShort(c *fiber.Ctx) error { if req.ExpireBefore != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).ExpireAt.Lte(*req.ExpireBefore)) } + if req.Status != nil { + var short = q.ResourceShort.As(q.Resource.Short.Name()) + switch *req.Status { + case 1: + var timeCond = q.Resource.Where(short.Type.Eq(int(m.ResourceModeTime)), short.ExpireAt.Gte(time.Now())) + var quotaCond = q.Resource.Where(short.Type.Eq(int(m.ResourceModeQuota)), short.Quota.GtCol(short.Used)) + do.Where(q.Resource.Where(timeCond).Or(quotaCond)) + case 2: + var timeCond = q.Resource.Where(short.Type.Eq(int(m.ResourceModeTime)), short.ExpireAt.Lte(time.Now())) + var quotaCond = q.Resource.Where(short.Type.Eq(int(m.ResourceModeQuota)), short.Quota.LteCol(short.Used)) + do.Where(q.Resource.Where(timeCond).Or(quotaCond)) + } + } resource, err := q.Resource.Where(do). Joins(q.Resource.Short). @@ -95,6 +108,7 @@ type PageResourceShortReq struct { CreateBefore *time.Time `json:"create_before"` ExpireAfter *time.Time `json:"expire_after"` ExpireBefore *time.Time `json:"expire_before"` + Status *int `json:"status"` // 0 - 全部,1 - 有效,2 - 过期 } // PageResourceLong 分页查询当前用户长效套餐 @@ -137,6 +151,19 @@ func PageResourceLong(c *fiber.Ctx) error { if req.ExpireBefore != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).ExpireAt.Lte(*req.ExpireBefore)) } + if req.Status != nil { + var long = q.ResourceLong.As(q.Resource.Long.Name()) + switch *req.Status { + case 1: + var timeCond = q.Resource.Where(long.Type.Eq(int(m.ResourceModeTime)), long.ExpireAt.Gte(time.Now())) + var quotaCond = q.Resource.Where(long.Type.Eq(int(m.ResourceModeQuota)), long.Quota.GtCol(long.Used)) + do.Where(q.Resource.Where(timeCond).Or(quotaCond)) + case 2: + var timeCond = q.Resource.Where(long.Type.Eq(int(m.ResourceModeTime)), long.ExpireAt.Lte(time.Now())) + var quotaCond = q.Resource.Where(long.Type.Eq(int(m.ResourceModeQuota)), long.Quota.LteCol(long.Used)) + do.Where(q.Resource.Where(timeCond).Or(quotaCond)) + } + } resource, err := q.Resource.Where(do). Joins(q.Resource.Long). @@ -177,6 +204,7 @@ type PageResourceLongReq struct { CreateBefore *time.Time `json:"create_before"` ExpireAfter *time.Time `json:"expire_after"` ExpireBefore *time.Time `json:"expire_before"` + Status *int `json:"status"` // 0 - 全部,1 - 有效,2 - 过期 } // PageResourceShortByAdmin 分页查询全部短效套餐 diff --git a/web/views/iden-result.html b/web/views/iden-result.html new file mode 100644 index 0000000..56cf512 --- /dev/null +++ b/web/views/iden-result.html @@ -0,0 +1,102 @@ + + +
+ + +