🎨 优化前端菜单栏(修改为抽屉模式)&& 新增ai预设功能 && 优化ai对话前端渲染
This commit is contained in:
198
server/service/app/ai_preset.go
Normal file
198
server/service/app/ai_preset.go
Normal file
@@ -0,0 +1,198 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"git.echol.cn/loser/st/server/global"
|
||||
"git.echol.cn/loser/st/server/model/app"
|
||||
"git.echol.cn/loser/st/server/model/app/request"
|
||||
"git.echol.cn/loser/st/server/model/app/response"
|
||||
"gorm.io/datatypes"
|
||||
)
|
||||
|
||||
type AIPresetService struct{}
|
||||
|
||||
// CreateAIPreset 创建预设
|
||||
func (s *AIPresetService) CreateAIPreset(userID uint, req *request.CreateAIPresetRequest) (*app.AIPreset, error) {
|
||||
// 将 content 转换为 JSON
|
||||
configBytes, err := json.Marshal(req.Content)
|
||||
if err != nil {
|
||||
return nil, errors.New("配置格式错误")
|
||||
}
|
||||
|
||||
preset := &app.AIPreset{
|
||||
Name: req.Name,
|
||||
UserID: &userID,
|
||||
PresetType: req.Type,
|
||||
Config: datatypes.JSON(configBytes),
|
||||
IsSystem: false,
|
||||
IsDefault: false,
|
||||
}
|
||||
|
||||
if err := global.GVA_DB.Create(preset).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return preset, nil
|
||||
}
|
||||
|
||||
// UpdateAIPreset 更新预设
|
||||
func (s *AIPresetService) UpdateAIPreset(userID uint, presetID uint, req *request.UpdateAIPresetRequest) error {
|
||||
// 检查预设是否存在且属于当前用户
|
||||
var preset app.AIPreset
|
||||
if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil {
|
||||
return errors.New("预设不存在或无权限")
|
||||
}
|
||||
|
||||
// 系统预设不允许修改
|
||||
if preset.IsSystem {
|
||||
return errors.New("系统预设不允许修改")
|
||||
}
|
||||
|
||||
// 将 content 转换为 JSON
|
||||
configBytes, err := json.Marshal(req.Content)
|
||||
if err != nil {
|
||||
return errors.New("配置格式错误")
|
||||
}
|
||||
|
||||
// 更新
|
||||
updates := map[string]interface{}{
|
||||
"name": req.Name,
|
||||
"preset_type": req.Type,
|
||||
"config": datatypes.JSON(configBytes),
|
||||
}
|
||||
|
||||
if err := global.GVA_DB.Model(&preset).Updates(updates).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteAIPreset 删除预设
|
||||
func (s *AIPresetService) DeleteAIPreset(userID uint, presetID uint) error {
|
||||
// 检查预设是否存在且属于当前用户
|
||||
var preset app.AIPreset
|
||||
if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil {
|
||||
return errors.New("预设不存在或无权限")
|
||||
}
|
||||
|
||||
// 系统预设不允许删除
|
||||
if preset.IsSystem {
|
||||
return errors.New("系统预设不允许删除")
|
||||
}
|
||||
|
||||
if err := global.GVA_DB.Delete(&preset).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetAIPreset 获取预设详情
|
||||
func (s *AIPresetService) GetAIPreset(userID uint, presetID uint) (*response.AIPresetResponse, error) {
|
||||
var preset app.AIPreset
|
||||
// 可以查看自己的预设或系统预设
|
||||
if err := global.GVA_DB.Where("id = ? AND (user_id = ? OR is_system = true)", presetID, userID).First(&preset).Error; err != nil {
|
||||
return nil, errors.New("预设不存在")
|
||||
}
|
||||
|
||||
return response.ToAIPresetResponse(&preset), nil
|
||||
}
|
||||
|
||||
// GetAIPresetList 获取预设列表
|
||||
func (s *AIPresetService) GetAIPresetList(userID uint, req *request.AIPresetSearch) ([]response.AIPresetResponse, int64, error) {
|
||||
var presets []app.AIPreset
|
||||
var total int64
|
||||
|
||||
db := global.GVA_DB.Model(&app.AIPreset{})
|
||||
|
||||
// 只查询自己的预设和系统预设
|
||||
db = db.Where("user_id = ? OR is_system = true", userID)
|
||||
|
||||
// 搜索条件
|
||||
if req.Name != "" {
|
||||
db = db.Where("name LIKE ?", "%"+req.Name+"%")
|
||||
}
|
||||
if req.Type != "" {
|
||||
db = db.Where("preset_type = ?", req.Type)
|
||||
}
|
||||
|
||||
// 获取总数
|
||||
if err := db.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
offset := (req.Page - 1) * req.PageSize
|
||||
if err := db.Order("is_default DESC, updated_at DESC").
|
||||
Offset(offset).
|
||||
Limit(req.PageSize).
|
||||
Find(&presets).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// 转换为响应格式
|
||||
var result []response.AIPresetResponse
|
||||
for _, preset := range presets {
|
||||
result = append(result, *response.ToAIPresetResponse(&preset))
|
||||
}
|
||||
|
||||
return result, total, nil
|
||||
}
|
||||
|
||||
// DuplicateAIPreset 复制预设
|
||||
func (s *AIPresetService) DuplicateAIPreset(userID uint, presetID uint) (*app.AIPreset, error) {
|
||||
// 获取原预设
|
||||
var original app.AIPreset
|
||||
if err := global.GVA_DB.Where("id = ? AND (user_id = ? OR is_system = true)", presetID, userID).First(&original).Error; err != nil {
|
||||
return nil, errors.New("预设不存在")
|
||||
}
|
||||
|
||||
// 创建副本
|
||||
duplicate := &app.AIPreset{
|
||||
Name: original.Name + " (副本)",
|
||||
UserID: &userID,
|
||||
PresetType: original.PresetType,
|
||||
Config: original.Config,
|
||||
IsSystem: false,
|
||||
IsDefault: false,
|
||||
}
|
||||
|
||||
if err := global.GVA_DB.Create(duplicate).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return duplicate, nil
|
||||
}
|
||||
|
||||
// SetDefaultPreset 设置默认预设
|
||||
func (s *AIPresetService) SetDefaultPreset(userID uint, presetID uint) error {
|
||||
// 检查预设是否存在且属于当前用户
|
||||
var preset app.AIPreset
|
||||
if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil {
|
||||
return errors.New("预设不存在或无权限")
|
||||
}
|
||||
|
||||
// 开启事务
|
||||
tx := global.GVA_DB.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 取消当前用户的所有默认预设
|
||||
if err := tx.Model(&app.AIPreset{}).Where("user_id = ?", userID).Update("is_default", false).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
// 设置新的默认预设
|
||||
if err := tx.Model(&preset).Update("is_default", true).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
}
|
||||
Reference in New Issue
Block a user