系统介绍
系统将使用Tomcat服务器部署Java环境,使用Eclipse开发软件,系统采用B/S架构,采用面向对象编程思想,对系统进行分层,通过MVC模式将系统分为控制器,视图及模型三部分,后台使用Java语言在WEB平台上用spring+spring mvc+mybatis为核心技术框架将其整合完成相关设计;模型层通过JDBC技术连接MySQL数据库,进行持久化数据存储,对使用架构模块进行分析验证和问题总结,在分析总结的基础上对网站中涉及到的功能需求进行技术选择,以求构建一个功能完善的网站。
功能模块 系统主要包含管理员和用户两类用户,管理员拥有以下功能。
- 公告模块:主要实现撰写公告通知、发布活动消息等。
- 审核模块:主要包括对用户帖子内容进行审核,对涉及不良信息的帖子及所属账号进行处理。
- 权限管理模块:主要实现赋予管理员权限,对VIP用户,版主,普通用户,游客等进行相应的等级升降并赋予不同的操作权限。
- 统计模块:注册总人数、当前贴子总数、贴子点击总数、当前在线人数,版面点击数等进行统计,更直观的表现一些实时信息。
用户拥有以下功能:
- 登录/注册模块:主要实现用户注册、登录账号。
- 个人信息模块:主要实现对用户基本信息以及用户头像的显示以及修改功能,可充值‘论坛币’以进行打赏帖子。
- 帖子分类模块:主要实现帖子信息的大体展示,帖子分类展示或根据导航栏现实的分类进行跳转,主要进行单一类别帖子的展示功能。
- 帖子详情模块:主要实现某条帖子详情的展示,包括多级评论回复功能,还包括点赞、收藏、打赏、举报等小功能。
- 撰帖/删贴模块:主要实现帖子的编写并发帖;还包含草稿箱功能:未写完的帖子可以存入草稿箱,或从草稿箱中读取曾经保存的草稿。删除已经无用的帖子等功能。
文章管理模块的控制:
@Controller
@RequestMapping("articleComplaint")
public class ArticleComplaintController {
@Autowired
private ArticleComplaintService articleComplaintService;
@Autowired
private UserService userService;
@Autowired
private ArticleService articleService;
/**
* 投诉
* @param articleComplaintEntity
* @return
* @throws Exception
*/
@RequestMapping("insert.htmx")
@ResponseBody
public Result insert(ArticleComplaintEntity articleComplaintEntity, HttpSession session)throws Exception{
UserEntity userEntity = (UserEntity) session.getAttribute("user");
articleComplaintEntity.setId(IdWorker.get32UUID());
articleComplaintEntity.setTime(new Date());
articleComplaintEntity.setStatus(1);
articleComplaintEntity.setUid(userEntity.getId());
articleComplaintService.insert(articleComplaintEntity);
return Result.success("感谢您的投诉,我们将尽快处理");
}
/**
* 列表
* @param model
* @return
* @throws Exception
*/
@GetMapping("indexPage.htm")
public String indexPage(Model model)throws Exception{
return "articleComplaint/list";
}
/**
* 分页
* @param model
* @return
* @throws Exception
*/
@GetMapping("page.htm")
@ResponseBody
public PageVo indexPage(Model model, int page , int limit)throws Exception{
EntityWrapper entityWrapper = new EntityWrapper();
entityWrapper.orderBy("status",true).orderBy("time",false);
Page< ArticleComplaintEntity> paged = new Page();
paged.setSize(limit);
paged.setCurrent(page);
Page<ArticleComplaintEntity> userTablePage = articleComplaintService.selectPage(paged, entityWrapper);
List<ArticleComplaintEntity> list =userTablePage.getRecords();
if(list!=null){
for (ArticleComplaintEntity entity : list) {
UserEntity userEntity = userService.selectById(entity.getUid());
if(userEntity!=null){
entity.setName(userEntity.getName());
}
ArticleEntity articleEntity = articleService.selectById(entity.getAid());
if(articleEntity!=null){
entity.setTitle(articleEntity.getTitle());
}
}
}
PageVo<ArticleComplaintEntity> pageVo = new PageVo<>();
pageVo.setCode(0);
pageVo.setCount(paged.getTotal());
pageVo.setData(userTablePage.getRecords());
pageVo.setPageNum(limit);
pageVo.setPageSize(page);
return pageVo;
}
/**
* 保存
* @param model
* @return
*/
@PostMapping("save.htm")
@ResponseBody
public Result savePage(Model model , ArticleComplaintEntity entity){
articleComplaintService.updateById(entity);
return Result.success("用户保存成功");
}
}
系统的首页展示:
<head>
<meta charset="utf-8">
<title>在线交流平台</title>
<link rel="stylesheet" href="/resources/res/layui/css/layui.css">
<link rel="stylesheet" href="/resources/res/css/global.css">
</head>
<body style="">
<div class="fly-header layui-bg-black">
<div class="layui-container">
<a class="fly-logo" href="/">
<img src="/resources/images/logo.jpg" style="height: 40px;" alt="layui">
</a>
<ul class="layui-nav fly-nav-user">
<li class="layui-hide-xs layui-hide-sm layui-show-md-inline-block" ><input type="text" value="${title}" id="title" class="layui-input"></li>
<li class="layui-hide-xs layui-hide-sm layui-show-md-inline-block" style="margin-left: 15px;"><a class="layui-btn layui-btn-primary" onclick="sunsec()">搜索</a></li>
<!-- 未登入的状态 -->
<c:if test="${loginFlag== false}">
<li class="layui-nav-item">
<a class="iconfont icon-touxiang layui-hide-xs" onclick="login()"></a>
</li>
<li class="layui-nav-item">
<a style="cursor:pointer" onclick="login()" >登入</a>
</li>
<li class="layui-nav-item">
<a style="cursor:pointer" onclick="reg()">注册</a>
</li>
</c:if>
<c:if test="${loginFlag== true}">
<input type="hidden" id="userLv" value="${user.lv}">
<li class="layui-nav-item">
<a class="fly-nav-avatar" href="javascript:;">
<cite class="layui-hide-xs">${user.name}</cite>
<c:if test="${user.lv<3}">
<i class="layui-badge fly-badge-vip layui-hide-xs" onclick="vip()">升级VIP</i>
</c:if>
<c:if test="${user.lv==3}">
<i class="layui-badge fly-badge-vip layui-hide-xs">${user.integralName}</i>
</c:if>
<img src="${user.headerImg}">
</a>
<dl class="layui-nav-child">
<dd><a href="/userInfo/info.htmx"><i class="layui-icon" style="margin-left: 2px; font-size: 22px;"></i>我的主页</a></dd>
<hr style="margin: 5px 0;">
<dd><a href="/logOut.htmx" style="text-align: center;">退出</a></dd>
</dl>
</li>
</c:if>
</ul>
</div>
</div>
<div style="height: 10px;">
</div>
<div class="fly-panel" style="position: absolute;right: 50px;width: 200px;height: 300px;">
<div class="fly-panel-title fly-filter" style="background-color: #AFCEED">
<a>站长统计</a>
</div>
<ul style="text-align: center;">
<li style="margin-top: 20px;">
<span style="color: #01AAED"> 帖子点击总量:</span> ${countA}
</li>
<li style="margin-top: 20px;">
<span style="color: #01AAED">注册人数:</span> ${countUser}
</li>
<li style="margin-top: 20px;">
<span style="color: #01AAED">平台帖子总数:</span> ${countActivity}
</li>
</ul>
</div>
<div class="layui-container" >
<div class="layui-row layui-col-space15">
<div class="layui-col-md12" >
<c:if test="${content!=''}">
<div class="fly-panel" >
<div class="fly-panel-title fly-filter">
<a>公告</a>
</div>
<ul class="fly-list">
<li>
<div class="fly-list-info">
<a >
<cite>${content}</cite>
</a>
</div>
</li>
</ul>
</div>
</c:if>
<div class="fly-panel">
<div class="fly-panel-title fly-filter">
<a>置顶</a>
</div>
<ul class="fly-list">
<c:forEach items="${topArticle}" var="article">
<li>
<a href="/article/info.htmx?id=${article.id}" class="fly-avatar">
<img src="${article.cover}" >
</a>
<h2>
<a class="layui-badge">置顶</a>
<a href="/article/info.htmx?id=${article.id}" target="view_window" >${article.title}</a>
</h2>
<div class="fly-list-info">
<a href="#" target="view_window" >
<cite>${article.userName}</cite>
<c:if test="${article.userId != '-1'}">
<i class="layui-badge fly-badge-vip">${article.integralName}</i>
</c:if>
</a>
<span>${article.time}</span>
<span class="fly-list-nums"><i class="iconfont icon-pinglun1" title="评论"></i> ${article.num}</span>
</div>
</li>
</c:forEach>
</ul>
</div>
<div class="fly-panel" style="margin-bottom: 0;">
<div class="fly-panel-title fly-filter">
<a style="cursor:pointer" class="layui-this types" onclick="typek(this,'')" >综合</a>
<c:forEach items="${childTypes}" var="childType">
<span class="fly-mid"></span>
<a style="cursor:pointer" class="types" onclick="typek(this,'${childType.id}')" >${childType.name}</a>
</c:forEach>
<span class="fly-filter-right layui-hide-xs"><a href="" class="layui-this">按最新排序</a><span class="fly-mid"></span></span>
</div>
<ul class="fly-list">
<c:forEach items="${articleEntities}" var="article">
<li class=" article ${article.childType}">
<a href="/article/info.htmx?id=${article.id}" class="fly-avatar">
<img src="${article.cover}" >
</a>
<h2>
<a class="layui-badge" >${article.childName}</a>
<a href="/article/info.htmx?id=${article.id}" target="view_window" >${article.title}</a>
</h2>
<div class="fly-list-info">
<a href="#" target="view_window">
<cite >${article.userName}</cite>
<c:if test="${article.userId != '-1'}">
<i class="layui-badge fly-badge-vip">${article.integralName}</i>
</c:if>
</a>
<span>${article.time}</span>
<span class="fly-list-nums">
<i class="iconfont icon-pinglun1" title="评论数量"></i> ${article.num}
</span>
</div>
</li>
</c:forEach>
</ul>
</div>
</div>
</div>
</div>
<div class="fly-footer" style="background-color: black;color: white">
<p><a target="_blank">博客</a> 2020 © <a target="_blank">xxxx 出品</a></p>
</div>
<script src="/resources/res/layui/layui.js"></script>
<script src="/resources/jquery-2.2.4.js"></script>
<script src="/resources/base.js"></script>
<script>
layui.config({
version: "3.0.0"
,base: '/resources/res/mods/' //这里实际使用时,建议改成绝对路径
}).extend({
fly: 'index'
}).use(['fly','layer'],function () {
});
function sunsec(){
window.location.href="/?title="+$("#title").val();
}
$(function () {
setTimeout(userLv,1000)
});
function userLv() {
var userLv =$("#userLv").val();
if(userLv==1){
//自定页
layer.alert('抱歉,您已被降级,将无法进行发帖以及评论功能',{
title:"用户等级提示",
skin: 'layui-layer-demo', //样式类名
closeBtn: 0, //不显示关闭按钮
anim: 2,
shadeClose: true, //开启遮罩关闭
icon:2,
});
}
}
/**
* vip充值
*/
function vip() {
layui.layer.open({
type: 2,
title: 'vip充值',
shadeClose: true,
shade: 0.8,
area: ['800px', '645px'],
content: '/user/vip.htmx' //iframe的url
});
}
function typek(b,type) {
$(".types").removeClass("layui-this");
$(b).addClass("layui-this");
if(type==""){
$(".article").show();
}else{
$(".article").hide();
$("."+type).show();
}
}
function yuedu(id) {
window.open('/article/info.htmx?id='+id);
}
function login() {
layui.layer.open({
type: 2,
title: '用户登录',
shadeClose: true,
shade: 0.8,
area: ['600px', '445px'],
content: '/login.htmx' //iframe的url
});
}
function reg() {
layui.layer.open({
type: 2,
title: '游客注册',
shadeClose: true,
shade: 0.8,
area: ['600px', '445px'],
content: '/reg.htmx' //iframe的url
});
}
function sunmitStu(){
window.open("/study.htmx");
}
function fabiao() {
layui.layer.open({
type: 2,
title: '发表文章',
shadeClose: true,
shade: 0.8,
area: ['90%', '90%'],
content: '/article/add.htmx' //iframe的url
});
}
</script>
</body>
后台管理登录入口:
用户注册:
用户的个人主页: