From bf38495cd5410a906e9d661dbebd6131e930e89a Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Thu, 18 Jun 2020 16:17:32 +0800 Subject: [PATCH] 提交基本登录接口 --- src/HttpServer/logic/datadef.go | 17 ++++++----------- src/HttpServer/logic/function.go | 380 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/HttpServer/logic/httpserver.go | 14 ++++++++++---- src/HttpServer/logic/logic.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/common/redis/def.go | 8 ++++---- 5 files changed, 472 insertions(+), 22 deletions(-) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index 01bebb4..8ee5536 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -9,19 +9,15 @@ package logic //"107":"签到罐" type UserLoginReq struct { - Fromid int `json:"fromid"` - Sharetype int `json:"sharetype"` - Gameid string `json:"gameid"` - Channel string `json:"channel"` + } type UserLoginData struct { + Isnew int `json:"isnew"` Walletgold int `json:"walletgold"` - Leftredbagcnt int `json:"leftredbagcnt"` - Guangold int `json:"guangold"` - Userlv int `json:"userlv"` - Userexp int `json:"userexp"` - Sumloginday int `json:"sumloginday"` + Guangold int `json:"guangold"` + PlayerData string `json:"playerData"` + } type UserLoginResp struct { @@ -332,14 +328,13 @@ type WithDrawDesc struct { Cid int `json:"cid"` Cnum float32 `json:"cnum"` Isnew int `json:"isnew"` - Limitlv int `json:"limitlv"` Preisfind int `json:"preisfind"` Day int `json:"day"` } //玩家数据 type UserData struct { - Userid int //玩家id + Userid string //玩家w唯一id Lv int //玩家当前等级 LvRewardGet int //当前等级奖励是否已经领取 1未领取 2普通领取 3双倍领取 Exp int //玩家当前经验值 diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 0eebace..8e546ed 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -1,9 +1,385 @@ package logic -import "net/http" +import ( + "HttpServer/jsonconf" + "HttpServer/redishandler" + "bytes" + "common/logger" + "common/redis" + "crypto/md5" + "encoding/hex" + "encoding/json" + "errors" + "io/ioutil" + "net/http" + "sort" + "strconv" + "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") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Uuid,Gameid,Channel") +} + +func GettotalParam(paramlist []string) string { + //排序 + sort.Strings(paramlist) + + //拼接 + sumparam := "" + for _, val := range paramlist { + sumparam += val + } + + return sumparam +} + +func GetHashValue(signsum string) string { + /*h := sha1.New() + h.Write([]byte(signsum)) + bs := h.Sum(nil) + sign := hex.EncodeToString(bs)*/ + ctx := md5.New() + ctx.Write([]byte(signsum)) + return hex.EncodeToString(ctx.Sum(nil)) +} + +func DoHttpPost(bys []byte, apistr string) (string, error) { + body := bytes.NewBuffer(bys) + url1 := XIAOXINGXING_SDKURLOFFICAL + apistr //"api/server/addcoin" + + res, err := http.Post(url1, "application/json;charset=utf-8", body) + if err != nil { + logger.Error("DoHttpPost failed err=%v", err) + return "", err + } + result, _ := ioutil.ReadAll(res.Body) + defer res.Body.Close() + + return string(result), nil +} + +func GetCoinFromSdk(uuid int, gameid string, channel string) (int, error) { + + SERVERKEY := XIAOXINGXING_SERVERKEYTEST + if gameid == "1015" { + SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 + } + + var paramlist []string + var params GetCoinDesc + params.Sign_type = "md5" + params.Gameid = gameid + params.Channel = channel + params.Uid = uuid + params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) + signtypestr := "sign_type=" + params.Sign_type + timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) + paramgameid := "gameid=" + gameid + pchannel := "channel=" + channel + puid := "uid=" + strconv.Itoa(uuid) + paramlist = append(paramlist, signtypestr) + paramlist = append(paramlist, timestampstr) + paramlist = append(paramlist, paramgameid) + paramlist = append(paramlist, pchannel) + paramlist = append(paramlist, puid) + + sumparam := GettotalParam(paramlist) + //加serverkey + signsum := sumparam + SERVERKEY + + //进行hash + sign := GetHashValue(signsum) + params.Sign = sign + logger.Info("GetCoinFromSdk sumparam is:%v,sign is:", signsum, sign) + + bys, err := json.Marshal(¶ms) + if err != nil { + logger.Error("GetCoinFromSdk failed=%v", err) + return 0, err + } + res, err := DoHttpPost(bys, "api/server/getcoin") + if err != nil { + logger.Error("GetCoinFromSdk failed=%v", err) + return 0, err + } + + logger.Info("GetCoinFromSdk res=%v", res) + + var resp AddCoinResp + err = json.Unmarshal([]byte(res), &resp) + if err != nil { + logger.Error("GetCoinFromSdk failed=%v", err) + return 0, err + } + + if resp.Code != "0" { + logger.Error("GetCoinFromSdk failed=%v", resp.Msg) + return 0, err + } + + return resp.Data.Mycoin, nil +} + +//1任务 2成就 +func GetTaskInfo(uuid int, tasktype int, channel string) (*TaskList, error) { + unqiueuuid := strconv.Itoa(uuid) + channel + var data string + var err error + if tasktype == 1 { + data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid) + //兼容老的数据 + if err != nil { + //没有读到数据 则去读取一下老的id + olddata, err := redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid)) + if err == nil { + err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, unqiueuuid, olddata) + if err == nil { + //删除老的数据 以后都走新的数据 + err = redishandler.GetRedisClient().HDel(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid)) + logger.Info("GetTaskInfo uuid=%v do set", uuid) + } + data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid) + } + } + } else if tasktype == 2 { + data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid) + //成就这一块需要兼容老的数据 + if err != nil { + //没有读到数据 则去读取一下老的id + olddata, err := redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid)) + if err == nil { + err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid, olddata) + if err == nil { + //删除老的数据 以后都走新的数据 + err = redishandler.GetRedisClient().HDel(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid)) + logger.Info("GetTaskInfo uuid=%v do set", uuid) + } + data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid) + } + } + } else { + logger.Error("tasktype invalid") + return nil, errors.New("tasktype invalid") + } + + if err != nil { + return nil, err + } + + var list TaskList + err = json.Unmarshal([]byte(data), &list) + if err != nil { + logger.Error("GetTaskInfo err=%v", err) + return nil, err + } + + return &list, err +} + +func SaveTaskInfo(uuid string, tasktype int, list *TaskList) error { + savestr, err := json.Marshal(list) + if err != nil { + logger.Error("SaveTaskInfo err =%v", err) + return err + } + + if tasktype == 1 { + err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, uuid, string(savestr)) + } else if tasktype == 2 { + err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, uuid, string(savestr)) + //logger.Info("SaveTaskInfo savestr=%v", string(savestr)) + } else { + logger.Error("tasktype invalid") + return errors.New("tasktype invalid") + } + return err +} + +func (t *TaskList) IsInTaskList(id int) bool { + for _, val := range t.Taskdata { + if val.Taskid == id { + return true + } + } + return false +} + +func InitTaskAndAchievement(uuid int, channel string) error { + unqiueid := strconv.Itoa(uuid) + channel + //先初始化任务 + tlist, err := GetTaskInfo(uuid, 1, channel) + if tlist == nil { + tasklist := new(TaskList) + for _, val := range jsonconf.GetJsonConf().TaskConfig { + var tmp TaskListDesc + tmp.Taskstatus = 1 + tmp.Taskid = val.Id + tmp.Taskprogress = 0 + tasklist.Taskdata = append(tasklist.Taskdata, tmp) + } + + err := SaveTaskInfo(unqiueid, 1, tasklist) + if err != nil { + logger.Error("InitTaskAndAchievement err=%v", err) + //return err + } + } else { + for _, val := range jsonconf.GetJsonConf().TaskConfig { + if !tlist.IsInTaskList(val.Id) { + var tmp TaskListDesc + tmp.Taskstatus = 1 + tmp.Taskid = val.Id + tmp.Taskprogress = 0 + tlist.Taskdata = append(tlist.Taskdata, tmp) + } + } + + for k, _ := range tlist.Taskdata { + tlist.Taskdata[k].Taskprogress = 0 + tlist.Taskdata[k].Taskstatus = 1 + + } + + err := SaveTaskInfo(unqiueid, 1, tlist) + if err != nil { + logger.Error("InitTaskAndAchievement err=%v", err) + //return err + } + } + + //成就 + alist, err := GetTaskInfo(uuid, 2, channel) + if alist == nil { + achievelist := new(TaskList) + for _, val := range jsonconf.GetJsonConf().AchieventConfig { + var tmp TaskListDesc + tmp.Taskstatus = 1 + tmp.Taskid = val.Id + tmp.Taskprogress = 0 + achievelist.Taskdata = append(achievelist.Taskdata, tmp) + } + + err = SaveTaskInfo(unqiueid, 2, achievelist) + if err != nil { + logger.Error("InitTaskAndAchievement err=%v", err) + return err + } + } else { + for _, val := range jsonconf.GetJsonConf().AchieventConfig { + if !alist.IsInTaskList(val.Id) { + var tmp TaskListDesc + tmp.Taskstatus = 1 + tmp.Taskid = val.Id + tmp.Taskprogress = 0 + alist.Taskdata = append(alist.Taskdata, tmp) + } + } + + err = SaveTaskInfo(unqiueid, 2, alist) + if err != nil { + logger.Error("InitTaskAndAchievement err=%v", err) + return err + } + } + + return nil +} + + +func InitUserInfo(resp *UserLoginResp, uniqueuid ,gameid ,channel string,uuid int) error { + + var initdata UserData + initdata.Lv = 1 + initdata.LvRewardGet = 0 + initdata.Exp = 0 + initdata.Userid = uniqueuid + initdata.ContinueLoginDay = 1 + initdata.SumLoginDay = 1 + initdata.GetFromGuanCnt = 0 + initdata.GuanGold = 0 + initdata.LastLoginTime = int(time.Now().Unix()) + goldnum, _ := GetCoinFromSdk(uuid, gameid, channel) + initdata.RealGold = goldnum + initdata.WatchAddsTime = WATCH_ADD_DAY_LIMIT + initdata.LeftFreeRB = FREE_REDBAG_NUM + initdata.UpLvCostTime = 0 + initdata.UpLvCostTimeSec = int(time.Now().Unix()) + + for _, val := range jsonconf.GetJsonConf().RmbConfig { + var tmp WithDrawDesc + tmp.Cid = val.Id + tmp.Cnum = val.Rmb_num + if val.Time == 1 { + tmp.Isnew = 1 + } else { + tmp.Isnew = 2 + } + if val.Id == 1 { + tmp.Preisfind = 1 + } else { + tmp.Preisfind = 0 + } + tmp.Day = val.Login_day + initdata.WithDraw.Cashdata = append(initdata.WithDraw.Cashdata, tmp) + } + + resp.Data.Guangold = initdata.GuanGold + resp.Data.Walletgold = initdata.RealGold + resp.Data.Isnew = 1 + + err := SaveUserInfo(&initdata, uniqueuid) + if err != nil { + logger.Error("InitUserInfo err=%v", err) + return err + } + + //初始化一下玩家的任务与成就数据数据 + err = InitTaskAndAchievement(uuid, channel) + + return err +} + +func SaveUserInfo(data *UserData, uniqueid string) error { + + savestr, err := json.Marshal(data) + if err != nil { + return err + } + + err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, string(savestr)) + + return err +} + +func GetUserInfo(uniqueid string) (*UserData, error) { + + data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, uniqueid) + if err != nil { + return nil, err + } + var tmp UserData + err = json.Unmarshal([]byte(data), &tmp) + if err != nil { + return nil, err + } + + return &tmp, nil +} + +func SaveUserSelfData(uniqueid ,savedata string) error { + err := redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, savedata) + return err +} + +func GetUserSelfData(uniqueid string) (string,error) { + data, err := redishandler.GetRedisClient().HGet(redis.USER_SELF_DATA_KEY, uniqueid) + if err != nil { + return "", err + } + + + return data, nil } \ No newline at end of file diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 3030c45..ac86dd4 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -94,7 +94,7 @@ func ClearData(w http.ResponseWriter, r *http.Request) { redishandler.GetRedisClient().HDel(redis.USER_DATA_KEY, rkey) redishandler.GetRedisClient().HDel(redis.USER_TASKINFO_LIST, rkey) redishandler.GetRedisClient().HDel(redis.USER_ACHIEVEMENTINFO_LIST, rkey) - redishandler.GetRedisClient().HDel(redis.USER_WITHDRAW_RECORDLIST, rkey) + //redishandler.GetRedisClient().HDel(redis.USER_WITHDRAW_RECORDLIST, rkey) fmt.Fprint(w, "success!") } @@ -564,23 +564,29 @@ func Watchads(w http.ResponseWriter, r *http.Request) { func UserLogin(w http.ResponseWriter, r *http.Request) { + gameid := "" + channel := "" + uniqueid := "" Uuid := 0 if len(r.Header) > 0 { Uuid, _ = strconv.Atoi(r.Header.Get("Uuid")) + gameid = r.Header.Get("Gameid") + channel = r.Header.Get("Channel") + uniqueid = r.Header.Get("Uuid") + r.Header.Get("Channel") } if Uuid == 0 { SetHeader(w) - //logger.Error("Uuid is nil!") + logger.Error("Uuid is nil!") return } result, _ := ioutil.ReadAll(r.Body) r.Body.Close() s := string(result) - logger.Info("UserLogin , body:%v,uuid=%v", s, Uuid) + logger.Info("UserLogin , body:%v,uuid=%v", s, uniqueid) - //HandlerLogin(w, s, Uuid) + HandlerLogin(w, s, uniqueid,gameid,channel,Uuid) } func Getuserdata(w http.ResponseWriter, r *http.Request) { diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index 697a16f..177f616 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -1 +1,74 @@ -package logic \ No newline at end of file +package logic + +import ( + "HttpServer/redishandler" + "common/logger" + "common/redis" + "encoding/json" + "fmt" + "net/http" +) + +func HandlerLogin(w http.ResponseWriter, data string, uniqueuuid ,gameid,channel string,uuid int) { + SetHeader(w) + + var resp UserLoginResp + resp.Code = 0 + + for { + + //先判断一下是否是新用户 + isexist, err := redishandler.GetRedisClient().HExists(redis.USER_DATA_KEY, uniqueuuid) + if err != nil { + logger.Error("redis failed err=%v", err) + resp.Message = "服务器错误" + resp.Code = ERROR_SRV_ERROR + break + } + + if !isexist { + //不存在 + + //不存在老的数据 之间走新号流程 + err = InitUserInfo(&resp, uniqueuuid,gameid,channel,uuid) + + + } else { + uinfo, err := GetUserInfo(uniqueuuid) + + if err != nil { + logger.Info("GetUserInfo HandlerLogin data failed:%v,for:%v", err, data) + resp.Message = "GetUserInfo failed" + resp.Code = 1 + break + } + + + + resp.Data.Guangold = uinfo.GuanGold + resp.Data.Walletgold = uinfo.RealGold + + resp.Data.Isnew= 0 + } + + pdata,err := GetUserSelfData(uniqueuuid) + + if err != nil { + logger.Info("GetUserSelfData HandlerLogin data failed:%v,for:%v", err, data) + resp.Message = "GetUserSelfData failed" + resp.Code = 1 + break + } + resp.Data.PlayerData = pdata + + + resp.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) + + logger.Info("###HandlerLogin###rdata:%v", string(respstr)) +} \ No newline at end of file diff --git a/src/common/redis/def.go b/src/common/redis/def.go index 42ed9d5..b7ecc42 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -1,9 +1,9 @@ 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 = "RUSSIAXIAOXIAO_USER_DATA_KEY" //玩家数据 + USER_SELF_DATA_KEY = "RUSSIAXIAOXIAO_USER_SELF_DATA_KEY" //玩家自定义数据 + USER_TASKINFO_LIST = "RUSSIAXIAOXIAO_USER_TASKINFO_LIST" //任务列表数据缓存 + USER_ACHIEVEMENTINFO_LIST = "RUSSIAXIAOXIAO_USER_ACHIEVEMENTINFO_LIST" //成就列表数据缓存 ) -- libgit2 0.21.0