版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于个性化推荐的电影购票系统设计目录1绪论 11.2研究目的和意义 11.2.1研究目的 11.2.2研究意义 21.3研究现状 21.4论文主要研究内容与结构 32相关技术介绍 32.1B/S结构 32.2springboot框架 42.3MySql数据库 42.4机器学习 43系统需求分析 53.1可行性分析 53.2系统功能需求分析 53.2.1用户功能图 53.2.3管理员功能图 63.3业务流程分析 63.4智能推荐算法介绍 74系统设计 74.1系统的功能结构图 74.2系统数据库设计 84.2.1数据库E-R图 84.2.2数据库字段设计 105系统功能实现 115.1用户功能模块 115.1.1用户注册模块 125.1.2用户登录模块 135.1.3系统首页模块 155.1.4电影查询模块 165.1.5电影评论模块 175.1.6电影订票模块 185.1.7收藏夹模块 225.1.8电影推荐模块 235.2管理员功能模块 285.2.1用户管理模块 285.2.2电影管理模块 325.2.3新闻管理模块 335.2.4电影预定管理模块 345.2.5评论管理模块 355.2.6场次管理模块 365.2.7用户评分管理模块 375.2.8观影记录管理模块 386结论 38参考文献 40摘要:由于随着人们目前生活水平的不断提高,电影行业越来越繁荣,看电影已经成了人们休闲娱乐的主要方式,因此我设计开发了一个电影购票系统。该系统采用模块化设计方式,采用IDEA,PyCharm开发平台,MySQL数据库,SpringBoot框架进行设计完成。该系统包含前台模块和后台管理模块两大模块。用户注册并登录系统后,可以进行购票,选座等。电影结束后可以对影片进行点评,还可以对自己的个人信息进行查询和修改。管理员可以对用户和影片的信息进行查询修改删除等。后台管理员还可以对用户订单进行管理。该系统的特点是在影片推荐模块具有智能推荐功能,该推荐功能采用了机器学习中的SVD算法可以帮助人们能够发现自己喜欢的电影,实现个性化推荐和便捷的购票操作。关键词:个性化推荐;电影购票系统;模块化设计:SVD算法1绪论1.1研究背景随着科学技术的飞速发展,强大的社会生产力使得人们不再像以前一样满足于物质生活上的富足,现在大家更加在意精神上的满足。而电影作为艺术和文化的产物,也进一步的融入了大众的生活获得了空前的发展。早在1994年,中国观众就见识到了好莱坞大片的独特魅力,给予了当时的人们以巨大的冲击,给当时的中国电影市场带来了重要的启蒙教育。到了2002年,中国的院线体制开始改革,取得了傲人的成就,电影票房也开始稳步增长。2012年,中国的票房首次超过日本,五年后的2017年,中国电影银幕的总数已经赶超了美国。在2019年中国影视创造了年票房最快破500亿记录。这也是中国电影票房史的上的一大奇迹。文化产业代表着一个国家的软实力,电影作为一种传统文化和大众娱乐的精神载体,在当今社会已经成为不可或缺的一部分。随着人们越来越重视精神上的满足,人们对电影的需求也越来越高,所以一个好的电影购票系统显得尤为重要,他不仅可以替代各大影城人工售票的大量重复劳动,还可以运用计算机来实现订票数据的修改和删除等操作,提高了出票的效率。总之个性化的电影购票系统,不仅可以提高我们的社会经济发展,也是当今时代的发展趋势和方向。[1]1.2研究目的和意义1.2.1研究目的电影又被称作“映画”,是长期发展出的艺术产物,具有很长的历史背景,1895年,卢米埃尔兄弟在巴黎首次放映了电影。这个历史性的时刻是电影诞生的象征。在这之后电影在人们生活中的影响越来越大,直到现在电影已经成为我们生活中必不可少的一部分。由于电影行业的迅猛发展,传统的人工售票方式因为其速度慢,效率低的缺点已经不能满足目前电影行业的需求,因此为了满足对用户的高效管理和人力资源的节省,我们更加需要一种更加方便快捷的电影购票方式。所以我编写了此电影院购票系统用来提高影院购票效率。目前国内很多购票软件的在线购票业务也只是简单的满足院线业务的需求,对于对用户的影片推荐只是依靠大众化的信息,并不能实现个性化的推荐,没有对网站或软件进行优化,所以我对该问题进行了设计和编写运用机器学习中的SVD算法实现了基于用户本身的个性化推荐,使用户在购票时能够有更好的体验。1.2.2研究意义由于中国经济的发展和人民生活水平的大幅度提高,电影支出一直在增加。同时电影票的在线购买已逐渐取代了线下购买,已成为当今社会的主流。 有数据显示,因为目前网上购票的不断兴起,使得票房、票价以及观影人数“水涨船高”,这就使得更多的人去电影院感受电影大片带来的视觉、听觉和情感上的冲击。在2010年一部3D影片《阿凡达》横空出世,在中国电影史上掀起了巨大的波澜,这使得当时日渐萎靡的电影市场重新焕发活力,并且也帮助当年的中国电影票房成功突破100亿大关,在2016年,由周星驰导演邓超主演的喜剧电影《美人鱼》登上了中国电影票房第一名的宝座。到了2019年,仅仅是中国第一季度内地电影票房就高达186亿元,数据增长的背后是移动支付的迅速普及,这使得在线上购买电影票成为购票的主要方式,互联网在人们的生活中变得越来越重要。它给人们带来了很多便利。从最开始人们排队购买电影票到网上售票系统的出现,这使得人们可以更方便的选择自己喜欢的电影。从电影院管理者的角度来看,网络售票系统不仅可以节省不必要的人力物力成本,还可以减少对整个影院的管理工作。此外,该系统还在现有系统的基础之上增加了智能推荐系统,从而实现个性化推荐给用户更好的体验。1.3研究现状近来有推荐功能的电影购票系统的迅速发展,这就使得用户的观影体验感日渐上升。在中国知网和IEEE等平台,也有很多与个性化电影购票系统相关的国内学术论文和国外学术论文。由电气电子工程师学会指出,各种各样的努力、活动,甚至科学都在不断发展,然后被用作提高客户满意度的基准。服务质量和排队变得非常重要,要注意公司要让消费者满意,尤其是在电影行业。基于同样的事情,也就是通过考虑给消费者以满足感,特别是对于有爱好或习惯在电影院看电影的消费者。通过问卷的划分过程,作者试图获得并了解消费者在获得电影票的实践中所遇到的约束和障碍。通过这些活动,表明最常见的障碍是售票柜台的排队人数,尤其是在节假日前几天观看时。消费者需要花费大约10-15分钟的时间来获得购买门票的机会。这就是为什么作者试图提供一种替代方案,这种方案有望成为克服所遇到的问题的一种替代方案,特别是克服为消费者提供服务的队列带来的不便。随着信息技术的发展,许多公司着眼于使用技术来满足消费者。作者利用这个机会开发了一个基于系统的移动售票系统。根据调查,印度尼西亚约有2.3亿手机用户。因此,今天移动应用领域的市场和商业机会非常积极。作者开发了以安卓系统为基础的移动影院售票系统。移动销售票务应用的分析和设计采用面向对象的分析和设计方法。[2]2016年,邵新实现了基于SSH的电影院预订系统的设计。在他的论文中,他详细研究了SSH框架的一些具体特性,并仔细分析研究了不同集成方法的优势和劣势。最后,他总结了适用于Web应用程序的三层结构的最佳SSH框架集成技术方案。在此基础上,他设计并实现了基于SSH集成框架的电影院在线预订系统。[3]2019年袁晓芳和蒋秋洁两人实现了基于O2O模式的电影购票服务平台设计,在O2O模式下,通过整个系统满足消费者的各种需求,从而达到互利共赢的效果。[4]1.4论文主要研究内容与结构本系统是基于个性化推荐的电影购票的设计与实现,该系统由前台模块和后台管理模块两大主要模块组成,影片模块中重要的是智能推荐算法,算法采用机器学习中的SVD算法,实现了个性化推荐。在本系统中,模块和模块之间相互配合对电影购票系统进行管理。系统是采用Springboot框架实现的,通过这个系统,我们可以完成对不同使用该系统的用户进行个性化的电影推荐也可以实现对用户购买电影票的管理。本文将对系统的模块进行分析和设计:普通用户模块:普通用户可以进行注册登录,购买电影票,选择座位付款等操作。用户还可以在本系统的首页按照不同的关键字对电影进行查询,将想看的电影添加到收藏夹中等。系统会根据不同用户的不同喜好向他推荐不同电影。管理员模块:管理员可以在后台中看到有关用户和电影的各种信息,并且实现增删查改等功能。2相关技术介绍本章将对B/S结构、Springboot框架、MySql数据库以及机器学习这四种技术进行介绍。2.1B/S结构B/S结构是信息管理系统的四大结构之一,[5]是一种网络结构模式即浏览器和服务器的结构模式,这种结构也是目前各中小系统中使用最为频繁的结构。在这种结构中用户界面完全在浏览器中运行。网络服务器和数据库服务器可以在同一台服务器上配置。大多数通过浏览器和各种网络办公系统访问的网站都是使用B/S模式开发的。[6]客户不需要使用特定的客户端,也不需要使用另一种配置,只要在计算机上使用软件,就可以通过应用程序接口连接到用户的后台系统,并将使用的所有信息保存在服务器上。从成本的角度来看,B/S结构很大程度上降低了工作维护的费用,不需要考虑用户资金的投入,所以使得成本大大降低。在这样的结构下,对于用户来说,操作非常简洁。他们不需要自己的文化水平。他们只需要使用一台可以连接到Internet的计算机来完成一系列操作,或者在网页中。执行各种业务流程操作。因为其方便简单的特点目前大多数的系统都采用B/S结构。2.2springboot框架在2013年Pivotal团队设计开发了一个轻量级框架即SpringBoot,它简化了应用程序的整个结构和开发工作[7]。该框架实现了各种主流框架和spring的自动集成。它使用起来非常快,并且不需要各种配置文件。因此springboot框架非常方便。SpringBoot库框架定义了一套标准的数据调用方法和接口[8],为数据的统计、计算等提供了标准的数据支撑。SpringBoot框架的功能主要包括以下几点:负责数据库的增删查改等为系统接口提供数据服务接口支持。管理用户和用户日志数据。为系统中涉及的机器学习算法提供计算服务。2.3MySql数据库MySQL是一个关系数据库管理系统,它被用作云上的SaaS(软件即服务)。MySQL发布于1995年,现在它得到甲骨文公司的支持。脸书、推特、雅虎、维基百科、YouTube都在使用MySQL。MySQL数据库管理系统在安全性、可靠性、性能和可用性方面有其优势和局限性。市场上有许多由云服务器支持的数据库管理系统,其中一些只能在私有组织中用于特定目的。根据一项调查,最流行的关系数据库管理系统是MySQL,数据库管理系统现在还在市面上使用的主要有MySQL,SQLServer,MongoDB,Oracle,IBMDB2,NoSQL。这些关系数据库管理系统有些是免费使用的,有些是付费的。[9]2.4机器学习机器学习使人类能够给计算机编程,这样机器就可以识别模式或从输入的信息中学习。学习的概念是把信息转化为知识的过程。机器学习算法是“训练数据,代表经验,输出是一些专业知识,通常采取另一个计算机程序的形式,可以执行一些任务。"像信息过滤系统,数据挖掘,医学诊断,计算机视觉等,这些都是机器学习应用的例子。机器学习借鉴了许多领域的概念和结果,从而取得了巨大进展。机器学习使数据分类成为可能。应用程序识别数据中的模式,有训练数据(有监督)或没有训练数据(无监督)。在分类中,数据“有意义”的概念被称为机器学习中的聚类。聚类算法的一些例子包括K均值、最远优先、期望最大化等。[10]3系统需求分析3.1可行性分析我们在设计系统的时候必须要知道这个系统是否具有现实意义。因此我们需要对系统进行可行性分析。在进行可行性分析的时候要预测开发出的系统是否可以达到预期的结果,开发过程中的成本是否小于开发完成后的利益。对于本系统的可行性分析主要从技术、经济、操作以及社会的可行性分析。(1)技术可行性根据系统复杂程度以及自己所掌握的知识来看,java技术在系统的设计与实现方面具有重要的地位,IDEA平台和MySql数据库以其强大的性能,足够支持完成本系统的开发。而我在经过系统的学习之后也对开发本系统所要具备的知识有了一定的掌握和了解。所以具有技术可行性。(2)经济可行性经济可行性主要研究系统在经济方面的收益,通过对本购票系统的实现,不仅可以减少电影院工作人员的工资开销,降低了成本,还可以方便的让用户使用来提高用户的购票体验从而为电影院带来更多的收益。本系统的代码都是开源的,因此设计成本低。所以本系统有很高的经济可行性。(3)操作可行性操作可行性主要研究的是在现有的环境和条件下用户人员对系统的操作能否快速,稳定的实现。[11]本系统的一大特点就是登陆注册界面非常简单,设计的页面也非常友好,方便,使得用户可以随时随地的进行购票。所以开发本系统在操作方面具有可行性。(4)社会可行性电影现在已经成为大众的娱乐方式,也是人们生活上必不可少的部分。所以设计一个方便快捷的电影购票系统显得至关重要。从上述分析可以看出,本次电影购票系统是可行的。3.2系统功能需求分析本课题的要求是:实现个性化推荐的电影购票系统的设计与实现。系统的主要功能包括用户登录、查找想看的电影、购票、选座、影评等操作,管理员还实现了用户注册管理、电影管理、留言管理等功能。此外本系统还要实现电影的智能推荐以满足用户对电影购票的需求。3.2.1用户功能图 本电影购票系统为了保证系统的安全性,普通的用户只能实现对前台信息的浏览和访问,没有其他更高的权限,只能在用户登录之后才能进行购票操作。用户的功能图如图3.1所示:普通用户普通用户注册登录购票选座评论点评搜索电影图3.1用户功能图3.2.3管理员功能图该系统中的最核心的用户就是管理员,系统中的用户信息都由管理员统一管理,管理员功能图如图3.2所示:管理员管理员影片管理评论管理用户管理电影推荐图3.2管理员功能图3.3业务流程分析业务流程分析在本系统的设计与实现上有非常重要的作用,基于本系统的每个环节都具有一定的相关性的特点可以绘制出具体的流程图,如下图3.3所示:详细设计详细设计功能设计需求分析系统调试开始结束图3.3系统开发流程图3.4智能推荐算法介绍推荐算法在计算机领域的应用非常广泛,如音乐、视频、新闻等,它会给根据用户的购买或访问历史推荐符合他们兴趣的产品。话句话来说推荐算法就是通过用户的历史行为经过科学的计算,以此来推测出用户可能感兴趣的东西。常见的智能推荐算法包括:基于内容的推荐算法、基于关联规则的推荐算法、协同过滤推荐算法等。但是每个算法都不可能十全十美,都有一定的优势但也存在一定的缺陷。基于内容的推荐算法是指选择与用户喜欢的内容相似的信息项进行推荐。案例推理分析由目标用户评级的项目的一组特征,并基于由他评级的项目的特征来建立该用户的兴趣简档,找出最佳匹配。该推荐算法的缺点是要求内容很容易提取为有意义的特征。协同过滤作为一种简单的推荐算法在日常生活上被广泛使用。它首先找到与目标用户有相似偏好的用户,然后根据相似用户的偏好预测目标用户的偏好。[12]使用协同过滤算法时如果用户评价的矩阵很稀疏。那么用户之间的相似度就会很小。只靠很少两个共同评分的推荐技术来判断用户是否相似,这种判断是不够科学的也是不够明确的。因此,数据稀疏性是影响协同过滤推荐精度的关键问题。由于已经有的数据具有稀疏性的特点,仅依靠邻居的一点评估是不准确的。一个优秀的算法是推荐系统的关键。本系统采用的是利用SVD算法实现个性化推荐,SVD模型首先将用户的历史行为数据转换成评分矩阵,然后分解我们已经有的评分矩阵,目的是提取用户特征和项目特征,然后根据预测评分向用户推荐物品。[13]这样就很好的解决了数据有时可能会比较稀疏的问题。4系统设计4.1系统的功能结构图该系统实现的是个性化的电影购票系统,功能包括:用户的注册登录、按照不同类型比如导演、演员、电影名称等。用户还可以在本系统上进行购票选座,管理员功能有用户影片评论管理等。其功能结构图如下图4.1所示:用户用户电影购票管理员注册登录搜索电影购票选座评论点评影片管理用户管理评论管理电影推荐图4.1系统功能结构图4.2系统数据库设计4.2.1数据库E-R图E-R图也称为实体-联系图。它通常使用概念性数据模型来表示各种数据之间的关系。下面设计出这几个关键实体的实体-联系图:电影类别E-R图如图4.2所示:电影类别电影类别序号类型图4.2电影类别E-R图电影信息E-R图如图4.3所示:电影信息电影信息名称时长演员导演介绍 图4.3电影类别E-R图订票E-R图如图4.4所示:订票订票购票名称购票用户订票时间票价座位图4.4订票E-R图评论E-R图如图4.5所示:评论评论评论用户评论电影评论内容评论时间图4.5评论E-R图评分E-R图如图4.6所示:评分评分评分用户id评分电影id分数图4.6评分E-R图4.2.2数据库字段设计本系统的数据库字段设计如下:表4.1电影类型表名称类型长度允许为空主/外键注释idint64否主键分类标识符namevarchar255是否名称表4.2电影信息表名称类型长度允许为空主/外键注释idint64否主键电影标识符namevarchar255是否名称durationvarchar255是否电影时长directorsvarchar255是否导演actorsvarchar255是否演员release_datedatetime0是否发布时间statusint0是否是否上映plotvarchar1024是否剧情postervarchar255是否海报countryvarchar255是否国家表4.3订票信息表名称类型长度允许为空主/外键注释idint64否主键预定标识符statusint64是否状态user_idint64是否用户标识符create_timedatetime64是否预定时间scene_idint64是否场次标识符ticket_numvarchar255是否座位total_priceint64是否价格seatvarchar255是否座位号表4.4评论信息表名称类型长度允许为空主/外键注释idint64否主键评价标识符contentvarchar255是否内容movie_idint64是否电影标识符user_idint64是否用户标识符create_timedatetime64是否发布时间表4.5评分信息表名称类型长度允许为空主/外键注释idint64否主键评分标识符movie_idint64是否电影标识符scoreint64是否评分user_idint64是否用户标识符表4.5观影信息表名称类型长度允许为空主/外键注释idint64否主键观影记录user_idint64是否用户标识符movie_idint64是否电影标识符create_timedatetime64是否增加时间5系统功能实现5.1用户功能模块5.1.1用户注册模块模块功能介绍:第一次使用本系统的用户因为没有自己的账号是不能进行购票选择的,因此,用户需要注册系统帐户。新注册用户需要填写其基本信息,包括:帐户昵称,电子邮件。登录密码,手机号码,性别等。用户填写基本信息后,可以单击注册按钮并登录。注册成功的前提是上述信息都不能为空,并且不能和数据库中已经有的昵称、电子邮件重复否则就会报错。系统会将已经注册过的新用户信息存入数据库中,方便后续的操作。代码流程://注册接口,前台页面点击注册会执行此方法
@RequestMapping(value
=
"/doRegister")
public
Msg
register(User
user)
throws
MessageException
{
//根据注册的用户信息调用service服务根据Email去查询是否存在用户
User
user1
=
userService.getUserByEmail(user.getEmail());
//查询到不为空就证明用户注册信息重复,然后服务端抛出异常
if
(user1
!=
null)
{
throw
new
MessageException("该用户已经被注册");
}
//给用户设置等级(普通用户/管理员用户)
user.setRole(Role.USER);
user.setSalt(MD5Utils.getSalt());
//使用Md5加密算法对密码进行加密,方便后面存入数据库
user.setPassword(MD5Utils.md5(user.getPassword(),
user.getSalt()));
//调用service服务存储用户信息
userService.saveUser(user);
//给页面回写注册成功
return
Msg.success().add("mes",
"注册成功!");
}}运行界面如图5.1、5.2所示:图5.1用户注册界面图5.2注册异常界面5.1.2用户登录模块模块功能介绍:该模块可以分成已经注册过的用户和没有注册过的用户,没有注册过的用户只能查看首页内容,不能进行具体的购票操作,如果用户想要进行购票就必须进行登录,如果是已经注册的用户,当用户单击登录按钮时,系统将尝试登录,如果输入信息和数据库中信息匹配成功,用户将跳转到系统页面。之后用户就可以进行购票等一系列操作了。如果信息不匹配就会显示出错信息。核心代码://登录接口,前台页面点击登录会执行此方法@RequestMapping(value
=
"/doLogin")//接收用户信息,用户账号
public
Msg
login(@RequestParam("email")
String
email,//接收用户密码
@RequestParam("password")
String
password,
//维持会话,一直存储用户的登录信息
HttpSession
session)
throws
MessageException
{//根据email查询用户,查看用户是否注册
User
user
=
userService.getUserByEmail(email);
//用户未注册
if
(user
==
null)
{
throw
new
MessageException("该用户不存在!");
}//抛出异常//根据email和密码进行登录,若密码正确,在session里面存储数据
if
(userService.login(email,
password))
{
session.setAttribute("login",
user);//前端页面返回成功登录
return
Msg.success().add("msg",
"成功登录!");}//若密码不正确则抛出异常
throw
new
MessageException("密码错误!");
}运行界面如图5.3、5.4所示:图5.3登录界面图5.4登录异常界面5.1.3系统首页模块模块功能介绍:该模块是用户登录之后的第一个显示的模块,在首页上最上方的中间偏右有全部电影、排行榜、资讯三个按键。点击全部电影会显示出每个电影的信息,点击排行榜会显示出每个电影的评分排行,点击资讯会显示近期的热门电影的资讯。在首页右部有用户的个人信息按键,其中包括收藏列表、已预定的的电影票、退出登录选项。在首页的中间部分是每个电影的海报和评分信息,鼠标放到海报上会出现一个下拉框点击其中的更多信息就会跳转到电影购票页面。或者直接点击海报也可以跳转到相同界面。首页的尾部有电影的最新资讯,用户可以点击了解更多进行查看。用户还可以在首页对电影按照不同的类型进行查询。运行界面如图5.5所示:图5.5首页界面5.1.4电影查询模块模块功能介绍:用户在登录本系统之后可以本系统中已经发布的电影进行查询,用户可以根据电影的关键字比如导演、演员、国家等找到电影并进行购票等后续操作。用户输入关键字并点击查询之后,系统会得到用户输入的关键字并且和数据库表中的数据进行匹配,如果匹配成功就会将匹配成功的电影在前台显示出来。代码流程:以按照电影名称查询为例://根据电影名查询相关电影接口
@GetMapping(value
=
"/byTitle/{keyword}")
public
String
searchByName(@PathVariable(value
=
"keyword")
String
keyword,
Model
model)
{//根据标题关键字调用movieservice接口,查询包含标题关键字的电影
List<MovieScore>
movies
=
movieService.getByName(keyword.replaceAll(regex"
",replacement
""));//把查询到的电影列表通过model回写给前端
model.addAttribute("movies",
movies);
//返回页面视图
return
"search";}运行界面如图5.6、5.7所示:图5.6按电影名称查询界面图5.7按演员查询界面5.1.5电影评论模块模块功能介绍:用户可以在找到想要看的电影或看完电影后对其进行评论,用户的评论会显示在电影下面供其他用户参考,但是要注意用户想要对电影进行评论就必须进行登录,所以要进行验证用户的登录状态。代码流程://(映射请求)页面点击发表评论调用此接口
@PostMapping(value
=
"/review")
public
ResponseEntity
addReview(Review
review,
HttpSession
session)
{//判断用户是否登录
User
user
=
(User)
session.getAttribute("login");//如果用户没有登录就会出现一个弹框让用户登录
if
(user
==
null)
{
return
ResponseEntity.ok("请先登录!");
}//用set方法设置评论的发表时间
review.setCreateTime(new
Date());//用set方法设置评论的用户id
review.setUserId(user.getId());//调用service服务将评论存入数据库
int
result
=
reviewService.addReview(review);//如果数据库存储成功返回1,代表评论成功
if
(result
!=
0)
{return
ResponseEntity.ok("评论成功!");
}/如果数据库存储失败返回0,代表评论失败
return
ResponseEntity.ok("评论异常!");/}}运行界面如图5.8所示:图5.8评论界面5.1.6电影订票模块模块功能介绍:用户可以对自己喜欢的电影进行购票观看,但是要注意只有在此电影有播放场次的时候才能购买。用户需要先进行场次的选择然后点击下一步进行选座,选座的时候有的电影座位已经被预定所以用户不可以重复选择,需要选择那些没有预定的座位,在选座之后需要结算用户输入自己的手机号然后点击付款即可。完成结算之后可以点击查看预订信息对预定的电影票进行查看。用户的购票信息和选座信息会被保存在数据库中方便进行管理。预定阶段代码流程//点击预定电影票按键前台调用book1接口
@RequestMapping(value
=
"/book1")
public
String
book1(@RequestParam("movieId")
Integer
movieId,Model
model)
{//根据movieid调用sceneservice接口查看电影对应场次信息。
List<Scene>
scenes
=
sceneService.getSceneCount(movieId);//到数据库的movie表中查询电影的全部信息
Movie
movie
=
movieService.getById(movieId);//把查询到的电影信息保存在model里面
model.addAttribute("movie",
movie);//把查询到的电影场次保存在model里面
model.addAttribute("scenes",
scenes);//在book1回写查询到的电影信息
return
"book1";
}运行界面如图5.9所示;图5.9选择场次界面选座阶段代码流程://选座页面调用的接口@RequestMapping(value
=
"/book2")
public
String
book2(Integer
sceneId,
Model
model)
{//创建一个订单的实体对象
BookForm
bookForm
=
new
BookForm();//调用service服务获取场次信息
Scene
scene
=
sceneService.getById(sceneId);//如果没有场次就会报错
if
(scene
==
null)
{
return
"404";
}//通过set函数将电影名存入bookform实体对象中
bookForm.setMovieName(scene.getMovieName());//通过set函数将预定时间存入bookform实体对象中
bookForm.setShowtime(scene.getShowtime());//通过set函数将场次信息存入bookform实体对象中
bookForm.setSceneId(sceneId);//通过set函数将票价存入bookform实体对象中
bookForm.setPrice(scene.getPrice());//把bookform保存在model里面
model.addAttribute("bookForm",
bookForm);//把sits保存在model里面
model.addAttribute("sits",
scene.getBookedSeat());//在book2回写信息
return
"book2";
}运行界面如图5.10所示;图5.10选座界面支付阶段代码流程://支付页面调用的接口@RequestMapping(value
=
"/book3-buy")
public
String
book3(BookForm
bookForm,
Model
model)
{//调用service服务从bookform中获取场次信息
Scene
scene
=
sceneService.getById(bookForm.getSceneId());//利用getBookedSits()函数从bookform中提取出座位号,用逗号分隔座位号
String[]
site
=
bookForm.getBookedSits().split(",");//计算预定的电影票的票价
int
price
=
site.length
*
scene.getPrice();//若场次为空则返回404错误信息
if
(scene
==
null
||
site.length
!=
bookForm.getSiteNum())
{return
"404";
}……运行界面如图5.11所示;图5.11付款界面4.查看订单模块代码流程://查看订单信息用到的接口
@RequestMapping(value
=
"/book-final/{num}")
public
String
book4(@PathVariable(value
=
"num")
String
ticketNum,
HttpSession
session,
Model
model)
{//从session里面调用getAttribute函数获得用户信息
User
user
=
(User)
session.getAttribute("login");
//根据用户id,调用orderservice服务获得用户下单数量OrderVo
orderVo
=
orderService.getTicketByNum(user.getId(),
ticketNum);
if
(orderVo
==
null)
{return
"404";}//订单不存在会报错
//运用addAttribute函数将订单对象存入model
model.addAttribute("order",
orderVo);
return
"book-final";//将数据回写前端
}}运行界面如图5.12所示:图5.12查看订单界面5.1.7收藏夹模块模块功能介绍:用户可以将喜爱的电影添加到收藏列表中,在用户点击添加到收藏列表之后会弹出一个添加成功的弹窗,然后用户可以在个人信息中查看添加的电影,如果用户兴趣改变不想再看此电影,用户还可以移除该电影,直接点击从收藏列表中移除即可。如果用户添加的电影已经在列表中就会弹出不可重复添加弹窗。代码流程//调用收藏夹接口:@PostMapping(value
=
"/watch")
public
ResponseEntity
addWatch(HttpSession
session,
Integer
movieId)
{//从session里面利用getAttribute()函数获取用户登录信息
User
user
=
(User)
session.getAttribute("login");//根据用户Id调用watchService接口的getWatchByIds拿到其收藏夹里面对应的的电影生成Watch对象
Watch
watch1
=
watchService.getWatchByIds(user.getId(),
movieId);//判断数据库中watch表中的用户id和电影id是否存在
if
(watch1
!=
null)
{return
ResponseEntity.ok("已经在列表中,请勿重复添加!");
}
Watch
watch
=
new
Watch();//创建一个新的watch对象
watch.setMovieId(movieId);//利用set函数为watch设置电影id
watch.setUserId(user.getId());//利用set函数为watch设置用户id
watch.setCreateTime(new
Date());//利用set函数为watch设置创建时间//调用watchservice服务,利用addWatch将收藏电影加入数据库watch表
int
result
=
watchService.addWatch(watch);//保存成功返回1,代表添加成功
if
(result
!=
0)
{return
ResponseEntity.ok("添加成功!");}//保存失败返回0,代表添加失
return
ResponseEntity.ok("添加异常!");}
@DeleteMapping(value
=
"/watch/{movieId}")
public
ResponseEntity
deleteWatch(@PathVariable(value
=
"movieId")
Integer
movieId)
{//调用watchservice服务,利用deleteWatch函数将收藏电影从数据库watch表中删除
int
result
=
watchService.deleteWatch(movieId);
if
(result
!=
0)
{
return
ResponseEntity.ok("删除成功!");
}
return
ResponseEntity.ok("删除异常!");
}}运行界面如图5.13所示:图5.13收藏列表界面5.1.8电影推荐模块模块功能介绍:电影推荐模块是该系统的特色模块,系统会根据用户的喜好来向用户推荐他们可能感兴趣的电影。奇异值分解(SVD)算法是该系统用到的推荐算法,SVD算法广泛应用在图像压缩和推荐系统上。[14]目前使用最多的协同过滤推荐算法在面对数据非常多并且非常稀疏的情况下并不能对用户实现很好的推荐,但SVD算法可以很好地解决协同过滤中数据稀疏性和冷启动的问题。[15]奇异值分解就是一种提取信息的方法,根据用户的打分情况,采用奇异值分解可以通过训练得到电影数据中各个数据特点的重要性程度,有数据表明,一个矩阵的前10%大的特征值可以代表90%的矩阵信息,所以运用奇异值分解可以将巨大的数据映射到一个低维的空间中,然后在低维的空间中计算用户之间的相似度,对用户进行合理化的推荐。经常用到的相似度的计算有欧几里得距离、余弦相似度、皮尔逊相关系数等。我们采用皮尔逊相关系数来计算用户之间相似度。利用SVD算法实现智能推荐大致需要以下步骤:(1)对用户的评分信息进行收集,对数据进行预处理转化成矩阵形式,未评分的电影自动填充0。(2)将评分矩阵进行奇异值分解,降低到合适的维度。(3)运用皮尔逊相关系数在已经降维的数据中计算用户与用户之间的相似度,找到与此用户最相似的邻居集合。(4)根据这个邻居集合预测此用户的评分值,按照从大到小进行排序对用户进行推荐。如果有多个用户和其相似,则根据所有相似用户评分的平均值来预测评分。相关公式介绍:(1)SVD分解公式:M[m*n]=U[m*r]*S[r*r]*VT[n*r](1-1)其中M为m*n的矩阵表示用户打分矩阵,U为m*r的矩阵,代表左奇异向量,是一个单位正交矩阵,S为r*r的矩阵,表示奇异值是一个对角阵并且对角线上元素从上到下依次减小,V为n*r的矩阵表示右奇异向量也是一个单位正交矩阵。求解SVD中的各个矩阵推导过程:因为M*MT=U*S*VT*(U*S*VT)=U*S*ST*UT(1-2)同理MT*M=V*S*ST*VT(1-3)所以S*ST是M*MT的特征值对角阵,U是M*MT的特征向量矩阵,V是MT*M的特征向量矩阵。知道怎么求解我们就可以对评分矩阵进行奇异值分解了。由于一个矩阵很少的大特征值就能代表矩阵的信息,所以我们可以选取不同的r值来对庞大的数据进行降维处理,经过奇异值分解后,我们再对用户进行相似度的计算就会简单很多了。(2)皮尔逊相关系数公式:PX,Y相关系数取值范围是-1到1,相关系数的值越大表明相关性越强,相关系数为负值代表负相关。代码流程:#读入电影数据df_title=pd.read_csv('movie_titles.csv',encoding="ISO-8859-1",header=None,names=['Movie_Id','Year','Name'])df_title.set_index('Movie_Id',inplace=True)#设置indexprint(df_title.head(10))#打印头部reader=Reader()#转换为SVD的输入数据集#设置训练数据集data=Dataset.load_from_df(df[['Cust_Id','Movie_Id','Rating']][:],reader)df_785314=df[(df['Cust_Id']==785314)&(df['Rating']==5)]#打印结果df_785314=df_785314.set_index('Movie_Id')#设置索引后打印df_785314=df_785314.join(df_title)['Name']#连接新的值Nameuser_785314=df_title.copy()#浅复制user_785314=user_785314.reset_index()#重置索引#判断该列中元素是否在列表中user_785314=user_785314[~user_785314['Movie_Id'].isin(drop_movie_list)]data=Dataset.load_from_df(df[['Cust_Id','Movie_Id','Rating']],reader)#设置训练数据集trainset=data.build_full_trainset()#构建训练数据集svd.fit(trainset)#训练数据集user_785314['Estimate_Score']=#初始化svd=SVD()cross_validate(svd,data,measures=['RMSE','MAE'])user_785314['Movie_Id'].apply(lambdax:svd.predict(785314,x).est)#训练user_785314=user_785314.drop('Movie_Id',axis=1)#删除Movie_Id列user_785314=user_785314.sort_values('Estimate_Score',ascending=False)#进行排序defrecommend(movie_title,min_count):#定义recommend函数print("Formovie({})".format(movie_title))#打印电影标题#根据皮尔逊相关性推荐的电影print("-Top10moviesrecommendedbasedonPearsons'Rcorrelation-")i=int(df_title.index[df_title['Name']==movie_title][0])#判断indextarget=df_p[i]#选取筛选后的数据similar_to_target=df_p.corrwith(target)#计算目标值对象的行或列之间的成对相关corr_target=pd.DataFrame(similar_to_target,columns=['PearsonR'])#构造一个新的二维表corr_target.dropna(inplace=True)#删除缺失值corr_target=corr_target.sort_values('PearsonR',ascending=False)#进行排序#打印目标值print(corr_target[corr_target['count']>min_count][:10].to_string(index=False))recommend('Character',min_count=1)#调用函数,传入标题和最小的数值……具体实例推荐过程:假设我们现在有张三、李四、王五、梁六四个用户,为了方便我们把他们称作用户1-4。我们现在有6部正在热映的电影,分别为无问东西、后会无期、烈火英雄、功夫、头文字D、你的名字,同样为了方便我们把它们称作电影1-6。用户i对电影j的评分记为Mij,用户1对电影1的评分为5,对电影2的评分为5,对电影3的评分为3,对电影4未进行评分记为0,对电影5的评分为5,对电影6的评分为5。假设这四个用户都对不同的电影进行了打分,并且打分情况如表5.1所示:张三李四王五梁六无问东西5305后会无期5034烈火英雄3403功夫0053头文字D5445你的名字5455表5.1用户对电影打分矩阵由表5.1可知评分矩阵M=55055034根据SVD分解公式(1-1),将评分矩阵进行分解,我们选取r=2,此时我们可以得到:M=−0.44720.5373−0.3586−0.2461−0.29250.4033−0.2078−0.6700−0.5099−0.0597−0.5316−0.1887其中U=−0.44720.5373−0.3586−0.2461−0.29250.4033−0.2078−0.6700−0.5099−0.0597−0.5316−0.1887代表电影概念矩阵,S=17.71390.0000现在我们已经对现有的数据进行了SVD分解,假设现在来了一个新用户szj对电影1打分为5分,对电影2打了5分,对电影6打了5分。现在我们需要预测用户szj会喜欢什么电影并将电影推荐给他。此时用户szj的电影评分矩阵为A=50Q=AT*U*S-1=500000*−0.44720.5373−0.3586−0.2461−0.29250.4033由此可得Q=−0.12620.4203。现在我们已经得到了用户szj的评分矩阵在奇异值分解之后在低维的用户概念矩阵。现在我们需要计算用户szj与用户1-4之间的相似度。根据公式(1-4)可知,新用户szj和用户1的皮尔逊相关系数P1为:
P1=−0.1262−0.14705∗同理可以计算szj与用户2、3、4之间的相似度,分别为P2、P3、P4,结果如下:P2=1P3=-1P4=1由此可见用户1、2、4和新用户szj都有很强的相关性,到目前为止我们已经找到和新用户szj相似的人群集合,接下来就是对此用户没有评分过的电影进行评分,又因为有多个用户和szj相似,所以我们取用户1、2、4对同一部电影的平均分作为预测分数。如下所示:对电影2后会无期的预测评分:5+0+43对电影3烈火英雄的预测评分:3+4+33对电影4功夫的预测评分:0+0+33对电影5头文字D的预测评分:5+4+53对电影6你的名字的预测评分:5+4+53由此可见用户szj的预测打分情况就如表5.2所示:后会无期烈火英雄功夫头文字D你的名字szj33.3314.674.67表5.2预测打分所以我们像用户依次推荐的电影为:你的名字、头文字D、烈火英雄、后会无期、功夫。运行界面如图5.14所示:图5.14推荐界面5.2管理员功能模块5.2.1用户管理模块模块功能介绍:在管理员登录后台之后有权管理已经注册本系统的用户。管理员可以在后台的页面上可以添加新的用户,但是要注意添加的信息要完全符合数据库的字段要求。如果添加的信息不符合要求就会添加失败。管理员还可以对用户的信息根据用户名进行查询,我们还可以对用户的信息进行修改,当用户想要消除自己的账号时,管理员可以直接点击删除按钮即可。代码流程://查询功能//根据用户id调用后台的查询接口get
public
Result<User>get(@PathVariableStringid){//创建了userresult对象用来保存结果
Result<User>userResult=newResult<>();//利用insertLog函数添加日志
this.insertLog(action:"查询一条记录",Long.parseLong(id));//调用service服务利用getById函数获取用户信息,通过userResult回显给页面
ReturnuserResult.success(userService.getById(id));}//添加功能publicResult<?>post(@RequestBodyUseruser){
Result<?>result=newResult<>();//创建一个result结果对象//调用userService服务保存用户信息,成功保存返回ture,保存失败返回flase
Booleanflag=userService.save(user);//利用insertLog函数添加日志this.insertLog(action:"插入一条记录",user.getId(),user);
if(flag)//若插入成功则向前台页面回写添加成功,否则返回错误
return
result.success();elsereturn
result.error();}//修改功能PublicResult<User>put(@PathVariable
Integerid,@RequestBody
Useruser){//创建一个新的result对象
Result<User>result=newResult<>();
user.setId(id);//用setid函数设置用户id
this.insertLog("更新一条记录",id,user);//利用insertLog函数添加日志//调用userService服务利用updateById函数更新用户信息,成功更新返回ture,更新失败返回flase
Booleanflag=userService.updateById(user);
if(flag)//若更新成功则向前台页面回写更新成功
return
result.success();elsereturnresult.error();}//删除功能PublicResult<?>delete(@PathVariableStringid){//创建一个新的result对象
Result<?>result=newResult<>();//调用userService服务利用removeById函数删除用户信息,成功删除返回ture,删除失败返回flase
booleanflag=userService.removeById(id);//利用insertLog函数添加日志
this.insertLog("删除一条记录",Long.parseLong(id));
if
(flag)//若删除成功则向前台页面回写删除成功
returnresult.success();elsereturnresult.error();}运行界面如图5.15、5.16、5.17、5.18、5.19所示:图5.15用户管理界面图5.16查询用户界面图5.17添加用户界面图5.18修改用户信息界面图5.18删除用户信息界面5.2.2电影管理模块模块功能介绍:管理员可以对电影的信息进行增删查改操作,在增加电影的时候需要填写的信息有:电影名称、演员、剧情、国家、发布时间、导演等,填写的信息要符合数据库字段的规范,否则会添加失败。在进行查询时可以根据电影的名称进行模糊查询。管理员可以对电影的所有信息进行修改。代码流程:管理员在进行电影查询时可以直接在页面的左上角输入查询电影的名字,本系统支持模糊查询,在当用户输入的信息和数据库表movie中的数据匹配时,就会自动显示出所查询的电影信息。用户在修改电影的时候需要给出修改的地方和内容,修改完成后直接点击确认即可完成修改。当管理员想把某个电影删除时直接点击删除键。核心代码部分只需要将用户管理的核心代码中的user全部替换成movie即可,这里不再赘述。运行界面如图5.19所示:图5.19电影管理界面5.2.3新闻管理模块模块功能介绍:管理员可以对本系统的新闻资讯进行管理,包括新闻的增删查改,新闻的增加要符合数据库字段规范,当管理员想修改新闻时可以直接点击编辑按键对新闻进行操作。当新闻已经过时,管理员还可以将这个新闻删除掉。代码流程:管理员可以按照标题和内容请求数据库中的新闻数据进行查询。编辑和添加新闻时,必须输入新闻的内容和标题,用户无需填写发布时间;当用户完成操作后,系统会将新闻的标题和内容存入数据库,然后在前端new-list页面显示出来。在用户将新闻删除之后前端页面相应的新闻也会被删除。核心代码部分只需要将用户管理的核心代码中的user全部替换成new即可,这里不再赘述。运行界面如图5.20所示:图5.20电影新闻界面5.2.4电影预定管理模块模块功能介绍:管理员可以使用此系统来管理用户的订单。管理员可以直接在页面搜索用户名和电影场次,查询用户订单,也可以点击页面左上方的用户和场次按钮来选择用户可场次方便了管理员操作。电影预定的增加和修改需要填写电影的状态、用户名、场次、座位、价格、座位号等信息。管理员也可以将用户的订单删除。代码流程:管理员可以根据预定电影票的用户和场次对数据库中order表中的数据进行查询,然后将查询到的数据显示出来。管理员可以点击增加按键来增加电影票预定信息,管理员输入各种信息之后数据会存到数据库,之后系统会将数据库中的电影预定数据传输到前端ticket页面中,ticket页面会将这些信息在对应的用户的已预定的电影票中展示出来,管理员还可以将预定的电影票进行删除。核心代码部分只需要将用户管理的核心代码中的user全部替换成order即可,这里不再赘述。运行界面如图5.21所示:图5.21电影预定界面5.2.5评论管理模块模块功能介绍:管理员可以在后台查看用户对系统已经发布的影片的评论,管理员可以输入电影名字查看所有用户对这个电影的评论,或者输入用户名或点击用户按键来查看用户对所有电影的评分。管理员在遇见一些用户的恶意评价的时候,可以将此用户的评论删除。代码流程:管理员对评论操作完成之后,系统会调用相应的方法比如delete,此方法会将管理员的操作反映到数据库中,删除数据库中review表中的数据,然后将剩下的评论信息传输到前端date_review页面上供管理员查看。核心代码部分只需要将用户管理的核心代码中的user全部替换成review即可,这里不再赘述。运行界面如图5.22所示:图5.22电影评论管理界面5.2.6场次管理模块模块功能介绍:管理员可以对在本系统中已经发布的电影的场次进行管理,对不同场次的电影进行修改增加等。其中包括:电影名称、价格、座位数量、放映时间、已被预订的座位等。管理员还可以按照电影名称对电影的场次进行查询和删除操作。代码流程:当管理员对电影的场次信息进行改动之后,改动过的数据会保存到数据库中的scene表中,然后将这些信息传输到data_scene页面。用户在前端也会看到电影票价和场次的变化,已经预定的座位前端用户不可以再次预定。核心代码部分只需要将用户管理的核心代码中的user全部替换成scene即可,这里不再赘述。运行界面如图5.23所示:图5.23场次管理界面5.2.7用户评分管理模块模块功能介绍:管理员可以对用户的评分进行管理,管理员可以根据电影名查询该电影的评分记录,也可以根据用户名来查询用户对电影的评分。管理员还可以增加和修改评分记录,只需要输入电影名称、评分、用户即可。对于那些恶意评分的用户管理员可以选择将他的评分记录删除。代码流程:核心代码部分只需要将用户管理的核心代码中的user全部替换成score即可,这里不再赘述。运行界面如图5.24所示:图5.24评分管理界面5.2.8观影记录管理模块模块功能介绍:管理员可以对用户的观影记录进行管理,管理员可以根据电影名查询所有观看过该电影的用户,也可以根据用户名来查询该用户对所有电影的观看记录。管理员还可以增加和修改观影记录,只需要输入电影名称、用户名即可。用户的观影记录也可以被管理员删除。代码流程:核心代码部分只需要将用户管理的核心代码中的user全部替换成watch即可,这里不再赘述。运行界面如图5.25所示:图5.25观影记录管理界面6结论本系统主要使用到的语言主要有java编程语言。因为SpringBoot框架简单灵活的优势,所以我选择了它作为本系统的框架。因为相对来说我对IDEA比较熟悉,所以我选择它作为主要的开发平台。推荐算法主要通过PyCharm开发平台实现。此次开发的基于个性化推荐的电影购票系统基本是独立设计的。系统所包含的工作量也是很大的,在开发本系统的过程中我也走了很多的弯路,遇到了很多的困难比如在PyCharm中导入surprise依赖包的时候怎么都导入不了,最后请教了老师和同学才了解到surprise依赖包需要VSC++2014版本以上的编译环境,最后问题得以解决。在写本系统的时候,我有时也会非常烦躁,在此感谢我的舍友对我的安慰让我重拾信心。系统完成时,我发现自己收获了很多,这也会是我人生经历中的一段难忘的事情。基于个性化推荐的电影购票系统他的一个特点就是智能推荐,在设计该系统的时候我就纠结要选择什么样的推荐算法才能给
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026长沙公司面试题目及答案
- 2026年注册环保工程师考试试题与答案
- 交易行为异常分析
- 2026重点细节面试题及答案
- 2026咨询业面试题目及答案
- 2026年医疗护理员考试备考冲刺模拟试卷含答案解析
- 2026年四川希望汽车职业学院单招职业适应性考试题库及参考答案详解
- 2026年江西省上饶市高职单招综合素质考试题库附答案解析
- 2026年河北省考《申论》真题及答案解析(B卷)
- 2026年高级经济师考试题库附答案【黄金题型】
- 2026年小红书爆款笔记创作公式与算法机制
- 2026-2030中国羟基乙酸行业竞争状况与应用趋势预测报告
- 江苏无锡市2025-2026学年高二下学期期末考试数学试题
- 2026年消防知识和技能考试试题及答案
- 物业工程标准化运维培训体系
- 2026年教师招聘面试试讲真题(高中生物)
- 2026年金属非金属矿山(露天矿山)安全管理人员试题附答案详解【考试直接用】
- 花篮式悬挑脚手架监理实施细则范本
- 创意与策划课程大纲
- 【答案】《深度学习及其应用》(复旦大学)章节期末慕课答案
- 深度解析(2026)《TBT 3211-2009机车车辆用铸钢件射线照相检验参考图谱》
评论
0/150
提交评论