fonchain-fiee/pkg/service/account/account.go

306 lines
7.3 KiB
Go
Raw Normal View History

2025-02-20 11:43:50 +00:00
package account
import (
"context"
2025-02-21 09:05:27 +00:00
"errors"
"fmt"
2025-02-20 11:43:50 +00:00
"fonchain-fiee/api/account"
2025-02-21 09:05:27 +00:00
"fonchain-fiee/pkg/cache"
2025-02-20 11:43:50 +00:00
"fonchain-fiee/pkg/e"
2025-02-21 05:27:45 +00:00
"fonchain-fiee/pkg/model/login"
2025-02-20 11:43:50 +00:00
"fonchain-fiee/pkg/model/union"
"fonchain-fiee/pkg/service"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
2025-02-21 09:05:27 +00:00
"github.com/go-redis/redis"
"time"
2025-02-20 11:43:50 +00:00
)
2025-02-21 05:27:45 +00:00
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
}
2025-02-21 09:05:27 +00:00
// SendMsg 用户发送验证码
2025-02-20 11:43:50 +00:00
func SendMsg(c *gin.Context) {
var req account.SendMsgRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
2025-02-21 09:05:27 +00:00
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)
2025-02-20 11:43:50 +00:00
return
}
2025-02-21 09:05:27 +00:00
//req.Domain = "app"
//req.SignNo = uint32(config.DefaultSignNo)
//res, err := service.AccountProvider.SendMsg(context.Background(), &req)
//if err != nil {
// service.Error(c, err)
// return
//}
2025-02-20 11:43:50 +00:00
}
func RealName(c *gin.Context) {
var req account.RealNameRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
2025-02-21 05:27:45 +00:00
user := login.GetUserInfoFromC(c)
req.Id = user.ID
2025-02-20 11:43:50 +00:00
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
}
2025-02-21 09:05:27 +00:00
req.TelNum = req.Zone + req.TelNum
2025-02-20 11:43:50 +00:00
res, err := service.AccountProvider.CheckMsg(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
return
}
2025-02-21 09:05:27 +00:00
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{}
2025-02-20 11:43:50 +00:00
2025-02-21 09:05:27 +00:00
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)
}
2025-02-20 11:43:50 +00:00
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)
2025-02-21 05:27:45 +00:00
return
2025-02-20 11:43:50 +00:00
}
tokenInfo, err := service.AccountProvider.Login(context.Background(), &account.LoginRequest{
2025-02-21 09:05:27 +00:00
Domain: req.Domain,
TelNum: req.TelNum,
Code: req.Code,
TelAreaCode: req.TelAreaCode,
2025-02-20 11:43:50 +00:00
})
if err != nil {
service.Error(c, err)
2025-02-21 05:27:45 +00:00
return
2025-02-20 11:43:50 +00:00
}
res.Token = tokenInfo.Token
service.Success(c, res)
2025-02-21 05:27:45 +00:00
return
2025-02-20 11:43:50 +00:00
}
// 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
}