{"openapi":"3.1.0","info":{"title":"ZhenCollege API","description":"ZhenCollege 1V1在线教学平台后端API","version":"1.0.0"},"paths":{"/api/auth/register":{"post":{"tags":["认证"],"summary":"Register","description":"用户注册\n- 手机号注册（先不接短信验证码，后续迭代）\n- 密码使用bcrypt加密","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["认证"],"summary":"Login","description":"用户登录\n- 手机号 + 密码登录\n- 返回JWT Token","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"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/auth/me":{"get":{"tags":["认证"],"summary":"Get Me","description":"获取当前用户信息\n- 需要JWT认证","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/categories":{"get":{"tags":["课程管理"],"summary":"Get Categories","description":"获取所有课程分类\n返回分类列表及每个分类的课程数量","operationId":"get_categories_api_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CourseCategoryResponse"},"type":"array","title":"Response Get Categories Api Categories Get"}}}}}}},"/api/categories/{category_id}/courses":{"get":{"tags":["课程管理"],"summary":"Get Courses By Category","description":"获取某分类下的所有课程\n支持分页和排序","operationId":"get_courses_by_category_api_categories__category_id__courses_get","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(created_at|rating|price)$","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/courses":{"post":{"tags":["课程管理"],"summary":"Create Course","description":"创建课程（需要教师权限）\n自动关联当前用户为教师","operationId":"create_course_api_courses_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["课程管理"],"summary":"Get Courses","description":"获取课程列表\n支持按分类、搜索、难度筛选，支持分页和排序","operationId":"get_courses_api_courses_get","parameters":[{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(created_at|rating|price)$","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/courses/{course_id}":{"get":{"tags":["课程管理"],"summary":"Get Course","description":"获取课程详情\n包含教师信息、套餐列表、评价列表","operationId":"get_course_api_courses__course_id__get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["课程管理"],"summary":"Update Course","description":"更新课程（需要课程拥有者权限）","operationId":"update_course_api_courses__course_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["课程管理"],"summary":"Delete Course","description":"删除课程（需要课程拥有者权限）","operationId":"delete_course_api_courses__course_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/courses/{course_id}/reviews":{"post":{"tags":["课程管理"],"summary":"Create Review","description":"创建课程评价\n需要已上过课的学生","operationId":"create_review_api_courses__course_id__reviews_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseReviewCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["课程管理"],"summary":"Get Course Reviews","description":"获取课程评价列表\n支持分页","operationId":"get_course_reviews_api_courses__course_id__reviews_get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teachers":{"get":{"tags":["教师管理"],"summary":"Get Teachers","description":"获取教师列表\n支持按分类、评分、时薪筛选，支持分页","operationId":"get_teachers_api_teachers_get","parameters":[{"name":"course_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Course Id"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Rating"}},{"name":"max_rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Rate"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teachers/{teacher_id}":{"get":{"tags":["教师管理"],"summary":"Get Teacher","description":"获取教师详情\n包含教师信息、课程列表、可用时间","operationId":"get_teacher_api_teachers__teacher_id__get","parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"integer","title":"Teacher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teachers/{teacher_id}/courses":{"get":{"tags":["教师管理"],"summary":"Get Teacher Courses","description":"获取某教师的所有课程","operationId":"get_teacher_courses_api_teachers__teacher_id__courses_get","parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"integer","title":"Teacher Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teachers/become":{"post":{"tags":["教师管理"],"summary":"Become Teacher","description":"申请成为教师\n创建教师资料","operationId":"become_teacher_api_teachers_become_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BecomeTeacherRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/teachers/me/availability":{"post":{"tags":["预约管理"],"summary":"Set Teacher Availability","description":"设置教师可用时间（批量）\n需要教师权限","operationId":"set_teacher_availability_api_teachers_me_availability_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAvailabilityBulkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/teachers/{teacher_id}/availability":{"get":{"tags":["预约管理"],"summary":"Get Teacher Availability","description":"获取教师可用时间\n可选查询某天的可用时间段","operationId":"get_teacher_availability_api_teachers__teacher_id__availability_get","parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"integer","title":"Teacher Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeacherAvailabilityResponse"},"title":"Response Get Teacher Availability Api Teachers  Teacher Id  Availability Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teachers/{teacher_id}/available-slots":{"get":{"tags":["预约管理"],"summary":"Get Available Slots","description":"获取教师某段时间内的可预约时间段\n根据课程时长计算具体可预约的时间段","operationId":"get_available_slots_api_teachers__teacher_id__available_slots_get","parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"integer","title":"Teacher Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","title":"End Date"}},{"name":"duration","in":"query","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"description":"Duration in minutes","title":"Duration"},"description":"Duration in minutes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AvailableSlot"},"title":"Response Get Available Slots Api Teachers  Teacher Id  Available Slots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookings":{"post":{"tags":["预约管理"],"summary":"Create Booking","description":"创建预约\n实现分布式锁防止双重预约，并扣减课时","operationId":"create_booking_api_bookings_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["预约管理"],"summary":"Get Bookings","description":"获取我的预约列表\n学生看到自己的预约，教师看到自己被预约的课程","operationId":"get_bookings_api_bookings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookings/{booking_id}":{"get":{"tags":["预约管理"],"summary":"Get Booking","description":"获取预约详情","operationId":"get_booking_api_bookings__booking_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookings/{booking_id}/cancel":{"put":{"tags":["预约管理"],"summary":"Cancel Booking","description":"取消预约\n更新状态、退回课时、发送通知","operationId":"cancel_booking_api_bookings__booking_id__cancel_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCancelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookings/{booking_id}/complete":{"put":{"tags":["预约管理"],"summary":"Complete Booking","description":"完成课程（教师操作）\n上传录像链接等","operationId":"complete_booking_api_bookings__booking_id__complete_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders":{"post":{"tags":["orders"],"summary":"Create Order","description":"创建订单\n用户选择课程套餐后创建订单，待支付","operationId":"create_order_api_orders_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["orders"],"summary":"Get My Orders","description":"获取当前用户的订单列表","operationId":"get_my_orders_api_orders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/{order_id}":{"get":{"tags":["orders"],"summary":"Get Order By Id","description":"获取订单详情","operationId":"get_order_by_id_api_orders__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/by-order-no/{order_no}":{"get":{"tags":["orders"],"summary":"Get Order By Order No","description":"通过商户订单号获取订单详情","operationId":"get_order_by_order_no_api_orders_by_order_no__order_no__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_no","in":"path","required":true,"schema":{"type":"string","title":"Order No"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/{order_id}/cancel":{"post":{"tags":["orders"],"summary":"Cancel Order","description":"取消订单（仅限未支付订单）","operationId":"cancel_order_api_orders__order_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/credits/my":{"get":{"tags":["orders"],"summary":"Get My Credits","description":"获取当前用户的所有课时","operationId":"get_my_credits_api_orders_credits_my_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreditsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/orders/credits/course/{course_id}":{"get":{"tags":["orders"],"summary":"Get Course Credits","description":"获取用户在特定课程的课时","operationId":"get_course_credits_api_orders_credits_course__course_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCourseCreditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","description":"Health check endpoint","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check for monitoring","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/test-decimal":{"get":{"summary":"Test Decimal","description":"Test decimal to float conversion","operationId":"test_decimal_test_decimal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payments/create":{"post":{"tags":["payments"],"summary":"Create Payment","description":"创建支付订单\n\n支持支付宝和微信支付","operationId":"create_payment_api_payments_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentRequest"}}},"required":true},"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"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/payments/status/{order_id}":{"get":{"tags":["payments"],"summary":"Query Order Status","description":"查询订单支付状态，并在第三方确认成功时同步本地订单状态","operationId":"query_order_status_api_payments_status__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}},{"name":"provider","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PaymentProvider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/alipay/return-sync":{"post":{"tags":["payments"],"summary":"Sync Alipay Return","description":"基于支付宝浏览器返回参数做一次服务端验签与状态同步。\n\n这条链路用于覆盖 webhook 尚未到达但用户已回到站内成功页的场景。","operationId":"sync_alipay_return_api_payments_alipay_return_sync_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Params"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/payments/alipay/test-order":{"post":{"tags":["payments"],"summary":"Create Test Alipay Order","description":"创建支付宝测试订单（0.01元小额测试）\n\n生成ZC前缀订单号以测试完整的路由→回调→订单更新流程","operationId":"create_test_alipay_order_api_payments_alipay_test_order_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payments/wechat/test-order":{"post":{"tags":["payments"],"summary":"Create Test Wechat Order","description":"创建微信支付测试订单（0.01元小额测试）\n\n生成ZC前缀订单号以测试完整的路由→回调→订单更新流程","operationId":"create_test_wechat_order_api_payments_wechat_test_order_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/alipay":{"post":{"tags":["webhooks"],"summary":"Alipay Webhook","description":"支付宝支付回调处理\n文档: https://opendocs.alipay.com/open/270/105902\n\n接收来自路由服务转发的支付宝回调（ZC前缀订单）\n全局回调: https://www.zhenrobot.com/api/webhooks/alipay\n转发到: https://www.zhencollege.com/api/webhooks/alipay","operationId":"alipay_webhook_api_webhooks_alipay_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/wechat":{"post":{"tags":["webhooks"],"summary":"Wechat Webhook","description":"微信支付回调处理\n文档: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_5.shtml\n\n接收来自路由服务转发的微信支付回调（ZC前缀订单）\n全局回调: https://www.zhenrobot.com/api/webhooks/wechat\n转发到: https://www.zhencollege.com/api/webhooks/wechat","operationId":"wechat_webhook_api_webhooks_wechat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/alipay/test":{"get":{"tags":["webhooks"],"summary":"Test Alipay","description":"测试支付宝回调接收（仅开发环境）","operationId":"test_alipay_api_webhooks_alipay_test_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/wechat/test":{"get":{"tags":["webhooks"],"summary":"Test Wechat","description":"测试微信支付回调接收（仅开发环境）","operationId":"test_wechat_api_webhooks_wechat_test_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AvailableSlot":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"is_available":{"type":"boolean","title":"Is Available","default":true}},"type":"object","required":["start_time","end_time"],"title":"AvailableSlot"},"BecomeTeacherRequest":{"properties":{"bio":{"type":"string","title":"Bio"},"specialties":{"items":{"type":"string"},"type":"array","title":"Specialties"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"string"}],"title":"Hourly Rate"}},"type":"object","required":["bio","specialties","hourly_rate"],"title":"BecomeTeacherRequest"},"BookingCancelRequest":{"properties":{"cancel_reason":{"type":"string","maxLength":500,"minLength":1,"title":"Cancel Reason"}},"type":"object","required":["cancel_reason"],"title":"BookingCancelRequest"},"BookingCompleteRequest":{"properties":{"recording_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Recording Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"BookingCompleteRequest"},"BookingCreate":{"properties":{"teacher_id":{"type":"integer","title":"Teacher Id"},"course_id":{"type":"integer","title":"Course Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"duration":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration","description":"Duration in minutes"}},"type":"object","required":["teacher_id","course_id","start_time","duration"],"title":"BookingCreate"},"BookingIntentCreate":{"properties":{"teacher_id":{"type":"integer","title":"Teacher Id"},"course_id":{"type":"integer","title":"Course Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"duration":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration","description":"预约时长（分钟）"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["teacher_id","course_id","start_time","duration"],"title":"BookingIntentCreate"},"BookingIntentResponse":{"properties":{"id":{"type":"integer","title":"Id"},"order_id":{"type":"integer","title":"Order Id"},"user_id":{"type":"integer","title":"User Id"},"teacher_id":{"type":"integer","title":"Teacher Id"},"course_id":{"type":"integer","title":"Course Id"},"booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"status":{"type":"string","title":"Status"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","order_id","user_id","teacher_id","course_id","booking_id","start_time","duration_minutes","status","failure_reason","notes","created_at","updated_at"],"title":"BookingIntentResponse"},"BookingResponse":{"properties":{"teacher_id":{"type":"integer","title":"Teacher Id"},"course_id":{"type":"integer","title":"Course Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"id":{"type":"integer","title":"Id"},"student_id":{"type":"integer","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"student_avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Avatar"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"teacher_avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Avatar"},"course_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Title"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"status":{"type":"string","title":"Status"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"meeting_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Url"},"recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recording Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["teacher_id","course_id","start_time","id","student_id","student_name","student_avatar","teacher_name","teacher_avatar","course_title","end_time","status","cancel_reason","meeting_url","recording_url","created_at","updated_at"],"title":"BookingResponse"},"CourseCategoryResponse":{"properties":{"name":{"type":"string","maxLength":50,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Icon Url"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"id":{"type":"integer","title":"Id"},"course_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Course Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"CourseCategoryResponse"},"CourseCreate":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration","description":"Duration in minutes"},"difficulty":{"type":"string","pattern":"^(beginner|intermediate|advanced)$","title":"Difficulty","default":"beginner"},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Thumbnail Url"},"project_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Outcome"},"curriculum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curriculum"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"},"packages":{"items":{"$ref":"#/components/schemas/CoursePackageCreate"},"type":"array","minItems":1,"title":"Packages"}},"type":"object","required":["title","duration","packages"],"title":"CourseCreate"},"CourseDetailResponse":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration","description":"Duration in minutes"},"difficulty":{"type":"string","pattern":"^(beginner|intermediate|advanced)$","title":"Difficulty","default":"beginner"},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Thumbnail Url"},"project_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Outcome"},"curriculum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curriculum"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"},"id":{"type":"integer","title":"Id"},"teacher_id":{"type":"integer","title":"Teacher Id"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"teacher_bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Bio"},"teacher_avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Avatar"},"teacher_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Teacher Rating"},"teacher_total_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Teacher Total Hours"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"status":{"type":"string","title":"Status"},"view_count":{"type":"integer","title":"View Count"},"packages":{"items":{"$ref":"#/components/schemas/CoursePackageResponse"},"type":"array","title":"Packages","default":[]},"reviews":{"items":{"$ref":"#/components/schemas/CourseReviewResponse"},"type":"array","title":"Reviews","default":[]},"avg_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Rating"},"review_count":{"type":"integer","title":"Review Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["title","duration","id","teacher_id","teacher_name","teacher_bio","teacher_avatar","category_name","status","view_count","created_at","updated_at"],"title":"CourseDetailResponse"},"CourseListItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"teacher_id":{"type":"integer","title":"Teacher Id"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"teacher_avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Avatar"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration":{"type":"integer","title":"Duration"},"difficulty":{"type":"string","title":"Difficulty"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"status":{"type":"string","title":"Status"},"view_count":{"type":"integer","title":"View Count"},"project_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Outcome"},"curriculum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curriculum"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"review_count":{"type":"integer","title":"Review Count","default":0},"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","category_id","category_name","teacher_id","teacher_name","teacher_avatar","description","duration","difficulty","thumbnail_url","status","view_count","created_at"],"title":"CourseListItem"},"CoursePackageCreate":{"properties":{"name":{"type":"string","maxLength":50,"title":"Name"},"sessions":{"type":"integer","exclusiveMinimum":0.0,"title":"Sessions"},"price":{"type":"number","minimum":0.0,"title":"Price"},"original_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Original Price"},"validity_days":{"type":"integer","exclusiveMinimum":0.0,"title":"Validity Days","default":365},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","sessions","price"],"title":"CoursePackageCreate"},"CoursePackageResponse":{"properties":{"name":{"type":"string","maxLength":50,"title":"Name"},"sessions":{"type":"integer","exclusiveMinimum":0.0,"title":"Sessions"},"price":{"type":"number","minimum":0.0,"title":"Price"},"original_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Original Price"},"validity_days":{"type":"integer","exclusiveMinimum":0.0,"title":"Validity Days","default":365},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"course_id":{"type":"integer","title":"Course Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","sessions","price","id","course_id","created_at"],"title":"CoursePackageResponse"},"CourseReviewCreate":{"properties":{"rating":{"type":"number","maximum":5.0,"minimum":0.0,"title":"Rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["rating"],"title":"CourseReviewCreate"},"CourseReviewResponse":{"properties":{"rating":{"type":"number","maximum":5.0,"minimum":0.0,"title":"Rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"id":{"type":"integer","title":"Id"},"course_id":{"type":"integer","title":"Course Id"},"student_id":{"type":"integer","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"student_avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Avatar"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["rating","id","course_id","student_id","created_at","updated_at"],"title":"CourseReviewResponse"},"CourseUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration"},"difficulty":{"anyOf":[{"type":"string","pattern":"^(beginner|intermediate|advanced)$"},{"type":"null"}],"title":"Difficulty"},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Thumbnail Url"},"status":{"anyOf":[{"type":"string","pattern":"^(draft|published|archived)$"},{"type":"null"}],"title":"Status"},"project_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Outcome"},"curriculum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Curriculum"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"}},"type":"object","title":"CourseUpdate"},"CreatePaymentRequest":{"properties":{"order_id":{"type":"string","title":"Order Id","description":"订单ID"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount","description":"支付金额（元）"},"subject":{"type":"string","maxLength":256,"title":"Subject","description":"订单标题"},"body":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Body","description":"订单描述"},"provider":{"allOf":[{"$ref":"#/components/schemas/PaymentProvider"}],"description":"支付方式"}},"type":"object","required":["order_id","amount","subject","provider"],"title":"CreatePaymentRequest","description":"创建支付请求"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OrderCreate":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrderItemCreate"},"type":"array","minItems":1,"title":"Items"},"booking_intent":{"anyOf":[{"$ref":"#/components/schemas/BookingIntentCreate"},{"type":"null"}]}},"type":"object","required":["items"],"title":"OrderCreate"},"OrderItemCreate":{"properties":{"course_id":{"type":"integer","title":"Course Id"},"package_id":{"type":"integer","title":"Package Id"},"quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","default":1}},"type":"object","required":["course_id","package_id"],"title":"OrderItemCreate"},"OrderItemResponse":{"properties":{"id":{"type":"integer","title":"Id"},"order_id":{"type":"integer","title":"Order Id"},"course_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Course Id"},"package_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Package Id"},"course_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Title"},"package_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Name"},"sessions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sessions"},"quantity":{"type":"integer","title":"Quantity"},"price":{"type":"number","title":"Price"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","order_id","course_id","package_id","course_title","package_name","sessions","quantity","price","created_at"],"title":"OrderItemResponse"},"OrderResponse":{"properties":{"id":{"type":"integer","title":"Id"},"order_no":{"type":"string","title":"Order No"},"user_id":{"type":"integer","title":"User Id"},"total_amount":{"type":"number","title":"Total Amount"},"status":{"type":"string","title":"Status"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"items":{"items":{"$ref":"#/components/schemas/OrderItemResponse"},"type":"array","title":"Items","default":[]},"booking_intent":{"anyOf":[{"$ref":"#/components/schemas/BookingIntentResponse"},{"type":"null"}]},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","order_no","user_id","total_amount","status","payment_method","paid_at","cancelled_at","created_at","updated_at"],"title":"OrderResponse"},"OrderStatusResponse":{"properties":{"order_id":{"type":"string","title":"Order Id","description":"订单ID"},"status":{"$ref":"#/components/schemas/PaymentStatus"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At","description":"支付时间"},"amount":{"type":"number","title":"Amount","description":"订单金额"},"provider":{"$ref":"#/components/schemas/PaymentProvider"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id","description":"第三方交易号"}},"type":"object","required":["order_id","status","amount","provider"],"title":"OrderStatusResponse","description":"订单状态查询响应"},"PaginatedBookingResponse":{"properties":{"bookings":{"items":{"$ref":"#/components/schemas/BookingResponse"},"type":"array","title":"Bookings"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["bookings","total","page","page_size","total_pages"],"title":"PaginatedBookingResponse"},"PaginatedCourseResponse":{"properties":{"courses":{"items":{"$ref":"#/components/schemas/CourseListItem"},"type":"array","title":"Courses"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["courses","total","page","page_size","total_pages"],"title":"PaginatedCourseResponse"},"PaginatedOrderResponse":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderResponse"},"type":"array","title":"Orders"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["orders","total","page","page_size","total_pages"],"title":"PaginatedOrderResponse"},"PaginatedReviewResponse":{"properties":{"reviews":{"items":{"$ref":"#/components/schemas/CourseReviewResponse"},"type":"array","title":"Reviews"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["reviews","total","page","page_size","total_pages"],"title":"PaginatedReviewResponse"},"PaymentProvider":{"type":"string","enum":["alipay","wechat"],"title":"PaymentProvider","description":"支付提供商"},"PaymentResponse":{"properties":{"payment_id":{"type":"string","title":"Payment Id","description":"支付流水号"},"order_id":{"type":"string","title":"Order Id","description":"订单ID"},"provider":{"$ref":"#/components/schemas/PaymentProvider"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url","description":"支付URL（支付宝）"},"code_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Url","description":"二维码URL（微信）"},"expires_at":{"type":"string","title":"Expires At","description":"过期时间(ISO 8601格式，包含时区标记)"}},"type":"object","required":["payment_id","order_id","provider","expires_at"],"title":"PaymentResponse","description":"支付响应"},"PaymentStatus":{"type":"string","enum":["pending","paid","failed","refunded","cancelled"],"title":"PaymentStatus","description":"支付状态"},"TeacherAvailabilityBulkCreate":{"properties":{"slots":{"items":{"$ref":"#/components/schemas/TeacherAvailabilityCreate"},"type":"array","minItems":1,"title":"Slots"}},"type":"object","required":["slots"],"title":"TeacherAvailabilityBulkCreate"},"TeacherAvailabilityCreate":{"properties":{"day_of_week":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Day Of Week","description":"0=Sunday, 6=Saturday"},"start_time":{"type":"string","format":"time","title":"Start Time"},"end_time":{"type":"string","format":"time","title":"End Time"},"is_available":{"type":"boolean","title":"Is Available","default":true}},"type":"object","required":["day_of_week","start_time","end_time"],"title":"TeacherAvailabilityCreate"},"TeacherAvailabilityResponse":{"properties":{"day_of_week":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Day Of Week","description":"0=Sunday, 6=Saturday"},"start_time":{"type":"string","format":"time","title":"Start Time"},"end_time":{"type":"string","format":"time","title":"End Time"},"is_available":{"type":"boolean","title":"Is Available","default":true},"id":{"type":"integer","title":"Id"},"teacher_id":{"type":"integer","title":"Teacher Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["day_of_week","start_time","end_time","id","teacher_id","created_at","updated_at"],"title":"TeacherAvailabilityResponse"},"TeacherDetailResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"specialties":{"items":{"type":"string"},"type":"array","title":"Specialties","default":[]},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"total_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Hours"},"total_students":{"type":"integer","title":"Total Students","default":0},"response_time":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time"},"status":{"type":"string","title":"Status"},"course_count":{"type":"integer","title":"Course Count","default":0},"review_count":{"type":"integer","title":"Review Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"type":"string","title":"Phone"},"courses":{"items":{"type":"object"},"type":"array","title":"Courses","default":[]},"available_slots":{"items":{"type":"object"},"type":"array","title":"Available Slots","default":[]}},"type":"object","required":["id","user_id","username","bio","status","created_at","updated_at","email","phone"],"title":"TeacherDetailResponse"},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["access_token","user"],"title":"Token"},"UserCourseCreditResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"course_id":{"type":"integer","title":"Course Id"},"order_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order Id"},"course_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Title"},"course_thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Thumbnail"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"remaining_sessions":{"type":"integer","title":"Remaining Sessions"},"total_sessions":{"type":"integer","title":"Total Sessions"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","course_id","order_id","course_title","course_thumbnail","teacher_name","remaining_sessions","total_sessions","expires_at","created_at","updated_at"],"title":"UserCourseCreditResponse"},"UserCreate":{"properties":{"phone":{"type":"string","maxLength":11,"minLength":11,"title":"Phone","description":"手机号"},"password":{"type":"string","minLength":6,"title":"Password","description":"密码"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"用户名"},"role":{"type":"string","title":"Role","description":"角色: student/teacher/admin","default":"student"}},"type":"object","required":["phone","password"],"title":"UserCreate"},"UserCreditsResponse":{"properties":{"credits":{"items":{"$ref":"#/components/schemas/UserCourseCreditResponse"},"type":"array","title":"Credits"},"total_credits":{"type":"integer","title":"Total Credits"}},"type":"object","required":["credits","total_credits"],"title":"UserCreditsResponse"},"UserLogin":{"properties":{"phone":{"type":"string","title":"Phone","description":"手机号"},"password":{"type":"string","title":"Password","description":"密码"}},"type":"object","required":["phone","password"],"title":"UserLogin"},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"phone":{"type":"string","title":"Phone"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","phone","username","email","role","status","created_at"],"title":"UserResponse"},"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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}