Kamixitong/complete_fix.py

291 lines
9.4 KiB
Python
Raw Normal View History

2025-11-11 23:04:01 +08:00
#!/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())