LOSER的资源

  • 基于ASP.NET和Oracle数据库实现的农场信息管理系统

    一、引言1.1 文档目的本文档为 农产品基础数据库系统项目管理系统详细设计,本文档用于描述 农产品基础数据库系统各部分的细节实现,为编码提供参考依据。本文档的读者范围为:系统设计人员农产品基础数据库系统,模块设计人员,编码人员,测试人员。
    本文档作为双方就建立 农产品基础数据库系统需求理解达成一致共识的基础文件,作为双方界定项目范围、签订合同的主要基础,也作为本项目验收的主要依据。本项目为软件开发,不包含不部署硬件。
    1.2 项目背景随着农村经济的发展,建立农产品基础数据库,对农产品的价格进行监控,分析和决策,对于增加农民收入,抵御价格风险,指导播种面积,具有重要的意思。
    本项目由项目领导小组负责监督执行,任务完成后,本系统将运行在微软的.net平台上。
    1.3 术语Microsoft .NET Framework:Microsoft .NET Framework是用于的新编程模型。它将强大的功能与新技术结合起来,用于构建具有视觉上引人注目的用户体验的应用程序,实现跨技术边界的无缝通信,并且能支持各种业务流程。
    中间件:中间件是一种独立的软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯,是连接两个独立应用程序或独立系统的。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或环境。
    1.4 命名约定
    类(Classes):类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。例:class User
    接口(Interfaces):大小写规则与类名相同。并且以大写i为开头。例:Interfaces IUserService
    方法(Methods):方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写,例:runFast();
    变量(Variables):采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头 ,例:User user
    常量(Constants):类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开,例:static final int MAX_WIDTH = 100
    在对包、类、接口、方法、变量、常量命名时一定要名称反映意图的原则,避免使用非常用缩写
    代码规范:有些不易理解的变量或函数应作注释,难懂的代码要有注释,在文件的开始处有该文件的用途描述。一定要保持注释的一致性代码组织要清晰,{,},(,),if,else,do,while,for,case等要对应整齐,缩进全部用Tab键。变量的定义要集中,行数间要有空行分开,一个程序中的空行数目最好占8%-16%。多态函数和功能相近的函数集中在一起代码应该简洁、清楚并讲述了所发生的一切,我们的目标应该是写出最清晰的代码,而不是最巧妙的代码代码的重用要仔细,要讲相关的代码也拷贝过来,注意那段代码也许不适合你的应用场景删掉从来没有用过的函数或变量,大篇幅注释掉的代码也应该删除,以免使程序混乱难度
    工程文件组织规范:一个工程往往包含很多文件,向工程中加入文件或删除工程中的文件要慎重,避免把工程损坏。工程中不起作用的文件或类应删除,工程目录下的非工程文件也应该移走,保持工程的清洁,避免混淆难以管理一个比较大的工程应留有一定的消息接口或插件接口工程的版本控制要严格,版本格式为xx.xx.xx,必要时使用Build次数或日期。高版本尽量兼容低版本的用法、数据或协议工程的编译宏定义和工程参数设置应正确,每作一个新工程时应检查工程参数是否正确工程文件应经常备份,备份时注明备份日期和主要增加的功能
    类组织规范:类力求封装好,严格区分public,private,protect等作用域,如果一个函数与本类有莫大的关系,可以作为该类的静态成员函数,不用或少用友元函数破坏类封装性的方法和技巧类的成员变量在构造函数或初始化函数中应赋初值。指针在构造函数中赋NULL,析构时DEL_EMPTY它,以免内存泄露
    用户界面规范:风格统一,按照对方要求修改,下面效果图仅参考有四大类型的用户界面:对话框、单文档界面、其他界面对话框要易用且简洁,字体和控件的组织搭配要得体,能简单不复杂,各控件的焦点、Tab顺序等要研究。在简洁易用的前提下,力求个性化,设计得更友好。程序各对话框的分割要保持一致单文档和多文档界面的程序功能可以做得很好,也便于扩充和管理。其中菜单、工具栏、状态栏等设计要有特色。菜单按一定的分类弹出,必要时设计成多套菜单,在重要的窗口或区域应能弹出右键,实现常用操作。工具栏上放最常用的操作按钮,必要时动态更换按钮。状态栏显示足够多的消息

    二、软件系统的结构2.1系统的总体架构项目的架构设计遵循平台化、组件化的设计思想,采用统一的数据交换、统一的接口标准、统一的安全保障。
    项目的架构设计遵循平台化、组件化的设计思想,采用统一的数据交换、统一的接口标准、统一的安全保障。系统由下到上分为三层主框架:数据采集层、存储分析层、应用逻辑层,总体建设框架如下图所示。

    农业基本信息、分类信息数据库:主要包括各种农业产品分类数据库、产品描述数据库信息管理、维护,基础字典管理、单位管理等。

    网络爬虫:负责从各大农业信息网站爬取农业产品、价格数据
    格式检查、清洗、转换:负责把从各网站的数据,对齐,处理、分析存入到大数据库中。
    存储分析:利用Spark完成分析查询,mongodb完成存储等
    安全体系:包括权限管理,安全管理、数据备份等
    标准体系:农产品基本信息描述等各种标准管理
    应用逻辑:数据可视化,领导驾驶舱,大数据展示,数据查询,指标趋势分析、决策应用等

    2.2 程序关系图
    2.3 软件角色定义我们可以将这些项目工作的参与者分为四级:从软件角度考虑依次抽象为:

    系统管理员:负责系统基础数据的配置、管理,农产品分类数据的管理,农产品基本信息的管理
    工作人员:农产品信息查询,统计分析,数据导出,采集数据的管理等
    领导:指标分析结果查看,统计数据分析等

    2.4 程序系统的结构用一系列图表列出本程序系统内的每个程序(包括每个模块和子程序)的名称、标识符和它们之间的层次结构关系。
    三、程序设计说明从本章开始,逐个地给出各个层次中的每个程序的设计考虑。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层 模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。
    3.1 信息门户3.1.1 程序描述信息门户(Portal)位于地勘项目管理系统体系结构中的最上层,实现各应用与用户的交互服务过程,是地勘项目管理系统的信息集中展示的窗口,为各类用户提供一个统一的信息服务入口。同时,信息门户根据用户身份提供满足其需求的特定信息和应用系统,为用户提供个性化的服务。
    3.1.2 功能用户登录
    所有用户均通过信息门户登录地勘项目管理系统,通过统一身份认证、基于身份/角色的权限分配策略实现单点登录。



    输入
    处理
    输出




    页面加载
    调用用户的个人信息及能操作的模块信息
    显示其有权操作的功能模块及个人信息


    输入用户名、密码、验证码
    控制器提交到认证中心进行认证
    认证通过返回信息门户view;不通过,返回登陆view及错误信息。



    信息门户主页面



    输入
    处理
    输出




    目录树中所选的单位节点
    调用manager.findDw取得下级单位列表
    在显示单位信息表显示下级单位列表


    在菜单功能列表中点击某功能
    客户端执行主功能区新增tab的命令
    在功能区新增一tab加载相应的功能模块


    点注销按钮
    清除其登陆信息
    重定向到登陆页面


    点修改密码按钮
    客户端执行打开window的命令
    显示用户修改密码的窗口,并提供保存、取消按钮



    3.1.3 用户界面设计登陆页面

    信息门户主页面

    3.2 基础信息维护3.2.1 部门管理部门管理是对下属单位的部门信息进行维护,即添加,修改,删除。



    输入
    处理
    输出




    页面加载
    按单位级别返回部门数据
    显示部门目录树


    目录树列表中点击某部门信息
    客户端从服务器端获取部门相关信息加载到编辑信息窗口
    显示部门代码、上级部门代码、部门名称和描述等信息



    3.2.2 角色管理角色管理是独立用户管理中的另一种角度,在系统维护的权限赋予上,可直接通过角色进行权限的转移。另外一种角色的使用是可归之于在使用上的赋权或称授权。



    输入
    处理
    输出




    页面加载
    返回已定义角色数据
    显示角色列表


    列表中选择某角色信息
    客户端从服务器端获取角色相关信息
    显示角色英文名,中文名及备注等信息


    分配角色模块权限
    给选择的权限添加系统模块并授权
    角色具有相应的操作权限



    3.2.3 用户及权限管理用户及权限管理是地勘系统使用的基础,包括对用户信息的添加、修改、删除、查询,以及给用户配置角色。



    输入
    处理
    输出




    页面加载
    返回已定义角色数据
    显示角色列表


    输入用户名、角色类型
    客户端进行查询,从服务器端获取相关信息
    显示用户编号、用户名、联系方式、电子邮件、是否管理员及备注等信息


    单击新增、编辑、删除和角色授权按钮
    在编辑界面中对用户数据进行操作,授予用户角色权限
    新增用户,对用户信息进行变更



    用户及权限管理页面设计


    3.2.4 基础信息描述对系统中的常用代码进行维护,农产品基础信息描述谷物类,其他参考相应国家标准。



    序号
    名称




    1
    名称


    2
    净含量


    3
    规格


    4
    生产者名称


    5
    生产者地址


    6
    生产者联系方式


    7
    代理商名称


    8
    代理商地址


    9
    代理商联系方式


    10
    进口商名称


    11
    进口商地址


    12
    进口商联系方式


    13
    经销者名称


    14
    经销者地址


    15
    经销者联系方式


    16
    委托单位名称


    17
    委托单位地址


    18
    受委托单位名称


    19
    受委托单位地址


    20
    统一社会信用号


    21
    产地


    22
    原产国


    23
    地区


    24
    生产日期


    25
    保质期


    26
    存储条件


    27
    运输条件


    28
    食品生产许可证编号


    29
    产品标准代码


    30
    图片


    31
    商标


    32
    品牌


    33
    单价


    34
    包装


    35
    检验报告


    36
    认证证书


    37
    辐照食品


    38
    转基因食品


    39
    营养成分


    40
    质量等级


    41
    批号


    42
    食用方法


    43
    适宜人群


    44
    致敏物质


    45
    感官标志


    46
    理化指标


    47
    食品安全指标


    48
    色泽


    49
    气味


    50
    水分




    3.2.5 农产品分类管理农业部农产品标准分类-2010

    3.3 农产品信息采集3.3.1 农产品信息管理包括添加、修改、删除、导入、导出,包括:农产品生产企业/农村合作社、生产面积、品种、产量、上市时间、质量和技术水平、加工企业、贮存条件、保质期、售价、传统销售渠道及比例、自主品牌拥有情况、农产品电商企业等,不固定信息及信息类型、不限制信息数量
    3.3.2 农产品数据抓取使用爬虫技术,自动在互联网抓取农产品信息,并保存在系统中。

    3.4 农产品信息分析3.4.1 农产品指标分析对农产品信息进行统计分析

    3.4.2 农产品指标趋势分析对农产品各项指标进行趋势分析及预测

    3.5 农产品信息显示3.5.1 农产品信息查询根据条件查询农产品信息,并导出

    3.5.2 农农产品信息展示提供领导驾驶舱页面,展示包括各项指标、分布、趋势、决策分析等,能够适配2×2个55寸大屏(分辨率:1920×1080)展示

    3.6 数据维护模块系统管理数据库备份与还原功能

    3.7 系统管理3.7.1 系统日志管理系统日志包括登陆日志和操作日志,主要是记录用户登陆详细信息和日常使用操作信息。包括日志的查询与删除功能。



    输入
    处理
    输出




    页面加载
    按日期或类型返回数据
    显示日志列表信息


    列表中选择查询日期或类型信息
    客户端从服务器端获取相关信息,对其进行相应的操作(查看详细、删除)
    显示登陆日志和操作日志信息



    系统日志管理页面设计

    3.7.2 系统信息设置
    3.7.3 用户管理改个人信息

    修改登录密码
    1  留言 2021-04-14 08:11:16
  • 基于jsp的像素着色

    一、用户界面
    注意: 需要在Chrome浏览器上运行,使用IE等其他浏览器可能出现各种不兼容现象。
    二、操作方法
    在绘图区域点击鼠标,绘制多边形。在还差一条边没有绘制时,右键点击画布或者按下空格键可以自动封闭多边形。
    点击右上侧按钮可以选择目标多边形。选中后,点击下面按钮可以进行进一步的操作:

    清除选中状态: 取消对多边形的选择。添加内环: 点击后,紧接着绘制的下一个多边形将成为目标多边形的内环。选择裁剪对象: 点击该按钮后,要继续点击另一多边形对应的按钮。将进行裁剪操作,原多边形作为主多边形,后点击的将作为裁剪多边形。平移、旋转、缩放、翻转。着色。重置多边形: 清除当前所有多边形。
    部分操作可以用键盘代替:




    操作
    键盘方法




    封闭多边形
    space


    平移
    上下左右


    旋转
    shift+左右


    缩放
    shift+上下


    翻转
    alt+上下左右



    三、效果展示3.1 裁剪
    3.2 着色
    四、特色
    仅使用了setPixel函数。
    可以判断多边形合理性,避免内环画在外面、多边形自相交等状况。
    交互友好,可以轻松添加多边形并对其操作。
    允许存在多个多边形。
    手动实现了双缓冲绘制,刷新时只绘制发生变化的像素,大大节约时间。

    五、算法概览在这里列出程序用到的主要的函数。



    功能
    函数名
    算法




    画线
    _lineTo
    Bresenham算法。


    着色
    colorPolygons
    逐点判断方法。


    求坐标是否在多边形内
    isIn
    将该点与多边形各个顶点连线,分别求内外环各个夹角的度数和。若在外环内、内环外,则为多边形内部


    判断线段是否相交
    isTwoLinesCross
    先判断显然不相交的情况,再求向量叉积判断


    判断多边形自相交
    checkCross
    枚举各边是否相交


    求线段交点
    crossPoint
    先判断相交,再求两直线方程交点


    封闭多边形
    closePath
    判断是否自相交; 将当前绘制的线段排序,并压进polygons数组; 添加按钮


    对线段排序(顺逆时针)
    sortVertex
    使用Paul Bourke的方法,并区分内外环


    求几何重心
    getCenter
    参照维基百科的公式,并非简单的求各个点坐标平均值:此外,内环相当于负质量,应减去。


    旋转
    rotate
    将选中的多边形的各个顶点相对于多边形重心的各个向量分别旋转,再加回重心


    多边形边交点排序
    sortCrossPoint
    该函数在裁剪多边形中用到,目的是对主多边形的一条边与裁剪多边形的交点的排序。根据端点的顺序,对各个交点的横坐标做冒泡排序。


    裁剪多边形
    cutPolygon
    使用Weiler-Atherton算法。先改变多边形数据结构,从边表转成顶点表。再求两个多边形的交点,并插入顶点表,对应的顶点索引关系存储在connect数组中。若connect为空则特殊处理。接下来从connect数组中选点开始算法,标记connect数组的元素。回到起始点后,将当前多边形push进结果数组,并寻找下一个未标记的connect,继续算法。最后,将顶点表转换回边表。产生的结果可能有多个多边形,它们将被作为不同的多边形依次被添加。


    0  留言 2019-06-19 13:10:14
  • Palette-based Photo Recoloring论文算法重现

    一、使用方法直接打开index.html从相册中选择合适图片上传,程序将自动计算调色板。待计算完成,可点击调色板编辑变换的目标颜色。编辑完后,点击CONFIRM按钮开始重着色。
    二、算法实现2.1 调色板计算
    将RGB颜色空间均匀分成$16\times 16\times 16$个bins,统计图像中属于各个bin的颜色个数。每个bin的RGB空间均值为其代表色 (注: 原文为Lab空间均值,但求该均值较复杂,故使用了差别不大的RGB均值)。
    对bin进行聚类,使用的方法是改进的K-means算法。
    在聚类前,规定黑色为调色板颜色之一,这样可避免生成的调色板中有很多暗色。
    将聚类得到的调色板颜色按照Lab亮度升序排序。

    2.2 重着色
    单个的颜色变换可以看成颜色在L通道与a、b通道单独变换的组合。
    L通道的变换由对调色板亮度线性插值得到。
    ab通道的变换(左下图)由颜色在Lab空间内平移得到。其中对于超出Lab边界的情况做了特殊处理
    一组颜色变换可以看做是若干个单独颜色变换的组合(右下图),文章给出了使用径向基函数分配权重的方法:

    $$f(x)=\sum_i^k \omega _i(x) f_i(x)$$ $$\omega _i(x)=\sum_j^k\lambda_{ij}\phi(\parallel x-C_j\parallel)$$ $$\phi(r)=e^{-\frac{r^2}{2\sigma_r^2}}$$ <div style="text-align:center"> <img src="img/report/p1.png" height=200>   <img src="img/report/p1.png" height=200> </div>
    三、主要函数及说明


    函数
    位置
    说明




    Color.lab2rgb(InputColor)
    color.js
    将RGB颜色转换为Lab颜色($RGB\to XYZ\to Lab$)


    Color.rgb2lab(InputColor)
    color.js
    将Lab颜色转换为RGB颜色


    Color.labBoundary(pin, pout)
    color.js
    在Lab空间内,求颜色pin与pout连线与Lab边界的交点(二分查找)


    Palette.palette()
    palette.js
    统计图像颜色属于各个bin的颜色个数


    Palette.kmeansFirst()
    palette.js
    聚类,由统计好的bins数据得到调色板


    Palette.kmeans()
    palette.js
    调整上一步聚类得到的颜色,直到调色板不再变化


    Palette.colorTransformSingleL(l)
    palette.js
    根据调色板颜色亮度,确定新图像亮度的变化


    Palette.colorTransformSingleAB(ab1,ab2,L,x)
    palette.js
    在Lab空间某一亮度的层内,根据论文方法,由$ab1\to ab2$这一对颜色变换,对x做a、b通道的颜色变换


    Palette.colorTransform(colors1,colors2)
    palette.js
    综合几组颜色变换的结果,得到新的图片



    Gallery<div style="text-align:center"><img src="img/gallery/p1.png" height=400><img src="img/gallery/p2.png" height=400></div><div style="text-align:center"><img src="img/gallery/p3.png" height=400><img src="img/gallery/p4.png" height=400></div>---<div style="text-align:center"><img src="img/gallery/p5.png" height=400><img src="img/gallery/p6.png" height=400></div><div style="text-align:center"><img src="img/gallery/p7.png" height=400><img src="img/gallery/p8.png" height=400></div>---<div style="text-align:center"><img src="img/gallery/p9.png" height=400><img src="img/gallery/p10.png" height=400></div>
    0  留言 2019-06-18 13:31:52
  • 基于C语言的操作系统

    项目目的
    通过参考、修改源码模块,实现自己的OS模块,加深对系统底层的认识
    理解汇编语言与底层硬件的交互

    开发环境
    操作系统:Ubuntu 14.04
    虚拟机:Bochs
    编辑器:Vim
    编译器:GCC

    任务描述修改或者重新实现参考源码的一个或多个模块
    系统界面

    实现细节重构alloc_imap_bit()与alloc_smap_bit()int alloc_imap_bit(int dev)//为新文件分配位置int alloc_smap_bit(int dev,int nr_sects_to_alloc)//为文件内容分配扇区空间由于上述两个函数功能相似,可合并为一个函数,故重构,以减少重复代码。将上述两个函数重构为:
    int alloc_ismap_bit(int dev,int nr_sects_to_alloc)其中原来两个函数的第一参数相同,故保留;而<code>alloc_imap_bit()</code>不含第二参数,且<code>alloc_smap_bit()</code>的第二参数<code>nr_sects_to_alloc//要求分配的扇区数</code>不应为0,故合并后的函数保留两个参数,当<code>nr_sects_to_alloc</code>为0时转入相应代码段实现<code>alloc_imap_bit()</code>的功能,不为0时转入相应代码段实现<code>alloc_smap_bit()</code>的功能。由此实现两个函数的合并。
    实现MESSAGE收发自行添加文件任务下的<code>MYFSMSG</code>和磁盘任务下的<code>DEV_MYFSMSG</code>两个MESSAGE。
    在用户进程中调用<code>myfsmsg()</code>,此函数用于收发<code>MYFSMSG</code> MESSAGE。
    文件任务接收<code>MYFSMSG</code> MESSAGE后发送<code>DEV_MYFSMSG</code> MESSAGE给磁盘任务,从而完成一次MESSAGE收发的模拟。
    以下为<code>myfsmsg()</code>函数代码实现,其他相关代码略。
    //myfsmsg()函数代码实现PUBLIC int myfsmsg(){ MESSAGE msg; msg.type = MYFSMSG; send_recv(BOTH, TASK_FS, &msg); assert(msg.type == SYSCALL_RET); return msg.FD;}下图为文件系统测试用户进程:
    其中<code>MyFSmsg gets fd=0</code>为MESSAGE收发的测试输出,其余为文件系统创建、打开、读取、删除的测试输出。

    输出磁盘信息获取<code>hdinfo[]</code>数组,根据<a href="http://read.pudn.com/downloads97/ebook/399380/ata_atapi-6.pdf" target="\_blank">ATAPI-6文档(P115 Table-Identify device information)</a>,分别取出<code>hdinfo[]</code>数组多个元素;其中,元素为十六进制,每一位(0或1)表示不同的属性,需要通过与运算(&),提取各位的值,判断0或1,据此来判断磁盘特性,并打印输出至显示屏。
    示例如下:
    int capabilities = hdinfo[49];printl("Timer values supported: %s\n",(capabilities & 0x2000) ? "Yes" : "No");下图为输出节选:

    修改屏幕滚动机制源代码中,屏幕由<code>SHIFT + UP/DOWN</code>来控制屏幕信息的滚动,但是在修改中发现,如果屏幕打印信息超过一定行数时,较早打印的信息将会被清空;通过直接修改代码中<code>SCR_SIZE</code>的值,使屏幕能够容纳更多的信息,而不用担心被清空。
    其他改动美化了输出界面,使得各部分测试输出更加易于辨认,结构清晰。修改了console相关的部分参数和常量,保证系统正常显示输出。修改了Makefile与bochsrc,保证系统运行。
    0  留言 2019-06-17 16:20:51
  • 基于JAVA的葫芦娃小游戏

    1. 效果展示开始

    结束(小喽喽获胜)

    2. 主要设计理念
    Main函数是一个创世纪的过程,到目前为止,一共产生了排序调度者和战场调度者两个上帝
    葫芦娃受老爷爷指挥,蝎子精以及小喽喽受蛇精指挥,而所有一切都是继承一个生物类
    战场抽象为一个类,分别由老爷爷和蛇精排布双方阵形
    战斗本身由战争调度(BattleScheduler)者掌控
    战斗开始,葫芦娃呈现直线分布,蛇精则指定野怪则随机排布,也可以指定阵法排布,使战斗更具观赏性
    战斗中老爷爷没有任何作战能力,但他能够在葫芦娃全部阵亡的情况下随机复活一个葫芦娃,而蛇精的基本作用就是排阵并为小喽喽添加战斗力
    当然在战斗过程中双方也不是一味往前冲的莽夫,葫芦娃和小喽喽并不是直冲冲的冲向对方阵营,而是似冲非冲,似退非退,因为在游戏设计中并不是将某个葫芦娃指定某个小喽喽作为对手,这其中添加了随机算法使得每个葫芦娃只有在轮到他动的时候才能知道他这一轮的对手;这样一来战斗就会具有观赏性,结束双方就像在打太极一样,以守为攻,以攻为守;另外,当有葫芦娃死之后,其他的葫芦娃本着为兄弟报仇的想法,战斗力会大增,就会大杀四方的场面
    考虑游戏的公平性,通过多次试验修改参数,使得葫芦娃和小喽喽获胜的概率基本相等
    阵法方面,葫芦娃阵营以不变应万变,小喽喽方面,因为数量众多,不安排阵法的话容易在战场上出现人挤人的现象,也就是某个小喽喽会被四周的同伙挤得无法移动的现象,这种情况是我们不希望出现的,所以为小喽喽安排了阵法,并且根据数量不同,会自动分配不同的阵法
    单元测试,测试葫芦娃按颜色排序,按排名排序是否正确

    3. 运行说明项目打包生成jar文件可以在命令行下通过执行”java -jar XXX.jar”命令执行。
    程序运行后按下键盘的”S”键位,可以开始一场新的战斗,会更具打斗日期自动生成一个文件记录本次战斗的数据;如果在程序运行后按下键盘上的”L”键位,就会执行复盘功能,我们可以通过一个对话框选择之前存储的一场战斗数据载入战斗过程。
    4. 代码设计world包

    creature包

    5. 面向对象机制5.1 继承考虑到蛇精,蝎子精,葫芦兄弟等具有某些相同的属性,如名字,位置,动作等等,所以创建一个基类Creature,便于后期添加各种操作手段;
    public class Creature{ } class Grandpa extends Creature{ } class Calabash extends Creature{ } class Soldier extends Creature{ } class Snaker extends Creature{ } class Crab extends Creature{ }
    5.2 封装BattleField类表示战场,对外隐藏战场大小,只对外提供InitField,PrintField等方法进行初始化战场以及输出战场信息的功能
    5.3 静态成员的使用因为整个程序背景中出现的生物都是唯一的,所以只支持一次创建,也就是说之后的所有操作都是在已有的成员对象上进行操作,所以在Creature类中定义了这些静态成员使得在第一次调用Creature类时,这些静态成员就已经创建,后面就不需要再进行单独创建了。
    public static Calabash calabash[] = new Calabash[7];static Random p = new Random();public static int num = p.nextInt(15);public static Soldier soldier[] = new Soldier[num];public static Grandpa grand_pa = new Grandpa();public static Snaker snaker_ = new Snaker();public static Crab crab = new Crab();
    5.4 泛型 private List<Soldier> soldiers = new ArrayList<Soldier>(); private List<CalabashBrother> calabashbrothers = new ArrayList<CalabashBrother>();
    5.5 注解自定义一个注解类用来标记编程过程中需要特别注意的代码片段。
    @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface Notice{ String message(); int getposition(); }
    5.6 文件IO在生成战场阵型的时候,实际上是在外部文件中存了对应的阵型表示,所以需要某个阵型的时候只需要读取外部的文件即可:
    public String read() throws IOException{ BufferedReader in1 = new BufferedReader(new FileReader(name)); String s; StringBuilder sb = new StringBuilder(); while((s = in1.readLine()) != null){ sb.append(s + '\n'); } in1.close(); return sb.toString(); } public void setIn() throws IOException{ in = new DataInputStream(new ByteArrayInputStream(read().getBytes())); } public char charFromInput() throws IOException{ while(in.available() != 0) return (char)in.readByte(); return '!'; }
    另外,在记录战斗和复盘战斗的时候也添加了文件IO功能:
    SAXReader reader = new SAXReader();File file = new File(Open_World.filename);Document document = reader.read(file);Element rootElement = document.getRootElement();Element round = rootElement.addElement("live");round.addAttribute("position_x", ""+p.get_x());round.addAttribute("position_y", ""+p.get_y());OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);writer.write(document);
    5.7 关于多线程在游戏中,除了每个生物具有一个线程之外,战场,回放的实现都是通过线程,每个生物体在自己的run函数里面都定义了下一步该走向何处,如果碰到敌人该如何根据能力值判断存活与否,相应的在该位置上应当画上谁的尸体;另外需要注意的是,因为战场是个灵临界区,所以同时只能将允许一个线程单独访问,所以会出现这样的一种可能,当某个生物线程进入临界区,它本身可能已经在其他的线程运行中被kill,所以在每个线程进入临界区时做的第一件事就是判断自己被kill了没有:
    if (cb.dead) { if(cb.getNo() == 1) return true; //else return false; }
    线程终止方法,只有本身被kill或者己方阵营胜利:
    if (battlefield.MsDeadAll()) { System.out.println("Calabash Win!"); writeWinXML("Calabash"); Open_World.paintCalaWin(); return false;
    5.8 战斗记录与回放在战场初始化的时候就会自动生成一个.xml文件,文件名是根据运行时的实时时间命名的,所以文件不会重名;
    新建文件后在之后的每一步里,都会记录葫芦娃或野怪的数值信息和状态信息:
    private static void writeWinXML(String name){}private static void LiveXML(Position p){}private static void writeDefeatScopionXML(CalabashBrother c,Scorpion s, int soldierIndex,int num, int num2){}private static void writeDefeatXML(CalabashBrother c,Soldier s, int soldierIndex,int num, int num2){}private static void writeMoveXML(Position old,Position newx,String name){}
    上述函数分别记录生物不同动作对应的写xml文件;

    6. 结语通过这学期的Java课学习,我印象最深的就是万物都是对象,在面向对象的编程中,不断探索事物之间的联系,使其更真实的反应在代码中,此外,学到了很多关于java的新知识,学期初对java的认识仅仅停留在c++面向对象的认知,经过一个学期的学期,无论是从书上还是课上,使我对java有了一个新的认知。
    1  留言 2019-04-10 22:45:30
  • 基于JAVA实现的农夫过河问题

    1 题目要求一个农夫带着一只狼,一只羊和一个白菜,身处河的两岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开。请求出农夫将所有的定西运过来的方案。
    最终的状态表描述出来就可以了。
    测试与运行
    使用状态表,程序应在屏幕上得到如下表所示的结果。

    2 设计思路利用九个硬币的原理,设计农夫过河问题
    类图

    3 测试
    测试环境

    Windows10JDK1.8IDEA2017.2
    测试结果

    1  留言 2018-12-06 16:46:49
  • 基于JAVA的线性表、树、图的操作和演示

    1 设计题目实现接口MyList,抽象类MyAbstractList、基于顺序存储线性表MyArrayList、基于链式存储的线性表MyLinkedList。实现方式如下:

    给出MyArrayList和MyLinkedList操作的动画演示,如下图:

    实现栈MyStack和队列MyQueue。实现方式如下:

    给出MyStack和MyQueue的动画操作,如下图:

    2 设计思路逻辑结构
    题目中用到了线性表,队列等线性结构,和树,图等非线性结构。
    储存结构

    数据元素自身值的表示(数据域)
    该节点与其它节点关系的表示(链表)

    两种基本的存储方法

    顺序存储方法(顺序存储结构)
    链接存储方法(链式存储结构)

    同一种逻辑结构可采用不同的存储方法(以上两种之一或组合),这主要考虑的是运算方便及算法的时空要求。
    分别为version1,2的类图

    3 测试
    测试环境

    Windows10JDK1.8IDEA2017.2
    测试1:线性表



    测试2:linkedList


    测试3:StackGui


    测试4:Queue


    测试5:二叉树


    0  留言 2018-12-06 17:36:58
  • 基于C语言实现的关键字检索系统

    1 项目简介建立一个文本文件,文件名由用户用键盘输入,输入一个不含空格的关键字,统计输出关键字在文本中的出现次数。
    2 项目功能要求本项目的设计要求可以分成两个部分实现:首先建立一个文本文件,文件名由用户用键盘输入;然后输入一个不含空格的关键字,统计输出该单词在文本中的出现次数。
    3 具体实现3.1 数据结构:// 检索表vector <pair<string, int> > Search;
    3.2 函数// 统计函数void Count(const string & temp);
    4 算法分析对文本进行一次从头到尾的遍历,建立一个检索表,表为线性表。表内有两个元素,一个为单词字符串,另一个为对应的该单词数量。之后在键入查询字段之后,只要遍历检索表即可,不再需要从头到尾遍历文本,大大缩短查询时间。
    5 程序截图开始界面

    文本键入界面

    查询界面



    6 体会在这道题里我做了一个类系字典的数据结构,但我认为这道题最优的方法应当是使用哈希算法但是由于输入内容的大小不可控,所以我感觉有难度,无法实现就老老实实建立了一个搜索表。在查询过程中线性表的顺序遍历并不是很快,但相对于每次输入都需要从头到尾遍历文本,已经是大大的提升了。
    2  留言 2018-11-24 10:14:26
  • 基于C++的物资管理系统的设计与实现

    一 需求分析程序需实现以下功能:

    新物资信息录入(编号、名称、库存)
    查询已录入的所有物资信息(编号或名称为索引)
    添加物资信息(编号或名称为索引)
    领物资并生成领料单(编号或名称为索引)
    浏览领料单或物资库存清单
    物资信息保存,创建格式化文本

    二 程序设计程序流程图如下所示:


    三 程序实现3.1 开发环境
    Windows XP
    Microsoft Visual C++ 6.0

    3.2 程序结构3.2.1 函数头#include <iostream.h> //包括cin , cout , 等函数 #include <string.h> //包括 类,对象,数组,等函数定义#include <fstream.h> //包括 文本文档的读/写/复制 等函数#include <stdlib.h> //包括 exit等函数
    3.2.2 主函数void main ()
    3.2.3 子函数void Entering(fstream); //新物资信息录入void Inquire(fstream); //单一物资查询void Append(fstream); //旧物资的添加void Getthing(fstream); //领物资void Showthing(fstream); //领料单及库存清单void CreateTxt(fstream); //物资信息生成
    3.3 关键类与函数实现3.3.1 物资类建立一个物资类,功能模块为成员函数,物资信息为私有成员,封装性得到保证,其中,ID[10]用来存放物资编号,thingname[40]用来存放物资名称,sum是物资库存量。
    class Material {public: void Entering(fstream); //新物资信息录入 void Inquire(fstream); //单一物资查询 void Append(fstream); //旧物资的添加 void Getthing(fstream); //领物资 void Showthing(fstream); //物资库存清单 void CreateTxt(fstream); //物资信息保存private: char ID[10]; char thingname[40]; long sum;};
    3.3.2 录入函数函数开头和结尾都使用system(“cls”)清除所有显示的信息。
    fs.write((char*)this,sizeof(Material));
    将新物资信息持续录入到文件中储存
    在for()中镶嵌if语句,输入choice,if(choice==0)break;退出信息录入
    返回主菜单
    3.3.3 查询函数考虑到使用时不可能记得所有物资编号,所以运用了2种查询方式,包含按名称查询和按编号查询2种模式查询,实用性更高一点。
    在for语句中内嵌switch语句,进行选择操作,
    do { fs.read((char*)this,sizeof(Material));}while(strcmp(thingname,name)!=0&&fileend!=fs.tellg());
    当输入物资名称与保存在文件中的物资名称不同时,程序将文件中的信息写入内存中。
    每次将信息读入内存后读指针后移,不断移动后,当输入要查询的物资名name与文件中保存的物资信息名称相同时,输出物资信息到显示器上。
    按编号查询功能同上。
    3.3.4 添加函数同样运用2种模式进行添加(按名称进行添加,按编号进行添加)
    在该功能模块中
    do { fs.read((char*)this,sizeof(Material));}while(strcmp(thingname,name)!=0&&fileend!=fs.tellg());
    当输入物资名称与保存在文件中的物资名称不同时,程序将文件中的信息写入内存中,当名称相同时就输出物资的信息(相当与库存多少),而后cin>>num,当num正确时,就添加物资库存数量。
    完成一次添加操作后,
    fs.seekp(-long(sizeof(Material)), ios::cur ); // 指针复位fs.write( (char *)this , sizeof(Material)); // 写入文件cout << "现库存量:"<< sum<< endl;
    将写指针复位,将实行了添加的物资信息重新写入到文件中,同时显示已添加物资的库存信息,确保已经完成添加工作。
    按编号添加功能模块大致同上
    3.3.5 领物资函数do { fs.read((char*)this,sizeof(Material));}while(strcmp(thingname,name)!=0&&fileend!=fs.tellp());
    将物料信息读取到内存中
    if(strcmp(thingname,name)==0)
    当输入的物资名称和已报存的物资名称相同时,领取物料,减少库存
    outfile<<"第"<<i<<"次:\t"<<"领取"<<thingname<<"数量: "<<num<<" "<<"库存:"<<sum<<endl;
    将领料记录用outfile输入到”领料记录文件”中,方便领料单的查询。
    将领料之后的剩余库存信息重新保存到物资库存清单中,修改实际库存量。
    编号查询模式大致功能代码同上。
    3.3.6 库存清单及领料单函数该函数包含领料单浏览和物资库存清单浏览2个模块。
    模块1:领料单浏览
    char s[1024];while(fh.getline(s,1024)) cout<<s<<endl;
    fh.getline从领料记录文件中持续读取一行字符存放到内存s[1024]中,然后将领料记录完全展示在显示器上,实现领料单的浏览。
    模块2:物资库存清单浏览
    将读指针移动到“物资库存清单.dat”文件的开始,然后用do..while及成员函数read将“物资库存清单.dat”中的物资信息全部读取到内存中,而后逐个输出到显示器上,实现物资库存清单的浏览。
    3.3.7 信息生成函数从二进制文件“物资库存清单.dat”中读记录,不断将信息导入到ASCII文件“物资信息文本”中,可以直接查看物资信息。
    ASCII文件“物资信息文本”建立成功。提示是否查看,输入指令,运用getline函数将信息读取到内存,展示到显示器上,实现对物资信息的保存,创建格式化文本。
    四 程序运行主菜单如下图所示:


    物资添加功能 选中后,可以选择2种物资添加模式(按编号或名称添加),而后输入要添加的物资的编号(或名称),即可显示该物资现有信息,输入需要添加的数量,即添加成功;添加成功后可以选择继续添加或是返回上一级菜单
    物资领取功能 选中后,可以选择2种物资领取模式(按编号或名称领取),而后输入要领取的物资的编号(或名称),即可显示该物资现有信息,输入需要领取的数量,即领取成功,同时保存领料记录;物资领取成功后,可以选择继续领取物资或是返回主菜单
    库存清单和领料单功能 选中后,输入要显示的模块(库存清单或领料单);完成物资库存清单或领料单的显示后,可以选择继续或是返回主菜单
    物资信息生成功能 选中后,程序会显示物资信息文档保存成功,是否查看(可选择是否查看);完成该功能模块后,以选择继续或是返回主菜单
    退出程序 选中后,按任意键,退出程序

    五 参考文献《C++程序设计(第二版)》 谭浩强 编著
    3  留言 2018-10-19 14:40:42
  • 基于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 系统分析的原则通过对系统各个功能的分析过程中,必须遵守以下原则:

    实用性原则。功能必须实用,不能存在不使用的功能点。可靠性原则。数据库和数据服务必须严格设计,保证数据的安全和实时。可扩展性原则。系统必须存在标准接口,保证读其他系统的服务支持和本系统的扩展。
    2.3 系统需求分析需求分析指对所开发系统的基本功能和用户功能进行需求获取、分析、总结的过程,需求分析的完整性直接关系所开发系统的功能完善度和系统的开发难度。如果分析出的需求不是用户最终所需要的,那么开发工作等同于白做,而且会面临多次的需求变动和代码重构或重写的复杂情况;而需求分析不足则会导致用户对所开发系统不满意,还会导致一些功能有缺失或者部分错误,这些都是很严重的错误,将会导致整个系统的开发过程缓慢和交付困难。
    系统分析首先应该从系统基本功能着手,对系统的基本功能做详细的分析,建立开发模型并优化;在此基础上,即可对用户进行需求调查,获取用户的业务需求,对用户的业务需求进行分析整理,进行开发建模;最后将系统的基本功能模型和用户业务模型进行合并和优化,确定整个系统的开发模型和交付要求。
    首先,进行在线评测系统的系统功能需求分析。下面是关于系统功能的需求:

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

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



    属性名称
    数据类型
    是否为空
    是否主键
    说明




    id
    bigint


    题目编号


    title
    nvarchar(MAX)


    标题


    describe
    nvarchar(MAX)


    题目描述


    input
    nvarchar(MAX)


    输入


    output
    nvarchar(MAX)


    输出


    sample_input
    nvarchar(MAX)


    样例输入


    sample_output
    nvarchar(MAX)


    样例输出


    fg_special
    nvarchar(MAX)


    是否为特别题目


    hint
    nvarchar(MAX)


    提示


    source
    nvarchar(MAX)


    来源


    in_date
    datetime


    创建时间


    time_limit
    int


    时间限制(ms)


    memory_limit
    int


    空间限制(kb)


    defunct
    bit


    是否屏蔽


    difficulty
    nvarchar(MAX)


    难度


    uploader
    bigint


    上传用户



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



    属性名称
    数据类型
    是否为空
    是否主键
    说明




    id
    bigint


    用户编号


    username
    nvarchar(MAX)


    用户名


    password
    nvarchar(MAX)


    密码


    email
    nvarchar(MAX)


    邮箱


    submit
    bigint


    提交次数


    solved
    bigint


    通过次数


    regtime
    datetime


    注册时间


    accesstime
    datetime


    最后访问时间


    regip
    nvarchar(MAX)


    注册时IP


    accesstp
    nvarchar(MAX)


    最后一次登录IP


    defunct
    bit


    是否屏蔽


    school
    nvarchar(MAX)


    学校


    id_language
    int


    默认使用语言



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



    属性名称
    数据类型
    是否为空
    是否主键
    说明




    id
    bigint


    运行编号


    id_problem
    bigint


    题目编号


    id_user
    bigint


    提交人


    time
    datetime


    运行时间


    memory
    bigint


    运行内存


    id_language
    bigint


    语言


    createtime
    datetime


    提交时间


    result
    int


    运行结果


    id_contest
    bigint


    所属竞赛


    num
    int


    竞赛序号



    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.
    致谢时光荏苒,白驹过隙,大学四年就这样过去了,回想四年的大学时光,有欢快的玩耍,有勤奋的学习,体验过考试前的抓耳挠腮,也享受过熬夜写程序的夜晚,大学四年给了我很多,让我学习到了很多计算机相关的技术和知识。在此向陪伴我度过四年的小伙伴们致以衷心的感谢,谢谢你们给了我美满的大学时光。
    忘不了上课时您的谆谆教诲,忘不了您实验时认真的眼神,更忘不了您在课堂上为了活跃气氛说的让我们睡意全无的笑话。大学四年,我从你们那里汲取到了慢慢的知识,我将带着这些知识和您交给我的做人品德去社会上生根发芽,谢谢计算机与信息工程学院的领导和老师们给我们提供如此好的学习环境,更要谢谢陪伴我四年的大学老师,是你们给了我在社会上可以立足的知识。
    在我三年的软件开发时间中,是您带着我们接触一个个项目,是您带着我们去和客户讨论需求,是您在我们没有士气的时候给我们打气,让我们振作起来。三年的软件开发,我从中学到了很多。在这次毕业设计过程中,您细心的指导我的设计思路,对我提出的问题,您也是很快就给出正确的答案。
    学习是无止境的,在计算机编程技术开发的道路上,还有很长的路要走,我会带着你们给我的所有快乐和知识继续努力,来回报你们。
    3  留言 2018-09-26 17:16:05

发送私信

越是憧憬,越要风雨兼程

13
文章数
9
评论数
eject