| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // 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)
- }
|