分类

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

资源列表

  • 基于Java和MySql实现的图书管理系统

    第一章 课题概述1.1 选题背景及意义图书管理系统主要用于图书馆的图书管理、读者管理、借阅信息管理。本图书管理系统以JAVA为开发语言,根据业务逻辑实现了相关功能,利用Swing开发了客户端图形界面,并使用Apache POI实现了报表生成功能。
    1.2 实验的主要工作本文就教普通用户及管理员可以使用的功能与权限进行分析,讲解图书管理系统的设计与实现。

    图书管理系统系统的需求分析。从两大角色介绍系统的业务需求,并说明接口需求以及该接口的目的
    用户和管理员与系统的交互设计。先描述系统的总体模块设计,然后从两个模块入手,分别介绍各个模块的设计
    图书管理系统相关功能的实现。从各个模块入手,介绍该模块的实现,包括用到的技术。使用MySQL技术,完成对数据的存储,查询等。使用Swing技术,完成对系统客户端的开发。使用Apache POI技术完成报表生成功能的开发
    图书管理系统的运行。根据不同的角色,按照各个角色的功能,介绍运行的结果

    1.3 实验报告的组织结构本文主要分为以下几个部分:

    第一章是绪论:主要介绍图书管理系统研究意义,研究背景,主要工作,章节安排等
    第二章是图书馆管理系统的需求分析:按总分总结构介绍系统的需求
    第三章是图书管理系统的设计:主要是对各个模块设计的分析,分析系统的功能和层次
    第四章是图书管理系统的实现:先描述数据库,接着对各个模块的实现进行介绍,主要包括其中的函数调用和接口
    第五章为系统测试:主要是图书管理系统的用例测试与接口测试

    第二章 需求分析2.1 系统总体需求本课题的目的是为高校开发一个图书管理系统。
    系统用例图

    整个系统分为2个模块。分别为:用户模块,管理员模块。主要用户分为两类,一个是普通用户,可以通过系统进行信息的填写提交、借书还书、续借缴费、个人信息查询、书籍信息查询等。另一个是管理员角色,通过系统可以帮助用户完成注册注销的功能,并能对图书进行管理(新书登记,旧书作废)。两个层次共同组成了图书管理系统。
    2.1.1 用户模块需求在该模块,涉及的主要角色是用户角色。
    用户模块用例图

    在用户模块,涉及了登录功能、图书借阅续借归还功能、书籍信息查询功能以及个人信息查询功能,对于用户角色,具体的用例说明如下表:



    用例
    功能




    登录
    通过注册的账号密码登录系统。


    基础信息填写
    填写基本信息,如:邮箱等。


    借书
    在押金足够的情况下可以借书


    还书
    还书时应判断是否超时,未超时则退还押金,超时则根据业务规则罚款


    续借
    未到归还日期时,如有需要可以续借,还书日期延长。


    查询用户信息
    用户自己查询自己的借书还书情况,押金剩余等等信息。


    查询书籍信息
    用户通过书籍名称查询书籍



    上表详细说明了在模块中,用户的需求,并针对用例图,说明了每个用例的功能。
    2.1.2 管理员模块需求管理员模块用例图




    用例
    功能




    缴费
    协助用户进行缴费


    新书登记,
    将书的相关信息记录入数据库中或从数据库中删除。


    旧书作废
    作废一定数目的旧书。


    登录
    通过管理员账号密码登录系统。


    查询书籍作者
    查询某本书的书籍作者。


    查询书籍价格
    查询某本书的书籍价格。


    查询书籍在库数量
    查询某本书的剩余数量。


    查询书籍总量
    查询某本书的总数量(含在库数量与借出数量)。


    查询书籍ISBN码
    查询某本书的国际标准书号。


    查询书籍编号
    查询某本书的图书馆内部编号,这个编号与放置的位置相关。


    借书
    在押金足够的情况下可以借书


    续借
    未到归还日期时,用户如有需要可以续借,收到信息后将还书日期延长。


    还书
    还书时应判断是否超时,未超时则退还押金,超时则根据业务规则罚款。



    上表详细说明了在模块中,管理员的作用,并针对用例图,说明了每个用例的功能。
    2.2 本章小结本章主要介绍了系统的需求分析,包括系统功能性需求,并通过使用用例图介绍了2个层次的功能,通过表格分析了用例图。
    第三章 图书管理系统系统设计本系统采用三层C/S架构,并采用了面向对象(OO)的风格。系统分为客户端(Client)和服务器端(Server)两个部分。在服务器端中,主线程负责监听端口及分配服务子线程,子线程利用面向对象中的多态,分别调用客户、管理员的处理函数,并对客户端的请求进行回复。客户端中,客户可以利用图形界面发起请求,客户端会根据服务器的返回信息进行提示,从而完成与客户的交互过程。
    3.1 总体系统功能设计本系统是基于Java开发的图书馆管理系统,用户登陆成功以后进入用户模块,可以完成用户的功能,如:借书还书续借缴费等。管理员登录成功进入管理员模块,可以协助用户完成:注销,缴费,退还押金等,同时还可以查询图书的相关信息并对图书进行管理。考虑到本系统的实际部署场景为图书馆内的自助借还电脑与管理员电脑,本系统仅需支持小规模的用户同时使用即可。本系统的总体设计如图3-1所示。
    图书管理系统模块设计图

    系统整体分为2个模块,分别是用户模块和管理员模块。用户模块主要包含登录系统,图书借阅管理、书籍信息查询、个人人信息查询功能,方便用户使用图书馆提供的服务;管理员模块主要包括登录系统、用户管理、书籍管理、书籍信息查询、个人信息查询功能;这两个模块组成了整个系统,完成了图书馆管理系统的一系列功能与服务。
    3.1.1 用户模块本项目为用户提供登陆的功能。当用户登录后,可以在界面上可以进行操作,完成图书的查询、借阅、续借、归还。除此之外,用户还可以查看书籍信息与个人信息等。模块中使用TCP Socket通信进行信息交互,将得到的字符串以约定方式解析后通过封装的前端组件进行展示。
    3.1.2 管理员模块本项目中管理员无需注册,登陆后可以协助用户进行缴费、注销等,同时管理员也可以进行借书、还书、续借、用户信息查询、书籍信息查询等操作。除此之外,管理员需要对书籍的信息进行管理,负责书籍的新书登记和旧书作废。此模块中使用TCP Socket通信进行信息交互,将得到的字符串以约定方式解析后通过封装的前端组件进行展示。
    3.2 体系结构设计本系统采用以三层C/S架构为主、面向对象为辅的混杂风格。系统分为客户端(Client)和服务器端(Server)两个部分。在服务器端中,主线程负责监听端口及分配服务子线程,子线程利用面向对象中的多态,分别调用客户、管理员的处理函数,并对客户端的请求进行回复。客户端中,客户可以利用图形界面发起请求,客户端会根据服务器的返回信息进行提示,从而完成与客户的交互过程。
    3.3 接口设计客户端与服务器端通信接口:遵循网络协议,满足局域网的通信需求。同时通过约定请求的消息类型,用于区分不同请求的解析方式与调用不同的方法。
    服务器端与MySQL数据库通信接口:利用JDBC与MySQL数据库进行通信,同时构建SQL类用于与数据库交互。SQL类中根据不同的功能提供数据库信息的增加、删除、更改、查询功能。实际调用时,使用SQL的单例化实例,传入相关数据,调用相应的API函数即可。
    3.4 本章小结本章主要介绍了该系统的设计。首先从总体出发,描述的系统的总体模块(用户和管理员),然后从2个模块详细分析他们的功能。在最后,并介绍了整体的设计风格和接口。
    第四章 图书管理系统系统的模块设计与实现4.1 数据库的设计本系统使用的数据库为MySQL,数据库名为BMS。数据库中有三个表,分别用于存储用户信息、书籍信息、借阅信息。其详细说明如下:
    4.1.1 用户信息表(user_information)

    User_account(String类型):用于存储用户账号
    Password(String类型):用于存储用户账号密码的实现
    email_address(String类型):用于存储用户的邮箱地址信息
    borrow_amount(Int类型):用于存储用户已经借阅的书本数量
    balance(Double类型):用于存储用户押金账户的余额

    4.1.2 书籍信息表(book_information)

    book_name(String类型):用于存储书籍名字
    directory_number(String类型):用于存储书籍的目录号
    ISBN(String类型):用于存储书籍的ISBN码
    Author(String类型):用于存储书籍的作者名
    amount_in_library (Int类型):用于存储书籍的在库数量
    amount(Int类型):用于存储书籍的总数
    price(Double类型):用于存储书籍的价格

    4.1.3 借阅信息表(borrow_information)

    borrow_user(String类型):用于存储本条借阅信息的借阅人
    book_name(String类型):用于存储本条借阅信息的书名
    borrow_date(Date类型):用于存储借出日期
    should_return_date(Date类型):用于存储书籍的应还日期
    renew(Boolean类型):用于存储此条借阅信息是否续借过

    4.2 用户模块的实现(侧重于服务器端的响应)
    通过主线程的start函数,启动服务器的服务,并对8080端口进行监听。当客户端尝试连接时,分配子线程进行响应。

    通过A型消息进行登录查证,并根据查证结果回复客户端并及时更新serverThread类中的currentPerson私有数据成员(currentPerson是父类person的指针,可以根据实例对象的不同进行多态调用。)服务器运行过程中会打印日志,用于监控服务器运行状态。


    功能实现举例:接受到K型消息时代表客户端发出续借请求,多态调用currentPerson.reBorrow函数即可利用SQL对象向数据库发出修改申请。同时会根据函数返回结果,回复客户端续借申请是否成功。客户端在接受到回复后,进行相应的提示。
    4.3 管理员模块的实现(侧重于服务器端的响应)
    通过主线程的start函数,启动服务器的服务,并对8080端口进行监听。当客户端尝试连接时,分配子线程进行响应。

    通过A型消息进行登录查证,并根据查证结果回复客户端并及时更新serverThread类中的currentPerson私有数据成员(currentPerson是父类person的指针,可以根据实例对象的不同进行多态调用。)服务器运行过程中会打印日志,用于监控服务器运行状态。


    功能举例:接收到L型消息时,代表管理员账户申请产生报表。多态调用urrentPerson.createReport函数,在这个函数中调用SQL类示例sql的产生报表函数。执行成功后,服务器回复客户端成功产生报表,客户端会提示管理员到服务器处查看报表。(由于报表中含有大量系统信息,出于安全考虑,我们决定不提供向客户端传送报表的API,以防止信息被简单地盗取。)
    4.4 本章小结本章主要介绍了系统的实现。介绍了实现时使用的关键性技术,并贴出了一些代码,以便理解。在介绍实现时,配上了完成的页面,与完成的页面相结合,更容易理解。
    第五章 系统测试5.1 外部界面测试 用户登录
    图书管理系统初始化界面,需要用户名和密码输入,用户和管理员可分别登录到对应个人界面。

    5.2 管理员内部界面测试管理员数据维护,首页默认为新书登记界面。
    添加书籍

    输入相应信息,点击确认上传按钮。
    旧书作废

    输入信息,点击确认按钮。
    查询用户信息

    输入用户名,键入回车,所需信息将在下面显示出来。
    查询图书信息

    输入书名,键入回车,所需信息将在下面显示出来。
    缴费

    输入用户信息和缴纳金额,点击确认按钮。
    注销

    输入要注销的用户名,键入回车,账号即注销,并显示当前余额数,进行相关操作。
    注册

    输入相应信息,点击确定注册按钮,并提示注册成功。
    报表

    点击菜单栏的报表按钮,生成报表。
    退出
    点击后显示退出成功直接返回上一层登陆界面。
    5.3 用户界面测试
    初始界面状态,用户选择操作菜单里的操作。
    借书

    用户选择一本可以借的书进行操作,否则会出现书籍被借走的情况。
    还书

    默认用户的书本还书成功,所以实际会根据实际书本的情况在数据库进行操作。
    续借

    用户选择要借的书本进行续借,这里也是和还书一个操作。
    书籍查询

    查询书籍信息,点击确认查询,返回信息。
    查询个人信息

    点击查询,将用户当前信息返回。
    第六章 实验小结本次实验中,我们设计、架构、实现、测试了图书管理系统,基本完成了实验的要求。从此次实验中我们也有了很多的收获和感悟。

    首先,我们明白了前期需求分析对项目后期实现的重大影响,前期的需求分析直接决定了架构风格、架构方式、实现技术的选择等诸多问题。从这次实验中,我们体会到了前期需求分析的重要性,了解了需求分析的基本方法和流程
    其次,我们了解到了架构设计对一个系统的重要性。好的架构应该是结构可靠、可用、安全、可修改、可变的,一个好的架构往往能降低后期实现与维护的难度和成本。由于本次的实验没有使用现成的web框架,因此需要我们自行搭建系统的框架。在我们小组成员的努力下,我们认为我们完成的系统框架基本满足具有良好延展性、高内聚低耦合的特点
    同时,此次实验中我们实践了上个学期UML课程的相关知识,使用了用例图进行用例分析,使用了包图、类图明确系统架构与接口。这些UML技术的使用,极大地方便我们展现系统的架构,也成功地帮助开发人员理解架构设计与实现方法
    最后,我们体会到了架构风格的选取对实现的重要性。我们选取的三层C/S分层架构。不同层之间的解耦合使得不同层之间可以独立开发,最后再进行统一的接口对接和集中测试。这个特点使得开发人员的工作效率极大的提高。事实上,我们的功能层开发进度是略慢于表现层的,但表现层的进度并没有被拖慢,而是提前于计划完成开发,这无疑得益于三层C/S架构层与层之间的解耦合。同时,面向对象(OO)的使用,使得我们系统更加简洁,也使得系统在日后的拓展更为方便
    1 评论 3 下载 2021-02-28 09:29:52 下载需要11点积分
  • 基于α-β剪枝算法实现的AI五子棋游戏

    一、对抗问题对抗问题:顾名思义,博弈双方是带有对抗性质的。博弈的任何一方都希望局面尽量对自己有利,同时局面也应该尽量令对方不利。通常这一类问题可以通过 Minimax 算法解决。
    Minimax 算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax 算法常用于棋类等由两方较量的游戏和程序,这类程序由两个游戏者轮流,每次执行一个步骤。为了执行 Minimax 算法,我们可以通过穷举的方式,枚举所有的状态空间,从而使得我们可以在游戏刚一开始,就预测到输赢。但是,在实际情况下,游戏的状态空间都是异常庞大的。很显然,我们不能将以穷举方式实现的 Minimax 算法用于实际应用。
    二、α-β减枝通过分析可以发现,在利用穷举方法执行 Minimax 算法中有许多的无效搜索,也就是说,许多明显较劣的状态分支我们也进行搜索了。我们在进行极大值搜索的时候,我们仅仅关心,下面最大的状态,对于任何小于目前值的分支也都是完全没有必要进行进一步检查的。(α减枝)

    通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。
    同时,我们在进行极小值搜索的时候,我们仅仅关心,下面最小的状态,对于任何大于目前值的分支都是完全没有必要进行进一步检查的。(β 减枝)

    通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。
    将上述所提到的 α 减枝与 β 减枝进行综合就可以得到 α-β 减枝。对于对抗搜索而言,我们需要精心设计其估值函数,不然我们的 α-β 减枝将毫无用武之地。
    三、五子棋问题五子棋:是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成 5 子连线者获胜。

    这里,我们采用了极大极小博弈树(MGT),来实现 AI。这里用一张井字棋的搜索示意图来说明。

    上图很清晰的展示了对局可能出现的所有情况(已经去除了等价的情况),如果让这个图延展下去,我们就相当于穷举了所有的下法,如果我们能在知道所有下法的情况下,对这些下法加以判断,我们的 AI自然就可以选择具有最高获胜可能的位置来下棋。极大极小博弈树就是一种选择方法,由于五子棋以及大多数博弈类游戏是无法穷举出所有可能的步骤的(状态会随着博弈树的扩展而呈指数级增长),所以通常我们只会扩展有限的层数,而 AI 的智能高低,通常就会取决于能够扩展的层数,层数越高,AI 了解的信息就越多,就越能做出有利于它的判断。
    为了让计算机选择那些获胜可能性高的步骤走,我们就需要一个对局面进行打分的算法,越有利,算法给出的分数越高。在得到这个算法过后,计算机就可以进行选择了,在极大极小博弈树上的选择规则是这样的:

    AI 会选择子树中具有最高估值叶子节点的路径
    USER 会选择子树中具有最小估值叶子节点的路径

    这样的原则很容易理解,作为玩家,我所选择的子一定要使自己的利益最大化,而相应的在考虑对手的时候,也不要低估他,一定要假设他会走对他自己最有利,也就是对我最不利的那一步。
    接下来,我们实现关键的局面评分步骤:直接分析整个棋面是一件很复杂的事情,为了让其具备可分析性,我们可以将其进行分解,分解成易于我们理解和实现的子问题。
    对于一个二维的期面,五子棋不同于围棋,五子棋的胜负只取决于一条线上的棋子,所以根据五子棋的这一特征,我们就来考虑将二维的棋面转换为一维的,下面是一种简单的思考方式,对于整个棋盘,我们只需要考虑四个方向即可,所以我们就按照四个方向来将棋盘转换为 15 * 6 个长度不超过 15 的一维向量(分解斜向的时候,需要分为上下两个半区),参考下图:

    我们的目的是为了为其评分,那么我们就还需要评估每个线状态,将每个线状态的评分进行汇总,当做我们的棋面评分:

    接下来我们所要做的就是评价每一条线状态,根据五子棋的规则,我们可以很容易穷举出各种可能出现的基本棋型,我们首先为这些基本棋型进行识别和评价,并且统计每个线状态中出现了多少种下面所述的棋型,并据此得出评价值,得到如下图所示的静态估值表:

    根据这个表以及我们之前所谈到的规则,我们就可以得到一个可以运行的AI了。
    四、进一步的优化注意到,如果我们搜索到第四层,总共需要搜索:224 + 224 223 + 224 223 222 + 224 223 222 221 = 2 461 884 544 个状态节点,搜索如此多的状态节点的开销是十分可观的,因此,我们提高效率的方式就锁定到了:如何减少需要搜索的状态节点。
    我们可以采取以下方法来减少需要搜索的状态节点:

    我们可以利用经典的α-β剪枝算法对博弈树剪枝
    我们可以每次搜索仅搜索落子点周围 2*2 格范围内存在棋子的位置,这样可以避免搜索一些明显无用的节点,而且可以大幅度提升整体搜索速度
    避免对必胜/负局面搜索,当搜索过程中出现了必胜/负局面的时候直接返回不再搜索,因为此时继续搜索是没有必要的,直接返回当前棋局的估价值即可
    加入随机化AI的下棋方式,普通的AI算法对于给定的玩家下棋方式会给出固定的回应,这就导致玩家获胜一次之后只要此后每次都按此方式下棋,都能够获胜。为了避免这种情况,可以在 AI选择下子位置的时候,在估值相差不多的几个位置中随机挑选一个进行放置,以此增加 AI的灵活性

    规划搜索顺序,有很多有价值的下子点存在于更靠近棋盘中央的地方,如果从棋盘中央向外搜索的话,则能够提高α-β剪枝的效率,让尽可能多的分支被排除
    五、实验成果

    六、实验总结通过本次实验,加强了组员之间的沟通协调能力,同时也提高了我们对αβ减枝算法的了解。我们更了解了五子棋相关的游戏规则以及一些技巧,拓宽了我们的知识面,有助于我们在未来的生活中更好的与人交流。
    同时,经过此次实验,我们深入了解了棋类人工智能算法,进一步的提升了我们的专业水平,有助于我们在未来的就业与科研岗位上走的更远。
    虽然α-β减枝实现起来非常容易,但是五子棋的局势估计却十分的有挑战性,其局势估计的准确与否直接影响了程序的运行结果是否令人满意,AI是否能够展现出足够的智能。
    7 评论 240 下载 2019-06-20 11:17:32 下载需要12点积分
  • 基于Spring+Struts+Hibernate+Oracle实现的健康管理平台

    摘 要随着网络技术的不断发展,网站的开发与运用变得更加广泛。这次采用java语言SSH框架(Spring,Struts,Hibernate)设计并实现了面向特定群体的健康管理平台。该网站主要有教师饮食管理、教师健康日志、教师体检管理、疾病预测评估等功能模块。通过该网站,教师可以更好的关注自己的体检状况以及最近的身体状况,根据自身情况调整饮食,睡眠等生活习惯,并且可以及时预测高血压以及糖尿病的患病可能性大小,以便采取有效地预防措施。
    本系统采用的是典型的J2EE 三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。
    关键词:健康管理,慢性病,Spring,Struts,Hibernate
    AbstractWith the continuous development of network technology , the use of web site has became more widespread. This time I use JAVA language and SSH frame (Spring , Struts , Hibernate) to design and implement the health management platform for specific groups. Dietary management of teachers, teachers’ health log, medical management for teachers, disease forecast are designed in the web. Through the site, teachers can focus on their physical condition better, also can according to their circumstances to adjust their diet, sleep habits, etc. At the same time, we can take preventive measures to avoid hypertension and diabetes effectively.
    The system uses a three-tier structure called J2EE, divided into presentation layer, intermediate layer (business logic layer) and data services layer. Three-tier system put business rules, data access and legality verification work on the middle layer to process. Client does not establish a direct interaction with database, but make connections with the middle tier by components and then interacts with the database on the middle layer .
    Keywords: Healthy Manage , Chronic disease , Spring , Struts , Hibernate
    1 引言1.1 设计背景紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检,教职工人入职体检,以及所有学生和教职工的定期体检工作,甚至个人自愿定期进行身体健康检查等都离不开医院的体检。人们对体检工作越来越重视,目前,传统的体检一直延用手工管理的方式,对健康信息的可视化平台需求迫切。
    实现对健康信息分析的可视化,根据高危人群的日常行为,建立由此引发的发病概率预测模型,对高危人群做出相应的行为干预。健康管理平台不仅包含对个体健康曲线的可视化,同时包含对某群体健康曲线的可视化及预测,并以此为基础对个体日常行为的干预显示,以此为背景我选择设计健康管理平台。
    1.2 设计目的和意义健康管理既是一个概念,也是一种方法,更是一套完善、周密的服务程序,其目的在于使病人以及健康人更好地拥有健康、恢复健康、促进健康并尽量节约经费开支,有效降低医疗支出。健康管理有如下几大作用:一是可以了解居民的身体年龄,判断疾病指向;二是可以根据日常行为判断发病概率,以此为基础由医生提供降低慢性病发生危险性的行为干预方案;三是可以长期(终生)跟踪高危人群的健康,最大限度减少重大疾病的发生;四是可以节省维护健康的时间和金钱,提高保健效率[2]。
    建立面向教师的健康管理平台的目的,对于个人,是如何利用健康体检系统中的信息为人们的健康保驾护航。而健康信息信息管理系统的管理和利用,不仅需要具备基础医学知识、临床医学知识、流行病学知识、计算机技术、数学统计知识等综合素质的专业人员,同时需要有庞大的保健医学、预防医学、临床医学、康复医学等专业的资深专家团队的支持,才能够为个人提供一系列的健康管理服务。
    当今世界,信息管理数字化非计算机莫属,只有利用计算机技术,使用我国各个高校统一标准的健康体检系统表格,开发高校健康体检系统的系统软件,设置教师健康体检系统的计算机编号,制作教师的健康体检档案,并详细记录其本次体检程中所发现的健康问题和处理情况等,实现用户的健康体检系统信息在学校范围内的网络信息交换和共享,利用计算机技术,对用户的健康体检系统实现连续的动态管理。健康信息管理系统以计算机为工具,通过对用户体检所得的数据进行信息管理,把管理人员从繁琐的数据计算处理中解脱出来,为更好的帮组用户身体健康监督检查,从而全面提高质量。具体通过本系统可以对用户的基本健康状况进行各种必要的统计和分析[3]。
    本项目将针对高校群体研发多模态的健康数据采集系统,对历年体检数据、就诊数据、膳食结构、生活习惯等健康相关信息建立统一管理系统,并在此基础上采用数据挖掘方法对诸如心血管疾病、高血压、糖尿病等慢性病进行有效建模与评估,对高校群体内广泛存在的亚健康状态进行综合客观评价和风险预测,最终实现针对高校群体慢性病患者及其高危人群的动态跟踪健康管理与干预。
    1.3 国内外研究现状健康管理的概念最早见于美国,早在1929年美国洛杉矶水利局就成立了最早的健康维护组织。早在20世纪70年代的美国,由于健康保险的发展以及医疗服务模式的改变,要求医生能更好地指导病人进行疾病预防以及更加节省医疗费用。健康服务组织通过对人群的健康状况进行评价和疾病的风险评估,科学预测疾病的危险因素,制定具体的、有针对性的预防和保健措施。通过健康管理美国的医疗费比以前节省了大约10%,同时避免了疾病的发生,提高了生活质量。资料显示,通过健康管理计划,在1978-1983年,美国人的胆固醇水平下降了2%;高血压水平下降了4%;冠心病发病率下降了16%。美国密执安大学健康管理研究中心主任第·艾鼎敦博士(Dee.W.Edington)曾经提出美国20多年的研究得出了9:1定律结论,即90%的人通过健康管理后,医疗费用降到了原来的10%;10%的人未做健康管理,医疗费用比原来上升了90%。通过经济学分析发现,在健康管理方面投入1元钱,相当于减少3-6元医疗费用的开销。如果加上由此产生的劳动生产率提高的回报,实际效益达到投入的8倍[4]。
    健康管理在中国刚刚起步,是一个朝阳的产业。目前在中国大陆地区仅有少数专业的健康管理机构,大部分为医院及体检中心的附属部门。健康管理的从业人数没有准确的数据,估计全国在10万人以上,也就是说我国享受科学、专业的健康管理服务的人数只占人口总数的万分之二,这一比例与美国70%居民能够在健康管理公司或企业接受完善的服务相去甚远。而且目前健康管理仍然主要依赖于简单的单次体检或就诊数据由医生提供一些生活习惯的建议和意见,并没有把个人的历史病历以及日常行为对个人慢性病的影响考虑进去。此外,目前的健康管理也主要是针对已患病的患者,还未做到“早筛选、早预防、早发现、早诊断”的动态追踪的健康管理模式。
    2 系统需求分析2.1 系统目标健康管理平台的总目标是:在计算机网络,数据库和先进的开发平台上,利用现有的软件,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的教师健康管理平台。具体的要求如下:

    教师可以方便的使用五大基本功能
    独立于具体的数据库平台。对于与数据库交互的部分充分考虑兼容性
    容易在原先基础上进行二次开发
    中间基础平台的无型性。尽量采用开放的标准技术,达到跨平台运行的效果

    为了达到以上的开发目的,健康管理平台应遵循一定的设计和开发与原则:

    模块接口定义清晰
    基础类库和接口设计合理,尽量建立叮扩展的接口和抽象类
    数据库操作使用标准SQL语句,如果一定要使用有差别的SQL语句,则尽量集中在一起,以减少将来维护和移植的难度
    采用开放的标准和工具等

    2.2 系统的功能要求2.2.1 前台功能在前台的功能实现上,可以分为以下几个部分:

    教师饮食管理:根据教师的相关信息,计算其每天所需热量,给出一周的推荐菜单
    教师健康日志:用户可以记录自己健康日记,记录每一天的睡眠,饮酒,吸烟,血压,体重等情况
    教师体检管理:教师可通过该平台查询每次的体检结果,显示部分项目随时间变化的曲线
    疾病预测评估:针对糖尿病和高血压两种疾病,利用数学线性回归的方法,模拟计算出教师患病概率

    2.2.2 后台功能后台主要有四个功能:

    管理员用户登录功能:通过编号登录系统
    管理员管理教师功能:可以增删改查教师基本信息
    管理员管理体检结果:可以增删改查教师体检记录
    管理员管理健康新闻:可以发布或删除新闻

    2.3 系统的性能需求健康管理平台的特性要求网站系统需要具备以下几个主要特性:

    多样性:健康管理平台在设计时必须遵循的一个重要原则,就是以用户为系统设计的中心。网络的发展大大降低了信息咨询的成本,用户面临更多的选择,所以,健康管理平台除了降低成本以外,还必须在外观,功能的多样性上下工夫,才能够得到用户的认可。具体来说,应用系统应能实现用户特定的需求,操作界面友好、方便,功能设置符合用户的习惯和要求
    易维护:管理员能够简单方便地管理系统,定义新的应用,并对系统进行日常维护;随着健康管理平台信息的变更或增加、数据规模的增大,系统升级、维护应易于操作;各子系统、功能模块的设计应具有良好的灵活性,保证在健康管理平台系统建设过程中后期系统功能的实现不影响前期已投入使用的系统功能
    安全性:系统应充分考虑信息、设备、运行和管理的安全性,建立完善的多层次的安全保障体系,保证用户的个人信息等资料的数据安全
    可扩展:健康管理平台的用户从事着各种行业,他们的需求各不相同,系统在设计时应充分考虑到用户需求不断变化的需要,降低系统在扩展新的业务功能时的复杂度[5]

    2.4 系统的数据要求2.4.1 数据的性质
    数据录入和处理的准确性和实时性:数据的输入是否准确是数据处理的前提,错误的输入会导致系统输出的不正确和不可用,从而使系统的工作失去意义。数据的输入来源是用户的手工输入。手工输入要通过系统界面上的安排系统具有容错性,并且对用户操作进行实时的跟踪和错误提示。在系统中,数据的输入往往是大量的,因此系统要有一定的处理能力,以保证迅速的处理数据
    数据的一致性与完整性:由于网站的数据是共享的,所以如何保证这些数据的一致性,是网站必须解决的问题。要解决这一问题,要有一定的人员维护数据的一致性,在数据录入处控制数据的去向,并且要求对数据库的数据完整性进行严格的约束。对于输入的数据,要为其定义完整性规则,如果不能符合完整性约束,网站应该拒绝该数据
    数据的共享与独立性:整个健康管理平台的数据是共享的。然而,从网站开发的角度上看,共享会给设计和调试带来困难。因此,应该提供灵活的配置,使各个分系统能够独立运行,而通过人工干预的手段进行系统数据的交换。这样,也能提供系统的强壮性

    2.4.2 数据字典健康管理平台主要涉及到真实姓名数据字典:

    名称:真实姓名
    别名:realname
    描述:教师注册时需要输入自己的真实姓名,需与体检表中的名字统一。
    定义:真实姓名=[{字}2|{字}3|{字}4]
    位置:用户注册界面

    用户注册界面涉及到电话的数据字典:

    名称:电话
    别名:phone
    描述:教师注册时需要输入自己的联系方式。
    定义:电话={0•••9}11
    位置:用户注册界面

    用户注册界面涉及到邮箱的数据字典:

    名称:邮箱
    别名:email
    描述:教师注册时需要输入自己的邮箱。
    定义:邮箱= [a•••z|0•••9|A•••Z] +@+([a•••z|0•••9|A•••Z]
    位置:用户注册界面

    2.4.3 实体联系图健康管理平台主要涉及的实体联系图有六个,实体有Teacher、Manager、Food、Notice、Exam、Dairy。
    教师E-R图

    食物E-R图

    新闻E-R图

    体检 E-R图

    管理员 E-R图

    日志 E-R图

    3 系统设计3.1 开发工具介绍3.1.1 My Eclipse 介绍My Eclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称My Eclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和Java EE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的Java EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,SQL,Javascript,Spring,Hibernate。
    My Eclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,My Eclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。My Eclipse目前支持Java Servlet , AJAX, JSP, JSF, Struts, Spring, Hibernate, EJB3,JDBC数据库链接工具等多项功能。My Eclipse几乎囊括了目前所有主流开源产品的专属eclipse开发工具[6]。
    My Eclipse 2013支持HTML5、JQuery 和主流的JavaScript 库。随着My Eclipse 2013支持Html5,可以添加音频、视频和API元素到项目,从而为移动设备创建复杂的Web应用程序。甚至还可以通过HTML5 可视化设计器设计令人难以置信的用户界面。同时,随着My Eclipse 2013支持JQuery,可以通过插件提升性能,并添加动画效果到设计中。
    3.1.2 Oracle 介绍Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如Silver Stream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。
    Oracle数据库最新版本为Oracle Database 12c。Oracle数据库12c 引入了一个新的多承租方架构,使用该架构可轻松部署和管理数据库云。此外,一些创新特性可最大限度地提高资源使用率和灵活性,如Oracle Multitenant可快速整合多个数据库,而Automatic Data Optimization和Heat Map能以更高的密度压缩数据和对数据分层。这些独一无二的技术进步再加上在可用性、安全性和大数据支持方面的主要增强,使得Oracle数据库12c成为私有云和公有云部署的理想平台[7]。
    3.2 开发技术介绍3.2.1 Struts2Struts是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE的Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
    在Struts 中,已经由一个名为ActionServle的 Servlet 充当控制器(Controller)的角色,根据描述模型、视图、控制器对应关系的struts-config.xml的配置文件,转发视图(View)的请求,组装响应数据模型(Model)。在 MVC 的模型(Model)部分,经常划分为两个主要子系统(系统的内部数据状态与改变数据状态的逻辑动作),这两个概念子系统分别具体对应 Struts 里的ActionForm与Action两个需要继承实现超类。在这里,Struts 可以与各种标准的数据访问技术结合在一起,包括Enterprise Java Beans(EJB),JDBC与JNDI。在Struts的视图(View) 端,除了使用标准的JavaServer Pages(JSP)以外,还提供了大量的标签库使用,同时也可以与其他表现层组件技术(产品)进行整合,比如 Velocity Templates,XSLT 等。通过应用 Struts 的框架,最终用户可以把大部分的关注点放在自己的业务逻辑(Action)与 映射关系的配置文件(struts-config.xml)中。
    在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x 版本产品称为“Struts 1”。
    其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
    3.2.2 Spring 介绍2002 年wrox 出版了《Expert one on one J2EE design and development》一书。该书的作者是Rod Johnson。在书中, Johnson 对传统的J2EE 架构提出深层次的思考和质疑。并提出J2EE 的实用主义思想。2003 年, J2EE 领域出现一个新的框架: Spring ,该框架同样出自Johnson 之手。事实上, Spring 框架是《Expert one on one J2EE design and development》一书中思想的全面体现和完善, Spring 对实用主义J2EE 思想进一步改造和扩充,使其发展成更开放、清晰、全面及高效的开发框架。一经推出,就得到众多开发者的拥戴。传统J2EE 应用的开发效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致J2EE 的应用并没有真正实现Write Once 及Run Anywhere 的承诺。Spring 作为开源的中间件,独立于各种应用服务器,甚至无须应用服务器的支持,也能提供应用服务器的功能,如声明式事务等。Spring 致力于J2EE 应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring 是企业应用开发的”一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring 并不想取代那些已有的框架,而与它们无缝地整合[8]。总结起来, Spring 有如下优点:

    低侵入式设计,代码污染极低
    独立于各种应用服务器,可以真正实现Write Once, Run Anywhere 的承诺
    Spring 的DI 机制降低了业务对象替换的复杂性
    Spring 并不完全依赖于Spring ,开发者可自由选用Spring 框架的部分或全部

    3.2.3 Hibernate 介绍Hibernate 是目前最流行的ORM 框架,其采用非常优雅的方式将SQL 操作完全包装成对象化的操作。其作者Gavin King 在持久层设计上极富经验,采用非常少的代码实现了整个框架,同时完全开放源代码,即使偶尔遇到无法理解的情况,也可以参照源代码来理解其在持久层上灵巧而智能的设计。下面通过对比来了解Hibernate 和传统JDBC 操作数据库持久层之间的差异[9]。
    3.2.4 JSP 介绍JSP是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态技术标准。在传统的网页HTML文件(.htm,.html)中加入Java程序片段(Scriptlet)和JSP标签,就构成了JSP网页java程序片段可以操纵数据库、重新定向网页以及发送E-mail等,实现建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,这样大 大降低了对客户浏览器的要求,即使客户浏览器端不支持Java,也可以访问JSP网页。
    JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了Html语法中的java扩张(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户端。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。
    JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
    JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
    3.2.5 Jquery(JavaScript)介绍JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML(标准通用标记语言的子集)网页添加动态功能,比如响应用户的各种操作。它最初由网景公司(Netscape)的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司(已被oracle收购)的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型。
    jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多)。jQuery是免费、开源的,使用MIT许可协议。jQuery的语法设计可以使开发者更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以及其他功能。除此以外,jQuery提供API让开发者编写插件。其模块化的使用方式使开发者可以很轻松的开发出功能强大的静态或动态网页。
    3.2.6 DWR(Ajax)介绍AJAX 指异步JavaScript及XML(AsynchronousJavascript+XML)。核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
    AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面;可使因特网应用程序更小、更快,更友好;是一种独立于 Web 服务器软件的浏览器技术。DWR它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容。DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码。这样WEB开发人员就可以在JavaScript里使用Java代码,就像它们是浏览器的本地代码一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源。
    3.3 系统架构设计本系统采用严格的J2EE 应用结构,主要有如下几个分层。

    表现层:由JSP 页面组成
    MVC 层:使用Struts框架
    业务逻辑层:主要由Spring loc 容器管理的业务逻辑组件组成
    DAO 层:由 DAO 组件组成,实现类必须继承Spring提供的Hibernate Dao Support
    Hibernate 持久层:由 PO 组成,并在Hibernate Session 管理下,完成数据库访问
    数据库服务层:使用Oracle 数据库存储持久化数据

    系统的具体分层如图3.1所示:

    在图3.1黑色大方框内的MVC 控制层、Service 层及DAO 组件层的组件,都由Spring IOC 容器负责生成,并管理组件的实例。
    本系统不仅严格按MVC 模式设计,还按J2EE分层设计,将中间层严格分成业务逻辑层、DAO 层及数据持久层等。MVC 层的控制器绝对禁止持久层访问,甚至不参与业务逻辑的实现。表现层采用传统JSP 技术。
    本系统采用的是典型的J2EE 三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。JSP广泛的应用和稳定的表现,为其作为表现层技术打下了坚实的基础。中间层采用的是流行的Spring + Hibernate ,为了将控制层与业务逻辑层分离,又细分为以下几种:

    Web 层,就是MVC 模式里面的C,负责逻辑层和表现层的交互。调用业务逻辑层,并将业务数据返回给表现层作组织表现,该系统的MVC采用Struts框架
    Service 层(就是业务逻辑层),负责实现业务逻辑。业务逻辑层以DAO 层为基础,通过对DAO 组件的正面模式包装,完成系统所要求的业务逻辑
    DAO 层,负责与持久化对象交互。该层封装了数据的增、删、查、改的操作
    PO ,持久化对象。通过实体关系映射工具将关系型数据库的数据映射成对象,很方便地实现以面向对象方式操作数据库,该系统采用Hibernate 作为ORM 框架。Spring 的作用贯穿了整个中间层,将Web 层、Service 层、DAO 层及PO 无缝整合,其数据服务层用来存放数据

    3.3.1 Hibernate持久化通过使用Hibernate 持久层,可以避免使用传统的JDBC 操作数据库,对JDBC近一步包装,从而更好地使用面向对象的方式来操作数据库。保证了整个软件开发过程以面向对象的方式进行,即面向对象分析、设计及编程,透过Hibernate 对PO对象持久化操作,不管插入还是查询都是通过PO。
    在Hibernate 持久层之上,可使用DAO 组件再次封装数据库操作。通过DAO 层,可以让业务逻辑层与具体持久层技术分离,一旦需要更换持久层技术时,业务逻辑层组件不需要任何改变。因此,使用DAO 组件,即意味着引入DAO 模式,使每个DAO 组件包含了数据库的访问逻辑:每个DAO 组件可对一个数据库表完成基本的CRUD 等操作。
    DAO 模式的实现至少需要如下三个部分:

    DAO 工厂类
    DAO 接口
    DAO 接口的实现类。DAO 模式是一种更符合软件工程的开发方式,使用DAO 模式有如下理由:

    DAO 模式抽象出数据访问方式,业务逻辑组件无须理会底层的数据库访问,而只专注于业务逻辑的实现DAO 将数据访问集中在独立的一层,所有的数据访问都由DAO 对象完成,这层独立的DAO 分离了数据访问的实现与其他业务逻辑,使得系统更具可维护性DAO 还有助于提升系统的可移植性。独立的DAO 层使得系统能在不同的数据库之间轻易切换,底层的数据库实现对于业务逻辑组件是透明的。数据库移植时仅仅影响DAO 层,不同数据库的切换不会影响业务逻辑组件,因此提高了系统的可复用性

    对于不同的持久层技术,Spring 的DAO 提供一个DAO 模板,将通用的操作放在模板里完成,而对于特定的操作,则通过回调接口完成。
    3.3.2 Service层Service 组件采用正面模式封装多个DAO 组件, DAO 对象与Service 组件之间的关Service 组件需要实现的业务方法主要取决于业务的需要,通常需要在业务组件中包含对应的方法。
    业务层组件的实现业务层组件与具体的数据库访问技术分离,使所有的数据库访问依赖于DAO 组件,定义一个Facade Manager Impl来包装7个Dao这样就可以把逻辑层和Dao分开,达到松散耦合的效果。事务管理将推迟到Service组件而不是DAO 组件,因为只有对业务逻辑方法添加事务才有实际的意义,对于单个DAO方法(基本的CRUD 方法)增加事务操作是没有太大实际意义的。关于事务属性的配置,本系统使用Spring 提供的Transaction Proxy Factory Bean配置事务代理。这样不必为每个目标对象配置代理bean;避免了目标对象被直接调用。部署业务层组件单独配置系统的业务逻辑层,可避免因配置文件过大引起配置文件难以阅读。将配置文件按层和模块分开配置,可以提高Spring 配置文件的可读性和可理解性。在application Context.xml 配置文件中配置数据源、事务管理器、业务逻辑组件和事务管理器等bean[10]。
    4 系统概要设计4.1 系统体系结构基于B/S结构的健康管理平台,应由终端(用户主机/浏览器)、WEB服务器、数据服务器构成。健康管理平台的核心是中间的接入服务器和应用服务器部分。健康管理平台的总体结构图如图4.1所示:

    4.1.1 设计原则在进行软件系统开发的最初环节,一般都需要进行系统的选型,即根据系统功能的实际需求,选择合适的开发工具及软件架构。
    本系统设计时,比较主流的B/S设计有基于JSP、ASP、PHP、CGI及J2EE等模式。相比较而言PHP的功能相对简单,不适合做大程序;而CGI效率相对较低,所以也不考虑。由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统,所以选择Java技术作为健康平台的开发工具。
    4.1.2 运行架构首先要对系统进行分析,确定对系统的综合要求,分析系统的数据要求,导出系统的逻辑模型。再对系统分析后确定系统的模块,对每个模块进行研究,这也是该系统的一个主要解决的地方。本系统包括了用户,管理员等很多信息,所以对该系统要建立数据库。管理系统是基于WEB的,所以需要一定的网页支持以及与数据库的连接。该系统主要是以JSP技术为主来开发的,所以要对该技术进行了解,学习。除此之外采用的技术和环境要求如下:

    数据库访问:oracle数据库
    服务器访问:Tomcat系列服务器
    网页编程技术:DIV+CSS、JAVASCRIPT、AJAX等
    后台处理技术:Struts2+Hibernate+Spring
    硬件需求:PIII/512M/10G 及以上配置
    操作系统:Windows 7及以上操作系统

    4.2 网站功能结构网站前台功能结构图,如图4.2所示:

    网站后台功能结构图,如图4.3所示:

    4.3 数据库设计4.3.1 数据库详细设计数据项和数据结构如下:

    管理员表(Manager): 管理员编号,管理员名字,管理员密码
    新闻表(Notice):新闻编号,新闻标题,新闻内容,发布时间,图片路径,发布者
    食物表(Food):食物编号,食物名字,食物热量,食物类型,食物碳水化合物,纤维素,脂肪,蛋白质
    体检表(Exam):收缩压,舒张压,体重指数,腰臀比,尿素,尿酸,肌酐,甘油三酯,胆固醇,高密度脂蛋白胆固醇,低密度脂蛋白胆固醇,葡萄糖,同型半膀胱氨酸,微量白蛋白,微量白蛋白/尿肌酐
    教师表(Teacher):教师编号,教师昵称,教师密码,教师年龄,教师性别,教师邮箱,找回密码问题,找回密码答案,教师真实名字
    日志表(Dairy):日志内容,日志时间,睡眠时间,心情,抽烟,体重,压力,高压,低压,心率
    日志食物表(Dairy-food):日志编号,食物编号

    4.3.2 数据库逻辑结构设计数据库逻辑结构设计汇总表,如表4.1所示:



    表名
    功能说明




    Manager
    管理员表


    Notice
    新闻表


    Food
    食物表


    Exam
    体检表


    Teacher
    教师表


    Dairy
    日志表


    Dairy-food
    日志食物表



    4.3.3 数据库表设计数据库中共涉及到七张表,分别是管理员表,新闻表,食物表,日志表,日志食物表,体检表以及教师表。
    管理员表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    id
    ID
    Number
    10
    NO
    主键


    name
    用户名
    Varchar2
    20
    NO



    password
    密码
    String
    20
    NO



    新闻表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    id
    ID
    Number
    10
    NO
    主键


    title
    用户名
    Varchar2
    50
    NO



    content
    密码
    Varchar2
    2000
    NO



    datetime
    发布时间
    Timestamp
    6
    NO



    imagepath
    图片路径
    Varchar2
    30
    NO



    manager_id
    发布者
    Number
    10
    YES



    食物表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    id
    ID
    Number
    10
    NO
    主键


    name
    食物名
    Float
    20
    NO



    heat
    热量
    Float
    126
    YES



    carbohydrate
    碳水化合物
    Float
    126
    YES



    fat
    脂肪
    Float
    126
    YES



    fiber
    纤维素
    Float
    126
    YES



    protein
    蛋白质
    Float
    126
    YES



    type
    类型
    Number
    10
    NO



    日志表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    datetime
    ID
    Varchar2
    20
    NO
    主键


    text
    日志
    Varchar2
    2000
    YES



    sleephour
    睡眠
    Float
    126
    YES



    mood
    心情
    Varchar2
    255
    YES



    cigrette
    抽烟
    Number
    10
    YES



    weight
    体重
    Float
    126
    YES



    pressure
    压力
    Varchar2
    255
    YES



    bphigh
    高压
    Float
    126
    YES



    bplow
    低压
    Float
    126
    YES



    bs
    心率
    Float
    126**
    YES



    teacher_id
    教师号
    Number
    10
    YES



    日志食物表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    dairy_id
    日志ID
    Varchar2
    20
    NO
    主键


    food_id
    食物ID
    Number
    10
    NO
    主键



    体检表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    id
    ID
    Number
    10
    NO
    主键


    datetime
    体检时间
    Varchar2
    6
    NO



    sbp
    收缩压
    Float
    255
    YES



    dbp
    舒张压
    Float
    255
    YES



    bmi
    体重指数
    Float
    255
    YES



    whr
    腰臀比
    Float
    255
    YES



    bun
    胆固醇
    Float
    255
    YES



    ua
    尿素
    Float
    255
    YES



    crea
    尿酸
    Float
    255
    YES



    tg
    肌酐
    Float
    255
    YES



    chol
    甘油三酯
    Float
    255
    YES



    glu
    葡萄糖
    Float
    255
    YES



    hcy
    同型半膀胱氨酸
    Float
    255
    YES



    m_alb
    微量白蛋白
    Float
    255
    YES



    m_alb_crea
    微量白蛋白/尿肌酐
    Float
    255
    YES



    teacher_id
    教师ID
    Number
    10
    YES



    教师表



    字段名称
    字段含义
    数据类型
    长度
    NULL
    注释




    id
    ID
    Number
    10
    NO
    主键


    name
    教师名
    Varchar2
    20
    NO



    password
    密码
    Varchar2
    20
    NO



    age
    年龄
    Number
    10
    NO



    sex
    性别
    Varchar2
    10
    NO



    email
    邮箱
    Varchar2
    30
    NO



    question
    找回密码问题
    Varchar2
    50
    NO



    answer
    找回密码答案
    Varchar2
    50
    NO



    phone
    电话
    Varchar2
    11
    NO



    realname
    真实名字
    Varchar2
    20
    NO



    4.4 信息安全设计网络的开放性导致网络技术的全面开放,任何团体和个人都可以获得网络资源,因而网络所面临的破坏和攻击将会是多方面的,可以是对软件环境实施攻出,也可以是对硬件环境实施攻击。网络的国际性还意味着网络的攻击将不仅仅来自本地网络用户,它可能来自Internet上的任何一台机器。即,发起攻击的节点可以位于世界上任何地方。因此可以说,网络安全所面临的将是一个国际性全球化的挑战。网络的自由性意味着网络最初对用户的使用并没有提供任何的技术约束,用户可以自由地访问网络,自由地使用和发布各种类型的信息。用户只对自己的行为负责,而没有受到任何的法律限制。如何保护个人的机密信息不受木马和病毒的入侵,己成为信息安全化健康发展所要考虑的重要事情之一。
    健康管理平台用户个人信息的安全问题是至关重要的,制定切实可行的安全策略和实施有力的防范手段是非常必要的。系统的安全体系由下述结构组成,如下图4.4所示:

    4.4.1 网络安全Jsp技术虽然比较安全,但还是存在着很多安全上的问题的,客观的说,服务器软件的开发商在内部测试中不可能将系统中的所有bug 找出来,即使发布了软件后,被发现的漏洞也只会是其中的很小一部分,将来还会不断的有新的安全问题出现,所以我们必须时刻提高警惕。网站服务器的操作系统要打好补丁,进行安全权限的设置,并安装好防火墙,杀毒软件等,定时对数据进行备份。
    4.4.2 其他安全环境安全是整个系统安全的基础,要把信息泄露的危险减至最低限度,需要选择适当的设施位置,要充分考虑水灾、地震、电磁干扰与辐射以及其他等人为威胁,保证净化电源等等。物理安全也是整个系统安全的基础设置之一,物理安全涉及以系统中微机和主机、服务器等资源的房间,必须进行严格的管理。
    5 详细设计5.1 系统流程图在计算教师所需标准热量值得流程图,如图5.1所示:

    5.2 前台功能设计5.2.1 前台主页面设计健康管理平台的主页面主要功能有教师的登陆,注册功能,后台界面的入口,四项主要功能的入口和简单介绍,健康新闻的展示,校园风景的动态展示以及相关部门的网站链接,此界面在实现登录时采用DWR异步刷新。
    健康管理平台主界面

    5.2.2 教师饮食管理功能设计教师饮食管理功能中,主要是根据教师身高,体重,年龄,性别,活动量来计算其每天所需热量,给出一周的推荐菜单。用到的计算式是[11]:
    人体基础代谢的需要的基本热量(REE)精确算法如表5.1所示:
    女子



    18- 30 岁
    14.6 x 体重(公斤) + 450




    31- 60 岁
    8.6 x 体重(公斤) + 830


    60岁以上
    10.4 x 体重(公斤) + 600



    男子



    18- 30 岁
    15.2 x 体重(公斤)+ 680




    31- 60 岁
    11.5 x 体重(公斤) + 83


    60岁以上
    13.4 x 体重(公斤) + 490



    每天所需的热量 = REE × 活动系数 = xxx (大卡)
    活动系数表



    活动内容
    活动系数




    卧床(全天)
    1.2


    轻活动生活模式(多坐或缓步)
    1.3


    一般活动度
    1.5-1.75


    活动量大的生活模式
    2.0



    教师饮食管理功能界面

    5.2.3 教师健康日志功能设计用户可以记录自己健康日记,还可记录每一天的睡眠,饮酒,吸烟,血压体重,心情等情况,录入自己一天的饮食量,记录健康日志采用的是kindeditor这款文本编辑器健康日志功能界面具体如图5.4所示:
    健康日志功能界面

    5.2.4 教师体检管理功能设计校医院从后台导入体检结果,教师可通过该平台查询每次的体检结果,并且利用Highcharts 显示体检部分项目随时间变化的曲线,例如血压,血糖等。
    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。目前Highcharts支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。Highcharts界面美观,由于使用JavaScript编写,所以不需要像Flash和Java那样需要插件才可以运行,而且运行速度快。另外Highcharts还有很好的兼容性,能够完美支持当前大多数浏览器[12]。体检管理功能具体界面如图5.5所示:
    教师体检管理功能界面

    5.2.5 疾病预测评估功能设计主要是针对糖尿病和高血压两种疾病,根据用户的体检相关项以及数据库近十年同类人患病情况,分析出致病的危险因素,利用数学线性回归的方法,建立预测模型,未来体检者可输入相关体检项来模拟计算出教师患病概率,预测模型如图5.6所示:
    疾病预测模型图

    疾病预测功能界面

    5.2.6 注册功能设计新用户可以按提示进行注册,每一项都用具体的正则表达式进行表单验证,确保信息有效可用,注册界面具体如图5.8所示:
    注册功能界面

    5.3 后台功能设计5.3.1 管理员登录功能管理员使用用户名密码登陆系统后台,登陆界面如图5.9所示:
    管理员后台登录界面

    管理员登陆后台后进入欢迎界面,此界面显示后台主要功能菜单以及登录时间,欢迎界面图5.10所示:
    后台欢迎界面

    5.3.2 管理管理员功能对管理员管理主要有查询、删除和添加操作,其中查询出来的管理员采用分页显示,调用的是Hibernate Template中的excutefind方法,此方法中的参数为一个回调函数,查询及删除管理员具体界面如图5.11所示:
    管理员查询及删除界面

    添加管理员中分别对用户名密码进行验证添加,管理员添加界面如图5.12所示:
    管理员添加界面

    5.3.3 管理员管理体检结果教师体检结果管理可显示所有教师体检结果并可以删除不需要的记录,体检结果采用分页显示,每页默认显示10条记录,体检结果显示及删除具体界面如图5.13所示:
    管理员管理体检结果界面

    教师体检结果的添加使用POI读取Excel表格, POI 是apache的子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理Excel对象。它不仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,可以控制一些属性如sheet,cell等[13]。体检结果添加具体界面如图5.14所示:
    体检结果添加界面

    5.3.4 管理员管理健康新闻健康新闻管理中可以添加,修改以及删除新闻,修改和删除具体界面如图5.15所示:
    健康新闻修改删除界面

    健康新闻的添加功能中,图片的上传采用struts处理文件上传,具体界面如图5.16所示:
    健康新闻添加界面

    5.3.5 管理员管理教师功能教师个人信息管理中有查看及删除教师信息功能,具体界面如图5.17所示:
    教师管理界面

    6 系统测试6.1 编写测试用例登陆测试用例



    字段名称
    描述




    标识符
    UC001


    测试项
    用户登录功能测试


    测试环境要求
    1.用户test/pass为有效登陆用户,用户test1为无效登录用户; 2.浏览器的cookie为被禁用


    输入标准
    1. 用户输入正确的用户名和密码,单击登陆按钮 2. 输入错误的用户名密码,单击登陆按钮 3. 不输入用户名密码,单击登陆 4. 输入正确的用户名不输入密码,单击登陆


    输出标准
    1.数据库中存在的用户可以正确登陆 2.显示错误提示界面 3.提示“请输入用户名” 4.提示“请输入密码”



    注册测试用例



    字段名称
    描述




    标识符
    UC002


    测试项
    用户注册功能测试


    测试环境要求
    用户未注册过


    输入标准
    1.用户输入真实名字大于四个或小于两个 2.用户输入手机号不是11位 3.用户输入邮箱不含@ 4.用户必填项输入为空


    输出标准
    1.系统提示输入正确的名字 2.系统提示输入正确的手机号 3.系统提示输入正确的邮箱格式 4.系统提示完成所有必要输入



    6.2 单元测试在单元测试的时候,主要测试的是前后台各功能模块的功能是否都正常运行,是否和预期的结果相同,页面间的跳转和页面数据显示是否正常,实现的方式是单步调试,调试工具是用VS2005,辅助工具使用IE的脚本调试。在VS2005中设置断点,跟踪语句,逐句或者逐过程的调试,对出现的问题进行记录,并在完成所有测试后,对BUG进行了修复。
    6.3 系统和集成测试系统测试是通过将健康管理的前后系统进行整合,整体的测试平台的性能,测试前后台是否有数据不匹配,或者数据冲突等问题。集成测试是将整个平台放在服务器上,通过远程的访问、使用,测试系统平台是否能正常运行,通过使用VS2005提供的压力测试工具,对平台进行压力测试,以测试在用户使用高峰期时,平台的承受能力。
    集成压力测试方法:

    创建测试项目
    添加Web测试
    运行健康管理平台,此时web测试工具将对网站的相应操作记录,记录充足后停止记录,并生成相应代码
    添加负载测试
    在向导中设置需要测试环境,运行测试

    7 结论本文从健康管理平台所需要实现的功能模块开始分析,决定使用Java开发该网站。并利用JDK,Tomcat,My Eclipse,Oracle等软件来搭建开发环境,利用Java技术的Spring、Hibernate、Struts等开源框架设计J2EE三层结构的中业务逻辑层和数据服务层,健康管理平台以Spring 框架为核心,向下整合Hibernate 进行持久层访问;向上整合Struts 按清晰的MVC 模式控制。这样可以更快开发松散耦合的健康管理平台。通过这次毕业设计学会利用java构建Web 网站,在毕业设计中接触过不少开源框架。开源框架的强大让我觉得还有很多技术需要去学习,这也让我明白,要不断地学习新知识才会利于自己各方面的发展。
    参考文献[1] 王磊,河南省高校教师亚健康状态状况研究,河南师范大学学报(自然科学版),39(4): 163-167, 2011.
    [2] 中国卫生部疾病预防控制局,中国慢性病报告,北京,2009.
    [3] 北京交通大学校医院,北京交通大学教职工慢性病统计报告,北京,2012.
    [4] World Health Organization. Preventing chronic disease: a vital investment. Geneva, 2005.
    [5] 辛立伟,张帆.Java从初学到精通.北京:电子工业出版社,2010.552.
    [6] 林建素,孟康健.《Eclipse开发学习笔记》 (第1版)北京:电子工业出版社. 2008.4.
    [7] 《程序员》杂志社.程序员2004合订本下 北京:电子工业出版社:2005.
    [8] 辛立伟,张帆.Java从初学到精通.北京:电子工业出版社,2010.552.
    [9] 耿祥义,张跃平.java2实用教程.北京:清华大学出版社,2006.134.
    [10] 朱福喜,唐晓军.Java程序设计技巧与开发实例 北京:人民邮电出版社:2004.
    [11] 万方数据库,亚健康相关论文,http://s.g.wanfangdata.com.cn/Paper.aspx?q= subhealth,2012.
    [12] 张智勇. JavaScript开发技术大全.北京:清华大学出版社,2009.201.
    [13] 李松林,陈华清,任鑫.《Eclipse宝典》(第1版).北京:电子工业出版社. 2007.9.
    1 评论 12 下载 2020-07-22 13:18:07 下载需要13点积分
  • 基于SSM的网上购物系统的设计与开发

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

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

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

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

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

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

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

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

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

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



    数据表
    描述




    adminuser
    后台管理员表


    category
    一级分类表


    categorysecond
    二级分类表


    orderitem
    订单项表


    orders
    订单表


    product
    商品表


    user
    前台用户表



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



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




    id
    int(11)
    YES
    YES
    账号


    username
    varchar(1000)
    NO
    NO
    用户名


    password
    varchar(1000)
    NO
    NO
    密码



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



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




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


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



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



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




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


    Csname
    varchar(1000)

    NO
    二级分类名称


    cid
    varchar(1000)

    NO
    所属一级分类id



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



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




    Oiid
    int(11)
    YES
    YES
    订单项id


    count
    varchar(1000)


    购买数量


    subtotal
    double


    单项总价id


    Pid
    int(11)


    所购商品id


    cid
    int(11)


    所属订单id



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



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




    oid
    int(11)
    YES
    YES
    订单id


    money
    double


    订单总价


    state
    Int(11)


    订单状态


    Receiveinfo
    Varchar(255)


    收货地址


    phonum
    Varchar(255)


    收货人电话


    Order_time
    datetime


    下单时间


    Uid
    Int(11)


    所属用户id



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



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




    Pid
    int(11)
    YES
    YES
    商品id


    Pname
    Varchar(255)


    商品名称


    Market_price
    Int(11)


    市场价


    Shop_price
    Varchar(255)


    商城价


    image
    Varchar(255)


    商品图片


    Pdesc
    Varchar(255)


    商品描述


    Is_hot
    int(11)


    是否热门


    Pdate
    datetime


    商品上架日期


    csid
    int(11)


    所属二级分类id



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



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




    Uid
    int(11)
    YES
    YES
    用户id


    Username
    Varchar(255)


    用户名


    password
    Varchar(255)


    用户密码


    Name
    Varchar(255)


    用户真实姓名


    Email
    Varchar(255)


    用户游戏


    Phone
    Varchar(255)


    用户手机号


    Addr
    Varchar(255)


    用户地址


    State
    int(11)


    用户状态



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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    第一章 需求分析1.1 引言伴随着Internet的蓬勃发展,网络购物中心作为电子商务的一种形式正以其高 效、低成本的优势,逐步成为新兴的经营模式和理念,人们已不再满足于信息浏览 和发布,而是渴望着能够充分享受网络所带来的更多的便利。的确,客户足不出户 便可以方便快捷的选购自己喜欢的商品,这正是网络购物中心为客户带来的好处。 网络商城将传统的商务流程电子化、数字化,一方面以电子流代替了实物流,可以大量减少人力、物力,降低了成本;另一方面突破了时间和空间的限制,使得 交易活动可以在任何时间、任何地点进行,从而大大提高了效率网络商城所具有的 开放性和全球性的特点,为企业创造了更多的贸易机会。网络商城使企业可以以相 近的成本进入全球电子化市场, 使得中小企业有可能拥有和大企业一样的信息资源, 提高了中小企业的竞争能力。网络商城重新定义了传统的流通模式,减少了中间环节,使得生产者和消费者的直接交易成为可能,从而在一定程度上改变了整个社会 经济运行的方式。网络商城一方面破除了时空的壁垒,另一方面又提供了丰富的信 息资源,为各种社会经济要素的重新组合提供了更多的可能,这将影响到社会的经 济布局和结构。 现在的购物商场成蓬勃向上发展的。
    1.2 需求分析一个网络购物系统,首先我们要保证客户能够很方便进行商品选择,系统应该具有分类选择商品功能,系统要实现购买功能。在系统的后台,管理员能够管理商品,商品分类,以及客户购买订单。 因此分析,本系统主要由前台和后台两部分组成,前台为客户端,顾客可以在此处购买商品,后台为商品管理端,实现对商品和订单的管理。
    第二章 系统分析2.1 开发环境根据用户的需求和实际的考察与分析,确定商城的开发环境,具体如下:

    服务器:从稳定性、广泛性及安全性方面综合考虑,采用市场主流的Web服务器软件Apache服务器
    数据库:采用最受欢迎的开源SQL数据库管理系统和被誉为PHP黄金搭档的MySQL
    开发框架:选用具有快速、兼容、开源、简单易学等特点的轻量级国产PHP开发框架—ThinkPHP

    2.4 系统运行环境该网上商城可运行在分辨率为1920×1080的chrome浏览器下。
    2.3 功能结构商城分为前台模块和后台模块。下面分别给出前、后台的功能结构图。


    2.4 目录结构目录结构即为think php 目录结构,再次不做介绍。
    第三章 数据库设计3.1 商品分类表(itcast_category)


    字段名
    数据类型
    描述




    cid
    Int unsigned
    主键ID,自动增长


    cname
    varchar(20)
    商品分类名称


    pcname
    varchar(20)
    父类分类名称



    3.2 商品表(itcast_goods)


    字段名
    数据类型
    描述




    gid
    varchar(255)
    主键ID,自动增长


    gname
    varchar(255)
    商品名称


    price
    int
    商品价格


    thumb
    varchar(255)
    商品图片路径


    status
    Enum(‘no’,’yes’)
    是否上下架,上架为yes,否则为no


    description
    text
    商品描述


    stock
    int
    商品库存


    cid
    Int unsigned
    商品分类ID


    sales
    int
    商品销量


    turn
    Int unique
    排序码,自动增长



    3.3 会员信息表(itcast_member)


    字段名
    数据类型
    描述




    mid
    Int unsigned
    主键ID,自动增长


    user
    varchar(20)
    会员昵称


    email
    varchar(30)
    会员电子邮件地址


    pwd
    char(32)
    会员登陆密码


    birthday
    date
    会员生日



    3.4 会员收货地址表(itcast_address)


    字段名
    数据类型
    描述




    aid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    consignee
    varchar(20)
    收货人姓名


    phone
    varchar(11)
    电话号码


    postcode
    varchar(6)
    邮政编码


    address
    varchar(255)
    收货地址


    freight
    int
    运费



    3.5 购物车表(itcast_shopcart)


    字段名
    数据类型
    描述




    scid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    addTime
    timestamp
    加入购物车时间


    gid
    varchar(255)
    商品ID


    num
    tinyint(3)
    商品数量



    3.6 购买记录表(itcast_record)


    字段名
    数据类型
    描述




    rid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    time
    timestamp
    购买时间


    gid
    varchar(255)
    商品ID


    num
    tinyint(3)
    商品数量


    price
    Int unsigned
    商品单价



    3.7 折扣商品表(itcast_discountgoods)


    字段名
    数据类型
    描述




    dgid
    Int unsigned
    主键ID,自动增长


    gid
    varchar(255)
    商品ID


    discount
    int
    折扣



    第四章 具体功能实现4.1 前台具体功能4.1.1 公共部分

    显示登录后的用户昵称、退出登录
    分类搜索商品
    进入各个功能模块
    登录按钮
    登录后查看购买记录、进入购物车



    购物车简要信息:总价(折扣前)、数量
    商品分类,点击即可查看该分类下的商品



    显示当前销量最高的商品


    网站相关信息
    联系方式

    4.1.2 主页
    滚动广告


    推荐商品


    新品推荐

    4.1.3 商品列表页
    商品列表页
    例如,在任一页面的导航栏的搜索框中输入关键词——手机,选择“手机”分类,点击“搜索”按钮。

    之后就可进入商品列表页,该页面显示了所有在指定分类下与关键词相关的商品。

    此时可点击排序下拉菜单,对商品进行排序(默认按照新品排序),例如按照价格升序排列

    类似还可进行:“新品”、“价格降序”、“销量”方式排序。

    折扣商品列表页
    若点击导航栏的“特价优惠”链接,即进入折扣商品列表页

    4.1.4 商品详情页
    查看商品信息
    在任何页面的商品列表点击指定商品,即可查看该商品的详细信息。

    此时,点击“相关商品”按钮,可查看该与该商品相关的其他商品。
    有两种查看方式:



    加入购物车
    会员登录后,在详情页选择购买数量,点击“加入购物车”按钮即可将选择的商品加入购物车。
    4.1.5 会员注册、登录在任一页面的导航栏点击“登录”按钮,即可进入下图所示页面:

    左部为注册框,右部为登录框。

    注册
    在注册框中输入要创建账户的邮箱地址,点击“创建”按钮

    进入下图所示页面填写会员详细信息。

    点击“注册”按钮,即完成了会员注册操作。

    登录
    在登录页面填写正确的邮箱、密码和验证码,点击“登录”按钮即可成功登录。

    若验证码填写错误,页面将显示如下提示信息,并返回登录页面。
    若用户名或密码填写错误,页面将显示如下提示信息,并返回登录页面。
    4.1.6 购物车
    简介
    登录成功后即进入购物车页面(新用户购物车为空),用户可在该页面对加入购物车的商品进行购买。

    假设会员已将自己心仪的商品加入到购物车,购物车页面将自动计算总价。


    更改购物车商品
    此时,会员可通过点击每个商品的“+”、“-”按钮对该商品数量进行增加和减少操作。

    若会员不想购买某件商品,可点击“×”按钮从购物车中删除该商品。


    购买商品
    点击“购买”按钮即将购物车中的商品全部购买。

    4.1.7 购买记录点击上方导航栏的“购买记录”按钮或点击下方页脚的“购买记录”超链接

    即可进入购买记录页查看购买记录。

    4.2 后台具体功能4.2.1 登录页面在登录页面填写正确的用户名、密码和验证码,点击“登录”按钮即可成功登录。

    若验证码填写错误,页面将显示如下提示信息,并返回登录页面。
    若用户名或密码填写错误,页面将显示如下提示信息,并返回登录页面。
    4.2.2 公共部分
    显示标题
    显示管理员名称
    “前台首页”超链接
    “退出登录”按钮



    左部导航栏,点击链接可进入相对应模块
    4.2.3 首页欢迎页面,引导管理员进行操作。

    4.2.4 商品添加在左侧导航栏点击“商品添加”链接进入商品添加页面。
    依次按要求填写商品信息,上传图片。

    点击“确定”按钮,即完成商品添加操作。
    若商品编号重复,则不添加该商品,直接进入商品修改页修改该商品。

    4.2.5 商品查看、修改、删除
    查看
    在左侧导航栏点击“商品列表”链接进入商品列表页面。

    管理员可对指定分类下的商品进行排序(默认对所有商品按照新品排序),例如对“手机—手机”分类按照价格升序排序:


    修改
    点击“修改”可以对指定商品属性进行修改(商品编号不可修改)。


    删除
    点击“删除”

    点击“确定”

    可以看到商品列表中编号为“562390304003”的商品已经被删除。

    4.2.6 查看、添加、删除商品分类
    查看商品分类
    在左侧导航栏点击“商品分类”链接进入商品分类列表页面


    添加商品分类
    点击商品分类列表页的“添加分类”按钮,即可进入商品分类添加页面。例如,选择一级分类为“电脑/办公”,分类名称为“服务器”


    删除商品分类
    点击商品分类列表页每一个商品分类对应的的“删除”
    可以看到商品分类列表页中名为“服务器”的商品分类已经被删除。

    查看会员信息
    在左侧导航栏点击“会员管理”链接进入会员信息列表页面

    点击每个会员的“查看详情”操作,可以查看该会员的详细信息和购买记录

    第五章 总结与心得体会通过这次网上商城开发,让我清楚认识到软件工程的重要程度,软件项目涉及到以下阶段,即计划阶段、需求分析、软件设计、编码、测试阶段、运行维护等。经过一段时间的努力,我们终于完成了网上商城网站系统,基本实现了题目的基本要求。总的来说,在做这个毕业设计的过程中,我们查阅了大量关于网上销售的相关资料,切实地按照软件工程的步骤,从需求分析,概要设计,详细设计,数据库设计,再到编码,调试运行,测试等步骤。从中我学到了很多东西,对我们来说,无论是理论还是实践上都是一个较大幅度的提高,可以说是理论到实践的一个飞跃。我还了解了软件开发的大体过程,在当今竞争激烈的社会中只有学到本领才能有立足之地,通过这次综合实验也使我们知道做软件开发的辛苦,首先要有足够的耐心,要勇于面对密密麻麻的代码,无数遍的调试,和无数遍的修改,但是,当调试成功时,你就会感到这些努力的意义,成功的喜悦。软件开发,还要注意借鉴,查看已有的例子的代码,这样可以节省大量的时间,同时也实现了代码重用。此外,我知道了基础课的重要,要学好一门编程语言,一定要动手,实践是最好的方法!
    16 评论 225 下载 2019-05-23 17:51:27 下载需要13点积分
  • 基于JAVA和ACCESS数据库实现的药品销售管理系统

    一、背景分析药品管理系统,是反映药品购进入库、在库管理、销售出库软件系统,是医院和医药销售企业药品流动信息的传递媒介和执行依据。
    然而我们在调研中发现,目前已开发出来的药品管理系统虽然在使用过程中提供了良好的药品查询及其它使用功能,但是主要是面向医院、药品生产企业和药品销售公司,并没有一款针对药品代理商的药品管理系统。药品代理商作为连接药品生产企业和医院的中间渠道,在医药流通环节扮演着举足轻重的角色。药品代理商平时需要处理大量的药品进销数据,如果不能为他们设计一款便捷的药品管理系统,将会给药品流通带来很多不便,也为药品安全埋下隐患。
    此外,现有的药品管理系统在功能上还有一些缺陷,比如药品供应企业的药品生产许可证或药品经营许可证已到期,系统不能及时警示;已有的药品查询系统中不能正确区别药品的质量类别和层次。这无疑不符合药品的 GSP 管理要求,给药品管理带来不安全隐患。
    基于以上原因,我们面向药品代理商,开发一款增加企业证照审核系统和药品质量类别查询的药品管理系统,给医院及医药销售企业的药品管理提供安全保障及操作方便。
    二、需求分析在第一章,我们已经分析了用户对药品管理系统的迫切需求。因此,我们需要实现一个可以满足药品代理商基本需求的应用程序。在本章将分析应用程序需要具体实现哪些功能,需要包含那些数据。
    2.1 数据分析在和一线药品销售人员交流之后,根据他们日常的进货、销售活动,我认为该应用程序应该包括以下几个方面的内容

    药品的基本信息生产厂家的基本信息医院的基本信息进货记录销售记录
    药品的基本信息包括:药品的名称(通用名和商品名) ,批准文号,规格,生产厂家,价格等。
    生产厂家的基本信息包括企业的名称,企业的批准文号,企业联系人员的姓名和联系方式,向企业付款的银行帐号信息等。
    医院的基本信息包括医院名称,等级,地址,联系人员的姓名和联系方式等。
    进货记录包括日期,进货的药品名称、数量、价格等。由于药品不同于其它商品,对有效期有很高的要求,进货的信息应该包括该批次药品的有效期。
    销售记录包括日期,销售的药品名称、数量、价格,销售对象(医院名称)和该批次药品的有效期等。
    2.2 功能分析应用程序应该包括以下基本功能:

    数据的浏览数据的查询数据的插入、修改、删除简单的统计功能信息提示功能
    数据的浏览应该可以对第 1 节所提到的信息进行浏览。
    数据的查询应当可以根据关键字查询相应的记录。由于药品名称较长,商品名种类繁多,最好能够支持模糊查询和条件组合查询。
    数据的插入、修改、删除应该对上述的信息进行添加、修改、删除操作。简单的统计功能应当可以对销售的库存、销售金额等信息进行统计,为销售人员决策提供数据支持。
    信息提示功能是为保障药品质量安全,对用户予以习惯的提示。由于药品销售行业对药品的质量、有效期、年审制度要求很高,在应用程序中应该实现一些同时和警告功能。例如:对库存的过期药品进行警告;在进货时,如有年审过期的药品或药品生产企业年审过期,则不予进库;在销售表中增加药品质量属性。
    2.3 其它要求为防止用户误操作,在应用程序增加备份数据库和日志记录的功能。
    此外,药品销售从业人员普遍为非计算机专业,所以应用程序应该易于安装和操作,并配有帮助手册以辅助用户。为防止用户操作失误,应用程序还要有适当的提示功能和容错能力。
    三、概要设计在第二章中,已经确定了药品销售管理系统的基本功能和所包含的数据。在本章,将对应用程序中的数据库进行设计。
    3.1 数据字典对应用程序出现的一些专业术语进行定义:

    药品名称:即通用名,是由世界卫生组织编定的在全球范围通用和在药品标准中列入的名称商品名:系指经国家药品监督管理局部门批准的特定企业使用的商品名称批准文号:生产新药或者已有国家标准的药品的,须经国务院药品监督管理部门批准,并在批准文件上规定该药品的专有编号,此编号称为药品批准文 号。批准文号=[国药准字 | 国药试字]+[H| S| J| T| F| B | Z]+8{数字}8生产批号:用于识别“批”的一组数字或字母加数字,用以追溯和审查批药品的生产历史规格:指单位剂量药品中含有药物的量包装:指单位包装箱内销售单元数药品质量类别:药品质量类别=[原研类|专利类|GMP 类|GMP 单独定价类]药品有效期:药品有效期是指该药品被批准的使用期限,表示该药品在规定的贮存条件下能够保证质量的期限药品年审:在药品实际销售过程中,由国家工商、药监部门对年审合格药品发放的相关证明。有效期一年,具体数值为年审截止日期,格式为年月日企业年审:由国家工商、药监部门对年审合格的药品生产企业发放的相关证明。有效期一年,具体数值为年审截止日期,格式为年月日医院等级:依据医院功能、设施、技术力量等对医院资质评定的指标,共分三级十等
    3.2 E-R 图根据需求分析中对应用程序所含数据的分析、数据字典的定义和数据之间的关系,可以绘制出 E-R 图(Entity-RelationshipDiagram)。
    E-R 图包含了应用程序数据库中的实体和实体之间的联系。

    3.3 关系数据库设计根据 E-R 图可以分析出,应用程序中的数据库应该包括药品表、医院表、生产企业表、进货表、销售表五个基本表。每一个基本表中以药品销售活动中必要的信息作为属性。为了减少冗余和便于编程,为每一个表添加一个编号作为码。
    其具体设计如下:
    3.3.1 药品表
    医院编号=H+3{数字}3
    在医院表中,医院编号是码。分析各属性之间的关系可知,没有部分依赖和传递依赖;且只有一个码“医院编号”,所以医院表的关系模式属于 BCNF。
    3.3.2 生产企业表
    企业编号=F+3{数字}3
    在生产企业表中,企业编号是码。分析各属性之间的关系可知,没有部分依赖和传递依赖;且只有一个码“企业编号”,所以生产企业表的关系模 式属于 BCNF。
    3.3.3 进货表
    进货编号=P+数字日期+3{数字}3 数字日期=8{数字}8,(例如:20111123)
    进货表的码是“进货编号”。分析表中的各个属性可以发现金额还可以由单价和数量决定,造成了数据冗余。但是为方便后期程序的实现,还是保留了这一个属性。“药品编号”是进货关系的外码。由于存在传递依赖,进货 表的关系模式属于 2NF。
    3.3.4 销售表
    销售编号=S+日期+3{数字}3
    “销售编号”是销售表的码。“药品编号”和“医院编号”是销售关系的外 码。销售表和进货表类似,销售表也存在传递依赖。所以关系模式属于 2NF。
    四、详细设计在完成了设计数据库的设计后,则进入了详细设计阶段。在本章,将设计出应用程序的用户界面、程序的基本模块和模块之间的调用关系。
    4.1 用户界面设计根据对需求的分析,我认为界面应该有以下特点:

    直观简洁方便操作
    4.1.1 主界面基于以上考虑,在设计用户界面时,设想把基本表的显示部分和控制按钮、查询部分放在一个界面。每一个基本表有一个对应的界面。构想参见图。 在 Java Swing 中提供了一种JTabbedPane 的界面模式,JTabbedPane 可以添 加多个 JPanel,能够做出类似于Office2007Ribbon 界面的切换卡的界面。采用切换卡界面有如下优势:

    所有功能有组织地集中存放,不再需要查找级联菜单、工具栏等等更好地在每个应用程序中组织命令提供足够显示更多命令的空间丰富的命令布局可以帮助用户更容易地找到重要的,常用的功能
    4.1.2 查询结果显示设置查询条件后,点击按钮可以显示查询结果。查询结果显示在对话框中的表格里,表格的格式和基本表相同。
    4.1.3 新建记录点击新建记录的按钮,可以弹出对话框进行数据的录入。点击对话框中的按钮就可以完成记录的创建。修改记录的界面与之类似。原型界面参见图。

    4.2 程序调用关系4.2.1 UML 用例图用例图包含了系统、行为者、用例和用例之间的关系。

    在药品销售管理中,行为者有药品代理商、厂商业务员、医院联系人。药品代理商可以编辑、查询应用程序中的数据记录,编辑记录功能是使用了新增记录、修改记录、删除记录三个用例。药品代理商分别通过销售用例、进货用例和医院联系人、厂家业务员联系起来。
    4.2.2 数据流图数据流图(DataFlow Diagram)是一种图形化技术,它描绘信息流和数据从输入到输出的过程中所经受的变换。根据数据流图,可以分析出程序所需的模块和模块之间的调用关系。
    在药品销售管理中,在用户界面捕捉用户的操作,接受事务后数据流流向不同的模块。

    4.2.3 调用关系图将数据流图不断细化,可以转化出程序的调用关系图。
    以药品页面为例,用户点击按钮,应用程序接受事务。根据按钮的不同,调用执行相应程序的模块。如果是修改数据库记录,则要根据用户的选择,调用具体的操作。修改数据记录最终要调用读、写数据库的底层模块。如果点击了关于报表的的按钮,则要先读取数据库中的记录,再调用生成报表的模块。在接收了关于统计数据的事务时,需要先读取数据库的记录,在执行相关计算的模块,得出结果。

    五、 编码及实现在本章,将记录开发应用程序中编码和调试的过程。为清晰的展示源程序的结构,本章将结合程序的 UML 类图对部分代码进行介绍。
    5.1 工具选择
    编写语言:JAVA1.6数据库:Microsoft Office Access报表程序:JasperReport + iReport2
    5.2 UML 类图5.2.1 实现查询功能的类共有 7 个相关的类来实现应用程序中的查询功能,UML 类图参见图:

    BaseSQL 是基类,有受保护的静态变量 url(用来连接 ODBC)和 7 个受保 护的方法(用来实现插入、删除、更新、计算记录个数等常用功能)DrugSQL (药品查询)HospitalSQL(医院查询)SupplerSQL(供应商查询)SaleSQL (销售查询)PurchaseSQL(进货查询)Statistic(统计查询)
    六个类继承自 BaseSQL,重写了 BaseSQL 里的方法,并根据需要的功能实现了相应的方法。

    5.2.2 实现报表功能的类这里实现报表功能主要指连接数据源。本应用程序使用了第三方开 源报表工具包JasperReport 及其设计软件 iReport。在 iReport 中定义报表 格式 xml 文件,在源程序中根据 xml 文件,实现 JasperReport 包中相应的方法即可以生成报表。 与实现 SQL 的类相似,共有 7 个相关的类来实现应用程序中的连接 报表数据源的功能,UML 类图参见图。
    BaseReportDataSorce 类继承自 JDataSorce 类。JDataSorce 是 JasperReport 中提供的类,用以实现连接数 据库的功能。BaseReportDataSorce 类有若干个受保护的静态变量和方法。 DrugReportDataSorce(连接药品表)、HospitalReportDataSorce(连接医院表)、SupplerReportDataSorce(连接供应商表)、SaleReportDataSorce (连接销售表)、PurchaseReportDataSorce(连接进货表)和 Statistic(连 接 统 计 结 果 ) 六 个 类 继承 自 BaseReportDataSorce , 重 写 了 BaseReportDataSorce 里的方法,并根据需要的功能实现了相应的方法。

    5.2.3 实现主界面的类为实现在设计阶段构想的用户界面,也出于代码重用的目的,设计 了以下结构,UML 类图参见图。 MyPanel 类继承自 javax.swing.JPanel 类,有多个受保护的 JButton、JFrame、JPanel 变量,这些变量是实现每一个子界面所必要的变量,如 确认、取消按钮等。MyPanel 类还实现了 java.awt.ActionListener 接口, 用来响应按钮事件。DrugPanel(药品子界面)、HospitalPanel(医院子界 面)、SupplerPanel(供应商表子界面)、SalePanel(销售表子界面)和 PurchasePanel(进货表子界面)五个类继承自 MyPanel,重写了MyPanel 里的方法。由于统计界面和帮助界面在外观上不同,并未继承 MyPanel类,并根据需要的功能实现了相应的方法。

    5.2.4 实现新建记录对话框的类应用程序要求通过对话框来输入和显示数据,需要重新设计一个 MyDialog。UML 类图参见图。 MyDialog类继承自 javax.swing.JDialog类,有多个受保护的 JButton、 JPanel 等变量,这些变量是实现每一个子界面所必要的变量,如确认、 取消按钮等。MyDialog 类包含了必要的方法,如 Dialog 中读取数据、 将 数 据 库 中 的 数 据 写 入 Dialog 里等 。
    MyDialog 类还实现了 java.awt.ActionListener 接口,用来响应按钮事件。
    NewDrugDialog(药品子界面)、NewHospitalDialog(医院子界面)、NewSupplerDialog(供应商表子界面)、NewSaleDialog(销售表子界面)和NewPurchaseDialog(进 货表子界面)五个类继承自 MyDialog,重写了 MyDialog 里的方法,并根据需要的功能实现了相应的方法。

    5.2.5 自定义 TableModel 类本应用程序中实验 Java Swing 里提供的 JTable 控件来显示表格。实 现 JTable 需要指定 TableModel,用来定义表格的数据模型。由于 Java Swing 中提供的 TableModel 的结构和功能不能满足本应用程序的功能, 需要自行定义 MyTableModel 类。UML 类图参见 MyTableModel 类继承自 javax.swing.table.AbstactTableModel。
    MyTableModel 中定义了两个变量:String 数组 tablehead——用来存放表头和 ArrayList\<Object\[\]\> rows——二维表格。MyTableModel 实现了多个 方法,包括添加、删除、获取表头数组等。DrugTableModel(药品表) 、HospitalTableModel ( 医 院 表 )、 SupplerTableModel ( 供 应 商 表 )、 SaleTableModel ( 销 售 表 )、 PurchaseTableModel ( 进 货 表 ) 和 BalanceTableModel(库存表)六个类继承自 BaseTableModel,在实现过程中只需变更相应的构造方法即可。

    5.2.6 类之间的组织在之前的内容,已经说明了各个功能的实现。又是如何将这些功能块组织到一起,具体实现一个模块呢?在此,以实现药品模块为例,说明如何将用户界面、查询、查询结果显示等类组织在一起。 参见图 5-6,DrugAdministration 程序主体由 MyWindow 类组成。
    MyWindow 通过 JTabbedPane 控件将多个 Panel 组合在一起形成主界面, 其中包括 DrugPanel 类的对象 drugPanel。drugPanel 调用 NewDrugDialog 类的对象 dialog 来新建、修改数据记录;drugPanel 调用 DrugTableModel 类的对象 tablemodel 来定义表格;drugPanel 调用 DrugReport 类的对象 viewer 来显示报表;drugPanel 调用 DrugSQL 类的静态方法实现数据查询。

    5.3 重要 SQL 查询语句由于应用程序中不同表的插入、删除、修改的 SQL 语句类似,仅是属性 有所不同。所以这里只列出关于药品表的 SQL 语句。
    /*查询药品数量*/SELECT COUNT(*) FROM Drug/*查询所有药品的名称,并按升序返回*/SELECT drug_name FROM Drug ORDER BY drug_id ASC/*根据药品编号查询药品的名称*/SELECT drug_name FROM Drug WHERE drug_id = ?/*查询所有药品的记录*/SELECT * FROM Drug ORDER BY drug_id ASC/*根据药品编号查询某一药品记录*/SELECT * FROM Drug WHERE drug_id = ?/*根据药品编号删除某一药品记录*/DELETE FROM Drug WHERE drug_id = ?/*查询不同药品的销售数量*/SELECT drug_id, SUM(amount) FROM sale GROUP BY drug_id/*查询不同医院的采购数量*/SELECT hos_id, SUM(amount) FROM sale GROUP BY hos_id;/*根据药品、生产批号和有效期将进货进行分组*/SELECT drug_id, batch_num, vali_date, SUM(amount)FROM purchaseGROUP BY drug_id, batch_num, vali_date;/*根据药品、生产批号和有效期将销售进行分组*/SELECT drug_id, batch_num, vali_date, SUM(amount)FROM saleGROUP BY drug_id, batch_num, vali_date;
    5.4 重要代码在程序中多次使用过convert()方法。该方法可以把JComboBox控件返回的 选中项下标转化为相应记录在供应商表中的码。例如输入数字1可以返回字 符串格式的码“F001”。
    private String convert(int num) { char[] c = { 'F', '0', '0', '0' }; c[3] += num % 10; num /= 10; c[2] += num % 10; c[1] += num / 10; String s = new String(c); return s; }
    生成查询药品的 SQL 语句。因为查询需要支持多条件复合查询,必须能 够根据用户输入的条件生成相应的 SQL 语句。Object 数组 con 存有在查询区 内获取的条件,如果条件不为空,则在 SQL 语句中加入这个条件。这样, 就可以获得多个条件的 SQL 语句。
    StringBuffer sb = new StringBuffer("SELECT * FROM Drug WHERE ");boolean b = false; if (con[0] != "") { sb.append("drug_name = '" + con[0] + "'"); b = true;} if (con[1] != "") { if (b) sb.append(" AND "); sb.append("factory = '" + con[1] + "'"); b = true;} if (con[2] != null) { if (b) sb.append(" AND "); sb.append("quality = " + con[2]); b = true; } if (con[3] != null) { if (b) sb.append(" AND "); sb.append("verification < #" + con[3] + "#"); } String sql_query = new String(sb);
    获取库存药品数量。purchase_amount 和 sale_amount 是均为视图,分别根据药品、生产批号和有效期对进货和销售进行分组。这两个视图就用到了 第 3 节提到的两个 SQL 语句。
    视图中有四个属性:药品、生产批号、有效期和数量。获取库存药品数量的方法如下:
    public static Object[][] Balance() { Object[][] Pobj = null, Sobj = null; String sql_query1 = "SELECT * FROM purchase_amount"; String sql_query2 = "SELECT * FROM sale_amount"; try { Connection conn = DriverManager. getConnection ( url , "", ""); Statement sql = conn.createStatement( ResultSet. TYPE_SCROLL_INSENSITIVE , ResultSet. CONCUR_READ_ONLY ); ResultSet rs; rs = sql.executeQuery(sql_query1); rs.last(); // Move to the last row int n1 = rs.getRow(); // Last row;s number rs.beforeFirst(); // Move back to the first rowPobj = new Object[n1][4]; int i = 0; while (rs.next()) { Pobj[i][0] = DrugSQL. getDrugname (rs.getString(1)); Pobj[i][1] = rs.getString(2); Pobj[i][2] = rs.getDate(3); Pobj[i][3] = rs.getInt(4); i++; } rs = sql.executeQuery(sql_query2); rs.last(); // Move to the last row int n2 = rs.getRow(); // Last row;s number rs.beforeFirst(); // Move back to the first row Sobj = new Object[n2][4]; int j = 0; while (rs.next()) { Sobj[j][0] = DrugSQL.getDrugname (rs.getString(1)); Sobj[j][1] = rs.getString(2); Sobj[j][2] = rs.getDate(3); Sobj[j][3] = rs.getInt(4); j++; } conn.close(); } catch (SQLException e) { e.printStackTrace(); } for (int i = 0; i < Pobj.length; i++) for (int j = 0; j < Sobj.length; j++) if (Pobj[i][0].equals(Sobj[j][0]) && Pobj[i][1].equals(Sobj[j][1])) Pobj[i][3] = Integer. parseInt (Pobj[i][3].toString()) Integer. parseInt (Sobj[j][3].toString()); Sobj = null; return Pobj; }
    这两个视图的结果分别储存在二维Object数组Pobj和 Sobj 中。如果Pobj 和 Sobj 里的药品名称和生产批号相同,只可以判断是同一批的同种药品,两者之差就是库存量。
    计算利润。本应用程序中可以显示近半年内的利润。一个难点是限制时间的范围是最近的半年。另外一个难点是根据进货和销售表计算利润。
    计算最近六个月的代码如下。其中整数数组 month 储存的就是最近六个月月份的数值。
    int[] month = new int[6]; Calendar cal = Calendar. getInstance (); cal.setTime(new Date());int i, m = cal.get(Calendar. MONTH ) + 1; for (i = 5; i >= 0; i--, m--)month[i] = (m + 12) % 12 != 0 ? (m + 12) % 12 : 12;
    解决了限制时间范围的问题后,计算利润时先计算每个月销售的总收入,再减去当月进货的总支出,即可以得到当月的利润。代码如下:
    private static String StrProf(int num, boolean isSale) { String str1 = "SELECT SUM(Sale.cost) FROM Sale WHERE sale_date >= "; String str2 = " AND sale_date < "; String str3 = "SELECT SUM(Purchase.cost) FROM Purchase WHERE pur_date >= "; String str4 = " AND pur_date < "; int[] month = new int[6]; String[] strmonth = new String[7]; Calendar c = Calendar. getInstance (); c.setTime(new Date()); int i, y = c.get(Calendar. YEAR ), m = c.get(Calendar. MONTH ) + 1; for (i = 5; i >= 0; i--, m--) month[i] = (m + 12) % 12 != 0 ? (m + 12) % 12 : 12; for (i = 0; i < 6; i++) { StringBuffer s = new StringBuffer("#--01#"); if (month[i] > c.get(Calendar. MONTH ) + 1) { s.insert(2, month[i]); s.insert(1, y - 1); } else { s.insert(2, month[i]); s.insert(1, y); } strmonth[i] = new String(s); } StringBuffer s = new StringBuffer("#--01#"); s.insert(2, month[5] + 1); if (month[5] == 12) s.insert(1, (y + 1));else s.insert(1, y); strmonth[6] = new String(s); if (isSale) return (str1 + strmonth[num] + str2 + strmonth[num + 1]); else return (str3 + strmonth[num] + str4 + strmonth[num + 1]);}public static Double[] Statitic_Prof() { Double[] prof = new Double[6]; String sq; try { Connection conn = DriverManager.getConnection (url , "",""); Statement sql = conn.createStatement(); ResultSet rs; for (int i = 0; i < 6; i++) { sq = StrProf (i, true); rs = sql.executeQuery(sq); while (rs.next()) { prof[i] = rs.getDouble(1); } sq = StrProf (i, false); rs = sql.executeQuery(sq); while (rs.next()) { prof[i] -= rs.getDouble(1); } } conn.close(); } catch (SQLException e) { e.printStackTrace(); } return prof;}
    为了实现进货和销售时自动编号,即根据当日进货、销售数量自动编号。 比如,2012 年 1 月 1 日还没有销售记录,此时打开新建记录对话框,可以自动把销售编号编为S20120101001。于是使用 getSaleID 方法来实现以上功能。
    private String getSaleID(int num) { String str = null; char[] c = { '0', '0', '0' }; num++; c[2] += num % 10; num /= 10; c[1] += num % 10; c[0] += num / 10; String s = new String(c); SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd"); str = "S" + ft.format(new Date()) + s; return str;}
    5.5 调试过程在程序编写初期,每一个窗口都是独立的一个类,不仅要写大量重复的代码,还增加了出错的机会。后来,该有继承基类的方法,将每一个类重复出现的部分代码在基类中实现,使代码更加简洁,逻辑关系更加清晰。
    在编码过程中,需要计算 SQL 语句执行结果的记录数以便申请合适大小 的数组。但是 Java语言不能够直接得到 ResultSet 的大小。在网上搜索到解决方法。通过移动游标,可以间接求得记录的数目,方法十分巧妙。代码如下:
    先将 sql 设置为可以回滚的类型:
    Statement sql = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    再有以下语句:
    rs = sql.executeQuery(sql_query); rs.last(); // Move to the last row int n = rs.getRow(); // Last row;s numberrs.beforeFirst(); // Move back to the first row
    在 Access 数据库上操作有关日期的数据时,遇到一个问题是 SQL 语句 错误。后来得知在 Access 上日期是用‘#’表示,而不是其它数据库常用的 单引号。所以 SQL 语句要写成
    SELECT * FROM Drug WHERE verification < # ? #
    而不是
    SELECT * FROM Drug WHERE verification < ' ? '
    此外,在 Java 提供的数据类型中,日期格式有两个类,分别是 java.util.Date 和java.sql.Date,两者并不通用。比如一般日期操作用的是 java.util.Date,在数据库操作时用的是 java.sql.Date,所以在编程时要留心日期格式的转换,避免错误。
    此外,在编程过程中还出现了许多小的错误,比如数组越界、数据格式转化错误……,在此不一一赘述。
    通过完成这次数据库课程设计,不仅对数据库操作的相关知识有了系统的学习,对自己的编程能力、程序设计能力的提高都有很大的促进作用。
    六、作品概览6.1 功能展示6.1.1 数据的浏览程序主界面中,可以看到主界面由多个切换卡构成。每一个页面下有表格区、控制按钮、查询区。表格区可以显示基本表,以供用户对数据进行浏览。控制按钮由多个按钮。点击“打开表格”即可显示基本表。点击“新建记录”按钮可以在弹出的对话框中输入数据创建记录。点击“修改记录”按钮或“删除记录”按钮,可以进行修改或删除。点击“导出报表”按钮可以导出报表。在查询区,则可以输入条件进行查询。

    6.1.2 数据的查询在查询区中在查询区,有多个查询条件,可以选择填入一个或多个条件。点击“查询”,可以在基本表中查询对应的记录;点击“清空”可以清空输入的条件。查询结果将在对话框中显示。

    6.1.3 数据的插入、修改、删除在每一个页面下点击“新建记录”,可以弹出对话框,可以输入具体的数据。点击对话框内的“确认”按钮,就可以完成记录的插入。

    在基本表中选择一条数据,再点击“修改记录”,可以弹出对话框,对 话框和图 6-3 所示对话框相同,只是已经填有数据库中的数据,可以对数据进行修改。点击对话框内的“确认”按钮,就完成了记录的修改。
    在基本表中选择一条数据,再点击“删除记录”,可以弹出一个警告对话框,提醒用户是否确认删除。点击“确认”后,即可以记录的删除。
    6.1.4 简单的统计功能点击“打开表格” ,可以显示库存表,包括了药品名称、生产批号、有效期和库存数量在内的信息。点击“导出报表”,可以导出库存报表。

    点击统计图表中的选项,可以显示对应的统计图。统计图包括:

    月度利润统计图(折线图)——显示近半年来每月的利润药品销量统计图(饼图)——显示各种药品销量的比重医院销量统计图(饼图)——显示各家医院采购量的比重
    6.1.5 报表导出功能应用程序中可以导出五个基本表和库存报表。报表实现了自动分页的功能。

    6.1.6 备份和备份的导入在帮助页面,可以点击“备份”按钮,可以选择一条路径备份 Access 数 据库文件。备份就是把数据库文件复制到用户选择的路径下。

    点击“导入备份”,则可以将备份文件导入到应用程序中。
    此外,在帮助界面中还可以点击“打开帮助文件”来打开用户手册。
    6.1.7 日志记录功能应用程序中包含一个 Record.log 文件,用来记录应用程序的数据操作日 志。记录的内容包括时间、执行操作的 SQL 语句(仅记录添加、修改和删除操作)和操作的结果(成功或失败)。如某一次操作后记录的内容如下:

    6.2 不足之处由于时间和精力有限,也由于编程能力还有待提高等原因,药品销售管理系统应用程序中还有一些不足。
    一个不足是程序中数据结构的封装做的不足。程序中诸如药品、医院等数据可以封装成类,这样更加符合面向对象程序设计的要求,也可以使程序的逻辑结构更加清晰,但出于编程简单,并没有构造这些类。在日后的修改中,可以进一步将这些数据结构封装成类,另外一个不足是一些功能没有实现。比如用户需要药品进货入库时对年审过期的药品应当予以提示。但在程序中没能够实现此功能。
    以上不足之处应当在日后的维护、升级过程中予以改进。
    3 评论 107 下载 2018-11-28 07:51:44 下载需要12点积分
  • 基于QT实现的可视化地铁换乘查询系统

    1.1 题目上海的地铁交通网络已经基本成型,建成的地铁线十多条,站点上百个,现需建立一个换乘指南打印系统,通过输入起点和终点站,打印出地铁换乘指南,指南内容包括起点站、换乘站、终点站。

    图形化显示地铁网络结构,能动态添加地铁线路和地铁站点
    根据输入起点和终点站,显示地铁换乘指南
    通过图形界面显示乘除路径

    1.2 软件功能功能主要功能包含地铁网络线路的查看,地铁换乘指南查询,动态添加线路站点等。

    线路图查看

    查看上海地铁网络线路图,包括通过键盘、鼠标拖放、放大缩小等简易查看操作查看地铁线路信息,包括线路段、包含站点等查看地铁站的详细信息,包括站点地理坐标、所属线路等
    换乘指南查询

    提供地铁换乘查询,可通过视图方便的查看乘坐路线和换乘路线提供最小出行时间的换乘策略指南提供最小换乘次数的换乘策略指南
    动态添加线路

    动态添加线路,可根据需要新增线路动态添加站点,可根据需要新增站点动态添加连接,可根据需要新增站点连接文本方式简易添加,方便快捷
    帮助

    提供软件使用帮助和说明
    关于

    提供软件制作信息

    上述所有功能采用面向对象的方法通过C++语言程序结合QT框架实现,后面会详细介绍。
    1.3 设计思想
    系统分析,明确功能要求在做应用程序之前都会先明确软件的需求是什么,知道了要实现那些功能才能去细化用什么方法实现,实现的系统架构是什么,初步规划程序的基本流程和核心算法。在认真读题后,明确功能要求后,开始下一步操作。
    MVC模式系统架构MVC模式即为模型-视图-控制器结构模式,这种软件架构模式是一种常用的设计。在本次系统结构中,大致采用此种模式,前后端实现分离,前端主要考虑与用户的交互,例如设计怎样的视图,地铁网络线路图如何展现等,后端主要是数据和算法的处理,将复杂的功能和数据交由后端处理,前后端实现函数接口,从而完成整个软件系统的架构设计。
    设计后端数据结构和接口本次综合应用程序,基本上的数据结构都有涉及,例如网络线路的连接情况需用图结构、算法实现有队列,静态存储有线性表,名字到存储位置有哈希映射,分析好数据结构之后,根据需要将后端系统的接口进行设计,例如最短路径的查询、添加线路站点等均需接口。
    分块实现,逐步求精系统结构和数据结构、算法等相应设计好后,就开始逐步实施了,从前端开始,对每个功能要求的前端界面和交互进行细化,实现前端代码,对每个功能的前端实现后,完善后端接口函数,完成所有前端后,后端也基本同步完成,从而完成整个程序的实现。

    数据结构分析
    本次程序设计站点、线路及其关系的存储表示和相应的算法,所有线路和站点名字是唯一的,表示线路的网络关系时,每个站点可看做一个节点,站点的联系看做一条边,网络结构显然用图结构存储,对每个站点和线路来讲,不会有删除操作,会有添加要求,最频繁的是查询需求,所以用顺序表存放最为合适,将站点和线路名和存储位置的下标值进行哈希关联,可方便访问。
    核心算法流程
    迪杰斯特拉算法求短距离换乘:

    1.4 逻辑结构与物理结构1.4.1 站点
    1.4.2 线路
    1.4.3 后端实现类

    1.5 开发平台开发平台

    计算机型号:惠普Pavilion M4
    计算机内存:4.00GB
    CPU:Intel Core i5 2.6GHz
    操作系统:Windows 10 家庭版
    开发语言:C++(C++11标准以上)
    开发框架:QT
    集成开发环境:Qt Version 5.9.1
    编译器:MinGW 32bit

    运行环境

    可在上述集成环境下运行;
    通过windeployqt.exe及Enigma Virtual Box进行整合压缩为发布为了一个LinkListVisualizer.exe文件,可在普通Windows机型下运行

    1.6 系统的运行结果分析说明1.6.1 调试及开发过程1.6.1.1 调试本次开发采用的是新技术框架Qt,同时也是跨平台的,在Qt Creator中开发调试,Qt中包含了大量的库类,类似于java开发简便,Qt有较好的调试器,但是在本次开发中没有用到,偶尔遇到一些小麻烦或者小bug,我们只需在控制台中输出一些数据便可分析定位错误原因。
    例如:

    输出:

    1.6.1.2 开发有了前面Qt数据结构算法实现设计题的基础,对Qt的了解也由浅入深了,开发也相对熟练。开发时,遵循将后端系统和前端用户交互分开,先思考后端系统的核心数据结构的表示和存储,如何实现题目所要求的相应功能,设计核心算法,然后设计了前端和后端的程序接口,搭建好整个综合应用程序的主体框架,最后是分布实施,将各个模块由大化小,逐步求精,完成整个程序的开发。
    1.6.2 成果分析1.6.2.1 正确性经过多次不同角度的验证,程序表现的十分优秀,与预期没有任何差错。
    换乘查询和最短时间查询
    例如选择“上海汽车城”到“同济大学”,线路如下:

    视图显示线路

    最少换乘查询
    例如选择“上海汽车城”到“同济大学”,线路如下:

    换乘显示

    添加新线路成功

    添加新站点成功

    地图显示新加站点

    添加新连接成功

    地图显示

    换乘检验

    文本添加


    添加后显示

    1.6.2.2 稳定性
    无论是在放大窗口或是小窗口程序都未有任何异常,视图和右侧栏会随窗口大小自动调节
    运行速度非常快,所有操作都是在1s之内响应和得出结果
    所有操作都会及时更新,例如:添加新的线路和站点后,所有用户接口界面中的数据都会进行立马更新,视图也会立马显示新加线路和站点
    经过多次调试和反复测试,程序没有任何异常情况

    1.6.2.3 容错能力本应用程序做了很多针对用户输入和非法操作的容错处理,无论用户怎样操作,很难出现一些非法情况,即使有,也会被程序处理,固有非常好的容错能力,一些样例如下:
    非法操作均有提示

    输入利用控件保证输入的正确性;
    输入的合理性通过输入控件保证,例如输入经纬度时,输入其它非法字符将不会处理,输入范围被确定,其它范围是无法输入的。

    添加或选择只能从指定数据中选择:

    1.7 操作说明按照题目的要求,本应用程序主要包含两大功能,换乘查询和动态添加线路。通过前面介绍的运行环境下进行程序的运行。
    1.7.1 视图查看视图放大

    点击工具栏中放大按钮
    或选择“视图”下“放大”
    或按下快捷键“Ctrl+L”
    或直接在视图区域进行鼠标滚轮放大操作

    可进行视图的放大,方便查看。

    视图缩小

    点击工具栏中缩小按钮
    或选择“视图”下“缩小”
    或按下快捷键“Ctrl+S”
    或直接在视图区域进行鼠标滚轮缩小操作

    可进行视图的缩小,方便查看。

    鼠标操作
    鼠标除能直接放大和缩小视图外,在查看视图信息有重要作用:

    鼠标滚轮直接放大缩小视图
    通过鼠标点击后拖动,可直接进行视图移动
    将鼠标悬停在站点上,会提示站点的详细信息,如悬停在“曹杨路”站上,会有曹杨路地铁站的详细信息


    将鼠标悬停在线路上,会提示线路的详细信息,如悬停在“曹杨路”站和“镇坪路”之间线路上,会有线路的详细信息;

    1.7.2 换乘查询选择起始和目标站点,直接选择即可,如下:

    最小时间换乘查询
    选择“起点站”、“终点站”、“换乘策略”为“所需时间最短”后,点击换乘,可得相应线路。

    换乘后文本栏会有相应线路,视图区有详细路径,通过前面所述视图查看操作可方便查看。

    换乘次数最少查询
    选择“起点站”、“终点站”、“换乘策略”为“换乘次数最少”后,点击换乘,可得相应线路。

    换乘后文本栏会有相应线路换乘方法,视图区绘制出,通过前面所述视图查看操作可方便查看。

    换乘查询后,点击下图按钮,或选择“视图”下“地铁图”,或按下快捷键“Ctrl+M”可重新查看网络线路图。

    1.7.3 动态添加动态添加主要包含添加线路,添加站点,添加连接,文本简易添加,在工具栏中如下:

    添加线路点击工具栏中如下;或选择“工具”下“添加”中“线路”;或快捷键“Ctrl+Shift+L”可添加线路

    上述操作后弹出添加对话框,按相应操作可添加线路。

    添加站点点击工具栏中如下;或选择“工具”下“添加”中“站点”;或快捷键“Ctrl+Shift+S”;可添加站点

    上述操作后弹出添加对话框,按相应操作可添加站点。

    添加连接,点击工具栏中如下;或选择“工具”下“添加”中“连接”;或快捷键“Ctrl+Shift+C”;可添加连接

    上述操作后弹出添加对话框,按相应操作可添加连接。(其中站点可直接输入快捷查找)

    添加连接,点击工具栏中如下;或选择“工具”下“添加”中“文本方式”;或快捷键“Ctrl+Shift+T”;可文本添加

    上述操作后弹出添加框,按提示输入即可。

    1.7.4 工具栏和状态栏选择“查看”,弹出“工具栏”和“状态栏”选项,通过点击其前选择框,可选择是否显示。

    无工具栏,如下:

    状态栏,如下:

    2.1 所做的工作
    学习和运用了Qt5的编程架构和相关知识
    独立完成课程设计中的综合应用题目的所有设计、编程实现、测试等工作
    完成课程设计报告一份

    2.2 总结和收获2.2.1 能力提升完成数据结构课程设计后,感觉自身的自学能力有了很大提升。在课程设计以前,基本上所有的编程知识都是由老师言传身受、一点一滴的对我们进行指导,我们自学的东西较少,自学能力也锻炼的少。但是这次的课程设计的所有工作,都是由我们自己去选择相应的技术学习实现,仅仅掌握基本编程语言的我们通过自学来完成这次课程设计。在这个过程中,大学生尤其是计算机专业的大学生所需要的自学能力得到了必须的锻炼,对以后所有的技术和知识的自学,这将是一个有意义的开端,现在我们已经掌握了如何快速学习一门技术的能力,对以后学习和工作中的所有挑战做好了准备。
    2.2.2 收获虽然课程设计只有看似算法设计和综合应用实现两个题目,但是从布置课程设计题目到完成的整个过程中,不仅仅是学习到了以前未曾接触过的标准用户交互程序,从简陋的控制台程序提升到界面友好、美观、人性化的应用程序,打开了编程的一扇大门,同时也从心态、自学能力、解决未知问题能力等内在的综合实力有了全新的提升。
    具体来说,学习了Qt的编程框架,包括元对象机制、基本控件的掌握、绘图框架、模型编程、文件操作等相关知识;
    学习到了openstreetmap等开源地图数据的获取和提炼等知识,自身技术能力又上了一个台阶。
    在软实力上,打开了用户界面编程的大门,激发自身对编程的热情和后面学习的动力;通过自学实现了课程设计,自身的学习能力得到了有效锻炼;开发的过程中,无论是设计还是编程,都会遇到各种各样的问题,通过独立解决这些疑难杂症,在独立解决问题的能力方面也得到了很大提升;最重要的是,树立不惧所有未知知识、解决疑难问题、接受各种挑战的信心。
    2.2.3 个人体会在学习和实现的过程中体会和领悟还是比较的多,这里挑出感触最深的几点吧。
    第一,做事情一定要找最重要的事情先做,这样做事情才有效率,不拖拉。由于个人比较追求完美,对程序的用户界面和一些细节很是用心,但是这样就好浪费很多时间,效率不高,应该先做好最重要的事情,例如最不可缺少的功能实现,主体实现然后细节修改,而不是本末倒置。
    第二,学到的东西不一定都用的到,所以开发还是有一些功利心较好,用到什么然后去学习相应的知识并用到实处,这样才能学以致用,恰到好处。在一开始的学习中,每天看书看教程,发现过去了几天还是什么都不会,然后边学边做,才领悟到学习方法和要点。
    9 评论 298 下载 2018-11-04 17:49:09 下载需要13点积分
  • 基于JAVA和MYSQL的医院简易挂号管理系统

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



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




    KSBH
    CHAR(6)



    科室编号,数字


    KSMC
    CHAR(10)



    科室名称


    PYZS
    CHAR(8)



    科室名称的拼音字首



    T_BRXX (病人信息表)



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




    BRBH
    CHAR(6)



    病人编号,数字


    BRMC
    CHAR(10)



    病人名称


    DLKL
    CHAR(8)



    登录口令


    YCJE
    DECIMAL(10,2)



    病人预存金额


    DLRQ
    DateTime



    最后一次登录日期及时间



    T_KSYS (科室医生表)



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




    YSBH
    CHAR(6)



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


    KSBH
    CHAR(6)



    所属科室编号,第2索引


    YSMC
    CHAR(10)



    医生名称


    PYZS
    CHAR(4)



    医生名称的拼音字首


    DLKL
    CHAR(8)



    登录口令


    SFZJ
    BOOL



    是否专家


    DLRQ
    DATETIME



    最后一次登录日期及时间



    T_HZXX (号种信息表)



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




    HZBH
    CHAR(6)



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


    HZMC
    CHAR(12)



    号种名称


    PYZS
    CHAR(4)



    号种名称的拼音字首


    KSBH
    CHAR(6)



    号种所属科室,第2索引


    SFZJ
    BOOL



    是否专家号


    GHRS
    INT



    每日限定的挂号人数


    GHFY
    DECIMAL(8,2)



    挂号费



    T_GHXX (挂号信息表)



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




    GHBH
    CHAR(6)



    挂号的顺序编号,数字


    HZBH
    CHAR(6)



    号种编号


    YSBH
    CHAR(6)



    医生编号


    BRBH
    CHAR(6)



    病人编号


    GHRC
    INT



    该号种的挂号人次


    THBZ
    BOOL



    退号标志=true为已退号码


    GHFY
    DECIMAL(8,2)



    病人的实际挂号费用


    RQSJ
    DATETIME



    挂号日期时间



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

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

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

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

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




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




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


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


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




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



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




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


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


    内一科
    000002
    扁鹊
    普通号
    23
    23


    保健科
    000003
    华佗
    专家号
    10
    20



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

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

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

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

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

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



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




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


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


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


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


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


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


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


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


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



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

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



    项目
    版本




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


    JDK (Linux)
    OpenJDK 1.8.0_172, Java 8


    集成开发环境
    IntelliJ IDEA 2018.1.3


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


    JRE (Linux)
    OpenJDK Runtime Environment 1.8.0_172-b11


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


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


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


    数据库 (Windows)
    MariaDB 10.3.7 x64



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

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

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














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

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


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


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

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

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

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

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

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


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

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

    前提条件

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

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

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

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

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

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

    系统功能图如图二所示:

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

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

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

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

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

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

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

    登陆后的页面

    会员注册页面

    会员信息查询页面

    添加影片页面

    查询修改影片页面

    排片页面

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

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

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

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

    1.系统背景随着现代生活水平提高,人类逐渐对精神文化享受重视,追求不同的生活,而其中旅游成为大众的喜爱,于是到年到节的时候需要一种交通 工具来达到目的地,这也成为这系统开发的动力,系统的进步也是应客户的需求而生,为了能够在更早的出售机票,不影响客户的行程,机票售票系统也做出相应的决策,那就是通过无人管理机票预定,然后在快到期的那天,管理员可以通过订单管理来处理客户订单。所以管理员的模块也极其重要,本系统通过后台界面为管理员和数据库与服务器进行交互提供环境。客户只要通过浏览器来进行订票,订票的数据存储在数据里面,然后管理员通过打开后台浏览器来进行信息汇总,然后下单确定发票,整一个信息传递过程是订票信息→订票查询→核实机票。
    2.功能简介
    顾客上网通过浏览器来登入系统首页,系统提供客户注册、机票查询和机票预定功能,当然也包括已预定机票取消
    用户通过窗口选取机票,订单信息保存在数据库上,等待管理员审核
    管理员处理用户信息,确定用户购买
    用户可以根据己购买的字眼可以到代理取票,也可以再登机那天取票
    管理员随时更新航班信息
    客户可以随时登入系统获取航班信息

    3.系统分析系统通过数据库的连接,通过接受客户数据来响应WEB服务器处理,来进行数据管理。整个分为两大部分,第一部分就是客户模块,第二部分就是管理员模块。客户模块包括客户注册、查询、购票、换票、取消机票。管理员模块包括自动处理客户订单、管理员处理订单、机票班次更新、管理系统用户。通过计算机网络来贯穿两大模块,从而实现客户和服务器的交互。
    3.1 功能需求在客户端系统的功能实现上,可以分为以下几个部分:

    用户通过支持web容器的浏览器来进行信息的输入,客户端根据用户输入将数据流输入和数据流的统计。这部分的要求是一个人性化的界面,让用户通过浏览器来进行页面访问。所谓人性化界面包括,浏览功能,预定功能,多种进行人机交互按钮,比如html页面信息和提交、重置等
    把用户信息存储到客户端系统中,经过系统自动审核后存储到数据库当中,已备以后登录查询
    服务器通过数据库出来从客户端传输的信息加以确定,然后返回给客户端,客户端通过信息来提醒用户,用户可以根据信息到柜台拿票

    在服务器端系统的功能实现上,可以分为以下几个部分:

    服务器通过网络接受用户从客户端输入所需要的信息,然后根据用户所需要的信息来判断是否通过WEB容器进行管理,如果纯粹是看票的话,直接调用数据库已经存储好的机票信息通过静态服务反馈用户,如果有购票需要数据通过WEB服务器来进行管理
    在服务器段提供了航班输入功能,管理员根据现实情况来对航班进行管理
    把航班信息通过网络来传递到客户端来与用户进行交互

    3.2 数据流图根据数据流图的特点可以从大到小逐渐深入系统处理过程,图3-1是飞机票售票管理系统的最顶层的数据流图。

    从顶层数据流图,可以得到整个数据流图过程,如图3-2,图3-3。
    系统数据流图

    订票数据流图

    3.3 业务流图飞机票售票管理系统的业务流图如图3-4。

    3.4 数据库表说明在一个B/S系统中数据无疑是非常重要的,数据的安全性、稳定性、可恢复性对使用者起着极其重要的作用。选择一个健全稳定的数据库无疑也是系统实现的首要步骤,本系统选用的是SQL 2005,它能提供大型系统所需的数据库服务。下面将介绍系统的数据库结构。本系统的最主要的功能在与数据库的分配,对不同的用户采用不同的数据库,和不同的查询方式。
    用户表common_user
    CREATE TABLE IF NOT EXISTS `common_user` ( `user_name` varchar(16) NOT NULL, `user_pwd` varchar(32) NOT NULL, `avatar_img` varchar(50) DEFAULT NULL, PRIMARY KEY (`user_name`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表' AUTO_INCREMENT=1 ;
    管理员用户表admin_user
    CREATE TABLE IF NOT EXISTS `admin_user` ( `user` varchar(16) NOT NULL COMMENT '管理员用户名', `pwd` varchar(32) NOT NULL COMMENT '管理员密码', PRIMARY KEY (`user`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='管理员用户表' AUTO_INCREMENT=1 ;
    航班信息表flight
    CREATE TABLE IF NOT EXISTS `flight` ( `f_n` varchar(6) NOT NULL COMMENT '航班号', `f_s_p` varchar(4) NOT NULL COMMENT '航班起点', `f_e_p` varchar(4) NOT NULL COMMENT '航班终点', `f_s_a` varchar(12) NOT NULL COMMENT '航班起飞机场', `f_a_a` varchar(12) NOT NULL COMMENT '航班到达机场', `f_d_t` varchar(5) NOT NULL COMMENT '起飞(departure)时间', `f_a_t` varchar(5) NOT NULL COMMENT '到达时间', `f_f_c_p` int(11) NOT NULL COMMENT '头等舱价格First class price', `f_s_c_p` int(11) NOT NULL COMMENT '商务舱价格', `f_t_c_p` int(11) NOT NULL COMMENT '经济舱价格', PRIMARY KEY (`f_n`), UNIQUE KEY `f_n` (`f_n`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='航班信息' AUTO_INCREMENT=1 ;
    航班订单信息表t_order
    CREATE TABLE IF NOT EXISTS `t_order` ( `id` int(12) NOT NULL AUTO_INCREMENT, `order_user` varchar(16) NOT NULL COMMENT '下单用户', `f_n` varchar(6) NOT NULL COMMENT '航班号', `p_name` varchar(6) NOT NULL COMMENT '乘客姓名', `date` varchar(12) NOT NULL COMMENT '订单日期', `grade` varchar(3) NOT NULL COMMENT '舱别', `p_id` varchar(18) NOT NULL COMMENT '乘客身份证号', `contact` varchar(6) NOT NULL COMMENT '联系人', `c_p` varchar(11) NOT NULL COMMENT '联系人电话', PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci AUTO_INCREMENT=8 ;
    用户留言信息表user_message
    CREATE TABLE IF NOT EXISTS `user_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time` varchar(10) NOT NULL, `user_name` varchar(32) NOT NULL, `message_content` text NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;
    4.程序结构功能结构4.1 用户注册系统对于用户来说只能查询,不能诺命购票,因为不提供真实身份,无法判断用户,购票也极为麻烦,所以只能依靠登录来进行用户识别和购票。
    用户注册的关键代码,主要利用request这个接口的getParameter0方法来接受用户所输入的数据,通过getRemoteAddr()方法来获取用户的ID,每一个以用户都只有唯一—个ID标识,然后通过flag来判断输入是否符合,为真的话就通过request的setAtribute方法来保存信息。
    1. public void doPost(HttpServletRequest req, HttpServletResponse resp) 2. throws ServletException, IOException { 3. String log_name = req.getParameter("log_name"); 4. String log_pwd = req.getParameter("log_pwd"); 5. String reg_name = req.getParameter("reg_name"); 6. String reg_pwd1 = req.getParameter("reg_pwd1"); 7. String reg_pwd2 = req.getParameter("reg_pwd2"); 8. 9. if(log_name!=null&&log_pwd!=null&®_name==null&®_pwd1==null&®_pwd2==null) { 10. //调用登录方法处理登录 11. go_login(log_name, log_pwd, req, resp); 12. 13. } 14. else if(log_name==null&&log_pwd==null&®_name!=null&®_pwd1!=null&®_pwd2!=null&®_pwd1.equals(reg_pwd2)) { 15. //调用注册方法处理注册 16. go_reg(reg_name, reg_pwd1, req, resp); 17. 18. }//为什么不再写一个判断注册时reg_pwd1和reg_pwd2是否相等的语句呢?因为,前端页面中已经用js去做判断了, 19. //如果用户两次输入的密码不一致根本不可能提交数据到此servlet,除非用户限制js或者修改了js,也就是做了非法操作 20. //因此,直接输出提示非法操作的提示信息即可 21. else { 22. 23. resp.setContentType("text/html;charset=utf-8"); 24. PrintWriter out = resp.getWriter(); 25. out.println("请不要尝试非法操作"); 26. /*****测试数据 27. out.println("登录账号:"+log_name+"\n登录密码:"+log_pwd+"\n注册账号:" 28. +reg_name+"\n注册密码1:"+reg_pwd1+"\n注册密码2:"+reg_pwd2); 29. out.print("---log_name==null:"+(log_name==null)); 30. out.print("---log_pwd==null:"+(log_pwd==null)); 31. out.print("---reg_name==null:"+(reg_name==null)); 32. out.print("---reg_pwd1==null:"+(reg_pwd1==null)); 33. out.print("---reg_pwd2==null:"+(reg_pwd2==null)); 34. */ 35. 36. resp.setHeader("refresh", "2;url=index/login_reg.jsp"); 37. //除了登录和注册操作,提交其它数据均为非法操作,不做处理,仅给出提示非法信息 38. } 39. }
    4.2 机票查询在该系统当中,因为运行外面的旅客访问系统并查询系统,以供是否注册为本系统用户,所以两者都可以查询机票航班,旅客通过session来访问,但访问数据随着页面刷新而消除。
    这部的关键步骤也是调用request这个接口的获取信息方法,同样也是调用geParameter()方法就可以把信息获取出来。同时用SQL语言来查询表的信息,附值给定义的属性,可以通过方法来调用数据库。
    1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2. req.setCharacterEncoding("utf-8"); 3. //HttpSession session = req.getSession(); 4. String url=null; 5. /* 6. * if(session.getAttribute("url")!=null) { 7. * url=session.getAttribute("url").toString(); }else { 8. */ 9. url="default/index.jsp"; 10. 11. String departure=null; 12. String destination=null; 13. departure=req.getParameter("departure"); 14. destination=req.getParameter("destination"); 15. String sql=null; 16. if(departure==""&&destination=="") { 17. //如果始发地和目的地都为空则跳转回原页面 18. resp.sendRedirect(url); 19. }else if (departure!=""&&destination=="") { 20. sql="select * from flight where f_s_p='"+departure+"'"; 21. }else if (departure==""&&destination!="") { 22. sql="select * from flight where f_e_p='"+destination+"'"; 23. }else if (departure!=""&&destination!="") { 24. sql="select * from flight where f_s_p='"+departure+"' and f_e_p='"+destination+"'"; 25. } 26. if(departure==""&&destination=="") { 27. //如果都为空,执行不到这一步,所以就不用做处理了,否则,执行else 28. }else { 29. db_conn conn=new db_conn(); 30. //System.out.println(sql); 31. ArrayList<flight> flightlist = new ArrayList<flight>(); 32. flight flight_info=new flight(); 33. 34. ResultSet res=conn.executeQuery(sql); 35. try { 36. while (res.next()) { 37. flight_info.setF_n(res.getString(1)); 38. flight_info.setF_s_a(res.getString(4)); 39. flight_info.setF_a_a(res.getString(5)); 40. flight_info.setF_d_t(res.getString(6)); 41. flight_info.setF_a_t(res.getString(7)); 42. flight_info.setF_f_c_p(res.getString(8)); 43. flight_info.setF_s_c_p(res.getString(9)); 44. flight_info.setF_t_c_p(res.getString(10)); 45. flightlist.add(flight_info); 46. } 47. req.setAttribute("flightlist", flightlist); 48. } catch (SQLException e) { 49. System.out.println("错误信息:"+e); 50. }finally { 51. conn.closeDB(); 52. } 53. //resp.sendRedirect("default/search.jsp"); 54. req.getRequestDispatcher("default/search.jsp").forward(req, resp); 55. } 56. }
    4.3 机票预定为了整个流程更为简单,易用,该系统就只设定只用验证的用户才可以购买飞机票,同时用户可以通过登录查询自己的航班。
    下面代码是预定机票的代码,通过判断机票剩余数和预定机票的关系,确定用户购买成功,成功的话,设置成功信息,失败的设只失败提示信息。
    1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2. //开始获取各种参数 3. req.setCharacterEncoding("utf-8"); 4. String flight_id=req.getParameter("flight_id"); 5. String start_place=req.getParameter("start_place"); 6. String end_place=req.getParameter("end_place"); 7. String start_airport=req.getParameter("start_airport"); 8. String end_airport=req.getParameter("end_airport"); 9. String take_off_time=req.getParameter("take_off_time"); 10. String landing_time=req.getParameter("landing_time"); 11. String first_class_price_str=req.getParameter("first_class_price"); 12. Integer first_class_price=Integer.parseInt(first_class_price_str); 13. String business_class_price_str=req.getParameter("business_class_price"); 14. Integer business_class_price=Integer.parseInt(business_class_price_str); 15. String economy_class_price_str=req.getParameter("economy_class_price"); 16. Integer economy_class_price=Integer.parseInt(economy_class_price_str); 17. //参数获取结束 18. db_conn conn=new db_conn(); 19. String sql="select * from flight where f_n='"+flight_id+"'"; 20. ResultSet res=conn.executeQuery(sql); 21. try { 22. if(res.next()) { 23. resp.setContentType("text/html;charset=utf-8"); 24. PrintWriter out=resp.getWriter(); 25. out.println("您输入的航班号重复了,请选择其他航班号添加,5s后返回"); 26. resp.setHeader("refresh", "5;url=admin/flight_add.jsp"); 27. }else { 28. sql="insert into flight values('"+flight_id+"','"+start_place+"','"+end_place+"','"+start_airport+"','"+end_airport+"','"+take_off_time+"','"+landing_time+"','"+first_class_price+"','"+business_class_price+"','"+economy_class_price+"')"; 29. //Integer res= 30. conn.executeInsert(sql); 31. //System.out.println(res); 32. //System.out.println(sql); 33. resp.sendRedirect("admin/flight_list.jsp"); 34. } 35. } catch (SQLException e) { 36. // TODO Auto-generated catch block 37. e.printStackTrace(); 38. } 39. }
    4.4 订单管理订单管理模块主要是对用户订票进行管理,管理员通过登录进行访问系统后台页面,然后选取订单管理模块,对客户进行处理。通过数据库对用户订单信息组进行管理,通过定义ArrayList()数据组来获得订票所以信息。
    1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2. req.setCharacterEncoding("utf-8"); 3. HttpSession session = req.getSession(); 4. if(session.getAttribute("user_id")!=null) { 5. String user_id=session.getAttribute("user_id").toString(); 6. String f_i=req.getParameter("flight_id"); 7. String passenger_name=req.getParameter("passenger_name"); 8. String date=req.getParameter("date"); 9. String grade=req.getParameter("grade"); 10. String passenger_id=req.getParameter("passenger_id"); 11. String contact=req.getParameter("contact"); 12. String contact_phone=req.getParameter("contact_phone"); 13. 14. 15. /* 16. * System.out.println(f_i); System.out.println(passenger_name); 17. * System.out.println(date); System.out.println(grade); 18. * System.out.println(passenger_id); System.out.println(contact); 19. * System.out.println(contact_phone); 20. */ 21. 22. if(f_i!=""&&passenger_name!=""&&date!=""&&grade!=""&&passenger_id!=""&&contact!=""&&contact_phone!="") { 23. db_conn conn=new db_conn(); 24. String sql="insert into t_order (f_n,order_user,p_name,date,grade,p_id,contact,c_p) values('"+f_i+"','"+user_id+"','"+passenger_name+"','"+date+"','"+grade+"','"+passenger_id+"','"+contact+"','"+contact_phone+"')"; 25. Integer res=conn.executeInsert(sql); 26. System.out.println(res); 27. if(res.equals(1)) { 28. resp.sendRedirect("default/order_list.jsp"); 29. }else { 30. resp.sendRedirect("default/order.jsp"); 31. } 32. 33. }else { 34. resp.sendRedirect("default/order.jsp"); 35. } 36. 37. }else { 38. resp.sendRedirect("default/order.jsp"); 39. } 40. 41. }
    5.操作方法用户访问首页

    用户进行登录

    用户进行注册

    登录或注册成功,进入用户个人首页

    用户修改个人资料

    用户订购航班

    用户查询航班

    用户查看航班订单

    用户查看留言

    管理员登录界面

    管理员添加航班信息

    管理员查看航班列表信息

    管理员查看航班订单

    管理员查看用户列表信息

    管理员查看留言列表

    6.测试结果用户能成功订购航班,并且查看订单



    管理员查看航班并成功添加航班


    7.心得体会通过JavaEE的综合课程设计感触很深,在数据库的课设的基础上,又一次用JSP做相关项目,这不仅又一次加强了自己对JSP这门课程的理解也很好的锻炼了自己的动手能力。这一技术是需要有一定基础、而且动手能力强的学科。书上也强调一点是:要想真正地掌握JSP技术,必须有较好的java语言基础,以及HTML语言方面的知识。
    JSP是一门新技术,他基于Java Servlet以及整个java体系的Web开发技术。通过这个大作业,使我初步掌握和了解了JSP的基本运行原理、各个对象的结构和功能、怎样连接数据库、能自己手动写code 开发一些小网页。并且,自己能够组建一台JSP服务器,而且还了解了安装过程中,所要注意的事项。对于一些简单的小问题,能够自己动手排除。
    7 评论 77 下载 2020-08-04 12:31:18 下载需要12点积分
  • 基于JSP+Servlet+MySQL校园二手交易平台

    摘 要本系统采用JSP/servlet技术,是使用Java编程语言编写的一套校园网二手交易平台软件。系统采用的是最近几年流行的B/S开发模式,以互联网方式运行,服务器端只需要安装本系统,而客户端用户只要可以上网,就可以非常方便快捷的通过浏览器访问系统,浏览和发布二手交易信息,免去了传统的C/S模式下复杂的安装、配置、维护等操作。同时由于使用面向对象的Java语言,所以本系统也具有Java语言的面向对象、与平台无关、安全性高、稳定性高、多线程等特性,以及Java语言对网络编程技术的支持。使得本系统具有很高的使用价值。
    系统开发采用了实现MVC模式的Web应用组件:Struts,实现数据持久化功能的ORM组件:Hibernate,用JSP+HTML+JavaScript进行界面处理,数据库采用比较稳定的MySQL 5.0,并用JDBC进行数据库访问。
    关键词:JSP,Struts,Hibernate,MySQL,二手交易平台
    ABSTRACTThis system is a set of platform software of the campus-wide system secondhand transaction. It adopts the JSP/J2EE technique, and programmed with Java programming language. It also adopts the B/S development mode, which is based on Web and popularize in recent years. It runs in internet ways. Only when the server install this system and the client can visit it, browse and release some secondhand conveniently and speedily when they go on-line. And so it dispenses with such operation as the complicated installing, installment and support in traditional C/S mode. At the same time, it uses the Java language which towards the OOP(object-oriented programming).So the system has the specific property of towarding OOP, irrelevant with the platform ,the Java language’s support to the network programming technique makes the system have high practical value.
    The System using the components of Web applications: Struts to achieve MVC model, using the ORM components: Hibernate to achieve data persistence features, using JSP + HTML + JavaScript to Show page. using Relatively stable database MySQL 5.0, and use JDBC to visit.
    KEY WORDS: JSP,Struts,Hibernate,MySQL,Campus Secondhand Merchandise
    1 系统分析1.1 开发背景随着全世界互联网技术的不断发展,各种基于互联网技术的网络应用不断涌现,网络技术正在不断的深入人们的生活。人们从Internet上获取信息、享受生活、交流感情、网上工作等。Internet正在迅速改变着人们的生活方式。
    经过我国改革开放多年以后,随着与国际社会的接轨,各种资源的商品化已经逐渐成为了我们这个社会的代名词。在这这情势下,校园二手商品资源也已极大的丰富起来,如何解决一类问题,争取最大利用率的交流这类商品的信息便是一个存在中的问题。本毕业设计便是解决该问题的。
    1.2 目的和要求在当前社会上,许多的各种类型的电子商务类网站纷纷建立,可以很大程度上的解决人们信息资源的闭塞以及地域上的限制。作为大学校园,伴随着学生的购买能力的提高和每年的升学和毕业,也存在的许多各种类型的二手商品,由于信息交流的落后,很多只限于于校园公告栏或者请人代为宣传的方式进行交易。这种方式有很多局限性和偶然性,并不能满足二手商品畅通交流的要求。于是一种新的二手商品信息交流的方式出现了,就是基于Web的校园网二手商品交易系统。通过这个系统,可以发现每一个校园网用户都是系统的主人,大家可以非常方便的发布自己的信息,浏览别人的发布的信息,还可以对各种二手商品信息作出横向比较,作出自己的最佳选择。由此可见,该系统只是一个交流二手商品信息的平台,与一般的电子商务类网站又有本质的区别。
    1.3 可行性研究设计这样一个系统,从根本上解决了传统的校园二手信息发布交流方式的弊端,使得校园各种二手商品信息得到了有效的整合,方便了广大用户。且拥有的客户通常只是大学校园网的用户,所有系统规模上来讲不会很大,从经济上来说,由于选择的开发工具和服务器几乎全部为免费的开源软件,并且由于是开发成本较低的基于Web的B/S模式,而非成本费用相对较高的C/S模式,所以从经济上来讲是可行的。从技术上来说,由于是基于Web的,可以相对比较容易面对用户的实际需求而开发。而在现今,各种网络应用的开发已经相当成熟,出现了几大主流的开发语言和工具,都可以非常有效的支持开发这样一个系统。同时作为本系统,也有许多成功的电子商务类网站的经验可以借鉴,所以从技术的角度来说,也是可行的。从运行上来说,由于客户端仅仅只是需要一个浏览器,通过浏览器来登陆系统,而服务器端也只需要一台服务器,服务器要求一个数据库环境和一个网络应用开发的环境,实现起来比较容易,所以从运行上来说是可行的。同时这样一个系统,在系统管理员合法管理和用户的自觉配合下,不会违规进行任何的不法的活动和交易,发布具有危害性和不适宜的信息,也不存在任何非法牟利的行为,在法律上也是可行的。在各种可行性研究保证和基于用户需求要求下,开发系统的方案经过不断论证和假设,确定出了一个最佳方案。
    2 开发技术及开发环境2.1 Java语言简介Java语言是美国Sun公司于1995年推出的一种简单的、面向对象的、分布式的、可解释的、键壮的、安全的、结构的、中立的、可移植的、性能很优异的多线程的、动态的语言。其前身为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术。经过Sun公司的工程师的不懈努力以及全世界无数的编程爱好者的使用,Java终于发展成为今天这样一个集桌面(J2SE)、网络(J2EE)、移动平台(J2ME)应用为一体的功能强大的编程语言。目前Java由于其平台无关及分布式特性,最重要的应用是在网络应用上[1]。
    2.2 J2EE技术介绍J2EE技术是Java网络应用的技术,广泛应用于企业级的应用。它是由一套规范(shannin,2001)和建立在J2SE平台上的应用编程接口(API)组成。J2EE拥有Sun公司提供免费开发工具,称为J2EE软件开发工具包(Software Development Kit,SDK )( http://java.sun.com/j2ee )。J2EE技术是一种Java网络应用技术的组合,包含有远程方法调用(Remote Method Invocation,RMI)、Java消息服务(Java Message Service,JMS)、JavaMail等通信服务,JDBC、Java命名和目录接口(Java naming and Directory Interface,JNDI)、Java连接器体系结构(Java Connector Architecture,JCA)、Java事务API/Java事务服务(JTA/JTS)、XML处理API等通用服务以及Servlet、Java服务器页面(JSP)、企业级JavaBean(EJB)等组件技术。任何J2EE的实现都必须要在其特定容器中实现。
    2.3 Servlet/JSP技术Servlet是JSP技术的基础,JSP本身就是预先被编译成Servlet,然后再运行的,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。 Servlet其实和传统的CGI程序和ISAPI、NSAPI等Web程序开发工具的作用是相同的,在使用Java Servlet以后,用户不必再使用效率低下的CGI方式,也不必使用只能在某个固定Web服务器平台运行的API方式来动态生成Web页面。许多Web服务器都支持Servlet,即使不直接支持Servlet的Web服务器也可以通过附加的应用服务器和模块来支持Servlet。JSP(JavaServer Pages)是一种基于Java的脚本技术。在JSP 的众多优点之中,其中之一是它能将 HTML 编码从 Web 页面的业务逻辑中有效地分离出来。用 JSP 访问可重用的组件,如 Servlet、JavaBean 和基于 Java 的 Web 应用程序。JSP 还支持在 Web 页面中直接嵌入 Java 代码。可用两种方法访问 JSP 文件:浏览器发送 JSP 文件请求、发送至 Servlet 的请求。

    JSP 文件访问 Bean 或其它能将生成的动态内容发送到浏览器的组件
    发送至 Servlet 的请求生成动态内容,并调用 JSP 文件将内容发送到浏览器。该访问使得将内容生成从内容显示中分离出来更为方便

    JSP最大的优点在于其与平台无关性,具有“一次编写,处处运行”的特点。
    2.4 MVC 简介模型-视图-控告器(MVC)是20世纪80年代Smalltalk-80出的一种软件模式,现在已经被广泛使用。

    模型(Model):模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑
    视图(View):视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面
    控制器(Controller):控制器的工作就是根据用户的输入,控制用户界面显示和更新模型对象的状态

    典型的MVC模式所包含的模块、每个模块的功能以及模块之间的关系如图2-1所示[2]:

    MVC模式的出现不仅实现的功能模块和显示模块的分离,同是赛马场还提高了应用系统的可维护性、可扩展性、可移植性和组件的可利用性。
    在早期的程序中,如果不注意对数功能和显示的解耦合,常常估导致程序的复杂及难以维护,像VB,Delphi等RAD程序都有这种问题。甚至现在有C#,Java有时候也会出现把业务逻辑写在显示模块中的现象。
    尽管MVC设计模式很早的提出了,但在Web项目的开发中引入MVC却是步履艰难。主要原因是在早期的Web项目开发中,程序语言和Html的分离一直难以实现,CGI程序以字条串输出的形式动态的生成html内容。直到基于J2EE的JSP Model2问世时才得以改观。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean实现模型的功能。JSP Model2 结构如图2-2所示:

    在Model 2这种框架结构中,Servlet作为控制器负责处理用户的请求以及创建JSP页面中所有要使用的Bean对象,并且还要根据用户的请求来返回到不同的JSP页面。
    在使用Model 2开发框架时,一定要保证在JSP页面中不能包含任何的业务处理逻辑。它只是简单地得到对象或者在Servlet中创建的Bean,然后通过这些动态的内容来生成动态显示的页面。
    Struts 本质上就是在Model 2的基础上实现一个MVC架构,它只有一个中心控制器,采用定制转向的URL并采用Action来处理逻辑。
    2.5 Struts 技术Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Java Servlet和JSP构建Web应用的一项非常有用的技术。首先事件是指从客户端页面(浏览器)由用户操作触发的事件,Struts使用Action来接受浏览器表单提交的事件,这里使用了Command模式,每个继承Action的子类都必须实现一个方法execute。
    struts重要的表单对象是ActionForm,它代表了一种应用,这个对象中至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用Struts就不太可能,当然通过结合JavaScript也是可以转弯实现的。
    Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。
    Struts包含了一组想相互协作的类、Servlet和JSP标记,它们共同组成了一个可重用的MVC模板。通过定义可以看出,Struts是Web应用的开发框架,Struts包含丰富的标记库和独立于该框架工作的实用程序类。图2-3 显示了Struts的基本结构。

    通过图 2¬-3可以看出,采用Struts框架结构的Web应用程序主要由控制器、业务逻辑、模型和视图组成。其中的控制器、模型和视图为Struts框架的主要组成部分,而事务逻辑则是我们需要实现的系统业务逻辑处理部分。
    2.6 Hibernate 技术2.6.1 应用程序的分层体系结构随着计算机应用软件的发展,应用程序逐渐由单层体系结构发展为多层体系结构。其中,三层结构是目前典型的一种应用软件结构。

    表述层:提供与用户交互的界面,如GUI(图形用户界面),web页面等
    业务逻辑层:负责各种业务逻辑,直接访问数据库,提供对业务数据的保存、更新、删除和查询操作
    数据库层:负责存放管理应用的持久性业务数据

    三层结构的特点:所有下层向上层提供调用的接口,具体实现细节对上层透明。层与层之间存在自上而下的依赖关系,即上层会访问下层的API,但下层不依赖于上层。
    分离出的持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API[2]。
    持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
    持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
    三层软件结构如图2-4所示:

    数据库的读写是一个很耗费时间和资源的操作,当大量用户同时直接访问数据库的时候,效率将非常低,如果将数据持久化就不需要每次从数据库读取数据,直接在内存中对数据进行操作,这样就节约了数据库资源,而且加快了系统的反映速度。增加持久化层提高了开发的效率,使软件的体系结构更加清晰,在代码编写和系统维护方面变得更容易。特别是在大型的应用里边,会更有利。同时,持久化层作为单独的一层,人们可以为这一层独立的开发一个软件包,让其实现将各种应用数据的持久化,并为上层提供服务。从而使得各个企业里做应用开发的开发人员,不必再来做数据持久化的底层实现工作,而是可以直接调用持久化层提供的API。
    2.6.2 Hibernate的应用及API简介Hibernate是一种Java语言下的对象关系映射解决方案。它是一种自由、开源的软件。它用来把对象模型表示的对象映射到基于SQL的关系模型结构中去,为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。
    Hibernate不仅管理Java类到数据库表的映射(包括从Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
    Hibernate对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,它既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。最具革命意义的是,Hibernate可以在应用EJB(EnterpriseJavaBeans是Java应用于企业计算的框架)的J2EE架构中取代CMP,完成数据持久化的重任。
    Hibernate使用 Java 反射机制 而不是字节码增强程序来实现透明性。Hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。Hibernate支持各种关系数据库,从一对一到多对多的各种复杂关系。Hibernate核心接口如图2-5所示:

    2.7 开发环境及环境配置2.7.1 Java/JSP系统环境开发及测试的系统环境,我选择了Microsoft Windows Advanced Server 2000。由于其本身就是为服务器版的,适合用于搭设成为服务器端。要开发JSP,首先必须要求有Java环境,我选择了JavaTM Platform, Standard Edition 6 Development Kit。
    作为JSP的容器,选择了目前非常流行的Tomcat 6.0。而IDE工具则选择了Eclipse(MyEclips)。
    2.7.2 JSP环境的安装和环境变量的设置
    首先安装JDK,安装Tomcat
    接下来配置环境变量:右键点击“我的电脑”,在弹出的菜单中点“属性”,在系统特性里选择“高级”,找到“环境变量”,点击进入后,“系统变量”就是我们需要设置的地方

    新建变量CATALINA_HOME,变量值为:D:\apache-tomcat-6.0.18新建JAVA_HOME变量,然后在变量值中输入以下内容:C:\Program Files\Java\jdk1.6.0_12编辑path变量,在原有的变量值后添加JDK的BIN目录:%JAVA_HOME%\bin;%CATALINA_HOME%\BIN

    2.7.3 Eclipse开发工具Eclipse平台体系结构主要由5部分组成,分别是平台运行库、工作区、工作台、团队支持和帮助。
    在运行时内核是整个架构的核心,其他部件都是以插件方式来实现的。Eclipse采用动态加载机制,即只有需要的才加载,这样可以降低启动时间,提高资源使用效率。
    工作空间插件即所谓的工作区,主要负责管理用户资源,例如用户创建项目的管理、文件变更等,并负责通知其他插件关于资源变更的信息。
    工作台插件是Eclipse 提供的用户界面。它使用标准窗口工具包(SWT)和一个更高级的API(JFace)构建的。SWT是Java的Swing/AWT的非标准替代者,JFace则以SWT为基础,但更易于使用。
    团队支持插件负责提供版本控制和配置管理支持。它允许用户根据需要添加视图,并与允许用户使用的任何版本控制系统交互。
    帮助插件允许以HTML文件形式添加文档,并提供了一个附加的导航结构以便用户使用帮助功能搜索相关信息。
    2.7.4 Tomcat服务器Tomcat是Sun的JSWDK(Java Server Web Development Kit)中Servlet的运行环境(servlet容器)。Tomcat是Apache Jakarta软件组织的一个子项目,Tomcat是一个JSP/Servlet容器,它是在SUN公司的JSWDK(Java Server Web Development Kit)基础上发展起来的一个JSP和Servlet规范的标准实现,使用Tomcat可以体验JSP和Servlet的最新规范。经过多年的发展,Tomcat不仅是JSP和Servlet规范的标准实现,而且具备了很多商业Java Servlet容器的特性,并被一些企业用于商业用途[4]。
    Tomcat目录如下:
    Tomcat_home|---bin Tomcat:存放启动和关闭tomcat脚本|---conf Tomcat:存放不同的配置文件(server.xml和web.xml)|---doc:存放Tomcat文档|---lib/japser/common:存放Tomcat运行需要的库文件(JARS)|---logs:存放Tomcat执行时的LOG文件|---src:存放Tomcat的源代码|---webapps:Tomcat的主要Web发布目录(包括应用程序示例)|---work:存放jsp编译后产生的class文件2.8 数据库开发工具选择及配置目前数据库的开发工具,大、中、小型的有很多,比如Oracle、MS SQL Server2000、DB2、MySQL、Access等等许多关系数据库,在系统开发初期,我用SQL server2000 进行数据库连接,因为可以于Windows 2000服务器系统很好的兼容,并且对大并发访问有很好支持,功能强大且使用简单,然而在后期的开发中,由于经常更换设计环境,而且自己用到Hibernate,对软件有一定要求,每次系统移植都要花很多时间配置环境,所以又更换了移植性很好的MySQL做数据库。
    MySQL是一个小型关系型数据库管理系统,被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
    与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本[3]。
    在本系统中,对MySQL的配置最重要是数据库字符编码设置,因为数据库的录入的大多是中文字符,默认编码为GBK会减少许多操作,配置如下:
    default-character-set=gbk3 系统需求分析及设计3.1 系统需求分析3.1.1 系统功能需求本系统主要面向于大学校园网用户,依托校园网提供给这些用户一个发布和交流二手商品信息的平台。在大学校园里,存在着很多的二手商品,但是由于信息资源的不流通以及传统二手商品信息交流方式的笨拙,导致了很多仍然具有一定价值或者具有非常价值的二手商品的囤积,乃至被当作废弃物处理。现在通过校园网进入到本系统,可以方便快捷的发布和交流任何二手商品的信息,并且可以通过留言方式进行深一步的交流。由于每个大学的校园网都基本篇布校园的每一个地方,因此,只要宣传得当,理论上来说,每一个人都可以让他所发布的信息让全校所了解,争取到了信息资源的最大化利用。
    系统完成的主要功能有:用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能,具体业务功能包括如下:

    用户注册:学生可利用自已学号进行注册,注册实现实名制
    用户登录:只有登录用户才能进行信息发布。管理员登录后可以进行系统管理
    发布信息:普通用户和管理员登录后都可以发布信息
    修改信息:普通用户可以修改自己发布的信息,管理员可以修改所有信息
    删除信息:普通用户可以删除自己发布的信息,管理员可以删除所有信息
    浏览信息:游客、普通用户和管理员可以浏览所有发布的信息
    搜索信息:游客、普通用户和管理员可以用关键字搜索所有发布的信息。普通用户可以搜索自己发布的所有信息
    发表留言:普通用户和管理员登录后都可以对发布信息进行留言
    查看留言:游客、普通用户和管理员都可以查看发布信息的留言
    删除留言:管理员可以删除留言
    添加二手指南:管理员可以添加二手指南
    查看二手指南:游客、普通用户和管理员都可以查看二手指南
    修改二手指南:管理员可以修改二手指南
    删除二手指南:管理员可以删除二手指南

    3.1.2 系统界面要求由于系统主要面向大学生,系统界面要求不能过古板,要能体现大学校园的自由,创新。系统界面设计应体现人性化,界面清晰简捷,操作简单流畅,提高管理效果。不需要任何专业培训,不需要配备专门的电脑操作人员,无电脑知识一样运用自如。关键在于系统的框架式设计简单明晰。
    3.2 概要设计3.2.1 系统体系结构设计本系统是一个典型的三层应用——浏览器通过Web服务器实现对数据库的各种操作。图3-1 展示了整个系统的体系结构。

    在这个系统体系结构中,并不是直接JDBC来访问数据库和进行数据库中相关表的操作,而是通过一系列持久层的Java对象来完成数据库的操作。
    映射文件相当于持久层的Java对象和数据库的表之间的桥梁,它所描述的是这两都之间的对应关系。而且,持久层的Java对象和数据库表之间的关系也是一一对应的。
    3.2.2 系统功能模块设计系统主要设计了用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能模块。

    用户设置功能:主要是用户注册必须填写所要求的个人资料,完成个人资料登入
    发布信息功能:主要是为已注册用户的服务,登陆的用户可以即时发布自己的二手商品信息,立刻就能浏览到。这是本系统的主要功能
    信息管理功能:是帮助已发表信息的的用户管理自身发布的二手商品信息的同时也管理短消息信息。此项功能也主要是服务于注册用户
    搜索信息功能:是面向所有登陆到本系统的人员的,采用模糊查询的方法,遍历所有二手商品信息,搜索出浏览者感兴趣的内容
    留言功能:是对某一二手商品信息进行留言,还可以查看该信息的其他留言
    系统管理功能:是系统管理员对系统所有信息资源进行统一管理的一个模块

    系统功能结构如图3-2所示:

    3.2.3 功能设计的目标与原则本二手交易平台的主要目的是服务于学生,方便学生进行网上交易。其原则是做到界面友好,操作简单且可靠。
    具体做到:

    架构清晰,界面友好美观,简捷,实用性强
    动态式信息发布:为充分展现网站的时实性,二手交易平台采用动态网页技术实现内容发布
    提供多种信息搜索及查看方式。全面自动化管理
    全面整合买家和卖家之间的信息,提供一个交流沟通的平台
    可用性,目标系统功能齐全,能够完全满足业务需求

    3.3 数据库设计3.3.1 数据库需求分析对于数据库的需求主要体现在对数据库的提交信息、更新信息、删除信息、保存信息等。这些信息的存在都取决于各个功能模块的对信息的需求。通过对功能模块的具体操作,实现对数据库中信息的输入和输出。所以,针对各个功能模块的需求,设计如下的数据表和数据结构:

    Maste 类表:用于实现平台用户我实名制及平台基本信息

    学院信息:包括学院编号,学院名,描述等班级信息:包括班级编号,班级名,学院编号,描述等学生信息:包括学号,姓名,班级编号,学院编号等类型信息:包括类型编号,类型名,类型描述等交易地区信息:包括地区编号,地区名,地区描述等
    Temp 类表:用于实现平台各模块

    用户信息:包括用户编号、用户名、密码、学号,及用户的其它相关信息等商品信息:商品编号、信息标题、信息内容,发布信息的用户,信息相关内容等商品留言信息:包括留言编号、商品信息编号、留言内容等

    3.3.2 数据库概念结构设计概念模型是对于信息世界的建模,是现实世界到信息世界的抽象,是数据库设计人员和用户之间进行交流的语言。它具有简洁明晰、易于理解和修改、便于向各种数据模型转换,从而生成相应的逻辑模式。
    概念设计的目的是要确定系统的概念模型,因为概念模型是数据库系统的核心和基础,所以概念设计是数据库设计的关键。
    3.3.3 数据库逻辑表设计数据库的概念结构设计完毕后,现在可以将上面的数据库概念结构转化为某种数据库所支持的实际数据模型,也就是数据库的逻辑结构。
    在本次设计开发中,考虑到系统的规模,以及系统的功能、稳定性、性能和效率等方面,特别的对系统可移植性的考虑,我使用MySQL数据库系统。
    依照3.3.1中的数据库需求分析设计各数据库表,各个表中都用ID做主键,困为用到Hibernate自动生成主键,所以这里主键ID类型设置为VARCHAR(50)。其它字段也都有各自的约束条件。
    各个表的具体逻辑结构如下:
    学院表 (m_dep)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    学院编号


    DEP_NAME
    VARCHAR(10)
    UNIQUE
    学院名


    DEP_DESC
    varchar(100)
    NOT NULL
    学院描述



    班级表(m_class)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    班级编号


    DEP_ID
    VARCHAR(50)
    Foreign Key
    学院编号


    CLASS_NAME
    VARCHAR(10)
    UNIQUE
    班级名


    CLASS_DESC
    varchar(100)
    NOT NULL
    班级描述



    学生表(m_student)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(12)
    Primary Key
    学号


    CLASS_ID
    VARCHAR(50)
    Foreign Key
    班级编号


    STU_NAME
    VARCHAR(10)
    UNIQUE
    学生姓名


    sex
    TINYINT(3)
    NOT NULL
    学生性别



    交易地区表(m_area)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    地区编号


    AREA_NAME
    VARCHAR(10)
    UNIQUE
    地区名


    AREA_DESC
    varchar(100)
    NOT NULL
    地区描述



    信息类型表(m_type)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    类型编号


    TYPE_NAME
    VARCHAR(10)
    UNIQUE
    类型名


    TYPE_DESC
    varchar(100)
    NOT NULL
    类型描述



    二手指南表(t_article)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    指南编号


    TITLE
    VARCHAR(10)
    UNIQUE
    指南标题


    CONTENT
    varchar(8000)
    NOT NULL
    指南内容



    用户表(t_user)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    用户编号


    USERNAME
    VARCHAR(10)
    UNIQUE
    用户名


    PASSWORD
    varchar(100)
    NOT NULL
    用户密码


    STU_ID
    VARCHAR(50)
    Foreign Key
    学号


    BIRTHDAY
    DATETIME
    NOT NULL
    生日


    PHOTO
    SMALLINT(5)
    NOT NULL
    照片


    QUESTION
    VARCHAR(100)
    NOT NULL
    注册问题


    ANSWER
    VARCHAR(100)
    NOT NULL
    注册答案


    EMAIL
    VARCHAR(50)
    —-
    EMAIL


    QQ
    VARCHAR(20)
    —-
    QQ


    CREATE_TIME
    DATETIME
    NOT NULL
    注册时间


    STATUS
    TINYINT(3)
    NOT NULL
    状态


    ROLE
    TINYINT(3)
    NOT NULL
    权限



    信息表(t_message)



    字段名
    数据类型
    约束条件
    说明




    ID
    VARCHAR(50)
    Primary Key
    信息编号


    MESSAGE_TITLE
    VARCHAR(50)
    UNIQUE
    信息标题


    TYPE_ID
    VARCHAR(50)
    Foreign Key
    信息类型


    AREA_ID
    VARCHAR(50)
    Foreign Key
    交易地区


    OLD_VALUE
    SMALLINT(5)
    NOT NULL
    新旧值


    PRICE
    DECIMAL(10,0)
    NOT NULL
    商品价格


    R_USER
    VARCHAR(10)
    NOT NULL
    联系人


    R_PHONE
    VARCHAR(50)
    NOT NULL
    联系电话


    R_EMAIL
    VARCHAR(50)
    —-
    EMAIL


    MESSAGE_DESC
    VARCHAR(200)
    NOT NULL
    信息详情


    MESSAGE_PHOTO
    VARCHAR(50)
    —-
    信息图片


    CREATE_TIME
    DATETIME
    NOT NULL
    新增日期


    FLAG
    TINYINT(3)
    NOT NULL
    信息标志


    TOP_VALUE
    INTEGER
    NOT NULL
    人气值


    CREATE_USER_ID
    VARCHAR(50)
    Foreign Key
    发布用户



    3.3.4 数据库逻辑结构设计对于maste表,它们都是做为别的表的外键而存在的。本系统数据库逻辑可分为两部分,一部分实现用户的实名制:实名制需要校方学生纪录,而学生又有以学院、班级,每个用户对应一个学生,其逻辑模型如图3-3所示:

    第二部分实现商品信息关联,每个商品都有商品类型、交易地区和发布用户,每个商品有多个留言,而每个留言又有发表用户,其逻辑模型如图3-4所示:

    3.4 数据库访问设计数据库访问是指对数据库进行操作,本系统使用Hibernate完成数据库表与java对象映射,并用HibernateSessionFactory进行数据库访问。
    3.4.1 数据库表模型设计所有数据库表中都有编号做为主键,在java类库中用BaseModel.java完成模型对象的基类。在BaseModel类中,属性id 做为所有表的主键,equals(Object o)是重写的父类方法,只要字符串内容相同,对象就相同;toString用于规范对象的打印格式。
    本系统包含的业务模型有:交易地区(Area),商品类型(Type),二手指南(Article),学院(Department),班级(Clazz),学生(Student),用户(User),信息(Message),留言(Comment),它们都对应于数据库中某张表。这些Java模型对象的数据类型与数据库表相对应,并都继承BaseModel,所有Model类的UMR如图3-5所示:

    3.4.2 Hibernate数据库访问配置Hibernate配置文件主要用于配置hibernate连接数据库的参数以及其它一些hibernate在运行时需要使用的各种参数的值。配置如图3-6所示:

    Hibernate是你的应用程序里连接数据库的那层,所以它需要连接用的信息。连接(connection)是通过一个也是由我们配置的JDBC连接池(connection pool)来完成的。Hibernate的发布包里包含了许多开源的(open source)连接池,但在我们例子中使用Hibernate内置的连接池。
    3.4.3 定义映射文件映射文件用于描述持久层对象以及它们的属性和数据库中的表和表的字段之间的对应关系,完成java对象和数据库中表的数据的相互转化,这里只介绍用户对象的映射配置。
    文件清单如下:
    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.lee.market.model"> <class name="User" table="T_USER" schema="dbo" catalog="market_1"> <id name="id" type="string"> <column name="ID" length="50" /> <generator class="uuid.hex" /> </id> <many-to-one name="MStudent" class="Student" fetch="select"> <column name="STU_ID" length="50" not-null="true" /> </many-to-one> <property name="username" type="string"> <column name="USERNAME" length="50" not-null="true" /> </property> <property name="password" type="java.lang.String"> <column name="password" length="50" not-null="true" /> </property> <property name="birthday" type="timestamp"> <column name="BIRTHDAY" length="23" not-null="true" /> </property> <property name="photo" type="integer"> <column name="PHOTO" not-null="true" /> </property> <property name="question" type="string"> <column name="QUESTION" length="50" not-null="true" /> </property> <property name="answer" type="string"> <column name="ANSWER" length="50" not-null="true" /> </property> <property name="telephone" type="string"> <column name="TELEPHONE" length="50" /> </property> <property name="email" type="string"> <column name="EMAIL" length="50" /> </property> <property name="qq" type="string"> <column name="QQ" length="50" /> </property> <property name="create_time" type="timestamp"> <column name="CREATE_TIME" length="23" not-null="true" /> </property> <property name="status" type="integer"> <column name="STATUS" not-null="true" /> </property> <property name="role" type="integer"> <column name="ROLE" not-null="true" /> </property> <set name="TMessages" inverse="true"> <key> <column name="CREATE_USER_ID" length="50" not-null="true" /> </key> <one-to-many class="Message" /> </set> <set name="TComments" inverse="true"> <key> <column name="USER_ID" length="50" not-null="true" /> </key> <one-to-many class="Comment" /> </set> </class></hibernate-mapping>
    在hibernate-mapping标签(tag)之间, 含有一个class元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到SQL数据库里的表。id元素是标识符属性的声明,name=”id” 声明了Java属性的名字 - Hibernate会使用getId()和setId()来访问它。 column属性则告诉Hibernate, 我们使用market_1表的哪个字段作为主键。嵌套的generator元素指定了标识符生成策略,在这里我们指定uuid.hex。
    3.4.4 Hibernate Session工厂该类主要用于方便地提供Hibernate的初始化以及Hibernate的sessioon和事务的处理,HibernateSessionFactory类的结构如图3-7所示:

    在此简要介绍一下使用Hibernate进行数据库操作的过程,使用Hibernate进行持久化操作主要需要以下步骤:

    创建Configuration对象:进行配置文件的装载操作,读取所有的映射文件并进行解析
    创建 SessionFactory对象:通过创建好的Configuration对象可以创建一个SessionFactory对象的实例,它是产生Session对象的工厂,它在整个应用中是唯一的
    创建Session对象实例:Session对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,这个连接可以进行数据库的其它操作
    开始一个事务
    进行持久化操作:读取或保存java对象
    结束事务:在操作完成后要进行显示的结束事务的操作
    关闭Session:类似于释放数据库的连接

    3.4.5 定义和实现Hibernate DAO在完域模型的定义和配置工作后,要完成HibernateDAO的定义和实现。
    首先定义DAO接口,使用的接口的编程方法,可以在方法调用者和方法具体实现之间建立一个屏障,即它们不存在任何的关联,一边的修改不会影响另一边的正确运行。在本系统中,DAO接口(IBaseHibernateDAO)只有一个方法:返回Session对象。
    然后实现DAO接口,每个方法的实现,这里只介绍UserDAO、MessageDAO、CommentDAO这三个类的关系如图3-8所示:

    3.4.6 Hibernate Filter的实现在Web应用中,通过Filter来进行Hibernate事务管理并不仅仅出于处理方便,在本系统中,采用了面向对象的设计方法,每个Message对象都持有一个User对象的实例来表示这个二手信息的发布者,这与传统的结构化开发有很在区别。在结构化的开发方法中,Message对象中的属性应该是与信息存储表中的字段一一对应的,那么它就应该创建一个持有用户ID的属性来表示信息的的发布者。而在该系统中,我使用User类作为Message的属性。在面向对象的方法中,只需取得页面中需要显示的Message对象就可以了。
    通过上面获取对象的不同方法可以看出,采用面向对象的方法可以在很大程度上减少进行持久化操作所要进行的编码工作。而对于Message对象所持有的User对象则会由持久层(本系统用的是Hibernate)自动去完成相应的读取操作。
    在本系统中,通过Filter的机制,将一个用户请求中所做的所有持久化操作看成一个事务。当然,如果某个业务确实需要将这个请求分解成多个事务,那么也就可以在业务实现的方法中自选进行事务的提交可者回滚操作。也就是说,整个用户请求都是在一个Session中完成的,在响应用户请求之前会自动开始一个Session和事务。在处理完用户请求直到页面输出完毕后才提交当前的事务和关闭用户的Session。这样,就可以确保应用随时都可以通过Hibernate来获取相关对象的信息。
    另外在本系统的Filter中还进行了字符编码的控制,在每次用户请求中都将字符转化为GBK,以确保信息的正确保存。本系统用到的Filter关键代码如下:
    字符编码转化
    request.setCharacterEncoding("GBK");
    Hibernate事务处理
    session.beginTransaction();chain.doFilter(request, response);session.getTransaction().commit();
    完成Filter类后,要对该Filter进行配置和部署,Filter的配置和部署工作是在WEB-INF目录下的Web.xml中配置的,相关配置代码如下:
    <filter> <filter-name>hibernateFilter</filter-name> <filter-class>cn.lee.market.filter.HibernateFilter</filter-class></filter><filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
    4 系统功能模块的实现在本章内,将为大家详细说明系统功能模块的具体实现,系统主要使用了JSP、Javascript、Java、HTML以及DHTML语言等综合处理页面信息的显示和各个功能模块功能的设计,以及通过Hibernate对数据库的操作,完成了一个动态的校园二手交易平台。
    4.1 系统主页设计4.1.1 主页显示设计系统主页是面向平台的所有访问者,注册用户和非注册用户都可以进入到系统主页面,查看相关的二手信息及二手指南。主页面由平台Logo、登录框、搜索框和各种类型的最新二手信息列表组成。主页面效果如图4-1所示:

    4.1.2 主页后台设计系统主页面显示了最新各种类型的二手信息和二手信息top排行,这些都在进入主页前放入request,还有搜索条件中的分类下拉列表和交易地区下拉列表需要放入session中供以后使用。这些操作在IndexAction中实现,相关代码如下:
    查询各种类型的二手信息,放入request,供主页面显示:
    List typeList = tDao.findAllType();for(Type type:(List<Type>)typeList){ List<Message> typeMessage = (List<Message>)mDao.getTypeMessages(type.getId()); messageMap.put(type.getId(), typeMessage); typeMap.put(type.getId(), type.getType_desc());}request.setAttribute("messageMap", messageMap);
    查询所有分类,所有交易地区放入session,用于搜索框下拉列表及其它操作:
    request.getSession().setAttribute("typeMap", typeMap);List areaList = aDao.findAllArea();for(Area area:(List<Area>)areaList){ areaMap.put(area.getId(), area.getArea_desc());}request.getSession().setAttribute("areaMap", areaMap);
    按人气将信息排序后放入TopMessageList,供主页面显示:
    List<Message> TopMessageList = mDao.findByTop_value2();request.getSession().setAttribute("TopMessageList", TopMessageList);
    4.2 系统登录功能设计由于游客、普通用户、管理员限不同,系统实现登录功能,为普通用户、管理员的特殊操作提供接口。
    登录流程简单描述为输入->验证->返回主页。本系统为登录表单设计了ActionForm,在Action只须对接收到的ActionForm进行验证,验证其是否为用户、用户权限等,并根据不同验证结果进行相应操作。登录Struts配置如图4-2所示:

    登录成功后,普通用户、管理员都将在主页面显示用户的基本信息,并提供信息管进,发布信息,修改个人资料和用户注销的链接。登录成功效果图如图4-3所示:

    4.3 系统搜索功能设计系统搜索时也用ActionForm(searchConditionForm)接收搜索表单,在Action中用Dao对象操作ActionFromr返回搜索结果,搜索Struts配置如图4-4所示:

    Dao对searchConditionForm的操作代码如下:
    public List findBySearchCondition(SearchConditionForm searchConditionForm) { String keyword = searchConditionForm.getKeyword(); String typeid = searchConditionForm.getTypeid(); int flag = searchConditionForm.getFlag(); String areaid = searchConditionForm.getAreaid(); try { String queryString = "from Message where (message_title like '%" + keyword +"%'" +"or message_desc like '%" + keyword +"%')"; if(typeid!=null&&!"allType".equals(typeid)) queryString += " and MType = '"+ typeid +"'"; if(flag==1||flag==0) queryString += " and flag = "+ flag +""; if(areaid!=null&&!"allArea".endsWith(areaid)) queryString += " and MArea = '"+ areaid +"'"; queryString += " order by id desc"; System.out.println(queryString); Query queryObject = getSession().createQuery(queryString); return (List)queryObject.list(); } catch (RuntimeException re) { log.error("get failed", re); throw re; }}
    搜索结果的显示实现了分页显示功能,搜索效果如图4-5所示:

    在该系统中,页面中所有信息列表的显示均使用JSTL标签进行处理,这里仅对搜索结果显示的代码作一下分析,关键代码如下:
    <c:forEach items="${searchMessageList }" var="message" begin="${first }"end="${last }"><TR align=middle><TD> <c:if test="${message.flag == 0 }">[出售]</c:if> <c:if test="${message.flag == 1 }">[求购]</c:if></TD><TD style="WIDTH: 40%"><A href="${ctx}/message.do?messageid=${message.id }">${fn:substring(message.message_title,0,20) }${fn:length(message.message_title) le 20?"":"..."}</a></TD><TD>${message.MArea.area_desc} </TD> <TD><fmt:formatDate value="${message.create_time}" type="date" dateStyle="medium"/></TD> <TD> ${message.old_value }成新</TD><TD>${message.price }RMB</TD><TD>${message.top_value }</TD></TR></c:forEach>
    说明:searchMessageList是从Action中返回的信息列表,在此用C标签进行循环打印,字段值的输出使用EL表达式,使页面代码简洁,容易理解,修改[4]。
    4.4 用户注册功能设计本系统用户注册实现了学生实名制,注册前要先同意平台协议,然后在注册输入界面输入相关信息,系统收集到用户注册人信息,验证通过后注册成功,进入注册成功页面。
    4.4.1 用户注册页面设计注册页面包括表单和表单验证。注册页面所涉及的表单元素如表4-1所示:



    名称
    元素类型
    重要属性
    含义




    Username
    Text
    maxLength=16 onblur=”checkUsernameFormat(this)”
    平台帐号


    stu_id
    Text
    maxLength=12
    学号


    Birthday
    Text
    onclick=”GetCalendar(this,’birthday’);” src=”../images/calendar/calendar.gif”
    生日


    email
    Text
    前台验证: isEmail(this)
    E-mail


    password
    password
    maxLength=20
    密码


    repassword
    password
    maxLength=20
    确认密码


    question
    Text
    id=txtTipQuestion
    密码问题


    answer
    Text
    id=txtTipAnswer
    密码答案



    注册表单提交前使用javascript脚本进行验证,核心代码如下:
    if(!checkUsernameFormat(f.username)) return false; if(!isNumeric(f.stu_id,'学号格式不正确!')) return false; if(!isEmail(f.email)) return false; if(f.repassword.value != f.password.value){ alert('两次输入的密码不相同!'); f.repassword.value=""; f.password.value=""; f.password.focus(); return false; } if(!isNotEmpty(f.question, '密码查询问题不能为空!')) return false; if(!isNotEmpty(f.answer, '密码查询答案不能为空!')) return false; return true;
    注册验证效果如图4-6所示:

    4.4.2 用户注册后台设计用户注册后台操作在Action中进行,后台实现了将用户信息插入数据库并将新注册用户以及用户权限放入session。用户注册Struts配置如图4-7所示:

    4.5 发布、修改信息设计信息的发布和修改是该系统的最主要功能,只有注册用户或管理员才有权限进行信息发布,普通用户只能修改自己发布的信息,管理员可以修改所有信息。
    信息的发布和修改共用了同一个页面,页面中包含表单和表单验证。表单通过ActionForm接收,在Action中对表单的操作根据信息编号参数值判断执行发布或修改。
    信息发布页面效果如图4-8:

    信息表单元素如表4-2所示:



    名称
    元素类型
    重要属性
    含义




    postForm
    from
    action=”post.do” method=”post” onsubmit=”return(post_check(this))”
    表单


    messageid
    hidden
    —-
    信息编号


    message_title
    Text
    maxLength=30
    信息标题


    old_value
    DropDown
    onclick=”GetCalendar(this,’birthday’);” src=”../images/calendar/calendar.gif”
    新旧程度


    flag
    DropDown
    —-
    交易类型


    typeid
    DropDown
    遍历${typeMap } value=”${type.key }”
    所属类别


    areaid
    DropDown
    遍历${areaMap } value=” ${area.key }”
    交易地区


    price
    Text
    maxLength=10
    物品价格


    r_user
    Text
    maxLength=10
    联系人


    r_email
    Text
    maxLength=20
    E-mail


    r_phone
    TEXTAREA
    —-
    联系方式


    message_desc
    TEXTAREA
    —-
    物品简介


    submit
    submit
    value=”提交”
    提交按钮


    reset
    reset
    value=”重置”
    重置按钮



    信息发布、修改的具体操作在Action中进行,Action中首先验证是否为用户,非用户则弹出消息返回主页,反之执行相应操作。信息发布、修改Struts配置如图4-9所示:

    4.6 信息管理设计信息管理分为普通用户个人信息管理和管理员会员信息管理。管理页面显示了要管理信息的重要信息,并提供链接可进入详细信息页面。每个信息都有修改、删除按钮。这里只介绍个人信息管理页面,页面效果如图4-10所示:

    4.7 信息留言设计登录用户可以对信息进行留言,留言会立刻显示在信息详细下面。留言输入界面显示有登录用户的相关信息(用户名和邮箱),这些信息会连同留言表单内容传入Action中进行插入操作。留言界面效果如图4-11所示:

    留言成功后返回到信息详细页,信息最后显示该信息的所有留言,效果如图4-12所示:

    4.8 二手指南设计二手指南是平台为用户提供的二手帮助指南,游客和普通用户都只能对其进行浏览操作。二手指南的增加,修改,删除都是管理员来操作。在该模块,因为二手指南只有标题和内容两个字段,所有没有必要用ActionForm来接收表单,操作仍然写在Action中。
    5 总结本次毕业设计工作在最初选题过后,我选择了JSP,它是真正的跨平台,实现动态功能的一种技术。JSP+Servlet+JavaBeans/EJB,能够让人非常简单方便地构建安全高速的WEB应用。同时可以通过JDBC(Java DataBase Comnectivity)接口,访问几乎所有数据库,并且可以使用数据库连接池技术,有效控制连接数,确保系统的正常运转。从发展的眼光来看,JSP的前途一片光明。在数据库的选择上,我也使用近些年发展很好的MySQL,充分实现系统的跨平台性。
    在这个系统开发过程中,我对Hibernate的学习从零开始,作过许多小测试。每次的新发现我都运用到这个系统中,在运用中,对它的掌握也更加熟练。还是系统运用Struts框架,在该系统的开发过程中,参阅了很多相关的书籍,特别的Apache官方网站的帮助文档,不仅解决了很多问题,也提高了自己的英文水平。系统中所有的页面,我都争取只写显示代码,用到了JSTL标签和EL表达式,使页面上代码简捷,易懂,易改。
    4 评论 69 下载 2020-07-31 16:55:17 下载需要13点积分
  • 基于JSP和MySQL的私人牙科诊所管理系统

    摘 要随着科技的飞速发展,计算机已经广泛的应用于各个领域之中。在医学领域中,计算机主要应用于两个方面:一是医疗设备智能化,以硬件为主。另一种是病例信息管理系统(HIS)以软件建设为主,以提高私人牙科诊所病例的现代化管理水平。本次毕业设计的主要任务是基于B/S模式开发设计一个私人牙科诊所病例管理系统以提高私人牙科诊所病例的现代化管理形象。该系统包括药品管理、挂号管理、开药管理和药房管理四个部分,可以实现药品、患者的录入、删除、修改和查询等功能,特别适应各大中小型私人牙科诊所病例,提高私人牙科诊所病例管理水平,系统设计合理操作简便。
    本文采用面向对象分析的方法,详细阐述了一个功能比较强大的牙科诊所管理系统的前后台开发,操作流程和涉及的一些关键技术。首先进行了可行性分析,然后是面向对象分析,通过实际的业务流程需要,抽取和整理用户需求,建立了问题域精确模型;然后是面向对象设计阶段,主要是把分析阶段得到的对目标系统的需求转变成符合成本和质量要求的,抽象的系统实现方案,阐述了系统设计的思想,数据库的设计和系统设计的工具及技术。该阶段对本系统各个对象的属性和方法进行了详细设计,建立了本系统的对象模型,形成了本系统的类图;数据库设计时先进行了概念结构设计,然后进行了逻辑结构设计,最后完成了数据表的设计。
    根据前几个阶段的分析和设计,本系统在设计方面采用B/S模式,同时使用JSP技术进行基本页面的设计与功能实现,后台数据库选用MySQL数据库。本系统的设计实施为牙科诊所管理系统的运行做基础,为牙科诊所管理系统工作提供良好的条件。
    关键词:牙科诊所病例门诊管理;JSP;B/S模式
    ABSTRACTWith the rapid development of science and technology, computers have been widely used in various fields. In the field of medicine, computers are mainly applied to two aspects: one is the intelligence of medical equipment and the hardware. The other is the case information management system (HIS), which focuses on software development to improve the level of modern management of cases in private dental clinics. The main task of this graduation design is based on B/S pattern development and design a private dental clinics case management system in order to improve the modern management image of the private dental clinic cases. The system includes drug management, register management, prescribe medicine and pharmacy management four parts, of drugs, patients can be accomplished by the input, delete, modify, and query, and other functions, especially for the small and medium-sized private dental clinic cases, improve the level of private dental clinics case management, reasonable system design is simple.
    This article adopts the method of object-oriented analysis, elaborated the function of a more powerful Taiwan before and after the development of the dental clinic management system, operation process and some of the key technologies involved. First has carried on the feasibility analysis, then the object-oriented analysis, through the actual business process needs, extract and user needs, set up the precise model the problem domain; Then the object-oriented design phase, mainly with the analysis phase of the demand for the target system into conformity with the requirements of the cost and quality of abstract system implementation plan, expounds the ideas of system design, database design and system design tools and techniques. In this phase, the object model of the system is set up, and the class diagram of the system is formed. The design of the conceptual structure was carried out first, then the logical structure design was carried out, and the design of the data table was completed.
    According to former several stages of the analysis and design, this system adopts B/S mode in terms of design, and using JSP technology of basic pages design and function implementation of background database choose MySQL database. The design of this system is implemented as the basis for the operation of the dental clinic management system, and provides good conditions for the operation of the dental clinic management system.
    Key words: the patient outpatient clinic administration; JSP; B/S pattern
    1.引言私人牙科诊所病例信息系统(HOSPITAL INFORMATION SYSTEM)简称HIS,是私人牙科诊所病例实现现代化建设的重要基础工程,是提高私人牙科诊所病例管理水平、医疗水平、业务运转效率和服务质量的必要手段,是指应用电子计算机和网络通信设备,对私人牙科诊所病例的病人医疗信息、财务核算分析信息、预约信息进行收集、存储、处理、提取和数据通讯,满足所有授权用户对信息使用需求的计算机应用软件系统。
    1.1 项目开发的背景随着计算机产业的迅速发展,电子计算机已广泛的应用于信息管理,文字处理,辅助设计,辅助教学及人们的日常生活中。牙科诊所管理系统主要针对各医院门诊管理的一系列相关工作的管理,本系统的建立使得牙科诊所的管理更加规范化,系统化,查询手段更加便捷化。同时,本系统采用面向对象的开发方法,进一步解决了结构化范性存在的软件重用程度低,软件产品难以维护的问题。
    近年来,随着就诊的病人的数量的逐渐增加,人工书写数据已经不能够处理如此庞大的数据。为了更好的适应信息时代的高效性,一个利用计算机来实现牙科诊所管理系统工作的系统必然诞生。基于这一点,所设计的牙科诊所管理系统用来就诊所进行管理,以便在最短时间内,高效准确的完成整个管理过程。
    基于上述认识,收集相关资料和数据,查阅有关文献及技术参数,对用户需求进行调研,发现目前所采用的手工记录的方法进行管理存在对象范围广,数据存储不易,不易存档,成千上万的信息和堆积如山的单据对管理人员来说是个负担,需要大量的文档资料。而已经存在的一些面向过程设计的诊所管理系统软件重用程度低,软件产品不易维护。鉴于上述种种原因,牙科诊所管理急需一种面向对象的设计的软件来管理数据资料。
    计算机技术在现代管理中的应用,使计算机成为领导者和管理人员应用现代技术的重要工具。计算机辅助门诊管理活动,可以极大地增强管理者采集,处理信息的能力,从而有利于管理者及时决策。计算机系统能根据管理过程的变化情况,将原始数据,资料等进行加工,保存,管理人员可以在解决具体问题需要信息资料时,随时进行检索查询,了解整个牙科门诊管理系统的动态情况,进行动态管理,从而有效的处理牙科门诊的管理工作,实现牙科诊所管理的自动化,提高效率。
    1.2 项目开发的目的牙科诊所管理系统的开发目的是使得牙科诊所管理系统模式从手工记录转变成信息管理,从面向过程开发的软件转变成面向对象开发的软件,为门诊管理人员提供方便,为软件维护工作人员提供方便。对用户的实际情况进行调研,进行详细的需求分析,对现有的管理模式进行改进,开发出一套新型的面向对象的管理系统,从中领悟系统开发的思想,掌握系统开发的流程和方法。随着门诊信息系统的不断完善,医院的管理将越来越依赖于信息化的管理。所以系统开发将围绕牙科门诊工作的实际情况,使之能迅速适应各牙科诊所的需要。
    牙科诊所管理系统的实现的现实意义:减少管理诊所的工作人员;管理人员可以随时浏览查看,而且更加直观;改变了以前工资手工记录的方式,电脑录入更加快捷方便;实现了门诊管理系统的计算机化。
    随着私人牙科诊所病例数字化建设的蓬勃发展,数字化私人牙科诊所病例的理念已经被广大私人牙科诊所病例所接受,目前面临的主要问题是如何去建设数字化私人牙科诊所病例。
    因此,目前我国数字化私人牙科诊所病例的建设重点必须以医疗数字化为主,即着重发展私人牙科诊所病例内与医疗活动相关的各类信息的数字化管理和综合利用,实现诊疗工作的数字化以及医疗流程的自动化,并保证系统的开放性,为将来扩展到区域医疗打下基础。相应地,医疗信息系统作为数字化私人牙科诊所病例建设的系统基础,它的研究重点也将转为面向纯粹医疗活动的各类医疗信息系统及其集成研究。以医疗数字化为建设重点的数字化私人牙科诊所病例的总体规划,它通过各类医疗信息系统的有机集成而实现。可以说,新一代医疗信息系统将在“数字化私人牙科诊所病例”的建设中发挥举足轻重的作用。
    1.3 结构概述和技术介绍1.3.1 JSP概述JSP是服务器端脚本环境可以用来创建交互式Web应用程序。当服务器收到对JSP文件的请求时,它处理包含在用于构建发送给浏览器的Web页文件中的服务器端脚本。除服务器端脚本外,JSP文件也可以包含HTML(包括相关的客户端脚本)和COM组件调用,这些组件可执行不同任务,如连接到数据库或处理商业逻辑。

    对于HTML创作者:HTML创作者,将会发现用JSP编写服务器端脚本可使创建更为复杂、使用的Web应用程序变得十分简单。JSP对于将HTML表单信息存储在数据库中、根据访问者的自选项自定义Web站点或对不同的浏览器使用不同的HTML功能,提供了优异的解决方案。例如,从前要在Web服务器上处理用户输入,必须首先用Perl或C等语言建立传统的公共网关接口(CGI)应用程序。而使用JSP后,仅通过在HTML文档中直接嵌入的简单服务器端脚本,便可以收集HTML表单信息,并传递到数据库。如果已熟悉Microsoft JSPScript或Microsoft(r)Jscript,那么学习JSP将不会感觉到困难
    对于高级Web脚本语言编写者:由于JSP使用了中性语言,因此只要熟悉JSPScript、Jscript或PERL等脚本语言,就了解了JSP的使用方法。在JSP页中,可以使用已经装有COM脚本兼容编辑引擎的任何脚本编辑语言。JSP使用java和Jscript脚本引擎,但仍可安装用于PERL、REXX和Python的脚本引擎,他们可从第三方供应商处获得
    对于Web开发和编程人员:如果使用Visual Basic、C++或Java等编程语言开发过后端Web应用程序,将会发现JSP是创建Web应用程序灵活而快速的方法。除了添加脚本为应用程序创建HTML界面之外,还可以建立自己的COM组件。可以将应用程序的商业逻辑封装在可重复使用的模块中,以便在脚本、其他组件或其他程序中调用
    Active Server Pages模型:当浏览器向Web服务器请求.JSP文件时,服务器断脚本便开始运行。于是Web服务器调用JSP,用它从头至尾处理所请求的文件、执行脚本命令,并将Web页发送到浏览器。因为脚本运行于服务器而不是客户端,所以Web服务器负责生成发送到浏览器的HTML页等工作。服务器端脚本无法被预先复制,因为返回到浏览器的只是脚本的运行结果,用户无法得知当前页面的脚本命令

    1.3.2 JSP的新特性JSP新增了许多特性,有助于轻松编写脚本和开发Web应用程序。

    新的流控制能力:JSP的Server对象具有两种可用来控制程序流的新方法:Server .Transfer 和Server .Execute。与重定向请求(需要往返于客户端)不同,使用这些方法可将请求直接传送到.JSP文件,而不需要离开服务器
    错误处理:JSP具有新的错误处理能力,可以使用自定义的错误信息.JSP文件来捕捉错误,也可以使用新的Server.GetlastError方法来显示有用信息,如错误描述或发生错误的行号
    无脚本:通常JSP静态内容的处理速度快于服务器端内容的处理速度,因此以前只将.JSP文件扩展名指派给包含JSP功能性的文件。无论何时,如果需要在静态.html文件中添加JSP,只能手工添加.JSP文件扩展名并修正相关超级链接。不过,在JSP的最新版本中,不包含服务器端功能性的.JSP文件的处理速度比以前快了许多。因此,如果正在创建展开的Web应用程序并且其中的文件最终可能需要JSP功能性,现在就可以很方便地为这些文件指派.JSP文件扩展名,而不必考虑他们是否包含静态或服务器端内容
    性能增强的对象:JSP提供流行的可安装组件的性能怎增强版本。这些对象能够可靠的使用与各种Web发布环境
    XML集成:XML(扩展表及语言)允许描述复杂的数据结构或文档,可以在各种应用程序、客户端和服务器之间共享此信息。使用Microsoft Internet Explorer 4.0或根高版本附带的Microsoft XML Parser,可以创建服务器端应用程序,该应用程序允许Web服务器与Internet Explorer4.0(或更高版本)或任何包含XML结息能力的服务器交换XML格式的数据
    Windows脚本组件:JSP支持Microsoft强大的脚本新技术——Windows脚本组件。现在可以将商业逻辑脚本过程转换为可以重复使用的COM组件,该组件可用于Web应用程序和其他组件对象模型(COM)适用的程序
    确定浏览器能力的新方法:JSP具有可确定浏览器准确能力的新特性。当浏览器发送能描述其能力的Cookie(可通过使用简单的客户端脚本来安装这样的Cookie)时,可以创建一个“浏览器能力组件”实例,以便检索随Cookie返回的浏览器属性。可以使用此特性来确定浏览器能力并对应用程序做相应调整
    JSP自动调整:JSP现在可以检测执行请求何时被外外部资源阻断,并自动提供更多县城以便同时执行附加请求和继续正常处理。如果CPU负担过重,JSP将减少线程数量,以便减少因太多费阻断请求同时执行而产生的持续不断的交换
    服务器端包含(使用SRC属性):现在可以使用HTML(SCRIPT)…(/SCRIPT)标签的SRC属性来完成服务器端包含。当使用SRC属性制定虚拟或相对路径并使用RUNAT=SERVER属性表示服务器端执行时,可以完成与“#Include”命令一样的功能
    编码的JSP脚本:以前Web开发人员禁止他人查看隐藏在脚本后面的逻辑。JSP现在支持Microsoft Visual Basic Scripting Edition(JSPScript)和Microsoft Jscript5.0 附带的新的脚本编码实用程序。Web开发人员可以对客户端和服务器端脚本应用编码方案,以便使程序逻辑(使用非标准ASCCII字符)不可读。已编码的脚本在运行时由脚本引擎解码,因此不需要单独的实用程序。虽然此特性不是专门的安全加密解决方案,但可防止大多数用户无意中查看或复制脚本

    1.3.3 JSP的基本概念
    URL:URL(Uniform Resource Location,统一资源定位器)有协议名、web服务器地址、路径名和文件名四部分组成,它只是了文件在Internet中的位置
    HTML:HTML(Hypertext Markup Language,超文本标记语言)是一种用于编写超文本文档的标记语言,它不是一种程序设计语言而是一种结构语言。它具有凭他无关性,无论是何种操作系统,只要有相应的浏览器程序,就可以运行HTML文档
    Web站点:Web站点是计算机网络上的一个位置,它以网页或文档形式提供信息,访问者只需通过Web浏览器链接到站点
    主页:主页是Web站点上一组网页或其他文件的起始页。它是HTML格式的文档,可用来说明站点内容、作者所在公司或部门的新闻、指向其他相关文档的链接或站点作者的个人信息等

    2.系统分析2.1 需求分析根据调研情况进行分析,认识到完整的管理系统非常复杂 ,其功能随医院病例规模等条件的变化而不同。目前各种医院病例管理系统的不断涌现,但是大多都是针对大型医院来设计的,而很少考虑到众多私人牙科诊所病例的实际情况,其功能在私人牙科诊所病例并不适用,从而增加了院方不必要的投资。此外,系统一般也不支持远程访问,信息的共享性差。为适应医疗信息管理发展的需要,开发基于B/S结构的私人牙科诊所病例管理系统。该系统应具有以下功能:

    登陆模块,可分为管理员登陆和普通用户医生登录三个模块
    用户注册模块,对用户注册的用户名的要求,不同的用户要求要有不同的用户名
    系统管理模块,包括添加管理员,管理员密码的修改
    挂号管理模块,包括患者的名字、性别、年龄、现住地址和患者简介
    患者管理模块,对患者进行增加、患者删除、患者信息的修改
    开药管理模块,对药品的增加、删除、修改、查询,患者病历查
    科室管理模块,管理员可以新建,修改,删除,科室信息
    留言管理,管理员可以新建,修改,删除留言信息
    预约挂号模块,用户可以在线进行预约挂号,用户可以选择普通号和专家号

    2.2 系统设计原则2.1.1 技术可行性本系统是采用基于Web的程序设计思想进行编制的,利用JSP语句结合Microsoft SQL Server 2000后台数据库开发“私人牙科诊所病例信息管理系统”,可应用于各大中小型私人牙科诊所病例。整个系统由若干个表、窗口、菜单构成的。用户可通过菜单来调用系统的各项功能。
    基于Web的程序设计语言JSP,之所以成为功能强大的服务器端程序是因为它为Web编程人员提供了一组功能强大的内置对象,通过这些内置对象,编程人员可以控制Web页面的各个方面。
    2.1.2 经济可行性鉴于次系统是毕业设计,所以本系统不需要多余的格外开发成本,硬件配置和软件配置环境家用机可完全胜任,所以在经济上是可行的。
    2.1.3 操作可行性本设计力求界面简单明了,操作简单,便于上手,使用户可以在最短的时间内熟练掌握各功能。所以在操作上是可行的。
    2.1.4 时间可行性从时间上看,在两个月的时间里学习相关知识,并开发网站,时间上是有点紧,但是不是不可能实现,通过两个多月的努力功能基本实现。
    3.概要设计功能模块的设计是整个系统设计的重要部分,它决定怎么实现系统的功能,不仅要求功能完善,而且还要界面友好,因此,对于一个成功的系统设计,功能模块的设计是关键。

    3.1 数据库设计目前流行的数据库管理系统有Oracle、Mysql DB2、Sybase、MS Access和Microsoft SQL Server等。Oracle和Mysql是性能卓越、稳定可靠的大型数据库管理系统,目前拥有较多的用户。 MS Access 是一种性能可靠、使用方便的小型数据库系统。一般而言,数据库是由特定的操作系统环境上的一个或者一组文件组成的,而数据库管理系统一般是由运行于用户计算机或网络上的远程计算机上面的一整套程序组成的。
    根据对数据组织方式的不同,数据库系统分成关系数据库、层次数据库和网状数据库。目前常见的数据库系统上基本上都是关系型数据库系统。在关系型数据库系统中,数据被组织成为二维表格形式,表格中的每个数据行称为一条记录或直接称为行,每一个列有时被称为字段或直接称为列,通过指定行和列定位一个指定的数据项。
    一个优秀的数据库系统应具备如下特征:

    最大限度的减少数据的重复存储(称为“冗余”),以减少存储空间的占用
    尽可能地提高数据的查询(搜索)速度
    提供灵活的数据组织和统计手段
    保章数据的安全

    本系统采用的数据库是MySQL是一个关系型数据库管理系统 瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。所有对数据库访问操作的管理信息系统都是根据用户的需求设计的,如果对数据库概念理解不深,那么设计出的数据库,不但访问速度慢,让用户不满意,而且还存在很多的重复数据,大量的浪费计算机资源。所以如何符合逻辑的有组织的设计好数据库,使数据库不仅容易维护,而且还让用户方便快捷的访问操作,这将是一个重点。因此,要设计好数据库,先了解一下关于数据库的基本概念是必要的。
    3.2 建立数据库现在管理数据库的工具是越来越多了 有了他们我们可是很方便的创建数据库删除数据库 还可以通过工具查看数据库的表的结构表中的字段数据进行数据库以及表的设计 极大地方便了我们 。不用再为创建数据库只有使用sql语句提供了方便.。
    3.3 建立数据库的任务数据库设计实际上主要是所要处理的数据的表示方法和存储结构的设计。在采用数据库技术之前,这些工作分散在应用程序中进行;在采用数据库技术之后,这些工作可以通过数据库设计集中起来系统地进行。
    上图可以看出,进行数据库设计的首要任务是考虑信息需求,也就是数据库要存入什么样的数据。创建数据库并不是仅仅为了存储数据,更主要的目的是从中提取有用的信息。除了考虑数据存储什么数据外,还应考虑存取方式,也就是处理需求。即要根据用户提出的存取要求来设计数据模式和应用程序。
    3.4 建立数据库的方法数据库设计方案应该是将用户需求充分融入其中的,所以同用户进行充分的接触和交流是比不可少的。就设计方法来说,应遵循以下几个步骤:

    确定该数据库中需要的表
    确定表中需要的字段
    明确有唯一值的字段
    确定表之间的关系
    优化设计
    输入数据并新建其他数据库对象

    建立私人牙科诊所病例信息管理系统的数据库的操作步骤:

    打开企业管理器,在“数据库”上单击鼠标左键,之后在弹出的快捷菜单中选择“新建数据库”命令。保存并命名为“demo”
    在企业管理器,选择“安全性”的“登录”选项单击右键选择“新建登录”创建用户
    选择“demo”中的“表”单击右键弹出快捷菜单选择“新建表”命令,在显示的窗口中设置表中各个字段的名称、数据类型、长度和允许空等信息,并保存
    选择用户信息表,单击鼠标右键。在弹出的快捷菜单中选择“打开表”然后选择“返回所有行”命令,在显示的窗口中输入表的信息,然后关闭窗口,完成在表中输入信息的工作

    这样名为demo的数据库就建成了,系统建立的数据库文件扩展名为.sql,文件主名是在database name编辑框中键入的数据库名称。
    3.5 数据项和数据结构用户身份,包括的数据项:用户身份ID号、用户身份名称,其E-R图如图3-1所示:

    用户登录信息,包括的数据项有:用户名称、用户密码、用户身份、用户登录次数,其E-R图如图3-2所示:

    用户登录日志信息,包括的数据项有:日志记录编号、用户编号、登录时间、离开时间,其E-R图如图3-3所示:

    3.6 建立数据表在系统数据库设计中,数据表的设计是关键,如何根据系统要实现的功能合理地设计数据表,将关系到整个系统数据表的运行效率甚至整个系统的成败,在表设计中要注意遵循数据库计数的原则。
    规范化逻辑数据库设计包括使用正规的方法来讲数据分为多个相关的表。拥有大量窄表(列较少的表)是规范化数据库的特征。而拥有少量宽表(列较多的表)是非规范化的特征。数据库表设计理论的基本原理是:每个表都应有一个惟一的行标识符,可以使用列或列集将任何单个记录同表中的所有其他记录去区别开来。每个表都应有一个ID列,任何两个记录都不可以共享同一ID值。作为表的唯一行标识符的一列或多列是表的主键。同是,表应只能存储单一类型实体的数据并且应避免可为空的列,更重要的是表不应有重复的值或列。
    因为私人牙科诊所病例信息管理系统包括挂号信息管理、药品管理等模块,还有其他子模块构成,包括的数据比较多,每一个表都要确定主关键字。这样本系统所有的表结构都建成了。
    sysuser表



    字段
    字段名
    数据类型
    长度
    说明




    1
    id
    Int
    4
    编号


    2
    uname
    varchar
    50



    3
    upass
    varchar
    50



    4
    tname
    varchar
    50



    5
    sex
    varchar
    50



    6
    birth
    varchar
    50



    7
    tel
    varchar
    50



    8
    ismarage
    varchar
    50



    9
    addr
    varchar
    50



    10
    email
    varchar
    50



    11
    idcard
    varchar
    50



    12
    byschool
    varchar
    50



    13
    utype
    varchar
    50



    14
    dept
    varchar
    50



    notice信息表



    字段
    字段名
    数据类型
    长度
    说明




    1
    id
    Int
    4
    编号


    2
    title
    varchar
    50



    3
    note
    varchar
    50



    4
    savetime
    varchar
    50



    zd信息表



    字段
    字段名
    数据类型
    长度
    说明




    1
    ghno
    Int
    4
    编号


    2
    bg
    varchar
    50



    3
    zd
    varchar
    50



    4
    info
    varchar
    50



    5
    numinfo
    varchar
    50



    6
    oper
    varchar
    50



    7
    savetime
    varchar
    50



    8
    qystatus
    varchar
    50



    9
    fkstatus
    varchar
    50



    10
    totalprice
    varchar
    50



    11
    sfoper
    varchar
    50



    12
    sfsavetime
    varchar
    50



    13
    fyoper
    varchar
    50



    14
    fysavetime
    varchar
    50



    4.详细设计4.1 模块的设计4.1.1 登录模块管理员登录:包括用户名、密码 ,注册用户 界面图如图4-1所示:

    实现管理员登陆界面的部分代码如下:
    <title>私人牙科诊所病例管理系统 </title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <LINK href="admin/css/admin.css" type="text/css" rel="stylesheet"> </head> <%String message = (String)request.getAttribute("message"); if(message == null){ message = ""; } if (!message.trim().equals("")){ out.println("<script language='javascript'>"); out.println("alert('"+message+"');"); out.println("</script>"); } request.removeAttribute("message"); String code=yzm.getCheckCode();%> <body onload=document.f1.uname.focus();> <form action="/srykzsblmis/studysite?ac=login" method="post" name="f1" onsubmit="return ck()"> <TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" bgColor=#002779 border=0> <TR> <TD align=middle> <TABLE cellSpacing=0 cellPadding=0 width=468 border=0> <TR> <TD align="center"><font size="4" color="white"><b>私人牙科诊所病例管理系统 </b></font></TR> <TR> <TD><IMG height=147 src="admin/images/login_2.jpg" width=468></TD></TR></TABLE> <TABLE cellSpacing=0 cellPadding=0 width=468 bgColor=#ffffff border=0> <TR> <TD width=16><IMG height=122 src="admin/images/login_3.jpg" width=16></TD> <TD align=middle> <TABLE cellSpacing=0 cellPadding=0 width=230 border=0> <TR height=5> <TD width=5></TD> <TD width=56></TD> <TD></TD></TR> <TR height=36> <TD></TD> <TD>用户名</TD> <TD><INPUT style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" maxLength=30 size=24 name=uname></TD></TR> <TR height=36> <TD>  </TD> <TD>口 令</TD> <TD><INPUT style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" type=password maxLength=30 size=24 name=upass></TD></TR> <TR > <TD>  </TD> <TD>验证码</TD> <TD><input type="text" style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" size="5" id="yzm" name="yzm" class=input onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" onkeyup="value=value.replace(/[\W]/g,'')"><%=code %></TD></TR> <TR height=5> <TD colSpan=3></TD></TR> <TR> <TD> </TD> <TD> </TD> <TD><INPUT type=image height=18 width=70 src="admin/images/bt_login.gif"></TD></TR></TABLE></TD>
    普通用户登录:只有合法的用户在输入正确的密码后方可进入系统,否则将提示密码或用户名输入错误,并询问用户是否重新输入,界面图如图4-2所示:

    实现普通用户登录的部分代码如下:
    <jsp:include page="top.jsp"></jsp:include> <%HashMap user = (HashMap)session.getAttribute("user"); CommDAO dao = new CommDAO(); HashMap map = dao.select("select * from patient where id='"+user.get("id")+"' ").get(0);%> <div style="margin-top:10px;text-align:center;"> <table width=800 border="0" cellpadding="0" cellspacing="0"> <tr height=320 bgcolor="#1FA9FE" style="color:white;font-weight:bold;"> <td align="center" width=110 bgcolor="#ECECED" valign="top" style=""> <jsp:include page="menu.jsp"></jsp:include> </td> <td align="center" bgcolor="white" style="padding-left:20px;padding-top:15px;color:Black;font-weight:normal;" valign="top"> <form action="/srykzsblmis/studysite?ac=userinfo&id=<%=map.get("id") %>" name="f1" method="post" onsubmit="return ck()"> <table border=0 style="font-size:12px"> <tr bgcolor="#ffffff"> <td width=130 > 登录名称: </td> <td width=570 align="left"> <input name="uname" type="text" id="uname" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td > 登录密码: </td> <td align="left"> <input name="upass" type="password" id="upass" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td > 重复密码: </td> <td align="left"> <input name="upass1" type="password" id="upass1" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td>病人姓名</td> <td><input type="text" id="tname" name="tname" size="5"/>*</td> </tr> <tr bgcolor="#ffffff"> <td>性别</td> <td> <select id="sex" name="sex"> <option value="男">男</option> <option value="女">女</option> </select> </td> </tr> <tr bgcolor="#ffffff"> <td>年龄</td> <td><input type="text" id="age" name="age" size="2"/>*</td> </tr> <tr bgcolor="#ffffff"> <td>身份证</td> <td><input type="text" id="idcard" name="idcard" />*</td> </tr> <tr bgcolor="#ffffff"> <td>电话</td> <td><input type="text" id="tel" name="tel" />*</td> </tr> <tr bgcolor="#ffffff"> <td>住址</td> <td><input type="text" id="addr" name="addr" />*</td> </tr> <tr height=60> <td align="center" colspan="2"> <input type="submit" value="提交"> </td> </tr> </table> </form> </td> </tr> </table> <div style="margin-top:10px;height:1px;background-color:#1FA9FE;text-align:center;width:800px;"> </div> </div> <jsp:include page="foot.jsp"></jsp:include> </center> <script type="text/javascript"> function ck(){ if(f1.upass.value==""){ alert("密码不能为空"); return false; }if(f1.upass1.value==""){ alert("再次输入密码"); return false; }if(f1.upass1.value!=f1.upass.value){ alert("两次密码不一致"); return false; }if(f1.tname.value==""){ alert("姓名不能为空"); return false; }if(f1.sex.value==""){ alert("性别不能为空"); return false; }if(f1.idcard.value==""){ alert("身份证不能为空"); return false; } } <%String suc = (String)request.getAttribute("suc");String no = (String)request.getAttribute("no");if(no!=null){ %> alert("已存在的用户名"); <%}if(suc!=null){ %> alert("修改成功");location.replace("/srykzsblmis/userinfo.jsp"); <%}%></script> </body></html><%=Info.tform(map)%>
    4.1.2 用户注册模块用户注册包括用户名、登录密码、密码确认,界面图如4-3图所示:

    实现用户注册的部分代码如下:
    <title>私人牙科诊所病例管理系统</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --><STYLE type=text/css>BODY{ padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; font-size: 12px;}.STYLE2 { FONT-SIZE: 12px}.STYLE3 { FONT-WEIGHT: bold}.style7 { FONT-FAMILY: "黑体", "方正美黑简体", "华文细黑"; COLOR: #646464; FONT-SIZE: 18px}BODY { BACKGROUND-IMAGE: url(img/lbg.gif); PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT-SIZE: 12px; PADDING-TOP: 0px}.tb { WIDTH: 926px}.td2 { TEXT-ALIGN: left; PADDING-LEFT: 80px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 100%}.txtBox { BORDER-BOTTOM: #e7ad01 1px solid; BORDER-LEFT: #e7ad01 1px solid; WIDTH: 130px; HEIGHT: 20px; COLOR: #000000; FONT-SIZE: 13px; BORDER-TOP: #e7ad01 1px solid; BORDER-RIGHT: #e7ad01 1px solid}#div1 {}#diqu { TEXT-ALIGN: center; WIDTH: 588px; BACKGROUND: url(images/2009_index_04.gif) no-repeat; COLOR: #2e466f}#diqu A { COLOR: #2e466f}.pageWidth { TEXT-ALIGN: left; MARGIN: 0px auto; WIDTH: 850px; BACKGROUND: #ffffff}#nav { PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 1em 0px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT-SIZE: 16px; FONT-WEIGHT: 200; LIST-STYLE-IMAGE: none; PADDING-TOP: 0px}#nav LI { FONT-FAMILY: "宋体"; FLOAT: left; FONT-SIZE: 14px; MARGIN-RIGHT: 1px}#nav LI A { TEXT-ALIGN: center; LINE-HEIGHT: 35px; MARGIN: 0em 0px 0px; WIDTH: 120.5px; DISPLAY: block; BACKGROUND: #f6ad79; COLOR: #000000; FONT-SIZE: 14px; TEXT-DECORATION: none; PADDING-TOP: 5px}.bi:hover SPAN { TEXT-ALIGN: center; LINE-HEIGHT: 35px; MARGIN: 0em 0px 0px; WIDTH: 120.5px; DISPLAY: block; BACKGROUND: #f6ad79; COLOR: #000000; FONT-SIZE: 14px; TEXT-DECORATION: none; PADDING-TOP: 5px}#nav LI A:hover { BACKGROUND: #dc3e0b; COLOR: #ffffff; FONT-SIZE: 14px; CURSOR: hand; PADDING-TOP: 0px}.bi:hover SPAN { BACKGROUND: #dc3e0b; COLOR: #ffffff; FONT-SIZE: 14px; CURSOR: hand; PADDING-TOP: 0px}.bi:hover SPAN { PADDING-TOP: 5px}.la { COLOR: #044a8e; TEXT-DECORATION: none}.la:hover { TEXT-DECORATION: underline}</STYLE><LINK rel=stylesheet type=text/css href="/frontfile/css.css"> </head> <body> <jsp:include page="top.jsp"></jsp:include> <div style="margin-top:10px;text-align:center;"> <table width=800 border="0" cellpadding="0" cellspacing="0"> <tr height=320 bgcolor="#1FA9FE" style="color:white;font-weight:bold;"> <td align="center" width=800 bgcolor="#ECECED" valign="top" style=""> <div style="margin-left:20px;font-size:16px;font-weight:bold;color:#044A8E;margin-top:20px;text-align:center;"> 用户注册 </div> <hr> <div style="font-size:12px;color:#044A8E;margin-top:20px;text-align:center;font-weight:normal;"> <form action="/srykzsblmis/studysite?ac=regedit" name="f1" method="post"> <table border=0 width=700 style="font-size:12px"> <tr bgcolor="#ffffff"> <td width=130 > 登录名称: </td> <td width=570 align="left"> <input name="uname" type="text" id="uname" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td > 登录密码: </td> <td align="left"> <input name="upass" type="password" id="upass" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td > 重复密码: </td> <td align="left"> <input name="upass1" type="password" id="upass1" style="width:150px;" />  </td> </tr> <tr bgcolor="#ffffff"> <td>病人姓名</td> <td><input type="text" id="tname" name="tname" size="5"/>*</td> </tr> <tr bgcolor="#ffffff"> <td>性别</td> <td> <select id="sex" name="sex"> <option value="男">男</option> <option value="女">女</option> </select> </td> </tr> <tr bgcolor="#ffffff"> <td>年龄</td> <td><input type="text" id="age" name="age" size="2"/>*</td> </tr> <tr bgcolor="#ffffff"> <td>身份证</td> <td><input type="text" id="idcard" name="idcard" />*</td> </tr> <tr bgcolor="#ffffff"> <td>电话</td> <td><input type="text" id="tel" name="tel" />*</td> </tr> <tr bgcolor="#ffffff"> <td>住址</td> <td><input type="text" id="addr" name="addr" />*</td> </tr> <tr height=60> <td align="center" colspan="2"> <img src="images/reg.png" border="0" onclick="ck()"/> </td> </tr> </table> </form> </div> </td> </tr> </table> <div style="margin-top:10px;height:1px;background-color:#1FA9FE;text-align:center;width:800px;"> </div> </div> <jsp:include page="foot.jsp"></jsp:include><script type="text/javascript"> function ck(){ if(f1.uname.value==""){ alert("用户名不能为空"); return false; }if(f1.upass.value==""){ alert("密码不能为空"); return false; }if(f1.upass1.value==""){ alert("再次输入密码"); return false; }if(f1.upass1.value!=f1.upass.value){ alert("两次密码不一致"); return false; }if(f1.tname.value==""){ alert("姓名不能为空"); return false; }if(f1.sex.value==""){ alert("性别不能为空"); return false; }if(f1.idcard.value==""){ alert("身份证不能为空"); return false; }else{ f1.submit(); }
    4.1.3 系统管理模块系统管理模块是私人牙科诊所病例信息管理系统中一个基础的部分,在本模块中包括管理员对自身密码的重新设置,可以定时更换密码,确保资料的安全;同时还有登陆日志模块,记录每一次登陆信息,如果出现特殊情况,可以查询登陆日志查询,增加了系统的安全性和保密性,便于控制和管理,界面图如图4-4所示:

    实现系统界面的部分代码如下:
    //添加科室 if(ac.equals("deptadd")){ String deptname = request.getParameter("deptname"); String tel = request.getParameter("tel"); String addr = request.getParameter("addr"); String delstatus = "0"; String sql = "insert into dept (deptname,tel,addr,delstatus) values('"+deptname+"','"+tel+"','"+addr+"','"+delstatus+"')"; dao.commOper(sql); request.setAttribute("suc", ""); go("/admin/deptadd.jsp", request, response); } //修改科室 if(ac.equals("deptedit")){ String id = request.getParameter("id"); String tel = request.getParameter("tel"); String addr = request.getParameter("addr"); String deptname = request.getParameter("deptname"); String sql = "update dept set deptname='"+deptname+"',tel='"+tel+"',addr='"+addr+"' where id= "+id; dao.commOper(sql); request.setAttribute("suc", ""); go("/admin/deptadd.jsp", request, response); } //添加药品、处置 if(ac.equals("ypcfadd")){ String yno = request.getParameter("yno"); String cksql = "select * from ypcf where yno='"+yno+"'"; ArrayList cklist = (ArrayList)dao.select(cksql); if(cklist.size()!=0){ request.getParameter("no"); go("/admin/ypcfadd.jsp", request, response); }else{ String yname = request.getParameter("yname"); String price = request.getParameter("price"); String type = request.getParameter("type"); String gg = request.getParameter("gg"); String company = request.getParameter("company"); if(!type.equals("药品")){ gg = ""; company = ""; } String delstatus = "0"; String sql = "insert into ypcf (yno,yname,gg,price,company,delstatus,type)values('"+yno+"','"+yname+"','"+gg+"','"+price+"','"+company+"','"+delstatus+"','"+type+"')"; dao.commOper(sql); request.setAttribute("suc", ""); go("/admin/ypcfadd.jsp", request, response);
    4.1.4 挂号管理模块挂号管理模块是私人牙科诊所病例信息管理系统中一个部分,本模块主要实现后台管理,包括添加、删除、修改,患者挂号添加功能如图4-5所示:

    4.1.5病例管理模块医生可以对病人病例信息进行管理,在本模块中包括所有患者的信息的添加、删除、修改,增加患者图如图4-6所示:

    4.1.6 用户模块用户可以预约就诊,可以对个人信息进行管理,可以查询病例信息,同时可以与医生进行在线交流留言,在本模块中包括所有添加、删除、修改、查询如图4-7所示:

    5.系统调试与测试5.1 程序调试在设计系统的过程中,存在一些错误是必然的。对于语句的语法错误,在程序运行时自动提示,并请求立即纠正,因此,这类错误比较容易发现和纠正。但另一类错误是在程序执行时由于不正确的操作或对某些数据的计算公式的逻辑错误导致的错误结果。这类错误隐蔽性强,有时会出现,有时又不出现,因此,对这一类动态发生的错误的排查是耗时费力的。
    5.2 软件的测试5.2.1 测试的重要性及目的测试的重要性软件的测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试学仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶段中都应包含测试,从而检验本阶段的成果是否接近预期的目标,尽可能早的发现错误并加以修正,如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。
    事实上,对于软件来讲,不论采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。测试是所有工程学科的基本组成单元,是软件开发的重要部分。自有程序设计的那天起测试就一直伴随着。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总成本中,用在测试上的开销要占30%到50%。如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,乃至多次开发,其中必定还包含有许多测试工作。
    在实践中,软件测试的困难常常使人望而却步或敷衍了事,这是由于对测试仍然存在一些不正确的看法和错误的态度,这包括:

    认为测试工作不如设计和编码那样容易取得进展难以给测试人员某种成就感
    以发现软件错误为目标的测试是非建设性的,甚至是破坏性的,测试中发现错位是对责任者工作的一种否定
    测试工作枯燥无味,不能引起人们的兴趣
    测试工作是艰苦而细致的工作
    对自己编写的程序盲目自信,在发现错误后,顾虑别人对自己的开发能力的看法

    这些观点对软件测试工作是极为不利的,必须澄清认识、端正态度,才可能提高软件产品的质量。
    测试的目的如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。
    在谈到软件测试时,许多人都引用Grenford J. Myers在《The Art of Software Testing》一书中的观点:

    软件测试是为了发现错误而执行程序的过程
    测试是为了证明程序有错,而不是证明程序无错误
    一个好的测试用例是在于它能发现至今未发现的错误
    一个成功的测试是发现了至今未发现的错误的测试

    这种观点可以提醒人们测试要以查找错误为中心,而不是为了演示软件的正确功能。但是仅凭字面意思理解这一观点可能会产生误导,认为发现错误是软件测试的唯一目,查找不出错误的测试就是没有价值的,事实并非如此。
    首先,测试并不仅仅是为了要找出错误。通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便改进。同时,这种分析也能帮助我们设计出有针对性地检测方法,改善测试的有效性。其次,没有发现错误的测试也是有价值的,完整的测试是评定测试质量的一种方法。
    5.2.2 测试的步骤与开发过程类似,测试过程也必须分步骤进行,每个步骤在逻辑上是前一个步骤的继续。大型软件系统通常由若干个子系统组成,每个子系统又由若干个模块组成。因此,大型软件系统的测试基本上由下述几个步骤组成:

    模块测试:在这个测试步骤中所发现的往往是编码和详细设计的错误
    系统测试:在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误
    验收测试:在这个测试步骤中发现的往往是系统需求说明书中的错误

    5.2.3 测试的主要内容为了保证测试的质量,将测试过程分成几个阶段,即:代码审查、单元测试、集成测试、确认测试和系统测试。
    单元测试
    单元测试集中在检查软件设计的最小单位—模块上,通过测试发现实现该模块的实际功能与定义该模块的功能说明不符合的情况,以及编码的错误。
    身份认证时候要保证在以下输入情况时候系统能够健康运行:

    输入用户ID时候键入非法字符,如:•#¥%……等
    在操作员编码框输入非数字字符,如abc,!•#¥《》
    输入的用户ID,或者操作员编码不存在
    输入的用户ID,或者操作员编码与密码不相符合
    输入的用户ID,操作员编码不能登陆本模块
    输入的信息超过规定字符长度
    输入的信息有一项为空

    查询信息时候:

    查询条件键入时有非法字符,如:#$%^等
    输入不存在的查询条件
    入查询条件超过规定字符长度
    输入查询条件一项为空

    集成测试
    集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。
    确认测试
    确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同用户所合理期待的那样。
    系统测试
    软件开发完成以后,最终还要与系统中其他部分配套运行,进行系统测试。包括恢复测试、安全测试、强度测试和性能测试等。
    单独对系统的测试主要从以下几方面入手:

    功能测试:测试是否满足开发要求,是否提供设计所描述的功能,是否用户的需求都得到满足。功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准
    强度测试及性能测试:测试系统能力最高实际限度,即软件在一些超负荷情况下功能实现的情况
    安全测试:验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。针对本系统主要是对权限系统的测试和对无效数据、错数据、和非法数据干扰的能力的测试

    经过上述的测试过程对软件进行测试后,软件基本满足开发的要求,测试宣告结束。
    6.结论6.1 系统评价本文通过私人牙科诊所病例信息管理的设计与开发,从而得出下列结论:

    学习一门新技术,最重要的是实践,只有多动手才能尽快掌握它
    一个系统的开发,经验是最重要的,经验不足,就难免会有许多考虑不周之处
    要想吸引更多的用户,网站的界面必须要美观、有特色、友好,功能要健全。不过由于经验不足,我设计的图形界面比较简单。只是对基本功能进行了开发
    本次开发,我参考了很多私人牙科诊所病例信息管理系统的例子,吸取了一些别的私人牙科诊所病例信息管理系统的长处,对自己的毕业设计进行了完善,但是还有很多的不足之处,有待以后进一步学习

    由于时间仓促,本次设计由我完成私人牙科诊所病例信息管理系统的制作,对我这样一个JSP新手而言所制作的模块还有不完善的地方。数据库的设计也比较简单。还有很多毕业设计中用到JSP语言的知识也不够全面,还有很多地方不能够作到完全的理解和掌握。通过这次毕业论文的设计制作使本人受益匪浅。首先,由于毕业设计所用的JSP技术和其中用到JSP语言的其他部分是在课堂上没有接触过的,要用它来做设计必须通过大量自学来掌握,在这个过程中,不仅大大提高了我的自学能力而且让我对JSP的学习有了进一步的认识 。由于是独立完成在毕业设计的过程遇到了很多的困难,我求教了不少老师和同学,在这个过程中让我体会到了,一个团队的重要性。
    6.2 安全性问题Web开发中安全性是必须考虑的一个很重要的方面,特别是在诸如毕业设计成绩信息等敏感数据的模块中更是关键,所以这也是后期开发需要引起重视的。下面就这方面的技术和解决方案加以讨论。

    安装防火墙:安装防火墙并且屏蔽数据库端口能有效地阻止了来自Internet 上对数据的攻击
    输入检查和输出过滤:客户在请求中嵌入恶意HTML标记来进行攻击破坏,防止出现这种问题要靠输入检查和输出过滤,而这类检查必须在服务器端进行,一旦校验代码发现有可疑的请求信息,就将这些可疑代码替换并将其过滤掉
    用户授权认证:对于关键用户必须进行系统授权,只有授权的用户才能访问系统。为了防止用户绕过登陆页面,系统在重要的页面检查用户是否登陆过并检验用户的操作权限,如果没有登陆或没有操作权限,将用户重定向到登陆页面。系统的后台数据库日志记录了所有登陆用户的用户名、IP 地址、登陆时间等

    参考文献[1] 王龙、黄峰,JSP管理信息系统项目开发实践,北京:科学出版社,2015.9
    [2] 高怡新,JSP网络应用程序设计,北京:人民邮电出版社,2015.1
    [3] 杨世锡、赵辉,JSP+SQL Server动态网站开发 从基础到实践,北京:电子工业出版社,2015.7
    [4] 陈建伟、李美军、施建强。JSP动态网站开发教程(第二版).北京:清华大学出版社,2015.9
    [5] 吴豪。 SQL Server 2000基础[M]. 红旗出版社/北京:希望电子出版社,2015.4
    [6] (英)福塔 著 刘晓霞,钟鸣 译《mysql必知必会》 人民邮电出版社 2009.1
    [7] 王虎, 张俊. 管理信息系统[M]. 武汉:武汉理工大学出版社,2014.7.
    [8] Budi kurniawan.struts 2design and programming:a tutorial brainysoftware,second edition edition,2008.1.25
    [9] Roger s-pressman,software engineering[m].new delhi:tata mcgraw-hill publishingcompary ltd,2006
    [10] On the integration of smalltalk and java:Marcel hlopko,Jan kurs,jan vrany,claus gittinger science of computer programming,2013-爱思唯尔期刊
    2 评论 26 下载 2020-07-31 16:55:31 下载需要13点积分
  • 基于JAVA和MYSQL数据库的学生成绩管理系统

    一、需求分析本系统是学生成绩管理系统,所以应该做到可以录入学生成绩,修改学生成绩,删除学生成绩,查询学生成绩,以及最后的所有学生按照GPA排名。
    本系统的数据来源期末考试成绩,用来实现录入,查询,修改,删除,以及排名。
    1.1 增加学生成绩增加学生信息主要是把学生的成绩录入系统中,录入信息包括学生学号,姓名,C++成绩,电路成绩,英语听说成绩,英语读写成绩,大学物理成绩,概率论成绩,近代史成绩,形式与政策成绩,体育成绩,离散数学成绩。
    1.2 修改学生成绩修改学生成绩功能可以通过输入学生的学号,如果该学生在系统中,就弹出一个可以编辑的显示成绩的窗体,然后用户再编辑想要修改的成绩,如果该学生不在系统中,就弹出该学生不在系统中的提醒窗体。
    1.3 查询学生成绩通过查询功能输入学生的学号来查询学生的所有成绩以及GPA,总分。
    1.4 删除学生成绩通过删除学生成绩的功能输入想要删除学生的编号,然后在系统中删除该学生。
    1.5 按GPA排名通过该功能打印出所有学生的成绩,并按照GPA进行排名
    二、概要设计2.1 数据库设计
    2.2 功能模块结构图根据需求分析,为了满足用户的功能需求,将本系统主要划分为如下模块:添加、修改、查询,显示,各模块之间的关系如图所示。

    三、运行环境
    硬件环境:Macintosh电脑
    软件环境:操作系统:macOS Sierra

    四、开发工具和编程语言
    开发环境:IDEA
    编程语言:Java语言、MySQL语言

    五、详细设计在概要设计的基础上,对每个模块进行内部逻辑处理部分详细设计。下面分别列出各个模块具体实现流程图:
    5.1 增加学生信息输入学生的学号,姓名,一系列成绩。
    判断该学生的学号是否已经在系统中,如果在,重新输入,如果不在,就用链接mysql录入系统中

    5.2 修改学生信息首先输入想要修改的学生成绩的学号,然后先判断该学生是否在系统中,如果在,就弹出一个可以编辑成绩的窗体,直接在窗体上编辑就行。

    5.3 查询学生信息通过输入学号,来查找系统中是否有该学号的学生,如果有,则显示该学生的成绩,
    GPA,总分,如果不存在则重新输入。具体实现过程如图所示。

    5.4 删除学生信息通过输入学号,来查找系统中是否有该学号的学生,如果有,则删除该学生的成绩,如果不存在则重新输入。具体实现过程如图所示。

    5.5 按照GPA排名从数据库取出所有数据时候调用排序函数来把所有的学生成绩根据算出的GPA进行排序,
    然后用表格控件来接受所有数据,再输出。

    六、界面添加学生成绩

    修改成绩

    查找结果

    GPA排名
    7 评论 1105 下载 2018-11-01 20:33:19 下载需要13点积分
  • 基于Android系统手机通讯录管理软件的设计与开发

    摘要谷歌在安卓领域投入了大量精力来开发,使得安卓技术得以广泛推广,现安卓移动平台设备在市场上已经得到大量推广及普及。在Android移动终端操作系统的快速发展,Android的各种手机软件也大量增长。当然,在手机终端中,手机通讯录是手机终端必不可少的基础功能,其质量直接影响着用户对手机使用的体验与感觉。手机通讯管理软件不仅仅只是能够简单添加联系人以及联系方式的功能,而今已发展成为多种形式,丰富了联系人的信息,存储了更多的内容。此课程设计研究的这个项目,主要实现添加联系人的多种联系方式的功能。
    本软件采用Android Studio+Android SDK集成环境,应用程序编程语言采用Java高级语言开发。通过对通讯录中的联系人的管理,来方便用户通讯更加便捷,联系人的数据保存更加安全。在对Android手机通讯管理软件进行详细的系统设计时,对功能进行详细的划分并对其功能做了详细的介绍,列出了一些主要功能流程图。
    关键词:通讯录 Android 数据库 SQLite
    第一章 绪论1.1 项目研究背景经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
    Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Android里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器。
    Android平台的开放性等特点既能促进技术的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品。
    1.2 项目研究的目的及意义随着4G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。
    手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,有9成以上的消费者使用手机通讯录功能。随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有,大大丰富了内容,同时结构也发生了革命性变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社会各层人士的喜爱。
    1.3 系统主要实现内容通过对Android技术的相关研究,了解Android源码实现原理以及过程,从而设计出一款能够使用的手机通讯录。
    这款手机通讯录实现的相关内容如下:

    简洁、实用的操作界面
    联系人的增删改查
    分类的增删改查
    呼叫联系人
    登录、注册、修改密码
    群组的增删改查
    导入导出联系人
    支持模糊查询手机通讯录

    第二章 系统分析2.1 系统可行性分析2.1.1 技术可行性Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。
    本软件用的是Java开发语言,在Android Studio集成开发环境下,调试容易。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。
    2.1.2 经济可行性开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,且不需要Android平台机器,用模拟器即可实现开发研究,开发成本低,容易实现,从经济角度来看,该系统可行。
    2.1.3 操作可行性不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。
    2.2 Android通讯录的使用意义该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等功能。要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。
    第三章 系统概要设计3.1 系统总体设计Android手机通讯管理软件主要功能模块包括:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等。

    3.2 处理流程设计3.2.1 业务流程图用户首次进入手机通讯管理软件后,会进入用户注册界面,当用户注册成功之后,输入密码即可看到联系人列表界面。联系人列表界面右下方显示增加联系人按钮。上方可以进行联系人的多条件搜索。同时长按某个联系人可实现编辑删除功能。当然点击联系人也可以看到详细信息。界面中显示我的群组列表,打开之后即可进行群组的增删改查功能。点击菜单键,显示通讯录的导入导出功能以及修改密码功能。
    3.2.2 数据增加流程图添加联系人时,数据由用户输入,点击确定按钮,判断数据是否合法(及用户名是否为空),合法则插入到数据库;不合法,提示错误信息,让用户重新输入。流程如图所示:

    3.2.3 数据修改流程图编辑联系人时,点击编辑联系人菜单,输入修改后的数据,点击确定按钮,判断数据是否合法,合法,则更新数据库;不合法,则返回错误信息。 流程如图所示:

    3.2.4 数据删除流程当用户选定一个联系人时,单击删除联系人菜单,提示用户是否删除,点击确定按钮,则从数据库中删除此条记录。数据删除流程如图所示:

    3.3 数据库设计3.3.1 SQLite数据库简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。
    本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
    3.3.3 数据库表结构首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、群组ID、地址等联系方式。创建群组表用来保存ID和群组名称等信息。两个表联合配合。表结构如图所示:

    第四章 系统详细设计4.1 联系人浏览模块进入手机通讯管理软件后,看到的第一个界面是联系人列表界面。该列表是由ListView控件生成的,打开数据库(如果数据库不存在则创建数据库,并创建数据表),查找数据库中所有的联系人,并把联系人姓名和移动电话号码以及职位这填充到ListView的adapter中。每一行显示一个联系人的姓名和手机号码,联系人的显示的顺序是根据插入数据库的顺序显示的。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话、导入导出通讯录等。

    点击[菜单]按钮时,就会显示主菜单项,其中包括:修改密码、导出数据、导入数据。
    点击添加按钮,会进入添加联系人界面,可以输入联系人相关信息,完成联系人添加功能。点击上方搜索栏目,会进入联系人查找界面,可以进行联系人查找,搜索想要找的联系人。
    点击菜单按钮,打开修改密码、导出通讯录、导出通讯录等功能。

    长按列表的某一行时,会弹出长按菜单,其中包括:拨号、编辑联系人、删除联系人。点击查看联系人菜单会进入查看联系人界面。点击编辑联系人菜单会进入编辑联系人编辑界面。点击删除联系人时,会弹出对话框,询问是否删除联系人,点击确定,则从数据库中删除该联系人。

    4.2 查看联系人模块在联系人浏览界面点击某个联系人,则会跳转到该界面。该界面使用TextView把从数据库中调出的联系人的详细信息显示出来,这里面包括联系人姓名、手机号、地址等详细信息。

    4.3 编辑联系人模块编辑联系人界面使用EditView控件显示并修改联系人的详细信息。联系人的所有信息,处于可编辑状态,手机号和座机号的EditView设定为只能输入数字。修改完信息后点击确定按钮,触发确定按钮点击监听事件,从而对数据库中该联系人的信息进行更新, 然后自动返回联系人浏览界面。点击取消按钮会返回联系人浏览界面。

    4.4 查找联系人模块这里采用的查找方法是SQL模糊查询,可以只输入联系人姓名中的一部分,即可查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码。可实现查找职位、手机号码、名字等信息。

    4.5 修改密码点击菜单,可以查看该软件的修改密码、导入导出等情况。并可实现全部功能。

    4.6 分类管理点击我的群组界面,可以查看群组并且显示群组。在里面可以对群组进行增删改查操作。
    51 评论 318 下载 2019-01-30 17:27:39 下载需要14点积分
  • 基于JAVA实现的飞机大战小游戏

    摘 要本课程设计通过代码实现将理论知识和具体实践相结合,巩固提高了对JAVA的相关方法与概念的理解,进一步加强了学生的发散思维及动手能力,加强了学生对计算机及软件工程的进一步了解。
    在这个课程设计中,使用类、抽象类和接口,采用Java的编程思想和建造者设计模式做成了一个基于JFrame窗体和鼠标运动的小游戏,打开游戏后玩家可通过移动鼠标来控制己方飞机移动,不仅可以击毁敌机也可以躲避敌机,一旦被敌机击中,则游戏结束,总界面中,有开始新游戏,查看历史前十记录,帮助,退出,等选项,本游戏还增加了合适的背景音乐和游戏音效,很大程度上提高了游戏体验。
    本游戏是一个趣味性很强,设计合理,流畅的休闲小游戏。
    关键字:小游戏;飞机对抗
    1.引言Java是一种纯面向对象的、网络编程首选的语言。Java技术作为软件开发的一种革命性技术,已被列为当今世界信息技术的主流之一。为了适应时代潮流,应该加强对Java的学习,更好的掌握这门课程。为此Java课程设计决定以“袭击”小游戏为课题,借此巩固加深对Java的了解。
    本次课程设计的实例虽然比较简单,程序设计也不是很复杂,但此程序的设计过程也是一个学习过程,更是对复杂程序的一个学习过程,还能培养我们的数学抽象能力。因此,觉得这次课程设计是非常有意义的,能为我们今后学习面向过程的程序设计作一些铺垫。
    2.设计目的与任务本课程设计所要求达到的目的和任务:通过Java程序设计的一些重要理论基础来实现动态窗口图片,鼠标跟踪事件等功能。并通过此次课程设计的训练,使学生巩固和加深对Java这门课程的理解,通过利用所学到的计算科学的理论知识,提高解决实际问题的能力,增强运算、编程和使用技术资料的技能,通过实际问题的分析设计、编程和调试,掌握应用软件的分析方法和工程设计方法,能正确阐述设计和实验结果。通过这次课程设计,培养实事求是、认真、严谨的科学态度和刻苦钻研不断创新的精神,逐步建立正确的全局观念。
    3.设计方案3.1 总体设计3.1.1 问题定义创建动态图片窗口,实现对鼠标事件的记录和跟踪这主要功能,并能播放相应的音乐,增加游戏乐趣。
    3.1.2 问题分析通过对“袭机”小游戏这一题材的分析,我需要八个类来实现相关功能。通过主类MainFrame创建各个功能所需要的实例对象,该类将其他几个类组合,包含了程序的主要功能和方法调用。再用余下、GameLoadingPanel、GamePlayingPanel、PopupMenuPanel类来实现游戏中的飞机对战功能。Top10ScorePanel类实现查看历史前十记录的功能。HelpDialog类显示帮助界面。SoundPlayer类来给游戏导入音乐。而ImageLoader类用来导入图片。
    3.1.3 研究意义通过本次课程设计,我们掌握了Java语言的基本运用,提高了理论结合实际的能力。
    3.2 设计要求
    游戏总体上使用Java语言开发设计。程序的基本功能包括飞机对战、查看记录和帮助三个部分
    飞机对战部分由鼠标移动事件侦听器确定鼠标状态,由特殊构造的类来导入图片显示界面
    背景音乐和音效应该更符合游戏,要恰当符合游戏
    游戏主界面要更人性化,有趣,简介,不单调,适当的加一些反馈音效
    游戏要简单而不失乐趣,规则不能太复杂,操作难度适中
    系统界面外观和布局,可个性化设计,总体原则是“界面简洁,操作便捷”

    3.3 游戏的主要特色
    打开游戏后玩家可通过移动鼠标来控制己方飞机移动,不仅可以击毁敌机也可以躲避敌机
    总界面中,有开始新游戏,查看历史前十记录,帮助,退出,等选项
    可以查看历史前十记录和显示帮助

    3.4 开发环境
    Windows 10专业版
    jdk9.0.4
    eclipse编辑器

    3.5 游戏的功能模块划分与游戏流程图3.5.1 游戏的功能模块划分本游戏共有七个包文件,33个java源文件。大部分都是图片及音乐导入的配置文件,以及枚举类。下面将主要功能实现的源文件讲解一下:

    MainFrame.java:该java文件生成的类负责组合本游戏所用的各个类。该类含有多个功能调用方法,程序从该类开始执行。
    GameLoadingPanel.java:该文件负责加载开始时的界面,包括窗口的建立,用图片仿造动态效果。
    GamePlayingPanel.java:该文件负责加载游戏界面以及游戏运行,包括敌方和我方飞机的加载,鼠标事件的跟踪和音乐导导入等。
    PopupMenuPanel.java:该文件负责加载出游戏主界面的菜单。
    Top10ScorePanel.java:该文件负责加载出历史前十记录界面。
    ImageLoader.java:该文件负责提前将图片的导入格式构造好。
    SoundPlayer.java:该文件负责提前将音乐的导入格式构造好。
    Config.java:该文件负责提前将图片和音乐的导入地址保存。
    BulletFactory.java:该文件负责飞机的子弹加载到界面。
    Score.java:该文件负责本游戏的历史成绩保存与读取。

    类模块图如图3-1所示。

    3.5.2 游戏运行流程图游戏流程图如图 3-2 所示。

    3.6 各个类说明3.6.1 主类MainFrame成员变量



    成员变量描述
    变量类型
    名称




    图片加载类
    ImageLoader
    imgLoader


    开始界面类
    GameLoadingPanel
    gameLoadingPanel


    游戏加载类
    GamePlayingPanel
    gamePlayingPanel


    主界面菜单
    PopupMenuPanel
    popupMenuPanel


    历史成绩界面
    Top10ScorePanel
    popupScorePanel


    帮助界面
    HelpDialog
    helpDialog


    音乐加载类
    SoundPlayer
    achievementSoundPlayer


    成绩保存表
    List<Score>
    scoreList



    方法



    名称
    功能
    备注




    MainFrame()
    创建游戏主程序
    构造方法


    Void loadImage()
    加载所有图像



    void initComponents()
    创建程序主窗口



    void loadGame()
    加载游戏开始画面



    void startGame()
    加载游戏运行程序



    void addScore
    增加和保存游戏成绩



    void run()
    运行游戏



    void exitGameAction()
    退出游戏



    void helpAction()
    帮助界面



    3.6.2 开始界面GameLoadingPanel类成员变量



    描述
    变量类型
    名称




    获取图像平台
    Image
    gameLoadingTextImg


    显示图像
    JLabel
    gameLoadingPlaneLabel


    显示文本
    JLabel
    gameLoadingTextLabel


    加载小飞机
    ImageIcon[]
    gameLoadingPlaneImgList



    方法



    名称
    功能
    备注




    GameLoadingPanel()
    加载控件
    构造方法


    createLoadingPanel()
    对画面布局管理



    loadingGame()
    游戏准备进程创建



    3.6.3 游戏运行GamePlayingPanel类成员变量



    描述
    变量类型
    名称




    子弹类列表
    List<Bullet>
    bullets


    定位取图片
    List<EnemyPlane>
    enemyPlanes


    成绩
    int
    score


    己方飞机加载
    MyPlane
    myPlane


    运动的子弹
    CatchableWeapon
    popBomb


    运动的双子弹
    CatchableWeapon
    popDoubleLaser


    游戏进程
    Thread
    paintThread


    敌机出现的时间间隔
    int
    remainTimeToPopSmallPlane


    子弹出现的时间间隔
    int
    remainTimeToPopBomb


    激光出现的时间间隔
    int
    remainTimeToPopDoubleLaser


    敌机坠毁声音
    SoundPlayer
    smallPlaneKilledSoundPlayer


    游戏背景音乐
    SoundPlayer
    gameMusicSoundPlayer


    受到攻击声音
    SoundPlayer
    getBombSoundPlayer


    游戏结束声音
    SoundPlayer
    gameOverSoundPlayer



    方法



    名称
    功能
    备注




    GamePlayingPanel()
    加载游戏画面及声音
    构造方法


    initComponents()
    加载子弹及己方飞机



    initSoundPlayer()
    加载各类声音



    onBulletLocationChanged
    确定子弹位移



    onEnemyPlaneLocationChanged
    加载敌方飞机位移



    onCatchableWeaponLocationChanged
    可捕获的武器位移



    drawScore
    绘制成绩数字



    drawBomb
    绘制子弹



    void run()
    绘制流动的战斗画面



    paintComponent()
    画面组合



    startGame()
    开始游戏



    stopGame()
    停止游戏



    3.6.4 游戏主菜单PopuMenupanel类成员变量



    描述
    变量类型
    名称




    创建窗口
    JLabel
    logoLabel


    新游戏按钮
    GameButton
    startGameButton


    退出游戏按钮
    GameButton
    exitGameButton


    历史成绩按钮
    GameButton
    top10ScoresButton


    帮助按钮
    GameButton
    helpButton



    方法



    名称
    功能
    备注




    PopupMenuPanel
    创建窗体
    构造参数


    initComponents
    创建游戏菜单



    3.6.5 游戏历史成绩Top10ScorePanel类成员变量



    描述
    变量类型
    名称




    创建窗口
    JLabel
    top10ScoreLabel


    按钮
    GameButton
    GameButton


    成绩按钮
    GameButton[ ]
    scoreButtons


    成绩个数
    int
    SCORE_COUNT



    方法



    名称
    功能
    备注




    Top10ScorePanel
    创建界面
    构造方法


    initComponents
    初始化组件



    loadScore
    加载成绩



    3.6.6 帮助HelpDialog类成员变量



    描述
    变量类型
    名称




    创建窗体
    JTextPane
    helpContentTextPane


    新建视图
    JScrollPane
    scrollPane



    方法



    名称
    功能
    备注




    HelpDialog
    构造窗体
    构造方法


    initComponent
    创建窗体视图



    4.各种功能截图游戏开始界面

    正在游戏界面

    游戏失败界面

    游戏主菜单

    成绩榜前十

    5.课程设计总结从本次课程设计的完成中,首先我们发现了我们有很多不足的地方,最突出的是我们所学的东西太少了,根本满足不了平时编写程序的需要。此外,我们了解了课程设计的要求与方法,学会了程序设计基本步骤也进一步提高了团队合作的意识。同时,使我们感觉到,一个优秀的程序,不仅仅是可以运行的,更应该具较高的效率,合理的结构,良好的可读性和一定的容错性。除此之外,我们认为一个程序的成功完成需要严谨的务实态度。由于知识的限制,我们没有做到随时暂停游戏,也没有给游戏增加多个难度和其他玩法,但是在以后的学习中,我们将会虚心学习并写出更有意义,更有趣味,更好玩的游戏。
    5 评论 219 下载 2019-06-02 11:07:10 下载需要14点积分
显示 0 到 15 ,共 15 条
eject