简介一套基于JavaEE与MySQL实现的个人博客系统完整毕业设计资源包面向计算机相关专业学生及JavaWeb入门与进阶学习者适合毕业设计、课程设计、大作业或工程实训。系统实现博主端全部核心模块登录模块使用Shiro安全管理并加密校验密码博客管理支持标题、类型选择及百度富文本编辑器发布同时提供博客类别管理、评论审核、个人信息维护、友情链接管理、修改密码及缓存刷新等功能能清晰展示后台管理系统的典型业务闭环。ZIP压缩包约179.66MB包含项目源码、数据库SQL脚本、毕业论文、答辩PPT和演示操作视频其中源码可直接导入IDE运行SQL脚本包含建表及初始数据论文与PPT覆盖开题答辩文档需求。当前已有95人浏览学习适合需要从零搭建项目、理解JavaWeb分层架构或补齐毕业设计全套材料的读者。1. 个人博客系统一套 JavaEE 源码把毕设的完整闭环讲清楚了一个基于 JavaEE MySQL 的个人博客系统真正跑起来之后你会发现它不只是一个能发文章的网站而是把登录认证、权限拦截、内容发布、评论区审核、文件上传这些 JavaWeb 开发里最常碰到的功能全部串在了一起。对于正在准备毕业设计、课程设计或者想拿一个工程实训项目练手的人来说这套源码最值钱的地方在于它能让你在几天内跑通一个完整业务而不是停留在增删改查的层面。博主端有六大模块从前台游客浏览博客、按类别筛选文章到后台博主审核评论、管理友链每一块都有明确业务归属代码结构也是标准的三层架构新手能顺着脉络读进阶的人可以在上面扩展搜索、归档、分类统计这些功能。2. 系统架构与核心设计Shiro 认证、三层分工与数据表边界2.1 三层架构与模块划分代码该放哪一层边界在哪个人博客系统采用 JavaEE 经典的三层架构表现层负责页面渲染和用户交互业务层处理博客发布、评论审核、类别维护等逻辑持久层通过 DAO 与 MySQL 交互。项目里 Controller、Service、DAO 分层清晰查找代码时从 Controller 层往下追每一步都能定位到具体实现而不是把所有逻辑堆在一个 Servlet 里面。这个分层方式对学习项目意义很大。第一职责单一想给评论模块加一个“精华评论”功能只需要改 Service 层和对应 Mapper不会碰博客列表的代码。第二利于排错页面报错时看控制台异常栈能判断是数据库 SQL 写错还是业务逻辑抛错。第三答辩时老师让你画系统架构图直接把三层结构和模块归属画出来已经是一个合格的回答。模块划分上前台面向游客提供博客列表、博客详情、按类别检索、发表评论后台是博主专属包含登录、博客管理、博客类别管理、评论信息管理、个人信息管理、系统管理。游客与博主的权限边界由 Shiro 控制游客访问后台会被拦截重定向到登录页博主身份校验通过后才能访问管理页面。这个权限设计是整个项目最值得先读的部分它决定了后续所有模块都在什么前提下运行。各模块间的数据关系并不复杂但边界要清楚。博客管理只负责文章的增删改查和发布类别管理维护博客分类的排序和重命名评论管理则围绕“审核通过/不通过”这个状态变化展开。不要在一个模块里去操作另一个模块的数据表这是阅读源码和二次开发时最需要遵守的规矩。2.2 数据库设计博客、类别、评论三张核心表的关系与字段取舍数据库是这个项目的业务地基。核心表主要是博客表、博客类别表、评论表。博主表存储管理员账号信息密码字段保存 Shiro 加密后的密文配套表结构里一般还会有一张友情链接表来支撑系统管理模块。博客表和类别表之间存在一对多关系一个类别下可以有多篇博客用 type_id 外键关联。博客表大致结构如下CREATE TABLE blog ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, content LONGTEXT, type_id INT, release_date DATETIME, click_hit INT DEFAULT 0, KEY idx_type_id (type_id) ) ENGINEInnoDB DEFAULT CHARSETutf8;title 是博客标题长度设 200 比较合理既能容纳长标题又不至于过度占用索引空间。content 必须用 LONGTEXT 而不是 VARCHAR因为百度富文本编辑器提交的内容是一整段 HTMLVARCHAR 的 255 字符上限根本不够存。release_date 用来做首页按时间排序和后续的月度归档这是前台展示最常用的过滤维度。click_hit 是点击量字段如果你要在答辩里演示“热门博客排行”它就是现成的数据支撑。评论表里有个容易被忽略的字段status。这个字段直接决定了审核功能能不能跑通CREATE TABLE comment ( id INT PRIMARY KEY AUTO_INCREMENT, blog_id INT, user_name VARCHAR(50), content TEXT, status TINYINT DEFAULT 0, comment_date DATETIME ) ENGINEInnoDB DEFAULT CHARSETutf8;status 用 0、1、2 三个值分别表示待审核、已通过、已驳回。游客提交评论时默认落到 0博主审核通过改成 1前台查询只捞 status1 的数据。这个设计在你答辩时会很有用——老师问“如何控制恶意评论”你直接回答“评论默认不可见博主审核后才会展示”这是一个从业务需求出发的方案不是空谈。建表时统一用 InnoDB 引擎和 utf8 字符集。InnoDB 支持事务和外键博客更新、评论状态变更这些操作不会留下半截数据。字符集不统一的话中文内容入库后变乱码后面排查起来非常麻烦。我在看很多课程设计时发现一个共性问题表结构里字符集混用一张表 utf8另一张表 latin1前台页面一旦做多表联查中文就花掉。拿到源码后第一件事把 SQL 文件里的建表语句全部检查一遍。2.3 Shiro 登录认证原理为什么不是简单判断 Session 是否为空很多课程设计做登录就靠 Session登录成功往 Session 里塞一个用户对象每个页面开头判断 Session 是否为空。这种做法能跑通但有两个短板每写一个页面都要重复一遍判断逻辑且没有集中的安全框架来管理登录、退出、权限拦截。这套博客系统用 Shiro 做安全管理登录模块对密码做了加密再与数据库比对不是在代码里写死用户名密码。Shiro 里三个核心概念要理解Subject 是当前操作用户的抽象SecurityManager 是认证和授权的调度中心Realm 负责从数据库读取用户信息交给 Shiro 比对。项目中的自定义 Realm 继承 AuthorizingRealm 类重点实现 doGetAuthenticationInfo 方法从用户表查出账号记录返回给 Shiro 的认证流程去做密码匹配。密码加密环节是登录模块和一个普通 CRUD 的最大区别。Shiro 将用户输入的明文密码通过散列算法加密再与数据库存储的密文比对。加入盐值后即使用户密码相同生成的密文也不同能有效对抗彩虹表破解。迭代次数增加会拉高暴力破解成本。答辩时把“为什么不能直接存明文密码”讲清楚比空谈项目功能更有说服力。那 Shiro 这么做是不是增加了理解成本对第一次学 JavaWeb 的人确实有一点门槛但只要理解 Subject、Realm、加密校验这条链路后面看登录模块就会非常轻松。3. 五个业务模块的关键实现从登录校验到评论审核的代码落点3.1 登录与退出密码加密、Shiro 认证流程和会话管理登录功能是后台系统的入口流程大致是前台页面提交账号密码Controller 接收后封装成 Shiro 的 UsernamePasswordToken通过 Subject.login(token) 触发认证。SecurityManager 调用 RealmRealm 去数据库查出用户记录比较密码密文一致则认证通过并跳转后台首页。密码加密的关键逻辑如下// 对用户输入的原始密码做加盐散列生成数据库存储的密文 String salt blog_salt; // 固定盐值需与项目配置文件保持一致 int hashIterations 2; // 散列迭代次数 Md5Hash md5Hash new Md5Hash(rawPassword, salt, hashIterations); String encryptedPwd md5Hash.toHex();这里的三个参数要分清楚rawPassword 是用户输入的明文密码salt 是盐值hashIterations 是迭代次数。项目里盐值通常是固定的这也意味着如果你改动数据库里的密码字段必须用相同的盐值和迭代次数重新生成密文否则登录永远失败。拿到项目后我建议先别急着改密码把原始账号跑通一次再通过代码里的加密入口生成新密文去修改数据库。Shiro 登录还有一个隐藏好处配置在 Shiro 里的过滤器链会自动拦截未认证请求不需要在每个 Controller 里重复写 Session 判断。退出登录时调用 subject.logout()Shiro 会清空会话和认证信息这是自己手写 Session 方案最容易遗漏的部分——Session 没清干净登出后再访问后台依然畅通。3.2 博客发布与富文本编辑器UEditor 集成和 HTML 内容入库写博客页面需要博客标题、选择博客类别、正文使用百度富文本编辑器编辑。发布时编辑器里的内容以 HTML 格式提交给后台Java 后端接收后存入博客表的 content 字段。整个链路里最需要注意的不是字段接收而是 HTML 内容的安全处理和图片路径管理。编辑器生成的内容可能包含恶意脚本比如 img 标签的 onerror 事件或者 script 标签。入库前的过滤是安全底线。常见做法是使用 Jsoup 做白名单清洗// 过滤富文本内容只保留安全标签防止 XSS 攻击 import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; String safeContent Jsoup.clean(htmlContent, Whitelist.relaxed());这里 Whitelist.relaxed() 保留了 p、span、img、a 等常用标签同时移除 script、iframe 和事件属性。如果直接把原始 HTML 入库并在前台 innerHTML 渲染一旦有人提交恶意脚本其他用户浏览时就会被执行。这类问题在答辩的“项目安全性”提问中很常见你能答出“富文本内容做了标签白名单过滤”已经比大量只完成增删改查的作业高出不少。图片处理是另一个高频踩坑点。默认情况下图片可能被保存到项目部署目录下的临时目录Tomcat 重启就丢。我会建议把上传目录改到项目外部的磁盘路径比如在 Windows 下用 D:/upload再把 Tomcat 的访问路径映射到这个目录。数据库里只存相对访问路径这样换机器部署时不会因为磁盘路径不一致导致图片全部打不开。3.3 博客类别管理排序字段和联动更新的取舍类别管理模块支持增加、修改、删除类别名称和排序序号。这个模块页面简单但涉及和博客表的外键联动。删除类别时如果该类别下还有博客外键关系会断裂前台按类别检索时列表为空或者直接报错。项目代码里你需要关注的逻辑是在删除前判断关联博客数量。逻辑上是先执行一条 COUNT 查询SELECT COUNT(*) FROM blog WHERE type_id ?如果大于 0提示用户先转移该类别下的博客或者强制将这类博客的 type_id 置为默认分类。直接 DELETE 是数据库层没问题但业务上会留下脏数据。这个细节虽然只有几行代码但处理的是真实业务场景中典型的“关联数据完整性”问题二次开发时还会遇到。排序序号字段 order_num 通常数字小的排前面。前台首页的“按日志类别”区域就是按照这个字段排序输出。修改排序后前台的展示顺序会变化如果你的项目缓存了类别列表要在后台点“刷新系统缓存”让改动生效。这个小细节很容易被忽略排序改了但页面没变不是代码错了是缓存没刷新。3.4 评论信息与审核先审后发的状态流转控制评论模块分为评论审核和评论信息管理。游客在前台提交评论后不会立刻显示博主在后台审核通过评论才会出现在页面上。这个“先审后发”的机制在实现上就是评论表里的 status 字段流转。游客提交评论的默认状态是 0博主审核时将它更新为 1 或 2前台展示只捞状态为 1 的记录。审核操作的 SQL 也很直接UPDATE comment SET status 1 WHERE id ? AND status 0加一个 status 0 的查询条件可以避免重复审核覆盖状态。这个业务逻辑值得你认真理解因为它体现了“权限控制”在真实业务中的含义未经审核的内容即使写进了数据库也不会出现在访客面前。审核不通过的评论可以保留数据便于日后追溯这比直接 DELETE 更合理。答辩时老师可能会问“为什么不直接把垃圾评论删掉”你可以回答“保留数据便于统计恶意用户特征同时避免误删”这样的回答能展现对业务边界的思考。3.5 个人信息维护与系统管理头像上传、密码修改和友链管理博主个人信息模块支持修改昵称、个性签名、个人头像和个人简介。头像上传和前文富文本图片上传共用同一套文件存储逻辑接收 MultipartFile保存到指定上传目录再把访问路径写入用户信息表。修改密码模块在业务上要走“验证旧密码 → 生成新密文 → 更新数据库”的顺序这里再次用到 Shiro 的加密入口。系统管理模块里的友情链接管理是一张独立小表包含链接名称和链接地址前台首页底部或者侧边栏展示。刷新系统缓存功能用于清理缓存数据这在新增评论或修改类别后非常关键。密码修改是另一个安全细节修改成功后需要重新登录因为 Shiro 的认证信息已经过期。很多同学在这里漏了 session 失效处理结果改完密码还是旧权限这就在答辩演示时比较尴尬。4. 把项目跑起来环境准备、数据库导入与 Tomcat 部署的完整流程4.1 版本组合怎么选JDK 1.8、Tomcat 8.5 与 MySQL 5.7 为什么是稳妥答案源码包要跑起来第一步是把环境配到和项目兼容。常见且稳定的搭配是 JDK 1.8 Tomcat 8.5/9 MySQL 5.7三个版本是我经手多个类似 JavaEE 项目后验证过的兼容组合。JDK 1.8 是这类传统 JavaWeb 项目最稳妥的编译运行环境高版本 JDK 偶尔会碰到依赖库内部反射访问受限、JAXB 组件缺失之类的问题只会额外消耗调试时间。MySQL 5.7 的驱动和连接配置兼容性也更好尤其适合配合项目里自带 SQL 文件直接导入。如果本机已经装了 MySQL 8.0也可以跑但要注意 JDBC URL 里必须追加 serverTimezoneAsia/Shanghai并且使用 mysql-connector-java 8.x 驱动否则时区报错会直接卡住项目启动。网络上有大量 mysql 安装教程尤其 5.7.44 的 Windows 安装记录很详细装完之后第一步是用命令行客户端确认能连上 MySQL再开始导入 SQL。环境准备清单大致如下JDK 1.8 安装并配置 JAVA_HOMEMaven 3.6并检查 settings.xml 镜像源Tomcat 8.5 或 9注意端口 8080 不能被占用MySQL 5.7安装时字符集选 utf8mb4。这几项都确认之后再把项目导入 IDE会省掉大量连锁报错。4.2 数据库导入SQL 文件执行与连接配置的修改点拿到源码包后数据库 SQL 文件通常以 .sql 结尾。导入前先用编辑器打开搜索 CREATE DATABASE 和 USE 关键字确认目标数据库名避免导错位置。编码乱码从这一步就要防范打开文件时如果乱码说明 SQL 文件本身用了 UTF-8 而编辑器按 GBK 解析这会影响导入后的中文内容。导入命令在命令行执行mysql -u root -p123456 blog.sql-p 与密码之间没有空格SQL 文件路径如果包含空格需要加引号。导入完成后查看数据库表清单SHOW TABLES;确认包含 user、blog、blogtype、comment 等表后进入项目配置修改环节。打开 jdbc.properties 或 application.properties核心是以下三条jdbc.urljdbc:mysql://localhost:3306/blog?useUnicodetruecharacterEncodingutf-8useSSLfalse jdbc.usernameroot jdbc.password123456这里的 blog 要和 SQL 文件里的数据库名一致username 和 password 要从“你的本地 MySQL 用户名密码”出发修改不要默认认为一定是 root。如果你改了密码但项目配置没有同步启动时报错几乎必然出现。这也是我处理这类项目时最先检查的位置先看配置再看日志而不是反复重启 Tomcat。4.3 项目导入与启动IDEA 里最关键的四个配置点如果你用 IDEA 导入项目先判断项目是 Maven 结构还是普通 Web 工程。Maven 结构需要在导入后等待依赖下载完成如果一直报红检查 settings.xml 的镜像源。普通 Web 工程则要检查 lib 目录下是否自带 jar 包缺失依赖会让编译直接报错。项目导入后按下面顺序确认配置检查 Project Structure 里的 JDK 版本与编译级别必须统一为 1.8确认 Artifact 打包方式Web 工程一般选 war exploded方便热部署配置 Tomcat 时Deployment 中的 Application context 写成 /blog确保访问路径和项目上下文一致启动前先执行 Build → Rebuild Project避免 class 文件未编译。如果不用 IDE也可以命令行 Maven 打包mvn clean install -DskipTests打包完成后将 war 包复制到 Tomcat webapps 目录再启动cd $CATALINA_HOME/bin ./startup.sh启动日志出现 “Server startup in xxxx ms”说明 Tomcat 已就绪。访问 http://localhost:8080/blog/ 能看到前台首页就说明 Spring 容器、MyBatis 映射、数据库连接全部打通。如果页面 404优先检查 Application context 是否配置正确——这是我排查这类问题时的第一反应因为部署名错误导致的 404 概率远大于代码问题。4.4 启动后的功能验证路径评论提交与后台审核的完整闭环项目启动成功不代表业务都是通的。我习惯按下面顺序走一遍验证打开前台首页确认博客列表和类别归档区域正常展示点击博客详情正文渲染完整图片能加载在文章底部提交一条评论观察是否提示提交成功用博主账号登录后台进入评论审核模块找到这条评论点击审核通过返回前台刷新页面确认评论已经显示再试新增一篇博客用富文本编辑器写内容并发布退出登录直接访问后台地址确认被拦截跳转到登录页。这套流程跑通后这个项目的核心链路就没有问题了。当中任何一步失败直接跳到下一章的排查思路数据库配置问题占一半缓存刷新问题占三成剩下两成是部署路径问题。5. 避坑指南登录失败、富文本图片丢失等 5 个真实翻车现场5.1 登录页一直提示账号或密码错误现象账号密码确定无误但登录页始终提示认证失败后台日志显示 AuthenticationException。原因项目 SQL 里初始账号的密码是作者用固定盐值加密过的密文你直接改动了数据库中的密码字段用明文覆盖导致 Shiro 拿用户输入的密码加密后与库中密文对比失败。解决确认 Shiro 配置里的 salt 值用同一个盐值和迭代次数调用密码加密工具类生成新密文再 UPDATE 到数据库用户表中。稳妥做法是项目跑通前不要修改密码先确认原始账号能登录再通过代码里现成的加密方法生成密文更新。这条坑我踩过不止一次每次拿到新项目都提醒自己先跑通再改密码。以后你再接手别的源码项目登录进不去时第一件事不是看数据库而是去配置文件里找加密盐值再检查数据库密文是否是同一种算法生成的。5.2 富文本编辑器图片上传成功刷新后图片全部丢失现象写博客时上传图片编辑区能看到预览发布后刷新页面图片位置变成一个小图标或者直接空白。原因图片被保存到项目部署目录下的临时文件夹比如 target 或 webapps 内部。Tomcat 重启或清理 target 目录后图片文件被删除引用路径自然失效。解决将上传目录改到项目外部例如 D:/blog_upload再配置 Tomcat 虚拟路径映射Context docBaseD:/blog_upload path/upload reloadabletrue /数据库里保存的图片路径写 /upload/xxx.jpg而不是带盘符的绝对路径。这样换机器部署时只要改 Context 的 docBase数据库里的路径不用动。图片上传功能在毕设演示中出现频率很高如果答辩前没有验证过“重启 Tomcat 后图片还在不在”它极有可能在老师面前翻车。5.3 数据库导入后中文乱码现象前台页面中文全是问号数据库表中存储的中文内容也是问号。原因SQL 文件执行时客户端和服务端字符集不一致或者建表语句里没有指定 CHARSETutf8。SQL 文件里新建了表连接用的默认字符集是 latin1中文字符在导入时已经损坏。解决执行导入前设置客户端字符集SET NAMES utf8mb4;同时确认 MySQL 的 character_set_server 参数为 utf8mb4。连接配置里的 JDBC URL 保持 useUnicodetruecharacterEncodingutf-8。字符集统一设置到位以后这类乱码基本不会再出现。5.4 Tomcat 启动正常访问前台或后台却 404现象Tomcat 启动日志正常也没有报错但浏览器访问首页 404后台登录页也打不开。原因Artifact 部署名配置不对访问路径里少了项目上下文名。比如部署名为 blog你却直接访问 http://localhost:8080/Tomcat 找不到应用。另一个可能是编译输出目录里缺 class 文件。解决先看 IDEA 或 Eclipse 里 Tomcat 的 Deployment 配置确认 Application context 是否为 /blog。再检查输出目录 target/classes 下是否有刚编译的 class 文件。如果 class 文件缺失执行 Build → Rebuild Project 重新编译再重启 Tomcat。这个问题不大但影响面很大因为所有页面都会 404。5.5 启动时报通信连接失败或时区异常现象项目启动控制台出现 Communications link failure、Connection refused 或 Cannot create PoolableConnectionFactory 异常。原因MySQL 服务未启动、数据库账号密码错误、端口被多个 MySQL 实例占用或者 MySQL 8.0 下没有配置 serverTimezone 参数。解决先在命令行单独执行 mysql 连接确认服务可用。再逐一核对 JDBC URL、username、password。如果本机装了多个 MySQL 版本检查 3306 端口被哪个实例占用netstat -ano | findstr 3306找到占用端口的进程号后去任务管理器确认对应的 MySQL 实例。这类连接问题定位思路是先确认服务端在跑再确认客户端参数匹配。从日志倒推而不是反复重启项目能省下大量时间。6. 把通用模板改成自己的毕设三条改造思路、验证清单和 20 分钟自查习惯拿到一套可运行的 JavaEE 博客系统直接照搬去答辩多少有点冒险。我拿到它之后的改造思路是分成三步走每一步都比较小但足够在答辩时讲出具体逻辑。第一步是视觉改造。把前台页面里能看到的标题、Logo、页脚文案换成你自己的名字和主题再调整 CSS 主色调。比如把默认蓝改成深绿把页脚换成自己的博客口号。这类改动没有技术难度但它会让老师第一眼觉得这是经过个人加工的。第二步是业务加功能。最轻松见效的是给博客列表加分页涉及前台博客查询 SQL 里的 LIMIT 参数以及分页条组件的数据回显。再进一步可以加“按月份归档”按 release_date 聚合查询月份数据点击月份后筛选该月博客列表。第三步是给评论模块加一个精华评论标记在评论审核页面增加 status3前台博客详情页中优先展示这些评论这个功能涉及 SQL 查询排序和状态流转代码量不大但能体现连贯的业务思考。改造后的验证清单我总结成四条每次改完都按这个顺序自查修改博主信息后前台侧边栏的昵称、头像、简介是否同步更新新增博客带图片发布后重启 Tomcat 图片是否还能访问游客提交一条待审核评论后台通过后前台是否显示驳回后前台是否隐藏修改数据库密码后项目 JDBC 配置是否同步更新并重启验证。这四项是这类博客系统最容易出问题的地方每项都不超过五分钟但能覆盖将近七成的演示事故场景。从那以后我每次拿到新的毕业设计源码项目都会强制自己走一遍固定流程先原封不动跑通一次然后只改数据库密码再跑一次最后才动业务代码。整个过程大概 20 分钟但它能让我对项目结构的理解从“会运行”提升到“会排查”——这套习惯也是我认为这套源码能带给你的最大价值。希望这份拆解能帮你在做毕设或课程设计时少走点弯路把时间真正花在理解业务逻辑本身。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?