c_login.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package controllers
  2. import (
  3. "github.com/gogf/gf/v2/net/ghttp"
  4. "yx-dataset-server/app/bll"
  5. "yx-dataset-server/app/schema"
  6. "yx-dataset-server/library/gplus"
  7. "yx-dataset-server/library/logger"
  8. )
  9. func NewLogin(
  10. bLogin bll.ILogin,
  11. bVerify bll.IVerifyCode,
  12. bUser bll.IUser,
  13. ) *Login {
  14. return &Login{
  15. bLogin: bLogin,
  16. bVerify: bVerify,
  17. bUser: bUser,
  18. }
  19. }
  20. type Login struct {
  21. bLogin bll.ILogin
  22. bVerify bll.IVerifyCode
  23. bUser bll.IUser
  24. }
  25. // Login 用户登录
  26. // @Summary 用户登录
  27. // @Param body schema.LoginParam true
  28. // @Success 200 schema.LoginTokenInfo "{access_token:访问令牌,token_type:令牌类型,expires_in:过期时长(单位秒)}"
  29. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  30. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  31. // @Router POST /api/v1/login
  32. func (a *Login) Login(r *ghttp.Request) {
  33. var item schema.LoginParam
  34. ctx := gplus.NewContext(r)
  35. if err := gplus.ParseJson(r, &item); err != nil {
  36. ResError(r, err)
  37. return
  38. }
  39. user, err := a.bLogin.Verify(ctx, item.UserName, item.Password)
  40. if err != nil {
  41. ResError(r, err)
  42. return
  43. }
  44. // 将用户ID放入上下文
  45. gplus.SetUserId(r, user.RecordID)
  46. tokenInfo, err := a.bLogin.GenerateToken(ctx, user.RecordID)
  47. if err != nil {
  48. ResError(r, err)
  49. return
  50. }
  51. logger.StartSpan(gplus.NewContext(r), logger.SetSpanTitle("用户登录"), logger.SetSpanFuncName("Login")).Infof(ctx, "登入系统")
  52. ResSuccess(r, tokenInfo)
  53. }
  54. // Logout 用户登出
  55. // @Summary 用户登出
  56. // @Success 200 schema.HTTPStatus "{status:OK}"
  57. // @Router POST /api/v1/login/exit
  58. func (a *Login) Logout(r *ghttp.Request) {
  59. // 检查用户是否处于登录状态,如果是则执行销毁
  60. userID := gplus.GetUserID(r)
  61. ctx := gplus.NewContext(r)
  62. if userID != "" {
  63. err := a.bLogin.DestroyToken(ctx, gplus.GetToken(r))
  64. if err != nil {
  65. logger.Errorf(ctx, err.Error())
  66. }
  67. logger.StartSpan(gplus.NewContext(r), logger.SetSpanTitle("用户登出"), logger.SetSpanFuncName("Logout")).Infof(ctx, "登出系统")
  68. }
  69. ResSuccess(r, nil)
  70. }
  71. // RefreshToken 刷新令牌
  72. func (a *Login) RefreshToken(r *ghttp.Request) {
  73. ctx := gplus.NewContext(r)
  74. token, err := a.bLogin.RefreshToken(ctx)
  75. if err != nil {
  76. ResError(r, err)
  77. }
  78. ResSuccess(r, token)
  79. }
  80. // GetUserInfo 获取当前用户信息
  81. // @Router GET /web/v1/current/user
  82. func (a *Login) GetUserInfo(r *ghttp.Request) {
  83. ctx := gplus.NewContext(r)
  84. userId := gplus.GetUserID(r)
  85. info, err := a.bUser.GetCurrentUser(ctx, userId)
  86. if err != nil {
  87. ResError(r, err)
  88. return
  89. }
  90. ResSuccess(r, info)
  91. }