标题 | 基于B/S架构的竞赛管理系统设计 |
范文 | 赵美勇 杨永琪 宋思睿 摘要:利用B/S构架设计系统,省去了客户端的设计,扩大了应用范围,除了计算机以外的其他终端都可以访问。使用Python进行Web开发,使用其中的Flask框架来进行轻量级的Web应用开发,数据库方面则选的其内部的Flask-SQLAlchemy来进行管理SQLite(Unix),简化了整个SQLAlchemy操作。使整个系统轻便高效。 关键词:B/S架构;Flask框架;Python;Web开发 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2019)10-0086-03 开放科学(资源服务)标识码(OSID): 1 系统开发平台 1.1 开发平台简介 本竞赛管理系统采用B/S架构,使用Python进行Web开发。渲染界面采用Jinja2模板引擎,同时使用Flask-Bootstrap集成TwitterBootstrap。 利用Flask-Login管理已登录用户的用户会话,使用Werkzeug计算密码散列值并进行核对,通过itsdangerous生成并核对加密安全令牌。 选择使用的数据库框架Flask-SQLAlchem管理数据库,数据库引擎选用SQLite。 1.2 开发语言 Python-Flask 使用Python Web开发Flask框架,Flask被设计为可拓展的框架,具有一个包含基本服务的强健核心,其他功能通过拓展实现。 1.3 开发工具 Pycharm 1.4 操作系统 Ubuntu16.04 1.5 数据库 使用Flask-SQLAlchemy管理SQLite(Unix) Flask-SQLAlchemy数据库极大地简化了之前老版本数据的操作,它在存储、查询方面表现出色,消耗时间少。所以利用它来管理SQLite更为方便,同时响应速度更快。 2 数据库规划 2.1 任务陈述 竞赛实验室刚成立,为了更加公正地评估大家平时学习情况,制定了一系列的积分制度,积分与日常的比赛、讨论班、考勤等挂钩。由于积分关联项过多、比赛种类不一、实验室人员增加,与之相关的信息量急剧增多。管理人员通过 Excel 手动维护信息力不从心,需要实验室管理系统提高效率。为了提高大家学习效率,对已做题目信息、比赛数据统计变得尤为重要,如题目类型、题目来源、题目难度等。本实验室管理系统包括人员管理、队伍管理、比赛信息管理、积分管理、题目管理、讨论班管理六大模块,对于不同的用户给予不同的权限。 2.2 需求分析 1) 用户需求说明 ① 数据需求: 实验室人员信息记录:学号、姓名、学院、联系方式、OJ 账号、积分; 队伍信息记录: 队伍人员组成,队伍积分、队伍参与比赛信息; 积分信息记录: 个人积分与队伍积分; 比赛信息记录: 比赛日期、比赛地点、比赛类型、各参赛队伍成绩; 题目信息记录: 题目类型、题目难度、来源; 讨论班信息记录: 主讲人,相关课件。 ② 数据录入: 实验室人员信息录入:学号、姓名、学院、联系方式、 OJ 账号、头像、Email; 新建隊伍信息录入:队名、队员组成、头像、账号; 比赛信息录入:比赛日期、比赛地点、比赛类型、比赛形式、相关队伍、相关问题; 题目信息录入:来源、编号; 讨论版录入:主讲人信息、时间、年级、信息、相关文件上传; 初始积分录入; 用户之间的相互关注、用户发表公告。 ② 数据更新和删除: 实验室人员信息更改; 队伍信息修改; 比赛信息修改; 题目信息修改、删除; 个人、队伍积分更新; 用户之间取消关注、修改公告信息。 ③ 数据查看 按照 id 或姓名或积分升序列出用户部分信息 (姓名、 Email、最后访问时间、分数) 根据用户姓名展示用户详细信息 (头像、发表过的公告、关注者人数) 按照 id 或姓名或积分升序列出队伍部分信息 (队名、成员组成、账号、分数) 根据队伍姓名展示队伍详细信息 (头像、参加过的比赛、最高奖项) 按照 id 升序列出讨论班部分信息 (时间、主讲人、年级、内容) 根据关键字检索讨论班信息、比赛信息 对特定讨论班相关文件进行下载 根据比赛名称展示比赛详细信息 (头像、包括题目列表等) 展示最近时间实验室人员参加的比赛 2) 系统需求说明 ① 安全性: 数据库必须有口令保护 数据库中不能明文存储密码 用户注册账号需要邮箱认证 用户之间给予不同的权限 ② 备份和恢复: 每天数据备份一份 ③ 法律问题 对用户数据的处理遵守法律 2.3 数据库逻辑设计 实体的设置 设置User、Team、Contest、Problem、Seminar、Account、Post实体集,具体描述见图。 2.4 表示联系 每个队伍至多包含三名队员,每个队伍和队员对应一个账号,通过账号参加比赛,每个比赛包括一些问题,用户之间可以互相关注,用户定期会举行讨论班,发布重要公告。 2.5 实体集属性 1) User Email、Score、Account、Phone、Name、AboutMe分别代表实验室人员Email、个人积分、账号ID、电话、姓名、自我介绍,Email为认证邮箱,作为主键,Account为外键。 2) Team ID、S1、S2、S3、Name、Score、AboutMe分别代表队伍ID、队员一用户主键、队员二用户主键、队员三用户主键、队伍名称、队伍分数、队伍自我介绍。 3) Problem ID、Source、Index分别代表问题ID、来源、编号,如来源为‘HDU、编号为‘1001。其中ID为主键。 4) Contest 其中Name代表竞赛名称;Participants代表参赛人(队伍)数;CompetitionLevel代表竞赛级别,如‘省赛,‘区域赛,‘世界总决赛等;Format代表竞赛赛制,比如‘ACM-ICPC,‘OI等。Time、Place、ID分别代表竞赛时间、地点、ID,其中ID为主键。 5) Seminar Speakerid代表主讲人ID,Time代表时间,Grade代表年级,About代表讨论班内容简介。 6) 关系类型 既包括一对一关系,又包括多对一关系,多对多关系。对于账号参加比赛来说,我们不仅需要存储账号 id、比赛 id,还需要存储参加比赛的排名、奖牌。这样才可以更好地维护 Score 属性,对于 SQLAlchemy,我们可以通过将多对多关系的左右两侧拆成两个基本的一对多关系,在关联表中记录额外信息即可。 3 遇到的问题 3.1 权限设置 由于本系统模块数较多,根据不同权限使用不同视图变得极其繁琐,因此使用位标志法,使用一个整数,表示位标志。各个操作都对应一个位位置,能执行某项操作的用户,该位会设置成 1. 比如 ‘1010, 代表第一位和第三位对应的操作有权限进行,第二位和第四位对应的操作无权限执行 4 邮箱认证 使用 Flask?Mail发邮件的时候需要设置电子邮件服务器的端口,这个不同邮箱是不一样的, 并且程序中使用的密码并不是邮箱密码,而是我们在设置 SMTP 时分配的密码。 5 文件操作 对于队伍和比赛,有的时候需要设置头像,头像的存储可以使用 LargeBinary, 渲染时直接使用 base64:b64encode 即可,但是对于大文件 (比如讨论班上传的文件),不能存储到数据库中,否则会大大降低数据库的性能,因此可以在数据库中存储文件路径,等到客户端下载时可以直接在服务端磁盘上找到。 6 优化 对于多对多关系,如果一端连接的数量是个不大的数量,可以考虑通过在一侧多加一些属性来表示。 比如此数据库中 User 与 Team,考虑到已经解散的队伍的存在, User 和 Team 严格来说是多对多关系,但一个队伍最多三名队员,因此直接在队伍实体集上添加了三个属性,分别表示三个 user 的主键就好。 7 数据同步 账号和 User 是一对一的关系,如果我们将账号名作为账号的主键,在我们修改账号名后,不仅需要维护 Account 实体集元素,也要修改 User 对应账号主键。 8 结论 对于开发者来说,设计一个系统是一个庞大的项目。从各种文档的阅读到实际项目中需求分析、概念结构设计、逻辑系统设计、物理系统设计的一系列过程,亲身体验了开发系统的过程. 很多东西在文档中看着挺简单,思路也很清晰,但是在实际使用的会有意想不到的问题,这时才会发现其中的难度. 从最初对于Web界面烦琐的埋怨,到最后惊叹于Flask的精简。 整个系统的设计,最重要的一个部分就是数据库的设计。利用Flask框架对于页面的设计不难,如何设计好最优的数据库是整个系统的关键。 编码固然不易,但是一个项目最重要的不在于如何实现,而是实现之前的需求分析和模块设计。 参考文献: [1] 丁旭.基于B/S架构的软件项目实训:JSP[M].北京:清华大学出版社,2011. [2] 刘长龙.Python高效开发实战:Django、Tornado、Flask、Twisted[M].北京:电子工业出版社,2016. [3] 李辉.Flask Web开发实战:入门、进阶与原理解析[M].北京:机械工业出版社,2018. [4] 明日科技. Java Web从入门到精通[M].2版.北京:清華大学出版社,2017. 【通联编辑:谢媛媛】 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。