133 lines
3.7 KiB
Go
133 lines
3.7 KiB
Go
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"git.echol.cn/loser/lckt/global"
|
|
r "git.echol.cn/loser/lckt/model/common/response"
|
|
"git.echol.cn/loser/lckt/model/user/request"
|
|
"git.echol.cn/loser/lckt/utils"
|
|
"git.echol.cn/loser/lckt/utils/user_jwt"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/redis/go-redis/v9"
|
|
"go.uber.org/zap"
|
|
"time"
|
|
)
|
|
|
|
type APPUserApi struct{}
|
|
|
|
// SendCode 发送验证码
|
|
func (*APPUserApi) SendCode(ctx *gin.Context) {
|
|
var p request.SendCodeReq
|
|
if err := ctx.ShouldBind(&p); err != nil {
|
|
r.FailWithMessage(err.Error(), ctx)
|
|
global.GVA_LOG.Error("参数错误,发送验证码失败", zap.Error(err))
|
|
return
|
|
}
|
|
if err := userService.SendCode(p); err != nil {
|
|
r.FailWithMessage("发送验证码失败", ctx)
|
|
return
|
|
}
|
|
|
|
r.OkWithMessage("发送验证码成功", ctx)
|
|
}
|
|
|
|
// Login 用户登录
|
|
func (*APPUserApi) Login(ctx *gin.Context) {
|
|
var p request.CodeLoginReq
|
|
if err := ctx.ShouldBind(&p); err != nil {
|
|
r.FailWithMessage(err.Error(), ctx)
|
|
global.GVA_LOG.Error("参数错误,登录失败", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
if result, _ := global.GVA_REDIS.Get(ctx, fmt.Sprintf("VerifyCode:%s", p.Phone)).Result(); result != p.Code {
|
|
global.GVA_LOG.Error("验证码错误", zap.String("phone", p.Phone))
|
|
r.FailWithMessage("验证码错误", ctx)
|
|
return
|
|
}
|
|
|
|
user, err := userService.Login(p)
|
|
if err != nil {
|
|
r.FailWithMessage("登录失败", ctx)
|
|
return
|
|
}
|
|
|
|
// 生成token
|
|
token, claims, err := user_jwt.LoginToken(user)
|
|
if err != nil {
|
|
global.GVA_LOG.Error("获取token失败!", zap.Error(err))
|
|
r.FailWithMessage("获取token失败", ctx)
|
|
return
|
|
}
|
|
|
|
if _, err = global.GVA_REDIS.Get(ctx, user.Phone).Result(); err == redis.Nil {
|
|
// 此处过期时间等于jwt过期时间
|
|
dr, err := utils.ParseDuration(global.GVA_CONFIG.JWT.ExpiresTime)
|
|
if err != nil {
|
|
return
|
|
}
|
|
timer := dr
|
|
if err := global.GVA_REDIS.Set(ctx, user.Phone, token, timer).Err(); err != nil {
|
|
global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
|
|
r.FailWithMessage("设置登录状态失败", ctx)
|
|
return
|
|
}
|
|
user_jwt.SetToken(ctx, token, int(claims.RegisteredClaims.ExpiresAt.Unix()-time.Now().Unix()))
|
|
r.OkWithDetailed(gin.H{
|
|
"User": user,
|
|
"Token": token,
|
|
"ExpiresAt": claims.RegisteredClaims.ExpiresAt.Unix() * 1000,
|
|
}, "登录成功", ctx)
|
|
} else if err != nil {
|
|
global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
|
|
r.FailWithMessage("设置登录状态失败", ctx)
|
|
}
|
|
}
|
|
|
|
// WechatLogin 微信登录
|
|
func (*APPUserApi) WechatLogin(ctx *gin.Context) {
|
|
var p request.CodeLoginReq
|
|
if err := ctx.ShouldBind(&p); err != nil {
|
|
r.FailWithMessage(err.Error(), ctx)
|
|
global.GVA_LOG.Error("参数错误,登录失败", zap.Error(err))
|
|
return
|
|
}
|
|
//Todo 待完善微信登录
|
|
}
|
|
|
|
// GetUserList 获取用户列表
|
|
func (*APPUserApi) GetUserList(ctx *gin.Context) {
|
|
var p request.GetUserListReq
|
|
if err := ctx.ShouldBind(&p); err != nil {
|
|
r.FailWithMessage(err.Error(), ctx)
|
|
global.GVA_LOG.Error("参数错误,获取用户列表失败", zap.Error(err))
|
|
return
|
|
}
|
|
userList, total, err := userService.GetUserList(p)
|
|
if err != nil {
|
|
r.FailWithMessage("获取用户列表失败", ctx)
|
|
return
|
|
}
|
|
r.OkWithDetailed(r.PageResult{
|
|
List: userList,
|
|
Total: total,
|
|
Page: p.Page,
|
|
PageSize: p.PageSize,
|
|
}, "获取用户列表成功", ctx)
|
|
}
|
|
|
|
// SetBalance 设置用户余额
|
|
func (*APPUserApi) SetBalance(ctx *gin.Context) {
|
|
var p request.SetBalanceReq
|
|
if err := ctx.ShouldBind(&p); err != nil {
|
|
r.FailWithMessage(err.Error(), ctx)
|
|
global.GVA_LOG.Error("参数错误,设置用户余额失败", zap.Error(err))
|
|
return
|
|
}
|
|
if err := userService.SetBalance(p); err != nil {
|
|
r.FailWithMessage("设置用户余额失败", ctx)
|
|
return
|
|
}
|
|
r.OkWithMessage("设置用户余额成功", ctx)
|
|
}
|