feat: verify

This commit is contained in:
wangfuduo 2026-07-07 16:40:11 +08:00
parent 909e962a5c
commit edc0dcd357
2 changed files with 224 additions and 0 deletions

View File

@ -0,0 +1,18 @@
package controller
import (
"net/http"
"twin-api/app/api/service"
"git.u8t.cn/open/go-server/session"
"github.com/gin-gonic/gin"
)
type User struct {
sess *session.ApiSession
}
func (u *User) Verify(ctx *gin.Context) {
res := service.NewUser(ctx).Verify()
ctx.JSON(http.StatusOK, res)
}

206
app/api/service/user.go Normal file
View File

@ -0,0 +1,206 @@
package service
import (
"fmt"
"time"
"twin-api/app/api/response"
"twin-api/app/common/dao"
"twin-api/app/common/model"
"twin-api/base/config"
"git.u8t.cn/open/go-server/session"
"github.com/gin-gonic/gin"
"github.com/spf13/cast"
)
type User struct {
sess *session.ApiSession
params map[string]any
ctx *gin.Context
}
func NewUser(ctx *gin.Context) *User {
u := new(User)
u.params = make(map[string]any)
u.ctx = ctx
if v := ctx.Keys[session.ContextSession]; v != nil {
if v, ok := v.(*session.ApiSession); ok {
u.sess = v
}
}
if u.sess == nil {
panic(config.ErrPermission.New())
}
exp := u.sess.GetExperiment()
// 初始化参数
for k, v := range config.KeysDefault {
u.params[k] = exp.GetParam(k, v)
}
return u
}
// 判断注册时间
// 判断免费使用时间
// 判断是否有会员
// 包更新判断
// 判断包是否提示强制更新
// 判断包是否提示更新
func (u *User) Verify() *response.Response {
// 检查免费使用时间
if resp := u.FreeCheck(); resp != nil {
return resp
}
// 检查会员状况
if resp := u.VipCheck(); resp != nil {
return resp
}
// 检查包更新状况
if resp := u.PkgCheck(); resp != nil {
return resp
}
resp := response.New(u.ctx, config.Success, "success")
resp.Window(&response.Window{Title: "", Close: true})
resp.Data.Buttons = make([]response.Button, 0)
return resp
}
func (u *User) FreeCheck() *response.Response {
var resp *response.Response
free := time.Unix(u.sess.GetUserInfo().ActiveTime, 0).AddDate(0, 0, cast.ToInt(u.params[config.ServiceFreeDay]))
if free.Unix() >= time.Now().Unix() {
// 提示需要充值
resp = response.New(u.ctx, config.VipExpire, u.params[config.ServiceVipExpireNotice].(string))
button := &response.Button{
Text: u.params[config.ServiceVipExpireButton].(string),
Url: u.params[config.ServiceVipExpireUrl].(string),
}
window := &response.Window{Close: false}
resp.Botton(button)
resp.Window(window)
return resp
}
return resp
}
func (u *User) VipCheck() *response.Response {
var resp *response.Response
expire := u.sess.GetUserInfo().VipExpireTime
if expire == -1 {
return nil
}
if expire < time.Now().Unix() {
resp = response.New(u.ctx, config.VipExpire, u.params[config.ServiceVipExpireNotice].(string))
button := &response.Button{
Text: u.params[config.ServiceVipExpireButton].(string),
Url: u.params[config.ServiceVipExpireUrl].(string),
}
window := &response.Window{Close: false}
resp.Botton(button)
resp.Window(window)
}
return resp
}
func (u *User) PkgCheck() *response.Response {
var resp *response.Response
var userPkg *model.UserPkgInfo
var pkg *model.Pkg
var err error
user := u.sess.GetUserInfo()
if userPkg, err = dao.NewUserPkg().GetLatest(user.Id); err != nil {
panic(config.ErrDb.New().Append(err))
}
if userPkg == nil {
pkg, err = dao.NewPackage().GetByPkgName("")
if err != nil {
panic(config.ErrDb.New().Append(err))
}
if pkg == nil {
panic(config.ErrData.New().Append(err))
}
resp = response.New(u.ctx, config.UerNoPkg, u.params[config.ServiceUserPackageLack].(string))
button := &response.Button{
Text: u.params[config.ServicePackageLackButton].(string),
Url: u.params[config.ServicePackageLackUrl].(string),
}
window := &response.Window{Close: false}
resp.Botton(button)
resp.Window(window)
return resp
}
// 先判断是否强制更新
if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceForceUpdateDay])); resp != nil {
resp.Window(&response.Window{Close: false, Title: u.params[config.ServiceForceUpdateNotice].(string)})
return resp
}
// 判断是否提示更新
if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceUpdateBeforeDay])); resp != nil {
msg := fmt.Sprintf(u.params[config.ServiceUpdateNotice].(string), time.Unix(userPkg.Pkg.ExpireTime, 0).Format("2006-01-02"))
resp.Window(&response.Window{Close: true, Title: msg})
return resp
}
return resp
}
// 判断包是否在有效时间内
func (u *User) expireCheck(userPkg *model.UserPkgInfo, day int) *response.Response {
var pkg *model.Pkg
var err error
var resp *response.Response
expire := time.Now().AddDate(0, 0, day)
if time.Unix(userPkg.Pkg.ExpireTime, 0).Before(expire) {
// 提示强制更新
// 查询当前有无最新可用的包
// 1. 先查询当前包有无可用
if pkg, err = dao.NewPackage().GetByPkgName(userPkg.Pkg.Name); err != nil {
panic(config.ErrDb.New().Append(err))
}
// 2. 无则查询其他可用包
if pkg == nil || time.Unix(pkg.ExpireTime, 0).Before(expire) {
if pkg, err = dao.NewPackage().GetByPkgName(""); err != nil {
panic(config.ErrDb.New().Append(err))
}
// 3. 如果都不可用,则提示联系客服
if pkg == nil {
resp = response.New(u.ctx, config.NoPkg, u.params[config.ServiceContactCustomer].(string))
window := &response.Window{Close: false}
resp.Window(window)
return resp
}
}
// 否则返回强制更新
message := u.params[config.ServiceForceUpdateNotice].(string)
if pkg.Name != userPkg.Pkg.Name {
message = u.params[config.ServiceUpdateOtherNotice].(string)
}
resp = response.New(u.ctx, config.NeedUpgrade, message)
button := &response.Button{
Text: u.params[config.ServiceInstallButton].(string),
Url: pkg.Link,
}
window := &response.Window{Close: false}
resp.Botton(button)
resp.Window(window)
}
return resp
}