feat: Phase 4 多租户隔离 + 四阶段升级测试 + CSS 统一化

Phase 4: org_id 注入 JWT/API 过滤/组织管理 CRUD/前端组织列
测试: tests/test_phase_upgrades.py 97项全覆盖
CSS: theme-modern.css 共享 mobile-card-list/status-dot/search-bar 等模式
修复: initial_data.py LLM配置 NOT NULL 约束, TopicResponse 含 org_id
This commit is contained in:
Yuzhiran Dev
2026-05-17 06:56:53 +08:00
parent 301dc3e438
commit 9c37c9a574
45 changed files with 3707 additions and 1366 deletions
+11 -1
View File
@@ -61,13 +61,14 @@ class TopicBase(BaseModel):
id: str
field_id: Optional[int] = None
field_name: Optional[str] = None
org_id: Optional[str] = None
title: str
format: Optional[str] = None
core_concept: Optional[str] = None
audience_pain: Optional[str] = None
unique_angle: Optional[str] = None
priority: Optional[str] = None
priority_score: int = 0
priority_score: int | float = 0
total_score: Optional[float] = None
status: str = "pending"
tags: List[str] = []
@@ -176,6 +177,8 @@ class ContentCalendarResponse(ContentCalendarBase):
created_by: Optional[str] = None
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
topic_status: Optional[str] = None
platform_icon: Optional[str] = None
model_config = ConfigDict(from_attributes=True)
@@ -356,6 +359,7 @@ class UserBase(BaseModel):
class UserCreate(UserBase):
password: str
org_id: Optional[str] = None
class UserUpdate(BaseModel):
@@ -366,6 +370,7 @@ class UserUpdate(BaseModel):
class UserResponse(UserBase):
id: int
org_id: Optional[str] = None
created_at: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
@@ -457,6 +462,9 @@ class LLMConfigBase(BaseModel):
temperature: float = 0.7
max_tokens: int = 2000
model: Optional[str] = None
provider: str = "opencode-go"
base_url: Optional[str] = None
api_key: Optional[str] = None
is_active: bool = True
@@ -464,6 +472,8 @@ class LLMConfigResponse(LLMConfigBase):
id: int
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)