fix: 优化工作人员重复信息提示

This commit is contained in:
czl231
2026-08-11 13:37:44 +08:00
parent 5738a43f3e
commit 4d79a4917e
12 changed files with 440 additions and 9 deletions

View File

@@ -0,0 +1,52 @@
// 功能描述:转换工作人员写入时的数据库错误,避免向客户端泄露数据库实现细节。
// 版本v1.0
package common
import (
"errors"
"log"
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
"github.com/jackc/pgx/v5/pgconn"
)
const (
staffUsernameUniqueConstraint = "idx_staff_account_username"
staffPhoneUniqueConstraint = "idx_staff_account_phone"
)
var (
errStaffUsernameExists = errors.New("该用户名已存在")
errStaffPhoneExists = errors.New("该联系电话已被其他工作人员使用")
errStaffSaveFailed = errors.New("保存失败,请稍后重试")
)
// CreateStaffRecord 创建工作人员记录,并统一转换数据库写入错误。
// 参数staff 为已经完成业务校验和密码哈希处理的工作人员模型。
// 返回值:创建成功返回 nil失败返回脱敏后的工作人员写入错误。
func CreateStaffRecord(staff *models.StaffAccount) error {
if err := impl.DBService.Create(staff).Error; err != nil {
return StaffWriteError(err)
}
return nil
}
// StaffWriteError 将工作人员写入错误转换为稳定的中文业务提示。
// 参数err 为工作人员创建或更新操作返回的数据库错误。
// 返回值:已知唯一约束冲突返回对应业务提示,其他错误脱敏后返回通用保存失败提示。
func StaffWriteError(err error) error {
var postgresError *pgconn.PgError
if errors.As(err, &postgresError) && postgresError.Code == "23505" {
switch postgresError.ConstraintName {
case staffUsernameUniqueConstraint:
return errStaffUsernameExists
case staffPhoneUniqueConstraint:
return errStaffPhoneExists
}
}
// 未识别错误仅写入服务端日志,客户端不能看到数据库表名、约束名或 SQLSTATE。
log.Printf("staff write failed: %v", err)
return errStaffSaveFailed
}