78 lines
1.5 KiB
Python
78 lines
1.5 KiB
Python
from datetime import date, datetime
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
|
|
|
|
# --- Stock ---
|
|
|
|
class StockItem(BaseModel):
|
|
code: str
|
|
name: str
|
|
|
|
class KlineItem(BaseModel):
|
|
date: str
|
|
open: float
|
|
close: float
|
|
high: float
|
|
low: float
|
|
volume: float
|
|
|
|
class RealtimeQuote(BaseModel):
|
|
code: str
|
|
name: str
|
|
price: float
|
|
change: float # 涨跌额
|
|
change_pct: float # 涨跌幅 %
|
|
high: float
|
|
low: float
|
|
open: float
|
|
prev_close: float
|
|
volume: float
|
|
amount: float
|
|
|
|
# --- Collection ---
|
|
|
|
class StockInput(BaseModel):
|
|
code: str
|
|
name: str
|
|
added_date: str # YYYY-MM-DD
|
|
|
|
class CollectionCreate(BaseModel):
|
|
name: str
|
|
stocks: list[StockInput] = []
|
|
|
|
class CollectionUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
|
|
class CollectionStockOut(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
id: int
|
|
stock_code: str
|
|
stock_name: str
|
|
added_date: date
|
|
|
|
class CollectionOut(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
id: int
|
|
name: str
|
|
short_code: Optional[str]
|
|
created_at: datetime
|
|
stocks: list[CollectionStockOut]
|
|
|
|
class CollectionListItem(BaseModel):
|
|
id: int
|
|
name: str
|
|
stock_count: int
|
|
short_code: Optional[str]
|
|
created_at: datetime
|
|
|
|
# --- Share ---
|
|
|
|
class ShareResponse(BaseModel):
|
|
short_code: str
|
|
url: str
|
|
|
|
class CollectionShareOut(BaseModel):
|
|
collection: CollectionOut
|
|
stocks_data: dict # code -> {kline: [...], realtime: {...}}
|