分类

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

资源列表

  • 基于c#和xml存储数据的员工管理系统

    一、项目介绍本系统是人事管理系统,它主要实现管理员如何对普通用户进行授权,如何插入、删除一个员工的信息,用户如何浏览员工的所有信息,以及用户如何查询自己想要的结果,也即是通过输入查询条件,显示符合条件的员工记录以及如何显示这个员工的全部信息。如何对查询或统计出来的符合条件的记录用报表的形式打印出来,窗口打开时的排放顺序,也即是平铺还是重叠。查看,包括基本信息、学历信息、考勤信息和工资信息的浏览,还有通过输入查询条件查询用户所要的记录,还可以双击某个员工所在列,就可以显示出这个员工的所有信息。维护,包括基本信息、学历信息、考勤信息和工资信息的修改。
    二、开发环境
    操作系统:Windows
    开发工具:vs2015
    数据库:xml数据库

    三、系统流程图
    四、项目展示登陆页面:初始帐户为admin,123456;用户注册需验证注册码,注册码为888888。

    注册页面

    主页面

    显示员工数据

    查询员工数据

    添加员工数据

    修改员工数据

    删除员工数据


    五、代码截图登录页面

    注册页面

    查询数据

    添加数据

    删除数据

    修改员工数据

    六、心得体会这次的.net的软件开发让我初步对于ASP.NET有了一些了解,关于如何运用各种控件来进行自己界面的设计和基本功能的实现,如何连接到文件数据库进行事件的动态变化等等有了很多的提高和了解,初步实现了软件的开发,提高了自己的动手能力。
    0 评论 2 下载 2020-07-16 12:47:18 下载需要11点积分
  • 基于SSH的医院在线挂号系统设计与实现

    摘 要互联网技术迅速的发展给我们的生活带来很大的方便,同时也让许多行业迅速的发展起来。互联网技术已走向科技发展的巅峰期,我们要做的就是合理的使用互联网技术让我们的各个行业得到更快速的发展。
    就医疗领域来说,如今看病难已成为我们生活中的一大难题,传统的医院挂号中,我们需要用手动方式来处理信息,这种方式需要我们的医护工作人员和管理人员花费大量的时间来处理事务性信息,不仅劳动强度大,而且浪费时间。患者长时间的排队等候不仅延误了患者病情,而且不利于医院秩序的维护。所以在这里我的论文对医院挂号系统的设计和实现进行了详细的描述与设计,专为解决挂号难,排队时间长的问题,通过此网站患者可以快速方便的找到自己所需挂号的科室信息,并进行在线预约挂号。对于此网站,采用的是较为成熟的SSH框架,主要包括了业务逻辑层、数据持久层,表示层,模块层四个层次,这些层次可以帮助开发人员对搭建结构,维护系统,框架重用等,也可以给开发人员提供一个清晰、易懂,简洁明了的设计思路,SSH框架可复用性好、维护方便,使系统更加好用,同时让系统的实施和维护更加方便。对于数据库设计我们采用了MySql数据库,由MySQL的发展已经很健壮、成熟,而且具有很好的安全性,操作简单,成为了开发数据库设计的首选。
    医院挂号系统主要角色有:患者和系统管理员;患者可以对医院信息的查询、对医生信息查询、登录注册、预约挂号、取消挂号、更改个人信息等;管理员可以登录系统,更新数据库内医院信息、医生信息、医院公告,也可对个人信息进行修改。网页设计了相关的导航,对新用户进行全面的引导,使得用户使用更加方便,对用户注册登录和管理员登录进行了分离,防止用户和管理员登录冲突,总体测试结果显示,网站设计基本符合用户需求,能够达到用户满意度。
    关键字: SSH ;JSP ;MYSQL ;MyEclipse ;预约挂号
    AbstractThe Internet technology development rapidly, make our life more and more conveniently, simultaneously also lets many profession development rapidly. The Internet technology becomes the social development front technology already, we had to do something to make it reasonable to use the Internet technology let our each profession obtain a faster development.
    On the field of medic, it is very difficult to go to see a doctor, this is a social problem, In the traditional hospital ,we need to use the manual way to deal with a large of information, we have to make a appointment by line up , This way need our medical staff and managers spend a lot of time to deal with transactional information, not only the intensity of labor is big, but also a waste of time. Long queues of patients not only delay the patient’s illness but also harm the maintenance of hospital order. So here my thesis on the hospital registration system design and implementation of the detailed description and design, designed to solve the registered, queuing time, patients through this website can be quickly and easily find their registration department of the information needed, and to make an appointment online. For this site, the more mature SSH framework is adopted, which makes it easier to implement and maintain the system.
    The main role of hospital registration system is: Patient and system administrator. The patient may inquire about the information of the hospital, inquire into the doctor’s information, sign up for registration, make an appointment, cancel the registration number, change the personal information, etc. The administrator can log in to the system, update the information about the hospital in the database, the doctor’s information, the hospital announcement, or modify the personal information. Web design related navigation, a comprehensive guide to new users, allows users to use more convenient, to the user registration, registration, the administrator login and separation, prevent users and administrators login conflict, the overall test results show that the website design basic meet user requirements, to achieve customer satisfaction.
    Key words: SSH; JSP; MYSQL; MyEclipse; appointment register
    绪 论在信息化的时代,我们生活的节奏变得非常快,做每一件事几乎都是匆忙的完成。因此人们对生活节奏要求越来越高,人们不再允许自己的时间大量的浪费在无用的事情上;计算机在我们生活中几乎已经普及,优惠的价格但是功能却很强大,我们的生活越来越离不开互联网,同时互联网技术也在不断地渗入到各个邻域,如医疗,教育,管理等方面,它的广泛使用给我们的生活带来了极大的方便。但是,就医疗界来讲,在目前调查看来,我们很多医院都采用的是人工挂号的方式,导致我们需要花费很长的时间排队等候去挂号,医院的医生、护士等工作人员也需要很多时间去人工处理患者的信息,这样下去,不仅会耽误患者的病情,而且造成医院拥挤秩序混乱,人力物力成本高等一系列的问题;所以我们需要合理的将互联网技术引用到医院,让它来方便我们的生活,方便患者挂号的同时,可以解决医院资源分配的问题,不仅可以便民而且让医院有了一个更好的效益,人们不用在担心自己的时间浪费,医院不用担心人力资源不够等一系列问题。患者只需在家轻轻动动手指访问网站即可实现在线挂号,这样双赢的结果是我们每个人所期待的,所以挂号系统的实施,对人类来说是一个很大的进步。
    挂号是我们看病就医的第一步,通过收集病人信息,协调专家管理,控制病人和医师人员的流量。通过网站的方式来挂号是很新型的一种挂号方式。在这种网站上,病人可以不出门直接在家对自己的病情初步判断,查询医院医生的信息来进行预约,进行注册登录挂号,减去了人们排队等候时间的同时也提高了医院的管理效率从而提高了医院的经济效益。是建设卫生信息化的必由之路。
    目前看来,医院门诊质量和效率不高的原因主要有一下几个:集中式挂号,来医院排队挂号的人数很明显地由不确定的特点,从而出现了明显的看病高峰和低谷。高峰期病人挂号要排很长的队伍,甚至有一些专家,帮助自己的熟人插队,造成医院现场混乱患者情绪不稳定,专家问诊不仔细、没有耐心,不想长时间和病人交流等现象。在低谷期,专家没有事情做、溜号等,造成医院资浪费。这些现象严重的损害到患者的权益,也影响到了医院的声誉。文献[9]介绍了这种问题需要一个很好的挂号平台来解决,它可以减少病人浪费的时间,同时,也可以帮助病人全面的了解医生信息,选择自己期望的医生来为自己看病。不但解决了病人对医生相关信息了解不多盲目性问题。同时医院采用网上挂号的方式,患者可以在家就可以问诊挂号,方便了患者的同时也方便了医院的管理。本论文就如何实现在线医院挂号系统的设计细节以及实现方式技术和系统的测试结果进行了全面详细的论述。
    针对国内外文献的研究发现,在网上实现预约挂号系统已经不再是一个梦想,我们运用所学的语言,便可以完成挂号网站的实现,大部分文献中指出:医院网上挂号系统以Java为开发语言,框架部分主要使用了Spring,hibernate,Struts2框架开发。Spring通过使用IOC容器的方式,来对整个项目的复杂依赖进行管理,Hibernate是一种应用很广泛的ORM框架,使得开发人员可以将数据库中的数据映射到一个具体的Java对象中,简化数据库相关的开发工作。Struts属于实现MVC开发模式的一个框架,要让Model层,View层,Controller层三个层次分别列出来使用的是Structs,分层的代码更易维护和迭代。MySQL是对数据进行存储的数据库。在接下来的论文中我们会具体介绍医院挂号系统中所使用到的一些关键技术,以及实现方法和设计思路。
    1 系统描述与技术介绍1.1 MyEclipse介绍构建网上预约挂号系统使用的是MyEclipse编辑器,MyEclipse 是开发人员特别偏爱的一种开发工具, Eclipse 中的J2EE是一种插件集合;MyEclips开发工具有很强大的力量,它对JavaServlet,AJAX,JSP,Struts,JSF,Spring、Hibernate等的支持使得开发变得非常容易,同时还具备了EJB3的功能,JDBC数据库连接的功能。所以说MyEclipse是所有开源工具开发的好帮手,更重要的是Myeclipse还具备了完整的编码、测试、发布功能,那够很全面去支持html Javascript,JSP,CSS, MySQL, Hibernate等语言的开发,所以发展成为了最受欢迎的开发工具。
    1.2 MySql数据库介绍MySQL数据库作为一种开源的关系型数据库,在目前是使用最广泛,最受欢迎的一种数据库,MySQL是由MySQL AB公司进行开发的但是后来最后被Sun公司收购了,目前已经成为了IBM的一个项目。
    MySQL的发展已经很健壮、成熟,SQL数据库。通过维护一个线程池,MySQL可以提供高并发、稳定可靠的数据存储和查询服务。在世界范围内,各大互联网公司有着非常广泛的使用。
    MySQL在开发人员眼中就像是一种数据库管理系统的角色。MySQL数据库可以对所有的东西结构化,我们可以认为它是一种数据的结构化的集合。可以访问,也可以更新数据到数据库,或对访问,对于已经修改过的数据还可以再次修改保存等,MySQL服务器可以用来对即将要使用的数据进行全面的处理。计算机对于我们来说本来就是用来处理数据的对象,所以数据库管理系统MySQL数据库的实现是计算机不可或缺的组成部分。
    我们也可以把MySQL数据库看成一种很方便的服务器。对MySQL数据库的设计需要开发人员和客户进行沟通确认才能进行合理的设计;通过MySQL数据库与其他数据库的对比就会发现。MySQL服务器的开发背景比较强大,具有更快的解决方案速度,使用更加方便高效,以及他的广泛使用得到了人们的一致好评。MySQL数据库也在很快的照着人们使用更简洁的方向去发展,这使得MySQL具有了更好的的安全性,不断地完善是其受欢迎的根本原因,这样,人们可以更加方便,快速,安全的对Internet上的数据进行访问,处理等。MySQL是开源的,意味着所有人都可以使用和修改该软件。针对自己的应用场景,可以在其基础上进行修改,提升服务的稳定性和可扩展性。
    1.3 JavaScript介绍JavaScript也是开发人员很喜欢的脚本语言,它是通过解释执行的动态的语言是面向对象的语言。被Chrome浏览器、IE、FireFox等很多浏览器支持。JavaScript使用的是面向对象的编程方式,也基于原型,还可以用命令式编程的方式,特点之一就是可以使用函数的方来编程。函数功能很强大,为文本的控制提供了约束,正则表达式等,但是JavaScript有一个缺点是不支持I/O,但是我们可以通过宿主环境的方式来解决这一问题。
    很多人会觉得Java语言和JavaScript语言有很多共同之处,其实从本质上来看这两个语言是有很大的区别的,首先JavaScript的语言设计主要受Self(基于原型的编程语言)和Scheme(函数式编程语言)两种语言的影响。在语法结构上其实是受C语言的影响较多,所以在语法上跟C语言很像,这些都是由于历史发展因素而产生的,所以相似的语言其实也存在很多本质上的差异。JavaScript语言常用来编写脚本,而且JavaScript语言在现在很瘦大家的喜爱,比如:游戏开发,桌面APP的设计等,总之,JavaScript的使用使得整个开发过程变得更加方便快捷。
    既然JavaScript可以认为是一种解释性语言所以我们必须考虑它的放置地方,通常来说JavaScript可以放在网页的任何地方,如果将其放在body的代码中会在网页加载的时候就开始执行,如果你不需要在加载的时候就运行他,可以将其放置在head中,这时就会在函数调用时才执行。总之,javaScript语言使用很简便,而且很安全,主要它还是一种动态执行的代码块,只是用来显示网页的效果,进行实时交互的语言,是开发者很好的选择。
    1.4 JSP技术介绍JSP也是一种Java语言,它是java语言中的一种的特殊语言,Jsp是通过加入引擎的方式来实现页面的动态交互,这样,可以让客户不用去接触复杂的Servlet,还没有开始执行就需要加入代码的难题。JSP的使用让基于Web的服务客户端更加灵活,如引入文件,网页跳转,这些工作都是由引入的java Servlet 自动生成的,而且这些应用程序能和Web服务器、应用服务器、浏览器和开发工具共同工作。 从而使我们第一次运行JSP时cpu运行可以达到很高的状态。
    Jsp时一种跨平台的语言,可以在不同的系统环境下运行,Windows、linux、Mac下都可以。同时这种跨平台的特性使得他实现了一次编写多次使用的特点;通过向传统网页HTML文件中加入Scriptlet和tag标记,就建成了JSP网页文件。一般情况下使用Html来设计网页的静态部分,而使用Jsp来实现网页的动态部分,从而就实现了业务代码的分离,我们可以通过Servlet,来处理业务代码,或者可以交给JavaBean来处理业务代码,这样,Jsp就用来实现显示数据部分就可以了,这样的化如果我们需要修改业务层的代码就不会对Jsp显示层的代码有影响了。每次服务器只要接受到JSP网页发送的请求消息时,它会去执行一些代码块,用可视化的方式在传给用户,通常是Html的形式。javaBean时Jsp常用的组件,用来分装业务代码,或者作为存储模型。
    JSP的使用为动态Web页面的开发带来了很大的方便,主要有一下几点的总结:

    将业务代码和数据显示层分离
    强调可重用的组件
    采用标识简化页面开发
    技术分析:常见的动态网页开发技术还有ASP。形式上和Jsp及其相似,但是ASP仅仅用于NT、IIS;而且ASP功能是由限制的;需要用COM来扩展,所以实现很难,所以经过分析会发现,二者在根本上有很大的差异,包括安全性,组件的使用等

    JSP的安全性更高,速度更快JSP的组件方式更方便JSP的跨平台特性使得平台更广

    通过向Jsp中插入的Java程序可以插入,删除,更新数据库的内容、URL新定向等,从而让网页变得动态灵活。JSP在服务器端运行,客户端只需要有浏览器就可以访问。JSP也具备Servlet的一些功能,通常要开发比较大型的Web应用程序,就需要两者相互配才能成功的完成。
    Jsp的特点主要总结为一下几点:

    一次编写,到处运行。使用了JavaBean组件,使得开发代码与试图显示代码分离开来,所以使得开发代码修改更加方便
    系统的多平台支持。Jsp可以不用修改便运行在各种平台中,可以随意的扩展,同时不同的操作系统的数据库也可以对JSP有所帮助。通过JDBC数据库连接来操作数据库,所以就提高了代码的可移植性
    强大的可伸缩性。Java具有很强的生命力,Jar文件存在就可以执行JSP代码块,多台服务器的继承来进行事务处理、消息处理
    多样化
    支持JavaBean等组件复用性。Web应用程序要成功的执行,就需要功能很强的服务器端组件,web 页面需要程序开发者用其他的工具来设计实现一些很繁琐的功能的组件来使用,目的是为了加强system性能。而JSP正好可以使用这些组件

    JSP内部对象主要有以下九个:request 客户端发出请求消息,请求主要是用GET/POST方法来传递的; response,主要是指服务器端对客户端的响应以及处理结果;session 用户的会话; pageContext 网页属性的管理;application servlet正在运行的内容都存储在这里;out 输出流; config 是为代码的配置对象;page JSP; exception 对网页的异常进行捕获。
    1.5 MVC模式介绍MVC是一种设计模式。它使得application program的输出,处理和输入强制分开。使用MVC application program 被划分成三个核心部分:控制器和视图还有模型。它们各自都有处理自己的任务。
    为了应对system对安全性、先进性。可扩展性、跨平台型、分布式、可以执性等方面等方面的需求,system的总体构架设计采用了比较先进的B/S的三层体系结构。
    三层体系结构由浏览器、web服务器和数据库组成,并结合HTML语言、jsp、JavaScript脚本语言、Ajax、ODBC等技术,后台的数据库采用微软的MySQL 2005,MVC的特点主要有:
    1、低耦合性业务层和低视图层相分离,这样就可以允许修改视图层code,而不用再一次变异控制器和模型code。所以,MVC层模型变化了,就可以实现应用的业务规则和业务流程的变化。由于视图,控制器,模型三者是分离的状态,所以application program得date层和业务规则很容易被更改。
    2、重用性高随着技术一直以来的进步和发展,application program需要用更加多样的方式来访问。MVC模式下不同的界面可以使用同一个构件,由于MVC模式下对同一个构件的访问往往使用的是多种多样的界面来实现的,多样的视图可以共享一个模型,这些构件涵盖所有的web浏览器和远程浏览器无线端。例如,顾客可以使用手机或者个人PC来选购某些产品,即便是他们使用的不同的浏览器不同的平台,但本质上他们购买的方式是一样的;因为MVC模型对用户所返回的代码没有改变所以本质上是一样的。
    3、部署块mvc模式之所以会使得开发的时间得到降低,是因为它将程序员的精力转移到视图层,开发人员无需花费很大的时间去研究组件功能等。
    4、增强维护性不同的层次有不同的功能但是也会有些功能具有相似之处,很有利于更具化管理模式。我们可以用控制器连接不一样的视图和模型等,在完成用户的需求,application program提供的一些手段就此就可以得到很好的使用。同时,控制器为我们提供了一些可以重复使用的模型等并对其进行不同的处理,最后展示给客户。
    缺点
    要完全的理解MVC需要有名明确的定义要想真正的理解MVC模式就要投入很长的时间去细心研究它复杂的内部结构。调试程序相对较为困难,由于控制层和试图层时分离的,所以阅读较为困难。进而对控件的修改就变得不时很简单
    对于小、中规模的application program 并不合适使用。因为将会浪费过多的时间将MVC应用到小、中规模的情况,效果不好
    增添System结构与实现的复杂度,设计较为简单的用户界面,如果也是严格遵循MVC模式,让其视图、模型和控制器分开三个层次,无形中加大了简单程序设计的复杂度,甚至会使得用户操作困难和运行困难等问题
    控制器与视图之间太过紧密;对于一些要求视图和控制器联系不要过于紧密的程序设计我们会发现,视图要是和控制器分开单独存在,会变得很局限。反过来也是这样,所以遇到需求不同的时候就会影响程序开发


    视图不能高效的访问数据,由于模型操作接口之间会存在一些差异;视图要想显示用户所需的数据可能需要多次调用接口。如果在没有更新的情况下;用户会做很多次的无用访问,从而使得用户体验下降
    通常常用的UI工具,或者构造器不能够支持模式的改造此类工具,用来适应MVC所需求和构筑离散的部件的成本是非常不低的,以至于影响MVC在应用上的难易度

    1.6 SSH框架介绍SSH框架是一种被大众所喜爱的开源性框架。主要包括了业务逻辑层、数据持久层,表示层,模块层四个层次,这些层次可以帮助开发人员对搭建结构,维护系统,框架重用等,也可以给开发人员提供一个清晰、易懂,简洁明了的设计思路。价值SSH框架可复用性好、维护方便使之更加好用。
    SSH框架中Struts作为整体框架的基础实现MVC分离的任务,在它对应的部分,常常用来实现业务跳转功能;Hibernate框架负责数据持久化;管理数据Spring,同时也对struts和hibernate管理,使得系统变得有条不紊,文献[1]了具体的实现过程是:Spring根据需求提出一些模型,然后实现Java对象,再去编写Data Access Objects接口最后给DAO实现在作出请求;最后把这些都统一交给Spring管理。
    我们对各个框架做一个详细的解释:
    Spring框架Spring Framework 是用Apache许可的形式来发布的,是一个开源的Java/Java EE应用程序框架,同时是一种全功能的栈;也有一切其他平台的移植版本;Spring Framework使开发变得简单容易了很多,这种简单的开发方式就会让那些产生可能使底层代码复杂混乱的代码不会出现。避免了大量的复杂类和文件的产生。本系统主要使用了Spring的IOC容器进行对象依赖的管理,同时使用了Spring提供的AOP功能来进行登陆权限判断、异常处理等。
    Hibernate框架Hibernate的设计是数据持久化的保证,着一层为我们提供了基于Java语言的对象关系,和一些映射解决的方案;万望要实现面向对象领域的模型到传统关系型数据库映射模型的手就需要用到这个层次,开发人员可以通过使用Hibernate,对我们来说设计草案,遗留数据库构建都变得非常简单快捷。
    Hibernate让开发人员从手动处理数据映射的方式种解放了出来;文献[2]介绍了它可以将数据Java类映射到到数据库表;可以实现从Java数据类型到SQL数据类型的映射,最重要的是它具有面向对象的数据查询检索机制,开发人员不需要手动的去连接数据库,这样就缩短了开发的周期。
    Struts框架同时MVC设计模式产生的一种成果性项目;Struts框架通过Jsp和Java Servlet 技术实现了MVC模式设计,是一种开源项目。并且在2004年成为ASF的顶级项目;同时还实现了基于Java EE Web应用的应用框架。MVC模式的具体实现,离不开Struts的使用;MVC主要有Model层(模型)、View(视图)、Controller(控制管理)三个层次结构,这样业务代码,三视图代码,控制代码分开来实现,变得简介明了,给开发人员和用户都带来了好的体验。
    2 需求分析与设计2.1 可行性分析在技术上医院挂号系统使用的java语言,java语言简单易学。开发平台用的是myeclipse和mysql数据库。数据库作为系统设计的核心技术也是很容易学习操作,在大学期间主修的是软件工程专业所以本系统开发实现在技术上是可行的。
    经济上本系统无需安装任何软件,只要在可以访问Internet的环境下,在客户浏览器端输入网址即可访问,所以经济上是可行的。
    法律上本系统使用的都是开源的代码,且不存在侵权等问题所以法律上是可行的。
    2.2 需求分析2.2.1 概述需求分析是指通过开发者和用户的沟通来成系统应该做什么,并且评估出软件的资金使用和可能存在的风险,是整个系统实现的关键一步。
    就本系统而言,文献[3]医院挂号系统有很大的用户需求,由于目前来看有很大一部分医院任然使用的是人工挂号的方式来排队挂号,给医院的就诊以及病人就医带来很大的困扰,由于需要人工处理以及长时间的排队,人员流通性和不确定性从而引发了就医的高峰和低谷,在高峰期人多导致医生脾气暴躁,就医时间短,不仔细等问题,甚至存在一些医生走关系的不良现象;而低谷时期排队的人少,导致专家无所事事,医院资源浪费等;通过医院挂号系统,我们可以很快地解决这些问题,可以减轻医护人员对信息管理的负担,同时减少了患者不必要的等待,以及时间的浪费,同时有利于医院治安管理提高医院的管理,提高医院的效益。
    医院挂号系统是指患者可以通过访问网站的方式来预约看病的系统。其意义在于方便患者就医,提高医院医生资源的利用率,提高医疗服务水平等;他的使用将会给医疗界带来新的革命。对所有医院施行预约挂号系统服务后不仅患者进行就医咨询变得很是方便,而且对意愿来讲,能够合理的分配医院的医生资源且不浪费,从侧面看,极大的提升了医院的管理水平,还可以很大程度的提高医生工作效率,解决看病问题,便利民生问题的同时还带来了经济上的发展。
    在我们国家也有很多医院已使用了在线挂号系统;文献[4]中说明,从使用情况分析,我们对系统的管理方面还存在很大的弊端,比如有个人或者团体通过此种方式来谋取暴力;导致,医院预约挂号系统服务没有的到正真的合理使用,这样没有给病人就诊带来方便、没有给医院带来方便,还被很多病人和医院管理者,医护人员反感抵制。
    所以,对每一次系统的实施,我们需要办法一些相关的规章制度,约束这些不合理的使用现象。不仅要正确的让医院开展预约挂号系统的实施,而且要文明绿色的实行这些工作的计划;全面提高人们对预约挂号服务工作的认识、全面加强对预约挂号服务工作的管理计划、认真搞好相关组织工作的内容;一切都要坚持本方便群众就医,搞好医疗事业建设,合理的运用前沿技术来服务农民,发展社会。
    2.2.2 挂号用户网上预约挂号要实现较好的网站设计,首先这个网站必须具有良好的稳定性和较高的安全性,对开发的后期来说要易于维护;对网站首页的设计要有基本的菜单导航设计来引导新用户的正确操作,方便患者的使用。
    对于医院的信息设计部分;经过对不同科室的信息进行细致的分类方便用户对照自己的症状合理,正确的来挂号;对不同医院的专家信息进行分类,专家情况信息介绍要详细全面,防止患者对信息理解错误挂号错误的现象发生,进而让用户能作出正确选择;用户通过查看专家信息,选择专家,选择挂号日期;实名填写个人信息、家庭住址、联系方式等信息成功的实现网上预约挂号。

    挂号方式患者通过在浏览器端输入网址进入预约挂号系统的首页,查询医院医生信息,点击预约挂号,填写个人信息,实现网上成功预约之后,根据自己的预约信息去医院就诊。
    2.2.3预约须知对在线医院预约挂号系统的总体说明主要有一下几点:愉悦着要提前看网站对挂号者预约所注意事项、以及预约挂号人的权利和义务,权责声明、对于自己不清楚的地方要及时的查看系统使用帮助。
    进入网上预约挂号的平台后,根据自己所在地区选择需要挂号的医院。进入医院网站首页,初次登陆系统预约的用户,需要先注册才能登陆系统进行操作挂号;如果是复诊输入用户名和密码,即可登陆系统。系统可以自动核对登陆者的信息,登陆成功后,可进入预约挂号程序。
    需求分析种我们会发现,医院预约挂号系统中需要管理的信息主要有以下几种:

    医生:姓名、性别、科别、擅长、年龄、就诊时间
    挂号单:科别、挂号单号、编号、费用
    病人:姓名、性别、年龄、联系方式、症状、挂号单号

    对于单号的处理部分,一张挂号单只可以对应一个医生;一个医生可以有多张挂号单,但是日期时间不能冲突,一张单号也只能对应一个病人,一个病人在同一时间只可以预约一张单号、一个患者可以选择多个医生,一个医生可以看多个病人。
    2.3 开发环境医院挂号系统采用的是Myeclipse软件开发平台,mysql数据库以及SSH框架技术,开发环境为windows xp 系统用户无需安装任何软件,只需在浏览器端输入网址即可使用,使用非常方便,对开发人员的维护工作也很方便。
    3 系统分析与设计3.1 系统概述系统设计是继需求分析之后的重要一步,目的是根据对用户的需求分析将其逻辑方案转换成物理方案。同时要注意系统设计的内外环境以及主观条件和客观条件,未来确保系统总体目标的实现,我们要考虑到经济,技术各方面的条件,来做出合理的技术方案,选择出合适的设计平台以及开发环境。系统设计要坚持阶段性开发原则对不同的阶段设计出不同的实现功能;其次要本着为客户服务的原则,尽可能的坚强客户使用的难度,同事要坚强管理人员的负担,尽量使用自动化的处理方式来处理数据,以及要具有良好的设计体验;对用户的需求变更要及时的处理,同时,最重要的是实现系统的可扩展性,减少各个模块的耦合性,使系统便于扩展与维护;系统设计中很多工作是有技术性的,再设计过程中要考虑到用户需求的变更,是系统设计完成的一个必要阶段。
    3.2 系统功能系统功能主要是实现患者在线预约挂号,对网站来讲,我们将其分为前台功能和后台功能两个模块。
    系统前台功能图如下图所示,我们又将前台功能细分为三大块功能,分别是:信息展示模块、系统应用模块、用户模块。


    信息展示:展示出专家的信息,医院信息等
    系统使用:完成登录注册等功能
    用户:登录,查询、预约挂号等


    我们对后台模块功能分析如下:

    修改密码:用户、管理员对自己的个人密码进行修改操作
    系统公告的管理:管理员来实现医院公告的管理
    专家信息管理:对专家信息进行添加和删除等操作
    注册用户管理:对用户的个人信息进行管理
    医院信息管理:对医院的信息进行添加和删除等操作

    3.3 用例图3.3.1 会员用例图用户可以:在线注册会员,在线查询医生信息,在线预约挂号等。

    3.3.2 管理员用例图
    管理员可以对医生信息的数据库信息进行合理的变更;对医院的信息进行添加或删除,对会员的信息进行和管理以及对医院公告的信息进行更改等。
    3.4 流程图
    用户可以在网站的主页看到信息查询的按钮并对想要查找的信息进行填写,然后根据查询结果进行预约挂号填写个人信息,同时如果不想预约,可以进行取消预约的操作。

    管理员在系统首页的“系统管理员登录”出输入自己的账号和密码进行登录,然后进入管理员界面,可以对医院的信息以及医生的信息进行添加和删除操作;同时也可以管理用户的信息。
    4 数据库设计4.1 数据库设计概述MySQL是一种SQL数据库的管理系统,受到很多人都欢迎因为其具有开源性的特点。它是由一家商业公司MySQL AB进行了设计开发和发布的,这家公司主要是对MySQL数据库开发,这家公司的注册商标就是Mysql;它拥有成功的商业模式,巧妙地使用了其开源性,方法论的第二代开源公司对于MySQL AB公司的发展历史我们在这里就不做过多的赘述了。
    MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。文献[8]中介绍MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。MySQL网站( http://www.mysql.com )提供了关于MySQL和MySQL AB的最新的消息。
    数据库在动态网页设计中发挥了重要的作用,文献[6]中介绍到它好比一个大仓库,对网站的重要信息进行存储,由于网站的网页不是一成不变的,他需要及时的变更,所以要使用到数据库,有了数据库开发人员对网站内容的管理更加方便,维护也更加方便,所以数据库的设计是系统成功实现的关键之处。该系统的设计主要是用了mysql 数据库来设计数据库,简单方便,下面我们主要说明下数据表和数据表结构。
    4.1.1 表说明主要的数据表有db_guahao表,此表又包含t_gonggao系统公告,t_zhuanjia 专家信息,t_guahao医院信息;,t_yiyuan医院信息管理系统,t_use注册用户的信息;r,t_admin管理员信息;t_keshi科室信息表等。

    4.1.2 表结构说明


    5 系统的实现5.1 网站首页设计网站设计的首页设计是至关重要。因为第一个映入用户眼睑的就是网站的首页,它的好坏直接影响了用户对网站的喜爱程度;在对首页设计上我们要内容丰富的同时又要有一定的色彩搭配以及上下呼应等特色,以下是本网站的首页:

    5.2 网站引导设计网站的导航视为了使用户使用更加方便灵活,能使网站有一个较好的用户体验,提高用户的满意度,他是网站的路标,可以提示用户如何操作,就像字典查询需要目录一样,网站设计也需要这样的“目录”,从而让用户更加明确的知道下一步该如何操作,以及自己所处的位置;网站导航主要可以通过文字导航、按钮导航、Flash导航等,本网站的导航设置如下图所示:

    5.3医生信息模块本网站的主要功能是患者挂号功能,刚进入网站用户需要对自己的病情进行分析以及查询相关的医生才能更准确的完成预约挂号,所以医生信息也是网站设计的一个重要元素,专家展示模块主要包括显示医生列表、显示医生详细信息两个部分。
    患者点击相关的医院便会出现该医院的相应专家信息如图所示:

    该页面的设计代码如下:
    zhuanjiaAllByYiyuan:主要是通过数据库查询获取相关信息然后通过JSP页面传递给用户:
    public String zhuanjiaAllByYiyuan(){ String sql="from TZhuanjia where del='no' and yiyuanId="+yiyuanId; List zhuanjiaList =zhuanjiaDAO.getHibernateTemplate().find(sql); for(int i=0;i<zhuanjiaList.size();i++) { TZhuanjia zhuanjia=(TZhuanjia)zhuanjiaList.get(i); zhuanjia.setKeshi(keshiDAO.findById(zhuanjia.getKeshiId())); zhuanjia.setYiyuan(yiyuanDAO.findById(zhuanjia.getYiyuanId())); } Map request=(Map)ServletActionContext.getContext().get("request"); request.put("zhuanjiaList", zhuanjiaList); return ActionSupport.SUCCESS;}public String zhuanjiaDetailQian(){ TZhuanjia zhuanjia=zhuanjiaDAO.findById(id); zhuanjia.setKeshi(keshiDAO.findById(zhuanjia.getKeshiId())); zhuanjia.setYiyuan(yiyuanDAO.findById(zhuanjia.getYiyuanId())); Map request=(Map)ServletActionContext.getContext().get("request"); request.put("zhuanjia", zhuanjia); return ActionSupport.SUCCESS;}
    5.4 用户注册挂号模块用户查看相应的医生信息后可以对自己喜欢的医生进行预约,点击预约挂号按钮后会出现挂号注册页面,如下图所示:

    用户可以在相应的位置填写所患疾病,姓名,联系方式,和选择挂号日期来完成挂号。
    5.5 管理员登录页面管理员在网站里的主要作用是对患者挂号信息,医生信息,医院信息等进行管理,所以需要单独的来设计一个界面与用户区分开来,用户的登录界面在网站首页右侧,而管理员可以在网站首页下方找到管理员登录的图标,点击即可进入管理员登录的界面,登录界面中登录进入后才可以对网站信息进行修改管理等。管理员在网站的下方点击管理员登录按钮,输入自己的账号,密码进行校验后即可进入管理员登录界面,如下图所示:

    对管理员进行校验的代码:
    public String login(String userName,String userPw,int userType){ try { Thread.sleep(700); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String result="no"; if(userType==0)//系统管理员登陆 { String sql="from TAdmin where userName=? and userPw=?"; Object[] con={userName,userPw}; List adminList=adminDAO.getHibernateTemplate().find(sql,con); if(adminList.size()==0) { result="no"; } else { WebContext ctx = WebContextFactory.get(); HttpSession session=ctx.getSession(); TAdmin admin=(TAdmin)adminList.get(0); session.setAttribute("userType", 0); session.setAttribute("admin", admin); result="yes"; } } return result;}
    校验成功后可进入管理员主页面如图所示:

    管理员在这个页面能对自己密码修改,可以对医院的信息,医生信息,会员信息进行增加删除等,完成相应的操作后即可点击注销退出系统来退出管理员页面。
    5.6 医生信息管理模块医生信息管理是需要系统管理员来完成的,主要是让系统管理员对医生信息及时的更新,在上一步的页面中点击医生信息管理,即可实现对医生信息的添加,修改,删除等操作,界面如下图所示:


    医生信息处理模块的代码主要有:
    zhuanjiaAction:public String zhuanjiaAdd(){ TZhuanjia zhuanjia=new TZhuanjia(); //zhuanjia.setId(0);] zhuanjia.setYiyuanId(yiyuanId); zhuanjia.setKeshiId(keshiId); zhuanjia.setXingming(xingming); zhuanjia.setXingbie(xingbie); zhuanjia.setNianling(nianling); zhuanjia.setShanchang(shanchang); zhuanjia.setLeixing(leixing); zhuanjia.setFujian(fujian); zhuanjia.setDel("no"); zhuanjiaDAO.save(zhuanjia); Map request=(Map)ServletActionContext.getContext().get("request"); request.put("msg", "信息添加完毕"); return "msg";}public String zhuanjiaMana(){ String sql="from TZhuanjia where del='no' order by yiyuanId,keshiId"; List zhuanjiaList =zhuanjiaDAO.getHibernateTemplate().find(sql); for(int i=0;i<zhuanjiaList.size();i++) { TZhuanjia zhuanjia=(TZhuanjia)zhuanjiaList.get(i); zhuanjia.setKeshi(keshiDAO.findById(zhuanjia.getKeshiId())); zhuanjia.setYiyuan(yiyuanDAO.findById(zhuanjia.getYiyuanId())); } Map request=(Map)ServletActionContext.getContext().get("request"); request.put("zhuanjiaList", zhuanjiaList); return ActionSupport.SUCCESS;}public String zhuanjiaDel(){ String sql="update TZhuanjia set del='yes' where id="+id; zhuanjiaDAO.getHibernateTemplate().bulkUpdate(sql); Map request=(Map)ServletActionContext.getContext().get("request"); request.put("msg", "信息删除完毕"); return "msg";}
    5.7综合查询平台5.7.1 医院信息,科室信息,医生信息查询对不同的医院进行查询,对不同科室信息查询、对所有专家信息的查询,可以按照网站的导航进行大概的查询,每次查询不用特别精确的填写所有信息,但是如果患者希望可以精准的查询就必须填写完整的信息来查询。

    5.7.2 预约状态查询和取消预约对于患者查看自己的预约信息以及是否预约成功,时间是否过期,事件是否正确,以及预约的具体信息等。对于用户临时会发生的冲突事件如在预约后,又有了新的事情冲突不能去就诊,患者可以登录系统点击信息管理,查看自己的网上预约挂号信息,修改自己的信息或者取消预约。对于取消预约的操作只能在预约日期之前进行过期后就不可以取消了,取消时需要患者填写姓名、取消原因等信息,信息填写完毕后就完成了取消预约的操作。
    5.7.3 停诊信息查询查询医院最近的就诊情况、自己所在区域的医院公告,包括停诊信息,方便患者能及时的正确的作出选择。
    5.7.4 注册信息查询 用户注册后有自己的主页,可以点击个人信息管理来实现注册信息的查询更改等。

    5.8 退出管理登录页面退出后台管理模块是管理员用于退出后台管理系统的。管理员退出后台管理系统之后,需要单击【退出】按钮,此时虽然还在后台中但已不能对数据库进行操作;这时候单击其他功能模块时,将弹出后台登录窗口要求用户输入正确的用户名、密码以及验证码。

    总结经过自己不断的努力以及老师同学的细心帮助我完成此次毕业设计,同时也学会了很多只是,通过对各种文献资料的查阅,使我增长了不少的知识;医院挂号系统的成功完成过程是艰苦的,但是结果是令人欣慰的,在此过程中我学习了很多新的知识,比如数据库设计方面,jsp 、javascripts编程等。让我成长了很多。虽然此次完成毕业设计老师没有给我吗分组,但是这实际上并不是我一个人努力的结果,有老师同学的帮助让我能真正的完成毕业设计,真心的感谢他们,同时让我总结出至关重要的一点就是要及时的与老师同学进行沟通交流,要互相团结,我意识到团队意识的重要性,这次毕设让我有了一定的实践基础,很有利与我动手能力的提高。同学老师的各种意见使我完成医院挂号系统的设计,他们的想法设计思路也对我有很大的帮助。
    写毕业论文期间,我深刻的认识到实践到理论的重要性!在实践到理论的转化中,我将自己的工作过程清晰的展现在面前,对资料的查询,如何很好的笔记等有了很大的收获,获得了一些必要的知识的同时,也掌握了很多获取知识的重要途径。在繁杂的设计中,我能够清晰的找准自己的目标,各种系统的设计计划,以及选用标准,各种语言的用途等等,这些内容都是我在不断深化论文的过程中不断的熟悉和应用的,有了老师们的指导以及同学之间的思想交流,让我对论文设计有了更加丰富的理解和掌握。同时,在自我总结中更加全面的改正自己存在的缺陷和风险,让自己在大学四年里所学的理论知识得到很好的发挥;更重要的是,我意识到在信息化的时代,我们需要正确的使用我们的高科技,争取在今后的工作中不断的学习不断的进步,为社会的发展作出自己的一点点贡献,面对压力挑战能像这次毕业设计完成一样去解决所有的问题、困难;面对问题不胆怯不懦弱。对自己的工作一定要一丝不苟,脚踏实地的去做每一次任务,在软件领域发出自己的光芒。
    0 评论 1 下载 2020-07-16 12:29:44 下载需要14点积分
  • 基于Libpcap实现的局域网嗅探抓包发包解析工具

    第一章 需求分析1.1 设计目的1.1.1 基本要求完成一个基于Libpcap的网络数据包解析软件,具有易用、美观的界面。
    1.1.2 具体要求
    能够解析本地或局域网的数据包,例如TCP包,UDP包,工CMP包等,能分析报头以及数据包内容
    能分析数据包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源’p地址和目的工p地址等内容。并将上述解析结果规范显示
    能解析每个数据包的内容(如果为加密信息不能解析则备注不能解析)
    能在制定时间段内解析数据包,当程序解析停止时,能分类统计在这段时间内解析的各类数据包的数量
    能够图形化显示数据包统计结果

    1.2 功能要求1.2.1 功能概况本次设计参考计算机网络基础知识,设计实现一个能够对本地局域网数据包进行捕获和分析的程序,并利用此程序实现网络监控和其他实用性功能。
    1.2.2 获取数据包功能利用Libcap,扫描设备网卡,选取不同网卡类型(WiFi/以太)进行对局域网数据包的监听和捕获,设计两种模式:混杂模式和非混杂模式,简单来说就是是否要过滤掉不是发送给自己的数据包,如果设置为混杂模式,则会收到整个局域网内的所有数据包并进行分析。
    1.2.3 分析数据包功能程序能够对捕获的数据包进行分类整理,并提取数据包中内容进行分析,包括数据包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源’P地址和目的’P地址等内容,并将上述解析结果规范显示。对于HTTP., ARP等报文,可以对其内容进行解析。
    1.2.4 图形化显示功能利用表格组件,将获取到的数据包信息以表格形式直观地显示出来,并且加以交换牛可以查看深层内容。
    1.2.5 数据包统计分析功能可以对一段时间获取的数据包进行统计整理,并根据数据包类型进行分类,如:数据包版本类型(IPv4/IPv6)、数据包协议类型(TCP/UDP/ARP等),并以饼图直观显示;对于TCP、UDP、ICMP数据包,用直方图统计其最大、最小、平均生存期和数据包大小,可以直观显示。
    1.2.6 数据包清空功能可以清空之前获取的所有数据包。
    1.2.7 Ping功能调用终端相应,实现Ping操作,可以用来测试与目标主机的连通性。
    1.2.8 TraceRoute功能调用终端相应,实现traceroute操作,通过traceroute我们可以知道信息从本计算机到互联网另一端的主机是走的什么路径。
    1.2.9 ARP-Attack功能本程序可实现局域网内ARP攻击,经测试可以对指定’P地址的主机实现断网攻击,基本原理同上,是欺骗目标机器局域网网关地址,使得该机器ARP缓存表中记录的网关IP -MAC对应错误,从而无法把数据包发送给真正的网关,导致网络连接失败,如果将欺骗的MAC地址设置为自己的MAC地址,则会截获目标机器发送的数据包。
    第二章 概要设计2.1 系统分析2.1.1 架构设计本系统采用架构如图2.1所示,主要分为三个模块:用户操作界面、数据处理模块和网卡驱动模块。其中,网卡驱动模块是最底层模块,主要实现从硬件网卡中获取所有的数据包,利用Unix系统下的Libcap工具,采用jni动态链接库调用网络层之下的底层功能,集成jpcap用来实现对数据包的分析处理;数据处理模块主要用于对网卡驱动模块获得的数据包进行分类处理,根据数据包版本和协议不同用不同方式拆解分析数据包,并将所得到的结果整理分析,同时可以实现对数据包的重构和发送操作;用户操作界面为最顶层功能,便于以可视化的图形界面直接显示抓取数据包的内容,以及可视化其他操作所得到的结果,便于使用者更好的操作和使用。

    2.1.2 实体设计2.1.2.1 登陆实体作为程序的进入窗口,用户登陆时,系统会要求用户输入账号和密码,并在数据库中进行匹配分析,若用户名存在且密码正确则通过身份认证,允许使用本软件。
    2.1.2.2 主界面实体登录成功后的功能选择界面,包含数据包抓取、Ping.. TraceRoute.. APR-Attack 四个功能,其中,对于数据包抓取还细分为抓取数据包和分析数据包功能。
    2.1.2.3 数据包抓取实体从主界面中选择进入,负责调用Libpcap抓取被监听网卡的数据包,可选择是否设置为混杂模式(是否过滤),并可以分类解析所有数据包中的内容,并以图形化界面显示。抓取结束后还可以对抓取到的数据包做统计整理,并将结果用图形化界面显示。
    2.1.2.4 Ping功能实体从主界面中选择进入,输入要测试的网站和测试的次数,可以得到访问该网站的往返RTT,在程序运行结束后可以汇总最大、最小、中值RTT,并可以用折线图将所有RTT统计显示。
    2.1.2.5 TraceRoute功能实体从主界面中选择进入,输入要追踪的网站和测试的次数,可以得到访问该网站的路径(’P地址),如果中途站点拒绝相应会显示“*“,在程序运行结束后可以汇总所经过的站点’P地址。
    2.1.2.6 ARP-Attack功能实体从主界面中选择进入,系统首先自动获取网管IP-MAC地址作为最低地址,同时得到广播地址以表示最高地址,并将该局域网内已连接设备的IP-MAC映射表先是在表格中。用户选择网卡类型后,在表格中选择相应的’P地址便可以对该设备实现APR攻击,使该设备无法连接到互联网。

    2.1.3 分层设计2.1.3.1 Jpcap驱动层(数据层)通过Java扩展jar-Jpcap调取Libpcap基本功能,以及jni包,对设备的底层网卡进行监听,将经过网卡的数据包捕获下来,可以应对不同网卡类型,如wifi、以太、网桥等,同时支持设置混杂模式以监控局域网内的所有数据包。
    2.1.3.2 数据处理层(功能层)主要是对接收到的数据包进行分类处理,将数据包分为IP数据包和ARP数据包,再对IP数据包协议进行解析从而分出TCP、UDP、ICMP、IGMP等数据包,同时对不用版本(IPv4、IPv6)的数据包也做区分,将分类结果。
    2.1.3.3 用户界面层(表示层)接受来自数据处理层的处理结果:对于异常,采用消息框提示的方式展示给用户;对于抓取的数据包分析结果,以表格的形式显示在界面上,用户可以点击表格中某一项查看详细信息;对于数据包的统计结果,自动绘制图表显示给用户;其他提示信息同样采用消息框给用户反馈。同时用户可以直接在界面上选择相应功能,底层会自动实现相应操作并反馈给用户界面层。同样,Ping、 TraceRoute、APR-Attack功能也有相应的图形化界面。

    2.1.4 数据库设计本程序中数据库仅做身份认证功能,不需要将统计到的数据包保存在数据库中,一方面是不需要检索和查询等操作,另一方面是数据库的使用并不会带来效率的提升,因此数据库仅仅保存用户名和密码,在登陆时对数据库进行匹配判断是否允许登陆。

    2.2 程序流程2.2.1 程序结构图
    2.2.2 调用关系运行程序后,首先进入用户登陆界面,用户名与密码不匹配则登陆失败,成功则进入用户操作主界面。
    在用户操作主界面中有四个按钮供用户选择,分别是:Packing、Ping、TraceRoute、Hack,分别对应网络数据包抓取分析功能、Ping功能、TraceRoute 功能、ARP攻击功能,点击不同按钮跳转至不同功能实现界面。
    网络数据包抓取分析功能分为数据包抓取、数据包分析和数据包重置功能:数据包抓取模块可以选取计算机指定网卡进行数据包的抓取操作,自动调用数据处理层的方法对数据包进行分类解析,并将解析结果显示在表格上,若用户想查看详细信息,可以点击表格中具体的某一项进行查看;数据包分析功能可以对本段时间抓取的所有数据包进行整理分析,并使用JFreeChart将所有数据可视化显示,直观的表现网络中流量的状态;数据包重置可以将本段时间抓取的数据包清空,便于下一次分析统计。
    Ping操作调用Unix终端的ping指令,用于测试一个站点的往返延迟(RTT), 本程序以图形化界面实现网络命令ping操作,并允许指定ping操作的执行次数,最终可以在程序运行后显示最大最小与均值RTT,点击绘图按钮可以以折线图统计本段时间所有的往返延迟。
    TraceRoute操作调用Unix终端的trace指令,用于追踪访问一个站点所经过的路由器(IP地址),本程序以图形化界面实现网络命令trace操作,并允许指定trace操作的测试包数目,最终可以在程序运行后显示所经过的全部站点。
    ARP攻击操作可以实现ARP模拟攻击,可以搜索本机局域网内的所有设备ip 地址,利用ARP诈骗原理实现对靶机的断网攻击,核心内容是使靶机无法找到网关IP地址所对应的MAC地址,从而使所有数据包无法发出局域网。
    第三章 详细设计3.1 功能类定义与实现3.1.1 常量与参数的定义(Parameter类)JDBC数据库连接所用参数与端口JDBC (Java Data Base Connectivity, java数据库连接)是一种用于执行SQL 语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。
    本系统采用的是MySQL数据库,编程语言为Java语言,编译器为Eclipse Oxygen, Java连接数据库时需要用到JDBC驱动器、数据库URL以及数据库管理员账号密码等。
    根据数据库的URL、用户名和密码,创建一个JDBC Connection对象。如:
    Connection connection=DriverManager.geiConnection(“连接数据库的URL"," 用户名“,“密码”)
    其中,URL=协议名++I[P地址(域名)+端口+数据库名称;用户名和密码是指登录数据库时所使用的用户名和密码。示例创建MySQL的数据库连接代码如下:
    Connection connectMySQL=DriverManager.geiConnection("jdbc:rnysql://localhost:3306/rnyuser", "root" ,"root");
    对应代码如下:
    public static final String JDBC_DRIVER="com.mysql.jdbc.Driver"; public static final String DB_RL="jdbc:rnysql://localhost:3306/java?useSSL=true&characterEncoding=UTF8";public static final static final String ACC = "root";pub1ic static final static final String PWD = "zxczxc";
    统计部分参数定义由于在统计部分需要用到已经捕获到的数据包的一些数据,例如:不同版本数据包的数量、不同协议数据包的数量、某协议数据包最大最小与均值生存期及数据包长度等,单独建立一个类用来统计所有的信息:
    package Uti1;public class Statistic{//不同协议总数public static int IPv4=0; public static int IPv6=0; public static int OtherVersion=0;//不同类型数据包总数public static int TCP=0; public static int UDP=0; public static int ICMP=0; public static int IGMP=0; public static int ARP=0; public static int Others=0;//数据包长度最大值、最小值、平均值 public static int TCP_maxLen=0; public static int UDP_maxLen=0; public static int ICMP_maxLen=0;(其他变量定义不再举例)
    3.1.2 IP/ARP数据包显示信息的定义IP数据包TCP/IP协议定义了一个在因特网上传输的包,称为ip数据包,而ip数据报(ip Datagram)是个比较抽象的内容,是对数据包的结构进行分析。由首部和数据两部分组成,其格式如图所示。首部的前一部分是固定长度,共20字节,是所有ip数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。首部中的源地址和目的地址都是ip协议地址。
    ip数据包解析后的内容包括:版本、协议、数据包标识、生存时间、头长度、数据包总长度、优先权、服务类型、区分服务(最大吞吐量和最高的可靠性)、是否分段、分段偏移量、源’p地址与目的’p地址、源MAC地址与目的MAC地址、校验和;
    针对UDP、 TCP数据包,还设定了源端口号和目的端口号;
    针对ICMP数据包(v4/v6)还设定了ICMP报文代码和报文类型;
    除此之外可以详细显示DNS、 HTTP等数据包的包内容。
    ARP数据包在网络通讯时,源主机的应用程序知道目的主机的ip地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问ip地址是192.168. 0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF: FF: FF: FF: FF: FF表示广播),目的主机接收到广播的ARP请求,发现其中的ip地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。这就是ARP数据包。
    ARP数据包解析后的内容包括:版本、协议、头长度、数据包总长度、硬件类型、协议类型、硬件地址长度、协议地址长度、操作字段、源’p地址与目的’p地址、源 MAC地址与目的MAC地址;
    除此之外可以详细显示ARP数据包的包内容。
    3.1.3 捕获数据包的实现(HandleJpcap包)使用Jpcap捕获数据包并分类处理Java的java. net包中,给出了传输层协议TCP和UDP有关的API,用户只能操作传输层数据,要想直接操作网络层,比如自己写传输层数据报(自己写传输层包头), 或者自己写好ip数据包向网络中发则是无能为力的。而Jpcap扩展包弥补了这一点,使我们可以支持从网卡中接收ip数据包,或者向网卡中发送ip数据包。
    Jpcap实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP 调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。
    下载libcap (Linux上的Wincap),使用jni连接C语言调用底层网卡功能,再建立Java动态链接库,实现jpcap. jar的生成。
    使用jpcap后,编写程序按要求完整数据包的抓取,可以获得不同类型数据包,并根据数据包类型对不同数据包进行解析,可以在表格上显示不同数据包的类型、数据包标识、版本、源IP地址、目的IP地址以及数据包长度。对表格每一项可以选择查看其具体信息,对不同数据包有不同的描述,IP包为一大类,ARP包为另一类。
    Jpcap包中主要是用到的方法如下:

    JpcapHandler:这个接口用来定义分析被捕获数据包的方法
    ARPPacket:这个类描述了ARP/RARP包,继承了Packet类
    DatalinkPacket:这个抽象类描述了数据链路层
    EthernetPacket:这个类描述了以太帧包,继承DatalinkPacket类
    ICMPPacket:这个类描述了ICMP包,继承了IPPacket类
    IPAddress:这个类描述了IPv4和工Pv6地址,其中也包含了将IP地址转换为域名的方法
    IPPacket:这个类描述了IP包,继承了Packet类,支持IPv4和IPv6
    Jpcap:用来捕获数据包
    JpcapSender:它用来发送一个数据包
    Packet:这个类是所有被捕获的数据包的基类
    TCPPacket:这个类描述TCP包,继承了IPPacket类
    UDPPacket:这个类描述了UDP包,继承了IPPacket类

    抓取数据包过程如下:
    首先,获得所有网卡列表
    NetworkInterface[]devices=JpcapCaptor.getDeviceList();
    通过网卡,打开一个捕捉器
    openDevice(NetworkInterface intrface, int snaplen, boolean promics, int to_ms);JpcapCaptor captor=JpcapCaptor.openDevice (device[index], 65535, false, 20)
    通过捕捉器捕获数据:
    本程序采用主动获取的方法。通过捕获器的getPacket ()可以主动的,一个数据包一个数据包的获取。主动获取,可以每次需要处理数据包的时候,自己去主动获取。然后写出处理逻辑。但是因为不知道何时去产生数据包,而一直去调用 getPacket(),因此需要开辟多线程,让用户自行终止数据包的捕获。
    数据包分类:
    利用packet instanceof XXPacket对捕获到的数据包进行分类,并对不同类型的数据包进行分类拆解。
    Jpcap还可以完成以下功能:

    Jpcap是直接抓取经过数据链路层的数据包。因此可以自己写’p数据包直接发送给数据链路层
    Jpcap会对抓取到的数据包进行一定程序的解析,根据数据包内容,将数据包封装为对应的对象
    根据用户设定的信息,过滤数据包(其实就是在解析的时候,对不需要的数据直接丢弃,不解析)
    Jpcap只是直接从数据链路层上读取数据,并向数据链路层中发送数据,因此,Jpcap并不能操作其他程序从数据链路层中读数据或者向网卡中发送数据

    数据包存储数据结构的定义(Packet类与AllPackets类)为方便整理统计各类数据包,我们需要采用一种数据结构用来存放前一段时间捕获到的所有数据包以便统计,为此单独设置一个Packet类用来描述单个数据包(ARP/IP数据包通用),对所有的数据包,创建一个集合ArrayLi st用来保存所有的Packet, 放入AllPackets类中,可以对这个集合增添数据包,在某些时刻可以清除已有的数据包。
    3.1.4 Ping操作实现部分(HandlePing包)3.1.4 Ping功能作用Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping 网关地址192.168.1.1试试”。它通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示响应情况,这样我们就可以根据它输出的信息来确定目标主机是否可访问(但这不是绝对的)。有些服务器为了防止通过 ping探测到,通过防火墙设置了禁止ping 或者在内核参数中禁止ping,这样就不能通过ping确定该主机是否还处于开启状态。
    linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按 ctrl+c终止或者用参数一C指定要求完成的回应次数。
    命令格式
    ping [参数] [主机名或IP地址]
    命令功能
    ping命令用于:确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测试、评估和管理网络。如果主机正在运行并连在网上,它就对回送信号进行响应。每个回送信号请求包含一个网际协议(IP))和ICMP头,后面紧跟一个tim结构,以及来填写这个信息包的足够的字节。缺省情况是连续发送回送信号请求直到接收到中断信号(Ctrl-C)。
    ping命令每秒发送一个数据报并且为每个接收到的响应打印一行输出。ping命令计算信号往返时间和(信息)包丢失情况的统计信息,并且在完成之后显示一个简要总结。ping命令在程序超时或当接收到SIGINT信号时结束。Host参数或者是一个有效的主机名或者是因特网地址。
    命令参数

    -d:使用Socket的SO_DEBUG功能
    -f:极限检测。大量且快速地送网络封包给一台机器,看它的回应
    -n:只输出数值
    -q:不显示任何传送封包的信息,只显示最后的结果
    -r:忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题
    -R:记录路由过程
    -v:详细显示指令的执行过程
    <p>-c:数目,在发送指定数目的包后停止
    -i:秒数,设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次
    -I:网络界面,使用指定的网络界面送出数据包
    -l:前置载入,设置在送出要求信息之前,先行发出的数据包
    -p:范本样式,设置填满数据包的范本样式
    -s:字节数,指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是 64ICMP数据字节
    -t:存活数值,设置存活数值TTL的大小

    Java调用Unix终端实现Ping操作
    本扩展功能使用Java调用终端Ping指令,在表格上显示Ping的相关信息,并绘制Ping操作往返延迟折线图,从而实现图形化操作的Ping指令。
    利用正则表达式截取从终端返回的信息
    为方便统计所有的ping结果,并获得最大、最小、均值RTT,我们需要对终端返回的信息进行筛选,由于java中已存在封装好的剪切字符串的方法,可以不用自己编写正则表达式。
    经过以上方法,每一次ping操作的往返延迟便被记录下来展现,同时,最大最小与均值RTT也被记录了下来,表现如下:


    3.1.5 TraceRoute操作实现部分(HandleTraceRoute包)3.1.5.1 TraceRoute功能作用通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地 (destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。linux系统中,我们称之为traceroute,在MS Windows中为tracert。
    traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
    在大多数情况下,我们会在linux主机系统下,直接执行命令行:
    traceroute hostname
    命令格式
    traceroute [参数] [主机]
    命令功能
    traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。
    具体参数格式
    traceroute [-dFlnrvx] [-f<存活数值习[-g<网关>…][-i< 网络界面>][-m<存活数值>] [-p<通信端口>] [-s<来源地址>]\ [-t<服务类型>] [-w<超时秒数>][主机名称或IP地址][数据包大小]
    命令参数

    -d:使用Socket层级的排错功能-f:设置第一个检测数据包的存活数值TTL的大小-F:设置勿离断位-g:设置来源路由网关,最多可设置8个-i:使用指定的网络界面送出数据包-I:使用ICMP回应取代UDP资料信息-m:设置检测数据包的最大存活数值TTL的大小-n:直接使用ip地址而非主机名称-p:设置UDP传输协议的通信端口-r:忽略普通的Routing Table,直接将数据包送到远端主机上-s:设置本地主机送出数据包的ip地址-t:设置检测数据包的TOS数值-v:详细显示指令的执行过程-w:设置等待远端主机回报的时间-x:开启或关闭数据包的正确性检验
    Java调用Unix终端实现TraceRoute操作
    本扩展功能使用Java调用终端traceroute指令,在表格上显示traceroute的相关信息,并绘制traceroute操作经过的站点,从而实现图形化操作的traceroute指令。
    利用正则表达式截取从终端返回的信息
    为方便统计所有的trace到的站点结果,我们需要对终端返回的信息进行筛选,由于java中已存在封装好的剪切字符串的方法,可以不用自己编写正则表达式。
    经过以上方法,每一次trace的站点便被记录下来,表现如下:

    3.1.6 ARP-Attack操作实现部分(ARPAttack包)3.1.6.1 ARP原理简介每台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上各主机和路由器的IP地址和硬件地址的映射表,这些都是该主机目前知道的一些地址。
    当主机A要向本局域网上的某个主机B发送ip数据报时,先在其ARP高速缓存中查看是否有主机B的ip地址。如果有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。也有可能查不到主机B的ip地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找到主机B的硬件地址。
    实现地址解析的第一步是产生ARP请求帧。在ARP帧数据部分的相应字段写入本地主机的物理地址、ip地址、待侦测的目的ip地址,在目的物理地址字段写入0, 并在操作类型字段写入1,用以表示本数据帧是一个ARP请求数据帧。
    该ARP请求帧以本地网络适配器的物理地址作为源地址,以物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。
    由于采用了广播地址,因此网段内所有的主机或设备都能够接收到该数据帧。除了目的主机外,所有接收到该ARP请求帧的主机和设备都会丢弃该ARP请求帧,因为目的主机能够识别ARP消息中的ip地址是否与本机相同。
    与目的ip地址匹配的主机构造ARP应答帧。在ARP应答帧中,以请求分组中源物理地址、源ip地址作为其目的物理地址、目的ip地址,并将自身的物理地址、ip地址填入应答帧的源物理地址、源ip地址字段,并在操作字段中写入2,表示本 ARP数据帧是一个应答数据帧。该分组通过数据链路层直接发给源主机。
    源主机接收到ARP应答帧后,获得目的主机的物理地址,并将它作为一条新记录加入到ARP高速缓存表。
    此外,如果源主机没有发送ARP请求而收到其他主机的ARP响应数据帧,源主机也会在本地ARP缓冲区中缓存该主机物理地址和ip地址的对应关系。
    ARP高速缓存是非常有用的。如果不使用ARP高速缓存,那么任何一个主机只要进行一次通信,就必须在网络上用广播的方式发送ARP请求分组,这会使网络上的通信量大大增加。ARP把保存在高速缓存中的每一个映射地址项目都设置生存时间,超过生存时间的项目就从高速缓存中删除掉。
    ARP是解决同一个局域网上的主机或路由器的ip地址和硬件地址的映射问题。
    3.1.6.2 ARP数据包格式在了解ARP原理的基拙上,还必须了解ARP数据包的格式才能实现ARP欺骗。

    注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为ip地址,后面两个地址长度对于以太网地址和’p地址分别为6 和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。

    3.1.6.3 ARP欺骗原理一台电脑通过网络访问另一台电脑的时候,在数据链路层需要知道对方的 MAC地址进行真正的物理通信。
    而电脑上的应用程序通常都是根据另一台电脑的’p地址来和对方建立通信,这时候就需要有一个协议将ip地址解析到MAC地址,这就是ARP协议。
    而ARP具体过程就是当需要通过ip获取一个远端的的MAC地址的时候,系统会首先检查ARP表中是否存在对应的ip地址,如果没有,则发送一个ARP广播,当某一个拥有这个MAC地址的节点收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,ARP Reply包中就包含了目的地节点的 MAC地址,在源节点接受到这个reply后,会将目的地节点的MAC地址保存在ARP 缓存表中,下一次再次请求同一ip地址的时候,系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。
    用ping命令举例来说,在机器A,比如说ip是192.168.1. 2中发出下面的 ping命令:
    ping 192.168.1. 3,如果192.168.1.3这个MAC地址在机器A的ARP缓存表中不存在,这时候机器A就会发送一个ARP广播,当192.168.1.3接到广播后,会给机器A回一个ARP Reply包,其中包含了192.168.1.3的MAC地址,这是正常的 ARP过程。
    假设IP—MAC的对应关系为(192.168.1.3—OO-1C-23-2E-A7-OE)
    但是局域网内的其他机器也可向机器A发一个假的IP—MAC对应关系ARP Reply包,机器A接收到这个假的包后同样会更新自己的ARP缓存表.假设发送的为(192.168.1.3—OO-1C-23-2E-A7-OA,OA实际上为192.168.1.4的MAC地址)那么机器A再通过IP往192.168.1.3发送数据的时候,实际上却发到了192.168.1.4这台机器.这样就到达了ARP攻击或者叫做ARP欺骗,RP攻击只能发生在局域网内。
    ARP欺骗分为两种,一种是针对路由器进行欺骗,使路由器的ARP缓存中建立错误的IP与MAC地址映射表,结果就是从路由器发送的数据都发给了一个错误的MAC地址,造成主机无法正常接收信息。另一种是对主机中的ARP缓存进行欺骗,伪造主机路由器IP和MAC地址映射表,使主机发送的数据都发送到伪造后的MAC地址对应的主机上,这种情况不仅会使主机不能正常上网,而且还能用来窃取信息。
    3.1.6.4 本程序ARP欺骗方式我们用程序实现第二种ARP欺骗,并对第二种欺骗方式进行举例。
    假设现在主机A和主机B通过路由器C连接在同一个局域网内,主机A是欺骗方,主机B是被欺骗方。主机A在自己的ARP缓存中查到路由器C的IP地址 IP_C, MAC地址MAC_C,查到主机B的IP地址IP_B。接下来,主机A自己生成一个ARP回复,该回复的源IP并不是主机A的IP地址,而是冒充路由器C的IP地址IP_C,同时编造一个不存在的MAC地址作为回复的源MAC地址(可以设置为自己主机的MAC地址用来窃听),目标IP是IP_B,目标MAC地址是MAC一。这个ARP回复以单播的形式发送给主机B之后,主机B并不会验证回复的真实性,而是会把路由器的IP_ C和一个错误的MAC地址写入自己的ARP缓存,此时,所有主机B通过路由器发送给外界的数据,都会因为找不到路由器而发送失败。(在此,路由器也称作为网关)。
    总结一下:主机A冒充路由器C不断向主机B发送一个包含错误的IP和MAC 映射表的ARP回复,使主机B经由路由器发给外界的数据无法到达目的地,从而致使主机B无法正常上网。
    3.1.6.5 ARP攻击实现流程本实验ARP攻击实现如下图所示:

    在本机接入局域网时,首先调取终端功能查询本机IP地址和MAC地址,并获取局域网网关IP地址和MAC地址,同时获取广播地址查看网段大小;
    接入局域网监听一段时间后,可自动获取局域网内所有设备的IP地址与MAC地址,这些信息缓存在系统arp表中,可以将其查询出来:

    然后选择要攻击设备的IP地址,选定伪装的MAC地址(如果设置为本机MAC地址则会截获所有数据包,起窃听作用),设置网卡模式((WiFi/以太),设置攻击间隔(多长时间攻击一次),便可开始ARP攻击。
    3.1.6.6 ARP欺骗注意事项由于存在ARP代理,对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的ARP请求会使用自己的MAC地址与目标计算机的IP地址对源计算机进行应答。因此不可以随意指定IP地址,因为如果是错误的IP地址,网关会用自己的MAC地址做应答,然而实际无意义,因此需要判断返回的ARP应答对应的MAC地址是否为网关地址。
    需要在进行攻击之前发送心跳包,测试指定的IP地址是否存在,是否是一个真正的设备而不是预留的设备。
    3.2 函数调用关系图
    程序由LoginFrame()进入,登陆成功进入MainFrame( ),Mainframe可以选择进入GrabbingPacketMainFrame、startPingFrame、startTraceRouteFrame和 startARPAttcckFrame,其中GrabbingPacketMainFrame调用startGrabbingFrame和StatisticFrame函数, StatisticFrame调用HandieDate、JFreeChart和JDBC函数完成统计并自动将数据可视化。
    第四章 测试登录界面

    程序主界面
    如果登陆失败,如账号不存在或密码错误,则会给以相应提示,登陆成功则跳转至程序主界面。

    数据包处理界面

    数据包抓取
    点击数据包抓取按钮,显示出一个表格,首先需要选择网卡类型,即现在上网的方式是使用WiFi还是以太网;选择网卡模式后选定是否设置为混杂模式,即是否过滤掉不是发送给自己主机的数据包,如果不过滤的话意味着可以监听整个局域网内的数据包。点击开始自动抓取数据包,点击暂停停止数据包的捕获。






    3 评论 35 下载 2018-11-05 12:08:40 下载需要13点积分
  • 基于ASP.NET的家庭财政管理系统

    一、项目介绍个人理财管理系统是典型的管理信息系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。开发的功能主要包括:通过计算机管理个人财产,实现无纸化理财,通过查询分析,统计出各项数据,分析出生活中的浪费和节约的地方,通过强大的查询和索检高效的索检出数据,提高办事效率。
    二、系统功能2.1 用户管理 在这一功能模块中,主要针对的是用户管理。需要实现新用户的创建,用户的登陆以及删除功能。用户只有在登陆后才能进行其他的操作。
    2.2 账户管理 在这一功能模块中,主要是针对用户的多银行账户情况,其中可以添加、删除(注销)账户,可以实现账户间的转账,同时也可以分别查询每个账户的不同收支情况和转账情况。
    2.3 收支管理 在这一功能模块中,主要功能有针对债务管理、个人贷款、物品管理模块中的支出的一个总揽。
    2.4 债务管理 在这一功能模块中,主要是针对用户的债务关系,同样可以实现添加(借入)、删除(还款)、修改和检索债务等功能,这些数据的更新也会上传到收支管理和账户管理中去
    2.5 收支预算 在这一功能模块中,主要是用于用户的每年和每月的一个收支预算,可以实现添预算、删除预算、修改(更新)预算和根据预算得到收支分析对比功能。
    2.6 基础数据管理 在这一功能模块中,主要对上述应用的数据类别中的一些数据进行更新,包括银行类型、物品类别和收入与支出类别等。
    三、开发环境
    操作系统:Windows
    开发工具:vs2017
    数据库:xml数据库

    四、系统流程图
    五、项目展示登陆页面:初始帐户为root,123456

    主页面

    添加数据

    修改数据

    数据对比

    查询功能

    删除数据

    导出数据

    六、部分代码截图登录成功页面代码

    添加数据代码

    七、心得体会这次的.net的软件开发让我初步对于ASP.NET有了一些了解,关于如何运用各种控件来进行自己界面的设计和基本功能的实现,如何连接到文件数据库进行事件的动态变化等等有了很多的提高和了解,初步实现了软件的开发,提高了自己的动手能力。
    0 评论 1 下载 2020-07-15 11:34:27 下载需要14点积分
  • 基于ASP.NET的公共管理信息交流系统

    一、需求分析随着计算机技术的不断应用和提高,计算机已经深入到社会生活的各个角落,用户也纷纷通过网络去实现自己的生活,做到足不出户又能满足需求。而像58同城、论坛等正是应市场需求,所产生的一系列产品。而为了提高公共信息交流网在市场的竞争力,这个项目综合了二手市场、房源交易、招聘平台等方面的信息,为人们提供了便利的服务。
    1.1 编写目的本需求的编写是为了提供用户查询房源信息,售卖自己的闲置物品,为就业市场提供便捷服务,同时也为了方便管理员管理信息、内部维护而设计的公共管理信息交流系统。
    1.2 背景与范围
    项目名称:公共管理信息交流系统
    用户:一般用户及管理员

    二、系统功能本系统的主要功能有:用户的注册和登录,查看各种信息,在平台进行房源交易或者物品交易,可以足不出户了解就业信息,管理员可以查看用户信息,查看并修改或删除各版块的信息,对用户进行选择查看信息并操作。
    三、系统流程图
    四、数据库设计这个项目采用了关系数据库和XML数据存储相结合,运用起来比单数据库要灵活
    tb_imfornation表

    tb_user表

    五、详细设计及实现主页面

    代码


    房屋租售信息查看页面

    信息查询按钮代码


    因为一般用户的功能后面几个模块基本差不多,所以不进行过多描述,接下来介绍一下管理员模块的功能。
    管理员登录模块



    管理员页面



    信息审核页面





    信息管理页面




    六、心得体会这次的.net的网页开发让我初步对于ASP.NET有了一些了解,关于如何运用各种控件来进行自己网站的设计和网页的制作,如何连接到数据库进行网站的动态变化等等有了很多的提高和了解,初步实现了网站的开发,提高了自己的动手能力。
    0 评论 1 下载 2020-07-15 10:13:11 下载需要13点积分
  • 基于Python实现的疲劳驾驶检测

    摘 要相比于完全把神经网络当成黑盒来做训练,本文尝试了一种混合的思路:先通过人脸特征点检测获得特征点,再通过特征点预估人脸位置、角度、眼睛开合度等参数,再通过一个LSTM网络进行参数的训练,并对视频做分类。
    一、相关工作2018年CES Asia展会上,科大讯飞展示了他们的驾驶员疲劳检测系统。他们的系统能通过计算机视觉的方法,从摄像头中获取人脸朝向、位置、瞳孔朝向、眼睛开合度、眨眼频率、瞳孔收缩率等数据,并通过这些数据,实时地计算出驾驶员的注意力集中程度。我在现场体验了他们的系统,非常灵敏准确。

    二、总体思路受到科大讯飞DEMO的影响,我做本期末报告时,也希望使用这种基于特征检测、参数计算的方法。我认为,这种方法不是完全黑盒的(相比于纯CNN网络来训练图片),在可解释性上可能会好一些,此外,这种方法还能够检测并记录别的体征数据,这些体征数据也有许多挖掘价值。
    我做的实验分为以下三步:

    通过图片特征点检测的方法获得人脸特征点(如眼、鼻、嘴、轮廓)这一步可以使用著名的dlib (King, 2018)来解决,有效果较好的已训练的模型:shape_predictor_68_face_landmarks.dat。使用它,可以得到68个人脸关键点。
    预处理,通过68个关键点判断人脸的朝向、位置、眼睛开合度信息判断人脸朝向和位置的主要难度在于估计人脸的三维信息,若有三维信息,就可以用OpenCV的函数solvePnP,来计算出一个物体的朝向和位置。但是,因为单目摄像机的深度信息是缺失的,不能真正得到3d数据,所以在解人脸朝向时,需要配合一些人体测量学的统计数据(鼻根到人脸各个器官之间的距离)才行。眼睛开合度的计算比较简单,因为已经有特征点数据,所以计算眼皮之间的高度,除以眼角之间的宽度即可。为了增加特征点数量,减少遗漏掉的信息量,68个特征点也首尾相减(转换为位移),一并算入特征当中。对第二步得到的6个人脸纬度信息、2个眼睛开合度信息,和68个特征点位移信息(每个特征点换为x、y位移两个feature),一幅图144个feature,放进LSTM神经网络中进行训练,并预测。
    对图片进行人脸特征点位置检测人脸特征点检测用到了dlib,dlib有两个关键函数:dlib.get_frontal_face_detector()和dlib.shape_predictor(predictor_path)。前者是内置的人脸检测算法,使用HOG pyramid,检测人脸区域的界限(bounds)。后者是用来检测一个区域内的特征点,并输出这些特征点的坐标,它需要一个预先训练好的模型(通过文件路径的方法传入),才能正常工作。

    使用预训练好的模型shape_predictor_68_face_landmarks.dat,可以得到68个特征点位置的坐标,连起来后,可以有如图所示的效果(红色是HOG pyramid检测的结果,蓝色是shape_predictor的结果,仅把同一个器官的特征点连线)。

    三、对特征点进行预处理,得到人脸6维信息、眼睛开合度疲劳驾驶打盹时,人脸会朝下垂,有时会轻微晃动,眼睛会微眯。这和人清醒时目光向前或略微向上,头部稳定转动很不一样。这是我们对疲劳驾驶直观的理解。这些信息放入LSTM网络里训练,让机器自动辨别这些信息,有可能能达到很好的效果。因此,从图片中采集这些信息很重要。
    先讨论人脸6维信息的获得。如前文所述,单目摄像机不含有深度信息,单目的图像信息是无法估算人脸朝向的(因为相当于3维坐标投影到2维平面上,无法还原)。要把2维信息近似还原成3维信息,需要一些额外的信息(或先验知识),如人体测量学中的人脸五官平均距离 (Wikipedia, 2018)。
    这里参考了一篇论文 (Lemaignan S. G., 2016),和他的代码实现 (Lemaignan, 2018)。代码结合OpenCV和Wikipedia给出的人脸五官距离平均值,来对人脸进行建模。我基于作者的代码进行了改造,使其可以批量预处理数据集中的视频截图,并以数组的方式输出人脸6维信息数据。具体的改造和代码运行方法请看我提交的源码。
    使用本算法批量处理数据集中的所有图片。处理完成之后,便额外得到了6维特征,效果如下:

    接下来,计算眼睛开合度信息。68特征点数据分布如图所示 (Rosebrock, 2017):

    右眼开合度可以通过以下公式得到(左眼同理):

    头部6维信息、加眼睛开合度两维信息,共8维信息。如果有可能,还应该采集瞳孔朝向、瞳孔收缩率等信息,但我并没有能成功。如前文所述,一副图片只抽8个特征,信息丢失可能比较多,因此,我把68个坐标点进行一下处理,也作为特征加进去。考虑到坐标本身意义并不大,坐标位移意义反而大一些,我把这些坐标点首尾相减,换算成了位移。一个位移有x、y两个分量,所以这又是136个特征。这样,预处理就完成了。把一张图抽取为144个和脸有关的feature,可以屏蔽掉许多图片细节,如光照、肤色、头的位置(和身高有关)、背景里窗帘的飘动……(尽管可能丢掉有用的信息)。更加重要的是,一张图片变为144个数字,大大简化了输入数据,每一帧输入数据变简单,就让处理帧和帧之间关系(时序信息)变得可能(计算量不至于过大)。
    五、训练LSTM网络模型并进行分类我大学期间并没怎么接触过机器学习,所以这一步更多是依样画瓢,理解不深入。我进行了一些调查后,发现了LSTM网络,可以用来处理时序信息。我尝试了Tensorflow,但感觉还是比较难上手,后来切换到了Keras,用了Keras封装的更加高层、易懂的API。
    Keras的LSTM层输入要求是三维的数据:(样本编号,时间帧编号(timestep),特征向量),预处理完的数据正好是这样三维的,大多数的shape为:(?, 64, 144)。
    我基本就是参考Keras文档中的示例代码,搭建了一个LSTM网络 (Keras, 2018)。在LSTM层后,添加了一层Dense层,模型就搭建完成了。
    训练时,我跑了500个epoch,最终结果为:测试集上78.12%的正确率。而且因为把图片都抽成特征了,所以训练的速度非常快。效果还是比较可喜的。
    六、不足之处和提升空间的讨论LSTM的使用可能不足
    我对机器学习方面的知识所知甚少。特征提取完之后,我在模型搭建和训练这一步做得很有可能不好。如果有机器学习方面才华横溢的人能指点一下,结果很可能能有所提升。也可以试着把LSTM换成别的,如SVM、简单RNN等(疲劳驾驶检测其实可能不需要Long-term memory)。
    单目摄像机获得信息少,人脸信息估计较差
    因为人脸信息估计用到了统计学数据,但这个数据不是很精确,所以最终得到的角度估计效果并不是很好(一些帧存在跳跃现象)。换成双目摄像机,或者RGB-D摄像机,相信特征点提取的效果会好很多。如果疲劳驾驶检测要被广泛投入生产应用,那么升级硬件设备是可行的。
    基于人脸检测的图像处理健壮性略差
    用HOG pyramid方法,一些帧中检测不出人脸(可能因为光照、帽子等原因),虽然这些帧不多,但是它们对整体效果可能有比较大的影响。这些帧,我目前的处理方法是跳过(可能导致时序上不连续)。也可以尝试使用插值的方法来弥补缺失的帧。
    特征抽取仍然不足
    科大讯飞做的系统,可以抽取图片中眼球方向、瞳孔收缩率作为特征。然而本文并没能够抽取出这些特征,因此可能遗漏掉关键的信息。
    七、总结本文尝试了一种基于特征和参数估计的方法,最后一步分类时,仍然用到了深度学习的方法。受限于个人技术能力,许多可能可以进一步提升准确率的工作还没有做,本文分析了这些可能的改进策略。总体而言,实验结果还是不错的,准确率较高,模型训练快速。这足以说明,先提取特征点再使用机器学习的方法,是一条值得探索的路。
    10 评论 239 下载 2019-05-22 10:46:23 下载需要15点积分
  • 基于C#的超市进存销管理系统

    第一章需求分析1.1 需求分析1.2 用例模型及分析类图的描述1.2.1 用例Use Case:账号密码登录
    参与者:用户
    主事件流:

    用户选择账号登录选项并输入账号密码
    将用户输入的EmpLoginName和EmpLoginPwd与数据库中相应的字段进行匹配
    若匹配成功,则跳转页面,转到主窗口。反之,则提示登陆失败

    1.2.2 用例图用例模型本系统以管理员对数据库的操作为主,实现用例图如下:

    根据对用例的分析,做出用例图如上,管理员主要利用本系统,实现对进货信息、库存信息、销售信息和职工信息、供应商信息的管理。系统采用VS环境开发,实现C/S结构,管理员对各个信息的修改都直接写入数据库。
    1.3 分析类1.3.1 用户登录模块用户登录用例图
    用户登录的用例图,如图1-3-1-1所示:

    用户登录时序图
    如图1-3-1-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-1-3所示,表示用户登录的协作图。

    1.3.2 进货模块进货用例图
    进货的用例图,如图1-3-2-1所示:

    用户登录时序图
    如图1-3-2-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-2-3所示,表示用户登录的协作图。

    1.3.3 销售模块进货用例图
    进货的用例图,如图1-3-3-1所示:

    用户登录时序图
    如图1-3-3-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-3-3所示,表示用户登录的协作图

    1.3.4 库存模块进货用例图
    进货的用例图,如图1-3-4-1所示:

    用户登录时序图
    如图1-3-4-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-4-3所示,表示用户登录的协作图。

    1.3.5 职工管理模块进货用例图
    进货的用例图,如图1-3-5-1所示:

    用户登录时序图
    如图1-3-5-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-5-3所示,表示用户登录的协作图

    1.3.6 供应商管理模块进货用例图
    进货的用例图,如图1-3-6-1所示:

    用户登录时序图
    如图1-3-6-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-6-3所示,表示用户登录的协作图

    第二章 概要分析2.1 系统架构设计
    2.2 数据库设计2.2.1 数据库总体概念设计数据库总体E-R图如图2-2-1所示。

    2.2.2 数据库概念设计通过对于系统的需求分析,整套系统可以设计出六个实体,他们分别是职工实体、供应商实体、进货实体、销售实体、库存实体。
    系统的使用者涉及到多种用户,多以需要一个用户表来保存登陆账号和登陆密码。
    职工表E-R图

    职工数据库表

    供应商表E-R图

    供应商数据库表

    进货表E-R图

    进货数据库表

    销售表E-R图

    销售表

    库存数据库表E-R图

    库存数据库表

    2.3 系统类图设计分析系统,本系统主要包含数据库类和操作类。数据库类包括有进货信息数据库、销售信息数据库、库存信息数据库。操作类主要是对数据库的操作,包括有添加进货、销售、库存、职工、供应商详细信息两个操作。其中添加进货单可以对进货、销售、库存信息数据库执行添加,修改,删除、查找的操作,添加职工、供应商信息可以对物品信息数据库执行添加修改删除的操作。操作类还包含对数据的查询操作,可以根据关键字进行查询;分析以上各个类,作出类图如2-4所示。

    第三章 系统详细设计及实现3.1 系统功能描述本系统主要实现登陆注册模拟超市进货增删改查、销售增删改查、库存增删改查以及对超市内员工的增删和超市供应商的增删。
    3.2 用户登录界面用户登录界面如图3-2所示。

    3.3 职工管理功能职工管理如图3-3所示。

    3.4 供应商管理功能供应商管理如图3-4所示。

    3.5 进货管理功能进货增删改管理如图3-5-1所示。

    进货查询如图3-5-2所示。

    3.6 销售管理功能销售增删改管理如图3-6-1所示。

    销售查询如图3-6-2所示。

    3.7 库存管理功能库存增删改管理如图3-7-1所示。

    库存查询如图3-7-2所示。

    3.8 系统主页面系统主页面如图3-8所示。

    3.9 退出系统退出系统功能如图3-9所示。
    4 评论 62 下载 2019-09-02 12:27:33 下载需要13点积分
  • 基于C#和SQL SERVER 2008实现的男士服装进销存管理系统

    摘 要系统主要包括基础用户和供应商数据、货物采购、货物销售、库存清点、库存调整等功能。基础数据用于维护用户和供货商的基本信息,如所属供应商和用户、联系人、联系方式等,用户可以通过系统的基础数据模块设置系统的基本信息,方便在其他模块中使用,有助于系统在企业信息结构发生变化时能够及时响应。
    软件主要服务中小型服销售商铺或者公司,是商铺和公司完善内部管理、理顺工作流程各个环节的强有力的管理工具。系统的设计采用大量的接口,方便以后的升级或者与其他系统的整合。系统的运行基础是企业内部局域网,采用基于WinForm的C/S结构,操作界面容易使用和掌握,基本上会Windows基本操作就能很快了解并且掌握系统的使用方法。
    关键词: 服装;企业;销售;管理
    第1章 绪 论1.1 课题介绍1.1.1 男士服装进销存管理系统男士服装企业围绕进货存储销售的管理往往是很繁琐的[1]。各个企业之间的管理体制不同,采购,生产,库存,销售流程有差异,所以必须根据企业的具体情况制定系统的方案以便提高工作效率。
    我国的中小企业不仅在数量上是巨大的,在我国社会主义经济建设中扮演的角色也越来越重要[2]。我国中小企业具有活力并且能够灵活适应市场机制,促进我国社会经济发展,成为我国重要的一项经济基础。随着ERP管理系统的日益发展,大部分中小企业迫切需要借助现有的ERP在企业管理中的应用,以达到突破自身发展的瓶颈的目的。
    中小服装企业存在问题:计算机使用率低,日常工作和记录很多是通过手工处理,所以工作效率低。企业内部的沟通不够流畅,企业员工工作效率较低[3]。为了增强企业的竞争力,提高效率,企业必须实现信息化。只有配备先进的办公自动化系统,实现企业内部信息的共享和管理,加强企业内部的沟通,才能以使企业在激烈的市场竞争中稳定发展。
    1.1.2 背景从整个世界的服装行业发展来看,服装生产加工企业的生产规模越来越大,大型企业将成为市场的主角,尤其一些沿海地区来说,服装的加工占据一部分的销售量。
    1.1.3 研究目的及意义本系统是对服装企业资源如物品流、资金流、业务流等相关信息的综合管理软件系统。软件应用程序的开发目标是使中小型服装企业的的进销存方面变得更加方便,减少人工的繁琐以及出错概率,帮助企业方便高效的解决进销存管理问题。
    该系统旨在为企业管理提供丰富的信息资源管理[5]。能否充分利用信息进行企业管理,帮助用户制定出实施有效的决策,是一个衡量的ERP应用成功的标志。该系统投入实际运行后,服装企业应根据管理需要将系统的初期设计制定好,并灵活地完成系统的初始化信息维护。本着尽可能完成系统需求阶段制定的各项功能的原则,力求物品在适当的时间到达适当的地点,用户的操作空间大。业务流的处理也是在标准的业务管理方案上进行准确的及时的设计,让服装企业在管理上面不失规范和高效,并预留出大量接口方便升级或者对接。
    1.2 研究内容
    进货管理模块,包括进货入库,以及查看进货记录
    销售管理模块,包括销售记录账单,退货处理,查看销售记录
    库存管理模块,包括查看库存信息,库存之间的调转,以及库存的盘盈盘亏
    配方管理,用于维护配方的基本信息
    基础数据,包括角色管理、用户管理、供应商管理

    第2章 相关技术介绍2.1 开发环境2.1.1 硬件环境本管理系统使用PC机进行开发,其硬件配置如下:

    中央处理器:Intel(R) Core(TM) i5-3560 CPU @ 2.60GHz
    内存:8.0GB
    主硬盘:ST500LT012-9WS14 SCSI DiskDevice(500G)
    显卡:Intel(R) HD Graphics

    2.1.2 软件环境在硬件开发环境之上搭建的软件开发环境包括以下部分:

    操作系统:64位Windows8
    开发工具:Microsoft Visual Studio 2013、Microsoft SQL Server 2008 R2

    2.2 开发工具2.2.1 Microsoft Visual Studio 2013Microsoft Visual Studio 2013简介
    本系统使用的开发环境是微软的 Visual Studio 2013,Microsoft Visual Studio 是Windows Vista、Web 2.0方向的开发工具,能够设计、开发基于Microsoft windows 的工程项目。解决方案是用来管理各个项目的,对于WinForm而言,每个项目都对应着一个命名空间,管理各种类的就是项目。一个解决方案可以包括多个项目。
    Microsoft Visual Studio 2013的特点

    NET Framework对重定向的支持,使用Microsoft Visual Studio 2013可以使用多个.net 框架版本的C#规范或者类库进行项目开发
    LINQ作为一种访问数据的程序模型,使得.NET平台可以直接进行处理数据。借助LINQ可以将数据封装成对象,方便与编程模型集成

    2.2.2 SQL Server 2008 R2Microsoft SQL Server 2008简介
    SQL Server是一个微软推出的关系型数据库。SQL Server 2008功能强大,同时简化建立企业数据系统,方便用户部署和处理企业数据以及分析应用
    SQL Server 2008的特点及功能

    .NET框架主机:通过SQL Server 2008,程序开发者可以使用多种语言,比如微软的VisualC#.net和微软的Visual Basic
    XML技术:在使用互联网或者本地局域网的情况下,在不同的应用程序中传递数据的时候,使用可扩展标记语言(XML)是一个重要的解决方案。SQL Server 2008将使用自己支持的存储和查询方式引进可扩展标记语言(XML)文件

    2.3 相关技术基础2.3.1 C/S结构C/S 结构,即Client和Server结构。C/S结构减少了系统之间的通讯。Client/Server形式的结构被经常使用着,尽管现在主流采用B/S结构[8]。内部的和外部的用户可以访问新的和现有的软件系统,通过现有的系统中的逻辑迁移到新的应用系统[9]。然而,C/S结构相比较更安全。
    2.3.2 WinForm技术WinForm是使用.NET开发平台中的Windows 窗体[10]。新的数据连接方式如ODBC。Windows窗体是基于微软公共语言运行库的。开发起来较其他平台方便快捷许多。
    2.4 本章小结本章主要介绍了本系统的开发环境与开发过程中使用的工具,设计之初决定创建窗体应用,所以采用了.NET平台的WinForm技术,这样开发效率比较高而且开发比较方便简单。
    第3章 系统需求与可行性分析3.1 可行性分析可行性分析(Feasibility Analysis)是在系统开启之前系统分析的基础上,针对新系统的开发的难度是否合理以及开发系统的必要性,从经济条件,技术难度,社会发展对系统进行的研究。可行性分析可以帮助分析人员提高新系统的认识,这在一定程度上保证了新工程朝着正确反向发展。一旦发现问题并且暂时没有可行的解决方案,项目将被搁置。
    3.1.1 技术可行性
    硬件环境本系统采用Microsoft Visual Studio 2013和SQL Server 2008 R2进行开发,内存要求最低为384M,5400 RPM 硬盘 。而开发机内存8G、500G硬盘满足了这点要求。SQL Server 2008 R2其处理器要求最低为Pentium III 兼容处理器,内存要求最低为512M,硬盘空间至少需要500MB的程序空间和1GB的数据空间,开发机Intel i5处理器满足了这点要求
    系统软件采用的64位的Windows 8操作系统都是可以满足以上开发要求的
    开发工具Microsoft Visual Studio允许开发人员使用不同的编程语言,作者选用C#完全可行。SQL Server在本系统中用于对基础信息的存储
    最后,开发者对编译原理知识的储备,以及对于开发工具Microsoft Visual Studio和SQL Server 2008 R2的熟悉,都使得程序的开发在技术上是完全可行的

    3.1.2 操作可行性由系统分析可知系统用户多为企业部门领导,能够熟练使用计算机,能够使用本系统。程序界面充分考虑了用户的操作习惯,操作简单。同时程序的操作选项都有相应的提示。所以从整体来讲,该系统应具有易用性、灵活性和可视性。熟悉Windows操作系统的人都能很快地掌握该系统的使用。
    3.1.3 社会可行性整套系统面向企业流程管理,采用面向对象设计,具有良好的扩展性。系统主要包括基础数据、生产管理、采购管理、配方管理、库存管理等功能。本套系统可以帮助中小型服装企业提高生产效率。
    3.2 系统需求该系统设计的主要目的是帮助服装企业充分将此套软件应用在日常企业管理中,提高企业生产效率,减少人为数据,提升企业的生产,系统具有以下几点需求:

    首先与各个厂商进行联系,然后记录这些厂商的信息,接着跟厂商确定要购买的货物,然后再进行采购开单
    将采购到的货物入库并定期对仓库进行盘点
    前台进行货物销售生成销售单减少库存,记录到数据库
    基础数据用来维护日常所需要的信息,如角色、职务、部门、联系方式

    3.3 本章小结本章主要描述了本套系统的需求可实现的可行性,描述了系统的实现可能性与相关工具。讲述了系统所要涵盖的主要功能,以及用户使用本套系统可以获得的便利和系统设计的主要目的以及应用环境。
    第4章 系统设计4.1 概要设计一个系统的功能框架和人机交互的感官框架的形成,其目的主要反映在人机交互的界面。系统界面的功能分组、页面布局和整体样式格局,这是用户习惯和系统设计之间的纽带。系统研究和用户的目标和需求的无缝集成的设计是转化为具体的界面设计的一个重要阶段。
    概要设计的主要目的是根据需求分析将系统的整体功能体系架构和各个模块的联系进行规划。设计出软件的整体结构有助于系统的框架功能的开发并在前期给客户展示一些系统涵盖的功能范围。数据结构的设计包括数据的分享,设计出数据结构,数据库的生成与优化。
    男士服装进销存管理系统包含如下几大模块:采购、库存、生产、配方的管理、基础数据维护。各个模块相互协作共同完成企业的业务流程。系统框架如下图所示。

    各个模块功能介绍

    常用事物模块主要是完成采购开单、采购批准、采购执行管理VIP、前台销售操作
    其他事物模块主要是仓库管理、库存调整完成物品的数量的维护和库存信息的设置与维护
    系统设置模块主要是对供货商和使用该系统的用户进行数据的设置,以便系统能够灵活稳定的运行

    4.2 详细设计详细设计主要是对算法和数据结构和特定的计算机语言实现各模块的实现初步描述。定义各个模块直接通信的接口,与数据库连接的统一接口和实现,为正式开发制定规范。
    更改详细设计方案,不能对概要设计方案造成影响;详细设计阶段要出几篇文档,包括详细设计文档和模块设计方案。每个模块的详细设计文档都应该形成规范并以文档的形式公布。详细设计的任务包括:

    确定每个模块的算法的使用,一个合适的工具来表达算法的过程中选择,掌握每个算法的优缺点
    为模块内的数据结构进行设计。将需求分析、概要设计阶段确定的概念性的数据类型进行确切的定义
    这个阶段我们将设计出系统开发中使用的大量的接口,接口的规范有助于开发人员程序书写的条理性和一致性的约束。采用接口还有助于我们本套系统与其他遗留系统的整合与集成。对于后期的维护和功能修改,采用统一的接口的方式将会使后期的开发方便快捷

    4.2.1常用事物详细设计
    采购货物:采购部门根据库存量或者公司数据开具采购单,然后和有关部门联系采购货物,将货物信息录入到系统中
    前台销售:销售部门根据当前系统中存的货物信息进行职能销售,并生成销货单
    VIP管理:前台销售部门根据用户的购买情况,对一些特殊顾客开通VIP服务,可以进行打折服务

    4.2.2 其他事物详细设计
    库存盘点:根据要求进行盘盈盘亏调整,并定期记录到数据库当中
    库存调整:如果服装企业存在多个仓库,可以进行货物的调整并调整仓库中的库存数量
    退货管理:如果销售的货物客户要求退货,可以使用退货管理来对退货进行详细的记录

    4.2.3 系统设置详细设计此模块会对系统的一些参数以及用户和供应商的相关数据进行设定,以便后期来方便的使用。
    4.3 界面设计4.3.1 界面设计采用WinFormWinForm自身包含了大量的窗体控件,当然,设计者也可以通过给定的接口来设计自己的窗体控件。本着简洁方便的原则,通过使用微软提供的窗体控件使得程序风格统一并且与用户日常接触的习惯一致。通过为按钮等控件赋予一些声音和颜色特性,给用户更好的反馈效果。
    4.3.2 主页面设计系统主页面分为三个部分,最上面是菜单栏(MenuStrip),菜单栏有功能菜单、用户名、退出、帮助等菜单选项。左侧是工具栏(SideBar),用户登录进来后所拥有的功能都在这里显示。中间最大的区域是业务操作区,单击左侧功能项之后弹出的窗口都将在此显示。系统主页面如下图所示。

    4.3.3 数据表格设计系统为数据表格设计了统一的表现形式。数据表格提供按条件查询的功能,用户可以根据条件查询所需数据。用户可以自定义页面显示数据的数量、刷新数据表格。用户可以选中整条数据进行相应的业务处理,比如批准某条记录。数据表格同时提供拖拽功能,用户可以根据自己的需要或者爱好调整各数据列的显示大小,同时系统提供打印的功能,可以将当前表格数据打印出来。当数据过多时,自动生成滚动条。提供的下拉框和查询功能能够让用户快速定位到需要的数据。数据表格支持立刻刷新,当用户完成操作时,数据表格也马上进行更新,这样就保证用户能够及时方便地看到操作后的结果。数据表格如下图所示。

    4.4 本章小结本章描述了系统的整体功能设计,每个模块流程的详细设计,还有数据库设计。展示了几个主要界面的设计效果,还有为了方便用户或者提升用户体验而设计的一些解决方案与一些主流的设计。
    第5章 系统实现5.1 基础数据模块实现拥有权限的用户可以对系统的角色、部门、职务、规格、单位、仓库等信息进行管理。用户根据公司的管理结构设定职务与部门,基于业务流程与物品信息维护物品规格与单位。通过设定角色并将角色赋予用户,从而实现权限管理。页面如下图所示。

    5.2 进货管理模块实现进货管理首先包括最基本的信息维护。采购商品拥有编码、名称、规格、单位属性,为了库存管理,商品还具有库存上限与库存下限。用户可以查询、添加、删除和修改商品信息。商品管理如下图所示。

    供应商拥有编码、名称、邮编、联系人等属性。用户可以查询、添加、删除和修改供应商信息。供应商管理如下图所示。

    选中某一行数据,然后点击修改按钮即可弹出修改供应商信息的对话框。修改供应商信息如下图所示。

    5.3 库存管理模块实现库存管理模块主要是协助采购、生产、销售等模块进行业务最终的入库操作。并负责各物品库存信息维护和仓库状态查询。库存管理模块交由库存管理人员进行使用,因为库存管理在业务流程中比较重要,而且通常是整个业务流的终点,所以库存管理模块经常需要与其他模块合作。采购入库如下图所示。

    选中某一条记录然后点击修改按钮,下方会将数据显示出来在进行修改提交即可,因为库存数据比较重要而且一般情况下由系统自行维护,比如采购入库完成的时候系统会将对应原料的库存数量增加入库的数量,出库时则减少库存数量,所以每次人为更改都会有记录。库存的修改界面如下图所示。

    5.4 本章小结本章主要通过截图的方式展现了系统的主要功能架构,通过演示一个流程的步骤给用户简单讲解了系统的使用方法和效果。针对有特色的几个功能模块都进行了截图描述。
    第6章 结论与展望6.1 结论本系统服务的对象是中小型服装企业,主要包含的模块有基础数据、进货管理、销售管理、库存管理和配方管理。采购、销售两大流程贯穿各个模块,并且经过缜密的设计后符合企业的实际业务流程。在系统的过程中我学到了并使用到了很多技术,包括WinForm、SQLServer,最重要的是学习能力得到了很大提高。
    从系统功能来讲,基于WinForm的服装企业综合管理系统采购管理子系统的功能达到了预期的效果,程序界面设计的水平也得到了很大提高。
    6.2 展望虽然目前男士服装进销存管理系统已经能正常使用,但是因为个人的能力以及开发周期等原因仍然存在许多不完善的地方,系统有待于进一步改正。目前正朝着几个方向努力:

    进一步方便查看,比如,在查看记录时,可以采用一个输入框供用户填写起止日期来查看在期望期间的记录
    进一步接口化,争取使系统内部融合的很好,并争取与历史遗留或者其他开发者的系统兼容。各个模块要设计出合理的接口以便以后扩展
    软件的各项显示可以实现定制化,比如,采购记录中的各项信息比较多,业务人员可以根据自己的需要和喜好选择自己想要看到的信息项
    引入智能化的思想,系统能根据库存的数量与上下限提示用户该进行相应的操作
    2 评论 58 下载 2018-11-05 16:22:04 下载需要12点积分
  • 基于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也有了新的认识,也知道了要有坚持不懈,不惧困难的精神,才能取得成功。一个简单的系统,每一个细节都需要在实践中去挖掘并进行进一步的修改完善。本次课设让我们受益匪浅,在分析问题以及解决问题等方面的能力有所提高,也是一次很好的同学之间交流合作的机会。数据库技术的用途很广,还有很多值得我们学习,希望今后能有更多这样的机会。
    12 评论 196 下载 2019-01-01 21:08:08 下载需要18点积分
  • 基于SSM的网上购物系统的设计与开发

    摘 要本论文主要对网上购物商城的设计与开发进行了一些论述,包括了系统的设计和实现一共两个大部分,设计部分主要对系统和数据库的分析与设计进行了描述;实现部分主要包括系统的各个功能的实现。
    网上购物商城包括两大模块:前台用户模块和后台管理员模块,前台用户可以通过浏览器客户端页面进行登陆和一系列的购物操作。后台管理员可以查看所有用户的所有信息;可以对网站中所有的商品分类进行修改,同时也可以对所有用户的订单状态进行查看。
    系统前台通过JSP页面来来展示数据,后台基于java技术和eclipse (朱诺)和tomcat 7.x开发,前台运用html+css技术渲染页面,后台使用springmvc、spring、myBatis对数据进行封装和操作,该系统运用MySql 5.X 数据库进行数据的维护。页面美观,使用方便。
    关键词:MySql数据库; JAVA; SSM;网上购物商城
    AbstractThis paper mainly focuses on the clothing sales system design and development of a number of paper, including the system design and implementation of a total of two parts, part of the system design and database analysis and design were described; the realization part includes the various functions of the system.
    Clothing sales system includes two modules: front user module and the background administrator module, the front desk users can browse through the browser client page and a series of shopping operations. The background administrator can view all the information of all users can be on the site of all the clothing category to modify, but also for all users to view the order status.
    In front of the system through the JSP page to display the background data, Java technology and based on eclipse (Zhu Nuo) and Tomcat 7.x development, the use of html+css technology to render the page, the background using springmvc, spring, myBatis package and operation of data, the system uses MySql 5.X database for data maintenance. Beautiful page, easy to use.
    Keywords: MYSQL DB;JAVA;SSM;CLOTHING SALES SYSTEM
    1 绪论1.1 研究背景在如今这个信息时代,“网上购物”这种购物方式已经为越来越多的人所接受。在这种背景之下,一个安全稳定并且强大的网络购物平台不可或缺,在这种成熟的市场需求的推动下,在先进的信息技术的支持下,商品产品销售系统应运而生。它可以使消费者和商家更紧密地联系起来,以更快地满足顾客的需求,也可以让用户选择自己真正喜欢的商品。目前市面上已经有此类的网上购物商城,但是现有商品网站系统或多或少存在着功能比较单一、维护比较复杂、操作比较繁琐等问题。有的系统甚至直接采用静态网页发布商品商品信息,这些因素在一定程度上限制了网上购物商城在目前市场上的推广。如何开发出费用低廉、功能强大的系统正是我们需要解决的课题。
    1.2 目的和意义本软件旨在降低商品销售商家的工作强度,提高工作效率,大大地减少了操作员手工录入数据的工作量,极大限度的避免了人力浪费,有效避免重复操作时间消耗;而且此软件方便了用户对自己所需商品的查询和购买,打破了传统的销售模式,极大限度的方便了用户。商家应用此软件之后,可以拓展销售门路,增加销售业绩。应用此软件是为了在传统销售模式之外,再开辟一条销售通路,减少库存堆积,利用网络共享和互动的优点,结合地面销售的优点,借助数据库管理技术,开发此平台,是为了实现规范化、个性化、人性化的商品网上销售。此软件的数据统计分析功能灵活完善,稳定安全、使用方便、界面友好、操作简单,可以成为一个能真正帮助商品销售行业管理发展的有力工具。
    1.3 开发工具及技术该网上购物商城前端使用了jsp来实现数据的展示,后端通过java代码来对数据进行一系列的操作,前端使用了原生的html页面技术进行渲染,同时也加入了jquery技术制作了一下控件效果,后端使用了经典的spring技术对整个系统进行统一调度,使用springMvc框架实现了前端和后端的交互。开发工具使用了Eclipse以及tomcat服务器,同时使用了Mysql数据库对数据进行存储和维护。
    在该系统实现的过程中,使用spring和springMvc的同时后端还使用了MyBatis技术对数据进行封装和操作。前端还采用了dtree框架规范了页面的显示。整个系统的架构也是基于经典的mvc设计模式来设计的。
    Mybatis是一个经典的后端开源框架,它的前身就是iBatis,MyBatis的执行原理是应用程序根据XML配置文件创建出SqlSessionFactory,然后SqlSessionFactory根据配置文件或者注解创建出SqlSession,SqlSession这个对象包含了所有的执行sql所需要的所有方法,可以通过SqlSession这个实例执行所有的方法对数据库进行操作,操作结束后执行相应的事物控制,本系统中的事物控制全部交由spring容器进行统一调度,本次采用的是spring的申明式 方式。MyBatis相对于 其他的ORM框架具有很多的优点,比如mybatis本身属于轻量级框架简单易学,没有第三方的依赖。mybatis比较灵活,开发人员可以自己编写sql语句来对数据进行操作。mybatis提供了xml标签,支持编写动态sql.
    dtree框架就是一个简单的树形菜单js组件,开源免费,自身不需要复杂的操作,同时也支持动态的将数据引入jsp页面。
    MVC模式是一种软件架构模式。它将系统分为三个部分:模型,视图和控制器。MVC模式出现的目的就是方便了后续程序的修改和扩展简化,同时使系统中某一段代码的重复利用成为可能。此模式降低了模块之间的耦合度,对自身各个部分进行了分离的同时也使得各个部分具备了应有的功能。
    Spring是从实际开发中抽取出来的开源框架,为企业的开发提供一个轻量级的解决方案。该解决方案包括:基于Ioc(控制反转)的核心机制,以及AOP(面向切面编程)的思想,能与多种持久层技术的整合,是优秀的Web MVC框架等。Spring致力于Java EE应用各层的解决方案而不是仅仅专注于某一层的方案,它贯穿表现层、业务层、持久层,降低各层组件的耦合度,实现软件各层的解耦.Spring内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的。还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
    2 需求分析2.1 功能需求分析2.1.1 网站前台功能
    首页:提供一个网站首页,显示该企业的商标,该网站用户的登录,注册,所有商品的一级分类,热门商品和最新商品的展示等
    用户的注册:针对还未注册的用户完成注册功能的使用,在注册的过程中涉及数据的合法性校验,以及利用ajax完成用户名是否已被注册的异步校验
    用户的登录:对于已经注册并且激活的用户提供的登录操作
    用户的退出:对于已经登录的用户,退出系统
    首页商品展示:展示出最新商品和热门商品
    分类页面商品展示:根据一级分类和二级分类去展示该分类下的所有商品
    商品详情展示:点击某个商品时可以展示该商品的具体详细信息
    购物车:用于存放用户的购物内容,用户可根据自己的情况修改自己的购物车
    订单:对于已经登录的用户可以对购物车内容进行付款生成订单,可以为自己的订单进行付款或者查看
    留言评价分享:网站单独开辟了留言分享区域,供登录的用户自由发表评价分享心得信息,进行交流互动

    2.1.2 网站后台功能
    管理员登录:管理者根据账户和密码进行登录
    商品一级、二级分类管理:管理者可以对前台显示的一级、二级分类进行管理,包括添加、删除、修改操作
    商品管理:管理者可以对前台显示的商品进行管理包括添加,修改,删除,查询的功能,也可以上传商品的图片
    用户管理:管理者可以查看该网站中已经注册过的所有用户的所有信息

    2.2 性能分析响应时间:忽略网络、硬件以及插件的因素,以本地测试为准,前台响应时间为0.8秒,后台操作响应时间:0.9秒。
    2.3 系统用户用例图用户用例图
    用户为系统的使用者,可以通过前台注册激活登录后进行一系列的购物操作。

    管理员用例图
    管理员是整个系统的最高权限拥有者,他用于对所有用户的所有信息的查看,网站商品显示的增删改查,更换图片,所有商品所属一级二级分类的修改。

    3 系统设计3.1 系统的总体设计该系统的开发采用B/S模式,整个系统的构建基于ssm(Spring+SpringMvc+MyBatis)整合框架。
    深入研究JavaEE体系结构,所项目的技术选型中选取的个个框架分别进行分析和研究。SpringMvc是一个web端框架。Mybatis是一个轻量级的持久层框架,以面向对象的方式提供了持久化类到数据库之间的映射,是一种优秀的ORM框架。Spring也是一种轻量级框架,它的IOC和AOP思想,值得架构师学习。通过三大框架的整合,可以很方便的构建出可扩展,可移植,可维护的软件系统。
    SSM框架是目前J2EE领域中最热门而且用的比较成熟的一套开源框架,它是基于MVC设计模式之上,充分发挥了MVC的优点。SSM是一套轻量级框架,相对于EJB而言,SSM继承了它的优点的同时,在开发和执行效率上也有了明显的提高,而对于开发者而言,它比EJB更加易学和掌握。目前SSM框架也正在不断地进行优化和维护,运行也是越来越稳定。
    根据以上功能分析,得到系统功能模块结构图如图3-1所示:

    3.2 数据库的分析与设计数据库,我们可以形象的将它称为一个仓库,因为它一般被用来存放汉字、字符、数据、货币、日期等信息,并且对这些信息按照一定规则存放,对数据进行安全、低冗余性、规范的进行集成化管理。从发展的历史历程来看,数据库可以看成是由文件管理系统发展而来的。
    数据库的基本结构可以分为三个层次包括物理数据层、概念数据层、逻辑数据层。数据库不同层次之间的联系是通过映射进行转换的,数据库的特点包括实现数据共享、减少数据的冗余度、数据的独立性、数据实现集中控制、数据一致性和可维护性。
    本系统采用的的数据库是Mysql5.0,本系统所有与数据库相关的开发都遵循Mysql5.0数据库开发原则。
    3.2.1 数据库概念设计用户实体
    用户实体包括编号、用户账号、姓名、联系方式、性别、用户状态、用户邮箱和密码等属性。用户实体的实体联系图(E-R图)如下所示:

    管理员实体
    管理员实体包括编号、账号和登录密码属性。管理员实体的实体联系图(E-R图)如下所示:

    商品实体
    商品实体包括商品id、商品名称、市场价、商场价、商品图片、商品描述、上架日期、所属二级分类id。商品实体的实体联系图(E-R图)如下所示:

    订单实体
    订单实体主要包括订单id、订单总价、订单状态、收货人、收货地址、收货电话、下单时间、购买者id、购买商品id。订单实体的实体联系图(E-R图)如下所示:

    3.2.2 数据库物理结构为该系统设计了7张表,在这里列出7张表分别为如下所示:



    数据表
    描述




    adminuser
    后台管理员表


    category
    一级分类表


    categorysecond
    二级分类表


    orderitem
    订单项表


    orders
    订单表


    product
    商品表


    user
    前台用户表



    管理员表主要记录了管理员的基本消息,表结构如表3-1所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    id
    int(11)
    YES
    YES
    账号


    username
    varchar(1000)
    NO
    NO
    用户名


    password
    varchar(1000)
    NO
    NO
    密码



    一级分类表主要记录了一级分类的基本信息,表结构如图3-2所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    cid
    int(11)
    YES
    YES
    一级分类ID


    cname
    varchar(1000)
    NO
    NO
    一级分类名



    二级分类表主要记录了二级分类的基本信息,表结构如图3-3所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    Csid
    int(11)
    YES
    YES
    二级分类id


    Csname
    varchar(1000)

    NO
    二级分类名称


    cid
    varchar(1000)

    NO
    所属一级分类id



    订单项表主要记录了订单项的基本信息,表结构如图3-4所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    Oiid
    int(11)
    YES
    YES
    订单项id


    count
    varchar(1000)


    购买数量


    subtotal
    double


    单项总价id


    Pid
    int(11)


    所购商品id


    cid
    int(11)


    所属订单id



    订单表主要记录了订单的基本信息,表结构如图3-5所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    oid
    int(11)
    YES
    YES
    订单id


    money
    double


    订单总价


    state
    Int(11)


    订单状态


    Receiveinfo
    Varchar(255)


    收货地址


    phonum
    Varchar(255)


    收货人电话


    Order_time
    datetime


    下单时间


    Uid
    Int(11)


    所属用户id



    商品表主要记录了商品的基本信息,表结构如图3-6所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    Pid
    int(11)
    YES
    YES
    商品id


    Pname
    Varchar(255)


    商品名称


    Market_price
    Int(11)


    市场价


    Shop_price
    Varchar(255)


    商城价


    image
    Varchar(255)


    商品图片


    Pdesc
    Varchar(255)


    商品描述


    Is_hot
    int(11)


    是否热门


    Pdate
    datetime


    商品上架日期


    csid
    int(11)


    所属二级分类id



    前台用户表主要记录了前台用户的基本信息,表结构如图3-7所示。



    字段
    数据类型
    允许空值(默认NO)
    自动递增
    备注




    Uid
    int(11)
    YES
    YES
    用户id


    Username
    Varchar(255)


    用户名


    password
    Varchar(255)


    用户密码


    Name
    Varchar(255)


    用户真实姓名


    Email
    Varchar(255)


    用户游戏


    Phone
    Varchar(255)


    用户手机号


    Addr
    Varchar(255)


    用户地址


    State
    int(11)


    用户状态



    3.3 小结本章主要是对数据库进行了设计和说明。对数据库的概念设计思路和物理结构进行了详细的说明,并对数据库中涉及到的实体进行了说明。
    4 系统主要功能实现4.1 系统注册页面实现4.1.1 客户端用户注册用户登录网站出现页面,点击“注册”,进入注册页面,填写数据,点击注册按钮进行注册,注册完之后保存数据库表中,即可登录网站。
    注册效果如图4-1所示:

    var username = document.getElementById("username").value;var xmlHttp = creatXMLHttpreauest();xmlHttp.open("GET","${pageContext.request.contextPath}/registFindByid.action?username="+ username, true); xmlHttp.send(null); xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { document.getElementById("span1").innerHTML = xmlHttp.responseText;
    服务器端二次数据合法性校验(此处采用的配置文件加注解的方式)
    user.username.length.error=用户名的名字的长度必须是1至30user.email.notNull=邮箱不可为空@Size(min=2,max=30,message="{user.username.length.error}") private String username; @NotNull(message="{user.email.notNull}") private String email;
    4.2 系统登录页面实现4.2.1 用户登录用户在注册后,在客户端登录页面输入正确的用户名和密码,进入网站进行购物。 程序运行如下图4-2所示:

    设计思路
    编写用户登录的页面login.jsp,用户在首页点击“登录”按钮后,浏览器跳转到登录页面,用户可以填写用户名和密码进行登录,当用户填写用户名并使光标移开 时,触发onblur()事件,进行ajax异步请求,判断用户名是否可以登录,用户在填写验证码时可以点击图片,进行跟换验证码,触发onclick=”change()” 事件进行更换,当用户点击“登录”按钮时,服务器进行数据判断,如果用户名和密码都正确则跳转到首页并显示该用户的用户名,如果有错误则跳转到msg.jsp全局页面显示错误消息。
    4.2.2 管理员用户登录后台管理员通过访问正确的路径之后进入到管理员登录页面,如果访问的不是正确页面但出现了admin路径则自动跳转到admin页面,然后输入正确的用户名和密码进行登录,如果出错,服务器会将错误信息回显到登录页面,如果正确则跳转到管理员页面。
    程序运行结果如图所示,图4-3显示了管理员登录的页面,图4-4则是管理员登录成功后的主页面:


    4.3 系统前台功能实现系统前台页面包括以下几个部分:首页一级分类,热门商品,最新商品的显示,二级分类的显示,已登录用户的订单以及用户所操作过的购物的展示,其中一级分类和二级分类在各个页面中都有所设计,因此这里采用的是页面包含技术。
    4.3.1 一级分类模块查询一级分类描述
    本系统中首页显示的一级分类都是存放于数据库中,当用户访问该网站首页的同时就查询了一级分类。一级分类显示效果如图4-5所示:

    设计思路
    一级分类展示于系统的首页,当用户访问index.action时,最终跳转至系统首页即index.jsp,跳转之前,服务器内部已经进行了一级分类的查询,并将已经查询到的以及分类存放于List集合中,最终存放于session域中。
    查询某个一级分类描述
    用户在进入系统首页时,当点击一级分类时就要求查询系统在下一个页面中显示出该一级分类中包含的所有二级分类。查询某个二级分类的效果图如图4-6所示:

    设计思路
    当用户点击首页中的一级分类时系统则根据此一级分类的id查询出该一级分类下所有的二级分类,并存放于session域中,将页面进行跳转,并进行展示。
    主要代码
    request.getSession().setAttribute("cid",cid);PageBean<Product> proPageBean = productService.findProductyBycid(cid,page);model.addAttribute("pageBean",proPageBean);return "category";
    4.3.2 商品模块查询最热商品描述
    当用户访问该网站时,首先显示的是网站的首页,首页中将显示本网站中最热的商品。程序运行结果如图4-7所示:

    设计思路
    用户访问首页index时,根据路劲“/index.action”首先调用的是系统的index.action,最后跳转至系统的首页index.jsp,因为最热商品显示于首页中,因此在页面跳转之前必须前往数据库查询出本系统中所有的热门商品,因此使用了findHotProduct()这个方法,由于首页中仅仅显示了最新商品中的前十个,因此这里是使用的分页查询,最终查询的结果是一个list集合,最终保存在Model中。
    前段控制层代码
    List<Product> hList= productService.findHotProduct();
    service层代码
    List<Product> list = productMapper.selectByExample(example);
    查询最新商品描述
    当用户访问该网站时,首先显示的是网站的首页,首页中将显示本网站中最新的商品。程序运行结果如图4-8所示:

    设计思路
    用户访问首页index时,根据路劲“/index.action”首先调用的是系统的index.action,最后跳转至系统的首页index.jsp,因为最新商品和最热商品一样都是显示于首页中,因此在页面跳转之前必须前往数据库查询出本系统中所有的最新商品,因此使用了findNewProduct()这个方法,查询最新商品的依据是商品被上传的时间,根据时间来进行排序,由于首页中仅仅显示了最新商品中的前十个,因此这里是使用的分页查询,最终查询的结果是一个list集合,最终保存在Model中。
    前端控制层代码
    List<Product> nList =productService.findNewProduct();
    service层代码
    ProductExample example = new ProductExample();ProductExample.Criteria criteria = example.createCriteria();example.setOrderByClause("pdate DESC");example.setBeginPage(0);example.setEnd(10);
    查询分类商品描述
    用户在点击首页的一级分类时,系统自动跳转页面,同时要求在右面显示某个二级分类下的商品。程序运行结果如图4-9所示:

    设计思路
    首先导入页面,页面和查询二级分类下的商品使用的是同一个页面category.jsp。当用户点击按钮时,客户端向服务器请求发送请求并携带一级分类的主键id,因此服务器端应该接受参数并使用这个参数来调用方法然后去数据库进行查询数据,最后将查询出的数据把保存于Model中,最后跳转页面。
    由于页面大小的关系,这里仅仅显示12个商品,因此这里采用了分页查询,并在右下角设置相应的按钮,方便用户来回查看该分类下所有的商品。
    前端控制层接收参数并调用service层代码
    //根据一级目录查找二级目录下面的商品productService.findProductyBycid(cid,page);model.addAttribute("pageBean",proPageBean);
    Servive层代码
    int totlePage = 0;totlePage = productMapper.countProducyByCid(cid);if(Math.ceil(totlePage % limitPage)==0){totlePage=totlePage / limitPage;}else{totlePage=totlePage / limitPage+1;pageBean.setTotlePage(totlePage);int beginPage= (page-1)*limitPage;
    查询二级分类商品用户在点击首页的一级分类时,系统自动跳转页面,并且在页面的左面显示所有一级分类包含的二级分类,同时要求在右面显示某个二级分类下的商品。程序运行结果如图4-10所示。

    设计思路
    首先编写页面category.jsp,这个页面用来显示某个二级分类下的所有的商品,当用户点击二级分类时系统访问对应的action,并且携带参数(相应二级分类的主键id),到前端控制层,然后findCategorySecond1()方法接收主键id和分页的数目去product表查询商品,最终将查询到的结果存放于Model中。由于页面大小的关系,这里仅仅显示12个商品,因此这里采用了分页查询,并在右下角设置相应的按钮,方便用户来回查看该分类下所有的商品。
    前端控制层接收参数并调用service层
    // 根据csid来分页查询商品PageBean<Product> proPageBean = productService.finbProductByCsid(csid,page);model.addAttribute("pageBean",proPageBean);
    查询商品信息用户再浏览该商场,查看某个商品的详细信息。程序运行结果如图4-11所示:

    设计思路
    首先编写页面,这里使用的是product.jsp,在这个页面中显示了以及分类的信息,还有每个一级分类下的二级分类,右下方是某个商品的具体信息,其中包括商品的名称,商品的商城价和市场价,包括一个选择框,用于用户选择购买数量,最下面则是商品的具体介绍。当用户点击某个想要查看的商品图片时,其实就是点击了某个超链接,向服务器发送链接并携带参数(商品的主键id),服务器端接收这个参数,并使用这个参数去数据库中查看这个商品的具体信息最后封装于product中,最终存放于Model中。
    前端控制层接收参数并调用service层,Service层直接调用Mybatis提供的mapper接口
    //根据pid来查询商品Product product = prodcutService.productFindByPid(pid);model.addAttribute("product", product);
    4.3.3购物模块添加到购物车对于已经登录的用户,可以将看中的商品具体信息保存于自己的购物车中。

    设计思路
    首先编写cart.jsp用于显示登录用户的购物车,如果用户没有登录会有提示,用点击查看商品的详情之后会出现一个“加入购物车”按钮,当点击此按钮时,自动访问服务器,并通过隐藏表单携带参数(商品的主键id),服务器端在接受此参数,并接收用户选购的数量,最终保存于我们为每个用户在session域中创建的cart。最后进行页面跳转,在cart.jsp中展示购物车的信息,主要包括:商品的具体信息和每项的价格和购物车的总价。对于已登录用户的页面,可以看到一个购物车的图标,用户可以查看自己的购物车。
    主要代码
    //添加到购物车Product product = productService.finbProductByPid(pid);//存进一个购物项CartItem cartItem = new CartItem();cartItem.setCount(count);cartItem.setProduct(product);cartItem.setSubtotle(count*product.getShopPrice());//存进购物车Cart cart=getCart(request);cart.addCart(cartItem);
    从购物车中移除商品用户点击购物车页面中每个购物项后面的删除按钮即可删除该购物项。程序运行结果如图4-13所示:

    设计思路
    当用户点击 “删除”按钮时,向服务器端进行请求,并携带参数(商品的主键id),服务器端在设计购物车时采用的是用Map集合存储的,key值即商品的id,因此删除的时候只需从session中拿到购物车直接根据主键删除,最后将页面重定向到cart.jsp.
    主要代码
    Cart cart=getCart(request);cart.delProFromCart(pid); //删除某个购物项
    清空购物车用户点击“清空购物车”按钮,购物车里面的购物项全部删除。程序运行结果如图4-17所示:

    设计思路
    当用户点击 “清空购物车”按钮时,向服务器端进行请求,服务器端收到请求之后,从session域中取出cart购物车,由于cart在设计的时候使用的是Map集合,所以只需调用Map中的clear()方法即可,并且还需将购物车的总价改为0,最后将页面重定向到cart.jsp.
    主要代码
    // 清空购物车Cart cart=getCart(request);cart.clearCart();
    4.3.4 订单模块生成订单当用户点击“生成订单”按钮时,页面跳转至order.jsp,并让用户填写相关信息。程序运行结果如图4-15所示:

    设计思路
    首先编写order.jsp页面,其中包含用户的购物信息和收货地址、收货人和联系方式。当用户点击cart.jsp中的生成订单按钮时,向服务器发送请求,服务器端从session域中拿到cart中的信息,并将这些信息保存于order表中,此时,需要清空购物车并且将订单信息保存到session域中,最后跳转到order.jsp页面让用户填写相关信息,并付款。
    主要代码
    Orders orders = new Orders();Cart cart = (Cart) request.getSession().getAttribute("cart");User loginUser = (User) request.getSession().getAttribute("loginUser");if(loginUser==null){ model.addAttribute("message", "对不起您还没有登录"); return "msg";}//生成订单
    我的订单用户对自己的选购的商品所生成的订单项进行付款。即可生成订单,进入我的订单列表界面;程序运行结果如图4-16所示:

    设计思路
    为订单付款页面还是使用的是order.jsp,当用户点击cart.jsp中的提交按钮时,页面进行跳转并显示相关的订单信息,此时,用户可以暂时不对订单进行付款,此时订单的状态为0。如果用户在生成订单的同时一并付款,或者点击用户的最上方右边的红色字体“我的订单”时,页面会进行跳转,并显示该用户的所有订单和订单的状态,此时想要付款则点击按钮“付款”,也会跳转到order.jsp,此时需要用户填写订单的具体信息,包括收货地址、收货人、联系方式以及付款的银行,此时客户端和服务器端一样会进行非空和数据合法性校验,当用户填写好信息并点击“付款”按钮时,其实就是服务器端拿订单的具体信息,并将订单的状态改为“1”,同时将用户填写的关于收货的信息保存于数据库order表中,最终服务器端会将页面重定向到orderList.jsp,向用户展示他的所有的订单以及订单的具体信息。在orderList.jsp中展示该用户的所有订单时采用的是分页查询,在订单的右下角同时也设置了按钮,方便用户查看自己的所有按钮。
    4.3.5 留言模块留言板当用户点击“留言板”按钮时,页面跳转至messageList.jsp,并让用户填写相关信息。程序运行结果如下图所示:

    4.4 系统后台功能实现4.4.1 用户模块查询用户管理员进入后台管理页面之后,当他点击“用户管理”按钮时,则在主页面中显示所有用户的详细信息。程序运行结果如图4-17所示:

    设计思路
    先编辑list.jsp页面,当用户点击“用户管理”按钮时,服务器端收到请求,调用service层的admin_findAll()方法由service 层调用myBatis提供的mapper接口,返回一个list集合,最终所有信息封装于Model中将页面跳转到list.jsp并进行展示。
    主要代码
    if(adminuserLogin==null){ request.getSession().setAttribute("message","对不起您还没有登录"); return "admin/index";
    4.4.2 一级分类模块添加一级分类此功能属于管理员的权限范围内,用户管理员为网站添加新的一级商品系别。程序运行结果如图4-18所示:

    设计思路
    首先编写add.jsp页面,当用户在一级分类list.jsp页面点击“添加”按钮时, 服务器将页面跳转至add.jsp,在此页面共有三个按钮,“确定”按钮用于提交信息,“重置”按钮清空表单中的内容,“返回”按钮返回前一个页面。当用户填写好要添加的一级分类的名称之后点击“确定”按钮,服务器端接收此表单中的内容,然后调用service层的addCategory()方法,将新增的一级分类保存到数据库category表中,最后将页面重定向到list.jsp页面,展示所有的一级分类。
    主要代码
    Category addCategory = new Category();addCategory.setCname(cname);categoryService.addCategory(addCategory);
    修改一级分类此功能属于管理员的权限范围内,管理员用户修改网站中各大服饰的一级分类的名称。程序运行结果如图4-19所示:

    设计思路
    首先编写edit.jsp页面,当用户在一级分类list.jsp页面点击“添加”按钮时, 服务器将页面跳转至edit.jsp,在此页面共有三个按钮,“确定”按钮用于提交信息,“重置”按钮清空表单中的内容,“返回”按钮返回前一个页面。当用户填写好要修改的一级分类的名称之后点击“确定”按钮,服务器端接收此表单中的内容,然后调用service层的adminCategory_update()方法,将修改的一级分类更新到数据库category表中,最后将页面重定向到list.jsp页面,展示所有的一级分类。
    删除一级分类后台管理员点击每个一级分类后面的删除按钮即可删除该一级分类。程序运行结果如图4-20所示:

    设计思路
    当用户点击每个一级分类后面的“删除”按钮时,服务器接收到请求然后接收携带过来的参数(一级分类主键id),当我们准备删除一级分类时,如果删除了改一级分类那么相应的二级分类和二级分类下的商品就得全部删除,因此我们根据myBatis的规则。先根据外键删除二级分类然后再删除一级分类,因此首先调用adminCategorySecond_deleteByCid(cid)删除二级分类然后再调用categoryService.deleteCategoryByCid(cid);删除一级分类,最终将页面重定向到list.jsp页面。
    主要代码
    categorySecondService.adminCategorySecond_deleteByCid(cid); categoryService.deleteCategoryByCid(cid);
    查询一级分类管理员点击“一级分类管理”按钮时,展示所有的一级分类的详细信息。程序运行结果如图4-21所示:

    设计思路
    首先编写list.jsp页面,当管理员用户点击“一级分类管理页面”按钮时,服务器端接收请求然后调用adminbFindCategory()方法最终由service层调用myBatis提供的Mapper接口将所有的一级分类的信息查询出来保存到list集合中,最终保存到Model中并将信息进行展示。考虑到一级分类比较多,这里使用了分页查询,在页面展示的效果就是每页显示固定的个数,并在右下角提供了相应的按钮方便用户进行查看其他的一级分类。
    主要代码
    List<Category> categoryList = categoryService.adminbFindCategory();model.addAttribute("categoryList", categoryList);
    4.4.3 二级分类模块添加二级分类管理员用户为新增加的一级分类添加二级分类。程序运行结果如图4-22所示:

    设计思路
    首先编写二级分类添加页面add.jsp,管理员用户点击“添加”按钮时,页面跳转到add.jsp,同时服务器端将查询出所有的一级分类的名称,用于管理员选择新增的二级分类的归属,这在add.jsp页面中通过一个下拉列表进行显示。管理员用户在填写好新增的二级分类的名称并选择好所属的一级分类之后点击“确定”按钮,服务器端接收新增的二级分类名称和所属的一级分类的主键id,然后调用adminCategorySecond_save()方法将新增的Categorysecond保存于数据库的categorysecond表中。最后将页面重定向到二级分类的list.jsp页面进行展示。
    主要代码
    Categorysecond categorysecond = new Categorysecond();categorysecond.setCsname(csname);categorysecond.setCid(cid);categorySecondService.adminCategorySecond_save(categorysecond);
    修改二级分类管理员用户可以为网站中所有的二级分类的名称进行编辑。程序运行结果如图4-23所示:

    设计思路
    首先编写二级分类修改页面edit.jsp,管理员在list.jsp点击“编辑”按钮时,页面跳转到edit.jsp页面,跳转之前,服务器端查询到对应的二级分类的名称并将二级分类的名称保存到edit.jsp对应的表单中,这样方便用户知道自己修改的是哪个二级分,增加了用户体验度
    查询出对应的二级分类的名称存放于表单中,增加了用户体验
    Categorysecond findByCsid = categorySecondService.findByCsid(csid);model.addAttribute("findByCsid", findByCsid);
    更新修改的二级分类
    Categorysecond categorysecond = new Categorysecond();categorysecond.setCsname(csname);categorysecond.setCsid(csid);CategorySecondService.adminCategorySecond_update(categorysecond);
    删除二级分类后台管理员根据查询出的二级分类列表对二级分类进行操作,根据系统的要求,管理员用户在删除二级分类的同时应该删除该二级分类下的所有商品。
    设计思路
    管理员用户在点击“二级分类用户”按钮时,在管理员页面展示所有的二级分类,当用户点击“删除”按钮时,服务器端收到客户端发来的请求,并接受客户端传来的数据(二级分类的主键id),然后根据二级分类的主键id调用adminCategorySecond_delete(csid)方法,删除二级分类,然后根据外键删除商品。最后将页面重定向到二级分类的list.jsp页面。
    主要代码
    // 删除二级分类,二级分类关联二级分类下面的商品categorySecondService.adminCategorySecond_delete(csid);categorySecondService.adminProduct_deleteByCsid(csid);
    查询二级分类管理员通过点击“二级分类管理”来查看网站中所有的二级分类。程序运行结果如图4-24所示:

    设计思路
    首先得编写二级分类的list.jsp页面。管理员用户点击“二级分类管理”按钮时,给服务器发送请求,并携带分页参数,服务器端接收此参数之后开始查询所有的二级分类,这里创建了一个pageBean对象用于封装查询出来的数据,包括二级分类的集合,当前的页数,一共的页数等信息,最后直接返回一个pageBean对象,因为二级分类较多,这里采用了分页查询,需要用到这些数据因此直接封装在了pageBean对象里。用户可以通过二级分类的list.jsp页面右下方的按钮来查看所有的二级分类。
    4.4.4 商品分类模块添加商品管理用户通过点击商品展示页面list.jsp上的“添加”按钮可给网站添加新的商品。程序运行结果如图4-25所示:

    设计思路
    首先编写商品添加页面add.jsp。管理员用户点击商品展示页面list.jsp上的“添加”按钮之后客服端跳转到add.jsp页面,在客户端页面跳转之前,服务器端需要查询出所有商品的二级分类,方便上传用户选择该商品所属的二级分类。管理员需要填写页面上的信息包括商品名称、选择是否热门、市场价格、商城价格、上传商品图片、选择所属二级分类和编写商品描述这些信息。管理员用户点击“确定”按钮之后客户端将数据提交给服务器,客户端在上传上传组件时必须将上传组件表单type设置为file类型,这样服务器端才能正确的识别。最后服务器端接收到数据之后封装于product对象中,并调用adminProduct_save(product);将新上传的product保存到数据库中的product表中,最后将页面重定向到商品的list.jsp页面。
    主要代码
    product.setPdate(new Date());if (file != null) { String path = request.getServletContext().getRealPath("/products"); String uploadFileName = file.getOriginalFilename(); String fileName = UUIDUtiils.getUUID()+uploadFileName; File diskFile = new File(path + "//" + fileName); product.setImage("products/" + fileName);
    删除商品管理员用户点击“商品管理”来到展示所有商品页面,通过点击页面上的删除按钮即可删除指定的商品。
    设计思路
    这个功能是基于商品的展示页面list.jsp进行开发的,展示用户页面时pageBean里面封装了product的所有信息,当用户在点击“删除”按钮时即向服务器发送请求并携带参数(商品的主键id),服务端在接收到请求之后,根据客户端传来的参数进行删除该商品,最终将页面重定向到商品的展示页面list.jsp.
    jsp页面方法主要代码
    function deletecs(pid) { window.location.href = " ${pageContext.request.contextPath}/ admin/adminProduct_deletecs.action?pid="+pid;
    查询商品管理员通过点击“商品管理”按钮来查看本网站中所有的商品信息。程序运行结果如图4-26所示:

    设计思路
    首先编写商品下面的list.jsp页面,管理员用户在点击“商品管理”按钮时,给服务器发送请求,并携带分页参数,服务器端接收此参数之后开始查询所有的商品信息,这里创建了一个pageBean对象用于封装查询出来的数据,包括商品的集合,当前的页数,一共的页数等信息,最后直接返回一个pageBean对象,因为商品个数较多,这里采用了分页查询,需要用到这些数据因此直接封装在了pageBean对象里。用户可以通过商品文件夹里面的list.jsp页面右下方的按钮来查看所有的是商品信息。
    主要代码
    // admin的商品管理(查询所有的商品)PageBean<Product> allProPageBean = productService.findAllProduct(page);model.addAttribute("allProPageBean", allProPageBean);
    4.4.5 留言管理模块管理用户通过点击留言管理链接,即可打开前台顾客的留言列表界面,并且可以删除不合时宜的留言信息。程序运行结果如图4-26所示:

    5 系统测试与维护5.1 系统测试环境5.1.1 硬件环境
    CPU:英特尔酷睿四核
    内存:4G

    5.1.2 软件环境
    操作系统:windows 7
    服务器:Tomcat 7
    浏览器:Mozilla Firefox 和chrome

    5.2 系统测试内容使用eclipse编程软件编写Java源程序是遇到语法错误会自动报错,需要及时修改错误。对系统进行测试视为系统能有效运行并且没有异常产生。
    在程序模块编写时,每编写完一个模块需要进行模块单元测试,保证单元模块功能正常,在所有单元测试进行结束之后,需要进行整个系统的集成测试。本系统需要做如下的测试:

    登录注册测试:多次注册用户并且登录。则表达式检验的文本框输入错误信息,检测代码是否可行,注册成功后,检验用户是否可以正常显示,并查看数据库,检验数据是否成功插入。登录时,交叉使用正确和错误的密码进行登录测试,校验是否有异常
    查询一级分类测试:测试当用户访问index.action时,是否可以至系统首页即index.jsp,测试成功
    查询二级分类测试:测试用户在点击首页的一级分类时,系统是否会自动跳转页面,并且在页面的左面显示所有一级分类包含的二级分类
    购物车测试:测试已登录的用户是否可以将商品添加到购物车、移除购物车内商品、清空购物车
    订单模块测试:测试是否可以正常生成订单、取消订单、为订单付款

    5.3 系统维护系统维护是为了让系统能够在正常运行的基础上,对系统中的一些小问题进行修复并且不断完善的过程,通过系统维护能够使系统保证在不同的运行环境下均可以正常的工作,各个模块功能正常运行。
    由于本系统的本质就是一个电子商城,所以难免会有很多过期的没用的数据。所以需要定期进行“垃圾”信息的删除,对于系统中重要的一些内容如用户和商品等。要定期对数据库备份,保证数据的正确性。本系统的维护就是为了使本系统能够稳定的运行,所以需要定期维护,并且备份数据。
    小结:本章首先介绍了系统的测试环境,接下来详细介绍了单元模块测试的方法和整体集成测试的主要内容,最后介绍了系统维护的方案。
    6 总结如今,JavaEE是一个非常优秀的企业信息化开发平台,由于其拥有一些很好的性质包括稳定的性能、良好的开发性和非常高的安全性因此被广泛运用于企业级开发。这篇论文基于当前比较流行的电商系统为项目背景,遵循javaEE应用软件的规则进行开发,将系统划分为四个层次包括模型model层,持久层,业务逻辑service层和表现层,并整合了目前在企业中广泛运用的spring、springMvc和myBatis框架进行开发。Spring用于整个系统的统一调度,贯穿于各层之间,springMvc框架着重于mvc模式的实现,myBatis框架完成数据的映射和持久化工作,myBatis的逆向工程极大的方便了dao层的开发,也方便了系统dao层的维护。
    本论文主要完成了以下的任务:

    正确分析了电商目前的发展形势,特别是对网购的发展进行了深入的调查和研究
    深入明确了系统的总体架构,在技术选型上选取了三个主流的框架,对三者的功能,整合做了详细的描述
    系统项目的开发严格遵循软件的开发规范,制定了详细的系统开发步骤,开发之前做了大量的工作包括:需求分析、技术选型、架构设计等
    完成了预期赋予系统的功能的实现

    本文虽然完成了预期研究和目标,但后期还有很多工作需要完成:,随着web应用的快速发展,处于信息时代下会有更多的技术应运而生,不光需要对框架进行深入学习和研究还要对系统的架构进行研究。目前客户端技术正在崛起,我们需要认真做调查和研究做出一能让用户体验度更好的产品。以上只是目前的构想,接下来会继续深入研究并作进一步的完善和设计开发。
    7 参考文献[1] 杨开振等. Java EE互联网轻量级框架整合开发— —SSM框架(Spring MVC+Spring+MyBatis)和Redis实现[M]. 电子工业出版,2017.07.
    [2] 李俊民.HTML 5+CSS 3网页设计经典范例[M].电子工业出版,2010.
    [3] 邹红霆. 基于SSM框架的Web系统研究与应用[J]. 湖南理工学院学报(自科版), 2017, 30(1):39-43.
    [4] 王珊 萨师煊 数据库系统概论[M] 北京:高等教育出版社 2007
    [5] 陈雄华 Spring企业级应用开发详解[M] 北京:电子工业出版社 2009
    [6] 原著施奈德 成栋翻译 电子商务[M] 北京:机械工业出版社 2008
    [7] 阿里巴巴网络技术有限公司 中小企业电子商务之路[M] 北京:清华大学出版社 2007
    [8] 刘克强 电子商务平台建设[M] 北京:人民邮电出版社 2007
    [9] 程杰 大话设计模式[M] 北京:清华大学出版社 2010
    [10] 雷之宇 朱训雨 张麟 JAVA实用组件集[M] 北京:电子工业出版社 2008
    7 评论 347 下载 2019-05-15 16:31:24 下载需要15点积分
  • 基于Jsp和Mysql的教务管理系统

    1.引言1.1 编写目的这个教务管理系统模块是为了实现学校人力资源的优化和学生信息管理的科学管理而设计的,通过试用本系统,可以更加有效的管理学生信息和教师信息,具有信息的增加,查询,修改等功能。
    系统开发的整体任务是实现学校教师和学生信息管理的系统化、规范化、自动化和智能化,从而达到提高学校管理效率的目的。
    1.2 项目目标在当今世界电脑普及的时刻,人们已经习惯用电脑办公,结果自然会产生大量的电子文件,这些文件有宝贵的历史价值,但如今我们将更多时间花费在寻找这些文件,即费时又费力。这次项目则跟此需求开发的。让学校各部门能够有效的掌握,有效的共享文件资源,保护好文件,及促进教务管理的信息化、规范化和集成化,实现计算机的管理,以提高工作效率和经济效益。
    2.总体要求2.1 运行环境
    操作系统:win10专业版
    开发环境支持平台:idea2017
    程序配置环境最低版本要求:jdk1.8, tomcat8.0
    项目基础库最低版本要求:MySQL5.5。
    开发语言:java语言、html前端、jsp语法

    3.功能需求3.1 功能规划通过管理员对各模块的功能需求进行分析,可以将项目大致分为为学生信息管理模块、教师信息管理模块。
    3.2 基本设计概念和处理流程该文档目的在于明确系统的数据结构和软件结构,设计外部软件和内部软件的接口,说明各个软件模块的功能说明,数据结构的细节等。
    系统的总体处理流程如图所示:

    3.3 系统模块设计3.3.1 登录模块类图
    3.3.2 学生信息管理模块类图添加学生信息

    查询学生信息

    3.3.3 教师信息管理模块类图添加教师信息

    查询教师信息

    添加课程信息

    查询课程信息

    3.3.4 学生信息管理流程图添加信息

    查询信息

    3.3.5 数据库表关系图(ER图)
    3.4 数据库设计Managerinfo 管理员信息表



    列名
    数据类型
    是否为空
    说明




    manager_ID
    CHAR(10)
    NOT NULL
    管理员登录账号


    password
    CHAR(10)
    NOT NULL
    管理员登录密码


    manager_Name
    CHAR(10)
    NULL
    管理员真实姓名



    Studentinfo 学生信息表



    列名
    数据类型
    是否为空
    说明




    student_ID
    INT(10)
    NOT NULL
    学生学号(主键)


    student_Name
    CHAR(10)
    NOT NULL
    学生姓名


    student_Gender
    CHAR(2)
    NULL
    学生性别


    born_Date
    DATETIME(8)
    NULL
    出生日期


    class_No
    INT(4)
    NULL
    班级号


    tele_Number
    CHAR(10)
    NULL
    联系电话


    Peoplenumber
    VARCHAR(50)
    NULL
    身份证号码


    comment
    VARCHAR(200)
    NULL
    备注



    Exam-history 学生历史成绩信息表



    列名
    数据类型
    是否为空
    说明




    exam_ID
    INT(10)
    NOT NULL
    考试编号


    student_ID
    INT(10)
    NOT NULL
    学生学号


    course_Name
    CHAR(10)
    NULL
    科目名称


    exam-Date
    DATETIME(8)
    NULL
    考试日期


    result
    FLOAT(8)
    NULL
    考试成绩


    teacher_ID
    INT(10)
    NOT NULL
    监考老师



    TeacherInfo 教师信息表



    列名
    数据类型
    是否为空
    说明




    teacher_ID
    INT(10)
    NOT NULL
    教师号(主键)


    teacher_Name
    CHAR(10)
    NOT NULL
    教师姓名


    teacher_Gender
    CHAR(2)
    NULL
    教师性别


    born_Date
    DATETIME(8)
    NULL
    出生日期


    tele_Number
    CHAR(10)
    NULL
    联系电话


    subject
    VARCHAR(10)
    NULL
    教授科目


    introduction
    VARCHAR(200)
    NULL
    个人简介



    couseInfo 课程信息基本表



    列名
    数据类型
    是否为空
    说明




    course_ID
    INT(4)
    NOT NULL
    课程号(主键)


    courde_Name
    CHAR(10)
    NOT NULL
    课程名称


    teacher_ID
    INT(10)
    NOT NULL
    授课老师编码


    teacher
    CHAR(10)
    NULL
    授课老师姓名


    subject
    VARCHAR(10)
    NULL
    所属科目



    采用了Spring+SpringMVC+MyBatis框架,这里配置一个写入数据库和一个读取数据库并进行对spring框架的配置。


    4.功能实现及实现代码4.1 登录模块jsp代码



    此处设计了一个登录拦截器,若管理员未进行登录将不能正常使用。


    4.2 学生信息管理模块4.2.1 添加学生信息


    4.2.2 修改学生信息


    4.2.3 查询学生信息


    4.2.4 删除学生信息

    4.3 教师信息管理模块4.3.1 查询教师信息


    4.3.2 添加教师信息


    4.3.3 删除教师信息

    4.3.4 修改教师信息

    4.4 课程信息管理模块4.4.1 添加课程信息利用Ajax请求验证课程是否已存在。



    4.4.2 查询课程信息


    4.4.3 删除课程信息

    4.4.3 修改课程信息


    5.总结在这个学期的学习过程中,我在做这个项目当中的收获颇为丰富。因为在此之前只是直接接触的基于jsp的mvc模式架构的开发,然后设计过程之中,表之间的联系,数据的架构的过程比较较少,缺乏知识的完备性和完善性并没有使用过任何的框架。而恰好借助这段时间的学习,我开始接触和了解具体怎么在一个框架去实现项目的功能。这次的项目是基于ssm(spring+springmvc+mabatis)框架去实现的,主要是在B站看了黑马程序员的视频,学习如何开发一个完整的web工程,怎么去用一个框架。这个项目是采用boostap框架技术去设计管理页面前端,然而后端的话,因为是第一次去采用框架,多少有点不习惯,其次是自己对Java的一些基础操作如遍历信息表的操作不是很熟悉,在开发过程,经常是写一部分就会出现一个新的bug,又得停下来去修复它。
    在这个学习的中间,我觉得其中里面比较重点的知识点有:分页代码查询,多条件查询,多表查询,日期信息转化字符串,认识到了框架的好处,主要为三大方面:第一的就是Spring的优势,通过Spring的IOC特性,将对象之间的依赖关系交给了Spring控制,方便解耦,简化了开发;通过Spring的AOP特性,对重复模块进行集中,实现事务,日志,权限的控制提供了对其他优秀开源框架的集成支持。第二是mvc模式使我们开发更简洁与Spring无缝衔接灵活的数据验证,格式化,数据绑定机制。最后就是Mybatis的优势,数据库的操作(sql)采用xml文件配置,解除了sql和代码的耦合,提供映射标签,支持对象和和数据库orm字段关系的映射,支持对象关系映射标签,支持对象关系的组建,提供了xml标签,支持动态的sql。
    3 评论 3 下载 2020-07-13 13:17:40 下载需要14点积分
  • 基于ASP.NET的图书管理信息系统

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

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

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

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

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

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

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

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

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

    登录

    注册页面

    新闻模块

    部门介绍

    友情链接

    联系我们

    查询书籍页面


    管理通道





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

    1.课程设计目的数据库应用开发项目设计是数据库系统原理实践环节的及为重要的一部分,其目的是:

    培养学生能够应用数据库系统原理在需求分析的基础上对系统进行概念设计,学会设计局部ER,全局ER图
    培养学生能够应用数据库系统原理在概念设计的基础上应用关系规范化理论对系统进行逻辑设计,学会在ER图基础上设计出易于查询和操作的合理的规范化关系模型
    培养学生能够应用SQL语言对所设计的规范化关系模型进行物理设计,并且能够应用视图,存储过程,触发器,游标技术以保证数据库系统的数据完整性,安全性,一致性,保证数据共享和防止数据冲突
    培养学生理论与实际相结合能力, 培养学生开发创新能力

    2.课程设计内容2.1 数据库需求分析2.1.1 系统功能分析说明酒店客房管理系统是为了在正常运营中需要对客房资源、客人信息、消费信息、结算信息等进行管理,利用酒店客房管理信息系统对客房的各个操作进行管理,能够及时了解各个环节中信息的变更,有利于提高管理的效率。本项目要设计和实现一个能对酒店客房租住信息,客人信息,预订信息,消费信息,结算信息的管理,实现前台操作流程较方便,清晰,高效的信息管理系统。 
    2.1.2 系统框架图
    2.2 数据库概念设计2.2.1 局部E-R图客户E-R图

    员工E-R图

    客房E-R图

    客房管理系统E-R图

    订单E-R图

    入住E-R图

    退房E-R图

    物品E-R图

    2.2.2 全局E-R图
    2.3 数据库逻辑设计2.3.1 员工表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    员工编号
    Char(10)





    姓名
    Char(10)





    性别
    Char(10)





    出生日期
    Smalldatetime





    工龄
    Int





    密码
    Char(6)





    电话
    Char(20)





    备注
    Text





    2.3.2 客户表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    客户编号
    Char(10)





    姓名
    Char(10)





    性别
    Char(10)





    出生日期
    Smalldatetime





    身份证号
    Char(18)





    手机
    Char(20)





    备注
    Text





    2.3.3 客房表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    客房间号
    Char(6)





    客房类型
    Char(5)





    类型编号
    Char(2)





    状态
    Char(4)





    备注
    Text





    2.3.4 客房管理系统表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    客房类型编号
    Char(2)





    客房类型名称
    Char(16)





    价格
    Int





    客房总量
    Int





    剩余量
    Int





    备注
    Text





    2.3.5 订单表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    订单编号
    Char(10)





    员工编号
    Char(10)





    客户编号
    Char(10)





    客房间号
    Char(6)





    时间
    Smalldatetime

    GETDATED



    押金
    Int





    备注
    Text





    2.3.6 入住表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    订单编号
    Char(15)





    客户编号
    Char(10)





    客房间号
    Char(6)





    客房类型
    Char(10)





    入住时间
    Smalldatetime

    GETDATED



    备注
    Text





    2.3.7 退房表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    订单编号
    Char(15)





    客户编号
    Char(10)





    客房间号
    Char(6)





    客房类型
    Char(10)





    退房时间
    Smalldatetime

    GETDATED



    备注
    Text





    2.3.8 物品表的逻辑结构


    列名
    数据类型
    是否允许为空
    默认值
    是否为主键




    订单编号
    Char(15)





    客房间号
    Char(10)





    物品名称
    Char(10)





    物品编号
    Char(6)





    数量
    Char(10)





    金额
    Smalldatetime

    GETDATED



    备注
    Text





    2.4 数据库物理设计2.4.1 数据表的创建--创建表create table Worker --创建员工表(Workerid char(10) not null primary key,--员工编号Workername char(10) not null,--员工姓名Workersex char(2) not null,--员工性别Workerbirth smalldatetime,--员工出生日期Workingages int,--工龄cipher char(10)not null,--员工账号密码Workerphone char(20),--手机号码Workerremark text --备注)gocreate table Customer --创建客户信息表(Customerid char(10) not null primary key, --客户编号Customername char(10) not null, --客户姓名Customersex char(2) not null, --客户性别Customerbirth smalldatetime, --客户出生日期cardnumber char(18) not null, --客户身份证号码Customerphone char(20), --手机号码Customerremark text --备注)gocreate table Room --创建客房表(Roomid char(6) not null primary key, --房间号Roomsize char(10) not null, --客房类型serial char(2) not null, --客房类型编号Roomstate char(4), --客房状态remark text --备注)gocreate table Management --创建客房系统表(serial char(2) not null primary key, --客房类型编号Roomsize char(10) not null, --客房类型price int, --客房价格Roomgross int, --客房房间总量Roommargin int, --客房剩余数量remark text --备注)gocreate table Indent --创建订单表(Indentid char(10) not null primary key, --订单编号Workerid char(10), --员工账号Customerid char(10), --客户编号Roomid char(6), --房间号times smalldatetime, --时长meney int , --价格remark text --备注)gocreate table Attend --创建住房表(Indentid char(10) not null primary key, --订单编号Roomid char(6), --客房房间号Roomsize char(10) not null, --客房类型Customerid char(10), --客户编号inttime char(10) not null, --入住时间remark text --备注)create table Quit --创建退房表(Indentid char(10) not null primary key, --订单编号Workerid char(10),Customerid char(10),Roomid char(6),times smalldatetime,Quittime char(10) not null, --退房时间remark text)gocreate table Article --创建客房物品表(Indentid char(10) not null primary key,Roomid char(6),Articlename char(10), --物品名称price char(5), --物品单价amount char(5), --物品数量Articleid char(5), --物品编号Remark text --备注)go
    2.4.2 表中约束,规则的创建--添加外键alter table Roomadd constraint fk_Management_Room foreign key(serial) references Management(serial)goalter table Indentadd constraint fk_Worker_Indent foreign key(Workerid) references Worker(Workerid)goalter table Indentadd constraint fk_Customer_Indent foreign key(Customerid) references Customer(Customerid)goalter table Indentadd constraint fk_Room_Indent foreign key(Roomid) references Room(Roomid)goalter table Quitadd constraint fk_Worker_Quitforeign key(Workerid) references Worker(Workerid)goalter table Quitadd constraint fk_Customer_Quit foreign key(Customerid) references Customer(Customerid)goalter table Quitadd constraint fk_Room_Quit foreign key(Roomid) references Room(Roomid)goalter table Attendadd constraint fk_Customer_Attend foreign key(Customerid) references Customer(Customerid)goalter table Attendadd constraint fk_Room_Attend foreign key(Roomid) references Room(Roomid)goalter table Articleadd constraint fk_Room_Article foreign key(Roomid) references Room(Roomid)go--添加约束alter table Workeradd constraint ck_Workersex check(Workersex in('男','女'))goalter table Workeradd constraint df_Workersex default('男') for Workersexgo alter table Customeradd constraint ck_Customersex check(Customersex in('男','女'))goalter table Customeradd constraint df_Customersexdefault('男') for Customersexgo alter table Customeradd constraint uq_cradnumberunique(cardnumber)goalter table Indentadd constraint df_Indenttime default(getdate()) for timesgo alter table Quitadd constraint df_Quittime default(getdate()) for timesgo
    2.4.3 视图的创建--创建一个视图--用create view创建订单试图,包括员工姓名和订单号create view view1as select Workername,Indentidfrom Worker,Indentwhere Worker.Workerid=Indent.Workeridgo--用create view创建客户试图,包括客户姓名和房间号create view view2as select Customername,Roomidfrom Indent,Customerwhere Customer.Customerid=Indent.Customeridgo
    2.4.4 存储过程的创建--存储过程--查询员工表中员工的信息,任意输入一个编号create procedure ups_get @number varchar(20)as select*from Worker where Workerid=@number;execute ups_get'010*******'go--查询客户表中客户的信息,任意输入一个身份证号码create procedure ups_get1 @number varchar(20)as select*from Customer where cardnumber=@number;execute ups_get1'4409811***********'go--查询订单表中任意一个订单的信息,任意输入一个订单号码create procedure ups_get2 @number varchar(30)as select*from Indent where Indentid=@number;execute ups_get2'16009811*****'go
    2.4.5 触发器的使用--创建update触发器--在员工表中添加或更改数据,使DML触发器向客户端显示一条消息create trigger reminderon Workerafter insert,updateas raiserror('你在插入或修改员工表数据',16,10)go--在客户表中添加或更改数据,使DML触发器向客户端显示一条消息create trigger reminder1on Customerafter insert,updateas raiserror('你在插入或修改客户表数据',16,10)go--在订单表中添加或更改数据,使DML触发器向客户端显示一条消息create trigger reminder2on Indentafter insert,update,deleteas raiserror('你在插入,修改或删除客户表数据',16,10)go
    2.5 测试查询:根据入住天数查询客户应付费用。
    declare @y int declare @x int set @x=0 set @y=0 while @x<>datediff(day,'2019-12-25',getdate()) begin set @x=@x+1 set @y=@y+300 end select fare=@ygo

    查找房间价钱
    declare @x charset @x='单人房'if @x='单人房' select '普通单人间100元'else select '普通双人间150元'go

    用datediff查询客户信息
    select Customername=case when year(getdate())-year(Customerbirth)>=50 then '老年' when year(getdate())-year(Customerbirth)between 40 and 50 then '中年' else '青年'endfrom Customergo

    查询’豪华单人房’的客房数
    create function kfs()returns intasbegindeclare @y intselect @y=count(*)from Room,Managementwhere Room.serial=Management.serialgroup by Management.Roomsizehaving Management.Roomsize='豪华单人房'return @yendgoselect dbo.kfs()go

    select查询:查找性别为男的员工
    select * from Workerwhere Workersex='男'go

    用distinct查询所有客房的类型名称
    select distinct Roomsizefrom Roomgo

    用TOP查出客户表中前四名客户信息
    select top 4*from Customergo

    用in查客房编号和类型名称
    select Room.Roomid,Management.Roomsizefrom Room,Managementwhere Room.serial=Management.serialand Room.Roomsize in('豪华双人房','豪华单人房')

    用between查年龄为18到25之间的所有客户信息
    select*from Customerwhere datediff(year,Customerbirth,getdate()) between 18 and 25

    用like查姓‘步’的女员工信息
    select*from Workerwhere Workername like '步%' and Workersex='女'

    进行多表连接:查找出各个员工姓名和其接待客户的姓名
    select Workername as Worker,Customername as Customerfrom Worker join Customer join Indenton Customer.Customerid=Indent.Customeridon Worker.Workerid=Indent.Workerid

    用update修改客户表的数据
    update Customerset Customerphone ='186663211414'where Customerid='0123456483'

    用delete删除客户表中的记录
    delete Customerwhere Customerid='1123466780'go

    用order by查找出客房类型,费用降序
    select Management.Roomsize,price from Managementorder by price desc

    用group by 分别统计男女员工为多少
    select Worker.Workersex as'性别',人数=COUNT(*)from Workergroup by Workersexgo

    存储过程的测试

    触发器的测试

    3.总结通过一周的课程设计,完成了一个简单的酒店管理数据库,并成功实现了各要求所需功能。首先,在设计方面,考虑到数据的冗余及冲突等问题,将客人信息、客房信息、入住信息分别存储到三个表中,考虑了客人信息数据,客房信息数据及入住信息数据的独立性问题。其次,在设计表时,注意了数据的数据类型及长度的选择,考虑各种数据的添加情况,如是否入住的选项,在添加该项时将“否”设置为默认情况,同时还要保证不浪费数据的存储空间。最后本系统中使用了触发器trigger,触发器用于响应数据库更新,因此在删除信息时,我使用了触发器,在信息删除后,显示其余信息,用来确认信息是否成功删除。 
    通过这次课程设计,我了解到自身在许多相关知识方面都认识得不够深刻,致使在实际的运行操作中遇到许多困难与阻碍。在实验过程中,许多问题都在与同学的讨论中得到解决,并在讨论过程中又有了心得体会,学到了更多的知识。
    0 评论 2 下载 2020-07-14 11:10:27 下载需要11点积分
  • 基于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 评论 32 下载 2019-12-29 14:46:34 下载需要15点积分
  • 基于JAVA和MYSQL的医院简易挂号管理系统

    一、需求分析1.1 题目要求采用桌面应用程序模式,开发一个医院挂号系统,管理包括人员、号种及其挂号费用,挂号退号等信息,完成登录、挂号、查询和统计打印功能。数据库表如下所示,建立索引的目的是加速访问,请自行确定每个索引要涉及哪些字段。
    T_KSXX (科室信息表)



    字段名称
    字段类型
    主键
    索引
    可空
    备注




    KSBH
    CHAR(6)



    科室编号,数字


    KSMC
    CHAR(10)



    科室名称


    PYZS
    CHAR(8)



    科室名称的拼音字首



    T_BRXX (病人信息表)



    字段名称
    字段类型
    主键
    索引
    可空
    备注




    BRBH
    CHAR(6)



    病人编号,数字


    BRMC
    CHAR(10)



    病人名称


    DLKL
    CHAR(8)



    登录口令


    YCJE
    DECIMAL(10,2)



    病人预存金额


    DLRQ
    DateTime



    最后一次登录日期及时间



    T_KSYS (科室医生表)



    字段名称
    字段类型
    主键
    索引
    可空
    备注




    YSBH
    CHAR(6)



    医生编号,数字,第1索引


    KSBH
    CHAR(6)



    所属科室编号,第2索引


    YSMC
    CHAR(10)



    医生名称


    PYZS
    CHAR(4)



    医生名称的拼音字首


    DLKL
    CHAR(8)



    登录口令


    SFZJ
    BOOL



    是否专家


    DLRQ
    DATETIME



    最后一次登录日期及时间



    T_HZXX (号种信息表)



    字段名称
    字段类型
    主键
    索引
    可空
    备注




    HZBH
    CHAR(6)



    号种编号,数字,第1索引


    HZMC
    CHAR(12)



    号种名称


    PYZS
    CHAR(4)



    号种名称的拼音字首


    KSBH
    CHAR(6)



    号种所属科室,第2索引


    SFZJ
    BOOL



    是否专家号


    GHRS
    INT



    每日限定的挂号人数


    GHFY
    DECIMAL(8,2)



    挂号费



    T_GHXX (挂号信息表)



    字段名称
    字段类型
    主键
    索引
    可空
    备注




    GHBH
    CHAR(6)



    挂号的顺序编号,数字


    HZBH
    CHAR(6)



    号种编号


    YSBH
    CHAR(6)



    医生编号


    BRBH
    CHAR(6)



    病人编号


    GHRC
    INT



    该号种的挂号人次


    THBZ
    BOOL



    退号标志=true为已退号码


    GHFY
    DECIMAL(8,2)



    病人的实际挂号费用


    RQSJ
    DATETIME



    挂号日期时间



    为了减少编程工作量,T_KSXX、T_BRXX、T_KSYS、T_HZXX的信息手工录入数据库,每个表至少录入6条记录,所有类型为CHAR(6)的字段数据从“000001”开始,连续编码且中间不得空缺。为病人开发的桌面应用程序要实现的主要功能具体如下:

    病人登录:输入自己的病人编号和密码,经验证无误后登录
    病人挂号:病人处于登录状态,选择科室、号种和医生(非专家医生不得挂专家号,专家医生可以挂普通号);输入缴费金额,计算并显示找零金额后完成挂号。所得挂号的编号从系统竞争获得生成,挂号的顺序编号连续编码不得空缺

    功能2的界面如下所示,在光标停在“科室名称”输入栏时,可在输入栏下方弹出下拉列表框,显示所有科室的“科室编号”、“科室名称”和“拼音字首”,此时可通过鼠标点击或输入科室名称的拼音字首两种输入方式获得“科室编号”,用于插入T_GHXX表。注意,采用拼音字首输入时可同时完成下拉列表框的科室过滤,使得下拉列表框中符合条件的科室越来越少,例如,初始为“内一科”和“内二课”。其它输入栏,如“医生姓名”、“号种类别”、“号种名称”也可同时支持两种方式混合输入。

    每种号种挂号限定当日人次,挂号人数超过规定数量不得挂号。一个数据一致的程序要保证:挂号总人数等于当日各号种的挂号人次之和,病人的账务应保证开支平衡。已退号码不得用于重新挂号,每个号重的GHRC数据应连续不间断,GHRC从1开始。若病人有预存金额则直接扣除挂号费,此时“交款金额”和“找零金额”处于灰色不可操作状态。
    为医生开发的桌面应用程序要实现的主要功能具体如下:

    医生登录:输入自己的医生编号和密码,经验证无误后登录
    病人列表:医生处于登录状态,显示自己的挂号病人列表,按照挂号编号升序排列。显示结果如下表所示。




    挂号编号
    病人名称
    挂号日期时间
    号种类别




    000001
    章紫衣
    2018-12-30 11:52:26
    专家号


    000003
    范冰冰
    2018-12-30 11:53:26
    普通号


    000004
    刘德华
    2018-12-30 11:54:28
    普通号




    收入列表:医生处于登录状态,显示所有科室不同医生不同号种起止日期内的收入合计,起始日期不输入时默认为当天零时开始,截止日期至当前时间为止。时间输入和显示结果如下表所示。
    起始时间:2018-12-30 00:00:00 截止时间:2018-12-30 12:20:00



    科室名称
    医生编号
    医生名称
    号种类别
    挂号人次
    收入合计




    感染科
    000001
    李时珍
    专家号
    24
    48


    感染科
    000001
    李时珍
    普通号
    10
    10


    内一科
    000002
    扁鹊
    普通号
    23
    23


    保健科
    000003
    华佗
    专家号
    10
    20



    病人应用程序和医生应用程序可采用主窗口加菜单的方式实现。例如,医生应用程序有三个菜单项,分别为“病人列表”、“收入列表”和“退出系统”等。
    考虑到客户端应用程序要在多台计算机上运行,而这些机器的时间各不相同,客户端程序每次在启动时需要同数据库服务器校准时间,可以建立一个时间服务程序或者直接取数据库时间校准。建议大家使用MS SQL数据库开发。
    挂号时锁定票号可能导致死锁,为了防止死锁或系统响应变慢,建议大家不要锁死数据库表或者字段。程序编写完成后,同时启动两个挂号程序进行单步调试,以便测试两个病人是否会抢到同一个号、或者有号码不连续或丢号的现象。
    系统考核目标:

    挂号后数据库数据包括挂号时间不会出现不一致或时序颠倒现象,以及挂号人次超过该号种当日限定数量的问题
    挂号号码和挂号人次不会出现不连续或丢号问题
    病人的开支应平衡,并应和医院的收入平衡
    系统界面友好、操作简洁,能支持全键盘操作、全鼠标操作或者混合操作
    能支持下拉列表框过滤输入
    系统响应迅速,不会出现死锁
    统计报表应尽可能不采用多重或者多个循环实现
    若采用时间服务器程序校准时间,最好能采用心跳检测机制,显示客户端的上线和下线情况

    思考题:当病人晚上11:59:59秒取得某号种的挂号价格10元,当他确定保存时价格在第2天00:00:00已被调整为20元,在编程时如何保证挂号费用与当天价格相符?
    1.2 需求分析对于病人的操作界面而言,需要有题目要求的挂号功能,包括人性化的过滤功能,需要足够的提示信息用于提示当前的操作状态,此外,还需要题目要求中没有提到的对于余额的操作功能;对于医生的操作界面而言,除了需要题目要求的两种统计功能外,还需要额外的过滤功能以供更于便捷的查询。此外,还需要一个统一的登录界面以供医生和病人登录。
    对于程序的功能而言,不仅需要程序具有健壮性,在发生错误的时候不能崩溃,而且要求界面友好,支持多种操作方式,相应迅速。
    二、系统设计2.1 概要设计整个系统分为2个部分:程序部分以及数据库部分。数据库部分用于存储数据并同时服务多个客户端,而程序部分则负责相应用户的输入,与数据库沟通、处理数据并返回处理的结果。而程序部分总体上又分为4个模块:登录界面、医生操作模块,病人操作模块以及数据库连接器。总体的模块图如图 1所示。其中,登录界面用于负责检查用户的登录信息是否正确,并负责唤醒医生操作界面或病人操作界面,而医生操作界面或病人操作界面则调用数据库模块与数据库进行沟通,处理数据并返回结果。
    此外,程序入口也被封装为一个较小的main模块,用于执行包括加载数据库驱动、连接数据库、启动化图形界面引擎在内的初始化操作,以及实现唤醒登录界面的功能。如果不能成功连接数据库则此模块进行相应的处理并退出程序。由于此模块较小,且功能较为简单,因此不列入主要模块中。

    程序的总体状态转移图如图 2所示,首先进入登录界面并等待用户输入登录信息,然后通过查询数据库判断登录信息是否匹配,如果匹配则登录,否则提示错误并等待用户重新输入登录信息。登录成功后通过判断用户点击的是医生登录按钮还是病人登录按钮来判断加载医生登录界面还是病人登录界面。此后进入图形界面引擎控制的事件循环。当有事件到来时(如用户输入、点击等)处理事件、显示返回结果并继续等待下一个事件。所有的状态都是可逆的,也就是说用户可以通过退出按钮来回到上一个界面,以此来增加界面的可操作性。

    2.2 详细设计2.2.1 登录界面设计登录界面的设计较为简单,其功能为检测用户输入的登录信息是否与数据库中的登录信息相同。其应该包含一个用户名框,一个密码框,一个医生登录按钮、一个病人登录按钮以及一个退出按钮。由于图形化界面一般采用事件驱动,因此在按下按钮时进行对于用户输入的处理。按下医生登录按钮以及病人登录按钮的流程图如图 3所示。如果点击的是医生登录按钮或病人登录按钮,则首先判断用户名和密码是否为空。由于设计不允许出现空的用户名和密码,因此提前进行这一步判断有助于减少用户的等待时间以及无效的数据库访问,如果不为空则通过事先建立好的连接在数据库中查询,并通过查询结果进行比对:如果不存在此用户(查询结果为空)或密码比对错误,则做出相应的提示并禁止用户登录,如果用户名和密码均正确则加载对应的登录界面。如果点击的是退出按钮,则执行清理工作并退出界面。值得注意的是,由于医生登录界面与病人登录界面为同一个界面,因此第一步的输入信息不为空的检查可以提取到一个函数中进行,在本程序中validateUserNameAndPassword函数执行这一操作。

    此外,为了提高用户体验,在提示错误重新输入时需要清理掉上次提示的错误,而这些函数绑定在两个输入框的输入触发器上,这一绑定由此类的initialize方法完成。按照JavaFX的规范,initialize方法会在界面初始化时被调用。由于这些函数主要对于FXML的StyleSheet进行修改,与主要逻辑相比重要性较低,因此不做赘述,详见源代码部分。
    2.2.2 数据库连接器设计数据库连接器是整个程序的基础,它位于层次结构的最底层并被医生操作模块或病人操作模块所调用。这一模块在整个界面被初始化之前初始化,又由于没有它整个程序将无法运作,因此如数据库连接器不能正确被初始化,则程序将拒绝运行并退出。
    数据库连接器作为一个单例,为医生操作模块和病人操作模块提供必要的服务。这样可以简化上层的逻辑,将部分逻辑移动到底层,从而降低了整个系统的耦合度,同时便于代码的修改。虽然数据库连接器在全局作为一个单例对象存在,但由于需要考虑到多个客户端同时连接同一个数据库的情况,依然要考虑数据库层面的并发安全性问题。
    考虑到一个数据库仅供给一个人使用,为了简便起见,此类中仅维持一个连接实例,所有的statement均通过这一个连接进行。数据库对上层提供的服务(即公有方法)以及对应的执行语句如表 1所示(以略去参数类型)。此外,还提供了connectDataBase方法供初始化使用以及getInstance方法供获得实例使用。



    方法 (参数)
    说明
    执行的Sql语句




    getWholeTable (table)
    获得表table中的全部内容
    SELECT * FROM \<table>


    getPatientPassword (number)
    获得编号为number的病人的密码
    SELECT password FROM patient WHERE pid=\<number>


    getPatientInfo (number)
    获得编号为number的病人的全部信息
    SELECT * FROM patient WHERE pid=\<number>


    getDoctorInfo (number)
    获得编号为number的医生的全部信息
    SELECT * FROM doctor WHERE docid=\<number>


    getRegisterForDoctor (number, start, end)
    获得起止时间分别为start和end的有关医生编号number的全部挂号信息
    SELECT reg.reg_id,pat.name, reg.reg_datetime,cat.speciallist FROM ( SELECT reg_id,pid,reg_datetime,catid FROM register WHERE docid=\<number> AND reg_datetime>=\<start> AND reg_datetime<=\<end> ) as reg inner join ( SELECT pid,name FROM patient ) as pat on reg.pid=pat.pid inner join ( SELECT reg_id, specialist FROM register_category ) as cat on reg.catid=cat.catid


    getIncomeInfo (start, end)
    获得起止时间分别为start和end的所有医生的收入信息
    SELECT dep.name as depname, reg.docid, doc.name as docname, cat.specialist, reg.current_reg_fount, SUM(reg.fee) as sum FROM ( SELECT * FROM register WHERE reg_datetime>=<start> AND reg_datetime<=<end> ) as reg inner join ( SELECT docid,name,depid FROM doctor ) as doc on reg.docid=doc.docid inner join( SELECT depid,name FROM department ) as dep on doc.depid=dep.depid inner join( SELECT reg_id,specialist FROM register_category ) as cat on reg.catid=cat.catid GROUP BY reg.docid, cat.specialist


    updatePatientLoginTime (number, time)
    更新编号为number病人的最近登录时间为time
    UPDATE patient SET last_login_datetime=\<time> WHERE pid=\<number>


    updateDoctorLoginTime (number, time)
    更新编号为number医生的最近登录时间为time
    UPDATE doctor SET last_login_datetime=\<time> WHERE docid=\<number>


    tryRegister
    根据所给参数尝试挂号(较为复杂,见下)



    tryRegister方法由于不仅仅是执行一个简单的任务并返回结果而显得较为复杂:这个函数是为了将上层的部分逻辑转移到下层以降低系统耦合度而产生的。其流程图如图 4所示。由于这一方法需要分为多步执行,并且需要考虑并发安全性,因此需要启动一个transaction,在图中流程中任意一个地方发生错误则直接报错并回滚,回滚后不会对数据库造成任何影响。由于需要挂号编号是单调递增且连续的,因此transaction的隔离级别设置为repeatable read(可重复读)。执行挂号的sql语句前执行的判断为当前挂号数是否超过最大挂号数,而执行之后的判断为两次对于是否更新余额的判断:一次是判断是否需要从余额扣款,一次判断是否将找零存入余额。在所有语句得以正确执行后提交transaction以持久化更改。

    由于tryRegister返回的是成功挂号时的号码,占用了错误信息的返回渠道,因此为这一方法定义了一个异常RegisterException类来返回错误信息,其中包含错误代码可以指示出错的原因。
    2.2.3 病人操作界面设计病人操作界面的设计是整个程序中最为复杂的部分,其大部分代码均为界面更改代码。界面包含4个输入/下拉框、一个滑块以及2个复选框,输入框分别用于选择科室名称、医生姓名、号种类别以及号种名称,滑动条用于选择交款金额,两个复选框用于选择是否使用余额付款以及是否将找零存入余额。此外,界面上还包含需要显示的信息,包括应缴金额、找零金额以及挂号号码、还包含挂号按钮和退出按钮用于开始执行挂号逻辑以及退出当前界面。用于搭建界面的逻辑此处不再赘述,下面主要描述核心部分较为重要的复选框过滤方法以及当挂号按钮按下后所执行的逻辑。
    由于程序需要良好的用户体验,下拉框需要同时支持鼠标输入以及键盘输入,而当一个下拉框选择了一项内容后,其余的下拉框也应该更新其可选内容以匹配当前内容,这就涉及到过滤策略的问题:如何进行过滤以及在何时进行过滤。经过一番考虑与实践后决定采用如下的过滤策略:为每一个下拉框定义一个原始列表与一个当前列表,原始列表用于存放此下拉框在没有其它限制的情况下所有的可选值,而当前列表用于存放经过过滤后下拉框的候选值。再为每一个下拉框定义2种操作:更改与提交。鼠标在候选值上滑动、键盘正在进行输入的时候下拉框为更改状态,而鼠标点击后、键盘换行键按下后下拉框显示当前列表中的某一个值的状态为提交状态。
    于是过滤策略为:进行更改操作时仅过滤当前列表并将过滤后的内容加入下拉框的候选值中,而提交操作后对于所有的当前列表重新从原始列表进行按序更新,扩展到一般情况,假设共有N个列表,在提交任意一个下拉框m后对于当前列表1~m-1, m+1~N依次进行更新,而对于列表k的更新过程为:依次使用1 ~ k-1、k+1 ~ N的下拉框的已选择值以及此下拉框选择的内容类型对于第k个列表的语义限制对第k个列表进行更新。这一操作看似是具有时间复杂度O(M^2)的,而实际上进行了一定的优化后可以仅仅在O(M)的时间内完成,其中M为平均原始列表长度(由于过程较为庞杂,此处不便于使用图形进行展示)。
    这样设计的好处在于:能够在较短的时间内对于所有的列表进行动态的过滤而不会带来自定义的更新规则或带优先级的更新规则所带来的混乱,当用户选择下拉框m时m自动成为最高优先级(这也是合理的,因为用户当前的焦点在m处),并结合之前已选的内容对于所有下拉框进行过滤,在删除复选框内容时也不会造成其它更新策略可能带来的列表内容丢失。
    在挂号按钮按下后首先进行挂号前检查:判断必要的下拉框是否已经有选择的值以及余额是否充足,然后调用数据库连接器中的tryRegister函数尝试挂号,并根据返回的结果显示相应的挂号号码或者错误信息。
    2.2.4 医生操作界面设计医生操作界面则较为简单,其以查询、统计功能为主,并且统计功能可以集成在sql语句中完成,因此代码逻辑简短。值得注意的是需要使用TreeTableColumn来存储各列的值, 并使用DateTimeFormatter对于时间格式进行转换,否则列表可能不能正常更新,时间也不能正常被数据库连接器读取。
    医生操作界面界面包含一个挂号列表、一个收入列表,均可以按照任意一栏进行排序,包含2个时间选择器以及2个日期选择器,用于过滤起止日期,在2个表中均能过滤,并有2个复选框能够快捷的选定今天或全部时间,此处的界面更新逻辑为:但两个复选框中的任意一个被按下另一个都会取消选择,并且时间选择器与日期选择器会被禁用。最后,界面上包含2个按钮,分别用于发送数据库请求并更新界面以及退出当前界面。
    三、软件开发本程序以及测试程序的编写均在Arch Linux x64系统下完成,并分别在Linux和Windows下进行了测试,具体开发以及测试环境见表 2。



    项目
    版本




    开发操作系统
    Arch Linux 2018年4月更新


    JDK (Linux)
    OpenJDK 1.8.0_172, Java 8


    集成开发环境
    IntelliJ IDEA 2018.1.3


    测试操作系统1
    Arch Linux 2018年5月更新


    JRE (Linux)
    OpenJDK Runtime Environment 1.8.0_172-b11


    数据库 (Linux)
    MariaDB 10.3.7.r77.gee5124d714e


    测试操作系统2
    Windows 10 Pro x64 Version1803


    JRE (Windows)
    Oracle Java SE Runtime 1.8.0_161-b2


    数据库 (Windows)
    MariaDB 10.3.7 x64



    四、软件测试本软件测试在Arch Linux下进行。经测试,程序在Windows下的行为和运行结果与在Arch Linux下完全相同。
    4.1 登录测试首先不启动数据库,在无数据库连接的情况下启动程序,程序直接报错退出,如图 5所示,这是预期行为,因为不能要求用户手动连接数据库,因此只能报错退出。

    在数据库运作正常的情况下,启动后的界面如图 6所示。

    然后尝试不使用用户名、密码输入错误的用户名、密码登录,程序应该提示对应的错误,知己的程序输出如图 7和图 8所示。可以看出,与预期的结果相同。下方的显示区域分别显示“请输入用户名”、“请输入密码”、“用户不存在”以及“密码错误”。














    在使用用户名003、密码003003并点击病人登录后,成功登录,登录后的界面如 所示。此处登录测试完成,进入病人操作界面测试阶段。
    4.2 病人操作界面测试进入病人操作界面后如图 9所示。其中所有的可交互控件均可同时使用鼠标和键盘进行操作。当号种类别以及号种名称被选择时,应缴金额以及找零金额会自动显示,并且找零金额会随着付款方式以及交款金额的变化而变化。当未满足挂号条件时,挂号按钮为未激活状态。

    接下来尝试进行挂号操作当余额低于应缴金额时,使用余额付款按钮为未激活状态,不可使用余额付款,否则可以选择使用余额付款或使用现金付款,当选择使用余额付款时,交款金额滑块为未激活状态以减少无效操作的可能性。正在使用现金挂号的界面以及挂号成功的界面分别如图 10以及图 11所示,在挂号成功后,底部状态栏显示了挂号成功的信息以及挂号号码。


    为了测试程序的并发安全性,使用IntelliJ IDEA同时打开两个程序进行单步调试,调试结果显示无论两个程序以何种方式穿插挂号的操作都不会发生编号冲突或缺失的情况,但有可能造成某一个客户端不能挂号成功而发生数据库回滚。在这种情况下用户需要重新挂号。而当挂号数量达到限额时也会提示挂号失败,如图 12所示,当多次点击挂号后,此号码达到了人数上限,因此在访问数据库的时候会抛出异常并禁止用户进行进一步的挂号操作。
    此外,本程序还支持将找零存入余额以供下次使用。使用另一个号码进行挂号,并勾选将找零存入余额,挂号成功后余额有所增加,如图 13所示。


    在界面的友好性方面,所有的交互控件均能够同时支持鼠标和键盘操作,一个使用键盘通过输入拼音进行下拉框过滤的例子如图 14所示。

    4.3 医生操作界面测试退出病人操作界面后进入医生操作界面,图 15展示了上面用于演示的008医生登录并查询所有挂号列表的操作界面。界面的下方为过滤器,可以自定义时间过滤,也可以使用“全部时间”和“今天”复选框进行快捷的过滤。使用这两个复选框的效果与手动设置时间的效果相同,但是免去了较为费时的选择操作。

    图 16展示了手动输入时间进行过滤的效果,显示的值为上方病人测试中最后一次挂号的信息。可以看出与病人挂号时选择与返回的信息相同。

    标签栏的另一个标签为收入列表,这一列表的过滤方式与挂号列表的过滤方式相同,只是显示的内容有所差异。

    值得注意的是,无论是挂号列表还是收入列表,各栏的相对位置都可以移动,并且可以按照任意一栏排序。图 17即为将挂号人次移动到第三栏并以之为基准进行排序的结果。

    五、特点与不足5.1 技术特点
    病人操作界面使用了效率较高的过滤算法,以多个维度进行过滤,提高了程序的可用性和便捷性
    采用了移动端的控件风格构造了一个更为人性化的操作界面
    程序考虑到了多种异常以及并发的安全问题,健壮性强,并且程序效率较高
    将程序分解为多个模块,耦合度低、可扩展性强,易于修改
    编译时将所有的依赖打入一个jar包中,不存在依赖问题,全平台通用, 图 19为本程序在Window10下的运行效果。可以看出,除了字体有些微的差别外其余并无不同


    5.2 不足和改进的建议
    由于数据库定义密码长度限制,所有的密码为明文存储,安全性较低。可以考虑将密码改为hash加密后的密码存储
    下拉框过滤算法以及医生界面的更新算法可以改为增量更新,并多加上一级cache,这样可以减少数据库操作,并提升性能
    可以添加更多的统计功能供不同角度的查询使用
    可将sql用户名密码等全局变量提取到配置文件中,避免硬编码

    六、过程和体会6.1 遇到的主要问题和解决方法在医生见面设计中发生了统计表格不能自动更新的问题,通过阅读文档发现TreeTable类需要设置CellValueFactory才能实现自动更新,遂修改程序使之得以正常运行。在病人界面的设计时遇到了下拉框过滤输入时过滤算法失效的问题,经过仔细的检查后、发现原因在于应用过滤的优先级混乱造成了下拉框备选项丢失的错误,经过一番思考后想出了上面详细设计所述的过滤算法,从而从根本上解决了这一问题。此外,IntelliJ IDEA的FXML编辑工具缺失部分功能,使得FXML文件不能指定控制类,并且容易导致IDE崩溃退出,这一问题可以使用独立的SceneBuilder解决。
    6.2 课程设计的体会通过此次课程设计,我最大的收获是学习了如何使用JavaFX搭建一个现代化的、友好的界面,以及如何让Java程序与数据库协作来完成复杂的功能。对于第一次接触JavaFX库的我而言,这是一个挑战,但是经过近一个星期的不懈努力,我深入的了解了JavaFX的运作方式,并使用其构造了一个较大的项目,在这个过程中我学到了不少有用的知识。不仅如此,在这一综合性较强的实验中我还顺带复习了有关Java的语言特性、有关数据库的知识以及许多软件工程的经验与知识,这对于今后的学习生活奠定了不小的基础。
    七、源码和说明7.1 文件清单及其功能说明文件(夹)结构及其说明如下:
    src 项目根目录├── 说明文件.txt 说明文件├── lib 第三方库文件夹│ ├── jfoenix-8.0.1.jar JFoenix第三方库│ └── mysql-connector-java-5.1.46-bin.jar MySQL第三方库├── out 编译输出文件夹│ └── hims.jar 编译输出Jar包├── src 源文件夹│ └── hims 源文件夹(包级)│ ├── Login.fxml 登录界面FXML文件│ ├── Doctor.fxml 医生界面FXML文件│ ├── Patient.fxml 病人界面FXML文件│ ├── LoginController.java 登录界面控制类源码│ ├── PatientController.java 病人界面控制类源码│ ├── DoctorController.java 医生界面控制类源码│ ├── DBConnector.java 数据库连接器源码│ ├── Config.java 配置文件│ ├── Main.java 主函数所在类源码│ └── Main.css 界面使用的层叠样式表文件└── sample_data.sql 数据库样例数据文件7.2 用户使用说明书要使用本程序,须按照下列步骤进行环境搭建:

    前提条件

    操作系统:Windows/Linux/OS XJava 运行环境:Jre 1.8.0_161 或其兼容版本数据库:MariaDB 10.3.7或其兼容版本或MySQL对应的兼容版本
    样例数据导入

    启动数据库服务使用root登录进入数据库,创建名为java_lab2的数据库CREATE DATABASE java_lab2;
    创建名为java的用户,设置其密码为javajava,并授予其在java_lab2上的所有权限GRANT ALL ON java_lab2.* TO 'java'@'localhost' IDENTIFIED BY 'javajava';FLUSH PREVILEGES;
    使用java用户登录java_lab2数据库,并运行source sample_data.sql来初始化数据由于数据库名称、用户名以及密码均硬编码在程序中,因此上述信息不可更改
    使启动数据库服务维持启动状态
    运行out文件夹下的hims.jar,可以在命令行中运行java -jar hims.jar,也可直接在文件管理器中点击(需要java在PATH环境变量中并正确的设置MIME TYPE)
    7 评论 263 下载 2019-03-10 13:55:02 下载需要14点积分
显示 90 到 105 ,共 15 条
eject