🎨 remove xorm & add gorm gen

This commit is contained in:
landaiqing
2024-11-21 13:03:47 +08:00
parent 9b5e454eca
commit f32ac241a6
84 changed files with 8865 additions and 3476 deletions

View File

@@ -2,11 +2,12 @@ package user
import (
"context"
"errors"
"net/http"
"time"
"github.com/zeromicro/go-zero/core/logx"
"xorm.io/xorm"
"gorm.io/gorm"
"schisandra-album-cloud-microservices/app/core/api/common/captcha/verify"
"schisandra-album-cloud-microservices/app/core/api/common/constant"
@@ -16,6 +17,7 @@ import (
"schisandra-album-cloud-microservices/app/core/api/internal/svc"
"schisandra-album-cloud-microservices/app/core/api/internal/types"
"schisandra-album-cloud-microservices/app/core/api/repository/mysql/model"
"schisandra-album-cloud-microservices/app/core/api/repository/mysql/query"
)
type AccountLoginLogic struct {
@@ -37,43 +39,44 @@ func (l *AccountLoginLogic) AccountLogin(w http.ResponseWriter, r *http.Request,
if !verifyResult {
return response.ErrorWithI18n(l.ctx, "captcha.verificationFailure"), nil
}
var user model.ScaAuthUser
var query *xorm.Session
user := l.svcCtx.DB.ScaAuthUser
var selectedUser query.IScaAuthUserDo
switch {
case utils.IsPhone(req.Account):
query = l.svcCtx.DB.Where("phone = ? AND deleted = ?", req.Account, 0)
selectedUser = user.Where(user.Phone.Eq(req.Account), user.Deleted.Eq(constant.NotDeleted))
case utils.IsEmail(req.Account):
query = l.svcCtx.DB.Where("email = ? AND deleted = ?", req.Account, 0)
selectedUser = user.Where(user.Email.Eq(req.Account), user.Deleted.Eq(constant.NotDeleted))
case utils.IsUsername(req.Account):
query = l.svcCtx.DB.Where("username = ? AND deleted = ?", req.Account, 0)
selectedUser = user.Where(user.Username.Eq(req.Account), user.Deleted.Eq(constant.NotDeleted))
default:
return response.ErrorWithI18n(l.ctx, "login.invalidAccount"), nil
}
has, err := query.Get(&user)
userInfo, err := selectedUser.First()
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return response.ErrorWithI18n(l.ctx, "login.userNotRegistered"), nil
}
return nil, err
}
if !has {
return response.ErrorWithI18n(l.ctx, "login.userNotRegistered"), nil
}
if !utils.Verify(user.Password, req.Password) {
if !utils.Verify(userInfo.Password, req.Password) {
return response.ErrorWithI18n(l.ctx, "login.invalidPassword"), nil
}
data, err := HandleUserLogin(user, l.svcCtx, req.AutoLogin, r, w, l.ctx)
data, err := HandleUserLogin(userInfo, l.svcCtx, req.AutoLogin, r, w, l.ctx)
if err != nil {
return nil, err
}
// 记录用户登录设备
if err = GetUserLoginDevice(user.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB, l.ctx); err != nil {
if err = GetUserLoginDevice(userInfo.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB); err != nil {
return nil, err
}
return response.SuccessWithData(data), nil
}
// HandleUserLogin 处理用户登录
func HandleUserLogin(user model.ScaAuthUser, svcCtx *svc.ServiceContext, autoLogin bool, r *http.Request, w http.ResponseWriter, ctx context.Context) (*types.LoginResponse, error) {
func HandleUserLogin(user *model.ScaAuthUser, svcCtx *svc.ServiceContext, autoLogin bool, r *http.Request, w http.ResponseWriter, ctx context.Context) (*types.LoginResponse, error) {
// 生成jwt token
accessToken := jwt.GenerateAccessToken(svcCtx.Config.Auth.AccessSecret, jwt.AccessJWTPayload{
UserID: user.UID,

View File

@@ -8,12 +8,13 @@ import (
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
"github.com/mssola/useragent"
"github.com/zeromicro/go-zero/core/logx"
"xorm.io/xorm"
"gorm.io/gorm"
"schisandra-album-cloud-microservices/app/core/api/common/constant"
"schisandra-album-cloud-microservices/app/core/api/common/utils"
"schisandra-album-cloud-microservices/app/core/api/internal/svc"
"schisandra-album-cloud-microservices/app/core/api/repository/mysql/model"
"schisandra-album-cloud-microservices/app/core/api/repository/mysql/query"
)
type GetUserDeviceLogic struct {
@@ -40,14 +41,14 @@ func (l *GetUserDeviceLogic) GetUserDevice(r *http.Request) error {
return errors.New("user session not found")
}
if err = GetUserLoginDevice(uid, r, l.svcCtx.Ip2Region, l.svcCtx.DB, l.ctx); err != nil {
if err = GetUserLoginDevice(uid, r, l.svcCtx.Ip2Region, l.svcCtx.DB); err != nil {
return err
}
return nil
}
// GetUserLoginDevice 获取用户登录设备
func GetUserLoginDevice(userId string, r *http.Request, ip2location *xdb.Searcher, db *xorm.Engine, ctx context.Context) error {
func GetUserLoginDevice(userId string, r *http.Request, ip2location *xdb.Searcher, DB *query.Query) error {
userAgent := r.Header.Get("User-Agent")
if userAgent == "" {
return errors.New("user agent not found")
@@ -67,54 +68,45 @@ func GetUserLoginDevice(userId string, r *http.Request, ip2location *xdb.Searche
mozilla := ua.Mozilla()
platform := ua.Platform()
engine, engineVersion := ua.Engine()
var device model.ScaAuthUserDevice
has, err := db.Where("user_id = ? AND ip = ? AND agent = ?", userId, ip, userAgent).Get(&device)
if err != nil {
var newIsBot int64 = 0
var newIsMobile int64 = 0
if isBot {
newIsBot = 1
}
if mobile {
newIsMobile = 1
}
userDevice := DB.ScaAuthUserDevice
device, err := userDevice.Where(userDevice.UserID.Eq(userId), userDevice.IP.Eq(ip), userDevice.Agent.Eq(userAgent)).First()
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if !has {
newDevice := &model.ScaAuthUserDevice{
UserID: userId,
Bot: newIsBot,
Agent: userAgent,
Browser: browser,
BrowserVersion: browserVersion,
EngineName: engine,
EngineVersion: engineVersion,
IP: ip,
Location: location,
OperatingSystem: os,
Mobile: newIsMobile,
Mozilla: mozilla,
Platform: platform,
}
if device == nil {
// 创建新的设备记录
newDevice := &model.ScaAuthUserDevice{
UserId: userId,
Bot: isBot,
Agent: userAgent,
Browser: browser,
BrowserVersion: browserVersion,
EngineName: engine,
EngineVersion: engineVersion,
Ip: ip,
Location: location,
OperatingSystem: os,
Mobile: mobile,
Mozilla: mozilla,
Platform: platform,
}
affected, err := db.Insert(newDevice)
if err != nil || affected == 0 {
return errors.New("create user device failed")
err = DB.ScaAuthUserDevice.Create(newDevice)
if err != nil {
return err
}
return nil
} else {
// 如果设备存在,执行更新
device.Bot = isBot
device.Agent = userAgent
device.Browser = browser
device.BrowserVersion = browserVersion
device.EngineName = engine
device.EngineVersion = engineVersion
device.Ip = ip
device.Location = location
device.OperatingSystem = os
device.Mobile = mobile
device.Mozilla = mozilla
device.Platform = platform
affected, err := db.ID(device.Id).Update(&device)
if err != nil || affected == 0 {
return errors.New("update user device failed")
resultInfo, err := userDevice.Where(userDevice.ID.Eq(device.ID)).Updates(newDevice)
if err != nil || resultInfo.RowsAffected == 0 {
return errors.New("update device failed")
}
return nil
}

View File

@@ -8,6 +8,7 @@ import (
"github.com/yitter/idgenerator-go/idgen"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
"schisandra-album-cloud-microservices/app/core/api/common/constant"
randomname "schisandra-album-cloud-microservices/app/core/api/common/random_name"
@@ -43,48 +44,51 @@ func (l *PhoneLoginLogic) PhoneLogin(r *http.Request, w http.ResponseWriter, req
if req.Captcha != code {
return response.ErrorWithI18n(l.ctx, "login.captchaError"), nil
}
authUser := model.ScaAuthUser{
Phone: req.Phone,
Deleted: constant.NotDeleted,
}
has, err := l.svcCtx.DB.Get(&authUser)
if err != nil {
return nil, err
}
tx := l.svcCtx.DB.NewSession()
defer tx.Close()
if err = tx.Begin(); err != nil {
authUser := l.svcCtx.DB.ScaAuthUser
userInfo, err := authUser.Where(authUser.Phone.Eq(req.Phone), authUser.Deleted.Eq(constant.NotDeleted)).First()
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
tx := l.svcCtx.DB.Begin()
defer func() {
if recover() != nil || err != nil {
_ = tx.Rollback()
}
}()
if !has {
if userInfo == nil {
uid := idgen.NextId()
uidStr := strconv.FormatInt(uid, 10)
avatar := utils.GenerateAvatar(uidStr)
name := randomname.GenerateName()
user := model.ScaAuthUser{
notDeleted := constant.NotDeleted
male := constant.Male
user := &model.ScaAuthUser{
UID: uidStr,
Phone: req.Phone,
Avatar: avatar,
Nickname: name,
Deleted: constant.NotDeleted,
Gender: constant.Male,
Deleted: notDeleted,
Gender: male,
}
insert, err := tx.Insert(&user)
if err != nil || insert == 0 {
return nil, errors.New("register failed")
err := tx.ScaAuthUser.Create(user)
if err != nil {
_ = tx.Rollback()
return nil, err
}
_, err = l.svcCtx.CasbinEnforcer.AddRoleForUser(uidStr, constant.User)
if err != nil {
_ = tx.Rollback()
return nil, err
}
data, err := HandleUserLogin(user, l.svcCtx, req.AutoLogin, r, w, l.ctx)
if err != nil {
_ = tx.Rollback()
return nil, err
}
// 记录用户登录设备
if err = GetUserLoginDevice(user.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB, l.ctx); err != nil {
if err = GetUserLoginDevice(user.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB); err != nil {
_ = tx.Rollback()
return nil, err
}
err = tx.Commit()
@@ -93,12 +97,14 @@ func (l *PhoneLoginLogic) PhoneLogin(r *http.Request, w http.ResponseWriter, req
}
return response.SuccessWithData(data), nil
} else {
data, err := HandleUserLogin(authUser, l.svcCtx, req.AutoLogin, r, w, l.ctx)
data, err := HandleUserLogin(userInfo, l.svcCtx, req.AutoLogin, r, w, l.ctx)
if err != nil {
_ = tx.Rollback()
return nil, err
}
// 记录用户登录设备
if err = GetUserLoginDevice(authUser.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB, l.ctx); err != nil {
if err = GetUserLoginDevice(userInfo.UID, r, l.svcCtx.Ip2Region, l.svcCtx.DB); err != nil {
_ = tx.Rollback()
return nil, err
}
err = tx.Commit()

View File

@@ -2,15 +2,16 @@ package user
import (
"context"
"errors"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
"schisandra-album-cloud-microservices/app/core/api/common/constant"
"schisandra-album-cloud-microservices/app/core/api/common/response"
"schisandra-album-cloud-microservices/app/core/api/common/utils"
"schisandra-album-cloud-microservices/app/core/api/internal/svc"
"schisandra-album-cloud-microservices/app/core/api/internal/types"
"schisandra-album-cloud-microservices/app/core/api/repository/mysql/model"
"github.com/zeromicro/go-zero/core/logx"
)
type ResetPasswordLogic struct {
@@ -48,27 +49,25 @@ func (l *ResetPasswordLogic) ResetPassword(req *types.ResetPasswordRequest) (res
if err = l.svcCtx.RedisClient.Del(l.ctx, constant.UserSmsRedisPrefix+req.Phone).Err(); err != nil {
return nil, err
}
authUser := model.ScaAuthUser{
Phone: req.Phone,
Deleted: constant.NotDeleted,
authUser := l.svcCtx.DB.ScaAuthUser
userInfo, err := authUser.Where(authUser.Phone.Eq(req.Phone)).First()
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return response.ErrorWithI18n(l.ctx, "login.userNotRegistered"), nil
}
has, err := l.svcCtx.DB.Get(&authUser)
if err != nil {
return nil, err
}
if !has {
return response.ErrorWithI18n(l.ctx, "login.userNotRegistered"), nil
}
encrypt, err := utils.Encrypt(req.Password)
if err != nil {
return nil, err
}
affected, err := l.svcCtx.DB.ID(authUser.Id).Cols("password").Update(&model.ScaAuthUser{Password: encrypt})
affected, err := authUser.Where(authUser.ID.Eq(userInfo.ID), authUser.Phone.Eq(req.Phone)).Update(authUser.Password, encrypt)
if err != nil {
return nil, err
}
if affected == 0 {
if affected.RowsAffected == 0 {
return response.ErrorWithI18n(l.ctx, "login.resetPasswordError"), nil
}
return response.Success(), nil