基于java+SSM+Oracle的微博系统设计与实现(毕业论文+程序源码)
大家好,今天给大家介绍基于java+SSM+Oracle的微博系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦
文章目录:
1、项目简介
- 自上个世纪末起。互联网技术得到飞速发展,时至今日信息时代的到来,短短十几年,互联网就让我们见识到了它的魅力,在我们的生活中,网络无处不在,而信息的爆炸性发展也拓展了人们获取信息的方式。
- 微博作为一种信息交流和分享的平台,在这个信息时代显得特别重要,人们可以随意浏览和发布信息,获取最新最热的咨询,而它的及时性和高互动性也使得它深受人们的喜爱,随着微博在网民中的火热,网络红人,网络热词等微博效应逐渐形成,该微博系统采用B/S架构,实现微博原有基本功能的基础上,更是在以往微博系统中添加了问题悬赏,采纳积分等新功能,提高用户体验,在后台管理中实现对微博和用户的综合管理,在实现技术方面,页面使用JSP,javaScript,ajax等技术提高系统页面与用户之间的交互性,后台使用java语言,服务器采用Tomcat服务器,使用SSM框架实现具体功能,在数据库方面使用Oracle数据库保存数据。
2、资源详情
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:27942个字81页
包含内容:全套源码+配整论文
开题报告、论文答辩、课题报告等ppt模板推荐下载方式:
3、关键词
微博;B/S架构;java;SSM框架;Oracle;4、毕设简介
提示:以下为毕业论文的简略介绍,项目完整源码及完整毕业论文下载地址见文末。
1绪论
2010年11月,新浪微博推出群组功能,这个功能不但可以与好友实时联系,又可以随时发布最新信息,2012年添加新功能“悄悄关注”,在用户关注后不通知被关注用户,也不显示给被关注用户,2013年,微博推出包括iPhone和Android的移动客户端,新增“密友”功能,同年10月份新浪微博“粉丝服务平台”上线,粉丝服务平台帮助认证用户为订阅自己的用户提供精彩内容和互动服务,自此微博由“营销”向“营销+服务”转型!
而新浪微博依旧延续这自己的名人效应,一个普通账号,在没有粉丝关注的情况下,发布的微博却很难被他人看到,如果需要在微博中求助,没有“名人大V”的帮助,很难被别人所注意到。想要在微博中寻求帮助,就需要微博提供更多的服务。而本系统通过使用积分悬赏功能使得用户可以通过积分悬赏自己的问题,来让更多的用户回答自己的问题,得到更多人的帮助。
2相关技术介绍
2.1 架构概述
B/S架构(Browser/Server,浏览器/服务器模式):是一种通过将浏览器作为客户端的网络结构模式,利用已经逐步成熟的web浏览器技术,结合浏览器的多种功能,使用浏览器来作为早先C/S(Client/Serve)架构下复杂的客户端,使用C/S架构使得用户的客户端得到统一,将软件系统的核心功能集中在服务器端,系统的升级和维护更加简单,开发人员只需要管理服务器就可以做到对如软件系统的更新和维护,B/S架构所带来的众多优点使得它成为将来信息化发展的主流方向。
MVC模式:即模型(Model),视图(View),控制器(Controller)是一种软件开发的设计模式,Model主要负责分离出来的业务逻辑的数据交互,View主要负责数据的提交和展示,Controller主要负责获取请求和请求的转发。
SSM框架(SpringMVC+Spring+Mybatis):由这三个开源框架组成的web项目的框架,是标准的MVC模式,spring MVC负责请求的转发和视图管理,spring实现业务对象管理和事务控制,mybatis作为持久化引擎,相对于早先流行的SSH(Struts+Spring+Hibernate)框架来说,SSM作为轻量级框架更适合开发中小型项目。
2.2 关键技术简介
前端技术:
1.JSP(Java Server Pages):嵌入了java代码的html页面,本质是一个servlet,它实现了在htmld的语法中扩展java代码,使用<% %>格式。
2.JavaScript:是一种弱类型的脚本语言,由ECMAScript描述JavaScript的基本对象和语法,文档对象模型(DOM),浏览器对象模型(BOM)三部分组成。
3.Ajax(Asynchronous Javascript And XML):异步的JavaScript和XML,实现前后台之间的异步交互,在不需要重新加载整个页面的前提下对页面上的部分内容做局部刷新。
后台技术:
1.java:一种面向对象的编程语言,主要特性包括,(1)简单性:抛弃了C++中复杂的语法和指针多继承等特征,开发人员不需要关注底层优化,只需要关注业务逻辑就行,(2)面向对象性,对程序员而言,只需要注意对应的数据和处理数据的方法,不用严格按照过程的方式来编写代码,因为java语言是面对对象的,因此也拥有面向对象的三大特征,继承、封装和多态,(3)跨平台性,java语言的跨平台性也就是JVM(java虚拟机)的跨平台性。Java文件编译后不会直接生成机器直接运行的二进制文件,而是编译成class文件,JVM会将编译的class文件根据不同操作系统下的JVM来生成对应系统的二进制文件,只需要编译一次,就可以在不同的平台上运行。
2.SpringMVC:是Spring框架提供的一个模块,通过实现MVC模式来地将数据、业务与展示进行分离,简化了Web开发。和其他MVC框架一样都是请求驱动,控制转发,它的核心Servlet是DispatcherServlet,即前端控制器,用来分发请求到控制器,它和Spring框架完全整合。这也使得SpringMVC成为目前非常流行的MVC框架。
3.Spring:一款轻量级java开发框架,Spring框架有着分层的体系结构,因此可以使用Spring中 独立的任意部分。而它的架构依旧是内在稳定的,Spring提供了J2EE应用各层解决方案,贯穿于三层架构的每一层,但Spring依旧可以很好的兼容其他框架,本项目主要用到了Spring中IOC(控制反转)和AOP(面向切面编程)模块。
4.Mybatis:是一个简化Java持久化层的轻量级开源框架。并且支持注解的Mapper,Mybatis消除了绝大部分的JDBC代码,使得java对象持久化到数据库的过程变的更加容易,相对于其他的java持久化框架,Mybatis的优点在于,消除了大量的JDBC冗余代码、简单易学、可见的Sql语句、提供了于Spring的整合,引入更好的性能。
2.3 开发工具
Tomcat服务器:是一个Web应用服务器,它是轻量且开源的,是中小型Web项目和开发调试和学习的首选。
Oracle数据库(Oracle Database):是由Oracle公司开发的一款关系型数据库,是商业运用第一的关系型数据库,系统使用方便,功能强大,可移植性强。适用于各种大中小环境,在大数据时代,作为分布式数据库,它实现了分布式处理的功能,具有完整的数据管理功能、完备的关系型数据库、分布式处理功能。
Eclipse开发工具:一个基于java开源的可扩展开发平台,它不但包括java集成开发环境,还包括插件开发环境,如SVN、CVS等团队开发插件。
2.4 本章小结
本章主要介绍了开发项目用到的一些主要技术,项目所使用的架构和设计模式,项目中所使用到的主要框架技术,项目在浏览器端展示用到的前端技术和展示方式,后台代码使用的开发语言,使用的服务器技术,数据持久层所使用的数据库等,在本章最后又介绍了开发使用到的开发工具。
3 系统需求分析
3.1 可行性分析
省略
3.2 需求分析
3.2.1 系统总体需求
该微博系统主要由前台用户模块和后台管理模块组成,当用户进入首页时可以选择登陆或不登陆,登陆时可以使用已有账号登陆或注册新账号。用户未登陆时,在首页显示最近更新的热门微博,而登陆后的用户可以在首页看到 自己关注用户最近更新的微博。
未登陆用户只能搜索查看微博信息和访问用户主页,登陆用户可以登陆系统后修改自己的基本信息例如签名、性别等,在验证用户信息后还可以修改密码和密保信息。以及修改用户头像和密码,编辑自己的个人主页,对微博进行点赞、评论、收藏等功能,还可以关注/取消关注用户,拉黑用户、私聊用户等操作。
后台管理员可以查看系统所有的数据,包括用户、微博、评论、树洞、回答的总量,最近一个的数据库,最近一周的数据量。具体所具有的功能包括管理不良微博信息与不良账号,对微博、微博评论、树洞、回答等信息的删除和恢复功能,对不良账号的封禁等操作。
微博查找模块:用户可以输入关键字来查找相对应的微博或查找用户。
微博发布模块:用户点击发布,在内容中添加自己想要发送的内容,可以选择表情,也可以插入图片,但对输入字符数有着限制,同时还可以插入一张图片。
微博评论模块,用户可以查看微博的评论,发布微博评论等。
神奇树洞模块:用户可以发布一个神奇树洞,树洞主要用来记载用户提出的各种问题,由其他用户来查看并回答问题,当回复者的答案被提问者采纳后,回答者可以增加自己的树洞积分,不同的树洞积分有着不同的树洞称号。
积分模块:用户每天登陆,发微博,做任务等方式可以增加自己的积分,不同的积分拥有不同的称号,神奇树洞模块的积分有着不同的称号,称号显示在用户名称的后面。
好友模块:用户可以查看系统中其他的用户,找到自己喜爱的用户然后关注他们,关注后可以在好友模块中查看自己关注的用户,以及好友最近发布的微博等信息,也可以私信好友,发送私信信息给好友。
3.2.2 用例图需求
1.当用户进入系统时候,可以选择登陆或注册用户,如果忘记了密码还可以通过密保问题来重置密码。
图3.1 用户初始用例图
2.当用户登陆后,可以管理用户的个人基本信息,修改用户基础信息,修改用户密保信息。修改用户头像等功能。
图3.2 用户信息管理用例图
3.用户微博管理系统,当用户登陆进去系统时,可以在首页发布微博,通过关键字搜索微博内容中关键字的微博信息。产看微博,包括查看个人微博、好友微博、推荐微博。
图3.3 微博管理用例图
4.评论管理,评论管理依赖于微博模块,用户可以查看微博的评论,对微博信息发布评论,以及删除自己的评论。
图3.4 微博评论管理用例图
5.树洞管理,用户登陆后可以在树洞模块发布树洞问题,发布问题时可以选择悬赏的积分数目,同时减少自己的积分数,用户可以参加回答他人的树洞问题,当回答的答案被采纳时,就可以获得用户悬赏的积分数。
图3.5 树洞管理用例图
6.好友管理,当用户登陆时可以关注系统推荐好友,也可以自己搜索用户,查看用户的主页面,添加关注或取消关注用户,还可以给用户发送私人信息,或者拉黑用户。
图3.6 好友管理用例图
7.消息通知,当用户的关注,微博评论,点赞,收藏时调用消息通知。
图3.7 好友管理用例图
8.管理员:管理员登陆系统,可以管理微博用户,对不良用户进行封禁和注销账户的操作,也可以恢复用户的状态,同时也可以对微博信息进行管理,如删除微博,恢复被管理员删除的微博信息等,对微博评论的删除和恢复等操作,如图3.2。
图3.8 管理员用例图
4 系统功能设计
4.1 系统类分析
4.1.1 实体类
实体类主要用来传递数据,主要包括User、Friend、PointAction、PointRecord、Weibo、WeiboCollect、WeiboComm、WeiboLike、WeiboTrans等,用户类中包括用户的基本信息,微博类中包括微博的基本信息同时包含实体用户类,好友类包括好友编号,好友创建时间与关注双方的用户类等,私信类包含私信双方的用户类与私信的基本属性,微博收藏类包含收藏的微博类与用户id等收藏属性,微博评论类包含微博类和用户类以及评论内容等属性,微博转发类包含用户类和微博类以及转发时间等属性,微博点赞类包含微博类和用户类以及点赞时间等属性。实体类之间的类关联关系如图4.1所示。
图4.1 Bean层类图
4.1.2 控制器类
在controller层包含MainController、WeiboController、FrendController、AdminController四个JAVA类,在SpringMVC框架中主要用来接收浏览发送给服务器的请求和数据处理并控制请求的转发,将从Service层中获取的数据响应给浏览器端。MainController主要用发来接收来自用户相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图4.2所示。
图4.2 用户控制器类图
WeiboController主要用发来接收来自微博相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图4.3所示。
图4.3 微博控制器类图
FriendController主要用发来接收来自好友相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图4.4所示。
图4.4 好友控制器类图
AdminController主要用发来接收来自管理员相关页面中提交的表单或链接请求,并将请求的参数传递到Controller中对应的方法中,并获取到业务处理层层中返回的数据,携带数据响应给浏览器,在浏览器端显示数据,具体属性和方法如图4.5所示。
图4.5管理员控制器类图
4.1.3 业务逻辑类
在Service层中主要包含四个Service接口和他们的实现类,包括IUserService用来处理用户业务例如用户注册、登陆、修改个人信息等,如图4.6所示。IWeiboService用来处理微博相关的业务例如查找微博,发布微博,删除微博以及对微博的相关操作例如点赞、评论等功能的业务实现,如图4.7所示。IFriendService用来处理和用户好友相关的业务例如点赞、取消点赞、私信、拉黑等功能的业务实现,如图4.8所示。IAdmoinService用来处理和管理员相关的业务例如管理员登陆、图表展示、用户管理、微博管理、树洞管理功能的业务实现,如图4.8所示。
图4.6用户业务处理类图
图4.7微博业务处理类图
图4.8微博控制器类图
4.1.4 数据库交互类
由于系统采用了MyBatis持久化框架,开发人员不需要关注和数据库之间具体的JDBC代码,而只需要处理业务逻辑,因此只需要在Dao层接口中声明方法而不需要写接口的实现类来实现方法,则是通过配置对应的配置文件,在配置文件中编写对应接口方法中的SQL语句和数据库交互。
4.2 关键业务设计
4.2.1 登陆系统
图4.9系统登录顺序图
用户进入主页后,可以在左边选择注册用户,或者在右边登陆系统,在注册模块,用户输入用户邮箱,密码,昵称等信息,当用户输入邮箱后会通过Ajax将用户输入的邮箱传到后台,查找用户邮箱是否已经被注册,如果被注册则在页面提示用户该邮箱已被注册,在输入基本信息点击注册后,保存用户注册信息。
登陆功能,当用户输入邮箱地址和密码后,如果点击下次自动登陆密码在点击登陆后,判断用户的当前登陆时间和上次登陆时间是否为同一天,如果不是同一天则为用户增加登陆的 积分,然后跳转至微博首页。
4.2.1 用户信息系统
图4.10用户修改信息顺序图
用户基本信息:在系统的首页中点击个人账号设置后,跳转到修改用户基本信息页面,用户可以修改这些基本信息,并将修改后的信息保存在数据库中。
修改密码:在用户个人资料页面点击修改密码,跳转修改密码页面,用户可以输入用户的当前密码,系统判断密码是否正确,如果密码不正确,显示当面密码错误,如果输入密码正确,用户则可以输入新密码,点击修改后将修改后的密码更新到数据库中。
修改用户头像:点击用户个人资料中修改头像,跳转至修改头像页面,用户选择头像文件,点击上传,将用户头像保存在服务器上,判断用户之前头像是为系统默认头像,如果不是就删除用户之前的头像图片,点击修改后将修改后的头像地址保存在数据库中。
修改密保:用户先要根据之前设置的密保问题来填写答案,如果密保答案错误,提示用户密保答案错误,如果密保答案正确,用户可以输入新的密保问题和密保答案,点击修改保存用户新的密保问题和答案。
4.2.2微博模块
图4.11系统登录顺序图
发布微博:用户可以在首页发布微博,在微博信息中可以插入表情,也可以选择插入一张图片,当用户点击发布后,浏览器发送请求将前台页面表单中微博信息和图片信息传入后台控制器,将图片信息保存在服务器中,在数据库中只保存图片路径,最后将微博信息保存在数据库中。
搜索微博:用户可以在首页的搜索框中输入微博中提到的内容来搜索,系统在数据库中通过迷糊查询查询相关的微博信息。在页面中将搜索到的页面展示出来,并且将关键字标红显示。
微博操作;用户可以查看个人微博、好友微博、收藏微博等信息,对微博的操作有点赞,转发,收藏,评论,删除等。
4.2.3 好友模块
关注功能:当用户登陆系统后可以在页面右侧的推荐用户中选择需要关注的用户,或者是通过页面中的搜索功能来搜索用户,对搜索到的用户进行关注。关注用户后个人关注+1,同时被关注用户粉丝数+1。
取消关注:和关注功能类型,在导航栏中点击我的好友,在我的好友首页中查看我的关注好友,就能查看到我所关注的所有好友和好友数以及他们的个人信息,通过点击对应的取消关注就可以取消关注该用户,取消关注用户后个人关注数-1,同时被关注用户粉丝数-1。
拉黑用户:即修改好友表中对应的记录状态,被拉黑用户所发布的私信和微博信息不会被拉黑用户所看到。
私信:可以在页面的推荐用户上面查看当前登陆用户的未查看私信数,未读私信的数目通过数据库中对所有接收者为当前登陆用户的所有私信信息,且信息状态为未阅读的私信,将得到的数值展示在前台页面中显示。
发送私信:用户先选择要发送的用户,输入需要发送的私信信息,可以在私信中插入表情,点击发送后会将私信信息发送给对应用户。同时增加提示该用户的未读私信数。
搜索用户:在搜索用户页面中,用户可以输入用户昵称的关键字来模糊查询相关用户,并将查询到的用户展示在页面中,同时将用户输入的关键字标红显示。
用户主页面:在页面中,点击任意一个用户的名称或头像都会跳转至对应用户的个人主页,用户的个人主页显示用户的个人信息和用户最近发布的微博,按照时间倒序排列,用户也可以对微博的点赞、转发、评论、收藏做操作。
4.2.4 树洞模块
发布:用户通过点击导航栏中的神奇树洞进入树洞主页,在树洞页面的上面是发布树洞的问题框,下面的可以插入的表情按钮和问题的悬赏积分数,中间的导航栏可以选择查看最新发布、已解决、待解决、我的树洞不同的筛选条件。
查看树洞问题:用户点击任意树洞问题,系统跳转到展示树洞的具体信息的页面,上方展示发布用户的用户名、用户称号、发布日期、树洞问题、悬赏积分、问题的状态等,在中间显示问题的所有回复信息,回复人的用户名、称号、回答内容、回复日期,是否被采纳等。
回答树洞问题:在树洞问题详细详细信息页面的底部可以回答树洞问题,在输入框中输入回复的答案,插入表情信息等,点击回复后将回复信息保存在数据库中。
采纳问题答案:在树洞问题首页,用户通过点击我的树洞问题可以跳转至用户自己所发布的树洞问题页面,在自己所发布的树洞问题页面中可以选择自己认为最正确的答案,点击采纳后修改树洞状态,被采纳的答案变为采纳答案,增加采纳者的树洞积分。
4.2.5 后台管理员模块
管理员登陆:管理员可以通过在登陆页面中点击管理员登陆,跳转至管理员登陆页面。当管理员输入账号信息和密码信息后,如果用户名和密码正确就跳转到管理员首页。如果错误则给出提示。
管理员首页:在管理员首页中上方显示导航栏,在页面内容方面,通过四张图表来显示微博、用户、评、树洞、评论、回答等的总数以及当月数,在下方的柱状图中则显示距离今天最近的7天的数目。
用户管理首页:在页面上方显示导航栏,页面内容中显示所有用户的编号、邮箱、昵称、注册日期、上次登陆日期以及用户的状态,由于考虑到用户数量多以以及为了方便查找,因此在页面中一次显示10条用户数据,同时添加用户搜索功能,用户能够在输入用户昵称的关键字后来搜索用户,并且支持迷糊查询。 搜索用户:在用户管理页面输入用户昵称中的关键字来搜索用户,系统会将获取到的用户信息中昵 称为输入关键字的那部分显示为红色。
用户封禁:管理员可以通过点击用户管理页面操作一栏中的封禁按钮来对违规用户的封禁,管理员可以输入封禁的天数,那么在这个日期之前,用户是不能正常登陆的,管理员也可以通过点击解封来提前解除封禁用户的操作。
微博管理首页:管理员点击导航栏中的微博管理,系统会跳转至用户微博管理页面,显示系统中所用是微博信息,管理员也可以通过输入微博内容中的关键字来搜索微博,同时可以删除有不良信息的微博,或是恢复以被删除的微博。
微博搜索:管理员可以通过输入微博内容中的关键字来搜索在微博中存在该关键字的微博,搜索到的微博内容中的关键字会使用红色标注出来。
微博删除:在微博管理页面中,管理员可以根据微博的内容来判断微博是否违法等信息,如果微博信息中包含不良信息,管理员可以通过操作栏中的删除按钮来删除微博或者可以对已经删除的为微博做恢复操作。
树洞管理首页:管理员点击导航栏中的树洞管理可以跳转至树洞管理页面,在页面的上方为导航栏,页面内容则显示所有的树洞信息、树洞搜索框、以及下方的分页框,树洞信息包括编号、发布人名称、树洞的内容、发布日期、树洞状态以及可以执行的操作。
树洞搜索:在树洞管理首页中,考虑到树洞数量多不好查找的问题,因此设置了搜索功能,管理员可以能够在树洞搜索框中输入树洞内容中的关键字来搜索树洞问题,在展示搜索到的结果时会将搜索关键字使用红色标注出来,方便查看。
4.3 数据库设计
4.3.1 概述
微博系统数据库表主要包括:
1.用户表:用来保存用户的个人信息,例如编号、昵称、姓名、密码。邮箱等信息,以用户编号作为主键,如表4-1。
2.微博关注表:用来保存用户的关注用户信息,以关注ID作为主键,如表4-2所示。
3.微博表:用来保存微博信息,例如微博发布时间,微博内容,微博点赞,转发,收藏数等,以微博编号作为主键,如表4-3所示。
4.微博收藏表:用来保存用户收藏的微博信息,如微博编号,收藏时间等,以收藏编号作为主键,如表4-4所示。
5.评论表:保存微博的评论消息,例如评论人编号、评论日期、评论内容等,以评论编号作为主键,如表4-5所示。
6.积分表:用来保存用户获取积分的方式,例如通过每天的登陆发布微博等获取积分,以积分编号作为主键, 如表4-6所示。
7.点赞表:用来保存微博的点赞信息,主要包括点赞人编号,点赞编号,点赞微博编号等信息。以点赞编号作为主键,如表4-7所示。
8.积分流水表:用来保存用户获取积分的信息,主要包括积分编号、用户编号、获取日期等信息,以积分编号作为主键,如表4-8所示。
9.转发表:用来保存用户转发的信息,主要有转发编号、转发人、微博编号等信息,以转发编号作为主键,如表4-9所示。
4.3.2 概念设计
一个用户可以发布多条微博,因此用户表和微博表之间存在一对多的关系如图4.12所示。
图4.12 用户表和微博表对应关系
一条微博可以对应多个点赞、转发、收藏和评论,因此微博表和收藏、点赞、转发、收藏表之间存在一对多的对应关系,如图4.13所示。
图4.13 微博表和微博操作表对应关系
一个用户可以发布多个树洞,每个树洞问题可以对应多条评论。如图4.14所示。
图4.14 用户表和树洞表对应关系
4.3.3 数据库表
1.用户表:数据库表名USER_TAB,引用序列名SEQ_USER。
5系统功能实现
5.1 登陆系统
在系统登陆注册页面当用户输入邮箱后会通过Ajax将用户输入的邮箱传到后台控制器,调用Service层中对应的方法,是Service方法中调用Dao层接口查找用户邮箱是否已经被注册,如果被注册则通过前台javaScript显示在页面提示用户该邮箱已被注册,在输入基本信息点击注册后,将会把用户输入的注册信息通过浏览器发送请求到后台控制器中,控制器控制请求的转发页面和将用户注册信息传给Service,在Service中初始化用户的一些基本信息,例如默认头像、默认状态、初始化用户积分等操作,组装用户数据源,调用Dao层方法保存用户注册信息如图5.1所示。核心代码如下:
user.setRegisterTime(nowDate()); //使用当前时间作为用户注册时间
user.setLastLogin(nowDate());
user.setBirthday("2017-1-1");
User addUser = addIntegral(user, Constant.REGISTER); //增加用户积分
action = userDao.findIntegral(Constant.REGISTER); //查找注册操作得到的PointAction
record = new PointRecord(action, addUser.getEmail(), nowDate());
addIntegralRecord(record); //保存积分操作
userDao.saveUser(addUser); //保存用户注册信息
登陆功能,如果点击下次自动登陆密码在点击登陆后,先将用户名和密码信息传递到Service层做业务处理,再调用Dao层接口判断邮箱地址和密码信息是否正确,如果正确并且点击了下次登陆,就将邮箱名和密码保存在浏览器Cookie中,将登陆用户保存在Session中,在处理用户登陆的Service中判断用户的当前登陆时间和上次登陆时间是否为同一天,如果不是同一天则为用户增加登陆的积分,修改用户数据库中的积分数,然后跳转至微博首页,如图5.2所示。核心代码如下:
findUser = userDao.findUserByEmailAndPassword(userId, password);
if(findUser == null){
throw new UserServiceException("用户名或密码错误");
}else{
Date lastLogin = findUser.getLastLogin(); //上次登陆时间
Date now = nowDate(); //当前时间
if(lastLogin.getYear()!=now.getYear() || lastLogin.getMonth()!=now.getMonth() || lastLogin.getDate()!=now.getDate()){
//判断如果上次登陆时间和这次登陆时间不一样,则为用户增加登陆积分
findUser=addIntegral(findUser, Constant.LOGIN); //保存积分
saveIRecord(findUser, Constant.LOGIN); //保存积分记录
findUser.setLastLogin(now); //将上次登陆时间改为当前时间
userDao.updateUser(findUser); //更改用户信息
}
}
图5.1用户登陆和注册界面
图5.2微博主页界面
5.2 用户信息系统
用户基本信息:如图5.3所示当用户点击修改后浏览器会提交form表单,发送请求携带用户基本信息到SpringMVC的控制器中接收请求,并把form表单中的数据组装成User对象,作为参数传入Service层中对应的方法进行处理,调用Dao层接口修改用户的基本信息,并修改当前服务器中Session中的User对象信息。核心代码如下:
try {
userDao.updateUser(user);
} catch (DataAccessException e) {
throw new UserServiceException("修改失败,请重试!");
}
图5.3修改用户基本信息界面
修改密码:在用户个人资料页面点击修改密码,将会跳转至如图5-4所示的修改密码页面,用户可以输入用户的当前密码,前台页面通过Ajax发送异步请求,后台控制器接收请求,从数据库中获取用户当前密码是否正确,如果密码不正确,在前台页面中通过javaScript动态提示给用户当面密码错误,如果输入密码正确,用户则可以输入新密码,确认新密码,点击确认修改后浏览器提交form表单,将用户新密码传给后台Service层中对应的方法,在Service的方法中调用Dao层接口更改数据库中的用户密码,更改服务器Session中的用户信息。核心代码如下:
try {
user.setPassword(newpwd);
userService.updateUser(user);
session.setAttribute("loginUser", user);
mav.addObject("msg", "修改成功");
} catch (UserServiceException e) {
e.printStackTrace();
}
图5.4修改密码界面
修改用户头像:点击用户个人资料中修改头像,将会跳转至如图5.5所示的修改头像页面,用户选择头像文件,点击上传,form表单将图片传到后台控制器中,将用户头像保存在服务器上,判断用户之前头像是为系统默认头像,如果不是就删除用户之前的头像图片,并将用户新的头像地址保存在用户信息中,传入Service中调用Dao层接口修改数据库中用户的头像信息。核心代码如下:
if(!(icon.isEmpty())){ //如果文件存在,isEmpty文件为空
//保存文件目录
String path = req.getServletContext().getRealPath("/")+"WEB-INF/jsp/face/"+user.getId()+ico n.getOriginalFilename();
File newFile = new File(path);
//判断文件目录存在不存在,如果不存在就创建目录
if(!(newFile.getParentFile().exists())){
newFile.getParentFile().mkdirs();
}
try {
icon.transferTo(newFile); //转存文件
File oldIcon = new File(req.getServletContext().getRealPath("/")+"WEB-INF/jsp/"+user.getImages()); //删除之前的头像
if(!(user.getImages().equals("face/boy.png") || user.getImages().equals("face/girl.png"))){
//先判断用户之前的头像不是系统默认的头像,然后删除用户之前的头像
if(oldIcon.exists()){
oldIcon.delete();
}
}
user.setImages("face/"+user.getId()+icon.getOriginalFilename());
userService.updateUser(user); //保存用户头像
session.setAttribute("loginUser", user); //将保存后的用户头像信息保存在用户session中
} catch (Exception e) {
e.printStackTrace();
}
}else{
mav.addObject("msg", "图片不存在");
}
图5.5修改头像界面
修改密保:当用户点击修改密保页面时浏览器跳转至修改密保页面如图5-6所示,用户先要根据之前设置的密保问题来填写答案,前台页面通过Ajax将用户输入的密保答案传入后台控制器,与数据库中用户的密保问题答案做判断,如果密保答案错误,在页面上通过javaScript展示用户密保答案错误,如果密保答案正确,用户可以输入新的密保问题和密保答案,点击修改提交form表单后,浏览器发送请求在后台数据库中修改用户的密保问题和答案。核心代码如下:
userService.updateUser(user);
session.setAttribute("loginUser", user);
mav.setViewName("forward:question_index");
mav.addObject("msg", "修改成功!");
图5.6修改密保界面
5.3 微博模块
发布微博:在用户主页如图5.7所示,用户可以发布微博,在微博信息中可以插入表情,也可以选择插入一张图片,在前台页面中,表情使用javaScript动态生成div标签并显示在页面上,当用户点击发布后,浏览器发送请求将前台页面表单中微博信息和图片信息传入后台控制器,将图片信息保存在服务器中,在数据库中只保存图片路径,从Session中获取当前登陆用户,组装微博数据源,将数据源传入Service中,调用Dao层接口将微博信息保存在数据库中。核心代码如下:
if(!(pic.isEmpty())){ //如果文件存在,isEmpty文件为空
//保存文件目录
String path = req.getServletContext().getRealPath("/")+"WEB-inf/jsp/upload/pic/"+user.getId()+pic.getOriginalFilename();
File newFile = new File(path);
//判断文件目录存在不存在,如果不存在就创建目录
if(!(newFile.getParentFile().exists())){
newFile.getParentFile().mkdirs();
}
try {
pic.transferTo(newFile); //转存文件
weibo.setImage("upload/pic/"+user.getId()+pic.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
}else{
//没有带图片
weibo.setImage("null");
}
try {
//保存微博信息
weibo.setUser(user);
weiboService.publishWeibo(weibo); //保存微博信息
user.setBlogNumber(user.getBlogNumber()+1); //将用户的微博数+1
userService.updateUser(user); //保存更改后的用户信息
session.setAttribute("loginUser", user);
mav.addObject("msg", "发布成功!");
} catch (Exception e) {
e.printStackTrace();
mav.addObject("msg", e.getMessage());
}
图5.7发布微博信息界面
搜索微博:如图5.8所示,在微博首页搜索框输入关键字点击搜索提交form表单,浏览器发送请求将关键字传到后台控制器中,在数据库中通过迷糊查询查询相关的微博信息。在Service层中具体方法中调用Dao层接口获得相关的微博信息,遍历集合,组装微博的基本信息和发布人对象,将微博中表情转换成对应的gif图片,调整微博时间格式为对应格式,修改微博内容中搜索关键字为红色显示,将修改好的数据返回到前台页面展示,如图5.9所示。核心代码如下:
User user = (User) session.getAttribute("loginUser");
if("weibo".equals(ac)){
mav.setViewName("seachWeiboPage");
}else if("user".equals(ac)){
mav.setViewName("seachUserPage");
}
try {
Map<String, Object> map = userService.seachWeiboAndUser(skey,pag,ac);
mav.addObject("map", map);
List<User> userTuiJian = weiboService.findUserTuiJian(user.getId());
mav.addObject("tuijian", userTuiJian);
} catch (Exception e) {
e.printStackTrace();
}
图5.8发布微博信息界面
图5.9搜索微博显示界面
微博操作;点击微博的点赞,转发和收藏功能类型,通过Ajax将微博id提交请求到后台控制器,从Session中获取登陆用户的信息,传递参数到Service对应的方法中通过对微博不同的操作调用对应的Dao层接口将微博的点赞,转发和收藏信息保存在数据库中。点击评论后通过前台页面的点击事件跳转至JavaScript中通过Ajax发送异步请求到后台控制器中,将微博id传递到Service层中对应的方法中嗲用Dao层接口查找数据库中对应微博编号的评论信息,微博评论的分页通过对应的PageBean类控制,在数据库层通过SQL语句来控制分页要显示的条数,在控制器中传递json数据到前台页面展示。在评论信息的最后面可以发布用户自己的评论,可以添加表情,点击发表将form表单提交到后台控制器中,在后台代码中调用Dao层接口保存用户的评论信息。如图5.10所示。核心代码如下:
comm.setBeCommentId(dao.findUserIdbyWId(comm.getWeiboId()));
comm.setCommentLike(0); //默认点赞数为0
//保存评论信息
dao.saveWeiboComm(comm);
Weibo weibo = dao.findWeiboBywId(comm.getWeiboId());
//查找微博评论数
commNum = dao.findCommNum(comm.getWeiboId());
weibo.setComnum(commNum);
//更新微博评论数目
dao.updateWeibo(weibo);
图5.10微博正文操作界面
个人微博:如图5.11所示:在页面上方导航栏可以点击进入用户个人主页查看我的微博,在页面中页面上方展示导航栏,下面显示用户的基本信息,中间显示用户所发布过的微博,点击微博插入的图片还可以通过JavaScript将图片放大,在页面的右侧展示系统为用户推荐的好友。点击我的微博按钮后发送的请求会被后台控制器接收,从服务器Session中获取当前登陆用户的用户id,传入Service层,在Service层中调用Dao层接口从数据库中获取当前登陆用户的微博信息组装成List集合,遍历List集合,更改微博数据源的日期格式,调用工具类将微博正文中的表情替换成对应的图片信息,在微博的分页中,使用了Oralce数据库中的伪列来获取对应区间的微博信息,实现数据库层的分页,将所有需要在页面上展示的数据传递给控制器,控制器再将数据封装在Response响应中传递到前台页面。核心代码如下:
List<Weibo> list = weiboService.findHomeWeibo(0, page, null);
list = FaceFormat.formt(list);
for(int i=0;i<list.size();i++){
long uId = list.get(i).getU_id(); //获取用户id
User weibo_user = userService.findUserById(uId);
list.get(i).setUser(weibo_user); //将user信息组装到weibo类中
boolean b = weiboService.userLikeWeibo(list.get(i).getId(), user.getId());
list.get(i).setB(b);
//重新查找未读私信数目
Map<String, Object> alerts = userService.alerts(user.getId());
session.setAttribute("alerts", alerts);
}
int pageNumber = 0;
page.setTotalPage(pageNumber/10+1); //确定所有的微博共有多少页
List<User> userTuiJian = weiboService.findUserTuiJian(user.getId());
图5.11个人微博界面
5.4 好友模块
查看好友微博:通过点击页面导航栏中我的好友来跳转至好友微博页面,在后台控制器中先从Session中获得当前登陆用户的id值,传递给Service,在Service中调用Dao层方法先在数据库的好友表中查找对应用户的所有好友信息,然后再在数据库微博表中查看这些好友对应的微博信息按照微博发布时间倒序排列,将所有查找到的微博信息和发布用户信息封装成List集合,遍历List集合修改微博日期各式,微博表情字符转换为对应图片名称,将加工过后的集合传递给控制器,控制器将所有的组装好的数据响应到前台页面中,在前台页面中通过C标签遍历List展示微博数据如图5.12所示。核心代码如下:
省略
图5.12好友微博信息界面
图5.13好友列表界面
私信:可以在页面的推荐用户上面查看当前登陆用户的未查看私信数,如图5.14所示,未读私信的数目通过数据库中对所有接收者为当前登陆用户的所有私信信息,且信息状态为未阅读的私信,将得到的数值传递给前台页面,前台页面中所有展示的数值通过EL表达式从服务器发送回来的响应中获取。点击未读私信或者通过图5.13中显示的好友列表中的私信按钮,跳转至用户私信页面。核心代码如下:
List<User> userList = dao.findUserByMessage(aId);
if(bId == -1 && userList.size()!=0){
//通过点击私信进入
bId = userList.get(0).getId();
}
List<Message> list = dao.findMessageById(aId, bId);
for(int i=0;i<list.size();i++){
list.get(i).setUserA(userDao.findUserById(list.get(i).getUserAId()));
list.get(i).setUserB(userDao.findUserById(list.get(i).getUserBId()));
list.get(i).setMessageDate(TimeFormat.dateToString(list.get(i).getMessageDate()));
}
list = FaceFormat.messageFormt(list);
User user = userDao.findUserById(bId);
图5.14用户未读私信界面
查看私信:如图5.15所示,用户通过点击私信关注好友时,通过后台控制器跳转至我的私信用户页面,页面左侧显示和该用户最近的私信信息,页面右侧显示所有有过私信的用户列表,点击列表中的用户就可以直接私信这个用户,在私信中允许插入表情。在后台代码中,将要发送私信的用户id和从Session中获取的登陆用户id传递到Service层中对应的方法,调用Dao层接口在数据库中查找与该用户相关的所有私信记录同时修改和该用户的所有私信状态为以阅读,将获取的记录组装到集合中,遍历集合调用工具类修改私信的日期格式和文本中的表情格式,同时从数据库中获取和当前登陆用户有过私信记录的所有用户,将组装好的集合返回给控制器,控制器将数据响应给前台页面中,遍历集合中的数据,展示在前台JSP页面中。核心代码如下:
for(int i=0;i<userList.size();i++){
//查找来自该用户的未读私信
userList.get(i).setUnReadMessage(dao.findURMNByUID(aId, userList.get(i).getId()));
}
图5.15用户私信界面
发送私信:用户先选择要发送的用户,输入需要发送的私信信息,可以在私信中插入表情,点击发送后会提交form表单,浏览器发送请求到后台控制器中,控制器获取发送用户的id和接收用户的id,调用Service层中的方法,组装数据源为私信信息,设置私信信息为未阅读状态,在Service层中对应的方法中调用Dao层接口将私信信息保存在数据库中。核心代码如下:
friendService.sendMessage(message);
List<User> userTuiJian = weiboService.findUserTuiJian(user.getId());
mav.addObject("tuijian", userTuiJian);
//查找用户有私信的记录
Map<String, Object> map = friendService.findMessageById(user.getId(), userBId);
@SuppressWarnings("unchecked")
List<Message> Messagelist = (List<Message>) map.get("list");
User bUser = (User) map.get("bUser");
@SuppressWarnings("unchecked")
List<User> attUser = (List<User>)map.get("attUsers");
搜索用户:在搜索用户页面中,用户可以输入用户昵称的关键字来模糊查询相关用户,当用户输入要查询的用户昵称,浏览器发送请求携带关键字等信息跳转至控制器中特定的方法,在控制器方法内部调用Service中的方法处理逻辑,业务层调用Dao层接口中的查找方法查找用户昵称中包含有关键字的用户,将从数据库获得的对应用户组装成一个集合,遍历集合将用户昵称中包含的关键字改成红色,控制器返回响应跳转到搜索结果页面,遍历集合展示所有查找到的用户信息。如图5.16所示。核心代码如下:
Map<String, Object> map = userService.seachWeiboAndUser(skey,pag,ac);
mav.addObject("map", map);
List<User> userTuiJian = weiboService.findUserTuiJian(user.getId());
mav.addObject("tuijian", userTuiJian);
图5.16搜索用户界面
用户主页面:在页面中,点击任意一个用户的名称或头像都会跳转至对应用户的个人主页,用户的个人主页显示用户的个人信息和用户最近发布的微博,按照时间倒序排列,用户也可以对微博的点赞、转发、评论、收藏做操作。在后天代码中,当用户点击其他用户的头像或名称时,浏览器发送携带用户id的请求到后台控制器中。控制器调用Service中对应的方法,在Service方法中调用Dao层接口从数据库中查看用户的基本信息和用户的微博信息,将所有的数据存放在集合中。返回到控制器中,控制器携带数据返回到前台页面中做展示,如图5.17所示。核心代码如下:
List<Weibo> list = friendService.findFriendWeibo(user.getId(), page);
list = FaceFormat.formt(list);
for(int i=0;i<list.size();i++){
long uId = list.get(i).getU_id(); //获取用户id
User weibo_user = userService.findUserById(uId);
list.get(i).setUser(weibo_user); //将user信息组装到weibo类中
boolean b = weiboService.userLikeWeibo(list.get(i).getId(), user.getId());
list.get(i).setB(b);
comm = FaceFormat.commFormt(comm);
list.get(i).setComm(comm); list.get(i).setStr_pubTime(TimeFormat.dateToString(list.get(i).getStr_pubTime()));
}
图5.17用户主页界面
5.5 神奇树洞模块
发布:当用户进入神奇树洞主页时,浏览器页面发送请求到后台控制器中,调用业务层中特定的方法,Service中调用Dao层接口在数据库中查找有关不同筛选条件的神奇树洞问题,并将查找到的问题封装在集合中,通过控制器发送服务器响应,跳转到神奇树洞首页,并循环展示所有的神奇树洞问题。如果用户需要发布问题,在填写了问题描述和所要悬赏的积分数后,点击发布,浏览器提交表单数据到后台控制器中,在Service层中首先判断用户的神奇树洞积分是否大于悬赏积分,如果小于悬赏积分就返回浏览器页面提示用户积分不足。如果积分足够就调用Dao层接口把用户的神奇树洞问题保存在数据库中,同时减少用户的神奇树洞积分修改用户基本信息。核心代码如下:
//神奇树洞分页
//获取神奇树洞总数
int num = userService.conchNum(user.getId(), conchOperation);
if(num%5 == 0){
page.setTotalPage(num/5);
}else{
page.setTotalPage(num/5+1);
}
page.setPage(1); //每5页一分页
page.setMinPage(1*5-4);
page.setMaxPage(1*5);
//查找神奇树洞显示
Map<String, Object> map = userService.conchIndex(user.getId(), conchOperation ,page);
List<User> userTuiJian = weiboService.findUserTuiJian(user.getId());
图5.18神奇树洞首页界面
查看神奇树洞问题:用户点击神奇树洞首页具体的问题时,浏览器发送请求给后台控制器中调用Service层对应的方法,在Service层中调用Dao层接口通过神奇树洞问题的编号来查看神奇树洞的具体信息,通过发布问题的用户id在数据库中查找对应的发布人信息,服务器返回响应到浏览器中,展示神奇树洞的具体信息,上方展示发布用户的用户名、用户称号、发布日期、神奇树洞问题、悬赏积分、问题的状态等,在中间显示问题的所有回复信息,回复人的用户名、称号、回答内容、回复日期,是否被采纳等,如图5.19所示。核心代码如下:
List<WeiboComm> list = weiboDao.findWeiboComm(conchId, 0, 20);
list = FaceFormat.commFormt(list);
for(int i=0;i<list.size();i++){ list.get(i).setCommentDate(TimeFormat.dateToString(list.get(i).getCommentDate()));
list.get(i).setCommUser(userDao.findUserById(list.get(i).getCommentId()));
}
map.put("conchComm", list);
图5.19查看问题具体界面
回答神奇树洞问题:在神奇树洞问题详细详细信息页面的底部可以回答神奇树洞问题,在输入框中输入回复的答案,插入表情信息,点击回复提交表单,浏览器请求携带表单数据到后台控制器中,被控制器中具体的方法接收,获取Session中的用户编号,组装回复信息的数据源,传递参数到Service中,在Service中调用Dao层接口保存神奇树洞的回复信息,如图5.20所示。核心代码如下:
comm.setCommentState(100); //100回复正常未采纳 101回复正常被采纳
weiboDao.saveWeiboComm(comm);
图5.20回复神奇树洞问题界面
采纳问题答案:在神奇树洞问题首页,用户通过点击我的神奇树洞问题可以跳转至用户自己所发布的神奇树洞问题页面,在自己所发布的神奇树洞问题页面中可以选择自己认为最正确的答案,被采纳的答案变为采纳答案,增加采纳者的神奇树洞积分,如图5.21所示,在后台代码中,当用户点击采纳后,浏览器请求携带神奇树洞问题id和问题回复信息被后台控制器中具体的方法接收,在控制器中调用Service层,业务层中调用Dao层接口修改数据库中神奇树洞问题的状态为已解决,修改评论表中被采纳用户的评论状态为被采纳,刷新前台神奇树洞问题页面。核心代码如下:
//设置神奇树洞状态为1
userDao.setConchState(conchId);
//设置神奇树洞评论状态为101
userDao.setConchComm(commId);
//为用户增加神奇树洞积分
Conch conch = userDao.findConchById(conchId);
User user = userDao.findUserById(userDao.findUserIdByCommId(commId));
user.setConchIntegral(user.getConchIntegral()+conch.getcNumber());
图5.21采纳问题答案界面
5.6 后台管理员模块
管理员登陆:管理员可以通过在登陆页面中点击管理员登陆,跳转至管理员登陆页面如图5.22所示,管理员登陆后,页面发送请求到后台控制器中,后台Controller层接收请求,将用户名和密码作为参数调用业务层中的方法,在Service层中调用Dao层接口和数据库中管理员账号表中查询,如果存在就返回管理员类,如果不存在,则抛出异常,异常层层上抛,在控制器层中接收,并将错误信息保存在方法的返回值中,在页面提示,如果用户名和密码正确,就跳转到Controller中管理员首页的处理方法中,在管理员首页的处理方法中获取需要显示的数据并展示。核心代码如下:
@RequestMapping("admin_login")
public String adminIndex(){
return "admin/adminlogin";
}
图5.22管理员登陆界面
管理员首页:登陆后,系统会跳转到管理员首页,在首页中上方显示导航栏,在页面内容方面,通过四张图表来显示微博、用户、评、神奇树洞、评论、回答等的总数以及当月数,在下方的柱状图中则显示距离今天最近的7天的数目。后台首先在Controller层中跳转至管理员首页对应的处理方法中,调用Service层中对应的方法获取首页展示数据,并将获取到的数据组装到Map集合中,在服务层中调用Dao层中的方法来获取首页需要展示的用户、微博、评论、回答等数据保存在Map集合中,在控制层中获取到返回值数据并保存在服务器响应中,返回给前台页面使用EL表达式展示数据,如图5.23所示。核心代码如下:
//首页展示数据
try {
Map<String, Object> map = adminService.indexDate();
mav.addObject("map", map);
} catch (UserServiceException e) {
e.printStackTrace();
}
图5.23管理员首页界面
用户管理首页:后台代码通过调用Service层中对应的方法,Service方法里面则调用Dao层接口和数据库交互,获取数据库中所有的用户信息封装成List集合,返回给Controller层将用户List集合响应给浏览器,在页面中通过c标签遍历循环显示用户信息,页面的分页使用自定义分页类PageBean来保存分页信息,在数据库层做分页一次获取10条数据。核心代码如下:
int num = 0;
if(ukey == null){
num = adminService.findUserNum();
}else{
num = adminService.findUserNum(ukey);
}
if(num%10 == 0){
pageBean.setTotalPage(num/10);
}else{
pageBean.setTotalPage(num/10+1);
}
pageBean.setPage(page);
pageBean.setMinPage(page*10-9);
pageBean.setMaxPage(page*10);
List<User> list = null;
if(ukey == null){
list = adminService.userManage(pageBean);
}else{
list = adminService.userManageByKey(pageBean, ukey);
}
mav.addObject("userList", list);
mav.addObject("pageBean",pageBean);
图5.24用户管理界面
搜索用户:在用户管理页面输入用户昵称中的关键字来搜索用户,系统会将获取到的用户信息中昵称为输入关键字的那部分显示为红色。在后台代码中,点击搜索会将管理员输入的用户昵称关键字传给后台控制器中,在控制器中调用Service层中对应的搜索用户的方法,在Service层中调用Dao层接口在数据库中通过迷糊查询来获取用户。并将获取到的数据层层返回,在Controller中响应给前台页面,然后在页面中做展示,如图5.25所示。核心代码如下:
list = adminDao.findAllUserByKey(key,page.getMinPage(),page.getMaxPage());
for(int i=0;i<list.size();i++){
list.get(i).setNickName(FaceFormat.keyFormt(list.get(i).getNickName(), key));
}
图5.25管理员搜索用户界面
用户封禁:管理员可以通过点击用户管理页面操作一栏中的封禁按钮来对违规用户的封禁,管理员可以输入封禁的天数,那么在这个日期之前,用户是不能正常登陆的,管理员也可以通过点击解封来提前解除封禁用户的操作,具体页面如图5.26所示。在后台代码中则是在Service层中调用Dao层接口,更改用户状态和封禁日期,解除封禁和封禁用户类似,因此不做具体说明。核心代码如下:
mav.setViewName("redirect:userManage");
try {
adminService.FJUser(uId, day); //uId封禁用户编号,day封禁天数
} catch (UserServiceException e) {
e.printStackTrace();
}
mav.addObject("page", 1);
图5.26封禁用户界面
微博管理首页:管理员点击导航栏中的微博管理,系统会跳转至用户微博管理页面,显示系统中所用是微博信息,管理员也可以通过输入微博内容中的关键字来搜索微博,同时可以删除有不良信息的微博,或是恢复以被删除的微博,微博管理页面如图5.27所示,在后台代码中,当用户点击导航栏中微博管理时,浏览器会发送相应的请求到SpringMVC框架的Controller中对用的更能处理方法中,在控制器中调用Service层中显示所有微博的方法中,在Service层中再调用Dao层方法获取所有的微博信息,在分页方面没有采用在前端页面中做分页的方法,而是在数据库中通过Oracle的伪列来做分页,一次获取10条数据,最后在Controller中将获取到的微博信息响应给浏览器,浏览器中通过c标签遍历显示微博信息。核心代码如下:
String nkey = "";
if(key == null){
nkey = "1=1";
}else{
nkey = "m_body like '%"+key+"%'";
}
list = adminDao.findWeiboByKey(nkey, pageBean.getMinPage(), pageBean.getMaxPage());
list = FaceFormat.formt(list);
for(int i=0;i<list.size();i++){
list.get(i).setStr_pubTime(TimeFormat.timeFormat(list.get(i).getPubTime()));
list.get(i).setUser(userDao.findUserById(list.get(i).getU_id()));
if(key != null){
list.get(i).setBody(FaceFormat.keyFormt(list.get(i).getBody(), key));
}
}
图5.27微博管理界面
微博搜索:管理员可以通过输入微博内容中的关键字来搜索在微博中存在该关键字的微博,搜索到的微博内容中的关键字会使用红色标注出来,具体页面如图5.28所示,在后台代码中,控制器中特定的方法接收浏览发送的搜索微博请求,调用Service层中对应的方法,将关键字作为参数传给Dao层接口中,在Dao层接口中查找数据库微博表中微博内容包含该关键字的微博信息,在数据库中则是通过模糊查询来查找对应微博。然后将查找到微博信息封装到List集合中,层层返回到Controller层中对应的方法,在方法中将数据响应给浏览器,浏览器接收响应在页面中通过c标签展示数据。核心代码如下:
if(key == null){
nkey = "1=1";
}else{
nkey = "m_body like '%"+key+"%'";
}
list = adminDao.findWeiboByKey(nkey, pageBean.getMinPage(), pageBean.getMaxPage());
图5.28管理员搜索微博界面
微博删除:在微博管理页面中,管理员可以根据微博的内容来判断微博是否违法等信息,如果微博信息中包含不良信息,管理员可以通过操作栏中的删除按钮来删除微博或者可以对已经删除的为微博做恢复操作,当用户点击删除时,页面会携带着微博编号等参数发送请求给服务器,请求会被控制器中对应的方法所接收,将微博编号作为参数嗲用Service中对应的方法,在方法中调用Dao层接口在修改数据库中对应微博编号的微博状态为已删除,恢复微博和删除类似,只是修改数据库中对应微博信息状态为正常即可。核心代码如下:
if("sc".equals(ac)){
adminDao.upWeiboWithState(wId, 1);
}else if("hf".equals(ac)){
adminDao.upWeiboWithState(wId, 0);
}
神奇树洞管理首页:管理员点击导航栏中的神奇树洞管理可以跳转至神奇树洞管理页面,如图5.29所示,在页面的上方为导航栏,页面内容则显示所有的神奇树洞信息、神奇树洞搜索框、以及下方的分页框,神奇树洞信息包括编号、发布人名称、神奇树洞的内容、发布日期、神奇树洞状态以及可以执行的操作,在后台代码方面,当用户点击导航栏中的神奇树洞管理时,浏览器发送请求,请求在控制器中被对应的方法接收,Service中调用Dao层接口在数据库神奇树洞表中查找所有的神奇树洞信息,保存在List集合中,遍历List集合组装发布人用户信息,修改日期格式等,最后将组装号的List集合返回到Controller中,响应给浏览器跳转神奇树洞管理首页,通过使用c标签遍历显示查找到的神奇树洞信息,因为系统中使用的分页方法一致,因此在这里不再赘述。核心代码如下:
int num = adminService.findConchNum(ckey);
if(num%10 == 0){
pageBean.setTotalPage(num/10);
}else{
pageBean.setTotalPage(num/10+1);
}
pageBean.setPage(page);
pageBean.setMinPage(page*10-9);
pageBean.setMaxPage(page*10);
List<Conch> list = adminService.findConch(pageBean, ckey);
图5.29神奇树洞管理首页界面
神奇树洞搜索:在神奇树洞管理首页中,考虑到神奇树洞数量多不好查找的问题,因此设置了搜索功能,管理员可以通过在神奇树洞搜索框中输入神奇树洞内容中的关键字来搜索神奇树洞问题,在展示搜索到的结果时会将搜索关键字使用红色标注出来,方便查看。具体页面如图5.30所示。在后台代码中,当用户输入关键字点击搜索时,浏览器发送请求到控制器中指定方法接收,在Controller中调用Service层中对应的方法处理业务逻辑,然后在Service层中调用Dao层接口通过模糊查询在数据库神奇树洞表中查找对应的神奇树洞信息,最后在Controller中将查找到的神奇树洞信息响应给浏览器,在页面中通过c标签遍历展示数据。因为系统使用一样的分页方法,因此不做赘述。核心代码如下:
if(key == null){
nkey = "1=1";
}else{
nkey = "CONCHBODY like '%"+key+"%'";
}
System.out.println(nkey);
list = adminDao.findConchByKey(nkey, pageBean.getMinPage(), pageBean.getMaxPage());
list = FaceFormat.conchFormt(list);
图5.30神奇树洞搜索界面
6系统测试
6.1 系统测试综述
代码编写阶段主要采用了单元测试来测试代码是否存在缺陷,系统的功能能否正常运行,软件能否达到预期目的,在软件系统完成后编写相应模块的测试案例,根据测试案例中的步骤来测试系统中是否存在缺陷,同时采用黑盒测试和白盒测试来完善系统功能,优化软件代码,提高软件系统的质量。
省略
7 总 结
时光荏苒,岁月如梭,转眼之间为期半年的毕业设计以及论文的编写终于落下帷幕,回顾毕业设计的每一个阶段都使我受益匪浅,在毕设初期,经过了长达一周的深思熟虑之后我决定将B/S微博系统作为我这次毕业设计和论文的选题,因为平时对微博的接触以及近几年微博的火热程度,使我对微博系统的具体功能和优缺点都有了一个全体的把控,这也使得在之后系统功能设计时能够更加的得心应手,在毕业设计中期时进入代码编写阶段时,我选择了J2EE体系开发Web项目的B/S微博,使用面向对象语言JAVA作为开发语言,使用个人熟练掌握的SSM框架来搭建系统,SSM框架强大的功能减少了大量的冗余代码,使得系统代码的编写更加轻松,提高了系统的开发效率,然而开发一个系统并不是那么简单就能完成,在代码的编写阶段,问题接连出现,但在指导老师的指导下以及自己通过网上查阅资料,最终解决了这些问题,提高了自己代码的编写能力,同时也提高了自我学习能力,这对以后的生活学习和工作中都有着非同寻常的意义,在项目编写完成后的测试阶段,之前在编写阶段没有被发现的系统缺陷逐渐跃出水面,在每一次修复这些问题的时候,我都能感觉到自己的能力在慢慢提高,一个没有缺陷的系统是不存在的,经过对测试用例中的测试方案一一测试,然后修复掉一个又一个的缺陷后,微博系统中大多数可见性高的BUG都被修复了,但是在之后的使用中还会不断的完善系统让它变的更加成熟,而不单单只是作为一份毕设设计而存在。
在这次毕业设计系统的开发中也让我看到了自身的一些问题,例如前端技术的不熟练导致在前台页面的修改和开发中浪费了大量的时间,微博系统中关键性的用户交互不够美观,用户体验性差,以及在系统类设计时没能正确的把控全局,设计出合理的接口,只能在后期代码编写阶段中不断的去完善。
参考文献
[1] 贾文潇,邓俊杰. 基于Java的Web开发技术浅析[J]. 电子测试,2016
[2] 李传扬. 微博分析系统的设计与实现[D]. 北京邮电大学 2015
[3] 刘运臣. 网站设计与建设[M]. 清华大学出版社, 2008
[4] 秦雅华. 基于WEB2.0的微博网站的设计与实现[D]. 北京工业大学 2012
[5] 陈玲,夏汛. 利用Mybatis的动态SQL实现物理分页[J]. 数字技术与应用. 2011(11)
[6] 萨师煊,王珊. 数据库系统概论(第三版)[M].北京:高等教育出版社,1998
[7] 基于Java的数据库访问技术研究[J]. 科技资讯. 2009(04)
[8] 张峰. 基于Ajax技术与J2EE框架的Web应用研究与实现[D]. 中国地质大学 2008
[9] 基于Java多线程技术的网络编程[J]. 电脑编程技巧与维护. 2009(22)
[10] 李威. 一种小型实用即时网络聊天通讯系统的设计[J]. 长江大学学报(自然科学版). 2011(12)
[11] 钟睿祺. 基于微博嵌入小伙伴阅读网的分析与设计[D]. 华南理工大学 2011
[12] 王少锋编著.面向对象技术UML教程[M]. 清华大学出版社, 2004
[13] 徐春绵. 关于网站开发相关问题的探究[J]. 通讯世界. 2015(09)
[14] 张宇,王映辉,张翔南. 基于Spring的MVC框架设计与实现[J]. 计算机工程. 2010(04)
[15] 胡以谰,张立平. J2EE开发模式的选择[J]. 计算机系统应用. 2002(08)
[16] 王丽爱. 《Java程序设计》课程网站的设计与实现[J]. 电脑知识与技术. 2016(27)
[17] 荣艳冬. 关于Mybatis持久层框架的应用研究[J]. 信息安全与技术. 2015(12)
致 谢
省略
5、资源下载
本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。
序号 | 毕业设计全套资源(点击下载) |
---|---|
本项目源码 | 基于java+SSM+Oracle的微博系统设计与实现(源码+文档)_java_BS架构_微博系统.zip |