// login_regular_user.go package user import ( "context" "fmt" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/request/configreq" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-base/util/jwt" "git.x2erp.com/qdy/go-db/factory/database" "git.x2erp.com/qdy/go-svc-configure/internal/service/dao" "git.x2erp.com/qdy/go-svc-configure/internal/tables" ) // GetUserToken 获取用户token(返回token) func GetUserToken(req *configreq.UserLoginRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] { logger.Debug("LoginUser-开始用户登录") // 参数验证 if req.UserID == "" || req.Password == "" { logger.ErrorC(reqCtx, "用户名和密码不能为空") return util.CreateErrorResult[string]("用户名和密码不能为空", reqCtx) } db := dbFactory.GetDB() // 首先需要确定用户属于哪个租户 // 由于user_id在租户内唯一,但不同租户可能有相同user_id // 简化:先查询用户信息(需要租户信息) // 这里需要改进:可能需要额外的租户标识 // 暂时假设user_id全局唯一,或者通过其他方式确定租户 // 先实现简单版本:查询用户(不带租户条件) var user tables.UserDB query := `SELECT user_id, tenant_id, name, mobile, password, status, email FROM config_user WHERE user_id = ? LIMIT 1` err := db.GetContext(ctx, &user, query, req.UserID) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询用户失败: %v", err)) return util.CreateErrorResult[string]("用户名或密码错误", reqCtx) } // 验证用户状态 if user.Status != 1 { logger.ErrorC(reqCtx, "用户已被禁用") return util.CreateErrorResult[string]("用户已被禁用", reqCtx) } // 验证密码 valid, err := dao.ValidateUserPassword(ctx, db, req.UserID, user.TenantID, req.Password) if err != nil || !valid { logger.ErrorC(reqCtx, fmt.Sprintf("密码验证失败: %v", err)) return util.CreateErrorResult[string]("用户名或密码错误", reqCtx) } // 获取用户角色列表 roles, err := dao.GetUserRoles(ctx, db, req.UserID, user.TenantID) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err)) // 继续处理,角色可能为空 roles = []string{} } // 生成JWT token claims := &jwt.Claims{ UserID: user.UserID, Username: user.Name, TenantID: user.TenantID, ProjectID: "", // 暂不设置项目ID Extra: map[string]interface{}{ "roles": roles, "mobile": user.Mobile, "email": user.Email, }, } secretKey := config.GetServiceConfig().SecretKey // 默认7天有效期 token, err := jwt.CreateTokenDays(claims, 7, secretKey) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("生成token失败: %v", err)) return util.CreateErrorResult[string](fmt.Sprintf("生成token失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("用户登录成功: %s, 租户: %s, 角色: %v", user.UserID, user.TenantID, roles)) return util.CreateSuccessResultData(token, reqCtx) }