feat: 交付官方 Docker 运行时,外观改背景图并下线自定义 CSS/JS

站点/后台分轨背景与用户列表排序一并落地;生产 CORS 改走 SITE_URL,健康检查带版本号。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-18 05:27:33 +08:00
parent 5f7193042f
commit d784b0ea7a
68 changed files with 2588 additions and 768 deletions

View File

@@ -270,7 +270,8 @@ func dropLegacyRefreshTokenColumn(db *gorm.DB) error {
}
// ensureOwnerRole 若无站长,则把 id 最小的旧管理员升级为站长;
// 连管理员都没有的全新库,把 id=1 的初始账号设为站长
// 连管理员都没有则升级 id 最小的账号。空库(尚无用户)直接返回,等首次注册。
// 禁止 GORM Update+Limit:无 WHERE 主键时会生成全表 UPDATE 并报 WHERE conditions required。
func ensureOwnerRole(db *gorm.DB) error {
var ownerCount int64
if err := db.Model(&User{}).Where("role = ?", RoleOwner).Count(&ownerCount).Error; err != nil {
@@ -279,16 +280,20 @@ func ensureOwnerRole(db *gorm.DB) error {
if ownerCount > 0 {
return nil
}
res := db.Model(&User{}).Where("role = ?", RoleAdmin).
Order("id ASC").Limit(1).Update("role", RoleOwner)
if res.Error != nil {
return res.Error
var candidate User
err := db.Select("id").Where("role = ?", RoleAdmin).Order("id ASC").First(&candidate).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
err = db.Select("id").Order("id ASC").First(&candidate).Error
}
if res.RowsAffected == 0 {
if err := db.Model(&User{}).Order("id ASC").Limit(1).
Update("role", RoleOwner).Error; err != nil {
return err
}
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil
}
if err != nil {
return err
}
if err := db.Model(&User{}).Where("id = ?", candidate.ID).Update("role", RoleOwner).Error; err != nil {
return err
}
log.Println("[model] 已迁移初始账号为站长角色(owner)")
return nil