* [简介](#简介)
* [项目概述](#项目概述)
* [部署](#部署)
* [线上部署](#线上部署)
* [本地部署](#本地部署)
* [项目难度](#项目难度)
* [实现步骤](#实现步骤)
* [权限模块](#权限模块)
* [首页](#首页)
* [分页](#分页)
* [邮箱注册](#邮箱注册)
* [登录](#登录)
* [验证码](#验证码)
* [状态保持](#状态保持)
* [设置头像](#设置头像)
* [简单的权限管理](#简单的权限管理)
* [发帖评论私信](#发帖评论私信)
* [敏感词过滤](#敏感词过滤)
* [发帖](#发帖)
* [评论](#评论)
* [私信](#私信)
* [统一异常处理](#统一异常处理)
* [统一记录日志](#统一记录日志)
* [点赞关注](#点赞关注)
* [点赞](#点赞)
* [关注](#关注)
* [缓存优化](#缓存优化)
* [代替session存储验证码](#代替session存储验证码)
* [存储登录凭证](#存储登录凭证)
* [存储用户信息](#存储用户信息)
* [系统通知](#系统通知)
* [搜索](#搜索)
* [其他](#其他)
* [认证授权](#认证授权)
* [置顶加精删除](#置顶加精删除)
* [网站统计](#网站统计)
* [UV独立访客统计](#uv独立访客统计)
* [DAU日活统计](#dau日活统计)
* [热帖排行](#热帖排行)
* [头像上传云服务器](#头像上传云服务器)
* [本地缓存](#本地缓存)
* [服务器部署](#服务器部署)
# 简介
## 项目概述
本项目是依据2019年牛客项目,基于SSM + Spring Boot + Thymeleaf开发的论坛社区网站,网站实现了如下功能:
- 使用Spring Email + Interceptor + Spring Security等实现网站权限模块开发,完成注册、登录、退出、状态、设置、授权等功能。
- 实现网站核心功能,包括首页、帖子、评论、私信、敏感词过滤、全局异常处理、统一日志记录。
- 使用Redis实现其他功能模块,包括点赞、关注、网站数据统计、缓存优化,其中缓存主要为:验证码、登录凭证、会话信息。
- 引入Kafka的目的主要是为了异步生产消费事件,包括评论、点赞、关注时的系统通知,以及Elasticsearch服务器的更新。
- 使用Elasticsearch实现全文搜索。
- 基于Quartz定时任务实现热帖排行;使用Caffeine做热帖服务器缓存,提升性能。
后面我会罗列一些我认为的重点,梳理项目的后台实现步骤。
总结图如下:
![项目总结](https://creasbucket.oss-cn-shanghai.aliyuncs.com/markdown/项目总结.png)
## 部署
### 线上部署
项目最终部署到了阿里云ECS上, [项目地址](http://8.140.189.108/)
### 本地部署
略。
## 项目难度
本人是把这个项目作为学校工程实践前的热身项目。整个项目约需1个月,可作为Java练手项目,快速了解热门框架和组件的基本使用。项目可改进的地方有很多,最后会提到。
# 实现步骤
## 权限模块
### 首页
首页进行帖子的展示,依据一般后台开发业务流程进行实现:数据库建表->Java对应entity实体类->mapper层接口->接口对应的xml文件实现crud逻辑(Mybatis)->service层->controller层->页面。
![image-20210514153620299](https://creasbucket.oss-cn-shanghai.aliyuncs.com/markdown/image-20210514153620299.png)
### 分页
通过Page类封装分页逻辑:
```java
public class Page {
//当前页码,默认1
private int current = 1;
//每页显示上限,默认10
private int limit = 10;
//数据总数
private int rows;
//查询路径,复用分页链接
private String path;
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
if(current >= 1) {
this.current = current;
}
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
if(limit >= 1 && limit <= 100) {
this.limit = limit;
}
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
if(rows >= 0) {
this.rows = rows;
}
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
/**
* 获取当前页的起始行
* @return
*/
public int getOffset() {
return (current - 1) * limit;
}
/**
* 获取总页数
* @return
*/
public int getTotal() {
if(rows % limit == 0) {
return rows / limit;
} else {
return rows /limit + 1;
}
}
/**
* 获取起始页码
* @return
*/
public int getFrom() {
int from = current - 2;
return Math.max(from, 1);
}
/**
* 获取终止页码
* @return
*/
public int getTo() {
int to = current + 2;
return Math.min(to, getTotal());
}
}
```
前台传来的current等参数通过controller的Page类参数进行封装,从而实现页面跳转。该模块可用于其他地方大量复用。
HomeController层对于Page类的使用:
```java
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String getIndexPage(Model model, Page page) {
page.setRows(discussPostService.findDiscussPostRows(0));
page.setPath("/index");
List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit());
List<Map<String,Object>> discussPosts = new ArrayList<>();
if(list != null) {
for(DiscussPost discussPost : list) {
Map<String,Object> map = new HashMap<>();
map.put("post", discussPost);
map.put("user", userService.findUserById(discussPost.getUserId())); //这里也可以在map层做级联查询调出user数据
discussPosts.add(map);
}
}
model.addAttribute("discussPosts", discussPosts);
//model加page可以省略
return "/index";
}
```
### 邮箱注册
对前台传来的注册表单数据进行判重判空和数据库匹配后,如果能注册,将用户数据插入数据库:
```java
//注册
user.setSalt(NcCommunityUtil.generateUUID().substring(0,5));
user.setPassword(NcCommunityUtil.md5(user.getPassword() + user.getSalt()));
user.setType(0); //普通用户
user.setStatus(0); //还未激活
user.setActivationCode(NcCommunityUtil.generateUUID());
user.setHeaderUrl(String.format("http://images.nowcoder.com/head/%dt.png", new Random().nextInt(1000)));
user.setCreateTime(new Date());
userMapper.insertUser(user);
```
注意:密码的存储是经过加盐和md5加密的,防止密码泄露。数据库存储了该用户的盐和加密的密码。
然后发送激活邮件:
```java
//发送激活邮件
Context context = new Context();
context.setVariable("email", user.getEmail());
context.setVariable("url", domain + contextPath + "/activation/" + user.getId() + "/" + user.getActivationCode()); //激活链接
String content = templateEngine.process("/mail/activation", context);
new Thread(new Runnable() {
@Override
public void run() {
mailClient.sendMail(user.getEmail(), "激活账号", content);
}
}).start(); //由于发送邮件太慢,直接交给多线程去处理
```
mailClient工具类封装了JavaMailSender进行邮箱激活,需要在配置文件中进行邮箱SMTP服务的配置。这里用子线程去发送邮件,防止卡顿时间过长。
邮箱里的激活链接即是通过"/activation/{userId}/{code}"访问路径修改用户的status字段,使其可用。
### 登录
登录时检查信息正确性的逻辑和注册时基本一致,需�
没有合适的资源?快使用搜索试试~ 我知道了~
基于SSM + Spring Boot + Thymeleaf开发的论坛社区网站
共133个文件
java:77个
html:25个
xml:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 163 浏览量
2022-04-28
15:53:40
上传
评论
收藏 323KB ZIP 举报
温馨提示
简介 项目概述 部署 线上部署 本地部署 项目难度 实现步骤 权限模块 首页 分页 邮箱注册 登录 验证码 状态保持 设置头像 简单的权限管理 发帖评论私信 敏感词过滤 发帖 评论 私信 统一异常处理 统一记录日志 点赞关注 点赞 关注 缓存优化 代替session存储验证码 存储登录凭证 存储用户信息 系统通知 搜索 其他 认证授权 置顶加精删除 网站统计 UV独立访客统计 DAU日活统计 热帖排行 头像上传云服务器 本地缓存 服务器部署
资源推荐
资源详情
资源评论
收起资源包目录
基于SSM + Spring Boot + Thymeleaf开发的论坛社区网站 (133个子文件)
mvnw.cmd 6KB
global.css 2KB
discuss-detail.css 243B
letter.css 181B
login.css 36B
.gitignore 423B
discuss-detail.html 15KB
my-post.html 13KB
my-reply.html 11KB
index.html 10KB
letter.html 10KB
letter-detail.html 10KB
notice.html 9KB
notice-detail.html 8KB
login.html 8KB
setting.html 8KB
search.html 8KB
register.html 8KB
followee.html 8KB
follower.html 8KB
profile.html 7KB
data.html 7KB
forget.html 7KB
operate-result.html 6KB
500.html 5KB
404.html 5KB
activation.html 479B
student.html 429B
forget.html 427B
view.html 219B
demo.html 203B
maven-wrapper.jar 50KB
MessageController.java 11KB
DiscussPostController.java 9KB
UserService.java 8KB
UserController.java 8KB
LoginController.java 7KB
ElasticsearchTest.java 6KB
DiscussPostService.java 5KB
MavenWrapperDownloader.java 5KB
FollowService.java 5KB
SecurityConfig.java 5KB
FollowController.java 4KB
SensitiveFilter.java 4KB
MaperTest.java 4KB
AlphaController.java 4KB
ThreadPoolTest.java 4KB
EventConsumer.java 4KB
ElasticSearchService.java 3KB
CommentController.java 3KB
DataService.java 3KB
QuartzConfig.java 3KB
PostScoreRefreshJob.java 3KB
LikeService.java 3KB
DiscussPost.java 3KB
LoginTicketInterceptor.java 3KB
HomeController.java 3KB
RedisKeyUtil.java 3KB
LikeController.java 2KB
RedisTest.java 2KB
User.java 2KB
MessageService.java 2KB
SearchController.java 2KB
CommentService.java 2KB
CaffeineTest.java 2KB
ServiceLogAspect.java 2KB
Comment.java 2KB
NccommunityApplicationTests.java 2KB
DataController.java 2KB
WebMvcConfig.java 2KB
ExceptionAdvice.java 2KB
Message.java 2KB
Page.java 2KB
KafkaTest.java 1KB
Event.java 1KB
RedisConfig.java 1KB
MessageMapper.java 1KB
MessageInterceptor.java 1KB
CommunityConstant.java 1KB
MailClient.java 1KB
LoginRequiredInterceptor.java 1KB
DatabaseEndpoint.java 1KB
AlphaService.java 1KB
KaptchaConfig.java 1KB
NcCommunityUtil.java 1KB
LoginTicket.java 1KB
MailTest.java 1KB
SensitiveTest.java 1KB
DataInterceptor.java 1KB
QuartzTest.java 986B
DiscussPostMapper.java 929B
LoginTicketMapper.java 869B
LoggerTest.java 852B
EsConfig.java 846B
NccommunityApplication.java 678B
CookieUtil.java 641B
EventProducer.java 576B
NccommunityServletInitializer.java 508B
HostHolder.java 471B
UserMapper.java 464B
共 133 条
- 1
- 2
资源评论
自不量力的A同学
- 粉丝: 765
- 资源: 2785
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python爬虫实战开发之bs4应用和xpath结合实战操作.zip
- 电子课程设计项目《多功能数字时钟(包括了基本的计数显示,还有提高部分,如星期和月份的动态展示)》+项目源码+文档说明
- C#大型OA源码 网络在线办公平台源码数据库 SQL2008源码类型 WebForm
- RV1106编译速度、驱动加载
- tensorflow安装-不同操作系统环境下TensorFlow的安装指南与步骤
- 谷歌浏览器网页自动刷新插件
- 黑龙江大学数据库实验三、四,模拟数据库系统
- c语言中字符串的常用操作:搜索字符串的结尾、复制字符串
- 海克斯康三坐标输出Excel报告文件定制脚本
- html css网页制作成品-HTML与CSS配合制作的静态网站基本布局实例
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功