From 4ba1f5b99d84ddebbce3ca9a204d735a788b1464 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 26 Feb 2026 14:55:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=90=8D=E9=87=8D=E5=A4=8D=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建角色时检查角色名是否已存在 - 更新角色时检查角色名是否与其他角色重复 Co-Authored-By: Claude Opus 4.5 --- internal/service/role/service.go | 22 ++++++++++++++++++++-- internal/store/postgres/role_store.go | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/internal/service/role/service.go b/internal/service/role/service.go index fddd495..34a283a 100644 --- a/internal/service/role/service.go +++ b/internal/service/role/service.go @@ -41,6 +41,15 @@ func (s *Service) Create(ctx context.Context, req *dto.CreateRoleRequest) (*mode return nil, errors.New(errors.CodeUnauthorized, "未授权访问") } + // 检查角色名是否已存在 + exists, err := s.roleStore.ExistsByName(ctx, req.RoleName, 0) + if err != nil { + return nil, errors.Wrap(errors.CodeInternalError, err, "检查角色名失败") + } + if exists { + return nil, errors.New(errors.CodeRoleNameExists) + } + // 创建角色 role := &model.Role{ RoleName: req.RoleName, @@ -85,10 +94,19 @@ func (s *Service) Update(ctx context.Context, id uint, req *dto.UpdateRoleReques return nil, errors.Wrap(errors.CodeInternalError, err, "获取角色失败") } - // 更新字段 - if req.RoleName != nil { + // 如果修改了角色名,检查是否与其他角色重复 + if req.RoleName != nil && *req.RoleName != role.RoleName { + exists, err := s.roleStore.ExistsByName(ctx, *req.RoleName, id) + if err != nil { + return nil, errors.Wrap(errors.CodeInternalError, err, "检查角色名失败") + } + if exists { + return nil, errors.New(errors.CodeRoleNameExists) + } role.RoleName = *req.RoleName } + + // 更新其他字段 if req.RoleDesc != nil { role.RoleDesc = *req.RoleDesc } diff --git a/internal/store/postgres/role_store.go b/internal/store/postgres/role_store.go index 059a7e0..dfc2565 100644 --- a/internal/store/postgres/role_store.go +++ b/internal/store/postgres/role_store.go @@ -42,6 +42,20 @@ func (s *RoleStore) GetByName(ctx context.Context, name string) (*model.Role, er return &role, nil } +// ExistsByName 检查角色名是否已存在 +// excludeID: 排除的角色 ID(用于更新时排除自身),传 0 表示不排除 +func (s *RoleStore) ExistsByName(ctx context.Context, name string, excludeID uint) (bool, error) { + var count int64 + query := s.db.WithContext(ctx).Model(&model.Role{}).Where("role_name = ?", name) + if excludeID > 0 { + query = query.Where("id != ?", excludeID) + } + if err := query.Count(&count).Error; err != nil { + return false, err + } + return count > 0, nil +} + // Update 更新角色 func (s *RoleStore) Update(ctx context.Context, role *model.Role) error { return s.db.WithContext(ctx).Save(role).Error