From 337bfd095d53fb30b54d30a5919c3eb9d10964aa Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Wed, 29 Apr 2020 17:45:33 +0800 Subject: [PATCH] 提交代码 --- src/HttpServer/logic/datadef.go | 22 ++++++++++++++++++++++ src/HttpServer/logic/errordef.go | 2 ++ src/HttpServer/logic/function.go | 43 +++++++++++++++++++++++++++++++++++++++++++ src/HttpServer/logic/httpserver.go | 24 ++++++++++++++++++++++++ src/HttpServer/logic/logic.go | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/common/redis/def.go | 1 + 6 files changed, 266 insertions(+), 0 deletions(-) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index ded877d..1a2a246 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -87,6 +87,28 @@ type UserLoginResp struct { } + +type RegeisterReq struct{ + Account string `json:"account"` + Password string `json:"password"` +} + +type RegeisteraResp struct { + Status string `json:"status"` + Result CommonResult `json:"result"` +} + +type AccounLoginReq struct{ + Account string `json:"account"` + Password string `json:"password"` +} + +type AccounLoginResp struct { + Status string `json:"status"` + Result UserLoginResult `json:"result"` +} + + type SaveUserDataReq struct{ Token string `json:"token"` Hot int `json:"hot"` diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index 9b66efc..11df837 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -36,4 +36,6 @@ const ( ERROR_FRIENDDELFRIENDFAILED = 31 //删除好友失败 ERROR_FRIENDGETFRIENDINFOFAILED = 32 //获取好友信息失败 ERROR_WECHATLOGINFAILED = 33 //获取好友信息失败 + ERROR_REGEISTACCOUNTEXIST = 34 //注册账号重复 + ERROR_ACCOUNTPWDWRONG= 35 //账号登录密码不对 ) \ No newline at end of file diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 992e437..e0f6e1c 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -4,7 +4,10 @@ import ( "HttpServer/redishandler" "common/logger" "common/redis" + "crypto/md5" + "encoding/hex" "encoding/json" + "errors" "net/http" "sort" "strconv" @@ -721,4 +724,44 @@ func (flist *FriendList)GetRecommandFriendList(uuid,friendnum int) (*GetRecommen //保存到缓存 SaveCacheRecommandFriendList(uuid,realrt) return realrt,nil +} + +func SaveAccount(account ,pwd string) error { + //首先对pwd加密 + h := md5.New() + h.Write([]byte(pwd)) // 需要加密的字符串为 + newpwd :=hex.EncodeToString(h.Sum(nil)) + err := redishandler.GetRedisClient().HSet(redis.USER_ACCOUNT_PASSWORD_KEY,account,newpwd) + return err +} + +func CheckAccout(account ,pwd string) error { + h := md5.New() + h.Write([]byte(pwd)) // 需要加密的字符串为 + newpwd :=hex.EncodeToString(h.Sum(nil)) + pwdstr,err := redishandler.GetRedisClient().HGet(redis.USER_ACCOUNT_PASSWORD_KEY,account) + if err != nil { + return err + } + if pwdstr!= newpwd { + return errors.New("pwdword not right!") + } + return nil +} + +func SaveAccountToken(acc ,token string) { + err := redishandler.GetRedisClient().HSet(redis.USER_ACCOUNT_PASSWORD_KEY,acc,token) + if err != nil { + logger.Error("SaveAccountToken err=%v",err) + } +} + +func GetAccountToken(acc string) string { + token,err := redishandler.GetRedisClient().HGet(redis.USER_ACCOUNT_PASSWORD_KEY,acc) + if err != nil { + logger.Error("GetAccountToken failed err=%v",err) + return "" + } + + return token } \ No newline at end of file diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 7383531..1de45ca 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -30,6 +30,8 @@ func CheckErr(err error) { func startServerHttpServe() { http.HandleFunc("/catcafe/login", UserLogin) //游客登录 + http.HandleFunc("/catcafe/user/regeister", Regeister) //账号注册 + http.HandleFunc("/catcafe/user/accountlogin", AccounLogin) //账号登录 http.HandleFunc("/catcafe/wechatlogin", Wechatlogin) //微信登录 http.HandleFunc("/catcafe/user/saveUserData", SaveUserData) //保存用户数据 http.HandleFunc("/catcafe/data/saveData", SaveData) //保存游戏自定义数据 @@ -60,6 +62,28 @@ func startServerHttpServe() { CheckErr(err) } +func Regeister(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("Regeister , body:%v,uuid=%v", s) + + HandleRegeister(w,s) +} + +func AccounLogin(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("AccounLogin , body:%v,uuid=%v", s) + + HandleAccounLogin(w,s) +} + func Wechatlogin(w http.ResponseWriter, r *http.Request) { diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index 44e05cc..1454956 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -6,6 +6,7 @@ import ( "common/beegomap" "common/logger" "common/redis" + ksuid "github.com/segmentio" "io/ioutil" "strconv" @@ -65,6 +66,62 @@ func InitUserExt(req *UserLoginReq,resp *UserLoginResp,uuid int) { SaveUserExt(udata) } +func InitAccountLogin(account string) { + //首先生成token + newToken := ksuid.New().String() + //保存token与account的关系 + SaveAccountToken(account,newToken) + //首先生成user_base_data + var basedata UserBaseData + basedata.User_id = GetNewUUid() + basedata.User_avatar_url = "" + basedata.User_city = "天堂" + basedata.User_gender = 1 + basedata.User_nickname = "游客" + string(basedata.User_id) + basedata.User_openid = "" + basedata.User_token = newToken + //保存base data + basic, _ := json.Marshal(&basedata) + SaveUserBasic(basedata.User_id,string(basic)) + + SetTouristUid(newToken,basedata.User_id) + //然后生成user_ext_data + var extdata UserExtData + extdata.User_id = basedata.User_id + extdata.Lv = 1 + extdata.Bean = 0 + extdata.Coin = 0 + extdata.Exp = 0 + extdata.Hot = 0 + extdata.Invite_uid = 0 + extdata.LoveExp = 0 + extdata.Reg_time = int(time.Now().Unix()) + extdata.ShopNum = 0 + extdata.User_channel = 0 + extdata.User_is_black = 0 + extdata.User_reg_time = int(time.Now().Unix()) + extdata.User_scene = 0 + udata :=new(UserData) + udata.Scene = extdata.User_scene + udata.Hot = extdata.Hot + udata.Exp = extdata.Exp + udata.Coin = extdata.Coin + udata.Bean = extdata.Bean + udata.Lv = extdata.Lv + udata.Channel = extdata.User_channel + udata.InviteUid = extdata.Invite_uid + udata.Isblack = extdata.User_is_black + udata.Loevexp = extdata.LoveExp + udata.Regtime = extdata.Reg_time + udata.Shopnum = extdata.ShopNum + udata.Userid = extdata.User_id + udata.UserInviteId = extdata.User_invite_uid + udata.Userregtime = extdata.User_reg_time + udata.LoginTime = int(time.Now().Unix()) + udata.LoginDay = 1 + + SaveUserExt(udata) +} func InitTourist(req *UserLoginReq,resp *UserLoginResp) { //首先生成user_base_data @@ -174,6 +231,123 @@ func TransmitUserData(in *UserData ,out *UserExtData) { out.Invite_uid = in.InviteUid } +func HandleRegeister(w http.ResponseWriter, data string) { + + SetHeader(w) + var resp RegeisteraResp + resp.Status = "true" + resp.Result.Code = ERROR_OK + var rdata RegeisterReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleRegeister json unmarshal failed=%v", err) + resp.Result.Code = ERROR_JSONUNMASHFAILED + break + } + + //todo 判断密码强度? + + //判断账号是否重复有 + exist,err := redishandler.GetRedisClient().HExists(redis.USER_ACCOUNT_PASSWORD_KEY,rdata.Account) + if err != nil { + logger.Error("HandleRegeister redis failed failed=%v", err) + resp.Result.Code = ERROR_SRVDB_FAILED + break + } + + if exist { + logger.Error("HandleRegeister accountexist failed=%v", err) + resp.Result.Code = ERROR_REGEISTACCOUNTEXIST + break + } + + err = SaveAccount(rdata.Account,rdata.Password) + if err != nil { + logger.Error("HandleRegeister redis failed failed=%v", err) + resp.Result.Code = ERROR_SRVDB_FAILED + break + } + + //需要初始化数据 + InitAccountLogin(rdata.Account) + + resp.Result.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + + +func HandleAccounLogin(w http.ResponseWriter, data string) { + + SetHeader(w) + var resp AccounLoginResp + resp.Status = "true" + resp.Result.Code = ERROR_OK + var rdata AccounLoginReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleAccounLogin json unmarshal failed=%v", err) + resp.Result.Code = ERROR_JSONUNMASHFAILED + break + } + + err := CheckAccout(rdata.Account,rdata.Password) + + if err != nil { + logger.Error("HandleRegeister pwssword failed failed=%v", err) + resp.Result.Code = ERROR_ACCOUNTPWDWRONG + break + } + + //查询数据 + token := GetAccountToken(rdata.Account) + + uuid,err := GetTouristUid(token) + if err != nil || uuid==0{ + logger.Error("HandleAccounLogin getuuid failed=%v", err) + resp.Result.Code = ERROR_GETUSERIDFAILED + break + } + + basic,err := GetUserBasic(uuid) + if err != nil { + logger.Error("HandleAccounLogin getbasic failed=%v", err) + resp.Result.Code = ERROR_GETUSERBASICFAILED + break + } + resp.Result.Data.Dasedata = *basic + + ext,err := GetUserExt(uuid) + if err != nil { + logger.Error("HandleAccounLogin getext failed=%v", err) + resp.Result.Code = ERROR_GETUSEREXTFAILED + break + } + TransmitUserData(ext,&resp.Result.Data.Extdata) + + //需要处理登录数据 + HandleLoginTime(ext) + + m_userInfo.Set(uint32(ext.Userid),ext) + SaveUserExt(ext) + + + resp.Result.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + + //处理微信登录 func HandleWechatlogin(w http.ResponseWriter, data string) { diff --git a/src/common/redis/def.go b/src/common/redis/def.go index 5915847..44e4f5e 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -15,4 +15,5 @@ const ( FRIEND_APPLYLIST_KEY = "CATCAFE_FRIEND_APPLYLIST_KEY" //玩家申请好友列表,需要在末尾加死":uuid" FRIEND_APPROVELIST_KEY = "CATCAFE_FRIEND_APPROVELIST_KEY" //待批准好友列表,需要在末尾加死":uuid" FRIEND_RECOMMANDLIST_KEY = "CATCAFE_FRIEND_RECOMMANDLIST_KEY" //推荐好友缓存key + USER_ACCOUNT_PASSWORD_KEY = "CATCAFE_USER_ACCOUNT_PASSWORD_KEY" //玩家账号密码的key ) -- libgit2 0.21.0