mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-04-11 21:54:26 +08:00
数据表重命名
This commit is contained in:
60
README.md
60
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 成为你最强大的创作伙伴,开启无限创意可能!_
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user