@TOC
springboot618基于协同过滤算法的体育商品推荐系统_t81xg--论文
绪 论
近年来,随着互联网科技的进步和发展,人们的生活水平得到了极大的提高,图书的数量也在快速增加,以至于体育商品推荐的数量不断扩大,管理个性化智能体育商品推荐工作也日渐繁重。由于传统的体育商品推荐方式,人工管理成本高,效率低,还存在图书的数量不明确,与管理人员沟通方面的压力。所以人工管理方式在很大的程度上存在弊端。给人们的生活带来了非常大的不便,导致不能满足现在社会的需求。现如今对个性化智能体育商品推荐的管理成为一个越来越受关注的社会问题,对于能够快速的找到体育商品,也是为了提高体育商品推荐的效率。现在的个性化智能体育商品推荐的管理也是在不段完善。
1.1项目背景
主要是对于个性化智能体育商品推荐工作调研,以及对体育商品推荐信息采集、存储、查询和更新。在个性化智能体育商品推荐问题上对于现有管理上的不足,用户可以通过后期查询体育商品推荐信息情况,从而使个性化智能体育商品推荐更加便利。
用户的不同,导致所给权限的不同。管理者可对所有信息进行修删查,其他注册用户需要进行相应的操作标准,给几种不同用户不同权限与界面,从而让系统更加广泛的使用与任何个性化智能体育商品推荐上的管理。
在实际的系统项目开发中,需要怎么做开发和一些现实中的做法是紧密结合在一起的,整体开发的过程还有应用的场景通常也会是一个持续发展的过程,在一个特定的设计中,如何开发,将会对实际的实施流程产生影响,要注意到怎样进行部署和运行。因此,整个系统的研究与开发是紧密相连的。如果真的将其划分为几个独立的阶段,而忽略它作为一个综合的考虑,那么每一步的实施过程都不可避免地会遇到前一阶段考虑不完全而导致的问题,从而影响整体开发的效率。
设计者往往以需求为中心进行工作,而大多数的功能需求是从总体上进行分析和思考,即从设计者的角度去了解需求。但是要真正理解真实需要,光从开发人员的观点出发还远远不够,还需要从实际的行业发展以及相关地方情况考虑,要从更高的层面去分析,这是真实的需要;同时,我们也要更好的了解他们的用户思维,了解他们的应用情况,和他们的思想,这是他们的需要。
1.2研究意义
社会进步的步伐带动了信息技术的发展,信息化的建设使得人们生活的节奏加快,至使人们更加注重信息的时效性。陈旧的管理获取信息方式将无法满足人们的需求。从而人们更加关注在线系统管理。在线系统管理可以满足现代人们获取信息实时、便捷等特点,只要有网络的地方,就能迅速查找到想要的信息。
计算机技术已成为人们管理信息的重要工具。能解决人们获取信息更加有效快捷,提高人们的工作效率为重要手段。
1.3设计目的
通过对体育商品推荐内容的学习研究,进而设计并实现一个基于协同过滤算法的个性化智能体育商品推荐系统。系统实现的主要功能包括首页、个人中心、用户管理、商品分类管理、商品信息管理、交流论坛、留言板、系统管理、订单管理等功能的操作。还有可以正确的为用户服务,准确显示当前信息。
在个性化智能体育商品推荐系统的前期,即需求分析阶段,我们对体育商品推荐的需求进行了详细的描述,并且在需求规范中有详细的描述和阐明。根据系统需求的分析,对个性化智能体育商品推荐的管理进行了整体的设计。着重对软件模块的设计进行了详细的分析,以达到对系统的需求。重点阐述了系统的划分、接口的确定、各模块间的数据传输、数据结构与模块结构的设计。在下面的概要设计中,将会详细地描述这个阶段中的系统。
1.4设计思想
在开发与设计中,要有正确的开发思路,要对开发环境、语言、架构、操作系统这些方面做一些了解,最后就是完整的思路模式。系统的设计按照以下原则执行:
(1)有效性原则
能够进行有效的设计,对于用户来说是比较满意的,正常情况下可以满足需求,还有是有用的特定意义,可以说都是在有效的范围里。都是用一些操作,还有开发的思维,能够给使用者带来的使用。所谓设计就是需求的想法,不完整就不能够算是一个好的系统,可以使用的系统有效性是很高的,而且还有效使用,在实现用户的需求时才能够很好而不会有错误的。
(2)可扩展性
从“可伸缩”的意义来看,许多人认为,讨论改进性能、实现高可用性,甚至是专门的技术和协议。很明显,这些都与可扩充性无关,你必须知道有关速度、性能、可用性、应用平台、网络等等,但是,这并不是一个可扩充的定义。其核心内容是增加一个功能逻辑,或者减少一个功能,逻辑上并不会影响到其他已经编写好的功能模块,这就是可扩展性含义。
系统的可扩展性设计非常重要,但是又非常难以掌握,很多试图通过高并发语言等方式缓解开发者精力,但是,无论采取什么技术,如果应用系统内部是比较的麻烦,比如对数据库的严重依赖,当系统的存取规模达到一定程度时,就会将资源集中在一个或两个数据库服务器上,这时进行分区扩展伸缩就比较困难。
(3)用户的需求原则
在设计系统之前,一般都是先了解一下系统,了解一下系统中的信息在哪里,然后再进行相应的设置。但我们也承认,许多使用者并不能真正了解设计师的想法,并且经过研究发现,系统所服务的对象是广大的用户,并不是掌握这些知识的设计者,所以我们得通过特殊的界面来实现让用户方便使用的系统。
2系统开发技术
2.1 Java技术
Java属于一种面向对象的编程语言,它由C++发展而来。Java保留了C++语言大部分好的优点,同时放弃了C++里很那的多继承、指针等概念。Java从根本上解决了C++的固有缺陷,形成了一种新的完全面向对象的语言,因此Java语言的句法更加清晰、规模也更加的小、更容易学等多个特征。Java语言作为静态面向对象编程语言的代表,完美地实现了面向对象理论,使程序员能够以优雅的思维执行复杂的编程。
2.2 协同过滤算法介绍
协同过滤算法(Collaborative Filtering) 是比较经典常用的推荐算法,它是一种完全依赖用户和物品之间行为关系的推荐算法。我们从它的名字“协同过滤”中,也可以窥探到它背后的原理,就是 “协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。
2.3 SpringBoot框架
现如今后台开源框架主流的有SSH、SSM、SpringBoot,但是SSH、SSM框架的环境配置项较多,而SpringBoot主要的设计思想就是约定大于配置,故而SpingBoot在设计时几乎达到零配置。SpringBoot整合了业界上的开源框架。具体采用技术框架描述如下:
(1)Mybatis:Mybatis:提供自动映射,动态SQL,级联,缓存,注解,代码和SQL分离等特性,使用方便,同时也对SQL进行优化[10]。
(2)SpringMVC:通过一套MVC注解,让POJO成为处理请求的控制器,无需实现任何接口,同时,SpringMVC还支持REST风格的URL请求[11]。
(3)SpringBoot:从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置[12]。
SpringBoot是一款非常强大后台框架,因为SpringBoot开发时可以基本不用写配置文件,所以使用SpringBoot搭建网站的后台环境,在SpringBoot的yml配置文件中写入项目启动端口,项目就可以启动。项目的Java文件还有静态文件都是由SpringBoot来管理。
2.4 MySQL数据库
Mysql的语言是非结构化的,当对客观事物的符号进行描述时,数据则是信息的载体,数据库负责记录跟踪这些数据。数据库用来记录分析保存生成的数据,在系统项目中起到了很重要的作用。Mysql数据库体积小,作用快,相对于其他数据库而言性价比较高,适合中等网页的开发,并且服务很稳定,几乎不存在宕机情况。
2.5 B/S体系结构介绍
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器,如Chrome、Safari、Microsoft Edge、Netscape Navigator或Internet Explorer,服务器安装SQL Server、Oracle、MYSQL等数据库。浏览器通过Web Server同数据库进行数据交互。
3系统分析
3.1需求分析
要想在实际的情况下,开发出一套符合使用者要求的基于协同过滤算法的个性化智能体育商品推荐系统,首先要了解使用者的需求。对个性化智能体育商品推荐的需求有深刻的了解,无论设计与开发工作多么优秀,都是一个成功的先决条件,也可以这么说,要不能满足用户需求的程序,是创造不出非常大的使用价值的,而且还给设计者带来很多的不利。需求分析是系统设计时期的比较重要的一个阶段,它的基本内容是准确地解释出系统将会能够做些什么事情的关键问题,最终完成的是一份完整的系统的使用说明。
(1)有一些功能方面的需求,通过需求分析,可以找出需要完成的几个基本功能模块。性能要求也是指在系统设计的时候,需要满足一定的要求和限制,比如响应时间、信息处理、内存容量、磁盘容量、安全等等。
(2)系统的可靠性要求也是一个必须考虑的问题,它可以将可用性和可靠性结合起来,显示了用户在使用时经常遇到的问题。硬件要求也包括需要处理错误,以表明系统如何应对环境错误。如果自己的系统收到来自其他系统的信息,这些信息违背了某些格式,这时系统应该会有什么样的响应情况。
(3)软件方面的需求还有一些逆向的需求,就是系统不能做的事情。可以说,有很多种不同的要求,而开发人员应该能够准确的理解他们的真正需要,并且可以应用到系统中。还有应该明确地找出一些虽然不属于当前系统开发的情况,但是据现在的分析,将来是非常可能会需要的可能需求。经过这个需求的分析,在设计过程中对个性化智能体育商品推荐系统将来有机会出现的问题有所准备,要能够确实需要的时候可以更加轻松的修改。
3.2系统性能分析
系统的性能是指操作系统完成现有的程序的有效性、稳定性以及响应速度,操作系统完成一个任务时,与系统自身设置、路由的设计、网络性能的测试、设备的使用情况等多个方面都密切相关,要是任何一个环节出现问题,就都会影响整个系统的性能。所以要从网络的设置、系统的操作、硬件的组合、程序的应用等方面综合检查,然后问题出现在哪个部分,可以集中进行解决。
在程序的应用、系统的操作、硬件的组合、网络的设置等方面,影响性能最大的是程序的应用和系统的操作两个方面,因为这两个方面如果出现的问题是不太容易察觉,隐蔽性非常的强。而硬件的组合、网络的设置只要出现问题,一般都能马上发现。主要了解一下系统的操作方面的性能操作思路,程序的应用方面需要具体问题还需要有具体的解决办法。
随着智能设备的快速发展,以及对于网络的深入认识,这种高度分布式架构最终会变为移动计算。但是,随着计算量的日益增大,系统架构师开始将计算任务转移到共享网络的计算上,这样,他们就可以利用共享网络的计算可以无限制的计算量和存储相关的资源,并享受其带来的比较高的可靠性以及低成本。因此,近年来,许多的企业开始向以共享网络计算为中心的更加有效化的方式发展。
3.3可行性分析
3.3.1经济可行性
系统采用的是java技术来实现相应的功能的开发,综合就是一个比较基础的系统开发设计,所以所用到的有开源的开发环境所构成。而且可以利用现有的设备,不用进行另外的硬件设备购买。
用户通过使用个性化智能体育商品推荐系统,很大程度减小了人员成本,极大提高了管理的效率。目前得由人员管理的方式存在很多不足,首先是人工成本大,并且工作效率比较低,然后是存在着很多现金流失的问题。在结合个性化智能体育商品推荐系统的特点,还有一些记录和统计,个性化智能体育商品推荐杜绝了以上的问题,提高了个性化智能体育商品推荐的安全性。
经济可行性是主要计算项目的开发成本,还有项目成功后可能带来的有效收益。很多的项目只有开发成本能控制在企业有可能接受的范围内的情况下,这样的项目才会被批准开发。然而本次系统的开发在上述所有的问题的情况下,是可以完成相关的系统设计。
3.3.2技术可行性
在研究技术可行性的时候,系统的开发环境是可以确定的,所以技术可行性最好与系统功能和性能以及一些实际的情况同时考虑。在可行性研究阶段,结合实际调整开发的内容和选择能够完成的技术体系是一个可用的手段,如果系统进入开发阶段,任何的调整都意味着会耗费更多的经历。需要再次明确的问题是,技术可行性不只是考虑在技术上是否可实现,实际上还包含了在当前的实际的情况下的技术可行性。有很多的因素例如时间不足、预期的开发目标技术难度比较难、不能有充足的技术积累、而且对于技术的掌握不够等这些实际存在的情况,都是要提前部署和认真规划的。
开发基于协同过滤算法的个性化智能体育商品推荐系统的技术内容分析,目前的状况是从网络硬件和相关技术上看是可行的。该系统采用了java和 MySQL技术。到现在可以知道,很多的基础知识都是经过学习使用的,在后续的设计中还需要不断的练习,学习更多相关的技术经验来充实自己对于系统的开发。
3.3.3社会可行性
在社会可行性分析中,首先能结合国家经济和社会发展的实际情况,还需要能够让用户更加的便利,给使用者带来多方面的高效益,使得可以比较快速的发展以及应用。
在可行性分析中,是比较清晰地发掘开发的系统带来的各种直接的有效的利益以及一些隐藏起来的好处,以便在后续的设计中更加的坚定和确信系统开发的意义。解决一些社会方面存在的问题,设计并开发系统肯定是要发现某类社会存在的问题,并且能够带来一定的社会价值。还有一些社会的影响力,是通过系统优势和切实的好处来产生的,能够在一定的情况下提高效率,肯定会增加一些社会的进步和发展。社会上的可行性,包括法律上的可行性,也包括法律上的可能性,法律上的可行性,需要社会上的许多因素[2],可以来实现系统建设的现实性。如果所开发的系统与国家法律或政策等相关的因素不相符合,在某些信息化的邻域中使用的是一些加密的信息或者技术问题,还有不经过正常的操作使用其他的一些公开的信息等这些情况,这样的系统的开发在法律的范围中就是不能被允许的。
其中还有一个比较重要的用户使用可行性也是通过执行系统时的可行性,是从所有情况下用户的角度来考虑系统的可行性,由于设计开发相关的系统就是站在社会中广大的用户体验考虑的,所以在这个层面考虑也是符合的。
3.4系统用例分析
在设计系统的过程中,用例图是系统设计过程中必不可少的模型,用例图可以更为细致的,结合系统中人员的有关分配,能够从细节上描绘出系统中有关功能所完成的具体事件,确切的反映出某个操作以及它们相互之间的内部联系。
其中参与者就是和系统能够发生交互的外在实体,一般可以指系统的某个用户。一个用例图就能对应出系统中的一个功能过程,系统中完整的功能都是由许多不同的用例图所组成的。
系统用例图如下图所示。
图3-1 管理员用例图
图3-2 用户用例图
3.5 系统流程图
流程图就是用它已经特定的图形符号以及相应的线条,用来展现出系统在执行中的整个的过程。由于这种图形能够很方便的描绘系统的一系列流程,所以它的所有的图形符号是比较关键的,基本都是一个图形符号就能表示某个过程的一个单独的步骤。流程图不只是提供出比较完整、全面的执行过程,而且在整个团队的协作设计过程中,还可以发现其中有可能存在的缺陷以及不足,便于在后续的过程中能够及时的纠正和完善系统。
通过流程图可以对系统的需求和相关过程进行分析,能够详细的细分到每个部分的设计。对于设计者来说在开发过程中能够使用流程图作为基础,可以快速提高自身的逻辑思想,并且还能在后续的操作中能够有章可循,在系统的设计中最重要的就是程序的设计,然后才是程序的具体编写,流程图便是在设计过程中重要的工具,以下就是部分流程图设计。
登录流程图和添加信息流程图分别如图3-3、图3-4所示。
图3-3 登录流程图
图3-4 添加信息流程图
4 系统设计
4.1系统功能结构设计图
本次系统所涉及到的有关的功能,都是用功能结构图来简洁和清晰的表示出来,功能结构图就是能够把比较复杂的功能结构用图的形式清晰的描绘下来,并且为后续的设计以及测试等模块提供了明确的方向,在构思功能结构图的时候,便可以给设计的过程带来一定的思维导向,不至于在设计过程中有所遗漏,可以尽可能的明确系统所涉及到的功能。
系统的功能结构图如图4-1所示。
图 4-1系统功能结构图
4.2数据库设计
4.2.1数据库设计原则
学习程序设计,如果要了解数据库管理系统或者是根据需求而制定的系统接口,就必须创建一种数据库管理系统的模式,用来保存数据资料,这样当在应用编程过程中时候,就不需要再向操作系统页面上加载信息,进而增加了整个系统的工作效率。信息库管理系统中保存着许多数据,应该说是一个管理信息系统建设的中心和基础,而信息库管理系统也为管理信息系统建设提出了新增、删除、更改和搜索的操作功能,使管理信息系统建设能够迅速地查询所需要的数据,而不会直接从程序代码中查找。信息库管理系统通过将信息表的各个组成部分按照特定的方法准确地合并,排序和组成信息库管理系统。
通过对个性化智能体育商品推荐系统的主要功能信息进行规划并分为若干功能实体信息,实体信息将使用E-R图加以表示,本系统的主要功能实体图如下图所示。
图4-2留言板实体图
图4-3交流论坛实体图
图4-4商品信息评论实体图
图4-5用户实体图
图4-6购物车实体图
4.2.2 数据表设计
在关系数据E-R图中,分析并创建数据表,数据表用来记录信息,数据表关系由多个数据表组成,下面介绍的是数据表各个字段信息如下表所示。
表4-1:留言板
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 留言人id | |||
username | varchar | 200 | 用户名 | ||
avatarurl | longtext | 4294967295 | 头像 | ||
content | longtext | 4294967295 | 留言内容 | ||
cpicture | longtext | 4294967295 | 留言图片 | ||
reply | longtext | 4294967295 | 回复内容 | ||
rpicture | longtext | 4294967295 | 回复图片 |
表4-2:交流论坛
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 帖子标题 | ||
content | longtext | 4294967295 | 帖子内容 | ||
parentid | bigint | 父节点id | |||
userid | bigint | 用户id | |||
username | varchar | 200 | 用户名 | ||
avatarurl | longtext | 4294967295 | 头像 | ||
isdone | varchar | 200 | 状态 |
表4-3:商品信息评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
refid | bigint | 关联表id | |||
userid | bigint | 用户id | |||
avatarurl | longtext | 4294967295 | 头像 | ||
nickname | varchar | 200 | 用户名 | ||
content | longtext | 4294967295 | 评论内容 | ||
reply | longtext | 4294967295 | 回复内容 |
表4-4:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-5:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-6:用户
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
mima | varchar | 200 | 密码 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
touxiang | longtext | 4294967295 | 头像 | ||
xingbie | varchar | 200 | 性别 | ||
nianling | int | 年龄 | |||
shouji | varchar | 200 | 手机 | ||
money | float | 余额 | 0 |
表4-7:购物车表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
tablename | varchar | 200 | 商品表名 | shangpinxinxi | |
userid | bigint | 用户id | |||
goodid | bigint | 商品id | |||
goodname | varchar | 200 | 商品名称 | ||
picture | longtext | 4294967295 | 图片 | ||
buynumber | int | 购买数量 | |||
price | float | 单价 | |||
discountprice | float | 会员价 | |||
goodtype | varchar | 200 | 商品类型 |
表4-8:商品信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
shangpinbianhao | varchar | 200 | 商品编号 | ||
shangpinmingcheng | varchar | 200 | 商品名称 | ||
shangpinfenlei | varchar | 200 | 商品分类 | ||
fengmian | longtext | 4294967295 | 封面 | ||
guige | varchar | 200 | 规格 | ||
onelimittimes | int | 单限 | |||
alllimittimes | int | 库存 | |||
clicktime | datetime | 最近点击时间 | |||
price | float | 价格 |
表4-9:订单
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
orderid | varchar | 200 | 订单编号 | ||
tablename | varchar | 200 | 商品表名 | shangpinxinxi | |
userid | bigint | 用户id | |||
goodid | bigint | 商品id | |||
goodname | varchar | 200 | 商品名称 | ||
picture | longtext | 4294967295 | 商品图片 | ||
buynumber | int | 购买数量 | |||
price | float | 价格 | 0 | ||
discountprice | float | 折扣价格 | 0 | ||
total | float | 总价格 | 0 | ||
discounttotal | float | 折扣总价格 | 0 | ||
type | int | 支付类型 | 1 | ||
status | varchar | 200 | 状态 | ||
address | varchar | 200 | 地址 | ||
tel | varchar | 200 | 电话 | ||
consignee | varchar | 200 | 收货人 | ||
remark | varchar | 200 | 备注 | ||
logistics | longtext | 4294967295 | 物流 | ||
goodtype | varchar | 200 | 商品类型 |
5系统详细设计
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
系统注册:在系统注册页面的输入栏中输入用户注册信息进行注册操作,系统注册页面如图5-2所示:
图5-2系统注册页面
系统登录:在系统登录页面的输入栏中输入用户名和密码进行登录;系统登录页面如图5-3所示
图5-3系统登录页面
个人中心:在个人中心页面可以对个人中心、我的发布、我的订单、我的地址和我的收藏进行详细操作;如图5-4所示:
图5-4个人中心界面
后台管理,用户进入系统首页,在导航栏中点击后台管理,进入后台管理页面可以对密码和个人信息进行修改操作等进行操作。用户后台管理主页面如图5-5所示:
图5-5 用户后台管理主界面
5.2管理员功能模块实现
管理员登录,在登录页面正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。
图5-6 管理员登录界面
管理员进入主页面,主要功能包括对首页、个人中心、用户管理、商品分类管理、商品信息管理、交流论坛、留言板、系统管理、订单管理等进行操作。管理员主页面如图5-7所示:
图5-7 管理员主界面
管理员点击用户管理。在用户页面输入用户账号进行查询、新增或删除用户列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图5-8所示:
图5-8用户管理界面
管理员点击商品分类管理。在商品分类页面输入商品分类进行查询、新增或删除商品分类列表,并根据需要对商品分类信息进行修改或删除操作;如图5-9所示:
图5-9商品分类管理界面
管理员点击商品信息管理。在商品信息页面输入商品分类进行查询、新增或删除商品信息列表,并根据需要对商品信息进行详情、修改、查看评论或删除操作;如图5-10所示:
图5-10商品信息管理界面
管理员点击交流论坛管理。在交流论坛页面输入帖子标题进行查询、新增或删除交流论坛列表,并根据需要对交流论坛信息进行详情、修改、查看评论或删除操作;如图5-11所示:
图5-11交流论坛界面
管理员点击留言板管理。在留言板页面输入商品分类进行查询或删除留言板列表,并根据需要对留言板信息进行修改或删除操作;如图5-12所示:
图5-12留言板界面
管理员点击系统管理。在关于我们页面输入标题进行查询关于我们列表,并根据需要对关于我们详细信息进行详情或修改操作,还可以对公告资讯、系统简介和轮播图管理进行详细操作。如图5-13所示:
图5-13系统管理界面
管理员点击订单管理。在已支付订单页面输入订单编号和商品名称进行查询或删除已支付订单列表,并根据需要对已支付订单详细信息进行详情、发货或删除操作,还可以对已发货订单、已完成订单、已取消订单、已退款订单和未支付订单进行详细操作。如图5-14所示:
图5-14订单管理界面
5.3本章小结
在本章的设计过程中,首先是根据前的功能总结构设计的基础上,对于每个功能的实现,做了一些整体的设计。数据的连接是由数据库完成,通过了正常的连接。然后可以成功的建立一些系统开发所用到的表格。
6 系统调试与测试
系统的测试是必须的,需要知道的是这个阶段不是单独的,而是在全部的时间进行。这么做可以及时发现问题,还能找到产生矛盾的地方,并且可以尝试修改,这样就能完善系统。对于被测试的系统,都可以找到一些问题,而且还可以找到对应的位置在哪。其目的是对于整体的测试,发现需求中存在的矛盾,就可以做出修改了。测试的过程是对应于整体,有对软件的测试,发现需求的符合度,接下来,就是对数据的检测,以及对硬件的检测。
在软件测试规划中,必须了解测试流程,包括功能概述,测试周期,测试方法,测试范围,测试配置,测试技巧,测试交流,风险分析等。对于一些开发的人员,是可以知道测试方法,找到测试过程的一些的问题,然后可以应对这些问题。
StoreupServiceImpl.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.StoreupDao;
import com.entity.StoreupEntity;
import com.service.StoreupService;
import com.entity.vo.StoreupVO;
import com.entity.view.StoreupView;
@Service("storeupService")
public class StoreupServiceImpl extends ServiceImpl<StoreupDao, StoreupEntity> implements StoreupService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<StoreupEntity> page = this.selectPage(
new Query<StoreupEntity>(params).getPage(),
new EntityWrapper<StoreupEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<StoreupEntity> wrapper) {
Page<StoreupView> page =new Query<StoreupView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<StoreupVO> selectListVO(Wrapper<StoreupEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public StoreupVO selectVO(Wrapper<StoreupEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<StoreupView> selectListView(Wrapper<StoreupEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public StoreupView selectView(Wrapper<StoreupEntity> 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);
}
}
ShangpinxinxiServiceImpl.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.ShangpinxinxiDao;
import com.entity.ShangpinxinxiEntity;
import com.service.ShangpinxinxiService;
import com.entity.vo.ShangpinxinxiVO;
import com.entity.view.ShangpinxinxiView;
@Service("shangpinxinxiService")
public class ShangpinxinxiServiceImpl extends ServiceImpl<ShangpinxinxiDao, ShangpinxinxiEntity> implements ShangpinxinxiService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<ShangpinxinxiEntity> page = this.selectPage(
new Query<ShangpinxinxiEntity>(params).getPage(),
new EntityWrapper<ShangpinxinxiEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<ShangpinxinxiEntity> wrapper) {
Page<ShangpinxinxiView> page =new Query<ShangpinxinxiView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<ShangpinxinxiVO> selectListVO(Wrapper<ShangpinxinxiEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public ShangpinxinxiVO selectVO(Wrapper<ShangpinxinxiEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<ShangpinxinxiView> selectListView(Wrapper<ShangpinxinxiEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public ShangpinxinxiView selectView(Wrapper<ShangpinxinxiEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
FileUpload.vue
<template>
<div>
<!-- 上传文件组件 -->
<el-upload
ref="upload"
:action="getActionUrl"
list-type="picture-card"
:multiple="multiple"
:limit="limit"
:headers="myHeaders"
:file-list="fileList"
:on-exceed="handleExceed"
:on-preview="handleUploadPreview"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-error="handleUploadErr"
:before-upload="handleBeforeUpload"
>
<i class="el-icon-plus"></i>
<div slot="tip" class="el-upload__tip" style="color:#838fa1;">{{tip}}</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible" size="tiny" append-to-body>
<img width="100%" :src="dialogImageUrl" alt>
</el-dialog>
</div>
</template>
<script>
import storage from "@/utils/storage";
import base from "@/utils/base";
export default {
data() {
return {
// 查看大图
dialogVisible: false,
// 查看大图
dialogImageUrl: "",
// 组件渲染图片的数组字段,有特殊格式要求
fileList: [],
fileUrlList: [],
myHeaders:{}
};
},
props: ["tip", "action", "limit", "multiple", "fileUrls"],
mounted() {
this.init();
this.myHeaders= {
'Token':storage.get("Token")
}
},
watch: {
fileUrls: function(val, oldVal) {
// console.log("new: %s, old: %s", val, oldVal);
this.init();
}
},
computed: {
// 计算属性的 getter
getActionUrl: function() {
// return base.url + this.action + "?token=" + storage.get("token");
return `/${this.$base.name}/` + this.action;
}
},
methods: {
// 初始化
init() {
// console.log(this.fileUrls);
if (this.fileUrls) {
this.fileUrlList = this.fileUrls.split(",");
let fileArray = [];
this.fileUrlList.forEach(function(item, index) {
var url = item;
var name = index;
var file = {
name: name,
url: url
};
fileArray.push(file);
});
this.setFileList(fileArray);
}
},
handleBeforeUpload(file) {
},
// 上传文件成功后执行
handleUploadSuccess(res, file, fileList) {
if (res && res.code === 0) {
fileList[fileList.length - 1]["url"] = "upload/" + file.response.file;
this.setFileList(fileList);
this.$emit("change", this.fileUrlList.join(","));
} else {
this.$message.error(res.msg);
}
},
// 图片上传失败
handleUploadErr(err, file, fileList) {
this.$message.error("文件上传失败");
},
// 移除图片
handleRemove(file, fileList) {
this.setFileList(fileList);
this.$emit("change", this.fileUrlList.join(","));
},
// 查看大图
handleUploadPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
// 限制图片数量
handleExceed(files, fileList) {
this.$message.warning(`最多上传${this.limit}张图片`);
},
// 重新对fileList进行赋值
setFileList(fileList) {
var fileArray = [];
var fileUrlArray = [];
// 有些图片不是公开的,所以需要携带token信息做权限校验
var token = storage.get("token");
let _this = this;
fileList.forEach(function(item, index) {
var url = item.url.split("?")[0];
if(!url.startsWith("http")) {
url = _this.$base.url+url
}
var name = item.name;
var file = {
name: name,
url: url + "?token=" + token
};
fileArray.push(file);
fileUrlArray.push(url);
});
this.fileList = fileArray;
this.fileUrlList = fileUrlArray;
}
}
};
</script>
<style lang="scss" scoped>
</style>