github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/modules/apis/version2/version2.go (about) 1 package version2 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "github.com/insionng/makross" 9 "github.com/insionng/makross/jwt" 10 "github.com/insionng/yougam/helper" 11 "github.com/insionng/yougam/models" 12 ) 13 14 var herr = new(makross.HTTPError) 15 16 //Handler命名规范 请求方法+请求对象 17 18 // GetVersion 获取版本 19 func GetVersionHandler(self *makross.Context) error { 20 var m = map[string]interface{}{} 21 m["version"] = "2.0.0" //当服务端版本迭代产生不兼容时修改此版本号 22 return self.JSON(m) 23 } 24 25 // GetPongHandler 乒乓 心跳Handler 26 func GetPongHandler(self *makross.Context) error { 27 var m = map[string]interface{}{} 28 if tokenString, okay := self.Get("TokenString").(string); okay && (len(tokenString) > 0) { 29 m["Authorization"] = fmt.Sprintf("%v %v", jwt.Bearer, tokenString) 30 } 31 return self.JSON(m) 32 } 33 34 // PostSignupHandler 注册用户 35 func PostSignupHandler(self *makross.Context) error { 36 37 username := self.Args("username").String() 38 nickname := self.Args("nickname").String() 39 password := self.Args("password").String() 40 mobile := self.Args("mobile").String() 41 gender := self.Args("gender").MustInt64() 42 email := self.Args("email").String() 43 content := self.Args("content").String() //个人简介 个人签名 个性说明之类 44 group := self.Args("group").String() 45 role := self.Args("role").MustInt64() 46 47 herr.Message = "ErrServiceUnavailable" 48 herr.Status = makross.StatusServiceUnavailable 49 50 if len(password) > 0 { 51 if helper.CheckPassword(password) == false { 52 herr.Message = "密码含有非法字符或密码过短(至少4~30位密码)!" 53 return self.JSON(herr, makross.StatusServiceUnavailable) 54 55 } 56 } else { 57 herr.Message = "密码为空!" 58 return self.JSON(herr, makross.StatusServiceUnavailable) 59 60 } 61 62 if len(username) == 0 { 63 herr.Message = "用户名是为永久性设定,不能少于4个字或多于30个字,请慎重考虑,不能为空!" 64 return self.JSON(herr, makross.StatusServiceUnavailable) 65 66 } 67 68 if len(email) > 0 { 69 if helper.CheckEmail(email) == false { 70 herr.Message = "Email格式错误!" 71 return self.JSON(herr, makross.StatusServiceUnavailable) 72 } 73 } else { 74 herr.Message = "Email地址为空!" 75 return self.JSON(herr, makross.StatusServiceUnavailable) 76 } 77 78 if len(email) > 0 { 79 if usrinfo, err := models.GetUserByEmail(email); usrinfo != nil { 80 81 if usrinfo, err := models.GetUserByUsername(username); usrinfo != nil { 82 herr.Message = "此用户名不能使用!" 83 return self.JSON(herr, makross.StatusServiceUnavailable) 84 85 } else if err != nil { 86 87 herr.Message = "检索用户名账号期间出错!" 88 return self.JSON(herr, makross.StatusServiceUnavailable) 89 90 } 91 92 herr.Message = "此Email不能使用!" 93 return self.JSON(herr, makross.StatusServiceUnavailable) 94 95 } else if err != nil { 96 97 herr.Message = "检索EMAIL账号期间出错!" 98 return self.JSON(herr, makross.StatusServiceUnavailable) 99 100 } 101 } else { 102 if usrinfo, err := models.GetUserByUsername(username); usrinfo != nil { 103 104 herr.Message = "此用户名已经被注册,请重新命名!" 105 return self.JSON(herr, makross.StatusServiceUnavailable) 106 107 } else if err != nil { 108 109 herr.Message = "检索账号数据期间出错!" 110 return self.JSON(herr, makross.StatusServiceUnavailable) 111 112 } 113 } 114 115 if role == 0 { 116 role = 1 117 } 118 119 if usrid, err := models.AddUser(email, username, nickname, "", helper.EncryptHash(password, nil), group, content, mobile, gender, role); err != nil && usrid <= 0 { 120 121 herr.Message = "用户注册信息写入数据库时发生错误!" 122 return self.JSON(herr, makross.StatusServiceUnavailable) 123 124 } else { 125 126 if usrinfo, err := models.GetUser(usrid); err == nil && usrinfo != nil { 127 ///注册成功 128 models.PutSignin2User(usrinfo.Id, time.Now().Unix(), usrinfo.SigninCount+1, self.RealIP()) 129 130 //返回数据 131 return self.JSON(usrinfo) 132 133 } else { 134 135 herr.Message = "获取用户数据出错!" 136 return self.JSON(herr, makross.StatusServiceUnavailable) 137 138 } 139 140 } 141 } 142 143 // PostSignin 用户登录 144 func PostSigninHandler(self *makross.Context) error { 145 herr.Message = "ErrUnauthorized" 146 herr.Status = makross.StatusUnauthorized 147 148 password := self.Args("password").String() 149 if len(password) == 0 { 150 herr.Message = "密码为空~" 151 return self.JSON(herr, makross.StatusUnauthorized) 152 } 153 154 if helper.CheckPassword(password) == false { 155 herr.Message = "密码含有非法字符或密码过短(至少4~30位密码)!" 156 return self.JSON(herr, makross.StatusUnauthorized) 157 } 158 159 var err error 160 var usr = new(models.User) 161 var email, username string 162 uoe := self.Args("username").String() 163 mobile := self.Args("mobile").String() 164 165 if (len(uoe) == 0) && (len(mobile) == 0) { 166 herr.Message = "用户名不能少于4个字或多于30个字,登录账号至少有email或手机以及用户名之一进行登录,不能都为空!" 167 return self.JSON(herr, makross.StatusUnauthorized) 168 } 169 170 switch { 171 //mobile账号校验分支 172 case len(mobile) > 0: 173 { 174 if helper.CheckUsername(mobile) == false { 175 herr.Message = "手机号码不能包含非法字符,不能少于4个字或多于30个字!" 176 return self.JSON(herr, makross.StatusUnauthorized) 177 } 178 179 if usr, err = models.GetUserByMobile(mobile); usr != nil && err == nil { 180 if !helper.ValidateHash(usr.Password, password) { 181 herr.Message = "密码无法通过校验!" 182 return self.JSON(herr, makross.StatusUnauthorized) 183 184 } 185 } else { 186 herr.Message = "该手机号码不存在!" 187 return self.JSON(herr, makross.StatusUnauthorized) 188 189 } 190 } 191 192 //默认账号校验分支 193 default: 194 if isEmail := strings.Contains(uoe, "@"); isEmail { 195 email = uoe 196 if len(email) == 0 { 197 herr.Message = "EMAIL为空~" 198 return self.JSON(herr, makross.StatusUnauthorized) 199 } 200 201 if helper.CheckEmail(email) == false { 202 herr.Message = "Email格式不合符规格~" 203 return self.JSON(herr, makross.StatusUnauthorized) 204 } 205 206 usr, err = models.GetUserByEmail(email) 207 } else { 208 username = uoe 209 if len(username) == 0 { 210 herr.Message = "用户名称为空~" 211 return self.JSON(herr, makross.StatusUnauthorized) 212 } 213 214 if helper.CheckUsername(username) == false { 215 herr.Message = "用户名称格式不合符规格~" 216 return self.JSON(herr, makross.StatusUnauthorized) 217 } 218 219 usr, err = models.GetUserByUsername(username) 220 } 221 222 } 223 224 if (usr != nil) && (err == nil) { 225 if helper.ValidateHash(usr.Password, password) { 226 models.PutSignin2User(usr.Id, time.Now().Unix(), usr.SigninCount+1, self.RealIP()) 227 claims := jwt.NewMapClaims() 228 claims["IsRoot"] = (usr.Role == -1000) 229 claims["UserId"] = usr.Id 230 claims["Username"] = usr.Username 231 claims["exp"] = time.Now().Add(jwt.DefaultJWTConfig.Expires).Unix() 232 var data = map[string]interface{}{} 233 var secret string 234 if signingKey, okay := jwt.DefaultJWTConfig.SigningKey.(string); okay { 235 secret = signingKey 236 } 237 data["token"], _ = jwt.NewTokenString(secret, "HS256", claims) 238 data["user"] = usr 239 return self.JSON(data) 240 } else { 241 herr.Message = "密码无法通过校验~" 242 return self.JSON(herr, makross.StatusUnauthorized) 243 } 244 } else { 245 herr.Message = "该账号不存在~" 246 return self.JSON(herr, makross.StatusUnauthorized) 247 } 248 } 249 250 // GetSignout 客户端执行清除 cookie 或 local storage时触发GetSignout进行记录动作 251 func GetSignoutHandler(self *makross.Context) error { 252 claims := jwt.GetMapClaims(self) 253 var uid int64 254 if jwtUserId, okay := claims["UserId"].(float64); okay { 255 uid = int64(jwtUserId) 256 if uid <= 0 { 257 return self.JSON(nil) 258 } 259 } 260 _, e := models.PutSignout2User(uid, time.Now().Unix(), self.RealIP()) 261 return self.JSON(e) 262 } 263 264 // PostComment 发布评论 265 func PostCommentHandler(self *makross.Context) error { 266 267 herr.Message = "ErrServiceUnavailable" 268 herr.Status = makross.StatusServiceUnavailable 269 270 claims := jwt.GetMapClaims(self) 271 var uid int64 272 if jwtUserId, okay := claims["UserId"].(float64); okay { 273 uid = int64(jwtUserId) 274 if uid <= 0 { 275 herr.Message = "尚未登录" 276 return self.JSON(herr, makross.StatusServiceUnavailable) 277 } 278 } 279 280 var author string 281 if jwtUsername, okay := claims["Username"].(string); okay { 282 author = jwtUsername 283 } 284 285 rid := self.Param("id").MustInt64() //reply id 286 if rid <= 0 { 287 rid = self.Args("id").MustInt64() 288 } 289 290 var rpy models.Reply 291 self.Bind(&rpy) 292 293 if usrinfo, err := models.GetUser(uid); (err == nil) && (usrinfo != nil) { 294 295 rpy.Uid = uid 296 rpy.Author = author 297 298 if rid <= 0 { 299 //全新发布 300 if rid, err := models.PostReply(rpy.Tid, &rpy); err != nil || rid <= 0 { 301 herr.Message = "回复内容写入数据库时发生错误" 302 return self.JSON(herr, makross.StatusServiceUnavailable) 303 304 } else { 305 306 if rp, err := models.GetReply(rid); err == nil { 307 return self.JSON(rp) 308 309 } else { 310 herr.Message = "获取回复内容数据出错" 311 return self.JSON(herr, makross.StatusServiceUnavailable) 312 313 } 314 315 } 316 } else { 317 //对指定的回复内容进行更新 318 if row, err := models.PutReply(rid, &rpy); err != nil || row <= 0 { 319 herr.Message = "更新回复写入数据库时发生错误" 320 return self.JSON(herr, makross.StatusServiceUnavailable) 321 322 } else { 323 324 if rp, err := models.GetReply(rid); err == nil { 325 return self.JSON(rp) 326 327 } else { 328 herr.Message = "获取回复内容数据出错" 329 return self.JSON(herr, makross.StatusServiceUnavailable) 330 331 } 332 333 } 334 } 335 336 } else { 337 herr.Message = "获取用户数据出错" 338 return self.JSON(herr, makross.StatusServiceUnavailable) 339 340 } 341 } 342 343 // GetComment 获取评论 344 func GetCommentHandler(self *makross.Context) error { 345 346 herr.Message = "ErrServiceUnavailable" 347 herr.Status = makross.StatusServiceUnavailable 348 349 tid := self.Args("tid").MustInt64() 350 351 if tid > 0 { 352 if rps := models.GetReplysByTid(tid, 0, 0, 0, "id"); rps != nil { 353 return self.JSON(rps) 354 } 355 356 } 357 return self.JSON(herr, makross.StatusServiceUnavailable) 358 359 } 360 361 // PostReport 举报或反馈 362 func PostReportHandler(self *makross.Context) error { 363 364 herr.Message = "ErrServiceUnavailable" 365 herr.Status = makross.StatusServiceUnavailable 366 367 id := self.Args("contentid").MustInt64() 368 rid := self.Args("commentid").MustInt64() 369 tid := self.Args("topicid").MustInt64() 370 userid := self.Args("userid").MustInt64() 371 content := self.Args("content").String() 372 ctype := self.Args("ctype").MustInt64() 373 374 if usrinfo, err := models.GetUser(userid); err == nil && usrinfo != nil { 375 376 claims := jwt.GetMapClaims(self) 377 jwtUserId := claims["UserId"].(float64) 378 if suid := int64(jwtUserId); (suid > 0) && (usrinfo.Id == suid) { 379 if id <= 0 { 380 381 if rid <= 0 && tid > 0 { 382 id = tid 383 ctype = 1 384 } else if rid > 0 && tid <= 0 { 385 id = rid 386 ctype = -1 387 } else { 388 return self.JSON(herr, makross.StatusUnauthorized) 389 } 390 } 391 392 //如果已经举报过.. 393 d := map[string]int64{} 394 if models.IsReportMark(userid, id, ctype) { 395 396 d["id"] = id 397 return self.JSON(d) 398 399 } else { 400 //保存举报内容 401 if row, err := models.SetReportMark(userid, id, ctype, content); err != nil || row <= 0 { 402 herr.Message = err.Error() 403 return self.JSON(herr, makross.StatusServiceUnavailable) 404 } else { 405 d["id"] = id 406 return self.JSON(d) 407 } 408 409 } 410 411 } else { 412 herr.Message = "不是当前用户无权操作!" 413 return self.JSON(herr, makross.StatusServiceUnavailable) 414 } 415 416 } else { 417 herr.Message = "获取用户数据出错!" 418 return self.JSON(herr, makross.StatusServiceUnavailable) 419 420 } 421 }