分类

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

资源列表

  • 基于JSP实现的学生会管理系统

    摘 要目前高校学生会已经成为学生组织中的翘楚,在各高校内,学生会已经起到了作为学生和学校之间的桥梁作用,然而学生会在学校内作用的发展已经遇到了瓶颈。随着信息技术和计算机技术的不断发展,继企业之后,高校也在进行着信息化的改革,比如学生学籍管理系统,图书馆系统、学生选课系统等,但是相比于高校这些机构的信息化建设,学生会的信息化发展在各高校内基本为零。学生会的信息化建设是信息时代发展的必然趋势,也是高校提高竞争力的必然条件。
    本系统具有运行速度快、安全性高,跨平台,很强的可移植性。学生会管理系统基于WEB的java技术,采用MyEclipse为开发工具,利用MySQL作为数据库服务器进行数据管理。通过介绍了多层应用软件体系结构并采 B/S 模式结构的综合考虑,系统包括学生会干部、学生会成员两个角色,学生会干部实现了在考勤管理、活动记录、个人考评、活动管理、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能;学生会成员登录系统实现了查看个人考勤、活动记录、个人考评、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能子模块。
    关键词:JSP;学生会管理;B/S架构
    AbstractCurrently college students has become a leader in student organizations within the university, students will have to play as a bridge between the students and the school’s role, however, in the role of students in the school’s development has encountered a bottleneck. With the continuous development of information technology and computer technology, the following enterprises, universities are engaged in information technology reforms, such as the Student Management System, a library system, student elective system, but compared to the information these organizations universities construction, development of information technology students in colleges and universities essentially zero. Student of information technology is the inevitable trend of development of the information age, but also a necessary condition to improve the university’s competitiveness.
    The system has run fast, safe, cross-platform, highly portable. WEB-based student management system java technology, using MyEclipse development tools, the use of MySQL as a database server for data management. Through the introduction of multi-application software architecture and adopt comprehensive consideration of B / S architecture, the system includes a student union, student members of the two roles, student cadres to achieve the attendance management, activity records, personal evaluation, event management, work plan Information viewing, document management, modify personal information, modify the login password and other functions; student members login system to achieve personal view attendance, activity records, personal evaluation, work plans, information viewing, document management, modify personal information, modify the login password, etc. functional sub-modules.
    Keywords: JSP; student management; B / S architecture
    1 前言1.1 课题的背景及意义随着计算机技术的发展,特别是计算机网络技术与数据库技术的发展,人们的生活与工作方式发生了很大的变化。在利用网络技术允许计算机与可以实现的,使用的数据库技术提供了数据存储,检索和信息等功能的分析,提高了工作效率和质量的信息共享通信。
    数据库始于1960年,经过40多年的发展,已经较为成熟的理论体系已经成为计算机软件的一个重要分支。数据库技术展示先进的数据管理方法,因此使用电脑,真正渗透到经济和社会发展的各个领域,尤其是在数据处理领域中扮演着越来越重要的作用。
    随着改革开放和符合中国国情和独特的,教育的发展市场经济的发展一直受到国家和社会的大力支持,使对规范快速发展和现代化,但与发达国家相比,一些技术的使用的教育部门在教育部门,只有在旧的,大型机构的大城市信息,仅使用电脑进行操作,提高工作效率,实现社会效益和经济效益都不错,和一些新的,更小的机构并不都已经此功能。随着中国教育的快速发展,在教育管理信息技术将更加广泛和深入。
    在计算机技术和管理教育的快速发展并没有改变在一些地区和学校手动操作被广泛应用,特别是在贫困地区职业学院的西部。传统的管理模式,大量的成本,而且容易出错的低效率。随着计算机网络技术和数据库技术,教育和信息技术管理发展的发展是一个必然的趋势。
    目前的事态发展高等教育的一个重要步骤,增加科学和技术的力量,让高等教育面临着更大的发展机遇。教学的学院和大学的质量提高,同时管理高等教育的一些机构仍停留在手工,学生的注册,组织,统计等大型工作,往往是错误的水平。
    而在一些高职院校建立校园网,办公自动化,但是,也有大量的学校并不具备这样的条件。虽然一些学校使用电脑,也管理体系,但仍然存在不少问题,一些系统的功能还不够完善,制度不够稳定得到进一步的发展。因此开发学生学生会管理系统,实现部分办公自动化就具有很大的实际意义。
    1.2 国内外研究现状MIS(Management Information System)管理信息系统系统,是由人、计算机及其他外围设备组成的能够进行信息收集、传递、存贮、加工、维护和使用的系统。这是上个世纪的新的科学的兴起,是利用计算机和网络通信技术,加强信息管理,有资源做研究,并建立准确的数据。经过再加工成各种汇编资料,并提供给管理人员,使他们能够做出正确的决策,提高管理水平和工作效率。
    高校,我们大多是信息管理大规模始于20世纪90年代,晚于西方发达国家10-20年。在沿海地区和城市都比较先进,近年来高校信息化建设一直发展非常迅速,已被广泛应用于各个领域,如教学,科研和管理大学,并取得了良好的效果。如清华大学和北京大学已经开发出一种高速网络的主校区,包括学术研究,办公管理,社会服务和数字化管理系统等功能。
    在学校信息化建设之初,一般根据自己的需要,各部门和学校制定运行自己的业务系统,并配置一个独立的IT环境(包括机房,UPS,服务器等)。这会导致过量的设备,部署服务器收入的物理位置。这使得该系统的灵活性,完整性和可用性的数据差,而且还增加了学校的整个IT基础设施的总成本,而且还增加了系统的复杂性,增加了较低的操作的级别为每个系统不能达到预期的效果,需要。这碎片也是一个发展模式拥挤的学校信息。和因特网的发展和增长正好解决了这一问题。每所学校开始将各职能部门的小型数据中心和数据中心为基础的学校建设。从物理上,将各部门的系统集中起来,并运行在统一的IT设施上。
    1.3 课题研究方法与技术路线1.3.1 研究方法根据所给资料得出系统的基本的框图,划分功能模块,应用语言编程,应用Myeclipse与MySQL作为数据库服务器来开发本系统。系统包括学生会干部、学生会成员两个角色,学生会干部实现了在考勤管理、活动记录、个人考评、活动管理、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能;学生会成员登录系统实现了查看个人考勤、活动记录、个人考评、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能子模块。
    1.3.2 技术路线本系统采用B/S(Browser/server,浏览器/服务器)三层体系结构,这种模式采用多种标准的协议和技术,适合于任何硬件平台和软件环境。本系统采用当今社会比较先进的三层框架技术开发一个性能优越、可扩展性强和安全可靠稳定的学生会管理系统。
    2 相关技术介绍2.1 JSP技术简介JSP(Java服务器页面服务器Pages)是一种新技术自1998年开始出现。由Sun Microsystems公司倡导,参与了动态网页技术标准,许多公司一起建立了一个基于Web的Java开发技术JavaServlet以及整个系统。 (*.HTM,*.HTML)加入脚本片段和JSP标记(tag)在传统的网页HTML文件,构成了JSP网页(*.JSP)。 JSP技术来创建动态生成内容的Web页面的显示提供了一种简单的方法。 Java的JSP作为家族的一员,继承了Java的,即跨平台特性的特点,那一次,随处运行。
    在其他国家,已被广泛用作JSP的Web应用程序开发工具,并在国内,尽管JSP技术的发展不是主流,但由于JSP的强大优势,很多网站都已经准备转向JSP,使用JSP开发动态网站。
    2.2 JSP工作原理JSP是一个面向服务器的,因此支持任何浏览器。当Web服务器和JSP引擎遇到请求访问JSP页面时,JSP引擎将请求发送到相关的对象的服务器端组件,如JavaBean组件,Servlet或者EJB等,然后由服务器端组件处理这些转介,您可能需要从数据库或检索存储在数据信息,那么服务器端响应对象的部分,然后返回给JSP引擎。 JSP引擎响应对象传递给JSP页面,根据HTML格式的JSP页面组织完整的内容,JSP页面的最后Web服务器和格式化客户端浏览器的HTML格式后,JSP引擎将返回。这被广泛用于构建当前Web浏览器 - Web服务器 - 一个三层的后端数据库。由于JSP所有程序操作都在服务器端执行,网络上传到客户端是唯一得到的结果。
    2.3 JSP体系结构JSP的Web开发标准给出了使用JSP技术两种方式可以概括为一个模型,模型二。
    模式1:JSP + JavaBean技术在这种模式下,响应由个人请求JSP页面,并将结果返回给客户端。处理所有的数据访问bean,JSP页面来实现的性能,生成并显示内容,以实现相分离。当使用一个大型的,复杂的应用处理,嵌入了大量的页面脚本或Java代码段,当需要处理复杂的业务逻辑,这种情况会很糟糕,很多内联代码编写一个复杂的页面未来的界面设计师,这是不可想象的。因此,一款型号为他们的小应用程序不能满足大规模应用的需求。
    模式二: JSP + Servlet的+ JavaBean技术使用Java Servlet技术是一种技术,实现了技术的CGI功能, Servlet技术非常适合于服务器端的处理和编程,并且Servlet的将是一个长期驻留在内存中。
    从发展的角度来看,更清晰的图案两页的性能,开发人员分工明确的角色,在一个大型项目开发,模式两个时,模型中的两个也更符合目前流行的MVC架构行(模型/视图/控制器) ,其中Servlet的相应的控制器,位置控制器在处理HTTP请求,负责生成豆类JSP组件或使用的对象,并确定哪个JSP请求应该发送给对方, JSP对应的视图,最终负责用于生成动态网页,并返回到浏览器。对应的JavaBean模型,每一个具体的应用程序逻辑实现的功能。
    2.4 JSP的特点2.4.1 简化页面生成技术使用标准的HTML或XML JSP页面指令来处理格式和页面布局,而类似的HTML , XML标记语言和Java脚本来生成页面内容。这使得页面的表单和页面的内容是独立的,分工是非常有利于大型项目。
    2.4.2 与Java平台的有机整合JSP技术是Java 2平台, JSP中的Java语言作为其脚本语言的重要组成部分。 JSP页面可以在几乎所有的Java组件和Java API,它可以充分发挥Java语言的强大功能可以使用。 JSP技术来创建高度可扩展和可靠的Web应用程序。
    2.4.3 硬件平台和服务器的独立性Java的JSP作为一个家庭,秉承了Java技术的“一次编写,随处可用(一次写入,朗姆酒任何地方) ”功能,可以在最流行的操作系统平台和Web服务器上运行,服务器硬件和平台无关的操作系统是一个JSP的动态网页对其他技术的最大优势。
    2.4.4 个功能的可扩展性像微软的JSP技术可以通过ActiveX / COM组件一样,采用jsp + javabean和EJB ( Enterprise JavaBean组件)和自定义标记扩展来扩展功能。
    JSP通过JDBC ,以及诸如Oracle,MySQL等这样的大型关系数据库进行连接。
    JSP提供了一些隐藏的对象。这些隐藏的对象可以在JSP页面中直接引用,而不必首先声明。使用这些隐式对象JSP提供,可以使脚本更强大,更容易编程,使用方便。例如,使用request对象,你可以很容易地得到一个HTML表单提交的用户信息。
    2.5 系统数据库连接JDBC Java数据库连接技术的缩写,它是一种常见的功能支持由SUN (应用程序编程接口)提供了基本的SQL应用程序编程接口。它由一组类在Java语言和接口。通过这些类和接口,应用程序开发人员可以使用Java语言和数据库链接很容易地建立员工,通过执行相应的SQL语句来完成访问不同的数据库。因此,开发人员可以使用JDBC API ,而无需编写应用程序访问Sybase数据库,另一个编写一个应用程序访问Oracle数据库,编写一个应用程序来访问MySQL 。此外,使用Java语言的应用程序可以在任何支持Java的平台上运行,而不需要开发不同平台上的不同应用。
    简单地说, JDBC可以完成以下三件事情:

    建立与数据库的连接
    建立与数据库的连接
    由数据库返回的结果

    JDBC是一个普遍的低级应用程序编程接口,它提供了在不同的数据库级别的功能模块一个统一的用户界面。说JDBC是一种低级的API ,是指它直接调用SQL命令,它更容易使用一些API,比其他一些数据库连接,但它也可以用来作为一种更先进,更人性化的API做的人脸或发展工具的基础。
    许多可视化Java开发工具如Visual年龄对于Java ,视觉咖啡厅, J + +等提供了一个基于JDBC的多面向用户的类和包直接到表或视图的映射关系型数据库中的Java类,通过可视化编程工具直接在Java对象进行操作,并且SQL调用真正需要的是自动生成的基于对象的各种属性的操作发射的程序员,方法。另一种方法是使用JDBC API ,用户程序可以提供一个接口(如菜单等),以允许用户选择数据库的操作,选择一个任务,系统会提示用户输入必要的信息,然后生成基于用户输入的SQL命令和Java程序的合适的。通过这一点,用户可以完成对数据库的操作,即使他不明白的SQL语法和JDBC编程。
    数据库访问层结构,浏览器程序来访问数据库,首先通过中间件,中间件和数据库操作通过对数据库操作的权限进行认证。

    用户访问数据库的中间件认证完成后,数据库查询,插入,更新和删除操作都封装在中间件,中间件服务器端,对数据库进行操作,然后将结果返回给浏览器最终用户的中间件通过Web服务器。以这种方式,客户端输入用户名和密码,加密算法可以通过网络进行传输进行加密,解密的认证中间件,然后访问操作,数据库访问用户名和密码在位于服务器端中间件,从而更安全。该系统采用了这样一个三层的数据库访问模式的结构。
    在三层模式时,命令将被发送到“中间层”服务和“中间层”将SQL语句发送到数据库中。数据库处理SQL语句并将结果返回“中间层”,他们返回给用户“中间层”。其模型如图2-2所示。

    因为“中间层”可以控制和协调对数据库的访问进行更新,你可以使用一个易于高层次的API,它可以通过“中间层”进行转换,转换成底层调用。因此,在许多情况下,三层模型可以提供更好的性能,在系统中使用该模型。
    JDBC是一个桥梁JAVA应用软件和数据库。它提供三种服务:一是建立与数据库的连接。其次,通过SQL语句到数据库。三,结果从SQL语句的数据库中获得。当前者建立一个JDBC连接到数据库,首先,它必须首先获得该数据库的JDBC驱动程序,调用Class.forName (连接)执行此工作。建立数据库连接的第一步是将JDBC驱动程序类装载到JVM ( Java的VirtualL机) ,按照指定的类名, JDBC驱动程序的使用本系统内的forName java.lang.Class中的类( )静态函数加载英寸完成这些步骤来加载驱动程序必须使用规定的getConnection ( )静态函数java.sal.DriverManager下课后,所做的对象和数据库之间的连接。这种连接对象类类型是java.sal.Connection ,它必须被传递到SQL命令到数据库,并把结果还需要打通的连接对象。当对象获得连接,你必须获得一个Statement对象来执行对数据库的SQL命令。语句实现两个主要功能:执行SQL语句,并取得了成果。执行SQL查询java.sql.Statement中的对象或修改命令功能后返回ResultSet对象,提供对SQL的执行管线的结果,为了通过数据表从数据库中删除它。每个Statement对象只能产生一个ResultSet对象。
    在图2-3所示的数据库连接:

    有了JDBC ,发送SQL语句就是一件很容易的事,以各种关系数据。换言之,有了JDBC API,就不必访问专门写一个程序访问Oracle数据库和专门写一个程序或访问Informix数据库和写另一个程序,等等Sybase数据库,只需使用JDBC API的程序员写一个程序就够了,它可以将呼叫发送到适当的SQL数据库。同时,结合Java语言和JDBC使程序员不必编写不同的应用为不同的平台,您可以简单地写一遍程序将运行在任何平台上,这是Java语言“一次编写,到处运行”的优势。
    Java数据库连接体系结构是一种标准的方式为Java应用程序连接到数据库。在JDBC API的实现,数据库连接模式界面条款的Java程序员和服务提供商。作为一个API , JDBC提供程序开发的标准接口,并提供了一个标准方法,数据库厂商和第三方中间件厂商实现与数据库的连接。 JDBC使用现有的SQL标准,并支持如数据库之间的ODBC桥连接标准。 JDBC来执行所有这些标准,并具有面向对象的接口,便于实现确定的输入和严格的性能。
    Java有一个强大的,安全的,易于使用,易于理解,可以从互联网和其他功能自动下载,是编写数据库应用程序的优秀语言。这种方法只有一个具有多种不同的Java应用程序需要对话数据库。 JDBC是一种机制,用于上述用途。
    JDBC的Java扩展功能。例如,使用Java和JDBC API可以发布含有applet的网页,并且这些信息可能被使用的小程序从远程数据库企业可以通过内联网使用JDBC向全体员工将被连接到一个或多个内部数据库(即使这些员工使用的电脑有多种不同的操作系统Windows,Macintosh和UNIX等) 。随着越来越多的程序员开始使用Java编程语言,为方便从Java要求的数据库也越来越高。
    2.6 BS模式与C/S模式的比较分析C / S模式,主要是由客户端应用程序(客户端) ,服务器管理程序(服务器)和中间件(中间件)三部分组成。客户端应用程序是用户与系统的数据组件交互。服务器程序负责系统资源,如管理信息数据库的有效管理,其主要工作是当多个客户端同时请求同一个服务器上的资源,以优化这些资源的管理。中间件是负责连接客户端应用程序和服务器管理器,一个合作作业完成,以满足用户的查询的管理数据的要求。
    B / S模式是一种基于Web的技术平台的新MIS系统模式。传统的C / S模式,服务器部分被分成一个数据服务器和一个或多个应用服务器(Web服务器) ,从而构成一个三层客户机 - 服务器体系结构。
    第一层是在用户和客户机在整个系统之间的接口。简化客户端应用程序到一个通用的浏览器软件,如Netscape Navigator ,微软的IE浏览器等。浏览器的HTML代码到图文并茂的网页。现场也有一些互动功能,使用户输入提交给后台提供的网络申请表上,并处理请求的信息。第二层是背景的Web服务器。
    Web服务器的第二层将启动进程来响应此请求,并动态生成一串HTML代码,其结果是嵌入式处理,返回给客户端的浏览器。如果客户端提交的请求包括数据访问,Web服务器和数据库服务器需要完成协同处理。
    第三层是数据库服务器的任务类似于C / S模式,负责协调SQ不同的Web服务器发送请求,管理数据库。
    B / S模式的优势
    首先,它简化了客户端。它并不需要安装像C / S模式不同的客户在不同的客户端应用程序,并简单地安装一个通用的浏览器软件。这不仅节省了客户端的硬盘空间和内存,使安装过程更简单,更灵活的网络架构。假设一个企业决策者开座谈会库存问题,他们只是直接从电脑查询数据通过浏览器的会议室,然后显示给大家看的。与会者还可以把连一台笔记本电脑相连的网络接口上的会议室,自己的查询相关的数据。其次,它简化了系统的开发和维护。系统开发人员不再需要为不同级别的用户设计和不同的客户端应用程序的开发,而只是把所有的功能都在Web服务器上实现,不同的功能,为用户在其上设置权限为每个组。每个用户通过调用权限范围内的HTTP请求一个不同的Web服务器上的处理程序,从而完成数据的查询或修改。现代企业面临着不断变化的竞争环境中的企业运作机制内的更新和调整已经变得越来越频繁。相对于C / S,维持B / S拥有更大的灵活性。当情况发生变化,它不再需要为每个应用程序升级现有客户,但只是为了对Web服务器进程的服务进行修改。这不仅会提高公司的运作效率,而且还省去了麻烦的维护协调很多。如果一家公司有数千家客户,并分布在不同的位置,因此便于维护将变得更加重要。
    再次,它使用户的操作更容易。对于C / S模式,客户端应用程序都有其特定的规格,使用者需要接受专门的培训。而采用B / S模式,客户端只是一个简单易用的浏览器软件。无论是决策或操作层面的员工有没有培训,可直接使用。这种特性的B / S模式还允许限制因素MIS系统维护工作量少。
    最后, B / S特别适用于网上信息传播,传统的MIS系统的功能不断扩大。这是一个C / S无法实现。而这个新的在线信息发布仅仅是一个现代企业的需求。这使得大部分的书面文件可以通过电子文件取代,从而提高企业的工作效率,简化办事程序,使企业,节省了人力物力。
    鉴于B / S相对于C / S的性质, B / S已经成为一种流行的MIS系统平台。软件公司纷纷推出自己的互联网项目,基于Web的财务系统,基于Web的ERP 。一些公司已经开始使用它,领先一步,并收到了一定的效果。
    新颖和流行的B / S模式,并优先在某些方面相对于显著高于C / S ,使B / S成了MIS系统平台的首要选择。

    3 系统分析3.1 系统可行性分析可行性研究的目的是用最小的代价判断在问题定义阶段所确定的系统的目标和规模是否能实现,所确定的问题是否可以解决,系统方案在经济上、技术上和操作上是否可以接受。
    3.1.1 经济可行性JSP(Java Server Pages)是“基于Java的服务器段动态页面设计”,软件方面只需要Java虚拟机。通过文本编辑器就可以实现系统开发,并且Java虚拟机可以在Sun公司的官方网站上免费下载。从资金投入上看,建立较完备的学生会管理信息化平台,投入从几万到几十万不等,大多数学校管理部门是可以承受起的。通过至顶向下分析逐步求精的方法对系统进行设计,并通过维护使系统逐步完善,从而达到经济上的节约。
    3.1.2 软件和硬件条件从硬件环境来看,校园网硬件已相当完备,学生会管理信息化平台可依靠学校自身的网络环境和计算机设备。从软件环境来看,目前已经开发的类似系统存在着单一,功能过于简单大部分功能不能实现。基于这些原因,我们着手设计和开发更适合当今学校学生会管理的软件系统。随着计算机得到广泛应用,高校学生学生会管理者和大部分员工习惯使用计算机办公和通过上网查找信息。
    3.1.3 技术可行性JSP(Java Server Pages)是基于JavaServlet及整个Java体系的Web开发技术,它由Sun Microsystems公司在1996年6月推出。JSP在HTML代码中嵌入Java程序片断,并使用各种JSP指令,构成了JSP页面。这种页面可以完成操作数据库、上传文件等复杂的逻辑处理功能。另外,还通过支持JavaBean实现了功能扩展。JSP技术让动态网页的编写更加容易、功能更强,可移植性、可扩展更好。总结起来它具有:

    将内容的生成与显示分离
    支持可重用组件
    采用标签简化页面开发
    一次编写,处处运行的特点

    从技术上看,该系统可以运行于 windows 系列操作系统当中,可以为系统提供一个稳定的运行环境,在数据库方面也显得比较有利。因此更加节省了该系统开发经费,该系统应该说有开发的必要性。
    3.1.4 操作可行性从操作角度来分析,本系统操作简单方便,只要懂得上网都能方便操作本系统。所以在操作上也是可行的。
    3.2 系统功能需求概述系统需求文档是为了能在总体上对该软件有个整体认识,能从整体上把握方向,不至于盲目而使得浪费人力物力,从而达到节省时间、经费的目的。该项目的名称是“学生会管理系统”,开发此软件是由于市场上的同类软件不能全面的满足当前学校学生会管理的需要。因此该软件的开发自然而然提上了日程。该软件的开发主要用了 Java JDK1.5 开发工具和Sqlserver2005数据库软件,其中涉及了很多有关数据库知识如:数据库的插入,删除,更新以及数据库的安全性和参照完整性等将在设计过程中体现出来。
    本课题要实现的是学生学生会管理系统,在设计该系统时,应尽可能的贴近学生管理人员,便于用户操作。系统应提供简单、层次关系明了、清晰的操作界面,使用户一目了然。尽可能的为用户的录入、查询等功能操作提供方便。系统包括学生会干部、学生会成员两个角色,学生会干部实现了在考勤管理、活动记录、个人考评、活动管理、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能;学生会成员登录系统实现了查看个人考勤、活动记录、个人考评、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能子模块。
    3.3 系统设计规则与运行环境3.3.1 设计规则无论哪个网站都要有它自己的设计规则。该系统也一样,它的主要设计规则有:

    简单性:在实现系统的功能的同时,尽量让系统操作简单易懂,这对于一个系统来说是非常重要的
    针对性:该系统设计是学生学生会管理系统及后台管理的定向开发设计,所以具有专业突出和很强的针对性
    实用性:该系统能完成活动信息管理和文档管理的基本信息,具有良好的实用性

    3.3.2 运行环境本系统是一个WEb版的应用程序,需要在服务器上部署中间件Tomcat、MySQL数据库,其他的客户端通过网络进行访问该服务器即可。

    硬件平台:

    CPU:酷睿i3 -3.0GHZ内存:2G以上硬盘:320GB
    软件平台:

    操作系统:Window XP 或Win 7均可数据库:MySQL数据库

    第四章 总体设计4.1 架构设计软件架构设计,以达到以下目标:

    可行性,体系结构是可行的是建筑设计的基石
    可靠性,软件系统是为用户的业务经营及管理,软件系统至关重要,因此,必须是非常可靠的
    安全线,通过软件系统进行的交易的商业价值高,安全系统是非常重要的
    可定制,同样的一套软件,可以根据客户和市场的不同需求而有所不同进行调整
    可扩展性,在新的技术出现,一个软件系统应当允许引进新技术,从现有系统和扩展的性能的功能
    可维护性,维护软件系统包括两个方面,一个是排除现有的错误,二是新的软件需要反映在现有的系统中。一个易于维护的系统可以有效地降低技术支持成本
    可扩展性,软件在用户的数量,以便能够使用情况下,用户迅速增加,保持合理的性能

    4.2 接口设计4.2.1 外部接口用户界面
    用户界面即为Windows窗口。用户通过web页面上的菜单,按钮,文本框等元素与系统进行沟通。
    软件接口
    开发工具采用MyEclipse开发平台开发。
    硬件接口
    包括传统的与键盘,鼠标,显示器的接口,用来输入和输出。另外,还有与打印机的接口,以便打印报表和统计结果。也是用于输出。
    4.2.2 内部接口内部接口,使用不同的功能模块,参数传递的调用,返回按值传递的信息。具体参数结构将在结构设计数据的上下文中进行说明。接口的信息传输是基于一个数据结构,其包括数据,以形成一个参数或模块之间传递的返回值。
    4.3 代码设计4.3.1 代码设计的原则代码设计遵循以下原则:

    确定性,实体和每个代码的属性仅代表;相反,信息系统,每个实体或属性与特定的代码来表示
    标准化,考虑到企业信息系统部门,负责通信和网络的需求,尽可能与国际标准代码,国家,部门
    多样化,尝试使用原始代码和有效的业务流程已经在使用,使用方便
    扩展性,考虑到业务的发展和变化,增加实体和新的,直接用原代码的属性被添加时,保持系统不改变原代码
    识别性,使用需要,方便管理代码,和电脑应该很容易识别,分类
    简明性,在不影响编码和可扩展编码场所尽可能简洁统一的能力

    4.3.2 系统所需代码设计代码设计原则

    系统性:宏观把握,全局共享
    灵活性:易于修改,扩充能力强
    可靠性:安全,检错纠错能力,抗病毒能力
    经济性;使用第一,切记华而不实

    代码的功能
    便于数据的存储和检索,使信息系统在数据输入时更简单;通过代码提高了计算机处理的效率和精度;提高了数据的全局一致性;代码是人和计算机交流的一种工具或共同的语言。
    代码设计应注意的问题
    代码设计在逻辑上应满足用户需求。代码唯一性。预留发展空间,以适应变化的需要。尽量使代码结构有实际意义。避免引起误解,不要使用易混淆的字符。采用不易出错得代码结构。代码过长时,要注意分成小段。
    代码的种类

    顺序码
    区间码
    层次码

    4.4 系统功能图椐据对系统需求分析中的总体目标和具体目标部分的分析,系统包括学生会干部、学生会成员两个角色,学生会干部实现了在考勤管理、活动记录、个人考评、活动管理、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能;学生会成员登录系统实现了查看个人考勤、活动记录、个人考评、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能子模块。得到系统的体系结构如图4-1所示:


    第五章 数据库设计数据库设计,系统设计是一个非常重要的方面。数据是所有系统的设计,通俗地说,数据库设计为高层建筑的基础,因为如果设计不合理,不完善,将在系统开发过程中,甚至到了系统的后期维护的基础上,功能的变化和功能扩展时,造成更多的问题,甚至是严重的重新设计时,重做了很多工作已经完成。
    5.1 数据库的选定目前主流数据库主要有Oracle、SQL Server、Mysql、Access等。本系统运行在windows服务器上故而选择了MySQL。MySQL是一个关系型数据库,它的数据库引擎为关系型数据和结构化数据提供了更为安全而且可靠的存储功能,而且完全开放源代码。MySQL与 Microsoft Visual Studio、Microsoft Office System 以及新的开发工具包(包括 Business Intelligence Development Studio)紧密集成。
    5.2 安全性设置MySQL中存放了所有用户的数据,保障数据安全放置用户的隐私泄露至关重要。数据库安全性设置包括:

    安装数据库时使用混合模式,数据库密码不能为空,在安装完成数据库后将超级用户名修改或者是删除。同事使用安全的账户策略。对用户实施最强的保护,我们要使用一个强壮的密码
    禁止管理员接触数据库,禁用多余的账户
    管理扩展存储过程。我们要将不必要的存储过程删除掉,以免被别有用心的人利用从而破坏我们的数据库
    对远程的网络连接进行IP限制,使用系统提供的IPSec策略。拒绝非法IP所做的端口连接,将威胁降到最低
    设置服务器安全,打开服务器安全=》属性安全=》启用登录审核中的失败与成功登录,启用C2审核跟踪,监视所有数据库试题的所有访问

    5.3 数据库设计规范在概念设计中,通常用四种方法:
    自顶向下:先定义,然后逐步细化的全球结构的概念框架;从底向上:先定义每个局部应用的概念结构,然后将它们集成在一起以得到一个全局概念结构;逐步扩大:首先定义的核心概念结构,然后向外扩展,直至整体概念结构;混合策略:自上而下和自下而上结合自上而下的策略来设计一个全球性的概念。其结构,每一个本地集成底向上策略设计的骨架结构的概念在物理结构设计阶段首先分两步走。确定数据库的物理结构,在关系数据库中主要是指存取方法和存储结构。 对物理结构的评价是时间和空间效率.
    选取正确的关系模式存取方法,常用的有:存取索引方法、聚簇存取、HASH存取方法等。
    5.4 数据库建模根据以上分析,能够提取以下几个实体。系统整体E-R图如下5-2所示。

    系统实体及实体属性分析:
    用户实体及其属性图

    活动实体及其属性图

    考勤实体及其属性图

    5.5 关系描述的设计根据以上各实体图和学生会管理系统的E-R图,经过转换后,可以得到如下各表。
    用户信息表,用于存储用户相关信息。



    中文名称
    数据类型
    主外键
    字段约束




    ID
    Int(4)
    Y
    NOT NULL


    用户名
    Vachar(8)
    N
    NOT NULL


    权限
    Vachar(20)
    N
    NOT NULL


    姓名
    Vachar(20)
    N
    NOT NULL


    性别
    Vachar(20)
    N
    NOT NULL


    生日
    Vachar(20)
    N
    NOT NULL


    联系电话
    Vachar(20)
    N
    NOT NULL


    部门
    Vachar(20)
    N
    NOT NULL



    活动信息表,用于存储活动信息。



    中文名称
    数据类型
    主外键
    字段约束




    ID
    Vachar(20)
    Y
    NOT NULL


    活动名称
    Vachar(20)
    N
    NOT NULL


    活动日期
    Vachar(20)
    N
    NOT NULL


    地点
    Vachar(20)
    N
    NOT NULL


    备注
    Vachar(20)
    N
    NOT NULL


    相关文档
    Vachar(20)
    N
    NOT NULL



    考勤信息表,用于存储考勤信息。



    中文名称
    数据类型
    主外键
    字段约束




    ID
    Vachar(20)
    Y
    NOT NULL


    姓名
    Vachar(20)
    N
    NOT NULL


    考勤日
    Vachar(20)
    N
    NOT NULL


    事项
    Vachar(20)
    N
    NOT NULL


    类别
    Vachar(20)
    N
    NOT NULL



    得到以上关系后,根据数据库相关理论的要求,对所有关系进行关系规范化,要求各个关系至少要达到第三范式的要求,按照第三范式的要求对比以上各个关系在所有关系中都不存在非主属对关键字的部分依赖,即满足第三范式。
    第六章 系统实现系统包括学生会干部、学生会成员两个角色,学生会干部实现了在考勤管理、活动记录、个人考评、活动管理、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能;学生会成员登录系统实现了查看个人考勤、活动记录、个人考评、工作计划、信息查看、文档管理、修改个人信息、修改登录密码等功能子模块。以下对这些功能模块的具体实现过程进行介绍。
    6.1 登录模块实现用户登录模块主要实现用户登录系统的功能,用户需要输入用户名、口令等信息,并点击登录按钮实现登录系统的功能。用户登录模块界面如下图6-1所示。

    用户登录模块流程图如图6-2所示。


    第七章 测试7.1 测试目的软件测试在整个软件设计中占有重要地位,软件测试之前,只能在运行和维护阶段,传统的瀑布模型,是确保交付给软件质量之前,用户的软件产品的一个重要途径。最近,新的软件工程往往会看到,认为软件生命周期的各个阶段应包括测试,以检查是否该阶段的结果预计将接近目标,找出错误并尽可能早地,如果不解决这些问题在早期阶段的测试,难度的误差传播延迟往往导致测试最终产品。
    事实上,有问题的软件,不管什么技术和什么方法,软件将仍然是错误的。采用一种新的语言,先进的开发方法,改进开发过程,可以减少引起的误差,但不能在软件中消除错误,它引入了需要测试发现错误,软件中的错误还需要密度估计进行测试。测试是所有工程学科的基本单元,是软件开发的一个重要组成部分。自天的测试程序设计参加。统计显示,在一个典型的软件开发项目,软件测试工作往往是软件开发工作的总负担的40%以上。和软件开发的总成本,其成本为这个测试是30%至50%。如果维护阶段也考虑在内,讨论软件寿命试验,整体成本的比例可以降低,但二次开发实际上等同于维修,以及一些发展,这也必须包含大量的测试。
    软件测试是最低价格发现系统的分析,设计,编码存在于各种各样的问题,从而提高系统的质量。附带收获试验可以确认是否按照规范的要求,系统的功能和性能;同时,在测试后所收集的数据的结果,提供了一系列可靠的软件。
    软件测试方法和技术各不相同,可以从不同的角度进行分类。测试系统是否与特定算法的角度实施的内部结构,可分为黑盒测试和白盒测试。
    黑盒测试主要是进行以测试系统的功能,这两个程序可为每个操作可以有效地履行其角色,并且不会有任何异常发生。对于每一个点的作业系统已经过测试,每一个环节和按钮操作可以准确地显示正确的JSP页面,对数据库中的每个操作可更新的,准确的数据到数据库在数据库中不作例外。该系统允许操作的每一个步骤,以避免滥用。软件测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试学仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶段中都应包含测试,从而检验本阶段的成果是否接近预期的目标,尽可能早的发现错误并加以修正,如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。
    事实上,对于软件来讲,不论采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。测试是所有工程学科的基本组成单元,是软件开发的重要部分。自有程序设计的那天起测试就一直伴随着。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总成本中,用在测试上的开销要占30%到50%。如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,乃至多次开发,其中必定还包含有许多测试工作。
    软件测试是以最少的代价发现系统分析,设计,编码中存在的不同类型的问题,从而提高系统的质量。测试附带的收获是能证实系统的功能和性能是否与需求说明相符;同时,测试后收集的结果数据提供了软件可靠行。
    软件测试的方法和技术是多种多样的,可以从不同的角度加以分类。从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为黒盒测试和白盒测试。
    黑盒测试主要是针对系统的功能进行测试,既程序中每一个可用操作是否可以有效的行使其作用,并且不会有异常发生。针对这一点对该系统的每一个操作都进行了测试,即每一个链接和按纽操作都可以准确的显示出正确的JSP页面,每一项针对数据库的操作都可以将数据准确的更新到数据库中,不使数据库产生异常。系统会对用户的每一步操作进行提示,以免误操作。
    7.2 测试实例登录模块测试表



    测试用例
    操作过程及数据
    预期结果
    实际结果
    偏差




    输入已存在的用户名和密码
    用户名:admin 密码:admin
    登录成功
    登录成功



    输入不存在的用户名和密码
    用户名:hello 密码:hello
    系统提示用户名和密码不正确
    系统提示出现错误
    提示不同



    7.3 测试结果系统经过测试实现了基本功能,可以正常使用。但系统的功能还不够完善,在软件投入使用后,必然会有一些隐藏的错误被暴露出来。在以后的学习中,要加强这些方面的学习,多查阅相关资料,多实践,积累经验,避免上述的缺憾和限制。
    结论经过三个月的努力,我的毕业设计:学生会管理系统终于圆满设计完成了,其功能基本符合用户需求。
    这次设计,使我学到了很多书本上没有的知识,提高了我对问题的分析能力。在这些天不分昼夜实践和摸索中,我受益匪浅,感触良多。此外,通过这次毕业设计,使我感到我的所学知识还是不够的,还要继续多加努力。由于毕业设计时间较短,所以该游戏还有许多不尽如人意的地方,有待进一步改善。
    毕业设计是要将四年来所学到知识的贯穿,并创制出新的成果。通过这次的毕业设计也让我学会了如何去查找各种相关资料,以及遇到问题后该如何去找到解决问题的方法。经过这三个月的毕业设计,我发现自己遇到问题后不再那么慌张,可以沉着的去分析、解决问题。这对我以后的工作会有很大的帮助的。
    参考文献[1]田翔川,田忠和,谢志宇.JSP数据库连接池的设计[J].计算机应用研究,2009.
    [2]明日科技. Java从入门到精通(第3版)[M].北京:清华大学出版社,2012.
    [3]蒋宗礼,马涛,唐好魁,闫明霞等.数据库技术及应用(第2版)[M].电子工业出版社,2010:43-65.
    [4]刘瑞新,张兵义.大学计算机规划教材:SQL Server数据库技术及应用教程[M].电子工业出版社,2012,8.
    [5]潘利群,李耿.JavaBean在JSP中的应用研究[J]..武汉理工大学学报2010,25(5):65-67.
    [6]李盛恩,王珊.数据库基础与应用(第二版)[M].北京:人民邮电出版社,2009:14-78.
    [7]吴以欣,陈小宁.JavaScript脚本程序设计[M].北京:北京人民邮电出版社[M]2005.
    [8]郝玉龙.J2EE编程技术[M].北京:清华大学出版社,2005.
    [9]埃史尔.Java编程思想(第4版)[M].机械工业出版社,2007:768-855.
    [10]张大治,王欢.JSP实用教程[M].北京:清华大学出版社,2006.
    [11]张永.Java环境下JavaBean的分析与应用[J].计算机与现代化,2005,10(6):73-76.
    [12]张德详.J2EE架构下校园网用户管理系统的分析与部分实现[J].青岛大学学报,2010,19(4):86-89.
    [13]郑凯,刘爱芳.基于JSP的分页和页面保存技术的实现[J].计算机工程,2009,30(1):179-181.
    [14]李明江.动态网页技术JSP与ASP、PHP的比较浅析[J].黔南民族师范学院学报,2010.
    [15]Vivek Chopra,Jpn Eaves,Rupert Jpmdes. Beginning Java Server Pages[M],wrox,2005.
    0 评论 1 下载 2019-05-10 10:03:35 下载需要15点积分
  • 基于JAVA和SQL SERVER数据库实现的人力资源管理系统

    一、系统开发平台1.1 介绍人力资源管理系统, 通过提高内部员工的满意度、忠诚度,从而提高员工贡献度,即绩效,帮助管理者通过有效组织管理降低成本和加速增长来创造价值链利润。随着企业的规模不断扩大,员工数量急剧增加,有关员工的各种信息量也成倍增长。面对庞大的信息量需要有人力资源管理系统来提高员工管理工作的效率。一个完善的人力资源信息管理系统能够极大地提高员工信息管理的效率。
    1.2 开发环境
    开发语言:Java

    用Java做设计流程清晰、结构合理,有良好的可扩充性和耦合性
    开发工具:Eclipse V4.5.0 JDK 1.8
    数据库:Microsoft SQL Sever 2012
    操作系统:Microsoft Windows 10

    二、数据库规划2.1 任务陈述人力资源管理系统是一个企业不可缺少的部分,它的内容对于企业的决策者和管理者来说都至关重要。随着企业的规模不断扩大,员工数量急剧增加,有关员工的各种信息量也成倍增长。面对庞大的信息量需要有人力资源管理系统来提高员工管理工作的效率。一个完善的人力资源信息管理系统能够极大地提高员工信息管理的效率,具有检索迅速、查找方便、可靠性高、存储量大、更新快、寿命长、成本低等优点。
    企业在正常的运营中需要对员工档案信息、部门资料、企业报表进行管理,利用人力资源管理系统及时了解各个环节中信息的变更,有利于提高管理效率。
    2.2 任务目标本系统主要可以实现以下任务目标:

    系统在员工进入公司时为员工建立人事档案,人事档案应该包括:

    员工基本信息:编号、姓名、性别、邮箱、电话、员工进入公司的时间、员工级别、员工所在部门和员工级别等员工技能情况:员工接受的培训、具备的技能等
    员工的工资应该包括基本工资和奖金两个部分:

    基本工资根据员工的级别划分(试用员工、普通员工、组长、部门经理、总经理)奖金应根据员工的业绩由其直接或更高级领导确定
    员工在来到公司上班时应该首先登录公司系统签到,离开公司时登录系统签离。如果办事外出或者出差应由上级领导确认考勤情况。缺勤或者迟到按一定数额罚款,迟到2小时以上算缺勤
    员工离职应保留员工的历史信息,以备日后查询
    系统还应该提供强大数据统计、查询、报表生成以及打印等功能
    用户权限管理
    异常处理

    三、需求分析3.1 用户需求说明3.1.1 数据需求公司有一名总经理,多名试用员工、普通员工、组长、部门经理。总经理负责公司的管理,部门经理与组长负责按级别管理员工,分配工作,管理员负责更新信息。
    职工号在公司内唯一。

    员工基本信息:职工号、密码、姓名、性别、邮箱、电话、员工进入公司的时间、员工职位级别(FK)、员工所属部门(FK)、是否离职
    公司部门:部门号、部门名字、部门经理
    公司职位:职位号、职位名、职位级别、部门号(FK)
    员工工资:职工号、职位级别、基本工资、业绩等级、奖金
    培训表:培训号、培训名、培训描述
    技能表:技能号、技能名、技能描述
    培训联系:员工号、培训号、培训名、成绩
    技能联系:员工号、技能号、技能名、熟练度

    员工在来到公司上班时应该首先登录公司系统签到。缺勤或者迟到按一定数额罚款,迟到2小时以上算缺勤。由管理员定时统计签到情况。

    签到表:职工号、年份、月份、日期、时刻、是否迟到
    考勤表:职工号、迟到次数、缺勤次数、罚款数

    3.1.2 事务需求
    管理员

    数据录入

    录入新员工基本信息录入公司部门信息录入职位信息录入员工业绩工资信息录入员工受培训信息录入员工技能信息录入员工考勤情况
    数据更新

    更新/删除员工基本信息更新/删除公司部门信息更新/删除职位信息更新/删除员工业绩工资信息更新/删除员工受培训信息更新/删除员工技能信息更新/删除员工考勤情况
    数据查询

    查询员工基本信息查询公司部门信息查询职位信息查询员工业绩工资信息查询员工受培训信息查询员工技能信息查询员工考勤情况查询员工签到情况

    员工

    查询员工基本信息查询公司部门信息查询职位信息查询员工业绩工资信息查询员工受培训信息查询员工技能信息查询员工考勤情况查询员工签到情况进行签到修改下级员工的工资

    3.2 系统需求说明3.2.1 初始数据库大小
    大约有1000名员工,分属于约20个部门中,每个部门有5个以下的职位
    公司提供10余种培训,员工最多可选择5种
    员工技能10余种,每人最多5种
    很多考勤条目

    3.2.2 网络和共享需求
    所有部门必须安全的和总部中央数据库网络互连
    必须能够支持至少100名成员同时访问.需要考虑大数量并发访问的许可需求
    3.2.3 性能单个记录查询时间少于1秒,高峰期少于5秒
    多个记录查询时间少于5秒,高峰期少于10秒
    更新/保存记录时间少于1秒,高峰期少于5秒

    3.2.4 安全性
    数据库必须有口令保护
    每个用户分配特定的用户视图所应有的访问权限
    用户只能在适合他们完成工作的需要的窗口中看到需要的数据

    3.2.5 备份和恢复
    每天24点备份
    用户界面

    菜单驱动联机帮助
    法律问题

    对员工信息管理,遵守法律

    四、数据库逻辑设计4.1 ER图
    该ER图包括员工、部门、职位、工资、培训、技能、考勤七个实体和工作于、包含、属于、得到、选择、拥有、进行七个关系。
    4.2 数据字典4.2.1 系统实体描述员工表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Password
    密码
    Varchar 50



    Sex
    性别
    Varchar 2



    Name
    姓名
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Branch_id
    部门号 (外码)
    Varchar 32



    Position_id
    职位号 (外码)
    Varchar 32



    Email
    邮箱
    Varchar 50



    Phone
    电话
    Varchar 50



    Hiredate
    入职时间
    Varchar 50



    Service_state
    是否离职
    Varchar 2




    部门表



    属性
    描述
    数据类型和长度
    是否允许空值




    Branch_id
    部门号
    Varchar 50



    Branch_name
    部门名
    Varchar 50



    Manager_id
    经理职工号 (外码)
    Varchar 50




    职位表



    属性
    描述
    数据类型和长度
    是否允许空值




    Position_id
    职位号
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Position_name
    职位名
    Varchar 50



    Branch_id
    部门号 (外码)
    Varchar 50




    培训表



    属性
    描述
    数据类型和长度
    是否允许空值




    Course_id
    培训课程号
    Varchar 50



    Course_name
    培训课程名
    Varchar 50



    Course_detail
    培训描述
    Varchar 128




    技能表



    属性
    描述
    数据类型和长度
    是否允许空值




    Skill_id
    技能号
    Varchar 50



    Skill_name
    技能名
    Varchar 50



    Skill_detail
    技能描述
    Varchar 128




    工资表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Base_salary
    基本工资
    Int 4



    Achievement
    业绩级别
    Varchar 50



    Bonus
    奖金
    Int 4




    考勤表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Late
    迟到次数
    Int 4



    Absence
    缺勤次数
    Int 4



    Fine
    罚款数额
    Int 4




    签到表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Year

    Varchar 50



    Month

    Varchar 50



    Day

    Varchar 50



    Time
    时间
    Varchar 50



    Late
    是否迟到
    Varchar 50




    4.2.2 从数据字典中抽取出来的联系的描述:


    实体
    多样性
    联系
    多样性
    实体




    员工
    m
    工作于
    1
    部门


    员工
    m
    属于
    1
    职位


    员工
    m
    选择
    n
    培训


    员工
    m
    拥有
    n
    技能


    部门
    1
    包含
    m
    职位



    4.3 关系表
    五、应用程序设计5.1 功能模块5.1.1 管理员
    登录系统
    查询员工基本信息、公司部门职位、员工技能培训、员工工资、签到考勤信息
    添加以上信息的新条目
    修改以上数据
    定时查询签到表并对员工迟到缺勤情况进行更新

    5.1.2 员工
    登录系统
    查询以上信息
    签到并查询签到和考勤情况
    根据职位级别赋予修改下级员工奖金的权限

    5.2 界面设计5.2.1 登录根据职位等级,管理员与用户账号进入的界面不同,操作权限也不同。

    若用户名或密码为空。

    若用户名不存在。

    若密码错误。

    5.2.2 用户界面填写上方条件进行查询。

    不填写条件则默认为查询整个表。


    只能修改下级员工的奖金。

    每天签到一次,第二次不再更新时间。

    5.2.3 2.管理员界面管理员可以添加修改信息。



    管理员定时进行员工迟到缺勤情况的考勤并罚款。

    六、总结6.1 经验体会本次课程设计使我深切体会到了知识面狭窄的弊端,痛心地吸取了教训。由于对网页程序的编写一窍不通,此前也没有学习过任何有关html、css等的相关知识,我对开发网页数据库界面的信心不足,导致我最终只编写出一个连接了数据库的Java程序,采用了Java自带的图形界面功能,既不美观也不方便用户使用,我对此感到十分惭愧难过。
    但在为期两周的设计过程中,我也学习到了不少技巧。例如,设计数据库应该实事求是,与时俱进,妄想一次性将理论设计完成、写完文档再去实现功能代码是不正确的,应该一边编写一边修改,逐渐将程序和文档都完善起来。但是一味地进行实践而不去分析理论也是不可行的,最基本的要做到按照老师给的设计提纲,先进行目标明确,任务分析,再是需求分析,ER图,关系表,然后才是数据库逻辑设计,数据库物理设计,最后是应用的实现与完善。把握好用户需求,并不断地修改完善,才能设计开发出优秀的软件。
    6.2 系统特色本程序基本实现了人力资源管理中所应用的大体功能。对于用户来说可以查询本公司各部门各职位各个职员的基本信息、工资情况、签到考勤等,上级职位等级还可以决定下级员工的奖金情况。对于管理员具有各种查询修改添加信息的权限,并进行签到考勤评测。
    主要倾向于统计和展示人力资源的基本信息,界面简洁清晰,操作简便明了。
    6.3 系统完善系统除了展示添加修改信息与签到考勤外没有其他的功能,用作公司的人力资源管理系统尚显不足。如果需要完善,应添加信息注销删除、工资发放、出差安排、职位部门调动、报表生成以及打印、权限管理及异常处理等功能。
    2 评论 71 下载 2018-11-26 21:51:22 下载需要5点积分
  • Python实现的基于Scrapy爬虫框架和Django框架的新闻采集和订阅系统

    摘要随着互联网的迅速发展,互联网大大提升了信息的产生和传播速度,网络上每天都会产生大量的内容,如何高效地从这些杂乱无章的内容中发现并采集所需的信息显得越来越重要。网络中的新闻内容也一样,新闻分布在不同的网站上,而且存在重复的内容,我们往往只关心其中的一部分新闻,网络中的新闻页面往往还充斥着大量许多与新闻不相关的信息,影响了我们的阅读效率和阅读体验,如何更加方便及时并高效地获取我们所关心的新闻内容,本系统能够帮我们做到这一点。本系统利用网络爬虫我们可以做到对网络上的新闻网站进行定时定向的分析和采集,然后把采集到的数据进行去重,分类等操作后存入数据库,最后提供个性化的新闻订阅服务。考虑了如何应对网站的反爬虫策略,避免被网站封锁爬虫。在具体实现上会使用Python配合scrapy等框架来编写爬虫,采用特定的内容抽取算法来提取目标数据,最后使用Django加上weui来提供新闻订阅后台和新闻内容展示页,使用微信向用户推送信息。用户可以通过本系统订阅指定关键字,当爬虫系统爬取到了含有指定关键字的内容时会把新闻推送给用户。
    [关键词]网络爬虫;新闻;个性化;订阅;Python
    AbstractWith the rapid development of the Internet, the Internet has greatly enhanced the production and dissemination of information, the networkwill produce a lot of content every day, how to find and collectthe information we needed from these disorganized contentefficiently is more and more important. The news content on the network is thesame, the news is distributed on different sites, and there are many duplicate content, we only care about part of thenews usually. The network news pages areoften filled with a lot of news and information is not related that impact ourreading efficiency and readingexperience. How to more convenient and efficient access to the news we are concerned about the content, thissystem can help us to do this. This system uses the web crawler to collect news on the network site. And then toclassify data and other operations like delete the duplication,store data byuse the database, and finally providepersonalized news subscription service. This system has considered how to deal with the sit&s anti-reptile strategy, toavoid being blocked by the site crawler. In the concrete implementation, I will use Python with Scrapy framework towrite the crawler, then use a specificcontent extraction algorithm to extract the target data, and finally use Django and WeUI to provide news subscription background and news contentdisplay page, use WeChat to push information to users. Users can subscribe tothe specified keywords through the system, system will push thenews to the user when the crawler system crawled the contents contains thespecified keyword.
    [Keywords] Web Crawler;News; Personalization; Subscription; Python
    第一章 引言1.1 项目的背景和意义如今我们所处的时代是一个信息时代,信息处处影响着人们的生活,无论是个人还是企业,都希望能够获取自己所关心的内容。人们获取信息的方式渐渐从传统的纸质阅读转移到了信息传播速度更快互联网的在线阅读上,而许多媒体和互联网企业都推出了各自的新闻门户来提供新闻内容阅读和检索等功能,但是这些新闻信息仍需要我们主动去访问这些网站才能获取到,而且我们还要在这些新闻中筛选出自己所关心的内容进行阅读,这样浪费了我们许多阅读之外的时间。网络中的新闻分布在不同的网站上,我们往往只关心其中的一部分新闻,网络中的新闻页面往往还充斥着大量许多与新闻不相关的信息,影响了我们的阅读效率和阅读体验,如何更加方便及时并高效地获取我们所关心的新闻内容,这是一个急需解决的问题,本系统就是为了解决这样的痛点而产生的。
    1.2 研究开发现状分析1.2.1 个性化新闻服务现状如今国内外存在众多提供个性化新闻服务的互联网公司,如著名的ZAKER和今日头条,这些公司的产品都能够根据你的兴趣爱好来展示和推荐你喜欢的内容,这种创新性已经颠覆了传统的新闻资讯平台的市场格局,大众纷纷表现出对这些个性化新闻平台的追捧。据最新的《中国互联网络发展状况统计报告》显示,截至2016年12月,中国网民规模达7.31亿,移动互联网用户规模达到6.95亿,其中新闻资讯领域行业用户规模达到6.14亿,年增长率为8.8%,在移动端渗透率达到82. 2%。 [1]新闻资讯信息的用户需求也更加细分,用户对内容的需求也更加精细,除了方便阅读、时效性高、趣味性强外,个性化推荐方式也越来越受到用户的关注。在猎豹全球智库发布的安卓2016年1月新闻类APP排行榜中,作为个性化新闻平台的今日头条、一点资讯皆排在移动资讯APP的前三位。而前三中采用传统编辑推荐方式的只有腾讯新闻,可见如今个性化新闻平台已经成为绝对的主流。
    1.2.2 网络爬虫研究现状网页抓取工具是一种根据特定规则来自动获取互联网信息的脚本或程序。[2] 网页或搜索引擎等网站通过爬虫软件来更新自己的网站内容或者是更新对其他网站的索引。一般来说,网络爬虫会保留被抓取的页面,然后用户可以通过搜索引擎后来生成的索引进行搜索。因为爬虫访问网页的方式与人类相似,而且一般比人类访问的速度要快,会消耗访问的网站的系统资源。因此爬虫在需要大量访问页面时,要考虑到规划和负载等情况,否则容易被网站禁封。网站站长可以使用robots.txt文件来告诉爬虫访问的规则。robots.txt文件是一个具有指定格式的文件,网站站长可以通过此文件来要求爬虫机器人不能访问某些目录或者只能访问某些目录。互联网上的页面极多,而且数量一直在增长,即使是像谷歌这样的爬虫系统也无法做出完整的索引,因此在某些地方会根据需求来做一些主题化的爬虫,这样的爬虫爬到的结果往往能够更加精确。
    1.2.3 项目的范围和预期结果本文描述了基于网络爬虫的新闻订阅系统的设计与实现的过程,主要工作如下:

    编写一个网络爬虫,使其能够对网络中指定站点的新闻进行自动收集并存入数据库;
    数据的去重和网络爬虫的反爬虫策略应对;
    提供一个新闻展示页面,把爬取到的新闻展示给用户;
    提供新闻订阅页面,用户可以在页面输入指定订阅的关键词;
    编写微信推送服务,把用户订阅的新闻通过微信推送给用户;
    1.3 论文结构简介本论文的结构安排如下:

    第一章,引言。主要介绍了论文选题项目的背景、意义和目的;以及对相关领域中已有的研究成果和国内外研究现状的简要评述;介绍本系统涉及的范围和预期结果等。
    第二章,技术与原理。主要介绍本系统中所用到的主要技术和理论。
    第三章,系统需求分析。使用用例析取和用例规约等系统分析方法对本系统进行了需求分析。
    第四章,新闻采集与订阅系统的设计。介绍了系统的架构与原理,讲述本系统的各大模块的设计以及数据库的设计详情。
    第五章,新闻采集与订阅系统的实现。介绍本系统具体的实现过程以及实现的效果。
    第六章,系统部署。介绍本系统的部署环境与部署方法。
    第七章,总结与展望。对本系统所做的工作进行总结,提出了需要讨论的问题和一些本系统中可以改进的地方。

    第二章 技术与原理2.1 技术选型2.1.1 Python语言介绍Python是一种面向对象、解释型的计算机程序编程语言。它包含了一个功能强大并且完备的标准库,能够轻松完成很多常见的任务。它的语法比较简单,与其它大多数程序设计语言使用大括号把函数体包起来不一样,它通过缩进来定义语句块。[4]使用P帅on能够高效灵活地实现开发的任务,内置库以及大量的第三方库能够在许多地方避免重复造轮子的现象,有时使用c++语言来实现的一个功能可能需要几十行,Python只需要几行就足够了。与传统的脚本语言相比,Python拥有更佳的可读性和可维护性。这门语言的强大吸引到了许多开发者,拥有比较热门的Python社区,许多开发者在维护着这种Python编写的库,影响力也在日益增强。在网络爬虫领域,Python这门语言的使用也比较广泛,留下了大量的前人的学习研究的资料。基于以上优点,我选择了使用Python来开发本系统的网络爬虫部分和展示部分的服务端。
    2.1.2 Scrapy框架介绍Scrapy是一个纯Python基于Twisted实现的爬虫框架,用户只需要定制开发几个模块就可以方便地实现一个爬虫,用来抓取网页内容、图片、视频等。它最初是为了网站页面抓取所设计的,也可以应用在获取网络应用API所返回的各类数据或者是编写通用的网络爬虫。Scrapy用途比较广泛,可以应用于数据挖掘、自动化测试和数据监控等场景。Scrapy提供了一些网络爬虫中比较通用的中间件和模块等,也可以方便地编写自己所需的中间件来对爬取结果进行处理,只要在配置里面引用这些中间件就可以了。使用Scrpay来编写爬虫可以降低很多需要重复编写的爬虫处理代码所带来的成本。
    2.1.3 Django框架介绍Django是最早由Python实现的最着名的Web框架之一,最初是由美国芝加哥的Python用户组来开发的,拥有新闻行业背景的Adrian Holovaty是Django 框架的主要开发人员之一。在Adrian的领导下,Django团队致力于为Web开发人员提供一个高效和完美的Python开发框架,并授权开发人员根据BSD开源协议许可证免费访问。Django是一个高效的Web框架,可以帮助我们减少重复的代码,并把更多重点放在Web应用程序上的关键之处。在架构上,Django 跟Scrapy类似,也提供了中间件等,配置的方式也是类似的,使用类似的技术架构可以减少学习成本。本系统中我选用Django作为新闻订阅的服务端来提供API。
    2.1.4 MongoDB数据库介绍MongoDB是一个由C++语言编写的高性能,无模型的开源文档型数据库,是当前NoSQL数据库产品中最具有代表性的一种。MongoDB是使用文档来作为对象存储的,一条记录对应一个文档,集合类似传统的关系型数据库中的表,集合中存放的是那些具有同一特征或者属性的文档。在一个集合中,不同文档拥有的属性可以是不同的,这就是与传统的关系型的数据库的重点了,传统的关系型数据库要求表里的数据所拥有的属性格式都是一致的,MongoDB这种灵活性更利于文档映射到一个对象或一个实体上。对于需要经常改动数据格式或者数据格式不定的一些需求来讲,这种数据格式更为合适。MongoDB在读写性能方面也远超传统的关系型数据库的代表之一的MySQL。在本系统中我使用MongoDB 来存储爬取到的数据以及用户数据等。像MongoDB这样的非关系型数据库更合适储存爬虫数据,因为爬虫数据量可能比较大,数据之间关系型也不强。 MongoDB的性能也比传统的关系型数据库代表MySQL之类要强。
    2.1.5 AJAX介绍AJAX(异步的JavaScript + XML)本身并不是一种技术,它是由Jesse James Garrett在2005年提出的一个术语,描述了一种需要结合使用大量已经存在的技术的方式,包括HTML, JavaScript, CSS, DOM, JSON, XML等,还有最重要 JavaScript中的的XMLHttpRequest对象。当这些技术以AJAX模型的方式聚合时,Web应用程序可以更迅速地,无需加载整个页面就能更新全部或者部分的用户界面。这使Web应用能够更快地响应用户行为,带来更友好的用户体验。尽管在AJAX中X代表XML,但现在JSON使用的更多,因为JSON具有许多XML不具备的优势,比如它更轻量并且是JavaScript的一部分,各个程序语言都能够轻松解析JSON格式的数据。在AJAX模型中,JSON和XML的作用都是承载信息。[6]本系统会在新闻订阅和展示部分的前端使用AJAX来跟服务端进行交互,以达到前后端分离的目的。
    2.2 相关原理介绍2.2.1 网络爬虫介绍网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种自动提取网页的程序,它为搜索引擎从万维网上下载网页。传统的爬虫的启动从一个或多个初始网页开始的,从这些初始网页上获得接下来要爬取的URL,在抓取网页内容的过程中,不断从当前页面的内容上抽取新的需要继续爬取URL放入队列,直到满足系统的一定停止条件。[7]网络爬虫的抓取策略大致可以分为以下三类:广度优先搜索策略、深度优先搜索策略、最佳优先搜索策略等。本系统的爬虫部分使用的爬虫策略是广度优先搜索策略,因为本系统的网络爬虫具有针对性,所以爬取的层数不会很多。
    2.2.2 关键词提取技术通过分析文本,利用关键词抽取技术可以抽取出文本的关键词,关键词能够简单地反映出文本的主要内容,使人们更加直观方便地了解到文本内容的主题。关键词提取的技术有许多种,最常用的应该是基于统计的方法的TF-IDF算法。 TF-IDF(term frequency-inverse document frequency)是一种常用的用于数据挖掘与信息检索的加权技术。[8]词语的重要性是在TF-IDF算法中主要是由它在文中出现频率决定的。
    Jieba是一个基于Python的中文分词库,支持三种分词模式:精确模式、全模式和搜索引擎模式,它能够基于Trie树结构来实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图,采用了动态规划查找最大概率
    路径,找出基于词频的最大切分组合。在本系统中,将考虑使用Jieba分词基于 TF-IDF算法的关键词抽取来抽取出爬取到的新闻内容的关键词。
    2.2.3 智能推送技术当我们使用如今的一些应用程序时,会经常收到来自这些应用的推送,过多的、不适当的推送会打扰到用户,互联网技术在最近几十年里已经得到了很大的发展,但是推送通知技术仍旧停留多年以前。为了实现智能化推送,我们需要搜集和分析能够帮助我们实现智能化推送通知的用户数据,这些数据的来源可以是用户的设置或者用户在应用中产生的数据等。在智能推送通知中,与时间相关的,个性化的,有帮助的,有联系性的是智能推送通知中四个基本的特征。
    在推送的时间上,我们可以做到时间智能化,时间智能化指的是推送的时间要恰当,推送发生在不恰当的时间比无用的垃圾推送消息造成的不良效果更验证。在不恰当的时候推送的通知不但打扰到用户,还很容易会被用户忽略。智能推送应该能够做到自动解决推送时间不恰当的问题。具体的实现可以通过一个对推送信息的重要性评估的引擎来决定消息推送的时间。
    在个性化上,我们可以把推送机器人设计成人类的形态,比起传统的系统消息,拟人化的方式能够让人更加容易接受,如苹果的Sin和微软的Cortana。当我们将来自机器智能的推送通知语言根据用户自己的特点进行调整后,用户在查看时看到的是更像交流式的风格,会感到更有亲切感,更加个人化。
    在推送的内容上也要慎重选择,根据不同用户来推送不同的内容。因为对于用户来说,只有用户关心的内容才是对用户有帮助的。拿新闻订阅应用来讲,就是用户只会对某些主题内容的新闻感兴趣,应用要做的就是把新闻的主题进行分析,打上不同的标签。然后找到用户兴趣中含有这些标签用户进行推送。如果不经处理对全部用户进行统一的推送,用户需要花费大量时间在这上面去过滤出自己感兴趣的内容。
    在推送内容的数量上也有讲究,如果一个服务高频次地的使用通知推送,用户可能会感觉到被冒犯然后会关掉它,后面的推送就都收不到了。因此,将推送的内容进行分组就很重要了。系统可以把一些相似的通知进行分组合并,可以减少对用户的打扰,在消息很多的时候这种优势就很明显了。在信息较少的时候可以选择把这些推送通知进行展开,因为此时用户可能会比较关心这些少见的内容,也是一个不错的选择。
    第三章 系统需求分析3. 1 新闻订阅系统用例析取基于网络爬虫的新闻采集与订阅系统要实现新闻数据抓取,数据过滤,数据筛选,数据展示,新闻订阅,推送等服务和功能,本系统用例图如图3.1所示:

    本系统主要用于以下几类人员:

    数据管理员,完成数据的抓取,过滤与筛选,新闻的推送,以及本系统管理维护等。
    用户,在网页上进行新闻订阅,通过微信接收订阅新闻的推送,点击进入对应新闻展示页面等。

    3.2 新闻订阅系统用例规约3.2.1 新闻订阅3.2.1.1 简要说明本用例允许用户增加或者删除自己订阅新闻的关键字,以及对已经订阅的关键字进行确认等操作。
    3.2.1.2 参与者用户。
    3.2.1.3 事件流基本事件流:用例开始于用户进入新闻订阅页面进行操作。

    订阅新闻关键字的状态共有两种,分别为“已订阅”、“未订阅”。顾客可以在相应的状态下进行操作,选择增加关键字或者删除关键字。
    如果关键字状态为“未订阅”,用户可以增加该关键字到自己的订阅列表中,本用例结束。
    如果关键字状态为“已订阅”,用户可以选择删除该关键字,本用例结束。
    无特殊要求。
    前置条件:本用例开始前用户必须是微信已登录状态。
    后置条件:如果用例成功,用户的订阅列表将被更新。
    活动图

    3.2.2 新闻推送3.2.2.1 简要说明本用例允许数据管理员根据新闻的关键字向已经订阅该关键字的用户进行推送等操作。
    3.2.2.2 参与者数据管理员。
    3.2.2.3 事件流基本事件流:用例开始于爬虫系统采集到新闻时。

    系统将新闻内容根据算法与用户订阅的新闻关键字作对比,对比结果分别为“匹配”、“不匹配”。如果匹配状态为“匹配”,系统将调用微信推送接口向用户推送该新闻,本用例结束。如果匹配状态为“不匹配”,用户将不会收到该新闻的推送,本用例结束。无特殊要求。前置条件:本用例开始前采集到的新闻必须有效。后置条件:如果用例成功,用户将收到一条新闻推送。活动图

    第四章 新闻采集与订阅系统的设计4.1 系统架构及原理本新闻采集与订阅系统分别由爬虫部分与新闻订阅和展示部分构成,在新闻订阅与展示部分采用基于C’s的架构,代码的组织方式为MVC三层结构,其中的三个层次分别为视图层(View)、控制器层(Controller)和模型层(Model)。代码整体采取前后端分离的方式,前端负责视图层,后端负责模型层和控制器层,客户端使用微信和网页实现,前后端通讯使用AJAX交换JSON的方式。系统的总体框架图如图4.1所示:

    爬虫部分使用了Python编写Scrapy框架,它的基本架构如图4.2所示,其中 Scrapy引擎的作用是控制数据的流向,是整个爬虫框架的核心。网络蜘蛛(spiders) 定义了如何爬取某个(或某些)网站,包括了爬取的动作以及如何从网页的内容中提取结构化数据。蜘蛛中间件(spider middleware)是在Scrapy引擎和网络蜘蛛间的一个钩子,它可以处理蜘蛛的输入与输出。调度器(scheduler)能够从Scrapy引擎接受请求并放入队列,在引擎请求调度器时返回对应的请求。下载器(downloader)负责下载网页,把爬取到的内容返回给Scrapy引擎和网络蜘蛛。下载器中间件(downloader middleware)是在Scrapy引擎和下载器间的一个钩子,它可以处理传入的请求跟传出的响应。Item Pipeline负责处理网络蜘蛛传过来的Item,可以在此做数据格式化,数据清理等操作。

    爬虫的整体上数据流向的开始是由Scrapy引擎让网络蜘蛛以一个初始的 URL来初始化一个请求,并设置回调函数,然后网络蜘蛛把该请求向调度器申请任务,把申请到的任务交给下载器,这里会经过一次下载器中间件,然后下载器把下载完后产生的响应再经过一次下载器中间件,然后传递给引擎,引擎接收到该响应后通过蜘蛛中间件传给网络蜘蛛处理,网络蜘蛛处理该响应,产生一个 item或者是新的请求给引擎,引擎会把传过来的item放入Item Pipeline,把传过来的新的请求传给调度器,Item Pipeline获取接收到的item对该item进行逐层处理,接着这个流程就重复直到爬取完成。
    4.2 系统模块设计4.2.1 爬虫采集模块设计使用Scrapy框架来编写爬虫首先要编写核心的蜘蛛(sPiders)的代码,Spider 类定义了如何爬取某个(或某些)网站,包括了爬取的动作以及如何从网页的内容中提取结构化数据。本系统主要针对网易新闻和腾讯新闻的科技频道进行主题式的爬虫,所以设计了两个网络蜘蛛,名字分别为Neteasespider和QQSpider,如果后续需要更多需要爬虫的站点,只要增加对应站点的网络蜘蛛就可以了,其余处理部分都是通用的。在这里选择主题式的爬虫的原因主要是一个通用爬虫对于新闻这样的每个站点的文章有固定格式的爬取解析的代价比较大,还不如手工去对需要爬取的站点进行分析,根据每个站点的特点来编写解析的代码。这样的主题式的爬虫能够提高爬虫的精确度,同时也提高了爬虫的效率,这样我们的爬虫就能够及时爬取到最新的新闻内容了。每个站点对应一个特定的网络蜘蛛还有一个好处就是如果后续需要完成分布式爬虫等需求时会很方便,因为这样的方式代码之间的祸合度较小,同时非常简洁。
    网络蜘蛛首先从一个Start url开始爬取,这里我选取了网易新闻和腾讯新闻的科技频道的首页,蜘蛛爬取这个起始URL上的页面后,对里面的内容进行解析。因为每篇新闻的URL都具有一定的格式,凡是该页面上有符合这种格式的 URL,蜘蛛都会对这些URL进行回调,继续爬取这些URL的页面,这些页面上就会包含所要获取的新闻的内容了。对于同一个新闻站点来说,一般页面上的内容的结构也是一样的,所以按照一定的规则来对这些页面上的内容进行解析,获得新闻内容原始数据,对这些数据进行格式化的处理,封装成一个item,传回给 Scrapy引擎处理。
    因为新闻具有一定时效性,一般来说我们只会关注那些新产生的新闻内容,所以本爬虫不需要考虑需要爬取过往产生的新闻的情况。本系统的爬虫部分只聚焦于每个站点的首页的新闻,因为新闻是滚动刷新的,所以我们需要定时对首页进行爬取,获取新的新闻内容。本系统设计了一个类似守护程序,来控制爬虫的启动与停止,在爬虫结束后等待一段时间再重新开始爬取。
    4.2.2 爬虫去重模块设计在爬虫过程中会遇到重复内容的情况,所以我们需要设计一个爬虫用到的去重的模块。考虑到每个URL对应的新闻内容是不变的,我们只要针对URL来进行去重即可,而不需要等到把内容取回来之后再判断内容是否已经爬取过,那样会消耗大量额外的资源,也对目标网站造成了额外的压力,显得不友好。我们选择去重的时机是Scrapy的调度器把请求分配给下载器之前,也就是说在下载器中间件中处理,在本系统中定义了一个下载器中间件RedisMiddleware,这个中间件的作用是在Redis的一个散列中判断是否存在该URL,如果不存在,把该请求传给下一个中间件处理。如果该URL存在于散列中,则忽视掉该请求,不进行后续操作。在本系统中定义了一个Item管道RedisPipeline,在爬取数据完成后,数据库处理完后Item会传到该管道,该管道的作用是把这个新闻所属URL 存入Redis的散列中,标记该URL已经爬取。
    4.2.3 防反爬虫模块设计防反爬虫是在大多数爬虫中需要考虑的情况,因为爬虫对网站服务器造成的压力比正常人要多,如果爬取频率足够高的话,会使网站访问变慢,甚至无法访问,所以网站可能会有一系列的反爬虫措施。首先我们的爬虫需要遵守网站的爬虫协议,然后把爬取速率控制好,例如间隔一秒才爬取一个页面。其次,我们需要伪装成一个浏览器,有些网站会通过HTTP请求头中的User-Agent中的信息来判断用户,我们不但需要在爬虫请求中的HTTP设置User-Agent请求头,还需要对该请求头进行更换,因此在本系统中定义了一个下载器中间件RotateUserAgentMiddleware,这个中间件的作用是在请求前在请求的HTTP请求头中设置一个轮换的随机的模拟用户浏览器的User-Agent请求头,这些 User-Agent与真实浏览器的User-Agent一致,数据来源是Python中一个叫 fake-useragent的库。后续如果对方服务器针对’P进行禁封了的话可以采用代理服务器的方式来应对,在做了以上措施的情况下本系统目前没有出现过被禁封的情况,因此该方法没有在本系统中实现。
    4.2.4 爬虫存储模块设计爬虫的数据存储是一个爬虫系统中很重要的一部分,因为爬虫的目的就是获得数据,在这里我们需要考虑数据的存储方式与储存时机。在本系统中储存部分使用了ORM(对象关系映射)的方式来实现,ORM的好处在于把数据访问的细节隐藏起来,在ORM上的操作出错的可能性会比手写数据库操作的可能性低。在ORM中,我们只需要关注数据的结构,这样一来,我们只需要编写数据储存对象的参数定义等属性跟方法就可以了,初始化、查询、更新等操作都可以由 ORM来实现。在本系统中,爬虫部分与订阅和展示部分都共用一个数据库,爬虫部分需要对数据库进行写操作,展示部分需要对数据库进行读操作。在蜘蛛解析完数据后,蜘蛛会把封装好的Item通过Scrapy引擎传给Item管道,本系统中定义了一个MongoDBPipeline,这个管道的作用是维持一个MongoDB的数据库链接,接收到传入的Item后先校验完数据的完整性,然后把合法的数据插入数据库对应的集合中,否则丢弃该Item。
    4.2.5 消息推送模块设计消息推送部分本系统使用微信来实现,需要用户关注指定公众号。本系统需要推送消息给用户时,先选择一个本系统预定义的模板,在模板中填入消息标题,内容和链接等数据后,通过微信提供的接口来进行推送。这里需要注意的是我们需要给推送的消息接口提供一个本系统所用的公众号的AccessToken,这个 AccessToken是向微信证明本系统的凭证,它有一定的有效期,需要定时刷新。
    4.2.6 消息订阅与展示模块设计消息订阅与展示模块是本系统中与用户交互的模块,这个模块负责用户订阅新闻的功能与向用户展示所需新闻内容的模块。在本系统蜘蛛解析完数据后,蜘蛛会把封装好的Item传给MongoDBPipeline储存后,会继续往下传递,传递到一个PushPipeline中,这个管道的作用是判断爬取到的数据是否包含用户所订阅的关键词,如果包含的话则调用消息推送模块把新闻消息推送给用户。在消息推送后,用户会在微信端本系统的公众号中接收到一条包含新闻消息简要内容的消息,点击该消息可以跳转到新闻展示页面。本系统提供了一个消息订阅页面,用户可以在该页面上管理自己的新闻关键词。
    4.3 数据库设计本系统存放数据用到的数据库分别是Redis和MongoDB,在本系统的数据库设计中,数据库的集合主要包括爬取到的新闻信息集合和用户订阅新闻关键词集合,系统的配置信息都写在配置文件中,就不需要使用数据库来存放了。这里选择MongoDB的原因是考虑到当爬虫的数据量和并发数很大时,关系型数据库的容量与读写能力会是瓶颈,另一方面,爬虫需要保存的内容之间一般不会存在关系。另外本系统会使用Redis中的散列类型来存放已经爬取过的URL和不合法的URL,因为判断URL是否合法或者是否已经爬取过是一个高频的操作,使用 Redis这样的高性能的内存键值对类型的数据库可以减少主数据库的压力,同时提高爬虫的性能。
    新闻信息集合



    属性名
    含义
    类型
    说明




    title
    新闻标题
    string



    content
    正文内容
    string
    纯文本


    source
    来源
    string
    新闻出处


    published
    发布时间
    timestamp
    精确到秒


    url
    原文链接
    string
    用于跳转



    用户订阅新闻关键词集合



    属性名
    含义
    类型
    说明




    open_id
    用户微信openid
    string
    唯一标识


    keywords
    订阅的关键词列表
    array
    字符串类型的数组


    tags
    订阅的标签列表
    array
    字符串类型的数组



    第五章 新闻采集与订阅系统的实现5.1 系统框架实现本新闻采集与订阅系统的爬虫部分框架是利用Scrapy自带的命令行工具来初始化,初始化后已经创建好了Scrapy引擎所需的几个重要的文件,如中间件,数据管道,配置文件等,这样做的好处是能够快速搭建起框架,并且能够达到官方定义的最佳实践。接下来我们可以在这个目录下定义自己的一些模块文件,再在这些文件中实现自己的处理函数就可以了,最终实现的爬虫部分的目录结构如图5.1所示,其中items.py是用于定义数据储存模型的文件,middlewares.py是用于定义中间件的文件,pipelines.py是用于定义数据管道的文件,settings.py是本系统爬虫部分的配置内容,spiders文件夹中存放了不同爬虫的网络蜘蛛代码, utils.py则是一些通用的函数存放的地方,wechat_config.py和wechatpush.py分别是微信推送部分的配置和推送代码。

    新闻订阅和展示部分的API服务器端则使用Django自带的命令行工具来初始化,使用django-admin startproject命令来新建一个项目,然后使用django-admin startapp命令来新建一个app,这样API服务器的基本框架就完成了,然后往创 建的目录中添加其余代码,最终实现的新闻订阅与展示部分的目录结构如图5.2 所示,其中frontend文件夹存放的是本系统的前端静态文件,分别是新闻订阅页面和新闻展示页面,init_db.py文件是一个用于初始化数据库用的脚本,lib文件夹中存放的是本系统中一些能够被公用的函数文件。manage.py是由Django生成的用于管理任务的命令行工具脚本,newsweb存放的是本项目的代码,run server.sh是一个用于启动服务器的脚本文件,web server中存放的是本系统新闻订阅与展示部分的服务端代码的主要文件,主要包括了用于配置路由 urls.py,存放新闻和订阅信息数据模型models.py和提供API的views.py。

    5.2 爬虫采集模块实现爬虫采集模块的核心的网络蜘蛛,下面以爬取网易科技频道新闻的蜘蛛为例讲解本系统爬虫采集模块的实现过程。图5.3为该蜘蛛的解析网页请求响应的代码,首选我通过分析网易科技频道新闻中的网页源码,分析得到网页中所需的新闻内容的数据所在的位置特征信息,例如通过分析发现标题位置是处于html标签下的head标签里的title标签里的文本。24-27行中的代码的作用是通过xpath 使用之前分析出来的格式来从抓取到的数据中提取出新闻相关的信息,包括新闻标题、新闻消息来源、新闻内容、新闻发布时间。29-32行的代码作用是把时间解析为时间戳,这样做的目的是为了方便把时间转换成不同的表现格式,时间表现会更为准确。34-40行的代码作用则是把数据封装成一个本系统中的新闻Item, 然后传给Item管道来处理。另外一个用于爬取腾讯新闻科技频道蜘蛛的分析方法和代码写法是类似的,在这就不详细介绍了。

    为了实现定时爬虫的功能,在本系统中实现了一个名为worker.py的守护进程脚本和一个start_crawl.py的用于调用爬虫的脚本,运行worker.py脚本后会每三十秒调用启动一次start_crawl.py,start_crawl.py每次启动会调用爬虫主程序,程序核心代码如下:

    5.3 防反爬虫模块实现为了防止反爬虫对本系统爬虫部分的影响,对于每次请求,本系统都会伪装成一个真实的用户,防止被爬取的网站通过User-Agent等信息来判断或者禁封 掉本系统的爬虫,导致后续爬虫无法正常进行。本系统在发送请求之前会在请求的头部加上User-Agent的请求头信息,这个请求头的信息会在本系统配置中的 User-Agent列表中随机选取一个,图5.5为部分User-Agent信息。除此之外,还可以利用代理服务器来代理请求,防止被爬取的网站通过IP信息来禁封本系统爬虫。

    5.4 爬虫存储模块实现爬虫储存模块的数据设计与格式等在上一章已经说明,在这介绍在数据库中的具体实现。爬虫爬取到的新闻数据会存放于MongoDB中,使用ORM来映射数据对象模型到数据库,使用的ORM框架是MongoEngine,下面通过讲解一个新闻内容的数据模型的定义来说明这种定义方式,在图5.6中的第9行,我们定义了一个父类为MongoEngine的Document类的类,这样定义就使这个类拥有了关系对象映射的能力,再在这个类中定义一个to_json的方法,作用是把本类的实例转化为一个Dict类型的数据,方便API调用时将对象转换成JSON格式的数据返回给前端。图5.7展示了部分爬取到的新闻数据的内容。

    5.5 消息推送模块实现消息推送模块使用了微信公众号的推送,在本系统中使用微信的接口测试号来代替公众号,微信的接口测试号是一种用于测试的,可以使用微信号扫一扫登录的账号,而且这种账号能够直接体验和测试公众平台所有高级接口。在申请完后登录系统,获得该系统的applD和appsecret,这两个字符串是使用该账号的凭据。需要注意的是,用户需要关注本账号后才能够收到本账号推送的消息。

    接下来我们在网页下方新增一个消息模板,填入推送新闻消息的模板内容,填写完成后记录对应的模板ID。

    获得以上信息后把信息写入消息推送模块的配置文件中,供消息推送模块调用。下面讲解消息推送模块核心部分的实现,核心部分如图5.10所示,是一个名为send_msg的函数,这个函数接收四个参数,分别为新闻标题、新闻内容、新闻的ID和订阅者的openid。订阅者的openid是用户微信的唯一标识,在测试号的页面可以查看已关注该账号的用户微信的openid。该函数的29-42行的作用是把数据封装成微信推送接口所需的格式,然后在45行使用requests模块来 POST一个请求到微信推送接口,微信推送接口收到请求后会在公众号中把该消息推送给用户。该函数使用了一个自定义的装饰器update_token来装饰,之前存放的applD和appsecret可以用来生成推送用的access token,而这个access token 有固定的存活期限的,这个装饰器的作用就是定时去获取这个access token并存放,直到过期之后再重新获取。
    爬虫模块爬取到含有用户订阅的关键词的新闻时会向该用户推送这则新闻,图5.11是用户在微信公众号上收到的该新闻的推送消息示例。

    5.6 消息订阅与展示模块实现消息订阅与展示模块主要由前端静态文件部分和后端API部分组成。在开发方式上本系统选择了使用前后端分离的方式,前端通过AJAX的方式来跟后端提供的API进行交互,后端API服务器收到请求后返回对应的JSON格式的数据给前端,前端根据数据来渲染出最终展示给用户的页面,这种前后端分离的方式有效地降低了代码之间的Wi合度。在前端实现方面,使用了jquery来对DOM元素进行操作以及进行异步请求等,另外使用了WeUI的样式库,WeUI是一套提供同微信原生一致的视觉体验的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。
    接下来以用户端的角度来展示消息订阅与展示模块的实现。
    用户想要收到新闻推送,需要先关注本系统的公众号,然后打开新闻订阅页面:

    这时可以输入要订阅的关键词,这里填IT,点击添加订阅关键词,系统提示添加关键词IT成功,刷新已订阅关键词列表:

    点击已订阅关键词列表中的项会弹出对话框询问是否删除该关键词:

    点击确定,提示操作成功,同时刷新已订阅关键词列表:

    在订阅关键词后,系统爬虫爬取到相关内容时会把内容通过微信推送给用户,用户点击后可以看到新闻内容,在此页面可以点击查看原文按钮打开原新闻页面,还有可以点击订阅更多前往订阅新闻关键词的页面:

    点击查看原文,会跳转到新闻的原页面:

    第六章 系统部署6.1 部署机器概述为了运行本新闻采集与订阅系统,至少需要一台拥有公网’P的Li~服务器,这是为了用户在外网能够访问到。至于配置方面则不需要太高,在测试时我选用了一台腾讯云上的服务器,这台服务器的配置如下:



    项目
    内容




    操作系统
    Ubuntu Server 14.04.1 LTS 64位


    CPU
    1核


    内存
    1GB


    系统盘
    20GB


    公网带宽
    1Mbps



    6.2 配置环境
    安装Nginx作为反向代理服务器,并编辑Nginx相关配置文件,这样做是为了把不同的请求分发到后端不同的地方,例如请求前端文件就返回静态文件,请求API就把请求转发给API服务器,Ningx的配置文件部分内容如图6.1所示。这样就实现前后端分离而又不受到跨域请求限制的影响了。编辑完Nginx配置文件后,重启Nginx服务器。
    安装PIP, PIP是Python用于管理第三方库的一个软件,这里用于安装本系统所需的第三方库。
    使用PIP安装本系统所依赖的第三方库,包括pymongo, scrapy, redis, fake-useragent, django,mongoengine, jieba, lxml, gevent, gunicorn等。


    6.3 系统运行由于本新闻采集与订阅系统是由爬虫部分与展示部分组成,所以需要分别运行行爬虫的守护进程和后端API服务器,静态页面是由Nginx指定的一个目录来提供的,不需要后台服务器。
    使用python worker.py命令来运行爬虫的守护进程,得出以下输出:

    使用sh run_server.sh命令来运行后端API服务器,这个脚本的实际作用是使用gevent作为gunicorn的worker来运行4个后端API服务器进程,成功运行会得到以下输出:

    第七章 总结与展望7.1 总结本系统是一个基于网络爬虫实现的新闻采集与订阅系统,实现了对网络上新闻内容的自动化采集、用户新闻关键词订阅、新闻内容展示以及新闻推送等功能。为实现本系统的功能,查阅了大量学习资料,在实现方面使用了一些比较前沿的技术以及较多的第三方库,从中能够学习到很多新知识和新技能。在本文中较为完整地从系统的需求分析、不同模块的设计与实现几个方面来展示了一个完整的爬虫系统以及对应的新闻订阅API服务器等的实现过程,最后在云服务器上部署本系统并测试,达到了预期的效果。
    7.2 展望本新闻采集与订阅系统在设计上考虑了许多来降低代码之间的祸合度,同时提高代码的健壮性与性能,使本系统能够达到容易扩展以及高可用的需求,即便后续需要爬取另外一个新的新闻网站上的新闻,只需要编写对应网站的解析部分就可以了,大部分代码已经被模块化,能够被重用。对比了已有的类似的成熟大型新闻服务系统,发现还有以下能够改进的地方:

    本系统只对新闻的基本文字信息等进行了采集与展示,后续可以考虑实现对新闻中图片与视频等多媒体信息的采集。
    本系统缺乏一个较为完善的用户模块,目前用户是在配置文件中配置的,用户模块对于这类的订阅系统是比较重要的。
    订阅机制不够智能,也没有智能推荐等功能,后期可以采用机器学习等人工智能方法来实现智能化推送与推荐功能。

    除了以上几点,本系统仍然存在许多能够改进的地方,但由于本文作者水平有限以及时间限制,未能够将这些一一实现,还希望各位专家学者能够给予批评与建议。
    参考文献[1] 中国互联网络信息中心. 中国互联网络发展状况统计报告[EB/OL]. http://www.cnnic.cn/gywm/xwzx/rdxw/20172017/201701/t20170122_66448.htm, 2017年
    [2] 胡博,基于网络爬虫的内容资源评价研究[D];北京理工大学;2015
    [3] 李建中、李金宝、石胜飞,传感器网络及其数据管理的概念、问题与进展,软件学报,14(10):17 17-1727, 2003
    [4] 邝洪胜;基于Python的电商导购APP设计与实现[D];华南理工大学;2015
    [5] 基于Django的自动化运维管理系统的设计与实现[D].姚娜.西安电子科技大学2015
    [6] 关系与非关系数据库应用对比研究——以SQL Server与Mongo DB为例[D].吴德宝.东华理工大学2015
    [7] 基于网络爬虫的网站信息采集技术研究[D]. 孙骏雄. 大连海事大学2014
    [8] 基于网络爬虫的内容资源评价研究[D].胡博.北京理工大学2015
    [9] Wang J, Guo Y. Scrapy-based crawling anduser-behavior characteristics analysis on Taobao[C1//Cyber-EnabledDistributed Computing and Knowledge Discovery (CyberC), 2012 International Conference on. IEEE, 2012:44-52.
    [10] Castillo C. Effective web crawling[C1//Acm sigir forum. Acm, 2005, 39(1):55-56.
    [11]刘金红,陆余良.主题网络爬虫研究综述 [J].计算机应用研究,2007, 24(10) :26-29.
    [12]徐远超,刘江华,刘丽珍,等.基于Web的网络爬虫的设计与实现[J].微计算机信息,2007 (21): 119-121. MLA
    [13] 王成军.“今日头条”的技术逻辑:网络爬虫+矩阵筛选[J].传媒评论,2015 (10) : 34-37.MLA
    [14] Jaiswal S, Kumar R. Learning Django Web Development [M]. PacktPublishing Ltd, 2015.
    [15] Taneja 5, Gupta P R. Python as a Toolfor Web Server Application Development [J]. 2014.
    [16] Web数据挖掘及其在网络新闻文本数据中的应用[D].胡峰.电子科技大学2010
    [17] 乔峰.基于模板化网络爬虫技术的Web网页信息抽取[D].电子科技大学2012
    致谢从本论文的选题、资料收集、资料阅读、到论文编写完成的这段时间中,我收获到许多宝贵的知识与经验。在这段时间里我查阅了许多相关资料,也使用了一些他人开发的第三方程序库,这些都减轻了我的压力。在此要感谢前人的付出,留下了那么多的学习研究材料。
    在这我要特别感谢我的论文导师卞静老师,卞老师在我完成该论文期间给予了我悉心指导与帮助,在繁忙之中抽出时间来对我的论文进行了指导并提出许多宝贵的建议。卞老师拥有渊博的专业知识、严谨的治学态度和平易近人的处事作风,是我终生学习的楷模。在此向我的导师表示最诚挚的谢意和最衷心的祝愿。
    其次,我要感谢我的家人,他们一直以来都能够理解,支持并关心我,从而使我能够专心投入到学习和工作中,让我在求学的过程中感受到温暖的力量,并能够顺利完成学业。
    在我大学学习和生活中,得到了许多老师和同学的关心与帮助。感谢我的舍友,在我学习上遇到疑惑的时候能够悉心教导我,在论文编写、技术路线和具体实现上也得到了他们宝贵的建议,谢谢你们!
    最后,在此对所有在我做毕业设计期间帮助,关心和支持过我的老师、同学和朋友们,以及百忙之中抽出时间来审阅、评议本论文的各位专家们表示衷心的感谢。
    3 评论 34 下载 2018-09-30 23:27:17 下载需要12点积分
  • 基于JSP和MYSQL实现的图书馆管理系统

    一、概述基于Spring + Spring MVC + MyBatis的图书馆管理系统,使用Maven进行包管理。主要功能包括:图书查询、图书管理、图书编辑、读者管理、图书的借阅与归还以及借还日志记录等。
    二、环境配置2.1 开发环境
    Windows 10
    IntelliJ IDEA 2018.3

    2.2 运行配置
    首先安装Mysql5.7,设置用户名为root,密码为123456,并保证其在运行状态,并执行library.sql文件导入数据
    然后再配置Maven到环境变量中,在源代码目录下运行
    # mvn jetty:run
    使用浏览器访问 http://localhost:8080 即可进入系统

    三、概念设计用户分为两类:读者、图书馆管理员。图书馆管理员可以修改读者信息,修改书目信息,查看所有借还日志等;读者仅可以修改个人信息、借阅或归还书籍和查看自己的借还日志。


    四、数据库E-R图
    五、逻辑设计共有6个表:
    5.1 图书书目表book_info


    字段
    类型
    长度
    小数点
    NULL
    用途





    book_id
    bigint
    20
    0

    图书号



    name
    varchar
    20
    0

    书名



    author
    varchar
    15
    0

    作者



    publish
    varchar
    20
    0

    出版社



    ISBN
    varchar
    15
    0

    标准书号



    introduction
    text
    0
    0

    简介



    language
    varchar
    4
    0

    语言



    price
    decimal
    10
    2

    价格



    pub_date
    date
    0
    0

    出版时间



    class_id
    int
    11
    0

    分类号



    number
    int
    11
    0

    剩余数量



    5.2 数据库管理员表admin


    字段
    类型
    长度
    小数点
    NULL
    用途





    admin_id
    bigint
    20
    0

    账号



    password
    varchar
    15
    0

    密码



    username
    varchar
    15
    0

    用户名



    5.3 图书分类表class_info


    字段
    类型
    长度
    小数点
    NULL
    用途





    class_id
    int
    11
    0

    类别号



    class_name
    varchar
    15
    0

    类别名



    5.4 借阅信息表lend_list


    字段
    类型
    长度
    小数点
    NULL
    用途





    ser_num
    bigint
    20
    0

    流水号



    book_id
    bigint
    20
    0

    图书号



    reader_id
    bigint
    20
    0

    读者证号



    lend_date
    date
    0
    0

    借出日期



    back_date
    date
    0
    0

    归还日期



    5.5 借阅卡信息表reader_card


    字段
    类型
    长度
    小数点
    NULL
    用途





    reader_id
    bigint
    20
    0

    读者证号



    password
    varchar
    15
    0

    密码



    username
    varchar
    15
    0

    用户名



    5.6 读者信息表reader_info


    字段
    类型
    长度
    小数点
    NULL
    用途





    reader_id
    bigint
    20
    0

    读者证号



    name
    varchar
    10
    0

    姓名



    sex
    varchar
    2
    0

    性别



    birth
    date
    0
    0

    生日



    address
    varchar
    50
    0

    地址



    phone
    varchar
    15
    0

    电话



    六、功能展示6.1 首页登陆
    管理者账号:123456/123456
    读者账号:10000/123456


    6.2 管理员系统6.2.1 图书管理
    6.2.2 图书详情
    6.2.3 读者管理
    6.2.4 借还管理
    6.3 读者系统6.3.1 查看全部图书
    6.3.2 个人信息查看,可以修个个人信息
    6.3.3 个人借阅情况查看
    1 评论 5 下载 2019-05-09 11:00:42 下载需要13点积分
  • 基于JAVA和MYSQL数据库实现的图书资料管理信息系统

    第一章 概述1.1 项目背景随着人们知识水平层次的提高,图书馆成为日常生活中不可缺少的一部分, 基于图书数目不断增加,读者数目不断增长,对图书信息管理自动化和准备花要 求日益强烈的背景下,实现读者信息管理工作网络化以及查询和统计一体化的管 理信息系统。该系统为学校职员和学生提供图书的详细信息和馆内库存情况,建 立庞大的数据库;图书管理员需要管理借书、还书情况,并进行借阅者的登记, 工作量较大,图书管理系统可以高效率地处理这些功能,减轻管理员的工作量。
    1.2 编写目的实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、 查找、借阅、还书的显示操作及实时数据库的提交和更改;提高图书管理员工作 信息报送及反馈的工作效率,减轻管理员的劳动负担;提高信息的及时性和汇总统计信息的准确性,使图书和读者管理更加合理化和科学化。
    1.3 开发环境
    系统开发环境:Eclipse Java Neon
    系统开发语言:Java
    数据库:MySQL Workbench 6.3 CE
    运行平台:Windows 8.1

    第二章 需求分析2.1 概要分析经过对图书管理系统的分析,这里把系统的层次划分为了四个部分:图书维护,人员信息管理,图书借阅管理,信息查询。能够实现以下功能:

    进行新书入库、现有图书信息修改以及删除
    能够实现对读者基本信息的查询和编辑管理
    能够进行超期罚款功能
    能够进行借阅信息的查询功能

    2.2 详细分析通过详细分析所得的信息如下:
    2.2.1 处理对象
    读者信息:学号,姓名,性别,学院,专业,年级,登录口令,办证日期, 登录次数,最近一次访问系统时间
    管理员信息:管理员编号,姓名,性别,登录口令,住址,电话
    馆藏图书信息:图书编号(即 ISBN),索书号,图书名称,作者,出版社, 出版日期,单价,摘要,关键字,副本数,借出数量,分类号,所在馆室
    对应在借图书——借阅信息:图书编号(即 ISBN),读者编号,图书名,作 者,借阅日期,归还日期,应还日期,续借次数(每续借一次应还日期固定 增加一周),罚金
    对应借阅历史——借阅历史信息:图书编号,读者编号,图书名,作者,借 阅日期,还书日期
    罚款信息:读者编号,图书编号,图书名,作者,借阅日期,应还日期,归 还日期,罚款金额,处理状态,管理员编号

    2.2.2 处理功能及要求用户对图书管理系统的功能及要求如下:

    能够存储一定数量的图书信息,并方便有效的进行相应的书籍数据操作和管理
    图书信息的录入、删除及修改
    图书信息的多关键字检索查询
    图书的借阅续借、归还及超期罚款
    对一定数量的读者、管理员进行相应的信息存储与管理,包括读者信息的登 记、删除及修改
    管理员信息的增加、删除及修改
    读者资料的统计与查询
    提供一定的安全机制,提供数据信息授权访问,防止随意删改、查询
    对查询、统计的结果能够列表显示

    第三章 数据库设计3.1 ER 模型图
    3.2 定义表及其关键字3.2.1 馆藏图书信息表图书编号,索书号,图书名称,作者,出版社,出版日期,单价,摘要, 关键字,副本数,借出数量,分类号,所在馆室

    3.2.2 读者信息表学号,姓名,性别,学院,专业,年级,登录口令,办证日期,登录次数, 最近一次访问系统时间

    3.2.3 管理员信息表管理员编号,姓名,性别,登录口令,住址,电话

    3.2.4 借阅信息表图书编号,读者编号,借阅日期,归还日期,应还日期,续借次数,罚金, 罚款处理状态,管理员编号

    3.2.5 图书馆室信息表馆室编号,馆室地址

    3.3 描述表之间的关系
    第四章 程序设计4.1 软件功能设计4.1.1 管理员角度
    查询图书功能
    修改图书功能
    删除图书功能
    新增图书功能
    查询读者功能
    修改读者功能
    删除读者功能
    新增读者功能
    查询借阅记录功能
    查询罚款记录功能
    查看个人信息功能
    修改密码功能

    4.1.2 读者角度
    查询图书功能
    借阅新书功能
    续借旧书功能
    按时还书功能
    过期缴费功能
    查看个人信息功能
    修改密码功能
    查询借书、缴费记录功能

    4.1.3 系统功能模块图
    4.1.4 读者信息查询、更新模块
    4.1.5 图书基本信息的查询和更新模块
    4.2 界面设计4.2.1 登录界面
    4.2.2 读者操作界面查询图书界面

    借阅、续借图书界面

    归还、缴费界面

    查看信息界面

    我的图书馆界面

    4.2.3 管理员操作界面查询图书界面

    新增图书界面

    修改图书界面

    删除图书界面

    查询读者界面

    新增读者界面

    修改读者界面

    删除读者界面

    记录查询界面

    查看信息界面

    第五章 课设心得这次课程设计题目是图书资料管理信息系统。在我看来,数据库课程设计主要的目标是利用课程中学到的数据库知识和技术,较好地开发设计出数据库应用系统,去解决各行各业信息化处理的要求。通过这次的课程设计,可以巩固我们对数据库基本原理和基础理论的理解,掌握数据库应用系统设计开发的基本方法,进一步提高我们综合运用所学知识的能力。
    在课程设计初期,我选择了大学图书馆系统进行调研,结合此次课设要求确定了最终的功能和相应界面的设计。通过概念设计、逻辑设计,建立 ER 模 型图,并按照要求删除冗余使最终结果都能达到 BC 范式,创建数据字典,建立 数据表、视图、触发器以及存储过程等等,完成相应的数据库设计,并从已有图 书馆中向数据库插入原始数据。在软件设计阶段,因为之前有过设计界面的经验 所以做起来没有什么困难,但是在 Java 链接数据库进行相应操作时,偶尔会有 逻辑上的错误以及 SQL 语法错误,经过上网搜索相关信息、翻书查阅资料,最 终都一一修改了过来,程序能够完成预期的目标,界面友好简洁,便于操作,比较满意。
    当然本次课程设计还存在着需要改进的地方:点击菜单栏的时候菜单栏选项可以变色,方便用户清楚自己目前在哪个功能面板;读者借了一本书之后就立即刷新查询书籍表格中的借出数。感谢老师给予的改进建议和帮助,我一定会继续努力学习相应理论知识,结合实际,提高自身各方面的能力,更好地完成今后的课程设计任务。
    3 评论 53 下载 2018-11-25 15:27:47 下载需要13点积分
  • 基于java的网上考试系统

    开发一套标准化考试系统,要求通过该系统完成多个科目的标准化考试工作。考试开始时,考生在客户端机器上使用学号和密码登录进入考试系统,如下:

    所有考生的信息(包含学号,姓名和密码)在服务器端的student.cfg文件中保存,该文件的保存格式为:“学号:姓名:密码”,如下:

    登录成功后进入选择科目界面,考生选择一门考试科目,如下:

    所有考试科目的列表在服务器端的subject.cfg文件中保存,该文件不仅保存科目列表,还保存了与科目对应的试题文件的文件名,格式为:“科目名=试题文件名”,如下:

    考生选择考试科目后,程序将从服务器接收该科目的试题,并进入考试主界面,如下:

    每门科目的考试试题保存在服务器端的一个试题文件中,试题文件的格式如下:

    每5行构成一道试题,其中第一行为试题的题干,以下4行为试题的4个选项,并且在正确选项的行首用“<T>”来标示。
    考试完成后考生点击主界面上的“交卷”按钮,程序将自动计算考生的得分,并将得分发送给服务器,保存在服务器的*.sco文件中,每门科目都有一个相应的文件,该文件的格式为:
    “学号:成绩”,如下:

    为完成以上程序,定义以下包及类:

    1. 客户端和服务器端的通信方式
    登录请求
    客户端发送数据:学号、密码服务器端返回的数据:学生对象和当前能提供的考试科目列表
    选择考试科目
    客户端发送数据:科目名服务器端返回的数据:试卷对象
    交卷:
    客户端发送数据:学号,科目,成绩服务器端返回的数据:成功与否的信息
    退出
    2. 服务器端的文件
    若干试题库文件(corejava.exm)
    若干科目的成绩文件
    学生信息的文件

    3. 服务器对文件的访问方式:
    试题库文件:Paper getPaper(String 科目名);
    学生信息的文件:Student getStudent(int id,String passwd);
    成绩文件:addScore(int id,float score,String 科目);
    1 评论 3 下载 2019-05-08 22:04:23 下载需要12点积分
  • 基于C语言实现的旅馆信息管理系统

    1.程序实践概述1.1 题目名称
    旅馆信息管理
    1.2 开发环境
    基于Windows 10操作系统的Microsoft Visual Studio 2017
    2.问题分析2.1 功能说明
    查看旅店各房间信息:列举每个房间的房间号、房间类型、入住人数和房间价格
    查看某一房间信息:显示指定房间的旅客的信息,包括姓名、身份证号、性别和入住时间
    查看旅客信息:显示在旅馆的旅客总数;列举在旅馆的所有旅客的信息,包括姓名、性别、身份证号、房间号、入住时间
    查看某一旅客信息:查看指定旅客的信息,包括姓名、性别、身份证号、房间号、入住时间
    旅客入住:录入旅客的身份证号、姓名、性别等信息,程序将获取当前时间作为入住时间。将旅客的信息保存到链表和文件
    旅客换房:通过身份证号识别旅客,结算旅客已产生的房费,修改有关的旅客和房间信息
    旅客退房:程序获取当前时间作为退房时间,并结合入住时间结算房费。将旅客信息从程序的链表中删除,更改相关房间的信息,将旅客信息添加到旅客历史信息的文档中
    保存信息并退出程序:将旅客信息、房间信息、旅客与房间关系的信息从链表覆盖保存到文件,然后退出程序
    更换主题:更改命令行的颜色主题,程序会将主题信息自动保存到文档

    2.2 解决方案
    从文件读取相关信息,将相关信息储存到文件,从而实现旅馆信息管理的基本功能
    三个链表,分别存储旅客和房间的相关信息,以及这二者关系的信息。用一个枚举类型定义房间的类型
    用操作链表的方式实现旅客的入住,换房和退房三种行为
    程序开始时将文件中的信息读到链表中,修改信息后将链表中的信息保存到文件中。

    3.方案设计3.1 模块结构
    头文件Structs.h: 用于列举整个程序的头文件、结构体定义和函数声明等信息
    mainbody.c:显示主菜单,初始化链表,加载命令行的颜色主题等操作
    Guest.c:从文件中读取旅客信息到链表;将存储旅客信息的链表中的信息保存到文件;查看旅客信息等
    Hotel.c:从文件中读取房间信息到链表;将存储房间信息的链表中的信息保存到文件;查看房间信息等
    Guests.c:用于实现旅客入住、旅客换房、旅客退房等功能
    Guest.txt:用于存储旅客信息,包括姓名、性别、身份证号
    Hotel.txt:用于存储房间信息,包括房间号、房间类型和房间价格
    GuestAndRoom.txt:用于存储旅客与房间关系的信息,包括房间号、身份证号、入住时间
    GuestHistoryInfo.txt:用于存储旅客的历史信息,在旅客退房时可显示旅客曾经入住的次数
    Theme.txt:用于存储命令行的颜色主题信息

    3.2 数据结构旅馆信息管理程序中,主要的数据结构是三个链表:

    Rooms链表存储房间信息,包括房间号、房间类型、入住人数和房间价格
    Guests链表存储旅客信息,包括姓名、性别、身份证号
    GuestAndRoom链表存储旅客与房间关系的信息,包括身份证号、旅客入住的房间号、入住时间和退房时间

    3.3 总体流程总体流程大致如图所示,更多细节未在图中展示。

    3.4 关键算法核心功能是实现旅客的入住、换房和退房,涉及到新增、修改和删除链表中的节点。
    文件输入输出信息是本程序的重要功能,程序开始和结束时,程序中的链表会和文件交换信息。
    计算入住时间和退房时间的时间差属于创新功能,但实现相对较为复杂。旅客入住时会使用time()函数获取时间,将时间存储为字符串。旅客退房时,通过字符串处理,将入住时间放入tm结构体中,使用mktime()函数和difftime()函数计算退房时间与入住时间的差。
    3.5 界面设计整体界面在Windows控制台上。打开程序后的菜单如图:

    查看旅店信息

    查看某一房间信息

    查看旅客信息

    4.调试记录在IDE进行代码分析,没有错误和警告后,开始编译。由于程序开始运行时就会读取文件中的数据,当项目的文件夹内没有相应文件时,出现如下报错。
    按项目要求,添加样例文本文档后程序成功显示菜单。

    程序在读取文件中的字符串时遇到如下调试信息:

    在读取存放数据表格的文件时需要先跳过表头的中文。查询variable was corrupted 的原因是内存越界,后将读取这段中文的临时字符数组设置得更大一些,问题解决。

    cur是0xCDCDCDCD的原因是前面的代码将cur设置为了垃圾指针。此处的cur指针原本用于遍历链表,检查前面代码发现错将cur分配到了一个新的内存地址。将cur指向链表首个节点后问题解决。

    在文件中已有数据的情况下,程序未能读取到旅客信息。检查代码时发现,在读取文件时,弄错了feof函数的返回值真假。feof(fp)在fp指向文件末尾时返回真,在fp指向文件中间时返回假。

    进行旅客入住操作时,弹出调试信息“引发了异常,读取访问权限错误。”多次检查代码后发现,在将数据输出到文件的过程中使用了遍历链表后的地址不明确的链表指针,将指针换为记录数据的普通变量以输出,问题解决。
    存储旅客入住时间时,使用了ctime()函数,调试时发现程序显示的入住时间不正常。查询资料后发现ctime()函数的返回值末尾有换行符,使用strncpy()去除换行符后,屏幕不会输出换行,但字符串末尾出现“屯屯屯……”,表明有未赋值的字符被输出。查询资料后确认,strncpy并不会给目标字符串的末尾添加’\0’,手动为字符串末尾添加’\0’后,问题解决。
    在使用difftime()函数时,返回的时间差是0,查询MSDN后发现difftime()函数执行错误将导致返回值为0。difftime()函数执行错误的具体原因是,程序记录的年份是从1900年开始的,因此存入tm结构体的年份要在真实年份的基础上减去1900。
    5.创新说明结构体定义时没有使用typedef,尽量减少结构体名称数量。每次使用链表时写struct关键字,也能使得代码可读性更强。
    全局定义了printline()函数用于命令行换行,便于调用。
    精细地调整格式化输入输出,使得程序能以整齐的列表形式清晰地显示各项数据。
    查看某一旅客或某一房间信息时,如果旅馆中没有该房间或旅客,会显示提示信息,给予使用者反馈。
    旅客入住时,会显示可用房间的信息,并标注可用房间中是否已有人入住。针对即将入住旅客的身份进行识别,判断该旅客是否已经入住。针对旅客即将入住的房间,判断该房间是否能够容纳该旅客。
    旅客退房时,使用difftime()、mktime()等函数自动计算旅客从入住到退房的天数,而不用手动输入。旅馆管理人员若想给予旅客折扣,可输入折扣率,使程序直接计算出最终的房费。
    旅客换房时,考虑到房间号是否输入错误,新换的房间是否已满等细节,确保程序不会因为使用者的误操作出现异常。在换房前,展示旅客的信息以及房间是否可用的详细信息。
    6.体会与建议与以往学习C语言时写单个文件的小程序不同,此次程序设计需要完成一个项目。完成项目需要编写多个头文件和源文件,谨慎地对项目和解决方案进行配置,甚至要注意版本控制,及时保存现有的代码。
    整个项目的代码量比较大,共1300余行,也涵盖了C语言程序设计课程的许多知识,重要的知识点包括指针、结构体、链表、内存动态分配、枚举类型、文件操作等。
    平常编程时难以纠正的惯性思维也在项目开发的过程中暴露出来。比如局部数组初始化时应当赋空值,字符串之间不能直接用“==”比较而必须用strcmp()函数,数组申请的空间需要足够大,空指针需要及时用free()处理等。也复习到了strncpy()用完后需要手动添加‘\0’等印象不深刻的知识点。
    开发此次项目也自学了更多C语言的知识,比如用于记录时间的结构体tm以及<time.h>中的其他函数,学会了在MSDN文档中查询资料等技能;收获颇丰,相当程度上提升了编程能力,了解了项目开发的基本流程。
    1 评论 2 下载 2019-05-08 17:14:51 下载需要12点积分
  • 基于guns开源框架的小区管理信息系统

    1 需求分析1.1 需求分析本系统的最终用户为系统管理员和小区住户。该系统的成功开发,将可以巨大便利系统管理员对住户信息的统计与管理。根据查询资料及对相关人员的咨询,我们讨论分析,得出小区管理员和小区住户对本系统的实际要求:
    1.1.1 小区资源的基本信息小区管理员应对小区可用资源得信息进行及时地完善和更新,对小区内所有住房的居住情况和车位的租借情况统计整理,并向有需求的住户提供有效信息和便利服务。
    住房居住的基本信息
    小区管理员应对小区内所有住房被使用情况进行实时地完善与更新,以方便有需求的住户使用。这些住房信息应该包括住房号码,住房状态(使用状态和空闲状态),住房地址,住房所属区域。
    车位租借的基本信息
    小区管理员应对小区内的所有车位租借情况进行实时地完善与更新,以方便有需求的住户租借。车位租借的情况应包括车位号码,车位地址,租借状态(使用状态和空闲状态)
    1.1.2 小区住户的基本信息当住户入住该小区后,通过手机端APP,登记住户个人信息,以方便小区管理员对住户进行管理,与住户进行必要的业务交流。住户需要登记以下信息。
    住户登录的基本信息
    登录手机APP时,每位住户通过注册自己的手机号码和登录密码来获得小区 服务的权限,而系统会为每位住户指定一个唯一的用户ID,用于后台信息的 统计和管理。
    小区住户的基本信息
    每位小区住户都具有必要注册的个人信息,以保证小区内住户个人信息的完 整性,确保小区住户们的安全,其中包括系统为每位住户指定的唯一ID,身 份证号码,姓名,性别,手机号码,年龄,民族,职业,住房号码,登录APP 密码。
    1.1.3 用户对系统的要求1.1.3.1 小区住户
    信息要求

    小区住户需要及时得到小区空闲住房的信息,可租借车位的信息,租借车位需要租借时间,租借时长,支付费用等信息,需要得到小区官方的公告通知,需要对自己提交的投诉,报修或建议等事务查询官方回复
    处理要求

    注册和维护自己的登录信息和个人的基本信息。并要求因注册手机号的不同,系统为其再指定一个用于后台数据库操作的唯一ID注册个人信息时,通过获得小区管理员提供的未被注册的空闲住房,选定其中一个注册。小区管理员也可以根据这一操作,既是录入信息并更新住房信息住户可以随时更新公告信息,得到小区管理员的通知住户可以提出投诉,报修和建议等事务请求。提交事务后,便可以随时查看提交事务的实时信息及官方回复情况住户可以根据小区管理员提供的剩余车位信息,并租借一个想要的车位。系统将会提供该车位的信息,住户也可以停止租借该车位,同时支付必要的租用车位的费用
    安全性与完整性要求

    安全性要求
    系统应设计根据手机端APP提交的手机号和对应的密码鉴别是否是合法的用户,若不是,应拒接登陆请求。在住户注册个人的同时,应提醒注册登录密码信息每当手机端APP向服务器API发出数据库操作请求时,都需要提前申请token秘钥,以保证每次操作都是合理的
    完整性要求
    根据实体完整性的要求,各种主要信息记录要保持完整性,即内容不能为空各种数据间相互的联系要保持正确性相同的数据在不同记录中要保持一致性。


    1.1.3.2 小区管理员
    信息要求

    小区管理员应需要录入小区可用资源的所有必要信息,例如空闲住房和空闲车位等,可以查看小区所有住户的个人信息和登录APP信息,还需要根据小区的实际情况,具有可公告的信息,需要可以接收小区住户的投诉,报修建议等事务信息,并具有及时回复的信息
    处理要求

    创建和维护小区管理员的登录信息根据小区住户提交的注册请求,创建和维护住户们的登录信息和个人信息发布公告信息,根据小区的实时情况,通知小区住户们必要的生活信息提供住房被使用的信息。在小区住户们注册个人信息时,需根据小区管理员提供的住房信息,注册未被正在使用的住房进行注册操作,小区管理员可根据住户操作及时更新小区住房的情况提供车位租借情况的信息。小区应向住户们提供车位正被使用的情况信息,以方便住户们租借空闲车位。小区管理员在接收到住户们的租借车位请求时,需要及时更新小区车位信息,以方便他人租借。住户可以随时停止租借车位,同时需要支付租借车位所需要的费用,系统也会提供给住户本次租借车位操作的信息
    安全性要求

    系统应要求小区管理员登录时,需要验证登录账号和登录密码正确且对应,以确保整个系统的安全性住户每次通过手机APP先服务器API发出操作请求时,所需要的token秘钥,需要小区管理员授权与分配,并实时更新授权秘钥

    1.2 系统功能的设计和划分根据如上得到的用户需求,我们将本系统按照所完成的功能分成以下两部分:
    1.2.1 用户部分
    注册个人信息
    根据手机号与登录密码登录
    发起投诉或报修
    查看发起的投诉或报修
    查看剩余车位的数量
    租用车位
    结束租用车位
    获得最新的一条公告

    1.2.2 管理员部分
    注册新的管理员
    根据账号密码登录管理平台,登记查看修改删除小区人员信息
    登记查看修改删除小区租房信息
    登记查看修改删除车位信息
    解决报修或投诉
    查看租借信息
    发布查看修改删除通知信息
    查看统计信息

    1.3 数据流图1.3.1 总数据流图总数据流图如图所示:

    1.3.2 各子系统的分数据流图房间信息分数据流图如图所示:

    用户信息分数据流图如图所示:

    通知信息分数据流图如图所示:

    车位信息分数据流图如图所示:

    租借信息分数据流图如图所示:

    报修投诉信息分数据流图如图所示:

    管理员信息分数据流图如图所示:

    2 系统的设计与实现2.1 系统框架简介本系统基于guns开源框架。框架基于SpringBoot 2,整合springmvc + mybatis-plus + echarts。Spring Boot是一种JAVA框架,旨在尽可能快地启动和运行,只需最少的Spring前端配置。Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。Echarts缩写来自Enterprise Charts,商业级数据图表,它最初是为了满足公司商业体系里各种业务系统的报表需求。
    关于系统架构采用的是MVC架构 ,它全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其逻辑图如下图所示:


    视图:将视图层存放在PeopleManage\src\main\webapp中,其子文件夹static\modular存放各个业务功能的JavaScript代码,另一个子文件夹WEB-INF\view 存放各个业务功能的HTML代码
    控制器:将控制器存放在PeopleManage\src\main\java\cn\stylefeng\guns\modular的各个业务功能的controler文件夹中
    模型:将模型存放在PeopleManage\src\main\java\cn\stylefeng\guns\modular\system\model中,各个模型通过其对应的Mapper.xml进行需要的sql查询,通过Mapper接口类来调取Mapper.xml,sql查询的结果。若模型的业务逻辑复杂,将多增加对应的Service类来组合形成更复杂的业务逻辑,使业务逻辑更清晰有条理

    2.2 业务的实现本系统的增删查改模式基本都类似,只是有些具体的业务有不同的需求,系统会有相应的处理,总体框架是没有变的。现在以住房管理为例,详细说明本系统增删查改的逻辑。
    2.2.1 信息列表的显示首先用户看到的应该是住房管理的主页面,如图所示:

    本界面存储在 PeopleManage\src\main\webapp\WEBINF\view\room_info\info\info.html
    其HTML代码如下:
    <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>住房管理</h5> </div> <div class="ibox-content"> <div class="row row-lg"> <div class="col-sm-12"> <div class="row"> <div class="col-sm-3"> <#NameCon id="condition" name="名称" /> </div> <div class="col-sm-3"> <#button name="搜索" icon="fa-search" clickFun="Info.search()"/> </div> </div> <div class="hidden-xs" id="InfoTableToolbar" role="group"> @if(shiro.hasPermission("/info/add")){ <#button name="添加" icon="fa-plus" clickFun="Info.openAddInfo()"/> @} @if(shiro.hasPermission("/info/update")){ <#button name="修改" icon="fa-edit" clickFun="Info.openInfoDetail()" space="true"/> @} @if(shiro.hasPermission("/info/delete")){ <#button name="删除" icon="fa-remove" clickFun="Info.delete()" space="true"/> @} </div> <#table id="InfoTable"/> </div> </div> </div>
    表格显示的位置在<#tableid=”InfoTable”/>,表格由其对应的JavaScript向Controller发出请求获得数据。控制住房管理的JavaScript存放在 PeopleManage\src\main\webapp\static\modular\room_info\info\info.js 中。
    其代码如下:
    /** * 住房管理初始化 */ var Info = { id: "InfoTable", //表格id seItem: null, //选中的条目 table: null, layerIndex: -1 }; /** * 初始化表格的列 */ Info.initColumn = function () { return [ {field: 'selectItem', radio: true}, {title: '区域标识号', field: 'room_id', visible: true, align: 'center', valign: 'middle',width:"100px"}, {title: '名称', field: 'name', visible: true, align: 'center', valign: 'middle'}, {title: '地址', field: 'address', visible: true, align: 'center', valign: 'middle'}, {title: '类型', field: 'type', visible: true, align: 'center', valign: 'middle', formatter: function(value,row,index){ if(row.type==true) { value='<div style="text-align: center;" ><i class="fa fa-bed"></i> 房间</div>'; } else value='<div style="text-align: center;" >区域</div>'; return value ; }}, {title: '父节点', field: 'parent_id', visible: false, align: 'center', valign: 'middle'} ]; }; $(function () { var defaultColunms = Info.initColumn(); var table = new BSTreeTable(Info.id, "/info/list", defaultColunms); table.setExpandColumn(2); table.setIdField("room_id"); table.setCodeField("room_id"); table.setParentCodeField("parent_id"); table.setExpandAll(true); table.init(); Info.table = table; });
    JavaScript页面中的表格控制工具BSTreeTable向Controler发出请求,请求地址为info/list,Controler接收到请求后返回所需的信息,BSTreeTable根据后端返回的信息对后端返回的信息进行处理,table.init初始化函数对返回的数据进行处理,formatter函数对房间类型进行处理,当房间类型为1时显示为房间,当房间类型为0时显示为区域。
    房间管理的控制器位置在 PeopleManage\src\main\java\cn\stylefeng\guns\modular\room_info\controller\InfoController.java,控制器收到/info/list请求地址后执行list函数,list函数调用infoService.list方法后返回房间管理的列表,再使用RoomWarpper处理数据,最后返回给BSTreeTable显示到前端页面中。控制器代码如下:
    /** * 住房管理控制器 */ @Controller @RequestMapping("/info") public class InfoController extends BaseController { private String PREFIX = "/room_info/info/"; /** * 获取住房管理列表 */ @RequestMapping(value = "/list") @ResponseBody public Object list(String condition) { List<Map<String, Object>> list = this.infoService.list(condition); return super.warpObject(new RoomWarpper(list)); } } infoService中的list方法,在InfoMapper.xml中实现,其代码如下所示: <select id="list" resultType="map"> select * from info_room <if test="condition != null and condition != ''"> where address like CONCAT('%',#{condition},'%') </if> </select>
    经过上述各个步骤,数据才能从数据库中取出来,放到前端界面进行展示。
    2.2.2 新增信息在info.html页面点击添加按钮,info.javascrpit会向控制器发送一个添加请求,请求地址为/info/info_add,其代码如下所示:
    Info.openAddInfo = function () { var index = layer.open({ type: 2, title: '添加住房', area: ['800px', '420px'], //宽高 fix: false, //不固定 maxmin: true, content: Feng.ctxPath + '/info/info_add' }); this.layerIndex = index; };
    当InfoController接收到/info/info_add请求后会返会info_add.html页面,其代码如下所示:
    @RequestMapping("/info_add") public String infoAdd() { return PREFIX + "info_add.html"; }
    info_add.html页面如图所示:

    控制此页面的JavaScript是info_info.javascript,其主要代码如下所示:
    /** * 初始化住房管理详情对话框 */ var InfoInfoDlg = { infoInfoData : {} }; /** * 收集数据 */ InfoInfoDlg.collectData = function() { this .set('roomId') .set('type') .set('name') .set('parentId') .set('address') } /** * 提交添加 */ InfoInfoDlg.addSubmit = function() { this.clearData(); this.collectData(); //提交信息 var ajax = new $ax(Feng.ctxPath + "/info/add", function(data){ Feng.success("添加成功!"); window.parent.Info.table.refresh(); InfoInfoDlg.close(); },function(data){ Feng.error("添加失败!" + data.responseJSON.message + "!"); }); ajax.set(this.infoInfoData); ajax.start(); }
    当用户填完所有信息,点击提交按钮时,会向后端送请求,请求地址为info/add,参数为填写的信息。
    当InfoControler接收到此信息时会调用add函数,add函数会判断其是不是顶层区域,如果是顶层区域,此房间的地址就是房间名,如果不是顶层区域,此房间的地址就是上一层房间的地址再加上此房间名。然后使用mybatis简化的插入方法,infoService.insert(info)函数将信息插入到数据库中。其实现代码如下所示:
    @RequestMapping(value = "/add") @ResponseBody public Object add(Info info) { if(info.getParentId()!=0) info.setAddress(infoService.selectById(info.getParentId()).getAddress()+info.getName()); else info.setAddress(info.getName()); infoService.insert(info); return SUCCESS_TIP; }
    2.2.3 修改信息在info.html选中一条记录,再在页面点击修改按钮,info.javascrpit会找到选择记录的id,然后向Controller发送修改请求,请求地址info/info_update,当请求完成后打开新的子页面,如图其代码如下所示:
    Info.openInfoDetail = function () { if (this.check()) { var index = layer.open({ type: 2, title: '住房详情', area: ['800px', '420px'], //宽高 fix: false, //不固定 maxmin: true, content: Feng.ctxPath + '/info/info_update/' + Info.seItem.id }); this.layerIndex = index; } };
    当控制器接收到修改请求后,先根据选中条目id获得完整的房间信息,然后将信息注入到info_edit.html页面中,然后再返回info_edit.html页面。其代码实现如下所示:
    @RequestMapping("/info_update/{infoId}") public String infoUpdate(@PathVariable Integer infoId, Model model) { Info info = infoService.selectById(infoId); model.addAttribute("item",info); if(info.getParentId()!=0) model.addAttribute("pName", infoService.selectById(info.getParentId()).getName()); else model.addAttribute("pName","顶级"); LogObjectHolder.me().set(info); return PREFIX + "info_edit.html"; }
    info_edit.html界面如下图所示:

    当修改成功后,info_info.html会收集用户更改的信息,然后向控制器发送更改请求,请求地址为/info/update其代码如下:
    InfoInfoDlg.editSubmit = function() { this.clearData(); this.collectData(); //提交信息 var ajax = new $ax(Feng.ctxPath + "/info/update", function(data){ Feng.success("修改成功!"); window.parent.Info.table.refresh(); InfoInfoDlg.close(); },function(data){ Feng.error("修改失败!" + data.responseJSON.message + "!"); }); ajax.set(this.infoInfoData); ajax.start(); }
    当控制器接收到修改请求后先找出原来的房间信息,然后查看房间名有没有被修改过,如果房间名被修改了,那此房间所有的子节点的地址都要修改,这样才能保持地址的正确性,然后使用mybatis提供的更新方法,将新数据更新到数据库中。
    @RequestMapping(value = "/update") @ResponseBody public Object update(Info info) { Info oldinfo=infoService.selectById(info.getRoomId()); String name=info.getName(); String oldaddress=oldinfo.getAddress(); String newaddress; if(info.getParentId()==0)newaddress=name; else newaddress=oldaddress.substring(0,oldaddress.length()-oldinfo.getName().length())+name; info.setAddress(newaddress); infoService.updateById(info); ChangeChildAddress(newaddress,oldaddress,info.getRoomId()); return SUCCESS_TIP; }
    2.2.4 删除信息用户选择某一条记录,然后点击删除按钮,前端会发送一个删除请求到控制器,请求地址为/info/delete其实现代码如下所示:
    Info.delete = function () { if (this.check()) { var ajax = new $ax(Feng.ctxPath + "/info/delete", function (data) { Feng.success("删除成功!"); Info.table.refresh(); }, function (data) { Feng.error("删除失败!" + data.responseJSON.message + "!"); }); ajax.set("infoId",this.seItem.id); ajax.start(); } };
    当控制器接收到删除请求时,先通过TreeTool的removeTreeNode方法找出本房间的所有子节点,方法返回所有子节点的id与自己的id,然后通过返回的所有id删除房间信息。
    @RequestMapping(value = "/delete") @ResponseBody public Object delete(@RequestParam Integer infoId) { List<Integer> list= TreeTool.removeTreeNode(infoService.list(null),infoId); for(Integer i :list) infoService.deleteById(i); return SUCCESS_TIP; }
    3 结论和展望在这次的课程设计中,我花费了很多的心思与精力。只要努力就有收获,这个成品我还是比较满意的。在这个过程中,我不但对JAVA Springboot2框架和数据库有了深刻的认识和了解,同时还学会了自学与独立思考的能力。此外,在我所负责的领域中,还有几个地方考虑不足:

    报修与投诉管理员回复一次默认已经解决了问题,但是实际情况可能需要管理员多次与住户进行交流才能够完全解决问题
    租借流程中缺少管理员对租借的确认,如果系统分配的车位因为一些不可预知的原因不能租借,管理员不能及时反馈给用户
    通知信息无法插入图片
    插入信息没有控制其格式,可能会导致插入失败

    我会根据上述说的不足加以改进,使系统更人性化。
    参考文献[1] 王珊,数据库系统概论[M].高等教育出版社, 2014.
    [2] 埃克尔,JAVA编程思想(第4版)[M].机械工业出版社, 2007.
    [3] 杨开振,深入浅出SpringBoot 2.x[M].人民邮电出版社, 2019.
    [4] 朱要光,SpringMVC+MyBatis开发从入门到项目实战[M].电子工业出版社, 2018.
    1 评论 10 下载 2019-03-26 10:13:11 下载需要8点积分
  • 基于QT实现的旅游路线查询系统

    一、功能要求
    系统初始的城市总数不少于10个
    建立汽车、火车和飞机的时刻表(航班表),时刻表(航班表)中包含沿途到站及票价信息
    不能太简单(不能总只是1班车次相连),旅客的要求包括:起点、终点、途经某些城市和旅行策略
    旅行策略包括:

    最少费用策略:无时间限制,费用最少即可最少时间策略:无费用限制,时间最少即可限时最少费用策略:在规定的时间内所需费用最省
    旅行模拟查询系统以时间为轴向前推移,每10秒左右向前推进1个小时(非查询状态的请求不计时)
    不考虑城市内换乘交通工具所需时间,但是考虑因换乘交通工具产生的等待时间
    系统时间精确到小时,也就是正常时间的10秒钟
    建立日志文件,对旅客状态变化和键入等信息进行记录
    选做一:某旅客在旅行途中可更改旅行计划,系统应做相应的操作
    选做二:用图形绘制地图,并在地图上反映出旅客的旅行过程

    二、需求分析2.1 项目需求本次旅行模拟系统查询项目的基本需求是实现一个模拟旅行系统查询的功能。
    在基本功能上,如果是普通的旅行客户,需要实现用户信息的登录登出,对于没有注册过信息的新用户还需要提供进行旅客信息注册功能;用户输入旅行路线信息,包括起始站,终点站,以及旅客出发时间;旅客可以自行选择其中三种策略中的一种来定义出行方式;最后系统能够根据旅客输入路线信息以及选择的策略生成最佳的旅行路线,所给路线中需要包括出发地点,终止地点,出行时间,出行方式,以及途中的中间站,若需要更改出行交通工具,系统还必须要给出中间站的换乘方式;对于旅客当前的状态,系统需要能够每隔一定的实际输出当前旅客的状态信息,状态信息包括旅客的路线,旅客所乘坐的交通工具,旅行时间等等信息。
    对于登录的管理员,除了能够实现以上所述的客户的功能之外,另外还有一个就是能够文件处理功能,包括查询用户登录的信息、用户输入的路线信息、系统事件信息等。
    在模拟旅行查询系统的高阶需求方面,我们需要可视化的显示旅客当前的状态信息,比如如果旅客当前乘坐的是火车,并且正处于北京和上海之间,那么在图形化界面上就可以显示出一个正在运动的火车,而且火车的位置正处于北京和上海之间。图形化界面尽量做到简洁美观。
    另外一个就是,实际生活中旅客可能会在中途旅行过程中更改旅行计划,如果可以实现中途修改计划同时系统相应的计算出新的路线方式,则更是符合现实要求。
    2.2 项目业务要求
    2.3 问题整理
    呈现三种交通工具:汽车、火车、飞机
    某旅客于某一时刻向系统提出旅行要求,系统根据该旅客的要求为其设计一条旅行线路并输出
    系统能查询当前时刻旅客所处的地点和状态,包括旅客所停留城市,以及所乘坐的交通工具

    2.4 目标功能
    初始城市总数为11个
    分别建立汽车、火车和飞机的时刻表(航班表),通过文件读取信息初始化时刻表内容,有沿途到站、票价、路程等信息
    旅客的输入要求:起点、终点、途经城市,由用户自行选择旅行策略
    提供三种旅行策略:

    最少费用策略:无时间限制,费用最少即可最少时间策略:无费用限制,时间最少即可限时最少费用策略:在规定的时间内所需费用最省
    旅行模拟查询系统以时间为轴向前推移,打开可执行文件同时系统计时器开始工作,10秒代表1个小时向前推进(非查询状态的请求不计时);城市内换乘交通工具时间不予考虑,系统时间精确到小时
    建立日志文件,对旅客状态变化和键入等信息进行记录
    利用QT实现地图界面的可视化,在地图上实时反映出旅客当前的地理位置,交通工具,并且能够动态显示其行进过程

    三、模块划分
    3.1 主模块模块功能
    主模块负责接收键盘键入命令,包括用户的输入和管理员的输入,分析该命令并调用相应的子模块中的接口函数,并以系统时间为轴向前计时,推进运行。
    3.2 线路查找模块模块功能
    该模块主要负责根据用户输入的起止城市、旅行策略,生成符合条件的旅游线路,该模块是整个系统的核心功能模块。
    主要算法

    Dijkstra算法:求一个城市到其他所有城市的最短路径
    Floyd算法:求任意两个城市之间的最短路径

    算法思路
    根据初始化的文本数据,将读取文件每一个城市抽象为一个节点,生成一个交通路线图,抽象边长为票价/路程的值,前两种策略则根据Floyd算法计算出最短路径生成,第三种策略则是先以时间为权重求得所有路径,然后计算每一条路径的费用,有路径满足,输出,否则,返回“无法满足需求”。
    3.3 数据初始化模块模块功能
    该模块负责初始化载入已有的数据,包括交通工具的时刻表 / 航班表中的数据和登录账户的数据,便于系统的运行。
    编写思路
    建立时刻表、账户表的txt,通过行读取文件中的内容,初始化结构中的数据。
    3.4 状态记录模块模块功能
    该模块是系统负责对当前旅客的乘车状态(包括所选交通工具、乘车时间、票价)以及系统所键入信息的记录,便于管理员进行管理。
    编写思路
    计时器每十秒钟(代表系统一个小时)刷新一次记录,实时保存当前系统的所有运行数据。
    3.5 日志文件处理模块模块功能
    能够完成相应的对日志文件进行静态写入和查询结果输出操作的功能,方便管理员进行管理操作。
    编写思路
    打开状态记录日志文件,可以直接在日志上增添内容。
    3.6 图形化界面生成模块模块功能
    利用Qt开发框架编写可视化的界面地图,实时显示用户当前的乘车信息,动态的展示旅客的行进路线。
    编写思路
    参考相关Qt应用程序开发框架的专业书籍。
    四、结构定义4.1 枚举相关变量enum Vehicle{Bus = 1,Train = 2,Flight = 3};//枚举交通工具变量值enum Travel_Strategy{MinCost = 1, MinTime = 2, Min_Cost_Time = 3};//枚举旅行策略变量值enum Action{T_Login = 1, A_Login = 2, Travel = 3, Search = 4};//枚举发生事件行为变量值
    4.2 数据结构定义// 旅行计划表结构typedef struct{ int mean; //交通方式 int money; //该车次所需价格 int StartTime;//该车次起始时间 int EndTime; //该车次到达时间 int Time; //该车运行时间}TIME;// 城市结点结构typedef struct { TIME Time[30];//一天最多一条路线十趟车,包含起始时间与到达时间 int i; //路线个数}Path;// 交通图数据结构typedef struct { Path P[NN][NN];}Graph;// 交通图边的结构typedef pair <int,TIME> Road;// 旅行路线结构typedef struct{ int z; string s; vector<Road> r;}Travel;
    4.3 配置文件定义4.3.1 时间表(航班表)从左到右数据依次表示:
    起始城市、终点城市、路线价格、出发时间、到达时间
    (为了简便表示,我们在读取数据时用字母代替城市)哈尔滨(A) 北京(B) 上海(C) 广州(D) 武汉(E) 成都(F) 拉萨(G) 乌鲁木齐(H) 西宁(I) 福州(J) 重庆(K)

    4.3.2 密码文本(航班表)
    第一行代表数据库中存入的用户信息的账号,第二行是账户密码,第三行是用户的身份信息,user代表是普通旅客,admin代表是管理员。
    4.3.3 日志文件
    日志文件中包括事件发生的系统时间,余下一行是时间的类型,比如截图所示有“用户到来”、“管理员到来”、“用户注册”、“管理员注册”以及输出旅客查询的信息输出等。
    五、接口函数以及类定义Jmlog.h
    void searchlog(string a,string b,int c);void jmclear();void usercome(string a,int c,int b);
    add.h
    class add;}class add : public QDialog{ Q_OBJECTpublic: explicit add(QWidget *parent = 0); ~add();private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked();private: Ui::add *ui;};
    Administrators.h
    namespace Ui {class administrators;}class administrators : public QDialog{ Q_OBJECTpublic: explicit administrators(QWidget *parent = 0); ~administrators(); void MIMA(QString,QString); void Open();private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked();private: Ui::administrators *ui;};
    Chenggong.h
    namespace Ui {class chenggong;}class chenggong : public QDialog{ Q_OBJECTpublic: explicit chenggong(QWidget *parent = 0); ~chenggong();private: Ui::chenggong *ui;};
    Global.h
    extern Graph g;extern vector<Travel> TR;
    Graph.h
    typedef struct{ int mean;//交通方式 int money;//该车次所需价格 int StartTime;//该车次起始时间 int EndTime;//该车次到达时间 int Time;//该车运行时间}TIME;typedef struct { TIME Time[30];//一天最多一条路线十趟车,包含起始时间与到达时间 int i;//路线个数}Path;typedef struct { Path P[NN][NN];}Graph;typedef pair <int,TIME> Road;typedef pair <int,string> TB;typedef pair <TB,vector<Road> > Travel;
    Init.h
    int ToInt(char s[10]);void Print(Graph g);void Add(void);Graph Read(void);
    Login.h
    namespace Ui {class login;}class login : public QDialog{ Q_OBJECTpublic: explicit login(QWidget *parent = 0); ~login();protected: void timerEvent(QTimerEvent * event);private slots: void on_denglu_clicked(); void on_close_clicked(); void on_zhuce_clicked();private: Ui::login *ui; int id1;};
    Luxian.h
    namespace Ui {class luxian;}class luxian : public QDialog{ Q_OBJECTpublic: explicit luxian(QWidget *parent = 0); ~luxian(); void Print(QString s);private: Ui::luxian *ui;};
    Plan.h
    extern int t;extern int t1;bool fn(TIME a, TIME b);int minDistance(int dist[], bool sptSet[]);int Low_T(vector<Road> line);TIME my_min(Path p, int preT);TIME my_min_lim(Path p, int preT, int limit);vector<Road> dijkstraCost(Graph graph, int src, int dst);Travel pivot_inT(Graph graph, vector<int>p, int T,string &s);vector<Road> dijkstraTime(Graph graph, int src, int dst, int T);vector<Road> dijkstraCost_T(Graph graph,int src,int dst,int T,int L);Travel pivot_inW(Graph graph, vector<int>p,string &s);Travel pivot_in_limit(Graph graph,vector<int>p,int T,int L,string&s);string Changecity(int a);string Changetime(int m);int Backcity(QString s);int Backtime(QString s);
    Search.h
    namespace Ui {class searcha;}extern int t;class searcha : public QDialog{ Q_OBJECTpublic: explicit searcha(QWidget *parent = 0); ~searcha();private slots: void on_pushButton_2_clicked(); void on_pushButton_clicked(); void on_pushButton_3_clicked();private: Ui::searcha *ui;};
    Users.h
    namespace Ui {class Users;}class Users : public QDialog{ Q_OBJECTpublic: explicit Users(QWidget *parent = 0); ~Users(); void MIMA(QString,QString);private slots: void on_pushButton_clicked(); void on_queding_clicked();protected: void timerEvent(QTimerEvent *event);private: Ui::Users *ui; int id1;};
    Watch.h
    extern int t;//系统时间extern string name;//用户名namespace Ui {class watch;}class watch : public QDialog{ Q_OBJECTpublic: explicit watch(QWidget *parent = 0); ~watch();protected: void timerEvent(QTimerEvent * event); void paintEvent(QPaintEvent * event); void mousePressEvent(QMouseEvent *e);private: Ui::watch *ui; int id2; QPixmap *pix;};void coordinate(int t,int &m,int &n);void change(int a,int &m,int &n);
    Wrong.h
    namespace Ui {class wrong;}class wrong : public QDialog{ Q_OBJECTpublic: explicit wrong(QWidget *parent = 0); ~wrong();private: Ui::wrong *ui;};
    Zhanghu.h
    extern int t;void write(string a,string b,string c);int judge(string a,string b,string c);
    Zhuce.h
    namespace Ui {class zhuce;}class zhuce : public QDialog{ Q_OBJECTpublic: explicit zhuce(QWidget *parent = 0); ~zhuce();private: Ui::zhuce *ui;};
    六、核心算法描述6.1 程序流程图
    6.2 费用最少策略以费用为权值,使用dijkstra算法寻找从出发点到其余点的最短路径,并在寻找过程中保存每一点的前驱,寻找完成后,通过前驱记录,构建出由源点到终点的路径。
    6.3 时间最少策略以时间为权值,使用dijkstra算法寻找从出发点到其余点的最短路径,并在寻找过程中保存每一点的前驱,寻找完成后,通过前驱记录,构建出由源点到终点的路径。
    6.4 限时费用最少基于时间最短策略求得的最短时间T,先对限制时间t进行判断,若满足T <= t,则以时间和费用为权值,分段寻找最短短路径,否则给出给出时间最少策略的路径。
    七、测试7.1 范例信息
    旅客信息

    账号:12345678密码:12345678路线:北京——广州旅客出发时间:1点途径城市:上海、武汉策略:最短时间策略
    管理员信息

    账号:12345678 密码:12345678执行操作:查看日志信息、观察用户状态、添加路线信息,检查添加路线信息路线添加详细信息:
    起始地点:重庆——福州交通方式:火车(用“1”代替)起始时间:2点终止时间:23点价格:876元


    7.2 测试截图7.2.1 普通旅客登录注册用户信息,注册成功,点击登录按钮,登录成功。

    输入路线信息,北京作为起始站,终止站为广州,设置武汉、上海为途径城市,选择最短时间策略。

    路线信息中包含中转信息,包括中转站点,交通方式,起始时间和终止时间,路线保存在日志文件中。

    如下图所示,用火车图案代表乘火车,飞机图案代表乘飞机,汽车图案代表乘坐汽车,将路线结果展示在图形界面中。

    7.2.2 管理员登录管理员直接注册账号后进行登录。

    右边的文本框显示旅客操作的信息,包括登录信息、旅行计划信息等,用下拉可以看清所有结果。

    观察用户状态和之前截图所示的一样,动态显示出当前用户的旅行计划状态,在图形化界面上显示。

    在输入框中输入需要添加的路线信息,包括起止时间,起止站点,交通方式,以及旅行价格,点击确认后提示成功。

    添加信息结构位于数据中的最后一排,根据如图所示,添加路线信息成功,如有不合适,可以直接删除。

    7.3 结果分析根据以上的程序执行结果的截图,整个程序执行期间没有出现停机状态,说明健壮性良好;根据用户的输入结果,程序可以输出相应的路线信息,经过线下按照实际录入信息的数据计算比对,策略吻合程度较高,基本满足算法正确性的要求;程序可以准确的记录下程序运行期间所发生的事件,通过添加路线的功能,管理员能够实时更新路线信息,更加符合实际程序运行的需要;图形界面显示方面,虽然没有能够实现很完美的表现用户状态很清晰的实时显示,不过基本的动态效果可以实现,能够将文字化的路线信息转成图形化表示。
    1 评论 1 下载 2019-05-08 10:33:58 下载需要15点积分
  • 基于JavaEE轻量级SSM框架和Maven构建的校友录网站设计与实现

    摘要校友作为高校的一种重要资源,在促进高校专业教学改革、募集高校筹资办学途径、促进校企合作、加强毕业生感情交流、提升大学生就业质量等方面发挥着重要作用。然而目前我校并没有一个系统可以追溯毕业生的情况。因此,校友们需要一个平台,来了解母校的新闻,校友们的近况,同时也能够让院校充分了解毕业生的就业状况。
    为了给校友们的提供一个了解母校动态的平台,本设计首先确定以毕业生以及高校为主要用户对象,采用目前业内流行的SpringMVC+Spring+MyBatis轻量级JavaEE框架,用Maven构建和管理,开发基于B/S结构的校友录系统。其次,通过系统建模对系统的各项功能进行了分析,确定了校友录系统的功能模块,并阐述了数据库的设计过程。再次对系统的功能模块进行了详细的设计,并对系统功能模块的界面进行了展示。最后对论文所阐述的内容进行总结,并分析了校友录系统对毕业生和院校带来的便利。
    校友录系统是在对师生、院校进行充分的调研分析之后设计的,校友更多关注的是院校新闻、班级动态、校友信息以及社团学生会等团体,院校更多关注的是毕业生的就业情况、对本校毕业生招聘信息的推送。为满足院校和毕业生的需求,校友录系统设计了新闻中心模块、班记录模块、校友组织模块、校友论坛模块、职业招聘模块、校园服务模块。
    校友录系统不仅能够很好地满足校友了解母校、校友动态的需求,也提供职业招聘、校园服务功能,使院校能够更好地了解毕业生就业情况、为毕业生提供就业服务。
    关键词 毕业;校友录;就业;JavaEE
    AbstractYouth is the best time in life,and this period of youth spent in the university will undoubtedly become themost valuable memories of our lives.Although time goes by fast, universitylife, the impressive community, the memorable alumni, the unforgettable teachingbuilding, will be a subsequent stream of water in the memories. Aftergraduation, we left school, along with the alumni miss and the alma mater’sattention. Thus, alumni desire for a platform to follow the news of alma mater,the status of alumni, and the dynamics of the group that they have joined.
    Inorder to provide a sustenance for alumni’s emotions, this design, takinggraduates and colleges as the main user object, using the currentindustry-popular SpringMVC + Spring + MyBatis lightweight JavaEE framework,develops the computer-based web pages Version of the simple and elegant AlumniRecord System ( AR), built and managed by Maven.
    AR is designedafter a full investigation and analysis is conducted in the teachers, studentsand institutions. Alumni pay more attention to the school news, class dynamics,alumni information, community students and other groups. Institutions concernmore about the graduates’ employment situation, new enrollment situation anddelivery of recruit information about school graduates. AR designs the newscenter module, class record module, alumni organization module and alumni forummodule. And album function is added into the class record and alumniorganization, which aims to meet the needs of alumni better. At the same time,AR includes professional recruitment module, campus service module, so thatinstitutions can understand the employment situation of graduates and helpgraduates better.
    AR system not only can meetalumni to understand the alma mater, alumni dynamic needs, but also provideprofessional recruitment, campus service function, so that institutions canbetter understand the employment situation of graduates, to provide employmentservices for graduates.
    Keywords graduation alumni-record employment javaee
    1 绪论1.1 课题背景青春是人生最美好的时光,而在大学度过的这一段青春岁月无疑将成为我们人生中最为宝贵的回忆。大学生活如白驹过隙匆匆流逝,却又将在而后的回忆里细水长流,忘不掉的社团,忘不掉的校友,忘不掉的教学楼。毕业后,我们离开学校,一同带走的还有对校友的思念和对母校的关注。因此,校友们需要一个平台,来了解母校的新闻,校友们的近况,自己曾加入的团体的动态等等。
    同时,院校对毕业生的培养与关怀也不会停止,院校希望了解毕业生的就业情况,并为毕业生提供就业服务,包括向毕业生投送招聘信息,接收毕业生所在单位的招聘信息。并且,校友作为高校的一种重要资源,在促进高校专业教学改革、募集高校筹资办学途径、促进校企合作、加强毕业生感情交流、提升大学生就业质量等方面发挥着重要作用。这也有助于改善教学方案,从而使本校毕业生更好地适应社会需求。
    1.2 课题意义中国同学录网的调查显示,用户最关心的是班级信息、班级留言、同学联系方式和同学照片等。不同用户对系统的需求不同,但是基本功能需求是一致的,包括:对班级管理,用户可以创建自己所在的班级;对班级留言的管理,用户可以在班级里查看、添加或修改留言;对班级通讯录的管理,用户可以查看班级成员的相关信息。
    此系统还可以让校友了解母校的新闻,校友们的近况,自己曾加入的团体的动态,也提供了职业招聘功能,此功能是院校和毕业生交互的重要平台。院校可在职业招聘模块发布招聘信息,毕业生可以浏览招聘信息、投递简历、在线制作简历,毕业生可以发布自己所在单位的招聘信息,经管理员审核后发布到招聘广场,为其他毕业校友提供有力的就业帮助。校友的信息反馈在促进高校专业教学改革、募集高校筹资办学途径、促进校企合作、加强毕业生感情交流、提升大学生就业质量等方面发挥着重要作用。
    1.3 课题内容此系统是在对师生、院校进行充分的调研分析之后设计的,校友更多关注的是院校新闻、班级动态、校友信息以及社团学生会等团体,院校更多关注的是毕业生的就业情况、新生的招生情况以及对本校毕业生招聘信息的投送。此系统设计了新闻中心模块、班记录模块、校友组织模块、校友论坛模块,并在班记录和校友组织中加入相册功能,更好地满足校友的需求。同时,此系统包含职业招聘模块、校园服务模块,使院校更好地了解毕业生就业情况、为毕业生提供帮助。
    1.4 论文的组织结构论文主要内容包括五大部分,主要包括:

    第一章 绪论。本章介绍了课题背景、课题意义以及本课题研究的主要内容。第二章 系统需求分析。本章介绍了本系统的业务需求分析、系统功能分析以及相关业务的流程,开发过程中具体的开发环境、开发工具、相关技术。第三章 系统总体设计。本章介绍了本系统的总体设计、系统各项功能的设计以及数据库的设计。第四章 系统详细设计。本章介绍了系统的详细设计,包括各项系统功能的界面设计、代码逻辑设计以及实现。
    2 系统需求分析2.1 需求分析中国同学录网的调查显示,用户最关心的是班级信息、班级留言、同学联系方式和同学照片等。不同用户对系统的需求不同,但是基本功能需求是一致的,包括:对班级管理,用户可以查询并加入自己所在的班级;对班级留言的管理,用户可以在班级里查看、添加或修改留言;对班级通讯录的管理,用户可以查看班级成员的相关信息。考虑到网络的现况和同学们以及毕业生跟踪调查的各种需求,系统应该具有各方面的交流能力和实时的用户反馈信息,能够实现留言、上传照片、评论等功能,同时具有方便的后台管理功能。同学录系统能够实现同学们生活中的交流,拥有自己的空间,与此同时,校方管理员能够了解毕业生的就业情况,并为毕业生提供就业服务,包括向毕业生投送招聘信息,接收毕业生所在单位的招聘信息。这也有助于改善教学方案,从而更好地让本校毕业生适应社会需求。系统主要功能有:

    系统用户的登录、注册。注册,由管理员将历届学生的学号、姓名导入数据库,学号作为用户的用户名;登录,输入用户输入用户名(学号)和密码登录系统;校园新闻发布中心功能:新闻发布,后台管理发布图文信息到门户网站,可置顶、编辑、删除新闻信息;新闻评论,用户可以对新闻信息发表评论,回复评论,动态加载地评论;新闻热度,用户喜欢可以新闻信息,系统根据信息的喜欢量、浏览流量推送新闻信息;同学交流的班级录功能。班级检索,按入学年份查询,按照班级名称、校友姓名查询,综合检索班级;班级排名,根据班级人数、活跃时间对班级进行热度排名;班级主页,每个班级有自己的空间,包括班级主页、班级动态、班级留言、班级成员、班级通讯录、班级相册、班级事务管理等;班级管理,班级的新增、管理员的设置由后台管理员完成;校友互动的团体组织功能。校友总会,院校总会;院系分会,各学院的校友组织;社团分会,院校内的各种社团、协会的组织;学生协会,院校内的各学生协会组织;组织主页,个组织有自己的空间,包括组织主页、动态消息、留言、成员列表、通讯录、相册、活动、组织事务管理;校友话题参与的论坛功能。帖子浏览,按作者、主题检索帖子,查看详情,对帖子发表评论,回复评论、删除用户自己的评论,ajax动态加载评论;热帖推送,用户可以喜欢帖子,系统根据帖子的喜欢数量和浏览量进行推送;发布新帖,用户登录后可以发布帖子;贴子管理,管理员可审核、置顶、删除帖子;职位招聘信息推送功能。招聘广场,浏览招聘信息,根据公司名称、职位名称、工作地点检索并查看招聘信息;简历投送,用户可以向喜欢的招聘信息投送个人简历;简历管理,用户可以新增简历、编辑简历、删除简历;单位管理,用户可以登记、编辑自己所在单位的信息;发布招聘,用户登记单位信息后可以发布招聘信息,由管理员审核后推送到招聘广场;招生就业的校园服务。校内服务,包括走进校园、校园行指南、学报编辑部、图书馆、档案馆、信息公开网等信息;招生就业服务,包括本科招生、成教招生、就业网、人才招聘、本站招聘等信息;用户个人管理中心。个人资料,基本资料、 详细资料、工作信息、 头像设置;账户设置,密码修改、邮箱绑定;我的班级,用户加入的班级相关信息;我的论坛,用户早论坛的相关信息;我的招聘,用户发布的招聘信息,用户投递的简历信息,用户个人简历管理。
    2.2 功能分析基于对校友录系统的需求分析,校友录系统有新闻中心功能,管理员发布管理图文信息,用户可以浏览、评论新闻信息。校友录系统设置班记录功能,给班级同学提供班级空间,班级空间内有交流平台、班级相册,这是同学比较关心的功能。同时,校友录系统具有校友组织功能,校友可以加入校内的组织和团体,组织有自己的空间给组织成员提供交流平台。为给广大校友提供更大的交流平台,校友录系统提供校友论坛功能,校友可以浏览话题并参与讨论。为满足院校对招聘信息推送的需求,校友录系统应加入职业招聘模块,院校管理员发布招聘信息,用户浏览并投递简历,用户也可以发布自己所在单位的招聘信息,经管理员审核后发不到招聘广场。为更好地微笑有提供入学、就业服务,校友录系统设有校园服务,为校友提供校园指南和就业服务。最后,校友录系统为用户提供个人中心功能,对个人信息以及在站内的应用进行管理。
    2.2.1 院校新闻发布功能新闻中心用例分析
    新闻中心包括新闻发布,后台管理发布图文信息到门户网站,可置顶、编辑、删除新闻信息。新闻评论,用户可以对新闻信息发表评论,回复评论,动态加载评论。新闻热度,用户喜欢可以新闻信息,系统根据信息的喜欢量、浏览流量推送新闻信息。新闻中心用例如图2-1所示。

    2.2.2 班级管理功能班记录用例分析
    班记录包括班级检索,按入学年份查询,按照班级名称、校友姓名查询,综合检索班级;班级排名,根据班级人数、活跃时间对班级进行热度排名;班级主页,每个班级有自己的空间,包括班级主页、班级动态、班级留言、班级成员、班级通讯录、班级相册、班级事务管理等;班级管理,班级的新增、管理员的设置由后台管理员完成。班记录用例如图2-2所示。

    2.2.3 院校组织管理功能校友组织用例分析
    校友组织包括:校友总会,院校总会;院系分会,各学院的校友组织;社团分会,院校内的各种社团、协会的组织;学生协会,院校内的各学生协会组织;组织主页,个组织有自己的空间,包括组织主页、动态消息、留言、成员列表、通讯录、相册、活动、组织事务管理;校友组织用例如图2-3所示。

    2.2.4 校友论坛功能校友论坛用例分析
    校友论坛包括:帖子浏览,按作者、主题检索帖子,查看详情,对帖子发表评论,回复评论、删除用户自己的评论,ajax动态加载评论;热帖推送,用户可以喜欢帖子,系统根据帖子的喜欢数量和浏览量进行推送;发布新帖,用户登录后可以发布帖子;贴子管理,管理员可审核、置顶、删除帖子;校友论坛用例如图2-4所示。

    2.2.5 院校职业招聘功能业招聘用例分析
    职位招聘包括:招聘广场。浏览招聘信息,根据公司名称、职位名称、工作地点检索并查看招聘信息;简历投送,用户可以向喜欢的招聘信息投送个人简历;简历管理,用户可以新增简历、编辑简历、删除简历;单位管理,用户可以登记、编辑自己所在单位的信息;发布招聘,用户登记单位信息后可以发布招聘信息,由管理员审核后推送到招聘广场。职业招聘用例如图2-5所示。

    2.2.6 校园服务功能校园服务用例分析
    校园服务:校内服务,包括走进校园、校园行指南、学报编辑部、图书馆、档案馆、信息公开网等信息;招生就业服务,包括本科招生、成教招生、就业网、人才招聘、本站招聘等信息。校园服务用例如图2-6所示。

    2.2.7 用户个人中心功能个人中心用例分析
    个人中心:个人资料,基本资料、 详细资料、 工作信息、 头像设置;账户设置,密码修改、邮箱绑定;我的班级,用户加入的班级相关信息;我的论坛,用户早论坛的相关信息;我的招聘,用户发布的招聘信息,用户投递的简历信息,用户个人简历管理。个人中心用例如图2-7所示。

    2.4 技术路线本系统采用业内流行的SpringMVC+Spring+MyBatis框架(简称SSM),由项目构建工具Maven构建,并使用Git版本控制系统辅助项目开发。
    Git是一个便捷的分布式版本控制工具,本项目用Git进行管理,可以轻松地备份项目,控制项目的版本,并且能够更安全地开发、调试。
    Maven可以通过项目对象模型配置文件(pom.xml)轻松地构建项目,不用将jar包添加到项目,缩小了项目的体积。本系统使用Maven构建父模块ar-parent,并聚合了三个子模块ar-common、ar-manage、ar-portal。ar-common是项目的公共基础模块,java应用类的模型,包含实体类、工具类、数据访问对象等,依赖Spring、MyBatis等。ar-manage是本系统的后台管理模块,web应用类的模型,依赖ar-common、Spring、SpringMVC等。Ar-poratl是本系统的门户网站模块,依赖ar-common、ar-manage、Spring、SpringMVC等。Maven可以将web应用类项目打包成war并发布到tomcat服务器运行测试。
    本系统充分利用Spring的IoC(控制反转)和AOP(面向切面)特性,将创建用户的SpringMVC控制器Controller、业务逻辑类Service、数据访问类Mapper交由Spring Container管理,生成对应的bean(也称组件), 并把实现类的类名作为bean的id。当控制器、业务逻辑类、数据访问类需要Spring Container中bean对应的实现类时,Spring Container通过依赖注入机制为其注入对应的bean。通过这种配置,系统实现了控制器和业务逻辑类分离,业务逻辑类和数据访问类分离。SpringMVC中的DispatcherServlet接收请求,并交由控制器Controller处理,Controller接收参数、调用业务逻辑类中的方法,通过ModelAndView视图模型返回jsp页面、json数据。
    本系统的视图层采用jsp、HTML,通过事件触发机制向服务器端发送请求,并采用Bootstrap、AmazeUI、HTML5、CSS3等前台样式,通过c标签、javascript、jquery处理前台数据。
    技术路线如图2-8所示。

    3 系统总体设计3.1 系统总体设计根据系统功能分析,本系统应该具备的功能包括:登录注册、新闻中心、班级录、校友组织、校友论坛、职位招聘、校园服务、个人中心等功能。
    3.1.1 系统登录
    注册:由管理员将历届学生的学号、姓名导入数据库,学号作为用户的用户名;
    登录:输入用户输入用户名(学号)和密码登录系统。

    3.1.2 新闻中心
    新闻发布:后台管理发布图文信息到门户网站,可置顶、编辑、删除新闻信息;
    新闻评论:用户可以对新闻信息发表评论,回复评论,动态加载评论;
    新闻热度:用户喜欢可以新闻信息,系统根据信息的喜欢量、浏览流量推送新闻信息。

    3.1.3 班级录
    班级检索:按入学年份查询,按照班级名称、校友姓名查询,综合检索班级;
    班级排名:根据班级人数、活跃时间对班级进行热度排名;
    班级主页:每个班级有自己的空间,包括班级主页、班级动态、班级留言、班级成员、班级通讯录、班级相册、班级事务管理等;
    班级管理:班级的新增、管理员的设置由后台管理员完成。

    3.1.4 校友组织
    校友总会:院校总会;
    院系分会:各学院的校友组织;
    社团分会:院校内的各种社团、协会的组织;
    学生协会:院校内的各学生协会组织;
    组织主页:个组织有自己的空间,包括组织主页、动态消息、留言、成员列表、通讯录、相册、活动、组织事务管理。

    3.1.5 校友论坛
    帖子浏览:按作者、主题检索帖子,查看详情;
    评论帖子:对帖子发表评论,回复评论、删除用户自己的评论,ajax动态加载评论;
    热帖推送:用户可以喜欢帖子,系统根据帖子的喜欢数量和浏览量进行推送;
    发布新帖:用户登录后可以发布帖子;
    贴子管理:管理员可审核、置顶、删除帖子。

    3.1.6 职位招聘
    招聘广场:浏览招聘信息,根据公司名称、职位名称、工作地点检索并查看招聘信息;
    简历投送:用户可以向喜欢的招聘信息投送个人简历;
    简历管理:用户可以新增简历、编辑简历、删除简历;
    单位管理:用户可以登记、编辑自己所在单位的信息;
    发布招聘:用户登记单位信息后可以发布招聘信息,由管理员审核后推送到招聘广场。

    3.1.7 校园服务
    校内服务:包括走进校园、校园行指南、学报编辑部、图书馆、档案馆、信息公开网等信息;
    招生就业服务:包括本科招生、成教招生、就业网、人才招聘、本站招聘等信息。

    3.1.8 个人中心
    个人资料:基本资料、 详细资料、 工作信息、 头像设置;
    账户设置:密码修改、邮箱绑定;
    我的班级:用户加入的班级相关信息;
    我的论坛:用户早论坛的相关信息;
    我的招聘:用户发布的招聘信息,用户投递的简历信息,用户个人简历管理。

    3.2 系统功能设计3.2.1 新闻中心新闻发布,后台管理发布图文信息到门户网站,可置顶、编辑、删除新闻信息;新闻评论,用户可以对新闻信息发表评论,回复评论,动态加载评论;新闻热度,用户喜欢可以新闻信息,系统根据信息的喜欢量、浏览流量推送新闻信息。新闻中心功能如图3-1所示。

    3.2.2 班记录班级录功能包括:班级检索,按入学年份查询,按照班级名称、校友姓名查询,综合检索班级;班级排名,根据班级人数、活跃时间对班级进行热度排名;班级主页,每个班级有自己的空间,包括班级主页、班级动态、班级留言、班级成员、班级通讯录、班级相册、班级事务管理等;班级管理,班级的新增、管理员的设置由后台管理员完成。班级录功能如图3-2所示。

    3.2.3 校友组织校友组织包括:校友总会,院校总会;院系分会,各学院的校友组织;社团分会,院校内的各种社团、协会的组织;学生协会,院校内的各学生协会组织;组织主页,个组织有自己的空间,包括组织主页、动态消息、留言、成员列表、通讯录、相册、活动、组织事务管理。校友组织功能如图3-3所示。

    3.2.4 校友论坛校友论坛:帖子浏览,按作者、主题检索帖子,查看详情,对帖子发表评论,回复评论、删除用户自己的评论,ajax动态加载评论;热帖推送,用户可以喜欢帖子,系统根据帖子的喜欢数量和浏览量进行推送;发布新帖,用户登录后可以发布帖子;贴子管理,管理员可审核、置顶、删除帖子。校友论坛功能如图3-4所示。

    3.2.5 职业招聘职位招聘:招聘广场。浏览招聘信息,根据公司名称、职位名称、工作地点检索并查看招聘信息;简历投送,用户可以向喜欢的招聘信息投送个人简历;简历管理,用户可以新增简历、编辑简历、删除简历;单位管理,用户可以登记、编辑自己所在单位的信息;发布招聘,用户登记单位信息后可以发布招聘信息,由管理员审核后推送到招聘广场。职业招聘功能如图3-5所示。

    3.2.6 校园服务校园服务包括:校内服务,包括走进校园、校园行指南、学报编辑部、图书馆、档案馆、信息公开网等信息;招生就业服务,包括本科招生、成教招生、就业网、人才招聘、本站招聘等信息。校园服务功能如图3-6所示。

    3.2.7 个人中心个人中心:个人资料,基本资料、 详细资料、 工作信息、头像设置;账户设置,密码修改、邮箱绑定;我的班级,用户加入的班级相关信息;我的论坛,用户在论坛的相关信息;我的招聘,用户发布的招聘信息,用户投递的简历信息,用户个人简历管理。个人中心功能如图3-7所示。

    3.3 数据库设计3.3.1 概念模型设计根据系统总体设计和功能设计,设计出系统涉及到的实体信息,包括用户实体,个人信息实体,职业信息实体,简历实体,地址实体,留言实体,评论回复实体,年级实体,组织实体,活动实体,相册实体,图片实体,信息实体,评论实体,分享实体,收藏实体,订阅实体,招聘信息实体,招聘单位实体,附件实体,角色实体,权限实体,字典实体,字典数据实体,各实体信息的概念模型如下所示。
    1.用户实体模型如图3-8所示。

    2.职业信息实体模型如图3-9所示。

    3.简历实体模型如图3-10所示。

    4.地址实体模型如图3-11所示。

    5.留言实体模型如图3-12所示。

    6.评论回复实体模型如图3-13所示。

    7.年级实体模型如图3-14所示。

    8.组织实体模型如图3-15所示。

    9.相册实体模型如图3-16所示。

    10.活动实体模型如图3-17所示。

    11.字典数据实体模型如图3-18所示。

    12.图片实体模型如图3-19所示。

    13.信息实体模型如图3-20所示。

    14.评论实体模型如图3-21所示。

    15.分享实体模型如图3-22所示。

    16.收藏实体模型如图3-23所示。

    17.订阅实体模型如图3-24所示。

    18.招聘信息实体模型如图3-25所示。

    19.招聘单位实体模型如图3-26所示。

    20.附件实体模型如图3-27所示。

    21.角色实体模型如图3-28所示。

    22.权限实体模型如图3-29所示。

    23.字典实体模型如图3-30所示。

    24.简历投递实体模型如图3-31所示。

    3.3.2 逻辑结构设计根据系统的概念模型设计,设计出适应大多数数据库的数据表逻辑结构,共设计31张表,如表3-1所示。
    数据表汇总表



    序号
    名称
    用途与约束




    1
    user
    用户表


    2
    user_info
    用户个人信息表


    3
    user_job
    用户工作信息表


    4
    user_resume
    用户个人简历


    5
    resume_post
    简历投递信息


    6
    user_origin
    用户加入组织信息表


    7
    user_role
    用户角色设定表


    8
    role
    角色表


    9
    role_right
    角色权限分配表


    10
    right
    权限表


    11
    Address
    地址信息表


    12
    message
    消息表


    13
    reply
    回复表


    14
    grade
    年级表


    15
    origin
    组织表


    16
    activity
    活动表


    17
    album
    相册信息表


    18
    album_image
    相册图片信息表


    19
    image
    图片信息表


    20
    information
    信息表


    21
    comment
    评论表


    22
    share
    信息分享表


    23
    collect
    信息收藏表


    24
    subscription
    信息订阅表


    25
    recruit
    招聘信息表


    26
    recruit_unit
    招聘单位信息表


    27
    attachment
    附件信息表


    28
    attachment_info
    信息附件关系表


    29
    dictionary
    数据字典表


    30
    dictionary_data
    数据字典数据表


    31
    log
    日志表



    用户表



    字段名称
    字段类型(长度)
    字段含义
    备注




    id
    int
    主键
    自动增长


    account
    char(20)
    用户名



    is_admin
    char(1)
    管理员标识



    email
    varchar(20)
    用户邮箱



    password
    char(32)
    用户密码



    head_image_id
    int(8)
    头像图片标识



    create_time
    datetime
    用户注册时间



    state
    char(5)
    此条记录状态



    state_time
    datetime
    状态日期



    用户个人信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    user_info_id
    int(8)
    主键
    自动增长


    ture_name
    Nvarchar(20)
    用户名



    age
    char(5)
    年龄



    sex
    char(5)
    性别



    birthday
    datetime
    生日



    introduce
    varchar(200)
    个人简介



    phone
    varchar(20)
    联系电话



    email
    varchar(50)
    邮箱



    qq
    varchar(20)
    QQ



    microblog
    varchar(50)
    微博



    wechat
    varchar(20)
    微信



    address
    Nvarchar(50)
    住址



    user_id
    int
    用户id
    外键


    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态时间



    职业信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    job_id
    int
    主键
    自动增长


    job_name
    Varchar(20)
    职业名称



    job_unit
    Varchar(20)
    就业单位



    date_start
    date
    就职时间



    date_end
    date
    离职时间



    job_desc
    varhar(200)
    职业简述



    create_time
    datetime
    工作登记时间



    user_id
    int
    就业者
    外键


    state
    char(1)
    此条记录的状态



    state_time
    datetime
    记录状态



    个人简历表



    字段名称
    字段类型(长度)
    字段含义
    备注




    resume_id
    int
    主键
    自动增长


    resume_title
    varchar(20)
    简历标题



    prof_type
    vatchar(20)
    职业类别



    exp_salary
    varchar(10)
    期望薪资



    name
    varchar(10)
    姓名



    sex
    char(1)
    性别



    domicile
    varchar(20)
    现在居住地



    contact
    varchar(30)
    联系方式



    introduce
    varchar(200)
    个人简介



    userId
    int
    用户id
    外键


    statusValue
    char(5)
    状态值
    a x t



    简历投递表



    字段名称
    字段类型(长度)
    字段含义
    备注




    recruit_id
    int
    招聘信息id
    外键


    resume_id
    int
    简历id
    外键


    create_time
    datetime
    投递日期



    state
    char(2)
    投递状态



    state_time
    datetime
    状态日期



    角色权限配置表



    字段名称
    字段类型(长度)
    字段含义
    备注




    user_id
    int
    用户id
    外键


    role_id
    int
    角色id
    外键



    权限信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    role_id
    int
    主键
    自动增长


    role_name
    varchar(20)
    角色名称



    role_value
    varchar(20)
    角色类型



    create_time
    datetime
    创建时间



    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    角色权限表



    字段名称
    字段类型(长度)
    字段含义
    备注




    role_id
    int
    角色id
    自动增长


    right_id
    int
    权限id



    权限信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    right_id
    int
    主键
    自动增长


    right_name
    varchar(20)
    权限名称



    right_pos
    int
    权限位



    right_code
    bigint
    权限码



    right_URL
    varchar(50)
    权限路径



    is_public
    char
    是否是公共资源



    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    地址表



    字段名称
    字段类型(长度)
    字段含义
    备注




    addr_id
    int
    主键
    自动增长


    province
    varchar(10)
    省份



    city
    varchar(10)




    district
    varchar(10)




    detail
    varchar(50)
    详细地址



    zip_code
    char(6)
    邮编



    create_time
    datetime
    创建日期



    state
    char(2)
    状态值



    state_time
    datetime
    状态日期



    留言表



    字段名称
    字段类型(长度)
    字段含义
    备注




    msg_id
    int(11)
    主键
    自动增长


    title
    varchar(20)
    标题



    content
    varchar(500)
    留言内容



    sender_id
    int(8)
    发送者id



    receiver_id
    int(8)
    接收者id



    create_time
    datetime
    发表日期



    留言回复表



    字段名称
    字段类型(长度)
    字段含义
    备注




    reId
    int
    主键
    自动增长


    content
    varchar(500)
    回复内容



    create_time
    datetime
    回复时间



    msg_id
    int(11)
    被回复的留言的id
    外键


    user_id
    int
    回复人id
    外键



    年级表



    字段名称
    字段类型(长度)
    字段含义
    备注




    grade_id
    int
    主键
    自动增长


    grade_value
    char(4)
    年份



    class_num
    int(4)
    班级数



    create_time
    datetime
    创建日期



    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    组织信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    origin_id
    int
    主键
    自动增长


    origin_name
    varchar(20)
    组织编号



    origin_no
    varchar(20)
    组织名



    origin_type
    varchar(20)
    组织类型



    origin_desc
    varchar(500)
    组织简介



    origin_grade
    varchar(4)
    组织年级



    members
    int(4)
    组织人员数量



    create_time
    datetime
    组织成立的年份



    mgr_id
    int
    组织的管理员id
    外键


    creator_id
    int
    组织创建人
    外键


    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    校友活动表



    字段名称
    字段类型(长度)
    字段含义
    备注




    act_id
    int(8)
    主键
    自动增长


    act_name
    varchar(20)
    活动名称



    start_time
    datetime
    活动开始时间



    end_time
    datetime
    活动结束时间



    act_place
    varchar(50)
    活动地点



    act_desc
    text
    活动描述



    act_num
    int(4)
    活动人数



    sign_num
    int(4)
    活动已报名人数



    interests
    int(4)
    感兴趣数



    leader_name
    varchar(10)
    负责人姓名



    leader_phone
    varchar(30)
    负责人联系方式



    origin_id
    int(8)
    活动所属组织
    外键


    user_id
    int(8)
    活动发起人
    外键


    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    相册表



    字段名称
    字段类型(长度)
    字段含义
    备注




    album_id
    int(8)
    主键
    自动增长


    album_name
    varchar(20)
    相册名名



    albm_desc
    varchar(200)
    相册描述



    create_time
    datetime
    创建时间



    interests
    int(4)
    感兴趣的人数



    cover_image
    int(11)
    相册封面标识



    origin_id
    int
    相册所属组织
    外键


    user_id
    int
    相册创建人
    外键


    state
    char(2)
    此条记录状态



    state_time
    datetime
    创建时间



    相册图片表



    字段名称
    字段类型(长度)
    字段含义
    备注




    album_id
    int
    相册id
    外键


    image_id
    int
    图片id
    外键


    create_time
    datetime
    创建时间



    图片信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    image_id
    int(11)
    主键
    自动增长


    image_name
    varchar(32)
    图片名



    is_remote
    char(1)
    远程文件



    image_size
    varchar(5)
    图片大小



    image_path
    varchar(255)
    图片路径



    image_type
    varchar(20)
    图片类型



    is_thumb
    char(1)
    缩略图标识



    thumb_path
    varchar(255)
    缩略图路径



    create_time
    datetime
    上传日期



    state
    char(2)
    图片状态



    信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    info_id
    int(11)
    主键
    自动增长


    info_title
    varchar(50)
    信息标题



    content
    text
    内容



    theme
    varchar(2)
    主题



    thumb_image
    varchar(255)
    图文信息缩略图



    views
    int(4)
    浏览量



    comments
    int(4)
    评论数



    shares
    int(4)
    分享次数



    create_time
    datetime
    创建日期



    is_top
    char(1)
    置顶标识



    info_type
    varchar(20)
    信息类型



    user_id
    int(8)
    用户id



    origin_id
    int(8)
    信息所属组织id



    state
    char(2)
    状态



    state_time
    datetime
    状态日期



    评论表



    字段名称
    字段类型(长度)
    字段含义
    备注




    comment_id
    int(11)
    主键
    自动增长


    content
    varchar(500)
    评论内容



    create_time
    datetime
    评论日期



    user_id
    int
    评论人
    外键


    info_id
    int
    评论的信息id
    外键



    信息转发表



    字段名称
    字段类型(长度)
    字段含义
    备注




    create_time
    datetime
    转发时间



    info_id
    int(11)
    被转发的信息id
    外键


    user_id
    int(8)
    转发人id
    外键


    where
    varchar(20)
    转发方式



    收藏表



    字段名称
    字段类型(长度)
    字段含义
    备注




    collect_id
    int
    主键
    自动增长


    create_time
    datetime
    收藏时间



    info_id
    int
    收藏信息的id
    外键


    user_id
    int
    收藏人
    外键


    state
    char(2)
    此条记录状态



    state_time
    datetime
    状态日期



    信息订阅表



    字段名称
    字段类型(长度)
    字段含义
    备注




    sub_id
    int(11)
    主键
    自动增长


    create_time
    datetime
    订阅时间



    info_type
    varchar(20)
    订阅信息类型



    is_email
    char(1)
    邮箱订阅标识



    user_id
    int(8)
    用户id



    state
    char(2)
    状态



    state_time
    datetime
    状态日期



    招聘信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    recruitId
    int
    主键
    自动增长


    title
    varchar(20)
    招聘标题



    create_time
    datetime
    创建时间



    end_time
    datetime
    招聘结束时间



    members
    int(4)
    招聘人数



    resumes
    int(4)
    简历投送数



    leader_name
    varchar(20)
    联系人



    leader_phone
    varchar(30)
    联系方式



    is_top
    char(1)
    置顶标识



    pos_name
    varchar(20)
    职位名称



    pos_desc
    varchar(500)
    职位描述



    benefit
    varchar(50)
    职位福利



    work_place
    varchar(50)
    工作地点



    unit_id
    int(8)
    招聘单位id



    user_id
    int
    发布人id
    外键


    state
    char(1)
    状态



    state_time
    datetime
    状态日期



    招聘单位信息表



    字段名称
    字段类型(长度)
    字段含义
    备注




    unit_id
    int(8)
    主键
    自动增长


    unit_name
    varchar(30)
    招聘单位名称



    industry
    varchar(30)
    单位所属行业



    property
    varchar(20)
    单位性质



    scale
    varchar(20)
    单位规模



    unit_desc
    text
    单位简介



    unit_web
    varchar(30)
    单位网站



    user_id
    int(8)
    发布者id
    外键


    state
    char(1)
    此条记录状态



    state_time
    datetime
    状态日期



    附件表



    字段名称
    字段类型(长度)
    字段含义
    备注




    atta_id
    int
    主键
    自动增长


    atta_name
    varchar(32)
    附件文件名



    atta_type
    varchar(20)
    附件类型



    is_romote
    char(1)
    远程文件标识



    file_path
    varchar(255)
    文件路径



    file_size
    char(10)
    文件大小



    dowmloads
    int(4)
    文件下载次数



    create_time
    datetime
    上传日期



    信息附件表



    字段名称
    字段类型(长度)
    字段含义
    备注




    attachment_id
    int
    附件id
    外键


    info_id
    int
    信息id
    外键



    数据字典表



    字段名称
    字段类型(长度)
    字段含义
    备注




    dict_value
    varchar(20)
    字典值
    主键


    dict_name
    varchar(50)
    字典名



    remark
    varchar(200)
    字典备注



    数据字典数据表



    字段名称
    字段类型(长度)
    字段含义
    备注




    id
    int(8)
    数据id
    主键


    dict_value
    varchar(20)
    数据字典
    外键


    dictdata_name
    varchar(50)
    数据名



    dictdata_value
    varchar(20)
    数据值



    is_fixed
    char(1)
    固定标识



    is_cancel
    char(1)
    数据取消标识



    parent_id
    int(8)
    父节点



    日志表



    字段名称
    字段类型(长度)
    字段含义
    备注




    log_id
    int(11)
    日志id
    主键


    operator
    varchar(100)
    操作员



    oper_name
    varchar(100)
    操作名称



    oper_params
    varchar(255)
    操作参数



    oper_result
    varchar(100)
    操作结果



    oper_time
    datetime
    操作时间



    用户组织表



    字段名称
    字段类型(长度)
    字段含义
    备注




    user_id
    int
    用户id
    外键


    origin_id
    int
    组织id
    外键


    create_time
    datetime
    加入时间



    state
    varchar(2)
    状态



    state_time
    datetime
    状态时间



    4 系统详细设计4.1 班级录1.功能实现
    班级录主要实现给用户提供班级空间的功能,班级录总览界面按年级信息统计并展示院校当前班级的信息,按年级、校友姓名、班级专业条件查询班级并且能够在侧边栏按班级人数对班级进行热度排名,展示当前用户加入的班级,最近加入班级录的校友等信息。
    2.实现方法
    点击班级录标签页,请求class.action访问到Class控制器中的index()方法,index()调用ClassService业务逻辑类中的getAll(),查询年级信息,返回List<Grade>类型的数据,添加到视图模型model中。Grade类对象中包含年级、班级个数等信息,index()方法跳转到class-index.jsp页面,展示年纪列表信息,并将年级列表加载到条件查询框中的下拉框中。页面加载时引入javascript,使用$.post()方法请求侧边栏数据。侧边栏数据包括班级录信息统计、班级排名、当前用户加入的班级、最近加入的校友等信息。在条件查询框中选择年级、填入校友姓名或专业关键字可以查询相关班级,提交查询时请求Class控制器中的queryClass()方法,传递grade、queryStr参数。queryClass()调用ClassService()业务逻辑类中的queryClasses()方法,queryClasses()方法的参数为Page<>类型的对象、grade、queryStr,queryClasses()执行查询,并返回 List<Map<String,Object>>类型的数据。类型为Page<>的参数是分页对象,分页对象中包含分页的所有信息,包括页码pageIndex、pageSize、beanList等,新建分页对象时,如果没有设置参数,则pageIndex默认为1,pageSize默认为10。将page对象加入到视图模型model中,queryClass()返回class-query.jsp页面。jsp页面将班级信息列表展示出来,并追加页码执行翻页功能。
    3.界面设计
    班级录总览界面如图4-1所示,总体分为导航栏、年级列表和侧边信息栏。班级查询界面如图4-2所示。

    4.1.1 班级首页1.功能实现
    班级主页主要对班级进行一些简介,并展示班级的一些近期信息,如班级简介、班级最新动态、班级最新照片、班级管理员信息、当前用户信息以及当前用户是否加入班级等。班级简介为班级实体中描述班级的字段,包括班级名称、班级人数、班级简介、班级所属年级。班级最新动态是班级动态按照日期降序排列后,选择最新的几条记录显示。班级最新照片是班级成员上传到班级相册照片,按照上传日期降序排列后选择最新的几张进行展示。班级管理员信息展示管理员的头像、姓名、简介等信息。当前用户信息展示当前用户的头像、姓名、简介、是否加入班级。
    2.实现方法**
    点击班级名称超链接,请求classroom.action,并传入班级id参数,Classroom控制器中index()方法接收参数,调用业务逻辑类ClassService中的classIndex()、classInfo()、classImage()、getAllMemberId()方法。clasIndex()方法查询班级的详细信息,返回Map\<String, Object\>类型的数据,赋值给classroom,将返回数据classroom添加到视图模型model中。classInfo()查询班级的动态消息,动态消息按照日期降序排列,以List\<Map\<String, Object\>>类型返回日期最新的几条记录,赋值给infoList,将infoList添加到视图模型model中。classImage()方法查询班级成员上传的照片,照片按照上传日期降序排列,以List\<Map\<String, Object\>>类型返回上传日期最新的几条记录,赋值给imageList,将imageList添加到视图模型model中。getAllMemberId()查询所有班级成员的id,以List\< Integer>类型返回,赋值给classIds,并将classIds添加到视图模型model中。Classroom控制器方法index()跳转到classroomdex.jsp页面,将classroom、infoList、imageList中的信息遍历展示在jsp页面中,将SESSION_USER环境变量中的当前用户信息展示为当前用户信息,并将SESSION_USER中的userId与classIds中的数据进行比较,如果userId存在与classIds中,则显示用户已经加入班级,否则显示加入班级按钮。Classroom-index.jsp加载的时候引入javascript,使用$.post()方法请求班级官员信息,并返回到jsp页面进行展示。
    3.界面设计
    班级主页界面设计如图4-3所示。

    4.1.2 班级动态班级动态列表1.功能实现
    班级动态列表展示班级成员发布的动态信息,查询以当前班级id和信息类型作为条件查询信息,并进行分页处理,将查询到的信息分页展示。
    2.实现方法
    点击班级动态标签页,请求classroom/info.action,传递参数classId,Classroom控制器中的info()方法接收参数,info()调用ClassService业务逻辑类中的classIndex()、classInfo()方法。clasIndex()方法查询班级的详细信息,返回Map<String, Object>类型的数据,赋值给classroom,将返回数据classroom添加到视图模型model中。classInfo()方法参数为Page<>类型数据、班级id和信息类型(数据字典中的信息类型数据),方法返回List<Map<String,Object>>类型的数据。类型为Page<>的参数是分页对象,分页对象中包含分页的所有信息,包括页码pageIndex、pageSize、beanList等,新建分页对象时,如果没有设置参数,则pageIndex默认为1,pageSize默认为10。将page对象加入到视图模型model中,info()返回classroom-info.jsp页面。jsp页面将班级信息、班级动态信息列表展示出来,并追加页码执行翻页功能。
    3.界面设计
    班级动态列表界面如图4-4所示。

    班级动态详情1.功能实现
    班级动态详情实现动态消息的详情展示,作者信息,消息评论区,以及班级相关动态和作者相关动态。班级动态消息详情包括图文信息、发布时间、浏览量、喜欢数、评论数,消息加载时动态消息的浏览量自增1。作者信息栏展示作者的头像、名字、简介等信息。评论区默认加载10条评论,点击加载更多评论按钮则再次加载10条评论,知道所有评论被加载完毕,用户可以在评论区发表评论。页面加载时,通过ajax方式将班级相关动态和作者相关动态加载到侧边栏。
    2.实现方法
    点击消息详情按钮,请求classroom/infoDetail.action,传递班级id和消息id,Classroom控制器中的infoDetail()方法接收参数,调用ClassroomService业务类中的classInfoDetail()方法查询动态信息详情和作者信息,返回Map<String,Object>类型的数据,赋值给info,将info添加到视图模型model中。infoDetail()返回classroom-info-detail.jsp页面,将info中的信息展示,并引入javascript使用ajax方式加载评论和侧边栏信息。
    3.界面设计
    班级动态信息详情界面和评论区界面如图4-5和图4-6所示。

    4.1.3 班级通讯录1.功能实现
    班级通讯录五章表关联查询班级成员的用户信息、所在地、电话、邮箱、QQ、微信等通讯信息,分页显示,并且支持下载班级通讯录信息,以Excel文件形式下载到本地。
    2.实现方法
    点击通讯录标签页,请求classroom/directory.action,传递参数班级id,Classroom控制器中的directory()方法接收参数,并调用ClassrommService业务类中的classDirector()方法。classDirectory()关联user表、user_origin表、origin表、user_info表、image表,查询用户信息、用户通讯信息,以List<Map<String, Object>>的形式返回通讯录列表,赋值给分页对象page中的beanList,并将page添加到视图模型model中。Directory()方法跳转classroom-directory.jsp页面,将beanList里的通讯录信息遍历出来。
    3.界面设计
    班级通讯录的界面设计如图4-7所示。

    4.1.4 班级相册1.功能实现
    在班级相册中,班级成员可以查看相册、新建相册、上传图片、删除图片、设置相册封面、下载图片。上图图片支持批量上传,相册封面可以选择相册内的任意图片作为封面。
    2.实现方法
    点击班级相册标签页,请求classroom/album.action,传递参数班级id,Classroom控制器中的album()方法接收参数,调用AlbumService业务类中的getAlbums()方法,以List<Album>形式返回相册信息,赋值给分页对象page的beanList属性,返回classroom-album.jsp界面,将相册列表分页显示。
    3.界面设计
    班级相册界面设计如图4-8所示。

    4.2 职业招聘4.2.1 发布招聘1.功能实现
    发布招聘时,系统判断当前用户是否已经登记公司信息,如果没有登记则跳转公司信息登记界面,否则跳转招聘登记界面。在招聘登记界面填写招聘信息后提交审核,后台管理员可以审核、置顶招聘。
    2.实现方法
    点击发布招聘按钮,请求recruit/addRecruit.action,Recruit控制器中的addRecruit()方法接收请求,首先调用UnitService业务类中的getUnitsByUserId()方法查询当前用户的公司信息。如果公司信息,则返回redirect:/unit/addUnit.action,重定向到公司信息登记界面,否则addRecruit()将招聘常量positionSalary、positionBenefit、positionProf添加到视图模型model中,跳转至招聘信息登记界面。招聘信息表单填写完成后,提交至recruit/addRecruitSubmit.action,Recruit控制器调用RecruitService业务类中的createRecruit()方法,保存招聘信息,等待审核。
    3.界面设计
    招聘单位信息登记界面设计如图4-9所示,招聘信息登记界面如图5-10所示。

    4.2.2 查询招聘1.功能实现
    招聘查询可以招聘信息标题、招聘单位名称、职位信息、工作地点等查询招聘信息,并将查询到的记录分页显示。
    2.实现方法
    点击职业招聘按钮,请求recruit.action,传递查询条件queryStr,Recruit控制器中的indexRecruit()方法,调用RecruitService业务类中的queryRecruit()方法执行查询,返回分页对象page,跳转到recruit-index.jsp页面,将招聘信息遍历出来并追加页码,执行翻页功能。
    3.界面设计
    招聘查询界面如图4-11所示。

    4.2.3 招聘详情1.功能实现
    招聘详情展示招聘的详细信息,包括招聘单位信息、职位信息、联系人信息,并且能够加载此招聘信息的申请记录以及本招聘单位的相关招聘信息。
    2.实现方法
    点击招聘信息标题超链接,请求recruit/detailRecruit.action,传递招聘信息id,Recruit控制器中的detailRecruit()方法接收参数,调用RecruitService业务类中的getDetailRecruit()、loadResumesToPost()、postResumeRecord()、loadOtherRecruits()等方法。getDetailRecruit()方法查询招聘的详细信息,返回Map\<String,Object\>类型的数据,并添加到视图模型对象model中。postResumeRecord()方法关联recruit_post表、user表、image表查询出对此招聘信息投递简历的用户列表,返回List\<Map\<String,Object\>>类型的数据,并添加到视图模型对象中。LoadOtherRecruits()方法关联recruit_post表、recruit表,查询出此招聘单位的相关招聘信息,返回List\<Map\<\>>类型的数据,并添加到数图模型对象model中。
    3.界面设计
    招聘查询界面如图4-12所示。

    4.2.4 投递简历1.功能实现
    在简历详情界面中,有简历投递选项,用户选择自己的简历投送至当前招聘信息。如果当前用户没有简历,则可以选择创建简历。
    2.实现方法
    如果用户已经申请当前职位,则显示已申请职位,否则显示申请职位按钮。点击申请职位按钮,页面弹出简历投递模态框,通过c标签将用户简历列表加载到下拉框中,选择一个简历,点击确认申请按钮,请求my/resume/postResume.action,传递招聘信息id,用户简历id,用户信息控制器中的postResume()接收参数,并调用ResumeService服务类中的postResume()方法,保存简历投递信息。
    3.界面设计
    简历投递界面如图4-13所示。

    4.3 校友论坛4.3.1 论坛广场1.功能实现
    论坛广场分页展示校友论坛的所有帖子,可以按照帖子标题、帖子主题和帖子作者进行模糊查询,并按照帖子的热度进行排名。
    2.实现方法
    点击校友论坛,请求forum.action,Forum控制器中的index()方法接收请求,调用PostService中的queryPosts()方法,按日期降序排列并分页查询帖子,返回List<Map<String,Object>>类型的数据,赋值给分页对象page,将page添加到视图模型对象model中。返回forum-index.jsp页面,将page中beanList的帖子信息分页显示。
    3.界面设计
    论坛广场界面设计如图4-14所示。

    4.3.2 发布新帖1.功能实现
    用户可以在校友论坛广场发布新贴,帖子会被推送到广场并可以被搜索。
    2.实现方法
    点击发布新贴按钮,请求post/add.action,Post控制器中的addPost()方法接收请求,将环境变量themeList添加到视图模型对象model中,加载帖子发布界面。在帖子发布界面填写post表单并提交,post信息存储至数据库,重新加载招聘广场即可看到新发布的帖子。
    3.界面设计
    发布新贴界面如图4-15所示。

    4.3.3 帖子详情1.功能实现
    用户可以查看帖子详情,包括帖子内容、浏览量、评论量、喜欢数、作者信息,在帖子内容下方有评论区,加载评论内容或发表评论。在详情界面侧边栏显示相关主题的帖子和作者相关的帖子。
    2.实现方法
    用户点击帖子标题超链接,请求post/detail.action,Post控制器中的detail()方法接收请求,调用PostService业务类中的postDetail()方法查询帖子详情,将返回的数据添加到视图模型对象model中,返回jsp页面显示帖子内容。页面加载完毕后,通过jquery的$.post()方法请求post/commentList.action和post/outLine.action加载评论区内容和侧边栏内容,Post控制器调用PostService业务类中的getOtherPost()f方法和CommentService业务类中的dynamicComment()方法查询信息,将返回的信息追加到页面,完成动态加载评论的功能。
    3.界面设计
    帖子详情界面设计如图4-16所示。

    结论经过持久层、数据访问层、业务逻辑层、系统控制层、视图层的设计和实现,本系统基本实现了对班级管理,用户可以加入自己所在的班级;对班级留言的管理,用户可以在班级里查看、添加或修改留言;对班级通讯录的管理,用户可以查看班级成员的相关信息。系统已经能够实现留言、上传照片、评论等功能,同时具有方便的后台管理功能。同学录系统能够实现同学们生活中的交流,拥有自己的空间。校友论坛为广大校友提供了更加宽阔的平台,促进校友们之间的交流。与此同时,通过职业招聘模块、校园服务模块,校方管理员能够了解毕业生的就业情况,并为毕业生提供就业服务,包括向毕业生投送招聘信息,接收毕业生所在单位的招聘信息。因此,此系统能够在促进高校专业教学改革、募集高校筹资办学途径、促进校企合作、加强毕业生感情交流、提升大学生就业质量等方面带来巨大效益。
    当然,本系统还不够完善,有一部分功能尚未实现。新闻中心应该具备热文推送和邮箱订阅功能,这样才能让校友更好的了解母校的动态消息。 网站内的消息应该支持富文本格式,这样可以使消息更具可读性和吸引力,同时富文本编辑器可以让用户更方便地编写内容。在消息发布和图片上传时,图片经过剪辑之后才可以更好地展示和存储。由于个人能力的限制,网站的邮箱订阅功能、富文本编辑存储功能和图片剪辑功能并没有实现。这些功能对本系统也显得尤为重要,因此以后必须实现。
    经过对校友录系统的设计和实现,我对MVC模式有了更深层次的理解和应用。同时,我也学会许多新的框架和工具,包括SpringMVC、MyBatis、EhCache、Bootstrap、AmazeUI等框架,Maven、Git、IntelliJIDEA等工具。因此,我相信在以后面临的工作和项目中本系统对我有很大帮助。
    致谢本论文的编写和修改是在老师悉心指导下完成的。老师有着严谨有致的教学态度,兢兢业业的工作作风,诲人不倦的高尚师德。在老师的每一堂课上,我都能感受到他的格物致知、敬业乐群,这也正是我在专业知识学习中保持热情的关键所在。在临近毕业的这段时间,老师也依然百忙之中为我讲解技术、指导论文,其崇高的责任心将是我受益一生的宝贵财富。在此,谨向我可敬可爱的老师致以诚挚的谢意。
    不知不觉,四年的大学生活如白驹过隙般逝去,但这宝贵的四年无疑会在而后的回忆里细水长流。在大学四年时间里我有过喜悦,有过沮丧,也学习了很多专业知识,参加了很多活动和比赛,获得了飞思卡尔智能汽车竞赛国赛奖项,电子设计大赛省级奖项。没有志同道合的校友,没有对我谆谆教诲的辅导员,没有对我坚定支持的母校,我不可能取得这些成就,也很难在低谷时战胜困难。因此,我想对帮助我的校友,关爱我的辅导员,坚定支持我的母校致以崇高的谢意。
    同时,我也要感谢生我育我的父母。我的家庭生活并非想象中那么美好,父母的艰辛也许我无法体会,但是即使再困难,父母都会给予我精神、物质上的支持。父母不曾亏待我,我又能拿什么面对父母。唯有不懈的努力,让自己成功的速度快于他们老去的速度,我才能回报他们对我的爱。对于父母所给予我的这一切,我会用生命去珍惜,用感恩去呵护。
    最后,我想再一次向精心教导我的老师,关爱我的辅导员,志同道合的校友,给予我支持的父母表达我的感恩之情,没有你们就没有如今的我,谢谢你们伴我走过青春的这段旅途,谢谢!
    参考文献[1] 盛仲飙 乔道迹.基于Java的通讯软件设计与实现[J].福建电脑,2015
    [2] 陈衍席.基于Java网络聊天系统的设计及实现研究[J].通讯世界,2016
    [3] 钱雪忠著,数据库原理与应用(第二版)[M].北京邮电大学出版社,2007
    [4] 唐汉明 翟振兴关宝军.深入浅出MySQL数据库开发优化与管理维护第2版[M].人民邮电出版社,2014
    [5] 吴海星.Java程序员修炼之道[M].人民邮电出版社,2013
    [6] 缪忠剑.基于Spring的集成化Web开发平台的研究与实现[M].北京机械工业出版社,2013
    [7] 宋佳颖,基于Java的邮件接收系统分析[J].无线互联科技,2015
    [8] 耿祥义,张跃平著.Java设计模式[M].清华大学出版社,2009
    [9] 彭晓青,MVC模式的应用架构系统的研究与实现[J].电子工业出版社,2013
    [10] 赵争东,基于Java的数据库应用框架的研究设计和探索[J].信息系统工程,2015
    [11] 软件开发技术联盟著,Java Web开发实战[M].清华大学出版社,2013
    [12] 贾蓓.镇明敏.杜磊著,Java Web整合开发实战[M].清华大学出版社,2013
    [13] 李运莉著,web数据库应用系统性能优化[M].北京人民邮电出版社,2011
    2 评论 55 下载 2018-09-26 12:21:13 下载需要13点积分
  • 基于Android-JavaEE-DB2实现的旧物交易平台

    摘要随着移动网络的日益进步,手机、平板等移动设备已经在我们日常的生活和学习中占有越来越大的比例。软件是移动设备的重要组成部分,手机软件也从开始的单一功能变得具有多种多样的功能,日益符合人们的生活需要。设计本软件的目的在于迎合消费群体的需求。近几年日益兴起的网络购物逐渐取代实体购物,通过网络平台以物易物成为一种近年来新兴的网络交易方式,其发展呈现出一种久盛不衰的趋势。本项目的设计理念旨在通过网络平台对二手物品的价值进行再一次利用,充分实现其利益的最大化。该软件是基于Android平台研发的,使用Eclipse开发旧物交易平台安卓客户端,并使用Tomcat、借助MyEclipse服务器软件开发JavaEE后台服务器,使用DB2数据库进行数据的存储与管理。
    关键字: Android Eclipse MyEclipse 二手交易
    ABSTRACTWiththe increasing progress of mobile networks, mobile phones, flat and othermobile devices have been in our daily life and learning to occupy an increasingproportion. Software is an important part of mobile devices, mobile phonesoftware from the beginning of a single function has become a variety offunctions, increasingly meet people’s needs. The purpose of this software is tomeet the needs of consumer groups. In recent years, the growing online shoppinggradually replace the physical shopping, through the network platform to barteras a new way of emerging online transactions, its development presents along-standing trend. The design concept of this project aims to make use of thevalue of secondhand items through the network platform, and realize themaximization of its interests. The software is based on the Android platformdevelopment, the use of Eclipse to develop the old transaction platform Andrewsclient, and use Tomcat, with MyEclipse server software development JavaEEbackground server, the use of DB2 database for data storage and management.
    Key words: Android Eclipse MyEclipse Used transactions
    第一章 绪论1.1 系统简介“旧时光”旧物交易平台是一款基于商品信息的共享而促成买方和卖方达成交易的第三方平台。卖方将所交易的物品信息上传在该平台上,买方通过该平台选择自己心仪的商品来购买、取得商品。用户的个人资料和商品的发布信息存储在后台数据库中,在交易过程中进行实时的添加、删除、修改等工作。
    1.2 系统的目的和意义根据市场调研,发现目前人们的日常生活中普遍存在一个问题,即在市场经济的刺激和人们生活水平提高的情况下,家中的闲置物品也日益增多甚至无处摆放,闲置物品的归属问题也成为物品所有者的苦恼。将闲置物品闲放在家中只会增加房间的占有率,使房间的利用率降低,若是将闲置物品遗弃虽然能使家中的空闲空间变大,但是会奢侈浪费。针对这种情况,设计了旧物交易平台这个项目。目的是希望能够通过这个平台将用户家中的闲置物品充分利用起来,使闲置物品能够进行二次销售。充分发挥闲置物品的剩余价值,实现其利益的最大化。
    手机较之电脑等平台在体积上更具便捷性,用户使用操作的性价比较高,在该平台中用户可以自主选择自己喜欢的商品加入到购物车中以待最终的购买,再通过查看卖家的详细信息与卖家进行私下交流协商,省去了中间商来赚取差价。同时平台中的卖方和买方没有明显的界限,可以同时既是一件商品的卖方,又是另一件商品的买方,有利于用户充分了解双方的运营模式,能够双方平等公开地进行交易。
    1.3 本文工作及组织结构本人的主要任务是实现“旧物交易平台”APP中的用户管理模块和商品显示模块。用户管理模块主要包括用户注册、用户登录和用户信息管理方面。商品显示模块包括主界面的商品显示,推荐商品的显示和搜索功能的搜索结果显示。
    本文一共包含三个部分,第一、二章节是第一部分,第一章主要介绍了系统的主要功能以及系统的目的和意义;第二章主要介绍了开发此软件用到的环境Eclipse、MyEclipse,此外还介绍了后台用到的DB2数据库和对应的JSON数据类型。第三、四章是第二部分,第三章是系统设计,主要是根据系统的需求分析设计出系统的总体功能;第四章是系统的详细设计,也是本人完成的主要内容,这部分实现了用户模块的两大功能:登录和注册、商品的搜索和推荐以及程序的初始化和下拉刷新,为了更符合用户的使用还对页面内容进行了布局,此外还实现了对上拉加载和下拉刷新功能的测试。第五、六章节是第三部分,第五章是系统测试,主要是对第四章实现的功能进行测试,提高软件的健壮性。第六章是论文总结和展望,主要总结了一些本文的工作并根据目前的实现情况提出了本文的不足。
    第二章 开发技术及设计方案2.1 开发技术2.1.1 EclipseEclipse开发环境有一个最大的优势就是它不用受到平台的限制,针对所使用的代码语言不同的情况下只需在其中安装相对应的插件即可,这种特殊的插件形式使得其比其他软件更具灵活性,Eclipse的插件机制能够允许将外界的扩充添加到现有的程序中。Eclipse除了可以当成Java集成开发环境,还包含着插件开发环境,使用Eclipse开发的Android平台是比较成熟的,无论是在开发环境还是代码的实际运用都是比较适合程序员编写的[1]。
    2.1.2 MyEclipseMyEclipse是以Eclipse为基础,但在其插件和功能上又拥有自己独特变化的工作平台,通过它有利于对服务器、数据库和JavaEE等进行整体结合。将MyEclipse单单从结构上进行划分就可以划分为多种类别,每种类别可以通过一系列的插件来实现类别想要实现的功能,它能够支持对代码进行编写、调试、配置、测试等功能操作[2]。
    2.1.3 DB2数据库DB2数据库是一个用来处理大型数据的关系型数据库,它的扩展版可以使同一类型的数个不同的计算机对一个数据库中的信息资源实现共享,大大提高了单个数据库的储存和应用范围。它允许多个用户基于同一条查询语句查询到不同的数据库甚至不同的数据库管理系统的数据。在本项目设计中,是通过JDBC将DB2数据库和服务器连接到一起,以满足设计的需求。IBM Data Studio是针对应用数据库进行开发的重要工具,它在管理数据库和优化数据查询方面都有比较好的优势,而且它还支持多种数据库的应用。它在整合之前,是通过不同的程序来实现功能,但在整合之后可以减少各种程序之间的来回切换,使软件的应用更加的简便快捷。Data Studio提供Java和数据透视功能,当用户打开一个透视时,与其相关联的视图就会相应的显示出来[4]。
    2.1.4 JSON数据类型JSON是用于JavaScript脚本设计的对象标记语言。它的层次结构简单明了,便于编程人员的编写和阅读。JSON数据类型与XML的区别主要是JSON拥有更好的扩展性,虽然XML自身的扩展性也很好,但JSON的范围要更广一些,并且它可以存储JAVA脚本的复合对象。JSON格式简单,易于读写解析,能够使服务器端和客户端之间的代码量大量减少,对于日后的维护也更为方便[5]。
    2.2 设计方案本次的项目采用的是MVC模式,分别是模型、视图和控制器,模型和视图的分离使得一个程序可以有数个表现方式,控制器可以保证视图能够在模型发生改变的前提下发生相应的改变。运用MVC模式进行分组开发有利于对复杂的程序进行管理。本次的项目与其相对应的分别是Java代码、layout布局文件和AndroidMinifest.xml[6][7]。
    本次是采取将Struts、Spring和Hibernate这3个框架相互结合互相渗透的方式来开发这个网络平台交易系统。其中在Struts表示层和Spring业务层之间通过服务获取器将其两者相互连接,在Spring业务层和Hibernate持久层是通过DAO类来进行连接。这种方法也简称为SSH模式。
    第三章 系统设计3.1 导言在网络信息技术飞速发展的前提之下,其研究方向逐渐渗透在人们日常生活中各个领域,消费群体也深入扩展到大多数人。所以,作为技术的研发者需要以满足绝大多数消费者的需求为设计目的,制作出能为消费者带来便利、丰富消费者日常生活的技术软件。近年来随着网络购物的兴起,人们也欣喜地感受到网络购物的方便。针对这一现象,本次设计旨在传统网络购物的基础上对闲置的二手物品进行交易。使卖方充分发挥闲置物品的价值,买方能够以较低的价格买入自己较为心仪的物品,使买方和卖方的利益都能够得到满足[8]。
    3.2 项目需求分析该项目所要求达到的具体功能:
    1.从用户角度出发,在该交易平台中用户作为主体最重要的前提是注册和登录个人账户,在此基础上查看商品、浏览平台所发布的所有信息,用户的用例图如图3-1所示。

    2.从买家的角度出发,买家主要可以利用该平台搜索商品、查看商品、将商品加入购物车和联系卖家,从最初的查找商品到最后的交易成功都可以通过该平台来实现,详细的买家用例图如图3-2所示。

    3.从卖家的角度出发,卖家可以发布、修改、删除商品并且查看自己发布的商品,该平台充分尊重用户自主性原则,允许用户在不损害他人利益的前提下对商品的管理能够自由支配,卖家的用例图如图3-3所示。

    4.从平台管理者的角度出发,它可以查找、修改、删除后台数据和普通用户信息,平台管理者是在整个平台的运作过程中起到一个保护和维持的作用,它可以强制性地对某些信息进行处理,详细的平台管理用例图如图3-4所示。

    3.3 项目总体设计3.3.1 系统结构图在做项目设计时,通常习惯先对项目进行基础的解析,设计基本的框架结构,然后在框架结构中填充各个功能模块,如图3-5。

    设计时项目组经过市场的调研和产品功能的具体分析,对项目所要满足的功能有一个概念性的总结,系统基本功能需求图如图3-6到图3-9所示。














    3.3.2 Fragment在实际运用中经常把Fragment当成Activity中的一个组成部分,甚至一个Activity界面可以由多个互不相同的Fragment组成,并且它们之间不会相互抵触。Fragment可以使一个App不需要因为一个移动终端大小的改变而进行布局的修改,使App能够同时适应不同尺寸的移动终端。Fragment也拥有属于自己的生命周期和接收处理用户事件的能力,这样就无需在Activity的框架中写一系列关于控件处理的代码,并且可以动态的增加、修改和删除某个具体的Fragment,Fragment是随着Activity的存在而存在的, Fragment的生命周期在一定程度上需要依存于Activity。在Activity的布局文件中对Fragment进行声明,所有控件的事件处理都有各自相对应的Fragment并依赖着它们去进行相应功能的实现,大大提高了代码的可读性、复用性和可维护性[9]。
    3.3.3 自定义Item的ListViewListView可以通过重写Adapter适配器简单实现一些效果:例如分组,类似在通讯录中按照姓氏的第一个字母进行分组的功能;在Item中放图片,按钮等其他组合控件等。构造每一个ListView都要有一个Adapter来将数据和显示进行连接。
    3.3.4 Action类Action类是Structs 2的核心,编写Action类是使用Structs 2框架的主要编码工作。每个Action类都与其相应的请求命令相对应,通过Action中具体的执行函数execute()来实现对传输的数据进行相应的处理[10]。
    3.3.5 数据库架构在DB2的数据库架构中,每个数据库包含着多个表空间,每个表空间中可以储存多张表,每张表中记录了相应的信息,通过各种关系运算符在各个表之间建立对应的关系。针对本次项目设计的数据库而言,建立了一个名为OldTime的数据库,在整个数据库中分别包含了用户表(TABLE_USER)、商品表(TABLE_COMMODITY)、推荐表(TABLE_RECOMMODITY)、购物车表(TABLE_SHOPPINGCAR)、发布表(TABLE_FABU),设置了相应的数据类型和约束对表格数据进行相应的限制,使其在功能上能满足商品交换的基本需求[11],数据库中各表结构分别如表3-1至3-5所示。
    用户表



    字段
    数据类型
    允许空
    备注




    USER_ID
    Int

    用户标识,主键,自增长


    USER_NAME
    Varchar

    用户名


    PASSWORD
    Varchar

    密码


    USER_IMG
    Varchar

    用户头像



    商品表



    字段
    数据类型
    允许空
    备注




    COMMODITY_ID
    Int

    商品标识,主键,自增长


    USER_NAME
    Varchar

    商品名称


    COMMODITY_TITLE
    Varchar

    商品标题


    COMMODITY_DETAIL
    Varchar

    商品详情


    COMMODITY_PICTURE1_ID
    Varchar

    商品图片


    COMMODITY_PICTURE2_ID
    Varchar

    商品图片


    COMMODITY_PICTURE3_ID
    Varchar

    商品图片


    COMMODITY_PICTURE4_ID
    Varchar

    商品图片


    COMMODITY_PICTURE5_ID
    Varchar

    商品图片



    推荐表



    字段
    数据类型
    允许空
    备注




    COMMODITY_ID
    Int

    标识,主键,自增长


    COMMODITY_TITLE
    Varchar

    商品标题


    COMMODITY_IMAGE_ID
    Varchar

    商品图片



    购物车表



    字段
    数据类型
    允许空
    备注




    USER_NAME
    Varchar

    用户名


    COMMODITY_ID
    Int

    商品序号



    发布表



    字段
    数据类型
    允许空
    备注




    USER_NAME
    Varchar

    用户名


    COMMODITY_ID
    Int

    商品序号



    第四章 系统详细设计该项目中本人所研究的内容主要是该平台的用户管理模块和商品展示模块。用户管理模块主要包括用户注册、用户登录和用户信息管理方面。商品展示模块包括主界面的商品显示,推荐商品的显示和搜索功能的搜索结果显示。
    4.1 用户管理4.1.1 用户注册用户通过注册模块输入用户名、手机号、密码,并将这些资料上传到服务器保存,对用户注册的界面进行页面布局设计,用户在注册时用户名、密码和确认密码必须要填写,如图4-1所示,注册代码如下图所示:
    if("".equals(user_name)) {//判断用户名是否为空,若为空则Toast,不为空则判断密码 Toast.makeText(RegisterActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();}//password_sure不需要判断是否为空,因为空值肯定与password不相同。if(password.equals("")){//判断密码是否为空,若为空则Toast,不为空则判断两次输入的密码是否一致。 Toast.makeText(getApplicationContext(), "密码不能为空", Toast.LENGTH_SHORT).show();}else if(!password.equals(password_sure)){//若两次密码一致则向服务器发送注册请求。 Toast.makeText(getApplicationContext(), "两次输入的密码不一致", Toast.LENGTH_SHORT).show();}
    在用户按照提示将注册信息填写完毕后,将填写的用户号通过服务器与数据库中已存取的用户号进行对比。若新填写的用户号与数据库中原有的用户号相同,则返回该用户号已被使用的信息;若无相同,则把新注册的用户号和密码等添加到数据库中,成功注册之后会在数据库添加一条字段并将结果返回。
    注册的客户端代码如下:
    String result = EntityUtils.toString(httpResponse.getEntity());//将从服务器返回的结果放到String数据中。if(result.equals("1")){//如果结果是1,则表示成功注册 Toast.makeText(RegisterActivity.this, "注册成功,请登录", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(RegisterActivity.this,LoginActivity.class);//成功注册后自动跳转到登录Activity。 startActivity(intent);}else{//如果返回结果不为1显示用户名被使用 Toast.makeText(RegisterActivity.this, "用户名已被使用", Toast.LENGTH_SHORT).show();}
    注册的服务器端代码如下:
    Session session = HibernateSessionFactory.getSession();//创建session Transaction ts = session.beginTransaction();//创建Transaction TableUser tableUser = new TableUser();//创建POJO类对象/*判断客户端发来的信息是否正确*/ if(userName.equals("")){ System.out.println("用户名不能为空!"); return null; }else if(password.equals("")){ System.out.println("密码不能为空!"); return null; }else{//创建query,并通过query创建一个hql语句 Query query = session.createQuery("from TableUser where userName=?"); query.setString(0, userName); List list = query.list();//将hql查询出的结果放到TableUser对象中 if(list.size()==0){ tableUser.setUserName(userName); tableUser.setPassword(password); session.save(tableUser); ts.commit();//提交Transaction return tableUser; }else{//如果用户名在数据库中已经有了 System.out.println("用户名已被使用"); return null; } }

    4.1.2 用户登录用户通过登录模块进入平台,本平台的商品发布和购物车等功能必须登录之后才能使用,在对用户登录界面进行设计时,首先要通过判断语句来保证用户的用户名和密码不能为空。在用户名和密码符合条件的情况下,客户端向服务器发出请求,并进行是否超时的检测。服务器收到请求后执行相应的Action,将对数据库中数据的处理结果返回给客户端,若用户登录的信息与数据库中储存的用户信息相同,则注明登录成功,并将结果返回至客户端,反之则为失败。若未能正常连接服务器,就会返回“没有获取到Android服务器端的响应!”的提示语,登录时3个主要界面如图4-3至图4-5所示。
    登录的客户端代码如下:
    public void run() { Looper.prepare();//启用轮询 HttpPost httpRequest = new HttpPost(getResources().getString(R.string.url_web)+"/login.action");//action的地址 //创建一个NameValuePair的List并将用户名和密码保存到该List中 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username", username)); params.add(new BasicNameValuePair("password", password)); try { httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//设置请求参数项 HttpClient httpClient = new DefaultHttpClient();//设置超时检测超过2000毫秒即为超时。 httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000); HttpResponse httpResponse = httpClient.execute(httpRequest);//执行请求返回响应 System.out.println(httpResponse.getStatusLine().getStatusCode()); if(httpResponse.getStatusLine().getStatusCode() == 200){//判断是否请求成功 String result = EntityUtils.toString(httpResponse.getEntity()); if("1".equals(result)){//判断返回结果是否为1,是则登录成功。并跳转到MainActivity Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); //跳转到MainActivity并将用户名、密码和登录结果传到MainActivity中 Intent intent = new Intent(LoginActivity.this,MainActivity.class); intent.putExtra("username", username); intent.putExtra("password", password); intent.putExtra("fragment_id",1); intent.putExtra("activityName", "loginActivity"); R.layout.fragment_personal_center_logined); finish(); startActivity(intent); }else{//如果返回结果不是1,则登录失败 Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show(); } Toast.makeText(LoginActivity.this, result, Toast.LENGTH_LONG).show(); }else{//如果连接服务器的连接码是200,则服务器故障 Toast.makeText(LoginActivity.this, "没有获取到Android服务器端的响应!", Toast.LENGTH_LONG).show(); }}
    登录的服务器端代码如下:
    try{ Query query = session.createQuery("from TableUser where userName=? and password=?"); //创建query,并通过query新建一条hql语句,查询数据库中是否相应的数据。 query.setParameter(0, username); query.setParameter(1, password); query.setMaxResults(1);//设置最大结果为1 TableUser tableUser = (TableUser) query.uniqueResult();//将查询出的结果存放到POJO类对象tableUser中 if(tableUser!=null){ return tableUser; }else{ System.out.println("用户名或密码错误,请重试"); return null; } }catch(Exception e){ e.printStackTrace(); return null;}

    4.1.3 用户信息管理用户登录之后可以查看、修改自己的用户信息,当打开该软件时,点击主页面上的“个人中心”标签,会提示用户进行注册或者登陆。当新用户点击注册并对基本信息进行填写完毕后提交,数据就会通过服务器传送到数据库,数据库对新增的数据进行进行插入,增添新的字段来存储。对于老用户可以直接进行登录进入个人的信息管理界面,上面记载了用户的基本信息和发布的商品等,用户可以在此界面查询基本信息并对其进行修改,如图4-6所示,用户信息管理代码如下:
    personalCenter_logined_root_view= inflater.inflate(R.layout.fragment_personal_center_logined, container,false);//登录成功之后则用户中心对应的Fragment显示tv_username=(TextView) personalCenter_logined_root_view.findViewById(R.id.tv_user);tvw_set =(TextView)personalCenter_logined_root_view.findViewById(R.id.tv_settle);tvw_per =(TextView)personalCenter_logined_root_view.findViewById(R.id.tv_edit);btn_exit =(Button)personalCenter_logined_root_view.findViewById(R.id.bt_exit);tv_public = (TextView) personalCenter_logined_root_view.findViewById(R.id.tv_public);

    4.2 商品展示4.2.1 商品的搜索用户可以搜索自己想要查看的商品,用户在客户端中输入要搜索的商品信息后,所输入的信息通常是关键字,如商品的名称、标题等,系统会向服务器端创建连接并向其发出请求。服务器端在接受该请求的内容后会对数据库中的数据进行处理,主要是通过模糊查询,对数据进行顺序检索,当发现有与关键字相符的数据时,对该条数据进行提取,将所有提取出的数据放置在容器中,将其返回给客户端。搜索的商品的名称、图片和内容将在ListView中进行显示,如图4-7。
    客户端中的商品搜索代码如下:
    //连接服务器并获取列表数据new Thread(new Runnable() {@SuppressWarnings("deprecation")public void run() { Looper.prepare(); HttpClient httpClient = new DefaultHttpClient(); try {//连接服务器并将request发送到服务器,将返回结果在客户端接收。 HttpPost httpRequest; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("searchCommodity", searchText)); httpRequest = new HttpPost(url+"/search.action"); httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); HttpResponse httpResponse; httpResponse = httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode() == 200){ HttpEntity entity = httpResponse.getEntity(); if(entity!=null){ String out = EntityUtils.toString(entity,"utf-8"); System.out.println(out); JsonUtils(out); for(int i=1;i<= tv_search_list_image.size();i++){ bm_search_list_image.add(getUrlImage(url+"/"+tv_search_list_image.get(i-1))); } ArrayList list = new ArrayList(); //这个list用于在bundle中传递需要传递的ArrayList<Object> /*将几个list添加到同一个List中,用以发送到主线程*/ list.add(bm_search_list_image); list.add(tv_search_list_title); list.add(tv_search_list_content); //通过过message将存放有list的bundle发送 Message message = new Message(); Bundle bundle = new Bundle(); bundle.putParcelableArrayList("list",list); message.setData(bundle); handler.sendMessage(message); } } }}}
    服务器端中的商品搜索代码如下:
    Session session = org.util.HibernateSessionFactory.getSession();//创建session Transaction ts = session.beginTransaction();//创建Transaction List queryList = session.createQuery("from TableCommodity where commodityTitle like '"+commodityTitle+"'").list();//创建hql语句查询数据库,并将结果存放在一个List中 ts.commit();//提交 return queryList;

    4.2.2 商品的推荐本平台随机向用户推荐一些商品,设置按钮监听事件,当用户单击“推荐”标签时向服务器发出获取平台向用户推荐的商品信息的请求。服务器根据请求将数据库中已经存储好的推荐信息取出,并放到JSON中,并将该JSON统一发送给客户端,在客户端解析JSON 将解析出来的数据放在几个ArrayList中。如图4-8。在显示页面中设置下拉加载功能,使其能观看到所有的推荐信息。若数据在数据库、服务器和客户端的传递一切顺利且加载功能正常运行,则成功时会弹出“已经全部加载完成”的提示语。连接服务器获取数据的代码如下:
    public void run() { Looper.prepare(); HttpClient httpClient = new DefaultHttpClient(); HttpPost httpRequest; try { httpRequest = new HttpPost(url+"/show.action"); List<NameValuePair> send = new ArrayList<NameValuePair>(); send.add(new BasicNameValuePair("timer", timer+"")); httpRequest.setEntity(new UrlEncodedFormEntity(send, HTTP.UTF_8)); HttpResponse httpResponse; httpResponse = httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode() == 200){ HttpEntity entity = httpResponse.getEntity(); if(entity!=null){ String out = EntityUtils.toString(entity,"utf-8"); if ("".equals(out)) {Toast.makeText(getActivity(), "已经全部加载完成", Toast.LENGTH_SHORT).show(); } onStop(); JsonUtils(out); for(int i=1;i<= tv_recommend_list_image.size();i++){bm_recommend_list_image.add(getUrlImage(url+"/"+tv_recommend_list_image.get(i-1))); } ArrayList list = new ArrayList(); //这个list用于在budnle中传递 需要传递的ArrayList<Object> list.add(bm_recommend_list_image); list.add(tv_recommend_list_title); list.add(tv_recommend_list_content); Message message = new Message(); Bundle bundle = new Bundle(); bundle.putParcelableArrayList("list",list); message.setData(bundle); handler.sendMessage(message); } } }}

    4.3 页面布局设计对于二手交易平台而言,用户最直观感受到的就是每个页面的具体布局。页面整体的结构、每个模块的大小比例、颜色的具体搭配等都是关系到这个页面能否吸引人的眼球,能否引起人们进行购物的欲望。所以对各种按钮、文字和图片等的具体搭配设计是软件被公众采纳的一个至关重要的因素。在对客户端的各种具体页面进行设计时主要是参考Google官方发布的Metrial Design,结合项目特点,对相对布局、绝对布局还有线性布局的系统组合,再把各种具体的控件穿插在整体的布局中。运用各种控件如Button、TextView、EditText、ImageView等进行组合实现具体的功能,各种位置的设计和功能交相呼应,使用户在使用这个平台时有种赏心悦目的效果。为了实现刷新及加载功能,在界面显示上还使用了第三方库PullToRefresh库中的PullToRefreshListView组件进行列表的显示。
    4.4 程序启动与退出设计4.4.1 程序的启动界面当用户点击手机主界面上本应用的图标时,整个程序开始进入Launcher界面。在这个页面中上方有应用平台的名称,右上角有一个“跳过”按钮,当点击此按钮时通过OnClick触发事件监听功能,直接通过timer.cancel()取消时间进程,直接跳入到主页面中。如果不点击“跳过”按钮,会有3秒钟的时间进程,3秒过后也会自动跳入到主页面。主要是运用TimerTask实现。在这个页面中间的绝大部分位置放置的是一张图片,目的是为了日后本开发软件推广后能吸引广告商家借助本平台进行宣传,从而提高本开发平台的商业价值,如图4-9。
    button.setOnClickListener(new OnClickListener() {//点击跳过按钮,出发点击事件的监听 public void onClick(View v) { timer.cancel();//取消时间进程,直接跳转到MainActivity startActivity(intent); } }); final TimerTask timerTask = new TimerTask() {//时间进程 @Override public void run() { startActivity(intent);//启动MainActivity } };

    4.4.2 程序的退出有了程序的启动自然少不了程序的终止,通过代码进行设置。两次点击返回键时将会退出程序,此次设计主要是防止不小心碰触返回键时,若点击一次就完全的退出程序,当用户误点时还需重新启动程序,即使初始化页面中有跳过按钮但这个过程仍然会使不少用户丧失耐心,不利于该程序的长期使用和发展,而且用户还需要从头重新查找商品。所以我们设计当用户返回至主页面时,当用户两秒内按下第二次返回键时,会通过Toast.makeText弹出“再按一次退出程序”的提示框来提醒用户,如图4-23,这样就会给用户发出预告退出的信号,再按一次返回键就直接通过代码 System.exit(0)退出程序,会大大地减轻用户错误退出程序的现象,使该程序更为地人性化和合理化,具体的程序退出代码如下:
    //返回键点击事件,两次点击退出程序public boolean onKeyDown(int KeyCode,KeyEvent event){//监听实体按键点击事件 if(KeyCode==KeyEvent.KEYCODE_BACK){//按键代码是返回键 exit();//执行exit方法判断是否是第二次点击 return false; } else{ return super.onKeyDown(KeyCode, event); }}//返回键点击后执行的方法public void exit(){ if (!isExit) {//若是第一次点击则将isExit设置为true,并提示用户预告退出。 isExit = true; Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); mHandler.sendEmptyMessageDelayed(0, 2000);//设置handler以确定2秒之内点击两次返回键才会退出。 } else { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); System.exit(0); } }

    4.5 上拉加载和下拉刷新设计像二手商品交易平台这种软件商品的信息时时刻刻都处在动态的变换之中,就少不了在显示商品时对商品进行刷新功能,这样可以防止商品信息的滞后性对买家和卖家所造成的损失。当需要对商品的显示列表进行刷新时,只需到商品栏的最上面将整个商品的显示栏下拉即可,会显示一个正在转动圆圈,在旁边注明正在刷新的提示语。当用户在依列表顺序查看商品时,观看到页面显示的最后一个时可以上拉整个商品的显示列表,与刷新类似,旁边的提示语变成了正在加载,如图4-11所示。其中在制作拉动时的显示方面主要是通过调用getLoadingLayoutProxy方法来实现的,在显示列表时不是直接将数据放到ArrayList中,这种方式复杂度较大并且不能放置多个种类的数据。所以我们采取将数据放置到一个新建的Adapter类中,这样减少了复杂度又可将其放到一个View中。两者都是将当前的最完整的信息提供给消费者,都是具有实时性的功能设计,加载刷新代码如下:
    lv_main_detail.setMode(Mode.BOTH);//设置上拉加载和下拉刷新 //设置拉动时的显示 lv_main_detail.getLoadingLayoutProxy(false, true).setPullLabel(getResources().getString(R.string.shanglajiazai));//下拉时的显示 lv_main_detail.getLoadingLayoutProxy(false, true).setRefreshingLabel(getResources().getString(R.string.zhengzaijiazai));//正在刷新时的显示 lv_main_detail.getLoadingLayoutProxy(false, true).setReleaseLabel(getResources().getString(R.string.songkaijiazai));//刷新完成时的显示 lv_main_detail.getLoadingLayoutProxy(true, false).setPullLabel(getResources().getString(R.string.xialashuaxin));//上拉时的显示 lv_main_detail.getLoadingLayoutProxy(true, false).setRefreshingLabel(getResources().getString(R.string.zhengzaishuaxin));//正在加载时的显示 lv_main_detail.getLoadingLayoutProxy(true, false).setReleaseLabel(getResources().getString(R.string.songkaishuaxin));//加载完成时的显示

    第五章 系统测试5.1 用户注册测试在新用户进行注册时,输入特定的临界值,观察程序是否能够正常运行,在输入用户名时输入一个已经被注册的用户名,观察程序能否正常显示“用户名已被注册”,在输入密码时需要两次确认密码的正确输入,当第二次输入密码与第一次密码不一致时,系统显示“两次输入的密码不一致”,在输入获取的验证码时,若输入的不正确则显示“验证码不正确”,注册界面测试结果如图5-1所示。














    5.2 程序启动测试当打开该应用程序的图标进入程序的启动页面,会在该界面有3秒钟的程序延时,当然用户也可以通过点击右上角的“跳过”按钮直接跳过初始化界面进入该软件平台,初始化界面如图5-2所示。

    5.3 用户的退出测试当用户返回到程序的商品显示的主页面时,若再按一下返回键时,由于这已经是程序的最初界面,无法再返回到其他界面时,程序会默认用户想要退出该应用软件,会显示“再按一下退出程序”,用户再按一下退出,测试过程如图5-3所示。

    5.4 商品的加载刷新测试在商品的显示界面中,最新发布一个商品信息,但在主页的商品列表中并没有发现此条发布信息,通过下拉刷新的方式,可以发现在商品列表中显示刚刚发布的此条消息,当搜索推荐商品时,会发现推荐的商品种类并不多,通过上拉加载的方式,可以加载出更多的商品,加载前后的商品显示界面如图5-4所示。

    5.5 商品搜索测试模拟用户在搜索框中输入想要查找的商品的关键字时,系统会根据关键字的需要对全部商品逐条进行筛选 ,筛选出符合要求的商品来进行显示,具体的搜索框如图5-5所示。

    5.6 个人中心测试用户在尚未登录的情况下进入的个人中心界面如图5-6的(a)图所示,用户通过注册或登录进入个人中心后其显示界面如图5-6中的(b)图所示,上面记载着用户名,该用户发布的商品、买到的和卖出的商品,并允许用户编辑和分享信息,同时也支持该用户退出当前账号。

    第六章 设计总结6.1 设计总结经过这段时间的学习和实践,本人对Android设计和整体代码架构有了更深层次的认识,将理论运用到实践是作为一名编程人员基本的素养。纸上得来终觉浅,觉知此事要躬行。理论知识只是一种知识储备,它是一个项目完成的基础,在运用到具体实践过程中会出现一些理论上没有直接点明的问题。在设计的过程中也学习掌握了许多技术性的知识,学会了使用JSON数据类型来实现数据交换,运用Http库中的Response和Request两个方法在客户端和服务器之间请求和响应,并通过PrintWriter传递数据[14],Fragment的使用交互和集成,每个Action类中的execute方法对数据的处理[15]。同时编写程序需要程序员有严谨的思维和发达的逻辑能力,在具体程序的嵌套和调用过程中,环环相扣,一次思维的偏差都不可能导致结果的出现,需要编程人员事先在脑中形成清晰的框架,这样在具体实施过程中才能做到心中有数,按部就班。在编写程序的过程中,也需要编程人员有足够的耐心和细心,一个逻辑符号的错误都可能导致程序向不同的方向发展,而错误问题的寻找是解决问题的关键,要求对程序的设计有清楚地了解,对找出错误的出处有足够的耐心,进而才能解决问题得到想要的结果。
    6.2 展望在该平台的页面设计的美化方面还存在欠缺,需要专门的美工人员来进一步优化。在数据量方面由于工作量过于庞大,所以在测试时只是简单的输入几条有代表性的数据,当真正投入到市场之后随着用户的不断增加,发布的商品数也不断增加,用户表和商品表的数据量过大可能会引起客户端和服务器速度的限制。
    谢 辞时光飞逝,转眼间已经到了即将离开校园的时候,回想刚来到大学校门时的青涩懵懂,现如今已成熟不少,在这里成长了四年,也蜕变了四年。校园里的每个角落都留下当初走过的痕迹,也记载着大家的成功和失败。欧阳修说过“古之学者必严其师,师严然后道尊。”老师不仅传授大家学业上的知识,还为大家解答生活上的疑惑,充当传道、授业、解惑的角色。在这四年的成长经历中给予了不少的帮助。
    本次的毕业设计是在老师的带领下完成的,老师在学术问题上一向是事事巨细,一丝不苟。在老师的指导下发现自己在之前的学习过程中有许多细节方面的疏忽,这些都可能导致在实际的编写程序过程中引起逻辑的混乱,导致程序编写的失败。老师的教诲绝不仅限于此,举一反三,未雨绸缪,在日后的实际运用过程中会产生深远的影响。当时在确定老师为指导老师时深感荣幸,从毕业设计开始到最终的定稿,老师总是不遗余力地定期进行指导,询问进度和进程中可能出现的问题,耐心地进行解释,发现问题,提出建议,使得问题能够及时发现及时解决。在此由衷的感谢老师的付出,项目的最终完成您有着不可磨灭的功劳。
    在项目的具体制作过程中,当程序编写遇到瓶颈期停滞不前时,同学、朋友、家人也给予了不少的鼓励与建议,在遇到问题的时候不要打退堂鼓,要勇往直前解决问题。谢谢你们的关心和帮助。
    在这次毕业设计的过程中,我学会了很多,明白了很多,也收获了很多。谢谢这一路陪着一起走过的人,你们的批评和鼓励是我前进的动力,因为有你们,将不畏前路的荆棘与坎坷,带着你们的建议与期许描绘出更精彩的人生!
    参考文献[1] 来源:百度百科(链接:http://baike.baidu.com/link?url=dEsap-DsPoXiOf3zNnmePV3ZxX92qxR_RevTHJ0ARO5OtvmAGo3AREFBweh9j1iAY_6qeZdVxcqISmhMqnqEuK)
    [2] 来源:百度百科(链接:http://baike.baidu.com/link?url=WAeoLfon6b4jSDNavglMfQJphDDRbfbs9OCGyxpGFsbf2gC5OleSm_QgsZpPlTcysJdwp-W8TrMs8mPATqYDwl-7pGvqef5Qbx3QhS4-6qi)
    [3] 来源:百度百科(链接:http://baike.baidu.com/link?url=QqYR2nEKaMusm6BvnbJKmGuC9fyo4mtctdjORF09E4nLgCeMCGjBwiJkd3P117AAKqElgQ1xOVXXis4ySD-e2L9s3WHHOQC_9bAxQFRJC5Ti7k7KTMCen-46OLq00tkd61QPIqaen4Nh8WHF1Fnwx
    [4] 来源:互动百科 (链接: http://www.baike.com/wiki/DB2%E6%95%B0%E6%8D%AE%E5%BA%93
    [5] 来源:博客频道 -CSDN.NET(链接: http://blog.csdn.net/tangtiantian520/article/details/50945582
    [6] 来源:百度百科(链接:http://baike.baidu.com/link?url=LHtyOBX-CoB_yfFjjhKN8u11RBViU_AqhdzOXvjhQUN4jPZJWpPr8XMRfYdaXkXTeQhAb3xAmR3GPtcK-2iEHYg4a4cl3KS2iWW_1JC3Vb3)
    [7] 郑阿奇.JavaEE教程[M].北京:清华大学出版社,2012:134-281.
    [8] 王端义. 基于商脉的B2B电商系统Android客户端的设计与实现——基础功能模块和商脉拓展模块的设计与实现[D]. 东南大学, 2015.
    [9] 邓丽.企业级数据库基础——DB2[M].大连:东软电子出版社,2013:112-132.
    [10] 郑阿奇.JavaEE教程[M].北京:清华大学出版社,2012:134-281.
    [11] 来源:博客(链接:http://blog.itpub.net/11325862/viewspace-1263476)
    [12] 李宁. Android应用开发实战[M].北京: 机械工业出版社, 2013:28-34.
    [13] 邵雨舟,贾岚,刘力强. Android移动互联网的开发[M]. 北京:北京邮电大学出版社, 2016:118-136.
    [14] 李冉. 安卓客户端与WEB服务器数据传输方案的实现[J]. 湖北工程学院学报, 2016, 36(3):34-37.
    [15] 田柏玉, 庄海涛, 钱旭. 高校网上跳蚤市场Android客户端设计与实现[J]. 计算机科学, 2016, 43(S2):572-574.
    2 评论 21 下载 2018-09-26 09:16:18 下载需要6点积分
  • 基于C#的简单计算器

    一、实验要求与学习目标1.1 实验要求
    参照Windows提供的计算器工具,设计一个与之类似的程序
    基本要求:实现“普通运算”功能,支持连续运算,如连续输入“2+3×5”后点击“等号”按钮进行运算其结果为25.
    附加要求

    支持“科学运算”功能,即输入表达式时遵循运算符号的优先原则,连续输入“2+3×5”后点击“等号”按钮进行运算其结果为17;支持数字键盘(小键盘)输入功能(焦点不在文本框内时也支持键盘输入);

    1.2 学习目标:
    熟悉.NET的编程方法,掌握项目的创建与使用及安装
    熟悉C#编程语言,字符串使用、自定义类、自定义类库等
    熟悉Windows应用程序类编程、事件驱动编程

    二、设计思路在项目中设计两个个计算类CCalculator.cs 和 SCalculator.cs,分别包含“普通计算”和“科学计算”功能,即根据输入数学运算表达式字符串,返回计算结果。直接在项目中调用该类,输出计算结果。
    三、程序运行效果普通运算模式

    科学运算模式

    四、实验总结通过本次实验,我遇到了很多问题,在解决问题的过程中学习到了很多。第一次做计算器,本来以为挺简单的,但是出乎意料,麻雀虽小,五脏俱全,问题挺多的,其中一个原因是我接触C#不久缘故。
    通过同学的帮助和自己google遇到的问题,大部分问题迎刃而解。

    窗口最大化和最小化的问题,把FormBorderStyle 从默认的Sizable 设置为Fixed3D,这样做用户就不能自由改变窗口的大小了,然后将MaximizeBox 和MinimizeBox 设置为false,问题搞定
    结果显示问题,为了使得界面好看,我是仿照windows上的计算器设计的,我认为这样子的话人机交互的界面就更加人性化了,符合大部分用户的操作习惯。同时也模仿这个计算机的按键输入和结果输出,说得简单做得难,修改了多次才达到一致的效果
    多按键同一个事件时的快捷设置,二十多个按键,一个一个来太慢了,问了问同学可以选择多个按键后在事件中选择一个方法就可以了,这样方便很多
    键盘响应事件,我用的是keydown,除了回车键,其他没有问题,我就纳闷了,从同学那里知道是焦点问题,于是问题好办了,把焦点设置在等于号上,那么每次回车都会自动运算了,至于怎么使焦点始终在这上面,在我已有代码上改似乎比较麻烦,我就把每个按键添加Enter事件,只要回车,焦点都到等于号上了,包括下方的两个radiobutton。当然,也可以另外弄了“隐藏”的按键,放在某个东西的后面,焦点固定在这里,对应计算事件,每次回车后都会计算了
    第一次用radiobutton 通过查询资料简单的搞定了,这么就能切换普通运算模式和科学运算模式了
    科学运算结果,我本来想用学数据结构时写的方法做,觉得麻烦,于是google了下,发现使用datatable这个类可以快捷的计算结果,实在是太方便了,一开始运算有警告,于是写了个简单的demo才发现返回值原来是object,类型转换后问题搞定了
    按键颜色,我的按键当鼠标放在上面和离开时都有颜色变化的,通过查询资料,知道不只有Color类,还有个SystemColors类的颜色,于是效果能做到和预期一样了

    还有挺多问题的,就不一一列举了。总之,我通过本次试验学习到了很多我以前不知道的东西,又有了挺大的进步。
    1 评论 3 下载 2019-05-07 19:55:19 下载需要6点积分
  • 基于JAVA实现的FTP文件传输工具(包括TCP和UDP实现的客户端和服务端)

    1.系统概述1.1 业务背景FTP服务提供了对文件传输的支持,对FTP文件传输服务的需求是本程序的背景,当然现在已经有很多FTP的很好的实现,本程序也不可能说做得比知名的那些要好,在这里程序的目的是为了锻炼网络程序设计与实践和软件系统设计与开发实践能力。
    1.2 总体目标实现一个FTP服务,能够在客户端和服务器端查看和传输文件,使用TCP和UDP两种协议方式进行实现,最后会提供一个FTP服务器、一个FTP客户端。
    2.系统分析和设计2.1 系统概述2.1.1 业务需求描述FTP服务器需求

    为客户端提供查看文件的功能
    为客户端提供上传文件的功能
    为客户端提供下载文件的功能
    能够接受TCP协议的访问方式
    能够接受UDP协议的访问方式

    FTP客户端需求

    能够从服务器上查看文件
    能够向服务器上上传文件
    能够从服务器上下载文件
    能够通过TCP协议访问服务器
    能够通过UDP协议访问服务器

    2.1.2 外部接口需求
    硬件接口:无直接硬件接口,只通过OS等软件接口与硬件间接交互
    软件接口:相应的JDK、JVM环境,以及标准的浏览器软件
    通讯接口:TCP协议、UDP协议

    2.1.3 非功能性需求FTP服务器要求响应时间不能过长,且稳定、可靠;FTP客户端要求传输速度不能过慢,且可随时访问服务器。
    2.1.4 约束条件开发环境

    Eclipse-Java IDE,windows7系统
    整个项目由Java开发,所以要求系统装有相应的JDK、JVM环境,另外,FTP服务器和客户端要求系统有tcp、udp协议的接口

    开发规范

    文件命能清楚的描述其功能
    代码中的空格与空行上下保持一致
    有适量且清楚的注释
    界面整洁,方便使用
    所有函数及变量有能描述其功能的名字
    应注意代码的简洁和优化

    2.2 用例模型2.2.1 用例图
    2.2.2 详细描述


    用例名称
    FTP下载文件




    描述
    用户用FTP客户端从服务器上通过TCP协议下载一个文件


    参与者与关注点
    FTP客户端(用户):希望能够得到快速地响应,而且文件没有传输错误。FTP服务器:希望能够尽快完成客户端请求,有个较好的吞吐量。


    事件流
    主成功场景(或基本流程):客户端要求建立和服务器建立用于控制对话的TCP连接;服务器响应要求并完成3次握手建立连接;客户端向服务器发送文件名;服务器接受文件名并建立用于传输的TCP连接;客户端从服务器通过该连接下载文件;传输完毕,客户端断开与服务器的TCP连接;完成。任意TCP连接建立失败:服务器报错给服务器管理员,管理员检查服务器状态是否异常;客户端报错给用户并退出。文件传输过程出错:客户端报错给用户;用户重新使用客户端从服务器上下载文件或放弃下载。


    前置条件
    服务器已运行



    2.3 领域类图2.3.1 FTP(UDP)类图
    2.3.2 FTP(UDP)核心顺序图
    2.4 体系结构设计
    2.5 程序流程图FTP服务器

    FTP客户端

    2.6 测试截图

    3.总结综上所述,程序实现了一个FTP文件传输工具,包括TCP服务器和客户端、UDP服务器和客户端。在简单规模的测试及使用下,程序运行正确且良好,在较大用户数下表现得一般,响应时间不是很好。作为一个学习网络程序设计的程序已经完成了目标。
    这次作业中,复习了很多计算机网络的相关知识的同时也学到了很多新的实践方面的知识,锻炼了编程能力,感谢老师的辛勤付出。
    1 评论 1 下载 2019-05-07 12:09:44 下载需要12点积分
  • 基于JSP实现的网上点餐系统

    1 软件项目开发模式
    螺旋开发模式

    适合于项目前期部分需求不确定的情况, 对于每一个模块一个个开发:分析、设计、编码、测试、上线好处: 降低软件风险! (做出的产品要尽量满足客户需求!)
    瀑布模式

    先进行所有模块的需求分析,当分析结束后,才进入项目下一个阶段, 即设计、编码、测试、上线 好处: 更容易进行项目把控,即项目质量控制

    2 需求分析软件工程师: 了解需求的途径?

    需求文档
    项目经理
    项目的系统原型(美工设计师)
    客户

    “餐馆王”系统功能

    餐桌模块
    菜类别模块(菜系)
    菜信息(菜品)
    订单

    详细分析

    后台录入的餐桌, 要在前台首页显示; 且只显示未预定
    后台录入的菜类别, 在前台主页显示
    后台录入的菜信息,在前台主页显示
    前台生成订单后,在后台显示订单详细

    3 数据库设计3.1 创建数据库CREATE DATABASE hotel CHARACTER SET utf8;USE hotel;-- 1. 餐桌表CREATE TABLE dinnerTable( id INT PRIMARY KEY AUTO_INCREMENT, -- 餐桌主键 tableName VARCHAR(20), -- 餐桌名 tableStatus INT DEFAULT 0, -- 餐桌状态:0,空闲; 1,预定 orderDate DATETIME);
    3.2 菜类别表CREATE TABLE foodType( id INT PRIMARY KEY AUTO_INCREMENT, -- 类别主键 typeName VARCHAR(20) -- 类别名称);
    3.3 菜品种表CREATE TABLE food( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 foodName VARCHAR(20), -- 菜名称 foodType_id INT, -- 所属菜系, 外键字段 price DOUBLE, -- 价格 mprice DOUBLE, -- 会员价格 remark VARCHAR(200), -- 简介 img VARCHAR(100) -- 图片);
    3.4 订单表(订单基本信息)CREATE TABLE orders( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 table_id INT, -- 外键: 餐桌编号 orderDate DATETIME, -- 下单日期 totalPrice DOUBLE, -- 订单所有菜需要的总金额 orderStatus INT DEFAULT 0 -- 订单状态: 0,未结账; 1,已结账);
    3.5 订单明细表(主要是菜品种)CREATE TABLE orderDetail( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 orderId INT, -- 外键:引入的是订单表的主键 food_id INT, -- 外键:引用的是菜信息表的主键 foodCount INT -- 菜的数量);
    3.6 添加关系-- 添加菜品与菜类别的关系约束ALTER TABLE food ADD CONSTRAINT fk_food_foodType_id FOREIGN KEY(foodType_id) REFERENCES foodType(id);-- 订单表: 与餐桌表的关系ALTER TABLE orders ADD CONSTRAINT order_table_id FOREIGN KEY(table_id) REFERENCES dinnertable(id);-- 订单明细: 与订单表的关系ALTER TABLE orderDetail ADD CONSTRAINT orderDetail_order_id FOREIGN KEY(orderId) REFERENCES orders(id);-- 订单明细: 与菜信息的关系ALTER TABLE orderDetail ADD CONSTRAINT orderDetail_food_id FOREIGN KEY(food_id) REFERENCES food(id);
    4 系统设计
    开源组件及jar文件:

    数据库驱动包(1个)C3P0连接池包(2个)DbUtils组件 (1个)BeanUtils组件(2个)FileUpload组件(2个)
    配置

    C3p0配置文件
    分层

    Entity/dao/service/servlet
    图解




    2 评论 20 下载 2019-01-04 10:54:55 下载需要6点积分
  • 基于PHP的产品报价系统的设计与开发

    摘 要随着互联网技术应用的不断深入,产品的生产与销售链条也越来越多的融入了电子商务的元素。消费者通过网络能与来自世界各地、不同种类的产品建立直观的联系,并通过便捷、快速的操作完成购买流程。为了便于用户在千万计的产品中通过对不同制造商、不同产地的产品的价格、性能等参数进行比较,快速的找到自己需要的产品,尽可能缩短购买时间,并在制造商和消费者之间建立一个高效的平台,采用简洁高效的PHP语言与MySQL数据库等技术,并借鉴了开源社区中最经典的技术思想和开发模式,设计和开发了这一产品报价系统。该系统主要实现了产品搜索、用户评论、在线购买等前台模块与产品管理、用户管理、订单管理等后台模块。通过科学全面的测试,系统实现了产品报价和在线购物的主要功能。产品报价系统做为现有电子商务和在线购物模式的重要补充,在实际的应用中必将显现其突出的优势。
    关键词:产品报价;在线购物;电子商务;PHP;MySQL;开源社区
    AbstractWith the development of Internettechnology, the production and marketing chain is more and moreintegrated into the e-commerce element. The consumer can establishment direct-viewing relationwith the different type products which come from all over the world through thenetwork , and complete the purchase flow through convenient and the fastoperation. In order to be advantageous for the user in the product which surelycounts through to the different manufacturers, different habitat parameter andproduct price, performance is carrying on the comparison , looks for theproduct quickly which are needed, reduces the purchase time as far as possible,and builds a high effective platform between the manufacturer and the consumer,This paper takes advantage of simple and high effective technology of PHPlanguage and MySQL database , profites the most classical technical thought andthe development pattern from open source community, design and develope thissystem. This system has mainly realized product search, user commentary,on-line purchase backstage module and so on and onstage module and productmanagement, user management, order form management and so on.Through thescience comprehensive test, the system has realized the main function of productquoted price and the shopping on-line so on. As the important supplement for existingE-commerce and the shopping on-line pattern, the product quoted price system willcertainly display its prominent superiority in the actual application.
    Key words: Products Quotation;Shopping online;E-commerce; PHP; MySQL; Open source community
    1 引言1.1 系统的开发背景1.1.1 在线购物的发展在线购物可以被认为是电子商务的一部分。从广义上讲,电子商务是指一种依托现代信息技术和网络技术,集金融电子化,管理信息化,商贸信息网络化为一体,旨在实现物质流,资金流,与信息流和谐统一的新型贸易方式,是贸易过程的电子化,网络化。
    在线购物也已经成为一种时尚,它为人们提供了真正足不出户就可以购买任何需要的东西的可能性,因此得到越来越多消费者的接纳和认同,尤其是成长在网络时代的年轻人。当然,成功的电子商务并不是简单的编写一套程序就能完成的,它不仅需要与金融系统紧密联系在一起,还要有完善的物流系统作为支撑。另外还要有良好的美誉度、强大的前期宣传,以及完善售后服务。国内就有很多成功的在线购物网站,比如阿里巴巴,无论哪个方面,都是值得学习的榜样。
    虽然我国的在线购物体系还不够成熟,还存在这样那样的问题,但它的发展符合经济学原理和人们的需要,只要对症下药,一定可以逐渐发展完善,在竞争激烈的现代商务竞争中占据稳固地位。
    1.1.2 产品报价系统的现状产品报价系统的开发,主要是用来帮助消费者在最短的时间内通过产品参数的比较,找到自己需要的产品,并使用系统提供的在线购买功能,实现整个购物流程。
    目前,产品报价系统已经越来越多的应用到了大型的电子商务解决方案之中,起到了良好的效果。在泡泡网(http://product.pcpop.com )、中关村在线(http://detail.zol.com.cn )、IT世界网(http://www.it.com.cn )、太平洋电脑网(http://www.pconline.com.cn/market )等国内著名的IT和数码产品信息网都提供了强大的产品报价功能。
    1.2 系统实现的目标本系统主要实现产品报价和传统在线购物的结合。一方面用户可以使用该系统对产品进行多种属性的搜索,对不同制造商和不同型号的产品进行简单的比较,最后提交订单并完成整个在线购买流程。另一方面,建立严格的审核和快捷的订单处理机制,对管理员进行权限管理,分为系统管理员、产品管理员和订单管理员等。管理员在后台设置产品的类别、制造商信息以及对不同的产品进行属性定制,建立专有的产品属性字段。
    1.3 系统开发的意义本系统的开发,将在一定程度上缩短用户在产品选择和购物的中间环节,简化购物流程,提高效率。为用户节省大量的时间。通过对新注册用户的审核,来建立一个安全可靠的购物环境,解决传统电子商务存在的诚信度问题。
    2 产品报价系统分析2.1 网站的设计目标网站使用简洁的框架结构,让审核通过并登录了的用户进行产品的搜索、使用购物车、填写定单、选择支付和送货方式等操作,用户发表产品评论,在填写定单的时候可以附带留言对自己订购的产品加以备注说明。管理员有权在后台面板进行用户管理(包括审核、查看、编辑与添加)、订单管理和留言管理以及一些常规的设置和数据库管理(包括备份和恢复)等操作。
    2.2 网站的可行性分析2.2.1 用户群体与市场分析从用户群体的特点分析,他们主要为18-35岁之间的年轻人,他们更容易接纳新的生活方式,本身也具有很大的消费能力,而随着互联网用户数的快速增长,各种年龄段的网络用户都在逐渐的接受这种新的购物方式,而网上支付和物流行业的崛起,更凸显了电子商务的优势。截止今年第一季度,我国网民数量已达1.44亿人,这是一个庞大的基数,而且正在不断增大。庞大的用户群必将为在线购物市场注入强劲的活力。
    从市场的前景分析,据两家美国机构发布的一份有关全球在线购物发展的报告显示,2007年,全球在线购物的市场容量将增长20%,达到2110亿美元。而我国的在线购物市场已经进入到了白热化的竞争,包括淘宝、易趣、当当等国内外巨头已经掌握了绝对的市场份额。专家预测,未来几年我国在线购物市场将达280亿元人民币,电子商务已成为我国互联网产业继门户、游戏、短信、搜索之后又一新的支撑点。
    2.2.2 技术能力分析根据本系统的功能需求,采用PHP编程语言与开源的MySQL数据库引擎进行开发。由于PHP作为一种高效而且语言结构清晰的编程语言,尤为适合于模块化功能的开发,而且因为其本身和服务器结合比较紧密,有大量优秀的函数库可以使用,在执行效率和安全性上有很大优势。而MySQL作为一种快速的、多线程、多用户和健壮的SQL数据库服务器,根据第三方测试结果,在千万级的数据环境中依然保持较高的执行速度。因此在技术层面上,是完全可行的。
    2.2.3 可行性分析总结综合在线购物市场用户群体的特点和不断增长的需求,以及技术、市场前景趋势等因素,在线购物市场有很大的发展前途,而产品报价系统则是建立在对产品的价格等参数对比的基础上的在线购物系统,因此本系统的开发是具有可行性的。
    2.3 网站设计的特点系统的设计上需要注重安全性和用户操作的流畅性。因此要在对用户的管理和资格审核环节做出限定,只有经过审核确认的会员才有权使用产品的订购功能,而且需要对管理员进行不同的权限分配。搜索将在系统功能中占据重要的位置,可以使用产品的多个属性字段进行模糊搜索,并在搜索结果提供比较和购买通道。
    3 系统的开发技术及主要构架3.1 开发技术的选择3.1.1 PHP编程技术PHP(“PHP Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可以嵌入到 HTML中,尤其适合 web开发。它还是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。
    PHP代码在服务器端被解释转变成普通的HTML页面内容,送给浏览器端,这种模式可使我们用它来完成相当复杂的功能。它能运行在包括Windows、Linux等在内的绝大多数操作系统环境中,常与免费的Web服务器软件Apache和免费数据库软件MySQL配合使用于Linux平台上,具有较高的性价比。

    强大的数据库支持:目前其支持范围覆盖了包括Oracle,Sybase,Microsoft SQL,MySQL,Informix,Solid dBase,ODBC,Unix dbm,PostgreSQL,Adabas D等在内的大多数常见数据库。用它编写一个含有数据库功能的网页程序十分简单。PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是绝佳组合。
    可扩展性:就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
    面向对象编程:PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP也支持构造器、提取类等。

    3.1.2 MySQL开源数据库的开发MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB的注册商标。
    它的主要特点和优势主要有以下几个:

    MySQL是一个快速、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。
    MySQL是一个关系数据库管理系统。它将数据存放在独立的表格中,以增加存取的速度和灵活性。“MySQL”中的SQL代表“Structured Query Language”(结构化查询语言)。SQL是用于访问数据库的最通用的标准语言,它是由ANSI/ISO定义的SQL标准。
    MySQL是开源的。开源意味着任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL而不需要支付任何费用。

    3.2 系统的主要架构及开发模式3.2.1 基于B/S的体系结构本产品报价系统采用B/S模式,服务器采用著名的web服务器端软件apache,该http服务器有着良好的跨平台性和安全性,可以运行在包括windows、linux、mac等操作系统上。用户客户端使用各种浏览器都能够进行正常的浏览和操作。需要注意的是在程序的开发过程中,程序和路径相关的要考虑到不同的操作系统的文件目录结构。
    3.2.2 OOP(面向对象编程)在PHP中的运用面向对象的方法是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。面向对象方法的基本思想是:从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类自然的思维方式。
    关于OOP思想是否适用于PHP程序开发的争论一直在持续,一方面PHP向来以快捷开发著称,在程序中可以直接的对变量进行调用,况且PHP自身就提供了庞大的函数库。而OOP则需要使用对象来调用每一个函数和属性。但是在本系统的开发中,大量使用到了OOP的思想,最突出的就是对数据库的操作部分,在后续的代码中出现对数据库的操作的时候使用对象调用让整个流程和结构显得更加清晰。在PHP5的开发过程中,OOP的思想已经得到了一定的重视。
    4 系统的功能和流程分析4.1 平台功能模块的设计分析根据需求分析和产品报价系统的整体工作流程,本系统所具有的基本功能模块主要包括查询、购买、留言、用户管理、产品管理、留言管理和订单管理等,除了以上基础模块,在开发过程中还开发了一些相关的模块来补充和完善整个系统,以期获得更好的效果。系统功能模块关系图如图。

    4.2 系统流程分析以下部分主要对各个功能模块的实现流程思路进行分析。
    4.2.1 前台购物流程只有管理员审核通过的注册用户才具有在本系统购买产品的权限,当用户搜索到所要订购的产品时,点击“购买”按钮,即可将产品放入购物车中,系统页面转向购物车页面,用户可以在看到产品现有库存,并根据自身需要设置购买的产品数量。
    设置完毕后,用户可以继续购物,也可以通过页面上的“结帐”开始订单填写流程。页面将显示出订购产品的基本信息、用户所在的通讯地址(用做产品发货地址),用户需要确认正确的收货地址,如果需要设置新的收货地址,可以在自己的通讯录内添加。在收货地址确认后用户需要选择送货方式,比如普通邮寄、特快专递等,在确认送货方式之后,进入支付方式的选择,用户可以选择在线支付,也可以选择邮局汇款,在线支付的可以通过在线支付的接口实现支付。在支付方式确认之后,订单的全部信息设置完毕,用户做最后的确认,无误之后确认定单。整个订单过程完毕。等待管理员处理订单。
    用户可以在个人面板查看个人订购记录与订单处理状态。
    用户购物的整体流程如图。

    4.2.2 注册登录功能流程注册流程的实现较为简单,用户在系统首页或者系统任何通过登录才有访问权限的页面都能找到会员注册的链接。点击注册链接,用户按照表单所需信息填写,需填写真实信息,因为新注册用户必须经过管理员审核才能成为正式会员在本站进行产品订购。信息填写完毕并提交之后,系统提示注册成功,但是需要管理员审核。
    登录功能中,注册用户需要提供其正确的注册邮箱和密码,忘记密码的用户可以通过“找回密码”填写注册使用的邮箱名称,提交发送找回密码的请求,系统收到请求后,将会通过邮件将用户的新密码发送到用户注册邮箱中去。
    4.2.3 商品搜索流程搜索功能是系统最重要的一个模块,在搜索页,用户可以输入产品关键字,并根据产品的价格范围、产品制造商以及产品类别等属性进行查询,在查询的过程中,可以使用符号与关键字的结合进行模糊搜索。在搜索结果中,每个产品都会以规范的表格形式展示出来,并直观的显示出产品的关键属性和特点,并提供直接的购买按钮。
    4.2.4 留言评论流程在每个产品的介绍下面都有产品评论的功能,注册用户可以对产品发表评论,对产品提出问题或者疑问,并评分。信息提交之后,管理员将能通过后台的管理功能查看的相关的评论以及问题。
    4.2.5 商品管理流程在本产品报价系统中,主要通过管理员添加产品信息,在后台的产品管理中,管理员需要设置产品的类别,类别设置能够设立一级分类与二级分类。类别主要信息包括类别名称、排列顺序、类别形象图片等。管理员还需要设置和管理产品制造商,在添加产品信息时,管理员需要设置产品的类别、制造商、价格、库存数量等属性,库存数量会在每次的订购之后自动的减少。在产品添加之后并不能直接的显示在前台的页面上,只有在产品被管理员激活之后才能够显示。管理员有权限对已存在的类别、制造商、产品进行包括编辑、删除的管理。由于产品库存会随着产品订购而减少,管理员可以通过编辑产品来修改库存数量。同时,也可以将特有产品设置为特价产品来销售。
    4.2.6 订单处理流程管理员在查看到新订单出现时,查看订单信息,根据用户所订购的产品以及所选取的支付和运送方式,对订单进行处理,在确认已经收到用户的订购货款的时候,开始进行正式的处理中,并根据办理的情况,修改产品订单的处理状态,用户可以通过个人面板了解订单状态,及时的了解到最新的处理情况,和网站保持一种便捷的沟通渠道,从而保证了购物过程的安全和流畅。
    4.2.7 用户管理流程用户群组是本系统一个重要模块,为了对新注册用户进行审核,在开发过程中,将新注册的用户默认为待审核组的成员,管理员登录后,可以查看新注册用户的资料,待确认审核通过后将其从待审核组转到正式用户组,实现了基本的审核功能,而只有正式会员才享有在本站订购产品的权限。其次在用户管理中,管理员可以添加用户,添加完成后将给新添加的用户发送一封邮件,进行通知。管理员还可以通过姓名、邮箱以及所在群组搜索查找用户,并对用户进行编辑、删除等操作。而管理员也作为一个特殊的群组存在,主要分为系统管理员、订单管理员和产品管理员,每个管理员都具有相应的权限。
    5 系统功能的具体实现5.1 系统数据库的设计根据需求分析以及系统功能的需要,系统信息数据存放在MySQL数据表中。下面给出重要数据表的简单描述。
    5.1.1 customers(用户信息表)该表存储了用户的基本信息,主要用于用户的登录以及站内的活动记录。表内数据由用户注册时写入。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    customers_id
    int
    11

    用户标识号,自动生成


    customers_gender
    char
    1

    用户性别


    customers_firstname
    varchar
    32

    用户姓名


    customers_email_address
    varchar
    96

    用户注册用email地址


    customers_default_address_id
    int
    11

    用户默认地址编号


    customers_fax
    varchar
    32

    用户传真


    customers_password
    varchar
    40

    用户密码


    customers_newsletter
    char
    1

    用户订阅的新闻


    status
    enum


    用户群组


    credit
    int
    10

    用户积分


    regdate
    int
    10

    注册日期


    lastvisit
    int
    10

    最后访问时间



    5.1.2 usergroups(用户群组表)该表存储了系统群组的信息,每个群组所享有的权限是不同的,新注册用户默认为待审核成员组。该表的字段属性。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    groupid
    Smallint
    6

    群组编号,自动生成


    status
    Enum


    用户组类型


    grouptitle
    Varchar
    30

    群组名称


    creditshigher
    Int
    10

    积分上限


    creditslower
    Int
    10

    积分下限


    groupdiscount
    Float


    账户折扣


    allowsetconfig
    Tinyint
    1

    是否有系统配置权限


    allowsetproduct
    Tinyint
    1

    是否有管理产品权限


    allowsetmodules
    Tinyint
    1

    是否有管理模块的权限


    alloweditcustomer
    Tinyint
    4

    是否有编辑用户的权限


    alloweditorder
    Tinyint
    1

    是否有处理订单权限


    allowadmindata
    Tinyint
    1

    是否有管理数据的权限



    5.1.3 categories(产品分类表)该表存储了产品类别信息,主要包括了产品编号、标识图片以及订购类型编号等。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    categories_id
    Int
    11

    产品类型编号


    categories_image
    Varchar
    64

    产品标识图片


    parent_id
    Int
    11

    父类编号


    sort_order
    Int
    3

    订购类型编号


    date_added
    Datatime


    添加日期


    last_modified
    Datatime


    最后修改日期



    5.1.4 address_book(用户通讯地址表)系统将用户注册时的通讯地址保存到该表中,用户可以根据自身情况,在通讯录最多设置5个通讯地址,该通讯地址主要作为订购产品的发货地址和邮件接收地址。保证产品通过用户选择的送货方式送达用户手中。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    address_book_id
    Int
    11

    通讯录编号


    customers_id
    Int
    11

    用户编号


    entry_firstname
    Varchar
    32




    entry_lastname
    Varchar
    32




    entry_street_address
    Varchar
    64

    详细地址


    entry_postcode
    Varchar
    10

    邮政编码


    entry_city
    Varchar
    32

    城市


    entry_state
    Varchar
    32

    省市


    entry_country_id
    Int
    11

    国家编号


    entry_zone_id
    Int
    11

    区域编号


    entry_tel_regular
    Varchar
    32

    固定电话


    entry_tel_mobile
    varchar
    32

    移动电话



    5.1.5 manufacturers(制造商信息表)制造商信息表主要存储了制造商的基本信息,包括编号、名称、形象图片、添加及更新日期。本表信息由系统管理员进行管理。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    manufacturers_id
    Int
    11

    制造商编号


    manufacturers_name
    Varchar
    32

    制造商名称


    manufacturers_image
    Varchar
    64

    制造商标识图


    date_added
    Datetime


    添加日期


    last_modified
    Datetime


    最后修改日期



    5.1.6 products(产品信息表)该表存储了产品的基本信息。由管理员在后台添加产品时候输入。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    products_id
    Int
    11

    产品编号自动生成


    products_quantity
    Int
    4

    产品库存数量


    products_image
    Varchar
    64

    产品图片


    products_price
    decimal
    15,4

    产品价格


    products_date
    Datetime


    产品发布时间


    products_last_modified
    Datetime


    产最新编辑时间


    products_date_available
    Datetime


    激活时间


    products_weight
    decimal
    5,2

    产品重量


    products_status
    Tinyint
    1

    产品状态


    manufacturers_id
    Int
    11

    产品制造商编号


    products_ordered
    Int
    11

    已订购产品


    products_type
    int
    2

    产品型号


    categories_id
    int
    10

    产品类别编号



    5.1.7 reviews(用户评论表)该表存储了用户提交的产品评论信息,主要包括了用户的信息和评论以及评分的信息。



    字段名
    字段类型
    字段长度
    是否主键
    描述




    reviews_id
    Int
    11

    评论编号


    products_id
    Int
    11

    产品名称


    customers_id
    Int
    11

    用户编号


    customers_name
    Varchar
    64

    用户姓名


    reviews_rating
    Int
    1

    评论评分


    date_added
    Datetime


    添加日期


    last_modified
    Datetime


    最后修改日期


    title
    Text


    题目内容


    reviews_read
    Int
    5

    评论阅读次数



    5.2 功能总体说明5.2.1 系统流程图系统整体主要流程图。

    5.2.2 目录结构说明本系统程序代码包含11个子目录,主要目录描述说明为:

    admin : 管理后台程序目录,包括后台程序、数据库备份目录、后台管理子模块程序目录
    htmlarea : htmlarea在线编辑器的全部程序,包括编辑器的js文件、编辑器图标以及模版程序
    images : 该目录主要为系统中使用到的图片、图标,包括jpg、gif、ico等格式
    includes : 系统的重要函数,包括全局配置文件,还有调用频繁的代码段
    modules : 存放系统中一些小的功能模块的代码。比如站内新闻订阅
    osdata : 数据库备份和恢复的设置目录,主要存放系统备份的数据库,可以从这里面将数据库导入到系统中去
    templates : 系统前台模版文件,为html格式,通过PHP文件的包含而使用

    5.3 各功能模块的实现5.3.1 数据库的连接系统中对数据库的操作是以类的形式表现的,将对数据库操作的函数封装到类dbstuff中,包括数据库的连接和查询以及从查询结果从取数据。然后建立一个新的对象db,在整个系统中直接使用对象操作数据库。在类dbstuff中,对数据库连接的代码片段是:
    function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0){ if ($pconnect){ if (!@MySQL_pconnect($dbhost, $dbuser, $dbpw)){ $this->halt('连接数据库服务器失败'); } } else{ if (!@MySQL_connect($dbhost, $dbuser, $dbpw)){ $this->halt('连接数据库服务器失败'); } } MySQL_select_db($dbname); //选择数据库}function select_db($dbname){ //将选择数据库以函数的形式表示 return MySQL_select_db($dbname);}
    对数据库操作的类封装在includes目录中的db_MySQL.PHP文件中,然后在application_top.PHP文件中建立对象,然后在使用到数据库操作的每个页面将application_top.PHP包含进去。在application_top.PHP建立对象的操作代码为:
    //建立对象$db = new dbstuff;//使用对象来操作数据库连接$db->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE,USE_PCONNECT);$db->select_db(DB_DATABASE);
    5.3.2 用户注册与审核模块作为一个产品报价系统,首先它是一个在线购物系统,因此为了建立一个良好的购物环境,保证系统的安全和用户的信息,新用户的审核是一个重要的环节。新用户在前台首页或者系统任何一个需要登录才能操作的功能页,都会自动的跳转到登录注册页面,注册页面如图所示。

    点击用户注册链接,进入如图的页面,填写真实的个人信息,在确认无误之后提交,系统将对提交信息进行初步的过滤,如果无误,将会提示注册成功。此时用户可以登录系统,使用搜索功能,发布产品评论,修改个人资料,但是不能订购产品,在等待管理员审核通过之后才具有购买产品的权限,成为正式会员。
    在注册页面,标注星号的为必须填写的字段,在程序中对此类字段进行是否为空的判断。如果均不为空则插入数据表中,否则返回信息提交页面。
    在这个过程中,重要的就是提取用户提交的信息,这是对信息进行判断和写入数据库的重要步骤,该过程使用到了位于includes目录中的global.PHP文件中自定义函数tep_db_prepare_input()。该函数的实现为:
    function tep_db_prepare_input($string){ if (is_string($string)){ return trim(tep_sanitize_string(stripslashes($string))); //字符串替换函数 } elseif (is_array($string)){ reset($string); while (list($key, $value) = each($string)){ $string[$key] = tep_db_prepare_input($value); } return $string; } else{ return $string; }}
    审核模块,由管理员在后台对所要审核的会员所在的群组进行更改,管理员能全面的查看到会员的全部资料,确认之后将用户由待审核组更改为正式会员组即实现了审核功能。
    5.3.3 用户登录模块的实现注册用户通过前台页面的登录窗口,进入系统,以进行相关操作。登录主要使用用户邮箱地址和注册密码,如果与数据库匹配成功则登录成功。用户遗忘密码时,通过找回密码功能来获得一个新的密码,这使用到了两个操作:
    首先就是通过用户提供的邮箱地址进行数据库的操作,如果邮箱存在就随机产生一个密码,并将加密后的新密码写入到数据库中。

    产生新密码的实现过程为:
    //读取用户提交信息$email_address = tep_db_prepare_input($HTTP_POST_VARS['email_address']);//数据库查询$check_customer_query = $db->query("select customers_firstname, customers_password, customers_id from $table_customers where customers_email_address = '".safe_input($email_address)."'");//邮箱地址存在,分配新密码if ($db->num_rows($check_customer_query)){ $check_customer = $db->fetch_array($check_customer_query); //随机产生密码 $new_password = tep_create_random_value(ENTRY_PASSWORD_MIN_LENGTH); //对随机产生的密码加密 $crypted_password = md5($new_password); //更新用户信息 $db->query("update $table_customers set customers_password = '".safe_input($crypted_password). "' where customers_id = '" . (int)$check_customer['customers_id'] . "'");
    其次,系统需要自动的发送邮件到用户信箱,将新密码以邮件方式发送给用户。发送给用户的密码是没有加密前的随机密码。发送邮件之前,系统需要配置好邮件服务功能。实现过程使用到了函数tep_mail(),该函数的实现代码为:
    function tep_mail($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address){ if (SEND_EMAILS != 'true') return false; require_once('includes/classes/mime.PHP'); require_once('includes/classes/email.PHP'); $message = new email(array('X-Mailer: Mailer')); $text = strip_tags($email_text); if (EMAIL_USE_HTML == 'true'){ $message->add_html($email_text, $text); } else{ $message->add_text($text); } $message->build_message(); $message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $email_subject); //使用到了PHP封装的函数send()}
    5.3.4 商品搜索模块的实现产品搜索主要是通过对数据字段的查询实现的。用户通过输入产品名称的关键字,目前可以实现的是使用产品名称关键字、产品分类(包含子分类)、产品制造商与产品的价格范围和上架的日期范围进行组合式的搜索服务。
    搜索结果将产品以列表的形式调用出来,并且显示各个产品的参数,以便于产品之间的比较,搜索结果显示。在实现该模块中,对数据库的查询、产品的显示形式与分页是重点技术点。

    其中搜索过程对数据库的操作较为复杂,需要同时对不同数量的关键字进行处理。搜索处理用到的重要函数有以下2个:
    // 用于获取用户搜索输入的所有参数function tep_get_all_get_params();// 用户对所有参数的处理function tep_parse_search_string();

    5.3.5 购物车模块的实现在产品列表点“购买”按钮,就自动的将所要购买的产品放进购物车中,点继续购物就可以回到产品页面,继续选择自己需要的产品。如果要结帐,只需要点“结帐”按钮,就会进入到订单填写的流程。订单处理主要包括确认收货地址、选择收货方式和选择支付方式三个主要步骤,其中可以发布订单的特殊要求和供货方需要注意的事项。购物车管理页面如图。

    在本模块中,需要对用户是否具有购物权限进行判断,未审核通过的用户虽然能够将喜欢的产品放进购物车(即使未通过审核的用户,放进购物车的产品信息也可以保存,以便用户在具有权限时继续购买,但在未通过审核前,其行为不影响产品库存数量)。权限判断的代码为:
    $query1 = $db->query("select status from $table_customers where customers_id ='".(int)$customer_id."'");$check_status = $db->fetch_array($query1);if ($check_status['status'] == 'verify'){ echo "<script>alert('您的资料还没有通过审核,暂时不能购买产品,我们将尽快为您开通。'); history.back();</script>"; exit();}
    5.3.6 产品管理模块的实现产品管理模块包含的主要功能有:添加管理产品分类,添加管理产品,设置制造商,设置产品特有属性。
    产品分类管理模块,为二级分类。通过管理后台的“新分类”链接,可以添加新的分类,通过“新产品”的链接可以在当前类别下添加产品,同样在一级分类下面也具有这两项功能。可以对已存在类别进行包括修改、删除和移动在内的操作。而对类的操作均是对数据库的直接操作。其中添加类的核心代码为:
    $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action']: (isset($HTTP_POST_VARS['action']) ? $HTTP_POST_VARS['action']: ''));if ($action){ switch ($action){ case 'new_category': if (isset($HTTP_POST_VARS['categories_id'])) $categories_id = stripslashes($HTTP_POST_VARS['categories_id']); $sort_order = stripslashes($HTTP_POST_VARS['sort_order']); $db->query( "insert into $table_categories (parent_id,sort_order,date_added) values ('$current_category_id','$sort_order',now())"); $categories_id = $db->insert_id(); $languages = tep_get_languages(); for ($i = 0, $n = sizeof($languages); $i < $n; $i++){ $categories_name_array = $HTTP_POST_VARS['categories_name']; $language_id = $languages[$i]['id']; $categories_name = stripslashes($categories_name_array[$language_id]); $db->query( "insert into $table_categories_description (categories_name,categories_id,language_id) values ('$categories_name','$categories_id','$language_id')"); } $categories_image = new upload('categories_image', '/upload/images/category'); if ($categories_image->parse($timestamp)){ $categories_image->save(); $db->query("update $table_categories set categories_image = '".addslashes($categories_image->filename)."' where categories_id = '".(int)$categories_id."'"); } updatecache('categories'); cpmsg("分类添加成功。", tep_href_link('admincp.PHP', 'act=catalog&cPath ='.$cPath.'&cID='.$categories_id));

    同样,产品的添加以及制造商的管理在实现上与分类的管理是一致的。



    5.3.7 用户管理与权限的实现主要包括了对用户的搜索查找、添加用户、编辑、删除以及对用户群组的权限和积分设置。搜索结果以列表形式显示。用户搜索页如图。搜索用户的实现程序片段为:
    elseif ($searchsubmit || $deletesubmit || $exportsubmit){ if (!$page){ //分页显示程序段 $page = 1; } $offset = ($page - 1) * MAX_DISPLAY_SEARCH_RESULTS; $conditions = ""; //用户搜索条件处理 $conditions .= $name != "" ? " AND (customers_firstname LIKE '%$name%' OR customers_firstname='$name')" : NULL; $conditions .= $email != "" ? " AND (customers_email_address LIKE '%$email%' OR customers_email_address='$email')" : NULL; $conditions .= $userstatus != "" ? " AND status='$userstatus'" : NULL; if ($conditions){ //如果搜索条件存在,开始搜索 $conditions = substr($conditions, 5); if ($searchsubmit){ //action判断 $query = $db->query( "SELECT COUNT(*) FROM $table_customers WHERE $conditions"); //符合条件的用户总数 $num = $db->result($query, 0); $multipage = multi($num, MAX_DISPLAY_SEARCH_RESULTS, $page, "admincp.PHP?act=members&searchsubmit=yes&name=$name&email=$email&userstatus=$userstatus"); $query = $db->query( "SELECT * FROM $table_customers WHERE $conditions LIMIT $offset,".MAX_DISPLAY_SEARCH_RESULTS); while ($member = $db->fetch_array($query)){ //循环分页显示用户列表 }

    添加用户主要是由管理员来录入新用户信息,填写提交成功后,由系统向添加的用户发送一封邮件,以通知新用户。该功能主要方便建立系统内的一些特殊的用户,满足多方面的要求。比如购买特殊产品权限的用户。添加新用户功能如图。

    图中显示的即为用户搜索的结果,管理员可以直接进行会员的审核,也可以通过如图中的“编辑”链接,查看用户详细信息。

    删除用户的选择框在左边,选中并提交即可删除。用户组的设置主要是通过对用户积分范围的设置来划分不同的用户组,不同的用户组享有不同的产品优惠。用户组设置功能如图。

    通过如图的页面,系统管理员有权限对系统的其他管理员进行权限的设置,分为产品管理员、订单管理员等。每个头衔可以设置相匹配的权限。

    5.3.8 订单与评论管理订单管理是产品报价系统的重要部分,主要实现的功能包括订单搜索、订单查看与处理、订单删除等。订单搜索通过订单号、订单状态、顾客名与顾客邮箱关键字进行搜索。在订单处理页,管理员能查看新订单的完整资料,并根据订单的处理状态进行管理,并通过系统邮件与顾客沟通,将订单的处理信息反馈给顾客,同时管理员能对一些订单进行删除操作。
    评论管理主要提供了简单的评论查看与删除功能,整个实现过程较为简单。
    5.3.9 系统数据管理MySQL数据库的最大特点就是提供了很多便于直接使用的操作函数,可以轻松的将复杂的数据库操作由清晰的函数实现。在系统数据管理这个模块,主要实现了数据备份和数据恢复(即数据库导入)。
    6 系统测试及难点分析6.1 系统运行环境的搭建本系统的开发和测试均在windows操作系统平台下进行的,使用AMP集成软件包搭建运行环境Apache,一种开放源码的HTTP服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性而被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,Perl/Python等解释器可被编译到服务器中。
    Apache支持许多特性,其中大部分通过编译的模块实现。这些特性从服务器端的编程语言支持到身份认证方案。一些通用的语言接口支持Perl、Python、Tcl和PHP。流行的认证模块包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持(mod_ssl),proxy模块。很有用的URL重写(由mod_rewrite实现),定制日志文件(mod_log_config),以及过滤支持(mod_include和mod_ext_filter)。Apache日志可以通过网页浏览器使用免费的脚本AWStats或Visitors来进行分析。
    相比较linux下的复杂安装过程,在windows操作系统下搭建运行环境相对简单,但是不足之处在于配置选项较少,安全性相对不高。在windows上主要采用继承软件包来直接安装,甚至不需要做任何配置就可以直接使用。
    第一:采用著名的AMP集成软件包wamp5,在众多AMP集成软件中,wamp5是最为出色的,它使用了最新的PHP5版本。安装与使用的流程如下:

    从官方网站:http://www.wampserver.com 下载最新版本。软件包为exe可执行文件,下载完毕直接双击,连续选择下一步就安装成功了。如果你需要对默认的设置做简要的修改,在安装的过程中很容易做到。可以自定义WWW根目录的存放位置,强烈建议放到D盘等安全的分区中,以避免万一系统崩溃,造成数据丢失。
    对于中文用户来说,安装结束后,首先要设置的是,把MySQL的数据库默认编码改为UTF-8,这样可以排除很多中文乱码问题:在WAMP5菜单中选择打开my(wamp).ini,设置其中的default-character-set=utf8, 然后重启WAMP5。
    数据库默认的密码是空的,可以在PHPMyAdmin中设置root帐号的密码为123456。修改之后,接着需要修改PHPMyAdmin的配置文件config.inc.PHP,否则PHPMyAdmin就不能进入数据库:

    $cfg['Servers'][$i]['user'] = 'root';$cfg['Servers'][$i]['password'] = '2003032024';
    由于MySQL4.1之后版本对密码验证的方法发生了改动,如果在WAMP5中使用PHP4.x,那么就需要启用MySQL的old password功能,否则无法登录PHPMyAdmin。在WAMP5菜单中选择MySQL/MySQL console,然后输入下列命令:
    MySQL> SET PASSWORD FOR-> 'root'@'localhost' = OLD_PASSWORD('2003032024');第二:采用其他的AMP集成软件。比如:AppServ(http://www.appservnetwork.com )、XAMPP(http://www.apachefriends.org/en )以及由网友Caisong制作的集成软件(http://www.caisong.com/ )。其安装和配置过程大体相同。
    6.2 系统程序的安装在搭建有apache+PHP+MySQL的服务器平台上,系统管理员只需要使用MySQL命令端或者web管理软件在MySQL服务器端创建一个数据库mywork.然后使用MySQL数据库导入命令将系统中的数据库文件导入到新创建的数据库mywork中即可。然后配置位于目录includes中的配置文件configure.PHP,修改为当前的数据库用户名和密码即可安装成功。使用默认用户邮箱:epochina@163.com 和密码:117227 登录后台进行系统设置和管理。
    6.3 系统的测试测试平台为windows操作系统,运行环境由MAP集成软件包搭建。Apache和PHP采用了缺省设置。
    6.3.1 系统关键部分测试分析测试分为两个部分:
    第一部分主要就是测试系统所要求的最基本的功能,主要侧重于用户前台的使用流程。基本的用户注册和登录功能相当流畅,但是在产品搜索功能上,虽然能够使用关键字搜索到产品,但是还有所欠缺,而且可以使用的产品属性关键字还太少。在前台的购物流程中,前期发现的购物权限设置问题已经得到了解决。测试过程中,购物环节完全可以成功运行,但是当用户购买产品超过库存数量的时候,虽然程序可以正确运行,但是缺少一个适当的判断环节。
    第二部分主要是针对后台管理的测试,由于后台管理功能模块较为集中,是整个系统的核心所在,特别是对用户的审核、对管理员的权限分配以及对订单的处理都完全符合系统设计初期的功能要求。因此从整体上来说,系统的设计和实现是成功的。
    6.3.2 测试结果分析与说明从整体的测试结果来看,在大中型的商务应用中,PHP与MySQL的结合具有相当的优势。
    首先就是缩短了开发时间,PHP与MySQL提供的大量固有的函数库直接在程序中使用,提高了程序的运行效率。虽然系统的功能还显得弱小,但是系统的优良性能已经得到了很好的体现。
    6.3.3 系统安全与性能分析系统设计过程中,对代码中出现的可能对系统造成安全威胁的字符进行过滤和字符的转换,在一定程度上提高了系统运行的安全性。同时所采用的编程语言和数据库的特性足以承受大量的数据读取和写入。
    6.4 系统中存在的问题及解决方法第一:在系统的设计初期,对用户的权限分配考虑不周,所有登录用户均可以进行产品购买。缺少对新注册用户的审核。这个问题已经得到解决,在系统的用户群组中建立了待审核用户组,默认所有新注册用户为该组成员,用户注册成功提交之后,提示用户等待管理员审核。在产品购买页面对用户进行判断,如果为待审核群组的会员则不能进行购物。
    第二:由于第一个问题的出现,在后台的用户资料查看中,没有将用户的详细资料调用显示,管理员不能够直观全面的了解用户的情况。就不方便进行审核,解决办法是从数据库中读取用户的资料,以表格形式显示出来。
    0 评论 3 下载 2019-01-13 16:12:51 下载需要5点积分
显示 60 到 75 ,共 15 条
eject