Skip to content

Latest commit

 

History

History
291 lines (224 loc) · 7.68 KB

File metadata and controls

291 lines (224 loc) · 7.68 KB

代码重构总结

重构概述

本次重构主要解决了backend/core/init_app.py和backend/core/database.py中的代码重复问题,并统一使用backend/conf/constants.py中定义的路径变量,提高了代码的可维护性和一致性。

重构目标

1. 消除代码重复

  • 合并init_app.py和database.py中重复的数据库初始化代码
  • 统一数据库初始化逻辑到database.py中

2. 统一路径管理

  • 使用backend/conf/constants.py中定义的backend_path变量
  • 避免硬编码路径,提高代码可维护性

3. 改进代码结构

  • 明确各模块的职责分工
  • 提高代码的可读性和可维护性

重构内容

🔧 1. database.py 重构

路径变量统一

# 重构前
DATABASE_URL = settings.get("DATABASE_URL", "sqlite://./data/aitestlab.db")

# 重构后
from backend.conf.constants import backend_path

data_dir = backend_path / "data"
db_file = data_dir / "aitestlab.db"
DATABASE_URL = settings.get("DATABASE_URL", f"sqlite://{db_file}")

功能合并

# 新增:从init_app.py迁移的init_data函数
async def init_data():
    """初始化应用数据 - 从init_app.py迁移过来"""
    logger.info("开始初始化应用数据...")

    try:
        # 初始化数据库
        logger.debug("初始化数据库连接...")
        await init_db()

        # 预热缓存
        logger.debug("预热应用缓存...")
        # 这里可以添加缓存预热逻辑

        # 检查外部服务连接
        logger.debug("检查外部服务连接...")
        # 这里可以添加外部服务检查逻辑

        logger.success("🚀 应用数据初始化完成")
    except Exception as e:
        logger.error(f"应用数据初始化失败: {e}")
        raise

路径处理优化

# 重构前
db_dir = os.path.dirname(DATABASE_URL.replace("sqlite://", ""))
if db_dir and not os.path.exists(db_dir):
    os.makedirs(db_dir, exist_ok=True)

# 重构后
logger.info(f"数据目录: {data_dir}")
if not data_dir.exists():
    data_dir.mkdir(parents=True, exist_ok=True)
    logger.info(f"创建数据目录: {data_dir}")

🔄 2. init_app.py 简化

移除重复代码

# 重构前
async def init_data():
    """Initialize application data"""
    logger.info("开始初始化应用数据...")

    try:
        # 初始化数据库
        logger.debug("初始化数据库连接...")
        from backend.api_core.database import init_db
        await init_db()

        # 示例:预热缓存
        logger.debug("预热应用缓存...")

        # 示例:检查外部服务连接
        logger.debug("检查外部服务连接...")

        logger.success("🚀 应用数据初始化完成")
    except Exception as e:
        logger.error(f"应用数据初始化失败: {e}")
        raise


# 重构后
async def init_data():
    """Initialize application data"""
    logger.info("开始初始化应用数据...")

    try:
        # 使用database.py中的统一初始化函数
        from backend.api_core.database import init_data as db_init_data
        await db_init_data()

        logger.success("🚀 应用数据初始化完成")
    except Exception as e:
        logger.error(f"应用数据初始化失败: {e}")
        raise

📝 3. init_db.py 脚本优化

简化脚本逻辑

# 重构前:包含完整的数据库初始化逻辑
async def init_database():
    """初始化数据库"""
    try:
        # 确保数据目录存在
        db_dir = os.path.dirname(DATABASE_URL.replace("sqlite://", ""))
        # ... 大量重复代码


# 重构后:使用database.py中的统一函数
async def init_database():
    """初始化数据库 - 使用database.py中的统一函数"""
    close_db = None
    try:
        from backend.api_core.database import init_data, close_db

        logger.info("开始初始化数据库...")
        await init_data()
        logger.success("数据库初始化完成")

    except Exception as e:
        logger.error(f"数据库初始化失败: {e}")
        raise
    finally:
        if close_db:
            await close_db()

路径导入修复

# 重构前
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

# 重构后
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_root)

重构效果

✅ 代码重复消除

  • 重复代码减少: 移除了init_app.py中重复的数据库初始化逻辑
  • 统一入口: 所有数据库相关操作统一在database.py中管理
  • 维护简化: 数据库逻辑修改只需在一个地方进行

✅ 路径管理统一

  • 常量使用: 统一使用backend/conf/constants.py中的backend_path
  • 路径一致: 避免了硬编码路径带来的维护问题
  • 可移植性: 提高了代码的可移植性和环境适应性

✅ 代码结构优化

  • 职责清晰: database.py专注数据库相关功能
  • 模块化: 各模块职责分工明确
  • 可读性: 代码结构更加清晰易懂

文件变更清单

修改的文件

backend/core/database.py        # 主要重构文件
├── 添加路径变量使用
├── 合并init_data函数
├── 优化路径处理逻辑
└── 改进日志输出

backend/core/init_app.py        # 简化文件
├── 移除重复的数据库初始化代码
├── 使用database.py中的统一函数
└── 保持原有接口不变

backend/init_db.py              # 脚本优化
├── 修复模块导入路径
├── 使用统一的初始化函数
└── 简化脚本逻辑

依赖关系

init_app.py
    ↓ 调用
database.py::init_data()
    ↓ 调用
database.py::init_db()
    ↓ 调用
database.py::create_default_user()

init_db.py
    ↓ 直接调用
database.py::init_data()

配置变更

路径配置

# constants.py中的路径定义
backend_path = Path(__file__).parent.parent

# database.py中的使用
data_dir = backend_path / "data"
db_file = data_dir / "aitestlab.db"
DATABASE_URL = settings.get("DATABASE_URL", f"sqlite://{db_file}")

数据库配置

# settings.yaml中保持不变,作为默认值
DATABASE_URL: "sqlite://./data/aitestlab.db"

测试验证

功能测试

  • ✅ 数据库初始化正常
  • ✅ 默认用户创建成功
  • ✅ 应用启动正常
  • ✅ 路径解析正确

兼容性测试

  • ✅ 原有API接口不变
  • ✅ 配置文件兼容
  • ✅ 启动流程不变
  • ✅ 数据库结构不变

最佳实践

1. 代码重构原则

  • 单一职责: 每个模块专注自己的职责
  • DRY原则: 避免重复代码
  • 配置统一: 使用统一的配置管理

2. 路径管理

  • 常量定义: 在constants.py中定义路径常量
  • 相对路径: 使用相对路径提高可移植性
  • 路径验证: 在使用前验证路径存在性

3. 错误处理

  • 异常捕获: 完善的异常处理机制
  • 日志记录: 详细的操作日志
  • 优雅降级: 失败时的优雅处理

后续优化建议

1. 进一步模块化

  • 考虑将用户创建逻辑独立成单独的服务
  • 数据库迁移逻辑可以进一步抽象

2. 配置管理优化

  • 考虑使用环境变量覆盖默认配置
  • 添加配置验证机制

3. 测试覆盖

  • 添加单元测试覆盖重构的代码
  • 集成测试验证整体功能

总结

本次重构成功实现了:

🎯 代码质量提升: 消除重复代码,提高可维护性 🔧 架构优化: 明确模块职责,改善代码结构 📁 路径管理: 统一路径变量使用,提高一致性 🚀 功能保持: 保持原有功能不变,确保兼容性

重构后的代码更加清晰、可维护,为后续功能开发奠定了良好的基础。