{"openapi":"3.1.0","info":{"title":"同学录 API","description":"同学录 App 后端 API","version":"1.0.0"},"paths":{"/api/v1/auth/wx-login":{"post":{"tags":["认证"],"summary":"Wx Login","description":"微信登录\n1. 通过 code 换取 openid\n2. 老用户直接发 token；openid 未知时**不再直接建号**，\n   返回 bind_ticket 让前端引导绑定手机号（/auth/wx-bind），\n   手机号撞上已有账号时自动并入，避免一人两个账号。","operationId":"wx_login_api_v1_auth_wx_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/wx-bind":{"post":{"tags":["认证"],"summary":"Wx Bind","description":"微信首次登录绑定手机号：手机号没注册就建号；已注册且未绑微信则并入该账号。","operationId":"wx_bind_api_v1_auth_wx_bind_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WxBindPhone"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/bind-phone":{"post":{"tags":["认证"],"summary":"Bind Phone","description":"已登录用户补绑手机号（存量微信账号）：撞号时把当前账号并入手机号主账号。","operationId":"bind_phone_api_v1_auth_bind_phone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindPhone"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/send-code":{"post":{"tags":["认证"],"summary":"Send Verify Code","description":"发送注册验证码。\n\n当前未接入短信服务商，开发环境直接在响应中返回 dev_code 便于联调；\n接入短信服务后应改为真实下发，并移除 dev_code。","operationId":"send_verify_code_api_v1_auth_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneSendCode"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["认证"],"summary":"Register","description":"手机号注册（验证码 + 密码）","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneRegister"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/phone-login":{"post":{"tags":["认证"],"summary":"Phone Login","description":"手机号 + 密码登录","operationId":"phone_login_api_v1_auth_phone_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["用户","用户"],"summary":"Get Current User Info","description":"获取当前登录用户信息","operationId":"get_current_user_info_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeOut"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["用户","用户"],"summary":"Update Current User","description":"更新当前用户信息","operationId":"update_current_user_api_v1_users_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/profile-options":{"get":{"tags":["用户","用户"],"summary":"Get Profile Options","description":"资料扩展字段的可选项（前端下拉直接渲染，避免两边写死不一致）","operationId":"get_profile_options_api_v1_users_profile_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/users/{user_id}":{"get":{"tags":["用户","用户"],"summary":"Get User By Id","description":"获取用户公开信息\n\n公司 / 职位 / 常驻地 / 年薪 / 工龄 / 婚姻状态属于「同学可见」的半私密资料：\n只有本人、或与目标用户同在一个已通过审核的班级时才会返回，\n并且还是要看用户自己那一项的可见开关。\n\n手机号单独一套口径（见 `profile_fields.phone_view`）：默认仅自己可见，\n同班同学要等本人主动打开开关才拿得到，未登录 / 不共班一律不给。","operationId":"get_user_by_id_api_v1_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/my":{"get":{"tags":["班级"],"summary":"My Classes","description":"获取当前用户加入的所有班级","operationId":"my_classes_api_v1_classes_my_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes":{"get":{"tags":["班级"],"summary":"List Classes","description":"班级列表 / 发现页搜索\n\n支持按 school_id、school_name（模糊）、grade_year、province 组合筛选。\n\n浏览不需要实名，也不需要是成员：但**未加入的班级只返回公开摘要**\n（名称、总人数、已加入人数、动态数、聚会数），内部内容一律不返回。","operationId":"list_classes_api_v1_classes_get","parameters":[{"name":"school_id","in":"query","required":false,"schema":{"type":"string","title":"School Id"}},{"name":"school_name","in":"query","required":false,"schema":{"type":"string","title":"School Name"}},{"name":"grade_year","in":"query","required":false,"schema":{"type":"integer","title":"Grade Year"}},{"name":"province","in":"query","required":false,"schema":{"type":"string","title":"Province"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClassOut"},"title":"Response List Classes Api V1 Classes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["班级"],"summary":"Create Class","operationId":"create_class_api_v1_classes_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/former-names":{"post":{"tags":["班级"],"summary":"Set Former Names","description":"发起/替换本班曾用名提案（创建者或班长）。\n\n发起人视为已确认 1 票；确认满 min(5, 本班成员数) 人后立即生效。\n重复发起会替换旧提案并重新计票（旧票作废）。","operationId":"set_former_names_api_v1_classes__class_id__former_names_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormerNamesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/former-names/confirm":{"post":{"tags":["班级"],"summary":"Confirm Former Names","description":"成员确认本班的曾用名提案（一人一票，达标即生效）","operationId":"confirm_former_names_api_v1_classes__class_id__former_names_confirm_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/former-names/cancel":{"post":{"tags":["班级"],"summary":"Cancel Former Names","description":"撤销待确认的曾用名提案（发起人本人）","operationId":"cancel_former_names_api_v1_classes__class_id__former_names_cancel_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}":{"get":{"tags":["班级"],"summary":"Get Class","description":"班级详情\n\n已加入的成员：完整信息（含封面、邀请码）。\n未加入 / 未登录：只返回公开摘要，`public_only=true`。","operationId":"get_class_api_v1_classes__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"inviter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"分享链接里的邀请人，用于落地页显示「XX 邀请你加入」","title":"Inviter"},"description":"分享链接里的邀请人，用于落地页显示「XX 邀请你加入」"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/join":{"post":{"tags":["班级"],"summary":"Join Class By Id","operationId":"join_class_by_id_api_v1_classes__class_id__join_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"inviter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"邀请人 user_id（分享链接/邀请码落地时带上）","title":"Inviter Id"},"description":"邀请人 user_id（分享链接/邀请码落地时带上）"},{"name":"channel","in":"query","required":false,"schema":{"type":"string","description":"来源：link / timeline / code","default":"link","title":"Channel"},"description":"来源：link / timeline / code"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/join-by-code":{"post":{"tags":["班级"],"summary":"Join Class By Code","description":"凭邀请码加入班级（发现页「邀请码加入」入口）。\n\n与按 id 加入走完全相同的闸门：实名 → 学校/班级审核 → 年龄校验 → 待审核/自动通过。","operationId":"join_class_by_code_api_v1_classes_join_by_code_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinByCodeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/members":{"get":{"tags":["班级"],"summary":"List Members","description":"获取班级成员列表\n\n- 正式成员：看到真实姓名（班长/副班长加 `include_pending=true` 能带出待审核申请）\n- 未加入 / 未登录：返回**打码版**名录（姓 + **、无头像、无 user_id），\n  让落地页能展示「班里有这些人」，但点不进资料、也拿不到真实身份","operationId":"list_members_api_v1_classes__class_id__members_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"include_pending","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Pending"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/invites":{"get":{"tags":["班级"],"summary":"List Class Invites","description":"邀请榜：谁邀请了谁、每人邀请了几人。\n\n仅班级正式成员可见（邀请名单属于班内信息）。\n`count` 只算「现在仍在班里」的被邀请人；待审核 / 已移出的照实列出但不计数。","operationId":"list_class_invites_api_v1_classes__class_id__invites_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/summary":{"get":{"tags":["班级"],"summary":"Class Summary","description":"班级概览：成员数、照片数、照片里识别出的人数、已认领人数、创建者\n\n前端班级详情页顶部据此显示「共 N 人 · 已认领 M 人」以及创建者信息。\n正式成员给完整信息；**未加入的人也能拿到一份受限概览**（人数、认领进度、\n审核状态、能不能加入），但创建者打码、待审核数隐去、选举门槛不暴露。","operationId":"class_summary_api_v1_classes__class_id__summary_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/officers":{"get":{"tags":["班级治理","班级治理"],"summary":"Get Officers","description":"班委选举状态（公开可看，登录后带出「我的投票」）","operationId":"get_officers_api_v1_classes__class_id__officers_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/officers/vote":{"post":{"tags":["班级治理","班级治理"],"summary":"Vote Officers","description":"投出班长 + 副班长各一票（可重复投，覆盖旧票）","operationId":"vote_officers_api_v1_classes__class_id__officers_vote_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__class_governance__VoteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/members/pending":{"get":{"tags":["班级治理","班级治理"],"summary":"Pending Members","description":"待审核的入班申请（班长/副班长/创建者可见）","operationId":"pending_members_api_v1_classes__class_id__members_pending_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/members/{user_id}/review":{"post":{"tags":["班级治理","班级治理"],"summary":"Review Member","description":"审核/复审成员\n\n- approve  通过（新申请入班 / 复审后确认是本班同学）\n- reject   拒绝（未通过审核，可再次申请）\n- recheck  标记为需要复审（先冻结，等进一步确认）","operationId":"review_member_api_v1_classes__class_id__members__user_id__review_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__class_governance__ReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/approvals":{"get":{"tags":["班级治理","班级治理"],"summary":"List Approvals","description":"共同确认事项列表（本班成员可见进度，班长/副班长可签字）","operationId":"list_approvals_api_v1_classes__class_id__approvals_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["班级治理","班级治理"],"summary":"Create Approval","description":"发起共同确认（移出成员 / 删除班内动态）","operationId":"create_approval_api_v1_classes__class_id__approvals_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/approvals/{approval_id}/sign":{"post":{"tags":["班级治理","班级治理"],"summary":"Sign Approval","description":"班长/副班长签字确认（同意 / 拒绝）","operationId":"sign_approval_api_v1_classes__class_id__approvals__approval_id__sign_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalSignBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/precheck":{"post":{"tags":["照片"],"summary":"Precheck Photo","description":"创建班级时「先验证再上传」：只做毕业照判定，不落库、不存文件。\n\n返回 verdict：\n- yes    确认是毕业照，可以直接用\n- maybe  疑似毕业照，提示用户确认\n- no     明显不是毕业照，提示重新选择\n- unknown/analyzed=false  识别服务不可用，不阻塞流程\n\n允许匿名调用：创建班级前可能还没有登录态，这里只是判定图片，不落库。","operationId":"precheck_photo_api_v1_photos_precheck_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_precheck_photo_api_v1_photos_precheck_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/upload":{"post":{"tags":["照片"],"summary":"Upload Photo","description":"上传照片到班级相册\n\n- photo_type=graduation：上传后立即做「毕业照校验」，判定是毕业照才编号\n- photo_type=memory：纪念照，不做毕业照校验（相册里不该重复要求传毕业照），\n  需要给人脸编号时在照片上点「识别人脸」\n- 超过 10MB 的照片自动压缩后再入库（长边 2600px，压不够再降一档），不再直接拒绝\n- 毕业照会与其它班级的合影做 dHash 指纹比对，重复时 409 提示加入已有班级","operationId":"upload_photo_api_v1_photos_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_photo_api_v1_photos_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/class/{class_id}":{"get":{"tags":["照片"],"summary":"List Photos","description":"获取班级相册 - 返回纯数组匹配前端（仅限班级成员）\n\n展示规则：只有 `review_status=approved` 的照片对外展示；\n上传者能看到自己待审核/未通过的照片，创建者与班委能看到全部（并带审核权限）。","operationId":"list_photos_api_v1_photos_class__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}":{"get":{"tags":["照片"],"summary":"Get Photo","description":"获取照片详情（含人脸标注，仅限该班级成员）","operationId":"get_photo_api_v1_photos__photo_id__get","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["照片"],"summary":"Delete Photo","description":"删除照片（上传者或班级管理员可删）\n\n不会真删：只标记 deleted_at 进回收站，管理员可在后台恢复或彻底清除。","operationId":"delete_photo_api_v1_photos__photo_id__delete","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/review":{"post":{"tags":["照片"],"summary":"Review Photo","description":"纪念照展示审核：创建者或任意一位班委通过即可对外展示\n\n相册只用来展示照片，上传后先落 pending，审核通过才出现在其他同学相册里；\n上传者始终能看到自己的照片和「待审核 / 未通过」状态。","operationId":"review_photo_api_v1_photos__photo_id__review_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/check-graduation":{"post":{"tags":["照片"],"summary":"Check Graduation","description":"（重新）分析这张照片是不是毕业照，只判定不编号","operationId":"check_graduation_api_v1_photos__photo_id__check_graduation_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/auto-tag":{"post":{"tags":["照片"],"summary":"Auto Tag Photo","description":"自动检测照片中的人脸并生成编号标签（班友01、班友02…）\n\n- 默认会先校验是否毕业照，不是则返回提示（blocked=True）\n- force=True 表示用户已确认「这是毕业照」，强制识别","operationId":"auto_tag_photo_api_v1_photos__photo_id__auto_tag_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_auto_tag_photo_api_v1_photos__photo_id__auto_tag_post"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/detect-faces":{"post":{"tags":["照片"],"summary":"Detect Faces","description":"检测照片中的人脸（只检测，不落库编号）","operationId":"detect_faces_api_v1_photos__photo_id__detect_faces_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/tag-face":{"post":{"tags":["照片"],"summary":"Tag Face","description":"保存照片的人脸标注（前端传 {tags: [...]}）\n\n- 带 id 的标签视为更新（改名）\n- 无 id 的视为新增\n- 已认领的标签不会被覆盖认领状态","operationId":"tag_face_api_v1_photos__photo_id__tag_face_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceTagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/tags":{"post":{"tags":["照片"],"summary":"Save Tags","operationId":"save_tags_api_v1_photos__photo_id__tags_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceTagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/tags/{tag_id}/role":{"post":{"tags":["照片"],"summary":"Set Tag Role","description":"把一个人脸标签标为老师（或改回同学），并重排编号","operationId":"set_tag_role_api_v1_photos__photo_id__tags__tag_id__role_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceTagRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/tags/bulk-role":{"post":{"tags":["照片"],"summary":"Set Tags Role Bulk","description":"批量改角色：识别后一次确认多位老师（疑似老师多选）","operationId":"set_tags_role_bulk_api_v1_photos__photo_id__tags_bulk_role_post","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceTagBulkRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}/tags/{tag_id}":{"delete":{"tags":["照片"],"summary":"Delete Face Tag","description":"删掉一个误检的框（背景里的脸、照片上的头像等）\n\n⚠️ 每张照片最多删 `MAX_TAG_DELETIONS`（5）个：删框会让可认领人数变少，\n不设上限就等于「把 69 个框删到 10 个」来压低门槛。删框也不会让集结金目标下调\n（目标只在照片被删除/替换时才可能变，且要班委确认）。","operationId":"delete_face_tag_api_v1_photos__photo_id__tags__tag_id__delete","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/posts":{"get":{"tags":["动态"],"summary":"List Posts","description":"获取班级动态列表（不含已被班内删除的），朋友圈模式批量内嵌点赞/评论\n\n分页：page/page_size（默认 20 条/页，带 total）；兼容旧 limit/offset 参数。\n仅限班级成员：没加入的人连动态内容都不该看到（人数/条数走公开摘要）。","operationId":"list_posts_api_v1_classes__class_id__posts_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class 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":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["动态"],"summary":"Create Post","description":"发布班级动态（朋友圈模式：文字 + 最多 9 张图，也可以纯图）","operationId":"create_post_api_v1_classes__class_id__posts_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/posts/{post_id}":{"delete":{"tags":["动态"],"summary":"Delete Post","description":"删除/屏蔽动态（班会）\n\n- 作者本人：直接从班级里移除（软删除，总管理后台仍可查看/恢复）\n- 班长/副班长/班级创建者（非作者）：直接屏蔽——仅本班不再展示，\n  内容保留，总管理员后台仍可见、可恢复\n- 其他成员：无权操作","operationId":"delete_post_api_v1_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/posts/{post_id}/like":{"post":{"tags":["动态"],"summary":"Like Post","description":"点赞/取消点赞动态（toggle，仅限本班成员）","operationId":"like_post_api_v1_posts__post_id__like_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/posts/{post_id}/comments":{"get":{"tags":["动态"],"summary":"List Comments","description":"获取动态的评论列表（仅限该班级成员）","operationId":"list_comments_api_v1_posts__post_id__comments_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["动态"],"summary":"Create Comment","description":"发布评论（≤300 字，仅限本班成员）","operationId":"create_comment_api_v1_posts__post_id__comments_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/posts/{post_id}/comments/{comment_id}":{"delete":{"tags":["动态"],"summary":"Delete Comment","description":"删除评论：评论作者本人 / 话题作者 / 班长副班长","operationId":"delete_comment_api_v1_posts__post_id__comments__comment_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/config":{"get":{"tags":["聚会"],"summary":"Meetup Notify Config","description":"聚会提醒的订阅状态（前端据此显示「开启聚会提醒」按钮）","operationId":"meetup_notify_config_api_v1_meetups_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/subscribe":{"post":{"tags":["聚会"],"summary":"Meetup Subscribe","description":"用户在小程序里点了一次「开启聚会提醒」→ 额度 +1（微信一次性订阅：授权一次发一条）","operationId":"meetup_subscribe_api_v1_meetups_subscribe_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/class/{class_id}":{"get":{"tags":["聚会"],"summary":"List Events","description":"获取班级聚会列表（仅限班级成员；部分邀请的活动只对受邀人可见）\n\n分页：page/page_size（默认 20 条/页，带 total/has_more）；兼容旧 limit/offset。","operationId":"list_events_api_v1_meetups_class__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"筛选状态: open/closed/done","title":"Status"},"description":"筛选状态: open/closed/done"},{"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":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups":{"post":{"tags":["聚会"],"summary":"Create Event","description":"创建聚会活动（创建者自动报名；部分邀请时逐个推送订阅消息）","operationId":"create_event_api_v1_meetups_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}":{"get":{"tags":["聚会"],"summary":"Get Event","description":"获取聚会详情（含报名列表）。\n\n全班活动：本班成员都能看；\n部分邀请：只有发起人和被邀请人能看，其他同学返回 403 not_invited。","operationId":"get_event_api_v1_meetups__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["聚会"],"summary":"Update Event","description":"编辑聚会（仅组织者）","operationId":"update_event_api_v1_meetups__event_id__put","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["聚会"],"summary":"Delete Event","description":"删除聚会（仅组织者）","operationId":"delete_event_api_v1_meetups__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/invitees":{"get":{"tags":["聚会"],"summary":"List Invitees","description":"发起人视角：邀请了谁、谁来了、通知是否送达","operationId":"list_invitees_api_v1_meetups__event_id__invitees_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/join":{"post":{"tags":["聚会"],"summary":"Join Event","description":"报名参加聚会（部分邀请的活动只有受邀人能报名）","operationId":"join_event_api_v1_meetups__event_id__join_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/cancel":{"post":{"tags":["聚会"],"summary":"Cancel Event","description":"取消报名（发起人不能取消；聚会当天及以后不能取消）","operationId":"cancel_event_api_v1_meetups__event_id__cancel_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/posts":{"get":{"tags":["聚会"],"summary":"List Event Posts","description":"这场聚会的回忆：已通过的内容 + 我自己的待审/被拒内容（发起人可见全部）","operationId":"list_event_posts_api_v1_meetups__event_id__posts_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["聚会"],"summary":"Create Event Post","description":"参加的同学发布内容，落 pending 等发起人审核","operationId":"create_event_post_api_v1_meetups__event_id__posts_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPostIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/posts/{post_id}/review":{"post":{"tags":["聚会"],"summary":"Review Event Post","description":"发起人审核：通过 → 对参加者展示；驳回 → 只有作者能看到原因","operationId":"review_event_post_api_v1_meetups__event_id__posts__post_id__review_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPostReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/{event_id}/posts/{post_id}":{"delete":{"tags":["聚会"],"summary":"Delete Event Post","description":"作者删自己的；发起人可以删任何一条（含已通过的）","operationId":"delete_event_post_api_v1_meetups__event_id__posts__post_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/posts/{post_id}/like":{"post":{"tags":["聚会"],"summary":"Toggle Event Post Like","description":"点赞 / 取消点赞（幂等切换）","operationId":"toggle_event_post_like_api_v1_meetups_posts__post_id__like_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/posts/{post_id}/comments":{"post":{"tags":["聚会"],"summary":"Create Event Post Comment","description":"参加的同学评论一条回忆","operationId":"create_event_post_comment_api_v1_meetups_posts__post_id__comments_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPostCommentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/meetups/posts/{post_id}/comments/{comment_id}":{"delete":{"tags":["聚会"],"summary":"Delete Event Post Comment","description":"删除评论：评论作者本人或聚会发起人","operationId":"delete_event_post_comment_api_v1_meetups_posts__post_id__comments__comment_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/config":{"get":{"tags":["私信"],"summary":"Message Config","operationId":"message_config_api_v1_messages_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/subscribe":{"post":{"tags":["私信"],"summary":"Report Subscribe","operationId":"report_subscribe_api_v1_messages_subscribe_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/unread":{"get":{"tags":["私信"],"summary":"Unread Count","operationId":"unread_count_api_v1_messages_unread_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/conversations":{"get":{"tags":["私信"],"summary":"List Conversations","operationId":"list_conversations_api_v1_messages_conversations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/with/{peer_id}":{"get":{"tags":["私信"],"summary":"List Messages","operationId":"list_messages_api_v1_messages_with__peer_id__get","parameters":[{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"type":"string","description":"只取这个时间之前的消息，用于上拉加载","title":"Before"},"description":"只取这个时间之前的消息，用于上拉加载"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["私信"],"summary":"Send Message","operationId":"send_message_api_v1_messages_with__peer_id__post","parameters":[{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/with/{peer_id}/read":{"post":{"tags":["私信"],"summary":"Mark Read","operationId":"mark_read_api_v1_messages_with__peer_id__read_post","parameters":[{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notices":{"get":{"tags":["通知"],"summary":"List Notices","operationId":"list_notices_api_v1_notices_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notices/unread":{"get":{"tags":["通知"],"summary":"Notices Unread","operationId":"notices_unread_api_v1_notices_unread_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notices/{notice_id}/read":{"post":{"tags":["通知"],"summary":"Read Notice","operationId":"read_notice_api_v1_notices__notice_id__read_post","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notices/read-all":{"post":{"tags":["通知"],"summary":"Read All Notices","operationId":"read_all_notices_api_v1_notices_read_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/realname/status":{"get":{"tags":["实名认证","实名认证"],"summary":"Realname Status","description":"当前用户的实名状态 + 已锁定的身份信息","operationId":"realname_status_api_v1_realname_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/realname/submit":{"post":{"tags":["实名认证","实名认证"],"summary":"Realname Submit","description":"提交实名认证。通过后姓名/性别/年龄锁定，二次提交会被拒绝。\n\n每一次提交（无论成功失败）都会写一条 `realname_records`，\n总后台「实名认证」标签页可以查。","operationId":"realname_submit_api_v1_realname_submit_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealnameSubmit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/realname/grade-hints":{"get":{"tags":["实名认证","实名认证"],"summary":"Grade Hints","description":"按年龄推算各阶段毕业年份，建班/找班时直接给推荐年份（不用滑长列表）\n\n返回：\n{\n  \"age\": 38, \"birth_year\": 1988,\n  \"stages\": [{key,label,year,years:[y-1,y,y+1],selected}],\n  \"range\": [1999, 2014],\n  \"tolerance\": 3\n}","operationId":"grade_hints_api_v1_realname_grade_hints_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/status":{"get":{"tags":["人脸识别"],"summary":"Face Status","description":"诊断当前人脸引擎（百度 / 本地）是否可用，便于排查「为什么识别不出人脸」","operationId":"face_status_api_v1_face_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/face/detect":{"post":{"tags":["人脸识别"],"summary":"Detect Face","description":"检测图片中的人脸，并判断是否为毕业照（不落库）","operationId":"detect_face_api_v1_face_detect_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_face_api_v1_face_detect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/claim/{tag_id}":{"post":{"tags":["人脸识别"],"summary":"Claim Face","description":"认领某个人脸标签\n\n- body.display_name: 展示名（默认用当前用户昵称，实现「班友01 → 真实姓名」）\n- body.on_behalf_of: 代认领时填写的同学姓名","operationId":"claim_face_api_v1_face_claim__tag_id__post","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/FaceClaimRequest"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/unclaimed/{class_id}":{"get":{"tags":["人脸识别"],"summary":"Get Unclaimed Tags","description":"获取班级中未认领的人脸标签列表","operationId":"get_unclaimed_tags_api_v1_face_unclaimed__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"photo_id","in":"query","required":false,"schema":{"type":"string","title":"Photo Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/claimed/{class_id}":{"get":{"tags":["人脸识别"],"summary":"Get Claimed Tags","description":"已认领的人：姓名 + 第几排第几个 + 头像，用来核对「谁已经认过自己」","operationId":"get_claimed_tags_api_v1_face_claimed__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/unclaim/{tag_id}":{"post":{"tags":["人脸识别"],"summary":"Unclaim Face","description":"取消认领\n\n本人可取消自己的；照片上传者和班委也能取消，用于纠正「被别人误认领」——\n否则一旦有人抢先点了别人，真正的本人就永远占不到那个位置。","operationId":"unclaim_face_api_v1_face_unclaim__tag_id__post","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/tags/{photo_id}":{"get":{"tags":["人脸识别"],"summary":"Get Photo Tags","description":"获取某张照片的所有人脸标签（含认领者姓名）","operationId":"get_photo_tags_api_v1_face_tags__photo_id__get","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/thumb/{tag_id}":{"get":{"tags":["人脸识别"],"summary":"Face Thumb","description":"按标签坐标裁出这个人的人脸头像（人脸库、认领列表用）\n\n不需要登录：缩略图本身不包含额外隐私，但只有知道 tag_id 才拿得到。","operationId":"face_thumb_api_v1_face_thumb__tag_id__get","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/search":{"post":{"tags":["人脸识别"],"summary":"Search Face","description":"上传一张照片，在班级人脸库中找出最像的同学","operationId":"search_face_api_v1_face_search_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_search_face_api_v1_face_search_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/face/compare":{"post":{"tags":["人脸识别"],"summary":"Compare Face","description":"比对上传照片与目标照片/用户的人脸相似度","operationId":"compare_face_api_v1_face_compare_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_compare_face_api_v1_face_compare_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/upload/image":{"post":{"tags":["文件"],"summary":"Upload Image","description":"上传单张图片，返回可直接展示的绝对地址。\n\n用途：用户头像、班会话题配图、聚会回忆配图。文件真实格式按文件头判定，\n客户端传来的文件名与 content_type 都只作参考。\n\n压缩策略（选「自动压缩」而非「提示重传」）：\n- purpose=avatar：长边压到 640px 并转 JPEG（客户端也压过一层，这里兜底）\n- 其它图片（班会/聚会回忆配图）：长边压到 1600px 转 JPEG；GIF 动图跳过\n- 压不小就用原图，绝不让上传失败","operationId":"upload_image_api_v1_upload_image_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_image_api_v1_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/":{"get":{"tags":["学校"],"summary":"Search Schools","description":"搜索学校\n\n- 已通过（approved）与被管理员放进审核队列（pending）的学校都能被搜到，\n  这样用户能看到「已提交、审核中」的学校，不会以为没提交成功。\n- 已拒绝（rejected）与已进回收站（deleted_at 非空）的学校不出现。","operationId":"search_schools_api_v1_schools__get","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"type":"string","description":"搜索关键词（学校名/城市）","title":"Keyword"},"description":"搜索关键词（学校名/城市）"},{"name":"province","in":"query","required":false,"schema":{"type":"string","description":"省份筛选","title":"Province"},"description":"省份筛选"},{"name":"city","in":"query","required":false,"schema":{"type":"string","description":"城市筛选","title":"City"},"description":"城市筛选"},{"name":"district","in":"query","required":false,"schema":{"type":"string","description":"区县筛选","title":"District"},"description":"区县筛选"},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"分类：中小学/大学","title":"Category"},"description":"分类：中小学/大学"},{"name":"school_type","in":"query","required":false,"schema":{"type":"string","description":"学校类型，多个用逗号分隔","title":"School Type"},"description":"学校类型，多个用逗号分隔"},{"name":"exclude_name","in":"query","required":false,"schema":{"type":"string","description":"名称排除关键词，多个用逗号分隔","title":"Exclude Name"},"description":"名称排除关键词，多个用逗号分隔"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/provinces":{"get":{"tags":["学校"],"summary":"Get Provinces","description":"获取所有省份列表（已通过 + 审核中的学校）","operationId":"get_provinces_api_v1_schools_provinces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/schools/cities":{"get":{"tags":["学校"],"summary":"Get Cities","description":"获取指定省份下的城市列表","operationId":"get_cities_api_v1_schools_cities_get","parameters":[{"name":"province","in":"query","required":false,"schema":{"type":"string","description":"省份","title":"Province"},"description":"省份"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/types":{"get":{"tags":["学校"],"summary":"Get School Types","description":"获取学校类型（二级分类）","operationId":"get_school_types_api_v1_schools_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/schools/disciplines/list":{"get":{"tags":["学校"],"summary":"Get Disciplines","description":"获取大学学科门类及一级学科","operationId":"get_disciplines_api_v1_schools_disciplines_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/schools/create":{"post":{"tags":["学校"],"summary":"Create School Pending","description":"用户自主创建学校（当搜索不到时），提交后进入审核队列","operationId":"create_school_pending_api_v1_schools_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSchoolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/pending":{"get":{"tags":["学校"],"summary":"List Pending Schools","description":"管理员查看待审核学校列表","operationId":"list_pending_schools_api_v1_schools_pending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"args","in":"query","required":true,"schema":{"title":"Args"}},{"name":"kwargs","in":"query","required":true,"schema":{"title":"Kwargs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/{school_id}/approve":{"put":{"tags":["学校"],"summary":"Approve School","description":"管理员审核通过学校","operationId":"approve_school_api_v1_schools__school_id__approve_put","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"args","in":"query","required":true,"schema":{"title":"Args"}},{"name":"kwargs","in":"query","required":true,"schema":{"title":"Kwargs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/{school_id}/reject":{"put":{"tags":["学校"],"summary":"Reject School","description":"管理员拒绝学校","operationId":"reject_school_api_v1_schools__school_id__reject_put","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"args","in":"query","required":true,"schema":{"title":"Args"}},{"name":"kwargs","in":"query","required":true,"schema":{"title":"Kwargs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/{school_id}":{"get":{"tags":["学校"],"summary":"Get School","description":"获取学校详情（回收站里的视为不存在）","operationId":"get_school_api_v1_schools__school_id__get","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schools/{school_id}/classes":{"get":{"tags":["学校"],"summary":"Get School Classes","description":"获取学校下的班级列表\n\n浏览不需要实名、也不需要是成员：\n未加入的人**只看到公开摘要**（班级名 + 总人数 + 已加入人数 + 动态/聚会数量），\n封面、邀请码这类内部内容不返回。审核中的班级也会返回（打「审核中」标签）。\n已拒绝 / 已进回收站的班级不返回。","operationId":"get_school_classes_api_v1_schools__school_id__classes_get","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"grade_year","in":"query","required":false,"schema":{"type":"integer","description":"年级年份筛选","title":"Grade Year"},"description":"年级年份筛选"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/areas/provinces":{"get":{"tags":["行政区划","行政区划"],"summary":"Get Provinces","description":"获取所有省份列表，附带是否直辖市标记","operationId":"get_provinces_api_v1_areas_provinces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/areas/cities":{"get":{"tags":["行政区划","行政区划"],"summary":"Get Cities","description":"获取指定省份下的城市列表（直辖市仍返回，前端可选择性跳过）","operationId":"get_cities_api_v1_areas_cities_get","parameters":[{"name":"province","in":"query","required":true,"schema":{"type":"string","description":"省份名称","title":"Province"},"description":"省份名称"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/areas/districts":{"get":{"tags":["行政区划","行政区划"],"summary":"Get Districts","description":"获取区县列表。支持两种模式：\n1. 省+城市：常规模式\n2. 仅省份：直辖市模式（跳过城市级直接获取区县）","operationId":"get_districts_api_v1_areas_districts_get","parameters":[{"name":"province","in":"query","required":true,"schema":{"type":"string","description":"省份名称","title":"Province"},"description":"省份名称"},{"name":"city","in":"query","required":false,"schema":{"type":"string","description":"城市名称（直辖市可不传）","title":"City"},"description":"城市名称（直辖市可不传）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Stats","operationId":"admin_stats_api_v1_admin_stats_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/schools":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Schools","description":"学校列表（默认待审核；不含回收站里的）\n\n后台既是审核队列也是学校名录，所以 keyword 支持校名/省/市/区/类型。","operationId":"admin_schools_api_v1_admin_schools_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"pending / approved / rejected / all","default":"pending","title":"Status"},"description":"pending / approved / rejected / all"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Create School","description":"后台直接建档学校（不进审核队列，默认已通过）","operationId":"create_school_api_v1_admin_schools_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Classes","description":"班级列表（默认待审核；不含回收站里的）\n\nkeyword 同时匹配班级名、学校名、专业 —— 后台班级多起来以后，\n管理员往往只记得「某某中学 2010 届」或专业名。","operationId":"admin_classes_api_v1_admin_classes_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"pending / approved / rejected / all","default":"pending","title":"Status"},"description":"pending / approved / rejected / all"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"只看某个学校下的班级","title":"School Id"},"description":"只看某个学校下的班级"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Create Class","description":"后台代建班级（直接落库，默认已通过）","operationId":"create_class_api_v1_admin_classes_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/schools/{school_id}":{"put":{"tags":["管理后台","管理后台"],"summary":"Update School","description":"编辑学校（含已通过的学校）：可改名称/地区/类型/状态\n\n- 改名时可同步该学校下班级名里的旧校名（sync_class_names，默认开）\n- 状态改成 approved 时补发「可以邀请同学了」的通知","operationId":"update_school_api_v1_admin_schools__school_id__put","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理后台","管理后台"],"summary":"Recycle School","operationId":"recycle_school_api_v1_admin_schools__school_id__delete","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/schools/{school_id}/majors":{"get":{"tags":["管理后台","管理后台"],"summary":"List School Majors","description":"学校下的专业列表（含每个专业被多少个班级使用）","operationId":"list_school_majors_api_v1_admin_schools__school_id__majors_get","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Create School Major","operationId":"create_school_major_api_v1_admin_schools__school_id__majors_post","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MajorUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/schools/{school_id}/majors/import-catalog":{"post":{"tags":["管理后台","管理后台"],"summary":"Import School Major Catalog","description":"把内置教育部学科目录（学科门类+一级学科）导入为该校专业。\n\n小程序创建班级时选的就是这份目录；导入后后台「专业数」与小程序口径一致。\n幂等：已建档的同名专业跳过，不产生重复。","operationId":"import_school_major_catalog_api_v1_admin_schools__school_id__majors_import_catalog_post","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/majors/{major_id}":{"put":{"tags":["管理后台","管理后台"],"summary":"Update School Major","description":"编辑专业：改名会同步该学校下所有班级的 major 字段","operationId":"update_school_major_api_v1_admin_majors__major_id__put","parameters":[{"name":"major_id","in":"path","required":true,"schema":{"type":"string","title":"Major Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MajorUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理后台","管理后台"],"summary":"Delete School Major","description":"删除专业（软删）：已填该专业的班级保留原文字，不会被清空","operationId":"delete_school_major_api_v1_admin_majors__major_id__delete","parameters":[{"name":"major_id","in":"path","required":true,"schema":{"type":"string","title":"Major Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}":{"put":{"tags":["管理后台","管理后台"],"summary":"Update Class","description":"编辑班级（含已通过的班级）：学校/届别/班号/专业/名称/状态/封面\n\n改成 approved → 通知建班人；改成 rejected → 通知并附原因。","operationId":"update_class_api_v1_admin_classes__class_id__put","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理后台","管理后台"],"summary":"Recycle Class","operationId":"recycle_class_api_v1_admin_classes__class_id__delete","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/members":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Class Members","operationId":"admin_class_members_api_v1_admin_classes__class_id__members_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"all / approved / pending / rejected / removed","default":"all","title":"Status"},"description":"all / approved / pending / rejected / removed"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/members/{user_id}":{"put":{"tags":["管理后台","管理后台"],"summary":"Update Class Member","description":"设置班长/副班长，或调整成员状态（恢复、移出、通过待审）","operationId":"update_class_member_api_v1_admin_classes__class_id__members__user_id__put","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理后台","管理后台"],"summary":"Remove Class Member","description":"管理员直接把成员移出班级（软移出，历史动态/邀请记录保留）","operationId":"remove_class_member_api_v1_admin_classes__class_id__members__user_id__delete","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/schools/{school_id}/review":{"put":{"tags":["管理后台","管理后台"],"summary":"Review School","operationId":"review_school_api_v1_admin_schools__school_id__review_put","parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/review":{"put":{"tags":["管理后台","管理后台"],"summary":"Review Class","operationId":"review_class_api_v1_admin_classes__class_id__review_put","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/posts":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Posts","description":"全部班会话题列表（分页）\n\n班长/副班长共同确认后「班内删除」的动态并没有真的消失，\n这里能查到并继续管理（恢复 / 彻底删除）。","operationId":"admin_posts_api_v1_admin_posts_get","parameters":[{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"all / visible / removed","default":"all","title":"Status"},"description":"all / visible / removed"},{"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":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"兼容旧参数（等价 page_size）","title":"Limit"},"description":"兼容旧参数（等价 page_size）"},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"兼容旧参数（等价 (page-1)*page_size）","title":"Offset"},"description":"兼容旧参数（等价 (page-1)*page_size）"},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/posts/{post_id}/detail":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Post Detail","description":"班会话题详情：全文 + 配图 + 评论列表 + 点赞（内容治理用）","operationId":"admin_post_detail_api_v1_admin_posts__post_id__detail_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/posts/{post_id}/pin":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Post Pin","description":"置顶 / 取消置顶班会话题","operationId":"admin_post_pin_api_v1_admin_posts__post_id__pin_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/posts/{post_id}":{"delete":{"tags":["管理后台","管理后台"],"summary":"Recycle Post","description":"总管理员删除动态 → 进回收站（班内立即不可见）","operationId":"recycle_post_api_v1_admin_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/photos/{photo_id}":{"delete":{"tags":["管理后台","管理后台"],"summary":"Recycle Photo","operationId":"recycle_photo_api_v1_admin_photos__photo_id__delete","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/recycle":{"get":{"tags":["管理后台","管理后台"],"summary":"Recycle List","description":"回收站列表（按删除时间倒序；支持关键词 + 删除时间范围过滤）","operationId":"recycle_list_api_v1_admin_recycle_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","description":"all / school / class / photo / post","default":"all","title":"Type"},"description":"all / school / class / photo / post"},{"name":"keyword","in":"query","required":false,"schema":{"type":"string","description":"关键词：学校名/班级名/照片说明/动态内容","default":"","title":"Keyword"},"description":"关键词：学校名/班级名/照片说明/动态内容"},{"name":"start","in":"query","required":false,"schema":{"type":"string","description":"删除时间起 YYYY-MM-DD（含）","default":"","title":"Start"},"description":"删除时间起 YYYY-MM-DD（含）"},{"name":"end","in":"query","required":false,"schema":{"type":"string","description":"删除时间止 YYYY-MM-DD（含）","default":"","title":"End"},"description":"删除时间止 YYYY-MM-DD（含）"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/recycle/batch":{"post":{"tags":["管理后台","管理后台"],"summary":"Recycle Batch","description":"回收站批量操作：批量恢复 / 批量彻底删除（逐项执行，单项失败不影响其余）","operationId":"recycle_batch_api_v1_admin_recycle_batch_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecycleBatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/recycle/{item_type}/{item_id}/restore":{"post":{"tags":["管理后台","管理后台"],"summary":"Recycle Restore","description":"从回收站恢复","operationId":"recycle_restore_api_v1_admin_recycle__item_type___item_id__restore_post","parameters":[{"name":"item_type","in":"path","required":true,"schema":{"type":"string","title":"Item Type"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/recycle/{item_type}/{item_id}":{"delete":{"tags":["管理后台","管理后台"],"summary":"Recycle Purge","description":"彻底删除（不可恢复）：连同照片文件、人脸标签、成员、动态一起清掉","operationId":"recycle_purge_api_v1_admin_recycle__item_type___item_id__delete","parameters":[{"name":"item_type","in":"path","required":true,"schema":{"type":"string","title":"Item Type"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/realname/settings":{"get":{"tags":["管理后台","管理后台"],"summary":"Get Realname Settings","description":"当前生效的实名认证配置（密钥打码，参数说明一并返回）","operationId":"get_realname_settings_api_v1_admin_realname_settings_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Save Realname Settings","description":"保存实名认证配置（即时生效，无需重启）","operationId":"save_realname_settings_api_v1_admin_realname_settings_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealnameSettingsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/realname/test":{"post":{"tags":["管理后台","管理后台"],"summary":"Test Realname Provider","description":"连通性自检：探测当前认证通道是否可用\n\n百度：换一次 access_token，再逐个探测 V3 / V4 接口；\n腾讯：用无效身份证 + 假图打 ImageRecognitionV2（业务参数错误 = 权限通过）；\n阿里：用错误签名探测 AccessKey 有效性。\n探测均不真正核验任何人、不计费。","operationId":"test_realname_provider_api_v1_admin_realname_test_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/realname/records":{"get":{"tags":["管理后台","管理后台"],"summary":"Realname Records","description":"实名认证记录（成功 + 失败都在这），带汇总数字","operationId":"realname_records_api_v1_admin_realname_records_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"all / passed / failed","default":"all","title":"Status"},"description":"all / passed / failed"},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"baidu / local","title":"Channel"},"description":"baidu / local"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"姓名 / 手机号 / 身份证掩码 / 昵称","title":"Keyword"},"description":"姓名 / 手机号 / 身份证掩码 / 昵称"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"最近 N 天","title":"Days"},"description":"最近 N 天"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/realname/records/{record_id}":{"delete":{"tags":["管理后台","管理后台"],"summary":"Delete Realname Record","description":"删除单条记录（只清日志，不影响账号的认证状态）","operationId":"delete_realname_record_api_v1_admin_realname_records__record_id__delete","parameters":[{"name":"record_id","in":"path","required":true,"schema":{"type":"string","title":"Record Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/notify/settings":{"get":{"tags":["管理后台","管理后台"],"summary":"Get Notify Settings","description":"当前生效的订阅消息配置（密钥打码）","operationId":"get_notify_settings_api_v1_admin_notify_settings_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Save Notify Settings","description":"保存订阅消息配置（即时生效，无需重启）","operationId":"save_notify_settings_api_v1_admin_notify_settings_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifySettingsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Users","description":"全部注册用户（含禁用 / 已注销），支持按姓名、手机号、学校、班级等关键信息搜索","operationId":"admin_users_api_v1_admin_users_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"all / active / banned / cancelled","default":"all","title":"Status"},"description":"all / active / banned / cancelled"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"姓名 / 昵称 / 手机号 / 学校 / 班级 / 常驻地","title":"Keyword"},"description":"姓名 / 昵称 / 手机号 / 学校 / 班级 / 常驻地"},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"yes / no，按是否实名筛选","title":"Verified"},"description":"yes / no，按是否实名筛选"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"description":"最近 N 天注册","title":"Days"},"description":"最近 N 天注册"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin User Detail","description":"单个用户的全部信息：资料 / 实名 / 班级 / 内容统计 / 最近认证与动态","operationId":"admin_user_detail_api_v1_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin User Action","description":"用户治理：禁用 / 解禁 / 注销\n\n- 禁用：可恢复，登录与接口一律 403，所有数据保留\n- 注销：软删除 + 释放手机号、密码、身份证哈希（同号/同证可重新注册），\n  微信 openid 保留以防止原微信账号重新注册；退班记录只改状态保留历史","operationId":"admin_user_action_api_v1_admin_users__user_id__action_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/reset-password":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Reset User Password","description":"重置小程序用户的登录密码\n\n- 返回的明文密码只在本次响应里出现一次，管理员转告用户后即不可再查\n- 同时清掉密码错误计数，重置后能立刻登录（不用等 15 分钟）\n- 已注销账号不能重置（手机号与密码在注销时已释放）","operationId":"admin_reset_user_password_api_v1_admin_users__user_id__reset_password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/detail":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Class Detail","description":"班级全量详情：信息 + 成员 + 照片 + 动态 + 聚会 + 活动回忆 + 集结金 + 邀请\n\n后台点进一个班级后要能管全部内容，所以一次性把各块内容（各取最近 120 条）\n和统计口径都返回，前端按 Tab 展示，避免点一次 Tab 打一次请求。","operationId":"admin_class_detail_api_v1_admin_classes__class_id__detail_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/photos/{photo_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Photo Action","description":"班级内照片处置：展示审核通过 / 驳回 / 删除到回收站 / 恢复","operationId":"admin_photo_action_api_v1_admin_classes__class_id__photos__photo_id__action_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","title":"Photo Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/posts/{post_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Post Action","description":"班级内动态处置：删除到回收站 / 恢复","operationId":"admin_post_action_api_v1_admin_classes__class_id__posts__post_id__action_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/meetups/{event_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Meetup Action","description":"聚会处置：关闭报名 / 重新开放 / 标记已结束","operationId":"admin_meetup_action_api_v1_admin_classes__class_id__meetups__event_id__action_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/classes/{class_id}/event-posts/{post_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Event Post Action","description":"聚会回忆处置：通过 / 驳回 / 彻底删除","operationId":"admin_event_post_action_api_v1_admin_classes__class_id__event_posts__post_id__action_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/meetups":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Meetups","description":"全站聚会列表（分页 + 搜索）","operationId":"admin_meetups_api_v1_admin_meetups_get","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"聚会标题 / 地点 / 班级名","title":"Keyword"},"description":"聚会标题 / 地点 / 班级名"},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"all / open / closed / done","default":"all","title":"Status"},"description":"all / open / closed / done"},{"name":"visibility","in":"query","required":false,"schema":{"type":"string","description":"all / partial","default":"all","title":"Visibility"},"description":"all / partial"},{"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":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/meetups/{event_id}/detail":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Meetup Detail","description":"聚会详情：信息 + 报名人 + 活动回忆（内容治理用）","operationId":"admin_meetup_detail_api_v1_admin_meetups__event_id__detail_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/meetups/{event_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Meetup Global Action","description":"聚会处置（无需班级上下文）：关闭报名 / 重新开放 / 标记结束","operationId":"admin_meetup_global_action_api_v1_admin_meetups__event_id__action_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/event-posts/{post_id}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Event Post Global Action","description":"聚会回忆处置（无需班级上下文）：通过 / 驳回 / 删除","operationId":"admin_event_post_global_action_api_v1_admin_event_posts__post_id__action_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/logs":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin User Logs","description":"某位用户的操作记录：支持按动作分类 + 自定义起止日期过滤，按时间倒序","operationId":"admin_user_logs_api_v1_admin_users__user_id__logs_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"action","in":"query","required":false,"schema":{"type":"string","description":"动作分类，空=全部","default":"","title":"Action"},"description":"动作分类，空=全部"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"description":"最近 N 天（未传 start/end 时生效）","default":30,"title":"Days"},"description":"最近 N 天（未传 start/end 时生效）"},{"name":"start","in":"query","required":false,"schema":{"type":"string","description":"起始日期 YYYY-MM-DD（含当天）","default":"","title":"Start"},"description":"起始日期 YYYY-MM-DD（含当天）"},{"name":"end","in":"query","required":false,"schema":{"type":"string","description":"结束日期 YYYY-MM-DD（含当天）","default":"","title":"End"},"description":"结束日期 YYYY-MM-DD（含当天）"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/feedback":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Feedback List","description":"用户反馈列表：状态筛选 + 关键词（内容 / 联系方式 / 昵称 / 手机号）","operationId":"admin_feedback_list_api_v1_admin_feedback_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Page Size"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/feedback/{fid}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Feedback Action","description":"回复反馈（状态自动置为已回复）或手动调整状态","operationId":"admin_feedback_action_api_v1_admin_feedback__fid__action_post","parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackActionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/official-notices":{"get":{"tags":["管理后台","管理后台"],"summary":"Admin Official Notice List","description":"官方通知列表（含停用的），带已读人数统计","operationId":"admin_official_notice_list_api_v1_admin_official_notices_get","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Page Size"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["管理后台","管理后台"],"summary":"Admin Official Notice Create","description":"发布官方通知（对全站用户可见）","operationId":"admin_official_notice_create_api_v1_admin_official_notices_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialNoticeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/official-notices/{nid}/edit":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Official Notice Edit","description":"编辑已发布的官方通知（修正错别字等），已读记录保留","operationId":"admin_official_notice_edit_api_v1_admin_official_notices__nid__edit_post","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","title":"Nid"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialNoticeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/official-notices/{nid}/action":{"post":{"tags":["管理后台","管理后台"],"summary":"Admin Official Notice Action","description":"启用 / 停用 / 删除官方通知","operationId":"admin_official_notice_action_api_v1_admin_official_notices__nid__action_post","parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","title":"Nid"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialNoticeActionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/whoami":{"get":{"tags":["后台人员","后台人员"],"summary":"Whoami","operationId":"whoami_api_v1_admin_whoami_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/staff":{"get":{"tags":["后台人员","后台人员"],"summary":"List Staff","operationId":"list_staff_api_v1_admin_staff_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["后台人员","后台人员"],"summary":"Create Staff","operationId":"create_staff_api_v1_admin_staff_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/staff/{account_id}":{"put":{"tags":["后台人员","后台人员"],"summary":"Update Staff","operationId":"update_staff_api_v1_admin_staff__account_id__put","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["后台人员","后台人员"],"summary":"Delete Staff","operationId":"delete_staff_api_v1_admin_staff__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/me":{"get":{"tags":["后台人员","后台人员"],"summary":"My Account","description":"我的身份 + 登录方式（「我的账号」弹窗用）","operationId":"my_account_api_v1_admin_me_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/me/password":{"post":{"tags":["后台人员","后台人员"],"summary":"Change My Password","description":"子管理员：校验旧密码后更新自己的登录密码","operationId":"change_my_password_api_v1_admin_me_password_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyPasswordIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/me/token":{"post":{"tags":["后台人员","后台人员"],"summary":"Change Master Token","description":"总管理员：更换后台访问令牌（等同修改登录密码）\n\n令牌存在 app_settings，优先级高于 .env；换完旧令牌立即失效。","operationId":"change_master_token_api_v1_admin_me_token_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyTokenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/staff/login":{"post":{"tags":["后台人员","后台人员"],"summary":"Staff Login","operationId":"staff_login_api_v1_admin_staff_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/fund":{"get":{"tags":["集结金","集结金"],"summary":"Get Fund","operationId":"get_fund_api_v1_classes__class_id__fund_get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/fund/target-adjustments/{adjustment_id}/review":{"post":{"tags":["集结金","集结金"],"summary":"Review Target Adjustment","description":"照片被删/替换后，班委确认是否下调目标人数（累计最多降 7 人）","operationId":"review_target_adjustment_api_v1_classes__class_id__fund_target_adjustments__adjustment_id__review_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"adjustment_id","in":"path","required":true,"schema":{"type":"string","title":"Adjustment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/fund/withdrawals":{"post":{"tags":["集结金","集结金"],"summary":"Create Withdrawal","operationId":"create_withdrawal_api_v1_classes__class_id__fund_withdrawals_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/fund/withdrawals/{withdrawal_id}/vote":{"post":{"tags":["集结金","集结金"],"summary":"Vote Withdrawal","operationId":"vote_withdrawal_api_v1_classes__class_id__fund_withdrawals__withdrawal_id__vote_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__fund__VoteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/classes/{class_id}/fund/withdrawals/{withdrawal_id}/cancel":{"post":{"tags":["集结金","集结金"],"summary":"Cancel Withdrawal","operationId":"cancel_withdrawal_api_v1_classes__class_id__fund_withdrawals__withdrawal_id__cancel_post","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/funds":{"get":{"tags":["集结金","集结金"],"summary":"Admin Funds","operationId":"admin_funds_api_v1_admin_funds_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Status"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/funds/{withdrawal_id}/review":{"post":{"tags":["集结金","集结金"],"summary":"Admin Review","operationId":"admin_review_api_v1_admin_funds__withdrawal_id__review_post","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__fund__ReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/funds/{withdrawal_id}/retry":{"post":{"tags":["集结金","集结金"],"summary":"Admin Retry","operationId":"admin_retry_api_v1_admin_funds__withdrawal_id__retry_post","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/funds/{withdrawal_id}/mark-paid":{"post":{"tags":["集结金","集结金"],"summary":"Admin Mark Paid","operationId":"admin_mark_paid_api_v1_admin_funds__withdrawal_id__mark_paid_post","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkPaidBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns":{"get":{"tags":["集结金","集结金"],"summary":"Admin Campaigns","operationId":"admin_campaigns_api_v1_admin_fund_campaigns_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键词：标题/备注/学校名/地区","title":"Q"},"description":"关键词：标题/备注/学校名/地区"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"active|paused","title":"Status"},"description":"active|paused"},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"投放地区 省/市","title":"Region"},"description":"投放地区 省/市"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"档期交集开始 YYYY-MM-DD","title":"Start Date"},"description":"档期交集开始 YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"档期交集结束 YYYY-MM-DD","title":"End Date"},"description":"档期交集结束 YYYY-MM-DD"},{"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":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["集结金","集结金"],"summary":"Admin Campaign Create","operationId":"admin_campaign_create_api_v1_admin_fund_campaigns_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns/options":{"get":{"tags":["集结金","集结金"],"summary":"Admin Campaign Options","description":"表单候选：可选地区（省/市）。学校量大，改走 /schools 搜索接口","operationId":"admin_campaign_options_api_v1_admin_fund_campaigns_options_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns/schools":{"get":{"tags":["集结金","集结金"],"summary":"Admin Campaign Schools","description":"学校即输即搜（最多 20 条）或按 id 反查名称","operationId":"admin_campaign_schools_api_v1_admin_fund_campaigns_schools_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"逗号分隔的学校 id，编辑回显名称用","title":"Ids"},"description":"逗号分隔的学校 id，编辑回显名称用"},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns/{campaign_id}":{"put":{"tags":["集结金","集结金"],"summary":"Admin Campaign Update","operationId":"admin_campaign_update_api_v1_admin_fund_campaigns__campaign_id__put","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns/{campaign_id}/toggle":{"post":{"tags":["集结金","集结金"],"summary":"Admin Campaign Toggle","operationId":"admin_campaign_toggle_api_v1_admin_fund_campaigns__campaign_id__toggle_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/campaigns/{campaign_id}/classes":{"get":{"tags":["集结金","集结金"],"summary":"Admin Campaign Classes","operationId":"admin_campaign_classes_api_v1_admin_fund_campaigns__campaign_id__classes_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"班级名/学校名关键词","title":"Q"},"description":"班级名/学校名关键词"},{"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":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/settings":{"get":{"tags":["集结金","集结金"],"summary":"Get Pay Settings","operationId":"get_pay_settings_api_v1_admin_fund_settings_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["集结金","集结金"],"summary":"Save Pay Settings","operationId":"save_pay_settings_api_v1_admin_fund_settings_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaySettingsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/fund/pay-test":{"post":{"tags":["集结金","集结金"],"summary":"Test Pay Settings","operationId":"test_pay_settings_api_v1_admin_fund_pay_test_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/config":{"get":{"tags":["小程序配置","小程序配置"],"summary":"App Config","description":"小程序启动配置：功能开关 + 站点信息（页脚用）+ 最低版本提示位","operationId":"app_config_api_v1_app_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/app/site-info":{"get":{"tags":["小程序配置","小程序配置"],"summary":"Site Info","description":"公开接口：小程序协议页 / 页脚用，无需登录","operationId":"site_info_api_v1_app_site_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/app/features":{"get":{"tags":["小程序配置","小程序配置"],"summary":"Get Features","operationId":"get_features_api_v1_admin_app_features_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["小程序配置","小程序配置"],"summary":"Save Features","description":"保存开关（写 app_settings，重启后依然生效）","operationId":"save_features_api_v1_admin_app_features_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/app/site-info":{"get":{"tags":["小程序配置","小程序配置"],"summary":"Get Site Info","operationId":"get_site_info_api_v1_admin_app_site_info_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["小程序配置","小程序配置"],"summary":"Save Site Info","description":"保存站点信息（写 app_settings，重启后依然生效）","operationId":"save_site_info_api_v1_admin_app_site_info_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteInfoIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/filters":{"get":{"tags":["数据分析","数据分析"],"summary":"Analytics Filters","operationId":"analytics_filters_api_v1_admin_analytics_filters_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/summary":{"get":{"tags":["数据分析","数据分析"],"summary":"Analytics Summary","operationId":"analytics_summary_api_v1_admin_analytics_summary_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"class_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Ids"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/retention":{"get":{"tags":["数据分析","数据分析"],"summary":"Analytics Retention","operationId":"analytics_retention_api_v1_admin_analytics_retention_get","parameters":[{"name":"class_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Ids"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":16,"minimum":1,"default":8,"title":"Weeks"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/profile":{"get":{"tags":["数据分析","数据分析"],"summary":"Analytics Profile","operationId":"analytics_profile_api_v1_admin_analytics_profile_get","parameters":[{"name":"class_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Ids"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/report.pdf":{"get":{"tags":["数据分析","数据分析"],"summary":"Analytics Report Pdf","description":"导出 PDF 报表（浏览器用 fetch 带令牌下载，不把令牌塞进 URL）","operationId":"analytics_report_pdf_api_v1_admin_analytics_report_pdf_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"class_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Ids"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feed/discover":{"get":{"tags":["发现聚合"],"summary":"Discover Feed","description":"已加入班级的动态聚合（小程序「发现」页）","operationId":"discover_feed_api_v1_feed_discover_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feed/buzz":{"get":{"tags":["发现聚合"],"summary":"Public Buzz","description":"公开动态条：未登录首页底部滚动显示的班级新鲜事","operationId":"public_buzz_api_v1_feed_buzz_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["意见反馈"],"summary":"Create Feedback","description":"提交反馈：必须已绑定手机号（防灌水，方便回访）","operationId":"create_feedback_api_v1_feedback_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/my":{"get":{"tags":["意见反馈"],"summary":"My Feedback","description":"我的反馈记录（含处理状态与回复）","operationId":"my_feedback_api_v1_feedback_my_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/official-notices":{"get":{"tags":["官方通知"],"summary":"List Official Notices","description":"官方通知列表（仅已启用的），带本人已读状态","operationId":"list_official_notices_api_v1_official_notices_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/official-notices/{notice_id}/read":{"post":{"tags":["官方通知"],"summary":"Read Official Notice","description":"标记官方通知已读（幂等）","operationId":"read_official_notice_api_v1_official_notices__notice_id__read_post","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AdjustReviewBody":{"properties":{"approve":{"type":"boolean","title":"Approve","default":true}},"type":"object","title":"AdjustReviewBody"},"ApprovalCreateBody":{"properties":{"action":{"type":"string","title":"Action"},"target_id":{"type":"string","title":"Target Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["action","target_id"],"title":"ApprovalCreateBody"},"ApprovalSignBody":{"properties":{"approve":{"type":"boolean","title":"Approve","default":true}},"type":"object","title":"ApprovalSignBody"},"AuthOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"anyOf":[{"$ref":"#/components/schemas/UserMeOut"},{"type":"null"}]},"need_phone":{"type":"boolean","title":"Need Phone","default":false},"bind_ticket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bind Ticket"}},"type":"object","required":["access_token"],"title":"AuthOut","description":"统一登录/注册返回：token + 用户信息\n\n微信首次登录时不再直接建号：返回 need_phone=True + bind_ticket，\n前端引导绑定手机号后再调 /auth/wx-bind 换正式 token。"},"BindPhone":{"properties":{"phone":{"type":"string","title":"Phone"},"verify_code":{"type":"string","title":"Verify Code"}},"type":"object","required":["phone","verify_code"],"title":"BindPhone","description":"已登录用户补绑手机号（撞号时后端自动合并账号）"},"Body_auto_tag_photo_api_v1_photos__photo_id__auto_tag_post":{"properties":{"default_role":{"type":"string","title":"Default Role","default":"student"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"Body_auto_tag_photo_api_v1_photos__photo_id__auto_tag_post"},"Body_compare_face_api_v1_face_compare_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"target_photo_id":{"type":"string","title":"Target Photo Id"},"target_user_id":{"type":"string","title":"Target User Id"}},"type":"object","required":["file"],"title":"Body_compare_face_api_v1_face_compare_post"},"Body_detect_face_api_v1_face_detect_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_detect_face_api_v1_face_detect_post"},"Body_precheck_photo_api_v1_photos_precheck_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_precheck_photo_api_v1_photos_precheck_post"},"Body_search_face_api_v1_face_search_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"class_id":{"type":"string","title":"Class Id"},"threshold":{"type":"integer","title":"Threshold","default":75}},"type":"object","required":["file"],"title":"Body_search_face_api_v1_face_search_post"},"Body_upload_image_api_v1_upload_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"purpose":{"type":"string","title":"Purpose","default":""}},"type":"object","required":["file"],"title":"Body_upload_image_api_v1_upload_image_post"},"Body_upload_photo_api_v1_photos_upload_post":{"properties":{"class_id":{"type":"string","title":"Class Id"},"caption":{"type":"string","title":"Caption"},"auto_analyze":{"type":"boolean","title":"Auto Analyze","default":true},"photo_type":{"type":"string","title":"Photo Type","default":"graduation"},"allow_duplicate":{"type":"boolean","title":"Allow Duplicate","default":false},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["class_id","file"],"title":"Body_upload_photo_api_v1_photos_upload_post"},"CampaignBody":{"properties":{"title":{"type":"string","title":"Title"},"amount":{"type":"number","title":"Amount"},"start_at":{"type":"string","title":"Start At"},"end_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End At"},"regions":{"items":{"type":"string"},"type":"array","title":"Regions","default":[]},"school_ids":{"items":{"type":"string"},"type":"array","title":"School Ids","default":[]},"school_excludes":{"items":{"type":"string"},"type":"array","title":"School Excludes","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","required":["title","amount","start_at"],"title":"CampaignBody"},"CampaignUpdateBody":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"start_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start At"},"end_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End At"},"regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Regions"},"school_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"School Ids"},"school_excludes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"School Excludes"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"CampaignUpdateBody","description":"只传需要改的字段；金额/范围在有班级参加后不可再改（后端强校验）"},"ClassActionIn":{"properties":{"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ClassActionIn","description":"班级内任意内容的处置动作\n\napprove / reject：相册展示审核、聚会回忆审核\ndelete / restore：软删除与恢复（照片、动态）\nclose / reopen / done：聚会报名开关与结束"},"ClassCreate":{"properties":{"school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"school_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Type"},"grade_year":{"type":"integer","title":"Grade Year"},"class_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class No"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"major":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Major"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force","default":false}},"type":"object","required":["grade_year"],"title":"ClassCreate"},"ClassOut":{"properties":{"id":{"type":"string","title":"Id"},"school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"school_former_names":{"items":{},"type":"array","title":"School Former Names","default":[]},"class_former_names":{"items":{},"type":"array","title":"Class Former Names","default":[]},"former_proposal":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Former Proposal"},"can_manage_former":{"type":"boolean","title":"Can Manage Former","default":false},"meeting_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Note"},"can_moderate":{"type":"boolean","title":"Can Moderate","default":false},"grade_year":{"type":"integer","title":"Grade Year"},"class_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class No"},"major":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Major"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"invite_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Code"},"member_count":{"type":"integer","title":"Member Count","default":0},"face_total":{"type":"integer","title":"Face Total","default":0},"student_total":{"type":"integer","title":"Student Total","default":0},"teacher_total":{"type":"integer","title":"Teacher Total","default":0},"post_count":{"type":"integer","title":"Post Count","default":0},"event_count":{"type":"integer","title":"Event Count","default":0},"joined":{"type":"boolean","title":"Joined","default":false},"public_only":{"type":"boolean","title":"Public Only","default":false},"cover_blurred":{"type":"boolean","title":"Cover Blurred","default":false},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"approved"},"status_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Text"},"reviewing":{"type":"boolean","title":"Reviewing","default":false},"can_join":{"type":"boolean","title":"Can Join","default":true},"inviter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Name"},"age_fit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Age Fit"},"age_gap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Gap"},"age_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Hint"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","school_id","grade_year","class_no","name","cover_url","invite_code","created_at"],"title":"ClassOut"},"ClassUpsert":{"properties":{"school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"},"grade_year":{"type":"integer","title":"Grade Year"},"class_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class No"},"major":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Major"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"meeting_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Note"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"review_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Note"}},"type":"object","required":["grade_year"],"title":"ClassUpsert","description":"后台新增/编辑班级：已通过的班级也能改学校/届别/专业/状态"},"CommentCreate":{"properties":{"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"CommentCreate"},"CreateSchoolRequest":{"properties":{"name":{"type":"string","title":"Name"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"school_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Type","default":"中小学"}},"type":"object","required":["name"],"title":"CreateSchoolRequest"},"EventCreateBody":{"properties":{"class_id":{"type":"string","title":"Class Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"event_time":{"type":"string","title":"Event Time"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"max_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Count"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"place_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Name"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility","default":"all"},"invitee_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Invitee Ids"}},"type":"object","required":["class_id","title","event_time"],"title":"EventCreateBody","description":"前端创建聚会的请求体（event_time 用字符串，后端做多格式解析）"},"EventPostCommentIn":{"properties":{"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"EventPostCommentIn","description":"聚会回忆评论"},"EventPostIn":{"properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","default":"topic"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"images":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Images"}},"type":"object","title":"EventPostIn","description":"聚会回忆发布：朋友圈模式——文字 / 图文混合（images 最多 9 张），单图 image_url 兼容旧版"},"EventPostReviewIn":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action","default":"approve"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"EventPostReviewIn","description":"发起人审核：approve 通过 / reject 驳回"},"EventUpdateBody":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"event_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Time"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"max_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Count"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"place_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Name"}},"type":"object","title":"EventUpdateBody","description":"前端编辑聚会的请求体（均为可选）"},"FaceClaimRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"on_behalf_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Behalf Of"}},"type":"object","title":"FaceClaimRequest","description":"认领人脸时的可选参数"},"FaceTagBulkRoleUpdate":{"properties":{"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids","default":[]},"person_role":{"type":"string","title":"Person Role","default":"teacher"}},"type":"object","title":"FaceTagBulkRoleUpdate","description":"批量改角色（识别后一次确认多位老师）"},"FaceTagRoleUpdate":{"properties":{"person_role":{"type":"string","title":"Person Role","default":"teacher"}},"type":"object","title":"FaceTagRoleUpdate","description":"把某个人脸标签改成老师 / 改回同学"},"FaceTagUpdate":{"properties":{"tags":{"items":{"type":"object"},"type":"array","title":"Tags"}},"type":"object","required":["tags"],"title":"FaceTagUpdate"},"FeatureIn":{"properties":{"discover_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Enabled"}},"type":"object","title":"FeatureIn"},"FeedbackActionBody":{"properties":{"action":{"type":"string","title":"Action"},"reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["action"],"title":"FeedbackActionBody"},"FeedbackCreate":{"properties":{"content":{"type":"string","title":"Content"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact"}},"type":"object","required":["content"],"title":"FeedbackCreate"},"FormerNamesBody":{"properties":{"names":{"items":{"type":"string"},"type":"array","title":"Names","default":[]}},"type":"object","title":"FormerNamesBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JoinByCodeIn":{"properties":{"invite_code":{"type":"string","title":"Invite Code"},"inviter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Id"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","default":"code"}},"type":"object","required":["invite_code"],"title":"JoinByCodeIn"},"MajorUpsert":{"properties":{"name":{"type":"string","title":"Name"},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"approved"}},"type":"object","required":["name"],"title":"MajorUpsert"},"MarkPaidBody":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"MarkPaidBody"},"MemberUpsert":{"properties":{"class_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Role"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"MemberUpsert","description":"班级成员：设置班委身份 / 调整入班状态"},"MessageBody":{"properties":{"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"MessageBody"},"MyPasswordIn":{"properties":{"old_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Password"},"new_password":{"type":"string","maxLength":64,"minLength":6,"title":"New Password"}},"type":"object","required":["new_password"],"title":"MyPasswordIn"},"MyTokenIn":{"properties":{"new_token":{"type":"string","maxLength":64,"minLength":8,"title":"New Token"}},"type":"object","required":["new_token"],"title":"MyTokenIn"},"NotifySettingsIn":{"properties":{"WECHAT_APPID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Appid"},"WECHAT_SECRET":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Secret"},"WECHAT_DM_TMPL_ID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Dm Tmpl Id"},"WECHAT_MEETUP_TMPL_ID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Meetup Tmpl Id"}},"type":"object","title":"NotifySettingsIn"},"OfficialNoticeActionBody":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"OfficialNoticeActionBody"},"OfficialNoticeBody":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"}},"type":"object","required":["title","content"],"title":"OfficialNoticeBody"},"PaySettingsBody":{"properties":{"WECHAT_MCH_ID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Mch Id"},"WECHAT_PAY_CERT_SERIAL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Cert Serial"},"WECHAT_PAY_API_V3_KEY":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Api V3 Key"},"WECHAT_PAY_PRIVATE_KEY":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Private Key"},"WECHAT_PAY_PRIVATE_KEY_PATH":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Private Key Path"},"WECHAT_PAY_TRANSFER_SCENE":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Transfer Scene"},"WECHAT_PAY_NOTIFY_URL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wechat Pay Notify Url"}},"type":"object","title":"PaySettingsBody","description":"只传需要改的字段；密钥留空表示不改"},"PhoneLogin":{"properties":{"phone":{"type":"string","title":"Phone"},"password":{"type":"string","title":"Password"}},"type":"object","required":["phone","password"],"title":"PhoneLogin"},"PhoneRegister":{"properties":{"phone":{"type":"string","title":"Phone"},"password":{"type":"string","title":"Password"},"nickname":{"type":"string","title":"Nickname"},"real_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Real Name"},"verify_code":{"type":"string","title":"Verify Code"}},"type":"object","required":["phone","password","nickname","verify_code"],"title":"PhoneRegister"},"PhoneSendCode":{"properties":{"phone":{"type":"string","title":"Phone"}},"type":"object","required":["phone"],"title":"PhoneSendCode"},"PhotoReviewBody":{"properties":{"approve":{"type":"boolean","title":"Approve","default":true},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"PhotoReviewBody"},"PostCreate":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"}},"type":"object","title":"PostCreate"},"RealnameSettingsIn":{"properties":{"FACE_ENGINE":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Face Engine"},"REALNAME_PROVIDER":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Realname Provider"},"REALNAME_BAIDU_API_PATH":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Realname Baidu Api Path"},"REALNAME_ENFORCE":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Realname Enforce"},"REALNAME_MIN_SCORE":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realname Min Score"},"REALNAME_FACE_MIN_RATIO":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realname Face Min Ratio"},"REALNAME_ALLOW_LOCAL_FALLBACK":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Realname Allow Local Fallback"},"GRADE_YEAR_TOLERANCE":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Grade Year Tolerance"},"BAIDU_FACE_API_KEY":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baidu Face Api Key"},"BAIDU_FACE_SECRET_KEY":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baidu Face Secret Key"},"TENCENT_SECRET_ID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tencent Secret Id"},"TENCENT_SECRET_KEY":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tencent Secret Key"},"ALIYUN_ACCESS_KEY_ID":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aliyun Access Key Id"},"ALIYUN_ACCESS_KEY_SECRET":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aliyun Access Key Secret"},"ALIYUN_BIZ_TYPE":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aliyun Biz Type"}},"type":"object","title":"RealnameSettingsIn","description":"后台可改的实名配置（只处理传上来的字段；密钥留空表示不改）"},"RealnameSubmit":{"properties":{"real_name":{"type":"string","title":"Real Name"},"id_card_no":{"type":"string","title":"Id Card No"},"image_base64":{"type":"string","title":"Image Base64"}},"type":"object","required":["real_name","id_card_no","image_base64"],"title":"RealnameSubmit"},"RecycleBatchBody":{"properties":{"op":{"type":"string","title":"Op"},"items":{"items":{"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["op","items"],"title":"RecycleBatchBody"},"ResetPasswordIn":{"properties":{"mode":{"type":"string","title":"Mode","default":"random"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"ResetPasswordIn","description":"mode=random 由系统生成（返回一次明文）；manual 由管理员指定"},"ReviewRequest":{"properties":{"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ReviewRequest"},"SchoolUpsert":{"properties":{"name":{"type":"string","title":"Name"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"school_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Type","default":"中小学"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"former_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Former Names"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"review_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Note"},"sync_class_names":{"type":"boolean","title":"Sync Class Names","default":true}},"type":"object","required":["name"],"title":"SchoolUpsert","description":"后台新增/编辑学校：已通过的学校也允许改（管理员全权）"},"SiteInfoIn":{"properties":{"icp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icp"},"copyright":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copyright"},"agreement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agreement"},"privacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Privacy"}},"type":"object","title":"SiteInfoIn"},"StaffCreate":{"properties":{"username":{"type":"string","maxLength":32,"minLength":2,"title":"Username"},"password":{"type":"string","maxLength":64,"minLength":6,"title":"Password"},"level":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Level","default":10},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["username","password"],"title":"StaffCreate"},"StaffLogin":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"StaffLogin"},"StaffUpdate":{"properties":{"password":{"anyOf":[{"type":"string","maxLength":64,"minLength":6},{"type":"null"}],"title":"Password"},"level":{"anyOf":[{"type":"integer","maximum":99.0,"minimum":1.0},{"type":"null"}],"title":"Level"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"StaffUpdate"},"UserActionIn":{"properties":{"action":{"type":"string","title":"Action"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["action"],"title":"UserActionIn","description":"用户治理动作：ban 禁用 / unban 解禁 / cancel 注销"},"UserCreate":{"properties":{"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"gender":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gender"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"wx_code":{"type":"string","title":"Wx Code"}},"type":"object","required":["wx_code"],"title":"UserCreate"},"UserMeOut":{"properties":{"id":{"type":"string","title":"Id"},"nickname":{"type":"string","title":"Nickname"},"real_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Real Name"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"gender":{"type":"integer","title":"Gender"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"residence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence"},"annual_salary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annual Salary"},"work_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Work Years"},"marital_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Status"},"marital_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Text"},"last_active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active At"},"last_active_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Active Text"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"id_verified":{"type":"boolean","title":"Id Verified","default":false},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"id_verify_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Verify Channel"},"profile_visibility":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Profile Visibility"}},"type":"object","required":["id","nickname","avatar","gender","city","created_at"],"title":"UserMeOut","description":"当前登录用户（含手机号/简介等私有字段）"},"UserProfileOut":{"properties":{"id":{"type":"string","title":"Id"},"nickname":{"type":"string","title":"Nickname"},"real_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Real Name"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"gender":{"type":"integer","title":"Gender"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"residence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence"},"annual_salary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annual Salary"},"work_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Work Years"},"marital_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Status"},"marital_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Text"},"last_active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Active At"},"last_active_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Active Text"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"phone_visible":{"type":"boolean","title":"Phone Visible","default":false}},"type":"object","required":["id","nickname","avatar","gender","city","created_at"],"title":"UserProfileOut","description":"资料页（/users/{id}）：手机号只在本人或本人开放了「同学可见」时才给\n\n单独一个 schema 而不是给 UserOut 加字段——UserOut 被班级成员列表等场景复用，\nfrom_attributes 会把 user.phone 直接读出来，等于把手机号批量漏给全班。"},"UserUpdate":{"properties":{"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"gender":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gender"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"real_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Real Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"residence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence"},"annual_salary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annual Salary"},"work_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Work Years"},"marital_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Status"},"profile_visibility":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Profile Visibility"}},"type":"object","title":"UserUpdate"},"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"},"WithdrawBody":{"properties":{"purpose":{"type":"string","title":"Purpose"}},"type":"object","required":["purpose"],"title":"WithdrawBody"},"WxBindPhone":{"properties":{"bind_ticket":{"type":"string","title":"Bind Ticket"},"phone":{"type":"string","title":"Phone"},"verify_code":{"type":"string","title":"Verify Code"}},"type":"object","required":["bind_ticket","phone","verify_code"],"title":"WxBindPhone","description":"微信首次登录绑定手机号（凭 wx-login 下发的 bind_ticket）"},"app__api__class_governance__ReviewBody":{"properties":{"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ReviewBody"},"app__api__class_governance__VoteBody":{"properties":{"monitor_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monitor User Id"},"vice_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vice User Id"}},"type":"object","title":"VoteBody"},"app__api__fund__ReviewBody":{"properties":{"approve":{"type":"boolean","title":"Approve","default":true},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"ReviewBody"},"app__api__fund__VoteBody":{"properties":{"vote":{"type":"string","title":"Vote"}},"type":"object","required":["vote"],"title":"VoteBody"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}