🎨 优化前端菜单栏(修改为抽屉模式)&& 新增ai预设功能 && 优化ai对话前端渲染
This commit is contained in:
256
server/api/v1/app/ai_preset.go
Normal file
256
server/api/v1/app/ai_preset.go
Normal file
@@ -0,0 +1,256 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"git.echol.cn/loser/st/server/global"
|
||||
"git.echol.cn/loser/st/server/model/app/request"
|
||||
"git.echol.cn/loser/st/server/model/common/response"
|
||||
"git.echol.cn/loser/st/server/service"
|
||||
"git.echol.cn/loser/st/server/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type AIPresetApi struct{}
|
||||
|
||||
var aiPresetService = service.ServiceGroupApp.AppServiceGroup.AIPresetService
|
||||
|
||||
// CreateAIPreset 创建预设
|
||||
// @Tags AIPreset
|
||||
// @Summary 创建AI预设
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param data body request.CreateAIPresetRequest true "预设信息"
|
||||
// @Success 200 {object} response.Response{data=app.AIPreset,msg=string} "创建成功"
|
||||
// @Router /app/preset/create [post]
|
||||
func (a *AIPresetApi) CreateAIPreset(c *gin.Context) {
|
||||
var req request.CreateAIPresetRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
preset, err := aiPresetService.CreateAIPreset(userID, &req)
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("创建预设失败", zap.Error(err))
|
||||
response.FailWithMessage("创建预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithData(preset, c)
|
||||
}
|
||||
|
||||
// UpdateAIPreset 更新预设
|
||||
// @Tags AIPreset
|
||||
// @Summary 更新AI预设
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param id path int true "预设ID"
|
||||
// @Param data body request.UpdateAIPresetRequest true "预设信息"
|
||||
// @Success 200 {object} response.Response{msg=string} "更新成功"
|
||||
// @Router /app/preset/update/{id} [put]
|
||||
func (a *AIPresetApi) UpdateAIPreset(c *gin.Context) {
|
||||
presetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
response.FailWithMessage("无效的预设ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
var req request.UpdateAIPresetRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
if err := aiPresetService.UpdateAIPreset(userID, uint(presetID), &req); err != nil {
|
||||
global.GVA_LOG.Error("更新预设失败", zap.Error(err))
|
||||
response.FailWithMessage("更新预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithMessage("更新成功", c)
|
||||
}
|
||||
|
||||
// DeleteAIPreset 删除预设
|
||||
// @Tags AIPreset
|
||||
// @Summary 删除AI预设
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param id path int true "预设ID"
|
||||
// @Success 200 {object} response.Response{msg=string} "删除成功"
|
||||
// @Router /app/preset/delete/{id} [delete]
|
||||
func (a *AIPresetApi) DeleteAIPreset(c *gin.Context) {
|
||||
presetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
response.FailWithMessage("无效的预设ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
if err := aiPresetService.DeleteAIPreset(userID, uint(presetID)); err != nil {
|
||||
global.GVA_LOG.Error("删除预设失败", zap.Error(err))
|
||||
response.FailWithMessage("删除预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithMessage("删除成功", c)
|
||||
}
|
||||
|
||||
// GetAIPreset 获取预设详情
|
||||
// @Tags AIPreset
|
||||
// @Summary 获取AI预设详情
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param id path int true "预设ID"
|
||||
// @Success 200 {object} response.Response{data=response.AIPresetResponse,msg=string} "获取成功"
|
||||
// @Router /app/preset/get/{id} [get]
|
||||
func (a *AIPresetApi) GetAIPreset(c *gin.Context) {
|
||||
presetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
response.FailWithMessage("无效的预设ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
preset, err := aiPresetService.GetAIPreset(userID, uint(presetID))
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("获取预设失败", zap.Error(err))
|
||||
response.FailWithMessage("获取预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithData(preset, c)
|
||||
}
|
||||
|
||||
// GetAIPresetList 获取预设列表
|
||||
// @Tags AIPreset
|
||||
// @Summary 获取AI预设列表
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param data body request.AIPresetSearch true "搜索条件"
|
||||
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "获取成功"
|
||||
// @Router /app/preset/list [post]
|
||||
func (a *AIPresetApi) GetAIPresetList(c *gin.Context) {
|
||||
var req request.AIPresetSearch
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
list, total, err := aiPresetService.GetAIPresetList(userID, &req)
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("获取预设列表失败", zap.Error(err))
|
||||
response.FailWithMessage("获取预设列表失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithDetailed(response.PageResult{
|
||||
List: list,
|
||||
Total: total,
|
||||
Page: req.Page,
|
||||
PageSize: req.PageSize,
|
||||
}, "获取成功", c)
|
||||
}
|
||||
|
||||
// DuplicateAIPreset 复制预设
|
||||
// @Tags AIPreset
|
||||
// @Summary 复制AI预设
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param id path int true "预设ID"
|
||||
// @Success 200 {object} response.Response{data=app.AIPreset,msg=string} "复制成功"
|
||||
// @Router /app/preset/duplicate/{id} [post]
|
||||
func (a *AIPresetApi) DuplicateAIPreset(c *gin.Context) {
|
||||
presetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
response.FailWithMessage("无效的预设ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
preset, err := aiPresetService.DuplicateAIPreset(userID, uint(presetID))
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("复制预设失败", zap.Error(err))
|
||||
response.FailWithMessage("复制预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithData(preset, c)
|
||||
}
|
||||
|
||||
// SetDefaultPreset 设置默认预设
|
||||
// @Tags AIPreset
|
||||
// @Summary 设置默认AI预设
|
||||
// @Security ApiKeyAuth
|
||||
// @accept application/json
|
||||
// @Produce application/json
|
||||
// @Param id path int true "预设ID"
|
||||
// @Success 200 {object} response.Response{msg=string} "设置成功"
|
||||
// @Router /app/preset/setDefault/{id} [post]
|
||||
func (a *AIPresetApi) SetDefaultPreset(c *gin.Context) {
|
||||
presetID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||||
if err != nil {
|
||||
response.FailWithMessage("无效的预设ID", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户ID
|
||||
userID := utils.GetUserID(c)
|
||||
if userID == 0 {
|
||||
response.FailWithMessage("获取用户信息失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
if err := aiPresetService.SetDefaultPreset(userID, uint(presetID)); err != nil {
|
||||
global.GVA_LOG.Error("设置默认预设失败", zap.Error(err))
|
||||
response.FailWithMessage("设置默认预设失败: "+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithMessage("设置成功", c)
|
||||
}
|
||||
@@ -9,6 +9,7 @@ type ApiGroup struct {
|
||||
RegexScriptApi
|
||||
ProviderApi
|
||||
ChatApi
|
||||
AIPresetApi
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
@@ -96,6 +96,7 @@ func RegisterTables() {
|
||||
app.AIUsageStat{},
|
||||
app.AIRegexScript{},
|
||||
app.AICharacterRegexScript{},
|
||||
app.AICharacterWorldInfo{},
|
||||
)
|
||||
if err != nil {
|
||||
global.GVA_LOG.Error("register table failed", zap.Error(err))
|
||||
|
||||
@@ -153,6 +153,7 @@ func Routers() *gin.Engine {
|
||||
appRouter.InitRegexScriptRouter(appGroup) // 正则脚本路由:/app/regex/*
|
||||
appRouter.InitProviderRouter(appGroup) // AI提供商路由:/app/provider/*
|
||||
appRouter.InitChatRouter(appGroup) // 对话路由:/app/chat/*
|
||||
appRouter.InitAIPresetRouter(appGroup) // AI预设路由:/app/preset/*
|
||||
}
|
||||
|
||||
//插件路由安装
|
||||
|
||||
24
server/model/app/request/ai_preset.go
Normal file
24
server/model/app/request/ai_preset.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package request
|
||||
|
||||
import "git.echol.cn/loser/st/server/model/common/request"
|
||||
|
||||
// CreateAIPresetRequest 创建预设请求
|
||||
type CreateAIPresetRequest struct {
|
||||
Name string `json:"name" binding:"required,max=200"`
|
||||
Type string `json:"type" binding:"required,max=100"`
|
||||
Content map[string]interface{} `json:"content" binding:"required"`
|
||||
}
|
||||
|
||||
// UpdateAIPresetRequest 更新预设请求
|
||||
type UpdateAIPresetRequest struct {
|
||||
Name string `json:"name" binding:"required,max=200"`
|
||||
Type string `json:"type" binding:"required,max=100"`
|
||||
Content map[string]interface{} `json:"content" binding:"required"`
|
||||
}
|
||||
|
||||
// AIPresetSearch 预设搜索请求
|
||||
type AIPresetSearch struct {
|
||||
request.PageInfo
|
||||
Name string `json:"name" form:"name"`
|
||||
Type string `json:"type" form:"type"`
|
||||
}
|
||||
42
server/model/app/response/ai_preset.go
Normal file
42
server/model/app/response/ai_preset.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package response
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.echol.cn/loser/st/server/model/app"
|
||||
"time"
|
||||
)
|
||||
|
||||
// AIPresetResponse 预设响应
|
||||
type AIPresetResponse struct {
|
||||
ID uint `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Type string `json:"type"`
|
||||
Content map[string]interface{} `json:"content"`
|
||||
IsSystem bool `json:"isSystem"`
|
||||
IsDefault bool `json:"isDefault"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
// ToAIPresetResponse 转换为响应格式
|
||||
func ToAIPresetResponse(preset *app.AIPreset) *AIPresetResponse {
|
||||
content := make(map[string]interface{})
|
||||
if preset.Config != nil && len(preset.Config) > 0 {
|
||||
// 将 datatypes.JSON 转换为 map
|
||||
if err := json.Unmarshal(preset.Config, &content); err != nil {
|
||||
// 如果解析失败,返回空 map
|
||||
content = make(map[string]interface{})
|
||||
}
|
||||
}
|
||||
|
||||
return &AIPresetResponse{
|
||||
ID: preset.ID,
|
||||
Name: preset.Name,
|
||||
Type: preset.PresetType,
|
||||
Content: content,
|
||||
IsSystem: preset.IsSystem,
|
||||
IsDefault: preset.IsDefault,
|
||||
CreatedAt: preset.CreatedAt,
|
||||
UpdatedAt: preset.UpdatedAt,
|
||||
}
|
||||
}
|
||||
23
server/router/app/ai_preset.go
Normal file
23
server/router/app/ai_preset.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"git.echol.cn/loser/st/server/api/v1"
|
||||
"git.echol.cn/loser/st/server/middleware"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type AIPresetRouter struct{}
|
||||
|
||||
func (r *AIPresetRouter) InitAIPresetRouter(Router *gin.RouterGroup) {
|
||||
presetRouter := Router.Group("preset").Use(middleware.JWTAuth())
|
||||
presetApi := v1.ApiGroupApp.AppApiGroup.AIPresetApi
|
||||
{
|
||||
presetRouter.POST("create", presetApi.CreateAIPreset) // 创建预设
|
||||
presetRouter.PUT("update/:id", presetApi.UpdateAIPreset) // 更新预设
|
||||
presetRouter.DELETE("delete/:id", presetApi.DeleteAIPreset) // 删除预设
|
||||
presetRouter.GET("get/:id", presetApi.GetAIPreset) // 获取预设详情
|
||||
presetRouter.POST("list", presetApi.GetAIPresetList) // 获取预设列表
|
||||
presetRouter.POST("duplicate/:id", presetApi.DuplicateAIPreset) // 复制预设
|
||||
presetRouter.POST("setDefault/:id", presetApi.SetDefaultPreset) // 设置默认预设
|
||||
}
|
||||
}
|
||||
@@ -7,4 +7,5 @@ type RouterGroup struct {
|
||||
RegexScriptRouter
|
||||
ProviderRouter
|
||||
ChatRouter
|
||||
AIPresetRouter
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
@@ -7,4 +7,5 @@ type AppServiceGroup struct {
|
||||
RegexScriptService
|
||||
ProviderService
|
||||
ChatService
|
||||
AIPresetService
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user