Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop
This commit is contained in:
commit
2eb552e303
|
@ -6,7 +6,7 @@ Thank you for registering an account with {{ .CompanyName }}. We are thrilled to
|
||||||
|
|
||||||
Please take a moment to confirm your email address by clicking the button below so we can activate your account:
|
Please take a moment to confirm your email address by clicking the button below so we can activate your account:
|
||||||
|
|
||||||
<a href="{{ .ConfirmationLink }}" target="_blank" style="background-color: #008CBA; color: #FFFFFF; text-decoration: none; padding: 10px 15px; border-radius: 3px; display:inline-block; font-weight: bold;">Confirm Account: .UserName</a>
|
<a href="{{ .ConfirmationLink }}" target="_blank" style="background-color: #008CBA; color: #FFFFFF; text-decoration: none; padding: 10px 15px; border-radius: 3px; display:inline-block; font-weight: bold;">Confirm Account: {{ .UserName }}</a>
|
||||||
|
|
||||||
|
|
||||||
Confirming your email ensures your account is properly secured. This also lets you access member-only tools and content.
|
Confirming your email ensures your account is properly secured. This also lets you access member-only tools and content.
|
||||||
|
|
16
fs_template/reset_password.tpl
Normal file
16
fs_template/reset_password.tpl
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
Dear {{ .UserName }},
|
||||||
|
|
||||||
|
We have received your request to reset your {{ .CompanyName }} account password.
|
||||||
|
|
||||||
|
Please click the button below to confirm your new password:
|
||||||
|
|
||||||
|
<h1 style="color: red; font-weight: bold;">{{ .MaskedPassword }}</h1> (This can be replaced by the masked new password)
|
||||||
|
|
||||||
|
<a href="{{ .ConfirmationLink }}" target="_blank" style="background-color: #008CBA; color: #FFFFFF; text-decoration: none; padding: 10px 15px; border-radius: 3px; font-weight: bold;">Confirm New Password</a>
|
||||||
|
|
||||||
|
This password reset confirmation link will expire in 60 minutes. Please let us know if you have any other questions!
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
{{ .SenderName }}
|
||||||
|
{{ .SenderTitle }}
|
||||||
|
{{ .CompanyName }}
|
|
@ -2,6 +2,7 @@ package logic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"fusenapi/utils/check"
|
"fusenapi/utils/check"
|
||||||
"fusenapi/utils/fstpl"
|
"fusenapi/utils/fstpl"
|
||||||
"log"
|
"log"
|
||||||
|
@ -52,6 +53,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
type EmailFormat struct {
|
type EmailFormat struct {
|
||||||
|
TemplateName string // 模板名字
|
||||||
UniqueKey string // 用于处理唯一的任务,重发都会被利用到
|
UniqueKey string // 用于处理唯一的任务,重发都会被利用到
|
||||||
TargetEmail string // 发送的目标email
|
TargetEmail string // 发送的目标email
|
||||||
CompanyName string // fs公司名
|
CompanyName string // fs公司名
|
||||||
|
@ -61,6 +63,48 @@ type EmailFormat struct {
|
||||||
Extend map[string]string
|
Extend map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (eformat *EmailFormat) Vaild() error {
|
||||||
|
|
||||||
|
// 1. 检查模板名称
|
||||||
|
if tpls.Lookup(eformat.TemplateName) == nil {
|
||||||
|
return fmt.Errorf("%s template name is not found", eformat.TemplateName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 检查公司名称
|
||||||
|
if eformat.CompanyName == "" {
|
||||||
|
return fmt.Errorf("company name cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 检查确认链接
|
||||||
|
if eformat.ConfirmationLink == "" {
|
||||||
|
return fmt.Errorf("confirmation link cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 检查发送人名称
|
||||||
|
if eformat.SenderName == "" {
|
||||||
|
return fmt.Errorf("sender name cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 检查发送人头衔
|
||||||
|
if eformat.SenderTitle == "" {
|
||||||
|
return fmt.Errorf("sender title cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 检查目标邮箱
|
||||||
|
if eformat.TargetEmail == "" {
|
||||||
|
return fmt.Errorf("target email cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 检查唯一键
|
||||||
|
if eformat.UniqueKey == "" {
|
||||||
|
return fmt.Errorf("unique key cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 所有校验通过
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// EmailSender
|
// EmailSender
|
||||||
type EmailSender struct {
|
type EmailSender struct {
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
|
@ -87,8 +131,9 @@ func (m *EmailSender) ProcessEmailTasks() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if emailformat.UniqueKey == "" {
|
err := emailformat.Vaild()
|
||||||
logx.Error("email UniqueKey must be exists")
|
if err != nil {
|
||||||
|
logx.Error(err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +156,9 @@ func (m *EmailSender) ProcessEmailTasks() {
|
||||||
go func() {
|
go func() {
|
||||||
defer func() { <-m.semaphore }() // Release a token
|
defer func() { <-m.semaphore }() // Release a token
|
||||||
|
|
||||||
content := RenderEmailRegisterTemplate(emailformat.CompanyName,
|
content := RenderEmailTemplate(
|
||||||
|
emailformat.TemplateName,
|
||||||
|
emailformat.CompanyName,
|
||||||
emailformat.ConfirmationLink,
|
emailformat.ConfirmationLink,
|
||||||
emailformat.SenderName,
|
emailformat.SenderName,
|
||||||
emailformat.SenderTitle,
|
emailformat.SenderTitle,
|
||||||
|
@ -162,7 +209,7 @@ func (m *EmailSender) ClearExpiredTasks() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RenderEmailRegisterTemplate(companyName, confirmationLink, senderName, senderTitle string, extend map[string]string) []byte {
|
func RenderEmailTemplate(templateName, companyName, confirmationLink, senderName, senderTitle string, extend map[string]string) []byte {
|
||||||
|
|
||||||
data := map[string]string{
|
data := map[string]string{
|
||||||
"CompanyName": companyName,
|
"CompanyName": companyName,
|
||||||
|
@ -176,7 +223,7 @@ func RenderEmailRegisterTemplate(companyName, confirmationLink, senderName, send
|
||||||
}
|
}
|
||||||
|
|
||||||
var result bytes.Buffer
|
var result bytes.Buffer
|
||||||
err := tpls.ExecuteTemplate(&result, "email_register.tpl", data)
|
err := tpls.ExecuteTemplate(&result, templateName, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,7 @@ func (l *UserEmailRegisterLogic) UserEmailRegister(req *types.RequestEmailRegist
|
||||||
userName := token.Extend["first_name"].(string) + " " + token.Extend["last_name"].(string)
|
userName := token.Extend["first_name"].(string) + " " + token.Extend["last_name"].(string)
|
||||||
// 进入发送邮箱的系统
|
// 进入发送邮箱的系统
|
||||||
EmailManager.EmailTasks <- &EmailFormat{
|
EmailManager.EmailTasks <- &EmailFormat{
|
||||||
|
TemplateName: "email_register.tpl",
|
||||||
UniqueKey: "register-" + req.Email,
|
UniqueKey: "register-" + req.Email,
|
||||||
TargetEmail: req.Email,
|
TargetEmail: req.Email,
|
||||||
CompanyName: "fusen",
|
CompanyName: "fusen",
|
||||||
|
|
|
@ -74,6 +74,7 @@ func (l *UserRegisterLogic) UserRegister(req *types.RequestUserRegister, userinf
|
||||||
|
|
||||||
// 进入发送邮箱的系统
|
// 进入发送邮箱的系统
|
||||||
EmailManager.EmailTasks <- &EmailFormat{
|
EmailManager.EmailTasks <- &EmailFormat{
|
||||||
|
TemplateName: "email_register.tpl",
|
||||||
UniqueKey: "register-" + req.Email,
|
UniqueKey: "register-" + req.Email,
|
||||||
TargetEmail: req.Email,
|
TargetEmail: req.Email,
|
||||||
CompanyName: "fusen",
|
CompanyName: "fusen",
|
||||||
|
|
|
@ -28,7 +28,8 @@ type RequestUserRegister struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type RequestUserResetToken struct {
|
type RequestUserResetToken struct {
|
||||||
Wid string `json:"wid"`
|
Wid string `json:"wid"`
|
||||||
|
Email string `json:"email"` // email
|
||||||
}
|
}
|
||||||
|
|
||||||
type DataResetToken struct {
|
type DataResetToken struct {
|
||||||
|
|
|
@ -76,7 +76,7 @@ func (mquery *ModuleQuery) EncodeEmpty() map[string]any {
|
||||||
query = "." + query
|
query = "." + query
|
||||||
}
|
}
|
||||||
k := fmt.Sprintf("%s%s", mquery.ModuleName, query)
|
k := fmt.Sprintf("%s%s", mquery.ModuleName, query)
|
||||||
qstr[k] = map[string]any{}
|
qstr[k] = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return qstr
|
return qstr
|
||||||
|
|
|
@ -12,28 +12,28 @@ import "basic.api"
|
||||||
service auth {
|
service auth {
|
||||||
@handler UserLoginHandler
|
@handler UserLoginHandler
|
||||||
post /api/auth/login(RequestUserLogin) returns (response);
|
post /api/auth/login(RequestUserLogin) returns (response);
|
||||||
|
|
||||||
@handler UserRegisterHandler
|
@handler UserRegisterHandler
|
||||||
post /api/auth/register(RequestUserRegister) returns (response);
|
post /api/auth/register(RequestUserRegister) returns (response);
|
||||||
|
|
||||||
@handler AcceptCookieHandler
|
@handler AcceptCookieHandler
|
||||||
post /api/auth/accept-cookie(request) returns (response);
|
post /api/auth/accept-cookie(request) returns (response);
|
||||||
|
|
||||||
@handler UserGoogleLoginHandler
|
@handler UserGoogleLoginHandler
|
||||||
get /api/auth/oauth2/login/google(RequestGoogleLogin) returns (response);
|
get /api/auth/oauth2/login/google(RequestGoogleLogin) returns (response);
|
||||||
|
|
||||||
@handler UserEmailConfirmationHandler
|
@handler UserEmailConfirmationHandler
|
||||||
get /api/auth/email/confirmation(RequestEmailConfirmation) returns (response);
|
get /api/auth/email/confirmation(RequestEmailConfirmation) returns (response);
|
||||||
|
|
||||||
@handler UserEmailRegisterHandler
|
@handler UserEmailRegisterHandler
|
||||||
post /api/auth/oauth2/register(RequestEmailRegister) returns (response);
|
post /api/auth/oauth2/register(RequestEmailRegister) returns (response);
|
||||||
|
|
||||||
@handler UserResetTokenHandler
|
@handler UserResetTokenHandler
|
||||||
post /api/auth/reset/token(RequestUserResetToken) returns (response);
|
post /api/auth/reset/token(RequestUserResetToken) returns (response);
|
||||||
|
|
||||||
@handler UserResetPasswordHandler
|
@handler UserResetPasswordHandler
|
||||||
post /api/auth/reset/password(RequestUserResetPassword) returns (response);
|
post /api/auth/reset/password(RequestUserResetPassword) returns (response);
|
||||||
|
|
||||||
@handler DebugAuthDeleteHandler
|
@handler DebugAuthDeleteHandler
|
||||||
post /api/auth/debug/delete(RequestAuthDelete) returns (response);
|
post /api/auth/debug/delete(RequestAuthDelete) returns (response);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,8 @@ type (
|
||||||
|
|
||||||
// RequestUserResetToken 请求重置token, 一定不为null
|
// RequestUserResetToken 请求重置token, 一定不为null
|
||||||
RequestUserResetToken {
|
RequestUserResetToken {
|
||||||
Wid string `json:"wid"`
|
Wid string `json:"wid"`
|
||||||
|
Email string `json:"email"` // email
|
||||||
}
|
}
|
||||||
|
|
||||||
// UserResetTokenHandler 返回重置token
|
// UserResetTokenHandler 返回重置token
|
||||||
|
|
Loading…
Reference in New Issue
Block a user