山东大学项目实训(一):项目实训跟踪过程的OpenClaw开放智能体

前言

经过队内的讨论,我和其他组员对于本次项目已经有了初步的认知和理解,并且确定了组内的分工。我们组的项目是项目实训跟踪过程的OpenClaw开放智能体。我们初步的任务是先接收所有同学的项目实训申请书,通过AI给出自动评分

个人任务

我负责的是基础服务搭建,后端框架基础设施与底层服务开发,为整个系统提供数据持久化支持和配置管理能力。

实现功能:

  • FastAPI项目启动与自动配置
  • CORS跨域请求配置
  • SQLAlchemy数据库连接与Session管理
  • 数据库初始化与表创建
  • Pydantic Settings环境配置管理
  • 用户模型定义(学号、密码、电子签名)
  • 会话模型定义(Token管理、过期时间)
  • 申报模型定义(文件、状态、文本内容)
  • 评分结果模型定义(创新性、可行性得分)
  • 登录注册Schema数据校验
  • 用户资料Schema数据校验
  • 申报数据Schema数据校验

工作部分

FastAPI项目入口配置

思路使用FastAPI框架搭建后端服务入口,配置CORS跨域资源共享,注册各个业务路由模块。
FastAPI是现代Python Web框架,性能优秀且自带API文档。CORS中间件解决前后端分离架构下的跨域问题,模块化路由便于维护。

该部分实现的功能:

  1. 初始化FastAPI应用实例
  2. 配置CORS允许跨域请求
  3. 注册健康检查、认证、用户、申报、导出路由

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.api.routes.auth import router as auth_router
from app.api.routes.applications import router as applications_router
from app.api.routes.exports import router as exports_router
from app.api.routes.health import router as health_router
from app.api.routes.users import router as users_router
from app.core.config import get_settings

settings = get_settings()
app = FastAPI(title=settings.app_name)

allow_all_origins = settings.cors_origin_list == ["*"]
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"] if allow_all_origins else settings.cors_origin_list,
    allow_credentials=False if allow_all_origins else True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(health_router, prefix="/api")
app.include_router(auth_router, prefix="/api")
app.include_router(users_router, prefix="/api")
app.include_router(applications_router, prefix="/api")
app.include_router(exports_router, prefix="/api")


@app.get("/")
def root() -> dict[str, str]:
    return {
        "name": settings.app_name,
        "env": settings.app_env,
        "status": "running",
    }

FastAPI启动时会扫描@app.get等装饰器注册路由。CORSMiddleware拦截所有请求,根据配置添加Access-Control-Allow-Origin等响应头。app.include_router()将各个模块的子路由合并到主应用,prefix参数统一添加API前缀。get_settings()单例模式加载环境配置。

环境配置管理

Pydantic Settings是Python标准配置方案,自动类型转换和验证,计算属性简化路径拼接。
因此,使用Pydantic BaseSettings实现环境配置管理,支持从.env 文件加载配置,提供计算属性生成路径

from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict

ENV_FILE_PATH = str((Path(__file__).resolve().parents[2] / ".env"))


class Settings(BaseSettings):
    app_name: str = "EduEval AI Backend"
    app_env: str = "development"
    app_host: str = "0.0.0.0"
    app_port: int = 8001

    database_url: str = "sqlite+pysqlite:///./edueval_ai.sqlite3"

    cors_origins: str = "*"

    storage_root: str = "./storage"
    preview_converter_path: str = "soffice"
    model_provider: str = "openai-compatible"
    model_name: str = "deepseek-chat"
    model_base_url: str | None = None
    model_api_key: str | None = None

    model_config = SettingsConfigDict(
        env_file=ENV_FILE_PATH,
        env_file_encoding="utf-8",
        extra="ignore",
        protected_namespaces=("settings_",),
    )

    @property
    def cors_origin_list(self) -> list[str]:
        return [origin.strip() for origin in self.cors_origins.split(",") if origin.strip()]

    @property
    def backend_root(self) -> Path:
        return Path(__file__).resolve().parents[2]

    @property
    def storage_path(self) -> Path:
        return (self.backend_root / self.storage_root).resolve()

    @property
    def application_storage_path(self) -> Path:
        return self.storage_path / "applications"

    @property
    def export_storage_path(self) -> Path:
        return self.storage_path / "exports"

    @property
    def preview_storage_path(self) -> Path:
        return self.storage_path / "previews"


def get_settings() -> Settings:
    return Settings()

Pydantic BaseSettings自动读取ENV_FILE_PATH指向的.env文件,model_config定义解析规则。cors_origin_list将逗号分隔的字符串拆分为列表。各个storage_path属性使用Path对象拼接路径,resolve()转换为绝对路径。get_settings()返回Settings单例,全局共享配置

该部分代码实现了集中管理应用配置,提供数据库、存储、模型等配置,并且能够自动解析.env文件

实现的功能:
应用名称/环境/端口配置

  1. 数据库URL配置(SQLite)
  2. CORS配置解析
  3. 存储路径配置(应用文件/导出/预览)
  4. AI模型配置(支持OpenAI兼容接口)

数据库连接配置

SQLAlchemy是Python主流ORM框架,SessionLocal工厂确保每个请求独立的数据库连接,get_db依赖注入是FastAPI标准用法

reate_engine()创建数据库引擎,pool_pre_ping=True在获取连接前测试连接有效性。Sessionmaker创建会话工厂,autoflush=False禁用自动刷新,autocommit=False手动控制事务。get_db是FastAPI依赖注入函数,通过yield将Session传递给路由函数,finally确保关闭连接释放资源

rom sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, sessionmaker

from app.core.config import get_settings

settings = get_settings()
engine = create_engine(settings.database_url, pool_pre_ping=True)
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False)


class Base(DeclarativeBase):
    pass


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

创建SQLAlchemy引擎和SessionLocal工厂,定义依赖注入函数get_db提供数据库会话。

实现的功能:

  1. SQLite数据库连接
  2. 连接池配置(pool_pre_ping)
  3. Session会话获取
  4. 自动关闭连接

数据库初始化

导入所有模型类,调用Base.metadata.create_all()创建所有表

Base是DeclarativeBase子类,metadata存储所有模型元信息。import模型类确保它们注册到Base.metadata。create_all()检查数据库中是否存在表,不存在则创建(只创建不修改)。bind=engine指定数据库引擎。

这部分代码的作用:

  • 创建所有数据库表
  • 初始化数据库结构
from app.db.base import Base, engine
from app.models.application import ApplicationRecord, ScoreResult
from app.models.user import User, UserSession


def init_db() -> None:
    Base.metadata.create_all(bind=engine)


if __name__ == "__main__":
    init_db()

SQLAlchemy的create_all()根据模型类定义自动创建数据库表,只需执行一次。

创建的表:

  1. users表
  2. user_sessions表
  3. application_records表
  4. score_results表

工作总结

在任务开始的初期阶段,我们明确了我们组的任务和分工,并且开始学习如何通过小组分工的形式完成一个整体项目。并且学习到了小组分工对于一个项目完成的重要性,认识到了一个项目必须从实际和需求出发,充分考虑实用性以及客户端需求。这一阶段的主要工作是搭建项目核心基础设施,共完成4个核心部分,分别是:项目入口的配置、环境配置、数据库的连接以及数据库初始化。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐