This commit is contained in:
2025-02-27 15:05:34 +08:00
parent 3f85158eed
commit be0db326b9
58 changed files with 1779 additions and 361 deletions

View File

@ -42,24 +42,25 @@ func GetDeviceID(ctx *gin.Context) string {
return device
}
// 获取 language默认语言zh-CN
// 获取 language默认语言zh_CN
// 英语 en
// 日本语 jp
// 韩语 kr
// 马来西亚语 my
// 泰国语 th
// 越南语 vn
// 简体中文 zh-CN
// 繁体中文 zh-HK
// 简体中文 zh_CN
// 繁体中文 zh_HK
func GetLanguage(ctx *gin.Context) string {
lang := ""
val, exits := ctx.Get("language")
// val, exits := ctx.Get("language")
val2 := ctx.Request.Header.Get("Accept-Language")
if !exits {
lang = "zh-CN"
} else {
lang = val.(string)
if val2 == "" {
lang = "zh_CN"
} else if val2 != "" {
lang = val2
}
return lang

View File

@ -10,10 +10,12 @@ import (
"go-admin/common/helper"
cModels "go-admin/common/models"
statuscode "go-admin/common/status_code"
"go-admin/config"
"go-admin/pkg/cryptohelper/inttostring"
"go-admin/pkg/cryptohelper/jwthelper"
"go-admin/pkg/cryptohelper/md5helper"
"go-admin/pkg/emailhelper"
"go-admin/pkg/utility"
"time"
"github.com/go-admin-team/go-admin-core/logger"
@ -93,7 +95,7 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i
Password: registerInfo.Password,
Salt: inttostring.GenerateRandomString(6),
Email: registerInfo.Email,
InviteCode: inttostring.NewNumberInvite().Encode(int(time.Now().Unix())),
InviteCode: inttostring.NewNumberInvite().GenerateRandomCode(int(time.Now().Unix())),
Loginip: registerInfo.IP,
Mobile: registerInfo.Phone,
Area: registerInfo.PhoneAreaCode,
@ -115,6 +117,7 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i
user.Nickname = user.Mobile
}
user.Nickname, _ = utility.GenerateUniqueNickname()
user.CreatedAt = time.Now()
user.Password = md5helper.MD5(registerInfo.Password + user.Salt)
// 开启事务
@ -149,7 +152,7 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i
//发送邮箱
emailCode := inttostring.GenerateRandomString(10)
go SendRegisterEmail(registerInfo.Email, emailCode)
go SendRegisterEmail(registerInfo.Email, emailCode, 0, registerInfo.Language)
//go func(email string, emailCode string) {
// defer func() {
// // 使用 recover 来捕获 panic避免 goroutine 导致程序崩溃
@ -181,36 +184,93 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i
return statuscode.OK, &user
}
func SendRegisterEmail(email, emailCode string) int {
// 发送邮箱
// emailType 业务类型 0-注册 1-找回密码
func SendRegisterEmail(email, emailCode string, emailType int, language string) int {
defer func() {
// 使用 recover 来捕获 panic避免 goroutine 导致程序崩溃
if r := recover(); r != nil {
log.Error("SendRegisterEmail Error:", r)
}
}()
get := helper.DefaultRedis.Get(fmt.Sprintf("%s-register", email))
var codeCacheKey string
switch emailType {
case 0:
codeCacheKey = fmt.Sprintf("%s-register", email)
case 1:
codeCacheKey = fmt.Sprintf("%s-reset_pwd", email)
default:
logger.Error("emailType error")
return statuscode.ServerError
}
get := helper.DefaultRedis.Get(codeCacheKey)
if get.Val() != "" { //说明邮箱操作频繁
return statuscode.EmailOrderTooOften
}
key := fmt.Sprintf(rediskey.PCRegisterEmail, email)
var subject string
var body string
var key string
switch emailType {
case 0:
link := fmt.Sprintf("%s/verify?email=%s&verify_code=%s&type=register", config.ExtConfig.Domain, email, emailCode)
// 创建邮件消息
key = fmt.Sprintf(rediskey.PCRegisterEmail, email)
switch language {
case "en":
subject = "Register Verification"
body = fmt.Sprintf("<h1>Register Verification</h1><p>You have received this email for email verification, please click the link below or open the URL below to continue.</p> %s </p>", link)
default:
subject = "注册验证"
body = fmt.Sprintf("<h1>注册验证</h1><p>您收到此电子邮件,用于进行邮箱验证,请点击下面的链接或打开下面的网址继续。</p> %s </p>", link)
}
case 1:
key = fmt.Sprintf(rediskey.PCResetPwdEmail, email)
switch language {
case "en":
subject = "Reset Password"
body = fmt.Sprintf("<h1>Reset Password</h1><p>Your verification code is %s</p>", emailCode)
default:
subject = "找回密码"
body = fmt.Sprintf("<h1>验证码</h1><p>您的验证码 %s</p> ", emailCode)
}
default:
logger.Error("发送邮件类型错误")
return statuscode.ServerError
}
if err := helper.DefaultRedis.SetStringExpire(key, emailCode, time.Second*300); err != nil {
log.Error("sendEmail setRedis Error:", zap.Error(err))
return statuscode.ServerError
}
err2 := emailhelper.SendFrontedEmail(email, emailCode)
err2 := emailhelper.SendFrontedEmail(email, emailCode, subject, body)
if err2 != nil {
log.Error("sendEmail server Error:", zap.Error(err2))
return statuscode.ServerError
}
//记录邮箱发送
helper.DefaultRedis.SetStringExpire(fmt.Sprintf("%s-register", email), "register", time.Second*60)
helper.DefaultRedis.SetStringExpire(codeCacheKey, "1", time.Second*60)
return statuscode.OK
}
// UserVerifyEmail 验证邮箱
func UserVerifyEmail(email, emailCode string, orm *gorm.DB) (code int) {
key := fmt.Sprintf(rediskey.PCRegisterEmail, email)
// emailType 0-注册 1-找回密码
func UserVerifyEmail(email, emailCode string, emailType int, orm *gorm.DB) (code int) {
var key string
switch emailType {
case 0:
key = fmt.Sprintf(rediskey.PCRegisterEmail, email)
case 1:
key = fmt.Sprintf(rediskey.PCResetPwdEmail, email)
default:
return statuscode.ServerError
}
get := helper.DefaultRedis.Get(key)
if get.Val() == "" {
return statuscode.EmailNotExistOrEmailCOdeExpired

View File

@ -3,17 +3,18 @@ package authservice
import (
"bytes"
"fmt"
"github.com/bytedance/sonic"
log "github.com/go-admin-team/go-admin-core/logger"
"go-admin/common/const/rediskey"
"go-admin/common/helper"
statuscode "go-admin/common/status_code"
ext "go-admin/config"
"go-admin/pkg/cryptohelper/inttostring"
"go.uber.org/zap"
"io/ioutil"
"net/http"
"time"
"github.com/bytedance/sonic"
log "github.com/go-admin-team/go-admin-core/logger"
"go.uber.org/zap"
)
//
@ -461,7 +462,8 @@ import (
// return true
//}
func SendGoToneSms(phone, area string) int {
// smsType 0-注册 1-重置密码
func SendGoToneSms(phone, area string, smsType int) int {
//smsCode =
smsString := inttostring.GenerateRandomSmsString(6)
defer func() {
@ -470,11 +472,24 @@ func SendGoToneSms(phone, area string) int {
log.Error("SendRegisterEmail Error:", r)
}
}()
get := helper.DefaultRedis.Get(fmt.Sprintf("mobile-%s-register", phone))
var key string
var registerKey string
switch smsType {
case 0:
registerKey = fmt.Sprintf("mobile-%s-register", phone)
key = fmt.Sprintf(rediskey.PCRegisterMobile, phone)
case 1:
registerKey = fmt.Sprintf("mobile-%s-resetpwd", phone)
key = fmt.Sprintf(rediskey.PCResetPwdMobile, phone)
default:
return statuscode.GoToneSmsTypeErr
}
get := helper.DefaultRedis.Get(registerKey)
if get.Val() != "" { //说明邮箱操作频繁
return statuscode.GoToneSmsOrderTooOften
}
key := fmt.Sprintf(rediskey.PCRegisterMobile, phone)
if err := helper.DefaultRedis.SetStringExpire(key, smsString, time.Second*300); err != nil {
log.Error("sendEmail setRedis Error:", zap.Error(err))
return statuscode.ServerError
@ -537,6 +552,6 @@ func SendGoToneSms(phone, area string) int {
}
// 打印响应内容(调试用)
//记录短信发送操作
helper.DefaultRedis.SetStringExpire(fmt.Sprintf("mobile-%s-register", phone), "register", time.Second*60)
helper.DefaultRedis.SetStringExpire(registerKey, "1", time.Second*60)
return statuscode.OK
}