Skip to content
Open
4 changes: 4 additions & 0 deletions alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@

from alembic import context

from config import get_config

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
config.set_main_option("sqlalchemy.url", get_config("DB_PATH").replace("%", "%%"))

# Interpret the config file for Python logging.
# This line sets up loggers basically.
Expand Down Expand Up @@ -39,6 +42,7 @@
from models.interview import Interview, InterviewTimeSlot
from models.recruit import Recruitment, Evaluation
from models.member import Member
from models.teachers import TeacherMetaState, TeacherRecord

target_metadata = Base.metadata

Expand Down
418 changes: 418 additions & 0 deletions alembic/versions/3a9f4c7e2d10_add_teacher_database_storage.py

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions models/teachers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""
职责范围:定义教师介绍功能的数据库表结构,承载公开资料、后台来源配置和同步草稿状态。
功能边界:本模块只声明 SQLAlchemy ORM 模型,不负责接口校验、远程同步解析或初始数据迁移。
"""

from sqlalchemy import Boolean, Column, Integer, String, Text

from . import Base


class TeacherRecord(Base):
__tablename__ = "teachers"

id = Column(String(64), primary_key=True, index=True)
enabled = Column(Boolean, nullable=False, default=True)
sort_order = Column(Integer, nullable=False, default=0)

name = Column(String(100), nullable=False, default="")
title = Column(Text, nullable=False, default="")
affiliation = Column(Text, nullable=False, default="")
research_areas = Column(Text, nullable=False, default="[]")
summary = Column(Text, nullable=False, default="")
bio = Column(Text, nullable=False, default="")
email = Column(String(255), nullable=False, default="")
avatar_url = Column(Text, nullable=False, default="")
homepage_urls = Column(Text, nullable=False, default="[]")
source_url = Column(Text, nullable=False, default="")
source_status = Column(String(32), nullable=False, default="published")
last_synced_at = Column(String(40), nullable=False, default="")
sync_note = Column(Text, nullable=False, default="")
profile_sections = Column(Text, nullable=False, default="[]")

standard_homepage_url = Column(Text, nullable=False, default="")
external_links = Column(Text, nullable=False, default="[]")
field_sources = Column(Text, nullable=False, default="{}")
draft = Column(Text, nullable=False, default="{}")
updated_at = Column(String(40), nullable=False, default="")


class TeacherMetaState(Base):
__tablename__ = "teacher_meta"

id = Column(String(32), primary_key=True, default="default")
last_synced_at = Column(String(40), nullable=False, default="")
source_status = Column(String(32), nullable=False, default="published")
source_url = Column(Text, nullable=False, default="")
sync_note = Column(Text, nullable=False, default="")
7 changes: 7 additions & 0 deletions routes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def init_app_routes(app: FastAPI):
from routes.upload import router as upload_router
from routes.images import router as images_router
from routes.create import router as create_router
from routes.teachers import router as teachers_router

app.include_router(
news_router,
Expand Down Expand Up @@ -58,6 +59,12 @@ def init_app_routes(app: FastAPI):
tags=["recruit"],
)

app.include_router(
teachers_router,
prefix="/api/teachers",
tags=["teachers"],
)


app.include_router(
edit_router,
Expand Down
Loading