This commit is contained in:
2025-05-13 15:44:44 +08:00
parent 20a741ae11
commit 8e2324df0e
32 changed files with 2840 additions and 44 deletions

View File

@ -0,0 +1,193 @@
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 WmTransfer struct {
api.Api
}
// GetPage 获取批量转账任务列表
// @Summary 获取批量转账任务列表
// @Description 获取批量转账任务列表
// @Tags 批量转账任务
// @Param type query int64 false "类型 0-百分比 1-实际金额"
// @Param transferType query int64 false "转账类型 0-批量转出 1-批量汇总"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.WmTransfer}} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-transfer [get]
// @Security Bearer
func (e WmTransfer) GetPage(c *gin.Context) {
req := dto.WmTransferGetPageReq{}
s := service.WmTransfer{}
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.WmTransfer, 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.WmTransfer} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-transfer/{id} [get]
// @Security Bearer
func (e WmTransfer) Get(c *gin.Context) {
req := dto.WmTransferGetReq{}
s := service.WmTransfer{}
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.WmTransfer
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.WmTransferInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/wm-transfer [post]
// @Security Bearer
func (e WmTransfer) Insert(c *gin.Context) {
req := dto.WmTransferInsertReq{}
s := service.WmTransfer{}
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.WmTransferUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/wm-transfer/{id} [put]
// @Security Bearer
func (e WmTransfer) Update(c *gin.Context) {
req := dto.WmTransferUpdateReq{}
s := service.WmTransfer{}
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.WmTransferDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/wm-transfer [delete]
// @Security Bearer
func (e WmTransfer) Delete(c *gin.Context) {
s := service.WmTransfer{}
req := dto.WmTransferDeleteReq{}
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(), "删除成功")
}

View 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 WmTransferItem 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.WmTransferItem}} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-transfer-item [get]
// @Security Bearer
func (e WmTransferItem) GetPage(c *gin.Context) {
req := dto.WmTransferItemGetPageReq{}
s := service.WmTransferItem{}
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.WmTransferItem, 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.WmTransferItem} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-transfer-item/{id} [get]
// @Security Bearer
func (e WmTransferItem) Get(c *gin.Context) {
req := dto.WmTransferItemGetReq{}
s := service.WmTransferItem{}
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.WmTransferItem
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.WmTransferItemInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/wm-transfer-item [post]
// @Security Bearer
func (e WmTransferItem) Insert(c *gin.Context) {
req := dto.WmTransferItemInsertReq{}
s := service.WmTransferItem{}
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.WmTransferItemUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/wm-transfer-item/{id} [put]
// @Security Bearer
func (e WmTransferItem) Update(c *gin.Context) {
req := dto.WmTransferItemUpdateReq{}
s := service.WmTransferItem{}
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.WmTransferItemDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/wm-transfer-item [delete]
// @Security Bearer
func (e WmTransferItem) Delete(c *gin.Context) {
s := service.WmTransferItem{}
req := dto.WmTransferItemDeleteReq{}
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(), "删除成功")
}

View File

@ -0,0 +1,154 @@
package apis
import (
"fmt"
"strings"
"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 WmWalletInfo struct {
api.Api
}
// GetPage 获取钱包信息列表
// @Summary 获取钱包信息列表
// @Description 获取钱包信息列表
// @Tags 钱包信息
// @Param privateKey query string false "钱包私钥"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.WmWalletInfo}} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-wallet-info [get]
// @Security Bearer
func (e WmWalletInfo) GetPage(c *gin.Context) {
req := dto.WmWalletInfoGetPageReq{}
s := service.WmWalletInfo{}
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.WmWalletInfo, 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.WmWalletInfo} "{"code": 200, "data": [...]}"
// @Router /api/v1/wm-wallet-info/{id} [get]
// @Security Bearer
func (e WmWalletInfo) Get(c *gin.Context) {
req := dto.WmWalletInfoGetReq{}
s := service.WmWalletInfo{}
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.WmWalletInfo
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.WmWalletInfoInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/wm-wallet-info [post]
// @Security Bearer
func (e WmWalletInfo) Insert(c *gin.Context) {
req := dto.WmWalletInfoBatchInsertReq{}
s := service.WmWalletInfo{}
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))
errs := s.Insert(&req)
e.OK(strings.Join(errs, "<br/>"), "创建成功")
}
// Delete 删除钱包信息
// @Summary 删除钱包信息
// @Description 删除钱包信息
// @Tags 钱包信息
// @Param data body dto.WmWalletInfoDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/wm-wallet-info [delete]
// @Security Bearer
func (e WmWalletInfo) Delete(c *gin.Context) {
s := service.WmWalletInfo{}
req := dto.WmWalletInfoDeleteReq{}
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(), "删除成功")
}

View File

@ -0,0 +1,31 @@
package models
import (
"go-admin/common/models"
)
type WmTransfer struct {
models.Model
Type int64 `json:"type" gorm:"type:tinyint;comment:类型 0-百分比 1-实际金额"`
TransferType int64 `json:"transferType" gorm:"type:tinyint;comment:转账类型 0-批量转出 1-批量汇总"`
Status int64 `json:"status" gorm:"type:tinyint;comment:状态"`
Remark string `json:"remark" gorm:"type:varchar(255);comment:备注信息"`
models.ModelTime
models.ControlBy
}
func (WmTransfer) TableName() string {
return "wm_transfer"
}
func (e *WmTransfer) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *WmTransfer) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,34 @@
package models
import (
"go-admin/common/models"
)
type WmTransferItem struct {
models.Model
TokenAddress string `json:"tokenAddress" gorm:"type:varchar(50);comment:代币地址"`
FromAddress string `json:"fromAddress" gorm:"type:varchar(50);comment:来源地址"`
ToAddress string `json:"toAddress" gorm:"type:varchar(50);comment:目标地址"`
Amount string `json:"amount" gorm:"type:decimal(18,8);comment:代币数量"`
Type string `json:"type" gorm:"type:tinyint;comment:类型 0-主账号百分比 1-实际数量"`
TypeValue string `json:"typeValue" gorm:"type:decimal(18,8);comment:操作类型值"`
PrivateKey string `json:"privateKey" gorm:"type:varchar(255);comment:私钥"`
models.ModelTime
models.ControlBy
}
func (WmTransferItem) TableName() string {
return "wm_transfer_item"
}
func (e *WmTransferItem) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *WmTransferItem) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,30 @@
package models
import (
"go-admin/common/models"
"github.com/shopspring/decimal"
)
type WmWalletInfo struct {
models.Model
PrivateKey string `json:"privateKey" gorm:"type:varchar(50);comment:钱包私钥"`
Address string `json:"address" gorm:"type:varchar(50);comment:钱包地址"`
UsdcAmount decimal.Decimal `json:"usdcAmount" gorm:"type:decimal(18,8);comment:USDC余额"`
models.ModelTime
models.ControlBy
}
func (WmWalletInfo) TableName() string {
return "wm_wallet_info"
}
func (e *WmWalletInfo) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *WmWalletInfo) GetId() interface{} {
return e.Id
}

View 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, registerWmTransferRouter)
}
// registerWmTransferRouter
func registerWmTransferRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.WmTransfer{}
r := v1.Group("/wm-transfer").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)
}
}

View 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, registerWmTransferItemRouter)
}
// registerWmTransferItemRouter
func registerWmTransferItemRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.WmTransferItem{}
r := v1.Group("/wm-transfer-item").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)
}
}

View 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/actions"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerWmWalletInfoRouter)
}
// registerWmWalletInfoRouter
func registerWmWalletInfoRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.WmWalletInfo{}
r := v1.Group("/wm-wallet-info").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)
}
}

View File

@ -0,0 +1,98 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type WmTransferGetPageReq struct {
dto.Pagination `search:"-"`
Type int64 `form:"type" search:"type:exact;column:type;table:wm_transfer" comment:"类型 0-百分比 1-实际金额"`
TransferType int64 `form:"transferType" search:"type:exact;column:transfer_type;table:wm_transfer" comment:"转账类型 0-批量转出 1-批量汇总"`
WmTransferOrder
}
type WmTransferOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:wm_transfer"`
Type string `form:"typeOrder" search:"type:order;column:type;table:wm_transfer"`
TransferType string `form:"transferTypeOrder" search:"type:order;column:transfer_type;table:wm_transfer"`
Status string `form:"statusOrder" search:"type:order;column:status;table:wm_transfer"`
Remark string `form:"remarkOrder" search:"type:order;column:remark;table:wm_transfer"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:wm_transfer"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:wm_transfer"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:wm_transfer"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:wm_transfer"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:wm_transfer"`
}
func (m *WmTransferGetPageReq) GetNeedSearch() interface{} {
return *m
}
type WmTransferInsertReq struct {
Id int `json:"-" comment:"主键id"` // 主键id
Type int64 `json:"type" comment:"类型 0-百分比 1-实际金额"`
TransferType int64 `json:"transferType" comment:"转账类型 0-批量转出 1-批量汇总"`
Status int64 `json:"status" comment:"状态"`
Remark string `json:"remark" comment:"备注信息"`
common.ControlBy
}
func (s *WmTransferInsertReq) Generate(model *models.WmTransfer) {
if s.Id == 0 {
model.Model = common.Model{ Id: s.Id }
}
model.Type = s.Type
model.TransferType = s.TransferType
model.Status = s.Status
model.Remark = s.Remark
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *WmTransferInsertReq) GetId() interface{} {
return s.Id
}
type WmTransferUpdateReq struct {
Id int `uri:"id" comment:"主键id"` // 主键id
Type int64 `json:"type" comment:"类型 0-百分比 1-实际金额"`
TransferType int64 `json:"transferType" comment:"转账类型 0-批量转出 1-批量汇总"`
Status int64 `json:"status" comment:"状态"`
Remark string `json:"remark" comment:"备注信息"`
common.ControlBy
}
func (s *WmTransferUpdateReq) Generate(model *models.WmTransfer) {
if s.Id == 0 {
model.Model = common.Model{ Id: s.Id }
}
model.Type = s.Type
model.TransferType = s.TransferType
model.Status = s.Status
model.Remark = s.Remark
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *WmTransferUpdateReq) GetId() interface{} {
return s.Id
}
// WmTransferGetReq 功能获取请求参数
type WmTransferGetReq struct {
Id int `uri:"id"`
}
func (s *WmTransferGetReq) GetId() interface{} {
return s.Id
}
// WmTransferDeleteReq 功能删除请求参数
type WmTransferDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *WmTransferDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,111 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type WmTransferItemGetPageReq struct {
dto.Pagination `search:"-"`
WmTransferItemOrder
}
type WmTransferItemOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:wm_transfer_item"`
TokenAddress string `form:"tokenAddressOrder" search:"type:order;column:token_address;table:wm_transfer_item"`
FromAddress string `form:"fromAddressOrder" search:"type:order;column:from_address;table:wm_transfer_item"`
ToAddress string `form:"toAddressOrder" search:"type:order;column:to_address;table:wm_transfer_item"`
Amount string `form:"amountOrder" search:"type:order;column:amount;table:wm_transfer_item"`
Type string `form:"typeOrder" search:"type:order;column:type;table:wm_transfer_item"`
TypeValue string `form:"typeValueOrder" search:"type:order;column:type_value;table:wm_transfer_item"`
PrivateKey string `form:"privateKeyOrder" search:"type:order;column:private_key;table:wm_transfer_item"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:wm_transfer_item"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:wm_transfer_item"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:wm_transfer_item"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:wm_transfer_item"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:wm_transfer_item"`
}
func (m *WmTransferItemGetPageReq) GetNeedSearch() interface{} {
return *m
}
type WmTransferItemInsertReq struct {
Id int `json:"-" comment:"主键id"` // 主键id
TokenAddress string `json:"tokenAddress" comment:"代币地址"`
FromAddress string `json:"fromAddress" comment:"来源地址"`
ToAddress string `json:"toAddress" comment:"目标地址"`
Amount string `json:"amount" comment:"代币数量"`
Type string `json:"type" comment:"类型 0-主账号百分比 1-实际数量"`
TypeValue string `json:"typeValue" comment:"操作类型值"`
PrivateKey string `json:"privateKey" comment:"私钥"`
common.ControlBy
}
func (s *WmTransferItemInsertReq) Generate(model *models.WmTransferItem) {
if s.Id == 0 {
model.Model = common.Model{ Id: s.Id }
}
model.TokenAddress = s.TokenAddress
model.FromAddress = s.FromAddress
model.ToAddress = s.ToAddress
model.Amount = s.Amount
model.Type = s.Type
model.TypeValue = s.TypeValue
model.PrivateKey = s.PrivateKey
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *WmTransferItemInsertReq) GetId() interface{} {
return s.Id
}
type WmTransferItemUpdateReq struct {
Id int `uri:"id" comment:"主键id"` // 主键id
TokenAddress string `json:"tokenAddress" comment:"代币地址"`
FromAddress string `json:"fromAddress" comment:"来源地址"`
ToAddress string `json:"toAddress" comment:"目标地址"`
Amount string `json:"amount" comment:"代币数量"`
Type string `json:"type" comment:"类型 0-主账号百分比 1-实际数量"`
TypeValue string `json:"typeValue" comment:"操作类型值"`
PrivateKey string `json:"privateKey" comment:"私钥"`
common.ControlBy
}
func (s *WmTransferItemUpdateReq) Generate(model *models.WmTransferItem) {
if s.Id == 0 {
model.Model = common.Model{ Id: s.Id }
}
model.TokenAddress = s.TokenAddress
model.FromAddress = s.FromAddress
model.ToAddress = s.ToAddress
model.Amount = s.Amount
model.Type = s.Type
model.TypeValue = s.TypeValue
model.PrivateKey = s.PrivateKey
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *WmTransferItemUpdateReq) GetId() interface{} {
return s.Id
}
// WmTransferItemGetReq 功能获取请求参数
type WmTransferItemGetReq struct {
Id int `uri:"id"`
}
func (s *WmTransferItemGetReq) GetId() interface{} {
return s.Id
}
// WmTransferItemDeleteReq 功能删除请求参数
type WmTransferItemDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *WmTransferItemDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,105 @@
package dto
import (
"errors"
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
"strings"
)
type WmWalletInfoGetPageReq struct {
dto.Pagination `search:"-"`
PrivateKey string `form:"privateKey" search:"type:exact;column:private_key;table:wm_wallet_info" comment:"钱包私钥"`
WmWalletInfoOrder
}
type WmWalletInfoOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:wm_wallet_info"`
PrivateKey string `form:"privateKeyOrder" search:"type:order;column:private_key;table:wm_wallet_info"`
Address string `form:"addressOrder" search:"type:order;column:address;table:wm_wallet_info"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:wm_wallet_info"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:wm_wallet_info"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:wm_wallet_info"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:wm_wallet_info"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:wm_wallet_info"`
}
func (m *WmWalletInfoGetPageReq) GetNeedSearch() interface{} {
return *m
}
type WmWalletInfoBatchInsertReq struct {
Keys string `json:"keys"`
common.ControlBy
}
func (s *WmWalletInfoBatchInsertReq) Valid() error {
s.Keys = strings.ReplaceAll(s.Keys, " ", "")
s.Keys = strings.ReplaceAll(s.Keys, ",", "\n")
s.Keys = strings.ReplaceAll(s.Keys, "", "\n")
if s.Keys == "" {
return errors.New("请至少输入一条数据")
}
return nil
}
type WmWalletInfoInsertReq struct {
Id int `json:"-" comment:"主键Id"` // 主键Id
PrivateKey string `json:"privateKey" comment:"钱包私钥"`
Address string `json:"address" comment:"钱包地址"`
common.ControlBy
}
func (s *WmWalletInfoInsertReq) Generate(model *models.WmWalletInfo) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.PrivateKey = s.PrivateKey
model.Address = s.Address
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *WmWalletInfoInsertReq) GetId() interface{} {
return s.Id
}
type WmWalletInfoUpdateReq struct {
Id int `uri:"id" comment:"主键Id"` // 主键Id
PrivateKey string `json:"privateKey" comment:"钱包私钥"`
Address string `json:"address" comment:"钱包地址"`
common.ControlBy
}
func (s *WmWalletInfoUpdateReq) Generate(model *models.WmWalletInfo) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.PrivateKey = s.PrivateKey
model.Address = s.Address
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *WmWalletInfoUpdateReq) GetId() interface{} {
return s.Id
}
// WmWalletInfoGetReq 功能获取请求参数
type WmWalletInfoGetReq struct {
Id int `uri:"id"`
}
func (s *WmWalletInfoGetReq) GetId() interface{} {
return s.Id
}
// WmWalletInfoDeleteReq 功能删除请求参数
type WmWalletInfoDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *WmWalletInfoDeleteReq) GetId() interface{} {
return s.Ids
}

View 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 WmTransfer struct {
service.Service
}
// GetPage 获取WmTransfer列表
func (e *WmTransfer) GetPage(c *dto.WmTransferGetPageReq, p *actions.DataPermission, list *[]models.WmTransfer, count *int64) error {
var err error
var data models.WmTransfer
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("WmTransferService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取WmTransfer对象
func (e *WmTransfer) Get(d *dto.WmTransferGetReq, p *actions.DataPermission, model *models.WmTransfer) error {
var data models.WmTransfer
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 GetWmTransfer error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建WmTransfer对象
func (e *WmTransfer) Insert(c *dto.WmTransferInsertReq) error {
var err error
var data models.WmTransfer
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("WmTransferService Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改WmTransfer对象
func (e *WmTransfer) Update(c *dto.WmTransferUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.WmTransfer{}
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("WmTransferService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除WmTransfer
func (e *WmTransfer) Remove(d *dto.WmTransferDeleteReq, p *actions.DataPermission) error {
var data models.WmTransfer
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 RemoveWmTransfer error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}

View 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 WmTransferItem struct {
service.Service
}
// GetPage 获取WmTransferItem列表
func (e *WmTransferItem) GetPage(c *dto.WmTransferItemGetPageReq, p *actions.DataPermission, list *[]models.WmTransferItem, count *int64) error {
var err error
var data models.WmTransferItem
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("WmTransferItemService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取WmTransferItem对象
func (e *WmTransferItem) Get(d *dto.WmTransferItemGetReq, p *actions.DataPermission, model *models.WmTransferItem) error {
var data models.WmTransferItem
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 GetWmTransferItem error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建WmTransferItem对象
func (e *WmTransferItem) Insert(c *dto.WmTransferItemInsertReq) error {
var err error
var data models.WmTransferItem
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("WmTransferItemService Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改WmTransferItem对象
func (e *WmTransferItem) Update(c *dto.WmTransferItemUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.WmTransferItem{}
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("WmTransferItemService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除WmTransferItem
func (e *WmTransferItem) Remove(d *dto.WmTransferItemDeleteReq, p *actions.DataPermission) error {
var data models.WmTransferItem
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 RemoveWmTransferItem error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}

View File

@ -0,0 +1,174 @@
package service
import (
"errors"
"strings"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/abis/ethereumabi"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
"go-admin/config"
"go-admin/utils/aeshelper"
"go-admin/utils/ethbalanceofhelper"
"go-admin/utils/ethtransferhelper"
"go-admin/utils/stringhelper"
)
type WmWalletInfo struct {
service.Service
}
// GetPage 获取WmWalletInfo列表
func (e *WmWalletInfo) GetPage(c *dto.WmWalletInfoGetPageReq, p *actions.DataPermission, list *[]models.WmWalletInfo, count *int64) error {
var err error
var data models.WmWalletInfo
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("WmWalletInfoService GetPage error:%s \r\n", err)
return err
}
for i := 0; i < len(*list); i++ {
(*list)[i].PrivateKey = stringhelper.DesensitizeWalletAddress(aeshelper.AesEcbDecrypt((*list)[i].PrivateKey))
}
return nil
}
// Get 获取WmWalletInfo对象
func (e *WmWalletInfo) Get(d *dto.WmWalletInfoGetReq, p *actions.DataPermission, model *models.WmWalletInfo) error {
var data models.WmWalletInfo
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 GetWmWalletInfo error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建WmWalletInfo对象
func (e *WmWalletInfo) Insert(c *dto.WmWalletInfoBatchInsertReq) []string {
errs := []string{}
var count int64
keys := strings.Split(c.Keys, "\n")
for _, key := range keys {
if key == "" {
continue
}
var data models.WmWalletInfo
data.PrivateKey = aeshelper.AesEcbEncrypt(key)
_, address, _ := ethtransferhelper.GetAddressFromPrivateKey(key)
data.Address = address.String()
if err := e.Orm.Model(data).Where("private_key =?", data.PrivateKey).Count(&count).Error; err != nil {
e.Log.Errorf("db error:%s", err)
}
if count == 0 {
if err := e.Orm.Create(&data).Error; err != nil {
e.Log.Errorf("db error:%s", err)
errs = append(errs, key)
}
}
}
return errs
}
// Update 修改WmWalletInfo对象
func (e *WmWalletInfo) Update(c *dto.WmWalletInfoUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.WmWalletInfo{}
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("WmWalletInfoService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除WmWalletInfo
func (e *WmWalletInfo) Remove(d *dto.WmWalletInfoDeleteReq, p *actions.DataPermission) error {
var data models.WmWalletInfo
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 RemoveWmWalletInfo error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}
// ScheduledTask 定时任务
func (e *WmWalletInfo) ScheduledTask() error {
var datas []models.WmWalletInfo
if err := e.Orm.Model(models.WmWalletInfo{}).Find(&datas).Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
client, err := ethbalanceofhelper.EthClientWithProxy(config.ExtConfig.ApiEndpoint, config.ExtConfig.ProxyUrl)
if err != nil {
e.Log.Errorf("ethclient error:%s", err)
return err
}
for i := range datas {
amount, err := ethbalanceofhelper.GetERC20Balance(client, ethereumabi.USDCErc20, datas[i].Address)
if err != nil {
e.Log.Errorf("GetERC20Balance error:%s", err)
continue
}
datas[i].UsdcAmount = amount
if err := e.Orm.Model(&datas[i]).Update("usdc_amount", amount).Error; err != nil {
e.Log.Errorf("db error:%s", err)
continue
}
}
return nil
}

31
app/jobs/transfer_job.go Normal file
View File

@ -0,0 +1,31 @@
package jobs
import (
"go-admin/app/admin/service"
"github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk"
"gorm.io/gorm"
)
type TransferJob struct{}
// 定期转账
func (t TransferJob) Exec(arg interface{}) error {
walletService := service.WmWalletInfo{}
walletService.Orm = getDefaultDb()
walletService.Log = logger.NewHelper(logger.DefaultLogger)
return walletService.ScheduledTask()
}
func getDefaultDb() *gorm.DB {
dbs := sdk.Runtime.GetDb()
var db *gorm.DB
for _, item := range dbs {
db = item
break
}
return db
}

View File

@ -0,0 +1,23 @@
package jobs
import (
"go-admin/config"
"testing"
"github.com/go-admin-team/go-admin-core/sdk"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func TestTransferJob(t *testing.T) {
dsn := "root:123456@tcp(127.0.0.1:3306)/eth_transfer?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
sdk.Runtime.SetDb("default", db)
config.ExtConfig.ApiEndpoint = "https://stylish-cool-fire.ethereum-sepolia.quiknode.pro/17572db4c091accfa5dc6faa0c60a805e5173459"
config.ExtConfig.ProxyUrl = "http://127.0.0.1:7890"
job := TransferJob{}
job.Exec(nil)
}