From e1968ec46ad6fac0a3c3e1877576ce0a1acf488e Mon Sep 17 00:00:00 2001 From: ch3nnn Date: Wed, 22 Jan 2025 13:37:58 +0800 Subject: [PATCH 1/2] feat(dal): refactor data migration and initialization - Drop and recreate tables instead of auto-migrate - Use FirstOrCreate to initialize default data - Extract default values to constants - Simplify and optimize the migration process --- internal/dal/repository/repository.go | 134 +++++++++++--------------- internal/dal/repository/sys_config.go | 38 ++++++++ internal/dal/repository/sys_user.go | 5 + internal/service/config/config.go | 2 +- 4 files changed, 101 insertions(+), 78 deletions(-) diff --git a/internal/dal/repository/repository.go b/internal/dal/repository/repository.go index 5546f12..55d81e1 100644 --- a/internal/dal/repository/repository.go +++ b/internal/dal/repository/repository.go @@ -12,6 +12,7 @@ import ( "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/driver/postgres" + "gorm.io/gen/field" "gorm.io/gorm" "github.com/ch3nnn/webstack-go/internal/dal/model" @@ -28,7 +29,7 @@ type Repository struct { func NewRepository( logger *log.Logger, - // cache *cache.Cache, +// cache *cache.Cache, db *gorm.DB, ) *Repository { return &Repository{ @@ -91,7 +92,18 @@ func NewDB(conf *viper.Viper, l *log.Logger) *gorm.DB { } func autoMigrateAndInitialize(db *gorm.DB) { - err := db.AutoMigrate( + ctx := context.Background() + + err := db.Migrator().DropTable( + &model.SysUserMenu{}, + &model.SysMenu{}, + ) + if err != nil { + fmt.Println("migrate drop table error") + os.Exit(0) + } + + err = db.AutoMigrate( &model.SysConfig{}, &model.SysUser{}, &model.SysUserMenu{}, @@ -104,34 +116,24 @@ func autoMigrateAndInitialize(db *gorm.DB) { os.Exit(0) } - ctx := context.Background() - - umCtn, err := query.SysUserMenu.WithContext(ctx).Count() - if err != nil { - os.Exit(0) - } - - uCtn, err := query.SysUser.WithContext(ctx).Count() - if err != nil { - os.Exit(0) - } - - mCtn, err := query.SysMenu.WithContext(ctx).Count() + _, err = query.SysUser.WithContext(ctx). + Where( + query.SysUser.ID.Eq(1), + query.SysUser.Username.Eq(DefaultUname), + ). + Attrs( + field.Attrs(&model.SysUser{ + Password: cryptor.Md5String(DefaultUPassword)}, + ), + ). + FirstOrCreate() if err != nil { + fmt.Println("user migrate error") os.Exit(0) } - if umCtn == 0 && uCtn == 0 && mCtn == 0 { - err := query.SysUser.WithContext(ctx).Create(&model.SysUser{ - ID: 1, - Username: "admin", - Password: cryptor.Md5String("admin"), - }) - if err != nil { - os.Exit(0) - } - - err = query.SysMenu.WithContext(ctx).Create( + err = query.SysMenu.WithContext(ctx). + Create( &model.SysMenu{ ID: 1, Pid: 0, @@ -177,11 +179,13 @@ func autoMigrateAndInitialize(db *gorm.DB) { IsUsed: true, }, ) - if err != nil { - os.Exit(0) - } + if err != nil { + fmt.Println("menu migrate error") + os.Exit(0) + } - err = query.SysUserMenu.WithContext(ctx).Create( + err = query.SysUserMenu.WithContext(ctx). + Create( &model.SysUserMenu{ UserID: 1, MenuID: 1, @@ -203,54 +207,30 @@ func autoMigrateAndInitialize(db *gorm.DB) { MenuID: 5, }, ) - if err != nil { - os.Exit(0) - } - - err = query.SysConfig.WithContext(ctx).Create( - &model.SysConfig{ - ID: 1, - AboutSite: "> ❤️ 基于 Golang 开源的网址导航网站项目,具备完整的前后台,您可以拿来制作自己平日收藏的网址导航。\n\n\n> 如果你也是开发者,如果你也正好喜欢折腾,那希望这个网站能给你带来一些作用。", - AboutAuthor: ` -
-
-
- - - -
- - Developer. Ch3nnn. - -

折腾不息 · 乐此不疲.

-
-
-
-
+ if err != nil { + fmt.Println("user menu migrate error") + os.Exit(0) + } -
-
-
-
-
-

- 这是一个公益项目,而且是 开源 的。你也可以拿来制作自己的网址导航。如果你有更好的想法,可以通过个人网站ch3nnn.cn中的联系方式找到我,欢迎与我交流分享。 -

-
-
-
-
-
-`, - IsAbout: false, - SiteTitle: "WebStack-Go - 网址导航", - SiteKeyword: "网址导航", - SiteDesc: "WebStack-Go - 基于 Golang 开源的网址导航网站", - }) - if err != nil { - os.Exit(0) - } + _, err = query.SysConfig.WithContext(ctx). + Where( + query.SysConfig.ID.Eq(1), + ). + Attrs( + field.Attrs(&model.SysConfig{ + AboutSite: DefaultAboutSite, + AboutAuthor: DefaultAuthor, + SiteTitle: DefaultSiteTitle, + SiteKeyword: DefaultSiteKeyword, + SiteDesc: DefaultSiteDesc, + }), + ). + FirstOrCreate() - fmt.Println("success initialize") + if err != nil { + fmt.Println("config migrate error") + os.Exit(0) } + + fmt.Println("success initialize") } diff --git a/internal/dal/repository/sys_config.go b/internal/dal/repository/sys_config.go index a762e11..972b348 100644 --- a/internal/dal/repository/sys_config.go +++ b/internal/dal/repository/sys_config.go @@ -6,6 +6,44 @@ import ( "github.com/ch3nnn/webstack-go/internal/dal/query" ) +const ( + DefaultAboutSite = "> ❤️ 基于 Golang 开源的网址导航网站项目,具备完整的前后台,您可以拿来制作自己平日收藏的网址导航。\n\n\n> 如果你也是开发者,如果你也正好喜欢折腾,那希望这个网站能给你带来一些作用。" + DefaultAuthor = ` +
+
+
+ + + +
+ + Developer. Ch3nnn. + +

折腾不息 · 乐此不疲.

+
+
+
+
+ +
+
+
+
+
+

+ 这是一个公益项目,而且是 开源 的。你也可以拿来制作自己的网址导航。如果你有更好的想法,可以通过个人网站ch3nnn.cn中的联系方式找到我,欢迎与我交流分享。 +

+
+
+
+
+
+` + DefaultSiteTitle = "WebStack-Go - 网址导航" + DefaultSiteKeyword = "网址导航" + DefaultSiteDesc = "WebStack-Go - 基于 Golang 开源的网址导航网站" +) + var _ iCustomGenSysConfigFunc = (*customSysConfigDao)(nil) type ( diff --git a/internal/dal/repository/sys_user.go b/internal/dal/repository/sys_user.go index d37a227..6c2917e 100644 --- a/internal/dal/repository/sys_user.go +++ b/internal/dal/repository/sys_user.go @@ -6,6 +6,11 @@ import ( "github.com/ch3nnn/webstack-go/internal/dal/query" ) +const ( + DefaultUname = "admin" + DefaultUPassword = "admin" +) + var _ iCustomGenSysUserFunc = (*customSysUserDao)(nil) type ( diff --git a/internal/service/config/config.go b/internal/service/config/config.go index b4b5e47..d5b06ab 100644 --- a/internal/service/config/config.go +++ b/internal/service/config/config.go @@ -12,7 +12,7 @@ import ( ) func (s *service) GetConfig(ctx context.Context) (*v1.ConfigResp, error) { - conf, err := s.configRepo.WithContext(ctx).FindOne(s.configRepo.WhereByID(1)) + conf, err := s.configRepo.WithContext(ctx).FindOne() if err != nil { return nil, err } From 015bb37b67db61ac4f9ba5545049dead0d2e8925 Mon Sep 17 00:00:00 2001 From: ch3nnn Date: Wed, 22 Jan 2025 13:54:22 +0800 Subject: [PATCH 2/2] fix(user): add old password verification and update password logic - Add error handling for incorrect old password - Implement password update functionality - Remove unnecessary comment in repository initialization --- api/v1/errors.go | 1 + internal/dal/repository/repository.go | 2 +- internal/service/user/updatepassword.go | 7 +++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api/v1/errors.go b/api/v1/errors.go index 29e687a..5e13b2c 100644 --- a/api/v1/errors.go +++ b/api/v1/errors.go @@ -10,5 +10,6 @@ var ( var ( ErrorUserNameAndPassword = newError(100, "用户名和密码错误") + ErrorUserOldPassword = newError(100, "原密码错误") ErrorTokenGeneration = newError(101, "令牌生成错误") ) diff --git a/internal/dal/repository/repository.go b/internal/dal/repository/repository.go index 55d81e1..fc3e95d 100644 --- a/internal/dal/repository/repository.go +++ b/internal/dal/repository/repository.go @@ -29,7 +29,7 @@ type Repository struct { func NewRepository( logger *log.Logger, -// cache *cache.Cache, + // cache *cache.Cache, db *gorm.DB, ) *Repository { return &Repository{ diff --git a/internal/service/user/updatepassword.go b/internal/service/user/updatepassword.go index ce668d0..5d1ebe0 100644 --- a/internal/service/user/updatepassword.go +++ b/internal/service/user/updatepassword.go @@ -20,7 +20,6 @@ func (s *service) UpdatePassword(ctx *gin.Context, req *v1.UpdatePasswordReq) (* user, err := s.userRepo.WithContext(ctx). FindOne( s.userRepo.WhereByID(ctx.GetInt(middleware.UserID)), - s.userRepo.WhereByPassword(req.OldPassword), ) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -29,10 +28,14 @@ func (s *service) UpdatePassword(ctx *gin.Context, req *v1.UpdatePasswordReq) (* return nil, err } + if user.Password != req.OldPassword { + return nil, v1.ErrorUserOldPassword + } + _, err = s.userRepo.WithContext(ctx).Update(&model.SysUser{Password: req.NewPassword}, s.userRepo.WhereByID(user.ID)) if err != nil { return nil, err } - return &v1.UpdatePasswordResp{}, nil + return nil, nil }