分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020

资源列表

  • 基于WPF实现的简单绘图工具

    1、系统功能设计
    开发、测试环境

    开发环境: Visual Studio 2012 Premium运行框架:.net framework 4.5测试环境:Windows 8.1、Windows 7
    开发语言

    C#XAML

    1.1 前言当初选择这么一个软件来编写纯粹是出于对玩弄文字游戏的xx管理系统的不喜,但我们没有料想到,经实践表明,涉及实时跟踪鼠标键盘事件和实时绘图的软件编写难度远大于主要通过文字实现信息交互的xx管理系统。仅仅实现一个屏幕上图形的框选功能就让我改了六七遍代码,我的队友更是间断地找出了五个bug。当终于能够把整体功能流畅地实现时,我们对软件开发者的了解与敬意又加深了一层。
    1.2 总体功能描述当今图像处理越发普及,人们对于图像处理的需求也各不相同。而一些绘图软件存在过于复杂(如PS)或是只具备基础功能(如windows自带画图)的问题,因此我们开发一个基于Windows Presentation Foundation(WPF)的简单绘图工具。
    以下为程序的工作界面

    1.3 功能点说明


    功能类型
    功能点名称
    按键
    实现方式
    功能点描述




    基本功能
    主流类型图片载入
    Ctrl+O
    自己编写C#代码
    支持.png.jpg.gif.bmp.eps等主流图片类型的读入和加载。使用C#标准OpenFileDialog对象获得文件路径并且使用Uri读入之后转为BitmapImage,用Image控件显示


    基本功能
    图片保存
    Ctrl+S
    自己编写C#代码
    支持bmp(位图)和eps(矢量图)两种格式。使用SaveFileDialog对象获得文件路径之后用filestream输出。


    基本功能
    鼠标手绘图形
    鼠标拖框
    自己编写C#代码
    包括矩形、圆角矩形、圆、椭圆、直线、贝塞尔曲线等


    基本功能
    单击选择图形
    鼠标单击
    自己编写C#代码
    调用类接口SelectPoint来实现


    复杂功能
    框选图形
    鼠标拖框
    自己编写C#代码
    递归调用类接口SelectRect来实现


    复杂功能
    全选图形
    Ctrl+A
    自己编写C#代码
    调用类接口SelectAll来实现


    复杂功能
    多次选中图形
    Shift+鼠标拖框
    自己编写C#代码
    调用类接口MergeComposite来实现


    复杂功能
    被选择图形的闪烁

    自己编写C#代码
    通过来回设置选择的CompositeGraphic的isVisible属性来达到闪烁的目的。


    复杂功能
    删除图形
    Delete
    自己编写C#代码
    调用类接口Clear来实现


    复杂功能
    图形状态变更

    自己编写C#代码
    设置类属性DrawMode来实现。可以设置图形的边框粗细、颜色,以及内部颜色


    复杂功能
    调色板

    使用第三方库
    支持通过ARGB属性或是在图形中直接选色的方式给图形的边框和填充分别选色


    复杂功能
    拖动图形
    鼠标按住拖动
    自己编写C#代码
    调用类接口Move来实现


    复杂功能
    键盘移动
    Up,Down, Left,Right
    自己编写C#代码
    通过长按可快速移动


    复杂功能
    剪切选中图形
    Ctrl+X
    自己编写C#代码
    将选中的图形加入一个List,并从画布上删除选中的图形


    复杂功能
    复制选中图形
    Ctrl+C
    自己编写C#代码
    将选中的图形加入一个List,但不从画布上删除选中的图形


    复杂功能
    粘贴图形
    Ctrl+V
    自己编写C#代码
    对上述List中的所有成员递归调用接口 ICloneable.Clone。长按Ctrl+V可以连续粘贴


    统计功能
    图形个数统计

    自己编写C#代码
    递归调用类属性Count并将它和Label绑定


    用户体验优化
    打开和新建图片、关闭程序时的友情提醒。

    自己编写C#代码
    防止误删未完成画布中的内容。


    用户体验优化
    显示系统时间

    自己编写C#代码
    使用DateTime.Now.ToString方法


    错误处理
    载入图像时对不支持图像及无法处理的图像的抛出。

    自己编写C#代码
    若捕获异常,会弹出对话框



    2、系统总体结构2.1 概要设计按照“面向接口编程,而不是面向实现编程”的面向对象基本原则,在建立解决方案的时候我就将解决方案分成了Ccao-big-homework(UI,WPF工程项目,由我的队友邵键准同学实现,调用者)和Ccao-big-homework-core(实现,C#类库,由我实现,被调用者)。双方互不干涉,独立调试,在整个大作业过程中不曾因为接口耦合问题出现bug。
    由于采用了多种科学合理的设计模式(见下文各模块介绍),本类库在维持良好的可复用性的同时,不曾进行过任何强制类型转换,不曾进行过任何运行时类型判定,所有的多态都靠重载函数来实现,充分体现了面向对象的思想。
    3、具体实现3.1 GUI的设计GUI的设计采用了较为简洁的风格,设计完成后曾请求周边同学进行体验并对细节进行改进,力求用户体验较好。主体采用XAML语言,实现设计和功能的分离,并配之以C#的事件处理函数。程序取消了不怎么美观的窗口边框,并采取点住程序窗口任何一个位置均可拖动的方法。
    3.1.1 程序启动和关闭动画设计程序的主要窗口在开始和结束时都是通过淡入和淡出来呈现和销毁窗口,实现此效果使用了一个计时器,并让窗口的透明度随计时器而改变。下图为启动过程截图,可看见窗体还是半透明状态(请无视背景的代码)。
    3.1.2 程序启动界面的设计界面包括版本号与开发人员,“新建绘图”按钮在鼠标移上后会有高亮,点击进入绘图页面,点击“离开”按钮则直接调用Application.Current.Shutdown()函数销毁窗口。
    3.1.3 程序主体绘图界面设计主体绘图界面如下。

    上部为菜单栏,具体按钮功能见使用手册,实现了鼠标移到某个按键上时该按钮闪烁一次并且放大,同时调整整个工作框的布局。效果如下。

    左部为绘图框,选择后可使用鼠标绘制不同的图形,包括直线、圆、椭圆、正方形、长方形、贝塞尔曲线。其中贝塞尔曲线限于WPF提供的贝塞尔曲线构造函数的局限性,其必定从画布的左上角开始绘制。
    左下角为一个图标,无实际作用。
    3.1.4 程序图标的添加我们的程序可是有图标的哦!

    下面是调色板的图标。

    3.2 逻辑层主要实现解决方案Ccao-big-homework。
    3.2.1 工作窗口WorkWindow部分3.2.1.1 概述主要实现人与程序的交互,包括鼠标事件和键盘事件等。由于绘图软件基本是在一个窗口进行操作,一般使用组合而非继承的方式,因此类的结构比较扁平。类图如下。


    由于没有继承,全部实现在一个窗口里代码显得非常臃肿,因此我根据功能的不同将同一个窗口类分成了如下几个文件。

    下面逐步介绍各个文件实现的方法。
    3.2.1.2 BtnEvent实现菜单栏所有按钮功能,包括新建、打开、保存、退出、全选、复制、剪切、粘贴、样式选择按钮。实现方法是调用其他文件里的私有函数。
    3.2.1.3 FileEvent实现图片读写的相关方法。我们的程序支持使用文件夹视图来把文件保存到计算机的任意位置或是从计算机任意位置载入图片。同时还在现有图片未保存时弹出对话框提示用户要保存,防止了图片的误删,优化用户体验。

    实现画布的新建与刷新,并实现程序的退出功能。
    3.2.1.4 FishEyePanel实现上部菜单栏中当鼠标移到某个按键上时该按钮闪烁一次并且放大,同时调整整个工作框的布局。此处采用了组合的形式,FishEyePanel是一个新的类,在WorkWindow类中创建该类的对象,并布局到主窗口上。
    3.2.1.5 GraphicsOperation实现图像整体操作,包括:

    全选:调用队友提供的SelectRect接口,并把范围设置成整个画布大小的矩形,从而得到一个类型为List<CompositeGraphic>的对象,添加到selectedGraphics里
    复制:调用队友提供的Clone()函数,往clonedGraphics这个对象里添加对象
    剪切:复制的同时清空selectedGraphics
    粘贴:将clonedGraphics里的所有成员添加到总画布compositeGraphic的Children()成员中,从而实现绘制,并向右下角移动(10,10),从而和复制的原图区分开,然后清空clonedGraphics(),并再次调用复制函数(),从而实现粘贴的连续性,即复制一次可连续粘贴。下图为按下Ctrl+C后连续按下Ctrl+V的效果


    3.2.1.6 KeyBoard实现键盘的按键监控,包括:

    Ctrl+A:全选图像
    Ctrl+C:复制选中图像
    Ctrl+V:粘贴选中图像
    Ctrl+X:剪切选中图像
    Ctrl+W:关闭程序
    Ctrl+O:打开图片
    Ctrl+N:新建画布
    Ctrl+S:保存图片
    Delete:删除选中图像
    Key Up、Key Down、Key Left、Key Right:选中图像的上下左右移动
    Shift:按住时可多次增加选择已选中的图形

    3.2.1.7 MouseEvent我的工作中最难的部分,而且肩负调试队友代码的使命。

    Window_MouseLeftButtonDown事件:实现鼠标不在画布上时窗口根据鼠标的移动而拖动
    OnMouseLeftButtonDown事件:鼠标左键按下处理事件。主要记录鼠标开始移动的点startPoint,让画布捕捉到鼠标,并标记左侧的ToolBar是否选中rbSelect选择按钮
    OnMouseMove事件:鼠标移动时的处理事件。当鼠标移动且画布捕捉到鼠标的时候,若是发现rbSelect选择按钮被选中且当前有图形被选中且Shift键未被按下,那么说明这个鼠标事件需要的是移动图形,因而用虚直线实时绘制鼠标指示的移动路径;若是其他绘图按钮被选中,则说明要绘制图形,则用虚长方形或是虚直线实时绘制图形
    OnMouseLeftButtonUp事件:鼠标左键抬起的处理事件。首先判断鼠标抬起时和按下时位置是否相同。若是相同,则说明用户只是按了一下,那么不管左侧ToolBar是选中的什么,说明用户都是想选中一个图像,因此将左侧的工具条调整到rbSelect按钮,并且调用总画布compositrGraphic的SelectPoint方法,得到这个点选中的图像,将其加入selectGraphics,在这个List里面的对象,每隔0.5秒更改一次可见性,从外观看来,选中的图形会闪烁。若是鼠标移动了,且选项选中的是图形选项卡,则绘制对应的图形,并且刷新画布,并把之前实时跟踪鼠标的虚线图形删去。接下来判断选项卡是否为贝塞尔曲线选项,若是则把该点增加到贝塞尔曲线的List里,当List里的成员个数增加到4时,绘制一条贝塞尔曲线并清空该List。最后是最为复杂的rbSelect按钮,如果当时选中的图形为0,即selectGraphics为空,则说明用户想要选中他框选的图形,则调用SelectRect得到选中的所有图形,并把其加入selectGraphics中使其闪烁。若selectGraphics不为空,则说明用户想要移动选中的图形,则调用move方法移动选中的图形,并把selectGraphics清空。同时,如果整个过程中Shift键被按下且rbSelect被选中,说明用户想要增加选择图形,于是将选中的图形增加到selectGraphics里面。

    以上方法还各自特判了贝塞尔曲线绘制时的点四个点的情况。
    3.2.1.8 Paint各种图形的绘制,包括:

    直线
    长方形
    正方形

    椭圆
    圆角矩形
    贝塞尔曲线

    其中(1)~(6)的绘制方式基本相同,都是新建一个该图形的对象,然后根据传来的两个点确定图形的长宽和位置,将这个对象添加至总画布compositeGraphic,然后刷新画布。
    对于(7),绘制方式是在画布上点四个点,则出现贝塞尔曲线。
    3.2.1.9 其他零碎功能主要包括一些动画效果。启动时工具条的移入运用了ThicknessAnimation控件。为了美观我特意写了一个函数隐藏了工具条尾部的小箭头。选中图形闪烁的功能则使用了一个DispatcherTimer计时器,每过500ms就把selectGraphics的成员的可见性改变一次。图形个数统计调用总画布compositeGraphic的count属性,每隔0.5秒刷新一次。系统时间标签则使用DateTime.Now.ToString方法获取。
    3.2.2 启动窗口MainWindow部分这个窗口很简单,只实现了弹出WorkWindow和关闭窗口退出的功能。并贴了一张图,写了版本号。
    3.2.3 颜色拾取窗口StyleSettingWindow部分颜色拾取窗口我并没有花太多时间自己写,本来以为WPF自带调色板控件,结果发现没有,于是在网上找了一个扩展控件,并组合到WorkWindow类中,在按下上部菜单栏中的“样式选择”按钮时弹出。

    3.3 类库Ccao-big-homework-core-wpf的实现3.3.1概述。本类库(Ccao-big-homework-core-wpf.csproj)基于WPF,文件统一注释为”Du 2015.9”。

    由于本类库被设计作为实现图形操作的类的类库,所以各类之间比起“is-implemented-in-term-of-a“或者”has-a“来说更符合”is-a”关系,所以本类库大量使用了继承、多态、递归调用这些OO的方法,和UI相比更好的体现了这次大作业的教育目的。

    3.3.2 MyGraphic类基本的图像类。之所以声明为类而不是接口是因为有几个函数要有默认实现。
    下图是Mygraphic类的全部类图。各函数基本都是函数名自解释的,如果一眼看不出来有什么用可以参见源代码的注释。

    乍看上去,Ienumerator和Ienumerable两个接口(包括count,getenumerator,current,add,clear,dispose,reset等,可以使得这个类被像list一样用foreach遍历)看上去都不应该是MyGraphic类作为一个基本的图像类应该有的方法或者属性。事实上这里采用了Composite设计模式。为了使得单个对象和组合对象的使用具有一致性,其他库函数(以及用户)能够统一的使用组合结构中的所有对象(具体来说,使得我们不用在override各种函数的时候来写出诸如MyGraphic g as CompositeGraphic这种效率很低的运行时类型判定代码来),所以在MyGraphic类中定义了Composite类的各种接口,并且给以了默认实现(当然了由于MyGraphic不是CompositeGraphic,默认实现理应是空实现)。
    另外,MyGraphic类还实现了接口ICloneable,这个接口允许MyGraphic被深复制,因而实现了UI的复制-粘贴功能。
    IsVisible指示本图像是否会被画到画布上。
    Father指示MyGraphic类的父图像。Father类的set方法被重写来调用父图像的DisposeChildren方法来删除父图像维护列表中自己的存在。这样就能保证整个MyGraphic类是一棵树(树的顶点是由UI保存的一个Composite,事实上充当了画布的功能),为递归遍历创造了条件。所以同时,当Father被置null的时候,本图形就会因为失去一切引用而被C#的GC机制自动回收,相当于是被Dispose了。因此本程序的效率大大提高,本人的电脑在有1500个图形的时候还能够正常工作。
    SelectError指示点击一个点的时候允许多大的误差以选中一个图形。
    还有不少函数在MyGraphic类中被声明仅仅是为了作为接口被递归调用,例如SelectRect、Count属性等就是这样,当然整个程序中最重要的Draw也不例外。
    3.3.3 SingleModeGraphic类顾名思义,是整个图形有同一个drawmode的类,也是所有基本图形(basic_graphics)的基类。显然composite类由于可以add进各种drawmode的图形所以不可能能维持有同一个drawmode。

    drawmode指示一个给定border的geometry的图形如何被绘制,将调用drawmode的draw方法(见3.3.6)。
    重载了基类的SelectRect方法,当选中时返回包括自己的一个CompositeGraphic,反之返回null。
    getGeometry方法返回这个对象的border的geometry。
    3.3.4 CompositeGraphic类可以包含其他graphic的graphic的实现,或者说用windows画图打比方的话,就是那个选框功能。重载了IEnumerable和IEnumerator接口。

    首先,作为Composite设计模式的一部分,override了MyGraphic中的Composite相关的函数(isComposite, Clear, Add, MoveNext, Reset, Current),进行了事实上的操作。
    CompositeGraphic类维护一个私有的辅助list,用来保存每个成员相对于本体的左上角的相对位置。当CompositeGraphic类要执行某个操作的时候(例如Draw或者SelectRect),它就递归调用每个成员的相应操作,好像这个类不曾存在过一样(如果设置了isCombined = false,当这个标记被置true的时候整个CompositeGraphic将被视为是一个整体,类似于PPT或者Flash提供的“组合”功能)
    另外CompositeGraphic也像SingleModeGraphic一样有drawmode类型的属性backgroundmode,这是为了画出它的边界和背景色。边界总是一个矩形。
    当调用SelectRect的时候,由于递归调用的过程会产生大量很多层的CompositeGraphic(因为selectRect的原理是将所有被选中的图形改为连接到同一个Composite中,然后将这个Composite的父图形设为this),所以设计了MergeComposite,将一个Composite中的全部内容合并到另一个中,减少了递归的层次(在这种设计之下,递归最多两层),有效提高了运行效率。
    3.3.5 基本的图像类(basic_graphics)这些类都继承自SingleModeGraphic并且是Sealed类。有几个属性来记录自己的形状,并且override了getGeometry接口来确定自己的外形。如类图所显示的那样,新建一个基本的图像类是非常简单的,只需要实现getGeometry方法和Clone方法两个方法,并且定义几个足够确定图形位置和形状的属性,就能够被立刻应用到类库之中,像其他图形一样被选择、被移动、被更改颜色、被剪切、被复制、被粘贴,这充分体现了本类库良好的可扩充性。

    对于Ellipse、Line、Rectangle,WPF都提供了相应的Geometry对象来绘画,然而对于Bezier,WPF并没有提供相应的Geometry,而是提供了一个PathSegment——BezierSegment。BezierSegment只有三个参数(也就是说默认从原点开始画),第四个点需要通过设置PathFigure的起始点来确定。
    3.3.6 DrawMode类
    抽象类。指示如何绘制一个Geometry形状的Mygraphic为drawing。这个类其实做成接口也没什么问题。如果深究起来的话把绘图方式单独封装起来似乎也是一种设计模式,学名叫做Strategy模式。Strategy模式的好处也是显而易见的——如果直接将各种绘图方式以硬编码的方式写在SingleModeGraphic中,虽然可以少几个类,但是这意味着你可以在完全不破坏类库的情况下添加新的DrawMode,使得它易于切换、易于理解、易于扩展,进一步体现了作为一个类库的重要理念——可扩充性。(嘛,不过这毕竟只是大作业,虽说类库要可扩充性良好,但是也就我自己扩充我自己的类库玩罢了…但是当我发现WPF的drawing系列图像的构架思想竟然和我一开始手画的类图一模一样的时候,我心中别提有多得意了)
    3.3.7 DrawMode类的派生类
    这些类都继承自Drawmode类并且是Sealed类。有几个属性来记录自己的绘图方式,且override了draw来绘制。
    3.3.8 defaultConstant类
    储存一些常量。在GDI+中有System.Drawing.Color枚举,然而在WPF中似乎没有对应字段,为了方便类库的设计所以作为static readonly变量定义在这里,效果类似于C++的全局const。另外准备了defaultbrush(透明色)和defaultpen(黑色,宽2.0f)来作为GeometryMode的默认构造值。
    由于是常量,所以被作为partial类分散定义在drawmode的各个派生类中。
    3.3.9 DrawingUIElement类
    本来作为一个普适的类库有上面的类就已经能够绘图了;但是我所写的这个类库毕竟是个wpf类库,然而wpf的基本控件Canvas的Children只接受某种System.Windows.UIElement作为它的子成员。所以为了避免推倒重来,此处采用了Adapter(或者叫做Wrapper)设计模式,将本类库的接口类型(System.Windows.Media.Drawing)转换为我的调用方,邵键准同学的UI能够接受的参数UIElement。
    重写了OnRender方法,只要对它调用UIElement所固有的InvalidateVisual方法就能迫使控件重画,从而将drawing指示的画面显示在wpf界面上。
    3.4 类库Ccao-big-homework-core-winform的实现本类库(Ccao-big-homework-core-winform.csproj,并没有被本次大作业引用)是一开始我的队友尚未开始施工的时候编写而成的(文件注释为”Du 2015.8”),当时前期调研做的不够好,没有意识到wpf和winform不兼容,所以手贱就先写了一个winform版。Winform版实现比wpf版要早,Class Diagram也和wpf版类似,几乎所有的类名都一样,只是winform版基于GDI+,命名空间为System.Drawing,而wpf版基于WPF,命名空间为System.Windows。在此对于两个类库之间雷同的部分不再赘述。
    在本大作业中并没有用到winform类库(因为winform的界面远没有wpf美观),但是winform类库在我们往届的测试中证明是可以使用的(见github上9.6晚上的commit,hash为87ce7da,当时有一个基于VB的样例test基于winform测试了这个类库的可行性)。如果有兴趣做winform开发,可以尝试使用这个类库。
    本类库和wpf版的唯一区别在于draw的实现。在wpf版中,draw函数是一个普通的返回System.Windows.Media.Drawing的函数。然而在winform中我们采取的并不是Adapter模式,而是另一种著名设计模式Bridge模式:我们有一个接口IWindow实现drawpath和fillpath两个接口,然后draw函数接受参数IWindow,并在函数体内调用这两个接口进行绘图,没有返回值。这样做的好处在于可以将抽象部分与它的实现分离,使得双方都可以有独立的变化。无论类库将要面对怎样的UI(即便这是个WPF UI甚至是个VB项目,例如我的测试用项目),只要这个UI实现了接口IWindow,类库就可以不作任何修改的应用到这个UI上。
    以下是项目文件列表,除了IWindow外的所有类都和wpf版一样。

    4、项目总结4.1 亮点首先,由于采用了Composite模式,所以几乎所有的Composite接口都是通过递归调用来完成的,简洁明了,体现了合理设计模式的优越性。假使不采用Composite模式,那么(任举一例),SelectRect方法将不得不返回一个list<MyGraphic>,且不说这样子将使得这个类库丧失组合/打散的固有功能,而且返回list将使得对于这个list的每个操作都必须由客户端通过类似foreach MyGraphic g…这样子的调用方式手动对每个list的成员执行。现在只需要调用Composite的对应函数,就能通过递归调用在对客户隐藏的情况下执行了,体现了良好的封装。
    其次,本类库的可扩充性堪称良好。向本类库中加入新的几何图形只需要继承SingleModeGraphic并且重写getGraphic和Clone;向本类库中加入新的绘图方式只需要继承DrawMode并且重写Draw。
    4.2 OOP模式的优越性接口和实现的分离极大提高了我们的开发效率。只需要知道给接口提供什么参数,能得到什么结果就可以了,不需要知道它是如何被实现的,这样的黑箱极大地提高了我们的开发效率。
    4.3 版本控制的重要性版本控制不仅让我们能够清晰地了解自己的开发进度,而且在开发出现重大bug的时候,能够迅速地回滚到以前的版本。这样不会出现自己写了什么挂了都不知道的,结果只好全部删除重来的情况。况且,每一次在Git上的Commit都意味着我实现了新的功能,内心总能感到满足。
    4.4 自主解决困难的能力为了写大作业我估计百度了不下300次,基本开发的状态就是:想实现某功能—>发现自己不会—>百度google大法好—>会了—>实现该功能—>又想实现某功能。
    开发过程中我遇到过很多困难,举个例子:关闭窗口时我写了个淡出动画,结果发现动画刚开始运行就程序就被退出,表现为动画无法播放。百度了一个小时,终于找到解决办法:在给程序的OnClosing事件中,把close命令取消,然后坐等0.6秒动画放完后再退出程序。
    真正到开发程序才发现以前学的都是纸上谈兵,经过一份大作业的洗礼我收获了极大提升的编程技能。
    7 评论 54 下载 2019-04-02 10:31:39 下载需要12点积分
  • 毕业设计选题系统

    摘 要随着在校大学生人数的不断增加,教务系统的数据量也不断的上涨。以往的毕业设计选题是随堂报名。这种方法虽然直接,但是造成选题的盲目性和教务处处理数据的繁重性。为了减轻教务处工作,以及每个学生更好的选择自己所喜欢的课题。针对学生选题这一环节,本系统从学生网上自主选题以及教师的课题发布两个大方面进行了设计,基本实现了学生的在线信息查询、选题功能以及教师对课题信息发布的管理等功能。
    本文通过分析浏览器服务器结构的特点并结合选题的实际情况,提出了基于浏览器服务器结构网上选课系统的基本设计思想,简要介绍了系统各功能模块及数据库的设计,着重讨论了用 ASP.NET技术和SQL Server 数据库设计开发网上选课系统时的数据库访问技术和动态网页制作技术,并给出了部分实现代码。通过该系统,使学生可以方便地进行网上选课。该B/S结构的系统在Windows 10系统和ASP.NET平台下开发完成,使用C#作为ASP.NET的开发语言,SQL Server 2012作为数据库。系统有较高的安全性和较好的性能。其中连接数据库的字符串可以随时在Web.config里修改,并经过编码加密,增加了灵活性,保护了数据库的安全。代码尽量使用存储过程和尽量减少数据库连接的打开时间等手段来提高性能。
    本系统的实现使得网上毕业设计选题简单实用,主要目的是使老师能更好的管理课程设计,也能使学生能更好的把自己想要的课题正确无误的选出来。使处在选题时期的学生能有条不紊的进行。从而加强毕业设计的管理,提高教师的工作效率,降低教师的工作量。
    一、开发背景计算机技术高度发达的今天,利用信息技术对大量复杂的信息进行有效的管理成为一种普遍而实用的手段。一方面,这极大的减少了簿记和人力的开销,另一方面,现代计算机强大的计算能力和网络的普遍部署,大大简化了大量信息的处理和流动。每年毕业临近时,都有优良的毕业生需要进行毕业设计,这其中的首要关节就是课题的选择,以往指导老师都是采用人工手写方式给学生们提供相关的毕业课题提供学生选择,如果指导老师带领的学生比较多,或者是当年毕业的学生比较多,这样就造成学生的毕业课题选择很混乱,指导老师难于统计学生的毕业课题选择情况等一系列问题,基于这些传统问题,我们需要一个能够自动统计,实时分配课题的一个管理平台来帮助学生、指导老师。
    此系统的开发,主要目的是使老师能更好地管理课程设计,也能使学生能更好地把自己想要选的课程准确无误的选出来,使在选择毕业课题时期的学生能有条不紊的进行。
    二、需求分析1、用户基本需求描述下面就对毕业设计选题系统的设计进行需求分析。
    根据系统用户分析各个角色为学生、教师、管理员。
    学生登录系统后,可以修改个人信息,查看所有可选择的毕业设计课题,并且可以执行选题操作,如果学生的选题请求被批准,则不能再重新选题根据需求调查可以得出学生用户在登录系统之后的需求如下:

    查看选题信息:学生在选题之前可以查看教师所提交的所有未被“确选”的课题详细信息
    查看教师信息:学生可以了解到所有教师的详情信息
    选择课题:学生可以根据选题要求自主选择题目,并直接把选题请求提交到教师
    个人信息管理:学生可以修改登录密码以及个人的详细资料

    教师是系统的主要用户之一,他们是毕业设计课题的提出者,并且也是学生选题的最后决定人。教师在登录系统后,可以进行个人资料管理,课题管理以及确认学生选题等操作。根据需求调查可以得出学生用户在登录系统之后的需求如下:

    课题管理:教师可以对添加课题,修改课题描述,以及删除未审核的课题等操作
    学生选题确认:在查看到学生对某一个课题的选题申请和学生详细信息后,可以确定具体的一位学生作为最终完成课题的人。其他同学的选题申请被拒绝后,自动进入到再次选题状态
    个人信息管理:教师可以修改登录密码以及个人的详细资料

    管理员是系统的管理者,包括教务工作管理人员,他们可以添加、管理系统用户信息,可以对课题信息进行管理,并且对系统进行维护。根据需求调查可以得出管理员用户在登录系统之后的需求如下:

    用户管理:可以对系统的用户,包括学生和教师的信息进行查询、添加、修改和删除。同时可以根据不同身份的用户赋予不同的操作权限
    课题管理:对教师提交的课题进行审核,符合相关规定以及要求才能通过;并可以删除不符合相关要求和规定的课题
    选题情况管理:可以查看已选题、未选题以及选题但未被老师通过的学生信息
    基础信息管理:可以添加学校系部以及专业;可以修改系统网站的名称,添加、编辑以及删除系统中的教师所属科研室、教师的职称名

    2、数据流图分析


    3、数据字典数据字典(Data Dictionary,DD)用来定义系统中各成分的具体含义,它以详细、清晰、准确、无歧义的说明为系统的分析、设计及维护提供了有关元素的一致的定义和详细的描述。数据字典是数据库的重要部分,它是数据流图中所有要素严格定义的场所,这些要素包括数据流、数据流的组成、文件、加工小说明及其他应进入字典的一切数据,其中每个要素对应数据字典中的一项条目。






    三、详细设计1、概念模型设计
    2、关系模型设计
    课题 (课题编号,课题名称,课题难度,课题描述,审核状态,审核人,审核时间,教师编号,确定状态)
    用户 (用户编号,密码,有效标识,角色编号,教师编号,学号)
    学生选择课题(课题编号,学号,确定状态,确认时间,解决方案,)
    教师(教师编号,姓名,性别,出生日期,身份证号,教师职称,professionId)
    学生(学号,姓名,性别,出生日期,身份证号,班级,professionId)
    权限 (权限编号,privilegeMaster,privilegeMasterValue,privilegeOperation)
    角色 (角色编号,角色名称,角色排序,角色描述)
    功能模块 (功能编号,功能名称,功能请求路径,功能序号,图标,功能层级,是否有效,功能上级编号)
    专业 (professionId,专业编号,专业名称,departmentId)
    学校系部(departmentId,系部编号,系部名称)

    3、物理模型设计该系统在设计数据库的表的时候,因为考虑到在系统运行时,录入的数据具备一定的意义性,完整性。在设计数据库表时对记录设置数据完整性约束以及参考3NF,对字段设置域完整性、参照完整性、自定义完整性等三类数据完整性。数据完整性约束是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。综合以上条件数据库设计表一共10张表。



    四、系统功能模块说明1、用户登录模块
    功能描述:此模块的主要功能是实现用户登录。用户输入用户名、密码通过系统认证,可登录系统
    输入:用户名、密码
    输出:登录成功进入主界面或者登录失败重新登录

    2、用户管理模块
    功能描述:此模块的主要功能是管理员和用户对信息的管理。用户进行修改资料, 查询资料。管理员添加、修改、删除用户信息
    输入:用户修改和查询资料数据以及管理员添加、修改、删除用户信息
    输出:修改成功或查询成功显示相应数据. 添加成功或者修改成功或者删除成功

    3、权限管理模块
    功能描述:此模块的功能是用来配置权限信息的。管理员对角色和用户进行权限信息的配置
    输入:权限信息配置
    输出:权限配置成功

    4、课题管理模块
    功能描述:此模块的功能是老师设置课题,学生来浏览课题。教师:在系统上报课题,设置课题难度,修改课题,添加课题和删除课题;学生:浏览本专业所有老师上报的可选课题
    输入:教师设置课题难度或者修改课题或者添加课题或者删除课题、学生输入要浏览课题题目
    输出:课题设置成功或者修改成功或者添加成功或者删除成功,浏览相应课题信息

    5、选题管理模块
    功能描述:此模块的功能是管理员审核课题,学生选择课题,教师审核学生选择课题
    管理员:对所有上报课题的内容和难度进行审核,审核通过的课题则为可选课题
    学生:可以以根据选题要求自主选择题目,并直接把选题请求提交到教师
    教师:审核学生所选择的选题
    输入:管理审核课题、学生选择课题、教师审核学生选择课题
    输出:审核通过转入可选课题、选题提交教师审核、审核通过或者审核不通过重新选题

    6、选题情况管理模块
    功能描述:此模块是管理员管理选题情况的。可以查看已选题、未选题以及选题但未被老师通过的学生信息
    输入:管理员查看学生选题情况
    输出:展示学生的各种选题情况信息

    7、基础信息管理模块
    功能描述:此模块是管理员用来对系统基本信息管理的。管理员对科研室、教师职称、系部、专业和修改系统网站的名称
    输入:管理修改各种基础信息
    输出:基础信息修改成功

    五、系统实现1、项目结构
    2、登录界面
    管理员、学生和教师输入正确的账号密码登录系统,进入主界面。
    3、主界面
    管理员登录进入主界面,拥有选题模块、课题模块、权限模块和系统基本信息模块。

    学生登录进入主页面,拥有选题模块、用户模块。

    教师登录进入主界面,拥有选题模块、课题模块和用户模块。
    4、用户管理
    管理员用户对学生、老师和管理员的管理增删改查。

    学生用户对教师的信息进行查询。

    实现对用户自身的信息进行查看和修改。
    5、权限模块
    管理员用户实现对管理员、学生和教师的权限进行分配(添加、修改、删除、查询)。
    6、系统基本信息模块
    管理员用户实现对系部和专业的管理(添加、修改、删除、查询)。
    7、课题模块
    实现对课题的管理(添加、修改、删除、查询),教师只能操作自己的上报课题,已审核的课题无法进行删除和修改。

    管理员用户对教师上报的课题进行管理(审核、拒审),只能审核未被审核的课题,拒审可以将已审核的课题返回到未审核状态(如有学生已选此课题则无法拒审)。
    8、选题模块
    实现对课题的管理(选择课题、取消选择),只能一个课题、如果已选择课题在审核或者已通过状态无法再选择课题、如果课题已审核无法取消选择。

    实现教师用户对学生选择课题的管理(查询课题、审核通过),点击课题排列出所有已选择该课题的学生,右击通过,并为其他未通过学生提供选题方案。符合该课题的学生则选题状态已通过,其余选择该课题的学生则是未通过状态并显示选题方案。
    六、总结我们团队小组经过两周的努力,基本完成了毕业设计选题系统的设计开发。这段时间里,从需求分析到软件编码完成,从中学到了很多知识,不仅让我更深层次的掌握了数据库原理、SQL Server数据库应用、异步交互技术以及项目开发的大致流程,并且结合着软件工程的理论,让我在这次毕业设计中真正懂得了做软件需要的不仅仅是好的思维和编程技巧。更重要的是在调研的过程中,学到了很多实际的业务,并学到对一种业务从不同角度出发考虑,对业务从不同角度处理等。同时也学到将众多的数据进行筛选,后进行分析,对这些数据进行归纳总结,并将归纳的结果进一步变成知识消化。
    开发毕业设计选题系统意在提供一个更方便的选题环境,方便同学选题的同时也便于学校进行统一的教务管理。此系统基本实现了所有功能,从学生选题,教师审核选题,管理员管理选题等,这些都可以在实际中运用。且系统界面友好,易于操作,即使没有使用电脑经验的用户也能轻松上手,快速准确的完成选题等工作。由于时间的仓促,本系统仍有一些有待完善的功能,例如用户查询输入相关信息的中文拼音就能检索出数据以及录入数据界面交互不够快捷,因此还可以进一步完善系统的功能,提供更方便快捷的服务。
    在设计中我们深知自己掌握的知识还远远不够,将掌握的一些理论知识应用到时间中去,总会出现这样或者那样的问题,不是理论没有掌握好,而是光知道书本上的知识是远远不够的,一定要把理论知识和实践结合起来。把学到的知识应用到实践中去,多做多练才可以把理论的精华发挥出来。
    参考文献[1].贾铁军.软件工程与实践[M].清华大学出版社,2016.
    [2].章忠宪.ASP.NET应用程序开发技术[M].机械工业出版社,2014.
    [3].王丹丹,陈康.软件工程技术现状与发展趋势[J].信息与电脑(理论版),2016(6):50-51.
    [4].白尚旺,党伟超.软件分析建模与PowerDesigner实现[M].清华大学出版社,2010.
    [5].王小科.ASP.NET典型模块开发全程实录[M].清华大学出版社,2013.
    [6].福勒.企业应用架构模式[M].北京机械工业出版社,2010.
    [7].任靖.浅析ASP.NET MVC框架开发特性[J].信息记录材料,2018,19(06):46-47.
    [8].毕传林,裴南平.ASP.NET MVC中自定义授权过滤器在软件系统中的应用[J].信息通信,2017(12):136-138.
    1 评论 32 下载 2020-02-08 14:46:01 下载需要15点积分
  • 基于Java的可自定义评教系统设计与实现

    摘 要评教是当今提高教学质量非常重要的方法之一。在互联网时代,评教信息化也是当前发展的趋势,相比传统的评教形式,在线评教系统具有准确,及时,成本低等众多的优点。通过对当前一些评教系统的调研发现普遍存在着指标单一,权重平均,统计简单等不足。并在此基础上设计并实现了可自定义评教系统来提高教学评估的效果。
    本文主要研究如何来设计和实现使用灵活的可自定义的评教系统来完成学校的评教工作。通过将数据导入系统来生成评教元数据,以降低数据维护的成本。实现自定义的评教指标用于衡量教学效果,评教结果的数据统计直观明了,从多方面来反馈教学中出现的问题,使得评教系统能够在促进教学中发挥更重要的作用。
    本系统通过使用Spring框架和MySql数据库来提供开发环境,开发过程遵循MVC体系架构和软件工程的思想,通过需求分析,整体设计,详细设计,编码和测试来保障本系统高质量的完成。在安全方面,系统提供了更方便的权限管理和更细粒度的访问控制。同时对系统的可扩展性和并发访问进行了讨论。
    关键词:评教系统,Spring框架,数据统计
    AbstractEvaluation of teaching is one of the most important way to improve the quality of teaching. In the Internet age, informatization is the mainstreams of the teaching evaluation development, compared with the traditional evaluation form, online teaching evaluation system with accurate, timely, lower cost and many advantages. Through the investigation of the current teaching evaluation system, we can found that those systems has some deficiencies such as single index, weight average, lack of result statistics and so on. So a customized evaluation system is designed and implemented to improve the effect of the teaching evaluation .
    This paper mainly studies how to design and implement the use of flexible and customized evaluation system to complete the work of the school evaluation. To reduce the cost of data maintenance, the data import module is used to generate metadata. Implement custom evaluation indicators to measure the teaching effect. Data statistics of the evaluation result is detailed and clear, from many aspects to show the problems appeared in the teaching. Making the system play a more important role in promoting teaching effect.
    The system use the spring framework and MySQL database to provide development environment , the development process follow the principals of the MVC and the thought of software engineering , through the requirement analysis, overall design, detailed design, coding and testing to ensure the quality of the system. In the security aspect, the system provides convenient privilege management and fine - grained access control. And the system scalability and concurrent access is discussed in the paper.
    Keywords: Evaluation system, Spring Framework , Data statistics
    第1章 绪论1.1 课题背景如今,越来越多学生都受到了高等教育,学校和政府有关部门一直以来对如果提高教学质量问题都非常注重。如今教师有效教学和学生有效学习成为近年来高等教育一个很重要的问题。教学质量的提高不仅是科教兴国战略实施的必然要求,同时也是高校的不断发展和进步的客观要求,加强高校教学质量管理体系的建设是非常重要的一部分[1] 。但是,目前国内高校对教师教学质量评估的工作很多依然是依靠通过发放评测表,回收评测表并人工处理评教数据并分析的方式来进行。在互联网+时代,这种传统的评测无疑显露出了很多的弊端。评教指标不能科学化,系统化的建立,评教过程费时费力而且效率低下,对统计结果的分析也只能是单维度的简单的,不能利用信息技术对评估结果进行科学有效直观的分析和展示以促进教学质量的提高。虽然近来有的高校也构建了在线评教系统,但是通过对这些系统的分析,不难发现,这些评教系统存住着不能根据教师的分类制定不同的评教标准,评教指标形式化严重,学生评教的积极性不高,评教结果失真等问题。为了能够及时有效快速的反馈教学的成果,根据需求和规则科学的制定评教的标准和规则,来构建基于网络的可自定义评教系统[2] 。
    1.2 研究意义随着信息技术的高速发展,绝大多数的年轻人都已经习惯了信息化带来的便利和好处,足不出户就可以轻松完成许许多多的事情。尤其是近年来,网络教学的发展和普及,大学生可以通过网络视频就能完成课程的学习。评教的网络化无疑是发展的必然,以此来实现全体的教师和学生共同参与评教工作,使得评教能够更好的,更及时反馈教学成果。网上评教有很多的优点,大学生参与积极,评教覆盖面更广,学生可以随时随地的完成对教师的评教,保证了评教数据的可靠性和真实性,同时对评教结果的分析也可以采取更加直观的图表的形式来展现,通过对最近几年评教结果的分析,可以反映出教师的教学质量的变化趋势,这种机制无疑能够促进教师更好的教学,及时发现教学存在的问题。再者,通过教师对学生多方面的评价,能让学生从多角度的了解自己在学习上或者其他方面存在的问题和不足,而不是仅仅只是通过成绩来断定一个学生的真实能力[3] 。
    1.3 国内外研究现状分析通过对国内一些基于B/S的网上评教系统的研究,发现了这些系统或多或少存在的一些问题:
    1.3.1 评教指标的过于简单化不难发现,现有的评教系统大多都只采用选择题的形势来进行评估,形式过于单一,学生不能表现出对教师教学更多的看法,只能局限于对一些简单的形式化的反馈。而且评教表没有差异性。举例来说计算机专业的评教和艺术专业的评教内容就不应该是一致的,每个课程都有自己的教学特点,有的偏重于理论,有的偏重于实践。因此不能采用单一的评教标准和内容,因此可自定义的评教表就可以很好地解决这个问题[4] 。
    1.3.2 评教指标的权重过于平均从现有的评教表来看,每个评教指标的权重都是一样,大都分为 优良中差或者固定的分数段等。这种评教标准存在着一些问题,有的过于泛化的指标例如认真负责,生动自然等和一些课程特有的指标,例如计算机课程可以帮助学生深入理解计算机原理和动手实践,上机评测这样的指标权重不一该一视同仁,所以每个指标都应该都不同的权重,这样最终得到的评教结果才能更好地展示出教师的教学成果[5] 。
    1.3.3 评教结果的可信度和缺乏科学的数据分析评教的可信度就是说,现在的大学生因为担心评教结果被教师看到,所以隐瞒实情,打分或者评价都会刻意的选择较好的方向,这样就会严重的影响到评教结果的可信度。评教结果的分析大多都只是按照单次评价的结果,对得分进行简单的排序并展示。这样单一的数据分析显然不能得到很好的效果来促进教师的教学。更好的方法应该是对教师一次课程的前期中期后期多次进行评教,将评教结果按照权重得到教师的最终的成绩,并且通过图形的方式展示教师的得分和最近得分的趋势,并对学生的意见和建议进行了归纳,以帮助学校提高教学质量,协助老师提高教学效果。
    通过对国外高校评教工作的了解,下面这些优点和启发可能对评教系统的开发有更好的帮助。一个就是国外高校评教指标的体系不只是学校单方面的制定,学生对评教体系的看法也占有很重要的地位,学生如果能参与到评教指标的制定,更能表达出学生的看法。再就是国外高校利用学生的评教结果对外公开,并给与低年级学生以选课的参考,这样教师可能会更多的会去反思自己的教学方法,学生也更能了解自己想要学习什么或者提前做好准备[6] 。
    1.4 系统开发的主要目标和内容1.4.1 开发目标根据当前学校教务系统的设计,完成整个评教系统架构平台的搭建和数据库的设计,保证系统与学校教务系统能够良好的衔接和运行。
    设计与完善评教流程的体系,抽象出评教表格式,能够实现根据需求来自定义评教表格的内容。
    完成整个系统的设计,开发,实现和运行,包括测试和相关文档的完善。根据评教结果进行数据分析,并通过视图直观的展现出来,据此探索基于评价的教师奖惩机制,制定建议方案。
    1.4.2 开发内容1.4.2.1 数据的导入和教务系统数据的维护和衔接将教务系统导出的学生表,教师表,课程表,学院表,选课表以EXCEL的格式导入到新设计的数据库中,新系统的数据库表的设计需要与教务系统的字段和类型保持一致,并截取对评教有用的字段进行维护,作为元数据方便接下来评教工作的展开。
    1.4.2.2 评教批次和评教指标的可自定义的设计评教批次是指在每学期可能有不止一次的评测,评教批次需要设定开始和截止时间,评教需要在评教批次限制的时间内进行。
    可自定义的评教表包括表头,文本,打分表,反馈和建议等内容,每项的内容和数量是可以自定义设置和增减的,最后将自定义好的评教表动态的保存到数据库中。
    1.4.2.3 系统管理员的设置和角色系统权限控制的设计系统需要设置管理员来进行系统数据库的维护和数据导入的工作。系统涉及的角色包括 学生,教师,管理员,和领导,每种角色所拥有的权限都不相同,角色的权限可以动态的设定,对访问权限做细粒度的划分和控制,保证系统角色的灵活性。
    1.4.2.4 评教结果的查看和统计展示评教结果的展示对每个角色都不相同。学生的结果展示主要在于教师对自己课程表现的评价。教师的结果展示包括学生和领导对自己所教课程的评分和评价内容,并且可以查看相同课程各个学期的得分成绩和评价的趋势的展示。
    第2章 系统开发技术路线2.1 技术架构项目基于JavaEE技术开发和实现。使用Spring框架作为容器来搭建运行平台,同时可以提供良好的扩展性和对象生命周期的管理。通过MySql数据库来对数据进行持久化。Druid连接池是JDBC连接池的实现之一,可以用来缓存应用程序与数据库之间进行通信和传输的连接,这样可以大大减少创建数据库连接所消耗的时间[7] 。使用MyBatis作为ORM框架来完成JavaBean与数据库的映射,通过灵活的动态SQL技术来对数据库进行操作,大大减少了数据库操作的繁琐。使用BootStrap作为前端框架进行布局和提供控件的支持,使用JQuery来提高Web交互体验,使用ECharts来进行数据的可视化绘制。如图2-1所示,是系统整体的技术架构,包括展示层,服务器和数据库三个部分。

    实验工具和实现环境如表2-1所示:



    工具或环境
    使用




    分布式版本控制托管
    Github


    Java环境
    JDK-7


    javaIDE
    Itellij Idea


    WebServer
    Tomcat7


    服务器环境
    Linux Centos 6.5


    数据库
    Mysql5.6



    2.2 使用框架和技术介绍2.2.1 SpringSpring框架是基于Java语言的一个开源框架,不同于普通的J2EE框架,Spring有着对系统更少的侵入和众多特性的用于企业开发的框架,可以在各种平台上运行,而且基于配置模型来提供更好的扩展性。Spring的关键是提供应用级的底层支持,这样开发就可以只需要关心业务层,而不用关心程序部署的平台[8]。
    Spring具有以下特性和优点:
    依赖注入和控制反转:提供一种通过自动装配的技术,Spring将接管bean的生命周期的管理,并对所依赖的资源进行注入,程序自身不需去调用框架,而是Spring框架通过配置来控制程序依赖的注入,可以通过来指定构造器注入和,setter注入等方法来加载bean的值,大大降低了系统的耦合度。
    对众多Java开源框架的支持,例如MyBatis,Struts,JDBC,JMS等,通过Spring容器来统一的管理这些第三方框架可以使得项目更好的开发和维护。MVC框架:提供一种清晰,无侵略性的MVC实现方式。
    2.2.2 Spring MVCSpring框架使用可插拔的MVC架构提供了一个功能齐全的MVC框架的实现,可以用来轻松构建Web应用程序。通过Model,View,Controller三层结构来实现一个基于请求/响应的Web框架。控制器(Controller)用来实现页面的跳转和业务处理的入口,视图层(View)通过模型(Model)的数据来指定使用何种视图技术来渲染出HTML并最终返回给用户,进而结束整个HTTP请求的过程[9] 。
    如图2-2所示,展示的Spring MVC框架的请求处理流程图。

    当用户发送的HTTP请求到达WebServer后,DispatcherServlet是整个程序的入口点,所有的请求都会被DispatcherServlet说处理,它将会调用指定的处理器来映射请求URL和处理器,并将请求数据进行处理和转换,传递给Controller来进行页面逻辑的导航和业务逻辑的代理。控制器会使用用户请求的参数来调用Service接口,经过实际的业务逻辑处理后,将返回的数据封装到Model中并传送到Controller,每一个Controller都会有一个与之关联ModelAndView对象,封装了数据模型Model和视图View的逻辑名称,Controller会将ModelAndView对象传递给给VierResolver,根据设置生成指定的视图类型,并确认真实视图文件路径,之后通过Model数据来渲染生成视图结果,最终将结果通过Response返回到客户端。这样就完成了一个典型的基于MVC模型的HTTP请求过程[10] 。
    2.2.3 MySqlMySql不仅是在小型企业广泛使用的开源数据库管理系统,而且在当今许多互联网企业中,MySql也是备受青睐,得到越来越多用户的认可。它具有安装体积小,运行速度快,执行性能高,免费而且开放源代码,可以根据企业需求进行定制。MySql具有的特性之一就是具有可插拔的存储引擎架构,数据库的执行处理等上层操作和底层的存储引擎分离,使得众多适用于不同场景的存储引擎例如InnoDB,MyISAM,NDB等能够发挥很大的作用,可以根据业务需要和场景随时的改变数据库的存储引擎以满足要求[11] 。同时MySql具有Replicaion的主从架构,对当今互联网企业而言,一台主数据库服务器(Master)和多台从数据库服务器(Slave)的架构可以满足数据库不断增长的数据库读写请求,通过读取从数据库和写主数据库来缓解数据库的读写压力,增加数据库的吞吐量。同时,MySql具有Partition,分表,触发器,视图,函数和存储过程等大型数据库管理系统都具有的特性使得MySql成为当前最流行的开源数据库。
    2.2.4 MyBatisMyBatis是一个基于Java的持久层ORM框架。它是一个具有Sql语句查询,存储引擎,高级对象映射等特性的优秀的持久层框架。通过底层对JDBC连接的处理和自动结果集的检索和封装,使得程序可以从繁琐的数据库操作中解脱出来,把精力更多的放在业务逻辑的处理上。同时动态SQL的支持使得SQL语句的组装和功能更加灵活,大大降低了程序中拼接SQL语句从而导致的SQL注入的风险。MyBatis配置可以基于文件和注解两种形式,通过在映射文件中或者接口上直接编写SQL语句,这种方式虽然会降低开发速度,而且可能会有SQL语句拼写错误的困扰,并不像Hibernate这种可以使用HQL对象查询语言基于配置动态生成可执行SQL语句框架。但是当系统的数据库压力一定的程度时,修改SQL语句可以使得SQL优化变得异常的方便而不用修改程序代码。而自动生成SQL语句的特性就使得SQL优化变的异常的麻烦。同时,MyBatis可以和Spring良好整合在一起,通过Spring来管理MyBatis的SessionFactory使得数据库的连接操作更加的简单。
    2.3 本章小结本章主要说明了系统在整个开发过程中,会使用到的主要技术和框架及其原理的介绍,充分了解需要使用的技术可以大大降低开发过程中遇到的风险,对接下来的设计和开发工作能够顺利进行有很大的帮助。
    第3章 需求分析3.1 总体需求可自定义评教系统主要是为了满足学校对新的评教方法的实施而进行开发的,为的是教学过程中的连续评价和沟通。同时设计了学生对教师的评价表,教师课程质量评价表,学生状态评价表等,各种评教表的指标和格式各不相同,除了量化打分外,还有关于意见,建议等问题的填写。在一个课程的整个学期中,可能会设置开学,期中,期末多次评教,使用的评价表也可能是不相同的。所以如何设计出通用的可自定义的评教表是系统开发的关键。
    不同的评教结果表以不同权重进行组合,例如学生的三次评教权重分别为10%,30%,60%。教师的成绩受学生评教,教师互评,领导评教三方面的影响。
    同时对课程评价的展示不只是每个对象的评价表详情,还要有评教结果的统计,例如每个课程每个批次的评教进度,学生评分,教师评分等信息的展示。所以一个完整的直观的统计结果是必要的。
    除此之外,还需要将现有教务系统中的学生,教师,课程,选课信息通过使用Excel导入到系统中,保证整个系统的数据一致。
    3.2 系统功能需求分析3.2.1 角色和用例图评教系统有学生,教师,领导和管理员四个角色。各个角色的职责各不相同。系统主要功能围绕着针对角色和课程进行教学评价的工作来展开,相比传统的评教系统只是通过学生对教师所授课程的评价作为教师的教学考核标准显然不够准确和全面,通过增加教师和学校领导对课程的评价的方式可以使得课程的受评结果更能反映教师真正的教学情况,从而达到促进教学质量提高的效果。
    从系统角色的角度出发对系统的功能可分为:

    3.2.1.1 学生,用例图如图3-1所示,主要功能有:
    登陆:学生数据被导入系统后按照默认规则生成密码,学生通过验证学号和密码登陆到系统后可以进行教学评价
    评价已选课程:当学生登录系统之后,将会显示学生所选的课程,并提供评教的入口,进入后可以对课程进行评价。已经评价的课程将不允许再次受评
    查看课程信息:基于公正公开的原则,评教的所有信息的开放透明的,学生可以查看任何一个课程的受评情况,包含课程收到的所有评价结果表和数据统计等信息
    查看教师信息:学生可以检索所有的教师信息,查看教师所授课程的评教结果和得分统计等信息

    3.2.1.2 教师,用例图如图3-2所示,主要功能有:
    评价课程组:当老师登录系统之后,可以选择对同一个课程组其他教师所授课程进行评价。同一个课程组即是相同的课程名,不同教师所授课程
    评价学生:登陆系统后,也可以选择对学生进行评价。根据教师授课课程列出所有选课学生,然后可以对学生逐个评价,每个学生只能评价一次


    3.2.1.3 管理员,用例图如图3-3所示,主要功能有:
    评教指标管理:评教指标的作用是维护一组评教表,用来进行评教工作使用。评价表的类型分为:学生评价教师,教师互评,领导评价教师,教师评价学生。评教指标可以新建,包含表头,打分表和问题三个部分,打分表细分为问题和评价得分,等级,权重等信息,评教表的项目可以根据需要增加和减少,最后动态生成评教表。评教表也可以修改和删除
    评教批次管理:评教批次表示在一个批次的时间段内,系统各个角色可以相互进行评价,超过了评教批次的结束时间不允许进行评价,一个学期可以创建多个批次进行评教工作,保证了评教的效果和师生的持续沟通,更能准确的反映出教师教学的效果
    管理员管理:系统存在一个超级管理员,超级管理员可以对其他管理员进行添加删除和修改的操作。普通管理员可以修改自己的信息,不能修改其他管理员的信息
    权限管理:系统通过请求的URL和Session中用户的角色信息判断用户是否有权限请求当前页面或数据内容。URL和角色的权限映射表存放在数据库中,前台页面可以对各种角色的权限进行修改
    数据导入:数据导入即通过教务系统下载的Excel 2003格式的导出文件,通过导入页面上传到系统后后台自动解析并处理,然后将解析到的学生,教师,课程等信息导入到数据库当中。系统在使用前必须要将必要的数据导入到系统后才能开始正常的评教工作


    3.2.2 功能模块划分从上面的角色功能分析中,可以将系统的划分为4个模块。如图3-4所示,每个模块的功能如下:

    基本数据管理:包含教师,学生,课程,班级,专业,学院,管理员等基本信息的维护
    评教系统:包含学生评教,教师评教,领导评教,评教指标和评教批次等
    评教结果和图表的展示:包含课程受评结果,学生受评结果和教师受评结果的展示和相关数据的统计信息
    数据导入:包含课程信息导入,选课信息导入,学生信息导入和教师信息导入


    3.2.3 数据流向数据流图,简称DFD,主要是用来展示数据是如何生成和传递的,并在在哪里被存储和引用。使用图形的方式来描述系统中都有哪些功能和功能之间的联系以及和数据在其中是如何变化的。是分析系统数据流程的一种有效工具,是逻辑模型的重要组成部分。
    如图3-5的系统数据流图,表示系统内部数据的流向。系统管理员维护基本信息和创建评教指标,生成评教批次,使得系统的参加评教的角色可以进行评教表的填写。当评教表填写完成时,系统会自动将参加的评教人,和评教对象,课程,时间,评教批次和评教结果等内容封装到评教结果表中并保存到数据库,当一定的时机触发评教结果查询的时候将会自动进行数据的统计和分析,并生成统计记录存放到相应的表中。

    3.3 系统非功能性需求分析3.3.1 性能需求系统可以安全稳定的运行,并能够及时的响应用户的操作,是一个合格系统所必要的。使用基于Java技术的Spring框架搭建的Web应用完全可以符合本系统的性能需求。下面从3个方面来说明系统要求:
    3.3.1.1 可靠性要求可靠性要求几乎是所有应用所必须的,一个系统可以7*24小时的对外可用是系统高可用的表现,如何保证系统的可靠性就需要在设计阶段考虑到系统程序的稳定性和服务器的稳定性。当程序发生异常时可以正确的处理并记录错误而不会导致系统崩溃可以大大提高系统的可靠性。服务器如果发生宕机能够快速恢复,并及时排查故障,以免下次意外的发生。定时的进行数据库的备份操作以免发生意外导致严重的系统故障。
    3.3.1.2 高效性要求系统的高效主要体现在合理和UI设计和及时的后台响应两个方面。在前端交互设计尽量的友好和高效,使用Ajax异步加载来避免页面的跳转都可以使得评教工作顺序高效地完成。由于考虑到系统在大量并发的时候引起的网络阻塞和系统高负载时会导致响应时间剧增,所以采用延长评教批次时间,分散客户端请求的方法,使得后台运行的更加稳定和高效。
    3.3.1.3 安全性要求系统安全的重要性不言而喻,系统权限设计,防火墙使用,数据库的访问权限,Web项目部署环境的权限设置都会影响到系统的安全性。同时系统层面,前端的数据必须进行数据效验和防止SQL注入等常见Web攻击都必须要加以防范以保证系统的安全性。
    3.3.2 界面需求系统界面简洁大方,交互友好,页面布局合理,关键位置的提醒和醒目的错误提示都是需要考虑的。查询页面增加多项过滤条件可以更加准确的查找,下拉框的级联展示可以快速的定位要查到的内容,尽量使得页面符合用户的使用习惯。
    3.3.3 可行性分析技术可行性:技术可行性分析指的是使用现有的技术是否能够达到系统完全开发的要求。使用现有的技术架构已经被验证完全具备大型Web项目的开发的条件,成熟的开源框架和可扩展的MVC架构使得项目的开发在技术上不存在技术未知的风险,可以保证系统能够按计划顺利开发完成。
    经济可行性:系统是基于Java语言的Spring框架来进行开发。Java是一个开放源码的编程语言,Spring是基础Java的一个轻量级的企业开发的框架,使用现有的流行的开源免费的框架进行项目的开发不需要支付额外的费用。再者,使用开源免费的MySql数据库不仅能够满足性能需求,也可以节省数据库授权的大量的成本。服务器采用开源的Centos或者Ubuntu 等Linux操作系统,能充分保证系统的稳定性和安全性。这样的开源架构可以做到成本最小,所以经济上是可行的。
    研发一套网上评价系统,技术上不存在问题。学院教师、学生都有强烈的提升教学质量、提升课堂教学效果的愿望,能够积极参与和支持评价工作。教务处在全校范围内推动此事,能够为教师教学质量评价提供良好氛围。综上,本项目可以顺利开展和实施。
    3.4 本章小结本章主要讨论了系统的需求分析,为了全面而准确的描述系统的功能需求,使用用例图和模块图等工具详细的介绍系统每一个模块需要完成的功能。此外,还从非功能分析的角度对系统的性能,界面和可行性分析进行分析,为接下来的系统设计做充分的准备。
    第4章 系统设计4.1 整体设计为了保证系统的可扩展性,采用了经典的软件三层架构的设计。从上到下分别是表现层(UI),业务逻辑层(BLL),数据访问层(DAL)。三层架构可以充分的体现了“高内聚,低耦合”的思想,类似于网络的七层结构,在软件开发上根据功能需要分为三层可以保证每层都只负责相应的业务,各层之间通过接口来调用,使得实现和接口可以分离。这样的架构可以充分满足扩展性的要求,当有新的需求产生时,只需要添加相应的实现而不需要修改之前的代码,这同时也符合面向接口的实现,设计时只需要设计上层接口,底层实现可以根据需求而不同,JDBC就是基于这样的设计模式实现,所以当我们切换数据库时,可以做到不用修改太多的代码,而只需要修改加载的驱动就可以满足切换数据库需求的变化[12] 。
    在Spring MVC中,控制器Controller是用来进行页面逻辑导航和对服务层进行代理的,视图View对应于表现层,根据输出类型的不同而使用不同的视图技术来展示数据格式化形式,而Service层对应于业务逻辑层,系统所有重要的业务逻辑的都会在Service层完成。如果Service层需要与数据库通信,就通过调用数据访问层(DAL)来对数据库进行操作。这样就可以达到层次结构分明,可扩展的特点。

    图4-1所示为项目整体的目录结构,可分为配置(Config),源代码(Src),系统资源目录(WebRoot)三个部分。其中配置目录主要存放Spring的配置文件,数据库的连接信息,数据导入映射关系,系统日志的配置文件,MyBatis配置文件和系统的一些属性配置等文件。通过将系统的配置文件统一的存放管理是为了方便程序可以准确的定位配置文件的位置并能够顺利的加载执行,同时也更加方便的查看和修改配置文件。Src目录是系统源代码的存放目录,其中主要有对应于三层架构中的Controller,service和dao的三个目录,此外还有持久对象,工具,基本类,枚举,拦截器,控制器,转换器等目录结构。WebRoot目录是Web项目的资源根目录,含有用于Web页面展示和渲染的静态资源CSS,JS,Image等,还有非常主要的动态页面JSP文件,控制器需要返回的动态页面主要就存放在这里。
    系统的开发流程:通过详细的需求分析后,设计项目的整体架构,然后再根据功能划分模块,进行各个模块的详细设计和数据库表结构的设计。最后根据详细设计完成 整个项目的编码工作。在完成后还需要进行充分的测试,将错误和需要改进的地方整理下来,然后逐一完善直到项目最后上交验收。
    4.2 系统设计思路4.2.1 充分考虑系统的稳定性和扩展性在项目的最开始,就开始考虑项目的稳定性和扩展性可以给项目后期的维护带来更多的便利。使用成熟的,流行的开源框架的稳定版本就是为了保证系统的稳定性。虽然一些其他的框架可以提高开发周期,但是尤其使用的用户少,稳定性不能保证。同时在程序的代码层面,在系统的稳定性主要表现在以下方面:使用Log4j日志,在代码出错和异常处全部打印Log日志,完成的Log日志可以在项目出现问题时及时的确认问题出现的地方和原因,快速结果。通过使用全局的异常处理,将异常信息全部输出到一个页面,统一处理异常并记录,可以保障系统更加稳定的运行。在项目的可扩展性方面,使用Spring框架可以提供对众多第三方框架提供支持,同时项目的结构符合J2EE的规范,使用标准的Controller,Service,Dao三层架构,各层架构负责自己的逻辑处理,面向接口的编程也使得扩展变得更加的简单。
    4.2.2 合理的数据库设计和充分的性能优化在数据库的表设计时,对每个表的增加主键可以使得数据查询在MySql这种以主键索引的数据库中获取更高的查询速度。设置字段的长度可以节约磁盘空间的占用,尽量使用varchar而避免使用text来提高读写性能的。数据库设置完整的外键来保证数据的一致性,同时使用外键可以使得查询字段自动建立索引,这样在where子句中索引将会大大降低数据库读表的操作,提高性能。在代码层面,使用数据库连接池技术,可以大大降低数据库连接的打开和关闭,通过缓存连接可以更快和数据库进行通信。在数据统计展示的时候,每次访问时才会延迟去数据库查询并计算统计,而不是定时任务一次性的对所有数据进行统计,这样可以充分将计算任务分散开来,保证系统的流畅。
    4.3 登陆模块设计登陆模块是进入系统的入口,所有用户必须登陆后才能访问系统。登陆需要输入用户名和密码,如果多次尝试登陆需要输入验证码。登陆时需要选择用户的角色,是学生,教师还是管理员登陆等。登陆成功后,会通过数据库获取用户的权限,并跳转至用户的主页面。
    用户登陆流程如图4-2所示。在验证用户密码的过程中,由于数据库使用MD5算法来加密存储密码,所以将用户输入的密码先进行MD5加密,然后和数据库的加密字符串进行对比,如果字符串验证一致,说明密码输入正确。在用户登陆成功后,从数据库中加载用户拥有的权限并存储到Session中,在页面展示时,根据用户Session中的权限来显示或者隐藏部分功能。
    为了防止有人对管理员账号进行穷举破解攻击,登陆模块加入验证码来防止用户多次尝试登陆,如果登陆尝试间隔小于5分钟,需要输入验证码,如果用户是第一次登陆,默认不需要输入验证码,这样既不是影响用户体验,也使得登陆更加的安全。
    如果用户每次登陆都需要选择登陆的角色会给登陆带来麻烦,所以在用户第一次登陆成功后,默认会记住用户的登陆的角色,将登陆角色类型存储在浏览器的Cookie中,当用户下次登陆中,默认选择用户上次登陆的角色,这样将会使得登陆更加的便捷。

    4.4 基本信息管理模块设计基本信息是系统运行所必要的数据,系统的基本运行和评教的展开都依赖基本信息的完整。基本信息包含 管理员管理,权限管理,学生教师课程等教学信息等。
    4.4.1 管理员管理管理员是系统非常重要的一个角色,是系统权限是最大的,基本信息维护的执行角色。例如权限管理,数据导入,评教指标维护,评教批次的生成等工作都需管理员角色才可以操作。
    管理员默认拥有一个超级管理员,超级管理员不可以修改和删除,系统只能存在一个超级管理员,超级管理员可以执行任何操作,也是唯一一个账号可以进行管理员管理和权限管理的账号。
    管理员管理包括:管理员的添加,修改和删除操作。添加管理员时,先判断用户添加的管理员是否是admin(超级管理员),如果不是则添加成功。修改时候,如果是超级管理员,可以修改所有管理员的信息,如果是普通管理员,那么只能修改自己的信息。超级管理员可以删除自己以外的所有其他管理员,普通管理员不能执行删除管理员的操作。
    4.4.2 权限管理权限管理是系统很重要的一部分功能。由于系统的角色比较多,而角色之间可以进行的操作差别也比较大,那么如何设计权限管理就变成比较重要了。
    当一个用户发起一个请求的时候,首先需要验证的是用户是否已经登陆,如果没有登陆,那么需要将页面跳转到登陆页面。通过添加LoginFilter过滤器可以实现该功能。当所有请求被Spring MVC的DispatcherServlet拦截之前,会首先被LoginFilter截取到,所有可以保证所有的请求都会在执行前进行权限验证。
    当用户登陆成功后,并不是所有的请求都具有权限去执行。角色权限检查流程如图4-3所示。
    权限的具体判断方法:首先获取用户访问的URL,例如/foo/delete,然后去数据库获取用户拥有的所有权限,假设用户拥有/foo/query 和 /foo/ /add 而没有/foo/delete,那么用户就没有权限执行删除的操作,只能进行查询和添加的操作。
    在数据库中,权限表字段包含权限名,权限URL,各个角色的权限位。如表4-1所示,对应角色列为1表示有权限,没有为0。学生有添加权限,而没有删除权限。超级管理员修改每个角色的权限。
    权限记录表



    URL
    权限名
    学生
    教师
    管理员
    领导




    /foo/delete
    删除
    0
    1
    1
    0


    /foo/add
    添加
    1
    1
    1
    1




    4.4.3 评教相关信息管理在本系统的设计中,学生和教师,课程,学生选课信息四个部分的数据量很大,如果手动录入这些数据肯定是不现实的,而且还会严重影响系统的可用性。所以在这些信息的录入是通过Excel导入的方式来进行。而且只可以通过Excel导入的方式来添加,不能手动添加,不能修改,大部分数据一次导入即后只读数据,只有系统进行数据统计时候才会自动修改相应的字段。同时这些数据也不允许删除,删除数据将会导致数据不完整和不一致,而且如果数据被外键所引用,同样也是不允许被删除的。所以这些信息在系统界面中主要以列表和检索的形式体现,同时是作为评教结果查看的入口,只有查找到对应的课程或者教师,学生,才能查看对应角色的评教结果详情。查询页面会设置多个列来过滤检索这些数据,大大加快的数据查询的速度,大大方便了师生查阅评教结果等信息。
    4.5 评教模块设计评教模块是系统的核心模块,是本系统业务逻辑较复杂,使用频率最高的一部分模块,其他模块的实现也是为评教的展开而服务或者提供支持的。
    评教模块主要分为评教指标和批次的设计,评教流程设计,评教结果的展示三个部分。
    4.5.1 评教指标设计评教指标是主要是用来管理和维护打分表,同时可以随时的创建和修改评教表,使得评教指标的体系更加的科学和合理。一个合理的评教指标可以充分的反应出受评对象的真实情况,有利于后续的反馈和改进。评教指标设计的过程是对评教表进行抽象的过程,一个典型的评教表如图4-4所示。

    一个标准的评教表包含的内容有:评教表名,类型,评教须知,表项,打分表,问题列表,总分,评价级别。其中表项,打分表,问题列表可以有多个。
    评教指标可以创建,修改和删除,只有没有使用的评教表才可以删除,图4-5所示为删除评教表的流程:

    4.5.2 评教批次设计评教批次是一次评教完整的生命周期,从评教批次的创建,开始日期到结束日期这段时间,参与者可以对受评对象进行评价的过程。不在评教批次的时间段内是不允许进行评价的。不同于一般的评教系统,评教批次的加入可以的使得一个学期可以进行多次的评教工作,并且每个评教批次都可以使用不同的评价表,这样可以更加充分和反映受评对象整个学期的整体表现。一个评教批次包含批次名,开始日期和截止日期,学期,评教表Id等内容。
    评教批次在结构上并不复杂,但是有一个要求就是不允许任何时刻同时存在两个评教批次,也就是说评教批次的时间不能冲突。判断的步骤是,首先判断开始日期是否被其他批次日期包含,然后是截止日期是否被其他批次日期包含,最后判断开始日期和截止日期之间是否涵盖了其他批次的时间。
    4.5.3 评教流程设计评教有四种类型。学生评价教师,教师评价学生,教师评价教师和领导评价教师。其中对教师的评价体现在对教师所授课程的评价,最终反映在教师得分的影响上。

    一个基本的评教流程如图4-6所示。首先判断当前时间是否在评教批次时间内,如果不是,那么就只能进行数据查询的操作,不能评价。否则就展示角色可评价的所有对象,进入后展示出评教表进行打分和问题的填写。如果填写没有问题就保存到数据库中,结束评教流程。
    当角色登陆后,各自主页展示的可评价对象各有不同。各个角色展示的可评价对象如下所示:

    学生评教:展示学生本学期所选得所有课程,点击进入后可以对课程评价
    教师评价学生:展示教师本学期所授的所有课程,选择课程进入后展示课程的所有选课学生,点击学生进入后可以对学生评价
    教师评价教师:展示教师本学期所授课程的所有课程组,不能评价自己的课程,只显示评价课程名相同,不同教师所授课程
    领导评教:展示所有的课程,可以选择任意课程评价

    在可评列表中,已经评价的记录显示为已评价,相同的评价对象只能评一次,不允许重复评价。
    4.5.4 评教结果展示设计评教结果的展示主要分为三个方面:课程,教师和学生。通过系统的课程管理,教师管理,学生管理可以查找到想要查看的对象,点击进入对象详情可以查看评教结果相关信息。
    4.5.4.1 课程详情课程展示出受到学生,教师,领导打分的平均分,每个评教批次的平均分,评价等级所占比例。这些数据是通过对所有评价结果表的统计得到的。然后展示课程参与的所有的评教批次,每个批次分别显示来自每个评价结果表的得分,评价等级,评价人等信息,点击详情可以查看评价结果表的所有信息。每一个评教批次对应一个评教结果的统计页面,统计的数据有:当前评价的人数和总人数,评价进度,平均分,评教等级的统计,每个表项的平均得分和等级,收到的所有回答和建议等信息。
    4.5.4.2 教师详情显示教师的平均分。通过各学期查看所授课程的平均分和各评教批次的平均分。点击课程进入可以查看课程详情。教师的各个批次的得分趋势图。
    4.5.4.3 学生详情显示学生的平均分,每个学期的平均分,等级统计,每个表项的平均得分和等级,收到的所有回答和建议,以及来自每个教师的评价结果表详情的查看。学生每个批次的得分趋势图。
    评教结果的查看页面布局如图4-7所示:

    4.6 数据导入设计数据导入模块是为了免去手动录入学生,教师,课程等信息所设计的。通过上传的Excel文件,经过系统解析和处理后,存储到数据库当中,并进行密码的初始化等操作。
    数据导入包含教师,学生,课程和选课信息四部分内容的导入。导入需要考虑的问题有:导入的文件内容字段可能会发生变化,导入的文件格式,版本,大小要求,导入的数据可能会和数据中数据库冲突,导入结果的统计信息。
    系统使用POI来处理Excel文件进行数据的读取。一个文件的导入流程如图4-8所示。
    为了防止Excel字段的变化导致无法正常读取的情况,使用一个额外的配置文件来将Excel中的字段名与对象的属性设计映射关系。先读取Excel对应字段的数据,然后通过字段名映射到对象的属性名,之后根据属性名调用对应的setter方法,通过反射动态生成对象并存储到List中,所有数据都读取完成后,将List中的数据保存到数据库。在保存数据到数据库的过程中,为了方便查看导入结果,加入了导入过程的统计信息,包含解析到的数据记录数,成功导入数据库的记录数,数据库已经存在而舍弃的记录数和导入失败的记录,以及失败的原因。当数据导入完成后将显示导入结果的统计信息。

    4.7 系统数据库设计数据库设计是系统设计中非常重要的一个环节,一个好的数据库的设计可以使得数据库有更好的读写性能,扩展性,保证数据完整性和数据一致性,提高数据库系统的吞吐量等优点。下面分别介绍数据实体关系和数据库表结构的设计。
    4.7.1 数据实体关系数据实体的关系可以用ER图来表示,系统主要表结构如图4-9。

    4.7.2 数据表结构设计系统主要表结构的主要字段如表4-1 至 4-3 所示:
    学生表用于存放学生详细信息。



    字段名
    数据类型
    是否为空
    描述




    Sid
    Varchar(20)
    NO
    学号


    Name
    Varchar(20)
    NO
    学生姓名


    Password
    Varchar(50)
    NO
    密码


    IdNumber
    Varchar(30)
    NO
    身份证号


    AvgScore
    Float(5,2)
    YES
    平均成绩


    Departmentid
    INT
    NO
    学院Id


    Majored
    INT
    NO
    专业Id


    Classid
    INT
    NO
    班级Id



    评教指标表用于评教表的管理。



    字段名
    数据类型
    是否为空
    描述




    Id
    INT
    NO
    评价表Id


    Type
    Varchar(20)
    NO
    类型


    Title
    Varchar(100)
    NO
    表名


    Note
    TEXT
    NO
    评教说明


    CrateDate
    DATE
    NO
    创建日期


    JsonString
    TEXT
    NO
    序列化字符串



    评教批次表用于存放批次的详细信息。



    字段名
    数据类型
    是否为空
    描述




    Id
    INT
    NO
    批次Id


    Name
    Varchar(20)
    NO
    批次名


    Season
    Varchar(100)
    NO
    学期


    BeginDate
    Date
    NO
    开始日期


    EndDate
    Date
    NO
    截止日期


    mtime
    DateTime
    NO
    最后修改日期


    stuAvgScore
    Float(5,2)
    YES
    学生评教师平均分


    teaAvgScore
    Float(5,2)
    YES
    教师评教师平均分


    teaStuAvgScore
    Float(5,2)
    YES
    教师评学生平均分



    4.8 本章小结本章主要介绍了可自定义评教系统主要功能和模块的详细设计,使用流程图来展示每个流程执行的过程,以及实现思路。最后通过对系统数据结构的分析和数据实体之间的关系来确定表结构的设计,使得接下来的系统实现能够顺利的进行。
    第5章 系统实现5.1 系统功能模块实现由于系统模块部分存在相似性,下面将介绍主要模块的实现界面,实现思路和部分关键代码。
    5.1.1 系统登陆系统登陆的界面如图5-1所示:

    系统登陆输入账号密码,如果尝试多次登陆还需要输入验证码。选择用户类型后可以登陆到系统。
    其中验证登陆部分代码如下:
    session.setAttribute("lastLoginTime",new Date().getTime()); //设置最后一次登录时间 Boolean skipVerify = (Boolean) session.getAttribute("skipVerify"); //是否需要输入跳过验证码 if(skipVerify==null){ //如果sessio已经失效说明不需要验证码了 skipVerify = false; } if(!skipVerify) { //如果需要检查验证码 //如果输入的验证码不正确 if(StringUtils.isBlank(verificationCode) || !verificationCode.equals(session.getAttribute("verificationCode") )){ model.addAttribute("error","验证码错误"); session.setAttribute("skipVerify",false); //需要验证码 return "index"; }}String type = user.getType(); //获取用户角色类型 UserType userType = UserType.toUserType(type); boolean loginSuccess = false;Cookie cookie = new Cookie("loginType",type); //记住用户角色信息 cookie.setMaxAge(365 * 24 * 60 * 60);response.addCookie(cookie); String viewName = "index"; user.setPassWordConvertMD5(user.getPassword()); //MD5加密密码 switch (userType){ case ADMIN: Admin a =adminService.login(user); if(a!=null){ session.setAttribute("admin", a); viewName="redirect:/admin/admin"; loginSuccess = true; } break; //省略其他角色登陆信息 default: logger.error("未知的登录角色! " + type); model.addAttribute("error","未知的登录用户的角色!"); return "index"; } if(loginSuccess) { List<Privilege> pList = privilegeService.findAllByUserType(userType); addPrivilege(session, pList); //权限信息放入session removeOtherUser(session, userType); //移除当前session中其他已经登陆的用户 session.setAttribute("userType",userType); //设置当前用户的类型 return viewName; //返回到用户主页 }else { model.addAttribute("error","用户名或密码错误"); return "index"; }
    5.1.2 评教指标管理评教指标列表如图5-2所示,可以对指标进行修改,删除和创建。

    点击新建评教指标可以跳转到添加评教表的页面,如图5-3所示。

    填写一个评教表完整的信息后,可以随意的添加和删除任一项内容,实现评教表的灵活和可自定义。同时在指定的位置添加输入提示,防止输入错误。
    5.1.3 评教流程下面从教师评价学生的角度来介绍系统评教流程的实现。
    当教师登陆后,可以选择评价相同课程组的课程,也可以选择对自己所授课程的学生进行评价。当教师选择评价学生的界面如图5-4所示:

    点击任意课程,下方将会显示选择该课程的所有学生列表,点击“去评价”可以对学生进行评价。评价表如图5-5所示:

    评价表填写完成后提交,系统会将评价表和评教结果保存到数据库中。评教完成后可以查看该学生评教结果,如图5-6所示:

    学生详情页面将会展示出学生基本信息,平均得分,各个学期得分统计,学期得分趋势图,和各批次的评教结果表等信息。
    5.1.4 数据导入数据导入的实现界面如图5-7所示。分别有课程信息,学生选课信息,教师信息和学生信息导入4种选项。以课程信息导入为例,将包含所有的课程信息的Excel文件上传后,课程信息将会被解析被保存到数据库中。如果上传文件过大,文件不是以.xls后缀结尾的文件,不是标准Excel 2003文件,Excel内容检测到不是课程信息,选择的学期和Excel文件中解析到的学期不一致等错误都会终止数据导入流程,并在前台展示出对应的错误信息。

    如果文件解析成功并在导入过程中没有发生错误,页面会跳转到导入结果页,展示导入过程中的各项统计数据,如图所示:

    5.2 安全和稳定性实现5.2.1 数据效验数据校验是指通过一定的规则对前台传递参数的合法性进行检验的过程。不合法的数据将会导致数据不完整,也有可能导致系统出错。保存合不合法的数据到数据库中是没有意义的。一个合格的接口总应该假设输入的参数可能是非法的,而不是默认输入参数就一定是正确的。用户的输入也总是千奇百怪的,没有充分的数据效验将会使运行时产生许多问题。
    数据效验体现在前端的表单效验和后端程序的效验。本系统前端的表单效验使用的JQuery Validation,通过在页面编写JS代码或者在HTML标签内使用效验参数等方法实现表单效验[13] 。如图5-9 是修改密码页面数据效验的示例:

    页面使用Js效验代码的代码如下:
    $(function() { $("#form1").validate( rules:{ oldPwd: {required:true}, pwd: {required:true, minlength:3}, pwd2: {required:true, equalTo:"#pwd"} }, messages:{ oldPwd: {required:"请输入原密码"}, pwd: {required:"请输入新密码", minlength:"至少输入3个字符" }, pwd2: {required:"请输入确认密码", equalTo:"两次密码必须相同" } } }); });
    如果只进行前台数据效验而不进行后台数据效验,那么正常用户操作是不会引发错误的,但是如果用户伪造HTTP请求,传递不合法的参数,这样后台就需要进行数据效验。后台主要效验的内容有:参数是否为空,字符串是否空串,字符串长度是否超过数据库数据字段类型长度,整数是否小于等于0,时间格式是否合法等。完善的数据效验可以增加系统的安全性和稳定性,是必须要重视的。
    5.2.2 XSS漏洞攻击防范XSS(Cross Site Scripting),叫做跨站脚本攻击,是通过在请求参数中插入恶意可执行脚本,实现对用户游览器的劫持控制[14] 。例如表单数据插入类似“<input/>”的代码发送到数据库,如果后台服务器不做任何处理就存入数据库,那么当数据在前端加载的时候就会被当成JavaScript脚本执行,并显示出HTML的输入框。通过这样的方法植入恶意代码,就可以达到攻击的目的。
    通过对前端所有数据的参数就都进行HTML和JavaScirpt代码的转义处理,这样数据库就会以“<input\/&gt”的形式存储。再传送到前端展示的时候,就可以显示成文本<input/>的形式而不是一个输入框。这样就可以达到防止XSS漏洞攻击的目的。
    但是如果我们在控制器的每个方法中都加入这样转义代码,将会导致代码重复。通过Spring提供的Converter服务,可以实现一个从String到转义后String 的一个StringConverter类,如下所示:
    public String convert(String text){ text = StringEscapeUtils.escapeHtml4(text); text = StringEscapeUtils.escapeEcmaScript(text); return text;}
    然后将该转换器注册到Spring的数据转换服务中。
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.tqe.base.converter.StringConverter"/> </set> </property></bean>
    通过这种方法就可以完成了系统全局的转义工作,防止了XSS的攻击。
    5.2.3 并发访问对一个系统而言,并发访问会给系统带来极限压力,并且能出现未知的异常。随着使用人数的增加,同一时刻如果大量的涌入用户将会导致系统响应慢,系统不稳定,产生并发错误,严重时可能会导致服务不可用。下面给出一些并发性能问题的一些解决方法:
    使用CDN加速,将静态资源缓存在离用户最近的服务器节点上,减少服务器处理HTTP静态资源所消耗的CPU和网络资源,可以有效避免网络拥堵,降低系统响应时间。
    使用负载均衡和服务器集群。负载均衡负责将请求通过一定的路由算法将客户端请求分发到指定的服务器上来继续处理请求从而解决低单台服务器的单点问题和负载过大的问题。使用负载均衡理论上可以线性扩展系统服务的吞吐量,但是需要考虑数据库高负载时对数据库的优化策略,例如读写分离,分库分表,使用缓存服务器等手段。
    此外,在代码上进行性能优化可以大大的降低并发访问带来的性能问题,例如分散数据请求的时间,使用消息队列,缓存,充分利用多线程等[15] 。
    5.3 系统测试对任何系统而言,测试都是必不可少的环节,测试可以发现系统存在的很多问题,所有的软件上线之前,都应该进行充足的测试之后才能保证上线后不会Bug频发,或者是功能不满足需求等问题的发生。下面分别从单元测试,功能测试和用例测试来对系统进行测试以保证系统的稳定性和可靠性。
    5.3.1 单元测试一个合格的程序员都应该进行单元测试,单元测试是从开发者的角度对程序代码正确性的一种测试[16] 。传统的单元测试都是根据系统模块的划分,分别测试每个独立模块或方法的正确性,通过输入和输出来检测模块是否正常运行。通常,在每一个新的版本发布前,都需要进行一次完整的单元测试,以保证新添加的功能和特性是正确的,并且没有影响到已完成模块的正常运行。
    Junit是JavaWeb项目使用最广泛的单元测试工具。在Spring环境中,通过Spring Test和 Junit4的集成使用可以避免多次初始化Spring容器,对控制层代码无法测试等问题。一个测试基类的代码如下所示:
    @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext-test.xml")public class BaseTest {}
    通过继承测试基类,就可以使用Spring提供的AutoWired注解来注入Controller,Service,Dao等组件进行单元测试。测试成功时代码如图5-10所示:

    5.3.2 功能测试功能测试是指使用黑盒测试的方法,在不考虑程序内部实现的情况下,根据功能需求来对程序的接口进行测试。通过设计完整的测试用例,例如对表单输入非法字符,过长字符,验证系统功能是否完整,边缘测试等手段对系统功能进行验证,保证系统的可用性。
    同时对于系统环境的测试,使用云虚拟机和本地服务器两套环境进行测试,发现在不需要修改程序代码的基础上,系统能够安全,稳定的运行在两套环境中,保证了系统的可移植性。
    5.3.3 性能测试使用阿里云PTS(Performance Testing Service)性能测试服务对线上系统进行压力测试。线上服务器环境为:1核心CPU,1G内存,1Mbps公网带宽,Centos7.0操作系统。
    下面介绍测试过程中常用的指标:

    TPS(Transaction Per Second):每秒事务数,表示系统每秒能够处理的交易或事务的数据
    响应时间:指的是从客户端发出请求到后端响应所用的时间,由请求发送时间、网络传输时间和服务器处理时间三部分组成
    并发用户数:是指实际在线,并一定会对系统产生压力的用户数,通常比在线用户数要少的多

    压测过程中使用了2台并发机器,每台机器20个用户并发,对系统主页,登陆,学生查询和课程查询等模块进行并发访问,得到的测试结果如图5-11所示:

    测试结果是有40个用户并发时,课程管理相关页面的响应时间甚至达到了7s,通过查看服务器出网流量发现已经达到1381kb/s,可以看出服务器的带宽已经达到峰值,如果系统使用5Mbps的带宽,系统的响应时间和TPS将会大大增加。在整个测试的过程中,CPU的使用率占用仅8%,也提现出带宽瓶颈对系统的影响非常严重。
    通过将带宽升级到5Mbps,在相同用户并发数下继续进行压力测试,得到的结果如图5-12,5-13所示。同样是40个用户并发,系统的TPS已经平均达到了12/s,即便是数据库查询较多的课程管理模块,平均响应时间也已经达到了1.5s,而这时系统的CPU占用率仅为20%,带宽为4984kb/s,已经达到了峰值,可以看出,继续提高带宽继续提高系统并发用户数。
    TPS压测结果图

    系统响应时间测试结果图

    通过压力测试,可以及时的预测系统可能会发生的异常情况,找到影响响应时间过高的瓶颈原因所在,及时的进行系统调优,可以提高系统性能和稳定性,提升用户体验。
    5.4 本章小结本章介绍了系统主要模块的实现方法和部分关键代码,充分展示了系统的完整性,基本符合了系统需求。除此之外,还讨论了系统的安全性和并发访问的实现可以使得系统更加健壮。最后,通过详细的测试,验证了系统的可用性,同时对测试过程中系统出现的问题,能够得到及时的解决,使得系统更加的完善。
    结 论为了能够提高教学质量,及时准确的反馈教师教学过程中存在的问题,设计和开发了可自定义评教系统。系统的具有安全,稳定,低成本,可扩展等特点,从测试和使用情况看,基本满足了需求设计的需要。
    本文主要从需求分析,系统设计和系统实现三个方面来讨论具体的设计和实现的细节,使用用例图,ER图,流程图等工具直观的说明了系统设计的思路和步骤。通过对稳定性,扩展性,数据库设计和系统优化多方面的讨论也使得系统架构设计的更加合理,不仅达到了的上线运行的要求外,还能够对以后可能改变或增加的需求得到及时的扩展和实现。
    当然,系统也存在着一些不足之处,还需要在以后工作中逐渐的改善,从而使系统发挥更重要的作用。能够提升和优化的地方还有:在系统结构上,应该还有更好的解决方法或是设计模式的应用可以充分的提高系统的性能和扩展性。用户体验的提升是一个循循渐进的过程,通过后续反馈的信息对系统的持续改可以使得系统更加简单,易用。同时数据统计的展示还是相对单一的,如何通过更加科学合理的设计数据统计方法,形象直观的展示数据统计结果,提高反馈教学效果等问题还需要进一步的探索和完善。
    评教系统的好坏在很大程度上影响了学校教学质量的改善,通过科学的,准确的,及时的对教学工作进行跟踪和评价,能充分的反映出教学过程中出现的问题,同时优秀的教学方法也能够快速的得到体现,这些信息为寻找和探索更好的教学管理方法提供了支持。所以说,科学的评教管理系统的普及是势在必行的。
    参考文献[1] 教育部. 关于全面提高高等职业教育教学质量的若干意见. 中国职业技术教育, 2007(1):14-15.
    [2] 罗漪. 大学生网上评教体系优化的研究. 江西师范大学, 2013.
    [3] 韩园园. 大学生利用网络评价教师课堂教学的研究. 南京师范大学,2006.
    [4] 解建立, 张倩. 大学生网上评教问题研究——基于S市部分高校调查 . 河北企业, 2015(6):130-131.
    [5] 黄建军, 黄继东, 尹加帮,等. 美国、加拿大和日本高校学生评教的特点与启示. 医学教育探索, 2010, 09(5):621-625.
    [6] 邢永富, 常瑾. 国外知名高校学生评教工作述评与启示——以四所名校为例. 宁波大学学报:教育科学版, 2011(1):59-63.
    [7] 孙朝云, 张羽. 基于B/S结构网上评教系统设计与实现. 计算机应用与软件, 2012, 29(3):183-186.
    [8] 李海海. 基于Spring框架的高校招生管理系统的设计与实现. 湖南大学, 2015.
    [9] 李刚. 轻量级Java EE企业应用实战. 电子工业出版社, 2011.
    [10] 计文柯. Spring技术内幕:深入解析Spring架构与设计原理(第2版). 机械工业出版社, 2012.
    [11] 姜承尧. MySQL技术内幕. 机械工业出版社, 2013.
    [12] 阙丽平. 福建经贸学院教师考评系统设计与实现. 电子科技大学, 2014.
    [13] 单东林 张晓菲 魏然. 锋利的JQUERY. 人民邮电出版社, 2009.
    [14] Martin M, Lam M S. Automatic Generation of XSS and SQLInjection Attacks with Goal-directed Model Checking Usenix SecuritySymposium, July 28-August 1, 2008, San Jose, Ca, Usa. 2008:31-44.
    [15] 闫新. 基于WEB的教学评价系统设计与实现. 电子科技大学, 2014.
    [16] Beck K, Gamma E. Test-infected: programmers love writing tests More Java gems. Cambridge University Press, 2010:357-376.
    [17] Gupta P, Govil M C. Spring Web MVC Framework for rapid open source J2EE application development: a case study. International Journal of Engineering Science & Technology, 2010, 2(6).
    5 评论 25 下载 2019-09-09 09:29:40 下载需要15点积分
  • 基于java和Sql Server数据库的停车场管理系统

    一、实验内容:实现停车场管理系统,应用于车辆的出、入管理。
    二、功能要求:包括车辆进出管理与系统管理等功能模块,可根据车辆停放时间及收费标准自动收费。用户需要事先办理停车卡并充值,停车卡分优惠卡和普通卡两类。

    车场管理:车辆入场、车辆出场
    信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录及收费信息
    信息维护:用户及停车卡信息维护、充值等
    系统管理:车位信息,计费标准等

    系统包含两类用户:管理员用户和普通用户。
    管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息、停车卡充值,查询计费标准。
    三、实验环境:
    Windows XP
    JDK 1.6
    Eclipse
    SQL Server
    备注:

    在XP平台开发DK(JavaDevelopment Kit)是Sun Microsystems针对Java开发员的产品Eclipse进行前台和程序设计,开发图形用户界面和停车收费功能实施
    SQL建立数据库

    四、需求分析与设计:4.1 需求分析:本软件具有如下主要功能:

    本系统包括两类用户:管理员用户和普通用户。管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息(只限于个人信息)、查询计费标准、查询当前在场信息、查询出入场信息、当前可用车位信息、口令修改。具体模块划分为如下模块:车场管理模块、信息查询模块、信息维护模块、系统管理模块。
    车场管理模块:(应该分为车辆入场和车辆出场两部分)

    车辆入场功能描述:车辆进入停车场时进行登记,记录入场时间并指定车位。只有具有停车卡的车辆才可进场,没有办理停车卡的车辆,应先办理车卡。如果没有相应车位,不能入场;如果卡中余额低于100元,应先充值后再入场。满足条件的车辆,为其指定车位并记录入场时间。车卡分两种类型普通型和优惠型。车辆出场功能描述:车辆开出停车场时进行登记,记录出场的时间并进行自动收费(从卡上扣除)。根据车辆进场时间,出场时间及收费标准自动计算车主应该缴纳的费用。如果停车时间包含不足一小时的时间,超过30分钟按一小时计算,不足三十分钟不计算。如果卡上余额足够则直接扣除;如果卡上余额不足,则应先充值后再扣除相应费用。
    信息查询模块功能描述:在这个模块里用户可以查询出入场信息、当前在场信息、用户个人信息、用户历史记录、收费标准以及当前可用车位信息
    查询出入场信息功能描述: 查询当前在场信息户可以在这里查询到两种车位的总量及当前可有的车位数量。
    查询用户个人信息功能描述:登录的管理员可以根据卡号和名字查询用户信息。登陆的普通用户只可以查到自己的信息。
    查询用户历史记录功能描述:用户可以输入卡号查询相应卡号的历史记录,包括车位号、开始停车时间、结束停车时间、停车总时间、相应收取的费用。
    收费标准功能描述:用户可以在这里查询不同种类的车位和不同卡的计费标准。
    当前在场信息功能描述:用户可以在这里查询到当前在场的车辆信息,包括卡号,车位号,开始停车时间。
    当前可用车位信息功能描述:在这里用户可以查询当前可用的车位的信息,包括车位号、车位类型。
    信息维护模块在这个模块里用户可以实现用户注册、用户修改及用户充值
    用户注册功能描述:在这里管理员可添加新的用户(普通用户)。
    用户修改管理员在这里可以修改用户。这里会以表的形式显示所有的用户信息,包括用户的停车卡信息维护,充值信息等。管理员点击相应的一行用户信息,这行信息会自动填充到表下的面板里,用户可以在面板里修改用户信息,面板下面有两个按钮,修改、删除,点击相应的按钮可以实现相应的功能。
    用户充值功能描述:用户可以再这里查到自己的余额,并且可以在这里完成充值。
    系统管理模块功能描述:在这个模块里可以修改相应的车位信息计费标准、注册管理员、更改用户口令以及查看系统声明信息。
    管理员注册功能描述:管理员可以在这里添加新的管理员。
    更改口令功能描述:用户可以在这里更该自己的密码。注:操作员只可以修改自己的密码。
    计费标准管理功能描述:管理员可以在这里不同车位类型、不同车卡类型的收费标准。
    关于功能描述:用户可以在这里看到系统声明。

    4.2 界面设计登陆界面

    管理员主界面

    普通用户主界面

    车辆入场界面

    车辆出场界面

    计费标准界面

    当场在场信息界面

    用户历史信息界面

    用户个人信息界面

    普通用户个人信息界面

    出入场信息界面

    当前可用车位信息界面

    用户注册界面

    用户修改界面

    用户充值界面

    管理员注册界面

    更改口令界面

    计费标准管理界面

    关于界面

    五、数据库设计5.1 数据库关系图
    5.2 数据表的结构设计


    用户表:users








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int
    不可

    主键,用户的停车卡号


    name
    Nvarchar(20)
    不可

    用户姓名


    password
    Nvarchar(20)


    用户密码


    cardtype
    Nvarchar(20)


    停车卡类型


    userstype
    Nvarchar(20)


    用户类型


    carid
    int


    用户车牌号


    tel
    int


    用户电话号码


    overage
    int


    用户余额






    车位信息表:sit_infor








    字段名称
    数据类型
    可空
    默认值
    说明


    stationid
    int
    不可

    主键,车位号


    stationtype
    Nvarchar(20)
    不可

    车位类型






    停车收费卡收费表:charger








    字段名称
    数据类型
    可空
    默认值
    说明


    cardtype
    Nvarchar(6)


    车卡类型


    stationtype
    Nvarchar(20)


    车位类型(车卡类型与车位类型一起作为主键)


    charge
    int


    价格






    停车表:park








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int


    车卡号(外键)


    stationid
    int


    车位号(外键)


    parkid
    int

    1,每次增加一
    停车号,主键


    startpark
    datetime


    停车开始时间


    endpark
    datetime


    停车结束时间


    fee
    int


    停车的收费


    sumpark
    int


    停车总时间



    六、关键技术介绍6.1 在其他类中得到当前登录用户对象 实现方法:在LoginFrame类中设置两个静态方法,在其他类中只需要引入LoginFrame类,然后调用他的静态方法即可。方法体如下:
    public static users getUser() { return user; } public static void setUser(users user) { LoginFrame.user = user; }
    6.2 实现用户类型不同,主界面不同的功能 可以定义静态方法disMenu().当用户是普通用户时,调用disMenu()方法即可。具体实现如下
    public void disMenu() { mnuPark.setEnabled(false); mnuSever.setEnabled(false); mnuManZhuCe.setEnabled(false); mnuManCharge.setEnabled(false); } if(user.getUserstype().equals("管理员")) { MdiFrame frame1 = new MdiFrame();//创建一个主窗体 frame1.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 } else {//判断用户名是否为null MdiFrame frame = new MdiFrame();//创建一个主窗体 frame.disMenu(); frame.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 }
    6.3 怎么得到系统时间 SimpleDateFormat myfmt=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String a4 = myfmt.format(new java.util.Date()).toString();
    6.4 怎么计算时间差值 try { java.util.Date now = myfmt.parse(a3);//a3是系统当前时间(即出场时间) java.util.Date date=myfmt.parse(a7);//a7是入场时间 int l=(int) (now.getTime()-date.getTime());//计算毫秒差值 day=l/(24*60*60*1000);//获取天数 hour=(l/(60*60*1000)-day*24);//获得小时 min=((l/(60*1000))-day*24*60-hour*60);//获得分钟 } catch (Exception e1) { JOptionPane.showMessageDialog(null,"消费计算错误"); } if(min < 30)//如果分钟小于30分钟 a8 = day*24+hour; else //如果分钟大于30分钟 a8 = day*24+hour+1;
    6.5 怎么让布局更优美 使用布局管理器; GridBagLayout,以更改密码界面为例:
    getContentPane().setLayout(new GridBagLayout()); setBounds(234, 129, 285, 223); final JLabel label_5 = new JLabel(); label_5.setText("登 录 名:"); final GridBagConstraints gridBagConstraints_11 = new GridBagConstraints(); gridBagConstraints_11.gridy = 2; gridBagConstraints_11.gridx = 0; getContentPane().add(label_5, gridBagConstraints_11);
    七、系统实现功能结构图
    27 评论 1046 下载 2018-11-19 09:32:08 下载需要14点积分
  • 基于ASP.NET的图书管理信息系统

    一、需求分析随着计算机技术的不断应用和提高,计算机已经深入到社会生活的各个角落。但如果校图书馆仍采用手工管理图书的方法,不仅效率低、易出错、手续繁琐,而且耗费大量的人力。为了方便用户查询书籍,并满足图书馆管理人员对图书馆书籍,读者资料,借书信息等进行高效的管理,在工作人员具备一定的计算机操作能力的前提下,特编此图书管理系统软件以提高图书馆的管理效率。
    1.1 编写目的本需求的编写是为了提供用户查询书籍、阅读新闻、提出建议的功能,为了方便管理员管理信息、内部维护而设计的图书管理信息系统。
    1.2 背景与范围本网站针对图书管理信息的处理,旨在管理查询图书,阅读消息,管理员管理客户等操作。
    二、系统功能本系统的主要功能有:用户的注册和登录,查看消息,检索书籍信息,管理员可以查看用户信息,查看并删除借书情况和用户反应情况,对用户进行选择查看信息并操作。
    三、系统模块划分本系统主要有:登录注册模块、用户信息管理模块、权限模块(管理员管理)、查询模块、新闻模块、链接模块、用户反映模块等。

    登录注册模块:用户注册与登录的页面
    用户信息管理模块:用户进行自己的信息管理以及信息修改的页面
    权限模块:管理员对用户信息、借书信息以及用户反映信息进行检索并处理的页面
    查询模块:用户进行书籍查询的页面
    新闻模块:用户进行看新闻的页面
    链接模块:用户进行外部链接的信息页面
    用户反映模块:用户对自己的建议进行向上反映的页面

    四、系统流程图
    五、数据库设计UserTable表

    分别是ID(自增长),用户名,密码,姓名,性别,职业,生日,籍贯,现居地,身份证,电话,邮箱,权限。
    BookTable表

    分别是BookID(自增长),书名,作者,出版商,种类。
    BorrowTable表

    分别是BorrowID(自增长),用户名,书名,借书日期。
    NewsTable表

    分别是NewsID(自增长),新闻名,新闻日期,新闻内容。
    DepartmentTable表

    分别是DepartmentID(自增长),部门名,负责人,工作地点,电话,邮箱地址,部门智能。
    ReturnTable表

    分别是ReturnID(自增长),用户名,反映日期,反映内容。
    六、界面截图主页面

    登录

    注册页面

    新闻模块

    部门介绍

    友情链接

    联系我们

    查询书籍页面


    管理通道





    七、心得体会这次的.net的网页开发让我初步对于ASP.NET有了一些了解,关于如何运用各种控件来进行自己网站的设计和网页的制作,如何连接到数据库进行网站的动态变化等等有了很多的提高和了解,初步实现了网站的开发,提高了自己的动手能力。
    2 评论 12 下载 2020-07-14 11:09:28 下载需要12点积分
  • 基于Java开发的图书管理系统

    摘要随着网络技术的发展、计算机应用水平的提高的扩大,原来系统的时效性、数据的正确性、操作的方便性上都存在不足,已影响到系统的正常使用。经过考察比较,决定利用自己的力量对图书管理系统重新设计,使系统能利用软件开发技术的成果,方便图书的管理。
    图书管理系统是典型的信息管理系统。系统介绍了图书系统的开发过程,设计中遇到的问题及解决方法以及提高当前应用程序或系统开发进度和改善工作性能。利用其提供的各种面向对象的开发工具,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。
    本次课程设计利用JAVA开发工具和SQL SERVER 2005数据库来开发这个图书管理系统。该系统要解决的图书管理所要解决的问题,可以满足图书管理基本要求,包括添加、删除等功能。该系统能根据用户的需求,快捷方便的为读者提供借阅服务。
    关键词:图书管理系统、信息管理、JAVA
    一、绪论随着社会信息量的与日俱增,作为信息存储的主要媒体之一图书,数量、规模比以往任何时候都大的多,不论个人还是图书管理部门都需要使用方便而有效的方式来管理自己的书籍。在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。
    对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。
    计算机网络近年来获得飞速的发展,十年前,很少有人接触过网络。如今,计算机网络已经成为我们社会结构的一个基本组成部分。网络已被应用到人类生活的各个方面,人们通过网络通信,共享资源,网上超市、电子银行等也应运而生,各种提供不同特色,不同内容的网站如雨后春笋般涌现。
    计算机网络的发展为人们打开了一种新的视野,促成了一个新领域新产业的产生。网络的发展试图用一种全新的概念冲击各个传统的商业模式,改变人们的生活方式。新的需求产生了,人们想通过网络进行个人通信、媒体传播、商业运作、办公、教学等。总之网络技术的发展促进了社会经济结构的变革。反之,社会经济对网络发展提出的新的需求又大大的促进了网络的发展,计算机网络及其所涉及的一系列技术成为计算机领域新的研究热点。
    在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。
    而采用功能强大的数据库软件开发工具进行图书管理软件开发,具有很好的可移植性,可在应用范围较广的WINDOWS系列等操作系统上使用。除此以外,图书馆管理系统已成为方便了广大师生、学校与外界之间的沟通架起了一座桥梁。但是,这并不能满足目前师生的需要。比如一些特定的需要要,在管理方面特别不方便,因为它受到地域的限制太大。就目前情况而言,急需充分利用网络方式的图书管理。我们的网络图书馆管理系统就是为了解决这问题而设计的。
    只要管理员掌握用户名和密码,无论这个管理员在哪里,只要能上网冲浪,就能进行工作。而且,该系统对计算机的软硬件都要求并不高,使用性比较强。
    二、需求分析《图书管理系统》针对的用户是单个中小型图书室或者个人,藏书的种类和数量较少,读者的数量和来源受到一定的限制。相应的需求有:

    能够存储一定数量的图书信息,并方便有效的进行相应的书籍数据操作和管理,这主要包括:

    图书信息的录入、删除及修改图书信息的多关键字检索查询图书的出借、返还和资料统计
    能够对一定数量的读者进行相应的信息存储与管理,这其中包括:

    读者信息的登记、删除及修改读者资料的统计与查询
    能够提供一定的安全机制,提供数据信息授权访问,防止随意删改,同时提供信息备份的服务

    三、系统描述3.1 数据库设计图书管理系统的表单包括:图书信息表、学生信息表、管理员信息表、借阅信息表、图书类别信息表。
    图书信息表T-book



    字段英文名称
    列名
    数据类型
    字段约束
    可否为空




    Book_id
    图书编号
    varchar(15)
    主键



    Type_id
    类别编号
    varchar(10)
    外键



    Type_name
    类别名称
    varchar(20)
    外键



    Book_name
    书名
    varchar(20)




    Book_writer
    作者
    varchar(10)




    Book_company
    出版社
    varchar(20)




    Book_date
    出版日期
    datetime




    Book_brief
    简介
    varchar(100)





    学生信息表T-student



    字段英文名称
    列名
    数据类型
    字段约束
    可否为空




    Stu_id
    学号
    varchar(15)
    主键



    Stu_name
    姓名
    varchar(10)




    Stu_pwd
    密码
    varchar(20)




    Stu_sex
    性别
    varchar(2)




    Stu_tel
    联系电话
    varchar(15)




    Borrow_num
    借书数量
    number(2)
    默认为0



    Stu_Depart
    所在院系
    varchar(10)





    管理员信息表T-admin



    字段英文名称
    列名
    数据类型
    字段约束
    可否为空




    Admin_id
    工作号
    number(5)
    主键



    Admin_name
    姓名
    varchar(10)




    Admin_pwd
    密码
    varchar(20)





    借阅信息表T-borrow_student



    字段英文名称
    列名
    数据类型
    字段约束
    可否为空




    Book_id
    图书编号
    varchar(15)
    外主键



    Stu_id
    学生学号
    varchar(15)
    外主键



    Borrow_date
    借阅日期
    datetime




    Return_date
    还书日期
    datetime




    renew
    是否续借
    varchar(2)





    图书类别信息表T-book_type



    字段英文名称
    列名
    数据类型
    字段约束
    可否为空




    Type_id
    类别编号
    varchar(10)
    外主键



    Type_name
    类别名称
    varchar(20)
    外主键




    3.1.1 动态数据
    输入数据:

    鼠标对按钮的点击查询方式、查询关键字新建图书项、读者项图书项、读者项相应纪录更改借阅、返还、丢失注销时的书号、借阅证号
    输出数据:

    查询关键字确定的数据库记录的子集;信息录入、删改结果(成功或失败)图书借阅、返还、丢失注销等操作结果

    3.1.2 数据流图和数据词典《图书管理系统》的总体功能如下:

    图书的出借
    图书的返回
    图书的增删改;读者的增删改
    图书管理者查询统计图书和读者信息

    读者借书过程:

    读者还书过程

    读者查询浏览过程

    图书管理员查询浏览过程

    四、系统功能模块的设计与实现4.1软件结构设计主模块结构如图4-1所示:

    借书模块如图4-2所示:

    还书模块如图4-3所示:

    图书库操作模块如图4-4所示:

    读者库操作模块如图4-5所示:

    4.2 程序描述4.2.1 读者添加功能:

    建立与数据库连接
    查验输入的读者,性别。自动生成借书证号
    保存并断开与数据库的连接

    读者添加功能模块如图4-6所示:

    读者添加模块如图4-7所示:

    4.2.2 读者查询修改功能:

    查验输入的读者证号。运行查询
    获取该读者的相关信息
    修改、删除读者信息(姓名)


    4.2.3 图书添加功能:

    建立与数据库连接
    查验输入的图书信息。自动生成图书编号
    保存并断开与数据库的连接


    4.2.4 图书查询修改功能:

    查验输入的图书相关信息
    获取该图书的相关信息
    查询借阅
    分页显示


    4.2.5 借书模块功能:

    借书

    4.2.6 查询借阅还书模块功能:

    显示查询借阅页面
    查验输入的图书书号/图书证
    对合法输入登录还书信息
    显示相关信息(本次还书操作信息,尚未归还图书的相关信息,读者信息)


    4.2.7 续借模块功能:

    显示查询借阅页面
    查验输入的图书书号/图书证。核对合法输入续借信息
    显示相关信息(本次续借操作信息,尚未归还图书的相关信息,读者信息)


    4.2.8 图书查询模块功能:

    根据给定查询条件
    查询数据库
    获取图书信息


    总结管理信息系统(MIS)的概念已经用许许多多的方式定义过,因为任何MIS的组织模型似乎都不同,所以各MIS的定义随应用范围的不同而变化就不奇怪了。按照我们的思想,一个MIS可定义为这样一个基于计算机的数据处理过程的网络系统,它是一个机构为了支持决策及其它必需的管理功能提供及时有效的信息而开发的,并且可按需要把人工操作过程结合在一起。
    1 评论 9 下载 2020-08-15 22:19:54 下载需要8点积分
  • 基于C#和Sql Server的图书管理系统

    1 课程设计意义与目标1.1 课程设计的意义《可视化编程技术课程设计》是在学生学习完《可视化编程技术》以后进行的设计性集中实践课程,通过课程集中实践,目的是使学生能加深对理论教学内容的理解,学会可视化编程技术的综合应用,培养学生分析问题的解决问题的能力。
    1.2 课程设计的目标通过课程集中实践,要求学生加深对讲授内容的理解,累积经验、学会独立上机调试程序;并且逐步达到综合运用封装、继承和多态等C#难点知识,更深地理解面向对象程序设计的基本概念与方法,从而学会利用C#语言解决一般应用问题,能设利用可视化编程技术开发复杂和综合性的计算机管理信息系统,并为后续专业课程的学习奠定程序设计基础。
    2 课程设计的题目2.1 设计题目概述
    图书管理系统
    2.2 开发环境搭建
    开发语言:C#
    开发工具:Visual Studio 2010
    数据库管理工具:SQL Server 2008

    3 系统的设计与实现3.1 物理数据模型设计




    3.2 主要界面设计
    界面中用了textbox,label,combobox,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件。在用户类别可以选择用户类型,管理员。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示。
    功能:可以增加,修改,删除图书。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。

    密码修改:可以更改当前用户登录的密码,旧密码符合条件,新密码和旧密码不能相同,新密码和确认密码的相同的条件。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。模糊查询在下面有具体介绍。

    管理员信息管理:可以对管理员进行增添改查。

    书库管理:对书库进行增删改查。

    书库查询:按地区分类和按书库编号分类,第二个combobox会自动加载所有记录的值供你选择。

    书库管理:用来增加书库,删除,修改。

    用户管理:对用户的增删改查。

    用户登录之后的界面。

    管理员登录之后的界面。
    4 调试过程中出现的问题及解决办法4.1 数组索引超出界限解决方法:利用断点调试,重新赋值。

    4.2 从试图获取数据时,应添加新的字段
    5 个人体会及建议在这次课设中,基本都是在学习新知识的过程,从powerdesigner到动软生成软件,让我知道了这个工具的强大之处,渐渐开始会用一点,在第一天晚上想重做一遍学生信息管理系统,不料,动软生成的路径没改,直接给覆盖了,所以只能重头再来,在这时就有想法想做个不一样的系统,上学期用C++做了个图书管理系统,有点印象,就选择做这个,一开始一直模范着你给的day1,day2,day3,看不懂BLL,DAL,MODEL之间的关系,经过思考,理解了他们之间的关系,BLL负责储存方法相当于API,DAL负责储存数据,MODEL负责各个对象的类,后面理解了就开始自己写,用户负责借书,用户的增删改,添加用户,管理员负责查询书库,书库的增删改查,查询图书,图书的增删改查,借书记录的增删改查,在这个过程中不仅了解了动软生成软件的机制,而且可熟练的利用这个工具,在这个工具的基础之上,我写出了更多好用的函数供自己使用。在windows应用开发上了解更多控件和控件属性的使用和结合,可以做出功能和界面相对完整的程序,总之,在这次课设中受益匪浅。
    4 评论 340 下载 2019-03-10 21:28:03 下载需要14点积分
  • 基于MySql和php的团购平台

    一、实现环境1.1 前端编程环境:Microsoft Windows 10 64bit
    1.2 后端
    编程环境:Microsoft Windows 10 64bit
    服务器: Apache Server v 2.4.23 本地部署
    数据库:MySQL + PHPMyAdmin v 4.5.1
    PHP 版本:PHP 5.6.24

    二、系统功能结构图2.1 系统功能需求分析“乐购”团购平台的设计目标是:方便顾客在网上完成团购工作,享受线上折扣;为商家提供在线的商品展示、推广与销售渠道;顾客可以给购买过的商品进行评价。为此,本系统应该具有以下几个功能:
    2.1.1 注册与登陆用户在使用本网站之前需要首先进行注册,否则将不能够使用完整的购物流程。在进行注册时,用户需要输入自己注册的用户名、密码以及邮箱等信息,不能够使用同一个邮箱进行重复注册。在注册完成后,用户便可以通过登录界面进行登陆,并可以使用网站的全部购物功能。
    商家在本平台进行商品销售之前需要首先进行商家注册。在进行注册时,商家需要输入自己注册的用户名、密码以及邮箱等信息,不同的商家不能够使用相同的邮箱重复注册。在注册完成之后,商家可以通过登录界面进行登陆。登陆之后的商家可以随时查看自己的信息并作出修改,还可以看到自己正在出售的商品以及销量信息。
    本系统设置后台管理员,管理员可以对自己负责类别板块的所有商品进行编辑修改,还可以查看所有商家的具体信息。
    从上面三点可以看出,本系统具有用户、商家和管理员三种角色。三种角色分别可以使用不同的方式进行登陆,并且分属不同的角色组,具有不同的操作权限。因而本系统具有权限管理的功能,能在一定程度上保证系统的安全性。
    2.1.2 用户信息管理用户在完成登陆之后可以查看并完善自己的个人信息,此外,个人信息将会统计该用户在本网站的总支出为多少。此外,用户在进行登陆之后还可以进行历史订单的查询,查看自己曾经购买过的商品。
    2.1.3 商家后台管理功能商家在完成登陆之后,可以选择添加新的商品。在添加商品的时候,需要提供商品的名称、价格、原价、类别、库存等信息,还可以提供商品的描述和图片。如果商品的库存不足将无法继续出售,此时商家可以选择删除该商品或者修改商品信息中的库存属性以恢复销售。此外,登陆后的商家还可以进行商户信息的修改。
    2.1.4 商品检索与购买功能用户在进行登陆之后可以进行商品的购买。购买商品需要首先进入商品界面,然后选择需要购买的数量,最后点击下单。完成下单之后,系统将会生成一个订单,订单中包含购买商品的数量以及商品的信息。用户可以在个人信息界面看到自己曾经下过的订单,并得到自己过去的总支出。
    此外,本网站还支持商品检索功能。用户可以选择自己想要选择商品的信息或者输入商品的关键字,以实现商品的查询功能。
    2.1.5 评价反馈功能用户在完成商品购买之后可以进行商品评价。用户的评分将会直接展示在商品页面和商家的页面上。商品的评分由该商品的所有评价的平均值决定,商家的评分由该商家的所有商品决定。
    2.2 系统功能结构设计图
    三、基本表定义根据之前的设计文档以及规范化原则,本系统采用共采用了 8 个基本表,它们分别为:管理员信息表(admin),用户信息表(users),商户信息表(shop),商品信息表(item),类别信息表(class),团购订单表(orders),订单详情表(iteminorder)和评论信息表(comment)。各基本表定义如下,其中的所有关系均已规范化到 3NF 以上。
    管理员信息表(admin)

    用户信息表(users)

    商户信息表(shop)

    商品信息表(item)

    类别信息表(class)

    团购订单表(orders)

    评论信息表(comment)

    订单详情表(iteminorder)

    四、安全性设计本系统能够满足较为基本的安全性设置,此章将从前端和后端两个方面说明本系统的安全性设计。
    4.1 前端前后端通信主要使用 POST 方法而不是 GET 方法,能有效防止其他人对网站信息的恶意截取与利用。用户使用用户名和密码登录的过程中,会首先检索用户名和密码填写的完整性,保证了在登录界面不会被渗透。
    4.2 后端后端的安全性设计主要采用了不同用户登陆的形式。商家、管理员、用户分别以三种不同的用户身份登陆到数据库中,不同角色之间的操作权限各不相同,这可以在很大程度上保证数据库的结构不被破坏。
    此外,在 php 连接后台的函数中,对于特定数据类型的数据加以验证,防止了 SQL 注入所造成的危险。例如,验证某个变量是否为整型,之后再进行相应操作
    $type = intval($type);
    或者是将需要检索的变量名使用引号括起来:
    $result = mysql_query("select * from users where user_email = '$name' and user_password = '$pw'",$conn);
    五、存储过程、触发器和函数5.1 存储过程本平台后端共采用了三个存储过程,下面我将分别对其进行介绍。
    5.1.1 商品数量设置存储过程(setrest)过程输入:商品 id id,需要设置的商品数量 itemnum
    过程输出:操作成功返回 0,否则返回 1
    作用:将对应 id 的商品库存数量设置为 itemnum。由于商品的库存不可能为负值,因此首先判断 itemnum 是否大于等于 0,如果是,那么进行赋值操作,输出 0;否则操作不合法,返回 1
    实现代码:

    5.1.2 商品评价统计存储过程(itemcomment)过程输入:商品 id itemid
    过程输出:1 星评价的占比 n1 , 2 星评价的占比 n2,3 星评价的占比 n3,4 星评价的占比 n4,5星评价的占比 n5,该商品的评价总数 total
    作用:统计 itemid 对应商品的所有评价的数量,并得到各等级评价所占的比例,以方便前端建立报表图形。
    实现代码:

    5.1.3 订单管理存储过程(orderManage)过程输入:用户名 username, 商品 id iid, 购买数量 num
    过程输出:运行结果 res 0 为执行成功,否则为 1
    作用:在用户进行购物操作的时候,根据不同的场景进行不同的订单操作。如果该用户不存在未结算的订单,那么系统将会为此用户新创建一个未结算的订单,之后将用户购买的操作插入到该订单的订单详情之中;如果该用户名下存在未结算的订单,那么系统将会直接在此订单的详情中插入用户现在购买的商品的信息
    实现代码:

    5.2 触发器5.2.1 商品评分更新触发器(item_star_update)作用对象:商品信息表(item)
    触发条件:comment 表插入操作后
    功能:在 comment 表中插入了一条新的评论之后,也就是用户对某商品进行评价之后,根据此评价重新计算该商品的评分(item_stars)
    实现代码:

    5.2.2 商家评分更新触发器(shop_star_update)作用对象:商家信息表(shop)
    触发条件:商品新表做出修改后
    功能:根据商品评分的修改更新商品的评分
    实现代码:

    5.2.3 用户年龄检查触发器(check_user_age)作用对象:用户信息表(users)
    触发条件:在用户表进行更新之前
    功能:首先判断输入的年龄是否合法,如果合法,更新用户年龄,否则终止操作
    实现代码:

    5.2.4 商品详情检查触发器(check_item_num)作用对象:订单详情表(iteminorder)
    触发条件:在订单详情表进行更新之前
    功能:判断用户购买的商品数量是否合法,如果合法,更新订单详情,否则终止操作
    实现代码:

    5.2.5 订单价格更新触发器(order_price_update)作用对象:订单详情表(iteminorder)
    触发条件:在订单详情表插入新条目之后
    功能:根据更新的商品的 id 和数量更新当前商品的价格
    实现代码:

    5.2.6 用户支出统计触发器(user_outcome_adapter)作用对象:订单信息表(orders)
    触发条件:订单信息表进行更新之后
    作用:根据更新订单的用户名,更新该用户的总支出情况
    实现代码:

    六、实现技术6.1 前端技术整个前端使用了很少 bootstrap 的 css 和 js 样式,基本的样式都是通过 html + css + javascript 手工实现,也运用了少许的 jquery 内容。前后端通信通过 ajax 进行,传递信息格式是 json。
    6.2 后端技术后端未使用现有的成熟框架,采用 PHP + MySQL 手工搭建。每当前端发来请求的时候,后端会首先解析前端所发来的 JSON 数据,之后进行相应的数据库查询,最终将查询的结果重新打包成 json格式返还给前端。大致的实现流程如下:

    七、运行实例7.1 主页页面主页页面采用 HTML + CSS + JS 实现动态加载,各个分栏中的内容都来源于数据库,可以跟随数据库的变化而变化。未进行登陆以及登陆后的页面会有所不同。

    7.2 登陆界面在主页点击登陆按钮之后将会弹出对应的登陆弹窗,在弹窗内输入注册邮箱和密码,然后点击立刻登陆。此时前端将会连接后端的服务器,进行身份校验,在确定输入的密码和登陆的用户一致后方能完成登陆操作。

    登陆后的主页右上角将会显示用户的用户名或者商家的商家 ID。

    7.3 商品页面商品页面可以通过点击主页的商品图片或者通过点击搜索后的结果到达,展示了商品的各个属性和评价。用户可以在此购买商品,也可以对商品进行评价。
    如下图所示,页面最上方显示商品的名称和描述,左侧有商品的配图,右侧有商品的优惠价、原价以及库存等信息。下方显示此商品的消费评价等信息,用户也可以通过点击提交评价按钮进行评价的提交。提交后的评价将会显示在页面的最下方。

    7.4 商家管理页面商家登陆后即可进入到商品管理页面,商家可以在这里修改自身的信息,也可以在此对商品做出添加,删除,修改操作。

    7.5 搜索页面搜索功能分为按类别搜索以及按照关键字搜索两类,点击页面上方的页面即可跳转到商品的类别搜索界面

    7.6 购物订单购物订单上半部分显示未支付的商品,按下显示金额的按钮可以进行支付,一次支付的所有内容算作一个订单。下半部分显示已支付的订单,每个订单用一圈黑色包裹,里面展示了订单具体内容。

    7.7 管理员登陆及管理接口
    八、源程序简要说明8.1 前端程序前端内容基本以 html 的格式放在根目录下,而每个 html 文件另配备一个 javascript 文件来实现动态加载以及通信。因为 css 优先级的问题,所以大部分 css 样式都嵌在 html 内部来重写 bootstrap代码。

    index.html:主页面,顶端摆放大型横幅,来宣传推广商品。下面左侧有个移动导航条,分类导航到各个栏目的商品,栏目共分五类:美食、酒店、电影、KTV、生活服务。每类各展示几个商品,点击更多会跳转到类别目录下
    mer.html:商品信息界面,上半部分展示商品具体信息,用户提交订单。下半部分展示商品评价并且用户可以自己填写评价
    merchant.html:列出商户具体信息,提供按钮进行编辑
    merchantEdit.html:商户编辑信息界面,可编辑名称、邮箱、电话、地址
    merEdit.html:商品信息编辑界面,可编辑名称、描述、原价、价格、图片、库存、类型
    user.html:用户个人信息界面,显示用户年龄、邮箱、电话、地址、头像、总支出
    userEdit.html:用户个人信息编辑界面,可编辑用户年龄、邮箱、电话、地址、头像
    register.html:登录界面
    result.html:顶部搜索结果界面,同时也是分类显示界面,界面每一排显示一个符合结果的商品
    paylist.html:订单界面,上面是未支付的订单,按下方按钮可以进行支付。下面是已支付订单,每一个订单会展示在一起。每个订单可以有多个不同的商品

    8.2 后端程序后端连接数据库所用的函数全部保存在 htdocs/php 文件夹下面,各文件的具体功能如下:

    addComment.php:创建商品评价的函数
    addItem.php:供商户添加商品所用的函数
    adminlogin.php:管理员登陆功能的函数
    createorder.php:创建用户清单的函数
    deleteitem.php:删除物品的函数
    itemcommnet.php:显示某商品评价的函数
    loadindex.php:加载主页内容的函数
    loadinfo.php:读取个人信息的函数
    loadmer.php:mer 页面的动态填写函数
    loadshop.php:读取商家信息的函数
    login.php:用户/商家登陆用函数
    mysql.php:连接数据库所用的函数
    pay.php:处理订单结算的函数
    register.php:实现登陆功能的函数
    search.php:实现搜索功能的函数
    shopitem.php:实现商户页面商品填充的函数
    test.php:单纯的测试用函数
    updateitem.php:更新商品信息的函数
    updateshop.php:更新商户信息的函数
    updateuser.php:更新用户信息的函数
    userorder.php:读取用户所有订单的函数

    九、总结通过这次数据库课设的实践,我们对于课上所讲授的数据库知识有了更进一步的了解。不仅亲手从模型开始进行了完整的数据库设计流程,还亲自实现了事务处理、触发器、索引、存储过程等机制,对于课上学习的内容进行了进一步的巩固和加强,同时也深刻地体会到了“实践”对于计算机科学这个学科的重要性。纸上得来终觉浅,绝知此事要躬行。由于刘瑞老师课上讲授的 SQL 语句多为 T-SQL,而且之前的题目大多都是用笔写 SQL,这导致我们的数据库编程经验时期是非常短缺的。对于手写 SQL 语句中的小错误,我们常常会归结于自己的马虎,但是等真正敲起代码来的时候,一个小小的错误都会导致 SQL 语句无法执行。不能熟练使用的结果就是提笔就报错,然后进入漫长的 debug 阶段,在经过比较漫长的熟悉过程之后,开发的效率才慢慢提高了起来。在数据库编程面前,细心,才是保证开发效率的唯一捷径。
    5 评论 38 下载 2019-12-29 14:46:34 下载需要15点积分
  • 基于JavaScript和MySQL的文化平台网站的设计与实现

    摘要中国文化源远流长,自古就有文人雅士作诗赋词,舞文弄墨,尽显风雅。现今则有歌手作家思想成文,心绪为曲,亦现儒雅。文化是传承的,是流传不息的,也是众多人所追求的。从各种各样的文化中,我们提升自己,丰富自己。而我现在所要做的就是给这类用户提供一个关于文化的平台,通过这个平台,用户可以查看各类诗词散文,各类优秀用户的奇思妙想,同时也可探索一些世界奥秘,从而提升自己的文学素养,文化底蕴以及文化知识。现在的社会趋向于数字化,信息化,越来越多的人通过互联网来获取信息,丰富自己。而这个平台也就迎合了社会的发展,符合了现在人的日常习惯。
    就技术方面说,现在社会发展迅速,农村人也几乎家家户户通上了网线,纷纷加入互联网大军。提到互联网,几乎每个人先接触到的事物应该是浏览器,而浏览器就是个网站显示的平台,有了它,用户才能访问不同的,各式各样的网站。自从h5现世,网站的发展更是一发不可收拾。页面元素从此不再是单一的文字,慢慢的也有了炫酷的动画效果和美好的色感,这也促使了更多的用户来访问网站。由于浏览器的良好兼容性,更是促进了它的发展。因此,我也选择了做网站来做我的毕业项目,目的是使更多人接触到我的网站,然后通过我这个平台提高文化素养。
    关键字:文化; 思想; 网站; 浏览器
    AbstractChinese culture has a long history, Since ancient times,Literati make rhyme, showoff literary skill, full of elegance. Todaythere are singer and writer make idea to article and Elegant, full of elegant. Cultureis inherited and endless, Is also the pursuit of many people. Froma variety of cultures, We raise and rich ourselves. All I haveto do now is to provide a platform for this kind of culture, Throughthis platform, users can view all kinds of prose poetry, allkinds of excellent user ideas, explore the mysteries of the world. Soas to enhance their literary quality, cultural heritage and cultural knowledge. Thepresent society tends to be digitized and Informatization, Moreand more people have access to information through the Internet to raise themselves. Andthis platform will cater to the development of society, in line with thepeople’s daily habits.
    Technical aspects said, Nowthe rapid development of society, almost everyhousehold in rural areas on the net, join the internetarmy. Mention Internet, almosteveryone should first be exposed to the browser, thebrowser is a web site display platform, userscan access different, various websites by this. Sincethe H5, the development of the website is more rapid.Pageelement is no longer a single text, slowly also has acool and bright color animation, this also promptedmore users to visit the site. Due to the good compatibility of thebrowser, but also to promote its development..So, Ialso chose to do the site to do my graduation project, thegoal is to get more people into my website, andthrough this platform to improve cultural literacy.
    Key words: Culture, Idea, Website, Browser
    1 引言1.1 课题背景人的一生是一个不断学习的过程,从呱呱坠地时期,我们就已经开始了学习,第一门课就是语言,从最开始的拼音字母到日常交流在到书写诗词,我们身心不断成长,自身素质不断提高,文化素养也不断增强,逐渐成长为一个有文化素养的人。同时使得我们在谈吐之间就显风雅。中国是一个有着文化底蕴的国度,而作为这个国家的子民,学习一些诗词遍成为了我们的基础课程。不同学期的课本也都有所体现,小学接触简单诗,如《山村咏怀》,从中还学会了数学知识。慢慢长大,又接触到诸如李白,李商隐,陶渊明等著名诗人,从其诗词中仿佛看到那个时代的风景与时事。现在的人对它在创造,便有了自己风格的短片散文,如徐志摩的《再别康桥》,戴望舒的《雨巷》,艾青的《我爱这土地》等等,这些文章都写出了自己的风格,也与时俱进的符合现在大众的胃口。还有各类新闻看报,其中内容也带有极强的文化感,文字标点之间散发文化之气。而对于咱们平凡人来说,也有不少人喜欢写写文章,陶冶情操。逐渐积累文化的慢慢的写出自己风格的书籍,再辅以装饰,最终出版,让世人领略自己的文化风格。而这就称之为创作,创作就少不了灵感,这些灵感从任何而来,如何保证能启发灵感?就需要一个平台,一个分享自己文学作品的平台,从中查看,获取灵感。所以我要做的就是为用户提供这个平台,这个平台采用各类优秀文章,在用简单明了的页面加以呈现,供用户查看,欣赏。
    现在是个互联网的时代,网络的出现和迅速发展,冲击了传统信息的传播方式,冲破了人们获取新的时间和空间的限制,获取信息的途径不再限制于报纸、书籍,人们更多接触的是电脑,手机,越来越多的人习惯从网络上获取自己想要的信息,这种方式也符合现在快节奏的生活方式,人们获取信息追寻的是更好,更快。而对于互联网来说,人们接触的更多是网站,点开即看,关闭即走,简单便捷。我的课题也因此确定实现个文章信息类的网站,供用户查看。本网站秉承专而精的精神,服务用户,提供用户优质服务,构建良好平台,功能全面,希望能被用户接纳和喜欢。
    1.2 课题意义该课题适应现代社会人们的快节奏的生活,现在社会人们不再希望用书籍那种接受信息慢的方式去接受文化,而会去追求更快更好。希望在短时间内丰富自己的文化素养。我这网站,用户看到后,能简单明了的找寻自己需要的东西,各类文章随点随看。只需通过简单的点击,遍可以查看各个文章,没有复杂操作。页面整洁大观,给人以清爽之感,在寻找文章和阅读文章过程中也不因界面而反感。有了这样界面做基础,在辅以优美的文章,遍会激励用户去学习,去探索,即扩大了网站的用户量,也给用户提供了优质的服务。
    在这纷纷扰扰的现在社会中,总有些人想找块属于自己的静土,而这个平台也就迎合了用户的需要,为用户提供了一处心灵的温煦地。在这里用户可以学习,可以探索,可以互相讨论,甚至可以绘画。在这块地域中,用户获得更多的是正能量,这里的思想模块,慢慢正能量,为迷茫的用户指明方向,送去阳光。用户还可以对一些自己深有体会的文章下面说出自己的故事,是一种宣泄,也是一种激励。也可以让更多用户来了解你的故事。画板页面,用户可以随意编织自己的世界,让你的心灵为画,并可下载。总之,这个网站是一个好用,好看,好玩的网站。
    2 相关技术简介2.1 html技术它是一种超级文本标记语言,是一种规范,也是一种标准。它通过用各式各样的标签来组成网页的各个部分。它本身也是一种文件,类似txt文件。它控制的是网页的结构,或称之为“骨骼”,当浏览器读取它的时候根据它内容标签的不同,而呈现出不同的结构形式。当然,对于不同的浏览器内核而言,它的解析形式也不同,而现在它也更新到了5版本,添加了许多的新特性,而有些浏览器对这些新的特性解析也不同,甚至不能解析。所以用低版本的浏览器需要注意这点。它的语言特点,简易性,可扩展性,平台兼容性,通用性等等,这些好的特性也使得它用的更加全面和发展迅速。
    2.2 css技术CSS全称Cascading Style Sheets(层叠样式表),如果说html是骨骼的话,那么他就是皮肤,它点缀html,使网页有了色彩和质感。它提供了丰富的样式外观,以及设置文本和图片属性的能力,可以调整各个标签的大小以及间距,允许调节文本的大小和装饰。同时它又易于修改,简简单单的几行代码,就能为网页增色不少。通过各类选择器(id选择器,标签选择器,类选择器等等),把想要的样式加到确定的标签上,为此标签添加属性和样式。另外它的层叠属性也不能忽略,层叠意味着后面的代码会把前面的覆盖掉,这也就实现在基础的属性上添加新的属性。为了手机端,它也新增了媒体查询功能,使得开发手机端也变的简单和快捷。
    2.3 JavaScriptJavaScript,它应该称之为网页的血液。是一种直译型语言,是一种弱类型的语言。它可以直接嵌入html页面中,为标签添加交互行为,也可放到单独的js文件中,这样利于结构和行为的分离,更明确交互的行为。它也有良好的跨平台性,支持绝大多数浏览器,更甚至在可以在windows和mac中使用同一套,便可有相同的呈现。当然它不仅仅有交互本领,它不断发展,可以控制cookies和sessions,保存用户的信息,把数据送到服务器等各种本领。另外它也和其他语言一样,是基于对象的,是动态性的,它也有大众编程语言的api,相同的状态下又有自己的独特性,在浏览器方面独树一帜。
    2.4 JQueryjQuery是JavaScript封装好的一个库,有良好的兼容性,一方面又解决了ie的兼容问题。它封装了多个用于实际开发的api,简化和方便了开发,比如常用的和后台进行交互的ajax,操作简单,轻松获取后台数据,进而渲染界面。它还提高了html中dom和js的交互性,使得一些DOM操作简单方便。同时他入门简单,也方便了后台人员来学习,进而明白前台工作的运行原理。
    2.5 VueVue是一套构建用户界面的渐进式框架,它是轻量级的框架,入门简单,且运行方便,采用自底向上增量开发的设计。采用mvvm模式,方便管理和开发。而且它是轻量级框架,适合刚接触前端开发的人来学习,对于练习小项目,有利而无害。
    2.6 MySQL技术MySQL是一个关系型数据库管理系统,它也由库,表等特性。体积小,速度快,总体成本低,适合中小型网站的数据库。它可以和Apache搭配成良好的开发环境,我的可以已使用Apache搭建的MySQL库。一个网页,便可进行相关的操作。它支持支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。为多种编程语言提供api,支持多线程,充分利用cpu的资源,优化sql查询算法,更快的查询速度,同时它又是开源的,使用它,完全不用担心额外的费用。
    2.7 node.js技术Node.js其实是js的一种环境,这里单拿出他来说,是因为它可以称为前端发展的里程碑,它自己的架构等等方面,为前端的发展注入了动力。举个例子,它采用了一个“事件循环”的架构,使得编写可扩展性的服务器变得即容易又安全,提高了服务器的性能和形式。而且它又有不同的模块,各个模块可以随意导入,简单操作就能使得自己项目拥有强大的本领。这几年他更是发展迅速,慢慢的开始挤掉php王者的地位,好多公司也开始从php向node转变。有了它,你甚至可以开发一个桌面应用。Node.js,看名称,它是由js写成的,也就使得前端开发者能更容易的掌握它,也就促使了前端开发者向全栈发展。
    3 需求分析3.1 系统功能该项目主要是为用户提供一个平台,用于向其展示文章。

    用户注册登录功能
    首页模块,简单呈现网站所有模块
    梦感觉模块,展示各类文章
    梦探索模块,展示各类离奇事件
    梦思想模块,以标签的方式呈现给用户优质思想
    梦画板模块,提供绘画功能

    3.2 系统开发环境
    开发工具 : webstorm,photoshop
    前台开发语言 : html,css,JavaScript
    后台开发语言 : node 6.7.0
    数据库 : Apache环境下MySQL
    项目演示 : chrome浏览器

    3.3 功能性需求分析3.3.1 用户系统用户的注册登录功能,注册设置限制条件,如用户名和密码长度
    3.3.2 文章系统录入各类文章,不同文章不同处理,梦感觉界面文章保存其文章名称、图片、作者以及内容,梦思想界面保存用户名称和用户思想短句。
    3.3.3 评论系统根据用户的id和文章的id保存评论,再在页面加以显示
    4 系统设计4.1 用户登录注册注册功能,用户名不能为空,不能少于3位,长度不能超过12位,密码不能为空,只能由数字和字母组成,长度不能少于8位,不能超过15位。确认密码必须和密码 一致。每条判断均有对应的错误提示。
    登录功能,用户名不能为空,数据库应有相应的用户,密码不能为空,不能填写错误。登录成功后页面自动显示用户登录状态。
    具体流程如图4-1所示。

    4.2 用户评论评论方面,初次登录页面显示其他用户的评论。对该文章评论判断评论内容是否为空,用户是否登录,为否则不能进行评论。
    具体流程如图4-2所示:

    4.3 数据库设计用户表存放用户注册信息,梦思想,梦探索,梦感觉主要存放关于文章的相关信息,评论表依赖用户表和梦感觉表,并存有用户评论。
    用户表如图4-3所示,Id为主键,用户名(name)设置成varchar类型,方便用户起随意名字,密码(pwd)也为varchar类型,使得密码的设定也更随意,同时也提高了密码的破译程度。

    梦思想表如图4-4所示,Id为主键,内容(content)考虑到文章的长度,设置成text类型,方便录入一定长度的文章,作者(author),长度和用户名一样,所以设置成varchar类型。

    梦探索表如图4-5所示,Id为主键,标题(title)和日期(date)都设置成varchar类型,满足要求也方便日后填写,内容(content)因长度原因设置成text类型。

    梦感觉表(文章)如图4-6所示,Id为主键,标题(title)、图片(image)和作者(author)都设置成varchar类型方便录入,内容(content)考虑到长度原因设置成text类型。

    梦感觉表(评论)如图4-7所示,评论表,依赖用户表和梦感觉文章表,对应的是uid和aid,这两个字段使用int类型,时间(date)设置varchar类型,方便录入,内容(content)设置成text,防止数据溢出。

    5 系统实现5.1 首页如图5-1所示,主要展示网站的所有模块,一眼便可看尽网站功能,使得用户更能了解该网站,从而去用该网站。登录和注册也在该页面,可以方便用户更简单的去注册和登录,少去跳转页面的时间和流量。顶部栏颜色采用深蓝色,常看也不产生眼部疲劳,也有自己设计的网站logo,顶部栏也是整个网站的核心,有着去任何一个页面的连接,每个页面有这个顶部栏,方便用户查看各类文章。整体网站颜色采用白色背景,更能凸显网站结构和内容,也方便了用户的查看,同时布局是常用的左右布局,符合常理。页面初始不再采用每个网站都有的轮播图,而是采用用户点击的方式渐入渐隐图片,看似平凡却深藏奥妙。
    所有呈现的图片均有划入变淡效果,使得网站整体简约而不失风雅。各个模块分块明确,用户可以轻松看出每个模块的位置,并用点击进入的入口。如图5-2和5-3所示,具体功能有,分别是登录和注册。注册时会进行常规的验证,我这里采用失去焦点,就进行验证,方便用户某条信息不规范及时改正。常规验证主要有,用户名和密码不能为空,用户名和密码长度限制等等,验证成功,后台在做检测,用户是否已经注册,该用户名是否已经存在等操作,双重验证,从而保重网站坚固性。注册成功后会直接登录。登录时同样进行常规验证。

    5.2 梦感觉如图5-4所示,现,侧栏点明网站的名称,主体栏存放文章。主体栏中以表格方式呈现,单个表格可以看出文章的图片、作者、以及时间等信息。每页可呈现16篇文章,多余文章在其他页面显示,底部有分页功能,可以跳转上下页以及具体页面,方便用户查看。如图5-5所示,文章详细内容,已登录用户可以进行评论。当呈现文章详情时显示以前用户对该篇文章的评论。文章阅读到最后,有切换上下篇按钮,用户可以通过简单点击查看上一篇或下一篇文章。

    5.3 梦探索如图5-6所示,边栏的方式呈现,主体栏显示所有文章,多余文章分页显示,侧边栏显示优秀的文章,文章可点击查看详情。

    5.4 梦思想如图5-7所示,使用黑板背景图,“黑板”上贴有各类用户思想短句便签,用户可以根据自己的喜好移动便签,并可以通过点击移除便签,以及换一换功能。

    5.5 梦画板如图5-8所示,页面主要是一个画板,画板工具有,普通笔、毛笔、画矩形,画圆形,写文字,橡皮擦。顶部栏左侧提供设置笔触大小和颜色,以及填充色功能,右侧提供一键清屏和点击下载功能。

    6 结论本项目主要是以前端为主项目,后台功能并不多。项目以HTML,CSS完成前台页面,以JAVASCRIPT,JQUERY,VUE完成前台逻辑,用NODEJS完成后台逻辑,用MYSQL搭建数据库。项目功能主要是向用户展示优美文章,促进用户文化素质的提高,也方便大众用户查看优秀散文和各类神奇事件。散文是培养人文素养的文化载体,能够使学生得到精神上的愉悦和身体上的放松,能培养健康审美方向和高尚情绪。自小学习,语文就是一门主课程,并伴随我们的学习生涯。在学习中,我们阅读诗词歌赋,并会主动模仿去学习,去书写。而慢慢长大学文章看文章的时间逐渐减少,减少的原因不想而知,我们看书的时间越来越少,更多的时间是在互联网上,而我因时而生,这个平台,意在帮助更多人拾起中国文化,提升素养。
    7 致谢经过漫长的努力,终归完成了毕业设计,感觉毕业设计是大学四年的结晶,和大学各位老师细心的教导是离不开的。在大学,因为老师的鼓励和教导,自身不断成熟,从出生牛犊变成了能独挡一面的人。使得我现在进入社会,有了成熟的心智和优质的能力,独自一人能在大城市里闯荡。
    现在算算,在公司上班也有半年了,经常深刻感受到,大学给我的能量,好多人都说大学教的都是理论,都是些没用的东西,但真正上班了,你会逐渐发现工作是需要这些理论去支持的,没有了这些理论寸步难行。
    感谢在最后学期老师以及各位同学对我开发项目的指导和意见,在此表示衷心的感谢您!
    参考文献[1] W3C与IDPF. w3school在线教程. [2016-05-01]. http://www.w3school.com.cn
    [2] John Resig. jQuery. [2016-05-01]. http://jquery.com
    [3] node.js 官网(中文网) http://nodejs.cn/
    [4] vue.js 官网(中文网)http://cn.vuejs.org/
    [5] Mysql 360百科 http://baike.so.com/doc/2303745-2436931.html
    2 评论 31 下载 2018-09-28 22:42:58 下载需要16点积分
  • 基于Struts2+Spring+Hibernate+MySQL网上体育商城的设计与实现

    摘 要如今我们生活在一个互联网时代,随着智能手机与网络技术的日益发达,电子商务空前发展,许多商品的销售也逐渐从有形的市场转向虚拟的网络,为了满足人们购买体育用品的需求,网上体育商城应运而生,目的是在体育商城与消费者之间建立一座高速、便捷的网上信息桥梁,从而可以节省用户的时间、方便他们购买,使其永远走在时代的前沿。
    本系统的设计严格遵循软件开发流程,使用MVC模式,采用开源框架Struts2、Spring、Hibernate进行开发,使用java语言编写,后端的数据库采用MySQL,通过Spring配置文件与数据库进行无缝连接,应用可以跨平台的Web应用技术与SSH结合开发的网上购物系统—网上体育商城,通过使用这些框架,使开发过程中的逻辑更加清晰,更有层次,也简化了代码的书写,更好的了解了Web应用程序和这些开源的框架技术,熟练了使用框架开发的流程。
    该体育商城网站的前台页面非常简单明了,当用户第一次访问该商城时,可以清晰的看到商城中的新款商品与销量排行,可以非常方便的挑选到自己需要的商品,后台的管理也很方便,管理员可以对商品、订单等进行管理,所以该网上体育商城的创建可以更好地解决人们因没有时间到实体店而不能买到自己需要的体育用品的问题,商家使用该系统,也可以方便管理,提高工作效率。
    关键词:网上体育商城;Struts2;Spring;Hibernate;MVC
    AbstractNowadays,we live in an era of the Internet,With the development of smart phones and network technology, the unprecedented development of e-commerce,many goods s-ales have gradually shifted from the tangible market to the virtual network.In order to meet the needs of people to buy sporting goods,Online sports malls came into being.The aim is to establish a high-speed and convenient online information bridge between the sports mall and the consumers,which can save the user’s time and make them easy to buy and keep it at the forefront of the times.
    The design of the system strictly follow the software development process, the use of MVC model, the use of open source framework Struts2, Spring, Hibernate development, the use of java language, back-end database using MySQL,through the Spring configuration file and database seamless connection, the application can be cross-platform Web application technology and SSH combined with the development of online shopping system - online sports mall,by using these frameworks, the logic of the development process is clearer, more hierarchical, simplifying code writing, better understanding of Web applications and these open source framework technologies, and proficient in the use of framework development processes.
    The front desk page of the sports mall website is very simple and clear, when the user first visit the mall, you can clearly see the mall in the new goods and sales ranking, can be very convenient to pick their own needs goods,the management of the background is also very convenient, the administrator can manage the goods, orders, etc., so the creation of online sports mall can better solve people because there is no time to the store and can not buy their own needs sporting goods,businesses use the system, you can also facilitate the management, improve work efficiency.
    KEYWORD:Online sports mall; Struts2; Spring; Hibernate; MVC
    第1章 前言1.1 系统开发背景伴随着互联网加时代的到来,智能手机的不断普及,过快的工作节奏,使人们在紧张繁忙的工作之后,没有大把的时间再去逛商场购买物品,因此很多人选择在网上商城购买自己心仪的物品。我们生活中常见的体育用品从外表观察,品种繁多,实体店无法有足够大的店面来展示所有物品,有些喜欢锻炼的朋友没有时间去实体店挑选,而且现在的网上购物环境越来越好,买到的东西如果不满意还可以免费退换,人们也乐于尝试在线购买。所以网上体育商城在互联网上纷纷出现。
    由于我国的互联网已经基本全面覆盖,速度很快而且信息量也很全面,方便了人们的生活。就在网上销售体育用品的商城而言,销售理念其实非常简单明了,就是尽最大的可能帮助顾客在第一时间寻找到自己需要的体育用品。对于喜欢锻炼的人来说,网上体育商城近在咫尺,并且二十四小时营业,只要顾客来访问店铺,肯定有客服招待,只要你有网,就可以随时浏览和购买商品,不再需要亲自跑去商店,一家一家的跑,只要打开电脑访问商城就可买到自己所需要的体育商品,而且顾客在网上商城看到的商品要比实体店里多的多,下单也很方便,同时还减少了购买过程中的支出,现在时间对于每个人来说都非常宝贵,网上购买体育商品可以节省大量时间,这对于那些没有时间经常逛实体店或其住所离店面较远的顾客来说,无疑是一个好的选择。所以我认为该网上体育商城一定会有大的发展空间。设计该系统的最初目的就是要实现在线销售体育商品,顾客可以注册会员、浏览商品、在线留言、购物下单等一系列功能,可以保证顾客不用出家门就能够在该体育商城购买到自己非常喜爱的商品,最终用户可以买到自己喜欢的商品,商家也可以获取更多的利润,形成一个互利的局面。
    1.2 国内外研究现状现如今,随着智能手机的飞速发展,越来越多的人已经习惯了在网上购买商品,因此最近几年来,国内出现了很多大的网上体育商城,主要是买一些专业的体育用品和一些运动类的服装,大家平时所访问的有淘宝、天猫、京东、虎扑、优个网等等,这些网站上的商品都是品牌直接授权,正品保障,在业内的口碑不错,还有一些有名的体育类的品牌商家,也把线下的实体店转到了线上,比如李宁、361、安踏等等,他们也有专门卖自己品牌商品的网上商城。
    国外使用互联网的时间要比咱们早,网络技术的发展相对咱们也要强,因此国外的网上商城的发展也是相当不错的,比较有名的有亚马逊,在这个网站上面可以买到自己喜欢的很多商品。
    纵观国内外的发展,我感觉网上体育商城是网络购物中不可缺少的部分,因为在网上购买体育商品能够弥补传统购买方法的很多缺点,互联网加传统购物行业,既为需要购买商品的顾客提供了方便,也使商家尝试了一种新的销售手段。
    现在网络正处于大力发展的时候,各行各业都需要计算机的辅助加以提高效率,购买体育用品更应该求助于快速并且方便的网络工具——网上体育商城。
    1.3 系统开发目的及意义在各行各业竞争日益激烈的今天,工作的效率和质量,是每个企业都要面对并且重视的问题。如果网上体育商城的系统开发成功,有些着急需要使用产品而没有时间的客户,将不再需要去实体店寻找,现在Wifi的覆盖率也非常广,可以在任何地方,拿出自己的手机或电脑,登上体育商城的网站,挑选自己需要的商品,下单订购就好了,非常的方便,顾客使用这样的系统,既可以节约时间,又能挑选自己喜欢的商品,非常省事,而商家使用这样的系统,可以提高办事效率,把以前对销售员的开销能省下来。
    随着这种购物网站的不断出现,计算机和网络技术的不断进步和提升,个人电脑和智能手机的增加,使人类的信息传播方式和生活方式都得到了很大的改变,人们的网购也会越来越频繁,这无形中也促进了互联网在中国的发展,对提高我国的经济发展水平也是有利的,所以我认为开发这个网上体育商城,对人们的生活有诸多的好处,值得开发。
    第2章 相关技术工具介绍2.1 Struts2与MVCStruts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,Struts2中对于用户的请求是通过拦截器来处理的,当用户在客户端对浏览器发出HTTP请求,根据web.xml配置,该请求被FilterDispatcher接收,根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton,Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证,Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面,返回HTTP响应到客户端浏览器,简单的说,就是用户在页面发出一个请求,通过struts找到对应的方法进行处理,处理完成把结果返回。
    MVC模式是项目开发中最常用的设计模式,英文即Model-View-Controller,模型里有JavaBean,JavaBean的主要工作是负责数据模型,进行业务逻辑和访问数据库,视图中有JSP,JSP可以允许在HTML中插入JAVA代码,控制层里有Servlet,Servlet的作用是接收请求和控制应用程序,当用户在客户端发送请求时,服务器响应客户端的执行过程是,先执行Servlet,Servlet调用JavaBean,JavaBean访问数据库,数据库返回数据给JavaBean,Servlet调用了JavaBean之后,转向JSP页面,然后JSP页面就可以动态的显示数据呈现给用户,主要目的就是把大量的数据分开展示,也就是模型层和视图层的分离,中间用控制层来协调,起着一个类似中介的作用,将模型运算的结果发送到视图,视图负责将这部分数据显示给客户。

    模型(Model)相当于人体的骨骼,里面封装了各种拥有私有属性和set/get方法的类
    视图(View)相当于人体展示的动作,将数据用控制层提供的方法从模型层中取出来放在视图层中展示出来
    控制器(controller) 相当于人体的大脑,封装了各种读取模型层中数据的方法,主要控制各种业务逻辑

    这三者之间的关系如图2-1所示。

    2.2 HibernateHibernate是一个开源持久框架。它是由Gavin King在2001创建。简单来说,Hibernate是一个轻量级的ORM(对象关系映射)解决方案或java工具、Hibernate框架进行简化,用java开发应用程序与数据库的交互。Hibernate框架的主要优点是:比起JDBC,Hibernate没有很多复杂的SQL语句需要书写。使用Hibernate框架,没有必要在JDBC中完成所有不必要的繁琐工作;域对象与关系数据库的高效映射。因此,没有必要集中精力管理数据库中的数据;它的性能更好,速度快,因为使用缓存内部处理。Hibernate框架在数据库中自动创建表,因此不需要手工创建表。它简化了复杂的连接,由于这种简化,它很容易从多个表中获取数据。Hibernate支持继承、集合和关联。Hibernate有自己的独立数据库查询语言。
    2.3 SpringSpring 是一个开源框架,通俗来说是用来关联两个对象的,对象和对象之间不再需要实例化,只需用在spring的配置文件中配置一下就可以确定两个对象之间的依赖关系,spring的两大特点是依赖注入和控制反转,简单点来说,就是在代码中对对象实例化以后,需要调用对象的方法,但是使用了spring以后,就可以直接在代码中指向需要的对象和对象的方法,只需要在配置文件中自动把类注入,不需要自己在写new,是系统的耦合度降低了,这样做的好处是只需要知道对象的名称而不需要知道对象具体是干什么的,一旦对象改变只需要简单的改一下配置文件即可。
    AOP又称为面向切面编程,它的实现原理还是用了反射,通过对某一个种类的方法名做监控来实现统一处理,面向切面编程最大的用途就是提供了事务管理的能力,事务管理非常的复杂,而我们的目的是去访问数据库,而不想管理太多的事务,所以spring在我们访问数据库之前,自动帮我们开启事务,当访问数据库结束时,会自动提交或回滚事务,这样可以使我们写的代码更加的简洁,注重于它实际需要解决的问题。
    2.4 开发工具以及环境2.4.1 Eclipse工具说明Eclipse是IBM公司投资开发的,是一个开源、功能强大、最为流行的Java编程工具,因为可以免费下载使用,所以大多数人都是将Eclipse作为Java的集成开发环境使用。
    Eclipse里的插件非常多,基本上能想到的插件都有,可以无限的进行扩展,尤其是公司做项目时,用eclipse找各种插件非常的方便,而且eclipse的图形化界面非常好,不会出现字体丑的问题,它提供的快捷键非常的好用,还可以设置自动补全,它里面的很多功能都是为java量身定做的,用它编写java代码非常的快。
    2.4.2 MySQL工具说明MySQL数据库软件中的一种,是当前比较受欢迎的开源的小型关系型数据库管理系统,因为它可以免费使用,而且体积小、速度快,所以受到很多中小型企业的喜爱,其被甲骨文公司收购后,由甲骨文进行开发、分发和支持。MySQL可以运行在所有的操作系统上,包括Linux,UNIX和Windows,可以说应用非常广泛,但是MySQL最常用于是基于Web的应用程序,由于它的性能优越,搭配JAVA和Apache tomcat可组成良好的开发环境。
    2.4.3 Tomcat服务器介绍Tomcat 服务器是SUN公司官方推荐的服务器和Jsp容器,是由java语言开发的,它只是一个servlet容器,是Apache的扩展,主要用来处理动态网页,是jsp的服务器之一,如果网页是纯html静态网页,通过浏览器就可以直接解析查看效果,但是网页一旦用jsp来生成动态网页,浏览器就无法直接解析了,需要用Tomcat服务器来进行解析,在这次开发中也应用到了。Tomcat部署很简单,只需要先将Tomcat添加到eclipse中,然后把需要运行的项目添加到Tomcat中,然后启动Tomcat服务器,Tomcat会自动检测这个文件,通常情况下第一次运行速度比较慢,而后运行速率会加快,因为在第一次部署完成后Tomcat要将jsp转化为Servlet文件后才能编译。
    2.4.4 系统运行环境
    操作系统:Windows7及以上
    Web服务器:tomcat7.0
    浏览器:Fire Fox、Google Chrome

    第3章 系统的分析3.1 系统可行性分析随着我国科技力量的不断提高,互联网的覆盖率越来越广,智能手机的技术越来越成熟,使用它的人也越来越多,在互联网上的各种各样的信息都很多,关于购物的信息也很多,网上购物已经是如今互联网中不可缺少的一部分,人们可以在任意时刻在手机上挑选自己喜爱的商品,我相信要不了多长的时间,人们就可以在网络世界上购买他们在现实生活中不方便买到的所有商品。可行性研究的目的,就是看如果这个项目开发成功,能否达到最初的开发目标,把它的最大价值发挥到极限。要想达到这种效果,必须它的可行性进行分析,预估一下开发成功的概率和成功以后的可用性。
    系统的可行性分析主要包括经济可行性,技术可行性,操作可行性和法律可行性。本系统的可行性分析如下:
    3.1.1 经济可行性由于开发网上体育商城所需的电脑,在电脑商城可以很容易的购买到,所需的软件也可以在官网上方便的下载,因此开发环境可以很容易搭建好,系统的主要成本主要集中在本系统的前期开发上和后期的维护上,前期的开发可能相对后期的测试辛苦一点,但假设通过自己的努力,成功的完成了此项目的开发,将来如果投入使用,卖家可以提高自己的工作效率,一个人就可以打理一个很大的店铺,节省了很多的劳动力,买家如果使用这个网站购买商品,可以大大的节约自己的时间,坐在家里就可以买到自己需要的体育商品,不需要再去大商场跑,由于系统的设计不是很复杂,开发的时间也不是特别长,所需提供的人员、花费的金钱都比较少,所以从经济可行方面来考虑此系统是可以开发的。
    3.1.2 技术可行性该网上体育商城有关技术方面的开发,主要包括对主要代码逻辑的实现、网站前台页面的设计和后台数据库的建立。对于前端客户端的开发应该做到功能完整、使用方便,对于前台页面的设计应该做到美观大方,对于后台数据库应该做到数据完整和一致、数据库安全性较好。
    开发该体育商城系统所采用的语言是主流语言java,数据库用的是Mysql,目前jsp是比较火的制作动态网页的技术,因此使用它作为处理动态网页的技术,这些开发所需用的技术都可以很方便的寻找到资源,并且能够顺利完成开发工作,因此从技术方面来讲开发此系统是可行的。
    3.1.3 操作可行性网上体育商城是一个基于Web的体育商城。系统的前台界面非常直观,不管你是不是第一次使用这个网站,打开网页就知道如何操作,无论用户在什么地方,只要有网,都可以在电脑上通过浏览器访问该体育商城,所有的操作都非常简单,商家不需要进行专门的培训学习,就可以对商城里自己的商品进行管理,买家就更不用说了,直接打开网站,浏览商品,有看中的直接加入购物车,付款就完成了,因此在操作上该商城的系统是可行的。
    3.1.4 时间可行性从现有的时间上来看,对于该商城系统的开发有将近四个月的时间,除过查询资料学习技术的时间,剩下的时间足够实现该项目的最基本功能,因此该系统在时间上是可行的。
    3.1.5 法律可行性从法律上讲,开发此系统所使用的所有技术、所有软件工具都是开源的、合法的,不存在触犯法律的行为,系统的设计都是自己独立完成的,没有抄袭任何系统的源代码,完全是自己的设计思想,并且该体育商城系统是为毕业设计准备的,并没有投入任何商业市场获得利润,因此该体育商城系统从法律上讲是可开发的。
    3.2 系统需求分析根据对该网上体育商城的功能进行分析,为了满足用户的需求,该系统应该满足以下功能,接下来从前台的客户端界面和后台管理界面分别对该系统的功能加以描述。
    前台页面的功能主要包括:

    体育商品分类:当用户第一次访问该商城时,可以按照商品分类快速查找到自己所需商品是属于哪一类型
    所售商品描述:当用户看到某一商品时,可以很快看到这件商品的详细介绍
    商品销量排行:在该商城的客户端界面,用户可以清晰的看到该商城畅销的前五件商品
    商品的搜索栏:当用户不想逐一类别的查找自己需要的商品时,可以在搜索栏进行查找,该搜索栏必须支持模糊查询,用户只输入关键字,就可以快速查找到自己需要的
    会员留言:该功能是用来专门给用户提供反馈意见的机会,用户对在该商城买的商品有某些意见,可以进行留言,或者对该商城有某些建设性的建议,也可以进行留言,总之,就是为用户提供一个与商家交流的窗口
    会员的注册登录:该功能是一个购物网站不可缺少的主要功能,用户只有注册登录成功后,才可以进行后续的一系列操作,不然就只能浏览商品,不能进行购买
    购物车:该功能也是一个购物网站必须的功能,用户不可能看中一件商品就去付一次款,这样对商家和用户都不是很方便,用户可以先将看中的商品加入购物车中,等挑选结束后,再进行统一付款
    查看订单:该功能主要是方便用户查看自己的订单,当用户下一次单时,商家可以受理此订单并进行发货,用户收到货后,可以确认收货并评价商品
    查看个人信息:当用户在该商城进行注册时,需要填写自己的个人信息,如姓名、性别、地址、邮箱、电话、QQ等信息,注册成功后,该商城会把每一位注册成功的用户信息保存下来,用户登录成功后,可以查看并修改个人信息
    联系我们:该功能主要是给用户提供商家的联系方式,当用户有某些需求时,可以直接跟商家电话联系
    网站公告:该功能主要是方便商家对顾客发布一些公告,如商城搞活动或有新商品上架等
    后台登录:在前台页面的下方提供一个管理员登录后台的按钮,管理员点击该按钮,可以进入后台登录界面,方便管理员进行管理

    后台管理页面的功能主要包括:

    系统参数:该功能可以使管理员看到该商城系统的版本号和作者及作者的邮箱,有需要改进的地方可以直接和作者联系
    管理员维护:该功能可以让管理员对自己的密码进行修改
    注册会员的管理:管理员可以对前台已经注册的一些会员用户进行管理,当某些会员用户有非法操作时可以进行删除,防止对该商城系统造成大的损害
    商品管理:该功能使管理员对该商品的类别和具体商品进行管理,对商城所售商品的类别进行增加、修改和删除,对具体某一件商品进行添加和删除
    订单管理:当某一用户在前台下单后,管理员在后台可以查看订单明细,受理此订单或删除该订单,方便管理员对订单的管理
    销量管理:管理员在后台可以对该商城所售商品的销量进行管理,商品的销量按从高到低进行排列
    留言公告管理:管理员在后台可以查看或删除用户的留言,发布最新的公告或删除过期的公告
    退出后台:该功能主要是方便管理员的退出,当管理员想退出后台管理页面时,点击此按钮,可以迅速返回到后台的登录页面

    以上就是该体育商城的前台客户端页面和后台管理页面所需要实现的所有功能。
    3.3 业务流程分析网上体育商城的主要工作流程为:启动服务器并进入系统界面,用户可以浏览网页,挑选自己喜欢的体育商品,管理员的权限是最大的,既可以管理整个系统,又可以管理已经注册的会员用户,对所售体育商品进行添加、修改和删除,还可以处理客户订单,以及对商品销量进行查看管理、查看留言。
    用户在该体育商城系统中的业务流程图如图3-1所示。

    该系统是将程序技术与生活中的实际应用紧密结合的好的案例,利用编程语言的技术改善了人们的生活,使不懂得技术的人也能与计算机进行交互,并且在该系统中,为了提高服务的人性化,专门设计了一个交流平台,商家可以发布公告,买家可以进行留言,对店铺提出自己的建议,有利于系统的不断完善。并且此系统界面简单直观,操作非常方便,只需轻轻点击鼠标就可以完成相应的操作,功能也非常丰富,适合所有的购物网站,方便移植,需要的商家只需要对前台代码做小的改动,就能更新前台的系统界面,及时显示出新的画面效果,省去了更改系统源代码的复杂,对工作效率和工作质量的提高很有帮助。
    第4章 系统的设计4.1 系统的设计在该网上体育商城的设计过程中,突出了面向对象的设计理念,使用的开发模式为B/S模式,后台管理系统与前台客户端的处理层次分的很清楚,并且考虑到了不同用户浏览网页的方式不同,在页面的开始设置了一个搜索栏,系统的界面非常简单友好,用户在访问的过程中,操作方便,系统的响应速度非常快,占用的资源很少,可以满足大多数用户的购买需求,页面设计比较人性化,匿名用户第一次访问该网站,可以很轻松的找到自己想要的商品。在设计和开发这个系统时,模块化的设计理念也很突出,把一个大的系统划分成好几个小的模块,简化设计,有利于更好的开发。
    4.2 业务对象设计在该体育商城的系统设计中,普通用户的权限有注册会员、登录网站、浏览商品、查询商品、加入购物车、下单购买,因为普通的用户登录网站主要就是想买到自己喜欢的体育用品,所以拥有这些权限足够了,普通会员用户的用例图如图4-1所示。

    也有一些访问者可能是匿名用户,用例图如图4-2所示。

    在该商城系统中,核心的管理者是系统管理员,管理员对商城里的各个功能模块都可以进行操作,对商城里的所销售的体育用品信息也可以修改,处理客户的订单,并能及时的增加一些时下流行的体育商品,下架一些过时的体育商品,反馈客户的留言,发布公告,管理员的用例图如图4-3所示。

    4.3 业务流程设计4.3.1 业务流程图在该体育商城的系统中,普通的用户第一次访问商城网站时,不能立即购买商品,只能浏览网页,要想马上购买商品,就必须要注册会员,输入自己的基本信息,设置正确格式的用户名和密码,然后登录,就可以买喜欢的商品了,而要想进入这个体育商城系统的后台管理界面,身份必须要是管理员,输入正确的名字和密码后就可以进入后台管理界面。管理员成功登陆后可以对访问该网站的会员人员进行管理、对商品的基本信息管理、对订单、销量、留言等进行管理。
    根据以上的叙述,建立了普通用户的系统流程图,如图4-4所示。

    建立了管理员的系统流程图,如图4-5所示。

    4.3.2 系统前台功能图根据系统的需求分析,设计了普通用户的功能模块图,如图4-6所示。

    4.3.3 系统后台功能图根据系统的需求分析,设计了管理员的用户模块图,如图4-7所示。

    4.4 数据库数据库简单的来说,就是一个保存数据的小仓库,所有需要的数据都可以往里面存,现在我们生活中的各行各业都离不开它,最普通的例子,我们平时使用微信聊天,所有的好友,聊天记录都是存在数据库中的,我们手机里的联系人,短信也都是存在数据库里的,这也就是所谓的数据库,它产生于二十世纪六十年代,特别是最近几年,随着电子商务技术的不断发展,市场需求的不断变化,数据库不再仅仅具有存储数据的功能,而要满足对不同的数据进行管理的功能,现在各行各业的发展都有大量的数据,都离不开对数据的管理,为了科学的和有效的管理,都需要依靠数据库,因此数据库技术得到了广泛的应用。
    4.4.1 数据库需求分析该体育商城系统的数据库需求具体体现在对所有的注册会员的用户进行管理,对各种体育商品的情况进行管理,这就要求数据库能及时的更新数据,确保每一条数据都能够保存,保证对每个会员,每件商品进行有效的管理,为最终项目的成功运行提供保障。
    4.4.2 数据库概念结构设计数据库的概念结构设计在整个开发过程中非常的重要,没有一个好的概念设计,编码做得再好都是徒劳,一般可以利用E-R图进行数据库的概念设计,E-R图可用于描述各个实体之间的关系。
    经过对该体育商城系统的分析:
    得出一个系统管理员可以管理多个体育商品,而一个体育商品也可以被多个管理员进行修改,所以是多对多的关系,如图4-8所示。

    管理员实体的E-R图如图4-9所示。

    登录用户的E-R图如图4-10所示。

    每个体育商品的E-R图如图4-11所示。

    商品订单的E-R图如图4-12所示。

    4.4.2 数据库逻辑结构设计该体育商城系统的概念结构设计完成后,该数据库的逻辑结构设计可以参照概念结构设计转化过来。
    网上体育商城数据库中各个表的设计如下所示,每个表格表示在数据库中的一个表。
    描述管理员各个属性的表为管理员表 t_admin,主要包含管理员的ID号、用户名和密码,如表4-1所示。



    列名

    数据类型
    长度
    允许空




    用户序号
    userId
    int
    11
    主键


    用户名
    userName
    varchar
    50
    not null


    密码
    userPw
    varchar
    50
    not null



    描述商品所有类别的表为商品类别表 t_catelog,主要包含商品类别的ID号、类别的名称和具体描述,如表4-2所示。



    列名

    数据类型
    长度
    允许空




    类别序号
    catelog_id
    int
    4
    主键


    类别名称
    catelog_name
    varchar
    50
    not null


    类别描述
    catelog_miaoshu
    varchar
    5000
    not null



    描述公告信息的表为t_gonggao,主要包含某条公告的ID号、公告的标题、公告的内容、公告的发布时间和发布者,如表4-3所示。



    列名

    数据类型
    长度
    允许空列名




    公告序号
    gonggao_id
    int
    4
    主键


    公告标题
    gonggao_title
    varchar
    50
    not null


    公告内容
    gonggao_content
    varchar
    50
    not null


    发布时间
    gonggao_data
    datetime
    50
    null


    发布者
    gonggao_fabuzhe
    varchar
    50
    null



    描述用户留言的表为 t_liuyan,主要包含用户留言的ID号、留言的标题、留言内容、留言的日期和留言人,如表4-4所示。



    列名

    数据类型
    长度
    允许空




    留言序号
    liuyan_id
    int
    4
    主键


    留言标题
    liuyan_title
    varchar
    10
    not null


    留言内容
    liuyan_content
    varchar
    8
    not null


    留言日期
    liuyan_date
    varchar
    10
    not null


    留言者
    liuyan_user
    varchar
    4
    null



    描述商品具体属性的表为 t_goods,主要包含某件商品的ID号、商品的名称、商品的详细描述、商品图片和该商品所属类别的ID号,如表4-5所示。



    列名

    数据类型
    长度
    允许空




    商品序号
    goods_id
    int
    4
    主键


    商品名称
    goods_name
    varchar
    10
    not null


    商品描述
    goods_miaoshu
    varchar
    8
    not null


    商品图片
    goods_pic
    varchar
    10
    not null


    类别ID
    goods_catelog_id
    int
    11



    描述商品订单属性的表为 t_order,主要包含订单的ID号、某条订单的编号、订单的日期、订单目前的状态、订单的金额、订单的送货方式和付款方式,还有下此条订单的用户ID号,如表4-6所示。



    列名

    数据类型
    长度
    允许空




    订单序号
    order_id
    int
    4
    主键


    订单编号
    order_bianhao
    varchar
    10
    not null


    订单日期
    order_date
    varchar
    8
    not null


    订单状态
    order_zhuangtai
    varchar
    10
    not null


    订单金额
    order_jine
    varchar
    4
    null


    订单送货方式
    order_songhuodizhi
    varchar
    4



    订单付款方式
    order_fukuangfangshi
    varchar
    4



    用户ID
    order_user_id
    int
    4



    描述商品订单明细的表为 t_orderitem,主要包含该订单明细的ID、订单的ID号、商品的ID号和商品的数量,如表4-7所示。



    列名

    数据类型
    长度
    允许空




    订单明细ID
    orderItem_id
    int
    4
    主键


    订单ID
    order_id
    int
    4
    not null


    商品ID
    goods_id
    int
    4
    not null


    商品数量
    goods_quantity
    int
    4



    描述会员用户属性的表为 t_user,主要包含用户的ID号、用户名、密码、真实姓名、地址、性别、电话、邮箱和QQ号,如表4-8所示。



    列名

    数据类型
    长度
    允许空




    用户序号
    user_id
    int
    4
    主键


    用户名
    user_name
    varchar
    50
    not null


    密码
    user_pw
    varchar
    50
    not null


    真实姓名
    user_realname
    varchar
    50
    not null


    地址
    user_address
    varchar
    50
    null


    性别
    user_sex
    varchar
    50
    null


    电话
    user_tel
    varchar
    50
    null


    邮箱
    user_email
    varchar
    50
    null


    QQ
    user_qq
    varchar
    50
    null



    描述用户评价的表为 t_ping,主要包含该评价的ID号、评价某条订单的ID、订单明细的ID、所评价商品的ID、商品的名称、用户的ID、写该条评价的用户名、评价的具体内容和评价的日期,如表4-9所示。



    列名

    数据类型
    长度
    允许空




    评价序号
    id
    int
    4
    主键


    订单序号
    order_id
    int
    50
    null


    订单明细序号
    orderitem_id
    varchar
    50
    null


    商品编号
    goods_id
    varchar
    50
    null


    名称
    mingcheng
    varchar
    50
    null


    用户序号
    user_id
    varchar
    50
    null


    用户名
    loginname
    varchar
    50
    null


    评价信息
    info
    varchar
    50
    null


    添加日期
    adddate
    varchar
    50
    null



    第5章 系统的实现根据对该体育商城系统的需求分析,该商城的界面主要分为后台管理页面和前台客户端页面,用户只可以访问前台客户端页面,通过浏览网页来满足自己的购物需求,商城前端的所有功能都是通过后台的管理来实现的,所显示的所有商品信息都需要通过后台管理系统来增加、修改和删除,后台管理页面只有管理员可以访问。因为在后台需要对所有商品的信息进行处理,所以后台管理部分的开发比前台客户端要复杂。
    对于该体育商城系统,概括起来,主要实现了以下功能:

    前台部分

    商品分类:用户可以查看商品的所有分类,方便用户快速找到自己需要的商品商品描述:用户可以查看每件商品的详细描述销量排行:用户可以看到该商城中商品销售排在前五的商品商品搜索:用户可以搜索自己感兴趣的体育商品,该搜索栏支持模糊查询,只需输入关键字就可以查到会员注册:用户填写自己的基本信息,可以成为该商城的会员用户用户登录:注册成功后,可以登录该商城的网站购物车:用户看中一件商品不需要马上付款,可以先加入到购物车中,挑选结束后再整体付款订单管理:用户可以查看自己已下的订单,看是否被管理员受理,收到商品后,可以点击收货,并对商品进行评价留言:用户可以对网站进行留言,发表自己的建议或意见公告管理:管理员可以在后台发布公告,用户可以在前台进行点击看到公告的详细信息联系我们:提供网站的联系方式,用户有某些需求可以直接联系
    后台部分

    系统参数:管理员可以查看此刻系统运行环境管理员维护:管理员可以对自己的密码进行修改会员管理:管理员可以对该体育商城的用户进行删除商品管理:管理员可以对商品的类别进行添加、修改和删除,对具体某一类别的商品进行添加和删除订单管理:管理员可以查看用户订单的详细信息,还可以受理用户的订单或删除用户的订单销量管理:管理员可以查看该商城中所有商品的销售情况,按商品的销售量由多到少进行排列留言公告管理:管理员可以查看所有用户的留言或删除,发布新的公告或删除旧的公告退出系统:当管理员的所有操作都结束后,可以点击退出系统进行退出

    下面分别说明这些功能进行具体的说明。
    5.1 体育商城前台界面5.1.1 首页界面用户第一次登录商城时,可以在浏览器中输入 localhost:8087/tyypsc ,发出请求后,前台显示index.jsp,用户可以看体育商城主界面,主要分为三个div模块,上面为一块,下面分成左右两块,界面如图5-1所示。

    当用户刚打开该商城网站时,点击在线留言、我的信息、购物车、我的订单,都会提示请先登录,主要是通过以下代码实现的:
    <s:if test="#session.user==null"> alert("请先登录");//弹出对话框</s:if>
    新款上市主要是按商品ID号进行降序排列,关键代码如下:
    String sql="from TGoods where goodsDel='no' and goodsIsnottejia='yes' order by goodsId desc";//按商品ID号降序排列List goodsYesTejiaList=goodsDAO.getHibernateTemplate().find(sql);if(goodsYesTejiaList.size()>5){ goodsYesTejiaList=goodsYesTejiaList.subList(0, 5); //商品列表中的前五个商品品}request.put("goodsYesTejiaList", goodsYesTejiaList);
    5.1.2 商品分类对商品信息进行分类,既使商家方便管理商品,更有利于用户更快的挑选自己需要的商品,该商城的商品主要分为以下四类,点击每一类,都可以查看这个类中的所有商品,如图5-2所示。

    点击商品信息,可以查看该商城所售的所有商品,如图5-3所示。

    5.1.3 商品描述用户在商城主页面点击任意一张喜欢的商品图片可以跳转到一个新的jsp页面,在该页面用户可以看到该体育用品的基本介绍,和已购买用户的评价,如图5-4所示。

    5.1.4 销量排行根据顾客的喜欢程度,将销售情况较好的前五件商品展示出来,这样更有利于顾客的挑选,如图5-5所示。

    销量排行的关键代码如下:
    sql="select sum(goodsQuantity),goodsId from TOrderItem group by goodsId order by sum(goodsQuantity) desc"; //按照商品销售数量的多少进行降序排列
    5.1.5 商品搜索该搜索功能支持模糊查询,只要输入所需商品关键字,点击商品搜索按钮,调用goodsAction.java中的goodSearch方法,可跳转到goodSearch.jsp页面,可以查询到用户需要的商品,如图5-6所示。

    5.1.6 会员注册注册功能是购物网站最基本的功能,用户只有成功注册,才能继续进行接下来的一系列操作,在该体育商城中,当用户在前台页面点击注册按钮后,会弹出注册的jsp页面,显示一个填写信息的form表单,用户按照要求填写基本信息,check1方法会判断用户填入的信息是否符合要求,如果符合要求,点击确定按钮,提示注册成功,如图5-7所示。

    注册成功后,用户输入正确的用户名和密码,可以成功登录该网站,登录后点击我的信息,可以跳转到userXinxi.jsp页面,在该页面中,用户可以修改自己的基本信息,如图5-8所示。

    用户点击注册按钮后,填完基本信息,点击确定按钮时,会弹出操作成功,提示本窗口将在3秒后自动关闭,如下图所示,这个功能主要是通过以下代码实现的。
    function clock(){ i = i -1; if(i > 0) { document.getElementById("info").innerHTML = "本窗口将在"+i+"秒后自动关闭"; //先获取到id为info的标签 setTimeout("clock();",1000); } else { closewindow(); }}
    5.1.7 购物车购物车模块也是一个购物网站不可缺少的功能,用户可以将喜欢的商品先放入购物车中,然后点击导航栏中的购物车,会跳转到购物车的jsp页面,在这个页面中,用户可以查看自己已挑选的商品,还可改变购买数量,这里的个数后台通过正则表达式进行限制,只可以输入正整数,如图5-9所示。

    限制商品数量的关键代码如下:
    function modiNum(goodsId,quantity){ var r1= /^[0-9]*[1-9][0-9]*$/  //运用正则表达式限制为正整数 var val=r1.test(quantity); //str为你要判断的字符 执行返回结果 true 或 false if(val==false) { alert("数量必须是正数,请重新输入"); } else { document.getElementById("indicator1").style.display="block"; cartService.modiNum(goodsId,quantity,callback); }}
    如果顾客没有输入购买个数,也会弹出提示对话框,提示“请输入购买数量”。
    if(document.buy.quantity.value==""){ alert("请输入购买数量"); return false;}
    5.1.8 订单管理顾客可以在前台页面点击我的订单查询自己的订单信息,点击后会跳转到myOrder.jsp页面,如图5-10所示。

    如果自己已经收到货物,可以点击收获按钮,会显示收货成功的对话框。
    点击评价按钮,可跳转到orderDetailPing.jsp页面,这个页面可显示已购买的商品名称和图片,还可填写评价,如图5-11所示。

    5.1.9 留言顾客在导航栏点击在线留言,可跳转到liuyanAll.jsp页面,在这个页面可以发表问题,咨询,建议并进行提交,如图5-12所示。

    5.1.10 公告点击网站公告下的任意一条,可跳转到gonggaoDetailQian.jsp页面,该页面可详细介绍这条公告的完整信息,如图5-13和5-14所示。


    5.1.11 联系我们顾客点击导航栏的联系我们,跳转到lianxi.jsp页面,该页面可显示网站的联系方式,如图5-15所示。

    5.2 体育商城后台管理5.2.1 首页界面在该体育商城中,在前台页面的下方有个管理登录按钮,管理员点击后,可跳转到后台的登录页面,管理员按要求输入用户名、密码和验证码,就可成功登录后台管理系统,后台通过frame框架分成三部分,页面顶部为一部分,下面分成左右两部分,如图5-16、5-17和5-18所示。

    以下这段代码主要实现了后台登录时验证码的功能:
    public class RandomValidateCode {public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key private Random random = new Random();private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//从这里面随机产生一个字符串 private int width = 80;//图片宽 private int height = 26;//图片高 private int lineSize = 40;//干扰线数量 private int stringNum = 4;//随机产生字符数量 //获得字体 private Font getFont(){ return new Font("Fixedsys",Font.CENTER_BASELINE,18); } //获得颜色 private Color getRandColor(int fc,int bc){ if(fc > 255) fc = 255; if(bc > 255) bc = 255; int r = fc + random.nextInt(bc-fc-16); int g = fc + random.nextInt(bc-fc-14); int b = fc + random.nextInt(bc-fc-18); return new Color(r,g,b); } //生成随机图片 public void getRandcode(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); Graphics g = image.getGraphics();//产生Image对象的Graphics对象,该对象可以对图像进行各种绘制操作 g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18)); g.setColor(getRandColor(110, 133)); //绘制干扰线 for(int i=0;i<=lineSize;i++){ drowLine(g); } //绘制随机字符 String randomString = ""; for(int i=1;i<=stringNum;i++){ randomString=drowString(g,randomString,i); } session.removeAttribute(RANDOMCODEKEY); session.setAttribute(RANDOMCODEKEY, randomString); System.out.println(randomString); g.dispose(); try { ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片以流动的形式显示到客户端 } catch (Exception e) { e.printStackTrace(); } } //绘制字符串 private String drowString(Graphics g,String randomString,int i){ g.setFont(getFont()); g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121))); String rand = String.valueOf(getRandomString(random.nextInt(randString.length()))); randomString +=rand; g.translate(random.nextInt(3), random.nextInt(3)); g.drawString(rand, 13*i, 16); return randomString; } //绘制干扰线 private void drowLine(Graphics g){ int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(13); int yl = random.nextInt(15); g.drawLine(x, y, x+xl, y+yl); } //获取随机的字符 public String getRandomString(int num){ return String.valueOf(randString.charAt(num)); }}

    通过frameset框架集,把后台管理界面分成了三块。
    <frameset rows="59,*" cols="*" frameborder="no" border="0" framespacing="0"> <frame src="top.jsp" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" title="topFrame" /> <frameset cols="213,*" frameborder="no" border="0" framespacing="0"> <frame src="left.jsp" name="leftFrame" scrolling="No" noresize="noresize" id="leftFrame" title="leftFrame" /> <frame src="version.jsp" name="mainFrame" id="mainFrame" title="mainFrame" /> </frameset></frameset>

    5.2.2 系统参数可以查看此刻该系统运行环境,如图5-19所示。

    5.2.3 管理员维护点击管理员维护,可以修改密码,如图5-20所示。

    5.2.4 会员管理点击会员管理,可以对该网站会员的信息进行查看和删除,如图5-21所示。

    5.2.5 商品管理该商城的商品管理主要分为两部分,一部分是添加和删除某个商品类别,另一部分是对具体某个类别的商品进行管理,如图5-22和5-23所示。


    5.2.6 订单管理订单管理主要包含三个功能,一是对用户刚买的订单进行受理,二是查看订单明细,三是删除任意一条订单,如图5-24所示。

    5.2.7 销量管理管理员点击销量管理,可查看该商城所有商品的销量情况,按从高到低排列,如图5-25所示。

    5.2.8 留言公告管理管理员点击留言公告,可以对用户的留言进行管理,添加商城公告信息或删除已发布的消息,如图5-26和5-27所示。


    点击退出系统就可返回到后台登录界面。
    由于该系统在开始设计的时候就没有考虑的复杂,所以系统界面比较简单明了,用户使用起来也非常方便,在此不再详细叙述如何操作。总而言之,该系统界面设计虽然简单,但功能齐全无遗漏,是该体育商城的最大亮点。
    5.3 配置文件说明在struts2中,通过Filter可以启动struts框架,在web.xml中的配置如下:
    <filter> <filter-name>struts</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
    在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作,struts.xml文件需要存放在src目录下,struts2读取到struts.xml的内容后,以javabean的形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,所以不需要每次都读取struts.xml文件,该体育商城系统中struts.xml的部分配置文件如下代码:
    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <package name="liu" extends="struts-default"><action name="upload" class="com.util.upload" method="upload"> <result name="success">/upload/upload_re.jsp</result> </action> <action name="index" class="indexAction" method="index"> <result name="success">/qiantai/index.jsp</result> </action></package></struts>
    第6章 系统的测试6.1 程序调试一个系统从开始设计,到最终的开发完成,中间过程可能会出现各种各样的问题,也会时常出现一些意想不到的错误。对于在写代码的时提示的语法错误,程序在编译的过程中会自动报错,这类错误比较好发现,修改也比较容易,我们可以根据提示修改错误。但在开发的过程中,除了这一种错误,还会出现别的错误,当程序在运行的过程中,由于编写逻辑的错误,或一些不正确的操作,而产生错误的结果,这类型错误比较难解决,要想处理,必须要从根本上想办法,才能保证系统在后期成功运行,因此,在开发的过程中我们不断的要调试程序,发现错误立即处理,防止到后期累积了很多的错误,造成系统的开发失败。
    测试和调试一般被认为是一个层次,其实他们并非同一个任务。简单地说,测试是在已知程序存在某些问题而要做解决问题的工作,而调试则是在该系统已经具备能正常工作能力而进行的功能性测试的工作。
    6.2 程序的测试6.2.1 测试的重要性及目的迪杰斯特拉曾经说过:测试可以显示程序中有错误,他的希望是,该程序可以正确地通过某种实施过程,可以避免绝大多数的错误,所以有时候是没有必要进行测试的。这的确是个理想化的目标,对目前的实际程序开发而言,要省去测试这个过程显然不现实,所以应专注于如何测试,如何更快地检测程序错误,如何使工作更高效的完成。在一个系统的开发过程中,要不断的进行一系列的测试,使得软件能够正常运作。对于大部分时刻都是编码与测试相结合,完成此功能之后,对此功能做一些必要的测试,使系统更加合理,是软件质量保证非常关键重要的一部分。
    测试的重要性
    在软件的生命周期中,测试占据很大的一部分,有着重要的地位,千里之堤毁于蚁穴,如果前期的小错误没有及时发现并处理,到了后期可能会成为一个很大的错误。微软是世界上最大的IT公司之一,其中做开发的员工只有三成,而做测试的却占了七成,这表明测试过程在软件开发中是很重要的。在软件正式交付、运作之前,测试部门会对软件做一个比较全面的测设,保证软件运行过程中,不会出现大的问题。结合软件开发之前的可行性分析、概要设计、详细设计等各种设计,会对整个过程制定严格地测试计划,保证测试的全面性,不会有遗漏,因此测试在软件开发的过程中是值得重视的。
    测试目的
    在一个系统的开发过程中,软件测试的成功与否,直接影响到用户及自身的利益,避免大的错误造成不可挽回的影响,必须要进行测试,其主要目的,在一个成功运行的系统里,不断地发现新的错误,并对此进行分析,再交给技术部门进行改正,不断完善整个系统。保证所交付的产品是可用的、优秀的。对于比较繁杂的,不方便进行全面测试的,要根据用户的需求与实际应用,针对主要的选择进行,尽可能多的保证软件可以满足需求设计中的每一项内容。好的测试是什么,好的测试就是成功的发现到现在为止还没有发现的错误,一个好的测试员是要不断努力的在程序中找出错误,而不关注程序中正确的功能,所有工作都是围绕错误展开的。
    6.2.2 测试的步骤一个系统的测试与开发的过程非常相似,必须一步一步来,分步骤进行,而不能随便测试,前一步的测试内容都是下一步的基础。一个大的软件系统一般是由几个小的系统组成,而每个小系统又可以分成若干个模块。因此,对于项目的测试,也需要分步骤进行:

    代码审查:对于一个大的软件项目,代码的工作量着实不少,审查主要是对代码中的逻辑进行细致分析,看其是否合理
    单元测试:对于一个项目中的某一个小的模块进行测试,首先看一下它的编码有没有错误,然后看这个模块所实现的功能符不符合最初的设计要求,如果不符合,看需要从哪一方面进行改进
    集成测试:集成测试,是将该体育商城系统所划分的每个模块都结合在一起,同时进行测试,有的时候单个模块测试不会出现问题,但一旦进行整体测试,就会出现意想不到的错误,尤其是接口方面的错误,因此必须进行集成测试,看整个系统在运行起来有没有错误,如果各个模块之间不能很好的兼容,到开发的后期会出现很大的问题,对用户会造成很大的损失
    确认测试:随着单元测试和集成测试的完成,保证每个模块都没有问题,各个模块之间的组合也非常成功,接下来就该完成确认测试,确认测试主要是验证客户所提出的需求在该商城系统中有没有一一实现,对客户的要求能否满足,有没有遗漏某些功能
    系统测试:当整个的项目系统开发结束后,上面几步的测试也都完成,最后还要进行系统测试,系统测试首先验证客户所要求的全部功能系统能否全部实现,其次对整个系统所能承受的强度进行检测,比如当有很多用户同时访问该系统网站时,会出现什么情况,最后要对系统的安全性进行测试,例如当输入用户名和密码时,输入一个非法的或错误的数据时,看系统会出现什么结果,可以测出系统的抗干扰能力的强弱

    第7章 总结7.1 系统总结该体育商城系统采用的主要编码语言是主流语言Java,数据库使用的是MySQL,在开发时采用了模块化的设计思想,逻辑比较清晰,该系统满足了一般购物者所需要的基本功能,系统的前台界面比较简单,用户操作起来非常方便。
    刚开始时对整个网站系统的需求以及整体开发的流程和开发过程中各部分资源的分配进行了较为详细的分析,并在此基础上对于该系统的开发所需要的技术以及环境进行了较为准确的定位,从数据库到服务器以及其他的架构和框架技术都进行了确认,这些工作保证了开发的顺利完成。开发过程中又证实了数据库的设计,各功能模块的设计基本符合开发需求。开发完成后对整个系统进行了较为全面的测试评估,其中的用户模块的用户,注册,登录,用户个人信息修改功能完全实现,商品购买模块实现的也很完美,管理员模块中会员管理对用户信息的修改,删除功能也是完全实现。
    其次,该系统的开发流程也遵循了传统的软件开发流程,需求分析,概要设计,详细设计,系统总体设计,详细模块设计,最后系统测试。经过这一系列的流程,逐步实现了整个系统的完整,后期系统的情况也是比较稳定的。
    最后,虽然之前对开发该系统所需要的技术都有过接触,有一定的基础,但在开发时候才发现自己掌握的其实是远远不够的,特别是Html和CSS这块对于网页的布局,颜色设计,动画等这些都没有做的很好,使得整个网站看上去较为单薄,并且视觉体验上不算优秀。代码方面因为有框架的引入使得整体代码结构有了一定的规范,但是个人对于代码的注释还是不够优秀,总体来说代码这块还是不够优秀,只能达到最基本的要求,改进的空间还很大。
    7.2 设计收获与心得此次毕业设计是对我们大学四年所学知识的一次综合检测,在实现这个系统的时,不仅用到了平常所学的所有知识,而且自己通过查资料学了很多新知识,在设计中所遇到的问题,也培养了我与人交流、解决问题的能力,在开发项目的过程中,使我编写代码的技术也得到了训练,并且有了很大程度的提高。
    在开发此体育商城的系统时,我也有很深的体会:在开发一个新的项目时,想一次做到完全的成功是不可能的,刚开始肯定会有很多考虑不到的地方,只有通过不断地改进,才能达到最初的目标;在开发的过程中,用到了以前从没有接触过的技术,要不断的练习,才能熟练掌握新的技术;一个商城系统要想让更多的人喜欢使用,界面的设计必须吸引人,在设计界面的时候,我们要多听取别人的建议;在开发的过程中肯定会遇到困难,当系统遇到自己无法解决的大问题时,我们要虚心的请教别人,弄清楚其中的道理,真正理解。
    虽然开发这个商城系统只有短短的几个月的时间,但还是让我从中学到了很多知识,认识到了自己的不足,还需要不断地努力学习。
    7.3 展望该体育商城系统从设计到开发完成,仅仅用了四五个月的时间,还有自己的知识储备量不足,技术能力也不是特别高,开发出的系统肯定有很多不足的地方,改进的空间还是非常大的,比如:对用户信息进行加密、前台界面设计的美观性、后台功能的强大等很多方面需要改进,我相信,随着自己不断地学习,技术能力的提高,会使系统的功能不断强大,用户的使用评价越来越高。
    参考文献[1] 赵伟,李东明 Java语言 北京航空航天大学出版社 2011
    [2] Bruce Ecke Thinking in Java 机械工业出版社 2007
    [3] 王珊,萨师煊 数据库系统概论(第5版) 高等教育出版社 2014
    [4] 李爱萍,崔冬华,李东生. 软件工程. 人民邮电出版社 2014.
    [5] 赵志超,吴铁锋 基于J2EE的网上体育用品店的设计 数字技术与应用 2012
    [6] 沈洪,朱军 Photoshop图像处理技术 中国铁道出版社 2011
    [7] 谢希仁 计算机网络 电子工业出版社 2013
    [8] Patton.R 张小松等译Software Testing 机械工业出版社 2006
    [9] D Raggett HTML 4.01 Specification 1999
    [10] 朱少民 软件测试 人民邮电出版社 2013
    1 评论 2 下载 2020-08-03 19:00:17 下载需要14点积分
  • 基于C#实现的电影院售票管理系统

    一、引言1.1选题背景随着互联网和电子商务的快速发展,网上购物已经成了现代人生活中很重要的一种方式,如:数码产品、生活用品、化妆品护肤品等,只要是人们需要到的东西,基本都可以在网上购买。除了购买各种物品,现代人的生活也不再向过去一样单调,除了学习和工作之余,人们的娱乐生活也逐渐丰富,最普遍的娱乐休闲方式之一就是到电影院看电影,那么传统的电影订票窗口显然已经不能满足人们的需要了,所以开发一个电影院网上订票系统是非常必要和可行的。以前传统的电影票订票方法是去电影院的购票窗口查看电影的上映时间、场次、可选座位等信息再进行购票,人们往往需要排队才能买到电影票,这样不仅浪费了人们宝贵的时间,而且电影院工作人员的工作量也很大,对于这种低效率、浪费时间的事情,完全可以以网上购票的方式来改变。
    为了提高劳动的效率、节约成本、提高服务质量,我们小组开发了此款系统,用以方便影院的售票和客户的购买,通过这个系统,可以很快的实现会员注册、登录、购票,后台管理员可以新增影片、排片等基本操作。
    二、需求分析2.1 用户需求需要在网上购买电影票的用户可使用本系统,进行会员的注册登陆之后可以进行网上查询电影、购买电影票等操作,省去了去电影院实体窗口排队买票的繁 琐程序。
    2.2 系统功能分析
    新用户的注册、登录,用户数据能存在后台数据库中
    电影的录入、删除、查询、修改
    电影的排片
    管理员查询会员级别等信息
    会员查询影片信息
    会员购买电影票

    2.3 条件与限制系统可以实现一些基本的购票功能,但系统较简单,尚存在很多缺陷,不能实现完善和全面的功能。
    缺陷:

    首先要使用admin进行登录才能开始注册会员
    购票后无法查看购票信息
    不可以支持选座
    购票时不能通过搜索影片名字等来查找影片

    三、模块设计3.1 系统流程图系统流程图如图一所示:

    系统功能图如图二所示:

    3.2 系统使用指南对于用户
    首先,系统使用者先通过admin登录,进入到新用户注册页面,以管理员的身份为用户注册一个新的会员账号,已注册好的账号密码自动保存在后台数据库中,用户下次可以直接使用已注册的会员账号登录本系统进行电影的查询、购票等操作。
    对于管理员
    首先,管理员可以为新用户注册不同级别的会员账号、查看会员的信息。其次,管理员可在系统后台做电影的录入、删除、查询、修改等基本操作,除此之外,添加好影片后可以对电影进行的排片。
    四、数据库设计及实现4.1 系统E-R图E-R图如图三所示:

    4.2 逻辑结构设计(关系数据库设计)
    顾客(Cus、CusCard、CusType、CusTel(key))
    登陆(UserName、UsePwd、UserType)
    电影(Mname(key)、MBZ、MLanguage、MTYPE、MDirector、MACT、MTime)
    排片(MName(key)、MPrice、MRoom、Mcount、MTime、MBRQ、MERQ)
    上映(ID(key)、MName、MPrice、MRoom、MCount、MTime、MRQ)
    购票(PID(key)、Cname、GPCount、GPJE、MName、SYRQ、FYT、GPRQ、CZY)

    4.3 数据库主要代码及触发器会员信息
    CREATE TABLE [dbo].[Cus]( [CusTel] VARCHAR(50) NOT NULL PRIMARY KEY, [CusName] VARCHAR(50) NOT NULL, [CusCard] VARCHAR(50) NULL, [CusType] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertULogin] on [dbo].[Cus]after insertasdeclare @username varchar(50)declare @userpwd varchar(50)select @username=CusTel from inserted select @userpwd= right(CusCard,6) from inserted insert into ULogin values(@username,@userpwd,'C')
    购票信息
    CREATE TABLE [dbo].[GP]( [PID] VARCHAR(50) NOT NULL PRIMARY KEY, [CName] VARCHAR(50) NOT NULL, [GPCount] INT NULL, [GPJE] FLOAT NULL, [MName] VARCHAR(50) NULL, [SYRQ] VARCHAR(50) NULL, [GPRQ] VARCHAR(50) NULL, [CZY] VARCHAR(50) NULL, [FYT] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[UpdatePP] on [dbo].[GP]after insertasdeclare @MName varchar(50)declare @SYRQ varchar(50)declare @count intselect @MName= MName,@SYRQ=SYRQ,@count=GPCount from inserted update MovieSY set mcount=mcount-@count where MName=@MName and MRQ=@SYRQ
    电影信息
    CREATE TABLE [dbo].[Movie]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MLanguage] VARCHAR(50) NOT NULL, [MDirector] VARCHAR(50) NULL, [MAct] VARCHAR(50) NULL, [MName] INT NULL, [MBZ] VARCHAR(255) NULL, [MType] VARCHAR(50) NULL)
    上映信息
    CREATE TABLE [dbo].[MovieSY]( [ID] INT NOT NULL PRIMARY KEY, [MName] VARCHAR(50) NOT NULL, [MRoom] INT NULL, [MCount] varchar(50) NULL, [MName] INT NULL, [MTime] VARCHAR(50) NULL, [MRQ] VARCHAR(50) NULL)
    排片信息
    CREATE TABLE [dbo].[PP]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MPrice] INT NOT NULL, [MRoom] VARCHAR(50) NULL, [MCount] INT NULL, [MTime] VARCHAR(50) NULL, [MBRQ] VARCHAR(50) NULL, [MERQ] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertPP] on [dbo].[PP]after insertasdeclare @MName varchar(50)declare @BRQ varchar(50)declare @ERQ varchar(50)declare @MTime varchar(50)declare @MRoom varchar(50)declare @MPrice intdeclare @MCount intdeclare @MBRQ datetimedeclare @MERQ datetimedeclare @RQ varchar(50)select @MName= MName,@BRQ=MBRQ,@ERQ=MERQ,@MTime=MTime,@MRoom=MRoom,@MPrice=MPrice, @MCount=MCount from inserted set @MBRQ=CONVERT (datetime,@BRQ)set @MERQ=CONVERT (datetime,@ERQ)while @MBRQ<=@MERQbegin set @rq=CONVERT(varchar(50), @MBRQ, 112)insert into MovieSY values(@MName,@MPrice,@MRoom,@MCount,@MTime,@RQ) set @MBRQ=DATEADD(DAY,1,@MBRQ)endCREATE TABLE [dbo].[MovieSY]( [UserName] VARCHAR(50) NOT NULL PRIMARY KEY, [UserPwd] VARCHAR(50) NOT NULL, [UserType] VARCHAR(50) NULL)
    五、系统设计与实现5.1系统开发环境
    硬件环境

    Intel Pentium 166MHz或以上;内存:需要至少512MHZ;
    软件环境

    运行于Windows2010版的操作系统之上;SQL Server2008数据库;Visual Studio2013;

    5.2 功能模块
    输入功能模块
    查询显示功能模块
    查询、售票功能模块
    登录、注册功能模块

    5.3 系统主要页面展示登录、注册页面

    登陆后的页面

    会员注册页面

    会员信息查询页面

    添加影片页面

    查询修改影片页面

    排片页面

    “排片”页面通过连接数据库,可以搜索影片的名字、导演、主演来选择影片,再输入票价,放映大厅,座位数,放映时间等信息,最后确认排片。
    购票页面

    购票页面通过对获得的已经被排片的电影进行选择而进行购票这一操作。在购票前需填入购票数量、联系电话,系统会自动计算合计金额。之后点击购票按钮则能进行购票操作。但一旦购票成功则不能进行退票操作,也不能查看所购买的电影票。
    数据库页面

    六、主要特色6.1 系统实用性系统首先可以进行新用户的注册,用户数据能存在后台数据库中。管理员可以进行电影的录入、删除、查询、修改,添加好影片后进行电影的排片。退出登录后再使用之前注册的会员登录,可以购买电影票。
    6.2 突出优势和特色(创新点)
    购票时可以看到影片的导演、主演等信息
    用户分为钻石用户,白金用户和普通用户,对用户进行了分类

    7 小结数据库技术课程设计是一次对课堂所学知识的灵活应用,是理论知识与实践的相结合。经过了一周的课程设计,本系统基本达到了当初的设计要求,设计上也基本合理。我们不仅对数据库系统的认识更加深入,同时也掌握了面向实体的系统分析的基本方法,对VS也有了新的认识,也知道了要有坚持不懈,不惧困难的精神,才能取得成功。一个简单的系统,每一个细节都需要在实践中去挖掘并进行进一步的修改完善。本次课设让我们受益匪浅,在分析问题以及解决问题等方面的能力有所提高,也是一次很好的同学之间交流合作的机会。数据库技术的用途很广,还有很多值得我们学习,希望今后能有更多这样的机会。
    14 评论 210 下载 2019-01-01 21:08:08 下载需要18点积分
  • 基于JAVA和SQL SERVER数据库实现的火车票预售系统

    1 系统设计1.1 设计目的乘坐火车是我们生活中几乎不可缺少的一件事儿,每天都会有各种各样的火车班次发布与被预定。针对这个火车票预售的环节我设计了一个火车票预售系统,为购票用户与卖票管理人员之间搭建平台。让我们的用户能够通过该软件对管理人员发布的航班进行预购与查询。另一方面也可以加强我们的管理人员对班次信息与乘客的管理与查询。
    本系统的根本目的是让管理人员能够发布与查询班次信息、查询乘客信息等;用户可以通过该系统对班次进行预购、自己购票记录的查询等。
    1.2 需求分析1.2.1 信息要求该系统主要记录用户、班次、火车、银行卡之间的关系

    用户分为管理员与购票用户

    售票管理员信息:管理员编号、管理员名字、管理员电话购票用户信息:身份证号、电话号码、银行卡号
    班次信息

    班次号、火车号、出发地点、目的地、出发时间、到达时间
    火车信息

    火车号、火车节数、座位数、各种座位票价、火车车速
    银行卡信息:

    银行卡号、余额、持有人身份证号
    身份证信息

    身份证号、姓名、性别、所有者
    车票信息

    车票号、班次号、座位号、乘客身份证号、车票价钱、车厢数

    1.2.2 处理要求
    能够正确、高效、迅速地完成所有操作
    一个管理员可以管理多个班次、一个用户可以多次订购不同时间段的车票

    1.2.3 安全性与完整性需求
    安全性

    该系统需要用户进行账号的注册与登陆通过对不同的用户种类的检测来给予不同的权限与界面用户登陆自己账号后只能查询自己用户名下身份证的购票信息与个人信息用户不可对班次、火车等信息进行修改售票员能对班次信息进行修改与查询,对于用户信息只能查询不能修改
    完整性

    实体完整性

    手机号、班次号、火车号、银行卡号、身份证号、车票号分别为用户、班次、火车、银行卡、身份证、车票的主码
    参照完整性

    班次号中的火车号为火车表的主码、银行卡号中所有者号码为用户的主码、车票中的火车号与班次号分别为火车表与班次表的主码。以上外码要么为空要么是参照表中已有数据

    用户定义完整性

    性别只能是男女、车票钱不能为空、车速不能为空、班次目的地与出发地不能为空、用户类型只能是 0 与 1:0 表示普通用户、1 表示管理员用户。用户名字不能为空

    1.3 开发和运行环境选择
    开发工具

    前台开发语言为 Java后台数据库为 SQL SERVER 2017
    运行环境

    Java 1.8 版本 Windows2000 以上

    2 数据库设计2.1 数据库概念设计本系统中包括六个实体:身份证实体、银行卡实体、用户实体、车票实体、火车实体、班次实体,根据需求需求分析的结果以上六个实体对应的 ER 属性图如下图所示。

    系统整体 E-R 图

    2.2 数据库逻辑设计根据 E-R 图向关系模型的转换原则,一个实体型转换为一个关系模式,实体的属性就是关系的属性。因此按照图 2.7 中的整体 E-R 图,本数据库系统中应包括六张表:身份证、银卡、用户、车票、火车、和班次。






    3 火车票预售系统详细设计3.1 功能概述售票管理员系统主要包含如下几个功能:

    发布与删除班次及其相关信息
    查看班次详细信息
    通过班次号对班次进行详细查询
    通过身份证号码查询乘车人信息

    用户系统主要包含如下几个功能:

    通过地点、时间查询班次信息
    通过班次号查询班次详细信息
    添加和删除信用卡
    添加、修改和删除乘车人信息
    查询得到班次后可以为乘车人购买车票
    查看自己用户的购票记录

    整体功能描述图如下图所示:

    3.2 火车票预售系统详细设计3.2.1 界面设计3.2.1.1 管理员界面设计在使用管理员账号登录过后,会出现管理员主界面。在界面最上方有初始地点选择和时间选择控件,可以通过时间和地点的详细选择来针对性地发布班次信息,在点击发布后会弹出火车号填写对话框,在此处填写火车号以完成班次发布的目的,如下图在发布下方有一个查看按钮,通过在左边列表中选择想查看的班次再点击该按钮即可查看到详细的班次信息如下图所示。


    3.2.1.2 用户系统界面设计在使用用户权限帐号登录过后,会进入相应的用户界面,用户界面分为四个 fragment,第一个 fragment 通过站点和时间来查询班次列表,在查询到班次后可以通过购买按钮对车票进行购买,购买时需要选择乘车人、勾选座位信息和选择支付的信用卡,如下图所示。


    在第二个 fragment 里用户可以通过班次号来查询班次信息与购票,如下图所示,在点击查询后按钮会自动变成购票,后续购票操作和第一个 fragment 一样。


    在第三个 fragment 里用户可以查询到自己所有的购票记录,可以通过查看详细按钮进行查看,还可以通过退票按钮进行退票操作,如下图所示。


    最后是用户信息界面,用户可以在此处看到自己用户名以及邮箱号,如下图所示。用户可以在此界面增、删、改常用乘车人信息,如下图所示。也可以添加和删除信用卡,如下图所示。




    3.2.2 功能实现整体功能是通过两个 Activity 与四个 Fragment 来实现,具体实现功能顺序为下图所示。本系统大量使用 Dialog 来对详细信息填写进行管理。
    功能实现过程中使用到 UI 的类有 17 个,其中三个抽象父类用于限制所有界面的业务处理与逻辑执行顺序,其余 14 个子类用于详细界面以及功能的实现,整体界面代码框架如下图所示。
    注:Dialog 是在 Fragment 中使用,Fragment 是放置到底层 Activity 使用。

    4 系统测试发布班次示意图

    发布班次示意图

    到数据库查询如下图所示:

    购票操作示意图 1

    购票操作示意图 2

    到数据库查询如下图所示:

    退票操作示意图

    到数据库查询如下图所示:

    5 总结三个星期的时间非常快就过去了,这三个星期不敢说自己有多大的进步,获得了多少知识,但起码是了解了项目开发的部分过程。虽说上过数据库等相关的课程,但是没有亲身经历过相关的设计工作细节。这次课设证实提供了一个很好的机会。通过这次的系统设计,我在很多方面都有所提高。综合运用所学知识的理论知识实际训练从而培养和提高学生独立工作的能力,巩固所学的知识,掌握系统程序的编排和运行,使自己的独立思考能力有了显著提高。
    从各种文档的阅读到开始的需求分析、概念结构设计、逻辑结构设计、物理结构设计。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想办法去设计一个系统的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。
    我们学习并应用了SQL 语言,对数据库的创建、修改、删除方法有了一定的了解,通过导入表和删除表、更改表学会了对于表的一些操作,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
    很多事情不是想象中的那么简单的,它涉及到的各种实体、属性、数据流程、数据处理等等。很多时候感觉后面的设计根本无法继续,感觉像是被前面做的各种图限制了。在做关系模型转换的时候碰到有些实体即可以认为是实体又可以作为属性,为了避免冗余,尽量按照属性处理了。
    不管做什么,我们都要相信自己,不能畏惧,不能怕遇到困难,什么都需要去尝试,有些你开始认为很难的事在你尝试之后你可能会发现原来并没有你以前觉得的那样,自己也是可以的。如果没有自信,没有目标,没有信心就不可能把事情做好,当其他人都在迷茫的时候,自己一定要坚信目标。有一个这样的感觉就是课程设计学到的东西比一个学期都多。
    参考文献[1] CSDN 论坛、简书论坛、知乎论坛
    [2] 毕广吉.Java 程序设计实例教程[M]. 北京:冶金工业出版社,2007 年
    [3] 肖成金,吕冬梅。 Java 程序开发数据库与框架应用[J]. 科技展望,2017,05:19.
    [4] 吕锋,梅细燕,周晓东;基于 JDBC 的数据库管理及其应用[J];武汉理工大学学报;2002 年 10 期
    [5] 姚永一,SQL Server 数据库实用教程,北京:电子工业出版社,2010.
    [6] 高云,崔艳春,SQL Server 2008 数据库技术实用教程,北京:清华大学出版社,2011
    [7] 何玉洁,梁琦,数据库原理与应用(第二版),北京:机械工业出版社,2011
    [8] 壮志剑,数据库原理与 SQL Server,北京:高等教育出版社,2008
    [9] 杜丁超.计算机软件 Java 编程特点及其技术分析
    [10] 萧仁惠,陈锦辉. JDBC 数据库程序设计[J].北京:中国铁道出版社,2004
    16 评论 282 下载 2018-11-20 18:23:37 下载需要14点积分
  • 基于JAVA和Oracle数据库实现的项目信息管理系统

    1 需求分析1.1 背景项目管理系统,是反映公司员工资料,项目负责部门和项目进度,设备采购软件系统,是管理项目的有效工具。
    面向用户:对项目进度跟踪,公司人员信息管理和设备管理的公司。只能由公司内部查看数据库中的数据。要求使用本系统的用户管理系统的使用有所了解,知道基本的操作和使用过程的注意事项。
    1.2 系统目标系统对外部封闭,不允许外部人员访问公司项目管理系统中的数据库。能够安全的访问系统独立的数据库。程序实现数据库数据的直观显示,保证数据库的能够为公司提供较为方便和基础的项目管理服务,能够为公司管理层提供监督渠道。
    数据分析:员工的基本信息,部门的基本信息,项目的基本信息,设备基本信息
    1.3 功能分析项目管理系统应该能够提供以下功能:管理员登陆、员工信息管理、部门信息管理、项目信息管理、设备信息管理。

    管理员登录:项目管理系统采用Oracle数据库连接的服务名,用户名和口令(密码)验证模式,进入项目管理系统前项目管理员必须在登陆界面输入验证信息方可进入项目管理系统的主界面进行相应的操作
    学生信息管理:学生信息管理包含五个模块:学生信息的浏览、添加、删除、查询、修改
    部门信息管理:包含一个模块:部门经理信息查询
    项目信息管理:包含两个模块:根据项目经理的姓名查询项目的完成情况、查询某个项目的设备购买情况
    设备信息管理:包含三个模块:设备费用查询、设备供应商查询、添加设备

    1.4 性能需求分析
    系统易操作性:项目管理系统应该做到操作简单,界面友好,使得用户可以快速上手使用,不受到专业知识的限制
    系统可维护性:由于系统涉及的信息比较多,数据库中的数据需定期修改,系统可利用的空间及性能也随之下降,为了使系统更好地运转,用户可以对系统数据及一些简单的功能进行独立的维护及调整

    2 概念设计2.1 概念模型(E-R图)
    2.2 数据字典数据字典包括的项目有数据项、数据结构、数据流、数据存储、加工逻辑和外部实体。可使用一些符号来表示数据结构、数据流和数据存储的组成。
    2.2.1 员工表


    数据元素
    数据类型
    数据长度
    数据描述




    w_id
    VARCHAR2
    4
    员工编号


    w_name
    VARCHAR2
    16
    员工姓名


    sex
    CHAR
    2
    员工性别


    age
    CHAR
    20
    员工年龄


    contract_date
    DATE

    合同日期


    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    post
    VARCHAR2
    6
    员工职务



    2.2.2 部门表


    数据元素
    数据类型
    数据长度
    数据描述




    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    m_id
    VARCHAR2
    4
    部门经理编号


    m_name
    VARCHAR2
    8
    部门经理姓名


    w_num
    NUMBER

    员工人数



    2.2.3 项目表


    数据元素
    数据类型
    数据长度
    数据描述




    p_id
    VARCHAR2
    4
    项目编号


    p_name
    VARCHAR2
    16
    项目名称


    d_id
    VARCHAR2
    4
    部门名称


    w_id
    VARCHAR2
    4
    项目经理编号


    fund
    FLOAT
    126
    项目经费


    type
    VARCHAR2
    4
    项目类型


    signing_time
    DATE

    签订时间


    complete_time
    DATE

    应完成时间


    check_time
    DATE

    验收时间


    remarks
    VARCHAR2
    8
    备注



    2.2.4 设备表


    数据元素
    数据类型
    数据长度
    数据描述




    e_id
    VARCHAR2
    4
    设备编号


    e_name
    VARCHAR2
    12
    设备名称


    fee
    FLOAT

    设备费用


    supplier
    VARCHAR2
    12
    供应商


    p_id
    VARCHAR2
    4
    项目编号


    remarks
    VARCHAR2
    8
    备注



    2.3 数据流图数据流图(Data Flow Diagram)是一种图形化技术,它描绘信息流和数据从输入到输出的过程中所经受的变换。根据数据流图,可以分析出程序所需的模块和模块之间的调用关系。
    如下图所示,在项目管理系统,在用户界面捕捉用户的操作,接受事务后数据流流向不同的模块。

    3 逻辑结构设计3.1 关系描述
    员工与部门的关系:n:1一个员工只能属于一个部门,一个部门可以有多个员工
    部门与项目的关系:1:n一个部门可以负责多个项目,一个项目只能由一个部门负责
    员工与项目的关系:m:n一个员工可以实现多个项目,一个项目可以由多个员工实现
    员工与设备的关系:1:n一个员工可以采购多个设备,一个设备只能由一个员工采购
    项目与设备的关系:1:n一个项目可以使用多个设备,一个设备只能由一个部门使用

    3.2 系统结构图
    3.3 流程图
    4 系统实施4.1 建表语句/*==============================================================*//* Table: "worker" *//*==============================================================*/create table "worker" ( "w_id" VARCHAR2(4) not null, "w_name" VARCHAR2(8), "sex" CHAR(2), "age" CHAR(2), "contract_date" DATE, "post" VARCHAR2(8), "d_id" VARCHAR2(4), constraint PK_WORKER primary key ("w_id"));/*==============================================================*//* Table: "department" *//*==============================================================*/create table "department" ( "d_id" VARCHAR2(4) not null, "d_name" VARCHAR2(16), "m_id" VARCHAR2(4), constraint PK_DEPARTMENT primary key ("d_id"));/*==============================================================*//* Table: "project" *//*==============================================================*/create table "project" ( "p_id" VARCHAR2(4) not null, "p_name" VARCHAR2(16), "fund" FLOAT(126), "type" VARCHAR2(4), "signing_time" DATE, "complete_time" DATE, "check_time" DATE, "m_id" VARCHAR2(4), "remarks" VARCHAR2(256), constraint PK_PROJECT primary key ("p_id"));/*==============================================================*//* Table: "equipment" *//*==============================================================*/create table "equipment" ( "e_id" VARCHAR2(4) not null, "e_name" VARCHAR2(16), "fee" FLOAT(126), "supplier" VARCHAR2(16), "p_id" VARCHAR2(4), "remarks" VARCHAR2(256), constraint PK_EQUIPMENT primary key ("e_id"));
    4.2 插入数据4.2.1 worker表INSERT INTO "worker" VALUES ('1008', '马化腾', '男', '29', TO_DATE('20171229201245', 'YYYYMMDDHH24MISS'), '经理', '11');INSERT INTO "worker" VALUES ('1011', '雷军', '男', '21', TO_DATE('20171220085418', 'YYYYMMDDHH24MISS'), '职员', '11');INSERT INTO "worker" VALUES ('1006', '司马懿', '男', '56', TO_DATE('20171229202106', 'YYYYMMDDHH24MISS'), '职员', '13');INSERT INTO "worker" VALUES ('1005', '王超', '男', '38', TO_DATE('20171018161809', 'YYYYMMDDHH24MISS'), '经理', '14');INSERT INTO "worker" VALUES ('1001', '张三', '男', '26', TO_DATE('20171026143550', 'YYYYMMDDHH24MISS'), '职员', '11');INSERT INTO "worker" VALUES ('1002', '李四', '男', '25', TO_DATE('20171026143733', 'YYYYMMDDHH24MISS'), '职员', '12');INSERT INTO "worker" VALUES ('1003', '李玲', '女', '27', TO_DATE('20171026144030', 'YYYYMMDDHH24MISS'), '经理', '13');INSERT INTO "worker" VALUES ('1004', '王五', '男', '25', TO_DATE('20171026144412', 'YYYYMMDDHH24MISS'), '经理', '14');
    4.2.2 department表INSERT INTO "department" VALUES ('11', '采购部', '1008');INSERT INTO "department" VALUES ('12', '销售部', '1002');INSERT INTO "department" VALUES ('13', '策划部', '1003');INSERT INTO "department" VALUES ('14', '人事部', '1004');
    4.2.3 project表INSERT INTO "project" VALUES ('004', '跨海大桥', 300000000, '桥梁', TO_DATE('20160226150155', 'YYYYMMDDHH24MISS'), TO_DATE('20170326150206', 'YYYYMMDDHH24MISS'), TO_DATE('20171001150213', 'YYYYMMDDHH24MISS'), '1004', NULL);INSERT INTO "project" VALUES ('001', '京沪高速', 300000, '建筑', TO_DATE('20170901145036', 'YYYYMMDDHH24MISS'), TO_DATE('20171026145042', 'YYYYMMDDHH24MISS'), TO_DATE('20171027145048', 'YYYYMMDDHH24MISS'), '1005', NULL);INSERT INTO "project" VALUES ('002', '青藏铁路', 1500000, '建筑', TO_DATE('20170701145439', 'YYYYMMDDHH24MISS'), TO_DATE('20170901145459', 'YYYYMMDDHH24MISS'), TO_DATE('20171026145505', 'YYYYMMDDHH24MISS'), '1008', NULL);INSERT INTO "project" VALUES ('003', '鸟巢', 30000000, '工程', TO_DATE('20170801145900', 'YYYYMMDDHH24MISS'), TO_DATE('20170901145906', 'YYYYMMDDHH24MISS'), TO_DATE('20171004145911', 'YYYYMMDDHH24MISS'), '1003', NULL);
    4.2.4 equipment表INSERT INTO "equipment" VALUES ('101', '挖掘机', 100000, '徐工', '001', NULL);INSERT INTO "equipment" VALUES ('102', '玻璃', 10000, '通用', '003', NULL);INSERT INTO "equipment" VALUES ('103', '铝合金', 20000, '上汽', '002', NULL);INSERT INTO "equipment" VALUES ('104', '液晶', 50000, '京东方', '004', NULL);INSERT INTO "equipment" VALUES ('105', '台式机', 100000, '清华同方', '003', '办公专用');INSERT INTO "equipment" VALUES ('108', 'A4纸', 200, '华润', '003', NULL);INSERT INTO "equipment" VALUES ('109', '键鼠套装', 1000, '达尔优', '003', NULL);
    5 运行维护转储:定期进行静态转储,动态转储,海量转储。
    数据库中可能发生各种各样的故障,大致可以分为以下几类:

    事务故障的恢复策略主要是:反向扫描日志文件,查找该事物的更新操作;对该事物的更新操作执行逆操作;继续反向扫描日志文件,查找该事物的其他更新操作,并做同样处理;如此处理下去,直至读到此事物的开始标记,事物故障恢复就完成了。
    系统故障的恢复策略主要是:正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤消队列;对撤消队列的各个事务进行撤消处理;对重做队列的各个事务进行重做处理。
    介质故障的恢复策略主要是:装入最新的数据库后备副本,使数据库恢复到最近一次转储的一致性状态。装入相应的日志文件副本,重做已完成的事物。

    6 用户手册6.1 安装及配置本系统基于Java开发,要使用本系统在本机上必须安装有Java开发环境,数据库使用Oracle。
    6.2 使用方法登录界面

    主界面

    6.3 基本操作运行程序之后首先进入登陆界面,在登录界面中输入服务名,用户名(数据库的用户名,比如SCOTT),密码。例如我的数据库的服务名是orcl,用户名是CHAN。经过正确的连接即可进入到程序的主界面。

    如下图所示,应用程序界面包括 “切换卡 (用来切换页面)”,“显示区 (显示基本信息)”,“查询区 (用来进行数据查询)”,“控制按钮 (用来进行基本操作)”。

    员工页面,点击打开表格可以查看所有员工的基本信息,关闭表格可以清空页面上的表格显示。

    点击添加信息可以添加某个员工的信息:

    点击修改可以修改某个员工的信息(注意:员工的编号在数据库中是唯一的,被修改的员工的编号在数据库中必须存在)

    点击删除信息可以删除某个员工的信息(同样编号必须存在)

    在部门页面可以通过部门名称查询部门经理的信息:


    在项目页面

    点击查询完成情况可以查询某项目经理(姓名)完成合同的情况

    点击查询设备采购可以某个项目设备采购情况

    在设备页面有一下几个查询:

    7 附录对客户端进行响应的逻辑处理函数大部分通过在客户端中调用数据库的存储过程完成。
    客户端程序逻辑处理的核心代码如下(界面代码在提交的工程中):
    import com.connectdb.ConnectDB;import oracle.jdbc.OracleTypes;import java.sql.*;import java.text.SimpleDateFormat;import java.util.Vector;import java.util.Date;public class ProjectFunction { /** * 添加员工信息 * @param */ public static boolean addWorker(String wId,String dId,String wName,String sex,String age,String date,String dName,String post){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(wId+dId+wName+sex+age+date+dName+post); try { CallableStatement c = conn.prepareCall("{call p_addworker(?,?,?,?,?,?,?)}"); c.setString(1,wId); c.setString(2,wName); c.setString(3,sex); c.setString(4,age); System.out.println("传入的时间是 "+date); c.setString(5,date); c.setString(6,post); c.setString(7,dId); //c.setDate(6,Date.valueOf(date)); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return true; } /** * 删除员工信息 * @param */ public static void deleteWorker(String wId){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); try { CallableStatement c = conn.prepareCall("{call p_delworker(?)}"); c.setString(1,wId); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询员工信息 * @param */ public static Vector<Vector<String>> queryWorker(String sql){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); ResultSet rs=null; Vector<Vector<String>> list=new Vector<Vector<String>>(); int i=0; try { Statement st = conn.createStatement(); rs = st.executeQuery(sql); System.out.println("执行查询"); // 判断结果集是否有效 while(rs.next()){ // 数据库存在,返回结果集 System.out.println(rs.getString("w_id")); System.out.println(rs.getString("w_name")); System.out.println(rs.getString("sex")); System.out.println(rs.getString("post")); Vector<String> result=new Vector<String>(); result.add(rs.getString("w_id")); result.add(rs.getString("w_name")); result.add(rs.getString("sex")); result.add(rs.getString("d_name")); result.add(rs.getString("post")); result.add(rs.getDate("contract_date").toString()); list.add(i,result); i++; } // 释放此 ResultSet 对象的数据库和 JDBC 资源 rs.close(); // 释放此 PreparedStatement 对象的数据库和 JDBC 资源 st.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 修改员工信息 * @param */ public static boolean updateWorker(String wId,String dId,String wName,String sex,String age,String date,String dName,String post){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(wId+dId+wName+sex+age+date+dName+post); try { CallableStatement c = conn.prepareCall("{call p_updateworker(?,?,?,?,?,?,?)}"); c.setString(1,wId); c.setString(2,wName); c.setString(3,sex); c.setString(4,age); System.out.println("传入的时间是 "+date); c.setString(5,date); c.setString(6,post); c.setString(7,dId); //c.setDate(6,Date.valueOf(date)); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return true; } /** * 获取员工列表 * @param */ public static Vector<Vector<String>> getWorkerList(){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); ResultSet rs=null; Vector<Vector<String>> list=new Vector<Vector<String>>(); int i=0; try { Statement st = conn.createStatement(); String sql="SELECT * FROM \"worker\""; rs = st.executeQuery(sql); // 判断结果集是否有效 while(rs.next()){ // 数据库存在,返回结果集 Vector<String> result=new Vector<String>(); result.add(rs.getString("w_id")); result.add(rs.getString("w_name")); result.add(rs.getString("sex")); result.add(rs.getString("post")); result.add(rs.getDate("contract_date").toString()); result.add(rs.getString("d_id")); list.add(i,result); i++; } System.out.println("长度 "+list.size()); rs.close(); // 释放此 PreparedStatement 对象的数据库和 JDBC 资源 st.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 查询部门经理 * @param */ public static Vector<String> queryManager(String dName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String wId="",wName="",sex="",age="",post="",contractTime=""; Vector<String> list=new Vector<String>(); try { CallableStatement c = conn.prepareCall("{call P_FDMANAGER(?,?,?,?,?,?,?)}"); c.setString(1,dName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.VARCHAR); c.registerOutParameter(4,OracleTypes.CHAR); c.registerOutParameter(5,OracleTypes.CHAR); c.registerOutParameter(6,OracleTypes.DATE); c.registerOutParameter(7,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); wId=c.getString(2); wName=c.getString(3); sex=c.getString(4); age=c.getString(5); contractTime=c.getDate(6).toString(); post=c.getString(7); System.out.println("执行查询"); list.add(wId); list.add(wName); list.add(sex); list.add(age); list.add(contractTime); list.add(post); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 查询项目设备采购信息 * @param */ public static Vector<String> getEqubyPro(String pName){ Vector<String> result=new Vector<String>(); // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String eNmae="",eSupplier=""; float eFee; try { CallableStatement c = conn.prepareCall("{call P_GETEBYP(?,?,?,?)}"); c.setString(1,pName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.FLOAT); c.registerOutParameter(4,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); eNmae=c.getString(2); eFee=c.getFloat(3); eSupplier=c.getString(4); result.add(eNmae); result.add(String.valueOf(eFee)); result.add(eSupplier); System.out.println("查询设备 "+eNmae+eFee+eSupplier); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return result; } /** * 查询设备采购费用信息 * @param */ public static float getEquFee(String eName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); float eFee=0; try { CallableStatement c = conn.prepareCall("{call P_GETEFEE(?,?)}"); c.setString(1,eName); c.registerOutParameter(2,OracleTypes.FLOAT); //执行Oracle存储过程 c.execute(); eFee=c.getFloat(2); System.out.println("查询设备 "+eName+eFee+"----"); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return eFee; } /** * 添加设备 * @param */ public static void addEqu(String eId,String eName,float fee,String supplier,String remarks,String pId){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(eId+eName+fee+supplier+remarks+pId); try { CallableStatement c = conn.prepareCall("{call p_addequ(?,?,?,?,?,?)}"); c.setString(1,eId); c.setString(2,eName); c.setFloat(3,fee); c.setString(4,supplier); c.setString(5,pId); c.setString(6,remarks); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询设备供应商信息 * @param */ public static String getEquSup(String eName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String eSupplier=""; try { CallableStatement c = conn.prepareCall("{call P_GETESUP(?,?)}"); c.setString(1,eName); c.registerOutParameter(2,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); eSupplier=c.getString(2); System.out.println("查询设备 "+eName+eSupplier); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return eSupplier; } /** * 查询项目员工信息 * @param */ public static void getWerbyPro(String pName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String wNmae="",wId=""; float eFee; try { CallableStatement c = conn.prepareCall("{call P_GETEBYP(?,?,?,?)}"); c.setString(1,pName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.FLOAT); c.registerOutParameter(4,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); wNmae=c.getString(2); wId=c.getString(4); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询项目完成情况 * @param */ public static Vector<String> queryComplete(String ManagerName){ Vector<String> result=new Vector<String>(); // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String date1="",date2="",pName="",isComplete=""; try { CallableStatement c = conn.prepareCall("{call P_ISFINISHED(?,?,?,?)}"); c.setString(1,ManagerName); c.registerOutParameter(2, OracleTypes.DATE); c.registerOutParameter(3, OracleTypes.DATE); c.registerOutParameter(4, OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); date1=c.getString(2).toString(); date2=c.getString(3).toString(); pName=c.getString(4); System.out.println("签订时间是:"+date2); System.out.println("应完成时间是:"+date1); //pName=c.getString(4); Date date; date=c.getDate(2); System.out.println("应完成时间是 "+date1); System.out.println("时间格式 "+date); Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式 String hehe = dateFormat.format( now ); System.out.println(hehe); if(date1.compareTo(hehe)<0){ isComplete="已完成"; System.out.println("已经完成"); } else { isComplete="未完成"; } result.add(pName); result.add(date2); result.add(date1); result.add(isComplete); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return result; }}
    8 总结8.1 遇到的问题Oracle数据库与之前接触过的数据库SQL语句有些不一样,除了常用的增删查改与其他主关系型数据库相似,其他的语句还是有一些区别的。在实习中经常因为在SQL语句中少个双引号或者将双引号写成单引号而出错,所以在刚开始写存储过程中用了不少时间。可见Oracle数据库对语法的要求比较严格。
    8.2 存在的问题
    在这次实习中,我发现自己的数据库设计能力还稍有不足,对项目管理系统的几个表的设计不是很合理,表中有些字段的类型和长度可能与实际应用不相符。在进行数据库设计时应该考虑实际项目中的应用,这样才能设计出满足实际需求的数据库管理系统。
    客户端程序中的程序设计时没有很好地采用架构来实现。使用三层逻辑架构时没有做到完全的层次分离,在表现层中还存在一些业务逻辑层的代码。数据库中每个表都应该用一个类来封装,然后对类中的成员变量也就是数据库表中的每个字段分别设置set()和get()方法。
    程序尚存在一些已知和未知的BUG,反映出自己在程序设计时对问题的考虑不够全面,对于在实际中可能存在的情况没完全把握。

    8.3 收获
    通过完成数据库课程设计,加深了我对数据库理论知识和在实际应用方面的认识,在实践中发现了自己在数据库设计和程序设计上的不足,对于提高自己的编程能力很有帮助。实习中的数据库设计部分可以巩固在实用数据库中的知识,让我学会在实际场景中更好地使用数据库。
    这次实习让我学习了在项目中经常使用到的主流关系型数据库Oracle,掌握Oracle的特征和基本使用方法。在项目中使用Oracle可以实现对SQL语句的封装,不仅提高程序的执行效率还提高了数据的安全性。当对数据库进行复杂操作时(如对多个表进行 Update, Insert, Query, Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
    6 评论 271 下载 2018-11-05 15:14:59 下载需要13点积分
  • 基于Android和SQLite数据库的手机音乐播放器

    摘 要本文就Android系统上一款音乐播放器应用程序的设计与实现进行讨论。Android是一个开源的系统,它底层是基于Linux的操作系统,本论文的音乐播放器采用了Android开源系统技术,利用Java语言和Eclipse编辑工具对播放器进行编写。同时给出了详细的系统设计过程、部分界面图及主要功能运行流程图,本文还对高度过程中遇到的问题和解决方法进行了详细的讨论,该音乐播放器集播放、暂停、停止、上一首、下一首、音量调节、歌词显示等功能于一体,性能良好,在Android系统中能独立运行。该播放器还拥有对手机文件浏览器的访问功能、歌曲播放模式、以及歌词开闭状态的友好设置.MP3的全名是MPEG Audio Layer-3,是一种声音文件的压缩格式,由于本播放器只限于应用层程序的探讨,所以对具体的压缩算法不作深究。
    关键词:Android 开源系统 linux 音乐播放器
    第一章 引 言1.1 项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windows mobile,ios,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。
    Android:是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统。本次作品音乐播放器就是基于Android平台的。
    随着计算机的广泛运用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。针对以上各种弊端,选择了开发多语种的音频视频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户(如听歌,看电影)的需求,除了能播放常见格式的语音视频文件,高级功能:还能播放RMVB格式的视频文件。此外,还能支持中文、英文等语言界面。
    要研究了各种市场上流行的手机播放器,了解它们各自的插件及编码方式,还有各种播放器播放的特别格式文件,分析各种编码的优缺点以及各种播放器本身存在的缺陷和特点,编写出功能实用,使用方便快捷的播放器。目前已经实现的功能有能播放常见音频文件的功能,如MP3,WAV,等,拥有播放菜单,能选择播放清单,具备一般播放器的功能,如快进,快退,音量调节等。播放模式也比较完善,有单曲,顺序,循环,随机播放等模式。
    1.2 编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计的实现的这主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,上一曲,下一曲,音量调节,视觉外观,播放列表和歌曲文件的管理操作等多种播放控制功能,界面简明,操作简单。
    本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。
    第二章 Android项目介绍2.1 什么是Android
    2.1.1 Android简介 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前最好的是Android2.0的摩托罗拉Droid。
    Android是基于Linux内核的软件平台和操作系统,早期由Google开发(在华注册商标名为“安致”),后由开放手机联盟(Open Handset Alliance)开发。它采用了软件堆层(softwarestack,又名以软件叠层)的架构,主要分为三部分。低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。Android在未公开之前常被传闻为Google电话或gPhone。大多传闻认为Google开发的是自己的手机电话产品,而不是一套软件平台。到了2010年1月,Google开始发表自家品牌手机电话的Nexus One。目前最新SDK版本为Android2.1
    2.1.2 Android Features特性 Android系统有如下的几大特性:

    应用程序框架支持组件的重用与替换Dalvik虚拟机 专门为移动设备做了优化内部集成浏览器,该浏览器基于开源的WebKit引擎优化的图形库,包括2D和3D图形库,3D图形库基于OpenGL ES SQLite 用作结构化的数据存储多媒体支持,包括常见的音频、视频和静态印象文件格式(如MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)GSM电话(依赖于硬件)蓝牙Bluetooth, EDGE, 3G, and WiFi (依赖于硬件)照相机,GPS,指南针,和加速度计 (依赖于硬件)丰富的开发环境,包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件
    2.1.3Android基本框架(AndroidArchitecture)
    1.Applications
    Application Android会同一个核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是用JAVA编写的。
    2.Application FrameWork
    开发者完全可以访问核心应用程序所使用的API框架。该应用程序架构用来简化组件软件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。该应用程序重用机制使得组建可以被用户替换。
    所有的应用程序都由一系列的服务和系统组成,包括:

    可扩展的视图(Views )可以用来建应用程序,包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),甚至包括一个可嵌入的web浏览器内容管理器(Content Providers )使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和分层文件(layout files )。通知管理器(Notification Manager)使得应用程序可以在状态栏中显示客户通知信息。活动类管理器(Activity Manager)用来管理应用程序生命周期并提供常用的导航回退功能。
    3.Libraries库
    Android包括一个被 Android 系统中各种不同组件所使用的 C/C++ 库集。该库通过 Android 应用程序框架为开发者提供服务。以下是一些主要的核心库:

    系统 C 库:一个从 BSD 继承来的标准 C 系统函数库(libc ),专门为基于 embedded linux 的设备定制。 媒体库:基于 PacketVideo OpenCORE;该库支持录放,并且可以录制许多流行的音频视频格式,还有静态印像文件包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG。Surface Manager:对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝融合。LibWebCore:一个最新的web浏览器引擎用来支持Android浏览器和一个可嵌入的web视图。 SGL:一个内置的2D图形引擎。 3D libraries:基于OpenGL ES 1.0 APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。 FreeType:位图(bitmap)和向量(vector)字体显示。 SQLite 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
    4.Android Runtime
    Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
    每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik是针对于同时高效地运行多个VMs来实现的。Dalvik虚拟机执行.dex的Dalvik可执行文件,该格式文件针对最小内存使用做了优化。该虚拟机是基于寄存器的,所有的类都经由JAVA汇编器编译,然后通过SDK中的dx工具转化成.dex格式由虚拟机执行。
    Dalvik虚拟机依赖于linux的一些功能,比如线程机制和底层内存管理机制。
    5.Linux内核
    Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux 内核也同时作为硬件和软件堆栈之间的硬件抽象层。未来发展 老牌智能手机软件平台制造商Symbian发言人则表示:Google的android只不过是另一个linux,symbian对其它软件与其形成的竞争并不感到担心。除了北美之外,Symbian在其它地区智能手机市场都占有大部分市场份额。 与iPhone相似,Android采用WebKit浏览器引擎,具备触摸屏、高级图形显示和上网功能,用户能够在手机上查看电子邮件、搜索网址和观看视频节目等,比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入全部Web应用的单一平台。 
    但其最震撼人心之处在于Android手机系统的开放性和服务免费。Android是一个对第三方软件完全开放的平台,开发者在为其开发程序时拥有更大的自由度,突破了iPhone等只能添加为数不多的固定软件的枷锁;同时与Windows Mobile、Symbian等厂商不同,Android操作系统免费向开发人员提供,这样可节省近三成成本。 Android项目目前正在从手机运营商、手机厂商、开发者和消费者那里获得大力支持。谷歌移动平台主管安迪·鲁宾(Andy Rubin)表示,与软件开发合作伙伴的密切接触正在进行中。从去年11月开始,谷歌开始向服务提供商、芯片厂商和手机销售商提供Android平台,并组建“开放手机联盟”,其成员超过30家。市场前景 Google手机于08年10月22日正式上市,与运营商捆绑的合约价为179美元(约合人民币1200元),现有的T-Mobile用户可以通过网络订购。在10月22日发布当天,将有22个国家和地区可以买到谷歌手机。在11月,将增至27个国家和地区。 
    谷歌手机将只能在T-Mobile网络内使用,将会有SIM卡锁定限制。T-Mobile USA提供了两种流量和短信近曝光的moto sholes(也有人称之为moto tao)将搭载最新的android2.0操作系统包月计划。第一档为25美元,包括不限制的网络流量,以及一定数量的短信;第二档为35美元,包括不限制的网络流量和不限数量的短信。G1支持各种谷歌的服务,包括Gmail、Google Maps、YouTube、Google日历和Google Talk,内置Chrome Lite浏览器。使用这款手机也需要Gmail账号。 “我爱死我的G1了!”谷歌联合创始人拉里·佩奇(Larry Page)憧憬:“对于我来说,谷歌手机最激动人心的一点就是它的未来。它的功能很强,正如几年前的电脑一样。你可以上网,安装软件。” T-Mobile USA为德国电信旗下移动子公司,运营GSM/HSPA网络,拥有用户近3000万。此次发布的谷歌手机采用高通MSM7201A处理器,支持7.2Mbps下载速率,美国运营商3G网络设定的套餐速率一般可达1Mbps以上。MSM7201A为单芯片、双核,整合硬件加速多媒体功能、支持3D图形,300万像素的摄像功能可以扫描条形码,并且有GPS功能。 在美国四大移动运营商中,T-Mobile USA处于相对弱势的地位,不过T-Mobile在欧洲有更为强势的是CDMA EV-DO网络,而T-Mobile USA和苹果iPhone的独家运营商AT&T为GSM/HSPA网络,后者在2005年12月就推出了全球第一个HSDPA商用服务。T-Mobile USA今年5月方才在纽约推出了3G服务,目前已经在奥斯汀、巴尔的摩、波士顿、达拉斯、休斯敦、拉斯维加斯、迈阿密、明尼阿波利斯、凤凰城、波特兰、圣安东尼奥和圣地亚哥等12个城市增加了3G覆盖,公司计划年底前将3G覆盖的城市从目前的13个增加到27个,能够为其超过2/3的用户提供3G服务。
    2.1.4 Android系统的四大组件在Android系统中,为我们提供了四大基本组件,每个组件是一个视图,但是有些是可见的,有些是不可见的视图,像Activity,ContentProvider是可见的视图,Service和BroadcastReceiver是不可见的,它们只在系统的后台运行。下面分别介绍四大组件:
    1.Activity 简介
    在Android系统中Activity提供可视化的用户界面,一个Android应用通常由多个Activity组成。多个Activity组成了Activity栈(Stack),当前活动的Activity处于栈顶。Activity有自己的生命周期,由Android系统来控制。
    2.Service 简介
    顾名思义Service就是运行在后台的一种服务程序,一般很少和用户交互,因此没有可视化界面定义一个Service类比较简单,只要继承Service类,实现其生命周期中的方法就可以了。一个定义好的Service必须在AndroidManifest.xml配置文件注册,通过<service>元素声明才能使用.Service有自己的生命周期,我们可以调用startService()启动一个Service或者bindService()方法来绑定一个存在的Service。
    3.Broadcast Receiver 简介
    Broadcast Receiver 顾名思义广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别的(例如,某个按钮的单击事件),而广播事件处理机制是系统级别的。到目前为止我们可以使用Intent来启动一个程序组件,我们还可以通过使用sendBroadcast()方法来发起一个系统级别的事件广播来传递消息。我们可以在你的应用程序中实现Broadcast Receiver来监听和响应这些广播的Intent。
    4.ContentProvider简介
    Content Provider 用来保存和检索数据,并且使应用程序之间相互访问数据成为可能。它是跨应用程序共享数据的唯一方法。
    Android 为常用的数据类型(如:音视频、图片和联系方式等)提供了大量的Content Provider。它们被定义在android.provider包下面。通过这样定义好的ContentProvider 我们可以方便的进行数据操作。当然我们必须拥有适当的权限。我们也可以自己来定ContentProvider共享我们的数据,方便用户的访问
    2.2 搭建Android开发环境任何事物要运行,都要有它的环境,Android也有它的环境才能够运行,下面介绍Android的开发环境配置。
    搭建开发环境需要的软件:

    操作系统:Windows XP或Linux软件包:Android SDK(SoftwareDevelopment kit Java Development kit) 、ADT(AndroidDeveloopment Tool)IDE环境:Eclipse IDE+ADT Eclipse3.3以上JDK:Java Runtime Environment虚拟机 、(JDK)JavaDevelopment kit
    安装步骤如下:
    第一步:安装Java虚拟机sun-java6-jdk版本
    第二步:安装Eclipse10.0工具官网http://www.eclipse.org/downloads选择版本(图4.2):进行安装

    第三步:安装Android SDK:首先要下载SDK,可以在这个网址下载http://developer.android.com/sdk,选择相应的系统进行安装

    第四步:安装Android ADT插件运行Eclipse,选择help->install new software 选择add,将会弹出一个框

    点击OK,选择要安装的软件,占next,然后选择接受协议,直到安装成功,重启Eclipse软件,设置Android SDK Home,Window->refrence

    在SDK location中输入SDK Tools路径:D:\android software\android-sdk-windows,点击OK这样Android环境就已经搭建成功了。
    2.3 Android常用工具的使用2.3.1 命令行的使用
    创建AndroidVirtual Devices(AVD)使用android listtarget命令列出当前可用的SDK版本androidcreate avd -n <name> -t <targetID> [-<option> <value>]…模拟器(Emulator)的使用启动和停止模拟器emulator-avd <avd_name>AndroidDebug Bridge(ADB)的使用查询当前模拟器实例数量adbdevices本地机器和模拟器之间相互拷贝文件D:>adbpush d:\test.txt /sdcard/D:>adbpull /sdcard/test.txt d:/安装apk应用程序adbpush d:\test.apk /sdcard/adbinstall test.apk使用shell命令在DOS命令行输入adb shell 便进入shell命令行了可以使用exit退出shell
    2.3.2 Dalvik Debug Monitor Service (DDMS)的使用在DOS命令窗口,输入ddms会弹出如下图所示界面,Android编辑工具的可视化界面(图3.6)

    2.4 Android音乐播放器的工程2.4.1 Android项目
    Android的四大基本组件:Activity(活动),Service(服务),BroadcastReceiver(广播),ContentProvider(内容提供者),各组件之间要进行切换需要一个意图或企图Intent类,通过启动StartIntent()方法来使各组件进行跳转。Android的五大布局方式:LinearLayout(线性布局) FrameLayout(帧布局) TableLayout(表格布局) AbsoluteLayout(绝对布局) RelativeLayout(相对布局),五种布局方式可以相互嵌套,Android各种漂亮的界面都是通过嵌套布局而实现的。Android的线程,以及线程之间通信的中介:Handler类。Android数据库:在第三章已经介绍过了。这里不再介绍。Android配置文件:AndroidManifest.Xml及res资源文件中各种属性 布局方式 引用的资源等。
    Android系统将插件ADT集成到了Eclipse工具上,因此,一个Android程序启动后,系统会启动一个模拟器(Emulator)(图3.7),该模拟器是一款手机板的样式,拥有手机硬件的基本操作。我们也可以将右边的键盘通过代码属性设置将其隐藏,界面的大小可自由设定。

    2.4.2 Android工程程序结构Android工程基本结构目录包括:src (源代码)、gen(Android系统自动生成的常量)、Res(资源文件):主要存放程序界面的布局配置(.xml)文件和图片资源。AndroidMainfes.xml 是四大组件的驱动配置文件,有它的存在,Android程序的四大组件才可以正常的跳转。Android资源的类型和布局(图3.7)

    下图2.8.1 为一个Android工程所必须的结构。

    2.4.3 AndroidManifest.xml文件 Android系统的任何一个程序启动都需要AndroidManifest.xml来启动程序,任何一个新建的工程目录都会自动生成一个AndroidManifest.xml文件,此配置文件是整个程序能够正常运行的核心,它里面包含了Android SDK的版本,程序运行的默认Activity,当程序中的任何一个组件触发事件后,系统都会自动的去AndroidManifest.xml中寻找标识来作出相应的操作。任何一个AndroidManifest.xml文件的格式都应为:
    <?xml version="1.0" encoding="utf-8"?><manifest > <application > <activity > <intent-filter> <action/><category/> </intent-filter> </activity> </application> <uses-sdk /><uses-permission /></manifest>
    Android系统有一个编码的规定,支持的编码是”utf-8”,当程序中出现乱码是,我们须将其编码格式转化为”utf-8”.在 AndroidManifest.xml中会在第一行声明一句:
    <?xmlversion="1.0" encoding="utf-8"?>
    这是该系统支持的版本和编码。在第二行定义了我们需要使用的架构,该架构来自xmlns:android=”http://schemas.android.com/apk/res/android“
    xmlns(XMLnamespace)是一个命名空间,它就像一条河的源头一样能让我们找到系统架构,每一个配置文件必须有这个xmlns,否则程序中的所使用的所有资源将无法找到。
    在application元素我们定义:
    android:icon="@drawable/icon" android:label="@string/app_name"
    其中,android:icon是程序在手机中显示的图片,我们运用@drawable/icon表示了对res/drawable目录下的icon.png的引用。@string/app_name表示了对res/value目录下string.xml中定义的app_name参数的引用。

    这是系统确定的首先要启动的Activity是PlayRackActivity。
    在intent-filter选项中,有action和category等等属性,我们需要定义action的值为android.intent.action.MAIN,category的值为android.intent.category.LAUNCHER,它们是系统的值,程序在解析到这些常用后就可以确定首先要启动的Activity。当我们需要通过一个组件触发另一个组件时,我们将设定action和category的其它属性值,系统会根据我们设定的属性值去AndroidManifest.Xml的application 中寻找标识,任何一个Activity的action和category是唯一,所以程序在任何时候都能唯一启动一个Activity,这样,不同的Activity之间的跳转就实现了。
    在AndroidManifest.xml中有一个根结点\<uses-sdk\>,它是我们需要定义的ADT版本,例如我们将其值设定为android:minSdkVersion=”8”,则表示此Android工程所用的版本为17。
    如果我们需要对网络进行访问,比如打开一个网页,刚我还需要设置一个网络访问权限uses-permission,将其的值设置为android:name=”android.permission.INTERNET,我们就可以访问网络了。当然uses-permission还有很多其它的权限,例如GPS定位权限,浏览器数据存取权限com.android.browser.permission.READ_HISTORY_BOOKMARKS等等。
    当程序的任何一个组件要用到时,都必须在AndroidManifest.xml文件中声明。四大组件要使用前都需要声明,其声明方式如下:
    <service></service><provider></provider><activity></activity><receiver></receiver>
    其中声明provider时还需要声明其授权 authorities。每个组件里面还有很多的属性,会根据程序的具体需要定义不同的属性。过滤器intent-filter 有两种启动方式来启动界面:
    1.显示方式
    显示方式是在代码中的直接启动组件,启动时会声明Intent,在它的构造方法Intent(组件1,组件2)中直接指定一个组件的名字,然后调用方法startIntent(intent)以启动指定的组件。
    2.隐式方式
    隐式方式是通过过滤器来过滤完成的,启动的组件必须满足action和category的条件才能够启动该组件。这些属性是在AndroidManifest.Xml文件中声明的。两种启动方式都可以通过程序setAction(ACTION常量)和startActivity(intent)或配置文件两种方式来实现组件的跳转。
    第三章 系统需求分析3.1 功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。以下分别描述:
    3.1.1 播放器的基本控制需求
    3.1.2 播放清单列表管理需求当用户选中列表中某一项歌曲,就有的需求:
    3.1.3 播放友好性需求
    3.2 系统结构图音乐播放器的系统流程图(图3.5.1)。

    3.3 系统界面需求 播放器界面要求布局合理,颜色舒适,控制按钮友好,为了减少开发工程量,图片素材多数为公司项目素材(图2.6)。

    3.4 系统性能需求根据Android手机系统要求无响应时间为5秒,所以就有如下性能要求:

    当要求歌曲播放时,程序响应时间最长不能超过5秒当要求歌曲暂停时,程序响应时间最长不能超过5秒当要求歌曲停止时,程序响应时间最长不能超过5秒当要求歌曲上/下一首时,程序响应时间最长不能超过5秒当要求进行清单列表时,程序响应时间最长不能超过5秒
    3.5 运行环境需求
    操作系统:Android手机基于Linux操作系统支持环境:Android 4.0.1版本开发环境:Eclipse 10.0
    第四章 播放器系统功能详细设计4.1 音乐播放器主界面功能实现4.1.1 播放器主界面
    Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式,和各种资源文件如图像,文字,颜色的引用,程序在运行时,可以通过代码对各配置文件进行读取。这样就可以形成不同的可视化界面和炫丽的效果。播放器主界面是一个Activity,Android工程在每个activity启动的时候会首先执行Oncreate()方法,如下代码:
    @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.main); }
    该方法主要执行界面的初始化操作,Activity有个设置布局的方法:Context.setContentView(layoutResID),参数为资源ID,该ID在工程目录res/layout下,主界面布局文件名为main。
    下面为main.xml布局文件代码结构如下:

    在播放界面中,歌词显示为居中,实现方法代码如下:
    <LinearLayout android:orientation="horizontal"android:gravity="center"android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:layout_height="wrap_content" android:textColor="#8deeee" android:id="@+id/lrcText" android:layout_width="wrap_content"></TextView></LinearLayout>
    属性:

    orientation=”horizontal”:此线性布局的子部件为水平方式布局Layout_width=”fill_content”:布局的宽度为填满父布局Layout_height=”wrap_content”:布局的高度子由窗体的大小决定窗体TextView 文本 :textColor=”8deeee”设置文本显示的颜色RGB为”8deeee”TextSize:为默认大小
    4.1.2 播放界面音轨的实现
    不管是从界面外观还是从功能上,系统自带的SeekBar往往不能满足用户的需要。所以我在这里自定义了一个音轨SeekBar,在widget_main.xml配置文件中,SeekBar的代码如下:

    通过这些属性设置,就自定义一个如上图一的SeekBar音轨。
    播放器最重要的一部分就是音轨与歌曲进度同步的实现。音轨设置了两个TextView用来显示当前歌曲播放的进度时间和歌曲的长度(图4.3)。

    4.1.3 播放器播放、暂停、停止等功能
    如图4.4所示:各按钮水平放置,用的是布局中的线性布局LinearLayout,用方法setOrientation(horizontal);将其设置为水平。LinearLayout中依次放置播放,暂停,停止,上、下一曲按钮属性。配置文件代码结构如下:

    代码算法如下:

    4.2 播放列表功能播放列表界面(如图4.5)

    布局层次关系如下:

    在Android里面,有一个视图叫ListView,其特点是一个有BaseAdapter的属性,从下到下,或从左到右的显示方式。系统默认的方式每一行只显示一个TextView,本播放列表实现了自定义的方式,刚ListView的每一行显示一个音乐图片和一个歌曲名字。视图可以显示在Activity上,所以就可以看到我们想要的歌曲列表界面。
    4.3 菜单功能菜单界面(如图5.7)

    4.3.1 菜单界面在menu.Xml配置文件中。
    4.3.2 菜单功能实现菜单有5个功能:设置,搜索,进入眨眼模式,关于,退出。各功能都是通过鼠标点击或触屏触发事件。
    第五章 结 论
    通过对Android手机平台的音乐播放器软件的开发,使我对Android音乐播放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。开发Android音乐播放器,要抓住开发的核心部分,音乐播放器大体由播放主界面、播放列表、菜单、播放设置、文件浏览、歌曲搜索六大核心组成,只要掌握了这六部分的开发,音乐播放器就能初具规模。而其它的功能都是在这六个功能的基础上去补充添加的,但是这是功能的确是必不可少的功能,否则就不能算是音乐播放器了。音乐播放器系统实现了播放器的基本功能:播放,暂停、停止、上/下一首、音量调节、歌词显示、播放模式、歌曲搜索、文件浏览器、播放列表查询等功能。运用的系统平台是现今最热门的Android系统,是一个开源的基于Linux系统的手机平台。是以Java语言编写+SQLite数据库支持+SharePreference配置文件的组合方式进行数据管理。实现了音乐播放器的系统编程。本次程序设计,对播放器的系统结构框架做了精心的构思与设计,采用主要开发工具是Eclipse3.5+Java语言的支持,Android DevelopmentTool的插件,和Android SDK2.1版本的全面结合,才使整个音乐播放器系统得以实现。总之,经过几个月的Android系统技术知识的学习和对音乐播放器的构思与设计,使我对Android系统有了一定的了解,让我对Android系统上的开发流程和开发模式有了深入的了解,这对我以后的Android项目开发有很大的帮助。
    在此论文抒写过程中,我还要感谢我的软件工程的老师给我的支持和建议。让我能顺利的完成本次论文。
    参考文献[1] 高昂著.支持动态语言的Android平台[M].北京:人民邮电出版社,2009-05-07.
    [2] eoe.Android开发社区.http://www.eoeandroid.com/. 2010-04-10.
    [3] JavaEye论坛.http://www.javaeye.com/forums. 2010-04-15.
    [4] Android API文档.http://androidappdocs.appspot.com/index.html. 2010-04-10. http://wghjay.javaeye.com/blog/519955.2009-11-18.
    4 评论 111 下载 2018-09-27 22:25:38 下载需要15点积分
  • 基于JSP和MySQL的网上订餐系统

    摘 要随着社会不断的更替发展,科技日新月异,人们的饮食生活方式以及作息等等方面都发生了翻天覆地的变化。发展到现今社会,人们的饮食方式不再局限于传统的在饭店中就餐,越来越多的人开始使用网上订餐,网上订餐已经成为当前十分流行的就餐方式。
    本课题剖析当前形势下的订餐系统以及当前已开发出的订餐系统,例如美团外卖,饿了么软件,分析各个软件的长处,结合自身所学习的知识,开发出的基于B/S结构的网上订餐系统。网上订餐系统的开发,使得人们可以足不出户尽享美食,而且迎合了当今时代的发展潮流。网上订餐系统具有良好的用户界面,响应迅速,可维护性好,操作简便等优点。
    网上订餐系统开发的过程中使用的开发平台是当今比较流行的平台MyEclipse,使用的服务器也是人们普遍使用的Tomcat服务器,主要编程语言采用的是jsp语言和java语言,在设计开发网上订餐系统的同时,充分考虑了系统的可扩展性和兼容性,可维护性,所开发出的网上订餐系统可以满足人们对于日常订餐的需要。
    网上订餐系统将系统的主要使用操作人员设置分成网上订餐系统的后台管理员和普通用户两大类,系统所具有的主要功能模块为:查看菜品的信息模块,查询菜品信息的模块,注册成为系统会员模块,我的购物车模块,我的订单模块,系统留言板模块,系统后台管理模块。本文首先介绍了课题的背景与意义,之后从系统分析,数据库的设计,系统的功能与实现,系统测试这些方面来对系统进行分析测试。
    关键词:网上订餐,JSP,MyEclipse,B/S结构
    AbstractWith the continuous development of the community, science and technology with each passing day, people’s food lifestyle and work and so on have undergone enormous changes. Development to the present society, people’s diet is no longer limited to the traditional dining in the hotel, more and more people began to use online ordering, online ordering has become a very popular dining style.
    This topic analyzes the current situation of the ordering system and the current development of the ordering system, such as the US group take-away, hungry software, analysis of the strengths of each software, combined with their own learning knowledge, developed based on B / S structure Online ordering system. Online ordering system has a good user interface, fast response, good maintainability, easy operation and so on.
    Online meal ordering development process used in the development of the platform is more popular platform MyEclipse, the use of the server is also commonly used Tomcat server, the main programming language is used jsp language and java language, in the design and development of online ordering system at the same time , Taking full account of the system scalability and compatibility, maintainability, the development of the online ordering system to meet people’s daily needs for the meal.
    Online meal ordering will be the main use of the system operator set up into the online ordering system of the background administrator and the general user two categories, the system has the main function modules: View the menu information module, check the menu information module, registered as a system Member module, my shopping cart module, my order module, system message board module, system background management module. This paper first introduces the background and significance of the subject, and then analyzes and tests the system from the aspects of system analysis, database design, system function and implementation, and system testing.
    Keywords: Online meal ordering,JSP, MyEclipse, B/S structure
    第一章 绪论1.1 课题背景与意义自新世纪以来,我国经济发生翻天覆地的变化。中国经济发展迎来空前巨大的机遇与挑战,世界性的发展交流在这三十年较近四十年的时间中整体性上升发展,东西文化的碰撞,不断为国民经济的发展注入新鲜血液。以服务业为代表的第三产业不仅满足了消费者的需求,而且为他们选择的多样化提供了诸多便捷。饮食行业成为商家提高利润的突破口,物质文化的不断满足之后必定是精神世界的不断丰富,第三产业进入繁荣时期。但是饮食行业的就餐方式依然落后,传统的去实体店就餐已经不能满足年轻人和大众的要求。
    中国是一个自古以来就喜欢和看重饮食的国家,从古至今。当代社会人们在大中型城市的生活节奏不断加快。许多人或是忙于工作,或是忙于学业,无法静静的坐下来品尝美味的佳肴。随着21世纪的到来,电子商务的潮流冲击了中国的思想文化,人们越来越倾向于网上购物和网络消费,网上订餐这种新潮的就餐方式已然成为了现代的主流消费方式,被人们广泛认同。
    综合比较饿了么,美团等市面上已经存在的网上订餐软件,现今的订餐软件功能十分强大,在借鉴学习优秀的订餐软件的基础上开发出了一个网页版的网上订餐系统。经过考查餐饮行业的发展现状发现,我国以大中型城市为代表的餐饮行业中,网上订餐迅速崛起,随着餐饮行业规模的不断扩大,提供多样化订餐方式是对传统酒店行业改革的主要特点。而传统的实体点餐已经不能适人们快节奏的生活方式,所以要想订餐行业长期发展,必须运用新型订餐模式,解决传统订餐方式的各种弊端。
    1.2 开发工具及技术1.2.1 开发工具本课题开发主要使用MyEclipse和汤姆猫后台服务器结合开发,开发阶段主界面前端主要使用JSP技术进行开发,下面对以上列出的几种技术进行简单介绍与分析。
    1.2.1.1 MyEclipseMyEclipse是一个IDE环境下比较常用的开发软件,广泛用于J2EE和Java的开封。其功能十分强悍,可以对开发软件进行调试,提高调试或开发效率。其可以直接地翻译源文件,十分省心省力,并且对各类源文件都基本支持,具有健壮性,可兼容性等优势,可以轻松的进行JAVA WEB开发,具有可视化编辑器和快捷操作栏,同时还可以优化JAVAEE开发,方便的找到关键技术的解决方案,同时MyEclipse也全面支持各种插件,支持个性定制和扩展化,个性化功能。对于本系统关键技术采用JSP的网上订餐系统来说,MyEclipse无疑是最适合的,开发最便捷的开发平台。
    1.2.1.2 TomcatTomcat是一个主要由Apache、Sun公司共同努力,开发的服务器,同时它是一个开源的,免费给社会大众使用的服务器,它是开发JSP应用程序,应用于MyEclipse平台的最佳服务器,十分适合个人开发以及中小型企业以及用户比较零散的情况下使用,可以这样理解,汤姆猫服务器就像一个中介,通过使用它来对HTML页面进行响应,汤姆猫服务器是阿帕奇服务器的一个延伸扩展软件,当前最新版的汤姆猫服务器版本为9.0.0,本系统主要采用汤姆猫服务器部署已经开发好的网上订餐系统。
    1.2.2 JSP技术JSP最早是由SunMicrosystems公司提出的,经过其推广,很多的计算机和软件公司逐渐共同参与开发。其主要是通过在HTML文件(.htm,.html)中嵌入Scriptlet和JSP标签来实现的。这样,内嵌的Java程序就可以生效,对数据库做出请求、或者启用E-mail等。JSP大概出现上世纪末,SunMicrosystems公司希望利用它来建立动态性的网站,并利用其兼容性和扩展性,来扩大平台应用。从实际效果来看,JSP技术的出现使Web的建设和设计创新不断。其特点大概有以下几点:

    依托JSP技术,工程技术人员可利用XML或HTML标识来对web等页面进行修改或推翻设计。这些页面上的内容也可以依托JSP来设计或实现。另外,网站服务器中的内容将被储存在Servlet和JavaBean中,同时还体现在脚本中。如此一来,利用JSP编程语言设计的服务器,其内容发送的信息和要求都可以通过JSP索引来解释,或者根据其脚本来设计或建立。当然,这些最终的内容也会通过HTML或XML形式反馈到浏览器中。通过这样的方式,能够使源代码的编写者维护自己的专利和权益,也可以保证web页面的兼容性和可拓展性
    一般来说,单独的JSP页面不发生复杂的数据分析和处理,其一般用于爬虫或索引提炼攫取数据
    JSP是基于Java编程语言的,其内部具有tags和scriptlets,可以用于储存动态页面运作需要的一套程序方式。另外,JSP将动态页面运作需要的一套程序方式与静态的网页设计分离,这样的模块分块使JSP具有兼容和扩展性,开发性更高。说到底,JSP技术能实现动态的页面控制,并且可以让页面运作程序与静态的页面分离
    JSP页面由两部分组成,分别为HTML和Java代码。一般来说,上游的服务器如果收到来自外部请求或信息,会对Java代码进行分析或运算处理,从而以HTML的方式回馈到网页浏览器中。Java Servlet是其基础,规模较大的JSP项目开发一般依托Java Servlet和JSP这两者。在技术上,JSP具有了Java特有的容易理解、容易上手、适用性广,不挑平台、安全性高等特点。这些优势保证了其在整个因特网中广为使用。在上世纪末出现后,如今不少公司都使用其服务器,如比较有名的IBM、Oracle、Bea,其逐渐成为电子商务软件开发的“宠儿”

    具体来看,JSP有如下的显而易见的优势:

    可以多次的复用:可在各类系统内嵌套使用,而不需要重新编写代码。这是其优于PHP之处
    兼容性比较好:基本不挑平台,常见的平台都能兼容和开发、应用、扩展。这刚好与PHP的不可拓展性互补
    适用性广:无论是war小文件或多层次的平台以及服务器,其都能兼容和运行。对各类规模不一的平台都能进行数据分析、处理,反馈,其展现出极强的适应能力
    可依托种类丰富、功能优异的工具:经过接近20年的发展,JSP如今已拥有了很多开发工具,这些工具功能强大,几乎覆盖了程序开发和设计方方面面,并且几乎不需耗费金钱即可得到,为开发人员提供了便利性

    1.2.3 B/S模式分析C/S模式是由Client、Server和middleware构成的。其中Client主要用于客户与标准组件进行信息的交互和传递。Server主要是集中对数据库资源进行管理,当有多个请求同时需要某资源时,可以进行优化和分配。Middleware是在用户与服务器之间起到第三者的连通作用,通过其连接,可以让请求和信息在用户与服务器之间顺畅流通。
    B/S与C/S模式最大的不同是用户端。从外在使用上看,B/S一般无须在计算机上安装专用的客户端,不需要通过专用的程序与服务器发生连接。其连接一般通过标准化设定的浏览器即可实现。这样可以避免安装客户端的繁琐,可以释放用户的硬盘空间,让用户电脑界面更加美观清晰,使用效果更佳。
    从操作体验上来说,在C/S模式下,用户想要熟悉地操作,与服务器发生请求和信息交互,那么需要对安装的用户端有一定掌握,对其界面和基本操作要比较熟悉。而对于B/S模式来说,由于浏览器的界面是经标准化的,操作方式和按钮大同小异,用户无须耗费太多的时间成本即可轻松上手。从系统安全和日常维护来说,B/S无疑更省事。
    从目前的发展来看,B/S已经具备了网上公开信息功能,这是在MIS上拓展而来的。而C/S暂时实现不了这一功能。在预约挂号软件的应用中,运用这种网上公告和发布功能,可以减少医院纸质材料的打印和派发,也使其运营效率提升。
    从以上B/S与C/S的比对,可以发现在MIS平台中,B/S具有不可比拟的优势。因此本课题设计中选用了B/S架构。B/S架构图如下图1.1所示:

    1.3 软硬件需求
    硬件需求

    CPU:Pentium以上计算机内存: 512M以上
    软件需求

    操作系统版本:Windows 7开发工具:MyEclipse 6.5后台服务器:Apache Tomcat 6.0开发语言:Java浏览器:IE6.0
    开发过程中使用的机器配置

    CPU:intel酷睿i5内存: 8G软件需求:操作系统版本:Windows 7开发工具:MyEclipse 6.5后台服务器:Apache Tomcat 6.0开发语言:Java浏览器:360浏览器

    第二章 系统分析2.1 可行性分析在我们着手开发一个新系统时,我们或多或少会遇到各种限制,诸如时间上的限制或是资源上的限制。因而我们必须在着手开发项目之前进行一系列的可行性分析,进行可行性分析并不是浪费时间和资源,而是对时间和资源进行一个长远的规划,规避这些不必要的系统开销,具体的,我们从以下这几个方面:开发所使用的技术的可行性,开发经费消耗的经济的可行性,开发完成后和过程中的操作的可行性,设计开发过程中的法律可行性几个方面来进行详细的阐述。
    2.1.1 技术可行性在进行系统开发的第一步,便是对本系统进行技术可行性的分析,本系统的所采用的开发平台是MyEclipse,本系统所采用的开发数据库是MySQL,主要采用JAVA语言和JSP语言来完成系统的绝大多数功能,在太原理工大学学习期间,我们学习了WEB-JSP技,JAVA技术,数据库系统概论,了解了MYSQL数据库的使用原理和操作规范,由此分析,技术可行性分析通过。
    2.1.2 经济可行性步入21世纪,正是一个各种科技创新日新月异的时代,信息化的管理,信息化的系统使得人们的生活方式发生了改变,同样信息化使得网上订餐系统可以在原来老旧的订餐方式发生改变,可以为采用网上订餐系统的企业带来巨大收益;同时,网上订餐系统对硬件的要求斌并不是十分的严苛,普通用户和中小型企业完全都可以负担的起,开发成本较低,对服务器的要求也并不是很高,开发网上订餐系统所带来的高效率和便捷实用性将远大于开发网上订餐系统所投入的成本和心血,而且可维护性和可扩展性都十分健康良好,将会给系统使用者带来很大的经济收益,据此分析,经济可行性分析通过。
    2.1.3 操作可行性在开发该系统完成前,分析开发完成后的系统,可以看出网上订餐系统在输入添加界面多采用条形框和下拉框形式,操作起来简单方便,对操作人员的技术要求很低,同时界面十分简单,十分容易上手,只要对网页有一定了解会操作微软windows系统的人员均可以轻松,愉快的使用本系统,即使开发人员零基础,也可以简单教学之后就可以熟练操作本系统,不但如此,本系统的功能结构操作一目了然,采用简约的理念,来设计本系统的操作界面,简易便捷,由此而言,得出结论,网上订餐系统在操作上是可行的,操作可行性通过。
    2.1.4 法律可行性本人开发网上订餐系统过程中所使用的开发平台MyEclipse,数据库Mysql都使用的是正版软件,是官方供给使用学习者使用的开源免费软件,同时代码都是经过自己独立思考所编写的,并且都是自己学习和运用到实际项目中,同时引用的部分都清晰的给出了所引用的作者,所引用的部分出自的文章,所以总得来说不存在任何侵权问题,因而满足法律可行性满足的要求,法律可行性通过。
    综合以上的分析,在技术,经济,操作,法律可行性几个方面都进行了分析,并且分析结果都通过,由此可以得出,基于jsp的网上订餐系统的开发是完全可以实现的,我们可以对网上订餐系统进行开发。
    2.2 用户的需求分析用户的需求分析对于网上订餐系统的开发是十分重要的,清楚明确的需求分析对于条理地开发系统起到至关重要的作用。
    综合分析本系统所面向的受众群体,具体的对用户的需求分析如下:

    对于系统普通用户:系统普通用户希望系统具有良好的界面,简洁的操作,并且系统响应时间短,可以简单快速的注册成为系统会员,对所选中的商品进行下订单,购买等操作。并且可以在下订单之后清楚地看到订单的明细信息,而且还可以与系统后台管理员进行留言互动
    对于系统后台管理员:系统后台管理员希望系统具有良好的后台界面,操作简单,可维护性好,并且可以兼容不同的平台和浏览器,系统响应时间短,具有健壮性和稳定性,可以快速,方便地对菜品信息,会员信息,留言信息等等系统数据库信息进行管理和对整个系统进行维护

    2.3 系统的功能模块图系统的功能模块图可以清楚的在宏观上看清整个系统的功能,了解系统的大致功能模块,功能模块图可以描绘如图2.3所展示:

    网上订餐系统主要的操作人员模块划分可以主要划分为用户的模块和管理员的模块两大模块
    对于用户模块,用户可以进行网上点餐,或是注册成为会员
    对于系统管理员,网上订餐系统的后台管理人员可以进行对已经买单的用户进行信用的评价,对交易完成后的订单进行操作和查看。例如增加或删除或编辑等;还可以对菜品信息管理,例如增加或删除或编辑等。还可以对用户信息管理,例如增加或编辑或删除用户的信息;还可以对菜品类别管理,例如增加或编辑或删除菜品类别的信息,具体的用用系统功能模块图进行表述,可以描述成为以下图2.3样式:

    在对上述总体的系统功能模块进行分析之后,我们进行进一步的细化,细化用户点餐功能。用户点餐功能又可以进一步分为菜品查询,查看购物车,查看订单,进行留几大功能模块,具体的功能模块图如下2.1所展示:

    在对上述总体的系统功能模块进行分析之后,我们进行进一步的细化,细化用户点餐功能。用户点餐功能又可以进一步分为菜品查询,查看购物车,查看订单,进行留言几大功能模块,具体的功能模块图如下图2.2所示:

    2.4 功能模块分析接下来便开始对系统进行总体的功能模块模块分析,根据以上的对各个可行性的各个方面都综合进行的深入详细分析,该系统在功能模块上可以划分为以下几个宏观的功能模块系统。
    2.4.1 用户信息管理该模块主要的功能由系统的管理员完成,管理员进入到系统的后台对在前台进行会员注册的用户进行删除,查看用户信息两大功能模块进行操作,具体的可采用例图进行表述,可以描述成为以下图2.3样式:

    2.4.2 订单信息管理功能该模块主要的功能由系统的管理员完成,管理员进入到系统的后台对已经在前台下单的用户的订单进行查看,对已经在前台下单的用户的订单进行受理,对已经在前台下单的用户的订单进行删除,具体的用用例图进行表述,可以描述成为以下图2.4样式:

    2.4.3 菜品信息管理功能该模块主要的功能由餐馆用户完成,餐馆用户进入到系统的后台,对本店想要新增的新菜品进行手动的添加,对已经存在的菜品信息进行查看审阅,对已经存在的菜品信息进行删除,具体的用用例图进行表述,可以描述成为以下图2.5样式:
    菜品信息管理功能主义包括查看菜品的信息,添加菜品的信息,删除菜品的信息。

    2.4.4 用户订餐功能用户订餐功能的主要操作对象是普通用户(注册会员),普通用户进入系统前台,即系统主页进行查看已经拥有的菜品的菜品信息,或是满意后购买想购买的菜品,具体的用用例图进行表述,可以描述成为以下图2.6样式:

    2.5 设计的基本思想设计思想遵循以下几点:

    网上订餐系统的开发过程中使用的并非是app形式,而是B/S结构模式,这种设计模式的特色是前台和后台处理层次十分分明,在适用用户方面,适用于当前时代下大部分会上网,熟悉上网操作的普通用户和管理人员
    本系统开发完成后,最大的特点就是采用了面向对象的原则,我们之所以使用面向对象技术来开发系统,就是因为我们开发系统时对系统准确的掌握,以及精准的抽象,通过良好的抽象可以在总的架构上更清楚的对系统进行架构,从而使系统更加稳定,效率更高化
    本系统在开发过程中使用模块化的功能设计与分析。模块化设计的核心思想是讲系统的整体功能不断细化求精,细化成为最小的单位——模块
    本系统在开发过程中,在界面设计上设计的十分简洁,界面设计时遵循了在太原理工学习时所学习的界面简洁性,友好性,可交互性等一系列特征,可供初次使用本系统的人轻松的使用本系统,不会有任何操作障碍
    本系统设计与实现的漫长过程中,始终遵循在太原理工软件需求工程的基本原理这门课程中所学到的速度优先准则,结合pert图和甘特图计划了设计系统的大体生命周期,在设计开发网上订餐系统中,尽量做到速度优先,同时尽可能的减少资源的占用和使用
    网上订餐系统开发过程阶段,开发阶段尽量做到即突出攻破重点的项目和内容,又要分析细节,重基础同时也不丢失细节,在遵循这些原则的基础上同时一定要符合设计的要求,符合设计的主题,同时注重可扩展性,可以更多的兼容平台与操作系统,可以方便的扩充功能

    2.6 性能需求2.6.1 系统的安全性网上订餐系统采用的进入系统身份不同,所具有的权限也不相同,所具有的操作也不同,相应的在可以使用的系统功能上也有很大差别。因而要将二者严格地区别开来,具体的来说:
    若是想登陆系统后台对各种信息进行管理,必须要拥有管理员权限,没有取得管理员权限的普通用户不能进入系统后台对各种数据进行修改,从而在这一点上保证了系统关键核心数据的安全性和隐私性,使得数据不会丢失或是被他人修改。
    2.6.2 数据的完整性
    各种记录信息的完整性,信息记录内容不能为空
    各种数据间相互联系的正确性
    相同数据在不同记录中的一致性

    2.7 界面需求当前界面设计已经成为衡量软件是否优秀的一个关键判断标准,一个设计简洁,操作方便的界面会获得社会各界人士的芳心,会有效的提高使用者的使用率,以及软件的受众程度,并且可以简化管理员的操作,减少用户对网上订餐系统的上手难度,JSP技术是设计网上订餐系统所使用的主要技术,它可以增加网上订餐系统界面的丰富多彩程度,同时,在丰富多彩的基础上,还要注重以下几个方面,他们包括:网上订餐系统的数据的输入设计,网上订餐系统数据的输出设计。
    2.7.1 输出设计针对本系统的输出的主要内容和信息是对于普通用户在前台进行的注册信息,订单信息,留言信息,在经过网上订餐系统的处理后变成高效率的,统一格式的,管理方便的信息,以供系统管理员对这些信息进行分类和管理,输出的主要工作和任务便体现于此。
    网上订餐系统的设计过程中,为了方便系统管理员对这些信息进行查阅,编辑,后台采用了frame框架对后台进行设计,同时将表格设计的尽量简单优化,去除掉无所谓的信息栏目,使得系统的后台管理人员可以方便的管理系统后台,清晰的反应后台各个部门和组件的联系,表格的设计做到简化和精炼,使得系统后台管理人员的管理难度简小。
    2.7.2 输入设计对于本系统的输入模块的设计,输入模块的设计是十分精准的,要求十分严格的,因为一旦输入的数据有误或者出现了偏差,会导致整个数据库和整个系统的混乱,要处理输入数据产生的问题将会耗费大量的人力物力和经费。
    具体的,结合本系统进行分析和研究,输入设计的准则应该有如下几条:

    输入数据应该满足类型与数据库中所定义的数据类型相同,并且满足数据库中字段设置的长度格式要求,输入数据应当尽量考虑用户,做到精简化,同时尽量缩小减少用户的输入数据的数量,从而减少错误率,从而是输入的数据更加规范化
    输入过程和启动输入过程的准备阶段应该尽量精炼,从而减少错误的出现和用户使用的难度
    采用定时回溯检查的方法,定时对之前部分的数据的正确程度进行检查,以便及时发现错误和改正错误,减少后期发现错误的维护性改正的难度

    结合以上分析,下面给出网上订餐系统的初始化操作界面(用户端),可以清楚的看到系统的各个功能,操作简单,同时输入数据时也十分简单,减少了错误的数据输入的可能性,具体的用户操作界面如图2.7所展示:

    结合以上分析,下面给出网上订餐系统的初始化操作界面(系统管理员端),可以清楚的看到后台系统修改的各个功能,操作简单,同时输出数据在视图上也十分简单,减少了错误的数据输出的可能性,具体的用户操作界面如图2.8所展示:

    第三章 数据库设计3.1 数据库的分析与设计数据库是用来存储数据的一个大的仓库,但它又不仅是局限于对信息的存储,通过建立数据库,我们可以对数据更好的管理、存储以及查询,而且更为重要的是,我们还可以实现共享数据。数据库中的数据结构表明了具体事务之间的关系。而描述实体类型和实体之间关系的则称之为数据库模型,任何数据库系统都有其特有的数据模型,在本系统中,经过对系统数据库的功能特点以及对需求的分析,最终选择关系模型作为本系统的数据模型。
    3.1.1 数据库的概念结构设计在建立数据库的过程中,最为关键的工作就是建立其数据模型,由于客观世界里的具体事物通常都很难将其转化成计算机可以理解的信息,这就要求我们要先将客观世界中的事物转化成可以独立于计算机存在的信息结构,于是就有了概念模型 。E-R 图能够直观地表示概念模型。E-R图的几大常用元素:实体(用矩形框所描述)联系(菱形框所描述)属性(椭圆形框表示),联系有一对一(1…1),一对多(1…n),多对多(n….n)。
    概念设计:概念设计是进行系统设计的一个十分重要的阶段,概念设计主要完成的任务是在深入,详细了解系统的功能以后建立整个系统的概念模型和概念结构,然后将概念模型转换成图形的形式,比较常用的图形有ER图,类图等等,这里针对网上订餐系统进行ER图(实体-联系图)来对整个系统进行展示。
    ER图(实体-联系图)由以下几个固定图形所构成:  

    实体形-矩形表示,矩形内为实体名称
    属性-椭圆形或圆角矩形来表示,主属性的下面要相应的添加下划线
    联系-菱形表示,菱形内部为联系的内容

    概念设计最终要完成委托方所委托系统的数据库的总体概念结构,也叫概念模式。概念模式有助于委托方更加清楚的认识系统,清楚系统实体之间的联系,用ER图(实体-联系图)可以让用户更加调理化,直观化的了解系统。










    实体
    属性
    实体间关系



    这里根据上述介绍以及对网上订餐系统的深入分析,所描绘出的ER图(实体-联系图)如下所展示:
    管理员信息E-R图
    管理员的属性主要包括以下几个方面:编号ID,登录账号,登录密码。

    用户信息的E-R(实体—联系图)图
    用户信息主要的属性主要包括,用户ID,账号,密码,姓名几个属性。

    菜品信息实体E-R图
    菜品信息主要的属性包括菜品ID,编号,名称,介绍,图片,价格几个属性。

    订单信息E-R图
    订单信息主要包括订单ID(订单由系统生成的数字ID),订单编号,送货地址,付款方式,金额,用户ID,状态,订单编号等几个属性。

    购物车信息E-R图
    购物车实体主要包括购物车ID,菜品ID,订单ID,数量几个属性。

    评价信息E-R图
    评价实体主要包括评价属性,内容,用户ID,评价时间几个属性。

    系统总体ER图
    系统总体ER图主要从顾客,菜品,管理员三大实体的角度切入分析,描绘出的ER图,具体的ER图如下3.7所展示:

    3.1.2 数据库的逻辑结构设计结合本系统,对数据库进行逻辑结构的设计后可以建立各种表如下所展示:
    系统管理员的信息表主要内容是记录系统管理员注册时所填写的一系列信息 表的结构以及内容分布如表3.1所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Admin_id
    int
    10


    管理员ID


    userName
    varchar
    50


    登陆账号


    userPw
    varchar
    50


    登陆密码



    用户的信息表主要记录普通用户注册成为会员时所必须填写的一系列信息,表的结构以及内容分布如表3.2所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    user_id
    int
    10


    用户ID


    loginname
    varchar
    50


    帐号


    loginpw
    varchar
    50


    密码


    name
    varchar
    50


    姓名



    留言信息表的功能是用来保存顾客在订餐完成后对系统的留言,ID是主码(key word),表的结构以及内容分布如表3.3所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Liuyan_id
    int
    10


    留言ID,主键递增


    neirong
    varchar
    50


    信息内容


    liuyanshi
    varchar
    50


    留言时间


    user_id
    varchar
    50


    用户


    huifu
    varchar
    50


    回复信息


    huifushi
    varchar
    50


    回复时间



    菜品信息表主要记录的是系统已上架的菜品的详细信息。其中ID是主码(key word),表的结构以及内容分布如表3.4所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Caipin_id
    int
    10


    菜品ID


    Catelog_id
    int
    10


    名称


    mingcheng
    varchar
    50


    名称


    jieshao
    varchar
    50


    介绍


    fujian
    varchar
    50


    图片


    shichangjia
    int



    价格



    订单的信息表的主要部分是记录已下的订单的详细信息,其中订单ID是是主码(key word),表的结构以及内容分布如表3.5所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Dingdan_id
    int
    10


    订单ID


    bianhao
    varchar
    50


    订单编号


    shijian
    varchar
    10


    下单时间


    zhuangtai
    varchar
    10


    状态


    huifu
    varchar
    50


    排队计时


    songhuodizhi
    varchar
    50


    送货地址


    fukuanfangshi
    varchar
    50


    付款方式


    jine
    int
    50


    订单金额


    User_id
    int
    4


    用户ID



    购物车的信息表的主体内容是记录了购物车内已经购买的菜品的一系列信息 ,其中购物车ID是主码(key word),表的结构以及内容分布如表3.6所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Gouwuche_id
    int
    10


    购物车ID


    goods_id
    int
    10


    菜品ID


    goods_quantity
    int
    10


    数量



    评价信息表的主体内容是保存系统后台管理员对前台用户的评价信息,其中评价ID是主码(key word)表的结构以及内容分布如表3.7所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Pingjia_id
    int
    10


    评价ID


    shuxing
    varchar
    50


    评价属性


    neirong
    varchar
    90


    内容


    shijian
    varchar
    50


    时间


    User_id
    int
    4


    用户ID



    菜品分类表主要存储诸如凉拌菜,热炒菜等等的菜品类别的信息,其中ID是主码(key word)表的结构以及内容分布如表3.8所展示的一样。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    Catelog_id
    int
    10


    菜品类别ID


    name
    varchar
    50


    菜品类别



    3.1.3 数据库的连接原理网上订餐系统数据库连接也是开发该系统的关键环节,主要采用JDBC方式,这些知识在太原理工大学开设的JSP课程中有所学习,具体的操作步骤如下图3.8所示:

    网上订餐系统连接数据库的程序采用DAO(数据访问对象)模式来对数据库进行处理操作,具体思想如下类图3.9所展示:

    网上订餐系统在开发过程中,为了连接数据库,编写了一个DB.java文件,具体的部分代码如下所展示:
    public class DB{ private Connection con; private PreparedStatement pstm;//PreparedStatement对象pstm private String user = "root"; private String password = "8888"; private String className = "com.mysql.jdbc.Driver";//驱动程序对象...}
    3.2 中文乱码问题处理在开发过程中,我们遇到了中文乱码问题,手动在各个页面设置十分复杂麻烦,并且十分占用开销。
    在web.xml中配置代码如下所展示:
    <filter> <filter-name>SetChartEncoding</filter-name> <filter-class>com.util.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> <!--设置你想用的字符集,UTF-8--> </init-param> </filter> <filter-mapping> <filter-name>SetChartEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
    与此相对应的EncodingFilter.java文件中:
    public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding");}
    为了进一步的处理中文乱码,我们采用如下的方式来处理:
    public class EncodingFilter implements Filter { protected String encoding = null; protected FilterConfig filterConfig = null; public void destroy() { this.encoding = null; this.filterConfig = null; }//采用encodingfilter统一处理字符集public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String encoding = selectEncoding(request); if (encoding != null) { // 对请求进行编码设置 request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); }
    3.3 数据流程图数据流图主要由以下几个模块组成:

    根据以上对原有网上订餐的系统流程图的描述,我们从系统的多个方面进行了分析,希望使系统的管理更加合理,在使用中更具有可行性,由顶层开始向下对网上订餐系统逐步分层,逐步细化。下面给出系统的顶层图。
    3.3.1 系统顶层图系统顶层图,也叫顶层数据流图,是用来描绘整个系统各个用户或者系统对于该系统的输入和输出,具体的,针对本系统来说,网上订餐系统的外部系统或人员有顾客和管理员两大部分,系统顶层图反映了外部对系统的输入数据流以及系统经过一系列处理后的输出数据流,从系统顶层图上可以清晰的看出系统的数据流向,便于开发人员和用户方更加深入的了解系统,具体地如图3.11所示:

    3.3.2 系统0层图根据模块功能不同,把系统分为系统后台管理员登录模块,注册会员登录模块,菜品查询模块,管理购物车模块,管理订单模块,留言管理模块,信息管理模块几个大的模块作为系统的零层。各个模块独立,但各个模块之间又可以相互调用数据,进而完成数据的综合存储,一起实现系统的预期功能。网上订餐系统的0层图如图3.12所示:

    3.4 时序图时序图,是用来表述系统各个行为的先后顺序的一种图形,它使得初次接触网上订餐系统的用户能够清楚地了解该系统各个动作的先后顺序,协作顺序,时序图的最顶端的矩形框表示系统的各个参与者,实线表示传递的消息或者行为,虚线表示返回的消息或者行为。以下是该系统的时序协作流程:
    用户订餐时序流程:

    登录主页
    查看网上订餐系统主页的各种菜品信息,查询想要购买的菜品的信息
    选择自己想要购买的菜品,点击菜品的图片,添加菜品进入购物车
    确定菜品无误后,购买该菜品
    订单的内容发送到各个餐厅
    餐厅经理通知送餐人员进行送餐,同时向管理员反馈自己的送餐情况
    管理人员更改后台的订单里面的菜品的状态,改为送餐状态,同时通知送餐人员向顾客送餐

    下面展示的是订餐的时序图,如下图3.13所展示的一样:

    3.5 数据字典3.5.1 数据结构数据结构表达了数据与数据之间的构成组合关系,对于网上订餐系统来说,数据结构条目如下:

    数据结构名称:t_admin

    含义说明:主要定义了管理员的信息组成:管理员用户的ID,管理员用户的账号,管理员用户的密码
    数据结构名称:t_catelog

    含义说明:主要定义了菜品类别的信息组成:菜品类别的ID,菜品类别的名称,菜品类别是否删除
    数据结构名称:t_goods

    含义说明:主要定义了菜品的信息组成:菜品的ID,菜品类别的id,菜品的编号,菜品的名称,菜品的介绍,菜品的图片,菜品的价格,菜品是否删除
    数据结构名称:t_liuyan

    含义说明:主要定义了留言的相关信息组成:留言的ID,留言的内容,留言的时间,用户的ID,回复内容,回复时间
    数据结构名称:t_order

    含义说明:主要定义了订单的信息组成:订单的ID,订单的编号,订单的时间,订单的状态,订单的回复,订单的送货地址,订单的付款方式,订单的金额,用户的ID
    数据结构名称:t_orderitem

    含义说明:主要定义了购物车的信息组成:购物车的ID,菜品的ID,购物车中菜品的数量
    数据结构名称:t_user

    含义说明:主要定义了注册会员的信息组成:会员的ID,会员的账号,会员的密码,会员的名字,是否删除了会员
    数据结构名称:t_xinyong

    含义说明:主要定义了管理员对用户的信用评价信息组成:信用评价的ID,信用评价的属性,信用评价的内容,信用评价的时间,顾客的ID

    3.5.3 数据流网上订餐系统的数据流如下所示:

    t_admin=管理员用户的ID+管理员用户的账号+管理员用户的密码
    t_catelog=菜品类别的ID+菜品类别的名称+菜品类别是否删除
    t_goods=菜品的ID+菜品类别的id+菜品的编号+菜品的名称+菜品的介绍+菜品的图片,菜品的价格+菜品是否删除
    t_liuyan=留言的ID+留言的内容+留言的时间+用户的ID+回复内容+回复时间
    t_order=订单的ID+订单的编号+订单的时间+订单的状态+订单的回复+订单的送货地址+订单的付款方式+订单的金额+用户的ID
    t_orderitem=购物车的ID+菜品的ID+购物车中菜品的数量
    t_user=会员的ID+会员的账号+会员的密码+会员的名字+是否删除了会员
    t_xinyong=信用评价的ID+信用评价的属性+信用评价的内容+信用评价的时间+顾客的ID

    3.5.4 数据存储从数据存储可以看出数据的去向来源头,对于一个系统的数据流分析十分重要,以下是数据存储的具体说明。

    文件名:管理员信息表

    组成:管理员用户的ID+管理员用户的账号+管理员用户的密码组织方式:索引方式 以管理员用户的ID为主键
    文件名:菜品类别信息表

    组成:菜品类别的ID+菜品类别的名称+菜品类别是否删除组织方式:索引方式 以菜品类别的ID为主键
    文件名:菜品信息表

    组成:菜品的ID+菜品类别的ID+菜品的编号+菜品的名称+菜品的介绍+菜品的图片+菜品的价格+菜品是否删除组织方式:索引方式 以菜品的ID为主键
    文件名:留言信息表

    组成:留言的ID+留言的内容+留言的时间+用户的ID+回复内容+回复时间组织方式:索引方式 以留言的ID为主键
    文件名:订单信息表

    组成:订单的ID+订单的编号+订单的时间+订单的状态+订单的回复+订单的送货地址+订单的付款方式订单的金额+用户的ID组织方式:索引方式 以订单的ID为主键
    文件名:购物车信息表

    组成:购物车的ID+菜品的ID+购物车中菜品的数量组织方式:索引方式 以购物车的ID为主键
    文件名:注册会员信息表

    组成:会员的ID+会员的账号+会员的密码+会员的名字+是否删除了会员组织方式:索引方式 以为会员的ID主键

    第四章 系统功能的设计与实现在网上订餐系统开发的历程中,由前文对网上订餐系统进行需求分析和系统分析之后,便进入最重要的环节之一详细设计,下文将对系统的主要功能用户处理的模块,后台管理员处理模块这两大模块进行分析,具体的又可以划分成为用户的注册与登录,留言内容的管理,用户信息的管理,菜品信息的管理,用户订餐功能来对系统的详细设计进行进一步的阐述。
    在进行系统软件的设计中,要遵循一些原则和规范,这样才能规范设计流程,便于进行开发。本系统遵循着以下设计原则:

    良好的适用性:系统最终要面向用户,用户的评价决定系统的优劣。也就是说我们所设计的软件需要满足客户的需求。因此本文的设计遵循的是用户需求优先的原则
    结构稳定性:在进行开发设计之前,往往需要对系统的整体结构做一个设计,其中包括模块的设计,数据库的设计,界面的设计等等。一旦确定了体系的结构,这些设计便能流程化的进行。因此,维持一个稳定的结构才能保证后续一系列的工作的进行
    可扩展性:衡量一个系统的好坏需要评估这个系统的可扩展性。如果软件只能实现现有的功能,对其他功能的添加有封闭性,当用户提出新的需求,只能重新设计,这显然是不合理的。因为良好的可扩展性无论对客户还是开发人员而言都是有益的
    复用性:在一个系统中,有很多的模块内容是比较成熟,因此很多类似的工作就可以通过复用来实现,这样不仅提高了效率,而且可靠性也大大提高
    易维护性:系统的维护往往是最耗费精力和金钱的。因此设计出易维护的系统能够使维护人员能够快速查找出问题,能让系统具备自维护的特点是很有必要的

    4.1 用户注册与登录网上订餐系统的用户注册与登录模块,是本系统的关键模块,这一模块的具体设计十分关键,因为该模块会影响用户对本系统的体验。普通游客进行注册成为系统会员,在进行注册时,游客用户在注册时需要填写账号,密码,姓名。密码设置时不能为空,并且,账号设置时也不能为空,输入数据通过check1()来衡量是否可以录入。 具体的用户注册与登录界面如下图4.1和4.2所展示。
    用户注册页面设计

    用户登陆页面设计

    以上的登录过程的关键技术实现:在操作人员在页面输入账号密码尝试进行登录后系统会自动跳转到已经编写好的登录service中,登录service的主要功能就是对登录系统的身份进行判断,usertype==1为会员登录,usertype==0为管理员登录,判断身份后将相应的属性进行设置,还可以对管理员密码进行编辑修改等等功能。
    登录service loginservice核心部分的代码编写如下所展示:
    try { ResultSet rs=mydb.getRs(); boolean mark=(rs==null||!rs.next()?false:true); if(mark==false) { result="no"; } else { result="yes"; TAdmin admin=new TAdmin(); admin.setUserId(rs.getInt("userId")); admin.setUserName(rs.getString("userName")); admin.setUserPw(rs.getString("userPw")); WebContext ctx = WebContextFactory.get(); //得到WebContext对象ctx HttpSession session=ctx.getSession(); session.setAttribute("userType", 0); session.setAttribute("admin", admin); } rs.close();}
    4.2 管理员首页系统后台管理员页面也是该系统的关键部分,系统后台管理员的操作界面的界面设计如下图所展示,左边分栏为系统后台管理员可以完成的各种修改操作模块,右边为具体的操作界面, 系统后台管理员的登录页面具体的如下图4.3所展示。

    在各个页面设计的同时为了防止未注册成为会员的游客进行误操作,设计了普通游客非注册会员点击其他模块都会进行弹窗,请先登录的提示,具体的模块设计代码如下所展示的一样:
    <c:if test="${sessionScope.userType !=1}"> alert("请先登录");</c:if>
    4.3 管理员功能模块4.3.1 留言模块管理具体的留言模块的设计,网上订餐系统后台管理员可以查看前台注册会员的留言,可以对留言进行删除和回复操作,具体的实现过程是在liuService.java先查询数据库获取各种信息,将结果放在结果集rs当中,然后发送到相应的admin的liuyanMana.jsp页面,向网上订餐系统后台管理员展示留言信息,管理员可以进行删除和回复操作。具体的界面如下图4.4所展示。

    4.3.2 用户信息管理网上订餐系统用户的信息向管理员展示的原理与上述留言向管理员展示的原理相同,这里便不再详细表述。向网上订餐系统后台管理员展示已经注册的会员的信息。系统设计过程中还设计了一个删除操作,可以把已注册会员的信息删除,具体的界面如下图4.5所展示

    4.3.3 菜品信息管理4.3.3.1 菜品信息录入网上订餐系统的菜品信息录入模块主要功能是系统后台管理员用来输入新菜品的信息,信息的内容包含菜品名称,菜品的介绍,菜品的价格等等。如果某一项信息缺失,系统会提示缺少的信息,通过check()函数来检查信息输入是否完整,具体的界面如图4.6所展示:

    具体的,网上订餐系统的程序流程图如下图4.7所展示:

    4.3.3.2 菜品信息管理菜品信息输出的实现方式与留言输出的实现方式相同,这里便不再详细表达,主界面会显示菜品的遍号,菜品的名称,菜品的介绍,菜品的图片,菜品的价格,删除菜品的操作按钮,具体的主页面如下图4.8所展示。

    4.3.4 订单信息管理网上订餐系统的订单信息的管理模块的具体实现过程也留言输出的过程相同,这里便不再详细表达,具体的订单信息呈现给系统管理员有订单的编号,订单的下单时间,订单的状态,订单的排队计时,订单的送货地址,订单的付款方式,订单的总金额,订单的具体明细,下该订单的注册会员的用户信息,可以删除该订单的操作,具体的界面如下图4.9所展示。

    4.4 用户订餐功能用户订餐功能简而言之就是注册会员进入网上订餐系统的首页进行下单的过程,进入主页面后,可以映入眼帘地看到系统的主要功能,菜品的信息展示,进行会员的注册,查看已下单产品的购物车,查看我的订单,对网上订餐系统的后台管理员进行留言及查看回复。总价格的计算通过get totalprice()函数来实现,具体的主页面及操作过程如下图4.10,4.11 ,4.12所展示。
    菜品信息页面

    菜品详细信息页面

    购物车页面

    结合以上对点餐过程的分析,以下是点餐过程流程图,如图4.13所示:

    第五章 系统测试5.1 系统测试目的与意义只有通过了系统的测试才能上线项目的系统运行,如果系统前期的缺陷没有被检测出来,那么后期的修补和维护将是一项巨大的工程。为了使得此类现象得到避免,在测试系统时要明确现在阶段已经出现的问题,需要做到较为测试用例的完善性使得其范围覆盖到各个方面,要测试可能存在突发状况的系统,检测在不可抗因素的影响之下数据在系统里的安全性大小。只有在上线运行系统以前做好各项检测才可以实现今后维护投入的最小化。由此可见,进行系统检测并不是去观测系统的完善程度,而是去对系统存在的弊端进行明确,对实际存在的问题进行发现。在系统里难免会存在问题和缺失,可是实际运用于企业里的系统要求的系统性能和功能都是极高的,所以,就需要在最初开始设计系统之时进行各项检测的排查。测试系统的工作人员需要在设计系统检测用例时极为细心。
    5.1.1 网上订餐系统的测试目标网上订餐系统系统最终应完成的测试目标:本文应着重于系统的功能测试,测试的对象分成管理员和注册会员两大部分,在实现了预定的系统功能及满足用户需求的前提条件下,尽可能地发现并完善系统中的漏洞与隐患,确保软件的实用性、安全性、可靠性、可扩展性以及经济性,为今后的网上订餐系统提供有力保障。
    5.2 测试过程5.2.1 主页面及系统后台的测试系统登录模块测试:

    打开系统首页,输入错误的登录信息
    登录
    输入正确的登录信息
    登录
    测试结果

    修改密码模块测试:

    打开修改密码界面,输入错误的密码
    点击修改密码
    输入正确的修改密码
    点击修改密码
    测试结果

    菜品查询模块测试:

    打开菜品查询界面,输入不存在的菜品
    点击菜品查询
    输入正确的菜品
    点击菜品查询
    测试结果

    5.2.2 测试模块及案例注:此处有效等价类为正确输入账号密码,正确登录系统,无效等价类为未能按照正确标准输入账号密码
    数据库管理员(Admin表)中的信息为:

    管理员登录后台系统的测试



    输入数据
    有效等价类
    无效等价类




    账号
    (1)正确账号
    (3)账号为空 (4)账号错误


    密码
    (2)正确密码
    (5)密码错误 (6)密码为空



    管理员登录后台系统的测试用例



    用例编号
    依次输入
    期望结果
    覆盖
    实际结果




    1
    a,a
    通过验证,提示登录成功
    1、2
    登录成功


    2
    m1,null
    不通过验证
    4、6
    登录失败


    3
    m1,m1
    不通过验证
    4、5
    登录失败


    4
    null,m1
    不通过验证
    3、5
    登录失败


    5
    null,null
    不通过验证
    3、6
    登录失败



    5.2.3 系统性能测试功能测试是为了某种的最基本需求,性能测试的目的是保证系统正常运转的关键一环。测试的具体内容如下表5.1所示:



    测试内容
    测试要求
    测试结论




    对用户界面的控件以及数据接口的正确性进行测试
    能不能使客户满意
    通过


    测试设计的界面是不是受到人们的喜爱
    突出信息,设计新颖、风格一致
    通过


    测试系统操作是否简单
    使客户使用起来比较方便
    通过


    对网络的安全性进行测试
    在这个系统中安全软件能不能正常运转,这个系统能不能对不良信息进行过滤,防止不好的软件窃取它的信息。
    通过


    测试数据安全性
    系统的数据要做到加密,外来的用户不能够进入这个系统获取这些数据。
    通过


    性能测试压力测试
    能够协助人们进行办公。
    通过


    并发测试
    当系统增加用户的时候,系统会产生什么样的反应,会不会出现卡顿的情况。
    通过


    稳定性测试测试系统的稳定性
    长时间处在运行的状态下,系统能不能保证一直处在一种比较好的运行状态。
    通过


    测试系统的可靠性
    当进入这个系统的人过多时,这个系统能不能正常运行。
    通过


    兼容性测试测试
    这个系统能不能在不同的环境、操作系统以及浏览器上能不能正常工作。
    通过


    功能性测试
    系统上的功能能不能满足酒店需要的所有的功能。
    通过



    5.2.4 缺陷分析经过测试,该程序中没有严重影响系统运行的错误,没有功能缺陷,也没有不影响运行但必须修改的错误。
    测试模块都具有较好的交互性,出现错误可以提示用户哪里出错,使用户可以及时修改。
    5.3 测试结果测试完成后,分析之前我们所进行的一系列的分析,可以得出下列的结论:网上订餐系统可以完全满足用户方和开发方的需要,满足需求规格说明书,满足需要的功能,十分易于管理,后台管理人员可以很容易掌握,再加上系统具有很高的安全性、可靠性和扩展性,完全能够达到订餐系统所要求的各项指标,从而更加有效的提高了网上订餐系统的水平。
    总结与展望本文的主要书写方面包括以下几个方面:

    针对本文将要建设的系统,进行详细的背景和开发技术以及针对网上订餐系统的分析归纳,并介绍系统开发时将采纳的主要技术和技术难点
    利用软件工程思想,对系统进行需求分析,包括功能性需求和非功能性需求;针对功能需求描绘出了系统的总体功能分析;然后针对上述内容,设计出系统的用例图ER图,程序流程图等;最后各个功能模块进行UML建模设计,描绘系统设计过程
    本系统采用B/S架构构建本系统
    在系统设计完成以后,对系统的性能进行相应的测试,测试过程中即使用了白盒测试法,也使用了黑盒测试法,同时包括兼容性测试,通过多种测试相结合的方式来确保系统的健壮性和信息安全性

    经过五个月的对该系统的开发,在开发学习研究过程中,我学到了很多很多,在同学的帮助,老师的指导下使我受益匪浅。具体的收货,我认为在开发网上订餐系统的过程中,我温习了很多以前在太原理工大学学习的的jsp知识,java知识,数据库知识,可以说,太原理工大学开设的很多课程都十分的实用。在开发研究过程当中,我学会了一项十分重要的品质,那就是耐心。只有耐心的研究每一个代码,耐心的查询资料,才是做学问的真谛,没有一件事是可以一蹴而就的。在开发的过程当中,每当遇到不会的问题,慢慢的开始学会了独立思考,而不是像以前一样轻易的求助同学,我想这也是毕业设计教会我们的另一项良好的品格,养成良好的独立思考的习惯,同时独立思考也是研究学术的一项必备的品质。
    在开发研究学习过程中,我遇到了许多自身解决不了的问题,互联网帮助了我很多,如今百度上面有很多关于jsp的资料,我结合资料和自身的实践经验,并且通过身边已经开发出来的网上订餐系统,例如美团外卖,饿了么等软件,分析各个软件的优劣,结合自身知识的条件基础,开发出了该系统。
    开发网上订餐系统的过程中让我再次复习了B/S的结构模式,复习了连接数据库的代码,同时我学会了Debug的方法,学会了处理bug的常用方法以及报错信息的阅读分析能力,同时我学会了做项目时一定要备份,以免数据的丢失。
    此外,在将来信息技术不断发展的前提下,智能化是其软件和网络设备所必须的发展方向,因而移动智能是系统软件未来的发展方向。在未来的学习和工作里需要加深这方面的研究,使其分析更加细致。
    限于本人自身知识的局限性以及准备时间不够充分,因此还有一部分后续工作尚未完成,主要是含有以下几个环节:开发系统的过程里有部分模块还不完善,还需要对系统程序和界面进行更深层次的优化和美化。随着使用次数的增多,产生的历史数据也越来越多。对这些大量数据的处理能力也将渐渐对系统性能提出新的挑战。
    通过本次毕业设计提高了我的动手操作能力,系统分析问题的能力,论文书写能力,独立思考能力,英语能力等等。可以说,这次毕业设计对我今后的学习工作都有巨大深远的影响,希望我以后以一种科学严谨的态度来分析问题,处理问题时要像开发网上订餐系统一样有条理,总之,这次毕业设计的过程使我收货颇多,受益匪浅。
    参考文献[1] 熊杰. 宾馆住宿管理系统的设计[J]. 中国科技博览, 2015(29):77-77.
    [2] 孟小峰, 周龙骧, 王珊. 数据库技术发展趋势[J]. 软件学报, 2004, 15(12):1822-1836.
    [3] 吕浩音. JSP技术介绍[J]. 陇东学院学报:自然科学版, 2007(2):29-31.
    [4] 张良银. 浅论C/S和B/S体系结构[J]. 工程地质计算机应用, 2006(4):20-23.
    [5] 沈珏. MVC设计模式[J]. 科技广场, 2009, 2009(9):249-250.
    [6] 李福弟. 可行性研究内容介绍[J]. 西南金融, 1984(12):28.
    [7] 田敏, 金星. 技术档案数据库管理系统设计原则及方法初探[J]. 计算机与现代化, 2007(4):69-71.
    [8] 徐敬. J2EE架构下基于Web的信息管理系统框架研究[J]. 硅谷, 2015(1):84-85.
    [9] 王华. 探析Java数据库连接池运行原理[J]. 福建电脑, 2010, 26(8):92-93.
    [10] 陆璐, 王文莉. 浅谈软件测试技术[J]. 郑州铁路职业技术学院学报, 2007, 19(2):41-42.
    [11] 王萍. 软件测试的重要性[J]. 软件导刊, 2009(4):20-21.
    [12] Jacob K. Hotel inventory management system and method: US, US20070075136[P]. 2007.
    [13] Xia C. The realization of MyEclipse and database connection[J]. Journal of Wuhan Engineering Institute, 2013.
    [14] Gray J. Notes on Data Base Operating Systems[C]// Operating Systems, An Advanced Course. Springer-Verlag, 1978:393-481.
    [15] Xia X X, Xin B Y. Compare B/S mode with C/S mode[J]. Journal of Yanbian University, 2002.
    [16] Roth R R. SOFTWARE TESTING: US, US 20080010539 A1[P]. 2008.
    2 评论 8 下载 2020-08-03 18:59:48 下载需要14点积分
显示 0 到 15 ,共 15 条
eject