分类

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

资源列表

  • 基于Libpcap实现的局域网嗅探抓包发包解析工具

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

    数据包处理界面

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






    5 评论 59 下载 2018-11-05 12:08:40 下载需要12点积分
  • 基于JSP和Mysql的城市公交查询系统的设计与实现

    摘 要近年来, Internet推动了以互联网技术为核心的各项工作蓬勃展开,互联网的强大也大大的促进了社会的发展,整个社会信息化进程逐步加快,网络也变成了我们日常活动中越来越重要的组成成分。为了使得我国公交乘客出行及查询有关信息更方便,本文运用JAVA语言技术,Jsp技术,Mysql数据库开发了B/S结构的城市公交查询系统。
    该系统顺应了时代发展且具有以下优点:首先,方便乘客的出行,乘客不用询问站牌工作人员如何倒车,便可到达目的地。其次,乘客在网上就可以查询到公交公司发布的路况信息,以便提早做好换乘准备节约出行时间。最后,本系统可以节约人力资源,以往的站牌附近要安排公交公司的工作人员来帮助不熟悉的乘客,有了公交查询系统提前上网查询便可知道。
    关键词:B/S架构;JAVA;Mysql;JSP
    AbstractIn recent years, Internet promoted the work of Internet technology as the core of the Internet booming, powerful also greatly promoted the development of the society, the information process of the society gradually accelerated, network has become an increasingly important component of our daily activities. In order to make our bus passengers travel and query information more convenient, this paper uses the JAVA language technology, Jsp technology, Mysql database to develop the B/S structure of urban public transport query system.
    The system complies with the development of the times and has the following advantages: first of all, to facilitate passenger travel, passengers do not ask the stop sign, how to reverse the staff, you can reach the destination. Secondly, passengers can inquire about the traffic information issued by the bus company in order to save the travel time. Finally, the system can save human resources, the bus stop near the bus station staff to help passengers who are not familiar with, with a public transport inquiry system, advance access to the Internet will be able to know.
    Key words: B/S architecture; JAVA; Mysql; JSP
    1 绪论1.1 选题背景随着低碳生活的普及,人们更倾向于低碳环保的出行方式,完善公交系统无疑具有重要意义。公交是居民日常生活中最常使用的交通工具之一,伴随着我国经济繁荣和城市人口增长,出行工具的选择也变得越来越重要。政府在公共交通方面的投入正在逐步加大,使得城市内、城乡间的公交系统更加完善,原来的公交线路不断更新,居民们接收到的信息滞后,出行变得很不方便。纸质公交指南时效性低且不方便使用者查询。本系统加入了浏览器查询、自动更新等功能完善系统使居民的出行更加方便快捷。
    1.2 国内外发展状况除了杭州,上海等几个城市的居民可以通过电子站牌了解公交车的行驶情况外,其它城市需要乘公交出行的居民获取公交实时信息几乎是不可能的。我国许多城市都有一些颇具设计感的公交站台,但我们却很难在这里找到我们出行需要的信息。因此,居民想要找到“静态线路信息”或者“动态实时信息”都感到十分困难。
    有了权威的交通信息发布机构才能确保乘客获得信息的时效性,而迄今为止我国大多数城市还没有有关的管理机构和相关法律法规。随着居民对于公共交通出行的需求越来越大,本文基于信息技术和管理理论建立了管理信息系统。从提高居民生活水平的角度看,将计算机管理信息系统应用于我们的日常生活中是时不我待的。所以我的毕业论文选择了公交车查询系统,就因为他是一个较为贴近生活的一个问题,并且如果开发出来,则可以很大的方便乘客查询相关的公交信息,为自己的出行制定良好的乘车计划。
    1.3 选题的目的近年来,我国的城市发展速度之快,道路修缮之完善令很多市民的非常吃惊,城市的范围在不断扩大,随之公交线路的铺设也在随时进行,作为当代的大学生,每学期从学校回到自己的故土,是否发现自己的家乡在经历着一些变化,一时间连自己家乡的方位都有些晕头转向,更何况是那些外地的打工者或是来当地旅游的游客他们未尝不是这样,询问当地的市民看似是一种好办法,但是遇到倒车频繁,路途偏远,也怕是心有余而力不足,所以一个好的,便捷的,用户体验好的公交查询系统甚是重要,想去什么地方把他们输入进去,一目了然,想途径什么地点自己也可随意的查看,也不用因为自己解释不清楚或听得不清楚引起不必要的绕远。我设计的系统不仅包括了站点,公交线路的查询,还包括了公告发布和在线提问功能,让市民实时掌握城市的公交动态,方便他们的出行。
    1.4 研究手段及意义1.4.1 研究方法本研究课题设计的公交查询系统客户端模块,主要工作有:

    亲身体验了解客户需求,进行相关的需求分析
    根据需求分析和设计的本系统的框架
    根据框架结构的设计,制结构图
    编写相关的开发技术文档
    编写代码
    对系统进行单元测试

    1.4.2 技术路线本文涉及的系统基于B/S(Browser/server,浏览器/服务器),该模式采用了多种技术,在所有平台下都能顺畅地运行。
    1.4.3 意义近年来,我国经济发展迅速,城市建设也越来越完善。随着人口的增加,城市交通压力也在不断加大,公共交通与居民的生活息息相关,同时对于经济发展有着不容忽视的影响。虽然公共交通快捷且客运量大,但是公交信息的更新却跟不上公交系统发展壮大的步伐,居民难以获得及时的信息造成耽误出行。因此,创建一个方便的的公交信息查询系统,包含浏览器查询,实现中心控制、自动更新等功能,将极大地提升居民的出行体验。
    2 相关技术简介2.1 Jsp技术介绍JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用来运行Java web的使用者界面。开发者通过使用HTML代码、XHTML代码、XML元素和嵌入JSP操作编写JSP。JSP技术使用web表单得到用户自定义数据、通过数据库和其他数据库资源,接着动态地建立网页。JSP标签有各种各样的功能,像访问数据库、记载用户采取的信息、造访JavaBeans组件等,不仅如此在各种网页中对信息的传达和共用。
    JSP程序通过Java的编程语言,对动态网页进行封装。根据tags和scriptlets,网页对存在于服务端的资源的应用逻辑的造访也是可以的。JSP将网页逻辑与网页设计和显示分隔开,对可重新利用的基于组件的设计进行支持,更易于对基于Web的应用程序进行开发。
    JSP以及Servlet ,在服务器上运行的,一般将运行后的html文本返送给客户端,仅仅在客户端的浏览器就能显示。先运行调用JSP页面的代码,然后在Web服务器送回的JSP文件的结果中碰到的HTML代码送回到客户端。Java程序段来运行数据库,重定向页面可以插入页面和动态页面的功能需要被新建。运用标记和编程语言技术形成动态生成的网页时,将形成逻辑处理包。
    Java Servlet 是JSP的技术根本,并且很多的Web应用程序的设计都要有Java Servlet和JSP的共同合作。JSP简单易用,完全的面向对象,不仅平台无关性还有安全可靠,这些都是继承了java技术。
    从JSP出世后,很多的企业都设立JSP技术的服务器,像IBM、Oracle、Bea这些企业,也让JSP快速变为商业应用的服务器端语言。JSP和 Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java 2 platform Enterprise Edition)应用体系中的一部分。Servlet与 CGI很相似,它是HTML程序和后台隔离开的。它们的开始原理也差不多,都是服务器接到客户端的指令后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务
    JSP技术的优点:

    一次编写,到处运行:除了系统之外,代码无需做任何改动
    系统的多平台支持:一般可以在所有情况下的平台上进行设计,可以放在所有情况下进行发展。相比ASP/.net来说,优点是显而易见的
    强大的可塑性:根据一个小的Jar程序能够对Servlet/JSP进行操作,也能根据不少的服务器进行集群和负载平衡,而且可以根据多个Application处理问题。单个服务器到多个服务器,Java表现了一个创造性的能力
    拥有多元化的工具:Java现有的很多设计方法中许多工具不需要成本,其中大部分均可以在各平台中顺利进行
    支持服务器端组件:web的运行需要强大的服务器支持,因此为了完善系统的可操作性,开发者应当在使用web时加入其它工具,JSP能够利用 JAVA BEANS 组件来展示出各式各样的商务功能
    内部对象表现出:request 用户端请求,这个请求会包括来自GET/POST请求的参数; response网页传回用户端的反应;管理pageContext 网页的属性;session 与请求相关的会话;application servlet正在进行的内容;out 用来输送响应的输出流; config 代码片段配置对象;page JSP网页本身

    2.2 MyEclipse简介MyEclipse是基于Eclipse进行插件合成,最终形成功能强大的开发软件。目前主要用于JAVA,JAVAEE的开发,也可以用于移动应用的开发,其主要特点是功能强大,应用广泛,并且支持很多开源的产品,应用前景非常广发。
    MyEclipse是由Eclipse通过对插件的集成而来,是对IDE的拓展,可以用来开发网页等应用,可以实现程序的开发,调试,发布等,能极大的提高开发效率,能完美支持HTML、STRUTS等,可以说集成后的MyEclipse包含了当前所有主流的开源产品。MyEclpise也经历了很多代的产品,从最开始的到后来的2014版本,2015版本等都说明了它在发展历程中的变化。
    MyEclipse的配置使用也非常智能,不需要使用者懂太多的知识,只需要在自己使用的功能中进行了解即可,在完成项目开发之后,也可以直接通过MyEclipse进行项目部署,可以将网页项目进行选中,直接运行在Tomcat中,也可以将项目打包通过导出功能将项目全部导出,然后将项目发布到tomcat中,通过对配置文件的设置安排项目,之后进行查看。可以说,有了MyEclipse之后,基本就能支持所有的web开发,就能使用快捷的编译工具进行快速的开发,也能在各种各样的服务器上进行代码测试。在其他方面,MyEclispe也有很多的开发前景,比如在云开发领域,在移动端开发领域,在企业级开发领域等等,因此,MyEclipse的应用场景非常的广泛。
    2.3 数据库技术数据库的设计是研究数据库及其应用系统的技术,是数据库在应用领域中主要的研究课题。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效的存储数据,满足各种用户的应用需求(信息要求和处理要求)。一个信息系统的各个部分能否紧密的结合在一起以及如何结合,关键在数据库。因此只有对数据库进行正确的概念设计、合理的逻辑设计以及有效的物理设计才能开发出完善而高效的信息系统。数据库设计是信息系统的开发和建设的重要组成部分。
    2.3.1 数据库的体系结构数据的体系结构分成三级:内部级(Internal),概念级(Conceptual)和外部级(External)。这个三级结构有时也称为“三级模式结构”。

    外部级:最接近用户,是单个用户所能看到的数据特性。单个用户使用的数据视图的描述称为“外模式”
    概念级:涉及到所有用户的数据定义、是全局的数据视图。全局视图的描述称为“概念模式”
    内部级:最接近于物理存储设备,涉及到实际数据存储的结构物理存储数据视图的描述称为“内模式”

    数据库的三级模式结构是数据的三个抽象级别。它把数据的具体组织留给DBMS去做,用户只要抽象地处理数据,而不必关心数据在计算机中的表示和存储,这样就减轻了用户使用系统的负担。
    2.3.2 数据库管理系统(DBMS)数据库管理系统(DBMS)是指数据库系统中管理数据的软件系统。DBMS是数据库系统的核心组成部分。对数据库的一切操作,包括定义、查询、更新及各种控制,都是通过DBMS进行的。
    在不同的计算机系统中,由于缺乏统一的标准,即使同种数据模型的DBMS,它们在用户接口、系统功能方面也常常是不相同的。
    用户对数据库进行操作,是由DBMS把操作从应用程序带到外部级、概念级、再导向内部级,进而操作存储器中的数据。DBMS的主要目标,是使数据作为一种可管理的资源处理。
    DBMS的主要功能为:

    数据库定义功能:DBMS提供数据定义语言(DDL)定义数据库的三级结构,包括外模式、概念模式、内模式及基相互之间的映象,定义数据的完整性、安全控制等约束。因此,在DBMS中应包括DDL的编译程序
    数据库的操纵功能:DBMS提供数据操纵语言(DML)实现对数据库中数据的操作。基本的数据操作分成两类:检索、更新
    数据库的保护功能:数据库中的数据是信息社会的战略资源,对数据的保护是至关重要的大事
    数据库的恢复功能:在数据库被破坏或数据不正确时,系统有能力把数据库恢复到正确的状态
    数据库的并发控制:DBMS的并发控制子系统能防止错误发生,正确处理好多用户、多任务环境下的并发操作
    数据库的完整性控制:保证数据库中数据及语义的正确性和有效性,防止任何对数据造成错误的操作
    数据库的安全性控制:防止未经授权的用户蓄谋或无意地存取数据库中的数据,以免数据的泄露、更改或破坏
    数据库的存储管理:把各种DML语句转换成低层的文件系统命令,起到数据的存储、检索和更新的作用
    数据库的维护功能:数据装载程序、备份程序、文件重组织程序、性能监控程序
    数据字典:数据库系统中存放三级结构定义的数据库称为数据字典(DD)。对数据库的操作都要通过访问DD才能实现,通常DD中还存放数据库运行时的统计信息

    2.3.3 Mysql数据库MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。

    MySQL是一种数据库管理系统:数据库是数据的结构化集合。它可以是任何东西,从简单的购物清单到画展,或企业网络中的海量信息。要想将数据添加到数据库,或访问、处理计算机数据库中保存的数据,需要使用数据库管理系统,如MySQL服务器。计算机是处理大量数据的理想工具,因此,数据库管理系统在计算方面扮演着关键的中心角色,或是作为独立的实用工具,或是作为其他应用程序的组成部分
    MySQL是一种关联数据库管理系统:关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内。这样就增加了速度并提高了灵活性。MySQL的SQL指得是“结构化查询语言”。SQL是用于访问数据库的最常用标准化语言,它是由ANSI/ISO SQL标准定义的。SQL标准自1986年以来不断演化发展,有数种版本。在本手册中,“SQL-92”指得是1992年发布的标准,“SQL:1999” 指得是1999年发布的标准,“SQL:2003” 指得是标准的当前版本。我们采用术语“SQL标准”标示SQL标准的当前版本

    MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的优点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适用于Web站点或者其他应用软件的数据库后端的开发工作。此外,用户可利用许多语言编写访问MySQL数据库的程序。作为开放源代码运动的产物之一,MySQL关系数据库管理系统越来越受到人们的青睐,应用范围也越来越广。速度和易用性使MySQL特别适用于Web站点或应用软件的数据库后端的开发工作。
    该数据库是数据和数据库对象的集合,包括表数据库对象是指(表) ,视图(View ),存储过程(存储过程)和触发(触发)等。
    数据库通过SQL(Structured Query Language)来对数据进行操作和管理,这里包括一些基本的操作如select、delete、insert、update语句。ADO ( ActiveX数据对象)是微软的数据库应用程序开发和数据库访问技术。数据库访问接口,来自不同数据源的数据。 ADO封装了很多的程序中使用的OLE DB访问接口的COM接口,它是技术的高级别访问。在数据库管理系统和接口如图2-1所示的原则。 MySQL是一个小型关系型数据库管理系统,它的快速,多线程,多用户。可以与网页文件一起方便地放在网站的目录中的MySQL数据库文件,正是由于此类特点,网站开发的数据库支持技术通常采用MySQL数据库。使用图形化的管理工具的数据库管理。
    JSP MyAdmin是一个用JSP编写的、基于Web的、跨平台的MySQL管理程序,支持简体中文,使用Web浏览器作为管理界面。通过JSPMyAdmin可以进行绝大部分的MySQL操作,包括对数据库级操作,表级操作,以及数据管理等。

    2.3.4 MySQL特点特性
    可以处理拥有上千万条记录的大型数据
    支持常见的SQL语句规范
    可移植行高,安装简单小巧
    良好的运行效率,有丰富信息的网络支持
    调试、管理,优化简单(相对其他大型数据库)
    支持多种操作系统,这意味着在一个操作系统中实现的应用可以很方便地移植到其他的操作系统下
    MySQL的核心采用完全的多线程编程
    算法优化查询SQL,切实提高搜索速度

    2.3.5 MySQL数据库应用环境相对于其他主要数据库如Oracle,DB2,SQL Server,MySQL有自己的缺点,如,如有限MySQL集群,是一个相对贫穷的效率,但它并没有降低它的声誉。一般的个人消费者和中小型企业,非常的适用MySQL数据库,不仅因为其实一个开源的软件而且体积小、速度快、总体拥有成本低,这也是使用者考虑的范畴之一。
    目前,互联网的结构来最流行的网站上的LAMP(Linux操作系统,Apache+ MySQL的+ PHP)使用的操作系统,如Linux操作系统,Apache Web服务器,服务器端脚本解释器的MySQL数据库, PHP等四个免费软件或开源软件,因为,可持续和可以创建一个免费的网站系统(劳动力成本),所以你的花费不大。
    2.4 JAVA概述Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。面向对象主要有四大特性:封装、抽象、继承和多态。

    封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性
    抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的。比如鸟就是一个抽象实体,因为抽象实体并不是一个真正的对象,它的属性还不能完全描述一个对象,所以在语言中体现为抽象类不能实例化
    继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体
    多态:多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为,多态可为程序提供更好的可扩展性,同样也可以代码重用

    2.5 J2EE技术J2EE 技术,即Java 2平台企业版(Java 2 Platform Enterprise Edition),是一种B/S模式的体系结构,是利用 Java技术简化企业应用系统开发、管理和部署等复杂问题的一套完整的体系结构。该技术由SUN公司推出,基于Java 2平台,它继承了Java语言方便、灵活、跨平台等优势,还提供了对EJB(Enterprise Java Bean)、Java Servlets、JSP(Java Server Pagers)、XML 、API等技术的支持,从而即降低了开发多层应用系统的难度和复杂性,又提供了对现有应用系统的强大支持。
    J2EE技术一般分为四个层级:客户层、WEB表示层、业务逻辑层、数据层(EIS)。如下图2-2所示。


    客户层:可以包括瘦客户端、胖客户端,用户可以与该层进行交互作用,是系统的用户界面,可以呈现出适当的视图,收集查询,显示最终结果,是用户在本地所使用的最后的模型成品
    Web表示层:接收客户层组件的要求,处理请求,然后将请求路由到业务层的适当组件;接受业务层传來的结果,计算一个适当的视图,然后将视图路由到对应客户端
    业务逻辑层:这一层由若干运行在EJB容器下的EJB组件和应用服务器组成。EJB封装了业务逻辑,应用服务器提供了JDBC技术,来访问数据库
    数据层(EIS): 将前端业务逻辑层的组件与后端数据库层连接起来,收集好的信息放在该层,供用户访问

    Web表示层和业务逻辑层是给 J2EE 发布工作任务的层次,主要是通过服务器完成工作。这两层是 J2EE 的核心层次。
    2.6 B/S结构B/S框架是目前被广泛采用的一种先进的框架结构,它是一种基于互联网的程序架构。当前的使用已经非常广泛,突破了传统的C/S结构的模式,给程序开发的模式带来新的技术革命。它是随着互联网技术的不断发展而发展起来的。随着互联网技术的不断发展,各种信息网站已经不能单独在一台电脑上使用和运行了,所以基于互联网的模式就逐步的发展起来了,并且得到了大规模的应用。
    B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易。
    B/S架构不需要在任何客户端来进行进行程序的部署,使用这样的程序结构来使用开发好的系统是利用浏览器来使用的,就是把开发好的程序配置到一台远程服务器上,在任何可以访问这台服务器的客户端电脑上都可以对程序进行操作和使用,这样的方式给使用者带来了极大的便捷。这样的结构提高了程序的运行效率,打破了地域的限制,降低了程序的使用成本。
    对于我的城市公交查询系统,我们可以把系统配置在远程的服务器上,在得到访问权限之后,只要能够上网就可以使用和访问该系统并进行相关的操作,这样的一种先进模式我们之后只需要对服务器上的程序进行维护即可保证程序的正常使用,大大的提高了工作效率,降低了维护的成本。
    C/S与B/S 区别:

    硬件环境不同:B/S 建立在广域网之上的,不必是专门的网络硬件环境,例如电话上网,租用设备,信息自己管理。有比C/S更强的适应范围,一般只要有操作系统和浏览器就行
    对安全要求不同:C/S 一般面向相对固定的用户群,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S 结构适宜。可以通过B/S发布部分可公开信息。 B/S 建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户
    对程序架构不同:C/S 程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C/S有更高的要求 B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000,Exchange2000等,全面支持网络的构件搭建的系统.SUN和IBM推的JavaBean构件技术等,使 B/S更加成熟
    软件重用不同:C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好。B/S 面对的多重结构,要求构件相对独立的功能,能够相对较好的重用,就如买来的餐桌可以再利用,而不是做在墙上的石头桌子
    系统维护不同:C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级。升级难,可能要再做一个全新的系统。B/S 构件组成,方面构件个别的更换,实现系统的无缝升级。系统维护开销减到最小,用户从网上自己下载安装就可以实现升级
    处理问题不同:C/S 程序可以处理用户面固定,并且在相同区域,安全要求高需求,与操作系统相关,应该都是相同的系统。B/S 建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的. 与操作系统平台关系最小
    用户接口不同:C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高。B/S 建立在浏览器上,有更加丰富和生动的表现方式与用户交流。并且大部分难度减低,减低开发成本
    信息流不同:C/S 程序一般是典型的中央集权的机械式处理,交互性相对低

    B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化,更像交易中心。
    2.7 Tomcat服务器Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP[15]程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 服务器部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 服务器时,它实际上作为一个与Apache 独立的进程单独运行的。
    当配置正确时,Apache 为HTML页面服务,而Tomcat 服务器实际上运行JSP 页面和Servlet容器。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat服务器的默认模式。不过,Tomcat服务器处理静态HTML的能力不如Apache服务器。目前Tomcat服务器最新版本为8.0.0。
    Tomcat 服务器运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。因此利用Tomcat服务器作为集群服务器管理系统的Web应用服务器。
    2.8 Web技术网络对人类生活的影响是革命性的。它改变了人们传统的生活方式,有了网络人们可以从众多的信息中搜索,然后找到自己想要的部分;无论何时何地人们都可以通过网络与朋友取得联系,通过网络可以坐在家里就能够认识来自世界各地的陌生人,还可以登陆网上银行或在网上购物,足不出户就可以货比三家。
    网络的快捷是大家有目共睹的,只要几秒种的时间就可以把一封电子邮件发送到大洋彼岸。可以让处在地球上不同角落的人在同一时间收到同一条讯息,这种传递信息的方式可以让消息的传送者与接收者之间能够及时进行互动,快捷的信息交流的方式服务了全人类。
    网络是非常自由的,在网络上人人都是平等的,无论是什么身份什么地位的人都有权力发表自己的观点和看法,做自己想做的事情,不必有所顾忌,不用在乎对方的职位、年龄。
    创新性是网络的另一特性。每一项技术的发展都离不开创新,网络技术的发展也是如此。不断创新是网络之所以始终保持旺盛的生命力的根本,这种创新性也让我们不断地接收新的观念,学习新的技术,从而引导我们更好地去发展我们社会。
    Web技术提供了下面的优点:

    一个提供了很好的用户体验,让用户能很容易地完成任务,并利用了设备本地的一些性能
    一个web应用提供了丰富的视觉体验,又不会分散人的注意力;它注重美学,使用和本地应用一样的设计模式,又不失易用性
    一个web应用非常注重用户的交互、参与和完成任务,而不是让他们仅仅浏览网页。应用程序是自包含的(self-contained),也即用户不用导航到其他站点或者应用来完成任务

    3 系统需求分析3.1 需求分析软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通过对应问题及其环境的理解与分析,为问题涉及的信息、功能及系统行为建立模型,将用户需求精确化、完全化,最终形成需求规格说明,这一系列的活动即构成软件开发生命周期的需求分析阶段。
    需求分析是介于系统分析和软件设计阶段之间的桥梁。一方面,需求分析以系统规格说明和项目规划作为分析活动的基本出发点,并从软件角度对它们进行检查与调整;另一方面,需求规格说明又是软件设计、实现、测试直至维护的主要基础。良好的分析活动有助于避免或尽早剔除早期错误,从而提高软件生产率,降低开发成本,改进软件质量。
    3.1.1 设计的原则
    可用性原则:开发此系统本着以方便乘客查询准确的公交信息和方便用户对公交系统合理安排调度为原则
    可靠性原则:必须为管理员和用户提供安全的服务,尤其是要保证从 Internet 上可以访问到的后台用户管理,公交信息管理等功能的安全性
    友好性原则:使城市公交信息查询系统的操作上要求简单方便,便于用户和管理员掌握
    可维护性原则:能够对用户提出的相关的需求对该软件进行相关的修改和维护

    3.1.2 系统设计目标
    分析国内外公共交通建设及公交查询的研究现状和特点,简述学者在公交网络路径算法研究的发展历程
    分析系统的需求。研究乘客出行的心理和行为,包括乘客获取公交信息的 途径、关注的信息、出行的考虑因素等,从用户角度分析得到系统需要完成的目标 和功能
    设计系统的总体框架。介绍系统的开发环境和流程,从总体上设计系统的 功能,根据系统功能划分子模块,并详述每部分需要完成的功能,设计数据库
    查找了解现有公交查询系统的网络路径最优算法。分析城市的公交线路特点,通过对地理公交网络的抽象,建立了公交网络的路径模型,并在此模型基础上,探讨了公交网络的最优路径算法
    详述系统的设计与实现过程。对系统各模块的具体实现和结果给出了清晰的说明,以拟定的路线为实验数据,给出了查询的结果分析
    总结了查询系统的特点以及一些不足之处,并对系统的改进作了展望

    3.2 系统可行性分析可行性分析包括现有的条件和解决的问题,研究方法的分析,采用的技术路线,实验方案的可行性。现有的条件是:对城市公交查询系统的研究和体会,本人计算机完备的软硬件,对文献资料的准备。要解决的问题是实现页面的设计,数据库的建立,数据库连接和创造,每一个表的文件上传功能。
    3.2.1 经济可行性分析由于本系统属于小规模管理使用的系统,整个系统比较小,因此开发成本不是特别大。本人独立完成了整个开发过程,实现全部的开发任务只需要一台PC机和上述的各种软件。由于PC机是我原有的,而且无需专门升级硬件;而在网上又可以免费下载各种软件,因此,整个开发成本较小,这也为我们提供了非常大的方便,可以进一步完善网站。在使用成本上,连接国际互联网上的计算机,用户只需要拥有一台能够了,在世界的任何一个角落使用网站所有功能和服务只需要通过注册就行了。并且没有很高的要求计算机的硬件,软件方面也没有别的要求,访问与使用具有广泛性。因此,从经济可行性分析来看,这个系统体现了经济实惠,但是功能强大的特点。
    3.2.2 技术可行性分析本课题使用的是Java技术,开发平台选用MyEclipse,MyEclipse有这完整配备的功能,便于初学者使用还有代码提示,让我使用更加得心应手。在决定好编程框架后,再说用Java语言编码的优点:效率高、可重用性强、代码量少等。同时,使用的数据库是MySQL,开源的MySQL增添了可视化和稳定化的优点,而且安全方面也做得很好,更别说它的强大的保存数据功能以及查询数据功能。
    3.3 用户需求要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行。所以乘客可以通过对车站站点查询、公交线路查询、站-站查询三种查询形式。同时设有管理员管理界面,负责添加、修改、删除指定的公交线路信息,为了更好的适应公交查询系统的实时性,使本系统更加完善,能更好的为用户所利用,我觉得还设计了在线提问和网站发布公告功能,在线提问能很好,很快的知道市民对公交查询系统的意见和一些对线路上不明确的提问,而网站发布功能则能更好的帮助政府和公交公司发布新闻和紧急情况,方便市民的知晓。因此,该系统需满足以下几方面需求:

    查询功能:系统需要提供几种不同方式的查询手段,包括根据公交线路、日常站点、和任意两个站点查询乘车路线。其次,采用算法查找任意两个站点之间的乘车路线。具体功能如下所述:

    根据公交站点进行相应的信息查询根据公交线路进行相应的信息查询通过选择任意两个站点,完成两站点之间最短乘车路线查询
    用户管理功能:主要是删除用户信息和修改用户基本信息

    后台车次管理功能主要包含添加车次和站点功能、更新车次和站点功能、删除车次和站点功能,这样做到系统实时更新,为用户查询提供更为准确的信息。具体如下:

    完成车次和站点添加功能
    完成车次和站点更新功能
    完成车次和站点删除功能
    用户登录验证功能
    用户注册信息功能
    用户注销功能
    删除用户信息功能
    在线提问功能:在线提问主要包括用户对公交线路疑惑的问题发布,旨在让市民和政府和共同为提出疑问的市民进行解决和讨论
    网站公告发布功能:进行一些实时新闻的发布,包括线路的绕行,公交车价格的调整,以及一些实时的路况信息,均可通过此来查询,旨在为用户提供一个实时的,便捷的公交插叙系统

    3.4 系统功能需求概述需求分析就是分析用户的需要与要求。如果需要评估的结果准确地反映用户的实际需求,这将直接影响到方案设计的整个阶段,而且对系统的使用产生影响。着眼于需求评估是完成调查,收集和研究,并可能受到影响的数据管理和安全信息的需求的过程。一般使用者都相对缺少相关的计算机方面的知识,并且可以确定计算机是否可以为自己做什么,不能做什么,所以无法非常准确的去表达自己的需求,但是他们是最终的用户,他们的需求才是最终的需求,但是技术人员缺少用户的专业方面的知识,不是很容易理解到用户的真正需求,有时候可能还会误解到用户的需求;新的硬件和软件技术的出现也会让系统的业务需求得打变化。所以技术人员必须要使用一些得到的方法来保证可以与用户不断的交流这样才可以确定用户最终的需求。通过与用户不断深入地进行交流,了解到目前系统存在的主要问题。
    需要研究是从用户分析和细化的信息,在功能和性能上有描述。它是软件开发过程中的第一阶段的一部分,主要任务是要了解你需要什么,什么应做的工作,以确定系统的,因此在目标系统提出完整,准确,清晰,具体的要求,并表示以书面形式唤醒。
    软件的用户界面是与该对象最直接的接触,包括是否允许用户简单,方便使用,该请求的响应时间,对整体的用户感受有很大落差。
    要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行;手动(目前)、自动(将来)、及时更新查询数据。因此,该系统需满足以下几方面需求:

    查询功能:系统需要提供几种不同方式的查询手段,以实现灵活方便地管理整个系统
    数据的更新修改

    更新:系统允许管理员级别的用户对数据进行更新、修改并且存盘操作编辑:系统允许管理员级别的用户对数据进行编辑、删除的操作,保证现库的真实性与实时性

    系统采用B/S模式。整个系统最关键的就是数据库系统,一个强大的数据库可以支持完善一个优秀的软件设计,通过软件系统与数据库系统的连接来实现通过软件界面观察和处理操作数据。
    3.5 运行环境本系统是一个WEb版的应用程序,需要在服务器上部署中间件Tomcat、MySQL数据库,其他的客户端通过网络进行访问该服务器即可。

    开发硬件平台

    CPU:酷睿双核 3.2GHZ内存:4G以上硬盘:500GB
    服务器端硬件平台

    服务器参考配置:Intel Xeon Quad Core E5530 80W 2.40GHz/5.8GT/8MB Cache, 2x2GB DDR3-1066MHz, 2.5in HS 146GB SAS,HS 675W PSU, ServeRAID MR10i(RAID 5), 2*Giga Ethernet,Light Path, CD-RW/DVD Combo, 1U,3 Years Onsite Next Business Day. 146GB 10K 6Gbps SAS 2.5” SFF Slim-HS HDD x3550M2/x3650M2/HS22
    开发软件平台

    操作系统:Window 8 或Win 7均可数据库:Mysql

    4 系统概要设计4.1 概要设计的概论软件概要设计的核心内容就是依据需求规格或规格定义,合理、有效地实现产品规格中定义的各项需求。他注重框架设计、总体结构设计、数据库设计、接口设计、网络环境设计等。概要设计是将产品分割成一些可以独立设计和实现的部分,保证系统的各个部分可以和谐的工作。概要设计的原则包括:模块化和分层细化、模块独立和信息隐蔽。
    4.2 架构设计系统采用B/S模式架构。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix 、SQL Server或 MySQL等数据库。浏览器与同数据库进行数据交互,可以通过Web Server实现 。
    我们的系统使用的应用程序开发模型的B / S结构的三个阶段。目前,互联网应用架构,事务处理分为三个层次,即Web浏览器的互联网服务器数据库服务器。在这种架构中,通过Web浏览器业务表现是容易执行,用户通过Web浏览器提交表单时,将信息提供给消费需求的Internet服务器,Internet服务器,所需的分析查询,数据库服务器,数据库服务器执行,数据库服务器的查询结果返回给使用标准的HTML语言返回给Web浏览器的Internet服务器,Internet服务器。
    4.3 系统功能结构图及分析4.3.1 系统功能结构图系统功能结构图如图4-1所示:

    4.3.2 系统基本功能系统功能的划分方式可以分成很多种类,但是我按照界面流程将它分为了两大模块,第一个模块为前台查询模块。前台查询包括:站点查询,公交线路查询,站-站的查询,在线提问,网站公告。第二个模块为后台管理模块,后台管理模块包括:用户管理、线路维护、公告管理、提问管理。下面本节主要对各个基本的功能进行一个简要的介绍。
    站点查询
    站点查询是本系统的主要功能之一,为用户倒车提供前提条件,用户可以根据自己所到的站点,查询本站所经过的公交线路,从而完成换乘,前往自己的目的地,进入系统首页,在站点查询的对话框内输入自己要查询的地点,接着会转入到另一页面,这个页面包含了经过这一站点的所有公交线路,可点击查看,了解自己需换成的公交车的车号,完成换乘。
    公交线路查询
    公交线路查询是不系统不可缺少的功能之一,用户可根据自己了解到的公交线路名称,查询该线路途经的站点,事先了解好自己所要经过的站点,提前做好下车准备,防止自己下错站,进入功能页面,在公交线路的对话框里输入所要乘坐的公交线路名称,之后会出现匹配的公交线路,点击查看,了解自己的所经的站点信息。
    站—站的查询
    此功能是整个系统的核心,也是最便捷的公交查询方法,只要用户输入自己的位置,以及所要到的位置,就会出现公交线路名称,途径站,以及所要换乘的下一班车,无需自己查看,系统自己就会给成乘车意见。进入页面输入自己的起始站,然后在第二个对话框输入自己要到达的站点,系统将显示出换乘的路线,这个功能十分的便利,深受广大市民的喜欢。
    在线提问
    在线提问功能是本系统的辅助功能。用户可根据自己对公交线路的不明确,向广大的市民发出提问,也可以抱怨本系统的不完善的地方供系统的设计者进行修改,完善系统的功能。
    网站公告
    网站公告功能也是本系统的辅助功能,用户可以点击此模块,查看网站管理员发布的公交信息,包括一些公交价格的调整,以及道路的施工导致的公交线路的绕行都可以在上面发表。
    登录功能
    登录功能是一个系统的重要组成部分,也是一个系统重要的门户功能,登录功能主要实现了使用者对系统的登录,在本文所设计的系统中,登录主要分成了两种登录身份:一般用户登录和管理员登录。两种身份登陆,能细分系统的功能模块,实现更加方便的操作和管理。
    用户管理
    用户管理是一个系统的重要功能之一,对用户的管理可以实现对系统使用者的了解和查看,能让使用者更加方便的使用本系统,用户的种类分为多种,本文主要体现在一般用户和管理者两种用户上面,可以对用户的信息进行添加修改,也可以删除和禁用用户。
    线路维护
    线路维护是对此系统功能的最大的保障,一个系统的基本功能是否可以实现全靠此功能维护,线路维护功能可对现有公交线路进行修改和删除操作,也可添加新的公交线路,这部分属于管理员用户的功能。
    公告管理
    公告管理是对前面所说的公告发布的一种监管,管理员用户可对已经发布的公告就行修改和删除,也可对新的公告进行添加,旨在为用户提供一个实时的公交线路查询的体验,方便乘客出行。
    提问管理
    提问管理是系统管理员对在线提问内市民发布的问题进行答复的功能,这个功能是系统管理员与市民进行交流的一个模块,管理员不仅能回答市民的问题,也可以发布一些问题征求市民的意见。
    4.4 系统用例图4.4.1 UML用例图简介用例图用来确定需求的范围,这些需求是设计开发的依据。用例图将系统看作黑盒,从外部执行者的角度来理解系统。
    用例图展示了用例之间以及同用例参与者之间是怎样相互联系的。用例图用于对系统、子系统或类的行为进行可视化,使用户能够理解如何使用这些元素,并使开发者能够实现这些元素。
    下面简要介绍一下用例图中的组成元素:

    角色(Actor)是与系统中的用例交互的一些实体,在实际情况中,角色可以是人,也可以是其他系统或者硬件设备。在画用例图的过程中,角色往往是第一个被确定的,因为系统或者用例在开始时是模糊的,但是参与系统的角色是最容易明晰的。有了角色之后,根据角色与系统的交互,以及角色要求的功能,可以进一步确定系统和用例
    用例(Use case)指的是系统的功能,它是系统某个功能的所有执行动作的集合。在UML图示中它是一个椭圆,但是具体分析用例的时候需要给出这个用例的所有执行动作的步骤
    连接(Assocation)是角色与用例的连接,表达此角色可以初始化此用例
    注释(Note)可以添加到任何地方,对用例图的不同部分加以说明
    泛化(Generalization)在面向对象的技术中无处不在,它的另一个名字也许更为著名,就是“继承”

    4.4.2 系统用例图系统总用例图如图4-2所示:

    此用例图给出了系统所有用户的操作用例的框架,包括乘客用户和后台管理员用户,乘客用户的操作登陆浏览器,进入查询页面,选择查询方式,在线提问,以及查看发布的公告等功能,而后台管理员则可进行用户管理,线路管理及公告发布等功能,根据此用例图一目了然一般用户和管理员用户的职责。
    后台管理系统用例图如图4-3所示:

    后台管理用户包括的工作有:公交线路管理、公告发布管理、用户管理。公交线路管理包括对所用公交线路的进行的增加还有删除操作的功能。公告发布管理包括对公告的增加和删除操作,用户管理就是对所有使用该系统的管理员用户进行的管理,包括增加用户和删除用户。
    4.5 技术架构所使用的架构是系统建设的关键,传统c/s架构,访问和操作已经不能满足大量用户需求,目前网络系统应用的主流是b/s,它基于浏览器的架构,可以交给服务器端来处理大量的数据处理工作,只用通过普通IE浏览器的客户端,还可以访问系统,操作起来方便快捷,而且利于更新和维护系统,在该方面具有优势的是java语言。
    系统三层架构如图4-4所示:

    4.6 数据库结构设计数据库设计( Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求。
    4.6.1 数据库设计的原则数据库的结构分析在系统开发前的设计中占有很重要的位置,一个好的系统离不开一个层次清晰、功能完整的后台数据库结构。
    在设计数据库时,应尽量分离各个实体和表,一个实体对应一个表;同时,应明确各实体间的关联,明确各实体间的属性,以便确定它的字段。总之,在设计数据库时,应注意各表间的独立性和关联性,这是一个好的数据库结构首先要具备的条件。下面给出了数据库设计中的几点要求:

    规范命名:所有的库名、表名、域名必须遵循统一的命名规则,并进行必要说明,以方便设计、维护、查询
    控制字段的引用:在设计时,可以选择适当的数据库设计管理工具,以方便开发人员的分布式设计和数据小组的集中审核管理。采用统一的命名规则,如果设计的字段已经存在,可直接引用;否则,应重新设计
    库表重复控制:在设计过程中,如果发现大部分字段已经存在,开发人员应怀疑所设计的库表是否已经存在。通过对字段所在的库表及相应设计人员的查询,可确认库表是否确实重复
    并发控制:设计中应进行并发控制,即对于同一个库表,在同一时间只有一个人有控制权,其他人只能进行查询

    4.6.2 数据库结构分析根据系统功能的要求,本系统管理和维护的数据元素(Entity 实体)有:系统用户、普通乘客用户、公交线路、公告发布,在线提问,提问评论。

    系统用户实体包含这样一些基本属性:系统用户的ID、登录账户、密码、姓名、联系电话、系统用户的状态。其中,系统用户的ID是用户的唯一标志。系统用户能够实现系统的登录,完成对后台公交线路的管理,包括对线路的添加和删除操作,还有对所有用户的管理,对公告发布的管理
    普通乘客用户可以直接点击主页上的公交信息查询按钮进入查询功能:包括两个站点之间的查询、根据公交线路进行查询、根据站点进行查询。还可以进行公告的查看和在线提问和评论
    公交线路的基本属性有:公交线路id,公交线路名称,公交线路所经站点,公交线路开始时间,以及公交线路终止时间
    公告发布的基本属性:公告id,公告的正文以及公告发布的标题
    在线提问的基本属性:问题id,问题的描述,问题的状态,问题发布的时间,问题的标题,问题发布者id

    4.6.3 数据库概念模型现今应用的最广泛的数据库是关系型数据库。因为它是一个面向对象的系统设计,当然,数据库的设计,必须是面向对象的。现在应该怎么考虑对类进行持久性操作,即对象类是怎样映射到关系数据库的二维表中的。现今,像PowerDesigner、Rose 等都可以采用数据库建模工具来实现。
    用户的信息实体图如图4-6:

    公交线路实体图如图4-7:

    公交公告发布实体图如图4-8:

    公交在线提问实体图如图4-9:

    4.6.4 部分数据库数据表字段设计在物理结构设计阶段,首先应该分两步走:

    一是,在关系数据库中,确定数据库的物理结构,主要是指存取方法和存储结构。时间和空间效率是对物理结构的评价
    二是,要选取存取方法,并且是正确的关系模式,存取索引方法、聚簇存取、HASH存取方法等都是常用的方法

    依据以上规范数据库的部分表设计见下页:
    用户表如表4-1所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    userid
    char
    11
    用户id


    2
    password
    varchar
    20
    密码


    3
    phone
    varchar
    15
    用户联系电话


    4
    ralname
    varchar
    30
    用户姓名


    5
    state
    varchar
    2
    用户状态


    6
    username
    verchar
    20
    用户账号


    7
    usertype
    verchar
    20
    用户的类型



    公交线路信息表如表4-2所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    bid
    char
    11
    公交线路id


    2
    bname
    varchar
    30
    公交线路名称


    3
    buspath
    Longtext

    公交线路站点


    4
    endDate
    varchar
    30
    公交线路起始时间


    5
    startDate
    varchar
    30
    公交线路终止时间



    公交系统公告发布信息表如表4-3所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    pid
    char
    11
    公告发布id


    2
    content
    varchar
    255
    公告发布正文


    3
    title
    varchar
    30
    公告发布标题



    公交系统在线提问信息表如表4-4所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    talkid
    char
    11
    在线提问id


    2
    talkcontent
    varchar
    255
    在线提问内容描述


    3
    talktime
    varchar
    30
    在线提问的时间


    4
    talktitle
    varchar
    30
    在线提问的标题


    5
    talkuserid
    char
    11
    在线提问的用户id



    5 系统详细设计详细设计是将解决问题的办法进行具体化。详细设计主要是针对程序开发部分来说的,但这个阶段是不真的编写程序的,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的代码。
    详细设计是将概要设计的框架内容具体化,明细化,将概要设计转化为可以操作的软件模型。在实际项目进行过程中,这个过程可以省略,主要是视项目的具体情况和项目要求而定,可以有详细设计,也可以直接按照概要设计进行编码。这个过程主要是保证编码的顺利进行,可以预先扫清编码过程中的障碍,提高代码的质量和编码的效率。详细设计的结果决定了最终的程序代码的质量。详细设计不仅仅要逻辑上正确的实现模块的功能,更重要的是设计出的出处理过程应该进可能简明易懂。
    5.1 系统数据库连接配置<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/newspubs"> </property> <property name="username" value="root"></property> <property name="password" value="123456"></property></bean>
    5.2 系统流程图的分析设计5.2.1 用户登录流程图用户登录流程图如图5-1所示:

    进入用户登录界面,首先输入用户名和密码,点击登录按钮,后台就行用户名和密码的匹配环节,如若俩个都正确及进入该用户界面,倘若有一个不对则登录失败,系统会提示用户重新输入。
    5.2.2 会员注册流程图会员注册的流程图如图5-2所示:

    用户注册进入注册页面,注册内容有,账号,密码,姓名以及手机号,当将这些信息输入之后,后台数据库会比对用户输入的信息是否有无注册,假如已经注册,系统则会提示用户这个信息已经注册过,需要重新输入,假如没有比对成功,则成功建立相应的账户,并在数据库中得以保存。
    5.3 系统登陆模块实现用户系统主要分为俩大类:一类是一般用户,一类是管理员用户。
    由于系统功能的特殊性,前台使用者不用登陆就可以实现公交查询的功能。
    第一部分主要是一般用户,一般用户可以随意注册,注册的信息主要包括:用户的账号,用户的密码,用户的信息,还有用户的电话这四大部分,注册的信息会同数据库中已存在的信息进行对比,查看是否重复,如果重复则重新输入。注册成功就可进行一般用户的登录,比对用户账号和密码是否正确,若正确登录成功,反之重新提醒用户进行登录。
    一般用户登录界面如图5-3所示:

    第二部分为管理员用户登录,因为管理员用户的登录界面不能存在注册按钮,所有管理员用户的信息必须从数据库中直接录入。
    实现的过程主要有几个步骤,进入首页后点击右上角的进入后台按钮,将会看到图5-4的登录界面,按照要求输入管理员用户的账号密码,首先对管理员输入的信息进行保存然后利用程序从数据库中进行检索看是不是有管理员输入的信息在数据库中是否存在如果存在就返回正确的结果,如果不正确就返回错误的结果。如果结果数据库中存在就显示登录成功,如果数据库不存在就显示失败请重新登录。
    管理员用户登录界面如图5-4所示:

    5.4 前台功能模块设计5.4.1 公交查询设计本系统的首页设计为查询界面,为的是方便高效和快捷,此系统查询分为三大功能:第一个功能为站-站的查询功能,第二个是公交线路的查询功能,第三个是公交站点的查询功能。接下来将介绍三大功能:

    站—站的查询功能:用户可将准备出发的起始站点和终止站点分别对应的输入到换乘查询的输入框内,系统会根据用户输入的站点信息,列出提供的换乘路线,系统将优先查找到的直达公交线路排在前面,方便用户的选择
    公交线路的查询功能:用户可以输入完整的公交线路号进行查询公交线路,系统会筛选出匹配的线路,用户可以点击查看,查看所查到的公交线路,里面有每个线路确切的途经站点
    公交站点的查询功能:用户在不了解公交线路的情况下,可以搜素要到达的公交站点,输入自己要到达的地点,公交查询系统会对比数据库为用户匹配出所有进过这一站点的公交线路,用户可根据此来选择乘坐的线路

    查询界面如图5-5所示:

    用户输入起始站与终点站查到的结果如图5-6所示:

    用户输入公交线路查询如图5-7所示:

    用户输入公交站点查询如图5-8所示:

    5.4.2 热门线路功能模块设计热门查询线路模块列举了所有在数据库中的公交线路,本人在网上随意挑选了一些公交线路录入其中,市民可以在热门线路中查看所有公交线路,挑选符合属于自己出行的公交线路
    下图是热门线路模块的界面,如图5-9所示:

    5.4.3 网站公告功能模块设计用户点击网站公告模块后会看到管理员发布的公交新闻,包括一些公交线路的改道,还有公交价格的调整,网站公告由后台管理员进行上传。
    下图是网站公告功能模块的实现界面图,如图5-10所示:

    下图是网站公告内容的详细信息,如图5-11所示:

    5.4.4 在线提问模块设计在线提问模块旨在帮助乘客解决他们在实际的乘车过程中遇到的困难,以及对城市公交查询系统的建议,这是一项非常人性化的设计,因为设计员并没有真正的参与使用,有些问题体会不到,用户可在此模块发表问题,提出自己的见解,也可在此回答其他市民的疑惑。
    下图是在线提问功能模块的界面,如图5-12所示:

    5.5 后台功能模块设计管理员的设置是为了系统能够安全的、系统的平稳运行,本系统为管理员设置了用户管理、公告管理、线路维护和会员提问四大功能模块。

    用户管理:用户管理是对已注册用户的基本信息进行更新维护;主要包括对用户的添加,用户的删除,用户的修改
    公告管理:公告管理是对公告进行发布和对已发布公告进行修改和删除操作,保证公告的实时性,及时添加新的公告,也要删除旧的,无用的公告
    线路维护:线路维护主要是对新线路进行添加和对不用线路的删除,以及对现有线路的修改
    会员提问:对市民提出的问题进行答复,帮助市民解决出行问题,更好的完善城市公交管理系统

    用户管理的实现界面,如图5-13所示:

    线路维护管理管理的实现界面如图5-14所示:

    公告管理的实现界面如图5-15所示:

    6 系统测试6.1 程序测试网站测试是软件设计的最后一道工序,也是非常重要的一步。用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。通常网站测试包括:功能测试,安全测试,可用性测试,性能测试、兼容性测试等方面。
    在系统设计的过程中,这是必然的,存在一些错误。对于错误的语言和语法,程序在运行时,会自动提示你错的地方,并请求立即修改,所以,这样类型的错误是比较容易发现和纠正的。但另一类错误是在程序执行时由于不正确的操作,或是导致的错误结果的对某些数据的计算公式的逻辑错误。这类错误隐蔽性很强,时而出现,因此,这是非常耗时费力的,对这一类动态发生的错误的排查。
    软件测试,描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
    为了使本软件运行更加稳定,我对它进行了全面的测试,其中测试分为二部分,一种是界面测试;另一种功能测试。
    首先我们来说界面测试,界面测试是为了使程序在不同的的操作平台上能够运行界面,并且能够保持原来的风格。经测试程序运行正常,运行界面上的字体图片等设置都能够保持得非常好。不出现字体变形等情况。
    其次进行功能测试。该系统测试采用的是单元测试,集成测试,完善性测试等多种方式进行测试。
    经过测试,所有功能都能得以实现,没有任何变形。至此,在功能的测试上也已经比较圆满的完成了。
    6.2 测试的重要性及目的6.2.1 测试的重要性系统测试是开发一个管理信息周期中非常重要而且漫长的的阶段。其重要性体现在他是保证系统质量与可靠性的重要关口,是对整个系统开发过程的最终审查。
    系统测试的主要任务是尽可能的检查出程序中的错误,提高系统的可靠性,主要的目的是位列检验系统“做得如何”。其中这一阶段又可以分为三个步骤:模块测试;组装测试;确认测试;通过测试整个管理系统来确定能不能够满足用户的需求。通过测试发现问题以后,我们要经过不断的调试找出错误具体原因和位置,然后对其进行修改。
    系统开发完成后就需要进行系统测试,测试在一个软件的开发过程中是非常重要的,其意义在于:

    发现软件错误
    有效定义和实现软件成分由低到高层的组装过程
    验证软件是否满足任务书和系统定义文档所规定的技术要求
    为软件质量模型的建立提供依据

    6.2.2 测试的目的Grenford J.Myers曾对软件测试的目的提出过以下观点:

    测试是为了更好的找出程序中存在的问题、错误
    好的测试方案是很有可能是到现在为止仍然未被发现的错误的测试方案
    成功的测试则是找出了至今仍然没有被发现的错误的测试
    测试并不单纯是为了找出错误。而是通过分析错误,来找出产生错误的原因,来避免发生错误,帮助程序员找出软件开发过程中的缺陷,以便及时进项改正
    测试是为了检验修改或优化过程是否引发新的问题、软件所能达到处理能力和是否达到预期的处理能力等

    6.3 测试的步骤就像开发过程,测试过程中要完成的一步一步的逻辑上的每一步都是在继续之前的一个步骤。由许多个子系统是大型软件系统,并且多个包括各子系统模块的。因此,一个软件系统的测试基本上由以下步骤组成:

    测试模块,编码和详细设计错误往往在本测试程序中找到
    在此测试步骤中遇到的测试系统的软件错误的设计,规范的要求的错误也可以找到
    系统需求规格说明书的错误也是在这个测试程序进行验收测试发现

    在我们设计软件的过程中,测试系统常用的测试方法主要有两种:功能测试和结构测试。
    功能测试也被叫做黑盒测试和数据驱动测试,是在已经知道系统应该具有的具体功能的情况下,通过黑盒测试来测试系统功能是不是能够正常运行。在测试时,将系统当做不能打开的盒子,在不管系统内部结构与特性的状况下进行测试,它只检查系统功能是不是根据系统说明书的规定正常运行的,同时检测系统是否能正确接收的输入信息和输出信息的正确对应,并保持系统的完整性的外部信息需求。
    白盒测试与黑盒测试相反,它了解系统内部工作的各项具体程序,能够通过测试来检查系统内部的运行是不是按照系统说明书的规定进行正常运作的,因此,白盒测试又被叫做结构测试和逻辑驱动测试。根据测试程序的结构在每个道路试验,当系统运行时不是能按预定要求正确运行,无论其功能如,白盒测试试验,道路试验是一个逻辑驱动器,这种测试主要用来软件测验。
    首先我们来说界面测试,界面测试是为了使程序在不同的的操作平台上能够运行界面,并且能够保持原来的风格。我把完整程序拷贝到不同版本的电脑平台环境下,程序运行正常,运行界面上的字体、图片等设置都能够保持得非常好。不出现字体变形等情况。
    其次进行功能测试和性能测试,功能测试主要包括五项内容:适用性、准确性、可操作性、依从性、安全性。
    系统性能测试主要是通过模拟系统运行环境,测试系统性能是否符合客户的需求。性能测试的重要技术指标是:系统的运行速度、系统响应的时间和支持并发节点数。
    最后进行系统的可用性测试,可用性测试用于检测系统的可理解性、可操作性和学习性等方面内容。
    6.4 测试的主要内容测试过程分为哪会保证测试,即质量几个阶段:代码审查,单元测试,集成测试,确认测试和系统测试。

    单元测试:集中在一个小软件单元设计审查 - 模块是一个测试单元,意识和定义模块的功能实际发现,这种情况不符合测试说明和编码错误
    集成测试:集成测试模块安装在根据进行集成测试的设计要求,其主要目的是为了发现问题相关的接口。例如有可能是一个问题,由于疏忽,与其他模块的模块,并造成有害影响;不能产生所需的功能键,组合功能;看起来可以接受的个别错误是不可接受的,当积累;可能有错误,如整个数据结构
    确认测试:该试验的目的是验证,该系统能够工作如期,根据需要,以显示未来的用户。集成测试后,已经把一个完整的软件系统,设计按照完成安装的所有模块,从根本上推动问题接口错误的,那么软件的有效性将能够得到进一步的确认,试验工作证实,它是功能和软件的性能,如用户所期望的
    系统测试:在软件开发完成后,并且系统将最终在包的其它部分,在测试系统上执行。包括恢复测试,安全性测试,强度测试和性能测试

    系统测试主要从以下几个方面:

    功能测试:测试满足发展的需要,旨在提供这里所描述的功能,用户需求是否得到满足。功能测试是测试最常用的系统和强制性测试和正式的规格通常是标准的软件测试
    强度测试和性能测试:该测试系统的最大实际程度的能力,即在某些情况下,负载的软件功能进行
    安全测试:验证内置到系统中的保护机制,它可以保护系统,所以从很不安。该系统主要是针对权限对系统进行测试,并为void仅仅是数据,错误的数据和测试数据的非法干扰的能力

    6.4.1 功能测试功能测试主要包括五项内容:适用性、准确性、可操作性、依从性、安全性。
    本系统功能测试如表6-1所示:



    测试内容
    测试结果




    适用性



    准确性



    可操作性



    依从性



    安全性




    本系统功能测试测试用例6-2所示:



    测试标识
    测试项目
    测试用例输入及说明
    预期结果
    测试记录




    用户管理模块功能点
    新增用户
    系统管理员单击”新增”按钮
    成功进入到新增用户界面
    测试通过


    用户管理模块功能点
    登录全部置空
    令所有文本框为空
    提示(请输入账号密码)
    测试通过


    用户管理模块功能点
    提交新增用户信息
    在新增用户界面输入有效数据并点击提交按钮
    显示注册成功
    测试通过


    用户管理模块功能点
    删除用户
    在界面上点击要删除的用户,并点击删除按钮
    删除成功,并退回到用户管理界面
    测试通过


    用户管理模块功能点
    编辑用户
    系统管理员单击”编辑”按钮
    成功进入到编辑用户界面
    测试通过


    公告管理模块功能点
    新增公告
    系统管理员单击”添加”按钮
    成功进入到新增公告界面
    测试通过


    公告管理模块功能点
    全部置空
    令所有文本框为空
    提示(标题不能为空)
    测试通过


    公告管理模块功能点
    提交新增公告信息
    在添加公告界面,点击保存
    添加成功后跳转到公告界面
    测试通过


    公告管理模块功能点
    删除公告
    系统管理员点击删除公告并点击删除键
    显示删除成功并跳转到公告界面
    测试通过


    线路维护模块功能点
    新增线路
    系统管理员单击”添加”按钮
    成功进入到添加线路界面
    测试通过


    线路维护模块功能点
    全部置空
    令所有文本框为空
    提示(线路名称不能为空)
    测试通过


    线路维护模块功能点
    提交新增线路信息
    在新增线路输入有效数据并点保存
    添加成功后跳转到线路维护界面
    测试通过


    线路维护模块功能点
    编辑线路
    系统管理员单击”编辑”按钮
    成功进入到编辑线路界面
    测试通过


    题目管理模块功能点
    删除线路
    点击删除的线路再点击删除按钮
    显示删除成功
    测试通过


    会员提问模块功能点
    查看问题
    点击查看按钮
    成功查看问题
    测试通过


    会员提问模块功能点
    回复问题
    点击查看问题并参与回复
    成功增加回复内容
    测试通过



    6.4.2 可用性测试可用性测试用于检测网站的可理解性、可操作性和学习性等方面内容。具体测试方面如表6-3所示。



    测试项
    测试人员的评价




    窗口移动、改变大小、关闭等操作是否正常



    操作模块是否友好



    模块和提示内容等文字描述是否正确



    模块布局是否合理、协调



    模块的状态是否正确(对选中项能否发生对应切换)



    键盘、鼠标操作是否支持



    所需的数据项是否正确显示



    操作流程是否合理



    是否提供帮助信息




    6.4.3 性能测试系统的性能测试主要是通过模拟网站运行环境,测试网站性能是否符合客户的需求。性能测试的重要技术指标是:网站的运行速度、网络响应的时间和支持并发节点数。

    测试网站的运行速度:通过在不同的计算机上进行试运行本网站,没有发现任何停顿、迟滞现象
    测试网络响应时间:网络响应时间主要包括:网络最小响应时间、平均响应时间和最大响应时间这三个参数。经过测试,在网络运营良好状态下,局域网内响应时间三参数为:1/2/5s,外网响应时间三参数为3/7/12s,符合客户的需求,属于在用户的心理可承受范围内
    支持并发节点数:经过模拟的环境测试,本网站在并发节点达到45个时,网络运营的速度会发生比较大的波动,延迟时间10秒左右,符合客户需求

    6.5 测试结论由于自己独立写的项目不多,考虑问题肯定会不周全,存在很多的难以预料的问题,写的功能有时候也难以满足用户需求,代码和接口也会出现很多问题,不规范的书写习惯,都会导致项目不无法达到用户的目标,无法让用户放心的使用,用户体验效果差。正是因为这样所有的项目在交付用户使用之前,必须经过专业技术人员的测试,一个好的项目需要不断的打磨,需要不断的反馈意见,不断地再加工,才能设计出符合用户要求,用户体验良好的项目。测试的技术人员,需要根据项目设计的人员制作的项目文档,对用户要求的各个功能进行测试并根据测试结果编写好测试的文档,在经过这一系列的工作后,可以有效的规避因设计人员在设计过程中的小纰漏,提升项目的质量,最终交付给用户一个完美的作品。
    本系统设计要求基本都可以达到,此系统具有完整的软件功能,良好的用户界面,能够正确的处理错误信息,而且能够准确的提出错误的种类。总体说来,软件通过测试。
    经过对上述的测试结果分析,本系统满足用户的通过计算机平台用户使用的要求和需求。所有基本功能齐全,操作简单,产品运行性能良好,是一个值得推广的公交查询系统。
    总结与展望本此毕业的内容所实现的是城市公交查询系统的设计与实现,主要介绍了java与jsp技术。本设计按照以下五个步骤对此项目进行设计:

    需求分析
    概要设计
    后台数据库的实现
    项目的详细设计
    系统的测试

    当下此系统的基本功能已得到实现,从3月份开始准备资料到5月份基本完成了项目的设计,要是想很好的完成这个项目,使它运用到生活中是远远不够的,还需要不断地用户反馈,不断修改,不断地充实,我也将会在今后的学习中,不断的完善它,改进它,使其更好。
    本系统具有以下优点:

    该系统可以运行在多个操作系统平台(Windows NT和Windows 2000 / Windows XP和Windows Vista)数据库管理系统采用MySQL和Java开发环境,可移植性好
    该系统界面简单,操作方便,容易进入的信息,人们使用的术语

    但也存在以下缺点:

    界面跳转复杂,接口不能被刷新,可以改进
    功能比较简单,没有进一步提高一些选修的程序等,不能更好的为用户提供更强大的功能服务
    数据库设计有冗余,需要进一步优化

    毕业设计的选题是在老师的指导下最终确立的,选题确定好后就开始学习这方面的资料进行学习,开始在这方面可以说是不熟悉的,虽然最初学习JSP技术,但学校学习的东西如果没有运用到实际的设计中终究是不行的,以前都是老师带领我们做,第一次做难免会怯场,但是最终通过自己的努力,老师的指导,同学的帮助,完成了本系统的设计。
    本次毕业设计已基本画上句号,在整个设计的道路上是劳动和汗水凝结的成果。为了解决一丢点的困难,我翻阅书籍,询问老师,与同学探讨,从不懂到熟知也是一个新的经验和新的收获的过程。学习是一个长期的过程,系统设计过程中,遇到了很多问题,后来通过自己的努力来解决大部分问题,但同时也学到了很多知识。通过这次毕业设计,我从最初的Java语言,和后来的Web开发学会了很多,然后在训练过程中,通过所学到的知识应用到实际发展实践中,最后到软件功能集成的整个设计过程的思想。
    该系统在实施过程中也常遇到一些困难,毕竟,JSP技术的掌握不熟练,有许多控件不能真正明白他们的意思,有一个对象调用的一些方法,并不十分了解,美化界面处理不好。所以开始的设计真的遇到了许多困难,但通过和老师同学的帮助以及在线学习,解决设计中的许多问题,但也使我有了一定的JSP技术的掌握,同时巩固了以前学过的知识。实现了质的上升,在一个纯粹的理论学习到实际上手再向完成毕业设计前进,理论联系实际情况,是学术认知的另一次跃进。
    参考文献[1] 汪光焘.畅通城市交通,实现城市的可持续发展.可持续发展,2002,(2):18-19
    [2] 马武定.城市化与城市可持续发展的基本问题.城市规划汇刊,2002,(2):7-9
    [3] 冯博.SQL实用教程.北京:人民邮电出版社,2005
    [4] 严蔚敏,吴伟明.数据结构(c语言版).北京清华大学出版社,1997
    [5] 张海藩.软件工程.北京:人民邮电出版社,2002
    [6] 黄斯伟.HTML完全使用详解.北京:人民邮电出版社,2005
    [7] Anthony J.Dos Reis. Compiler Construction Using Java,JavaCC,and Yacc. Wiley-IEEE Computer Society Pr; 1 , 2011
    [8] Joan Casteel. Oracle 12c:SQL. Course Technology; 3, 2015
    [9] Richard North Patterson. Eclipse. Pan Publishing, 2009
    [10] 李兴华,王月清.名师讲坛:Java Web开发实战经典基础篇(JSP、Servlet、Struts、Ajax) [平装][M].清华大学出版社,2010.
    [11] 李刚.轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发[M].电子工业出版社,2012.
    [12] 孙卫琴:《精通Hibernate:Java对象持久化技术详解》[M].电子工业出版社出版,2010.
    [13] Budi Kurniawan (作者),崔毅 (译者),俞哲皆 (译者),俞黎敏 (译者).Servlet和JSP学习指南[M].机械工业出版社,2013.
    [14] 陆舟.Struts2技术内幕:深入解析Struts2架构设计与实现原理 [M].机械工业出版社,2012.
    [15] 陈亚辉,缪勇.Struts2+Spring+Hibernate框架技术与项目实战[M].清华大学出版社,2012.
    [16] 施瓦茨 (Baron Schwartz),扎伊采夫 (Peter Zaitsev),特卡琴科 (Vadim Tkachenko),宁海元.高性能MySQL(第3版)[M].电子工业出版社,2013.
    [17] 薛华成.信息管理与信息系统专业教材系列:管理信息系统(第6版)[M].清华大学出版社,2012.
    [18] 王颖.基于JSP的学生学籍信息管理系统的设计与实现[J].电子科技大学,2012.
    [19] 朱丽萍.基于JSP的高校图书管理系统开发和实现[J].电子科技大学,2011.
    [20] 吕勇.基于JSP的实验室项目管理系统的设计与实现[J].武汉理工大学,2012.
    [21] 庞丽娜.Java 应用开发技术详解[M],科学出版社,2007:126-235
    [22] Cay S.Horstmann,Gary Cornell著,叶乃文,邝劲筠,杜永萍.JAVA核心技术卷I:基础知识,程序设计教程[M].人民邮电出版社,2008.5:87-234
    [23] 张超.基于JSP Struts2技术的房地产信息管理系统的设计与实现[D].吉林大学,2012.
    [24] (美)Powell.R. (美)Weeks.R.著. 袁鹏飞译. C#和.NET架构. 北京:人民邮电出版社,2002.4 17
    [25] 萨师煊,王珊.数据库系统概论(第三版).北京:高等教育出版社,2000.2
    5 评论 175 下载 2020-08-10 11:47:16 下载需要13点积分
  • 基于HTML和CSS实现的NBA兴趣交流网页设计

    一、项目总体设计1.1 需求分析阐述
    这个网页设计我是以“NBA”为主题展开,之所以选择这个题目,是因为自己本身是一名篮球爱好者,像广大青少年一样是一名 NBA 的追求者,喜欢看 NBA 直播、NBA 头条、NBA 八卦等等,喜欢把自己生活中的点点滴滴都带有 NBA 的身影,无论是穿着还是手机壁纸等等都带有 NBA,现在学了网页设计,当然也要根据自己的想法来设计自己的网页,同时想通过自己设计的网页,来满足更多篮球爱好者的需求,让更多的爱好者在我设计的网页里找到更有意思的东西。
    功能
    此网页能够满足喜欢 NBA 的人能够随时观看 NBA 直播、NBA 的最新要闻、NBA 的球队的最新动态,同时也可以了解传奇球队的光荣历史、传奇球星励志的 NBA 生涯、还有 NBA 的赛程、东西部球队的简介,NBA 的最新排名。后台工作人员能够用最快的时间根据 NBA 报道准确、完整更新所有的内容。满足爱好者的第一需求。
    **技术

    HTML 语言
    CSS 样式表

    网站结构图

    二、详细设计2.1 登录页面设计


    登陆界面主要由顶部的滚动文字、用户登录、用户注册组成。在登录和注册框中加入了超链接,只要点击登录就可以进入首页。
    所遇难点:通过输入账号登录(未实现)

    2.2 主页页面设计

    整个布局主要是用了盒子嵌套和排版,内容有寻找框,注册/登录键,导航栏,要闻,比赛赛程,已经比赛完的视频集锦。导航栏通过加入超链接点击进入对应的页面,要闻下面也是超链接,列出了 NBA 最新要点,整个布局比较美观,可以提高观看者兴趣。
    所遇难点:未实现中间视频图片为滚动的,还有视频图片两侧是“< >”无法点击,比赛栏无法让数据随时更新,图片无法滚动。
    2.3 传奇球队页面设计



    本页面目录和传奇球队的简介两部分组成。目录和球队简介运用了盒子进行排版,一个传奇球队的盒子中都加入了球队的 logo,运用<hr/>下划线把 logo 和简介分隔开,显得浏览的第一感觉较好,在顶部是设置了“返回主页”的超链接,只要点击此处就可以返回主页。
    总结这是我第一次接触网页设计,经过了一个学期对网页设计这门课程的学习,我从对网页设计的无知,到了现在对网页设计有了进一步的了解,经过老师的教导和自己的学习,自己现在也掌握了网页设计的一些知识,没有像一开学那样一无所知,这个学期老师教了很多东西,概括来说就是 HTML 一些基础语言和 CSS 样式表,因为老师在课后不怎么布置作业,所以平时自己也不怎么练习,现在知道单凭在课堂上的那点时间学习是远远不够的,通过这次的期末作业的设计就可以看得出来,因为知识掌握得不牢固,知识面不足,导致制作过程很艰难,一天待在电脑前八九个小时也无法完成一个页面,但幸运的是经过自己不懈的努力,用了两周的时间终于完成了自己制作的第一个网页设计作品,虽然这段时间很累,但是看着凭着自己的双手完成了自己设计的网站,我心里多少有些自豪。当然我的网站离一个完整、优秀的网站还有一大段距离,还需要继续努力,不断地丰富自己的专业知识。
    在设计过程中也出现了很多的问题,如忘记使用浮动导致盒子位置错乱、还有文字滚动的属性,但通过看书,上网查询,请教同学等方式,不断地学习、思考、实践、提高,最终顺利的完成了作品。但是还是有一些自己想要设计进去的东西没有办法加进去,因为技术还不够,没有学习到那方面的知识。例如:让图片滚动,输入正确的账号才可以登录…..
    希望通过此次的期末作业自己能够更加喜欢网页设计,不断努力,以后能够设计出更加优秀的作品。
    0 评论 0 下载 2021-07-26 11:15:07 下载需要10点积分
  • 基于VUE和Node.js实现的医院挂号预约系统

    一、可行性分析1.1 项目开发背景随着计算机技术的飞速发展,计算机在系统管理中的应用越来越普及,利用计算机实现各个系统的管理显得越来越重要。我国由于人口多,进而带来医院看病难的问题,由于人口众多,需要排队进行挂号,这样会浪费患者的时间,而且医院的效率也不高。患者挂号一项繁琐的过程,患者数量庞大,工作人员难免会出现错误,患者排队等候时间长,辗转过程多,影响了医疗的秩序。如何利用现代信息技术使企业拥有快速、高效的市场反映能力和高效率,是医院比较关心的问题。尽快建立一个医院预约挂号系统,完善现代医院的信息化管理机制,已成为医院生存发展的当务之急。所以,建立网上预约挂号系统势在必行。
    本系统以医院为背景,在认真调研和分析了医院的现状之后,根据用户的需求和各个功能的关系,作出了积极的设计方案。在新的管理资源和管理模式上,一定能使工作质量、工作效率等得到提高,推动医院发展的步伐。
    1.2 项目开发意义开发医院预约挂号系统,使患者就诊系统化,规范化,自动化,从而达到提高管理效率的目的。本系统开发设计思想是实现患者预约挂号的数字化。尽量采用现有软硬件环境,及先进的管理系统开发方案,提高系统开发水平和应用效果的目的;系统应符合医院管理的规定,满足日常管理的需要,并达到操作过程中的直观,方便,实用,安全等要求;系统采用模块化程序设计方法,这样既便于系统功能的各种组合,又便于未参与开发的技术维护人员补充,维护;系统应具备数据库维护功能,及时根据用户需求进行数据的添加,删除,修改等操作。
    1.3 技术可行性分析对系统的简要描述
    基于 vscode 开发环境和使用 MongoDB 数据库开发的面向患者、医院管理员的网上信息管理系统。系统在安装了 Win7 以上操作系统的个人电脑上使用。
    系统处理流程
    患者登录该系统后,根据自己病情,查询医院内自己所需的专家信息及专家简历,选中专家后,登记患者的姓名等信息以及简要病历,并填写预约时间。患者预约信息反馈到医院系统管理员后,管理员对预约信息进行整理,产生预约清单。管理员可以登录后台系统,对数据库的数据进行更便捷的操作。
    1.4 操作可行性分析操作可行性主要研究系统的操作方式在该用户组织内是否可行。在当前的社会条件下,Internet 网已经在中国全面覆盖,在中国各地,均可以通过硬件设备联网。而且各商业组织也拥有属于自己的内部局域网,所以该系统可以实现联网。该系统在联网情况下,可以通过 PC 机访问系统的数据,所以该系统的操作方式符合该用户组织。而且本系统操作方法简单,只需掌握基本上网知识,用户即可以轻易学会使用方法及操作流程。系统管理员需要进行简单培训。
    二、项目开发计划2.1 编写目的此系统在可行性分析的基础上,进一步的说明对医院预约挂号系统的要求,准确的定义出医院预约挂号系统要完成的任务,确定该系统要完成哪些工作,使系统尽可能的满足用户的要求,尽可能的简单方便的运行。
    2.2 项目功能描述医院挂号系统主要功能包括:后台管理和前台操作。

    后台管理:管理员登录,病员信息管理、医生信息管理、科室信息管理、预约信息管理、相关业务的查询和系统维护等

    管理员登录:管理员输入自己的姓名和密码,进行登录,登录成功后进入后台管理系统用户管理:在数据库中存储有各角色用户的信息信息,当某个角色的信息需要变化是时,可以随时进行信息的变更包括增加、删除、修改等功能,同时数据库中信息相应变化,并保持数据的时效性和完整性专家信息管理:专家信息的增、删、改、查等。查询预约该专家的患者数量及各方面的情况,如预约量超过专家的可以预约的人数后(大于某一自定的数量) 时,会显示该医生可预约号为 0,方便患者在进行预约时查看可以有效防止预约成功由于人数原因而不能就诊的情况科室信息管理:科室信息的增、删、改、查等。查询预约该科室的各方面的信息情况,如科室负责人和科室人数,科室介绍等预约信息管理:随时查询患者的预约信息,如患者姓名、病例、所属科室等,而且可及时更新数据库数据
    前台操作:病员注册、网上挂号、科室查询、挂号查询等

    病员注册:病员想要挂号,需要先进行注册,把数据传入数据库后。通过登录进入挂号页面进行挂号网上挂号:病员登录后,选择相应的科室,选择想预约的医生,然后选择预约时间等,点击预约完成网上预约挂号科室查询:病员无需登录,点击科室信息,里面会显示许多的科室信息,如果想看特定的科室,可以输入科室名称,进行科室查询挂号查询:病员无需登录,点击挂号查询进入查询页面,通过输入自己的身份证进行查询自己已挂号信息和状态等

    三、需求分析3.1 系统需求分析目前,门诊一直是困扰医院提高服务质量的一个复杂环节,特别是医疗水平高、门诊量大的医院,而造成门诊质量难以提高的因素主要有两方面:

    一方面集中式挂号,就诊人员流量不均、具有不确定性,有明显的就诊高峰和低谷。高峰期病人挂号排队长,就诊时间长,医生熟人插号现象,环境拥挤混乱,医生问诊时间短、不仔细、态度差。而低谷期,医生无病人看、溜号,医院资源浪费
    另一方面专家号难挂,出现倒号、炒号现象,严重损害病人利益,影响到医院的声誉。而采用网上预约挂号,可有效的解决这一现象,还通过有效的身份验证,杜绝倒、炒专家号的现象,提高医院门诊服务质量,取得良好的社会效益和经济效益

    为了解决这一问题,我们需要一种能够方便快捷的挂号方式来满足各方面的需求,减少排队挂号的痛苦和时间的浪费,而本课题所研究的基于 vue 和 node.js 的前后端分离式开发的医院网上挂号预约系统正好是为了解决这一问题而设计的方案,因此,本系统拥有很大的用户需求。
    3.2 系统流程图系统流程图通过图形的形式描述系统的各功能模块以及各个权限的操作者之间的交互情况,如下图 3.1 所示。

    3.3 数据描述3.3.1 数据流图数据流图是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程。数据流图有四种基本符号:正方形表示数据的源点或终点;圆角矩形代表变换数据的处理;开口矩形代表数据存储;箭头表示数据流。
    医院网络预约挂号系统中需要处理的信息有登录信息,专家信息以及患者预约信息,根据数据信息的流向画出本系统的数据流图。医院预约挂号系统顶层数据流图如下图 3.2 所示。

    3.4 系统 E-R 图为了把用户的数据清楚、准确地描述出来,系统分析员通常要建立一个概念数据模型。概念结构独立于支持数据库的 DBMS,具有能充分反映现实世界、易于理解、易于更动、易于向关系、网状或层次等各种数据模型转换。可根据实体间的关系和属性得到 E-R 图。
    R 图中的三个基本符号:矩形表示实体型,矩形框内写明实体名;椭圆形表示属性,并用无向边将其与相应的实体型连接起来;菱形表示联系,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n 或 m:n)。
    患者及其属性如下图 3.3 所示。

    医生及其属性如下图 3.4 所示。

    管理员及其属性如下图 3.5 所示。

    通过以上描述的各个实体的属性图,这样就可以了解系统的实体信息,实体属性图中描述了各个实体的属性,这些也是在进行系统操作时可以得到的信息。这是以需求说明为基础设计的局部概念模型,然后以这些局部模型为基础集成为一个全局的概念模型,在概念模型设计中多是采用这种自底向上的设计方式,称为系统集成法。
    分析得出系统中实体属性后,每个实体之间都有一定的联系,“管理员”实体与“专家”实体之间的关系为管理员管理专家,“管理员”与“患者”实体之间的关系是管理员管理患者的预约信息,“专家”与“患者”两实体之间的关系为专家对患者进行诊治。所以得出的医院预约挂号系统 E-R 图如图 3.6 所示。

    3.5 需求规定3.5.1 功能需求医院预约挂号系统主要实现一下几部分功能:预约挂号,病员信息管理,医生信息管理,科室信息管理,预约信息管理。

    内部人员权限管理模块:管理员以及专家的登录以及修改密码。管理员可以从登录模块进入系统对预约信息以及专家基本信息进行整理。专家可以从登录模块进入系统查询患者预约情况
    预约挂号模块:全国各地患者可以通过此模块进行预约挂号,并填写自己的挂号信息。可以查询自己先前的预约信息,也可以通过此系统取消先前的预约
    门诊流量统计:记录每天门诊的患者流量,对其进行统计
    专家信息管理:管理员可以对医院专家的信息进行增加、修改和删除

    3.5.2 性能需求数据库
    统应具有配置灵活、易于维护、便于扩展、性能可靠等突出优点,支持面向对象的大型数据库系统。如:SQL Server 等,可处理大容量数据,并具有高安全性和可靠性。
    时间特性
    操作响应时间一般在 1~3 秒之内,随之数据量的增大,操作的响应时间就要延长。
    数据精度
    各种数据的输入,输出要满足各种对数据精度的要求,严格按照系统要求的格式。
    适应性
    适应现有 Windows 系统的需求,并有可能适应更高级别的系统。
    3.5.3 运行需求**用户界面
    用户界面简单直观,一目了然,给用户带来极大的便利,让用户能够简单直接的运用本系统
    硬件接口
    不需要特定的硬件或硬件接口进行支撑,一般微机均可运行。
    软件接口
    运行于 Windows 7 或者更高版本的操作系统上。
    本系统为前后端分离项目,需要在后端文件,通过后台命令窗口运行 node app.js 命令来启动后端。
    3.5.4 其他需求
    保密需求:必须输入相关的正确的用户名和密码才能进入系统,并且不同的用户选择相应的权限才能登录成功
    数据要求:对于患者和专家的联系电话,必须有严格的位数限制,经过分析研究,联系电话位数必须限制 11 位
    身份证要求:为杜绝无关人员对系统进行恶意的破坏,在患者预约挂号时,必须填写自己真实的 18 位身份证号,输入的位数不对以及输入的身份证格式不对,系统则会提示身份证输入有误,不予存到系统数据库里,预约失败
    可维护性:平时由管理人员可以维护,遇到大问题或难解决的问题由开发人员进行维护
    可扩展性:在系统使用过程中,如果有医院在预约挂号方面有新的要求,则应能在本系统中进行扩展,增加新的功能

    四、系统概要设计4.1 总体设计4.1.1 总体设计原理经过需求分析,已经清楚了系统所要完成的全部功能,现在决定“怎么做”,总体设计的基本目的就是回答“概括的说,系统应该如何实现?”这个问题。因此总体设计又称为概要设计或初步设计。通过这个阶段的工作,将划分出组成该系统的物理元素——程序、文件、数据库、人工过程和文档等,但是这些物理元素仍然处于黑盒子级别。总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成,以及这些模块间的相互关系。
    总体设计过程首先要寻找实现目标系统的的各种不同的方案,需求分析阶段得到的数据流图是设想的各种可能方案的的基础,然后从这些供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图。然后分析比较这些合理的方案,选出最佳的方案,进一步为这个最佳方案设计软件结构,设计出初步的软件结构后还要进行多方改进,从而得到更合理的结构,进行数据库设计。
    进行总体设计,可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。
    4.1.2 系统功能模块设计在需求分析的时候已经对系统的的功能进行了初步分析,在这里对系统功能进行详细的设计。
    由于系统中面向的是医院的系统管理员,以及广大患者,所以对系统分为两大主功能模块,即管理、患者两大主功能模块。
    管理模块是针对管理员对系统的管理进行设计的功能模块,管理员需要进行登录系统后方可进行系统信息管理,所以首先要有登录模块。管理员登录系统后需要对医生的信息进行增加、删除和修改,所以在此主功能模块下设计了一个整理医生信息模块,管理员可以通过此模块对专家信息进行管理。管理员还需要对每天患者预约的信息进行查看整理,
    患者主功能模块下设计了三个分模块:预约挂号、查询信息.患者从网上进行预约挂号时,需要填写预约的各种信息,患者可以进入预约模块填写自己的预约信息,并保存,预约成功。当患者预约成功后,患者想查询先前的预约信息,则需要一个查询模块,所以在患者主功能模块下设计了一个查询信息模块。医院预约挂号系统的功能模块如下图 4.1 所示。

    4.1.3 功能分析
    登录:当管理员及患者用户需要进入系统时,可以从登录模块输入用户名和密码,并选择自己权限进行登录。当输入错误的信息时系统拒绝访问
    整理病员信息:管理员通过此功能添加、修改和删除病员信息,及时更细医院里病员的信息,以方便患者进行预约
    整理医生信息:管理员通过此功能添加、修改和删除医生信息,及时更细医院里病员的信息,以方便患者进行预约
    整理科室信息:管理员通过此功能添加、修改和删除科室信息,及时更细医院里科室的信息,以方便患者进行预约
    整理预约信息:管理员通过此功能添加、修改和删除预约信息,及时更细医院里预约的信息,以方便患者进行预约
    科室查询:病员进入系统后,进入到查询信息模块,查询科室的信息
    挂号预约:病员进入系统后,进入预约挂号模块根据自己的病情选择适合的科室,然后选择要预约的医生
    挂号查询:当患者预约完毕后,可以通过查询功能,对自己先前的预约信息进行查询、核对

    4.2 数据库设计4.2.1 数据库概念设计数据库一般分为三级模式:外模式、模式和内模式。外模式也就是不同用户所对的数据视图,它将数据库内部抽象的数据及其互相之间的关系表示为简单、直观的应用界面。模式是数据库中全部数据的逻辑结构和特征描述,通常以某种数据模型为基础。内模式是对数据的物理结构和存储方式的描述。
    在该系统中具体的模式有:

    病员(病员编号,病员姓名,病员密码,病员身份证号,病员性别,病员地址,病情简介)
    管理员(管理员编号,管理员姓名,密码)
    医生信息(医生编号,医生姓名,就诊时间,科室,医生简介,总号,余号,医生状态)
    科室信息(科室编号,科室名称,科室负责人,科室人数,科室介绍,科室跳转地址)
    预约记录(预约编号,病员姓名,病员性别,医生姓名,就诊日期,病员身份证号,预约状态)

    4.2.2 数据库逻辑结构设计数据库是信息系统的核心和基础,数据库设计的质量将直接关系到信息系统开发的成败和优劣。数据库设计是根据业务需求,信息需求,和处理需求,确定系统中的数据结构、数据操作和数据一致性约束的过程。
    数据库设计是在一个给定的应用环境中,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效的存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。
    数据库设计的目标是为用户和各种应用系统提供一个信息基础设施和高效率的运行环境,包括数据库的存取效率、数据库存储空间的利用率、数据库系统运行管理的效率等。
    根据医院挂号系统的功能要求,选取 MongoDB 作为后台数据库。
    在上面的实体和实体之间的 E-R 图设计基础上,形成数据库中的表格及表格之间的关系。具体内容如下各表所示。
    用户登录信息表
    登录信息表中存储的是管理员和专家以及患者登录系统时所需要的用户名和密码。具体如下表 4.1 所示。



    属性名
    字段名
    类型
    Null
    备注




    病员编号
    _id
    var

    主键


    病员姓名
    patientname
    var




    密码
    password
    var




    病员身份证号
    idnumber
    var




    病员性别
    sex
    var




    病员地址
    address
    var




    病情简介
    condition
    var




    医生信息表
    医生信息表主要存储医生的信息,医生的各种信息都存储到医生信息表中。具体如下表 4.2 所示。



    属性名
    字段名
    类型
    Null
    备注




    医生编号
    _id
    var

    主键


    医生姓名
    doctorname
    var




    就诊时间
    date
    var




    科室
    department
    var




    医生简介
    introducution
    var




    总号
    total
    var




    余号
    remain
    var




    医生状态
    status
    var




    管理员信息表
    管理员信息表主要存储管理员的信息,管理员的各种信息都存储到管理员信息表中。具体如下表 4.3 所示。



    属性名
    字段名
    类型
    Null
    备注




    管理员编号
    _id
    var

    主键


    管理员姓名
    adminname
    var




    密码
    password
    var




    科室信息表
    科室信息表主要存储科室的信息,科室的各种信息都存储到科室信息表中。具体如下表 4.4 所示。



    属性名
    字段名
    类型
    Null
    备注




    科室编号
    departmentId
    var

    主键


    科室名字
    departmentName
    var




    科室负责人
    departmentLeader
    var




    科室人数
    total
    var




    科室介绍
    introduction
    var




    科室跳转地址
    clicks
    var




    预约信息表
    预约信息表主要存储病员预约的信息,病员预约的各种信息都存储到预约信息表中。具体如下表 4.5 所示。



    属性名
    字段名
    类型
    Null
    备注




    预约编号
    _id
    var

    主键


    病员姓名
    patientname
    var




    病员性别
    sex
    var




    医生姓名
    doctorname
    var




    就诊时间
    date
    var




    病员身份证号
    idnumber
    var




    预约状态
    status
    var




    五、详细设计结构化详细设计是对概要设计的进一步细化,其目标是为软件结构图中每个模块提供可供程序员编程实现的具体算法。
    详细设计阶段的根本目标是确定应该具体地实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
    详细设计阶段的任务还不具体地编写程序,而是要设计出程序的“蓝图”,以后程序员将根据这个蓝图写出实际的程序代码。因此,详细设计的结果基本上决定了最终的程序代码的质量。考虑程序代码的质量时必须注意,程序的“读者”有两个人。那就是计算机和人。在软件的生命周期中,设计测试方案、诊断程序错误、修改和改进程序等等都必须首先读懂程序。实际上对于长期使用的软件系统而言,人读程序的时间可能比写程序的时间还要长的多。因此,衡量程序的质量不仅要看它的逻辑是否正确,性能是否满足要求,更主要的是要看它是否容易阅读和理解。详细设计的目标不仅仅是逻辑上正确的实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。
    详细设计常采用的描述方式有三类:图形描述、语言描述和表格描述。图形描述包括程序流程图和问题分析图;语言描述主要是程序设计语言;表格描述包括判定表等。这里主要运用了程序流程图来分析医院挂号预约系统。
    5.1 程序设计过程程序过程设计主要是在借助过程设计工具的情况下,对程序的具体实现过程进行设计。程序的主要部分设计在这个环节完成。在这个任务说明书中我们采用盒图的形式来表达程序的具体的设计过程,我们的系统设计为 B/S 结构,所以是浏览器登陆系统的形式。
    5.1.1 登陆界面设计在管理员登录时,在输入用户名和密码及用户类型的前提下将其与数据库中的数据进行比对,若一致,则打开主窗体;若不一致提示错误,并要求重新输入。部分代码如下:


    5.1.2 病员管理界面设计在管理员登录后,点击病员管理进入管理页面,点击相应的按钮,对病员数据进行相应的增删查改操作,医生管理和科室管理与此功能相似,下面以病员管理为例进行说明,部分代码如下:


    5.1.3 预约管理界面设计在管理员登录时,点击预约管理进入预约管理页面,点击相应的按钮,对预约数据进行相应的增删查改操作,增删查改功能与前面的相似,不同的是点击更改状按钮,预约数据的状态会发生切换,部分代码如下:


    5.1.4 病员注册界面设计病员进入主页后,点击病员注册,今日协议书页面,点击同意后,进入病员注册页面,病员填写相关的信息,点击确定后,即可完成注册,1.5 秒页面会跳到 网上挂号页面,部分代码如下:

    5.1.5 网上挂号界面设计病员注册完成后,会自动跳转到网上挂号页面,选择要预约的科室,然后选择要预约的医生,填写自己的真实姓名、密码和预约日期后,点击确定,完成挂号功能。部分代码如下:

    5.1.6 挂号查询界面设计病员挂号完成后,点击左边的挂号查询,输入自己的身份证号,点击查询,如果是有预约的,预约信息会显示在表格里,部分代码如下:


    5.2 程序设计效果5.2.1 管理员登录在管理员登录时,在输入用户名和密码及用户类型的前提下将其与数据库中的数据进行比对,若一致,则打开主窗体;若不一致提示错误,并要求重新输入。效果图如下:


    5.2.2 病员管理在管理员登录后,点击病员管理进入管理页面,点击相应的按钮,对病员数据进行相应的增删查改操作,医生管理和科室管理与此功能相似,下面以病员管理为例进行说明,效果图如下:



    5.2.3 预约管理在管理员登录时,点击预约管理进入预约管理页面,点击相应的按钮,对预约数据进行相应的增删查改操作,增删查改功能与前面的相似,不同的是点击更改状按钮,预约数据的状态会发生切换,效果图如下:


    5.2.4 病员注册病员进入主页后,点击病员注册,今日协议书页面,点击同意后,进入病员注册页面,病员填写相关的信息,点击确定后,即可完成注册,1.5 秒页面会跳到 网上挂号页面,效果图如下:

    5.2.5 网上挂号病员注册完成后,会自动跳转到网上挂号页面,选择要预约的科室,然后选择要预约的医生,填写自己的真实姓名、密码和预约日期后,点击确定,完成挂号功能。效果图如下:

    5.2.6 挂号查询病员挂号完成后,点击左边的挂号查询,输入自己的身份证号,点击查询,如果是有预约的,预约信息会显示在表格里,效果图如下:

    5.3 程序流程设计程序流程图又称程序框图,是描述过程设计的方法。程序流程图中使用的符号如下:椭圆形表示开始或停止;长方形表示处理;菱形表示多分支;箭头表示控制流。
    管理员、专家和患者登录程序流程
    管理员和患者登录流程图用于描述管理员和专家登录系统的过程。用户进入主页后,在登录框输入用户名和密码,若输入正确,则登录系统。若输入错误,则提示输入用户名和密码不对,请重新输入。管理员登录成功后则进入后台管理页面,专家登录成功后则进入后台专家查询页面,患者登陆成功后进入就诊预约界面。具体流程图如下图 5.3 所示。

    预约挂号程序流程
    病员预约挂号程序流程用于描述患者预约挂号的过程。当病员进入主页后,点击预约,进入到预约挂号页面,病员在这里填写自己的信息以及选择要预约的医生,然后保存预约,预约挂号程序结束。患者预约挂号流程图如下图 5.4 所示。

    六、技术简介
    开发工具:VS Code

    Vscode 是一个轻量的编译器,所以默认是通过打开文件夹的功能来打开对应的工程。而且下面会列举出最近打开的工程,方便打开用户打开最近打开的工程进行编辑和修改
    前端技术:使用 Vue+vue-router+axios,并结合 element UI 框架进行模块化页面开发
    后端技术:使用 Node.js+mongodb 数据库技术,express 框架和 express-art-template 插件进行开发

    总结对于这次的实训课程设计,我的感受是既不简单也不是太难。通过这次软件工程课程设计的实践训练,进一步掌握了软件工程的方法和技术,拓宽了知识面,提高软件开发的实际能力,培养工程设计能力和综合分析、解决问题的能力。学习和实践了分析和设计软件系统的各种知识,包括面向对象的系统分析与设计,编码和测试方面的知识。同时掌握了开发工具 VS Code ,并将其运用与软件开发的全过程。进一步加强和提高软件工程文档的编写能力。
    而且本次课程设计让我懂得通过理论与实际的结合、人与人的沟通,进一步提高思想觉悟。尤其是观察、分析和解决问题的实际工作能力,对我们来说,实际能力的培养至关重要。通过课程设计,让我找出自身状况与实际需要的差距并在以后的学习期间及时补充相关知识。通过对软件开发流程的了解,进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深的学习。
    本系统实现了最基本的功能模块,在功能上基本满足用户的需求,但是由于时间较紧,有些模块以及整个系统还有许多不完善的以及考虑不周全的地方。
    总之,此次课程设计最大的收获就是对于 Vue 前端框架和 node.js 写后台接口有了深层次的理解。对问题的分析和解决问题的能力都有了很大提高,以及对软件可行性分析,需求分析,软件的测试等方面也有了更深层次的了解,对我今后学习这方面的知识打下坚实的基础。
    在本次实训设计中,对于软件部分:我们基本实现了系统。但由于一些原因,我们没能完全地实现系统的全部功能,所以该系统不能应用于日常生活中。在该系统中一些功能模块还未完善,例如医生模块,如果有时间可以再做一个医生登录模块,进行医生模块的开发。对于文档部分,由于本人的能力有限,有些部分较为粗糙,没能做好。
    参考文献
    [1] 毛光喜,《信息系统分析与设计》,吉林大学出版社
    [2] 马特·弗里斯比(Matt Frisbie),《JavaScript 高级程序设计》,人民邮电出版社
    0 评论 1 下载 2021-07-25 12:15:17 下载需要14点积分
  • 基于Java实现的记事本

    摘 要目前,很多新的技术领域都涉及到了 Java 语言,Java 语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此 Java 语言也是学习面向对象编程和网络编程的首选语言。此次课程设计主要通过编写一个简单的记事本程序使我们深入理解并实践在本课程中所学的有关数据结构中操控字符串的方式。此记事本程序,使用 Java 程序编写,能够进行输入文字操作,并具有新建文件,打开文件,保存文件,加解密文本文件,退出,复制,粘贴,剪切等功能。该程序主要用到了 Java swing 和事件监听等。
    关键词:GUI、字符串、Java、DES
    一、 绪论1.1 引言Java 语言程序设计是一门实践性很强的软件设计课程,是继 PASCAL 语言之后的又一门优秀的课程教学语言,并且是教学需要与实际应用相结合的一门语言。课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。通过这次课程设计可以将书本上的知识转换成实际的东西,做到学以制用。通过本次课程设计,可以帮助学生全面牢固地掌握课堂教学内容、培养学生的实践动手能力和分 Java 语言程序设计实际问题的能力,培养学生调查研究、查阅技术文献、资料的能力,培养学生良好的编程风格和优秀的程序设计技术。
    在本程序设计中,因为需要开发的是记事本程序,规模较小,内容较少,所以选择了 Eclipse 开发工具。
    1.2 目的目前,很多新的技术领域都涉及到了 Java 语言,Java 语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此 Java 语言也是学习面向对象编程和网络编程的首选语言。按照教学培养计划要求,学生在学习完课本中指定课时的知识后,应安排一定课时的课程设计。其主要目的是使学生深入理解并实践在本课程中所学的有关 Java 程序设计方面的语言基础、异常处理、事件处理、小应用程序以及图形用户界面设计等。故此“记事本”应运而生。
    记事本主要用于对文字进行简单编辑软件,通过自己对于 Java 的学习,通过使用 Eclipse 开发工具,编写出简单的记事本,从而提高自己对于 Java 知识的理解和运用。
    1.3 课题意义随着计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。当然对文本编辑操作仍然占据着重要地位,记事本是简单便捷的文本编辑器,可实现对文本编辑操作的基本功能。
    二、 系统分析2.1 可行性分析2.1.1 技术可行性随着互联网应用越来越丰富,我们也能见到很多各种各样的记事本用于记事。但是,一个可以用于加解密的记事本却还是很少。使用 Java Swing 来制作一个记事本,使用 IO 流进行操作,使用加密算法进行加密,也就成了可能。
    2.1.2 经济可行性开发本系统所用的人力、物力、技术、资金等的花费不大,所以今后获得的经济效益一定会大于开发成本。
    2.1.3 操作可行性本开发系统操作步骤简单,打开即用,加解密方便。
    2.2 软件需求分析2.2.1 功能需求本程序要构建的记事本程序参照了 Windows 操作系统的记事本工具,菜单中有“文件”,“编辑”,“关于”三个主菜单:

    “文件”有“新建”、“打开”、“保存”、“另存为”、“解密打开”、“加密保存”、“加密另存为”、“退出”,分别用于新建文件,打开文件,保存文件,解密打开文件,加密保存文件,退出
    “编辑”中有“替换 | 查找”子菜单,用于替换或查找文本
    “关于”菜单中有 “关于记事本”子菜单,用于介绍记事本程序的作者等信息

    2.2.2 假定的约束
    开发软件运行的最短寿命不要低于 2 年,即须更新
    进行方案选择比较的期限不要超过 2 个月
    经费主要通过贷款以及广告商赞助,需要严格控制支出
    法律和政策方面的限制:主要侵权以及隐私等机密问题的传播控制
    必须在双核 CPU 频率大于 1.7GHZ,内存大于 512MB,硬盘空间必须要 500MB 以上的机子上安装运行
    可在 WINDOWS 以及 Linux 的系统环境下运行
    在 JDK 环境下进行开发设计

    2.2.3 性能需求系统响应时间要 <=10s;
    2.2.4 安全需求软件使用了 DES 算法作为加解密算法,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种。
    2.2.5 运行需求
    带有 JDK 环境的系统
    window/linux/unix 通用

    三、 系统设计与实现3.1 程序设计思路在本程序中,设计了一个菜单栏和文本内容区。设计过程中用到了 JFrame,JScrollPane,JMenu,JMenuItem,JTextArea,JFileChooser 等。JMenu 用来制作菜单,菜单包括“文件”“编辑”“关于”。JTextArea 主要用来输入文本。
    3.2 概要设计3.2.1 模块设计本应用软件是简单的记事本,其能实现文件的新建、打开、保存、另存为、加密保存、解密打开、退出;剪切、复制、粘贴、删除、全选、查找、替换。为实现这些功能,需要设置以下模块:
    主模块

    文件相关功能模块

    文档编辑模块

    菜单设计有如下的一般性原则:

    按照系统的功能来组织菜单
    要选用广而浅的菜单树,而不是窄而深的菜单树
    根据菜单选项的含义进行分组;并且按一定的规则排序
    菜单选项的标题要力求文学简短、含义明确,并且最好以关键词开始
    常用选项要设置快捷键

    3.2.2 系统模块结构图
    如图所示,首先创建一个名为继承 JFrame 类作为最底层的容器。

    构造一个类要做三件事情,分别是初始化容器、初始化组件、设置事件监听器。
    3.2.3 系统流程描述
    3.3 界面设计3.3.1 主界面设计



    具体实现代码如下:
    public Main() { setTitle("Java\u8BB0\u4E8B\u672C"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 924, 587); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu menu = new JMenu("\u6587\u4EF6"); menuBar.add(menu); JMenuItem menuItem = new JMenuItem("\u65B0\u5EFA"); menuItem.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { path = null; textPane.setText(""); } }); menu.add(menuItem); JMenuItem menuItem_1 = new JMenuItem("\u6253\u5F00"); menuItem_1.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { open(); } }); menu.add(menuItem_1); JMenuItem menuItem_2 = new JMenuItem("\u4FDD\u5B58"); menuItem_2.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { save(); } }); menu.add(menuItem_2); JMenuItem menuItem_3 = new JMenuItem("\u53E6\u5B58\u4E3A"); menuItem_3.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { saveOther(); } }); menu.add(menuItem_3); JMenuItem menuItem_7 = new JMenuItem("\u89E3\u5BC6\u6253\u5F00"); menuItem_7.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { desOpen(); } }); menu.add(menuItem_7); JMenuItem menuItem_6 = new JMenuItem("\u52A0\u5BC6\u4FDD\u5B58"); menuItem_6.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { encSave(); } }); menu.add(menuItem_6); JMenuItem menuItem_8 = new JMenuItem("\u52A0\u5BC6\u53E6\u5B58\u4E3A"); menuItem_8.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { encSaveOther(); } }); menu.add(menuItem_8); JMenuItem menuItem_4 = new JMenuItem("\u9000\u51FA"); menuItem_4.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { System.exit(1); } }); menu.add(menuItem_4); JMenu menu_1 = new JMenu("\u7F16\u8F91"); menuBar.add(menu_1); JMenuItem menuItem_5 = new JMenuItem("\u66FF\u6362|\u67E5\u627E"); menuItem_5.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { new Replace(textPane); } }); menu_1.add(menuItem_5); JMenu menu_2 = new JMenu("\u5173\u4E8E"); menuBar.add(menu_2); JMenuItem menuItem_9 = new JMenuItem("\u5173\u4E8E\u8BB0\u4E8B\u672C"); menuItem_9.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JOptionPane.showInternalMessageDialog(contentPane, "made by 木子中","关于", JOptionPane.INFORMATION_MESSAGE); } }); menu_2.add(menuItem_9); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(0, 0, 906, 490); contentPane.add(scrollPane); textPane = new JTextPane(); textPane.setFont(new Font("宋体", Font.PLAIN, 23)); scrollPane.setViewportView(textPane); JPopupMenu popupMenu = new JPopupMenu(); addPopup(textPane, popupMenu); JMenuItem menuItem_12 = new JMenuItem("\u526A\u5207"); menuItem_12.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { text = textPane.getSelectedText(); textPane.replaceSelection(""); } }); popupMenu.add(menuItem_12); JMenuItem menuItem_11 = new JMenuItem("\u590D\u5236"); menuItem_11.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { text = textPane.getSelectedText(); } }); popupMenu.add(menuItem_11); JMenuItem menuItem_13 = new JMenuItem("\u7C98\u8D34"); menuItem_13.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { String s = textPane.getSelectedText(); if(s == null) { int cur = textPane.getCaretPosition(); // 得到光标之后的字符串 String tailString = textPane.getText().substring(cur); // 得到光标之前的字符串 String headString = textPane.getText().substring(0, cur); // 拼接字符串 并输出 textPane.setText(headString + text + tailString); textPane.setCaretPosition(cur+text.length()); } else { textPane.replaceSelection(text); } } }); popupMenu.add(menuItem_13); JMenuItem menuItem_14 = new JMenuItem("\u5168\u9009"); menuItem_14.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { textPane.setSelectionStart(0); } }); popupMenu.add(menuItem_14); lblNewLabel = new JLabel("None"); lblNewLabel.setBounds(0, 496, 906, 18); contentPane.add(lblNewLabel);}
    3.3.2 统计情况设计采用了线程的方法进行实时更新统计信息。

    具体实现代码如下:
    public class CheckThread extends Thread { private JTextPane textPane; private JLabel label; public CheckThread(JTextPane textPane, JLabel label) { this.textPane = textPane; this.label = label; } public void run() { while(true) { String str = textPane.getSelectedText(); if(str == null) { str = textPane.getText(); } int letter = 0; int num = 0; int space = 0; int chinese = 0; int point = 0; int total = 0; for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { letter++; } else if(c >= '0' && c <= '9') { num++; } else if(c == ' ') { space++; } else if(c >= '\u4e00' && c <= '\u9fa5') { chinese++; } else { point++; } total++; } label.setText("字母:"+letter+" 数字:"+num+" 空格:"+space+" 汉字:"+chinese+" 符号:"+point+"总数:"+total); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } }}
    3.3.3 查找替换设计
    具体实现代码如下:
    public Replace(JTextPane textPane1) { this.textPane = textPane1; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 551, 235); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel lblNewLabel = new JLabel("\u67E5\u627E\u7684\u6587\u672C"); lblNewLabel.setBounds(25, 40, 90, 18); contentPane.add(lblNewLabel); textField = new JTextField(); textField.setBounds(114, 29, 229, 40); contentPane.add(textField); textField.setColumns(10); JLabel label = new JLabel("\u66FF\u4EE3\u7684\u6587\u672C"); label.setBounds(25, 93, 90, 18); contentPane.add(label); textField_1 = new JTextField(); textField_1.setColumns(10); textField_1.setBounds(114, 82, 229, 40); contentPane.add(textField_1); JButton btnNewButton = new JButton("\u67E5\u627E"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lblNewLabel_1.setText("共找到"+getResultNum()+"个结果"); } }); btnNewButton.setBounds(375, 13, 144, 29); contentPane.add(btnNewButton); final JButton button = new JButton("\u67E5\u627E\u4E0B\u4E00\u4E2A"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lblNewLabel_1.setText("共找到"+getResultNum()+"个结果"); String str = textPane.getText(); if(count == getResultNum()) { start = 0; count = 0; } if((start = str.indexOf(textField.getText(), start)) != -1) { textPane.setSelectionStart(start); textPane.setSelectionEnd(start+textField.getText().length()); start+=textField.getText().length(); count++; button.setText("查找下一个 "+count+"/"+getResultNum()); } } }); button.setBounds(375, 55, 144, 29); contentPane.add(button); JButton button_1 = new JButton("\u66FF\u4EE3"); button_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textPane.replaceSelection(textField_1.getText()); } }); button_1.setBounds(375, 97, 144, 29); contentPane.add(button_1); JButton button_2 = new JButton("\u5168\u90E8\u66FF\u4EE3"); button_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lblNewLabel_1.setText("共替代"+getResultNum()+"个"); textPane.setText(textPane.getText().replaceAll(textField.getText(), textField_1.getText())); } }); button_2.setBounds(375, 139, 144, 29); contentPane.add(button_2); lblNewLabel_1 = new JLabel(""); lblNewLabel_1.setBounds(14, 135, 347, 29); contentPane.add(lblNewLabel_1); setVisible(true);}
    3.3.4 加解密设计具体实现代码如下:
    public class DesUtil { private final static String DES = "DES"; private final static String ENCODE = "GBK"; public static void main(String[] args) throws Exception { System.out.println(encrypt("hello", "123"));; } /** * Description 根据键值进行加密 * * @param data * @param key * 加密键byte数组 * @return * @throws Exception */ public static String encrypt(String data, String key) throws Exception { key = CreateMD5.getMd5(key); byte[] bt = encrypt(data.getBytes(ENCODE), key.getBytes(ENCODE)); String strs = new BASE64Encoder().encode(bt); return strs; } /** * Description 根据键值进行解密 * * @param data * @param key * 加密键byte数组 * @return * @throws IOException * @throws Exception */ public static String decrypt(String data, String key) throws IOException, Exception { key = CreateMD5.getMd5(key); if (data == null) return null; BASE64Decoder decoder = new BASE64Decoder(); byte[] buf = decoder.decodeBuffer(data); byte[] bt = decrypt(buf, key.getBytes(ENCODE)); return new String(bt, ENCODE); } /** * Description 根据键值进行加密 * * @param data * @param key * 加密键byte数组 * @return * @throws Exception */ private static byte[] encrypt(byte[] data, byte[] key) throws Exception { // 生成一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); return cipher.doFinal(data); } /** * Description 根据键值进行解密 * * @param data * @param key * 加密键byte数组 * @return * @throws Exception */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // 生成一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); return cipher.doFinal(data); }}
    3.4 模块设计


    文件操作模块
    打开文件;保存文件




    加解密模块
    DES 加密;DES 解密


    文本操作模块
    查找文本;替代文本;写入文本



    3.5 系统特点
    界面设计美观友好
    规范、完整的基础信息设置
    系统运行稳定、安全可靠

    3.6 尚未解决的问题会出现意外关闭的 bug。
    四、系统测试4.1 定义测试
    一级错误:不能完全满足系统要求,基本功能未完全实现;或者危及人身安全
    二级错误:严重地影响系统要求或基本功能的实现,且没有更正办法(重新安装或重新启动该软件不属于更正办法)
    三级错误:严重地影响系统要求或基本功能的实现,但存在合理的更正办法(重新安装或重新启动该软件不属于更正办法)
    四级错误:使操作者不方便或遇到麻烦,但它不影响执行工作功能或重要功能
    五级错误:其他错误
    回测:产生测试错误或缺陷的测试项由软件开发人员进行修改调试正确后,由软件测试人员再次进行的针对该测试项及其相关项的测试

    4.2 功能需求测试项详述及测试结果


    测试需求
    测试重点及结果
    测试结果




    新建文本
    主页面
    成功


    保存文本
    主页面
    成功


    加密文本
    保存的 txt 文件
    成功


    解密文本
    保存的 txt 文件
    成功


    查找文本
    主页面
    成功


    替代文本
    主页面
    成功



    总结当我看到课程设计题目时,有这么多题目和以前做过的类似,我再三考虑终于选了这个题目,刚开始的时侯我觉得做起来应该非常简单,可仔细分析、设计算法时才发现并没有我想像的那么简单。
    由于本次课程设计是一个人一个题目,所以只有通过自已努力,有什么不懂的请教同学或在网上搜集一些资料,可网上的资料有很多的不足,刚开始的两天,感觉还有很多地方需要查资料,进度也比较慢。
    在余下的日子里,自已不断地查资料,请教同学帮助,可是还是有一大堆的问题存在。可是难题依然没有得到解决,算法的改进真的让人苦思冥想,怎么去解决,查阅了一大堆的资料,还有就是模块化设计问题,平时的运用还不够熟悉,所以这一块也要查阅许多资料。通过每次自已的亲自动手,发现自已的知识还有很多的不足,比如:算法的灵活应用及一些不常用的类不熟悉,还有就是一个人的力量是有限,没有团队力量那么大的爆发力,做起事来总是单一方面的做,没有做到十全十美。程序不知道被我改了多少遍,可是还是有不足,多亏老师和同学们的帮助。
    参考文献
    [1] 朱福喜.《Java 语言程序设计》(第二版).科学出版社
    [2] 陈国君等.《Java 程序设计基础》(第二版).清华大学出版社
    [3] Deitel.《Java 大学基础教程》(第六版).电子工业出版社
    [4] MaryCampione.《Java 语言导学》(第四版).机械工业出版社
    [5] Y.DanielLiang.《Java 语言程序设计基础篇》(第六版).机械工业出版社
    [6] KathySierra.《HeadFirstJava》(第二版).东南大学出版社
    0 评论 0 下载 2021-07-24 18:34:23 下载需要11点积分
  • 基于Java实现的记事本程序

    一、引言1.1 课程设计目的
    复习、巩固 Java 语言的基础知识,进一步加深对 Java 语言的理解和掌握
    课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的能力
    培养学生在项目开发中创新意识及能力
    掌握窗口、菜单等高级组件的应用
    掌握 Java Swing 的使用方法
    了解 GUI 应用程序的创建过程与方法

    1.2 题目说明编写一个简单记事本程序,要求包含以下菜单项:

    文件新建、打开、保存、另保存、退出
    编辑剪切、复制、粘贴、查找、替换、全选
    帮助关于记事本

    1.3 开发工具介绍Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Kit,JDK)。
    二、总体设计2.1 系统开发平台前端使用 Java 设计
    2.2 系统流程图
    2.3 功能结构图“文件”菜单操作流程图

    “编辑”菜单操作流程图

    “帮助”菜单操作流程图

    三、详细说明类设计
    设计两个类,一个 SystemParam 类,具有自动换行功能,另一个 NotepadMainFrame 主类。
    界面设计
    在主界面中设计一个 Frame 窗口,继承 JPanel 类,并在其中加入下拉菜单和一个文本域控件。
    功能设计
    在下拉菜单中加入子菜单并进行监听,分别实现对文件的操作功能。点击不同菜单项时,显示不同界面。
    代码设计
    编写每个控件的相关代码,并进行调试。
    3.1 界面设计3.1.1 界面设计创建一个下拉菜单和文本域,在文本域中显示编辑文件信息。
    界面主要代码以及菜单部分代码:
    setTitle("记事本");setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); //设置用户在此窗体上发起 "close" 时,不执行任何操作setBounds(400, 180, 600, 400); //设置窗口位置和大小JMenuBar menuBar = new JMenuBar(); //菜单栏setJMenuBar(menuBar);JMenu itemFile = new JMenu("文件(F)");itemFile.setMnemonic('F'); //设置快捷键"Alt+F"menuBar.add(itemFile); //将"文件"菜单添加到菜单栏上itemNew = new JMenuItem("新建(N)"); //创建"新建"菜单条itemFile.add(itemNew); //将"新建"菜单条添加到"文件"菜单textArea = new JTextArea();contentPane = new JPanel();contentPane.setLayout(new BorderLayout(0, 0)); //边界布局setContentPane(contentPane); //把contentPane对象设置成为内容面板scrollPane = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); //设置水平和垂直滚动条contentPane.add(scrollPane, BorderLayout.CENTER);

    3.1.2 功能设计对每个菜单项进行注册监听。点击不同菜单项时,显示不同界面。
    部分代码:
    itemNew.addActionListener(this); //注册监听者
    3.1.3 代码设计部分代码:
    private void openFile() { //打开文件 JFileChooser choose=new JFileChooser(); //打开文件选择框 int result=choose.showOpenDialog(this); //选择文件 if(result==JFileChooser.APPROVE_OPTION) { File file=choose.getSelectedFile(); //取得选择的文件 currentFileName=file.getName(); //打开已存在的文件,提前将文件名存起来 if( currentFileName.endsWith(".java")||currentFileName.endsWith(".txt")) { //只打开java后缀文件 this.setTitle(this.currentFileName); BufferedReader br=null; try { @SuppressWarnings("resource") InputStreamReader isr=new InputStreamReader(new FileInputStream(file),"GBK"); //建立文件流[字符流] br=new BufferedReader(isr); //动态绑定 StringBuffer sb=new StringBuffer(); //读取内容 String line=null; while((line=br.readLine())!=null) { //一次读一行,读入null时文件结束 sb.append(line+SystemParam.LINE_SEPARATOR); } textArea.setText(sb.toString()); //显示在文本框[多框] } catch(Exception e) { e.printStackTrace(); } } else { JOptionPane.showMessageDialog(this, "打开的文件类型不匹配","提示 ",1); } }}private void save() { //保存 JFileChooser choose=new JFileChooser(); //打开文件选择框 int result=choose.showSaveDialog(this); //选择文件夹 if(result==JFileChooser.APPROVE_OPTION) { File file=choose.getSelectedFile(); //取得选择的文件夹 FileWriter fw=null; try { //保存 fw=new FileWriter(file); fw.write(textArea.getText()); currentFileName=file.getName(); //将保存文件名存起来 fw.flush(); //把缓冲区的数据强行输出 this.setTitle(currentFileName); } catch(Exception e) { e.printStackTrace(); } }}replace.addActionListener(new ActionListener() { // "替换"按钮的事件处理 public void actionPerformed(ActionEvent e) { if (replaceText.getText().length() == 0 && textArea.getSelectedText() != null) //替换文本内容长度为空和文本不为空 textArea.replaceSelection(""); if (replaceText.getText().length() > 0 && textArea.getSelectedText() != null) textArea.replaceSelection(replaceText.getText()); }});
    四、系统的调试和运行4.1 程序运行界面
    4.2 “文件”菜单的菜单项
    4.3 “编辑”菜单的菜单项
    4.4 打开文件、保存、另保存时的界面
    4.5 打开了某一文本的截图
    4.6 使用查找、替换时的界面截图
    4.7 查找某一内容的截图
    4.8 “o”替换“H”的截图
    总结由于本次课程设计是一个人选一个题目,所以只有通过自已努力,有什么不懂的请教同学或在网上搜集一些资料,可网上的资料有很多的不足,刚开始的两天,感觉还有很多地方需要查资料,进度也比较慢。
    参考文献
    [1] 叶核亚.《数据结构(Java 版)(第 3 版)》.北京:电子工业出版社.2013 年.
    [2] 刘小晶. 《数据结构实例解析与实验指导——Java 语言描述》.北京:清华大学出版.2013 年.
    [3] 徐孝凯. 《数据结构实用教程(Java 语言描述)》.北京:清华大学出版.2013 年.
    [4]陈媛. 《算法与数据结构(Java 语言描述)》.北京:清华大学出版.2013 年.
    0 评论 1 下载 2021-07-24 09:52:44 下载需要12点积分
  • 基于Bootstrap实现的十七速递网站

    一、目标及要求随着二十一世纪新兴科技的飞速发展,如今的电子信息产业,正在经受着一个巨大的挑战,同时也面临着一个重大的机遇。就目前的科技发展水平而言,电子信息产业的发已经不能够满足社会化大生产的要求,因此,各个国家集中人力、财力加大对信息技术产业的投入,以适应目前需要。可喜的是在这几十年的发展中我们有了互联网、互联网加大了我们了解世界的眼界,缩紧了人与人之间的距离,这就更容易的使我们走上信息化的道路。
    以往,人们物要素自去店速物购,后来答越来越发达,邮政,快递也迅速发展起来了,不出门就能买到己心仪的商品成了人们的需求。
    正是因为人们的这些需求,越来越多的购物网站出现在网络上,人们可以随时了解日己话要的物品方面的新间,我正要做到足不出户,便可买到天下物。把购物与网络连接起来,必将是社会发展的必经之路。所以,做了此次的期末设计作品。
    二、网站规划2.1 需求分析此网页能够满足用户对快递进行寄件、查询、服务,并可以了解此公司的简介、历史、企业的发展等,也可以咨询加盟及招聘等服务随时随地的打开网页就可以进行这些优质服务。无论是省内还是省外的快递都可以进行服务,网页的设计还进行了功能的分类。分首页、服务大厅、自助查询、产品与服务、加入十七、新闻公告、走进十七七大网页设计,包含的功能有十七常识、新手入门、投诉建议、下载中心、运单查询、网点查询、货物追踪、订单查询、快运产品、定制产品、增值服务、整车转运、仓储物流、加盟指南、在线加盟、人才服务、人才招聘、在线招聘、十七新闻、十七公告、行业动态、企业视频、企业微薄、十七简介、十七历程、十七文化、十七品牌、联系我们、企业邮箱登录、十七速递系统登录功能。网页的设计根据自己个人爱好来设计,比较简易,颜色不是浓艳,这样正是符合了让用户比较舒适的视觉感。
    2.2 网站结构分析站点目录:分为 CSS、fonts、images、js、文件夹和 about.html、contact.html、、index.html、job.html、join.html 、netinfo.html、netlist.html、network.html、news.html、product.html、search.html、search2.html、search3.html、search4.html、service.html、tousu.html

    2.3 网站风格分析网站主要以简约风格为主,简洁的表现形式来满足对此网页的了解。

    总体印象:以展示本网页优点等,主题突出,内容精干,形式简洁
    版式布局:栏目集中,分栏目检索明确,导航标志清晰
    色彩运用:总体呈白色简洁风格
    图片运用:配合文字,以极简的图片效果吸引用户
    语言:中文
    结构:浏览路线方便快捷、清晰明确

    2.4 功能模块图
    三、页面详细设计3.1 首页设计整个主页布局主要是用了响应式设计,导航栏运用了下拉菜单技术,导航栏下面的图片使用了轮播图技术展现,导航栏下拉菜单中设计了通过加入超链接点击进入对应的页面。在页面最底部还加入了网页的相关信息。


    效果图:




    3.2 服务大厅设计本页面布局和主页面设计相似,页面的头部和底部和主页面一样,中间部分设计了四个主要功能,物流常识、新手入门、投诉建议、下载中心。个别功能下面设置了超链接,点击后便会调转到其它页面内容。整个页面看起来非常简洁。


    效果图:



    3.3 自助查询页面设计



    效果图:






    3.4 产品与服务页面设计
    效果图:


    3.5 加入十七页面设计


    效果图:




    3.6 新闻公告页面设计
    效果图:



    3.7 走进十七页面设计
    效果图:




    四、网站测试下拉菜单测试

    首页轮播图测试

    移动端测试



    底部

    总结这个学期开设了《Bootstrap 与移动应用开发》这门课程,经过一个学期的学习,我掌握了不少关于响应式网页设计的知识。懂得了响应式网页设计的基本知识,之前的课程页简单学习了网页设计,这次的响应式网页设计是对之前基础网页设计的深入学习。在课堂上老师会一个功能一个功能进行讲解,同时布置课堂作业,我会在课堂上按照老师所讲过的知识点去完成课堂作业,但是课后并没有能够自主抽出时间去练习。这次的期末课程设计是运用了老师平时在课堂上讲过的知识点进行网页设计,例如:下拉菜单、轮播图、媒体查询等知识点。真正把这些知识点全部结合起来设计出一个完整的响应式网页,还是非常不易的。但是我相信多花点时间慢慢来,最终还是可以设计出自己想要的效果.经过两个星期的努力。我最终完成了自己的网页(界面简约)“十七速递”。虽然在这期间困难重重,绝大部分的知识点都是要借鉴学习才能完成。还要找同学帮忙或是在网上寻找资料。但是看着自己设计的网站,我心里多少有些自豪。固然我的网站离一个完整、成功的网站还有一大段距离,我会继续努力,丰富自己的专业知识。通过导论课老师的普及,我懂得了一个成功的网站,在于它能从真正意义上为用户服务,满足他们的需求。在本次网站综合设计中,我在巩固了这个学期知识的基础上,也汲取了更多关于响应式网页设计方面的知识,即使还不够完善,没达到自己想要的效果。
    在课程设计过程中也出现了很多的问题,如忘记使用样式的设置导致盒子位置错乱、class 和 id 的使用有什么区别,还有通过媒体查询的方式进行设置响应式网页的移动端,但通过看书,上网查询,请教同学等方式,不断地学习、思考、实践、提高,最终顺利的完成了作品。但是还是有一些自己想要设计进去的东西没有办法加进去,因为技术还不够,自己时间的安排不合理没有学习到那方面的知识。
    0 评论 2 下载 2021-07-24 09:52:25 下载需要11点积分
  • 基于Bootstarp实现的爱旅行网站

    一、引言由于时下大多数人生活优越,交通工具方便快捷,信息获取方便,导致旅游业迅猛发展。为了方便旅游爱好者在网上获取信息,有效地掌握各大旅游景点的详细情况,我们开发出一套适合于旅游者在网络上快速获取信息的管理系统。通过本系统,出行者可以查看某个地区的全部景点列表,了解某个景点的详细情况,自驾车、公交线路,获取景区内的旅游地图等。该系统为游客提供全面的旅游服务.
    二、需求分析通过本系统,出行者可以查看某个地区的全部景点列表,了解某个景点的详细情况,自驾车、公交线路,获取景区内的旅游地图等。该系统为游客提供全面的旅游景点查询服务。本系统的功能主要包括:旅游查询、酒店查询、交通查询、景点查询、、用户管理。
    所用技术:Bootstarp、HTML、CSS
    三、网站结构设计3.1 总体设计该网站由首页、酒店浏览页面、客服中心、帮助中心页面、登录页面、注册页面六个页面组成。

    3.2 详细设计3.2.1 首页该页面的布局由顶部导航栏、搜索框、菜单导航栏、广告轮播图、服务搜索、主体内容、底部七个部分组成。主体内容又由旅游信息、酒店信息、机票信息、用车、玩乐五个部分组成。布局如下图。

    3.2.2 酒店浏览该页面的布局由顶部导航栏、搜索框、菜单导航栏、广告图、酒店查询、酒店服务、酒店推荐、底部八个部分组成。布局如下图。

    3.2.3 客服中心该页面的布局由顶部导航栏、搜索框、菜单导航栏、主体内容、底部五个大部分组成。其中主题内容由在线咨询、热门问题、常见问题三个部分组成。布局如下图。

    3.2.4 帮助中心该页面的布局由顶部导航栏、搜索框、菜单导航栏、主体内容、底部五个大部分组成。其中主题内容由问题搜索框、问题分类、快速引导三个部分组成。布局如下图。

    3.2.5 登录页面该页面由 Logo 标志、主体内容、底部三个大部分组成。主体内容由背景图、登录框两个部分组成。布局如下。

    3.2.6 注册页面该页面由 Logo 标志、主体内容、底部三个大部分组成。主体内容由背景图、注册框两个部分组成。布局如下。

    四、项目效果实现4.1 首页4.1.1 整体效果
    4.1.2 功能实现顶部导航栏
    通过单击“你好,请登录”、“免费注册”以及“客服中心”三个组件,可以分别转到登录页面、注册页面以及客服中心。效果图如下。

    菜单导航栏
    点击带有倒三角形的一级菜单,可以切换出其对应的二级菜单。同时点击“酒店”的二级菜单中的“国内酒店”可以转到酒店浏览页面。效果图如下。

    服务搜索
    点击不同的标签页可以进行不同的搜索,目前只实现了静态。效果图如下。

    快速定位
    通过点击左边的 Affix 插件,可以快速定位到右边与其相对应的内容。效果图如下。

    4.2 酒店浏览4.2.1 整体效果
    4.2.2 功能实现顶部导航栏
    通过单击“你好,请登录”、“免费注册”以及“客服中心”三个组件,可以分别转到登录页面、注册页面以及客服中心。效果图如下。

    菜单导航栏
    点击带有倒三角形的一级菜单,可以切换出其对应的二级菜单。同时点击“酒店”的二级菜单中的“国内酒店”可以转到酒店浏览页面。效果图如下。

    酒店搜索
    通过输入目的地名称、酒店名称、入住时间、退房时间、房间数、房间人数进行酒店查询。目前只实现静态效果。

    酒店推荐
    点击不同的标签页,可以切换不同的内容。

    4.3 客服中心4.3.1 整体效果
    4.3.2 功能实现顶部导航栏
    通过单击“你好,请登录”、“免费注册”以及“客服中心”三个组件,可以分别转到登录页面、注册页面以及客服中心。效果图如下。

    菜单导航栏
    点击带有倒三角形的一级菜单,可以切换出其对应的二级菜单。同时点击“酒店”的二级菜单中的“国内酒店”可以转到酒店浏览页面。效果图如下。

    热门问题搜索
    输入关键词可以查询相关问题。目前只实现静态效果。效果图如下。

    4.4 帮助中心4.4.1 整体效果
    4.4.2 功能实现顶部导航栏
    通过单击“你好,请登录”、“免费注册”以及“客服中心”三个组件,可以分别转到登录页面、注册页面以及客服中心。效果图如下。

    菜单导航栏
    点击带有倒三角形的一级菜单,可以切换出其对应的二级菜单。同时点击“酒店”的二级菜单中的“国内酒店”可以转到酒店浏览页面。效果图如下。

    折叠
    通过使用 collapse 插件对问题分类进行折叠,点击某个问题就会显示其更加详细的问题分类。


    问题详情
    通过点击快速引导或问题分类里的相关问题可以查看其详情。

    4.5 登录4.5.1 整体效果
    4.5.2 功能实现目前只实现静态效果。
    4.6 注册4.6.1 整体效果
    4.6.2 功能实现目前只实现静态效果。
    总结经过这段时间的学习,我对网页设计方面的知识又增加了不少,这次我做的是一个以“旅游”为主题的网站,虽然代码敲到手酸,但看到作品成型时,心里还是有点成就感的。,在通过网上查找资料解决问题,可能没那么完美,也解决得差不多,不断地学习、思考、实践、提高,设计出的网页不论是外观还是内容,都会比前一次的好很多,通过这次网站设计,我对那些代码的使用更加熟练。
    0 评论 1 下载 2021-07-24 09:52:07 下载需要11点积分
  • 基于Android和SQLite实现的轨迹追踪地图

    一、引言在信息高速流动的现代社会,移动设备凭借其便于携带和随时随地收发信息的优点,成为了大多数人生活中必要的娱乐和通讯工具。而在手机移动网络所提供的大量服务中,基于在线地图的地位服务已经成为了一项实用的新型业务。它可以通过移动端的定位技术,提供给用户和位置相关的信息,满足不同用户的需求。
    二、需求分析该程序主要分为登录注册界面、主界面,历史记录查询界面。

    登录注册界面又分为欢迎界面、登录界面和注册界面
    主界面主要有三个功能模块,分别是定位模块、轨迹信息模块和个人信息模块
    历史轨迹界面由一个地图和一个按钮组成,点击按钮可以选择要查询的日期。如果当天日期有运动记录则会在地图上面显示出来


    三、数据库设计该项目使用 SQLite 数据库设计了一个用户信息表(user),用于存储用户信息。



    字段名
    类型
    约束
    说明




    id
    int
    主键,自增
    用户的唯一 id


    GUID
    varchar(50)
    唯一
    唯一识别标示符


    username
    Varchar(50)

    用户名


    password
    Varchar(50)

    密码



    四、功能模块设计该系统的功能模块主要分为登陆注册模块、定位模块、轨迹模块、个人信息模块、查看历史轨迹模块。
    4.1 登录注册模块该模块会验证用户的登录信息,检查用户名和密码是否正确;在注册时,用户需要填写用户名和密码才可以进行注册。注册成功后可自动进入系统。效果图如下。


    4.2 定位模块在打开程序显示的就是定位模块。主要的功能就是定位和显示当前用户的位置信息。该模块可以精确地定位到用户当前位置。效果图如下:

    4.3 轨迹模块在主界面通过滑动或者点击底部 tab 可以进入轨迹模块,这个模块主要功能是用来显示用户实时的轨迹。效果图如下。


    4.4 个人信息模块该模块主要是可以查看历史轨迹和退出程序。点击查看历史轨迹按钮可进入查看历史轨迹模块。效果图如下。

    4.5 查看历史轨迹模块该模块可以根据用户选择的查询日期来进行运动轨迹查询。点击选择日期按钮,则会弹出日期选择对话框,选择好日期后点击确认,如果当天有运动记录则会显示出来,底部通过 TextView 来显示相应的数据。如果没有运动记录,则会有相应的提示。效果图如下。


    总结本系统经过反复测试,运行稳定,可以满足用户对轨迹跟踪记录的需求。但是,系统仍然存在有待完善和改进之处,具体表现在以下几个方面:

    增加文件导入和导出功能:能把本地保存的轨迹记录通过文件的形式导出,当用户更换手机时,再将文件导入就避免了数据的丢失
    丰富轨迹点的位置细节信息:比如用户可以查看到自己在轨迹中哪个地点停留的时间比较长、到达哪个地点次数比较多,从而满足用户的个性化需求
    在桌面端实现轨迹的监控:用户可以将自己的轨迹或者现在的位置分享给家人或朋友,在紧急情况下可发挥重要作用

    参考文献
    [1] 汪永松.Android 平台开发之旅[M].北京:机械工业出版社,2010.7.
    [2] 杨丰盛.Android 应用开发揭秘[M].北京:机械工业出版社,2010.1.
    [3] 李申申.基于轻量级架构的简牍图像信息系统[D].四川:成都理工大学,2006.
    [4] 卢翰,王国辉.JSP 项目开发案例全程实录(第 2 版)[M].北京:清华大学出版社,2011.
    [5] 张孝祥,徐明华.JSP 基础与案例开发详解[M],北京:清华大学出版社,2009.
    [6] 刘建伟,毛剑,胡荣磊.网络安全概论[M].北京:电子工业出版社,2009.
    0 评论 1 下载 2021-07-23 12:23:57 下载需要11点积分
  • 基于Python和Mongodb实现的珠宝管理系统

    一、需求分析为了能让非关系数据库在日常系统中应用,让更多用户体验到 Mongdb 带来的便利,并且 MongoDB 能在每秒上万条数据的并发写入,速度极快且非常便利,并且满足数据字段的多变性。这个学期的期末报告,我进行开发了一个珠宝管理系统。
    珠宝网站排行榜的对象是对珠宝信息进行管理,最大限度地减轻工作人员地工作量,为了更高效率满足用户需求,系统具体功能:

    页面设计简洁大方、操作方便、快速
    实现对珠宝管理,包括其品牌、价格、钻石净度、主钻分数、镶嵌方式、销量
    基于 MongoDB 存储,而登陆注册采用 Redis 数据库,并且进行加密处理

    具体功能:

    管理功能:包括用户注册、登录功能
    排行榜功能:根据珠宝的销量进行珠宝排行
    管理珠宝功能:登录后可以对珠宝进行增删改。为了数据的可读性,添加数据时,品牌不能为空
    在线浏览功能:用户可以浏览查看珠宝的详细信息

    二、系统设计2.1 系统功能结构珠宝排行榜网分两部分设计,前台和后台设计,前台主要包括主页【排行榜】功能模块。后台管理模块包括【注册】【登录】【珠宝管理】等功能模块。
    2.2 系统业务流程图
    三、系统开发准备
    开发环境:Python3.6
    开发软件:Pycharm
    数据库:MongoDB Redis
    数据库可视化:Robo 3T 1.4.0

    四、数据库设计4.1 MongoDB 数据库分析珠宝管理系统需要使用 MongoDB 存储和管理珠宝基本所有的数据。MongoDB 存储数据强大,且能适应多变性,本系统数据库名称为“zhubao”,其中包含 2 张数据表,详细信息如下图所示。

    4.2 数据库概念设计user E-R 图

    zhubao E-R 图

    4.3 非关系型数据库逻辑设计4.3.1 user 表的逻辑结构
    4.3.2 zhubao 表的逻辑结构
    4.3.3 Redis
    五、模块设计5.1 登录、注册模块登录界面对象是管理员,其可输入账号、密码。当用户输入错误时,则不可登录。,若是第一次使用该系统,需要进行注册。

    点击登录或注册实现功能,若所注册用户名已存在,将注册失败并弹出提示窗口。

    具体后台代码如下:


    前端设计代码:

    6.2 管理模块登录成功之后,进入首页界面,可以对珠宝数据进行管理,可以对珠宝数据进行增加、修改、删除操作。注意的是,在增加操作的时候,添加品牌数据不能为空。效果图如下:

    前端设计代码:

    添加功能:

    前端设计代码:

    后台代码:


    修改功能:

    前端设计代码:

    后台代码设计:


    删除功能:

    后台设计代码:


    七、效果图展示登陆注册功能展示


    添加珠宝功能展示

    添加成功展示

    修改数据功能展示

    修改后展示

    删除功能

    删除后展示

    总结本次大作业为使用 MongoDB 非关系数据库开发一个系统。这次开发的过程中让我学会了使用 MongoDB 语言以及对系统的简单开发。通过这次的实践操作,我学习到很多,收获很大。能够把课堂上所教的基础知识运用到这次的项目设计中。
    在这次的项目设计上也遇到了一些难题,对于 python 的学习过少,导致在项目设计过程中遇到了很多困难,所以只能边上网学习 python 边进行项目设计,所以这过程花费大量时间,临近期末,很多课程都要上交课程设计项目,时间上分配不合理,所以最先设想的功能没能很好的设计实现。
    0 评论 1 下载 2021-07-23 12:23:36 下载需要14点积分
  • 基于JSP+Servlet+MySQL实现的电子商城购物系统

    一、课程设计的目的《Asp.Net 应用开发项目设计》课程是软件工程专业学生的一项必修实践性教学环节。通过课程设计,使学生提高理论联系实际解决实际问题的能力;也使学生对基于面向对象的理论进行系统设计过程中的诸多具体问题有感性的认识和深入的理解;进而提高学生的学习兴趣为其将来顺利进入毕业环节作必要的准备。
    二、课程设计内容2.1 选题及需求分析本次课题设计我选择电子商城系统为主题进行设计,开发一个功能比较完善的在线购物系统,主要为在线销售和在线购物提供服务。该系统的对象为普通用户、会员和系统管理员。该系统功能主要分为两部分,一部分是面向用户部分,包含:普通用户在线注册、登录、购物、提交订单、付款等操作;另一部分是商城管理部分,这部分的内容包括:商品的添加、删除、查询、订单的管理、注册用户的管理、系统的维护等。电子商城功能系统框架图:

    2.1.1 前台功能
    首页

    显示商品类别列表,例如计算机类,玩具类等根据用户选择的类别以列表形式显示商品,且显示商品部分信息显示商品详细信息加入购物车
    销售排行

    显示最受欢迎的商品并进行排行
    新品上架

    显示最新上架的商品信息
    会员信息管理

    注册会员登录修改信息并保存
    购物车

    添加商品到购物车查看购物车:显示用户所选商品信息修改购物车:修改数量,删除商品信息自动计算金额总和
    结算

    进入库存,查看库存商品是否满足购买要求
    如果符合要求,则购买成功,生成订单,生成出库单,修改库存如果不符合要求则提示用户重新购买
    选择支付方式
    特价商品

    显示特价商品信息
    订单

    查看订单信息删除订单信息
    公告

    显示公告信息
    商品查询

    可以查询商品信息
    友情链接

    链接其他网站等

    2.1.2 后台功能
    商品管理

    增加商品信息修改商品信息删除商品信息
    会员管理

    显示所有注册会员的信息
    管理员管理

    登录进入系统修改管理员信息添加管理员数量删除管理员信息
    订单管理

    显示所有订单信息
    公告管理

    发布公告信息删除公告信息
    友情链接管理

    添加链接信息等

    2.2 系统功能设计2.2.1 系统功能模块设计系统主要设计了注册登录功能模块、订单信息模块、商品信息模块、管理用户信息模块、公告模块、最新上架商品信息模块、销售排行模块、友情链接模块、商品查询模块。

    注册登录模块:主要是普通用户注册必须填写所要求的个人资料,完成个人资料后成为一名会员,接着可以登录进入系统进行其他操作
    订单信息模块:包括会员及系统管理员对订单信息进行不同权限的操作。会员可以查看并删除自己形成的订单信息;系统管理员管理着所有会员所生成的订单信息
    商品信息模块:包含普通用户、会员、系统管理员所能得到的不同权限的操作服务。普通用户可以游览部分商品信息,会员则可以享受到前台的所有服务,而系统管理员还承担着管理商品信息的职责
    管理用户信息模块:包含着会员可以修改个人信息,系统管理员可以管理所有注册人员的信息
    公告模块:包含会员具有查看公告及删除公告信息的权益,以及系统管理员有发布、删除公告的管理权限
    最新商家商品信息模块:展示了最新的商品信息
    销售排行模块:显示了销售量排行靠前的商品信息
    商品查询模块:表示会员可以根据关键词查询自己想要获取到的相关商品信息
    友情链接模块:表示可以从本系统跳转到其他系统,享受其他服务

    2.3 系统功能实现该系统涉及到的功能比较多,要描述的部分也比较多,因此在这里只选取部分功能的实现来展开介绍。
    2.3.1 用户注册和登录代码实现
    用户注册和管理模块主要包括用户注册、登录及找回密码 3 个部分。
    用户注册
    当用户第一次登录时首先要注册,成为会员后,才可以购买物品。用户可以通过单击首页的注册按键来打开注册页面进行会员注册操作。
    为了便于管理网站对用户的管理,在用户注册页接收到的注册信息要经过严格的过滤,保证注册用户的唯一性,在提交表单后需要对数据表中的数据进行查询,如果没有找到,则在插入数据表时提示注册成功,否则提示用户以被站用,请重新注册,部分代码如下:
    <tr> <td width="107" height="35"> <div align="right"> 会员名称: </div> </td> <td width="163"> <div align="left"> <html:text property="name"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> 会员密码: </div> </td> <td> <div align="left"> <html:password property="password"> </html: password> </div> </td></tr><tr> <td height="35"> <div align="right"> 密码确认: </div> </td> <td> <div align="left"> <input type="password" name="passwordOne"> </div> </td></tr><tr> <td height="35"> <div align="right"> 真实姓名: </div> </td> <td> <div align="left"> <html:text property="reallyName"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> 年龄: </div> </td> <td> <div align="left"> <html:text property="age"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> 职业: </div> </td> <td> <div align="left"> <html:text property="profession"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> Email地址: </div> </td> <td> <div align="left"> <html:text property="email"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> 找回密码问题: </div> </td> <td> <div align="left"> <html:text property="question"> </html: text> </div> </td></tr><tr> <td height="35"> <div align="right"> 答案: </div> </td> <td> <div align="left"> <html:text property="result"> </html: text> </div> </td></tr>
    会员登录
    网站首页在用户第一次访问时会判断用户是否登录,未登录则显示用户登录窗口,提示用户登录或注册。对于已经登录的用户,在用户登录窗口将显示用户的相关信息。
    首页主要是根据保存用户名信息的 Session 参数来判断用户是否已经登录的,部分代码如下:
    <tr> <td width="125"> </td> <td width="422" valign="bottom"> <table width="411" border="0"> <tr> <td width="55" height="38"> <font color="#9A6634"> <strong> 用户名: </strong> </font> </td> <td width="104"> <input name="account" type="account" class="bgtext" size="15"> </td> <td width="45"> <font color="#9A6634"> <strong> 密码: </strong> </font> </td> <td width="113"> <input name="password" type="password" class="bgtext" size="15"> </td> <td width="72"> <div align="right"> <input name="Submit" type="image" class="bgButtoninput" src="image/bg-land.gif"> </div> </td> </tr> <tr> <td height="30" colspan="5"> <div align="right"> <a href="index.jsp" class="a1"> 返回 </a> </div> </td> </tr> </table> </td></tr>
    找回密码
    当密码意外丢失,会给用户带来不必要麻烦,重新注册一个新的用户,浪费了新得用户的时间,也浪费了网站的资源,如果用户只记住自己的用户名和电子邮箱名,并提供密码提示的问题和答案,就可以找回密码。
    用户单击查找按钮,系统会进行验证提交的信息是否完全符合数据库中的查询条件。只有符合才能显示密码结果,否则弹出“你输入的信息有误”的提示对话框。部分代码如下:
    <%if(form==null||form.equals( "")) { %> <p> <strong> 不存在此会员名称,请重新输入!!! </strong> </p> <meta http-equiv="refresh" content="3;URL=findOne.jsp"> <% } else { %> <p> <strong> 输入答案 </strong> </p> <form name="form" method="post" action="fg-three.jsp" onSubmit="return checkEmpty(form)"> <table width="298" border="0" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF" bordercolordark="#819BBC" bordercolorlight="#FFFFFF"> <tr> <td width="105" height="35"> <div align="right"> 问题: </div> </td> <td width="187"> <div align="left"> <input type="hidden" name="name" value="<%=form.getName()%>"> <input type="hidden" name="question" value="<%=form.getQuestion()%>"> <%=form.getQuestion()%> </div> </td> </tr> <tr> <td width="105" height="35"> <div align="right"> 答案: </div> </td> <td width="187"> <div align="left"> <input type="text" name="result"> </div> </td> </tr> </table> <br> <input type="image" class="input1" src="image/save.jpg" width="51" height="20"> <a href="#" onClick="javascript:form.reset()"> <img src="image/clear.gif"> </a> <a href="#" onClick="javasrcipt:history.go(-1)"> <img src="image/back.gif"> </a> </form> <% }%>
    2.3.2 购物车代码实现会员可以进行添加商品到购物,删除购物车商品信息等操作,设计思路如下:

    获取到数据,序列化器进行校验
    获取到商品 id,count 和是否选中信息
    判断用户是否为登录用户

    如果为登录用户则数据保存到redis连接 Redis将校验过的数据设置到 hash 中(如果添加的是同一件商品,需要用到 hincrby 累加)如果传过来的 selected 是 true,将它添加到 set 中返回序列化之后的数据
    如果为非登录用户保存到cookies

    获取到 cookie 中的 cart 的值
    如果 cart 存在,对其解码解密如果不存在,令 cart={}
    判断传过来的 sku_id 是否在 cart 中
    如果在,获取到之前的 count,让他加上此次传过来的 count 值
    重新设置 cart 的值,并对其进行编码加密处理然后重新写入到 cookie 中,返回给前端

    部分代码如下:
    <strong> 我的购物车</strong><div align="center"> <br> <%if(session.getAttribute( "cart")==null) { %> 您还没有购物!!! <% } else { %></div><form method="post" action="cart_modify.jsp" name="form"> <table width="92%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF" bordercolordark="#819BBC" bordercolorlight="#FFFFFF"> <tr> <td width="16%" height="28"> <div align="center"> 序号 </div> </td> <td width="23%"> <div align="center"> 商品的名称 </div> </td> <td width="22%"> <div align="center"> 商品价格 </div> </td> <td width="22%"> <div align="center"> 商品数量 </div> </td> <td width="17%"> <div align="center"> 总金额 </div> </td> </tr> <% float sum=0; Vector cart=(Vector)session.getAttribute( "cart"); for(int i=0; i<cart.size(); i++) { SellGoodsForm form=(SellGoodsForm)cart.elementAt(i); sum=sum+form.number*form.price; System.out.print( "sum="+sum); %> <tr> <td height="28"> <div align="center"> <%=i+1%> </div> </td> <td> <div align="center"> <%=dao.selectOneGoods(new Integer(form.ID)).getName()%> </div> </td> <td> <div align="center"> <%=form.price%> 元 </div> </td> <td> <div align="center"> <input name="num<%=i%>" size="7" type="text" value="<%=form.number%>" onBlur="check(this.form)"> </div> </td> <td> <div align="center"> <%=form.number*form.price%> 元 </div> </td> </tr> <script language="javascript"> < !-- function check(myform) { if (isNaN(myform.num < %=i % >.value) || myform.num < %=i % >.value.indexOf('.', 0) != -1) { alert("请不要输入非法字符"); myform.num < %=i % >.focus(); return; } if (myform.num < %=i % >.value == "") { alert("请输入修改的数量"); myform.num < %=i % >.focus(); return; } myform.submit(); }--> </script> <% }%> </table>
    2.3.3 个人信息修改代码实现会员可以对自己的注册信息进行修改,实现思路如下:
    修改用户名,邮箱等
    根据当前登录的用户 id 查询查询用户信息并且返回对象 u1,判断此时的 u1 是否为 null,如果为 null 表示当前正在登录的用户已经从数据库删除了,那么此次修改没有意义,抛出用户不存在的异常;如果不为 null,表示此次的用户仍然存在,那么这个 id 是可用的,设置在 user 对象中,便于后面执行 update(User user)方法调用
    如果 u1 不为 null,根据用户输入的用户名查询用户信息,返回 u2,如果这个 u2 不为 null 并且其中的用户名和当前正在登录的用户名不相同,那么说明这个用户名已经在数据库中存在了,抛出用户名已经存在的异常,反之说明这个修改过后的用户名是可用的,因此设置在 user 对象中,便于后面的修改调用。
    如果前面的内容都能正常进行,那么此时就可以更新了。
    修改密码

    根据 id 查询用户信息,返回 user
    如果 user=null,抛出用户不存在的异常如果 user!=null,比较 user 中的密码和用户输入的旧密码 oldPassword 是否相同
    如果密码不相同,抛出密码不匹配的异常如果密码相同,表示用户输入的旧密码是正确的,那么更新密码即可


    部分代码如下:
    <tr> <td width="105" height="35"> <div align="right"> 会员名称: </div> </td> <td width="187"> <div align="center"> <input type="hidden" name="name" value="<%=form.getName()%>"> <%=form.getName()%> </div> </td></tr><tr> <td height="35"> <div align="right"> 原来的密码: </div> </td> <td> <div align="center"> <input type="hidden" name="result" value="<%=form.getResult()%>"> <input type="hidden" name="question" value="<%=form.getQuestion()%>"> <input type="hidden" name="passwordOld" value="<%=form.getPassword()%>"> <input type="password" name="oldPassword"> </div> </td></tr><tr> <td height="35"> <div align="right"> 会员密码: </div> </td> <td> <div align="center"> <input type="password" name="password"> </div> </td></tr><tr> <td height="35"> <div align="right"> 密码确认: </div> </td> <td> <div align="center"> <input type="password" name="passwordOne"> </div> </td></tr><tr> <td height="35"> <div align="right"> 真实姓名: </div> </td> <td> <div align="center"> <input type="text" name="reallyName" value="<%=form.getReallyName()%>"> </div> </td></tr><tr> <td height="35"> <div align="right"> 年龄: </div> </td> <td> <div align="center"> <input type="text" name="age" value="<%=form.getAge()%>"> </div> </td></tr><tr> <td height="35"> <div align="right"> 职业: </div> </td> <td> <div align="center"> <input type="text" name="profession" value="<%=form.getProfession()%>"> </div> </td></tr><tr> <td height="35"> <div align="right"> Email地址: </div> </td> <td> <div align="center"> <input name="email" type="text" value="<%=form.getEmail()%>"> </div> </td></tr>
    2.3.4 商品管理代码实现系统管理员可以对商品进行管理,部分代码如下:
    <tr> <td> <div align="center"> <strong> 查看商品的详细情况 </strong> </div> </td></tr></table><br><table width="90%" height="209" border="1" cellpadding="1" cellspacing="1"bordercolor="#FFFFFF" bgcolor="#CCCCCC"> <tr> <td width="20%" height="26"> 所属大类别 </td> <td width="31%" bgcolor="#FFFFFF"> <%=big.selectName(goodsForm.getBig())%> </td> <td width="20%"> 所属于小类别 </td> <td width="31%" bgcolor="#FFFFFF"> <%=small.selectName(goodsForm.getSmall())%> </td> </tr> <tr> <td height="26"> 商品名称 </td> <td bgcolor="#FFFFFF"> <%=goodsForm.getName()%> </td> <td> 生产厂商 </td> <td bgcolor="#FFFFFF"> <%=goodsForm.getFrom()%> </td> </tr> <tr> <td height="26"> 商品定价 </td> <td bgcolor="#FFFFFF"> <%=goodsForm.getNowPrice()%> 元 </td> <td> 特价 </td> <td bgcolor="#FFFFFF"> <%=goodsForm.getFreePrice()%> 元 </td> </tr> <tr> <td height="26"> 商品简介 </td> <td colspan="3" bgcolor="#FFFFFF"> <%=goodsForm.getIntroduce()%> </td> </tr> <tr> <td height="79"> 商品图片 </td> <td colspan="3" bgcolor="#FFFFFF"> <input name="imageField" type="image" src="<%=goodsForm.getPriture()%>" width="140" height="126"> </td> </tr></table><table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <%String mark=goodsForm.getMark().toString(); %> <td width="65%" height="29" align="right"> <%if(mark.equals( "0")) { %> <% } else { %> <a href="goodsAction.do?action=11&id=<%=goodsForm.getId()%>&mark=0"> 删除特价信息 </a> <% }%> </td> <td width="22%" align="right"> <%if(mark.equals( "0")) { %> <a href="goodsAction.do?action=10&id=<%=goodsForm.getId()%>"> 设置特价商品 </a> <% } else { %> <a href="goodsAction.do?action=10&id=<%=goodsForm.getId()%>"> 调整特价商品 </a> <% }%> </td> <td width="13%"> <a href="javascript:history.back();"> 返回 </a> </td>
    2.3.5 会员信息管理代码实现系统管理员可以对所有注册会员的信息进行管理,部分代码如下:
    <tr> <td width="14%" height="25"> <div align="center"> 编号 </div> </td> <td width="14%"> <div align="center"> 会员账号 </div> </td> <td width="14%"> <div align="center"> 会员姓名 </div> </td> <td width="14%"> <div align="center"> 会员年龄 </div> </td> <td width="38%"> <div align="center"> 操作 </div> </td></tr><%for(int i=start; i<over; i++) { MemberForm form=(MemberForm)list.get(i);%> <tr bgcolor="#FFFFFF"> <td height="30"> <div align="center"> <%=form.getId()%> </div> </td> <td> <div align="center"> <%=form.getName()%> </div> </td> <td> <div align="center"> <%=form.getReallyName()%> </div> </td> <td> <div align="center"> <%=form.getAge()%> 岁 </div> </td> <td>
    2.3.6 公告管理代码实现系统管理员可以对公告进行管理操作,部分代码如下:
    <tr> <td width="23%" height="30"> <div align="center"> 公告标题 </div> </td> <td width="77%" bgcolor="#FFFFFF"> <%=affiche.getName()%> </td></tr><tr> <td width="23%" height="208"> <div align="center"> 公告内容 </div> </td> <td width="77%" bgcolor="#FFFFFF"> <%=affiche.getContent()%> </td></tr></table><table width="82%" height="30" border="0" cellpadding="0" cellspacing="0"> <tr> <td> </td> <td> <div align="right"> <a href="javascript:history.go(-1)"> 返回 </a> </div> </td> </tr>
    2.3.7 友情链接管理代码实现系统管理员还可以将其他网站的链接发布到该系统上实现方便的转换,部分代码如下:
    <tr> <td> <div align="center"> <strong> 连接网站信息的查询 </strong> </div> </td></tr></table><br><table width="90%" border="1" cellpadding="1" cellspacing="1" bordercolor="#FFFFFF"bgcolor="CCCCCC"> <tr> <td width="14%" height="25"> <div align="center"> 数据编号 </div> </td> <td width="28%"> <div align="center"> 网站名称 </div> </td> <td width="28%"> <div align="center"> 网站连接地址 </div> </td> <td width="30%"> <div align="center"> 操作 </div> </td> </tr> <%for(int i=start; i<over; i++) { LinkForm form=(LinkForm)list.get(i); %> <tr bgcolor="#FFFFFF"> <td height="30"> <div align="center"> <%=form.getId()%> </div> </td> <td> <div align="center"> <%=form.getLinkName()%> </div> </td> <td> <div align="center"> <%=form.getLinkAddress()%> </div> </td> <td> <div align="center"> <a href="linkAction.do?action=4&id=<%=form.getId()%>"> 删除 </a> </div> </td> <% }%> </tr>
    2.4 系统功能测试2.4.1 用户注册和登录功能测试系统首页测试图

    用户注册测试图

    用户登录测试图

    用户登录成功图

    2.4.2 购物车功能测试购物车空车图

    成功添加商品到购物车图

    2.4.3 个人信息修改功能测试个人信息修改图

    2.4.4 商品管理功能测试后台登录图

    商品信息管理图

    2.4.5 会员信息管理功能测试会员信息管理图

    2.4.6 公告管理功能测试公告信息管理图

    公告信息管理图

    2.5 友情链接功能测试友情链接管理图

    友情链接管理图

    总结本次课程设计工作在最初选题过后,我选择了 JSP,它是真正的跨平台,实现动态功能的一种技术。JSP+Servlet+JavaBeans/EJB,能够让人非常简单方便地构建安全高速的 Java Web 应用。同时可以通过 JDBC(Java DataBase Comnectivity)接口,访问几乎所有数据库,并且可以使用数据库连接池技术,有效控制连接数,确保系统的正常运转。从发展的眼光来看,JSP 的前途一片光明。在数据库的选择上,我也使用近些年发展很好的 MySQL,充分实现系统的跨平台性。
    在该系统的开发过程中,我参阅了很多相关的书籍,许多网站的帮助解决了我许多难题。系统中所有的页面,我都争取使页面上代码简捷、易懂、易改。
    经过多天的设计与开发,系统终于基本开发完成,各项预期功能都已得到实现。当然,该系统还具有进一步的扩展空间,将会伴随着日后的使用逐步完成,使得界面更加优美,操作更加顺畅。设计和开发过程中遇到的问题也都得到解决,学到了很多的开发经验,受益无穷。
    参考文献
    [1] 孙滨,霍金明,周贤来,javaWeb 程序设计,电子科技大学出版,2019
    [2] 吴迪,马宏茹,丁万宁,软件工程教程,电子科技大学出版,2019
    [3] 传智播客,MySQL 数据库入门,人民邮电出版,2008
    [4] 传智播客,HTML+CSS+javaScript 网页制作案例教程,人民邮电出版,2008
    0 评论 4 下载 2021-07-22 09:52:04 下载需要13点积分
  • 基于JAVA实现的21点游戏

    1 需求分析本系统主要提供人机对玩21点牌游戏,实现系统自动判断输赢,计算玩家金钱,并保存用户名称,金钱,头像等信息。另附带在玩游戏时提供背景音乐欣赏。
    21点游戏基本规则为:每个人最多可拿5张牌,牌的点数在21内(包括21点),玩家点数大的赢,点数相同时庄家赢,玩家点数大于21时不管庄家的点数是什么,玩家都输。A牌可以当1点或11点。当玩家的点数为21点是,其输或着赢的金钱都为点数的双倍。
    1.1 功能需求描述本系统要求采用Java GUI程序实现一个21点游戏,主要包括如下功能:

    系统发牌:游戏初始时又系统给电脑方发牌,并给用户初始发2张牌
    用户发牌:用户点击发牌按钮,只要用户的牌的点数和小于21就可以获取一张由系统从整副牌剩下的牌中产生的一张随机的牌
    开牌:当用户点击开牌按钮后,系统自动计算电脑方和游戏玩家方的牌的点数,判断输赢,计算赌注,游戏金钱出入
    用户信息设置:游戏玩家可以从菜单中打开用户设置,初始化游戏金钱,设置昵称,头像等信息
    用户信息保存:各玩家的姓名,游戏金钱,头像图片等信息都保存在一个xml文件中,游戏开始时有系统自动读取,游戏中数据变更时有系统自动保存,并在游戏中更新
    游戏背景音乐:游戏中,用户可以从菜单中选择开启或关闭游戏背景音乐

    1.2 开发环境
    JKD 1.6
    Eclipse

    2 总体设计2.1 系统类设计与算法描述2.1.1 系统类图

    2.1.2 游戏中主要算法发牌算法

    创建一副牌
    给电脑发牌,只要牌的总点数小于16,牌的张数小于5就继续为电脑发牌,每张牌都是有i中创建的整副牌中随即获取
    从i中创建好的牌中删除发出去的牌
    给玩家发2张牌,并从删除这2张牌

    点数计算算法

    计算出玩家手中的非A的牌的点数和count1,并统计A牌的个数countA
    如果A的牌的数量大于0,并且count1+11+countA-1小于等于21则取这个结尾为本步骤的结果;否则取count1+countA为本步骤结果
    算法结束

    2.2 系统功能模块设计
    2.3 界面设计
    3 系统主函数程序设计public static void main(String[] args){ //创建game,及相关参数创建及初始化(略) /*--------------界面创建(略)---------------*/ /*--------------------关键事件处理(其余事件处理略)------------*/ //菜单栏按钮事件 //音乐开按钮事件 musicOn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { game.soundPlay(); } }); //音乐关按钮事件 musicOff.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { game.soundStop(); } }); // 工具栏按钮事件处理 //发牌按钮事件 b_dealCard.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { game.countCardsValue(1); if(game.getUserCards().size() < 5 && game.getCardsValue(1)< 21){ game.addCard(1); game.countCardsValue(1); game.getUserCardsPanel().removeAll(); game.getUserCardsPanel().updateUI(); } else if(game.getUserCards().size() < 5 && game.getCardsValue(1) == 21){ String message = "<html><p>你21点啊,还不开牌...</p></html>"; JOptionPane.showMessageDialog(game,message ); } else if(game.getUserCards().size() < 5){ String message = "<html><p>不好意思!你的点数大于21</p><p>你挂了... -_-</p></html>"; JOptionPane.showMessageDialog(game,message ); } else{ String message = "<html><p>已经发了5张牌了,不能再发了</p></html>"; JOptionPane.showMessageDialog(game,message ); } } }); //重新开局按钮事件 b_newGame.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { //发牌按钮可用 b_dealCard.setEnabled(true); //开牌按钮可用 b_chechout.setEnabled(true); //重新初始化游戏 game.gameStart(); //更新空间 game.getComputerCardsPanel(false).removeAll(); game.getComputerCardsPanel(false).updateUI(); game.getUserCardsPanel().removeAll(); game.getUserCardsPanel().updateUI(); //重新设置部分空间显示 l_userValue.setText(""); l_computerValue.setText(""); l_win.setVisible(false); } }); //开牌按钮事件 b_chechout.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { //将电脑方牌正面显示 game.getComputerCardsPanel(false).removeAll(); game.getComputerCardsPanel(true).updateUI(); game.countCardsValue(0); game.countCardsValue(1); //发牌按钮不可用 b_dealCard.setEnabled(false); b_chechout.setEnabled(false); //显示玩家得点 l_userValue.setText(game.getCardsValue(1) + ""); l_computerValue.setText(game.getCardsValue(0) + ""); //设置赌注 game.setGameMoney(Integer.parseInt(T_gameMoney.getText())); //判断输赢 if( (game.getCardsValue(1) < 21 && game.getCardsValue(0) < game.getCardsValue(1)) || (game.getCardsValue(1) < 21 && game.getCardsValue(0) > 21) ){ //玩家赢单倍 l_win.setBounds(470, 340, 33, 44); gameUser.setUserMoney(gameUser.getUserMoney() + game.getGameMoney()); computerUser.setUserMoney(computerUser.getUserMoney() - game.getGameMoney()); } else if(game.getCardsValue(0) == 21 ){ //庄家得双倍 l_win.setBounds(470, 220, 33, 44); computerUser.setUserMoney(computerUser.getUserMoney() + 2 * game.getGameMoney()); gameUser.setUserMoney(gameUser.getUserMoney() + game.getGameMoney()); } else if(game.getCardsValue(1) == 21 && game.getCardsValue(0) != 21){ //玩家赢双倍 l_win.setBounds(470, 340, 33, 44); gameUser.setUserMoney(gameUser.getUserMoney() + 2 * game.getGameMoney()); computerUser.setUserMoney(computerUser.getUserMoney() - 2 * game.getGameMoney()); } else{ //庄家赢单倍 l_win.setBounds(470, 220, 33, 44); computerUser.setUserMoney(computerUser.getUserMoney() + 2 * game.getGameMoney()); gameUser.setUserMoney(gameUser.getUserMoney() - game.getGameMoney()); } l_computerMoney.setText(computerUser.getUserMoney() + ""); l_userMoney.setText(gameUser.getUserMoney() + ""); l_win.setVisible(true); gameUser.save(); computerUser.save(); } }); //赌注输入事件处理 T_gameMoney.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent arg0) { int tempMoney = Integer.parseInt(T_gameMoney.getText()); if( tempMoney < 10){ T_gameMoney.setText("10"); } else if(tempMoney < gameUser.getUserMoney() && tempMoney < computerUser.getUserMoney() ){ game.setGameMoney(tempMoney); T_gameMoney.setText(tempMoney + ""); } else if(tempMoney > gameUser.getUserMoney() || tempMoney > computerUser.getUserMoney()){ T_gameMoney.setText(Math.min(gameUser.getUserMoney(),computerUser.getUserMoney()) + ""); } game.setGameMoney(Integer.parseInt(T_gameMoney.getText())); } }); //赌注加事件 b_moneyAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if((Integer.parseInt(T_gameMoney.getText()) + 10) < computerUser.getUserMoney() && (Integer.parseInt(T_gameMoney.getText()) + 10) < gameUser.getUserMoney()){ T_gameMoney.setText(Integer.parseInt(T_gameMoney.getText()) + 10 + ""); game.setGameMoney(Integer.parseInt(T_gameMoney.getText())); } } }); //赌注减事件 b_moneySub.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if((Integer.parseInt(T_gameMoney.getText()) - 10) > 0) T_gameMoney.setText(Integer.parseInt(T_gameMoney.getText()) - 10 + ""); else T_gameMoney.setText("10"); game.setGameMoney(Integer.parseInt(T_gameMoney.getText())); } }); game.setVisible(true);}
    4 小结这个游戏系统比较难及复杂的地方在于游戏过程中的逻辑处理和和解决这些逻辑问题的有效的算法步骤。通过整个程序的代码量的分布也体现了这一点。其基础的几个类Card,Cards,User都只有少量的代码,大量的代码分布在发牌,开局,重新开局等事件处理上。界面的实现也费用了很多代码。而通过实现这个程序,我也发现了自己在逻辑问题处理上的弱势。比如在处理A牌改当1点算,还是当11点算时,我花费了很长时间来理清这个思路。而事实上这个逻辑处理比较简单。
    整个系统的结构设计没有抽象好。GameMain这个类在这里是游戏功能的主要类的实现,但是跟mian函数写在一起,又跟界面混在一起,逻辑没有跟界面脱离好。导致这个类的文件代码过长,方法过多,容易产生紊乱,给维护修改带来困难。应该从中抽象出一个专门处理游戏业务逻辑的类,把界面完全分离出来。让系统更灵活些。
    Java里的DOM不是完全是基于W3C规范的DOM。Java里的对XML的操作如果用DOM来实现的话,需要另外格式化数据,不然容易出现一些错误的假象,在未格式化的XML Document对象中,换行也会当作一个节点来处理。这让我一贯浏览器端Javascript中的DOM思维变得很无奈,通过断点,逐步查看变量的值才发现换行是个节点。这与规范的DOM不相符合,不过Java里一般会通过自有的方法先格式化XML Document,写入时也要将它格式化再写入磁盘文件。
    User类的设计缺乏对xml数据写入的考虑。开始时只想到要从xml文件中取数据,而没有考虑到写入操作,所以User类中的方法很多都是私有的,读取数据的方法。在做写入操作是由creatDoc 方法创建了,Document而getUserNode 方法操作的是另外一个Document,导致数据不一致,所以调用写入方法就毫无意义了。而如果保存了全部数据的话又会导致游戏中创建的用户得不到数据的重新初始化。应该设一个Document私有属性来达到这个类内部的Document数据统一。
    3 评论 138 下载 2018-12-21 13:22:11 下载需要11点积分
  • 基于Qt5实现的数独游戏

    1 软件用途本软件是一个数独小游戏,使用 Qt5 编写,实现了数独游戏的快速生成、以及提供任意题目的解决方案。
    2 运行方式安装 Qtcreater 之后,将源代码拷贝至本机sudoku。运行 Qtcreater 直接编译即可。
    Ubuntu 下需要额外安装软件包 qtmultimedia5-dev,进入目录之后运行 qmake -makefile;make;即可得到可执行文件 sudoku。
    3 功能介绍3.1 使用帮助
    图 1 显示了关于本软件的使用帮助。它是运行软件时的最初界面,点击 OK 即可进入主游戏界面。
    3.2 游戏界面
    图 2 显示了软件的开始游戏界面。最上方为选项栏,左侧是菜单栏,中部是数独界面,右上侧是功能栏,右中部是计时器,右下侧是数字栏。
    3.3 选项栏
    图 3 显示了软件的标题选项栏,有四种难度可供选择,每种难度下有内置 4 个关卡,并且还有按照该难度随机生成题目的选项。
    最后一个选项 Custom 提供了输入题目的功能,该软件能够给出用户提供题目的解答。
    3.4 菜单栏
    图 4 显示了软件的左侧菜单栏,从上到下依次为:显示信息(快捷键:Alt+I)、暂停/继续游戏(快捷键:空格)、撤销(快捷键:Ctrl+Z)、重做(快捷键:Ctrl+Y)、回到初始题目状态、音效开关(快捷键:Ctrl+M)。
    3.5 功能栏
    图 5 显示了软件的右上侧功能栏,从上到下依次为:开始游戏、显示帮助、显示计算机给出的解答。
    显示帮助时,软件会显示一个还未被正确填上数字的格子的答案;显示帮助和解答时,均不会覆盖用户记录,下一步操作会回到点击按钮之前的状态。
    3.6 数字栏
    图 6 显示了软件的数字栏,点击 1 ∼ 9(或者按下数字 1 ∼ 9 按键)即可在当前选中的格子上标记/去除一个点击的数字。第四行第一个图标为清除一个格子内的所有数字(快捷键:Delete),第二个图标为标记/取消标记一个选中的格子(快捷键:M)。
    3.7 数独界面
    图 7 显示了软件在游戏过程中的运行界面。在每个时刻,均有一个格子被选中,用黑框蓝色字体高亮显示。当选中的格子已经填上一个数字,那么所有相同数字的格子均会立体高亮显示;否则如果选中的是一个空白格子,那么与这个格子同行同列的所有格子都会被立体高亮显示。当前选中格子的坐标在左下角会给予显示。
    如果一个格子是题目数据,那么它会被标记为黑色字体;如果一个格子里有多个数字,那么程序将会以灰色小字号在格子内显示这些数字;如果一个填写上去的数字和已有数字发生冲突,则标记为红色字体;否则标记为绿色字体。
    图 8 显示了软件在用户完成解题时的界面。

    图 9 显示了软件在 Custom 模式中按下 Solve 按钮之后的自动解题情况,黑色为用户输入数据,左下角状态栏会显示是否多解/单解/无解,以及计算机解题的用时。

    4 数独算法实现高中的时候仔细研究了一下数独的解法,发现 Dancing Link 完全可以被普通的搜索所取代。基本的思路是预处理出来一个搜索序列,然后用二进制表示的状态直接进行搜索。预处理出来的序列整体上保证是限制数目从小到大的,这样的话搜索树就会长得非常瘦,也更容易寻找到解。在 [NOIP2009] 靶型数独一题中,这个方法比 Dancing Link 快一倍以上。并且本机测试,10000 组数独题目,每组平均 56.5 空格,总计算时间为 0.82 秒。
    5 Qt界面实现界面设计的一个原则是,看起来要很清楚,感觉舒服,不要太多颜色花花绿绿的,感觉很浮夸,就像那种垃圾应用一样,玩着玩着给你开个广告。我尽量避免了给使用者留下这样的印象。
    我使用了 QTableWidget 创造出一个表单,再将 81 个 QPushButton 嵌到表单里面。在设计的时候,我将所有的 QpushButton 的 setFlat 设置为 True。这样的话扁平效果就能够体现。一个附带的效果就是,setFlat 在 True 和 False 之间切换时,由于表单上的网格线,会使整个界面产生 3D 立体效果(误打误撞 (x)。
    有一个问题困扰了我很久:QPushButton 在设置成扁平化之后,在选中的时候会出现蓝色的选中框,并且会影响上下左右键的原始操作。解决方案是将所有的 QPushButton 的setFocusPolicy 改成 Qt::NoFocus 即可。
    在每次用户产生鼠标/键盘事件时,由于无需考虑界面的实现效率,因此为了方便,每个事件产生之后都会重新刷新一遍整个界面;并且一个好处就是,可以在刷新的时候顺便更新历史版本记录。
    界面设计的另一个原则就是用户友好,每种操作既可以用鼠标也可以用键盘,在撤销/恢复/显示提示/显示解答/回到最初的时候都不会丢失之前的数据,所有历史数据都存储在一个 QVector 中,每次要撤销/的时候直接移动指针,不会将原来已经在 QVector 中的数据删除,新一步的操作会 append 到 QVector 中,此时再使用撤销操作会回到上一次撤销前的状态。
    在 Qt 程序中,我保存了四个 9 × 9 的数组,分别为:题目,解答,用户数字数据和用户标记数据。
    代码很丑啊我只把数独算法和 ui 隔离开了,一点也不 OO 是吧但是写得爽 233。
    5 评论 24 下载 2020-11-25 10:35:52 下载需要11点积分
  • 基于Vue、Node和MongDB的医院挂号预约系统

    一、概述1.1 介绍
    项目名称:Hs 医院挂号预约系统 / Hs 医院门诊预约挂号系统
    项目技术:Vue + Element UI + Node + MongoDB

    1.2 目标在互联网发达的现代,为病人挂号预约提供便利,不用再在医院的挂号窗口排队等待,而是利用互联网的便利;使用本系统,用户可以足不出户、免去等待的进行挂号预约,医院方面的管理员可以便捷的对医院中的一些数据、信息进行存储、管理、维护,节省信息管理的成本。
    二、需求分析2.1 功能需求用户

    病人:可以查看医院信息、科室门诊、医生信息、预约挂号、预约记录
    管理员:可以对系统内的数据、信息进行管理

    用例

    登录、注册、退出登录
    查看医院信息、科室门诊信息、医生信息、预约挂号、预约挂号记录
    用户管理、科室管理、值班管理、挂号管理(仅管理员)

    系统结构图

    2.2 非功能需求
    简洁:界面简洁、结构明了,没有多余的信息妨碍用户达到目的
    快捷:通过页面模块化,提高模块的复用性,减少页面的刷新同时提高页面的加载速度

    三、设计3.1 数据库设计3.1.1 数据库说明
    MongoDB 数据库的集合可以看做是 其他关系数据库(如 MySQL)的表
    集合的字段 _id 为唯一主键
    一些除 _id 外的 ObjectId 数据类型的字段相当于外键

    3.1.2 数据结构用户集合



    字段
    数据类型
    说明




    _id
    ObjectId
    每个用户的 id


    account
    String
    账户


    name
    String
    真实姓名


    password
    String
    密码


    type
    String
    用户类型


    sex
    String
    性别


    dcClinic
    ObjectId
    门诊(医生)


    phone
    Number
    电话


    email
    String
    邮箱


    dcinfo
    String
    简介(医生)



    科室集合



    字段
    数据类型
    说明




    _id
    ObjectId
    每个门诊的 id


    department
    String
    科室


    clinic
    String
    门诊



    挂号预约记录集合



    字段
    数据类型
    说明




    _id
    ObjectId
    每个挂号记录的 id


    patient
    ObjectId
    预约的用户的 id


    doctor
    ObjectId
    被预约的医生


    duty
    String
    预约的星期


    timeslot
    String
    预约的时间段


    appointment
    Date
    预约的日期



    医生排班记录集合



    字段
    数据类型
    说明




    _id
    ObjectId
    每个排班记录的 id


    doctor
    ObjectId
    医生 id


    duty
    String
    排班时星期


    timeslot
    String
    排班的时间段


    number
    Number
    号源数



    3.2 接口设计相关依赖包: Axios、CORS
    前端 Axios 设置:
    import axios from "axios";const http = axios.create({baseURL: 'http://localhost:3000/web/api'})export default http
    后端路由设计:
    从请求路径中获取需要访问的集合的名称,以实现通用路由,减少代码量。
    // server/routes/web/index.jsapp.use('/web/api/rest/:resource', async (req, res, next) => { req.Model = require(`../../models/$ {req.params.resource}`) next()}, routes);
    3.2.1 登录


    地址
    rest/user/login




    方式
    POST


    请求参数
    账户、密码


    返回参数
    token



    // 查询不到账户:token = ‘user err’// 密码错误:token = ‘password err’// 存在账户、密码正确:token = _id.account.(p/d/a) p代表病人、d代表医生、a代表管理员
    3.2.2 注册、添加信息


    地址
    rest/集合名




    方式
    POST


    请求参数
    对应集合的必须信息


    返回参数
    添加结果



    3.2.3 查询信息


    地址
    rest/集合名




    方式
    GET


    请求参数



    返回参数
    该集合内的所有记录



    3.2.4 查询全部病人


    地址
    rest/user/patient




    方式
    GET


    请求参数



    返回参数
    user 集合内用户类型为病人的记录



    3.2.5 查询全部医生


    地址
    rest/user/doctor




    方式
    GET


    请求参数



    返回参数
    user 集合内用户类型为医生的记录



    3.2.6 查询某科室下的医生


    地址
    rest/department/doctor/:id




    方式
    GET


    请求参数
    科室 id


    返回参数
    符合条件的医生用户记录



    3.2.7 根据 id 查询


    地址
    rest/集合名/:id




    方式
    GET


    请求参数
    id


    返回参数
    在该集合内对应 id 的记录



    3.2.8 根据病人 id 查询挂号记录


    地址
    rest/registration/myregistration/:id




    方式
    GET


    请求参数



    返回参数
    该 id 的用户的挂号记录



    3.2.9 根据 id 删除


    地址
    rest/集合名/:id




    方式
    DELETE


    请求参数
    id


    返回参数
    删除结果



    3.2.10 根据 id 编辑


    地址
    rest/集合名/:id




    方式
    PUT


    请求参数
    id


    返回参数
    编辑结果



    3.2.11 根据科室名查询下属门诊


    地址
    rest/department/clinic/:department




    方式
    GET


    请求参数
    科室名称


    返回参数
    该科室下的门诊记录



    3.2.12 根据医生 id 查询排班信息


    地址
    rest/scheduling/dc/:id




    方式
    GET


    请求参数
    id


    返回参数
    该 id 医生的排班记录



    3.3 页面设计3.3.1 登录、注册页面设计

    3.3.2 用户主页设计


    3.3.3 用户挂号记录页面
    3.3.4 信息列表页
    3.3.5 添加信息页
    3.3.6 编辑信息页
    3.4 功能设计3.4.1 登录功能
    3.4.2 挂号预约功能
    3.4.3 管理功能
    四、实现使用前后端分离的开发模式,前端使用 Vue + Element UI 实现模块式的页面设计,使用 Node + Express + Mongoose + MongoDB 实现从数据库获取数据用于与前端交互,前端使用 Axios + CORS 实现向后端接口发送数据、获取数据、实现跨域等。
    4.1 后端实现后端文件目录结构:

    /index.js
    const express = require("express"); // 导入依赖包 expressconst app = express();app.use(require('cors')()) // 使用依赖包 cors 跨域app.use(express.json())require('./plugins/db')(app); // 导入 db 模块require('./routes/web')(app); // 导入 web 模块app.listen(3000, () => { // 监听端口 3000 console.log('已连接端口3000,http://localhost:3000')});
    /plugins/db.js
    module.exports = app => { const mongoose = require('mongoose'); // 导入依赖包 mongoose mongoose.connect('mongodb://127.0.0.1:27017/registration-booking-system', {useNewUrlParser: true // 连接mongodb数据库的 registration-booking-system 数据库 })}
    /models/Department.js:科室集合的模型文件,其他模型文件同理
    const mongoose = require('mongoose'); // 导入依赖包 mongooseconst schema = new mongoose.Schema({ // 创建模型department: { type: String, required: true }, // 科室名称clinic: { type: String, required: true } // 门诊名称})module.exports = mongoose.model('Department', schema) // 导出 Department 的集合模型 /routes/web/index.jsmodule.exports = app => { const express = require('express'); // 导入依赖包 express const routes = express.Router({mergeParams: true }); //...此处省略一部分 // 添加 routes.post('/', async (req, res) => { const model = await req.Model.create(req.body) res.send(model) // 根据传递过来的数据创建一条记录,然后返回结果 }) //...此处省略一部分 //... app.use('/web/api/rest/:resource', async (req, res, next) => { req.Model = require(`../../models/$ {req.params.resource}`) next() // 通过请求的路径获取要访问的集合,实现通用性 }, routes);}
    4.2 前端实现前端文件目录结构:
    开发环境(未打包)

    /http.js
    import axios from "axios"; // 导入 axios 依赖const http = axios.create({baseURL: 'http://localhost:3000/web/api' // 与后端交互})export default http
    /main.js
    import Vue from 'vue'import App from './App.vue'import './plugins/element.js' // 使用 element UIimport router from './router' // 使用 vue-routerVue.config.productionTip = falseimport http from "./http"; // 使用 axiosVue.prototype.$http = http;new Vue({ router,render: h => h(App)}).$mount('#app')
    使用 Axios 在前端页面的 vue 组件中获取后端数据
    async findall() { const res = await this.$http.get('rest/user') // 发送请求 this.items = res.data // 获取结果}
    /router/index.js
    import Vue from 'vue'import VueRouter from 'vue-router'//...import Login from "@/views/Login";//...Vue.use(VueRouter)const routes = [ //... { path: '/login', component: Login }, // 路径为 /login 时,加载 Login.vue 组件 //... ]const router = new VueRouter({ routes})// 通过 token 判断用户权限以及登录状态router.beforeEach((to, from, next) => { if (to.path === '/home') { next() } if (to.path === '/admin') { let token = window.sessionStorage.getItem('token') if(token === null) { next('/login') } else { const id = token.split('.')[0] const ut = token.split('.')[2] if(ut !== 'a') { next('/login') } } } next()})export default router
    使用 vue-router 实现页面跳转
    @click="$router.push(`/user/edit/${scope.row._id}`" // 点击事件,触发页面跳转并传递 id
    打包后

    五、测试对源码以及打包后都进行了如下的测试。
    5.1 登录测试


    编号
    输入数据
    预期输出
    实际输出




    L01
    账户:686868,密码:123
    用户名错误
    用户名错误


    L02
    账户:lhz,密码:321
    密码错误
    密码错误


    L03
    账户:lhz,密码:123
    登录成功,回到首页
    登录成功,回到首页


    L04
    账户:root,密码:123
    进入管理后台
    进入管理后台



    5.2 注册测试


    编号
    输入数据
    预期输出
    实际输出




    L05
    账户:686868,密码:123
    注册成功
    注册成功



    5.3 退出登录测试


    编号
    输入数据
    预期输出
    实际输出




    L06
    登录后点击退出
    清除 token
    清除 token



    5.4 挂号测试


    编号
    输入数据
    预期输出
    实际输出




    L07
    选择已过去日期
    提示选择未来的日期
    提示选择未来的日期


    L08
    选择未来的日期
    保存成功
    保存成功



    5.5 取消挂号记录


    编号
    输入数据
    预期输出
    实际输出




    L09
    选择取消挂号记录
    询问,确认后清除,取消则无反应
    询问,确认后清除,取消则无反应



    5.6 添加信息


    编号
    输入数据
    预期输出
    实际输出




    L10
    按正确格式添加
    保存成功
    保存成功


    L11
    不按正确格式添加
    提示错误,无法保存
    提示错误,无法保存



    5.7 删除信息


    编号
    输入数据
    预期输出
    实际输出




    L12
    选择删除信息
    询问,确认后清除,取消则无反应
    询问,确认后清除,取消则无反应



    5.8 编辑信息


    编号
    输入数据
    预期输出
    实际输出




    L13
    按正确格式编辑
    保存成功
    保存成功


    L14
    不按正确格式编辑
    提示错误,无法保存
    提示错误,无法保存



    六、项目总结通过这次项目,我对 Vue、Node、JavaScript 的知识有了更近一步的认识与了解,对这些知识的熟悉程度也更近了一步;同时开发项目的过程中,我保持在 Gitee 中使用分支等对项目源码进行存储、备份,因此我对 Git 的操作也更加熟悉。在这次开发中,我使用了一些新的方法与思路,这使我的眼界与思维更加开阔,收获到了许多知识。
    2 评论 3 下载 2021-06-23 20:41:52 下载需要10点积分
  • 基于Springboot+Redis+Layui+MySQL的响应式医院挂号系统

    一、概述随着病人的数量越来越多,排队记名挂号已经不能满足病人的需求,为了方便病人看病,提高病人的就医效率,许多医院都有了预约挂号系统,医院也越来越网络化。本系统设计包括用户管理界面和管理员界面。用户界面主要实现用户注册登录,查询新闻资讯,留言评论,查询医生,预约挂号功能。管理员界面主要实现管理医生信息,科室管理,发布新闻资讯,留言评论管理,预约挂号信息的处理。
    二、背景分析医院预约挂号系统是许多医院必备的一个网上挂号方式,通过网上挂号患者解决了挂号难就医难的问题,所以,医院应该具备一个这样方便患者和医生的一个系统,这个医院预约挂号系统极大地方便了寻求医疗困难的病人。医院预约挂号系统是当代化医院的重要环节之一,在整个医院管理中占据越来越重要的地位。过去在医院预约挂号与查询管理都非常的耗时耗力。因此,有必要开发这样的医院预约挂号软件。随着互联网的飞速发展,互联网用户呈线性增长,更多的医院已经将网上挂管理系统投入使用。医务工作者告诉记者,在西方国家,患者需要提前预约。随着网络化的深入推进,更多的中国医院发现到预约服务在节省时间、转移患者、减轻医院压力方面的作用。
    三、应用环境服务器配置如下:

    操作系统:Windows 10 及以上
    内存:16G 及以上
    硬盘空间:100G 以上

    软件配置如下:

    开发工具:IDEA
    数据库:My SQL
    Web 服务器:Tomcat8.5

    四、测试环境CRM 开发完毕后可在如下测试环境下进行测试:



    JDK
    1.8 版本




    应用服务器
    Tomcat8.5 及以上


    数据库
    MySQL


    服务器
    Windows,linux 等操作系统


    客户端
    Windows,Android,Linux 等操作系统



    五、系统分析5.1 可行性研究5.1.1 管理可行性信息化的医院预约挂号在如今的信息时代是大势所趋,而且随着现代管理理念、方法和途径的提高。预约挂号管理手段日趋成熟,所以从长远利益出发,相关部门应对该项目的开发与实施会大力支持。
    5.1.2 技术可行性本系统采用 Windows 作为操作平台。数据库选用 MYSQL,该数据库管理系统在 Windows 环境下可以连接 Java 运行,其体积小、速度快、总体拥有成本低,提高数据的可用性。本系统的应用软件开发平台选用 IAEA,java 版本为 JDK1.8,服务器为 tomcat8.5.
    5.1.3 经济可行性采用预约挂号管理系统可取代原系统的单据手工传递工作,减少人工开支,节省资金、并且可大大提高信息量的获取,缩短信息处理周期,改进就诊质量,能及时反馈患者的平时身体状况,反馈挂号信息的利用率,使就诊质量更上一个台阶。
    5.1.4 社会可行性本系统操作简单,易于理解,只需通过简单熟悉,上手较快,管理员、医生、护士都可以进行操作,营运环境要求低。
    5.2 需求分析5.2.1 需求概述前各医疗机构中,绝大部分中小型医疗机构内部没有实现任何信息化管理,医院临床信息,业务流程的数据依然采取纸质记录,造成数据容易丢失,对医院造成重大损失。医院内部的挂号、收费、药房、药库、科室、病床的信息管理都存在缺漏,对患者的临床信息不能做到完整保存,高效查询,数据的容易出错、遗漏,造成换院治病难,医院不敢治,错过最佳治疗期等现状,对患者的治疗造成严重的影响,这些问题与医院信息化管理系统的建立实施目标基本一致。
    作为一个集医学、信息、管理等多种学科的综合系统,实现更现代化、科学化、规范化的手段来加强医院的管理、提高医院的工作效率,改进医疗质量;它通过将人力资源、业务流程与专业技术进行有效的整合,使医院管理更有效、更高效,使患者能够得到及时的治疗和服务。
    5.2.2 功能需求分析医院信息化管理系统用户由三种角色组成:Administrator(系统管理员),President(院长),Doctor(医生),Nurse(护士)。他们的权限分别如下:

    Administrator(系统管理员):能看到系统中所有的信息,并能对所有域的信息进行修改和设置,不参与具体的业务处理
    President(院长):能浏览、修改和设置本域中的所有信息,并能对域中的 Doctor 和 Nurse 用户进行管理
    Doctor(医生):能浏览、修改和设置本区域中的所有信息
    Nurse(护士):能浏览该 nurse 所在区域中的信息

    5.2.3 门诊管理门诊管理模块主要功能需求如图所示:

    患者挂号
    为新患者录入挂号相关的资料,选择是否住院。
    处方划价

    项目划价
    为患者添加手术项目。
    药品缴费

    项目缴费
    与药品缴费流程基本相同。
    患者库
    可以查看所有门诊挂号患者的信息。
    5.2.4 住院管理住院管理模块主要功能需求如图所示:

    入院

    住院缴费

    记账

    出院

    5.2.5 药房管理药房管理模块主要功能需求如图所示:

    药房详情

    门诊取药
    减少相应药品数量。
    住院取药
    减少相应药品数量。
    5.2.6 系统管理系统管理模块主要功能需求如图所示:

    六、系统详细设计与实现6.1 接口设计6.1.1 首页


    接口名
    接口描述




    login(Model model, HttpServletRequest request,String loginname,String pwd)
    登陆



    6.1.2 门诊管理


    接口名
    接口描述




    addre(CReport cReport)
    添加挂号信息


    selperson(Integer page, Integer limit)
    查询、显示所有患者信息


    seldrug(String durgname,Integer page, Integer limit,CPharmacy cPharmacy)
    查询并显示所有药品信息


    addchu(CCashier cCashier,CPharmacy cPharmacy)
    向处方中添加药品项目


    selpepi(Integer perid,Integer page, Integer limit)
    查询当前患者处方中的信息


    del(CCashier cCashier,String durnme,Integer durnum,CPharmacy cPharmacy)
    删除处方中药品


    selxiang(Integer page,Integer limit,Integer perid)
    查询患者需检查项目


    zong(Integer reid)
    查询患者需缴费总价


    selximu(Integer perid,Integer page, Integer limit)
    查询患者所有项目处方


    selwei(Integer reid)
    查询患者是否有未缴费药品


    addCheckup(Lcheckup lcheckup)
    添加检查结果


    addbing(Integer reid, String bing, CReport cReport)
    添加患者病因


    selCheckup(Integer page, Integer limit,Lcheckup lcheckup)
    查看患者检查结果



    6.1.3 住院管理


    接口名
    接口描述




    selBed(Integer departmentId)
    查询是否存在空位


    addRegister(Register register,HttpServletRequest request)
    将患者添加到住院部


    updKe(Register register)
    患者进行转科室处理


    selDrugs(Integer page, Integer limit, Lrecord lrecord)
    查询患者药品信息


    addDrug(Lrecord lrecord)
    为患者开药


    updItem(Lrecord lrecord)
    添加收费项目


    updLeave(Register register)
    办理出院



    6.1.4 药房管理


    接口名
    接口描述




    selectpharmary(Ypharmacy ypharmacy, Integer page, Integer limit)
    查询药品仓库


    seldrugDateguoqi(Drugstore drugstore, Integer page, Integer limit)
    查询过期药


    addchu(CCashier cCashier,CPharmacy cPharmacy)
    为患者取药



    6.1.5 系统管理


    接口名
    接口描述




    selectAllUser(Integer page,Integer limit,User user)
    查询所有用户


    initUserRole(Integer userid)
    初始化用户分配角色


    addUser(User user)
    添加用户


    editLogin(User user)
    修改资料


    resetUserPwd(User user,Integer userid)
    重置密码



    6.2 界面设计6.2.1 主界面
    6.2.2 门诊管理用户挂号



    处方划价

    项目划价

    项目缴费

    项目检查

    药品缴费

    门诊患者库

    6.2.3 住院管理入院登记

    缴费管理

    药品记账

    项目记账

    出院结算

    6.2.4 药房管理门诊取药

    住院取药

    6.2.5 系统管理用户管理

    6.3 数据结构设计6.3.1 门诊管理门诊患者表



    字段
    字段类型
    字段长度
    字段描述




    homeId
    int
    11
    门诊号


    homeName
    varchar
    50
    患者姓名


    sex
    varchar
    10
    性别


    age
    int
    11
    年龄


    carId
    varchar
    100
    身份证号


    phone
    varchar
    20
    联系电话



    处方记录表



    字段
    字段类型
    字段长度
    字段描述




    cashier
    int
    11
    处方号


    reportId
    int
    11
    门诊号


    durgname
    varchar
    500
    药物名称


    durgnum
    int
    11
    药物数量


    repiceprice
    double
    0
    药物单价


    repicetotal
    double
    0
    药物价格小计


    state
    int
    11
    是否进行检查


    ctime
    date
    0
    检查时间


    ostate
    int
    11
    病人状态是否良好


    jie
    varchar
    500
    病因


    mstate
    int
    11
    处方状态



    项目检查记录表



    字段
    字段类型
    字段长度
    字段描述




    cid
    int
    11
    检查号


    registerid
    int
    11
    挂号类型


    content
    varchar
    200
    病因


    ctime
    datetime
    0
    就诊时间



    缴费记录



    字段
    字段类型
    字段长度
    字段描述




    hospitalpriceid
    int
    11
    缴费编号


    registerId
    int
    11
    挂号类型


    durgname
    varchar
    500
    药品或项目名称


    durgnum
    int
    11
    药品或项目数量


    repiceprice
    double
    0
    单价


    repicetotal
    double
    0
    小计


    htime
    datetime
    0
    登记时间


    state
    int
    11
    是否缴费



    项目类型表



    字段
    字段类型
    字段长度
    字段描述




    outpatientId
    int
    11
    项目编号


    projectName
    varchar
    300
    项目名称


    unit
    int
    11
    计量单位


    bigprojectId
    int
    11
    部门类型编号


    price
    double
    0
    单价



    6.3.2 住院管理床位表



    字段
    字段类型
    字段长度
    字段描述




    bedId
    Int
    11
    床位号


    bedName
    Varchar
    300
    床位所在科室名称


    departmentId
    Int
    11
    床位所在科室号


    state
    Int
    11
    是否有床,0 为空床位,1 为有人床位


    Price
    Int
    11
    床位价格



    住院信息表



    字段
    字段类型
    字段长度
    字段描述




    registerid
    int
    11
    挂号编号


    userName
    varchar
    200
    姓名


    age
    int
    11
    年龄


    sex
    varchar
    20
    性别


    department
    int
    11
    部门编号


    doctor
    int
    11
    医生编号


    diagnose
    varchar
    500
    病因


    address
    varchar
    500
    地址


    Phone
    varchar
    30
    手机号码


    Idcard
    varchar
    60
    身份证号


    registerDate
    datetime
    0
    挂号日期


    bedNum
    int
    11
    床号


    Operator
    varchar
    200
    操作人


    money
    double
    0
    缴费


    state
    int
    11
    状态


    endDate
    datetime
    0
    出院日期


    price
    double
    0
    总价


    discount
    varchar
    10
    折扣


    zhuan
    datetime
    0
    是否转院



    6.3.3 系统管理用户权限表



    字段
    字段类型
    字段长度
    字段描述




    roleid
    int
    11
    权限编号


    rolename
    varchar
    255
    用户姓名


    roledesc
    varchar
    255
    用户权限描述


    available
    int
    11
    是否可用



    用户表



    字段
    字段类型
    字段长度
    字段描述




    userid
    int
    11
    用户编号


    loginname
    varchar
    255
    登陆名


    identity
    varchar
    255
    实体 ID


    realname
    varchar
    255
    真实姓名


    sex
    int
    255
    性别


    address
    varchar
    255
    住址


    phone
    varchar
    255
    联系电话


    pwd
    varchar
    255
    密码


    position
    varchar
    255
    职位


    type
    int
    255
    用户类型


    available
    int
    255
    是否可用


    salt
    varchar
    255
    备注



    6.3.4 药房管理药品详情



    字段
    字段类型
    字段长度
    字段描述




    rugstoreId
    int
    11
    入库号


    drugstoreName
    varchar
    100
    药品名称


    supplierId
    int
    11
    供货商编号


    skullId
    int
    11
    经办人


    warehouseId
    int
    11
    仓库号


    unit
    int
    11
    计量单位


    tradePrice
    double
    0
    原价


    sellingPrice
    double
    0
    售价


    area
    int
    11
    产地


    type
    int
    11
    药品类型


    produceDate
    date
    0
    生产日期


    validDate
    date
    0
    有效期


    drugstorenum
    int
    11
    药房数量


    batch
    varchar
    200
    批号



    总结在该系统的开发过程中,我参阅了很多相关的书籍,许多网站的帮助解决了我许多难题。系统中所有的页面,我都争取使页面上代码简捷、易懂、易改。
    经过多天的设计与开发,系统终于基本开发完成,各项预期功能都已得到实现。当然,该系统还具有进一步的扩展空间,将会伴随着日后的使用逐步完成,使得界面更加优美,操作更加顺畅。设计和开发过程中遇到的问题也都得到解决,学到了很多的开发经验,受益无穷。
    八、参考文献
    [1] 毛光喜, 信息系统分析与设计, 吉林大学出版社, 2019
    [2] 霍金明、孙滨、周贤来, javaWeb 程序设计, 电子科技大学出版, 2019
    [3] 吴迪、马宏茹、丁万宁, 软件工程教程, 电子科技大学出版, 2019
    [4] 传智播客, MySQL 数据库入门, 人民邮电出版, 2008
    [5] 传智播客, HTML+CSS+javaScript 网页制作案例教程, 人民邮电出版, 2008
    1 评论 2 下载 2021-07-20 10:14:26 下载需要15点积分
显示 15 到 30 ,共 15 条
eject