基于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、项目相关面试题

 

 

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐