分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 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和Sql Server 2012实现的高校成绩管理系统

    1、需求分析计算机已经深入到日常工作和生活的方方面面,成为我们学习和工作的得力助手,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。随着越来越多的应用软件出现,人们对它的要求也越来越高;虽然现在世界上的各种软件层出不穷,但它们依然不能满足用户的各种特殊需要,所以人们仍是不得不开发适合特殊需求的软件。高校成绩管理系统记录了一个大学生成绩的系统,它的出现使得查询、更新、插入简单化,高效化,成本也随之大大减少。使用计算机对成绩信息的管理,具有手工管理所 无法比拟的优点:信息存储及时,检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学 生成绩管理的效率,也是高校成绩正规化管理的重要途径。
    本软件控件均以中文形式表示,对普通程序使用者的查询提供简单方便的快捷操作,不需要技术含量。
    以SQL SERVER数据库管理系统为平台,通过设计数据库概念模型、逻辑模型以及利用标准SQL语言的数据库实现,掌握关系数据库系统的设计与实现方法,增强数据库设计和数据库应用系统开发能力。
    操作人员与维护人员应懂的SQL语言。

    硬件环境

    LENOVO-G470
    软件环境

    Windows 8企业版Microsoft SQL Server 2012 UltimateNETBEANS 7.3

    1.1 数据需求描述
    1.2 系统功能需求
    管理员

    添加教师名单查询教师名单修改教师信息删除教师名单添加学生名单查询学生名单修改学生信息删除学生名单统计生源地信息修改密码
    教师

    查看个人信息查看每门课程平均成绩统计输入学生成绩, 自动生成该学生已修总学分查看任课信息查看学生成绩名次修改密码
    学生

    查看个人信息查看自己的课表查看不同班级的开课情况查询考试成绩修改密码

    1.3 其他性能需求
    用户输入出错时,有错误提示
    给管理员,教师,学生不同的权限,提高数据安全性
    创建触发器,存储过程,防止数据不一致


    2、概念结构设计
    3、逻辑结构设计
    教师(教师编号、教师姓名、教师性别、教师年龄、职称、联系电话)
    上课(教师编号,班级编号)
    授课(教师编号,课程编号)
    课程(课程编号,课程名称,教师姓名,学期,学时,考试或考查,学分)
    学习(学号,课程编号,学期,课程名称,成绩)
    学生(学号、学生姓名、学生性别、学生年龄、生源所在地、已修学分总数,班级编号)
    开设(课程编号,班级编号)
    班级(班级编号,班级名称,专业编号)
    专业(专业编号,专业名称)
    学生账号(学生编号,学生密码)
    教师账号(教师编号,教师密码)
    管理员账号(管理员编号,管理员密码)

    3.2 数据类型定义教师



    数据项名
    数据类型
    长度
    完整性约束




    教师编号
    char
    20
    主键,唯一,非空


    教师姓名
    char
    20



    教师性别
    char
    2



    教师年龄
    char
    20



    职称
    char
    10



    联系电话
    char
    20



    上课



    数据项名
    数据类型
    长度
    完整性约束




    教师编号
    char
    20
    主键,唯一,非空,外键


    班级编号
    char
    20
    外键



    授课



    数据项名
    数据类型
    长度
    完整性约束




    教师编号
    char
    20
    主键,唯一,非空


    课程编号
    char
    20
    外键



    课程



    数据项名
    数据类型
    长度
    完整性约束




    课程编号
    char
    20
    主键,唯一,非空


    课程名
    char
    20



    教师姓名
    char
    20



    开课时间
    char
    20



    学时
    int
    10
    >0


    考试或考查
    char
    4



    学分
    int
    4
    >0



    学习



    数据项名
    数据类型
    长度
    完整性约束




    学生学号
    char
    20
    主键,唯一,非空


    课程编号
    char
    20
    外键


    学期
    char
    10



    课程名称
    char
    20



    成绩
    int
    10



    教师姓名
    char
    20



    学生



    数据项名
    数据类型
    长度
    完整性约束




    学生学号
    char
    12
    主键,唯一,非空


    学生姓名
    char
    10



    学生性别
    char
    2



    学生年龄
    int
    4



    生源所在地
    char
    20



    已修学分总数
    int
    4



    班级编号
    char
    10
    外键



    开设



    数据项名
    数据类型
    长度
    完整性约束




    课程编号
    char
    20
    联合主键,唯一,非空


    班级编号
    char
    20



    班级



    数据项名
    数据类型
    长度
    完整性约束




    班级编号
    char
    20
    主键,唯一,非空


    班级名称
    char
    20



    专业编号
    char
    20
    外键



    专业



    数据项名
    数据类型
    长度
    完整性约束




    专业编号
    char
    20
    主键,唯一,非空


    专业名称
    char
    20



    学生账号



    数据项名
    数据类型
    长度
    完整性约束




    学生编号
    char
    20
    主键,唯一,非空


    学生密码
    char
    20



    教师账号



    数据项名
    数据类型
    长度
    完整性约束




    教师编号
    char
    20
    主键,唯一,非空


    教师密码
    char
    20



    管理员账号



    数据项名
    数据类型
    长度
    完整性约束




    管理员编号
    char
    20
    主键,唯一,非空


    管理员密码
    char
    20



    3.3 关系模式的优化对关系模式进行规范化处理,对关系模式进行评价与修正。
    4、物理结构设计4.1 聚簇设计该高校成绩管理系统数据库可建立聚簇:














    这几个聚簇设计是因为这几张表都是实体表,,且聚簇中的属性都是主键或是外键,被访问的概率很高,而其他表或者这些表上的其他属性被访问的概率就相对较低。
    4.2 索引设计索引就是表中数据和相应存储位置的列表,使用索引可以大大减少数据的查询时间。
    对于一个确定的关系,通常在下列情况下可以考虑建立索引。

    在主键属性列和外键属性列上通常都可以分别建立索引,不仅有助于唯一性检查和完整性检查,而且可以加快连接查询的速度
    以查询为主的关系可建立尽可能多的索引
    对等值连接,但满足条件的元组较少的查询可以考虑建立索引
    如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引

    该高校成绩管理系统数据库可建立以下索引:

    教师(教师编号)
    课程(课程编号)
    学生(学生学号,班级编号)
    班级(班级编号)
    学习(学号,课程编号)

    4.3 分区设计涉及到数据库文件和日志文件的分区问题。
    磁盘分区设计的一般原则:

    减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度
    分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势
    保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问

    该成绩管理系统由于程序较小,所以不进行分区设计。
    5、数据库实施建立数据库D01jiangnan

    5.1 基本表建立教师
    CREATE TABLE 教师jn( 教师编号jn CHAR(20) PRIMARY KEY, 教师姓名jn CHAR(10), 教师性别jn CHAR(2), 教师年龄hn INT, 职称jn CHAR(20), 联系电话jn CHAR(10),);
    专业
    CREATE TABLE 专业jn( 专业编号jn CHAR(20) PRIMARY KEY, 专业名称jn CHAR(20),);
    班级
    CREATE TABLE 班级jn( 班级编号jn CHAR(20) PRIMARY KEY, 班级名称jn CHAR(20), 专业编号jn CHAR(20) constraint Major_Class foreign key(专业编号jn) references 专业jn);
    课程
    CREATE TABLE 课程jn( 课程编号jn CHAR(20) PRIMARY KEY, 课程名jn CHAR(20), 教师姓名jn CHAR(10), 学时jn INT, 考试或考查jn CHAR(4), 学分jn CHAR(4));
    学生
    CREATE TABLE 学生jn( 学生学号jn CHAR(20) PRIMARY KEY, 学生姓名jn CHAR(10), 学生性别jn CHAR(2), 学生年龄jn int, 生源所在地jn char(20), 已修学分总数jn int, 班级编号jn CHAR(20) constraint Class_Student foreign key(班级编号jn) references 班级jn);
    上课
    CREATE TABLE 上课jn( 教师编号jn CHAR(20) , 班级编号jn CHAR(20) , PRIMARY KEY(教师编号jn,班级编号jn), CONSTRAINT Class_Teach1 FOREIGN KEY(教师编号jn) REFERENCES 教师jn, CONSTRAINT Class_Teach2 FOREIGN KEY(班级编号jn) REFERENCES 班级jn,);
    授课
    CREATE TABLE 授课jn( 教师编号jn CHAR(20) PRIMARY KEY, 课程编号jn CHAR(20), CONSTRAINT Course_Instruct FOREIGN KEY(课程编号jn) REFERENCES 课程jn CONSTRAINT Course_Instruct2 FOREIGN KEY(教师编号jn) REFERENCES 教师jn);
    学习
    CREATE TABLE 学习jn( 学生学号jn CHAR(20) , 课程编号jn CHAR(20), 学期jn char(10), 课程名称jn char(20), 成绩jn int, 教师姓名jn char(20), primary key(学生学号jn,课程编号jn), CONSTRAINT Course_Study FOREIGN KEY(课程编号jn) REFERENCES 课程jn);
    开设
    CREATE TABLE 开设jn( 课程编号jn CHAR(20) , 班级编号jn char(20), primary key(课程编号jn,班级编号jn), CONSTRAINT Class_Setup FOREIGN KEY(班级编号jn) REFERENCES 班级jn);
    5.2 视图的建立学生成绩统计
    create view 学生成绩统计jnas select 学习jn.学生学号jn,学生姓名jn,学习jn.课程名称jn, 班级名称jn,学习jn.教师姓名jn,学分jn,课程jn.学期jn,成绩jn from 学生jn, 课程jn, 班级jn,学习jn where 学生jn.学生学号jn = 学习jn.学生学号jn AND 学习jn.课程编号jn = 课程jn.课程编号jn AND 班级jn.班级编号jn = 学生jn.班级编号jn
    每门课程平均成绩统计
    create view 每门课程平均成绩jnas select avg(成绩jn) 平均成绩jn,课程编号jn from 学习jngroup by 课程编号jn
    学生所学课程及学分统计
    create view 学生所学课程及学分统计jn as select 学生学号jn, 课程名称jn, 学分jn from 学生成绩统计jn
    教师任课查询
    create view 教师任课查询jnas select 教师jn.教师编号jn, 课程jn.教师姓名jn, 课程jn.课程编号jn, 课程名jn, 学时jn, 学分jn from 教师jn, 课程jn,授课jn where 授课jn.课程编号jn=课程jn.课程编号jn and 授课jn.教师编号jn=教师jn.教师编号jn
    班级课程开设查询
    create view 班级课程开设查询jnas select 班级jn.班级编号jn, 班级jn.班级名称jn, 课程jn.课程编号jn, 课程名jn, 学时jn,学分jn from 班级jn, 课程jn,开设jn where 班级jn.班级编号jn = 开设jn.班级编号jn AND 开设jn.课程编号jn = 课程jn.课程编号jn
    地区学生数统计
    create view 地区学生数统计jnas select 生源所在地jn,count(学生学号jn) 地区学生总数jn from 学生jn group by 生源所在地jn
    5.3 索引的建立教师编号
    create unique index UI_教师编号jnon 教师jn(教师编号jn)
    专业编号
    create unique index UI_专业编号jn on 专业jn(专业编号jn)
    班级编号,专业编号
    create unique index UI_班级及专业jn on 班级jn(班级编号jn,专业编号jn)
    课程编号
    create unique index UI_课程编号jn on 课程jn(课程编号jn)
    学生学号,班级编号
    create unique index UI_学号及班级号jn on 学生jn(学生学号jn,班级编号jn)
    学生学号,课程编号
    create unique index UI_学号及课课程号jn on 学习jn(学生学号jn,课程编号jn)
    5.4 触发器建立当删除“教师jn”中的‘教师编号jn’记录时,需要相应地删除“授课jn”和“上课jn”里的“教师编号jn”,所以在“教师jn”上建立触发器:
    create trigger TR_DELETE_教师编号jnON 教师jninstead of deleteas delete from 授课jn from deleted where 授课jn.教师编号jn = deleted.教师编号jn delete from 上课jn from deleted where 上课jn.教师编号jn = deleted.教师编号jn delete from 教师jn from deleted where 教师jn.教师编号jn=deleted.教师编号jn
    当更新“教师jn”中的“教师编号jn”记录时,需要相应地更新“授课jn”和“上课jn”里的“教师编号jn”,所以在“教师jn”上建立触发器:
    create trigger TR_UD_教师编号jnON 教师jnfor update as if update (教师编号jn) begin update 授课jn set 教师编号jn = Ins.教师编号jn from deleted De,inserted Ins ,授课jn K where k.教师编号jn=De.教师编号jnendbegin update 上课jn set 教师编号jn = Ins.教师编号jn from deleted De,inserted Ins ,上课jn K where K.教师编号jn=De.教师编号jnend
    5.5 存储过程建立建立一个输入成绩,自动生成其总学分的存储过程:
    create procedure PRO_输入成绩自动生成学分jn@学生学号jn char(20),@课程编号jn char(20),@课程名jn char(20),@学期jn char(20),@成绩jn int,@教师姓名jn char(20)as begin update 学生jn set 学生jn.已修学分总数jn =学生jn.已修学分总数jn +(select 学分jn from 课程jn where @课程编号jn=课程编号jn ) where 学生jn.学生学号jn=@学生学号jnend
    6、系统简介登陆界面

    进入学生界面

    学生管理-个人信息

    学生管理-课程查询

    学生管理-班级开课

    学生管理-成绩查询

    学生管理-修改密码

    教师登陆


    教师管理-任课查询

    教师管理-查询自己教授不同课程的平均成绩

    教师管理-输入学生成绩

    管理员登陆

    管理员维护-管理教师信息

    管理员维护-管理学生信息

    管理员维护-生源地统计

    7、实验总结7.1 遇到的问题和解决的办法ER图,基本表设计问题
    开始的时候什么都不懂,上课学过的东西虽然朦朦胧胧有些听懂了,不知道如何使用。开始建E-R图的时候,先建好了教师,学生,班级的属性集,但是如何将他们结合起来,却是个大问题.后来与同学交流想明白,教师负责给班级授课,一个教师课上多门课程,一个班级可以选很多课,教师给学生打分时通过课程编号,班级编号,学号来选确定。
    另外加了三张表负责记录登陆时的账号和密码,为什么不把密码这一项加入学生,教师,管理员中呢?
    因为个人觉得密码一项和别的信息联系很少,独立出来更易管理。但是建的基本表越多,冗余和异常就越容易出现。
    SQL视图设计问题
    首先,刚开始写软件是一直是直接连接基本表,以为视图不会用到。但后来要实现复杂功能时,才意识到要用视图来实现,于是后期才实现视图。
    其次,我在设计基本表的时候,为了顾及信息的详细和全面,设计了12张基本表,为后面的设计带来了很大的麻烦。设计视图的时候,因为有很多信息的交叉,还有很多外键,需要很多自然连接 ,非常繁琐。
    触发器和存储过程设计问题
    表示触发器和存储过程上课没怎么讲,自己觉得很高深,一直不敢去动这一方面的设计。后来因为管理员删除教师时,必须要删除关联的‘授课表’,‘上课表’,还有教师输入某个同学成绩时,要同时修改‘学生表’中的‘已修学分总数’。才开始接触这一方面。但是语法还是理解了好久。
    由于前期理解问题,随便写了一个触发器,导致管理员无法正常删除教师,在同学细心指导下,重新写了一个trigger,测试通过。
    触发器:触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS USER_TRIGGERS 数据字典中查到。
    存储过程:存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
    用NETBENS设计软件
    其实刚开始比较偏爱Eclipse,因为它挑错能力很强,还可以利用快捷键实现代码自动生成。选择NETBEANS是因为同学推荐,支持可视界面设计,自动生成相应代码.显然相比于用代码将组件一个一个的add进panel,这会大大缩短设计时间,但是这些auto-generated-code,冗余度很大,举个例子 javax.swing.JButton;java.awt.event.ActionListener.而这些自动生成的代码不允许用户修改。由于很纠结这一点,于是把代码复制到Eclipse下,自己手动修改这些代码,但是很烦,每改一次界面设计,NetBeans就会重构代码,意味着前面白改了,后来就放弃这种吃力的方法。
    虽然不需要敲很多代码,但是为了让界面布局合理花了好多时间去调组件参数,有时候修改一个组件的参数,相邻的组件都会改变,很复杂。
    实现对jButton,jComboBox的事件监听很方便,只要求把逻辑调对就可以了。
    数据库与NetBeans连接问题
    其实前期一直以为连接数据库很烦,后来在同学指导下学会如何接.Netbeans对数据库支持很好,在netbeans的IDE可以像SQL Server一样登陆数据库D01jiangnan,查看基本表,视图,能实现select,update,delete语句.还有需要配置软件编译时的库文件,必须要把sqljdbc4.jar放到编译库中去(sql server 2008及以上用 sqljdbc.jar文件,sql server 2005 要用sqljdbc,jar).还有连接数据库有两种方式:jdbc或者jtds.
    sql语句撰写问题在调试软件的时候,很多时候都是sql语句写错了,但因为sql类型是String,编译时查不出来,需要运行相关代码时才会报错。
    7.2 系统设计的不足数据库中数据量太少
    在进行数据设计的时候,只考虑了几个最简单的数据输入,可能只能用于应付作业,并不能用于实际。
    界面比较丑
    对于netbean使用比较生疏.而且逻辑上存在问题,修改比较繁琐。
    7 评论 184 下载 2019-05-01 12:00:24 下载需要15点积分
  • 基于JAVA的远程屏幕监控系统

    摘 要远程屏幕监控系统在生活中是很常见的,学校机房的机房管理系统、PC版QQ的远程演示功能等都属于远程屏幕监控系统。监控系统的原理是通过客户端不断的截取屏幕发送到服务器端,服务器端进而将画面呈现出来的过程。本论文实现的是一个多客户端的远程屏幕监控系统。
    本论文第一部分对系统进行项目分析,包括需求分析、可行性分析、相关技术分析,大致介绍了整个项目需要做的工作以及需要掌握的技术,介绍了Socket通信原理、截屏原理、Swing树、系统托盘、自定义JPanel实现显示监控图像以及多线程的知识。
    第二部分分别对系统托盘模块、自定义协议模块、获取屏幕截图模块、连续发送与接收图片模块、登录、退出模块、多客户端处理模块、Swing树模块、自定义JPanel模块进行介绍。我没有直接搬上一大堆的理论知识,而是先简要介绍模块功能,然后按照正常思考的思路去实现项目需要的功能,并且去分析实现这个功能的必要性。遇到问题之后就分析出现这个问题的原因以及考虑如何去提升效率、减少存储空间等一系列优化问题。然后通过最后的分析给出一个优化后的解决方案,同时我将自己当时思考的错误点也罗列了出来,对多个处理方法都给予了尝试。针对每个模块都给出了功能的实现详细步骤以及示例代码。
    第三部分是Web服务器环境配置以及程序使用说明。本项目是远程屏幕监控系统,如果要测试的话,服务器端的程序是需要部署在服务器上的,所以我将本机Web服务器环境配置的方法也讲解一下,另外还有关于本程序代码如何打包等知识都有讲解。
    第四部分是我在写项目的过程中的犯的一些错误以及项目的难点,第五部分是对该系统后续的一些功能的设想,第六部分是我的一些感想,第七部分是项目运行效果的展示。
    关键字:屏幕监控;Socket;Swing;自定义协议;Web服务器环境配置
    一、项目分析1.1 需求性分析项目的初始阶段就是对整个系统进行预估,这有利于我们对整个系统的理解,屏幕监控系统需要实现的功能有:

    客户端登录、退出
    客户端截屏以及连续发送图像
    客户端系统托盘功能
    服务器端连续接收图像以及客户端其他请求
    服务器端显示连接用户的用户树
    客户端退出后用户树刷新
    客户端发送图像后显示在服务器端

    1.2 可行性分析需求性分析里提到的功能能否实现呢?我们在这里进行讨论:

    通过构造自定义协议实现,都是通过将这些请求构造成协议从而发送到服务器
    截屏功能通过Robot类实现,然后将BufferedImage转化为字节数组输出流,再转化为字节数组,并以协议的方式发送到服务器实现图像的连续发送
    使用系统托盘对象SystemTray来实现
    可以通过自定义协议工具类提供的解析数据的方法解析出数据,并根据消息类型进行相应的处理
    用户树使用JTree实现,DefaultTreeCellRenderer可以设置树的外观,为JTree设置节点选中监听器可以监听节点选中事件
    用DefaultTreeModel的reload()方法实现
    可以自定义JPanel,通过paint(g)方法绘制图片

    1.3 技术点分析1.3.1 Socket网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,java的API提供了对Socket的支持。
    1.3.2 自定义网络协议网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。为了满足我们的需求,我们需要自定义一个协议,并为其提供发送消息、解析消息的功能。
    1.3.3 系统托盘系统托盘是个特殊区域,通常在桌面的底部,项目中涉及到了对系统托盘的一些操作,我们为客户端提供系统托盘功能,可以方便用户关闭监控。
    1.3.4 IO流流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作,用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。我们主要使用的有DataOutputStream、DataInputSream、ByteArrayoOutputStream等。
    1.3.5 屏幕截图使用Robot类实现屏幕截取以及事件回放操作。
    1.3.6 AWT与SWING抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具;以抽象窗口工具包为基础使跨平台应用程序可以使用任何可插拔的外观风格。该项目主要是用到了窗口以及树控件、树的刷新、树的节点外观、节点选择事件处理等技术。
    1.3.7 自定义JPanelJPanel代表一个面板,通过实现一个继承自JPanel的DrawPanel,重写其paint(g)方法实现将图像画到视图上,如果不断修改绘制的图片,在速度达到的情况下可以实现屏幕监控画面显示的功能。
    1.3.8 多线程多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
    二、功能实现2.1 系统托盘模块2.1.1 系统托盘是个什么东西?系统托盘是个特殊区域,通常在桌面的底部,在那里,用户可以随时访问正在运行中的那些程序。在微软的Windows里,系统托盘常指任务栏的状态区域;在每个系统里,托盘是所有正运行在桌面环境里的应用程序共享的区域。
    2.1.2 有必要实现系统托盘吗?回答是肯定的,当前的大部分软件都会提供一个系统托盘让用户更加方便的操作,QQ的系统托盘左键可以打开QQ窗口,右键可以选择退出账号、注销账号、更改状态等一系列操作客户端是负责将屏幕截图发到服务器以及执行一些收到的指令,也需要与服务器端做一些交互,比如:登录、发消息、退出等操作,如果把这些处理操作放到系统托盘里可以增大用户粘性,使用户可以更方便使用系统。
    2.1.3 怎么实现系统托盘?JAVA的API提供了一系列关于系统托盘的类与方法,为软件添加系统托盘功能的步骤如下:

    我们先把图片放到src同级目录下
    首先获取图片的Image
    根据Image创建托盘图标TrayIcon
    创建系统托盘对象SystemTray
    创建弹出菜单PopupMenu,并为其添加MenuItem以及为MenuItem添加点击事件
    为托盘图标TrayIcon添加弹出菜单PopupMenu
    为系统托盘SystemTray添加托盘图标

    2.1.4 实现系统托盘代码public void showSystemTray() { Image image = Toolkit.getDefaultToolkit().getImage("img/icon.png"); final TrayIcon trayIcon = new TrayIcon(image);// 创建托盘图标 trayIcon.setToolTip("屏幕监控系统\n客户端");// 设置提示文字 final SystemTray systemTray = SystemTray.getSystemTray();//托盘 final PopupMenu popupMenu = new PopupMenu(); // 创建弹出菜单 MenuItem item = new MenuItem("退出"); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //菜单项点击处理逻辑 } }); popupMenu.add(item); trayIcon.setPopupMenu(popupMenu); // 为托盘图标加弹出菜单 try { systemTray.add(trayIcon); // 为系统托盘加托盘图标 } catch (AWTException e) { e.printStackTrace(); }}
    2.2 自定义协议2.2.1 网络协议网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。协议就是一个交换数据的规则,我们也可以自定义一个交换数据的规则,并按照规则进行数据的传输,这样我们就自定义了一个协议。
    2.2.2 为什么自定义协议?在客户端与服务器端进行Socket通信时,两者进行通信主要通过连接取得socket对象,在使用socket取得输入、输出流实现读取、写入数据功能。以客户端向服务器端发送一条消息为例:

    两者通过Socket建立连接,客户端有一个Socket对象,客户端连接成功后,服务器端也会得到一个Socket对象
    客户端得到Socket的输出流,往输出流中写字符串消息,客户端Socket关闭
    服务器端得到Socket的输入流,从输入流中读取出字符串消息,服务器端Socket关闭

    这样就实现了从客户端将消息发送到服务器端,但是如果发送多条消息就会出问题了,你会说在客户端写个死循环让它一直运行,并且发送消息之后不关闭Socket连接不就可以了吗?
    我最开始的想法也是这样的,在服务器端获取到连接的Socket后,循环接受客户端发送的消息,循环结束的条件是输入流中没有数据。
    这个方法对于文本类消息是可行的,但是客户端发送的是图片字节数组,如果还是这个方法,那么就要考虑读字节数组时读到什么位置算是读到了一张图片,想来想去,自定义协议是可以解决这个问题的。
    2.2.3 自定义协议

    type:消息类型
    totalLen:该数据的长度=消息长度+5字节
    bytes[]:实际的消息

    2.2.4 自定义协议相关类说明我定义两个工具类:Protocol、ResultProtocol类的静态常量如下表:



    常量
    含义




    TYPE_IMAGE
    发送的是图片


    TYPE_LOAD
    客户端登录


    TYPE_LOGOUT
    客户端退出



    Protocol类封装了协议的两个使用方法,方法签名如下:static void send(int,byte[],DataOutputStream)该方法将字节数组写到指定输出流中,第一个参数是消息类型(静态常量),第二个参数是字节数组型的数据,第三个参数是输出流。static Result getResult(DataInputStream)该方法从指定输入流中读取数据,返回一个包含了这些数据的Result对象
    Result类封装了一个消息的数据,包括type、totalLen、data[]
    2.2.5 核心代码//客户端登录功能Protocol.send(Protocol.TYPE_LOAD, "client".getBytes(), dos);//服务器端接收消息功能Result result =Protocol.getResult(dis);//以协议的规范向输出流中写数据dos.writeByte(type);dos.writeInt(totalLen);dos.write(bytes);dos.flush();//以协议的规范从输入流读取数据
    Protocol类的getResult方法核心:
    byte type = dis.readByte();int totalLen=dis.readInt();byte[] bytes=new byte[totalLen-4-1];dis.readFully(bytes);
    2.3 客户端模块2.3.1 获取屏幕截图BufferedImage bfImage = robot.createScreenCapture(new Rectangle(0, 0, width, height));
    其中width,height是屏幕的宽高,截取屏幕用的是JAVA提供的Robot类,Robot类可以模拟用户的行为,如控制鼠标、打字等一系列操作。所以可以使用Robot实现屏幕截图以及事件回放的功能。
    2.3.2 将图片以协议的规范发到服务器我们获取到了屏幕截图的BufferedImage,那么应该怎么将它传到服务器呢?先看我的初期想法:
    通过ImageIO将BufferedImage写到一个File里,然后从这个文件的输入流中读出数据至字节数组中,然后使用协议工具类把这条消息发出去就可以了。这里会产生问题:应该把BufferedImage写到哪个File,我们有三个选择:

    a.每次获得一个BufferedImage就新建一个File
    b.程序启动后初始化创建一个File
    c.写到临时文件中,并设置程序退出删除临时文件

    针对情况a,可以顺利的发送图片。但是由于获得屏幕截图后需要创建文件,向文件里写数据,然后再读出来,给我一种感觉就是好像做了重复的工作,效率不高;并且每得到BufferedImage后就创建一个File,因为系统每隔50ms就会截取一张图片,每张图片都大于1M。我测试的时候仅仅运行了十多分钟我的一个磁盘就被写满了,这样势必会产生两个问题:效率问题、空间占用问题。
    针对情况b,系统在获取BufferedImage后往一个固定的File里写数据,从这个File里读出数据,这个方法只生成一个文件,然后不断的在这个文件里进行读写操作,这样处理的话内存占用确实会少很多,但效率不会提升,并且在实际中使用的时候发现系统会报异常:文件损坏错误。异常的原因其实也很简单,因为屏幕截取的速率是很快的,截图之后就会往File里写数据,如果此时上张图片还没有读完,那么就会导致文件损坏。
    针对情况c,经我试验,任何用处都没有,临时文件在程序结束后也没有删除,虽然这个方法失败了,但也是一种尝试。
    经查阅资料发现,通过直接将BufferedImage转化为字节数组从而达到我们对空间、速率上的要求,以下是具体过程:
    经查阅资料发现ImageIO类可以直接将BufferedImage对象写到字节数组输出流中,然后我们在将字节数组输出流的数据转化为字节数组就可以了。
    ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(buffedImage, "png", baos);Protocol.send(Protocol.TYPE_IMAGE, baos.toByteArray(), dos);
    2.3.3 系统退出机制我为客户端的托盘提供了[右键菜单>退出]选项,客户端有一个布尔类型的变量标志是否生存,系统会检测这个值然后执行循环:截图,发送,休眠。当用户选中退出时,系统先想服务器发送一个退出请求,然后更改变量标志为false,并关闭掉socket连接以及输入、输出流,正常退出。为了让系统更加的健壮,我们要对系统异常捕获以及处理异常。
    2.3.4 客户端代码final Client client = new Client(); client.conn("192.168.1.101", 33000);//连接服务器 client.load();//登录 client.showSystemTray();//显示托盘 while (client.isLive) { client.sendImage(client.getScreenShot()); try { Thread.sleep(50); } catch (InterruptedException e) { System.exit(0); } }
    2.4 服务器端模块2.4.1 服务器逻辑服务器端程序运行后,创建ServerSocket,然后不断的接受连接上的Socket,每当客户端连接上,就将Socket交到一个线程手里,由该线程负责该客户端的所有交互行为,服务器应该有一个Map保存客户端IP与Socket的对应关系
    服务器端接受到客户端发来的登录请求,将它的IP作为Key,Socket作为Value保存到Map中,将连接上的用户显示在控制界面View的用户树上
    服务器端接收到客户端发送的发送图片请求,将字节数组转化为BufferedImage,将这张图片重绘到控制界面的屏幕监控视图上
    ByteArrayInputStream bai=new ByteArrayInputStream(data);BufferedImage buff=ImageIO.read(bai);//为屏幕监控视图设置BufferedImageServer.view.centerPanel.setBufferedImage(buff); Server.view.centerPanel.repaint();
    服务器接受到客户端发送的退出请求,从控制界面View的用户树上删除该客户端IP,从Map中删除该客户端IP,关闭当前客户端的Socket,释放掉资源。
    2.4.2 对多客户端的处理界面分为两部分:左侧的用户树,右侧的监控区域。
    用户树显示当前连接到的所有客户端IP地址,右侧的监控区域显示当前监控的客户端的屏幕图象。
    在一个客户端的情况下,服务器端接收到客户端的图像就显示在监控区域上。当有多个客户端连接的时候,如果服务器端不对消息进行过滤的话,那么在监控区域上会轮流显示各个客户端的屏幕监控,所以需要在服务器端标记当前监控的IP地址,当有客户端发过来图像的话,将客户端IP与标记的IP进行比对,如果相同才把图像显示出来,否则就将消息丢弃掉。这里要涉及到几个知识点:用户树的刷新、用户树的选中事件处理、用户树的节点样式
    我们用以下的方式创建一棵树
    model=new DefaultTreeModel(root);JTree tree=new JTree(model);//刷新用户树DefaultMutableTreeNode node1=new DefaultMutableTreeNode(nodeString);root.add(node1);model.reload();//用户树节点选中事件的处理tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { JTree tree=(JTree) e.getSource(); DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); String nodeName=selectionNode.toString(); Server.curKey=nodeName; }});
    用户树的节点样式是通过DefaultTreeCellRenderer来实现的
    DefaultTreeCellRenderer cr=new DefaultTreeCellRenderer();cr.setBackgroundNonSelectionColor(Color.darkGray);cr.setTextNonSelectionColor(Color.white);tree.setCellRenderer(cr);
    2.4.3 服务器端对客户端消息请求的处理客户端与服务器的一系列交互在客户端连接上之后就被交予一个线程来全权负责了,服务器端通过协议工具类的解析数据的方法获取到消息类型、消息长度以及消息内容,将消息类型以及消息内容交予一个函数来处理
    Result result =Protocol.getResult(dis);handleType(result.getType(),result.getData());private void handleType(int type,byte[] data) { switch (type) { case 1://处理图片请求 break; case 2://处理登录请求 break; case 3://处理退出请求 break; }}
    三、Web服务器环境配置3.1 简述本系统分为两个端:server端、client端,使用时,应该将Server端部署在服务器上,服务器可以使用远程服务器,也可以使用本机PC作为服务器进行测试,以下以本机PC搭建局域网服务器为例
    3.2 工具win7系统的笔记本
    3.3 搭建过程
    开始>控制面板>程序与功能>打开或关闭window功能>展开Internet信息服务,选择Web管理工具、万维网服务以及其子选项,点击确定
    开始>控制面板>管理工具>Internet信息服务管理器>点击默认的网站,配置网站路径、端口之后即可访问了

    3.4 使用方法
    查询服务器IP

    在服务器端打开命令提示符,输入ipconfig,找到其IP地址,即IPV4地址
    修改代码

    本代码客户端默认连接ip为127.0.0.1的服务器,即本机,所以我们修改这个IP。在Client类中有一个main方法,它是程序的入口,当客户端连接时是调用Client对象的conn方法,只需要将这个方法中的参数修改为查询到的服务器IP地址即可
    程序打包

    项目下有三个包:Server、Client、Util,需要注意的是Util包下存放的是客户端和服务器都需要用到的工具类,所以不管是服务器还是客户端在打包时都需要包含Util包,另外客户端用到了系统托盘图标,所以打包时需要用到图片,需要包含img文件夹
    程序运行

    在搭建好web环境的PC机上运行服务器端,在其他电脑上运行客户端要注意先运行服务器端程序,再运行客户端程序,客户端与服务器端建立连接成功后会显示系统托盘,服务器端运行后会有一个窗口,当有用户连接上时在服务端右侧界面会显示客户端PC机屏幕,当有多个客户端连接到服务端时,左侧用户树会显示所有客户端IP,点击树节点就会切换监控用户

    四、项目难点4.1 客户端循环发送图片的问题图片是字节数组,循环发送的话会导致服务器端找不到图片截止的标志,无法获取图片。就是因为这个需求我才会想到自定义协议,通过构造一个协议发到服务器,服务器就可以知道读取到什么位置是一张图片。为了性能与空间上的要求,我们需要找一种可以直接把图片转化为字节数组的方法。
    ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(buffedImage, "png", baos);
    转化之后baos.toByteArray()就可以将其转化为字节数组。
    以下方法可以将字节数组转化为图片:
    ByteArrayInputStream bai=new ByteArrayInputStream(data);BufferedImage buff=ImageIO.read(bai);
    4.2 服务器端线程里操作JPanel重绘在线程里操作,那么要把这个Panel设为静态的,程序里有好几个地方都需要设置成静态的,如保存客户IP与Socket的Map、View的实例对象。
    这是自定义的一个继承自JPanel的类DrawPanel,根据我们的需求,我们要在这个JPanel上不断绘制从客户端传回来的图像,所以该类需要提供一个方法来设置绘制的图像。方法签名如下:
    void setBufferedImage(BufferedImage bufferedImage)
    将bufferedImage设置为当前要绘制的BufferedImage:
    void paint(Graphics g)
    重写该方法,内部是利用g绘制当前的BufferedImage到视图上。
    当操作JPanel重绘时只需要两步就可以了:

    调用该类实例对象的setBufferedImage(BufferedImage bufferedImage)方法设置要绘制的图像
    调用实例对象的repaint()方法重绘JPanel

    4.3 对异常的处理客户端异常退出时会造成空指针异常、CG异常、连接关闭异常、IO异常、文件读写异常等,这些异常都是在项目中出现的。在出现异常后,不要惊慌,首先根据系统提示一步一步排查,当排查到某行代码上时,仔细分析出现错误的原因,比如空指针异常,那么要考虑变量值为什么是空,要考虑变量是否是静态的,要发散思维看待问题。为了使系统更加健壮,我们要捕获异常以及对异常进行处理。
    五、展望任何一个优秀的作品都需要不断的改进,那么我来说一下因为时间原因来不及完成的几个功能以及大概实现思路,也算是对这个系统的展望吧。
    5.1 事件回放功能事件回放功能是当客户端与服务器端建立连接后,客户端向服务器发送屏幕截图的同时,将客户端的鼠标、键盘等事件一起发送出去。当服务器接收到之后,利用Robot对象对整个事件进行事件回放处理,那么服务器端的监控区域不仅仅只显示客户端的屏幕,而且还有鼠标、键盘等事件。
    5.2 远程控制功能目前只实现了远程监控功能,在服务器端只能看到客户端发生了什么,但并不能对客户端进行任何操作。由于在上边定义了一个协议,所以实现这个功能也很简单。只需要在拓展几种消息类型即可,服务器端确定要控制的客户端IP,并将服务器端的事件封装之后用协议工具类将消息发送到客户端,客户端根据消息类型进行判断,如果是控制类型的指令,那么就将事件对象在客户端进行回放。这样就实现了一个简单的控制功能。
    5.3 聊天模块其实论文写到这里聊天模块的实现已经没有难度了,其实在客户端登录的时候就用到了这个功能。客户端登录是向服务器发送了一个字符串,只不过服务器端接收到消息后并没有回应。如果客户端让用户输入字符串,系统将消息发送到服务器端,服务器端对消息进行提醒、显示,并给服务器端提供一个输入区域,将回应的消息发送到指定IP的客户端。那么一个简单的1对1的即时聊天模块就算实现了。
    5.4 UI优化现在的系统UI太粗糙了,因为Swing本身做UI不是很有优势,我对这方面了解的不是很深。对UI优化可以使用已有的LookAndFeel或者使用其他的开源库。后续可以尝试为服务器端界面加上工具栏以及图标、点击效果。
    5.5 Log日志记录Log日志记录功能是当系统运行时将Log日志输出到log文件中,Log日志保存的是一个软件的运行状态。
    六、感想通过做这个项目发现对零碎的小知识点掌握的不牢固,例如图片与字节数组的转换、系统托盘实现等一些功能都是现学现用的。其中在线程中操作View中的对象是其中最让我头疼的地方,因为那个对象没有用static导致一直获取不到数据,一下子就困惑了一天。目前系统已经完成了,回头想想,整个系统的开发并不是很难,流程很清晰,整个的难点就是那个循环发送字节数组的问题,使用自定义协议这个方法后问题也就解决了。项目开发中可能会遇到一些奇怪的事情,但是不要着急,一步一步缩小查找范围还是可以找到错误的原因的。项目主要用到了Socket通信原理,socket通信有很多的应用,我们可以用socket做即时通信软件、联网游戏、文件上传下载工具等等。突然发现学的东西还是挺有用的,在这里要谢谢任课老师在课堂上对知识点进行认真的讲解,我从中学到了很多。
    总之呢,写软件是个很磨人的过程,我们可能会一直犯错,有时候感觉自己看出错在哪了,改正过之后竟然还是有错,并且有时候的错误会使我们感觉很无奈。如果能够坚持下来写几个小项目,那么对自己的能力绝对是一个大的提升。
    附 录图1:服务器端运行,此时无客户端连接

    图2:服务器端运行,此时有客户端连接,左侧为用户树,树节点为客户端IP,右侧为监控区域,显示的是被控端的屏幕画面
    3 评论 153 下载 2018-11-03 13:54:55 下载需要10点积分
  • 基于WEB和Oracle的仓库管理系统的设计与实现

    摘 要仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地,要想继续的发展与生存,没有现代化的管理方式与方法是万万不行的,仓库管理的全面信息化、自动化则是在其中占有极其重要的地位。仓库管理信息系统则是在此需求背景下开始研制并开发的。在此篇文章中严格按照软件工程思想,设计并实现了一个仓库信息管理系统。介绍了系统从需求分析,逻辑设计,总体设计,详细设计以及系统测试、实施各阶段的主要内容和成果,包括系统结构图、业务流程图数据流程图、物理表实现及其关系、功能模块算法流程、界面设计等等。
    关键字仓库;软件工程;系统开发
    AbstractWarehouse management is a major issue is closely related to our daily life. With China’s rapid economic development and the deepening of reform and opening up, the enterprise to be in an invincible position in the fierce market competition, want to continue development and survival, no modern management methods and methods is absolutely out, warehouse management and comprehensive information, automation is where you play a very important role. Warehouse management information system is started research and development in the context of this demand. This article strictly according to the software engineering, design and implementation of a warehouse management system.Introduced from requirements analysis, logic design, General design, detailed design and system testing, implementation of the content and results of each stage, including charts, business process data flow chart, functional modules algorithms, physical form and its process, interface design and so on.
    Keywords: warehouse Software engineering; System development
    1.绪论现如今,计算机技术飞速发展,社会经济也在伴随着不断发展,各行各业也面临着各种各样的挑战与困难。为了能够在这个信息化的时代继续发展下去,就必须紧跟上时代的脚步。在这个计算机技术飞速发展的年代里,智能化的商品存储管理技术也在随着不断地发展。之前的那些古老的仓库管理化的方法已经难以满足现代化发展的需求,因为许多些原因,企业要想在这个现代化的社会中生存下去都必须有一个良好的仓库管理系统。仓库是每个企业都必须谨慎管理的地方,一个企业的最基本是货物,所以一个企业的货物必须得得到很好的保管,在这片竞争激烈的土地上面才能谋得一块生地。本课题正是根据这一理念,开发了一个功能比较完善,基本能满足企业要求的仓库管理系统。
    1.1 系统背景在这个科学技术不断发展的年代里,世界已经变的越来越高科技化越来越智能化,一个智能化的时代已经到来。到现在为止,在我们生活的周围你可以随处见到各种各样的智能化管理的系统[7]。
    一个企业所拥有的商品是他所生存发展的根本,而仓库是企业用来保存商品的所在。所以说,一个好的仓库对于企业来说占有举足轻重的地位。总而言之,一个成功的企业必定会有一个好的仓库,但是一个好的仓库没有一个合理的管理系统是不完美的[7]。可是一个静态化的简单的仓库管理的系统,因为他不具备信息共享的功能,而且还不能够保证货物的正常运转中所遇到的一些问题,还不能保证企业所拥有资源的正常的运转与利用;还有一些传统的仓库管理系统在维护时非常的困难开发起来也是十分复杂,所以在人力物力上有极大的浪费,已经远远的脱离了时代的轨道。因此,一个成功的企业,如果拥有了一个现代化的仓库管理的系统,会大大的提高企业生产的效率,降低使用的成本。
    1.2 开发目的仓库是所有企业都不可缺少的部分,对于一个成功的企业来说,想要在未来的市场中获得发展得优势,拥有一个完善的仓库管理系统是十分重要的。可是企业中的商品总是在不断地流动的,仓库中的商品也随之不断变化。所以,商品就需要不停的被记录保存。在使用传统的人工记录时存在着各种各样的问题,查询的效率低下,而且保密性不高。因此,对于一个想要不断发展的企业来说,这种人工记录的方式必须淘汰。
    在现代化科技的不断发展前景之下,智能化的东西已经遍布各地,电脑更是遍布在各个角落。计算机技术的应用对库存信息进行管理与人工管理技术相比较拥有无可比拟的优势,如:添加删除快捷、安全性高、查询便捷等。
    在以上这些社会与技术的背景之下,我决定开始开发了这个系统。在开发的这个系统能够保证对货物进行正确的出库与入库擦偶哦、库存控制和发货。而且,这个系统比较小维护起来简单,能够节省一定的人力物力,对企业中仓库的管理是百利的。
    1.3 开发工具1.3.1 EclipseEclipse 开发工具是一款源代码完全开放的、主要用于可扩展性开发Java语言的一种开发工具。对Eclipse本身来说,他仅仅只是一种服务和框架,主要是通过一些插件与组件来组成开发的环境。主要的优势有Eclipse自身带有一种标准化的组件集合,含有Java的主要开发工具JDK。Eclipse具有十分丰富的开发环境,主要包括有超强的编码能力、拥有玩备的调试功能、发布能力与测试功能等,全部支持了Hibernet、Struts、Mybatis、JSP、Spring、SQLPlus等等的一系列的框架。
    1.3.2 Oracleoracle是一家公司的名字(甲骨文公司),世界上屈指可数的,是国际上非常大的巨型IT公司,是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司最有名的产品是DB,database,RDBMS,关系型数据库系统。
    1998年9月,ORACLE公司正式发布ORACLE 8i。“i”代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一款版本为数据库的用户提供了更加全面的全方位的Java技术支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库。
    然后有9i,10g。在这个版本更新的最佳看点是一起加入了网格,然后是11g,现在发展到12c,c代表cloud,也是现在炒的非常火的概念。
    1.3.3 PowerDesigner在数据库的设计过程中,运用Power Designer作为数据库模型的主要的建模工具。在庞大的赛贝斯公司旗下的主要的CASE开发工具集之一就是PowerDesinger,运用这个工具的最大看点是更加快捷并且方便的对仓库管理系统进行开发,数据库开发所需要的模型与需要的经历基本全部都能实现。例如数据流程图、概念数据模型、物理数据模型等一系列的模型都可以通过使用PowerDesigner来实现,可以生产出各种各样的PC端开发出来的应用软件,也可以给系统的设计制作出系统的结构模型,也能够为一些开发团队的系统模型进行调控。Power Designer还可以跟各种现如今使用比较多的用来设计数据库的软件,比如:Power Builder,StartUML,VB等相互配合来使用,以便于用来减少开发的时间与优化系统的设计。
    1.4 相关技术介绍1.4.1 JSP技术JSP技术使用起来是非常灵活的,可以用来便携JAVA程序的。本技术还可以用来对一些编程的动态的网页来进行封装。网页还可以访问一些在服务器端的各种资源的一些逻辑应用。JSP技术还可以将一些网页的逻辑与网页的设计和还有显示进行分离,对于一些可重用的基础的组件的开发进行支撑,更加容易的对基于Web的应用程序进行设计。
    在现今,计算机技术在不断发展,Web 技术也随之不断的发展,产生了许多方法来解决动态页面的生成问题,目前用于声称动态网页的技术有CGI、ASP、PHP及JSP。JSP技术可以为做动态网页的创建提供一个更加方便快捷的方法。JSP 是Java Server Page 的缩写,是Sun 公司于1999年6月推出的新技术,该技术由Sun 公司主导,采取了了一些在电脑的软件与硬件、数据库、还有通信等领域的多个家厂家的建议与意见而一起制定出来的一种在Java与Web基础上的一种动态的网页技术。
    JSP技术与之前传统的网页制作技术相比较,它有着明显的优点。JSP 不像CGI、ISAPIH 和NSAPI 那样难于编写和维护,不像PHP 那样只能适应中小流量的网站,也不像ASP 那样受到跨平台的限制,JSP 体现了当今最先进的网站开发思想。
    在服务器端接收到客户端发送出来的请求时,开始运行的程序段,接下来将JSP文件中的代码还有代码在运行之后效果同时回馈给用户。通过Java文件的插入能够对数据库、网页的一系列多重的定向等运行,从而满足构建动态网页所需要的程序。JSP是Servle的一种动态表现,而且都可以通过服务器端来运行。由于能够将一个HTML文本返回给用户端,所以用户端具备浏览器就可以进行浏览。HTML程序与穿插在其内部的Java程序可以共同构建动态的JSP网页。在服务器被用户的客户端访问的时侯,能够同时处理相应的Java代码,然后将产生的HTML页面再返回给用户端的浏览器。JSP的设计关键是Servlet,通常大型的Web应用程序的设计成果也通过Java Servlet与JSP相结合来实现的。JSP既拥有了方便快捷的Java程序,又统统的面向用户,既实现了平台的无关性危险还比较小,可以具备互联网的全部优势。JSP技术的优点:

    能够一次性完成编写,到处运行。不包括系统在内,代码基本不需要在写
    系统的多平台支持。通常情况下,能够在所有情况下的全部平台上进行设计,能够安排在任一情况中,也能够在所有的情况下进行发展。相比ASP/.net来说,优点是十分明显的
    强大的可塑性。通过一个不大的Jar程序能够对Servlet/JSP进行运行,也能够通过很多服务器进行集群和负载平衡,甚至能够通过多台Application解决问题。单个的服务器到多个的服务器,Java展示了一个强大的功能
    Java已经有了很多的设计方法,何况大部分工具都是没有花费的,这中间有很多都在多种平台之下顺畅的进展
    支持服务器端组件。只有很有力的服务器端组件才能支撑web运行,因此开发者可以在调用web页面时通过另外的开发工具来达成纷乱效用的组件,来加强系统的可操作性。JSP可以通过完善的JAVA BEANS 组件来达成纷乱的商务功能

    在JSP的内部对象中会表现出来:客户端发送请求使用request,这个请求会涵盖到来自于GET/POST参数的请求; 服务器端传回客户端的回馈使用response;管理pageContext 网页的属性;session 与请求相关的会话;application servlet正在进行的内容;输送响应的输出流使用out;config代码片段配置对象;page JSP网页本身。
    JSP 与ASP(Active Server Page) 的区别
    从上面的基本介绍中,乍一看觉得JSP 与微软的ASP 十分相似,但事实上,两者有着本质的不同,我们主要从以下几个方面对其进行比较:

    Web 服务器的支持:大部分的支持WEB的服务器段例如:Apache、IE、Netscape 和Microsoft IIS 等一系列服务器都可以运行JSP 。ASP的却很难再除了微软之外的平台上继续的运行与移植
    平台的支持:平台具有一定的独立性,所有的能够支持java程序的平台,都可以支持JSP的运行。Windows 平台可以很好的支持ASP, 但ASP 难于移植到其它平台上
    组件模型:JSP 所在的平台是建立在跨平台的、这上面的所有的组件都是可是重新利用的。而ASP 使用的平台却是建立在Win32的COM 组件模型之上的,所使用的组件没有JSP的灵活
    脚本语言:JSP是比较万能的能够灵活的使用JAVA语言或着与其他的脚本语言如javascript相互配合使用。可是ASP使用起来比较局限,只能使用Jscript 或者是VBScript两种语言来作为脚本语言,不够灵活
    安全性:JSP的安全模式是使用Java 的安全模型,但是ASP的安全模式使用的是Windows NT的安全模式两者各不相同
    与Access数据库的连接:Access 数据库在与JSP 相连接的时候使用的连接方式是JDBC连接,而Access 数据库与ASP相连接的时候使用的是Data Active Objects
    用户定制的标签:JSP有一个很好的功能是用户可以自己定义一个属于自己的标签库,并且可以灵活运用。然而ASP 中用户却不能自己定制标签库,原因是在 ASP 中用户是不可以对标签库进行扩充的
    JSP 与Servlet 的区别:从某种意义上讲,JSP 并不是一种新技术,因为JSP 可以完成的工作,都可以通过编写Servlet 程序来实现。而且,JSP 页面中动态的、交互的部分最终也都是需要再编译为相对应的Servlet程序来实现。所以,可以说,JSP其实是Servlet 的一种抽象,它提供了更加方便有效的方式来编写Servlet
    JSP 与CGI 的区别:JSP 与CGI 两者之间有一个很明显的最大的差异点,JSP在编写时与编译HTML时是很相似的两者的差异不大,在语法上有些不同只要了解JSP的语法即可,不需要对JAVA、JScripety等语言有过多的了解。而编写CGI 程序要求对脚本语言十分熟悉,因为CGI 程序基本上是用脚本语言直接写的。除此之外,在使用CGI 程序的时侯,对每一次的访问他都会进行处理,可是这样的结果会造成在多个用户的请求被处理时,会造成力不从心的局面,不会得到满意的结果。可是JSP在编译时只能编译一次,在此之后会驻留在内存中,再次调用时,不必重新处理,适于应付多用户情况

    1.4.2 JavaScript技术JavaScript语言是脚本语言中直译式的一种,属于动态类型、弱种类型、原型为基础的语言,支持类型的语言。JavaScript引擎是他的解释器语言,属于浏览器中的内容,常常用在客户端的一种脚本的语言,早期常常在HTML所编译的网站上面运用,主要的功能是在HTML的基础之上增加一些动态的功能。 在1995年时,由Netscape公司的Brendan Eich,在一个叫做网景导航者的浏览器上第一次实现而成。由于Netscape的合作者是SUN,所以在Netscape的管理层们希望把他的外观做起来像JAVA,出于种种的原因给他取名叫做JavaScript。可是在实际上多了解了解它的语法风格会发现是与Self及Scheme比较接近的。为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。
    为了能够将规格得到统一,因为JavaScript兼容于ECMA标准,因此,也称为ECMAScript。
    JS技术特征

    脚本语言
    解释性语言
    弱类型语言
    事件驱动
    动态性
    安全性
    跨平台性(兼容性)

    1.4.3 TomcatTomcat 从一定的意义上面来说他并不只是一个APP Server, 它仅仅只是一个可以支持并且运行Serlvet/JSP 的Web 的容器,而且他还具有一些传统的Web 服务器所具有的一系列的功能。可是他跟Apache 相对比,Tomcat处理静态的HTML 的能力就比不上Apache。 因此,我们可以把Tomcat与Apache 集成到一块,然后运用Apache 处理静态HTML, 最后在利用Tomcat 处理JSP 还有Servlet。这几种技术之间相互配合。这种集成只需将Apache 和Tomcat 的配置文件作出修改就可以了。
    Tomcat 也扩展了一些App Server 的功能,如JNDI, 数据库连接池,用户事务处理等等。Tomcat 被非常广泛的应用在中小规模的Java Web 应用中。在Tomcat5中,在Servlet2.3 中拥有一些事件监听器的功能我们可以利用这些功能来对事应用或者Session 等进行一些列的实行监听。Tomcat 还有好多其他的一些特征,如与SSL 集成到一块,实现安全传输。很多中小应用不需要采用EJB 等技术,JSP 和Servlet 已经足够,这时如果用应用服务器就有些浪费了,我们自然会选择Tomcat。
    JSP 和Servlet的开发主要是在Tomcat的基上来进行开发的,JSP 与Servlet的开发并没有想象中的麻烦,一般的一些文本编辑器或着IDE都是可以开发的, 最后,把这些东西压缩为成WAR格式的就可以了。另外,也可以利用标签库实现Java 代码与HTML 文件的分离,使JSP 的维护更方便。
    Tomcat 也可以与其它一些软件一起来实现更多的功能,如与JBoss 集起来开发EJB, 与Cocoon 集成起来开发基于XML 的应用,与OpenJMS 集成起来开发JMS 应用,除了这几种,可以与Tomcat 集成的软件还有很多。
    1.4.4 软硬件需求
    硬件需求

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

    操作系统版本:Windows XP /vista/Win7开发工具:MyEclipse 6.0.1后台服务器:Apache Tomcat 6.0开发语言:Java浏览器:F6.0

    1.5 可行性研究分析可行性分析能够让系统用最低的开发成本来获得最高的经济效益。可行性分析目的是根据所开发系统的用户需求,明确研究方向,明确目标[1] 。通过一些社会上的调查以及一些系统的框架设计功能模块的分析,找到可行的方法。对要设计实现的仓库管理系统从技术上、经济上、操作上、法律上进行可行性研究调查,这样既能够保证信息资源的合理利用,也能够避免在设计程序过程中因失误而导致的系统错漏问题,协助我们对设计做出更加合理和可惜的抉择[6]。
    对所有系统完成设计,都可能受到时间以及空间上的制衡。因此,在开始设计每一个项目的时候,我们必须对系统进行可行性需求分析,只有这样才能够降低项目所带来的危害,减少人力、物力以及财力方面的损耗。在这里简单了解一下对技术、经济、系统和发展方面的可行性分析。
    可行性研究这一部分的主要目的是探讨问题是在定义阶段所确定的问题有没有可行的解,可行性研究是必须的。在这个主要的阶段是从经济可行性、技术可行性、操作可行性和法律可行性等几个可行性来讨论项目是否能够解决及是否值得去解决。通过可行性研究可以减少一些不必要的损失。
    1.5.1 系统目标可行性分析本系统可以用最小的时间、经费充分帮助仓库管理人员进行仓库货品的数量进行管理,可以对商品的类型、出入库时的数目、还有时间方面进行查询。也可以对客户使用货物查看货物,货物与供应商之间进行辅助。
    1.5.2 系统的经济可行性仓库管理系统是基于JSP技术来开发,采用的软件都是开源的,这样能够削减很多的精力和资源,降低开发成本,同时也能够提升设计的作用,所以系统在开发人力、财力要求不高,具有经济可行性。
    1.5.3 系统的技术可行性在本系统的开发包含有前端的程序开发与后台的数据库的连接与数据库的维护。对于应用程序的开发则是要使用起来比较简单上手而且要兼具各方面的功能,而对于数据库的建立和维护必须要求有一套完整的数据库、数据必须要安全稳定。本系统开发的重点就是对数据库的设计和操作。在大学对软件工程,软件测试,UML统一建模语言等课程进行过系统的了解,也能够对这些课程进行开发,能让我们能够进一步辨别、开发与检验系统。所以,本仓库管理系统系统的开发在技术方面必定是高效的。
    仓库管理系统是一个数据库的管理查询系统,要求运行环境、硬件、软件不高,操作简单,完全可以运用我们的技术实现系统的功能。
    1.5.4 系统的法律可行性本系统完全是自己设计的管理系统,对于本人来说具有重大的实际意义。开发环境软件和使用的数据库都是开源代码,因此对这个系统进行开发与普通的系统软件设计存在很大不同,没有侵权等问题,在法律上完全具有可行性。
    综上所述,设计一个仓库管理系统具有效率高,操作简便,降低成本等优点,是必要可行的。
    2.软件需求分析软件需求分析是开发的第一个阶段,也是软件开发周期中的一个非常重要的阶段,根本任务是确定用户对软件系统的需求。它是项目开发的基础,它确定软件系统做什么,具有什么功能性能,有什么约束条件等。在软件的需求分析阶段所得到的结果在后期的软件开发的过程中是十分重要的,经过严格评审并得到用户确认是必须经过的。
    2.1 需求分析需求分析是系统开发的首要步骤,直接影响系统整体性能和功能的最主要的步骤。系统的需求分析最重要的是对系统的可行性、性能和功能等方面进行具体地分析。不合理的需求分析,会使系统的开发环节出现许多错误和走许多弯路,导致系统开发时间长,效率低,系统质量受到影响[8]。
    2.1.1 用例图仓库管理系统分为系统管理员和客户等不同种类的用户角色。在本系统的整个的用例功能模块包括管理员管理、用户管理等模块,管理员模块的主要功能包括查看库存信息,修改信息,用户管理,产品入库,产品出库等功能,如图2-1所示为仓库管理员用例图。

    用户模块的功能主要包括有库存信息的查找,用户信息的修改,用户管理等功能,如图2-2所示为客户用例图。

    2.1.2 类图仓库管理系统中有管理员、客户、还有货物三大类。如图2-3所示为仓库管理系统的三大类之间的类图关系。

    2.2 功能需求分析
    登录验证功能:为了保证仓库管理系统信息的安全性,进入系统时需要对用户身份进行验证,如果验证无误可成功进入系统,如果用户名或者密码不正确将返回错误提示要求重新输入
    管理员管理功能:此功能属于系统的管理员功能,他实现了对所有用户的管理操作,可以添加一个新的用户,也可以对已经添加的业务员进行删除的操作
    用户的查询功能模块:此项功能属客户管理员功能,用户可以根据条件查询客户信息,也可以对客户信息进行修改
    仓库存储的查询管理功能:此功能属系统管理员与客户共有的功能,客户可以实现查看、入库以及出库等功能,两者都可以查看库存信息
    用户的信息管理模块:此项功能属于用户管理员的功能,业务员可以对自己的客户信息进行管理与修改

    2.3 业务流程分析仓库管理系统主要分为两大用户功能,两种功能所实现的功能流程如下所示。
    2.3.1 管理员模块业务流程仓库的管理员可以通过帐号和密码验证之后进行登录,登录到系统之后主要的功能是对商品与用户的信息进行管理,主要流程如图 2-4 所示。

    2.3.2 客户模块业务流程分析管理员可以通过帐号和密码进行登录,登录后的主要功能是对用户与品信息的管理,主要的功能包括查看用户信息、修改用户信息、对库存商品进行查看等。主要业务流程图如图 2-5 所示。

    2.4 数据流程分析基于对业务流程的分析,对数据流分析。
    2.4.1 顶层数据流现行的顶层数据流图如图2-6所示。

    2.4.2 一层数据流图具体分析第一层数据流图,包括有商品的管理、用户信息的管理。商品管理,主要包括用户对产品的入库操作、查询操作、出库操作等一系列的处理以及管理员对产品的管理。用户管理,管理员能对用户的信息来操作。详细流程图如图2-7所示。

    2.4.3 二层数据流图具体分析第二层数据流图,包括的功能信息有用户注册、用户登录,产品入库,产品查询,产品出库等功能。
    用户注册模块数据流图如图2-8所示:

    用户登录功能的数据流图如图2-9所示:

    商品入库功能模块的数据流图如图2-10所示:

    如图2-11所示为商品查询功能模块的数据流图:

    如图2-12所示为商品出库模块的数据流图:

    2.5 数据字典分析2.5.1 数据存储条目
    文件名:用户信息表
    组成:本次刚刚注册用户 + 之前注册过的用户组织方式:索引类型的文件,以用户名为索引文件名:商品库存表组成:本次新入库商品+以前入库商品组织方式:索引文件,以商品编号为索引

    2.5.2 加工条目
    加工名:商品存储处理

    编号:无输入:商品信息输出:库存信息表
    加工名:商品入库处理

    编号:无输入:商品信息输出:库存信息表
    加工名:商品出库

    编号:无输入:商品信息输出:库存信息表
    加工名:用户信息存储

    编号:无输入:用户信息输出:用户信息表
    加工名:用户查询处理

    编号:无输入:用户名输出:用户信息表
    加工名:用户信息验证

    编号:1.1输入:用户信息输出:用户信息表
    加工名:验证用户是否存在

    编号:1.2输入:用户名输出:用户信息表
    加工名:录入用户信息

    编号:1.3输入:用户信息输出:用户信息表
    加工名:登陆系统时的信息验证

    编号:2.1输入:用户名、密码输出:用户信息表
    加工名:个人信息查询

    编号:2.2输入:用户名输出:用户信息表
    加工名:审查商品信息

    编号:3.1输入:商品名称输出:商品信息表
    加工名:验证是否为新商品

    编号:3.2输入:商品名称输出:库存信息表
    加工名:录入商品

    编号:3.3输入:商品信息输出:库存信息表
    加工名:查询商品

    编号:4.2输入:商品名称输出:库存信息表

    3.软件总体设计软件系统的设计是在整个系统在实现软件开发过程中的十分重要的一个环节。本章将主要介绍一下仓库管理系统的总体结构与系统的架构[2]。总体设计的结构实际上介绍了各个模快相互产生的关系,数据库的设计主要说明了表的建立与数据之间的关系。
    系统怎样实现是在总体设计阶段的阶段的基本目标。所以总体设计又被叫做为概要设计。在经历过这个阶段的工作,开发人员又将可以组成系统的物理元素,例如有文件、程序、还有数据库等。但是这些物理元素还处于黑盒子的形式。总体设计的另一项任务是设计软件的总体结构,即为了找出系统中的每一样程序都是由那些模块组成的,每个模块的功能及模块和模块之间的接口、调用关系等,但所有这些都不要求设计模块的内部过程的细节。
    容易看出,软件设计的结构是基于模块之上的,根据分析阶段得到的数据流图来设计软件结构。数据流图是设想各种可能方案的基础。首先,分析员从提供的方案中选出若干个设计方案,然后对这些方案进行筛选,从而选出一个合理方案。对于复杂的大型系统要进行功能分解,为确定软件结构,把一些设十分复杂的处理功能适当地分解成一系列比较简单复杂的功能,然后在进行软件结构设计。最后制定测试计划,书写文档并复审。
    3.1 软件结构设计原则软件总体设计的任务是软件的结构体系设计与软件的模块化设计。为了提高软件设计质量,人们在长期的计算机软件开发过程中积累了丰富经验,对这些经验做出总结会进一步得出一下软件设计准则。
    3.1.1 软件的结构体系软件的体系结构是在整个软件系统中最基层的。设计准则如下:

    体系结构是一种抽象的结构
    软件的体系结构能够保持一定时间的稳定
    良好的体系结构意味着普通、高校和稳定

    3.1.2 软件模块设计原则在软件开发过程中,软件的模块化式设计关键,软件模块化设计需要遵循的总则如下:

    模块的耦合性降低,模块的内聚性要提高
    模块的作用范围需要能够控制
    模块接口设计要简单,以便降低复杂程度和冗余度
    设计功能可预测并能得到验证的模块
    适当划分模块规模,已保持其独立性

    3.1.3 软件的模块化模块是软件结构的基础,是软件元素,是能够单独命名、独立完成一定功能的程序语句的集合,如高级语言中的过程、函数、子程序等。广义的将,在面向对象的方法学中其中的对象也属于模块,模块是构成程序的基本构件,在程序设计中有很重要的地位。
    模块化是使得软件能够对付复杂问题所具备的属性。使用模块化是为了使软件的复杂性能够降低,能简单的操作软件的设计、维护、还有测试。模块化技术的运用还可以防 止错误蔓延,从而可以提高系统的可靠性。关于模块可以降低软件复杂性的事实。
    3.2 系统任务概述一个成功的网站应明确为什么要建立这个网站,确定网站所拥有的功能,明确网站所有的规模、投资花费的费用等[8],了解这些都需去市场进行调查。只有经过详细的策划,才能够免去在网站的建设中出现的很多问题网站的建设才会顺利[4]。同时,一个大型的计算机网站系统,需要有一个十分明确的思想做指导,并且通过一系列合理的结构设计,就能够充分发挥出仓库管理系统的巨大优势。
    在仓库管理系统系统的实现时首先我们要考虑下面几点:

    安全性:现在社会是一个信息的社会,信息就是宝贵的财富,保证信息的安全,特别是个人信息更加的需要安全性
    先进性:结合当前流行趋势,开发要符合用户的需求,适合用户进行网上预约挂号的系统。本系统采用的这些技术完全基于微软平台进行开发,从来有效的降低了系统的运营成本,大大提高了该医院预约挂号系统的稳定性和易维护性
    可扩展性:本系统给用户带来了极大的便利,提高了网站的管理效率,因此在开发系统的功能过程中,我们要考虑到系统的可扩展性,便于将来系统的升级、更新
    有效性:实际上这里所说的有效性包括了两个方面的意思,即有用性和可用性。其中有用性是指的是站点能满足用户需求的潜在功能,而可用性指的是能够通过站点来操作实现系统的体现功能。所以实现在仓库管理系统的功能时一定要尽最大的可能满足用户的需求

    3.2.1 系统的功能设计仓库管理系统主要分为两个个用户角色,主要是管理员角色与用户角色,其功能如下:

    管理员:管理员可以通过帐号和密码进行登录,登录到系统后主要功能是对库存信息的管理,主要包括个人信息管理、商品进行入库、出库、查询操作、客户的信息进行查看修改、退出系统等功能
    用户:用户可以注册登录成为会员,其中的系统功能包括系统首页,查询库存,注册登录,我的信息,退出系统等一些功能

    3.2.2 系统功能结构根据上述分析,得出的功能结构图有,如图3-1所示。

    3.3 系统架构B/S系统对客户机的工作量做了极大的简化,对数据库的访问以及应用程序的执行都将由服务器来完成。B/S架构主要使用WWW浏览器技术,根据各种基于浏览器的脚本语言。在B/S架构基础上软件结构的安装、修改与维修的需要在服务器端解决。使用该系统时,只需要一个浏览器用户可以运行所有的模块,从而实现了“零客户端”功能,很容易在运行时自动升级。B/S架构也有一个均质机,网上异构网络,异构应用服务的联机[10]。
    B/S系统由以下三层构成,三层是相对独立又相互关联,在这里我们在三个层面上做一个介绍:

    表示逻辑层提出一个服务请求到网络上的Web服务器,并且开始验证身份,主页信息被HTTP给传送给客户端,主页文件会被客户机收到,并将主页文件信息显示在Web浏览器上
    用户的数据请求会被控制逻辑层接受到,数据库与程序相互连接,并进行数据处理请求的数据库服务器,然后Web服务器开始接受数据库服务器的数据处理的结果,最后再返回给客户端
    数据表示层接受Web服务器请求的数据库操作,以实现对数据库操作的一系列的功能, Web服务器来接收操作结果

    3.4 系统主要子模块设计在对系统的功能设计进行分析,在对系统的小模块在进行划分,即系统的模块化。建立系统的整体的结构了解模块之间的关系如何。系统的功能需求分析和企业仓库管理的有各自不同的特点。
    3.4.1 用户登录子模块设计系统中用户登录验证相对比较简单,可以将其流程概括如下:
    在用户登录时,系统要求在用户名的输入框与密码的输入框输入相应的信息,然后再由系统将其传送至相应的服务器端。服务器端处理程序时,服务器会根据提交的内容将用户名中的内容以及密码框的内容进行分离,再与数据库中的数据进行比对判断。如果输入的内容能够相互匹配会进入到登录首页;若不能正常匹配则系统会跳转到报错界面。
    3.4.2 商品入库子模块设计首先,入库申请人需要向仓库管理员提交一份入库申请单和相应的货物,仓库管理员会根据所提交的清单进行对比。如果发现货物与入库申请单中的数据有所差异,那么则拒绝货物入库操作;如果发现库存中有该商品存在,还需考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。没有超过的话,仓库的管理员进行入库操作。如果该库存中没有该商品存在,则需要重新添加该商品,计算该商品可在库存中所能存放的最大库存量,重新考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。货物存入仓库之后,该仓库管理员需要给入库申请人开具一份货物入库单,入库单中的内容必须严谨。至此该系统的入库流程全部完成。
    3.4.3 商品出库子模块设计在进行出库操作时,首先,出库申请人需要向仓库管理员提交一份申请单。若申请单不真实,则取消出库操作,不再继续进行出库。对真实有效的出库单,仓库管理员再对照其要求出库的货物名称查询该货物的信息和库存量。如果此货物的库存量达未到所需要数量则取消出库操作。如果此货物的库存量达到所需要数量,可以执行出库操作并且记录。随后仓库管理员给该申请人开出库单据,仓库管理系统出库流程全部完成。
    3.4.4 用户注册子模块设计系统中用户登录验证相对比较简单,可以将其流程概括如下:
    在用户注册时,需要在注册的页面各框中输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。服务器端处理程序时,服务器根据提交的内容将用户名与其他信息进行分离判断。如果没有找到所注册的用户名,系统会进一步进行注册;当在注册的过程中有空的情况下系统会有相应的提示。在进行email注册时,在注册的栏中输入的不正确时,系统会提示出错误。当输入的内容符合要求时会继续注册。还可以选择清空,从头开始在注册一遍内容。
    4.数据库设计数据库的设计在开发的过程中占有一个十分关键的作用,在这里强调数据库重要性的作用,原因是数据库是软件开发过程的根基,前期的建设不牢固,会使得后期的建设出现大批量的问题,在后期的处理过程中会非常的困难。
    通常概念设计的主要目标是设计并反映出某一个组织部门的信息需求中的要求,数据库系统通常是独立的并主要存在于:数据库系统的逻辑结构、DBMS即数据库管理系统、计算机系统等模式。
    概念模式的设计方法是在需求分析的基础上,通常使用E-R模型来表示数据以和数据之间的联系,开发出能够解决用户信息要求和处理要求的数据库的模式。数据库概念设计的主要目标是能够准确的描述应用领域的信息模式,并且支持用户的不同应用,并方便转换为数据库系统逻辑模式以及方便用户理解。该模型是不能够直接的用于数据库系统的实现的,因为它主要是面向现实世界的数据模型。在此阶段,用户可以参与和评价数据库系统的设计,从而有利于保证数据库系统的设计能够满足用户的需求。
    4.1 数据库概念数据库技术从年代中期至今只有不到年的历史,但其发展速度之快是其它技术所不及的。数据库的发展已经从刚开始的网状型数据库发展到后来的的关系型数据库现如今已经变为以面向对象为主要模型的数据库。数据库技术现如今已经与网络的通信技术、现如今流行的人工智能技术以及面向对象的编程思想等技术之间互有融合,并且使得其得到了广泛的发展与应用。
    数据库的原理管理方式根据的是数据结构的方式进行的管理还有存储数据的数据仓库,在本次系统中的作用主要是用来查询仓库管理系统的系统设计与实现数据的存储。使用数据库可以带来许多好处:使得数据的冗余度得到了减少,而且在一定的程度上使得数据的存储的空间得到了充分的利用,让数据资源能够最大程度的得到共享等等。尤其在最近的一些年中计算机的关系数据库的不断地发展,使得编程方面更大限度的得到便利,在处理数据的过程中更加方便快捷,操作更容易上手。
    数据库设计的目的是指在特定的环境下能够在建立好的应用模式与好的应用环境之下使得用户的各种需求得到满足。
    数据库在一个完整的网站中是必不可少的,原因是在网页被访问的过程中都会有数据保存下来,网站会是这些数据保存在一个文件中。可是在实际的网站建设当中,这些文件所能保存的数据往往是不够的,无法满足各种数据的需求[5]。因此一个完美的网站的建设必须拥有一个完美的数据库。我们现在可以使用的数据库有很多种,如数据库、数据库等等,在本次设计中,选择了ORACLE数据库作为后台数据库工具。自从ORACLE数据库推出一来,得到了快速的发展,很快便在应用市场中占有了十分重要的地位。在时代的不断发展过程中,ORACLE数据库已经在发展的过程中占据了牢固的地位,在下如今工作的前景之下,以数据库为背景的应用发展,为用户的应用提供了款完善的数据管理和数据分析解决方案。数据库是一种具有属于自己的结构与管理的方式数据的仓库。数据库简单来说是是属于一种文件柜电子化的一种存储工具(主要用于电子文件的存储),用户可以对其中的文件进行一定的操作。它能够把以一种属于自己的方式进行存储、而且能够使得多个用户之间的数据相互的分享、还能使得用户数据的冗余度能够最大程度的减少、在应用程序之间的各种数据能够分离。
    4.2 数据库分析数据的模型属于在数据库当中中用来存储数据的一种方式,是数据库系统的基础。
    数据模型经历了:

    层次模型:是数据库系统中最早使用的一种模型,它的数据的结构是一棵“有向树”
    网状模型:网状模型以网状结构表示实体之间的联系。网中的每一个结点代表一个记录类型,联系用链接指针来实现。网状模型可以表示许多不同的联系,还能表示不同的数据之间的交流,即数据间的横向关系与纵向关系,属于扩展之后的层次模型。网状模型可以方便地表示各种类型的联系,但结构复杂,实现的算法难以规范化
    关系型:在关系模型中基本数据结构就是二维表,不用像层次或网状那样的链接指针

    4.2.1 数据库的完整性分析数据的正确性与数据之间的相容性即为数据哭库的完整性。用来管理数据库的系统,需要用一定的机制来检查现存的数据库中的数据是否满足规定的条件,数据的约束条件是基于仓库管理系统设计与实现语义的体现,会作为模式的一部分存入数据库之中。本系统中定义了表与表之间的联系有助于实现完整性规则,一般在程序中实现具体的完整性控制。数据库的完整性约束能够在一定的程度上防止终端的用户输入一些错误的数据,以此来保证所有的数据库中的数据都是合法的、完整的。
    在设计数据库表时采用数据库完整性约束,它是数据库完整性的一种机制,他会在之前用来定制一些规则,用来约束数据库,而这些数据规则存放于数据库中,具体来说,这种约束有以下几种非空约束缺省值约束唯一性约束主键约束外部键约束规则约束。由于这种约束是加在数据库的表的定义上的,因此,不需要有大的代价便可以取得一些高的性能。
    4.2.2 数据库的安全性分析能够保证数据的网整性、合法性还有安全性是数据库重要的安全性能的指标。数据能够在数据库中大量的存放并且能够实现数据之间的共享,这都属于数据库的宝贵的资源。
    数据库的安全和服务器的安全是仓库管理系统安全的重要性能。采用管理员表示和鉴定的方法实现数据库的安全,此安全管理措施并不在前台开发工具中实现,而是在后台数据库中实现。在登录数据库时,系统让管理员户表示自己的身份,不同的管理员权限不同,系统进行核实,分辨出此管理员是否能够与系统匹配,若是,系统进一步核实用户,通常要求重新输入,系统和用户重新输入的信息用来鉴别用户的身份。服务器的安全也是通过判断用户在登录服务器时输入信息是否与数据库中的信息相匹配来验证的[3]。这种方法比较容易实现,实现起来也比较方便。没有采用更加复杂的系统安全管理措施是因为本管理系统一般是应用在校园网中,采用安全管理措施主要是为了防止没有修改权限的用户无意间修改了数据,因此采用用户标识和鉴定的安全管理措施就能够保障数据库的安全性。
    4.3 数据库的设计4.3.1 概念结构设计在次结构的设计过程当中,E-R模型法是最常见的设计方法。在次结构设计当中中,有以下几种方法方法:

    自下往上、从上往下、逐步扩张、相互结合,以这种方式为模型然后烦别实现各个结构的模型。
    在物理结构设计阶段首先分两步走:

    确定数据库的物理结构,是用来说明数据在数据库中怎么样存储的选取正确的关系模式存取方法有好多种方法进行选择

    概念设计通常是从系统的需求出发,常常将对象使用数据流的形式表达成为完整的抽象实体。而与模块内部的细节无关。E-R图为主要的工具,如下图4-1。

    4.3.2 逻辑结构设计管理员信息关系模式,里面的主键是管理员ID



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




    id
    number
    NOT NULL
    管理员编号


    account
    varchar
    NOT NULL
    帐号


    Password
    varchar
    NOT NULL
    密码


    name
    varchar
    NOT NULL
    姓名


    sex
    varchar
    NOT NULL
    性别


    age
    varchar
    NOT NULL
    年龄


    phone
    varchar
    NOT NULL
    联系方式


    email
    varchar
    NOT NULL
    E-mail


    address
    varchar
    NOT NULL
    地址



    客户信息关系模式,里面的关系主键是客户ID



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




    id
    number
    NOT NULL
    客户编号


    account
    varchar
    NOT NULL
    帐号


    password
    varchar
    NOT NULL
    密码


    name
    varchar
    NOT NULL
    姓名


    sex
    varchar
    NOT NULL
    性别


    age
    varchar
    NOT NULL
    年龄


    phone
    varchar
    NOT NULL
    联系方式


    email
    varchar
    NOT NULL
    E-mail


    address
    varchar
    NOT NULL
    地址



    商品信息关系模式,里面的关系主键是商品编号



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




    id
    number
    NOT NULL
    库存编号


    name
    Varchar
    NOT NULL
    商品名称


    goodsid
    varchar
    NOT NULL
    商品编号


    price
    varchar
    NOT NULL
    商品价格


    sort
    varchar
    NOT NULL
    商品分类


    num
    varchar
    NOT NULL
    商品数量


    address
    varchar
    NOT NULL
    生产厂商



    4.4 数据库的连接本系统与数据库的连接方式,包括对数据库中的信息进行添加、删除、修改,都使用的数据持久化层(persistence layer)的开源框架Mybatis,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。以便仓库管理人员在计算机上运行本系统时,对数据库进行必要的操作.
    4.4.1 连接工具本系统采用mybatis数据持久化层的开源框架与数据库进行连接,包括对数据库中的信息进行添加、删除、修改. MyBatis简化与实现了在变成中的数据的持久化层(persistence layer),并且它抽象出了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建。MyBatis3是iBATIS的另一个版本,而且支持注解还有Mapper。
    MyBatis具有简单性和易使用性,所以,才会开始流行起来。在Java应用程序中,将从数据库查询到的数据生成所需要的Java对象;将Java对象中的数据通过SQL长期保存到数据库中,都是数据库的设计中所涉及到的。MyBatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得对SQL的使用变得容易。
    使用Mybatis的具有一下几点的优势:

    它消除了大量的不必要的重复代码
    学习和使用起来非常简单
    能与其他的一些数据库在一起共同使用
    它可以接受SQL语句
    具有与其他的一些框架一起使用的集成支持
    提供了与第三方缓存类库的集成支持
    引入了更好的性能

    4.4.2 工厂类配置文件主要内容<Configuration> <settings> <setting name="cacheEnabled" value="true" /> </settings> <typeAliases> <package name="com.briup.bean"/> </typeAliases> <environments default="develepment"> <environment id="develepment"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="briup"/> <property name="password" value="briup"/> </dataSource> </environment> </environments> </configuration>
    4.4.3 Mapper类配置文件主要代码<mapper namespace="com.briup.bean.AdminMapper"><select id="selectAdminByName" parameterType="String" resultType="Admin"> select * from admin where account=#{account} </select> <select id="selectAdminById" parameterType="int" resultType="Admin"> select * from admin where id=#{id} </select> <insert id="insertAdmin" parameterType="Admin"> <selectKey keyColumn="id" keyProperty="id" order="BEFORE" resultType="int"> select admin_seq.nextval from dual </selectKey> insert into admin values(#{id},#{account},#{password},#{name},#{sex},#{age},#{phone},#{email},#{address}) </insert> <update id="updateAdmin" parameterType="Admin"> update Admin set account=#{account},password=#{password}, name=#{name}, sex=#{sex}, age=#{age}, phone=#{phone}, address=#{address}, email=#{email} where account=#{account} </update></mapper>
    5.软件详细设计在软件的详细设计的这个阶段确定应该使用什么样的方式来实现整个系统使这个阶段的根本目的,通过这一阶段的具体的努力基本上能够明确整个系统所需要实现的所有的功能,具体的就是微软件结构图中每个模块确定采用的算法和块内数据结构,用某种选定的详细设计工具更清晰的描述。经过这一阶段的努力可以在编码阶段直接翻译成为源程序。
    在这个阶段中,考虑到的程序代码的质量时必须注意,程序的“读者”有两个,即计算机和人。在整个软件生存周期中,软件的测试与诊断出的程序的错误还有程序错误的修改等都必须先读程序。实际上对于任何一个经常使用的软件系统,程序员在之后的过程中,读程序所花费的时间可能比写程序所花费的时间还要长的多。因此,衡量程序的质量不仅仅看他的逻辑是否正确,性能是否满足要求,更重要的是看他是否一度易理解。详细设计的目的不仅仅看他的逻辑上是否正确,性能是否满足于要求,更重要的是看他是否易读、易理解。结构化的程序设计技术是实现这些问题所使用的关键性技术,更是详细设计的基础。
    在本次仓库管理系统说实现的这些基本功能。仓库管理的人员或者是客户在登录后可以进入系统使用主界面进行相应的操作。
    5.1 登录模块在本次的仓库管理系统中有两个不同的入口。仓库管理人员使用用户名和密码之后可以对应有相应的操作。用户的登录所需的用户名和密码已经在之前的用户信息表中建立,用户的个人信息由管理员提前录入或者自己注册。由于用户信息需要先从所对应的数据库中进行读取,所以在读取之前需要先于数据库进行连接。在本系统当中,有两个登陆模块的入口。如下图所示确认文件审核用户提供的用户名和密码。
    管理员登录图片如下:

    管理员登陆模块主要逻辑代码如下:
    AloginServlet.java文件主要代码如下
    String account = request.getParameter("in_be"); String password = request.getParameter("pass"); HttpSession session = request.getSession(); session.setAttribute("account", account); AdminService adminService = new AdminService(); SqlSession sqlSession = MybatisSessionFactory.getSession(); AdminDaoImp aDaoImp = new AdminDaoImp(); try { List<Admin> fadmin = aDaoImp.findAdminByName(account); sqlSession.clearCache(); sqlSession.commit(); //session.close(); System.out.println("用户名不存在,ADS开始注册"+fadmin); for(Admin fAdmin2:fadmin) { if( password.equals(fAdmin2.getPassword())) { response.sendRedirect("AFirstLog.jsp"); session.setAttribute("Admin", fAdmin2); //System.out.println("帐号密码正确!"); find=true; } } if (fadmin.size()==0) { System.out.println("用户名不存在,ADS开始注册"+fadmin); response.sendRedirect("AloginFail.html"); throw new AdminServiceException("用户名不存在!"); } else { if(find==false){ response.sendRedirect("AloginFail.html"); throw new AdminServiceException("密码错误!"); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
    5.2 入库模块商品入库模块这是系统设计得最好最完善的模块之一。系统提供两种入库方式可供选择一次是录入库存中已经录入的商品,或者录入库存中没有录入的商品,另外添加新商品。录入已存在商品方式时,可自由选择录入某种商品。己录入的商品的信息会在相应的信息的框中显示出来。在此模块的编程中,使用了非常多的编程技巧来提供上述功能做到了与完美的配合。此种方式便于管理员掌握相应商品的情况。按商品名查询可以在选定撒谎能够品后,查询某一次或多次商品信息。
    添加已有上商品模块如图5-2所示:

    当有新的商品进入仓库中时,仓库管理人员需点击入库界面的“添加新商品”选项。在对现有的商品进行入库操作时,商品的信息都是重新输入的。当将新入库的商品的信息填写完毕之后,系统会自己将新入库的一些商品的信息添加到管理商品信息的数据表“goods”中。
    添加新商品模块如图5-3所示:

    5.3 出库模块商品出库模块这是系统设计得最好最完善的模块之一。系统提供出库方式是在库存表中已经储存有商品基础上才能可以出库的。若是在库存中商品品的数量小于所要出库的输了时,系统会显示出库存数量不足。在进行出库的操作过程时,若是出库的商品在库存中的数量小于0时,系统会报出出库商品出错。此时都不可以正常出库。在正常出库之后,库存中商品的数量会发生改变。

    在出库商品的管理模块中的主要逻辑代码如下
    GoodsDaoImp goodsDaoImp = new GoodsDaoImp(); OutGoodsDaoImp outGoodsDaoImp = new OutGoodsDaoImp(); for(Goods goods2:goods){ String GoodsNum = goods2.getNum(); System.out.println("goods2值为:"+goods2); Integer IntGoodsNum = Integer.valueOf(GoodsNum); Goods goods3 = goods2; System.out.println("IntGoodsNum :"+IntGoodsNum); if (IntOutNum>IntGoodsNum) { System.out.println("出库数量不足!"); response.sendRedirect("OutStockFail.jsp"); }else{ goods2.setNum(String.valueOf(IntGoodsNum-IntOutNum)); try { //goods3.setNum(String.valueOf(IntOutNum)); goodsDaoImp.updateGoods(goods2); sqlSession.commit(); goods3.setNum(String.valueOf(IntOutNum)); outGoodsDaoImp.saveOutGoods(goods3); sqlSession.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } response.sendRedirect("Goods.jsp"); System.out.println("出库成功!"); } }
    5.4 用户注册模块在用户需要访问此系统时,用户需要在登录框中输入相应的信息,然后系统在后台服务器中与数据库进行匹配。所以在进入系统之前需要进行帐号密码的注册,在注册的过程中需要输入输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。服务器端处理程序时,服务器会获取到系统提交的内容,然后系统会将获取的信息与数据库中所存储的表格中的信息进行对比,得出相应的结果。若是输入的用户名是在数据库的库存中已经存在的,系统会终止注册,然后系统会提示用户名已经被使用,请重新注册的提示。如果在进行继续注册的过程中出现某一项信息没有填写时,系统会发出此项信息没有填写请重新填写的提示。在进行email注册时,若输入的格式与系统定义的格式不匹配的情况下,系统会作出相应的警告在重新注册。若注册的信息不满足要求时,可以将信息清空再重新注册。

    用户注册模块的逻辑代码如下
    String account = request.getParameter("in_be");String password = request.getParameter("pass");HttpSession session = request.getSession();session.setAttribute("account", account);//System.out.println("账户为:"+account);//System.out.println("密码为:"+password);AdminService adminService = new AdminService();SqlSession sqlSession = MybatisSessionFactory.getSession();AdminDaoImp aDaoImp = new AdminDaoImp();try { List<Admin> fadmin = aDaoImp.findAdminByName(account); sqlSession.clearCache(); sqlSession.commit(); //session.close(); // /session.flush(); for(Admin fAdmin2:fadmin) { if( password.equals(fAdmin2.getPassword())) { response.sendRedirect("AFirstLog.jsp"); session.setAttribute("Admin", fAdmin2); //System.out.println("帐号密码正确!"); find=true; } } if (fadmin.size()==0) { System.out.println("用户名不存在,ADS开始注册"+fadmin); response.sendRedirect("AloginFail.html"); throw new AdminServiceException("用户名不存在!"); } else { if(find==false){ response.sendRedirect("AloginFail.html"); throw new AdminServiceException("密码错误!"); } }} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();}
    5.5 个人信息管理模块当管理员或用户进入到主界面之后,管理员可以选择信息管理选项,会进入到用户信息的管理模块。管理员或者用户在系统中具有两项功能,第一项功能是可以对管理员或用户的个人信息进行一些列的操作。在此界面上面可以查询到用户全部的个人信息。第二项功能是能够管理全部的用户的信息。在进入信息管理模块对个人的信息可以进行查看,可以修改自己的信息。在点击修改之后会完成所对应的个人信息。
    管理员信息模块图片如图5-6所示:

    此信息模块的主要逻辑代码如下
    request.setCharacterEncoding("UTF-8") response.setCharacterEncoding("UTF-8"); String account = request.getParameter("userid"); String password = request.getParameter("password"); String name = request.getParameter("name"); String sex = request.getParameter("sex"); String age = request.getParameter("age"); String phone = request.getParameter("phone"); String email = request.getParameter("email"); String address = request.getParameter("address"); Admin admin = new Admin(); admin.setAccount(account); admin.setPassword(password); admin.setName(name); admin.setSex(sex); admin.setAge(age); admin.setPhone(phone); admin.setEmail(email); admin.setAddress(address); System.out.println("AInfServlet获取的信息:"+admin); SqlSession sqlSession = MybatisSessionFactory.getSession(); HttpSession session = request.getSession(); AdminDaoImp aDaoImp = new AdminDaoImp(); try { aDaoImp.updateAdmin(admin); sqlSession.commit(); session.setAttribute("admin", admin); response.sendRedirect("AInf.jsp"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
    在这个模块当中,管理员可以对所有的信息进行修改,所有的用户的信息也可以被查询到。在客户的需求之下,管理员可以随意的进入到某一位客户的信息界面之下,可以对所有的信息进行管理。修改之后用户可使用最新一次更新的信息进行登录,进入主界面之后可以更新自己信息。
    系统中全部的用户信息块如图5-7所示:

    实现此模块的主要逻辑代码如下
    String password = request.getParameter("password"); String name = request.getParameter("name"); String sex = request.getParameter("sex"); String age = request.getParameter("age"); String phone = request.getParameter("phone"); String email = request.getParameter("email"); String address = request.getParameter("address"); Customer customer = new Customer(); customer.setAccount(account); customer.setPassword(password); customer.setName(name); customer.setSex(sex); customer.setAge(age); customer.setPhone(phone); customer.setEmail(email); customer.setAddress(address); System.out.println("AInfServlet获取的信息:"+customer); SqlSession sqlSession = MybatisSessionFactory.getSession(); HttpSession session = request.getSession(); CustomerDaoImp customerDaoImp = new CustomerDaoImp(); try { customerDaoImp.updateCustomer(customer); sqlSession.commit(); //response.sendRedirect("ACInf.jsp"); session.setAttribute("customer",customer); response.sendRedirect("ACInf.jsp"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
    6.系统的测试系统测试是软件设计过程中最后的一部分,也是非常重要的一步。用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。
    软件测试就是用户希望能够通过软件测试寻找出软件当中的一些错误,以考虑该产品能不能被广大的用户所接受。而软件测试者则是替用户受过。而今,人们已认识到,用户能够得到最为满意的产品是软件测试的最终的目的,尽可能多的发现系统的问题并改正,然后交给客户使用。
    在测试的过程中主要需要实现一下几点要求:

    要完成并实现在前期承诺所需要实现的功能,并且在系统中的每一项功能都需要有说明书
    所做出来的产品的性能要得到满足
    产品应该能够适应所有的用户的环境

    总之,软件测试的最终的目标是希望能够找出系统中所存在的一些不足与缺陷,而且要求与软件需求阶段所提出的要求相匹配。要注意的是:软件的测试并不能说明软件中没有错误,只能发现并尽可能的减少错误。
    6.1 测试简述软件测试,是在软件的完整性、安全性、正确性以及质量是否过关的一种描述。也可以说成是输出比较的一种过程。软件测试的经典定义是:在一定的条件之下来操作并使用软件,在这个过程中来发现并且找出软件自身的错误,以此来评价一个软件的质量。
    在经过查询一系列的资料表明出,软件的测试工作在软件的整个开发的过程当中占有极其重大的一部分。在一些情况表明之下,如果所设计的软件关系到人的生命安全的情况下,软件的测试会变的即为的重要,并且还需要有成倍的工作量来增加测试的目的,以此来说明程序能正确的执行它应有的功能,还有表明程序没有错误。如果抱有这样的目的,就不会轻易地发现错误,从而导致选择一些不易暴露错误的例子。
    6.1.1 测试目的及重要性测试目的
    系统的测试是一个在开发过程中十分重要的一个阶段。在系统的测试阶段找出程序的错误,并提高系统的性能是测试阶段的主要任务。主要目的是检验系统“做得怎样”。通过软件的测试会发现一系列的问题,还能找出问题的原因,然后再对这些问题进行修改。
    Grenford J.Myers在以前提出过一下的软件问题:

    找出程序中尽可能多的问题
    设计出一个非常好的测试方案,有可能发现一些到目前为止没有能发现的错误
    如果能够找出之前并未发现的错误,算是设计出了一个成功的方案
    测试不是单独的找出错误。而是通过分析错误,来找出产生错误的原因,来避免发生错误,帮助程序员找出软件开发过程中的缺陷,以便及时进项改正

    测试重要性
    不管是什么技术,以及如何使用的方法,但该软件,该软件将仍然是放错了地方。为了减少引入的错误,您可以使用最新的语言,最领先的开发方法,详细的改进开发过程,可是就算是这样也不能够完全的消除软件上面的错误,还要进行详细的测试过程,以找出引入的错误,你必须通过测试误差估计密度在软件中。所有工程学科最根本的所在是一个测试,是在软件开发中占有很重要的一个部分。测试陪同,从编程本身的日子。统计显示,软件测试这个阶段所花费的成本为这个测试是30%至50%的软件开发总成本的。要是也考虑了维护的阶段,在软件开发的整个周期中,有所降低的也许是测试的成本比例,可是维护的工作,实际上是相当于对软件进行了第二次的开发,还有可能是多次,许多测试工作也一定包含在其中。
    6.1.2 测试原则在软件测试中人们所具有的经验非常重要,但人们的心理因素也更加的很重要的。根据软件测试的目标确定一些测试原则,将一些容易被人们忽视的、实际上又是显而易见的问题作为原则来加以重视,所以测试有以下几大原则。

    测试用力既要有合理的数据的输入,又需要有一定合理的输出结果
    合理的用例固然重要,但是却不能忘却一些不合理的用例
    检查程序时,需要检查程序该做的与不该做的事情
    测试的计划需要早早的开始制定
    测试计划、测试用例、测试报告需要进行长期的保存,以免以后出问题可以解决
    遵守二八原则
    软件的开发人员应该尽量避免不要亲自去进行测试

    6.2 测试方法测试的过程是一个执行程序的过程,即要求被测试程序能够在各种环境下运行。其实,不再记起上运行也可以发现程序的错误。为了便于区分,一般把被测程序在机器上运行称为动态测试,不再机器上运行称为静态测试,广义上讲都属于软件测试。动态分析方法又分为黑盒测试和白盒测试两种方法。以下的两种方法是即为典型的测试方法。
    6.2.1 黑盒测试黑河测试,即功能测试。他的工作重点不是考虑程序应该是怎么编写的。往往将被测试的程序看成一个黑盒,只是在软件的接口处开始进行测试,根据前期制定的需求说明,来检查所做出来的程序是否满足了所有的功能要求。程序梭边写出来的每一项功能,都能不能满足用户在输入数据之后所要达到的目的与要求。并且保持外部信息的完整性。在黑盒测试中会有以下的错误。

    发现一些没有实现的功能
    在接口上,数据能不能正确的别接收,结果是否合理
    性能上是否满足要求
    所做出来的界面是不是很清晰、美观

    6.2.2 白盒测试白盒测试,即结构化的测试,主要测试程序的内部组成。白盒测试与黑盒测试法不同,测试人员将程序视为一个透明的盒子,测试人员需要检查处理过程的中一些细微的程序,要求对程序的结构性做到一定程度的覆盖,以此来检验程序内部的一些组成。
    白盒测试法也不可能完全测试,也做不到对所有的路径都挨个测试一遍。例如要测试一个循环20次的嵌套if语句,循环体中有5条路径,这样的测试程序会产生很多种情况。如果每1ms完成一条路径的测试,测试完这样的一个程序需要花费很多的时间,因此可能做到完全覆盖。
    总之,无论哪种测试的方法,对于一个大的软件系统完全测试是不可能的,所以我们要找出更多更合适的方法进行测试,使得软件产品达到一定的质量标准的要求。
    6.2.3 单元测试单元测试(unit testing),对软件设计中的一些细小的结构单元进行测试。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的测试单元与其他部分相隔离的情况下进行测试。
    6.2.4 集成测试集成测试,即软件的联合测试。以单元测试为基础,把系统中所做出来的一些模块结合起来进行测试。
    6.3 系统模块的测试6.3.1 登陆模块测试在首次进入系统时,首次进入的是登陆注册的界面,在输入的信息有效的情况下会进入到首界面。如图6-1所示为系统的登录界面的测试:

    6.3.2 出库模块测试系统在进入主界面之后会有一个出库模块的入口,在进入到出库模块时,在输入的出库数量小于库存数量商品能够进行正常出库操作,查询库存结果随之更新。出库的数量比库存中的数量躲得情况下,会跳转一个出库出错的界面,提示库存数量不足。该模块之下的测试用例如下:

    在进行完出库的操作之后,如图6-5所示:

    出库数量超出库存数量,以铅笔为例,出库25个如图6-6所示:

    铅笔进行出库操作后库存中的信息图如图6-7所示:

    用户信息模块测试:

    修改后信息图如图6-9所示:

    6.4.3 用户信息模块测试结果当在操作中,进入到系统中的这个模块时,可以查看到本人的所有登录信息。可以对此模块中的所有的信息都进行修改操作,然后在对所作出的操作进行更新。
    总结基于Web的仓库管理系统在之后的市场发展中有着非常广阔的前景,会对传统的一些理念造成巨大的冲击。本文是运用了计算机学科中的两项重要的技术即计算机网络技术和数据库技术出发,分析了Web数据库及JSP技术在本次仓库管理系统中的应用。本文的主要工作如下:

    探讨了数据库应用系统所经历的主机/服务器—浏览器/服务器模式,重点讨论了三层结构的工作原理及其特点,其中有中间件技术(CGI和API), Java技术、JSP技术、JScript技术、Mybatis技术、PowerDesiner技术等,而且还从一定的方面评价分析了其中的优缺点
    探讨了怎么合理的运用在软件工程中所学习的一些基本原理去分析和设计实现仓库管理系统的过程。并对系统的开发原理、功能设计和模块的设计做出系统的分析
    论文中详尽的介绍了仓库管理系统的总体框架和使用的主要技术、以及功能的实现

    本文通过理论联系实际,对三层架构结构上的Web数据库的不同实现方法作了详尽的分析,同时使用JSP技术开发的一个仓库管理系统。
    4 评论 140 下载 2020-07-16 16:41:57 下载需要12点积分
  • 基于Java和Sql Server 2012实现的高校外聘教师课酬管理系统

    第一章 前言1.1 高校外聘教师课酬管理系统介绍本系统利用JAVA SWING处理数据库的功能,实现对外聘教师的增删改查、课酬工资的发放记录汇总、考勤签到情况记录等;本系统的结构分为登录模块、外聘教师信息管理模块、外聘教师薪酬管理、考勤签到模块、基本工资标准信息模块和查询汇总模块。
    1.2 需管理信息根据系统的需求,首先将要管理的信息分类,要管理的信息如下。

    教师信息:包括编号、姓名、身份证、政治面貌、职称级别、联系电话等
    考勤报酬:包括考勤类型、费用说明
    考勤情况:包括编号(教师)、考勤类型、开始时间、结束数据、总时间
    课酬标准:职称级别、课时报酬
    课酬发放记录:编号、任课学年、任课实数、总费用、增减情况、发放记录
    学院信息:学院编号、外聘教师数量、学院名

    根据这些需要,本系统需要“教师信息”表,“考勤标准”表,“考勤情况”表,“课酬标准”表,“课酬发放记录”表和“学院信息”。
    1.3 功能要求经过实际考分析,外聘教师管理系统主要应该具有以下功能模块。


    外聘教师信息管理部分

    可以查看教师信息可以对教师信息进行维护,包括添加、修改及删除等基本操作可以查询对应学院的所有教师信息
    外聘教师薪酬管理部分

    可以按照各学院分类查询可以按照各职称分类查询可以学期对各教师薪酬查询可以汇总教师学年教师薪酬查询
    外聘教师基本工资查看部分

    可以查找各学年所有或某学院教师业绩明细可根据选择的学年以柱形图的形式展示所有院校的该学年的总业绩分数和平均分数
    考勤签到模块部分

    可以进行考勤请假、打卡、加班
    教师业绩管理和查询汇总管理部分

    可以对所有考勤情况按考勤类型分类查询可以查看考勤情况对总薪的影响

    第二章 数据库设计2.1 E-R模型设计2.1.1 实体列表


    实体
    描述




    教师
    所有教师,由教工号标识


    学院
    所有学院信息,由学院名标识


    考勤酬报
    考勤标准信息,由考勤类型标识


    考勤情况
    所有教师的考勤信息,由编号、开始日期共同标识


    管理员 课酬发放记录 薪酬标准
    系统管理人员,由用户登录id标识 所有教师课酬发放的情况,由任课学年、编号共同标识 薪酬标准信息,由职称级别标识



    2.1.2 系统的E-R模型该外聘教师管理系统的E-R模型,如下图所示:

    2.2 创建数据库2.2.1 构建概念模型
    打开Power Designer,根据设计的E-R图来设计本数据库的概念模型(ConceptualDataModel)
    因为管理员表为独立表,因此在构建概念模型时不添加管理员表。外聘教师信息表、学院信息表、考勤薪酬表、课酬发放表、考勤情况表、薪酬标准表的基本属性、主键以及实体间的联系


    2.2.2 生成逻辑模型和物理模型在设计好概念模型后,点击“ToolsGenerate Logical Data Model”生成逻辑模型,如下图所示:

    接着点击“ToolsGenerate Pysical Data Model”,生成Microsoft SQL Server 2012 数据库管理系统对应的物理模型,如下图所示:

    2.2.3 创建数据表在生成以上模型后,使用Power Designer自动生成对应的Sql脚本。而自动生成的Sql脚本中的外键的联级删除、更新都是默认无,所以需要根据实体联系来添加对应的联级更新、删除。
    创建数据库后,为DataDesign数据库添加数据表,步骤如下。

    在服务器资源管理器中的DataDesign下执行生成的Sql脚本,因为对应的在生成物理摸时已选择数据库系统的版本,所以时执行即可
    各表数据结构如下表所示:


    第三章 系统实现3.1 连接数据库连接数据库可以在配置文件中进行,但我们决定使用数据库通用类来进行数据库额连接,从而避免多次的连接操作。
    首先设计一个数据库通用类,创建数据库开驱动的字符串:
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");String uriString = "jdbc:sqlserver://localhost:1433;DatabaseName="+DBName; con= DriverManager.getConnection(uriString, id, p);
    【uriString:为链接数据库字段 DBName:连接数据库名 id:登入名 p:登入密码】
    然后在通用类中进行连接和关闭连接的操作,从而实现哪里使用哪里关闭的目的。该类中编写执行数据库操作的通用方法,对数据库数据进行增删改查操作。
    3.2 登录窗体创建一个新的“WindowBuilding”类型JAVA项目,名为“denglu”。将这denglu窗体作为系统的登录入口,以及注册新用户。
    3.2.1 界面设计设计登录界面,创建一个新的“JAVA Swing窗体”,名为“denglu”,作为本系统的登录界面.在登录窗体上添加四个Label控件,两个Button控件和两个JTextField控件,添加控件后的窗体如下图所示:

    3.2.2 功能实现在文本框中相应输入账号(用户ID)和密码,然后点击“登录”按钮,如果验证失败,会弹框提示失败的提示;如果验证成功,跳出登入成功窗口,并登录到菜单窗体,如下图所示:

    3.3 菜单窗体创建一个新的“JAVA SWING”类型的项目,名为“Main_View”。这个页面作为主窗体,来导航要执行的窗体页面。
    3.3.1 界面设计作为本系统的导航界面.在登录窗体上添加一个JPanel控件,添加八个JButton绑定控件,该面板采用GridLayout风格使用setVgap、setHgap设置按钮之间间隔使界面更美观 如下图所示。

    3.3.2 功能实现登入成功进入主窗体后,可以点击导航栏中相应的按钮,实现窗体的加入和现实,再次页面可以将所有窗体的功能再次页面实现。这里业绩标准表是以弹框显示所有标准表中的数据,其他都是将窗体加到主窗体下面的JPanel中来显示。
    3.3.3 设计思路当窗体加载完成后考勤、基本工资情况JPanel的不在重新加载而是设置可见和不可见,导航主页面主要注意按钮控件的页面显示机制。按下相应模块按钮后,不是以弹框形式显示,而是将模块加入到此页面的JPanel控件中。并且要不显示将加入的模块的边框,设置窗体不为顶层窗口,设置充满整个JPanel。为了可以点按钮显示相应模块,所以要将选模块放置最前,但不设置顶层。退出的话是跳转到登录页面。
    3.4 外聘教师信息管理管理窗体在当前项目中添加一个“Java Swing窗体”,名为“Manager”,这个页面作为外聘教师信息管理管理窗体。
    3.4.1 界面设计在窗体上添加三个JPanel,分别设置需要查看的档案类型,一个JPanel存放教师管理的JTree,一个JPanel存放需要查看各个院系教师信息,一个JPanel存放Jtable相关的数据汇总表; 汇总变下存在四个JButton、两个JcomboBox、一个textField实现对教师信息的更新操作;

    3.4.2 功能实现加载该窗体后,显示所有学院信息,点击相应的相应的院系,右方就可以显示该各个院系的教师情况,在表中双击某个教师可查看教师的详细信息,通过下方的按钮等实现对教师档案的增删改查。
    3.4.3 设计思路
    通过访问SQL语句将教师的信息显示在JTable并刷新JTable中
    利用HashMap存放在教师信息,通过教师编号作为Map的KEY实现查看教师详细信息
    通过获取数据库的属性名存放JComboBox实现对任意教师信息属性查询
    通过点击添加按钮实现对教师的添加,修改对外聘教师的增改删

    3.5 考勤管理汇总窗体与考勤窗体在当前项目中添加一个“Java Swing窗体”,名为“Check_work_attendance_View”,这个页面作为外聘教师信息管理管理窗体。
    3.5.1 界面设计考勤窗体
    在窗体上添加三个JTextField,第一个输入编号、第二、第三个添加JAR完成日期的选择使其更美观,天哥两个按钮完成考勤的确认、取消;一个JCombox对考勤类型的选择;
    考勤汇总窗体
    在窗体上添加三个JPanel,分别设置需要查看的档案类型,一个JPanel教师管理JTree,一个JPanel存放需要查看各类考勤的情况信息,一个JPanel存放Jtable相关的数据汇总表。

    3.5.2 功能实现考勤窗体,判断该编号是否存在,若编号存在则跳出提示完成考勤,当编号不存在时提示错误提示。考勤汇总窗体,显示各个院系的各类考勤的汇总情况。
    3.5.3 设计思路
    考勤窗口通过访问数据库完成对于编号的验证,以及名字的提示输出
    通过HashMap存放来各个表中需要使用的信息,汇总在奖罚情况表中

    3.6 外聘教师课酬统计管理在当前项目中添加一个“JAVA SWING窗体”,名为“Salary_View”,这个页面作为教师业绩管理窗体。
    3.6.1 界面设计在窗体上添加两个JTree、一个lable、一个JTable、三个JComboBox、一个按钮。

    3.6.2 功能实现
    通过学院奖外聘教师信息课酬汇总
    通过职称将外聘教师信息课酬汇总
    通过任课学年叫外聘教师信息进行汇总
    通过姓名、编号两个属性进行分类教师查找

    3.6.3 设计思路
    通过点击JTree获得叶子节点,通过节点的信息作为返回数据的条件得到,结合HashMap设置计算总薪酬
    设置选择JComboBox的学年触发事件的到选择学年教师薪酬信息的数据

    3.7 基本工资窗体在当前项目中添加一个“JAVA SWING窗体”,名为“Salary_a”,这个界面作为业绩分数标准信息窗体。
    3.7.1 界面设计添加一个JTable组件、一个JLabel组件,如图所示:

    3.7.2 功能实现点击基本工资按钮,实现显示基本工资信息。
    3.7.3 设计思路访问数据库的薪酬标准,将数据加到JTABLE中并将该面板设为可见。
    第四章 系统实现4.1 开发环境JAVA SWING 进行系统的开发,并使用Sql Server2012作为本系统的数据库管理系统。
    4.2 系统流程图在本系统中准备通过如下窗体来实现数据维护、管理的功能。

    菜单主窗体:管理着各个子窗体
    “外聘教师管理系统”子窗体:实现显示主页
    “档案处理”子窗体:管理教师信息、奖罚情况信息、薪酬发放信息
    “考勤签到”子窗体:管理教师日常考勤签到
    “基本工资”子窗体:查看薪酬标准信息
    “计算器”子窗体:调用系统计算器

    系统流程图

    4.3 功能显示运行程序后首先显示登录界面,如下图所示。

    单击“登录”后,进入程序菜单界面,如下图所示:

    点击教师管理节点,下方将显示各个学院信息界面,如下图所示:

    点击教师信息子节点,下方将显示按学院分类外聘教师,如下图所示:

    选择下方的精确查询,结果如下图所示:

    选择下方的模糊查询,结果如下图所示:

    双击JTable显示教师详细信息,结果如下图所示

    点击添加教师按钮添加成功显示,如下图所示:

    点击添加教师按钮删除成功显示,如下图所示:

    点击奖罚情况子节点,下方将显示考勤情况对应的奖罚情况,如下图所示:

    点击薪酬发放子节点,将显示按学院分类、职称分类、总工资,如下图所示:


    点击考勤签到,将输入考勤编号选择考勤类型完成考勤签到如下图所示:



    点击基本工资,显示基本工资的信息如下图所示:

    点击计算器,显示系统计算机如下图所示: 【该功能用于验算】

    点击切换主题,将显示将系统颜色等主题改变 如下图所示:【附加功能】

    4.4 设计理念因为这是数据库原理与应用的课程设计,所以本次的系统我们将对数据库的CURD操作尽可能的使用SQL语句让数据库自行处理,采用JAVA对数据库操作的JDBC运用预编译将SQL语句在JAVA虚拟机中翻译成数据库的底层语言,以降低对于数据库的负担。
    第五章 总结本次的课程设计,使用JAVA SWING 进行系统的开发, 在设计之余,查询过资料,对于系统界面的美化。同时,结合了课内所学的E-R图设计进行数据库的初步设计,再利用Power Designer数据库开发辅助工具生成创建数据库表的SQL脚本完成本次课程设计的初步阶段;这对我而言是一次很好的提高,之前的开发JAVA高级课程的作业时对于数据库设计都是凭借个人经验与感觉的设计,访问数据库的也时一次次的连接数据库、执行SQL语句等出现代码大量的冗余;学习方法的封装,将访问数据库的操作,以及执行SQL语句的操作封装在一个类中,减少代码冗余。经过这次的课程设计,在课程中学习到了我对系统开发有了新的认识,对前期准备工作的重要性也有了更好的理解。
    在开发过程中,大大小小的会遇到些问题,在询问老师或上网查找资料的过程中,对这项开发技术的一些细节也有了更深的理解和掌握。对于SQL语句也有了更深的理解,以及更好的运用;从刚开始每一条语句都要在数据库中执行一遍到能熟练掌握基本的增删改查语句。
    本次课设所有界面均由自己设计,对于各个界面有更深的理解以及完成过程,但也相对的会花费了更多的时间,为节约程序开发的时间按照课程进度进行,并没有很好的将程序进行分层管理,将各个模型的控制器,视图均放在一个界面中,不便于后期管理,这是本次实验有所遗憾之处。
    总的来说,本次的课程设计对我是一次很好的锻炼,让我对系统开发的需求分析阶段有了更好的理解,在实践中去领会它的优势所在无疑是最好的办法。通过本次的课程设计,提升了我在数据库设计方面的能力熟练度。
    4 评论 22 下载 2020-06-05 21:18:32 下载需要13点积分
  • 基于java和MySQL的企业固定资产管理系统

    摘要固定资产管理系统是一个企事业单位不可缺少的部分,它的内容对于企事业单位的决策者和管理者来说都至关重要,所以固定资产管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理固定资产的信息,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
    随着计算机技术的不断发展,计算机应用于各大领域,并给人们的生活带来了极大的便利,在固定管理系统亦是如此。以往固定资产员由于缺乏适当的软件而给其工作带来了很多不便。本论文所介绍的便是一个固定资产管理系统,以方便在固定资产安排和固定资产管理上的工作任务。
    关键词:固定资产管理;SQL Server数据库;C/S结构
    第1章 系统分析1.1 需求分析本系统的主要功能如下:

    管理员登录
    固定资产信息管理
    人员信息管理
    资产的领用
    资产的归还
    资产信息浏览和查询

    1.2 功能需求1.2.1 管理员登录要使用本系统必须先登录,并且只有固定资产管理员能够登录。登录的时候需要填写正确的用户名和密码,管理员可以修改自己的密码。
    系统允许有有多个固定资产的管理员,每个管理员的权限相同。
    1.2.2 固定资产信息管理固定资产信息管理又分为:
    固定资产类别管理
    固定资产的类别在录入资产信息之前就定义好,录入资产信息之后可以增加新的类别。
    类别要求分为两级,如大类可以是办公外设、数码产品、计算机等;小类分为办公外设:传真机、复印机、打印机、其它;数码产品:数码相机、投影仪;计算机:笔记本电脑、台式机、服务器等。
    类别应允许添加和删除操作。
    固定资产信息管理
    资产的信息包括编号、名称、类别、型号、价值、购买日期、状态、使用者、备注等。
    资产型号是文本信息,资产的状态分为:正常、维修、报废,使用者为空表示资产未被使用。
    资产应允许执行添加、修改和删除操作。
    1.2.3 人员信息管理这里的“人员”是指可能领用资产的人,人员的信息包括人员编号、姓名、职务和备注。
    1.2.4 资产的领用已经登记的人员,可以领用固定资产,领用时需要记录的信息有:设备编号、领用日期、管理员、用途、备注。
    只有状态为正常且使用者为空的资产才能被领用,在维修或者已经报废的资产不能够领用。
    1.2.5 资产的归还资产使用完毕后要归还给管理员,归还时根据要依据领用时的记录来填写如下信息:归还日期、管理员等。
    1.2.6 资产信息浏览和查询资产信息查询又可以分为:
    按资产类别浏览
    按资产类别浏览资产信息,类别分成两级,要求能够显示大类和小类下面的资产情况、资产状况。
    查询资产信息
    可以按资产编号、资产类别、使用者查询资产详细信息,按使用者查询显示该人员领用的所有资产。
    1.3 数据字典数据库共有5个基表,分别是:

    固定资本表ASSET
    职工表EMPLOYEE
    资产类别表CATEGORY
    用户表OPERATOR
    借用和归还表LEND

    固定资本表ASSET详细信息表:



    字段名称
    含义
    类型
    约束




    assetid
    固定资产编号
    整数(最大10位)
    主键


    asset_name
    固定资产名称
    字符(最长40位)
    非空


    cateid
    大类编码
    整数(最大10位)
    非空


    subcateid
    小类编码
    整数(最大10位)
    非空


    model
    样式
    字符(最长40位)



    price
    价格
    浮点数(最大7位,小数点后2位)
    非空


    purchase_date
    购入日期
    字符(最长12位)
    非空


    status
    状态
    字符(最长1位)
    非空


    useby
    经手人
    字符(最长10位)



    remarks
    备注
    字符(最长255位)



    职工表EMPLOYEE详细信息表:



    字段名称
    含义
    类型
    约束




    empno
    职工编号
    整数(最大10位)
    主键


    ename
    职工姓名
    字符(最长40位)
    非空


    position
    职位
    字符(最长40位)
    非空


    remarks
    备注
    字符(最长255位)



    资产类别表CATEGORY详细信息表:



    字段名称
    含义
    类型
    约束




    cateid
    大类编号
    整数(最大10位)
    联合主键


    catename
    大类名称
    字符(最长40位)
    非空


    subcateid
    小类编号
    整数(最大10位)
    联合主键


    subcatename
    小类名称
    字符(最长40位)
    非空



    用户表OPERATOR详细信息表:



    字段名称
    含义
    类型
    约束




    name
    用户名
    字符(最长10位)



    pwd
    口令
    字符(最长20位)



    借用和归还表LEND详细信息表:



    字段名称
    含义
    类型
    约束




    assetid
    固定资产编号
    整数(最大10位)
    主键


    empno
    借用人编码
    整数(最大10位)
    非空


    usedate
    借用日期
    字符(最长12位)
    非空


    retdate
    归还日期
    字符(最长12位)



    isreturn
    是否归还
    字符(最长4位)
    非空


    lender
    操作员
    字符(最长12位)



    remarks
    备注
    字符(最长255位)



    第2章 系统设计2.1 系统总体设计主要界面类有:

    主界面(包括查询条件界面类、固定资产卡片界面类、资产类别树型结构界面类、固定资产表格界面类)
    固定资产管理弹出界面类
    职工管理弹出界面类
    资产类别管理弹出界面类
    借用和归还管理弹出界面类
    用户管理弹出界面类

    主要实体类包括:

    固定资产实体类
    职工实体类
    用户实体类
    资产类别实体类
    借用和归还实体类

    界面类与实体类之间的关系:
    界面类负责显示实体类的内容,实体类负责存储当前操作的内容,而永久保存的内容需存储到数据库中。见如下示意图:

    第3章 系统实现3.1 程序设计登陆界面如下:

    主界面模型图如下:

    3.1.1 设备管理模块固定资产管理弹出界面描述:
    界面示意图如下:

    源代码:
    /* *AssetModel.java:建立固定资产实体类。 *包括:与数据库进行增、删、改、查操作。 */import java.sql.*;import java.math.*;public class AssetModel {String assetid;String assetname;String cateid;String subcateid;String model;String price;String purchasedate;String status;String useby;String remarks;DbConn dbc;Connection conn; public AssetModel() { }/** 添加方法*/ public void insert() { dbc = new DbConn(); conn = dbc.getConnection(); try { Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery ("select max(assetid)+1 from asset"); while (rset.next()) { assetid = rset.getString(1); } if (assetid == null) assetid = "1";PreparedStatement pstmt = conn.prepareStatement("inser tinto ASSET (assetid,asset_name,cateid,subcateid,model,price,purchase_date,status,useby,remarks) values (?,?,?,?,?,?,?,?,?,?)"); pstmt.setInt(1, Integer.parseInt(assetid)); pstmt.setString(2, assetname); pstmt.setInt(3, Integer.parseInt(cateid)); pstmt.setInt(4, Integer.parseInt(subcateid)); pstmt.setString(5, model); pstmt.setFloat(6, Float.parseFloat(price)); pstmt.setString(7, purchasedate); pstmt.setString(8, status); pstmt.setString(9, useby); pstmt.setString(10, remarks); pstmt.execute(); PreparedStatement pstmt1 = conn.prepareStatement("insert into LEND (assetid) values (?)"); pstmt1.setInt(1, Integer.parseInt(assetid)); pstmt1.execute(); conn.commit(); conn.close(); } catch (java.sql.SQLException s) { System.out.println("exception: " + s.getMessage()); } } /** 查询方法*/ public void select() { String sql; dbc = new DbConn(); conn = dbc.getConnection(); sql = "SELECT assetid,rtrim(asset_name),cateid,subcateid,rtrim(model),price,purchase_date,status,useby,rtrim(remarks) FROM asset where assetid = "+Integer.parseInt(assetid); try { Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery (sql); while (rset.next()) { assetname = rset.getString(2); cateid = rset.getString(3); subcateid = rset.getString(4); model = rset.getString(5); price = rset.getString(6); purchasedate = rset.getString(7); status = rset.getString(8); useby = rset.getString(9); remarks = rset.getString(10); } conn.commit(); rset.close(); stmt.close(); conn.close(); } catch (java.sql.SQLException s) { System.out.println("exception: " + s.getMessage()); } } public void update() { dbc = new DbConn(); conn = dbc.getConnection(); try { PreparedStatement pstmt = conn.prepareStatement("update ASSET set asset_name=?,model=?,price=?,purchase_date=?,status=?,useby=?,remarks=? where assetid = ?"); pstmt.setString(1, assetname); pstmt.setString(2, model); pstmt.setFloat(3, Float.parseFloat(price)); pstmt.setString(4, purchasedate); pstmt.setString(5, status); pstmt.setString(6, useby); pstmt.setString(7, remarks); pstmt.setInt(8, Integer.parseInt(assetid)); pstmt.execute(); conn.commit(); conn.close(); } catch (java.sql.SQLException s) { System.out.println("exception: " + s.getMessage()); } } /** 删除方法*/ public void delete() { dbc = new DbConn(); conn = dbc.getConnection(); String sql = "delete asset where assetid = "+Integer.parseInt(assetid) ; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.execute(); String sql1 = "delete lend where assetid = "+Integer.parseInt(assetid) ; PreparedStatement pstmt1 = conn.prepareStatement(sql1); pstmt1.execute(); conn.commit(); conn.close(); assetid = null; assetname = null; cateid = ""; subcateid = ""; model = null; price = null; purchasedate = null; status = ""; useby = null; remarks = null; } catch (java.sql.SQLException s) { System.out.println("exception: " + s.getMessage()); } }}
    其余4块管理弹出界面描述同上。
    参考文献[1] 万建成、卢雷 编著.《软件体系结构的原理、组成与应用》.科学出版社
    [2] 齐治昌、谭庆平、宁洪 编著.《软件工程》.北京高等教育出版社
    [3](美)RogerS.Pressman 著,黄柏素、梅宏译.《软件工程──实践者的研究方法(第四版)》.北京机械工业出版社
    2 评论 187 下载 2018-12-28 08:55:57 下载需要10点积分
  • 基于Java开发的图书管理系统

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

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

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

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

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



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




    Book_id
    图书编号
    varchar(15)
    主键



    Type_id
    类别编号
    varchar(10)
    外键



    Type_name
    类别名称
    varchar(20)
    外键



    Book_name
    书名
    varchar(20)




    Book_writer
    作者
    varchar(10)




    Book_company
    出版社
    varchar(20)




    Book_date
    出版日期
    datetime




    Book_brief
    简介
    varchar(100)





    学生信息表T-student



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




    Stu_id
    学号
    varchar(15)
    主键



    Stu_name
    姓名
    varchar(10)




    Stu_pwd
    密码
    varchar(20)




    Stu_sex
    性别
    varchar(2)




    Stu_tel
    联系电话
    varchar(15)




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



    Stu_Depart
    所在院系
    varchar(10)





    管理员信息表T-admin



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




    Admin_id
    工作号
    number(5)
    主键



    Admin_name
    姓名
    varchar(10)




    Admin_pwd
    密码
    varchar(20)





    借阅信息表T-borrow_student



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




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



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



    Borrow_date
    借阅日期
    datetime




    Return_date
    还书日期
    datetime




    renew
    是否续借
    varchar(2)





    图书类别信息表T-book_type



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




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



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




    3.1.1 动态数据
    输入数据:

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

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

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

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

    读者借书过程:

    读者还书过程

    读者查询浏览过程

    图书管理员查询浏览过程

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

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

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

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

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

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

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

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

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

    4.2.2 读者查询修改功能:

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


    4.2.3 图书添加功能:

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


    4.2.4 图书查询修改功能:

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


    4.2.5 借书模块功能:

    借书

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

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


    4.2.7 续借模块功能:

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


    4.2.8 图书查询模块功能:

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


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

    1、项目功能:模拟QQ本题需要综合使用数据结构的知识。该聊天系统使用了TCP协议、sqlite3数据库、json库和Makefile等的综合应用。通讯时客户端要输入服务端的IP和端口号。在使用前要先安装sqlite3数据库和json库,安装完之后直接make,服务端直接运行./app_server,客户端直接运行./app_client。能够实现用户注册、登录、私聊、群聊、加好友、好友列表、退出。
    2、项目框架代码格式

    客户端

    client_head.hclient_fun.cclient_main.c
    服务器

    server_head.hserver_fun.cserver_main.c

    数据包结构体
    typedef struct Login_msg{ int cmd; //协议号:1 注册 2 登录 3 退出 char name[20]; //用户名 char password[20]; //密码 int user_qq; //用户QQ号}login_msg;typedef struct Msg{ int cmd; //协议号:1 私聊 2 群聊 3建立群 4加入群 5 加好友 6 好友列表 7 退出 int user_qq_from; //自己的QQ号(群号) int user_qq_to; //目标QQ号 char buf[512]; //消息}msg;
    client代码
    一级菜单:
    *************************************************1、注册 2、登录 3、退出*************************************************二级菜单:
    *********************************************************************************1、私聊 2、群聊 3、创建群 4、加入群 5、添加好友 6、好友列表 7、退出*********************************************************************************server代码:链表保存
    typedef struct Link{ int user_qq; //用户QQ号 int newfd; //对应的文件描述符 struct Link *next;}link, *plink;
    登录时头插链表,退出时删除。
    数据库表格
    文件名:server_data.db
    create table user_data (name char[20], password char[20], user_qq int); //登录用create table friend_data (user_qq int, user_qq_friend int); //好友用create table group_data (group_qq int, user_qq int); //群聊用
    3、程序截图





    0 评论 3 下载 2021-07-05 18:42:17 下载需要10点积分
  • 基于java的班级管理系统

    一、需求分析
    能够实现对班级学生基本资料的录入,包括学生的学号,姓名,性别,所学专业,家庭住址以及出生年月等
    能够实现对学生基本资料的修改
    根据学号对学生资料进行查询
    能够删除某些学生的资料

    二、总体设计本班级管理系统共有6个java源文件。
    类之间的主要关系如下图所示:

    各主类的主要作用如下:

    StudentManager.java

    该java文件的类负责创建班级学生管理系统的主窗口。该类包含main方法,程序从该类开始执行
    StudentStituation.java

    该文件的类负责创建班级学生管理系统的学生信息录入界面
    ModifySituation.java

    该文件的类负责创建班级学生管理系统的学生基本信息修改界面
    Inquest.java

    该文件的类负责创建班级学生管理系统的学生基本信息查询界面
    Delete.java

    该文件的类负责创建班级学生管理系统的学生信息删除界面
    Student.java

    负责创建存放学生信息的对象

    三、详细设计3.1 主类StudentManager.java成员变量



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




    基本信息录入界面
    StudentSituation
    基本信息录入


    基本信息修改界面
    ModifySituation
    基本信息修改


    基本信息查询界面
    Inquest
    基本信息查询


    基本信息删除界面
    Delete
    基本信息删除


    菜单选项
    JMenuItem
    录入,修改,查询,删除


    存基本信息的散列表
    Hashtable
    基本信息


    存放散列表的文件
    File
    file



    方法



    名称
    功能
    备注




    StudentManager
    创建程序主窗口
    构造方法


    actionPerformed
    处理ActionEvent事件
    接口方法


    main
    程序开始运行



    3.2 录入界面成员变量



    描述
    变量类型
    变量名称




    存放“学生”对象的散列表
    Hashtable
    基本信息表


    输入学生基本信息的文本
    JTextField
    学号,姓名,所学专业,家庭住址,出生


    存放学生信息的对象
    Student
    学生



    方法



    名称
    功能
    备注




    StudentSituation
    创建学生信息录入界面
    构造方法


    actionPerformed
    处理ActionEvent事件
    接口方法



    3.3 查询界面成员变量



    描述
    变量类型
    变量名称




    存放“学生”对象的散表
    Hashtabel
    基本信息表


    显示学生基本信息的文本
    JTextField
    学号,姓名,所学专业,家庭住址,出生



    方法



    名称
    功能
    备注




    Inquest
    创建查询界面
    构造方法


    actionPerformed
    处理ActionEvent事件
    接口方法



    3.4 修改界面成员变量



    描述
    变量类型
    变量名称




    存放“学生”对象的散列表
    Hashtabel
    基本信息表


    输入学生基本信息的文本条
    JTextField
    学号,姓名,所学专业,家庭住址,出生



    方法



    名称
    功能
    备注




    ModifySituation
    创建学生信息修改界面
    构造方法


    actionPerform
    处理ActionEvent事件
    接口方法



    3.5 删除界面成员变量



    描述
    变量类型
    变量名称




    存放“学生”对象的散列表
    Hashtabel
    基本信息表


    显示学生基本信息的文本条
    JTextField
    学号,姓名,所学专业,家庭住址,出生



    方法



    名称
    功能
    备注




    Delete
    创建学生信息删除界面
    构造方法


    actionPerformed
    处理ActionEvent
    接口方法



    3.6 学生对象成员变量



    描述
    变量类型
    变量名称




    学号
    String
    Number


    姓名
    String
    Name


    所学专业
    String
    Discipling


    家庭住址
    String
    Grade


    出生
    String
    Borth


    性别
    String
    Sex



    方法



    名称
    功能




    Setnumber
    设置学号


    Setnumber
    获取学号


    Setname
    设置姓名


    Setname
    获取姓名


    setDisciping
    设置所学专业


    setDisciping
    获取所学专业


    setGrade
    设置家庭住址


    setGrade
    获取家庭住址


    setBorth
    设置出生


    setBorth
    获取出生


    setSex
    设置性别


    setSex
    获取性别



    四、测试结果程序运行的主要界面如下所示:


    6 评论 199 下载 2019-01-03 08:51:02 下载需要10点积分
  • 基于Android的手机音乐播放器的设计与实现

    摘 要随着Android系统和移动互联网的快速崛起,手机已经成为人们生活不可缺的一部分,在现代人的生活中,人们生活节奏的加快,生活压力越来越大,碎片化的时间越来越多,那么一个可以在碎片化的时间内调节自己心情的产品,无疑将拥有一个巨大的市场,而且随着移动设备硬件越来越先进,人们对移动设备的软件要求也越要越高,而基于Android系统的手机音乐播放器就能很好地满足这个需求。
    Android是一个开源的基于Linux的系统,本论文将基于Android开源系统技术,使用java语言和Android Studio开发工具实现基于Android系统的音乐播放器。相对于传统的卡带式音乐播放器,MP3播放器,MP4播放器,Android系统的手机音乐播放器有着反应速度快,在线听音乐,分享心情感受,收藏歌曲等无法比拟的优势,Android系统的手机音乐播放器逐渐成为人们生活不可或缺的一部分,所以一个基于Android的音乐播放器无疑将拥有一个巨大的市场。
    本文将会详细地从需求分析开始,认真分析用户需求,然后进行界面,数据库等的设计工作。进而使用java实现需求,开发出一个高效的贴近用户的操作简单的音乐APP。最后通过系统化的测试,检验系统的稳定性。同时也要总结整个过程并指出播放器的不足之处,并提出修改的思路。
    关键词:Android,音乐播放器,高效
    AbstractWith the rapid rise of the Android system and mobile Internet, mobile phones have become an indispensable part of people’s lives. In modern people’s lives, people’s life pace is accelerated, life pressure is increasing, and fragmentation takes more and more time. Then a product that can adjust its mood in a fragmented time will undoubtedly have a huge market, and as the hardware of mobile devices becomes more and more advanced, people’s software requirements for mobile devices will also be higher, based on Android. The system’s mobile music player will be able to meet this demand.
    Android is an open source Linux-based system. This article will be based on Android open source system technology, using java language and Android Studio development tools to achieve Android-based music player. Compared to traditional cassette music players, MP3 players, MP4 players, Android mobile music players have a fast response, listen to music online, share feelings, collect songs and other incomparable advantages, Android system Mobile music players have gradually become an integral part of people’s lives, so an Android-based music player will undoubtedly have a huge market.
    This article will start from the requirements analysis in detail, carefully analyze the user requirements, and then proceed with the design of the interface and database. Then use java to realize the demand and develop an efficient and simple music APP that is close to the user. Finally, through systematic testing, the stability of the system is checked. At the same time, we must also sum up the entire process and point out the inadequacies of the player and propose revised ideas.
    Key words: Android, MusicPlayer, Efficient
    1 前言1.1 研究目的与意义现今社会生活节奏越来越快,而听音乐是舒缓压力的有效方式之一,本文的主要目的是开发一个方便快捷地为大众提供服务的音乐播放器,它可以支持多种格式播放,比如MP3,Wav等多种格式,并且能够控制音乐的播放暂停,停止,上一首,下一首等功能,界面简洁,操作简单。
    在现代生活中,能在空闲的时间里听一下音乐,无疑是一大乐趣,而随着科技的进步,人们听音乐的方式也在悄悄地改变,从传统的MP3转到了智能手机,这时候一个好的音乐APP就可以满足你要求的一切,所以本系统选择移动手机作为开发平台。
    目前,移动互联网已经超越传统PC,成为最大的互联网市场,在庞大的手机市场中,主流的手机操作系统包括Android,IOS,Windows mobile,相对于Windows mobile的一蹶不振,IOS的封闭,Android系统由于它的开放性,吸引了越来越多的开发者投身于Android开发社区中,Android成为现今最受欢迎的系统,所以本文选择Android作为开发的目的系统。
    综上,本文选择为基于Android系统的手机音乐播放器,传统的手机音乐播放器一味地追求功能强大而忽略了CPU和内存占用率过大,对低端智能手机用户不友好,所以该APP追求的是一个更加简洁,通用性广的音乐播发器,同时本系统也会在这基础上追求为用户提供更多音乐资源,致力于打造一个最适合大部分用户的APP,同时本人也可以借助这个机会学习Android移动平台的开发技能。
    1.2 研究概况首先简单介绍一下Android系统,Android开始的时候是Rubin Andy团队开发的一个独立的手机系统,他是基于Linux内核,后来(2005年)该系统被Google公司收购,2007年11月Google宣布退出基于Linux的Android开源系统,而这时正值Apple发布革命性产品iPhone。发展到现在,Android已经更新的8.0,Android也经历了11个年头,也成为了市场占有率最高的系统。根据最新市场调查,在中国市场,Android市场份额上升7.2%,达到79.9%,iOS用户则下滑5.4%,Windows几乎面临“绝迹”,而且还具有上升的趋势。
    在Android系统中主流的音乐播放器有百度音乐,酷狗音乐、QQ音乐、天天动听、网易云音乐。
    百度音乐的前身为“千千静听”,二者进行整合之后更是发挥了自身优势,为用户带来了更加完美的视听享受。且百度音乐重视原创和正版,在应用中还专门设立了原创歌曲榜单。百度音乐独有场景电台功能,可根据当前的时间为您推荐不同种类的歌曲,相当的智能化,比如午后会为您推荐一些慵懒又温暖的音乐,而在下班的路上则会推荐一些较为轻快的乐曲。除此之外,百度音乐还有K歌台服务,这里有大量歌曲供您选择,且提供伴奏曲,您尽可以举着手机高歌一曲,保存后还可分享给好友们收听,或请他们也来PK一下,不只是听歌,百度音乐还能满足您唱歌的需求。
    酷狗算是老牌的音乐播放器了,出色的交互设计和良好的使用体验让它积累了不少忠实用户,酷狗音乐拥有海量乐曲库,并且都是正版,这是因为酷狗与多家媒体或唱片公司都是合作伙伴关系,不但在质量上有所保证,更新速度也能保持同步。酷狗音乐中有个功能叫做“演艺直播”,这里聚集着大量的草根明星,用自己的歌喉为用户们献上一首首精心录制的歌曲,用户可为她送礼物和她交流,也能自己点歌,和舞台上的明星不同,这里多了一丝亲切的味道。
    QQ音乐,但它的优势在于,结合着QQ自身的优势,让用户可以享受到更多的服务。听歌识曲应该是音乐客户端的标准配置了,可QQ音乐却将识曲与摇一摇相结合,无需任何点击,晃动一下即可启动,不仅方便还增添了不少乐趣。QQ音乐为用户们准备了明星部落,这里汇聚了明星们的一手消息,和大量的话题,保证能满足用户追星的需求。
    天天动听是上海水渡石旗下的一款音乐播放器,以其绚丽的可视化效果赢得了用户的喜爱,在播放时封面还会随着音乐一起变换,在视觉和听觉上都是一种享受。它功能丰富实用,支持多种格式的歌曲,操作简单流畅,听歌也能变得如此简单,它功能丰富实用,支持多种格式的歌曲,操作简单流畅,听歌也能变得如此简单,天天动听提供了摇一摇切歌功能,且摇的力度也不尽相同。用户可自己设置首页显示内容,个性化做的非常出众。
    网易云音乐上线仅有几年的时间,但是它却迅速成为了用户们追捧的对象,不止是因为其出众的界面设计,在操作体验上也令人印象深刻,网易云音乐在功能上也有创新,它融入了流行的社交元素,让用户在听歌之外,还能实现分享交流的目的。网易云音乐的与众不同之处,是社交,评论、分享让大家因为对音乐的共同品味而走到了一起,除此之外就是主播电台栏目,音乐故事、情感调频、娱乐八卦,还有热度极高的明星做主播,与听CD的感觉完全不同,偶像与粉丝之间消除了隔阂感,距离更近一些。当然其它的功能在网易云音乐中也能找到,比如听歌识曲、定时停止播放,还可以更换主题皮肤。
    1.3 论文的主要工作本文主要针对播放器的基本功能进行实现,主要研究内容分为:对播放界面的优化,美观的播放界面会给用户带来更好的体验,文中主要提到对图片毛玻璃效果的实现,基于百度音乐API的接口实现访问,跨进进程调度音乐播放器,最后还使用高德地图API实现实时的天气预报功能。
    1.4 论文的结构本论文各章内容安排如下:

    第一章:前言,介绍了国内的Android手机音乐播放器发展现状,并进一步分析了这些软件对于用户使用的一些不足
    第二章:开发技术及工具的介绍,这里主要阐述Android系统的发展和架构,Retrofit和Rxjava作为Android客户端访问网络的的框架,和使用MVP的设计模式,使用Android Studio 开发Android端,Idea作为后台的开发工具,JavaEE技术,MySQL数据库,Spring-Boot框架
    第三章:需求分析。通过对该系统实现的可行性做了分析,在了解需求的基础上,对系统的功能需求做了阐述,采用了用例图、用例简介、活动图、包图等对系统的流程进行了分析
    第四章:系统总体设计。概括分析说明了音乐播放器的主要功能,在了解需求的基础上,设计了系统的总体功能模块。从概念结构设计、物理结构设计及数据库设计三方面对系统的设计进行介绍
    第五章:系统详细设计。分别通过时序图、界面、核心代码(内附界面截图及精髓技术的代码)。阐述播放器播放音乐流程。并介绍了本文实践项目的一些亮点与独到之处
    第六章:系统测试。对目前常用的测试技术进行了介绍并介绍了测试该系统的方法
    第七章:结束语。总结整个设计,并说明不足及进一步改善的方向

    2 开发技术及工具的介绍在本章中,本系统主要采用Retrofit和Rxjava作为Android客户端访问网络的的框架,使用MVP的设计模式,使用Android Studio 开发Android端,Idea作为后台的开发工具,使用JavaEE技术,使用MySQL作为后台数据库,Spring-Boot框架。
    2.1 Android系统简介Android是一个基于Linux内核的开放源代码移动操作系统,由Google成立的Open Handset Alliance(OHA,开放手持设备联盟)持续领导与开发,主要设计用于触屏移动设备如智能手机和平板电脑与其他便携式设备。
    Android系统最初并不是由Google公司研发的,Android最初由安迪•鲁宾(Andy Rubin)的团队开发制作,最初开发这个系统的目的是创建一个数码相机的先进操作系统;但是后来发现市场需求不够大,加上智能手机市场快速成长,于是Android成为一款面向智能手机的操作系统。于2005年7月11日被美国科技企业Google收购。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商成立开放手持设备联盟来共同研发改良Android,随后,Google以Apache免费开放源代码许可证的授权方式,发布了Android的源代码,开放源代码加速了Android普及,让生产商推出搭载Android的智能手机,Android后来更逐渐拓展到平板电脑及其他领域上。随着时间的推移,Android系统逐渐强大起来,现在Android已经成为了全球最大的移动操作系统,Android从面世以来已经有二十多个版本了在这几年的发展过程中,谷歌为Android建立了一个完整的生态系统[5]。Android系统的主要厂商有SAMSUNG,华为,HTC,OPPO,VIVO,小米等。目前最新的额Android版本是Android 8.1(更智能、更迅捷、更强大。广受世人喜爱的不仅仅是曲奇饼干,更是为您打造的全新 Android 系统[1]) 。
    Android系统由高到低分为Application层、Application Framework层、Libraries层、AndroidRuntime层,和 Linux 内核层。蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C和和语言编写的程序库,红色的代码内核(linux内核和driver)。在Application Framework之下,由C/C和和的程序库组成,通过JNI完成从JAVA到C的调用。

    2.1.1 Application所有的应用程序都是使用JAVA语言编写的,每一个应用程序由一个或者多个活动组成,活动必须以Activity类为超类,活动类似于操作系统上的进程,但是活动比操作系统的进程要更为灵活,与进程类似的是,活动在多种状态之间进行切换。利用JAVA的跨平台性质,基于Android框架开发的应用程序可以不用编译运行于任何一台安装有android系统的平台,这点正是Android的精髓所在[6]。
    2.1.2 Application Framework应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。帮助程序员快速的开发程序,并且该应用程序重用机制也使用户可以方便的替换程序组件[11]。
    2.1.3 LibrariesAndroid包含一个C/C和和库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库。
    2.1.4 Android Runtime层Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
    2.1.5 Linux内核Android 的核心系统服务依赖于 Linux 2.6 内核 ,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
    2.2 Retrofit技术框架A type-safe HTTP client for Android and Java[2],这是Retrofit官网对Retrofit的定义。Retrofit 是 Square公司旗下的类型安全的 HTTP 客户端,支持 Android 和 Java 等,它能将你的 HTTP API 转换为 Java 接口。Retrofit其实就是对okhttp做了进一步一层封装优化。用户只需要通过简单的配置就能使用Retrofit来进行网络请求了。
    Retrofit能够直接返回Bean对象,例如如果用户进行一个网络接口的请求,返回来一串json字符串。那么这个时候一般用户都要拿到这个json字符串后进行解析得到对应的Bean对象,Retrofit只要依赖一下Gson的转换库然后进行简单的配置就能够直接拿到Bean对象了,不需要用户自己去解析。
    2.3 Rxjava技术框架RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences[3]。Rxjava和Retrofit都是由Square公司开发的开源框架,Rxjava一般配合Retrofit一起使用,RxJava是JVM的响应式编程扩展是一个为Java虚拟机编写的使用可观察序列的构建异步的基于事件的程序的类库。它基于观察者模式实现对数据/事件的序列的支持,并添加了一些操作符,允许你以声明式构建序列, 使得开发者无需关心底层的线程、同步、线程安全和并发数据结构。
    2.4 MVP框架技术简介对于一个应用而言用户需要对它抽象出各个层面,而在MVP架构中它将UI界面和数据进行隔离,所以用户的应用也就分为三个层次。

    View:对于View层也是视图层,在View层中只负责对数据的展示,提供友好的界面与用户进行交互。在Android开发中通常将Activity或者Fragment作为View层
    Model:对于Model层也是数据层。它区别于MVC架构中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等
    Presenter:对于Presenter层他是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示。这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同时也将业务逻辑从View中抽离。更好的使得单元测试得以实现[14]

    下图很好的展示了MVP各个组件间的关系:

    2.5 Android studio开发工具简介Android Studio是一个为Android平台开发程序的集成开发环境。2013年5月16日在Google I/O上发布,可供开发者免费使用。2013年5月发布早期预览版本,版本号为0.1。2014年6月发布0.8版本,至此进入beta阶段。第一个稳定版本1.0于2014年12月8日发布。Android Studio基于JetBrains IntelliJ IDEA,为Android开发特殊定制,并在Windows、OS X和Linux平台上均可运行。
    Android Studio 是基于 IntelliJ IDEA 的官方 Android 应用开发集成开发环境 (IDE)。 除了 IntelliJ 强大的代码编辑器和开发者工具,Android Studio 提供了更多可提高 Android 应用构建效率的功能,例如:

    基于 Gradle 的灵活构建系统
    快速且功能丰富的模拟器
    可针对所有 Android 设备进行开发的统一环境
    Instant Run,可将变更推送到正在运行的应用,无需构建新的 APK
    可帮助您构建常用应用功能和导入示例代码的代码模板和 GitHub 集成
    丰富的测试工具和框架
    可捕捉性能、易用性、版本兼容性以及其他问题的 Lint 工具
    C和和 和 NDK 支持
    内置对 Google 云端平台的支持,可轻松集成 Google Cloud Messaging 和 App 引擎
    对最新的Google主推的开发语言Kotlin进行支持

    目前Android Studio的最新版本时3.1。
    2.6 IntelliJ IDEA开发工具简介IntelliJ IDEA是一种商业化销售的Java集成开发环境(Integrated Development Environment,IDE)工具软件,由捷克软件公司JetBrains在2001年1月时推出最初版。
    IntelliJ IDEA是用于开发计算机软件的Java集成开发环境(IDE)。 它由JetBrains(以前称为IntelliJ)开发,可作为Apache 2许可社区版本和专有商业版本提供。 两者均可用于商业开发。
    IntelliJ IDEA能尽可能地促进程序员的编程速度。它包括了很多辅助的功能,并且与Java结合得相当好。不同的工具窗口围绕在主编程窗口周围,当鼠标点到时即可 打开,无用时也可轻松关闭,使用户得到了最大化的有效屏幕范围。以技术为导向的IDEA集成了调试器,支持本地和远程的调试,即使用户需要修改一些设置上 的东西使用户的工作顺利进展。另外,它还提供了通常的监视,分步调试以及手动设置断点功能,在这种断点模式下,用户可以自动地在断点之外设置现场访问,甚 至可以浏览不同的变量的值。IDE支持多重的JVM设置,几个编译程序和Ant建造系统,并且,它使得设置多重的自定义的类途径变得简单。
    IntelliJ IDEA是一个相对较新的Java IDE。它是Java开发环境中最为有用的一个。高度优化的IntelleJ Idea使普通任务变得相当容易,Idea支持很多整合功能,更重要的使它们设计的好容易使用。Idea支持XML中的代码实现,Idea同时还会校正 XML,Idea支持JSP的结构。作用于普通Java代码的众多功能同样适用于JSP(比如整合功能),同时支持JSP调试;支持EJB,尽管它不包括 对个别应用服务器的特殊支持。Idea支持Ant建立工具,不仅是运行目标它还支持编译与运行程序前后运行目标,另外也支持绑定键盘快捷键。在编辑一个 Ant建立XML文件时,Idea还对组成Ant工程的XML部分提供支持。IntelliJ IDEA 被称为是最好的JAVA IDE开发平台,这套软件就是以其聪明的即时分析和方便的 refactoring 功能深获大家所喜爱。缺点是较复杂,对初学者来说,理解起来比较困难。
    2.7 PowerDesign工具介绍Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型,还可以为数据仓库制作结构模型,也能对团队设计模型进行控制。他可以与许多流行的数据库设计软件,例如PowberBuilder,Delphi,VB等相配合使来缩短开发时间和使系统设计更优化。
    2.8 Rotation Rose简介由于本系统使用RUP设计模式,需要建立可视化建模。可视化建模(VISUAL MODELING)是利用围绕现实想法组织模型的一种思考问题的方法。模型对于了解问题、与项目相关的每个人(客户、行业专家、分析师、设计者等)沟通、模仿企业流程、准备文档、设计程序和数据库来说都是有用的。建模促进了对需求的更好的理解、更清晰的设计、更加容易维护的系统。
    Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具。用于可视化建模和公司级水平软件应用的组件构造。
    Rational Rose 是一个完全的,具有能满足所有建模环境(Web开发,数据建模,Visual Studio和 C和和 )需求能力和灵活性的一套解决方案。Rose 允许开发人员,项目经理,系统工程师和分析人员在软件开发周期内在将需求和系统的体系架构转换成代码,消除浪费的消耗,对需求和系统的体系架构进行可视化,理解和精练。通过在软件开发周期内使用同一种建模工具可以确保更快更好的创建满足客户需求的可扩展的、灵活的并且可靠的应用系统。
    2.9 Spring-boot技术简介Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible[4]。Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
    从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用。框架的发布版本,包括集成的CLI(命令行界面),可以在Spring仓库中手动下载和安装。
    要进行打包和分发的工程会依赖于像Maven或Gradle这样的构建系统。为了简化依赖图,Boot的功能是模块化的,通过导入Boot所谓的“starter”模块,可以将许多的依赖添加到工程之中。为了更容易地管理依赖版本和使用默认配置,框架提供了一个parent POM,工程可以继承它。
    2.10 Mysql数据库简介MySQL Enterprise Edition includes the most comprehensive set of advanced features, management tools and technical support to achieve the highest levels of MySQL scalability, security, reliability, and uptime。 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言—结构化查询语言(SQL)进行数据库管理。由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
    MySQL的海豚标志的名字叫“sakila”,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。
    MySQL,虽然功能未必很强大,但因为它的开源、广泛传播,导致很多人都了解到这个数据库。它的历史也富有传奇性。
    2.11 Glide框架Glide is a fast and efficient open source media management and image loading framework for Android that wraps media decoding, memory and disk caching, and resource pooling into a simple and easy to use interface。[7]在泰国举行的谷歌开发者论坛上,谷歌为开发者介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。
    Glide中有一部分单词,用英文单词可能在行文中更加合适,还有一些词在Glide中有特别的含义,这里简要说明一下:

    View:一般情况下,指Android中的View及其子类控件(包括自定义的),尤其指ImageView。这些控件可在上面绘制Drawable
    Target:Glide中重要的概念,目标。它即可以指封装了一个View的Target(ViewTarget),也可以不包含View(SimpleTarget)
    Drawable:指Android中的Drawable类或者它的子类,如BitmapDrawable等。或者Glide中继承Drawable实现的自定义Drawable(如GifDrawable等)。Request - 加载请求,可以是网络请求或者其他任何下载图片的请求,也是Glide中的一个类
    Model:数据源的提供者,如Url,文件路径等,可以从model中获取InputStream
    Signature:签名,可以唯一地标识一个对象
    recycle():Glide中Resource类有此方法,表示该资源不被引用,可以放入池中(此时并没有释放空间)。Android中Bitmap也有此方法,表示释放Bitmap占用的内存

    2.12 MybatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。[9]MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    3 需求分析3.1 系统概述本系统主要的用户为广大的Android手机用户提供音乐播放,歌曲下载,歌迷互动三大模块功能。
    3.2 系统分析3.2.1 系统需求分析随着Android系统和移动互联网的快速崛起,手机已经成为人们生活不可缺的一部分,在现代人的生活中,人们生活节奏的加快,生活压力越来越大,碎片化的时间越来越多,那么一个可以在碎片化的时间内调节自己心情的产品,无疑将拥有一个巨大的市场,而基于Android系统的手机音乐播放器就能很好地满足这个需求。
    通过调查分析,本系统的用户为广大的Android手机用户,用户可以通过本系统实现音乐播放的基本功能包括播放,暂停,上一首,下一首等。用户还可以分享歌曲,对歌曲进行评论或者点赞别人的评论,下载歌曲,具体需求如下:

    音乐播放,音乐播放包括了音乐播放的基本功能:开始,暂停,上一首,下一首,同时还可以滑动唱片来实现切换上下首,通过拖动进度条来切换到音乐的不同位置
    歌曲下载,首先用户需要搜索所需要的歌曲,然后点击下载。同时用户可以搜索不同平台的歌曲,这样就可以不会因为不同版权而听不到音乐
    乐迷互动,用户可以通过在播放页面的评论按钮评论歌曲,进入评论界面后还可以对自己喜欢的评论进行点赞或者评论,同时歌迷也可以通过分享到第三方平台一起享受音乐带来的乐趣

    3.2.2 系统可行性分析
    经济可行性:本系统作为一个毕业设计,并不需要任何的开发经费,而且本人也可以通过这次机会提升本人的Android开发技术和后台技术。并且本系统由于其简介的界面设计和丰富的资源平台将在这个巨大的市场有很大的发展空间
    技术可行性: 为了保证系统开发成功,必须采用RUP的系统开发方法。并且采取主流的MVP设计框架,运用成熟的技术比如Rxjava和Retrofit,还有Glide等。后台也采用了目前主流的MySQL作为数据库,数据安全得到了很好的保障,Tomcat 8.5作为服务器,使用Spring-Boot简易开发

    就本人而言,本人有系统地学习Android开发基础同时也有不错的Android开发技术,和Retrofit和Rxjava的开发经验,也有Spring-Boot的开发技术,所以技术可行性上是没有问题的。
    3.2.3 系统用力模型分析3.2.3.1 包图
    3.2.3.2 用例图及其用例简介用例图定义:由参与者(Actor)、用例(Use Case)以及它们之间的关系构成的用于描述系统功能的动态视图称为用例图。
    音乐播放用例:本用例可以通过通过播放器进行对音乐播放的基本操作,包括上一首,下一首,播放,暂停,还有拖动到某一时间点的功能。

    歌曲下载,首先用户需要搜索所需要的歌曲,然后点击下载。同时用户可以搜索不同平台的歌曲,这样就可以不会因为不同版权而听不到音乐。

    乐迷互动,用户可以通过在播放页面的评论按钮评论歌曲,进入评论界面后还可以对自己喜欢的评论进行点赞或者评论,同时歌迷也可以通过分享到第三方平台一起享受音乐带来的乐趣。

    3.3 系统用例分析本文将采用活动图来阐述系统的业务用例实现的工作流程,通过业务工作流程说明业务为向所服务的业务主角提供其所需的价值而必须完成的工作。业务用例由一系列活动组成,它们共同为业务主角生成某些工件。工作流程通常包括一个基本工作流程和一个或多个备选工作流程。工作流程的结构使用活动图来进行说明。
    3.3.1 用例阐述3.3.1.1 播放音乐
    基本流

    用户启动应用并进入播放界面后播放界面有播放,上一首,下一首三个按钮,用户点击播放按钮系统监听到用户点击播放按钮的回调后,系统查找播放列表,判断播列表是否有歌曲。系统找到歌曲,系统将歌曲信息发送给MediaPalyer,MediaPlayer根据歌曲信息找到播放源进行播放
    备选流

    系统在监听到用户点击播放按钮的回调后,系统查找播放列表,判断播放列表是否有歌曲。系统没有找到歌曲,系统提示用户播放列表为空

    3.3.1.2 暂停播放
    基本流

    用户处于播放界面,用户点击暂停按钮系统监听到用户点击暂停按钮的回调后,系统判断现在是否处于播放状态,系统处于播放状态。系统通知MediaPlayer暂停播放音乐,MediaPalyer暂停播放音乐
    备选流

    系统监听到用户点击暂停按钮的回调后,系统判断现在是否处于播放状态,系统并没有处于播放状态。提示用户现在是暂停状态

    3.3.1.3 播放上一首
    基本流

    用户启动应用并进入播放界面后播放界面有播放,上一首,下一首三个按钮,用户点击上一首按钮系统监听到用户点击播放按钮的回调后,系统查找播放列表,判断播列表是否有上一首歌曲。系统找到歌曲,系统将歌曲信息发送给MediaPalyer,MediaPlayer根据歌曲信息找到播放源进行播放
    备选流

    系统在监听到用户点击播放按钮的回调后,系统查找播放列表,判断播放列表是否有上一首歌曲。系统没有找到歌曲,系统提示用户播放列表没有上一首歌曲

    3.3.1.4 播放下一首
    基本流

    用户启动应用并进入播放界面后播放界面有播放,上一首,下一首三个按钮,用户点击下一首按钮系统监听到用户点击播放按钮的回调后,系统查找播放列表,判断播列表是否有下一首歌曲。系统找到歌曲,系统将歌曲信息发送给MediaPalyer,MediaPlayer根据歌曲信息找到播放源进行播放
    备选流

    系统在监听到用户点击播放按钮的回调后,系统查找播放列表,判断播放列表是否有下一首歌曲。系统没有找到歌曲,系统提示用户播放列表没有下一首歌曲

    3.3.1.5 歌曲下载
    基本流

    用户进入在线音乐并点击下载音乐系统弹出下载页面,并且下载音乐
    备选流

    假如网络错误,系统弹出错误界面

    3.3.1.6 评论歌曲
    基本流

    用户点击菜单的评论歌曲系统弹出输入框用户输入评论并点击提交,系统提交数据
    备选流

    假如网络错误,系统弹出错误界面。

    3.3.1.7 分享歌曲
    基本流

    用户点击分享按钮系统弹出分享途径选择,用户选择途径,系统根据选择分享到所选择的平台
    备选流

    假如网络错误,系统弹出错误界面

    3.4 领域涉及模型
    4 系统设计4.1 概念模型CDM:concept data model,即概念数据模型。简称概念模型,是面向数据库用户的实现世界的模型,主要用来描述世界的概念化结构,它使数据库的设计人员在设计的初始阶段,摆脱计算机系统及DBMS的具体技术问题,集中精力分析数据以及数据之间的联系等,与具体的数据管理系统(Database Management System,简称DBMS)无关。概念数据模型必须换成逻辑数据模型,才能在DBMS中实现。其只描述信息的特征和强调语义,而不涉及信息在计算机中的表示,是现实世界到信息世界的第一层抽象,根据需求分析及系统设计综合考虑,本系统的概念模型如下:

    4.2 物理模型PDM(Physical Data Model)即物理数据模型,提供了系统初始设计所需要的基础元素,以及相关元素之间的关系;数据库的物理设计阶段必须在此基础上进行详细的后台设计,包括数据库的存储过程、操作、触发、视图和索引表等;本系统的物理如下图:

    4.3 数据库设计根据关系化得到的各个模式,创建音乐播放器系统的各数据表如下。
    4.3.1 歌曲表


    字段名
    字段码
    数据类型
    数据长度
    备注
    主键




    ID
    songid
    bigint


    X


    唱片ID
    albumid
    bigint





    歌手ID
    singer_id
    bigint





    歌曲名
    songname
    varchar(32)
    32




    歌手名
    singername
    varchar(20)
    20




    播放链接
    m4a
    varchar(255)
    255




    下载地址
    downUrl
    varchar(255)
    255




    唱片小图
    albumpic_small
    varchar(255)
    255




    唱片大图
    albumpic_big
    varchar(255)
    255




    唱片名
    albumname
    varchar(32)
    32




    4.3.2 唱片表


    字段名
    字段码
    数据类型
    数据长度
    备注
    主键




    唱片ID
    albumid
    bigint


    X


    唱片名
    albumname
    varchar(20)
    20




    唱片大图
    albumpic_big
    varchar(255)
    255




    唱片小图
    albumpic_small
    varchar(255)
    255




    4.3.3 歌手表


    字段名
    字段码
    数据类型
    数据长度
    备注
    主键




    歌手ID
    singer_id
    bigint


    X


    歌手名
    singername
    varchar(20)
    20




    4.3.4 评论表


    字段名
    字段码
    数据类型
    数据长度
    备注
    主键




    评论ID
    comment_id
    bigint


    X


    用户ID
    user_id
    bigint





    ID
    songid
    bigint





    评论内容
    content
    varchar(517)
    517




    时间
    data
    date





    对应的评论的id
    to_comment_id
    bigint





    用户表


    字段名
    字段码
    数据类型
    数据长度
    备注
    主键




    用户ID
    user_id
    bigint


    X


    用户名
    user_name
    varchar(255)
    255




    4.4 目录结构设计4.4.1 RUP面向对象设计模式的可视化建模用例视图

    4.4.2 客户端工程文件目录图
    目录文件说明:

    Adapter:存放各种适配器
    Aidl:存放在不同进程间传递的Entity
    Application:存放Android的Application
    Contract:存放一下比如URl或者常量
    MVP

    base:存放BaseModle,BasePresent的接口和抽象类其他基于MVP模式的模块
    Interfac:存放一下监听接口
    Service:存放Android的Service
    Tool:存放一下工具类
    Weight:存放一下自定义的控件

    4.4.3 服务端工程文件目录图
    目录文件解释:

    controller:存放控制类,即各个请求相应的逻辑处理
    bean:存放数据实体类Entity
    util:存放开发的公共资源处理类和工具类
    repository:DAO层接口
    service:service层
    annotation:注解处理器
    map:Mybatis的Mapper
    Modle:Modle层
    tool:工具类

    5 系统详细设计5.1 系统时序图5.1.1 播放音乐
    5.2 系统界面及其核心代码5.2.1 播放器界面的实现
    播放界面的xml代码:

    播放控制代码:(播放器和界面分开为两个进程,界面使用AIDL远程控制播放器的进程)


    AIDL接口(通过在AIDL接口定义一个注册监听器的方法使得界面的进程可以接收到播放界面进程的返回参数,然后可以根据参数判断播放进程的状态):


    关键代码如下(歌词主要是通过一个Recycleview实现,通过解析lrc文件获取歌词和不同的时间段中间的歌词位置):


    播放列表主要使用Popwindwos实现,弹出播放列表的时候播放背景变灰,然后监控背景的点击事件,当被点击时播放列表收回,同时还为弹出很收回设置动画,用于获得更好的用户体验。
    关键代码:


    Android使用sharePrefrence来保存本地音乐列表,要获取本地音乐只需要扫描本地的sharePrefrence获取本地的音乐,为了保证主线程不被阻塞,使用AsynTask进行扫描数据,在OnpostExcute刷新界面数据。
    关键代码:



    分享歌曲是通过Android的系统分享途径分享音乐。
    关键代码:

    同时还可以删除音乐,通过删除音乐文件然后重新扫描本地歌曲的方法来删除歌曲;设置为铃声,通过Android系统提供的方法进行设置,这个需要Android系统的写入权限来实现。



    本系统是使用百度音乐API来获取音乐榜单,主要分类有:百度热歌榜,百度新歌榜,华语金曲榜,欧美金曲榜,情歌对唱榜,网络歌曲榜,经典老歌榜,摇滚榜,KTV热歌榜,Billboard,Hito中文版,叱咤歌曲榜等十二个榜单,适应更多用户的需求。列表的封面使用榜单第一名的歌曲,榜单显示全三场的歌曲的名字和歌手。
    关键代码:


    榜单详情使用Google原生的MaterialDesign风格,头部是可折叠的ToolBar,下面是一个RecycleView。
    界面详情:


    分享的实现很本地歌曲的分享是一样的,都是通过Android系统分享的途径来进行分享歌曲,同时也可以支持很多平台的分享,包括当前最流行的QQ和微信。
    关键代码:


    下载歌曲时会判断当前的网络状态,假如时使用移动网络那么会提醒是否要继续下载。
    代码实现:


    下载歌曲时会在通知栏显示下载内容和进度,这是调用系统的DownloadManger实现。
    关键代码:


    当DownloadManger下载完成后会有一个回调,可以通过回调来刷新本地歌曲的列表。
    关键代码:


    Android端可以通过播放界面的菜单进行评论歌曲,当点击发送时会向服务器发送该歌曲的ID和评论内容还有当点的登陆的user,所以要使用该功能必须要登陆以后,代码中的Contract.TOKEN是当用户登陆之后服务器返回的一串token值。
    关键代码:


    用户可以点击评论然后输入内容对已有的评论进行评论。

    在主菜单界面有天气的功能,这个是继承了高德地图API的定位服务和天气服务,首先先定位用户的经纬度,然后将经纬度发送给高德地图服务后台来获取当前的天气状况。
    关键代码:




    这是登陆和注册页面,登陆和注册页面可以相互切换,登陆只需要用户名和密码,点击登录后,Android端会向后台发送登陆验证,假如验证成功,就会向Android端返回一串TOKEN值,当使用到必须要登陆才能使用的服务比如评论歌曲时,Android端会给服务器的请求Http的header里面添加TOKEN值,服务器通过这串TOKEN值解析出用户,然后进行其他相关操作,同时Android端有一个记住密码的功能,只要用户有登陆成功,那么Android端就会在SharePrefernce报错密码和用户名。下次再次点击登录的时候就可以直接显示用户名和密码,方便用户操作。
    关键代码:


    搜索歌曲也是使用百度音乐API接口,可以根据歌手名称,歌曲名等相关联的进行搜索。当点击搜索结果时就可以听该歌曲。
    关键代码:

    6 系统测试6.1 软件测试常识及主要技术软件测试是在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 从软件开发者的角度出发,希望表明软件产品不存在错误和缺陷,验证软件能正确地实现用户需用户求,确立人们对软件质量的信心。从用户角度出发,希望通过软件测试暴露软件隐藏的错误和缺陷,从而考虑是否接受该产品。一般来说软件测试应由独立的产品评测中心负责,严格按照软件测试流程,制定测试计划、测试方案、测试规范,实施测试,对测试记录进行分析,并根据回归测试情况撰写测试报告。测试是为了证明程序有错,而不能保证程序没有错误。
    测试工具介绍:
    Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,手势输入,触摸屏输入,如按键输入等,它实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。
    MonkeyRunner类似于Monkey,它们都是Android SDK原有的。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。但是MonkeyRunner的脚本是用Python来写,这样无疑会加重测试人员的负担。
    Instrumentation是早期Google提供的Android自动化测试工具类,相对于Junit Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件而JUint几乎都是进行简单的方法测试。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,但是它存在一个缺点就是不可以同一套测试方法只能在一个APP上使用。
    主要测试技术和方法介绍:
    黑盒测试,软件测试的主要方法之一,也可以称为功能测试、数据驱动测试或基于规格说明的测试。测试者不了解程序的内部情况,不需具备应用程序的代码、内部结构和编程语言的专门知识。在黑盒测试中,被测对象的内部结构,运作情况对测试人员是不可见的,测试人员对测试产品的验证主要是根据其规格,验证其与规格一致性。就像对一台自动售货机,为了验证其能否自动售出货物,你可以指定需要购买的物品,塞入钱币,然后观测售货机能否输出正确的货物并找出正确的零钱。在这个过程中你不需要关注自动售货机是如何判定钱币数额,如何选择货物,如何找出零钱等内部操作。这是白盒测试关注的范围,黑盒测试关注的是结果。
    此测试方法可适合大部分的软件测试,如集成测试(integration testing)以及系统测试(system testing)。
    白盒测试(white-box testing)又称透明盒测试(glass box testing)、结构测试(structural testing)等,软件测试的主要方法之一,也称结构测试、逻辑驱动测试或基于程序本身的测试。白盒测试(white-box testing)分为逻辑驱动测试:(语句覆盖,判定覆盖(分支覆盖),条件覆盖,判定/条件覆盖,条件组合覆盖)和基本路径测试。
    白盒测试可以应用于单元测试(unit testing)、集成测试(integration testing)和系统的软件测试流程,可测试在集成过程中每一单元之间的路径,或者主系统跟子系统中的测试。尽管这种测试的方法可以发现许多的错误或问题,它可能无法检测未使用部分的规范。
    6.2 测试用例及结果6.2.1 播放音乐


    Step Name
    Description
    Expected Result




    Step 1
    打开APP
    系统进入音乐播放界面


    Step 2
    点击播放音乐按钮
    系统开始播放音乐


    Step3
    点击播放上一首
    系统播放上一首音乐


    Step4
    点击播放下一首
    系统播放下一首音乐


    Step4
    点击暂停
    系统暂停播放音乐


    Stpe5
    点击歌词
    系统切换到歌词界面


    Step6
    拖动进度条
    系统播放对一个进度的音乐



    6.2.2 评论歌曲


    Step Name
    Description
    Expected Result




    Step 1
    打开APP
    系统进入音乐播放界面


    Step 2
    点击右边菜单栏
    系统展开菜单


    Step 3
    点击登录
    系统进入登录界面


    Step 4
    输入用户名和密码点击登录
    系统显示登录成功


    Step 5
    返回点击唱片图片
    系统进入播放界面


    Step 6
    点击菜单按钮选择评论
    系统进入评论界面


    Step 7
    在输入框输入评论内容发送
    系统显示新增的评论



    6.2.3 下载歌曲


    Step Name
    Description
    Expected Result




    Step 1
    打开APP
    系统进入音乐播放界面


    Step 2
    点击在线音乐
    系统进入在线音乐节目


    Step 3
    点击新歌榜
    系统进入新歌榜单


    Step 4
    点击第一首音乐点击菜单
    系统显示菜单界面


    Step 5
    点击下载音乐
    系统添加下载任务



    7 总结与展望7.1 总结本系统是基于Android的音乐播放器的设计与实现,本系统实现音乐播放器的基本功能,同时也拥有不错的界面设计。论文首先从现在Android音乐播放器的现状说起,分析音乐播放器的需求,然后对整个系统进行分析和设计,接下来就是代码实现,最后再用测试样本进行测试,以验证其可行性。
    尽管本系统实现了音乐播放器的基本功能但是还是有很多不足之处,比如说本系统只集成百度音乐API而不是各个平台的音乐API,因为版权关系,各家音乐播放器拥有不同的版权,导致很多用户需要下载多个音乐播放器才能满足日常需求,加入可以加入各个平台的音乐API就可以为用户提供更好的服务。其次,本系统缺少比较新颖的功能比如说听歌识曲和歌单等,新颖的功能无疑可以更加吸引用户。后台服务只是本地服务导致评论歌曲的功能在不同局域网的手机无法连接。
    7.2 展望正如上面所说本系统还存在各种不足之处,对此对如何改进各种不足做出展望:

    集成更多平台的音乐API
    利用第三方平台开发听过识曲等新颖功能
    买入阿里云服务器,上线服务

    参考文献[1] Android 开发者官网https://developer.android.com/index.html
    [2] Retrofit官网https://square.github.io/retrofit/
    [3] RxJava官网https://github.com/ReactiveX/RxJava
    [4] SpringBoot官网https://projects.spring.io/spring-boot/
    [5] MyBatis官网 http://www.mybatis.org/mybatis-3/zh/index.html
    [6] Mysql 官网 https://www.mysql.com/
    [7] Glide 官网 https://github.com/bumptech/glide
    [8] 《第一行代码Android》郭霖 人民邮电出版社2016.12
    [9] 《Android开发艺术探索》任玉刚电子工业出版社 2015.9
    [10] 《轻量级Java Web整合开发入门》李占波 清华大学出版社 2015.9.1
    [11] 《Spring MVC实战》张龙、覃璐、李哲、丁涛译电子工业出版社 2017.5.1
    [12] 《MyBatis技术内幕》徐郡明 电子工业出版社 2017.6.1
    [13] 《Android源码设计模式解析与实战》何红辉、关爱民 人民邮电出版社 2017.7
    [14] 《Android开发模式和最佳实战》菲尔 达特森 电子工业出版社 2017.2.1
    [15] 《软件工程》萨默维尔 机械工业出版社 2011.5.1
    10 评论 332 下载 2020-03-30 08:31:42 下载需要15点积分
  • 基于JSP的小区物业管理系统设计与实现

    摘 要对于小区物业管理来说,其工作流程的繁杂性、多样化、管理复杂、收缴费用与设备维护繁琐。计算机已完全能够胜任物业管理工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全可以克服以上所述的不足之处。这将给项目查询和管理带来很大的方便,从而给物业管理工作带来更高的效率,这也是物业管理正规化、现代化的重要标志。
    因此,开发一套高效率、无差错的小区物业管理系统软件十分必要。本系统的主要目的是告别帐本,安全、快捷的保存数据信息。由于小区物业管理涉及到费用问题,为了增强系统的保密性,使业主利益不受损害,使业主能够对自家的物业费用和投诉等情况提供透明化、直观的了解。
    本毕业设计的内容是设计并且实现一个基于web技术的小区物业管理系统,故而系统主要以J2EE作为开发基础,主要使用了Struts2+Spring+Hibernate等多种框架的结合使用,用Myeclipse作为开发工具,以SQL Server作为数据库,以Macromedia公司的Dreamweaver作为界面美化工具,使用JAVA语言开发,页面采取JSP动态页面开发技术。该系统界面简单、操作方便,容易维护。
    关键词:小区物业管理系统;SSH;JSP动态页面开发
    AbstractFor residential property management, the complexity of the work flow, diversification, management of complex, tedious collection costs and equipment maintenance. The computer is fully qualified to work in property management, and more accurate, convenient, fast, efficient, clear, transparent, it can overcome the shortcomings mentioned above. This will give the project inquiry and management bring great convenience, to the property management work more efficient, this is also the regularization of property management, an important symbol of modernization.
    Therefore, the development of an efficient, error-free residential property management system software is very necessary. The main purpose of this system is to bid farewell to the books, safe, fast and the preservation of data. Because the plot estate management costs involved, in order to enhance the system security, so that the interests of owners from damage, to the property owner can own property costs and complaints, provide transparent, intuitive understanding of.
    The content of graduation design is to design and implement a web based residential property management system, so the system is mainly to j2EE as a development base, the main use of struts2+spring+hibernate and other frame used in combination, using MyEclipse as a development tool, using SQL Server as the database, with Macromedia’s Dreamweaver as the interface landscaping tools, the use of JAVA language development, page take JSP dynamic page technology. This system interface is simple, convenient operation, easy maintenance.
    Keywords: District property management system SSH JSP dynamic page
    第1章 绪论1.1 课题背景科学技术日新月异,信息化时代的来临,以计算机为基础的信息科学在经济和社会生活各个领域得到了极为广泛的应用,尤其在信息管理方面,计算机已是必不可少的管理工具。
    目前,信息已成为继劳动力、土地、资本之后的又一大资源。谁控制的信息越多,谁利用信息资源的效率越高,谁就会在各方面的竞争中占有一席之地,谁就会有更多的优势。从微观上讲,建立一套管理信息系统能够加快信息的周转速度,提高生产效率,从而加强了管理的信息化手段,提高了本单位的经济效益。从宏观上讲,顺应了社会的信息化、社会化潮流,加快了社会的发展速度。据统计,美国在信息管理管理方面80-100%的信息处理由计算机完成;计划管理是80—90%;在计算机应用发展较快的国家中,计算机应用于经济管理的占80%;用于科技计算的占8%,用于生产过程控制的占12%;由此可以看出,信息管理是计算机应用的主要领域。
    1.2 课题目的和意义由于种种原因,我国的信息资源建设水平远远落后于信息基础设施的建设的水平。长期以来,我国信息资源的开发管理未能与信息资源的增长同步进行。我国的计算机应用要比西方国家落后十几年。因此,现在信息资源的开发和利用已被确立为国民经济信息的核心内容,利用现有的信息基础设施,重点开发和推广应用于各类科技、经济等数据库和网络资源服务系统,已经取得巨大的社会效益和经济效益。
    对于小区物业管理来说,其工作流程的繁杂性、多样化、管理复杂、收缴费用与设备维护繁琐。计算机已完全能够胜任物业管理工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全可以克服以上所述的不足之处。这将给项目查询和管理带来很大的方便,从而给物业管理工作带来更高的效率,这也是物业管理正规化、现代化的重要标志。
    因此,开发一套高效率、无差错的小区物业管理系统软件十分必要。本系统的主要目的是告别帐本,安全、快捷的保存数据信息。由于小区物业管理涉及到费用问题,为了增强系统的保密性,使业主利益不受损害,本系统具有仅管理员式的保密功能,还有查询、录入、修改、删除、以及对物业设备统计等功能,使业主能够对自家的物业费用和投诉等情况提供透明化、直观的了解。
    1.3 系统设计思想本系统采用Jsp技术,基于MVC模式开发,使用SSH框架(Struts2、Spring、Hibernate)来增加系统的开发速度。所谓的MVC模式是”Model-View-Controller”的缩写,中文翻译为”模式-视图-控制器”。程序就是用Struts2和Hibernate这两个框架来实现模型层和控制器这两层,Jsp实现视图这一层。一般来说程序就是在数据库和页面之间起桥梁作用的,Jsp页面请求先到action,再到dao,再回到action,回到Jsp页面,action主要处理来自页面的请求,dao主要是和数据库的交互,Struts2主要用在action,处理来自页面的请求,处理完请求后跳转回页面。Hibernate主要用在dao,包括对数据库的增、删、改、查的操作,Spring控制程序的流程。
    SSH框架是J2EE应用中Struts2+Spring+Hibernate三大免费开源框架的结合使用, 它可以看成工具,也是中间件。他是用来提高我们的开发效率,提高我们软件产品的可维护性、可扩展性乃至敏捷性的。他们里面有很多优秀的设计理念及模式应用。比如,Struts属于MVC框架,关键是要了解MVC的概念及大致原理;而Hibernate属于ORM系统,属于持久层的解决方案,同样需要对ORM的概念及原理有一个总体的了解。而Spring属于应用程序框架,其核心是IOC容器以及AOP,Spring中还集成了很多适用东西,比如对JDBC的封装、自己的MVC、对动态语言的简洁访问等,它由以下3个框架构成:
    1.3.1 Struts2框架Struts2是Apache组织的一个开放源码项目。Struts2是一个比较好的MVC框架,提供了对开发MVC系统的底层支持,它采用的主要技术是Servlet,JSP和Custom tag library。
    1.3.2 Spring框架Spring 的核心是个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器、非侵入性(No intrusive)的框架,并提供AOP(Aspect-oriented programming)概念的实现方式,提供对持久层(Persistence)、事务(Transaction)的支持,提供MVC Web 框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装,是一个全方位的应用程序框架(Application framework),除此之外,对于现存的各种框架(Struts、JSF、Hibernate 等),Spring 也提供了与它们相整合的方案。
    1.3.3 Hibernate框架Hibernate 是一个开放源码的 ORM 持久层框架。作为优秀的持久层框架实现,Hibernate 框架提供了强大、高性能的对象到关系型数据库的持久化服务,开发人员可以使用面向对象的设计进行持久层开发。简单的说,Hibernate 只是一个将持久化类与数据库表相映射的工具,每个持久化类实例均对应于数据库表中的一个数据行而已。用户只需直接使用面向对象的方法操作此持久化类实例,即可完成对数据库表数据的插入、删除、修改、读取等操作。
    第2章 可行性分析管理信息系统的强大功能越来越被物流行业内的相关人士所重视,通过系统企业能够更直接、清晰的看到数据。管理系统全面的、周到的信息服务使之逐渐成为物流行业发展前进的风向标。信息管理系统,主要用于对公司的信息进行存储,有高效、快速、不易丢失的好处,也帮助公司解决了大数据量的存储。
    2.1 经济可行性经济可行性包括两个方面的内容:一是某一备选方案占有和使用经济资源的可能性,进而实现政策目标的可能性;二是实施某一政策方案所需花费的成本和取得的收益。政府的财政资源是有限的,任何政策方案占有和使用的经济资源也是有限的。因此,任何一项公共政策都存在一个争取公共经济资源的问题。一般说来,“公共政策的经济资源的占有量与其政策目标的期望值成正比例关系。”当然,这还涉及到一个成本效益问题。如果某一方案的成本大于收益,显然这项政策是不可行的。
    在开发小区物业管理系统之前实地考查开发所需条件以及使用中所需要的耗费维护资金,在系统投入使用后带来的受益是否值得花费所需要花费的资金以及资源去进行开发。
    在我的小区物业管理系统中,开发阶段只需要一台带XP系统的电脑以及My eclipse、SQL Server 2008数据库,系统开发周期为五至八周,个人独立完成。
    在投入使用后需要物业管理人员对其进行操作、维护等日常管理,只需这些投入便可以使小区物业管理实现初步的信息化,
    2.2 技术可行性该系统由管理员和业主两种不同的功能并在两者之间进行交互操作,所以系统采用B/S模式来实现。JSP在服务器端执行,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览,很适合做B/S模式的WEB系统,JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。所以JSP技术对于该系统完全可行。
    2.3 系统流程图在数据库设计过后,接着就应该考虑功能实现,通过功能描述的分析,构思出系统整体结构,采用业务流程图的方式具体介绍系统大概的处理方式,以下为系统的业务流程。
    投诉信息管理系统流程图
    投诉流程由业主发起投诉信息,管理员收到信息后处理反馈,用户再对反馈信息进行察看核实,如图2-1所示。

    登陆系统流程图
    系统分为管理员与业主类型登陆,登陆后根据功能略有不同,具体的操作流程图如2-2图所示:

    缴费信息管理系统流程图
    系统缴费流程由管理员添加缴费信息后,用户查看到自己有未缴费信息进行缴费后管理员确认缴费,具体操作如图2-3所示:

    2.4 本章小结可行性分析是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发分别从经济可行性、技术可行性和社会因素可行性,对本系统进行多方面的分析。根据经济、技术和需求等方面的可行性分析,可以确定本系统的开发是完全有必要的,而且是可行的,可以立项开发。
    第3章 需求分析软件需求分析工作是软件生存周期中重要的一步。只有通过需求分析才能把软件功能和性能的总体概念描述为具体上的软件需求规格说明,从而奠定软件开发的基础。软件需求分析工作也是一个不断认识和逐步细化的过程。该过程将软件调研阶段的需求资料进行分析和设计,使软件范围逐步细化到详细定义的程度,并分析出各种不同的软件元素,然后为这些元素找到可行的解决办法。本章将从不同角度的需求分析问题,讲述软件需求类型,分析过程,并部分给出了数据字典和数据流图。
    3.1 物业管理的发展成因改革开放以来,住宅建设飞速发展。我国城镇现有住宅已近80亿平方米。仅79年至99年城镇新建住宅52.5亿平方米。大量住宅小区投入使用,带来了管理工作的变化。除了对房屋进行维修外,还必须对附属物、设备、场地、环卫绿化、道路、治安进行专业化管理,以保持新建住区的完好,发挥其整体功能和综合效益。国外和香港对住宅区和其它物业实施专业化管理的经验被引入,取得了较好的效果,带动了全国物业管理工作的起步和发展。
    住房制度改革的逐步深化。随着房改的步步深化,城镇居民住房自有率已经超过75%,形成一个住区内,一幢房子里的产权多元化格局。房管所及单位房管处(科)的管房体制已经完全不能适应。对管理的社会化形成了客观的要求。物业管理从体制上克服了房改后形成的多个产权单位多头、多家管理,各自为政、扯皮推诿等旧管理体制的弊端。
    体制改革的推动。随着计划经济体制加快向社会主义市场经济体制的转轨,政府职能的转变,以前那种由政府行政福利型直接管理房屋,政府对住区环境、社区服务直接负责的办法,已经不能适应形势的变化。一个由业主自治与物业公司专业化管理结合,由物业管理企业实施经营型管理和有偿服务,使管理得以以业养业、自我发展、良性循环,既减轻了政府的压力和负担,又使得管理经费有了稳定来源的机制,日益显示其新体制的优越性。
    人民群众生活水平的不断提高。居民对住房问题的关切从有无转为大小,继而更加关注环境和社区服务。同时,广大住户拥有了自己的产业,对保持房产和附属设施的完好,以达到保值、增值的观念也逐步树立,使得物业管理的好坏已经成为居民选购住房考虑的重要因素,物业管理为越来越多的人接受,其行业地位不断攀升,外部环境逐步改善。
    3.2 小区物业管理系统需求分析信息管理系统(Information management system)是为了满足客户的需求,对公司货物的信息进行一个统计,高效、快速、方便的存储在数据库当中,不仅节省了人力,还节省了时间,对公司未来发展有着不可估量的好处。
    随着时代的发展、生活节奏的加快、买卖之间的数据量越来越大,现有的靠人工管理的模式已经越来越跟不上当今商务飞速发展的脚步。计算机辅助管理势在必行。
    3.2.1 数据流图数据流图(Data Flow Diagram):简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。数据流是指处理功能输入或输出,用一个水平箭头或垂直箭头表示。数据存储是数据保存的地方。数据源去向表示数据的来源或数据的流向。

    管理员处理用户提交的投诉、维修信息
    管理员添加缴费信息用户查看缴费后进行处理

    小区物业管理系统由管理员添加以及处理缴费信息,业主对其进行查看确认是否缴费,另外业主进行投诉与维修等上报,管理员获取信息后进行处理反馈结果,用户获取反馈结果,该系统的顶层数据流图如图3-1所示。

    小区物业管理系统一共包括六个表:用户信息表、缴费信息表、投诉信息表、维修信息表、用户信息表、房产信息表。分别有六个数据流,具体如图3-2所示。

    3.2.2 数据字典数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序源数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。被动数据字典是指修改时必须手工更新其内容的数据字典。
    它是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。数据字典的作用是在软件的分析和设计过程中提供关于数据的描述信息。一般说来,数据字典应该由下列四类元素构成:数据元素,数据流,数据存储和数据处理数据字典的作用是在软件分析和设计的过程中给人提供关于数据的描述信息。它主要是对数据流图中的数据流、处理逻辑、外部实体、数据存储和数据项等方面进行具体的定义。数据流程图配以数据字典,就可以从图形和文字两个方面对系统的逻辑模型进行完整的描述。
    数据项定义
    数据元素也称为数据项,是不可再分的数据单位,是数据的最小组成单位,具体内容如表3-1所示。



    编号
    数据项名称
    名称
    NULL
    备注




    I01-1
    房产编号
    id
    no
    主键


    I01-2
    备注信息
    beizhu
    yes
    备注


    I01-3
    时间
    createtime
    yes
    添加时间


    I01-4
    是否删除
    fangshanlock
    no
    是否删除标志


    I01-5
    结构
    fangwujiegou
    yes
    房屋结构


    I01-6
    门牌号
    menpaihao
    yes
    门牌号


    I01-7
    面积
    mianji
    yes
    房屋面积


    I01-8
    设备
    shebei
    yes
    设备


    I01-9
    住址
    zhuzhi
    yes
    住址


    I01-10
    房产关联业主
    zhuhuid
    yes
    关联的业主ID


    I01-11
    投诉编号
    id
    no
    主键


    I01-12
    投诉反馈
    chulifankui
    yes
    处理反馈


    I01-13
    投诉结果
    chulijieguo
    yes
    处理结果


    I01-14
    投诉内容
    content
    yes
    投诉内容


    I01-15
    投诉时间
    createtime
    yes
    添加时间


    I01-16
    投诉标题
    title
    yes
    投诉标题


    I01-17
    删除标志
    tousulock
    no
    是否删除标志


    I01-18
    投诉关联业主
    zhuhuid
    yes
    关联的业主


    I01-19
    维修编号
    id
    no
    主键


    I01-20
    维修信息
    chulifankui
    yes
    处理反馈


    I01-21
    维修结果
    chulijieguo
    yes
    处理结果


    I01-22
    维修内容
    content
    yes
    维修内容


    I01-23
    维修时间
    createtime
    yes
    添加时间


    I01-24
    维修标题
    title
    yes
    维修标题


    I01-25
    删除标志
    weixiulock
    no
    是否删除标志


    I01-26
    维修关联业主
    zhuhuid
    yes
    关联的业主ID


    I01-27
    业主编号
    Id
    no
    主键


    I01-28
    业主电话
    dianhuahaoma
    yes
    电话号码


    I01-29
    业主身份证
    huzhufz
    yes
    业主身份证


    I01-30
    业主姓名
    huzhuxingming
    yes
    姓名


    I01-31
    业主入住时间
    ruzhushijian
    yes
    入住时间


    I01-32
    是否删除标志
    zhuhulock
    no
    是否删除标志


    I01-33
    业主住址
    zhuzhi
    yes
    住址


    I01-34
    用户编号
    id
    no
    主键


    I01-35
    用户添加时间
    createtime
    yes
    添加时间


    I01-36
    用户密码
    password
    yes
    密码


    I01-37
    用户权限设定
    role
    no
    用户权限


    I01-38
    用户姓名
    truename
    yes
    真实姓名


    I01-39
    是否停用
    userlock
    no
    是否停用标志


    I01-40
    用户姓名
    username
    yes
    用户名


    I01-41
    用户关联业主
    zhuzhiid
    yes
    关联的业主ID


    I01-42
    缴费编号
    id
    yes
    主键


    I01-43
    备注
    beizhu
    yes
    备注


    I01-44
    费用
    feiyong
    no
    费用


    I01-45
    费用周期
    feiyongzhouqi
    yes
    周期


    I01-46
    是否删除标志
    jiaofeilock
    no
    是否删除


    I01-47
    缴费类型
    leixing
    yes
    类型


    I01-48
    缴费时间
    shoufeishijian
    yes
    时间


    I01-49
    缴费状态
    shoufeizhuangtai
    no
    是否已交费


    I01-50
    房产id
    fangchanid
    yes
    关联房产


    I01-51
    用户id
    zhuhuid
    no
    关联用户




    数据流编号:D1—01

    数据流名称:房产信息数据流来源:管理员数据流去向:F6数据流组成:I01-01+I01-02+I01-03+I01-04+I01-05
    数据流编号:D1—02

    数据流名称:用户信息数据流来源:F1数据流去向:F5数据流组成:I01-34+I01-36+I01-38+I01-40
    数据流编号:D1—03

    数据流名称:缴费信息数据流来源:管理员数据流去向:F2数据流组成:I01-42+I01-43+I01-44+I01-45+I01-46+I01-47
    数据流编号:D1—04

    数据流名称:业主信息数据流来源:管理员数据流去向:F1数据流组成:I01-1+I01-2+I01-3+I01-4+I01-5
    数据流编号:D1—05

    数据流名称:投诉信息数据流来源:F1数据流去向:F3数据流组成:I01-11+I01-12+I01-13+I01-14+I01-15+I01-16+I01-17+I01-18
    数据流编号:D1—06

    数据流名称:维修信息数据流来源:F1数据流去向:F4数据流组成:I01-19+I01-20+I01-21+I01-22+I01-23+ I01-24+I01-25

    需求分析是一项重要的工作,也是最困难的工作。该阶段工作有以下特点:

    供需交流困难:在软件生存周期中,其它四个阶段都是面向软件技术问题,只有本阶段是面向用户的。需求分析是对用户的业务活动进行分析,明确在用户的业务环境中软件系统。但是在开始时,开发人员和用户双方都不能准确地提出系统。因为软件开发人员不是用户问题领域的专家,不熟悉用户的业务活动和业务环境,又不可能在短期内搞清楚;而用户不熟悉计算机应用的有关问题。由于双方互相不了解对方的工作,又缺乏共同语言,所以在交流时存在着隔阂。
    需求动态化:对于一个大型而复杂的软件系统,用户很难精确完整地提出它的功能和性能要求。一开始只能提出一个大概,模糊的功能,只有经过长时间的反复认识才逐步明确。有时进入到设计,编程阶段才能明确,更有甚者,到开发后期还在提新的要求。这无疑给软件开发带来困难。
    后续影响复杂:需求分析是软件开发的基础。假定在该阶段发现一个错误,解决它需要用一小时的时间,到设计,编程,测试和维护阶段解决,则要花2.5,5,25,100倍的时间。

    因此,对于大型复杂系统而言,首先要进行可行性研究。开发人员对用户的要求及现实环境进行调查,了解,从技术,经济和社会因素三个方面进行研究并论证该软件项目的可行性,根据可行性研究的结果,决定项目的取舍。
    3.3 本章小结本章对物流管理系统的需求进行分析,通过本章的论述对整个系统的设计有更加详细的了解。熟悉所依据的系统流程,根据系统流程图画出系统的数据流程,根据系统的数据流程写出所用到的数据字典,本章为整个系统的需求分析部分需求分析阶段结束之后进入总体设计阶段。
    第4章 系统设计4.1 系统功能设计需求分析说明小区物业管理系统主要为了物业管理员与业主设计的,架构在web的内部服务器上面。管理员对业主以及缴费信息进行管理,业主可以查看或者提交投诉维修等信息。整个系统就是这样的一个组织结构模式。
    依据上述功能的分析,系统中模块分别为:业主管理、用户管理、缴费管理、投诉管理、维修管理、房产管理。
    各功能模块的具体功能如下:

    业主管理:管理员对业主信息进行添加修改等功能
    用户管理:管理员对业主的用户信息是否停用进行控制,业主可以自己对自己所有用户进行密码修改等业务
    缴费管理:管理员添加以及处理缴费信息,业主查看自己所有已缴费和未缴费的信息详情
    投诉、维修管理:用户提交投诉、维修信息后,管理员查看到及时进行处理反馈结果,用户可以通过查看投诉、维修信息得知结果。具体如图4-1所示


    该系统主要包括系统管理员与业主俩个界面,系统管理员与业主分别具有不同的功能,分为两个不同的界面,之间存在信息交互等操作。
    4.2 数据库设计直到现在,我们可以设计的数据库必然是有结构的数据, 譬如说,我们已经确定了许多张表。但为什么会得到引起结构呢? 答案很简单,在数据库设计时数据库的结构是确定的,然而,进行数据库的设计,可能非常复杂。为了开发一个系统满足该组织的信息需求,要求采取不同办法在文件系统中,那里的工作为个别部门推动了应用的需要。在方法中的这种改变被子称为模式转变。为了使系统可以被用户最终接受,数据库的设计活动是至关重要的。一个没设计好的数据库中会产生错误, 这可能造成严重后果的组织。另一方面,以有效的方式精心设计制作的数据库,可以提供正确的资料。
    总之,在数据库开发中,设计的好坏是决定后续工作顺得与否的关键。
    我们小区物业管理系统使用SQL Server数据库,在数据库中考虑到几大功能模块所需数据创建了房产、维修、投诉、缴费、业主、用户这六个表。
    4.2.1 数据分析根据数据库中表的设计,数据应该是清晰的、具体的、并且要是一个合理的数据。在我们使用数据时,需要考虑到数据是否符合我们的需求,对于数据的使用我们也要遵循一定的规则。
    在我们系统中每一个表的数据类型、主键、NULL以及是否唯一等都按照系统所需分别设置,充分考虑到我们对于该系统的需求以及实现功能,为我们系统的数据正确性提供保证。
    4.3 数据库的详细设计数据库中重点为表的设计与表间的关联,在一个项目的实施过程中前期的数据库设计没有设计好就是大副度的减化系统开发的进度。分析表与表间的关系也可以帮助我们在开发项目时建立良好的流程,具体的功能和业务实现。
    数据库存在表与表间的关系,有三种形式:一对一关联,一对多关联,多对多关联,他们是对自然联接等方式来对表进行关联。表自身间的关系也是一种关联,在数据库设计中,我们不仅要对数据库中的数据类型进行了合理定义,还要对应的建好表与表间的关系才能作好数据库的设计。
    在设计数据库前应对现有类似系统的数据库进行仔细研究,找出它的不足以完善自己所设计的数据库。
    在设计前,应考虑以下事项:

    定义标准的对象命名规范
    工欲善其事,必先利其器。选择理想的数据库设计工具
    了解你的业务。根据业务需要创建数据表
    创建数据字典和E-R图表
    数据库维护

    4.3.1 数据表的设计对于小区物业管理系统,数据基本上都是使用数据库进行管理。数据库设计是对保存管理系统数据的数据库结构进行设计,对整个系统的开发具有非常重要的作用,我们一共包括以下这些表。
    房产表
    数据项包括:房产编号、备注、添加时间、是否删除标志、房屋结构、门牌号、房屋面积、设备、住址、关联业主ID,如表4-1所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    beizhu
    varchar(255)
    yes
    备注


    createtime
    datetime
    yes
    添加时间


    fangshanlock
    int(11)
    no
    是否删除标志


    fangwujiegou
    varchar(255)
    yes
    房屋结构


    menpaihao
    varchar(255)
    yes
    门牌号


    mianji
    varchar(255)
    yes
    房屋面积


    shebei
    varchar(255)
    yes
    设备


    zhuzhi
    varchar(255)
    yes
    住址


    zhuhuid
    bigint(20)
    yes
    关联的业主ID



    缴费表
    数据项包括:缴费编号、备注、添加时间、费用、费用标题、是否删除标志、缴费类型、收费时间、缴费状态,如表4-2所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    beizhu
    varchar(255)
    yes
    备注


    createtime
    datetime
    yes
    添加时间


    feiyong
    varchar(255)
    yes
    费用


    feiyongzhouqi
    varchar(255)
    yes
    费用标题


    jiaofeilock
    int(11)
    no
    是否删除标志


    leixing
    varchar(255)
    yes
    缴费类型


    shoufeishijian
    datetime
    yes
    收费时间


    shoufeizhuangtai
    varchar(255)
    yes
    缴费状态


    fangchanid
    bigint(20)
    yes
    关联的房产ID


    zhuhuid
    bigint(20)
    yes
    关联的业主ID



    投诉表
    数据项包括:投诉编号、处理反馈、处理结果、投诉内容、添加时间、投诉标题、是否删除标志、关联业主信息,具体如表4-3所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    chulifankui
    varchar(255)
    yes
    处理反馈


    chulijieguo
    varchar(255)
    yes
    处理结果


    content
    varchar(255)
    yes
    投诉内容


    createtime
    datetime
    yes
    添加时间


    title
    varchar(255)
    yes
    投诉标题


    tousulock
    int(11)
    no
    是否删除标志


    zhuhuid
    bigint(20)
    yes
    关联的业主信息



    维修表
    数据项包括:维修编号、处理反馈、处理结果、维修内容、添加时间、维修标题、是否删除标志、关联业主ID,具体如表4-4所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    chulifankui
    varchar(255)
    yes
    处理反馈


    chulijieguo
    varchar(255)
    yes
    处理结果


    content
    varchar(255)
    yes
    维修内容


    createtime
    datetime
    yes
    添加时间


    title
    varchar(255)
    yes
    维修标题


    weixiulock
    int(11)
    no
    是否删除标志


    zhuhuid
    bigint(20)
    yes
    关联的业主ID



    业主表
    数据项包括:业主编号、电话号码、业主身份证、姓名、入住时间、是否删除标志、住址,具体如表4-5所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    dianhuahaoma
    varchar(255)
    yes
    电话号码


    huzhufz
    varchar(255)
    yes
    业主身份证


    huzhuxingming
    varchar(255)
    yes
    姓名


    ruzhushijian
    varchar(255)
    yes
    入住时间


    zhuhulock
    int(11)
    no
    是否删除标志


    zhuzhi
    varchar(255)
    yes
    住址



    用户表
    数据项包括:用户编号、添加时间、密码、用户权限、真实姓名、用户名、关联业主ID,具体如表4-6所示。



    名称
    类型

    备注




    id
    bigint(20)
    no
    主键


    createtime
    datetime
    yes
    添加时间


    password
    varchar(255)
    yes
    密码


    role
    int(11)
    no
    用户权限


    truename
    varchar(255)
    yes
    真实姓名


    userlock
    int(11)
    no
    是否停用标志


    username
    varchar(255)
    yes
    用户名


    zhuzhiid
    bigint(20)
    yes
    关联的业主ID



    4.3.2 数据库的E-R图设计E-R图为实体-联系图,提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型。构造E-R图的基本要素是实体型、属性和联系的方法。由属性构成实体型,标明实体型的PK,用菱形来表示联系通过连线写明互相之间的对应关系。实体型是具有相同属性的实体具有相同的性质和特征,用实体名及其属性名集合来抽象和刻画同类实体;属性是实体所具有的某一特征,一个实体有若干个属性来刻画;联系也称为关系,信息世界中反映实体内部或实体之间的联系。
    在E-R图中联系可分为三种类型:

    一对一联系(1:1)
    一对多联系(1:N)
    多对多联系(M:N)

    一个较好的系统在设计时要做好分析工作,并且要按照一定的次序将其完成,首先做好数据的分析,设计好数据库。在分析数据库的建设问题时,首先就要从需求分析中获取系统中要用的数据,将其规化好,抽取实体及其属性,建立模型。以下为系统所有要使用的数据,以E-R图的形式表示如图4-7所示。

    系统E-R类图包括本系统六个表:业主表、用户表、房产表、投诉表、缴费表与维修表。
    在小区里,每个业主能够拥有多套房产,所以业主表与房产表属于一对多的包含关系;每个业主拥有一个用于用户端登录的用户账户密码,所以用户表与业主表是一对一的包含关系;在投诉与维修上报上是一样的,每个业主能够发起多个投诉与维修信息,所以投诉表跟维修表与业主表的关系都是一对多的生成关系;最后还有一个缴费表,每个业主每个月都会有多项缴费信息,每个业主应该对应多项缴费信息并且业主对缴费信息只允许进行查看不允许修改,所以业主表与缴费表是一对多的查看关系
    4.4 本章小结根据本章系统设计的分析,我们可以清楚知道我们的系统通过需求分析后做出了业主与管理端两个不同的界面,其中管理员有八个功能模块,而用户有七个功能模块。我们对系统所需做出了对应的数据库设计,用六个表来存储我们系统的数据。
    第5章 系统实现JavaBeans是用java语言编写的可重用的软件组件。使用javaBeans组件,以使用可视的应用程序开发工具将它们编写到java程序中。javaBeans规范为java开发人员提供了一种“组件化”其java类的方法,是实现代码重用的一个很好的机制。同时它也被广泛地应用到jsp技术中实现代码的重用,还可以实现显示和逻辑的一定程度上的分离,在实际应用中得到广泛的应用。
    5.1 系统和数据库的配置系统按通用的B/S(浏览器、服务器)模式进行设计(如图4-1)

    数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。
    5.2 数据库逻辑模型
    房产表(主键、备注、添加时间、是否删除标志、房屋结构、门牌号、房屋面积、设备、住址、关联的业主ID)
    缴费表(主键、备注、添加时间、费用、费用标题、是否删除标志、缴费类型、收费时间、缴费状态、关联的房产ID、关联的业主ID)
    投诉表(主键、处理反馈、处理结果、投诉内容、添加时间、投诉标题、是否删除标志、关联的业主信息)
    维修表(主键、处理反馈、处理结果、维修内容、添加时间、维修标题、是否删除标志、关联的业主ID)
    业主表(主键、电话号码、业主身份证、姓名、入住时间、是否删除标志、住址)
    用户表(主键、添加时间、密码、用户权限、真实姓名、是否停用标志、用户名、关联的业主ID)

    5.3 系统设计5.3.1 用户登录的设计与实现对于用户登录的设计需要用户输入正确的登录用户名、密码后台利用Ajax自动判断用户的权限,并进入相应的页面。
    用户登录程序流程描述
    在进入登录界面时,需要用户输入正确的用户名和密码,选择权限,如果用户名或密码为空时,会返回到登录界面重新输入,错误时也是,当输入正确时就会进入管理系统的主界面中。
    实现过程
    index.jsp页面合法用户的核查页面,即起到Login.jsp页面与数据库之间的一个桥梁作用,将index.jsp页面中输入的用户名、密码送入到StudentServlet中通过SQL语句与数据库中的用户名、密码进行对比,找到后即为合法用户,说明可以进入系统,在此页面中需要引入一个BaseDbOper.java文件,它起到连接数据库和对数据库的访问。
    5.3.2 系统功能的设计与实现**业主信息管理设计
    管理员应能够添加新主以及对原有业主进行查看、修改或者删除等功能,所以界面设计如图5-2所示。

    同时,在用户端应可以查询到自己的业主信息但不能查询到他人信息并且不允许进行修改,所以界面设计如图5-3所示。

    房产信息管理设计
    在房产信息管理上,管理员应该可以对业主添加、修改、删除以及查看,所以房产信息管理界面应图5-4所示。

    业主可以查看到自己的房产信息而不能查看其他人的信息,并且不允许进行修改操作,所以房产信息管理在业主节目应如图5-5所示。

    缴费信息管理设计
    缴费信息管理在管理员界面中有两次处理,一次是添加、修改等操作添加新的缴费信息,然后再运营中的收费管理进行查看以及确认缴费,在用户界面中能够查看到缴费信息但无法进行修改等操作。所有已缴费和未缴费信息是显示在一起,管理员界面中显示所有的缴费信息,用户界面中只显示自己的缴费信息,这样的方式可以给用户隐私带来保障,不允许他人查看到自己的信息。
    在添加缴费信息时先进行格式判定,缴费信息为空时不符合格式要求添加失败需要重新输入,判定成功后添加到缴费信息表中。在确认缴费信息时候如果不确认则保持未缴费状态,确认缴费后该缴费数据项的缴费状态更改为已缴费。具体如图5-6所示。

    管理员统一添加每月缴费信息后,查看确定是否有误,需要修改删除等操作,所以缴费信息管理页面如图5-7所示。

    在添加缴费信息后业主可以查看到缴费信息,业主缴费信息界面如图5-8所示。

    在业主查看到自己未缴费的信息后进行缴费,管理员应该对其进行确认缴费,如图5-9所示。

    投诉信息管理的设计
    投诉信息由业主发起投诉信息,所以业主投诉界面应该设计如图5-10所示。

    在业主发起投诉后由管理员对投诉信息进行查看处理以及反馈结果,所以投诉信息管理界面应该设计如图5-11。

    5.4 本章小结到现在为止,我们的系统功能模块基本实现完成。在数据库方面,我们有业主、用户、房产、缴费、维修以及投诉六张表,我们做出了这六张表的实体对应关系,可以让我们很清楚的知道表与表之间联系。其后我们按照需求设计了合理的系统界面,让我们的系统功能更加合理、完善。
    第6章 系统测试信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同关注的焦点。不论软件的生产者还是软件的使用者,生存在竞争的环境中,软件开发商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰出局。用户为了保证自己业务的顺利完成,当然希望选用优质的软件。质量不佳的软件产品不仅会使开发商的维护费用和用户的使用成本大幅增加,还可能产生其他的责任风险,造成公司信誉下降,继而冲击股票市场。在一些关键应用 (如民航订票系统、银行结算系统、证券交易系统、自动飞行控制软件、军事防御和核电站安全控制系统等) 中使用质量有问题的软件,还可能造成灾难性的后果。
    6.1 软件测试的目的软件测试的目的,第一是确认软件的质量,其一方面是确认软件做了你所期望的事情,另一方面是确认软件以正确的方式来做了这个事件。
    第二是提供信息,比如提供给开发人员或程序经理的反馈信息,为风险评估所准备的信息。
    第三软件测试不仅是在测试软件产品的本身,而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题,这说明此软件开发过程很可能是有缺陷的。因此软件测试的第三个目的是保证整个软件开发过程是高质量的。
    软件质量是由几个方面来衡量的:一、在正确的时间用正确的的方法把一个工作做正确。二、符合一些应用标准的要求,比如不同国家的用户不同的操作习惯和要求,项目工程中的可维护性、可测试性等要求。三、质量本身就是软件达到了最开始所设定的要求,而代码的优美或精巧的技巧并不代表软件的高质量。四、质量也代表着它符合客户的需要。作为软件测试这个行业,最重要的一件事就是从客户的需求出发,从客户的角度去看产品,客户会怎么去使用这个产品,使用过程中会遇到什么样的问题。
    6.2 软件测试的任务在软件投入生产性运行之前,尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用。软件测试是保证软件软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。软件测试的结果也是分析软件可靠性的重要依据。具体包括登录是否成功、缴费添加是否合理、缴费处理是否有反馈、投诉维修等信息添加后是否能够回馈回去信息等操作。
    6.3 测试环境Apache提供的Web服务器Tomcat 6.0使得用户可以在Windows 2000以上操作系统下发布自己设计的动态网页。因此对论坛的调试工作主要是利用Tomcat 6.0的强大功能在本机下完成的。为了在本机下浏览Web页面,首先在创建该系统的站点上(该系统使用的是Web的默认站点)将IP地址设定为127.0.0.1,它的缺省域名值为localhost。然后向IE浏览器输入本地动态网页的URL,Web服务器在收到浏览器传送的URL之后找到网页文件,并在服务器端执行该文件后将此文件以HTML文件的形式返回该浏览器。
    6.4 本系统测试设计测试方案是测试阶段的关键技术问题。所谓测试方案包括预定要测试的功能。应该输入的测试数据和预期的结果,目标是设计一组可能发现错误的数据。本系统中,我应用了如下测试方案:白盒测试、黑盒测试。
    对于测试过程我只列出缴费与投诉两个部分,给出了单元测试部分的实例。
    6.5 测试用例在系统测试中有很多种测试方法,现在我们针对系统部分功能进行一次测试记录下来。
    首先,进入缴费信息管理添加新的缴费信息。添加后自动返回缴费信息管理界面,这时候到运营的收费管理中确认下是否已经添加进入,并确认收费。
    现在我们对缴费信息进行添加,添加时候对缴费名称、费用以及备注进行测试是否能够为空、特殊字符以及测试是否有字符数的限制,测试添加功能是否符合我们的需求,如果有限制时候是否对限制有警告处理信息。
    添加缴费信息测试时发现缴费名称不允许为空,所有项可以未任何字符。能够符合当前对该系统的需求。添加缴费信息测试通过,没有存在任何问题。下面添加完成,查看缴费信息管理页面的其他功能以及添加后的现实情况。具体软件缴费实例如表6-1所示。



    动作
    期望结果
    实际情况




    添加缴费信息
    缴费信息界面添加上新的缴费信息
    与期望相吻合


    查看缴费信息
    打开所查看的缴费项的信息,表示出它的所有信息
    与期望相吻合


    确认缴费
    缴费信息状态更改为已缴费
    与期望相吻合


    删除缴费信息
    所要删除项的缴费信息全部被删除
    与期望相吻合



    结论:经测试,小区物业管理系统缴费功能不存在BUG,功能已全部实现。
    6.6 本章小结软件测试是软件开发中的重中之重,没有一点可以马虎的,在项目管理过程中,强调的是每个过程的每一个环节都要进行测试,保证系统在每个阶段可以控制。因为软件测试中考虑的问题基本上是项目管理中需要考虑的问题。具体说,软件测试是事务性的,而项目管理是策略性,一些策略性的东西必须在一些事务性的事务上来实现。
    结论至此,小区物业管理系统设计与实现顺利完成。在几天的试运行的过程中,在连接数据库时一度出现过错误,经过调试改正后错误点全部清楚,此系统可以按着设计思想和需求功能正常运行。
    由于当今的物业管理部门还不能有一个很统一的模式化,所以本系统仅考虑到一般小区所需要的物业管理的基本和主要的几项功能,一个完好的小区物业管理系统还需要更多更复杂的功能要求。由于开发周期短和开发人员等局限性,不能将本套系统尽善尽美。希望在以后能够对小区的物业做更深一步的调研,在原由系统的基础上不断添加新功能。最终能够开发出一套完善的小区物业管理系统。
    本系统在开发过程中,在固定的物业管理要求的模式下还添加了一些人性化的,个人的构思和创意。
    本套小区物业管理系统符合基本需求功能,易于操作,应该可以在简单化模式下的小区内应用,存在要改进的地方再以后会进一步完善。希望本系统能够给用户带来方便。
    在这次毕业设计论文撰写过程中,时间很紧迫。由于已经参加实习工作,很多计划使得没有充分的时间去实习,去准备。希望在以后能够进行二次开发,继续完善它,使投入使用后更变得有实用价值。
    参考文献
    李春葆.数据库原理与应用.北京:清华大学出版社,2012
    普西金.深入体验JSP项目开发.北京:机械工业出版社,2011
    邹劲松.物业管理信息系统. 北京:清华大学出版社,2010
    季如进.物业管理(修订第二版). 北京:机械工业出版社,2010
    陈朗钦.图书管理信息系统设计. 北京:人民邮电出版社,2011
    萨师煊.数据库系统概论. 北京:清华大学出版社,2010
    张建.基于WEB的人力资源管理系统的设计与实现.大连:吉林大学出版社,2013
    王国辉.JSP项目开发全程实录(第2版).北京:清华大学出版社,2013
    韩万江.软件项目管理案例教程(第二版).机械工业出版社.2011
    Paul Nielson .Microsoft SQL Server 2008 Bible.[M]. Neurology,2011
    Jan L.Hamington.SQL Clearly Explained.[M].JRD,2011
    Thomas Kyte.Programming Techniques and Solutions[M].BeiJin:Posts& Telecom Press,2013
    Ted Neward.Server-based Java Programming.[M].JIDD,2012
    Bryan Basham.Head First Servlets and JSP .中国电力出版社,2010
    Jeremy Keith.JAVAScript DOM.人民邮电出版社,2011
    12 评论 210 下载 2019-05-16 11:50:38 下载需要15点积分
  • 基于QT的英文文献的编辑与检索系统的实现

    1 需求分析1.1 程序功能需求设计一个带有图形界面的软件应用,完成针对于英文文章的手动编辑和检索功能。对于英文文章的文本的基本操作包括创建、打开、保存、查找以及替换等;对于给定的文章选段,可以统计出字符分布和出现数量,并且利用哈夫曼树算法进行相应的编码和译码工作;根据文本中的词频统计结果显示排序结构和相关信息。
    将所有的文本文件存储到指定位置,可以读取并且执行检索操作。利用倒排索引的算法实现关键词检索(字符串查找)并显示出结果,在结果中需要将检索的信息数据可视化,如指定检索词高亮或者输出检索词数目等。
    扩展功能包括对于图形界面的优化(可视化界面、菜单栏、工具栏、信息栏、更换皮肤)、多于一个关键词的联合检索和扩展检索、模糊检索(类似百度搜索引擎搜索提示)、检索结果的相关性排序(输出关键词数量、显示高亮位置等)、哈夫曼编码优化(编码、打开、保存)、算数编码(编码、打开、保存)。同时,将本应用程序投入到实际应用中,完成针对于托福口语选段的文本分析工作,有效的帮助有托福备考需求的学生学习。并且加入了语音朗读功能(开始、停止、调节音速、音量等)。
    1.2 开发&运行环境1.2.1 开发环境
    操作系统

    Windows 10(64 bit)
    开发平台

    Qt Creator 4.3.0
    Visual Studio 2015
    NotePad++

    附加类库(插件/编译器)

    Qt 5.9 for Windows 64-bit (MSVC 2017)
    Desktop Qt 5.9.0 MSVC2017 64bit
    MinGW


    1.2.2 运行环境
    Windows 7 及以上的64位操作系统
    1.3 界面设计需求程序界面包括菜单栏、工具栏、检索结果表单、文本编辑框、编码文本框、状态信息栏,启动程序时有入场渐变动画,可根据用户需求选择背景皮肤颜色。根据用户输入结果,动态显示对话框和其他组件
    2 数据结构设计2.1 数据结构设计2.1.1 最小堆结构最小堆结构是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值,即堆顶为当前最小值,用来建立最小堆排序。
    最小堆排序算法如下:

    取出线性表前n个元素创建长度为n的完全二叉树T
    遍历最后一个非叶节点到T的根节点,选取左右子节点中较小者且比当前根节点小的节点与当前根节点交换
    直到遍历结束,最小堆排序完成,即得到最小堆

    最小堆的抽象数据类型ADT如下:
    ADT MinHeap{ 数据对象:D={ai|ai∈Elem,i=1,2,3,...,n,n≥0} 数据关系:R={<ai,ai+1>|ai,ai+1∈D,i=1,2,3,...,n-1,n≥0} 基本操作: BuildHeap(&heap,n,c) 操作结果:利用heap数组中的数值构建长度为n容量为c的最小堆 InsertElem(Elem) 操作结果:插入Elem元素到最小堆并重新排序 RemoveElem(Elem) 操作结果:删除Elem元素从最小堆并重新排序 SiftDown(&Elem,&Elem) 操作结果:比较当前根节点和子节点,如子节点较大则向上交换 SiftUp(&Elem,&Elem) 操作结果:比较当前根节点和子节点,如子节点较小则向上交换} ADT MinHeap
    2.1.2 哈夫曼树结构哈夫曼树结构是带权路径长度最小的二叉树,用来构造文本编码。哈夫曼编码可以使编码和解码结果具有唯一性,且二进制编码得到了尽可能的压缩,提高了编码效率。
    构建哈夫曼树编码的算法如下:

    根据给定的n个权值 {w1-wn} 构造n颗只有根节点的二叉树,且设权值为wj
    在森林中选取两颗根节点权值最小的树作为左右子树构造新的二叉树,使新二叉树节点的权值为左右子树根节点权值之和
    在森林中删除左右子树,加入新得到的二叉树
    重复上述两步直到森林中只含一棵树为止,即得到哈夫曼树

    哈夫曼树的抽象数据类型ADT如下:
    ADT HuffmanTree{ 数据对象:D={ai|ai∈charset,i=1,2,3,...,n,n≥0} 数据关系:R={<ai,ai+1>|ai,ai+1∈D,i=1,2,3,...,n-1,n≥0} 基本操作: CreateHuffman(&HT,&HC) 操作结果:根据字符及其它们的权值建立Huffman树,用字符数组作为中间存储变量,最后字符编码存到HC中 HuffmanEncode(&HT,&HC) 操作结果:根据Huffman树进行编码 HuffmanDecode(&HT,&HC) 操作结果:根据编译过后的Huffman树进行译码 ShowNode(Node) 操作结果:显示单一节点的编码信息 SaveHuffmanCode(&HT,&HC) 操作结果:同HuffmanEncode(&HT,&HC),保存到编码文件中 LoadHuffmanCode(&HT,&HC) 操作结果:同HuffmanDecode(&HT,&HC),从编码文件中译码} ADT HuffmanTree
    2.1.3 算术编码结构算术编码结构存储根据字符串字符个数和出现频率,并且根据字符处于的出现概率区间逐个遍历编码,并且保存为一个浮点数作为算数编码,需要解码时根据字符概率数组读取进行解码。
    算术编码的算法如下:

    设置当前的编码间隔[L,H)为[0,1)和编码间隔长度CodeRange为1
    选取一个字符ch求出它的概率p和当前编码间隔长度CodeRange
    更新编码间隔[L,H)为当前字符的上边界Low减去下边界High
    更新字符编码区间的上边界High=Low+CodeRange*HighRange(ch) 和下边界 Low=Low+CodeRange*LowRange(ch)
    重复上述三个步骤,直到所有出现的字符编码完毕得到一个处于所有字符编码区间之间的一个浮点数,即为算术编码

    2.1.4 倒排索引结构倒排索引结构是一个倒排表,根据属性的值来查找记录,每一项元素都包括一个属性值和具有该属性值的各记录的地址。此处为了找出检索相关单词的信息设置属性为单词本身,利用键值对可以根据单词检索出单词所在的文件路径和出现的次数。
    倒排索引的构建算法如下:

    将文档拆分为有限个单词
    去除单词中的不明符号
    如果单词尚未出现在倒排表里则插入相应的文档路径,并将该索引的计数记为1;如果单词已经在倒排表,则将相应的文档路径的索引计数自增一次
    直到文档中所有单词都已加入到倒排表则倒排索引的构建完成

    倒排索引的抽象数据类型ADT如下:
    ADT IndexTable{ 数据对象:D={ai,bj,ck|ai∈wordset,bj∈directoryset,ck∈int, i=1,2,3,...,n,n≥0, j=1,2,3,...,m,m≥0, k=1,2,3,...,v,v≥0} 数据关系:R={<ai,<bj,ck>>|ai,bj,ck∈D} 基本操作: ParseWord(filename) 操作结果:根据文件路径读取文本文件并且将文档分解成单词 InsertWordToMap(filename,word) 操作结果:将单词插入相应文档路径filename下的索引键 ListSort() 操作结果:遍历倒排索引表并进行重新排序 SortMapByValue() 操作结果:遍历倒排索引表并进行重新排序输出成单词向量} ADT IndexTable
    2.2 程序结构设计2.2.1 程序整体结构程序的主体结构即是一个主类对象TextProcessor作为所有动作事件的承载者,其继承的父类是一个可视化窗口类,所以它本身完成了图形界面的要求。程序的主体结构由图形界面模块、人机交互模块、后台运算模块和其他模块等部分构成。
    图形界面模块部分包含main函数、ShowWidget等子模块,主要负责处理图形界面的外观排版设计,包括标题、菜单栏、工具栏、检索结果表单、文本编辑框、编码文本框、状态信息栏等可视化模块。
    人机交互模块部分包含TextProcessor、TextSpeech、Dictionary、Qss等子模块,主要负责处理用户输入产生的事件,进行基础的数据处理工作,并且根据事件类型产生相应的应答,例如弹出对话框、输出结果字符串或表格、存储读取文件等。
    后台运算模块部分包含FileSystem、Huffman、Arithmetic、InvertedIndex、KmpMatch等子模块,主要负责处理针对不同功能需求而产生的后台计算任务,包括哈夫曼编译码、算数编码编译码、倒排索引建立删除、KMP算法搜索指定字符串、模糊搜索的匹配计算、联合搜索的字符串处理等。
    2.2.2 模块功能描述
    main函数模块
    main函数子模块包含整个程序的main函数,负责创建主类TextProcessor的对象,同时产生了图形界面,维持进程的存在。
    ShowWidget模块
    ShowWidget模块包含了ShowWidget类,这是图形界面窗口布局和可视化操作的承载类。图形界面窗口由4个部分组成,分别是窗口标题(此处为“Literature Search App”)、菜单栏(工具栏)、中心栏、状态栏。中心栏为主要区域,采取横向布局,其中包含Top排序&倒排检索区域、文本编辑区域、编码译码区域,并且包含了动画效果弹出区域和渐变消失。对于各个区域,ShowWidget类都有相应的操作方法处理相应的业务逻辑显示出结果。
    TextProcessor模块
    TextProcessor模块即为TextProcessor类,主要负责图形界面的业务逻辑,例如处理用户输入产生的事件,进行基础的数据处理工作,根据事件类型产生相应的应答。该模块处理了文件操作(打开、保存、另存为)、文本高亮、文本查找(包括区分大小写和全字替换功能)、文本替换、文本显示扩展(字体、字号、加粗、显示、下划线、字体颜色、背景颜色、对齐方式、显示光标位置)等业务逻辑。同时将菜单和工具栏等功能的信号槽设置在了这个主类,方便处理各种与用户交互的需求,例如用户点击查找按钮(或利用快捷键输入),主类会创建查找对话框并为它分配空间,然后显示,与用户产生交互,而用户与查找对话框产生的交互逻辑皆由该类的函数处理。相对于ShowWidget主要处理图形界面的业务,TextProcessor主要处理与用户交互部分的业务逻辑。
    TextSpeech模块
    TextSpeech模块的功能是完成语音朗读的播放、停止、调整音速、调整音量等功能。
    Dictionary模块
    Dictionary模块主要负责搜索用户选中的关键词,利用韦伯斯特大辞典(英-英)查找关键字,并且显示查词结果到文本框。
    Qss模块
    Qss模块包含了更换皮肤(图形界面配色)的扩展功能。
    FileSystem模块
    FileSyetem模块包含了处理文件和文件夹相关的函数。例如getAllFiles()函数可以读取指定路径的所有文本文件,loadDictionary()函数读取了字典文件的特殊格式文本文件。
    Huffman模块
    Huffman模块包含了处理哈夫曼编码的相关操作函数,例如节点的创建、显示和哈夫曼树的创建、编码、解码、保存、读取等功能。
    Arithmetic模块
    Arithmetic模块包含了扩展的算术编码的相关操作函数,例如文本字符的统计与概率计算和算术编码的创建、编码、解码、保存、读取等功能。
    InvertedIndex模块
    InvertedIndex模块主要负责处理倒排索引的建立、更新和保存的功能,其中具体包含了分词、插入倒排表、倒排表堆排序等功能,这些功能函数随着每次倒排检索时调用,倒排表存储在内存中。倒排表是利用map容器建立的二层查找关系对键,第一层键的键是单词,键值是第二层键,第二层键的键是文件路径,键值是单词计数值。这样设计可以通过检索单词查找到单词的文本路径和出现次数。
    KmpMatch模块
    KmpMatch模块主要负责字符串搜索的算法实现功能,即实现KMP算法。
    其他模块
    其他模块包含了一些基础功能函数。

    3 详细设计3.2 函数设计3.2.1 主函数模块函数设计main.cpp
    // 创建主类TextProcessor的对象int main(int argc, char *argv[]);
    3.2.2 图形界面模块函数设计ShowWidget.cpp
    // 更新检索路径void ShowPathText();// 更新Top排序路径void ShowTopSortPathText(); // 显示Top排序对话框void ShowTopSortPathDialog(); // 更新检索关键词void ShowKeyText(); // 根据检索关键词更新倒排索引并显示检索结果void ShowRetrieveResult(); // 根据排序路径更新倒排索引并显示Top排序结果void ShowTopSortResult(); // 显示Top排序区域 void ShowTopSortArea(); // 显示检索区域void ShowRetrieveArea(); // 隐藏检索区域void HideRetrieveArea(); // 显示编码区域void ShowHuffmanArea(); // 隐藏编码区域 void HideHuffmanArea();
    3.2.3 人机交互模块函数设计TextProcessor.cpp
    // 文件处理部分void ShowNewFile(); // 新建文件void ShowOpenFile(); // 打开文件void ShowSaveFile(); // 保存文件void ShowSaveAsFile(); // 另存为
    // 显示属性部分void ShowFontComboBox(QString comboStr); // 显示字体框void ShowSizeComboBox(QString comboValue); // 尺寸自旋盒void ShowBoldBtn(); // 加粗功能void ShowItalicBtn(); // 显示斜体void ShowUnderlineBtn(); // 下划线void ShowColorBtn(); // 字体颜色void ShowBackColorBtn(); // 背景颜色void ShowCurrentFormatChanged(const QTextCharFormat &fmt);//字符格式化void ShowAlignment(QAction *act); // 对齐方式void ShowCursorPositionChanged(); // 显示光标位置
    // 查找&替换部分void ShowFindDialog(); // 查找对话框void ShowFindText(); // 查找文本高亮void ShowClearHighlight(); // 清除文本高亮void ShowFindStr(); // 查找文本void ShowDeleteFindDialog(); // 删除查找文本void ShowFindNextResult(); // 查找下一个结果void ShowReplaceDialog(); // 替换对话框void ShowReplaceStr(); // 替换文本void ShowReplaceNext(); // 替换下一个void ShowReplaceAll(); // 替换全部void ShowCapsLook(); // 区分大小写void ShowMatchWholeWord(); // 全字替换void ShowListHint(); // 提示列表void ShowComboBoxValueChanged(int newIndex);void ShowComboBoxValueChanged(QListWidgetItem *item);
    // 哈夫曼&算术编码部分void ShowHuffmanEncode(); // 哈夫曼译码void ShowOpenHuffmanCode(); // 打开哈夫曼编码void ShowSaveAsHuffmanCode(); // 另存为哈夫曼编码void ShowArithmeticEncode(); // 算术译码void ShowOpenArithmeticCode(); // 打开算术编码void ShowSaveAsArithmeticCode();// 另存为算术编码
    // 检索部分void ShowRetrieveText(int row, int col);// 检索文本void ShowTextArea();
    // 语音朗读部分void ShowSpeech(); // 语音void ShowSpeechStop(); // 语音停止void ShowSpeechRateWidget(); // 语音速度void ShowSpeechVolumeWidget(); // 语音音量void setRateLabel(int rate); // 设置语音速度标签void setVolumeLabel(int volume);// 设置语音音量标签
    // 皮肤部分void SetQss(const string s); // 设置Qssvoid getStyleSheet(QListWidgetItem *item); // 获取当前皮肤void updateStyleSheet(); // 更新皮肤void updateStyleSheet(QListWidgetItem *item); // 更新皮肤void ShowSkinListWidget(); // 皮肤列表
    // 菜单栏部分void ShowDictionary(); // 字典对话框void ShowSearchStr(); // 更新查找关键词void ShowSelectionStr(); // 显示查找关键词高亮void ShowDeleteSearchStr(); // 删除查找关键词void ShowDictionaryResult(); // 显示字典搜词结果void ShowAboutDialog(); // 关于
    TextSpeech.cpp
    bool initSpeech(); //初始化bool speak(QString txt); //文本转语音bool stop(); //语音停止void setRate(int rate); //调节语速(-10,10)void setVolume(int value); //调节音量(0,100)bool isSpeaking(); //是否在读bool output(QString path); //输出
    3.2.4 后台运算模块函数设计FileSystem.cpp
    // 读取词典文件void LoadDictionary(map<QString,QString> &dictionary);// 获取路径内全部文件void getAllFiles(string path, vector<string>& files);
    Huffman.cpp
    // 初始化节点void InitNode(priority_queue<Node> &q, string text);// 显示节点void ShowNode(priority_queue<Node> q); // 创建哈夫曼树void CreateHuffmanTree(priority_queue<Node> &q); // 哈夫曼编码void HuffmanEncode(Node *root, string &prefix, map<char, string> &HuffmanResult);// 译码string HuffmanDecode(string text, map<char, string> &HuffmanResult);// 转译string HuffmanTranslate(string code, map<char, string> HuffmanResult);// 打印编码void PrintCode(string code); // 读取编码文件map<char, string> LoadHuffmanResult(string codefile);
    Arithmetic.cpp
    // 计算概率区间int calProbability(string text, string &allletter, vector<long double> &p, int count);// 查找文档中重合字符int Search(vector<L> v, char ch1, int n);// 算术编码long double Encode(string allletter, vector<long double> p, string text, int number, int size);// 算术解码string Decode(string text, string &allletter, vector<long double> &p, int &letternum, int &textsize, long double input);
    InvertedIndex.cpp
    // 更新倒排表void UpdateInvertedIndexTable(const string filename); // 分词bool ParseWord(const string filename); // 插词void InsertWordToMap(const string f, const string w); // 倒排表排序void ListSort(); // 值比较int cmp(const pair<string, int>& x, const pair<string, int>& y);void sortMapByValue(map<string, int>& tMap, vector<pair<string, int> >& tVector);
    KmpMatch.cpp
    // 计算前缀表void MakeNext(const string P, vector<int> &next, bool s, bool w);int KmpMatch(const string T, const string P, int &index, bool s, bool w);
    1 评论 9 下载 2018-12-14 10:58:48 下载需要10点积分
  • 基于JAVA和MYSQL数据库实现的学生信息管理系统

    1 项目介绍1.1 概述学生成绩管理系统是广泛使用的一种信息管理系统,在学生成绩管理系统中,需要能处理各班信息、各班下属学生的个人信息及每个学生学习成绩信息。班级信息包括班级编号、班级名称,学生信息包括学号、姓名、性别、所属班级、联系方式等,及各门课程的成绩。与班级相关的操作是查看已有班级、新增班级、修改班级名称、删除班级、录入新生信息等;与学生相关的操作是查看已有学生、修改学生基本信息、删除学生、录入成绩、修改成绩、根据姓名、学号、班级、课程等多条件查询学生成绩,并可以依据多种条件进行排序。
    1.2 平台、语言和工具
    程序编写语言:Java、SQL
    开发平台:Eclipse Mars.2、Navicat 11.0.17
    使用工具:C3P0、Log4j
    运行环境:jre1.7_80、MySql 5.7

    1.3 技术细节1.3.1 图形
    本程序的UI使用Java原生的GUI界面,按钮在下排
    统一使用JOptionPane类的信息提示窗口
    子窗口弹出时父窗口无法点击
    所有的窗口在关闭时使用dispose();而不是setvisible,保证在窗口关闭时释放该窗口的资源
    去除窗口对象实例化时的引用,利用JVM的垃圾销毁机制节省内存

    1.3.2 Java编程
    内部类:所有的监听器类都用内部类实现,可以使外部无法访问这个内部类,也方便了对其外部类的监听
    后台架构:程序使用仿MVC架构实现,为view、model(po)、service、util、dao五层。使得变成风格更加清晰、模块化,便于抽离和拓展
    模板方法模式:所有的dao类继承一个IOToSQL类作为baseDao,baseDao是一个抽象类,里面有增删查改四个基本的未实现方法和一些封装的实现方法,具体类dao继承并实现具体的抽象方法
    反射:模板方法遍历数据库使用反射原理,传入resaultSet,用newinstance()获取某个po相应的对象,再获取其get、set方法,最后返回需要的po类对象的Map集,再转换成List
    泛型编程:dao抽象类使用了Java泛型,提高父类整体的抽象程度
    JDBC连接池:池化数据库连接,提高连接的利用率和程序运行的效率。

    2 程序结构2.1 后台架构程序使用仿MVC架构实现,整个程序分为view、model(po)、service、util、dao五层:

    Dao层:和数据库交互的层次,由于使用未封装的JDBC,所以本程序的dao层也是持久层
    Service:业务逻辑处理层,负责对dao层异常处理、view层数据校验、业务流程控制、业务逻辑处理
    Model:实体类层,所有的业务实体类都会存放在这里。比如老师、管理员
    View:显示层,所有有关GUI的类,以及窗口跳转处理都在这里
    Util:工具类层,所有使用到的一些工具方法,例如数据库连接的获取、关闭,字符串的正则判断、长度判断、空判断、字符拼接,view层表格处理等都在此封装。由于是工具方法,所以这里的方法都用static字段修饰

    其中,dao为数据层,util/po/service为业务逻辑层,view为显示层。
    图形层通过业务逻辑层获取数据层的数据,降低了耦合,实现模块化编程
    整体架构如下图所示:

    3 数据库表结构3.1 数据库ER图表

    Course:课程表,有课程id(主键)、课程名、学分三个字段
    Score:分数表,有分数id(student表外键)、课程表主键id的关联外键、分数、学分
    Student:学生表,学生学号id(主键)、学生名、学生年级、学生班级、手机号、邮箱
    user:用户id(主键)、用户名、密码、身份(管理员还是老师)

    3.2 数据库表的外键
    多对多:Student和course有多对多的关系,使用中间表score作为关联实现这种多对多的关系
    一对多:student和score、course和score都是一对多的关系,由于这个程序的特殊性,可以将多对多的映射表作为score表实现
    所有的外键都是级联删除属性,删除一条主数据时,有关联外键的数据也会一同删除。比如删除一个学生时,会将其所有的分数信息删除

    3 程序功能展示3.1 整体结构
    3.2 支持两种身份的用户注册、登录
    对所有的输入都有进行正则校验,用户名有2-6位中文和6-18位英文或数字限制,且不能输入特殊符号;密码有6-18位英文或数字限制。


    3.3 修改密码对原有密码进行更改,对密码同样有正则判断。

    3.4 对学生的增删查改可以对学生的信息进行修改、学生查询、增加删除。所有输入操作均有防暴力输入和正则判断。
    3.4.1 增加学生已存在的学号不能重复添加。

    3.4.2 姓名输入过长、有特殊符号、非纯中英文、含有数字
    3.4.3 班级数字过大、非数字
    3.4.4 可以对学生删除操作
    3.4.5 模糊查询学生信息
    3.4.6 成绩管理和查询

    3.4.7 查询成绩
    3.4.8 课程更改
    3.5 权限管理老师可以增删学生、查看修改成绩、升级成管理员账户;管理员可以修改学生课程、学分和老师账户的管理。

    3.6 删除普通老师用户高级用户模式

    4 业务流程
    5 文件结构
    4 评论 263 下载 2018-11-06 16:33:16 下载需要13点积分
  • 基于JSP和MySQL的网上商城的设计与实现

    前言项目开发目的
    近年来,互联网的快速发展,推动了网上购物的潮流,越来越多的人在 网上购买商品,尚购公司为了有力的推销自己的产品,决定打造一个 B2C 模 式的商城,用于销售自己本公司的产品。
    项目开发定义
    本系统主要有以下功能:

    用户功能实现

    用户的登录用户的注册
    系统功能实现

    商品模块订单模块评论模块
    后台管理

    管理员的登录用户的管理几大模块信息的管理

    项目开发平台

    IDE:MyEclipse
    数据库:MySQL

    第1章 项目开发计划书1.1 项目范围系统主要分为五大模块:

    登录注册模块
    商品模块
    订单模块
    评论模块
    后台管理模块

    初始活动:

    与客户交流,获取需求
    分析需求,制定开发方案
    根据系统的大小以及各方面的要求,选择合适的框架
    根据系统的开发周期,选定人员

    最后活动:
    系统测试:对项目做单元测试和集成测试,针对测试报告,进一步改进。 减少 bug 数。
    1.2 项目成果


    序号
    内容
    计划时间
    实际时间
    状态




    1
    项目设计
    20 天
    30 天
    已完成


    2
    文档开发
    10 天
    3 天
    已完成


    3
    界面开发
    2 天
    2 天
    已完成


    4
    登录注册模块
    2 天
    2 天
    已完成


    5
    商品模块
    3 天
    3 天
    已完成


    6
    订单模块
    3 天
    2 天
    已完成


    7
    评论模块
    3 天
    3 天
    已完成


    8
    后台管理模块
    3 天
    3 天
    已完成


    9
    系统测试
    5 天
    5 天
    已完成



    1.3 项目风险分析


    序号
    风险
    概率(%)
    严重性(%)
    措施




    1
    时间不够(因为自 己在学习,没有足 够多的时间)
    80
    100
    尽量的腾出时间,可能 的话,晚上也加班完成 项目。


    2
    超期限
    80
    100
    把握时间,排出进度表, 按进度执行。


    3
    由于系统集成时候 问题引起的最终产 品的缺陷
    90
    100
    经过大量的测试,用不 同的操作系统平台,考 虑会出现的各种软硬件 环境错误信息。设计软 件的时候捕获所有可能 的错误信息。


    4
    遵循标准(如命名 规则)中的差别
    80
    10
    建立命名规则要求



    第2章 需求规格说明书2.1 问题陈述近年来,互联网的快速发展,推动了网上购物的潮流,越来越多的人在网上 购买商品,尚购公司为了有力的推销自己的产品,决定打造一个 B2C 模式的商 城,用于销售自己本公司的产品。
    2.2 要达到的目标本系统要达到的目标:

    在网站上发布公司产品,并能够对库存、订单进行处理
    能够注册会员和登录系统
    能够查询和浏览产品详细,会员可以购买商品,下订单,和收藏商品

    2.3 需求分析
    浏览商品



    标识符
    UC003




    用例名称
    浏览商品


    简要说明
    浏览商品和商品详细信息


    参与者
    管理员、会员、游客。


    基本流
    1. 打开系统。 2. 浏览商品


    备选流



    前置条件
    成功打开系统


    后置条件
    浏览商品



    搜索商品



    标识符
    UC004




    用例名称
    搜索商品


    简要说明
    搜索想要浏览的商品


    参与者
    管理员、会员、游客。


    基本流
    1. 打开系统。 2. 在搜索栏中输入搜索条件。 3. 点击搜索按钮。 4. 根据搜索条件查询符合条件的商品并显示。


    备选流



    前置条件
    成功打开系统


    后置条件
    搜索到预期的商品。



    收藏商品



    标识符
    UC005




    用例名称
    收藏商品


    简要说明
    将商品收藏起来,以便于以后查看


    参与者
    会员。


    基本流
    1. 选择商品 2. 点击收藏 3. 将商品收藏到收藏夹中。


    备选流



    前置条件
    成功登录系统


    后置条件
    成功将商品收藏。



    加入购物车



    标识符
    UC006




    用例名称
    加入购物车


    简要说明
    将商品加入购物车


    参与者
    会员。


    基本流
    1. 选择商品 2. 点击加入购物车 3. 将商品加入到购物车中。


    备选流



    前置条件
    成功登录系统


    后置条件
    成功将商品加入到购物车中。



    商品管理



    标识符
    UC007




    用例名称
    商品管理


    简要说明
    对系统中的商品进行管理


    参与者
    管理员


    基本流
    1a. 上架商品 1. 选择未上架商品。 2. 点击上架按钮。 3. 提示上架成功。 2a. 下架商品 1. 选择已上架商品。 2. 点击下架按钮。 3. 提示下架成功。 3a. 新增商品 1. 点击新增按钮,进入到新增页面。 2. 按要求输入商品信息。 3. 点击保存。 4. 提示保存成功。 4a. 修改商品 1. 选择商品。 2. 点击修改按钮。 3. 修改商品信息。 4. 点击保存。 5. 提示保存成功。 5a. 删除商品 1. 选择商品。 2. 点击上传按钮。 3. 提示是否要删除该商品。 4. 点击确定。 5. 提示删除商品成功。


    备选流



    前置条件
    管理员成功登录系统


    后置条件
    1a. 成功将商品上架。 2a. 成功将商品下架。 3a. 成功新增商品信息。




    评论



    标识符
    UC010




    用例名称
    评论


    简要说明
    会员对本次交易进行评论。


    参与者
    会员。


    基本流
    1. 选择已完成的订单。 2. 点击评论。 3. 输入评论。 4. 点击提交评论。 5. 评论提交成功。


    备选流
    1a. 追评 1. 选择已完成并已评论的订单。 2. 点击追评按钮。 3. 输入追评。 4. 点击提交。 5. 成功提交追评。


    前置条件
    1. 会员成功登录系统。 2. 订单已经完成。


    后置条件
    成功评论。



    回复评论



    标识符
    UC011




    用例名称
    回复评论


    简要说明
    对评论进行回复。


    参与者
    管理员。


    基本流
    1. 选择要回复的评论。 2. 点击回复按钮。 3. 输入回复信息。 4. 点击提交。 5. 回复评论提交成功。


    备选流



    前置条件
    3. 管理员成功登录系统。 4. 会员已评论。


    后置条件
    成功回复评论。



    第3章 系统设计书3.1 命名规则开发人员统一命名规范程序代码,更好的统一各模块。
    数据库命名规则:

    表:“Tab_”+“表描述词”。如:Tab_User 指用户表
    列:“表描述词‘’的首字母为小写。如:userId 措用户表的 ID 数据库名:shang_gou

    类命名规则:
    用名词或名词短语命名类、每个单词或短语的第一个字母必须大写。 如:public class UserDaoImpl(){}
    函数命名规则:
    用动词或动词短语命名方法。用下述范例所示的 Pascal 大写方式命名方法。如:public String UserFind()、public void MakeMD5 ()
    属性命名规则 用动词或动词短语命名方法。字母里面不能含有大写字母及下划线。如:loginname、loginpassword
    接口的命名规则
    使用名词或名词短语,或者描述行为的形容词来命名接口。例如,UserDao(描述性名词),在接口名前加前缀 I,以表示这个类型是一个接口。 如:public interface UserDao {}
    JSP 命名规则
    用名词或名词短语命名类 、每个单词或短语的第一个字母必须大写。 如:Log.jsp、index.jsp
    3.2 软件结构图3.2.1 系统总架构图
    3.2.2 系统文件结构图
    3.3 系统功能结构设计

    用户注册:提供新用户功能,检查注册信息的有效性,并将注册用户信息存入对应数据库的数据表中
    评论管理:会员对本次交易进行评论,管理员对评论进行回复

    3.4 类图3.4.1 包图根据其功能将其为七个包,如下图所示。



    包名
    主要功能




    Web
    页面层,用于存放页面视图


    dao
    数据接口


    bean
    实体包,保存实体模型


    control
    访问控制包,用于实现界面和业务连接控制


    dao.impl
    数据业务包




    3.5 时序图3.5.1 用户注册用户在注册页面添加个人信息提交传给服务器管理员保存。

    3.5.2 商品添加
    3.6 数据库设计3.6.1 数据库
    数据库名称:shang_gou
    数据文件大小:3M
    数据文件物理位置:C:\ MySQL \MSSQL.1\MSSQL\DATA\ shang_gou.mdf
    日志文件大小:1M
    日志文件物理位置:C: \MySQL \MSSQL.1\MSSQL\Data\ shang_gou_log.ldf
    文件组名称:PRIMARY

    3.6.2 表设计以下不包括 SQL Server 为数据库提供的默认的系统表。
    系统用户表(sys_user)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    account
    用户账号
    varchar
    30
    NO
    主键


    password
    用户密码
    Varchar
    30
    NO



    nickname
    用户昵称
    Varchar
    30
    NO



    name
    姓名
    Varchar
    10
    YES



    sex
    性别
    Varchar
    2
    YES



    birth_date
    出生日期
    date

    YES



    email
    邮箱
    Varchar
    30
    YES



    qq
    QQ
    Varchar
    20
    YES



    mobile_phone
    手机
    varchar
    20
    NO



    phone
    电话
    varchar
    20
    YES



    addr
    地址
    varchar
    200
    YES



    会员表(member)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    member_account
    管理员编号
    varchar
    30
    NO
    主键


    member_password
    管理员名
    varchar
    30
    NO



    member_nickname
    管理员密码
    varchar
    30
    NO



    name
    姓名
    varchar
    10
    YES



    sex
    性别
    varchar
    2
    YES



    age
    年龄
    int
    3
    YES
    默认值 为 0


    birth_date
    出生日期
    date

    YES



    constellation
    星座
    varchar
    10
    YES



    email
    邮箱
    varchar
    30
    YES



    qq
    QQ
    varchar
    20
    YES



    mobile_phone
    手机
    varchar
    20
    YES



    phone
    电话
    varchar
    20
    YES



    addr
    地址
    varchar
    200
    YES



    地址表(address)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    addr_no
    地址编码
    varchar
    30
    NO
    主键


    member_account
    会员账号
    varchar
    30
    NO



    addr
    收件地址地址
    varchar
    200
    NO



    postcode
    邮编
    varchar
    10
    YES



    name
    收件人
    varchar
    10
    NO



    mobile_phone
    手机
    varchar
    20
    NO



    phone
    电话
    varchar
    20
    YES



    商品类型表(commodity_type)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    type_no
    类型编码
    varchar
    30
    NO
    主键


    type_name
    类型名称
    varchar
    30
    NO



    parent_type_no
    父类型编码
    varchar
    30
    NO



    remark
    备注
    varchar
    100
    YES



    new_account
    新增人
    varchar
    10
    YES
    外键(sys_user)


    new_date
    新增时间
    date

    YES



    commentaccount
    修改人
    varchar
    10
    YES
    外键(sys_user)


    modification_date
    修改时间
    date

    YES



    商品表(commodity)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    commodity_no
    商品编码
    varchar
    30
    NO
    主键


    type_no
    类型编码
    varchar
    30
    NO
    外 键 (commodity_ty pe)


    commodity_name
    商品名称
    varchar
    30
    NO



    commodity_intro
    商品简介
    varchar
    100
    NO



    commodity_detail
    商品详情介绍
    varchar
    300
    YES



    price
    单价
    float

    NO
    0


    is_putaway
    是否上架
    tinyint
    1
    NO
    0


    new_account
    新增人
    varchar
    10
    YES
    外键(sys_user)


    new_date
    新增时间
    date

    YES



    commentaccount
    修改人
    varchar
    10
    YES
    外键(sys_user)


    modification_date
    修改时间
    date

    YES



    商品图片表(commodity_picture)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    picture_no
    商品编码
    int
    10
    NO
    主键(自动增长列)


    commodity_no
    类型编码
    varchar
    30
    NO
    外键(commodity)


    prcture_addr
    商品名称
    varchar
    300
    NO



    prcture_rank
    商品简介
    varchar
    30
    NO



    prcture_sequence
    商品详情介绍
    varchar
    300
    NO



    商品规格表(commodity_specification)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    sku_no
    SKU 编码
    int
    10
    NO
    主键 ( 自 动 增 长列)


    sku_code
    SKU 码
    varchar
    30
    NO



    commodity_no
    商品编码
    varchar
    30
    NO
    外 键 (commodity)


    stock_number
    库存数量
    int
    10
    NO
    0


    sell_number
    已售数量
    int
    10
    NO
    0


    spec1
    规格 1
    varchar
    30
    NO



    Spec2
    规格 2
    varchar
    30
    NO



    Spec3
    规格 3
    varchar
    30
    YES



    Spec4
    规格 4
    varchar
    30
    YES



    Spec5
    规格 5
    varchar
    30
    YES



    remark
    备注
    varchar
    100
    YES



    商品参数表(commodity_parameter)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    parameter_no
    参数编码
    int
    10
    NO
    主键 ( 自 动 增 长列)


    commodity_no
    商品编码
    varchar
    30
    NO
    外键 (commodity)


    parameter_name
    参数名称
    varchar
    30
    NO



    parameter_explain
    参数说明
    varchar
    100
    NO
    0



    购物车表(shopping_no)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    shopping_no
    购物车编码
    int
    10
    NO
    主键 ( 自 动 增 长列)


    member_account
    会员编码
    varchar
    30
    NO
    外键(member)


    commodity_no
    商品编码
    varchar
    30
    NO
    外 键 (commodity)



    订单表(order)



    字段名
    字段说明
    类型
    长度
    是否为空
    备注




    order_no
    订单号
    varchar
    30
    NO
    主键


    member_account
    会员编码
    varchar
    30
    NO
    外键(member)


    addr_no
    地址编码
    varchar
    30
    NO
    外 键 (address)


    order_date
    订单日期
    date

    NO



    account
    修改人
    varchar
    10
    YES
    外 键 (sys_user)


    modification_date
    修改时间
    date

    YES



    第4章 系统操作手册4.1 用户登入模块操作会员输入账号和错误密码时候会提示密码错误的框、输入正确密码进入主 页,就可以看到物品的信息和价格了,还有可以看到搜索框,可以去搜索你想要 的物品,后显示物品的信息和价格了。

    4.2 用户注册模块操作没有会员账号的可以选择注册按钮,进入注册界面去申请注册会员。密码和 重复密码不一样的时候回提示注册失败。注册成功后会直接跳到登入界面在进行 重新登入。

    4.3 订单提交模块操作会员选好物品后并点击购买后会进入订单提交界面,会员可以查看到自己的 收件地址,和你选好的物品名称和金额。

    4.4 商品留言评论
    3 评论 36 下载 2020-08-15 22:21:34 下载需要11点积分
  • 基于JSP和MySQL实现的网上商城系统

    摘 要网上商城系统开发存在的两个问题就是后台的管理与消费者操作的方便性,系统从数据库开发的基本内容入手,利用JAVA技术开发了基于Web的在线用户管理模块、在线商品销售模块、在线后台管理模块。实现了最重要的商品销售功能,也就是管理库房中的商品,及管理用户的购物车,从而实现结帐等一系列功能。另外网上商品销售系统还提供给用户查找数据库中商品相关记录的功能。同时,为了保证商品交易的正常进行,还实现了用户的登录注册功能。网上商城系统按照软件工程的要求,对系统进行需求分析,总体设计,详细设计,编码与测试,在此基础上将理论知识与开发技术运用到系统的实现过程当中,完成了网上商城平台的构建。经过大量的系统测试发现,JAVA网站的访问速度较块,安全性较好,有很强的实用性。
    本论文详细介绍了开发网上商城的全过程,是按软件工程的思想设计的 ,包括需求分析、系统总体设计、系统详细设计等。
    本系统具有多方面特点:系统功能完备,使用方便简捷,人性化的用户界面,安全保密设置齐全,节省经营成本,大大减少了操作人员的工作负担。
    关键词:购物车;数据库管理;网上商城
    AbstractTo develop the web shop system exist two issues. One is the background management the other is the convenience operation for consumers this article take the database development as the basic start use the JAVA technology to develop web-based online user management module online book sales module online background management module. It implement the most important book sale function i.e. manage the shop and shopping car of consumer thus it implement a series of functions such as check-out In addition, the online book sale system is also provided searching the database record function to consumer. Mean wile in order to guarantee the normal trade. the system implements a registered user login function. Web shop systems conform to the specification of soft project, the system needs analysis, design, detailed design, Coding and testing, on this basis, taking the theoretical knowledge and development of technologies to the system implementation process complete the web shop platform building.
    This manual in details introduced to develop the web shop system in the Internet, is thought design that press the software engineering of, include detailed design etc. of total design, system of need analysis, system.
    This system has the various characteristics: The system function is complete, using convenient, humanized customer interface, the safety keeps secret to establish well-found, economical management cost, reduced to operate the personnel’s work burden consumedly.
    Key Words: Cart; Database Management; Web shop
    第1章 绪 论1.1 课题背景无店铺零售的悄然兴起,是商业经济发展到一定阶段的产物,也是顺应新的消费需求和技术进步的必然结果。上海市商业经济研究中心副主任齐晓斋分析说,与传统的百货商店、连锁超市、大卖场、便利店等有形商铺相比,无店铺零售业态具有一定的先天优势。一是地段。对于传统的有形店铺来说,一是家门店选址、地段的优劣,几乎能够决定其未来经营的成败,而城市中的商业网点资源,尤其是优质商业网点资源通常十分稀缺。无店铺零售则大多不存在地段方面的制约。二是经营成本。借助日益发展的科学技术,无店铺零售通常能够省却从生产到销售过程中的许多环节,从而有效降低经营成本与交易成本,带来消费者、商家双赢的局面。三是风险。对于个人来说,网上商店等无店铺零售业态的准入门槛相对较低,运转比较灵活,即使遇到风险,也有船小好掉头的优势。专家表示,随着社会经济的发展及消费水平的提高,人们希望得到更加方便、更加快捷的购物方式,同时也乐于尝试各种新的购物方式。在这一市场需求的推动下,企业会对商品零售的方式进行创新,而先进的技术给创新提供了重要支撑与平台。
    1.2 课题的目的和意义鉴于互联网的优势以及对国内外相关电子商务网站现状的研究分析,我决定以基于Web的商城电子商务网站开发作为我的毕业设计主题。立足于设计一个在网络平台上运行的集购物、支付和配送等功能于一体的无店铺商城,以小小的力量推动中国互联网的发展。
    1.3 国内外概况随着计算机技术的发展和网络人口的增加,网络世界也越来越广博,越来越丰富,电子商务已经成为网上的一股潮流。相信要不了太长有时间,顾客就可以在网络世界上获得他们在现实世界上可以获得的所有商品和服务。
    以下是根据CNNIC(中国互联网络信息中心)公布的中国B2C电子商务发展报告来进一步分析目前的网上购物的现状。
    90%选择网上购物的人都认为网上购物节约时间和操作方便,他们分别占46.7%和44.2%,这说明随着生活节奏的加快,人们越来越希望拥有简单快捷的购物方式网上购物已经逐渐成为一种购物趋势,越来越多的人选择网上购物。
    消费者对消费要求的日益提高,使得网上商城必须向着专业化迈进,通过提供专业的产品和服务,区分市场。以卓越网和铛铛网为例,日前针对不同的消费者和消费需求,开通了计算机、外语、文学和艺术四个专业商城,这不仅体现了卓越网“最以客户为中心”的经验理念,相信也是中国网上商城未来发展的趋势。
    尽管网络版权、阅读习惯仍是制约未来网络出版、网上商城发展的障碍,但网络环境给商品出版业带来深刻的革命,已成大势所趋。网上商城和传统店铺都在继续争取商品发行新的利润空间。目前的情况是,商品发行业对网络的利用并不充分,只刚刚涉足电子商务和网站建设,对网络的其他产品,以及网络及时、一对一、跨时间、跨空间等特性,并没有充分加以利用,可以预计,随着网络进一步融入人们的生活,以技术、服务为品牌支撑的网上商城将成为市场的宠儿和业态创新的引领者。
    1.4 课题的发展趋势随着信息技术广泛、深入地应用到人类社会的各个领域并发挥着越来越重要的作用。计算机软件技术应用于信息管理是发展的必然。作为计算机应用的一部分,充分发挥计算机的优势,将大量复杂的数据交给计算机来处理,有着手工管理所无法比拟的优点。如:查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高信息管理的效率,是真正意义上的合理利用资源,也是企事业管理科学化、正规化,与世界接轨的重要条件。
    第2章 可行性分析可行性分析就是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。该系统的可行性分析包括以下几个方面的内容。
    2.1 社会可行性随着计算机技术的发展和网络人口的增加,网络世界也越来越广博,越来越丰富,电子商务已经成为网上的一股潮流。相信要不了太长有时间,顾客就可以在网络世界上获得他们在现实世界上可以获得的所有商品和服务。网上商城系统主要目的是进行网上购物,并且严格按照国家法律法规来进行研究和实践,并无法律和政策方面的限制。
    2.2 技术可行性本系统采用的是JSP、Servlet和MySQL开发,Windows XP Professional操作系统,用Dreamweaver进行前台网页界面设计、采用JDBC方式与后台数据库进行连接,完成数据的添加、修改、删除、查询等功能。由于JSP、Servlet功能强大,而MySQL灵活易维护在开发方面具有方便快捷、使用灵活的特点,以及目前的广泛实际应用,因此使用JSP、Servlet、MySQL是开发轻平台的最佳组合从而说明本系统在技术方面可行。
    硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。
    2.3 操作可行性目前,大多数计算机都能运行该系统,该系统的安装、调试、运行不会改变原计算机系统的设置和布局,并且系统界面简单,提示信息完整,由相关人员指导便能够方便的操作此软件。
    2.4 系统的技术介绍2.4.1 JavaScript介绍JavaScript是一种新的描述语言,此语言可以被嵌入 HTML 的文件之中。透过 JavaScript可以做到回应使用者的需求事件(如: form 的输入)而不用任何的网路来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端 (server)处理,再传回来的过程,而直接可以被客户端(client)的应用程序所处理。你也可以想像成有一个可执行程序在你的客端上执行一样!目前已有一些写好的程序在Intenet 上你可以连过去看看,以下有一些计算器的例子,在 Nescape 上。
    JavaScript 和 Java 很类似,但到底并不一样! Java 是一种比 JavaScript 更复杂许多的程序语言,而 JavaScript 则是相当容易了解的语言。JavaScript 创作者。可以不那麽注重程序技巧。
    2.4.2 MVC介绍MVC即模型-视图-控制器,是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
    MVC的工作模式MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务.

    模型:模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性
    视图:视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式
    控制器:控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何的处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据

    综上所述,MVC的处理过程是首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
    MVC的应用大部分Web应用程序都是用像ASP,PHP或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。
    首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。
    由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
    因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的构件。
    MVC的缺点MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。
    根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
    MVC是一条创建软件的好途径MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
    2.4.3 MySQL介绍MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL开发、发布和支持。从计算机可以很好的处理大量的数据以来,数据库管理系统就在计算机处理中和独立应用程序或其他部分应用程序一样扮演着一个重要的角色。MySQL主要目标是快速、健壮和易用。自1996年以来,MySQL已在很多系统中得到了应用,其环境有超过 40个数据库,包含 10,000个表,其中500多个表超过7百万行,这大约有100 个字节(GB)的关键应用数据。而MySQL最主要的是开源的可以免费使用任何人都可以使用和修改该软件,可以从Internet上下载和使用MySQL而不需要支付任何费用。MySQL服务器是一个快的、可靠的和易于使用的数据库服务器。
    2.4.4 JDBC介绍JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用,将Java语言和JDBC结合起来使程序员只须写一遍程序就可以让它在任何平台上运行。
    JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口,而且JDBC 还扩展了 Java 的功能。例如,用 Java 和 JDBC API 可以发布含有 applet 的网页,而该 applet 使用的信息可能来自远程数据库企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中即使这些职员所用的计算机有 Windows、Macintosh 和UNIX 等各种不同的操作系统。
    2.5 系统开发平台及运行环境2.5.1 系统开发平台系统的开发是在Tomcat环境下进行的。Tomcat是一个免费的开源的Servlet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat被Java World杂志的编辑选为2001年度最具创新的Java产品,可见其在业界的地位。
    Tomcat的环境主要有以下几方面技术优势:

    Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包
    在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压
    Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理html页面
    Tomcat也可以与其它一些软件集成起来实现更多的功能

    2.5.2 运行环境
    操作系统:Windows 7
    服务器软件:Tomcat6.0
    浏览器:Internet Explorer6.0及以上版本

    第3章 需求分析本章主要进行系统需求分析,数据库需求分析和运用MySql软件为本系统建立必须的表。
    3.1 系统需求分析系统需求分析就是指在整个系统开发过程中解决“做什么”的问题,把要解决哪些问题,满足用户哪些具体的信息需求调查分析清楚。本网上商城系统的目的是鉴于互联网的优势以及对国内外相关现状的研究分析,我决定以基于Web的商城网站开发作为我的毕业设计主题。立足于设计一个在网络平台上运行的集购物、支付和配送等功能于一体的无店铺商城。
    系统能实现用户的注册功能、登录功能、商品的查询,订购等功能。该系统基本上具备一个商品销售网站应该具备的功能,该设计项目基本上体现了构建一个动态商务网站所需要的技术。
    本网站是小型的商品销售网站,消费者可以有目的性的快速找到你所期望的产品,可以直观的浏览商品的价格、内容、生产日期是否符合需要,为现在高效率的生活带来方便。
    经过前期的深入调查和研究,总结出该平台需要完成的一些具体功能,分析如下:

    用户管理:能够完成用户基本信息录入的注册和用户基本信息的个人前台与后台管理
    管理员管理:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、商品审查)、商品交易(外理订单、发货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)的功能
    搜索功能:通过商品的名称,商品的分类进行搜索
    查询功能:能够通过查看购物车对所选商品进行确定、挑选,通过定单查询对支付费用进行确定

    3.2 数据库结构分析数据库的结构分析在数据库开发前期的设计中占很重要的位置,一个好的系统,离不开一个层次清晰,功能完善的后台数据库结构。
    首先在设计数据库时要分离各个实体和表,一个实体对应一个表;同时,要明确各实体间的关联,明确各实体的属性,以便确定它的字段。下面从实际需求的角度来说明本系统的数据库的结构设计。

    系统实体分析:系统的实体包括以下几个部分:消费者、商品、网站、其他
    实体产生的行为 :实体的行为包括消费者注册成为会员、会员登录、会员资料修改、会员购商品;商品类别、商品资料;网站资料、网站修改布局、网站新闻管理;会员区域管理、配送和支付方式、其他信息管理

    在实体的行为中,有许多的数据关联性,如购买商品的记录中有商品信息,有会员的注册资料等等,这些行为的关联性,是我们在设计数据库结构中要注意的问题。
    3.3 平台功能分析网上购物系统平台主要包括四大功能模块,用户管理、网站布局、管理员管理、搜索等功能模块。其中用户管理模块,主要包括用户注册、用户修改、用户删除等功能;管理员管理主要包括商品资料(添加大类、添加小类、商品添加、商品审查)、商品交易、会员管理、操作管理(管理员添加、管理员审查、管理员退出)等功能;搜索主要包括(商品名称、商品类别)。
    网上购物系统平台总体模块,如图3.1所示。

    3.4 数据库分析3.4.1 ER图分析建立各表间的关系,除有利于进行连接查询外,还可以大大简化数据库的操作,从而提高工作效率。同时,由于各表间的相互关系的存在,使各表间实施了完整性的原则,可以避免一些误操作。通过建立各表间的关系,就可以有效地管理各表的记录。
    用户与管理员关系如图3.2所示。

    管理员实体如图3.3所示。

    出版单位资料实体如图3.4所示。

    送货方式类型实体如图3.5所示。

    商品小类实体如图3.6所示。

    商品大类实体如图3.7所示。

    3.4.2 数据库表分析根据上面实体和产生的行为,从实际需要出发,同时又考虑各实体间的联系和统一性,设计出如下各表。
    商品表主要是用于存储商品的基本信息,如商品的名称、商品的价格、商品的类型等,如表3.1所示。



    字段名称
    数据类型
    说明




    ID
    INTEGER
    商品ID号(主键)


    GOOD_NAME
    VARCHAR(45)
    商品名称


    GOOD_PRICE
    DOUBLE
    商品价格


    GOOD_TYPE
    VARCHAR(45)
    类型


    GOOD_PUBLISHTIME
    VARCHAR(45)
    发布时间


    GOOD_BUYCOUNT
    INTEGER
    购买次数


    GOOD_READCOUNT
    INTEGER
    查询次数


    GOOD_PUBLISHER
    VARCHAR(45)
    发布者


    GOOD_COMMENDED
    INTEGER
    是否为推荐商品


    GOOD_PRICESPE
    INTEGER
    是否为特价商品


    GOOD_DESC
    VARCHAR(200)
    描述


    GOOD_TOP
    INTEGER
    是否为精品



    商品类型表主要是用于保存商品的类型,如商品的ID、商品的类型名、以及商品的日期,如表3.2所示。



    字段名称
    数据类型
    说明




    ID
    INTEGER
    商品类型ID


    TYPE_NAME
    VARCHAR(45)
    商品类型名


    TYPE_TIME
    VARCHAR(45)
    添加商品日期



    订单表主要是用于保存用户的购物信息,如订单的ID、购买数量、商品的价格等,如表3.3所示。



    字段名称
    数据类型
    说明




    ID
    INTEGER
    订单ID(主键)


    GOOD_ID
    INTEGER
    商品ID


    GOOD_NUM
    INTEGER
    该商品购买数量


    GOOD_PRICE
    DOUBLE
    商品价格


    GOOD_PAYMENT
    DOUBLE
    支付的金额


    GUESTRNAME
    VARCHAR(45)
    页数


    GUEST_PROVINCE
    VARCHAR(45)
    所在省份


    PAY_Y
    INTEGER
    是否付款


    AUDITING
    INTEGER
    是否审核


    SELLED
    INTEGER
    是否卖出


    AUDITING_TIME
    VARCHAR(45)
    审核时间


    USER_ID
    INTEGER
    用户的id


    SHOP_TIME
    VARCHAR(45)
    购物的时间


    GOOD_NAME
    VARCHAR(45)
    商品名称



    用户表主要是用于保存普通用户和管理员的信息,如用户的ID、用户的名称、用户的密码、注册的时间等,如表3.4所示。



    字段名称
    数据类型
    说明




    ID
    INTEGER
    用户ID(主键)


    USER_NAME
    VARCHAR(45)
    用户名称


    USER_PSW
    VARCHAR(45)
    用户密码


    USER_TIME
    VARCHAR(45)
    注册时间


    USER_EMAIL
    VARCHAR(45)
    邮箱


    USER_LOGINCOUNT
    INTEGER
    登陆次数


    USER_LASTLOGINTIME
    VARCHAR(45)
    最后登陆时间


    USER_LEVER
    INTEGER
    用户级别



    第4章 商城前台设计与实现网站的整个前台部分是供消费者浏览、选购的部分,一个好的网站的前台部分一定非常精美,非常有条理,因此,前台的设计主要把握3点:简明扼要、条理清晰、层次分明。下面将一一介绍我的网站系统的前台部分的实现。
    4.1 通用文件设计这里所说的通用文件是指在开发系统页面中,经常会使用到的文件。本系统包括了下面两个通用文件,分别是系统头文件和数据库连接文件。
    4.1.1 系统头文件系统的头文件被放置在整个网页的顶部,它的主要功能是导航。通过头文件的链接,可以很方便、快捷地进入其他页面。此外,由于它的位置突出,也放置一些重要的提示信息,如目前用户的状态,是否有未处理的订单等。头文件的设计尽量以简单、实用为主。
    头文件由网站的logo、用户功能区、快速导航条、用户当前状态组成。
    需要说明的是:当用户还没有登录时,在状态区中将显示请“登录”状态;如果用户已经注册登录了,在状态区中将显示该用户的会员名,并显示该会员的未处理订单的数目。
    在用户状态区中,主要是通过response对象的cookies集合将用户登录时的数据信息,存储到内存变量中,根据这一变量信息来识别用户是否登录。
    4.1.2 数据库连接文件为了使每个网页都能方便的访问到数据库,要先建立一个数据库连接文件。此文件由DataConnect类实现。这是一个功能性文件,主要作用是连接服务器中的数据库,凡要调用数据库的地方,现在就可以直接引用它了。
    4.2 首页设计首页模块包括3个主要的部分,采用内嵌框架技术。首页中的系统头文件,现在只要用包含文件的方式调用就可以了。网站首页如图4.1所示。

    下面介绍首页当中的其他两部分的设计。
    首页正文部分的实现
    首页的正文部分是网站的主干,它是首页的核心所在,本系统的正文部分有两个新商品展示区组成,新商品展示区主要是推荐新商品,可以单独用商品封面或纯文字的方式,也可以图文并茂的方式来推荐。一般按商品的类别分区推荐。先放置本类的重点商品,后推荐同类相关的商品。
    设置商品展示时,首先通过在数据库中找有推荐标志的某种商品,将它的封面和商品相关信息以图文并茂的方式在同一行显示出来,做为重点推荐商品,然后,设置其他相关的商品信息链接。设计时商品的封面与商品名的设计,用循环语句来显示相关类别的商品。
    首页中间部分
    首页中间部分内嵌一个页面,将这个部分作为mainFrame,这个部分主要是帮助用户查询想要购买的商品,当会员没有注册时也可以查询商品,这是为了方便用户查看是否有要购买的商品,当用户查找到自己想要购买的商品时,当用户单击购买时系统将自动检测用户是否登录系统,如果没有登录系统将提示用户没有登录并弹出登录对画框,登录成功后方可购买商品。商品查询方式采用的是模糊查询如图4.2所示。

    4.3 网站会员设计会员是构成网站主体的一个重要组成部分,网站设置会员块的目的之一在于方便网站信息的管理,尤其是商务网站,获取了注册会员的资料信息,才能根据这些信息进行按单发货、资料统计、地区整理的工作。因此,将会员作为模块来划分是很有必要的。
    所谓的会员模块,是指包含会员注册和各项操作在内的活动集合体。下面分析这流程中需要实现的个模块和实现的功能。
    4.3.1 会员注册与登录首先,是会员注册和资料的登记,这两个界面比较简单。在成为会员之前要进行注册。注册时,有注册条款的阅读,确定后进入简单的信息登记。在注册信息登记中,先判断用户名是否重复。并且对输入的E-mail的格式进行检查,输入不正确时,要重新输入。同时,系统会验证前后输入的密码是否一样。此外,对必须登记的项目,要填写,否则不能注册成功。显示的注册条约是在后台已经设置好的,打开数据库就可以读取了。接受用户提交的信息后,先根据用户名打开数据库中的会员信息表,查询该用户名是否已经存在。然后通过使用JavaScript脚本语言编写的check函数对输入的其他信息进行判断,根据不同的情况出现不同的提示,直至正确。最后,将提交的信息写入数据库。值得注意的是:通过一个变量,保存用户的注册时间段,可以限制用户在短时间内多次重复注册。这些功能的实现主要由注册文件reg.java完成。如图4.3所示。

    其次,是登录界面,注册成功后的用户在下次进入时,需要进行登录,其主要功能就是识别是否是注册会员。会员登录主要由两个文件组成:一个是界面设计文件,一个是检测用户名文件。前者是设计页面,后者是纯数据查询功能文件。本系统中,他们分别为类logins.java和checkuser.java文件。
    单击“登录”按钮后,先通过用JavaScript编写的函数checkuu()来检测是否输入了用户名和密码,如果没有输入,便锁定相应的文本框进行输入。确定输入完成以后,将输入表单中接受的信息,提交给文件控制层,由它查询该用户是否存在于数据库中的会员资料表中,如果存在便进入相应的界面,否则出现相应的提示。登录界面是由文件user.jsp实现的。
    在将表单信息提交给文件checkusers.java处理时,先由函数checkuu()检测提交的信息是否完整。同时,控制字体“正在登录……”字样的显示,也是在该文件中通过visibility属性的设置来实现的。函数checkuu()的是用JavaScript脚本语言来编写的。通过函数checkuu()检测无误后,将表单提交的信息转给文件checkusers.java来处理,该文件根据获取的信息,在数据库会员信息表中查询获得的用户名,并作相应的处理。当用户登录成功后系统会记录本次登录的信息,包括登录时间,登录次数等等,如图4.4所示。

    4.3.2 会员信息管理上面讲述的都是有关注册和登录的实现过程,当会员登录完成后,就可以进行相关的操作,如进入“我的帐户登录”,查看相关的信息。在进入“我的帐户”前,系统会自动检测该用户是否登录。
    该页是由过程login()实现的,把一些常用的界面,写成子过程,既方便其他页面调用,又利于以后的程序修改和维护,其过程实现的方法和前面讲述的系统登录时的方法一样,它也是将获得的表单信息提交给文件chkuser.java,由它检测用户名,确定是否登录。
    当会员登录“我的帐户”后,便进入帐户主界面,该页面展示当前网站销售量和人气都是最好的十本商品,会员可以单击商品名查看商品详情,也可以直接点击“购买”图标,将商品放入购物车中。
    “我的帐户”的主界面是由过程userziliao()完成的。这一过程的实现主要根据数据库中商品信息表的商品销量字段进行排序,同时,设置查看商品详细信息和购买商品的链接。
    4.4 会员购物设计在会员模块中,除可以查看和修改个人的资料信息,还可以购买网站中的产品。由于商业网站的主要业务是销售产品,因此将介绍的会员购物模块也是网上商城系统的关键部分,经过设计,会员在购买商品时包括以下几个模块。

    购物车模块:用于保存会员选购的商品
    收货人信息编辑模块:用于会员修改自己的收货资料、收货方式、支付方式的操作
    生成并显示订单模块:在会员确定购买后,生成订单,并将订单信息显示在页面中,如图4.5所示


    4.4.1 购物车设计会员登录后,在页面的任何一个地方,单击“购买”链接,就可以将对应的商品放入购物车,购物车的作用是暂时存放读者选中的商品,并显示相应的产品信息。
    将选购商品放入购物车中,是由文件add_bk.java和文件show_cart.java共同完成的。前者是一个纯功能性文件,在会员单击“购买”链接时,获得该商品的ID号,并根据ID号查询商品的其他信息,一起保存到数组变量Session中。 当文件add_bk.java执行完将购物信息写入Session数组变量后,便转向由文件show_cart.java完成购买商品信息显示页面。在该文件中,调出保存商品信息的数组变量Session,并通过循环句While…Wend将保存信息中购买商品数不为零的信息,显示出来,同时设置修改数量、取消、收藏商品的链接等,如图4.6所示。

    4.4.2 个人信息设计当会员在购物车中确定好选购的商品品种和数量后,单击“去下订单”按钮时,便进入确定购物信息和个人信息的页面,如果会员在注册时,没有登记个人详细的收货信息,便进入个人信息的录入页面;如果录入完成或注册时就已经填写了详细的收货信息,则显示全部个人信息,并提供修改信息的链接。
    在会员购物车中单击“购买”按钮后,将出现会员商品信息和个人信息确定页面,该页面用于显示会员购买商品的全部信息,包括商品信息、个人资料信息、送货方式、支付方式,这时还没有生成订单,用户还可以取消订单,也就是说,只要不单击“生成订单”按钮,就不会生成订单。
    显示购买商品全部信息的界面是由文件orderedit.java实现的。为了更加合理地处理页面中各项数据的修改和更新,我们将各项功能模块分别写成不同的过程,保存在文件cartfunction.java中,并将该文件包含在orderedit.java文件中,当需要实现哪项功能时,只要调用该项功能的过程就可以了。
    在调用各过程,实现各功能前,还要在文件orderedit.java中,编写JavaScript函数,用于响应列表框中选项改变和单击选项事件。
    4.5 生成订单当用户单击“生成订单”按钮后,将自动生成订单并显示出来。在生成的订单中,除了显示会员收货信息和购物商品信息外,还有会员购商品汇款时的网络帐号。
    单击“生成订单”按钮后,则将表单的信息和Session数组变量保存的信息全部写入数据库,生成订单;并通过生成订单表和多表联合查询。共同显示整个生成的订单的全部信息。
    4.5.1 查看生成订单本系统中不仅在生成订单时,显示订单信息,而且还可以在“我的帐户”中查看历史订单,删除订单和修改订单的进程状态。会员在前台修改订单状态后,后台网站管理人员就可以查看到,同时,后台人员也可以修改订单的状态,并将状态信息反馈给会员,从而使整个订单的进程很透明,便于信息的交流。
    当在“我的帐户”中的订单信息管理栏中单击某订单的“查看”链接后,便获取该订单的订单号,并将订单号提交给文件dingdang.java,由该文件获取订单号后查询相关信息,并将结果显示在页面中。
    第5章 商城后台设计与实现此章将介绍网上商城后台管理的设计,前台功能的实现都离不开后台各项数据的录入和设置。可以说整个系统的执行是从后台开始的如:要显示商品,需要从后台录入商品资料等等。整个后台系统流程如图5.1所示。

    5.1 后台登录界面和主页面界面设计为了确保后台数据的安全性,进入后台系统时,必须先登录,才能进入。此外,按用户名登录后台系统还可以识别管理人员的权限,从而依据权限进行相应的操作。
    登录成功后,管理人员便进入后台系统的主要界面,该主页界面包括两部分:一是系统操作导航菜单,二是本系统的名字。下面分别介绍他们的实现方法。
    5.1.1 登录界面的设计此登录界面的设计方法很简单,和普通的登录界面一样,用于对操作人员登录时的身份验证。主要由两个文件组成。一是设计界面的文件,主要功能是接收用户输入的信息,如:姓名、密码。另外一个是实现登录功能的文件,主要作用是在数据库的相关表中查找用户名和密码信息,找到则进入后台主页,找不到则出现错误提示信息。
    该界面是由JAVA文件实现的。在文件中,建立一个表单,供用户登录时输入用户名和密码,并将接受的信息转给JAVA文件来处理。
    在提交信息之前,先通过函数lg_check()对输入表单的信息是否完整进行检测。函数lg_check()是用JavaScript脚本语言编写的。
    在确认提交的信息完整后,表单将信息提交给文件chkadmin.JAVA,该文件接受表单信息后,根据用户名查询数据库中的记录,找到记录后,核对用户名是否与密码相符,如果无误则进入后台系统主页,否则出现错误信息提示。
    5.1.2 后台主页的设计在设计后台主页时,由于整个后台系统以管理信息为主,因此,在界面设计上尽量简洁,以方便操作为主。此系统的后台管理主页是由一个框架结构构成的,当用户单击导航菜单链接时,右边的框架中将显示相应的界面。
    后台主页是由JAVA文件实现的。在文件中用框架结构的方式调用文件完成。在后台主页面的左边框架中,是文件menu.java实现的菜单导航页面,该文件中使用JavaScript脚本语言编写了2个函数,第一个是直接用于图象和文字的显示;第二个用于单击后,展开导航菜单,然后,再向函数中输入实参,实现主页左边部分的界面设计。
    5.2 订单信息查看会员在前台下订单购买商品,后台的管理人员通过查看订单信息才能给会员配货发商品。因此,查看商品订单信息是后台管理系统的一重要内容,它可以在第一时间查看到新增的购商品订单,并根据订单的内容,进行配商品;同时,还可以通过查看或修改会员订单进程状态,来反馈订单的进程。
    后台订单处理流程图,如图5.2所示。

    在订单信息查看页面,除可以分页浏览订单大致内容外,还可以单击订单号查看订单的详细内容,同时,还可以通过用户名来查询该用户的所有订单信息。
    查看订单信息的功能是由文件editdingdan.java完成的。在该文件中,使用多表连接显示订单信息,用Select case语句查询不同进程状态的订单信息。通过在数据库的相关表中搜索用户名字段,实现按用户名查询订单信息的功能。
    5.3 管理员模块管理员是本系统的重要组成部分,普通会员登录后可以选择购买商品、查看购物车情况、查看购物明细,还可以修改购买商品的数量以及支付费用情况等操作而管理员登录系统后可以进行推荐商品、删除商品、设置商品级别、是不是特价商品等一系列操作如图5.3所示。

    如果商城新进了一些商品管理员登录系统后可以对该商品进行添加操作,如图5.4所示。

    5.4 类别资料管理将商品分类,是录入商品前首先要做的一项工作。只有进行了很细致的分类,才能便于商品的录入与以后的商品管理。此系统将商品分为两类:大类和小类,其中大类中包括所有的小类,小类是大类的子类。
    5.4.1 商品大类商品大类将列出商品的整体类别范畴,然后,再由商品的大类,衍生出大类中的小类,从而完成商品的类别划分。在商品大类管理页面中,可以浏览所有的商品类别,并能增加新的大类,还可以对原有的类别进行修改和删除。同时,可以控制某一类别是否出现在前台的类别区。
    商品大类管理界面是由文件anclass.java完成的,在文件中,先将大类界面分为两个部分,左边部分用于修改和删除已经有的大类名称和排序号。右边部分用于增加新的大类名称。两个部分设置两个表单,用于操作人员输入信息。
    在商品大类管理界面中,单击页面左边部分的“修改”按钮,则向文件saveanclass.java提交表单信息,该文件接受信息后,根据接收的action值和信息的ID号,更新信息的内容。
    在商品大类管理界面中,单击页面左边部分的“删除”按钮,则向文件saveanclass.java提交表单信息,该文件接受信息后,删除相应ID号的信息。
    单击页面右边部分的“增加”按钮,则向文件saveanclass.java提交表单信息,该文件接受信息后,将信息写入数据库,完成增加大类的功能。
    5.4.2 商品小类在设置完商品大类后,接下来就是根据商品的大类来划分相应的小类。在设置商品小类页面中,可以根据商品大类增加小类,并对已经有的小类进行修改或者删除。同时,还可以实现某一小类在大类间的移动以及控制各小类间的排列顺序。
    商品小类的管理的界面是由文件nclass.java实现的。在浏览或增加小类时,必须先选择小类所属于的大类,选择并进入某一大类后,页面的左边显示该大类的所有小类,并可以对它们修改或删除,在页面的右边可以增加该大类的小类。
    在进入某大类商品的小类页面后,单击页面左边的小类“修改”按钮,在将表单信息提交处理前,先通过函数checkxl(),检测提交信息的完整性,该函数是使用JavaScript脚本语言编写的。在确定增加或修改的大类中的小类信息无误后,便将该表单的信息提交给文件savenclass.java,该文件接受提交的信息,打开数据库记录,增加或更新该小类信息。
    单击页面左边的小类“删除”按钮,便将该表单的信息提交给文件savenclass.java,该文件接受提交的信息,根据提交的信息ID号,删除相关记录。
    5.5 出版单位资料管理任何商品,都有出版单位,我们在录入商品资料时,都要填写。为方便录入,先将出版单位的资料输入数据库中,在录入商品资料时,通过列表框,显示全部的出版社,只要进行选择就可以了。这样可以大大提高工作效率,并且保障数据间的完整性、统一性。
    在出版单位资料管理页面中,分页显示所有已经增加的出版单位,并可以对它们进行修改或删除,同时,还可以新增出版单位和查询出版单位。
    在实现的界面中,由查询、编辑、增加三部分组成,每部分都是在文件中设置表单,并将表单信息提交给文件自身,自身在接受提交来的信息后,先根据变量action的值,来判断是哪部分提交来的信息,然后,根据变量action的值,执行相应的语句。
    出版单位资料管理流程图如图5.5所示。

    在出版单位管理页面中,输入要查询的出版单位名称,单击“查询”按钮后,便通过设置的表单,将输入的查询字符和action的值,提交给文件本身,此时,文件本身接受到的action值是chekpubkey,根据这一值执行响应的程序功能。
    无论是在出版单位管理页面,还是在查询结果页面中,单击“确认”按钮后,都会将出版单位的ID号和action的值通过表单提交给文件本身,文件根据ID号,打开相应的数据库记录,并用接收的值,更新原记录。
    输入完要增加的出版单位信息后,单击“添加”按钮,先通过表单将要增加的信息提交给文件本身,然后,将信息写入数据库中。
    在出版单位管理或查询结果页面中,单击“删除”链接,可以将选中的出版单位记录从数据库中删除,由于删除后不能恢复,因此,删除记录应谨慎。
    5.6 商品资料管理输入商品资料,是后台管理系统的一项日常的工作。所有在前台销售的商品资料,都是通过后台输入的,可见这一功能的重要性。考虑到它的重要性和录入时需要很多详细的信息,我们把商品资料管理分为三个部分:第一部分浏览商品资料,第二部分增加商品资料,第三部分修改原有的商品资料。
    5.6.1 浏览商品资料该页面以分页浏览的方式查看全部的商品资料信息,并可以查询某一种商品的详细资料信息。同时还可以对不需要的商品资料,选中后删除。商品管理流程图如图5.6所示。

    浏览商品的功能是由文件managebook.java实现的。在文件中,先调出数据库中的shop_books表,分页显示;当查询某一商品时,通过向表单提交关键字信息和查询方式,然后,根据这两个条件在数据库表中找到相匹配的记录,调用显示内容过程showcontent显示出来;删除记录时,通过获取打勾选项的ID号来实现删除功能。
    5.6.2 增加商品资料增加商品资料,对于网上商城系统来说,是后台中用的最多的一项,因为每天都会有大量的商品资料录入数据库中,来丰富网站的产品。
    在增加新的商品资料记录时,在列表框中选择已经分类的类别信息,用户只要选择大类,属于这一大类的小类就出现在小类栏中,这样既方便了录入数据库时的操作,又保证了数据的完整性、统一性。
    实现商品大类和小类相互关联的主要思路是:先将全部的商品类别保留在一个数组中,然后,通过商品大类列表框选项的改变事件,获取大类ID号,根据ID号将数组中对应的小类ID号和名称赋值给小类列表框,从而实现大类改变,小类也相应变化的功能。
    当录入新商品时,只要对出版单位进行选择,无须填写,可以提高工作效率,设置文本框,单击它时,出现下拉的列表框,显示全部的出版单位名称,选中选项后,下拉列表框自动隐藏。
    文本框下面的列表框初始时是隐藏的,当单击文本框时,列表框才出现;选中选项后,将列表框的值赋值给文本框,同时列表框自动隐藏,控制是否隐藏是通过列表框的属性style的display的值来实现的。
    5.6.3 修改商品资料当商品录入完成,写入数据库后,还可以对它进行修改。对原有商品资料的修改,也是商品资料管理的一部分。通过对商品信息的修改,可以很方便地改变折扣、封面,避免了重新录入的麻烦,在浏览商品信息时,单击“商品名”便可以进入该商品的修改状态。其界面和增加商品的界面差不多。
    5.7 网站人员的管理为确保后台数据系统的安全,进入后台系统必须先登录才能进行操作。因此,首先要在数据库中增加人员记录并设置权限,操作人员依据用户名和密码进入后台系统,在自己的权限内进行操作。
    需要说明的是:只有具备了管理权限的人员,才能添加、修改、删除网站内容,其他后台人员和不具备这项权限的操作人员,只能修改自己的密码。
    网站人员管理是一个集增加、修改、删除为一体的综合管理模块。通过这一模块,管理人员完成对所有网站人员的管理。当然只有具备管理权限的人员才能进行这些操作。
    填写用户名和密码设置权限后,单击“添加” 按钮,便将信息提交给文件savemin.java,它是来完成增加新人员的功能;单击“修改”链接,便获得该人员的ID号,在数据库中找到相应记录,显示在界面右边。修改完成后,单击“保存”按钮,还是将信息提交给文件saveadmin.java由它来完成修改操作。删除功能和修改实现方法一样。
    第6章 系统测试6.1 测试目的与目标在此系统进行初步实现之后,开始进行对系统进行测试,找出系统中存在的Bug,通过测试,用提交的Bug报告来为以后软件的改进提供标准和参考,能够在以后的系统改进中找到依据。测试后的软件各模块基本功能能顺利进行,尽可能的提高软件的健壮性。
    6.2 测试方法系统的测试有两种方法分别为黑盒测试和白盒测试。
    黑盒测试又称为功能测试,在程序接口进行,只检查程序功能是否能够按照规格说明书的规定正确使用,程序是否能适当地接收输入数据并发生正确的输出信息,而且要能够保持外部信息的完整性。
    白盒测试又叫结构测试,完全了解程序的结构和处理过程,这种方法按照程序内部的逻辑测试程序,检验程序中每条通路是否都能按照预定要求正确工作。
    本系统开发过程进行的测试步骤如下:
    模块测试:也叫单元测试,目的是保证每一个模块作为一个单元能正确运行,本测试所发现的往往是编码和详细设计的错误,主要评价模块的下述五个特点:模块接口,局部数据结构,重要的执行路径,出错处理通路,影响上述各方面特性的边界条件。模块测试主要由代码审查和软件测试两部分组成。
    集成测试:包括系统测试和子系统测试。集成测试是组装软件的系统技术,主要目标是发现与接口有关的问题。集成测试有两种方法:非渐增式和渐增式,但比较而言,渐增式方法比较好,因为:编写的测试软件较少,开销较小;较早地发现模块间的接口错误;错误位置容易判断;测试更彻底。因此,本系统集成测试采用渐增式测试中的混合法,即对软件结构中较上层使用自顶而下的测试方法,而对软件结构中较下层,使用的是自底向上方法,两者结合,这是对模块较多时测试的一种折衷方法。
    验收测试:这一步是验证软件的有效性。目的是向未来的用户表明系统能够象预定的那样工作,验收测试一般使用黑盒测试法,验收测试有两种可能的结果:功能和特性与用户的要求有差距;功能和性能与用户要求一致,软件是可以接受的。
    这个阶段发现的问题往往和需求分析阶段的差距有关。平行运行。所谓平行运行就是同时运行。新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。目的有:可以在准生产环境中运行新系统而有不冒风险;用户能有一段熟悉新系统的时间;可以验证用户指南和使用手册之类的文档;能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。
    6.3 测试用例本系统采用黑盒测试,设计测试方案是测试阶段的关键技术问题。所谓测试方案包括预定要测试的功能。应该输入的测试数据和预期的结果,目标是设计一组可能发现错误的数据。本系统中应用了如下测试方案:基本用到逻辑覆盖;语句覆盖;判断覆盖;条件覆盖;判定/条件覆盖;条件组合覆盖;点边路径覆盖,由于功能模块较多,测试内容篇幅较长,所以在本论文中只介绍登入系统的测试用例,表6.1是本系统会员登入的测试表,从测试的结果来看与期望结果完全相同。

    功能特性:会员登录验证
    测试目的:验证是否输入合法的信息
    测试数据:会员ID:1111 密码:1111




    测试内容
    操作描述
    数据
    期望结果
    实际结果
    测试状态




    1
    输入会员ID,按“登陆”按钮。
    会员ID:1111, 密码为空
    显示警告信息“用户名或密码误!”
    显示警告信息“用户名或密码误!”
    与期望结果相同


    2
    输入密码,按“登陆”按钮。
    会员ID为空,密码:1111
    显示警告信息“用户名或密码误!”
    显示警告信息“用户名或密码误!”
    与期望结果相同


    3
    输入会员ID和密码,按“登陆”按钮。
    会员ID:1, 密 码:1
    显示警告信息“用户名或密码误!”
    显示警告信息“用户名或密码误”
    与期望结果相同


    4
    输入会员ID和密码,按“登陆”按钮。
    用户名:1111,密 码:1111
    正确登入到会员操作界面
    正确登入到会员操作界面
    与期望结果相同



    6.4 测试结论把开始的代码写得越好,它出现的错误也就越少,你也就越能相信所做过的测试是彻底的。系统化测试以一种有序方式设法探测潜在的麻烦位置。同样,毛病最可能出现在边界,这可以通过手工的或者程序的方式检查。自动进行测试是最理想的,用得越多越好,因为机器不会犯错误、不会疲劳、不会用臆想某此实际无法工作的东西能行来欺骗自己。回归测试检查一个程序是否能产生与它们过去相同的输出。在做了小改变之后就测试是一种好技术,能帮助我们将出现问题的范围局部化,因为新问题一般就出现在新代码里面。
    测试和排错常常被说成是一个阶段,实际上它们根本不是同一件事。简单地说,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,为设法打败它而进行的一整套确定的系统化的试验。
    Edsger Dijkstra有一个非常有名的说法:测试能够说明程序中有错误,但却不能说明其中没有错误。他的希望是,程序可以通过某种构造过程正确地做出来,这样就不再会有错误了,因此测试也就不必要了。这确实是个美好生活的目标,但是,对今天的实际程序而言,这仍然还只是一个理想。所以应该集中精力讨论如何测试,如何才能够更快地发现程序错误,如何才可以使得工作更有成效、效率更高。
    参考文献[1] 孙晓龙,赵莉.JSP动态网站技术入门与提高.北京:人民邮电出版社,2001
    [2] 石志国,薛为民,董洁.JSP应用教程.北京:清华大学出版社.北京交通大学出版社,2004
    [3] 李曙光.JSP开发实例完全剖析.北京:中国电力出版社,2006
    [4] 杨易.JSP高级程序设计.人民邮电出版社,2006
    [5] Vivek Chopra.JSP高级程序设计,机械工业出版社,2001
    [6] 申吉红,廖学峰,余健.JSP课程设计案例精编.北京:清华大学出版社,2007
    [7] 卢潇.软件工程.北京:清华大学出版社;北京交通大学出版社,2005
    [8] 萨师煊,王姗.数据库系统概论.北京:高等教育出版社,2000
    [9] 马运涛.Eclipse精要与高级开发技术.北京:电子工业出版社,2003
    [10] PaulJPerrone etal,张志伟,谭郁松,张明杰.J2EE构建企业系统[M] .北京:清华大学出版社,2001
    [11] Chuck Cavaness.Programming Jakarta Struts,2002
    [12] Bruce Shive.Research Direction in Object-Oriented Programming,2002
    [13] Miao H.K.McDermid J.A.andTony Ian,Proving the existence of the initial state in Z specification,Chinese Journal of Advanced Software Research,2003
    [14] Apache Software.The Struts User’s Guide.http://Jakarta.Apache.org/struts.
    [15] Breitbart Y,Garofalakis M,Martin C,etal.Topology discovery in heterogeneous IP networks[M].Proc of INFOCOM 2000,Telaviv Isreal,2005
    15 评论 401 下载 2020-08-04 12:30:30 下载需要11点积分
  • 基于Jsp和MySQL的网上宠物商城系统

    1 系统简介1.1 系统开发介绍随着人们日常生活的丰富多彩,人们对新事物的不断追求,使得各种各样的个性宠物不断出现。宠物市场上还出现了,例如蜥蜴、变色龙、蛇、蜘蛛、蜈蚣、老鼠等与我们日常生活中或惯常思维所理解的宠物不一样的“另类宠物”,不断满足着人们喂宠物的需要。当然,随着这一发展驱趋势,提供给人们各个种类宠物的宠物店则如雨后春笋般涌现。
    本宠物店网上商城系统为顾客和卖家提供了一个电子商务交易平台,普通用户购买下单,管理员可进行后台管理。
    宠物店网上商城在设计过程中利用JavaWeb技术,数据库技术运行需求、价格等发布与收集,方便宠物店销售管理,增进顾客关系,改善顾客服务,开拓销售渠道等,最终方便管理以及扩大销售。
    1.2 系统具体功能本系统用户分为普通用户和管理员两类,下面是具体功能需求:

    普通用户

    登录、注册功能浏览宠物功能搜索宠物功能添加宠物到购物车购买功能(在商品详情页单独购买或在购物车批量购买,购买后自动生成相应订单)查看订单状态(可以查看物流信息)付款功能(线上支付)确认收货功能评价已购买商品功能(确认收货后方可评价)
    管理员

    登陆功能添加、查看、修改、删除用户信息功能添加、查看、修改、删除商品信息功能确认、查看、修改、删除、添加订单发货功能(发布已发货信息)

    2 功能描述和模块设计2.1 功能描述2.1.1 用户部分用户可以注册一个账号,填写自己相关的信息,然后进入登录页面,进行登录,在主页可以浏览并选择自己喜欢的商品,也可以通过具体分区浏览宠物或宠物用品,还可以在导航栏搜索自己心仪的商品。在选择好自己想要的商品时,可以进入商品详情页浏览商品的具体情况,通过下方的加入购物车按钮加入购物车,在购物车勾选自己想要的宠物或商品后,可以购买,等商品收到之后可以点击确认收货按钮进行收货确认。
    2.1.2 管理员部分管理员可以管理用户信息,修改或删除用户信息,维护商品或宠物信息,并进行订单的管理和发货的确认。
    2.2 模块设计
    3 主要代码清单3.1 主界面
    主要代码
    Controller:取得所有宠物和商品信息。
    @RequestMapping(value = "/getAllCommodity")@ResponseBodypublic Map<String,Object> getAllCommodity(){ List commodityList=commodityService.getAllCommodity(); //alibaba fastjson把jsonArray转成string String all= JSONArray.toJSONString(commodityList); Map<String,Object> resultMap=new HashMap<String ,Object>(); resultMap.put("all",all); return resultMap;}
    Service:从数据库获取所有宠物和用品的信息并被controller调用。
    @Overridepublic List getAllCommodity() { List allCommodity=new ArrayList(); List petList=petService.getAllPets(); List productList=productService.getAllProduct(); allCommodity.add(petList); allCommodity.add(productList); return allCommodity;}
    3.2 登录界面
    主要代码
    @RequestMapping(value = "/doLogin",method= RequestMethod.POST)@ResponseBody public Map<String,Object> doLogin(String email, String password, HttpSession httpSession) { System.out.println("我接收到了登录请求" + email + " " + password); String result = "fail"; User user = userService.getUserByEmail(email); if (user == null) result = "unexist"; else { if (user.getPassword().equals(password)) { result = "success"; httpSession.setAttribute("currentUser", user); } else result = "wrong"; } Map<String, Object> resultMap = new HashMap<String, Object >();// System.out.println("result from controller:"+result); resultMap.put("result", result); return resultMap; }
    3.3 注册界面
    主要代码
    User user=userService.getUserByEmail(email);if(user!=null) result="emailExist";else{ User u=new User(); u.setName(name); u.setEmail(email); u.setPassword(password); u.setPhone(phone); u.setRole(0); u.setSex(gender); Date date=new Date(); SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd"); u.setCreateTime(sf.format(date)); userService.addUser(u); result="success";}
    3.4 搜索界面
    主要代码
    在petMapper里定义的方法:
    List<Pet> selectByKeyWord(String keyword);
    对应的mapper.xml定义响应的模糊查询语句:
    <select id="selectByKeyWord" parameterType="java.lang.String" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from pet <where> <if test="_parameter != null"> AND key_word LIKE concat(concat('%',#{key_word}),'%') </if> </where></select>
    在service里调用以上方法:
    @Overridepublic List<Pet> getPetsByKeyWord(String searchKeyWord) { return petMapper.selectByKeyWord(searchKeyWord);}
    3.5 宠物详情页
    主要代码
    Controller拦截getPetDetail路径,并设置当前商品的信息到session:
    @RequestMapping(value = "/getPetDetail")@ResponseBodypublic Map<String,Object> getPetDetail(Integer id,HttpSession httpSession){ System.out.println("拦截到petDetail请求 id:"+id); Map<String,Object> resultMap=new HashMap<String, Object>(); Pet pet =petService.getPet(id); petService.updatePet(pet); System.out.println("pet:"+pet.getName()); httpSession.setAttribute("currentCommodity",pet); resultMap.put("result","success"); return resultMap;}
    Service在数据库查找相应数据:
    @Overridepublic Pet getPet(int id) { return petMapper.selectByPrimaryKey(id);}
    3.6 宠物展示页
    主要代码
    service:
    @Overridepublic List<Pet> getAllPets() { PetExample pe=new PetExample(); PetExample.Criteria pec=pe.createCriteria(); pec.andIdIsNotNull(); pec.andNameIsNotNull(); pe.setOrderByClause("id asc"); return petMapper.selectByExample(pe);}
    controller:
    @RequestMapping(value = "/getAllPets")@ResponseBodypublic Map<String,Object> getAllPets(){ List pet_list=petService.getAllPets(); String all_pet=JSONArray.toJSONString(pet_list); Map<String,Object> resultMap=new HashMap<String ,Object>(); resultMap.put("all_pet",all_pet); return resultMap;}
    3.7 购物车页
    主要代码
    @Overridepublic ShoppingCar getShoppingCar(int userId, int productId) { ShoppingCarKey key=new ShoppingCarKey(); key.setUserId(userId); key.setProductId(productId); return shoppingCarMapper.selectByPrimaryKey(key);}@Overridepublic void addShoppingCar(ShoppingCar shoppingCar) { shoppingCarMapper.insertSelective(shoppingCar);}@Overridepublic boolean deleteShoppingCar(int userId, int productId) { ShoppingCarKey key=new ShoppingCarKey(); key.setUserId(userId); key.setProductId(productId); return shoppingCarMapper.deleteByPrimaryKey(key)>0;}@Overridepublic boolean updateShoppingCar(ShoppingCar shoppingCar) { return shoppingCarMapper.updateByPrimaryKey(shoppingCar)>0;}@Overridepublic List<ShoppingCar> getShoppingCars(int userId) { ShoppingCarExample example=new ShoppingCarExample(); ShoppingCarExample.Criteria scec=example.createCriteria(); scec.andUserIdIsNotNull(); return shoppingCarMapper.selectByExample(example);}
    3.8 订单页
    主要代码
    @Overridepublic ShoppingRecord getShoppingRecord(int userId, int Id, String time) { ShoppingRecordKey key=new ShoppingRecordKey(); key.setUserId(userId); key.setProductId(Id); key.setTime(time); return shoppingRecordMapper.selectByPrimaryKey(key);}
    3.9 404页
    3.10 管理员管理订单页
    主要代码
    @Overridepublic void addShoppingRecord(ShoppingRecord shoppingRecord) { shoppingRecordMapper.insert(shoppingRecord);}@Overridepublic boolean deleteShoppingRecord(int userId, int Id) { ShoppingRecordKey key=new ShoppingRecordKey(); key.setUserId(userId); key.setProductId(Id); return shoppingRecordMapper.deleteByPrimaryKey(key)>0;}@Overridepublic List<ShoppingRecord> getAllShoppingRecords() { ShoppingRecordExample example=new ShoppingRecordExample(); ShoppingRecordExample.Criteria srec=example.createCriteria(); srec.andUserIdIsNotNull(); return shoppingRecordMapper.selectByExample(example);}@Overridepublic List<ShoppingRecord> getShoppingRecordsByOrderStatus(int orderStatus) { ShoppingRecordExample example=new ShoppingRecordExample(); ShoppingRecordExample.Criteria srec=example.createCriteria(); srec.andOrderStatusIsNotNull(); srec.andOrderStatusEqualTo(orderStatus); example.setOrderByClause("orderStatus asc"); return shoppingRecordMapper.selectByExample(example);}
    3.11 管理员管理用户页
    主要代码
    @RequestMapping(value = "/updateUser") @ResponseBody public Map<String,Object> updateUser(int id,String name,String sex,String email,String phone,String password,int role){//<th>姓名</th> <th>性别</th> <th>地址</th> <th>电话</th> <th>密码</th> <th>角色</th> User user=userService.getUser(id); user.setName(name); user.setSex(sex); user.setEmail(email); user.setPhone(phone); user.setPassword(password); user.setRole(role); userService.updateUser(user); Map<String,Object> resultMap=new HashMap<String ,Object>(); resultMap.put("result","success"); return resultMap; } @RequestMapping(value = "/deleteUser") @ResponseBody public Map<String,Object> deleteUser(int id){ userService.deleteUser(id); Map<String,Object> resultMap=new HashMap<String ,Object>(); resultMap.put("result","success"); return resultMap; }
    3.12 管理员管理商品页
    主要代码
    @Overridepublic void addCommodity(int id, int type) { Commodity c=new Commodity(); c.setId(id); c.setType(type); commodityMapper.insert(c);}@Overridepublic boolean deleteCommodity(int id) { return commodityMapper.deleteByPrimaryKey(id)>0;}@Overridepublic boolean updateCommodity(int id, int type) { Commodity c=new Commodity(); c.setId(id); c.setType(type); return commodityMapper.updateByPrimaryKey(c)>0;}
    3.13 帮助界面
    主要代码
    @RequestMapping(value = "/contact")public String contact(){ System.out.println("拦截到contact请求"); return "contact";}
    3.14 修改个人信息界面
    主要代码
    @Overridepublic void addUser(User user) { userMapper.insertSelective(user);}@Overridepublic boolean deleteUser(int id) { return userMapper.deleteByPrimaryKey(id)>0;}@Overridepublic boolean updateUser(User user) { return userMapper.updateByPrimaryKeySelective(user)>0;}@Overridepublic List<User> getAllUser() { UserExample example=new UserExample(); UserExample.Criteria criteria=example.createCriteria(); criteria.andIdIsNotNull(); example.setOrderByClause("id asc"); List<User>list=userMapper.selectByExample(example); return list;}
    3.15 用户确认订单页
    主要代码
    public List<ShoppingRecord> getShoppingRecordsByOrderStatus(int orderStatus) { ShoppingRecordExample example=new ShoppingRecordExample(); ShoppingRecordExample.Criteria srec=example.createCriteria(); srec.andOrderStatusIsNotNull(); srec.andOrderStatusEqualTo(orderStatus); example.setOrderByClause("orderStatus asc"); return shoppingRecordMapper.selectByExample(example);}
    4 系统运行与测试4.1 用户浏览购买商品流程用户登录

    选择风来克磨牙咬胶加入购物车

    加入购物车成功

    购物车显示添加成功的商品

    勾选并结算,跳转到订单页面

    订单页面显示商品未发货

    4.2 管理员处理订单流程管理员登录

    显示管理员菜单

    管理员进入发货管理界面

    管理员进行发货处理,商品属性变成已发货

    4.3 管理员管理用户流程进入用户数据库页

    修改用户属性

    修改成功

    点击删除按钮,删除用户,显示删除like用户成功

    5 总结通过这次实训,我掌握了基本Spring+SpringMVC+MyBatis框架的运用,并学会了使用Maven工具管理我的项目,还使用当前流行的SemanticUI制作我的页面,使用GitHub管理我项目的版本和介绍,并熟悉了MVC的设计流程。虽然现在看上去这个系统还有很多功能没有完善,但是在项目初期的确遇到了很多的困难,就光是spring的配置文件都让我配了好几天,还有各种系统的bug,前后端传输数据时的问题,还好现在都让我一一解决了。
    在这次做这个系统的过程中,我逐渐掌握了设计一个系统的方法,很多东西并不是像它看上去那么简单,数据库也并不只是一个简简单单的存储数据的工具,要把数据合理有效的存取并遵守一定的规范是个很复杂又很精细的问题,它涉及到整个系统的流程运作和数据定义,使用等方面的东西,一旦设计错,后面再改就是个很麻烦的事情了。
    7 评论 55 下载 2020-11-21 09:39:51 下载需要10点积分
显示 60 到 75 ,共 15 条
eject