ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于Java的记账系统毕业设计:从环境部署到核心代码实现全解析

基于Java的记账系统毕业设计:从环境部署到核心代码实现全解析 简介这是一套基于Java技术栈开发的记账系统毕业设计完整资源包面向Java初学者、高校应届生及希望完整走通Web应用开发流程的读者。项目以MVC设计模式为核心覆盖Java SE/EE编程、Spring MVC框架、MyBatis或Hibernate持久层、MySQL数据库操作以及Tomcat等应用服务器的部署运行知识链条完整。压缩包共280个文件、约71.94MB其中23个Java源码文件承载业务逻辑99个XML配置与1个SQL脚本对应框架配置和数据库结构37个JavaScript与10个CSS文件用于前端交互和样式3个MP4视频辅助演示项目介绍与部署过程另有部署文档、命令行脚本及项目配置文件源码、视频、说明文档、数据库按目录分类存放结构清晰。目前已有187人学习下载。通过该资源可系统掌握从环境搭建、数据库设计、后端接口开发到前端渲染、最终部署上线的全链路实践方法说明文档与视频教程相互配合能有效降低环境配置与数据库连接的学习门槛既可作为毕业设计参考也能充当Java Web综合实战训练材料。1. 基于Java的记账系统毕业设计一套能跑通的源码包到底值不值得拆有没有过这种时刻从学长或网盘里拿到一个“基于Java的记账系统毕业设计”压缩包解压后面对一屏文件夹和 sql 文件第一反应不是兴奋而是心虚——这东西到底能不能跑起来这个标题其实把答案写在名字里了它交付的不只是源代码还有数据库脚本、部署文档和部署视频。也就是说这个方案默认的第一目标是让一个没接触过这套环境的接手人也能按图索骥把系统从 zip 变成浏览器里的登录页。适合谁正在做 Java 后端毕设、想省掉从零搭框架时间的学生以及想借一套完整业务练手、把增删改查和权限验证讲清楚的新手。前提是你别急着改代码先把环境这关过了。2. 先把运行环境对齐JDK版本、MySQL编码、Tomcat端口怎么一次配好部署一套 Java Web 系统卡住你的往往不是代码而是环境和源码预期不一致。同一个 zip 包在原作者电脑上启动顺畅到你这里就翻车绝大多数原因出在 JDK、MySQL、Tomcat 这些基础组件的版本没对齐。这不是玄学是版本兼容问题。这章教你不动一行业务代码先把环境对到能启动的状态。2.1 拿到压缩包先盘三件事技术栈、构建方式、数据库脚本打开压缩包后先别急着解压运行。先在目录里找三样东西pom.xml或build.gradlesrc下有没有.java和jsp/static目录以及后缀为.sql的脚本文件。这三样决定后续每一步怎么做。pom.xml存在说明它是 Maven 管理的 Java Web 项目依赖下载由 Maven 负责只有lib目录加一堆 jar 包的属于传统 Web 项目要手动把 jar 放进 WEB-INF。这两种项目的启动方式完全不同搞错会直接卡在第一关。# 在命令行里逐个确认基础版本别凭安装时记忆 java -version mvn -v mysql --versionjava -version看 JDK 版本和位数毕设里最常见的是 JDK 1.8少数新项目用 11 或 17mvn -v会额外显示 Maven 当前使用的 JDK 路径如果它指向的不是java -version那套 JDK构建时会出现依赖装好但编译失败的情况mysql --version要同时记下主版本MySQL 5.7 和 8.0 在认证插件、排序规则、部分 SQL 语法上都有差异数据库脚本能不能直接跑通很大程度由它决定。把版本记下来后和下面这张表对照就行。组件毕设常见版本检查方式主要坑点JDK1.8 为主java -version版本太高导致 JSP 编译失败MySQL5.7 / 8.0mysql --version8.0 认证插件与旧驱动不兼容Tomcat8 / 9startup.bat启动日志端口冲突、编码过滤缺失Maven3.6mvn -v本地仓库依赖下载不完整这里多说一句毕设场景求的是“先能跑、再能懂”版本不用追最新。如果你发现源码里写的是 Spring Boot MyBatis 的组合那部署方式又不同——Spring Boot 内置 Tomcatmvn package打成 jar 后直接java -jar就能启动端口默认 8080根本不需要单独装 Tomcat。看结构再选路线比盲目装一堆软件高效得多。2.2 数据库连接参数一行配置决定你能不能登录版本看完真正决定系统能不能连上数据库的是连接配置。常见 SSM 项目里是jdbc.propertiesSpring Boot 项目里是application.properties你要核对的是 URL、用户名和密码这三项。jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/bookkeeping?useSSLfalsecharacterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password你的密码com.mysql.cj.jdbc.Driver是 MySQL 8 驱动的写法老项目里常见的com.mysql.jdbc.Driver在 8 里也能用但会一直打过时警告。URL 里每个参数都别删useSSLfalse关掉 SSL 握手减少本地调试的报错概率characterEncodingutf8强制字符集和后面的乱码问题直接相关serverTimezoneAsia/Shanghai解决 MySQL 8 时区报错allowPublicKeyRetrievaltrue解决 MySQL 8 默认认证方式下驱动报Public Key Retrieval is not allowed。这里有个非常容易白费功夫的操作一上来就改源码里的密码。正确顺序是先打开命令行用mysql -u root -p手动登一次能登上再把密码填进配置。命令行都登不进去说明问题在 MySQL 安装、服务状态或密码本身改配置文件没有用反而会让人在 IDE 里反复重启 Tomcat 浪费时间。2.3 导入数据库脚本先建库再导数据把字符集钉死很多初始化脚本里只写了建表语句没有CREATE DATABASE。如果你直接sourceMySQL 会报No database selected或者把表建进默认库。正确顺序永远是先建空库再往库里导数据。# 第一步进入 MySQL创建一个空库 mysql -u root -p CREATE DATABASE bookkeeping DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; EXIT; # 第二步在命令行导入业务脚本 mysql -u root -p --default-character-setutf8mb4 bookkeeping E:/毕设/bookkeeping.sqlDEFAULT CHARACTER SET utf8mb4把库级字符集定死COLLATE utf8mb4_general_ci是老版本兼容性最好的排序规则比 MySQL 8 默认的utf8mb4_0900_ai_ci更稳导入时加--default-character-setutf8mb4保证脚本里的中文注释和初始数据不乱码文件路径不要带中文目录Windows 命令行在中文路径下经常读不到文件提示Cant open file。导入完成后别急着关先验证三条 SQLSHOW TABLES;看表是否齐全SELECT * FROM t_user;看默认账号是否存在SELECT COUNT(*) FROM t_transaction;看流水表有没有测试数据。如果表存在但没有账号数据去部署文档里翻默认账号如果文档也没写说明这套源码需要自行注册。流水表没有测试数据的记账系统后面截图和汇报都很吃亏建议自己补几行真实日期的数据进去。3. 核心代码线登录、流水增删改查和统计图表的三段样板写法环境通了、数据进去了下一步才是读代码。拿到源代码我最反对一上来就全局搜“TODO”开始改功能。你先要认同它的主业务线登录鉴权、记账流水增删改查、统计图表。这三段看懂整个项目你就掌握了。后面不管是改成自己的毕设还是回答 java 面试里的登录鉴权问题都从这里展开。3.1 登录鉴权与密码处理Session拦截器统一验别只把按钮藏起来很多 Web 毕设的“权限控制”只是把登录按钮换成退出链接绕过登录页直接输 URL 就能进主页这属于典型的黑匣子式写法。正规一点的做法是登录接口校验用户名密码成功后把用户对象放进 Session再注册一个拦截器对所有受保护路径做统一校验。后端没有这层拦截前面做再多界面都没意义。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getSession().getAttribute(loginUser) null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }preHandle返回false时请求中断跳回登录页request.getContextPath()动态取当前项目部署名避免硬编码路径换环境就失效。登录成功那行代码通常长这样session.setAttribute(loginUser, user)和这里取loginUser的 key 必须一致。如果是前后端分离拦截器通常会改成返回 JSON 的 401 状态码但传统 JSP 项目里直接重定向完全够用。拦截器要通过 Spring 配置注册不能只写个类。XML 配置里要同时写清楚拦截哪些路径、放行哪些路径mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/register/ bean classcom.bookkeeping.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors/**匹配全部请求包括 css、js、图片这些静态资源。如果静态资源也被拦截登录后的页面会样式全丢看起来像烂了实际是拦截器没有排除 static 目录。所以通常要把/static/**、/resources/**也加进exclude-mapping。密码处理是另一个答辩高频点。源码里如果是明文存储至少改成加盐散列如果原来只写了 MD5先保留原算法让登录跑通再在论文里指出“MD5 撞库成本低可升级为 BCrypt”。登录校验的代码长这样// 验证时先根据用户名取到 salt再对输入密码加盐散列后比较 String hashed DigestUtils.md5Hex(password user.getSalt()); if (hashed.equals(user.getPassword())) { request.getSession().setAttribute(loginUser, user); response.sendRedirect(request.getContextPath() /index); }这里用password salt再 MD5同一个密码在不同盐值下结果不同能挡住一部分彩虹表攻击。你知道这条线就足够把它讲明白了。真正面试聊起来你还能说“后续计划换成 BCrypt”这就是从毕设代码延伸到工程意识的加分回答。3.2 记账流水的增删改查分页查询是重点金额字段别用 double记账系统的核心不是登录是流水表增删改查。记一笔、查列表、改金额、删记录。我见过不少源码把列表一次性查出来再让前端做分页这种代码数据量一涨就卡。常见可靠的做法是后端分页MySQL 里用LIMIT完成。select idselectPageByUserId resultTypecom.bookkeeping.entity.Transaction SELECT id, user_id, category_id, amount, type, remark, create_time FROM t_transaction WHERE user_id #{userId} ORDER BY create_time DESC LIMIT #{offset}, #{pageSize} /selectORDER BY create_time DESC保证新账显示在列表第一行LIMIT #{offset}, #{pageSize}表示从offset开始取pageSize条。Java 里计算规则是offset (pageNum - 1) * pageSizepageNum从 1 开始这是分页最容易算错的地方。代码层的对照也很关键public PageResultTransaction pageQuery(int userId, int pageNum, int pageSize) { int offset (pageNum - 1) * pageSize; ListTransaction list transactionMapper.selectPageByUserId(userId, offset, pageSize); long total transactionMapper.countByUserId(userId); return new PageResult(list, total, pageNum, pageSize); }total必须单独count一次前端表格才知道总记录数和总页数。不要为了省一次查询用SQL_CALC_FOUND_ROWS把 count 和 list 拼在一起数据量大时反而更难调优。返回结果里带上total、pageNum、pageSize正好对应前端分页组件的三个参数改起来也不用动页面。增删改查里最容易被忽略的是删除。直接DELETE FROM t_transaction WHERE id #{id}看着简单但账单删掉后统计也会跟着变答辩时老师一定会问“删错了能恢复吗”。我的建议是如果源码是物理删除保留它但在论文里写明“生产环境可改成逻辑删除”也就是给表加deleted字段查询统一过滤deleted 0。这句话不用实现能说出来就说明你想过数据安全。3.3 统计图表的数据来源让SQL把账算好别在Java里循环求和记账系统的统计页一般有饼图和柱状图。新手容易把列表全查出来然后在 Java 里用switch按分类累加金额这种写法数据量一大就慢而且代码全是循环答辩时讲不清楚。常见做法是让 MySQL 聚合层直接返回算好的结果SELECT c.name AS categoryName, SUM(t.amount) AS totalAmount FROM t_transaction t JOIN t_category c ON t.category_id c.id WHERE t.user_id #{userId} AND t.type #{type} AND t.create_time #{startTime} AND t.create_time #{endTime} GROUP BY c.id, c.name ORDER BY totalAmount DESC;JOIN 把分类名称带出来避免在 Java 里再查一遍分类表type参数决定统计收入还是支出时间范围用和组成半开区间不会把endTime当天数据重复统计进去。GROUP BY后面同时写c.id和c.name是 MySQLonly_full_group_by模式下的硬性要求select 里的非聚合列必须完整出现在 group by 里只写c.id在部分版本会直接报错。还有一条很实用的经验写统计功能不要先写 Java 再编 SQL。先在命令行里用真实数据把 SQL 调出正确结果再搬进 Mapper。SQL 能算的绝不放进 Java 循环这是数据库设计的基础意识。后面第 6 章给折线图的按天统计也是同一个思路只是把GROUP BY换成日期函数。4. 数据库设计E-R关系、decimal精度、索引与外键怎么取舍代码读懂了论文里最厚的一章就是数据库设计。这块要能对答如流为什么表要拆金额为什么不用 double外键到底建不建索引是怎么加速查询的。数据库设计不是写给文档看的它直接决定增删改查好不好写、统计查得快不快。4.1 记账系统最少需要几张表四张表把业务说圆记账业务至少覆盖四个概念谁在记用户、记到哪账户、怎么归类分类、每笔账本身流水。对应下来就是用户表、账户表、分类表、流水表。有的简单毕设把账户表去掉只留三张表也能跑但老师问“怎么记录支付方式”就会卡住。要么加账户表要么在流水表里放一个支付方式字段。表名职责关键字段关系t_user用户用户名、密码、状态被流水和分类引用t_account账户/钱包用户id、账户名、余额被流水引用t_category收支分类用户id、分类名、类型一对多到流水t_transaction流水用户id、分类id、金额、类型、时间核心业务表这四张表画 E-R 图时正好是常规的一对多关系用户对分类是一对多分类对流水的多对一流水对账户也是多对一。把关系理清建表语句才不会乱。很多代码里的 bug 不是逻辑错而是表关系没想清楚就开始写 Mapper写到 JOIN 才发现字段对不上。4.2 建表SQL的关键参数金额用DECIMAL外键别滥用表结构设计直接影响代码复杂度。下面这套是记账系统比较典型的基础。写的时候把注释也带上因为部署文档里通常不会单独解释字段含义而答辩老师会逐字段问。-- 用户表 CREATE TABLE t_user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(32) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL COMMENT 存散列值不要存明文, salt VARCHAR(16) DEFAULT NULL, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, status TINYINT DEFAULT 1 COMMENT 1正常 0禁用 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; -- 收支分类表 CREATE TABLE t_category ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, name VARCHAR(32) NOT NULL, type TINYINT NOT NULL COMMENT 1收入 2支出, sort INT DEFAULT 0, KEY idx_category_user (user_id), CONSTRAINT fk_category_user FOREIGN KEY (user_id) REFERENCES t_user(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT收支分类表; -- 流水表 CREATE TABLE t_transaction ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, category_id INT NOT NULL, account_id INT DEFAULT NULL, type TINYINT NOT NULL COMMENT 1收入 2支出, amount DECIMAL(12,2) NOT NULL COMMENT 金额统一用decimal, remark VARCHAR(255) DEFAULT NULL, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_user_time (user_id, create_time), CONSTRAINT fk_transaction_user FOREIGN KEY (user_id) REFERENCES t_user(id), CONSTRAINT fk_transaction_category FOREIGN KEY (category_id) REFERENCES t_category(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT流水表;DECIMAL(12,2)表示整数部分 10 位、小数 2 位个人记账到百亿级别都够用。金额绝对不能用FLOAT或DOUBLE因为二进制浮点数在比较和累加时会出现0.1 0.2 ! 0.3的精度问题账单金额必须精确到分这是数据库增删改查里最容易翻车的隐藏雷。user_id上建普通索引KEY idx_category_user因为分类统计会反复按 user 过滤流水表上的KEY idx_user_time (user_id, create_time)是联合索引配合第 3 章的分页查询WHERE user_id ? ORDER BY create_time DESC能走索引直接排序不需要 filesort。外键约束在毕设里保留完全没问题能体现关系完整性但你在论文里要能说出另一面生产环境的流水类表通常去掉外键因为高并发写入时外键校验会拖慢速度并放大锁范围。create_time用DATETIME而不是TIMESTAMP。TIMESTAMP上限 2038 年还受时区影响DATETIME没有这些限制配合DEFAULT CURRENT_TIMESTAMP能让系统自动记录发生时间代码里少写一行赋值逻辑。4.3 数据库脚本管理与结构修改给未来留后悔药做毕设中途你很可能想给流水表加一个“支付方式”字段。这时候最忌讳直接在数据库客户端里改完就完事。因为 zip 包里的初始化脚本还停在你改之前换到答辩机器上重新导库表结构对不上直接翻车。常见做法是保持初始化脚本不动把结构升级写成独立增量脚本。-- v2_alter_transaction_add_pay_method.sql ALTER TABLE t_transaction ADD COLUMN pay_method TINYINT DEFAULT 1 COMMENT 1现金 2微信 3支付宝 AFTER remark;AFTER remark控制字段在表中的显示位置不影响逻辑TINYINT表达几种支付方式足够。增量脚本的好处是能重复执行、保留改动痕迹写论文时把脚本变更记录贴进数据库设计章节比空口讲“我改了表结构”更有说服力。如果你不想引入额外工具也有更简单的备份方法改结构前把整表导出来相当于一份后悔药。mysqldump -u root -p bookkeeping t_transaction backup_transaction.sqlmysqldump导出的文件自带DROP TABLE IF EXISTS和CREATE TABLE恢复时会把结构和数据一起还原。想在演示现场做删数据、改金额这类操作有这个备份在就不会慌。开发阶段的数据库脚本管理养成这个习惯比任何第三方工具都管用——脚本变更记录越完整出问题的概率越低。5. 部署避坑手册五个最容易让毕设翻车的现场这章写给遇事别硬猜的人。所有部署问题都有日志Tomcat 日志、MySQL 报错、控制台 stack trace至少有一个在说话。遇到问题先把现象抄下来再对下面五条。很多问题看着复杂实际原因就一行。5.1 SQL导入报错先怀疑编码再怀疑MySQL版本语法现象用客户端导入.sql文件报错含Unknown collation: utf8mb4_0900_ai_ci或者执行到某行提示You have an error in your SQL syntax也可能表建了一部分但中文数据全变成问号。原因MySQL 8.0 导出的脚本默认带utf8mb4_0900_ai_ci排序规则5.7 不识别或者脚本里夹了视图、存储过程和特殊注释字符再就是客户端连接字符集不是 utf8mb4。解决把建库语句里的排序规则改成utf8mb4_general_ci再建库。如果脚本内容不允许自由改动用命令行指定字符集导入mysql -u root -p --default-character-setutf8mb4 bookkeeping init.sql这里有一条血泪经验SQL 导入报错时不要一行行手改脚本。先看脚本开头的SET NAMES语句如果有SET NAMES utf8mb4先执行它如果没有统一走命令行参数指定字符集。改脚本只改一处治标不治本。5.2 Tomcat端口被占用启动失败先看日志别急着换端口现象双击startup.bat弹窗一闪而过或者在 IDE 里启动 Tomcat控制台最后一行写着Address already in use: JVM_Bind 8080。原因上一个 Tomcat 进程没关干净或者有其他开发工具占用了 8080、8005 端口。大多数时候不是代码问题你的项目还没跑起来就被端口挡住了。解决先查端口占用再杀进程。netstat -ano | findstr 8080 taskkill /PID 2764 /Fnetstat -ano | findstr 8080会列出占用 8080 的进程 PIDtaskkill /PID后面填真实 PID/F表示强制结束。如果你舍不得杀进程也可以改 Tomcat 的server.xml把端口换掉但换完所有访问 URL、截图里的地址都要跟着变文档和汇报全对不上。我的习惯是杀进程而不是换端口。5.3 登录成功反而跳404context-path没对齐现象登录页能开、账号密码也正确但登录成功后跳转的地址显示 404而且地址里的项目名不是你部署时的项目名。原因代码里的跳转语句硬编码了项目名比如sendRedirect(/bookkeeping/index)而本机部署名是BookkeepingSystem或者 IDE 的 Deployment 配置改了 context path但代码里没跟着改。解决跳转路径统一用request.getContextPath()动态拼接response.sendRedirect(request.getContextPath() /index);getContextPath()会自动返回当前实际部署名比如/bookkeeping拼上/index正好是完整地址。硬编码项目名是黑匣子式写法换一台机器、换一个部署名就翻车。排查方法很简单看 404 页面的地址栏把项目名那段对一下server.xml里的 Context 配置。5.4 中文乱码从页面到MySQL每一环都要UTF-8现象首页能打开但页面显示用户名变成ç™»å½或者数据库表里的中文全是????。有时候输入中文存进去再看是好的刷新一次就乱了。原因JSP 页面、HTTP 响应、JDBC 连接、MySQL 表这四层字符集只要有一层不是 UTF-8 就会乱。最常见的是漏了 JDBC URL 里的characterEncodingutf8或者数据库客户端在导入数据时用了默认的 gbk 字符集。解决从请求入口统一编码。在web.xml里加一个 Spring 提供的编码过滤器filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filterforceEncodingtrue会强制 request 和 response 都使用 UTF-8避免只处理请求不处理响应。JSP 页面顶部再确认存在% page contentTypetext/html;charsetUTF-8 %加上第 2 章里 JDBC URL 和建库语句的 utf8mb4四层对齐乱码自然消失。排查顺序是先看页面源码里的编码声明再看浏览器地址栏参数最后看数据库字段的字符集属性逐层排除不要乱试方法。提示字符集问题改完一定要重启 Tomcat只刷新页面不生效因为过滤器在容器启动时就注入了。5.5 部署视频与本机环境不一致视频只看流程不看逐帧现象视频里双击startup.bat就启动成功你双击闪退视频里 MySQL 回车就能登录你的 mysql 要密码视频里导入 sql 一次成功你导入报错。原因部署视频的作者在自己机器上录的系统版本、软件路径、账号密码都和你的环境有差异。视频能证明的是“这套 zip 有标准流程”不代表你的机器参数必须和视频里逐字一样。解决以部署文档为主以视频为辅。视频重点看三步——数据库怎么导入、项目怎么放进 Tomcat、IDE 里怎么等依赖下载完其他操作跟着文档做。日志比视频诚实Tomcat 启动日志第一行就写着它加载的是哪个 JDK、哪个项目路径对着日志排查比暂停视频放大看清每个字高效得多。6. 给毕设加一个能讲清楚的加分点收支趋势接口与验证动线如果原项目只有分类饼图可以加一个近 30 天收支趋势图。工作量小、能讲而且面试官一听就懂它就是按天分组合计收入支出数据让 SQL 一次算完。SELECT DATE_FORMAT(create_time, %m-%d) AS day, SUM(CASE WHEN type 1 THEN amount ELSE 0 END) AS income, SUM(CASE WHEN type 2 THEN amount ELSE 0 END) AS expense FROM t_transaction WHERE user_id #{userId} AND create_time DATE_SUB(CURDATE(), INTERVAL 29 DAY) GROUP BY DATE_FORMAT(create_time, %m-%d) ORDER BY day;CURDATE()是今天往前推 29 天、加上今天正好 30 天DATE_FORMAT(create_time, %m-%d)把时间转成MM-dd的字符串方便前端直接当 x 轴CASE WHEN type 1 THEN amount ELSE 0 END让收入支出各自成列。后端只返回有数据的那几天空日期由前端图表补零职责更清楚。这个接口加完前面第 3 章的聚合 SQL 思路就串成了一条线。演示动线也要提前彩排。这里有一份可以直接用的验证清单。验证步骤操作预期结果1 数据库恢复用初始化脚本重建空库并导入四张表出现流水表有测试数据2 登录使用部署文档里的默认账号登录成功并跳转首页3 记一笔金额 200.50备注“午餐”列表第一条出现该记录4 修改金额改成 180.00列表与统计数值同步变化5 删除删除刚才这笔统计图数据对应回落6 归属感处理改页面标题、包名、页脚信息全局搜索旧项目名无残留步骤 6 常被忽略。毕设源码里经常带原作者姓名、学校名、包名交付前逐处改掉这在源代码管理上也是一次干净的重命名。演示前恢复一次干净的数据库别带着之前测试的脏数据上场否则老师看到异常数字会影响印象分。注意演示当天只走主流程不要现场加新功能。能稳定跑通的系统比能演示新特性的系统更让老师放心。我自己处理每个外来源码包的习惯是先完整跑通再重构跑通前绝不改业务逻辑改代码只挑三处——登录、分页、统计三处都看懂就敢说“这是我维护过的系统”。这个习惯帮我躲过了很多次临时改崩的坑也让我在演示现场敢当场记一笔、改一笔给老师看。希望帮到你。本文还有配套的精品资源点击获取
返回列表