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 }