基于WCF(C#)+SQL SERVER设计与实现的在线评测系统

基于WCF和SQL SERVER的在线评测系统设计与实现

摘要

目前,在线评测系统大多采用Linux系统作为运行平台,由于Linux系统人机交互能力差,使得系统部署要求高和维护难度大。本文针对以上问题进行分析,采用Windows操作系统作为运行平台,在.NET开发平台的基础上,利用EF框架、ORM技术和MVC模式对系统框架进行搭建,设计并实现了用户管理、题目管理、C语言评测等功能,降低了系统的部署要求和维护难度。

关键词: 在线评测;FineUI;WCF;SOA

Abstract

Currently, the online judge system use a Linux system as the operatingplatform, due to the poor human-computer interaction Linux system, so that thesystem requires high deployment and maintenance difficult. This paper analyzedthe above problems, the use of the Windows operating system as the operatingplatform, based on the .NET development platform, using EF framework, ORM andMVC mode system technology framework to build, design and implement usermanagement, title management, C language evaluation and other functions,reducing deployment and maintenance requirements of the system more difficult.

**Keywords: **Online Judge; FineUI; WCF; SOA

1. 绪论

1.1 研究背景

在线评测系统起源于ACM-ICPC国际大学生程序设计竞赛,随后OI信息学奥林匹克竞赛中也开始使用,主要负责自动判题和排名等功能。现在世界各地的高校大学生都在使用在线评测系统进行各种程序设计的训练、比赛队员的集训等,现如今,在各类程序设计竞赛中,也在采用在线评测系统进行自动判题和比赛排名。

1.2 目前国内外发展现状

国外著名的在线评测系统有俄罗斯的SGU(萨拉托夫大学)、URAL(乌拉尔大学)、MIPT(ELJudge),西班牙的UVA(瓦拉杜利德大学),美国的USACO以及波兰的SPOJ,每个评测系统都非常经典。

国内的在线评测系统都有:HDUOJ (杭州电子科技大学)、ZOJ(浙江大学)、POJ(北京大学)、HUSTOJ(华中科技大学)、HITOJ(哈尔滨工业大学)等。

国内外对于在线评测系统的开发都非常完善,每个系统都有自己的特色,都能给编程人员提供一个很好的练习平台,但是国内的在线评测系统对后台维护的重视程度不够,导致现有的在线评测系统没有一个好的运维环境,主要表现在界面不友好,管理功能不够完全,对于很多操作,没有进行服务提供,都需要更改数据库完成相关功能,管理难度大。

1.3 研究的目的和意义

由于现有的在线评测系统大多是在Linux平台上进行部署和运行,对部署人员和维护人员的技术要求过高,需要部署人员和维护人员了解Linux操作系统的基本操作和基本命令,造成了系统部署和维护难度大的问题。Windows操作系统作为最常使用的操作系统,其完美的系统交互是主要原因,设计并开发一个在Windows下稳定运行的在线评测系统就变得尤为重要。本系统选择Windows系统作为运行平台,采用C#编程语言,利用Process对程序的调用功能和Task的后台任务功能完成了对C语言源代码的编译、运行和数据比对功能。

本系统在评测模块的基础上对系统中用户、权限、题目等基础数据的维护功能进行了开发,完成了对用户、权限、题目等基础数据的基本管理功能。

本系统采用Windows操作系统作为运行平台,基于B/S架构,开发并实现了在Windows系统上部署简单、维护可视化的在线评测系统。

1.4 可行性分析

可行性对于系统的开发是非常重要的,如果一个软件的可行性不是很好,整个系统的开发工作将会取消,如果不取消开发计划,在开发过程中将会遇到各种技术和业务难题无法解决,最终导致整个系统的失败。

本系统采用结构化分析方式,采用数据流图、结构图、流程图等对系统做了详细的需求分析,在前期的设计过程中充分考虑的所有情况,减少后期的问题;编码阶段采用多个现有框架和基本数据结构做技术支撑,保证整个系统的稳固性、可维护性和快速开发的要求。

2. 系统总体分析

在线测评系统的业务很简单,都是基本的基础数据维护工作,难点主要在后期的维护工作上,因为在线评测系统主要用于大学生的基本编程语言练习,管理人员和维护人员也是在校大学生,其在校时间最长为4年,排除新生一年的学习期,剩下三年时间,如果整个系统的维护工作和升级工作都非常复杂,将会出现问题永远没有人去解决的情况,导致系统的维护工作停滞,如何让整个系统的维护工作和软件升级工作变得简单也就成为了开发在线评测系统的一个难题。

为了应对这个严峻的问题,本系统应该采用大多数编程语言都兼容的通讯方式进行底层开发,保证多语言之间足够好的交互,维护人员可介入的语言选择面更广,每一个模块都互相独立,如果缺乏维护人员进行维护,可直接用熟悉的编程语言进行二模块重新开发,对相应的接口进行实现即可对接现有系统直接运行,系统的升级和维护变得更加高效。

系统实现了最基本的访问控制模型,采用了用户组、角色等概念建立了整个系统的权限管理。增加用户组和角色之后,对权限的控制将更加的灵活、高效,可对单一用户设置权限,也可对用户组的权限进行维护,实现批量的功能。

本次毕业设计工作量相比较高,由于时间问题,所以决定对本系统只搭建开发环境和项目,并且完成题目信息的基本管理,保证基本功能的运行。

2.1 系统概述

本系统基于各种开发框架和开发原则,在基础的系统操作之上,增加在线评测系统的业务功能,使本系统具有一般系统的基础数据管理能力和在线评测系统所特有的评测功能。

系统将在稳定的平台基础上进行拓展,增加分布式部署功能和负载均衡功能,目标是可对子功能进行多次部署,并且在向子功能分派任务时进行负载均衡处理,保证个子功能的良好运行状态,后期将增加服务器宕机报警等功能。

数据访问部分将采用通用处理方式,保证数据系统对其他可拓展系统的良好数据访问服务,保证大多数编程语言进行服务调用,获取数据服务。

2.2 系统分析的原则

通过对系统各个功能的分析过程中,必须遵守以下原则:

  1. 实用性原则。功能必须实用,不能存在不使用的功能点。
  2. 可靠性原则。数据库和数据服务必须严格设计,保证数据的安全和实时。
  3. 可扩展性原则。系统必须存在标准接口,保证读其他系统的服务支持和本系统的扩展。

2.3 系统需求分析

需求分析指对所开发系统的基本功能和用户功能进行需求获取、分析、总结的过程,需求分析的完整性直接关系所开发系统的功能完善度和系统的开发难度。如果分析出的需求不是用户最终所需要的,那么开发工作等同于白做,而且会面临多次的需求变动和代码重构或重写的复杂情况;而需求分析不足则会导致用户对所开发系统不满意,还会导致一些功能有缺失或者部分错误,这些都是很严重的错误,将会导致整个系统的开发过程缓慢和交付困难。

系统分析首先应该从系统基本功能着手,对系统的基本功能做详细的分析,建立开发模型并优化;在此基础上,即可对用户进行需求调查,获取用户的业务需求,对用户的业务需求进行分析整理,进行开发建模;最后将系统的基本功能模型和用户业务模型进行合并和优化,确定整个系统的开发模型和交付要求。

首先,进行在线评测系统的系统功能需求分析。下面是关于系统功能的需求:

  1. 系统应该支持用户管理,应该具有用户注册和登录界面。
  2. 系统用户需要有完美的权限管理支持,对每一个用户都应该具有单独的权限管理,能够随时增删用户权限。
  3. 系统用户需要支持分组,并且分组也应该纳入权限管理中,应该可以随时增删用户分组的权限。
  4. 系统信息应该有数据权限,对于一些重要信息,应该只允许管理员查看。

下面是用户业务需求:

  1. 系统应该提供题目的管理功能,能够很方便的对题目信息进行增删。
  2. 题目的管理功能中有的新增界面,应该支持富文本的编辑,例如上传图片、文字简单排版等功能,界面必须美观、易操作性强。
  3. 对于运行结果支持重判功能,即将用户代码重新发送给判题模块进行评测。
  4. 系统应该支持服务器的信息查看功能,比如服务器的CPU使用率、内存使用率、出入网速等相关信息。
  5. 能够查看代码运行排名情况,分总排名和周排名。
  6. 可以将问题进行分类查看,便于分类练习。

2.3.1 用户与权限模块的分析

系统中用户的权限管理是最重要的,用户登录验证是系统安全的第一道屏障。

  • 根据前面提到的系统功能需求和用户业务需求,用户的权限管理模块应该具有以下实体:用户、角色、权限、用户组。
  • 用户应具有以下主要属性:用户主键、用户名、密码,和其他可选属性:姓名、性别、联系电话、博客、邮箱等,用户对象应具有基本数据维护功能。
  • 角色应具有以下属性:角色主键、角色名称。
  • 权限应具有以下属性:权限主键、权限名称。
  • 用户组应具有以下属性:用户组主键、用户组名称。同样,角色、权限、用户组对象也应具有基本数据维护功能。

依据以上对用户权限管理的分析,给出用户权限管理的实体关系图,如图2-1所示:

2.3.2 题目与比赛模块的分析

题目和比赛属于用户业务,依据用户提出的业务需求,将题目、比赛模块的实体划分为以下几个:题目、比赛。题目应包含以下属性:题目编号、题目标题、等;比赛应该包含以下属性:比赛编号、比赛时间、比赛标题等。

比赛和题目之间的关系为一个比赛中包含多个题目,一个题目也可以出现在不同的比赛中,所以比赛和题目的关系为n:m。

依据以上需求分析,题目和比赛模块的实体关系图如图2-2所示:

2.3.3 源代码评测模块的分析

在线评测系统中,对源代码的评测是主要功能。对于源代码的评测需要经过源代码编译、程序运行、比对输出文件,最终给出源代码的评测结果。

在线评测系统中需要支持对C、C++、JAVA等语言的评测功能,所以在源代码编译和运行阶段都需要对每种语言进行单独的编译处理和运行处理。最后将运行之后的输出结果与标准的输出结果进行对比。

因为编译程序和生成的可执行程序都需要进程才能调用,所以本系统采用线程进行编译程序的调用和运行程序的调用,利用运行参数设置运行操作。

代码编译和程序运行需要时间,单进程无法完成快速判题的工作,所以本系统采用后台任务Task进行异步执行。

3. 系统设计

3.1 系统基本结构

基于本系统的研究目的,本系统采用多个已成熟框架搭建基础平台。首先是数据服务,本系统采用Windows 通讯开发平台建立了数据服务,为业务模块提供数据支持,Windows 通讯开发平台是微软开发的成熟开发平台,该平台采用了基本的Http协议进行访问,数据单元符合简单对象访问协议,都是基本的通讯方式和数据格式,通用性非常好,各个后台语言均可访问服务获取需要的数据;其次是数据访问层(也叫数据持久层)的搭建,本系统采用实体框架来完成数据访问层的搭建,实体框架是微软开发的ORM解决方案,该框架完成了数据库表和实体模型的同步和基本查询的支持,其他ORM解决方案有很多比实体框架好的,但是本人认为其他的解决方案配置有点麻烦,并且实体框架微软给它配备了非常好的设计器,这也是我选择这个框架的原因;最后是业务层,对于业务层,本系统采用MVC模式对交互模块进行开发,采用普通的开发方式开发后台管理系统,MVC模式的好处是将界面和数据逻辑进行了分离,耦合性降低。本系统从业务上衍生出了后台判题系统,本系统的后台判题系统暂时通过C#语言进行简单开发,开发后的程序和Windows 通讯开发平台对接,形成服务,以后可对接其他的判题服务。

3.2 系统体系结构设计

对本系统整体分析后,将本系统划分为三个主要的模块:交互模块、后台管理模块和判题服务模块。交互模块主要负责和用户的数据交互,展示题目信息等;后台管理系统提供给管理员,用于对系统基础数据进行维护;判题服务模块负责对用户提交代码做正确性评测,给出评测结果。根据模块划分,系统模块结构图如图3-1所示。

交互模块的功能结构图如图3-2所示。

后台管理模块的功能结构图如图3-3所示。

判题服务模块的功能结构图如图3-4所示。

基于以上的系统模块结构图和模块功能结构图,给出本系统的数据流图,更完整的展示了本系统中数据的流向。系统顶层数据流图如图3-5所示,系统0层数据流图如图3-6所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3 系统数据库设计

数据库在整个系统中扮演数据仓库的角色,负责数据的存储。数据库本身提供数据的存储功能和简单的数据处理功能,为了更好的对数据库进行管理,本系统中采用微软开发的关系数据库管理系统SQL Server进行数据库管理,使得数据库的运行更加高效。

3.3.1 数据库的设计原则

在设计系统数据库时应有一定的设计原则,没有设计原则,数据库会设计的比较乱,在工作交接和后期开发维护的时候会导致开发周期过长,下面这些设计原则是本系统数据库开发时必须遵守的几项:

1.命名规则

设计数据库时,应遵守数据库和数据库表的命名规则,基于基本的命名规则每个系统都会规定自己系统设计数据库时的命名规则。本系统的命名规则为:数据库表名称首字母大写,数据库表中字段名称小写,名称存在多个单词时,采用下划线进行分割。

2.数据库表的自完备性

数据库设计时,应该保证每个表都是必须的并且是不可代替的,每张表都应该是自完备的,严格遵守数据库设计的三大范式,不应该在表中的字段就不能加入表中,如果需要加入表中就必须要考虑必要的原因。

3.数据库表的可扩展性

数据库的设计必须考虑到以后的发展,对于每张表都应该考虑到以后的可扩展性,保证以后的增加数据对象和业务数据等情况不会影响原有的数据库机构设计。

3.3.2 数据库表设计

将数据库中表的属性字段进行整理,包括整理出表中属性的数据类型、是否为空、是否主键等信息,将这些信息整理为表格信息,即为本系统的数据字典,以下为本系统的数据字典信息。

1.表名:Problem

Problem表为系统中的题目信息表,表中存储系统中所有题目信息,包括题目编号、标题、题目描述、输入、输出、样例输入、样例输出、是否为特别题目、提示、来源、创建时间、时间限制(ms)、空间限制(kb)、是否屏蔽、难度、上传用户等。题目表结构如表3-1所示。

属性名称数据类型是否为空是否主键说明
idbigint题目编号
titlenvarchar(MAX)标题
describenvarchar(MAX)题目描述
inputnvarchar(MAX)输入
outputnvarchar(MAX)输出
sample_inputnvarchar(MAX)样例输入
sample_outputnvarchar(MAX)样例输出
fg_specialnvarchar(MAX)是否为特别题目
hintnvarchar(MAX)提示
sourcenvarchar(MAX)来源
in_datedatetime创建时间
time_limitint时间限制(ms)
memory_limitint空间限制(kb)
defunctbit是否屏蔽
difficultynvarchar(MAX)难度
uploaderbigint上传用户

2.表名:User

User表保存有系统中所有用户的信息,包括用户的:用户编号、用户名、密码、邮箱、提交次数、通过次数、注册时间、最后访问时间、注册时IP、最后一次登录IP、是否屏蔽、学校、默认使用语言。用户表结构如表3-2所示。

属性名称数据类型是否为空是否主键说明
idbigint用户编号
usernamenvarchar(MAX)用户名
passwordnvarchar(MAX)密码
emailnvarchar(MAX)邮箱
submitbigint提交次数
solvedbigint通过次数
regtimedatetime注册时间
accesstimedatetime最后访问时间
regipnvarchar(MAX)注册时IP
accesstpnvarchar(MAX)最后一次登录IP
defunctbit是否屏蔽
schoolnvarchar(MAX)学校
id_languageint默认使用语言

3.表名:Solution

Solution表为运行结果表,保存所有的运行结果,包括:运行编号、题目编号、提交人、运行时间、运行内存、语言、提交时间、运行结果、所属竞赛、竞赛序号。运行结果表结构如表3-3所示。

属性名称数据类型是否为空是否主键说明
idbigint运行编号
id_problembigint题目编号
id_userbigint提交人
timedatetime运行时间
memorybigint运行内存
id_languagebigint语言
createtimedatetime提交时间
resultint运行结果
id_contestbigint所属竞赛
numint竞赛序号

3.4 系统功能设计

3.4.1 用户注册的设计

用户注册功能是本系统中用户信息的主要入口,用户填写用户名、密码等注册时需要的个人信息,然后点击注册按钮,将信息保存入系统数据库,在系统登录时进行身份的验证。

用户注册功能的界面主要包含以下几个主要信息:用户名、密码、确认密码、验证码,其他信息包括Email、QQ、博客、电话、自我介绍等。单击注册按钮后,验证必填信息是否已经填写,必填信息包括用户名、密码、确认密码,然后验证密码和确认密码是否相同,如果不相同,提示密码和确认密码不相符,如果密码和确认密码系统,则对密码进行安全处理,然后保存入数据库。

密码的安全处理措施主要有:1.对明文密码利用MD5求得其散列值,将散列值存入数据库,用户在系统登录时只需判定用户输入的密码所求得散列值是否等于数据库保存的散列值即可。2.因为32位的MD5散列值已有方法可在有效时间内进行“破解”,方法是将所有的明文散列值队保存入数据库,然后通过分布式暴力求解,所以在本系统的密码安全方面,采用比较难破解的方式,对用户密码进行加盐加密,加盐加密大致可理解为通过在用户输入的明文密码后增加自定义的复杂明文串,复杂明文字符串应该包括大小写字母、数字、特殊字符三类,且每一类的长度大于2。进行加盐加密后对处理过的密码进行措施1中所说的散列运算,这样就可以增大密码的安全性能,防止系统密码被破解。用户注册流程图如图3-7所示:

3.4.2 用户登录的设计

用户登录功能是进入系统的第一道验证,用户输入自己的用户名和密码进行登录,本系统会对用户输入的登录信息进行确认,如果用户的登录信息正确,则允许用户进入系统,否则提示用户登录信息错误,并且不允许其进入系统。

用户登录界面非常简单,首先是用户名录入框,用于用户输入自己的用户名,然后是一个密码输入框,用户的登录密码在这里输入,最后是验证码输入框,用于用户输入给出的验证码,防止攻击人员对用户密码的暴力破解。用户名、密码和验证码都必须输入。

因为在用户注册阶段对用户密码进行了加盐加密和散列处理,加盐加密详细描述在用户注册模块描述中已给出,所以在登录验证时同样需要对用户输入的密码进行加盐加密和MD5散列值的计算,用户登录流程图如图3-8所示。

3.4.3 题目管理的设计

题目管理负责对系统中题目信息的基本管理,主要功能为题目信息的存取,其他功能包括对题目信息的搜索等。

题目管理主界面为题目信息的列表界面,主要采用表格展示的方式显示题目的主要信息,包括题号、难度、标题,每一行后增加三个功能按钮,分别为编辑、查看、删除按钮,用于对所在行数据的编辑、查看和删除功能。表格的上方操作栏左侧设置新增按钮,单击新增按钮时弹出新增题目对话框,用于录入新的题目信息。

列表上方为查询面板,完成对题目信息的多条件查询功能,查询条件包括题号、最低难度、最高难度、标题,查询条件均不要求必填,用户选择查询条件进行输入后,点击查询按钮即可根据查询信息进行查询。查询逻辑如下:输入题号进行查询可查询出指定题号的题目信息;最低难度和最高难度为题目难度的查询条件,只录入最低难度不录入最高难度则查询大于等于最低难度的题目信息,只录入最高难度不录入最低难度则查询小于等于最高难度的题目信息,如果同时录入了最低难度和最高难度,则查询大于等于最低难度并且小于等于最高难度的题目信息;标题查询采用模糊查询,录入标题后则查询所有题目标题中含有录入条件的题目信息。

因为题目信息过多,采用表格一次性展示会有性能问题,所以在表格上增加分页功能,每页显示数量可以选择,分为20、50、100三种选项,显示数量变化时,题目列表进行刷新。

新增题目界面采用弹出框的方式进行展示,当用户单击新增按钮时弹出新增题目对话框。对话框标题为“新增题目信息”,新增题目对话框中的录入项包括:标题、难度、时间限制、内存限制、来源、描述、输入、输出、样例输入、样例输出、提示。标题采用文本框的形式进行录入;难度采用数字选择框,数字范围为系统设置的难度范围;时间限制和内存限制采用数字录入框,范围不作限制;来源采用文本框、由用户自己录入;描述采用Html编辑器进行描述信息录入,支持图片上传、简单的文字排版、数学符号的输入、特殊符号的输入等;输入、输出、样例输入、样例输出和提示因为需要编辑的内容比较多且再多行,所以均采用富文本框进行编辑。录入项中标题、难度、时间限制、内存限制、描述、输入、输出、样例输入、样例输出为必录项,来源和提示为非必录项。按钮区域放置在新增界面最下方,包含保存按钮和取消按钮,当点击保存按钮时,对所有必须录入项进行检查,如果存在必须录入项没有录入则提示用户进行输入,如果所有必须录入项均已录入,则将题目数据保存入数据库,并提示用户保存成功,用户确认后关闭新增题目信息对话框,并刷新题目列表界面;点击取消按钮后,直接关闭新增题目信息对话框。

修改题目信息界面和新增题目信息界面大体相同,只需要在打开编辑题目信息界面时,将题目信息进行展示,并且允许用户进行编辑,保存和取消按钮的动作和新增题目信息相同。查看题目信息界面与编辑界面基本相同,查看的时候没有按钮区域并且所有信息为只读模式,不允许用户编辑。当用户点击删除时,需要提示用户对删除操作进行确认,防止用户误操作,当用户点击确认时,对当前题目执行删除操作,然后刷新题目列表界面,题目管理流程图如图3-9所示。

3.4.4 角色管理的设计

角色定义了系统中用户的类别,一个角色可以让多个用户所拥有,完成了一类用户的抽象表示。因为角色的属性太少且每个属性值不会很长,所以角色管理主界面表格进行数据查看,包括:角色编号和角色名称。在每一行数据后,增加修改和删除功能按钮,用于对本行数据的修改操作和删除操作,表格的上方工具栏中放置新增按钮和一个自动查询文本框,新增按钮用于用户单击进入新增角色窗口,完成对角色信息的新增操作,自动搜索框帮助管理员对角色信息进行辅助查询。

当用户点击新增按钮后,弹出新增角色窗口,窗口标题为“新增角色信息”,窗口中包含一项需要输入的数据项:角色名称,角色名称用单行文本框进行录入,且不可为空;窗口下方为按钮区,包含保存和取消两个按钮,当用户点击保存按钮时,对角色名称进行非空校验,如果角色名称为空,弹出提示对话框,内容为“角色名称为空,请录入角色名称”,如果已录入角色信息则将角色信息保存到数据库,并提示用户保存成功,用户确认后,关闭新增角色信息窗口,并刷新角色列表;当用户点击取消按钮后,关闭新增角色窗口,并刷新角色列表。

用户单击修改按钮后,弹出修改菜单窗口,并将本行的详细菜单信息展示在修改菜单窗口中,修改菜单窗口标题为“修改功能信息”,修改菜单窗口中数据项展示和新增菜单窗口中相同,修改菜单窗口的功能和新增功能窗口中相同。删除菜单功能的方法是点击每一行后的删除按钮,删除菜单信息时需要提示用户进行删除确认,防止用户误操作导致的误删除,当用户确认后,对菜单信息执行删除操作。

当用户点击修改按钮后,弹出修改角色窗口,窗口标题为“修改角色信息”,窗口中数据项和新增角色窗口相同,不同的是在打开修改角色信息窗口时,应查询出角色信息,并填充到界面中供用户进行修改,当用户修改完毕点击保存按钮时,对角色名称进行非空校验,步奏和新增用户相同。

角色信息不会太多,所以角色管理界面的表格不需要增加分页功能,每次打开时查询出所有角色信息,角色管理的流程图如图3-10所示。

3.4.5 菜单管理的设计

菜单管理是对后台管理模块中的菜单进行管理,菜单管理主要负责菜单信息基本的增删管理。

菜单管理主界面采用树状表格的形式进行展示,在基本的菜单展示基础上,增加菜单上下级的关系展示,显示项包括:菜单编码、菜单标题、菜单链接、排序序号。每一行数据的后面增加删除按钮,用于对当前行数据的删除操作,新增功能和修改功能放在表格的上方工具栏,工具栏中按钮分别是新增功能和修改功能。

因为后台管理模块的菜单数据不是很多,所以菜单列表不采用分页设计,每次打开菜单管理功能后,查询出所有的菜单信息。

当用户点击新增功能按钮后,弹出新增功能窗口,新增功能窗口标题为“新增功能信息”,新增功能信息弹出框中包括菜单编码、菜单名称、功能编码、功能名称和功能链接。菜单编码是新增功能时选择的上级菜单编码,以文字方式显示,不允许编辑;菜单名称是新增功能时选择的上级菜单的名称,也以文字方式显示,不允许编辑;然后是功能编码,可录入,不可为空;功能名称,文本框表示,不可为空,并且可录入;最后是功能链接,是功能对应的网络链接,是点击功能菜单后跳转的网络链接,可以为空。新增功能弹窗框最下方是按钮区域,按钮主要有保存和取消两个按钮,分别对应保存和取消两个动作,当用户点击保存按钮后对所有必需录入项进行验证,如果存在必须录入项没有进行录入,则提醒用户进行录入必须录入项,如果所有必须录入项都已录入,则对新增的功能信息进行保存,并提示保存成功,然后关闭新增功能弹出框,并刷新菜单列表;如果点击取消,则关闭新增功能弹出框,菜单管理的流程图如图3-11所示。

3.4.6 权限管理的设计

权限管理是对系统中的权限信息进行基本数据管理,主要包括对权限信息的增删等功能。

权限包括功能权限和数据权限,功能权限指能否进入指定功能,数据权限是指能否对数据进行查看和修改,这两种权限统一在权限管理功能中进行管理。

权限管理主界面采用表格的形式进行数据展示,主要包括权限编号、权限名称,每行数据后会有修改按钮和删除按钮,用于对该条权限的修改和删除,新增功能还是放置在表格的上方工具条区域,样式为新增按钮,当用户点击新增按钮后,弹出新增权限画面进行权限的新增处理,工具栏中除了新增按钮还有一个查询框,对权限信息进行简单的查询。

当用户点击新增按钮后,弹出新增权限信息窗口,窗口标题为“新增权限信息”,窗口中只有两个文本输入框,第一个是权限编码,可编辑、不可空,是根据系统功能指定的权限编码,第二个为权限名称,可编辑、不可空,填写权限名称。最下方为动作按钮区域,包含保存按钮和取消按钮,用户单击保存按钮后,先对权限编码和权限名称进行空校验,如果其中一个为空,则弹出消息框提示用户完整填写,如果都不为空,则将用户录入的权限信息保存入数据库,并提示用户权限保存成功,用户确认后,将新增权限窗口关闭,并刷新权限信息列表,当用户点击取消按钮后,将新增权限窗口进行关闭。

用户单击修改按钮后,弹出修改权限信息窗口,标题为“修改权限信息”,页面布局和新增权限信息界面相同,然后将本条数据填充到界面中,供用户进行权限信息修改,动作按钮区域布局和动作同新增权限界面。当用户点击删除按钮后,提示用户进行删除确认,用户确认后将数据删除,防止用户进行了误操作所导致的数据删除。

权限信息非常多,包含了功能权限和数据权限,所以表格展示区域加入分页功能,对权限数据进行分页查看,增快系统的反应速度,如图3-12为权限管理的流程图。

3.4.7 用户管理的设计

用户管理功能主要完成对系统中用户信息的基本管理,包括修改用户信息和删除用户信息。

用户管理主要的数据展示方式为表格,采用表格对用户信息进行展示,并增加分页功能来解决用户信息量大数据加载慢的问题,展示信息包括:用户名、注册时间、最后一次登录时间、学校、默认使用语言。每行数据后有编辑和删除按钮,用于修改用户信息和删除用户信息。表格上方有搜索框,用户可在搜索框中对用户进行模糊搜索。

当用户点击编辑按钮后,弹出修改用户信息窗口,编辑项包括:用户名、用户密码、学校、默认使用语言。其中用户名不允许修改,其他可修改,修改完之后,点击下方按钮区域的保存按钮进行用户信息保存,点击取消可取消此次更改。当用户点击删除按钮后,对用户提示确认删除,当用户点击确认后,将用户信息删除,如图3-13为用户管理的流程图。

3.4.8 用户组管理的设计

用户组管理包括对用户组信息的基本数据操作和用户组成员管理,在此功能下用户可对用户组信息进行基本的管理和对用户组中用户成员的基本管理。

用户组管理主界面采用表格的方式对用户组信息进行查看,包括用户组编号、用户组名称。每行数据后会有三个动作按钮,分别是修改、删除、管理,修改按钮用于用户进入修改用户组信息界面,删除按钮用于用户对用户组信息进行删除,管理按钮是进入用户组成员管理的入口。表格上方工具栏中有新增按钮和搜索框,新增按钮是用户新增用户组的入口,搜索框用于用户组信息的简单查询。

当用户点击新增按钮后,弹出新增用户组信息窗口,窗口标题为“新增用户组信息新增用户组信息窗口中包括:用户组名称,用于录入用户组名称。按钮区包含保存按钮和取消按钮,填写入用户组名称后点击保存按钮即可将用户组信息保存入数据库中,点击取消则关闭新增用户组信息窗口。

用户点击修改按钮后,弹出修改用户组信息窗口,标题为“修改用户组信息”,界面布局和操作同新增用户组信息功能。当用户点击删除按钮,提示用户是否确认删除用户组信息,当用户点击确认后,删除用户组信息,否则不做操作。

当用户点击管理按钮后,弹出用户组成员管理窗口,用户组成员管理窗口中包含:用户组编号、用户组名称和用户列表,点击新增弹出用户列表,选择用户后点击确认将用户加入用户组,点击删除即可将用户移除用户组,对用户列表进行调整后,点击保存按钮即可将信息保存入数据库,如果不想保存可取消当前更改,取消后会关闭当前窗口,如图3-14为用户组管理流程图。

3.4.9 源代码评测模块的设计

源代码评测模块的主流程为:构建评测环境、编译源代码文件、运行可执行文件、比对输出文件和标准输出文件。

代码编译之前需要构建评测环境,本系统采用运行号为评测文件夹命名,新建文件夹后,根据题目编号将题目的标准输入文件和标准输出文件拷贝到评测目录下,然后将代码进行保存,源代码文件命名为sourceCode.c。

环境构建完成后即可对源代码进行编译,本系统中只实现了对C语言的编译和运行。本系统采用Process调用“mingw32-gcc.exe”编译器,首先设置进程的执行目录和参数,执行参数为“sourceCode.c –o 6.exe”,其中” sourceCode.c“为源代码文件名称,源代码文件在工作目录下,工作目录会在后面进行设置,”6.exe“是编译后的可执行文件名称,编译后会在工作目录下生成可执行文件;为了获取编译时的输出信息和错误信息,需要设置进程的启动信息StartInfo,设置UseShellExecute为false、RedirectStandardOutput为true、RedirectStandardError为true,上面的设置是重定向输出流和错误流,可通过关注输出流事件和错误流事件进行编译时输出信息和错误信息的获取;进程运行时会弹出运行框,为了达到后台运行的目的,需要进行相关设置,设置CreateNoWindow为true,设置WindowStyle为Hidden,通过设置这两个设置项即可隐藏弹出框;设置这些参数后即可执行Process.Start()方法开始运行进程。

编译之后即可对生成的可执行程序进行运行。程序运行时也采用Process执行可执行程序,首先设置Process的要运行的FileName,FileName为要运行的可执行文件名称,如“6.exe“,然后打开标准输入文件并创建运行输出文件,在Process.Start()之后,进行标准输入的文件的读取和输出文件的写入,将输入信息输入到进程中,并将输出信息保存到输出文件中。

最后需要对运行后产生的输出信息和标准的输出文件进行对比,给出答案。首先将标准输出文件和运行时的输出文件读入到内存中,然后对字符串进行逐字符的对比,得出结果,源代码评测流程图如图3-14所示。

4. 系统关键技术描述与主要功能模块实现

4.1 开发工具和相关技术简介

因为笔者只对微软开发的.NET平台进行过比较系统的学习,所以在着手设计本系统时,选用了很多基于.NET平台的框架和技术。对于本系统,在.NET平台的支持下,采用实体框架搭建数据持久层,实体框架采用ORM技术处理对象关系映射,将数据库中表的结构在系统进行映射,采用LINQ等技术处理数据检索中条件的设置,利用实体框架搭建数据持久层可减少代码编写人员对数据库操作处理的代码编写量。系统采用了WCF搭建数据服务,提供基础数据的访问和业务数据的获取,WCF采用简单对象访问协议进行数据的封装,便于各种语言构建系统之间的数据传输,在数据传输时,采用SSL加密,增加了传输时的安全性,WCF还可构建多传输协议的服务平台,包括HTTP、TCP、UDP等传输协议。在界面构建过程中,采用MVC模式进行开发,降低了耦合度并且提升了开发速度,让整体更适合团队协作开发。本系统在以上技术和框架的技术基础上,采用VS 2010作为本系统的开发工具,VS 2010安装完成之后,.NET环境也就随之安装成功,在VS 2010开发工具的协助下,开发工作将会变得更加顺利。

4.2 系统主要功能模块的实现

需要登录本系统的用户,进入登录功能,输入自己的用户名和密码,系统确认登录信息正确后即可进入本系统,在初始界面中,就可以看到自己可以访问的菜单,用户可以操作自己的菜单进行相关操作。以下为各个菜单功能的主画面实现。

4.2.1 用户注册的实现

当用户进入注册功能后,用户需要录入用户名、密码、确认密码,输入完成后,点击注册按钮即可完成用户注册,用户注册页面如图4-1所示。

4.2.2 用户登录的实现

用户注册完成后即可通过登录界面登录,进入本系统。在登陆界面中,用户输入自己的用户名和登录密码,输入完成之后点击登录按钮,系统确认用户信息正确后即可进入本系统,用户登录页面如图4-2所示。

4.2.3 题目管理的实现

管理员进入题目管理功能后,界面显示当前系统中的题目信息,用户可在当前功能点对题目进行增删操作,题目管理界面如图4-3所示。

点击新增按钮可新增题目信息,新增界面需要用户输入题目的基本信息,包括:标题、难度、时间限制、内存限制、描述、输入、输出等,录入信息之后点击保存即可保存题目信息,新增题目界面如图4-4所示。

4.2.4 菜单管理的实现

管理员点击菜单管理进入菜单管理界面后,可看到现有的所有菜单信息,管理员可根据需要增删菜单和功能点。选择菜单编码长度为2的菜单,点击新增功能即可在该菜单下增加功能,需要录入的功能信息有菜单标题、编码、来源等,菜单管理效果图如图4-5所示。

4.2.5 用户管理的实现

进入用户管理功能后,可通过此功能进行用户的增删和权限更改,用户管理界面效果如图4-6所示。

4.2.6 源代码评测模块的实现

本系统实现了对C语言源程序的评测,完成了对C语言源代码的编译、运行和输出结果的比对,评测目录截图如图4-7所示,其中input.txt为标准输入文件,output.txt为标准输出文件,sourceCode.c为源代码文件,10.exe为编译之后的可执行文件,judgeoutput.txt为运行后的输出文件。

5. 系统测试

5.1 概述

系统测试是对系统功能开发是否正确和完整的验证,根据系统的需求分析和设计制定测试用例,测试用例应该包括输入数据、预期结果和,然后根据测试用例进行实际测试,填写测试结果。

5.2 测试用例设计

系统的测试用例如表5-1所示。

输入数据预期结果实际结果
登录,用户名:admin密码:admin进入后台管理系统成功进入后台管理系统
新增用户,用户名:test密码:test可在用户查看界面看到新增的用户信息在用户查看界面看到了新增的用户信息
选择用户test,点击删除所选择用户被删除用户被删除,在查看界面无法查看到
新增题目A+B保存之后在查看界面可以看到保存后在查看界面看到新增的题目
选择题目A+B,点击删除所选择题目被删除题目被删除,在题目查看界面无法查看到
对题目A+B进行正确代码提交运行结果是AC运行结果显示为AC
对题目A+B进行错误代码提交运行结果为WA运行结果显示为WA

结论及尚存在的问题

经过大半年的时间对本系统进行设计开发,面对现在的成果,还是比较满意的,在整个系统的设计开发阶段,学习了很多的平台、框架和新的技术,也将整个系统开发的过程进行了详细的学习,收益颇丰。

通过设计开发本系统,我发现一个人的力量终究是弱小的,只有在团队的支持下才能完成大中型系统的开发工作,所以在本次毕业设计论文中对团队协作开发做了详细的描述,从各个方面进行开发工作的分配,在互不影响的前提下完成整个系统的开发,在尽可能短的时间内完成系统开发和系统交付。本文中从数据源头入手,将数据的整个流程进行多次分层,以最小的接口完成层次之间的沟通,将耦合性尽可能的降低。

在与指导老师探讨过程中,发现现有的在线评测系统已无法满足高校的需求,各个高校都在开发新的评测系统,他们将学习中的大作业之类的练习也拓展到了在线测评系统中,这是我在开发本系统时没有做到的。

参考文献

[1] 赵亮. 使用Entity Framework快速开发Asp.net网站[J]. 企业导报,2012,18:269-270.

[2] 张浩斌. 基于开放式云平台的开源在线评测系统设计与实现[J]. 计算机科学,2012,S3:339-343.

[3] 曾韬. 揭开.NET技术的内幕——读《.NET系统架构与开发》[J]. 程序员,2003,04:114-115.

[4] 卢俊玮,常琳,陈昀锟. MVC模式与ASP.NETMVC框架的技术研究[J]. 电脑知识与技术,2010,19:5160-5162.

[5] 韩旭,王海波,柳克俊. 基于.NETFramework WCF的面向服务SOA中间件设计[J]. 小型微型计算机系统,2010,12:2359-2364.

[6] 何迎生,罗强. Online Judge评判内核的设计与实现[J]. 吉首大学学报(自然科学版),2010,06:37-39.

[7] 朱立. 浅谈实体框架[J]. 电脑知识与技术,2011,18:4372-4373.

[8] 闫冰. 基于WCF的分布式应用开发[J]. 电脑知识与技术,2008,19:68-70.

[9] 李雪东. 基于WCF面向服务架构的研究与应用[D].长春理工大学,2009.

[10] Anonymous. Research and Markets: Professional ADO.NET 3.5 with LINQ and the Entity Framework Guide[J]. M2 Presswire,2009,:.

[11] Kanjilal, Joydip. Working with theEntity Client Data Provider in Entity framework[J]. InfoWorld.com,2015,:.

[12] 姚远,胡文俊,余泽伟,黄玉兰. EntityFramework技术及其应用[J]. 软件导刊,2015,11:116-118.

[13] 王腾,姚丹霖. Online Judge系统的设计开发[J]. 计算机应用与软件,2006,12:129-130.

[14] 曾棕根. 源程序在线评测系统技术改进[J]. 计算机工程与应用,2011,04:68-71.

[15] 张天雄. 源代码在线评测系统设计的标准化[D].长安大学,2012.

[16] 陈湘骥,徐东风,杨秋妹. 在线评判在C语言课程设计教学中的应用[J]. 计算机教育,2010,03:97-100.

致谢

时光荏苒,白驹过隙,大学四年就这样过去了,回想四年的大学时光,有欢快的玩耍,有勤奋的学习,体验过考试前的抓耳挠腮,也享受过熬夜写程序的夜晚,大学四年给了我很多,让我学习到了很多计算机相关的技术和知识。在此向陪伴我度过四年的小伙伴们致以衷心的感谢,谢谢你们给了我美满的大学时光。

忘不了上课时您的谆谆教诲,忘不了您实验时认真的眼神,更忘不了您在课堂上为了活跃气氛说的让我们睡意全无的笑话。大学四年,我从你们那里汲取到了慢慢的知识,我将带着这些知识和您交给我的做人品德去社会上生根发芽,谢谢计算机与信息工程学院的领导和老师们给我们提供如此好的学习环境,更要谢谢陪伴我四年的大学老师,是你们给了我在社会上可以立足的知识。

在我三年的软件开发时间中,是您带着我们接触一个个项目,是您带着我们去和客户讨论需求,是您在我们没有士气的时候给我们打气,让我们振作起来。三年的软件开发,我从中学到了很多。在这次毕业设计过程中,您细心的指导我的设计思路,对我提出的问题,您也是很快就给出正确的答案。

学习是无止境的,在计算机编程技术开发的道路上,还有很长的路要走,我会带着你们给我的所有快乐和知识继续努力,来回报你们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++图论】1993. 树上的操作|1861

本文涉及知识点 C图论 LeetCode 1993. 树上的操作 给你一棵 n 个节点的树,编号从 0 到 n - 1 ,以父节点数组 parent 的形式给出,其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点,所以 parent[0] -1 &#xff0c…

如何使用Python WebDriver爬取ChatGPT内容(完整教程)

大背景 虽然我们能用网页版chatGPT来聊天、写文章,但是我们采集大量的内容,就得不断地手动输入提问来获取答案,并且将结果复制到数据库来保存。如果整个过程能使用程序来做自然要节省很多的人力,精力和时间。 Python webdirver …

渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)

本文是高级前端加解密与验签实战的第6篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA加密来爆破登录。 分析 这里的代码跟上文的类似,但是加密的公钥是通过请求服务端获取的 http://127.0.0.1:8787/crypto/js/…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

Java进程占用的内存有哪些部分?

大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域&#xf…

秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现

0x01 产品简介 秒优科技提供的供应链管理系统,即秒优SCM服装供应链管理系统,是一款专为服装电商企业设计的全方位解决方案。是集款式研发、订单管理、物料管理、生产管理、工艺管理、收发货管理、账单管理、报表管理于一体的服装电商供应链管理解决方案。它涵盖了从企划到开…

音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

一、引言 通过FFmpeg命令可以获取到TS文件/TS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ./ffmpeg -i XXX.ts 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 FFmpeg获取TS文…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode:Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文,将在Visual Studio Code中,安装和使用Markdown插件,以Marktext插件为例。 1.安装Marktext 打开VSCode,侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

线性分类器(KNN,SVM损失,交叉熵损失,softmax)

KNN 工作机制 k-近邻算法的工作机制可以分为两个主要阶段:训练阶段和预测阶段。 训练阶段 在训练阶段,k-近邻算法并不进行显式的模型训练,而是简单地存储训练数据集。每个样本由特征向量和对应的标签组成。此阶段的主要任务是准备好数据&…

知乎 PB 级别 TiDB 数据库集群管控实践

以下文章来源于知乎技术专栏 ,作者代晓磊 导读 在现代企业中,数据库的运维管理至关重要,特别是面对分布式数据库的复杂性和大规模集群的挑战。作为一款兼容 MySQL 协议的分布式关系型数据库,TiDB 在高可用、高扩展性和强一致性方…

Git版本控制工具--基础命令和分支管理

1.Git仓库的基本概念和流程 版本库的概念:版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何…

EMQX构建简易的云服务

基本思路: 使用EMQX作为Mqtt brokermqtt-receive-server服务,用于接收设备上报的数据mqtt-sender-service服务,用于下发数据给设备KafKa实现数据解耦,mqtt-receive-server服务接收的数据简单处理下直接扔到Kafka中云服务各业务系…

基于MindSpore NLP的PEFT微调

创建notebook 登录控制台 创建notebook 如果出现提示按如下操作 回到列表页面创建notebook参数如下: 配置mindnlp环境 打开GitHub - mindspore-lab/mindnlp: Easy-to-use and high-performance NLP and LLM framework based on MindSpore, compatible with model…

半连接转内连接 | OceanBase SQL 查询改写

查询优化器是关系型数据库系统的核心模块,是数据库内核开发的重点和难点,也是衡量整个数据库系统成熟度的“试金石”。为了帮助大家更好地理解 OceanBase 查询优化器,我们撰写了查询改写系列文章,带大家更好地掌握查询改写的精髓&…

imx6ull qt多页面控制系统(正点原子imx系列驱动开发)

开题答辩完了也考完了四六级,赶紧来更新一下一个月前留下的坑吧 QAQ首先,因为毕业设计需要用到这些知识所以就从网络上找了一个智能车机系统,借鉴了一下大佬的项目思路,缝缝补补一个月终于完成了这一内容。 在这里先感谢从两位大佬…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件,适用于工程控制系统。它用于 Intel Edge Controls for Industrial(Intel ECI 或 ECI),…

vscode的keil assistant 中搜索不到全局变量

搜不到 但是在包含的文件中输入 ../../../,就是全局搜索的结果 我的文件结构是:\Desktop\LVGL文件系统移植(lvgl8.3)\Projects\MDK-ARM 盲猜是keil assistant 当前文件夹打开的时候是进入到了MDK-ARM文件夹层次&…

Unity A*算法实现+演示

注意: 本文是对基于下方文章链接的理论,并最终代码实现,感谢作者大大的描述,非常详细,流程稍微做了些改动,文末有工程网盘链接,感兴趣的可以下载。 A*算法详解(个人认为最详细,最通俗易懂的一…

格式工厂,各类文件格式转换

今天给大家推荐一个老牌的软件格式工厂。这个软件早就能支持转换视频、音频、图片、文档等市面上主流格式的软件了,现在也很能打。 格式工厂 各类文件格式转换 软件无需安装,打开这个图标就能直接使用。 屏幕录像功能还是非常强大的,可以全屏…

Java web的发展历史

目录 前言: 一.Model I和Model II 1.Model I开发模式 ​编辑 2.Model II开发模式 二. MVC模式 前言: 该篇文章主要介绍了Java web的发展历史,以及MVC相关内容 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff…