# API Portal — 睿核科技 API 文档门户 设计文档 > 日期:2026-06-08 > 状态:待审核 > 作者:AI + 张晟 --- ## 一、项目概述 ### 1.1 项目名称 - **前端项目**:`api-portal`(睿核科技 API 文档门户) - **后端服务**:`rui-service-apidoc`(API 文档管理微服务) ### 1.2 核心目标 构建一个**精美的 API 文档门户系统**,具备以下能力: 1. **多源 API 文档聚合** — 自动同步微服务 OpenAPI JSON + 手动导入 2. **自定义多级菜单** — 3 级菜单树,自由组织,不受 Controller 结构限制 3. **文档补全增强** — 管理后台补充中文说明、示例、注意事项 4. **精美文档展示** — VitePress 风格三栏布局,代码高亮 5. **AI 结构化接口** — 提供完整 API 信息供 AI 读取、代码生成、变更感知 6. **多项目管理** — 可自由创建项目,每个项目独立菜单和文档 ### 1.3 用户角色 | 角色 | 说明 | |------|------| | 匿名访客 | 浏览公开项目的 API 文档 | | 开发者 | 浏览 + 搜索 + 测试 API | | 管理员 | 管理项目、菜单、同步 API、补全文档 | | AI Agent | 通过专用接口读取结构化 API 数据 | --- ## 二、系统架构 ``` ┌──────────────────────────────────────────────────────────────────┐ │ 整体架构 │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ 微服务集群 │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ rui-user │ │rui-system │ │rui-cashier│ │rui-payment│ │ │ │/v3/api- │ │/v3/api- │ │/v3/api- │ │/v3/api- │ │ │ │ docs │ │ docs │ │ docs │ │ docs │ │ │ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ rui-service-apidoc(独立微服务) │ │ │ │ │ │ │ │ 同步引擎 文档管理 AI 接口 │ │ │ │ - 定时拉取 - 菜单 CRUD - 结构化查询 │ │ │ │ - 手动触发 - 文档补全 - 变更检测 │ │ │ │ - JSON 导入 - 版本管理 - 代码生成数据 │ │ │ └──────────┬───────────────────┬───────────────────────┘ │ │ │ │ │ │ ┌────────▼────────┐ ┌──────▼──────────┐ │ │ │ admin-ui │ │ api-portal │ │ │ │ (管理后台) │ │ (文档门户) │ │ │ │ 补全信息/管理菜单 │ │ 精美展示/公开 │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ ┌────────────────────────────────────────┐ │ │ │ AI Agent (Codex 等) │ │ │ │ 通过 /ai/* 接口读取结构化 API 数据 │ │ │ └────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` --- ## 三、后端设计 — rui-apidoc ### 3.1 技术栈 | 项目 | 选型 | 说明 | |------|------|------| | 语言 | Java 21 | 和框架一致 | | 框架 | Spring Boot 3 + Spring Cloud | 和框架一致 | | 数据库 | MySQL 8 | 和框架一致 | | ORM | MyBatis-Plus | 继承 BaseEntity | | API 文档 | SpringDoc (OpenAPI 3) | 和框架一致 | | 注册中心 | Nacos | 复用现有 | | 包管理 | Maven | parent: rui-parent | ### 3.2 模块结构 遵循 `业务应用模块创建规则`,作为 `app/` 下的独立业务模块: ``` app/ └── rui-apidoc/ ├── pom.xml # parent: rui-app ├── rui-apidoc-api/ # [可部署] REST API + 启动类 │ └── src/main/java/com/rui/apidoc/api/ │ ├── ApidocApplication.java │ └── controller/ │ ├── PortalController.java # 文档门户 API(公开) │ ├── ApidocController.java # 管理后台 API(需认证) │ └── AiController.java # AI 专用 API ├── rui-apidoc-common/ # [库] DTO、VO、枚举 │ └── src/main/java/com/rui/apidoc/ │ ├── dto/ │ ├── vo/ │ └── enums/ ├── rui-apidoc-core/ # [库] Entity、Mapper、Service │ └── src/main/java/com/rui/apidoc/core/ │ ├── entity/ │ ├── mapper/ │ ├── service/ │ └── config/ └── rui-apidoc-task/ # [库] 定时同步任务 └── src/main/java/com/rui/apidoc/task/ └── SyncTask.java ``` **POM 层级**: ``` app/pom.xml (rui-app) └── rui-apidoc/pom.xml (parent: rui-app) ├── rui-apidoc-api → parent: rui-apidoc ├── rui-apidoc-common ├── rui-apidoc-core └── rui-apidoc-task ``` **依赖关系**: ``` common → rui-common-core core → rui-common-mybatis, rui-common-security, common task → core, common api → core, task, rui-common-security, rui-common-web ``` ### 3.3 核心数据模型 > 所有实体继承 `BaseEntity`,自动包含 id, tenant_id, deleted, created_by, created_at, updated_by, updated_at 字段。 > 建表 SQL 只写业务字段,公共字段由 BaseEntity 规范统一。 #### 3.3.1 项目表 `apidoc_project` ```sql CREATE TABLE apidoc_project ( -- 业务字段 project_key VARCHAR(64) NOT NULL COMMENT '项目唯一标识,如 rui-framework', name VARCHAR(128) NOT NULL COMMENT '项目名称', description TEXT DEFAULT NULL COMMENT '项目描述', visibility TINYINT NOT NULL DEFAULT 0 COMMENT '可见性 0=公开 1=需登录 2=仅管理员', logo_url VARCHAR(512) DEFAULT NULL COMMENT '项目 Logo', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除 0=正常 1=已删', created_by BIGINT DEFAULT NULL COMMENT '创建者ID', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_by BIGINT DEFAULT NULL COMMENT '更新者ID', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_project_key (project_key) ) COMMENT='API文档项目'; ``` #### 3.3.2 微服务注册表 `apidoc_service` ```sql CREATE TABLE apidoc_service ( -- 业务字段 project_id BIGINT NOT NULL COMMENT '所属项目ID', service_name VARCHAR(128) NOT NULL COMMENT '服务名,如 rui-service-user', service_url VARCHAR(512) DEFAULT NULL COMMENT '服务地址,如 http://rui-service-user:8080', sync_mode TINYINT NOT NULL DEFAULT 0 COMMENT '同步模式 0=自动同步(URL) 1=手动导入', sync_status TINYINT NOT NULL DEFAULT 0 COMMENT '同步状态 0=未同步 1=同步中 2=成功 3=失败', last_sync_at DATETIME DEFAULT NULL COMMENT '最后同步时间', openapi_json MEDIUMTEXT DEFAULT NULL COMMENT '缓存的 OpenAPI JSON', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', created_by BIGINT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by BIGINT DEFAULT NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), INDEX idx_project (project_id) ) COMMENT='API文档微服务注册'; ``` #### 3.3.3 多级菜单表 `apidoc_menu` ```sql CREATE TABLE apidoc_menu ( -- 业务字段 project_id BIGINT NOT NULL COMMENT '所属项目ID', parent_id BIGINT NOT NULL DEFAULT 0 COMMENT '父级菜单ID,0=顶级', name VARCHAR(128) NOT NULL COMMENT '菜单名称', icon VARCHAR(64) DEFAULT NULL COMMENT '图标', menu_type TINYINT NOT NULL DEFAULT 0 COMMENT '类型 0=目录 1=自定义内容页 2=接口组', sort_order INT NOT NULL DEFAULT 0 COMMENT '同级排序', service_id BIGINT DEFAULT NULL COMMENT '关联的微服务(menu_type=2时)', endpoint_paths JSON DEFAULT NULL COMMENT '关联的API路径列表', content MEDIUMTEXT DEFAULT NULL COMMENT 'Markdown自定义内容(menu_type=1时)', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', created_by BIGINT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by BIGINT DEFAULT NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), INDEX idx_project_parent (project_id, parent_id) ) COMMENT='API文档菜单'; ``` #### 3.3.4 API 端点表 `apidoc_endpoint` ```sql CREATE TABLE apidoc_endpoint ( -- 业务字段 service_id BIGINT NOT NULL COMMENT '所属微服务ID', menu_id BIGINT DEFAULT NULL COMMENT '关联菜单ID', method VARCHAR(10) NOT NULL COMMENT 'HTTP方法 GET/POST/PUT/DELETE/PATCH', path VARCHAR(512) NOT NULL COMMENT '接口路径', summary VARCHAR(256) DEFAULT NULL COMMENT '接口摘要(来自OpenAPI)', description TEXT DEFAULT NULL COMMENT '接口描述(来自OpenAPI)', deprecated TINYINT NOT NULL DEFAULT 0 COMMENT '是否废弃', tags JSON DEFAULT NULL COMMENT 'OpenAPI tags', request_params JSON DEFAULT NULL COMMENT '查询参数 [{name,type,required,description}]', request_body JSON DEFAULT NULL COMMENT '请求体 JSON Schema', request_headers JSON DEFAULT NULL COMMENT '请求头', path_params JSON DEFAULT NULL COMMENT '路径参数', response_200 JSON DEFAULT NULL COMMENT '200 响应 JSON Schema', response_error JSON DEFAULT NULL COMMENT '错误响应 Schema', raw_openapi JSON DEFAULT NULL COMMENT '原始 OpenAPI operation 对象', content_hash VARCHAR(64) DEFAULT NULL COMMENT '内容哈希,用于变更检测', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', created_by BIGINT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by BIGINT DEFAULT NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_service_method_path (service_id, method, path), INDEX idx_service (service_id), INDEX idx_menu (menu_id) ) COMMENT='API端点'; ``` #### 3.3.5 文档补充表 `apidoc_extra` ```sql CREATE TABLE apidoc_extra ( -- 业务字段 endpoint_id BIGINT NOT NULL COMMENT '关联端点ID', custom_title VARCHAR(256) DEFAULT NULL COMMENT '自定义标题(覆盖summary)', custom_desc TEXT DEFAULT NULL COMMENT '自定义说明(中文描述)', use_cases TEXT DEFAULT NULL COMMENT '使用场景说明', notes TEXT DEFAULT NULL COMMENT '注意事项', request_example JSON DEFAULT NULL COMMENT '请求示例', response_example JSON DEFAULT NULL COMMENT '响应示例', error_example JSON DEFAULT NULL COMMENT '错误响应示例', test_cases JSON DEFAULT NULL COMMENT '测试用例 [{name,params,expected}]', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', created_by BIGINT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by BIGINT DEFAULT NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_endpoint (endpoint_id) ) COMMENT='API文档补充信息'; ``` #### 3.3.6 版本快照表 `apidoc_version` ```sql CREATE TABLE apidoc_version ( -- 业务字段 service_id BIGINT NOT NULL COMMENT '所属微服务ID', version VARCHAR(32) NOT NULL COMMENT '版本号,如 v1.2.0', openapi_json MEDIUMTEXT DEFAULT NULL COMMENT 'OpenAPI JSON 快照', change_log TEXT DEFAULT NULL COMMENT '变更日志(Markdown)', -- BaseEntity 公共字段 id BIGINT NOT NULL COMMENT '主键ID(雪花算法)', tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID', deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', created_by BIGINT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by BIGINT DEFAULT NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), INDEX idx_service (service_id) ) COMMENT='API文档版本快照'; ``` ### 3.4 核心 API 设计 > 所有接口统一使用 `Result` 返回封装(error=0 成功,code 为业务编码,message 提示,data 业务数据)。 > Controller 路径遵循 `/{模块}/{功能}/{方法}` 规范。 #### 3.4.1 文档门户 API(公开,免认证) | 方法 | 路径 | 返回类型 | 说明 | |------|------|---------|------| | GET | `/apidoc/portal/project/list` | `Result>` | 公开项目列表 | | GET | `/apidoc/portal/project/{key}` | `Result` | 项目详情 | | GET | `/apidoc/portal/project/{key}/menu` | `Result>` | 项目菜单树 | | GET | `/apidoc/portal/project/{key}/menu/{menuId}` | `Result` | 菜单详情 | | GET | `/apidoc/portal/endpoint/{id}` | `Result` | 端点详情(含补充信息) | | GET | `/apidoc/portal/search` | `Result>` | 全文搜索 | #### 3.4.2 管理后台 API(需认证 + 管理员权限) 遵循 Controller 分类规范,管理接口使用 `ApidocController`: | 方法 | 路径 | 返回类型 | 说明 | |------|------|---------|------| | POST | `/apidoc/admin/project` | `Result` | 创建项目 | | PUT | `/apidoc/admin/project/{id}` | `Result` | 更新项目 | | DELETE | `/apidoc/admin/project/{id}` | `Result` | 删除项目 | | POST | `/apidoc/admin/service` | `Result` | 注册微服务 | | POST | `/apidoc/admin/service/{id}/sync` | `Result` | 手动触发同步 | | POST | `/apidoc/admin/service/{id}/import` | `Result` | 手动导入 OpenAPI JSON | | POST | `/apidoc/admin/menu` | `Result` | 创建菜单 | | PUT | `/apidoc/admin/menu/{id}` | `Result` | 更新菜单 | | DELETE | `/apidoc/admin/menu/{id}` | `Result` | 删除菜单 | | PUT | `/apidoc/admin/menu/sort` | `Result` | 批量排序 | | POST | `/apidoc/admin/menu/{id}/bind` | `Result` | 菜单绑定 API 端点 | | PUT | `/apidoc/admin/extra/{endpointId}` | `Result` | 更新补充信息 | | POST | `/apidoc/admin/service/{id}/snapshot` | `Result` | 创建版本快照 | #### 3.4.3 AI 专用 API | 方法 | 路径 | 返回类型 | 说明 | |------|------|---------|------| | GET | `/apidoc/ai/projects` | `Result>` | 所有项目(含服务概况) | | GET | `/apidoc/ai/project/{key}/endpoints` | `Result>` | 项目全部端点(完整结构化) | | GET | `/apidoc/ai/endpoint/{id}` | `Result` | 单个端点完整信息 | | GET | `/apidoc/ai/endpoint/search` | `Result>` | 搜索端点(keyword/method/path) | | GET | `/apidoc/ai/project/{key}/changes` | `Result>` | API 变更(增量,since参数) | | POST | `/apidoc/ai/query` | `Result>` | AI 自然语言查询 | **AI 接口返回示例(`GET /apidoc/ai/endpoint/{id}`)**: ```json { "error": 0, "code": null, "message": "操作成功", "data": { "id": 1001, "method": "POST", "path": "/v1/user/users", "summary": "创建用户", "description": "管理员创建新用户,需要管理员权限", "deprecated": false, "tags": ["用户管理"], "auth": "需要 Bearer Token,角色:ADMIN", "requestParams": [], "pathParams": [], "requestHeaders": [ { "name": "Authorization", "required": true, "description": "Bearer Token" }, { "name": "Content-Type", "required": true, "value": "application/json" } ], "requestBody": { "type": "object", "required": ["username", "password", "phone"], "properties": { "username": { "type": "string", "description": "用户名,4-20位字母数字", "example": "zhangsan" }, "password": { "type": "string", "description": "密码,8-32位", "example": "Pass@123" }, "phone": { "type": "string", "description": "手机号", "example": "13800138000" }, "email": { "type": "string", "description": "邮箱(可选)", "example": "zhangsan@example.com" } } }, "response200": { "type": "object", "properties": { "error": { "type": "integer", "description": "0=成功", "example": 0 }, "code": { "type": "string", "example": "SUCCESS" }, "message": { "type": "string", "example": "操作成功" }, "data": { "type": "object", "properties": { "id": { "type": "integer", "description": "用户ID", "example": 1001 }, "username": { "type": "string", "example": "zhangsan" }, "created_at": { "type": "string", "format": "date-time" } } } } }, "responseError": { "400": { "error": 400, "code": "PARAM_INVALID", "message": "参数校验失败" }, "401": { "error": 401, "code": "UNAUTHORIZED", "message": "未登录" }, "403": { "error": 403, "code": "FORBIDDEN", "message": "无权限" } }, "extra": { "customTitle": "创建新用户", "customDesc": "管理员通过此接口创建新用户,创建后用户处于启用状态", "useCases": "后台管理 > 用户管理 > 新增用户", "notes": "用户名唯一,不可重复。密码需满足复杂度要求。", "requestExample": { "username": "zhangsan", "password": "Pass@123", "phone": "13800138000" }, "responseExample": { "error": 0, "code": null, "message": "操作成功", "data": { "id": 1001, "username": "zhangsan" } }, "testCases": [ { "name": "正常创建", "params": { "username": "testuser01", "password": "Pass@123", "phone": "13900139001" }, "expected": { "error": 0 } }, { "name": "用户名重复", "params": { "username": "admin", "password": "Pass@123", "phone": "13900139002" }, "expected": { "error": 400, "code": "USER_EXISTS" } } ] }, "service": { "name": "rui-service-user", "project": "rui-framework" }, "updatedAt": "2026-06-08T10:00:00" } } ``` ### 3.5 同步引擎设计 ``` 自动同步流程: 1. rui-apidoc-task 中的定时任务(可配置周期) 或 手动触发 2. 遍历 apidoc_service 中 sync_mode=0 且 sync_status!=1 的服务 3. HTTP 请求 {service_url}/v3/api-docs 获取 OpenAPI JSON 4. 使用 JsonUtil 解析 JSON,提取所有 Path + Operation 5. 计算每个 Operation 的 content_hash,与 apidoc_endpoint 现有数据对比 6. 新增/更新/标记废弃 端点,记录变更 7. 更新 sync_status=2, last_sync_at, openapi_json 手动导入流程: 1. 管理员在管理后台粘贴 OpenAPI JSON 或上传文件 2. 同上解析入库逻辑,sync_mode=1 ``` ### 3.6 启动类 ```java package com.rui.apidoc.api; import com.rui.common.security.annotation.EnableResourceServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableResourceServer public class ApidocApplication { public static void main(String[] args) { SpringApplication.run(ApidocApplication.class, args); } } ``` ### 3.7 Nacos 白名单配置 ```yaml security: oauth2: ignore-urls: - /apidoc/portal/** - /apidoc/ai/** ``` > `/apidoc/portal/**` 和 `/apidoc/ai/**` 免认证公开访问。 > `/apidoc/admin/**` 需管理员权限。 ## 四、前端设计 — api-portal ### 4.1 技术栈 | 项目 | 选型 | 说明 | |------|------|------| | 框架 | Vue 3 + TypeScript | 组合式 API (setup),和 admin-ui 一致 | | 构建 | Vite 6 | 和 admin-ui 一致 | | 样式 | UnoCSS | 原子化 CSS,和 admin-ui 一致 | | 路由 | Vue Router 4 | 侧边栏联动 | | HTTP | Axios | 统一封装 request,复用 admin-ui 模式 | | 代码高亮 | Shiki | 和 VitePress 同款高亮引擎 | | Markdown 渲染 | markdown-it + 自定义插件 | 自定义内容页 | | 图标 | @iconify-json/carbon | 专业文档风格 | > api-portal 是独立项目(不依赖 Element Plus),UI 全部基于 UnoCSS 原子化样式构建。 ### 4.2 页面结构 #### 三栏布局(接口文档页) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 🏠 Rui API Portal 🔍 搜索接口... 🌙 主题 🌐 中文 │ ├────────────┬──────────────────────────────────┬─────────────────┤ │ │ │ │ │ 📖 快速开始 │ POST /v1/user/users │ 请求示例 │ │ │ ━━━━━━━━━━━━━━━━━━━━ │ │ │ ▸ 用户管理 │ 创建新用户 │ curl -X POST \ │ │ 登录 │ │ /v1/user/users \│ │ 注册 │ 管理员通过此接口创建新用户,创建 │ -H 'Auth...' \ │ │ 用户列表 │ 后用户处于启用状态。 │ -d '{...}' │ │ 用户详情 │ │ │ │ 创建用户 │ ⚡ 需要管理员权限 │─────────────────│ │ 更新用户 │ 🔒 Bearer Token │ 响应示例 │ │ ▸ 订单管理 │ │ │ │ 创建订单 │ 请求参数 │ 200 OK │ │ 查询订单 │ ┌──────┬──────┬────┬────┐ │ { │ │ 取消订单 │ │ 参数 │ 类型 │必填│说明 │ │ "error":0, │ │ ▸ 支付 │ ├──────┼──────┼────┼────┤ │ "data":{...}│ │ 发起支付 │ │username│string│ ✓ │用户名│ │ } │ │ 支付回调 │ │password│string│ ✓ │密码 │ │ │ │ 退款 │ └──────┴──────┴────┴────┘ │─────────────────│ │ │ │ 测试用例 │ │ │ 响应参数 │ ✅ 正常创建 │ │ │ ┌──────┬──────┬────┐ │ ❌ 用户名重复 │ │ │ │ 字段 │ 类型 │说明 │ │ │ │ │ ├──────┼──────┼────┤ │ │ │ │ │ id │ long │用户ID│ │ │ │ │ └──────┴──────┴────┘ │ │ │ │ │ │ └────────────┴──────────────────────────────────┴─────────────────┘ ``` #### 项目首页 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 🏠 Rui API Portal 🔍 搜索接口... 🌙 主题 🌐 中文 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 睿核科技 API 文档中心 │ │ 探索、测试、集成我们的 API 服务 │ │ │ │ ┌──────────────────────────────────┐ │ │ │ 🔍 搜索所有 API 接口... │ │ │ └──────────────────────────────────┘ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 📦 rui-frame │ │ 📦 rui-cashier│ │ 📦 rui-payment│ │ │ │ work │ │ │ │ │ │ │ │ 基础平台框架 │ │ 收银系统 │ │ 支付系统 │ │ │ │ 128 接口 │ │ 56 接口 │ │ 32 接口 │ │ │ │ 5 模块 │ │ 3 模块 │ │ 2 模块 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 4.3 路由设计 ``` / → 项目首页(项目卡片列表) /:projectKey → 项目页(菜单 + 欢迎页) /:projectKey/menu/:menuId → 菜单页(自定义内容 / 接口组) /:projectKey/endpoint/:id → 单个接口详情页 /search?keyword=&projectId= → 搜索结果页 ``` ### 4.4 核心功能 | 功能 | 说明 | |------|------| | 多级菜单导航 | 3 级可折叠侧边栏,图标 + 名称 | | 接口文档渲染 | 方法/路径/参数/响应/示例,结构化表格展示 | | 代码高亮 | 请求示例(curl/JS/Java)、响应示例 JSON | | Markdown 自定义页 | 菜单项关联自定义 Markdown 内容(快速开始、认证说明等) | | 全文搜索 | 搜索接口名、路径、描述、参数名 | | 深色模式 | 主题切换 | | 响应式 | 移动端适配(侧边栏折叠) | | "试一试" | 简易 API 测试面板(填参数发请求) | ### 4.5 项目结构 > 遵循 admin-ui 的目录约定:service 层使用 BaseService 模式,composables 存放组合式函数,views 存放页面。 ``` api-portal/ ├── package.json ├── vite.config.ts ├── uno.config.ts ├── tsconfig.json ├── index.html ├── public/ │ └── favicon.svg ├── src/ │ ├── main.ts │ ├── App.vue │ ├── service/ # API 请求封装(和 admin-ui 一致) │ │ ├── BaseService.ts # 通用 CRUD 基类(复用 admin-ui 模式) │ │ ├── portalService.ts # 文档门户接口 │ │ └── types.ts # TypeScript 类型定义 │ ├── composables/ # 组合式函数 │ │ ├── useTheme.ts # 主题切换 │ │ ├── useMenu.ts # 菜单状态 │ │ └── useSearch.ts # 搜索 │ ├── components/ │ │ ├── layout/ │ │ │ ├── AppHeader.vue # 顶部导航 │ │ │ ├── AppSidebar.vue # 侧边栏 │ │ │ ├── AppFooter.vue # 底部 │ │ │ └── ThreeColumn.vue # 三栏布局容器 │ │ ├── endpoint/ │ │ │ ├── EndpointHeader.vue # 方法 + 路径 + 标签 │ │ │ ├── ParamsTable.vue # 参数表格 │ │ │ ├── ResponseSchema.vue # 响应结构 │ │ │ ├── CodeBlock.vue # 代码块(Shiki 高亮) │ │ │ └── TryIt.vue # "试一试"面板 │ │ ├── markdown/ │ │ │ └── MarkdownRenderer.vue # Markdown 渲染 │ │ └── search/ │ │ └── SearchDialog.vue # 搜索弹窗 │ ├── views/ # 页面(和 admin-ui 命名一致) │ │ ├── HomePage.vue # 首页 │ │ ├── ProjectPage.vue # 项目页 │ │ ├── MenuPage.vue # 菜单内容页 │ │ ├── EndpointPage.vue # 接口详情页 │ │ └── SearchPage.vue # 搜索结果页 │ ├── router/ │ │ └── index.ts │ ├── stores/ # Pinia 状态管理 │ │ └── project.ts # 项目状态 │ ├── styles/ │ │ ├── variables.css # CSS 变量(主题色) │ │ └── prose.css # 文档内容样式 │ └── utils/ │ ├── request.ts # Axios 封装(复用 admin-ui 模式,baseURL 指向 apidoc 服务) │ └── format.ts # 格式化工具 └── env.d.ts ``` ### 4.6 request.ts 设计 > 复用 admin-ui 的 request 封装模式,但 api-portal 是公开文档站,不需要 Token/租户拦截。 ```typescript // src/utils/request.ts import axios from 'axios' const request = axios.create({ baseURL: '/api', // 通过网关转发到 rui-apidoc timeout: 10000, }) // 响应拦截 — 复用 Result 的 error 判断逻辑 request.interceptors.response.use( (response) => { const { data } = response if (data.error !== 0) { console.error(data.message || '请求失败') return Promise.reject(data) } return data }, (error) => { console.error('网络错误', error.message) return Promise.reject(error) }, ) export { request } ``` ### 4.7 service 层设计 > 遵循 admin-ui 的 BaseService 模式,但 api-portal 以只读查询为主。 ```typescript // src/service/portalService.ts import { request } from '@/utils/request' /** 获取公开项目列表 */ export function getProjectList() { return request({ url: '/apidoc/portal/project/list', method: 'get' }) } /** 获取项目详情 */ export function getProject(key: string) { return request({ url: `/apidoc/portal/project/${key}`, method: 'get' }) } /** 获取项目菜单树 */ export function getMenuTree(key: string) { return request({ url: `/apidoc/portal/project/${key}/menu`, method: 'get' }) } /** 获取菜单详情 */ export function getMenuDetail(key: string, menuId: string) { return request({ url: `/apidoc/portal/project/${key}/menu/${menuId}`, method: 'get' }) } /** 获取端点详情 */ export function getEndpoint(id: string) { return request({ url: `/apidoc/portal/endpoint/${id}`, method: 'get' }) } /** 搜索 */ export function searchEndpoints(keyword: string, projectId?: string) { return request({ url: '/apidoc/portal/search', method: 'get', params: { keyword, projectId } }) } ``` ## 五、部署架构 ``` ┌──────────────────────────────────────────────────┐ │ Nginx / Gateway │ │ ├─ / → api-portal 静态资源 │ │ ├─ /admin → admin-ui 静态资源 │ │ └─ /api/apidoc/* → rui-service-apidoc │ └──────────────────────────────────────────────────┘ api-portal 构建产物部署为静态资源,通过 Nginx 或 CDN 分发。 rui-service-apidoc 注册到 Nacos,通过 Gateway 路由。 ``` --- ## 六、开发优先级 ### Phase 1:MVP(最小可用) 1. 后端:项目/菜单/端点 CRUD + OpenAPI JSON 手动导入 2. 前端:三栏布局 + 菜单导航 + 接口文档渲染 ### Phase 2:增强 3. 后端:自动同步引擎(定时拉取 /v3/api-docs) 4. 后端:文档补全管理 5. 前端:搜索 + 深色模式 ### Phase 3:AI + 高级功能 6. 后端:AI 专用结构化接口 7. 后端:API 变更检测 + 版本管理 8. 前端:"试一试" API 测试面板 --- ## 七、参考风格 | 参考站点 | 地址 | 借鉴点 | |---------|------|--------| | VitePress | https://vitepress.dev | 整体风格、三栏布局、深色模式 | | Nuxt UI Pro | https://ui.nuxt.com/pro | 文档模板、导航设计 | | Stripe API | https://stripe.com/docs/api | 代码示例、交互体验 | | Scalar | https://scalar.com | 现代 API 文档 UI | --- > 本文档仅涵盖设计,不涉及具体实现代码。实施前需团队审核确认。