#!/usr/bin/env python """ 首次部署初始化脚本 该脚本用于首次部署系统时执行所有必要的初始化操作,包括: 1. 检查数据库连接 2. 执行数据库迁移 3. 创建管理员用户 4. 创建默认用户组 5. 收集静态文件 使用方法: python add_status_field.py --init 或者使用 Django 标准命令: python manage.py makemigrations python manage.py migrate python manage.py createsuperuser """ import os import sys import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') django.setup() from django.core.management import call_command from django.contrib.auth import get_user_model from django.contrib.auth.models import Group def check_database_connection(): """ 检查数据库连接 """ print("=" * 60) print("检查数据库连接...") print("=" * 60) try: from django.db import connection with connection.cursor() as cursor: cursor.execute("SELECT 1") print("✓ 数据库连接正常") return True except Exception as e: print(f"✗ 数据库连接失败: {e}") print("\n请检查 conf/env.py 中的数据库配置") return False def run_migrations(): """ 执行数据库迁移 """ print("\n" + "=" * 60) print("执行数据库迁移...") print("=" * 60) try: print("\n[1/2] 生成迁移文件...") call_command('makemigrations', verbosity=1) print("✓ 迁移文件生成成功") print("\n[2/2] 应用迁移...") call_command('migrate', verbosity=1) print("✓ 数据库迁移成功") return True except Exception as e: print(f"✗ 数据库迁移失败: {e}") import traceback traceback.print_exc() return False def create_admin_user(username='admin', password='admin123', email='admin@example.com', name='系统管理员'): """ 创建管理员用户 """ print("\n" + "=" * 60) print("创建管理员用户...") print("=" * 60) User = get_user_model() try: user = User.objects.get(username=username) print(f"管理员用户 '{username}' 已存在,跳过创建") print(f" 用户名: {user.username}") print(f" 姓名: {user.name}") print(f" 邮箱: {user.email}") return True except User.DoesNotExist: try: user = User.objects.create_superuser( username=username, email=email, password=password ) user.name = name user.phone = None user.show_hosts = False user.status = 'approved' user.save() print("✓ 管理员用户创建成功") print(f" 用户名: {username}") print(f" 密码: {password}") print(f" 邮箱: {email}") print(f" 姓名: {name}") print("\n⚠️ 重要提示: 请在首次登录后修改默认密码!") return True except Exception as e: print(f"✗ 创建管理员用户失败: {e}") import traceback traceback.print_exc() return False def create_default_groups(): """ 创建默认用户组 """ print("\n" + "=" * 60) print("创建默认用户组...") print("=" * 60) groups = [ {'name': '管理员组', 'description': '拥有所有权限的管理员组'}, {'name': '开发人员组', 'description': '开发人员组'}, {'name': '测试人员组', 'description': '测试人员组'}, {'name': '只读用户组', 'description': '只读用户组'}, ] created_count = 0 for group_info in groups: try: Group.objects.get(name=group_info['name']) print(f" 用户组 '{group_info['name']}' 已存在") except Group.DoesNotExist: try: Group.objects.create(name=group_info['name']) print(f" ✓ 创建用户组: {group_info['name']}") created_count += 1 except Exception as e: print(f" ✗ 创建用户组 '{group_info['name']}' 失败: {e}") print(f"\n✓ 成功创建 {created_count} 个用户组") return True def collect_static_files(): """ 收集静态文件 """ print("\n" + "=" * 60) print("收集静态文件...") print("=" * 60) try: call_command('collectstatic', '--noinput', verbosity=1) print("✓ 静态文件收集成功") return True except Exception as e: print(f"✗ 静态文件收集失败: {e}") import traceback traceback.print_exc() return False def display_summary(): """ 显示部署摘要 """ print("\n" + "=" * 60) print("部署摘要") print("=" * 60) User = get_user_model() print(f"\n用户数量: {User.objects.count()}") print(f"用户组数量: {Group.objects.count()}") print("\n默认管理员账号:") print(" 用户名: admin") print(" 密码: admin123") print("\n⚠️ 请在首次登录后立即修改默认密码!") def main(): """ 主函数 """ import argparse parser = argparse.ArgumentParser(description='首次部署初始化脚本') parser.add_argument('--init', action='store_true', help='执行完整的初始化流程') parser.add_argument('--migrate', action='store_true', help='仅执行数据库迁移') parser.add_argument('--create-admin', action='store_true', help='仅创建管理员用户') parser.add_argument('--create-groups', action='store_true', help='仅创建用户组') parser.add_argument('--collect-static', action='store_true', help='仅收集静态文件') args = parser.parse_args() if args.init: print("\n") print("╔" + "=" * 58 + "╗") print("║" + " " * 10 + "接口自动化平台 - 首次部署初始化" + " " * 13 + "║") print("╚" + "=" * 58 + "╝") print() steps = [ ("检查数据库连接", check_database_connection), ("执行数据库迁移", run_migrations), ("创建管理员用户", create_admin_user), ("创建默认用户组", create_default_groups), ("收集静态文件", collect_static_files), ] failed_steps = [] for step_name, step_func in steps: if not step_func(): failed_steps.append(step_name) print(f"\n✗ '{step_name}' 失败,终止部署") break if not failed_steps: display_summary() print("\n" + "=" * 60) print("✓ 部署初始化完成!") print("=" * 60) print("\n系统已准备就绪,可以启动服务:") print(" python manage.py runserver") print() return 0 else: print("\n" + "=" * 60) print("✗ 部署初始化失败!") print("=" * 60) print(f"\n失败的步骤: {', '.join(failed_steps)}") return 1 elif args.migrate: return 0 if run_migrations() else 1 elif args.create_admin: return 0 if create_admin_user() else 1 elif args.create_groups: return 0 if create_default_groups() else 1 elif args.collect_static: return 0 if collect_static_files() else 1 else: parser.print_help() print("\n使用示例:") print(" python add_status_field.py --init # 完整初始化") print(" python add_status_field.py --migrate # 仅迁移数据库") print(" python add_status_field.py --create-admin # 仅创建管理员") print("\n或使用 Django 标准命令:") print(" python manage.py makemigrations") print(" python manage.py migrate") print(" python manage.py createsuperuser") return 0 if __name__ == '__main__': sys.exit(main())