新增几大中心功能

This commit is contained in:
Administrator
2026-04-23 15:29:07 +08:00
parent 5c2a146a44
commit c6354ee065
123 changed files with 13074 additions and 229 deletions

View File

@@ -0,0 +1,122 @@
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,
}
}