package auth import ( "context" "crypto/md5" "fmt" "regexp" "github.com/youruser/base/internal/svc" "github.com/youruser/base/internal/types" "github.com/youruser/base/internal/util/jwt" "github.com/youruser/base/model" "github.com/zeromicro/go-zero/core/logx" ) var phoneRegex = regexp.MustCompile(`^\d{11}$`) type LoginLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic { return &LoginLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *LoginLogic) Login(req *types.LoginRequest) (resp *types.LoginResponse, err error) { var user *model.User if phoneRegex.MatchString(req.Account) { user, err = model.FindOneByPhone(l.ctx, l.svcCtx.DB, req.Account) } else { user, err = model.FindOneByUsername(l.ctx, l.svcCtx.DB, req.Account) } if err != nil { if err == model.ErrNotFound { return &types.LoginResponse{ Code: 404, Message: "用户不存在或密码错误", Success: false, }, nil } return nil, fmt.Errorf("查询用户失败: %v", err) } if user.UserType == "casdoor" { return &types.LoginResponse{ Code: 400, Message: "该账号已绑定 SSO,请使用 SSO 方式登录", Success: false, }, nil } inputPassword := fmt.Sprintf("%x", md5.Sum([]byte(req.Password))) if user.Password != inputPassword { return &types.LoginResponse{ Code: 400, Message: "用户不存在或密码错误", Success: false, }, nil } token, err := jwt.GenerateToken(user.Id, user.Username, user.Role, user.CurrentOrgId) if err != nil { return nil, fmt.Errorf("生成Token失败: %v", err) } l.Infof("登录成功,userId=%d", user.Id) return &types.LoginResponse{ Code: 200, Message: "登录成功", Success: true, Token: token, }, nil }