🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。
- 代码可以私聊博主获取。🌹
- 赠送计算机毕业设计600个选题excel文件,帮助大学选题。
- 赠送开题报告模板,帮助书写开题报告。
作者完整代码目录供你选择:
- 《Springboot网站项目》400套
- 《ssm网站项目》800套
- 《小程序项目》300套
- 《App项目》500套
- 《python网站项目》600套
⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡
项目演示
摘 要
互联网社会的到来,让各行各业通过互联网实现了浴火重生的可能,每个行业都发现了完全可以使用互联网技术用来提高信息在内部的传递效率,提高管理水准。通过本次对个性化图书推荐系统的设计和开发,不仅能巩固已经学到的知识,还能学习更多的专业知识,提升专业素养,熟悉设计流程,掌握编程知识。不管是从程序的设计分析以及编码,都有了很多的感悟。
个性化图书推荐系统采用当前最流行的IDEA工具进行开发,使用Java语言,框架使用SSM框架,算法使用协同过滤算法。系统能实现书籍订单管理,书籍评价管理,收货地址管理,书籍管理等功能。
个性化图书推荐系统不仅在操作上面符合常规操作,在信息处理环节更加的符合设计需求,符合生产需求,提高了用户粘度,节省了社会资源,能极大的提升图书订单,图书信息管理方面的效率。
关键词:Java语言;SSM框架;协同过滤算法
第1章 绪论
1.1课题背景
生产资料的不断扩大,还采用大量的人工方式处理相关数据,已经阻碍了社会的继续发展,当社会进入到电气时代,家家户户都可以用上了电力照明技术,随着电磁技术的发展,信息的可持续传递取得了蓬勃发展。随着地域的扩大,相关信息完全可以通过电子信号进行传递,不用人为的走动即可获取相关信息,互联网时代的到来,就是这么悄无声息而又水到渠成。国内互联网从无序发展到有序发展,从单机到网络互联,也就这么几十年的时间,而恰好是这几十年的时间,中国的发展取得了辉煌的成就,尤其是互联网的发展,走到了世界前列,从村村通电到村村通网,是一个信息社会发展的重要台阶。采用互联网思维,把现有的一些信息处理流程变成网络化处理,可以极大的提高信息处理速度。在这样的大环境下,针对图书信息管理,设计一个个性化图书推荐系统,不仅仅可以更上时代的潮流,还能规范信息处理的流程,提高处理效率,降低信息处理成本,可以让使用者有更多的精力和资源投入其他的方面创造效益。
1.2课题意义
信息时代的到来,与传统农耕社会的不同在于信息的更新以及传递更加的迅速,加快了人们对于信息处理的节奏,如果还是拥抱过去的信息处理技术,比如比较怀古的人还用毛笔来进行记账或者记录一下长篇大论的东西,这个可以称之为情怀,但是不能成为社会的主流。当今社会,不管是课堂还是课外,基本上人人持有可移动终端,可以随时的被动以及主动获取相关信息以及社会舆论,不管是移动终端还是电脑,都只是一个获取以及处理信息的一个窗口,关于数据的服务端处理还是需要专业的软件来进行分发。采用计算机来进行设计某些想要的需求,是可靠的。所以开发个性化图书推荐系统不仅可以实现快速的信息处理,并且不知疲倦,可靠稳定,符合当今社会的发展潮流。
个性化图书推荐系统的开发意义有以下几点:
(1)个性化图书推荐系统不仅规范了操作人员的操作流程,还提高了信息处理的效率。
(2)操作符合正常人们的审美观,并且符合正常的操作逻辑,使用方便。
(3)对比人们以前的信息处理速度,现在的速度是符合社会发展的,也是当前社会最快的信息处理方法。
(4)极大的降低了人工成本,个性化图书推荐系统可以全天候的等待,随时可以查看和处理相关数据。
1.3研究内容
本文从绪论,开发环境与技术,系统分析,设计,实现,测试等方面来描述系统。
绪论:介绍系统的开发意义与背景。
开发环境与技术:介绍系统采用的数据库,选用的编程语言和框架等知识。
系统分析:介绍系统功能需求,可行性以及非功能需求等内容。
系统设计:介绍设计的系统功能结构,设计的数据库等内容。
系统实现:选用部分功能来介绍系统的实现情况。
系统测试:介绍测试内容和测试的部分功能。
第2章 开发环境与技术
2.1 MySQL数据库
MySQL数据库的存储结构是完全符合关系型数据库规则的,并且符合行式数据库的美学,存放的数据是以表格的形式存在的,每一行都会对应相关的字段用来存储相关字段的值,并且可以对每个字段进行数据定义和空间大小定义,数据定义解决了同类数据的存储精度,空间定义则是对数据的大小进行了完美的规划。比如当前国内的手机号码都是不超过11位的纯数字,那么定义手机号的字段完全可以定义为int(11),这样即使表内大量的存储相关数据,最起码在手机号这个字段存储效率上达到了压缩极致,还有其他的字段类型也是一样的考虑。充分分析项目所需要的数据模式,以及当前在现实生活中的具体实例,可以有效的帮助我们定义好相关的数据库存储模块。之所以不使用其他的关系型数据库,比如SQL Server数据库和Oracle数据库,最主要的原因就是它们两个的安装包都好几个G,安装过程和使用过程会占用当前使用的计算机的大量性能,影响使用效果,并且卸载和安装都是很麻烦,稍微有点问题就需要对电脑的操作系统进行重装,这样会浪费时间,并且影响开发效率的。所以最终选择使用了MySQL数据库。
2.2 IDEA开发工具
Idea这款软件也是有二十多年的历史了,Java语言推出之后,刚开始人们开发用的是最简单的记事本来进行编写,随着时间的发展,业务不断的增加,功能也变多了,代码自然而然也就变多了,人们急需一款可以辅助人们管理代码的软件,前期记事本和高级记事本也只是多了些代码标记而已,并没有大的提升,好多环境还是需要手动配置的,随着eclipse的发展,MyEclipse这款商业集成曾经占领了很大一部分市场,当年用Windows XP系统的时候都可以用eclipse和MyEclipse软件,那个时候也有了idea,但是国内用的人比较少,随着国内经济的不断发展,计算机硬件的不断提升,人们的眼界越来越宽阔,所以idea就出现了中文版,然后用的人就越来越多了。Idea能做的事情,MyEclipse都能做到,但是idea首先颜值很高,可以选择好几种开发模式,看起来很漂亮,让程序员使用的时候赏心悦目,功能并不少,还有国人喜欢的绿色功能,不需要安装,解压就可以用,而MyEclipse官网下载的是必须安装才能使用的。
2.3 Java语言
Java语言的流行到现在依然是程序开发行业的标杆之一,就能看出Java语言的魅力所在了。Java语言是强类型语言,特别适合某些大中型企业对于程序运行的稳定要求,之所以说Java稳定,在于Java的可移植性,适合各种类型的服务器平台,像那些嵌入式语言或者其他只能在某个平台上运行的语言,已经逐渐的开始学习Java语言的特性了,各种语言都在不断的吸收对方的优点来强化自身,虽然出现了很多小众的语言来解决特定的业务需求,但是非特定需求还是需要强壮的Java语言来进行开发。Java这个强类型语言,要求对各种数据类型进行强制性的定义,就像考驾照一样,大家必须遵守一定的规则,类似于红灯停绿灯行这样的要求,Java语言比考驾照更严谨,如果出现未定义的变量类型,那么在开发过程中,只能的IDE就会提示你未定义某某变量,甚至不用等你运行程序就能明白错误在哪里。Java语言可移植的特性在于Java程序并不是直接运行在各种服务器平台上面,而是运行在属于自己的Java平台上面,也就是翻译过来的Java虚拟机,Java虚拟机有各种服务器版本,这个由Java语言的公司来进行开发和提供,我们只需要免费使用即可,不用考虑开发出来的程序具体是运行在哪个平台上面。
2.4 SSM框架
现在是只要搞Java Web应用必须要会的框架就是SSM框架,这三个框架可以做很多事情,是当前最主流的框架,只要是招聘Java Web开发的相关程序员肯定会问对SSM框架的熟练程度如何。SSM框架已经变成国内Java Web相关产业的开发主流。Spring经过多年的发展,已经越来越稳定,贯穿整个开发的持久层和业务层以及表现层,可以无缝整合各种框架,作为中间件而言是很好用的。Spring MVC最重要的是对前端的渲染,不管前端用JSP还是某些VUE或者其他框架,都可以很好的支持。MyBatis框架使用效果是很棒的,属于半自动化,在整个业务需要的SQL语句可以手动更改,简单的操作语句也是可以自动生成的,一些复杂的语句更是可以手动优化,可以达到很好的效果,这一点就不是Hibernate可以比拟的,虽然说Hibernate也能做MyBatis的所有工作,但是Hibernate用的HQL,在学习成本上面还是选择MyBatis比较合适。
2.5协同过滤算法
协同过滤算法起始于邮件系统,当每天接收邮件很多,仅仅依靠自己分类会耽误大量时间和精力,后来专门研发出来自己对于某种类型的邮件进行标准喜欢还是不喜欢,这样喜欢的邮件优先推荐出来。一方面通过用户的喜好反馈,另一方面服务端通过收集用户的喜好反馈信息经过计算之后会分发给用户同类型的内容,称之为协同过滤算法。目前,协同过滤算法广泛应用于短视频,购物,邮件等各个方面。通过协同过滤算法可以在网络上面获取到自己愿意接触的并且观点一致的信息,因为是经过用户互动的一种算法,所以更加被用户接受。
第3章 系统分析
课题的确定,对本人的后续研究提供了主要方向。通过在各大专业网站上搜索相关文献,了解相关可实现的技术知识以及功能大致相同的实现,结合本课题的具体实现具体分析,才能分析出课题的具体功能。系统分析主要是对功能实现提供最主要的理论支撑,会影响到后续的所有开发环节,所以很重要。
3.1可行性分析
任何系统的开发过程都非常漫长且充满坎坷,所以一旦确定系统进入开发阶段,就不能放弃。为了避免出现中途放弃开发系统这样的现象,提高系统的开发成功率,前期的可行性分析就能够为系统是否能够达到目标提供充分的分析材料,也是为系统能否进入开发阶段提供依据。
(1)技术可行性
个性化图书推荐系统使用的技术有Java技术,MySQL数据库技术等,这些技术目前在网络上进行了公开,且有很多的成功项目的开发都运用了上述技术,开发出来的系统在满足功能实用的前提下,同时具有操作简便,具有很高的互动性的特点。此外,系统为了不局限使用用户,让使用者可以在任意场合和任意时间段操作系统,特意采用B/S模式设计开发,为后期系统的维护提供了方便,也让系统在经过一段时间的市场考验之后,进行系统功能扩展升级提供了可能性。因此,系统技术可行。
(2)经济可行性
在系统开发期间,无论是系统的开发平台,还是系统开发运用的技术目前都能通过网络成功获取,并且不需要支付费用,所以在技术方面不存在费用支出。但是本系统用于计算机代替人工处理种类繁多的数据,在一定程度上方便了管理者,在数据处理效率上也有明显的提升,同时相较于之前的人工管理,该系统也节省了人工成本,所以系统开发经济可行。
(3)操作可行性
每个用户在使用系统过程中,可能运用的浏览器和操作系统都不一样,所以本系统在设计中,需要考虑系统兼容性,让不同用户在不同环境以及不同条件下都能正常使用系统。同时系统的界面布局合理,界面导航功能清晰,用户能够在短期培训之后可以轻松使用系统,对于那些有计算机操作基础的用户,可以免培训即可操作本系统。因此,系统操作可行。
3.2功能需求
个性化图书推荐系统将使用人员划分为两类,分别是管理员,用户。这些使用者中,管理员的操作权限最大,拥有所有功能的操作权限,其他使用者都是根据工作需要合理的安排部分功能。
(1)管理员功能分析
图3.1展示了管理员用例图。针对管理员角色,系统允许其操作所有的功能,其主要包括用户购买书籍产生的所有书籍订单信息,管理员对这些书籍订单主要负责发货,对书籍的信息进行集中管理,发布系统前台展示的公告等。
图3.1管理员用例图
(2)用户功能分析
图3.2展示了用户用例图。针对用户角色,系统允许其在系统的前台参与书籍购买,管理用户自己购买书籍的订单,管理用户的收货地址以及对订单中的书籍进行评价等。
图3.2用户用例图
3.3非功能性需求
本节将从接口设计要求,可靠性需求等角度来分析系统在非功能层面上的需求。
(1)性能需求
本系统投入使用之后,不可能只是单一用户操作使用,因此该系统要支持很多个用户的连接,同时也能支持许多用户同时操作本系统。另外借助网络的优势,对本系统的日常运行时间也进行规范,要求系统能够提供7×24小时不间断的服务。
(2)功能操作故障
当系统运行期间,遇到了功能操作上的故障时,系统应该不能受到任何影响,还能继续提供功能服务。
(3)接口设计要求
本系统在接口的设计上一定要规范化设计,在定义接口时要始终遵循使用方便,扩展方便以及很容易让人理解的原则进行开展。同时设计的接口一定要具备完整性特点,具备灵活性以及开放性等特点,毕竟接口在程序的二次开发中,进行系统功能扩展上是非常重要的。
(4)可靠性需求
系统的可靠性需求表现在系统可利用性以及系统维护时间上面这两方面的需求。从系统可利用性方面来讲,系统应做到7×24小时连续运行,并且,在一年365天内,该系统正常运行的时间应该达到的比率为98%。从系统计划维护服务时间的层面上来讲,当系统出现故障,需要进行维护时,需要避开人们的上班时间,维护服务工作通常在早上九点至下午六点以外的时间段进行。这样才能不影响用户使用系统,保证系统的可靠性。
3.4系统流程
任何一个流程图都是反应了对应事务的处理逻辑,通常都有开始与结束的标识,中间是事务处理的各种逻辑,包括输入的数据以及判断逻辑等信息。
(1)操作流程如图3.4所示。
图3.4 系统操作流程
个性化图书推荐系统的功能是给需要的用户进行使用,所以任何访客在使用系统的功能前,必须通过登录功能提交验证信息,符合条件的用户才可以进入功能处理的界面。
(2)登录流程如图3.5所示。
图3.5 登录流程
个性化图书推荐系统的登录功能的设置可以直接避免无关用户骚扰系统,降低对系统数据泄露的风险。其主要工作流程则是验证用户提交的账号密码,并进行相应的逻辑判断,只有通过登录功能验证机制的用户才可以收到“登录成功”的系统反馈信息。
(3)添加信息流程如图3.6所示。
图3.6 添加信息流程
用户添加数据不仅需要根据个性化图书推荐系统的界面的提示字段填写信息,还要注意已录入数据的合法性,因为系统只会成功提交合法的数据。
(4)删除信息流程如图3.7所示。
图3.7删除信息流程
个性化图书推荐系统经历了长时间使用之后,用户就需要删除无用或重复的数据。系统为了保护这些数据,也为了避免用户的误删现象,每次在删除数据前则会再三提示用户是否确定删除数据。当用户确定之后,系统才会执行数据删除功能。
第4章 系统设计
4.1系统整体设计方案
个性化图书推荐系统的设计在体系结构模式的选择上还是比较青睐于用户层,功能层和数据层这样的三层结构,俗称B/S结构。这种结构模式在Internet兴起之后,大部分的应用程序都会将其作为首选结构设计模式。
(1)用户层:个性化图书推荐系统的使用人员通常在用户层登录系统,使用系统,对数据的输入和输出进行处理;
(2)功能层:在用户层和数据层的中间,就分布着功能层,功能层主要就是把用户的请求以SQL语句的方式来对数据库进行检索,最终将数据检索的结果传递给用户层;
(3)数据层:数据层主要就是实现对数据库的操作,一般都是增加,修改,删除,查找数据。每当数据层接收到来自上层的数据操作请求时,就会根据该指令去操作数据库,最终反馈给上层执行结果。
4.2功能结构设计
前面对个性化图书推荐系统的功能需求的分析只是大致的划分功能模块,接下来的工作就是对这些大致的功能进行细分。让个性化图书推荐系统的内容变得更具体,更丰富。
(1)管理员功能结构设计
图4.1展示的是管理员功能结构。系统将管理员的个人中心模块划分为个人信息管理与修改密码子模块,将基础数据管理功能划分为公告类型管理与书籍分类管理子模块。将书籍管理功能划分为书籍管理,书籍评价管理,书籍收藏管理,书籍订单管理子模块。
图4.1管理员功能结构
(2)用户功能结构设计
图4.2展示的是用户功能结构。系统将用户的个人中心模块划分为收货地址,书籍收藏,书籍订单子模块,将书籍信息的功能划分为查询书籍,收藏书籍,添加购物车,立即购买,查看评论子模块,将购物车功能划分为修改信息,删除信息,直接购买子模块。
图4.2用户功能结构
4.3数据库设计
数据库的设计是对系统相关数据要求的具体设计。需要对各个对象进行数据类型具体化,比如每个表都要有自己的主键,有些关键性数据不可以直接采用删除操作,只能采用伪装删除的操作,比如专门设置一个字段就是删除标记字段,默认没删除就是0,如果已经删除则设置为1,这样如果有大量数据的删除,只需要更新相关字段的值就行,不需要大量的对磁盘进行删除操作,在性能上面有很大的提升。目前市场上主流的数据库基本上都符合设计的功能需求,但是一切要根据实际出发,首先开发使用的电脑是自己上学用的,那么首选对电脑性能要求没那么高的数据库,其次尽量使用自己曾经学习过的数据库,这样学习成本会降低,时间上就有空余的时间来安排其他事情。本系统通过数据库设计相关的分析,采用MySQL数据库。
4.3.1数据库概念设计
有一个专门用来描述数据库实体与参数之间的图叫做E-R图,E-R是英文缩写,经过多年的传播,已经变成了数据库实体之间联系的专业名字,一般都用缩写E-R图表示,不再采用英文全称。现实世界有很多相关的数据,如何应用到数据库存放就需要进行归类,实体与属性之间的关系不能混淆,一个实体可以有多个属性,一个属性可能对应多个实体,实体和属性之间的关系是需要用图的形式进行描述的,不然不直观。采用Visio画图工具来画E-R图是一种很明智的选择。Visio是专门用来画图的工具之一,内置了很多图形选项,画E-R图用Visio画是正确的,Visio画的图形可以进行保存,复制到其他地方还可以进行编辑,如果缺少某些属性可以直接用Visio打开进行修改,是非常方便的。接下来展示本系统的部分实体图以及实体关系E-R图。
(1)书籍订单实体图如图4.4所示。其主要包括收货地址,快递公司,快递单号等属性。
图4.4 书籍订单实体图
(2)用户实体图如图4.5所示。其主要包括姓名,余额,性别等属性。
图4.5 用户实体图
(3)书籍实体图如图4.6所示。其主要包括书籍照片,书籍原价等属性。
图4.6 书籍实体图
(4)购物车实体图如图4.7所示。其主要包括购买数量,添加时间等属性。
图4.7 购物车实体图
(5)实体间关系E-R图如图4.8所示。
图4.8 实体间关系E-R图
4.3.2数据库物理设计
二维表是传统的用来记录相关表与属性之间关系的一种专业图表。表里面每个字段名称都是唯一的,代表当前表的某一个唯一的属性,如果有多个属性,那么就会多几个字段来进行描述。二维表的概念如下:
关键字:每个表建议有且只有一个主键,用来表达数据的专一性和唯一性。也可以通过设定的关键字与其他表进行关联。
元组:二维表显示数据有行与列的关系,行是可以增加的,列是提前设定好的,每一行数据成为元组。
属性:列的名称一般称为属性,也就是字段,比如一个正常人拥有的属性必然有姓名,性别,不管是姓名还是性别,都可以称之为属性。
关系:有列有行只是一张二维表的表达,这张二维表的名称就是行与列的关系,比如用户表,比如有用户账号的属性也就是列,用户的姓名属性也是列,用户属性都有成为元组,很多用户都在这个表里之间的关系成为用户表。
以上内容表示数据之间的关系,通过对数据进行分析和归纳,二维表用来描述和存储相关数据。个性化图书推荐系统数据表设计结果展示如下:
表4.1 购物车表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
yonghu_id | int(11) | 所属用户 | 允许空 |
shuji_id | int(11) | 书籍 | 允许空 |
buy_number | int(11) | 购买数量 | 允许空 |
create_time | timestamp | 添加时间 | 允许空 |
update_time | timestamp | 更新时间 | 允许空 |
insert_time | timestamp | 创建时间 | 允许空 |
表4.2 书籍表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
shuji_name | varchar(200) | 书籍名称 | 允许空 |
shuji_uuid_number | varchar(200) | 书籍编号 | 允许空 |
shuji_photo | varchar(200) | 书籍照片 | 允许空 |
shuji_types | int(11) | 书籍分类 | 允许空 |
shuji_kucun_number | int(11) | 书籍库存 | 允许空 |
shuji_old_money | decimal(10,2) | 书籍原价 | 允许空 |
shuji_new_money | decimal(10,2) | 现价 | 允许空 |
shuji_clicknum | int(11) | 书籍热度 | 允许空 |
shuji_content | text | 书籍介绍 | 允许空 |
shangxia_types | int(11) | 是否上架 | 允许空 |
shuji_delete | int(11) | 逻辑删除 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.3 书籍评价表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
shuji_id | int(11) | 书籍 | 允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
shuji_commentback_text | text | 评价内容 | 允许空 |
insert_time | timestamp | 评价时间 | 允许空 |
reply_text | text | 回复内容 | 允许空 |
update_time | timestamp | 回复时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.4 公告表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
gonggao_name | varchar(200) | 公告名称 | 允许空 |
gonggao_photo | varchar(200) | 公告图片 | 允许空 |
gonggao_types | int(11) | 公告类型 | 不允许空 |
insert_time | timestamp | 公告发布时间 | 允许空 |
gonggao_content | text | 公告详情 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.5 管理员表
字段 | 类型 | 说明 | 允许空 |
id (主键) | bigint(20) | 主键 | 不允许空 |
username | varchar(100) | 用户名 | 不允许空 |
password | varchar(100) | 密码 | 不允许空 |
role | varchar(100) | 角色 | 允许空 |
addtime | timestamp | 新增时间 | 不允许空 |
表4.6 收货地址表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(20) | 主键 | 不允许空 |
yonghu_id | int(20) | 创建用户 | 不允许空 |
address_name | varchar(200) | 收货人 | 不允许空 |
address_phone | varchar(200) | 电话 | 不允许空 |
address_dizhi | varchar(200) | 地址 | 不允许空 |
isdefault_types | int(11) | 是否默认地址 | 不允许空 |
insert_time | timestamp | 添加时间 | 不允许空 |
update_time | timestamp | 修改时间 | 不允许空 |
create_time | timestamp | 创建时间 | 不允许空 |
表4.7 书籍收藏表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
shuji_id | int(11) | 书籍 | 允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
shuji_collection_types | int(11) | 类型 | 允许空 |
insert_time | timestamp | 收藏时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.8 用户表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
username | varchar(200) | 账户 | 允许空 |
password | varchar(200) | 密码 | 允许空 |
yonghu_name | varchar(200) | 用户姓名 | 允许空 |
yonghu_phone | varchar(200) | 用户手机号 | 允许空 |
yonghu_id_number | varchar(200) | 用户身份证号 | 允许空 |
yonghu_photo | varchar(200) | 用户头像 | 允许空 |
sex_types | int(11) | 性别 | 允许空 |
yonghu_email | varchar(200) | 电子邮箱 | 允许空 |
new_money | decimal(10,2) | 余额 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
表4.9 书籍订单表
字段 | 类型 | 说明 | 允许空 |
id (主键) | int(11) | 主键 | 不允许空 |
shuji_order_uuid_number | varchar(200) | 订单号 | 允许空 |
address_id | int(11) | 收货地址 | 允许空 |
shuji_id | int(11) | 书籍 | 允许空 |
yonghu_id | int(11) | 用户 | 允许空 |
buy_number | int(11) | 购买数量 | 允许空 |
shuji_order_true_price | decimal(10,2) | 实付价格 | 允许空 |
shuji_order_courier_name | varchar(200) | 快递公司 | 允许空 |
shuji_order_courier_number | varchar(200) | 快递单号 | 允许空 |
shuji_order_types | int(11) | 订单类型 | 允许空 |
shuji_order_payment_types | int(11) | 支付类型 | 允许空 |
insert_time | timestamp | 订单创建时间 | 允许空 |
create_time | timestamp | 创建时间 | 允许空 |
当需要描述系统具体实现的功能点的时候,一方面肯定是要用文字表达实现的功能,另一方面完全可以从系统的具体实现页面把可以用文字描述的操作界面以图片的形式放到文字的下方,这样的表达方式可谓之言之有物,更容易理解系统实现的功能部分。
5.1 管理员功能实现
5.1.1 书籍管理
图5.1展示的是书籍管理界面。
图5.1 书籍管理界面
此界面展示了所有的管理员管理的书籍信息,其信息包括书籍的照片,书籍的原价,书籍热度,以及书籍目前的状态是上架状态还是下架状态等信息。每条书籍信息的右侧区域,展示了管理员可以操作的内容,主要有上架书籍,修改书籍部分资料,下架书籍,删除书籍资料等。
5.1.2 书籍评价管理
图5.2展示的是书籍评价管理界面。
图5.2 书籍评价管理界面
此界面展示了前端的购买书籍的用户提交的对书籍的相关评价信息。其中主要包括评价的具体内容,评价的书籍的名称,用户姓名等信息,每条书籍的右侧区域都有可供管理员操作的功能,其中主要有回复用户评价的书籍信息,删除书籍评价信息等。
5.1.3 书籍订单管理
图5.3展示的是书籍订单管理界面。
图5.3 书籍订单管理界面
此界面展示了各种书籍的销售情况信息,除了展示书籍的名称,分类以及照片等基础信息之外,也对购买书籍的用户的资料进行了相应展示,同时也显示了书籍的快递单号等信息。对于每条书籍订单,管理员需要如实核查外,还需要及时发货。
5.1.4 用户管理
图5.4展示的是用户管理界面。
图5.4 用户管理界面
此界面展示了已经注册个性化图书推荐系统的用户的资料以及管理员自己新增的用户资料。用户资料除了显示余额信息外,其账户,姓名,头像等信息也会相应进行展示。而管理员可以操作的功能主要是重置密码,或者修改用户的资料。
5.2 用户功能实现
5.2.1 书籍信息
图5.5展示的是书籍信息界面。
图5.5 书籍信息界面
此界面除了展示基本的书籍介绍信息外,也把购买当前书籍的用户的相关评论信息放在界面底部进行展示,同时为了让用户在短时间内购买到需要的书籍,界面的右侧区域则会展示系统推荐的书籍。本界面也提供书籍收藏功能,以及提供添加购物车功能,让用户根据需要合理进行操作。
5.2.2 购物车
图5.6展示的是购物车界面。
图5.6 购物车界面
此界面主要用于展示用户添加购物车中的所有书籍信息,对于每条购物车中的书籍信息,用户可以实现其数量的增减或购物书籍的删除操作。界面的底部显示购买购物车所有书籍时,用户需要支付的价格信息,以及提供给用户购买购物车书籍的入口。
5.2.3 确认下单
图5.7展示的是确认下单界面。
图5.7 确认下单界面
此界面让用户核对即将购买的书籍信息,以及查看支付的价格信息,同时选择自己的收货地址信息,当用户点击支付按钮即可成功下单。
5.2.4 书籍订单
图5.8展示的是书籍订单界面。
图5.8 书籍订单界面
此界面展示了用户购买书籍的所有订单,每种订单所处状态不一样,有已支付的订单,这时用户可以操作的功能有退款操作,有已发货的订单,这时用户可以操作的功能有收货操作等。
第6章 系统测试
6.1功能测试
系统的功能不仅需要在使用者使用中发挥其价值,并且对一些使用者的错误操作,系统也会及时提醒。如此系统才可以获取使用者的信任。
(1)登录功能测试
表6.1为管理员登录功能测试表。检测此功能主要有两项重要内容,一个是账号,另一个是密码。账号和密码一定要相互匹配才能操作成功。
表6.1 管理员登录功能测试表
账号 | 密码 | 预期结果 | 实际结果 |
管理员登记的账号内容为gly,此账号是管理员自己的登录账号 | 管理员登记的密码内容为gly,此密码是管理员自己的登录密码 | 操作成功 | 成功登录 |
管理员登记的账号内容为adm,此账号不属于管理员 | 管理员登记的密码内容为gly,此密码是管理员自己的登录密码 | 操作失败 | 系统提示账号错误 |
管理员登记的账号内容为gly,此账号是管理员自己的登录账号 | 管理员登记的密码内容为adm,此密码不属于管理员 | 操作失败 | 系统提示密码错误 |
管理员登记的账号内容为%&*,此账号格式有非法字符 | 管理员登记的密码内容保持空白 | 操作失败 | 系统提示账号格式有误,密码不能为空 |
(2)修改密码功能测试
表6.2为修改密码功能测试表。成功修改密码的前提条件就是对旧密码一定要正确输入,否则,使用者将操作失败。
表6.2 修改密码功能测试表
旧密码 | 新密码 | 预期结果 | 实际结果 |
管理员登记的旧密码内容为gly,此密码是管理员的正确登录密码 | 管理员登记的新密码内容为adm,此密码是管理员新设置的密码 | 修改成功 | 密码修改成功 |
管理员登记的旧密码内容为hsf,此密码不是管理员的登录密码 | 管理员登记的新密码内容为adm,此密码是管理员新设置的密码 | 修改失败 | 系统提示旧密码错误,密码修改失败 |
管理员不登记旧密码的内容 | 管理员登记的新密码内容为adm,此密码是管理员新设置的密码 | 修改失败 | 系统提示请输入旧密码,密码修改失败 |
6.2系统测试结果
经过科学的系统测试环节,个性化图书推荐系统各项指标符合设计预期,同时在操作性和容易维护方面做的也不错,可以投入生产。
结 论
此次我选择的毕业课题是研究和实现一个个性化图书推荐系统,为了完成个性化图书推荐系统的开发任务,我进行了一系列和课题相关的开发工作。在最初,通过资料查找和分析,大体了解了开发个性化图书推荐系统的流程,先确定系统的开发技术,即运用成熟,安全,高效的面向对象的编程语言Java进行功能上的代码编写,同时采用可以保存上千条数据,支持快速查询数据,管理数据,优化数据的MySQL数据库管理工具来保存个性化图书推荐系统的数据。紧接着把大量精力都用在系统的功能划分,设计系统方案,实现系统功能的工作上。个性化图书推荐系统的开发主要是为了方便使用者管理数据,运用数据,因此其实现的功能主要有用户在线购买书籍,管理书籍订单,评价书籍等,管理员统一管理书籍以及书籍订单信息等。待系统开发并通过检测阶段之后,就可以真正交付用户使用。
通过本次课题,我对开发工具的使用能力提升了很多,比如学会了如何使用IDEA工具,如何使用MySQL设计数据表,如何部署服务器等知识。同时因为应用的编程语言是Java,让我加深了对该语言的认识和理解,发现了很多我之前没有发现的Java语言的特点。总之,这个课题的完成,让我对开发一个项目的经验还是有所积累,对毕业课题与商业项目的认识以及它们之间的区别还是有所提升。相信这些宝贵的知识点会让我受益终身。
时代在不断变化,信息也在不断整合,人们的需求也在变化,因此,开发的个性化图书推荐系统只是符合当前使用者的需求,但是该系统也需要跟随时间的变化去迎合使用者更多的变化的需求。所以,系统开发期间已经预留了一些可供功能扩展的接口,可以通过这些接口和相应的代码注释去升级系统。尽管个性化图书推荐系统已经结束了开发工作,但还是存在数据库数据重复存储,后台代码重复编写以及界面图片太繁琐等缺点。这些问题还是需要在未来的时间里面去改进,先针对性的学习一些新知识,然后针对性的去完善个性化图书推荐系统才是正确的选择。
[1]洪雅敏.高校数字图书馆智能图书推荐系统设计[J].科技传播,2022,14(18):124-126.
[2]罗莉霞,高何裕.基于B/S的高校图书管理与个性化推荐系统的设计与实现[J].技术与市场,2021,28(11):184-185.
[3]焦宇,李民,王欢,余开朝.基于MySQL性能调优的推荐系统优化设计[J].软件导刊,2022,21(09):108-112.
[4]郑戟明,董云朝,柳青.MySQL数据库数据导入导出方法的探讨[J].电脑知识与技术,2022,18(22):24-25.
[5]欧阳桂秀.基于Java和MySQL的数据库管理系统的设计与实现[J].信息记录材料,2022,23(09):240-242.
[6]郑歆.Java程序设计课程的教学实践[J].集成电路应用,2022,39(11):94-95.
[7]李乐.Java语言应用研究[J].智慧中国,2022,(09):80-81.
[8]仓业金.基于Java的软件保护技术研究[J].电脑知识与技术,2022,18(23):29-30+52.
[9]宋旸.使用Java语言开发Web应用软件的知识探讨[J].中国设备工程,2022,(14):121-123.
[10]许跃颖.基于敏捷开发的SSM Web应用开发措施[J].电子制作,2021,(16):45-46+22.
[11]曹华山.SSM框架在Web应用开发中的设计与实现[J].无线互联科技,2021,18(11):108-109.
[12]覃琼花.基于协同过滤算法的个性化推荐系统研究[J].科技资讯,2022,20(10):4-6.
[13]谢志坚.计算机应用软件开发技术支撑思考[J].电子世界,2020(15):53-54.
[14]姬晓鹏.计算机软件开发技术与设计探究[J].电子测试,2020(16):133-134.
[15]Raffi Khatchadourian.Automated refactoring of legacy Java software to enumerated types[J].Automated Software Engineering,2017,24(4).
[16]Ben White.Marx and Chayanov at the margins:understanding agrarian change in Java[J].The Journal of Peasant Studies,2018,45(5-6).
致 谢
从刚来大学时,对系统开发,系统分析设计一窍不通,到最后毕业时,能够自己完成所选的毕业课题,自己开发系统,撰写论文,我觉得我这四年在大学校园里成长了很多,因此,我要对我的大学校园提供的学习环境还有教授我知识的老师表示感谢。
从拿到毕业课题开始,我一直是一头雾水,不知从何做起,幸好我遇到一位好导师,他帮助我分析我所选课题的侧重点以及需要花大量精力攻克的技术难点,以及在我遇到我自己觉得解决不了的问题时,我的导师一步步指导我寻找到了正确的解决办法,导师的耐心指导才让我在毕业课题的完成上顺利进展。所以,感谢导师!
完成毕业课题的时间很长,在这漫长的时间内,我也曾消极抵抗过面临的种种困难,而让我重新鼓起勇气,开始认真对待毕业课题,这样的态度转变则是多亏了我的室友为我加油打气,他跟我一样,虽然也焦虑撰写论文,以及如何开发系统等问题,但是他的乐观和积极向上的态度打动了我,至少人家焦虑的同时,还在坚持不懈的寻找解决办法,还在向周边朋友,老师等寻求帮助,更重要的是,我的室友还拉着我一起思考问题,分析问题。所以,遇到这样的好室友,我真的很庆幸,感谢这位好室友!
回想完成毕业课题所经历的各个阶段,我不由得感慨自己在大学期间所学知识的不足,尽管设计的作品也用到一些知识点,但大部分知识还需要自己通过查找资料,询问老师和同学去弥补,所以我明白知识的无止境,尽管毕业了,以后不会在校园里学习知识,但是进入社会还是需要保持一颗学习的心,不断让新的知识充实自己,让自己不断成长!
核心代码展示
/**
* 公告通知
* 后端接口
* @author
* @email
* @date 2021-03-09 11:33:59
*/
@RestController
@RequestMapping("/news")
public class NewsController {
@Autowired
private NewsService newsService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( NewsEntity news){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
return R.ok().put("data", newsService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(NewsEntity news){
EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
NewsView newsView = newsService.selectView(ew);
return R.ok("查询公告通知成功").put("data", newsView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.updateById(news);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
newsService.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<NewsEntity> wrapper = new EntityWrapper<NewsEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = newsService.selectCount(wrapper);
return R.ok().put("count", count);
}
}