diff --git a/README.md b/README.md index 6abccd9..22b56f4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,37 @@ # Final Project for CS3321 Spring 2025 电商平台管理系统 + +CS3321 数据库技术大作业 + +## 项目概述 + +本项目旨在设计和实现一个电商平台管理系统。项目采用前后端分离的架构,前端使用 Vue3,后端使用 FastAPI,数据库使用 MySQL+PyMySQL。 + +支持的功能: +- 用户端: + - 商品浏览 + - 商品搜索 + - 商品详情 + - 购物车管理 + - 下单 + - (模拟)支付 + - 订单查询 +- 商家端: + - 商品管理 + - 店铺管理 + - 订单管理 +- 管理员端: + - 审核管理 + +## 项目结构 + +``` +doc/ # 需求分析、概念设计、ER图等文档 +src/ # 源代码 + ├── backend/ # 后端代码 + ├── frontend/ # 前端代码 + └── static/ # 静态资源 +``` + +其它请见各个目录下的 README.md 文件。 diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..a83fdb5 --- /dev/null +++ b/src/README.md @@ -0,0 +1,68 @@ +# README: src/ + +## 运行后端 + +**注意** 运行python脚本请以 `src` 目录作为工作目录,以避免导入错误。 + +要运行后端需要的步骤如下: + +1. 安装需要的 Python 包。推荐使用 3.13 版本的 Python。可以使用以下命令安装: + + ```bash + pip install -r backend/requirements.txt + ``` +2. 创建数据库。开发时使用了 MySQL 8.4.5。请按照`backend/README.md`中的说明创建数据库并创建对应的`.env`文件。 +3. 运行后端。可以使用以下命令: + + ```bash + uvicorn backend.main:app --reload + ``` + + 这将启动 FastAPI 后端应用,并监听在默认的 `http://127.0.0.1:8000 ` 地址。 + + +**如何创建数据库schema和样例数据** + +在运行后端之前,需要先创建数据库 schema。`backend/scripts` 内包含了创建数据库 schema 和样例数据的脚本。 + +重置数据库(清空并重新创建schema)。可以选择操作 dev 或 test 数据库。 + +**如何运行后端测试** + +```bash +python -m unittest discover -s backend/test +``` + +```bash +python -m backend.scripts.reset dev +``` + +```bash +python -m backend.scripts.reset test +``` + +创建数据库 schema 和样例数据。这将在 dev 数据库中创建 schema,并插入一些样例数据。 + +```bash +python -m backend.scripts.make_demo_data +``` + +创建 + +## 运行前端 + +运行前端需要的步骤如下: + +1. 在 `frontend` 目录下安装需要的 Node.js 包。可以使用以下命令安装: + + ```bash + cd frontend + npm install + ``` +2. 运行前端。可以使用以下命令: + + ```bash + npm run dev + ``` + 这将启动 Vite 开发服务器,并监听在默认的 `http://localhost:5173/` 地址。 +3. 在浏览器中访问 `http://localhost:5173/` ,即可看到前端页面。 diff --git a/src/backend/README.md b/src/backend/README.md index 7500254..e0c03bd 100644 --- a/src/backend/README.md +++ b/src/backend/README.md @@ -1,5 +1,39 @@ # 后端 +## 后端结构 + +后端使用 FastAPI 框架,主要负责处理业务逻辑、数据库交互和 API 提供。以下是后端的主要目录结构: + +``` +├── app +│ ├── api # API 相关代码 +│ ├── core # 核心配置和设置 +│ ├── crud # 数据库 CRUD 操作 +│ ├── dependencies # 依赖注入和共享资源 +│ ├── schemas # Pydantic 模型和数据验证 +│ ├── services # 业务逻辑和服务层 +│ └── utils # 工具函数和通用方法 +├── logs +├── scripts # 数据库脚本和初始化脚本 +├── sql # SQL 相关文件,包括DDL、触发器等 +│ ├── ddl +│ ├── trigger +│ ├── triggers +│ └── utils +└── test # 测试代码 + ├── integration # 集成测试 + │ ├── api_endpoints + │ ├── crud + │ ├── services + │ └── test_sql_objects + └── unit # 单元测试 + ├── api + ├── core + ├── crud + └── service +``` + + ## MySQL 数据库配置 本文档介绍在本地环境成功安装 MySQL 服务器后,如何为本项目创建数据库、用户以及配置必要的环境变量。 diff --git a/src/backend/app/core/logging_config.py b/src/backend/app/core/logging_config.py index 9b8f35b..3aaa9c4 100644 --- a/src/backend/app/core/logging_config.py +++ b/src/backend/app/core/logging_config.py @@ -2,8 +2,7 @@ import os from loguru import logger from pathlib import Path -import datetime # 用于日志文件名中的日期 -import logging # ⭐ 导入标准 logging 模块 +import logging # --- 日志文件存放路径配置 --- BACKEND_ROOT_DIR = Path(__file__).resolve().parent.parent.parent @@ -11,7 +10,6 @@ # --- Loguru 拦截处理器 --- -# ⭐ 定义一个处理器,将标准 logging 模块的日志记录转发给 Loguru class InterceptHandler(logging.Handler): def __init__(self, extra_depth=6): super().__init__() @@ -86,7 +84,7 @@ def setup_logging(): diagnose=True ) - # ⭐ 5. 配置标准 logging 模块以使用 InterceptHandler + # 5. 配置标准 logging 模块以使用 InterceptHandler # 这会捕获由 Uvicorn 等库发出的日志 logging.basicConfig(handlers=[InterceptHandler()], level=max(logging.INFO, numeric_log_level), force=True) diff --git a/src/backend/app/crud/address_crud.py b/src/backend/app/crud/address_crud.py index 730cb4c..4426b81 100644 --- a/src/backend/app/crud/address_crud.py +++ b/src/backend/app/crud/address_crud.py @@ -1,7 +1,7 @@ # src/backend/app/crud/address_crud.py from typing import Optional, List, Dict, Any -from sqlalchemy import Connection, text, exc # 导入 exc 用于异常处理 -from loguru import logger # 假设在模块级别导入了 logger +from sqlalchemy import Connection, text, exc +from loguru import logger from backend.app.schemas.address_schema import AddressCreateRequest, AddressUpdateRequest @@ -90,12 +90,6 @@ def create_address( if new_address_id is None: # Fallback if lastrowid is not supported/returned logger.warning( "lastrowid not available after address insert. This might indicate an issue or specific DB driver behavior.") - # As a fallback, you might try to select the row if there's a unique constraint you can use, - # but it's less reliable than lastrowid. For now, we'll proceed assuming lastrowid works or get_address_by_id will be used. - # If create_address *must* return the created object, and lastrowid fails, this is problematic. - # One option is to not call get_address_by_id if new_address_id is None and return None or raise. - # For now, we let it try get_address_by_id. - logger.info(f"Address created for UserID {user_id} with AddressID {new_address_id} by ActorID {actor_id}.") # 获取并返回新创建的地址的完整信息 return self.get_address_by_id(conn, address_id=new_address_id, actor_id=actor_id) # type: ignore @@ -198,9 +192,6 @@ def update_address_details( logger.info(f"No fields to update for AddressID {address_id}. Returning current data.") return self.get_address_by_id(conn, address_id=address_id, actor_id=actor_id) - # DDL 中没有 LastUpdatedDate 字段,如果需要,应添加并在这里更新 - # update_fields.append("LastUpdatedDate = UTC_TIMESTAMP()") - update_stmt_str = f"UPDATE {self.table_name} SET {', '.join(update_fields)} WHERE AddressID = :AddressID_param" try: diff --git a/src/backend/app/crud/cartitem_crud.py b/src/backend/app/crud/cartitem_crud.py index 5e5dcf4..fec403a 100644 --- a/src/backend/app/crud/cartitem_crud.py +++ b/src/backend/app/crud/cartitem_crud.py @@ -1,13 +1,9 @@ # src/backend/app/crud/cart_item_crud.py from typing import Optional, List, Dict, Any from sqlalchemy import Connection, text, exc # Import exc for exception handling -from loguru import logger # Using loguru as per previous discussions -import datetime +from loguru import logger -# Assuming your Pydantic schemas would be defined elsewhere, e.g., cart_item_schema.py -# For this CRUD, we'll use basic types for input where schemas would normally be used. - class CartItemCRUD: __instance: Optional["CartItemCRUD"] = None @@ -126,9 +122,6 @@ def add_item_to_cart( SET Quantity = :quantity, PriceAtAddition = :price_at_addition, AddedDate = UTC_TIMESTAMP() WHERE CartItemID = :cart_item_id """) - # Note: Updating PriceAtAddition on quantity change is a business decision. - # Some carts keep the original price, others update. Here, we update. - # AddedDate is also updated to reflect the "last modified" time for this cart entry. try: conn.execute(update_stmt, { "quantity": new_quantity, diff --git a/src/backend/app/crud/order_crud.py b/src/backend/app/crud/order_crud.py index 86442c7..d4b7c17 100644 --- a/src/backend/app/crud/order_crud.py +++ b/src/backend/app/crud/order_crud.py @@ -4,10 +4,8 @@ from decimal import Decimal # For monetary values import datetime -from loguru import logger # Assuming loguru is used +from loguru import logger -# Import Pydantic schemas for type hinting where appropriate, -# though CRUD methods primarily deal with basic types and dicts. from backend.app.schemas.order_schema import OrderStatusEnum # For type hinting status diff --git a/src/backend/app/crud/order_item_crud.py b/src/backend/app/crud/order_item_crud.py index 0defd3c..0e3dbd0 100644 --- a/src/backend/app/crud/order_item_crud.py +++ b/src/backend/app/crud/order_item_crud.py @@ -2,7 +2,7 @@ from typing import Optional, List, Dict, Any from sqlalchemy import Connection, text, exc # Import exc for exception handling from decimal import Decimal # For PriceAtPurchase and Subtotal -from loguru import logger # Assuming you are using loguru +from loguru import logger class OrderItemCRUD: diff --git a/src/backend/app/crud/payment_transaction_crud.py b/src/backend/app/crud/payment_transaction_crud.py index 97c70ac..dc47ac7 100644 --- a/src/backend/app/crud/payment_transaction_crud.py +++ b/src/backend/app/crud/payment_transaction_crud.py @@ -4,15 +4,11 @@ from decimal import Decimal # For TotalAmount import datetime -from loguru import logger # Assuming loguru is used +from loguru import logger from backend.app.schemas.order_schema import PaymentTransactionStatusEnum -# Assuming PaymentTransactionStatusEnum is defined in your order_schema.py or a common enums file -# from backend.app.schemas.order_schema import PaymentTransactionStatusEnum -# For this CRUD, we'll use string for status type hint if enum is not directly imported here. - class PaymentTransactionCRUD: __instance: Optional["PaymentTransactionCRUD"] = None diff --git a/src/backend/app/crud/product_change_request_crud_v2.py b/src/backend/app/crud/product_change_request_crud_v2.py index 689c325..0930ede 100644 --- a/src/backend/app/crud/product_change_request_crud_v2.py +++ b/src/backend/app/crud/product_change_request_crud_v2.py @@ -7,7 +7,6 @@ import datetime -# 假设这些枚举在您的 schema 文件中定义并可导入 from backend.app.schemas.product_change_request_schema_v2 import \ ProductChangeRequestTypeApiEnum as TypeEnum, ProductChangeRequestStatusApiEnum as StatusEnum from backend.app.utils.json import DecimalEncoder @@ -404,10 +403,6 @@ def cancel_request( # This method now means "cancel by merchant" # LastUpdatedDate 会由数据库的 ON UPDATE CURRENT_TIMESTAMP 自动处理 try: - # Assuming ProductChangeRequestStatusApiEnum is available or using string literals - # from backend.app.schemas.product_change_request_schema_v2 import ProductChangeRequestStatusApiEnum - # cancelled_status = ProductChangeRequestStatusApiEnum.CANCELLED_BY_USER.value - # pending_status = ProductChangeRequestStatusApiEnum.PENDING_APPROVAL.value cancelled_status = StatusEnum.CANCELLED_BY_USER pending_status = StatusEnum.PENDING_APPROVAL diff --git a/src/backend/app/crud/product_crud.py b/src/backend/app/crud/product_crud.py index 5c633b0..bb133ad 100644 --- a/src/backend/app/crud/product_crud.py +++ b/src/backend/app/crud/product_crud.py @@ -472,9 +472,6 @@ def update_product_stock( "stock_change": stock_change } ) - - # # 提交事务确保更新生效 - # conn.commit() # 获取更新后的商品信息 return self.get_product_by_id(conn, product_id=product_id, actor_id=actor_id) diff --git a/src/backend/app/crud/store_change_request_crud_v2.py b/src/backend/app/crud/store_change_request_crud_v2.py index d290e6f..fff4728 100644 --- a/src/backend/app/crud/store_change_request_crud_v2.py +++ b/src/backend/app/crud/store_change_request_crud_v2.py @@ -7,8 +7,8 @@ # 导入枚举类并使用别名 from backend.app.schemas.store_change_request_schema_v2 import ( - StoreChangeRequestTypeEnum as TypeEnum, # ProductChangeRequestTypeApiEnum - StoreChangeRequestStatusEnum as StatusEnum, # ProductChangeRequestStatusApiEnum + StoreChangeRequestTypeEnum as TypeEnum, + StoreChangeRequestStatusEnum as StatusEnum, ) # StoreStatusEnum from store_schema might be needed if ProposedData_JSON for store creation includes it @@ -249,7 +249,7 @@ def create_request_create_store( conn=conn, requesting_user_id=requesting_user_id, store_id=None, - request_type=TypeEnum.STORE_CREATE.value, # ⭐ Use enum value + request_type=TypeEnum.STORE_CREATE.value, proposed_data_json=proposed_data_json, submitter_notes=submitter_notes, actor_id=actor_id if actor_id is not None else requesting_user_id, @@ -272,7 +272,7 @@ def create_request_update_store( conn=conn, requesting_user_id=requesting_user_id, store_id=store_id, - request_type=TypeEnum.STORE_UPDATE.value, # ⭐ Use enum value + request_type=TypeEnum.STORE_UPDATE.value, proposed_data_json=proposed_data_json, submitter_notes=submitter_notes, actor_id=actor_id if actor_id is not None else requesting_user_id, @@ -294,7 +294,7 @@ def create_request_delete_store( conn=conn, requesting_user_id=requesting_user_id, store_id=store_id, - request_type=TypeEnum.STORE_DELETE.value, # ⭐ Use enum value + request_type=TypeEnum.STORE_DELETE.value, proposed_data_json=None, submitter_notes=submitter_notes, actor_id=actor_id if actor_id is not None else requesting_user_id, @@ -323,9 +323,9 @@ def cancel_request_by_user( result = conn.execute( update_stmt, { - "cancelled_status": StatusEnum.CANCELLED_BY_USER.value, # ⭐ Use enum value + "cancelled_status": StatusEnum.CANCELLED_BY_USER.value, "ChangeRequestID": change_request_id, - "pending_status": StatusEnum.PENDING_APPROVAL.value, # ⭐ Use enum value + "pending_status": StatusEnum.PENDING_APPROVAL.value, }, ) if result.rowcount > 0: @@ -426,8 +426,8 @@ def update_request_store_id_and_status_applied( set_clauses: List[str] = ["Status = :AppliedStatus"] params: Dict[str, Any] = { "ChangeRequestID_param": change_request_id, - "AppliedStatus": StatusEnum.APPLIED.value, # ⭐ Use enum value - "ApprovedStatus": StatusEnum.APPROVED.value, # ⭐ Use enum value + "AppliedStatus": StatusEnum.APPLIED.value, + "ApprovedStatus": StatusEnum.APPROVED.value, } # 只有在 applied_store_id 提供时才尝试更新 StoreID 列 diff --git a/src/backend/app/crud/store_crud.py b/src/backend/app/crud/store_crud.py index e32f437..ad0b947 100644 --- a/src/backend/app/crud/store_crud.py +++ b/src/backend/app/crud/store_crud.py @@ -1,10 +1,9 @@ # src/backend/app/crud/store_crud.py from typing import Optional, List, Dict, Any from sqlalchemy import Connection, text, exc # Import exc for exception handling -# Decimal is not used in Store DDL, but datetime is for CreationDate import datetime -from loguru import logger # Assuming loguru is used +from loguru import logger # Import Pydantic schemas for type hinting where appropriate for Enums from backend.app.schemas.store_schema import StoreStatusEnum @@ -38,7 +37,7 @@ def _set_actor_session_variable(conn: Connection, actor_id: Optional[int]): try: if actor_id is not None: conn.execute( - text("SET @actor_id = :actor_id"), # Assuming your trigger uses @actor_id + text("SET @actor_id = :actor_id"), {"actor_id": actor_id} ) else: diff --git a/src/backend/app/crud/user_session_crud.py b/src/backend/app/crud/user_session_crud.py index a4adf1e..2d6ef8d 100644 --- a/src/backend/app/crud/user_session_crud.py +++ b/src/backend/app/crud/user_session_crud.py @@ -7,10 +7,7 @@ from backend.app.utils import logger -# Optional: If you have a BaseCRUD for common methods like _set_actor_session_variable -# from .base import CRUDBase - -class UserSessionCRUD: # You can inherit from CRUDBase if you have one +class UserSessionCRUD: __instance: Optional["UserSessionCRUD"] = None @@ -37,18 +34,15 @@ def _set_actor_session_variable(conn: Connection, actor_user_id: Optional[int]): conn.execute(text("SET @app_user_id = NULL")) def create_session( - self, - conn: Connection, - *, - session_token: str, - user_id: int, - expires_at: datetime.datetime, - ip_address: Optional[str] = None, - user_agent: Optional[str] = None, - # actor_user_id: Optional[int] = None # The user_id IS the actor here. - # If an admin creates a session for another, then actor_user_id would be admin's id. - # For simplicity, we'll assume the user_id provided is the context. - # If triggers are used, service layer can set @app_user_id to user_id. + self, + conn: Connection, + *, + session_token: str, + user_id: int, + expires_at: datetime.datetime, + ip_address: Optional[str] = None, + user_agent: Optional[str] = None, + # actor_user_id: Optional[int] = None # The user_id IS the actor here. ) -> Dict[str, Any]: """ Creates a new user session in the database. @@ -63,35 +57,42 @@ def create_session( # before inserting, all timestamp are converted to utc+0. expires_at_utc_aware = cast_anytime_to_utc(expires_at) - stmt = text(f""" + stmt = text( + f""" INSERT INTO {self.table_name} (SessionToken, UserID, ExpiresAt, LastAccessedAt, IPAddress, UserAgent, CreatedAt) VALUES (:session_token, :user_id, :expires_at, NOW(), :ip_address, :user_agent, NOW()) - """) - - conn.execute(stmt, { - "session_token": session_token, - "user_id": user_id, - "expires_at": expires_at_utc_aware, - "ip_address": ip_address, - "user_agent": user_agent - }) + """ + ) + + conn.execute( + stmt, + { + "session_token": session_token, + "user_id": user_id, + "expires_at": expires_at_utc_aware, + "ip_address": ip_address, + "user_agent": user_agent, + }, + ) # Retrieve the created session to confirm and return # (NOW() for LastAccessedAt and CreatedAt might differ slightly if fetched separately, # but it's usually acceptable. Or fetch by token and other known values) created_session_data = self.get_session_by_token(conn, token=session_token) if not created_session_data: - raise Exception("Session creation verification failed (session not found immediately after insert).") + raise Exception( + "Session creation verification failed (session not found immediately after insert)." + ) # print(f"INFO: UserSessionCRUD - Session created for UserID '{user_id}' with Token '{session_token[:8]}...'.") - self.logger.info(f"Created session for UserID '{user_id}' with Token '{session_token[:8]}...'.") + self.logger.info( + f"Created session for UserID '{user_id}' with Token '{session_token[:8]}...'." + ) return created_session_data - def get_session_by_token( - self, conn: Connection, *, token: str - ) -> Optional[Dict[str, Any]]: + def get_session_by_token(self, conn: Connection, *, token: str) -> Optional[Dict[str, Any]]: """ Retrieves a session by its token, regardless of its expiration or active status. Does NOT update LastAccessedAt. @@ -99,16 +100,18 @@ def get_session_by_token( The timestamps are all naive UTC datetime objects (no timezone info). They will be correct aware datetime once added with UTC timezone. """ - stmt = text(f""" + stmt = text( + f""" SELECT SessionToken, UserID, CreatedAt, ExpiresAt, LastAccessedAt, IPAddress, UserAgent FROM {self.table_name} WHERE SessionToken = :token - """) + """ + ) result = conn.execute(stmt, {"token": token}).fetchone() return dict(result._mapping) if result else None def get_active_user_id_by_token_and_update_access( - self, conn: Connection, *, token: str + self, conn: Connection, *, token: str ) -> Optional[int]: """ Retrieves the UserID for an active (non-expired) session token @@ -124,14 +127,18 @@ def get_active_user_id_by_token_and_update_access( # Let's go with Option 1 with a check, common for web apps. # For higher concurrency needs, a stored procedure or specific locking might be better. - current_time_utc = datetime.datetime.now(datetime.timezone.utc) # Ensure timezone aware if DB stores UTC + current_time_utc = datetime.datetime.now( + datetime.timezone.utc + ) # Ensure timezone aware if DB stores UTC # Step 1: Find the session and check if it's active and not expired - select_stmt = text(f""" + select_stmt = text( + f""" SELECT UserID, ExpiresAt FROM {self.table_name} WHERE SessionToken = :token - """) + """ + ) session_data = conn.execute(select_stmt, {"token": token}).fetchone() if not session_data: @@ -140,31 +147,35 @@ def get_active_user_id_by_token_and_update_access( # Convert to dict for easier access if it's a RowProxy session_dict = dict(session_data._mapping) - expires_at_aware_utc = cast_db_datetime_to_utc(session_dict['ExpiresAt']) + expires_at_aware_utc = cast_db_datetime_to_utc(session_dict["ExpiresAt"]) # Ensure ExpiresAt from DB is timezone-aware if current_time is, or compare naively # For simplicity, assuming naive datetime from DB or both are UTC if expires_at_aware_utc <= current_time_utc: # Compare with current time - logger.info(f"DEBUG: UserSessionCRUD - Session for token '{token[:8]}...'" - f" has expired at {expires_at_aware_utc}." - f" Current time is {current_time_utc} and expired" - f" {current_time_utc - expires_at_aware_utc} ago.") + logger.info( + f"DEBUG: UserSessionCRUD - Session for token '{token[:8]}...'" + f" has expired at {expires_at_aware_utc}." + f" Current time is {current_time_utc} and expired" + f" {current_time_utc - expires_at_aware_utc} ago." + ) self.delete_session_by_token(conn, token=token, actor_user_id=None) # Or a system actor return None # Step 2: If valid and active, update LastAccessedAt - update_stmt = text(f""" + update_stmt = text( + f""" UPDATE {self.table_name} SET LastAccessedAt = NOW() WHERE SessionToken = :token - """) + """ + ) conn.execute(update_stmt, {"token": token}) # print(f"INFO: UserSessionCRUD - Session LastAccessedAt updated for UserID '{session_dict['UserID']}' with Token '{token[:8]}...'.") - return session_dict['UserID'] + return session_dict["UserID"] def get_active_user_id_by_token_and_update_access_and_expiration( - self, conn: Connection, *, token: str, expires_at: datetime.datetime + self, conn: Connection, *, token: str, expires_at: datetime.datetime ) -> bool: """ Retrieves the UserID for an active (non-expired) session token @@ -188,14 +199,17 @@ def get_active_user_id_by_token_and_update_access_and_expiration( if new_expires_at_utc <= current_time_utc: self.logger.warning( - f"Session expiration time '{new_expires_at_utc}' is earlier than current time '{current_time_utc}'.") + f"Session expiration time '{new_expires_at_utc}' is earlier than current time '{current_time_utc}'." + ) return False - select_stmt = text(f""" + select_stmt = text( + f""" SELECT UserID, ExpiresAt FROM {self.table_name} WHERE SessionToken = :token - """) + """ + ) session_data = conn.execute(select_stmt, {"token": token}).fetchone() if not session_data: @@ -203,41 +217,48 @@ def get_active_user_id_by_token_and_update_access_and_expiration( session_dict = dict(session_data._mapping) - if cast_db_datetime_to_utc(session_dict['ExpiresAt']) <= current_time_utc: + if cast_db_datetime_to_utc(session_dict["ExpiresAt"]) <= current_time_utc: self.logger.info( - f"Session for token '{token[:8]}...' has expired at {session_dict['ExpiresAt']}, cleaning.") + f"Session for token '{token[:8]}...' has expired at {session_dict['ExpiresAt']}, cleaning." + ) self.delete_session_by_token(conn, token=token, actor_user_id=None) return False - update_stmt = text(f""" + update_stmt = text( + f""" UPDATE {self.table_name} SET LastAccessedAt = NOW(), ExpiresAt = :expires_at WHERE SessionToken = :token - """) + """ + ) conn.execute(update_stmt, {"token": token, "expires_at": new_expires_at_utc}) return True def delete_session_by_token( - self, conn: Connection, *, token: str, actor_user_id: Optional[int] = None + self, conn: Connection, *, token: str, actor_user_id: Optional[int] = None ) -> bool: """ Deletes a session by its token (e.g., for logout). actor_user_id is the user performing the deletion (could be self or an admin). Returns True if a session was deleted, False otherwise. """ - self._set_actor_session_variable(conn, actor_user_id) # If session deletion needs to be audited via trigger + self._set_actor_session_variable( + conn, actor_user_id + ) # If session deletion needs to be audited via trigger stmt = text(f"DELETE FROM {self.table_name} WHERE SessionToken = :token") result = conn.execute(stmt, {"token": token}) deleted_count = result.rowcount if deleted_count > 0: - print(f"INFO: UserSessionCRUD - Session with Token '{token[:8]}...' deleted by actor_id '{actor_user_id}'.") + print( + f"INFO: UserSessionCRUD - Session with Token '{token[:8]}...' deleted by actor_id '{actor_user_id}'." + ) return deleted_count > 0 def delete_all_sessions_for_user( - self, conn: Connection, *, user_id: int, actor_user_id: Optional[int] = None + self, conn: Connection, *, user_id: int, actor_user_id: Optional[int] = None ) -> int: """ Deletes all sessions for a given UserID (e.g., "logout from all devices"). @@ -252,7 +273,8 @@ def delete_all_sessions_for_user( deleted_count = result.rowcount if deleted_count > 0: print( - f"INFO: UserSessionCRUD - Deleted {deleted_count} sessions for UserID '{user_id}' by actor_id '{actor_user_id}'.") + f"INFO: UserSessionCRUD - Deleted {deleted_count} sessions for UserID '{user_id}' by actor_id '{actor_user_id}'." + ) return deleted_count diff --git a/src/backend/app/services/address_service.py b/src/backend/app/services/address_service.py index 8fb6480..fcdf4c1 100644 --- a/src/backend/app/services/address_service.py +++ b/src/backend/app/services/address_service.py @@ -368,15 +368,3 @@ async def delete_address_for_user( return False # Or raise an exception if this is unexpected return True - -# --- 实例化和依赖注入 (通常在 deps.py 或应用组装层) --- -# from backend.app.crud.address_crud import address_crud_instance -# from backend.app.crud.user_crud import user_crud_instance -# -# address_service_instance = AddressService( -# address_crud=address_crud_instance, -# user_crud=user_crud_instance -# ) -# -# def get_address_service() -> AddressService: # FastAPI Depends -# return address_service_instance diff --git a/src/backend/app/services/auth_service.py b/src/backend/app/services/auth_service.py index 63d39c7..5d2a40b 100644 --- a/src/backend/app/services/auth_service.py +++ b/src/backend/app/services/auth_service.py @@ -57,10 +57,6 @@ async def authenticate_user( logger.info(f"Password mismatch for User {user_for_auth}") return None # 密码不匹配 - # (可选) 检查账户状态,例如 is_active - # if not user_for_auth.is_active: - # raise AuthenticationException(detail="Account is inactive.") - return user_for_auth async def login_user( @@ -200,21 +196,3 @@ async def logout_all_user_sessions( conn, user_id=user_id_to_logout, actor_user_id=actor_user_id ) return deleted_count - - -# --- 如何实例化和注入 (通常在 deps.py 或主应用组装时) --- -# from backend.app.crud.user_crud import user_crud_instance -# from backend.app.crud.user_session_crud import user_session_crud_instance -# from backend.app.utils.security import verify_password, create_access_token, decode_access_token -# -# auth_service_instance = AuthService( -# user_crud=user_crud_instance, -# user_session_crud=user_session_crud_instance, -# verify_password_func=verify_password, -# create_jwt_func=create_access_token, -# decode_jwt_func=decode_access_token -# ) -# -# 然后在 FastAPI 的 Depends 中提供这个 auth_service_instance -# def get_auth_service() -> AuthService: -# return auth_service_instance diff --git a/src/backend/app/services/cart_service.py b/src/backend/app/services/cart_service.py index b9428cd..fd05a54 100644 --- a/src/backend/app/services/cart_service.py +++ b/src/backend/app/services/cart_service.py @@ -206,15 +206,3 @@ async def clear_cart( conn=db, user_id=user_id, actor_id=actor_id ) return deleted_count - -# --- 实例化和依赖注入 (通常在 deps.py 或应用组装层) --- -# from backend.app.crud.cart_item_crud import cart_item_crud_instance -# from backend.app.crud.product_crud import product_crud_instance # 你的实际 ProductCRUD 实例 -# -# cart_service_instance = CartService( -# cart_item_crud=cart_item_crud_instance, -# product_crud=product_crud_instance -# ) -# -# def get_cart_service() -> CartService: -# return cart_service_instance diff --git a/src/openapi.json b/src/openapi.json deleted file mode 100644 index 881b38a..0000000 --- a/src/openapi.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/api/v1/user/register":{"post":{"tags":["API V1","User Accounts"],"summary":"Register User","description":"注册新用户。\n:param user_in: 用户创建数据模型\n:param db: 数据库连接\n:param user_service: 用户服务实例\n:param performing_user_id: 执行操作的用户 ID(通常是管理员或NULL)\n:return: 注册成功的用户响应模型","operationId":"register_user_api_v1_user_register_post","parameters":[{"name":"performing_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Performing User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/user/me":{"get":{"tags":["API V1","User Accounts","Users"],"summary":"Get Current User Information","description":"获取当前已认证用户的信息。\n如果token无效或会话过期,此端点将不会被执行,而是返回401错误。","operationId":"read_users_me_api_v1_user_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product":{"post":{"tags":["API V1","Products"],"summary":"Create Product","description":"创建新商品\n:param product_in: 商品创建数据模型\n:param db: 数据库连接\n:param current_user_id: 当前用户ID(应该由认证中间件提供)\n:param product_service: 产品服务实例\n:return: 创建成功的商品响应模型","operationId":"create_product_api_v1_product_post","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API V1","Products"],"summary":"List Products","description":"获取商品列表,支持按店铺、分类筛选或搜索(保留兼容旧版接口)\n:param query_params: 商品查询参数\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 商品列表","operationId":"list_products_api_v1_product_get","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}},{"name":"store_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Store Id"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Category Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponse"},"title":"Response List Products Api V1 Product Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}":{"get":{"tags":["API V1","Products"],"summary":"Get Product","description":"获取特定商品的详细信息\n:param product_id: 商品ID\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 商品详细信息","operationId":"get_product_api_v1_product__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductWithCategoryInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["API V1","Products"],"summary":"Update Product","description":"更新商品信息\n:param product_id: 商品ID\n:param product_update: 商品更新数据模型\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 更新后的商品信息","operationId":"update_product_api_v1_product__product_id__put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Products"],"summary":"Delete Product","description":"删除商品(将状态设置为DISCONTINUED)\n:param product_id: 商品ID\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例","operationId":"delete_product_api_v1_product__product_id__delete","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/customer":{"get":{"tags":["API V1","Products"],"summary":"List Products For Customer","description":"获取面向普通用户的商品列表,只返回ACTIVE状态的商品\n:param query_params: 商品查询参数\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 商品列表","operationId":"list_products_for_customer_api_v1_product_customer_get","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}},{"name":"TextInclude","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Textinclude"}},{"name":"CategoryID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Categoryid"}},{"name":"StoreID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Storeid"}},{"name":"MinPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Minprice"}},{"name":"MaxPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Maxprice"}},{"name":"OrderBy","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderby"}},{"name":"Offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponse"},"title":"Response List Products For Customer Api V1 Product Customer Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/merchant":{"get":{"tags":["API V1","Products"],"summary":"List Products For Merchant","description":"获取面向商家的商品列表,支持按商品状态筛选\n:param query_params: 商品查询参数\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 商品列表","operationId":"list_products_for_merchant_api_v1_product_merchant_get","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}},{"name":"TextInclude","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Textinclude"}},{"name":"CategoryID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Categoryid"}},{"name":"StoreID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Storeid"}},{"name":"MinPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Minprice"}},{"name":"MaxPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Maxprice"}},{"name":"OrderBy","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderby"}},{"name":"Offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"ProductStatus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productstatus"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponse"},"title":"Response List Products For Merchant Api V1 Product Merchant Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/admin":{"get":{"tags":["API V1","Products"],"summary":"List Products For Admin","description":"获取面向管理员的商品列表,支持完整的筛选和排序功能\n:param query_params: 商品查询参数\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 商品列表","operationId":"list_products_for_admin_api_v1_product_admin_get","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}},{"name":"TextInclude","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Textinclude"}},{"name":"CategoryID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Categoryid"}},{"name":"StoreID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Storeid"}},{"name":"MinPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Minprice"}},{"name":"MaxPrice","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Maxprice"}},{"name":"OrderBy","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderby"}},{"name":"Offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"ProductStatus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productstatus"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponse"},"title":"Response List Products For Admin Api V1 Product Admin Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/stock":{"put":{"tags":["API V1","Products"],"summary":"Update Product Stock","description":"更新商品库存\n:param product_id: 商品ID\n:param stock_change: 库存变化量(正数增加,负数减少)\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:param product_service: 产品服务实例\n:return: 更新后的商品信息","operationId":"update_product_stock_api_v1_product__product_id__stock_put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"stock_change","in":"query","required":true,"schema":{"type":"integer","title":"Stock Change"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/category":{"post":{"tags":["API V1","Product Categories"],"summary":"Create Category","description":"创建新商品分类\n:param category_in: 分类创建数据模型\n:param db: 数据库连接\n:param current_user_id: 当前用户ID(应该由认证中间件提供)\n:return: 创建成功的分类响应模型","operationId":"create_category_api_v1_category_post","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API V1","Product Categories"],"summary":"List Categories","description":"获取分类列表,如果指定了parent_id,则获取该分类的子分类,否则获取所有一级分类\n:param parent_id: 父分类ID,可选\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:return: 分类列表","operationId":"list_categories_api_v1_category_get","parameters":[{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryResponse"},"title":"Response List Categories Api V1 Category Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/category/tree":{"get":{"tags":["API V1","Product Categories"],"summary":"Get Category Tree","description":"获取分类树结构\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:return: 树形结构的分类列表","operationId":"get_category_tree_api_v1_category_tree_get","parameters":[{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryWithChildren"},"title":"Response Get Category Tree Api V1 Category Tree Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/category/{category_id}":{"get":{"tags":["API V1","Product Categories"],"summary":"Get Category","description":"获取特定分类的详细信息\n:param category_id: 分类ID\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:return: 分类详细信息","operationId":"get_category_api_v1_category__category_id__get","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["API V1","Product Categories"],"summary":"Update Category","description":"更新分类信息\n:param category_id: 分类ID\n:param category_update: 分类更新数据模型\n:param db: 数据库连接\n:param current_user_id: 当前用户ID\n:return: 更新后的分类信息","operationId":"update_category_api_v1_category__category_id__put","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Product Categories"],"summary":"Delete Category","description":"删除分类\n:param category_id: 分类ID\n:param db: 数据库连接\n:param current_user_id: 当前用户ID","operationId":"delete_category_api_v1_category__category_id__delete","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}},{"name":"current_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/token":{"post":{"tags":["API V1","Authentication","Authentication"],"summary":"Login For Access Token","description":"用户登录以获取访问令牌。\n使用 OAuth2PasswordRequestForm,客户端应以表单形式提交 `username` 和 `password`。\n这里的 `form_data.username` 将被用作 `identifier`。","operationId":"login_for_access_token_api_v1_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_for_access_token_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["API V1","Authentication","Authentication"],"summary":"Logout Current Session","description":"登出当前用户的当前会话。\n客户端必须在其 Authorization header 中提供有效的 Bearer token。","operationId":"logout_current_session_api_v1_auth_logout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Logout Current Session Api V1 Auth Logout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout-all":{"post":{"tags":["API V1","Authentication","Authentication"],"summary":"Logout All Sessions for Current User","description":"登出当前用户的所有会话(所有设备)。","operationId":"logout_all_sessions_api_v1_auth_logout_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Logout All Sessions Api V1 Auth Logout All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cart/":{"get":{"tags":["API V1","Shopping Cart","Shopping Cart"],"summary":"获取当前用户的购物车内容","description":"检索当前已认证用户的完整购物车信息。\n包括所有商品条目、条目数量。","operationId":"get_user_cart_api_v1_cart__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Shopping Cart","Shopping Cart"],"summary":"清空当前用户的购物车","description":"删除当前已认证用户购物车中的所有商品条目。","operationId":"clear_user_cart_api_v1_cart__delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cart/items":{"post":{"tags":["API V1","Shopping Cart","Shopping Cart"],"summary":"向购物车添加新商品或增加已存在商品的数量","description":"将指定商品添加到当前用户的购物车。\n如果商品已存在于购物车中,通常会增加其数量(具体行为由服务层定义)。\n需要提供 `ProductID` 和 `Quantity`。","operationId":"add_item_to_cart_api_v1_cart_items_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartItemCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cart/items/{cart_item_id}":{"put":{"tags":["API V1","Shopping Cart","Shopping Cart"],"summary":"更新购物车中特定商品的数量","description":"更新购物车中指定 `CartItemID` 的商品数量。\n新的 `Quantity` 必须大于0。","operationId":"update_cart_item_quantity_api_v1_cart_items__cart_item_id__put","parameters":[{"name":"cart_item_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"购物车条目ID","description":"要更新的购物车条目的唯一ID"},"description":"要更新的购物车条目的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartItemUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Shopping Cart","Shopping Cart"],"summary":"从购物车中移除特定商品条目","description":"根据 `CartItemID` 从当前用户的购物车中移除一个商品条目。","operationId":"remove_cart_item_api_v1_cart_items__cart_item_id__delete","parameters":[{"name":"cart_item_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"购物车条目ID","description":"要移除的购物车条目的唯一ID"},"description":"要移除的购物车条目的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/address/":{"post":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"为当前用户添加新的收货地址","description":"为当前认证的用户创建一个新的收货地址。\n如果 `IsDefault` 在请求中为 `true`,服务层需要处理将其他地址设为非默认的逻辑,\n并更新用户的 `DefaultAddressID`。","operationId":"add_new_address_api_v1_address__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"获取当前用户的所有收货地址","description":"检索当前已认证用户的所有收货地址列表。","operationId":"get_user_addresses_api_v1_address__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/address/{address_id}":{"get":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"获取特定收货地址的详情","description":"根据 AddressID 获取单个收货地址的详细信息。\n需要验证该地址是否属于当前用户。","operationId":"get_address_by_id_api_v1_address__address_id__get","parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"地址ID","description":"要检索的地址的唯一ID"},"description":"要检索的地址的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"更新现有收货地址的详情","description":"更新指定 `AddressID` 的收货地址的文本内容(收货人、电话、地址详情)。\n此端点不处理将地址设为默认的逻辑。\n需要验证该地址是否属于当前用户。","operationId":"update_address_details_api_v1_address__address_id__put","parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"地址ID","description":"要更新的地址的唯一ID"},"description":"要更新的地址的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"删除用户的特定收货地址","description":"根据 `AddressID` 删除当前用户的某个收货地址。\n需要验证该地址是否属于当前用户。\n如果删除的是默认地址,服务层需要处理 `User.DefaultAddressID` 的更新 (例如设为 NULL)。","operationId":"delete_address_api_v1_address__address_id__delete","parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"地址ID","description":"要删除的地址的唯一ID"},"description":"要删除的地址的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/address/{address_id}/set-default":{"post":{"tags":["API V1","Shipping Addresses","Shipping Addresses"],"summary":"将指定地址设为当前用户的默认收货地址","description":"将指定的 `AddressID` 设置为当前认证用户的默认收货地址。\n服务层需要处理以下逻辑:\n1. 验证 `address_id` 属于 `current_user`。\n2. 将该用户的所有其他地址的 `IsDefault` 设为 `false`。\n3. 将目标 `address_id` 的 `IsDefault` 设为 `true`。\n4. 更新 `User` 表中该用户的 `DefaultAddressID` 字段。","operationId":"set_address_as_default_api_v1_address__address_id__set_default_post","parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"地址ID","description":"要设为默认的地址的唯一ID"},"description":"要设为默认的地址的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetDefaultAddressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/order/create":{"post":{"tags":["API V1","Orders","Orders"],"summary":"创建新订单 (基于购物车项目)","description":"为当前认证的用户创建一个或多个新订单(可能按店铺拆分)。\n- 从请求中获取要购买的购物车项目列表和收货地址。\n- 服务层将处理库存扣减。\n- 服务层将创建支付事务,并将订单关联到此事务。\n- 响应包含支付事务ID、支付URL(如果适用)以及创建的订单列表。","operationId":"create_order_from_cart_items_api_v1_order_create_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/order/":{"get":{"tags":["API V1","Orders","Orders"],"summary":"获取当前用户的所有订单列表,应当是一个按照创建时间降序的列表。","description":"检索当前已认证用户的所有订单列表,支持分页。","operationId":"get_my_orders_api_v1_order__get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/order/{order_id}":{"get":{"tags":["API V1","Orders","Orders"],"summary":"获取单个订单的详细信息","description":"根据 OrderID 获取单个订单的详细信息。\n服务层需要验证该订单是否属于当前用户(或当前用户是否为管理员)。","operationId":"get_order_details_api_v1_order__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"订单ID","description":"要检索的订单的唯一ID"},"description":"要检索的订单的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderViewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/order/{order_id}/status":{"put":{"tags":["API V1","Orders","Orders"],"summary":"更新订单状态 (例如:用户取消或确认收货)","description":"允许用户更新其订单的状态。\n例如:\n- 用户可以将 `PENDING_PAYMENT` 或 `PROCESSING` 状态的订单取消为 `CANCELLED_BY_USER`。\n- 用户可以将 `SHIPPED` 状态的订单更新为 `DELIVERED` (确认收货)。\n服务层需要包含严格的状态转换逻辑和权限检查。","operationId":"update_order_status_by_user_api_v1_order__order_id__status_put","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"订单ID","description":"要更新状态的订单的唯一ID"},"description":"要更新状态的订单的唯一ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderUpdateStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/{payment_transaction_id}/simulate-pay":{"post":{"tags":["API V1","Payments","Payments"],"summary":"模拟用户确认支付并处理支付事务","description":"模拟用户在其选择的支付方式上“确认支付”后的后端处理流程。\n此端点将:\n1. 验证 payment_transaction_id 是否有效且属于当前用户。\n2. 根据 `payment_details_in.SimulatedPaymentMethod` (例如 'mock_success_pay') 模拟支付成功或失败。\n3. 更新数据库中 `PaymentTransaction` 表的状态。\n4. 如果支付成功,更新所有关联 `Order` 表的状态。\n5. 返回一个包含最终支付状态和用户应重定向到的URL的响应。","operationId":"simulate_payment_processing_api_v1_payment__payment_transaction_id__simulate_pay_post","parameters":[{"name":"payment_transaction_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"description":"要处理的系统内部支付事务ID。","title":"Payment Transaction Id"},"description":"要处理的系统内部支付事务ID。"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulatedExternPaymentResponse"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentProcessingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/{payment_transaction_id}/status":{"get":{"tags":["API V1","Payments","Payments"],"summary":"查询特定支付事务的状态","description":"查询特定支付事务的当前状态。\n服务层需要验证该支付事务是否属于当前用户。","operationId":"get_payment_transaction_status_api_v1_payment__payment_transaction_id__status_get","parameters":[{"name":"payment_transaction_id","in":"path","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"description":"要查询状态的系统内部支付事务ID。","title":"Payment Transaction Id"},"description":"要查询状态的系统内部支付事务ID。"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store/info/{store_id}":{"get":{"tags":["API V1","Store","Store"],"summary":"获取店铺信息。当前默认都是普通顾客,只能查看ACTIVE的店铺","description":"获取指定店铺的信息。","operationId":"get_store_info_api_v1_store_info__store_id__get","parameters":[{"name":"store_id","in":"path","required":true,"schema":{"type":"integer","description":"店铺 ID","title":"Store Id"},"description":"店铺 ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store/owner/{owner_user_id}":{"get":{"tags":["API V1","Store","Store"],"summary":"获取店主的所有店铺","description":"获取指定店主的所有店铺。","operationId":"get_stores_by_owner_api_v1_store_owner__owner_user_id__get","parameters":[{"name":"owner_user_id","in":"path","required":true,"schema":{"type":"integer","description":"店主用户 ID","title":"Owner User Id"},"description":"店主用户 ID"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store/list":{"get":{"tags":["API V1","Store","Store"],"summary":"获取所有店铺的简要信息。只能查看ACTIVE的店铺","description":"获取所有店铺的简要信息。","operationId":"get_all_stores_simple_api_v1_store_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreListSimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store/list-full":{"get":{"tags":["API V1","Store","Store"],"summary":"获取所有店铺的完整信息。只能查看ACTIVE的店铺","description":"获取所有店铺的信息。","operationId":"get_all_stores_api_v1_store_list_full_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change":{"post":{"tags":["API V1","Store Change Requests"],"summary":"Create Store Change Request","description":"创建新店铺变更请求\n:param change_request_in: 变更请求创建数据模型\n:param db: 数据库连接\n:param current_user: 当前用户(由认证中间件提供)\n:param change_request_service: 变更请求服务实例\n:return: 创建成功的变更请求响应模型","operationId":"create_store_change_request_api_v1_store_change_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API V1","Store Change Requests"],"summary":"Filter Store Change Requests","description":"过滤店铺变更请求列表\n:param query_params: 查询参数\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"filter_store_change_requests_api_v1_store_change_get","parameters":[{"name":"StoreID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Storeid"}},{"name":"RequestingUserID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Requestinguserid"}},{"name":"RequestType","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requesttype"}},{"name":"Status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"AdminReviewerID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Adminreviewerid"}},{"name":"StartDate","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startdate"}},{"name":"EndDate","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enddate"}},{"name":"Offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StoreChangeRequestResponse"},"title":"Response Filter Store Change Requests Api V1 Store Change Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change/{request_id}":{"get":{"tags":["API V1","Store Change Requests"],"summary":"Get Store Change Request","description":"获取特定店铺变更请求的详细信息\n:param request_id: 变更请求ID\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求详细信息","operationId":"get_store_change_request_api_v1_store_change__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["API V1","Store Change Requests"],"summary":"Update Store Change Request","description":"更新店铺变更请求信息\n:param request_id: 变更请求ID\n:param update_data: 更新数据\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 更新后的变更请求信息","operationId":"update_store_change_request_api_v1_store_change__request_id__put","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Store Change Requests"],"summary":"Cancel Store Change Request","description":"取消店铺变更请求(用户自行取消)\n:param request_id: 变更请求ID\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例","operationId":"cancel_store_change_request_api_v1_store_change__request_id__delete","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change/by-store/{store_id}":{"get":{"tags":["API V1","Store Change Requests"],"summary":"Get Store Change Requests By Store","description":"获取指定店铺的变更请求列表\n:param store_id: 店铺ID\n:param status: 请求状态,可选\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_store_change_requests_by_store_api_v1_store_change_by_store__store_id__get","parameters":[{"name":"store_id","in":"path","required":true,"schema":{"type":"integer","title":"Store Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StoreChangeRequestResponse"},"title":"Response Get Store Change Requests By Store Api V1 Store Change By Store Store Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change/by-user/{user_id}":{"get":{"tags":["API V1","Store Change Requests"],"summary":"Get Store Change Requests By User","description":"获取指定用户的店铺变更请求列表\n:param user_id: 用户ID\n:param status: 请求状态,可选\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_store_change_requests_by_user_api_v1_store_change_by_user__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StoreChangeRequestResponse"},"title":"Response Get Store Change Requests By User Api V1 Store Change By User User Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change/admin/pending":{"get":{"tags":["API V1","Store Change Requests"],"summary":"Get All Pending Store Change Requests","description":"获取所有待审核的店铺变更请求列表(管理员专用)\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_all_pending_store_change_requests_api_v1_store_change_admin_pending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StoreChangeRequestResponse"},"title":"Response Get All Pending Store Change Requests Api V1 Store Change Admin Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/store-change/{request_id}/admin":{"put":{"tags":["API V1","Store Change Requests"],"summary":"Admin Update Store Change Request","description":"管理员审核店铺变更请求\n:param request_id: 变更请求ID\n:param admin_update: 管理员更新数据\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 更新后的变更请求信息","operationId":"admin_update_store_change_request_api_v1_store_change__request_id__admin_put","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestAdminUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change":{"post":{"tags":["API V1","Product Change Requests"],"summary":"Create Product Change Request","description":"创建新商品变更请求\n:param change_request_in: 变更请求创建数据模型\n:param db: 数据库连接\n:param current_user: 当前用户(由认证中间件提供)\n:param change_request_service: 变更请求服务实例\n:return: 创建成功的变更请求响应模型","operationId":"create_product_change_request_api_v1_product_change_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API V1","Product Change Requests"],"summary":"Filter Product Change Requests","description":"过滤商品变更请求列表\n:param query_params: 查询参数\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"filter_product_change_requests_api_v1_product_change_get","parameters":[{"name":"ProductID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Productid"}},{"name":"StoreID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Storeid"}},{"name":"MerchantUserID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Merchantuserid"}},{"name":"RequestType","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requesttype"}},{"name":"Status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"AdminReviewerID","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Adminreviewerid"}},{"name":"StartDate","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startdate"}},{"name":"EndDate","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enddate"}},{"name":"Offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductChangeRequestResponse"},"title":"Response Filter Product Change Requests Api V1 Product Change Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/{request_id}":{"get":{"tags":["API V1","Product Change Requests"],"summary":"Get Product Change Request","description":"获取特定商品变更请求的详细信息\n:param request_id: 变更请求ID\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求详细信息","operationId":"get_product_change_request_api_v1_product_change__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["API V1","Product Change Requests"],"summary":"Update Product Change Request","description":"更新商品变更请求信息\n:param request_id: 变更请求ID\n:param update_data: 更新数据\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 更新后的变更请求信息","operationId":"update_product_change_request_api_v1_product_change__request_id__put","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API V1","Product Change Requests"],"summary":"Cancel Product Change Request","description":"取消商品变更请求(商家自行取消)\n:param request_id: 变更请求ID\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例","operationId":"cancel_product_change_request_api_v1_product_change__request_id__delete","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/by-product/{product_id}":{"get":{"tags":["API V1","Product Change Requests"],"summary":"Get Product Change Requests By Product","description":"获取指定商品的变更请求列表\n:param product_id: 商品ID\n:param request_status: 请求状态,可选\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_product_change_requests_by_product_api_v1_product_change_by_product__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductChangeRequestResponse"},"title":"Response Get Product Change Requests By Product Api V1 Product Change By Product Product Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/by-store/{store_id}":{"get":{"tags":["API V1","Product Change Requests"],"summary":"Get Product Change Requests By Store","description":"获取指定店铺的商品变更请求列表\n:param store_id: 店铺ID\n:param request_status: 请求状态,可选\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_product_change_requests_by_store_api_v1_product_change_by_store__store_id__get","parameters":[{"name":"store_id","in":"path","required":true,"schema":{"type":"integer","title":"Store Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductChangeRequestResponse"},"title":"Response Get Product Change Requests By Store Api V1 Product Change By Store Store Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/by-merchant/{merchant_id}":{"get":{"tags":["API V1","Product Change Requests"],"summary":"Get Product Change Requests By Merchant","description":"获取指定商家的商品变更请求列表\n:param merchant_id: 商家用户ID\n:param request_status: 请求状态,可选\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_product_change_requests_by_merchant_api_v1_product_change_by_merchant__merchant_id__get","parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"integer","title":"Merchant Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductChangeRequestResponse"},"title":"Response Get Product Change Requests By Merchant Api V1 Product Change By Merchant Merchant Id Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/admin/pending":{"get":{"tags":["API V1","Product Change Requests"],"summary":"Get All Pending Product Change Requests","description":"获取所有待审核的商品变更请求列表(管理员专用)\n:param limit: 返回结果数量限制\n:param offset: 分页偏移量\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 变更请求列表","operationId":"get_all_pending_product_change_requests_api_v1_product_change_admin_pending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductChangeRequestResponse"},"title":"Response Get All Pending Product Change Requests Api V1 Product Change Admin Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-change/{request_id}/admin":{"put":{"tags":["API V1","Product Change Requests"],"summary":"Admin Update Product Change Request","description":"管理员审核商品变更请求\n:param request_id: 变更请求ID\n:param admin_update: 管理员更新数据\n:param db: 数据库连接\n:param current_user: 当前用户\n:param change_request_service: 变更请求服务实例\n:return: 更新后的变更请求信息","operationId":"admin_update_product_change_request_api_v1_product_change__request_id__admin_put","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"用于用户认证的 Bearer Token:`Bearer `","title":"Authorization"},"description":"用于用户认证的 Bearer Token:`Bearer `"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestAdminUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductChangeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/test_db":{"get":{"summary":"Test Db","operationId":"test_db_test_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AddressCreateRequest":{"properties":{"RecipientName":{"type":"string","maxLength":255,"minLength":1,"title":"Recipientname","description":"收货人姓名。"},"PhoneNumber":{"type":"string","maxLength":50,"minLength":5,"pattern":"^\\+?[0-9\\s\\-\\(\\)]+$","title":"Phonenumber","description":"收货人电话号码。"},"FullAddress_Text":{"type":"string","maxLength":1000,"minLength":5,"title":"Fulladdress Text","description":"完整收货地址(省市区、详细地址、邮编等)。"}},"type":"object","required":["RecipientName","PhoneNumber","FullAddress_Text"],"title":"AddressCreateRequest","description":"客户端创建新地址时发送的数据。\nUserID 将从已认证的用户中获取。"},"AddressListResponse":{"properties":{"Addresses":{"items":{"$ref":"#/components/schemas/AddressResponse"},"type":"array","title":"Addresses","description":"用户的地址列表。"},"TotalCount":{"type":"integer","title":"Totalcount","description":"地址总数。"}},"type":"object","required":["Addresses","TotalCount"],"title":"AddressListResponse","description":"API 返回用户的所有地址列表时使用的数据模型。"},"AddressResponse":{"properties":{"RecipientName":{"type":"string","maxLength":255,"minLength":1,"title":"Recipientname","description":"收货人姓名。"},"PhoneNumber":{"type":"string","maxLength":50,"minLength":5,"pattern":"^\\+?[0-9\\s\\-\\(\\)]+$","title":"Phonenumber","description":"收货人电话号码。"},"FullAddress_Text":{"type":"string","maxLength":1000,"minLength":5,"title":"Fulladdress Text","description":"完整收货地址(省市区、详细地址、邮编等)。"},"AddressID":{"type":"integer","title":"Addressid","description":"地址的唯一ID。"},"UserID":{"type":"integer","title":"Userid","description":"所属用户的ID。"},"IsDefault":{"type":"boolean","title":"Isdefault","description":"是否为默认地址。","default":false}},"type":"object","required":["RecipientName","PhoneNumber","FullAddress_Text","AddressID","UserID"],"title":"AddressResponse","description":"从 API 返回地址信息时使用的数据模型。"},"AddressUpdateRequest":{"properties":{"RecipientName":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Recipientname","description":"新的收货人姓名 (可选)。"},"PhoneNumber":{"anyOf":[{"type":"string","maxLength":50,"minLength":5,"pattern":"^\\+?[0-9\\s\\-\\(\\)]+$"},{"type":"null"}],"title":"Phonenumber","description":"新的收货人电话号码 (可选)。"},"FullAddress_Text":{"anyOf":[{"type":"string","maxLength":1000,"minLength":5},{"type":"null"}],"title":"Fulladdress Text","description":"新的完整收货地址 (可选)。"}},"type":"object","title":"AddressUpdateRequest","description":"客户端更新现有地址时发送的数据。\n此 schema 用于更新地址的收件人姓名、电话号码和完整地址。不处理 IsDefault 字段(由专门的 API 端点处理)。\n所有字段都是可选的。"},"Body_login_for_access_token_api_v1_auth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_for_access_token_api_v1_auth_token_post"},"CartActionResponse":{"properties":{"Message":{"type":"string","title":"Message","description":"操作结果消息。"},"Detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail","description":"可选的详细信息。"}},"type":"object","required":["Message"],"title":"CartActionResponse","description":"用于购物车操作(如清空、删除条目)的通用响应。"},"CartItemCreateRequest":{"properties":{"ProductID":{"type":"integer","title":"Productid","description":"商品的唯一ID。"},"Quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"商品数量,必须大于0。"}},"type":"object","required":["ProductID","Quantity"],"title":"CartItemCreateRequest","description":"客户端将商品添加到购物车时发送的数据。\nUserID 将从已认证的用户中获取。\nPriceAtAddition 将由服务层在添加时从产品信息中获取。"},"CartItemResponse":{"properties":{"ProductID":{"type":"integer","title":"Productid","description":"商品的唯一ID。"},"Quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"商品数量,必须大于0。"},"CartItemID":{"type":"integer","title":"Cartitemid","description":"购物车项目的唯一ID。"},"UserID":{"type":"integer","title":"Userid","description":"所属用户的ID。"},"PriceAtAddition":{"type":"number","title":"Priceataddition","description":"商品加入购物车时的单价。"},"AddedDate":{"type":"string","format":"date-time","title":"Addeddate","description":"商品添加到购物车的时间。"},"ProductName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productname","description":"商品名称。"},"MainImageURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mainimageurl","description":"商品主图片URL。"},"Price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"商品当前价格。"}},"type":"object","required":["ProductID","Quantity","CartItemID","UserID","PriceAtAddition","AddedDate"],"title":"CartItemResponse","description":"从 API 返回购物车项目信息时使用的数据模型。"},"CartItemUpdateRequest":{"properties":{"Quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"新的商品数量,必须大于0。"}},"type":"object","required":["Quantity"],"title":"CartItemUpdateRequest","description":"客户端更新购物车中商品数量时发送的数据。"},"CartResponse":{"properties":{"Items":{"items":{"$ref":"#/components/schemas/CartItemResponse"},"type":"array","title":"Items","description":"购物车中的商品项目列表。"},"TotalItems":{"type":"integer","title":"Totalitems","description":"购物车中商品项目的总数。"}},"type":"object","required":["Items","TotalItems"],"title":"CartResponse","description":"API 返回整个购物车内容时使用的数据模型。"},"CategoryCreate":{"properties":{"CategoryName":{"type":"string","maxLength":255,"minLength":1,"title":"Categoryname","description":"分类名称,长度在1到255个字符之间。"},"CategoryDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorydescription","description":"分类描述,可选。"},"ParentCategoryID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parentcategoryid","description":"父分类ID,可选。如果为空,则表示一级分类。"}},"type":"object","required":["CategoryName"],"title":"CategoryCreate","description":"创建新分类时,API 端点期望的分类数据模型。"},"CategoryResponse":{"properties":{"CategoryName":{"type":"string","maxLength":255,"minLength":1,"title":"Categoryname","description":"分类名称,长度在1到255个字符之间。"},"CategoryDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorydescription","description":"分类描述,可选。"},"ParentCategoryID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parentcategoryid","description":"父分类ID,可选。如果为空,则表示一级分类。"},"CategoryID":{"type":"integer","title":"Categoryid","description":"分类的唯一标识符。"}},"type":"object","required":["CategoryName","CategoryID"],"title":"CategoryResponse","description":"分类响应模型,包含分类的基本信息和额外信息。"},"CategoryUpdate":{"properties":{"CategoryName":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Categoryname","description":"分类名称,长度在1到255个字符之间。"},"CategoryDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorydescription","description":"分类描述,可选。"},"ParentCategoryID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parentcategoryid","description":"父分类ID,可选。如果为空,则表示一级分类。"}},"type":"object","title":"CategoryUpdate","description":"更新分类信息时,API 端点期望的分类数据模型。\n包含可选字段。"},"CategoryWithChildren":{"properties":{"CategoryName":{"type":"string","maxLength":255,"minLength":1,"title":"Categoryname","description":"分类名称,长度在1到255个字符之间。"},"CategoryDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorydescription","description":"分类描述,可选。"},"ParentCategoryID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parentcategoryid","description":"父分类ID,可选。如果为空,则表示一级分类。"},"CategoryID":{"type":"integer","title":"Categoryid","description":"分类的唯一标识符。"},"Children":{"anyOf":[{"items":{"$ref":"#/components/schemas/CategoryWithChildren"},"type":"array"},{"type":"null"}],"title":"Children","description":"子分类列表。","default":[]}},"type":"object","required":["CategoryName","CategoryID"],"title":"CategoryWithChildren","description":"包含子分类信息的分类响应模型"},"CreatedOrderDetailResponse":{"properties":{"OrderID":{"type":"integer","title":"Orderid","description":"新创建的订单的ID。"},"StoreID":{"type":"integer","title":"Storeid","description":"此订单所属的店铺ID。"},"FinalAmountForThisOrder":{"type":"string","title":"Finalamountforthisorder","description":"此特定订单的最终应付金额。"},"OrderStatus":{"$ref":"#/components/schemas/OrderStatusEnum","description":"此订单的初始状态 (通常是 PENDING_PAYMENT)。"},"Items":{"items":{"$ref":"#/components/schemas/OrderItemDetailResponse"},"type":"array","title":"Items","description":"此订单包含的商品项。"}},"type":"object","required":["OrderID","StoreID","FinalAmountForThisOrder","OrderStatus","Items"],"title":"CreatedOrderDetailResponse","description":"在创建订单流程后,针对每个实际生成的(可能按店铺拆分的)订单的概要响应。\n会被嵌入到 InitiateOrderResponse 中。\n对应 DDL 中的 Order 表的部分字段。"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitiateOrderResponse":{"properties":{"PaymentTransactionID":{"type":"integer","title":"Paymenttransactionid","description":"为此批订单创建的支付事务的ID。"},"ExternalPaymentURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalpaymenturl","description":"重定向到第三方支付网关的URL (如果适用)。"},"TotalAmountDue":{"type":"string","title":"Totalamountdue","description":"需要支付的总金额 (对应 PaymentTransaction.TotalAmount)。"},"Currency":{"type":"string","title":"Currency","description":"货币类型,例如 CNY, USD。","default":"CNY"},"OrdersCreated":{"items":{"$ref":"#/components/schemas/CreatedOrderDetailResponse"},"type":"array","title":"Orderscreated","description":"本次操作创建的订单列表。"},"Message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"给用户的提示信息,例如“请在30分钟内完成支付”。"}},"type":"object","required":["PaymentTransactionID","TotalAmountDue","OrdersCreated"],"title":"InitiateOrderResponse","description":"创建订单流程(可能生成一个支付事务和多个订单)成功后的顶层响应。\n由 POST /api/v1/orders/ (创建订单) 端点返回。"},"OrderActionResponse":{"properties":{"Message":{"type":"string","title":"Message","description":"操作结果消息。"},"OrderID":{"type":"integer","title":"Orderid","description":"相关的订单ID。"},"NewStatus":{"anyOf":[{"$ref":"#/components/schemas/OrderStatusEnum"},{"type":"null"}],"description":"操作后的新订单状态 (可选)。"}},"type":"object","required":["Message","OrderID"],"title":"OrderActionResponse","description":"用于订单操作(如取消订单成功、状态更新成功)的通用简单响应。\n可被 PUT /api/v1/orders/{order_id}/status 或其他执行动作的端点使用。"},"OrderCreateRequest":{"properties":{"ShippingAddressID":{"type":"integer","title":"Shippingaddressid","description":"选择的收货地址ID。"},"Items":{"items":{"$ref":"#/components/schemas/OrderItemCreationInput"},"type":"array","minItems":1,"title":"Items","description":"要购买的购物车项目列表。"},"Notes_ByUser":{"anyOf":[{"type":"string","maxLength":65535},{"type":"null"}],"title":"Notes Byuser","description":"用户订单备注 (可选,对应 DDL 的 TEXT 类型)。"}},"type":"object","required":["ShippingAddressID","Items"],"title":"OrderCreateRequest","description":"客户端发起创建新订单请求时发送的数据。\n会被 POST /api/v1/orders/ (创建订单) 端点使用。"},"OrderItemCreationInput":{"properties":{"CartItemID":{"type":"integer","title":"Cartitemid","description":"要购买的购物车项目ID。"}},"type":"object","required":["CartItemID"],"title":"OrderItemCreationInput","description":"在创建订单请求中,指定要购买的购物车项目。\n会被 POST /api/v1/orders/ (创建订单) 端点使用,作为 OrderCreateRequest 的一部分。"},"OrderItemDetailResponse":{"properties":{"OrderItemID":{"type":"integer","title":"Orderitemid","description":"订单项目ID。"},"OrderID":{"type":"integer","title":"Orderid","description":"所属订单ID。"},"ProductID":{"type":"integer","title":"Productid","description":"商品ID。"},"StoreID":{"type":"integer","title":"Storeid","description":"所属店铺ID (冗余)。"},"Quantity":{"type":"integer","title":"Quantity","description":"购买数量。"},"PriceAtPurchase":{"type":"string","title":"Priceatpurchase","description":"购买时商品单价。"},"ProductNameAtPurchase":{"type":"string","title":"Productnameatpurchase","description":"购买时商品名称 (冗余)。"},"ProductImageURLAtPurchase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productimageurlatpurchase","description":"购买时商品主图URL (冗余, 可选)。"},"Subtotal":{"type":"string","title":"Subtotal","description":"小计金额 (PriceAtPurchase * Quantity)。"}},"type":"object","required":["OrderItemID","OrderID","ProductID","StoreID","Quantity","PriceAtPurchase","ProductNameAtPurchase","Subtotal"],"title":"OrderItemDetailResponse","description":"API 返回订单项详细信息时使用的数据模型。\n会被嵌入到各种订单相关的响应中。\n对应 DDL 中的 OrderItem 表。"},"OrderListResponse":{"properties":{"Orders":{"items":{"$ref":"#/components/schemas/OrderViewResponse"},"type":"array","title":"Orders","description":"订单列表。"},"TotalCount":{"type":"integer","title":"Totalcount","description":"符合条件的订单总数 (用于分页)。"},"Offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset","description":"当前分页的偏移量。"},"Limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"当前分页的每页数量。"}},"type":"object","required":["Orders","TotalCount"],"title":"OrderListResponse","description":"API 返回用户订单列表时使用的数据模型。\n会被 GET /api/v1/users/me/orders (获取用户所有订单) 端点使用。\n也会被管理员查看订单列表的端点使用 (可能带有额外过滤参数)。"},"OrderStatusEnum":{"type":"string","enum":["PENDING_PAYMENT","PAID_AND_PENDING_PROCESSING","PROCESSING_BY_MERCHANT","SHIPPED","DELIVERED","COMPLETED","CANCELLED_BY_USER","CANCELLED_BY_MERCHANT","CANCELLED_BY_SYSTEM"],"title":"OrderStatusEnum","description":"订单状态枚举 (基于 DDL)。\n会被 OrderViewResponse, CreatedOrderDetailResponse, OrderUpdateStatusRequest, OrderActionResponse 使用。"},"OrderUpdateStatusRequest":{"properties":{"NewStatus":{"$ref":"#/components/schemas/OrderStatusEnum","description":"新的订单状态。"},"TrackingNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trackingnumber","description":"物流追踪号 (如果状态更新为 SHIPPED,由商家或管理员填写)。"},"UserNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usernotes","description":"用户备注 (例如取消原因)。"},"AdminNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adminnotes","description":"管理员备注 (如果由管理员操作)。"}},"type":"object","required":["NewStatus"],"title":"OrderUpdateStatusRequest","description":"用于用户或管理员更新订单状态的请求。\n会被 PUT /api/v1/orders/{order_id}/status (更新订单状态) 端点使用。"},"OrderViewResponse":{"properties":{"OrderID":{"type":"integer","title":"Orderid"},"UserID":{"type":"integer","title":"Userid"},"StoreID":{"type":"integer","title":"Storeid"},"PaymentTransactionID":{"type":"integer","title":"Paymenttransactionid"},"OrderStatus":{"$ref":"#/components/schemas/OrderStatusEnum"},"OrderTotalAmount":{"type":"string","title":"Ordertotalamount","description":"订单商品总金额 (不含运费和优惠)。"},"DiscountAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discountamount","description":"优惠金额。","default":0.0},"ShippingFee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shippingfee","description":"运费。","default":0.0},"FinalAmountForThisOrder":{"type":"string","title":"Finalamountforthisorder","description":"此订单最终应付金额。"},"ShippingAddress_RecipientName":{"type":"string","title":"Shippingaddress Recipientname"},"ShippingAddress_PhoneNumber":{"type":"string","title":"Shippingaddress Phonenumber"},"ShippingAddress_Full":{"type":"string","title":"Shippingaddress Full"},"Notes_ByUser":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Byuser"},"Notes_ByMerchant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Bymerchant"},"CreationTime":{"type":"string","format":"date-time","title":"Creationtime"},"PaymentConfirmationTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paymentconfirmationtime"},"ShippingTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shippingtime"},"DeliveryTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deliverytime"},"CompletionTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completiontime"},"LastUpdatedDate":{"type":"string","format":"date-time","title":"Lastupdateddate"},"Items":{"items":{"$ref":"#/components/schemas/OrderItemDetailResponse"},"type":"array","title":"Items","description":"订单中的商品项目列表。"},"PaymentStatus":{"anyOf":[{"$ref":"#/components/schemas/PaymentTransactionStatusEnum"},{"type":"null"}],"description":"关联支付事务的状态。"}},"type":"object","required":["OrderID","UserID","StoreID","PaymentTransactionID","OrderStatus","OrderTotalAmount","FinalAmountForThisOrder","ShippingAddress_RecipientName","ShippingAddress_PhoneNumber","ShippingAddress_Full","CreationTime","LastUpdatedDate","Items"],"title":"OrderViewResponse","description":"从 API 返回单个完整订单详情时使用的数据模型。\n会被 GET /api/v1/orders/{order_id} (获取单个订单) 端点使用。\n也会被 GET /api/v1/users/me/orders (获取用户所有订单) 端点中的列表项使用。\n对应 DDL 中的 Order 表。"},"PaymentProcessingResponse":{"properties":{"PaymentTransactionID":{"type":"integer","title":"Paymenttransactionid","description":"系统内部的支付事务ID。"},"TransactionStatusInSystem":{"type":"string","title":"Transactionstatusinsystem","description":"更新后的系统内部支付事务状态 (例如,来自您系统的 PaymentTransactionStatusEnum: 'SUCCESSFUL', 'FAILED')。"},"MessageToUser":{"type":"string","title":"Messagetouser","description":"给用户的最终消息 (例如,“支付成功,您的订单正在处理中!”或“支付失败,请重试。”)。"},"AffectedOrderIDs":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Affectedorderids","description":"与此支付事务成功关联并更新状态的订单ID列表 (如果支付成功)。"}},"type":"object","required":["PaymentTransactionID","TransactionStatusInSystem","MessageToUser"],"title":"PaymentProcessingResponse","description":"在后端处理完模拟支付(并更新了数据库状态)后,返回给前端支付页面的响应。\n前端将根据此响应将用户重定向到合适的订单页面。\n会被 POST /api/v1/payment/{PaymentTransactionID}/simulate-pay (示例路径) 端点使用。"},"PaymentResponse":{"properties":{"PaymentTransactionID":{"type":"integer","title":"Paymenttransactionid","description":"系统内部的支付事务ID。"},"UserID":{"type":"integer","title":"Userid","description":"发起支付的用户ID。"},"TotalAmount":{"type":"string","title":"Totalamount","description":"支付的总金额。"},"PaymentMethod":{"type":"string","title":"Paymentmethod","description":"支付方式 (例如,'CreditCard', 'PayPal')。"},"ExternalGatewayTxID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalgatewaytxid","description":"外部支付网关的交易ID (如果适用)。"},"Status":{"$ref":"#/components/schemas/PaymentTransactionStatusEnum","description":"支付事务的当前状态 (例如,'PENDING', 'SUCCESSFUL', 'FAILED')。"},"CreationTime":{"type":"string","format":"date-time","title":"Creationtime","description":"支付事务创建的时间戳。"},"CompletionTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completiontime","description":"支付事务完成的时间戳 (如果适用)。"},"LastUpdatedTime":{"type":"string","format":"date-time","title":"Lastupdatedtime","description":"支付事务最后更新的时间戳。"}},"type":"object","required":["PaymentTransactionID","UserID","TotalAmount","PaymentMethod","Status","CreationTime","LastUpdatedTime"],"title":"PaymentResponse","description":"支付响应模型,包含支付事务的详细信息。\n会被 GET /api/v1/payment/{PaymentTransactionID}/status (示例路径) 端点使用。"},"PaymentTransactionStatusEnum":{"type":"string","enum":["PENDING","SUCCESSFUL","FAILED"],"title":"PaymentTransactionStatusEnum","description":"支付事务状态枚举 (基于 DDL)。\n会被 OrderViewResponse (作为 PaymentStatus) 使用。"},"ProductChangeRequestAdminUpdate":{"properties":{"AdminReviewerID":{"type":"integer","exclusiveMinimum":0.0,"title":"Adminreviewerid","description":"审核管理员ID,外键关联User表。"},"Status":{"type":"string","enum":["APPROVED","REJECTED","APPLIED"],"title":"Status","description":"请求状态。可以是 'APPROVED'、'REJECTED' 或 'APPLIED'。"},"AdminNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adminnotes","description":"管理员审核备注,可选。"},"ReviewTimestamp":{"type":"string","format":"date-time","title":"Reviewtimestamp","description":"审核时间。"}},"type":"object","required":["AdminReviewerID","Status","ReviewTimestamp"],"title":"ProductChangeRequestAdminUpdate","description":"管理员更新商品变更请求的数据模型。"},"ProductChangeRequestCreate":{"properties":{"MerchantUserID":{"type":"integer","exclusiveMinimum":0.0,"title":"Merchantuserid","description":"提交请求的商家UserID,外键关联User表。"},"StoreID":{"type":"integer","exclusiveMinimum":0.0,"title":"Storeid","description":"商品所属的StoreID,外键关联Store表。"},"RequestType":{"type":"string","enum":["PRODUCT_CREATE","PRODUCT_UPDATE","PRODUCT_DELETE"],"title":"Requesttype","description":"请求类型。可以是 'PRODUCT_CREATE'、'PRODUCT_UPDATE' 或 'PRODUCT_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"商家提交备注,可选。"},"ProductID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Productid","description":"目标商品ID,对于PRODUCT_CREATE可为空,应用后可回填。"}},"type":"object","required":["MerchantUserID","StoreID","RequestType"],"title":"ProductChangeRequestCreate","description":"创建新商品变更请求时,API 端点期望的数据模型。"},"ProductChangeRequestResponse":{"properties":{"MerchantUserID":{"type":"integer","exclusiveMinimum":0.0,"title":"Merchantuserid","description":"提交请求的商家UserID,外键关联User表。"},"StoreID":{"type":"integer","exclusiveMinimum":0.0,"title":"Storeid","description":"商品所属的StoreID,外键关联Store表。"},"RequestType":{"type":"string","enum":["PRODUCT_CREATE","PRODUCT_UPDATE","PRODUCT_DELETE"],"title":"Requesttype","description":"请求类型。可以是 'PRODUCT_CREATE'、'PRODUCT_UPDATE' 或 'PRODUCT_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"商家提交备注,可选。"},"ChangeRequestID":{"type":"integer","title":"Changerequestid","description":"变更请求的唯一标识符。"},"ProductID":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Productid","description":"目标商品ID,对于PRODUCT_CREATE可为空,应用后可回填。"},"Status":{"type":"string","enum":["PENDING_APPROVAL","APPROVED","REJECTED","APPLIED","CANCELLED_BY_USER"],"title":"Status","description":"请求状态。"},"AdminReviewerID":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adminreviewerid","description":"审核管理员ID,外键关联User表,可为空。"},"ReviewTimestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewtimestamp","description":"审核时间,可为空。"},"AdminNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adminnotes","description":"管理员审核备注,可选。"},"CreationTime":{"type":"string","title":"Creationtime","description":"请求创建时间。"},"LastUpdatedDate":{"type":"string","title":"Lastupdateddate","description":"请求最后更新时间。"}},"type":"object","required":["MerchantUserID","StoreID","RequestType","ChangeRequestID","Status","CreationTime","LastUpdatedDate"],"title":"ProductChangeRequestResponse","description":"商品变更请求响应模型,包含请求的基本信息和额外信息。"},"ProductChangeRequestUpdate":{"properties":{"RequestType":{"anyOf":[{"type":"string","enum":["PRODUCT_CREATE","PRODUCT_UPDATE","PRODUCT_DELETE"]},{"type":"null"}],"title":"Requesttype","description":"请求类型。可以是 'PRODUCT_CREATE'、'PRODUCT_UPDATE' 或 'PRODUCT_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"Status":{"anyOf":[{"type":"string","enum":["PENDING_APPROVAL","APPROVED","REJECTED","APPLIED","CANCELLED_BY_USER"]},{"type":"null"}],"title":"Status","description":"请求状态。可以是 'PENDING_APPROVAL'、'APPROVED'、'REJECTED'、'APPLIED' 或 'CANCELLED_BY_USER'。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"商家提交备注,可选。"}},"type":"object","title":"ProductChangeRequestUpdate","description":"更新商品变更请求信息时,API 端点期望的数据模型。\n包含可选字段。"},"ProductCreate":{"properties":{"ProductName":{"type":"string","maxLength":255,"minLength":1,"title":"Productname","description":"商品名称,长度在1到255个字符之间。"},"ProductDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productdescription","description":"商品详细介绍,可选。"},"Price":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"}],"title":"Price","description":"商品单价,必须大于0。"},"CategoryID":{"type":"integer","exclusiveMinimum":0.0,"title":"Categoryid","description":"商品所属分类ID。"},"StockQuantity":{"type":"integer","minimum":0.0,"title":"Stockquantity","description":"库存数量,默认为0,不能为负数。","default":0},"MainImageURL":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Mainimageurl","description":"商品主图片URL地址,可选。"},"StoreID":{"type":"integer","exclusiveMinimum":0.0,"title":"Storeid","description":"商品所属店铺ID。"}},"type":"object","required":["ProductName","Price","CategoryID","StoreID"],"title":"ProductCreate","description":"创建新商品时,API 端点期望的商品数据模型。"},"ProductResponse":{"properties":{"ProductName":{"type":"string","maxLength":255,"minLength":1,"title":"Productname","description":"商品名称,长度在1到255个字符之间。"},"ProductDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productdescription","description":"商品详细介绍,可选。"},"Price":{"type":"string","title":"Price","description":"商品单价,必须大于0。"},"CategoryID":{"type":"integer","exclusiveMinimum":0.0,"title":"Categoryid","description":"商品所属分类ID。"},"StockQuantity":{"type":"integer","minimum":0.0,"title":"Stockquantity","description":"库存数量,默认为0,不能为负数。","default":0},"MainImageURL":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Mainimageurl","description":"商品主图片URL地址,可选。"},"ProductID":{"type":"integer","title":"Productid","description":"商品的唯一标识符。"},"StoreID":{"type":"integer","title":"Storeid","description":"商品所属店铺ID。"},"ProductStatus":{"type":"string","title":"Productstatus","description":"商品状态。"},"CreationDate":{"type":"string","format":"date-time","title":"Creationdate","description":"商品创建日期。"},"LastUpdatedDate":{"type":"string","format":"date-time","title":"Lastupdateddate","description":"商品信息最后更新日期。"}},"type":"object","required":["ProductName","Price","CategoryID","ProductID","StoreID","ProductStatus","CreationDate","LastUpdatedDate"],"title":"ProductResponse","description":"商品响应模型,包含商品的基本信息和额外信息。"},"ProductUpdate":{"properties":{"ProductName":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Productname","description":"商品名称,长度在1到255个字符之间。"},"ProductDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productdescription","description":"商品详细介绍,可选。"},"Price":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Price","description":"商品单价,必须大于0。"},"CategoryID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Categoryid","description":"商品所属分类ID。"},"StockQuantity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stockquantity","description":"库存数量,不能为负数。"},"MainImageURL":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Mainimageurl","description":"商品主图片URL地址。"},"ProductStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productstatus","description":"商品状态。可以是 'ACTIVE'、'INACTIVE_BY_MERCHANT'、'SUSPENDED_BY_ADMIN' 或 'DISCONTINUED'。"}},"type":"object","title":"ProductUpdate","description":"更新商品信息时,API 端点期望的商品数据模型。\n包含可选字段。"},"ProductWithCategoryInfo":{"properties":{"ProductName":{"type":"string","maxLength":255,"minLength":1,"title":"Productname","description":"商品名称,长度在1到255个字符之间。"},"ProductDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productdescription","description":"商品详细介绍,可选。"},"Price":{"type":"string","title":"Price","description":"商品单价,必须大于0。"},"CategoryID":{"type":"integer","exclusiveMinimum":0.0,"title":"Categoryid","description":"商品所属分类ID。"},"StockQuantity":{"type":"integer","minimum":0.0,"title":"Stockquantity","description":"库存数量,默认为0,不能为负数。","default":0},"MainImageURL":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Mainimageurl","description":"商品主图片URL地址,可选。"},"ProductID":{"type":"integer","title":"Productid","description":"商品的唯一标识符。"},"StoreID":{"type":"integer","title":"Storeid","description":"商品所属店铺ID。"},"ProductStatus":{"type":"string","title":"Productstatus","description":"商品状态。"},"CreationDate":{"type":"string","format":"date-time","title":"Creationdate","description":"商品创建日期。"},"LastUpdatedDate":{"type":"string","format":"date-time","title":"Lastupdateddate","description":"商品信息最后更新日期。"},"CategoryName":{"type":"string","title":"Categoryname","description":"商品所属分类名称。"}},"type":"object","required":["ProductName","Price","CategoryID","ProductID","StoreID","ProductStatus","CreationDate","LastUpdatedDate","CategoryName"],"title":"ProductWithCategoryInfo","description":"包含分类信息的商品响应模型"},"SetDefaultAddressResponse":{"properties":{"Message":{"type":"string","title":"Message","description":"操作结果消息。"},"DefaultAddress":{"anyOf":[{"$ref":"#/components/schemas/AddressResponse"},{"type":"null"}],"description":"新的默认地址信息 (可选)。"}},"type":"object","required":["Message"],"title":"SetDefaultAddressResponse","description":"设置默认地址操作的响应。"},"SimulatedExternPaymentResponse":{"properties":{"SimulatedPaymentMethod":{"type":"string","title":"Simulatedpaymentmethod","description":"模拟支付方式名称","default":"MockPayment"},"ExternalGatewayTxID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalgatewaytxid","description":"外部支付网关的交易ID (如果适用)。可以是前端随机生成的字符串。"}},"type":"object","title":"SimulatedExternPaymentResponse","description":"当用户在我们的支付页面点击“支付”时,模拟的支付网关将返回给我们的响应。\n接受到这个响应就代表支付成功。\nPaymentTransactionID 通常作为路径参数传递给API端点。\n这个请求体可以包含用户选择的模拟支付方式或其他相关信息。\n会被 POST /api/v1/payment/{PaymentTransactionID}/simulate-pay (示例路径) 端点使用。"},"StoreChangeRequestAdminUpdate":{"properties":{"AdminReviewerID":{"type":"integer","exclusiveMinimum":0.0,"title":"Adminreviewerid","description":"审核管理员ID,外键关联User表。"},"Status":{"type":"string","enum":["APPROVED","REJECTED","APPLIED"],"title":"Status","description":"请求状态。可以是 'APPROVED'、'REJECTED' 或 'APPLIED'。"},"AdminNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adminnotes","description":"管理员审核备注,可选。"},"ReviewTimestamp":{"type":"string","format":"date-time","title":"Reviewtimestamp","description":"审核时间。"}},"type":"object","required":["AdminReviewerID","Status","ReviewTimestamp"],"title":"StoreChangeRequestAdminUpdate","description":"管理员更新店铺变更请求的数据模型。"},"StoreChangeRequestCreate":{"properties":{"RequestingUserID":{"type":"integer","exclusiveMinimum":0.0,"title":"Requestinguserid","description":"请求用户ID,外键关联User表。"},"RequestType":{"type":"string","enum":["STORE_CREATE","STORE_UPDATE","STORE_DELETE"],"title":"Requesttype","description":"请求类型。可以是 'STORE_CREATE'、'STORE_UPDATE' 或 'STORE_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"提交者备注,可选。"},"StoreID":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Storeid","description":"目标店铺ID,对于STORE_CREATE可为空,应用后可回填。"}},"type":"object","required":["RequestingUserID","RequestType"],"title":"StoreChangeRequestCreate","description":"创建新店铺变更请求时,API 端点期望的数据模型。"},"StoreChangeRequestResponse":{"properties":{"RequestingUserID":{"type":"integer","exclusiveMinimum":0.0,"title":"Requestinguserid","description":"请求用户ID,外键关联User表。"},"RequestType":{"type":"string","enum":["STORE_CREATE","STORE_UPDATE","STORE_DELETE"],"title":"Requesttype","description":"请求类型。可以是 'STORE_CREATE'、'STORE_UPDATE' 或 'STORE_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"提交者备注,可选。"},"ChangeRequestID":{"type":"integer","title":"Changerequestid","description":"变更请求的唯一标识符。"},"StoreID":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storeid","description":"目标店铺ID,对于STORE_CREATE可为空,应用后可回填。"},"Status":{"type":"string","enum":["PENDING_APPROVAL","APPROVED","REJECTED","APPLIED","CANCELLED_BY_USER"],"title":"Status","description":"请求状态。"},"AdminReviewerID":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adminreviewerid","description":"审核管理员ID,外键关联User表,可为空。"},"ReviewTimestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewtimestamp","description":"审核时间,可为空。"},"AdminNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adminnotes","description":"管理员审核备注,可选。"},"CreationTime":{"type":"string","title":"Creationtime","description":"请求创建时间。"},"LastUpdatedDate":{"type":"string","title":"Lastupdateddate","description":"请求最后更新时间。"}},"type":"object","required":["RequestingUserID","RequestType","ChangeRequestID","Status","CreationTime","LastUpdatedDate"],"title":"StoreChangeRequestResponse","description":"店铺变更请求响应模型,包含请求的基本信息和额外信息。"},"StoreChangeRequestUpdate":{"properties":{"RequestType":{"anyOf":[{"type":"string","enum":["STORE_CREATE","STORE_UPDATE","STORE_DELETE"]},{"type":"null"}],"title":"Requesttype","description":"请求类型。可以是 'STORE_CREATE'、'STORE_UPDATE' 或 'STORE_DELETE'。"},"ProposedData_JSON":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposeddata Json","description":"建议数据体 (JSON格式),包含请求的具体更改内容。"},"Status":{"anyOf":[{"type":"string","enum":["PENDING_APPROVAL","APPROVED","REJECTED","APPLIED","CANCELLED_BY_USER"]},{"type":"null"}],"title":"Status","description":"请求状态。可以是 'PENDING_APPROVAL'、'APPROVED'、'REJECTED'、'APPLIED' 或 'CANCELLED_BY_USER'。"},"SubmitterNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitternotes","description":"提交者备注,可选。"}},"type":"object","title":"StoreChangeRequestUpdate","description":"更新店铺变更请求信息时,API 端点期望的数据模型。\n包含可选字段。"},"StoreListResponse":{"properties":{"Count":{"type":"integer","title":"Count","description":"店铺数量"},"StoreList":{"items":{"$ref":"#/components/schemas/StoreResponse"},"type":"array","title":"Storelist","description":"店铺列表"}},"type":"object","required":["Count","StoreList"],"title":"StoreListResponse","description":"查询店铺列表时,API 端点返回的商店数据模型。"},"StoreListSimpleResponse":{"properties":{"Count":{"type":"integer","title":"Count","description":"店铺数量"},"StoreList":{"items":{"$ref":"#/components/schemas/StoreSimpleResponse"},"type":"array","title":"Storelist","description":"店铺列表"}},"type":"object","required":["Count","StoreList"],"title":"StoreListSimpleResponse","description":"查询店铺列表时,API 端点返回的商店数据模型。\n这个模型只包含店铺 ID 和名称。"},"StoreResponse":{"properties":{"StoreID":{"type":"integer","title":"Storeid","description":"店铺 ID"},"StoreName":{"type":"string","title":"Storename","description":"店铺名称"},"OwnerUserID":{"type":"integer","title":"Owneruserid","description":"店主用户 ID"},"Description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"店铺描述"},"LogoURL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl","description":"店铺 Logo 的 URL"},"StoreStatus":{"type":"string","title":"Storestatus","description":"店铺状态"},"CreationDate":{"type":"string","format":"date-time","title":"Creationdate","description":"店铺创建日期"},"LastUpdatedDate":{"type":"string","format":"date-time","title":"Lastupdateddate","description":"店铺最后更新时间"}},"type":"object","required":["StoreID","StoreName","OwnerUserID","StoreStatus","CreationDate","LastUpdatedDate"],"title":"StoreResponse","description":"查询店铺信息时,API 端点返回的商店数据模型。"},"StoreSimpleResponse":{"properties":{"StoreID":{"type":"integer","title":"Storeid","description":"店铺 ID"},"StoreName":{"type":"string","title":"Storename","description":"店铺名称"}},"type":"object","required":["StoreID","StoreName"],"title":"StoreSimpleResponse","description":"查询店铺列表时,API 端点返回的商店数据模型。\n这个模型只包含店铺 ID 和名称。"},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"JWT 访问令牌。"},"token_type":{"type":"string","title":"Token Type","description":"令牌类型,通常为 'bearer'。","default":"bearer"}},"type":"object","required":["access_token"],"title":"Token","description":"API 认证成功后返回的 Token 模型。"},"UserCreate":{"properties":{"Username":{"type":"string","maxLength":50,"minLength":3,"pattern":"^[a-zA-Z0-9_]+$","title":"Username","description":"用户名,长度在3到50个字符之间,只能包含字母、数字、下划线。"},"Email":{"anyOf":[{"type":"string","format":"email"},{"type":"string"},{"type":"null"}],"title":"Email","description":"用户邮箱,必须是有效的电子邮件地址。"},"PhoneNumber":{"anyOf":[{"type":"string","maxLength":20,"pattern":"^\\+?[0-9\\s\\-\\(\\)]+$"},{"type":"null"}],"title":"Phonenumber","description":"用户的手机号码 (可选)。数字可以用空格、连字符和括号分隔,允许以+开头的国际格式。"},"Password":{"type":"string","maxLength":128,"minLength":8,"title":"Password","description":"用户密码,长度在8到128个字符之间。"}},"type":"object","required":["Username","Email","Password"],"title":"UserCreate","description":"创建新用户时,API 端点期望的用户数据模型。包含密码明文。"},"UserResponse":{"properties":{"Username":{"type":"string","maxLength":50,"minLength":3,"pattern":"^[a-zA-Z0-9_]+$","title":"Username","description":"用户名,长度在3到50个字符之间,只能包含字母、数字、下划线。"},"Email":{"anyOf":[{"type":"string","format":"email"},{"type":"string"},{"type":"null"}],"title":"Email","description":"用户邮箱,必须是有效的电子邮件地址。"},"PhoneNumber":{"anyOf":[{"type":"string","maxLength":20,"pattern":"^\\+?[0-9\\s\\-\\(\\)]+$"},{"type":"null"}],"title":"Phonenumber","description":"用户的手机号码 (可选)。数字可以用空格、连字符和括号分隔,允许以+开头的国际格式。"},"UserID":{"type":"integer","title":"Userid","description":"用户的唯一标识符。"},"RegistrationDate":{"type":"string","format":"date-time","title":"Registrationdate","description":"用户注册的日期和时间。"},"LastLoginDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastlogindate","description":"用户上次登录的日期和时间。"}},"type":"object","required":["Username","Email","UserID","RegistrationDate"],"title":"UserResponse","description":"用户响应模型,包含用户的基本信息和 ID。"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file diff --git a/src/package-lock.json b/src/package-lock.json deleted file mode 100644 index 1c967c5..0000000 --- a/src/package-lock.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" - }, - "qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "requires": { - "side-channel": "^1.1.0" - } - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - } - } -}