1
This commit is contained in:
		
							
								
								
									
										191
									
								
								app/admin/apis/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								app/admin/apis/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,191 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  |     "fmt" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" | ||||||
|  | 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type LineUserSetting struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取用户资产、配置表列表 | ||||||
|  | // @Summary 获取用户资产、配置表列表 | ||||||
|  | // @Description 获取用户资产、配置表列表 | ||||||
|  | // @Tags 用户资产、配置表 | ||||||
|  | // @Param pageSize query int false "页条数" | ||||||
|  | // @Param pageIndex query int false "页码" | ||||||
|  | // @Success 200 {object} response.Response{data=response.Page{list=[]models.LineUserSetting}} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/line-user-setting [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e LineUserSetting) GetPage(c *gin.Context) { | ||||||
|  |     req := dto.LineUserSettingGetPageReq{} | ||||||
|  |     s := service.LineUserSetting{} | ||||||
|  |     err := e.MakeContext(c). | ||||||
|  |         MakeOrm(). | ||||||
|  |         Bind(&req). | ||||||
|  |         MakeService(&s.Service). | ||||||
|  |         Errors | ||||||
|  |    	if err != nil { | ||||||
|  |    		e.Logger.Error(err) | ||||||
|  |    		e.Error(500, err, err.Error()) | ||||||
|  |    		return | ||||||
|  |    	} | ||||||
|  |  | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	list := make([]models.LineUserSetting, 0) | ||||||
|  | 	var count int64 | ||||||
|  |  | ||||||
|  | 	err = s.GetPage(&req, p, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("获取用户资产、配置表失败,\r\n失败信息 %s", err.Error())) | ||||||
|  |         return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取用户资产、配置表 | ||||||
|  | // @Summary 获取用户资产、配置表 | ||||||
|  | // @Description 获取用户资产、配置表 | ||||||
|  | // @Tags 用户资产、配置表 | ||||||
|  | // @Param id path int false "id" | ||||||
|  | // @Success 200 {object} response.Response{data=models.LineUserSetting} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/line-user-setting/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e LineUserSetting) Get(c *gin.Context) { | ||||||
|  | 	req := dto.LineUserSettingGetReq{} | ||||||
|  | 	s := service.LineUserSetting{} | ||||||
|  |     err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.LineUserSetting | ||||||
|  |  | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	err = s.Get(&req, p, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("获取用户资产、配置表失败,\r\n失败信息 %s", err.Error())) | ||||||
|  |         return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK( object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建用户资产、配置表 | ||||||
|  | // @Summary 创建用户资产、配置表 | ||||||
|  | // @Description 创建用户资产、配置表 | ||||||
|  | // @Tags 用户资产、配置表 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.LineUserSettingInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "添加成功"}" | ||||||
|  | // @Router /api/v1/line-user-setting [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e LineUserSetting) Insert(c *gin.Context) { | ||||||
|  |     req := dto.LineUserSettingInsertReq{} | ||||||
|  |     s := service.LineUserSetting{} | ||||||
|  |     err := e.MakeContext(c). | ||||||
|  |         MakeOrm(). | ||||||
|  |         Bind(&req). | ||||||
|  |         MakeService(&s.Service). | ||||||
|  |         Errors | ||||||
|  |     if err != nil { | ||||||
|  |         e.Logger.Error(err) | ||||||
|  |         e.Error(500, err, err.Error()) | ||||||
|  |         return | ||||||
|  |     } | ||||||
|  | 	// 设置创建人 | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("创建用户资产、配置表失败,\r\n失败信息 %s", err.Error())) | ||||||
|  |         return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改用户资产、配置表 | ||||||
|  | // @Summary 修改用户资产、配置表 | ||||||
|  | // @Description 修改用户资产、配置表 | ||||||
|  | // @Tags 用户资产、配置表 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param id path int true "id" | ||||||
|  | // @Param data body dto.LineUserSettingUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/line-user-setting/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e LineUserSetting) Update(c *gin.Context) { | ||||||
|  |     req := dto.LineUserSettingUpdateReq{} | ||||||
|  |     s := service.LineUserSetting{} | ||||||
|  |     err := e.MakeContext(c). | ||||||
|  |         MakeOrm(). | ||||||
|  |         Bind(&req). | ||||||
|  |         MakeService(&s.Service). | ||||||
|  |         Errors | ||||||
|  |     if err != nil { | ||||||
|  |         e.Logger.Error(err) | ||||||
|  |         e.Error(500, err, err.Error()) | ||||||
|  |         return | ||||||
|  |     } | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.Update(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("修改用户资产、配置表失败,\r\n失败信息 %s", err.Error())) | ||||||
|  |         return | ||||||
|  | 	} | ||||||
|  | 	e.OK( req.GetId(), "修改成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete 删除用户资产、配置表 | ||||||
|  | // @Summary 删除用户资产、配置表 | ||||||
|  | // @Description 删除用户资产、配置表 | ||||||
|  | // @Tags 用户资产、配置表 | ||||||
|  | // @Param data body dto.LineUserSettingDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Router /api/v1/line-user-setting [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e LineUserSetting) Delete(c *gin.Context) { | ||||||
|  |     s := service.LineUserSetting{} | ||||||
|  |     req := dto.LineUserSettingDeleteReq{} | ||||||
|  |     err := e.MakeContext(c). | ||||||
|  |         MakeOrm(). | ||||||
|  |         Bind(&req). | ||||||
|  |         MakeService(&s.Service). | ||||||
|  |         Errors | ||||||
|  |     if err != nil { | ||||||
|  |         e.Logger.Error(err) | ||||||
|  |         e.Error(500, err, err.Error()) | ||||||
|  |         return | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | 	// req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.Remove(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("删除用户资产、配置表失败,\r\n失败信息 %s", err.Error())) | ||||||
|  |         return | ||||||
|  | 	} | ||||||
|  | 	e.OK( req.GetId(), "删除成功") | ||||||
|  | } | ||||||
| @ -1,9 +1,10 @@ | |||||||
| package apis | package apis | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|     "fmt" | 	"fmt" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" | 	"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" | ||||||
| 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | ||||||
| @ -28,18 +29,18 @@ type MemberRenwaLog struct { | |||||||
| // @Router /api/v1/member-renwa-log [get] | // @Router /api/v1/member-renwa-log [get] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwaLog) GetPage(c *gin.Context) { | func (e MemberRenwaLog) GetPage(c *gin.Context) { | ||||||
|     req := dto.MemberRenwaLogGetPageReq{} | 	req := dto.MemberRenwaLogGetPageReq{} | ||||||
|     s := service.MemberRenwaLog{} | 	s := service.MemberRenwaLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req, binding.Form, binding.Query). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|    	if err != nil { | 	if err != nil { | ||||||
|    		e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|    		e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|    		return | 		return | ||||||
|    	} | 	} | ||||||
|  |  | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| 	list := make([]models.MemberRenwaLog, 0) | 	list := make([]models.MemberRenwaLog, 0) | ||||||
| @ -48,7 +49,7 @@ func (e MemberRenwaLog) GetPage(c *gin.Context) { | |||||||
| 	err = s.GetPage(&req, p, &list, &count) | 	err = s.GetPage(&req, p, &list, &count) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取会员续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取会员续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
| @ -65,7 +66,7 @@ func (e MemberRenwaLog) GetPage(c *gin.Context) { | |||||||
| func (e MemberRenwaLog) Get(c *gin.Context) { | func (e MemberRenwaLog) Get(c *gin.Context) { | ||||||
| 	req := dto.MemberRenwaLogGetReq{} | 	req := dto.MemberRenwaLogGetReq{} | ||||||
| 	s := service.MemberRenwaLog{} | 	s := service.MemberRenwaLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		Bind(&req). | 		Bind(&req). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
| @ -81,10 +82,10 @@ func (e MemberRenwaLog) Get(c *gin.Context) { | |||||||
| 	err = s.Get(&req, p, &object) | 	err = s.Get(&req, p, &object) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取会员续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取会员续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK( object, "查询成功") | 	e.OK(object, "查询成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Insert 创建会员续期记录 | // Insert 创建会员续期记录 | ||||||
| @ -98,25 +99,25 @@ func (e MemberRenwaLog) Get(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwa-log [post] | // @Router /api/v1/member-renwa-log [post] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwaLog) Insert(c *gin.Context) { | func (e MemberRenwaLog) Insert(c *gin.Context) { | ||||||
|     req := dto.MemberRenwaLogInsertReq{} | 	req := dto.MemberRenwaLogInsertReq{} | ||||||
|     s := service.MemberRenwaLog{} | 	s := service.MemberRenwaLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
| 	// 设置创建人 | 	// 设置创建人 | ||||||
| 	req.SetCreateBy(user.GetUserId(c)) | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
| 	err = s.Insert(&req) | 	err = s.Insert(&req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("创建会员续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("创建会员续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK(req.GetId(), "创建成功") | 	e.OK(req.GetId(), "创建成功") | ||||||
| @ -134,27 +135,27 @@ func (e MemberRenwaLog) Insert(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwa-log/{id} [put] | // @Router /api/v1/member-renwa-log/{id} [put] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwaLog) Update(c *gin.Context) { | func (e MemberRenwaLog) Update(c *gin.Context) { | ||||||
|     req := dto.MemberRenwaLogUpdateReq{} | 	req := dto.MemberRenwaLogUpdateReq{} | ||||||
|     s := service.MemberRenwaLog{} | 	s := service.MemberRenwaLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
| 	req.SetUpdateBy(user.GetUserId(c)) | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
| 	err = s.Update(&req, p) | 	err = s.Update(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("修改会员续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("修改会员续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "修改成功") | 	e.OK(req.GetId(), "修改成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete 删除会员续期记录 | // Delete 删除会员续期记录 | ||||||
| @ -166,18 +167,18 @@ func (e MemberRenwaLog) Update(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwa-log [delete] | // @Router /api/v1/member-renwa-log [delete] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwaLog) Delete(c *gin.Context) { | func (e MemberRenwaLog) Delete(c *gin.Context) { | ||||||
|     s := service.MemberRenwaLog{} | 	s := service.MemberRenwaLog{} | ||||||
|     req := dto.MemberRenwaLogDeleteReq{} | 	req := dto.MemberRenwaLogDeleteReq{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
|  |  | ||||||
| 	// req.SetUpdateBy(user.GetUserId(c)) | 	// req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| @ -185,7 +186,7 @@ func (e MemberRenwaLog) Delete(c *gin.Context) { | |||||||
| 	err = s.Remove(&req, p) | 	err = s.Remove(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("删除会员续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("删除会员续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "删除成功") | 	e.OK(req.GetId(), "删除成功") | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package apis | package apis | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|     "fmt" | 	"fmt" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| @ -30,18 +30,18 @@ type MemberRenwalConfig struct { | |||||||
| // @Router /api/v1/member-renwal-config [get] | // @Router /api/v1/member-renwal-config [get] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwalConfig) GetPage(c *gin.Context) { | func (e MemberRenwalConfig) GetPage(c *gin.Context) { | ||||||
|     req := dto.MemberRenwalConfigGetPageReq{} | 	req := dto.MemberRenwalConfigGetPageReq{} | ||||||
|     s := service.MemberRenwalConfig{} | 	s := service.MemberRenwalConfig{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|    	if err != nil { | 	if err != nil { | ||||||
|    		e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|    		e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|    		return | 		return | ||||||
|    	} | 	} | ||||||
|  |  | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| 	list := make([]models.MemberRenwalConfig, 0) | 	list := make([]models.MemberRenwalConfig, 0) | ||||||
| @ -50,7 +50,7 @@ func (e MemberRenwalConfig) GetPage(c *gin.Context) { | |||||||
| 	err = s.GetPage(&req, p, &list, &count) | 	err = s.GetPage(&req, p, &list, &count) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取会员套餐管理失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取会员套餐管理失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
| @ -67,7 +67,7 @@ func (e MemberRenwalConfig) GetPage(c *gin.Context) { | |||||||
| func (e MemberRenwalConfig) Get(c *gin.Context) { | func (e MemberRenwalConfig) Get(c *gin.Context) { | ||||||
| 	req := dto.MemberRenwalConfigGetReq{} | 	req := dto.MemberRenwalConfigGetReq{} | ||||||
| 	s := service.MemberRenwalConfig{} | 	s := service.MemberRenwalConfig{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		Bind(&req). | 		Bind(&req). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
| @ -83,10 +83,10 @@ func (e MemberRenwalConfig) Get(c *gin.Context) { | |||||||
| 	err = s.Get(&req, p, &object) | 	err = s.Get(&req, p, &object) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取会员套餐管理失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取会员套餐管理失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK( object, "查询成功") | 	e.OK(object, "查询成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Insert 创建会员套餐管理 | // Insert 创建会员套餐管理 | ||||||
| @ -100,25 +100,31 @@ func (e MemberRenwalConfig) Get(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwal-config [post] | // @Router /api/v1/member-renwal-config [post] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwalConfig) Insert(c *gin.Context) { | func (e MemberRenwalConfig) Insert(c *gin.Context) { | ||||||
|     req := dto.MemberRenwalConfigInsertReq{} | 	req := dto.MemberRenwalConfigInsertReq{} | ||||||
|     s := service.MemberRenwalConfig{} | 	s := service.MemberRenwalConfig{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
|  |  | ||||||
|  | 	if err := req.Valid(); err != nil { | ||||||
|  | 		e.Error(500, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// 设置创建人 | 	// 设置创建人 | ||||||
| 	req.SetCreateBy(user.GetUserId(c)) | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
| 	err = s.Insert(&req) | 	err = s.Insert(&req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("创建会员套餐管理失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("创建会员套餐管理失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK(req.GetId(), "创建成功") | 	e.OK(req.GetId(), "创建成功") | ||||||
| @ -136,27 +142,33 @@ func (e MemberRenwalConfig) Insert(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwal-config/{id} [put] | // @Router /api/v1/member-renwal-config/{id} [put] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwalConfig) Update(c *gin.Context) { | func (e MemberRenwalConfig) Update(c *gin.Context) { | ||||||
|     req := dto.MemberRenwalConfigUpdateReq{} | 	req := dto.MemberRenwalConfigUpdateReq{} | ||||||
|     s := service.MemberRenwalConfig{} | 	s := service.MemberRenwalConfig{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
|  |  | ||||||
|  | 	if err := req.Valid(); err != nil { | ||||||
|  | 		e.Error(500, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	req.SetUpdateBy(user.GetUserId(c)) | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
| 	err = s.Update(&req, p) | 	err = s.Update(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("修改会员套餐管理失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("修改会员套餐管理失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "修改成功") | 	e.OK(req.GetId(), "修改成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete 删除会员套餐管理 | // Delete 删除会员套餐管理 | ||||||
| @ -168,18 +180,18 @@ func (e MemberRenwalConfig) Update(c *gin.Context) { | |||||||
| // @Router /api/v1/member-renwal-config [delete] | // @Router /api/v1/member-renwal-config [delete] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e MemberRenwalConfig) Delete(c *gin.Context) { | func (e MemberRenwalConfig) Delete(c *gin.Context) { | ||||||
|     s := service.MemberRenwalConfig{} | 	s := service.MemberRenwalConfig{} | ||||||
|     req := dto.MemberRenwalConfigDeleteReq{} | 	req := dto.MemberRenwalConfigDeleteReq{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
|  |  | ||||||
| 	// req.SetUpdateBy(user.GetUserId(c)) | 	// req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| @ -187,7 +199,7 @@ func (e MemberRenwalConfig) Delete(c *gin.Context) { | |||||||
| 	err = s.Remove(&req, p) | 	err = s.Remove(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("删除会员套餐管理失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("删除会员套餐管理失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "删除成功") | 	e.OK(req.GetId(), "删除成功") | ||||||
| } | } | ||||||
|  | |||||||
| @ -76,7 +76,7 @@ func (e SysDictData) Get(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var object models.SysDictData | 	var object dto.SysDictDataResp | ||||||
|  |  | ||||||
| 	err = s.Get(&req, &object) | 	err = s.Get(&req, &object) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								app/admin/fronted/common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								app/admin/fronted/common.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package fronted | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/service/appservice" | ||||||
|  | 	"go-admin/common/service/sysservice/sysstatuscode" | ||||||
|  | 	statuscode "go-admin/common/status_code" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Common struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获取默认设置 | ||||||
|  | func (e Common) GetDefaultSet(c *gin.Context) { | ||||||
|  | 	s := appservice.Common{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.ServerError, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.ServerError)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	data, code := s.GetDefaultSet() | ||||||
|  |  | ||||||
|  | 	if code != statuscode.OK { | ||||||
|  | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(data, "success") | ||||||
|  | } | ||||||
| @ -119,7 +119,7 @@ func (e LineUserApi) VerifyEmail(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	// 核验邮箱验证码 | 	// 核验邮箱验证码 | ||||||
| 	code := authservice.UserVerifyEmail(req.Email, req.VerifyCode, e.Orm) | 	code := authservice.UserVerifyEmail(req.Email, req.VerifyCode, 0, e.Orm) | ||||||
| 	if code != statuscode.OK { | 	if code != statuscode.OK { | ||||||
| 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
| 		return | 		return | ||||||
| @ -133,7 +133,7 @@ func (e LineUserApi) VerifyEmail(c *gin.Context) { | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // SendVerifyEmail 发送注册校验邮箱 | // SendVerifyEmail 发送邮箱 | ||||||
| func (e LineUserApi) SendVerifyEmail(c *gin.Context) { | func (e LineUserApi) SendVerifyEmail(c *gin.Context) { | ||||||
| 	s := service.LineUser{} | 	s := service.LineUser{} | ||||||
| 	req := dto.FrontedSendVerifyEmailReq{} | 	req := dto.FrontedSendVerifyEmailReq{} | ||||||
| @ -154,7 +154,8 @@ func (e LineUserApi) SendVerifyEmail(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	emailCode := inttostring.GenerateRandomString(10) | 	emailCode := inttostring.GenerateRandomString(10) | ||||||
| 	code = authservice.SendRegisterEmail(req.Email, emailCode) | 	language := common.GetLanguage(c) | ||||||
|  | 	code = authservice.SendRegisterEmail(req.Email, emailCode, req.Type, language) | ||||||
| 	if code != statuscode.OK { | 	if code != statuscode.OK { | ||||||
| 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
| 		return | 		return | ||||||
| @ -183,13 +184,15 @@ func (e LineUserApi) SendRegisterSms(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	user, _ := aduserdb.GetUserByPhone(e.Orm, req.PhoneAreaCode, req.Phone) | 	if req.Type == 0 { | ||||||
| 	if user.Id > 0 { | 		user, _ := aduserdb.GetUserByPhone(e.Orm, req.PhoneAreaCode, req.Phone) | ||||||
| 		e.Error(statuscode.TheAccountIsAlreadyRegistered, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.TheAccountIsAlreadyRegistered)) | 		if user.Id > 0 { | ||||||
| 		return | 			e.Error(statuscode.TheAccountIsAlreadyRegistered, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.TheAccountIsAlreadyRegistered)) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	code = authservice.SendGoToneSms(req.Phone, req.PhoneAreaCode) | 	code = authservice.SendGoToneSms(req.Phone, req.PhoneAreaCode, req.Type) | ||||||
| 	if code != statuscode.OK { | 	if code != statuscode.OK { | ||||||
| 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
| 		return | 		return | ||||||
| @ -346,9 +349,11 @@ func (e LineUserApi) GetWhiteIp(c *gin.Context) { | |||||||
| // Info 用户中心 | // Info 用户中心 | ||||||
| func (e LineUserApi) Info(c *gin.Context) { | func (e LineUserApi) Info(c *gin.Context) { | ||||||
| 	s := service.LineUser{} | 	s := service.LineUser{} | ||||||
|  | 	balance := service.MemberBalance{} | ||||||
| 	err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|  | 		MakeService(&balance.Service). | ||||||
| 		Errors | 		Errors | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
| @ -404,11 +409,15 @@ func (e LineUserApi) Info(c *gin.Context) { | |||||||
| 		fundingAsset = resp[0:] | 		fundingAsset = resp[0:] | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	balanceData, _ := balance.GetBalance(userId) | ||||||
|  |  | ||||||
| 	//获取盈利情况 | 	//获取盈利情况 | ||||||
| 	logs := service.LineUserProfitLogs{Service: s.Service} | 	logs := service.LineUserProfitLogs{Service: s.Service} | ||||||
| 	totalProfit, todayProfit := logs.GetProfitInfoByUserId(userinfo.Id) | 	totalProfit, todayProfit := logs.GetProfitInfoByUserId(userinfo.Id) | ||||||
| 	user := map[string]interface{}{ | 	user := map[string]interface{}{ | ||||||
| 		"avatar":      userinfo.Avatar, | 		"avatar":      userinfo.Avatar, | ||||||
|  | 		"user_id":     userinfo.Id, | ||||||
|  | 		"user_name":   userinfo.Nickname, | ||||||
| 		"invite_num":  userinfo.RecommendNum, | 		"invite_num":  userinfo.RecommendNum, | ||||||
| 		"open_status": apiUserinfo.OpenStatus, | 		"open_status": apiUserinfo.OpenStatus, | ||||||
| 		"is_auth":     isAuth, | 		"is_auth":     isAuth, | ||||||
| @ -425,6 +434,11 @@ func (e LineUserApi) Info(c *gin.Context) { | |||||||
| 		"funding_asset": fundingAsset, | 		"funding_asset": fundingAsset, | ||||||
| 		"total_profit":  totalProfit.Float64, | 		"total_profit":  totalProfit.Float64, | ||||||
| 		"today_profit":  todayProfit.Float64, | 		"today_profit":  todayProfit.Float64, | ||||||
|  | 		"balance": map[string]interface{}{ //系统余额 | ||||||
|  | 			"total_amount":  balanceData.TotalAmount, | ||||||
|  | 			"free_amount":   balanceData.FreeAmount, | ||||||
|  | 			"frozen_amount": balanceData.FrozenAmount, | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
| 	e.OK(returnMap, "success") | 	e.OK(returnMap, "success") | ||||||
|  |  | ||||||
| @ -634,3 +648,82 @@ func (e LineUserApi) GetProperty(c *gin.Context) { | |||||||
|  |  | ||||||
| 	e.OK(data, "success") | 	e.OK(data, "success") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 获取到期时间 | ||||||
|  | func (e LineUserApi) GetUserInfo(c *gin.Context) { | ||||||
|  | 	s := appservice.LineUser{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.ServerError, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.ServerError)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	userId := common.GetUserId(c) | ||||||
|  | 	var data dto.LineUserAppResp | ||||||
|  | 	code := s.GetUserInfo(userId, &data) | ||||||
|  |  | ||||||
|  | 	if code != statuscode.OK { | ||||||
|  | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(data, "success") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 用户下单设置 | ||||||
|  | func (e LineUserApi) UserOrderSet(c *gin.Context) { | ||||||
|  | 	s := service.LineUser{} | ||||||
|  | 	req := dto.LineUserOrderSetReq{} | ||||||
|  |  | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.ServerError, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.ServerError)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	userId := common.GetUserId(c) | ||||||
|  | 	code := s.OrderSet(&req, userId) | ||||||
|  |  | ||||||
|  | 	if code != statuscode.OK { | ||||||
|  | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(nil, "success") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e LineUserApi) ResetPassword(c *gin.Context) { | ||||||
|  | 	s := service.LineUser{} | ||||||
|  | 	req := dto.LineUserResetPwdReq{} | ||||||
|  |  | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.ServerError, nil, sysstatuscode.GetStatusCodeDescription(c, statuscode.ServerError)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if code := req.Valid(); code != statuscode.OK { | ||||||
|  | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	code := s.ResetPassword(&req) | ||||||
|  |  | ||||||
|  | 	if code != statuscode.OK { | ||||||
|  | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(nil, "success") | ||||||
|  | } | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ import ( | |||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @ -21,7 +22,7 @@ func (e MemberBalanceLog) GetPage(c *gin.Context) { | |||||||
| 	req := dto.MemberBalanceLogPageAppReq{} | 	req := dto.MemberBalanceLogPageAppReq{} | ||||||
| 	err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		Bind(&req). | 		Bind(&req, binding.Form, binding.Query). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
| 		Errors | 		Errors | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -30,6 +31,7 @@ func (e MemberBalanceLog) GetPage(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	req.UserId = common.GetUserId(c) | 	req.UserId = common.GetUserId(c) | ||||||
|  | 	req.Language = common.GetLanguage(c) | ||||||
| 	data := make([]dto.MemberBalanceLogAppResp, 0) | 	data := make([]dto.MemberBalanceLogAppResp, 0) | ||||||
| 	var count int64 | 	var count int64 | ||||||
| 	code := s.GetPage(&req, &data, &count) | 	code := s.GetPage(&req, &data, &count) | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ import ( | |||||||
| 	"go-admin/app/admin/service/appservice" | 	"go-admin/app/admin/service/appservice" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/service/common" | ||||||
| 	"go-admin/common/service/sysservice/sysstatuscode" | 	"go-admin/common/service/sysservice/sysstatuscode" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| @ -27,7 +28,9 @@ func (e MemberRenwalConfig) GetActiveList(c *gin.Context) { | |||||||
| 		e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	data, code := s.GetList() |  | ||||||
|  | 	language := common.GetLanguage(c) | ||||||
|  | 	data, code := s.GetList(language) | ||||||
|  |  | ||||||
| 	if code != statuscode.OK { | 	if code != statuscode.OK { | ||||||
| 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | 		e.Error(code, nil, sysstatuscode.GetStatusCodeDescription(c, code)) | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ import ( | |||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @ -21,7 +22,7 @@ func (e MemberRenwalLog) GetPage(c *gin.Context) { | |||||||
| 	req := dto.MemberRenwalLogPageAppReq{} | 	req := dto.MemberRenwalLogPageAppReq{} | ||||||
| 	err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		Bind(&req). | 		Bind(&req, binding.Form, binding.Query). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
| 		Errors | 		Errors | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -30,6 +31,7 @@ func (e MemberRenwalLog) GetPage(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	userId := common.GetUserId(c) | 	userId := common.GetUserId(c) | ||||||
|  | 	req.Language = common.GetLanguage(c) | ||||||
| 	data := make([]dto.MemberRenwalLogResp, 0) | 	data := make([]dto.MemberRenwalLogResp, 0) | ||||||
| 	var count int64 | 	var count int64 | ||||||
| 	code := s.GetPage(userId, &req, &data, &count) | 	code := s.GetPage(userId, &req, &data, &count) | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								app/admin/models/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/admin/models/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"github.com/shopspring/decimal" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type LineUserSetting struct { | ||||||
|  | 	models.Model | ||||||
|  |  | ||||||
|  | 	UserId               int             `json:"userId" gorm:"type:bigint;comment:用户ID"` | ||||||
|  | 	MinOrderAmount       decimal.Decimal `json:"minOrderAmount" gorm:"type:decimal(32,8);comment:单笔最小金额"` | ||||||
|  | 	SpotUsdtFreeAmount   decimal.Decimal `json:"spotUsdtFreeAmount" gorm:"type:decimal(32,8);comment:现货USDT可用余额"` | ||||||
|  | 	FutureUsdtFreeAmount decimal.Decimal `json:"futureUsdtFreeAmount" gorm:"type:decimal(32,8);comment:合约USDT可用余额"` | ||||||
|  | 	AssetUpdateTime      *time.Time      `json:"assetUpdateTime" gorm:"type:datetime;comment:资产更新时间"` | ||||||
|  | 	models.ModelTime | ||||||
|  | 	models.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (LineUserSetting) TableName() string { | ||||||
|  | 	return "line_user_setting" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *LineUserSetting) Generate() models.ActiveRecord { | ||||||
|  | 	o := *e | ||||||
|  | 	return &o | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *LineUserSetting) GetId() interface{} { | ||||||
|  | 	return e.Id | ||||||
|  | } | ||||||
| @ -10,7 +10,7 @@ type MemberBalance struct { | |||||||
| 	models.Model | 	models.Model | ||||||
|  |  | ||||||
| 	UserId       int             `json:"userId" gorm:"type:bigint;comment:用户id"` | 	UserId       int             `json:"userId" gorm:"type:bigint;comment:用户id"` | ||||||
| 	TotalAmont   decimal.Decimal `json:"totalAmont" gorm:"type:decimal(18,6);comment:总余额"` | 	TotalAmount  decimal.Decimal `json:"totalAmount" gorm:"type:decimal(18,6);comment:总余额"` | ||||||
| 	FreeAmount   decimal.Decimal `json:"freeAmount" gorm:"type:decimal(18,6);comment:可用余额"` | 	FreeAmount   decimal.Decimal `json:"freeAmount" gorm:"type:decimal(18,6);comment:可用余额"` | ||||||
| 	FrozenAmount decimal.Decimal `json:"frozenAmount" gorm:"type:decimal(18,6);comment:冻结金额"` | 	FrozenAmount decimal.Decimal `json:"frozenAmount" gorm:"type:decimal(18,6);comment:冻结金额"` | ||||||
| 	models.ModelTime | 	models.ModelTime | ||||||
|  | |||||||
| @ -11,6 +11,8 @@ import ( | |||||||
| type MemberRenwaLog struct { | type MemberRenwaLog struct { | ||||||
| 	models.Model | 	models.Model | ||||||
|  |  | ||||||
|  | 	NetworkName         string          `json:"networkName" gorm:"type:varchar(255);comment:网络名称"` | ||||||
|  | 	ReceiveAddress      string          `json:"receiveAddress" gorm:"type:varchar(255);comment:接收地址"` | ||||||
| 	RenwalId            int             `json:"renwalId" gorm:"type:bigint;comment:套餐id"` | 	RenwalId            int             `json:"renwalId" gorm:"type:bigint;comment:套餐id"` | ||||||
| 	UserId              int             `json:"userId" gorm:"type:bigint;comment:用户id"` | 	UserId              int             `json:"userId" gorm:"type:bigint;comment:用户id"` | ||||||
| 	RenwalName          string          `json:"renwalName" gorm:"type:varchar(255);comment:续期套餐名称"` | 	RenwalName          string          `json:"renwalName" gorm:"type:varchar(255);comment:续期套餐名称"` | ||||||
| @ -23,6 +25,7 @@ type MemberRenwaLog struct { | |||||||
| 	PaymentTime         *time.Time      `json:"paymentTime" gorm:"type:datetime;comment:支付时间"` | 	PaymentTime         *time.Time      `json:"paymentTime" gorm:"type:datetime;comment:支付时间"` | ||||||
| 	Hash                string          `json:"hash" gorm:"type:varchar(255);comment:交易hash"` | 	Hash                string          `json:"hash" gorm:"type:varchar(255);comment:交易hash"` | ||||||
| 	ExpirationTime      time.Time       `json:"expirationTime" gorm:"type:datetime;comment:到期时间"` | 	ExpirationTime      time.Time       `json:"expirationTime" gorm:"type:datetime;comment:到期时间"` | ||||||
|  | 	NickName            string          `json:"nickName" gorm:"-"` | ||||||
| 	models.ModelTime | 	models.ModelTime | ||||||
| 	models.ControlBy | 	models.ControlBy | ||||||
| } | } | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ type MemberRenwalConfig struct { | |||||||
| 	models.Model | 	models.Model | ||||||
|  |  | ||||||
| 	PackageName   string          `json:"packageName" gorm:"type:varchar(255);comment:套餐名称"` | 	PackageName   string          `json:"packageName" gorm:"type:varchar(255);comment:套餐名称"` | ||||||
|  | 	PackageNameEn string          `json:"packageNameEn" gorm:"type:varchar(255);comment:套餐英文名称"` | ||||||
| 	DurationDay   int             `json:"durationDay" gorm:"type:int;comment:续期时间(天)"` | 	DurationDay   int             `json:"durationDay" gorm:"type:int;comment:续期时间(天)"` | ||||||
| 	OriginalPrice decimal.Decimal `json:"originalPrice" gorm:"type:decimal(18,6);comment:原始单价"` | 	OriginalPrice decimal.Decimal `json:"originalPrice" gorm:"type:decimal(18,6);comment:原始单价"` | ||||||
| 	DiscountPrice decimal.Decimal `json:"discountPrice" gorm:"type:decimal(18,6);comment:折扣价格 -1为未设置"` | 	DiscountPrice decimal.Decimal `json:"discountPrice" gorm:"type:decimal(18,6);comment:折扣价格 -1为未设置"` | ||||||
|  | |||||||
| @ -22,6 +22,8 @@ type MemberWithdrawalLog struct { | |||||||
| 	ConfirmTime *time.Time      `json:"confirmTime" gorm:"type:datetime;comment:确认时间"` | 	ConfirmTime *time.Time      `json:"confirmTime" gorm:"type:datetime;comment:确认时间"` | ||||||
| 	Fee         decimal.Decimal `json:"fee" gorm:"type:decimal(10,2);comment:手续费比例"` | 	Fee         decimal.Decimal `json:"fee" gorm:"type:decimal(10,2);comment:手续费比例"` | ||||||
| 	Remark      string          `json:"remark" gorm:"type:varchar(255);comment:备注"` | 	Remark      string          `json:"remark" gorm:"type:varchar(255);comment:备注"` | ||||||
|  | 	UserName    string          `json:"userName" gorm:"-"` | ||||||
|  | 	NickName    string          `json:"nickName" gorm:"-"` | ||||||
| 	models.ModelTime | 	models.ModelTime | ||||||
| 	models.ControlBy | 	models.ControlBy | ||||||
| } | } | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ type SysDictData struct { | |||||||
| 	Status    int    `json:"status" gorm:"size:4;comment:Status"` | 	Status    int    `json:"status" gorm:"size:4;comment:Status"` | ||||||
| 	Default   string `json:"default" gorm:"size:8;comment:Default"` | 	Default   string `json:"default" gorm:"size:8;comment:Default"` | ||||||
| 	Remark    string `json:"remark" gorm:"size:255;comment:Remark"` | 	Remark    string `json:"remark" gorm:"size:255;comment:Remark"` | ||||||
|  | 	Language  string `json:"language" gorm:"type:text;comment:多语言(json)"` | ||||||
| 	models.ControlBy | 	models.ControlBy | ||||||
| 	models.ModelTime | 	models.ModelTime | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ type FrontedUserRegisterReq struct { | |||||||
| 	InviteCode    string `json:"invite_code"`     // 邀请码 | 	InviteCode    string `json:"invite_code"`     // 邀请码 | ||||||
| 	IP            string `json:"-"`               // IP | 	IP            string `json:"-"`               // IP | ||||||
| 	Pid           int    `json:"-"`               // 推荐人ID | 	Pid           int    `json:"-"`               // 推荐人ID | ||||||
|  | 	Language      string `json:"-"`               //语言 | ||||||
| } | } | ||||||
|  |  | ||||||
| // CheckParams 校验邮箱参数 | // CheckParams 校验邮箱参数 | ||||||
|  | |||||||
| @ -3,10 +3,11 @@ package router | |||||||
| import ( | import ( | ||||||
| 	"os" | 	"os" | ||||||
|  |  | ||||||
|  | 	common "go-admin/common/middleware" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	log "github.com/go-admin-team/go-admin-core/logger" | 	log "github.com/go-admin-team/go-admin-core/logger" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk" | 	"github.com/go-admin-team/go-admin-core/sdk" | ||||||
| 	common "go-admin/common/middleware" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // InitRouter 路由初始化,不要怀疑,这里用到了 | // InitRouter 路由初始化,不要怀疑,这里用到了 | ||||||
|  | |||||||
| @ -47,6 +47,9 @@ func frontedRegisterLinUserRouter(v1 *gin.RouterGroup) { | |||||||
| 	r.POST("/updateApiAuth", middleware.FrontedAuth, api.UpdateApiKey) //用户手动修改Apikey | 	r.POST("/updateApiAuth", middleware.FrontedAuth, api.UpdateApiKey) //用户手动修改Apikey | ||||||
| 	r.POST("/opStatus", middleware.FrontedAuth, api.OpenStatus)        //开启或者关闭状态 | 	r.POST("/opStatus", middleware.FrontedAuth, api.OpenStatus)        //开启或者关闭状态 | ||||||
| 	r.DELETE("/logout", middleware.FrontedAuth, api.Logout)            //退出登录 | 	r.DELETE("/logout", middleware.FrontedAuth, api.Logout)            //退出登录 | ||||||
|  | 	r.GET("user-info", middleware.FrontedAuth, api.GetUserInfo)        //用户详情 | ||||||
|  | 	r.PUT("order-set", middleware.FrontedAuth, api.UserOrderSet)       //用户下单设置 | ||||||
|  | 	r.PUT("reset-pwd", api.ResetPassword)                              //重置密码 | ||||||
|  |  | ||||||
| 	r.GET("/exchange-balance", middleware.FrontedAuth, api.GetProperty) //合约用户交易所u资产 | 	r.GET("/exchange-balance", middleware.FrontedAuth, api.GetProperty) //合约用户交易所u资产 | ||||||
|  |  | ||||||
| @ -60,6 +63,11 @@ func frontedRegisterLinUserRouter(v1 *gin.RouterGroup) { | |||||||
| 	r.POST("/callback", api.CallBack)                         //coinGate 回调地址 | 	r.POST("/callback", api.CallBack)                         //coinGate 回调地址 | ||||||
| 	r.POST("/preorder", middleware.FrontedAuth, api.PreOrder) //coinGate 充值 | 	r.POST("/preorder", middleware.FrontedAuth, api.PreOrder) //coinGate 充值 | ||||||
|  |  | ||||||
|  | 	commonApi := fronted.Common{} | ||||||
|  | 	r2 := v1.Group("common") | ||||||
|  | 	{ | ||||||
|  | 		r2.GET("default-set", commonApi.GetDefaultSet) //默认设置 | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func frontedUserCenterRouter(v1 *gin.RouterGroup) { | func frontedUserCenterRouter(v1 *gin.RouterGroup) { | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								app/admin/router/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/admin/router/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/apis" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerLineUserSettingRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // registerLineUserSettingRouter | ||||||
|  | func registerLineUserSettingRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.LineUserSetting{} | ||||||
|  | 	r := v1.Group("/line-user-setting").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", actions.PermissionAction(), api.GetPage) | ||||||
|  | 		r.GET("/:id", actions.PermissionAction(), api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", actions.PermissionAction(), api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -25,6 +25,9 @@ func registerMemberWithdrawalLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt. | |||||||
| 		r.POST("", api.Insert) | 		r.POST("", api.Insert) | ||||||
| 		r.PUT("/:id", actions.PermissionAction(), api.Update) | 		r.PUT("/:id", actions.PermissionAction(), api.Update) | ||||||
| 		r.DELETE("", api.Delete) | 		r.DELETE("", api.Delete) | ||||||
|  |  | ||||||
|  | 		r.PUT("/approve", actions.PermissionAction(), api.Process) //审核提现申请 | ||||||
|  | 		r.PUT("confirm", actions.PermissionAction(), api.Confirm)  //确认提现申请 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										47
									
								
								app/admin/service/appservice/common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								app/admin/service/appservice/common.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | package appservice | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	adminservice "go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	statuscode "go-admin/common/status_code" | ||||||
|  | 	"go-admin/pkg/utility" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Common struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获取前端 默认设置 | ||||||
|  | func (e *Common) GetDefaultSet() (dto.FrontedDefaultSetResp, int) { | ||||||
|  | 	result := dto.FrontedDefaultSetResp{} | ||||||
|  | 	keys := []string{"control_telegram_link", "control_customer_service", "control_binance_referral", "member_min_order_amount"} | ||||||
|  | 	configService := adminservice.SysConfig{Service: e.Service} | ||||||
|  | 	configMaps := make(map[string]dto.GetSysConfigByKEYForServiceResp) | ||||||
|  | 	configService.GetWithKeys(&keys, &configMaps) | ||||||
|  |  | ||||||
|  | 	if config, ok := configMaps["control_telegram_link"]; ok { | ||||||
|  | 		result.TelegramLink = config.ConfigValue | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if config, ok := configMaps["control_customer_service"]; ok { | ||||||
|  | 		result.CustomServiceLink = config.ConfigValue | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if config, ok := configMaps["control_binance_referral"]; ok { | ||||||
|  | 		result.BinanceReferralLink = config.ConfigValue | ||||||
|  |  | ||||||
|  | 		params, _ := utility.ParseURLParams(result.BinanceReferralLink) | ||||||
|  |  | ||||||
|  | 		if code, ok := params["ref"]; ok { | ||||||
|  | 			result.BinanceReferralCode = code | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if config, ok := configMaps["member_min_order_amount"]; ok { | ||||||
|  | 		result.MinOrderAmount = config.ConfigValue | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result, statuscode.OK | ||||||
|  | } | ||||||
| @ -25,7 +25,7 @@ func (e *InviteLog) GetPage(req *dto.PersonnalInviteLogPageReq, list *[]dto.Invi | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, v := range datas { | 	for _, v := range datas { | ||||||
| 		pids = append(pids, v.Pid) | 		pids = append(pids, v.Id) | ||||||
| 	} | 	} | ||||||
| 	if err := e.Orm.Model(&models.LineUser{}).Where("pid in (?)", pids).Find(&childs).Error; err != nil { | 	if err := e.Orm.Model(&models.LineUser{}).Where("pid in (?)", pids).Find(&childs).Error; err != nil { | ||||||
| 		logger.Error("查询子邀请失败", err) | 		logger.Error("查询子邀请失败", err) | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package appservice | package appservice | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"context" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| @ -11,6 +12,7 @@ import ( | |||||||
| 	memberrenwallogstatus "go-admin/common/const/dicts/member_renwal_log_status" | 	memberrenwallogstatus "go-admin/common/const/dicts/member_renwal_log_status" | ||||||
| 	"go-admin/common/const/rediskey" | 	"go-admin/common/const/rediskey" | ||||||
| 	"go-admin/common/helper" | 	"go-admin/common/helper" | ||||||
|  | 	statuscode "go-admin/common/status_code" | ||||||
| 	"go-admin/pkg/utility" | 	"go-admin/pkg/utility" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| @ -83,114 +85,141 @@ func (e *LineUser) Expire() error { | |||||||
| // 会员开通支付回调 | // 会员开通支付回调 | ||||||
| func (e *LineUser) PayCallBack(datas []models.MemberRenwaLog) error { | func (e *LineUser) PayCallBack(datas []models.MemberRenwaLog) error { | ||||||
| 	now := time.Now() | 	now := time.Now() | ||||||
| 	startTime := time.Now().Add(-4 * time.Hour) | 	// startTime := time.Now().Add(-4 * time.Hour) | ||||||
| 	log := models.MemberRenwaLog{} | 	log := models.MemberRenwaLog{} | ||||||
| 	configService := adminservice.SysConfig{Service: e.Service} | 	configService := adminservice.SysConfig{Service: e.Service} | ||||||
| 	keys := []string{"member_invitation_rate1", "member_invitation_rate2"} | 	keys := []string{"member_invitation_rate1", "member_invitation_rate2"} | ||||||
| 	configs := make(map[string]dto.GetSysConfigByKEYForServiceResp) | 	configs := make(map[string]dto.GetSysConfigByKEYForServiceResp) | ||||||
| 	configService.GetWithKeys(&keys, &configs) | 	configService.GetWithKeys(&keys, &configs) | ||||||
|  | 	renwalLogs := make([]models.MemberRenwaLog, 0) | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&models.MemberRenwaLog{}).Where("expiration_time >NOW() and status =?", memberrenwallogstatus.PENDING).Find(&renwalLogs).Error; err != nil { | ||||||
|  | 		logger.Error("查询未过期续费记录失败", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	for _, data := range datas { | 	for _, data := range datas { | ||||||
|  | 		err := e.doCallBack(data, log, renwalLogs, now, configs) | ||||||
|  | 		if err != nil { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 回调逻辑 | ||||||
|  | func (e *LineUser) doCallBack(data models.MemberRenwaLog, log models.MemberRenwaLog, renwalLogs []models.MemberRenwaLog, now time.Time, configs map[string]dto.GetSysConfigByKEYForServiceResp) error { | ||||||
|  | 	lock := helper.NewRedisLock(fmt.Sprintf(rediskey.OrderCallBackLock, data.PayableAmount), 200, 5, 100*time.Millisecond) | ||||||
|  |  | ||||||
|  | 	if ok, err := lock.AcquireWait(context.Background()); err != nil { | ||||||
|  | 		logger.Debug("获取锁失败", err) | ||||||
|  | 		return err | ||||||
|  | 	} else if ok { | ||||||
|  | 		defer lock.Release() | ||||||
|  |  | ||||||
| 		// 检查是否已经处理过该订单 | 		// 检查是否已经处理过该订单 | ||||||
| 		hashKey := fmt.Sprintf(rediskey.MemberHash, data.Hash) | 		hashKey := fmt.Sprintf(rediskey.MemberHash, data.Hash) | ||||||
| 		val, _ := helper.DefaultRedis.GetString(hashKey) | 		val, _ := helper.DefaultRedis.GetString(hashKey) | ||||||
| 		if val != "" { | 		if val != "" { | ||||||
| 			logger.Info("已处理过的hash:", data.Hash) | 			logger.Info("已处理过的hash:", data.Hash) | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 查询续费记录 |  | ||||||
| 		if err := e.Orm.Model(&log).Where("payable_amount=? AND create_at >? AND status =?", data.PayableAmount, startTime, memberrenwallogstatus.PENDING).First(&log).Error; err != nil { |  | ||||||
| 			if errors.Is(err, gorm.ErrRecordNotFound) { |  | ||||||
| 				// 如果记录未找到,跳过该项 |  | ||||||
| 				logger.Warnf("续费记录未找到 hash:%v amount:%v", data.Hash, data.PayableAmount) |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			logger.Errorf("续费记录查询失败 hash:%v amount:%v err:%v", data.Hash, data.PayableAmount, err) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		log.Status = memberrenwallogstatus.PAID |  | ||||||
| 		log.PaymentTime = &now |  | ||||||
| 		log.FromAddress = data.FromAddress |  | ||||||
| 		log.Hash = data.Hash |  | ||||||
| 		// 查询用户信息 |  | ||||||
| 		user := models.LineUser{} |  | ||||||
| 		if err := e.Orm.Model(&user).Where("id =?", log.UserId).First(&user).Error; err != nil { |  | ||||||
| 			logger.Errorf("用户查询失败 hash:%v amount:%v err:%v", data.Hash, data.PayableAmount, err) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 更新 ExpirationTime |  | ||||||
| 		if user.ExpirationTime != nil && user.ExpirationTime.After(now) { |  | ||||||
| 			expirationTime := user.ExpirationTime.AddDate(0, 0, log.RenwalDuration) |  | ||||||
| 			user.ExpirationTime = &expirationTime |  | ||||||
| 		} else { |  | ||||||
| 			expirationTime := now.AddDate(0, 0, log.RenwalDuration) |  | ||||||
| 			user.ExpirationTime = &expirationTime |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 计算返现记录 |  | ||||||
| 		balanceLogs := make([]models.MemberBalanceLog, 0) |  | ||||||
| 		if user.Pid > 0 { |  | ||||||
| 			if set, ok := configs["member_invitation_rate1"]; ok { |  | ||||||
| 				rate1 := utility.StrToDecimal(set.ConfigValue) |  | ||||||
| 				if rate1.Cmp(decimal.Zero) > 0 { |  | ||||||
| 					balanceLogs = append(balanceLogs, calculateBalance(user.Pid, data.PayableAmount, rate1)) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if user.TopReferrerId > 0 { |  | ||||||
| 			if set, ok := configs["member_invitation_rate2"]; ok { |  | ||||||
| 				rate1 := utility.StrToDecimal(set.ConfigValue) |  | ||||||
| 				if rate1.Cmp(decimal.Zero) > 0 { |  | ||||||
| 					balanceLogs = append(balanceLogs, calculateBalance(user.TopReferrerId, data.PayableAmount, rate1)) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 修改续期订单记录 |  | ||||||
| 		if err := e.Orm.Model(log).Save(&log).Error; err != nil { |  | ||||||
| 			logger.Errorf("续费更新订单失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		// 更新用户信息 |  | ||||||
| 		if err := e.Orm.Model(&user).Updates(user).Error; err != nil { |  | ||||||
| 			logger.Errorf("续费更新失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 事务操作,保存返现记录及更新余额 |  | ||||||
| 		err := e.Orm.Transaction(func(tx *gorm.DB) error { |  | ||||||
| 			// 保存返现记录 |  | ||||||
| 			if err := e.Orm.Model(&models.MemberBalanceLog{}).Create(&balanceLogs).Error; err != nil { |  | ||||||
| 				logger.Errorf("续费保存返现记录失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// 更新用户余额 |  | ||||||
| 			for _, item := range balanceLogs { |  | ||||||
| 				if err := e.Orm.Exec("update member_balance set total_amount=total_amount+?,free_amount=free_amount +? where user_id=?", item.Amount, item.UserId).Error; err != nil { |  | ||||||
| 					logger.Errorf("续费更新余额失败 userid:%v 返现userid:%v hash:%v amount:%v err:%v", user.Id, item.UserId, data.Hash, data.PayableAmount, err) |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			return nil | 			return nil | ||||||
| 		}) |  | ||||||
|  |  | ||||||
| 		// 事务失败处理 |  | ||||||
| 		if err != nil { |  | ||||||
| 			logger.Errorf("续费成功,返现失败:续费userid:%v,hash:%s,err:%v", user.Id, data.Hash, err) |  | ||||||
| 			continue |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err := helper.DefaultRedis.SetString(hashKey, "1"); err != nil { | 		for index := range renwalLogs { | ||||||
| 			logger.Errorf("续费成功,写入hash缓存失败 :续费userid:%v,hash:%s,err:%v", user.Id, data.Hash, err) | 			if renwalLogs[index].PayableAmount.Cmp(data.PayableAmount) == 0 { | ||||||
|  | 				// 查询续费记录 | ||||||
|  | 				if err := e.Orm.Model(&log).Where("payable_amount=? AND status =?", data.PayableAmount, memberrenwallogstatus.PENDING).First(&log).Error; err != nil { | ||||||
|  | 					if errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  |  | ||||||
|  | 						// 如果记录未找到,跳过该项 | ||||||
|  | 						logger.Warnf("续费记录未找到 hash:%v amount:%v", data.Hash, data.PayableAmount) | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 					logger.Errorf("续费记录查询失败 hash:%v amount:%v err:%v", data.Hash, data.PayableAmount, err) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				log.Status = memberrenwallogstatus.PAID | ||||||
|  | 				log.PaymentTime = &now | ||||||
|  | 				log.FromAddress = data.FromAddress | ||||||
|  | 				log.ActualPaymentAmount = data.ActualPaymentAmount | ||||||
|  | 				log.Hash = data.Hash | ||||||
|  |  | ||||||
|  | 				user := models.LineUser{} | ||||||
|  | 				// 查询用户信息 | ||||||
|  | 				if err := e.Orm.Model(&user).Where("id =?", log.UserId).First(&user).Error; err != nil { | ||||||
|  | 					logger.Errorf("用户查询失败 hash:%v amount:%v err:%v", data.Hash, data.PayableAmount, err) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				// 更新 ExpirationTime | ||||||
|  | 				if user.ExpirationTime != nil && user.ExpirationTime.After(now) { | ||||||
|  | 					expirationTime := user.ExpirationTime.AddDate(0, 0, log.RenwalDuration) | ||||||
|  | 					user.ExpirationTime = &expirationTime | ||||||
|  | 				} else { | ||||||
|  | 					expirationTime := now.AddDate(0, 0, log.RenwalDuration) | ||||||
|  | 					user.ExpirationTime = &expirationTime | ||||||
|  | 				} | ||||||
|  | 				// 计算返现记录 | ||||||
|  | 				balanceLogs := make([]models.MemberBalanceLog, 0) | ||||||
|  | 				if user.Pid > 0 { | ||||||
|  | 					if set, ok := configs["member_invitation_rate1"]; ok { | ||||||
|  | 						rate1 := utility.StrToDecimal(set.ConfigValue) | ||||||
|  | 						if rate1.Cmp(decimal.Zero) > 0 { | ||||||
|  | 							balanceLogs = append(balanceLogs, calculateBalance(user.Pid, data.PayableAmount, rate1)) | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if user.TopReferrerId > 0 { | ||||||
|  | 					if set, ok := configs["member_invitation_rate2"]; ok { | ||||||
|  | 						rate1 := utility.StrToDecimal(set.ConfigValue) | ||||||
|  | 						if rate1.Cmp(decimal.Zero) > 0 { | ||||||
|  | 							balanceLogs = append(balanceLogs, calculateBalance(user.TopReferrerId, data.PayableAmount, rate1)) | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				// 修改续期订单记录 | ||||||
|  | 				if err := e.Orm.Model(log).Save(&log).Error; err != nil { | ||||||
|  | 					logger.Errorf("续费更新订单失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				// 更新用户信息 | ||||||
|  | 				if err := e.Orm.Model(&user).Updates(user).Error; err != nil { | ||||||
|  | 					logger.Errorf("续费更新失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				// 事务操作,保存返现记录及更新余额 | ||||||
|  | 				err := e.Orm.Transaction(func(tx *gorm.DB) error { | ||||||
|  | 					// 保存返现记录 | ||||||
|  | 					if err := e.Orm.Model(&models.MemberBalanceLog{}).Create(&balanceLogs).Error; err != nil { | ||||||
|  | 						logger.Errorf("续费保存返现记录失败 userid:%v hash:%v amount:%v err:%v", user.Id, data.Hash, data.PayableAmount, err) | ||||||
|  | 						return err | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					// 更新用户余额 | ||||||
|  | 					for _, item := range balanceLogs { | ||||||
|  | 						if err := e.Orm.Exec("update member_balance set total_amount=total_amount+?,free_amount=free_amount +? where user_id=?", item.Amount, item.Amount, item.UserId).Error; err != nil { | ||||||
|  | 							logger.Errorf("续费更新余额失败 userid:%v 返现userid:%v hash:%v amount:%v err:%v", user.Id, item.UserId, data.Hash, data.PayableAmount, err) | ||||||
|  | 							return err | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					return nil | ||||||
|  | 				}) | ||||||
|  |  | ||||||
|  | 				// 事务失败处理 | ||||||
|  | 				if err != nil { | ||||||
|  | 					logger.Errorf("续费成功,返现失败:续费userid:%v,hash:%s,err:%v", user.Id, data.Hash, err) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if err := helper.DefaultRedis.SetStringExpire(hashKey, "1", time.Hour*1); err != nil { | ||||||
|  | 					logger.Errorf("续费成功,写入hash缓存失败 :续费userid:%v,hash:%s,err:%v", user.Id, data.Hash, err) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -198,8 +227,32 @@ func (e *LineUser) PayCallBack(datas []models.MemberRenwaLog) error { | |||||||
| func calculateBalance(userId int, amount decimal.Decimal, rate decimal.Decimal) models.MemberBalanceLog { | func calculateBalance(userId int, amount decimal.Decimal, rate decimal.Decimal) models.MemberBalanceLog { | ||||||
| 	return models.MemberBalanceLog{ | 	return models.MemberBalanceLog{ | ||||||
| 		UserId:       userId, | 		UserId:       userId, | ||||||
| 		ChangeSource: memberbalancechangesource.WITH_DRAW, | 		ChangeSource: memberbalancechangesource.CASH_BACK, | ||||||
| 		ChangeType:   1, | 		ChangeType:   1, | ||||||
| 		Amount:       amount.Mul(rate.Div(decimal.NewFromInt(100))).Truncate(2), | 		Amount:       amount.Mul(rate.Div(decimal.NewFromInt(100))).Truncate(2), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 获取用户过期时间 | ||||||
|  | // return statuscode | ||||||
|  | func (e *LineUser) GetUserInfo(userId int, data *dto.LineUserAppResp) int { | ||||||
|  | 	user := models.LineUser{} | ||||||
|  | 	userSetting := models.LineUserSetting{} | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&user).Where("id = ?", userId).First(&user).Error; err != nil { | ||||||
|  | 		if errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 			return statuscode.DataError | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.Orm.Model(&userSetting).Where("user_id = ?", userId).First(&userSetting) | ||||||
|  |  | ||||||
|  | 	if user.ExpirationTime != nil { | ||||||
|  | 		data.ExpirationTimeUnix = user.ExpirationTime.UnixNano() / int64(time.Millisecond) | ||||||
|  | 	} | ||||||
|  | 	data.MinOrderAmount = userSetting.MinOrderAmount | ||||||
|  |  | ||||||
|  | 	return statuscode.OK | ||||||
|  | } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package appservice | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
|  | 	adminservice "go-admin/app/admin/service" | ||||||
| 	"go-admin/app/admin/service/dto" | 	"go-admin/app/admin/service/dto" | ||||||
| 	cDto "go-admin/common/dto" | 	cDto "go-admin/common/dto" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
| @ -18,12 +19,13 @@ type MemberBalanceLog struct { | |||||||
| // 分页查询个人资金记录 | // 分页查询个人资金记录 | ||||||
| func (e *MemberBalanceLog) GetPage(req *dto.MemberBalanceLogPageAppReq, list *[]dto.MemberBalanceLogAppResp, count *int64) int { | func (e *MemberBalanceLog) GetPage(req *dto.MemberBalanceLogPageAppReq, list *[]dto.MemberBalanceLogAppResp, count *int64) int { | ||||||
| 	var data models.MemberBalanceLog | 	var data models.MemberBalanceLog | ||||||
| 	var datas []models.MemberBalanceLog | 	datas := make([]models.MemberBalanceLog, 0) | ||||||
| 	item := dto.MemberBalanceLogAppResp{} | 	item := dto.MemberBalanceLogAppResp{} | ||||||
|  |  | ||||||
| 	err := e.Orm.Model(&data). | 	err := e.Orm.Model(&data). | ||||||
| 		Where("user_id = ?", req.UserId). | 		Where("user_id =?", req.UserId). | ||||||
| 		Scopes( | 		Scopes( | ||||||
|  | 			cDto.MakeCondition(req.GetNeedSearch()), | ||||||
| 			cDto.Paginate(req.GetPageSize(), req.GetPageIndex()), | 			cDto.Paginate(req.GetPageSize(), req.GetPageIndex()), | ||||||
| 		). | 		). | ||||||
| 		Find(&datas).Limit(-1).Offset(-1). | 		Find(&datas).Limit(-1).Offset(-1). | ||||||
| @ -32,11 +34,15 @@ func (e *MemberBalanceLog) GetPage(req *dto.MemberBalanceLogPageAppReq, list *[] | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return statuscode.ServerError | 		return statuscode.ServerError | ||||||
| 	} | 	} | ||||||
|  | 	dictService := adminservice.SysDictData{Service: e.Service} | ||||||
|  | 	dicts, _ := dictService.GetByType("member_change_source") | ||||||
|  |  | ||||||
| 	for _, v := range datas { | 	for _, v := range datas { | ||||||
| 		copier.Copy(&item, v) | 		copier.Copy(&item, v) | ||||||
|  |  | ||||||
| 		item.CreateTimeUnix = v.CreatedAt.UnixNano() / int64(time.Millisecond) | 		item.CreateTimeUnix = v.CreatedAt.UnixNano() / int64(time.Millisecond) | ||||||
|  | 		item.ChangeSourceName, _ = dictService.GetLanguageByDatas(&dicts, item.ChangeSource, req.Language) | ||||||
|  |  | ||||||
| 		*list = append(*list, item) | 		*list = append(*list, item) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package appservice | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
| 	memberrenwalconfigstatus "go-admin/common/const/dicts/member_renwal_config_status" | 	memberrenwalconfigstatus "go-admin/common/const/dicts/member_renwal_config_status" | ||||||
| 	memberrenwalisvisible "go-admin/common/const/dicts/member_renwal_isvisible" | 	memberrenwalisvisible "go-admin/common/const/dicts/member_renwal_isvisible" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
| @ -13,10 +14,30 @@ type MemberRenwalConfigAppService struct { | |||||||
| 	service.Service | 	service.Service | ||||||
| } | } | ||||||
|  |  | ||||||
| func (e *MemberRenwalConfigAppService) GetList() ([]models.MemberRenwalConfig, int) { | func (e *MemberRenwalConfigAppService) GetList(language string) ([]dto.MemberRenwalConfigAppResp, int) { | ||||||
| 	result := make([]models.MemberRenwalConfig, 0) | 	var datas []models.MemberRenwalConfig | ||||||
| 	if err := e.Orm.Model(&models.MemberRenwalConfig{}).Where(" status =? AND is_visible =?", memberrenwalconfigstatus.ENABLE, memberrenwalisvisible.IsVisibleYes).Order("sort asc").Find(&result).Error; err != nil { | 	result := make([]dto.MemberRenwalConfigAppResp, 0) | ||||||
|  | 	if err := e.Orm.Model(&models.MemberRenwalConfig{}).Where(" status =? AND is_visible =?", | ||||||
|  | 		memberrenwalconfigstatus.ENABLE, memberrenwalisvisible.IsVisibleYes). | ||||||
|  | 		Order("sort asc").Find(&datas).Error; err != nil { | ||||||
| 		return result, statuscode.ServerError | 		return result, statuscode.ServerError | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, v := range datas { | ||||||
|  | 		item := dto.MemberRenwalConfigAppResp{ | ||||||
|  | 			Id:            v.Id, | ||||||
|  | 			PackageName:   v.PackageName, | ||||||
|  | 			OriginalPrice: v.OriginalPrice, | ||||||
|  | 			DiscountPrice: v.DiscountPrice, | ||||||
|  | 			DurationDay:   v.DurationDay, | ||||||
|  | 			Remark:        v.Remark, | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if language != "zh_CN" { | ||||||
|  | 			item.PackageName = v.PackageNameEn | ||||||
|  | 		} | ||||||
|  | 		result = append(result, item) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return result, statuscode.OK | 	return result, statuscode.OK | ||||||
| } | } | ||||||
|  | |||||||
| @ -32,10 +32,13 @@ func (e *MemberRenwalLog) GetPage(userId int, req *dto.MemberRenwalLogPageAppReq | |||||||
| 	var data models.MemberRenwaLog | 	var data models.MemberRenwaLog | ||||||
| 	var datas []models.MemberRenwaLog | 	var datas []models.MemberRenwaLog | ||||||
| 	resp := dto.MemberRenwalLogResp{} | 	resp := dto.MemberRenwalLogResp{} | ||||||
|  | 	renwalIds := make([]int, 0) | ||||||
|  | 	renwals := make([]models.MemberRenwalConfig, 0) | ||||||
|  |  | ||||||
| 	err := e.Orm.Model(&data). | 	err := e.Orm.Model(&data). | ||||||
| 		Where("user_id = ?", userId). | 		Where("user_id = ? AND status !=?", userId, memberrenwallogstatus.EXPIRED). | ||||||
| 		Scopes( | 		Scopes( | ||||||
|  | 			cDto.MakeCondition(req.GetNeedSearch()), | ||||||
| 			cDto.Paginate(req.GetPageSize(), req.GetPageIndex()), | 			cDto.Paginate(req.GetPageSize(), req.GetPageIndex()), | ||||||
| 		). | 		). | ||||||
| 		Find(&datas).Limit(-1).Offset(-1). | 		Find(&datas).Limit(-1).Offset(-1). | ||||||
| @ -45,6 +48,15 @@ func (e *MemberRenwalLog) GetPage(userId int, req *dto.MemberRenwalLogPageAppReq | |||||||
| 		return statuscode.ServerError | 		return statuscode.ServerError | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, v := range datas { | ||||||
|  | 		if utility.ContainsInt(renwalIds, v.RenwalId) { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		renwalIds = append(renwalIds, v.RenwalId) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.Orm.Model(&models.MemberRenwalConfig{}).Where("id IN (?)", renwalIds).Find(&renwals) | ||||||
|  |  | ||||||
| 	for _, item := range datas { | 	for _, item := range datas { | ||||||
| 		copier.Copy(&resp, item) | 		copier.Copy(&resp, item) | ||||||
|  |  | ||||||
| @ -54,6 +66,14 @@ func (e *MemberRenwalLog) GetPage(userId int, req *dto.MemberRenwalLogPageAppReq | |||||||
|  |  | ||||||
| 		resp.ExpirationTimeUnix = item.ExpirationTime.UnixNano() / int64(time.Millisecond) | 		resp.ExpirationTimeUnix = item.ExpirationTime.UnixNano() / int64(time.Millisecond) | ||||||
|  |  | ||||||
|  | 		if req.Language != "zh_CN" { | ||||||
|  | 			for _, v := range renwals { | ||||||
|  | 				if v.Id == item.RenwalId { | ||||||
|  | 					resp.RenwalName = v.PackageNameEn | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		*list = append(*list, resp) | 		*list = append(*list, resp) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -116,6 +136,8 @@ func (e *MemberRenwalLog) Renwal(req *dto.MemberRenwalCreateAppReq, data *dto.Me | |||||||
| 	renwalLog.ExpirationTime = now.Add(time.Minute * time.Duration(expirationVal)) | 	renwalLog.ExpirationTime = now.Add(time.Minute * time.Duration(expirationVal)) | ||||||
| 	renwalLog.Coin = "USDT" | 	renwalLog.Coin = "USDT" | ||||||
| 	renwalLog.PayableAmount = amount | 	renwalLog.PayableAmount = amount | ||||||
|  | 	renwalLog.NetworkName = "TRC20" | ||||||
|  | 	renwalLog.ReceiveAddress = toAddress | ||||||
|  |  | ||||||
| 	if err := e.Orm.Model(&models.MemberRenwaLog{}).Create(&renwalLog).Error; err != nil { | 	if err := e.Orm.Model(&models.MemberRenwaLog{}).Create(&renwalLog).Error; err != nil { | ||||||
| 		logger.Errorf("创建续费记录失败,userId:%v err:%v", req.UserId, err) | 		logger.Errorf("创建续费记录失败,userId:%v err:%v", req.UserId, err) | ||||||
| @ -123,8 +145,8 @@ func (e *MemberRenwalLog) Renwal(req *dto.MemberRenwalCreateAppReq, data *dto.Me | |||||||
| 	} | 	} | ||||||
| 	data.Amount = renwalLog.PayableAmount | 	data.Amount = renwalLog.PayableAmount | ||||||
| 	data.ExpirationTimeUnix = renwalLog.ExpirationTime.UnixNano() / int64(time.Millisecond) | 	data.ExpirationTimeUnix = renwalLog.ExpirationTime.UnixNano() / int64(time.Millisecond) | ||||||
| 	data.NetworkName = "TRC20" | 	data.NetworkName = renwalLog.NetworkName | ||||||
| 	data.ToAddress = toAddress | 	data.ToAddress = renwalLog.ReceiveAddress | ||||||
|  |  | ||||||
| 	return statuscode.OK | 	return statuscode.OK | ||||||
| } | } | ||||||
|  | |||||||
| @ -44,15 +44,15 @@ func GetDeviceID(ctx *gin.Context) string { | |||||||
| 	return device | 	return device | ||||||
| } | } | ||||||
|  |  | ||||||
| // 获取 language,默认语言:zh-CN | // 获取 language,默认语言:zh_CN | ||||||
| // 英语 en | // 英语 en | ||||||
| // 日本语 jp | // 日本语 jp | ||||||
| // 韩语 kr | // 韩语 kr | ||||||
| // 马来西亚语 my | // 马来西亚语 my | ||||||
| // 泰国语 th | // 泰国语 th | ||||||
| // 越南语 vn | // 越南语 vn | ||||||
| // 简体中文 zh-CN | // 简体中文 zh_CN | ||||||
| // 繁体中文 zh-HK | // 繁体中文 zh_HK | ||||||
| func GetLanguage(ctx *gin.Context) string { | func GetLanguage(ctx *gin.Context) string { | ||||||
| 	lang := "" | 	lang := "" | ||||||
|  |  | ||||||
| @ -62,7 +62,7 @@ func GetLanguage(ctx *gin.Context) string { | |||||||
| 		val, exits := ctx.Get("language") | 		val, exits := ctx.Get("language") | ||||||
|  |  | ||||||
| 		if !exits { | 		if !exits { | ||||||
| 			lang = "zh-CN" | 			lang = "zh_CN" | ||||||
| 		} else { | 		} else { | ||||||
| 			lang = val.(string) | 			lang = val.(string) | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -211,11 +211,13 @@ type FrontedUserVerifyEmailReq struct { | |||||||
|  |  | ||||||
| type FrontedSendVerifyEmailReq struct { | type FrontedSendVerifyEmailReq struct { | ||||||
| 	Email string `json:"email"` | 	Email string `json:"email"` | ||||||
|  | 	Type  int    `json:"type"` | ||||||
| } | } | ||||||
|  |  | ||||||
| type FrontedSendVerifySmsReq struct { | type FrontedSendVerifySmsReq struct { | ||||||
| 	PhoneAreaCode string `json:"phone_area_code"` // 区域电话代码 | 	PhoneAreaCode string `json:"phone_area_code"` // 区域电话代码 | ||||||
| 	Phone         string `json:"phone"`           // 手机号码 | 	Phone         string `json:"phone"`           // 手机号码 | ||||||
|  | 	Type          int    `json:"type" comment:"类型 0-注册 1-忘记密码"` | ||||||
| } | } | ||||||
|  |  | ||||||
| func (receiver *FrontedSendVerifyEmailReq) CheckParams() int { | func (receiver *FrontedSendVerifyEmailReq) CheckParams() int { | ||||||
| @ -351,3 +353,56 @@ type LineUserPropertyResp struct { | |||||||
| 	FuturesTotalAmount decimal.Decimal `json:"futuresTotalAmount"` //合约U总资产 | 	FuturesTotalAmount decimal.Decimal `json:"futuresTotalAmount"` //合约U总资产 | ||||||
| 	FuturesFreeAmount  decimal.Decimal `json:"futuresFreeAmount"`  //合约U可用余额 | 	FuturesFreeAmount  decimal.Decimal `json:"futuresFreeAmount"`  //合约U可用余额 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type LineUserAppResp struct { | ||||||
|  | 	ExpirationTimeUnix int64           `json:"expirationTimeUnix"` | ||||||
|  | 	MinOrderAmount     decimal.Decimal `json:"minOrderAmount"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LineUserOrderSetReq struct { | ||||||
|  | 	MinOrderAmount decimal.Decimal `json:"minOrderAmount"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LineUserResetPwdReq struct { | ||||||
|  | 	Pwd           string `json:"pwd"` | ||||||
|  | 	CheckPwd      string `json:"check_pwd" comment:"确认密码"` | ||||||
|  | 	PhoneAreaCode string `json:"phone_area_code" comment:"区号"` | ||||||
|  | 	Code          string `json:"code"` | ||||||
|  | 	Email         string `json:"email"` | ||||||
|  | 	Phone         string `json:"phone"` | ||||||
|  | 	Type          int    `json:"type" comment:"类型 1-手机验证码 2-邮箱验证码"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 参数校验 | ||||||
|  | func (e *LineUserResetPwdReq) Valid() int { | ||||||
|  | 	if e.Pwd == "" { | ||||||
|  | 		return statuscode.ParameterInvalid | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if e.Code == "" { | ||||||
|  | 		return statuscode.ParameterInvalid | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if e.CheckPwd != e.Pwd { | ||||||
|  | 		return statuscode.UserResetPasswordInconsistency | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch e.Type { | ||||||
|  | 	case 1: | ||||||
|  | 		if e.Phone == "" { | ||||||
|  | 			return statuscode.ParameterInvalid | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if e.PhoneAreaCode == "" { | ||||||
|  | 			return statuscode.ParameterInvalid | ||||||
|  | 		} | ||||||
|  | 	case 2: | ||||||
|  | 		if e.Email == "" { | ||||||
|  | 			return statuscode.ParameterInvalid | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		return statuscode.ParameterInvalid | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return statuscode.OK | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										99
									
								
								app/admin/service/dto/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								app/admin/service/dto/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,99 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"github.com/shopspring/decimal" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type LineUserSettingGetPageReq struct { | ||||||
|  | 	dto.Pagination `search:"-"` | ||||||
|  | 	LineUserSettingOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LineUserSettingOrder struct { | ||||||
|  | 	Id                    string `form:"idOrder"  search:"type:order;column:id;table:line_user_setting"` | ||||||
|  | 	MinOrderAmount        string `form:"minOrderAmountOrder"  search:"type:order;column:min_order_amount;table:line_user_setting"` | ||||||
|  | 	SpotUsdtFreeAmount    string `form:"spotUsdtFreeAmountOrder"  search:"type:order;column:spot_usdt_free_amount;table:line_user_setting"` | ||||||
|  | 	FutureUsdtTotalAmount string `form:"futureUsdtTotalAmountOrder"  search:"type:order;column:future_usdt_total_amount;table:line_user_setting"` | ||||||
|  | 	AssetUpdateTime       string `form:"assetUpdateTimeOrder"  search:"type:order;column:asset_update_time;table:line_user_setting"` | ||||||
|  | 	CreatedAt             string `form:"createdAtOrder"  search:"type:order;column:created_at;table:line_user_setting"` | ||||||
|  | 	UpdatedAt             string `form:"updatedAtOrder"  search:"type:order;column:updated_at;table:line_user_setting"` | ||||||
|  | 	DeletedAt             string `form:"deletedAtOrder"  search:"type:order;column:deleted_at;table:line_user_setting"` | ||||||
|  | 	CreateBy              string `form:"createByOrder"  search:"type:order;column:create_by;table:line_user_setting"` | ||||||
|  | 	UpdateBy              string `form:"updateByOrder"  search:"type:order;column:update_by;table:line_user_setting"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *LineUserSettingGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LineUserSettingInsertReq struct { | ||||||
|  | 	Id                   int             `json:"-" comment:"主键"` // 主键 | ||||||
|  | 	MinOrderAmount       decimal.Decimal `json:"minOrderAmount" comment:"单笔最小金额"` | ||||||
|  | 	SpotUsdtFreeAmount   decimal.Decimal `json:"spotUsdtFreeAmount" comment:"现货USDT可用余额"` | ||||||
|  | 	FutureUsdtFreeAmount decimal.Decimal `json:"futureUsdtFreeAmount" comment:"合约USDT可用余额"` | ||||||
|  | 	AssetUpdateTime      time.Time       `json:"assetUpdateTime" comment:"资产更新时间"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingInsertReq) Generate(model *models.LineUserSetting) { | ||||||
|  | 	if s.Id == 0 { | ||||||
|  | 		model.Model = common.Model{Id: s.Id} | ||||||
|  | 	} | ||||||
|  | 	model.MinOrderAmount = s.MinOrderAmount | ||||||
|  | 	model.SpotUsdtFreeAmount = s.SpotUsdtFreeAmount | ||||||
|  | 	model.FutureUsdtFreeAmount = s.FutureUsdtFreeAmount | ||||||
|  | 	model.AssetUpdateTime = &s.AssetUpdateTime | ||||||
|  | 	model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingInsertReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LineUserSettingUpdateReq struct { | ||||||
|  | 	Id                   int             `uri:"id" comment:"主键"` // 主键 | ||||||
|  | 	MinOrderAmount       decimal.Decimal `json:"minOrderAmount" comment:"单笔最小金额"` | ||||||
|  | 	SpotUsdtFreeAmount   decimal.Decimal `json:"spotUsdtFreeAmount" comment:"现货USDT可用余额"` | ||||||
|  | 	FutureUsdtFreeAmount decimal.Decimal `json:"futureUsdtFreeAmount" comment:"合约USDT可用余额"` | ||||||
|  | 	AssetUpdateTime      time.Time       `json:"assetUpdateTime" comment:"资产更新时间"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingUpdateReq) Generate(model *models.LineUserSetting) { | ||||||
|  | 	if s.Id == 0 { | ||||||
|  | 		model.Model = common.Model{Id: s.Id} | ||||||
|  | 	} | ||||||
|  | 	model.MinOrderAmount = s.MinOrderAmount | ||||||
|  | 	model.SpotUsdtFreeAmount = s.SpotUsdtFreeAmount | ||||||
|  | 	model.FutureUsdtFreeAmount = s.FutureUsdtFreeAmount | ||||||
|  | 	model.AssetUpdateTime = &s.AssetUpdateTime | ||||||
|  | 	model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // LineUserSettingGetReq 功能获取请求参数 | ||||||
|  | type LineUserSettingGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // LineUserSettingDeleteReq 功能删除请求参数 | ||||||
|  | type LineUserSettingDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *LineUserSettingDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
| @ -41,7 +41,7 @@ func (s *MemberBalanceInsertReq) Generate(model *models.MemberBalance) { | |||||||
| 	if s.Id == 0 { | 	if s.Id == 0 { | ||||||
| 		model.Model = common.Model{Id: s.Id} | 		model.Model = common.Model{Id: s.Id} | ||||||
| 	} | 	} | ||||||
| 	model.TotalAmont = s.TotalAmont | 	model.TotalAmount = s.TotalAmont | ||||||
| 	model.FreeAmount = s.FreeAmount | 	model.FreeAmount = s.FreeAmount | ||||||
| 	model.FrozenAmount = s.FrozenAmount | 	model.FrozenAmount = s.FrozenAmount | ||||||
| 	model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 | 	model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 | ||||||
| @ -63,7 +63,7 @@ func (s *MemberBalanceUpdateReq) Generate(model *models.MemberBalance) { | |||||||
| 	if s.Id == 0 { | 	if s.Id == 0 { | ||||||
| 		model.Model = common.Model{Id: s.Id} | 		model.Model = common.Model{Id: s.Id} | ||||||
| 	} | 	} | ||||||
| 	model.TotalAmont = s.TotalAmont | 	model.TotalAmount = s.TotalAmont | ||||||
| 	model.FreeAmount = s.FreeAmount | 	model.FreeAmount = s.FreeAmount | ||||||
| 	model.FrozenAmount = s.FrozenAmount | 	model.FrozenAmount = s.FrozenAmount | ||||||
| 	model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 | 	model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ type MemberBalanceLogGetPageReq struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| type MemberBalanceLogOrder struct { | type MemberBalanceLogOrder struct { | ||||||
| 	Id            string `form:"idOrder"  search:"type:order;column:id;table:member_balance_log"` | 	Id            string `form:"idOrder" query:"idOrder"  search:"type:order;column:id;table:member_balance_log"` | ||||||
| 	UserId        string `form:"userIdOrder"  search:"type:order;column:user_id;table:member_balance_log"` | 	UserId        string `form:"userIdOrder"  search:"type:order;column:user_id;table:member_balance_log"` | ||||||
| 	ChangeSource  string `form:"changeSourceOrder"  search:"type:order;column:change_source;table:member_balance_log"` | 	ChangeSource  string `form:"changeSourceOrder"  search:"type:order;column:change_source;table:member_balance_log"` | ||||||
| 	ChangeType    string `form:"changeTypeOrder"  search:"type:order;column:change_type;table:member_balance_log"` | 	ChangeType    string `form:"changeTypeOrder"  search:"type:order;column:change_type;table:member_balance_log"` | ||||||
| @ -117,17 +117,23 @@ type MemberBalanceLogPageAppReq struct { | |||||||
| 	dto.Pagination `search:"-"` | 	dto.Pagination `search:"-"` | ||||||
| 	ChangeSource   string `form:"changeSource"  search:"type:exact;column:change_source;table:member_balance_log" comment:"变更来源 (member_change_source)"` | 	ChangeSource   string `form:"changeSource"  search:"type:exact;column:change_source;table:member_balance_log" comment:"变更来源 (member_change_source)"` | ||||||
| 	ChangeType     string `form:"changeType"  search:"type:exact;column:change_type;table:member_balance_log" comment:"变更类别 1-收入 2-支出"` | 	ChangeType     string `form:"changeType"  search:"type:exact;column:change_type;table:member_balance_log" comment:"变更类别 1-收入 2-支出"` | ||||||
| 	UserId         int    `json:"userId"` | 	UserId         int    `json:"userId" search:"-"` | ||||||
|  | 	Language       string `json:"language" search:"-"` | ||||||
| 	MemberBalanceLogOrder | 	MemberBalanceLogOrder | ||||||
| } | } | ||||||
|  |  | ||||||
| type MemberBalanceLogAppResp struct { | func (m *MemberBalanceLogPageAppReq) GetNeedSearch() interface{} { | ||||||
| 	Id             int             `json:"-" comment:"主键"` // 主键 | 	return *m | ||||||
| 	UserId         int             `json:"userId" comment:"用户id"` | } | ||||||
| 	UserName       string          `json:"userName" comment:"用户名"` |  | ||||||
| 	ChangeSource   string          `json:"changeSource" comment:"变更来源 (member_change_source)"` | type MemberBalanceLogAppResp struct { | ||||||
| 	ChangeType     int             `json:"changeType" comment:"变更类别 1-收入 2-支出"` | 	Id               int             `json:"-" comment:"主键"` // 主键 | ||||||
| 	Amount         decimal.Decimal `json:"amount" comment:"变更金额"` | 	UserId           int             `json:"userId" comment:"用户id"` | ||||||
| 	Remark         string          `json:"remark" comment:"备注"` | 	UserName         string          `json:"userName" comment:"用户名"` | ||||||
| 	CreateTimeUnix int64           `json:"createTime" comment:"创建时间"` | 	ChangeSource     string          `json:"changeSource" comment:"变更来源 (member_change_source)"` | ||||||
|  | 	ChangeSourceName string          `json:"changeSourceName"` | ||||||
|  | 	ChangeType       int             `json:"changeType" comment:"变更类别 1-收入 2-支出"` | ||||||
|  | 	Amount           decimal.Decimal `json:"amount" comment:"变更金额"` | ||||||
|  | 	Remark           string          `json:"remark" comment:"备注"` | ||||||
|  | 	CreateTimeUnix   int64           `json:"createTime" comment:"创建时间"` | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,13 +17,22 @@ type MemberRenwaLogGetPageReq struct { | |||||||
|  |  | ||||||
| type MemberRenwalLogPageAppReq struct { | type MemberRenwalLogPageAppReq struct { | ||||||
| 	dto.Pagination `search:"-"` | 	dto.Pagination `search:"-"` | ||||||
|  | 	Language       string `search:"-"` | ||||||
|  | 	MemberRenwaLogOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *MemberRenwalLogPageAppReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
| } | } | ||||||
|  |  | ||||||
| type MemberRenwalLogResp struct { | type MemberRenwalLogResp struct { | ||||||
| 	Id                  int             `json:"id"` | 	Id                  int             `json:"id"` | ||||||
|  | 	NetworkName         string          `json:"networkName"` | ||||||
|  | 	ReceiveAddress      string          `json:"receiveAddress"` | ||||||
| 	RenwalName          string          `json:"renwalName" comment:"续期套餐名称"` | 	RenwalName          string          `json:"renwalName" comment:"续期套餐名称"` | ||||||
| 	RenwalDuration      int             `json:"renwalDuration" comment:"续期时长(天数)"` | 	RenwalDuration      int             `json:"renwalDuration" comment:"续期时长(天数)"` | ||||||
| 	Status              string          `json:"status" comment:"订单状态(member_renwal_log_status)"` | 	Status              string          `json:"status" comment:"订单状态(member_renwal_log_status)"` | ||||||
|  | 	StatusLabel         string          `json:"statusLabel"` | ||||||
| 	PayableAmount       decimal.Decimal `json:"payableAmount" comment:"应付金额"` | 	PayableAmount       decimal.Decimal `json:"payableAmount" comment:"应付金额"` | ||||||
| 	ActualPaymentAmount decimal.Decimal `json:"actualPaymentAmount" comment:"实付金额"` | 	ActualPaymentAmount decimal.Decimal `json:"actualPaymentAmount" comment:"实付金额"` | ||||||
| 	FromAddress         string          `json:"fromAddress" comment:"付款地址"` | 	FromAddress         string          `json:"fromAddress" comment:"付款地址"` | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package dto | package dto | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"errors" | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| 	"go-admin/common/dto" | 	"go-admin/common/dto" | ||||||
| 	common "go-admin/common/models" | 	common "go-admin/common/models" | ||||||
| @ -38,6 +39,7 @@ func (m *MemberRenwalConfigGetPageReq) GetNeedSearch() interface{} { | |||||||
| type MemberRenwalConfigInsertReq struct { | type MemberRenwalConfigInsertReq struct { | ||||||
| 	Id            int              `json:"-" comment:"主键"` // 主键 | 	Id            int              `json:"-" comment:"主键"` // 主键 | ||||||
| 	PackageName   string           `json:"packageName" comment:"套餐名称"` | 	PackageName   string           `json:"packageName" comment:"套餐名称"` | ||||||
|  | 	PackageNameEn string           `json:"packageNameEn" comment:"套餐名称英文"` | ||||||
| 	DurationDay   int              `json:"durationDay" comment:"续期时间(天)"` | 	DurationDay   int              `json:"durationDay" comment:"续期时间(天)"` | ||||||
| 	OriginalPrice decimal.Decimal  `json:"originalPrice" comment:"原始单价"` | 	OriginalPrice decimal.Decimal  `json:"originalPrice" comment:"原始单价"` | ||||||
| 	DiscountPrice *decimal.Decimal `json:"discountPrice" comment:"折扣价格 -1为未设置"` | 	DiscountPrice *decimal.Decimal `json:"discountPrice" comment:"折扣价格 -1为未设置"` | ||||||
| @ -49,11 +51,29 @@ type MemberRenwalConfigInsertReq struct { | |||||||
| 	common.ControlBy | 	common.ControlBy | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 校验 | ||||||
|  | func (s *MemberRenwalConfigInsertReq) Valid() error { | ||||||
|  | 	if s.PackageName == "" { | ||||||
|  | 		return errors.New("套餐名称不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if s.PackageNameEn == "" { | ||||||
|  | 		return errors.New("套餐名称英文不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if s.DurationDay <= 0 { | ||||||
|  | 		return errors.New("续期时间(天)不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (s *MemberRenwalConfigInsertReq) Generate(model *models.MemberRenwalConfig) { | func (s *MemberRenwalConfigInsertReq) Generate(model *models.MemberRenwalConfig) { | ||||||
| 	if s.Id == 0 { | 	if s.Id == 0 { | ||||||
| 		model.Model = common.Model{Id: s.Id} | 		model.Model = common.Model{Id: s.Id} | ||||||
| 	} | 	} | ||||||
| 	model.PackageName = s.PackageName | 	model.PackageName = s.PackageName | ||||||
|  | 	model.PackageNameEn = s.PackageNameEn | ||||||
| 	model.DurationDay = s.DurationDay | 	model.DurationDay = s.DurationDay | ||||||
| 	model.OriginalPrice = s.OriginalPrice | 	model.OriginalPrice = s.OriginalPrice | ||||||
|  |  | ||||||
| @ -77,6 +97,7 @@ func (s *MemberRenwalConfigInsertReq) GetId() interface{} { | |||||||
| type MemberRenwalConfigUpdateReq struct { | type MemberRenwalConfigUpdateReq struct { | ||||||
| 	Id            int              `uri:"id" comment:"主键"` // 主键 | 	Id            int              `uri:"id" comment:"主键"` // 主键 | ||||||
| 	PackageName   string           `json:"packageName" comment:"套餐名称"` | 	PackageName   string           `json:"packageName" comment:"套餐名称"` | ||||||
|  | 	PackageNameEn string           `json:"packageNameEn" comment:"套餐名称英文"` | ||||||
| 	DurationDay   int              `json:"durationDay" comment:"续期时间(天)"` | 	DurationDay   int              `json:"durationDay" comment:"续期时间(天)"` | ||||||
| 	OriginalPrice decimal.Decimal  `json:"originalPrice" comment:"原始单价"` | 	OriginalPrice decimal.Decimal  `json:"originalPrice" comment:"原始单价"` | ||||||
| 	DiscountPrice *decimal.Decimal `json:"discountPrice" comment:"折扣价格 -1为未设置"` | 	DiscountPrice *decimal.Decimal `json:"discountPrice" comment:"折扣价格 -1为未设置"` | ||||||
| @ -88,11 +109,29 @@ type MemberRenwalConfigUpdateReq struct { | |||||||
| 	common.ControlBy | 	common.ControlBy | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 校验 | ||||||
|  | func (s *MemberRenwalConfigUpdateReq) Valid() error { | ||||||
|  | 	if s.PackageName == "" { | ||||||
|  | 		return errors.New("套餐名称不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if s.PackageNameEn == "" { | ||||||
|  | 		return errors.New("套餐名称英文不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if s.DurationDay <= 0 { | ||||||
|  | 		return errors.New("续期时间(天)不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (s *MemberRenwalConfigUpdateReq) Generate(model *models.MemberRenwalConfig) { | func (s *MemberRenwalConfigUpdateReq) Generate(model *models.MemberRenwalConfig) { | ||||||
| 	if s.Id == 0 { | 	if s.Id == 0 { | ||||||
| 		model.Model = common.Model{Id: s.Id} | 		model.Model = common.Model{Id: s.Id} | ||||||
| 	} | 	} | ||||||
| 	model.PackageName = s.PackageName | 	model.PackageName = s.PackageName | ||||||
|  | 	model.PackageNameEn = s.PackageNameEn | ||||||
| 	model.DurationDay = s.DurationDay | 	model.DurationDay = s.DurationDay | ||||||
| 	model.OriginalPrice = s.OriginalPrice | 	model.OriginalPrice = s.OriginalPrice | ||||||
|  |  | ||||||
| @ -130,3 +169,12 @@ type MemberRenwalConfigDeleteReq struct { | |||||||
| func (s *MemberRenwalConfigDeleteReq) GetId() interface{} { | func (s *MemberRenwalConfigDeleteReq) GetId() interface{} { | ||||||
| 	return s.Ids | 	return s.Ids | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type MemberRenwalConfigAppResp struct { | ||||||
|  | 	Id            int             `json:"id" comment:"主键"` // 主键 | ||||||
|  | 	PackageName   string          `json:"packageName" comment:"套餐名称"` | ||||||
|  | 	DurationDay   int             `json:"durationDay" comment:"续期时间(天)"` | ||||||
|  | 	OriginalPrice decimal.Decimal `json:"originalPrice" comment:"原始单价"` | ||||||
|  | 	DiscountPrice decimal.Decimal `json:"discountPrice" comment:"折扣价格 -1为未设置"` | ||||||
|  | 	Remark        string          `json:"remark" comment:"备注"` | ||||||
|  | } | ||||||
|  | |||||||
| @ -171,6 +171,7 @@ func (e *MemberWithdrawalLogApplyReq) Valid() int { | |||||||
| type MemberWithdrawalLogResp struct { | type MemberWithdrawalLogResp struct { | ||||||
| 	Id              int             `json:"id"` | 	Id              int             `json:"id"` | ||||||
| 	NetworkId       int             `json:"networkId"` | 	NetworkId       int             `json:"networkId"` | ||||||
|  | 	NetworkName     string          `json:"networkName"` | ||||||
| 	UserId          int             `json:"userId"` | 	UserId          int             `json:"userId"` | ||||||
| 	NickName        string          `json:"nickName"` | 	NickName        string          `json:"nickName"` | ||||||
| 	Amount          decimal.Decimal `json:"amount"` | 	Amount          decimal.Decimal `json:"amount"` | ||||||
|  | |||||||
| @ -115,3 +115,11 @@ type SameSymbol struct { | |||||||
| 	Symbol string `json:"symbol"` | 	Symbol string `json:"symbol"` | ||||||
| 	Number int    `json:"number"` | 	Number int    `json:"number"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type FrontedDefaultSetResp struct { | ||||||
|  | 	MinOrderAmount      string `json:"minOrderAmount"` | ||||||
|  | 	BinanceReferralLink string `json:"binanceReferralLink"` | ||||||
|  | 	BinanceReferralCode string `json:"binanceReferalCode"` | ||||||
|  | 	CustomServiceLink   string `json:"customServiceLink"` | ||||||
|  | 	TelegramLink        string `json:"telegramLink"` | ||||||
|  | } | ||||||
|  | |||||||
| @ -4,6 +4,8 @@ import ( | |||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| 	"go-admin/common/dto" | 	"go-admin/common/dto" | ||||||
| 	common "go-admin/common/models" | 	common "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"github.com/bytedance/sonic" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type SysDictDataGetPageReq struct { | type SysDictDataGetPageReq struct { | ||||||
| @ -25,29 +27,32 @@ type SysDictDataGetAllResp struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| type SysDictDataResp struct { | type SysDictDataResp struct { | ||||||
| 	DictSort  int    `json:"dictSort" comment:""` | 	DictCode     int                       `json:"dictCode"` | ||||||
| 	DictLabel string `json:"dictLabel" comment:""` | 	DictSort     int                       `json:"dictSort" comment:""` | ||||||
| 	DictValue string `json:"dictValue" comment:""` | 	DictLabel    string                    `json:"dictLabel" comment:""` | ||||||
| 	DictType  string `json:"dictType" comment:""` | 	DictValue    string                    `json:"dictValue" comment:""` | ||||||
| 	CssClass  string `json:"cssClass" comment:""` | 	DictType     string                    `json:"dictType" comment:""` | ||||||
| 	ListClass string `json:"listClass" comment:""` | 	CssClass     string                    `json:"cssClass" comment:""` | ||||||
| 	IsDefault string `json:"isDefault" comment:""` | 	ListClass    string                    `json:"listClass" comment:""` | ||||||
| 	Status    int    `json:"status" comment:""` | 	IsDefault    string                    `json:"isDefault" comment:""` | ||||||
| 	Default   string `json:"default" comment:""` | 	Status       int                       `json:"status" comment:""` | ||||||
| 	Remark    string `json:"remark" comment:""` | 	Default      string                    `json:"default" comment:""` | ||||||
|  | 	Remark       string                    `json:"remark" comment:""` | ||||||
|  | 	LanguageData []SysDictDataLanguageData `json:"languageData"` | ||||||
| } | } | ||||||
| type SysDictDataInsertReq struct { | type SysDictDataInsertReq struct { | ||||||
| 	Id        int    `json:"-" comment:""` | 	Id           int                       `json:"-" comment:""` | ||||||
| 	DictSort  int    `json:"dictSort" comment:""` | 	DictSort     int                       `json:"dictSort" comment:""` | ||||||
| 	DictLabel string `json:"dictLabel" comment:""` | 	DictLabel    string                    `json:"dictLabel" comment:""` | ||||||
| 	DictValue string `json:"dictValue" comment:""` | 	DictValue    string                    `json:"dictValue" comment:""` | ||||||
| 	DictType  string `json:"dictType" comment:""` | 	DictType     string                    `json:"dictType" comment:""` | ||||||
| 	CssClass  string `json:"cssClass" comment:""` | 	CssClass     string                    `json:"cssClass" comment:""` | ||||||
| 	ListClass string `json:"listClass" comment:""` | 	ListClass    string                    `json:"listClass" comment:""` | ||||||
| 	IsDefault string `json:"isDefault" comment:""` | 	IsDefault    string                    `json:"isDefault" comment:""` | ||||||
| 	Status    int    `json:"status" comment:""` | 	Status       int                       `json:"status" comment:""` | ||||||
| 	Default   string `json:"default" comment:""` | 	Default      string                    `json:"default" comment:""` | ||||||
| 	Remark    string `json:"remark" comment:""` | 	Remark       string                    `json:"remark" comment:""` | ||||||
|  | 	LanguageData []SysDictDataLanguageData `json:"languageData" comment:""` | ||||||
| 	common.ControlBy | 	common.ControlBy | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -63,6 +68,7 @@ func (s *SysDictDataInsertReq) Generate(model *models.SysDictData) { | |||||||
| 	model.Status = s.Status | 	model.Status = s.Status | ||||||
| 	model.Default = s.Default | 	model.Default = s.Default | ||||||
| 	model.Remark = s.Remark | 	model.Remark = s.Remark | ||||||
|  | 	model.Language, _ = sonic.MarshalString(s.LanguageData) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *SysDictDataInsertReq) GetId() interface{} { | func (s *SysDictDataInsertReq) GetId() interface{} { | ||||||
| @ -70,17 +76,18 @@ func (s *SysDictDataInsertReq) GetId() interface{} { | |||||||
| } | } | ||||||
|  |  | ||||||
| type SysDictDataUpdateReq struct { | type SysDictDataUpdateReq struct { | ||||||
| 	Id        int    `uri:"dictCode" comment:""` | 	Id           int                       `uri:"dictCode" comment:""` | ||||||
| 	DictSort  int    `json:"dictSort" comment:""` | 	DictSort     int                       `json:"dictSort" comment:""` | ||||||
| 	DictLabel string `json:"dictLabel" comment:""` | 	DictLabel    string                    `json:"dictLabel" comment:""` | ||||||
| 	DictValue string `json:"dictValue" comment:""` | 	DictValue    string                    `json:"dictValue" comment:""` | ||||||
| 	DictType  string `json:"dictType" comment:""` | 	DictType     string                    `json:"dictType" comment:""` | ||||||
| 	CssClass  string `json:"cssClass" comment:""` | 	CssClass     string                    `json:"cssClass" comment:""` | ||||||
| 	ListClass string `json:"listClass" comment:""` | 	ListClass    string                    `json:"listClass" comment:""` | ||||||
| 	IsDefault string `json:"isDefault" comment:""` | 	IsDefault    string                    `json:"isDefault" comment:""` | ||||||
| 	Status    int    `json:"status" comment:""` | 	Status       int                       `json:"status" comment:""` | ||||||
| 	Default   string `json:"default" comment:""` | 	Default      string                    `json:"default" comment:""` | ||||||
| 	Remark    string `json:"remark" comment:""` | 	Remark       string                    `json:"remark" comment:""` | ||||||
|  | 	LanguageData []SysDictDataLanguageData `json:"languageData" comment:""` | ||||||
| 	common.ControlBy | 	common.ControlBy | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -96,6 +103,7 @@ func (s *SysDictDataUpdateReq) Generate(model *models.SysDictData) { | |||||||
| 	model.Status = s.Status | 	model.Status = s.Status | ||||||
| 	model.Default = s.Default | 	model.Default = s.Default | ||||||
| 	model.Remark = s.Remark | 	model.Remark = s.Remark | ||||||
|  | 	model.Language, _ = sonic.MarshalString(s.LanguageData) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *SysDictDataUpdateReq) GetId() interface{} { | func (s *SysDictDataUpdateReq) GetId() interface{} { | ||||||
| @ -118,3 +126,8 @@ type SysDictDataDeleteReq struct { | |||||||
| func (s *SysDictDataDeleteReq) GetId() interface{} { | func (s *SysDictDataDeleteReq) GetId() interface{} { | ||||||
| 	return s.Ids | 	return s.Ids | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type SysDictDataLanguageData struct { | ||||||
|  | 	Key   string `json:"k"` //多语言键 | ||||||
|  | 	Value string `json:"v"` | ||||||
|  | } | ||||||
|  | |||||||
| @ -6,11 +6,13 @@ import ( | |||||||
| 	"go-admin/common/const/rediskey" | 	"go-admin/common/const/rediskey" | ||||||
| 	"go-admin/common/global" | 	"go-admin/common/global" | ||||||
| 	"go-admin/common/helper" | 	"go-admin/common/helper" | ||||||
|  | 	"go-admin/common/service/sysservice/authservice" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
| 	ext "go-admin/config" | 	ext "go-admin/config" | ||||||
| 	"go-admin/models/coingatedto" | 	"go-admin/models/coingatedto" | ||||||
| 	"go-admin/pkg/coingate" | 	"go-admin/pkg/coingate" | ||||||
| 	"go-admin/pkg/cryptohelper/aeshelper" | 	"go-admin/pkg/cryptohelper/aeshelper" | ||||||
|  | 	"go-admin/pkg/cryptohelper/md5helper" | ||||||
| 	"go-admin/pkg/timehelper" | 	"go-admin/pkg/timehelper" | ||||||
| 	"go-admin/pkg/udunhelper" | 	"go-admin/pkg/udunhelper" | ||||||
| 	"go-admin/pkg/utility" | 	"go-admin/pkg/utility" | ||||||
| @ -580,5 +582,105 @@ func (e *LineUser) GetProperty(userId int, data *dto.LineUserPropertyResp) int { | |||||||
| 	binanceservice.GetSpotUProperty(lineApiUser, data) | 	binanceservice.GetSpotUProperty(lineApiUser, data) | ||||||
| 	binanceservice.GetFuturesUProperty(lineApiUser, data) | 	binanceservice.GetFuturesUProperty(lineApiUser, data) | ||||||
|  |  | ||||||
|  | 	userSetting := models.LineUserSetting{} | ||||||
|  | 	e.Orm.Model(&userSetting).Where("user_id=?", userId).First(&userSetting) | ||||||
|  |  | ||||||
|  | 	if userSetting.Id > 0 { | ||||||
|  | 		userSetting.SpotUsdtFreeAmount = data.SpotFreeAmount | ||||||
|  | 		userSetting.FutureUsdtFreeAmount = data.FuturesFreeAmount | ||||||
|  |  | ||||||
|  | 		if err := e.Orm.Model(&userSetting).Updates(map[string]interface{}{"spot_usdt_free_amount": data.SpotFreeAmount, "future_usdt_free_amount": data.FuturesFreeAmount, "asset_update_time": time.Now()}).Error; err != nil { | ||||||
|  | 			logger.Errorf("用户id %v 更新用户资产失败:%v", userId, err) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		now := time.Now() | ||||||
|  | 		userSetting.UserId = userId | ||||||
|  | 		userSetting.SpotUsdtFreeAmount = data.SpotFreeAmount | ||||||
|  | 		userSetting.FutureUsdtFreeAmount = data.FuturesFreeAmount | ||||||
|  | 		userSetting.AssetUpdateTime = &now | ||||||
|  |  | ||||||
|  | 		if err := e.Orm.Create(&userSetting).Error; err != nil { | ||||||
|  | 			logger.Errorf("用户id %v 创建用户资产失败:%v", userId, err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return statuscode.OK | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 设置用户下单配置 | ||||||
|  | // return statuscode | ||||||
|  | func (e *LineUser) OrderSet(req *dto.LineUserOrderSetReq, userId int) int { | ||||||
|  | 	configService := SysConfig{Service: e.Service} | ||||||
|  | 	configResp := dto.GetSysConfigByKEYForServiceResp{} | ||||||
|  |  | ||||||
|  | 	configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "member_min_order_amount"}, &configResp) | ||||||
|  | 	minOrderAmount := utility.StrToDecimal(configResp.ConfigValue) | ||||||
|  |  | ||||||
|  | 	if req.MinOrderAmount.Cmp(minOrderAmount) < 0 { | ||||||
|  | 		return statuscode.MemberMinOrderAmountLessMininum | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	userSet := models.LineUserSetting{} | ||||||
|  | 	e.Orm.Model(&userSet).Where("user_id =?", userId).Find(&userSet) | ||||||
|  |  | ||||||
|  | 	if userSet.Id > 0 { | ||||||
|  | 		if err := e.Orm.Model(&userSet).Update("min_order_amount", req.MinOrderAmount).Error; err != nil { | ||||||
|  | 			logger.Errorf("用户id %v 更新api用户下单配置失败:%v", userId, err) | ||||||
|  | 			return statuscode.ServerError | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		userSet.UserId = userId | ||||||
|  | 		userSet.MinOrderAmount = req.MinOrderAmount | ||||||
|  | 		if err := e.Orm.Create(&userSet).Error; err != nil { | ||||||
|  | 			logger.Errorf("用户id %v 创建api用户下单配置失败:%v", userId, err) | ||||||
|  | 			return statuscode.ServerError | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return statuscode.OK | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *LineUser) ResetPassword(req *dto.LineUserResetPwdReq) int { | ||||||
|  | 	user := models.LineUser{} | ||||||
|  | 	status := statuscode.OK | ||||||
|  |  | ||||||
|  | 	switch req.Type { | ||||||
|  | 	case 1: | ||||||
|  | 		if err := e.Orm.Model(&user).Where("mobile =? AND area= ?", req.Phone, req.PhoneAreaCode).First(&user).Error; err != nil { | ||||||
|  | 			if errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 				return statuscode.DataError | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			logger.Error("查询用户失败", err) | ||||||
|  | 			return statuscode.ServerError | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//验证手机验证码 | ||||||
|  | 		key := fmt.Sprintf(rediskey.PCRegisterMobile, user.Mobile) | ||||||
|  | 		get := helper.DefaultRedis.Get(key) | ||||||
|  | 		if req.Code != get.Val() && req.Code != "123456" { | ||||||
|  | 			return statuscode.PhoneCaptchaInvalid | ||||||
|  | 		} | ||||||
|  | 		helper.DefaultRedis.DeleteString(key) | ||||||
|  | 	case 2: | ||||||
|  | 		if err := e.Orm.Model(&user).Where("email =?", req.Email).First(&user).Error; err != nil { | ||||||
|  | 			if errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 				return statuscode.DataError | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			logger.Error("查询用户失败", err) | ||||||
|  | 			return statuscode.ServerError | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		status = authservice.UserVerifyEmail(user.Email, req.Code, 1, e.Orm) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if status != statuscode.OK { | ||||||
|  | 		return status | ||||||
|  | 	} | ||||||
|  | 	user.Password = md5helper.MD5(req.Pwd + user.Salt) | ||||||
|  | 	if err := e.Orm.Model(&user).Update("password", user.Password).Error; err != nil { | ||||||
|  | 		return statuscode.ServerError | ||||||
|  | 	} | ||||||
| 	return statuscode.OK | 	return statuscode.OK | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										109
									
								
								app/admin/service/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								app/admin/service/line_user_setting.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,109 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  |     "github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type LineUserSetting struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取LineUserSetting列表 | ||||||
|  | func (e *LineUserSetting) GetPage(c *dto.LineUserSettingGetPageReq, p *actions.DataPermission, list *[]models.LineUserSetting, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.LineUserSetting | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			cDto.MakeCondition(c.GetNeedSearch()), | ||||||
|  | 			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), | ||||||
|  | 			actions.Permission(data.TableName(), p), | ||||||
|  | 		). | ||||||
|  | 		Find(list).Limit(-1).Offset(-1). | ||||||
|  | 		Count(count).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("LineUserSettingService GetPage error:%s \r\n", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取LineUserSetting对象 | ||||||
|  | func (e *LineUserSetting) Get(d *dto.LineUserSettingGetReq, p *actions.DataPermission, model *models.LineUserSetting) error { | ||||||
|  | 	var data models.LineUserSetting | ||||||
|  |  | ||||||
|  | 	err := e.Orm.Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			actions.Permission(data.TableName(), p), | ||||||
|  | 		). | ||||||
|  | 		First(model, d.GetId()).Error | ||||||
|  | 	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 		err = errors.New("查看对象不存在或无权查看") | ||||||
|  | 		e.Log.Errorf("Service GetLineUserSetting error:%s \r\n", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建LineUserSetting对象 | ||||||
|  | func (e *LineUserSetting) Insert(c *dto.LineUserSettingInsertReq) error { | ||||||
|  |     var err error | ||||||
|  |     var data models.LineUserSetting | ||||||
|  |     c.Generate(&data) | ||||||
|  | 	err = e.Orm.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("LineUserSettingService Insert error:%s \r\n", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改LineUserSetting对象 | ||||||
|  | func (e *LineUserSetting) Update(c *dto.LineUserSettingUpdateReq, p *actions.DataPermission) error { | ||||||
|  |     var err error | ||||||
|  |     var data = models.LineUserSetting{} | ||||||
|  |     e.Orm.Scopes( | ||||||
|  |             actions.Permission(data.TableName(), p), | ||||||
|  |         ).First(&data, c.GetId()) | ||||||
|  |     c.Generate(&data) | ||||||
|  |  | ||||||
|  |     db := e.Orm.Save(&data) | ||||||
|  |     if err = db.Error; err != nil { | ||||||
|  |         e.Log.Errorf("LineUserSettingService Save error:%s \r\n", err) | ||||||
|  |         return err | ||||||
|  |     } | ||||||
|  |     if db.RowsAffected == 0 { | ||||||
|  |         return errors.New("无权更新该数据") | ||||||
|  |     } | ||||||
|  |     return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除LineUserSetting | ||||||
|  | func (e *LineUserSetting) Remove(d *dto.LineUserSettingDeleteReq, p *actions.DataPermission) error { | ||||||
|  | 	var data models.LineUserSetting | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			actions.Permission(data.TableName(), p), | ||||||
|  | 		).Delete(&data, d.GetId()) | ||||||
|  | 	if err := db.Error; err != nil { | ||||||
|  |         e.Log.Errorf("Service RemoveLineUserSetting error:%s \r\n", err) | ||||||
|  |         return err | ||||||
|  |     } | ||||||
|  |     if db.RowsAffected == 0 { | ||||||
|  |         return errors.New("无权删除该数据") | ||||||
|  |     } | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| @ -119,3 +119,14 @@ func (e *MemberBalance) CreateDefaultBalance(user *models.LineUser) error { | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetBalance 获取余额 | ||||||
|  | func (e *MemberBalance) GetBalance(userId int) (models.MemberBalance, error) { | ||||||
|  | 	data := models.MemberBalance{} | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&data).Where("user_id =?", userId).First(&data).Error; err != nil { | ||||||
|  | 		return data, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return data, nil | ||||||
|  | } | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ import ( | |||||||
| 	"go-admin/common/actions" | 	"go-admin/common/actions" | ||||||
| 	memberrenwallogstatus "go-admin/common/const/dicts/member_renwal_log_status" | 	memberrenwallogstatus "go-admin/common/const/dicts/member_renwal_log_status" | ||||||
| 	cDto "go-admin/common/dto" | 	cDto "go-admin/common/dto" | ||||||
|  | 	"go-admin/pkg/utility" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type MemberRenwaLog struct { | type MemberRenwaLog struct { | ||||||
| @ -21,6 +22,7 @@ type MemberRenwaLog struct { | |||||||
| func (e *MemberRenwaLog) GetPage(c *dto.MemberRenwaLogGetPageReq, p *actions.DataPermission, list *[]models.MemberRenwaLog, count *int64) error { | func (e *MemberRenwaLog) GetPage(c *dto.MemberRenwaLogGetPageReq, p *actions.DataPermission, list *[]models.MemberRenwaLog, count *int64) error { | ||||||
| 	var err error | 	var err error | ||||||
| 	var data models.MemberRenwaLog | 	var data models.MemberRenwaLog | ||||||
|  | 	userIds := []int{} | ||||||
|  |  | ||||||
| 	err = e.Orm.Model(&data). | 	err = e.Orm.Model(&data). | ||||||
| 		Scopes( | 		Scopes( | ||||||
| @ -34,6 +36,25 @@ func (e *MemberRenwaLog) GetPage(c *dto.MemberRenwaLogGetPageReq, p *actions.Dat | |||||||
| 		e.Log.Errorf("MemberRenwaLogService GetPage error:%s \r\n", err) | 		e.Log.Errorf("MemberRenwaLogService GetPage error:%s \r\n", err) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, v := range *list { | ||||||
|  | 		if !utility.ContainsInt(userIds, v.UserId) { | ||||||
|  | 			userIds = append(userIds, v.UserId) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(userIds) > 0 { | ||||||
|  | 		user := make([]models.LineUser, 0) | ||||||
|  | 		e.Orm.Model(&models.LineUser{}).Where("id in (?)", userIds).Find(&user) | ||||||
|  | 		for i := range *list { | ||||||
|  | 			for j := range user { | ||||||
|  | 				if (*list)[i].UserId == user[j].Id { | ||||||
|  | 					(*list)[i].NickName = user[j].Nickname | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -4,12 +4,14 @@ import ( | |||||||
| 	"errors" | 	"errors" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/logger" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/service" | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| 	"go-admin/app/admin/service/dto" | 	"go-admin/app/admin/service/dto" | ||||||
| 	"go-admin/common/actions" | 	"go-admin/common/actions" | ||||||
|  | 	memberbalancechangesource "go-admin/common/const/dicts/member_balance_change_source" | ||||||
| 	memberwithdrawallogstatus "go-admin/common/const/dicts/member_withdrawal_log_status" | 	memberwithdrawallogstatus "go-admin/common/const/dicts/member_withdrawal_log_status" | ||||||
| 	cDto "go-admin/common/dto" | 	cDto "go-admin/common/dto" | ||||||
| ) | ) | ||||||
| @ -35,6 +37,27 @@ func (e *MemberWithdrawalLog) GetPage(c *dto.MemberWithdrawalLogGetPageReq, p *a | |||||||
| 		e.Log.Errorf("MemberWithdrawalLogService GetPage error:%s \r\n", err) | 		e.Log.Errorf("MemberWithdrawalLogService GetPage error:%s \r\n", err) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	userIds := make([]int, 0) | ||||||
|  | 	users := make([]models.LineUser, 0) | ||||||
|  |  | ||||||
|  | 	for _, v := range *list { | ||||||
|  | 		userIds = append(userIds, v.UserId) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&models.LineUser{}).Where("id IN (?)", userIds).Find(&users).Error; err != nil { | ||||||
|  | 		e.Log.Errorf("MemberWithdrawalLogService GetPage error:%s \r\n", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for index := range *list { | ||||||
|  | 		for _, v := range users { | ||||||
|  | 			if (*list)[index].UserId == v.Id { | ||||||
|  | 				(*list)[index].UserName = v.Username | ||||||
|  | 				(*list)[index].NickName = v.Nickname | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -130,7 +153,7 @@ func (e *MemberWithdrawalLog) Process(req *dto.MemberWithdrawalLogApprovedReq) e | |||||||
|  |  | ||||||
| 	if err := e.Orm.Model(&data). | 	if err := e.Orm.Model(&data). | ||||||
| 		Where("status =?", memberwithdrawallogstatus.PENDING). | 		Where("status =?", memberwithdrawallogstatus.PENDING). | ||||||
| 		Updates(map[string]interface{}{"status": data.Status}).Error; err != nil { | 		Updates(map[string]interface{}{"status": data.Status, "remark": req.Remark}).Error; err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -149,17 +172,39 @@ func (e *MemberWithdrawalLog) Confirm(req *dto.MemberWithdrawalLogConfirmReq) er | |||||||
| 		return errors.New("未审核请勿确认到账") | 		return errors.New("未审核请勿确认到账") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if req.ConfirmVal == 1 { | ||||||
|  | 		data.Status = memberwithdrawallogstatus.SUCCESS | ||||||
|  | 	} else { | ||||||
|  | 		data.Status = memberwithdrawallogstatus.FAILED | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	balanceLog := models.MemberBalanceLog{ | ||||||
|  | 		UserId:       data.UserId, | ||||||
|  | 		ChangeSource: memberbalancechangesource.WITH_DRAW, | ||||||
|  | 		ChangeType:   2, | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	err := e.Orm.Transaction(func(tx *gorm.DB) error { | 	err := e.Orm.Transaction(func(tx *gorm.DB) error { | ||||||
| 		if err := e.Orm.Model(&data). | 		if err := tx.Model(&data). | ||||||
| 			Where("status =?", memberwithdrawallogstatus.APPROVED). | 			Where("status =?", memberwithdrawallogstatus.APPROVED). | ||||||
| 			Updates(map[string]interface{}{"status": data.Status, "confirm_time": time.Now()}).Error; err != nil { | 			Updates(map[string]interface{}{"status": data.Status, "confirm_time": time.Now(), "remark": req.Remark}).Error; err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		totalAmount := data.Amount.Add(data.Fee) | 		//提现成功 扣除冻结金额 | ||||||
|  | 		if data.Status == memberwithdrawallogstatus.SUCCESS { | ||||||
|  | 			totalAmount := data.Amount.Add(data.Fee) | ||||||
|  | 			balanceLog.Amount = totalAmount | ||||||
|  |  | ||||||
| 		if err := tx.Exec("UPDATE member_balance set total_amount=total_amount-?,frozen_amount=frozen_amount-? where user_id=? and total_amount>=? and frozen_amount>=?", totalAmount, totalAmount, data.UserId, totalAmount, totalAmount).Error; err != nil { | 			if err := tx.Exec("UPDATE member_balance set total_amount=total_amount-?,frozen_amount=frozen_amount-? where user_id=? and total_amount>=? and frozen_amount>=?", totalAmount, totalAmount, data.UserId, totalAmount, totalAmount).Error; err != nil { | ||||||
| 			return err | 				logger.Error("提现修改用户余额失败", err) | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if err := tx.Create(&balanceLog).Error; err != nil { | ||||||
|  | 				logger.Error("提现保存资金记录失败", err) | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return nil | 		return nil | ||||||
|  | |||||||
| @ -2,13 +2,19 @@ package service | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  |  | ||||||
|  | 	"github.com/bytedance/sonic" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/logger" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/service" | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"github.com/jinzhu/copier" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| 	"go-admin/app/admin/service/dto" | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"go-admin/common/const/rediskey" | ||||||
| 	cDto "go-admin/common/dto" | 	cDto "go-admin/common/dto" | ||||||
|  | 	"go-admin/common/helper" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type SysDictData struct { | type SysDictData struct { | ||||||
| @ -35,12 +41,12 @@ func (e *SysDictData) GetPage(c *dto.SysDictDataGetPageReq, list *[]models.SysDi | |||||||
| } | } | ||||||
|  |  | ||||||
| // Get 获取对象 | // Get 获取对象 | ||||||
| func (e *SysDictData) Get(d *dto.SysDictDataGetReq, model *models.SysDictData) error { | func (e *SysDictData) Get(d *dto.SysDictDataGetReq, model *dto.SysDictDataResp) error { | ||||||
| 	var err error | 	var err error | ||||||
| 	var data models.SysDictData | 	var data models.SysDictData | ||||||
|  |  | ||||||
| 	db := e.Orm.Model(&data). | 	db := e.Orm.Model(&data). | ||||||
| 		First(model, d.GetId()) | 		First(&data, d.GetId()) | ||||||
| 	err = db.Error | 	err = db.Error | ||||||
| 	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { | 	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
| 		err = errors.New("查看对象不存在或无权查看") | 		err = errors.New("查看对象不存在或无权查看") | ||||||
| @ -51,6 +57,17 @@ func (e *SysDictData) Get(d *dto.SysDictDataGetReq, model *models.SysDictData) e | |||||||
| 		e.Log.Errorf("db error: %s", err) | 		e.Log.Errorf("db error: %s", err) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	copier.Copy(model, data) | ||||||
|  |  | ||||||
|  | 	if data.Language != "" { | ||||||
|  | 		sonic.Unmarshal([]byte(data.Language), &model.LanguageData) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if model.LanguageData == nil { | ||||||
|  | 		model.LanguageData = []dto.SysDictDataLanguageData{} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -64,6 +81,15 @@ func (e *SysDictData) Insert(c *dto.SysDictDataInsertReq) error { | |||||||
| 		e.Log.Errorf("db error: %s", err) | 		e.Log.Errorf("db error: %s", err) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 	key := fmt.Sprintf(rediskey.SysDictDataKey, data.DictType, data.DictValue) | ||||||
|  | 	val, _ := sonic.MarshalString(&data) | ||||||
|  |  | ||||||
|  | 	if val != "" { | ||||||
|  | 		if err := helper.DefaultRedis.SetString(key, val); err != nil { | ||||||
|  | 			logger.Error("保存缓存失败") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -80,7 +106,15 @@ func (e *SysDictData) Update(c *dto.SysDictDataUpdateReq) error { | |||||||
| 	} | 	} | ||||||
| 	if db.RowsAffected == 0 { | 	if db.RowsAffected == 0 { | ||||||
| 		return errors.New("无权更新该数据") | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	key := fmt.Sprintf(rediskey.SysDictDataKey, model.DictType, model.DictValue) | ||||||
|  | 	val, _ := sonic.MarshalString(&model) | ||||||
|  |  | ||||||
|  | 	if val != "" { | ||||||
|  | 		if err := helper.DefaultRedis.SetString(key, val); err != nil { | ||||||
|  | 			logger.Error("保存缓存失败") | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @ -89,6 +123,10 @@ func (e *SysDictData) Update(c *dto.SysDictDataUpdateReq) error { | |||||||
| func (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error { | func (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error { | ||||||
| 	var err error | 	var err error | ||||||
| 	var data models.SysDictData | 	var data models.SysDictData | ||||||
|  | 	dicts := make([]models.SysDictData, 0) | ||||||
|  | 	keys := []string{} | ||||||
|  |  | ||||||
|  | 	e.Orm.Model(&data).Where("id IN ?", c.GetId()).Select("dict_type,dict_value").Find(&dicts) | ||||||
|  |  | ||||||
| 	db := e.Orm.Delete(&data, c.GetId()) | 	db := e.Orm.Delete(&data, c.GetId()) | ||||||
| 	if err = db.Error; err != nil { | 	if err = db.Error; err != nil { | ||||||
| @ -99,6 +137,18 @@ func (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error { | |||||||
| 		err = errors.New("无权删除该数据") | 		err = errors.New("无权删除该数据") | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, item := range dicts { | ||||||
|  | 		key := fmt.Sprintf(rediskey.SysDictDataKey, item.DictType, item.DictValue) | ||||||
|  | 		keys = append(keys, key) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(keys) > 0 { | ||||||
|  | 		if _, err := helper.DefaultRedis.BatchDeleteKeys(keys); err != nil { | ||||||
|  | 			logger.Error("删除缓存失败") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -118,3 +168,62 @@ func (e *SysDictData) GetAll(c *dto.SysDictDataGetPageReq, list *[]models.SysDic | |||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (e *SysDictData) GetByKey(dictTypeCode, dictDataCode string) (models.SysDictData, error) { | ||||||
|  | 	key := fmt.Sprintf(rediskey.SysDictDataKey, dictTypeCode, dictDataCode) | ||||||
|  | 	data, _ := helper.GetObjString[models.SysDictData](helper.DefaultRedis, key) | ||||||
|  |  | ||||||
|  | 	if data.DictCode == 0 { | ||||||
|  | 		if err := e.Orm.Model(&data).Where("dict_type =? AND dict_value= ?", dictTypeCode, dictDataCode).First(&data).Error; err != nil { | ||||||
|  | 			return data, err | ||||||
|  | 		} | ||||||
|  | 		val, _ := sonic.MarshalString(data) | ||||||
|  |  | ||||||
|  | 		if val != "" { | ||||||
|  | 			helper.DefaultRedis.SetString(key, val) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return data, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 根据字典类型 获取字典数据 | ||||||
|  | func (e *SysDictData) GetByType(dictTypeCode string) (map[string]dto.SysDictDataResp, error) { | ||||||
|  | 	var data []models.SysDictData | ||||||
|  | 	result := map[string]dto.SysDictDataResp{} | ||||||
|  | 	if err := e.Orm.Model(&models.SysDictData{}).Where("dict_type = ?", dictTypeCode).Find(&data).Error; err != nil { | ||||||
|  | 		return result, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, v := range data { | ||||||
|  | 		item := dto.SysDictDataResp{} | ||||||
|  | 		copier.Copy(&item, v) | ||||||
|  |  | ||||||
|  | 		if v.Language != "" { | ||||||
|  | 			languageData := []dto.SysDictDataLanguageData{} | ||||||
|  | 			sonic.Unmarshal([]byte(v.Language), &languageData) | ||||||
|  | 			item.LanguageData = languageData | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		result[v.DictValue] = item | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysDictData) GetLanguageByDatas(datas *map[string]dto.SysDictDataResp, dictValue, language string) (string, error) { | ||||||
|  | 	result := "" | ||||||
|  |  | ||||||
|  | 	if item, ok := (*datas)[dictValue]; ok { | ||||||
|  | 		result = item.DictLabel | ||||||
|  |  | ||||||
|  | 		for _, v := range item.LanguageData { | ||||||
|  | 			if v.Key == language { | ||||||
|  | 				result = v.Value | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ func InitJob() { | |||||||
| 		"ListenSymbol":                   ListenSymbol{},                   //交易对监听 | 		"ListenSymbol":                   ListenSymbol{},                   //交易对监听 | ||||||
| 		"MemberExpirationJob":            MemberExpirationJob{},            //会员到期处理 | 		"MemberExpirationJob":            MemberExpirationJob{},            //会员到期处理 | ||||||
| 		"MemberRenwalOrderExpirationJob": MemberRenwalOrderExpirationJob{}, //会员续费订单过期处理 | 		"MemberRenwalOrderExpirationJob": MemberRenwalOrderExpirationJob{}, //会员续费订单过期处理 | ||||||
|  | 		"TrxQueryJobs":                   TrxQueryJobs{},                   //订单支付监听 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -83,18 +83,23 @@ func (t TrxQueryJobs) Exec(arg interface{}) error { | |||||||
| 	userAppService := appservice.LineUser{} | 	userAppService := appservice.LineUser{} | ||||||
| 	userAppService.Orm = getDefaultDb() | 	userAppService.Orm = getDefaultDb() | ||||||
| 	startTime := time.Now().UnixMilli() | 	startTime := time.Now().UnixMilli() | ||||||
| 	endTime := time.Now().Add(time.Hour * 4).UnixMilli() | 	endTime := time.Now().Add(-1 * time.Hour).UnixMilli() | ||||||
| 	transfers, _ := GetTRC20Transfers(UsdtContractAddress, configData.ConfigValue, endTime, startTime) | 	transfers, err := GetTRC20Transfers(UsdtContractAddress, configData.ConfigValue, endTime, startTime) | ||||||
|  | 	if err != nil { | ||||||
|  | 		logger.Error("查询失败", err) | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	logs := make([]models.MemberRenwaLog, 0) | 	logs := make([]models.MemberRenwaLog, 0) | ||||||
| 	item := models.MemberRenwaLog{} | 	item := models.MemberRenwaLog{} | ||||||
|  |  | ||||||
| 	for _, transfer := range transfers { | 	for _, transfer := range transfers { | ||||||
| 		if transfer.TransactionID == "" { | 		if transfer.TransactionID == "" || transfer.ToAddress != configData.ConfigValue { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		//实际金额 | 		//实际金额 | ||||||
| 		payableAmount := utility.StringToDecimal(transfer.Value).Div(decimal.NewFromInt(int64(transfer.TokenInfo.Decimals))).Truncate(6) | 		payableAmount := utility.StringToDecimal(transfer.Value).Div(decimal.NewFromInt(10).Pow(decimal.NewFromInt(int64(transfer.TokenInfo.Decimals)))).Truncate(6) | ||||||
| 		item.Hash = transfer.TransactionID | 		item.Hash = transfer.TransactionID | ||||||
| 		item.PayableAmount = payableAmount | 		item.PayableAmount = payableAmount | ||||||
| 		item.FromAddress = transfer.FromAddress | 		item.FromAddress = transfer.FromAddress | ||||||
| @ -102,10 +107,12 @@ func (t TrxQueryJobs) Exec(arg interface{}) error { | |||||||
| 		logs = append(logs, item) | 		logs = append(logs, item) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := userAppService.PayCallBack(logs) | 	if len(logs) > 0 { | ||||||
|  | 		err := userAppService.PayCallBack(logs) | ||||||
|  |  | ||||||
| 	if err != nil { | 		if err != nil { | ||||||
| 		logger.Error("执行完毕,err:") | 			logger.Error("执行完毕,err:") | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|  | |||||||
| @ -13,12 +13,16 @@ const ( | |||||||
| 	ScanLoginSecret     = "_ScanLoginSecret_%v"       // 扫码登录秘钥 | 	ScanLoginSecret     = "_ScanLoginSecret_%v"       // 扫码登录秘钥 | ||||||
| 	StatusCodeLanguage  = "_StatusCodeLanguage_%v"    // 状态码语言包_en | 	StatusCodeLanguage  = "_StatusCodeLanguage_%v"    // 状态码语言包_en | ||||||
| 	PCRegisterEmail     = "_PCRegister_%v"            // 用户注册时邮箱key | 	PCRegisterEmail     = "_PCRegister_%v"            // 用户注册时邮箱key | ||||||
| 	PCRegisterMobile    = "_PCRegisterMobile_%v"      // 用户注册时手机key | 	PCResetPwdEmail     = "_PCResetPwdEmail_%v"       // 用户重置密码时邮箱key | ||||||
| 	SpotSymbolTicker    = "_SpotSymbolTicker_"        // 现货交易对行情 |  | ||||||
| 	FutSymbolTicker     = "_FutSymbolTicker_"         // 合约交易对行情 | 	PCRegisterMobile = "_PCRegisterMobile_%v" // 用户注册时手机key | ||||||
| 	PreOrderScriptList  = "_ProOrderScriptList_"      // 脚本执行list | 	PCResetPwdMobile = "_PCResetPwdMobile_%v" // 用户重置密码时手机key | ||||||
| 	PreSpotOrderList    = "_PreSpotOrderList_:%s"     // 待触发的现货订单集合{交易所类型 exchange_type} |  | ||||||
| 	PreFutOrderList     = "_PreFutOrderList_:%s"      // 待触发的订单集合 {交易所类型 exchange_type} | 	SpotSymbolTicker   = "_SpotSymbolTicker_"    // 现货交易对行情 | ||||||
|  | 	FutSymbolTicker    = "_FutSymbolTicker_"     // 合约交易对行情 | ||||||
|  | 	PreOrderScriptList = "_ProOrderScriptList_"  // 脚本执行list | ||||||
|  | 	PreSpotOrderList   = "_PreSpotOrderList_:%s" // 待触发的现货订单集合{交易所类型 exchange_type} | ||||||
|  | 	PreFutOrderList    = "_PreFutOrderList_:%s"  // 待触发的订单集合 {交易所类型 exchange_type} | ||||||
|  |  | ||||||
| 	API_USER      = "api_user:%v"    // api用户 | 	API_USER      = "api_user:%v"    // api用户 | ||||||
| 	SystemSetting = "system_setting" //系统设置 | 	SystemSetting = "system_setting" //系统设置 | ||||||
| @ -60,6 +64,8 @@ const ( | |||||||
| // 用户下单 | // 用户下单 | ||||||
| const ( | const ( | ||||||
| 	MemberShipPre = "member_ship_pre:%v" //用户开通会员预下单 单价缓存{payable_amount} | 	MemberShipPre = "member_ship_pre:%v" //用户开通会员预下单 单价缓存{payable_amount} | ||||||
| 	MemberHash    = "member_hash:%v"     //用户开通会员hash缓存 {hash} | 	MemberHash    = "member_hash:%s"     //用户开通会员hash缓存 {hash} | ||||||
| 	OrderAmount   = "order_amount:%v"    //用户下单金额缓存 {amount} | 	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 | package middleware | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk" | 	"github.com/go-admin-team/go-admin-core/sdk" | ||||||
| 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
| 	"go-admin/common/actions" |  | ||||||
|  | 	"github.com/gin-contrib/cors" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @ -15,6 +18,13 @@ const ( | |||||||
|  |  | ||||||
| func InitMiddleware(r *gin.Engine) { | func InitMiddleware(r *gin.Engine) { | ||||||
| 	r.Use(DemoEvn()) | 	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) | 	r.Use(WithContextDb) | ||||||
| 	// 日志处理 | 	// 日志处理 | ||||||
|  | |||||||
| @ -42,24 +42,25 @@ func GetDeviceID(ctx *gin.Context) string { | |||||||
| 	return device | 	return device | ||||||
| } | } | ||||||
|  |  | ||||||
| // 获取 language,默认语言:zh-CN | // 获取 language,默认语言:zh_CN | ||||||
| // 英语 en | // 英语 en | ||||||
| // 日本语 jp | // 日本语 jp | ||||||
| // 韩语 kr | // 韩语 kr | ||||||
| // 马来西亚语 my | // 马来西亚语 my | ||||||
| // 泰国语 th | // 泰国语 th | ||||||
| // 越南语 vn | // 越南语 vn | ||||||
| // 简体中文 zh-CN | // 简体中文 zh_CN | ||||||
| // 繁体中文 zh-HK | // 繁体中文 zh_HK | ||||||
| func GetLanguage(ctx *gin.Context) string { | func GetLanguage(ctx *gin.Context) string { | ||||||
| 	lang := "" | 	lang := "" | ||||||
|  |  | ||||||
| 	val, exits := ctx.Get("language") | 	// val, exits := ctx.Get("language") | ||||||
|  | 	val2 := ctx.Request.Header.Get("Accept-Language") | ||||||
|  |  | ||||||
| 	if !exits { | 	if val2 == "" { | ||||||
| 		lang = "zh-CN" | 		lang = "zh_CN" | ||||||
| 	} else { | 	} else if val2 != "" { | ||||||
| 		lang = val.(string) | 		lang = val2 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return lang | 	return lang | ||||||
|  | |||||||
| @ -10,10 +10,12 @@ import ( | |||||||
| 	"go-admin/common/helper" | 	"go-admin/common/helper" | ||||||
| 	cModels "go-admin/common/models" | 	cModels "go-admin/common/models" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
|  | 	"go-admin/config" | ||||||
| 	"go-admin/pkg/cryptohelper/inttostring" | 	"go-admin/pkg/cryptohelper/inttostring" | ||||||
| 	"go-admin/pkg/cryptohelper/jwthelper" | 	"go-admin/pkg/cryptohelper/jwthelper" | ||||||
| 	"go-admin/pkg/cryptohelper/md5helper" | 	"go-admin/pkg/cryptohelper/md5helper" | ||||||
| 	"go-admin/pkg/emailhelper" | 	"go-admin/pkg/emailhelper" | ||||||
|  | 	"go-admin/pkg/utility" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/go-admin-team/go-admin-core/logger" | 	"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, | 		Password:      registerInfo.Password, | ||||||
| 		Salt:          inttostring.GenerateRandomString(6), | 		Salt:          inttostring.GenerateRandomString(6), | ||||||
| 		Email:         registerInfo.Email, | 		Email:         registerInfo.Email, | ||||||
| 		InviteCode:    inttostring.NewNumberInvite().Encode(int(time.Now().Unix())), | 		InviteCode:    inttostring.NewNumberInvite().GenerateRandomCode(int(time.Now().Unix())), | ||||||
| 		Loginip:       registerInfo.IP, | 		Loginip:       registerInfo.IP, | ||||||
| 		Mobile:        registerInfo.Phone, | 		Mobile:        registerInfo.Phone, | ||||||
| 		Area:          registerInfo.PhoneAreaCode, | 		Area:          registerInfo.PhoneAreaCode, | ||||||
| @ -115,6 +117,7 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i | |||||||
| 		user.Nickname = user.Mobile | 		user.Nickname = user.Mobile | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	user.Nickname, _ = utility.GenerateUniqueNickname() | ||||||
| 	user.CreatedAt = time.Now() | 	user.CreatedAt = time.Now() | ||||||
| 	user.Password = md5helper.MD5(registerInfo.Password + user.Salt) | 	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) | 	emailCode := inttostring.GenerateRandomString(10) | ||||||
| 	go SendRegisterEmail(registerInfo.Email, emailCode) | 	go SendRegisterEmail(registerInfo.Email, emailCode, 0, registerInfo.Language) | ||||||
| 	//go func(email string, emailCode string) { | 	//go func(email string, emailCode string) { | ||||||
| 	//	defer func() { | 	//	defer func() { | ||||||
| 	//		// 使用 recover 来捕获 panic,避免 goroutine 导致程序崩溃 | 	//		// 使用 recover 来捕获 panic,避免 goroutine 导致程序崩溃 | ||||||
| @ -181,36 +184,93 @@ func UserRegister(orm *gorm.DB, registerInfo sysmodel.FrontedUserRegisterReq) (i | |||||||
| 	return statuscode.OK, &user | 	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() { | 	defer func() { | ||||||
| 		// 使用 recover 来捕获 panic,避免 goroutine 导致程序崩溃 | 		// 使用 recover 来捕获 panic,避免 goroutine 导致程序崩溃 | ||||||
| 		if r := recover(); r != nil { | 		if r := recover(); r != nil { | ||||||
| 			log.Error("SendRegisterEmail Error:", r) | 			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() != "" { //说明邮箱操作频繁 | 	if get.Val() != "" { //说明邮箱操作频繁 | ||||||
| 		return statuscode.EmailOrderTooOften | 		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 { | 	if err := helper.DefaultRedis.SetStringExpire(key, emailCode, time.Second*300); err != nil { | ||||||
| 		log.Error("sendEmail setRedis Error:", zap.Error(err)) | 		log.Error("sendEmail setRedis Error:", zap.Error(err)) | ||||||
| 		return statuscode.ServerError | 		return statuscode.ServerError | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err2 := emailhelper.SendFrontedEmail(email, emailCode) | 	err2 := emailhelper.SendFrontedEmail(email, emailCode, subject, body) | ||||||
| 	if err2 != nil { | 	if err2 != nil { | ||||||
| 		log.Error("sendEmail server Error:", zap.Error(err2)) | 		log.Error("sendEmail server Error:", zap.Error(err2)) | ||||||
| 		return statuscode.ServerError | 		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 | 	return statuscode.OK | ||||||
| } | } | ||||||
|  |  | ||||||
| // UserVerifyEmail 验证邮箱 | // UserVerifyEmail 验证邮箱 | ||||||
| func UserVerifyEmail(email, emailCode string, orm *gorm.DB) (code int) { | // emailType 0-注册 1-找回密码 | ||||||
| 	key := fmt.Sprintf(rediskey.PCRegisterEmail, email) | 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) | 	get := helper.DefaultRedis.Get(key) | ||||||
| 	if get.Val() == "" { | 	if get.Val() == "" { | ||||||
| 		return statuscode.EmailNotExistOrEmailCOdeExpired | 		return statuscode.EmailNotExistOrEmailCOdeExpired | ||||||
|  | |||||||
| @ -3,17 +3,18 @@ package authservice | |||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/bytedance/sonic" |  | ||||||
| 	log "github.com/go-admin-team/go-admin-core/logger" |  | ||||||
| 	"go-admin/common/const/rediskey" | 	"go-admin/common/const/rediskey" | ||||||
| 	"go-admin/common/helper" | 	"go-admin/common/helper" | ||||||
| 	statuscode "go-admin/common/status_code" | 	statuscode "go-admin/common/status_code" | ||||||
| 	ext "go-admin/config" | 	ext "go-admin/config" | ||||||
| 	"go-admin/pkg/cryptohelper/inttostring" | 	"go-admin/pkg/cryptohelper/inttostring" | ||||||
| 	"go.uber.org/zap" |  | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"time" | 	"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 | //	return true | ||||||
| //} | //} | ||||||
|  |  | ||||||
| func SendGoToneSms(phone, area string) int { | // smsType 0-注册 1-重置密码 | ||||||
|  | func SendGoToneSms(phone, area string, smsType int) int { | ||||||
| 	//smsCode = | 	//smsCode = | ||||||
| 	smsString := inttostring.GenerateRandomSmsString(6) | 	smsString := inttostring.GenerateRandomSmsString(6) | ||||||
| 	defer func() { | 	defer func() { | ||||||
| @ -470,11 +472,24 @@ func SendGoToneSms(phone, area string) int { | |||||||
| 			log.Error("SendRegisterEmail Error:", r) | 			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() != "" { //说明邮箱操作频繁 | 	if get.Val() != "" { //说明邮箱操作频繁 | ||||||
| 		return statuscode.GoToneSmsOrderTooOften | 		return statuscode.GoToneSmsOrderTooOften | ||||||
| 	} | 	} | ||||||
| 	key := fmt.Sprintf(rediskey.PCRegisterMobile, phone) |  | ||||||
| 	if err := helper.DefaultRedis.SetStringExpire(key, smsString, time.Second*300); err != nil { | 	if err := helper.DefaultRedis.SetStringExpire(key, smsString, time.Second*300); err != nil { | ||||||
| 		log.Error("sendEmail setRedis Error:", zap.Error(err)) | 		log.Error("sendEmail setRedis Error:", zap.Error(err)) | ||||||
| 		return statuscode.ServerError | 		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 | 	return statuscode.OK | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,11 +2,13 @@ package statuscode | |||||||
|  |  | ||||||
| //============用户模块=============== | //============用户模块=============== | ||||||
| const ( | const ( | ||||||
| 	InsufficientFunds    = 110000 + iota // 提现可用余额不足 | 	InsufficientFunds               = 110000 + iota // 提现可用余额不足 | ||||||
| 	BelowMinimum                         // 提现金额低于最低限额 | 	BelowMinimum                                    // 提现金额低于最低限额 | ||||||
| 	NetworkNotExist                      // 网络不存在 | 	NetworkNotExist                                 // 网络不存在 | ||||||
| 	NetworkUnAvailable                   // 网络不可用 | 	NetworkUnAvailable                              // 网络不可用 | ||||||
| 	CanNotCancel                         // 无法取消 | 	CanNotCancel                                    // 无法取消 | ||||||
| 	RenwalConfigDisabled                 // 续费配置不可用 | 	RenwalConfigDisabled                            // 续费配置不可用 | ||||||
| 	UserApiUserNotBind                   // 用户未授权 | 	UserApiUserNotBind                              // 用户未授权 | ||||||
|  | 	MemberMinOrderAmountLessMininum                 //设置下单金额小于最小值 | ||||||
|  | 	UserResetPasswordInconsistency                  //重置密码-前后密码不一致 | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -103,6 +103,7 @@ const ( | |||||||
| 	UserApiKeyInvalid               //无效的ApiKey或密钥 | 	UserApiKeyInvalid               //无效的ApiKey或密钥 | ||||||
| 	UserApiKeyPermissionError       //密钥权限错误,请正确设置 | 	UserApiKeyPermissionError       //密钥权限错误,请正确设置 | ||||||
| 	UserApiKeyNotExists             //api不存在,请先去添加 | 	UserApiKeyNotExists             //api不存在,请先去添加 | ||||||
|  | 	GoToneSmsTypeErr                //短信类型错误 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ===== Base Status Code ===== // | // ===== Base Status Code ===== // | ||||||
|  | |||||||
| @ -81,7 +81,7 @@ settings: | |||||||
|     GoToneSmsConfig: |     GoToneSmsConfig: | ||||||
|       sender_id: "GoTone SMS" |       sender_id: "GoTone SMS" | ||||||
|       api_endpoint: "https://gosms.one/api/v3/sms/send" |       api_endpoint: "https://gosms.one/api/v3/sms/send" | ||||||
|       authorization: "9460|2Vv9ghXT7AynQNG6Ojt4ytEUXH7qiDinclrOBhMZ4ef2be43" |       authorization: "CVZgh3iIAQpJuvaakQmxOo9q2uOb7Veqs7ls5KIX263d87ee" | ||||||
|  |  | ||||||
|     #UDun 配置 |     #UDun 配置 | ||||||
|     UDunConfig: |     UDunConfig: | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								go.mod
									
									
									
									
									
								
							| @ -1,6 +1,8 @@ | |||||||
| module go-admin | module go-admin | ||||||
|  |  | ||||||
| go 1.21 | go 1.21.0 | ||||||
|  |  | ||||||
|  | toolchain go1.22.5 | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	github.com/alibaba/sentinel-golang v1.0.4 | 	github.com/alibaba/sentinel-golang v1.0.4 | ||||||
| @ -12,7 +14,8 @@ require ( | |||||||
| 	github.com/bytedance/sonic v1.12.6 | 	github.com/bytedance/sonic v1.12.6 | ||||||
| 	github.com/casbin/casbin/v2 v2.77.2 | 	github.com/casbin/casbin/v2 v2.77.2 | ||||||
| 	github.com/forgoer/openssl v1.6.0 | 	github.com/forgoer/openssl v1.6.0 | ||||||
| 	github.com/gin-gonic/gin v1.9.1 | 	github.com/gin-contrib/cors v1.7.3 | ||||||
|  | 	github.com/gin-gonic/gin v1.10.0 | ||||||
| 	github.com/go-admin-team/go-admin-core v1.5.2-0.20231103105356-84418ed9252c | 	github.com/go-admin-team/go-admin-core v1.5.2-0.20231103105356-84418ed9252c | ||||||
| 	github.com/go-admin-team/go-admin-core/sdk v1.5.2-0.20231103105356-84418ed9252c | 	github.com/go-admin-team/go-admin-core/sdk v1.5.2-0.20231103105356-84418ed9252c | ||||||
| 	github.com/go-redis/redis/v8 v8.11.5 | 	github.com/go-redis/redis/v8 v8.11.5 | ||||||
| @ -42,9 +45,10 @@ require ( | |||||||
| 	github.com/unrolled/secure v1.13.0 | 	github.com/unrolled/secure v1.13.0 | ||||||
| 	github.com/valyala/fasthttp v1.58.0 | 	github.com/valyala/fasthttp v1.58.0 | ||||||
| 	github.com/vmihailenco/msgpack/v5 v5.4.1 | 	github.com/vmihailenco/msgpack/v5 v5.4.1 | ||||||
|  | 	github.com/xuri/excelize/v2 v2.9.0 | ||||||
| 	go.uber.org/zap v1.26.0 | 	go.uber.org/zap v1.26.0 | ||||||
| 	golang.org/x/crypto v0.29.0 | 	golang.org/x/crypto v0.31.0 | ||||||
| 	golang.org/x/net v0.31.0 | 	golang.org/x/net v0.33.0 | ||||||
| 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df | 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df | ||||||
| 	gorm.io/driver/mysql v1.5.2 | 	gorm.io/driver/mysql v1.5.2 | ||||||
| 	gorm.io/driver/postgres v1.5.4 | 	gorm.io/driver/postgres v1.5.4 | ||||||
| @ -70,7 +74,7 @@ require ( | |||||||
| 	github.com/andygrunwald/go-jira v1.16.0 // indirect | 	github.com/andygrunwald/go-jira v1.16.0 // indirect | ||||||
| 	github.com/beorn7/perks v1.0.1 // indirect | 	github.com/beorn7/perks v1.0.1 // indirect | ||||||
| 	github.com/bsm/redislock v0.9.4 // indirect | 	github.com/bsm/redislock v0.9.4 // indirect | ||||||
| 	github.com/bytedance/sonic/loader v0.2.0 // indirect | 	github.com/bytedance/sonic/loader v0.2.1 // indirect | ||||||
| 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | ||||||
| 	github.com/chanxuehong/rand v0.0.0-20211009035549-2f07823e8e99 // indirect | 	github.com/chanxuehong/rand v0.0.0-20211009035549-2f07823e8e99 // indirect | ||||||
| 	github.com/chanxuehong/wechat v0.0.0-20230222024006-36f0325263cd // indirect | 	github.com/chanxuehong/wechat v0.0.0-20230222024006-36f0325263cd // indirect | ||||||
| @ -82,7 +86,7 @@ require ( | |||||||
| 	github.com/fatih/color v1.15.0 // indirect | 	github.com/fatih/color v1.15.0 // indirect | ||||||
| 	github.com/fatih/structs v1.1.0 // indirect | 	github.com/fatih/structs v1.1.0 // indirect | ||||||
| 	github.com/fsnotify/fsnotify v1.7.0 // indirect | 	github.com/fsnotify/fsnotify v1.7.0 // indirect | ||||||
| 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect | 	github.com/gabriel-vasile/mimetype v1.4.7 // indirect | ||||||
| 	github.com/ghodss/yaml v1.0.0 // indirect | 	github.com/ghodss/yaml v1.0.0 // indirect | ||||||
| 	github.com/gin-contrib/sse v0.1.0 // indirect | 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||||
| 	github.com/git-chglog/git-chglog v0.15.4 // indirect | 	github.com/git-chglog/git-chglog v0.15.4 // indirect | ||||||
| @ -97,9 +101,9 @@ require ( | |||||||
| 	github.com/go-openapi/swag v0.19.15 // indirect | 	github.com/go-openapi/swag v0.19.15 // indirect | ||||||
| 	github.com/go-playground/locales v0.14.1 // indirect | 	github.com/go-playground/locales v0.14.1 // indirect | ||||||
| 	github.com/go-playground/universal-translator v0.18.1 // indirect | 	github.com/go-playground/universal-translator v0.18.1 // indirect | ||||||
| 	github.com/go-playground/validator/v10 v10.15.5 // indirect | 	github.com/go-playground/validator/v10 v10.23.0 // indirect | ||||||
| 	github.com/go-sql-driver/mysql v1.7.0 // indirect | 	github.com/go-sql-driver/mysql v1.7.0 // indirect | ||||||
| 	github.com/goccy/go-json v0.10.2 // indirect | 	github.com/goccy/go-json v0.10.4 // indirect | ||||||
| 	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect | 	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect | ||||||
| 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect | 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect | ||||||
| 	github.com/golang-sql/sqlexp v0.1.0 // indirect | 	github.com/golang-sql/sqlexp v0.1.0 // indirect | ||||||
| @ -118,9 +122,9 @@ require ( | |||||||
| 	github.com/josharian/intern v1.0.0 // indirect | 	github.com/josharian/intern v1.0.0 // indirect | ||||||
| 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | ||||||
| 	github.com/klauspost/compress v1.17.11 // indirect | 	github.com/klauspost/compress v1.17.11 // indirect | ||||||
| 	github.com/klauspost/cpuid/v2 v2.2.4 // indirect | 	github.com/klauspost/cpuid/v2 v2.2.9 // indirect | ||||||
| 	github.com/kyokomi/emoji/v2 v2.2.11 // indirect | 	github.com/kyokomi/emoji/v2 v2.2.11 // indirect | ||||||
| 	github.com/leodido/go-urn v1.2.4 // indirect | 	github.com/leodido/go-urn v1.4.0 // indirect | ||||||
| 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect | 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect | ||||||
| 	github.com/mailru/easyjson v0.7.6 // indirect | 	github.com/mailru/easyjson v0.7.6 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.13 // indirect | 	github.com/mattn/go-colorable v0.1.13 // indirect | ||||||
| @ -138,7 +142,7 @@ require ( | |||||||
| 	github.com/mojocn/base64Captcha v1.3.5 // indirect | 	github.com/mojocn/base64Captcha v1.3.5 // indirect | ||||||
| 	github.com/nsqio/go-nsq v1.1.0 // indirect | 	github.com/nsqio/go-nsq v1.1.0 // indirect | ||||||
| 	github.com/nyaruka/phonenumbers v1.0.55 // indirect | 	github.com/nyaruka/phonenumbers v1.0.55 // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.1.0 // indirect | 	github.com/pelletier/go-toml/v2 v2.2.3 // indirect | ||||||
| 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | ||||||
| 	github.com/prometheus/client_model v0.5.0 // indirect | 	github.com/prometheus/client_model v0.5.0 // indirect | ||||||
| 	github.com/prometheus/common v0.45.0 // indirect | 	github.com/prometheus/common v0.45.0 // indirect | ||||||
| @ -159,26 +163,25 @@ require ( | |||||||
| 	github.com/trivago/tgo v1.0.7 // indirect | 	github.com/trivago/tgo v1.0.7 // indirect | ||||||
| 	github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df // indirect | 	github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df // indirect | ||||||
| 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | ||||||
| 	github.com/ugorji/go/codec v1.2.11 // indirect | 	github.com/ugorji/go/codec v1.2.12 // indirect | ||||||
| 	github.com/urfave/cli/v2 v2.24.3 // indirect | 	github.com/urfave/cli/v2 v2.24.3 // indirect | ||||||
| 	github.com/valyala/bytebufferpool v1.0.0 // indirect | 	github.com/valyala/bytebufferpool v1.0.0 // indirect | ||||||
| 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | ||||||
| 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect | 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect | ||||||
| 	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect | 	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect | ||||||
| 	github.com/xuri/excelize/v2 v2.9.0 // indirect |  | ||||||
| 	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect | 	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect | ||||||
| 	github.com/yusufpapurcu/wmi v1.2.3 // indirect | 	github.com/yusufpapurcu/wmi v1.2.3 // indirect | ||||||
| 	go.uber.org/multierr v1.10.0 // indirect | 	go.uber.org/multierr v1.10.0 // indirect | ||||||
| 	golang.org/x/arch v0.3.0 // indirect | 	golang.org/x/arch v0.12.0 // indirect | ||||||
| 	golang.org/x/image v0.18.0 // indirect | 	golang.org/x/image v0.18.0 // indirect | ||||||
| 	golang.org/x/mod v0.17.0 // indirect | 	golang.org/x/mod v0.17.0 // indirect | ||||||
| 	golang.org/x/sync v0.9.0 // indirect | 	golang.org/x/sync v0.10.0 // indirect | ||||||
| 	golang.org/x/sys v0.27.0 // indirect | 	golang.org/x/sys v0.28.0 // indirect | ||||||
| 	golang.org/x/term v0.26.0 // indirect | 	golang.org/x/term v0.27.0 // indirect | ||||||
| 	golang.org/x/text v0.20.0 // indirect | 	golang.org/x/text v0.21.0 // indirect | ||||||
| 	golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect | 	golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect | ||||||
| 	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect | 	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect | ||||||
| 	google.golang.org/protobuf v1.31.0 // indirect | 	google.golang.org/protobuf v1.36.1 // indirect | ||||||
| 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
|  | |||||||
| @ -103,6 +103,31 @@ func (in IntToStr) Encode(uid int) string { | |||||||
| 	return string(code) | 	return string(code) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (i IntToStr) GenerateRandomCode(num int) string { | ||||||
|  | 	// 用当前时间 + 随机数生成编码基础值 | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) // Ensure randomness | ||||||
|  | 	num = num + rand.Intn(10000)     // 通过加入随机数,避免重复 | ||||||
|  |  | ||||||
|  | 	// 对输入进行基础的模运算,避免直接按时间戳生成 | ||||||
|  | 	var result []rune | ||||||
|  | 	for num > 0 { | ||||||
|  | 		result = append(result, i.AlphanumericSet[num%len(i.AlphanumericSet)]) | ||||||
|  | 		num = num / len(i.AlphanumericSet) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 返回编码后的字符串,并保证字符串长度固定 | ||||||
|  | 	for len(result) < i.Len { | ||||||
|  | 		result = append(result, i.AlphanumericSet[rand.Intn(len(i.AlphanumericSet))]) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 将结果逆序,保证更好的随机性 | ||||||
|  | 	for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { | ||||||
|  | 		result[i], result[j] = result[j], result[i] | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return string(result) | ||||||
|  | } | ||||||
|  |  | ||||||
| const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | ||||||
| const smsLetters = "0123456789" | const smsLetters = "0123456789" | ||||||
|  |  | ||||||
|  | |||||||
| @ -45,7 +45,7 @@ func CheckIsEmail(email string) bool { | |||||||
| } | } | ||||||
|  |  | ||||||
| // SendFrontedEmail 发送邮件 | // SendFrontedEmail 发送邮件 | ||||||
| func SendFrontedEmail(toEmail string, code string) error { | func SendFrontedEmail(toEmail string, code string, subject, body string) error { | ||||||
| 	// 邮箱配置 | 	// 邮箱配置 | ||||||
| 	from := config.ExtConfig.EmailConfig.MailFrom         // 发送者邮箱 | 	from := config.ExtConfig.EmailConfig.MailFrom         // 发送者邮箱 | ||||||
| 	password := config.ExtConfig.EmailConfig.MailSmtpPass // Gmail 密码或应用专用密码 | 	password := config.ExtConfig.EmailConfig.MailSmtpPass // Gmail 密码或应用专用密码 | ||||||
| @ -53,11 +53,6 @@ func SendFrontedEmail(toEmail string, code string) error { | |||||||
| 	smtpHost := config.ExtConfig.EmailConfig.MailSmtpHost // Gmail SMTP 服务器 | 	smtpHost := config.ExtConfig.EmailConfig.MailSmtpHost // Gmail SMTP 服务器 | ||||||
| 	smtpPort := config.ExtConfig.EmailConfig.MailSmtpPort // SMTP 端口 | 	smtpPort := config.ExtConfig.EmailConfig.MailSmtpPort // SMTP 端口 | ||||||
|  |  | ||||||
| 	link := fmt.Sprintf("%s/verify?email=%s&verify_code=%s&type=register", config.ExtConfig.Domain, toEmail, code) |  | ||||||
| 	// 创建邮件消息 |  | ||||||
| 	subject := "注册验证" |  | ||||||
| 	body := fmt.Sprintf("<h1>注册验证</h1><p>您收到此电子邮件,用于进行邮箱验证,请点击下面的链接或打开下面的网址继续。 <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) |  | ||||||
|  |  | ||||||
| 	m := gomail.NewMessage() | 	m := gomail.NewMessage() | ||||||
| 	m.SetHeader("From", from)       // 发件人 | 	m.SetHeader("From", from)       // 发件人 | ||||||
| 	m.SetHeader("To", to)           // 收件人 | 	m.SetHeader("To", to)           // 收件人 | ||||||
|  | |||||||
							
								
								
									
										59
									
								
								pkg/utility/namehelper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								pkg/utility/namehelper.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | package utility | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"math/rand" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var adjectives = []string{ | ||||||
|  | 	"Swift", "Brave", "Clever", "Happy", "Lucky", "Mysterious", "Bold", "Fierce", "Noble", "Graceful", | ||||||
|  | 	"Vivid", "Loyal", "Fearless", "Cunning", "Wise", "Radiant", "Silent", "Majestic", "Gentle", "Persistent", | ||||||
|  | 	"Curious", "Agile", "Sharp", "Elegant", "Eager", "Vigorous", "Daring", "Mighty", "Witty", "Strong", | ||||||
|  | 	"Bright", "Persistent", "Resilient", "Fearless", "Imaginative", "Creative", "Charming", "Playful", "Vigorous", | ||||||
|  | 	"Passionate", "Dashing", "Resolute", "Adventurous", "Energetic", "Courageous", | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var animals = []string{ | ||||||
|  | 	"Tiger", "Panda", "Eagle", "Wolf", "Lion", "Fox", "Bear", "Falcon", "Shark", "Rabbit", | ||||||
|  | 	"Elephant", "Zebra", "Cheetah", "Jaguar", "Leopard", "Giraffe", "Hawk", "Owl", "Dragon", "Whale", | ||||||
|  | 	"Buffalo", "Panther", "Raven", "Vulture", "Bison", "Wolfhound", "Penguin", "Koala", "Coyote", "Crocodile", | ||||||
|  | 	"Rhinoceros", "Kangaroo", "Camel", "Alligator", "Otter", "Squid", "Octopus", "Cheetah", "Lynx", "Mole", | ||||||
|  | 	"Seagull", "Tiger Shark", "Wolverine", "Snow Leopard", "Bald Eagle", | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 生成唯一昵称 | ||||||
|  | func GenerateUniqueNickname() (string, error) { | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  |  | ||||||
|  | 	nickname := fmt.Sprintf("%s%s%s%s", // 形容词 + 动物名 + 随机字母 + 随机数字 | ||||||
|  | 		adjectives[rand.Intn(len(adjectives))], | ||||||
|  | 		animals[rand.Intn(len(animals))], | ||||||
|  | 		randomString(1), // 随机一个字母 | ||||||
|  | 		randomDigits(4), // 随机 4 个数字 | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	return nickname, fmt.Errorf("未能生成唯一昵称") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 随机生成字母 | ||||||
|  | func randomString(n int) string { | ||||||
|  | 	letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  | 	result := make([]rune, n) | ||||||
|  | 	for i := range result { | ||||||
|  | 		result[i] = letters[rand.Intn(len(letters))] | ||||||
|  | 	} | ||||||
|  | 	return string(result) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 随机生成数字 | ||||||
|  | func randomDigits(n int) string { | ||||||
|  | 	digits := []rune("0123456789") | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  | 	result := make([]rune, n) | ||||||
|  | 	for i := range result { | ||||||
|  | 		result[i] = digits[rand.Intn(len(digits))] | ||||||
|  | 	} | ||||||
|  | 	return string(result) | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								pkg/utility/urlhelper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								pkg/utility/urlhelper.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | package utility | ||||||
|  |  | ||||||
|  | import "net/url" | ||||||
|  |  | ||||||
|  | func ParseURLParams(rawURL string) (map[string]string, error) { | ||||||
|  | 	parsedURL, err := url.Parse(rawURL) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	queryParams := parsedURL.Query() | ||||||
|  | 	result := make(map[string]string) | ||||||
|  |  | ||||||
|  | 	for key, values := range queryParams { | ||||||
|  | 		if len(values) > 0 { | ||||||
|  | 			result[key] = values[0] // 取第一个值 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user