基于Spring Boot的社区论坛开发
项目五:基于Spring Boot的社区论坛开发【第一章:初识Spring Boot,开发社区首页】Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便。1.介绍SSM[Spring(一套JAVA框架)、Spring MVC(处理浏览器请求)、MyBatis(访问数据库)]Spring Boot:进一步简化SpringRedis(缓存型数据库,性能好)、Kafka(消息队列
基于Spring Boot的社区论坛开发


第一章:框架基本介绍+前端页面+环境搭建
1.介绍
所有框架:
SSM开发框架:Spring(一套JAVA框架)、Spring MVC(处理浏览器请求)、MyBatis(访问数据库)
Spring Boot:进一步简化Spring(JDK>=8)
Redis(缓存型数据库,性能好)、Kafka(消息队列)、ElasticSearch(搜索)
Spring Security(安全)
开发环境:

2.搭建开发环境
(1)maven

(2)Spring Initializer(Spring Boot项目的启动工具)
(先用SpringInitializr初始化;搜不到的包就用原始的maven去搜,把指令放到项目的pom.xml文件的<dependencies>标签中)
3.Spring入门
(1)Spring框架:

(2)标注Bean的注解:

(3)装配Bean的注解
@Autowired:属于Springorg.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注入。
@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@PostConstruct和@PreDestroy:实现初始化和销毁bean之前进行的操作。
4.Spring MVC入门
前后端交互的框架。




5.Mybatis入门
访问数据库的框架。

6.开发社区首页
7.项目调试技巧
8.版本控制
第二章:开发社区登录模块
1.发送邮件
(1)邮箱设置
a、新浪邮箱,设置客户端SMTP
(2)Spring Email
a、导入jar包(配置maven:新建maven项目>>>pom.xml文件中配置parent+dependency+build(ctrl+shift+O一键导入))
b、邮箱参数配置

c、使用JavaMailSender接口发送HTML邮件
(3)模板引擎
使用Thymeleaf发送HTML邮件。
2.开发注册功能
(1)访问注册页面
a、点击顶部区域内的链接,打开注册页面
thymeleaf:SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术,如:Freemarker,Thymeleaf,Mustache
(2)提交注册数据
a、通过表单提交数据
b、服务端验证账号是否存在、邮箱是否注册
c、服务端发送激活邮件
(3)激活注册账号
a、点击邮件中的链接,访问服务端的激活服务
3.会话管理

4.生成验证码
a、导入jar包
b、springboot未对其进行整合,所以要编写Kaptcha配置类(@Bean注解)
c、生成随机字符、生成图片
5.开发登录、退出功能

6.显示登录信息
7.账号设置
8.检查登陆状态
【第三章:Spring Boot实践,开发社区核心功能】
1.过滤敏感词

前缀树流程:

@Component
public class SensitiveFilter {
private static final Logger logger = LoggerFactory.getLogger(SensitiveFilter.class);
// 替换符
private static final String REPLACEMENT = "***";
// 根节点
private TrieNode rootNode = new TrieNode();
@PostConstruct
public void init() {
try (
InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
) {
String keyword;
while ((keyword = reader.readLine()) != null) {
// 添加到前缀树
this.addKeyword(keyword);
}
} catch (IOException e) {
logger.error("加载敏感词文件失败: " + e.getMessage());
}
}
// 将一个敏感词添加到前缀树中
private void addKeyword(String keyword) {
TrieNode tempNode = rootNode;
for (int i = 0; i < keyword.length(); i++) {
char c = keyword.charAt(i);
TrieNode subNode = tempNode.getSubNode(c);
if (subNode == null) {
// 初始化子节点
subNode = new TrieNode();
tempNode.addSubNode(c, subNode);
}
// 指向子节点,进入下一轮循环
tempNode = subNode;
// 设置结束标识
if (i == keyword.length() - 1) {
tempNode.setKeywordEnd(true);
}
}
}
/**
* 过滤敏感词
*
* @param text 待过滤的文本
* @return 过滤后的文本
*/
public String filter(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
// 指针1
TrieNode tempNode = rootNode;
// 指针2
int begin = 0;
// 指针3
int position = 0;
// 结果
StringBuilder sb = new StringBuilder();
while (position < text.length()) {
char c = text.charAt(position);
// 跳过符号
if (isSymbol(c)) {
// 若指针1处于根节点,将此符号计入结果,让指针2向下走一步
if (tempNode == rootNode) {
sb.append(c);
begin++;
}
// 无论符号在开头或中间,指针3都向下走一步
position++;
continue;
}
// 检查下级节点
tempNode = tempNode.getSubNode(c);
if (tempNode == null) {
// 以begin开头的字符串不是敏感词
sb.append(text.charAt(begin));
// 进入下一个位置
position = ++begin;
// 重新指向根节点
tempNode = rootNode;
} else if (tempNode.isKeywordEnd()) {
// 发现敏感词,将begin~position字符串替换掉
sb.append(REPLACEMENT);
// 进入下一个位置
begin = ++position;
// 重新指向根节点
tempNode = rootNode;
} else {
// 检查下一个字符
position++;
}
}
// 将最后一批字符计入结果
sb.append(text.substring(begin));
return sb.toString();
}
// 判断是否为符号
private boolean isSymbol(Character c) {
// 0x2E80~0x9FFF 是东亚文字范围
return !CharUtils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);
}
// 前缀树
private class TrieNode {
// 关键词结束标识
private boolean isKeywordEnd = false;
// 子节点(key是下级字符,value是下级节点)
private Map<Character, TrieNode> subNodes = new HashMap<>();
public boolean isKeywordEnd() {
return isKeywordEnd;
}
public void setKeywordEnd(boolean keywordEnd) {
isKeywordEnd = keywordEnd;
}
// 添加子节点
public void addSubNode(Character c, TrieNode node) {
subNodes.put(c, node);
}
// 获取子节点
public TrieNode getSubNode(Character c) {
return subNodes.get(c);
}
}
}
2.发布帖子
AJAX异步请求:当前网页不刷新,访问服务器,返回一个新的页面增量,对网页进行局部刷新。

3.帖子详情
4.事务管理
(1)事务简介

(2)事务的并发异常
a、更新类并发异常


b、读取类并发异常



(3)事务的隔离级别
事务的并发异常,导致必须要有事务隔离。


(4)事务管理实现机制


5.显示评论

6.添加评论(会用到事务管理)

7.私信列表

8.发送列表
9.统一异常处理

10.统一记录日志(AOP)



【第四章:Redis,一站式高性能存储方案】
1.Redis入门

2.Spring整合Redis

3.点赞

4.我收到的赞

5.关注、取消关注

6.关注列表、粉丝列表

7.优化登录模块

【第五章:Kafka,构建TB级异步消息系统】
1.阻塞队列

2.Kafka入门

3.Spring整合Kafka

4.发送系统通知

5.显示系统通知
【第六章:Elasticsearch,分布式搜索引擎】
1.Elasticsearch入门

2.Spring整合Elasticsearch

3.开发社区搜索功能
【第七章:项目进阶,构建安全高效的企业服务】
1.Spring Security
2.权限控制
3.置顶、加精、删除
4.Redis高级数据类型
5.网站数据统计
6.任务执行和调度
7.热帖排行
8.生成长图
9.将文件上传至云服务器
10.优化网站的性能
【第八章:项目发布与总结】
1.单元测试
2.项目监控
3.项目部署

4.项目总结
论坛功能及技术栈:

论坛架构图:

面试关键:
(1)基本素养:基础(算法、数据结构、计算机基础)
(2)项目(直接干活,技术栈是否全面)
(3)钻研能力(长板)
5、项目相关面试题

更多推荐




所有评论(0)