195 lines
5.9 KiB
Python
195 lines
5.9 KiB
Python
#!/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() |