feat(全栈): 实现简易模式核心功能
**功能概述**: 实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。 **后端改动**: 1. 配置系统 - 新增 run_mode 配置项(standard/simple) - 支持环境变量 RUN_MODE - 默认值为 standard 2. 数据库初始化 - 自动创建3个默认分组:anthropic-default、openai-default、gemini-default - 默认分组配置:无并发限制、active状态、非独占 - 幂等性保证:重复启动不会重复创建 3. 账号管理 - 创建账号时自动绑定对应平台的默认分组 - 如果未指定分组,自动查找并绑定默认分组 **前端改动**: 1. 状态管理 - authStore 新增 isSimpleMode 计算属性 - 从后端API获取并同步运行模式 2. UI隐藏 - 侧边栏:隐藏分组管理、订阅管理、兑换码菜单 - 账号管理页面:隐藏分组列 - 创建/编辑账号对话框:隐藏分组选择器 3. 路由守卫 - 限制访问分组、订阅、兑换码相关页面 - 访问受限页面时自动重定向到仪表板 **配置示例**: ```yaml run_mode: simple run_mode: standard ``` **影响范围**: - 后端:配置、数据库迁移、账号服务 - 前端:认证状态、路由、UI组件 - 部署:配置文件示例 **兼容性**: - 简易模式和标准模式可无缝切换 - 不需要数据迁移 - 现有数据不受影响
This commit is contained in:
@@ -30,6 +30,11 @@ func AutoMigrate(db *gorm.DB) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建默认分组(简易模式支持)
|
||||
if err := ensureDefaultGroups(db); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 修复无效的过期时间(年份超过 2099 会导致 JSON 序列化失败)
|
||||
return fixInvalidExpiresAt(db)
|
||||
}
|
||||
@@ -47,3 +52,55 @@ func fixInvalidExpiresAt(db *gorm.DB) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ensureDefaultGroups 确保默认分组存在(简易模式支持)
|
||||
// 为每个平台创建一个默认分组,配置最大权限以确保简易模式下不受限制
|
||||
func ensureDefaultGroups(db *gorm.DB) error {
|
||||
defaultGroups := []struct {
|
||||
name string
|
||||
platform string
|
||||
description string
|
||||
}{
|
||||
{
|
||||
name: "anthropic-default",
|
||||
platform: "anthropic",
|
||||
description: "Default group for Anthropic accounts (Simple Mode)",
|
||||
},
|
||||
{
|
||||
name: "openai-default",
|
||||
platform: "openai",
|
||||
description: "Default group for OpenAI accounts (Simple Mode)",
|
||||
},
|
||||
{
|
||||
name: "gemini-default",
|
||||
platform: "gemini",
|
||||
description: "Default group for Gemini accounts (Simple Mode)",
|
||||
},
|
||||
}
|
||||
|
||||
for _, dg := range defaultGroups {
|
||||
var count int64
|
||||
if err := db.Model(&groupModel{}).Where("name = ?", dg.name).Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if count == 0 {
|
||||
group := &groupModel{
|
||||
Name: dg.name,
|
||||
Description: dg.description,
|
||||
Platform: dg.platform,
|
||||
RateMultiplier: 1.0,
|
||||
IsExclusive: false,
|
||||
Status: "active",
|
||||
SubscriptionType: "standard",
|
||||
}
|
||||
if err := db.Create(group).Error; err != nil {
|
||||
log.Printf("[AutoMigrate] Failed to create default group %s: %v", dg.name, err)
|
||||
return err
|
||||
}
|
||||
log.Printf("[AutoMigrate] Created default group: %s (platform: %s)", dg.name, dg.platform)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user