Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

login_regular_user.go 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // login_regular_user.go
  2. package user
  3. import (
  4. "context"
  5. "fmt"
  6. "git.x2erp.com/qdy/go-base/config"
  7. "git.x2erp.com/qdy/go-base/ctx"
  8. "git.x2erp.com/qdy/go-base/logger"
  9. "git.x2erp.com/qdy/go-base/model/request/configreq"
  10. "git.x2erp.com/qdy/go-base/model/response"
  11. "git.x2erp.com/qdy/go-base/util"
  12. "git.x2erp.com/qdy/go-base/util/jwt"
  13. "git.x2erp.com/qdy/go-db/factory/database"
  14. "git.x2erp.com/qdy/go-svc-configure/internal/service/dao"
  15. "git.x2erp.com/qdy/go-svc-configure/internal/tables"
  16. )
  17. // GetUserToken 获取用户token(返回token)
  18. func GetUserToken(req *configreq.UserLoginRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] {
  19. logger.Debug("LoginUser-开始用户登录")
  20. // 参数验证
  21. if req.UserID == "" || req.Password == "" {
  22. logger.ErrorC(reqCtx, "用户名和密码不能为空")
  23. return util.CreateErrorResult[string]("用户名和密码不能为空", reqCtx)
  24. }
  25. db := dbFactory.GetDB()
  26. // 首先需要确定用户属于哪个租户
  27. // 由于user_id在租户内唯一,但不同租户可能有相同user_id
  28. // 简化:先查询用户信息(需要租户信息)
  29. // 这里需要改进:可能需要额外的租户标识
  30. // 暂时假设user_id全局唯一,或者通过其他方式确定租户
  31. // 先实现简单版本:查询用户(不带租户条件)
  32. var user tables.UserDB
  33. query := `SELECT user_id, tenant_id, name, mobile, password, status, email FROM config_user WHERE user_id = ? LIMIT 1`
  34. err := db.GetContext(ctx, &user, query, req.UserID)
  35. if err != nil {
  36. logger.ErrorC(reqCtx, fmt.Sprintf("查询用户失败: %v", err))
  37. return util.CreateErrorResult[string]("用户名或密码错误", reqCtx)
  38. }
  39. // 验证用户状态
  40. if user.Status != 1 {
  41. logger.ErrorC(reqCtx, "用户已被禁用")
  42. return util.CreateErrorResult[string]("用户已被禁用", reqCtx)
  43. }
  44. // 验证密码
  45. valid, err := dao.ValidateUserPassword(ctx, db, req.UserID, user.TenantID, req.Password)
  46. if err != nil || !valid {
  47. logger.ErrorC(reqCtx, fmt.Sprintf("密码验证失败: %v", err))
  48. return util.CreateErrorResult[string]("用户名或密码错误", reqCtx)
  49. }
  50. // 获取用户角色列表
  51. roles, err := dao.GetUserRoles(ctx, db, req.UserID, user.TenantID)
  52. if err != nil {
  53. logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err))
  54. // 继续处理,角色可能为空
  55. roles = []string{}
  56. }
  57. // 生成JWT token
  58. claims := &jwt.Claims{
  59. UserID: user.UserID,
  60. Username: user.Name,
  61. TenantID: user.TenantID,
  62. ProjectID: "", // 暂不设置项目ID
  63. Extra: map[string]interface{}{
  64. "roles": roles,
  65. "mobile": user.Mobile,
  66. "email": user.Email,
  67. },
  68. }
  69. secretKey := config.GetServiceConfig().SecretKey
  70. // 默认7天有效期
  71. token, err := jwt.CreateTokenDays(claims, 7, secretKey)
  72. if err != nil {
  73. logger.ErrorC(reqCtx, fmt.Sprintf("生成token失败: %v", err))
  74. return util.CreateErrorResult[string](fmt.Sprintf("生成token失败: %v", err), reqCtx)
  75. }
  76. logger.Debug(fmt.Sprintf("用户登录成功: %s, 租户: %s, 角色: %v", user.UserID, user.TenantID, roles))
  77. return util.CreateSuccessResultData(token, reqCtx)
  78. }