This commit is contained in:
wenfp
2026-07-27 16:36:33 +08:00
parent 53f48de2b7
commit 7f819cd775
19 changed files with 623 additions and 173 deletions
+146
View File
@@ -212,6 +212,152 @@ class UploadResponse(BaseModel):
object_key: str
class FeatureIconBase(BaseModel):
title: str = Field(..., min_length=1, max_length=80)
icon_url: str = Field(..., min_length=1, max_length=500)
target_type: str = Field(default="link", pattern=r"^(link|app)$")
target_url: str | None = Field(default=None, max_length=500)
product_id: int | None = Field(default=None, ge=1)
sort_order: int = Field(default=0, ge=0)
is_active: bool = True
@field_validator("target_url")
@classmethod
def trim_target_url(cls, value: str | None) -> str | None:
if value is None:
return None
value = value.strip()
return value or None
class FeatureIconCreate(FeatureIconBase):
pass
class FeatureIconUpdate(BaseModel):
title: str | None = Field(default=None, min_length=1, max_length=80)
icon_url: str | None = Field(default=None, min_length=1, max_length=500)
target_type: str | None = Field(default=None, pattern=r"^(link|app)$")
target_url: str | None = Field(default=None, max_length=500)
product_id: int | None = Field(default=None, ge=1)
sort_order: int | None = Field(default=None, ge=0)
is_active: bool | None = None
@field_validator("target_url")
@classmethod
def trim_target_url(cls, value: str | None) -> str | None:
if value is None:
return None
value = value.strip()
return value or None
class FeatureIcon(BaseModel):
id: int
temple_id: int
title: str
icon_url: str
target_type: str
target_url: str | None = None
product_id: int | None = None
product_name: str | None = None
sort_order: int = 0
is_active: bool = True
class FeatureIconCopyRequest(BaseModel):
source_temple_id: int = Field(..., ge=1)
icon_ids: list[int] = Field(..., min_length=1)
class AdSlotBase(BaseModel):
name: str = Field(..., min_length=1, max_length=100)
code: str = Field(..., min_length=1, max_length=80, pattern=r"^[a-zA-Z0-9_-]+$")
description: str | None = Field(default=None, max_length=300)
sort_order: int = Field(default=0, ge=0)
is_active: bool = True
class AdSlotCreate(AdSlotBase):
pass
class AdSlotUpdate(BaseModel):
name: str | None = Field(default=None, min_length=1, max_length=100)
code: str | None = Field(default=None, min_length=1, max_length=80, pattern=r"^[a-zA-Z0-9_-]+$")
description: str | None = Field(default=None, max_length=300)
sort_order: int | None = Field(default=None, ge=0)
is_active: bool | None = None
class AdSlot(BaseModel):
id: int
temple_id: int
name: str
code: str
description: str | None = None
sort_order: int = 0
is_active: bool = True
class AdBase(BaseModel):
slot_id: int = Field(..., ge=1)
title: str = Field(..., min_length=1, max_length=100)
image_url: str = Field(..., min_length=1, max_length=500)
target_type: str = Field(default="link", pattern=r"^(link|app)$")
target_url: str | None = Field(default=None, max_length=500)
product_id: int | None = Field(default=None, ge=1)
sort_order: int = Field(default=0, ge=0)
is_active: bool = True
@field_validator("target_url")
@classmethod
def trim_target_url(cls, value: str | None) -> str | None:
if value is None:
return None
value = value.strip()
return value or None
class AdCreate(AdBase):
pass
class AdUpdate(BaseModel):
slot_id: int | None = Field(default=None, ge=1)
title: str | None = Field(default=None, min_length=1, max_length=100)
image_url: str | None = Field(default=None, min_length=1, max_length=500)
target_type: str | None = Field(default=None, pattern=r"^(link|app)$")
target_url: str | None = Field(default=None, max_length=500)
product_id: int | None = Field(default=None, ge=1)
sort_order: int | None = Field(default=None, ge=0)
is_active: bool | None = None
@field_validator("target_url")
@classmethod
def trim_target_url(cls, value: str | None) -> str | None:
if value is None:
return None
value = value.strip()
return value or None
class Ad(BaseModel):
id: int
temple_id: int
slot_id: int
slot_name: str | None = None
slot_code: str | None = None
title: str
image_url: str
target_type: str
target_url: str | None = None
product_id: int | None = None
product_name: str | None = None
sort_order: int = 0
is_active: bool = True
class RitualServiceCreate(BaseModel):
name: str = Field(..., min_length=1, max_length=120)
description: str | None = Field(default=None, max_length=500)