1.引言
随着互联网的快速发展,网络不良信息问题日益突出,给人们的生活和社会秩序带来了严重的困扰。网络不良信息包括色情、暴力、赌博、诈骗等不良内容,这些信息的传播对青少年的身心健康产生不良影响,也破坏了社会的良好秩序和道德风尚。面对这一问题,建立一种高效、便捷的网络不良信息举报平台是迫在眉睫的。
本项目旨在基于JavaWeb技术搭建一款网络不良信息举报平台,以提供一个安全、快捷、匿名的举报途径,供广大网民举报违法、不良信息。通过该平台,用户可以提交不良信息的举报材料,包括文字、图片、音频与视频等,同时可以提供针对不良信息的详细描述和相关的线索。系统会自动对提交的信息进行初步筛查和分类,然后将信息传达给相关执法机构或监管部门进行处理。
总之,本项目旨在建立一款基于JavaWeb的网络不良信息举报平台,通过提供安全、快捷、匿名的举报途径,帮助用户及时发现和举报网络不良信息,净化网络空间,维护社会秩序。通过社交化的设计,鼓励用户之间互相传递信息,形成一个共同参与的社区,共同打造一个绿色、健康的网络环境。
2.开发技术
2.1 JSP简介
JSP技术所开发的web应用程序是基于Java的,它拥有Java跨平台的特性,以及业务代码分离,组建重用,基础Java servlet功能和预编译功能。它有以下特点:
JSP的工作原理是当用户浏览器从 WEB服务器上请求JSP 文件时,WEB 服务器响应该 HTTP请求,JSP引擎解释JSP 标识和小脚本,通过访问Java Bean 组件,使用JDBC 技术访问数据库生成所请求的内容并且将结果以Htm1或者XML页面的形式返回给浏览器。
Servlet 为 Web 开发员提供了一个简单、一致的机制,来扩展 web 服务器的功能,并且和已有的业务系统交互,可以把Servlet 看作在服务端运行的App let。Java Bean 是一种“类”,通过封装属性和方法成为具有某种功能或处理某个业务的对象。JavaBean被组织成为 Package以便进行管理,实际上就是把一组 Java Bean一起放在XX目录中每个类的定义前加上package XX,必须放在系统环境 CLASS PATH包含的目录下,系统能找到其中的 Java Bean。JSP技术是servlet 技术的扩展对HTML和XML的页面创作提供支持。网页设计员能够非常容易地将固定或静态的模板数据与动态内容进行组合。
2.2 B/S结构概述
B/S结构是Web兴起后的一种网络结构模式。是浏览器和服务器相互作用的一种体系结构,它的运行机理如下所述。首先浏览器通过域名和URL对浏览器发出请求,浏览器接受请求后,开始解析URL定位模块文件,根据URL中的参数和模块文件生成HTML文件,将生成的HTML文件发送给浏览器,浏览器接受响应HTML文档,解析整理相关资源文件,然后就会显示页面,一个完整的流程就是这样。B/S 建立在广域网之上的,一般只要有操作系统和浏览器就行, 面向是未知的用户群。对安全的控制能力相对弱但是它的访问速度是相对比较快的,需要不断优化,它的各个部件是独立的,各司其职,每一部分都能发挥重要的作用,更换个别构件都可以使系统得到无缝升级。 系统维护开销的成本降到最小,用户从网上自己下载安装就可以实现升级。 B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流, 并且大部分难度很低,减低开发成本。
2.3 Servlet简介
2.4 MYSQL简介
数据库作为数据的存储地方是项目必须的,MySQL是一款非常优秀的关系型数据库,早期的mysql并不是甲骨文公司的,后来才被他收购的。Mysql非常的小巧,安装包才几兆,sql语言的书写也比较容易学习,最重要的是mysql同时也是一款开源的软件,所以不需要额外进行付费,本系统本身也是以学习总结所学知识为主,在系统的开发上最好尽量使用免费的软件,所以选用mysql进行数据库管理。Mysql的容量也是非常大的,同时支持分库分表的操作,支持分布式,所以越来越多的中小企业选择该款数据库管理工具。另外值得一提的是,开源也有一个不好的地方,就是容易遭到破解和黑客攻击,所以mysql在使用上还是主要集中在中小企业当中。
2.5 JavaScript
作为一种动态编译的脚本语言,JavaScript的优点是不必多说。随着Web开发的诞生,出现了各种各样的开发技术。为了能够在大环境中生存下来,JavaScript也开始适应非浏览器环境。像Java一样,JavaScript同样是可以面向对象的,这可以帮助学习过Java语言的学生学习JavaScript。此外,JavaScript可以与CSS结合产生许多有趣的页面效果,这也是JavaScript在大环境中仍然流行的主要原因。
2.6 Tomcat服务器
Tomcat可在开发工具(如IDEA、Eclipse)上进行简单配置即可使用。使用tomcat服务器主要还是由于首先他是一款开源的软件,不需要额外付费,在阿帕奇的官网就可以很方便的下载其源代码和文档,非常的方便。其次,tomcat非常的小,由于系统的开发和运行对电脑的配置要求较高,否则非常容易造成卡顿的现象,所以在第三方软件的选择上,尽量使用更加小巧的软件会更好的,所以说tomcat从这点看也是非常合适的。
2.7 Eclipse开发工具
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身来说,它只是一个框架和一组服务,用于通过插件组件构建开发环境,但Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。正因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于Eclipse中的大部分都是插件提供的,因为可给用户提供一致和统一的集成开发环境。选择他便携,方便可快速构建项目。
3.系统详细设计
违法不良信息举报平台根据业务内容分为管理员系统、用户登录系统。系统的模块设计是在需求规格说明和系统架构的基础上,通过精化架构、分析用例、设计模块来标识设计元素,发现设计元素的行为细节,精化设计元素的定义,以确保用例实现总是最新的。
3.1 用户模块设计
用户模块主要是用户注册;用户登录;违法信息上报填写;个人信息修改;密码修改;我的记录查看。下面对这些功能,挑选代表性功能进行详细叙述:
3.1.1用户登录
用户登录涉及的类与JSP文件,包括cuslogin.jsp(视图层)、LoginUserServlet(控制层)、UserService(业务逻辑层)、UserDao(数据访问层)和User(实体层),具体如图3-1所示。
图 3-1 用户登录业务图
(1)login.jsp
cuslogin.jsp的action(userlogin)负责处理用户的登录事件,调用LoginUserServlet类中的doPost()方法,并把用户的登录输入信息封装到实体User中,同时在doPost()方法中调用UserService类中的逻辑处理方法login(User user)。
(2)UserService类
UserService类中的login(User user)方法负责处判断用户名和密码是否正确的业务逻辑,调用UserDao类中的login(User user)方法。
(3)UserDao类
UserDao类中的login(User user)方法负责在mysql数据库中执行“select * from suser where cusname=? and password=?”语句,判断用户名和密码是否正确。
(4)User类
User类实现对数据库中的suser表的面向对象化处理,实现数据的封装。
3.1.2用户注册
用户注册涉及的类与JSP文件,包括cusregister.jsp(视图层)、RegisterUserServlet(控制层)、UserService(业务逻辑层)、UserDao(数据访问层)和User(实体层),具体如图3-2所示。
图 3-2 用户注册业务图
(1)cusregister.jsp
cusregister.jsp的action(userregister)负责处理用户的注册事件,调用RegisterUserServlet类中的doPost()方法,并把用户的注册输入信息封装到实体User中,同时在doPost()方法中调用UserService类中的逻辑处理方法insert(User user)。
(2)UserService类
UserService类中的insert(User user)方法负责处理用户注册的业务逻辑,调用UserDao类中的insert(User user)方法。
(3)UserDao类
UserDao类中的insert(User user)方法负责在mysql数据库中执行“INSERT INTO suser (cusName,realName,phone,email,idcard,sex,province,city,address,password,status) VALUES(?,?,?,?,?,?,?,?,?,?,?)”语句,对用户注册输入的信息进行存储。
(4)User类
User类实现对数据库中的suser表的面向对象化处理,实现数据的封装。
3.1.3违法信息上报模块
用户违法信息上报涉及的类与JSP文件,包括cusindex.jsp(视图层)、CusSubmitInfoServlet(控制层)、InfoService(业务逻辑层)、InfoDao(数据访问层)和Info(实体层),具体如图3-3所示。
图 3-3 用户违法信息上报业务图
(1)cusindex.jsp
cusindex.jsp的action(cussubmitsave)负责处理用户的违法信息上报保存事件,调用CusSubmitInfoServlet类中的doPost()方法,并把用户输入的违法犯罪信息封装到实体Info中,同时在doPost()方法中调用InfoService类中的逻辑处理方法insert(Info info)。
(2)InfoService类
InfoService类中的insert(Info info)方法负责处理用户填写的违法信息上报的业务逻辑,调用InfoDao类中的insert(Info info)方法。
(3)InfoDao类
InfoDao类中的insert(Info info)方法负责在mysql数据库中执行“INSERT INTO info (cusName,eventName,eventTime,eventPlace,eventType,pic,submitTime,flag,param1,param2,param3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)”语句,对上报信息进行存储。
(4)Info类
Info类实现对数据库中的info表的面向对象化处理,实现数据的封装。
3.1.4用户个人信息修改模块
用户个人信息修改涉及的类与JSP文件,包括cusindex.jsp(视图层)、UserAddServlet(控制层)、UserService(业务逻辑层)、UserDao(数据访问层)和User(实体层),具体如图3-4所示。
图 3-4用户个人信息修改业务图
(1)cusindex.jsp
cusindex.jsp的action(usersave)负责处理用户的个人信息修改事件,调用UserAddServlet类中的doPost()方法,并把用户修改后的个人信息封装到实体User中,同时在doPost()方法中调用UserService类中的逻辑处理方法update(User user)。
(2)UserService类
UserService类中的update(User user)方法负责处理用户个人信息修改的业务逻辑,调用UserDao类中的update(User user)方法。
(3)UserDao类
UserDao类中的insert(User user)方法负责在mysql数据库中执行“update suser set cusName=?,realName=?,phone=?,email=?,idcard=?,sex=?,province=?,city=?,address=?,password=?,status=? where id=?”语句,对用户修改输入的信息进行更新。
(4)User类
User类实现对数据库中的suser表的面向对象化处理,实现数据的封装。
3.1.5我的记录查看模块
我的记录查看涉及的类与JSP文件,包括cusindex.jsp(视图层)、CusSubmitInfoServlet(控制层)、InfoService(业务逻辑层)、InfoDao(数据访问层)和Info(实体层),具体如图3-5所示。
图 3-5 我的记录查看业务图
(1)cusindex.jsp
cusindex.jsp的href(/waitinfolist?flag=0)负责处理用户的上报待审核记录的查看,调用InfoListWaitServlet类中的doPost()方法,并把携带到的违法犯罪信息状态的值封装到实体Info中,同时在doPost()方法中调用InfoService类中的逻辑处理方法selectAllInfos(Info info)。
(2)InfoService类
InfoService类中的selectAllInfos(Info info)方法负责处理用户查询个人上报记录的业务逻辑,调用InfoDao类中的selectAllInfos(Info info)方法。
(3)InfoDao类
InfoDao类中的selectAllInfos(Info info)方法负责在mysql数据库中执行“select * from info where 1=1 and cusname =? and flag=?”语句,对需要的记录进行查询封装。
(4)Info类
Info类实现对数据库中的info表的面向对象化处理,实现数据的封装。
3.2 管理员模块设计
管理员模块主要进行管理员登录;对管理员的管理,即查询、新增、修改和删除;对用户信息的管理,即删除,查询,修改用户信息功能和用户禁用管理;对类别的管理,即增加,删除,更改,查询功能;对举报信息审核的管理,即审核,查询功能;对举报信息处理的管理,即处理结果记录,查询功能;对举报信息导出的功能。
下面对这些功能,挑选代表性功能进行详细叙述:
3.2.1管理员登录功能
管理员登录涉及的类与JSP文件,包括login.jsp(视图层)、LoginServlet(控制层)、AdminService(业务逻辑层)、AdminDao(数据访问层)和Admin(实体层),具体如图3-6所示。
图 3-6 管理员登录业务图
(1)login.jsp
login.jsp的action(login)负责处理管理员的登录事件,调用LoginServlet类中的doPost()方法,并把管理员的登录输入信息封装到实体Admin中,同时在doPost()方法中调用AdminService类中的逻辑处理方法login(Admin admin)。
(2)AdminService类
AdminService类中的login(Admin admin)方法负责处判断用户名和密码是否正确的业务逻辑,调用AdminDao类中的login(Admin admin)方法。
(3)AdminDao类
AdminDao类中的login(Admin admin)方法负责在mysql数据库中执行“select * from admin where username=? and password=?”语句,判断用户名和密码是否正确。
(4)Admin类
Admin 类实现对数据库中的admin表的面向对象化处理,实现数据的封装。
3.2.2新增管理员功能
新增管理员功能涉及的类与JSP文件,包括add.jsp(视图层)、AdminAddServlet(控制层)、AdminService(业务逻辑层)、AdminDao(数据访问层)和Admin(实体层),具体如图3-7所示。
图 3-7 管理员新增业务图
(1)add.jsp
add.jsp的action(adminsave)负责处理新增管理员事件,调用AdminAddServlet类中的doPost()方法,并把管理员新增页面输入的信息封装到实体Admin中,同时在doPost()方法中调用AdminService类中的逻辑处理方法insert(Admin admin)。
(2)AdminService类
AdminService类中的insert(Admin admin)方法负责处理管理员新增的业务逻辑,调用AdminDao类中的insert(Admin admin)方法。
(3)AdminDao类
AdminDao类中的insert(Admin admin)方法负责在mysql数据库中执行“INSERT INTO admin(username,password,realname,sex,phone,idcard,province,city) VALUES(?,?,?,?,?,?,?,?)”语句,将新增管理员信息保存至数据库。
(4)Admin类
Admin 类实现对数据库中的admin表的面向对象化处理,实现数据的封装。
3.2.3查询管理员信息功能
查询管理员信息功能涉及的类与JSP文件,包括list.jsp(视图层)、AdminListServlet(控制层)、AdminService(业务逻辑层)、AdminDao(数据访问层)和Admin(实体层),具体如图3-8所示。
图 3-8 查询管理员业务图
(1)list.jsp
list.jsp的action(adminlist)负责处理管理员的查询事件,调用AdminListServlet类中的doPost()方法,并把查询条件信息封装到实体Admin中,同时在doPost()方法中调用AdminService类中的逻辑处理方法selectAllAdmin(Admin admin)。
(2)AdminService类
AdminService类中的selectAllAdmin(Admin admin)方法负责处理查询管理员的业务逻辑,调用AdminDao类中的selectAllAdmin(Admin admin)方法。
(3)AdminDao类
AdminDao类中的selectAllAdmin(Admin admin)方法负责在mysql数据库中执行“select * from admin where 1=1”语句,查询管理员信息列表。
(4)Admin类
Admin 类实现对数据库中的admin表的面向对象化处理,实现数据的封装。
3.2.4删除管理员功能
删除管理员信息功能涉及的类与JSP文件,包括list.jsp(视图层)、AdminDeleteServlet(控制层)、AdminService(业务逻辑层)、AdminDao(数据访问层)和Admin(实体层),具体如图3-9所示。
图 3-9删除管理员业务图
(1)list.jsp
list.jsp的a标签(admindelete)负责处理管理员的删除事件,调用AdminDeleteServlet类中的doPost()方法,并把删除条件信息封装到实体Admin中,同时在doPost()方法中调用AdminService类中的逻辑处理方法delete(Admin admin)。
(2)AdminService类
AdminService类中的delete(Admin admin)方法负责处理删除管理员的业务逻辑,调用AdminDao类中的delete(Admin admin)方法。
(3)AdminDao类
AdminDao类中的delete(Admin admin)方法负责在mysql数据库中执行“delete from admin where id=?”语句,删除管理员信息。
(4)Admin类
Admin 类实现对数据库中的admin表的面向对象化处理,实现数据的封装。
3.2.5修改管理员信息功能
修改管理员信息功能涉及的类与JSP文件,包括add.jsp(视图层)、AdminAddServlet(控制层)、AdminService(业务逻辑层)、AdminDao(数据访问层)和Admin(实体层),具体如图3-10所示。
图 3-10 修改管理员业务图
(1)add.jsp
add.jsp的action(adminsave)负责处理管理员的修改事件,调用AdminAddServlet类中的doPost()方法,并把修改的管理员信息封装到实体Admin中,同时在doPost()方法中调用AdminService类中的逻辑处理方法update(Admin admin)。
(2)AdminService类
AdminService类中的update(Admin admin)方法负责处理修改管理员的业务逻辑,调用AdminDao类中的update(Admin admin)方法。
(3)AdminDao类
AdminDao类中的update(Admin admin)方法负责在mysql数据库中执行“UPDATE admin SET username=?,password=?,realname=?,sex=?,phone=?,idcard=?,province=?,city=? WHERE id=?”语句,修改管理员信息。
(4)Admin类
Admin 类实现对数据库中的admin表的面向对象化处理,实现数据的封装。
3.2.6举报信息审核通过功能
举报信息审核通过功能涉及的类与JSP文件,包括list.jsp(视图层)、InfoPassServlet(控制层)、InfoService(业务逻辑层)、InfoDao(数据访问层)和Info(实体层),具体如图3-11所示。
图 3-11 举报信息审核通过业务图
(1)list.jsp
list.jsp的a标签(infopass)负责处理举报信息审核通过的事件,调用InfoPassServlet类中的doPost()方法,并把审核通过的信息封装到实体Info中,同时在doPost()方法中调用InfoService类中的逻辑处理方法update(Info info)。
(2)InfoService类
InfoService类中的update(Info info)方法负责处理审核通过的的业务逻辑,调用InfoDao类中的update(Info info)方法。
(3)InfoDao类
InfoDao类中的update(Info info)方法负责在mysql数据库中执行“update info set cusName=?,eventName=?,eventTime=?,eventPlace=?,eventType=?,pic=?,submitTime=?,flag=?,param1=?,param2=?,param3=? where id=?”语句,修改上报信息状态。
(4)Info类
Info类实现对数据库中的info表的面向对象化处理,实现数据的封装。
3.2.7 举报信息审核失败功能
举报信息审核失败功能涉及的类与JSP文件,包括check.jsp(视图层)、RecordSaveServlet(控制层)、InfoService(业务逻辑层)、InfoDao(数据访问层)和Info(实体层),具体如图3-12所示。
图 3-12 举报信息审核失败业务图
(1)check.jsp
check.jsp的action(recordsave)负责处理举报信息审核失败的事件,调用RecordSaveServlet类中的doPost()方法,并把审核失败的信息封装到实体Info中,同时在doPost()方法中调用InfoService类中的逻辑处理方法update(Info info)。
(2)InfoService类
InfoService类中的update(Info info)方法负责处理审核失败的的业务逻辑,调用InfoDao类中的update(Info info)方法。
(3)InfoDao类
InfoDao类中的update(Info info)方法负责在mysql数据库中执行“update info set cusName=?,eventName=?,eventTime=?,eventPlace=?,eventType=?,pic=?,submitTime=?,flag=?,param1=?,param2=?,param3=? where id=?”语句,修改上报信息状态。
(4)Info类
Info类实现对数据库中的info表的面向对象化处理,实现数据的封装。
3.2.8举报信息导出功能
举报信息导出功能涉及的类与JSP文件,包括list.jsp(视图层)、DataExportServlet(控制层)、InfoService(业务逻辑层)、InfoDao(数据访问层)和Info(实体层),具体如图3-13所示。
图 3-13 举报信息导出功能业务图
(1)list.jsp
list.jsp的action(exportdata)负责处理举报信息导出的事件,调用DataExportServlet类中的doPost()方法,同时在doPost()方法中调用InfoService类中的逻辑处理方法selectAllInfos(Info info)。
(2)InfoService类
InfoService类中的selectAllInfos(Info info)方法负责处理举报信息导出的的业务逻辑,调用InfoDao类中的selectAllInfos(Info info)方法。
(3)InfoDao类
InfoDao类中的selectAllInfos(Info info)方法负责在mysql数据库中执行“select * from info ”语句,查询需要导出的所有数据。
(4)Info类
Info类实现对数据库中的info表的面向对象化处理,实现数据的封装。
4.数据库设计
4.1 逻辑设计
数据库逻辑设计分为三个阶段,分别是:用户要求、建立E-R 模型和数据库模式设计。
数据库逻辑设计中的第一阶段收集和分析用户需求是按以下四步进行的:分析用户活动,确定系统范围,分析用户活动所涉及的数据和分析系统数据。逻辑设计第二阶段建立E-R 模型分两步,首先应进行局部E-R 模型设计,然后进行总体E-R 模型的设计。逻辑设计第三阶段在数据库模式设计阶段分两步进行,第一步初步设计,把E-R 图转换为关系模型,第二步优化设计,对模式进行调整和改善。
我们所要进行研究的是逻辑设计的第三步即将E-R图像关系模型转化。下面把实体及实体间关系转换成为关系模型。实体转换出的关系模式:
用户信息表{用户ID,密码,性别,邮箱,密保问题,密保答案,备注}。
管理员信息表{管理员ID,密码}。
帖子信息表{帖子ID,内容,发表时间,内容,用户ID,新闻ID}。
新闻信息表{新闻ID,新闻标题,新闻内容,更新时间,专区ID}。
专区信息表{专区ID,专区名称,专区编号}。
4.2 物理设计
数据库物理设计包括:选择存储结构、确定存取方法、选择存取路径、确定数据的存放位置。
主要解决选择文件存储结构和确定文件存取方法的问题。在数据库中访问数据的路径主要表现为如何建立索引。如要直接定位到所要查找的记录,应采用索引方法存取方法(索引表)。顺序表只能从起点进去向后一个个访问记录。在上面的实体以及实体之间关系模式的基础上,形成数据库中表以及各表之间关系。
用户信息表如表4-1所示。
表4-1 用户信息表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
id | 表id | Int | 20 | 否 | 是 |
cusName | 用户名 | varchar | 30 | 否 | 否 |
realName | 真实姓名 | varchar | 50 | 是 | 否 |
phone | 手机号 | varchar | 11 | 是 | 否 |
| 邮箱 | varchar | 30 | 是 | 否 |
idcard | 身份证号 | varchar | 18 | 是 | 否 |
sex | 性别 | varchar | 10 | 否 | 否 |
province | 省 | varchar | 30 | 是 | 否 |
city | 市 | varchar | 30 | 是 | 否 |
address | 详细地址 | varchar | 255 | 是 | 否 |
password | 密码 | varchar | 50 | 是 | 否 |
status | 状态 | Int | 10 | 是 | 否 |
帖子信息表如表4-2所示。
表4-2 帖子信息表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
id | 帖子ID | Int | 20 | 否 | 是 |
cusName | 用户登录名称 | varchar | 30 | 是 | 否 |
eventName | 时间名称 | varchar | 255 | 是 | 否 |
eventTime | 发生时间 | varchar | 30 | 是 | 否 |
eventPlace | 发生平台 | varchar | 100 | 是 | 否 |
eventType | 事件类别 | varchar | 30 | 是 | 否 |
pic | 截图 | varchar | 255 | 是 | 否 |
submitTime | 发生时间 | varchar | 30 | 是 | 否 |
flag | 审核状态 | Int | 20 | 是 | 否 |
类型表如表4-3所示。
表4-3 类型表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
id | 类型ID | Int | 50 | 否 | 是 |
typecode | 类别编号 | varchar2 | 20 | 否 | 否 |
typename | 类别名称 | varchar2 | 50 | 否 | 否 |
管理员信息表如表4-4所示。
表4-4 管理员信息表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
admname | 管理员ID | varchar2 | 20 | 否 | 是 |
password | 管理员密码 | varchar2 | 20 | 否 | 否 |
处理结果表如表4-5所示。
表4-5 处理结果表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
id | 表id | Int | 20 | 否 | 是 |
infoId | 信息id | Int | 20 | 否 | 否 |
result | 结果 | varchar | 255 | 否 | 否 |
returnPerson | 反馈人 | varchar | 30 | 否 | 否 |
returnTime | 反馈时间 | varchar | 30 | 否 | 否 |
帖子驳回记录表如表4-6所示。
表4-6 帖子驳回记录表
字段名 | 说 明 | 类 型 | 长 度 | 可否为空 | 主键 |
id | 表id | Int | 20 | 否 | 是 |
infoId | 信息id | Int | 20 | 否 | 否 |
checkname | 驳回人 | varchar | 40 | 否 | 否 |
checktime | 驳回时间 | varchar | 30 | 否 | 否 |
noReson | 驳回原因 | varchar | 255 | 否 | 否 |
5.实现效果图
(1)用户端登录
(2)用户端信息填报页面
(3) 用户端个人中心
(4)后台管理端登录
(5)后台管理端登录主页面
(6)管理员管理
(7)用户管理
(8) 类别管理
(9)信息举报处理
(10)举报信息审核
(11)举报信息导出
6.参考代码
@WebServlet("/adminsave")
public class AdminAddServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//获取页面信息
String id=req.getParameter("id");
String username=req.getParameter("username");
String realname=req.getParameter("realname");
String sex=req.getParameter("sex");
String phone=req.getParameter("phone");
String idcard=req.getParameter("idcard");
String province=req.getParameter("province");
String city=req.getParameter("city");
String password=req.getParameter("password");
Admin admin=new Admin();
admin.setUsername(username);
admin.setRealname(realname);
admin.setSex(sex);
admin.setPhone(phone);
admin.setIdcard(idcard);
admin.setProvince(province);
admin.setCity(city);
admin.setPassword(password);
AdminService adminService=new AdminServiceImpl();
PrintWriter out = resp.getWriter();
if(id==null||id==""){
//增
admin.setPassword("123456");
int flag=adminService.insert(admin);
if(flag==1){
out.print("新增成功");
}else{
out.print("新增失败");
}
out.flush();
}else {
admin.setId(Integer.valueOf(id));
//改
int flag=adminService.update(admin);
if(flag==1){
out.print("修改成功");
}else{
out.print("修改失败");
}
out.flush();
}
}
}
@WebServlet("/admindelete")
public class AdminDeleteServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("id");
AdminService adminService = new AdminServiceImpl();
Admin admin=new Admin();
admin.setId(Integer.valueOf(id));
Integer flag=adminService.delete(admin);
PrintWriter out = resp.getWriter();
out.print("删除成功");
req.getRequestDispatcher("/adminlist").forward(req,resp);
}
}
@WebServlet("/adminedit")
public class AdminEditServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("id");
AdminService adminService = new AdminServiceImpl();
Admin admin=new Admin();
admin.setId(Integer.valueOf(id));
try {
admin=adminService.selectOneById(admin);
req.setAttribute("admin",admin);
req.getRequestDispatcher("/files/admin/add.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/adminlist")
public class AdminListServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("UTF-8");
AdminService adminService = new AdminServiceImpl();
Page page=new Page();
//获取当前页面
String currno = req.getParameter("currPageNo");
//获取条件
String username = req.getParameter("username");
Admin admin=new Admin();
admin.setUsername(username);
if(currno==null){
currno="1";
}else{
page.setCurrPageNo(Integer.valueOf(currno));
}
List<Admin> adminlist = new ArrayList<>();
try {
List countList = adminService.selectAllAdmin(null);
page.setTotalCount(countList.size());
adminlist=adminService.selectAdminsByPage(admin,Integer.valueOf(currno),page.getPageSize());
page.setList(adminlist);
req.setAttribute("page",page);
req.setAttribute("username",username);
req.getRequestDispatcher("/files/admin/list.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/infoedit")
public class InfoEditServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("id");
AdminService adminService = new AdminServiceImpl();
Admin admin=new Admin();
admin.setId(Integer.valueOf(id));
try {
admin=adminService.selectOneById(admin);
req.setAttribute("admin",admin);
req.getRequestDispatcher("/files/admin/info.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/infolist")
public class InfoListServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("UTF-8");
InfoService infoService=new InfoServiceImpl();
Page page=new Page();
//获取当前页面
String currno = req.getParameter("currPageNo");
//获取条件
String eventName = req.getParameter("eventName");
//获取状态
String flag = req.getParameter("flag");
Info info=new Info();
info.setFlag(Integer.valueOf(flag));
info.setEventName(eventName);
if(currno==null){
currno="1";
}else{
page.setCurrPageNo(Integer.valueOf(currno));
}
List<Info> infolist = new ArrayList<>();
try {
List countList = infoService.selectAllInfos(info);
page.setTotalCount(countList.size());
infolist=infoService.selectInfosByPage(info,Integer.valueOf(currno),page.getPageSize());
page.setList(infolist);
req.setAttribute("page",page);
req.setAttribute("eventName",eventName);
req.setAttribute("flag",flag);
req.getRequestDispatcher("/files/info/list.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/resultedit")
public class RecordEditServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("id");
ResultService resultService = new ResultServiceImpl();
Result result=new Result();
result.setId(Integer.valueOf(id));
req.setAttribute("id",id);
req.getRequestDispatcher("/files/result/add.jsp").forward(req,resp);
}
}
@WebServlet("/recordsave")
public class RecordSaveServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//获取页面信息
String id=req.getParameter("infoId");
String noReson=req.getParameter("noReson");
Record record=new Record();
record.setInfoId(Integer.valueOf(id));
record.setNoReson(noReson);
Date nowdate=new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
record.setChecktime(sdf.format(nowdate));
HttpSession session=req.getSession();
Admin admin=(Admin)session.getAttribute("user");
record.setCheckname(admin.getUsername());
RecordService recordService=new RecordServiceImpl();
PrintWriter out = resp.getWriter();
//增
int flag=recordService.insert(record);
//修改信息表状态
Info info=new Info();
info.setId(Integer.valueOf(id));
InfoService infoService=new InfoServiceImpl();
try {
info=infoService.selectInfoById(info);
info.setFlag(-1);
infoService.update(info);
//获取当前用户虚构提交的次数
Integer zs=infoService.countCusWg(info.getCusName());
UserService userService=new UserServiceImpl();
User user=new User();
if(zs>=2){
user=userService.selectUserByName(info.getCusName());
user.setStatus(2);
//封号
userService.update(user);
}
if(flag==1){
out.print("驳回成功");
}else{
out.print("驳回失败");
}
out.flush();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/inforecord")
public class InfoRecordServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("infoId");
RecordService recordService=new RecordServiceImpl();
Record record=new Record();
record.setInfoId(Integer.valueOf(id));
List<Record> recordList=new ArrayList<>();
try {
recordList=recordService.selectRecords(record);
if(recordList.size()!=0){
record = recordList.get(0);
}
req.setAttribute("record",record);
req.getRequestDispatcher("/files/info/inforecord.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/resultsave")
public class ResultAddServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//获取页面信息
String id=req.getParameter("infoId");
String result1=req.getParameter("result");
Result result=new Result();
result.setInfoId(Integer.valueOf(id));
result.setResult(result1);
Date nowdate=new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
result.setReturnTime(sdf.format(nowdate));
HttpSession session=req.getSession();
Admin admin=(Admin)session.getAttribute("user");
result.setReturnPerson(admin.getUsername());
ResultService resultService=new ResultServiceImpl();
PrintWriter out = resp.getWriter();
//增
int flag=resultService.insert(result);
//修改信息表状态
Info info=new Info();
info.setId(Integer.valueOf(id));
InfoService infoService=new InfoServiceImpl();
try {
info=infoService.selectInfoById(info);
info.setFlag(2);
infoService.update(info);
if(flag==1){
out.print("新增成功");
}else{
out.print("新增失败");
}
out.flush();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/resultinfo")
public class ResultInfoServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String id=req.getParameter("infoId");
ResultService resultService=new ResultServiceImpl();
Result result=new Result();
result.setInfoId(Integer.valueOf(id));
List<Result> results=new ArrayList<>();
try {
results=resultService.selectResults(result);
if(results.size()!=0){
result = results.get(0);
}
req.setAttribute("result",result);
req.getRequestDispatcher("/files/result/inforesult.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@WebServlet("/resultinfolist")
public class ResultListServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("UTF-8");
InfoService infoService=new InfoServiceImpl();
Page page=new Page();
//获取当前页面
String currno = req.getParameter("currPageNo");
//获取条件
String eventName = req.getParameter("eventName");
//获取状态
String flag = req.getParameter("flag");
Info info=new Info();
info.setFlag(Integer.valueOf(flag));
info.setEventName(eventName);
if(currno==null){
currno="1";
}else{
page.setCurrPageNo(Integer.valueOf(currno));
}
List<Info> infolist = new ArrayList<>();
try {
List countList = infoService.selectAllInfos(info);
page.setTotalCount(countList.size());
infolist=infoService.selectInfosByPage(info,Integer.valueOf(currno),page.getPageSize());
page.setList(infolist);
req.setAttribute("page",page);
req.setAttribute("eventName",eventName);
req.setAttribute("flag",flag);
req.getRequestDispatcher("/files/result/list.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
7.总结
在开发基于JavaWeb的网络不良信息举报平台的过程中,我们充分利用了JavaWeb技术的特点和优势,成功搭建了一个功能完善、安全可靠的平台。以下是我们在开发过程中的一些总结和收获:
(1)技术选型合理:JavaWeb技术提供了丰富的工具和框架,使得我们能够快速开发出一个功能完善的平台。我们选择了适合该项目的JavaWeb开发技术-JDBC、Servlet,这些技术能够提高开发效率,并且具备良好的扩展性和可维护性。
(2)用户体验考虑到位:在平台的设计中,我们注重用户体验,力求提供简洁、直观的操作界面,以便用户能够快速上手并完成举报操作。同时,也考虑到用户隐私和安全,提供了举报的功能,保护用户的个人信息和安全。
(3)安全性措施健全:由于涉及到用户上传的举报材料,我们在开发过程中特别注重平台的安全性。针对用户上传的文件,我们进行了严格的审核,确保安全性。
总之,通过基于JavaWeb的开发,我们成功搭建了一款网络不良信息举报平台,实现了安全、快捷、匿名举报的功能,并加入了社交化设计来促进用户参与和信息交流。在开发过程中,我们充分利用JavaWeb技术的优势,兼顾了平台的功能性、安全性和用户体验,为用户提供了一个高效、便捷的举报途径,帮助净化网络空间并维护社会秩序。