在线 OJ 项目(四) · 前端设计与项目总结

news2024/9/24 11:30:36

  • 一、页面设计
    • 题目列表页
    • 题目详情页
  • 二、获取到后台数据
    • 实现思路
    • 遇到换行问题
    • 小结
    • 引入 ace.js
  • 三、项目总结

接下来将实现 online-oj 项目的前端界面。

先随便从各大网站上下载网页模板~
因为好看的前端网页设计需要美工的,我们只是程序员…

一、页面设计

但是我们可以自己思考一下,一共需要几个页面,每个页面都是干什么的,大概什么样子。

题目列表页

功能:展示出当前都有哪些项目。点击某个题目就可以跳转到题目的详情页。

题目详情页

功能:展示题目的具体信息~

接下来我们引入下载好的网页模板代码,调整出自己需要的页面。

当前是通过写死页面的方式,来显示题目的。
真实情况是需要让页面通过 Ajax 的方式从服务器来获取数据。

JS 中原生的 Ajax 是基于 XMLHttpRequest 类来实现的,用起来比较麻烦。我们使用第三方库提供的封装版本 jQuery 提供的 Ajax 函数即可。

JS 中安装第三方库非常简单,一行代码引入即可。


二、获取到后台数据

通过 makeProblemTable 函数把后台数据转换成 HTML 页面片段。

// 通过这个函数来把数据转换成 HTML 页面片段
function makeProblemTable(data) {
    // 获取到前台列表中的元素
    let problemTable = document.querySelector("#problemTable");
    //
    for (let problem of data) {
        let tr = document.createElement("tr");

        // id
        let tdId = document.createElement("td");
        tdId.innerHTML = problem.id;
        tr.appendChild(tdId);

        // 题目
        let tdTitle = document.createElement("td");
        let a = document.createElement("a");
        a.innerHTML = problem.title;
        // 跳转到 problemDetail.html 页面
        a.href = 'problemDetail.html?id=' + problem.id;
        // 跳转到新页面
        a.target = '_blank';
        tdTitle.appendChild(a);
        tr.appendChild(tdTitle);

        // 难度
        let tdLevel = document.createElement("td");
        tdLevel.innerHTML = problem.level;
        tr.appendChild(tdLevel);

        problemTable.appendChild(tr);
    }
}

验证题目列表页,测试网页成功显示

点击题目标题,我们将跳转到题目详情页。
这时候需要再加一个页面 problemDetail.html

实现思路

在题目列表页的 a 标签里填地址,problemDetail.html 的路径,同时把题目 id 通过 query string 传递过去。

完成题目详情页的代码

        <!--components-->
        <section class="my-5 pt-5">
            <div class="container">

                <!-- 题目详情  -->
                <div class="jumbotron jumbotron-fluid">
                    <div class="container" id="problemDesc">
<!--                        <h1>Container fluid size jumbotron</h1>-->
<!--                        <p>Think BIG with a Bootstrap Jumbotron!</p>-->
                    </div>
                </div>

                <!-- 代码编辑框  -->
                <div class="form-group">
                    <label for="codeEditor">代码编辑框</label>
                    <div id="editor" style="min-height:400px">
                        <textarea class="form-control" id="codeEditor" style="width: 100%; height: 400px;"></textarea>
                    </div>
                </div>

                <!-- 提交按钮  -->
                <div>
                    <button type="button" class="btn btn-primary" id="submitButton"> 提 交 </button>
                </div>

                <label></label>

                <!-- 提交的结果  -->
                <div class="jumbotron jumbotron-fluid">
                    <div class="container">
                        <pre id="problemResult">

                        </pre>

<!--                        <h1>Container fluid size jumbotron</h1>-->
<!--                        <p>Think BIG with a Bootstrap Jumbotron!</p>-->
                    </div>
                </div>
            </div>
        </section>

修改 index.html 的跳转页面

// 跳转到 problemDetail.html 页面
                    a.href = 'problemDetail.html?id=' + problem.id;
                    // 跳转到新页面
                    a.target = '_blank';

遇到换行问题

从服务器获取的题目详情没有换行,HTML 不识别 \n。

有两种解决方法:
① 把返回的数据中的 \n 都替换成 <br>
② 给页面的标签里面套一层 <pre> 标签,让其能够识别 \n

我们选择了第二种.

// 语法就像开好一个容器,把东西放进去,最后把容器封起来。
function makeProblemDetail(problem) {
    // 1. 获取到 problemDesc,把题目详情填写进去
    // # 号表示定位到前端 id 为 problemDesc 的 div 中,准备往里面添加数据
    let problemDesc = document.querySelector("#problemDesc");
    // 题目的标题
    let h3 = document.createElement("h3");
    h3.innerHTML = problem.id + "." + problem.title + "_" + problem.level;
    problemDesc.appendChild(h3);
    // 题目的详情,pre 能识别从 Java 中的 \n 换行
    let pre = document.createElement("pre");
    let p = document.createElement("p");
    p.innerHTML = problem.description;
    pre.appendChild(p);
    problemDesc.appendChild(pre);
}
getProblem();

小结

通过 Ajax 的方式获取到后端数据;
再把数据填充到前端页面里面,根据不同数据填充不同的模块;
给提交按钮注册回调函数;
在回调函数里面,根据得到的响应决定如何显示编辑运行结果。

引入 ace.js

这是一个前端版本的代码编辑器,让代码编辑框更加好看。

直接引入对应的地址即可安装。

    <!-- 引入 ace.js -->
        <script src="https://cdn.bootcdn.net/ajax/libs/ace/1.2.9/ace.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/ace/1.2.9/ext-language_tools.js"></script>
        <script>

三、项目总结

  1. 了解要做的项目的基本要求
    1)题目列表页
    2)题目详情页
    3)代码编辑框
    4)提交给服务器编译运行
    5)展示结果

  2. 介绍了多进程编程,基于多进程编程。封装了一个 CommandUtil 类,就可以创建进程执行一个具体的任务,同时把输出结果记录到指定的文件中。

  3. 创建了一个 Task 类,调用 CommandUtil 封装了一个完整的 编译-运行 过程。后面又给 Task 类扩充了一个基于黑名单的安全代码校验。

  4. 设计了数据库,封装了数据库操作。Problem 和 ProblemDAO。

  5. 设计了前后端交互的接口。
    1)获取题目列表
    2)获取题目详情
    3)编译运行

  6. 基于 Servlet 实现了这几个接口。

  7. 引入前端网页代码模板,基于代码模板进行修改,创建出了两个页面
    1)题目列表页 index.html
    2)题目详情页 problemDetail.html

  8. 通过 js 代码,实现了前端调用 HTTP API 的过程。

  9. 引入 ace.js 让代码编辑框变得更加好用。


ps.后续可能完成的功能

1. 部署到云服务器上。
2. 实现题目管理页面:录入题目,删除题目。
3. 实现用户注册登录页面。
4. 实现提交记录保存功能。
5. 实现通过率的统计。
6. 实现点赞收藏题目功能。
......

最后附上项目的源码~ 在线OJ项目.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【可解释性机器学习】详解Python的可解释机器学习库:SHAP

详解Python的可解释机器学习库&#xff1a;SHAPSHAP介绍SHAP的用途SHAP的工作原理解释器Explainer局部可解释性Local Interper单个prediction的解释多个预测的解释获取单个样本的Top N个特征值及其对应的SHAP值全局可解释性Global Interpersummary_plotFeature ImportanceInter…

SkyWalking 极简入门

SkyWalking 极简入门1.概述1.1 概念1.2 功能列表1.3 整体架构1.4 官方文档2. 搭建 SkyWalking 单机环境2.1 Elasticsearch 搭建2.2 下载 SkyWalking 软件包2.3 SkyWalking OAP 搭建2.4 SkyWalking UI 搭建2.5 SkyWalking Agent2.5.1 Shell2.5.2 IDEA3. 搭建 SkyWalking 集群环境…

【4】Linux实用操作

学习笔记目录 初识Linux--入门Linux基础命令--会用Linux权限管控--懂权限Linux实用操作--熟练实战软件部署--深入掌握脚本&自动化--用的更强项目实战--学到经验云平台技术--紧跟潮流 各类小技巧&#xff08;快捷键&#xff09; ctrl c强制停止 Linux某些程序的运行&am…

AI作画:文心一格赋能艺术与设计创作

针对视觉内容创作门槛高、耗时长等行业痛点问题&#xff0c;百度推出了基于文心大模型的AI艺术创作产品文心一格。通过文心一格核心系统的技术创新&#xff0c;让AI作画普惠大众&#xff0c;提升创作效率。目前&#xff0c;文心一格产品已经对外发布使用&#xff0c;大众用户均…

Docker容器基本操作

docker中的容器就是一个轻量级的虚拟机&#xff0c;是镜像运行起来的一个状态&#xff0c;本文就先来看看容器的基本操作。 查看容器 查看容器 启动docker后&#xff0c;使用docker ps命令可以查看当前正在运行的容器&#xff1a; 查看所有容器 上面这条命令是查看当前正在…

[强网杯 2019]高明的黑客

目录 信息收集 正则测试 python脚本 getshell 信息收集 $_GET[ganVMUq3d] ; eval($_GET[ganVMUq3d] ?? ); $_GET[jVMcNhK_F] ; system($_GET[jVMcNhK_F] ?? ); $_GET[cXjHClMPs] ; echo {$_GET[cXjHClMPs]}; 下载gz解压后得到几千个php文件&#xff0c;简单看…

【项目实战】count(1) 、count(col)、count(*) 如何选择?

一、背景 有时候会看业务执行的情况&#xff0c;如查看多少用户已经领取了礼品等&#xff0c;需要看数据库的计数或统计用户使用情况时&#xff0c;往往会使用聚合函数COUNT()&#xff0c;聚合函数有很多种&#xff0c;列出如官网的截图 而其中常用的聚合函数主要是包括以下&…

Linux常用命令——readelf命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) readelf 用于显示elf格式文件的信息 补充说明 readelf命令用来显示一个或者多个elf格式的目标文件的信息&#xff0c;可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持…

java基于ssm滑雪场门票在线售票系统的设计与实现

基于jsp技术设计并实现了滑雪售票系统。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用SSM框架&#xff0c;选择MySQL作为后台数据库。系统主要包括个人中心、用户管理、票务信息管理、购票信息管理、技巧交流、系统管理等功能模块。 性能测试主要通过模拟系统运行环境…

蓝桥杯刷题017——轨道炮(贪心)

2019国赛轨道炮 题目描述 小明在玩一款战争游戏。地图上一共有 N 个敌方单位&#xff0c;可以看作 2D 平面上的点。其中第 i 个单位在 0 时刻的位置是 (Xi​,Yi​)&#xff0c;方向是 Di​ (上下左右之一, 用U/D/L/R 表示)&#xff0c;速度是 Vi​。 小明的武器是轨道炮&#x…

我来告诉你,ChatGPT 该怎么对接到自己的项目中!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 1. 项目介绍 《ChatGPT AI 问答助手》 开源免费项目&#xff0c;涵盖爬虫接口、ChatGPT API对接、DDD架构设计、镜像打包、Dock…

六十年间中国经济总量增长245倍

中国GDP&#xff08;现价美元&#xff09;走势图回顾2022年&#xff0c;中国经济顶住了来自防控疫情及国际变化的巨大压力&#xff0c;全年GDP实现3%的同比增长&#xff0c;其中年末冬季GDP同比增长2.9%。从主要指标显示&#xff0c;12月第三产业、投资、地产都有不同程度的改善…

HTB_Base_php弱类型与find命令提权

至此&#xff0c;startpoint部分就完成了&#xff0c;也初步建立的渗透测试的思路和体系 温故而知新&#xff0c;可以为师矣 文章目录信息收集php弱类型 & strcmp绕过GTFOBins 二进制常用命令find提权信息收集 nmap -sC -A -Pn ip开放端口22、80 dirsearch 扫描目录&…

一文5000字手把手教你使用jenkins搭建一个中小企业前端项目部署环境

本文你能学到什么? 传统发布和现在发布的对比和区别 项目案例-手动上传服务器&#xff0c;使用jenkins上传服务器 配置不同的发布环境 配置域名 配置https 配置钉钉机器人通知【文末有配套资源领取】 服务器购买&#xff1a;抢占式实例 Jenkins 安装 示例服务器为 阿里…

系统移植 tf-a

1、从ST官网下载TF-A源码&#xff0c;将TF-A源码拷贝到ubuntu中并进行解压。 2、进入tf-a源码&#xff0c;阅读README.HOW_TO.txt帮助文档。 3、分析帮助文档。 分析文档可得&#xff0c;移植tf-a到开发板中步骤为&#xff1a;对tf-a源码进行解压&#xff1b;打补丁&#xff…

ElasticSearch从入门到出门【上】

文章目录初识elasticsearch了解ESelasticsearch的作用ELK技术栈elasticsearch和lucene为什么不是其他搜索技术&#xff1f;倒排索引正向索引倒排索引正向和倒排ES的一些概念文档和字段索引和映射mysql与elasticsearch安装elasticsearch部署单点es部署kibana安装IK分词器在线安装…

SpringBoot 使用自定义的方式整合Druid数据源(powernode document)(内含源代码)

SpringBoot 使用自定义的方式整合Druid数据源&#xff08;powernode document&#xff09;&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87404561 目录SpringBoot 使用自定义的方式整合Druid数据源…

SQLSERVER 的 nolock 到底是怎样的无锁?

一&#xff1a;背景 1. 讲故事 相信绝大部分用 SQLSERVER 作为底层存储的程序员都知道 nolock 关键词&#xff0c;即使当时不知道也会在踩过若干阻塞坑之后果断的加上 nolock&#xff0c;但这玩意有什么注意事项呢&#xff1f;这就需要了解它的底层原理了。 二&#xff1a;n…

python之np.sum()用法详解

python库numpy提供的求和方法np.sum()&#xff0c;可以对数组和矩阵进行求和。sum方法可以接收多个参数&#xff0c;主要是数组a,坐标轴axis,数据类型dtype,初始值initial。其中&#xff0c;axis对于我们来说比较容易迷糊&#xff0c;这个值对求和有什么影响&#xff1f;一般来…

Linux常用命令——rcp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rcp 使在两台Linux主机之间的文件复制操作更简单 补充说明 rcp命令使在两台Linux主机之间的文件复制操作更简单。通过适当的配置&#xff0c;在两台Linux主机之间复制文件而无需输入密码&#xff0c;就像本地文…