APP下载

基于B/S架构的竞赛管理系统设计

2019-05-22赵美勇杨永琪宋思睿

电脑知识与技术 2019年10期
关键词: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.

【通联编辑:谢媛媛】

猜你喜欢

S架构
C/S架构下的中职教学辅助系统的新探索