From f9d569078ac650e9ea6f0fb41bf9f489310ba571 Mon Sep 17 00:00:00 2001 From: kanade Date: Mon, 21 Nov 2022 11:03:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E7=9B=8A?= =?UTF-8?q?=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/v2/controller/app/vip/vip.go | 120 ++++++++++++++++++ .../model/recook/goods/recookGoodsInvite.go | 17 +++ internal/v2/router/app.go | 2 + 3 files changed, 139 insertions(+) create mode 100644 internal/v2/model/recook/goods/recookGoodsInvite.go diff --git a/internal/v2/controller/app/vip/vip.go b/internal/v2/controller/app/vip/vip.go index 104f420..a3ce006 100644 --- a/internal/v2/controller/app/vip/vip.go +++ b/internal/v2/controller/app/vip/vip.go @@ -8,6 +8,7 @@ import ( "recook/internal/model/user" "recook/internal/v2/lib/common" "recook/internal/v2/model/recook/goods" + "recook/tools" "time" "git.oa00.com/go/mysql" @@ -142,3 +143,122 @@ func (o Proxy) VipIsUsed(c *gin.Context) { res := dbc.Rds.SIsMember(key2, id) back.Suc(c, "操作成功", gin.H{"is_used": res.Val()}) } + +// InviteCheck @Title 邀请码验证 +func (o *Proxy) InviteCheck(c *gin.Context) { + args := argsGoodsInvite{} + err := tools.Params(&args, c) + if err != nil { + back.Fail(c, err.Error()) + return + } + if args.InviteNo == "" { + back.Fail(c, "二维码不存在或已失效") + return + } + recookGoodsInvite := goods.RecookGoodsInvite{} + if mysql.Db.Where("inviter_code = ? and status = ?", args.InviteNo, goods.RecookGoodsInviteStatusNone).First(&recookGoodsInvite).Error != nil { + back.Fail(c, "二维码已使用") + return + } + userId, _ := common.GetAppUserId(c) + var u1 user.Information + if err := mysql.Db.First(&u1, "id = ?", userId).Error; err != nil { + back.Fail(c, "二维码不存在或已失效") + return + } + if u1.Level == 10 { + // 合伙人或者真实vip店铺无需操作 + back.Suc(c, "操作成功", gin.H{"isVip": true}) + return + } else { + back.Suc(c, "操作成功", gin.H{"isVip": false}) + return + } +} + +type argsGoodsInvite struct { + InviteNo string +} + +// Invite @Title 邀请码 +func (o *Proxy) Invite(c *gin.Context) { + args := argsGoodsInvite{} + err := tools.Params(&args, c) + if err != nil { + back.Fail(c, err.Error()) + return + } + if args.InviteNo == "" { + back.Fail(c, "二维码不存在或已失效") + return + } + recookGoodsInvite := goods.RecookGoodsInvite{} + if mysql.Db.Where("inviter_code = ? and status = ?", args.InviteNo, goods.RecookGoodsInviteStatusNone).First(&recookGoodsInvite).Error != nil { + back.Fail(c, "二维码已使用") + return + } + userId, _ := common.GetAppUserId(c) + var u1 user.Information + if err := mysql.Db.First(&u1, "id = ?", userId).Error; err != nil { + back.Fail(c, "二维码不存在或已失效") + return + } + if u1.Level == 10 { + // 合伙人或者真实vip店铺无需操作 + back.Fail(c, "合伙人无需领取权益卡") + return + } + patch := make(map[string]interface{}) + patch["level"] = 2 + patch["parent_id"] = 0 + patch["is_offline"] = true + now := time.Now() + end := now + level := u1.Level + if u1.VipUpgradeEnd.Valid && time.Now().Before(u1.VipUpgradeEnd.Time) { + // 续约 + level = u1.OldLevel + now = u1.VipUpgradeStart.Time + end = u1.VipUpgradeEnd.Time + } else { + // 没有升级过 || 升级过已经过了上一次的时间重新计算 + patch["old_level"] = u1.Level + patch["old_parent_id"] = u1.ParentID + patch["old_root_id"] = u1.RootID + } + end = end.AddDate(1, 0, 0) + patch["vip_upgrade_start"] = formatime.NewSecondFrom(now) + patch["vip_upgrade_end"] = formatime.NewSecondFrom(end) + if err := mysql.Db.Transaction(func(tx *gorm.DB) error { + if tx.Model(&recookGoodsInvite).Where(&recookGoodsInvite).Updates(map[string]interface{}{ + "status": goods.RecookGoodsInviteStatusUsed, + "use_user_id": userId, + }).RowsAffected != 1 { + return errors.New("领取失败") + } + if err := tx.Table((&user.Information{}).TableName()).Where("id = ?", u1.ID).Updates(patch).Error; err != nil { + return errors.New("领取失败") + } + kind := user.Year + if tx.Create(&user.VipHistory{ + UserID: int(userId), + Name: kind.Str(), + Start: &now, + End: &end, + Amount: decimal.Zero, + Level: level, + Nickname: u1.Nickname, + Mobile: u1.Mobile, + Kind: kind, + }).Error != nil { + return errors.New("领取失败") + } + return nil + }); err != nil { + back.Fail(c, err.Error()) + return + } + back.Suc(c, "操作成功", gin.H{"endTime": end.Unix()}) + return +} diff --git a/internal/v2/model/recook/goods/recookGoodsInvite.go b/internal/v2/model/recook/goods/recookGoodsInvite.go new file mode 100644 index 0000000..a01ef6f --- /dev/null +++ b/internal/v2/model/recook/goods/recookGoodsInvite.go @@ -0,0 +1,17 @@ +package goods + +import "time" + +const ( + RecookGoodsInviteStatusNone = 1 // 未使用 + RecookGoodsInviteStatusUsed = 2 // 已使用 +) + +type RecookGoodsInvite struct { + Id uint `gorm:"primaryKey"` + InviterCode string // 邀请的code + Status uint // 验证码状态 1=未使用 2=已使用 + UseUserId uint // 使用用户id + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/internal/v2/router/app.go b/internal/v2/router/app.go index 4230e54..9abf1c2 100644 --- a/internal/v2/router/app.go +++ b/internal/v2/router/app.go @@ -273,6 +273,8 @@ func routerApp(appRouter *gin.RouterGroup) { vipController.POST("goods", proxy.VipGoods) vipController.POST("active", proxy.VipActive) vipController.POST("is_used", proxy.VipIsUsed) + vipController.POST("invite_check", proxy.InviteCheck) + vipController.POST("invite", proxy.Invite) } } pushController := appRouter.Group("push", authorize) From 32ec697fc2bffb2eab8be8413e795e50ce2f7dcb Mon Sep 17 00:00:00 2001 From: kanade Date: Mon, 21 Nov 2022 15:19:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/config.go | 14 ++++++++------ go.mod | 4 ++-- go.sum | 8 ++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/configs/config.go b/configs/config.go index af75dd1..f06ac9a 100644 --- a/configs/config.go +++ b/configs/config.go @@ -110,10 +110,12 @@ func init() { }) rabbitmq.InitRabbitmq(rabbitmq.Config{ - Host: "supply_api.reecook.cn", - Port: 5672, - User: "u0zPiIEZwMnmVdu20zZ1jAV931K5lMWM", - Password: "dfbfe3da92d363727a1e0bca612e40a4", + Host: "supply_api.reecook.cn", + Port: 5672, + User: "u0zPiIEZwMnmVdu20zZ1jAV931K5lMWM", + Password: "dfbfe3da92d363727a1e0bca612e40a4", + ReConnSecond: 3, + ReConn: true, }) } else { log.Println("当前为测试版") @@ -219,8 +221,8 @@ const ( ConfigShaMaMqHost = "shama.reecook.cn" ConfigShaMaMqPort = "5672" - AlipayAppid = "2021001108632223" // appId - AlipayPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMQOxcXlyNfnNEui3aipacvfR3NV50lpmVZ1KApskiIy5DjivOyBwvxqB/I7uutPgwlnRsjzzqTx55LbooeSO9UoobBKr3FdxGqjjw4MZNcW5wNiZG3JEQ3OtCgg3o7Y13SYAyKr3DNcHufAKuLKi/IFxmUubfWQ0mHR9ePFMec6ecqpHWsIZmNy5ujY0TMZH1q4Rg1zfUHQu78PWAcsNl+t3Zxs5j1tUo7ZtAfqca6sU+cPXuAx+l/CIhCwX35w39E6J1BYUBczSGvj5+dNAM+dMfuaZCeZo0W9cvhZ6d5Jd3ZCNP/II3S4Sk479kCO6ErG7MyO53//uW8aPnEeAxAgMBAAECggEBAMbjBQRgYdDpa0Zl39ZokoWntc8KKaJvLre7NyvMvBdAmIDxhBjC5CdlSsziN5PD5dQx/MXkqBUj23F1pEpawwFLyOzMG8mjAK3SfMWYqZ+pLzeWkqj3h04bP/2v8+l2vwSDjo/K7KKTyvX0zQtasyoAUdjVKrga12Hgg7XYGbuQdd6UXFqT+BTwQq2JDJEJTYPutN4VyCwiUEGuwCD3TkIFU0d5SGHaOgYBN/btaoPQLm8VnlKRvVr8o9vQ2cr6lDwRtFXkJ3RZJw8UExVPGHAoRlECwqEVA1mJMQ5EPhJrEgNINlE6JiqqCgo1/+58Q9XfYsf7uY8HccFYQP9FIRECgYEA9yXr2N6/vg6sW1PHu5HZWJm0761qq9ed2jZmwNPMD6Xz7Uz9GkYRbxuKvm9YP9qP7pNdH6K14E2gME0AjEmWdx9VId6rKRTR+GGVL01ETnZ62hrG/AEJfBAL+ZVCZYcyMAJYKHomgnY+dvdy3mtxmk8IOT+QkJHrKSX8XBRTxk0CgYEA05G0vfBq4oi3DdO/nrvxSc5K9SLvjW9Rnbr+jgmxw+ZEbqSrsooImfUYUbfkN96X7RePEVLznNYkjJPpp20DNnoauCAfCcjupSPFl1cVEWHs2Czc7HSiqHm7lCDcyyb4q2Vsu6zKmsJIHxEXw76gdUKxvNhiKE0BwHQ/Yqmmu3UCgYEAkGlSFBikBVPhlkOwE4O3cjPuK5YzHFIS5GyhQc8AD6yyiVhRFEcY7Mk1Gu1IrZbyPz9QTKnwiC4TieWUimR9TQG75tyLOqf1wKKUX11QqmBEjKjU2G9qsVlXBfEXKOgEhVT5Wj11vwmEmlMghaJWcQn5Dip8OF1rAVI20T73bIkCgYAtwc+TXNHhGKxugyNoU0GGMuWnSt0Ae9jtAipX0eTud3jJbTftL0lY8tdFpT3oj23QS04X8xbZDr9s3/iiy0Lsn0/0Do5n8VsbwDbV2nGmBsXQozNMuJUNVvaovMrD7TPO7eqsVFylR+uNPIclQK83bSs/qpTgHneIhhvHXOXAmQKBgATsDkvmaVTyGpuzaur7SodTJneNQWQEtnGhaAtbXtPWKpUJHAyIDt7/80FwHOun3/N0CBjzt06T4uvGDzRpYJCsTcoap/JbgdokN4KloRs2Nd7+3O1scep0mJoQWPcYKZxErmTtYgCrSLENbi6sf83xwTWcncFJ9qu1ei13NzPB" // 商户私钥 + AlipayAppid = "2021001108632223" // appId + AlipayPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMQOxcXlyNfnNEui3aipacvfR3NV50lpmVZ1KApskiIy5DjivOyBwvxqB/I7uutPgwlnRsjzzqTx55LbooeSO9UoobBKr3FdxGqjjw4MZNcW5wNiZG3JEQ3OtCgg3o7Y13SYAyKr3DNcHufAKuLKi/IFxmUubfWQ0mHR9ePFMec6ecqpHWsIZmNy5ujY0TMZH1q4Rg1zfUHQu78PWAcsNl+t3Zxs5j1tUo7ZtAfqca6sU+cPXuAx+l/CIhCwX35w39E6J1BYUBczSGvj5+dNAM+dMfuaZCeZo0W9cvhZ6d5Jd3ZCNP/II3S4Sk479kCO6ErG7MyO53//uW8aPnEeAxAgMBAAECggEBAMbjBQRgYdDpa0Zl39ZokoWntc8KKaJvLre7NyvMvBdAmIDxhBjC5CdlSsziN5PD5dQx/MXkqBUj23F1pEpawwFLyOzMG8mjAK3SfMWYqZ+pLzeWkqj3h04bP/2v8+l2vwSDjo/K7KKTyvX0zQtasyoAUdjVKrga12Hgg7XYGbuQdd6UXFqT+BTwQq2JDJEJTYPutN4VyCwiUEGuwCD3TkIFU0d5SGHaOgYBN/btaoPQLm8VnlKRvVr8o9vQ2cr6lDwRtFXkJ3RZJw8UExVPGHAoRlECwqEVA1mJMQ5EPhJrEgNINlE6JiqqCgo1/+58Q9XfYsf7uY8HccFYQP9FIRECgYEA9yXr2N6/vg6sW1PHu5HZWJm0761qq9ed2jZmwNPMD6Xz7Uz9GkYRbxuKvm9YP9qP7pNdH6K14E2gME0AjEmWdx9VId6rKRTR+GGVL01ETnZ62hrG/AEJfBAL+ZVCZYcyMAJYKHomgnY+dvdy3mtxmk8IOT+QkJHrKSX8XBRTxk0CgYEA05G0vfBq4oi3DdO/nrvxSc5K9SLvjW9Rnbr+jgmxw+ZEbqSrsooImfUYUbfkN96X7RePEVLznNYkjJPpp20DNnoauCAfCcjupSPFl1cVEWHs2Czc7HSiqHm7lCDcyyb4q2Vsu6zKmsJIHxEXw76gdUKxvNhiKE0BwHQ/Yqmmu3UCgYEAkGlSFBikBVPhlkOwE4O3cjPuK5YzHFIS5GyhQc8AD6yyiVhRFEcY7Mk1Gu1IrZbyPz9QTKnwiC4TieWUimR9TQG75tyLOqf1wKKUX11QqmBEjKjU2G9qsVlXBfEXKOgEhVT5Wj11vwmEmlMghaJWcQn5Dip8OF1rAVI20T73bIkCgYAtwc+TXNHhGKxugyNoU0GGMuWnSt0Ae9jtAipX0eTud3jJbTftL0lY8tdFpT3oj23QS04X8xbZDr9s3/iiy0Lsn0/0Do5n8VsbwDbV2nGmBsXQozNMuJUNVvaovMrD7TPO7eqsVFylR+uNPIclQK83bSs/qpTgHneIhhvHXOXAmQKBgATsDkvmaVTyGpuzaur7SodTJneNQWQEtnGhaAtbXtPWKpUJHAyIDt7/80FwHOun3/N0CBjzt06T4uvGDzRpYJCsTcoap/JbgdokN4KloRs2Nd7+3O1scep0mJoQWPcYKZxErmTtYgCrSLENbi6sf83xwTWcncFJ9qu1ei13NzPB" // 商户私钥 AlipayAliPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtrlT+XcRtKrfgDKB6XxlJbLzQWNMPQ8tTmZvd66OoJDbsnPZuIP7w01XNdIodEAxTFpK4wjUNauqUTSxJimkM8GsPgX/wUW7PR4i25cniHgFFH8vLuRnXcwTptr3LnAjgaSj0nOZYAnOkTcSLoPGgMqBzT/eADkpRvBTRvEhEaMjMPRJ09jVGrIjzpugZ5ECWNBD28nqtAAyDU1jKtHL5l290+WIA838D8sP54Kx8vAwFgMelRg1SljPcSrA2Hnh8qAesiZuJB3pGRKSEwPp51opdM2ARehbXLZsURkjGfB9jVBu9bdKMd7Mm7bun/GD2zM4V07JeFKnYwrcX5lL1wIDAQAB" // 支付宝公钥 ) diff --git a/go.mod b/go.mod index 85e1bad..1b5396c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( git.oa00.com/go/alipay v1.0.0 git.oa00.com/go/mysql v1.0.0 - git.oa00.com/go/rabbitmq v1.0.5 + git.oa00.com/go/rabbitmq v1.0.9 github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/alibabacloud-go/opensearch-util v1.0.1 @@ -39,7 +39,7 @@ require ( github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/panjf2000/ants/v2 v2.5.0 github.com/pkg/errors v0.9.1 - github.com/rabbitmq/amqp091-go v1.4.0 + github.com/rabbitmq/amqp091-go v1.5.0 github.com/robfig/cron/v3 v3.0.0 github.com/shopspring/decimal v1.2.0 github.com/siddontang/go-log v0.0.0-20190221022429-1e957dd83bed diff --git a/go.sum b/go.sum index 677124a..9331c84 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ git.oa00.com/go/formatime v1.0.0 h1:DYyHRA58N7MH70oe0wJKboV61Sq+QwoZDCajUP/T14A= git.oa00.com/go/formatime v1.0.0/go.mod h1:E48/rexcow7/YAIu5O5X/D+NVzFf39jEuENyhRKNlP0= git.oa00.com/go/mysql v1.0.0 h1:E9H6MF0eYgFovLmVYgyCiwjIestp/wRPWjwKyayg3LI= git.oa00.com/go/mysql v1.0.0/go.mod h1:pQm9xCn8iFew9egnEPvzAlggGykmAlwV1nqTX5KIXiQ= -git.oa00.com/go/rabbitmq v1.0.5 h1:/Y6R1lIPMbgnOtf37TKankz89ni920t9p1VzNZvmak8= -git.oa00.com/go/rabbitmq v1.0.5/go.mod h1:/qLsl9f+AF92+ApdUOUbrdjN+uy2/5HeBkjMyMcMtXI= +git.oa00.com/go/rabbitmq v1.0.9 h1:VTZwQMB1Tm4ai8RNG1jTn6+HflQ75/Zn+PDqb4ykhzY= +git.oa00.com/go/rabbitmq v1.0.9/go.mod h1:gE3VfK8y7GqW3L86bMXWzpsDNKnjQIj5Xq6xtX3zGDI= github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 h1:tDWYNCJrpNnlNg8mVdlzAzPjlPaRbsA/kS8H9LczleQ= github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0/go.mod h1:Uwb0d1GgxJieUWZG5WylTrgQ2SrldfjagAxheU8W6MQ= github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -499,8 +499,8 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/rabbitmq/amqp091-go v1.4.0 h1:T2G+J9W9OY4p64Di23J6yH7tOkMocgnESvYeBjuG9cY= -github.com/rabbitmq/amqp091-go v1.4.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg= +github.com/rabbitmq/amqp091-go v1.5.0 h1:VouyHPBu1CrKyJVfteGknGOGCzmOz0zcv/tONLkb7rg= +github.com/rabbitmq/amqp091-go v1.5.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg= github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= From 77673fb4b9d949657e3fd8a9896f753a2c5d01a2 Mon Sep 17 00:00:00 2001 From: kanade Date: Mon, 21 Nov 2022 15:42:33 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dbc/mysql.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/dbc/mysql.go b/internal/dbc/mysql.go index f1134ea..5003457 100755 --- a/internal/dbc/mysql.go +++ b/internal/dbc/mysql.go @@ -101,6 +101,11 @@ func SetupNewMysql() { if err != nil { panic(err) } + db, err := mysql2.Db.DB() + if err != nil { + panic(err) + } + db.SetConnMaxLifetime(43200) } else { err := mysql2.InitMysql(&mysql2.DbConfig{ Username: configs.GetEnv("mysql-username", "db_recook_v2"),