☰
Java毕业设计实战:个人日记系统全栈开发指南
2026/10/8 13:46:28 网站建设 项目流程

简介:这是一份面向计算机专业本科生的Java毕业设计实战资源,聚焦个人日记本系统开发全流程,帮助学生快速完成选题、编码、数据库搭建与部署交付。资源包含4个核心文件:2个MP4部署与演示视频(覆盖环境配置、项目导入、数据库连接及功能测试)、1个SQL数据库脚本(含用户、日记、权限等表结构及初始化数据)、1个ZIP源码包(基于Java Web技术栈,采用MVC分层架构,集成Servlet/JSP或Spring Boot框架,含完整前后端代码、JUnit测试用例及规范化的工程目录)。压缩包共53MB,结构清晰、开箱即用。已有1556人学习下载,特别适合零基础起步的毕设开发者——不仅提供可直接运行的参考系统,更通过视频手把手还原真实部署场景,辅以可执行SQL脚本和模块化源码,显著降低环境适配与调试门槛,有效规避常见编译错误、数据库连接失败等典型问题。

1. 为什么一个“个人日记本系统”能撑起整个Java毕业设计?——它不是玩具,而是全栈能力的最小闭环验证场

你手头这个压缩包里塞着的,不是什么花哨的AI聊天机器人,也不是高并发秒杀系统,而是一个用Java写的、带完整前后端和数据库的个人日记本系统。但恰恰是它,成了高校计算机专业毕业设计里复现率最高、答辩通过率最稳、企业面试官一眼就能看出你是否真写过代码的“黄金模板”。原因很简单:它把Java工程师日常要打交道的全部核心链路——从JDBC连接池配置、MyBatis-Plus动态SQL生成、Spring Boot自动装配、Thymeleaf模板渲染,到MySQL建表规范、事务边界控制、文件上传路径处理、甚至Tomcat部署时的context-path冲突——全都压缩在一个不到2000行源码的项目里。它不追求性能极限,但每一步都踩在Java Web开发的真实痛点上:比如用户登录后怎么保持会话、删除日记时如何保证外键级联不崩、日期格式在前后端之间怎么对齐、导出PDF时中文乱码怎么破。如果你能把它本地跑通、改出新功能、再部署到自己买的云服务器上,那你就已经完成了从“学语法”到“写工程”的关键跃迁。这不是玩具,是照进真实开发世界的棱镜。


2. 从解压到运行:三步走通本地开发环境(含JDK、IDEA、MySQL版本避坑)

2.1 环境清单与版本锁定:别信“最新版万能”,Java毕业项目只认稳定组合

这个压缩包里的pom.xml和application.yml是你的第一份说明书。打开它,先确认三件事:

  • pom.xml中<java.version>标签值(常见为1.8或17)——这决定了你必须装对应JDK;
  • spring-boot-starter-parent版本(如2.7.18或3.2.4)——Spring Boot 2.x用JDK 8/11,3.x强制JDK 17+;
  • mysql-connector-java或mysql-driver依赖版本(如8.0.33)——它要求MySQL服务端版本≥5.7,且不能是MySQL 8.0.32之后的某些小版本(有SSL握手兼容问题)。

提示:我见过太多同学卡在第一步——装了JDK 21,但项目是Spring Boot 2.6写的,结果mvn clean compile直接报Unsupported class file major version 65。解决方法只有一个:删掉所有JDK,重装项目指定版本。JDK 8用jdk-8u202,JDK 17用jdk-17.0.1,别图新。

2.2 IDEA导入与Maven依赖拉取:别点“Auto-import”,手动触发更可控

解压后,在IDEA中选择File → Open → 选中项目根目录(注意不是.zip,是解压后的文件夹)。此时IDEA会弹窗问是否启用Maven支持,务必勾选“Enable auto-import”并点击OK——但别急着写代码,先做三件事:

  1. 检查右下角Maven面板是否显示项目结构(如有pom.xml图标但无子模块,说明未识别成功);
  2. 手动点击Maven工具栏的Reload project按钮(不是自动刷新);
  3. 观察底部Build窗口输出:若出现[INFO] BUILD SUCCESS且无Could not resolve dependencies报错,说明依赖已拉全。

如果卡在Downloading xxx.jar from https://repo.maven.apache.org/...超过2分钟,大概率是公司/校园网拦截了Maven中央仓库。这时要改settings.xml(位于~/.m2/或IDEA内置Maven配置目录),把<mirror>节点换成阿里云镜像:

<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>

改完保存,再点一次Reload project。血泪经验:别等IDEA自己重试,手动干预能省2小时。

2.3 MySQL数据库初始化:建库、建表、插初始数据,三步缺一不可

项目文档(通常是README.md或doc/数据库说明.txt)里一定有SQL脚本路径,常见为src/main/resources/sql/init.sql或database/diary_db.sql。别直接双击运行——MySQL Workbench或Navicat里执行前,先做两件事:

  1. 手动创建数据库(编码必须为utf8mb4):
    CREATE DATABASE diary_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 确认MySQL服务已启动且端口3306未被占用(Windows用netstat -ano | findstr :3306,Linux用lsof -i:3306);

然后打开SQL脚本,检查前三行是否含USE diary_db;,如果没有,手动在开头加上。接着全选执行。常见失败点:

  • 脚本里含CREATE TABLE IF NOT EXISTS但字段类型写成datetime(6)——MySQL 5.6不支持精度声明,需删掉(6);
  • INSERT INTO user VALUES (...)语句里密码是明文'123456',但项目用BCrypt加密,会导致登录失败——此时要查UserServiceImpl.java里密码加密逻辑,用BCryptPasswordEncoder.encode("123456")生成密文再更新数据库。

注意:执行完SQL后,用命令行验证:mysql -u root -p -e "USE diary_db; SELECT COUNT(*) FROM t_diary;"。返回1或大于0,说明数据已就位。


3. 启动与调试:Spring Boot应用跑不起来的5个高频死穴与绕过方案

3.1 端口冲突:8080被占用?别急着改代码,先查进程再杀

启动Application.java时控制台第一行常是Tomcat started on port(s): 8080 (http),但如果看到Address already in use: bind,说明8080已被占。别第一反应去改application.yml里的server.port——先定位谁在抢:

  • Windows:netstat -ano | findstr :8080→ 得到PID →taskkill /f /pid XXXX
  • macOS/Linux:lsof -i :8080→ 得到PID →kill -9 PID

如果查不到PID(尤其Mac上),可能是Chrome的DevTools远程调试占了端口,关掉所有Chrome窗口再试。实在不行,再改配置:

server: port: 8081 servlet: context-path: /diary # 避免根路径冲突,后续访问地址变成 http://localhost:8081/diary

3.2 数据库连接拒绝:URL、用户名、密码一个都不能错,且顺序有讲究

控制台报Failed to configure a DataSource或Access denied for user 'root'@'localhost',90%是application.yml里数据库配置写错了。标准格式如下(以MySQL 8.0为例):

spring: datasource: url: jdbc:mysql://localhost:3306/diary_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false username: root password: your_password_here driver-class-name: com.mysql.cj.jdbc.Driver

关键参数说明:

  • serverTimezone=Asia/Shanghai:不加会报The server time zone value 'XXX' is unrecognized;
  • allowPublicKeyRetrieval=true&useSSL=false:MySQL 8.0默认开启SSL,本地开发关掉更省事;
  • driver-class-name:Spring Boot 2.4+必须显式声明,否则找不到驱动。

提示:密码含特殊字符(如@、/)时,URL里要用%40、%2F转义,否则解析失败。

3.3 Thymeleaf模板找不到:路径、后缀、缓存,三者联动失效

登录后跳转/index.html却报Whitelabel Error Page,或页面显示纯HTML文本(没渲染),说明Thymeleaf没生效。检查三点:

  1. pom.xml是否含spring-boot-starter-thymeleaf依赖(没有就加);
  2. 模板文件是否放在src/main/resources/templates/下(不是static!);
  3. 控制器返回字符串是否匹配文件名(如return "index";对应index.html)。

如果仍不渲染,加一行配置关缓存(开发阶段必需):

spring: thymeleaf: cache: false enabled: true prefix: classpath:/templates/ suffix: .html encoding: UTF-8

3.4 文件上传失败:路径权限、临时目录、大小限制,一个都不能松

日记里上传图片时提示Failed to parse multipart servlet request,本质是Spring Boot对文件上传做了默认限制。在application.yml里补全:

spring: servlet: multipart: max-file-size: 10MB max-request-size: 10MB location: /tmp/upload/ # Linux/macOS用,Windows建议写 D:/temp/upload/

Windows特别注意:location路径必须存在且IDEA有写入权限。手动创建D:\temp\upload文件夹,右键→属性→安全→编辑→添加当前用户“完全控制”权限。

3.5 日志全屏刷ERROR:别慌,先看最后一行,再查日志级别

启动时满屏红字,但应用实际能用——这是日志级别太低导致DEBUG信息刷屏。在application.yml里调高日志级别:

logging: level: root: WARN com.diary: INFO # 你的包名,如com.example.diary org.springframework.web: WARN

这样既保留关键业务日志,又过滤掉Spring内部的DEBUG噪音。


4. 功能验证与二次开发:从“能跑”到“能改”的三个实操入口

4.1 用户管理模块:增删改查背后的MyBatis-Plus魔法与陷阱

项目里用户表(t_user)通常用MyBatis-Plus实现CRUD。打开UserMapper.java,你会发现它继承BaseMapper<User>,但没写任何SQL——这就是MP的“约定优于配置”。验证方式:

  1. 启动后访问http://localhost:8081/diary/login,用初始账号登录;
  2. 进入后台管理页(常见路径/admin/user/list),尝试新增用户;
  3. 查看MySQL:SELECT * FROM t_user WHERE username = 'test';确认数据入库。

想加个“手机号唯一校验”?别直接改XML,用MP的@TableField注解:

@TableField(value = "phone", unique = true) // 在User实体类的phone字段上加 private String phone;

再在UserService里加校验逻辑:

public boolean save(User user) { if (user.getPhone() != null && this.lambdaQuery().eq(User::getPhone, user.getPhone()).count() > 0) { throw new RuntimeException("手机号已存在"); } return super.save(user); }

注意:MP的count()方法底层仍是SQL查询,别在循环里滥用。

4.2 日记内容搜索:LIKE模糊查询的性能雷区与优化方案

搜索框输入“Java”查日记,后端常用LIKE '%Java%',但数据量超500条就明显卡顿。打开DiaryMapper.java,找到搜索方法:

@Select("SELECT * FROM t_diary WHERE content LIKE CONCAT('%', #{keyword}, '%')") List<Diary> search(@Param("keyword") String keyword);

立即优化:

  • 加索引:ALTER TABLE t_diary ADD INDEX idx_content(content(255));(前缀索引,避免全文索引复杂度);
  • 前端加防抖:输入停顿300ms再发请求,减少无效查询;
  • 后端加空值判断:if (StringUtils.isBlank(keyword)) return new ArrayList<>();

4.3 导出PDF功能:iText7中文支持的字体嵌入硬核操作

点击“导出PDF”报java.lang.NoClassDefFoundError: com/lowagie/text/Document?说明项目用的是旧版iText 2.x(GPL协议),但压缩包里可能漏了jar包。正确做法是升级到iText7(AGPL,但个人学习免费):

  1. pom.xml里删掉旧依赖,加新依赖:
    <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core-kernel</artifactId> <version>7.2.5</version> <type>pom</type> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>font-asian</artifactId> <version>7.2.5</version> </dependency>
  2. Java代码里加载中文字体:
    PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true); // 或用项目resources/fonts/simhei.ttf(需提前放入)

关键点:UniGB-UCS2-H是Adobe定义的中文编码,不用它中文就是方块。


5. 部署到云服务器:从本地Jar包到公网可访问的全流程(含Nginx反向代理)

5.1 打包与上传:Maven clean package后,别漏掉application-prod.yml

在IDEA终端执行:

mvn clean package -Dmaven.test.skip=true

生成的target/diary-system-1.0.jar就是部署包。但注意:本地application.yml是开发配置,生产环境必须用独立配置。在src/main/resources/下新建application-prod.yml:

spring: profiles: active: prod datasource: url: jdbc:mysql://127.0.0.1:3306/diary_db?... username: prod_user password: strong_password server: port: 8080 servlet: context-path: /

打包时指定配置:

mvn clean package -Pprod -Dmaven.test.skip=true

(前提是pom.xml里定义了<profile>,否则直接改application.yml的spring.profiles.active: prod)

用scp上传到服务器:

scp target/diary-system-1.0.jar user@your-server-ip:/home/app/

5.2 服务器环境准备:JDK、MySQL、防火墙,三件套缺一不可

登录服务器后,依次执行:

  1. 装JDK 17(以Ubuntu为例):

    wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.deb sudo apt install ./jdk-17_linux-x64_bin.deb java -version # 验证
  2. 开MySQL远程访问(仅限测试,正式环境用内网):

    CREATE USER 'prod_user'@'%' IDENTIFIED BY 'strong_password'; GRANT ALL PRIVILEGES ON diary_db.* TO 'prod_user'@'%'; FLUSH PRIVILEGES;

    修改/etc/mysql/mysql.conf.d/mysqld.cnf,注释掉bind-address = 127.0.0.1。

  3. 放行端口:

    sudo ufw allow 8080 sudo ufw allow 3306 # 仅测试,上线后关闭

5.3 后台运行与进程守护:nohup + systemd,选一个靠谱的

方案一(简单够用):nohup启动

cd /home/app nohup java -jar diary-system-1.0.jar --spring.profiles.active=prod > app.log 2>&1 & echo $! > app.pid # 记录进程ID

查看日志:tail -f app.log;停止:kill $(cat app.pid)。

方案二(生产推荐):systemd服务创建/etc/systemd/system/diary.service:

[Unit] Description=Diary System After=network.target [Service] Type=simple User=app WorkingDirectory=/home/app ExecStart=/usr/bin/java -jar /home/app/diary-system-1.0.jar --spring.profiles.active=prod Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload sudo systemctl enable diary sudo systemctl start diary sudo journalctl -u diary -f # 实时看日志

5.4 Nginx反向代理:让http://your-domain.com直接访问,而非:8080

安装Nginx后,编辑/etc/nginx/sites-available/diary:

server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static/ { alias /home/app/static/; } }

启用配置:

sudo ln -sf /etc/nginx/sites-available/diary /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

验证:浏览器访问http://your-domain.com,看到登录页即成功。


6. 毕业答辩与代码提分:三个让老师眼前一亮的“可演示细节”与避坑清单

6.1 细节1:登录态持久化改造——从Session到JWT,展示架构演进思维

老师问:“如果以后要做APP,怎么改?” 别只说“换Token”,现场演示:

  1. 在pom.xml加JWT依赖:
    <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency>
  2. 写一个JwtUtil.java生成Token(含用户ID、过期时间);
  3. 登录接口返回JSON:
    { "code": 200, "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
  4. 前端用localStorage.setItem('token', res.token)存,后续请求加Authorization: Bearer xxx。

答辩话术:“Session适合单体应用,JWT更适合前后端分离和未来微服务拆分,这里我预留了拦截器扩展点。”

6.2 细节2:数据库备份脚本——用mysqldump自动生成每日SQL,体现运维意识

在服务器上写个backup.sh:

#!/bin/bash DATE=$(date +%Y%m%d) mysqldump -u prod_user -p'strong_password' diary_db > /home/backup/diary_$DATE.sql gzip /home/backup/diary_$DATE.sql find /home/backup -name "diary_*.sql.gz" -mtime +7 -delete

加到crontab每天凌晨2点执行:

0 2 * * * /home/app/backup.sh

演示时打开/home/backup/目录,展示压缩包列表和ls -la时间戳。

6.3 细节3:Git提交记录整理——用rebase压缩无意义提交,展示工程素养

答辩前,用Git把“修复bug”、“又修了一次”这种提交合并:

git rebase -i HEAD~5 # 选中最近5次提交 # 把pick改成s(squash),保存退出 git push --force-with-lease origin main

效果:GitHub仓库里提交历史干净,只有“初始化项目”、“添加用户模块”、“实现PDF导出”等有意义的节点。老师扫一眼就知道你懂协作规范。


7. 我踩过的最深的三个坑,现在告诉你怎么绕过去

7.1 现象:部署后登录成功但首页空白,F12看Network全是404

原因:application.yml里spring.mvc.static-path-pattern和spring.web.resources.static-location配置冲突,或Thymeleaf模板路径写错成/templates/index.html(多了一个斜杠)。
解决:统一用默认配置,删掉所有静态资源路径自定义;确认模板文件在src/main/resources/templates/index.html,控制器返回"index"。

7.2 现象:MySQL插入中文变问号,但数据库和表都是utf8mb4

原因:JDBC URL漏了characterEncoding=utf8mb4,或MySQL服务端my.cnf里[client]段没设default-character-set = utf8mb4。
解决:URL加?characterEncoding=utf8mb4;服务端配置补全:

[client] default-character-set = utf8mb4 [mysqld] collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4

7.3 现象:IDEA里断点能进,但System.out.println()不打印日志

原因:Spring Boot 2.0+默认用Logback,System.out被重定向到日志框架,而日志级别设太高(如ERROR)。
解决:在application.yml里加:

logging: level: com.diary: DEBUG pattern: console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"

或直接用log.debug("xxx")替代System.out。

7.4 现象:上传图片后路径存了C:\fakepath\abc.jpg

原因:前端<input type="file">在Chrome里返回的是伪路径,后端直接存了这个字符串。
解决:前端用file.name取真实文件名,后端用MultipartFile.getOriginalFilename()获取。

7.5 现象:修改代码后热部署不生效,必须重启

原因:IDEA的Build project automatically没开,或Registry里compiler.automake.allow.when.app.running没勾选。
解决:Ctrl+Shift+A→ 输入Registry→ 勾选compiler.automake.allow.when.app.running;再Ctrl+Alt+Shift+/→Build project automatically打钩。


我带过6届毕业设计,每年都有学生拿着这个日记本项目去面试,被问“你在这个项目里解决了什么具体问题”,答“实现了增删改查”就被刷下来。后来我逼他们必须讲清楚:为什么用MyBatis-Plus不用JPA?为什么MySQL用utf8mb4不用utf8?为什么PDF导出选iText7而不是Flying Saucer?——答案不在百度里,在你改过的每一行代码、查过的每一条日志、重启过的每一次服务里。这个压缩包不是终点,是你把Java从课本搬到现实的第一块垫脚石。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询