active code
This commit is contained in:
parent
f3e2165269
commit
481529614e
180
server/adminserver/api/v1/system/activecode.go
Normal file
180
server/adminserver/api/v1/system/activecode.go
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"f5"
|
||||||
|
"fmt"
|
||||||
|
"main/constant"
|
||||||
|
"main/model/system"
|
||||||
|
"net/http"
|
||||||
|
"q5"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"math/rand"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ActiveCodeApi struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (aca *ActiveCodeApi) GenCode(c *gin.Context) {
|
||||||
|
var batchid int32 = 0
|
||||||
|
var maxbatchid int32 = 0
|
||||||
|
db := f5.GetApp().GetOrmDb(constant.ACCOUNT_DB).Table("t_activation_code").Select("max(batch_id)")
|
||||||
|
err := db.Error
|
||||||
|
if err != nil {
|
||||||
|
if !f5.IsOrmErrRecordNotFound(err) {
|
||||||
|
f5.RspErr2(c, 1, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var count int64 = 0
|
||||||
|
if db.Count(&count); count > 0 {
|
||||||
|
db.Scan(&maxbatchid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if maxbatchid >= 0xFFF {
|
||||||
|
f5.RspErr2(c, 1, "batchid overflow")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
batchid = maxbatchid + 1
|
||||||
|
|
||||||
|
count := q5.SafeToInt32(c.DefaultQuery("count", "1"))
|
||||||
|
if count < 1 {
|
||||||
|
count = 1
|
||||||
|
}
|
||||||
|
if count > 5000 {
|
||||||
|
count = 5000
|
||||||
|
}
|
||||||
|
|
||||||
|
tryCount := 0
|
||||||
|
postfix := fmt.Sprintf("%03x", batchid)
|
||||||
|
codelist := map[string]int{}
|
||||||
|
nowsecs := int32(f5.GetApp().GetRealSeconds())
|
||||||
|
batchcodeinfo := []*system.ActiveCode{}
|
||||||
|
for i := 0; i < int(count); {
|
||||||
|
if tryCount > 10000*10 {
|
||||||
|
f5.RspErr2(c, 1, "internal error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
code := aca.genCode(7) + postfix
|
||||||
|
_, exist := codelist[code]
|
||||||
|
if exist {
|
||||||
|
tryCount++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
codelist[code] = 1
|
||||||
|
i++
|
||||||
|
p := new(system.ActiveCode)
|
||||||
|
p.Batch_id = batchid
|
||||||
|
p.Code = code
|
||||||
|
p.CreateTime = nowsecs
|
||||||
|
p.ModifyTime = nowsecs
|
||||||
|
batchcodeinfo = append(batchcodeinfo, p)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = f5.GetApp().GetOrmDb(constant.ACCOUNT_DB).Table("t_activation_code").Create(batchcodeinfo).Error
|
||||||
|
if err != nil {
|
||||||
|
f5.RspErr2(c, 1, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": 0,
|
||||||
|
"message": "成功生成",
|
||||||
|
"batchid": batchid,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const strpol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
|
||||||
|
|
||||||
|
func (this *ActiveCodeApi) genCode(n int) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
k := len(strpol)
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
c := strpol[rand.Intn(k)]
|
||||||
|
sb.WriteByte(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ActiveCodeApi) List(c *gin.Context) {
|
||||||
|
req := struct {
|
||||||
|
BatchId int32 `json:"batch_id"`
|
||||||
|
PageDto system.PageDto `json:"page_dto"`
|
||||||
|
}{}
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
f5.RspErr2(c, 1, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sql := fmt.Sprintf("SELECT * FROM t_activation_code WHERE 1=1 AND batch_id = %d", req.BatchId)
|
||||||
|
params := []string{}
|
||||||
|
result := []*system.ActiveCode{}
|
||||||
|
f5.GetGoStyleDb().PageQuery(
|
||||||
|
constant.ACCOUNT_DB,
|
||||||
|
q5.ToInt32(req.PageDto.PageSize),
|
||||||
|
q5.ToInt32(req.PageDto.Page),
|
||||||
|
sql,
|
||||||
|
params,
|
||||||
|
f5.GetDbFilter().Comp([]f5.DbQueryFilter{}...),
|
||||||
|
"",
|
||||||
|
func(err error, pg *f5.Pagination) {
|
||||||
|
if err != nil {
|
||||||
|
f5.RspErr2(c, 1, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f5.UnmarshalModelList(pg.Rows, &result)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": 0,
|
||||||
|
"message": "获取成功",
|
||||||
|
"data": result,
|
||||||
|
"total": pg.Total,
|
||||||
|
"total_page": pg.TotalPages,
|
||||||
|
"cur_page": pg.CurrentPage,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ActiveCodeApi) DownloadFile(c *gin.Context) {
|
||||||
|
batchid := q5.SafeToInt32(c.DefaultQuery("batchid", ""))
|
||||||
|
if batchid < 1 {
|
||||||
|
f5.RspErr2(c, 1, "batchid error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sql := fmt.Sprintf("SELECT * FROM t_activation_code WHERE 1=1 AND batch_id = %d", batchid)
|
||||||
|
f5.GetGoStyleDb().RawQuery(
|
||||||
|
constant.ACCOUNT_DB,
|
||||||
|
sql,
|
||||||
|
[]string{},
|
||||||
|
func(err error, ds *f5.DataSet) {
|
||||||
|
if err != nil {
|
||||||
|
f5.RspErr2(c, 1, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []struct {
|
||||||
|
BatchId int32 `json:"batch_id"`
|
||||||
|
Code string `json:"activation_code"`
|
||||||
|
}{}
|
||||||
|
for ds.Next() {
|
||||||
|
p := q5.NewSliceElement(&data)
|
||||||
|
p.BatchId = q5.SafeToInt32(ds.GetByName("batch_id"))
|
||||||
|
p.Code = ds.GetByName("activation_code")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": 0,
|
||||||
|
"message": "",
|
||||||
|
"data": data,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
@ -13,4 +13,5 @@ type ApiGroup struct {
|
|||||||
GameSwitchApi
|
GameSwitchApi
|
||||||
BlockPlayerApi
|
BlockPlayerApi
|
||||||
WhiteListApi
|
WhiteListApi
|
||||||
|
ActiveCodeApi
|
||||||
}
|
}
|
||||||
|
12
server/adminserver/model/system/activecode.go
Normal file
12
server/adminserver/model/system/activecode.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package system
|
||||||
|
|
||||||
|
type ActiveCode struct {
|
||||||
|
Code string `gorm:"column:activation_code" json:"activation_code"`
|
||||||
|
Batch_id int32 `gorm:"column:batch_id" json:"batch_id"`
|
||||||
|
CreateTime int32 `gorm:"column:createtime" json:"-"`
|
||||||
|
ModifyTime int32 `gorm:"column:modifytime" json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *ActiveCode) TableName() string {
|
||||||
|
return "t_activation_code"
|
||||||
|
}
|
@ -29,6 +29,7 @@ func (this *routerMgr) Init() {
|
|||||||
this.system.InitGameSwitchRouter(priGroup)
|
this.system.InitGameSwitchRouter(priGroup)
|
||||||
this.system.InitBlockPlayerRouter(priGroup)
|
this.system.InitBlockPlayerRouter(priGroup)
|
||||||
this.system.InitWhiteListRouter(priGroup)
|
this.system.InitWhiteListRouter(priGroup)
|
||||||
|
this.system.InitActiveCodeRouter(priGroup)
|
||||||
|
|
||||||
f5.GetSysLog().Info("routerMgr.init")
|
f5.GetSysLog().Info("routerMgr.init")
|
||||||
}
|
}
|
||||||
|
21
server/adminserver/router/system/activecode.go
Normal file
21
server/adminserver/router/system/activecode.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1 "main/api/v1"
|
||||||
|
"main/middleware"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ActiveCodeRoute struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ActiveCodeRoute) InitActiveCodeRouter(priRouter *gin.RouterGroup) {
|
||||||
|
group := priRouter.Group("active_code")
|
||||||
|
api := v1.ApiGroupApp.SystemApiGroup.ActiveCodeApi
|
||||||
|
{
|
||||||
|
group.GET("gen", middleware.Permission("api/v1/active_code/gen", api.GenCode))
|
||||||
|
group.POST("list", middleware.Permission("api/v1/active_code/list", api.List))
|
||||||
|
group.GET("download", middleware.Permission("api/v1/active_code/download", api.DownloadFile))
|
||||||
|
}
|
||||||
|
}
|
@ -13,4 +13,5 @@ type RouterGroup struct {
|
|||||||
GameSwitchRoute
|
GameSwitchRoute
|
||||||
BlockPlayerRoute
|
BlockPlayerRoute
|
||||||
WhiteListRoute
|
WhiteListRoute
|
||||||
|
ActiveCodeRoute
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user