#!/usr/bin/env python3 """ 完整的系统修复脚本 修复数据库结构、前端页面和后端接口的匹配问题 使用方法: python complete_fix.py """ import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from app import create_app, db from app.models import Admin, AuditLog def fix_database_structure(): """修复数据库结构""" print("\n" + "=" * 60) print("1. 修复数据库结构") print("=" * 60) app = create_app() with app.app_context(): try: # 检查并修复admin表 print("\n📋 检查admin表结构...") admin_columns = [c.name for c in Admin.__table__.columns] print(f" 当前字段: {', '.join(admin_columns)}") # 检查is_deleted字段 if 'is_deleted' not in admin_columns: print(" ⚠️ 缺少 is_deleted 字段,正在添加...") db.session.execute("ALTER TABLE admin ADD COLUMN is_deleted INT NOT NULL DEFAULT 0") db.session.execute("CREATE INDEX ix_admin_is_deleted ON admin(is_deleted)") print(" ✅ 已添加 is_deleted 字段") else: print(" ✅ is_deleted 字段已存在") # 检查delete_time字段 if 'delete_time' not in admin_columns: print(" ⚠️ 缺少 delete_time 字段,正在添加...") db.session.execute("ALTER TABLE admin ADD COLUMN delete_time DATETIME NULL") print(" ✅ 已添加 delete_time 字段") else: print(" ✅ delete_time 字段已存在") db.session.commit() # 创建audit_log表 print("\n📋 创建audit_log表...") try: # 测试表是否存在 AuditLog.query.count() print(" ✅ audit_log 表已存在") except Exception as e: print(f" ⚠️ audit_log 表不存在,正在创建...") db.session.execute(""" CREATE TABLE audit_log ( log_id INT AUTO_INCREMENT PRIMARY KEY, admin_id INT NOT NULL, action VARCHAR(32) NOT NULL, target_type VARCHAR(32) NOT NULL, target_id INT NULL, details TEXT NULL, ip_address VARCHAR(32) NULL, user_agent VARCHAR(256) NULL, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (admin_id) REFERENCES admin(admin_id) ) """) db.session.execute("CREATE INDEX ix_audit_log_admin_id ON audit_log(admin_id)") db.session.execute("CREATE INDEX ix_audit_log_action ON audit_log(action)") db.session.execute("CREATE INDEX ix_audit_log_create_time ON audit_log(create_time)") db.session.commit() print(" ✅ audit_log 表创建成功") # 验证修复结果 print("\n✅ 数据库结构修复完成!") return True except Exception as e: db.session.rollback() print(f"\n❌ 数据库修复失败: {str(e)}") import traceback traceback.print_exc() return False def check_admin_accounts(): """检查管理员账号""" print("\n" + "=" * 60) print("2. 检查管理员账号") print("=" * 60) app = create_app() with app.app_context(): try: # 查看所有管理员 admins = Admin.query.all() print(f"\n📊 系统中共有 {len(admins)} 个管理员账号:") if len(admins) == 0: print(" ⚠️ 没有管理员账号!") return False for admin in admins: print(f" - ID: {admin.admin_id}, 用户名: {admin.username}, 角色: {admin.role}, 状态: {admin.status}") # 检查是否有超级管理员 super_admins = Admin.query.filter_by(role=1, status=1, is_deleted=0).all() if len(super_admins) == 0: print("\n ⚠️ 没有激活的超级管理员!") return False print(f"\n✅ 共有 {len(super_admins)} 个超级管理员可用") return True except Exception as e: print(f"\n❌ 检查管理员账号失败: {str(e)}") import traceback traceback.print_exc() return False def test_api_endpoints(): """测试API端点""" print("\n" + "=" * 60) print("3. 测试API端点") print("=" * 60) app = create_app() with app.app_context(): try: # 测试导入admin API from app.api.admin import ResponseCode, create_response print("✅ admin API 模块导入成功") # 测试验证函数 from app.api.admin import validate_username, validate_password, validate_email print("✅ 验证函数导入成功") # 测试响应格式 response = create_response(True, data={'test': 'data'}, message='测试', code=ResponseCode.SUCCESS) print("✅ 统一响应格式正常") print("\n✅ API端点测试完成") return True except Exception as e: print(f"\n❌ API测试失败: {str(e)}") import traceback traceback.print_exc() return False def check_templates(): """检查前端模板""" print("\n" + "=" * 60) print("4. 检查前端模板") print("=" * 60) try: # 检查关键模板文件 templates = { 'login.html': 'app/web/templates/login.html', 'admin_list.html': 'app/web/templates/admin/list.html', 'base.html': 'app/web/templates/base.html' } for name, path in templates.items(): if os.path.exists(path): print(f" ✅ {name} 存在") else: print(f" ❌ {name} 不存在: {path}") return False # 检查list.html的内容 with open('app/web/templates/admin/list.html', 'r', encoding='utf-8') as f: content = f.read() if 'function()' in content and 'DOMContentLoaded' in content: print(" ✅ admin list.html JavaScript代码正常") else: print(" ⚠️ admin list.html 可能缺少JavaScript代码") print("\n✅ 前端模板检查完成") return True except Exception as e: print(f"\n❌ 模板检查失败: {str(e)}") import traceback traceback.print_exc() return False def create_test_super_admin(): """创建测试超级管理员(如果需要)""" print("\n" + "=" * 60) print("5. 创建测试超级管理员") print("=" * 60) app = create_app() with app.app_context(): try: # 检查是否已有超级管理员 super_admin = Admin.query.filter_by(role=1, status=1, is_deleted=0).first() if super_admin: print(f" ✅ 已存在超级管理员: {super_admin.username}") return True print(" ⚠️ 没有超级管理员,创建默认账号...") # 创建默认超级管理员 admin = Admin( username='admin', email='admin@example.com', role=1, status=1 ) admin.set_password('admin123456') db.session.add(admin) db.session.commit() print(" ✅ 创建默认超级管理员成功") print(" 📝 用户名: admin") print(" 📝 密码: admin123456") print(" ⚠️ 请登录后立即修改密码!") return True except Exception as e: db.session.rollback() print(f"\n❌ 创建超级管理员失败: {str(e)}") import traceback traceback.print_exc() return False def main(): """主函数""" print("\n" + "=" * 60) print("🚀 KaMiXiTong 系统完整修复工具") print("=" * 60) # 检查config.py if not os.path.exists('config.py'): print("\n❌ 未找到 config.py 文件") print("请确保在项目根目录运行此脚本\n") return 1 success = True # 1. 修复数据库结构 if not fix_database_structure(): success = False # 2. 检查管理员账号 if not check_admin_accounts(): print("\n⚠️ 管理员账号有问题,尝试创建默认账号...") if not create_test_super_admin(): success = False # 3. 测试API端点 if not test_api_endpoints(): success = False # 4. 检查前端模板 if not check_templates(): success = False # 总结 print("\n" + "=" * 60) if success: print("🎉 系统修复完成!") print("=" * 60) print("\n✅ 可以启动应用了:") print(" python run.py") print("\n📖 如有问题请查看:") print(" - REFACTOR_NOTES.md (重构说明)") print(" - DEPLOYMENT_GUIDE.md (部署指南)") return 0 else: print("❌ 系统修复未完成,请查看错误信息") print("=" * 60) return 1 if __name__ == '__main__': sys.exit(main())