学生资料设置、头像与自动备份恢复。

首页卡片支持修改/删除;详情页设置 Tab 可维护学校、年级与头像;系统设置新增数据备份下载与恢复;备份默认存 /root/grade-archive-backups,详见 docs/BACKUP.md。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-28 17:56:09 +08:00
parent 1cb3c7fad5
commit 530a8b70a1
25 changed files with 1230 additions and 194 deletions
+23
View File
@@ -136,6 +136,7 @@ class StudentCreate(BaseModel):
school_level: SchoolLevelEnum = SchoolLevelEnum.junior_high
grade: str | None = None
class_name: str | None = None
school_name: str | None = Field(default=None, max_length=128)
class StudentUpdate(BaseModel):
@@ -143,6 +144,7 @@ class StudentUpdate(BaseModel):
school_level: SchoolLevelEnum | None = None
grade: str | None = None
class_name: str | None = None
school_name: str | None = Field(default=None, max_length=128)
class StudentOut(BaseModel):
@@ -151,10 +153,25 @@ class StudentOut(BaseModel):
school_level: SchoolLevelEnum
grade: str | None
class_name: str | None
school_name: str | None
has_avatar: bool = False
created_at: datetime
model_config = {"from_attributes": True}
@classmethod
def from_student(cls, student) -> "StudentOut":
return cls(
id=student.id,
name=student.name,
school_level=SchoolLevelEnum(student.school_level.value),
grade=student.grade,
class_name=student.class_name,
school_name=student.school_name,
has_avatar=bool(getattr(student, "avatar_path", None)),
created_at=student.created_at,
)
class SubjectOut(BaseModel):
id: int
@@ -335,3 +352,9 @@ class CompositionOut(BaseModel):
updated_at: datetime
model_config = {"from_attributes": True}
class BackupInfoOut(BaseModel):
filename: str
size_bytes: int
created_at: datetime