增加api错误码并删除无用的接口
This commit is contained in:
parent
f150472dd3
commit
5623564c13
21
service/api/api_v1/common/apiReturn/ErrorCode.go
Normal file
21
service/api/api_v1/common/apiReturn/ErrorCode.go
Normal file
@ -0,0 +1,21 @@
|
||||
package apiReturn
|
||||
|
||||
var ErrorCodeMap = map[int]string{
|
||||
// -1:操作失败
|
||||
1000: "Not logged in yet", // 还未登录
|
||||
1003: "Incorrect username or password", // 用户名或密码错误
|
||||
1004: "Account disabled or not activated", // 账号已停用或未激活
|
||||
1005: "No current permission for operation", // 当前无权限操作
|
||||
1006: "Account does not exist", // 账号不存在
|
||||
|
||||
// 数据类
|
||||
1200: "Database error", // 数据库错误
|
||||
1201: "Please keep at least one", // 请至少保留一个
|
||||
1202: "No data record found", // 未找到数据记录
|
||||
|
||||
1300: "Upload failed", // 上传失败
|
||||
1301: "Unsupported file format", // 不被支持的格式文件
|
||||
|
||||
1400: "Parameter format error", // 参数格式错误
|
||||
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
package apiReturn
|
||||
|
||||
import (
|
||||
"sun-panel/api/api_v1/common/apiData/commonApiStructs"
|
||||
"sun-panel/global"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@ -17,8 +16,8 @@ const (
|
||||
|
||||
// 数据类
|
||||
|
||||
ERROR_CODE_DATA_DATABASE = 1110 // 错误码 数据类:数据库报错
|
||||
ERROR_CODE_DATA_RECORD_NOT_FOUND = 1111 // 错误码 数据类:数据记录未找到
|
||||
ERROR_CODE_DATA_DATABASE = 1200 // 错误码 数据类:数据库报错
|
||||
ERROR_CODE_DATA_RECORD_NOT_FOUND = 1202 // 错误码 数据类:数据记录未找到
|
||||
)
|
||||
|
||||
func ApiReturn(ctx *gin.Context, code int, msg string, data interface{}) {
|
||||
@ -60,22 +59,22 @@ func ListData(ctx *gin.Context, list interface{}, count int64) {
|
||||
}
|
||||
|
||||
// 返回错误 验证码相关错误错误
|
||||
func ErrorVerification(ctx *gin.Context, errCode int, codeID string) {
|
||||
msg := ""
|
||||
switch errCode {
|
||||
case ERROR_CODE_VERIFICATION_FAIL:
|
||||
msg = "验证失败,请重新验证"
|
||||
case ERROR_CODE_VERIFICATION_MUST:
|
||||
msg = "需要进一步验证"
|
||||
}
|
||||
ApiReturn(ctx, errCode, msg, gin.H{
|
||||
"verification": commonApiStructs.VerificationResponse{
|
||||
CodeID: codeID,
|
||||
Result: false,
|
||||
Message: msg,
|
||||
},
|
||||
})
|
||||
}
|
||||
// func ErrorVerification(ctx *gin.Context, errCode int, codeID string) {
|
||||
// msg := ""
|
||||
// switch errCode {
|
||||
// case ERROR_CODE_VERIFICATION_FAIL:
|
||||
// msg = "验证失败,请重新验证"
|
||||
// case ERROR_CODE_VERIFICATION_MUST:
|
||||
// msg = "需要进一步验证"
|
||||
// }
|
||||
// ApiReturn(ctx, errCode, msg, gin.H{
|
||||
// "verification": commonApiStructs.VerificationResponse{
|
||||
// CodeID: codeID,
|
||||
// Result: false,
|
||||
// Message: msg,
|
||||
// },
|
||||
// })
|
||||
// }
|
||||
|
||||
// 返回错误 需要个性化定义的错误|带返回数据的错误
|
||||
func ErrorCode(ctx *gin.Context, code int, errMsg string, data interface{}) {
|
||||
@ -100,13 +99,40 @@ func ErrorParamFomat(ctx *gin.Context, errMsg string) {
|
||||
|
||||
// // 返回错误 数据库
|
||||
func ErrorDatabase(ctx *gin.Context, errMsg string) {
|
||||
Error(ctx, global.Lang.GetAndInsert("common.db_error", "[", errMsg, "]"))
|
||||
// Error(ctx, global.Lang.GetAndInsert("common.db_error", "[", errMsg, "]"))
|
||||
ErrorByCodeAndMsg(ctx, 1202, errMsg)
|
||||
|
||||
}
|
||||
|
||||
// 返回错误 数据记录未找到
|
||||
func ErrorDataNotFound(ctx *gin.Context) {
|
||||
// ErrorCode(ctx,, global.Lang.GetAndInsert("common.db_error", "[", errMsg, "]"))
|
||||
ErrorCode(ctx, ERROR_CODE_DATA_RECORD_NOT_FOUND, "未找到数据记录", nil)
|
||||
// ErrorCode(ctx, ERROR_CODE_DATA_RECORD_NOT_FOUND, "未找到数据记录", nil)
|
||||
ErrorByCode(ctx, 1202)
|
||||
}
|
||||
|
||||
func ErrorByCode(ctx *gin.Context, code int) {
|
||||
msg := "Server error"
|
||||
if v, ok := GetErrorMsgByCode(code); ok {
|
||||
msg = v
|
||||
}
|
||||
ErrorCode(ctx, code, msg, nil)
|
||||
}
|
||||
|
||||
// 使用错误码的错误并附加错误信息
|
||||
func ErrorByCodeAndMsg(ctx *gin.Context, code int, msg string) {
|
||||
defalurMsg := "Server error"
|
||||
if v, ok := GetErrorMsgByCode(code); ok {
|
||||
msg = v
|
||||
}
|
||||
ErrorCode(ctx, code, defalurMsg+"["+msg+"]", nil)
|
||||
}
|
||||
|
||||
func GetErrorMsgByCode(code int) (string, bool) {
|
||||
if v, ok := ErrorCodeMap[code]; ok {
|
||||
return v, true
|
||||
} else {
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
|
||||
// 返回错误 需要个性化定义的错误|带返回数据的错误
|
||||
|
@ -18,7 +18,7 @@ func LoginInterceptor(c *gin.Context) {
|
||||
|
||||
// 没有token信息视为未登录
|
||||
if cToken == "" {
|
||||
apiReturn.ErrorCode(c, 1000, global.Lang.Get("login.err_not_login"), nil)
|
||||
apiReturn.ErrorByCode(c, 1000)
|
||||
c.Abort() // 终止执行后续的操作,一般配合return使用
|
||||
return
|
||||
}
|
||||
@ -29,7 +29,7 @@ func LoginInterceptor(c *gin.Context) {
|
||||
token, ok = global.CUserToken.Get(cToken)
|
||||
// 可能已经安全退出或者很久没有使用已过期
|
||||
if !ok || token == "" {
|
||||
apiReturn.ErrorCode(c, 1001, global.Lang.Get("login.err_not_login"), nil)
|
||||
apiReturn.ErrorByCode(c, 1001)
|
||||
c.Abort() // 终止执行后续的操作,一般配合return使用
|
||||
return
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package panel
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"sun-panel/api/api_v1/common/apiData/commonApiStructs"
|
||||
"sun-panel/api/api_v1/common/apiReturn"
|
||||
@ -74,8 +73,6 @@ func (a *ItemIconGroup) GetList(c *gin.Context) {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println("创建了默认分组", defaultGroup.ID)
|
||||
|
||||
groups = append(groups, defaultGroup)
|
||||
}
|
||||
|
||||
@ -106,7 +103,7 @@ func (a *ItemIconGroup) Deletes(c *gin.Context) {
|
||||
return
|
||||
} else {
|
||||
if math.Abs(float64(len(req.Ids))-float64(count)) < 1 {
|
||||
apiReturn.Error(c, "至少要保留一个")
|
||||
apiReturn.ErrorCode(c, 1201, "At least one must be retained", nil)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@ func (a *ItemIcon) Edit(c *gin.Context) {
|
||||
}
|
||||
|
||||
if req.ItemIconGroupId == 0 {
|
||||
apiReturn.Error(c, "分组为必填项")
|
||||
apiReturn.Error(c, "Group is mandatory")
|
||||
return
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ func (a *ItemIcon) AddMultiple(c *gin.Context) {
|
||||
|
||||
for i := 0; i < len(req); i++ {
|
||||
if req[i].ItemIconGroupId == 0 {
|
||||
apiReturn.Error(c, "分组为必填项")
|
||||
apiReturn.ErrorParamFomat(c, "Group is mandatory")
|
||||
return
|
||||
}
|
||||
req[i].UserId = userInfo.ID
|
||||
|
@ -36,14 +36,14 @@ func (a UsersApi) Create(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
param.Username = strings.Trim(param.Username, " ")
|
||||
param.Username = strings.TrimSpace(param.Username)
|
||||
if len(param.Username) < 5 {
|
||||
apiReturn.ErrorParamFomat(c, "账号不得少于5个字符")
|
||||
apiReturn.ErrorParamFomat(c, "The account must be no less than 5 characters long")
|
||||
return
|
||||
}
|
||||
|
||||
mUser := models.User{
|
||||
Username: strings.Trim(param.Username, " "),
|
||||
Username: strings.TrimSpace(param.Username),
|
||||
Password: cmn.PasswordEncryption(param.Password),
|
||||
Name: param.Name,
|
||||
HeadImage: param.HeadImage,
|
||||
@ -54,7 +54,8 @@ func (a UsersApi) Create(c *gin.Context) {
|
||||
|
||||
// 验证账号是否存在
|
||||
if _, err := mUser.CheckUsernameExist(param.Username); err != nil {
|
||||
apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
apiReturn.ErrorByCode(c, 1006)
|
||||
// apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
return
|
||||
}
|
||||
|
||||
@ -74,22 +75,11 @@ func (a UsersApi) Deletes(c *gin.Context) {
|
||||
}
|
||||
param := UserIds{}
|
||||
if err := c.ShouldBindBodyWith(¶m, binding.JSON); err != nil {
|
||||
apiReturn.Error(c, global.Lang.GetAndInsert("common.api_error_param_format", "[", err.Error(), "]"))
|
||||
apiReturn.ErrorParamFomat(c, err.Error())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
|
||||
// var count int64
|
||||
// if err := global.Db.Model(&models.User{}).Count(&count).Error; err != nil {
|
||||
// apiReturn.ErrorDatabase(c, err.Error())
|
||||
// return
|
||||
// } else {
|
||||
// if math.Abs(float64(len(param.UserIds))-float64(count)) < 1 {
|
||||
// apiReturn.Error(c, "至少要保留一个")
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
|
||||
txErr := global.Db.Transaction(func(tx *gorm.DB) error {
|
||||
mitemIconGroup := models.ItemIconGroup{}
|
||||
|
||||
@ -132,7 +122,7 @@ func (a UsersApi) Deletes(c *gin.Context) {
|
||||
return nil
|
||||
})
|
||||
if txErr == ErrUsersApiAtLeastKeepOne {
|
||||
apiReturn.Error(c, "至少要保留一个平台管理")
|
||||
apiReturn.ErrorByCode(c, 1201)
|
||||
return
|
||||
} else if txErr != nil {
|
||||
apiReturn.ErrorDatabase(c, txErr.Error())
|
||||
@ -145,7 +135,7 @@ func (a UsersApi) Deletes(c *gin.Context) {
|
||||
func (a UsersApi) Update(c *gin.Context) {
|
||||
param := models.User{}
|
||||
if err := c.ShouldBindBodyWith(¶m, binding.JSON); err != nil {
|
||||
apiReturn.Error(c, global.Lang.GetAndInsert("common.api_error_param_format", "[", err.Error(), "]"))
|
||||
apiReturn.ErrorParamFomat(c, err.Error())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
@ -161,8 +151,9 @@ func (a UsersApi) Update(c *gin.Context) {
|
||||
}
|
||||
|
||||
param.Username = strings.Trim(param.Username, " ")
|
||||
if len(param.Username) < 5 {
|
||||
apiReturn.ErrorParamFomat(c, "账号不得少于5个字符")
|
||||
if len(param.Username) < 3 {
|
||||
// 账号不得少于3个字符
|
||||
apiReturn.ErrorParamFomat(c, "The account must be no less than 3 characters long")
|
||||
return
|
||||
}
|
||||
|
||||
@ -181,7 +172,8 @@ func (a UsersApi) Update(c *gin.Context) {
|
||||
if user, err := mUser.CheckUsernameExist(param.Username); err != nil {
|
||||
userInfo = user
|
||||
if user.ID != param.ID {
|
||||
apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
apiReturn.ErrorByCode(c, 1006)
|
||||
// apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
@ -210,7 +202,7 @@ func (a UsersApi) GetList(c *gin.Context) {
|
||||
|
||||
param := ParamsStruct{}
|
||||
if err := c.ShouldBindBodyWith(¶m, binding.JSON); err != nil {
|
||||
apiReturn.Error(c, global.Lang.GetAndInsert("common.api_error_param_format", "[", err.Error(), "]"))
|
||||
apiReturn.ErrorParamFomat(c, err.Error())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
|
@ -5,8 +5,6 @@ type ApiSystem struct {
|
||||
LoginApi LoginApi
|
||||
UserApi UserApi
|
||||
FileApi FileApi
|
||||
CaptchaApi CaptchaApi
|
||||
RegisterApi RegisterApi
|
||||
NoticeApi NoticeApi
|
||||
ModuleConfigApi ModuleConfigApi
|
||||
MonitorApi MonitorApi
|
||||
|
@ -1,63 +0,0 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"strconv"
|
||||
"sun-panel/lib/captcha"
|
||||
"sun-panel/lib/cmn"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type CaptchaApi struct {
|
||||
ErrMsg string // 错误信息
|
||||
}
|
||||
|
||||
// 获取图像
|
||||
func (c *CaptchaApi) GetImage(ctx *gin.Context) {
|
||||
key := cmn.BuildRandCode(16, cmn.RAND_CODE_MODE2)
|
||||
width, _ := strconv.Atoi(ctx.Param("width"))
|
||||
height, _ := strconv.Atoi(ctx.Param("height"))
|
||||
if width == 0 || width > 500 {
|
||||
width = 120
|
||||
}
|
||||
if height == 0 || height > 500 {
|
||||
height = 44
|
||||
}
|
||||
// 设置网页验证码的cookie
|
||||
ctx.SetCookie("CaptchaId", key, 3600, "/", "", false, false)
|
||||
base64Str := captcha.GenerateCaptchaHandler(key, width, height)
|
||||
_ = base64Str
|
||||
// base64 字符串一般会包含头部 data:image/xxx;base64, 需要去除
|
||||
baseImg, _ := base64.StdEncoding.DecodeString(base64Str[22:])
|
||||
_, _ = ctx.Writer.WriteString(string(baseImg))
|
||||
}
|
||||
|
||||
// 获取图像根据验证器id,id从地址栏获取
|
||||
func (c *CaptchaApi) GetImageByCaptchaId(ctx *gin.Context) {
|
||||
// key := cmn.BuildRandCode(16, cmn.RAND_CODE_MODE2)
|
||||
width, _ := strconv.Atoi(ctx.Param("width"))
|
||||
height, _ := strconv.Atoi(ctx.Param("height"))
|
||||
captchaId := ctx.Param("captchaId")
|
||||
if width == 0 || width > 500 {
|
||||
width = 120
|
||||
}
|
||||
if height == 0 || height > 500 {
|
||||
height = 44
|
||||
}
|
||||
// 设置网页验证码的cookie
|
||||
base64Str := captcha.GenerateCaptchaHandler(captchaId, width, height)
|
||||
_ = base64Str
|
||||
// base64 字符串一般会包含头部 data:image/xxx;base64, 需要去除
|
||||
baseImg, _ := base64.StdEncoding.DecodeString(base64Str[22:])
|
||||
_, _ = ctx.Writer.WriteString(string(baseImg))
|
||||
}
|
||||
|
||||
func (c *CaptchaApi) CheckVCode(id, vcode string) {
|
||||
// Captcha.Store = base64Captcha.DefaultMemStore
|
||||
// if store.Verify(id, vcode, true) {
|
||||
// body = map[string]interface{}{"code": 1001, "msg": "ok"}
|
||||
// }
|
||||
// w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||
// json.NewEncoder(w).Encode(body)
|
||||
}
|
@ -25,7 +25,7 @@ func (a *FileApi) UploadImg(c *gin.Context) {
|
||||
configUpload := global.Config.GetValueString("base", "source_path")
|
||||
f, err := c.FormFile("imgfile")
|
||||
if err != nil {
|
||||
apiReturn.Error(c, "上传失败")
|
||||
apiReturn.ErrorByCode(c, 1300)
|
||||
return
|
||||
} else {
|
||||
fileExt := strings.ToLower(path.Ext(f.Filename))
|
||||
@ -40,7 +40,7 @@ func (a *FileApi) UploadImg(c *gin.Context) {
|
||||
}
|
||||
|
||||
if !cmn.InArray(agreeExts, fileExt) {
|
||||
apiReturn.Error(c, "上传失败!只允许png,jpg,gif,jpeg,svg,ico文件")
|
||||
apiReturn.ErrorByCode(c, 1301)
|
||||
return
|
||||
}
|
||||
fileName := cmn.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String()))
|
||||
@ -67,7 +67,7 @@ func (a *FileApi) UploadFiles(c *gin.Context) {
|
||||
|
||||
form, err := c.MultipartForm()
|
||||
if err != nil {
|
||||
apiReturn.Error(c, "上传失败")
|
||||
apiReturn.ErrorByCode(c, 1300)
|
||||
return
|
||||
}
|
||||
files := form.File["files[]"]
|
||||
|
@ -3,15 +3,12 @@ package system
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sun-panel/api/api_v1/common/apiData/commonApiStructs"
|
||||
"sun-panel/api/api_v1/common/apiReturn"
|
||||
"sun-panel/api/api_v1/common/base"
|
||||
"sun-panel/global"
|
||||
"sun-panel/lib/cmn"
|
||||
"sun-panel/lib/cmn/systemSetting"
|
||||
"sun-panel/lib/mail"
|
||||
"sun-panel/models"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
@ -114,87 +111,3 @@ func (l *LoginApi) Logout(c *gin.Context) {
|
||||
global.CUserToken.Delete(cToken)
|
||||
apiReturn.Success(c)
|
||||
}
|
||||
|
||||
// 获取重置密码的验证码
|
||||
func (l *LoginApi) SendResetPasswordVCode(c *gin.Context) {
|
||||
type ResstRequest struct {
|
||||
LoginLoginVerify
|
||||
Verification commonApiStructs.VerificationRequest `json:"verification"`
|
||||
}
|
||||
req := ResstRequest{}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
apiReturn.Error(c, global.Lang.Get("common.api_error_param_format"))
|
||||
return
|
||||
}
|
||||
|
||||
// 验证码验证
|
||||
{
|
||||
errCode, verifcationId := base.VerificationCheck(req.Verification.CodeID, req.Verification.VCode)
|
||||
if errCode != apiReturn.ERROR_CODE_SUCCESS {
|
||||
apiReturn.ErrorVerification(c, errCode, verifcationId)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
emailVCode := cmn.BuildRandCode(6, cmn.RAND_CODE_MODE2)
|
||||
global.VerifyCodeCachePool.Set(req.Email, emailVCode, 10*time.Minute)
|
||||
|
||||
userCheck := &models.User{Mail: req.Email}
|
||||
userInfo := userCheck.GetUserInfoByMail()
|
||||
if userInfo == nil {
|
||||
apiReturn.Error(c, "账号不存在")
|
||||
return
|
||||
}
|
||||
emailInfoConfig := systemSetting.Email{}
|
||||
global.SystemSetting.GetValueByInterface("system_email", &emailInfoConfig)
|
||||
emailInfo := mail.EmailInfo{
|
||||
Username: emailInfoConfig.Mail,
|
||||
Password: emailInfoConfig.Password,
|
||||
Host: emailInfoConfig.Host,
|
||||
Port: emailInfoConfig.Port,
|
||||
}
|
||||
if err := mail.SendResetPasswordVCode(mail.NewEmailer(emailInfo), req.Email, emailVCode); err != nil {
|
||||
apiReturn.Error(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
apiReturn.Success(c)
|
||||
|
||||
}
|
||||
|
||||
// 使用邮箱验证码重置密码
|
||||
func (l *LoginApi) ResetPasswordByVCode(c *gin.Context) {
|
||||
req := registerInfo{}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
apiReturn.Error(c, global.Lang.Get("common.api_error_param_format"))
|
||||
return
|
||||
}
|
||||
|
||||
userCheck := &models.User{Mail: req.Email}
|
||||
userInfo := userCheck.GetUserInfoByMail()
|
||||
if userInfo == nil {
|
||||
apiReturn.Error(c, "账号不存在")
|
||||
return
|
||||
}
|
||||
|
||||
// 校验验证码
|
||||
{
|
||||
if emailVCode, ok := global.VerifyCodeCachePool.Get(req.Email); !ok || req.EmailVCode != emailVCode {
|
||||
apiReturn.Error(c, global.Lang.Get("common.captcha_code_error"))
|
||||
return
|
||||
}
|
||||
global.VerifyCodeCachePool.Delete(req.Email)
|
||||
}
|
||||
|
||||
updateData := map[string]interface{}{
|
||||
"password": cmn.PasswordEncryption(req.Password),
|
||||
"token": "",
|
||||
}
|
||||
global.UserToken.Delete(userInfo.Token) // 更新用户信息
|
||||
if err := userInfo.UpdateUserInfoByUserId(userInfo.ID, updateData); err != nil {
|
||||
apiReturn.ErrorDatabase(c, err.Error())
|
||||
return
|
||||
}
|
||||
apiReturn.Success(c)
|
||||
|
||||
}
|
||||
|
@ -1,183 +0,0 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sun-panel/api/api_v1/common/apiData/commonApiStructs"
|
||||
"sun-panel/api/api_v1/common/apiReturn"
|
||||
"sun-panel/api/api_v1/common/base"
|
||||
"sun-panel/global"
|
||||
"sun-panel/lib/cmn"
|
||||
"sun-panel/lib/cmn/systemSetting"
|
||||
"sun-panel/lib/mail"
|
||||
"sun-panel/models"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type registerInfo struct {
|
||||
Email string `json:"email"`
|
||||
UserName string `json:"userName"`
|
||||
Password string `json:"password"`
|
||||
Vcode string `json:"vcode"`
|
||||
EmailVCode string `json:"emailVCode"`
|
||||
VCode string `json:"vCode"`
|
||||
Verification commonApiStructs.VerificationRequest `json:"verification"`
|
||||
ReferralCode string `json:"referralCode"`
|
||||
}
|
||||
|
||||
const EmailCodeCapacity = 1000
|
||||
|
||||
type RegisterApi struct{}
|
||||
|
||||
// 获取注册验证码
|
||||
func (l RegisterApi) SendRegisterVcode(c *gin.Context) {
|
||||
req := registerInfo{}
|
||||
err := c.ShouldBindJSON(&req)
|
||||
req.Email = req.UserName
|
||||
if err != nil {
|
||||
apiReturn.ErrorParamFomat(c, err.Error())
|
||||
return
|
||||
}
|
||||
errMsg, err := base.ValidateInputStruct(req)
|
||||
if err != nil {
|
||||
apiReturn.Error(c, errMsg)
|
||||
return
|
||||
}
|
||||
|
||||
// 验证码验证
|
||||
{
|
||||
errCode, verifcationId := base.VerificationCheck(req.Verification.CodeID, req.Verification.VCode)
|
||||
if errCode != apiReturn.ERROR_CODE_SUCCESS {
|
||||
apiReturn.ErrorVerification(c, errCode, verifcationId)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 验证是否开启注册和后缀格式是否正确
|
||||
{
|
||||
systemSettingInfo := systemSetting.ApplicationSetting{}
|
||||
if err := global.SystemSetting.GetValueByInterface("system_application", &systemSettingInfo); err != nil || !systemSettingInfo.Register.OpenRegister {
|
||||
apiReturn.Error(c, global.Lang.Get("register.unopened_register"))
|
||||
return
|
||||
}
|
||||
|
||||
if systemSettingInfo.Register.EmailSuffix != "" && !cmn.VerifyFormat("^.*"+systemSettingInfo.Register.EmailSuffix+"$", req.Email) {
|
||||
apiReturn.Error(c, global.Lang.GetWithFields("register.emailSuffix_error", map[string]string{"EmailSuffix": systemSettingInfo.Register.EmailSuffix}))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 验证邮箱是否被注册
|
||||
{
|
||||
userCheck := &models.User{Mail: req.UserName}
|
||||
if _, err := userCheck.GetUserInfoByUsername(req.UserName); err == nil && err != gorm.ErrRecordNotFound {
|
||||
apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
emailCode := generateEmailCode()
|
||||
count, err := global.VerifyCodeCachePool.ItemCount()
|
||||
if err != nil || count >= EmailCodeCapacity {
|
||||
global.VerifyCodeCachePool.Flush()
|
||||
}
|
||||
global.VerifyCodeCachePool.Set(req.Email, emailCode, 0)
|
||||
emailInfoConfig := systemSetting.Email{}
|
||||
global.SystemSetting.GetValueByInterface("system_email", &emailInfoConfig)
|
||||
emailInfo := mail.EmailInfo{
|
||||
Username: emailInfoConfig.Mail,
|
||||
Password: emailInfoConfig.Password,
|
||||
Host: emailInfoConfig.Host,
|
||||
Port: emailInfoConfig.Port,
|
||||
}
|
||||
err = mail.SendRegisterEmail(mail.NewEmailer(emailInfo), req.Email, emailCode)
|
||||
if err != nil {
|
||||
apiReturn.Error(c, global.Lang.Get("mail.send_mail_fail"))
|
||||
global.Logger.Errorf("[register] fail to send email to%s", req.UserName)
|
||||
return
|
||||
}
|
||||
apiReturn.Success(c)
|
||||
}
|
||||
|
||||
// 注册提交(开始注册)
|
||||
func (l *RegisterApi) Commit(c *gin.Context) {
|
||||
req := registerInfo{}
|
||||
err := c.ShouldBindJSON(&req)
|
||||
req.Email = req.UserName
|
||||
if err != nil {
|
||||
apiReturn.ErrorParamFomat(c, err.Error())
|
||||
return
|
||||
}
|
||||
errMsg, err := base.ValidateInputStruct(req)
|
||||
if err != nil {
|
||||
apiReturn.Error(c, errMsg)
|
||||
return
|
||||
}
|
||||
|
||||
// 验证是否开启注册和后缀格式是否正确
|
||||
{
|
||||
systemSettingInfo := systemSetting.ApplicationSetting{}
|
||||
if err := global.SystemSetting.GetValueByInterface("system_application", &systemSettingInfo); err != nil || !systemSettingInfo.Register.OpenRegister {
|
||||
apiReturn.Error(c, global.Lang.Get("register.unopened_register"))
|
||||
return
|
||||
}
|
||||
|
||||
if systemSettingInfo.Register.EmailSuffix != "" && !cmn.VerifyFormat("^.*"+systemSettingInfo.Register.EmailSuffix+"$", req.Email) {
|
||||
apiReturn.Error(c, global.Lang.GetWithFields("register.emailSuffix_error", map[string]string{"EmailSuffix": systemSettingInfo.Register.EmailSuffix}))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 验证邮箱是否被注册
|
||||
{
|
||||
userCheck := &models.User{Mail: req.UserName}
|
||||
if _, err := userCheck.GetUserInfoByUsername(req.UserName); err == nil && err != gorm.ErrRecordNotFound {
|
||||
apiReturn.Error(c, global.Lang.Get("register.mail_exist"))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 验证码验证
|
||||
{
|
||||
vCode, ok := global.VerifyCodeCachePool.Get(req.Email)
|
||||
if !ok {
|
||||
apiReturn.Error(c, global.Lang.Get("common.captcha_code_error"))
|
||||
//验证码不存在
|
||||
return
|
||||
}
|
||||
if vCode != req.EmailVCode {
|
||||
apiReturn.Error(c, global.Lang.Get("common.captcha_code_error"))
|
||||
return
|
||||
//验证码有误
|
||||
}
|
||||
}
|
||||
|
||||
// 自动生成用户昵称
|
||||
name := "用户" + cmn.BuildRandCode(4, cmn.RAND_CODE_MODE3)
|
||||
|
||||
//验证通过,注册
|
||||
user := &models.User{
|
||||
Mail: req.UserName,
|
||||
Name: name,
|
||||
Username: req.UserName,
|
||||
Password: cmn.PasswordEncryption(req.Password),
|
||||
Status: 1,
|
||||
Role: 2,
|
||||
}
|
||||
_, err = user.CreateOne()
|
||||
if err != nil {
|
||||
apiReturn.ErrorDatabase(c, err.Error())
|
||||
return
|
||||
}
|
||||
//删除旧的验证码
|
||||
global.VerifyCodeCachePool.Delete(req.Email)
|
||||
|
||||
apiReturn.Success(c)
|
||||
}
|
||||
|
||||
func generateEmailCode() string {
|
||||
return fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
|
||||
}
|
@ -7,8 +7,6 @@ func Init(routerGroup *gin.RouterGroup) {
|
||||
InitLogin(routerGroup)
|
||||
InitUserRouter(routerGroup)
|
||||
InitFileRouter(routerGroup)
|
||||
InitCaptchaRouter(routerGroup)
|
||||
InitRegister(routerGroup)
|
||||
InitNoticeRouter(routerGroup)
|
||||
InitModuleConfigRouter(routerGroup)
|
||||
InitMonitorRouter(routerGroup)
|
||||
|
@ -1,17 +0,0 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"sun-panel/api/api_v1"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func InitCaptchaRouter(router *gin.RouterGroup) {
|
||||
captchaApi := api_v1.ApiGroupApp.ApiSystem.CaptchaApi
|
||||
r := router.Group("captcha")
|
||||
r.GET("getImage", captchaApi.GetImage)
|
||||
r.GET("getImage/:width/:height", captchaApi.GetImage)
|
||||
r.GET("getImageByCaptchaId/:captchaId", captchaApi.GetImageByCaptchaId)
|
||||
r.GET("getImageByCaptchaId/:captchaId/:width/:height", captchaApi.GetImageByCaptchaId)
|
||||
// r.POST("/captach/check", captchaApi.CheckVCode)
|
||||
}
|
@ -12,7 +12,5 @@ func InitLogin(router *gin.RouterGroup) {
|
||||
|
||||
router.POST("/login", loginApi.Login)
|
||||
router.POST("/logout", middleware.LoginInterceptor, loginApi.Logout)
|
||||
router.POST("/login/sendResetPasswordVCode", loginApi.SendResetPasswordVCode)
|
||||
router.POST("/login/resetPasswordByVCode", loginApi.ResetPasswordByVCode)
|
||||
|
||||
}
|
||||
|
@ -1,14 +0,0 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"sun-panel/api/api_v1"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func InitRegister(router *gin.RouterGroup) {
|
||||
api := api_v1.ApiGroupApp.ApiSystem.RegisterApi
|
||||
|
||||
router.POST("/register/sendRegisterVcode", api.SendRegisterVcode)
|
||||
router.POST("/register/commit", api.Commit)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user