function.go 4.6 KB

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