busniess-user-center/internal/service/user/user.go

177 lines
3.9 KiB
Go

package user
import (
"busniess-user-center/config"
"busniess-user-center/internal/models"
"busniess-user-center/internal/repo"
"busniess-user-center/pkg/redis"
contextUtil "busniess-user-center/pkg/utils/context"
stringUtil "busniess-user-center/pkg/utils/string"
"busniess-user-center/pkg/utils/token"
"context"
"fmt"
"github.com/samber/do"
"go.uber.org/zap"
"gorm.io/gorm"
)
const (
COOKIE_KEY_TOKEN = "token"
COOKIE_KEY_ACCOUNT = "account"
COOKIE_KEY_ID = "id"
saltLen = 8
)
func init() {
do.Provide(nil, NewUserService)
}
type userService struct {
logger *zap.SugaredLogger
repo repo.UserRepo
redis *redis.Redis
conf *config.AppConfig
tokenRefresher *token.TokenRefresher
}
func NewUserService(i *do.Injector) (UserService, error) {
return &userService{
logger: do.MustInvoke[*zap.SugaredLogger](i),
repo: do.MustInvoke[repo.UserRepo](i),
redis: do.MustInvoke[*redis.Redis](i),
conf: do.MustInvoke[*config.AppConfig](i),
tokenRefresher: do.MustInvoke[*token.TokenRefresher](i),
}, nil
}
func (u *userService) Add(ctx context.Context, info *models.AddInfo) (id uint, err error) {
session, err := contextUtil.GetSession(ctx)
if err != nil {
return
}
// 判断手机号
_, err = u.repo.GetUserByAccount(ctx, info.Account)
if err != nil && err != gorm.ErrRecordNotFound {
return
}
if err == nil {
err = fmt.Errorf("用户%s已经存在", info.Account)
return
}
// 判断账号,手机号是否唯一
mUser, err := u.repo.GetUserByMobile(ctx, info.Mobile)
if err != nil && err != gorm.ErrRecordNotFound {
return
}
if err == nil {
err = fmt.Errorf("手机号:%s的用户%s已经存在", info.Mobile, mUser.Account)
return
}
// 邮箱
eUser, err := u.repo.GetUserByEmail(ctx, info.Email)
if err != nil && err != gorm.ErrRecordNotFound {
return
}
if err == nil {
err = fmt.Errorf("邮箱:%s的用户%s已经存在", info.Mobile, eUser.Account)
}
salt := stringUtil.RandStringRunes(saltLen)
pwd := u.sha256(info.Pwd, salt)
user := repo.User{
Account: info.Account,
Name: info.Name,
Mobile: info.Mobile,
Email: info.Email,
Pwd: pwd,
Sex: info.Sex,
CreatedBy: session.Account,
}
err = u.repo.CreateUser(ctx, &user)
id = user.ID
return
}
func (u *userService) Login(ctx context.Context, info models.LoginInfo) error {
// 通过account获取用户信息
user, err := u.repo.GetUserByAccount(ctx, info.Account)
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("%s用户不存在", info.Account)
}
if err != nil {
return err
}
//输入的密码和加盐后sha256的值跟数据库的值比较
pwd := u.sha256(info.Pwd, user.Salt)
if user.Pwd != pwd {
return fmt.Errorf("%s密码错误", info.Account)
}
// 生成token,写入redis
claims := creteLoginTokenClaims(&user, u.conf.Jwt.Expires)
return u.setLoginStatus(ctx, user, claims)
}
func (u *userService) Logout(ctx context.Context) error {
// 获取当前用户信息
session, err := contextUtil.GetSession(ctx)
if err != nil {
return err
}
// 删除redis缓存
if err = u.tokenRefresher.DeleteToken(session.ID); err != nil {
return err
}
// remome cookie
u.removeCookie(ctx)
return nil
}
func (u *userService) Modify() error {
// 获取当前操作用户
// 判断修改用户是否是同一个人
return nil
}
func (u *userService) Disable() error {
// 获取操作用户
// 判断是否有权限
// 修改对应用户状态
return nil
}
func (u *userService) Able() error {
// 获取操作用户
// 判断是否有权限
// 修改对应用户状态
return nil
}
func (u *userService) Users() error {
// 获取操作用户
// 判断是否有权限
// 返回用户列表
return nil
}
func (u *userService) ResetPwd() error {
// 获取操作用户
// 判断是否本人操作
// 判断当前密码是否正确
// 生成新的密码并保存
// 删除旧的缓存
return nil
}