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

@ -13,12 +13,16 @@ const (
ScanLoginSecret = "_ScanLoginSecret_%v" // 扫码登录秘钥
StatusCodeLanguage = "_StatusCodeLanguage_%v" // 状态码语言包_en
PCRegisterEmail = "_PCRegister_%v" // 用户注册时邮箱key
PCRegisterMobile = "_PCRegisterMobile_%v" // 用户注册时手机key
SpotSymbolTicker = "_SpotSymbolTicker_" // 现货交易对行情
FutSymbolTicker = "_FutSymbolTicker_" // 合约交易对行情
PreOrderScriptList = "_ProOrderScriptList_" // 脚本执行list
PreSpotOrderList = "_PreSpotOrderList_:%s" // 待触发的现货订单集合{交易所类型 exchange_type}
PreFutOrderList = "_PreFutOrderList_:%s" // 待触发的订单集合 {交易所类型 exchange_type}
PCResetPwdEmail = "_PCResetPwdEmail_%v" // 用户重置密码时邮箱key
PCRegisterMobile = "_PCRegisterMobile_%v" // 用户注册时手机key
PCResetPwdMobile = "_PCResetPwdMobile_%v" // 用户重置密码时手机key
SpotSymbolTicker = "_SpotSymbolTicker_" // 现货交易对行情
FutSymbolTicker = "_FutSymbolTicker_" // 合约交易对行情
PreOrderScriptList = "_ProOrderScriptList_" // 脚本执行list
PreSpotOrderList = "_PreSpotOrderList_:%s" // 待触发的现货订单集合{交易所类型 exchange_type}
PreFutOrderList = "_PreFutOrderList_:%s" // 待触发的订单集合 {交易所类型 exchange_type}
API_USER = "api_user:%v" // api用户
SystemSetting = "system_setting" //系统设置
@ -60,6 +64,8 @@ const (
// 用户下单
const (
MemberShipPre = "member_ship_pre:%v" //用户开通会员预下单 单价缓存{payable_amount}
MemberHash = "member_hash:%v" //用户开通会员hash缓存 {hash}
MemberHash = "member_hash:%s" //用户开通会员hash缓存 {hash}
OrderAmount = "order_amount:%v" //用户下单金额缓存 {amount}
OrderCallBackLock = "order_callback_lock:%v" //订单回调锁 {amount}
)

View File

@ -0,0 +1,6 @@
package rediskey
const (
SysDictKey = "sys_dict:%s" //字典类型 {类型code}
SysDictDataKey = "sys_dict_data:%s:%s" //字典数据 {字典类型code字典数据code}
)

View File

@ -1,10 +1,13 @@
package middleware
import (
"go-admin/common/actions"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/common/actions"
"github.com/gin-contrib/cors"
)
const (
@ -15,6 +18,13 @@ const (
func InitMiddleware(r *gin.Engine) {
r.Use(DemoEvn())
r.Use(cors.New(cors.Config{
AllowOrigins: []string{"*"}, // 允许所有
AllowMethods: []string{"GET", "POST", "PUT", "DELETE"}, // 允许的方法
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization", "Accept-Language"},
ExposeHeaders: []string{"Content-Length", "Authorization"},
AllowCredentials: true, // 允许携带 cookie
}))
// 数据库链接
r.Use(WithContextDb)
// 日志处理

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
}

View File

@ -2,11 +2,13 @@ package statuscode
//============用户模块===============
const (
InsufficientFunds = 110000 + iota // 提现可用余额不足
BelowMinimum // 提现金额低于最低限额
NetworkNotExist // 网络不存在
NetworkUnAvailable // 网络不可用
CanNotCancel // 无法取消
RenwalConfigDisabled // 续费配置不可用
UserApiUserNotBind // 用户未授权
InsufficientFunds = 110000 + iota // 提现可用余额不足
BelowMinimum // 提现金额低于最低限额
NetworkNotExist // 网络不存在
NetworkUnAvailable // 网络不可用
CanNotCancel // 无法取消
RenwalConfigDisabled // 续费配置不可用
UserApiUserNotBind // 用户未授权
MemberMinOrderAmountLessMininum //设置下单金额小于最小值
UserResetPasswordInconsistency //重置密码-前后密码不一致
)

View File

@ -103,6 +103,7 @@ const (
UserApiKeyInvalid //无效的ApiKey或密钥
UserApiKeyPermissionError //密钥权限错误,请正确设置
UserApiKeyNotExists //api不存在,请先去添加
GoToneSmsTypeErr //短信类型错误
)
// ===== Base Status Code ===== //