增加bark配置

This commit is contained in:
2026-06-17 23:49:19 +08:00
parent 22e0e75c35
commit 6ee1f26124
19 changed files with 784 additions and 260 deletions
+104 -43
View File
@@ -2,19 +2,51 @@ package services
import (
"fmt"
"strconv"
"strings"
"time"
"server/models"
)
// ListSystemEmails 返回全部邮箱配置(按 id 升序,通常仅一条)
// ListSystemEmails 返回从 yz_platform_normal_setting 组装的邮箱配置(切片,通常仅一条)
func ListSystemEmails() ([]models.SystemEmail, error) {
var rows []models.SystemEmail
_, err := models.Orm.QueryTable(new(models.SystemEmail)).OrderBy("id").All(&rows)
return rows, err
enabledStr := models.GetPlatformSettingValue("email_enabled", "0")
fromAddress := models.GetPlatformSettingValue("email_from_address", "")
fromName := models.GetPlatformSettingValue("email_from_name", "")
host := models.GetPlatformSettingValue("email_host", "")
portStr := models.GetPlatformSettingValue("email_port", "465")
password := models.GetPlatformSettingValue("email_password", "")
encryption := models.GetPlatformSettingValue("email_encryption", "ssl")
timeoutStr := models.GetPlatformSettingValue("email_timeout", "30")
status := int8(0)
if enabledStr == "1" {
status = 1
}
portVal, _ := strconv.ParseUint(portStr, 10, 32)
timeoutVal, _ := strconv.ParseUint(timeoutStr, 10, 32)
row := models.SystemEmail{
ID: 1,
FromAddress: fromAddress,
Host: host,
Port: uint(portVal),
Password: password,
Encryption: encryption,
Timeout: uint(timeoutVal),
Status: status,
CreateTime: time.Now(),
UpdateTime: time.Now(),
}
if fromName != "" {
row.FromName = &fromName
}
return []models.SystemEmail{row}, nil
}
// UpsertFirstSystemEmail 若已有记录则更新第一条,否则插入
// UpsertFirstSystemEmail 将邮箱配置保存到 yz_platform_normal_setting 表中
func UpsertFirstSystemEmail(fromAddress string, fromName *string, host string, port uint, password string, encryption string, timeout uint, status int8, remark *string) error {
if encryption == "" {
encryption = "ssl"
@@ -28,47 +60,76 @@ func UpsertFirstSystemEmail(fromAddress string, fromName *string, host string, p
fromAddress = strings.TrimSpace(fromAddress)
host = strings.TrimSpace(host)
cnt, err := models.Orm.QueryTable(new(models.SystemEmail)).Count()
if err != nil {
return err
fn := ""
if fromName != nil {
fn = *fromName
}
if cnt == 0 {
if strings.TrimSpace(password) == "" {
statusStr := "0"
if status == 1 {
statusStr = "1"
}
settings := []struct {
code string
name string
value string
remark string
}{
{"email_enabled", "邮件服务启用状态", statusStr, "0为关闭,1为开启"},
{"email_from_address", "发件人邮箱", fromAddress, ""},
{"email_from_name", "发件人名称", fn, ""},
{"email_host", "SMTP 服务器地址", host, ""},
{"email_port", "SMTP 端口", strconv.FormatUint(uint64(port), 10), ""},
{"email_encryption", "邮件加密方式", encryption, "支持 ssl/tls/none"},
{"email_timeout", "邮件发送超时时间", strconv.FormatUint(uint64(timeout), 10), ""},
}
// 如果传入了新密码,或者目前还没有保存过密码,才更新密码
if strings.TrimSpace(password) != "" {
settings = append(settings, struct {
code string
name string
value string
remark string
}{"email_password", "邮件授权码/密码", strings.TrimSpace(password), ""})
} else {
// 校验:如果完全没有配置过密码,必须填写密码
existingPass := models.GetPlatformSettingValue("email_password", "")
if existingPass == "" {
return fmt.Errorf("首次保存必须填写授权码/密码")
}
row := &models.SystemEmail{
FromAddress: fromAddress,
FromName: fromName,
Host: host,
Port: port,
Password: strings.TrimSpace(password),
Encryption: encryption,
Timeout: timeout,
Status: status,
Remark: remark,
}
for _, item := range settings {
var setting models.PlatformNormalSetting
err := models.Orm.QueryTable(new(models.PlatformNormalSetting)).
Filter("code", item.code).
Filter("delete_time__isnull", true).
One(&setting)
if err == nil {
setting.Value = item.value
setting.Name = item.name
setting.Remark = item.remark
now := time.Now()
setting.UpdateTime = &now
_, err = models.Orm.Update(&setting, "Value", "Name", "Remark", "UpdateTime")
if err != nil {
return err
}
} else {
newSetting := models.PlatformNormalSetting{
Name: item.name,
Code: item.code,
Value: item.value,
Remark: item.remark,
CreateTime: time.Now(),
}
_, err = models.Orm.Insert(&newSetting)
if err != nil {
return err
}
}
_, err = models.Orm.Insert(row)
return err
}
var first models.SystemEmail
if err := models.Orm.QueryTable(new(models.SystemEmail)).OrderBy("id").Limit(1).One(&first); err != nil {
return err
}
up := map[string]interface{}{
"from_address": fromAddress,
"from_name": fromName,
"host": host,
"port": port,
"encryption": encryption,
"timeout": timeout,
"status": status,
"remark": remark,
}
if strings.TrimSpace(password) != "" {
up["password"] = strings.TrimSpace(password)
}
_, err = models.Orm.QueryTable(new(models.SystemEmail)).Filter("id", first.ID).Update(up)
return err
return nil
}