function.go 4.6 KB

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