@TOC
springboot0791家具网站
第一章 绪 论
1.1研究背景
计算机网络的发展,促进了社会各行业的进步,带来了经济快速增长。计算机管理系统可以提高人们的工作效率,对人们生活的各个方面都有深远的影响。特别是销售公司,可以通过计算机网络进行在线销售,摆脱实体店的区域限制,最大限度的开展销售优势。企业通过电子商务网站发布产品,进行展示和推广,在网络上和客户进行实时的交流沟通,达成交易。网上销售为买卖双方都带了便利,节省了双方的时间。
目前,网络上有许多销售系统,提供了各种各样的商品信息,只需要一根网络就可以购买到需要的商品。电子商务将传统的商务进行简化,实现了交易流程的数字化,借助第三方平台进行数字支付,并通过物流进行配送,消费者无需出门就可以收到心仪的商品。电子商务系统的售后系统也很智能,对不满意或者出现问题的商品也可以提出服务,进行更换或者退货。电子商务模式改变了我们的生活,带来了便利和实惠,网上交易节省了流图环节,从生产到销售实现零环节交易,使得消费者可以买到优质商品。
家具网站主要为家具等企业使用的网上交易系统,可以结合实体店进行多方位销售,本家具网站主要进行家具销售活动,因此在网上购买家具时,一定需要提供对应的处方,以防购买到不合适的家具。家具网站利用网络技术和现代数据库理论,实现货物的在线浏览、在线交易、后台订单处理等功能。
家具与我们的生活是紧密联系的,有的时候家具代表着一种生活的品味与质量。而对于普通的大众,他们更倾向在线下的家具商城进行购买,但是有些时候线上购买更加方便快捷,所以设计这个网站,给顾客提供方便购买家具,并且可以让客户多了解家具。家具在每个家庭都有的,每户家庭都要依靠家具来“填充”自己的房屋。家具是一直都出现在我们生活里。我们可以依靠家具来装修自己生活的环境,并且还可以利用家具来美化我们的房屋。家具出现在我们家庭的概率是100%。很多人都有过在网上购买家具的经历,在网上购买家具可以浏览家具、查询家具资讯、购买方便快捷。这种方式能解决很多关于家具购买问题。并将在网上购买家具的方式推向了社会生活上。
1.2研究现状
电子商务是全球性的商业活动,一个大型网站可以实现全球购。在我国,电子商务活动也日趋成熟,以淘宝、京东、拼多多为代表的大型互联网公司独占鳌头,带动我国整体电子商务的发展。国家也非常重视我国电子商务的发展情况,国家两会也指出我们要实现产业转型,加快战略调整,并将电子商务作为新型发展的销售战略。从中央到地方,都提出各自措施来发展电子商务,电子商务的发展也带动了许多就业机会,对各小商品交易的用户提供了广阔的发展。
网上购买家具并不少见,因为网上家具在很大一部分会比较便宜,所以在网上购买家具具有一定的优越性。家具材料费用、劳动力成本费用等不断提高,导致大部分企业只能将这种压力转化到家具产品的价格上面。且传统的家具行业销售渠道单一、渠道建设很是不成熟,极大的限制了企业的发展。由于地域和资金方面的限制,家具行业中的一些地域品牌,还未能有更大的突破,还只是停留在“点”上.由于电子商务的快速发展,在成本方面,没有场地、装饰、样品,以及销售人员等费用的支出,家具电子商务极大的减少了中间环节,家具价格也出现普遍的降低,制作家具类网站也达到了薄利多销的目的.使更多人在网上购买家具。
电子商务逐渐和传统的产业进行融合,提高产业运行能力,发展创新。提倡绿色经济,惠及基础民生。我国电子商务的发展离不开全球化进程,加快和发达国家的交流,实现互惠互利,协同发展。特别是受新冠疫情的影响下,各国经济受到重创,只有通过电子商务的优势来逐渐整合资源,逐渐恢复。
我国电子商务的发展也异常曲折,从商品匮乏到支付瓶颈,发展到目前人人网购的局面,彰显了我国开拓电子商务市场过程的勇气和智慧。在今天,国内发展了许多电子商务网站,有各种连锁家具的线上家具网站。京东也可以通过处方购买对应的家具。
而美国是电子商务发展最早的国家,特别是以亚马逊为代表的巨头,销售额全球第一。自从94年开始,美国NetMDket实现第一笔网上交易开始,代表了传统交易迈入新的方式。美国的电子商务交易相对成熟,信用体系完善。在网购中,很少出现劣质商品,无论卖家和买家都受到社会信用体系影响,交易纠纷较少。但是目前,美国电子商务的时效性并可以国内发展的迅猛,总体交易量低,收货等待时间长,在线支付比例低。
1.3课题意义
社会的发展,web技术也得到了前所未有的机遇,以电子商务网站为代表的互联网企业快速的崛起,冲击着实体企业。各种网络购物狂欢日的销售额接二连三的打破记录,从6.18、双11、双12等活动,带来了一个又一个销售神话。可见,电子商务逐渐改变着我们的生活。
网络购物有着许多优势,降低了实体店的销售成本,不需要进行店面装修,商品库存积压和人员开销。店家只需要通过后台发布商品即可。而对于消费者,足不出户可以选购商品,在线比价,节省时间和费用。利用电子商务系统管理商品,大大提高管理效率,随时掌握商品销售情况,快速调整销售对策,发展企业。
家具网站利用电子商务的优势,为家具企业带来升级转型,建立和消费者在线的联系平台。开发家具网站,有以下几点实际意义。首先,降低了运营成本,节省了店铺装修成本。其次,节省了各种宣传成本,不需要印刷海报,利用多媒体技术进行促销即可。然后,可以实现7*24小时运营,自动售货。最后,通过家具网站发布各种信息,为客户免费提供在线服务,提高了客户获得感。同时,家具网站为企业减少了库存成本,提高了家具管理效率,一定可以带来更高的利润。
由于现在有很多家庭对家具的需求挺大的,所以家具的消费群体也是有大部分.当今互联网网民不断增多,客户群体大。此次设计的网站是家具购物平台,用户进行购买时更加直接和方便;现在网络能带来更多的消费需求,刺激消费;第三方支付,有利于双方的交易安全;便捷的沟通,拥有便捷的客服销售体系;并且家具质量也能得到保障.有够硬的家具制作技术,团队合作服务有利于家具产品满足需求。
家具网站的实现,最大可能的发挥了互联网的优势,适应了现代化发展要求,促进家具销售的科学性和规范化,因此,本课题值得大力推广。
第二章 相关技术简介
2.1 JAVA技术
JAVA是解释性的浏览器脚本语言,目前广泛运用于web开发,语法简单,入门快,开发系统效率高。而且JAVA是开源的,开发者可以根据需要对JAVA进行扩展。JAVA具有独特的语法,执行效率高,因为JAVA代码是在服务器端执行的,所以,效率也比较高。JAVA的引擎机制会把执行后的结果保存到客户端内存中,当用户再次访问这个页面时,直接从内存读取,不需要重新从服务器端解释执行,这个过程比较高效。
开发web有许多脚本语言,如ASP/PHP/PYTHON等,JAVA和其它语言相比较,有独特的优势。JAVA开发成本低,因为入门低,学习的程序员多,开源等。JAVA对数据库的支持简单,无需复杂的操作就可以链接各种数据库,特别是mysql是比较出色的搭配 。JAVA另外一个特点是跨平台,支持各种操作系统,不需要编译,就可以在服务器运行。
2.2 MYSQL数据库
家具网站使用MYSQL开发,MYSQL是开源的,是为数不多的免费关系型数据库之一。Mysql数据库部署和维护简单,并具有性能高效性和安全性,也可以跨平台进行运行,不但能在windows上,也可以运行在linux上。Mysql扩展了关系型引擎。Mysql不具有可视化管理界面,往往通过第三方软件进行管理,或者通过web端管理器进行管理。通过可视化操作可以快速的进行数据库表的创建、数据的插入读取等。Mysql支持通用的SQL语句,MYSQL还可以Windows集成,完成数据仓库,对数据进行分析的功能。
MySQL通过标准的SQL进行管理,支持多线程操作,通过操作系统的资源,提高运行速度。本系统可以通过TCP/IP或者ODBC等方式链接数据库,虽然不能处理大规模的数据,但是对于本系统足够。MYSQL数据库通过管理系统来访问,其中数据库管理系统和接口原理如图2.1数据库管理系统和接口的原理所示。
图2.1 数据库管理系统和接口的原理
MySQL通过DOS窗口进行管理,默认情况下,MySQL的端口为3306,也可以通过配置文件或者SQL命令进行修改。完成修改后,一般都需要重新启动MySQL的服务。MySQL查重的数据在data文件夹中,可以把数据文件进行备份,也可以通过SQL还原,保存脚本文件。
2.3 B/S结构
家具网站使用B/S结构,这种结构是当前广泛采用的框架。突破了传统的C/S结构,为用户带来独特的体验。用户通过浏览器查看系统,然后调用业务功能层的CGI,并根据相关业务读取数据库操作,最终返回到浏览器中。
B/S架构是软件发展必然的结果,当客户端软件足够大的时候,一个PC电脑一方面无法安装太多的应用,对存储空间要求太大,而且各种软件的维护成本太高。如果客户端的操作系统出现故障,那么这些软件的更新都是很大问题。所以,使用浏览器访问的B/S系统,就不存在这些问题,客户端可以整理各种系统或者网站的域名,通过域名访问即可,即使电脑系统出现问题,也不影响。
在家具网站中,只需要把系统的程序部署到服务器端即可,客户端通过互联网下任意电脑都可以访问,这也方便了用户,提高了用户体验。
B/S架构中,使用POST方法请求服务器,使用HTTP协议,通过URL传递路径,服务器端接收请求后,解析URL,根据问号传递的参数生成HTML文件,客户端接收信息后,解析数据,显示信息到界面。
2.4 SpringBoot
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。
第三章 系统分析
3.1可行性分析
3.1.1技术可行性
技术可行性分析是对开发家具网站的技术可行性评估,提前进行规范,现在适合的技术,可以事半功倍。
系统使用JAVA和MYSQL数据库。JAVA是比较成熟的语言,开发系统具有很多优势,完全开源免费。JAVA是嵌入在HTML中的,在服务器运行后,进行解释。JAVA具有独特的语法,执行效率高,因为JAVA代码是在服务器端执行的。JAVA的引擎机制会把执行后的结果保存到客户端内存中,当用户再次访问这个页面时,直接从内存读取,运行速度快。
JAVA是网络编程语言,对于本系统的开发作为合适,在技术上具有可行性。
3.1.2操作可行性
操作可行性主要考虑开发系统后,是否操作方便,是否可以解决现有的问题,是否可以提高相应的效率。本系统使用web模式,通过浏览器即可访问,操作简单。进入系统后,通过主页的菜单快速的进入各个子功能,通过鼠标和键盘就可以完成各种事项。在操作上具有可行性。
3.1.3经济可行性
经济比较包括两个方面,投入和收益。投入上包括开发系统需要的人力成本和服务器硬件成本。人力成本上,一个月的人力成本就5000元左右。服务器硬件成本1万元。而收益上,开发家具网站后可以使用多年,并可以分析给其它高校使用,投入使用一年的收益都将大于投入,所以,在经济上可行。
3.1.4时间可行性
计划使用两个月完成系统的分析、设计、实现和实施。通过前期的调研,完成系统时间需要一个月时间即可,考虑到后期的修改和实施,预留了足够的时间,所以,开发家具网站时间上可行。
3.2系统需求分析
3.2.1市场需求
计算机信息技术和互联网的发展,整个商业提供了更好的发展条件,忙碌的人民生活得到了更多的方便。在家具业,从传统的购买方式发展到如今的线上销售,客户通过家具网站查看家具信息,根据订购量和受欢迎程度来衡量家具的好坏,不仅可以订购到优质的家具,也可以享受到快捷的送货服务。
近年来,许多商家都关注网络销售,推广家具销售的同时,提高内部管理效率,家具网站使用,必将带动家具销售。 在当今竞争激烈的大环境下,构建家具网站势在必行。
3.2.2性能需求
分析家具网站的用户使用情况,整理系统所有性能要求,估算系统性能要求。预计系统最大访问量,对系统的数据库链接量,带宽访问量进行控制。对系统的技术参数进行设置,规划与探索系统并发要求等。
分析系统功能,对各项功能的设计分析和实现,达到整体性要求。系统数据库和程序实现具有条理化,系统业务清晰。另外,系统的编程规范统一,界面风格统一,系统数据库维护间隔统一,只有做到整体规划和要求,才能更好的持续性。
家具网站的安全性主要是系统的数据安全性,保证系统数据的完整和安全。在系统设计上,对必要信息进行加密,放在被窃取;系统访问控制,对于非法用户,禁止访问;对于数据库要定期备份;在网络传输上,使用专门的服务器和宽带线路进行搭建。尽最大可能的保证数据安全。
家具网站的开发不是一次开发后就一成不变的,后期需要改变业务规则,升级维护其它功能等。所以,系统结构选择B/S的,只需要在服务器上就可以维护升级,不需要关心客户端。另外,在功能和系统架构设计上,对应数据字段,需要单独设计为数据库表,后期维护表数据即可,对应创建的需求功能,如商品管理,可以设计额外的接口实现数据的导入或者导出。
3.2.3功能需求
家具网站为用户提供在线购买的服务,前台用户注册后,进行在线购买需要的家具,后台管理员登录后管理家具信息。
会员未登录前,浏览系统上的所有公告信息,查看最新的活动,查看各种通知或者优惠信息。通过家具分类,查看分类对应的家具。家具信息一般包括家具图片,家具描述和价格信息。会员使用本系统前,进行注册,填写个人信息。包括账号和密码,设置地址信息。信息注册后,后台需要对信息进行审核,通过审核的才能进行登录。会员通过搜索查找到家具后,先把家具加入到购物车中,也可以收藏家具,以供下次继续预订。在个人购物车中,可以修改订购的家具数量,或者删除家具。完成购物车的编辑后,提交购物车家具到收银台进行订单结算。订单生成中,默认加载登录用户的购物地址信息,确定无误后,提交订单并进行支付,因为是毕业设计,没法设置收款方,模拟支付成功。购物完毕后,等待接收家具。会员的信息不是一成不变的,比如更换了电话、或者地址信息后,通过会员中心对这些信息进行修改,及时保持最新的个人信息。
管理员是系统的后台管理者,一般是家具的经营者或者经理等角色。管理员控制系统整个的信息。开通家具网站后,录入新闻公告等各类型的文章,后期的运行中,发布的优惠信息,都可以通过这个及时的补充。
管理者对家具类别进行设置,录入家具类别下的家具。对现有家具进行拍照,上传家具图片,设置一个合适的价格,并发布出去。家具信息是家具网站非常重要的信息,所以在发布时,一定要认真编辑。价格根据实际情况,再经营过程中,进行合理的调整。
管理员对订单的管理,会员购物后,在购物记录中,可以查看对应的订单信息。通知操作员及时准备家具,第一时间进行配送。订单信息包括了家具记录和会员的地址和电话信息。一段时间的订单,也可以进行统计,查看订单量,为决策做依据。
3.3系统UML用例分析
UML是统一建模语言,而用例图是UML需求分析阶段的一种方式,通过对家具网站的分析,系统包括前后台两种用户,不同的用户功能不同,其中系统UML用例图如图3.1系统UML用例图所示。
管理员
分类管理
家具管理
新闻管理
会员管理
订单管理
新闻查看
家具浏览
注册登录
在线购买
会员
图3.1 系统UML用例图
使用家具网站前,需要进行登录,登录用户包括前台会员和后台管理员,其中登录流程一样。
用户注册是家具网站前台的操作,游客用户没有账号前,需要进行注册,注册前,录入自己的实际信息,特别是用户名和密码需要牢记,用户注册后,把信息保存到数据库中。
家具网站中的个人账户是比较重要的信息,记录的有个人购买记录和各种积分。为了保护个人信息的安全,建议用户每月更换自己的密码,用户登录后,进行密码的修改。修改的时候,先检查之前的密码,进行验证,确认是本人操作后,输入新的密码,验证是否符合规则,并重复输入修改的密码,防止录入过程中出现错误,都得到验证后,修改数据库中的密码信息,更新完成,建议,重新登录系统后生效。
家具网站的销售中,可以先从管理员开始,管理员登录后,录入各种信息,重要的是家具分类和家具信息。系统前台中,会员登录系统,输入家具的查询条件,查询家具分类和家具信息。查看具体的家具信息,符合自己的要求后,加入家具到购物车中,未提交购物车时,可以对购物车内信息进行修改,提交购物车后,将要生成订单,初始订单状态为未支付,会员完成在线支付后,状态修改为已支付。管理员查看已支付订单,安排家具仓库管理员进行发货,修改状态为发货。让会员收到家具后,确认收货,订单状态修改为已完成,最终,管理员通过已完成的订单查看销售量。
第四章 系统设计
4.1系统架构设计
家具网站使用SpringBoot架构开发。家具网站的视图层使用JAVA和HTML开发,通过表单处理客户端的请求,获取控制器的响应结果后,使用JAVA标签显示数据。在分层的开发模式中,视图层可以和控制层分开开发,通过接口实现相互调用。
家具网站的控制器层来获取视图层的响应,并可以单独实现业务逻辑层进行调用,判断结果返回到界面层。
模型层是比较简单的层次,和数据库表进行对应,一个数据库表往往对应一个实体类,创建模型层后,编程人员不需要关注数据库,通过模型即可明确对应的字段信息。
4.2系统功能设计
本家具网站主要包括前台购买和后台管理,系统结构图如图4.2系统结构图所示。
图4.2系统结构图
4.2.1系统后台设计
家具网站的后台包括管理员登录、家具分类设计、家具管理设计、公告管理、订单管理设计、用户设计。
家具网站的登录还有管理员后台的登录,管理员登录的流程和会员的登录流程一样,管理员也存在一个数据库信息表,在初始化数据库的时候,默认插入几个管理员账号以供使用。
家具管理包括家具分类和家具信息管理。管理员先对家具进行分类,整理所有的分类信息。具有分类信息后,才能进行家具的管理。一个分类下对应多个家具信息,后台上架所有的家具信息后,前台显示家具。前台的家具显示分为所有的家具显示、家具分类下的查询、和单独家具搜索查询。
在删除商品分类的时,先要删除分类下的商品后,才能删除分类。修改一个家具分类名称后,在家具的类型中对应的分类名称都将改正。
家具网站的公告管理包括资讯信息和公告信息管理。管理员先公告进行管理。后台上传所有的公告信息后,前台显示公告。前台的公告显示分为所有的公告显示、公告分类下的查询、和公告点击排行等操作。
管理员对订单进行管理,查看订单信息,并把订单信息提交到后台。管理员统计一段时间内的订单信息。
用户管理是对管理员的管理和注册用户的管理。管理员一般设置一个用户即可,根据需求也可以另外添加,而注册用户只需要审核即可。
4.2.2系统前台设计
家具网站的前台包括首页、家具分类、全部家具、网站公告、我的购物车、我的订单、注册登录、个人中心。
首页显示了系统菜单页面,用户注册登录模块,首页是系统设计的关键页面,需要做的美观,赏心悦目,这样才能让更多的人留下来继续使用网站。
家具分类是查看对应分类下的家具信息。
全部家具是通过查询语句查询到系统所有的家具。
网站公告查询管理员录入的所有公告信息,点击标题查看具体的公告内容。
家具网站的用户购物前,需要登录。用户通过查询条件等方式查看家具信息,点击加入购物车,然后确定家具信息,提交到收银台,支付订单,然后完成购物的流程。对于不想要的订单,取消操作。
用户登录前需要进行注册,用户注册后把信息保存到数据库,然后进行登录。登录前,先进行信息的必填项验证,然后到会员数据库表查询输入的用户名和密码是否存在,然后返回用户信息。
其中用户密码使用MD5进行加密,加密后的信息是无法破解的。数据库查询到密码也是一串字符串密文,不能作为密码进行登录。用户输入密码登录的时候,再次使用MD5进行加密,最终比对的是加密后的字符串,这种密文保证了密码传输过程的安全性。
用户登录后可以查看我的历史订单,并更新个人信息等。
4.3数据库设计
4.3.1 数据库E-R图
ER图反映数据类型的关系,也可以映射现实模型。而且可以给出属性信息,下面给出家具网站的ER图信息。因为表的属性比较多,而界面篇幅有限,下面仅列出主要的属性。
管理员
订单
家具分类
家具
会员
购物车
管理
包括
审核
订购
结账
明细
1
1
n
n
1
N
1
n
1
N
n
1
名称
类型
名称
价格
图片
描述
类型
编号
编号
密码
登录名
商品
会员
数量
价格
家具
编号
用户名
密码
性别
编号
电话
邮箱
姓名
购买
N
属于
m
n
m
图4-3 系统整体E-R图
4.3.2 数据库表设计
本系统采用MYSQL数据库作为数据存储,下面介绍数据库中的各个表的详细信息。
管理员表是保存在线家具销售的用户信息表,其中表结构如4.1所示。
表4-1 admin管理员表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
Idyaopin | 主键 | int | 4 | 是主键 | 不能为空 |
Usernameyaopin | 用户名 | varchar | 50 | 不是 | 可以为空 |
Passwordyaopin | 密码 | varchar | 50 | 不是 | 可以为空 |
typeyaopin | 类型 | varchar | 30 | 不是 | 可以为空 |
订单表是保存在线家具销售的订单信息表,其中id为主键,表结构如4.2所示。
表4-2 orders订单表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
idyaopin | 主键 | int | 11 | 是主键 | 不能为空 |
onumberyaopin | 订单号 | varchar | 50 | 不是 | 可以为空 |
Spcyaopin | 家具 | varchar | 50 | 不是 | 可以为空 |
Slcyaopin | 数量 | varchar | 50 | 不是 | 可以为空 |
addressyaopin | 地址 | varchar | 50 | 不是 | 可以为空 |
teyaopin | 电话 | varchar | 13 | 不是 | 可以为空 |
emailyaopin | 用户邮箱 | varchar | 20 | 不是 | 可以为空 |
shffyaopin | 收货 | varchar | 60 | 不是 | 可以为空 |
zfffyaopin | 用户支付 | varchar | 10 | 不是 | 可以为空 |
leavewordyaopin | 用户留言 | varchar | 2000 | 不是 | 可以为空 |
addtimeyaopin | 日期 | time | 不是 | 可以为空 | |
xnameyaopin | 下单人 | varchar | 10 | 不是 | 可以为空 |
ztyaopin | 订单的状态 | varchar | 2 | 不是 | 可以为空 |
totalyaopin | 总价格 | varchar | 10 | 不是 | 可以为空 |
kuaidiyaopin | 快递名称 | varchar | 20 | 不是 | 可以为空 |
knumberyaopin | 单号 | int | 20 | 不是 | 可以为空 |
Receiveryaopin | 收货人姓名 | varchar | 10 | 不是 | 可以为空 |
类别表是保存在线家具销售的类别信息表,其中id为主键,表结构如4.3所示。
表4-3 category类别表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
idyaopin | 主键 | int | 4 | 是主键 | 不能为空 |
pidyaopin | 分类类型 | int | 6 | 不是 | 可以为空 |
titleyaopin | 分类名称 | varchar | 60 | 不是 | 可以为空 |
商品表是保存在线家具销售的商品信息表,其中id为主键,表结构如4.4所示。
表4-4 goods商品表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
idyaopin | 主键 | int | 4 | 是主键 | 不能为空 |
pidyaopin | 类型编号 | int | 4 | 不是 | 可以为空 |
categoryidyaopin | 分类编号 | int | 4 | 不是 | 可以为空 |
pnumberyaopin | 商品的编号 | varchar | 10 | 不是 | 可以为空 |
titleyaopin | 商品的名称 | varchar | 10 | 不是 | 可以为空 |
amountyaopin | 库存数量 | int | 10 | 不是 | 可以为空 |
cishuyaopin | 销量 | int | 10 | 不是 | 可以为空 |
mpriceyaopin | 市场的价格 | decimal | 10 | 不是 | 可以为空 |
spriceyaopin | 会员的价格 | decimal | 10 | 不是 | 可以为空 |
contentyaopin | 详细介绍 | text | 不是 | 可以为空 | |
apvyaopin | 点击 | int | 4 | 不是 | 可以为空 |
imgyaopin | 图片 | varchar | 50 | 不是 | 可以为空 |
statusyaopin | 状态 | int | 2 | 不是 | 可以为空 |
addtimeyaopin | 添加时间 | timestamp | 不是 | 可以为空 |
会员表是保存在线家具销售的会员信息表,其中id为主键,表结构如4.5所示。
表4-5 user会员表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
idyaopin | 主键 | smallint | 5 | 是主键 | 不能为空 |
accountyaopin | 用户名 | varchar | 64 | 不是 | 可以为空 |
nicknameyaopin | 昵称 | varchar | 50 | 不是 | 可以为空 |
passwordyaopin | 密码 | char | 32 | 不是 | 可以为空 |
emailyaopin | 邮箱 | varchar | 50 | 不是 | 可以为空 |
addtimeyaopin | 注册时间 | timestamp | 不是 | 可以为空 | |
imgyaopin | 头像 | varchar | 255 | 不是 | 可以为空 |
sexyaopin | 性别 | varchar | 255 | 不是 | 可以为空 |
telyaopin | 电话 | varchar | 50 | 不是 | 可以为空 |
addressyaopin | 地址 | varchar | 50 | 不是 | 可以为空 |
statusyaopin | 状态 | int | 2 | 不是 | 可以为空 |
公告表是保存在线家具销售的公告信息表,其中id为主键,表结构如4.6所示。
表4-6 content公告表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
idyaopin | 主键 | smallint | 5 | 是主键 | 不能为空 |
titleyaopin | 公告标题 | char | 32 | 不是 | 可以为空 |
contentyaopin | 公告内容 | varchar | 50 | 不是 | 可以为空 |
购物车表是保存在线家具销售的购物车信息表,其中id为主键,表结构如4.7所示。
表4-7 购物车信息表
列名 | 解释 | 类型 | 大小 | 主键 | 空 |
---|---|---|---|---|---|
id | 主键 | smallint | 5 | 是主键 | 不能为空 |
titleyaopin | 家具信息 | char | 32 | 不是 | 可以为空 |
shuliang | 数量 | varchar | 50 | 不是 | 可以为空 |
Huiyuan | 会员 | varchar | 50 | 不是 | 可以为空 |
第五章 系统的实现
5.1前台功能模块的实现
用户可进入家具网站可查看网站信息,包括网站首页,家具信息、网站公告等。系统前台主界面展示如图5.1系统前台主界面图所示。
图5.1系统前台主界面图
首页的导航栏为单独的一个页面,系统所有的页面在开发前,引入这个top页,就可以显示出导航栏的内容。再项目需要修改导航栏的时候,就可以单独修改top页面的代码,实现所有页面都进行修改的目的。
5.1.1 用户注册界面
未注册用户可进注册界面进行注册操作,用户注册界面展示如图5.2用户注册界面图所示。
图5.2 用户注册界面图
在用户信息添加界面,填写信息后,通过客户端验证后,提交数据到数据库。后台对用户信息进行保存操作,保存数据就,在数据库中可以查看到刚才录入的数据。用户注册在操作上属于数据的插入操作,用户注册前,需要验证该用户是否存在数据库,如果有这个用户,就不能继续注册。
5.1.2 用户登录界面
用户要想实现家具购买操作必须进行登录系统,用户登录界面展示如图5.3用户登录界面图所示。
图5.3 用户登录界面图
登录界面比较简洁,输入信息后,进行登录,登录验证需要经过两个步骤。第一个步骤是客户端验证,通过js实现必填项校验,一般情况,js也可以校验是否为数字,字符串大小等。通过验证后提交到服务器端进行验证,服务器验证是查询数据库的记录,得到数据后,返回验证通过信息。
5.1.3 个人资料界面
用户登录后可进行修改个人信息,个人资料界面展示如图5.4个人资料界面图所示。
图5.4 个人资料界面图
5.1.4 家具详情界面
用户在家具详情界面可查看家具详情,可点击购买按钮进行购买操作,家具详情界面展示如图5.5家具详情界面图所示。
图5.5 家具详情界面图
5.1.5 购物车界面
用户可进购物车界面查看购物车家具信息,购物车界面展示如图5.6购物车界面图所示。点击收银台按钮时进入地址填写界面。
图5.6 购物车界面图
在用户点击加入购物车后,通过客户端验证后,提交数据到数据库。后台对用户信息进行保存操作,保存数据就,在数据库中可以查看到刚才插入的数据。
5.1.6 我的订单界面
用户在我的订单界面可查看订单信息,对已发货的订单可进行确认收货操作,我的订单界面展示如图5.8我的订单界面图所示。
图5.8 我的订单界面图
在订单列表中,通过后台查询方法,把所有的订单信息读取到集合对象,订单界面使用JAVA标签,把集合对象通过html的方式显示到界面。查询有两种类型,一个是查询所有的订单集合,也可以通过条件查询订单,实现的sql语句不同而已,最终实现的流程一样。
5.2后台功能模块的实现
5.2.1 管理员登录界面
管理员要想进入系统后台对系统进行管理操作,必须进行登录,管理员登录界面展示如图5.9管理员登录界面图所示。
图5.9 管理员登录界面图
5.2.3 家具管理界面
管理员可进行家具管理操作,可添加、删除和编辑家具信息,家具管理界面展示如图5.11家具管理界面图所示。
图5.11 家具管理界面图
点击家具管理链接,录入家具信息。在家具信息添加界面,填写信息后,通过客户端验证后,提交数据到数据库。后台对家具信息进行保存操作,保存数据就,在数据库中可以查看到刚才录入的数据。录入家具信息后,在家具列表中,通过后台查询方法,把所有的家具信息读取到集合对象,把集合对象通过html的方式显示到界面。查询有两种类型,一个是查询所有的家具集合,也可以通过条件查询家具,实现的sql语句不同而已,最终实现的流程一样。在列表中,可以对家具信息进行删除,删除前,需要提示信息,是否确定删除。这一步骤的提示属于客户端控制,当确定删除后,调用服务器端删除方法,实现数据库数据删除,并刷新家具列表。
5.2.4 家具分类管理界面
管理员可添加、编辑和删除家具分类信息,家具分类管理界面展示如图5-12家具分类管理界面图所示。
图5.12家具分类管理界面图
点击家具分类管理链接,录入家具分类信息。在家具分类信息添加界面,填写信息后,通过客户端验证后,提交数据到数据库。后台对家具分类信息进行保存操作,保存数据就,在数据库中可以查看到刚才录入的数据。录入家具分类信息后,在家具分类列表中,通过后台查询方法,把所有的家具分类信息读取到集合对象,把集合对象通过html的方式显示到界面。查询有两种类型,一个是查询所有的家具分类集合,也可以通过条件查询家具分类,实现的sql语句不同而已,最终实现的流程一样。在列表中,可以对家具分类信息进行删除,删除前,需要提示信息,是否确定删除。这一步骤的提示属于客户端控制,当确定删除后,调用服务器端删除方法,实现数据库数据删除,并刷新家具分类列表。
5.2.5 订单管理界面
管理员可进行订单管理操作,可查看所有订单信息,并可对其订单进行发货和删除操作,订单管理界面展示如图5.13订单管理界面图所示。
图5.13订单管理界面图
5.2.6会员管理界面
管理员可查看所有会员信息,并可修改会员资料以及删除操作,会员管理界面展示如图5-14 会员管理界面图所示。
图5-14 会员管理界面图
在会员列表中,通过后台查询方法,把所有的会员信息读取到集合对象,把集合对象通过html的方式显示到界面。查询有两种类型,一个是查询所有的会员集合,也可以通过条件查询会员,实现的sql语句不同而已,最终实现的流程一样。在列表中,可以对会员信息进行删除,删除前,需要提示信息,是否确定删除。这一步骤的提示属于客户端控制,当确定删除后,调用服务器端删除方法,实现数据库数据删除,并刷新会员列表。
DiscussjiajuxinxiController.java
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.DiscussjiajuxinxiEntity;
import com.entity.view.DiscussjiajuxinxiView;
import com.service.DiscussjiajuxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
* 家具信息评论表
* 后端接口
* @author
* @email
* @date 2021-03-27 17:11:41
*/
@RestController
@RequestMapping("/discussjiajuxinxi")
public class DiscussjiajuxinxiController {
@Autowired
private DiscussjiajuxinxiService discussjiajuxinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,DiscussjiajuxinxiEntity discussjiajuxinxi,
HttpServletRequest request){
EntityWrapper<DiscussjiajuxinxiEntity> ew = new EntityWrapper<DiscussjiajuxinxiEntity>();
PageUtils page = discussjiajuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussjiajuxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,DiscussjiajuxinxiEntity discussjiajuxinxi, HttpServletRequest request){
EntityWrapper<DiscussjiajuxinxiEntity> ew = new EntityWrapper<DiscussjiajuxinxiEntity>();
PageUtils page = discussjiajuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussjiajuxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( DiscussjiajuxinxiEntity discussjiajuxinxi){
EntityWrapper<DiscussjiajuxinxiEntity> ew = new EntityWrapper<DiscussjiajuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( discussjiajuxinxi, "discussjiajuxinxi"));
return R.ok().put("data", discussjiajuxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(DiscussjiajuxinxiEntity discussjiajuxinxi){
EntityWrapper< DiscussjiajuxinxiEntity> ew = new EntityWrapper< DiscussjiajuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( discussjiajuxinxi, "discussjiajuxinxi"));
DiscussjiajuxinxiView discussjiajuxinxiView = discussjiajuxinxiService.selectView(ew);
return R.ok("查询家具信息评论表成功").put("data", discussjiajuxinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
DiscussjiajuxinxiEntity discussjiajuxinxi = discussjiajuxinxiService.selectById(id);
return R.ok().put("data", discussjiajuxinxi);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
DiscussjiajuxinxiEntity discussjiajuxinxi = discussjiajuxinxiService.selectById(id);
return R.ok().put("data", discussjiajuxinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody DiscussjiajuxinxiEntity discussjiajuxinxi, HttpServletRequest request){
discussjiajuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(discussjiajuxinxi);
discussjiajuxinxiService.insert(discussjiajuxinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody DiscussjiajuxinxiEntity discussjiajuxinxi, HttpServletRequest request){
discussjiajuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(discussjiajuxinxi);
discussjiajuxinxiService.insert(discussjiajuxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody DiscussjiajuxinxiEntity discussjiajuxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(discussjiajuxinxi);
discussjiajuxinxiService.updateById(discussjiajuxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
discussjiajuxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<DiscussjiajuxinxiEntity> wrapper = new EntityWrapper<DiscussjiajuxinxiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = discussjiajuxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
NewsServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.NewsDao;
import com.entity.NewsEntity;
import com.service.NewsService;
import com.entity.vo.NewsVO;
import com.entity.view.NewsView;
@Service("newsService")
public class NewsServiceImpl extends ServiceImpl<NewsDao, NewsEntity> implements NewsService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<NewsEntity> page = this.selectPage(
new Query<NewsEntity>(params).getPage(),
new EntityWrapper<NewsEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<NewsEntity> wrapper) {
Page<NewsView> page =new Query<NewsView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<NewsVO> selectListVO(Wrapper<NewsEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public NewsVO selectVO(Wrapper<NewsEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<NewsView> selectListView(Wrapper<NewsEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public NewsView selectView(Wrapper<NewsEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
InterceptorConfig.java
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import com.interceptor.AuthorizationInterceptor;
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport{
@Bean
public AuthorizationInterceptor getAuthorizationInterceptor() {
return new AuthorizationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
super.addInterceptors(registry);
}
/**
* springboot 2.0配置WebMvcConfigurationSupport之后,会导致默认配置被覆盖,要访问静态资源需要重写addResourceHandlers方法
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/admin/")
.addResourceLocations("classpath:/front/")
.addResourceLocations("classpath:/public/");
super.addResourceHandlers(registry);
}
}