基于ssm的论坛系统的设计与实现【附源码】

60 篇文章 5 订阅
59 篇文章 3 订阅

基于ssm的论坛系统的设计与实现

摘 要

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

早期的网络论坛系统已经诞生一段时间,随着互联网技术的发展,它已经从最初的简单电子公告板系统变成了一种丰富的论坛系统社区模型。人们通过论坛系统进行信息的获取、发布和交流已经成为一种普遍的社交方式,因为人们可以从论坛中获取一些新知识和启发,还可以发表自己的见解,和他人分享快乐。在信息化时代背景下,论坛可以提高人们工作学习的效率,为人们提供了一个学习和交流的平台,增加了社交渠道,改变了人与人之间的联系方式。本论坛系统针对的目标群体是在校大学生或者初入职场的技术人员而进行设计,意在为这些特定用户群体提供一个能畅享交流的平台。
本系统是基于B/S模式和MVC模式进行设计开发,将论坛系统业务逻辑、数据模型、数据展示进行了分离。系统采用Spring、SpringMvc、Mybatis框架进行开发,前端的页面展示使用了Bootstrap和JQuery框架还有JSP技术。数据存储使用MySQL数据库,然后采用Tomcat作为wed服务器。系统开发按照软件工程的思想进行分析设计,主要完成的功能包括帖子模块、用户模块、关注模块、收藏模块、评论模块、管理员管理模块。
本文对论坛系统需求分析、系统设计、系统实现、系统测试做了详细介绍,系统具有简单易用、界面友好以及可维护性高的特点,系统经过测试后运行良好。

关键字: 论坛系统;B/S模式;MVC模式;SSM;MySQL

The Design and Implementation of Forum System Based on ssm
Student: Teacher:

Abstract:The early Internet forum system has been born in some time. With the development of Internet technology, it has changed from the original simple electronic bulletin board system to a rich forum system community model. People use the forum system to obtain, publish and Communication has become a common way of socializing, because people can get some new knowledge and inspiration from the forum, and they can also express their opinions and share happiness with others. In the context of the information age, the forum can improve the efficiency of people’s work and study Provides a platform for people to learn and communicate, increases social channels, and changes the way people connect with each other. The target group of this forum system is designed for college students or technicians who are new to the workplace, and is intended to provide a platform for these specific user groups to enjoy communication.
This system is designed and developed based on B / S mode and MVC mode. The business logic, data model, and data display of the forum system are separated. The system is developed using Spring, SpringMvc, and Mybatis frameworks. The front-end pages to display uses Bootstrap and JQuery frameworks. There is also JSP technology, the data storage uses MySQL database, and then uses Tomcat as the wed server. The system development is analyzed and designed according to the software engineering idea. The main completed functions include post module, user module, attention module, collection module, comment module, management Management module.
This article introduces the forum system requirements analysis, system design, system implementation, and system testing in detail. The system has the characteristics of easy to use, friendly interface, and high maintainability. The system runs well after testing.

Key words:Forum System;B/S mode;MVC mode;SSM;MySQL

  1. 目 次

    摘 要 I Abstract: II

    1 绪论 1
    1.1 研究背景和意义 1
    1.2 国内外研究现状 1
    1.3 本文主要研究内容 2
    1.4 论文结构安排 2
    1.5 本章小结 2 2 相关技术与开发工具介绍 3
    2.1 相关技术简介 3
    2.1.1 JSP和Bootstrap技术简介 3
    2.1.2 B/S结构简介 3
    2.1.3 MVC模式 3
    2.1.4 SSM框架 4
    2.2 MySQL数据库简述 4
    2.3 开发工具概述 4
    2.4 本章小结 5 3 系统需求分析 6
    3.1 需求分析概述 6
    3.2 功能性需求分析 6
    3.2.1 用户模块 6
    3.2.2 评论模块 7
    3.2.3 收藏模块 7
    3.2.4 帖子模块 7
    3.2.5 关注模块 8
    3.2.6 管理员管理模块 8
    3.3 非功能性需求分析 9
    3.3.1 系统兼容性需求 9
    3.3.2 技术可行性 9
    3.3.3 经济可行性 9
    3.4 本章小结 10 4 系统设计 11
    4.1 系统技术架构设计 11
    4.2 系统整体功能结构设计 11
    4.3 系统功能详细设计 12
    4.3.1 用户模块功能设计 12
    4.3.2 帖子模块功能设计 13
    4.3.3 关注模块功能设计 14
    4.3.4 收藏模块功能设计 15
    4.3.5 评论模块功能设计 16
    4.3.6 管理员管理系统功能设计 16
    4.4 数据库设计 18
    4.4.1 概念设计 18
    4.4.2 逻辑设计 19
    4.5 本章小结 22 5 系统实现 23
    5.1 系统功能实现 23
    5.1.1 用户模块功能实现 23
    5.1.2 帖子模块功能实现 30
    5.1.3 评论模块功能实现 36
    5.1.4 关注模块功能实现 37
    5.1.5 收藏模块功能实现 40
    5.1.6 管理员管理系统功能实现 43
    5.2 本章小结 47 6 系统测试 48
    6.1 测试方法 48
    6.2 系统功能性测试 48
    6.2.1 帖子模块功能测试 48
    6.2.2 用户模块功能测试 48
    6.2.3 评论模块功能测试 49
    6.2.4 关注模块功能测试 49
    6.2.5 收藏模块功能测试 49
    6.2.6 管理员管理系统功能测试 50
    6.3 本章小结 50 7 总结与展望 51
    7.1 总结 51
    7.2 展望 51

    致 谢 52 参考文献 53

1 绪论

1.1 研究背景和意义

网络论坛系统已经产生一段时间,它最开始只是一个简单的电子公告板系统,论坛简述BBS,“Bulletin Board System”为它的英文名称,中文称之为“电子公告板”,是一款基于网络的应用软件,同时它也是一种在互联网上使用较广的信息服务系统[1]。随着时代的变迁,人们生活水平和现代互联网技术的快速发展,互联网已经普及到人们的日常学习、工作和生活当中,而过去很多网站系统内容都要用户注册登录后才能查阅,随着现在网络技术的进步,只需要打开相关网站系统,就可以浏览相关信息,给人们带来了很多的方便,人们通过网络可以分享自己的感想、知识、结交朋友,而网络社交平台多种多样,已经成为人们日常生活中必不可少的一部分,而论坛系统就是其中一种,论坛系统已经变得越来越普及,人们通过论坛系统进行信息的获取、发布和交流已经成为一种普遍的社交方式,因为人们可以从论坛中获取一些新知识和启发,还可以发表自己的见解,和他人分享快乐[2]。在信息化快速普及的时代背景下,论坛能够为人们提高工作学习的效率,我国目前知名的论坛系统有开源中国、知乎、CSDN、新浪等大型论坛,国外也有Facebook、twitter等广受群众喜爱的论坛,论坛为人们搭建了一个学习与交流的平台,增加了社交渠道,改变了人与人之间的联系方式。
本课题设计实现的论坛系统主要面向用户群体是在校大学生或者初入职场的技术人员,论坛群体有针对性,不像其他大型论坛一样涉及用户领域广泛,通过论坛浏览他人发表的文章可以从中获取一些感悟,使用户能共享信息,互相学习相关知识,分享学习心得和见解;其次系统采用软件工程的开发理念和流程来进行系统开发,让系统拥有可扩展性强、系统可复用性高、后期维护简单的特性。因此,设计和实现这样一个论坛系统是必要的。

1.2 国内外研究现状

国外的论坛系统诞生时间比较早,它可以追溯至20世纪80年代初,当时是由一位美国人开发的公告板程序,利用其自身的消息互传功能,让消息传递成为一种可能,当时需要彼此约定时间来通过邮件进行消息的传递,那是最早的论坛系统原型,当时的论坛系统只是用来发布信息,进行简单的单一话题交流,以及用来提出问题、解决问题[3]。随着互联网技术的发展,目前产生了诸如Facebook、twitter等论坛交流系统,国外的BBS论坛注重的是发表帖子的作者和回复帖子的读者关于某些事情的见解想法,对于国内的BBS,比较看重的是彼此在论坛上进行交流的方式[4]。目前国外对论坛系统的研究暂时是对人际关系等方面进行研究;国内大陆最早的论坛网站是北京长城站,它建于1991年,在当时互联网尚未普及人们的情况下,每天的访问量很低,只有十几个人[5]。现在国内的论坛系统,已经从最初的单一发帖交流功能随着互联网Web2.0技术的出现和推广,快速发展演变成具有多元化的功能论坛系统,社区论坛互动不断推出新的方式,当下除了论坛系统外,还有多元化的信息传输平台,比如QQ、微信、微博等平台,目前国内论坛系统除了一些综合类的论坛外还出现了各大高校的论坛,例如水木清华、北大未名、北邮人论坛等,信息化时代背景下,论坛系统已经逐渐成为目前互联网重要的应用之一[6]。国内目前对论坛系统的研究体现在研究论坛系统的发展历史、操作应用、研究论坛系统主要面对的用户群体、以及研究论坛系统对人们生活和日常交流所产生的改变[7]。

1.3 本文主要研究内容

本文研究的内容是开发出一个方便在校大学生或者初入职场的技术人员进行学习和交流的论坛系统平台,系统采用B/S模式实现,其优点是通用性强,比较简单,能让用户在浏览器和服务器之间可以进行动态的交互。本文主要介绍了该论坛系统分析、设计、实现的整个过程,需要完成的论坛系统包含前台用户系统和后台管理系统,其中前台用户系统功能包括用户模块、帖子模块、关注模块、评论模块、收藏模块,后台管理系统功能包括板块管理、帖子管理、用户管理。研究内容主要按照软件工程开发思想,进行系统需求分析,介绍了系统的功能需求、系统数据库设计、系统结构设计、系统编码实现、系统测试。

1.4 论文结构安排

本课题论文总体分为七章,主要介绍了系统的开发背景、采用的技术、需求分析、系统设计和实现、系统测试、最后进行了总结。结构以及内容具体安排如下:
第一章绪论,描述了课题的研究背景和意义、国内外研究现状、本课题的研究内容、介绍了论文的结构。
第二章相关技术和开发工具介绍,主要简述了开发论坛系统中使用到的关键技术以及开发过程用到的开发工具。
第三章系统需求分析,主要简述了系统的整体需求和功能性需求分析。
第四章系统设计,主要进行系统的功能模块设计和系统数据库设计。
第五章系统实现,主要简述系统主要功能模块实现过程。
第六章系统测试,对系统进行功能性测试。
第七章总结与展望,对本次系统开发进行总结,并做出对系统的未来展望。

1.5 本章小结

本章主要介绍了论坛系统的研究背景和研究现状,并介绍了论坛系统的主要目标和拟解决的问题,然后对论文主要研究的内容和组织结构进行了整体概述。

2 相关技术与开发工具介绍

2.1 相关技术简介

本节主要对开发论坛系统使用到的技术进行介绍,主要介绍B/S体系结构、MVC模式、以及SSM框架,还介绍了用于存储数据的MySQL数据库,并对开发工具进行简单描述。
2.1.1 JSP和Bootstrap技术简介
JSP是Java Server Page的缩写,它是基于Java Servlet和整个Java体系的动态网页开发技术,由HTML代码和嵌入的JAVA代码构成,利用该技术可以构建安全、跨平台的动态网站,它以Java技术为基础,然后做了许多改变,拥有动态页面和静态页面分离、无需依赖硬件平台以及编译后运行的优点。它能让动态网站的网页代码编写变得更加容易、在功能方面更强、可扩展性更好,然后能支持可重用的组件,比如JavaBean组件,可以利用这些组件去执行应用程序中复杂的处理,由于是基于Java技术的,所以能进行移植和重用,并且一次编写,能多处运行。同时拥有丰富的标签库,利用这些标签可以对JavaBean组件进行访问和实例化[8]。
Bootstrap技术它是由Twitter设计并开发的一种网页开发框架,它其中包括了HTML、CSS等技术。这个框架的设计目的是用来解决不同设备下的兼容问题,利用其开发的网页能适应不同的设备,从而让网页开发变得简单,基于这个框架下开发的网页具有可维护性,它还提供了多样性的开发模块,能更好的帮助开发人员做好网页开发工作,因此选择该框架作为论坛系统的网页开发框架能提高开发效率和减少工作量[9]。

2.1.2 B/S结构简介

B/S体系结构,它是一种浏览器服务器结构,由C/S结构演变而来,它无需客户端程序,这能降低软件开发成本,通过浏览器向wed服务器进行数据请求,主要的业务逻辑都在wed服务器端进行实现,wed服务器处理用户的访问请求,然后操作数据库取出相关数据,再把结果返回给用户端浏览器进行回显[10]。这种结构的优点就是能让用户随时进行软件操作,用户端只需要安装有浏览器就可以访问系统网站数据并获取相关结果,给用户的交互体验良好,通过这种结构的使用能减轻软件开发人员的压力,它具有易扩展、维护简单、分布性的优点,对用户端的硬件配置要求不高。B/S结构示意图如图2-1所示:

图2-1 B/S结构示意图

2.1.3 MVC模式

MVC是Model、View、Controller三个单词的缩写,它是一种设计模式,由模型、视图、控制器组成,其中模型用来存储数据以及处理用户的业务逻辑请求,模型能为多个视图提供数据,它的代码只需要编写一次就能被多个视图重用,这样可以减少代码的重复性。控制器则用来进行请求和数据的转发,它接收请求后再把请求转发给相关模型进行处理,并把处理后的相关结果返回给相关视图进行显示,视图是用来向控制器提交请求数据以及进行结果显示的,这三个部分用低耦合的方式进行共同工作,以便提高应用程序的扩展性和维护性。MVC模式具有快速部署、较低的生命周期成本,低耦合以及高可用等特点,因此,采用MVC模式进行论坛系统的开发,能够提升开发效率以及方便后期的测试[11]。

2.1.4 SSM框架

SSM框架是一种轻量级的开发框架,由Spring、SpringMVC、MyBatis三个框架组成,它是一种典型的MVC框架[12],其中Spring框架通过注解和映射来管理SpringMVC和MyBatis框架,它提供面向切面编程和控制反转机制,以及能整合多种持久化框架,整合了视图层、业务层、持久层的资源,能够为企业级应用开发提供更多的可能;而SpringMVC框架是基于MVC思想的应用框架,它是Spring的一个子框架,用来控制业务之间的跳转,很好的将模型、视图、控制器进行分离,其包含有多种视图技术,主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成;然后Mybatis框架是持久层框架,通过配置文件与数据库进行映射,对数据写入或取出,它包含DAO组件和SQL Map组件两大类,其中DAO组件把应用程序的数据访问层和持久层的表示方式和位置进行抽象化,让其分离应用程序的业务逻辑,而SQL Map组件通过XML配置文件或者注解的方式把JavaBean、XML、Map映射成SQL语句,然后通过执行SQL语句把结果映射成Java对象并返回,SQL Map组件能很大程度上减少了访问数据库的代码[13]。

2.2 MySQL数据库简述

MySQL数据库是一种开源免费且属于轻量级的关系型数据库,它具有体积小、速度快、成本低的特点,能够很好的应用于中小型网站开发中,并且还为多种编程语言提供了API,很多中小型网站在满足其性能的前提下为了减少开发成本,都会选择MySQL数据库进行数据存储,在安全方面,它允许用户进行系统的权限设置,并且采用了线程技术,能让系统运行速度更快,因此综合这些特点,在进行论坛系统开发时采用MySQL数据库进行数据存储是一个好的选择[14]。

2.3 开发工具概述

在开发工具选择方面,后台功能开发依然是选择目前较为广泛使用的Eclipse,它相比MyEclipse的好处是它属于免费的,而且占用内存相对小一些,MyEclipse大多数现在都会收费其破解版也是十分难找,并且MyEclipse是封装好了的,比较笨重不利于学习者学习掌握,Eclipse与MyEclipse两者的功能并没有太大区别,综合考虑后选择Eclipse作为后台开发工具;而在前台开发方面选择的工具是HBuilder,这款工具因为其良好的界面以及操作,在编码方面能进行提示,并且支持随时预览网页效果,因其能给网页开发人员带来良好的体验并能提高工作效率,所以它也是目前较为受欢迎的网页开发工具,因此在前台网页开发方面选择它作为开发工具。

2.4 本章小结

本章主要介绍了开发论坛系统所采用的相关技术,包括前台和后台开发技术,并对用来储存数据的关系型数据库MySQL进行了介绍,还对开发工具进行了简要描述,基于这些技术的了解和描述,对接下来的需求分析阶段以及后续系统设计和实现方面起到很大的帮助。,

3 系统需求分析

3.1 需求分析概述

需求分析包括功能性需求和非功能性需求分析,它在软件开发过程中是最重要的一个环节,只有需求分析清楚了,后续的开发过程才会顺利进行,在需求分析阶段,主要是通过前期调研和用户咨询沟通,得到将要开发的软件需求功能,然后分析出软件需要解决的问题,因此这个阶段是系统设计的重要基础和条件。本章通过前期网上的相关论坛系统资料调查收集和向相关论坛用户群体进行询问,得出将要开发的论坛系统的基本功能要求,然后通过用例图分析介绍对系统功能性需求进行了说明,同时还分析介绍了系统的非功能性需求。

3.2 功能性需求分析

通过前期的调查分析,了解到使用本系统的主要角色有游客、注册用户、管理员,其中游客只具备有贴子浏览和查看他人动态的权限,可通过注册成为论坛用户,然后得出本论坛系统应该要包含用户系统和管理员管理系统这两大子系统,其中用户系统需要完成的功能包括用户模块、评论模块、帖子模块、收藏模块、关注模块;而管理员管理系统则应该完成的功能包括板块管理、帖子管理、用户管理三大模块。

3.2.1 用户模块

用户模块主要包括的功能有用户注册、登录、退出、个人主页信息查看、他人主页信息查看、个人资料编辑、基本信息设置;其中登录、退出等功能必须要在用户注册的前提下才能进行操作,注册需要输入用户名、密码、邮箱信息,个人主页查看包括动态、回复、评论、收藏、关注信息查看,他人主页查看只能查看他人动态,个人资料编辑包括用户头像和姓名等信息的修改,基本信息设置主要是用户名和密码以及邮箱的修改。用户模块用例图如图3-1所示:

图3-1 用户模块用例图

3.2.2 评论模块

评论模块主要功能有发表评论、查看评论、删除评论,其中发表和删除评论的前提是用户已经登录,查看评论包含自己所发帖子评论和他人帖子下的评论。评论模块用例图如图3-2所示:

图3-2 评论模块用例图

3.2.3 收藏模块

收藏模块主要包括功能有帖子收藏、取消收藏、查看收藏信息,这些操作的前提都是要先登录系统才能进行,收藏模块用例图如图3-3所示:

图3-3 收藏模块用例图

3.2.4 帖子模块

帖子模块需要完成的功能包括帖子浏览、搜索、发表、删除、修改,其中首页所有帖子浏览和搜索无需登录就可以进行操作,搜索帖子实现通过帖子标题进行模糊查询,而帖子发表、删除、修改需要先登录系统后才能进行,帖子发表可以为帖子增加配图,一条完整的帖子包括帖子标题、所属板块、发表时间、帖子内容、配图等信息,可以修改个人帖子以及删除所发表的帖子,删除所发表的帖子会把帖子的评论和收藏信息进行删除,帖子模块用例图如图3-4所示:

图3-4 帖子模块用例图

3.2.5 关注模块

关注模块功能包括关注他人、取消关注、查看关注信息,这些功能的前提是用户注册并登录到系统,其中当用户是自己时,不能关注自己,只能关注他人,关注模块用例图如图3-5所示:

图3-5 关注模块用例图

3.2.6 管理员管理模块

管理员管理主要包括用户管理、帖子管理、板块管理功能,其中用户管理主要包括查看和删除功能、帖子管理主要是进行审核和查看、板块管理包括新增板块、删除板块、修改板块、查看板块功能,这些功能的操作前提是需要使用管理员账号进入到后台管理界面才能进行操作。管理员管理模块用例图如图3-6所示:

图3-6 管理员管理模块用例图

3.3 非功能性需求分析

3.3.1 系统兼容性需求

系统兼容性需求是指系统能够在目前主流的浏览器上都能稳定运行,视觉上的差异没有太大变化,通过前期调研,为了能让系统兼容目前主流的浏览器,给用户更好的体验,系统在设计实现过程中通过前端的页面设计和优化来让系统兼容IE、谷歌、火狐等浏览器,保证在视觉上差异不大。

3.3.2 技术可行性

随着互联网技术的发展,目前有很多成熟的开发技术可以进行论坛系统的开发,从硬件上来说,大容量高速的硬盘以及网络速度的提高,目前的硬件水平是能够满足开发和用户需求的,这为软件开发提供了基础保障。从软件方面来说,开发该系统所需的编程语言环境和数据库技术都已经很成熟,能够为大量的存储数据提供支撑,该系统采用Spring、SpringMvc、MyBatis框架进行后台开发,减少了很多重复性工作,其中SpringMvc框架很好的将模型、视图、控制器进行分离,减少代码耦合、提高代码复用性,而Spring框架通过注解和映射对SpringMvc、MyBatis框架进行了很好的管理,然后使用MyBatis框架进行数据持久化操作,减少开发人员的工作量。所以在这些软硬件技术的支持下,这些条件是能够满足本论坛系统开发的。

3.3.3 经济可行性

通过前期的调查分析,开发本系统所需的参考资料以及软硬件资源都是可以能够获取的,参考资料可以通过书籍或者是网络工具获取,软硬件资源同样不需要花费很多经济成本,而对于用户来说,用户只需要在自己本地安装有wed浏览器就可以进行对论坛系统的访问,然后可以进行登录、发帖等操作。因此开发该系统的经济成本很低,所以综合来看,开发该系统是可行的。

3.4 本章小结

本章通过对系统进行功能性需求分析和非功能性需求分析,来完成整个论坛系统的需求分析。功能性需求分析通过对系统的各个功能模块进行分析讨论,然后通过系统功能模块用例图进行描述。非功能性需求分析从经济可行性、技术可行性以及系统兼容性这三方面来对系统进行一个详细介绍描述,最后完成了论坛系统的整体需求分析,为后续的系统设计提供了良好的基础。

4 系统设计

4.1 系统技术架构设计

本系统基于B/S体系结构和MVC编程思想进行设计开发,前端采用JSP、JQuery、BootStrap技术进行开发,后台使用Java编程语言,基于SSM框架进行开发,系统分为三层体系结构,上层是表现层,中间层是业务逻辑层,底层是持久层,以TomCat8.5作为wed服务器,采用MySQL作为数据存储的数据库,Eclipse作为主要开发工具,通过浏览器和服务器进行数据交换,从而实现动态页面显示。系统架构图如图4-1所示:

图4-1 系统架构图

4.2 系统整体功能结构设计

本论坛系统完成的功能包含用户系统和管理员管理系统这两大子系统,其中用户系统需要完成的功能包括用户模块、评论模块、帖子模块、收藏模块、关注模块;而管理员管理系统则应该完成的功能包括板块管理、帖子管理、用户管理三大模块。用户系统功能结构图如图4-2所示:

图4-1 用户系统功能结构图
管理员管理系统功能结构图如图4-2所示:

图4-2 管理员管理系统功能结构图

4.3 系统功能详细设计

本节主要对系统功能模块详细设计过程进行描述,主要有前台用户系统中的用户模块、帖子模块、关注模块、收藏模块、评论模块以及后台管理系统中的管理员管理模块设计,下面通过流程图对每个功能模块进行分析设计。

4.3.1 用户模块功能设计

用户模块需要完成的功能有用户注册、登录、退出、个人主页信息查看、他人主页信息查看、个人资料编辑、基本信息设置;其中登录、退出等功能必须要在用户注册的前提下才能进行操作,注册需要输入用户名、密码、邮箱信息,注册用户会进行验证,不允许注册已有的用户名,个人主页信息查看包含有动态、关注信息、收藏信息等内容,个人资料编辑可以修改用户头像、简介等信息,基本信息设置可以修改密码等信息;用户模块主要参与者是游客和已注册用户,用户模块功能流程图如图4-3所示:

图4-3 用户模块功能流程图

4.3.2 帖子模块功能设计

帖子模块需要完成的功能包括帖子浏览、搜索、发表、删除、修改,其中首页所有的帖子浏览和搜索无需登录在主界面就可以进行操作,主界面的搜索帖子功能实现通过帖子标题进行模糊查询,而帖子发表、删除、修改需要先登录系统后才能进行,帖子发表可以添加配图、选择所属板块等信息操作,帖子删除会删除该帖子下的所有评论和收藏信息,帖子修改可以更新帖子标题和所属板块等信息,帖子模块主要用于用户对帖子进行一系列操作,帖子功能流程图如图4-4所示:

图4-4 帖子功能流程图

4.3.3 关注模块功能设计

关注模块功能包括关注他人、取消关注、查看关注信息,这些功能的前提是用户注册并登录到系统,其中当登录用户是发帖人时,不能关注自己,只能关注他人,关注他人和取消关注他人都会更新个人主页的关注列表,在个人主页的关注列表中可以看到被关注者有多少人关注,还可以查看有多少人关注自己,还可以点击被关注者头像查看他人主页信息,关注模块功能流程图如图4-5所示:

图4-5 关注功能流程图

4.3.4 收藏模块功能设计

收藏模块主要包括完成帖子收藏、取消收藏、查看收藏信息三个子功能,这些操作的前提都是要先登录系统才能进行,收藏模块功能流程图如图4-6所示:

图4-6 收藏模块功能流程图

4.3.5 评论模块功能设计

评论模块主要完成发表评论、查看评论、删除评论三个子功能,其中发表评论的前提是用户已经登录,删除评论也是在登录后才能进行操作。评论模块功能流程图如图4-7所示:

图4-7 评论模块功能流程图

4.3.6 管理员管理系统功能设计

管理员管理系统主要完成用户管理、帖子管理、板块管理功能这些功能的操作前提是需要使用管理员账号进入到后台管理界面才能进行操作。管理系统管理员登录流程图如图4-8所示:

图4-8 管理系统管理员登录流程图
用户管理主要完成用户信息查看和删除用户功能,其中删除用户会给予相关提示询问是否删除,删除后更新用列表。用户管理流程图如图4-9所示

图4-9 用户管理流程图
帖子管理包含帖子查看和审核,审核通过更新状态来实现。帖子管理流程图如图4-10所示:

图4-10 帖子管理流程图
板块管理包含新增、修改、删除、查看四个子功能模块,其中删除板块操作会给予提示询问,是否确定删除,如果确定就删除该板块,取消就返回板块列表。板块管理流程图如图4-11所示:

图4-11 板块管理流程图

4.4 数据库设计

数据库是整个论坛系统的基础,负责存储系统的所有数据,合理的数据库设计能够保证系统稳定正常运行,数据库设计包含概念设计和逻辑设计,其中概念设计是根据系统结构需求分析出相关的实体,并通过E-R图来构建好实体间的联系,而逻辑设计是把概念设计转换为相应的数据模型表结构[15]。

4.4.1 概念设计

依据系统的需求分析和功能设计,分析出系统组成的实体有用户、帖子、管理员、收藏、关注、板块、评论、头像。这些实体之间的联系为:一个用户对应一个头像,一个头像对应一个用户,一个用户可以发表多条帖子,一条帖子对应一个用户,一个用户可以发表多条评论,一条评论对应一个用户,一个用户可以关注多个用户,一个用户可以被多个用户关注,一个用户可以收藏多条帖子,一条帖子可以被多个用户收藏,一条帖子可以有多条评论,一条评论对应一条帖子,一个板块可以有多条帖子,一条帖子对应一个板块,管理员管理多条帖子、多个用户、多个板块。
系统E-R图如图4-12所示:

图4-12 系统E-R图

4.4.2 逻辑设计

按照前面分析出的系统实体之间的E-R图关系,可以把实体E-R图转换成对应的数据库表,本系统共涉及到8张表,分别是用户信息表(user)、帖子信息表(article)、评论信息表(comment)、板块信息表(plate)、用户头像信息表(via)、关注信息表(attention)、收藏信息表(collect)、管理员信息表(admin)。数据库表结构设计如下:
(1)用户信息表(user)主要由用户id、姓名、年龄、性别、密码、邮箱、住址、简介、注册时间这些字段组成,一条记录表示一个用户的信息。具体表结构如表4-1所示:
表4-1 用户信息表(user)
字段名 数据类型 是否允许为空 说明 备注
userid int(11) 否 用户id 主键
username Varchar(45) 否 用户姓名
age int(11) 是 用户年龄
password varchar(45) 是 密码
sex varchar(255) 是 性别
email varchar(45) 是 邮箱
family varchar(45) 是 住址
intro varchar(255) 是 简介
time timestamp 否 注册时间
(2)帖子信息表(article)主要由帖子编号、标题、内容、配图、板块名、发表时间、发帖人id、发帖人姓名、审核状态(0为待审核,1为通过审核,2为未通过审核,默认为0)这些字段组成,一条记录表示一条帖子信息。具体表结构如表4-2所示:
表4-2 帖子信息表(article)
字段名 数据类型 是否允许为空 说明 备注
fid int(11) 否 帖子id 主键
titles varchar(100) 否 帖子标题
fcontent varchar(2000) 否 帖子内容
photo varchar(255) 是 帖子配图
bname varchar(255) 否 所属板块名
time timestamp 否 发帖时间
userid int(11) 否 发帖人id 外键
username varchar(45) 否 发帖人姓名
status int(11) 否 帖子审核状态(0为待审核,1为通过审核,2为未通过审核,默认为0)
(3)评论信息表(comment)主要由评论编号、内容、评论者id、被评论帖子编号、评论时间这些字段组成,一条记录表示一条评论信息。具体表结构如表4-3所示:
表4-3 评论信息表(comment)
字段名 数据类型 是否允许为空 说明 备注
pid int(11) 否 评论id 主键
pcontent varchar(400) 否 评论内容
userid int(11) 否 评论者id 外键
fid int(11) 否 被评论帖子id 外键
time timestamp 否 评论时间
(4)板块信息表(plate)主要由板块编号、名称、创建时间这些字段组成,一条记录表示一个板块信息。具体表结构如表4-4所示:
表4-4 板块信息表(plate)
字段名 数据类型 是否允许为空 说明 备注
bid int(11) 否 板块id 主键
bname varchar(255) 否 板块名字
btime timestamp 否 板块创建时间
(5)收藏信息表(collect)主要由收藏编号、收藏者id、被收藏帖子id这些字段组成,一条记录表示一个用户对一条帖子的收藏信息,具体表结构如表4-5所示:
表4-5 收藏信息表(collect)
字段名 数据类型 是否允许为空 说明 备注
sid int(11) 否 收藏id 主键
userid int(11) 否 收藏者id 外键
fid int(11) 否 被收藏帖子id 外键
(6)关注信息表(attention)主要由关注编号、关注者id、被关注者id这些字段组成,一条记录表示一个用户对另一个用户的关注信息,具体表结构如表4-6所示:
表4-6 关注信息表(attention)
字段名 数据类型 是否允许为空 说明 备注
gid int(11) 否 关注id 主键
userid int(11) 否 主动关注者的id 外键
beuserid int(11) 否 被动关注者的id 外键
(7)用户头像信息表(via)主要由用户id、用户头像这些字段组成,一条记录表示一个用户的头像信息。具体表结构如表4-7所示:
表4-7 用户头像信息表(via)
字段名 数据类型 是否允许为空 说明 备注
userid int(11) 否 用户id 主键 外键
photo varchar(255) 否 用户头像
(8)管理员信息表(admin)主要由管理员编号、管理员姓名、管理员密码、管理员注册时间这些字段组成,一条记录表示一个管理员的信息。具体表结构如表4-8所示:
表4-8 管理员信息表(admin)
字段名 数据类型 是否允许为空 说明 备注
aid int(11) 否 管理员id 主键
aname varchar(255) 否 管理员名称
apassword varchar(255) 否 管理员密码
atime timestamp 否 注册时间
4.5 本章小结
本章通过对论坛系统技术架构、整体功能结构设计、系统功能详细设计以及数据库设计来完成整个系统设计,其中功能详细设计通过系统功能流程图进行描述,而数据库设计通过系统E-R图和数据库表来进行分析描述,系统设计能够为接下来的系统功能实现提供良好的基础。

5 系统实现

5.1 系统功能实现

系统实现主要是按照前期的系统详细设计来进行编码实现,主要介绍每个功能模块的具体实现过程设计,包含有贴子模块、用户模块、评论模块、关注模块、收藏模块、管理员管理这些功能模块。

5.1.1 用户模块功能实现

用户登录功能通过使用已经注册过的账号进行登录,登录界面如图5-1所示:

图5-1 登录界面
首先输入账号信息后,点击登录向UserController的getLoginAjax()方法提交post请求,并向该方法传递name(用户名)、password(登录密码)作为参数,封装在user中;getLoginAjax ()方法在收到请求后,调用UserService的getUser()方法,该方法再调用UserMapper的selectByUser()方法查询用户表user,在UserController中判断数据库查询结果,然后把查询结果返回给前台作出对应页面变化。主要代码如下:
user.setName(request.getParameter(“name”));
user.setPassword(request.getParameter(“password”));
//按用户名密码查询
List listUser = userService.getUser(user);
if (!listUser.toString().equals(“[]”)) {
int userid = listUser.get(0).getUserid();//获取第一个用户的id
String name = listUser.get(0).getName();
String password = listUser.get(0).getPassword();
String email = listUser.get(0).getEmail();
map.put(“userid”, userid);
map.put(“username”, name);
map.put(“password”, password);
map.put(“email”, email);
return “OK”;//返回json数据
用户注册功能通过登录界面的注册链接进行点击触发注册模态框来到注册界面,然后输入相关信息进行注册后获得登录进入系统的普通用户权限,注册界面如图5-2所示:

图5-2 用户注册界面
首先注册界面输入完信息后点击注册按钮,向UserController的setSignUp()方法提交post请求,并向该方法传递name(用户名)、password(登录密码)、email(邮箱)作为参数,封装在user中。setSignUp()方法在接收请求后,首先调用UserService的getUserName方法查询判断该用户名是否已经注册存在,若存在则把查询结果返回给前台并提示用户,若不存在则再调用UserService的setUser()方法,该方法再调用UserMapper的insert()方法向用户表user中新增一条记录,将操作结果返回给前台,若注册成功前台页面自动登录账号,否则提示用户注册失败的相关提示信息。主要代码如下:
user.setName(request.getParameter(“name”));
user.setPassword(request.getParameter(“pass”));
user.setEmail(request.getParameter(“email”));
//判断该用户是否已经存在
if (userService.getUserName(user).toString().equals(“[]”)&&request.getParameter(“name”)!=“”) {
//注册到系统
userService.setUser(user);
//按用户名查询
List listUser = userService.getUserName(user);
int userid = listUser.get(0).getUserid();
String name = user.getName();
String password = user.getPassword();
String email = user.getEmail();
map.put(“userid”, userid);
map.put(“username”, name);
map.put(“password”, password);
map.put(“email”, email);
return “OK”; }
查看个人主页信息通过点击首页登录显示的用户名,然后点击选择我的主页,向UserController的getMyself()方法提交post请求,getMyself()方法在session域里获取读取用户的userid,会将userid作为参数调用UserService的getUserId()方法进行处理,然后返回一个User对象,将结果返回给前台页面,展示出个人信息。个人主页界面如图5-3所示:

图5-3 个人主页界面
主要代码如下:
//获取当前会话的用户id
int userid=(int) session.getAttribute(“userid”);
/按userid查询用户信息/
List myListUser = userService.getUserId(userid);
if (myListUser.get(0).getSex() == null) {
myListUser.get(0).setSex(“保密”); }
if (myListUser.get(0).getIntro() == null) {
myListUser.get(0).setIntro(“无”); }
map.put(“myListUser”, myListUser.get(0));
编辑个人资料包含两方面,一方面是对头像进行修改,另一方面是对年龄、性别、家庭住址、个人简介方面信息修改,在登录状态下进入到我的主页界面中就可以进行相关操作;首先点击编辑资料按钮,在编辑界面进行个人信息更新后,点击保存按钮后向UserController的updateUser()方法提交post请求,并向该方法传递age(用户年龄)、sex(用户性别)、family(家庭住址)、intro(个人简介)作为参数,封装在user中,updateUser()方法在收到请求后,从session域中获取当前登录用户的userid,将参数设置到User对象中并调用UserService的updateUser()方法进行处理,然后将操作结果返回给前台页面作出相应信息变化。编辑个人资料界面如图5-4所示:

图5-4 编辑个人资料界面
主要代码如下:
@RequestMapping(“/updateUser”)
public ModelAndView UpdateUser(User user) {
userService.updateUser(user);
//重定向到getMyself这个方法
return new ModelAndView(“redirect:/userController/getMyself”); }
编辑头像操作,在个人主页中点击头像即可来到更新头像界面,然后重新选择头像,点击保存后,向ViaController的setUserPhoto方法提交post请求,并把头像作为文件的形式上传,setUserPhoto收到请求后,先是封装上传的文件路径,并定义新文件名来避免重复,同时获取上传文件的原始文件名,从session域中获取当前登录用户的userid,将参数设置到Via对象中,然后判断用户是否上传过头像,通过userid作为参数去调用ViaService的getVia方法进行查询,并返回相关查询结果,如果未上传过头像则进行新增操作,Via对象作为参数调用ViaService的setUserPhoto方法去处理;如果已经上传过头像,则进行更新操作,首先获取要删除用户对应的头像的文件名,然后删除原有用户头像,接着就是把Via对象作为参数调用ViaService的updateVia方法进行相关操作。编辑头像界面如图5-5所示:

图5-5 编辑头像界面
主要代码如下:
String filePath = PathUtil.getCommonPath()+PathUtil.getUserPath();
//用于存放新生成的文件名字(不重复)
String newFileName = null;
//只有登录的时候才能进入该页面,故不用判断是否登录,获取用户id,更新Via对象信息
int userid=(int) session.getAttribute(“userid”);
Via via=new Via();
via.setUserid(userid);
// 获取上传图片的文件名及其后缀(获取原始图片的拓展名)
String fileName = file.getOriginalFilename();
//如果该用户还没有上传过头像,则进行新增操作
if (viaService.getVia(userid)==null) {
//选择了头像的情况下
if(!fileName.equals(“”)) {
/*生成新的文件名字(不重复),表示通用唯一标识符(UUID)的类,UUID表示一个128位的值
获取伪随机生成的UUID的静态工厂。 */
newFileName = UUID.randomUUID() + fileName;
// 封装上传文件位置的全路径
File targetFile = new File(filePath, newFileName);
// 把本地文件上传到封装上传文件位置
file.transferTo(targetFile);
via.setPhoto(newFileName);
// 将via保存到数据库
viaService.setUserPhoto(via); }
//如果该用户上传过头像,则进行修改操作
} else {
//选择了头像的情况下
if(!fileName.equals(“”)) {
// 获取要删除用户对应的头像的文件名(通过userid获取头像信息)
String fileNameNew = viaService.getVia(userid).getPhoto();
// 头像上传文件位置的全路径
File targetFile = new File(filePath, fileNameNew);
//删除用户对应的头像图片(实际删除)
targetFile.delete();
//生成新的文件名字(不重复)
newFileName = UUID.randomUUID() + fileName;
// 封装上传文件位置的全路径
targetFile = new File(filePath, newFileName);
// 把本地文件上传到封装上传文件位置
file.transferTo(targetFile);
via.setPhoto(newFileName);
// 将via保存到数据库(修改)
viaService.updateVia(via); }
基本信息设置,点击登录后的用户名选择设置,然后会来到基本信息设置界面,可以进行用户名、密码、邮箱信息的修改,基本信息设置界面如图5-6所示:

图5-6 基本信息设置界面
首先在信息设置界面更新完信息后点击保存按钮后,向UserController的updateUserSetup方法提交post请求,并把用户名(username)、密码(password)、邮箱(email)作为参数传递,封装在User对象中,然后在该方法中获取User对象中的用户名、密码、邮箱并与session域里的用户名、密码、邮箱进行比较,然后通过Article对象修改当前用户所发帖子的用户名和用户id,接着判断是否更改过相关信息,然后把User对象作为参数,通过调用UserService中的updateUserSetup方法,来更新user表信息;然后通过调用ArticleService中的updateArticleSetup方法进行article表中的username修改,主要代码如下:
boolean name=user.getName().equals(session.getAttribute(“username”));
boolean password=user.getPassword().equals(session.getAttribute(“password”));
boolean email=user.getEmail().equals(session.getAttribute(“email”));
//修改当前用户所发帖子的用户名和用户id 同步信息
Article article = new Article();
article.setUserid(user.getUserid());
article.setUsername(user.getName());
if(name && password && email) {
System.out.println(“用户没改动任何信息,不做数据库修改工作。”);
}else{
//1 修改user表
userService.updateUserSetup(user);
//2 修改article表中的username 保证信息同步
articleService.updateArticleSetup(article);
map.put(“username”, user.getName());
map.put(“password”, user.getPassword());
map.put(“email”, user.getEmail()); }
查看他人主页在首页进行帖子浏览时,通过点击用户头像或者名字就可以进行他人主页信息查看,首先在首页点击用户名或者头像时,通过获取userid作为参数,传递给UserController中的getOthers方法,然后判断是不是当前登录用户,如果是的话就跳转到个人主页,不是则通过userid查询用户信息。他人主页界面如图5-7所示:

图5.7 他人主页界面
主要代码如下所示:
//如果该用户是登录用户,则回到“个人主页”
if(session.getAttribute(“userid”)!=null && session.getAttribute(“userid”).equals(userid)) {
return “redirect:/userController/getMyself”;
}else {
//按userid查询用户信息
List othersListUser = userService.getUserId(userid);
//判断个人信息 性别、简介
if (othersListUser.get(0).getSex() == null) {
othersListUser.get(0).setSex(“保密”); }
if (othersListUser.get(0).getIntro() == null) {
othersListUser.get(0).setIntro(“无”); }
map.put(“othersListUser”, othersListUser.get(0));
5.1.2 帖子模块功能实现
帖子搜索主要是在首页顶部进行搜索,通过帖子标题关键字来实现,在搜索框输入相关字段后,点击搜索按钮,向Common中的getArticleTitle方法发起post请求,在该方法中,通过获取articleTitle关键字来作为参数传递给ArticleController中的方法进行查询,主要代码如下:
articleController.getArticleTitle(request.getParameter(“articleTitle”), map);
帖子查看只需要访问系统首页,无需登录就可以对论坛发表的所有帖子进行浏览,首先访问系统首页,然后向Common中的getAll方法发起请求,该方法会通过调用ArticleController的getArticle方法把相关帖子信息查询下来,主要代码如下:
List

listArticle = articleService.getArticle();
map.put(“listArticle”, listArticle);
帖子查看界面如图5-8所示:

图5-8 帖子查看界面
个人主页所发帖子浏览只需登录系统后,点击我的主页,向UserController中的getMyself()方法提交post请求,getMyself()方法在session域里获取用户的userid,会把userid作为参数传递给ArticleService的getArticleId()方法,该方法再调用ArticleMapper的selectByArticleId()方法查询帖子表article,返回一个List

对象,将结果返回给前台页面,遍历展示出帖子信息,个人主页所发帖子浏览界面如图5-9所示:

图5-9 个人主页所发帖子浏览界面
主要代码如下:
List

myListArticles = articleService.getArticleId(userid);
map.put(“myListArticles”, myListArticles);
帖子删除会删除该帖子下的所有评论和收藏信息,在个人主页中,点击动态部分帖子对应删除按钮,然后会给予一个删除提示,如果确定删除的话就向ArticleController中的deleteArticle方法提交post请求,fid(帖子id)作为参数,封装在Article对象中,然后调用CommentService中的getCommentFid方法查询评论总数,通过pid(评论id)进行评论删除,然后删掉帖子配图,再删掉相关收藏信息,最后把帖子从数据库中删除,帖子删除提示界面如图5-10所示:

图5-10 帖子删除提示界面
主要代码如下:
int fid=article.getFid();
int count=commentService.getCommentFid(fid).size();
/* 不能将commentService.getCommentFid(fid).size();放在for()里面
因为每一次commentService.deleteComment(pid)都会删除一条记录,总记录就会少一条,
自然commentService.getCommentFid(fid).size()就会减一。 /
for(int i=0;i<count;i++) {
//为什么用get(0),而不用get(i)?
/
因为每一次commentService.deleteComment(pid)都会删除一条记录,总记录就会少一条,自然之前的get(1)就变成了现在的get(0) /
//以此递推,故为get(0),而不是get(i);
int pid=commentService.getCommentFid(fid).get(0).getPid();
//删除帖子下对应的评论(先删评论再删帖子,原因是先删帖子的话就找不到该帖子的所有评论)
commentService.deleteComment(pid); }
//调用删除帖子对应图片的方法
articlePhotoDelete(fid);
//删除有该帖子id的收藏信息
collectService.deleteCollectFid(fid);
//删除帖子(数据库)
articleService.deleteArticle(fid);
帖子发表在系统首页登录后,可以点击发帖链接会弹出发帖模态框,然后输入相关内容就可以进行发帖,支持配图。首先在该发帖界面输入帖子相关内容,然后点击发帖按钮后,向ArticleController的setArticle方法发起post请求,并向该方法传递titles(标题)、bname(板块)、fcontent(内容)、photo(配图)作为参数,封装在Article对象中,setArticle ()方法在收到请求后,将Article对象传输给ArticleService的setArticle()方法去处理,然后返回结果给前台页面作出相应改变,主要代码如下:
String filePath = PathUtil.getCommonPath()+PathUtil.getArticlePath();
//用于存放新生成的文件名字(为了不重复)
String newFileName = “photo”;
String username=(String) session.getAttribute(“username”);
//用户登录情况下才可发帖
if(username!=null) {
int userid=(int) session.getAttribute(“userid”);
// 获取上传图片的文件名及其后缀(获取原始图片的拓展名)
String fileName = file.getOriginalFilename();
if(!fileName.equals(“”)) {
/
生成新的文件名字(不重复)
UUID 表示通用唯一标识符的类
randomUUID获取随机生成的UUID */
newFileName = UUID.randomUUID() + fileName;
// 封装上传文件位置的全路径
File targetFile = new File(filePath, newFileName);
// 把本地文件上传到指定的封装上传文件位置
file.transferTo(targetFile); }
//将article2和photo整合到article中
Article article = new Article(article2, newFileName);
发帖界面如图5-11所示:

图5-11 发帖界面
帖子修改包含标题、内容、所属板块、配图信息,在我的主页中点击动态部分需要更新的帖子修改按钮,然后在修改界面修改完信息后点击保存按钮,向ArticleController的updateArticle()方法提交post请求,并向该方法传递titles(标题)、bname(板块)、fcontent(内容)、photo(配图)作为参数,封装在Article对象中,updateArticle()方法在收到请求后,将article对象传给ArticleService的updateArticle()方法,并调用ArticleMapper的updateByPrimaryKey()方法更新帖子article信息,然后将结果返回前台作出相应变化。帖子修改界面如图5-12所示:

图5-12 帖子修改界面
主要代码如下:
//文件(图片)路径
String filePath = PathUtil.getCommonPath()+PathUtil.getArticlePath();
int fid=article2.getFid();
// 获取上传图片的文件名及其后缀(获取原始图片的拓展名)
String fileName = file.getOriginalFilename();
// 生成新的文件名字(不重复)
String newFileName = UUID.randomUUID() + fileName;
// 封装上传文件位置的全路径
File targetFile = new File(filePath, newFileName);
// 把本地文件上传到封装上传文件位置的全路径
file.transferTo(targetFile);
// 将article2和photo整合到article中
Article article = new Article(article2, newFileName);
articlePhotoDelete(fid);
//修改帖子表(数据库)
articleService.updateArticle(article);
5.1.3 评论模块功能实现
评论浏览无需登录后可在首页浏览帖子时查看,评论浏览界面如图5-13所示:

图5-13 评论浏览界面
首先访问系统首页,然后向Common中的getAll方法发起请求,该方法会获取每条帖子的帖子id,然后会将帖子id作为参数调用CommentController中的getCommentFid方法查询相关帖子评论信息,把结果保存后返回给前台界面进行显示,主要代码如下:
List listComment = commentService.getCommentFid(fid);
map.put(“listComment”, listComment);
发表评论只有注册用户登录后才可以进行,在帖子下方评论后点击评论按钮,然后向CommentController中的setComment()方法提交post请求,并向该方法传递userid(用户id)、fid(帖子id)、pcontent(评论内容)作为参数,封装在Comment对象中, setComment()方法获取到Comment对象后,把它传给CommentService的setComment()方法,然后调用CommentMapper的insert()方法向评论表comment插入一条评论信息,然后将操作结果返回前台作出相应信息变化。发表评论界面如图5-14所示:

图5-14 发表评论界面
主要代码:
@RequestMapping(“/setComment”)
public String setComment(Comment comment) {
commentService.setComment(comment);
return “redirect:/index.jsp”; }
评论删除包括删除自己发表的评论和删除自己所发帖子下的所有评论,以删除自己所发帖子下评论为例,用户登录后进入“个人主页”便可在“动态”里查看自己所发帖子下的评论,在浏览评论的同时点击相关评论对应的删除按钮,会给予一个删除确认提示,点击取消则返回,点击确定按钮后,向CommentController的deleteComment()方法提交post请求,并向该方法传递pid(评论id),封装在comment对象中。deleteComment()获取到Comment对象后,把它传给 CommentService的deleteComment()方法,接着调用CommentMapper的deleteByPrimaryKey()
方法删除评论表comment里对应的评论信息,然后将操作结果返回前台页面作出相应信息变化.。主要代码如下:
@RequestMapping(“/deleteComment”)
public ModelAndView deleteComment(Comment comment) {
commentService.deleteComment(comment.getPid());
//重定向到getMyself这个方法
return new ModelAndView(“redirect:/userController/getMyself”); }
评论删除界面如图5-15所示:

图5-15 评论删除界面
5.1.4 关注模块功能实现
新增关注指的是一个用户对另一个用户的关注,不能自己关注自己,用户登录后在系统首页浏览帖子的时候可以关注其他用户,首页浏览帖子时点击关注,向AttentionController的setAttention()方法提交post请求,并向该方法传递userid(发起关注的用户id)、beuserid(被关注用户id),封装在attention对象中,setAttention()获取到attention对象后,把它作为参数传递给AttentionService的setAttention()方法,该方法会调用AttentionMapper的insert()方法向关注表attention里插入一条关注信息,然后将操作结果返回给前台页面作出相应变化。主要代码如下:
@RequestMapping(“/setAttention”)
public String setAttention(Attention attention) {
attentionService.setAttention(attention);
return “redirect:/index.jsp”;//重定向 }
新增关注界面如图5-16所示:

图5-16 新增关注界面
查看关注指的是用户在我的主页里关注下面可以看到“我关注的人”和“关注我的人”的信息,点击个人主页,向UserController的getMyself()方法提交post请求,getMyself ()方法在session域里获取读取用户的userid,会将userid作为参数传递给AttentionService的getAttention()方法,该方法再调AttentionMapper的selectByUserid()方法查询关注表attention(获取到我关注的List对象),再从List中获取到每一个Attention对象的beuserid,将beuserid作为参数传给 UserService的getUserKey()方法去调用UserMapper的selectByPrimaryKey()方法查询用户表user获取到我关注的用户(user)对象,将结果返回给前台遍历展示出我关注的用户信息,主要代码如下:
// 按userid查询关注信息(你关注了谁)
List attentions = attentionService.getAttention(userid);
List myListUserAttention = new ArrayList();
for(Attention attention : attentions) {
//通过beuserid作为userid查询用户信息
int beuserid=attention.getBeuserid();
myListUserAttention.add(userService.getUserKey(beuserid)); }
map.put(“myListAttentions”, myListUserAttention);
我关注的人界面如图5-17所示:

图5-17 我关注的人界面
关注我的人界面如图5-18所示:

图5-18 关注我的人界面
向UserController的getMyself()方法提交post请求,getMyself()方法在session域里获取读取用户的userid,会将userid作为参数传递给AttentionService的getAttentionBe()方法,该方法再调用AttentionMapper的selectByBeuserid()方法查询关注表attention,获取到关注我的List对象,再从List中获取到每一个Attention对象的userid,将userid作为参数传给UserService的getUserKey()方法去调用UserMapper的selectByPrimaryKey()方法查询用户表user,获取到关注我的用户(user)对象,将结果返回给前台页面进行遍历展示,主要代码如下:
// 按beuserid查询关注信息(谁关注了你)
List attentions_be = attentionService.getAttentionBe(userid);
//存放关注我的用户信息
List myListUserAttention_be = new ArrayList();
for(Attention attention_be : attentions_be) {
//通过userid查询用户信息
myListUserAttention_be.add(userService.getUserKey(attention_be.getUserid())); }
map.put(“myListAttentions_be”, myListUserAttention_be);
取消关注指的是本用户对其他用户的关注取消操作,在系统首页浏览帖子的时候可以取消已经关注了的用户,在“我的主页”里“关注”下面的“我关注的人”中可以取消已经关注了的用户,以首页取消关注为例,取消关注界面如图5-19所示:

图5-19 取消关注界面
以首页点击取消关注为例,向AttentionController的deleteAttention()方法提交post请求,并向该方法传递gid(关注id),封装在Attention对象中,deleteAttention()获取到Attention对象后,把它作为参数传递给AttentionService的deleteAttention()方法,然后调用AttentionMapper的deleteByAttention()方法删除关注表attention里的一条关注信息,然后将操作结果返回前台作出相应信息变化。主要代码如下:
@RequestMapping(“/deleteAttention”)
public String deleteAttention(Attention attention) {
attentionService.deleteAttention(attention);
return “redirect:/index.jsp”; }

5.1.5 收藏模块功能实现

新增收藏指的是用户对其他用户发表的帖子收藏,不能收藏自己发表的帖子,用户登录后在系统首页浏览帖子的时候可以收藏其他用户发表的帖子,红色的心形图标表示已收藏,灰色的心形图标表示未收藏,新增收藏界面如图5-20所示:

图5-20 新增收藏界面
点击灰色的心形,向CollectController的setCollect()方法提交post请求,并向该方法传递userid(用户id)、fid(帖子id),封装在Collect对象中,setCollect()获取到Collect对象后,把它作为参数传递给CollectService的setCollect()方法,在方法里面会调用CollectMapper中的insert()方法向收藏表collect插入一条收藏信息,然后将操作结果返回前台进行信息显示,主要代码如下:
@RequestMapping(“/setCollect”)
public String setCollect(Collect collect) {
collectService.setCollect(collect);
return “redirect:/index.jsp”;//重定向到首页 }
查看收藏指的是用户在我的主页里可以看到“我的收藏”信息,该收藏信息显示了我收藏哪些帖子,点击个人主页,向UserController的getMyself()方法提交post请求,getMyself()方法在session域里获取读取用户的userid,会将userid作为参数传递给CollectService的getCollect()方法,该方法再调用CollectMapper的selectByCollectUserid()方法查询收藏表collect,获取到我收藏的List对象,再从List中获取到每一个Collect对象的fid,将fid作为参数,传给ArticleService的getArticleKey方法去调用ArticleMapper的selectByPrimaryKey()方法查询帖子表article,获取到我收藏的帖子article对象,然后将结果返回给前台页面进行遍历展示我收藏的帖子信息,主要代码如下:
List collects = collectService.getCollect(userid);
List

myListArticleCollect = new ArrayList
();
for(Collect collect : collects) {
//通过fid查询帖子信息
int fid=collect.getFid();
//把帖子信息都查询出来,在前台显示按需取出来
myListArticleCollect.add(articleService.getArticleKey(fid)); }
map.put(“myListCollects”, myListArticleCollect);
查看收藏信息界面如图5-21所示:

图5-21 查看收藏信息界面
在首页中点击取消收藏,向CollectController中的deleteCollect()方法提交post请求,并向该方法传递sid(收藏id),封装在Collect对象中,然后把Collect对象作为参数,调用CollectService的deleteCollect()方法,在deleteCollect()方法中去调用CollectMapper的deleteByCollect方法更新收藏信息表,然后把结果返回前台进行信息更新,取消收藏界面如图5-22所示:

图5-22 取消收藏界面
主要代码如下:
@RequestMapping(“/deleteCollect”)
public String deleteCollect(Collect collect) {
collectService.deleteCollect(collect);
return “redirect:/index.jsp”;//重定向 }

5.1.6 管理员管理系统功能实现

管理员登录是在一个独立的系统上登录的,登录进去后可以进行用户管理、帖子管理、版块管理,由于管理员的权限很大,为了降低对系统的误操作概率,事先设定少量的管理员,不支持管理员注册,管理员登录界面如图5-23所示:

图5-23 管理员登录界面
首先输入用户名和密码后点击登录按钮,向AdminController的getLogin()方法提交post请求,并向该方法传递aname(管理员名字)、apassword(密码)作为参数,封装在Admin对象中,getLogin()方法在收到请求后,将参数传给AdminService的getAdmin()方法,然后再调用AdminMapper的selectByAdmin()方法查询管理员表admin,在AdminControlle中判断查询结果,并将结果返回前台做出相应信息显示。主要代码如下:
List list=new ArrayList<>();
//调用管理员查询方法
list=adminService.getAdmin(admin);
String str=list.toString();
/* 进行一个判断 如果为空就是需要重新登录,不设置提示信息。
反之则把相关信息查找出来,然后跳转到管理员后台首页 */
if (!str.equals(“[]”)) {
map.put(“adminList”, list.get(0));
return “redirect:/admin/indexdo.jsp”;
} else {
return “redirect:/admin/index.jsp”; }
用户信息查看,登录成功后向Common中的getAll_Admin()方法发起get请求,该方法会调用UserController中的pageListUser()方法,然后使用进行用户信息查询,主要代码如下:
@RequestMapping(“/getAll_Admin”)
public String getAll_Admin(Map<Object, Object> map) {
// 查询用户信息 分页实现
userController.pageListUser(map,1);
return “admin”; }
用户信息查看界面如图5-24所示:

图5-24 用户信息查看界面
点击用户删除按钮,会给予一个删除提示,确认删除就向UserController中的deleteUser方法发起post请求,并向该方法传递userid作为参数,封装在User对象中,deleteUser()方法在收到请求后,会将userid作为参数传给UserService的deleteUser()方法,接着再调用UserMapper的deleteByPrimaryKey()方法将用户表user中的对应用户记录删除,把操作结果返回前台页面进行信息刷新,主要代码如下:
int userid=user.getUserid();
//删除用户信息(不包含头像)
userService.deleteUser(user);
用户删除界面如图5-25所示:

图5-25 用户删除界面
帖子信息查看,在用户管理界面,点击左侧帖子管理,向ArticleControlle中的pageListArticle方法进行请求,然后把查询结果返回给前台页面进行显示,主要代码如下:
Integer pageSize=5;//每页显示记录数
PageHelper.startPage(pageNo, pageSize); //分页查询
List

articleList = articleService.getArticle();//获取所有帖子信息
PageInfo
pageInfo=new PageInfo
(articleList);
map.put(“articlerPageInfo”, pageInfo);
map.put(“listArticle”, articleList);
return “adminArticle”; }
帖子信息查看界面如图5-26所示:

图5-26 帖子信息查看界面
帖子审核,指的是管理员对用户所有帖子的审核,判断帖子是否合法,合法则通过审核,不合法则不通过审核,在管理系统界面,点击通过或者拒绝按钮,向ActionController的articleStatus()方法提交post请求,并向该方法传递fid(帖子id)、status(帖子状态)作为参数,封装在Article对象中,articleStatus()方法在收到请求后,将article对象传给ArticleService的updateArticleStatus()方法,并调用ArticleMapper的updateArticleStatus()方法更新帖子表article信息,主要代码如下:
articleService.updateArticleStatus(article);
return “redirect:/admin/indexdoArticle.jsp”;
帖子审核界面如图5-27所示:

图5-27 帖子审核界面
新增板块可以使得用户在发表帖子时所属板块可选项增加,能分类更明确,点击板块管理新增按钮,出现新增板块界面,新增板块界面如图5-28所示:

图5-28 新增板块界面
输入完板块名后点击确定按钮,向PlateController的setPlate()方法提交post请求,并向该方法传递bname(板块名称)作为请求参数,setPlate()方法在收到请求后,将参数传给PlateService的setPlate()方法,然后再调用PlateMapper的insert()向板块表plate中插入一条数据,主要代码如下:
Plate plate_add=new Plate();
//使用request.getParameter(“bname”)来获取板块名
plate_add.setBname(request.getParameter(“bname”));
if(plateService.getPlateName(plate_add).toString().equals(“[]”)) {
plateService.setPlate(plate_add);
return “OK”;
}else { return “NO”; }
板块查看进入系统后点击板块管理,向Common中的getAll_Admin_Plate()方法发起请求,该方法再调用PlateController的getPlate()方法查询板块,然后把结果返回前台遍历显示所有板块信息,板块查看界面如图5-29所示:

图5-29 板块查看界面
主要代码如下:
plateController.getPlate(map);
板块修改对已有板块名进行修改,输入板块名后点击确定按钮,向PlateController中的updatePlate()方法提交post请求,并向该方法传递bid(板块id)、bname(板块名称)作为请求参数,封装在Plate对象中,updatePlate()方法在收到请求后,会将请求的参数传输给PlateService的
updatePlate()方法,该方法再调用PlateMapper的updateByPrimaryKey()方法修改板块表plate中的一条数据,并将修改结果返回前台页面进行刷新显示,修改界面如图5-30所示:

图5-30 板块修改界面
在登录前提下,点击板块删除,然后会给予管理员删除确认提示,点击取消返回,确定就向PlateController的deletePlate()方法提交post请求,并向该方法传递bid(板块id)作为请求参数,deletePlate()方法在收到请求后,将参数传给PlateService的deletePlate()方法,然后再调用PlateMapper的deleteByPrimaryKey()方法删除帖子表plate中的一条数据,把结果返回前台进行刷新显示,主要代码如下:
Plate plate_delete=new Plate();
plate_delete.setBid(Integer.parseInt(request.getParameter(“bid”)));
plateService.deletePlate(plate_delete);
板块删除界面如图5-31所示:

图5-31 板块删除界面
5.2 本章小结
本章在基于系统设计的基础上,通过系统运行截图以及解释代码执行过程来介绍整个系统的功能实现,最终完成每个功能模块的实现过程介绍。

6 系统测试

6.1 测试方法

系统测试按照测试技术划分为黑盒测试和白盒测试,其中黑盒测试也称之为功能性测试,基于产品的功能,目的是测试程序中的功能是否实现,并修复其中的错误,无需关注程序内部运行原理。而白盒测试是基于产品内部结构进行测试,检查程序内部是否按照设定的规则执行,软件功能模块是否充分使用,主要关注程序内部代码[16]。

6.2 系统功能性测试

本小节主要对论坛系统采用黑盒测试方法进行系统功能测试,确保系统功能达到预期需求目标,主要完成帖子、用户、评论、收藏、关注、管理系统功能模块测试。

6.2.1 帖子模块功能测试

帖子模块包含发帖、删帖、搜索、修改、浏览功能,以帖子发表为例进行测试过程介绍,如表6-1所示:
表6-1 帖子发表测试表
用例序号 测试描述 预期结果 实际结果
1 登录系统后,点击发帖链接,不输入任何内容,点击发帖按钮 无法发帖,在标题栏提示用户填写此字段 与预期结果一致
2 输入相关内容,不配图,点击发帖 成功发帖,帖子无配图 与预期结果一致
3 输入相关内容,并上传配图,点击发帖 成功发帖,帖子配图为刚才上传的配图 与预期结果一致
4 点击发帖模态框中的清空按钮 清空帖子发表输入框信息 与预期结果一致

6.2.2 用户模块功能测试

用户模块包含登录、注册、基本信息设置、个人资料编辑、查看个人信息等功能,以用户登录为例进行测试过程介绍,如表6-2所示:
表6-2 用户登录测试表
用例序号 测试描述 预期结果 实际结果
1 点击首页登录按钮,在登录界面输入用户名,密码为空,点击登录 不能登录,在密码框提示用户填写该字段 与预期结果一致
2 输入密码,用户名为空 不能登录,在用户名输入框提示用户填写该字段 与预期结果一致
3 用户名或者密码输入错误 不能登录,提示用户名或密码错误 与预期结果一致
4 输入正确用户名和密码 登录成功 与预期结果一致
5 在登录界面输入相关信息,点击清空按钮 清空输入栏的信息 与预期结果一致

6.2.3 评论模块功能测试

评论模块包括浏览、删除、发表评论功能,测试过程如表6-3所示:
表6-3 评论模块测试表
用例序号 测试描述 预期结果 实际结果
1 访问系统首页,浏览首页帖子 能够浏览到每条帖子下方的评论信息 与预期结果一致
2 登录系统后,浏览帖子,在评论框输入内容,点击评论 成功发表评论,对应帖子评论信息更新 与预期结果一致
3 点击个人主页动态部分对应帖子评论删除按钮,点击确定 成功删除帖子评论信息 与预期结果一致

6.2.4 关注模块功能测试

关注包括查看、新增、取消功能,具体测试过程如表6-4所示:
表6-4 关注模块测试表
用例序号 测试描述 预期结果 实际结果
1 登录系统后,浏览帖子,有未关注用户时点击关注 成功关注他人 与预期结果一致
2 点击个人主页中关注标签进行查看 可以查看到关注信息 与预期结果一致
3 主页浏览帖子时,对已经关注的用户点击取消关注 成功取消关注 与预期结果一致

6.2.5 收藏模块功能测试

收藏包含浏览、添加、取消功能,测试过程如表6-5所示:
表6-5 收藏模块测试表
用例序号 测试描述 预期结果 实际结果
1 登录系统,浏览首页帖子时,有未收藏帖子时,点击收藏 成功收藏该帖子 与预期结果一致
2 点击个人主页中的收藏标签进行浏览 能够浏览到收藏信息 与预期结果一致
3 主页浏览帖子时,对已经收藏的帖子点击取消收藏 成功取消收藏 与预期结果一致

6.2.6 管理员管理系统功能测试

管理系统包含用户、帖子、板块三个模块的管理,以板块管理中的新增板块为例进行测试过程介绍,如表6-6所示:
表6-6 新增板块测试表
用例序号 测试描述 预期结果 实际结果
1 登录管理系统,点击板块管理中的新增按钮,在新增界面中不输入内容,点击确定 提示用户填写此字段 与预期结果一致
2 在新增界面中输入已有板块名称,点击确定 新增失败,提示板块名已存在 与预期结果一致
3 输入新的板块名称,点击确定 新增板块成功 与预期结果一致
4 输入板块名,点击清空 清空输入框内容 与预期结果一致

6.3 本章小结

本章主要对开发出来的系统进行了一个功能性测试,从而找出系统存在的错误,并进行修正,以完善系统功能,达到预期的需求,采用了黑盒测试方法进行系统的功能测试,通过测试表来描述整个测试过程,最终完成系统的功能测试。

7 总结与展望

7.1 总结

通过这几个月的努力,顺利完成了基于ssm的论坛系统的设计与实现,并完成了论文的撰写,论坛系统最终完成了预期的需求功能,系统设计实现遵循软件工程开发思想来进行开发,通过前期的课题资料和参考文献调研,然后开始了需求分析,接着进行系统设计,完成了系统技术架构设计和功能结构设计以及数据库设计,然后在系统设计的基础上进行了系统编码实现,在论文中对实现过程进行了详细介绍,最后对完成的论坛系统功能进行了测试,并解决测试过程遇到的系统错误,以便完善系统功能。在开发系统的过程中,采用了B/S结构开发,这样运行负担让服务器来承担,加快客户端浏览器访问速度,然后采用了MVC模式进行系统代码编写,能够减少代码重复率,加快编程效率,数据存储方面采用了免费、轻量的MySQL数据库,整个系统在页面设计上尽量保持了界面统一、简单、可操作性强的特点,能让页面尽量兼容不同浏览器,让用户视觉上的差异尽量减少。经历了几个月的系统设计实现,对Java wed项目前后台之间交换数据有了更好的认识,让自己的知识体系能够更加完善,也学习到了许多新知识,这期间更是对自己大学四年所学专业知识的一个检验,从中也让自己认识到了自身能力的不足,在后续的学习中能更有目标的去学习提高自己的综合能力。

7.2 展望

由于时间仓促和个人能力有限的原因,尽管论坛系统完成了预期的需求功能,但是还有很多的不足,系统存在很大的优化和升级空间,在后续的研究学习中,在维护好系统的同时,会尽量不断的去完善和优化系统,同时参考其它优秀的论坛系统,然后尽量扩展本系统没有的功能,以便让系统能更完美的运行。

致 谢

本论文是在我的导师李剑锋工程师耐心指导和热情关心下完成的,从论文的选题到撰写,导师给予了很大的帮助,在系统设计实现和论文撰写过程中,遇到问题无法继续研究下去的时候,是导师给予了我悉心的指导和解决问题的方案,同时给予了许多宝贵的意见,让我的毕业设计和论文撰写得以继续进行下去并顺利完成,李老师认真负责的教学态度以及渊博的知识,让我受益匪浅,在此向我的导师李剑锋工程师表达我最诚挚的感谢和最真挚的敬意。
感谢我身边的朋友同学们在系统设计和论文撰写期间给予的意见和支持,同时也要感谢我的家人在背后默默的理解支持和帮助,才让我能够顺利完成论文撰写和系统设计工作。
最后向百忙之中评审本文的各位老师表达衷心的感谢!

参考文献

[1] 刘广升.基于Java的BBS论坛系统的设计与实现[D].山东大学,2013.
[2] 徐永彪.基于MVC框架的BBS论坛管理系统的设计与实现[D].云南大学,2012.
[3] 刘福宸.基于JSP的论坛管理系统的设计与实现[D].吉林大学,2014.
[4] 张正.一个通用论坛系统的设计与实现[D].山东大学,2019.
[5] 郭雅婷.网上论坛系统设计与实现[D].东北大学,2014.
[6] 曹林.高校在线论坛系统的设计与实现[D].西安电子科技大学,2017.
[7] 裴博杰.大学生学习交流论坛的设计与实现[D].电子科技大学,2013.
[8] 耿祥义,张跃平.JSP实用教程[M].北京:清华大学出版社,2015(2018.2重印).
[9] 潘惠苹.Bootstrap技术在Web移动开发中的应用研究[J].计算机时代,2019(5):27-29.
[10] 刘海蓉,王仕勋.基于B/S模式的论坛管理系统设计与开发[J].长沙民政职业技术学院学报,2019,26(3):116-119.
[11] 陈恒,楼偶俊,巩庆志,林徐.Spring MVC开发技术指南[M].北京:清华大学出版社,2017(2018.6重印).
[12] 李刚.轻量级JavaEE企业应用实战[M].第4版.北京:电子工业出版社,2015.
[13] 邹红霆.基于SSM框架的Web系统研究与应用[J].湖南理工学院学报:自然科学版,2017,30(1):39-43.
[14] 石正喜.MySQL数据库实用教程[M].北京师范大学出版社.2014.
[15] 王珊,萨师煊.数据库系统概论[M].第5版.北京:高等教育出版社,2014(2016.12重印).
[16] 王法胜,李绪成,温艳冬.实用软件测试教程[M].第2版.北京:清华大学出版社,2014(2016.1重印)

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广西千灵通网络科技有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值