From 94b2940a88e6f0deab7412397dc8f924fb80a84e Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Wed, 27 May 2020 09:49:56 +0800 Subject: [PATCH] 提交接口 --- src/HttpServer/jsonconf/jsonconf.go | 16 ++++++++++------ src/HttpServer/logic/constdef.go | 4 ++++ src/HttpServer/logic/datadef.go | 34 ++++++++++++++++++++++++++++++++++ src/HttpServer/logic/errordef.go | 4 +++- src/HttpServer/logic/function.go | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/HttpServer/logic/httpserver.go | 15 +++++++++++---- src/HttpServer/logic/logic.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/common/redis/def.go | 5 +---- 8 files changed, 241 insertions(+), 16 deletions(-) diff --git a/src/HttpServer/jsonconf/jsonconf.go b/src/HttpServer/jsonconf/jsonconf.go index 9a7b986..ee57ae8 100644 --- a/src/HttpServer/jsonconf/jsonconf.go +++ b/src/HttpServer/jsonconf/jsonconf.go @@ -17,14 +17,14 @@ type SignConfig struct { } type GoldGunsConfig struct { - Level int `json:"level"` - Speed int `json:"speed"` + Level int `json:"level"` + Speed int64 `json:"speed"` } type GoldChestConfig struct { - Boxid int `json:"boxid"` - Score int `json:"score"` - Reward int `json:"reward"` + Boxid int `json:"boxid"` + Score int64 `json:"score"` + Reward int `json:"reward"` } type GameConfig struct { @@ -63,9 +63,13 @@ func GetGoldGunsConfig(level int) *GoldGunsConfig { func GetGoldChestConfig(boxid int) *GoldChestConfig { + finalid := boxid + if finalid > len(g_jsonconf.BoxConfig) { + finalid = g_jsonconf.BoxConfig[len(g_jsonconf.BoxConfig)-1].Boxid + } var rt *GoldChestConfig for _, val := range g_jsonconf.BoxConfig { - if val.Boxid == boxid { + if val.Boxid == finalid { rt = &val break } diff --git a/src/HttpServer/logic/constdef.go b/src/HttpServer/logic/constdef.go index 4c79103..473bc19 100644 --- a/src/HttpServer/logic/constdef.go +++ b/src/HttpServer/logic/constdef.go @@ -1 +1,5 @@ package logic + +const ( + DAILY_FETCH_CNT = 5 //每日领取宝箱次数 +) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index 4c79103..e98b400 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -1 +1,35 @@ package logic + +// + +type GetcurpropertyReq struct { + Openid string `json:"openid"` +} + +type GetcurpropertyData struct { + Protery int64 `json:"protery"` + Speed int64 `json:"speed"` + Curlevle int64 `json:"curlevle"` + Leftcnt int `json:"leftcnt"` +} + +type GetcurpropertyResp struct { + ErrNum int `json:"errNum"` + RetMsg string `json:"retMsg"` + RetData GetcurpropertyData `json:"retData"` +} + +//------------------------------------------------------------------------------------------------------ + +type UserData struct { + Openid string + LastGetTime int //上一次请求物资时间戳,如果超过三次时间间隔则不计算收益 + LeftCnt int //当天剩余领取宝箱次数 + MaxLevel int //当前最高枪等级 + Property int64 //当前物资 + TotalFetchCnt int //累计领取次数 + SignRound int //签到轮数 + SingDay int //签到天数 + IsSign int //当天是否已经签到 + TodaySec int //当天零点时间戳,用于判断跨天 +} diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index b16f802..90f45f7 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -1,6 +1,8 @@ package logic const ( - ERROR_OK = 0 //没有错误 + ERROR_OK = 0 //没有错误 + ERROR_UNMASH_JSONFAILED = 1 //json解析失败 + ERROR_SERVER_FAILED = 2 //j服务器错误 ) diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index f6d0f09..9c1f0b8 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -1,9 +1,141 @@ package logic -import "net/http" +import ( + "HttpServer/jsonconf" + "HttpServer/redishandler" + "common/logger" + "common/redis" + "encoding/json" + "net/http" + "time" +) func SetHeader(w http.ResponseWriter) { w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Uuid") } + +func SaveUserInfo(data *UserData) error { + + savestr, err := json.Marshal(data) + if err != nil { + return err + } + + err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, data.Openid, string(savestr)) + + return err +} + +func GetUserInfo(openid string) (*UserData, error) { + + //先判断用户是否存在 不存在创建新的用户 + isexist, err := redishandler.GetRedisClient().HExists(redis.USER_DATA_KEY, openid) + if err != nil { + logger.Error("redis failed err=%v", err) + return nil, err + } + + tmp := new(UserData) + if !isexist { + //不存在 + //属于新登录的玩家数据 + err = tmp.InitUserInfo(openid) + } else { + //已经登陆过了 需要获取玩家数据 + data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, openid) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(data), tmp) + if err != nil { + return nil, err + } + } + + return tmp, nil +} + +func (u *UserData) InitUserInfo(openid string) error { + nowtime := time.Now() + u.Openid = openid + u.SignRound = 1 + u.IsSign = 0 + u.LastGetTime = 0 + u.LeftCnt = DAILY_FETCH_CNT + u.MaxLevel = 1 + u.Property = 0 + u.SingDay = 0 + u.TodaySec = int(time.Date(nowtime.Year(), nowtime.Month(), nowtime.Day(), 0, 0, 0, 0, nowtime.Location()).Unix()) + u.TotalFetchCnt = 0 //用于计算当前领取次数 + + err := SaveUserInfo(u) + if err != nil { + logger.Error("InitUserInfo err=%v", err) + } + return err +} + +//计算当前领取宝箱需要的数值 +func (u *UserData) CalcCurLe() int64 { + cfg := jsonconf.GetGoldChestConfig(u.TotalFetchCnt + 1) + if cfg == nil { + logger.Error("CalcCurLe failed u=%v", u) + return 0 + } + + return cfg.Score +} + +//计算速率 +func (u *UserData) CalcSpeed() int64 { + cfg := jsonconf.GetGoldGunsConfig(u.MaxLevel) + if cfg == nil { + logger.Error("CalcSpeed failed u=%v", u) + return 0 + } + return cfg.Speed +} + +//计算物资 +func (u *UserData) CalcProperty() { + nowtime := int(time.Now().Unix()) + if nowtime < u.LastGetTime { + logger.Error("CalcProperty err n=%v,l=%v", nowtime, u.LastGetTime) + } else if nowtime >= u.LastGetTime+60*3 { + //超过三次请求了 不再计算离线收益 + + } else { + //计算一下离线收益 + mult := nowtime - u.LastGetTime + speed := u.CalcSpeed() + u.Property += int64(mult) * speed + } + u.LastGetTime = nowtime + + //判断跨天 + if nowtime < u.TodaySec { + logger.Error("CalcProperty err2") + nowtt := time.Now() + u.TodaySec = int(time.Date(nowtt.Year(), nowtt.Month(), nowtt.Day(), 0, 0, 0, 0, nowtt.Location()).Unix()) + } else { + if nowtime > u.TodaySec+86400 { + //跨天了 + nowtt := time.Now() + u.TodaySec = int(time.Date(nowtt.Year(), nowtt.Month(), nowtt.Day(), 0, 0, 0, 0, nowtt.Location()).Unix()) + u.LeftCnt = DAILY_FETCH_CNT + u.IsSign = 0 + if u.SingDay == 7 { + u.SingDay = 0 + u.SignRound++ + } + } + } + //保存 + err := SaveUserInfo(u) + if err != nil { + logger.Error("CalcProperty err=%v", err) + } +} diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index d7bf9d6..573f4b4 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -43,7 +43,7 @@ func startServerHttpServe() { http.HandleFunc("/eliminatestar/test", Testapi) //测试接口 http.HandleFunc("/eliminatestar/clear", ClearData) //清除账号 //---------------------------------------------------------------------------------------- - + http.HandleFunc("/daycs/getcurproperty", Getcurproperty) //请求当前物资 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) CheckErr(err) } @@ -67,9 +67,6 @@ func ClearData(w http.ResponseWriter, r *http.Request) { logger.Info("ClearData , body:%v,uuid=%v", s, Uuid) redishandler.GetRedisClient().HDel(redis.USER_DATA_KEY, strconv.Itoa(Uuid)) - redishandler.GetRedisClient().HDel(redis.USER_TASKINFO_LIST, strconv.Itoa(Uuid)) - redishandler.GetRedisClient().HDel(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(Uuid)) - redishandler.GetRedisClient().HDel(redis.USER_WITHDRAW_RECORDLIST, strconv.Itoa(Uuid)) fmt.Fprint(w, "success!") } @@ -79,6 +76,16 @@ func Testapi(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "success") } +func Getcurproperty(w http.ResponseWriter, r *http.Request) { + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("Getcurproperty , body:%v", s) + + HandlerGetcurproperty(w, s) +} + /*func Getnewlevelreward(w http.ResponseWriter, r *http.Request) { Uuid := 0 diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index 4c79103..9a59b47 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -1 +1,46 @@ package logic + +import ( + "common/logger" + "encoding/json" + "fmt" + "net/http" +) + +func HandlerGetcurproperty(w http.ResponseWriter, data string) { + SetHeader(w) + var resp GetcurpropertyResp + resp.ErrNum = 0 + var rdata GetcurpropertyReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Info("json decode HandlerGetcurproperty data failed:%v,for:%v", err, data) + resp.RetMsg = "json解析失败" + resp.ErrNum = ERROR_UNMASH_JSONFAILED + break + } + + uinfo, err := GetUserInfo(rdata.Openid) + if err != nil || uinfo == nil { + logger.Info(" HandlerGetcurproperty getdata failed:%v,for:%v", err, data) + resp.RetMsg = "服务器读取数据失败" + resp.ErrNum = ERROR_SERVER_FAILED + break + } + + //需要处理一下物资计算 + uinfo.CalcProperty() + + //返回 + resp.RetData.Leftcnt = uinfo.LeftCnt + resp.RetData.Curlevle = uinfo.CalcCurLe() + resp.RetData.Protery = uinfo.Property + resp.RetData.Speed = uinfo.CalcSpeed() + + break + } + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} diff --git a/src/common/redis/def.go b/src/common/redis/def.go index 42ed9d5..fa9df9d 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -1,9 +1,6 @@ package redis const ( - USER_DATA_KEY = "STARSTAR_USER_DATA_KEY" //玩家数据 - USER_WITHDRAW_RECORDLIST = "STARSTAR_USER_WITHDRAW_RECORDLIST" //玩家提现记录 - USER_TASKINFO_LIST = "STARSTAR_USER_TASKINFO_LIST" //任务列表数据缓存 - USER_ACHIEVEMENTINFO_LIST = "STARSTAR_USER_ACHIEVEMENTINFO_LIST" //成就列表数据缓存 + USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 ) -- libgit2 0.21.0