diff --git a/src/frontend/index.html b/src/frontend/index.html index b19040a..6c0b22a 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -4,7 +4,7 @@ - Vite App + ShopEase
diff --git a/src/frontend/public/Websitelogo.svg b/src/frontend/public/Websitelogo.svg new file mode 100644 index 0000000..79278ae --- /dev/null +++ b/src/frontend/public/Websitelogo.svg @@ -0,0 +1,9 @@ + + + + + + + ShopEase + + diff --git a/src/frontend/src/api/address.ts b/src/frontend/src/api/address.ts new file mode 100644 index 0000000..20de409 --- /dev/null +++ b/src/frontend/src/api/address.ts @@ -0,0 +1,43 @@ +import axios from 'axios' + +/** 单条地址 */ +export interface Address { + AddressID: number + UserID: number + RecipientName: string + PhoneNumber: string + FullAddress_Text: string + IsDefault: boolean +} + +/** 分页结果 */ +export interface AddressList { + Addresses: Address[] + TotalCount: number +} + +/* ---- CRUD ---- */ + +/** 获取当前用户所有地址 */ +export const fetchAddresses = () => + axios.get('/address') + +/** 获取详情(很少用,通常列表带全量字段即可) */ +export const fetchAddress = (id: number) => + axios.get
(`/address/${id}`) + +/** 新增 */ +export const addAddress = (payload: Omit) => + axios.post
('/address', payload) + +/** 更新 */ +export const updateAddress = (id: number, payload: Omit) => + axios.put(`/address/${id}`, payload) + +/** 删除 */ +export const deleteAddress = (id: number) => + axios.delete(`/address/${id}`) + +/** 设为默认 */ +export const setDefault = (id: number) => + axios.post(`/address/${id}/set-default`) diff --git a/src/frontend/src/api/auth.ts b/src/frontend/src/api/auth.ts new file mode 100644 index 0000000..9aecbee --- /dev/null +++ b/src/frontend/src/api/auth.ts @@ -0,0 +1,9 @@ +import axios from 'axios' + +/** Logout current session */ +export const logout = () => + axios.post('/auth/logout') + +/** Logout all sessions for the current user */ +export const logoutAll = () => + axios.post('/auth/logout-all') diff --git a/src/frontend/src/api/cart.ts b/src/frontend/src/api/cart.ts new file mode 100644 index 0000000..af4098a --- /dev/null +++ b/src/frontend/src/api/cart.ts @@ -0,0 +1,29 @@ +import axios from 'axios' + +export interface CartItem { + CartItemID: number + UserID: number + ProductID: number + Quantity: number + PriceAtAddition: number + AddedDate: string + ProductName: string + MainImageURL: string + Price: number +} + +export interface CartResponse { + Items: CartItem[] + TotalItems: number +} + +/** 获取购物车 */ +export const fetchCart = () => axios.get('/cart') + +/** 更新购物车条目数量(Quantity 必须 >0) */ +export const updateCartItem = (cartItemId: number, qty: number) => + axios.put(`/cart/items/${cartItemId}`, { Quantity: qty }) + + /** 删除购物车条目 */ + export const deleteCartItem = (cartItemId: number) => + axios.delete(`/cart/items/${cartItemId}`) diff --git a/src/frontend/src/api/category.ts b/src/frontend/src/api/category.ts new file mode 100644 index 0000000..b2829d1 --- /dev/null +++ b/src/frontend/src/api/category.ts @@ -0,0 +1,18 @@ +import axios from 'axios' + +/** 后端返回的分类结构 */ +export interface Category { + CategoryID: number + CategoryName: string + CategoryDescription?: string + ParentCategoryID?: number | null +} + +/** + * 获取分类列表 + * @param parent_id 父分类 ID;不传则取所有一级分类 + */ +export const fetchCategories = (parent_id?: number) => + axios.get('/category', { + params: parent_id ? { parent_id } : {} + }) diff --git a/src/frontend/src/api/order.ts b/src/frontend/src/api/order.ts new file mode 100644 index 0000000..5a7fa79 --- /dev/null +++ b/src/frontend/src/api/order.ts @@ -0,0 +1,150 @@ +// src/frontend/src/api/order.ts +import axios from 'axios' + +/** 单个订单内的商品条目 */ +export interface OrderItem { + OrderItemID: number + OrderID: number + ProductID: number + StoreID: number + Quantity: number + PriceAtPurchase: string + ProductNameAtPurchase: string + ProductImageURLAtPurchase: string + Subtotal: string +} + +/** 订单状态枚举 */ +export type OrderStatusEnum = + | 'PENDING_PAYMENT' + | 'PAID_AND_PENDING_PROCESSING' + | 'PROCESSING_BY_MERCHANT' + | 'SHIPPED' + | 'DELIVERED' + | 'COMPLETED' + | 'CANCELLED_BY_USER' + | 'CANCELLED_BY_MERCHANT' + | 'CANCELLED_BY_SYSTEM' + +export const statusValues: OrderStatusEnum[] = [ + 'PENDING_PAYMENT', + 'PAID_AND_PENDING_PROCESSING', + 'PROCESSING_BY_MERCHANT', + 'SHIPPED', + 'DELIVERED', + 'COMPLETED', + 'CANCELLED_BY_USER', + 'CANCELLED_BY_MERCHANT', + 'CANCELLED_BY_SYSTEM' +] + +/** 后端返回的订单对象 */ +export interface Order { + OrderID: number + UserID: number + StoreID: number + PaymentTransactionID: number + OrderStatus: OrderStatusEnum + OrderTotalAmount: string + DiscountAmount: string + ShippingFee: string + FinalAmountForThisOrder: string + ShippingAddress_RecipientName: string + ShippingAddress_PhoneNumber: string + ShippingAddress_Full: string + Notes_ByUser: string + Notes_ByMerchant: string + CreationTime: string + PaymentConfirmationTime?: string + ShippingTime?: string + DeliveryTime?: string + CompletionTime?: string + LastUpdatedDate: string + Items: OrderItem[] + PaymentStatus: string +} + +/** 后端分页响应 */ +export interface OrdersResponse { + Orders: Order[] + TotalCount: number + Offset: number + Limit: number +} + +/** + * 获取当前用户订单列表(分页) + * @param offset 页偏移,默认 0 + * @param limit 每页数量,默认 20 + */ +export const fetchOrders = (offset = 0, limit = 20) => + axios.get('/order/', { + params: { offset, limit } + }) + +/** + * 获取单个订单详情 + * @param orderId 订单ID + */ +export const fetchOrderDetail = (orderId: number) => + axios.get(`/order/${orderId}`) + +/** + * 更新订单状态 + * @param orderId 订单ID + * @param data 状态更新数据 + */ +export interface OrderUpdateStatusRequest { + NewStatus: OrderStatusEnum + TrackingNumber?: string + UserNotes?: string + AdminNotes?: string +} + +export const updateOrderStatus = (orderId: number, data: OrderUpdateStatusRequest) => + axios.put(`/order/${orderId}/status`, data) + +/** 创建订单请求参数 */ +export interface CreateOrderPayload { + ShippingAddressID: number // 选中的送货地址ID + Items: { CartItemID: number }[] // 购物车中选中的条目ID数组 + Notes_ByUser: string // 用户备注(可选) +} + +/** 创建订单响应中的订单项 */ +export interface CreatedOrderItem { + OrderItemID: number + OrderID: number + ProductID: number + StoreID: number + Quantity: number + PriceAtPurchase: string + ProductNameAtPurchase: string + ProductImageURLAtPurchase: string + Subtotal: string +} + +/** 创建订单响应中的订单 */ +export interface CreatedOrder { + OrderID: number + StoreID: number + FinalAmountForThisOrder: string + OrderStatus: string + Items: CreatedOrderItem[] +} + +/** 创建订单响应 */ +export interface CreateOrderResponse { + PaymentTransactionID: number + ExternalPaymentURL: string + TotalAmountDue: string + Currency: string + OrdersCreated: CreatedOrder[] + Message?: string +} + +/** + * 创建订单 + */ +export const createOrder = (payload: CreateOrderPayload) => + axios.post('/order/create', payload) diff --git a/src/frontend/src/api/payment.ts b/src/frontend/src/api/payment.ts new file mode 100644 index 0000000..2677fc2 --- /dev/null +++ b/src/frontend/src/api/payment.ts @@ -0,0 +1,15 @@ +import axios from 'axios' + +/** 创建订单后模拟支付 */ +export const simulatePay = ( + paymentTransactionId: number, + method = 'MockPayment' +) => + axios.post(`/payment/${paymentTransactionId}/simulate-pay`, { + SimulatedPaymentMethod: method, + ExternalGatewayTxID: `mock-${Date.now()}` + }) + +/** 查询支付状态 */ +export const paymentStatus = (paymentTransactionId: number) => + axios.get(`/payment/${paymentTransactionId}/status`) diff --git a/src/frontend/src/api/product.ts b/src/frontend/src/api/product.ts new file mode 100644 index 0000000..bdc4759 --- /dev/null +++ b/src/frontend/src/api/product.ts @@ -0,0 +1,146 @@ +import axios from 'axios' + +// 商品相关接口定义 +export interface Product { + ProductID: number + ProductName: string + ProductDescription?: string + Price: string + CategoryID: number + StockQuantity: number + MainImageURL?: string + StoreID: number + ProductStatus: string + CreationDate: string + LastUpdatedDate: string +} + +export interface ProductWithCategoryInfo extends Product { + CategoryName: string +} + +// 创建商品请求参数 +export interface ProductCreate { + ProductName: string + ProductDescription?: string + Price: number + CategoryID: number + StockQuantity?: number + MainImageURL?: string + StoreID: number +} + +// 更新商品请求参数 +export interface ProductUpdate { + ProductName?: string + ProductDescription?: string + Price?: number | string + CategoryID?: number + StockQuantity?: number + MainImageURL?: string + ProductStatus?: string +} + +// 分类接口定义 +export interface Category { + CategoryID: number + CategoryName: string + CategoryDescription?: string + ParentCategoryID?: number +} + +export interface CategoryWithChildren extends Category { + Children?: CategoryWithChildren[] +} + +// 查询参数 +export interface ProductQuery { + store_id?: number + category_id?: number + search?: string + limit?: number + offset?: number + current_user_id?: number + TextInclude?: string + StoreID?: number + CategoryID?: number + MinPrice?: number + MaxPrice?: number + OrderBy?: string + ProductStatus?: string +} + +/** + * 获取商品列表 + * @param query 查询参数 + */ +export const fetchProducts = (query: ProductQuery) => + axios.get('/product', { params: query }) + +/** + * 获取面向商家的商品列表 + * @param query 查询参数 + */ +export const fetchMerchantProducts = (query: ProductQuery) => + axios.get('/product/merchant', { params: query }) + +/** + * 获取商品详情 + * @param productId 商品ID + */ +export const fetchProductDetail = (productId: number) => + axios.get(`/product/${productId}`) + +/** + * 创建新商品 + * @param product 商品数据 + */ +export const createProduct = (product: ProductCreate) => + axios.post('/product', product) + +/** + * 更新商品信息 + * @param productId 商品ID + * @param data 更新数据 + */ +export const updateProduct = (productId: number, data: ProductUpdate) => + axios.put(`/product/${productId}`, data) + +/** + * 更新商品库存 + * @param productId 商品ID + * @param stockChange 库存变化量(正数增加,负数减少) + */ +export const updateProductStock = (productId: number, stockChange: number) => + axios.put(`/product/${productId}/stock`, null, { + params: { stock_change: stockChange } + }) + +/** + * 删除商品(实际上是将状态设置为DISCONTINUED) + * @param productId 商品ID + */ +export const deleteProduct = (productId: number) => + axios.delete(`/product/${productId}`) + +/** + * 获取分类列表 + * @param parentId 父分类ID(可选,如不提供则获取所有一级分类) + */ +export const fetchCategories = (parentId?: number) => + axios.get('/category', { + params: { parent_id: parentId } + }) + +/** + * 获取分类树 + */ +export const fetchCategoryTree = () => + axios.get('/category/tree') + +/** + * 获取单个分类详情 + * @param categoryId 分类ID + */ +export const fetchCategoryDetail = (categoryId: number) => + axios.get(`/category/${categoryId}`) diff --git a/src/frontend/src/api/store.ts b/src/frontend/src/api/store.ts new file mode 100644 index 0000000..186dcf3 --- /dev/null +++ b/src/frontend/src/api/store.ts @@ -0,0 +1,73 @@ +// src/frontend/src/api/store.ts +import axios from 'axios' + +/** 通用查询参数 */ +export interface StoreParams { + page?: number + pageSize?: number + search?: string + sortBy?: string + status?: string + categoryId?: number +} + +/** ========== 商铺列表 & 详情 ========== */ + +export interface StoreSummary { + StoreID: number + StoreName: string + OwnerUserID: number + Description?: string + LogoURL?: string + StoreStatus: 'ACTIVE' | 'INACTIVE_BY_MERCHANT' | 'SUSPENDED_BY_ADMIN' | 'CLOSED_PERMANENTLY_BY_ADMIN' + CreationDate: string + LastUpdatedDate: string +} + +export interface StoreListResponse { + Count: number + StoreList: StoreSummary[] +} + +export interface StoreDetail { + StoreID: number + StoreName: string + OwnerUserID: number + Description: string + LogoURL: string + StoreStatus: 'ACTIVE' | 'INACTIVE_BY_MERCHANT' | 'SUSPENDED_BY_ADMIN' | 'CLOSED_PERMANENTLY_BY_ADMIN' + CreationDate: string + LastUpdatedDate: string +} + +// 店铺状态映射 +export const getStatusType = (status) => ({ + ACTIVE: 'success', + INACTIVE_BY_MERCHANT: 'warning', + SUSPENDED_BY_ADMIN: 'danger', + CLOSED_PERMANENTLY_BY_ADMIN: 'info' +}[status] || 'info') + +export const translateStatus = (status) => ({ + ACTIVE: '营业中', + INACTIVE_BY_MERCHANT: '商家休息', + SUSPENDED_BY_ADMIN: '被平台禁用', + CLOSED_PERMANENTLY_BY_ADMIN: '永久关闭' +}[status] || status) + +/** 分页/筛选获取商铺列表 */ +export const fetchStoreList = (params: StoreParams = {}) => + axios.get('/store/list-full', { params }) + +export const fetchStoreListSimple = (params: StoreParams = {}) => + axios.get<{ Count: number; StoreList: StoreSummary[] }>('/store/list', { params }) + +/** 获取单个商铺详情 */ +export const fetchStoreDetail = (storeId: number) => + axios.get(`/store/info/${storeId}`) + +/** 获取指定店主的所有商铺 */ +export const fetchStoresByOwner = (ownerUserId: number) => + axios.get(`/store/owner/${ownerUserId}`) + + diff --git a/src/frontend/src/api/storeRequest.ts b/src/frontend/src/api/storeRequest.ts new file mode 100644 index 0000000..462b435 --- /dev/null +++ b/src/frontend/src/api/storeRequest.ts @@ -0,0 +1,232 @@ +// src/frontend/src/api/storeRequest.ts +import axios from 'axios' + +/** ========== 变更申请(审批流) ========== */ + +/** 店铺变更请求状态枚举 */ +export enum StoreChangeRequestStatus { + PENDING_APPROVAL = 'PENDING_APPROVAL', + PENDING = 'PENDING', // 兼容现有代码 + APPROVED = 'APPROVED', + REJECTED = 'REJECTED', + APPLIED = 'APPLIED', + CANCELLED_BY_USER = 'CANCELLED_BY_USER', + CANCELLED = 'CANCELLED' // 兼容现有代码 +} + +/** 店铺变更请求类型枚举 */ +export enum StoreChangeRequestType { + STORE_CREATE = 'STORE_CREATE', + STORE_UPDATE = 'STORE_UPDATE', + STORE_DELETE = 'STORE_DELETE' +} + +/** 店铺状态枚举 */ +export enum StoreStatus { + ACTIVE = 'ACTIVE', + INACTIVE_BY_MERCHANT = 'INACTIVE_BY_MERCHANT', + SUSPENDED_BY_ADMIN = 'SUSPENDED_BY_ADMIN', + CLOSED_PERMANENTLY_BY_ADMIN = 'CLOSED_PERMANENTLY_BY_ADMIN' +} + +/** 状态翻译映射 */ +export const translateRequestStatus = (status: string): string => { + const statusMap: Record = { + [StoreChangeRequestStatus.PENDING_APPROVAL]: '审核中', + [StoreChangeRequestStatus.PENDING]: '审核中', + [StoreChangeRequestStatus.APPROVED]: '已通过', + [StoreChangeRequestStatus.REJECTED]: '已拒绝', + [StoreChangeRequestStatus.APPLIED]: '已应用', + [StoreChangeRequestStatus.CANCELLED_BY_USER]: '用户已取消', + [StoreChangeRequestStatus.CANCELLED]: '已取消' + } + return statusMap[status] || status +} + +/** 申请类型翻译映射 */ +export const translateRequestType = (type: string): string => { + const typeMap: Record = { + [StoreChangeRequestType.STORE_CREATE]: '创建店铺', + [StoreChangeRequestType.STORE_UPDATE]: '更新店铺', + [StoreChangeRequestType.STORE_DELETE]: '删除店铺' + } + return typeMap[type] || type +} + +/** 店铺状态翻译映射 */ +export const translateStoreStatus = (status?: string): string => { + if (!status) return '-' + const statusMap: Record = { + [StoreStatus.ACTIVE]: '营业中', + [StoreStatus.INACTIVE_BY_MERCHANT]: '商家休息中', + [StoreStatus.SUSPENDED_BY_ADMIN]: '管理员已暂停', + [StoreStatus.CLOSED_PERMANENTLY_BY_ADMIN]: '管理员已永久关闭' + } + return statusMap[status] || status +} + +/** 状态颜色映射 */ +export const getStatusColor = (status: string): string => { + const colorMap: Record = { + [StoreChangeRequestStatus.PENDING_APPROVAL]: 'warning', + [StoreChangeRequestStatus.PENDING]: 'warning', + [StoreChangeRequestStatus.APPROVED]: 'success', + [StoreChangeRequestStatus.REJECTED]: 'danger', + [StoreChangeRequestStatus.APPLIED]: 'info', + [StoreChangeRequestStatus.CANCELLED_BY_USER]: 'info', + [StoreChangeRequestStatus.CANCELLED]: 'info' + } + return colorMap[status] || 'info' +} + +/** 请求类型颜色映射 */ +export const getRequestTypeColor = (type: string): string => { + const colorMap: Record = { + [StoreChangeRequestType.STORE_CREATE]: 'success', + [StoreChangeRequestType.STORE_UPDATE]: 'primary', + [StoreChangeRequestType.STORE_DELETE]: 'danger' + } + return colorMap[type] || 'info' +} + +/** 审批流中的变更申请记录 */ +export interface StoreChangeRequest { + // 新的API结构 + ChangeRequestID: number + StoreID: number | null + RequestingUserID: number + RequestType: 'STORE_CREATE' | 'STORE_UPDATE' | 'STORE_DELETE' + ProposedData_JSON: { + StoreName?: string + Description?: string + LogoURL?: string + StoreStatus?: string + } + Status: string // 使用StoreChangeRequestStatus中的值 + SubmitterNotes: string + AdminReviewerID: number | null + ReviewTimestamp: string | null + AdminNotes: string | null + CreationTime: string + LastUpdatedDate: string + + // 兼容旧字段,用于平滑过渡 + RequestID?: number // 等同于ChangeRequestID + UserID?: number // 等同于RequestingUserID + RequestStatus?: string // 等同于Status + StoreName?: string // 来自ProposedData_JSON + Description?: string // 来自ProposedData_JSON + LogoURL?: string // 来自ProposedData_JSON + AdminComment?: string // 等同于AdminNotes + RequestDate?: string // 等同于CreationTime + ProcessDate?: string // 等同于ReviewTimestamp + ProcessedByUserID?: number // 等同于AdminReviewerID + SubmissionDate?: string // 等同于CreationTime + ReviewerUserID?: number // 等同于AdminReviewerID + ReviewDate?: string // 等同于ReviewTimestamp + ReviewerNotes?: string // 等同于AdminNotes +} + + export interface StoreChangeRequestFilter { + RequestType?: 'STORE_CREATE' | 'STORE_UPDATE' | 'STORE_DELETE' + StoreID?: number + MerchantUserID?: number + Status?: ('PENDING' | 'APPROVED' | 'REJECTED' | 'CANCELLED')[] + } + + export interface StoreChangeRequestListResponse { + Count: number + Requests: StoreChangeRequest[] + } + + /** 用于提交审批流的变更申请 */ + export interface StoreChangeCreate { + RequestingUserID: number + RequestType: 'STORE_CREATE' | 'STORE_UPDATE' + ProposedData_JSON: { + StoreName?: string + Description?: string + LogoURL?: string + StoreStatus?: 'ACTIVE' | 'INACTIVE_BY_MERCHANT' | 'SUSPENDED_BY_ADMIN' | 'CLOSED_PERMANENTLY_BY_ADMIN' + } + SubmitterNotes?: string + StoreID?: number // RequestType=STORE_UPDATE 时必填 + } + + /** 提交新建或更新商铺的变更申请 */ + export const createStoreChangeRequest = (data: StoreChangeCreate) => + axios.post('/store-change-new/', data) + + /** 获取变更申请列表(可按状态/商铺/用户筛选) */ + export const fetchStoreChangeRequests = ( + params: StoreChangeRequestFilter = {} + ) => { + const { Status, ...queryParams } = params + return axios.request({ + method: 'get', + url: '/store-change-new/list/', + params: queryParams, + data: { Status }, + }) + } + + /** 获取单个变更申请详情 */ + export const fetchStoreChangeRequestDetail = (requestId: number) => + axios.get(`/store-change-new/${requestId}`) + + /** 更新审批流中的变更申请(管理员操作) */ + export interface StoreChangeAdminUpdate { + Status: 'PENDING_APPROVAL' | 'APPROVED' | 'REJECTED' | 'APPLIED' | 'CANCELLED_BY_USER' + AdminNotes?: string | null + } + + /** 用于用户更新自己的变更申请 */ + export interface UpdateStoreChangeRequest { + RequestType?: 'STORE_CREATE' | 'STORE_UPDATE' + ProposedData_JSON?: { + StoreName?: string + Description?: string + LogoURL?: string + StoreStatus?: 'ACTIVE' | 'INACTIVE_BY_MERCHANT' | 'SUSPENDED_BY_ADMIN' | 'CLOSED_PERMANENTLY_BY_ADMIN' + } + Status?: 'PENDING_APPROVAL' + SubmitterNotes?: string + } + + /** 管理员处理变更申请 */ + export const adminProcessStoreChangeRequest = ( + requestId: number, + data: StoreChangeAdminUpdate + ) => axios.put(`/store-change-new/${requestId}/review/`, data) + + /** 用户更新自己的变更申请 */ + export const updateStoreChangeRequest = ( + requestId: number, + data: UpdateStoreChangeRequest + ) => axios.put(`/store-change-new/${requestId}`, data) + + /** 取消自己提交的变更申请 */ + export const cancelStoreChangeRequest = (requestId: number) => + axios.delete(`/store-change-new/${requestId}`) + + /** 商家获取店铺变更请求列表(支持请求体 Status) */ + export const fetchStoreChangeRequestsByMerchant = (params: StoreChangeRequestFilter = {}) => { + const { Status, ...queryParams } = params + return axios.request({ + method: 'get', + url: '/store-change-new/list/', + params: queryParams, + data: { Status }, + }) + } + + /** 管理员获取店铺变更请求列表(支持请求体 Status) */ + export const fetchAdminStoreChangeRequests = (params: StoreChangeRequestFilter = {}) => { + const { Status, ...queryParams } = params + return axios.request({ + method: 'get', + url: '/store-change-new/list-admin/', + params: queryParams, + data: { Status }, + }) + } diff --git a/src/frontend/src/api/user.ts b/src/frontend/src/api/user.ts new file mode 100644 index 0000000..a4dd3f8 --- /dev/null +++ b/src/frontend/src/api/user.ts @@ -0,0 +1,19 @@ +import axios from 'axios' + +/** 后端返回的用户信息结构 */ +export interface UserInfo { + UserID: number + Username: string + Email: string + PhoneNumber: string + RegistrationDate: string + LastLoginDate: string + UserRole: string +} + +/** + * 获取当前用户信息 + * @param token “Bearer xxx” 形式的授权头,会被自动注入 axios + */ +export const fetchCurrentUser = () => + axios.get('/user/me') diff --git a/src/frontend/src/assets/images/avatar.jpg b/src/frontend/src/assets/images/avatar.jpg deleted file mode 100644 index 4dd24a2..0000000 Binary files a/src/frontend/src/assets/images/avatar.jpg and /dev/null differ diff --git a/src/frontend/src/assets/images/logo-inverse.svg b/src/frontend/src/assets/images/logo-inverse.svg deleted file mode 100644 index 891078c..0000000 --- a/src/frontend/src/assets/images/logo-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/frontend/src/assets/images/logo.svg b/src/frontend/src/assets/images/logo.svg index 2381cf9..a3db780 100644 --- a/src/frontend/src/assets/images/logo.svg +++ b/src/frontend/src/assets/images/logo.svg @@ -1 +1,85 @@ - \ No newline at end of file + +image/svg+xmlShopEase + \ No newline at end of file diff --git a/src/frontend/src/assets/images/mastercard-securecode.svg b/src/frontend/src/assets/images/mastercard-securecode.svg deleted file mode 100644 index 5f12979..0000000 --- a/src/frontend/src/assets/images/mastercard-securecode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/frontend/src/assets/images/verified-by-visa.svg b/src/frontend/src/assets/images/verified-by-visa.svg deleted file mode 100644 index ba45585..0000000 --- a/src/frontend/src/assets/images/verified-by-visa.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/frontend/src/components/User/UserAddress.vue b/src/frontend/src/components/User/UserAddress.vue new file mode 100644 index 0000000..678179c --- /dev/null +++ b/src/frontend/src/components/User/UserAddress.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/frontend/src/components/User/UserCart.vue b/src/frontend/src/components/User/UserCart.vue new file mode 100644 index 0000000..32aa4d6 --- /dev/null +++ b/src/frontend/src/components/User/UserCart.vue @@ -0,0 +1,105 @@ + + + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/User/UserOrder.vue b/src/frontend/src/components/User/UserOrder.vue new file mode 100644 index 0000000..88ba9bd --- /dev/null +++ b/src/frontend/src/components/User/UserOrder.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/frontend/src/components/User/UserProfile.vue b/src/frontend/src/components/User/UserProfile.vue new file mode 100644 index 0000000..3695769 --- /dev/null +++ b/src/frontend/src/components/User/UserProfile.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src/frontend/src/components/User/cart/CartCheckout.vue b/src/frontend/src/components/User/cart/CartCheckout.vue new file mode 100644 index 0000000..878e0d1 --- /dev/null +++ b/src/frontend/src/components/User/cart/CartCheckout.vue @@ -0,0 +1,207 @@ + + + + + + diff --git a/src/frontend/src/components/User/cart/CartSummary.vue b/src/frontend/src/components/User/cart/CartSummary.vue new file mode 100644 index 0000000..c02d139 --- /dev/null +++ b/src/frontend/src/components/User/cart/CartSummary.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/frontend/src/components/cards/cart_item_card.vue b/src/frontend/src/components/cards/cart_item_card.vue index 92c5605..514734b 100644 --- a/src/frontend/src/components/cards/cart_item_card.vue +++ b/src/frontend/src/components/cards/cart_item_card.vue @@ -1,88 +1,96 @@ - - - - \ No newline at end of file +} + + + diff --git a/src/frontend/src/components/cards/category_card.vue b/src/frontend/src/components/cards/category_card.vue index 2dfcec1..e1ccc43 100644 --- a/src/frontend/src/components/cards/category_card.vue +++ b/src/frontend/src/components/cards/category_card.vue @@ -1,5 +1,5 @@ @@ -90,4 +134,38 @@ .order-row:not(:last-child) { border-bottom: 1px solid #f0f0f0; } + .items-table { + margin: 16px 0; + } + .product-cell { + display: flex; + align-items: center; + gap: 10px; + } + .product-image { + width: 50px; + height: 50px; + border-radius: 4px; + } + .image-placeholder { + width: 50px; + height: 50px; + background: #f5f7fa; + display: flex; + align-items: center; + justify-content: center; + color: #909399; + font-size: 12px; + } + .order-total { + text-align: right; + margin-top: 16px; + font-weight: 500; + font-size: 16px; + } + .price { + color: #f56c6c; + font-size: 18px; + margin-left: 8px; + } \ No newline at end of file diff --git a/src/frontend/src/components/cards/product_card.vue b/src/frontend/src/components/cards/product_card.vue new file mode 100644 index 0000000..e25fb87 --- /dev/null +++ b/src/frontend/src/components/cards/product_card.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/frontend/src/views/Merchant_manage.vue b/src/frontend/src/components/cards/shop_card.vue similarity index 100% rename from src/frontend/src/views/Merchant_manage.vue rename to src/frontend/src/components/cards/shop_card.vue diff --git a/src/frontend/src/components/cards/store_card.vue b/src/frontend/src/components/cards/store_card.vue new file mode 100644 index 0000000..824547d --- /dev/null +++ b/src/frontend/src/components/cards/store_card.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/frontend/src/components/cards/user_info.vue b/src/frontend/src/components/cards/user_info.vue index 29908b1..8f78d54 100644 --- a/src/frontend/src/components/cards/user_info.vue +++ b/src/frontend/src/components/cards/user_info.vue @@ -13,10 +13,12 @@ - - Orders ({{ orderCount }}) - Favorites ({{ favoriteCount }}) - Personal Info + + Profile + Orders ({{ realOrderCount }}) + Cart ({{ realCartCount }}) + Address + @@ -24,7 +26,15 @@ + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/OrderManage.vue b/src/frontend/src/components/dashboard/OrderManage.vue deleted file mode 100644 index 71e1b24..0000000 --- a/src/frontend/src/components/dashboard/OrderManage.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/admin/StoreChangeReviewer.vue b/src/frontend/src/components/dashboard/admin/StoreChangeReviewer.vue new file mode 100644 index 0000000..a87a274 --- /dev/null +++ b/src/frontend/src/components/dashboard/admin/StoreChangeReviewer.vue @@ -0,0 +1,342 @@ + + + + + diff --git a/src/frontend/src/components/dashboard/manage/order_manage_card.vue b/src/frontend/src/components/dashboard/manage/order_manage_card.vue deleted file mode 100644 index 56d7193..0000000 --- a/src/frontend/src/components/dashboard/manage/order_manage_card.vue +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/General.vue b/src/frontend/src/components/dashboard/merchant/General.vue similarity index 100% rename from src/frontend/src/components/dashboard/General.vue rename to src/frontend/src/components/dashboard/merchant/General.vue diff --git a/src/frontend/src/components/dashboard/merchant/OrderManage.vue b/src/frontend/src/components/dashboard/merchant/OrderManage.vue new file mode 100644 index 0000000..a4f7d2a --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/OrderManage.vue @@ -0,0 +1,169 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/StoreChangeRequests.vue b/src/frontend/src/components/dashboard/merchant/StoreChangeRequests.vue new file mode 100644 index 0000000..164f00f --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/StoreChangeRequests.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/src/frontend/src/components/dashboard/merchant/StoreManagement.vue b/src/frontend/src/components/dashboard/merchant/StoreManagement.vue new file mode 100644 index 0000000..51ab98d --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/StoreManagement.vue @@ -0,0 +1,467 @@ + + + + + diff --git a/src/frontend/src/components/dashboard/merchant/orderManage/OrderCard.vue b/src/frontend/src/components/dashboard/merchant/orderManage/OrderCard.vue new file mode 100644 index 0000000..792db81 --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/orderManage/OrderCard.vue @@ -0,0 +1,240 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/ProductFormDialog.vue b/src/frontend/src/components/dashboard/merchant/storeManage/ProductFormDialog.vue new file mode 100644 index 0000000..48c4df6 --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/ProductFormDialog.vue @@ -0,0 +1,60 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/ProductListTable.vue b/src/frontend/src/components/dashboard/merchant/storeManage/ProductListTable.vue new file mode 100644 index 0000000..a5a4097 --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/ProductListTable.vue @@ -0,0 +1,38 @@ + + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/ProductManagementDialog.vue b/src/frontend/src/components/dashboard/merchant/storeManage/ProductManagementDialog.vue new file mode 100644 index 0000000..3f10cce --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/ProductManagementDialog.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/StockDialog.vue b/src/frontend/src/components/dashboard/merchant/storeManage/StockDialog.vue new file mode 100644 index 0000000..01c674f --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/StockDialog.vue @@ -0,0 +1,46 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/StoreForm.vue b/src/frontend/src/components/dashboard/merchant/storeManage/StoreForm.vue new file mode 100644 index 0000000..b521e60 --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/StoreForm.vue @@ -0,0 +1,49 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/StoreFormDialog.vue b/src/frontend/src/components/dashboard/merchant/storeManage/StoreFormDialog.vue new file mode 100644 index 0000000..87d4b42 --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/StoreFormDialog.vue @@ -0,0 +1,52 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/StoreHeader.vue b/src/frontend/src/components/dashboard/merchant/storeManage/StoreHeader.vue new file mode 100644 index 0000000..3a66d9a --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/StoreHeader.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/frontend/src/components/dashboard/merchant/storeManage/StoreListTable.vue b/src/frontend/src/components/dashboard/merchant/storeManage/StoreListTable.vue new file mode 100644 index 0000000..b6f6b1a --- /dev/null +++ b/src/frontend/src/components/dashboard/merchant/storeManage/StoreListTable.vue @@ -0,0 +1,38 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/components/explore/FilterSidebar.vue b/src/frontend/src/components/explore/FilterSidebar.vue new file mode 100644 index 0000000..631b8da --- /dev/null +++ b/src/frontend/src/components/explore/FilterSidebar.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/frontend/src/components/explore/ProductGrid.vue b/src/frontend/src/components/explore/ProductGrid.vue new file mode 100644 index 0000000..694564d --- /dev/null +++ b/src/frontend/src/components/explore/ProductGrid.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/frontend/src/components/home/CategoryList.vue b/src/frontend/src/components/home/CategoryList.vue index 704092f..015a1db 100644 --- a/src/frontend/src/components/home/CategoryList.vue +++ b/src/frontend/src/components/home/CategoryList.vue @@ -1,14 +1,23 @@ - \ No newline at end of file diff --git a/src/frontend/src/main.js b/src/frontend/src/main.js index e10305d..bf814b4 100644 --- a/src/frontend/src/main.js +++ b/src/frontend/src/main.js @@ -1,3 +1,4 @@ +// src/main.ts import './assets/main.css' import { createApp } from 'vue' @@ -5,18 +6,51 @@ import { createPinia } from 'pinia' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import axios from 'axios' +import router from './router' +import App from './App.vue' +// === Axios 全局配置 === +// 1. 基础地址 +axios.defaults.baseURL = 'http://127.0.0.1:8000/api/v1' -import App from './App.vue' -import router from './router' +// 2. 请求拦截:自动加上 Authorization +axios.interceptors.request.use(config => { + const token = localStorage.getItem('access_token') + if (token) { + config.headers = config.headers ?? {} + config.headers.Authorization = `Bearer ${token}` + } + return config +}) +// 3. 响应拦截:遇到 401 清除 token 并跳登录 +axios.interceptors.response.use( + response => response, + error => { + const status = error.response?.status + if (status === 401) { + // 清除过期 Token + localStorage.removeItem('access_token') + // 跳转登录,并带上 redirect 查询参数 + router.replace({ + name: 'Login', + query: { redirect: router.currentRoute.value.fullPath } + }) + } + return Promise.reject(error) + } +) + +// === Vue 应用初始化 === const app = createApp(App) +// 全局注册 ElementPlus 图标 for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) } + app.use(createPinia()) app.use(router) app.use(ElementPlus) - -app.mount('#app') \ No newline at end of file +app.mount('#app') diff --git a/src/frontend/src/router/index.js b/src/frontend/src/router/index.js index af53d23..a71b52a 100644 --- a/src/frontend/src/router/index.js +++ b/src/frontend/src/router/index.js @@ -18,22 +18,52 @@ const router = createRouter({ name: 'Product', component: () => import('../views/ProductDetail.vue') }, + // 用户相关路由 { - path: '/cart', - name: 'Cart', - component: () => import('../views/Cart.vue') + path: '/user', + component: () => import('../components/layout/UserLayout.vue'), + children: [ + { path: '', redirect: 'profile' }, + { path: 'profile', name: 'profile', component: () => import('../components/User/UserProfile.vue') }, + { path: 'address', name: 'address', component: () => import('../components/User/UserAddress.vue') }, + { path: 'order', name: 'order', component: () => import('../components/User/UserOrder.vue') }, + { path: 'cart', name: 'cart', component: () => import('../components/User/UserCart.vue') } + ] }, { - path: '/order', - name: 'Order', - component: () => import('../views/Order.vue') + path: '/merchant', + name: 'Merchant', + component: () => import('../views/DashBoard/Dashboard.vue'), }, { - path: '/admin', - name: 'Admin', - component: () => import('../views/Analysis/Dashboard.vue'), - } + path: '/explore', + name: 'Explore', + component: () => import('../views/Explore.vue') + }, + { + path: '/payment/:id', + name: 'Payment', + component: () => import('../views/Payment.vue') + }, + // 新增商店列表路由 + { + path: '/stores', + name: 'Stores', + component: () => import('../views/Stores.vue') + }, ], }) -export default router +// 路由守卫:未登录跳转到 /login +router.beforeEach((to, from, next) => { + const publicPages = ['/login'] + const authRequired = to.path.startsWith('/user/') + const token = localStorage.getItem('access_token') + if (authRequired && !token) { + next('/login') + } else { + next() + } +}) + +export default router \ No newline at end of file diff --git a/src/frontend/src/views/Analysis/Dashboard.vue b/src/frontend/src/views/Analysis/Dashboard.vue deleted file mode 100644 index 14b37e5..0000000 --- a/src/frontend/src/views/Analysis/Dashboard.vue +++ /dev/null @@ -1,128 +0,0 @@ - - - - - diff --git a/src/frontend/src/views/Cart.vue b/src/frontend/src/views/Cart.vue index 180241c..3d89ce5 100644 --- a/src/frontend/src/views/Cart.vue +++ b/src/frontend/src/views/Cart.vue @@ -27,7 +27,7 @@ + + + + \ No newline at end of file diff --git a/src/frontend/src/views/Explore.vue b/src/frontend/src/views/Explore.vue new file mode 100644 index 0000000..57943e3 --- /dev/null +++ b/src/frontend/src/views/Explore.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/frontend/src/views/Login.vue b/src/frontend/src/views/Login.vue index 1eee6d6..2624ad8 100644 --- a/src/frontend/src/views/Login.vue +++ b/src/frontend/src/views/Login.vue @@ -3,8 +3,7 @@ @@ -98,8 +97,6 @@ import { ElMessage } from 'element-plus' import axios from 'axios' import { useRouter } from 'vue-router' -// 全局 baseURL(放最上面,只执行一次) -axios.defaults.baseURL = 'http://127.0.0.1:8000/api/v1' const router = useRouter() const activeTab = ref('login') @@ -159,23 +156,29 @@ const handleTabClick = (tab: any) => { activeTab.value = tab.name } +import qs from 'qs' + const login = async () => { - await loginFormRef.value?.validate(async (valid: boolean) => { - if (!valid) return - loginLoading.value = true - try { - await axios.post('/user/login', { - Username: loginForm.username, - Password: loginForm.password, - }) - ElMessage.success('登录成功') - router.push('/') - } catch { - ElMessage.error('登录失败') - } finally { - loginLoading.value = false - } - }) + loginLoading.value = true + try { + const res = await axios.post( + '/auth/token', + qs.stringify({ + grant_type: 'password', + username: loginForm.username, + password: loginForm.password, + }), + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + const token = res.data.access_token + localStorage.setItem('access_token', token) + ElMessage.success('登录成功') + router.push('/') + } catch { + ElMessage.error('登录失败') + } finally { + loginLoading.value = false + } } const register = async () => { @@ -187,14 +190,39 @@ const register = async () => { } registerLoading.value = true try { - await axios.post('/user/register', { + // 构造提交数据,手机号为空时不提交 phone 字段 + const data: Record = { Username: registerForm.username, Email: registerForm.email, - PhoneNumber: registerForm.phone, Password: registerForm.password, - }) - ElMessage.success('注册成功,正在跳转…') - router.push('/') + } + if (registerForm.phone && registerForm.phone.trim() !== '') { + data.PhoneNumber = registerForm.phone + } + await axios.post('/user/register', data) + ElMessage.success('注册成功,正在自动登录...') + + // 注册成功后自动登录 + try { + const res = await axios.post( + '/auth/token', + qs.stringify({ + grant_type: 'password', + username: registerForm.username, + password: registerForm.password, + }), + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + const token = res.data.access_token + localStorage.setItem('access_token', token) + router.push('/') + } catch (loginError) { + ElMessage.warning('自动登录失败,请手动登录') + // 自动切换到登录标签 + activeTab.value = 'login' + // 预填用户名 + loginForm.username = registerForm.username + } } catch (error) { console.error(error) if (axios.isAxiosError(error) && error.response) { diff --git a/src/frontend/src/views/Order.vue b/src/frontend/src/views/Order.vue deleted file mode 100644 index c5244a5..0000000 --- a/src/frontend/src/views/Order.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/frontend/src/views/Payment.vue b/src/frontend/src/views/Payment.vue new file mode 100644 index 0000000..7bae963 --- /dev/null +++ b/src/frontend/src/views/Payment.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/frontend/src/views/ProductDetail.vue b/src/frontend/src/views/ProductDetail.vue index 4365588..fa09a13 100644 --- a/src/frontend/src/views/ProductDetail.vue +++ b/src/frontend/src/views/ProductDetail.vue @@ -10,7 +10,7 @@ const productId = route.params.product_id const product = ref(null) const loading = ref(true) const error = ref('') -axios.defaults.baseURL = 'http://127.0.1:8000/api/v1' + onMounted(async () => { try { @@ -77,6 +77,7 @@ const handleAddToCart = (qty: number) => { diff --git a/src/frontend/src/views/Stores.vue b/src/frontend/src/views/Stores.vue new file mode 100644 index 0000000..9a037a2 --- /dev/null +++ b/src/frontend/src/views/Stores.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/openapi.json b/src/openapi.json new file mode 100644 index 0000000..881b38a --- /dev/null +++ b/src/openapi.json @@ -0,0 +1 @@ +{"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 new file mode 100644 index 0000000..1c967c5 --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,163 @@ +{ + "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" + } + } + } +}