feat: 完成头像上传、站点主题配置与UI优化
- 新增附件模型与上传服务,拆分头像上传/管理逻辑 - 重构用户资料接口,移除直接修改头像字段,改用专用上传接口 - 添加站点公开设置API与管理员外观配置页 - 全局替换hover背景为accent-soft,优化交互一致性 - 完善头像组件,支持图片加载失败回退与src更新重置 - 新增用户状态事件总线,解决同页头像更新不及时问题 - 调整依赖包顺序与CI依赖版本 - 重构板块列表接口,新增帖子计数 - 迁移账号设置到用户主页tab,合并重复代码
This commit is contained in:
57
backend/service/setting.go
Normal file
57
backend/service/setting.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/freefire/jiang13-bbs/model"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// 站点设置键
|
||||
const (
|
||||
// SettingKeyAccent 站点主题色(浅色基准,#rrggbb);为空表示使用内置默认色
|
||||
SettingKeyAccent = "theme_accent"
|
||||
)
|
||||
|
||||
// ErrInvalidAccent 主题色格式非法
|
||||
var ErrInvalidAccent = errors.New("主题色格式不正确,应为 #RRGGBB")
|
||||
|
||||
var accentHexRe = regexp.MustCompile(`^#[0-9a-fA-F]{6}$`)
|
||||
|
||||
// SettingService 站点级键值设置(主题色等外观配置)
|
||||
type SettingService struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewSettingService(db *gorm.DB) *SettingService {
|
||||
return &SettingService{db: db}
|
||||
}
|
||||
|
||||
// AccentColor 返回配置的主题色(小写 #rrggbb);未配置时返回空串,表示走前端默认色
|
||||
func (s *SettingService) AccentColor() (string, error) {
|
||||
var st model.SiteSetting
|
||||
err := s.db.Where("key = ?", SettingKeyAccent).First(&st).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return "", nil
|
||||
}
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return strings.ToLower(st.Value), nil
|
||||
}
|
||||
|
||||
// SetAccent 校验并保存主题色;hex 传空串表示恢复默认(删除该键)
|
||||
func (s *SettingService) SetAccent(hex string) error {
|
||||
hex = strings.TrimSpace(strings.ToLower(hex))
|
||||
if hex == "" {
|
||||
return s.db.Where("key = ?", SettingKeyAccent).Delete(&model.SiteSetting{}).Error
|
||||
}
|
||||
if !accentHexRe.MatchString(hex) {
|
||||
return ErrInvalidAccent
|
||||
}
|
||||
// UPSERT:键冲突时更新值与时间戳
|
||||
st := model.SiteSetting{Key: SettingKeyAccent, Value: hex}
|
||||
return s.db.Save(&st).Error
|
||||
}
|
||||
Reference in New Issue
Block a user