跳转至

Step6:前端交互

本模块不要求掌握 JavaScript、HTML、CSS 等前端技术,要求使用 Python 的 streamlit 库实现前端页面,并通过 REST API 与 FastAPI 后端交互。

什么是 Streamlit?

Streamlit 是一个使用 Python 快速开发 Web 应用的开源框架。它提供表单、按钮、输入框、文件上传等常用组件,适合用于构建课程项目的交互界面。应用可通过以下命令启动:

streamlit run app.py

本模块要求实现一个与 OJ 后端配套的前端,覆盖用户、题目和评测提交三组页面。前端应调用前述模块实现的 API,不应绕过后端直接读写后端数据。


模块目标

  • 实现 OJ 系统的基本前端页面,为用户管理、题目管理和评测提交提供可操作的图形界面。
  • 完成前端与 FastAPI 后端的接口对接,正确处理身份状态、请求参数、响应数据和异常信息。
  • 保证页面功能与前述模块的 API 行为一致。

前置知识要求

技术点 推荐学习内容
Streamlit 基础 页面布局、表单、按钮、输入组件、session_state
REST API 调用 HTTP 方法、请求参数、JSON 响应、异常处理
Cookie / Session 登录状态保存、身份信息传递
前后端交互 页面状态与后端数据的同步

任务分解

任务 1:用户页面组

实现与用户系统相关的页面。相关页面的内容至少包括:

  • 用户注册;
  • 用户登录和退出;
  • 用户信息展示;
  • 用户管理。

只有登录后用户才能进行题目提交、结果查询等操作,需安全地保存身份信息。前端需要实现登录表单,调用后端登录 API,完成用户身份认证。

  • 实现建议:
  • 可用 session_state 或本地文件存储 token。
  • 登录失败时给出友好提示。

用户管理页面仅应向具备相应权限的管理员提供。页面应根据登录状态和用户角色展示可执行的操作,并正确处理未登录、权限不足、用户被禁用等情况。

任务 2:题目页面组

实现与题目管理相关的页面。相关页面的内容至少包括:

  • 题目列表;
  • 题目详情;
  • 题目新增;
  • 题目编辑;
  • 题目删除。

题目表单应覆盖题目配置所需字段,并在提交前进行必要的格式检查。题目删除等受限操作应遵循后端权限要求。

任务 3:评测与提交页面组

实现与代码提交和评测结果查询相关的页面。相关页面的内容至少包括:

  • 代码提交;
  • 提交记录列表;
  • 提交记录详情;
  • 评测状态;
  • 编译信息、运行结果和错误信息。

用户需要通过网页提交代码,并能实时查看评测状态和结果。前端需实现代码提交表单,调用后端提交 API,并展示评测结果。

  • 实现建议:
  • 使用 streamlit 的文本框、下拉框等组件收集题号、语言、代码内容。
  • 调用后端提交 API,获取 submission_id。
  • 轮询或手动查询 submission_id 的评测状态与结果,并展示。

提交后,页面应能够展示任务当前状态,并在评测完成后展示后端允许当前用户查看的结果。对于编译失败、运行错误、超时等情况,应提供明确的状态和错误提示。

任务 4:前端与后端接口对接

前后端分离架构下,所有数据流转均依赖 API,需保证参数、路径、状态码一致。应确保所有前端操作均通过 REST API 与后端交互,并严格遵循 API 文档中的接口规范。

实现时应注意:

  • 可封装统一的 API 调用函数,集中处理请求、身份信息和异常;
  • 正确保存和传递登录会话,不得在页面代码中硬编码用户身份;
  • 根据 HTTP 状态码和响应中的 code 字段展示成功或失败信息;
  • 页面状态应与后端数据保持一致,不应仅在前端模拟操作结果。

评分细则

功能/接口 分值 评分说明
用户页面组 2 注册、登录/退出、用户信息、角色管理
题目页面组 1 题目列表、详情、新增、编辑、删除
评测与提交页面组 1 代码提交、记录查询、状态及运行信息展示
前端与后端接口对接 1 API 调用、会话传递、响应与异常处理
小计 5
作者:eternallyproud (66.97%), jz (33.03%)