This commit is contained in:
root 2025-07-13 11:48:32 +08:00
parent d9e0e2e791
commit 146626dd9a
4 changed files with 285 additions and 1 deletions

View File

@ -13,6 +13,7 @@ from python_core.cli.commands.template import template_app
from python_core.cli.commands.resource_category import resource_category_app
from python_core.cli.commands.auth import auth_app
from python_core.cli.commands.model import model_app
from python_core.cli.commands.system import system_app
app = typer.Typer(
name="mixvideo",
@ -37,6 +38,7 @@ app.add_typer(template_app, name="template")
app.add_typer(resource_category_app, name="resource-category")
app.add_typer(auth_app, name="auth")
app.add_typer(model_app, name="model")
app.add_typer(system_app, name="system")
@app.command()
def init():

View File

@ -0,0 +1,274 @@
"""
系统管理 CLI 命令
"""
import json
import uuid
from pathlib import Path
from typing import Optional
import typer
from python_core.utils.jsonrpc_enhanced import create_response_handler
from python_core.database.user_postgres import user_table
from python_core.database.resource_category_postgres import resource_category_table
from python_core.config import settings
from python_core.utils.logger import setup_logger
logger = setup_logger(__name__)
# 创建系统应用
system_app = typer.Typer(help="系统管理命令")
@system_app.command("init")
def init_system(
force: bool = typer.Option(False, "--force", help="强制重新初始化"),
verbose: bool = typer.Option(False, "--verbose", "-v", help="详细输出"),
json_output: bool = typer.Option(True, "--json", help="JSON格式输出")
):
"""初始化系统,创建默认数据"""
response = create_response_handler()
try:
# 检查是否已经初始化
session_file = Path("session.json")
if session_file.exists() and not force:
with open(session_file, 'r', encoding='utf-8') as f:
session_data = json.load(f)
response.success({
'already_initialized': True,
'session_data': session_data,
'message': '系统已经初始化,使用 --force 强制重新初始化'
})
return
# 创建默认用户
default_user_id = str(uuid.uuid4())
default_access_token = str(uuid.uuid4())
# 创建 session.json
session_data = {
'user_id': default_user_id,
'access_token': default_access_token,
'username': 'default',
'email': 'default@mixvideo.com',
'initialized_at': '2025-07-13T11:43:00.000000',
'app_version': settings.app_version
}
with open(session_file, 'w', encoding='utf-8') as f:
json.dump(session_data, f, indent=2, ensure_ascii=False)
# 创建默认资源分类
default_categories = [
{
'title': '开场介绍',
'ai_prompt': '视频开头的介绍部分包括标题、logo等',
'color': '#FF6B6B'
},
{
'title': '主要内容',
'ai_prompt': '视频的核心内容部分',
'color': '#4ECDC4'
},
{
'title': '转场过渡',
'ai_prompt': '视频片段之间的过渡效果',
'color': '#45B7D1'
},
{
'title': '结尾总结',
'ai_prompt': '视频结尾的总结和结束语',
'color': '#96CEB4'
},
{
'title': '背景音乐',
'ai_prompt': '视频的背景音乐和音效',
'color': '#FFEAA7'
},
{
'title': '字幕文本',
'ai_prompt': '视频中的字幕和文字说明',
'color': '#DDA0DD'
},
{
'title': '特效动画',
'ai_prompt': '视频中的特效和动画效果',
'color': '#98D8C8'
},
{
'title': '产品展示',
'ai_prompt': '产品或服务的展示片段',
'color': '#F7DC6F'
}
]
created_categories = []
for category_data in default_categories:
try:
from python_core.database.types import ResourceCategory
category = ResourceCategory(
id="", # 将由数据库生成
title=category_data['title'],
ai_prompt=category_data['ai_prompt'],
color=category_data['color'],
is_active=True,
is_cloud=False,
user_id='default',
created_at="",
updated_at=""
)
category_id = resource_category_table.create_category(category)
if category_id:
created_categories.append(category_data['title'])
logger.info(f"Created default category: {category_data['title']}")
except Exception as e:
logger.warning(f"Failed to create category {category_data['title']}: {e}")
# 创建必要的目录
directories = [
'templates',
'projects',
'uploads',
'temp',
'logs'
]
created_dirs = []
for dir_name in directories:
dir_path = Path(dir_name)
if not dir_path.exists():
dir_path.mkdir(parents=True, exist_ok=True)
created_dirs.append(str(dir_path))
logger.info(f"Created directory: {dir_path}")
response.success({
'initialized': True,
'session_file': str(session_file),
'session_data': session_data,
'created_categories': created_categories,
'created_directories': created_dirs,
'message': f'系统初始化成功,创建了 {len(created_categories)} 个默认分类和 {len(created_dirs)} 个目录'
})
except Exception as e:
logger.error(f"系统初始化失败: {e}")
response.error(-32603, f"系统初始化失败: {str(e)}")
@system_app.command("status")
def system_status(
verbose: bool = typer.Option(False, "--verbose", "-v", help="详细输出"),
json_output: bool = typer.Option(True, "--json", help="JSON格式输出")
):
"""检查系统状态"""
response = create_response_handler()
try:
# 检查数据库连接
db_status = "connected"
try:
# 测试各个表的连接
user_count = user_table.get_user_count()
category_count = resource_category_table.get_category_count()
except Exception as e:
db_status = f"error: {str(e)}"
user_count = 0
category_count = 0
# 检查 session.json
session_file = Path("session.json")
session_status = "exists" if session_file.exists() else "missing"
session_data = None
if session_file.exists():
try:
with open(session_file, 'r', encoding='utf-8') as f:
session_data = json.load(f)
except Exception as e:
session_status = f"error: {str(e)}"
# 检查目录
directories = ['templates', 'projects', 'uploads', 'temp', 'logs']
dir_status = {}
for dir_name in directories:
dir_path = Path(dir_name)
dir_status[dir_name] = {
'exists': dir_path.exists(),
'is_dir': dir_path.is_dir() if dir_path.exists() else False,
'path': str(dir_path.absolute())
}
response.success({
'database': {
'status': db_status,
'user_count': user_count,
'category_count': category_count
},
'session': {
'status': session_status,
'data': session_data
},
'directories': dir_status,
'app_version': settings.app_version,
'message': f'系统状态检查完成 - 数据库: {db_status}, 会话: {session_status}'
})
except Exception as e:
logger.error(f"系统状态检查失败: {e}")
response.error(-32603, f"系统状态检查失败: {str(e)}")
@system_app.command("reset")
def reset_system(
confirm: bool = typer.Option(False, "--confirm", help="确认重置系统"),
keep_users: bool = typer.Option(True, "--keep-users", help="保留用户数据"),
verbose: bool = typer.Option(False, "--verbose", "-v", help="详细输出"),
json_output: bool = typer.Option(True, "--json", help="JSON格式输出")
):
"""重置系统(危险操作)"""
response = create_response_handler()
if not confirm:
response.error(-32602, "请使用 --confirm 参数确认重置操作")
return
try:
reset_actions = []
# 删除 session.json
session_file = Path("session.json")
if session_file.exists():
session_file.unlink()
reset_actions.append("删除 session.json")
# 清理分类数据
try:
categories = resource_category_table.get_all_resource_categories()
for category in categories:
resource_category_table.delete_resource_category(category.id, hard_delete=True)
reset_actions.append(f"删除 {len(categories)} 个分类")
except Exception as e:
logger.warning(f"清理分类数据失败: {e}")
# 可选:清理用户数据
if not keep_users:
try:
# 这里可以添加清理用户数据的逻辑
reset_actions.append("清理用户数据")
except Exception as e:
logger.warning(f"清理用户数据失败: {e}")
response.success({
'reset': True,
'actions': reset_actions,
'keep_users': keep_users,
'message': f'系统重置完成,执行了 {len(reset_actions)} 个操作'
})
except Exception as e:
logger.error(f"系统重置失败: {e}")
response.error(-32603, f"系统重置失败: {str(e)}")
if __name__ == "__main__":
system_app()

View File

@ -18,7 +18,7 @@ except ImportError:
project_root = Path(__file__).parent.parent
class Settings(BaseSettings):
"""Application settings with environment variable support."""
db: str = "postgres://mixvideo_user:mixvideo_password@192.168.0.126:5433/mixvideo"
db: str = "postgres://mixvideo_user:mixvideo_password@localhost:5432/mixvideo"
# Application Info
app_name: str = "MixVideo V2"
app_version: str = "2.0.0"

8
session.json Normal file
View File

@ -0,0 +1,8 @@
{
"user_id": "dd07e880-084c-45d4-a4e4-0b0d985061e3",
"access_token": "53253960-dc11-42b7-b7aa-3d01b1e496b3",
"username": "default",
"email": "default@mixvideo.com",
"initialized_at": "2025-07-13T11:43:00.000000",
"app_version": "2.0.0"
}