add set default translate

This commit is contained in:
unknown
2025-08-24 00:15:56 +08:00
parent bee60efe61
commit aa6695e93f
6 changed files with 633 additions and 4 deletions

181
backend/deploy_migrate.py Normal file
View File

@ -0,0 +1,181 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
数据库迁移和部署脚本
用于自动化处理Django项目的数据库迁移和初始化
"""
import os
import sys
import subprocess
import time
from pathlib import Path
# 添加项目路径到Python路径
current_dir = Path(__file__).parent
sys.path.insert(0, str(current_dir))
# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
def run_command(command, description="", check_error=True):
"""
执行命令并处理结果
"""
print(f"\n{'='*60}")
print(f"🔄 {description}")
print(f"执行命令: {command}")
print(f"{'='*60}")
try:
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
cwd=current_dir
)
if result.stdout:
print("✅ 输出:")
print(result.stdout)
if result.stderr and check_error:
print("⚠️ 警告/错误:")
print(result.stderr)
if result.returncode != 0 and check_error:
print(f"❌ 命令执行失败,返回码: {result.returncode}")
return False
else:
print(f"✅ 命令执行成功")
return True
except Exception as e:
print(f"❌ 执行命令时发生异常: {e}")
return False
def check_database_connection():
"""
检查数据库连接
"""
print("\n🔍 检查数据库连接...")
try:
import django
django.setup()
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
result = cursor.fetchone()
if result:
print("✅ 数据库连接正常")
return True
except Exception as e:
print(f"❌ 数据库连接失败: {e}")
return False
def backup_database():
"""
备份数据库(可选)
"""
print("\n💾 数据库备份...")
timestamp = time.strftime("%Y%m%d_%H%M%S")
backup_file = f"backup_fyapi_{timestamp}.sql"
# 这里可以添加数据库备份逻辑
# 例如mysqldump 命令
print(f"📝 建议手动备份数据库到: {backup_file}")
return True
def migrate_database():
"""
执行数据库迁移
"""
print("\n🚀 开始数据库迁移流程...")
# 1. 检查数据库连接
if not check_database_connection():
print("❌ 数据库连接失败,请检查配置")
return False
# 2. 备份数据库
backup_database()
# 3. 生成迁移文件
if not run_command("python manage.py makemigrations", "生成迁移文件"):
print("❌ 生成迁移文件失败")
return False
# 4. 显示迁移计划
run_command("python manage.py showmigrations", "显示迁移状态", check_error=False)
# 5. 执行迁移
if not run_command("python manage.py migrate", "执行数据库迁移"):
print("❌ 数据库迁移失败")
return False
# 6. 收集静态文件
run_command("python manage.py collectstatic --noinput", "收集静态文件", check_error=False)
print("\n🎉 数据库迁移完成!")
return True
def initialize_data():
"""
初始化数据
"""
print("\n📊 初始化系统数据...")
# 初始化系统数据
if not run_command("python manage.py init -y", "初始化系统数据"):
print("⚠️ 系统数据初始化失败,可能是因为数据已存在")
# 初始化翻译服务数据
if not run_command("python manage.py import_translation_services", "导入翻译服务配置"):
print("⚠️ 翻译服务配置导入失败")
print("✅ 数据初始化完成")
def main():
"""
主函数
"""
print("🚀 Django项目数据库迁移和部署脚本")
print("=" * 60)
# 检查manage.py是否存在
if not os.path.exists("manage.py"):
print("❌ 未找到manage.py文件请确保在Django项目根目录下运行此脚本")
sys.exit(1)
# 询问用户是否继续
response = input("\n是否继续执行数据库迁移?(y/N): ").lower().strip()
if response not in ['y', 'yes']:
print("❌ 用户取消操作")
sys.exit(0)
try:
# 执行迁移
if migrate_database():
# 询问是否初始化数据
response = input("\n是否初始化系统数据?(y/N): ").lower().strip()
if response in ['y', 'yes']:
initialize_data()
print("\n🎉 部署完成!")
print("📝 接下来可以启动服务:")
print(" python manage.py runserver 0.0.0.0:8000")
else:
print("\n❌ 迁移失败,请检查错误信息")
sys.exit(1)
except KeyboardInterrupt:
print("\n❌ 用户中断操作")
sys.exit(1)
except Exception as e:
print(f"\n❌ 发生未预期的错误: {e}")
sys.exit(1)
if __name__ == "__main__":
main()

80
backend/migrate.bat Normal file
View File

@ -0,0 +1,80 @@
@echo off
chcp 65001 >nul
echo.
echo ========================================
echo 🚀 Django数据库迁移脚本
echo ========================================
echo.
REM 检查manage.py是否存在
if not exist "manage.py" (
echo ❌ 未找到manage.py文件
echo 请确保在Django项目根目录下运行此脚本
pause
exit /b 1
)
echo 📋 开始数据库迁移流程...
echo.
REM 1. 生成迁移文件
echo 🔄 步骤1: 生成迁移文件
echo ----------------------------------------
python manage.py makemigrations
if errorlevel 1 (
echo ❌ 生成迁移文件失败
pause
exit /b 1
)
echo ✅ 迁移文件生成成功
echo.
REM 2. 显示迁移计划
echo 🔄 步骤2: 显示迁移状态
echo ----------------------------------------
python manage.py showmigrations
echo.
REM 3. 执行迁移
echo 🔄 步骤3: 执行数据库迁移
echo ----------------------------------------
python manage.py migrate
if errorlevel 1 (
echo ❌ 数据库迁移失败
pause
exit /b 1
)
echo ✅ 数据库迁移成功
echo.
REM 4. 询问是否初始化数据
set /p init_data="是否初始化系统数据?(y/N): "
if /i "%init_data%"=="y" (
echo 🔄 步骤4: 初始化系统数据
echo ----------------------------------------
python manage.py init -y
echo.
echo 🔄 步骤5: 导入翻译服务配置
echo ----------------------------------------
python manage.py import_translation_services
echo.
)
REM 5. 收集静态文件(可选)
set /p collect_static="是否收集静态文件?(y/N): "
if /i "%collect_static%"=="y" (
echo 🔄 收集静态文件
echo ----------------------------------------
python manage.py collectstatic --noinput
echo.
)
echo ========================================
echo 🎉 迁移完成!
echo ========================================
echo.
echo 📝 接下来可以启动服务:
echo python manage.py runserver 0.0.0.0:8000
echo.
pause

View File

@ -0,0 +1,116 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
一键设置“默认翻译线路”为指定值(默认 youDao
- 写入 SystemConfigbase.realtime_route / base.history_route
- 执行后会在本进程内刷新系统配置缓存dispatch.refresh_system_config
但正在运行的后端服务进程仍需重启才能生效到线上接口返回。
使用示例:
# 使用默认 youDao 设置实时+历史两项
python set_default_translate_route.py
# 指定路由名称(需与 translation_service.service_type 一致,如 youDao、deepl、tengXun 等)
python set_default_translate_route.py --route youDao
# 仅设置实时或历史
python set_default_translate_route.py --only realtime --route youDao
python set_default_translate_route.py --only history --route youDao
"""
from __future__ import annotations
import os
import argparse
# 1) 配置 Django 环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
import django # noqa: E402
django.setup()
from application import dispatch # noqa: E402
from dvadmin.system.models import SystemConfig # noqa: E402
def ensure_base_parent() -> SystemConfig:
base = SystemConfig.objects.filter(parent__isnull=True, key='base').first()
if not base:
base = SystemConfig.objects.create(key='base', title='基础配置')
return base
def set_defaults(route: str, only: str | None = None) -> dict:
"""写入默认路由配置。
:param route: 目标路由名(需与 translation_service.service_type 保持一致)
:param only: None/"realtime"/"history"
:return: {'before': {'realtime': X, 'history': Y}, 'after': {...}}
"""
base = ensure_base_parent()
# 读取当前值
before_rt = dispatch.get_system_config_values('base.realtime_route')
before_hi = dispatch.get_system_config_values('base.history_route')
keys = []
if only is None:
keys = ['realtime_route', 'history_route']
elif only == 'realtime':
keys = ['realtime_route']
elif only == 'history':
keys = ['history_route']
else:
raise ValueError('--only 仅支持 realtime/history')
changed = False
for key in keys:
child = SystemConfig.objects.filter(parent=base, key=key).first()
if not child:
SystemConfig.objects.create(parent=base, key=key, title=key, value=route)
changed = True
elif child.value != route:
child.value = route
child.save()
changed = True
if changed:
# 刷新系统配置缓存(仅当前脚本进程内);线上服务进程仍需重启
dispatch.refresh_system_config()
after_rt = dispatch.get_system_config_values('base.realtime_route')
after_hi = dispatch.get_system_config_values('base.history_route')
return {
'before': {'realtime': before_rt, 'history': before_hi},
'after': {'realtime': after_rt, 'history': after_hi},
'changed': changed,
}
def main():
parser = argparse.ArgumentParser(description='设置系统默认翻译线路')
parser.add_argument('--route', default='youDao', help='要设置的默认路由名(默认 youDao')
parser.add_argument('--only', choices=['realtime', 'history'], help='仅设置某一项(默认两项都设置)')
args = parser.parse_args()
result = set_defaults(route=args.route, only=args.only)
print('=== 设置完成 ===')
print(f"目标路由: {args.route}")
if args.only:
print(f"作用范围: 仅 {args.only}")
else:
print("作用范围: 实时 + 历史")
print('--- 变更前 ---')
print(f" realtime: {result['before']['realtime']}")
print(f" history : {result['before']['history']}")
print('--- 变更后 ---')
print(f" realtime: {result['after']['realtime']}")
print(f" history : {result['after']['history']}")
print(f"是否有变更: {result['changed']}")
print('\n提示: 若后端服务进程正在运行,请重启服务使接口返回的新默认值生效。')
if __name__ == '__main__':
main()

View File

@ -0,0 +1,196 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
线上数据库默认翻译线路设置脚本
用于设置系统配置中的默认翻译线路为 youDao
使用方法:
1. 在 Django 项目的 backend 目录下执行
2. python set_default_translate_routes.py
3. 或在虚拟环境中:.\.venv\Scripts\python.exe set_default_translate_routes.py
功能:
- 自动创建或更新 base.realtime_route = youDao
- 自动创建或更新 base.history_route = youDao
- 刷新系统配置缓存
- 验证设置结果
"""
import os
import sys
import django
# 设置 Django 环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
django.setup()
from dvadmin.system.models import SystemConfig
from application import dispatch
def ensure_base_parent():
"""确保基础配置父级存在"""
base = SystemConfig.objects.filter(parent__isnull=True, key='base').first()
if not base:
base = SystemConfig.objects.create(
key='base',
title='基础配置',
value=None,
sort=0,
status=True
)
print(f"✅ 创建基础配置父级: {base.title}")
else:
print(f"✅ 基础配置父级已存在: {base.title}")
return base
def set_translate_route_config(route_key, route_value, route_title):
"""设置单个翻译线路配置"""
base = ensure_base_parent()
# 查找现有配置
config = SystemConfig.objects.filter(parent=base, key=route_key).first()
if not config:
# 创建新配置
config = SystemConfig.objects.create(
parent=base,
key=route_key,
title=route_title,
value=route_value,
sort=1,
status=True,
form_item_type=0, # text 类型
placeholder=f"请输入{route_title}"
)
print(f"✅ 创建配置: {route_key} = {route_value}")
return True
else:
# 更新现有配置
if config.value != route_value:
old_value = config.value
config.value = route_value
config.save()
print(f"✅ 更新配置: {route_key} = {route_value} (原值: {old_value})")
return True
else:
print(f" 配置已是目标值: {route_key} = {route_value}")
return False
def verify_translate_routes():
"""验证翻译线路配置"""
print("\n=== 验证配置结果 ===")
real_time_route = dispatch.get_system_config_values('base.realtime_route')
history_route = dispatch.get_system_config_values('base.history_route')
print(f"📋 实时翻译默认线路: {real_time_route}")
print(f"📋 历史翻译默认线路: {history_route}")
# 验证是否为期望值
success = True
if real_time_route != 'youDao':
print(f"❌ 实时翻译线路设置失败,期望: youDao实际: {real_time_route}")
success = False
if history_route != 'youDao':
print(f"❌ 历史翻译线路设置失败,期望: youDao实际: {history_route}")
success = False
if success:
print("✅ 所有翻译线路配置验证通过")
return success
def check_youdao_service():
"""检查有道翻译服务是否存在并启用"""
print("\n=== 检查有道翻译服务 ===")
try:
from translate.models import TranslationService
youdao_service = TranslationService.objects.filter(service_type='youDao').first()
if not youdao_service:
print("⚠️ 警告: 数据库中未找到 youDao 翻译服务")
print(" 建议检查 translation_service 表中是否存在 service_type='youDao' 的记录")
return False
if not youdao_service.is_active:
print(f"⚠️ 警告: youDao 翻译服务已禁用")
print(f" 服务ID: {youdao_service.id}")
print(f" 中文名: {youdao_service.zhName}")
print(f" 建议启用该服务: is_active=True")
return False
print(f"✅ youDao 翻译服务正常")
print(f" 服务ID: {youdao_service.id}")
print(f" 中文名: {youdao_service.zhName}")
print(f" 英文名: {youdao_service.enName}")
print(f" 状态: {'启用' if youdao_service.is_active else '禁用'}")
return True
except ImportError:
print("⚠️ 无法导入 translate.models跳过翻译服务检查")
return None
def main():
"""主函数"""
print("🚀 开始设置默认翻译线路配置")
print("=" * 50)
try:
# 设置翻译线路配置
changed = False
# 设置实时翻译默认线路
if set_translate_route_config('realtime_route', 'youDao', '实时翻译默认线路'):
changed = True
# 设置历史翻译默认线路
if set_translate_route_config('history_route', 'youDao', '历史翻译默认线路'):
changed = True
# 如果有变更,刷新系统配置缓存
if changed:
print("\n🔄 刷新系统配置缓存...")
dispatch.refresh_system_config()
print("✅ 系统配置缓存已刷新")
else:
print("\n✅ 无需刷新缓存,配置已是最新")
# 验证配置结果
verify_success = verify_translate_routes()
# 检查有道翻译服务
service_check = check_youdao_service()
print("\n" + "=" * 50)
if verify_success:
print("🎉 默认翻译线路配置设置成功!")
print("\n📝 后续步骤:")
print("1. 重启后端服务,使配置生效")
print("2. 访问 /api/get_default_translate_route_config 验证接口返回")
print("3. 清理客户端本地配置 (liangzi_data/session.db)")
print("4. 重启客户端应用验证默认线路")
if service_check is False:
print("\n⚠️ 注意: 请确保 youDao 翻译服务已正确配置并启用")
else:
print("❌ 配置设置失败,请检查错误信息")
sys.exit(1)
except Exception as e:
print(f"❌ 执行过程中发生错误: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == '__main__':
main()

View File

@ -0,0 +1,47 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
将系统默认翻译线路设置为 youDao实时与历史用于 Electron 首次初始化时作为默认值
"""
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
django.setup()
from dvadmin.system.models import SystemConfig
from application import dispatch
def ensure_base_parent():
base = SystemConfig.objects.filter(parent__isnull=True, key='base').first()
if not base:
base = SystemConfig.objects.create(key='base', title='基础配置')
return base
def set_default_routes(value='youDao'):
base = ensure_base_parent()
changed = False
for key in ['realtime_route', 'history_route']:
child = SystemConfig.objects.filter(parent=base, key=key).first()
if not child:
SystemConfig.objects.create(parent=base, key=key, title=key, value=value)
changed = True
else:
if child.value != value:
child.value = value
child.save()
changed = True
if changed:
dispatch.refresh_system_config()
return (
dispatch.get_system_config_values('base.realtime_route'),
dispatch.get_system_config_values('base.history_route'),
)
if __name__ == '__main__':
real, hist = set_default_routes('youDao')
print('OK set defaults: ', real, hist)

View File

@ -9,23 +9,32 @@ from .aggregate_translate import aggregate_translate
def get_translate_text(source_lang,target_lang,translation_service,text,k_1,k_2):
print("service:",translation_service)
print(f"{translation_service}")
translate_text = ""
# 判断翻译服务
if translation_service == "baidu":
translate_text = baidu_translate(text=text,target_lang=target_lang,app_id=k_1,app_key=k_2 )
# translate_text = baidu_translate(text=text,target_lang=target_lang,app_id=k_1,app_key=k_2 )
translate_text=aggregate_translate(text=text,source_lang=source_lang, target_lang=target_lang,platform="baidu_trans", api_key=k_1)
elif translation_service == "xiaoNiu":
translate_text = xiaoniu_translate(text=text, target_lang=target_lang, app_id=k_1,app_key=k_2)
elif translation_service == "huoShan":
translate_text = huoshan_translate(text=text, target_lang=target_lang, app_id=k_1,app_key=k_2)
# translate_text = huoshan_translate(text=text, target_lang=target_lang, app_id=k_1,app_key=k_2)
translate_text=aggregate_translate(text=text,source_lang=source_lang, target_lang=target_lang,platform="huoshan_trans", api_key=k_1)
elif translation_service == "youDao":
translate_text = youdao_translate(text=text, target_lang=target_lang, app_id=k_1, app_key=k_2)
# translate_text = youdao_translate(text=text, target_lang=target_lang, app_id=k_1, app_key=k_2)
translate_text=aggregate_translate(text=text,source_lang=source_lang, target_lang=target_lang,platform="youdao_trans", api_key=k_1)
elif translation_service == "tengXun":
translate_text = tencent_translate(text=text, target_lang=target_lang, app_id=k_1, app_key=k_2)
elif translation_service == "deepl":
translate_text = aggregate_translate(text=text,source_lang=source_lang, target_lang=target_lang,platform=translation_service, api_key=k_1)
elif translation_service=="deepseek":
translate_text = aggregate_translate(text=text, source_lang=source_lang, target_lang=target_lang,platform=translation_service, api_key=k_1)
elif translation_service=="google":
translate_text = aggregate_translate(text=text, source_lang=source_lang, target_lang=target_lang,platform="google_trans", api_key=k_1)
elif translation_service=="bing":
translate_text = aggregate_translate(text=text, source_lang=source_lang, target_lang=target_lang,platform="bing_trans", api_key=k_1)
elif translation_service=="chatGpt4o":
translate_text = aggregate_translate(text=text, source_lang=source_lang, target_lang=target_lang,platform="chatgpt-4o_trans", api_key=k_1)
# 调用
print(translate_text)
return translate_text