feat: Dealing with compatibility issues with alert history data (#9571)

This commit is contained in:
2025-07-18 22:43:19 +08:00 committed by GitHub
parent 685fca6c8c
commit 5f68d7ce90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 107 additions and 51 deletions

View file

@ -94,3 +94,19 @@ func AddMenu(newMenu dto.ShowMenu, parentMenuID string, tx *gorm.DB) error {
}
return tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Update("value", string(updatedJSON)).Error
}
func RemoveMenuByID(menus []dto.ShowMenu, id string) []dto.ShowMenu {
var result []dto.ShowMenu
for _, menu := range menus {
if menu.ID == id {
continue
}
if len(menu.Children) > 0 {
menu.Children = RemoveMenuByID(menu.Children, id)
}
result = append(result, menu)
}
return result
}

View file

@ -21,6 +21,7 @@ func Init() {
migrations.UpdateXpackHideMenu,
migrations.UpdateOnedrive,
migrations.AddClusterMenu,
migrations.DeleteXpackHideMenu,
})
if err := m.Migrate(); err != nil {
global.LOG.Error(err)

View file

@ -503,3 +503,31 @@ var AddClusterMenu = &gormigrate.Migration{
}, "11", tx)
},
}
var DeleteXpackHideMenu = &gormigrate.Migration{
ID: "20250718-delete-xpack-hide-menu",
Migrate: func(tx *gorm.DB) error {
var menuJSON string
if err := tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Pluck("value", &menuJSON).Error; err != nil {
return err
}
if menuJSON == "" {
menuJSON = helper.LoadMenus()
}
var menus []dto.ShowMenu
if err := json.Unmarshal([]byte(menuJSON), &menus); err != nil {
return tx.Model(&model.Setting{}).
Where("key = ?", "HideMenu").
Update("value", helper.LoadMenus()).Error
}
menus = helper.RemoveMenuByID(menus, "116")
updatedJSON, err := json.Marshal(menus)
if err != nil {
return tx.Model(&model.Setting{}).
Where("key = ?", "HideMenu").
Update("value", helper.LoadMenus()).Error
}
return tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Update("value", string(updatedJSON)).Error
},
}

View file

@ -3660,10 +3660,9 @@ const message = {
senderHelper: 'Email address used to send messages',
passwordHelper: 'Authorization code for the email service',
hostHelper: 'SMTP server address, e.g., smtp.qq.com',
portHelper: 'SSL usually uses 465, TLS usually uses 587, no encryption usually uses 25',
portHelper: 'SSL usually uses 465, TLS usually uses 587',
sslHelper: 'If the SMTP port is 465, SSL is usually required',
tlsHelper: 'If the SMTP port is 587, TLS is usually required',
none: 'None',
},
theme: {
lingXiaGold: 'Ling Xia Gold',

View file

@ -3524,10 +3524,9 @@ const message = {
senderHelper: 'メール送信に使用するメールアドレス',
passwordHelper: 'メールサービスの認証コード',
hostHelper: 'SMTP サーバーアドレスsmtp.qq.com',
portHelper: 'SSLは通常465TLSは通常587暗号化なしは通常25',
portHelper: 'SSLは通常465TLSは通常587',
sslHelper: 'SMTPポートが465の場合通常はSSLが必要です',
tlsHelper: 'SMTPポートが587の場合通常はTLSが必要です',
none: 'なし',
},
theme: {
lingXiaGold: '凌霞金',

View file

@ -3462,10 +3462,9 @@ const message = {
senderHelper: '이메일 발송에 사용되는 주소',
passwordHelper: '메일 서비스의 인증 코드',
hostHelper: 'SMTP 서버 주소, : smtp.qq.com',
portHelper: 'SSL 일반적으로 465, TLS 587, 암호화 없음은 일반적으로 25',
portHelper: 'SSL 일반적으로 465, TLS 587',
sslHelper: 'SMTP 포트가 465 이면 일반적으로 SSL 필요합니다',
tlsHelper: 'SMTP 포트가 587 이면 일반적으로 TLS 필요합니다',
none: '없음',
},
theme: {
lingXiaGold: '링샤 골드',

View file

@ -3605,10 +3605,9 @@ const message = {
senderHelper: 'Alamat e-mel yang digunakan untuk menghantar e-mel',
passwordHelper: 'Kod kebenaran untuk perkhidmatan e-mel',
hostHelper: 'Alamat pelayan SMTP, contoh: smtp.qq.com',
portHelper: 'SSL biasanya 465, TLS biasanya 587, tanpa penyulitan biasanya 25',
portHelper: 'SSL biasanya 465, TLS biasanya 587',
sslHelper: 'Jika port SMTP ialah 465, SSL biasanya diperlukan',
tlsHelper: 'Jika port SMTP ialah 587, TLS biasanya diperlukan',
none: 'Tiada',
},
theme: {
lingXiaGold: 'Ling Xia Emas',

View file

@ -3612,10 +3612,9 @@ const message = {
senderHelper: 'Endereço de e-mail usado para envio',
passwordHelper: 'Código de autorização do serviço de e-mail',
hostHelper: 'Endereço do servidor SMTP, ex: smtp.qq.com',
portHelper: 'SSL geralmente usa 465, TLS geralmente usa 587, sem criptografia usa 25',
portHelper: 'SSL geralmente usa 465, TLS geralmente usa 587',
sslHelper: 'Se a porta SMTP for 465, normalmente é necessário SSL',
tlsHelper: 'Se a porta SMTP for 587, normalmente é necessário TLS',
none: 'Nenhum',
},
theme: {
lingXiaGold: 'Ling Xia Gold',

View file

@ -3603,10 +3603,9 @@ const message = {
senderHelper: 'Адрес электронной почты для отправки сообщений',
passwordHelper: 'Код авторизации почтового сервиса',
hostHelper: 'Адрес SMTP-сервера, например: smtp.qq.com',
portHelper: 'SSL обычно использует 465, TLS 587, без шифрования 25',
portHelper: 'SSL обычно использует 465, TLS 587',
sslHelper: 'Если порт SMTP 465, обычно требуется SSL',
tlsHelper: 'Если порт SMTP 587, обычно требуется TLS',
none: 'Нет',
},
theme: {
lingXiaGold: 'Лин Ся Золотой',

View file

@ -3701,10 +3701,9 @@ const message = {
senderHelper: 'E-posta göndermek için kullanılan adres',
passwordHelper: 'E-posta servisinin yetkilendirme kodu',
hostHelper: 'SMTP sunucu adresi, örneğin: smtp.qq.com',
portHelper: 'SSL genellikle 465, TLS genellikle 587, şifreleme yoksa genellikle 25',
portHelper: 'SSL genellikle 465, TLS genellikle 587',
sslHelper: 'SMTP portu 465 ise genellikle SSL gerekir',
tlsHelper: 'SMTP portu 587 ise genellikle TLS gerekir',
none: 'Yok',
},
theme: {
lingXiaGold: 'Ling Xia Altın',

View file

@ -3406,10 +3406,9 @@ const message = {
senderHelper: '用於發送郵件的電子信箱地址',
passwordHelper: '郵件服務的授權碼',
hostHelper: 'SMTP 伺服器地址例如smtp.qq.com',
portHelper: 'SSL 通常為 465TLS 通常為 587無加密則通常為 25',
portHelper: 'SSL 通常為 465TLS 通常為 587',
sslHelper: ' SMTP 連接埠為 465通常需要啟用 SSL',
tlsHelper: ' SMTP 連接埠為 587通常需要啟用 TLS',
none: '無',
},
theme: {
lingXiaGold: '凌霞金',

View file

@ -3376,10 +3376,9 @@ const message = {
senderHelper: '用于发送邮件的邮箱地址',
passwordHelper: '邮件服务的授权码',
hostHelper: 'SMTP 服务器地址例如: smtp.qq.com',
portHelper: 'SSL 通常为465TLS 通常为587无加密方式通常为25',
portHelper: 'SSL 通常为465TLS 通常为587',
sslHelper: '如果 SMTP 端口是 465通常需要启用 SSL',
tlsHelper: '如果 SMTP 端口是 587通常需要启用 TLS',
none: '无',
},
theme: {
lingXiaGold: '凌霞金',

View file

@ -17,41 +17,53 @@
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.sender')" prop="sender">
<el-input v-model="form.config.sender" />
<el-input v-model.trim="form.config.sender" />
<span class="input-help">
{{ $t('xpack.alert.senderHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.password')" prop="password">
<el-input v-model="form.config.password" type="password" show-password />
<el-input v-model.trim="form.config.password" type="password" show-password />
<span class="input-help">
{{ $t('xpack.alert.passwordHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.host')" prop="host">
<el-input v-model="form.config.host" placeholder="smtp.qq.com" />
<el-input v-model.trim="form.config.host" placeholder="smtp.qq.com" />
<span class="input-help">
{{ $t('xpack.alert.hostHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.port')" prop="port">
<el-input v-model="form.config.port" :min="1" :max="65535" />
<el-input v-model.number="form.config.port" :min="1" :max="65535" />
<span class="input-help">
{{ $t('xpack.alert.portHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.encryption')" prop="encryption">
<el-select v-model="form.config.encryption" :placeholder="$t('commons.rule.requiredSelect')">
<el-option label="SSL" value="SSL" />
<el-option label="TLS" value="TLS" />
<el-option :label="$t('xpack.alert.none')" value="NONE" />
</el-select>
<div class="flex items-center gap-2">
<span>SSL</span>
<el-switch
v-model="form.config.encryption"
:active-value="'SSL'"
:inactive-value="form.config.encryption === 'SSL' ? 'NONE' : form.config.encryption"
@change="handleEncryptionSwitch('SSL')"
/>
</div>
<span class="input-help">
{{
form.config.encryption == 'SSL'
? $t('xpack.alert.sslHelper')
: $t('xpack.alert.tlsHelper')
}}
{{ $t('xpack.alert.sslHelper') }}
</span>
<div class="flex items-center gap-2">
<span>TLS</span>
<el-switch
v-model="form.config.encryption"
:active-value="'TLS'"
:inactive-value="form.config.encryption === 'TLS' ? 'NONE' : form.config.encryption"
@change="handleEncryptionSwitch('TLS')"
/>
</div>
<span class="input-help">
{{ $t('xpack.alert.tlsHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('xpack.alert.recipient')" prop="recipient">
@ -118,7 +130,7 @@ const form = reactive({
host: '',
port: 465,
encryption: 'NONE',
status: '',
status: 'Enable',
recipient: '',
},
});

View file

@ -73,24 +73,32 @@
<div class="text-sm mb-2">{{ $t('xpack.alert.emailConfigHelper') }}</div>
<el-divider class="!mb-2 !mt-3" />
<div class="text-sm email-form" v-if="emailConfig.id">
<el-form-item :label="$t('xpack.alert.displayName')" prop="displayName">
{{ emailConfig.config.displayName }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.sender')" prop="sender">
{{ emailConfig.config.sender }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.host')" prop="host">
{{ emailConfig.config.host }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.port')" prop="port">
{{ emailConfig.config.port }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.encryption')" prop="encryption">
{{ emailConfig.config.encryption }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.recipient')" prop="recipient">
{{ emailConfig.config.recipient }}
</el-form-item>
<el-form
:model="form"
@submit.prevent
ref="alertFormRef"
:label-position="mobile ? 'top' : 'left'"
label-width="110px"
>
<el-form-item :label="$t('xpack.alert.displayName')" prop="displayName">
{{ emailConfig.config.displayName }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.sender')" prop="sender">
{{ emailConfig.config.sender }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.host')" prop="host">
{{ emailConfig.config.host }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.port')" prop="port">
{{ emailConfig.config.port }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.encryption')" prop="encryption">
{{ emailConfig.config.encryption }}
</el-form-item>
<el-form-item :label="$t('xpack.alert.recipient')" prop="recipient">
{{ emailConfig.config.recipient }}
</el-form-item>
</el-form>
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onChangeEmail(0)">