- 更新链路: 检查记录远端SHA256,下载完成事件回传,安装时带哈希校验 - 续传: 服务器忽略Range返回200时截断重下防追加损坏,文件名去query - 定时器: 自动检查可重入,配置变更免重启生效,关闭即停,下载加互斥 - 前端: 支持跳过此版本并按版本去重,手动检查不受门禁限制,启动未就绪延时重试 - 更新面板: 新增自动检查开关/间隔/地址配置与进度条状态映射 - 版本历史: cache参数强制刷新与加载超时重试兜底 - 配置: 侧边栏分区全链路持久化,保存请求复用api类型防字段丢失 - 侧边栏: 区块定位改显式类名,不再依赖排序位置 - 绑定: 重新生成并与镜像目录同步
129 lines
3.3 KiB
Go
129 lines
3.3 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"u-desk/internal/storage"
|
|
"u-desk/internal/storage/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// ConfigService 配置服务
|
|
type ConfigService struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewConfigService 创建配置服务实例
|
|
func NewConfigService() (*ConfigService, error) {
|
|
db, err := storage.InitFast()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("数据库初始化失败: %w", err)
|
|
}
|
|
|
|
return &ConfigService{db: db}, nil
|
|
}
|
|
|
|
// TabDefinition Tab 定义
|
|
type TabDefinition struct {
|
|
Key string `json:"key"`
|
|
Title string `json:"title"`
|
|
Enabled bool `json:"enabled"`
|
|
}
|
|
|
|
// TabConfig Tab 配置
|
|
type TabConfig struct {
|
|
AvailableTabs []TabDefinition `json:"available_tabs"`
|
|
VisibleTabs []string `json:"visible_tabs"`
|
|
DefaultTab string `json:"default_tab"`
|
|
SidebarSections []string `json:"sidebar_sections"`
|
|
}
|
|
|
|
// 默认侧边栏分区
|
|
var defaultSidebarSections = []string{"server", "favorites", "help"}
|
|
|
|
// 默认 Tab 配置
|
|
var defaultTabConfig = TabConfig{
|
|
AvailableTabs: []TabDefinition{
|
|
{Key: "file-system", Title: "文件管理", Enabled: true},
|
|
{Key: "markdown-editor", Title: "Markdown", Enabled: true},
|
|
{Key: "version", Title: "版本历史", Enabled: true},
|
|
},
|
|
VisibleTabs: []string{"file-system", "markdown-editor", "version"},
|
|
DefaultTab: "file-system",
|
|
SidebarSections: defaultSidebarSections,
|
|
}
|
|
|
|
const (
|
|
tabConfigKey = "tab_config"
|
|
)
|
|
|
|
// GetTabConfig 获取 Tab 配置
|
|
func (s *ConfigService) GetTabConfig() (*TabConfig, error) {
|
|
var config models.AppConfig
|
|
|
|
// 查询配置
|
|
err := s.db.Where("`key` = ?", tabConfigKey).First(&config).Error
|
|
if err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
// 不存在配置,返回默认配置
|
|
return &defaultTabConfig, nil
|
|
}
|
|
return nil, fmt.Errorf("查询配置失败: %w", err)
|
|
}
|
|
|
|
// 解析 JSON
|
|
var tabConfig TabConfig
|
|
if err := json.Unmarshal([]byte(config.Value), &tabConfig); err != nil {
|
|
// 解析失败,返回默认配置
|
|
return &defaultTabConfig, nil
|
|
}
|
|
|
|
// 验证配置完整性
|
|
if len(tabConfig.AvailableTabs) == 0 || len(tabConfig.VisibleTabs) == 0 {
|
|
return &defaultTabConfig, nil
|
|
}
|
|
|
|
// 侧边栏分区为空时回退默认值(兼容旧配置)
|
|
if len(tabConfig.SidebarSections) == 0 {
|
|
tabConfig.SidebarSections = defaultSidebarSections
|
|
}
|
|
|
|
return &tabConfig, nil
|
|
}
|
|
|
|
// SaveTabConfig 保存 Tab 配置
|
|
func (s *ConfigService) SaveTabConfig(config *TabConfig) error {
|
|
// 序列化为 JSON
|
|
jsonData, err := json.Marshal(config)
|
|
if err != nil {
|
|
return fmt.Errorf("序列化配置失败: %w", err)
|
|
}
|
|
|
|
// 查询是否存在配置
|
|
var existingConfig models.AppConfig
|
|
err = s.db.Where("`key` = ?", tabConfigKey).First(&existingConfig).Error
|
|
|
|
if err == gorm.ErrRecordNotFound {
|
|
// 不存在,创建新配置
|
|
newConfig := models.AppConfig{
|
|
Key: tabConfigKey,
|
|
Value: string(jsonData),
|
|
Description: "Tab 显示和排序配置",
|
|
}
|
|
if err := s.db.Create(&newConfig).Error; err != nil {
|
|
return fmt.Errorf("创建配置失败: %w", err)
|
|
}
|
|
} else if err != nil {
|
|
return fmt.Errorf("查询配置失败: %w", err)
|
|
} else {
|
|
// 存在,更新配置
|
|
existingConfig.Value = string(jsonData)
|
|
if err := s.db.Save(&existingConfig).Error; err != nil {
|
|
return fmt.Errorf("更新配置失败: %w", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|