Files
Go-Web-Template/server/api/v1/app/public_auth.go
2026-04-23 15:29:07 +08:00

123 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"strings"
"git.echol.cn/loser/Go-Web-Template/server/global"
appModel "git.echol.cn/loser/Go-Web-Template/server/model/app"
appReq "git.echol.cn/loser/Go-Web-Template/server/model/app/request"
appRes "git.echol.cn/loser/Go-Web-Template/server/model/app/response"
commonResp "git.echol.cn/loser/Go-Web-Template/server/model/common/response"
systemReq "git.echol.cn/loser/Go-Web-Template/server/model/system/request"
appSvc "git.echol.cn/loser/Go-Web-Template/server/service/app"
"git.echol.cn/loser/Go-Web-Template/server/utils"
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
)
type PublicAuthApi struct{}
func (a *PublicAuthApi) RegisterStatus(c *gin.Context) {
mode := appRes.RegisterMode(appSvc.GetRegisterMode())
requireCaptcha := appSvc.GetRegisterRequireCaptcha()
expireHours := appSvc.GetInviteExpireHours()
payload := appRes.RegisterStatusResponse{
Mode: mode,
RequireCaptcha: requireCaptcha,
InviteExpireHours: expireHours,
}
if mode == appRes.RegisterModeClosed {
payload.Message = "暂不开放注册"
}
commonResp.OkWithData(payload, c)
}
func (a *PublicAuthApi) Register(c *gin.Context) {
var req appReq.PublicRegister
if err := c.ShouldBindJSON(&req); err != nil {
commonResp.FailWithMessage(err.Error(), c)
return
}
mode := appSvc.GetRegisterMode()
if mode == appSvc.RegisterModeClosed {
commonResp.FailWithMessage("注册未开放", c)
return
}
// 可选验证码(复用 base64Captcha 默认内存 store
if appSvc.GetRegisterRequireCaptcha() {
if req.Captcha == "" || req.CaptchaId == "" || !base64Captcha.DefaultMemStore.Verify(req.CaptchaId, req.Captcha, true) {
commonResp.FailWithMessage("验证码错误", c)
return
}
}
req.Username = strings.TrimSpace(req.Username)
req.WelcomePhrase = strings.TrimSpace(req.WelcomePhrase)
if err := appSvc.AppRegisterServiceApp.Register(req, mode); err != nil {
commonResp.FailWithMessage(err.Error(), c)
return
}
commonResp.OkWithMessage("注册成功", c)
}
func (a *PublicAuthApi) Login(c *gin.Context) {
var req appReq.Login
if err := c.ShouldBindJSON(&req); err != nil {
commonResp.FailWithMessage(err.Error(), c)
return
}
req.Username = strings.TrimSpace(req.Username)
user, err := appSvc.AppAuthServiceApp.Login(req.Username, req.Password)
if err != nil {
// 记录失败登录日志(不阻断业务返回)
_ = global.GVA_DB.Create(&appModel.AppLoginLog{
AppUserID: 0,
Username: req.Username,
IP: c.ClientIP(),
Referer: c.GetHeader("Referer"),
UserAgent: c.GetHeader("User-Agent"),
Status: false,
ErrorMessage: err.Error(),
}).Error
commonResp.FailWithMessage(err.Error(), c)
return
}
// 记录最后登录与活跃
_ = appSvc.AppActivityServiceApp.RecordLogin(user.ID, c.ClientIP())
// 记录成功登录日志(不阻断业务返回)
_ = global.GVA_DB.Create(&appModel.AppLoginLog{
AppUserID: user.ID,
Username: user.Username,
IP: c.ClientIP(),
Referer: c.GetHeader("Referer"),
UserAgent: c.GetHeader("User-Agent"),
Status: true,
}).Error
j := utils.NewJWT()
claims := j.CreateAppClaims(utilsBaseClaimsFromAppUser(user))
token, err := j.CreateToken(claims)
if err != nil {
commonResp.FailWithMessage("获取token失败", c)
return
}
commonResp.OkWithData(gin.H{
"token": token,
}, c)
}
func utilsBaseClaimsFromAppUser(user *appModel.AppUser) systemReq.BaseClaims {
return systemReq.BaseClaims{
UUID: user.UUID,
ID: user.ID,
Username: user.Username,
NickName: user.Username,
AuthorityId: 0,
}
}