- Markdown 编辑器:实时预览、PDF 导出、独立查看器 - 数据库优化:动态连接池、查询缓存、Redis Pipeline - 窗口置顶功能 - 文件系统增强:右键菜单、编辑器集成、收藏夹重构 - 安全修复:XSS 防护、路径穿越、HTML 注入 - 代码质量:正则预编译、缓存锁优化、死代码清理
120 lines
3.0 KiB
Go
120 lines
3.0 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"`
|
|
}
|
|
|
|
// 默认 Tab 配置
|
|
var defaultTabConfig = TabConfig{
|
|
AvailableTabs: []TabDefinition{
|
|
{Key: "file-system", Title: "文件管理", Enabled: true},
|
|
{Key: "db-cli", Title: "数据库", Enabled: true},
|
|
{Key: "markdown-editor", Title: "Markdown", Enabled: true},
|
|
{Key: "openclaw-manager", Title: "OpenClaw", Enabled: true},
|
|
},
|
|
VisibleTabs: []string{"file-system", "db-cli", "markdown-editor", "openclaw-manager"},
|
|
DefaultTab: "file-system",
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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
|
|
}
|