1. 项目的完整设计方案
1.1 系统总体架构
本项目的设计,放弃了C/S系统,而是采用B/S系统,即浏览器/服务器系统。之所以采用B/S的体系结构,主要考虑到系统的方便性,用户无需安装客户端即可使用该系统,这样给本系统的用户减少了很多不必要的麻烦,而且方便对系统进行更新维护。使用的框架主要是Mybatis+Spring+SpringMVC框架,即当今较为流行的SSM框架,SSM框架基于MVC模型。MVC模型的结构包括Model模型层,View视图层,Controller控制层。在线答题平台的架构主要分为6个层次,包括前端UI、展示层、业务层、数据层、数据库和运行环境,如下图为系统的系统架构图:
1.2 运行环境和技术选型说明
本系统搭建时选用时选用Java作为开发语言,采用SSM框架,前端我们暂定html+css+JavaScript开发,后续使用什么框架待定。同时,本项目的一个重难点是分布式独立靶机的搭建,因为CTF中的web方向与PWN方向的答题环节需要搭建在在线环境中,每个用户要去答题,则需要生成一个独立的在线环境,各用户之间的操作不会影响到别人的在线环境,用户最终要从在线环境中抽丝剥茧找到最终的答案即flag,这就需要到了分布式独立靶机,
比传统虚拟机更加轻便,传统虚拟机启动耗时为分钟级别,而Docker容器启动仅为秒级别,这极大的提高了用户体验。且每个容器相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,能够给不同的用户提供不同的环境,使得相互之间的操作互不干扰。Docker实现了“一次构建、随处运行”,因此我们可以将用户所需的靶机环境封装进入一个镜像,当发出靶机构建请求时,便会构建该镜像的实例即容器,进而成功搭建靶机环境。
综上,本项目各项技术与工具选择如下:
- Java采用Jdk1.8版本
- 开发工具选择IntelliJ IDEA 2020.3 x64
- 数据库选择使用mysql5.7版本
- 服务器暂选用阿里云服务器,2G内存 1核 硬盘40G 的轻量应用服务器,公网IP为106.15.248.81:8000
- 服务器搭载镜像版本为Ubuntu 20.04
- 采用Docker技术搭建分布式动态独立靶机
因为本系统采用B/S系统,因此用户通过web浏览器便可使用我们的系统。
1.3 用户接口API
本系统采用B/S架构,系统提供给普通用户的接口WEB API如下图所示:
系统提供给管理员的接口WEB API如下图所示:
2. 概念原型的不同视图
2.1 依赖视图
本系统采用MVC框架,下图展现了软件模块之间的依赖关系与MVC模型的逻辑流。
2.2 执行视图(流程图展示)
2.2.1 用户登录注册流程图
2.2.2 用户答题流程图(左)与积分兑换流程图(右)
2.2.3 加入战队流程图(左)与组队比赛流程图(右)
2.3 部署视图
- 项目部署于阿里云服务器上,用户可通过web浏览器(google,firefox等)访问本项目的公网IP:106.15.248.81:8000。在阿里云服务器80端口上部署apache2服务。
- 在阿里云服务器8000端口上进行Docker环境的搭建,用户可通过向8000端口发出靶机搭建请求,Docker会自动搭建独立式分布靶机环境。
- 同时服务器与本地数据库进行连接,将网站与用户相关数据存入本地数据库。
2.4 工作分配视图
3. 项目的数据库设计
3.1.数据库的概念数据模型(E-R图)
3.2.数据库的物理数据模型(仅给出关键数据库设计)
用户信息(user)表
属性名 | 类型 | 是否可为空 | 描述 |
user_id | integer | N | 用户编号 |
username | varchar | N | 用户名 |
nickname | varchar | N | 昵称 |
password | varchar | N | 密码 |
sex | varchar | Y | 性别 |
varchar | Y | 邮箱 | |
telephone | varchar | Y | 手机号 |
school | varchar | Y | 学校 |
introduction | varchar | Y | 个人简介 |
user_points | integer | N | 用户积分 |
solved_problems | integer | N | 解题数 |
user_images | varchar | N | 用户头像 |
team_id | integer | Y | 队伍编号 |
题目(problem)表
属性名 | 类型 | 是否可为空 | 描述 |
problem_id | integer | N | 题目编号 |
problem_titile | varchar | N | 题目标题 |
difficulty | integer | N | 难度系数 |
problem_description | varchar | N | 题目描述 |
problem_scene | varchar | Y | 题目场景 |
problem_appendix | varchar | Y | 题目附件 |
problem_answer | varchar | N | 题目答案 |
problem_points | varchar | N | 题目积分 |
problem_type_id | integer | N | 题目类型编号 |
problem_area | varchar | N | 题目区域类型 |
用户答案(user_answer)表
属性名 | 类型 | 是否可为空 | 描述 |
answer_id | integer | N | 用户答案编号 |
user_id | integer | N | 用户编号 |
problem_id | integer | N | 题目编号 |
answer_content | varchar | N | 答案内容 |
answer_time | time | N | 解题时间 |
竞赛(contest)表
属性名 | 类型 | 是否可为空 | 描述 |
contest_id | integer | N | 竞赛编号 |
contest_title | varchar | N | 竞赛主题 |
sponsor | varvhar | N | 主办方 |
start_time | time | N | 竞赛开始时间 |
end_time | time | N | 竞赛结束时间 |
contest_introduction | varchar | Y | 竞赛介绍 |
team_nums | integer | N | 参赛队伍数 |
队伍(team)表
属性名 | 类型 | 是否可为空 | 描述 |
team_id | integer | N | 队伍编号 |
team_name | varchar | N | 战队名称 |
leader_id | integer | N | 队长id |
team_nums | integer | N | 战队人数 |
team_points | integer | N | 战队积分 |
team_create_time | time | N | 战队创建时间 |
商城商品(goods)表
属性名 | 类型 | 是否可为空 | 描述 |
goods_id | integer | N | 商品编号 |
goods_name | varchar | N | 商品名 |
goods_points | integer | N | 商品所需积分 |
goods_stock | integer | N | 商品库存 |
goods_offer | varchar | N | 商品提供方 |
题解(explanation)表
属性名 | 类型 | 是否可为空 | 描述 |
explanation_id | integer | N | 题解编号 |
explanation_content | varchar | N | 题解内容 |
problems_id | integer | N | 题目编号 |
user_id | integer | N | 发布者编号 |
explanation_time | varchar | N | 发布时间 |
4.项目的实现视图
项目源代码的目录文件结构如下图所示:
项目名称为ctfplatform,main目录向下细分为如下几个目录:
java.cn.ctf(存放后端代码)
- controller:存放控制层代码,控制器与前端进行交互,进行请求参数的响应与处理。
- dao:存放持久层代码,与数据库进行交互。
- domain:存放实体类的代码。
- service:用于处理业务逻辑。
- test:测试代码。
- utils:存放一些工具类与算法类的实现代码。
webapp(存放前端代码)
- css:存放css样式文件。
- images:存放需要的image等图片文件。
- js:存放JavaScript代码。
- pages:存放页面html文件。
- web.xml:进行前端与后端的交互。
resources(存放配置文件)
External Libraries目录:存放依赖包。
5. 系统概念原型的核心工作机制
普通用户:
- 普通用户可以注册账号,注册成功后进行登录
- 用户可以查看题库的题目,根据兴趣选择某个题目进行答题,输入最终的结果查看正确与否。
- 用户可以进一步的查看该题目的相关题解或者在题目下方评论区发表自己的意见。若用户有更好的题解,用户可以发布自己的题解。
- 若用户欣赏某个题目或者题解,可以进行收藏与点赞。
- 用户回答对了题目可以获得题目对应的积分,用户可以去商城中利用积分兑换商品。
- 用户可以查看自己的收藏列表,查看自己收藏的题目。
- 用户还有自己的个人中心,其中可以查看答题记录,已答的题目数目,个人积分等。
- 用户也可以上传题目,管理员审核通过后,便可以上线题目。
- 另外本平台提供Rank榜单,根据答题数目与积分进行排序,用户可以查看排行榜。
管理员:
- 管理员用户主要对一些东西进行审核,管理员可以进行题目的管理,进行增删改查。
- 对题解进行管理,发布正确的题解。
- 审核评论区,删除不正当发言。
- 管理员也可以发布公告,告知一些重要的事情。
- 商品若有更新,管理员也可以对商城进行更新。
- 管理员也可查看注册用户信息。