account.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package controllers
  2. import (
  3. "time"
  4. "strings"
  5. "github.com/lifei6671/godoc/conf"
  6. "github.com/lifei6671/godoc/models"
  7. "github.com/lifei6671/godoc/utils"
  8. "github.com/astaxie/beego"
  9. "github.com/astaxie/beego/logs"
  10. "github.com/lifei6671/gocaptcha"
  11. "regexp"
  12. )
  13. // AccountController 用户登录与注册.
  14. type AccountController struct {
  15. BaseController
  16. }
  17. // Login 用户登录.
  18. func (c *AccountController) Login() {
  19. c.Prepare()
  20. var remember struct { MemberId int ; Account string; Time time.Time}
  21. //如果Cookie中存在登录信息
  22. if cookie,ok := c.GetSecureCookie(conf.GetAppKey(),"login");ok{
  23. if err := utils.Decode(cookie,&remember); err == nil {
  24. member := models.NewMember()
  25. member.MemberId = remember.MemberId
  26. if err := models.NewMember().Find(remember.MemberId); err == nil {
  27. c.SetMember(*member)
  28. c.Redirect(beego.URLFor("HomeController.Index"), 302)
  29. c.StopRun()
  30. }
  31. }
  32. }
  33. if c.Ctx.Input.IsPost() {
  34. account := c.GetString("account")
  35. password := c.GetString("password")
  36. captcha := c.GetString("code")
  37. is_remember := c.GetString("is_remember")
  38. //如果开启了验证码
  39. if v,ok := c.Option["ENABLED_CAPTCHA"]; ok && strings.EqualFold(v,"true") {
  40. v,ok := c.GetSession(conf.CaptchaSessionName).(string);
  41. if !ok || !strings.EqualFold(v,captcha){
  42. c.JsonResult(6001,"验证码不正确")
  43. }
  44. }
  45. member,err := models.NewMember().Login(account,password)
  46. //如果没有数据
  47. if err == nil {
  48. c.SetMember(*member)
  49. if strings.EqualFold(is_remember,"yes") {
  50. remember.MemberId = member.MemberId
  51. remember.Account = member.Account
  52. remember.Time = time.Now()
  53. v ,err := utils.Encode(remember)
  54. if err == nil {
  55. c.SetSecureCookie(conf.GetAppKey(),"login",v)
  56. }
  57. }
  58. c.JsonResult(0,"ok")
  59. }else{
  60. logs.Error("用户登录 =>",err)
  61. c.JsonResult(500,"账号或密码错误",nil)
  62. }
  63. return
  64. }else{
  65. c.Layout = ""
  66. c.TplName = "account/login.tpl"
  67. }
  68. }
  69. func (c *AccountController) Register() {
  70. c.TplName = "account/register.tpl"
  71. //如果没有开启用户注册
  72. if v,ok := c.Option["ENABLED_REGISTER"]; ok && !strings.EqualFold(v,"true") {
  73. c.Abort("404")
  74. }
  75. if c.Ctx.Input.IsPost() {
  76. account := c.GetString("account")
  77. password1 := c.GetString("password1")
  78. password2 := c.GetString("password2")
  79. email := c.GetString("email")
  80. captcha := c.GetString("code")
  81. if ok,err := regexp.MatchString(conf.RegexpAccount,account); account == "" || !ok || err != nil {
  82. c.JsonResult(6001,"账号只能由英文字母数字组成,且在3-50个字符")
  83. }
  84. if l := strings.Count(password1,"") ; password1 == "" || l > 50 || l < 6{
  85. c.JsonResult(6002,"密码必须在6-50个字符之间")
  86. }
  87. if password1 != password2 {
  88. c.JsonResult(6003,"确认密码不正确")
  89. }
  90. if ok,err := regexp.MatchString(conf.RegexpEmail,email); !ok || err != nil || email == "" {
  91. c.JsonResult(6004,"邮箱格式不正确")
  92. }
  93. //如果开启了验证码
  94. if v,ok := c.Option["ENABLED_CAPTCHA"]; ok && strings.EqualFold(v,"true") {
  95. v,ok := c.GetSession(conf.CaptchaSessionName).(string);
  96. if !ok || !strings.EqualFold(v,captcha){
  97. c.JsonResult(6001,"验证码不正确")
  98. }
  99. }
  100. member := models.NewMember()
  101. if _,err := member.FindByAccount(account); err == nil && member.MemberId > 0 {
  102. c.JsonResult(6005,"账号已存在")
  103. }
  104. member.Account = account
  105. member.Password = password1
  106. member.Role = conf.MemberGeneralRole
  107. member.Avatar = conf.GetDefaultAvatar()
  108. member.CreateAt = 0
  109. member.Email = email
  110. member.Status = 0
  111. if err := member.Add(); err != nil {
  112. beego.Error(err)
  113. c.JsonResult(6006,"注册失败,请联系系统管理员处理")
  114. }
  115. c.JsonResult(0,"ok",member)
  116. }
  117. }
  118. func (p *AccountController) FindPassword() {
  119. p.TplName = "account/find_password.tpl"
  120. }
  121. // Logout 退出登录.
  122. func (c *AccountController) Logout(){
  123. c.SetMember(models.Member{});
  124. c.Redirect(beego.URLFor("AccountController.Login"),302)
  125. }
  126. func (c *AccountController) Captcha() {
  127. c.Prepare()
  128. captchaImage, err := gocaptcha.NewCaptchaImage(140, 40, gocaptcha.RandLightColor())
  129. if err != nil {
  130. beego.Error(err)
  131. c.Abort("500")
  132. }
  133. captchaImage.DrawNoise(gocaptcha.CaptchaComplexLower)
  134. //captchaImage.DrawTextNoise(gocaptcha.CaptchaComplexHigh)
  135. txt := gocaptcha.RandText(4)
  136. c.SetSession(conf.CaptchaSessionName,txt)
  137. captchaImage.DrawText(txt)
  138. //captchaImage.Drawline(3);
  139. captchaImage.DrawBorder(gocaptcha.ColorToRGB(0x17A7A7A))
  140. //captchaImage.DrawHollowLine()
  141. captchaImage.SaveImage(c.Ctx.ResponseWriter, gocaptcha.ImageFormatJpeg)
  142. c.StopRun()
  143. }