Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
fb883f00
Commit
fb883f00
authored
Dec 30, 2025
by
shaw
Browse files
fix: 修复默认分组初始化导致启动失败的问题
- 标准版不再创建默认分组,简易模式保持创建 - 简易模式下删除默认分组后重启自动恢复(而非报唯一键冲突) - AutoMigrate 函数增加 runMode 参数以区分运行模式
parent
64b82192
Changes
4
Hide whitespace changes
Inline
Side-by-side
backend/internal/infrastructure/database.go
View file @
fb883f00
...
@@ -30,7 +30,7 @@ func InitDB(cfg *config.Config) (*gorm.DB, error) {
...
@@ -30,7 +30,7 @@ func InitDB(cfg *config.Config) (*gorm.DB, error) {
// 自动迁移(始终执行,确保数据库结构与代码同步)
// 自动迁移(始终执行,确保数据库结构与代码同步)
// GORM 的 AutoMigrate 只会添加新字段,不会删除或修改已有字段,是安全的
// GORM 的 AutoMigrate 只会添加新字段,不会删除或修改已有字段,是安全的
if
err
:=
repository
.
AutoMigrate
(
db
);
err
!=
nil
{
if
err
:=
repository
.
AutoMigrate
(
db
,
cfg
.
RunMode
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
...
backend/internal/repository/auto_migrate.go
View file @
fb883f00
...
@@ -13,7 +13,8 @@ var maxExpiresAt = time.Date(2099, 12, 31, 23, 59, 59, 0, time.UTC)
...
@@ -13,7 +13,8 @@ var maxExpiresAt = time.Date(2099, 12, 31, 23, 59, 59, 0, time.UTC)
// AutoMigrate runs schema migrations for all repository persistence models.
// AutoMigrate runs schema migrations for all repository persistence models.
// Persistence models are defined within individual `*_repo.go` files.
// Persistence models are defined within individual `*_repo.go` files.
func
AutoMigrate
(
db
*
gorm
.
DB
)
error
{
// runMode: "standard" or "simple" - determines whether to create default groups
func
AutoMigrate
(
db
*
gorm
.
DB
,
runMode
string
)
error
{
err
:=
db
.
AutoMigrate
(
err
:=
db
.
AutoMigrate
(
&
userModel
{},
&
userModel
{},
&
apiKeyModel
{},
&
apiKeyModel
{},
...
@@ -31,7 +32,7 @@ func AutoMigrate(db *gorm.DB) error {
...
@@ -31,7 +32,7 @@ func AutoMigrate(db *gorm.DB) error {
}
}
// 创建默认分组(简易模式支持)
// 创建默认分组(简易模式支持)
if
err
:=
ensureDefaultGroups
(
db
);
err
!=
nil
{
if
err
:=
ensureDefaultGroups
(
db
,
runMode
);
err
!=
nil
{
return
err
return
err
}
}
...
@@ -55,7 +56,13 @@ func fixInvalidExpiresAt(db *gorm.DB) error {
...
@@ -55,7 +56,13 @@ func fixInvalidExpiresAt(db *gorm.DB) error {
// ensureDefaultGroups 确保默认分组存在(简易模式支持)
// ensureDefaultGroups 确保默认分组存在(简易模式支持)
// 为每个平台创建一个默认分组,配置最大权限以确保简易模式下不受限制
// 为每个平台创建一个默认分组,配置最大权限以确保简易模式下不受限制
func
ensureDefaultGroups
(
db
*
gorm
.
DB
)
error
{
// runMode: "standard" 时跳过创建, "simple" 时创建/恢复默认分组
func
ensureDefaultGroups
(
db
*
gorm
.
DB
,
runMode
string
)
error
{
// 标准版不创建默认分组
if
runMode
==
"standard"
{
return
nil
}
defaultGroups
:=
[]
struct
{
defaultGroups
:=
[]
struct
{
name
string
name
string
platform
string
platform
string
...
@@ -79,12 +86,34 @@ func ensureDefaultGroups(db *gorm.DB) error {
...
@@ -79,12 +86,34 @@ func ensureDefaultGroups(db *gorm.DB) error {
}
}
for
_
,
dg
:=
range
defaultGroups
{
for
_
,
dg
:=
range
defaultGroups
{
var
count
int64
// 步骤1: 检查是否有软删除的记录
if
err
:=
db
.
Model
(
&
groupModel
{})
.
Where
(
"name = ?"
,
dg
.
name
)
.
Count
(
&
count
)
.
Error
;
err
!=
nil
{
var
softDeletedCount
int64
if
err
:=
db
.
Unscoped
()
.
Model
(
&
groupModel
{})
.
Where
(
"name = ? AND deleted_at IS NOT NULL"
,
dg
.
name
)
.
Count
(
&
softDeletedCount
)
.
Error
;
err
!=
nil
{
return
err
}
if
softDeletedCount
>
0
{
// 恢复软删除的记录
if
err
:=
db
.
Unscoped
()
.
Model
(
&
groupModel
{})
.
Where
(
"name = ?"
,
dg
.
name
)
.
Update
(
"deleted_at"
,
nil
)
.
Error
;
err
!=
nil
{
log
.
Printf
(
"[AutoMigrate] Failed to restore default group %s: %v"
,
dg
.
name
,
err
)
return
err
}
log
.
Printf
(
"[AutoMigrate] Restored default group: %s (platform: %s)"
,
dg
.
name
,
dg
.
platform
)
continue
}
// 步骤2: 检查是否有活跃记录
var
activeCount
int64
if
err
:=
db
.
Model
(
&
groupModel
{})
.
Where
(
"name = ?"
,
dg
.
name
)
.
Count
(
&
activeCount
)
.
Error
;
err
!=
nil
{
return
err
return
err
}
}
if
count
==
0
{
if
activeCount
==
0
{
// 创建新分组
group
:=
&
groupModel
{
group
:=
&
groupModel
{
Name
:
dg
.
name
,
Name
:
dg
.
name
,
Description
:
dg
.
description
,
Description
:
dg
.
description
,
...
...
backend/internal/repository/integration_harness_test.go
View file @
fb883f00
...
@@ -93,7 +93,8 @@ func TestMain(m *testing.M) {
...
@@ -93,7 +93,8 @@ func TestMain(m *testing.M) {
log
.
Printf
(
"failed to open gorm db: %v"
,
err
)
log
.
Printf
(
"failed to open gorm db: %v"
,
err
)
os
.
Exit
(
1
)
os
.
Exit
(
1
)
}
}
if
err
:=
AutoMigrate
(
integrationDB
);
err
!=
nil
{
// 使用 simple 模式以便测试默认分组功能
if
err
:=
AutoMigrate
(
integrationDB
,
"simple"
);
err
!=
nil
{
log
.
Printf
(
"failed to automigrate db: %v"
,
err
)
log
.
Printf
(
"failed to automigrate db: %v"
,
err
)
os
.
Exit
(
1
)
os
.
Exit
(
1
)
}
}
...
...
backend/internal/setup/setup.go
View file @
fb883f00
...
@@ -271,7 +271,9 @@ func initializeDatabase(cfg *SetupConfig) error {
...
@@ -271,7 +271,9 @@ func initializeDatabase(cfg *SetupConfig) error {
}
}
}()
}()
return
repository
.
AutoMigrate
(
db
)
// setup 阶段使用 standard 模式(不创建默认分组)
// 默认分组将在正常启动时根据实际 runMode 决定是否创建
return
repository
.
AutoMigrate
(
db
,
"standard"
)
}
}
func
createAdminUser
(
cfg
*
SetupConfig
)
error
{
func
createAdminUser
(
cfg
*
SetupConfig
)
error
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment