openapi: 3.0.3 info: title: VF React 压测接口文档 description: | 登录认证 + 社区/事件中心 高频接口文档 **压测建议优先级:** 1. `GET /api/events` - 事件列表(最高频,首页核心) 2. `GET /api/auth/session` - 会话检查(每次页面加载) 3. `GET /api/events/{id}` - 事件详情 4. `GET /api/events/{id}/stocks` - 相关股票(需Pro订阅) 5. `GET /api/events/hot` - 热点事件(首页展示) version: 1.0.0 contact: name: VF Team servers: - url: https://api.valuefrontier.cn description: 生产环境 - url: http://localhost:5001 description: 本地开发 tags: - name: 认证 description: 登录认证相关接口 - name: 事件 description: 事件/社区相关接口 paths: # ==================== 认证接口 ==================== /api/auth/session: get: tags: - 认证 summary: 获取当前会话信息 description: | **高频指数: ⭐⭐⭐⭐⭐** 每次页面加载都会调用,用于检查用户登录状态。 无需认证即可调用,未登录时返回 isAuthenticated: false operationId: getSessionInfo responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true isAuthenticated: type: boolean example: true user: type: object nullable: true properties: id: type: integer example: 1 username: type: string example: "testuser" nickname: type: string example: "测试用户" email: type: string example: "test@example.com" phone: type: string example: "13800138000" phone_confirmed: type: boolean example: true avatar_url: type: string nullable: true has_wechat: type: boolean example: false subscription_type: type: string enum: [free, pro, max] example: "pro" subscription_status: type: string enum: [active, expired, none] example: "active" is_subscription_active: type: boolean example: true subscription_days_left: type: integer nullable: true example: 30 /api/auth/login: post: tags: - 认证 summary: 密码登录 description: | **高频指数: ⭐⭐⭐** 支持用户名/手机号/邮箱 + 密码登录。 登录成功后设置 Session Cookie。 operationId: login requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - password properties: username: type: string description: 用户名或手机号 example: "testuser" email: type: string description: 邮箱(与username二选一) example: "test@example.com" phone: type: string description: 手机号(与username二选一) example: "13800138000" password: type: string description: 密码 example: "password123" responses: '200': description: 登录成功 headers: Set-Cookie: description: Session Cookie schema: type: string content: application/json: schema: type: object properties: success: type: boolean example: true user: $ref: '#/components/schemas/UserBasic' '400': description: 参数错误 content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: 密码错误 content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: 用户不存在 content: application/json: schema: $ref: '#/components/schemas/Error' /api/auth/send-verification-code: post: tags: - 认证 summary: 发送验证码 description: | **高频指数: ⭐⭐** 发送手机/邮箱验证码,用于验证码登录。 验证码5分钟内有效。 operationId: sendVerificationCode requestBody: required: true content: application/json: schema: type: object required: - target - type properties: target: type: string description: 手机号或邮箱 example: "13800138000" type: type: string enum: [phone, email] description: 验证码类型 example: "phone" responses: '200': description: 发送成功 content: application/json: schema: type: object properties: success: type: boolean example: true message: type: string example: "验证码已发送" '400': description: 参数错误 content: application/json: schema: $ref: '#/components/schemas/Error' '429': description: 发送过于频繁 content: application/json: schema: $ref: '#/components/schemas/Error' /api/auth/login-with-code: post: tags: - 认证 summary: 验证码登录/注册 description: | **高频指数: ⭐⭐⭐** 使用验证码登录,如用户不存在则自动注册。 operationId: loginWithCode requestBody: required: true content: application/json: schema: type: object required: - target - code - type properties: target: type: string description: 手机号或邮箱 example: "13800138000" code: type: string description: 6位验证码 example: "123456" type: type: string enum: [phone, email] example: "phone" responses: '200': description: 登录成功 content: application/json: schema: type: object properties: success: type: boolean example: true is_new_user: type: boolean example: false user: $ref: '#/components/schemas/UserBasic' '400': description: 验证码错误或已过期 content: application/json: schema: $ref: '#/components/schemas/Error' # ==================== 事件接口 ==================== /api/events: get: tags: - 事件 summary: 获取事件列表 description: | **高频指数: ⭐⭐⭐⭐⭐(最高频)** 社区/事件中心核心接口,支持丰富的筛选、排序、分页功能。 只返回有关联股票的事件。 **压测重点接口** operationId: getEvents parameters: # 分页 - name: page in: query schema: type: integer default: 1 minimum: 1 description: 页码 - name: per_page in: query schema: type: integer default: 10 minimum: 1 maximum: 100 description: 每页数量 # 基础筛选 - name: type in: query schema: type: string default: "all" description: 事件类型 - name: status in: query schema: type: string default: "active" enum: [active, ended, all] description: 事件状态 - name: importance in: query schema: type: string default: "all" description: 重要性等级,支持多个用逗号分隔(如 S,A) # 日期筛选 - name: recent_days in: query schema: type: integer description: 最近N天的事件 - name: start_date in: query schema: type: string format: date description: 开始日期 - name: end_date in: query schema: type: string format: date description: 结束日期 # 搜索 - name: q in: query schema: type: string description: 搜索关键词(搜索标题、描述、关键词、关联股票) # 行业筛选 - name: industry_code in: query schema: type: string description: 申万行业代码(如 S22),支持前缀匹配 # 排序 - name: sort in: query schema: type: string default: "new" enum: [new, hot, return] description: 排序方式 - name: order in: query schema: type: string default: "desc" enum: [asc, desc] description: 排序顺序 responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: type: array items: $ref: '#/components/schemas/EventListItem' pagination: $ref: '#/components/schemas/Pagination' /api/events/hot: get: tags: - 事件 summary: 获取热点事件 description: | **高频指数: ⭐⭐⭐⭐** 首页热点展示,按平均涨幅排序。 operationId: getHotEvents parameters: - name: days in: query schema: type: integer default: 3 description: 最近N天 - name: limit in: query schema: type: integer default: 4 description: 返回数量 responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: type: array items: $ref: '#/components/schemas/HotEvent' /api/events/{event_id}: get: tags: - 事件 summary: 获取事件详情 description: | **高频指数: ⭐⭐⭐⭐** 获取单个事件的详细信息,每次调用会增加浏览计数。 operationId: getEventDetail parameters: - name: event_id in: path required: true schema: type: integer description: 事件ID responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: $ref: '#/components/schemas/EventDetail' '404': description: 事件不存在 content: application/json: schema: $ref: '#/components/schemas/Error' /api/events/{event_id}/stocks: get: tags: - 事件 summary: 获取事件相关股票 description: | **高频指数: ⭐⭐⭐⭐** 获取事件关联的股票列表,按相关性排序。 **需要 Pro 订阅** operationId: getEventStocks security: - sessionAuth: [] parameters: - name: event_id in: path required: true schema: type: integer description: 事件ID responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: type: array items: $ref: '#/components/schemas/RelatedStock' '403': description: 需要Pro订阅 content: application/json: schema: type: object properties: success: type: boolean example: false error: type: string example: "需要Pro订阅" required_level: type: string example: "pro" '404': description: 事件不存在 /api/events/{event_id}/follow: post: tags: - 事件 summary: 关注/取消关注事件 description: | **高频指数: ⭐⭐⭐** 切换事件的关注状态(需要登录) operationId: toggleEventFollow security: - sessionAuth: [] parameters: - name: event_id in: path required: true schema: type: integer description: 事件ID responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: type: object properties: is_following: type: boolean example: true follower_count: type: integer example: 42 '401': description: 未登录 content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: 事件不存在 /api/events/keywords/popular: get: tags: - 事件 summary: 获取热门关键词 description: | **高频指数: ⭐⭐⭐** 获取热门事件关键词,用于筛选和推荐。 operationId: getPopularKeywords parameters: - name: limit in: query schema: type: integer default: 20 description: 返回数量 responses: '200': description: 成功 content: application/json: schema: type: object properties: success: type: boolean example: true data: type: array items: type: object properties: keyword: type: string example: "人工智能" count: type: integer example: 15 components: securitySchemes: sessionAuth: type: apiKey in: cookie name: session description: Flask Session Cookie schemas: Error: type: object properties: success: type: boolean example: false error: type: string example: "错误信息" UserBasic: type: object properties: id: type: integer example: 1 username: type: string example: "testuser" nickname: type: string example: "测试用户" email: type: string nullable: true phone: type: string nullable: true avatar_url: type: string nullable: true Pagination: type: object properties: page: type: integer example: 1 per_page: type: integer example: 10 total: type: integer example: 100 pages: type: integer example: 10 EventListItem: type: object properties: id: type: integer example: 1 title: type: string example: "OpenAI发布GPT-5" description: type: string example: "OpenAI正式发布GPT-5模型..." event_type: type: string example: "technology" status: type: string enum: [active, ended] example: "active" importance: type: string enum: [S, A, B, C] example: "S" created_at: type: string format: date-time hot_score: type: number example: 85.5 view_count: type: integer example: 1234 follower_count: type: integer example: 56 related_avg_chg: type: number description: 关联股票平均涨幅(%) example: 5.23 related_max_chg: type: number description: 关联股票最大涨幅(%) example: 10.05 expectation_surprise_score: type: number description: 超预期得分 example: 75 keywords: type: array items: type: string example: ["AI", "GPT", "人工智能"] creator: type: object properties: id: type: integer username: type: string HotEvent: type: object properties: id: type: integer example: 1 title: type: string example: "OpenAI发布GPT-5" description: type: string importance: type: string example: "S" created_at: type: string format: date-time related_avg_chg: type: number example: 5.23 related_max_chg: type: number example: 10.05 expectation_surprise_score: type: number example: 75 creator: type: object properties: username: type: string EventDetail: type: object properties: id: type: integer title: type: string description: type: string event_type: type: string status: type: string start_time: type: string format: date-time nullable: true end_time: type: string format: date-time nullable: true created_at: type: string format: date-time hot_score: type: number view_count: type: integer trending_score: type: number post_count: type: integer follower_count: type: integer related_industries: type: string nullable: true description: 申万行业代码 keywords: type: array items: type: string importance: type: string related_avg_chg: type: number nullable: true related_max_chg: type: number nullable: true related_week_chg: type: number nullable: true invest_score: type: number nullable: true expectation_surprise_score: type: number nullable: true creator_id: type: integer nullable: true has_chain_analysis: type: boolean description: 是否有传导链分析 is_following: type: boolean RelatedStock: type: object properties: id: type: integer stock_code: type: string example: "600000.SH" stock_name: type: string example: "浦发银行" sector: type: string nullable: true example: "银行" relation_desc: type: string description: 关联原因描述 correlation: type: number description: 相关性分数 example: 0.85 momentum: type: number nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time