TopQB答题系统
2020/01/05
@pingfan
功能:
1、多人同时答题系统
2、在线查看个人得分与答题情况(解析)
3、载入题库,随机抽取题目支持【单选题,多选题,判断题】
4、自定义题目数量与题目分值,题目都是随机但数量不变总分不变
5、在线实时查看总体得分情况,可导出excel
6、适应场景: 各类考试答题等
7、提示:
1、不需要外网,任意内网(局域网)机器运行均可,也可单机运行使用
2、无毒,请添加信任
3、系统要求: 64位win7、win10(当然linux是最好的)
使用说明:
1、题库模板位于【static】->【qb.xlsx】题目索引值不可重复
2、运行app.exe
3、查看本机ip地址
4、访问:
1、答题地址:
http://【本机ip】:9999
如:http://192.168.1.2:9999
2、设置地址:
http://【本机ip】:9999/config
3、得分地址:
http://【本机ip】:9999/results
4、管理地址:
http://【本机ip】:9999/admin
5、答题前请设置题目数量,题目得分
6、实时查看总体得分情况刷新成绩页面即可
==========================================================================================
管理页面
设置页面
成绩汇总页面
答题页面
解析页面
==========================================================================================
小小flask项目,就几个路由系统,没使用蓝图。
完整目录结构
不使用数据库,轻应用读取excel中的题目缓存到内存中
需要一个excel.xlsx(2007以上的题库模板)放置到目录的static文件夹中命名为【qb.xlsx】(读取的是第一个工作表)
==========================================================================================
只依赖flask,提升并发的(协程)gevent库,以及pfExcel(基于openpyxl的封装)用于读取excel中的数据(前面的博客有提到)
前端没有使用任何框架,js都是原生
以下是依赖库的安装
# 安装flask
pip install flask
# 安装gevent
pip install gevent
# 安装openpyxl
pip install openpyxl
部署就是一个(pyinstaller库编译app.py)exe执行文件
# 安装pyinstaller
pip install pyinstaller
# 编译app.py
pyinstaller -F -i 你的logo文件.ico app.py
以下是pyExcel.py源码
"""
基于openpyxl的excel读写模块
提供更简单的读写方式
"""
from openpyxl import load_workbook, Workbook
class ExcelWork:
def __init__(self, filePath):
"""
初始化, 加载excel,默认选择第一个工作表
:param filePath: str: 文件地址
"""
self.filePath = filePath
try:
# 加载excel
self.excel = load_workbook(self.filePath)
except FileNotFoundError:
# 创建excel
self.excel = Workbook(self.filePath)
# 创建sheet
self.createSheet('Sheet1')
# 保存excel
self.close()
# 加载excel
self.excel = load_workbook(self.filePath)
# sheet设置为第一个工作表
self.sheet = self.excel.active
def close(self):
"""
保存并退出
:return:
"""
self.excel.save(self.filePath)
def createSheet(self, sheetName):
"""
创建工作表
:param sheetName: str: 工作表名
:return:
"""
self.excel.create_sheet(sheetName)
def getSheetTitle(self):
"""
获取当前工作表名称
:return: str: 工作表名称
"""
return self.sheet.title
def getSheetTitles(self):
"""
获取excel所有工作表的名称
:return: list: [工作表名称,]
"""
return self.excel.sheetnames
def delSheet(self):
"""
删除当前工作表
:return:
"""
self.excel.remove(self.sheet)
def selectSheet(self, sheetName):
"""
选择工作表, 如果没有将创建
:param sheetName: str: 工作表名
:return:
"""
if sheetName in self.getSheetTitles():
# 选择工作表
self.sheet = self.excel[sheetName]
else:
# 创建工作表
self.createSheet(sheetName)
# 选择工作表
self.sheet = self.excel[sheetName]
def setCell(self, r, c, var):
"""
修改指定行, 列的单元格内容
:param r: int: 行数
:param c: int: 列数
:param var: str: 修改内容
:return:
"""
self.sheet.cell(row=r, column=c, value=var)
def getCell(self, r, c):
"""
获取指定行, 列的单元格内容
:param r: int: 行数
:param c: int: 列数
:return: str: 单元格内容
"""
return self.sheet.cell(row=r, column=c)