flipped-aurora/gin-vue-admin · error

存在相同PackageName

Error message

存在相同PackageName

What it means

After passing name validation, Create queries sys_auto_code_package for a row with the same packageName AND template. If such a record is found (query does not return gorm.ErrRecordNotFound), creation is refused to keep package names unique per template.

Source

Thrown at server/service/system/auto_code_package.go:48

func (s *autoCodePackage) Create(ctx context.Context, info *request.SysAutoCodePackageCreate) error {
	switch {
	case info.Template == "":
		return errors.New("模板不能为空!")
	case info.Template == "page":
		return errors.New("page为表单生成器!")
	case info.PackageName == "":
		return errors.New("PackageName不能为空!")
	case token.IsKeyword(info.PackageName):
		return errors.Errorf("%s为go的关键字!", info.PackageName)
	case info.Template == "package":
		if info.PackageName == "system" || info.PackageName == "example" {
			return errors.New("不能使用已保留的package name")
		}
	default:
		break
	}
	if !errors.Is(global.GVA_DB.Where("package_name = ? and template = ?", info.PackageName, info.Template).First(&model.SysAutoCodePackage{}).Error, gorm.ErrRecordNotFound) {
		return errors.New("存在相同PackageName")
	}
	create := info.Create()
	return global.GVA_DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
		err := tx.Create(&create).Error
		if err != nil {
			return errors.Wrap(err, "创建失败!")
		}
		code := info.AutoCode()
		_, asts, creates, err := s.templates(ctx, create, code, true)
		if err != nil {
			return err
		}
		for key, value := range creates { // key 为 模版绝对路径
			var files *template.Template
			files, err = template.New(filepath.Base(key)).Funcs(autocode.GetTemplateFuncMap()).ParseFiles(key)
			if err != nil {
				return errors.Wrapf(err, "[filepath:%s]读取模版文件失败!", key)
			}

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Query existing packages first (GET autoCode/package list) and reuse or delete the existing one before re-creating.
  2. Pick a unique packageName, or intentionally reuse the existing package when generating new code.
  3. If the leftover record is stale, delete the old package entry via the auto-code UI/API, then re-create.

Example fix

// before: blind create
POST /autoCode/createPackage {"template":"package","packageName":"crm"}
// after: check then create or reuse
const pkgs = await api.getPackageList()
if (!pkgs.some(p => p.packageName === 'crm' && p.template === 'package')) {
  await api.createPackage({ template: 'package', packageName: 'crm' })
}
Defensive patterns

Strategy: validation

Validate before calling

const exists = (await api.getPackageList()).list?.some(
  p => p.packageName === name && p.template === template
)
if (exists) {
  throw new Error('存在相同PackageName,请先删除或复用')
}

Try / catch

try {
  await api.createPackage(payload)
} catch (e) {
  if (e?.msg === '存在相同PackageName') {
    const use = await confirm('包已存在,复用该包继续生成?')
    if (use) targetPackageId = await findPackageId(name)
  } else { throw e }
}

Prevention

When it happens

Trigger: POSTing a new package whose (packageName, template) pair already exists in sys_auto_code_package; retrying a creation that already succeeded; same name but different template passes (the uniqueness is per-template).

Common situations: Double-clicking the submit button; re-running an automation script; re-creating a package after deleting its generated code but not its package record.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/e64646bb4f39a5aa. Report an issue: GitHub.