Kamixitong/start.py
2025-11-22 16:48:45 +08:00

195 lines
5.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
KaMiXiTong 启动脚本
快速启动开发服务器
"""
import os
import sys
import subprocess
import threading
import time
from pathlib import Path
def check_python_version():
"""检查Python版本"""
if sys.version_info < (3, 6):
print("❌ 错误: 需要Python 3.6或更高版本")
print(f"当前版本: {sys.version}")
sys.exit(1)
print(f"✅ Python版本检查通过: {sys.version}")
def install_dependencies():
"""安装依赖"""
print("📦 正在安装依赖包...")
try:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
# 检查并安装FastAPI依赖
if os.path.exists('requirements-fastapi.txt'):
try:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements-fastapi.txt'])
print("✅ FastAPI依赖安装完成")
except subprocess.CalledProcessError:
print("⚠️ FastAPI依赖安装失败将跳过FastAPI服务")
print("✅ 依赖安装完成")
except subprocess.CalledProcessError:
print("❌ 依赖安装失败")
sys.exit(1)
def check_env_file():
"""检查环境配置文件"""
env_file = Path('.env')
if not env_file.exists():
print("⚠️ 未找到 .env 文件,正在创建默认配置...")
try:
with open('.env.example', 'r', encoding='utf-8') as src:
with open('.env', 'w', encoding='utf-8') as dst:
dst.write(src.read())
print("✅ 已创建默认 .env 文件")
except FileNotFoundError:
print("❌ 未找到 .env.example 文件")
else:
print("✅ 环境配置文件已存在")
def init_database():
"""初始化数据库"""
print("🗄️ 正在初始化数据库...")
try:
from app import create_app, db
from app.models.admin import Admin
app = create_app('development')
with app.app_context():
# 创建数据表
db.create_all()
# 创建默认管理员
admin = Admin.query.filter_by(username='admin').first()
if not admin:
admin = Admin(
username='admin',
email='admin@example.com',
role=1 # 超级管理员
)
admin.set_password('admin123')
db.session.add(admin)
db.session.commit()
print("✅ 默认管理员账号创建成功: admin/admin123")
else:
print("✅ 数据库已初始化")
except Exception as e:
print(f"❌ 数据库初始化失败: {e}")
sys.exit(1)
def create_directories():
"""创建必要的目录"""
directories = [
'logs',
'static/uploads',
'static/css',
'static/js'
]
for directory in directories:
Path(directory).mkdir(parents=True, exist_ok=True)
print("✅ 目录结构创建完成")
def start_flask_app():
"""启动Flask应用"""
try:
from run import app
print("🚀 正在启动Flask应用...")
app.run(
host=os.environ.get('HOST', '0.0.0.0'),
port=int(os.environ.get('PORT', 5088)),
debug=True,
use_reloader=False # 禁用重载器以避免子进程问题
)
except Exception as e:
print(f"❌ Flask应用启动失败: {e}")
def start_fastapi_app():
"""启动FastAPI应用"""
try:
# 检查FastAPI应用文件是否存在
if not os.path.exists('fastapi_app.py'):
print("⚠️ FastAPI应用文件不存在跳过FastAPI服务启动")
return
print("🚀 正在启动FastAPI应用...")
# 使用uvicorn启动FastAPI应用
fastapi_host = os.environ.get('FASTAPI_HOST', '127.0.0.1')
fastapi_port = os.environ.get('FASTAPI_PORT', '9002')
subprocess.run([
sys.executable, '-m', 'uvicorn',
'fastapi_app:app',
'--host', fastapi_host,
'--port', fastapi_port
])
except Exception as e:
print(f"❌ FastAPI应用启动失败: {e}")
def main():
"""主函数"""
print("=" * 50)
print(" KaMiXiTong 软件授权管理系统")
print(" 启动脚本 v1.0")
print("=" * 50)
# 检查Python版本
check_python_version()
# 创建目录
create_directories()
# 检查环境配置
check_env_file()
# 安装依赖
if not os.environ.get('SKIP_INSTALL'):
install_dependencies()
else:
print("⏭️ 跳过依赖安装")
# 初始化数据库
init_database()
print("\n" + "=" * 50)
print("🚀 启动开发服务器...")
print("=" * 50)
host = os.environ.get('HOST', '127.0.0.1')
port = os.environ.get('PORT', '5088')
fastapi_port = os.environ.get('FASTAPI_PORT', '9002')
print(f"📍 Flask访问地址: http://{host}:{port}")
print(f"📍 FastAPI访问地址: http://{host}:{fastapi_port}")
print(f"📍 FastAPI文档: http://{host}:{fastapi_port}/docs")
print("👤 管理员账号: admin")
print("🔑 管理员密码: admin123")
print("⏹️ 按 Ctrl+C 停止服务器")
print("=" * 50 + "\n")
# 启动Flask和FastAPI应用
try:
# 在单独的线程中启动Flask应用
flask_thread = threading.Thread(target=start_flask_app)
flask_thread.daemon = True
flask_thread.start()
# 等待Flask启动
time.sleep(2)
# 在主线程中启动FastAPI应用
start_fastapi_app()
except KeyboardInterrupt:
print("\n👋 服务器已停止")
except Exception as e:
print(f"❌ 启动失败: {e}")
sys.exit(1)
if __name__ == '__main__':
main()