分类

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

资源列表

  • 基于SSH和MySQL实现的BBS论坛系统

    摘 要此在线论坛系统是一个基于浏览器和服务器架构模式的论坛系统,主要是实现论坛用户在论坛里面所提出的论题和回答的功能。
    此论坛系统采用MySQL5.5数据库作为存储,编程采用Java语言,采用ssh框架。在myeclipse环境下来运行实现后台代码,并且结合网页前端技术利用jsp页面来实现后台数据与前端数据的互动,让后台数据能够在前台页面以具体化的数字展现。
    论坛系统是伴随着互联网大潮而产生的产物,随着信息时代的飞速发展,各大应用软件以及各大系统层出不穷。由此可预知的是:论坛系统将有着广阔的前景及光明的未来。论坛系统能激发人们的讨论兴趣,让广大的注册用户参与到某个论题的讨论中来。随着时间推移,注册用户也必将水涨船高,此系统的重要性和可行性也能进一步得到充分证实。
    得益于互联网的飞速发展。寄生于互联网的论坛系统正赶上了当红的时代。论坛系统有着庞大的用户群体以及良好的网络技术服务支撑,伴随着互联网的发展,论坛系统也必将有一个美好的未来。
    一、开发背景在日益信息化的二十一世纪,热衷于“网上冲浪”的网民们,当被各种层出不穷的应用程序充斥着我们的手机的时候,不仅仅只是局限于社交媒体、视频游戏等方面的需求。有时候也需要一个软件系统能够给网民们提供一个各抒己见的平台。当发生了某种事情或者是出现了某个问题引发了人们的广泛讨论的时候,就需要有一个系统来满足人们的这种需求。
    设计开发实现一个在线论坛系统,能够较好的满足人们的这种需求。当社会上出现了事情的时候人们能够第一时间在此论坛上进行广泛的讨论。大家都能够针对这件事件各抒己见发表不同的看法。“一石激起千层浪”此系统充分利用了人们喜欢发表不同看法的特点。在法律许可范围内,所有用户的回复都将被展示出来给大众看。在观看回复的同时也可以发表你自己的观点。踊跃参与到论坛讨论中来。当你有什么问题或想法的时候,也可以发个帖子出来看看大家的观点。这样自己也不至于是指没头的苍蝇到处乱撞。可以得到较高的认同感和存在感。提升自己的获得感。
    此论坛系统的开发是切合实际的。存在着大量的潜在用户,是个大众所喜闻乐见的系统。开发此系统的意义大、可行性高。
    二、需求分析2.1 用户基本需求描述
    游客

    注册功能:游客可以通过注册成为注册用户查询:游客可以根据关键字查询论坛里相关的论题回帖:游客可以回答论题,但是不能进行投票和获得积分
    注册用户:注册用户可以在登录系统之后,除了可以像游客一样具有基本的查询和回帖功能以外,还可以对自己的论题进行相应的管理。具体包括:

    提问功能:用户可以提出自己的论题,设置截题时间以及回帖奖励的积分值等信息;也可以选择是否主动截题(主动截题方式如上所述)回答功能:用户可以回答别人的论题,从而获得积分,也可以为别人的回答或论题投票(赞同或反对)积分获得功能:用户可以通过回复别人的论题或为别人的论题(或回答)投票而获得相应的积分奖励,具体的奖励额由发帖人设置积分分配功能:用户可以设置回答自己论题的用户可以获得的积分值、投票自己论题或回答的用户可以获得的积分值、设为最佳答案的回复者可以获得的积分值等信息查询功能:用户可以查询自己的论题、回答过的论题以及自己的注册信息(可修改),积分信息等数据

    版主:版主除了具有注册用户的所有功能以外,还具有论题维护功能:可以查询所有的论题,并删除部分论题(包括内容审核不合格或截题超过三个月的论题)
    2.2 数据流图分析此论坛系统的顶层图如图2.2.1所示:

    此论坛系统的0层图如图2.2.2所示:

    2.3 数据字典由以上的数据流图分析后可得,此论坛系统的数据流入下表2.3.1所示。



    数据流名称
    数据流别名
    说明
    数据流来源
    数据流去向
    数据流组成




    用户登录信息
    登录信息
    用户的登录信息
    用户
    用户登录信息处理
    用户表=用户名+密码


    用户操作信息
    操作信息
    用户的操作信息
    用户
    用户操作信息的处理
    帖子表=帖子ID+帖子发布者+标题 回复表=回复帖子ID+回贴人ID


    相关消息
    相关消息
    返回相关消息
    帖子表、回复表
    客户
    操作信息


    用户操作信息

    管理员对用户的操作信息
    管理员
    用户表
    用户表=用户状态+ID+权限


    帖子操作信息

    对帖子的操作信息
    管理员
    帖子表
    帖子表=帖子ID+帖子发布者+标题


    论坛操作信息

    关于论坛模块的操作
    管理员
    模块类别表
    模块类别表=id+模块名



    数据项条目如下表2.3.2所示:



    数据项名称
    数据项别名
    说明
    类型
    长度




    用户ID
    Id
    论坛系统客户的唯一标识
    int



    用户名
    uesrname
    论坛系统的登录名
    varchar
    20


    密码
    password
    论坛系统的登录密码
    varchar
    20


    性别
    Sex
    用户性别
    varchar
    2


    积分
    integer
    系统的用户积分
    Int
    11



    数据存储条目如下表2.3.3所示:



    数据储存条目
    别名
    简述
    组成
    组成方式
    查询方式




    用户表

    存放所有用户信息
    用户表=用户ID+性别+用户名+密码
    索引文件,以用户ID为关键字
    要求能立即查询


    帖子表

    存放所有帖子信息
    帖子表=帖子ID+内容+标题+发布时间+评论数
    索引文件,以帖子ID为关键字
    要求能立即查询


    回复表

    存放所有帖子评论信息
    回复表=回复ID+回复内容+回复时间
    索引文件,以回复ID为关键字
    要求能立即查询


    板块类别表

    存放所有论坛的模块
    板块类别表=板块类别ID+板块名称
    索引文件,以类别ID为关键字
    要求能立即查询



    加工条目如下表2.3.4所示:



    加工名
    激发条件
    优先级
    输入
    输出




    用户登录信息
    登录时
    普通
    用户名密码
    登入是否成功


    用户操作信息
    用户需要进行任何操作时
    普通
    操作指令
    是否操作成功


    相关消息
    用户完成操作指令时
    普通

    操作返回消息


    用户操作信息
    管理员需要对用户进行操作
    普通
    操作信息
    返回是否操作成功


    帖子操作信息
    对帖子进行任何操作
    普通
    对帖子的操作信息
    返回操作信息


    论坛操作信息
    对论坛版块进行操作
    普通
    对论坛版块进行新增或修改
    返回操作是否成功



    三、详细设计3.1 概念模型设计概念模型设计既为系统的E-R图设计。经过设计分析,此论坛系统的E-R图由一个总体的E-R图表示即可。此系统的总体E-R图如下图3.1所示:

    3.2 关系模型设计由上E-R图可将此论坛系统的概念模型转化为具体的关系模型。根据分析,共分为3个关系,具体如下所示:

    用户(用户id、用户名、昵称、密码、总积分、论坛等级、评论总数、发帖总数)外键为论坛等级
    论题(论题id、用户id、论题内容、论题标题、赠予积分) 外键为用户id
    回答(回答id、用户id、论题id、回答内容) 外键为用户id,论题id
    帖子板块(板块id、板块名字、板块论题总数、板块论题回复总数、论题id)论题id为外键
    论题等级(等级id、论坛等级)

    3.3 物理模型设计用户表t-user



    字段名
    字段类型
    说明
    备注




    id
    Int(11)
    用户id
    主键


    username
    Varchar(20)
    用户名



    password
    Varchar(20)
    用户密码



    Integral
    Int(11)
    用户的总积分



    grade_integal
    Int(11)
    用户论坛等级
    默认为1


    nickname
    Varchar(32)
    用户昵称



    topic_count
    Int(11)
    发帖总数



    comment_count
    Int(11)
    评论总数




    论题表t-topic



    字段名
    字段类型
    说明
    备注




    id
    Int(11)
    论题id
    主键


    Title
    Varchar(50)
    论题标题



    Content
    longtext
    论题内容



    Topics_user_id
    Int(11)
    用户id
    外键


    Integral
    Int(11)
    发帖用户设置赠予积分




    回答表t_comment



    字段名
    字段类型
    说明
    备注




    Comment_id
    Int(11)
    回答id
    主键


    comment_user_id
    Int(11)
    用户id
    外键


    Comment_topics_id
    Int(11)
    论题id
    外键


    content
    longtext
    回答内容




    帖子板块表t_category



    字段名
    字段类型
    说明
    备注




    Id
    Int(11)
    帖子板块id
    主键


    name
    Varchar(30)
    帖子板块名字



    count_topics
    Int(11)
    记录板块论题数



    count_comments
    Int(11)
    记录板块回复数



    Count_topics_id
    Int(11)
    论题id
    外键



    用户论题等级表t_grade



    字段名
    字段类型
    说明
    备注




    Id
    Int(11)
    论坛等级
    主键,从1自增长


    Honor
    Varchar(30)
    论坛等级




    四、系统功能模块说明4.1 用户管理模块此模块的主要功能是提供接口给首次进入该论坛的“游客”提供注册服务以及论坛合法用户的登录功能。在论坛下提出论题、查看论题、回答别人的论题都需要先进行登录。如果没有合法身份,则需要先进行注册。论坛的用户可以根据积分分为不同的等级。
    4.2 用户回答模块此模块的主要功能是实现论坛的合法用户回答论题的功能。用户可以在论坛中相对应的论题下发表回答来讨论该论题。如果该回答被论题的提问者赞成,则可获得大量的积分,提升论坛等级。
    4.3 用户发帖模块此模块的主要功能是实现论坛系统用户的发帖功能。用户编辑相对应的标题和内容并且选择模块和子模块进行发帖。发帖的时候可以设置赠与积分。发帖者和论坛其它的合法用户都可对该论题进行回答。用户需手动对该论题进行结贴,结贴的时候可以对回复的用户分配相对应的积分。
    4.4 个人中心模块此模块的主要功能是实现注册用户在此论坛系统中的个人信息有关功能。用户可以在个人中心中看到自己的注册时信息、论坛积分、论坛等级。还可以看到自己的发的帖子和评论。同时,也可以在个人中心模块修改资料和修改密码。
    4.5 版主管理模块此模块的主要功能是实现该论坛系统版主身份的管理功能。当版主登录到该系统后,既可开始对用户的管理(包括对用户禁止发帖和回答以及解除禁止发帖回复状态)和对帖子的管理(查看帖子状态、对帖子推荐为精品贴、删除一些内容不够健康的帖子)。
    五、系统实现5.1 项目结构图
    5.2 论坛系统主界面无论身份是游客还是系统的注册用户,刚打开此论坛系统网站进入该系统的时候,系统总是显示此主界面。论坛系统的主界面如下图5.2所示:

    5.3 游客注册界面当游客进入该论坛系统后,可选择进行用户注册,游客注册界面如下图5.3所示:

    5.4 注册用户登录界面当游客注册成功取得合法身份后,即可在主界面选择注册用户登录。注册用户登录界面如下图5.4所示:

    5.5 用户发帖界面当注册用户成功登录到系统后,即可在此系统内选择发帖,选择帖子所对应的板块。发帖的同时也可以添加回复用户要赠予的积分。注册用户发帖的界面如下图5.5所示:

    5.6 用户发表回答界面用户成功登录此论坛系统后,在查看的论题下面即可发表想要发表的回答。用户发表回答的界面如下图5.6所示:

    5.7 管理员管理界面该模块分为用户管理、帖子管理等功能。当该系统的管理员登录到该系统后,可查看所有分类下的论题以及能查询所有论题。此外,管理员还可以根据需要对一些帖子就行删除、可对帖子进行推荐精品。管理员界面如下图5.6所示:

    5.8 个人中心界面用户成功登录系统后,既可点击论坛系统主界面左上方的“个人中心”查看自己的个人信息。包括注册时的信息(密码除外)还可以查看自己的积分情况以及帖子情况。个人中心界面如下图5.7所示:

    总 结经过此次论坛系统设计与实现的课程设计。使我们大大提高了对于《数据库原理与应用》这门课的认识,增强了自己对于数据库课程的学习深度。我们不仅仅只是学到了书本上那些理论知识。通过这次课程设计更让我们学会把书本上那些理论性的知识和现实充分结合起来一起解决现实世界中所面临的问题。真正实现了“学有所用”。
    在前期的设计阶段,我们犯了把业务模型写入到E-R图中的原则性错误。还好我们及时请教老师,在老师的指导下我们迷途知返,及时的把这个错误给纠正了过来。使得我们驶入了正确的方向。在后期的实现阶段,要求实现设置论题最后的截题时间以及论坛用户可以为自己提出以外的论题进行投票这两个功能。由于道行不深,学艺不精。经过多方面的尝试最后还是没有做出来。后面还有一大堆的功能也在赶着我们继续往后面走。所以我们只能先搁置了起来。最后出来的这个成品。不管是前端页面的还是后台Java数据都和我们想象中的有着一定的差距。也有点不尽如人意的感觉。在我们努力下系统也喜欢一言不合就出现各种毛病,辛辛苦苦敲出来的代码到最后确是运行不了或者是报错。我们三个相互鼓励着前进。内心深处那坚定的信念让我们克服了各种现实中的和心理上的困难,最终把这个项目给做了出来。
    通过此次论坛系统的课程设计,大大提高了我们的动手能力,让我们学会了把知识和理论相结合。在开发过程中,小组成员之间互帮互助,互相加油鼓劲。极大的提高了我们的团队合作精神。有了这次论坛系统课程设计的经验使我们对于以后的学习和工作中所碰到的相关问题都有了一定的经验,丰富了自己的知识面。同时,此系统的成功开发也一定程度上提高了我们的成就感。虽然还有些功能没有完善,有些地方也值得进一步去优化,在学习上深知我们的不足。在以后的学习生活中我们一定更加努力。将把这段课程设计时间的良好品质弘扬下去。向着更好的自己而努力前行!
    参考文献[1] 李春葆.数据库原理与技术[M].清华大学出版社.2015
    [2] 王珊,萨师煊.数据库系统概论(第五版)[M].高等教育出版社.2014
    [3] 明日科技.My SQL从入门到精通[M].清华大学出版社.2017
    [4] 陈慧贞.网页程序设计(第四版)[M].清华大学出版社.2015
    [5] 传智播客高教产品研发部.Java web程序开发入门[M].清华大学出版社.2015
    [6] 张芳芳,候俊杰.css web开发学习实录[M].清华大学出版社.2011
    [7] 张海藩,牟永敏.软件工程导论(第六版)[M].清华大学出版社.2013
    [8] 黑马程序员.java基础入门(第二版)[M].清华大学出版社.2018
    [9] 传智播客高教产品研发部.ssh框架整合实战教程[M].清华大学出版社.2015
    1 评论 35 下载 2020-08-05 10:47:59 下载需要15点积分
  • 基于PHP的网上购物系统设计与实现

    摘 要随着Internet技术的发展,人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于Internet技术的发展,也将越来越数字化、网络化、电子化、虚拟化。电子商务也随着网络的发展日益和人们的生活贴近。Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。本设计尝试用PHP在网络上架构一个动态的网上商品购物网站,以使每一位顾客不用出门在家里就能够通过上网来轻松购物。
    本文详细介绍了基于PHP的网上购物系统的系统结构设计、实现方法和操作流程,并介绍了系统各个模块的主要功能和数据库设计及功能。该系统采用B/S结构,采用PHP技术进行动态窗体页面的设计。后台数据库选用MySQL 数据库。系统设计并实现了会员注册及登录模块,会员基本信息模块,会员购物模块,产品搜索模块,管理员商品管理模块,用户管理模块,订单管理模块,信息管理模块等一系列功能模块。最后,对网上购物系统进行了系统测试,各个模块功能运行良好。
    关键字:Internet,PHP,B/S,网上购物系统
    AbstractAlong with the development of internet technology, daily life can not go on without the network. The life and work of the social people of future will depend on the development of digital technology more and more , digitization, networking, electronization, virtual more and more. E-commerce presses close to people’s life day by day along with the development of network too.Developing course and present application state and development trend of Internet can believe network technology will change life and working way of us greatly, and even change the values of the society to some extent.This paper tries to build up a dynamic e-commerce website in the network with PHP, so that each customer needn’t go out and can do some shopping easily through internet at home 。
    This paper describes system structure design, implementation method and operation process based on PHP, and introduces main functions of various modules about the system and database design. The system uses B/S structure, and conducts design of dynamic form page by PHP technology. Background database selects MySQL database. System design realizes a series of function modules such as user registration and landing module, user basic information module, shopping module, searching goods module, the management of goods ,the management of user,the management of orders ,the management of news and so on. Finally, the paper tests Shopping Inline System, and the result finds that kinds of modules operate well.
    Keyword: Internet, PHP, B/S, e-Shopping
    1 绪论1.1 开发背景及意义电子商务是伴随着信息经济的脚步,在20世纪90年代兴起于美国、欧洲等发达国家的一个新概念。目前,国际上对电子商务尚无统一的定义。一般来说,狭义的概念是指在开放的国际互联网及其它网络的环境下,通过服务器的运用,实现消费者的网上购物、企业间商业交易的一种新型交易运营模式。即电子商务=Web(服务器)+IT(信息技术)+企业业务。
    电子商务的类型:从其交易对象来看,电子商务的应用包括企业与企业之间的电子商务 (B2B)、企业与消费者之间的电子商务(B2C)、企业与政府之间的电子商务 (B2G)、政府与消费者之间的电子商务(G2C)、企业内部的电子商务。
    电子商务的本质特点:电子商务的重点在于商务、电子商务的核心竞争力在于信息平台、电子商务的使命在于利用互联网技术对传统资源的整合。
    电子商务实现贸易的全球化、直接化、网络化,发展电子商务是不可阻挡的趋势,而我国的电子商务尚不完善。要实现全过程的电子商务,就要加快网络基础设施建设和网络互联,实现金融电子化及海关、税务、行政监管部门电子化,市场环境网上支付,建立安全体系认证结构,健全相关法律法规等等。
    1.2 国内外电子商务现状以下是根据CNNIC(中国互联网络信息中心)公布的中国B2C电子商务发展报告来进一步分析目前的网上购物的现状。(主要引用其中的分析图表)

    从上面的图可以看出网上购物选择节约时间和操作方便的分别占46.7%和44.2%,这说明随着生活节奏的加快,人们越来越希望拥有简单快捷的购物方式。

    从上面的图中可以看出人们总希望直接可以拿到物品,而不需要耽搁自己的时间,如果是送货上门,也可以当面检查所购的物品,这也表现出人们对厂商信誉的担忧。

    从上面的图中可以看出目前两个最严重的问题是安全性和产品服务。
    1.3 本文研究的内容本文详细介绍了基于PHP的网上购物系统的系统结构设计、实现方法和操作流程,并介绍了系统各个模块的主要功能和数据库设计及功能。该系统采用B/S结构,采用PHP技术进行动态窗体页面的设计。后台数据库选用MySQL 数据库。系统设计并实现了会员注册及登录模块,会员基本信息模块,会员购物模块,产品搜索模块,管理员商品管理模块,用户管理模块,订单管理模块等一系列功能模块。最后,对网上购物系统进行了系统测试,各个模块功能运行良好。
    1.4 开发可行性分析1.4.1 管理上的可行性把企业业务延伸到Internet上,建立电子商务网站,对运营商业企业来说,是企业对外展示信息,从事商务活动的窗口和界面。因此,高中层管理人员不会对此有很大的抵触情绪,主管领导也能够相应的支持。
    1.4.2 技术上的可行性根据系统目标需求分析得结果来看,不需要通过购买专业软件,仅采用phpStudyAdmin为开发环境,Apachec为服务器,选择PHP语言就可以解决相关的问题,从而保证系统功能的实现。
    1.4.3 经济上的可行性商业企业在运营过程中 ,经常会遇到产品的宣传受到限制,采购商或顾客只能通过上门咨询、电话沟通等方式进行各种信息的获取,受一定的时间与物理空间的局限并且成本较高。而本系统可以帮助企业正确认识电子商务技术在企业中的重要地位,以少量的时间和资金建立企业信息门户网站并架设一定范围的商务网络,以此来是企业与顾客间的经济活动变得更灵活、更主动。
    1.4.4 执行可行性本系统采用IE浏览界面,是大家熟悉的,对于用户只需要具有一般的计算机知识的人员都可以轻松上手。而且整个系统采用最友好的交互界面,简洁明了,不需要对数据库非常了解。因此,该系统的操作是可行的。
    2 系统需求分析2.1 目标和任务网上购物基于B/S模式, 通过对一些典型电子商务网站的考察、分析,并结合企业要求, 开发一套拥有前后台的信息化管理系统,需满足以下要求:

    统一友好的操作界面,保证系统的易用性
    商品分类详尽,可按不同类别查看商品信息
    为客户提供通过一个购物车模型就能够购买多个商品项的机制
    提供简单的安全模型,让客户必须先进行登录,才允许购买购物车的内容
    设计网站后台操作平台,管理网站的各项基本数据
    对不同的管理者设置不同的权限

    系统的主要任务有:

    处理对象:主要涉及的数据有:商品、顾客(会员)、顾客组、管理员(用户)、管理员组、订单、邮寄方式等
    处理功能要求:本系统完成商品、顾客(会员)、管理员(用户)、订单等之间的功能联系,形成一个有效的循环系统。具体包括以下几点:1,顾客注册为会员;2,管理员发布商品;3,订单管理;4,顾客组管理;5,管理员权限的管理等

    2.2 系统功能分析2.2.1 功能性需求概述在线购物系统是商家和购买者直接接触的桥梁,商家通过管理在线购物系统,向购买者发布、展示产品,而购买者也通过网站和商家交流、订购产品,从而达到现实交易的目的。
    在这个交易过程前,商家需要将产品信息录入,并且在前台显示出来,这其实就是一个信息发布系统,顾客在看到产品后,可能会有许多的问题,也就是需要针对产品留言,然后企业做出相应的回答,这个留言也属于信息发布的一部分。
    在交易过程中,顾客一般是不允许匿名购买的,顾客需要留下现实的个人信息才能收到现实中的产品,相信作为顾客,也很愿意方便线下联系。接着是在线模拟交易过程,顾客完成所有的选取后,就可以付账了,这里需要和支付网关连接。付账之后就是企业方通过后台的程序发现有新交易并进行线下处理。
    在交易完成后,企业方需要对近期销售情况进行统计,如会员资料的查询、修订等。
    通过对电子交易流程的划分,在线购物系统的系统功能主要由3部分组成:信息发布系统、会员管理系统和电子交易系统。电子商务的本质更趋向于电子交易,也就是前台和客户打交道的页面。
    通过细化系统功能,很明显电子交易部分是重点,电子交易页面需要完成哪些功能呢?
    逛在线购物系统和逛超市相似,进入超市时,顾客习惯拿购物筐或者购物车,再开始逛。逛超市时会不断查看想买的东西,直到确定买的那个产品的位置,在确定的过程中,会不断将其他物品放到购物车中,然后再将不适合的东西拿出,一直到结账。在选取物品时会发现,超市总是把相关的产品放在一个位置,以方便消费者,同时消费者也会拿出两个相同类型的东西进行比较。
    通过对超市购物的分析,了解了应该如何去模拟一个现实的交易过程。首先,需要一个产品的展示,方便顾客查询,还要有产品比较的数据,更有助于消费者比较,选择自己满意的产品;然后,要有一个购物车,方便顾客查看自己选中的产品,也可以把需要购买的产品放入购物车或者从购物车中拿出不需要的产品;最后是结账,和超市结账有很大区别,电子商务不允许匿名买卖。付账和收到产品之间有一个相对较长的时间,而且企业和顾客也不是面对面的,企业需要收集有效的信息,才能把产品送到顾客手中,所以结账时要确定用户是否登录,以收集用户的资料。
    通过以上分析可知,本系统分成两个模块:前台浏览模块和后台管理模块。
    前台浏览模块可再分为两个模块:产品浏览模块和购物模块,涉及产品首页浏览、推荐产品浏览、产品列表,以及查看产品详细内容、查看评论等功能。购物模块主要充当购物车作用,包括选取产品、对比产品、会员注册、登录及网上支付等功能。
    后台管理模块可分为3个模块:会员管理模块、产品管理模块和订单管理模块。后台管理模块主要涉及产品分类目录管理,以及产品内容的管理。会员管理模块主要是查看和修改,包括管理会员的基本资料以及购买的产品等详细信息。订单管理模块主要涉及对顾客订购的产品管理,按照订单的状态大致分为待处理的订单和已经处理的订单。

    2.2.2 系统流程分析在后台管理模块中,管理员需要先添加产品栏目分类,再进入产品列表页面,选择指定的产品栏目进行产品添加操作。在会员提交订单之后,管理员可以通过订单管理模块查看订单,并根据实际情况更改订单状态,管理员也可以通过会员管理模块查看会员信息。前台界面则是会员选取需要购买的商品,并提交订单。

    2.2.3 系统目录结构系统目录结构的规划非常重要,这样可以更加方便管理程序,体现出清晰的思路。通过对系统结构的分析,可以按照功能模块来划分系统目录结构。

    由图可以看出,系统文件保存在dzsw目录中,其下有13个子目录:admin目录主要保存后台管理的程序:data主要保存一些log信息,方便以后的查看:htmlarea目录保存文本编辑代码:includes目录保存公共模块中的代码,如MySQL连接之类的封装类等;install目录保存安装程序,方便把系统移植到其他的机器上,也方便初始化网站;js目录包括程序中需要使用的JavaScript程序;languages目录主要是为了界面的多国语言需要设计的,根据不同语言的需要调用不同的文件;modules目录保存连接支付网关的程序;myaccount目录保存关于本站的一些信息;styles目录保存网站的样式文件;templates目录保存模板文件;upload目录保存所有的上传文件,这个文件夹需要特别关照,在发布网站后,这个目录中的任何东西都是不能执行的,否则将产生隐患。
    2.3 数据库分析2.3.1 数据库需求分析数据库需求分析是所有数据库系统设计的最重要一步,在这个步骤里需要对系统的所有数据存储进行分析和整理,以便得出具有稳定性和扩展性的存储结构,这也是数据建模的过程。
    通过分析,不难得出主要有4个重要的实体对象,即产品分类存储表、产品内容存储表、订单存储表及会员存储表。 这4个表是在线购物系统的核心,所有的产品必须归属于某个类别,而这些产品分类的类别是不固定的,所以就需要一个分类存储表来存储产品的分类栏目。
    2.3.2 数据库概念结构设计根据以上对数据库的分析,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。这些实体包含各种具体信息,通过相互之间的作用形成数据的流动。
    下面是在线购物系统的E-R模型图。

    2.4 系统开发环境2.4.1 硬件平台系统所需的硬件平台:PⅡ以上的CPU,512M以上内存,硬盘80G以上,windows xp操作系统。
    2.4.2 服务器平台
    WWW服务器:Apache
    数据库软件:MYSQL

    2.4.3 开发工具开发工具使用:phpStudyAdmin
    2.4.4 技术构架系统采用B/S技术架构。
    2.6 数据字典2.6.1 数据元素
    名字:会员名称描述:顾客用来登陆网站的唯一标识数据类型:字符长度:96
    名字:产品ID描述:用来表示产品的唯一标识数据类型:整型长度:10
    名字:订单ID描述:用来表示顾客订单的唯一标识数据类型:整型长度:8
    名字:管理员ID描述:用来表示管理员的唯一标识数据类型:整型长度:4
    名字:邮寄方式ID描述:用来表示邮递的唯一标识数据类型:整型长度:8
    名字:顾客组ID描述:用来表示打折顾客组的唯一标识数据类型:整型长度:6

    2.6.2 数据存储
    名字:顾客信息描述:注册为会员的个人信息组成:自动编号ID,用户名(Email),密码,组名,消费金额,注册日期。
    名字:顾客组信息描述:存储顾客的打折优惠组成:自动编号,名称,折扣。
    名字:产品信息描述:发布的产品的信息描述组成:自动编号ID,产品名称,产品单位,产品价格,产品描述。
    名字:订单信息描述:会员发出订单的信息组成:自动编号ID,用户联系方式,订单内容,邮寄方式。
    名字:管理员信息描述:系统管理的信息组成:管理员ID,管理员名称,管理员类别,管理员密码。
    名字:邮寄方式信息描述:送货方式信息组成:方式编号ID,名称,费用。

    3 系统概要设计3.1 系统结构设计系统结构设计是结构化系统分析与结构化程序设计之间的接口。结构化系统设计运用了一套标准的设计准则工具,采用模块化方法进行新系统层次关系和模块分解设计,结构化系统设计的核心是模块分解设计,其基本思想是以系统的逻辑功能设计和数据流关系为基础,根据数据流程图和数据字典,借助于一套标准的设计准则和图表工具,通过“自上而下”的逐层分解,把系统划分为多个大小适当、功能明确、具有一定独立性、并易于实现的模块,从而把复杂系统设计转化为多个简单模块的设计。
    3.1.1 系统体系结构目前,Web项目较为流行的开发模式是三层逻辑体系结构,本系统的开发按照Windows DNA (Windows Distributed Internet Application,分布式互联网应用结构),采用基于XML的三层B/S体系结构。Windows DNA提供了一种开发三层结构Web应用程序的通用方法是一个电子商务开发的良好环境。
    MVC的设计思想简介,MVC的设计思想将平台划分为表现层、业务层、数据访问层、数据库层。
    表现层(Presentation Tier)对应于MVC的V(View),负责系统的表示逻辑,主要是每个.php 页面。
    业务层(Business Tier)体现系统的业务逻辑。业务层起到了Business Delegate的作用,屏蔽了表示层,有利于重用业务模型。
    数据访问/集成层(Data Access/Integration Tier)负责进行数据访问及系统间交互操作。数据访问组件负责与关系型数据库打交道,进行具体的增删改查(CRUD)操作。系统集成代理/适配器组件负责与软件产品和外部系统打交道,交换数据和消息。数据访问/集成层组件意识不到业务层的具体逻辑,通过约定的接口让业务层来调用。
    MVC三层逻辑体系结构如图3-1所示。

    3.1.2 系统总体功能结构根据系统分析的结果数据流程图所描述的系统的逻辑模型,把数据流程图上各个处理模块进一步分解,确定系统的层次结构关系,把逻辑模型变为物理模型。
    在管理信息系统的设计过程中,系统划分的一般原则如下:

    子系统要具有独立性,即应把相对独立的事务处理过程作为一个子系统。这样的子系统具有较高的内聚性,与其它的藕合较弱,便于软件开发、使用及日后系统维护
    子系统的划分结果应使数据冗余度较小,应避免部分数据在多个子系统中出现,尤其是修改,以保证系统的安全性、可靠性和数据的一致性
    子系统的划分应能满足目前和日后管理上的需要,功能应齐全,操作要方便且为今后发展留有接口
    子系统的划分应以该单位的管理职能为依据,应尽量避免过分依赖于组织机构,以防止机构变更后为系统带来不必要的麻烦

    从公司的组织结构上出发,把整个管理信息系统划分成多个子系统。每个子系统的功能相对独立,但是子系统之间有必要的数据联系。
    对电子购物商城系统的数据流图采用变换中心法和事务中心法进行分析,对其逐步进行功能分解,直到分解成为含义明确、功能单一的单元功能模块,从而得到系统的功能模块结构图,即系统的功能图。如图3-2,反映了电子购物商城的系统功能模块的划分。

    1、前台模块详细功能描述其中,用户信息管理以及订单和购物车是禁止匿名用户访问的内容。

    商品信息模块:商品浏览(首页显示部分普通商品列表)、特价商品浏览(首页显示特价商品列表)、商品分类浏览、商品详细信息
    购物车模块:添加商品到购物车、购物车信息修改、结账
    用户信息管理模块:注册新用户、登录、用户修改密码、用户个人资料管理
    订单模块:查询个人订单列表、查询某笔订单的详细信息、取消订单

    2、后台模块详细功能描述
    管理员信息管理:管理员登录、添加新管理员、删除管理员、修改密码
    商品信息管理:添加新商品、修改商品信息、删除商品
    订单管理:管理订单是否确认、是否付款、是否发货、是否归档,并且对相应信息进行查询

    3.1.3 系统总体物理结构电子购物各个部门在不同的地点办公,网络拓扑结构以交换机为基础,各部门通过主交换机连接到公司主服务器,电子购物有不同办公地点。根据这个特点,系统利用微机局域网作为系统的基本物理结构。为了提高系统的可靠性和可扩展性,网络采用以网络集线器为基础,以双绞线为传输介质的星型结构。在每个业务发生点以及每个管理员分别配制微型计算机作为系统结点工作站,系统功能的实现,子系统间的数据共享与交互通过网络服务器完成。电子购物的系统网络拓扑图如图3.3所示。

    系统具体物理配置如下:
    利用公司已经架设好的企业局域网,主服务器采用:服务器、交换机、网络集线器,传输介质采用10M屏蔽双绞线为介质的星型网络拓扑结构,服务器作为系统功能实现和数据共享中心,应具有较好的性能和可靠性。在此基础上再配上一台提供web服务的服务器和一台MYSQL数据库服务器即可实现对本系统的全部物理支持。
    系统具体硬件配置如下:

    WWW服务器:INTER P4 2.4 512M DDR ROM 80GB 硬盘
    数据库服务器:INTER P4 2.4 512M DDR ROM 80GB 硬盘
    客户机:目前流行的PC兼容机
    网络连接设备:路由器、交换机、打印机、扫描仪等

    系统具体软件配置如下:

    操作系统:Microsoft公司Windown2000Server,网络协议采用TCP/IP协议
    WWW服务器:Apache
    数据库软件:MYSQL

    3.2 数据库结构设计3.2.1 数据库概念结构设计根据需求分析中的结果,数据库的关系模型设计如下:

    会员(顾客ID,顾客名称,顾客组,消费金额,注册日期,联系方式)
    产品(产品编号,产品名称,售价,数量,图片,备注)
    管理员(管理员编号,密码,管理员组)
    订单(编号,顾客名称,内容,备注)
    顾客组(ID,类别,名称,折扣)
    管理员组(ID,类别,名称,权限)
    邮寄方式(ID ,名称,费用计算)

    3.2.2 数据库逻辑设计经过需求分析,概念结构设计,了解了系统的存储结构需求后,可以得出8个表结构,即顾客组设置表、顾客表、产品评论表、产品列表、订单表和邮递方式表、管理员表、管理员组表。
    顾客组设置表是为了存储顾客的打折优惠,这里记录的事组的打折信息。表结构如表3-1所示。
    顾客组设置表(usergroups)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Groupid
    自动编号
    Smallint(6)





    2
    Classes
    类型
    Varchar(30)





    3
    Grouptitle
    组名称
    Varchar(30)





    4
    groupdiscount
    折扣
    float


    0



    顾客信息表主要是记录顾客的详细信息,其中groupid是指定顾客组的编号,用户的名称采用Email,记录用户的登录时间可以方便的查看最后的登录时间,这样有助于对客户的跟踪服务。表结构如表3-2所示。
    顾客信息表(customers)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Customers_id
    自动编号
    Smallint(6)





    2
    Email
    用户名称
    Varchar(30)





    3
    Grouid
    组名称
    Int(10)





    4
    Regdate
    注册时间
    Int(10)


    0


    5
    Lastvisit
    最后登录时间
    Int(10)


    0


    6
    Money
    消费总金额
    Decimal(15.2)


    0


    7
    QQ
    QQ联系方式
    Varchar(30)





    8
    msn
    msn联系方式
    Varchar(30)






    产品评论表主要是针对产品的评论信息,其中products_id就是产品的编号,date_add就是记录产品的添加时间,viewed是表示这条评论被浏览的次数。表结构如表3-3所示。
    产品分类表(classes)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    rid
    自动编号
    Mediumint(8)





    2
    Email
    用户名称
    Varchar(30)





    3
    Products_id
    产品 id
    Int(10)





    4
    review
    评论内容
    text


    0


    5
    Date_added
    添加时间
    Int(10)


    0


    6
    viewed
    被浏览次数
    Mediumint(8)


    0



    产品的信息列表记录的是产品的基础信息,包括产品的价格、重量、名称、所属分类、详细描述等字段。表结构如表3-4所示。
    产品表(products)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Products_id
    自动编号
    Mediumint(8)





    2
    Classes_id
    分类编号
    Mediumint(8)





    3
    name
    产品名称
    Varchar(64)





    4
    model
    产品单位
    Varchar(64)





    5
    image
    产品展示图片链接
    Varchar(64)





    6
    price
    产品价格
    Decimal(15.2)


    0


    7
    weight
    产品重量
    Decimal(5.2)


    0


    8
    description
    产品描述
    Text





    9
    manufacturer
    生产厂商
    Varchar(64)






    订单表主要记录的就是用户订单的详细信息,包括购买人、购买人的联系方式、产品的价格、邮寄方式等信息。由于每次用户可能会定购多种产品,所以订单将分成两个表来记录,一张用来记录联系信息,一张表用来记录联系信息和产品之间的关联。表结构如表3-5和表3-6所示。
    订单表联系信息(orders)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Order_id
    自动编号
    Mediumint(8)





    2
    D_name
    用户联系姓名
    Varchar(100)





    3
    cid
    会员id
    Int(10)





    4
    D_street_address
    会员地址
    Varchar(100)





    5
    D_tel_mobile
    会员联系方式
    Varchar(100)





    6
    Orders_status
    订单状态
    Varchar(100)





    7
    Shipping_method
    邮递方式
    Int(10)






    订单产品信息关联表(orders_products)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    opid
    自动编号
    Mediumint(8)





    2
    Orderd_id
    于orders表关联id
    Int(10)





    3
    Products_id
    产品关联id
    Int(10)





    4
    price
    产品价格
    Decimal(15.2)


    0


    5
    Final_price
    最终价格
    Decimal(15.2)


    0



    邮寄方式表主要是为计算邮寄费用产生的,不同的邮寄方式会带来不同的邮寄费用。表结构如表3-7所示。
    邮寄方式表(shipping)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    id
    自动编号
    Mediumint(8)





    2
    Shippingname
    费用名称
    varchar(200)





    3
    Fee
    费用计算公式
    Varchar(200)






    管理组设置表是为了存储管理员的不同管理权限。表结构如表3-8所示。
    管理组设置表(Admingroups)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    AdminGroupid
    自动编号
    Smallint(6)





    2
    Classes
    类型
    Varchar(30)





    3
    Grouptitle
    组名称
    Varchar(30)





    4
    Allow_class_see
    查看会员组
    float


    0


    5
    Allow_class_add
    添加会员组
    Int(10)


    0


    6
    Allow_class_delete
    删除会员组
    Int(10)


    0


    7
    Allow_product_see
    查看商品
    Int(10)


    0


    8
    Allow_product_edit
    编辑商品
    Int(10)


    0


    9
    Allow_product_add
    上传商品
    Int(10)


    0


    10
    Allow_product_delete
    删除商品
    Int(10)


    0



    管理员信息表主要是记录管理员的信息。表结构如表3-9所示。
    管理员信息表(customers)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Admin_id
    自动编号
    Smallint(6)





    2
    name
    名称
    Varchar(30)





    3
    password
    密码
    Varchar(30)





    4
    admingroupsid
    管理组
    Varchar(30)





    5
    createdate
    创建时间
    Int(10)





    6
    lastvisit
    最后登录时间
    Int(10)






    4 系统详细设计4.1 系统设计在系统总体设计阶段已经提到过本系统采用MVC体系架构,但MVC架构具体是怎么实现的呢?下面我将介绍系统的具体实现功能。
    4.2 公共模块设计结构合理的系统都是经过改良的,将共同的东西取出来放置到相同的地方供引用和调用时设计系统必须要做的工作。
    4.2.1 数据库公共模块PHP中将创建数据库连接connection 独立出来做成公用的文件是最常用的做法,我将其命名为config.php,放置在include目录下。这个目录用来存储供整个系统公用的目录。当页面需要使用数据库连接时,只需要通过PHP的<? Require ‘include/db_mysql.php’;?>引用公用文件即可,这样不但避免了每个页面都编写数据连接,而且也能避免当数据连接发生变化时去修改每一个页面的麻烦。Db_mysql.php中使用了两种方式来获取与数据库连接:一种是获取已有的连接mysql_pconnect($dbuser,$dbpw),这样无须重复的建立连接,节约了资源:另外一种方式是mysql_connect($dbhost,$dbuser,$dbpw),这种方式是获取一个新的连接。在获取连接资源时,通常会传递3个参数,这里分别是$dbhost,$dbuser,$dbpw,代表的是带有端口号的主机地址,登录用户名和密码。
    Config.php中的定义代码如下所示:
    Define(‘DB_SERVER’,’localhost’);//数据库服务器Define(‘DB_SERVER_USERNAME’,’root’);//数据库用户名Define(‘DB_SERVER_PASSWORD’,’’);//数据库密码Define(‘DB_DATABASE’,’shoopdb’);//数据库名
    4.2.2 common.php和golbal.php单元Common.php是公共函数的文件,将公共函数独立出来可以大大节约编程时间及编程量,也为后期维护带来很大方便。
    Global文件是对全局变量的处理。
    4.3 产品模块设计4.3.1 产品类型设计产品一般有大类和小类之分,多级栏目使用树结构来展示。可以单击编辑和删除来修改。

    分类编辑修改分类名称和是否在页面显示。

    4.3.2 产品添加设计把产品作为一个类封装起来可方便对产品进行各种处理。Includes中的cla.products_p.php和cla.products.php文件就是对产品的封装。
    首先,添加产品的基本信息。

    添加完产品的基本信息后单击提交按钮,系统会向服务器端提交产品的基本信息,之后就会自动转向详细信息添加页面;如果添加产品基本信息不成功,将转向错误显示页面。
    完成提交后,程序会自动转向产品详细信息添加页面。该页面分为5个子页面。

    如添加错误可以修改。

    商品图片添加页面。

    4.3.3 产品信息查询查询页面可以通过商品名称、状态、基本信息、详细说明来查找产品信息。


    4.4 前台页面模块设计这里主要涉及产品的前台展示和购物车的编码制作等。
    4.4.1 首页设计作为在线购物系统,首要的任务是展示产品。除了展示产品,还可以加入其他元素来丰富页面。为了在有限的首页空间展示最吸引客户的信息,可把特价产品和新到产品的前5名展示在首页。

    在设置前台时,会把这些信息缓存起来,以方便再次调用此页面时不需要再次读取数据库,这样可以提高读取效率,也可以减轻服务器端的压力。Fun.common.php中的cacheexists($filename,$pam=‘’)函数就是用来验证是否在硬盘中有缓存,如果没有,将生成缓存文件。Cacheeesxists($filename,$pam=‘’)的实现代码如下所示:
    Function cacheexists($filename,$lpam=’’){ If($pam==’’){ $pam=$filename; } If(!file_exists(DIR_SHOOPD.”data/cache/cache_”.$filename.”.php”)){ Updataecache($pam); } Return DIR_SHOOPD.”data/cache/cache_”.$filename.”.php”;}
    4.4.2 产品详细信息用户在首页上看到感兴趣的产品后,对商品做进一步的了解。

    单击“您对此商品有话要说,您可以点击这里发表评论。”后就进入评论页面。可以看到URL http://127.0.0.1/dzsw/writerviems.php?products_id=23 ,这里是把商品的编号传递到评论页面,找到评论商品的ID。

    评论提交后,首先判断消费者是否已经登录,如果用户已经登录,需要把评论信息和会员昵称关联起来。需对Email进行验证,使用的是正则表达式。
    在添加评论之后返回商品展示页面,就可以看到针对商品的评论了。

    4.4.3 购物车设计购物车的实现流程:购物清单(购物车)->收货/送货人地址->选择送货方式->选择付款方式->确认并提交订单。
    购物车模块有两个链接,进入购物车和点击结账。“进入购物车”主要是显示已经放入购物车的详细信息,而“点击结账”的页面就是结账页面。

    4.4.4 结账处理单击购物车中的“结账”链接就可以进入结账页面。
    4.4.5 会员注册和登录页面设计注册会员需要填入会员的基本信息,这里的注册名是消费者的Email地址,用这个作为用户登录名的好处是可以强制性的让用户输入一个Email,而且Email地址是不会重复的。获取Email地址后,就可以通过这个Email地址给消费者发送订单处理等信息。在注册会员之后还需要让用户填入详细信息。

    将会员的详细信息和基本信息分开的好处是,用户在填入某信息出错时,只需要重复填入少量资料,避免了用户的麻烦。
    输入收货人地址后就是选择发送方式。

    在中国,一般提供了3种送货方式,即中国邮政的EMS、国内快递和普通快递。这3种方式的送货费用不同,计算方法为:产品的总重量*每公斤运送价格+其他固定费用。

    4.4.6 会员账户管理顾客在购买产品后,需要对自己的产品进行跟踪,需要知道自己购买产品的状态。

    4.5 订单管理模块设计订单分类,按照订单的状态分为:新订单、已审核订单、等待付款订单、部分付款订单、全部付款订单、已确认付款订单、取消订单等。

    4.6 会员管理模块设计会员管理模块是电子商务的最后一个模块。会员添加在前台已经完成,后台只需要一个浏览模块。

    还有一个会员组的选项,对于在线购物来说,打折时很有必要的,而打折方式是按照不同的会员组来设定的。

    5 系统测试5.1 系统测试5.1.1 测试的目的软件测试的目标和定义:

    测试是为了发现程序中的错误而执行程序的过程
    好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
    成功的测试是发现了至今为止尚未发现的错误的测试

    在对本网络书店销售管理系统测试时,也正是基于上述观点来进行的,测试的目的不是证明系统是完美的,而是发现问题,更好的解决问题,使系统不断完善,满足客户的需求。
    5.1.2 测试的准则为了能设计出行之有效的测试方案,必须深入理解并正确运用指导软件测试的基本准则。下面列举主要的测试准则:

    所有的测试都应该追溯到用户需求应该在开始测试之前就制定出测试计划
    把Pareto原理应用到软件测试中。Pareto原理说明,测试发现的错误中80%很可能是由程序中的20%模块造成的
    应该从“小模块”测试开始,并逐步进行“大模块”测试
    穷举测试是不可能的
    为了达到最佳的测试效果,应该由独立的第三方从事测试工作

    5.1.3 测试的方法测试任何产品都有两种方法:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能正常使用;如果知道了产品的内部工作过程,可以通过测试来检测产品内部动作是否按照说明书的规定正常工作。前一种称为黒盒测试又称功能测试,后一种方法称为白盒测试又称结构测试。
    在测试本系统时,采用的是黑盒测试来设计测试用例,而且在测试过程中,由于条件原因,不能完全按照测试规则由第三方来测试,测试过程和方案设计由作者完成。
    5.2 单元测试实例5.2.1 测试一在管理员登陆时,用户名或密码有一项为空或者填写错误,系统是否出现预先设定的操作提示。

    预期效果:输入错误及时报错
    具体操作:用户名、密码、任意一项为空或者填写有误
    结果:都出现相应的错误原因的信息提示
    结论:要求管理员必须填写正确的用户名和密码,才能进入管理页面,测试成功

    5.2.2 测试二发布产品或修改本站的公告﹑返回前台,看其是否更新成功。

    预期效果:发布和修改过后能及时更新内容
    具体操作:通过管理页面发布产品功能发布产品,修改公告功能修改公告的内容,看其是否发布修改成功
    结果:显示发布的新产品,公告内容更新为修改后的信息
    结论:发布产品,修改公告功能正常,测试成功

    5.2.3 测试三顾客浏览商品放入购物车后结账,如不登录能否提交订单。

    预期效果:该用户不能提交订单
    具体操作:前台顾客不登录提交订单
    结果:该订单无法提交,转入登录页面
    结论:购物车功能完善,测试成功。

    5.2.4 测试四顾客注册为新会员,注册号重复,密码没有6位。

    预期效果:注册失败,提示错误
    具体操作:注册号重复,密码设为5位
    结果:提示注册号已存在,密码至少6位
    结论:顾客注册功能正常,测试成功。

    5.2.5 测试五发货失败,取消订单。

    预期效果:顾客账户页面订单取消,已付款退回
    具体操作:在后台订单管理页面取消一已付款订单
    结果:前台会员账户页面显示订单取消,余额增加
    结论:订单功能正常,测试成功

    5.3 综合测试在以上测试的基础上,对系统功能进行了整体测试,依次检验系统功能是否符合系统开发的目标。经过使用大量的数据多次进行系统测试,发现系统存在的问题并及时改进,最终实现了网上购物系统的开发目标。
    5.4 系统的维护主要包括四个方面
    程序的维护:修改部分或全部程序,这种维护往往是在条件发生变化或原系统的效率低的情况下进行的
    数据文件的维护:按照用户的要求对数据文件进行不定期的修改
    代码的维护:随着系统的发展和变化,可能会出现旧代码不能适应新要求的问题,因此,有必要变更代码,予以维护
    硬件的维护:对系统所使用的设备进行维护

    6 总结本文讲述了在线购物系统的系统分析和设计,介绍了后台的商品发布、订单管理、会员管理以及前台的购物管理。
    在线购物系统只是所有在线购物系统的雏形,后台的商品发布、订单管理、会员管理和前台的购物管理是所有在线购物共有的特征。根据本实例的最初设计思想,对方案如下改进意见:
    完善系统功能除了给用户浏览商品外,提供给用户一个接口,用户对产品提出自己的建议,比如设计方面,包装方面,企业可以在网上搞一些活动,比如意见征集,这样提高用户参与的积极性,同时企业可以从用户的意见以及反馈信息中,找到使企业可持续发展的途径。只要是服务性的行业最根本的还是要坚持以客户为中心的原则。
    完善业务流程根据实际情况,使业务流程规范化。做到充分利用企业的资源,市场的资源,人力资源。使工作业务流程能够更合理,更有序的进行。
    完善人员培训机制对员工进行定期的培训,让员工了解市场,了解企业发展状况,了解客户需求。对员工进行一定的理论方面的培训。加强信息观念,这样提高了员工的素质,更加有利于员工参与工作,并胜任工作。在全球都提倡信息化的今天,面对我国的实际情况,所有人都应当提高自己的信息素养,只有这样我们才能很好的和世界贸易接轨,我国的电子商务才能有较快的发展,我国的经济发展才会有保证。
    通过开发这个项目,巩固了以前所学的理论知识,提高了自己理论联系实际的能力,为今后进一步学习新技术打下一个很好的基础,为走上社会实际工作岗位做好了充足的准备,为今后的职业发展打下良好的基础。面对以后各项挑战,我有信心做得更好!
    当然,由于时间和技术上的原因,该系统还是存在一些问题和不足的地方,比如在数据容量方面,由于没有经过大量数据的测试,数据库能承受多大负荷还不能确定,在美工方面,由于缺少美工经验,所以很多页面看起来可能会不那么漂亮美观,在一些细小的处理上可能还缺少进一步的考虑。
    6 评论 127 下载 2019-10-11 12:22:08 下载需要15点积分
  • 基于JSP+Servlet+MySQL校园二手交易平台

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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




    ID
    VARCHAR(50)
    Primary Key
    学院编号


    DEP_NAME
    VARCHAR(10)
    UNIQUE
    学院名


    DEP_DESC
    varchar(100)
    NOT NULL
    学院描述



    班级表(m_class)



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




    ID
    VARCHAR(50)
    Primary Key
    班级编号


    DEP_ID
    VARCHAR(50)
    Foreign Key
    学院编号


    CLASS_NAME
    VARCHAR(10)
    UNIQUE
    班级名


    CLASS_DESC
    varchar(100)
    NOT NULL
    班级描述



    学生表(m_student)



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




    ID
    VARCHAR(12)
    Primary Key
    学号


    CLASS_ID
    VARCHAR(50)
    Foreign Key
    班级编号


    STU_NAME
    VARCHAR(10)
    UNIQUE
    学生姓名


    sex
    TINYINT(3)
    NOT NULL
    学生性别



    交易地区表(m_area)



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




    ID
    VARCHAR(50)
    Primary Key
    地区编号


    AREA_NAME
    VARCHAR(10)
    UNIQUE
    地区名


    AREA_DESC
    varchar(100)
    NOT NULL
    地区描述



    信息类型表(m_type)



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




    ID
    VARCHAR(50)
    Primary Key
    类型编号


    TYPE_NAME
    VARCHAR(10)
    UNIQUE
    类型名


    TYPE_DESC
    varchar(100)
    NOT NULL
    类型描述



    二手指南表(t_article)



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




    ID
    VARCHAR(50)
    Primary Key
    指南编号


    TITLE
    VARCHAR(10)
    UNIQUE
    指南标题


    CONTENT
    varchar(8000)
    NOT NULL
    指南内容



    用户表(t_user)



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




    ID
    VARCHAR(50)
    Primary Key
    用户编号


    USERNAME
    VARCHAR(10)
    UNIQUE
    用户名


    PASSWORD
    varchar(100)
    NOT NULL
    用户密码


    STU_ID
    VARCHAR(50)
    Foreign Key
    学号


    BIRTHDAY
    DATETIME
    NOT NULL
    生日


    PHOTO
    SMALLINT(5)
    NOT NULL
    照片


    QUESTION
    VARCHAR(100)
    NOT NULL
    注册问题


    ANSWER
    VARCHAR(100)
    NOT NULL
    注册答案


    EMAIL
    VARCHAR(50)
    —-
    EMAIL


    QQ
    VARCHAR(20)
    —-
    QQ


    CREATE_TIME
    DATETIME
    NOT NULL
    注册时间


    STATUS
    TINYINT(3)
    NOT NULL
    状态


    ROLE
    TINYINT(3)
    NOT NULL
    权限



    信息表(t_message)



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




    ID
    VARCHAR(50)
    Primary Key
    信息编号


    MESSAGE_TITLE
    VARCHAR(50)
    UNIQUE
    信息标题


    TYPE_ID
    VARCHAR(50)
    Foreign Key
    信息类型


    AREA_ID
    VARCHAR(50)
    Foreign Key
    交易地区


    OLD_VALUE
    SMALLINT(5)
    NOT NULL
    新旧值


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


    R_USER
    VARCHAR(10)
    NOT NULL
    联系人


    R_PHONE
    VARCHAR(50)
    NOT NULL
    联系电话


    R_EMAIL
    VARCHAR(50)
    —-
    EMAIL


    MESSAGE_DESC
    VARCHAR(200)
    NOT NULL
    信息详情


    MESSAGE_PHOTO
    VARCHAR(50)
    —-
    信息图片


    CREATE_TIME
    DATETIME
    NOT NULL
    新增日期


    FLAG
    TINYINT(3)
    NOT NULL
    信息标志


    TOP_VALUE
    INTEGER
    NOT NULL
    人气值


    CREATE_USER_ID
    VARCHAR(50)
    Foreign Key
    发布用户



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

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

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

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

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

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

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

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

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

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

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

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

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

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



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




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


    stu_id
    Text
    maxLength=12
    学号


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


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


    password
    password
    maxLength=20
    密码


    repassword
    password
    maxLength=20
    确认密码


    question
    Text
    id=txtTipQuestion
    密码问题


    answer
    Text
    id=txtTipAnswer
    密码答案



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

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

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

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



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




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


    messageid
    hidden
    —-
    信息编号


    message_title
    Text
    maxLength=30
    信息标题


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


    flag
    DropDown
    —-
    交易类型


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


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


    price
    Text
    maxLength=10
    物品价格


    r_user
    Text
    maxLength=10
    联系人


    r_email
    Text
    maxLength=20
    E-mail


    r_phone
    TEXTAREA
    —-
    联系方式


    message_desc
    TEXTAREA
    —-
    物品简介


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


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



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

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

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

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

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

    1、系统介绍1.1 系统设计目标本次课程设计选择的题目是做一个简易的图书管理系统,应用MFC编程,更加理解了MFC基于对话框的使用完成应用软件的各项功能以及连接数据库的应用,及各个类之间数据传递的关系。主要综合运用所学知识,熟练掌握VC++程序设计的编码与MFC框架结构。
    1.2 系统功能介绍图书馆需要对大量的图书信息进行处理,利用C++文件存储的应用来实现对图书,作者信息,图书借阅信息的添加、修改、删除、查询等常用功能。
    1.3 环境
    开发软件:Visual Studio 2010
    运行平台:Windows系统

    2、系统详细设计思路两大步骤:

    数据存储分析
    代码编写以及功能实现

    首先分析图书,读者,借阅所需要存储的信息,设计合适的存储结构。利用C++面向对象的特性,可以定义图书,读者,借阅三个类来分别存储以上三类信息。
    在界面设计上,将功能分为三大模块,图书管理,读者管理,借阅管理。用选项卡来进行不同模块之间的切换。
    每个模块里,数据展示的方式主要通过CListCtrl控件,该控件可以展示多条同一格式的数据,同时也方便管理者对数据的增删查改操作
    3、各种图3.1 系统流程图、类关系图
    3.2 主要运行界面图、运行结果图图书管理主界面

    添加图书界面

    读者管理主界面

    添加或编辑读者信息

    借阅信息管理界面

    添加借阅信息

    查看借阅信息

    查看借阅信息(如果逾期未归还计算罚款金额)

    4、系统开发过程中遇到的问题对于自己设计的这个小型图书管理系统,考虑平时学校的图书馆管理系统,再结合自身学习的知识来完成这个小型的图书管理系统。
    其中比较大的问题是如何在不同控件之间实现数据的传递,例如借阅信息模块中,添加借阅信息中的借阅人,借阅图书信息必须是来自于已有的读者信息,图书信息。因此我把它做成了不可编辑只可选择的下拉框,因此需要面对如何获得读者信息,图书信息的数据的问题。最后的解决办法是将图书信息,读者信息存储在一个全局的链表中(CList),就可以被不同控件公用。
    5、心得体会经过这段时间的努力基本完成了图书管理系统。对于这个图书管理系统,刚开始对于系统的基本功能是这样设计的:管理员对图书信息的管理以及系统管理员对读者信息的管理、读者的借书、还书。对于一个大型的程序,在实现的过程中,考虑到实际,对于具体的功能 进行了增加、删除。
    同时通过这几天的程序及报告编写,把学过的C++知识运用到了实践。同时,通过和其它同学的交流,对于MFC窗体程序和有了进一步的理解。我也发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还是比较脆弱。尤其是编写大型的程序所要拥有的知识和技能比较缺乏。程序编好了,还要经过调试和修改,这步也很关键,好的程序是经过了无数次的修改和调试才产生的。我们的程序基本上能够满足要求,但还有一些地方需要改进,在今后我们应该在多看书的同时还要加强实践的练习。才能进一步提高自己的编程能力。
    10 评论 624 下载 2019-03-31 21:35:57 下载需要14点积分
  • 基于JSP和MYSQL实现的图书馆管理系统

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

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

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


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


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





    book_id
    bigint
    20
    0

    图书号



    name
    varchar
    20
    0

    书名



    author
    varchar
    15
    0

    作者



    publish
    varchar
    20
    0

    出版社



    ISBN
    varchar
    15
    0

    标准书号



    introduction
    text
    0
    0

    简介



    language
    varchar
    4
    0

    语言



    price
    decimal
    10
    2

    价格



    pub_date
    date
    0
    0

    出版时间



    class_id
    int
    11
    0

    分类号



    number
    int
    11
    0

    剩余数量



    5.2 数据库管理员表admin


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





    admin_id
    bigint
    20
    0

    账号



    password
    varchar
    15
    0

    密码



    username
    varchar
    15
    0

    用户名



    5.3 图书分类表class_info


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





    class_id
    int
    11
    0

    类别号



    class_name
    varchar
    15
    0

    类别名



    5.4 借阅信息表lend_list


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





    ser_num
    bigint
    20
    0

    流水号



    book_id
    bigint
    20
    0

    图书号



    reader_id
    bigint
    20
    0

    读者证号



    lend_date
    date
    0
    0

    借出日期



    back_date
    date
    0
    0

    归还日期



    5.5 借阅卡信息表reader_card


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





    reader_id
    bigint
    20
    0

    读者证号



    password
    varchar
    15
    0

    密码



    username
    varchar
    15
    0

    用户名



    5.6 读者信息表reader_info


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





    reader_id
    bigint
    20
    0

    读者证号



    name
    varchar
    10
    0

    姓名



    sex
    varchar
    2
    0

    性别



    birth
    date
    0
    0

    生日



    address
    varchar
    50
    0

    地址



    phone
    varchar
    15
    0

    电话



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


    6.2 管理员系统6.2.1 图书管理
    6.2.2 图书详情
    6.2.3 读者管理
    6.2.4 借还管理
    6.3 读者系统6.3.1 查看全部图书
    6.3.2 个人信息查看,可以修个个人信息
    6.3.3 个人借阅情况查看
    7 评论 237 下载 2019-05-09 11:01:25 下载需要13点积分
  • 基于Android开发的聊天机器人新闻天气社交APP

    摘要5G网络就快到来了,4G网络已经基本上覆盖了,便捷的网络环境为安卓手机添加更多的精彩丰富的内容提供了良好的平台和基础。目前安卓开发正对我们的生活造成巨大的影响,我们的生活已经离不开如微信、QQ、微博等应用。 这些应用极大的便利了我们的生活,为我们的工作生活带来了很多的乐趣,丰富和充实了我们的生活。该系统是正是利用Android开源平台开发的一款娱乐APP,叫做知心App,利用当今主流的编程语言Java进行代码的编写,利用Google最新开发的Android Studio为开发工具,通过了解安卓平台的系统架构和应用程序开发流程,最终成功开发出了该款应用。该款应用主要包括了人脸识别登录、网易新闻、欧酷天气、图灵机器人、作者个人信息、应用更新等模块。此款应用采用了ButterKnife依赖注入技术、Gson数据解析框架、OkHttp网络处理框架、科大讯飞语音识别技术、图灵机器人技术、一登刷脸登录技术、Bmob登录注册技术、蒲公英应用发布以及自动更新等技术。此款应用严格按照软件开发标准流程进行设计与开发,代码结构清晰,用户体验较好。
    关键词:Android;Android Studio;人脸识别;语音识别;图灵机器人
    Abstract5G network is coming soon, 4G network has basicallycovered, convenient network environment for Android phones to add morewonderful rich content provides a good platform and foundation. At present,Android development is having a huge impact on our lives, our lives have beeninseparable from applications such as wechat, QQ, microblogging. Theseapplications greatly facilitate our lives, bring a lot of fun to our work life,enrich and enrich our lives. This system is just an entertainment app developedby using Android open source platform, called bosom app. it is successfullydeveloped by using Java, the mainstream programming language, and Androidstudio, which is newly developed by Google, as a development tool, throughunderstanding the system architecture and application development process ofAndroid platform. This application mainly includes face recognition login,Netease news, cool weather, turing robot, author’s personal information,application updates and other modules. This application uses button knifedependency injection technology, gson data analysis framework, ok http networkprocessing framework, hkust xunfei speech recognition technology, turing robottechnology, a brush face registration technology, bmob registration technology,dandelion application release and automatic update technology. This applicationis designed and developed in strict accordance with the standard process ofsoftware development, with clear code structure and good user experience.
    Key Words: Android; Android Studio;Face Recognition; Speech Recognition; Turing Robot;
    第1章 绪论1.1 课题背景目前市场上主流的手机操作系统有两种,那就是Android和IOS。Android系统是谷歌开发的并且最重要的是开放源代码,而IOS则是苹果公司研发的,不开放源代码。就当今用户使用手机情况来看,安卓手机占据大约60%的手机市场,而苹果手机大约占30%的市场。全世界的企业大部分还是中小企业,经济能力有限,因此大部分厂商还是喜欢用开源免费的。因此,我的这个应用就是基于Android平台开发的。想必大家都用过智能手机,也用过普通的手机软件,早在五年之前安卓市场非常火爆,但是当时的软件还是非常的普通,完全不具备现在的人工智能与大数据技术。现在的应用都在慢慢的被大数据与人工智能技术所熏陶,比如说微博、微信等应用,各种个性化推荐信息、智能提示非常方便用户使用。
    目前处于人工智能和大数据飞速发展的时代,为了让用户体会到大数据与人工智能的魅力,感受新时代的气息,我在应用中添加了人脸识别和图灵机器人以及语音识别等功能模块。目前提供人脸识别服务的平台比较多,想百度AI平台,阿里云平台,腾讯云平台,Face++,一登等。但是从个人选择上来讲,一登接入比其他的平台简单,并且是免费的。智能聊天机器人采用图灵公司开发的新一代的机器人。语音识别功能采用的是科大讯飞的语音识别技术,相对来说科大讯飞的语音技术在国内应该是顶尖的。这些是具有人工智能功能的应用是传统的应用所无法替代的,因此为了适应时代发展的潮流,我在普通应用的基础之上有了自己的创新。利用最新的Android开发技术结合人工智能技术开发具有良好用户体验以及更加智能的安卓应用。
    1.1.1 人工智能人工智能技术简称AI,它的研究主要是便于机器模拟人的思维,能够像人一样思考,最终利用机器人更好地为人类服务。
    1.1.2 大数据大数据技术,它的研究主要是为了处理当今社会生活中产生的大批量的数据。目前主流的大数据平台有Hadoop和Spark。Hadoop平台主要是支持大批量数据的离线处理,而Spark平台主要是基于内存的高速实时数据流处理。两者在性能上有较大的差距,Spark的处理速度大约是Hadoop的10倍。当然两者分别具有各自的特色,适用于不同的应用场景。
    1.2 目的意义目前正处在人工智能和大数据的时代,为了让用户感受到人工智能的存在,我在应用中添加了人脸识别和图灵机器人以及语音识别等功能模块。这些是传统的应用所不具备的功能,因此我在其基础之上有了自己的创新,让应用更加智能话。具有良好的用户体验是衡量一个安卓应用品质的很重要的标准。只有拥有良好的用户体验的应用才能长期生存下去。新的时代需要不断创新,要把最新的技术运用到Android应用之上,让App具有新意,更加符合人们的使用需求。因此,我设计了这款App帮助用户更好的体验智能化的生活。
    1.3 论文主要工作目前正是人工智能和大数据技术火热的时候,为了在让传统的安卓应用具有新时代的特点,我在本次开发中加入了一些人工智能的元素,希望能给用户带来全新的用户体验。
    本课题的主要开发流程包括需求分析、概念设计、详细设计、编码测试、应用上线。需求分析阶段主要采用市场调研和问卷调查两种方式。概念设计阶段主要是总体结构设计,采用MVP三层架构技术。其中详细设计阶段主要设计应用的各个功能模块,如引导页模块、登录注册模块、网易新闻模块、图灵机器人模块、开发者个人信息模块、应用更新等模块。编码实现阶段采用Java语言开发,运用AndroidStudio开发工具进行开发。后期的编码测试采用真机测试,记录日志信息,修复Bug。应用开发完成后,进行应用打包,最后发布到蒲公英应用发布平台。
    第2章 相关技术和理论基础2.1 技术与理论基础在此应用中主要用到了ButterKnife依赖注入框架、Gson数据解析框架、OkHttp网络处理框架。
    2.1.1 ButterKnife依赖注入框架1.ButterKnife概念
    Annotate fields with @BindView and a view ID for ButterKnife to find and automatically cast the corresponding view in your layout.
    2.项目配置
    在AndroidStudio Module中的build.gradle中添加以下依赖:

    compile’com.jakewharton:butterknife:8.8.1’
    annotationProcessor’com.jakewharton:butterknife-compiler:8.8.1’

    3.示例代码

    2.1.2 Gson框架1.Gson概念
    Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。
    2.项目配置
    在AndroidStudioModule中的build.gradle中添加以下依赖:

    compile’com.google.code.gson:gson:2.8.2’
    2.1.3 OkHttp网络框架1.OkHttp概念
    AnHTTP & HTTP/2 client for Android and Java applications.
    2.项目配置
    在AndroidStudio Module中的build.gradle中添加以下依赖:

    compile ‘com.squareup.okhttp3:okhttp:3.10.0’
    3.示例代码

    2.2 技术与理论基础在此应用中主要用科大讯飞语音识别技术、图灵机器人技术、一登刷脸登录技术、Bmob登录注册技术、蒲公英应用发布以及更新、GitHub项目管理等技术。
    2.2.1 科大讯飞语音识别与图灵机器人
    语音识别的概念
    语音识别包括听写、语法识别功能。语音识别技术就是把人说的话转换成相应的文本数据。语法识别是基于语法规则,将与语法一致的自然语言音频转换为文本输出的技术。
    科大讯飞开发者文档:http://doc.xfyun.cn/msc_android/index.html
    图灵机器人的概念
    图灵机器人是图灵公司开发一款机器人,具备与人交流的能力,可以和人进行简单的对话。主要应用领域是聊天机器人、客服机器人和服务机器人。
    图灵机器人开发者文档:https://www.kancloud.cn/turing/web_api/522992

    2.2.2 Bmob后端服务平台以及蒲公英应用平台
    Bmob后端服务平台Android开发者文档:http://doc.bmob.cn/data/android
    蒲公英开发者文档:http://www.pgyer.com/doc/view/sdk_android_guide

    2.2.3 GitHub项目管理工具
    GitHub网址:https://github.com
    Git 常用命令

    git init //初始化项目git status //查看项目状态git add //添加文件到 git 追踪列表里git commit //提交到本地仓库git log //提交记录git clone //复制项目到本地git branch //查看或者创建分支
    git branch net //创建net分支git branch -d net //删除分支
    git checkout //签出一个分支或者一个路径,在开发中常用于分支切换和恢复文件
    git checkout net //切换net分支:git checkout — SayHello.java //恢复文件
    git merge //合并分支
    git merge net //合并net分支
    git tag //列出项目的标签和创建项目的标签
    git tag -a v1.0 -m “这里写相关信息” //为版本打一个标签git show 标签名 //来查看该分支的具体信息
    git help //帮助git push //推送
    git push 仓库名 分支名git push origin master:master 或git push origin master //本地master分支提交到origin的master分支,分支相同的可简写
    git push origin :net //删除origin仓库的net分支git pull //更新最新的代码git ignore //忽略文件fork //远程复制别人的仓库到自己的仓库

    示例代码

    第3章 系统分析(需求分析)3.1 功能需求分析随着大数据、人工智能的迅速发展,我们的生活变得越来越便利。传统的应用只能通过账号密码来登录,用户体验不是太好。而如今的App变得越来越智能化了,比如支付宝、淘宝、微信等。支付宝现在正运用最先进的大数据与人工智能技术开启了刷脸登录与刷脸支付的时代。为了让App具有新时代的特点,不得不运用大数据与人工智能的技术,这也是未来发展的趋势。经过市场的调查,发现当前大部分的应用还是不具备新时代的特点,因此我觉得我这个项目是符合市场需求的。
    3.1.1 用户需求分析此软件要求能够运行在Android 5.0以上的系统终端上,相对来说使用群体还是占据很大一部分,但是用户对软件也有一定的要求:

    简单易学
    运行稳定
    操作简单

    3.1.2 功能需求分析本项目应当具有以下功能:

    应用引导页、欢迎页
    账号密码登录、注册
    刷脸登录
    网易新闻
    图灵机器人
    欧酷天气
    开发者个人信息
    应用更新
    应用打包发布

    3.2 非功能需求分析
    开发环境为Android Studio
    要求系统响应不超过3秒
    要求应用兼容Android 5.0以上的主流手机平台
    多渠道打包

    3.3 可行性分析3.3.1 经济可行性本软件基于开源的Android系统开发,采用Android Studio免费软件进行开发,运用第三方平台提供的免费服务实现特定功能,开发成本相对较低。
    3.3.2 技术可行性


    Windows版本
    Windows 10 家庭版64位




    Android Studio版本
    3.1.1


    Android编译SDK版本
    26


    Android测试版本
    华为荣耀青春版(Android7.0)


    Gradle版本
    4.4


    Maven版本
    3.5.3


    Git版本
    2.16.2



    本软件基于开源的Android系统开发,使用主流的编程语言Java进行编码,因此该软件在技术上可行。
    3.3.3 操作可行性该软件采用主流的Android软件应用开发风格,并使用Google 全新的设计语言Material Design,界面友好,简单易懂,为用户带来全新的视觉体验。
    第4章 系统设计4.1 总体设计系统结构图

    MVP架构图

    4.1.1 功能模块图该软件的功能模块图如下:

    4.1.2 用例图
    4.1.3 数据流图
    4.2 详细设计
    对于引导页模块,采用图片滑动形式,引导用户了解如何使用该软件以及相关的功能
    对于登录模块,采用两种登录方式:账号密码登录和刷脸登录。账号密码登录的话采用Bmob后端云数据库实现,刷脸登录采用的是一登刷脸服务
    对于注册模块,同样采用的是Bomb后端云数据库
    对于网易新闻模块,采用的是网易新闻的接口
    对于欧酷天气模块,采用的是天气预报的接口
    对于图灵机器人模块,采用的图灵智能机器人的接口
    对于开发者个人信息模块,采用列表显示出来
    对于应用更新模块,采用蒲公英应用发布平台的App更新技术

    4.2.1 登录注册模块登录模块处理逻辑如下:

    用户输入账号密码进行登录
    通过回调函数获取登录返回结果
    根据返回结果判断登陆是否成功,若登录成功则显示用户信息,否则提示登录失败
    登陆成功将用户的姓名和电话显示出来

    注册模块处理逻辑如下:

    用户输入账号密码进行注册
    通过回调函数获取注册返回结果
    根据注册返回结果判断是否注册成功,若注册成功则返回登录页面,否则提示注册失败

    4.2.2 网易新闻模块网易新闻模块处理逻辑如下:

    通过天气接口的URL获取返回的JSON数据
    将JSON数据转换为News对象
    将数据显示在页面上

    4.2.3 图灵机器人模块图灵机器人模块的处理逻辑如下:

    将语音数据转换为文本数据
    通过图灵接口的URL获取返回的JSON数据
    将JSON数据转换为TalkBean对象
    获取对象中的内容,再将其转换为语音输出

    4.2.4 欧酷天气模块欧酷天气模块处理逻辑如下:

    通过城市URL获取城市JSON数据
    将JSON数据转换为城市对象
    通过天气URL获取天气JSON数据
    将天气JSON数据转换为天气对象
    在页面显示天气信息

    4.2.5 引导页、欢迎页模块引导页、欢迎页模块处理逻辑如下:

    判断应用是不是第一次打开
    判断本地数据库是否有记录,若是第一次打开的话则显示引导页,并将记录写到本地数据库
    否则直接进入欢迎页

    4.2.6 开发者详情模块开发者详情模块处理逻辑如下:

    直接加载布局文件的内容显示出来
    4.2.7 应用更新模块应用更新模块的处理逻辑如下:

    点击检测更新按钮
    系统比较本地版本和服务器上的版本
    若本地版本等于服务器版本,则提示用户“您的应用已是最新版本!”
    若本地版本低于服务器版本,则提示用户“检测到新版本,是否更新?”
    若用户点击“取消”,则退出更新
    若用户点击“确定”,则后台服务自动下载应用更新包
    下载完成后,系统提示用户是否立即安装
    若用户点击“取消”,则退出安装程序
    若用户点击“确定”,则等待安装完成

    第5章 系统实现与测试5.1 系统实现该项目主要包含引导页模块、登录注册模块、网易新闻模块、图灵机器人模块、开发者个人信息模块、应用更新等模块。各个模块的设计与实现如下:
    5.1.1 登录、注册模块实现登录模块流程图如下:

    登录模块主要代码如下:


    注册模块流程图如下:

    注册模块代码如下:

    5.1.2 图灵机器人模块实现图灵机器人流程图如下:

    图灵机器人实现代码如下:
    语音识别函数

    语音合成函数

    语音处理适配器类

    语音处理适配器类(续)

    5.1.3 网易新闻模块实现网易新闻模块流程图如下:

    网易新闻模块主要代码实现:

    5.2 系统测试该系统为安卓项目,测试采用华为荣耀8真机,安卓系统版本为7.0。主要包括账号登录、刷脸登录、注册、语音对话、获取新闻信息、获取城市信息、获取天气详细信息、开发者个人信息展示、应用更新等功能的测试。
    5.2.1 登录注册功能测试账号登录测试

    测试账号:187xxxx9552
    测试密码:1234
    测试截图如下:


    刷脸登录测试

    5.2.2 图灵机器人、网易新闻模块测试图灵机器人对话测试

    网易新闻测试效果图

    5.2.3 欧酷天气模块测试欧酷天气城市列表测试效果图


    第6章 总结和展望6.1 本文总结这个项目大概花了一个多月的时间才弄完的,查阅各种资料,虽然中途出现了各种问题,但是最终收获还是很多的。刚开始做这个项目的时候,搭建各种环境花费了一番功夫,好在之前自学了一段时间的安卓,最后顺利把环境搭建好了。这个项目主要包含了账号密码登录、刷脸登录、账号密码注册、网易新闻、图灵机器人、欧酷天气、开发者详情、应用更新等模块。其中涉及到的技术主要有ButterKnife注解、Gson数据解析、OkHttp网络处理、Bmob后端云数据库、一登人脸识别、图灵机器人、科大讯飞语音识别、蒲公英应用发布与自动更新。在上学期学的安卓知识终于派上用场了,这次的项目总体来说还是不错的,加入了新时代的元素,比如说人工智能和大数据。人工智能和大数据是目前最火的技术,代表了未来发展的趋势,因此我在项目里加入了这些元素。项目开发一个很重要的问题就是规范,开发必须要按照标准的流程来,制定相应的代码规范,这样才能有效地减少开发人员的代码修改。在这次开发中,我引进了项目源代码管理仓库GitHub,将开发过程记录到其中了。GitHub是一个团队开发利器,可以方便的进行代码管理和并行开发,有效减少了代码之间的复制。在开发这个项目的时候遇到了一些比较莫名其妙的问题,有一些是依赖包的版本问题,还有一些是android系统版本的问题。我到现在也还没有把安卓手机兼容性问题解决掉,这个问题有点棘手,市场上的手机种类太多了。在刚开发安卓项目的时候,只知道去百度找资料,那时候还不会翻墙,不知道去谷歌搜索。后来学会了翻墙技术,就可以去谷歌查找更加专业的资料了,身为一个程序员只会百度的话那也太低级了。在遇到问题的时候,先去查看运行输出的错误日志,然后根据错误信息分析错误原因在哪里,最后才百度或者谷歌看看别人如何解决的。在这次项目开发中,发现自己还有许多不足之处,希望在日后不断学习,能够有所改善。本次项目依然存在许多不足之处,比如说程序安全性和健壮性不够,操作界面不够美观,功能不够完善,代码结构不够清晰。希望在以后的工作中能够做得更好。
    6.1.1 项目管理总结项目管理工具目前主流的是SVN和GitHub,个人推荐还是GitHub比较好用。
    6.1.2 项目中遇到问题如何解决遇到问题,首先分析错误日志,然后分析错误的可能原因,最后看书或者去网上搜索找到解决方案。
    6.1.3 如何获取开发方面的优质资源推荐几个学习网站:StackOverFlow,掘金,简书,慕课,网易云课堂。
    6.2 未来展望希望在以后的学习中能够学会更多的技术,比如目前流行的大数据与人工智能技术。利用大数据技术与人工智能技术让移动应用更加智能化,更加便利我们的生活。本系统还存在许多不足之处,比如说功能方面还可以更加完善,性能上还有待提高,由于时间关系,来不及全部完成。
    6.2.1 可添加的功能
    根据定位自动获取并显示天气信息
    利用QQ、微信或者其他第三方平台登录
    添加好友聊天功能
    语音唤醒机器人
    百度地图定位当前位置
    二维码识别、生成
    文本、图片识别

    6.2.2 解决兼容性问题由于Android系统版本较多,不同的手机获取资源对应的包不同,以及不同手机尺寸的不同,所以会出现部分手机闪退现象。希望在以后学习更多的知识后能够解决这个问题。
    参考文献[1]李刚. 疯狂 Android 讲义[M]. 北京:电子工业出版社,2013:25-42.
    [2]杨丰盛. Android 技术内幕[M]. 北京: 机械工业出版社,2011:77-89.
    [3]杨云君. Android 的设计与实现[M]. 北京:机械工业出版社,2013:45-49.
    [4]柯元旦. Android 内核剖析[M]. 北京:电子工业出版社,2011:59-70.
    [5]丰生强. Android 软件安全与逆向分析[M]. 北京:人民邮电出版社,2013:78-90.
    [6]余成锋,李代平,毛永华. Android3.0 内存管理机制分析[M]. 计算机应用与软件,2013:55-80.
    [7]佐冰冰. Android 平台下 Launcher 启动器的设计与实现[D]. 哈尔滨工业大学,2012:108-150.
    [8]杜吉志,徐明昆. Android 系统内存管理研究及优化[J]. 软件,2012,24(5):69-80.
    [9]马越. Android 的架构与应用[D]. 北京:中国地质大学,2008:330-357.
    [10]姚昱旻,刘卫国. Android 的架构与应用开发研究[J]. 计算机系统应用,2008,77(11):99-111.
    [11]高巍. Android 操作系统软件自动化测试方案的设计与实施[D]. 北京:北京邮电大学,2012:440-479.
    [12]孙剑. Android 系统上应用程序按需加载机制的设计与实现[M]. 北京大学,2011:99-110.
    [13]卢娜. 基于 Android 平台的手机桌面资讯系统的设计与实现[M]. 西安电子科技大学,2011:290-300.
    [14]高焕堂. Google Android 应用框架原理与程序设计 36 计[M].Misoo,2010:8-13.
    [15]钟茂生,王明文. 软件设计模式及其使用[J].计算机应用,2002,22(8):32-33.
    [16] Gartner November Report[EB/OL].http://www.gartner.com/newsroom/id/2482816, 2013
    [17] B. John. A binary analysis ofresultatives[C]. In Proceedings of Texas Linguistics Society Conference (TLSC),Stanford, California, USA, 1997, 43-58
    5 评论 62 下载 2018-11-13 12:14:09 下载需要14点积分
  • 基于MySql和php的团购平台

    一、实现环境1.1 前端编程环境:Microsoft Windows 10 64bit
    1.2 后端
    编程环境:Microsoft Windows 10 64bit
    服务器: Apache Server v 2.4.23 本地部署
    数据库:MySQL + PHPMyAdmin v 4.5.1
    PHP 版本:PHP 5.6.24

    二、系统功能结构图2.1 系统功能需求分析“乐购”团购平台的设计目标是:方便顾客在网上完成团购工作,享受线上折扣;为商家提供在线的商品展示、推广与销售渠道;顾客可以给购买过的商品进行评价。为此,本系统应该具有以下几个功能:
    2.1.1 注册与登陆用户在使用本网站之前需要首先进行注册,否则将不能够使用完整的购物流程。在进行注册时,用户需要输入自己注册的用户名、密码以及邮箱等信息,不能够使用同一个邮箱进行重复注册。在注册完成后,用户便可以通过登录界面进行登陆,并可以使用网站的全部购物功能。
    商家在本平台进行商品销售之前需要首先进行商家注册。在进行注册时,商家需要输入自己注册的用户名、密码以及邮箱等信息,不同的商家不能够使用相同的邮箱重复注册。在注册完成之后,商家可以通过登录界面进行登陆。登陆之后的商家可以随时查看自己的信息并作出修改,还可以看到自己正在出售的商品以及销量信息。
    本系统设置后台管理员,管理员可以对自己负责类别板块的所有商品进行编辑修改,还可以查看所有商家的具体信息。
    从上面三点可以看出,本系统具有用户、商家和管理员三种角色。三种角色分别可以使用不同的方式进行登陆,并且分属不同的角色组,具有不同的操作权限。因而本系统具有权限管理的功能,能在一定程度上保证系统的安全性。
    2.1.2 用户信息管理用户在完成登陆之后可以查看并完善自己的个人信息,此外,个人信息将会统计该用户在本网站的总支出为多少。此外,用户在进行登陆之后还可以进行历史订单的查询,查看自己曾经购买过的商品。
    2.1.3 商家后台管理功能商家在完成登陆之后,可以选择添加新的商品。在添加商品的时候,需要提供商品的名称、价格、原价、类别、库存等信息,还可以提供商品的描述和图片。如果商品的库存不足将无法继续出售,此时商家可以选择删除该商品或者修改商品信息中的库存属性以恢复销售。此外,登陆后的商家还可以进行商户信息的修改。
    2.1.4 商品检索与购买功能用户在进行登陆之后可以进行商品的购买。购买商品需要首先进入商品界面,然后选择需要购买的数量,最后点击下单。完成下单之后,系统将会生成一个订单,订单中包含购买商品的数量以及商品的信息。用户可以在个人信息界面看到自己曾经下过的订单,并得到自己过去的总支出。
    此外,本网站还支持商品检索功能。用户可以选择自己想要选择商品的信息或者输入商品的关键字,以实现商品的查询功能。
    2.1.5 评价反馈功能用户在完成商品购买之后可以进行商品评价。用户的评分将会直接展示在商品页面和商家的页面上。商品的评分由该商品的所有评价的平均值决定,商家的评分由该商家的所有商品决定。
    2.2 系统功能结构设计图
    三、基本表定义根据之前的设计文档以及规范化原则,本系统采用共采用了 8 个基本表,它们分别为:管理员信息表(admin),用户信息表(users),商户信息表(shop),商品信息表(item),类别信息表(class),团购订单表(orders),订单详情表(iteminorder)和评论信息表(comment)。各基本表定义如下,其中的所有关系均已规范化到 3NF 以上。
    管理员信息表(admin)

    用户信息表(users)

    商户信息表(shop)

    商品信息表(item)

    类别信息表(class)

    团购订单表(orders)

    评论信息表(comment)

    订单详情表(iteminorder)

    四、安全性设计本系统能够满足较为基本的安全性设置,此章将从前端和后端两个方面说明本系统的安全性设计。
    4.1 前端前后端通信主要使用 POST 方法而不是 GET 方法,能有效防止其他人对网站信息的恶意截取与利用。用户使用用户名和密码登录的过程中,会首先检索用户名和密码填写的完整性,保证了在登录界面不会被渗透。
    4.2 后端后端的安全性设计主要采用了不同用户登陆的形式。商家、管理员、用户分别以三种不同的用户身份登陆到数据库中,不同角色之间的操作权限各不相同,这可以在很大程度上保证数据库的结构不被破坏。
    此外,在 php 连接后台的函数中,对于特定数据类型的数据加以验证,防止了 SQL 注入所造成的危险。例如,验证某个变量是否为整型,之后再进行相应操作
    $type = intval($type);
    或者是将需要检索的变量名使用引号括起来:
    $result = mysql_query("select * from users where user_email = '$name' and user_password = '$pw'",$conn);
    五、存储过程、触发器和函数5.1 存储过程本平台后端共采用了三个存储过程,下面我将分别对其进行介绍。
    5.1.1 商品数量设置存储过程(setrest)过程输入:商品 id id,需要设置的商品数量 itemnum
    过程输出:操作成功返回 0,否则返回 1
    作用:将对应 id 的商品库存数量设置为 itemnum。由于商品的库存不可能为负值,因此首先判断 itemnum 是否大于等于 0,如果是,那么进行赋值操作,输出 0;否则操作不合法,返回 1
    实现代码:

    5.1.2 商品评价统计存储过程(itemcomment)过程输入:商品 id itemid
    过程输出:1 星评价的占比 n1 , 2 星评价的占比 n2,3 星评价的占比 n3,4 星评价的占比 n4,5星评价的占比 n5,该商品的评价总数 total
    作用:统计 itemid 对应商品的所有评价的数量,并得到各等级评价所占的比例,以方便前端建立报表图形。
    实现代码:

    5.1.3 订单管理存储过程(orderManage)过程输入:用户名 username, 商品 id iid, 购买数量 num
    过程输出:运行结果 res 0 为执行成功,否则为 1
    作用:在用户进行购物操作的时候,根据不同的场景进行不同的订单操作。如果该用户不存在未结算的订单,那么系统将会为此用户新创建一个未结算的订单,之后将用户购买的操作插入到该订单的订单详情之中;如果该用户名下存在未结算的订单,那么系统将会直接在此订单的详情中插入用户现在购买的商品的信息
    实现代码:

    5.2 触发器5.2.1 商品评分更新触发器(item_star_update)作用对象:商品信息表(item)
    触发条件:comment 表插入操作后
    功能:在 comment 表中插入了一条新的评论之后,也就是用户对某商品进行评价之后,根据此评价重新计算该商品的评分(item_stars)
    实现代码:

    5.2.2 商家评分更新触发器(shop_star_update)作用对象:商家信息表(shop)
    触发条件:商品新表做出修改后
    功能:根据商品评分的修改更新商品的评分
    实现代码:

    5.2.3 用户年龄检查触发器(check_user_age)作用对象:用户信息表(users)
    触发条件:在用户表进行更新之前
    功能:首先判断输入的年龄是否合法,如果合法,更新用户年龄,否则终止操作
    实现代码:

    5.2.4 商品详情检查触发器(check_item_num)作用对象:订单详情表(iteminorder)
    触发条件:在订单详情表进行更新之前
    功能:判断用户购买的商品数量是否合法,如果合法,更新订单详情,否则终止操作
    实现代码:

    5.2.5 订单价格更新触发器(order_price_update)作用对象:订单详情表(iteminorder)
    触发条件:在订单详情表插入新条目之后
    功能:根据更新的商品的 id 和数量更新当前商品的价格
    实现代码:

    5.2.6 用户支出统计触发器(user_outcome_adapter)作用对象:订单信息表(orders)
    触发条件:订单信息表进行更新之后
    作用:根据更新订单的用户名,更新该用户的总支出情况
    实现代码:

    六、实现技术6.1 前端技术整个前端使用了很少 bootstrap 的 css 和 js 样式,基本的样式都是通过 html + css + javascript 手工实现,也运用了少许的 jquery 内容。前后端通信通过 ajax 进行,传递信息格式是 json。
    6.2 后端技术后端未使用现有的成熟框架,采用 PHP + MySQL 手工搭建。每当前端发来请求的时候,后端会首先解析前端所发来的 JSON 数据,之后进行相应的数据库查询,最终将查询的结果重新打包成 json格式返还给前端。大致的实现流程如下:

    七、运行实例7.1 主页页面主页页面采用 HTML + CSS + JS 实现动态加载,各个分栏中的内容都来源于数据库,可以跟随数据库的变化而变化。未进行登陆以及登陆后的页面会有所不同。

    7.2 登陆界面在主页点击登陆按钮之后将会弹出对应的登陆弹窗,在弹窗内输入注册邮箱和密码,然后点击立刻登陆。此时前端将会连接后端的服务器,进行身份校验,在确定输入的密码和登陆的用户一致后方能完成登陆操作。

    登陆后的主页右上角将会显示用户的用户名或者商家的商家 ID。

    7.3 商品页面商品页面可以通过点击主页的商品图片或者通过点击搜索后的结果到达,展示了商品的各个属性和评价。用户可以在此购买商品,也可以对商品进行评价。
    如下图所示,页面最上方显示商品的名称和描述,左侧有商品的配图,右侧有商品的优惠价、原价以及库存等信息。下方显示此商品的消费评价等信息,用户也可以通过点击提交评价按钮进行评价的提交。提交后的评价将会显示在页面的最下方。

    7.4 商家管理页面商家登陆后即可进入到商品管理页面,商家可以在这里修改自身的信息,也可以在此对商品做出添加,删除,修改操作。

    7.5 搜索页面搜索功能分为按类别搜索以及按照关键字搜索两类,点击页面上方的页面即可跳转到商品的类别搜索界面

    7.6 购物订单购物订单上半部分显示未支付的商品,按下显示金额的按钮可以进行支付,一次支付的所有内容算作一个订单。下半部分显示已支付的订单,每个订单用一圈黑色包裹,里面展示了订单具体内容。

    7.7 管理员登陆及管理接口
    八、源程序简要说明8.1 前端程序前端内容基本以 html 的格式放在根目录下,而每个 html 文件另配备一个 javascript 文件来实现动态加载以及通信。因为 css 优先级的问题,所以大部分 css 样式都嵌在 html 内部来重写 bootstrap代码。

    index.html:主页面,顶端摆放大型横幅,来宣传推广商品。下面左侧有个移动导航条,分类导航到各个栏目的商品,栏目共分五类:美食、酒店、电影、KTV、生活服务。每类各展示几个商品,点击更多会跳转到类别目录下
    mer.html:商品信息界面,上半部分展示商品具体信息,用户提交订单。下半部分展示商品评价并且用户可以自己填写评价
    merchant.html:列出商户具体信息,提供按钮进行编辑
    merchantEdit.html:商户编辑信息界面,可编辑名称、邮箱、电话、地址
    merEdit.html:商品信息编辑界面,可编辑名称、描述、原价、价格、图片、库存、类型
    user.html:用户个人信息界面,显示用户年龄、邮箱、电话、地址、头像、总支出
    userEdit.html:用户个人信息编辑界面,可编辑用户年龄、邮箱、电话、地址、头像
    register.html:登录界面
    result.html:顶部搜索结果界面,同时也是分类显示界面,界面每一排显示一个符合结果的商品
    paylist.html:订单界面,上面是未支付的订单,按下方按钮可以进行支付。下面是已支付订单,每一个订单会展示在一起。每个订单可以有多个不同的商品

    8.2 后端程序后端连接数据库所用的函数全部保存在 htdocs/php 文件夹下面,各文件的具体功能如下:

    addComment.php:创建商品评价的函数
    addItem.php:供商户添加商品所用的函数
    adminlogin.php:管理员登陆功能的函数
    createorder.php:创建用户清单的函数
    deleteitem.php:删除物品的函数
    itemcommnet.php:显示某商品评价的函数
    loadindex.php:加载主页内容的函数
    loadinfo.php:读取个人信息的函数
    loadmer.php:mer 页面的动态填写函数
    loadshop.php:读取商家信息的函数
    login.php:用户/商家登陆用函数
    mysql.php:连接数据库所用的函数
    pay.php:处理订单结算的函数
    register.php:实现登陆功能的函数
    search.php:实现搜索功能的函数
    shopitem.php:实现商户页面商品填充的函数
    test.php:单纯的测试用函数
    updateitem.php:更新商品信息的函数
    updateshop.php:更新商户信息的函数
    updateuser.php:更新用户信息的函数
    userorder.php:读取用户所有订单的函数

    九、总结通过这次数据库课设的实践,我们对于课上所讲授的数据库知识有了更进一步的了解。不仅亲手从模型开始进行了完整的数据库设计流程,还亲自实现了事务处理、触发器、索引、存储过程等机制,对于课上学习的内容进行了进一步的巩固和加强,同时也深刻地体会到了“实践”对于计算机科学这个学科的重要性。纸上得来终觉浅,绝知此事要躬行。由于刘瑞老师课上讲授的 SQL 语句多为 T-SQL,而且之前的题目大多都是用笔写 SQL,这导致我们的数据库编程经验时期是非常短缺的。对于手写 SQL 语句中的小错误,我们常常会归结于自己的马虎,但是等真正敲起代码来的时候,一个小小的错误都会导致 SQL 语句无法执行。不能熟练使用的结果就是提笔就报错,然后进入漫长的 debug 阶段,在经过比较漫长的熟悉过程之后,开发的效率才慢慢提高了起来。在数据库编程面前,细心,才是保证开发效率的唯一捷径。
    9 评论 54 下载 2019-12-29 14:46:34 下载需要15点积分
  • 基于Java的远程视频会议系统

    研究背景随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息,使越来越多的人开始通过互联网享受到网上生活、远程医疗、远程通讯的乐趣,缩短了时区和地域的距离。远程通信的各种优势给人们带来的方便也促使人们对这一领域进行更加深入的探索。基于不同平台以及不同开发工具的网络视频会议系统层出不穷。
    视频会议系统在我国开始发展的初期,政府部门的应用就占据了重要位置,覆盖中央到直辖市和各省会城市的国家公众视频会议骨干网已经完工。自1994年9月投入使用以来,国务院等机关先后利用该网召开了三百多次全国范围的可视通讯会议。整个系统运行情况良好,得到了国家领导人和各部委领导的高度赞扬。近年来随着电子政务工程的逐步推进,政府部门更加关注视频会议系统建设。在经济发达地区(例如浙江、山东、广东),视频会议网已覆盖到地市级城市,有的甚至覆盖到县一级。除各级政府之外,其它诸如检察院、法院、公安和和水利等职能部门也是视频会议系统的重要用户。
    视频会议系统还更广泛的应用于现代企业中。信息技术的迅猛发展,改变了各行各业的传统工作模式。信息的无限量扩大,交通工具的便捷,互联网技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由于信息技术的发展带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。视频会议系统的可以跨越空间距离、灵活多样的面对面的交互,适应现代社会的方便、快捷、高效、快节奏,它为用户带来的经济效益,使视频会议系统的使用正在向各行各业渗透,给这一市场注入了新的活力。
    1 系统概要设计1.1 系统总体设计1.1.1 系统流程​ 服务器端流程如图所示:

    ​ 客户端流程如图 所示:

    1.1.2 系统结构通过学习和研究,我们通过多播技术实现了多点对多点的视频会议系统。整个系统包括这样几个模块:
    文本聊天模块:该功能是网络视频会议的最基本的功能。通过该模块实现了会议成员的聊天通信。首先,每个会议职员通过与服务器连接加入到会议组,同时通过给自己取昵称将自己的昵称发送给服务器,让会议组的每个成员了解自己的身份。会议成员在聊天的时候不是将文本发送给某个人,而是发送给整个会议组。
    视频通信模块:该功能利用JMF软件开发包,基于RTP协议实时发送和接受视频流。并且利用JMF多媒体组件构造播放器,进行实时播放。在实现了点对点的基本视频传输的基础上,我们应用了多播技术。当某个会议成员开始进行视频连接以后,他能通过视频会议系统看到所有其他已经建立视频连接会议成员。
    1.2 系统接口的概要设计1.2.1 服务器端设计系统的服务器端的设计只需显示在线的用户,简单设计图示如下:

    1.2.2 客户端设计系统客户端的设计如下:

    显示在线列表;
    显示界面中用户视频;
    用户聊天文本框;
    视频连接及退出按钮。

    简单设计图示如下:

    2 系统详细设计本系统的详细设计根据概要设计中所划分的各个功能模块进行详细的阐述:
    2.1 文本聊天模块的详细设计本系统要运用Java网络编程中Socket层次,即传统网络编程常采用的方式,通过Client/Server(客户端/服务器端)机构的应用程序之间建立Socket套接字连接,然后在连接之上进行数据通信。
    通过SocketChannel建立基于UDP的无阻塞连接。创建一个无阻塞服务器,让每个客户端与之相连。某个客户端将文本消息发送给无阻塞的服务器,服务器在将这条文本消息组播给各个与之相连的客户端。
    数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。
    基于UDP的Socket编程流程图如下:

    服务器:
    serverSocketChannel = ServerSocketChannel.open();//打开连接通道serverSocketChannel.socket().bind(new InetSocketAddress(12345));//绑定IP与端口号getConnection();//接收连接请求客户端:socketChannel = SocketChannel.open();打开连接通道socketChannel.connect(new InetSocketAddress(InetAddress.getByName(serverAddress),12345));//连接到服务器receiveMessage = new ReceivingThread();//构造接收信息线程receiveMessage.start();//运行线程socketChannel.write(writeBuffer);//往通道里写入消息socketChannel.read(readBuffer);//读取通道中消息
    2.2 视频通信模块的详细设计2.2.1 网络视频会议系统结构的详细设计网络视频会议系统其根本目的是会议。会议的基本特征就是,参与会议的每个成员都可以了解到其他成员的状况,每个成员必须到场,然后进行交流,并且每个成员都应该看到所有的交流内容。在这个根本目的完成的基础上,才可以使网络视频会议的特点得以发挥。所以,我们的视频会议系统采用了多播的方法,使得会议的每个成员都可以得到会议的所有信息。
    通过对视频会议基本特点的分析,系统结构图如下图所示:

    2.2.2 视音频传输的详细设计使用JMF API的RTP协议实现网络多媒体程序,可以分为两个部分,一部分是通过网络发送数据的主机端程序,另一部分是接收数据的客户端程序。
    在JMF API中定义了几个与RTP有关的包,即javax.media.rtp、javax.media.rtp.enent、javax.media.rtp.rtcp登包,通过这些包提供的API,可以实现RTP数据流的传输、接受和回放。基于JMF多媒体数据流RTP传输、接受和回放过程图如下:

    数据可以来自于多媒体文件,如视频文件,也可以来自于音/视频采集设备,如声卡、摄像头等。这些数据源的位置不同,格式不同,JMF通过一个称为媒体定位器(Media—Locator)的类对相应的数据源进行定位,MediaLocator对象内仔储了数据源的位置信息。JMF管理器(Manager)根据媒体定位器提供的信息创建数据源。这个数据源和文件、摄像头等物理数据源不同,是一个抽象的概念,是多种不同类型数据源的抽象。这样,JMF可以隐藏底层细节,使编程者在编程过程中不再考虑数据的具体来源和位置,只需考虑数据的格式、速率等信息就行了。
    数据源生成后 ,可以直接交给播放器(Player),设定格式后就可以在本机播放了。但若要将数据流存储成其他格式的文件或者通过 RTP协议在网络上传输 ,则需要对其进行再处理。再处理工作由处理器(Processor)完成 ,处理后的数据源可以存储,也可以在网络上传输。通过 RTP进行传输前 ,需要建立会话管理器(SessionManager),建立 RTP会话后再开始发送流,发送时会打开两个端口,一个用于传输 RTP数据流;另一个用来传输 RTCP包。
    多媒体数据流的接收过程是发送的逆过程。由RTP信道获得的数据流作为接收端的数据源,对数据源处理后便可以实现数据流的回放、存储,甚至再发送。
    详细设计传输过程:
    dsVideo = createDataSource(vf);//创建视频数据源dsAudio = createDataSource(af);//创建音频数据源devices = CaptureDeviceManager.getDeviceList(format);//得到类型为format的设备的清单,存放在表devices中ds = Manager.createDataSource(ml);//通过媒体定位器创建数据源RTPTransmit rtpTransmit = new RTPTransmit(processor,ipAddr,port);//构造RTP会话result = createProcessor();// 产生一个处理器result = createTransmitter();产生RTP会话,将处理器输出的数据传给指定的IP地址的指定的端口号processor.start();// 让处理器开始传输
    2.2.3 多播的详细设计多播基本思想是一个源IP主机只进行一次发送,多个接收者(目标 IP主机)可以接收到相同数据的一个拷贝。但是多个接收者必须都注册加入同一多播组。IP多播服务是一种开放的服务模型,任何主机可以随时加入或退出某个多播组。
    利用这种思想,可以实现会议中的多点对多点的视频传输,已达到组织会议的目的。多播系统结构图:多播实现过程:
    group = InetAddress.getByName(MuiltAddr); //设置组播地址socket = new MulticastSocket(port); //创建MulticastSocket类并将端口与之关联socket.joinGroup(group); //加入此组播组
    2.3 系统界面的详细设计本系统在进行界面设计的时候考虑了系统的功能,对各功能模块进行详细合理的布局:

    把一些功能加到界面中的菜单中,有连接服务器,连接视频,断开连接,退出等子菜单项。
    在界面中添加在线用户列表框,用以显示在线的用户。
    在界面中用一个大的Panel 装载举行会议时的各个用户的视频框。
    在界面中添加实现简单聊天室功能的聊天文本框。
    在界面底端有一些功能按钮,如连接视频,发送信息等。

    3 系统实现3.1 系统实现3.1.1 服务器端套接字建立数据通讯是双向的,客户端通过套接字请求数据通讯后,服务器端需要有一个响应客户端请求通讯的服务程序,该服务器程序应用ServerSocket类完成与客户端的通讯。
    ServerSocket类用来监听和响应客户端的连接请求,并接受客户端发送的数据信息。ServerSocket类在服务器端等待其他机器同它的连接,一旦客户端程序建立一个套接字连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端套接字对象,以便进行直接通讯。从两台计算机连接成功起,服务器端与客户端就得到了一个真正的“套接字-套接字”连接,此时利用Socket类中的getInputStream()及getOutputStream()方法从每端的套接字产生对应的InputStream和OutputStream对象,并将套接字数据流封装到缓冲区内以便进行两台机器之间的数据通讯。
    serverSocketChannel = ServerSocketChannel.open();//打开连接通道serverSocketChannel.socket().bind(new InetSocketAddress(12345));//绑定IP与端口号getConnection();//接收连接请求charSet = Charset.forName("UTF-8");//开启服务器套接字通道serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(newInetSocketAddress(12345)); serverSocketChannel.configureBlocking(false);//设置阻塞模式为非阻塞模式等待一个连接
    3.1.2 客户端套接字建立客户端使用Socket类的方法建立(类似于服务器端),客户端向套接字对象中的数据流输出和获取数据。客户端程序试图与服务器之间在Socket层次上建立一个连接,通过套接字输入流读取方法从套接字数据流中获取服务器信息,以及写入数据到套接字输出流中向服务器发送信息,并且等待服务器的答复。如果连接成功,则该客户端程序通过套接字与服务器可以进行正常的数据交换。
    socketChannel = SocketChannel.open();打开连接通道socketChannel.connect(new InetSocketAddress(InetAddress.getByName(serverAddress),12345));//连接到服务器receiveMessage = new ReceivingThread();//构造接收信息线程receiveMessage.start();//运行线程socketChannel.write(writeBuffer);//往通道里写入消息socketChannel.read(readBuffer);//读取通道中消息
    3.1.3 视音频发送视音频数据以RTP实时流的形式发送出去,通过会话管理器(Session Manager)传输RTP数据的步骤为:

    产生一个JMF处理器(Processor),为每一种RTP格式设置相应的轨迹格式。
    从处理器获取输出数据源。
    会话管理器产生一个发送数据流,即以数据源和序号作为参数调用会话管理器的createSendStream()方
    开始会话传输。
    通过监听ControllerEvent事件控制会话的过程。
    停止会话,删除会话管理器。

    定义以下内容:
    // 媒体定位 IP 端口 处理器 会话管理器 输出数据源private MediaLocator Locator;private String IpAddress;private int portBase;private Processor processor=null;private RTPManger rtpMgrs[];private DataSource dataOutput=null;
    具体实现函数如下:
    //发送数据函数public RTPTransmit(Processor processor,String ipAddress, String pb){}//为媒体定位器产生一个处理器private String createProcessor(){}// 为处理器的每一个媒体磁道产生一个RTP会话private String createTransmitter() {}// 让处理器开始传输public synchronized String start(){}// 停止传输 public void stop(){} //组播线程类class CreateJoinMuiltcastThread extends Thread {}//处理器的状态监听器类class StateListener implements ControllerListener {}
    3.1.4 视音频接收接收网络实时媒体数据流是通过java.media包中定义的各种RTP事件监听器和RTP事件处理类来处理和控制的,使用java.media包中的Player类可以实时播放网络多媒体数据流,java.media包中的处理媒体流接收和播放完成了整个接收RTP数据的过程。接收部分程序为每一种新接收到的媒体数据流产生一个播放器,一边接收媒体流数据,一边将媒体数据播放出来,其实现分为以下几个步骤:

    实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。
    当接收到NewReceiveStreamEvent事件后,通过事件获取接收媒体数据流(ReceiveStream),然后通过接收媒体数据流获取RTP数据源(DataSource)。
    将数据源传给Manager.createPlayer()产生一个播放器。
    给播放器添加监听器,等到播放器实现后,即可显示播放数据。

    定义以下内容:
    String sessions[] = null; // RTP会话字符串数组RTPManager mgrs[] = null; // RTP管理器数组Vector playerPanels = null; // 管理播放器窗口的向量boolean dataReceived = false; // 是否接收到数据的标志Object dataSync = new Object(); // 同步对象
    具体实现函数如下:
    //接收数据实现函数public Receive(String sessions[]) {}//初始化RTP会话,准备接收数据protected boolean initialize(){}//关闭播放窗口protected void close(){}//判断数据是否接收完成 public boolean isDone() {}// 通过播放器查找播放窗口PlayerPanel find(Player p) {}// 通过接收数据流查找播放窗口PlayerPanel find(ReceiveStream strm) {}//实现ReceiveStreamListener监听接口public synchronized void update( ReceiveStreamEvent evt) {}
    参考文献[1] H.M.Deitel P.J.Deitel,Java 《程序设计教程》 清华大学出版社
    [2] 彭波 孙一林 《Java多媒体技术》 清华大学出版社
    [3] 刘成德 李 祥 《基IPMulticast/JMF的多媒体网络会议系统的设计与实现》
    [4] Elliotte Rusty Harold 《Java网络编程》 中国电力出版社
    [5] 毛黎莉 潘建国 《基于JMF的RTP应用分析与研究》
    [6] 周静 邹北骥 《利用JMF 实现RTP流的传输与播放》
    6 评论 138 下载 2019-02-06 08:38:23 下载需要11点积分
  • 基于Jsp和MySql的汽车租赁系统

    一、引言汽车租赁管理系统是基于MVC三层架构完成,使用Java语言开发,主要应用Jsp完成前台界面部分,Servlet MVC完成后台逻辑部分。
    本系统的设计从现实角度出发,根据实际汽车租赁信息管理系统的实际需求,采用模块化设计,便于系统组合和修改,又便于技术维护人员更新、维护;以及根据用户需求进行数据的维护与更新。系统的设计过程由概述、需求分析、技术方案、总体设计、详细设计、软件测试、总结等部分构成。
    二、需求分析汽车租赁业被称为交通运输服务行,它因为无须办理保险、无须年检维修、车型可随意更换等优点,以租车代替买车来控制企业成本,这种在外企中十分流行的管理方式,正慢慢受到国内企事业单位和个人用户的青睐。 汽车租赁是指将汽车的资产使用权从拥有权中分开,出租人具有资产所有权,承租人拥有资产使用权,出租人与承租人签订租赁合同,以交换使用权利的一种交易形式。
    2.1系统角色本系统有四个角色分别为:超级管理员,管理员,业务员,经理,分别具有不同的权限对汽车信息、顾客信息进行编辑。
    2.2 系统权限不同角色登录就有着不同的权限:

    超级管理员:具有系统管理、基础数据管理、车辆预定管理、核心业务管理和统计管理的权限。其中系统管理包括用户管理、角色管理;基础数据管理包括客户类型管理、汽车品牌类型管理、汽车基本信息管理和客户基本信息管理;车辆预定管理包括顾客基本信息管理和汽车信息管理;核心业务管理包括租赁管理和归还管理;统计管理包括统计车辆管理和用户统计管理
    管理员:具有用户管理、车辆基础信息管理、客户基础信息管理的权限
    业务员:具有车辆预定管理和车辆取消预订管理的权限
    每个角色:都有个人信息管理权限,超级管理员可以修改个人基本信息,包括密码修改,更改管理员、业务员、经理的权限,同时可以添加所有的软件用户

    2.3 数据库需求2.3.1 数据库E-R图本系统的主要的实体有用户,汽车故障,汽车。它们对应的实体ER图如下所示。

    2.3.2系统管理模块该系统数据库共有九个实体,实体属性图如下面所示。
    用户信息实体图如图2-2所示:

    角色信息实体图如图2-3所示:

    菜单信息实体图如图2-4所示:

    管理员信息实体图如图2-5所示:

    员工信息实体图如图2-6所示:

    汽车信息实体图如图2-7所示:

    2.4 功能列表
    三、概要设计3.1 系统功能模块分析按照需求分析中的功能列表,以及对每个模块的功能分析,可以整理得出系统的功能模块总体结构如图3-1所示:

    3.1.1 系统管理系统管理包括用户管理和角色管理两个子模块。用户管理可以对用户进行增删改查,并能为用户分配会员角色;同样,角色管理也具有增删改查的功能,且能为角色分配权限。
    3.1.2 基础数据管理基础数据管理包括客户类型管理、车辆品牌管理、车辆基础信息管理和客户基础信息管理。客户类型管理可以更新会员的分类信息、折扣信息;车辆品牌管理可以对已有车辆的品牌信息进行增删改查;车辆基础信息管理可以对车辆的基本信息进行添加、修改、查询、删除;客户基础信息管理可以对客户的基本信息进行增删改查。基础数据管理主要用于对车辆、客户的信息以及相关的信息进行管理。
    3.1.3 车辆预定管理车辆预定管理包括车辆预定管理和车辆取消预订管理;车辆预定管理是对车辆预定状态的更新,可以修改车辆的状态显示信息;车辆取消预订管理则是对车辆预定状态的注销。
    3.1.4 核心业务管理超级管理员可以对核心业务进行操作,租赁管理可以对所有正在租赁的汽车进行管理,归还管理用于记录已归还的汽车。
    3.1.5 统计管理统计管理包括统计车辆管理和用户统计管理,统计车辆管理用于对本月已租赁车辆生成统计报表,用户统计管理则用于统计本月租借车辆的用户的人数。
    3.2 系统用例在汽车租赁管理系统中包含四类角色,分别为超级管理员、管理员、业务员和经理。
    3.2.1 系统管理员超级管理员的功能为核心业务管理和统计管理。超级管理员的用例如图4-2所示:

    3.2.2 管理员管理员的功能是对用户及汽车的基本信息进行增删改查的管理。管理员的用例如图4-3所示:

    3.2.3 业务员业务员的功能是对目前可租借汽车的查询以及预定和取消预订汽车。业务员的用例如图4-4所示:

    3.2.4 经理经理的功能是对车辆统计报表以及客户类型的更新。经理的用例如图4-5所示:

    3.3 数据库设计web_sys_user:用户信息表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    user_id
    用户id
    int


    自增长


    account
    账号
    varchar(50)


    非空


    password
    密码
    varchar(50)


    非空


    user_name
    用户名
    varchar(50)


    非空


    sex
    性别
    varchar(50)





    telphone
    联系方式
    varchar(50)





    user_status
    状态
    varchar(1)


    默认为1


    fk_role_id
    角色id
    varchar(50)





    web_sys_role:角色信息表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    role_id
    角色id
    int


    自增长


    role_name
    角色名称
    varchar(50)


    非空


    role_status
    状态
    varchar(1)


    默认为1


    photo
    图片
    varchar(50)





    role_desc
    描述
    varchar(50)





    web_sys_menu:菜单信息表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    menu_id
    菜单id
    int


    自增长


    menu_name
    菜单名称
    varchar(50)


    非空


    parent_id
    父节点
    varchar(50)





    url
    路径
    varchar(50)





    role_link_menu:角色菜单中间表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    link_id
    连接id
    int


    自增长


    role_fk_id
    角色id
    int


    非空


    menu_fk_id
    菜单id
    int


    非空



    car:汽车租借表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    car_id
    汽车id
    int


    自增长


    car_code
    车牌号
    varchar(50)


    非空


    car_name
    车名
    varchar(50)


    非空


    car_color
    颜色
    varchar(50)





    car_info
    租借人
    varchar(50)





    car_fk_type
    车辆id
    varchar(50)





    car_type:汽车类型表



    字段名称
    含义
    数据类型
    是否主键
    是否外键
    其他约束




    type_id
    汽车品牌id
    int


    自增长


    type_name
    品牌名称
    varchar(50)


    非空


    type_desc
    汽车描述
    varchar(225)





    四、详细设计4.1系统类图使用MyEclipse开发工具截出系统的主要类图。
    客户类型的主要类图如图所示:

    租车服务主要类图如图所示:

    4.2用户登录4.2.1 登录实现用户登录信息需要满足客户端校验和服务端校验才能登录成功。当用户名和密码都正确时,先从用户和角色的中间表遍历该用户扮演的角色,再根据角色从角色和权限的中间表遍历该用户拥有的功能权限,最终,将用户的个人信息及其具有的功能显示到首页。
    4.2.2 异常处理异常主要包括用户名或密码为空、用户名或密码在数据库中不存在。根据异常原因,将在对应的输入框后面显示提示信息。
    4.2.3 主要实现方法
    在登陆界面设置按钮,并且利用Onclick连接事件toSub(),进行判断用户名和密码是否为空
    在web.xml文件中配置相应文件,点击登录按钮,将输入的表单信息提交到UserLoginServlet中。在Login.jsp中将传过来的用户名和密码与数据库用户表中的信息进行比较,满足校验,根据用户名获取相应角色,再根据角色获取相关权限,成功登录系统主界面main.jsp。登录失败,返回Login.jsp

    登录流程如图4-4所示:

    4.3 基本信息管理基本信息管理包括客户类型管理、车辆品牌管理、车辆基础信息管理、客户基础信息管理。
    4.3.1 租借信息添加实现添加租借汽车的基本信息需要输入租借人基本信息租借车辆品牌租借车辆车牌号等。添加成功时,主键id自动生成。
    4.3.2 异常处理异常主要包括输入信息为空、输入信息格式不正确。根据异常原因,将在对应的输入框后面显示提示信息。
    4.3.3 主要实现方法用Onclick将按钮连接事件触发相应的方法进行校验。验证通过进行数据添加,故障添加流程图,如图5-6所示:

    4.4 车辆预定管理车辆预定管理包括车辆预定管理和车辆取消预订管理。
    4.4.1 车辆预定和取消预订编辑实现选择编辑或注销按钮触发相应的事件,进入编辑页面进行编辑或者进行注销操作。操作完成后更新页面和数据库。
    4.4.2 异常处理异常主要包括输入信息为空、输入信息格式不正确。根据异常原因,将在对应的输入框后面显示提示信息。是否进行注销操作的友好界面提示。
    4.4.3 主要实现方法用Onclick将按钮连接点击事件触发相应的方法进行校验。车辆编辑流程图,如图4-7所示:

    五、系统实现5.1 登录界面
    5.2 初始界面
    5.3 添加租车信息界面
    5.4 菜单栏界面
    5.5 添加汽车预订信息
    六、总结经过近两个星期的努力,终于设计出一个达到程序设计要求的数据库。其功能完整,用户界面良好,但是也存在着某些缺陷。需要进一步的得到改善纠正。总的来说基本达到了用户的基本要求。 这一段时间的工作努力,最后的结果固重要,但更重要的是它让自己了解了信息系统设计的一般过程。在接受客户的一个项目的时候,首先是进行系统分析。既首先分析其以后的销售情况以及技术可行性。如果二者可行,我们接下来做的就是总体设计。我们首先必须听取客户的要求,将其提出的功能按某种方式划分为几种模块。这就是整体设计。在对每一个模块进行细化形成最为简单的模块。然后是考虑每一细化模块的算法并将其用语言刻画出来。这就是详细设计。这就迈出了最为关键的一步。剩下的就是编译测试阶段。这是编程的必经阶段,也是我们劳动结果的验金石。只有得到我们期望的结果我们才算真正完成了任务。最后是软件的维护。在软件的使用过程中不可避免地会出现一些错误,因此维护便是必不可少的。这便是完成一个项目必经的过程。
    参考文献[1] 张志峰,郑璐娟,张建伟,宋胜利.JSP程序设计与项目实训教程[M].北京:清华大学出版社,2012.
    [2] 隋春荣,耿超,董万全.JSP程序开发实用教程[M].北京:清华大学出版社,2013.
    [3] 李颖, 赵菲, 刘长勇,等. 项目教学法在《Java Web程序设计》课程中的应用[J]. 科技创新与应用, 2013, (13):284-285.
    [4] 薛倩.基于JSP技术企业动态网站系统设计与实现[J].北京:微型电脑应用,2014, 30(2):14-17. DOI:10.3969/j.issn.1007-757X.2014.02.004.
    [5] 李峰, 刘彦隆. 基于SSH框架与jQuery技术的JavaWeb开发应用[J]. 科技情报开发与经济, 2010, 20(6):106-108. DOI:10.3969/j.issn.1005-6033.2010.06.047.
    [6] 付国辉. 企业级Sql Server数据库的性能优化研究探讨[D]. 吉林大学, 2013.
    [7] 程茂, 温静, 吴玉洁. 《软件测试》课程的教学研究[J]. 河北师范大学学报:教育科学版, 2010, 12(4):117-120.
    [8] 孙卫琴,李洪成.Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2010.
    [9] 刘京华.Java Web整合开发王者归来[M].北京:清华大学出版社,2010.
    2 评论 20 下载 2020-12-22 11:12:14 下载需要12点积分
  • 基于Java的学生选课管理系统

    摘 要Java是一种被广泛使用的编程语言,它的主要特点在于它是一种既面向对象又可跨平台的语言。Java语言通过为每个计算机系统提供一个叫做Java虚拟机的环境来实现跨平台。Java不但适用于单机应用程序和基于网络的程序,而且还可以用于创建消费者类设备和附件程序。面向对象是一种直观而且程序结构简单的程序设计方法,他比较符合人类认识现实世界的思维方式。其基本思想是把问题看成是由若干个对象组成,这些对象之间是独立的,但是又可以相互配合、连接和协调,从而共同完成整个程序要实现的任务和功能。面向对象的三大特征:封装、继承和多态。继承可以解决编程中代码冗余的问题,继承的最基本作用就是使代码可重用,增加软件的可扩充性。面向对象的优点:

    与人类的思维习惯一致
    信息隐藏,提高了程序的可维护性和安全性
    提高了程序的可重用性

    Java中只支持单继承,既每个类只能有一个直接父类。一个普通类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口。
    我做的这个程序是学生选课管理系统,这个程序是由我一个人完成的。由于时间比较短且具体实现不需要用到Java的全部语法和功能,所以我做的这个程序不能体现Java的全部语法和功能。我的这个程序定义了三个类,他们分别是:增添类、修改类、删除类和管理员类。并且把这四个类放到了一个叫学生选课系统的包里面,“包”在Java中有很重要的意义,包的声明必须是Java源文件中的第一条非注释性语句,设计包需要与文件系统结构相对应。包的作用有:

    包允许将类组合成较小的单元(类似文件夹),易于找到和使用相应的类文件
    防止命名冲突,Java中只有在不同的包中的类才能重名
    包允许在更广的范围内保护类、数据和方法

    根据访问规则,包外的代码有可能不能访问该类。另外数组的应用在我的程序中也有很大的体现,数组是Java中的很重要的语法。数组是用来储存一组相同类型数据的数据结构。当数组初始化完毕后,Java为数组在内存中分配了一段连续的空间,其在内存中开辟的空间也随之固定,此时的数组的长度就不能再发生改变。即使数组中没有保持任何数据,数组所占据的空间依然存在。数组的数据类型用于确定分配的每个空间的大小。JDK中提供一个用于操作数组的工具类,既Arrays类,位于Java.util包中。该类提供了一系列的方法来操作数组,如排序、复制、比较、填充等,用户直接调用这些方法即可,不需要自己编码实现,降低了开发难度。在我的这个程序中,我就用到了toString(arry)这个方法,很方便的实现了把数组中保存的课程信息用一个字符串输出,既方便又快捷。另外for循环在我的程序中也有很重要的应用,实现了对数组的遍历输出。
    总之,我们不管干什么都要遵循一定的规则,充分利用资源,在巨人的肩膀上看世界。Java作为一种既面向对象又可跨平台的语言,确实很好用,非常的便捷。
    一、开发背景学生选课在大学是非常常见的一件事情,学生网上选课系统的开发具有十分重要的意义,可以减少大量的人力、物力、财力。为了优化学生选课管理系统,提高学生选课管理系统程序的效率,我在这一背景下开发了这一款学生选课管理系统。
    二、需求分析学生选课管理系统需要实现增添、修改、查询功能,分别由三个功能类来完成,再设计一个管理员类来实现主要功能。
    三、模块说明3.1 增添课程信息模块
    功能描述:此模块的主要功能是实现增添课程信息。系统的用户可增添需要增添的课程名称及相关信息,并将其保存到数组中,增添完毕后会输出所有的课程信息,便于判断增添是否成功,并明确有哪些课程信息,方便用户使用
    输入:需要增添的课程名称及相关信息
    输出:增添后textbooks数组中,增添后的所有的课程名称及相关信息

    3.2 修改课程信息模块
    功能描述:此模块的主要功能是实现修改课程信息。系统的用户可修改需要修改的课程名称及相关信息,并将其保存到数组中,修改完毕后会输出所有的课程信息,便于判断修改是否成功,并明确有哪些课程信息,方便用户使用
    输入:需要修改的课程名称及相关信息
    输出:修改后textbooks数组中,修改后的所有的课程名称及相关信息

    3.3 删除课程信息模块
    功能描述:此模块的主要功能是实现删除课程信息。系统的用户可删除需要删除的课程名称及相关信息,并将其保存到数组中,删除完毕后会输出所有的课程信息,便于判断删除是否成功,并明确有哪些课程信息,方便用户使用
    输入:需要删除的课程名称及相关信息
    输出:删除后textbooks数组中,删除后的所有的课程名称及相关信息

    3.4 管理员模块
    功能描述:此模块的主要功能是实现学生选课管理系统的主要功能,包括保存学生的选课信息。系统的用户可根据输出的课程信息选择要选修的课程,选择需要选修的课程名称及相关信息,并将其保存到数组中,方便用户使用
    输入:需要选修的课程名称及相关信息
    输出:可供选择的课程信息;学生已经输入的选修的课程名称及相关信息

    四、详细设计4.1 增添课程设计类
    类名:增添
    继承父类:无
    实现接口:无
    概述:增添需要增添的课程名称及相关信息
    属性及说明:无
    方法及说明:

    for循环语句:实现数组的遍历输出课程名称及相关信息 if判断:找到暂时没有保存课程信息的null的数组的下标值,用于增添所需课程名称及相关信息

    4.2 修改课程设计类
    类名:修改
    继承父类:无
    实现接口:无
    概述:修改需要修改的课程名称及相关信息
    属性及说明:无
    方法及说明:

    for循环语句:实现数组的遍历输出课程名称及相关信息if判断:找到需要修改的课程名称及相关信息所在的数组的下标值,修改所需修改课程名称及相关信息

    4.3 删除课程设计类
    类名:删除
    继承父类:无
    实现接口:无
    概述:删除需要删除的课程名称及相关信息
    属性及说明:无
    方法及说明:

    for循环语句:实现数组的遍历输出课程名称及相关信息if判断:找到需要删除的课程名称及相关信息所在的数组的下标值,删除所需修改课程名称及相关信息

    4.4 管理员设计类
    类名:管理员
    继承父类:无
    实现接口:无
    概述: 实现学生选课管理系统的主要功能,包括保存学生的选课信息
    属性及说明:无
    方法及说明:

    for循环语句:实现数组的遍历输出课程名称及相关信息使用scanner方法:保存学生所选择的课程名称及相关信息

    五、系统实现设置增添、修改、删除三个功能类,以及一个管理员类共同来实现学生选课管理系统。增添类实现课程数目或者内容的增添,定义了一个add变量来储存所需要增添的课程名称,通过for循环遍历textbooks数组,找到null后,将保存在add变量中的课程名称保存到textbooks数组,从而实现了增添功能。修改类实现课程数目或者内容的修改,定义了一个change变量来储存所需要修改的课程名称,通过for循环遍历textbooks数组,找到保存在change变量中的课程名称在textbooks数组的储存空间并且返回它保持在textbooks数组的下标值,将找到的课程名修改成所需要的课程名,从而实现了修改功能。删除类实现课程数目或者内容的删除,定义了一个delete变量来储存所需要删除的课程名称,通过for循环遍历textbooks数组,找到delete变量来储存所需要删除的课程名称后,将保存在delete变量中的课程名称保持在保存到textbooks数组的下标值返回,然后将其置为null,从而实现了删除功能。管理员类实现学生选课管理系统的主要功能,使用了toString(array)方法来将所有的课程名称以字符串的形式输出,通过所输出的课程信息来确定所需要选择的课程,并且将其保存到content数组,通过for循环遍历students list数组,按照顺序依次保存学生的选课信息,从而基本上实现了学生选课管理系统的功能。
    5.1 主界面
    5.2 增添模块
    5.3 修改模块
    5.4 删除模块
    总 结通过这一次课程设计,我基本上重温了一下这一学期所学的Java程序设计基础的内容。在实践时发现想到以前觉得理解了的知识点并没有完全理解,还存在许多的疑问点或者说完全不懂的知识点。这个学生课程管理系统程序是由我独立完成的,虽然存在很大的不足,但是在整个的课程设计中我还是明白了很多的东西。我个人觉得独自完成课程设计的意义更大,因为对于同一件事情不同的人会有不同的看法,而这些看法本身并没有对错,但是不同的看法会产生不一样的行为,所以我个人觉得我们应该独立的完成课程设计。通过这次课程设计我对Java中一些重要的语法有了更加深刻的认识,我觉得我以后应该多编写一些程序,在这个过程中,我们可以系统的运用所学的Java知识,同时也可以让我们对编程产生兴趣,更好的培养我们的学科思维,增强我们的职业素养。面向对象是一种直观而且程序结构简单的程序设计方法,他比较符合人类认识现实世界的思维方式。其基本思想是把问题看成是由若干个对象组成,这些对象之间是独立的,但是又可以相互配合、连接和协调,从而共同完成整个程序要实现的任务和功能。我们可以更好的认识这个世界。人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。知识并不是孤立的,我们应该广泛的学习各个方面的知识。
    参考文献[1] 尹友明. Java语言与Java技术概述[J].中国新技术新产品, 2011(6):99-99.
    [2] 佚名. Java语言编程技术[M]. 1997.
    [3] 邝砾,于美琪,冯文韬,等.基于层次考核的计算机类课程考试改革研究——以Java面向对象程序设计课程为例[J].计算机教育, 2017(1):62-66.
    [4] 杨雪. Java面向对象语言的教学探讨[J].家教世界, 2012(6):52-53.
    [5] H.M.Deitel. Java语言程序设计大全[M]// Java 语言程序设计大全. 1997.
    [6] Y.DanielLiang. Java语言程序设计.基础篇[M]. 2008.
    [7] 杨晓燕.基于应用的Java面向对象程序设计课程研究与教材建设[J].计算机教育, 2012(3):42-45.
    [8] Dennis Kafura. Java面向对象程序设计教程[M]//JAVA面向对象程序设计教程. 2003.
    [9] 佚名.面向对象程序设计与Java语言[M]. 2004.
    1 评论 73 下载 2020-08-09 11:03:08 下载需要8点积分
  • 基于javaEE学生选课系统

    摘 要本人结合学生选课管理的实际需要,完成了对学生选课管理系统的需求分析、功能模块划分、数据库模式分析等,并由此设计了后台数据库以及前台应用程序。
    文中首先对课题背景,数据库基础理论和SQL语言进行了简单的讨论;对学生选课管理系统进行了详细分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。
    系统可以实现学生选课的一些重要功能,如:课程的添加、删除,信息查询、选课、生成课表,以及学生选课管理人员、用户个人信息的维护等。学生选课系统主要是为学生选课的管理提供全面、准确、科学的管理方法,方便快捷地处理选课的管理信息;避免了信息处理错误,提高了信息管理的工作效率,便捷的网上选课,大大地节省人力和物力的开支。
    1. 开发工具选择采用一个开放源代码的、基于Java的可扩展开发平台eclipse作为主要开发工具,以及一个大型关系数据库管理系统SQL Server作为数据管理工具
    2. 开发环境
    开发系统:Win7
    系统开发平台:eclipse5.0
    系统开发语言:javaEE

    3. 本报告的主要内容本报告详细的介绍了学生选课系统的开发过程,主要涉及到的工作如下:选课的一些重要功能,如:课程的添加、删除,信息查询、选课、生成课表,以及学生选课管理人员、用户个人信息的维护,系统的总体设计、系统的概念设计、系统各模块的详细设计、系统运行与测试。
    功能要求:

    用户登录
    查看个人信息
    修改个人信息
    查看个人选课情况
    查看所有课程信息,能够选定课程
    退选课程

    4. 关系型数据库关系数据库由表组成。一个关系是由一个二维表来定义的:表的行保存事物的一组属性数据,表的列定义了事物的属性
    5. 创建数据库表设计如下所示的实体和属性的定义:

    课程信息(课程代号,课程名称,学分)
    学生信息(学号,姓名,性别,出生年月日,专业)
    学生登录信息(学号,用户名,密码,权限代号)
    学生选课信息(学号,课程代号,学期,上课时间,任课老师)
    用户权限(权限名称,权限代号)。

    学生表和专业表是单向多对多的关系专业表与学生表是一对多的关系


    6. 系统总体结构及功能模块划分6.1 功能模块设计
    6.2 struts图
    6.3 系统主要功能实现及代码6.3.1 主页面
    6.3.2 学生信息录入
    6.3.3 所有课程信息
    6.3.4 学生信息查看
    6.3.5 总体图
    总结通过这次课程设计,使我灵活应用所学javaEE知识,,结合javaEE理论知识,编写程序实现系统所需功能。初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法分析和解决问题的能力;并用系统的的观点进行系统设计,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养我们严谨的科学态度和良好的编程风格。进一步加深对SSH框架的知识的理解,并能够利用SSH框架的知识实现教务管理系统。同时在这学期的实验中,培养了以专业的眼光去对待我们系统中的每一段代码,这算是一次不可多得的实践机会。在这一次的实践过程中,个人动手能力,方方面面都得到了一定程度的提高。在这个过程中,我学会了很多学习的方法。而这是日后最实用 也是最宝贵的。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。通过这次课程设计使我明白了自己知识还比较欠缺,只是学习书本知识还是远远不够的,自己不会的东西还有太多,学习需要自己长期的积累,在以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识和实践能力。
    7 评论 148 下载 2019-06-24 17:34:05 下载需要14点积分
  • 基于JAVA实现的坦克大战游戏

    一、课程题目实现一个java版本的坦克大战游戏。
    功能提示:

    游戏要有图形用户界面,界面能够反映游戏所有的细节
    界面中要有坦克,墙,树林,河流
    界面中要有一个“家”,“家”被攻击中则输了游戏
    坦克分两种,敌方和我方
    墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙
    树和河流均只有一种,树林坦克可以通过
    坦克可以发射子弹,敌我方的子弹属性一样
    我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死
    敌方之间不可以杀死对方
    子弹击中坦克要有爆炸,但击中墙不能爆炸
    我方可以吃血包增加生命
    游戏可以暂停,重新开始,游戏帮助等功能

    二、题目分析与设计2.1 需求分析设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。用户可以选择重新开始游戏,退出游戏,暂停游戏和查找游戏帮助。
    界面中包含坦克,树,河流,阻挡墙和游戏用户所要保护的“家”。
    坦克:坦克分为两种,敌方坦克和用户控制的坦克。用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。坦克之间不能穿越,碰撞到后自动调换方向。
    树:界面中要包括树林,作为遮掩物体和修饰物体,以便增加游戏的元素,使得游戏更加贴切人性化。树的数目不限,以游戏整体界面清晰美观来决定数目。
    河流:界面中要包括河流,河流作用与树林相同,同样河流的数目不限,以游戏界面整体美观度来决定数目。
    墙:墙体分为两种,普通的墙和铁墙,普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越。两方的坦克均不能穿越两种墙体,但都可以摧毁普通墙体。普通墙体的数目配合其他元素合理安排,铁墙则不宜过多,不然游戏难度太低甚至因为坦克不能穿越铁墙而使得游戏无法进行下去。
    家:用户方除了有一辆自己的坦克外还有一个要保护的家,家由普通墙体包围,家受到子弹攻击后游戏立即结束,用户方则输了本局游戏。
    子弹:子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。
    爆炸:当子弹射击到坦克身上时,要产生爆炸效果。
    方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
    2.2 具体设计以下的论述均根据上面需求分析的顺序来安排:
    2.2.1 图形用户界面图形用户界面要用到Java课程里的第六章的知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。
    坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。
    在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计,细节问题这里就不赘述。
    2.2.2 界面中的元素界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。
    2.2.3 坦克坦克主要由Tank类来实现。坦克的属性:速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。
    在设计过程中,坦克出现的位置由坐标而定。用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。
    坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。
    Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。
    由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。
    用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。
    2.2.4 树林树林主要是用来做修饰物体的,具有不透明性。由一个Tree类来描述,Tree有两个属性,位置和长宽。树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。
    2.2.5 河流河流的作用与树林类似,这里不再赘述。
    2.2.6 墙体墙体分为普通墙和铁墙。普通墙可以被子弹损坏,而铁墙则不会。
    普通墙
    普通墙有以下几个属性:墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。
    金属墙
    金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。
    2.2.7 家家是由Home类来抽象的,具体的属性有:家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。
    2.2.8 子弹子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。如:imgs.put(“L”, bulletImages[0]);
    类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹。
    接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接return true就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。
    具体代码:
    public boolean hitTanks(List<Tank> tanks) {//当子弹打到坦克时 for (int i = 0; i < tanks.size(); i++) { if (hitTank(tanks.get(i))) { //对每一个坦克,调用hitTank return true; } } return false;}
    子弹打到其他坦克上时用hitTank(Tank t) 方法,子弹打到墙上时用hitWall(CommonWall w)方法,打到金属墙上hitWall(MetalWall w),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。实现如下:
    public boolean hitHome() { //当子弹打到家时 if (this.live && this.getRect().intersects(tc.home.getRect())) { this.live = false; this.tc.home.setLive(false); //当家接受一枪时就死亡 return true; } return false;}
    还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行 t.setLife(t.getLife() - 50); // 受一粒子弹寿命减少50,接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。
    2.2.9 爆炸坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小异。
    2.2.10 菜单功能菜单功能包括游戏的重新开始,暂停,退出等。这些功能的用户界面放在了TankClient的构造方法里,用到的是面板类和相应的监听功能,实现出来很简单。
    2.3 类的介绍Direction是一个枚举类,有L、U、R、D、STOP表示左、上、右、下和静止五个状态。
    River描述河流的类,属性:



    riverWidth
    河流的宽度




    riverLength
    河流的长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    riverImags
    河流的图片


    River(int x, int y, TankClient tc)
    河流的构造方法


    draw(Graphics g)
    画河流的方法


    Rectangle getRect()
    长方形实例


    int getX()
    取得x坐标


    void setX(int x)
    设置x坐标


    int getY()
    取得y坐标


    void setY(int y)
    设置y坐标


    int getRiverWidth()
    取得河流的宽度


    int getRiverLength()
    取得河流的长度



    Home表示用户方的家的类,属性:



    width=30
    家的静态全局宽度




    length=30
    家的静态全局长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    homeImags
    家的图片


    boolean live
    初始存活状态为true 表示家的存活状态


    Home(int x, int y, TankClient tc)
    家的构造方法


    void draw(Graphics g)
    画出家的方法


    Rectangle getRect()
    长方形实例


    void gameOver (Graphics g)
    游戏结束方法,做清理工作和相应的提示


    boolean isLive()
    判断是否存活


    void setLive(boolean live)
    设置存活状态,以便从新开始游戏



    Tree描述树林的类,属性:



    width=30
    树林的静态全局宽度




    length=30
    树林的静态全局长度


    x
    树林在界面中X轴坐标


    y
    树林在界面中Y轴坐标


    TankClient tc
    TankClient对象


    Toolkit tk
    取得界面的控制


    treeImags
    树林的图片


    Tree(int x, int y, TankClient tc)
    家的构造方法


    void draw(Graphics g)
    画出树林的方法



    Bullets描述子弹的类,属性:



    speedX = 10
    子弹的全局静态速度 x轴方向的




    speedY = 10
    子弹的全局静态速度 y轴方向的


    width = 10
    子弹的全局静态宽度


    length = 10
    子弹的全局静态长度


    Direction diretion
    子弹的方向


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    bulletImages
    子弹的图片


    boolean live
    初始存活状态为true 表示家的存活状态


    Bullets(int x, int y, Direction dir)
    子弹的构造方法,带三个参数


    Bullets(int x, int y, boolean good, Direction dir, TankClient tc)
    子弹的构造方法,带五个参数的


    void draw(Graphics g)
    画出子弹的方法


    move()
    刻画子弹运动的方法


    Rectangle getRect()
    长方形实例


    void gameOver (Graphics g)
    游戏结束方法,做清理工作和相应的提示的方法


    boolean isLive()
    判断是否存活


    boolean hitTanks(List<Tank> tanks)·
    子弹打到地方自己的时候的方法


    boolean hitTank(Tank t)
    子弹打到对方的方法


    boolean hitWall(CommonWall w)
    子弹打到普通墙的方法


    boolean hitWall(MetalWall w)
    子弹打到金属墙的方法


    boolean hitHome()
    子弹打到家的方法



    GetBlood血包描述类,属性:



    width=36
    血包的静态全局宽度




    length=36
    血包的静态全局长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Random r
    用于产生随机数


    Toolkit tk
    tk获得用户界面


    bloodImags
    家的图片


    poition
    位置数组


    boolean live
    初始存活状态为false 表示初始化时无血包


    void draw(Graphics g)
    画出血包的方法


    void move()
    血包移动的方法


    Rectangle getRect()
    长方形实例


    boolean isLive()
    判断是否存活,是否有血包


    void setLive(boolean live)
    设置存活状态,设置血包的存在



    CommonWall普通墙的类,属性:



    width=20
    普通墙的静态全局宽度




    length=20
    普通墙的静态全局长度


    x
    普通墙在界面中X轴坐标


    y
    普通墙在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象,因为画墙要取得界面的控制权


    Toolkit tk
    tk获得用户界面


    wallImags
    普通的图片


    CommonWall(int x, int y, TankClient tc)
    普通墙的构造方法,用于传递墙的位置参数和TankClient


    void draw(Graphics g)
    画出普通墙的的方法


    Rectangle getRect()
    长方形实例



    MetalWall金属墙的类,属性:



    width=30
    金属墙的静态全局宽度




    length=30
    金属墙的静态全局长度


    x
    金属墙在界面中X轴坐标


    y
    金属墙在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Toolkit tk
    tk获得用户界面


    wallImags
    金属墙的图片


    MetalWall(int x, int y, TankClient tc)
    金属墙的构造方法,用于传递墙的位置参数和TankClient


    void draw(Graphics g)
    画出金属墙的的方法


    Rectangle getRect()
    长方形实例



    BombTank坦克爆炸类,属性:



    x
    坦克爆炸效果在界面中X轴坐标




    y
    坦克爆炸效果在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Toolkit tk
    tk获得用户界面


    Image[] imgs
    爆炸效果的图片


    BombTank(int x, int y, TankClient tc)
    爆炸效果的构造方法,用于传递爆炸效果的位置参数和TankClient


    void draw(Graphics g)
    画出爆炸效果的的方法



    Tank描述Tank的类,属性:



    speedX = 6
    坦克的全局静态速度 x轴方向的




    speedY = 6
    坦克的全局静态速度 y轴方向的


    width = 35
    坦克的全局静态宽度


    length = 35
    坦克的全局静态长度


    Direction diretion
    坦克的状态 ,初始化为静止


    Direction Kdirection
    坦克的方向,初始化为向上


    Int x
    X轴坐标


    Int y
    Y轴坐标


    int oldX
    旧状态的X轴坐标


    int oldY
    旧状态的Y轴坐标


    boolean live
    坦克是否存活,初始化为活着的


    TankClient tc
    TankClient对象


    int life
    初始化生命值为200


    Random r
    随机数,用于控制坦克的方向


    int step
    路径


    Image[] tankImags
    各个方向坦克的图片数组集合


    Tank(int x, int y, boolean good)
    坦克的构造方法1 ,带三个参数


    Tank(int x, int y, boolean good, Direction dir, TankClient tc)
    坦克的构造方法2 ,带五个参数的


    void draw(Graphics g)
    画出坦克的方法


    move()
    描述坦克运动方向的方法


    void changToOldDir()
    转换到旧方向,


    void keyPressed(KeyEvent e)
    键盘监听方法


    void decideDirection()
    决定移动方向方法


    void keyReleased(KeyEvent e)
    监听键盘释放方法


    Bullets fire()
    坦克开火方法


    Rectangle getRect()
    长方形实例的方法


    boolean isLive()
    判断是否存活的方法


    void setLive(boolean live)
    设置坦克存活方法


    boolean isGood()
    用于返回是否是good状态


    boolean collideWithWall(CommonWall w)
    坦克碰到普通墙的解决方法


    boolean collideWithWall(MetalWall w)
    坦克碰到金属墙的解决方法


    boolean collideRiver(River r)
    坦克碰到河流的解决方法


    boolean collideHome(Home h)
    坦克碰到家的解决方法


    Boolean collideWithTanks(java.util.List <Tank> tanks)
    坦克撞到坦克的解决方法


    int getLife()
    获得坦克的生命状态的方法


    void setLife(int life)
    设置坦克的生命状态的方法


    boolean eat(GetBlood b)
    坦克吃红心血包的方法


    int getX()
    确定X的位置的get方法


    int getY()
    确定Y的位置的get方法



    TankClient坦克用户类,继承Frame,实现ActionListener接口。
    实例化各个类的容器:
    List<River> theRiver = new ArrayList<River>();List<Tank> tanks = new ArrayList<Tank>();List<BombTank> bombTanks = new ArrayList<BombTank>();List<Bullets> bullets = new ArrayList<Bullets>();List<Tree> trees = new ArrayList<Tree>();List<CommonWall> homeWall = new ArrayList<CommonWall>(); // 实例化对象容器List<CommonWall> otherWall = new ArrayList<CommonWall>();List<MetalWall> metalWall = new ArrayList<MetalWall>();
    下面列表只列出主要方法和变量,属性:



    int Fram_width
    游戏用户界面的全局静态变量宽度,初始化为800




    int Fram_length
    游戏用户界面的全局静态变量长度,初始化为600


    void update(Graphics g)
    图形用户界面的更新方法


    void framPaint(Graphics g)
    画图形用户界面的方法,需要重画的界面元素都在这个方法里面


    void actionPerformed(ActionEvent e)
    监听菜单项的方法


    static void main(String[] args)
    主函数,启动整个程序



    用户类主要是综合调用各个类来协作完成完成游戏的设计。
    2.4 程序流程逻辑图下图是程序运行的逻辑流程图,只是表示逻辑,并没有具体到每一个细节:

    2.5 开发环境Myeclipse
    三、测试分析3.1 阐述扩展包本程序没有用到SUM的扩展包,也未涉及到数据库的建立
    3.2 程序效果图测试3.2.1 菜单项测试菜单项可以选择开始新游戏,退出,暂停,继续,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!
    菜单效果图

    开始新游戏功能测试

    当点击确认后开始新游戏,当点击取消后恢复到原来的页面。这里不再附图给出点击确定和取消后的效果。
    暂停功能测试

    帮助模块测试图

    退出功能测试

    点击确认后将退出游戏,点击取消后不会退出游戏。
    3.2.2 游戏信息测试游戏标题栏给出游戏名称和制作人相关信息

    3.2.3 子弹射击到对方坦克后爆炸效果测试
    图中的红色类似爆炸状的图像是用户方击中地方坦克后的爆炸效果显示
    3.2.4 子弹撞击到普通墙后,会使得墙消失一块的测试
    图中画红箭头的地方时受到子弹攻击后的效果。墙体被破坏。
    3.2.5 金属墙受到子弹攻击的测试如图为子弹攻击金属墙体前:

    如右图为子弹攻击金属墙后的效果图:

    综上两个可以看出,金属墙都到子弹的攻击后不会被损毁,但是当在把程序中子弹碰撞金属墙的语句改变后,会损毁金属墙!如下:
    原来的代码段
    public boolean hitWall(MetalWall w) { //子弹打到金属墙上 if (this.live && this.getRect().intersects(w.getRect())) { this.live = false; return true; } return false;}
    修改后的代码段
    public boolean hitWall(MetalWall w) { //子弹打到金属墙上 if (this.live && this.getRect().intersects(w.getRect())) { this.live = false; this.tc.metalWall.remove(w); //子弹可以穿越金属墙了 return true; } return false;}
    修改后的效果:从下图可以看出,修改后金属墙也可以被摧毁!

    3.2.6 血包效果图血包会随机的移动,以下是血包所在的两次不同位置:
    所在位置1

    所在位置2

    3.2.7 坦克吃血包增加生命值测试没有吃血包前:可以看出血包在用户方附近,当用户方去接近血包时,就可以增加生命值。

    吃完血包后加满生命值:

    3.2.8 当家被攻击后结束游戏
    游戏结束是调用gameover()方法,在方法里面会清除所有的页面元素。
    3.2.9 快捷键的测试R键为重置游戏:如下为重新开始后的页面:

    提示:由于上下左右和开火等快捷方式键都是动态的效果,所以这里不方便给出,用户可以自行测试!
    3.2.10 坦克撞击边缘的效果撞击前

    撞击后

    提示:这里只给出撞击边缘的效果,其他坦克撞击坦克,家,普通墙,金属墙等效果用户可以自行测试!
    3.2.11 用户赢得游戏后的效果测试
    注释:由于坦克大战的画面都是动态的,所以不可能全部截图来测试每一个功能,如有需要,用户可以自行测试。
    下面改变程序中的一些典型的数据,看修改后的效果:
    3.3 典型数据测试3.3.1 家的位置测试由于程序中的界面位置是严格嵌套设计的,即家是刚好落在它外面的一层保护墙能,当修改家原来的位置参数Home home = new Home(373, 545, this);后,会走出达不到预期的效果:如下图:

    图示为把373改为了450后的效果!
    3.3.2 坦克全局静态速度的改变坦克的全局速度原来是x轴方向为6,y轴方向为6,修改后,坦克的前进速度会加快,当然这样一来可以加大游戏的难度,可以作为游戏的扩展功能来实现,由于坦克的速度是动态的,这里无法测试,用户可以在Tank类里修改speedX和speedY来测试。
    子弹的速度的性质同坦克相同,这里不再赘述。
    3.3.3 墙体的部分测试改变墙体的界面布局:如改变普通墙的界面布局,是界面中没有普通墙,只要将程序中的如下代码屏蔽掉就可以了:
    for (int i = 0; i < 32; i++) { if (i < 16) { otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墙布局 otherWall.add(new CommonWall(500 + 20 * i, 180, this)); otherWall.add(new CommonWall(200, 400 + 20 * i, this)); otherWall.add(new CommonWall(500, 400 + 20 * i, this)); } else if (i < 32) { otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this)); otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this)); otherWall.add(new CommonWall(220, 400 + 20 * (i - 16), this)); otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this)); }
    屏蔽后效果如下:

    从图中可以看出,没了界面中的除开家以外的普通墙体了,其他的金属墙体,树林,河流等也是一样的道理.
    3.3.4 子弹撞击其他物体如坦克的改变当改变子弹射击坦克的方法时,如将子弹射击到坦克,不将坦克的生命结束,则游戏将永远打下去,谁都打不死谁.改变Bullets类里的hittank方法里的t.setLive(false);语句,只要将这个语句中的false改为true就可以了,当然对于其他的hit*方法,也只要作相应的修改就可以了。
    3.4 完善功能:3.4.1 已完善的功能血包可以让我们知道还剩下多少生命值,但是有时候不是很直观,所以在界面中加入一行信息来实时更新用户坦克的生命值,让用户有直观的感觉。修改后的效果如下图:

    3.4.2 游戏级别的设置游戏的级别只做了简单的级别设置,可以设置四个级别,级别1,级别2,级别3和级别4,默认进入游戏是级别1,当然可以在游戏的过程中切换级别。
    级别的设置主要是把前面的Tank类和Bullets类的全局静态最终变量改成全局静态变量,利用监听来设置坦克的速度和子弹的速度来设置游戏的难度,从而形成了级别的设置。
    修改后的画面效果为:

    3.4.3 还可以进一步完善的功能
    可以为游戏加入声音,由于在尝试的时候失败了,所以程序中就没有来实现这些功能
    存储游戏结果
    联网功能等
    7 评论 136 下载 2019-05-30 11:01:59 下载需要13点积分
  • 基于vue+nodejs+mysql的世界杯信息平台

    一、项目简介我们这次设计的是一个与2018世界杯比赛相关的数据库应用,涉及世界杯赛程、小组赛积分榜、射手榜、球队信息、球员信息等的功能。使用新浪体育提供的API作为数据源,使用JAVA的JDBC技术来实现数据库的构建,使用nodejs和koa框架实践web应用的后端编写,使用js和VUE框架实现web应用的前端构建。
    项目环境:

    mysql-5.7.22
    jdk, jre
    nodejs相关环境
    vue框架相关环境

    二、需求分析四年一度的世界杯比赛又开始了,这四年一度的盛事激起了全世界人民的热情,吸引了所有热爱足球的球迷的关注。整个世界杯总共32支队伍,64场比赛,735位球员,如此多的信息,自然催生出了世界杯相关的数据查询的需求。根据人们的需求和我们的分析,我们制定了以下功能:

    小组赛积分榜查询
    球队基础信息查询(随世界杯进程更新)
    球队间的赛事数据
    射手榜
    球员个人信息统计(随世界杯进程更新)
    球队赛程
    用户私人界面

    三、设计思路首先设计数据库,通过网页API获取所需的数据,使用JDBC创建数据库,前端向服务器发送请求(带参数),服务器使用Koa2框架,连接mysql数据库,根据请求查询数据或修改数据,将查询结果构造为json字符串返回给前端,前端通过Vue框架把获取的数据动态地呈现在网页上。
    四、实现步骤4.1 网页爬取新浪体育源的世界杯相关数据·网页访问新浪体育世界杯栏目网页,检查网页源代码,在Network,传输的JS信息中抓取对应的数据API:

    以抓取球队数据统计信息为例子,抓取到球队数据统计信息API为:
    /**************************************************** * 请求参数 * id是球队id: 与查询小组积分的的s1_id属性值一致) * season是当届/历史: 2017是当届,2013上一届***************************************************/http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1
    API访问的是网页GET请求返回的Json数据,包含着球队的数据统计信息和球员的数据信息,大致如下图所示:

    以下是抓取到本次项目所要用到的所有API:
    具体的API信息,例如请求参数,返回格式请查看 ./Resource/API信息.docx。



    order
    API信息
    API请求地址




    1
    查询分组积分情况
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&type=108&use_type=group


    2
    查询球队球员当届或历史整体统计数据情况
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1


    3
    查询射手榜
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerorder&type=108&item=13&limit=20&season=2017


    4
    查询球员基本信息
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=getPlayer&id=14937&type=108&dpc=1


    5.1
    查询球队赛程信息(按比赛时间查询)
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=livecast&_sport_a_=matchesbytype&type=108&fields=group%2Clivecast_id%2Cdate%2Cstatus%2CTeam1%2CTeam2%2Ctime%2CTeam1Id%2CTeam2Id%2CScore1%2CScore2%2CMatchCity%2CNewsUrl%2CVideoUrl%2CLi


    5.2
    查询球队赛程信息(按球队查询)
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=livecast&_sport_a_=groupMatchesByType&type=108&fields=group%2Clivecast_id%2Cdate%2Cstatus%2CTeam1%2CTeam2%2Ctime%2CTeam1Id%2CTeam2Id%2CScore1%2CScore2%2CMatchCity%2CNewsUrl%2CVideoUrl


    6
    查询球队基本信息
    http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1


    7
    查询球员各场次数据信息
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerMatchesStatics&id=14937&type=108&season=2017&dpc=1



    4.2 worldcup数据库模型设计根据爬取的API,我们用所爬取得信息建立我们的worldcup数据库模型,包括games、playerdatas、players、scoreboard、teaminfo、teams、topscorer、users共8个实体集。
    E-R图

    具体的各实体集如下表所示:
    4.2.1 Scoreboardscoreboard实体集——小组积分信息,查询API1(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&type=108&use_type=group )



    属性
    类型
    属性含义
    样例信息




    sl_id
    char(10)
    球队ID(主码)
    939


    team_cn
    char(50)
    球队名称
    葡萄牙


    team_order
    char(5)
    球队排名
    2


    count
    char(5)
    场次
    3


    win
    char(5)

    1


    lose
    char(5)

    0


    draw
    char(5)

    2


    goal
    char(5)
    进球
    5


    losegoal
    char(5)
    失球
    4


    truegoal
    char(5)
    净胜球
    1


    score
    char(5)
    积分
    5


    groups
    char(5)
    小组
    B


    logo
    varchar(255)
    国家图片
    http://www.sinaimg.cn/lf/sports/logo85/939.png


    row_id
    int
    记录所在行数,用于排序
    6



    4.2.2 teamsteams实体集——球队数据统计信息,查询API2(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    sl_team_id
    char(10)
    球队ID(主码)
    939


    team_name
    char(50)
    球队名称(主码)
    葡萄牙


    goals
    char(5)
    进球
    6


    total_scoring_att
    char(5)
    射门
    53


    total_pass
    char(10)
    传球
    1919


    total_tackle
    char(5)
    抢断
    67


    possession_percentage
    char(10)
    控球率
    54.78%


    pass_percentage
    char(10)
    传球成功率
    82.8%


    yellow
    char(5)
    黄牌
    7


    red
    char(5)
    红牌
    0


    fk_foul_won
    char(5)
    任意球
    59


    won_corners
    char(5)
    角球
    24


    total_cross
    char(5)
    传中
    84


    total_offside
    char(5)
    越位
    4


    total_throws
    char(5)
    界外球
    75


    post_door
    char(5)
    击中门框
    0



    4.2.3 topscorertopscorer实体集——射手榜统计信息,查询API3(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerorder&type=108&item=13&limit=20&season=2017)



    属性
    类型
    属性含义
    样例信息




    row_id
    int
    记录所在行数,用于排序(主码)



    num
    char(5)
    排名(主码)



    player_name
    char(50)
    球员名字



    player_id
    char(10)
    球员ID



    team_name
    char(50)
    球队名称



    goals
    char(5)
    进球数



    penalty
    char(5)
    点球数



    owngoal
    char(5)
    乌龙数



    assists
    char(5)
    助攻数



    minutes
    char(5)
    出场时间



    sl_team_id
    char(10)
    球队ID



    pic
    varchar(255)
    球员图片




    4.2.4 playersplayers实体集——球员基本信息,API4(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=getPlayer&id=14937&type=108&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    player_id
    char(10)
    球员id
    14937


    team_id
    char(10)
    国家队id
    939


    player_name
    char(50)
    球员中文名
    C罗


    team_name
    char(50)
    国家队中文名
    葡萄牙


    position_cn
    char(50)
    场上位置
    前锋


    club_cn
    char(50)
    俱乐部名
    皇家马德里


    age
    char(20)
    年龄
    33


    birth_date
    char(20)
    出生
    1985-02-05


    weight
    char(10)
    体重
    83


    height
    char(10)
    身高
    187


    jersey_num
    char(5)
    球衣号码
    7


    pic
    varchar(255)
    球员照片url
    http:\/\/www.sinaimg.cn\/ty\/opta\/players\/14937.jpg


    team_logo
    varchar(255)
    国家队Logo url
    http:\/\/www.sinaimg.cn\/lf\/sports\/logo85\/939.png



    4.2.5 games略查看代码。
    4.2.6 .users略查看代码。
    4.2.7 teaminfoteaminfo实体集——球队基本信息,API5(http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    tid
    char(10)
    球队id
    939


    team_name
    char(50)
    球队名称
    葡萄牙


    coach
    char(50)
    教练名
    桑托斯


    family
    char(50)
    球队合照
    http://n.sinaimg.cn/sports/83051191/20180606/PuTaoYa740.jpg


    king
    char(100)
    重要球星
    C罗、穆蒂尼奥、佩佩


    honor
    char(100)
    最好成绩
    第三名



    4.2.8 playerdatasplayerdatas实体集——球员具体各场次数据信息,API6(http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    player_id
    char(10)
    球员id(主码)
    14937


    player_name_cn
    char(10)
    球员姓名
    C罗


    home_name_cn
    char(50)
    主队名称(主码)
    葡萄牙


    away_name_cn
    char(50)
    客队名称(主码)
    西班牙


    home_score
    char(5)
    主队得分
    3


    away_score
    char(5)
    客队得分
    3


    mins_played
    char(5)
    出场时间
    90


    goals
    char(5)
    进球数
    3


    goal_assist
    char(5)
    助攻
    0


    total_scoring_att
    char(5)
    射门数
    4


    total_pass
    char(5)
    传球
    36


    accurate_pass
    char(5)
    传准
    34


    total_att_assist
    char(5)
    传威胁球
    1


    fouls
    char(5)
    犯规
    1


    was_fouled
    char(5)
    被侵犯
    4


    won_tackle
    char(5)
    抢断
    0


    total_clearance
    char(5)
    解围
    1


    saves
    char(5)
    扑救
    0


    red
    char(5)
    红牌
    0


    yellow
    char(5)
    黄牌
    0


    status_cn
    char(5)
    比赛状态(主码)
    结束



    4.3 playerdatas、teaminfo Java-JDBC代码实现两者的实现原理是差不多的,都是根据设计的worldcup数据库模型和对应的API,在Java代码中先进行网页访问API,得到返回的Json文件,然后解析得到的Json文件,获得对应的各项数据。
    然后创建对应的实体集,用JDBC连接MySQL,实现对worldcup数据库中,创建playerdatas与teaminfo两个实体集,并且导入解析出来的各项数据。其中teaminfo共32项数据;playerdatas共2850条数据。
    关键代码:

    JDBC连接数据库,创建playerdatas实体,设置实体拥有的各属性,主码关系,约束码关系:


    网络API GET类型访问,获得返回JSON文件,进行Json解析,获得各项数据并插入数据库:


    将解析获得的数据,插入到worldcup数据库playerdatas实体中:

    4.4 koa2以及node.js连接数据库先学习koa2框架的具体原理和使用,了解了之后进行一些类似hello的小实验,之后。(截图为部分代码)


    使用koa2创建数据库连接池,将数据库加载都后端服务器。(截图为部分代码)

    根据不同的前端请求,对数据库执行增删查改操作,并将其打包成为json文件,发送回前端。(截图为部分查询和生成json代码)


    4.5 Java连接网络和数据库Java连接网络主要利用的是HttpURLConnection这个类,通过url来访问网站,返回的是一个json字符串,需要解析这个json字符串来得到我们需要用于更新数据库的各种数据,这需要用到专门用于处理json数据的jar包。
    连接网络:

    解析数据:

    JDBC连接数据库利用了Java的JDBC驱动,需要去网上下载相应的Jar包,利用驱动名和URL来连接数据库:


    要注意的是只能连接到已有的数据库,而不能在Java代码中创建,连接到之后就可以通过简单的SQL语句来对数据库进行修改了:

    4.6 使用vue.js创建项目·直接在命令行中输入npm install vue。再进到想要创建项目的目录下;
    //安装脚手架 npm install –global vue-cli //安装webpack相关依赖 vue init webpack my-project //进入到项目中 cd my-project npm install //运行vue项目 npm run dev
    4.7 用vue模板编写页面每个网页包括html代码、css代码、JavaScript代码三部分:
    页面数据绑定

    向服务器发送请求

    页面布局
    4.8 实现服务器的路由功能
    服务器根据路径来处理get请求,调用操作数据库的函数来查询数据或修改数据。
    对所有的查询,处理方式都相似。
    向服务器发送请求,将返回的json格式的数据赋值给前端的数据结构,与页面进行数据绑定,就能把查询结果动态地呈现在网页上。

    前端代码详见DataBase/project/src/components文件夹
    服务器代码详见DataBase/project/server/router.js

    五、遇到的问题5.1 Json解析问题一开始不知道如何处理返回得到的JSON文件,后来上博客查攻略:

    引用这些外部库,可以用库里面的函数来进行Json解析,更容易地获得数据。
    另外Json文件里面的信息内容过多过杂,在分解Json结构也浪费了很多时间。
    5.2 Eclipse版本兼容问题Eclipse Kepler Service Release 1的版本不兼容mysql-connector-java-8.0.11-bin.jar。
    一开始用的JDBC链接器是mysql-connector-java-8.0.11-bin.jar这个版本,但是最后导入数据运行的时候一直是报错的,一开始是自己代码的问题,连接错误。修改代码后发现还是报错,报错位置是mysql-connector-java-8.0.11-bin.jar内部的源代码。后来上网查询错误信息时发现是与自己这里的Eclipse版本不匹配。于是降低JDBC链接器的版本至mysql-connector-java-5.1.46-bin.jar问题得以解决。
    5.3 运行报错问题导入2850条playdatas数据时,网络不稳定+用时略长导致顶层代码运行会报错。
    解决方法是对顶层代码文件导入数据时进行异常处理,抛出异常处理,避免报错。另外为了更好的响应,新开线程进行输出提示。
    0 评论 2 下载 2021-04-12 08:54:36 下载需要11点积分
  • 基于vue和express的义工招募系统

    一、技术简介1.1 HTML5技术简介HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。HTML 的上一个版本诞生于 1999 年。自从那以后,Web 世界已经经历了巨变。HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些 HTML5 支持。
    1.2 CSS3 简介CSS3是CSS(层叠样式表)技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块。
    CSS演进的一个主要变化就是W3C决定将CSS3分成一系列模块。浏览器厂商按CSS节奏快速创新,因此通过采用模块方法,CSS3规范里的元素能以不同速度向前发展,因为不同的浏览器厂商只支持给定特性。但不同浏览器在不同时问支持不同特性,这也让跨浏览器开发变得复杂。
    1.3 JavaScript语言简介JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
    JavaScript 是世界上最流行的编程语言。这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。JavaScript 是脚本语言JavaScript 是一种轻量级的编程语言。JavaScript 是可插入 HTML 页面的编程代码。JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行。JavaScript 很容易学习。
    1.4 ES6简介ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,于2015年6月批准通过。ECMAScript6的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。让代码更加准确,更易于阅读。
    ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现(ES是规范,JS是实现)。在日常场合,这两个词是可以互换的。
    1.5 Vue.js 2.xVue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
    1.6 npm包管理工具NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

    允许用户从NPM服务器下载别人编写的第三方包到本地使用
    允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用
    允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用

    npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。
    1.7 Express基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    Web 应用:Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用
    API:丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单
    性能:Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能

    1.8 VuexVuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
    这个状态自管理应用包含以下几个部分:

    state:驱动应用的数据源
    view:以声明方式将 state 映射到视图
    actions,响应在 view 上的用户输入导致的状态变化

    但是,当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:
    多个视图依赖于同一状态。来自不同视图的行为需要变更同一状态。对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。
    因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!
    另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。
    1.9 element UIElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。

    一致性 Consistency

    与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等
    反馈 Feedback

    控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作页面反馈:操作后,通过页面元素的变化清晰地展现当前状态
    效率 Efficiency

    简化流程:设计简洁直观的操作流程清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担
    可控 Controllability

    用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策结果可控:用户可以自由的进行操作,包括撤销、回退和终止当前操作等

    1.10 webpackWebpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。
    1.11 MySQLMysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
    在本教程中,会让大家快速掌握Mysql的基本知识,并轻松使用Mysql数据库。

    Mysql是开源的,所以你不需要支付额外的费用
    Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库
    MySQL使用标准的SQL数据语言形式
    Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等
    Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言
    MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB
    Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统

    1.12 NavicatNavicat 是一套能帮助你快速直观地构建精确模型的图形化工具,使各个层面的用户都能轻松地创建高品质的数据模型。它能为专业人士提供适合其特殊需要的复杂功能,但是对数据模型的新手来说又相当容易上手。
    创建一个优良的数据模型可以是很困难的。我们将一切保持简单方便,让你专注于你的数据库设计,而不会令得它变得更复杂。
    为了让你无需花费时间学习,便能对你的模型有一个简单而精确的了解,Navicat 拥有难以置信的迅速反应和简洁美观的设计,大大增强了其性能和可用性。
    再加上准确的字段类型预测功能和无限次的撤消或重做功能,它就能减省开发所需的时间并提供一个快捷高效的方式来创建和编辑你的表或视图结构。
    无论你是想从一个数据模型创建新的数据库,或者从现有数据库导入数据模型。Navicat Data Modeler 就是你所需要的工具。
    从设计表或视图,设定关系,甚至插入标签、笔记和图像到模型,它能简化复杂的设计过程,并提供能够满足你需求、帮助你有效地达致自己目标的有用经验。
    一个设计优良的模型能提高效率和数据质量,并且可以让不同的人都能清楚地理解。
    Navicat透过提供设计概念、逻辑和物理模型的能力,增强了业务和信息技术专业人士之间的沟通和协作。使用全面的绘图工具,丰富你的模型设计,绘制属于你的形状,线条和标签。
    1.13 VScodeVisual Studio Code(以下简称vscode)是一个轻量且强大的代码编辑器,支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。
    据vscode的作者介绍,这款产品可能是微软第一款支持Linux的产品。
    微软对于vscode的定位如下图,位于编辑器与IDE之间,但是更像一个编辑器。有人说是披着编辑器外衣的IDE,我觉得是披着IDE外衣的编辑器。
    深入了解了vscode之后发现了vscode很贴心地内置了很多功能,让我觉得我可以很快适应到vscode的使用。
    二、系统概要设计系统的设计主要前台和后台两个部分,前台客户端是展现给用户的,包括登录注册、查看招募信息、搜索招募信息、查看招募详情、查看图片、报名应召、修改个人信息,查看个人应召信息等功能。前台青旅老板端是给青旅老板使用的,包括登录注册、发布/更改应召信息、发布/更改青旅信息、查看应召学生个人资料、修改个人信息等功能。后台管理端是给网站管理员使用的,包括审核学生信息、审核青旅老板信息、审核青旅、审核招募信息、对以上信息的删除、超级管理员可对管理员进行增删改等功能。
    2.1 系统需求分析
    客户端

    青旅老板
    注册/登陆修改个人信息(密码、手机号等)编辑青旅信息(青旅名称,简介,省市,详细地址,邮箱,青旅图片(最少上传五张))发布招募信息(招募标题,招募要求,工作待遇)查看应聘者信息对招募信息进行编辑/删除
    用户
    注册(姓名、性别、出生年月、联系方式、身份证号、所在院校、附件等)/登录修改个人信息(密码、手机号等)关键字查询报名义工

    管理端

    管理员
    登陆审核注册用户信息审核招募信息修改密码
    超级管理员
    新增、编辑、删除其他管理员信息普通管理员所有功能


    2.2 可行性分析这里讲的可行性分析的任务是从技术上、经济上分析需解决的问题是否存在可行性。其目的是在尽可能短的时间内用尽可能小的代价确定问题是否有解。
    2.2.1 技术可行性技术上的可行性分析主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。
    本系统前端设计主要由Vue.js实现,vue 的开发体验是非常令人感到愉悦的。Vue在数据交互,组件化开发方面有非常大的优势,每个组件都是一个.vue文件,可以把页面拆成很多组件,方便开发与维护,使用时只需引入组件即可,通过vue-router实现路由跳转,可以很容易地创建单页面应用程序,只需要把vue-router添加到vue工程中,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。
    本系统数据库使用的MySQL,MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的关系型数据库,轻量、开源、简便易用,使用Navicat Premium 12做数据库图形化管理更高效率进行前后端开发
    2.2.2 经济可行性如今是信息化时代,信息化管理可以使招募义工的管理工作更加系统化、快速化、全面化。这样可以为社会带来较高的工作效益和经济效益,本系统对计算机配置的要求不高,普通私人电脑都可以完全满足需要,本系统作为一个设计,其开发目的是为巩固所学知识,无需开发经费,因此在经济上也是可行的。
    综上所述,本系统的开发目标已经明确,且在技术和经济上都是可行的,因此系统的开发是完全可行的。
    2.2.3 操作可行性该系统如投入使用,预期作到界面友好,管理方便,使用简单,管理人员经过培训,也是完全能够使用本系统管理相关信息的。
    综上所述,本系统的开发目标已经明确,且在技术和经济上都是可行的,因此系统的开发是完全可行的。
    2.3 前台模块前台模块包括:

    首页:本网站的门面,包括导航栏,登录与注册,网站主banner图等
    用户登录与注册:用户可以登录/注册本站账号
    用户修改个人信息:用户可以修改自己的密码,手机号,头像等个人资料
    招募信息展示:用户可以了解到本站提供的招募信息
    查看招募详情:用户可以点击进入查看详情
    关键字查询:用户可以根据关键字进行查询相关招募信息
    报名招募(应召):用户可以报名招募信息
    应召列表:用户可以查看自己的应召列表,并点入查看详情

    2.4 青旅老板模块
    青旅管理:对青旅进行添加、删除、修改
    招募信息管理:对招募信息的添加、删除、修改、预览视频
    应召学生管理:查看应召学生信息
    个人资料管理:对个人资料进行修改
    登录注册

    2.5 后台模块
    系统用户管理:对系统用户添加、删除、修改
    青旅信息管理:审核,删除青旅信息
    招募信息管理:审核,删除青旅信息
    学生管理:审核,删除学生信息
    青旅老板管理:审核,删除青旅老板
    个人信息管理:管理员可以修改自己的信息
    管理员管理:超级管理员可管理其他管理员信息

    2.5 网站模型客户端用户注册流程图

    客户端用户首次登陆流程图

    客户端拉取信息流程图

    客户端权限验证流程图

    管理员首次登录流程图

    管理员登陆拉取信息流程图

    管理员异步加载权限路由流程图

    2.6 Server端模型系统基本结构

    利用Express服务器,用于连接客户端和数据库服务器。对于客户端发出的需要对数据库进行访问的请求,Express服务器负责客户端与数据库服务器的网络通信,并将相关数据嵌入返回给客户端的页面;对于客户端发出的不需要对数据库进行访问的请求,Express服务器将直接处理这些请求,并将最终生成的数据发往客户端浏览器。
    三、数据库设计3.1 数据概念结构设计E-R模型是数据进行第一层抽象的表示方法。它的主要成分包括:实体、联系和属性。我们可以用E-R图将内容表达出来,辅助设计的实现。
    3.2 数据库关系设计该系统数据库关系图如下所示:
    数据库前端关系

    数据库后台关系图

    四、前台详细设计4.1 用户登录与注册4.1.1 登录部分用户手动登录,将用户名密码发送到Server,Server用时间戳生成一个token返回前台,然后根据此token去Server端获取用户信息,若登录时勾选了自动登录,这个token会存放在cookie里,并且有效期为七天,下次进入页面,浏览器读取cookie自动登录。

    由于vue本身状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长,状态管理比较复杂,所以登录状态我使用Vuex进行状态管理,把登录状态和用户个人信息在state里进行托管,在vue组件里用computed计算属性监听变化,当获取数据的时候通过commit调用mutations中的方法修改state中的,这样每次当登录状态改变的时候,整个vue项目中的登录状态都会改变。

    4.1.2 注册部分用户注册需要校验很多权限,用户名长度应在5-16字符之间并且只能以汉字、字母开头,密码须以字母开头,长度在6~18之间,只能包含字母、数字和下划线,两次密码需要一致,手机号需要支持最新的网段,该系统中我还加入了最新的166网段的手机号验证,保证用户注册正常填写信息。
    输入用户名后,可以点击“验证用户名”按钮检验该用户名是否被注册,只有当用户名检验通过并且表单项全部验证正常才可提交表单。
    为了避免检验用户名后该用户名在其他地方被注册,在后台我做了一个容错机制,当发生该情况时后台向前端发送一个“手慢了哦,该用户名已被占用,换一个试试吧”的消息,确保用户名在数据库中不会重复。

    4.2 网站首页网站首页和很多功能类网站类似,首页为登录注册,登录成功后显示基本个人信息。

    4.3 招募列表页面招募列表页面通过查询数据库获取数据并通过vue的v-for指令循环出列表,在输入框中输入关键字可查询到相关招募信息,点击列表的item可进入详情页面。

    4.4 招募信息详情招募详情页由课程列表页跳转路由而来,跳转时直接在url后拼上参数,以便分享连接,每次进入页面根据url参数获取课程信息,若链接不带参数,则会跳入404页面。
    代码:

    当游客(未登录用户)浏览课程详情时不会发送匹配订单的请求,招募按钮不会显示,只会显示请先登录,Vue组件中watch监听isLogin的变化,当Vuex中的状态改变,Vue中的计算属性isLogin也随之改变,触发监听事件,发起查询order的接口,判断当前用户是否已报名次招募,如果已应召,卡片中的按钮会变为“已应召”,并将状态变为disabled。
    已报名状态

    未应召状态

    前端代码:

    Server端代码:

    4.5 招募信息管理在招募信息页面中,进入页面先对用户是否登录进行判断,如果未登录,则弹出提示框并强制跳转路由至首页,这个功能在修改个人资料,查看收藏夹同样适用,进入页面后可以查看自己的历史应召信息。
    应召信息管理


    代码实现:

    4.6 404 NO FOUND
    五、青旅老板端详细设计5.1 写在前面后台管理部分使用Vue做基础框架,用Vuex做状态管理,用element UI做UI框架。
    对数据的增和改,调用的同一个接口,减少代码复杂度,由于修改数据,必须传入id,通过id修改数据库内容,当我增加数据的时候,只需要不传入id,在后台做一个判断,当id不存在,则进行增加数据操作,若有id,则通过id对数据库进行更改。
    自动增加代码

    以下所有删除部分的处理在页面上与增改功能不同,增改在发送请求后,返回一个异步的response ,由于增和改数据处理较复杂,所以选择处理后重新发送请求,获取数据,重新绘制表格上的数据。
    自动跟新代码

    而删除部分,在获取到异步response之后,只是将页面上的该条数据删除,没有重新发送获取数据的请求,减少发送请求次数,减轻页面和服务器负担。

    5.2 登录页面设计进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常重要的,可以说是一个后台项目一开始就必须考虑和搭建的基础核心功能。我们所要做到的是:不同的权限对应着不同的路由,同时侧边栏也需根据不同的权限,异步生成。这里先简单说一下,我实现登录和权限验证的思路。

    登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息)
    权限验证:通过token获取用户对应的 role,动态根据用户的 role 算出其对应有权限的路由,通过 router.addRoutes 动态挂载这些路由

    上述所有的数据和操作都是通过vuex全局管理控制的。(补充说明:刷新页面后 vuex的内容也会丢失,所以需要重复上述的那些操作)接下来,我们一起一步一步实现这个系统。
    5.2.1 登录部分登录成功后,服务端会返回一个 token(该token的是一个能唯一标示用户身份的一个key,这里用时间戳简单代替),之后我们将token存储在本地cookie之中,这样下次打开页面或者刷新页面的时候能记住用户的登录状态,不用再去登录页面重新登录了。这个token在服务端存在数据库中,为了保证安全,在服务端加了一个过期日期的时间戳字段,时间是首次登陆的一周后,在页面发起查询token请求的时候,若发现token已过期,则将该条token删除,要求客户重新登陆,确保后台用户不会因为电脑遗失或者其它原因被人随意使用账号。
    5.2.2 用户信息部分用户登录成功之后,我们会在全局钩子router.beforeEach中拦截路由,判断是否已获得token,在获得token之后我们就要去获取用户的基本信息了就如前面所说的,我只在本地存储了一个用户的token,并没有存储别的用户信息(如用户权限,用户名,用户头像等)。有些人会问为什么不把一些其它的用户信息也存一下?主要出于如下的考虑:假设我把用户权限和用户名也存在了本地,但我这时候用另一台电脑登录修改了自己的用户名,之后再用这台存有之前用户信息的电脑登录,它默认会去读取本地 cookie 中的名字,并不会去拉去新的用户信息。
    所以现在的策略是:页面会先从 cookie 中查看是否存有 token,没有,就走一遍上一部分的流程重新登录,如果有token,就会把这个 token 返给后端去拉取user_info,保证用户信息是最新的。当然如果是做了单点登录得功能的话,用户信息存储在本地也是可以的。当你一台电脑登录时,另一台会被提下线,所以总会重新登录获取最新的内容。而且从代码层面我建议还是把 login和get_user_info两件事分开比较好,在这个后端全面微服务的年代,后端也想写优雅的代码
    5.3 青旅管理在这里可以新建,编辑青旅信息,查看青旅图片(轮播)。



    5.4 招募信息管理在这里可以查看发布的招募信息,招募详情及应召学生列表。

    5.5 个人信息管理在这里可以对个人信息进行修改,分为基本个人信息与密码修改,密码修改必须进行一步验证

    六、后台详细设计6.1 写在前面权限控制部分
    由于后台设计了管理员和超级管理员两种权限,超级管理员可以显示某些路由,而普通管理员无法进入该路由在之前通过后端动态返回前端路由一直很难做的,因为vue-router必须是要vue在实例化之前就挂载上去的,不太方便动态改变。不过好在vue2.2.0以后新增了router.addRoutes。
    实现方法

    创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面
    当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表
    调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由
    使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件

    在一开始,只挂载通用路由。

    而异步路由通过权限控制是否显示在页面上。

    异步挂载的路由
    动态需要根据权限加载的路由表

    超级管理员可以看到的路由

    管理员可以看到的路由

    6.2 招募管理与青旅页面设计招募信息与青旅列表部分
    进入路由页面,请求相关数据,表格、编辑弹框和视频播放框均为子组件,通过v-bind传入子路由,子路由通过props接收,处理过数据后,通过$emit传回父组件,实现新增和修改课程项目。
    删除使用post请求而没有使用delete请求,在数据库里只是将一个删除的标识字段由0改为1,下次查询数据库的时候滤掉该字段,实现“假删除”,方便后期数据维护,此方式在青旅、学生、青旅老板等删除操作同样适用。
    6.3 学生管理页面设计学生列表部分
    后台没有做新增学生的功能,学生新增账号必须在前台进行注册,在后台审核,审核通过后,前台的学生用户才可以用积分购买并观看视频课程
    审核功能在后台以一个标识符存在,在获取学生列表的时候,判断该学生的审核状态,若审核已通过,,显示为已审核,点击会提示“此学生为已审核状态”,若未审核,点击会弹出“是否确定将此学生修改为已审核状态?”的对话框,以此审核学生信息

    6.4 管理员管理前文在登陆页面中已经涉及过此处,只有超级管理员可以看到管理员管理中的管理员设置功能,在此处可以添加,删除,编辑管理员信息,但是不可以删除自己,不符合基本业务逻辑。
    非超级管理员的管理员在此处只能看到个人信息的按钮,在里面可以编辑自己的信息,同样,不可删除自己
    七、Server端设计7.1 解决跨域问题跨域是前后端联调开发中经常会遇到的问题,由于浏览器有同源策略,用来防止CSRF攻击,当前端发出请求的时候,请求的协议名,地址,端口号与当前的有一个不同,就会引发浏览器拒绝跨域请求,解决跨域问题的方法有很多,比如jsonp,服务器代理,document.domain + iframe等等方式解决跨域问题,我选择了在服务端,允许前端跨域发出PUT, POST, GET, DELETE, OPTIONS请求,成功地解决了ajax跨域问题。
    app.all('*',function (req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild,X-Token'); res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); if (req.method == 'OPTIONS') { res.send(200); /*让options请求快速返回*/ } else { next(); }}); //解决跨域问题
    7.2 文件系统此处调用node.js的文件系统,并且用formidable对表单数据进行解析。Formidable是一个用于解析表单数据的Node.js模块,尤其是文件上传。
    7.3 连接数据库由于本系统使用的是express+node+MySQL数据库,处理数据也均由JavaScript实现,为了更方便维护代码,使代码可读性更强,这里我使用node-orm2连接和处理数据库,node-orm2是一个 Node.js 对象关系映射模块,它可以更方便地创建模型,同步,删除,批量创建,获取,查找,移除,计数,聚合函数,可以完全只通过JavaScript实现创建模型的关联,查找,检查,创建和移除,有非常好的模型实例的缓存和一致性。
    var orm = require('orm');var connection = null;function setup(db, cb) { require('./product_info')(orm, db); require('./order')(orm, db); … // 引入更多数据库 return cb(null, db);}module.exports = function (cb) { if (connection) return cb(null, connection); // orm.express("mysql://root:1@localhost/question_system" orm.connect("mysql://root:1@localhost/question_system", function (err, db) { if (err) return cb(err); connection = db; db.settings.set('instance.returnAllErrors', true); setup(db, cb); });};
    0 评论 2 下载 2021-04-11 14:17:26 下载需要11点积分
  • 基于Jsp和MySQL实现的云音乐平台

    一、系统使用说明1.1 配置
    开发环境:Eclipse Java EE IDE for Web Developers 4.3.2
    开发语言:Java 1.8
    MVC框架:Spring 4.3.3
    web服务器:Tomcat
    开发系统:OSX/LINUX
    数据库:MySQL

    1.2 相关路径
    controller:CloudMusic/src/controller
    model:CloudMusic/src/model
    view:CloudMusic/WebContent/WEB-INF/view

    1.3 运行方法
    需要提前配置好mysql数据库,sql文件位于根目录 (DDL.sql DML.sql)
    设置数据库参数 配置文件位于
    apache-tomcat/webapps/CloudMusic/WEB-INF/classes/dbConfig.properties
    终端启动服务器
    cd apache-tomcat./bin/catalina.sh run
    运行成功后,浏览器打开 http://localhost:8080/CloudMusic 可访问

    1.4 其他说明若运行.sh文件 报permisison denied, 则在终端运行 chmod +x catalina.sh 修改权限。
    二、软件基本功能介绍2.1 登陆注册模块2.1.1 注册功能

    判断邮箱是否注册过
    判断输入的邮箱是否为有效邮箱
    确认密码与登陆密码无误
    注册成功,相关信息并随机生成不重复的用户id存入数据库
    注册成功后,自动登录并生成cookie并跳转回首页

    2.1.2 登陆功能

    判断邮箱是否注册过
    从数据库查找相关信息,确认密码是否正确
    成功登陆后,生成cookie并跳转回首页

    2.2 首页推送模块2.2.1 新闻推送功能
    从数据库调用相关新闻信息后展示在首页。
    2.2.2 音乐排名功能
    连接数据库,按照类型从数据库中抽取最新的10首显示。
    2.3 音乐模块2.3.1 音乐播放功能


    音乐选择播放(第一个按钮),从数据库根据音乐id查询音乐相关信息,根据音乐的url下载播放
    音乐选择加入歌单(第二个按钮),播放器会接着播放

    2.3.2 音乐收藏功能




    音乐收藏(第三个按钮),从cookie中获得用户id,再根据音乐id存入数据库中
    若没有登陆则无法收藏
    也无法重复收藏同样的音乐

    2.4 用户模块

    获取用户信息并显示在个人页面
    获取个人收藏的音乐
    在个人页面可使用小播放器播放音乐,功能同上
    若没有登陆,将无法成功进入该页面

    三、数据库设计用户表(普通用户+管理员)(app_user)



    属性名
    说明
    类型
    长度
    允许空值




    email
    登录邮箱
    Varchar
    16



    pwd
    密码
    Char
    34



    id
    用户id
    Int
    11



    regDate
    注册时间
    date




    root
    身份
    Int
    11




    新闻推送表 (app_news)



    属性名
    说明
    类型
    长度
    允许空值




    title
    推送标题
    Text




    content
    推送内容
    Text




    id
    Id
    Int
    11



    type
    类型
    Varchar
    16



    pubDate
    发表日期
    date





    用户信息表(app_info)



    属性名
    说明
    类型
    长度
    允许空值




    User_id
    用户id
    Int
    10



    Name
    昵称
    varchar
    16



    image
    头像路径
    varchar
    34




    歌曲表(app_music)



    属性名
    说明
    类型
    长度
    允许空值




    Name
    曲名
    text




    src
    歌曲路径
    text




    lyric
    歌词
    text




    Music_id
    歌曲id
    int
    10



    Listener
    收听人数
    int
    10




    歌曲类型 表(app_class)



    属性名
    说明
    类型
    长度
    允许空值




    class_id
    类型id
    Int
    11



    Class_name
    类型名
    Varchar
    80




    歌曲—类型表(app_musicRclass)



    属性名
    说明
    类型
    长度
    允许空值




    music_id
    歌曲id
    Int
    11



    Class_id
    类型_id
    Int
    11




    歌手表(app_singer)



    属性名
    说明
    类型
    长度
    允许空值




    singer_id
    歌手id
    Int
    11



    Singer_name
    歌手名字
    Varchar
    80



    country
    国籍
    Varchar
    80



    birthday
    生日
    Date





    歌手-歌曲表



    属性名
    说明
    类型
    长度
    允许空值




    music_id
    歌曲id
    Int
    11



    singer_id
    歌手_id
    Int
    11




    用户-歌曲收藏表(app_collection)



    属性名
    说明
    类型
    长度
    允许空值




    user_id
    用户id
    Int
    11



    Music_id
    歌曲_id
    Int
    11



    colDate
    收藏的日期
    Date




    Id
    字段id
    Int
    10




    四、功能模块使用的主要技术4.1 登陆注册模块
    登陆注册功能都使用了cookie功能,用来保存用户的id,以支持用户的收藏功能
    注册功能中,需要验证邮箱是否合法,通过正则匹配方法来匹配是否有有效邮箱
    正则表达式:\w+@(\w+.)+[a-z]{2,3}

    4.2 首页推送模块
    主要功能的实现都是通过SQL语句从数据库获取相关数据,并传给前端进行展示
    从数据库获取的数据为ResultSet格式需要引入org.json.jar包并将ResultSet格式转换为json格式

    4.3 音乐模块
    数据库存取了音乐的url播放地址,通过音乐id获取。再通过网络获取相关资源后实现播放功能
    收藏音乐前,会先检查是否有有效cookie从而确认是否登陆,之后再在数据库确认是否在用户-音乐收藏表中存在该记录,确认无误后,再将数据存入数据库

    4.4 用户模块
    检查本地是否有有效cookie,若无则跳转回
    通过SQL语句从数据库获取相关数据,并传给前端进行展示

    五、系统测试报告5.1 环境配置复杂Spring框架是基于java开发的框架,相比于ThinkPHP框架,单从文件大小来看就相差几十M,配置起来也是非常麻烦。
    Spring框架并没有像XAMPP一样的集成环境的软件可以选用,因此数据库和服务器都必须独立安装。Spring框架相比于HTML文件更加支持jsp文件,因此服务器的选择上选择了Tomcat进行开发。数据库需要本地安装并且配置好Mysql。
    Eclipse有专门针对java web开发的版本,因此选用Eclipse Java EE IDE for Web Developers 4.3.2
    5.2 编码问题Spring框架对编码问题的解决还是比较方便,在前端的jsp页面上申明 pageEncoding=”UTF-8”,基本都可以解决页面中文乱码的问题。
    从 Mysql 获取的数据常常都为 ISO-8859-1 编码格式,controller 中 RequestMapping 可以事先申明编码类型 charset=utf-8 即可解决编码问题。
    5.3 数据库查询复杂由于数据设计较为复杂,以获取音乐相关信息为例,音乐的链接、音乐名;音乐的作者;音乐的类型;分别在多个表中,在设计查询的SQL时需要用到natural join 关联多个表获取信息。
    如获取音乐相关属性SQL语句:
    SELECT name, music_id, singer_name, src FROM app_singerRmusic NATURE JOIN app_Singer NATURAL JOIN app_Music LIMIT 20
    5.4 本地缓存影响调试由于本地缓存的功能,常常出现更改的后台相关文件,却无法看到更改后的效果,因此在调试的时候,时常需要清除本地缓存,并重启浏览器。
    5.5 Spring框架中,Request的地址中不能获取带有’/’的参数由于链接通常是带有多个’/’标点,所以无法使用 /getSrc/{url} 的url参数获取音乐的链接,因此改用 /getSrc/** 匹配所有该样式的访问,再通过request.getRequestURL()获取完整的链接,然后经过简单的字符串处理后获取所需要的参数url。
    5.6 系统存的不足
    功能未完善,由于时间原因,原项目的还具有增加好友、音乐评论等功能尚未实现
    用户密码存入数据库并没有进行加密,而是直接存入数据库
    0 评论 4 下载 2021-04-09 08:52:55 下载需要11点积分
显示 60 到 75 ,共 15 条
eject