ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java毕业设计实战:个人日记系统全栈开发指南

Java毕业设计实战:个人日记系统全栈开发指南 简介这是一份面向计算机专业本科生的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——这决定了你必须装对应JDKspring-boot-starter-parent版本如2.7.18或3.2.4——Spring Boot 2.x用JDK 8/113.x强制JDK 17mysql-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-8u202JDK 17用jdk-17.0.1别图新。2.2 IDEA导入与Maven依赖拉取别点“Auto-import”手动触发更可控解压后在IDEA中选择File → Open → 选中项目根目录注意不是.zip是解压后的文件夹。此时IDEA会弹窗问是否启用Maven支持务必勾选“Enable auto-import”并点击OK——但别急着写代码先做三件事检查右下角Maven面板是否显示项目结构如有pom.xml图标但无子模块说明未识别成功手动点击Maven工具栏的Reload project按钮不是自动刷新观察底部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 idaliyunmaven/id mirrorOf*/mirrorOf nameAliyun Maven/name urlhttps://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里执行前先做两件事手动创建数据库编码必须为utf8mb4CREATE DATABASE diary_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;确认MySQL服务已启动且端口3306未被占用Windows用netstat -ano | findstr :3306Linux用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——先定位谁在抢Windowsnetstat -ano | findstr :8080→ 得到PID →taskkill /f /pid XXXXmacOS/Linuxlsof -i :8080→ 得到PID →kill -9 PID如果查不到PID尤其Mac上可能是Chrome的DevTools远程调试占了端口关掉所有Chrome窗口再试。实在不行再改配置server: port: 8081 servlet: context-path: /diary # 避免根路径冲突后续访问地址变成 http://localhost:8081/diary3.2 数据库连接拒绝URL、用户名、密码一个都不能错且顺序有讲究控制台报Failed to configure a DataSource或Access denied for user rootlocalhost90%是application.yml里数据库配置写错了。标准格式如下以MySQL 8.0为例spring: datasource: url: jdbc:mysql://localhost:3306/diary_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse username: root password: your_password_here driver-class-name: com.mysql.cj.jdbc.Driver关键参数说明serverTimezoneAsia/Shanghai不加会报The server time zone value XXX is unrecognizedallowPublicKeyRetrievaltrueuseSSLfalseMySQL 8.0默认开启SSL本地开发关掉更省事driver-class-nameSpring Boot 2.4必须显式声明否则找不到驱动。提示密码含特殊字符如、/时URL里要用%40、%2F转义否则解析失败。3.3 Thymeleaf模板找不到路径、后缀、缓存三者联动失效登录后跳转/index.html却报Whitelabel Error Page或页面显示纯HTML文本没渲染说明Thymeleaf没生效。检查三点pom.xml是否含spring-boot-starter-thymeleaf依赖没有就加模板文件是否放在src/main/resources/templates/下不是static控制器返回字符串是否匹配文件名如return index;对应index.html。如果仍不渲染加一行配置关缓存开发阶段必需spring: thymeleaf: cache: false enabled: true prefix: classpath:/templates/ suffix: .html encoding: UTF-83.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你会发现它继承BaseMapperUser但没写任何SQL——这就是MP的“约定优于配置”。验证方式启动后访问http://localhost:8081/diary/login用初始账号登录进入后台管理页常见路径/admin/user/list尝试新增用户查看MySQLSELECT * 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}, %)) ListDiary 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.xGPL协议但压缩包里可能漏了jar包。正确做法是升级到iText7AGPL但个人学习免费pom.xml里删掉旧依赖加新依赖dependency groupIdcom.itextpdf/groupId artifactIditext7-core-kernel/artifactId version7.2.5/version typepom/type /dependency dependency groupIdcom.itextpdf/groupId artifactIdfont-asian/artifactId version7.2.5/version /dependencyJava代码里加载中文字体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.skiptrue生成的target/diary-system-1.0.jar就是部署包。但注意本地application.yml是开发配置生产环境必须用独立配置。在src/main/resources/下新建application-prod.ymlspring: 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.skiptrue前提是pom.xml里定义了profile否则直接改application.yml的spring.profiles.active: prod用scp上传到服务器scp target/diary-system-1.0.jar useryour-server-ip:/home/app/5.2 服务器环境准备JDK、MySQL、防火墙三件套缺一不可登录服务器后依次执行装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 # 验证开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。放行端口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.activeprod app.log 21 echo $! app.pid # 记录进程ID查看日志tail -f app.log停止kill $(cat app.pid)。方案二生产推荐systemd服务创建/etc/systemd/system/diary.service[Unit] DescriptionDiary System Afternetwork.target [Service] Typesimple Userapp WorkingDirectory/home/app ExecStart/usr/bin/java -jar /home/app/diary-system-1.0.jar --spring.profiles.activeprod Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-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/diaryserver { 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”现场演示在pom.xml加JWT依赖dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency写一个JwtUtil.java生成Token含用户ID、过期时间登录接口返回JSON{ code: 200, token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... }前端用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 -pstrong_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 细节3Git提交记录整理——用rebase压缩无意义提交展示工程素养答辩前用Git把“修复bug”、“又修了一次”这种提交合并git rebase -i HEAD~5 # 选中最近5次提交 # 把pick改成ssquash保存退出 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漏了characterEncodingutf8mb4或MySQL服务端my.cnf里[client]段没设default-character-set utf8mb4。解决URL加?characterEncodingutf8mb4服务端配置补全[client] default-character-set utf8mb4 [mysqld] collation-server utf8mb4_unicode_ci init-connect SET NAMES utf8mb4 character-set-server utf8mb47.3 现象IDEA里断点能进但System.out.println()不打印日志原因Spring Boot 2.0默认用LogbackSystem.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 typefile在Chrome里返回的是伪路径后端直接存了这个字符串。解决前端用file.name取真实文件名后端用MultipartFile.getOriginalFilename()获取。7.5 现象修改代码后热部署不生效必须重启原因IDEA的Build project automatically没开或Registry里compiler.automake.allow.when.app.running没勾选。解决CtrlShiftA→ 输入Registry→ 勾选compiler.automake.allow.when.app.running再CtrlAltShift/→Build project automatically打钩。我带过6届毕业设计每年都有学生拿着这个日记本项目去面试被问“你在这个项目里解决了什么具体问题”答“实现了增删改查”就被刷下来。后来我逼他们必须讲清楚为什么用MyBatis-Plus不用JPA为什么MySQL用utf8mb4不用utf8为什么PDF导出选iText7而不是Flying Saucer——答案不在百度里在你改过的每一行代码、查过的每一条日志、重启过的每一次服务里。这个压缩包不是终点是你把Java从课本搬到现实的第一块垫脚石。希望帮到你。本文还有配套的精品资源点击获取
返回列表