基于Jsp和MySQL实现的校园二手物品交易系统

到山东找蓝翔

发布日期: 2021-09-22 11:30:30 浏览量: 278
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

校园二手物品交易系统主要用于解决处理学生在校期间遗留下各种二手物品的交易问题,同时,交易平台也给在校学生提供新物品需求。广交地稀人广,宿舍资源更是供不应求。有些闲置物品食之无味,弃之可惜,关键是极大地占用了宿舍空间。阳光校园二手交易平台是以广交院为平台而设计的二手交易网,利用简单快捷的交易方式为广交大学生提供便利的二手物品交流平台。

本文研究了一个校园二手物品交易系统,该系统基于B/S架构模式,使用SSM框架开发,并根据现有的网络二手交易系统设计优化而成。系统主要以Java语言作为开发基础,使用了Jsp+Sping+SpringMVC+Mybatis等技术,采用MyEclipse作为开发工具,以MySql作为数据库工具,使用Tomcat作为Web服务 器。本系统分为前台模块和后台管理模块,其中前台模块实现了物品分类、物 品详情、用户注册、用户登录、物品发布、在线支付和用户个人中心等功能; 后台管理模块实现用户管理、物品管理、订单管理、钱包管理和系统设置等功能。本系统功能比较完善,界面友好,操作简单,方便在校生实现资源再利用。

利用现代信息技术手段实现的校园二手物品网络交易大大减低了物品在交 易过程中的成本,更重要的是,这些交易过程不会受到空间和时间上的限制,所以无论从提升校园整体形象上还是从经济利益上,都有着十分重要的意义。

关键词:校园二手物品,交易系统, SSM,Jsp,MySql,maven框架

第一章 绪论

1.1 设计背景、目的及意义

1.1.1 设计背景

“二手市场”实际上就是旧货市场。而就校园二手市场的交易物品类别比较丰富,例如日常用品、电子设施、书刊文献等均为校园二手市场里普遍存在的物品,并且因学生的日常用品具有较强的重复应用特性与学生本身的不稳定性因素,让校园二手市场存在着较为稳定的需要,此类二手市场的存在增加了资源的应用率,应该得到大家鼓励和认同的。然而因为校园二手市场的运营制度存在较大的漏洞,所以应创建一个科学合理的治理制度来实现规范管理,进而推动二手物品此类资源的合理分配,同时还提高了学校的治理。

随着互联网和网络购物日益深入社会生活,以网站作为信息交流平台,进行信息交流、购物供需等等已成为大学生不可或缺的生活方式。技术的不断发展以及产品的不断更新换代使得人们对物质文化需要越来越高,随之而来的问题便是二手物品日积月累却得不到更好的利用,发挥其更大的价值。特别是在校大学生手里一般会有较多的二手物品,其通用性也比较广泛,在这种情况下,校园二手交易网的重要性不言而喻。利用互联网的强大性构建一个校园二手交易平台,不仅有利用人们发挥物品的最大价值,同时也对人际交流,信息沟通有着极好的促进作用。

1.1.2 设计目的和意义

近年来,在国家不断倡导节俭型校园的精神推动下,大部分高校己经形成了二手物品交易的热潮。二手物品的交易与再利用体现了当代大学生节约环保 的生活理念与校园文化。每一年大一新生的到校就意 味着即将有一届毕业生就要离开校园,走向工作岗位,他们不可能将几年来留存下的书籍、生活用品等都带走,甚至有些物品己成为累赘,这时出售或者转让是为一种不错的选择, 这样大量二手物品的交易需求在高校大学生中一年年传承。大多数大学生的消费水平并不高,都希望能够买到物美又价廉的物品,通过校园内的二手交易跳蚤市场寻找自己需要的廉价物品是现阶段的主要途径,然而校内的跳蚤市场往往时间短暂,都集中在毕业季,毕业生一走,大规模的跳蚤市场就会消失,很难彻底便利的满足广大学子的交易需求,并且高校跳蚤市场在促进大学生节约环保意识的同时,却伴随着影响校园正常秩序的阴影。

随着高校教育信息化技术的不断普及和深化,计算机和因特网已经成为高校师生日常生活不可或缺的一部分, Internet技术给传统高校二手交易带来了新的生机。通过Internet技 术建设一个校园二手交易平台使交易都通过网络进行,完美的满足了广大学子的交易需求,也解决了高校的日常管理问题。

基于以上原因,选择”校园二手物品交易系统的设计与实现”既符合校园的文化与情怀,也强化了校园跳蚤市场的网络化信息发布与交易。同时,搭建针对校园二手网络交易网也是为了响应党的十八大提出的”节能减排”的号召,能够充分合理的利用二手物品,体现出可持续发展的要求,减少不可再生能源的浪费,保护我们共同生活的家园。更重要的是能够满足在校师生快速节奏的生活方式,满足他们的供求需要,为双方搭建一个信任交易的平台。

第二章 相关技术介绍

2.1 Javascript

JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。

2.2 Ajax

Ajax全称为”Asynchronous JavaScript and XML”(异步JavaScript和XML), 是指一种创建交互式网页应用的网页开发技术。Ajax技术可以提供高度交互的 Web应用,给予用户更丰富的页面浏览体验,Ajax功能的实现主要依靠XMLHttpRequest对象及其属性和方法、发送请求和处理响应。

2.3 MySQL

MySQL是一个开放源码的小型关联式数据库管理系统,被广泛地应用在Internet上的中小型网站中。由于其体积小速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

2.4 SSM框架

SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容) 。常作为数据源较简单的web项目的框架。

Sping

Spring是一个开源框架,是于2003年兴起的一个轻量级的Java开发框架由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。

SpringMVC

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web FIow里面。Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller, Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中 struts。

Mybatis

MyBatis是一个基于Java的持久层框架,mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过 sqlSessionFactory拿到一个sqlSession, 再执行sql命令。

页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

2.5 Maven框架

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。

2.6 JSP

JSP本是一个简化的Servlet设计,有点类似ASP技术,它是在传统的网页HTML (标准通用标记语言的子集)文件(*.htm,* .html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Linux 下运行,也能在其他操作系统上运行。

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。JSP(JavaServer Pages) 是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。

2.7 B/S模式

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser) 实现,但是主要事务逻辑在服务器端(Server) 实现,形成所谓三层结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO) 。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,以不同的接入方式访问和操作共同 的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全

B/S模式应用系统网络结构图

2.8 BootStrap

Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web开发更加快捷。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态 CSS语言Less写成。

2.9 系统开发平台及运行环境

2.9.1 系统开发平台

MyEclipse

MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEcIipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSP, CSS, Javascript, SQL, Hibernate。MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEclipse) 是对Eclipse ID E的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服 务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。

Tomcat服务器

Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户 不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响 应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它实际上作为一个与Apache 独立的进程单独运行的。

Tomcat的环境主要有以下几方面技术优势:

  • Tomcat中的应用程序是一个WAR (Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包

  • 在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压

  • Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功 能:处理htmI页面

  • Tomcat也可以与其它一些软件集成起来实现更多的功能

2.9.2 运行环境

  • 操作系统: Windows 7以上版本

  • 服务器软件: Tomcat7.0以 上版本

  • 浏览器: IE、Fire Fox、Google Chrome。

第三章 系统需求分析

阳光二手校园交易平台系统开发意图在于帮助校园师生更好的处理闲置物品。应用目标是确保每个用户都能完整合理地利用资源。本二手交易平台管理系统的用户包括系统管理员和普通用户和游客。系统管理员负责交易平台的管理工作,如各种基本信息的录入、修改、删除、查询、统计和管理系统用户等功能。普通用户使用该系统完成自己基本信息或者交易物品的基本信息的查询与统计管理等功能。游客使用该系统完成相关物品查询等。

3.1 功能需求分析

校园二手物品交易系统是根据各大高校二手市场的实际情况按照网络化的需求开发的,它的目标非常明确,即通过建立高校二手网络交易平台,将原来定时定点摆摊式的二手物品线下交易方式转变成通过网络平台进行交易的线上模式,使校园二手交易更加便捷、安全、规范和有针对性。

系统功能需求整体上分为用户使用功能和系统管理功能,其中用户使用功 能包括用户浏览物品、用户登录、用户注册、用户搜索物品、用户发布物品、用户查看个人信息等功能;系统管理功能包括管理员管理物品分类、管理员管理物品、管理员管理订单、管理员管理用户等功能。

根据以上功能需求分析,通过用例图来描述系统的主要功能。构建用例模型的第一步是确定模型中的使用者有哪些,确定使用者的原则有:谁是系统的 维护者、谁是系统的参与者等。维护者处于系统内部,对系统有绝对的控制权;而参与者-般都位于系统的外部,处于系统的控制之外。

现在确定本系统用例模型有三种,分别是游客、注册用户和系统管理员。下面分别对这三个角色的功能进行描述:

3.1.1 游客

游客是未注册的用户,他们可以浏览物物品,可以搜索物品,如需购买物品,必须先注册成为网站用户。游客主要功能如下(图3-1为游客用例图):

  • 浏览物品

  • 搜索物品

  • 注册成为网站用户

3.1.2 注册用户

注册用户是经过网站合法认证的用户,登录网站后可以浏览物品、搜索物品、发布物品、关注物品、购买物品和查看个人中心。注册用户主要功能如下(图3-2为注册用户用例图):

3.1.3 系统管理员

系统管理员主要负责系统的后台管理工作,主要功能如下(图3-3为系统管理员用例图):

在确定了系统用户和用户功能后就可以构建校园二手物品交易系统的用例图了,整个系统的用例图如图3-4系统总体用例图所示:

3.2 非功能需求分析

  • 系统的实用性:系统的实用性是指系统设计开发的功能要尽量简单、实用,用户在使用系统过程中能够感受到系统的快捷、方便,不存在很多累赘和多余的操作或者功能

  • 系统的安全性:校园二手物品交易系统中记录了重要用户信息,包括用户的个人隐私信和、账户金额等信息,这些信息要具有很高的保密性和经济价值。因此,要求系统要具有一定的安全性,能够保证重要数据信息不被轻易窃取和破坏

  • 系统的稳定性:系统稳定性差则预示着系统在用户使用时,可能会出现数据操作错误,页面响应时间过长或者干脆无法响应等,因此系统的稳定性是用户对系统评价的重要指标之一。系统应采用稳定的操作系统、数据库、中间件等,以保证系统的稳定性

  • 系统的开放性:系统的开放性是指系统具有良好的可兼容性,可以在Windows的大部分版本的操作系统中正常的运行,另外,也支持不同浏览器版本,能够在微软的IE浏览器、谷歌浏览器等常用的浏览器上正常运行。系统的易升级和管理也是系统开放性的表现

3.3 可行性分析

可行性分析主要是指在当前己有的具体条件下,网站系统的开发是否己具备了必要的条件和资源,分析概括起来包括网站经济可行性、网站技术可行性分析分析和网站操作可行性分析三个方面。

3.3.1 经济可行性

网站的经济可行性分析主要是指网站的开发成本与收益之间的评估,分析网站建设带来的经济效益以及建设维护网站所需费用。

  • 网站所需费用。由于本网站系统是立足于校园,加之学院鼓励大学生自主创业,通过申请得到一台配置较高的服务器,开发团队由本人组织相关学生自主研发,成本相对较低

  • 通过调查研究,我校90%以上的学生希望能购买到二手书籍及相关学习用品,80%以上学生不介意购买电子产品,主要愿意是这些产品更新较快,没有必要花费那么多金钱购买全新的产品,75%以上的学生想要购买诸如体育用品和生活用品等,而据另一项调查,85%以上的同学都愿意出售自己的一些二手物品,而且70%的同学有过摆地摊出售二手物品的经历。因此,建立一个专门针对我校学生的二手物品交易网络平台是必要的。一是可以提高学校的整体形象,加强学校的管理,二是可以为学生减少损失

3.3.2 技术可行性

本系统基于Jsp+SSM+Tomcat+MySQL+Maven, 并采用B/S模式,由于JSP、SSM功能强大,而Tomcat和MySQL灵活易维护在开发方面具有方便快捷、使用灵活的特点,以及目前的广泛实际应用,因此使用JSP、SSM、Tomcat、MySQL和Maven是开发轻平台的最佳组合从而说明本系统在技术方面可行。

硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。

3.3.3 操作可行性

本系统是基于B/S架构的,与传统的BBS发布信息非常相似,用户不需要进行特别的学习就可以实现物品购买和物品信息的发布。而对于系统的管理员,由于会配备系统管理的相关说明书,即使不是专业学科的系统管理员也可以很方便快捷地操作后台的管理系统。

第四章 系统设置

系统设计是把用户需求转化为系统的最重要开发环节,解决了”应该怎么做系统”的问题。在本章节中,主要是在系统需求分析的基础上,对系统架构、系统功能模块设计、系统工作流程设计和系统数据库设计进行阐述。

4.1系统框架

校园二手物品交易系统采用SSM(Spring MVC+Spring+Mybatis)框架开发,是标准的MVC模式,将整个系统划分为views层,controllers层,services层,mappers层四层。其中,Spring MVC负责请求的转发和视图管理,Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。整个系统架构运行流程如图4-1所示:

  • views层:与controllers层结合比较紧密,需要二者结合起来协同工发,主要负责前台Jsp页面的表示

  • controllers层:控制器,导入services层,因为services中的方法是我们使用到的,controllers通过接收前端传过来的参数进行业务操作,在返回一个指定的路径或者数据表

  • services层:存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,它有接口还有接口的实现方法,在接口的实现方法中需要导入mappers层,mappers层是直接跟数据库打交道的,它也是个接口,有方法名字,具体实现方法也在里面,services是供我们使用的方法

  • mappers层:对数据库进行数据持久化操作,它的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者

4.2 系统功能模块设计

实质上,校园二手物品交易系统的综合性相对较强,复杂程度相对较高,可对现有软件进行充分利用,进行系统设计与规划。构建完善成熟的校园二手物品交易系统,其中涉及到以下内容,即前台网页界面、处理程序、MySQL 后台数据库系统等,在网站页面中显示出以下内容,例如物品图片、物品名称、物品价格、物品信息等。处理程序其实也就是对用户提交表单与相关操作进行处理,存储在后台数据库的信息有用户数据、物品数据和订单数据等。

因此,校园二手物品交易系统需要具备前台功能和后台功能,其中,前台功能实现以下功能,用户注册、用户登录、物品推荐、物品分类、物品搜索、物品发布、物品详情、物品求购、我的主页。系统前台功能如图4-2所示:

系统后台功能实现以下功能,物品分类管理、物品管理、订单管理、用户管理。系统后台功能如图4-3所示:

4.3 系统工作流程设计

系统工作流程包含用户工作流程和管理员工作流程,如图4-5显示:

4.4 数据库设计

数据库的设计关系到整个应用系统的运行效率,数据库设计得好,不仅有利于日常数据的维护更新,而且可以提高系统的运行效率,缩短数据查询响应周期,增加网站的流量^[9]^。合理的数据库设计可以使围绕它支持的Web页面的Java代码简单化,易于实现,并且可以提高数据存储的效率,保证数据的完整一致。校园二手物品交易系统采用MySQL作为后台数据库开发工具。

4.4.1 数据库概念设计

概念模型用于信息世界的建模,与具体的DBMS无关。为了把现实世界中的具体事物抽象、组织为某一DBMS支持的数据模型。人们常常首先将现实世界抽象为信息世界,然后再将信息世界转换为机器世界。也就是说,首先把现实世界中的客观对象抽象为某一种信息结构,这种信息结构并不依赖于具体的计算机系统和具体的DBMS,而是概念级的模型,然后再把模型转换为计算机上某一个DBMS支持的数据模型。实际上,概念模型是现实世界到机器世界的一个中间层次。

信息世界中包含的基本概念有实体和联系。

  • 实体 (entity):客观存在并可相互区别的事物称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。例如,一个学生、一门课、一个供应物、一个部门、一本 书、一位读者等都是实体

  • 联系 (relationship):在现实世界中,事物内部以及事物之间是有联系的,这些联系在信息世界中反映为实体内部的联系和实体之间的联系。实体内部的联系通常是组成实体的各属性之间的联系。两个实体型之间的联系可以分为3类,一对一联系,(1:1);一对多联系(1 : n);多对多联系(m : n)

概念模型是对信息世界建模,所以概念模型应该能够方便、准确地表示信息世界中的常用概念。概念模型的表示方法很多,其中最为常用的是P.P.S.Chen于1976年提出的实体,联系方法(Entity-Relationship Approach)简记为E-R表示法)。该方法用E-R图来描述现实世界的概念模型,称为实体-联系模型,简称E-R模型。根据数据流程分析,绘制校园二手物品交易系统的全局E-R模型如图4-6。

根据系统分析的主要实体有:用户、物品、角色分类、订单、收藏、评论、回复、物品图、一级分类和二级分类。各个实体具体的描述属性图如下(实体属性在下图中并没有全部给出,因为属性过多的原因):

用户实体

物品实体

角色分类实体

订单实体

收藏实体

评论实体

回复实体

物品图实体

一级分类实体

二级分类实体

4.4.2数据库逻辑设计

数据库逻辑设计主要是把数据库概念设计时设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。它包括数据项、记录及记录间的联系、安全性和一致性约束等等。导出的逻辑结构是否与概念模式一致,从功能和性能上是否满足用户的要求,要进行模式评价。

本系统数据库名称为secondshop,数据库中包括:

  • 用户表(user_table)

  • 物品表(good_table)

  • 角色分类表(role_table)

  • 订单表(order_table)

  • 收藏表(collect_table)

  • 评论表(reply_table)

  • 回复表(review_table)

  • 物品图表(image_table)

  • 一级分类表(first_type_table)

  • 二级分类表(second_type_table)

各表数据结构如下:

用户表(user_table),存储用户信息

字段名称 数据类型 主键 是否空 说明
id int Y N 用户ID
name varchar N Y 用户昵称
mobile varchar N Y 手机号
email varchar N Y 邮箱
password varchar N Y 密码
code varchar N Y 用户标签
photo_url varchar N Y 头像地址
role_id int N Y 角色编号
gender varchar N Y 性别
registr_date datetime N Y 注册时间
status_id int N Y 用户状态ID

物品表(good_table),存储物品信息

字段名称 数据类型 主键 是否空 说明
id int Y N 物品ID
name varchar N Y 物品名
photo_url varchar N Y 物品图片地址
first_type_id int N Y 一级分类ID
second_type_id int N Y 二级分类ID
describe varchar N Y 描述
upload_date datetime N Y 发布日期
prise float N Y 价格
status_id int N Y 物品状态ID
user_id int N Y 用户ID
update datetime N Y 更新日期

角色分类表(role_table) ,存储角色分类信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
code varchar N N 用户标签
role varchar N N 角色

订单表(order_table) ,存储订单信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
good_name varchar N Y 物品名
seller varchar N Y 买家
seller_id int N Y 卖家ID
customer varchar N Y 买家名
customer_id int N Y 买家ID
good_id int N Y 物品ID
money int N Y 价格
submit_date datetime N Y 订单提交时间
end_date datetime N Y 订单结束时间
status_id int N Y 订单状态

收藏表(collect_table) ,存储收藏信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
good_id int N Y 物品ID
good_name varchar N Y 物品名称
user_id int N Y 用户ID

评论表(reply_table) ,存储信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
review_id int N Y 回复的ID
from_user varchar N Y 评论者昵称
from_user_id int N Y 评论者ID
to_user varchar N Y 回复者昵称
to_user_id int N Y 回复者ID
text varchar N Y 评论内容
upload_date datetime N Y 评论时间
status int N Y 评论的状态

回复表(review_table) ,存储信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
good_id int N Y 物品ID
from_user_id int N Y 评论者ID
from_user varchar N Y 评论者昵称
to_user_id int N Y 回复者ID
to_user varchar N Y 回复者昵称
text varchar N Y 评论内容
upload_date datetime N Y 评论时间
status int N Y 评论的状态

物品图表(image_table) ,存储物品图息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
good_id int N Y 物品ID
name varchar N Y 物品名
url varchar N Y 地址

一级分类表(first_type_table) ,存储一级分类信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
name varchar N Y 一级分类名

二级分类表(second_type_table) ,存储二级分类信息

字段名称 数据类型 主键 是否空 说明
id int Y N ID
first_type_id int N Y 一级分类ID
name varchar N Y 分类名

第五章 校园二手物品交易系统实现

本章节介绍了校园二手物品交易系统的实现,包括关键代码、用户模块和管理员模块的实现过程。

5.1 关键代码

本系统使用Maven,pom.xml是配置Maven的,而Maven是整个系统最重要的一部分。它主要是用来用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.wzh.secondshop</groupId>
  5. <artifactId>wzh-secondshop</artifactId>
  6. <packaging>war</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <name>wzh-secondshop Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <dependencies>
  11. <!--Servlet 3.0, EJB Lite 3.1, JPA 2.0, JSP 2.2, EL 1.2, JSTL 1.2, JSF 2.0, JTA 1.1, JSR-45, JSR-250.-->
  12. <dependency>
  13. <groupId>javax</groupId>
  14. <artifactId>javaee-web-api</artifactId>
  15. <version>6.0</version>
  16. <scope>provided</scope>
  17. </dependency>
  18. <!--Spring Core-->
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-context</artifactId>
  22. <version>4.3.3.RELEASE</version>
  23. <exclusions>
  24. <exclusion>
  25. <groupId>commons-logging</groupId>
  26. <artifactId>commons-logging</artifactId>
  27. </exclusion>
  28. </exclusions>
  29. </dependency>
  30. <!--Spring MVC-->
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-webmvc</artifactId>
  34. <version>4.3.3.RELEASE</version>
  35. </dependency>
  36. <!--JSTL-->
  37. <dependency>
  38. <groupId>jstl</groupId>
  39. <artifactId>jstl</artifactId>
  40. <version>1.2</version>
  41. </dependency>
  42. <!-- Bean Validation -->
  43. <dependency>
  44. <groupId>javax.validation</groupId>
  45. <artifactId>validation-api</artifactId>
  46. <version>1.1.0.Final</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.hibernate</groupId>
  50. <artifactId>hibernate-validator</artifactId>
  51. <version>5.2.4.Final</version>
  52. </dependency>
  53. <!--MySQL-->
  54. <dependency>
  55. <groupId>mysql</groupId>
  56. <artifactId>mysql-connector-java</artifactId>
  57. <version>5.1.34</version>
  58. </dependency>
  59. <!--Database Connection Pool-->
  60. <dependency>
  61. <groupId>commons-dbcp</groupId>
  62. <artifactId>commons-dbcp</artifactId>
  63. <version>1.4</version>
  64. </dependency>
  65. <!--MyBatis-->
  66. <dependency>
  67. <groupId>org.mybatis</groupId>
  68. <artifactId>mybatis</artifactId>
  69. <version>3.4.0</version>
  70. </dependency>
  71. <!--MyBatis-Spring-->
  72. <dependency>
  73. <groupId>org.mybatis</groupId>
  74. <artifactId>mybatis-spring</artifactId>
  75. <version>1.3.0</version>
  76. </dependency>
  77. <!--Spring JDBC-->
  78. <dependency>
  79. <groupId>org.springframework</groupId>
  80. <artifactId>spring-jdbc</artifactId>
  81. <version>4.3.3.RELEASE</version>
  82. </dependency>
  83. <!--Bridge logging from JCL to SLF4j-->
  84. <dependency>
  85. <groupId>org.slf4j</groupId>
  86. <artifactId>jcl-over-slf4j</artifactId>
  87. <version>1.7.21</version>
  88. </dependency>
  89. <!--http://logback.qos.ch/index.html-->
  90. <dependency>
  91. <groupId>ch.qos.logback</groupId>
  92. <artifactId>logback-classic</artifactId>
  93. <version>1.1.7</version>
  94. </dependency>
  95. <dependency>
  96. <groupId>junit</groupId>
  97. <artifactId>junit</artifactId>
  98. <version>RELEASE</version>
  99. </dependency>
  100. <!--Jackson-->
  101. <dependency>
  102. <groupId>com.fasterxml.jackson.core</groupId>
  103. <artifactId>jackson-databind</artifactId>
  104. <version>2.8.7</version>
  105. </dependency>
  106. <!--file upload-->
  107. <dependency>
  108. <groupId>commons-fileupload</groupId>
  109. <artifactId>commons-fileupload</artifactId>
  110. <version>1.3.1</version>
  111. </dependency>
  112. <dependency>
  113. <groupId>commons-io</groupId>
  114. <artifactId>commons-io</artifactId>
  115. <version>2.4</version>
  116. </dependency>
  117. </dependencies>
  118. <build>
  119. <finalName>wzh-secondshop</finalName>
  120. <plugins>
  121. <plugin>
  122. <groupId>org.apache.maven.plugins</groupId>
  123. <artifactId>maven-compiler-plugin</artifactId>
  124. <version>3.3</version>
  125. <configuration>
  126. <source>1.8</source>
  127. <target>1.8</target>
  128. <encoding>UTF-8</encoding>
  129. <showWarnings>true</showWarnings>
  130. </configuration>
  131. </plugin>
  132. </plugins>
  133. </build>
  134. </project>

注册页面前端jsp代码:register.jsp

  1. <body
  2. style="background-image: url(<c:url value="/statics/image/background/background1.jpg"/>); background-size: cover">
  3. <div class="container" style="margin-top: 30px;">
  4. <div class="row">
  5. <div style="margin: 20px auto; color: #ffffff">
  6. <h1 align="center" ; style="color: #292b33">新用户注册</h1>
  7. </div>
  8. <div class="col-xs-5 r"
  9. style="position: absolute; left: 50%; transform: translateX(-50%); padding: 30px; background-color: #ffffff">
  10. <form:form method="post" commandName="user" items="${user}"
  11. id="register">
  12. <spring:bind path="name">
  13. <div class="form-group">
  14. <form:label path="name" cssClass="control-label">姓名</form:label>
  15. <form:input path="name" cssClass="form-control"
  16. placeholder="请输入姓名"></form:input>
  17. </div>
  18. </spring:bind>
  19. <spring:bind path="gender">
  20. <div class="form-group">
  21. <form:label path="gender" cssClass="control-label">性别</form:label>
  22. <form:select path="gender" id="gender" cssClass="form-control">
  23. <form:option value="男"></form:option>
  24. <form:option value="女"></form:option>
  25. </form:select>
  26. </div>
  27. </spring:bind>
  28. <spring:bind path="mobile">
  29. <div class="form-group">
  30. <form:label path="mobile" cssClass="control-label">手机</form:label>
  31. <form:input path="mobile" cssClass="form-control"
  32. placeholder="请输入手机号码"></form:input>
  33. <output itemid="status" style="color: red"></output>
  34. </div>
  35. </spring:bind>
  36. <spring:bind path="email">
  37. <div class="form-group">
  38. <form:label path="email" cssClass="control-label">邮箱</form:label>
  39. <form:input path="email" cssClass="form-control"
  40. placeholder="请输入邮箱"></form:input>
  41. <output itemid="status" style="color: red" value=""></output>
  42. </div>
  43. </spring:bind>
  44. <spring:bind path="password">
  45. <div class="form-group">
  46. <form:label path="password" cssClass="control-label">密码</form:label>
  47. <form:input id="p1" path="password" cssClass="form-control"
  48. placeholder="请输入密码" type="password"></form:input>
  49. </div>
  50. </spring:bind>
  51. <spring:bind path="password2">
  52. <div class="form-group">
  53. <form:label path="password2" cssClass="control-label">确认密码</form:label>
  54. <form:input id="p2" path="password2" cssClass="form-control"
  55. placeholder="再次请输入密码" type="password" onblur="checkpass(this)"></form:input>
  56. <output id="passError" style="color: red"></output>
  57. </div>
  58. </spring:bind>
  59. <div class="form-group">
  60. <button type="submit" class="btn btn-primary">注册</button>
  61. <a class="btn btn-success pull-right"
  62. onClick="javascript :history.back(-1);">返回</a>
  63. </div>
  64. <output style="color: red">${status}</output>
  65. </form:form>
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. <script>
  71. function checkpass() {
  72. var password = document.getElementById("p1");
  73. var passwordConfirm = document.getElementById("p2");
  74. if (password.value != passwordConfirm.value) {
  75. document.getElementById("passError").innerHTML = "对不起,您2次输入的密码不一致";
  76. } else {
  77. document.getElementById("passError").innerHTML = "";
  78. }
  79. }
  80. </script>
  81. <script src="<c:url value="/statics/jquery-1.12.4/jquery-1.12.4.js"/>"></script>
  82. <script src="<c:url value="/statics/bootstrap-3.3.0/js/bootstrap.js"/>"></script>
  83. <script src="<c:url value="/statics/jquery-ui-1.12.1/jquery-ui.js"/>"></script>
  84. <script
  85. src="<c:url value="/statics/jquery-ui-1.12.1/datepicker-zh-CN.js"/>"></script>
  86. </body>

处理物品业务逻辑代码:GoodsController.java

  1. @RequestMapping(value = "/", method = RequestMethod.GET)
  2. public String getHomeGoods(
  3. ModelMap model,
  4. @RequestParam(required = false, defaultValue = "") String searchText,
  5. @RequestParam(required = false) Integer secondTypeId,
  6. @RequestParam(required = false, defaultValue = "0") int offset,
  7. @RequestParam(required = false, defaultValue = "40") int limit) {
  8. List<Good> goods = goodService.getGoodsBySearchAndType(searchText,
  9. secondTypeId, offset, limit);
  10. double goodsNum = goodService.getGoodsBySearchAndTypeCount(searchText,
  11. secondTypeId);
  12. List<FirstType> firstTypes = typeService.getAllFirstType();
  13. for (FirstType firstType : firstTypes) {
  14. firstType.setSecondType(typeService
  15. .getSecondTypeByFirstTypeId(firstType.getId()));
  16. }
  17. model.addAttribute("firstTypes", firstTypes);
  18. model.addAttribute("goods", goods);
  19. model.addAttribute("pages", Math.ceil(goodsNum / limit));
  20. model.addAttribute("goodsNum", goodsNum);
  21. model.addAttribute("offset", offset);
  22. model.addAttribute("limit", limit);
  23. return "home/homeGoods";
  24. }
  25. @RequestMapping(value = "/goods/goodInfo", method = RequestMethod.GET)
  26. public String getGoodInfo(ModelMap model, HttpSession httpSession,
  27. @RequestParam(required = false) Integer goodId) {
  28. Good goodInfo = goodService.getGoodById(goodId);
  29. if (goodInfo == null) {
  30. return "goods/error";
  31. }
  32. Integer collect = 1;
  33. User user = (User) httpSession.getAttribute("user");
  34. if (user == null) {
  35. collect = 0;
  36. } else {
  37. if (collectService.getCollect(goodId, user.getId())) {
  38. collect = 2;
  39. }
  40. }
  41. List<Image> images = imageService.getImageByGoodId(goodId);
  42. User goodUser = userService.getUserById(goodInfo.getUserId());
  43. goodInfo.setGoodUser(userService.getUserById(goodInfo.getUserId()));
  44. goodInfo.setGoodSecondType(typeService.getSecondTypeById(goodInfo
  45. .getSecondTypeId()));
  46. List<Review> reviews = reviewService.gerReviewByGoodId(goodId);
  47. for (Review review : reviews) {
  48. review.setReplys(reviewService.gerReplyByReviewId(review.getId()));
  49. }
  50. List<Good> goods = goodService.getRECGoods(goodInfo.getSecondTypeId(),
  51. goodInfo.getId());
  52. model.addAttribute("message", message);
  53. model.addAttribute("reviews", reviews);
  54. model.addAttribute("goodInfo", goodInfo);
  55. model.addAttribute("images", images);
  56. model.addAttribute("goodUser", goodUser);
  57. model.addAttribute("goods", goods);
  58. model.addAttribute("collect", collect);
  59. message = "";
  60. return "goods/goodInfo";
  61. }
  62. @RequestMapping(value = "/goods/goodInfo", method = RequestMethod.POST)
  63. public String putReview(
  64. @RequestParam(value = "goodId", required = false) Integer goodId,
  65. @RequestParam(value = "reviewId", required = false) Integer reviewId,
  66. @RequestParam(value = "fromUserId", required = false) Integer fromUserId,
  67. @RequestParam(value = "toUserId", required = false) Integer toUserId,
  68. @RequestParam(value = "fromUser", required = false) String fromUser,
  69. @RequestParam(value = "toUser", required = false) String toUser,
  70. @RequestParam(value = "replyText", required = false, defaultValue = "") String replyText,
  71. @RequestParam(value = "reviewText", required = false, defaultValue = "") String reviewText) {
  72. if (reviewText.equals("")) {
  73. if (replyText.equals("")) {
  74. message = "内容不能为空!";
  75. return "redirect:/goods/goodInfo?goodId=" + goodId;
  76. } else {
  77. Reply reply = new Reply();
  78. reply.setReviewId(reviewId);
  79. reply.setFromUser(fromUser);
  80. reply.setFromUserId(fromUserId);
  81. reply.setToUser(toUser);
  82. reply.setToUserId(toUserId);
  83. reply.setText(replyText);
  84. if (reviewService.insertReply(reply) == 1) {
  85. message = "回复成功!";
  86. return "redirect:/goods/goodInfo?goodId=" + goodId;
  87. } else {
  88. message = "回复失败!";
  89. return "redirect:/goods/goodInfo?goodId=" + goodId;
  90. }
  91. }
  92. } else {
  93. Review review = new Review();
  94. review.setGoodId(goodId);
  95. review.setFromUser(fromUser);
  96. review.setFromUserId(fromUserId);
  97. review.setToUserId(toUserId);
  98. review.setText(reviewText);
  99. if (reviewService.insertReview(review) == 1) {
  100. message = "评论成功!";
  101. return "redirect:/goods/goodInfo?goodId=" + goodId;
  102. } else {
  103. message = "评论失败!";
  104. return "redirect:/goods/goodInfo?goodId=" + goodId;
  105. }
  106. }
  107. }
  108. @RequestMapping(value = "/goods/publishGood", method = RequestMethod.GET)
  109. public String getPublishGood(ModelMap model, HttpSession session) {
  110. User user = (User) session.getAttribute("user");
  111. if (user == null) {
  112. return "redirect:/";
  113. }
  114. Good good = new Good();
  115. List<FirstType> firstTypes = typeService.getAllFirstType();
  116. List<Good> goods = goodService.getAllGoods(0, 5);
  117. model.addAttribute("goods", goods);
  118. model.addAttribute("good", good);
  119. model.addAttribute("firstTypes", firstTypes);
  120. return "goods/publishGood";
  121. }
  122. @RequestMapping(value = "/goods/publishGood", method = RequestMethod.POST)
  123. public String getGoodId(ModelMap model, HttpSession session,
  124. @Valid Good good) {
  125. List<FirstType> firstTypes = typeService.getAllFirstType();
  126. User user = (User) session.getAttribute("user");
  127. List<Good> goods = goodService.getAllGoods(0, 5);
  128. good.setUserId(user.getId());
  129. good.setPhotoUrl("/statics/image/goods/default/nophoto.png");
  130. if (goodService.insertGood(good) != 1) {
  131. System.out.println("插入物品失败!");
  132. }
  133. model.addAttribute("goods", goods);
  134. model.addAttribute("good", good);
  135. model.addAttribute("firstTypes", firstTypes);
  136. return "goods/publishGood";
  137. }
  138. @RequestMapping(value = "/goods/publishGood/uploadImage", method = RequestMethod.POST)
  139. public String uploadImage(
  140. HttpSession session,
  141. @RequestParam(value = "goodId", required = false) Integer goodId,
  142. @RequestParam(value = "mainFile", required = false) MultipartFile mainFile,
  143. @RequestParam(value = "file", required = false) MultipartFile[] file)
  144. throws IOException {
  145. User user = (User) session.getAttribute("user");
  146. FileCheck fileCheck = new FileCheck();
  147. RandomString randomString = new RandomString();
  148. String filePath = "/statics/image/goods/" + user.getId() + "/" + goodId;
  149. String pathRoot = fileCheck.checkGoodFolderExist(filePath);
  150. String name;
  151. if (!mainFile.isEmpty()) {
  152. String fileName = goodId + randomString.getRandomString(10);
  153. String contentType = mainFile.getContentType();
  154. String imageName = contentType
  155. .substring(contentType.indexOf("/") + 1);
  156. name = fileName + "." + imageName;
  157. mainFile.transferTo(new File(pathRoot + name));
  158. String photoUrl = filePath + "/" + name;
  159. goodService.updateGoodPhotoUrl(photoUrl, goodId);
  160. }
  161. for (MultipartFile mf : file) {
  162. if (!mf.isEmpty()) {
  163. // 生成uuid作为文件名称
  164. String fileName = goodId + randomString.getRandomString(10);
  165. // 获得文件类型(可以判断如果不是图片,禁止上传)
  166. String contentType = mf.getContentType();
  167. // 获得文件后缀名称
  168. String imageName = contentType.substring(contentType
  169. .indexOf("/") + 1);
  170. name = fileName + "." + imageName;
  171. System.out.println("name:" + name);
  172. mf.transferTo(new File(pathRoot + name));
  173. Image image = new Image();
  174. image.setGoodId(goodId);
  175. image.setName(name);
  176. image.setUrl(filePath + "/" + name);
  177. imageService.insertImage(image);
  178. } else {
  179. System.out.println("文件为空!");
  180. }
  181. }
  182. return "redirect:/goods/goodInfo?goodId=" + goodId;
  183. }
  184. @RequestMapping(value = "/goods/userGoods", method = RequestMethod.GET)
  185. public String getUserGoods(ModelMap model,
  186. @RequestParam(value = "userId", required = false) Integer userId) {
  187. User user = userService.getUserById(userId);
  188. List<Good> userGoods = goodService.getGoodStatusByUserId(userId);
  189. List<Good> goods = goodService.getAllGoods(0, 4);
  190. model.addAttribute("user", user);
  191. model.addAttribute("userGoods", userGoods);
  192. model.addAttribute("goods", goods);
  193. return "goods/userGood";
  194. }
  195. @RequestMapping(value = "/goods/userGoodEdit", method = RequestMethod.GET)
  196. public String getUserGoodEdit(ModelMap model,
  197. @RequestParam(value = "goodId", required = false) Integer goodId,
  198. HttpSession session) {
  199. User user = (User) session.getAttribute("user");
  200. if (user == null) {
  201. return "redirect:/";
  202. }
  203. Good good = goodService.getGoodById(goodId);
  204. List<FirstType> firstTypes = typeService.getAllFirstType();
  205. List<Good> goods = goodService.getAllGoods(0, 5);
  206. List<Image> goodImages = imageService.getImageByGoodId(goodId);
  207. model.addAttribute("goods", goods);
  208. model.addAttribute("good", good);
  209. model.addAttribute("goodImages", goodImages);
  210. model.addAttribute("firstTypes", firstTypes);
  211. return "goods/userGoodEdit";
  212. }
  213. @RequestMapping(value = "/goods/userGoodEdit", method = RequestMethod.POST)
  214. public String postGoodEdit(ModelMap model, HttpSession session,
  215. @Valid Good good) {
  216. List<FirstType> firstTypes = typeService.getAllFirstType();
  217. User user = (User) session.getAttribute("user");
  218. if (user == null) {
  219. return "redirect:/";
  220. }
  221. List<Good> goods = goodService.getAllGoods(0, 5);
  222. if (!(goodService.updateGood(good) > 0)) {
  223. System.out.println("修改物品失败!");
  224. }
  225. List<Image> goodImages = imageService.getImageByGoodId(good.getId());
  226. model.addAttribute("goods", goods);
  227. model.addAttribute("good", good);
  228. model.addAttribute("goodImages", goodImages);
  229. model.addAttribute("firstTypes", firstTypes);
  230. return "goods/userGoodEdit";
  231. }
  232. @RequestMapping(value = "/goods/userGoodEdit/updateImage", method = RequestMethod.POST)
  233. public String updateImage(
  234. HttpSession session,
  235. @RequestParam(value = "goodId", required = false) Integer goodId,
  236. @RequestParam(value = "mainFile", required = false) MultipartFile mainFile,
  237. @RequestParam(value = "file", required = false) MultipartFile[] file)
  238. throws IOException {
  239. User user = (User) session.getAttribute("user");
  240. FileCheck fileCheck = new FileCheck();
  241. imageService.deleteImage(goodId);
  242. RandomString randomString = new RandomString();
  243. String filePath = "/statics/image/goods/" + user.getId() + "/" + goodId;
  244. String pathRoot = fileCheck.checkGoodFolderExist(filePath);
  245. String name;
  246. if (!mainFile.isEmpty()) {
  247. String contentType = mainFile.getContentType();
  248. String fileName = goodId + randomString.getRandomString(10);
  249. String imageName = contentType
  250. .substring(contentType.indexOf("/") + 1);
  251. name = fileName + "." + imageName;
  252. mainFile.transferTo(new File(pathRoot + name));
  253. String photoUrl = filePath + "/" + name;
  254. goodService.updateGoodPhotoUrl(photoUrl, goodId);
  255. }
  256. for (MultipartFile mf : file) {
  257. if (!mf.isEmpty()) {
  258. String contentType = mf.getContentType();
  259. String fileName = goodId + randomString.getRandomString(10);
  260. String imageName = contentType.substring(contentType
  261. .indexOf("/") + 1);
  262. name = fileName + "." + imageName;
  263. System.out.println("name:" + name);
  264. mf.transferTo(new File(pathRoot + name));
  265. Image image = new Image();
  266. image.setGoodId(goodId);
  267. image.setName(name);
  268. image.setUrl(filePath + "/" + name);
  269. imageService.insertImage(image);
  270. }
  271. }
  272. return "redirect:/goods/goodInfo?goodId=" + goodId;
  273. }
  274. @RequestMapping(value = "/goods/userGoodEdit/delete/{goodId}", method = RequestMethod.GET)
  275. public ResponseEntity deleteGood(@PathVariable Integer goodId) {
  276. Boolean success;
  277. success = goodService.deleteGood(goodId) > 0;
  278. return ResponseEntity.ok(success);
  279. }
  280. @RequestMapping(value = "/goods/userGoodEdit/updateGoodStatus/{goodId}", method = RequestMethod.GET)
  281. public ResponseEntity updateGoodStatus(@PathVariable Integer goodId) {
  282. Boolean success;
  283. success = goodService.updateGoodStatusId(0, goodId) > 0;
  284. return ResponseEntity.ok(success);
  285. }
  286. @RequestMapping(value = "/admin/goods/allGoods", method = RequestMethod.GET)
  287. public ResponseEntity adminGetAllGoods() {
  288. List<Good> goodList = goodService.getAllGoodList();
  289. for (Good good : goodList) {
  290. good.setGoodUser(userService.getUserById(good.getUserId()));
  291. good.setGoodSecondType(typeService.getSecondTypeById(good
  292. .getSecondTypeId()));
  293. }
  294. return ResponseEntity.ok(goodList);
  295. }

5.2 用户模块

5.2.1 首页

用户进行系统,系统首页展示如下:

5.2.2 物品分类

显示物品分类,用户选择图书一级分类,显示二级分类,点击小说分类并显示有关小说的物品。

5.2.3注册登录

用户填写姓名、性别,手机、邮箱和密码就能注册成为本系统的用户了。

用户输入邮箱和密码,点击登录,即可登陆系统。

5.2.4 物品详情

显示物品详情,这种情况是用户未登录状态,用户不能购买、联系卖家和留言。

显示物品详情,用户已经登录,用户可以收藏和评论物品或者购买物品。

5.2.5 发布主页

用户登录成功后可点击发布,进入发布主页,进行发布物品操作。

5.2.6 我的主页

用户登录成功后可点击我的,进入我的主页,可以进行个人信息的修改,查看收藏的物品、发布物品、卖出的物品、收到的评论、收到的回复和所有订单。

5.3 管理员模块

5.3.1 管理员登录

系统后台登录,管理员输入账号和密码登录后台。

登录后台后,界面如下:

5.3.2 物品分类管理

系统管理员可以添加一级分类和二级分类,删除一级分类和二级分类。

5.3.3 物品管理

系统管理员可以对物品进行下架和删除操作。

5.3.4 订单管理

系统管理员可以对订单删除操作。

5.3.5 用户管理

系统管理员可以对用户进行禁用和删除操作。

第六章 系统测试

6.1 测试的目的与目标

在校园二手物品交易系统进行初步实现之后,开始进行对系统进行测试,找出系统中存在的Bug,通过测试,用提交的Bug报告来为以后软件的改进提供标准和参考,能够在以后的系统改进中找到依据。

测试后的软件各模块基本功能可以顺利进行,尽可能的提高软件的健壮性。

6.2 测试方法

  • 从是否关心软件内部结构和具体实现的角度划分:黑盒测试和白盒测试

  • 从是否执行程序的角度:静态测试和动态测试

  • 从软件开发的过程按阶段划分有:单元测试、集成测试、确认测试、系统测试、验收测试、回归测试、Alpha测试、Beta测试

单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块(这里所说的程序模块在Java中一个模块就是一个方法),进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。

集成测试 (组装测试、联合测试),通常在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:

  • 在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失

  • 一个模块的功能是否会对另一个模块的功能产生不利的影响

  • 各个子功能组合起来,能否达到预期要求的父功能

  • 全局数据结构是否有问题

  • 单个模块的误差累积起来,是否会放大,从而达到不能接受的程度

确认测试(Validation Testing),确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。

系统测试(System Testing),是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。系统测试的目的在于通过与系统的需求定义作比较, 发现软件与系统的定义不符合或与之矛盾的地方。

验收测试(Acceptance Testing),在通过了系统的有效性测试及软件配置审查之后,就应开始系统的验收测试。验收测试是以用户为主的测试。软件开发人员和QA(质量保证)人员也应参加。由用户参加设计测试用例,使用生产中的实际数据进行测试。在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、兼容性、可维护性、错误的恢复功能等进行确认。

6.3 测试用例

由于功能模块较多,测试内容篇幅较长,所以在本论文中只介绍登入系统的测试用例,表6.1是本系统用户登入的测试表,从测试的结果来看与期望结果完全相同。

登录系统测试用例

功能特性 用户登录验证
测试目的 验证是否输入合法的信息
测试数据 邮箱:1111 密码:1111
测试内容 操作描述 数据 期望结果 实际结果 测试状态
1 输入邮箱,按“登陆”按钮。 邮箱为:1111,密码为空 显示警告信息“邮箱或密码错误!” 显示警告信息“邮箱或密码误!” 与期望结果相同
2 输入密码,按“登陆”按钮。 邮箱为:空,密码为:1111 显示警告信息“邮箱或密码错误!” 显示警告信息“邮箱或密码错误!” 与期望结果相同
3 输入邮箱和密码,按“登陆”按钮。 邮箱为:1111,密码为:1111 显示警告信息“邮箱或密码错误!” 显示警告信息“邮箱或密码错误” 与期望结果相同
4 输入邮箱和密码,按“登录”按钮。 邮箱为:1111,密码为:1111 正确登入到用户操作界面 正确登入到用户操作界面 与期望结果相同

6.4 测试结论

把开始的代码写得越好,它出现的错误也就越少,你也就越能相信所做过的测试是彻底的。系统化测试以一种有序方式设法探测潜在的麻烦位置。同样,毛病最可能出现在边界,这可以通过手工的或者程序的方式检查。自动进行测试是最理想的,用得越多越好,因为机器不会犯错误、不会疲劳、不会用臆想某此实际无法工作的东西能行来欺骗自己。回归测试检查一个程序是否能产生与它们过去相同的输出。在做了小改变之后就测试是一种好技术, 能帮助我们将出现问题的范围局部化,因为新问题一般就出现在新代码里面。

测试和排错常常被说成是一个阶段,实际上它们根本不是同一件事。简单地说,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,为设法打败它而进行的一整套确定的系统化的试验。

Edsger Dijkstra有一个非常有名的说法:测试能够说明程序中有错误,但却不能说明其中没有错误。他的希望是,程序可以通过某种构造过程正确地做出来,这样就不再会有错误了,因此测试也就不必要了。这确实是个美好生活的目标,但是,对今天的实际程序而言,这仍然还只是一个理想。所以应该集中精力讨论如何测试,如何才能够更快地发现程序错误,如何才可以使得工作更有成效、效率更高。

结论与展望

设计开发基于 Jsp+SSM+MySql+Maven框架的校园二手物品交易系统是集业务管理与软件技术为一身的工作,只有在理解业务的基础上,才能对业务操作流程进行提炼优化,并通过软件设计与开发技术实现。本文设计的校园二手物品交易系统界面友好、功能丰富、操作简单,能适应大部分环境下的校园二手网络交易所需要的工作。本系统在设计采用了 J2EE 框架,设计上实现了高内聚、低耦合的要求,在设计上做到了可扩张和维护。本文在论文撰写、系统开发时对现有二手物品交易系统做了深入的调研,并行性了需求分析和系统设计,最终实现了一个实用的网上校园二手物品交易系统。

通过开发《校园二手物品交易系统》,我较为全面的掌握了JAVA的基本知识和编程技巧,并在开发过程中我的JAVA开发能力得到了进一步的提高。如:更进一步的深入了解MVC设计模式,软件三层框架;SQL语言的使用。

在开发过程中我学到了一些经验:系统分析的好坏将决定着的系统开发成功与否,一份好分析设计将是成功开发主要因素。我们在着手开发之前不要急于编程,先应有较长的时间去把分析做好,做好数据库设计工作,写出相关的开发文档等。然后再开始编写程序代码,这样做到每段代码心底都有数,有条不紊。当然也有些还需待继续深入地方如:控件的应用等。

此外,我们还觉得,我们个人在这次设计中走了很多弯路。主要是因为平时很少接触软件开发工作,在应用方面缺乏经验,以后还需要更多的努力。

对我们来说,这次设计的本身所产生的影响,还远远没有结束,我们从本次毕业设计中学到了许多课本上没有的知识。通过自己的学习和努力;通过老师的指导和教育,使我们不仅仅在知识水平和解决实际问题的能力上有了很大的提高。还从思想的深处体会到,要把自己的所学变成现实时所将面对的种种难题。

上传的附件 cloud_download secondary_market_on_campus-master.zip ( 7.89mb, 13次下载 ) cloud_download 设计文档.doc ( 6.15mb, 11次下载 )

发送私信

会冒泡的可乐

153
文章数
12
评论数
最近文章
eject