Files
ojnext/docs/API接口对比分析.md
yuetsh 2c31acaba7
Some checks failed
Deploy / deploy (push) Has been cancelled
流程图的功能
2025-10-13 01:38:54 +08:00

21 KiB
Raw Blame History

API接口对比分析

更新日志

最近更新2025-01-15

  • FlowchartEditor 流程图编辑器:新增完整的流程图编辑功能
    • 基于 Vue Flow 构建的流程图编辑器组件
    • 支持7种节点类型开始、输入、处理、判断、循环、输出、结束
    • 完整的拖拽创建、节点连接、编辑功能
    • 撤销重做、自动保存、键盘快捷键支持
    • 模块化设计包含9个独立的功能模块
  • 🎨 前端组件优化:完善了组件文档和项目结构说明
    • 更新了 README.md 中的技术栈和项目结构
    • 创建了详细的 FlowchartEditor 使用文档
    • 优化了开发指南和构建流程说明
  • 🔧 构建工具升级:从 Vite 迁移到 Rsbuild
    • 使用 Rsbuild 作为新的构建工具
    • 支持多环境构建test、staging、production
    • 优化了构建性能和开发体验

历史更新2025-10

  • AI分析功能增强完善了AI智能分析模块的文档说明
    • 详细说明了4个AI相关接口的功能和参数
    • 新增等级系统说明S/A/B/C包含特殊规则
    • 补充了时间范围选择功能
    • 说明了流式响应的实现方式
    • 前端组件从 WeeklyChart.vue 升级为 DurationChart.vue(混合图表)
  • 🔧 数据缓存优化后端AI接口增加了缓存机制提升性能
  • 🐛 修正等级系统说明更正了等级阈值A级前35%B级前75%),并补充了小规模参与惩罚规则

一、前端已使用的API接口

1. 用户认证相关shared/api.ts

  • POST /api/login - 用户登录
  • POST /api/register - 用户注册
  • GET /api/logout - 用户登出
  • GET /api/profile - 获取用户资料
  • GET /api/captcha - 获取验证码

2. OJ普通用户APIoj/api.ts

2.1 网站配置

  • GET /api/website - 获取网站配置
  • GET /api/hitokoto - 获取一言

2.2 题目相关

  • GET /api/problem - 获取题目列表
  • GET /api/problem - 获取单个题目
  • GET /api/problem/tags - 获取题目标签列表
  • GET /api/problem/author - 获取题目作者列表
  • GET /api/problem/beat_count - 获取题目击败率
  • GET /api/pickone - 随机获取题目
  • GET /api/contest/problem - 获取竞赛题目

2.3 提交相关

  • GET /api/submission - 获取单个提交
  • POST /api/submission - 提交代码
  • GET /api/submissions - 获取提交列表
  • GET /api/submissions/today_count - 获取今日提交数
  • GET /api/contest_submissions - 获取竞赛提交列表

2.4 排名相关

  • GET /api/user_rank - 获取用户排名
  • GET /api/user_activity_rank - 获取活跃度排名
  • GET /api/user_problem_rank - 获取题目排名
  • GET /api/contest_rank - 获取竞赛排名

2.5 竞赛相关

  • GET /api/contests - 获取竞赛列表
  • GET /api/contest - 获取单个竞赛
  • GET /api/contest/access - 获取竞赛访问权限
  • POST /api/contest/password - 验证竞赛密码

2.6 公告相关

  • GET /api/announcement - 获取公告列表/单个公告

2.7 消息相关

  • POST /api/message - 创建消息
  • GET /api/message - 获取消息列表

2.8 评论相关

  • POST /api/comment - 创建评论
  • GET /api/comment - 获取评论
  • GET /api/comment/statistics - 获取评论统计

2.9 用户相关

  • POST /api/upload_avatar - 上传头像
  • PUT /api/profile - 更新用户资料
  • GET /api/profile/fresh_display_id - 刷新用户题目显示ID
  • GET /api/metrics - 获取用户统计数据

2.10 教程相关

  • GET /api/tutorial - 获取单个教程
  • GET /api/tutorials - 获取教程列表

2.11 AI分析相关

  • GET /api/ai/detail - 获取用户详细数据
    • 参数: start, end时间范围
    • 返回: 用户等级(S/A/B/C)、已解决题目列表、标签统计、难度统计、参赛次数等
    • 特点: 包含班级排名对比,计算每道题的解题排名和等级
  • GET /api/ai/duration - 获取时段数据
    • 参数: end结束时间, duration时间单位如 "months:6", "weeks:1"
    • 返回: 每周/每月的综合情况(题目数、提交数、等级)
    • 用途: 用于绘制时间趋势图,展示学习进度变化
  • GET /api/ai/heatmap - 获取热力图数据
    • 返回: 用户的提交热力图数据(按日期统计提交数)
    • 用途: 可视化用户活跃度分布
  • POST /api/ai/analysis - AI智能分析生成
    • 请求体: details详细数据, duration时段数据
    • 响应方式: 流式响应Server-Sent Events
    • AI提供商: DeepSeek
    • 功能: 根据用户学习数据生成个性化学习建议和鼓励
    • 实现: 使用fetch直接调用oj/store/ai.ts 中处理流式输出

3. 管理员APIadmin/api.ts

3.1 仪表板

  • GET /api/admin/dashboard_info - 获取仪表板信息
  • GET /api/admin/random_user - 随机获取用户

3.2 题目管理

  • GET /api/admin/problem - 获取题目列表/单个题目
  • POST /api/admin/problem - 创建题目
  • PUT /api/admin/problem - 编辑题目
  • PUT /api/admin/problem/visible - 切换题目可见性
  • DELETE /api/admin/problem - 删除题目
  • GET /api/admin/contest/problem - 获取竞赛题目
  • POST /api/admin/contest/problem - 创建竞赛题目
  • PUT /api/admin/contest/problem - 编辑竞赛题目
  • DELETE /api/admin/contest/problem - 删除竞赛题目
  • POST /api/admin/contest/add_problem_from_public - 从公开题库添加题目到竞赛

3.3 用户管理

  • GET /api/admin/user - 获取用户列表
  • POST /api/admin/user - 导入用户
  • PUT /api/admin/user - 编辑用户
  • DELETE /api/admin/user - 删除用户
  • POST /api/admin/reset_password - 重置用户密码

3.4 竞赛管理

  • GET /api/admin/contest - 获取竞赛列表/单个竞赛
  • POST /api/admin/contest - 创建竞赛
  • PUT /api/admin/contest - 编辑竞赛
  • GET /api/admin/contest/acm_helper - 获取ACM比赛辅助检查列表
  • PUT /api/admin/contest/acm_helper - 更新ACM比赛辅助检查状态

3.5 测试用例管理

  • POST /api/admin/test_case - 上传测试用例
  • GET /api/admin/prune_test_case - 列出无效测试用例
  • DELETE /api/admin/prune_test_case - 清理无效测试用例

3.6 题目管理扩展

  • POST /api/admin/contest_problem/make_public - 将竞赛题目转为公开题目

3.7 判题服务器管理

  • GET /api/admin/judge_server - 获取判题服务器列表
  • DELETE /api/admin/judge_server - 删除判题服务器

3.8 公告管理

  • GET /api/admin/announcement - 获取公告列表/单个公告
  • POST /api/admin/announcement - 创建公告
  • PUT /api/admin/announcement - 编辑公告
  • DELETE /api/admin/announcement - 删除公告

3.9 评论管理

  • GET /api/admin/comment - 获取评论列表
  • DELETE /api/admin/comment - 删除评论

3.10 网站配置

  • GET /api/admin/website - 获取网站配置
  • POST /api/admin/website - 更新网站配置

3.11 文件上传

  • POST /api/admin/upload_image - 上传图片富文本编辑器、Markdown编辑器使用

3.12 提交管理

  • GET /api/admin/submission/rejudge - 重新判题
  • GET /api/admin/submission/statistics - 获取提交统计

3.13 教程管理

  • GET /api/admin/tutorial - 获取教程列表/单个教程
  • POST /api/admin/tutorial - 创建教程
  • PUT /api/admin/tutorial - 更新教程
  • DELETE /api/admin/tutorial - 删除教程
  • PUT /api/admin/tutorial/visibility - 设置教程可见性

二、后端提供但前端未使用的API接口

1. 用户认证相关account

  • POST /api/change_password - 修改密码
  • POST /api/change_email - 修改邮箱
  • POST /api/apply_reset_password - 申请重置密码
  • POST /api/reset_password - 重置密码
  • GET /api/check_username_or_email - 检查用户名或邮箱是否存在
  • GET /api/tfa_required - 检查是否需要双因素认证
  • POST /api/two_factor_auth - 双因素认证
  • GET /api/sessions - 会话管理
  • GET /api/open_api_appkey - OpenAPI密钥管理
  • GET /api/sso - 单点登录

2. 用户管理admin

  • GET /api/admin/generate_user - 生成用户

3. 网站配置相关

  • GET /api/languages - 获取支持的编程语言列表

4. 判题服务器内部接口(不需要前端实现)

  • POST /api/judge_server_heartbeat/ - 判题服务器心跳
    • 标记为不需要
    • 原因: 此接口由 JudgeServer Docker 容器调用,用于向后端报告服务器状态
    • 使用方: 判题服务器(非前端)
    • 数据内容: hostname, judger_version, CPU/内存使用率等
    • 认证方式: 使用特殊的 judge_server_token非用户认证

5. 管理员配置相关

  • GET /api/admin/smtp - SMTP配置
  • POST /api/admin/smtp_test - SMTP测试
  • GET /api/admin/versions - 版本信息

6. 题目管理相关admin

  • POST /api/admin/export_problem - 导出题目
  • POST /api/admin/import_problem - 导入题目
  • POST /api/admin/import_fps - 导入FPS格式题目

7. 竞赛相关admin

  • GET /api/contest/announcement - 获取竞赛公告列表OJ端
  • GET /api/admin/contest/announcement - 获取竞赛公告(管理端)
  • GET /api/admin/download_submissions - 下载竞赛提交

8. 提交相关(不必要的接口)

  • GET /api/submission_exists - 检查提交是否存在
    • 标记为不需要
    • 原因: 题目接口返回的 my_status 字段已完整包含此信息
    • 替代方案: 直接判断 my_status 的值0=已通过,非零=已尝试未通过null=未尝试)
    • 优势: 零额外请求,性能更优

9. 文件上传相关admin

  • POST /api/admin/upload_file - 上传文件(任意格式)
    • 说明: 前端已使用 upload_image(仅图片),upload_file 可上传任意文件
    • 当前状态: 未使用(前端暂无上传非图片文件的需求)
    • 潜在场景: 题目附件、教程资料、作业提交等

三、统计总结

前端已使用接口统计

  • OJ普通用户接口: 38个包括1个直接用fetch调用的流式接口
  • 管理员接口: 35个
  • 共享接口: 5个
  • 总计: 78个API调用

后端未被使用接口统计

  • 用户认证相关: 10个
  • 网站配置相关: 2个languages
  • 题目管理相关: 3个
  • 竞赛管理相关: 3个
  • 其他: 1个
  • 标记为不需要: 2个
    • submission_exists数据冗余
    • judge_server_heartbeat内部接口
  • 总计: 21个API端点其中2个不需要前端实现

未使用接口占比

21% 的后端API接口前端尚未使用

  • 需要考虑实现: 19个接口
  • 不必要实现: 2个接口submission_exists, judge_server_heartbeat

备注: 本次更新新增了 ACM 比赛辅助检查功能2个接口用于赛后人工审核代码。


四、建议

1. 高优先级需要实现的功能

  • 密码管理: change_password, apply_reset_password, reset_password
  • 邮箱管理: change_email
  • 用户名/邮箱检查: check_username_or_email注册时实时验证
  • 编程语言列表: languages显示支持的编程语言
  • 题目导入导出: export_problem, import_problem方便题库管理

2. 中等优先级功能

  • 双因素认证: tfa_required, two_factor_auth增强安全性
  • 会话管理: sessions多设备登录管理
  • 竞赛公告: contest/announcementOJ端增强竞赛体验

3. 低优先级功能

  • SSO单点登录: sso如需要集成其他系统
  • OpenAPI: open_api_appkey如需要开放API
  • SMTP配置: smtp, smtp_test管理员配置
  • 版本信息: versions显示系统版本
  • FPS导入: import_fps特定格式题目导入
  • 文件上传: upload_file目前只有图片上传

4. 可选功能

  • 生成用户: generate_user批量生成测试用户
  • 下载提交: download_submissions下载竞赛所有提交

五、接口使用率分析

模块 后端提供 前端使用 使用率
用户认证 17 7 41%
题目管理 14 11 79%
提交管理 7 6 86%
竞赛管理 12 9 75%
公告管理 4 4 100%
评论管理 4 4 100%
消息管理 1 1 100%
教程管理 4 4 100%
AI分析 4 4 100%
配置管理 9 3 33% ⚠️1个为内部接口

总体使用率约为 79%已实现ACM比赛辅助检查功能竞赛管理使用率提升至75%

特殊说明

1. AI智能分析功能

功能概述: 基于用户的学习数据使用DeepSeek AI生成个性化的学习分析报告和建议。

涉及接口:

  • GET /api/ai/detail - 获取详细学习数据
  • GET /api/ai/duration - 获取时段趋势数据
  • GET /api/ai/heatmap - 获取活跃度热力图
  • POST /api/ai/analysis - 生成AI分析流式响应

前端实现:

  • 页面: src/oj/ai/analysis.vue
  • Store: src/oj/store/ai.ts
  • 组件:
    • DurationChart.vue - 混合图表(柱状图+折线图),展示题目数、提交数、等级变化
    • Heatmap.vue - 提交热力图
    • Details.vue - 详细数据展示
    • AI.vue - AI分析结果展示Markdown格式

时间范围选择: 支持多种时间范围:一节课(1小时)、两节课(2小时)、一天、一周、一个月、两个月、半年、一年

等级系统:

  • S级: 排名前10%卓越水平约10%的人)
  • A级: 排名前35%优秀水平约25%的人)
  • B级: 排名前75%良好水平约40%的人)
  • C级: 75%之后及格水平约25%的人)
  • 特殊规则: 参与人数少于10人时S级降为A级A级降为B级避免因人少而评级虚高

流式接口实现: POST /api/ai/analysis 使用了流式响应Server-Sent Events,在 oj/store/ai.ts 中直接使用 fetch API调用配合 consumeJSONEventStream 工具函数处理流式数据实现AI内容的实时流式输出。

数据缓存: 为提升性能,后端对 ai/detailai/duration 接口的返回数据进行了缓存,相同参数的请求会直接返回缓存结果。

2. ACM 比赛辅助检查功能

功能说明: 用于赛后人工审核 ACM 模式比赛的代码,检查是否存在抄袭、作弊等行为。

涉及接口:

  • GET /api/admin/contest/acm_helper - 获取比赛中所有 AC 的提交记录
    • 返回数据: 用户名、题目ID、AC时间、错误次数、检查状态等
  • PUT /api/admin/contest/acm_helper - 更新提交的检查状态
    • 参数: contest_id, rank_id, problem_id, checked

使用场景:

  1. 管理员进入比赛详情页,点击"审核"按钮进入辅助检查页面
  2. 系统展示所有 AC 提交的列表(按用户和题目分组)
  3. 管理员可以:
    • 查看每个提交的代码详情
    • 标记已检查的提交
    • 批量标记所有提交为已检查
    • 按用户名、题目、检查状态筛选
  4. 实时显示检查进度统计(总计/已检查/未检查)

实现位置:

  • 页面: src/admin/contest/helper.vue
  • 路由: /admin/contest/:contestID/helper
  • API: src/admin/api.ts (getACMHelperList, updateACMHelperChecked)

3. 前端不需要的接口

3.1 数据冗余接口

GET /api/submission_exists - 此接口无需实现

分析结论

  • 后端题目接口(GET /api/problem)已返回 my_status 字段
  • my_status 完整记录了用户的做题状态:
    • 0 (JudgeStatus.ACCEPTED) = 已通过
    • -1 (JudgeStatus.WRONG_ANSWER) = 答案错误
    • -2 (JudgeStatus.COMPILE_ERROR) = 编译错误
    • 1 (JudgeStatus.TIME_LIMIT_EXCEEDED) = 超时
    • 其他非零值 = 其他失败原因
    • null/undefined = 从未提交

前端实现

// 仅需一个计算属性即可判断
const hasTriedButNotPassed = computed(() => {
  return problem.value?.my_status !== undefined &&
         problem.value?.my_status !== null &&
         problem.value?.my_status !== 0
})

优势对比

方案 API请求 代码复杂度 性能
使用 submission_exists +1 高(需异步+状态管理) 慢(额外网络请求)
使用 my_status 0 3行计算属性 快(本地计算)

经验教训

  • 实现新功能前应充分了解后端现有数据结构
  • 避免创建冗余接口,优先利用现有数据
  • 简单的解决方案往往是最好的

3.2 内部系统接口

POST /api/judge_server_heartbeat/ - 此接口无需前端实现

接口说明

  • 用途: 判题服务器JudgeServer向后端报告健康状态
  • 调用方: JudgeServer Docker 容器(非前端)
  • 调用频率: 每隔几秒自动调用一次
  • 认证方式: 使用 judge_server_token(特殊令牌,非用户认证)

报告的数据

{
  "hostname": "judge-server-1",
  "judger_version": "2.0.4",
  "cpu_core": 4,
  "cpu": 45.2,           # CPU使用率
  "memory": 60.5,        # 内存使用率
  "service_url": "http://judger:8080"
}

后端使用场景

  • 监控判题服务器在线状态
  • 显示服务器资源使用情况(仅在管理后台显示)
  • 负载均衡分配判题任务

前端已有接口 前端查看判题服务器状态使用的是:

  • GET /api/admin/judge_server - 获取所有判题服务器列表及状态

结论 此接口是系统内部通信接口,前端完全不需要调用。类似的内部接口还可能存在于分布式系统的其他服务间通信中。


六、新增功能模块

FlowchartEditor 流程图编辑器

功能概述: 基于 Vue Flow 构建的完整流程图编辑器,支持拖拽创建、节点连接、编辑等核心功能。

技术实现:

  • 核心库: Vue Flow (@vue-flow/core)
  • 组件架构: 模块化设计9个独立功能模块
  • 状态管理: 基于 Vue 3 Composition API
  • 数据持久化: localStorage 自动缓存
  • 交互体验: 拖拽、键盘快捷键、撤销重做

组件结构:

FlowchartEditor/
├── index.vue              # 主组件 - 整合所有功能
├── CustomNode.vue         # 自定义节点 - 7种节点类型
├── Toolbar.vue            # 工具栏 - 节点创建和操作
├── NodeHandles.vue        # 节点操作手柄 - 连接点管理
├── NodeActions.vue        # 节点动作 - 删除、编辑按钮
├── useCache.ts            # 缓存管理 - 自动保存/恢复
├── useDnD.ts              # 拖拽处理 - 节点创建逻辑
├── useFlowOperations.ts   # 流程操作 - 增删改查
├── useHistory.ts          # 历史记录 - 撤销重做
└── useNodeStyles.ts       # 节点样式 - 类型配置

节点类型支持:

  • 开始节点 (start) - 流程开始,绿色主题
  • 输入节点 (input) - 数据输入,蓝色主题
  • 处理节点 (default) - 数据处理,紫色主题
  • 判断节点 (decision) - 条件判断,橙色主题
  • 循环节点 (loop) - 循环处理,青色主题
  • 输出节点 (output) - 数据输出,粉色主题
  • 结束节点 (end) - 流程结束,红色主题

核心功能:

  1. 拖拽创建: 从工具栏拖拽节点到画布
  2. 节点连接: 支持节点间的连线操作
  3. 节点编辑: 双击节点进行文本编辑
  4. 撤销重做: 完整的历史记录管理
  5. 自动保存: 本地缓存,防止数据丢失
  6. 键盘快捷键: Ctrl+Z/Ctrl+Y 撤销重做Delete 删除
  7. 批量操作: 支持多选和批量删除

数据格式:

// 节点数据
interface Node {
  id: string
  type: string
  position: { x: number, y: number }
  data: {
    customLabel: string
    [key: string]: any
  }
}

// 边数据
interface Edge {
  id: string
  source: string
  target: string
  sourceHandle?: string
  targetHandle?: string
  type?: string
}

使用场景:

  • 算法流程图绘制
  • 业务流程设计
  • 教学演示工具
  • 问题分析图表

性能优化:

  • 基于 Vue Flow 的高性能渲染
  • 模块化设计,按需加载
  • 本地缓存减少重复计算
  • 响应式状态管理

扩展性:

  • 支持自定义节点类型
  • 可扩展工具栏功能
  • 支持主题定制
  • 支持数据导入导出

文档支持:

  • 详细的使用文档: docs/FlowchartEditor.md
  • 完整的 API 说明
  • 最佳实践指南
  • 故障排除手册