package Api import ( "crypto/sha256" "encoding/hex" "github.com/aarongao/tools" "github.com/gin-gonic/gin" "gopkg.in/mgo.v2/bson" "letu/DB" "letu/Lib/Token" "regexp" "strconv" "time" ) var Regular = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$" // @Title 登录 // @Description 用户管理 - 用户登录&注册 // @Accept json // @Produce json // @Param Mobile aaron string true "手机号" // @Param Code 1 string true "验证码(使用验证码的新手机号自动注册)" // @Param DeviceId abc123 string false "手机唯一识别码,不重复(存放于http.header中)" // @Param Mac abc123 string false "网卡Mac地址(存放于http.header中)" // @Param SystemType ios string false "ios,android(存放于http.header中)" // @Param SystemVersion 13.01 string false "手机版本(存放于http.header中)" // @Param SystemModel iphone8 string false "手机型号(存放于http.header中)" // @Param AppVersion 1.0 string false "app版本号(存放于http.header中)" // @Param DeviceToken abc string false "推送token(存放于http.header中)" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":{"Id":"5e09c64c1c09c6f0f7ca2fa9","Token":"640bf934e425aba5d3c90998b2641f2f0ca07261d334d9615d1cd4790b5f34e7"}} 调用其它需要登陆的接口时携带token,有过期时间" // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" // @Router /LoginUser? [post] func LoginUser(c *gin.Context) { c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) c.Header("Access-Control-Allow-Credentials", "true") reg := regexp.MustCompile(Regular) if !reg.MatchString(c.PostForm("Mobile")) { c.JSON(200, tools.ResponseError{ 1, "手机号格式不正确", }) return } if c.PostForm("Mobile") == "" || c.PostForm("Code") == "" { c.JSON(200, tools.ResponseError{ 1, "手机号和验证码不能空", }) return } // 生成token tokenunit8 := sha256.Sum256([]byte(c.PostForm("Mobile") + c.PostForm("Code") + strconv.FormatInt(time.Now().UnixNano(), 10))) token := hex.EncodeToString(tokenunit8[:32]) // 检查验证码 cacheCode := DB.Redis.Get("code_" + c.PostForm("Mobile")) selected := bson.M{} var User *DB.SMember if cacheCode == c.PostForm("Code") { selected["Mobile"] = c.PostForm("Mobile") DB.CMember.Find(selected).One(&User) // 验证码匹配,但手机号不存在 if User == nil { objectID := bson.NewObjectId() User := DB.SMember{ &objectID, "", "", "", c.PostForm("Mobile"), "", "", "", DB.SDevice{ c.Request.Header.Get("DeviceId"), c.Request.Header.Get("Mac"), c.Request.Header.Get("UDID"), c.Request.Header.Get("SystemVersion"), c.Request.Header.Get("SystemModel"), c.Request.Header.Get("AppVersion"), c.Request.Header.Get("AppVersion"), c.Request.Header.Get("DeviceToken"), }, } DB.CMember.Insert(User) } } else { c.JSON(200, tools.ResponseError{ 1, "验证码不正确", }) return } // 更新用户信息 //DB.CMember.Update( // bson.M{"_id": User.Id}, // bson.M{"$set": bson.M{"Token": token}}, //) // 更新token Token.SaveToken(User.Id.Hex(), token) User.Token = token c.JSON(200, tools.ResponseSeccess{ 0, User, }) } // @Title 注册客户端 // @Description 用户管理 - 注册客户端 // @Accept json // @Produce json // @Param DeviceId abc123 string false "手机唯一识别码,不重复(存放于http.header中)" // @Param Mac abc123 string false "网卡Mac地址(存放于http.header中)" // @Param SystemType ios string false "ios,android(存放于http.header中)" // @Param SystemVersion 13.01 string false "手机版本(存放于http.header中)" // @Param SystemModel iphone8 string false "手机型号(存放于http.header中)" // @Param AppVersion 1.0 string false "app版本号(存放于http.header中)" // @Param DeviceToken abc string false "推送token(存放于http.header中)" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"ok"}" // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" // @Router /RegisterDevice? [post] func RegisterDevice(c *gin.Context) { c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) c.Header("Access-Control-Allow-Credentials", "true") if c.Request.Header.Get("DeviceId") == "" { c.JSON(200, tools.ResponseError{ 1, "DeviceId不正确", }) return } DB.CDevice.Upsert( bson.M{"DeviceId":c.Request.Header.Get("DeviceId")}, bson.M{"$set": bson.M{ "Mac":c.Request.Header.Get("Mac"), "UDID":c.Request.Header.Get("UDID"), "SystemType":c.Request.Header.Get("SystemType"), "SystemVersion":c.Request.Header.Get("SystemVersion"), "SystemModel":c.Request.Header.Get("SystemModel"), "AppVersion":c.Request.Header.Get("AppVersion"), "DeviceToken":c.Request.Header.Get("DeviceToken"), }}, ) c.JSON(200, tools.ResponseSeccess{ 0, "ok", }) } // @Title 用户信息 // @Description 用户管理 - 获取用户信息 // @Accept json // @Produce json // @Param id aaron string true "用户id" // @Param Token wgergejfwe string true "用户token" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":{"Id":"5e09c64c1c09c6f0f7ca2fa9","Token":"640bf934e425aba5d3c90998b2641f2f0ca07261d334d9615d1cd4790b5f34e7"}}" // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" // @Router /UserInfo? [get] func UserInfo(c *gin.Context) { c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) c.Header("Access-Control-Allow-Credentials", "true") if c.Query("Token") == "" || bson.IsObjectIdHex(c.Query("id")) == false { c.JSON(200, tools.ResponseError{ 1, "Token或者用户id不正确", }) return } if Token.GetToken(c.Query("id")) != c.Query("Token") { c.JSON(200, tools.ResponseError{ 401, "token过期", }) return } var User DB.SMember DB.CMember.Find(bson.M{"_id": bson.ObjectIdHex(c.Query("id"))}).One(&User) User.Device = DB.SDevice{} c.JSON(200, tools.ResponseSeccess{ 0, User, }) } // @Title 用户信息 // @Description 用户管理 - 检查Token是否过期 // @Accept json // @Produce json // @Param id aaron string true "用户id" // @Param Token wgergejfwe string true "用户token" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"ok"}" // @Failure 500 {object} tools.ResponseError "{"errcode":401,"errmsg":"token过期"}" // @Router /CheckToken? [get] func CheckToken(c *gin.Context) { c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) c.Header("Access-Control-Allow-Credentials", "true") if c.PostForm("Token") == "" || bson.IsObjectIdHex(c.PostForm("id")) == false { c.JSON(200, tools.ResponseError{ 1, "Token或者用户id不正确", }) return } if Token.GetToken(c.PostForm("id")) != c.PostForm("Token") { c.JSON(200, tools.ResponseError{ 401, "token过期", }) return } c.JSON(200, tools.ResponseSeccess{ 0, "ok", }) } // @Title 修改用户信息 // @Description 用户管理 - 修改用户信息 // @Accept json // @Produce json // @Param id aaron string true "用户id"" // @Param Token wgergejfwe string true "用户token" // @Param Birthday 2010.10.10 string true "生日" // @Param FullName aarongao string true "全名" // @Param Code 12345678 string true "6位验证码" // @Param Mobile 18616619599 string true "手机,同用户名" // @Param Sex 男 string true "性别" // @Param Openid 12345 string true "微信id" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"ok"}" // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" // @Router /UpdateUser? [post] func UpdateUser(c *gin.Context) { c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) c.Header("Access-Control-Allow-Credentials", "true") if c.PostForm("Token") == "" || bson.IsObjectIdHex(c.PostForm("id")) == false { c.JSON(200, tools.ResponseError{ 1, "Token或者用户id不正确", }) return } if Token.GetToken(c.PostForm("id")) != c.PostForm("Token") { c.JSON(200, tools.ResponseError{ 401, "token过期", }) return } reg := regexp.MustCompile(Regular) if !reg.MatchString(c.PostForm("Mobile")) { c.JSON(200, tools.ResponseError{ 1, "手机号格式不正确", }) return } if c.PostForm("Mobile") == "" || c.PostForm("Code") == "" { c.JSON(200, tools.ResponseError{ 1, "手机号或验证码不能为空", }) return } //if c.PostForm("Password") != c.PostForm("ConfirmPassword") { // c.JSON(200, tools.ResponseError{ // 1, // "2次密码不一致", // }) // return //} // 检查验证码 code := DB.Redis.Get("code_" + c.PostForm("Mobile")) if code == "" || code != c.PostForm("Code") { c.JSON(200, tools.ResponseError{ 1, "验证码错误", }) return } err := DB.CMember.Update( bson.M{"_id": bson.ObjectIdHex(c.PostForm("id"))}, bson.M{"$set": bson.M{ "Birthday": c.PostForm("Birthday"), "FullName": c.PostForm("FullName"), "Mobile": c.PostForm("Mobile"), "Sex": c.PostForm("Sex"), }}, ) if err == nil { var User *DB.SMember DB.CMember.Find(bson.M{"_id": bson.ObjectIdHex(c.PostForm("id"))}).One(&User) c.JSON(200, tools.ResponseSeccess{ 0, User, }) } else { c.JSON(200, tools.ResponseError{ 1, err.Error(), }) } }