159 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package system
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"encoding/json"
 | |
| 	"errors"
 | |
| 	"time"
 | |
| 
 | |
| 	"management/internal/db/model/dto"
 | |
| 	db "management/internal/db/sqlc"
 | |
| 	"management/internal/erpserver/model/req"
 | |
| 	"management/internal/global/know"
 | |
| 	"management/internal/pkg/crypto"
 | |
| 	"management/internal/pkg/session"
 | |
| )
 | |
| 
 | |
| // UserBiz 定义处理用户请求所需的方法.
 | |
| type UserBiz interface {
 | |
| 	Create(ctx context.Context, req *db.CreateSysUserParams) (*db.SysUser, error)
 | |
| 	Update(ctx context.Context, req *db.UpdateSysUserParams) (*db.SysUser, error)
 | |
| 	List(ctx context.Context, q dto.SearchDto) ([]*db.ListSysUserConditionRow, int64, error)
 | |
| 	Get(ctx context.Context, id int32) (*db.SysUser, error)
 | |
| 
 | |
| 	UserExpansion
 | |
| }
 | |
| 
 | |
| // UserExpansion 定义用户操作的扩展方法.
 | |
| type UserExpansion interface {
 | |
| 	Login(ctx context.Context, req *req.Login) error
 | |
| }
 | |
| 
 | |
| // userBiz 是 UserBiz 接口的实现.
 | |
| type userBiz struct {
 | |
| 	store   db.Store
 | |
| 	session session.ISession
 | |
| }
 | |
| 
 | |
| // 确保 userBiz 实现了 UserBiz 接口.
 | |
| var _ UserBiz = (*userBiz)(nil)
 | |
| 
 | |
| func NewUser(store db.Store, session session.ISession) *userBiz {
 | |
| 	return &userBiz{
 | |
| 		store:   store,
 | |
| 		session: session,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (b *userBiz) Create(ctx context.Context, req *db.CreateSysUserParams) (*db.SysUser, error) {
 | |
| 	return b.store.CreateSysUser(ctx, req)
 | |
| }
 | |
| 
 | |
| func (b *userBiz) Update(ctx context.Context, req *db.UpdateSysUserParams) (*db.SysUser, error) {
 | |
| 	return b.store.UpdateSysUser(ctx, req)
 | |
| }
 | |
| 
 | |
| func (b *userBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.ListSysUserConditionRow, int64, error) {
 | |
| 	count, err := b.store.CountSysUserCondition(ctx, &db.CountSysUserConditionParams{
 | |
| 		IsStatus: q.SearchStatus != 9999,
 | |
| 		Status:   int32(q.SearchStatus),
 | |
| 		IsID:     q.SearchID != 0,
 | |
| 		ID:       int32(q.SearchID),
 | |
| 		Username: q.SearchName,
 | |
| 		Email:    q.SearchEmail,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, 0, err
 | |
| 	}
 | |
| 
 | |
| 	users, err := b.store.ListSysUserCondition(ctx, &db.ListSysUserConditionParams{
 | |
| 		IsStatus: q.SearchStatus != 9999,
 | |
| 		Status:   int32(q.SearchStatus),
 | |
| 		IsID:     q.SearchID != 0,
 | |
| 		ID:       int32(q.SearchID),
 | |
| 		Username: q.SearchName,
 | |
| 		Email:    q.SearchEmail,
 | |
| 		Skip:     (int32(q.Page) - 1) * int32(q.Rows),
 | |
| 		Size:     int32(q.Rows),
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, 0, err
 | |
| 	}
 | |
| 
 | |
| 	return users, count, nil
 | |
| }
 | |
| 
 | |
| func (b *userBiz) Get(ctx context.Context, id int32) (*db.SysUser, error) {
 | |
| 	return b.store.GetSysUser(ctx, id)
 | |
| }
 | |
| 
 | |
| func (b *userBiz) Login(ctx context.Context, req *req.Login) error {
 | |
| 	log := &db.CreateSysUserLoginLogParams{
 | |
| 		CreatedAt:  time.Now(),
 | |
| 		Email:      req.Email,
 | |
| 		IsSuccess:  false,
 | |
| 		RefererUrl: req.Referrer,
 | |
| 		Url:        req.Url,
 | |
| 		Os:         req.Os,
 | |
| 		Ip:         req.Ip,
 | |
| 		Browser:    req.Browser,
 | |
| 	}
 | |
| 
 | |
| 	user, err := b.store.GetSysUserByEmail(ctx, req.Email)
 | |
| 	if err != nil {
 | |
| 		log.Message = err.Error()
 | |
| 		_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 		return err
 | |
| 	}
 | |
| 	log.UserUuid = user.Uuid
 | |
| 	log.Username = user.Username
 | |
| 
 | |
| 	err = crypto.BcryptComparePassword(user.HashedPassword, req.Password+user.Salt)
 | |
| 	if err != nil {
 | |
| 		log.Message = "compare password failed"
 | |
| 		_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 		return errors.New(log.Message)
 | |
| 	}
 | |
| 
 | |
| 	// 登陆成功
 | |
| 
 | |
| 	if user.RoleID == 0 {
 | |
| 		log.Message = "账号没有配置角色, 请联系管理员"
 | |
| 		_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 		return errors.New(log.Message)
 | |
| 	}
 | |
| 
 | |
| 	sysRole, err := b.store.GetSysRole(ctx, user.RoleID)
 | |
| 	if err != nil {
 | |
| 		log.Message = "账号配置的角色错误, 请联系管理员"
 | |
| 		_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 		return errors.New(log.Message)
 | |
| 	}
 | |
| 
 | |
| 	auth := dto.AuthorizeUser{
 | |
| 		ID:       user.ID,
 | |
| 		Uuid:     user.Uuid,
 | |
| 		Email:    user.Email,
 | |
| 		Username: user.Username,
 | |
| 		RoleID:   sysRole.ID,
 | |
| 		RoleName: sysRole.Name,
 | |
| 		OS:       log.Os,
 | |
| 		IP:       log.Ip,
 | |
| 		Browser:  log.Browser,
 | |
| 	}
 | |
| 
 | |
| 	gob, err := json.Marshal(auth)
 | |
| 	if err != nil {
 | |
| 		log.Message = err.Error()
 | |
| 		_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	b.session.Put(ctx, know.StoreName, gob)
 | |
| 
 | |
| 	log.IsSuccess = true
 | |
| 	log.Message = "登陆成功"
 | |
| 	_ = b.store.CreateSysUserLoginLog(ctx, log)
 | |
| 	return nil
 | |
| }
 |