ARTICLE DETAIL

资讯详情

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

Java记账系统毕业设计部署实战:源码拆解与避坑指南

Java记账系统毕业设计部署实战:源码拆解与避坑指南 简介基于Java的记账系统毕业设计资料包整合了完整源代码、数据库SQL脚本、部署文档与部署视频面向Java初学者、毕业设计学生及Web开发入门者能够系统体验从业务设计、编码实现到服务器部署的完整流程。资源共280个文件主要类型覆盖java源码、xml配置、js前端脚本、css样式、sql数据库脚本、mp4教程视频、gif演示图等压缩包约71.94MB目录按视频、源码、数据库、说明文档清晰拆分方便按需查阅。目前已有187人学习下载。学习源码可掌握MVC分层设计、Spring MVC与MyBatis等主流框架的集成方式、CRUD操作实现、用户与账目数据建模等核心技能配合部署文档与录屏视频能快速完成Tomcat环境配置、数据库导入和项目运行避开常见的环境踩坑问题对毕业设计答辩和入门Java Web开发均有较高参考价值。1. 拆开一个Java记账系统毕业设计包值钱的不是源码而是这三样拿到这个“基于Java的记账系统毕业设计”压缩包很多人的第一反应是双击mvnw.cmd结果大概率被一串红色报错教做人。我拆过不少这类项目包源码能直接跑起来的其实不到一半真正让人卡死的往往是数据库脚本、配置文件里的连接信息还有部署文档里一笔带过的环境要求。这套项目做得比较全的地方是它把视频教程、数据库脚本和部署说明放进同一个压缩包意味着你不用到处拼资料照着走就能把后端、前端、数据库三块串起来。适合正在做毕设的Java初学者也适合想快速跑通一个完整MVC项目的转行开发者。这篇按我实际复现的顺序来写先拆目录、再配环境、后跑代码最后把最容易翻车的环节单独拎出来讲。2. 目录结构决定技术栈从CSS文件名反推前端从pom.xml确认后端2.1 前端技术栈识别layui是主战场压缩包正文里出现的一串CSS文件名其实已经把前端方案写在脸上了。layui.css、layer.css、laydate.css、dtree.css、dtreefont.css这些分别是layui框架的核心样式、弹层组件layer的样式、日期控件laydate的样式以及树形组件dtree的样式。有实际开发经验的人看到这里基本能确定前端不是Bootstrap也不是Vue而是layui。layui常见于后台管理类系统它和Bootstrap最大的不同是组件更偏后台场景。layer弹层用来做删除确认、表单弹窗laydate用来做账目的日期筛选dtree用来做账目分类的树形菜单。这套项目的记账场景恰好全是这类操作所以选layui是合理的。你后面改界面时不要想着把它换成Vue全家桶那等于重写一遍前端。正确做法是继续在layui的框架内改样式和交互。我一般会打开index.css和public.css看一眼这两个文件决定整体布局其他CSS基本是组件库自带的不需要动。如果你发现页面元素错位、按钮样式怪优先怀疑是不是没有引入layui.css而不是代码逻辑出错。提示layui从2.6开始部分组件依赖jQuery但layui内置了轻量级jQuery不需要额外引库。别在页面里重复引入jQuery否则组件事件可能绑定两次。2.2 后端MVC架构Spring MVC MyBatis的典型组合摘要里明确写到MVC设计模式所以后端必然是Controller、Service、Mapper三层。通过项目的目录结构可以进一步确认具体框架。如果解压后的源码目录里有src/main/java、src/main/resources且根目录有pom.xml和mvnw.cmd那么这个项目几乎可以肯定是Maven工程。mvnw.cmd是Maven Wrapper的Windows脚本它的存在说明项目需要Maven来管理依赖。后端框架方面这个项目场景下最常见的组合是Spring MVC做控制层MyBatis做持久层。为什么不是Spring Boot因为传统Spring MVC项目才需要手动配置web.xml、Spring配置文件、MyBatis的Mapper扫描而Spring Boot会把这一大堆配置全部自动搞定。既然部署文档里提到Tomcat和打包说明它大概率是传统war包部署方式走的是Servlet容器那个路子。对学习者来说传统Spring MVC反而是好事。它把每一个配置都摆在明面上你能看到DispatcherServlet怎么注册、Mapper接口怎么扫描、事务怎么开启。Spring Boot把这些都黑盒化了学习阶段反而不利于理解原理。有一个细节值得记住pom.xml里会写spring-webmvc、mybatis、mysql-connector-java这几个核心依赖。如果你发现mybatis和mybatis-spring的版本对不上启动时会报“Invalid value of statement 之类的错这个问题在第5章的避坑部分会讲到。2.3 数据库脚本的定位MySQL建库与测试数据入口压缩包里的“03-数据库”文件夹通常是SQL脚本文件或者数据库备份文件。记账系统的数据量级不大用MySQL是最常见的选择。拿到这个文件夹后我建议你先用文本编辑器打开SQL脚本看一眼头部注释确认是哪些表。一般会有这么几张表用户表、账目类型表、账目流水表。看表结构能反推出这个系统的功能边界比如有没有账户表、有没有预算表。如果只有简单的三张表那它就是最基础的个人记账demo加不了复杂的多人协作功能你自己心里要有数。执行脚本的方式有两种。第一种是MySQL命令行直接导入适合不想装图形工具的场合第二种是用Navicat或者DBeaver打开数据库右键运行SQL文件。第3章里会给出完整的命令行方式这里先建立一个认知SQL脚本是项目的灵魂没有它代码跑起来也是空壳因为登录都登不进去。初始化之后脚本里通常会带几条测试数据。比如用户表里可能有一个admin账号密码是123456账目流水表里会有几条演示记录。复现项目时优先用这些测试数据验证功能是否正常。等确认系统跑通了再删掉测试数据换成自己的正式数据。目录/文件内容复现时的作用01-视频项目介绍、环境搭建、部署过程录像文档没写清时看对应时间段02-源码IDEA工程含pom.xml与mvnw.cmd导入IDE后编译运行的主体03-数据库SQL脚本或数据库备份文件建表结构与测试数据来源04-说明文档部署步骤、环境要求、配置项说明第一步要通读的东西3. 从导入到跑通数据库初始化、JDBC配置与war包部署全流程3.1 环境准备JDK8配Tomcat8版本匹配是第一道关Java Web项目对环境版本的敏感度远高于后端技术本身。传统Spring MVC项目最常见的标准组合是JDK8 Tomcat8部分老项目甚至是JDK7 Tomcat7但JDK7已经很少有人用了。JDK11以上运行这类项目经常会遇到模块化限制导致Tomcat无法启动。环境变量方面我一般会检查JAVA_HOME和MAVEN_HOME是否配置正确。在Windows上打开命令行执行下面两行确认版本java -version mvn -v输出里应能看到对应版本。很多人在这步翻车是因为机器上装了多个JDKIDEA里项目的SDK版本和解压后脚本使用的JAVA_HOME不是同一个。结果就是代码在IDEA里能编译一打包放到Tomcat就报UnsupportedClassVersionError。这里有个习惯我强调过很多次项目级别锁死JDK8tomcat配置目录里的setclasspath.bat不要乱设除非你明确知道自己在做什么。遇到版本报错优先确认你现在用的到底是哪个JDK。3.2 初始化数据库两条命令把SQL脚本灌进MySQL确认数据库脚本存在且MySQL服务启动后执行导入。下面是一套完整的命令行操作# 创建数据库指定utf8mb4字符集避免后续中文乱码 mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS bookkeeping DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 导入项目自带的SQL脚本数据库名与上面保持一致 mysql -uroot -p bookkeeping /path/to/解压目录/03-数据库/bookkeeping.sql第一条命令的-u指定用户名-p表示需要密码-e参数允许直接执行一段SQL后退出。第二条命令用重定向把本地的SQL文件直接喂给mysql客户端作用等同于在Navicat里运行SQL文件。导入过程中常见的报错有ERROR 1045是密码不对ERROR 1049是数据库不存在ERROR 1366多半是SQL脚本里有中文但文件编码不是utf8。最后一种情况需要用记事本把脚本另存为UTF-8编码再执行。如果SQL脚本里本身已经写了CREATE DATABASE语句第一条命令不是必须的直接导入即可。但我仍然建议先手动建库再导入这样你能清楚知道字符集是什么后面连接时会省很多事。3.3 修改JDBC配置连接串与驱动类的对应关系整个项目里最影响运行结果的是数据库连接配置。传统Spring MVC项目里这些配置一般放在src/main/resources下的jdbc.properties文件然后把数据源配置在Spring的XML里。你找到jdbc.properties后改成当前本地环境的参数jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/bookkeeping?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password你的数据库密码driver这一行的值取决于你机器上的MySQL版本。MySQL 5.x用com.mysql.jdbc.Driver没问题MySQL 8.x要换成com.mysql.cj.jdbc.Driver同时url里最好加上serverTimezoneAsia/Shanghai否则会报时区异常。username和password填的必须是本地MySQL的账号不是项目里预设的。很多人在这一步卡住是因为用了解压包里的原始账号密码但那是在原作者机器上配置的换了一台机器当然连不上。改动之后必须重新编译并重启Tomcat配置文件才会被重新加载。3.4 打包部署Maven构建war包并放到Tomcat的webapps环境变量没问题、数据库导入成功、配置改完之后就可以打包了。最稳的做法是用Maven打包war然后丢给Tomcat。# 在项目根目录有pom.xml的那一层执行 mvn clean package -DskipTests-DskipTests表示跳过单元测试加快打包速度。打包完成后产物在target目录下文件名一般是项目名.war比如bookkeeping.war。把这个war包复制到Tomcat的webapps目录下启动Tomcat它会自动解压。启动方式是在Tomcat的bin目录执行# Windows环境下 startup.bat # Linux或Max环境下 ./startup.sh启动日志会打印到logs/catalina.out。看到“Server startup in xxx milliseconds”就是成功了。此时访问http://localhost:8080/bookkeeping/就能看到登录页项目名就是war包名。如果你不想用war包方式也可以在IDEA里配置Tomcat Artifact把Exploded版本直接部署但那个方式依赖IDE的重载机制排查起来不如war包直观。我建议新手一律走war包路线出了问题还能翻日志。4. 核心模块代码走读登录Session、账目分页与CRUD的Spring MVC实现4.1 登录认证Session、拦截器与视图跳转登录是Java Web项目的基础模块也是面试时聊得最多的一个点。它的核心逻辑很简单表单提交用户名密码Mapper查库查到就存Session查不到就留在登录页。代码结构大概长这样Controller public class LoginController { Resource private UserMapper userMapper; RequestMapping(value /login.do, method RequestMethod.POST) public String login(String username, String password, HttpSession session) { User user userMapper.findByUsernameAndPassword(username, password); if (user ! null) { session.setAttribute(loginUser, user); return redirect:/index.do; // 登录成功跳主页 } return login; // 登录失败留在登录页 } }这段代码里Controller声明这是一个Spring MVC控制器RequestMapping把/login.do这个URL映射到login方法。方法返回值是视图名Spring的视图解析器会配合前缀后缀找到一个JSP或HTML页面。redirect:/index.do是重定向避免刷新时重复提交表单。拦截器是另一个关键角色。登录状态不能只靠Controller判断不然每个方法里都要写一遍判断逻辑。Spring MVC提供了拦截器机制mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login.do/ mvc:exclude-mapping path/static/**/ bean classcom.example.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors这段XML的意思是拦截所有请求但登录接口和静态资源放行。LoginInterceptor里做的事很简单从Session里拿loginUser拿不到就跳回登录页。少了这个配置你直接在浏览器访问index页面会报一堆NullPointerException因为页面里的用户对象根本不存在。4.2 账目分页Mapper的LIMIT参数与前端的page/limit记账系统最核心的列表页是账目流水。数据量一多页面不可能一次全加载分页是必须的。前端layui自带的table组件会向后端传两个参数page第几页和limit每页几条。后端拿到这两个值计算偏移量然后查询数据库。Mapper接口的写法public interface RecordMapper { ListRecord selectByPage(Param(userId) Integer userId, Param(offset) Integer offset, Param(limit) Integer limit); Integer countByUser(Integer userId); }对应XML里的SQLselect idselectByPage resultTypecom.example.entity.Record SELECT * FROM t_record WHERE user_id #{userId} ORDER BY create_time DESC LIMIT #{offset}, #{limit} /selectLIMIT后面的两个参数是这道题的细节所在。第一个是起始行偏移量第二个是查询条数。假设每页10条第一页的offset是0第二页是10第三页是20。前端传page和limitController里要自己算offset计算公式是(page - 1) * limit。Controller端把分页后的结果组装成layui table要求的JSON格式ResponseBody RequestMapping(/record/list.do) public MapString, Object list(Integer page, Integer limit, HttpSession session) { User user (User) session.getAttribute(loginUser); int offset (page - 1) * limit; ListRecord rows recordMapper.selectByPage(user.getId(), offset, limit); int total recordMapper.countByUser(user.getId()); MapString, Object result new HashMap(); result.put(code, 0); result.put(count, total); result.put(data, rows); return result; }前端layui的table渲染时会检查code是否为0count是总条数data是当前页的数据。这三个字段名是layui的约定不能随意改改了前端就解析不到数据。如果返回结构不对前端表格只会显示空白控制台也不一定会报错排查时先检查这里。4.3 账目CRUD一个Controller如何聚合五类操作记账系统的业务动作无非是增删改查加统计。Controller把一组相关动作放一个类里但URL各不相同这是Spring MVC的常见组织方式。Controller RequestMapping(/record) public class RecordController { Resource private RecordMapper recordMapper; ResponseBody RequestMapping(/add.do) public ResultDto add(Record record, HttpSession session) { User user (User) session.getAttribute(loginUser); record.setUserId(user.getId()); recordMapper.insert(record); return ResultDto.success(); } ResponseBody RequestMapping(/update.do) public ResultDto update(Record record) { recordMapper.updateById(record); return ResultDto.success(); } ResponseBody RequestMapping(/delete.do) public ResultDto delete(Integer id) { recordMapper.deleteById(id); return ResultDto.success(); } }类级别的RequestMapping(/record)加方法级别的RequestMapping(/add.do)最终URL是/record/add.do。add方法里从Session里取当前登录用户ID再塞进记录对象里这个细节很关键——它确保用户只能给自己的账目做增删改查越权操作在这里被直接阻断。ResultDto是项目自定义的返回包装类一般包含code、message、data三个字段。自己实现时也可以直接用HashMap代替但统一封装的好处是前端判断逻辑可以收敛到一个地方不用每个方法都重复写。我建议复现时重点看这个Controller实现因为它最能体现项目在业务边界上的处理习惯。如果原作者习惯在Service层做业务校验那这个项目还有Service层如果Controller直接调用Mapper说明业务逻辑比较简单属于学习型demo不涉及复杂事务。5. 部署避坑实录五条血泪经验从现象、原因说到解决方案5.1 MySQL 8与旧驱动不匹配启动时报错最玄学的一种现象项目在IDEA里编译没报错一启动Tomcat就抛ClassNotFoundException指向com.mysql.jdbc.Driver或者报CLIENT_PLUGIN_AUTH相关异常。原因数据库是MySQL 8.x但pom.xml里引的驱动还是5.1.x。MySQL 8把驱动类改了名同时认证协议也换了旧驱动根本不认识新协议的握手包。解决改pom.xml里的mysql-connector-java版本换成8.0.x同时驱动类名改成com.mysql.cj.jdbc.Driverurl追加serverTimezoneAsia/Shanghai。改完重新mvn clean package再启动。这个问题不看版本号根本猜不到属于典型的版本联动坑。5.2 部署后页面裸奔CSS和JS全部404现象登录页能打开但页面没有任何样式控制台里一堆.css和.js的404报错。原因war包部署时Tomcat的Web应用上下文路径是http://ip:8080/项目名/但页面里写的CSS路径是/static/layui.css这个相对路径被浏览器解析到服务器根目录自然找不到。这是上下文路径问题。解决把war包改成ROOT.war部署这样上下文路径就是根路径/静态资源路径直接匹配。或者在页面路径里统一加${pageContext.request.contextPath}前缀Spring MVC的JSP页面通常会这样做。如果项目是纯HTML页面推荐直接改成ROOT.war方式一劳永逸。5.3 JDK版本过高Tomcat启动静默失败的隐藏原因现象双击startup.bat后窗口一闪而过但浏览器访问8080端口没反应logs目录里也没有新的catalina.out日志。原因Tomcat 8只支持到JDK8你机器上JAVA_HOME指向的是JDK11或17Tomcat在启动时初始化Servlet容器失败。更隐蔽的是Tomcat的启动窗口结束后不会自动停住日志也没打出来看起来像没启动过。解决检查JAVA_HOME是否指向JDK8。命令行执行java -version确认版本如果版本不对修改系统环境变量。顺带检查IDEA里的编译级别是不是也调成8否则代码编译出的字节码版本可能高于Tomcat能加载的版本同样报UnsupportedClassVersionError。5.4 中文备注变问号三处编码必须保持一致现象在页面上录入“午饭消费25元”保存后数据库里显示“???”或者页面显示一堆乱码。原因数据库字符集不是utf8mb4JDBC连接串没带characterEncodingutf8页面本身也不是utf8编码。这三处只要有其中一处在编码上掉链子中文就在传输过程中被转没了。解决建库时显式指定utf8mb4jdbc.properties里url带characterEncodingutf8确认页面的meta标签是charsetutf-8HTML文件本身用UTF-8编码保存。改完这三处重新初始化数据库或者把表字符集改过来然后重启。5.5 mvnw.cmd双击闪退命令脚本不是这么跑的现象Windows上双击mvnw.cmd命令行窗口一闪而过什么也没发生。原因mvnw.cmd是Maven Wrapper的命令行脚本需要带参数执行比如mvnw.cmd clean package。双击等于执行了裸命令脚本里没有默认动作直接退出。这里还有个细节PowerShell里执行cmd脚本要写.\mvnw.cmd直接输入mvnw会提示无法识别。解决打开CMD切换到项目根目录执行.\mvnw.cmd clean package或者直接安装Maven用mvn命令替代。我个人建议直接装Maven因为Wrapper脚本第一运行时会自动下载Maven发行版网络慢的话能卡十几分钟有那个时间我都能装完Maven了。6. 进阶扩展把毕业设计Demo改成能用的月统计记账工具基础功能跑通之后我建议做三个小扩展把它从交作业的demo变成自己真的能用的工具这三件事都不需要动架构只改Mapper和页面。第一个扩展是按日期区间统计收支。记账系统最常被问的问题是“我这个月花了多少”但现在项目里很可能没有这个查询。加一个接口并不复杂SQL层面的写法是SELECT SUM(CASE WHEN type 1 THEN amount ELSE 0 END) AS income, SUM(CASE WHEN type 0 THEN amount ELSE 0 END) AS expense, DATE_FORMAT(create_time, %Y-%m) AS month FROM t_record WHERE user_id #{userId} AND create_time BETWEEN #{startDate} AND #{endDate} GROUP BY month ORDER BY month DESC这段SQL用SUM加CASE WHEN把收入支出分开统计再按月份分组。前端配合laydate让用户选起止日期把日期传给后端。这个功能加完记账系统从“能记”变成“能看账”实用性直接上一个台阶。第二个扩展是导出Excel。不用引入复杂的POI直接用layui表格自带的导出即可它会把当前页数据导出成csv。真正的导出全部数据可以用MySQL的SELECT INTO OUTFILE但那是服务端的活本地学习阶段不推荐。如果以后真上了生产用这个项目建议引POI来做那是后话。做扩展期间我强烈建议每改一个功能就重启一次Tomcat不要依赖IDEA的热部署。因为传统Spring MVC项目的热部署对XML配置不友好经常出现配置改了但没生效的“假更新”排查起来比重启还浪费时间。把这个项目完整复现一遍之后你其实已经走完了Java Web从开发到部署的全流程尤其是调试那段每个报错都在逼你理解Tomcat、MySQL、Maven之间的配合关系。从那以后我每次拿到别人打包的毕业设计资源都强制走一遍“先查JDK版本、再导库、再改配置、再翻部署文档”的流程不会上来就双击启动。如果你也在做Java相关的毕设或找工作练手希望这篇能帮你少走点弯路。本文还有配套的精品资源点击获取
返回列表