Răsfoiți Sursa

增加cardNo字段

AnlaAnla 2 săptămâni în urmă
părinte
comite
a46fdc9a1b
4 a modificat fișierele cu 25 adăugiri și 3 ștergeri
  1. 5 3
      app/api/cards.py
  2. 16 0
      app/core/database_loader.py
  3. 2 0
      app/crud/crud_card.py
  4. 2 0
      app/utils/scheme.py

+ 5 - 3
app/api/cards.py

@@ -22,6 +22,7 @@ db_dependency = Depends(get_db_connection)
 @router.post("/created", response_model=CardDetailResponse, status_code=201, summary="创建一个新的卡牌记录")
 def create_card(
         card_name: Optional[str] = Query(None, summary="卡牌的名称"),
+        cardNo: Optional[str] = Query(None, summary="卡牌编号"),
         card_type: CardType = Query(CardType.pokemon, summary="卡牌类型"),
         db_conn: PooledMySQLConnection = db_dependency
 ):
@@ -29,8 +30,8 @@ def create_card(
     try:
         with db_conn.cursor(dictionary=True) as cursor:
 
-            query = f"INSERT INTO {settings.DB_CARD_TABLE_NAME} (card_name, card_type) VALUES (%s, %s)"
-            cursor.execute(query, (card_name, card_type.value))
+            query = f"INSERT INTO {settings.DB_CARD_TABLE_NAME} (card_name, cardNo, card_type) VALUES (%s, %s, %s)"
+            cursor.execute(query, (card_name, cardNo, card_type.value))
             db_conn.commit()
             new_id = cursor.lastrowid
             logger.info(f"新卡牌已创建, ID: {new_id}, 类型: {card_type.value}")
@@ -112,6 +113,7 @@ def get_next_card_details(card_id: int, db_conn: PooledMySQLConnection = db_depe
 @router.get("/card_list_filter", response_model=CardListResponseWrapper, summary="获取卡牌列表和总数")
 def card_list_filter(
         card_id: Optional[int] = Query(None, description="筛选:卡牌ID"),
+        cardNo: Optional[str] = Query(None, description="筛选:卡牌编号"),
         card_name: Optional[str] = Query(None, description="筛选:卡牌名称"),
         card_type: Optional[CardType] = Query(None, description="筛选:卡牌类型"),
         is_edited: Optional[bool] = Query(None, description="筛选:是否已编辑"),
@@ -143,7 +145,7 @@ def card_list_filter(
     try:
         result = crud_card.get_card_list_and_count(
             db_conn,
-            card_id, card_name, card_type, is_edited,
+            card_id, cardNo, card_name, card_type, is_edited,
             min_detection_score, max_detection_score,
             min_modified_score, max_modified_score,
             created_start, created_end,

+ 16 - 0
app/core/database_loader.py

@@ -28,6 +28,7 @@ def init_database():
             f"CREATE TABLE IF NOT EXISTS `{settings.DB_CARD_TABLE_NAME}` ("
             "  `id` INT AUTO_INCREMENT PRIMARY KEY,"
             "  `card_name` VARCHAR(255) NULL COMMENT '卡牌的通用名称',"
+            "  `cardNo` VARCHAR(100) NULL COMMENT '卡牌编号',"
             "  `card_type` VARCHAR(50) NOT NULL DEFAULT 'pokemon',"
             "  `detection_score` DECIMAL(4, 2) NULL,"
             "  `modified_score` DECIMAL(4, 2) NULL,"
@@ -39,6 +40,21 @@ def init_database():
         cursor.execute(cards_table)
         logger.info(f"数据表 '{settings.DB_CARD_TABLE_NAME}' 已准备就绪。")
 
+
+        # 临时代码
+        # ----------------- 新增无损增加字段的逻辑 -----------------
+        try:
+            cursor.execute(f"SHOW COLUMNS FROM `{settings.DB_CARD_TABLE_NAME}` LIKE 'cardNo'")
+            if not cursor.fetchone():
+                logger.info(f"表 '{settings.DB_CARD_TABLE_NAME}' 中不存在 'cardNo' 字段,正在安全添加以兼容旧数据...")
+                # ALTER TABLE 添加列到 card_name 之后
+                cursor.execute(
+                    f"ALTER TABLE `{settings.DB_CARD_TABLE_NAME}` ADD COLUMN `cardNo` VARCHAR(100) NULL COMMENT '卡牌编号' AFTER `card_name`")
+                logger.info("字段 'cardNo' 添加成功。")
+        except mysql.connector.Error as err:
+            logger.error(f"检查/添加 'cardNo' 字段失败: {err}")
+        # --------------------------------------------------------
+
         # 2. 创建 card_images 表 (主要计算图)
         card_images_table = (
             f"CREATE TABLE IF NOT EXISTS `{settings.DB_IMAGE_TABLE_NAME}` ("

+ 2 - 0
app/crud/crud_card.py

@@ -302,6 +302,7 @@ def get_card_list_with_images(
 def get_card_list_and_count(
         db_conn: PooledMySQLConnection,
         card_id: Optional[int],
+        cardNo: Optional[str],
         card_name: Optional[str],
         card_type: Optional[CardType],
         is_edited: Optional[bool],
@@ -323,6 +324,7 @@ def get_card_list_and_count(
         params = []
 
         if card_id is not None: conditions.append("id = %s"); params.append(card_id)
+        if cardNo: conditions.append("cardNo LIKE %s"); params.append(f"%{cardNo}%")
         if card_name: conditions.append("card_name LIKE %s"); params.append(f"%{card_name}%")
         if card_type: conditions.append("card_type = %s"); params.append(card_type.value)
         if is_edited is not None: conditions.append("is_edited = %s"); params.append(is_edited)

+ 2 - 0
app/utils/scheme.py

@@ -93,6 +93,7 @@ class CardDetailResponse(BaseModel):
     id_prev: Optional[int] = None
     id_next: Optional[int] = None
     card_name: Optional[str] = None
+    cardNo: Optional[str] = None
     created_at: datetime
     updated_at: datetime
     card_type: str
@@ -142,6 +143,7 @@ class CardImageInListResponse(BaseModel):
 class CardListDetailResponse(BaseModel):
     id: int
     card_name: Optional[str] = None
+    cardNo: Optional[str] = None
     card_type: str
     detection_score: Optional[float] = None
     modified_score: Optional[float] = None