diff --git a/openapi.json b/openapi.json new file mode 100644 index 00000000..04125aa4 --- /dev/null +++ b/openapi.json @@ -0,0 +1,1654 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "ValueFrontier API", + "description": "价值前沿 - 股票投资分析平台完整API文档", + "version": "1.0.0", + "contact": { + "name": "ValueFrontier", + "url": "https://valuefrontier.cn" + } + }, + "servers": [ + { + "url": "https://valuefrontier.cn", + "description": "生产环境" + } + ], + "tags": [ + {"name": "认证", "description": "用户认证相关接口"}, + {"name": "账户管理", "description": "用户账户信息管理"}, + {"name": "自选股", "description": "自选股管理"}, + {"name": "投资计划", "description": "投资计划与复盘"}, + {"name": "事件", "description": "投资事件相关"}, + {"name": "帖子评论", "description": "社区帖子与评论"}, + {"name": "股票行情", "description": "股票实时行情"}, + {"name": "股票信息", "description": "股票基本信息"}, + {"name": "财务报表", "description": "财务数据查询"}, + {"name": "市场数据", "description": "市场行情与统计"}, + {"name": "财经日历", "description": "财经事件日历"}, + {"name": "行业分类", "description": "行业分类查询"}, + {"name": "概念板块", "description": "概念板块数据"}, + {"name": "公司分析", "description": "公司深度分析"}, + {"name": "模拟交易", "description": "模拟盘交易"}, + {"name": "会员订阅", "description": "订阅与支付"} + ], + "paths": { + "/api/auth/session": { + "get": { + "tags": ["认证"], + "summary": "获取当前登录用户信息", + "responses": { + "200": {"description": "成功", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserSession"}}}} + } + } + }, + "/api/auth/login": { + "post": { + "tags": ["认证"], + "summary": "用户登录", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "required": ["password"], + "properties": { + "username": {"type": "string", "description": "用户名/手机号/邮箱"}, + "email": {"type": "string"}, + "phone": {"type": "string"}, + "password": {"type": "string"} + } + } + } + } + }, + "responses": { + "200": {"description": "登录成功"}, + "401": {"description": "密码错误"}, + "404": {"description": "用户不存在"} + } + } + }, + "/api/auth/logout": { + "post": { + "tags": ["认证"], + "summary": "用户登出", + "responses": {"200": {"description": "已登出"}} + } + }, + "/api/auth/register": { + "post": { + "tags": ["认证"], + "summary": "用户注册(用户名+邮箱)", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "required": ["username", "email", "password"], + "properties": { + "username": {"type": "string"}, + "email": {"type": "string"}, + "password": {"type": "string"} + } + } + } + } + }, + "responses": { + "201": {"description": "注册成功"}, + "400": {"description": "用户名或邮箱已存在"} + } + } + }, + "/api/auth/send-verification-code": { + "post": { + "tags": ["认证"], + "summary": "发送验证码(手机/邮箱)", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["credential", "type"], + "properties": { + "credential": {"type": "string", "description": "手机号或邮箱"}, + "type": {"type": "string", "enum": ["phone", "email"]}, + "purpose": {"type": "string", "enum": ["login", "register"], "default": "login"} + } + } + } + } + }, + "responses": {"200": {"description": "验证码已发送"}} + } + }, + "/api/auth/login-with-code": { + "post": { + "tags": ["认证"], + "summary": "验证码登录", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["credential", "verification_code", "login_type"], + "properties": { + "credential": {"type": "string"}, + "verification_code": {"type": "string"}, + "login_type": {"type": "string", "enum": ["phone", "email"]} + } + } + } + } + }, + "responses": {"200": {"description": "登录成功"}} + } + }, + "/api/auth/register/phone": { + "post": { + "tags": ["认证"], + "summary": "手机号注册", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["phone", "code", "password", "username"], + "properties": { + "phone": {"type": "string"}, + "code": {"type": "string"}, + "password": {"type": "string"}, + "username": {"type": "string"} + } + } + } + } + }, + "responses": {"201": {"description": "注册成功"}} + } + }, + "/api/auth/register/email": { + "post": { + "tags": ["认证"], + "summary": "邮箱注册", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["email", "code", "password", "username"], + "properties": { + "email": {"type": "string"}, + "code": {"type": "string"}, + "password": {"type": "string"}, + "username": {"type": "string"} + } + } + } + } + }, + "responses": {"201": {"description": "注册成功"}} + } + }, + "/api/auth/wechat/qrcode": { + "get": { + "tags": ["认证"], + "summary": "获取微信登录二维码", + "responses": { + "200": { + "description": "成功", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "auth_url": {"type": "string"}, + "session_id": {"type": "string"}, + "expires_in": {"type": "integer"} + } + } + } + } + } + } + } + }, + "/api/auth/wechat/check": { + "post": { + "tags": ["认证"], + "summary": "检查微信扫码状态", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["session_id"], + "properties": {"session_id": {"type": "string"}} + } + } + } + }, + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/change-password": { + "post": { + "tags": ["账户管理"], + "summary": "修改密码", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["newPassword"], + "properties": { + "currentPassword": {"type": "string"}, + "newPassword": {"type": "string"}, + "isFirstSet": {"type": "boolean"} + } + } + } + } + }, + "responses": {"200": {"description": "密码修改成功"}} + } + }, + "/api/account/password-status": { + "get": { + "tags": ["账户管理"], + "summary": "获取密码状态", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/profile-completeness": { + "get": { + "tags": ["账户管理"], + "summary": "获取资料完整度", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/phone/send-code": { + "post": { + "tags": ["账户管理"], + "summary": "发送绑定手机验证码", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["phone"], + "properties": {"phone": {"type": "string"}} + } + } + } + }, + "responses": {"200": {"description": "验证码已发送"}} + } + }, + "/api/account/phone/bind": { + "post": { + "tags": ["账户管理"], + "summary": "绑定手机号", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["phone", "code"], + "properties": { + "phone": {"type": "string"}, + "code": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "绑定成功"}} + } + }, + "/api/account/phone/unbind": { + "post": { + "tags": ["账户管理"], + "summary": "解绑手机号", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "解绑成功"}} + } + }, + "/api/account/email/send-bind-code": { + "post": { + "tags": ["账户管理"], + "summary": "发送绑定邮箱验证码", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["email"], + "properties": {"email": {"type": "string"}} + } + } + } + }, + "responses": {"200": {"description": "验证码已发送"}} + } + }, + "/api/account/email/bind": { + "post": { + "tags": ["账户管理"], + "summary": "绑定邮箱", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["email", "code"], + "properties": { + "email": {"type": "string"}, + "code": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "绑定成功"}} + } + }, + "/api/account/email/unbind": { + "post": { + "tags": ["账户管理"], + "summary": "解绑邮箱", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "解绑成功"}} + } + }, + "/api/account/wechat/qrcode": { + "get": { + "tags": ["账户管理"], + "summary": "获取微信绑定二维码", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/wechat/unbind": { + "post": { + "tags": ["账户管理"], + "summary": "解绑微信", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "解绑成功"}} + } + }, + "/api/account/watchlist": { + "get": { + "tags": ["自选股"], + "summary": "获取自选股列表", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["自选股"], + "summary": "添加自选股", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["stock_code"], + "properties": { + "stock_code": {"type": "string", "description": "支持多种格式:600519、600519.SH、贵州茅台(600519)"}, + "stock_name": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "添加成功"}} + } + }, + "/api/account/watchlist/{stock_code}": { + "delete": { + "tags": ["自选股"], + "summary": "删除自选股", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "删除成功"}} + } + }, + "/api/account/watchlist/realtime": { + "get": { + "tags": ["自选股"], + "summary": "获取自选股实时行情", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/investment-plans": { + "get": { + "tags": ["投资计划"], + "summary": "获取投资计划列表", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "type", "in": "query", "schema": {"type": "string", "enum": ["plan", "review"]}}, + {"name": "start_date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "end_date", "in": "query", "schema": {"type": "string", "format": "date"}} + ], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["投资计划"], + "summary": "创建投资计划", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["date", "title", "type"], + "properties": { + "date": {"type": "string", "format": "date"}, + "title": {"type": "string"}, + "content": {"type": "string"}, + "type": {"type": "string", "enum": ["plan", "review"]}, + "stocks": {"type": "array", "items": {"type": "string"}}, + "tags": {"type": "array", "items": {"type": "string"}}, + "status": {"type": "string", "default": "active"} + } + } + } + } + }, + "responses": {"200": {"description": "创建成功"}} + } + }, + "/api/account/investment-plans/{plan_id}": { + "put": { + "tags": ["投资计划"], + "summary": "更新投资计划", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "plan_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "date": {"type": "string", "format": "date"}, + "title": {"type": "string"}, + "content": {"type": "string"}, + "stocks": {"type": "array", "items": {"type": "string"}}, + "tags": {"type": "array", "items": {"type": "string"}}, + "status": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "更新成功"}} + }, + "delete": { + "tags": ["投资计划"], + "summary": "删除投资计划", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "plan_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "删除成功"}} + } + }, + "/api/account/events/following": { + "get": { + "tags": ["投资计划"], + "summary": "获取关注的事件", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/future-events/following": { + "get": { + "tags": ["投资计划"], + "summary": "获取关注的未来事件", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/account/calendar/events": { + "get": { + "tags": ["投资计划"], + "summary": "获取日历事件(投资计划+关注的未来事件)", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "year", "in": "query", "schema": {"type": "integer"}}, + {"name": "month", "in": "query", "schema": {"type": "integer"}}, + {"name": "start_date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "end_date", "in": "query", "schema": {"type": "string", "format": "date"}} + ], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["投资计划"], + "summary": "创建日历事件", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["title", "event_date"], + "properties": { + "title": {"type": "string"}, + "event_date": {"type": "string", "format": "date"}, + "type": {"type": "string", "default": "plan"}, + "description": {"type": "string"}, + "stocks": {"type": "array", "items": {"type": "string"}} + } + } + } + } + }, + "responses": {"200": {"description": "创建成功"}} + } + }, + "/api/account/calendar/events/{event_id}": { + "delete": { + "tags": ["投资计划"], + "summary": "删除日历事件", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "删除成功"}} + } + }, + "/api/events": { + "get": { + "tags": ["事件"], + "summary": "获取事件列表", + "parameters": [ + {"name": "page", "in": "query", "schema": {"type": "integer", "default": 1}}, + {"name": "per_page", "in": "query", "schema": {"type": "integer", "default": 10}}, + {"name": "type", "in": "query", "schema": {"type": "string"}}, + {"name": "status", "in": "query", "schema": {"type": "string", "default": "active"}}, + {"name": "importance", "in": "query", "schema": {"type": "string"}}, + {"name": "sort", "in": "query", "schema": {"type": "string", "enum": ["hot", "new", "returns", "importance", "view_count"]}}, + {"name": "start_date", "in": "query", "schema": {"type": "string"}}, + {"name": "end_date", "in": "query", "schema": {"type": "string"}}, + {"name": "recent_days", "in": "query", "schema": {"type": "integer"}}, + {"name": "q", "in": "query", "schema": {"type": "string"}, "description": "搜索关键词"}, + {"name": "industry_classification", "in": "query", "schema": {"type": "string"}}, + {"name": "industry_code", "in": "query", "schema": {"type": "string"}} + ], + "responses": { + "200": { + "description": "成功", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/EventsResponse"} + } + } + } + } + } + }, + "/api/events/hot": { + "get": { + "tags": ["事件"], + "summary": "获取热点事件", + "parameters": [ + {"name": "days", "in": "query", "schema": {"type": "integer", "default": 3}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 4}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/keywords/popular": { + "get": { + "tags": ["事件"], + "summary": "获取热门关键词", + "parameters": [ + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 20}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}": { + "get": { + "tags": ["事件"], + "summary": "获取事件详情", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": { + "200": { + "description": "成功", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/EventDetail"} + } + } + } + } + } + }, + "/api/events/{event_id}/stocks": { + "get": { + "tags": ["事件"], + "summary": "获取事件相关股票(需要Pro订阅)", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": { + "200": {"description": "成功"}, + "403": {"description": "需要Pro订阅"} + } + }, + "post": { + "tags": ["事件"], + "summary": "添加相关股票", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["stock_code", "relation_desc"], + "properties": { + "stock_code": {"type": "string"}, + "stock_name": {"type": "string"}, + "sector": {"type": "string"}, + "relation_desc": {"type": "string"}, + "correlation": {"type": "number"}, + "momentum": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "添加成功"}} + } + }, + "/api/events/{event_id}/concepts": { + "get": { + "tags": ["事件"], + "summary": "获取相关概念(需要Pro订阅)", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": { + "200": {"description": "成功"}, + "403": {"description": "需要Pro订阅"} + } + } + }, + "/api/events/{event_id}/historical": { + "get": { + "tags": ["事件"], + "summary": "获取历史事件对比", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/historical-events/{event_id}/stocks": { + "get": { + "tags": ["事件"], + "summary": "获取历史事件相关股票", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/expectation-score": { + "get": { + "tags": ["事件"], + "summary": "获取超预期得分", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/follow": { + "post": { + "tags": ["事件"], + "summary": "关注/取消关注事件", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/transmission": { + "get": { + "tags": ["事件"], + "summary": "获取传导链分析(需要Max订阅)", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": { + "200": {"description": "成功"}, + "403": {"description": "需要Max订阅"} + } + } + }, + "/api/events/{event_id}/sankey-data": { + "get": { + "tags": ["事件"], + "summary": "获取桑基图数据", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/chain-analysis": { + "get": { + "tags": ["事件"], + "summary": "获取产业链分析", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/chain-node/{node_id}": { + "get": { + "tags": ["事件"], + "summary": "获取链节点详情", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}}, + {"name": "node_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/events/{event_id}/posts": { + "get": { + "tags": ["帖子评论"], + "summary": "获取事件帖子列表", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}}, + {"name": "sort", "in": "query", "schema": {"type": "string", "enum": ["latest", "hot"], "default": "latest"}}, + {"name": "page", "in": "query", "schema": {"type": "integer", "default": 1}}, + {"name": "per_page", "in": "query", "schema": {"type": "integer", "default": 20}} + ], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["帖子评论"], + "summary": "创建帖子", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["content"], + "properties": { + "title": {"type": "string"}, + "content": {"type": "string"}, + "content_type": {"type": "string", "default": "text"} + } + } + } + } + }, + "responses": {"200": {"description": "发布成功"}} + } + }, + "/api/posts/{post_id}/comments": { + "get": { + "tags": ["帖子评论"], + "summary": "获取帖子评论", + "parameters": [ + {"name": "post_id", "in": "path", "required": true, "schema": {"type": "integer"}}, + {"name": "sort", "in": "query", "schema": {"type": "string", "enum": ["latest", "hot"]}} + ], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["帖子评论"], + "summary": "发表评论", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "post_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["content"], + "properties": { + "content": {"type": "string"}, + "parent_id": {"type": "integer", "description": "回复的评论ID"} + } + } + } + } + }, + "responses": {"200": {"description": "评论成功"}} + } + }, + "/api/posts/{post_id}/like": { + "post": { + "tags": ["帖子评论"], + "summary": "点赞/取消点赞帖子", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "post_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/comments/{comment_id}/like": { + "post": { + "tags": ["帖子评论"], + "summary": "点赞评论", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "comment_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/posts/{post_id}": { + "delete": { + "tags": ["帖子评论"], + "summary": "删除帖子", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "post_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "删除成功"}} + } + }, + "/api/comments/{comment_id}": { + "delete": { + "tags": ["帖子评论"], + "summary": "删除评论", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "comment_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "删除成功"}} + } + }, + "/api/stocks/search": { + "get": { + "tags": ["股票信息"], + "summary": "搜索股票", + "parameters": [ + {"name": "q", "in": "query", "required": true, "schema": {"type": "string"}, "description": "股票代码/名称/拼音首字母"}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 20}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/kline": { + "get": { + "tags": ["股票行情"], + "summary": "获取K线数据", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "type", "in": "query", "schema": {"type": "string", "enum": ["minute", "daily", "timeline"], "default": "minute"}}, + {"name": "event_time", "in": "query", "schema": {"type": "string", "format": "date-time"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/latest-minute": { + "get": { + "tags": ["股票行情"], + "summary": "获取最新分钟数据", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/forecast-report": { + "get": { + "tags": ["股票信息"], + "summary": "获取盈利预测报告", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/basic-info": { + "get": { + "tags": ["股票信息"], + "summary": "获取股票基本信息", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/announcements": { + "get": { + "tags": ["股票信息"], + "summary": "获取公告列表", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 50}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/disclosure-schedule": { + "get": { + "tags": ["股票信息"], + "summary": "获取财报预披露时间", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/actual-control": { + "get": { + "tags": ["股票信息"], + "summary": "获取实际控制人", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/concentration": { + "get": { + "tags": ["股票信息"], + "summary": "获取股权集中度", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/management": { + "get": { + "tags": ["股票信息"], + "summary": "获取管理层信息", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "active_only", "in": "query", "schema": {"type": "boolean", "default": true}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/top-circulation-shareholders": { + "get": { + "tags": ["股票信息"], + "summary": "获取十大流通股东", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 10}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/top-shareholders": { + "get": { + "tags": ["股票信息"], + "summary": "获取十大股东", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 10}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/branches": { + "get": { + "tags": ["股票信息"], + "summary": "获取分支机构", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/{stock_code}/patents": { + "get": { + "tags": ["股票信息"], + "summary": "获取专利信息", + "parameters": [ + {"name": "stock_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 50}}, + {"name": "type", "in": "query", "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/stock/quotes": { + "get": { + "tags": ["股票行情"], + "summary": "获取股票报价(GET)", + "parameters": [ + {"name": "codes", "in": "query", "required": true, "schema": {"type": "string"}, "description": "逗号分隔的股票代码"}, + {"name": "event_time", "in": "query", "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + }, + "post": { + "tags": ["股票行情"], + "summary": "获取股票报价(POST)", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["codes"], + "properties": { + "codes": {"type": "array", "items": {"type": "string"}}, + "event_time": {"type": "string"} + } + } + } + } + }, + "responses": {"200": {"description": "成功"}} + } + }, + "/api/index/{index_code}/kline": { + "get": { + "tags": ["股票行情"], + "summary": "获取指数K线", + "parameters": [ + {"name": "index_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "type", "in": "query", "schema": {"type": "string", "enum": ["minute", "daily", "timeline"]}}, + {"name": "event_time", "in": "query", "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/stock-info/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取财务摘要", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/balance-sheet/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取资产负债表", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 12}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/income-statement/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取利润表", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 12}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/cashflow/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取现金流量表", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 12}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/financial-metrics/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取财务指标", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 12}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/main-business/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取主营业务构成", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "periods", "in": "query", "schema": {"type": "integer", "default": 4}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/forecast/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取业绩预告", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/industry-rank/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取行业排名", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 4}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/financial/comparison/{seccode}": { + "get": { + "tags": ["财务报表"], + "summary": "获取报告期对比", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "periods", "in": "query", "schema": {"type": "integer", "default": 8}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/trade/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取交易数据(日K)", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "days", "in": "query", "schema": {"type": "integer", "default": 60}}, + {"name": "end_date", "in": "query", "schema": {"type": "string", "format": "date"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/funding/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取融资融券数据", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "days", "in": "query", "schema": {"type": "integer", "default": 30}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/bigdeal/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取大宗交易", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "days", "in": "query", "schema": {"type": "integer", "default": 30}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/unusual/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取龙虎榜数据", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "days", "in": "query", "schema": {"type": "integer", "default": 30}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/pledge/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取股权质押", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/summary/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取市场数据汇总", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/heatmap": { + "get": { + "tags": ["市场数据"], + "summary": "获取市场热力图", + "parameters": [ + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 500}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/statistics": { + "get": { + "tags": ["市场数据"], + "summary": "获取市场统计数据", + "parameters": [ + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/market/rise-analysis/{seccode}": { + "get": { + "tags": ["市场数据"], + "summary": "获取涨幅分析", + "parameters": [ + {"name": "seccode", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "start_date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "end_date", "in": "query", "schema": {"type": "string", "format": "date"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/v1/calendar/event-counts": { + "get": { + "tags": ["财经日历"], + "summary": "获取日历事件数量统计", + "parameters": [ + {"name": "year", "in": "query", "schema": {"type": "integer"}}, + {"name": "month", "in": "query", "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/v1/calendar/events": { + "get": { + "tags": ["财经日历"], + "summary": "获取日历事件列表", + "parameters": [ + {"name": "date", "in": "query", "required": true, "schema": {"type": "string", "format": "date"}}, + {"name": "type", "in": "query", "schema": {"type": "string", "default": "all"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/v1/calendar/events/{event_id}": { + "get": { + "tags": ["财经日历"], + "summary": "获取日历事件详情", + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/v1/calendar/events/{event_id}/follow": { + "post": { + "tags": ["财经日历"], + "summary": "关注/取消关注未来事件", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "event_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/classifications": { + "get": { + "tags": ["行业分类"], + "summary": "获取所有行业分类系统", + "responses": {"200": {"description": "成功"}} + } + }, + "/api/levels": { + "get": { + "tags": ["行业分类"], + "summary": "获取行业层级数据", + "parameters": [ + {"name": "classification", "in": "query", "required": true, "schema": {"type": "string"}}, + {"name": "level", "in": "query", "required": true, "schema": {"type": "integer", "minimum": 1, "maximum": 4}}, + {"name": "level1_name", "in": "query", "schema": {"type": "string"}}, + {"name": "level2_name", "in": "query", "schema": {"type": "string"}}, + {"name": "level3_name", "in": "query", "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/info": { + "get": { + "tags": ["行业分类"], + "summary": "获取行业详细信息", + "parameters": [ + {"name": "classification", "in": "query", "required": true, "schema": {"type": "string"}}, + {"name": "code", "in": "query", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/concepts/daily-top": { + "get": { + "tags": ["概念板块"], + "summary": "获取每日涨幅靠前的概念", + "parameters": [ + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 6}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/company/comprehensive-analysis/{company_code}": { + "get": { + "tags": ["公司分析"], + "summary": "获取公司综合分析", + "parameters": [ + {"name": "company_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/company/value-chain-analysis/{company_code}": { + "get": { + "tags": ["公司分析"], + "summary": "获取产业链分析", + "parameters": [ + {"name": "company_code", "in": "path", "required": true, "schema": {"type": "string"}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/company/key-factors-timeline/{company_code}": { + "get": { + "tags": ["公司分析"], + "summary": "获取关键因素和时间线", + "parameters": [ + {"name": "company_code", "in": "path", "required": true, "schema": {"type": "string"}}, + {"name": "report_period", "in": "query", "schema": {"type": "string"}}, + {"name": "event_limit", "in": "query", "schema": {"type": "integer", "default": 50}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/simulation/account": { + "get": { + "tags": ["模拟交易"], + "summary": "获取模拟账户", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/simulation/positions": { + "get": { + "tags": ["模拟交易"], + "summary": "获取持仓列表", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/simulation/orders": { + "get": { + "tags": ["模拟交易"], + "summary": "获取订单列表", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "status", "in": "query", "schema": {"type": "string"}}, + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 50}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/simulation/place-order": { + "post": { + "tags": ["模拟交易"], + "summary": "下单(支持7x24小时)", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["stock_code", "order_type", "order_qty"], + "properties": { + "stock_code": {"type": "string"}, + "order_type": {"type": "string", "enum": ["BUY", "SELL"]}, + "order_qty": {"type": "integer", "multipleOf": 100}, + "price_type": {"type": "string", "default": "MARKET"} + } + } + } + } + }, + "responses": {"200": {"description": "下单成功"}} + } + }, + "/api/simulation/cancel-order/{order_id}": { + "post": { + "tags": ["模拟交易"], + "summary": "撤销订单", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "order_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "撤销成功"}} + } + }, + "/api/simulation/transactions": { + "get": { + "tags": ["模拟交易"], + "summary": "获取成交记录", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "date", "in": "query", "schema": {"type": "string", "format": "date"}}, + {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 100}} + ], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/simulation/t1-settlement": { + "post": { + "tags": ["模拟交易"], + "summary": "手动触发T+1结算", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "结算成功"}} + } + }, + "/api/simulation/daily-settlement": { + "post": { + "tags": ["模拟交易"], + "summary": "手动触发日结算", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "结算成功"}} + } + }, + "/api/simulation/reset": { + "post": { + "tags": ["模拟交易"], + "summary": "重置模拟账户", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "重置成功"}} + } + }, + "/api/subscription/plans": { + "get": { + "tags": ["会员订阅"], + "summary": "获取订阅套餐", + "responses": {"200": {"description": "成功"}} + } + }, + "/api/subscription/current": { + "get": { + "tags": ["会员订阅"], + "summary": "获取当前订阅", + "security": [{"cookieAuth": []}], + "responses": {"200": {"description": "成功"}} + } + }, + "/api/subscription/info": { + "get": { + "tags": ["会员订阅"], + "summary": "获取订阅信息", + "responses": {"200": {"description": "成功"}} + } + }, + "/api/payment/create-order": { + "post": { + "tags": ["会员订阅"], + "summary": "创建支付订单", + "security": [{"cookieAuth": []}], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["plan_name", "billing_cycle"], + "properties": { + "plan_name": {"type": "string", "enum": ["pro", "max"]}, + "billing_cycle": {"type": "string", "enum": ["monthly", "yearly"]} + } + } + } + } + }, + "responses": {"200": {"description": "订单创建成功"}} + } + }, + "/api/payment/order/{order_id}/status": { + "get": { + "tags": ["会员订阅"], + "summary": "查询订单状态", + "security": [{"cookieAuth": []}], + "parameters": [ + {"name": "order_id", "in": "path", "required": true, "schema": {"type": "integer"}} + ], + "responses": {"200": {"description": "成功"}} + } + } + }, + "components": { + "securitySchemes": { + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "session", + "description": "基于Session的Cookie认证" + } + }, + "schemas": { + "UserSession": { + "type": "object", + "properties": { + "success": {"type": "boolean"}, + "isAuthenticated": {"type": "boolean"}, + "user": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "username": {"type": "string"}, + "nickname": {"type": "string"}, + "email": {"type": "string"}, + "phone": {"type": "string"}, + "avatar_url": {"type": "string"}, + "subscription_type": {"type": "string", "enum": ["free", "pro", "max"]}, + "subscription_status": {"type": "string"}, + "is_subscription_active": {"type": "boolean"} + } + } + } + }, + "EventsResponse": { + "type": "object", + "properties": { + "success": {"type": "boolean"}, + "data": { + "type": "object", + "properties": { + "events": {"type": "array", "items": {"$ref": "#/components/schemas/EventSummary"}}, + "pagination": { + "type": "object", + "properties": { + "page": {"type": "integer"}, + "per_page": {"type": "integer"}, + "total": {"type": "integer"}, + "pages": {"type": "integer"}, + "has_prev": {"type": "boolean"}, + "has_next": {"type": "boolean"} + } + } + } + } + } + }, + "EventSummary": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "event_type": {"type": "string"}, + "importance": {"type": "string", "enum": ["S", "A", "B", "C"]}, + "status": {"type": "string"}, + "hot_score": {"type": "number"}, + "view_count": {"type": "integer"}, + "trending_score": {"type": "number"}, + "related_avg_chg": {"type": "number"}, + "related_max_chg": {"type": "number"}, + "created_at": {"type": "string", "format": "date-time"} + } + }, + "EventDetail": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "event_type": {"type": "string"}, + "status": {"type": "string"}, + "importance": {"type": "string"}, + "hot_score": {"type": "number"}, + "view_count": {"type": "integer"}, + "post_count": {"type": "integer"}, + "follower_count": {"type": "integer"}, + "keywords": {"type": "array", "items": {"type": "string"}}, + "related_industries": {"type": "object"}, + "related_avg_chg": {"type": "number"}, + "related_max_chg": {"type": "number"}, + "invest_score": {"type": "integer"}, + "has_chain_analysis": {"type": "boolean"}, + "is_following": {"type": "boolean"}, + "created_at": {"type": "string", "format": "date-time"} + } + } + } + } +} \ No newline at end of file diff --git a/src/components/Navbars/HomeNavbar.js b/src/components/Navbars/HomeNavbar.js index a106fb07..60395b90 100644 --- a/src/components/Navbars/HomeNavbar.js +++ b/src/components/Navbars/HomeNavbar.js @@ -46,7 +46,7 @@ import { useAuthModal } from '../../contexts/AuthModalContext'; const NavItems = ({ isAuthenticated, user }) => { const navigate = useNavigate(); - if (isAuthenticated && user) { + if (!isAuthenticated && !user) { return (