数据表重命名

This commit is contained in:
GeekMaster
2025-09-01 09:26:12 +08:00
parent 3531c7f356
commit 957954f5ee
3 changed files with 155 additions and 61 deletions

View File

@@ -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 成为你最强大的创作伙伴开启无限创意可能_

View File

@@ -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 {

View File

@@ -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
}