【《基于JAVA的新闻管理系统设计》21000字(论文)】_第1页
【《基于JAVA的新闻管理系统设计》21000字(论文)】_第2页
【《基于JAVA的新闻管理系统设计》21000字(论文)】_第3页
【《基于JAVA的新闻管理系统设计》21000字(论文)】_第4页
【《基于JAVA的新闻管理系统设计》21000字(论文)】_第5页
已阅读5页,还剩38页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[9]。由上述分析可知,国内外学者关于新闻管理系统的开发,从运用开发的程序语言来看,既有PHP,Java等开发语言,从数据库的开发语言来看,主要有SQLServer以及MySQL数据库语言,运用多种架构方式或者语言均可完成该系统的开发。第二章开发语言与关键技术基于SSM框架的新闻管理系统的设计与开发主要使用IntelliJIDEA2017.3.1x64应用程序进行开发,前端采用HTML5语言,辅助以JavaScript脚本语言和Bootstrap3框架,后端采用Java语言,辅助以SSM框架。新闻信息的发布操作采用百度公司开发的UEditor编辑器。服务器采用本地搭建模式,使用由Apache软件基金会开发的Tomcat服务器,它是目前比较流行的Web应用服务器。数据库管理系统使用Mysql-5.7.30-winx64,管理开发MySQL使用NavicatPremium12,为系统开发提供直觉化的图形界面,使用户能够安全并且以简单的方式创建、组织、访问并共用信息。第一节开发语言与环境一、Java相关介绍Java语言诞生于20世纪90年代初期,它是一种简单易用、完全面向对象、与平台无关、安全可靠、主要面向Internet的开发工具。这些年,随着JavaServlet的推出,Java语言极大的推动了电子商务的发展。JavaServerPage(JSP)技术的推出,更是让Java语言成为基于Web应用程序的首选开发工具。Internet的普及和迅猛发展,以及Web技术的不断渗透,使得Java语言在现代社会的经济发展和科学研究中,占据了越来越重要的地位。在最新的TIOBE编程语言排行榜,Java语言常常位于榜首。Java语言虽然衍生自C++,与C++相比Java是一个完全面向对象的编程语言。出于安全性和稳定性的考虑,Java去掉了C/C++支持的三个不易理解和掌握的数据类型:指针(pointer)、联合体(union)和结构体(struct)。这样做的目的使用户不能直接访问内存地址,从而保证了程序更高的安全性。二C/C++中联合体和结构体的功能,完全可以在Java中用类及类的属性等面向对象的方法实现。与此同时,Java语言性能也很出色,具有以下几个重要特征:1、面向对象:Java语言以对象为中心,以消息为驱动的面向对象的编程语言。主要包括三个概念:封装、继承和多态。2、平台无关性:Java程序编写的应用程序不用修改就可在不同的软硬件平台上运行。它使得编程人员只开发一次软件,就可以在任意平台上运行。3、分布式:分布式包括数据分布和操作分布,Java语言支持两种分布式。4、可靠性:Java语言消除了C++语言中许多不可靠的因素,防止了很多编程错误,提高了可靠性。5、安全性:Java语言具有较高的安全性,可以防止病毒程序的产生和下载程序对本地系统的威胁破坏。6、支持多线程:Java语言在两方面支持多线程:一方面是在Java环境本身就是多线程,另一方面,Java语言内置多线程机制。7、支持网络编程:Java语言可以通过它所提供的类库处理TCP/IP协议。二、MySQL相关介绍MySQL是一个中小型的关系型数据库管理系统,目前属于Oracle公司。由于它具有性能高、成本低、可靠性好等优点。近几年已经成为最流行的开源数据库,被广泛的应用在Internet的中小型网站中。目前MySQL数据库最新版本为MySQL8.0,而最新版本还存在着许多未知bug在修复,所以该新闻管理系统选择了目前很稳定的MySQL5.7。MySQL5.7的性能和功能相较于之前版本有了很大的改善,主要体现在CPU多核处理速度上有了很大的提升,宕机恢复时间减少,可快速创建索引,并具有半同步复制功能等方面。MySQL5.7具体的提升主要体现在以下几个方面:1、性能提升:MySQL5.7通过改进OracleInnoDB存储引擎的效率和并发性,来消除内核中原有的线程争用和互斥锁定的现象。MySQL可以充分利用当今基于x86架构硬件的多线程处理能力。2、安全性的提升:默认开启SSL、不再明文显示用户密码和sql_mode的改变。3、InnoDB存储引擎的提升:更改索引名字时不会锁表、在线DDL修改varchar字段属性不锁表和InnoDB存储引擎支持中文全文索引。4、JSON格式的支持:支持使用JSON格式存储数据。5、优化器改进:针对子查询select采用半连接优化、优化派生子查询和支持HashJoin索引优化。三、IntelliJIDEA相关介绍本系统主要使用IntelliJIDEA进行开发与维护,我选择使用IntelliJIDEA主要是有以下几个原因:1、更好的项目管理方式IDEA的Project与eclipse的workspace相似,Module与eclipse中的project相似。这里不仅仅是简单地改变了名字,IDEA中的Project真的是一个项目,有统一的GlobalLibrary,也可以进行正确的相互依存。合并和管理模块以便于原始开发。2、较高的开发效率举例来说,可以生成某种测试类,并且可以更准确地放置在对应test的目录中。另外,IDEA可以马上提示与代码接口相关的值,不用Debug接口跳跃,也可以对IDE调试JS、代码和接口的自动刷新同步等。有更方便的快捷键,使用IDEA对系统开发效率更好。拥有强大的综合能力:支持Giit、Maven、Spring等,提示功能的快速、便利、提示功能的范围广、代码模板、精确的检索等。第二节关键技术一、B/S架构B/S体系结构,即浏览器和服务器的体系结构模式,是随着Internet技术的发展而修改或改进的C/S体系结构。在这个架构中,工作用户界面由WWW浏览器实现。在浏览器中实现的事务逻辑很少,但是主事务逻辑是在服务器中实现的,形成了所谓的三层结构。B/S体系结构是Web兴起后的网络体系结构模型。Web浏览器是客户端最重要的应用程序软件。该模型统一了客户端,将系统功能实现的核心部分集中在服务器上,简化了系统的开发、维护和使用。只需在客户机上安装一个浏览器(如InternetExplorer),服务器可以使用Oracle、MySQL、SQLServer和其他数据库。B/S三层架构图如下图2-1所示。图2-1B/S三层架构图B/S结构的系统又如下方面的优势:数据安全性高,对于B/S结构的系统,数据集中存放于总部的数据库服务器,客户端不保存任何业务数据和数据库持久化信息,无须进行数据同步。数据一致性好,对于B/S结构的系统,数据是集中存放的,客户端发生的每次数据修改都直接进入到中央数据库,不存在数据一致性的问题。数据实时性好,对于B/S结构的系统,因为其数据都是实时存入服务端的数据库,因而服务器段可以实时看到当前发生的所有业务,能提供更好的企业支持。二、SSM框架本系统后端开发使用的是SSM开源框架,SSM框架具体是由Spring+SpringMVC+Mybatis组成,其中Spring致力于JavaEE应用各层的解决方案,在表现层它提供了SpringMVC的整合功能;在业务逻辑层可以管理事务、记录日志等;在持久层可以整合MyBatis技术。Spring是具有简单、可测试和松耦合等特点,我对于它的理解其实Spring更像一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大地降低了组件之间的耦合性。Spring也提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高程序的复用性。SpringMVC是SSM框架中的第二个S,它是Spring提供的一个是实现了WebMVC设计模式的轻量级Web框架。SpringMVC对于我这种初学者来说,简单易上手,逻辑清晰,而且SpringMVC灵活性强,易于与其他框架集成,而且提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象。MyBatis是支持普通SQL查询,存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的搜索。且该新闻管理系统是由maven生成,在pom.xml文件中导入MyBatis相关的依赖,我所使用的Mybatis版本是3.3.0。其中SSM框架与B/S三层架构也完美契合,SSM框架与B/S三层框架的关系如图2-2所示。图2-2MVC与B/S三层架构对应图三、Bootstrap框架 Bootstrap框架是本系统前端界面设计的一个重要框架,首先,Bootstrap框架简洁灵活,提供了许多响应式的设计模板,在众多前端框架中被我一眼相中。在这个框架中,包含了非常丰富的Web组件,并且它简单易上手,明确了HTML和CSS的规范,为本系统的前端界面开发提供了很大的便利。第三章系统需求分析需求分析是软件计划阶段的重要活动,也是软件生存周期中的一个重要环节。这就说明程序员在开发新闻管理系统之前,必须了解用户的实际需求,只有了解用户的实际需求,才能合理的开发新闻管理系统,否则系统会因不符合要求而造成不断返工,造成不必要的人力和物力的消耗。基于这一特点,系统主要面向两类用户:管理员和普通用户,不同的用户对应不同的需求,具体如下:第一节管理员需求分析一、新闻信息管理这一功能是对已经发布的新闻进行添加、删除、修改和查询,同时管理员将每天定时从搜狐网爬取的数据进行维护。即对新闻内容,新闻标题,发布时间等信息进行操作。二、用户信息管理这一功能是对注册过的用户进行删除和修改。如果发现有违反互联网规定的用户,可以去除该用户在本网站的信息。三、评论信息管理这一功能是对用户发布在新闻网站的评论信息进行审查和删除。评论信息包括评论用户的IP地址、评论内容、评论时间和评论新闻的ID。四、屏蔽字信息管理这一功能是对用户在评论过程中可能会涉及到违法国家现行法律法规、色情、暴力、破坏民族团结和破坏社会公共安全的一些敏感词汇进行过滤和屏蔽。管理员会根据情况进行处罚,情节严重者会被删除用户信息。五、新闻类型管理这一模块存放着是新闻的各个分类类别,管理员对这些类别进行添加、删除和修改。六、友情链接信息管理这一功能是将本网站存在的其他网站的超链接信息进行管理,管理员可以根据用户的实际需要实现对其的添加、删除和修改。七、系统管理这一功能是指管理员可以通过选择退出登录结束后台管理,也可以选择结束程序到前台进行新闻浏览。第二节用户需求分析一、新闻信息管理这一功能是指用户可以作为自媒体发布新闻,对新闻实现添加、修改的功能,用户可以添加图片和视频来增加新闻的可读性。二、系统管理这一功能是指用户可以通过选择退出登录结束后台管理,也可以选择结束程序到前台进行新闻浏览。三、评论管理这一功能是指用户可以通过输入验证码之后对当前浏览的新闻进行评论。四、登录注册管理这一功能是指用户可以注册成为本网站的用户,之后登录可以发布新闻。其中个人信息包括用户名、密码、简介、个性签名和昵称等。五、个人界面这一功能是指用户可以实现对个人信息的维护。比如修改密码等。第三节本章小结由于前期对需求分析的认识不足,很多功能都是边开发系统边增补进去的,造成不断的返工修改管理系统,浪费了大量的时间和精力,造成了不必要的损失。严重的影响了新闻管理系统的开发与设计,使我再次认识到需求分析对于一个管理系统的重要性。第四章系统总体设计第一节系统功能模块划分在新闻管理系统的设计过程中,为了使各个功能模块的实现更加简单明了,将该新闻管理系统划分为以下几个模块,例如:用户信息管理模块、评论信息管理模块、新闻信息管理模块、友情链接信息管理模块、过滤字管理模块和新闻类别管理模块。用户信息管理模块这一模块负责用户信息的管理,它包括对用户的用户名、密码、简介、个性签名等设置与修改操作。这一模块可以添加用户和删除用户,但权限只能是普通用户,也可以对用户的密码和个人信息进行修改。而负责这一模块的为管理员,有且只能有一位管理员,普通用户没有权利对登录信息进行操作。二、新闻信息管理模块这一模块负责新闻信息的发布与管理,即新闻标题、新闻内容、新闻点击量、图片URL、发布时间和新闻类别。新闻的来源主要有两个部分,一方面是系统每天定时爬取搜狐网的新闻新闻,另一方面管理员和普通用户可以作为自媒体发布新闻信息。在该功能中,管理员与普通用户可以发布、修改、删除和查询新闻,而有且只能有一位管理员可以删除所有发布的新闻信息。用户没有权限可以删除不是自己发布的新闻。三、评论信息管理模块这一模块负责评论信息的管理,它包括评论内容、评论时间、评论人IP地址和审核状态进行删除与修改。这一模块可以审查用户的评论信息和删除用户的评论信息,并且可以看到被过滤掉的评论新闻的具体内容。而负责这一模块的为管理员,有且只有一位管理员,其他身份的用户没有权限可以对评论信息进行操作。四、过滤字管理模块这一模块负责过滤字信息的管理,即过滤字内容和优先等级。这一模块中用户可以完成添加、删除和修改过滤字的操作。同样负责该模块的用户只能为管理员,普通用户没有权限对其进行操作。五、新闻类型管理模块这一模块负责新闻类型信息的管理,它包括对新闻类型内容和优先等级进行操作。在这个模块中,用户可以根据从搜狐网爬取的或者用户自己添加的新闻信息动态添加、删除和修改新闻类型。负责这一模块的同样为管理员,普通用户没有权限对其进行操作。六、友情链接管理模块这一模块负责友情链接信息的管理,即友情链接URL和优先等级。在这一模块中,用户可以根据需要动态的添加、删除和修改友情链接的信息。负责这一模块的用户只能为管理员,普通用户同样对其没有权限进行操作。该新闻管理系统中的顶层功能模块之间的联系如图4-1所示,用户可以直接在首页根据自己的喜好进行新闻浏览和新闻搜索,获取今天的热点话题。而在用户通过登录或注册操作并通过系统检测匹配成功后,系统会根据不同的权限把用户分配到用户所能操作的界面上,每一个操作界面的功能都各不相同,他们都由一个个独立的可视化操作界面构成,不同的功能模块的具体设计如图4-1所示:图4-1系统顶层功能模块图一、登录模块用户在首页点击登录按钮进入登录界面,输入用户名和密码,这时系统会自动判断用户名和密码是否为空,如果为空,跳转回登录窗口重新输入用户名和密码,如果不为空,系统查询数据库用户表是否存在该用户,如果不存在,提示用户名不存在并且跳转回登录窗口,如果存在,系统将用户输入的密码自动转为MD5加密格式并且查询数据库中的密码信息是否与之匹配。如果匹配失败,系统将提示密码错误并且跳转回登录界面,如果匹配成功,系统根据用户的权限自动跳转到各自的操作主界面。其流程图如4-2所示。图4-2登录流程图二、用户主操作界面用户主操作界面主要包括新闻信息管理模块,新闻评论模块,用户信息管理,系统管理这四个模块。用户可以作为自媒体进行新闻的发布和修改,其中新闻发布这一操作采用UEditor编辑器,用户可以实现本地单图和多图、本地视频和截图的上传,也可以进行新闻评论。当登录成功并系统判断权限为用户后,用户便面对着的是用户操作主界面,其界面结构图如下图4-3所示。图4-3用户操作界面结构图三、管理员主操作界面用户主操作界面主要包括新闻信息管理模块、友情链接管理模块、新闻类型管理模块、评论管理模块和用户管理模块和过滤字管理模块六个模块。每一个模块都具有增删改查等基本操作。其中新闻的更新实现了定时自动爬取搜狐网的新闻内容,管理员只需要每天在固定时间进行简单的新闻审查就可以完成新闻的维护,大大提升了管理员的工作效率和减轻了管理员的工作量。在登录成功并且系统自动判断权限为管理员以后,用户便面对着的是管理员主操作界面,其界面结构图如下图4-4所示。图4-4管理员操作界面结构图第二节数据库设计一、数据库需求分析根据系统设计和业务逻辑的分析,新闻管理系统需要存放以下信息:(1)新闻信息表:新闻编号,新闻标题,摘要,发布日期,查看次数,回复次数,新闻内容,新闻类型,关键字,发布人,图片地址;(2)用户信息表:用户编号,用户名,密码;(3)新闻类别信息表:编号,新闻类型,排序序号;(4)新闻评论信息表:编号,用户IP地址,评论的新闻ID,评论内容,评论时间,审核类型;(5)友情链接信息表:编号,链接名,链接Url,排序序号;(6)新闻过滤字信息表:编号,过滤词,排序序号;二、数据库概念设计数据库概念设计是通过E-R图将各类实体之间的关系联系起来的,E-R图使用矩形表示实体,椭圆形表示实体的属性,菱形表示实体的之间的关系。根据系统设计和逻辑分析,该新闻管理系统的所包含的实体类有用户信息、友情链接信息、新闻信息、评论信息、过滤字信息和新闻类别信息。具体的系统E-R图如下图4-5所示。图4-5系统E-R图由图4-5可知,本新闻管理系统设置了多个用户,他们都可以自己发布新闻,所以用户与新闻之间的关系是多对多的关系。同样,用户可以对多个新闻进行评论,评论也是没有次数限制,用户与评论之间的关系也是多对多的关系。在评论中,用户发布一些敏感词汇,系统需要对其进行过滤,过滤字信息会有很多条,所以评论信息与过滤字信息之间的关系是一对多的关系。而在新闻中,每一个新闻类型下都包含许多新闻,所以新闻类型与新闻信息之间的关系是一对多的关系。新闻中也包含能跳转到多个网站的链接,它与新闻的关系也是多对多的关系。三、数据库逻辑结构设计MySQL5.7数据库是目前最为流行的开源的数据库,具有成本低,数据库存储容量大等特点。本系统采用MySQL5.7作为后台数据库,数据库命名为xinwen,这个数据库包含6张表:t_blog(新闻信息表),t_blogger(用户信息表),t_blogtype(新闻类别信息表),t_comment(新闻评论信息表),t_link(友情链接信息表),t_blogfilter(新闻过滤字信息表)。根据E-R图的概念设计,数据库逻辑结构设计将确定每张表的主键和字段属性,下面将介绍6张表,每张表的字段属性和主键如表3.1~表3.6所示。(1)t_blog(新闻信息表)。新闻信息表存储的是与每日新闻信息相关的内容,其中字段id为表t_blog的主键。新闻信息表结构如表3.1所示。表3.1t_blog(新闻信息表)字段名数据类型主键否描述IdInt(11)是编号TitleVarchar(200)否新闻标题SummaryVarchar(1000)否摘要releaseDateDatetime(0)否发布日期clickHitInt(11)否查看次数replyHitInt(11)否回复次数ContentText(0)否新闻内容typeIdInt(11)否新闻类型keywordVarchar(200)否关键字UseridInt(11)否发布人img_urlsVarchar(1000)否图片地址(2)t_blogger(用户信息表)。用户信息表存储的是管理员和用户的基本信息和用MD5加密的登录密码,其中id为表t_blogger的主键。用户信息表结构如表3.2所示。表3.2t_blogger(用户信息表)字段名数据类型主键否描述IdInt(11)是编号usernameVarchar(50)否用户名PasswordVarchar(100)否密码ProfileText(0)否个人简介nicknameVarchar(50)否昵称SignVarchar(100)否个性签名imageNameVarchar(100)否头像(3)t_blogtype(新闻类别信息表)。新闻类别信息表存储的是新闻的各种分类,其中id为表t_blogtype的主键。新闻类别信息表结构如表3.3所示。表3.3t_blogtype(新闻类别信息表)字段名数据类型主键否描述IdInt(11)是编号typeNameVarchar(30)否新闻类型orderNoInt(11)否排序序号(4)t_comment(新闻评论信息表)。新闻评论信息表存储的是用户对新闻的评论信息,比如用户IP地址,评论内容等。其中id为表t_comment的主键。新闻评论信息表结构如表3.4所示。表3.4t_comment(新闻评论信息表)字段名数据类型主键否描述IdInt(11)是编号userIpVarchar(50)否用户ip地址blogIdInt(11)否评论的新闻idContentVarchar(1000)否评论内容commentDateDatetime(0)否评论时间StateInt(11)否审核类型(5)t_link(友情链接信息表)。友情链接信息表存储的是新闻首页直接链接到其他网页的信息,比如过滤词和排序序号。其中id为表t_link的主键。新闻评论信息表结构如表3.5所示。表3.5t_link(友情链接信息)字段名数据类型主键否描述IdInt(11)是编号filterNameVarchar(30)否过滤词orderNoInt(11)否排序序号(6)t_blogfilter(新闻过滤字信息表)。新闻过滤字信息表存储的用户对新闻评论时的敏感词汇。其中id为表t_link的主键。新闻过滤字信息表结构如表3.6所示。表3.6t_blogfilter(新闻过滤字信息表)字段名数据类型主键否描述IdInt(11)是编号filterNameVarchar(30)否过滤词orderNoInt(11)否排序序号第三节Java包各功能实体设计本系统是基于Spring+SpringleMVC+MyBatis轻量级框架编写的新闻管理系统,本系统分为9个Java包,下面对这9个进行简单阐述。com.qinb.controller包:该包主要负责的是本系统的控制层,负责具体模块的业务流程控制,需要调用service逻辑设计层的接口来控制业务流程。controller层通过接收前端HTML5或者App传过来的参数进行业务操作,再将处理结果返回到前端,同时向后端发送请求。com.qinb.entity包:这个包是本系统的实体类,类的属性与数据库各表的字段相对应,还设置了get()和set()方法,构造器,并且还重写了toString方法。com.qinb.dao包:这个包是本系统是持久层,主要负责数据的访问和操作,它被上层的业务层所调用,本层中的具体实现由MyBatis,它在本系统mappers文件夹下逆向工程生成的后缀名为.xml的配置文件进行实现。com.qinb.service包:这个包是是本系统的业务层,主要负责存放存放业务逻辑处理,并且会调用持久层的一些相关方法完成增删改查的操作。com.qinb.lucene包:这个包是负责本系统的全文搜索功能,采用了lucene搜索引擎,该包包括对添加、删除、更新和查询索引文件的逻辑实现。com.qinb.util包:这个包是负责本系统的工具类,里面包括为系统编程提供方便的一些接口,比如日期格式转字符串类型的接口、爬取新闻网站的接口和分页工具类等。com.qinb.test包:该包主要负责新闻管理系统开发时的一些测试类。com.qinb.spider包:这个包是负责新闻网站爬取的逻辑实现,主要包括爬取新闻内容的接口和爬取新闻的图片并将其保存在本地的接口。com.qinb.realm包:该包主要负责Shiro安全框架自定义的工具类,能够验证用户是否能够进入后台进行增删改查的操作,满足本系统开发的实际需要。第五章系统详细设计与实现第一节系统开发与运行环境系统开发与运行环境具体如下:系统开发平台:IntelliJIDEA2017.3.1x64系统开发语言:Java数据库管理系统:MySQL5.7操作系统:Windows10版本运行环境:jdk1.8分辨率:最佳效果1024*768像素第二节用户登录界面的设计与实现系统访问的用户分为游客、普通用户和管理员,游客可以访问门户网站进行新闻浏览和新闻搜索。而注册过并且成功登录的用户可以进入后台作为自媒体发布新闻和修改密码。在该系统中管理员只有一个,管理员在进行身份验证成功后可以在后台对新闻信息、用户信息、评论信息、评论信息和友情链接信息等进行管理。系统在首页提供了注册和登录按钮,用户点击注册后就会进入register.jsp注册的界面,用户根据系统的提示进行注册的相关操作,其中用户的用户名是不可更改的,同时用户注册密码时密码的格式必须是以字母开头,且以字母、数字、下划线随意组合,如果不是的话,系统会弹出警告并提示重新输入,在输入密码和再次输入密码进行验证时,系统会调用document中的getElementById()方法获取两次password和password1中的数据,根据两次输入的信息进行比对,如果两次密码不一致,会弹出红色提示词“两次密码不一致”,并获取submit按钮数据用Submitdisabled属性使注册按钮失效,直至两次密码一致,才会弹出绿色提示词“两次密码一致”,注册按钮有效。账户注册界面如图5-1所示。图5-1用户注册界面图具体代码如下所示:functionvalidate(){varpw1=document.getElementById("password").value;varpw2=document.getElementById("password1").value;if(pw1==pw2){document.getElementById("Tips").innerHTML="<fontcolor='green'>两次密码相同</font>";document.getElementById("submit").disabled=false;}else{document.getElementById("Tips").innerHTML="<fontcolor='red'>两次密码不相同</font>";document.getElementById("submit").disabled=true;}}用户点击注册按钮以后,前台使用POST请求发送一个form表单,封装着用户名和密码的form表单里发送到与之对应的controller层的add()方法中,cotroller层又会调用与之匹配的service层的getByUserName()方法,随后service层又会调用与之对应的dao层的getByUserName()方法,由这个方法把数据库中用户的信息进行比对,返回前端调用JavaScript编写的checkout()方法。如果用户名为空,跳出提示用户名不能为空。以上就是完成用户注册基本逻辑。用户注册成功后跳转到login.jsp登录界面,该系统采用Apache

Shiro安全框架进行对系统的用户身份进行认证,并且自定义了Realm以满足本系统的实际需要,用户输入的用户名和密码提交系统后,前台会发送一个POST请求,封装着用户名和密码的form表单被系统发送到controller层所对应的login接口中,系统使用Shiro框架中的SecurityUtils.getSubject()方法获取当前用户登录的主体,因为在数据库中存储的密码是MD5加密过后的字符串序列,所以使用了com.qinb.util包中的CryptographyUtil.md5()方法把前台获取的密码进行转移,随后跳转到com.qinb.releam包中重写后的doGetAuthenticationInfo()接口进行身份验证,其中会调用service层的getByUserName()方法,随后dao层又会调用与之对应的getByUserName()方法获取数据库中的用户名和密码,最后进行匹配对比,如果验证成功,系统会根据用户权限判断并进入各自的系统,这个在第六节会详细解释。如果验证失败,系统会把异常传回前台并重定向回login.jsp网页,并提示“用户名或密码错误”,以上就是用户登录的全部逻辑。系统账户登录界面如图5-2所示。图5-2用户登录界面图用户在成功登录后,系统会在界面的右上角显示用户的用户名,显示用户名的样式如图5-3所示:图5-2用户登录成功界面图在applicationContext.xml配置了只有系统匹配管理员admin的账号和密码,才能访问在Controller/admin和webapp/admin的文件。<propertyname="filterChainDefinitions"><value>/login=anon/admin/**=authc</value>登录具体代码如下所示:protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{ StringuserName=(String)token.getPrincipal();//获取身份 Bloggerblogger=bloggerService.getByUserName(userName);//通过用户获取实体 if(blogger!=null){ //匹配到了,则不为空 SecurityUtils.getSubject().getSession().setAttribute("currentUser",blogger);//把当前用户信息,存到session中,会浪费一点内存 AuthenticationInfoauthcInfo=newSimpleAuthenticationInfo(blogger.getUserName(),blogger.getPassword(),"user"); returnauthcInfo; }else{ returnnull; } }第三节新闻首页与栏目模块当任何人访问本新闻网站时,首先映入眼帘的就是新闻主页,新闻主页不仅是一个新闻网站的门面,更是一个新闻网站的灵魂。一个界面大方简洁的新闻主页可以带给用户不一样的体验和观感。本新闻管理系统的主页使用了Bootstrap框架,它主要分为天气预报模块、今日话题模块、最新新闻模块、友情链接模块和按新闻类别和发布时间分类模块五大模块,下面将逐一介绍各个模块。该管理系统提供人性化的天气预报模块,使用户在浏览本新闻首页时,可以根据用户的IP地址动态查看未来三天的天气情况,也可以切换城市,了解当地的天气情况,如果想了解未来更多天的天气情况,直接点击进入天气网页查看更多,使用户能够及时的根据天气情况合理添加衣物,大大地提升用户的使用体验。本系统使用超链接获取2345网站的天气情况。天气预报效果图如图5-4所示。图5-4天气预报效果图本新闻系统设计天气预报不受跳转网页的影响,每个新闻网页都能动态显示当地天气情况,为了避免重复的工作量,本系统将天气情况设置成一个全局样式,存放在webapp/foreground/common文件下,具体代码实现如下:<divclass="col-md-8"><iframestyle="float:right;"allowtransparency="true"frameborder="0"width="565"height="98"scrolling="no"src="///plugin/widget/index.htm?s=2&z=1&t=1&v=0&d=3&bd=0&k=000000&f=<f=009944&htf=cc0000&q=1&e=1&a=1&c=54511&w=565&h=98"></iframe></div>今日话题模块同样是本系统的一个亮点,每天的热点话题采用图片轮播的方式在前端界面进行展示,总共有三张图片,每5秒钟进行一次切换,每一个图片底部都有新闻的标题。今日话题模块如图5-5所示。图5-5天气预报效果图图片轮播的实现的关键代码具体如下:</div> <!--指示符--> <ulclass="carousel-indicators"> <lidata-target="#demo"data-slide-to="0"class="active"></li> <lidata-target="#demo"data-slide-to="1"></li> <lidata-target="#demo"data-slide-to="2"></li> </ul><!--轮播图片--> <divclass="carousel-inner"> <divclass="carousel-itemactive"><ahref="http://localhost:8086/blog/articles/70.html"><imgsrc="${ctx}/static/userImages/t1.jpg"></a> <divclass="carousel-caption"> <h4>欧超暂停!曼城、曼联、利物浦、切尔西、阿森纳、热刺已退出欧超</h4> </div> </div> <divclass="carousel-item"> <imgsrc="${ctx}/static/userImages/t2.jpg"> <divclass="carousel-caption"> <h4>1个小时8款新品的苹果发布会,新iPhone、新iPad、新iMac都来了</h4> </div> </div>当然,作为新闻首页其中必须要展示的功能为新闻展示,本系统在新闻新闻模块中的新闻信息展示如图5-6所示,每条新闻的标题、摘要、发布时间、发布人、阅读数量和评论量都直观的展示在新闻主页上,本系统还将分页技术加入到了新闻列表当中,一页可以最多显示10条新闻,基本能满足用户的需求,用户可以根据自己的喜好浏览新闻。由于本系统每天定时爬取搜狐网的新闻,如果采用在静态维护新闻信息,不光加重了系统的承载能力,也增加了管理员维护系统的工作量。所以本系统采用动态获取数据库的信息并且能实时更新新闻信息,大大的提升了管理员的工作效率,为用户提供更好的浏览体验。图5-6最新新闻效果图新闻列表的展示的具体逻辑是在controller层的index接口中,使用到SpringMVC中的ModelAndView类,其基本逻辑是把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中。index接口先接收页数page,如果page为空,那么就使页数page默认为1,构造一个哈希表(HashMap),将起始页数、总页数、新闻类型和发布时间存储在表内,之后controller层会调用service层中list()方法,service层又会调用dao层与之对应的list()方法,由这个方法经过.xml文件的SQL语句解耦,动态获取到数据库中的新闻标题、发布时间、阅读数量和评论数量,并已发布时间作为降序进行排列。最后将获取到的blogList放在ModelAndView对象中,通过for循环把新闻列表打印出来,返回新闻主页maintemp.jsp进行新闻展示。具体实现新闻展示代码具体如下:publicModelAndViewindex(@RequestParam(value="page",required=false)Stringpage,@RequestParam(value="typeId",required=false)StringtypeId,@RequestParam(value="releaseDateStr",required=false)StringreleaseDateStr,HttpServletRequestrequest)throwsException{ ModelAndViewmav=newModelAndView(); //如果是新闻的时候默认page为1 if(StringUtil.isEmpty(page)){ page="1"; } //pageSize=10 PageBeanpageBean=newPageBean(Integer.parseInt(page),10); Map<String,Object>map=newHashMap<String,Object>(); map.put("start",pageBean.getStart()); map.put("size",pageBean.getPageSize()); map.put("typeId",typeId); map.put("releaseDateStr",releaseDateStr); List<Blog>blogList=blogService.list(map);mav.addObject("blogList",blogList);mav.setViewName("mainTemp");按新闻类别和发布时间分类模块使用户可以根据自己的喜好查看自己感兴趣的新闻类型,也可以根据发布日期的时间轴具体了解当月发生的重大新闻,这个模块同样也加入了分页技术,一页可以最多显示10条新闻。按新闻类别分类效果如图5-7所示,按发布日期分类效果如图5-8所示。图5-7按新闻分类效果图图5-8按发布日期分类效果图因为按新闻分类和按发布日期分类的逻辑大致相同,故只详细介绍按新闻分类的具体逻辑,本系统利用实例化applicationContext对象获取新闻分类(blogType)的注入bean(blogTypeService),该对象的好处就是生存周期是整个应用程序的生命期,也就是说如果你的服务器不关闭、重启或者清除application里的数据。那么,存在这里面的东西就永久保存。之后系统会调用service层的countList()方法,service层又会调用dao层与之对应的countList()方法,使用这个方法对数据库中的新闻类别名称和该分类下的新闻数量进行获取,并将其封装进一个List集合中即(List<BlogType>),再通过applicationContext对象将获取到的List集合命名为blogCountList,前端通过foreach循环把blogCountList对象的数据进行遍历。下面是applicationcontext获取List集合的核心代码。BlogTypeServiceblogTypeService=(BlogTypeService)applicationContext.getBean("blogTypeService");List<BlogType>blogTypeCountList=blogTypeService.countList();//查询新闻类型以及新闻的数量application.setAttribute("blogTypeCountList",blogTypeCountList);友情链接模块可以提升网站流量通过互相推荐,从而使网站的权重提升,提高排名,增加流量。完善用户体验,通常来说,友情链接交换都是介于同行之间,这利于用户直接通过网站访问另一个同行的站点,以便于更直接简单地了解全面的信息。该模块的实现效果如图5-9所示。图5-9友情链接效果图该友情链接实现的逻辑大致是applicationContext对象获取service层的友情链接接口,即(LinkService),之后系统会调用service层的list方法,service层又会调用dao层与之对应的list()方法,使用这个方法对数据库中的友情链接表即(t_link)的所有信息进行获取,以优先等级进行升序,并将其封装进一个List集合中即(List<Link>),再通过applicationContext对象将获取到的List集合命名为linkList,前端通过foreach循环把linkList对象的数据进行遍历。下面是applicationcontext实现获取List集合的核心代码。LinkServicelinkService=(LinkService)applicationContext.getBean("linkService");List<Link>linkList=linkService.list(null);//查询所有的友情链接信息application.setAttribute("linkList",linkList);前端循环代码:<c:forEachvar="link"items="${linkList}"><li><span><ahref="${link.linkUrl}"target="_blank">${link.linkName}</a></span></li></c:forEach>第四节新闻搜索该新闻管理系统的首页提供了新闻搜索的功能,用户可以通过搜索主题,关键字等信息查询想要的寻找的新闻,系统使用lucene作为全文检索,并使用提供的接口进行全文搜索,并将搜索的结果返回前端界面,用户可以浏览自己所需要的搜索结果。该系统添加Lucene检索文件的途径是当用户调用添加新闻的接口进行添加新闻的同时,调用lucene接口将新闻信息转化为lucene的索引文件,并将索引文件保存在D://lucene中。例如,用户在搜索框中搜索“联”,系统搜索“联”并进行信息过滤,结果为一条记录,其中搜索返回的内容包括新闻标题、新闻发布时间和新闻摘要,用户点击新闻标题即可进入查询新闻。匹配成功的部分进行了高亮,标为红色的处理。新闻搜索结果列表如下图5-10所示。图5-10新闻搜索结果界面图新闻搜索的大致逻辑是用户在搜索框中搜索关键词,点击搜索按钮后,前端会把关键词作为form表单以POST形式进行发送,在controller层把前端传来的form表单转为字符串Stringq传到系统中,系统调用controller层所对应类中的searchBlog()方法,其中searchBlog()方法是生成检索器IndexSearcher在D://lecene文件夹下搜索存储的索引文件。因为检索时大部分关键词都是中文,所以这里使用SmartChineseAnalvzer中文解析器进行中文转译。构造QueryParser对象parser和parser2扫描用户输入的字符串q,系统采用多条件搜索,使用BooleanQuery中的booleanQuery.add()方法对新闻信息中的新闻标题和新闻内容进行与或搜索,查看是否匹配字符串q,考虑到本系统是小型新闻网站,故用TopDocs类返回搜索的前100条数据,将搜索的新闻信息以结果集的方式封装在List集合中即(List<Blog>),controller层接收集合后将其存入实例化ModelAndView的对象中,以视图的形式的依次排列在前端界面,如果没有匹配到结果,前端就会弹出“未查询到结果,请换个关键字试试看!”,如果匹配到数据,这就搜索出了用户所需要的新闻。最后对搜索结果进行了优化,把匹配到的关键词部分进行了标红,高亮处理,进一步提升用户的使用体验,大大提升了用户搜索新闻的效率。新闻搜索的核心代码具体如下:publicList<Blog>searchBlog(Stringq)throwsException{

dir=FSDirectory.open(Paths.get("D://lucene"));//打开D盘的lucene文件

IndexReaderreader=DirectoryReader.open(dir);

IndexSearcheris=newIndexSearcher(reader);

BooleanQuery.BuilderbooleanQuery=newBooleanQuery.Builder();

SmartChineseAnalyzeranalyzer=newSmartChineseAnalyzer();//中文解析器

QueryParserparser=newQueryParser("title",analyzer);

Queryquery=parser.parse(q);

QueryParserparser2=newQueryParser("content",analyzer);

Queryquery2=parser2.parse(q);

booleanQuery.add(query,BooleanClause.Occur.SHOULD);

booleanQuery.add(query2,BooleanClause.Occur.SHOULD);

TopDocshits=is.search(booleanQuery.build(),100);

QueryScorerscorer=newQueryScorer(query);

Fragmenterfragmenter=newSimpleSpanFragmenter(scorer);

SimpleHTMLFormattersimpleHTMLFormatter=newSimpleHTMLFormatter("<b><fontcolor='red'>","</font></b>");

Highlighterhighlighter=newHighlighter(simpleHTMLFormatter,scorer);

highlighter.setTextFragmenter(fragmenter);

blogList.add(blog);

}

returnblogList;

}第五节新闻浏览与新闻爬取新闻浏览是新闻管理系统的重要一环,好的浏览方式会直接影响用户的使用体验。该新闻管理系统将每条新闻通过文字或图片的形式展示给观众。将新闻标题、新闻内容、新闻类型、阅读量、评论数量、关键字等信息以友好的方式进行呈现。用户还可以将自己喜欢的新闻进行转发分享,同时新闻信息的下方还提供上一页,下一页文章的入口,用户可以通过自己的喜好进行浏览。新闻浏览效果图如下图5-11所示。图5-11新闻浏览界面图下面对新闻详细界面的逻辑进行描述:用户首页点击新闻进入详细页了解信息时,前端会发送新闻信息表的的主键id到与其对应的controller层中类的findById()方法中,controller层会去调用与之对应的service层中的findById()方法。最后再由service层去调用与其相对应的dao层中的findById()方法,由这条方法把数据库中对应id的新闻信息进行获取,实例化ModelAndView对象将获取的新闻信息放入模型中,并以视图的方式返回前端。用户在点击新闻同时,也会增加新闻的阅读量,系统会调用setClickHit()方法让点击量自增1,并调用其对应的controller层中类的update()方法,随后controller层会去调用与之对应的service层中的update()方法。最后再由service层去调用与其相对应的dao层中的update()方法,这个方法将数据库中的点击量实现自增1的操作。下面是controller层中实现功能关键代码:Blogblog=blogService.findById(id); mav.addObject("blog",blog);blog.setClickHit(blog.getClickHit()+1); blogService.update(blog);评论功能也是用户在新闻浏览过程中必不可少的一项功能,用户在输入完想要评论的内容以后,为了防止脚本恶意刷评论,还要进行验证码进行验证,验证通过后,还需要管理员在后台进行审查,审查通过才会显示评论信息。如果用户在评论的过程中使用了敏感性词汇,系统会自动把过敏性词汇进行过滤,由管理员在后台对用户的评论进行删除或给予警告。本系统的新闻评论默认显示10条,如果评论信息多于10条的话,会进行折叠。评论展示效果如图5-12所示。图5-12评论界面图新闻评论的实现逻辑具体如下,用户在点击发布评论的按钮之后会在前端进行一个JavaScript语句的判断,如果没有填写评论内容或验证码,系统会直接弹出警告并提示填写相关信息,如果系统检测验证码填写正确以后,前端会以JSON数据类型和以POST请求的方式发送一个包含评论内容的表单到controller层的add()方法,因为新闻评论也会增加新闻信息中的评论量,所以系统调用controller层的update()方法实现新闻评论数量自增1,controller层又会调用service层与之对应的add(),update()两个方法,service层又会调用dao层相对应的方法,这些方式会调用数据库进行评论内容增加和新闻评论量自增1的操作。这里值得一提的是,本系统在遍历评论信息时,又会调用service层关于读取评论过滤字的对应的list()方法,service层调用dao层与之对应的list()方法,将数据库中的过滤字封装在一个List集合中并传回controller层,评论内容和过滤字信息进行if条件句判断,如果发现信息中有敏感词汇,系统将自动把敏感词汇替换为“*”。评论实现的关键代码具体如下。StringuserIp=request.getRemoteAddr();//获取用户IP comment.setUserIp(userIp); //设置获取到的用户IP,设置审核状态为1 if(comment.getId()==null){ comment.setState(1); resultTotal=commentService.add(comment); //新闻的回复次数加1 Blogblog=blogService.findById(comment.getBlog().getId()); blog.setReplyHit(blog.getReplyHit()+1); blogService.update(blog);屏蔽字实现核心代码如下:for(Commentcomment:commentList){ for(BlogFilterblogFilter:blogFilters){ if(comment.getContent().contains(blogFilter.getFilterName())){ comment.setContent(comment.getContent().replace(blogFilter.getFilterName(),"***")); }}新闻的来源途径主要有两条,一方面是用户通过login.jsp登录后系统审核其身份成功后,跳转到用户控制的后台,用户通过百度的UEditor编辑器根据自己的需要发布相关新闻信息,这部分将在第六节后台管理模块详细介绍。另一方面,管理员通过定时爬取搜狐网站的新闻,并将其新闻信息存到本地数据库的操作实现新闻动态增加。本系统使用了Jsoup技术来爬取搜狐网的新闻内容和图片,Jsoup需要在pom.xml文件中导入依赖才可以使用,使用的是1.8.3版本。Jsoup是一个基于Java的HTML解析器,它可以从一个URL地址中解析HTML。本系统爬取的新闻网站网址为/?spm=smpc.fb-sports-home.top-nav.2.1619359346396dsGuRNS并将它存储在spider.peoperties配置文件中。因为Jsoup爬取技术本质是使用CSS选择器获取数据,其无论是爬取新闻内容还是新闻标题等都是大同小异,所以下面我将举爬取新闻标题的例子来大致说明新闻爬取的逻辑,我设置的是每天早点8点35定时爬取搜狐网,系统到达时间后将自动调用service层scratch()方法爬取搜狐网的各个新闻分类网页,搜狐网的新闻类别名字与本系统的新闻类别名称一致,在搜狐网选择样式为<h1>的字符信息获取存到新闻标题的实例化对象中,即(blog.title)。系统将新闻类别名称把新闻标题封装到List集合中,之后随之调用service层的save()方法,service层又调用dao层与之对应的add()方法,根据这个方法把新闻标题存放到本地数据库中,这就实现了新闻信息的动态爬取。新闻爬取的核心代码如下所示。publicList<Blog>parseMyHtml(SpiderTool.ConnectionTypeconnectionType,Elementelement){ElementstypeElements=element.select(".main-modB.main-left");if(CollectionUtils.isNotEmpty(typeElements)){for(inti=0;i<typeElements.size();i++){StringblogType=typeElements.get(i).select(".titleLB.tta").size()>0?typeElements.get(i).select(".titleLB.tta").get(0).text():"";ElementsaHrefs=typeElements.get(i).select(".list16ullia");if(CollectionUtils.isNotEmpty(aHrefs)){for(intj=0;j<aHrefs.size();j++){Stringtitle=aHrefs.get(j).text();//标题Stringurl=aHrefs.get(j).attr("href");//内容链接Blogblog;if(connectionType.equals(SpiderTool.ConnectionType.HTTP)){blog=scratchHttpContent(url);}else{blog=scratchHttpsContent(url);}if(blog!=null){blog.setTitle(title);//判断新闻类型,入库BlogTypeblogType1=newBlogType();blogType1.setTypeName(blogType);//暂时取名字,在task中,通过名字获取idblog.setBlogType(blogType1);blogList.add(blog);}}}System.out.println("blogType:"+blogType);}returnblogList;}returnnull;}第六节后台管理模块后台管理模块相较于前端模块较于复杂,它是本新闻管理系统必不少的组成部分,其前端的总体布局采用easyui框架。用户通过login.jsp登录后端管理模块,登录的具体流程在第二节时就已详细阐述,这里就不过多赘叙。该系统在登录时将用户非为两类,普通用户和管理员,其中普通用户可以进入自己的管理界面只能对新闻信息进行添加、删除和修改,而管理员进入后台后,主要是对新闻信息、用户信息、新闻类别、新闻评论、过滤字和友情链接进行管理。管理员后台管理界面如图5-13所示,用户管理界面如图5-14所示。图5-13管理员后台管理界面图图5-14用户管理界面图在新闻信息管理模块,用户和管理员都可以对新闻信息进行添加、删除和修改的操作,唯一不同的地方就是用户只可以对自己发布的新闻进行操作,而管理员是对所有的新闻进行管理。由于两者逻辑相同,故只描述管理员对新闻信息操作的逻辑。管理员的界面设置了可以对全部新闻信息进行一次预览,该模块同样加入了分页技术,设置一页最多显示10条信息。如果管理员想查看新闻的具体信息,可以直接点击标题进行详细查看,如果在预览过程中发现原来发布的新闻有些遗漏的地方,管理员可以选中该新闻的编号,点击修改按钮,系统会跳转到修改新闻信息的界面,本系统的修改操作使用百度的UEditor编辑器完成,极大的提高了管理员的效率,随后根据系统的提示完成对其修改的操作。管理员管理新闻信息界面如图5-15所示。图5-15新闻管理界面图下面将管理员修改新闻信息的大致逻辑进行介绍,用户选择新闻编号(即blog.id)并点击修改按钮以后,前端会弹出UEditor编辑器,用户可以根据自己的实际需要修改新闻信息修改完成后提交,前端将新闻编号和修改的新闻内容以JSON数据格式封装并发送一个POST请求到contrlloer层的save()方法,save()进行一个if判断,如果如果新闻编号不为空,controller层将调用service层与之对应的update()方法,service层方法随后会调用dao层的update()方法,该方法会对数据库的新闻信息进行更新,如果更新成功,返回一个更新成功的提示。添加的逻辑也是大致与之类似,不同的是,前端只提交了添加的新闻信息到controller层的save()方法中,save()判断新闻编号为空,controller层会调用service层的add()方法,之后又调用了dao层的add()方法,这个方法会操作数据库完成增加新闻信息。随后还使用addIndex()方法更新了新闻的检索信息。修改新闻的核心代码具体如下:if(blog.getId()==null){ blog.setUserid(blogger.getId()); resultTotal=blogService.add(blog); blogIndex.addIndex(blog);}else{ blog.setUserid(blogger.getId()); resultTotal=blogService.update(blog); blogIndex.updateIndex(blog); } JSONObjectresult=newJSONObject(); if(resultTotal>0){ result.put("success",true); }else{ result.put("success",false); }在新闻类别管理模块中,管理员在成功登录后可以对新闻类别进行添加、删除和修改的操作。进入后台管理的新闻类别管理模块,如图5-16所示,该模块列出现有的新闻类型信息,新闻类别,优先显示等级。由于该系统是根据新闻类别名称进行新闻爬取,如果随意改变新闻类别名称,就会导致爬取的新闻信息入库失败。图5-16新闻类别管理界面图当然,由于搜狐网的一些分类网站通过XHR请求获得数据,即动态渲染的方式,而本系统采用的Jsoup技术和现有的框架只能尝试获取request请求的数据,即静态渲染方式。所以会出现爬取新闻失败的现象发生,导致一些新闻类别下的新闻为空的结果,管理员在后台管理模块中可以使用逐条删除或批量删除的方式删除新闻为空的新闻分类,提升用户使用系统的体验。下面就删除新闻分类模块的大致逻辑进行介绍,管理员选中需要删除的新闻类别编号,点击删除按钮,前端将前端将新闻类别编号以JSON数据格式封装并发送一个POST请求到contrlloer层的delete()方法,在此层中,获取的新闻类别编号会保存在数组中,并对数组中的元素进行遍历和if语句条件判断,如果该编号下有新闻信息,系统就会强制退出,并提示该类别下有新闻,如果没有新闻,则会调用与之对应的service层的delete()方法,service层随即又会调用dao层的delete()方法,用此方法对数据库中的新闻类别信息进行删除。删除成功的话,会给前端返回成功的信息。在controller层的delete()方法核心代码具体如下:String[]idsStr=ids.split(","); JSONObjectresult=newJSONObject(); for(inti=0;i<idsStr.length;i++){ if(blogService.getBlogByTypeId(Integer.parseInt(idsStr[i]))>0){ result.put("exist","新闻类型下有新闻,不能删除!"); }else{ blogTypeService.delete(Integer.parseInt(idsStr[i])); } } result.put("success",true); ResponseUtil.write(response,result);友情链接管理模块和过滤字管理模块,管理员在成功登录后可以实现对这两个模块进行添加、删除和修改的操作。进入友情链接后台管理模块,系统加载友情链接列表,其中有友情链接编号,友情链接名称,友情链接URL,优先显示等级,友情链接后台管理如图5-17所示。进入过滤字后台管理模块,系统加载新闻过滤字列表,其中有过滤字编号,过滤字名称,优先显示等级,过滤字后台管理如图5-18所示。图5-17友情链接后台管理界面图图5-18过滤字管理界面图两个模块在数据库中的存储字段基本一致,添加、删除和修改的逻辑也大致相同,故这里只详细介绍友情链接删除的大致逻辑。管理员点就删除按钮后,前端后发送一个POST请求(其中包括需要删除的编号集合以JSON格式进行封装)到与之对应的controller层的delete()方法,在controller层把编号集存在数组中,controller又会调用service层的delete()方法,service层又会找到dao层与之对应的delete()方法,使用这个方法根据友情链接编号查找数据库的友情链接信息,并进行删除操作,删除成功后,系统会给前端发送一个JSON格式的成功的提示。controller层删除友情链接的delete()方法核心代码具体如下:String[]idsStr=ids.split(","); JSONObjectresult=newJSONObject(); for(inti=0;i<idsStr.length;i++){//遍历存在数组中的编号,进行逐一删除的操作 linkService.delete(Integer.parseInt(idsStr[i])); } result.put("success",true); ResponseUtil.write(response,result);评论管理模块是管理员在后台维护的又一重要模块,该模块中管理员可以对用户的评论进行审查和删除基本操作。系统进入评论管理模块后,系统加载评论信息列表,其中有评论编号,新闻标题,用户IP,评论内容,评论时间和审核状态,其中审核通过的评论信息可以在新闻中显示。评论信息后台管理如图5-19所示。图5-19评论信息管理界面图其中在数据库的评论表中有一个字段是审查状态,0代表未审核;1代表审核通过;2代表审核不通过。下面将举例介绍评论审核通过的逻辑,用户提交评论信息后,这时的审核状态是未审核,管理员进入后台评论审核模块后,选中未审核的评论编号,点击审核按钮后前端后发送一个POST请求(其中包括需要审核的编号集合以JSON格式进行封装)到与之对应的controller层的review()方法,在control

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论