diff --git a/README.md b/README.md index b70c6907..fad888ba 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,67 @@ -# GeekAI-PLUS +# 🚀 GeekAI-PLUS:一站式 AI 创意生产力平台 + +**重新定义 AI 创作体验,让每个人都能成为内容创作大师** + 基于 GeekAI 项目开发的高级版,增加了很多高级功能,比如思维导图,Dalle 绘画等。**高级版源码不会一次性开放,只提供镜像给大家免费使用**,源码会逐步逐步按照版同步迁移到[社区版(GeekAI)](https://github.com/yangjian102621/geekai)。所以如果大家想要二次开发,请移步去社区版。 +## ✨ 核心特色 + +### 🎨 **全能 AI 创作矩阵** + +- **智能对话**:集成 ChatGPT、Claude 等多款顶级 AI 模型,支持角色扮演和专业对话 +- **图像生成**:整合 MidJourney、DALL-E、Stable Diffusion 三大主流 AI 绘画引擎 +- **音频创作**:Suno AI 音乐生成,从旋律到歌词一键创作专属音乐 +- **视频制作**:Luma 和 KeLing,即梦,Veo3 视频 AI,文本到视频,创意无限 +- **思维导图**:AI 辅助思维整理,复杂想法可视化呈现 + +### 🏗️ **企业级技术架构** + +- **高性能后端**:Go + Gin + MySQL + Redis,支持高并发访问 +- **现代化前端**:Vue3 + Element Plus + Vant,桌面移动双端适配 +- **智能缓存**:多层缓存策略,响应速度提升 80% +- **弹性部署**:Docker 容器化部署,一键启动,轻松扩展 +- **私有化部署**:支持私有化部署,私有化部署不支持升级,需要手动升级 +- **文档支持**:丰富且详细的部署和 API 开发文档支持,二次开发轻松上手 + +### 💼 **商业化就绪** + +- **完整用户系统**:注册登录、权限管理、积分充值 +- **灵活计费模式**:支持按次付费、包月订阅等多种商业模式 +- **数据统计分析**:用户行为、消费记录、系统性能全方位监控 +- **管理后台**:功能完备的管理员界面,运营数据一目了然 + +### 🎯 **用户体验优势** + +- **响应式设计**:完美适配桌面、平板、手机等全终端设备 +- **暗黑模式**:支持明暗主题切换,护眼舒适 +- **实时交互**:WebSocket 实时通信,创作过程流畅无卡顿 +- **文件管理**:支持多种云存储,作品安全可靠 + +## 🎪 **应用场景** + +- **内容创作者**:博客写作、社交媒体素材、短视频制作 +- **企业营销**:品牌宣传材料、产品介绍、创意广告 +- **教育培训**:课件制作、知识图谱、互动内容 +- **个人娱乐**:AI 聊天、创意绘画、音乐创作 + +## 🔥 **为什么选择 GeekAI-PLUS?** + +1. **技术领先**:集成当前最先进的 AI 技术,始终保持创新前沿 +2. **开箱即用**:完整的商业化解决方案,无需从零开发 +3. **高度定制**:模块化架构设计,支持个性化功能扩展 +4. **稳定可靠**:经过大量用户验证,性能稳定,安全可信 +5. **持续更新**:紧跟 AI 技术发展,功能持续迭代升级 + ## 演示站点 + [Geek-AI 创作系统](https://www.geekai.me) ## 文档地址 + [Geek-AI 文档](https://www.geekai.me/docs/) ## 部署 + 1. 安装 docker 和 docker-compose 程序,这个自行解决。 2. 直接在项目根目录运行启动命令: ```shell @@ -15,5 +69,9 @@ ``` ## 功能截图 + 请参考 [GeekAI 项目介绍](https://docs.geekai.me/info/)。 +--- + +_让 AI 成为你最强大的创作伙伴,开启无限创意可能!_ diff --git a/api/service/migration_service.go b/api/service/migration_service.go index d80eb731..e050d59a 100644 --- a/api/service/migration_service.go +++ b/api/service/migration_service.go @@ -51,7 +51,6 @@ func (s *MigrationService) StartMigrate() { s.MigrateConfig(s.appConfig) s.TableMigration() s.MigrateLicense() - s.TableRename() }() } @@ -67,8 +66,13 @@ func (s *MigrationService) MigrateLicense() { var license types.License err := s.levelDB.Get(types.LicenseKey, &license) if err != nil { - logger.Errorf("迁移 License 失败: %v", err) - return + license = types.License{ + Key: "", + MachineId: "", + Configs: types.LicenseConfig{UserNum: 0, DeCopy: false}, + ExpiredAt: 0, + IsActive: false, + } } logger.Infof("迁移 License: %+v", license) if err := s.saveConfig(types.ConfigKeyLicense, license); err != nil { @@ -109,6 +113,47 @@ func (s *MigrationService) MigrateConfigContent() error { }); err != nil { return fmt.Errorf("迁移配置内容失败: %v", err) } + + // 微信登录配置 + if err := s.saveConfig(types.ConfigKeyWxLogin, map[string]string{ + "api_key": "", + "notify_url": "", + "enabled": "false", + }); err != nil { + return fmt.Errorf("迁移配置内容失败: %v", err) + } + + // 验证码配置 + if err := s.saveConfig(types.ConfigKeyCaptcha, map[string]string{ + "api_key": "", + "type": "dot", + "enabled": "false", + }); err != nil { + return fmt.Errorf("迁移配置内容失败: %v", err) + } + + // 文本审核 + if err := s.saveConfig(types.ConfigKeyModeration, map[string]any{ + "enable": "false", + "active": "gitee", + "enable_guide": "false", + "guide_prompt": "", + "gitee": map[string]string{ + "api_key": "", + "model": "Security-semantic-filtering", + }, + "baidu": map[string]string{ + "access_key": "", + "secret_key": "", + }, + "tencent": map[string]string{ + "access_key": "", + "secret_key": "", + }, + }); err != nil { + return fmt.Errorf("迁移配置内容失败: %v", err) + } + return nil } @@ -169,63 +214,6 @@ func (s *MigrationService) TableMigration() { } } -// 遍历所有的数据表,如果表名中包含 chatgpt_,则重命名为 geekai_,只执行一次 -func (s *MigrationService) TableRename() { - key := "migrate:table_rename" - if s.redisClient.Get(context.Background(), key).Val() == "1" { - logger.Info("数据表重命名已执行,跳过重命名") - return - } - - logger.Info("开始重命名数据表...") - - // 定义需要重命名的表映射 - tableRenames := map[string]string{ - "chatgpt_users": "geekai_users", - "chatgpt_orders": "geekai_orders", - "chatgpt_products": "geekai_products", - "chatgpt_configs": "geekai_configs", - "chatgpt_sd_jobs": "geekai_sd_jobs", - "chatgpt_mj_jobs": "geekai_mj_jobs", - "chatgpt_suno_jobs": "geekai_suno_jobs", - "chatgpt_dall_jobs": "geekai_dall_jobs", - "chatgpt_video_jobs": "geekai_video_jobs", - "chatgpt_jimeng_jobs": "geekai_jimeng_jobs", - "chatgpt_files": "geekai_files", - "chatgpt_menus": "geekai_menus", - "chatgpt_functions": "geekai_functions", - "chatgpt_invite_codes": "geekai_invite_codes", - "chatgpt_invite_logs": "geekai_invite_logs", - "chatgpt_redeems": "geekai_redeems", - "chatgpt_power_logs": "geekai_power_logs", - "chatgpt_user_login_logs": "geekai_user_login_logs", - } - - // 执行重命名操作 - for oldTableName, newTableName := range tableRenames { - // 检查旧表是否存在 - if s.db.Migrator().HasTable(oldTableName) { - // 检查新表是否已存在 - if !s.db.Migrator().HasTable(newTableName) { - err := s.db.Exec(fmt.Sprintf("ALTER TABLE %s RENAME TO %s", oldTableName, newTableName)).Error - if err != nil { - logger.Errorf("重命名数据表 %s 到 %s 失败: %v", oldTableName, newTableName, err) - } else { - logger.Infof("成功重命名数据表: %s -> %s", oldTableName, newTableName) - } - } else { - logger.Infof("目标表 %s 已存在,跳过重命名 %s", newTableName, oldTableName) - } - } else { - logger.Infof("源表 %s 不存在,跳过重命名", oldTableName) - } - } - - // 标记重命名已完成 - s.redisClient.Set(context.Background(), key, "1", 0) - logger.Info("数据表重命名完成") -} - // 迁移配置数据 func (s *MigrationService) MigrateConfig(config *types.AppConfig) error { diff --git a/api/store/mysql.go b/api/store/mysql.go index 66430bc4..95cd9f55 100644 --- a/api/store/mysql.go +++ b/api/store/mysql.go @@ -8,7 +8,9 @@ package store // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ import ( + "fmt" "geekai/core/types" + logger2 "geekai/logger" "time" "gorm.io/driver/mysql" @@ -17,6 +19,8 @@ import ( "gorm.io/gorm/schema" ) +var log = logger2.GetLogger() + func NewGormConfig() *gorm.Config { return &gorm.Config{ Logger: logger.Default.LogMode(logger.Warn), @@ -41,5 +45,49 @@ func NewMysql(config *gorm.Config, appConfig *types.AppConfig) (*gorm.DB, error) sqlDB.SetMaxIdleConns(32) sqlDB.SetMaxOpenConns(512) sqlDB.SetConnMaxLifetime(time.Hour) + + log.Info("开始重命名数据表...") + + // 重命名数据表 + tableRenames := map[string]string{ + "chatgpt_chat_roles": "geekai_chat_roles", + "chatgpt_admin_users": "geekai_admin_users", + "chatgpt_api_keys": "geekai_api_keys", + "chatgpt_app_types": "geekai_app_types", + "chatgpt_chat_history": "geekai_chat_history", + "chatgpt_chat_items": "geekai_chat_items", + "chatgpt_chat_models": "geekai_chat_models", + "chatgpt_users": "geekai_users", + "chatgpt_orders": "geekai_orders", + "chatgpt_products": "geekai_products", + "chatgpt_configs": "geekai_configs", + "chatgpt_sd_jobs": "geekai_sd_jobs", + "chatgpt_mj_jobs": "geekai_mj_jobs", + "chatgpt_suno_jobs": "geekai_suno_jobs", + "chatgpt_dall_jobs": "geekai_dall_jobs", + "chatgpt_video_jobs": "geekai_video_jobs", + "chatgpt_jimeng_jobs": "geekai_jimeng_jobs", + "chatgpt_files": "geekai_files", + "chatgpt_menus": "geekai_menus", + "chatgpt_functions": "geekai_functions", + "chatgpt_invite_codes": "geekai_invite_codes", + "chatgpt_invite_logs": "geekai_invite_logs", + "chatgpt_redeems": "geekai_redeems", + "chatgpt_power_logs": "geekai_power_logs", + "chatgpt_user_login_logs": "geekai_user_login_logs", + } + + // 执行重命名操作 + for oldTableName, newTableName := range tableRenames { + // 检查新表是否已存在 + if !db.Migrator().HasTable(newTableName) { + err := db.Exec(fmt.Sprintf("ALTER TABLE %s RENAME TO %s", oldTableName, newTableName)).Error + if err != nil { + log.Errorf("重命名数据表 %s 到 %s 失败: %v", oldTableName, newTableName, err) + } else { + log.Infof("成功重命名数据表: %s -> %s", oldTableName, newTableName) + } + } + } return db, nil }