服务端媒体源导入/保存/客户端输出链路修复:支持 snake/camel、subcategories/sources,默认客户端可见,保存后发布兼容 media-types.json。
build-winui / winui (push) Has been cancelled

新增数据库同步 Job API、持久化状态、实时输出、最新任务恢复,以及系统日志聚合接口。
管理端优化:日志中心、运维实时状态框、同步输出自动滚动、仪表盘“输出”列、真实延迟空态、本地 favicon/avatar。
新增 server/unified-management/assets/favicon.ico 和 developer-avatar.png,并接好 /favicon.ico、/admin/favicon.ico、/setup/favicon.ico、/assets/*。
WinUI 随机放映室卡片优先显示子接口原始 Description。
Inno 安装器输出框改为选区末尾 + SendMessage 滚动到底部。
This commit is contained in:
QWQLwToo
2026-06-29 22:28:58 +08:00
parent f00124c1c0
commit 7745e7a2d4
36 changed files with 1482 additions and 153 deletions
@@ -391,3 +391,47 @@ func TestDashboardOverviewKeepsChecksForDeletedSources(t *testing.T) {
t.Fatalf("deleted source check should have fallback sourceId/name: %#v", checks[0])
}
}
func TestDatabaseSyncJobPersistsLatestStatusAndOutput(t *testing.T) {
root := t.TempDir()
path := filepath.Join(root, "unified.sqlite")
store, err := Open(&config.Config{
StorageDir: root,
Database: config.DatabaseConfig{
Provider: "sqlite",
SQLitePath: path,
FailoverEnabled: true,
HealthIntervalSec: 3600,
MaxOpenConns: 1,
MaxIdleConns: 1,
ConnMaxLifetimeSeconds: 60,
},
})
if err != nil {
t.Fatal(err)
}
defer store.Close()
result, err := store.ImportSQLiteToRemote()
if err != nil {
t.Fatal(err)
}
if !result.Skipped || result.Status != "skipped" {
t.Fatalf("expected missing remote sync to be skipped, got %#v", result)
}
latest, err := store.LatestDatabaseSyncJob()
if err != nil {
t.Fatal(err)
}
if latest.Direction != "sqlite_to_remote" || latest.Status != "skipped" {
t.Fatalf("unexpected latest sync job: %#v", latest)
}
if len(latest.Output) == 0 || latest.Tables == nil {
t.Fatalf("latest job should include output and tables: %#v", latest)
}
store.restoreDatabaseSyncStatus()
status := store.Status()
if status.LastSyncAt == "" || status.LastSyncError != "" {
t.Fatalf("sync status was not restored from latest job: %#v", status)
}
}