Skip to content

tootal/Totoj

Repository files navigation

Python期末个人项目

1. 实验目的

考察利用Python进行项目开发的能力。

2. 实验要求

任选一个项目进行完成; 编写项目开发报告。

3. 实验内容

项目说明

本项目目标是实现一个简易的在线评测系统,支持用户注册、登录、查看用户信息、查看题目、提交代码、评测代码、查询评测结果等功能。使用Python搭建服务器后台,并编写简单的前端页面进行测试。

设计说明

整体架构设计

本项目采用函数组织程序架构,所有函数说明见下表:

函数名 函数功能
md5 计算字符串md5值,用于密码存储
init_db 初始化数据库,创建user表和status表
post_user 实现注册功能,创建新用户,写入数据库
login 实现登录功能,检验用户密码是否正确
get_user 获取用户信息
get_status 获取评测状态
post_status 实现提交代码功能,保存代码,等待评测
judge 评测程序
compile 编译程序,生成可执行文件
update_state 更新评测状态
judge_run 运行程序,判断结果是否正确
main 主函数,启动服务
数据存储模块设计

根据项目说明,本项目目的在于实现简易的评测系统,且数据量不大,因此存储数据选用了相对较简单的sqlite。SQLite3可使用sqlite3模块与Python进行集成,而且不需要单独安装该模块,Python默认自带了该模块,使用起来非常方便。

user表结构:

列名 类型 说明
id 整数 用户序号
username 字符串 用户名
password 字符串 密码
register_time 整数 注册时间
last_login_time 整数 上次登录时间
last_login_ip 字符串 上次登录IP

password存储使用md5加密后的用户密码。

stauts表结构:

列名 类型 说明
id 整数 评测记录序号
user 整数 提交评测用户序号
problem 整数 评测对应题目序号
time 整数 评测提交时间
lang 字符串 程序语言
code 字符串 源代码
status 字符串 评测结果

其中id为从1开始自增,时间均用Unicode时间戳精确到秒。

评测结果status的可能值如下:

status可能值 描述
accept 成功运行,答案正确,通过评测
wrong_answer 程序成功运行,但答案错误
runtime_error 程序运行时错误
wait 程序已保存,正在等待评测
web后台框架设计

Python作为脚本语言,有着简洁,快速,框架多的特点,本项目选用了较为出名的flask框架开发,结合flask_cors模块实现跨域,完美实现前后端分离,使得Python专注于后台逻辑代码编写,而不用考虑前端展示。对于前后端数据交互,使用flask的路由转发,提供不同的URL供前端调用。所有API接口设计如下:

URL method 说明 提交数据描述 返回数据描述
/api/user POST 添加用户 JSON格式,包含username、password 字符串格式,用户名重复返回dup,成功返回ok,错误返回error
/api/login POST 登录检测 JSON格式,包含username、password 字符串格式,成功返回ok,错误返回error
/api/user GET 获取所有用户 JSON格式列表,包含所有用户id,username,register_time
/api/status GET 获取评测记录 可选参数:id JSON格式列表,包含所有评测记录id,time,lang,status,按id倒序排列, 若指定id,返回指定id的记录且包含code
/api/status POST 添加评测记录 JSON格式,包含user,problem,lang,code 字符串格式,成功返回ok,错误返回error
评测模块设计

评测流程图如下:

各种语言对应的文件名、编译命令、运行命令参见下面Python代码。

save_file_name = {
    'Python': 'test.py',
    'Java': 'Main.java',
    'C': 'main.c',
    'C++': 'main.cpp'
}

compile_cmd = {
    'Python': '',
    'Java': 'javac -encoding UTF-8 -sourcepath . -d . Main.java',
    'C': 'gcc -O2 -std=gnu11 main.c -o main.exe',
    'C++': 'g++ -O2 -std=gnu++14 main.cpp -o main.exe'
}

run_cmd = {
    'Python': 'python test.py',
    'Java': 'java Main',
    'C': os.path.join('.', 'main.exe'),
    'C++': os.path.join('.', 'main.exe')
}

程序需要调用外部程序进行编译、运行操作,采用Python内置的subprocess模块,利用subprocess.Popen运行外部程序,subprocess.PIPE管道获取输出结果和错误输出。

前端展示模块

为测试该后台框架的可行性与实用性,编写了一个简易的HTML文档来调用该Python接口,实现可视化界面展示。该网页以及后台已经部署到服务器,浏览器访问http://tootal.xyz即可查看。为使展示模块简洁,仅对登录模块和评测模块分别进行测试,没有记录提交评测的用户名,以及保存用户登录状态。

部分展示模块截图: 注册界面: 评测记录界面:

源代码

所有代码保存在main.py中,HTML文档保存在index.html中。

4. 参考资料

《Python编程-从入门到实践》

《Python语言程序设计基础(第2版)》

网络资源