function.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package utils
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/model/user"
  7. "gfast/library/response"
  8. "github.com/goflyfox/gtoken/gtoken"
  9. "github.com/gogf/gf/crypto/gaes"
  10. "github.com/gogf/gf/encoding/gbase64"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/net/ghttp"
  13. "github.com/gogf/gf/os/gtime"
  14. "github.com/gogf/gf/util/gconv"
  15. "github.com/gogf/gf/util/grand"
  16. "github.com/gogf/gf/util/gvalid"
  17. "github.com/mojocn/base64Captcha"
  18. )
  19. const AdminCbcPublicKey = "HqmP1KLMuz09Q0Bu"
  20. //获取验证码
  21. func GetVerifyImg() (idKeyC string, base64stringC string) {
  22. //字符,公式,验证码配置
  23. var configC = base64Captcha.ConfigCharacter{
  24. Height: 60,
  25. Width: 240,
  26. //const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合.
  27. Mode: base64Captcha.CaptchaModeNumberAlphabet,
  28. ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
  29. ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower,
  30. IsShowHollowLine: false,
  31. IsShowNoiseDot: false,
  32. IsShowNoiseText: false,
  33. IsShowSlimeLine: false,
  34. IsShowSineLine: true,
  35. CaptchaLen: 4,
  36. }
  37. //创建字符公式验证码.
  38. //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
  39. var capC base64Captcha.CaptchaInterface
  40. idKeyC, capC = base64Captcha.GenerateCaptcha(grand.Str(20), configC)
  41. //以base64编码
  42. base64stringC = base64Captcha.CaptchaWriteToBase64Encoding(capC)
  43. return idKeyC, base64stringC
  44. }
  45. //AdminLogin 后台用户登陆验证
  46. func AdminLogin(r *ghttp.Request) (string, interface{}) {
  47. data := r.GetFormMapStrStr()
  48. rules := map[string]string{
  49. "idValueC": "required",
  50. "username": "required",
  51. "password": "required",
  52. }
  53. msgs := map[string]interface{}{
  54. "idValueC": "请输入验证码",
  55. "username": "账号不能为空",
  56. "password": "密码不能为空",
  57. }
  58. if e := gvalid.CheckMap(data, rules, msgs); e != nil {
  59. response.JsonExit(r, response.ErrorCode, e.String())
  60. }
  61. //判断验证码是否正确
  62. /*if !base64Captcha.VerifyCaptchaAndIsClear(data["idKeyC"], data["idValueC"], true) {
  63. response.JsonExit(r, response.ErrorCode, "验证码输入错误")
  64. }*/
  65. password := EncryptCBC(data["password"], AdminCbcPublicKey)
  66. if err, user := signIn(data["username"], password, r); err != nil {
  67. response.JsonExit(r, response.ErrorCode, err.Error())
  68. } else {
  69. return data["username"] + password, user.Id
  70. }
  71. return data["username"] + password, nil
  72. }
  73. //gtoken验证后返回
  74. func AuthAfterFunc(r *ghttp.Request, respData gtoken.Resp) {
  75. if r.Method == "OPTIONS" || respData.Success() {
  76. r.Middleware.Next()
  77. } else {
  78. params := r.GetRequestMap()
  79. no := gtime.TimestampMilliStr()
  80. g.Log().Info(fmt.Sprintf("[AUTH_%s][url:%s][params:%s][data:%s]",
  81. no, r.URL.Path, params, respData.Json()))
  82. respData.Msg = "用户信息验证失败"
  83. response := r.Response
  84. options := response.DefaultCORSOptions()
  85. response.CORS(options)
  86. response.WriteJson(respData)
  87. r.ExitAll()
  88. }
  89. }
  90. //后台退出登陆
  91. func AdminLoginOut(r *ghttp.Request) bool {
  92. return true
  93. }
  94. //字符串加密
  95. func EncryptCBC(plainText, publicKey string) string {
  96. key := []byte(publicKey)
  97. b, e := gaes.EncryptCBC([]byte(plainText), key, key)
  98. if e != nil {
  99. g.Log().Error(e.Error())
  100. return ""
  101. }
  102. return gbase64.EncodeToString(b)
  103. }
  104. //字符串解密
  105. func DecryptCBC(plainText, publicKey string) string {
  106. key := []byte(publicKey)
  107. plainTextByte, e := gbase64.DecodeString(plainText)
  108. if e != nil {
  109. g.Log().Error(e.Error())
  110. return ""
  111. }
  112. b, e := gaes.DecryptCBC(plainTextByte, key, key)
  113. if e != nil {
  114. g.Log().Error(e.Error())
  115. return ""
  116. }
  117. return gbase64.EncodeToString(b)
  118. }
  119. // 用户登录,成功返回用户信息,否则返回nil
  120. func signIn(username, password string, r *ghttp.Request) (error, *user.QxkjUser) {
  121. qxkjUser, err := user.Model.Where("user_name=? and user_password=?", username, password).One()
  122. if err != nil && err != sql.ErrNoRows {
  123. return err, nil
  124. }
  125. if qxkjUser == nil {
  126. return errors.New("账号或密码错误"), nil
  127. }
  128. //更新登陆时间及ip
  129. qxkjUser.LastLoginTime = gconv.Int(gtime.Timestamp())
  130. qxkjUser.LastLoginIp = r.GetClientIp()
  131. qxkjUser.Update()
  132. return nil, qxkjUser
  133. }