feat: 初始化孕育无忧全栈项目基础代码结构

完成项目初始搭建,包含后端FastAPI+MongoDB服务、前端React+Vite项目的完整基础结构,添加各类配置文件与依赖清单,涵盖核心业务初始框架。
This commit is contained in:
2026-05-21 00:46:48 +08:00
commit 409dabafb5
142 changed files with 31010 additions and 0 deletions

View File

View File

@@ -0,0 +1,60 @@
from datetime import datetime, timezone
from typing import Optional
from beanie import Document, PydanticObjectId
from pydantic import BaseModel, Field
class IndicatorInterpretation(BaseModel):
"""单项指标解读"""
name: str
nickname: str = "" # 白话名称,如"氧气快递员"
value: str = ""
status: str = "normal"
what_is_it: str = "" # 通俗解释
impact: str = "" # 对宝宝的影响
suggestion: str = "" # 行动建议
recheck_reminder: Optional[str] = None
class CategoryInterpretation(BaseModel):
"""分类解读(如血液指标、激素水平)"""
category: str
status: str = "normal"
indicators: list[IndicatorInterpretation] = Field(default_factory=list)
class ActionItem(BaseModel):
"""行动建议"""
content: str
priority: str = "medium" # high / medium / low
category: str = "" # 饮食 / 运动 / 就医 / 复查
class Analysis(Document):
report_id: PydanticObjectId
user_id: PydanticObjectId
# Overall assessment
overall_status: str = "normal" # normal / attention / warning
risk_level: str = "low" # low / medium / high
overall_summary: str = "" # 整体评估文案
emotional_summary: str = "" # 情感化总结,如"宝宝发育良好"
# Detailed interpretations
categories: list[CategoryInterpretation] = Field(default_factory=list)
# Action items
action_items: list[ActionItem] = Field(default_factory=list)
# Tips
tips: list[str] = Field(default_factory=list)
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class Settings:
name = "analyses"
indexes = [
"user_id",
"report_id",
]

View File

@@ -0,0 +1,24 @@
from datetime import datetime, timezone
from beanie import Document, PydanticObjectId
from pydantic import BaseModel, Field
class ChatMessage(BaseModel):
role: str # user / assistant
content: str
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class ChatSession(Document):
user_id: PydanticObjectId
report_id: PydanticObjectId
messages: list[ChatMessage] = Field(default_factory=list)
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class Settings:
name = "chat_sessions"
indexes = [
[("user_id", 1), ("report_id", 1)],
]

View File

@@ -0,0 +1,30 @@
from datetime import datetime, timezone
from typing import Optional
from beanie import Document, PydanticObjectId
from pydantic import BaseModel, Field
class CheckupItem(BaseModel):
title: str
week: int
date: Optional[str] = None
items: list[str] = Field(default_factory=list)
preparations: list[str] = Field(default_factory=list)
notes: str = ""
status: str = "upcoming" # upcoming / completed / missed
importance: str = "medium" # high / medium / low
report_ids: list[str] = Field(default_factory=list) # linked report IDs
class CheckupPlan(Document):
user_id: PydanticObjectId
checkups: list[CheckupItem] = Field(default_factory=list)
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class Settings:
name = "checkup_plans"
indexes = [
"user_id",
]

View File

@@ -0,0 +1,50 @@
from datetime import datetime, timezone
from typing import Optional
from beanie import Document, PydanticObjectId
from pydantic import BaseModel, Field
class DataItem(BaseModel):
"""单个检查指标"""
name: str
value: str
unit: str = ""
reference_range: str = ""
status: str = "normal" # normal / high / low
category: str = "" # 血液检查 / 激素水平 / 尿常规 etc.
class Report(Document):
user_id: PydanticObjectId
report_type: str = "" # 血常规 / B超 / 尿常规 etc.
pregnancy_week: Optional[int] = None
report_date: Optional[str] = None # 报告日期 YYYY-MM-DD
# Images
image_urls: list[str] = Field(default_factory=list)
# OCR results
ocr_raw_text: Optional[str] = None
data_items: list[DataItem] = Field(default_factory=list)
# User additions
symptoms: Optional[list[str]] = None # 自觉症状
notes: Optional[str] = None # 备注
# Privacy fields (auto-masked)
patient_name: Optional[str] = None
patient_id_masked: Optional[str] = None
# Status
status: str = "pending" # pending / verified / analyzed
overall_status: str = "normal" # normal / attention / warning
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class Settings:
name = "reports"
indexes = [
"user_id",
]

View File

@@ -0,0 +1,55 @@
from datetime import datetime, timezone
from typing import Optional
from beanie import Document
from pymongo import IndexModel, ASCENDING
from pydantic import BaseModel, Field
class EmergencyContact(BaseModel):
name: str = ""
relation: str = ""
phone: str = ""
class User(Document):
openid: str = Field(..., unique=True)
union_id: Optional[str] = None
session_key: Optional[str] = None
# Basic info
name: str = ""
phone: Optional[str] = None
age: Optional[int] = None
height: Optional[float] = None # cm
pre_pregnancy_weight: Optional[float] = None # kg
current_weight: Optional[float] = None # kg
blood_type: Optional[str] = None
allergies: list[str] = Field(default_factory=list)
medical_history: list[str] = Field(default_factory=list)
# Pregnancy info
last_period_date: Optional[datetime] = None
due_date: Optional[datetime] = None
pregnancy_week: Optional[int] = None
pregnancy_day: Optional[int] = None
multiple_pregnancy: Optional[str] = None # 单胎/双胎/三胎+
pregnancy_count: Optional[int] = None # 第几次怀孕
emergency_contact: EmergencyContact = Field(default_factory=EmergencyContact)
# Status
is_onboarded: bool = False
avatar_url: Optional[str] = None
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
class Settings:
name = "users"
indexes = [
IndexModel(
[("phone", ASCENDING)],
unique=True,
partialFilterExpression={"phone": {"$type": "string"}},
),
]