1
This commit is contained in:
@ -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}
|
||||
)
|
||||
|
||||
6
common/const/rediskey/sys_dict.go
Normal file
6
common/const/rediskey/sys_dict.go
Normal file
@ -0,0 +1,6 @@
|
||||
package rediskey
|
||||
|
||||
const (
|
||||
SysDictKey = "sys_dict:%s" //字典类型 {类型code}
|
||||
SysDictDataKey = "sys_dict_data:%s:%s" //字典数据 {字典类型code,字典数据code}
|
||||
)
|
||||
@ -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)
|
||||
// 日志处理
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 //重置密码-前后密码不一致
|
||||
)
|
||||
|
||||
@ -103,6 +103,7 @@ const (
|
||||
UserApiKeyInvalid //无效的ApiKey或密钥
|
||||
UserApiKeyPermissionError //密钥权限错误,请正确设置
|
||||
UserApiKeyNotExists //api不存在,请先去添加
|
||||
GoToneSmsTypeErr //短信类型错误
|
||||
)
|
||||
|
||||
// ===== Base Status Code ===== //
|
||||
|
||||
Reference in New Issue
Block a user