331 lines
7.8 KiB
Go
331 lines
7.8 KiB
Go
package account
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"fmt"
|
||
"fonchain-fiee/api/account"
|
||
"fonchain-fiee/pkg/cache"
|
||
"fonchain-fiee/pkg/e"
|
||
"fonchain-fiee/pkg/model/login"
|
||
"fonchain-fiee/pkg/model/union"
|
||
"fonchain-fiee/pkg/service"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/gin-gonic/gin/binding"
|
||
"github.com/go-redis/redis"
|
||
"time"
|
||
)
|
||
|
||
func UserApproval(c *gin.Context) {
|
||
var req account.CheckRealNameRequest
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
res, err := service.AccountProvider.CheckRealName(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
func UserList(c *gin.Context) {
|
||
var req account.UserListRequest
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
req.Domain = "app"
|
||
res, err := service.AccountProvider.UserList(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
func UserInfo(c *gin.Context) {
|
||
var req account.InfoRequest
|
||
user := login.GetUserInfoFromC(c)
|
||
req.ID = user.ID
|
||
req.Domain = user.Domain
|
||
res, err := service.AccountProvider.Info(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
|
||
func UserUpdate(c *gin.Context) {
|
||
var req account.UpdateRequest
|
||
user := login.GetUserInfoFromC(c)
|
||
req.ID = user.ID
|
||
req.Domain = user.Domain
|
||
res, err := service.AccountProvider.Update(context.Background(), &account.UpdateRequest{
|
||
ID: req.ID,
|
||
Domain: req.Domain,
|
||
Language: req.Language,
|
||
})
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
|
||
// SendMsg 用户发送验证码
|
||
func SendMsg(c *gin.Context) {
|
||
var req account.SendMsgRequest
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
_, err := service.AccountProvider.VerifySliderStatus(context.Background(), &account.VerifySliderStatusRequest{
|
||
NonceStr: req.NonceStr,
|
||
})
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
req.Project = "fiee"
|
||
req.TelNum = req.Zone + req.TelNum
|
||
if req.Zone != e.ZoneCn && req.Zone != "" {
|
||
// ============================== redis检查ip开始
|
||
ip := c.ClientIP()
|
||
daykey := "day_sms_limit:" + ip
|
||
minutekey := "minute_sms_limit:" + ip
|
||
duration := time.Second
|
||
isBlacklisted, blackErr := cache.RedisClient.SIsMember("nation_sms_blacklist", ip).Result()
|
||
if blackErr != nil {
|
||
service.Error(c, errors.New("Redis error"))
|
||
return
|
||
}
|
||
if isBlacklisted {
|
||
fmt.Println("当前ip手机号在黑名单中:", ip, ";手机号:", req.TelNum, ";domain:", req.Domain)
|
||
service.Success(c, "succes!!")
|
||
return
|
||
}
|
||
|
||
// 一分钟5次,一天30次
|
||
if dayCount, redisErr := cache.RedisClient.Get(daykey).Int(); redisErr == redis.Nil {
|
||
cache.RedisClient.Set(daykey, 1, 24*time.Hour)
|
||
} else if redisErr != nil {
|
||
service.Error(c, errors.New("Redis error"))
|
||
return
|
||
} else if dayCount >= 30 {
|
||
cache.RedisClient.SAdd("nation_sms_blacklist", ip)
|
||
cache.RedisClient.Expire("nation_sms_blacklist", 24*time.Hour) // 黑名单记录有效期为24小时
|
||
fmt.Println("当前ip手机号在黑名单中:", ip, ";手机号:", req.TelNum, ";domain:", req.Domain)
|
||
service.Success(c, "succes!!")
|
||
return
|
||
}
|
||
if minuteCount, redisErr := cache.RedisClient.Get(minutekey).Int(); redisErr == redis.Nil {
|
||
cache.RedisClient.Set(minutekey, 1, duration)
|
||
} else if redisErr != nil {
|
||
service.Error(c, errors.New("Redis error"))
|
||
return
|
||
} else if minuteCount >= 5 {
|
||
fmt.Println("当前ip触发每分钟5次限制:", ip, ";手机号:", req.TelNum, ";domain:", req.Domain)
|
||
service.Success(c, "succes!!")
|
||
return
|
||
}
|
||
cache.RedisClient.Incr(daykey)
|
||
cache.RedisClient.Incr(minutekey)
|
||
// ============================== redis检查ip结束
|
||
|
||
tempReq := &account.SendNationMsgRequest{
|
||
Domain: req.Domain,
|
||
TelNum: req.TelNum,
|
||
Project: req.Project,
|
||
SignNo: req.SignNo,
|
||
MId: req.MId,
|
||
Scope: req.Scope,
|
||
}
|
||
res, err := service.AccountProvider.SendNationMsg(context.Background(), tempReq)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
service.Success(c, res)
|
||
return
|
||
} else {
|
||
res, err := service.AccountProvider.SendMsg(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
|
||
//req.Domain = "app"
|
||
//req.SignNo = uint32(config.DefaultSignNo)
|
||
//res, err := service.AccountProvider.SendMsg(context.Background(), &req)
|
||
//if err != nil {
|
||
// service.Error(c, err)
|
||
// return
|
||
//}
|
||
|
||
}
|
||
func RealName(c *gin.Context) {
|
||
var req account.RealNameRequest
|
||
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
user := login.GetUserInfoFromC(c)
|
||
req.Id = user.ID
|
||
res, err := service.AccountProvider.RealName(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
|
||
// CheckMsg 验证码是否正确
|
||
func CheckMsg(c *gin.Context) {
|
||
|
||
var req account.CheckMsgRequest
|
||
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
req.TelNum = req.Zone + req.TelNum
|
||
res, err := service.AccountProvider.CheckMsg(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
func GenerateCaptcha(c *gin.Context) {
|
||
|
||
req := account.GenerateSliderCaptchaRequest{}
|
||
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
res, err := service.AccountProvider.GenerateSliderCaptcha(context.Background(), &req)
|
||
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
|
||
}
|
||
|
||
func ValidateCaptcha(c *gin.Context) {
|
||
|
||
req := account.VerifySliderCaptchaRequest{}
|
||
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
res, err := service.AccountProvider.VerifySliderCaptcha(context.Background(), &req)
|
||
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
|
||
}
|
||
func UserLogout(c *gin.Context) {
|
||
req := account.DecryptJwtRequest{}
|
||
req.Token = c.GetHeader(e.Authorization)
|
||
res, err := service.AccountProvider.Logout(c, &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
func UserRegister(c *gin.Context) {
|
||
var req account.RegistRequest
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
req.Domain = "app"
|
||
res, err := service.AccountProvider.Register(context.Background(), &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
tokenInfo, err := service.AccountProvider.Login(context.Background(), &account.LoginRequest{
|
||
Domain: req.Domain,
|
||
TelNum: req.TelNum,
|
||
Code: req.Code,
|
||
TelAreaCode: req.TelAreaCode,
|
||
})
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
res.Token = tokenInfo.Token
|
||
service.Success(c, res)
|
||
return
|
||
}
|
||
|
||
// UserLogin 用户登录操作
|
||
func UserLogin(c *gin.Context) {
|
||
var req account.LoginRequest
|
||
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
req.Ip = c.ClientIP()
|
||
req.Domain = "fontree"
|
||
res, err := service.AccountProvider.Login(c, &req)
|
||
if err != nil {
|
||
service.Error(c, err)
|
||
return
|
||
}
|
||
|
||
accountInfo := &union.AccountInfo{
|
||
ID: res.AccountInfo.ID,
|
||
Account: res.AccountInfo.Account,
|
||
NickName: res.AccountInfo.NickName,
|
||
Domain: res.AccountInfo.Domain,
|
||
TelNum: res.AccountInfo.TelNum,
|
||
Avatar: res.AccountInfo.Avatar,
|
||
CreatedAt: res.AccountInfo.CreateAt,
|
||
IsNeedChange: res.AccountInfo.IsNeedChange,
|
||
Sex: res.AccountInfo.Sex,
|
||
}
|
||
resInfo := &union.Login{
|
||
Token: res.Token,
|
||
RefreshToken: res.RefreshToken,
|
||
AccountInfo: accountInfo,
|
||
//JumpToWhere: jumpToWhere,
|
||
}
|
||
|
||
service.Success(c, resInfo)
|
||
|
||
return
|
||
}
|