简介:基于Java+SSM+MySQL的博客系统开发资源,面向计算机专业毕业生、课程设计及期末大作业场景,提供一套经过调试、可完整运行的博客网站前后端工程。系统功能覆盖文章发布、分类管理、评论交互等常见模块,界面简洁,适合作为高分毕业设计的参考蓝本。压缩包共775个文件,包括98个Java后端源文件、54个Vue前端组件、160个JavaScript脚本、52个CSS样式表、163个SVG图标及数据库SQL脚本,整体约34.87MB,结构清晰便于导入IDE和部署。附带的论文文档、数据库设计及bat批处理工具可辅助快速启动项目,省去环境配置与代码联调的时间。目前已有69人学习下载,适合需要直接获取完整可运行项目并对博客系统二次开发的开发者。
1. 基于 java + ssm + mysql 的博客系统:这份源码为什么值得直接下载
说实话,我拆毕业设计源码最怕遇到一种情况:作者写文档时说得天花乱坠,结果拿回来连数据库脚本都缺,光环境就配三天。这套基于 Java + SSM + MySQL 的博客系统是近期拆过比较省心的一个——源码、数据库脚本、论文三个部分都在压缩包里,前后端代码也齐,MySQL 8.0 的库脚本导入就能用,Tomcat 起来之后直接看效果。它解决的事情很明确:给你一条完整的博客系统实现路径,能登录、能发文章、能分类、能评论,后台管理界面也是现成的。适合正在做毕设想省时间的学生、要交 Java 课程设计的人,以及想搞懂 SSM 三层架构到底怎么串起来的人。下面按我实际跑通的顺序,把环境、数据库、启动、打包到避坑一路讲到底。
2. SSM 组合的逻辑:为什么这类博客毕设还选 Spring + SpringMVC + MyBatis
2.1 三层架构和博客系统的功能映射:为什么不是 Spring Boot
先回答一个很多人会问的问题:现在新项目都上 Spring Boot 了,为什么这套毕设还在用 SSM?答案很现实:毕设答辩时老师喜欢问「你了解 SSM 整合吗」,Spring Boot 把配置全藏起来了,反而不容易讲出深度。SSM 的代码路径非常清晰:Controller 收到请求 → Service 处理业务 → Mapper 执行 SQL,每一层都能在源码里明确指出来,这在答辩时是加分项。
把 SSM 的三个框架拆开看,它们和博客系统的功能点是天然对应的:
| 层次 | 框架 | 在博客系统里负责什么 |
|---|---|---|
| 表现层 | SpringMVC | 接收 /login、/article/detail 这类请求,绑定参数,返回 JSP 页面或 JSON |
| 业务层 | Spring | 管理 Service 对象,控制事务边界,比如发布文章时要同时更新文章表和分类表 |
| 持久层 | MyBatis | 把 Mapper 接口映射到 XML 里的 SQL,执行用户、文章、评论的增删改查 |
| 数据库 | MySQL 8.0 | 存储用户、文章、分类、标签、评论的最终数据 |
这套博客系统的核心链路我都走了一遍:用户在登录页输入账号密码,SpringMVC 的 LoginController 接住参数,交给 UserService 校验,UserService 再调 UserMapper 里的 selectByUsernameAndPassword 方法,最后把结果返回到 Session。新手跟着这条链路读代码,一个星期能把 SSM 整合理解得七七八八,而且这套组合也是 java 面试题里的常客,跑通一个真实项目比背十道八股文有用。
2.2 版本矩阵:JDK、MySQL、Tomcat、Maven 怎么对齐
摘要里明确写了技术组成:Java、IDEA、MySQL 8.0、Tomcat 7.x 或 8.x、Maven、Navicat。我实际跑的时候用的版本组合如下,照着配最不容易出问题:
| 组件 | 建议版本 | 说明 |
|---|---|---|
| JDK | 1.8(8u201 以上) | 毕设环境里最稳的组合,别上 JDK 17,部分老依赖会不兼容 |
| MySQL | 8.0 | 数据库脚本是按 8.0 写的,5.7 可能在某些语法上不兼容 |
| Tomcat | 8.5.x(7.0.9x 也可以) | 别用 Tomcat 10,javax.servlet 命名空间被改成 jakarta.servlet,SSM 老项目直接起不来 |
| Maven | 3.6.x | 3.8+ 对中央仓库的访问策略有变化,配好镜像即可 |
| IDEA | 2020 及以上 | 打开项目后等 Maven 依赖导入完成再动代码,别急着编译 |
| Navicat | 15 及以上 | 老版本连 MySQL 8 的默认认证插件会报 2059 错误 |
安装顺序也有讲究:先装 JDK,再装 Maven,接着是 MySQL,最后是 Tomcat 和 IDEA。每个装完立刻在命令行验证一遍,不要攒到最后一起排查:
java -version mvn -v mysql --version三个命令都能正常输出版本号,再继续下一步。MySQL 我只建议从官网下载 Community Server 8.0 安装包,不要在第三方站点找安装包,MySQL 安装教程网上很多,但版本要对得上。
2.3 装环境最常踩的三个点:变量、镜像与认证插件
第一个坑是 JAVA_HOME 配错。有同学把 JAVA_HOME 指到了 jre 目录而不是 jdk 目录,结果 Tomcat 能起来但编译总报错。还有一个常见问题是 PATH 里没加%JAVA_HOME%\bin,命令行里 java 命令都找不到。配完环境变量后要重新打开命令行窗口才生效,这是最容易忽略的。
第二个坑是 Maven 默认用中央仓库下载依赖,国内网络环境下又慢又容易断。解决办法是改 Maven 的 settings.xml,在 mirrors 节点里加阿里云镜像:
<mirror> <id>aliyun</id> <mirrorOf>central</mirrorOf> <name>Aliyun Maven Mirror</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>改完之后跑一次mvn clean compile,如果依赖能顺利拉下来,后面所有操作都会顺畅很多。
第三个坑和 MySQL 8.0 的认证插件有关。MySQL 8 默认用 caching_sha2_password,老版本的 Navicat 直接连不上,报错信息是 2059。解决方式要么升级 Navicat,要么在 MySQL 里把用户的认证方式改回 mysql_native_password,这个后面避坑章节详细说。装 MySQL 的时候还有一步容易被跳过:选服务类型时建议选「Developer Default」,字符集要选 utf8mb4,这样和中国业务系统的匹配度最高。
3. 数据库初始化:从 .sql 脚本到能连上的 blog 库
3.1 表结构清单:用户、文章、分类、标签与评论
压缩包里的数据库脚本一般是 blog.sql,导入之前先打开看一眼结构,别直接就执行。我用 Navicat 打开脚本文件,第一件事是确认三样东西:建库语句、字符集、初始数据。
这套博客系统的表设计是典型的 SSM 毕设风格,总共六张核心表:
| 表名 | 作用 | 关键字段 |
|---|---|---|
| t_user | 用户与管理员账号 | id, username, password, nickname, avatar, role |
| t_type | 文章分类 | id, name |
| t_blog | 文章主体 | id, title, content, summary, type_id, user_id, create_time, view_count, status |
| t_tag | 标签 | id, name |
| t_blog_tag | 文章-标签关联表 | blog_id, tag_id |
| t_comment | 评论 | id, blog_id, user_id, content, create_time, parent_id |
这几张表之间的关系很清楚:t_blog 通过 user_id 关联 t_user 拿到作者信息,通过 type_id 关联 t_type 拿到分类名;t_blog_tag 是文章和标签的多对多中间表;t_comment 通过 blog_id 关联文章,parent_id 字段支持楼中楼回复。status 字段在 t_blog 里控制文章是草稿还是已发布。
初始数据一般包含一个管理员账号、一个测试用户,外加几篇示例博文。管理员账号的密码通常是 123456 这种简单值,而且是用 MD5 加密后存进数据库的,直接在 SQL 里能看到加密串。这一步我建议确认清楚,后面登录要用。
3.2 导入步骤:Navicat 图形化与命令行两种方式
Navicat 图形化导入是最省事的,我用的步骤是:
- 新建连接,主机填 localhost,端口 3306,用户名 root,密码填你自己设的 MySQL 密码
- 新建数据库,库名建议用 blog,字符集选 utf8mb4,排序规则选 utf8mb4_unicode_ci
- 右键 blog 库,选择「运行 SQL 文件」,选中压缩包里的 .sql 脚本,开始执行
如果你更习惯命令行,也可以用 MySQL 自带客户端操作:
mysql -u root -p CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE blog; SOURCE /path/to/blog.sql;两点需要特别说明。字符集用 utf8mb4 而不是 utf8,是因为 utf8mb4 能存 emoji 表情,而且对中文的兼容性更好;排序规则里 unicode_ci 对中文的排序准确度比 general_ci 高。另外脚本里如果写的是CREATE TABLE IF NOT EXISTS,重复执行不会报错;如果写的是DROP TABLE IF EXISTS然后重建,那脚本执行时会把现有数据清掉,生产库千万别这么干,本地开发无所谓。
3.3 jdbc.properties 连接参数:驱动、时区与字符集
数据库建好之后,项目的数据库连接配置要改。SSM 项目的数据库配置一般放在 src/main/resources 目录下的 jdbc.properties 文件里,打开后长这样:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=你的MySQL密码四个参数每个都可能翻车,逐个说清楚。
driver 那行:MySQL 8 的官方驱动把类名改了,老项目里写的com.mysql.jdbc.Driver在 MySQL 8.0 的驱动包下直接报 ClassNotFoundException,必须要改成com.mysql.cj.jdbc.Driver。
URL 里的 characterEncoding=utf8mb4 保证中文不会乱码;useSSL=false 是因为 MySQL 8 的驱动默认会尝试 SSL 握手,本地开发如果没配证书,某些版本会在连接日志里打 SSL 告警甚至报错,索性关掉。serverTimezone=Asia/Shanghai 必须写,MySQL 8 驱动要求显式指定时区,不写会报「The server time zone value 'CST' is unrecognized」的错,这个报错信息在搜索引擎里很常见。
username 和 password 填你自己 MySQL 的账号密码。改完这个文件要重启 Tomcat 才生效,改数据库密码也一样。
4. 三个 bat 脚本:从环境预检到 WAR 包部署的完整链路
很多同学拿到压缩包里的 1-install.bat、2-run.bat、3-build.bat 就当黑匣子双击,报错了也不知道去哪看日志。其实这三个脚本只做三件事:装依赖、跑开发服务器、打部署包。我逐个拆开讲,包内实际脚本内容如果和我下面给的示例有出入,以包内为准,实现逻辑基本等价。
4.1 1-install.bat:环境预检与依赖装入本地仓库
第一个脚本的功能是环境预检和依赖安装,常见写法是这样的:
@echo off rem 检查 Maven 是否可用 mvn -v >nul 2>&1 if errorlevel 1 ( echo Maven 未安装或 PATH 未配置,请先配置环境变量 pause exit /b 1 ) echo 环境检查通过,开始安装依赖到本地仓库... mvn clean install -DskipTests pausemvn -v >nul 2>&1的意思是执行版本检查,把正常输出和错误输出都丢到空设备,这样屏幕上不会刷一堆版本信息;errorlevel 1是 Windows 批处理里判断上一条命令是否失败的标准写法,如果 Maven 没装就提示并退出。mvn clean install -DskipTests是核心操作,把项目依赖安装到本地 Maven 仓库,-DskipTests跳过测试减少时间。
这一步如果 pom.xml 里的依赖有缺失或版本冲突,会直接在这里红。看到 BUILD SUCCESS 再往下走。
4.2 2-run.bat:开发期一键启动
第二个脚本是开发期启动用的,最常见的是调用 Maven 内置 Tomcat 插件:
@echo off rem 用 Maven 内置 Tomcat 插件启动,端口默认 8080 mvn tomcat7:run -Dmaven.tomcat.port=8080 pause注意命令行的端口参数是-Dmaven.tomcat.port=8080,如果想换端口直接在后面改。执行后控制台会滚动输出日志,看到类似Starting ProtocolHandler或者INFO: Server startup in xxx ms就说明启动成功了,浏览器访问http://localhost:8080就能打开首页。
这个模式适合开发期调试,代码改了之后 Maven 插件会自动重新加载,不需要手动重启 Tomcat。如果项目里配置了热部署,改 JSP 页面直接刷新浏览器就能看到效果。
4.3 3-build.bat:打成 WAR 包并部署到 Tomcat
第三个脚本用于生产部署,核心是打包和复制:
@echo off rem 跳过测试打包 mvn clean package -DskipTests rem 把 war 复制到外部 Tomcat 的 webapps 目录,路径按你本机改 copy target\blog.war D:\apache-tomcat-8.5.99\webapps\ pausemvn clean package会在 target 目录产出 war 包,war 包的名字由 pom.xml 里的 artifactId 决定。copy命令把 war 包扔到外部 Tomcat 的 webapps 目录,启动 Tomcat 后它会自动解压部署。如果 Tomcat 已经在运行,可以等它自动热部署,或者手动重启一下更稳妥。
如果 2-run.bat 用的是 Maven 插件方式,那 3-build.bat 这条链路其实就是把项目从「开发模式」切到「部署模式」。对外展示的时候,Tomcat 独立部署比 Maven 插件更接近真实生产环境。
4.4 浏览器验证链路:从登录到发文的完整路径
启动成功之后,我习惯按下面这条链路完整走一遍,确认每个模块都正常:
- 打开首页,注册一个新账号,测试注册流程
- 用初始管理员账号登录后台,看角色权限是否区分
- 新建一个分类,写一篇测试文章,上传封面图
- 退出后台,在前台首页看文章是否能正常展示
- 点击文章详情页,在评论区发一条评论
提示:首次登录用管理员账号,具体用户名密码以数据库脚本里 t_user 表的初始数据为准,常见的样例是 admin / 123456,也有项目改成 admin / admin。
走链路的过程中盯着 Tomcat 控制台,每操作一步都会有对应的 SQL 日志刷出来,比如插入文章的 insert 语句、查询分类的 select 语句。这一步能顺便验证 MyBatis 的 SQL 映射是否正常。
5. 避坑指南:跑这套源码时最常见的 5 个翻车点
环境问题很多时候看着像玄学,实际上排错顺序是固定的。以下五条是我在拆这个项目时真实遇到过的坑,每一条都有对应的解决方案,建议直接收藏。
5.1 驱动类找不到:ClassNotFoundException: com.mysql.jdbc.Driver
现象:Tomcat 启动时,Spring 创建数据源报错,堆栈里出现ClassNotFoundException: com.mysql.jdbc.Driver。
原因:MySQL 8.0 之后官方驱动把类名改成了com.mysql.cj.jdbc.Driver,但 jdbc.properties 里还写的是旧类名;还有一种情况是 pom.xml 里的 mysql-connector-java 依赖版本是 5.x,本地 Maven 仓库装的是 8.x 的驱动,版本混了。
解决:把 jdbc.driver 改成com.mysql.cj.jdbc.Driver,同时检查 pom.xml 里 mysql-connector-java 的版本是不是 8.0.x。两个地方对齐后,这个问题基本消失。
5.2 Navicat 报 2059:caching_sha2_password 认证插件
现象:Navicat 连接 MySQL 8.0 时弹窗,报2059 - authentication plugin 'caching_sha2_password' cannot be loaded。
原因:MySQL 8 默认的认证插件是 caching_sha2_password,客户端版本太老不认识这个插件。
解决:最省事的是换 Navicat 16 及以上版本;如果暂时不想换客户端,也可以把 root 用户的认证方式改回 mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;改完之后 Navicat 旧版本也能正常连。注意localhost要换成你实际连接的主机名,远程连接的话是'root'@'%'。
5.3 本地连不上 MySQL:error 2002 (HY000)
现象:启动项目时数据库连接失败,控制台报error 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'。
原因:在 Linux 环境下,MySQL 服务没启动,或者 socket 文件路径和客户端配置不一致。在 Windows 环境下则可能是 MySQL 服务没在服务管理器里启动,或者 3306 端口被其他进程占了。
解决:分系统处理。Linux 上先执行service mysql start或者systemctl start mysqld,再看/etc/my.cnf里的 socket 路径;Windows 上打开服务管理器找到 MySQL80,确认状态是「正在运行」。最后用netstat -ano | findstr 3306确认端口没被别的程序占用。
5.4 Tomcat 启动闪退:8080 端口被占用
现象:双击 Tomcat 的 startup.bat,窗口一闪而过,什么日志都没看到。
原因:8080 端口被其他进程占用,Tomcat 绑定端口失败直接退出。
解决:在命令行执行netstat -ano | findstr 8080,拿到占用端口的 PID,然后在任务管理器里结束对应进程;或者改 Tomcat 的 conf/server.xml,把 Connector 的 port 改成 8081。如果用的是 2-run.bat 的 Maven 插件方式,直接改-Dmaven.tomcat.port参数即可。
5.5 页面样式全裸:CSS 资源 404
现象:页面 HTML 能正常显示,但没有任何样式,浏览器 F12 打开网络面板,CSS 请求全部 404。
原因:项目部署后 context path 带了项目名,页面里的静态资源路径写死了/css/xxx.css,实际访问路径变成了/项目名/css/xxx.css,找不到文件。还有可能是打 WAR 包时 webapp 下的静态资源没被包含。
解决:前端页面里的资源路径用${pageContext.request.contextPath}拼接,同时在 SpringMVC 配置里放行静态资源:
<mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/images/**" location="/images/" />包内那批样式文件,包括 bootstrap.min.css、element.min.css、front-kaoshi-style.css 等,就是要被这两个配置放行的。如果误删了这些文件或者没打进 WAR 包,页面就会全裸,所以解压压缩包时不要把目录结构改了。
6. 二次开发:把项目从「能跑」改到「答辩有得讲」
把项目跑通只是底线,要想在答辩时有东西可讲,得动点手脚。我建议至少做三个改造点,每个都不难,但都能在答辩时展开讲。
第一个改造点是给文章列表加分页。原始项目如果没做分页,文章一多页面就拉不到底。引入 PageHelper 插件,改造量很小:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency>Service 层调用分页的方式是:
PageHelper.startPage(pageNum, pageSize); List<Blog> blogList = blogMapper.selectBlogList(); PageInfo<Blog> pageInfo = new PageInfo<>(blogList);PageHelper.startPage()只对下一条查询生效,PageInfo里封装了 total、pages、list 这些分页数据。答辩时可以讲清楚 PageHelper 的底层原理是拦截器拦截了 Executor 的查询方法,自动拼 limit 语句。
第二个改造点是让博文正文支持 Markdown。原始项目大概率是纯文本展示,而 Markdown 是博客系统的标配。方案是在前端引入 marked.js 的本地文件,后端存原始 Markdown 文本,前端展示前调用marked.parse()转成 HTML。这样数据表不用动,只改展示层。
第三个改造点是把论文和源码对应起来。答辩时老师最常问「你这系统有哪些功能、数据库怎么设计的」,论文里的需求分析章节就对应前台注册登录、发文章、评论这条链路;数据库设计章节就对应 t_user、t_blog、t_tag 这几张表的关系;系统测试章节把跑通过程中的截图按模块贴进去,测试用例表格里写功能点、预期结果、实际结果。把论文的三章和源码的功能点一一对应,答辩时随便抽问都能答上来。
这三个改造点是我跑完这套 SSM 博客系统之后实际动手改过的方向,工程量都不大,但每个都能在「功能创新」和「技术深度」上各占一分。这也算我拆 SSM 项目的血泪经验:拿到一套能跑的源码,第一件事不是改功能,而是先确认 jdbc.properties 里的驱动和时区,再看 Tomcat 端口是不是被占用,最后才动业务代码。这套博客系统把这三个习惯都帮我练出来了。希望帮到你。
本文还有配套的精品资源,点击获取