ARTICLE DETAIL

资讯详情

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

从zip到答辩:Spring Boot+MySQL单词学习管理系统毕设避坑全指南

从zip到答辩:Spring Boot+MySQL单词学习管理系统毕设避坑全指南 简介这是一份以Java后端为核心的英语单词学习管理系统毕业设计源码包适合计算机相关专业学生用于毕业设计、课程设计参考也可供Java初学者通过完整项目实践理解Web开发全流程。资源共791个文件压缩包约12.64MB主要包含127个Java后端源码、51个Vue前端组件、156个JavaScript交互脚本、42个HTML页面、46个CSS样式以及数据库SQL文件与启动脚本目录按前后端分层便于阅读和二次开发。系统覆盖用户注册登录、单词库管理、多种学习模式、基于艾宾浩斯遗忘曲线的复习提醒、学习进度统计及社交互动模块并采用MVC设计模式适合学习项目结构组织、数据库交互和接口设计。目前已有100人学习。通过运行附带的安装与启动脚本可快速搭建环境结合源码研读可掌握从数据库设计到前后端联调的完整思路是一份实用的工程实践参考。1. 英语单词学习管理系统毕设 zip 到手先别急着双击解压很多同学拿到「英语单词学习管理系统-毕业设计.zip」的第一反应是先解压、再导入 IDEA然后敲一行启动命令。理论上这是个正常流程但我帮人排查课设问题时发现真正卡住进度的从来不是写代码而是环境、数据库脚本以及打包时被漏掉的那几张表。这篇就按基于 Java 的毕业设计选题里最常见的交付组合——Spring Boot MySQL 前端模板——把这个 zip 从头拆到尾。这个方向适合两类人一类是刚解压完发现项目跑不起来、正在对着报错发愁的另一类是正打算拿这个题目当毕设想知道做到什么程度才不会被导师评价为「只会增删改查」的。背单词系统比图书管理、进销存多一层「学习行为数据」用户什么时候学、学了哪几个词、复习间隔怎么算。数据一多「算法」和「统计」就有得聊了这也是这个题目最大的加分空间。下面按环境搭建、数据建模、核心代码、常见坑、验收打包的顺序推进照着做大概率能在一两天内把它改造成一个敢在答辩现场跑的项目。2. 从 zip 到能跑解压、JDK 与 MySQL zip 安装的三道门槛zip 交付的毕设里一大半问题出在「解压到运行」之间的真空地带。你的目标不是先把代码看明白而是先把环境还原到作者写代码时那台电脑的水平。这里要过三道门槛确认压缩包完好、识别技术栈、装对 JDK 和 MySQL。过了这三关后面才谈得上改业务。2.1 解压前先验包zip 的目录结构里藏着能不能跑的关键在双击解压之前我一般先用命令行看一眼压缩包内容而不是直接右键。原因很简单如果是下载途中被截断的 zip图形界面会解压到一半报错留下一堆残缺目录你根本分不清哪些文件是坏的。Linux 或 macOS 下可以先列清单unzip -l 英语单词学习管理系统-毕业设计.zip-l参数只列出压缩包内的条目不解压。它能让你在不落地任何文件的情况下先确认里面有没有pom.xml、有没有sql/目录。如果命令报出类似End-of-central-directory signature not found的错误说明这个 zip 的文件尾中央目录已经损坏常见原因是下载中断或网盘同步不完整重下比手工修复更划算。Windows 用户直接双击 zip在资源管理器里预览内容也可以但对「完整性」的判断不如命令行可靠。确认包没坏再解压到独立目录unzip -o 英语单词学习管理系统-毕业设计.zip -d word-learning/参数说明-o表示遇到已存在文件直接覆盖避免重复解压时交互询问-d指定输出目录推荐解压后目录名不要带中文和空格否则后面的 Maven 和 Spring Boot 偶尔会因路径问题出幺蛾子。一个完整的毕设 zip 常包含这几类内容可用表格对照目录或文件常见内容缺了会怎样sql/或db/建库、建表、初始化数据脚本换电脑就起不来属于灵魂文件src/main/java后端源码整个项目都没了src/main/resourcesapplication.properties/application.yml数据库连接、端口配置找不到doc/或说明.txt部署步骤、账号密码、功能说明只能自己猜起步慢pom.xmlMaven 依赖描述依赖拉不下来项目无法编译注意如果 zip 里没有sql/目录优先看 README 或说明文档里有没有内联的建表 SQL都没有就只能从实体类反推表结构了。判断一个毕设 zip 是否完整第一眼就看有没有数据库脚本。2.2 基于 Java 的毕业设计选题为什么 Spring Boot MySQL 最稳我到手这类题目时默认技术路线是 Spring Boot MySQL Thymeleaf很少主动换栈。原因不是 Spring Boot 有多先进而是它在毕设这个场景里试错成本最低。对比几个常见组合技术组合环境搭建答辩话语权资料密度二次开发难度Spring Boot MySQL中等Maven 首次下载慢高能讲自动配置、JWT、ORM极高低SSMSpringSpringMVCMyBatis较高XML 配置多中老教师认可但显旧高中Flask SQLite低省去数据库安装中适合跨专业项目中中SSM 的问题在于手写配置太多新人很容易在applicationContext.xml里耗掉两三天而且面试官和答辩老师现在更认 Spring Boot 的「约定优于配置」。Flask 适合纯 Python 方向的课设但做单词学习系统这种偏 CRUD 加简单算法的题目Java 体系里的 JPA、MyBatis、JWT、拦截器都有更成熟的轮子答辩时被追问「为什么选型」也更有东西讲。MySQL 这边我坚持用 zip 而不是安装包。安装版的 MySQL 会在系统里注册服务、写入大量目录卸载不干净的话第二次装就容易出权限冲突。zip 版解压即用之后要清理删目录加mysqld --remove就完了对毕设这种「一台机器要折腾很多次」的场景格外友好。2.3 JDK 8 与 MySQL 的 zip 安装最小环境命令与参数说明先看机器上有没有 JDKjava -version如果输出是1.8.x大多数毕设项目都能直接编译。如果已经是 17 或 21有些老项目反而会因为依赖版本太旧报错。所以我一般会在项目目录里放一个jdk8的 zip解压后用环境变量指过去不改系统全局配置。Linux 下这样配export JAVA_HOME/opt/jdk8 export PATH$JAVA_HOME/bin:$PATHWindows 用户用setx JAVA_HOME D:\jdk8注意setx只对之后新开的终端生效配置完必须新开一个 cmd 窗口验证在当前窗口里敲java -version看到的还是旧版本。这个细节卡住过不少人。MySQL zip 安装的典型操作是unzip mysql-8.0.xx-winx64.zip -d D:\mysql cd D:\mysql\bin mysqld --initialize-insecure mysqld --install MySQL net start MySQL参数说明--initialize-insecure会初始化一个 root 空密码的实例适合本地毕设省掉从日志里翻临时密码那一步如果用了默认的--initialize初始密码会随机生成并写进data目录下的.err日志初学者很容易找不到。mysqld --install是把 MySQL 注册成 Windows 服务之后开机自启Linux 环境对应systemctl或直接mysqld_safe 后台跑。验证连接mysql -u root -e select version();数据库起来之后项目里application.properties的连接串建议直接写成spring.datasource.urljdbc:mysql://localhost:3306/word_learning?useSSLfalsecharacterEncodingutf8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password123456这里的characterEncodingutf8和serverTimezoneAsia/Shanghai不是可选项而是后面会踩的乱码和时区坑的预防针。JDBC 驱动与 MySQL 8 的认证兼容问题后面单独讲先记住一个原则连接串参数尽量一次配齐别等报错再回头补。3. 把背单词拆成可编码的业务单词库、学习计划与遗忘曲线环境就绪下一步是把「背单词」翻译成表和接口。初做毕设的人常犯的错是一口气设计十张表结果两张没数据、三张互相矛盾。背单词系统不需要复杂表结构三张表就能形成闭环关键是表之间的状态流转要经得起追问。3.1 三张核心表用户、单词与学习记录先看建表 SQL这是我一般推荐的起点create table users ( id bigint primary key auto_increment, username varchar(50) not null unique, password_hash varchar(100) not null, created_at datetime not null default current_timestamp ); create table words ( id bigint primary key auto_increment, spelling varchar(100) not null unique, phonetic varchar(100), meaning varchar(255) not null, example_sentence varchar(500), example_translation varchar(500), created_at datetime not null default current_timestamp ); create table study_records ( id bigint primary key auto_increment, user_id bigint not null, word_id bigint not null, status tinyint not null default 0 comment 0陌生 1学习中 2已掌握, review_count int not null default 0, next_review_at datetime not null, last_review_at datetime, created_at datetime not null default current_timestamp, unique key uk_user_word (user_id, word_id), index idx_next_review (user_id, next_review_at) );字段设计的几个边界要说明。status用tinyint而不用varchar(learning)这种写法是为了将来统计时少做字符串转换也防止不同入口把状态写成「已学习」「学习中」这类同义不同串的值。uk_user_word唯一键保证「一个用户对一个词只有一条学习记录」这是第 5 章要讲的「只增不改」坑的预防。study_records里故意不写物理外键只保留user_id、word_id做逻辑关联。外键在实际开发中很容易让初学者在删除数据时被约束拦住答辩时讲清楚「逻辑外键由 service 层保证」完全够用还显得你考虑过维护成本。words表里为什么要单独存example_sentence和example_translation因为答辩演示时一个只显示「单词 中文意思」的页面太单薄带上例句和翻译页面信息量立刻不同学习闭环也更完整。如果原 zip 里词表只有三列建议现场补上例句字段几千条演示数据可以从公开词库导入这个工作量不大但收益明显。3.2 学习主流程从陌生到已掌握的三态流转背单词的核心不是展示词表而是「状态流转」。我一般按这样的逻辑设计初始状态陌生用户第一次看到单词点「认识」记录review_count 1next_review_at 当前时间 1 天状态变为学习中。到期复习到next_review_at后用户在复习队列里再次点「认识」review_count加 1下一次复习间隔翻倍2 天、4 天、8 天……状态在学习中。连续掌握当review_count 3且状态为学习中时置为已掌握不再进入复习队列。点「忘记」状态退回陌生review_count清零下一次复习时间为明天。对应的 service 核心方法可以这样写public ReviewResult review(Long userId, Long wordId, boolean remembered) { StudyRecord record recordMapper.findByUserIdAndWordId(userId, wordId); if (record null) { throw new BizException(请先学习该单词); } if (remembered) { record.setReviewCount(record.getReviewCount() 1); if (record.getStatus() 1 record.getReviewCount() 3) { record.setStatus((byte) 2); // 连续记住升级为已掌握 } record.setNextReviewAt(calcNextTime(record.getReviewCount())); } else { record.setStatus((byte) 0); // 忘记回退到陌生 record.setReviewCount(0); record.setNextReviewAt(LocalDateTime.now().plusDays(1)); } record.setLastReviewAt(LocalDateTime.now()); recordMapper.updateById(record); return ReviewResult.of(record.getStatus(), record.getNextReviewAt()); }参数说明为什么「记住三次就掌握」而不是一次演示现场手滑点错一下很常见一次判定掌握会让页面状态显得很假三次判定既符合直觉又给你留出操作余量。每次点「认识」都返回next_review_at前端直接展示「下次 XX 再来」比返回一个「操作成功」有说服力得多。这里没有用事务注解因为单表更新本来就原子但如果后面加了学习日志流水表就要在方法上补Transactional。这个三态流转是整个系统里最值得在答辩时讲的部分它把「背单词」从查词表演示成了「带复习策略的闭环功能」。3.3 用遗忘曲线算复习时间间隔参数与一条到期查询 SQL复习间隔我用的是简化幂级数第一次学完 1 天内召回之后每次复习间隔翻倍。计算下一次复习时间的方法private LocalDateTime calcNextTime(int reviewCount) { int days 1 Math.min(reviewCount, 5); // 1, 2, 4, 8, 16, 32封顶 32 天 return LocalDateTime.now().plusDays(days); }1 Math.min(reviewCount, 5)的含义reviewCount1时是 2 天reviewCount2时是 4 天递增到 32 天后封顶不再翻倍。封顶很重要否则一个背了 20 遍的词会被排到一年后演示数据在界面上就消失了。这里有两个参数可以调封顶天数我取 5和判定掌握所需的复习次数我取 3。如果你想对导师说「我参考了艾宾浩斯遗忘曲线」这两个参数就是你的工程化实现依据。到期复习队列用一条带 JOIN 的查询就能拉出来select w.id, w.spelling, w.meaning, r.review_count, r.status from study_records r join words w on r.word_id w.id where r.user_id ? and r.status 2 and r.next_review_at now() order by r.next_review_at asc limit 20;逻辑说明先按用户过滤再排除已掌握的单词只取next_review_at now()的数据意思是「到了该复习的时间但还没复习」按下次复习时间升序排列最该先复习的排在最前limit 20防止一次加载太多保证页面打开快。这个查询把「学过的词」和「该复习的词」区分开演示效果非常直观。如果后续要换 SM-2 算法只需要替换calcNextTime方法和这个查询里的排序条件表结构不用动——这一点答辩时也能讲。4. 核心代码落地登录、单词查询与打卡统计怎么写得像样数据模型定了接下来是让接口可演示。答辩老师不会逐行看你的代码但一定会点几下页面。所以这一章的核心诉求不是优雅而是「最小可运行 关键链路完整」每一段代码都要能在你电脑上一次跑通。4.1 登录接口Spring Security JWT 的最小可运行写法Spring Security 全套配置对新人劝退效果太明显常见做法是只借用它的过滤器机制配合一个 JWT 工具类完成登录鉴权。下面以 jjwt 0.11.x 为例public class JwtUtil { private static final SecretKey KEY Keys.hmacShaKeyFor(word-learning-demo-secret-key-2024.getBytes(StandardCharsets.UTF_8)); public static String create(Long userId, String username) { return Jwts.builder() .setSubject(String.valueOf(userId)) .claim(username, username) .setExpiration(new Date(System.currentTimeMillis() 86400000L)) .signWith(KEY, SignatureAlgorithm.HS256) .compact(); } public static Long parse(String token) { return Long.valueOf(Jwts.parserBuilder().build() .parseClaimsJws(token).getBody().getSubject()); } }参数说明setExpiration里86400000L是 24 小时的毫秒数。演示当天设置 24 小时最省心不会轮到自己的时候 token 过期让页面跳回登录页。secret key硬编码在类里对毕设项目没有安全问题但你要能说出「在生产环境应该放到环境变量或配置中心」这句话。parse方法在 token 非法时会抛异常调用方统一捕获即可。过滤器只需要拦截并解析 tokenpublic class JwtFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header request.getHeader(Authorization); if (header ! null header.startsWith(Bearer )) { try { Long userId JwtUtil.parse(header.substring(7)); request.setAttribute(userId, userId); } catch (Exception e) { response.setStatus(401); return; } } chain.doFilter(request, response); } }逻辑说明从Authorization头里取出Bearer后面的 token解析成功就把userId塞到 request 属性里后面的 Controller 直接用RequestAttribute Long userId取。解析失败返回 401前端拿到 401 就跳登录页。注意登录接口/api/auth/login要在过滤器里放行否则用户还没登录就被拦了。过滤器的注册用FilterRegistrationBean指定拦截路径/api/*静态页面不拦截。4.2 单词查询与学习打卡Controller 的职责边界Controller 层要薄业务放 service。两个核心接口就够了RestController RequestMapping(/api/words) public class WordController { GetMapping public PageResultWordVO page(RequestParam(defaultValue 1) int page, RequestParam(defaultValue 20) int size, RequestParam(defaultValue 0) int status) { return wordService.page(page, size, status); } PostMapping(/{wordId}/review) public Result review(PathVariable Long wordId, RequestParam boolean remembered, RequestAttribute Long userId) { return wordService.review(userId, wordId, remembered); } }参数说明page和size给默认值是为了让前端少传两个参数也防止有人不传参时一次性把几千词全部查出来拖垮页面。status默认 0 表示「查陌生词」也可以传 1 查学习中的词、传 2 查已掌握的这个过滤条件正好对应第 3 章的状态字段。RequestAttribute Long userId来自 4.1 的过滤器不需要前端传避免有人伪造别人的 ID 操作数据。review接口返回的就是wordService.review的结果包含最新的status和nextReviewAt。前端不需要自己计算复习时间只负责展示。不要把业务计算放到 Controller 里写否则答辩时老师问「下次复习时间在哪算的」你指着一堆 Controller 代码很难讲清楚。4.3 前端页面Bootstrap 模板为什么比 Vue 更适合演示现场我见过太多人在毕设里用 Vue axios最后答辩前 node_modules 装不上、跨域调不通人还在现场改配置。毕设演示更看重「打开即用」Bootstrap Thymeleaf 或纯静态 HTML 是最稳的选择。把 HTML 放进 Spring Boot 的src/main/resources/static目录后端起一个端口页面和接口同源访问零跨域配置。打卡按钮的请求可以这样写fetch(/api/words/ wordId /review?rememberedtrue, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer localStorage.getItem(token) } }) .then(res res.json()) .then(data { showToast(下次复习时间 data.data.nextReviewAt); });逻辑说明用fetch而不是 axios是为了避免额外引入依赖CDN 挂了页面还能用本地文件离线也能演示。localStorage.getItem(token)是登录时存下的每次请求带上过滤器那一端就能解析出当前用户。前端只负责把nextReviewAt展示出来不做间隔计算这是为了保持逻辑唯一性——后端改参数前端不需要动。这一章的落点很明确不需要花哨的前端框架把登录、词库、打卡三个页面做干净链路完整答辩就够用了。5. 毕业设计避坑GitHub 上抄来的项目为什么一跑就翻车网上常说「毕业设计从 GitHub 抄来」真正抄过的人会告诉你代码能抄到环境抄不到。这一章写的是我在给计算机毕业设计排查问题时最常撞见的五个坑按现象、原因、解决三步拆开。踩过的直接对照没踩过的建议先看完再动手。5.1 MySQL 8 认证插件导致应用连不上现象项目启动时数据源报Access denied for user root或者提示Public Key Retrieval is not allowed但你用mysql -u root -p命令行明明能登录。原因MySQL 8 默认的认证插件是caching_sha2_password而项目里的 JDBC 驱动版本较旧或连接串没有显式允许公钥检索。老版本的 MySQL 用的mysql_native_password在 8.0 里已经不是默认两边认证方式对不上应用层就拒绝连接。解决优先改连接串不动数据库认证方式jdbc:mysql://localhost:3306/word_learning?useSSLfalseallowPublicKeyRetrievaltrueallowPublicKeyRetrievaltrue允许客户端在加密连接前从服务端获取公钥配合useSSLfalse适合本地开发。如果想从根本上兼容老项目也可以执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;但新版 MySQL 对mysql_native_password的兼容正在收紧所以我一般不建议在 8.4 及以后的版本上走这条路。先试连接串参数不行再考虑改认证方式这是最稳的顺序。5.2 Maven 依赖下载卡住IDEA 里 pom 一片红现象IDEA 右下角转圈几个小时pom.xml里 Spring Boot 相关依赖全部标红报Cannot resolve org.springframework.boot:spring-boot-starter-web。原因Maven 默认的中央仓库在国外国内网络环境下首次下载几百 MB 依赖经常超时还有一个常见原因是 IDEA 内置的 Maven 和本地仓库路径没配对下载了一半的.lastUpdated损坏文件被缓存下来之后每次都直接跳过。解决在settings.xml里加镜像地址用阿里云的公开仓库mirror idaliyunmaven/id mirrorOfcentral/mirrorOf nameAliyun Maven Mirror/name urlhttps://maven.aliyun.com/repository/central/url /mirrormirrorOf写成central只镜像中央仓库避免影响项目里其他私有仓库配置。改完在 IDEA 的 Maven 设置里确认User settings file指向这个settings.xml然后点刷新。如果本地仓库里已经有一堆.lastUpdated结尾的文件建议直接删掉~/.m2/repository下对应的org/springframework目录再重新下载比反复刷新省时间。5.3 中文乱码与时间差 8 小时连接串里的两个参数现象页面上的例句中文全部变成问号数据库里查出来的数据正常但页面显示乱同一个created_at字段在数据库里和页面上显示的差 8 小时。原因两件事常一起出现。乱码是连接串没指定字符集JDBC 驱动和 MySQL 会话用默认编码通信多半不是 UTF-88 小时时差是 MySQL 服务器时区和 JDBC 驱动协商结果不对默认取了 UTC而东八区比 UTC 快 8 小时。解决把连接串补完整再加 JVM 参数双保险spring.datasource.urljdbc:mysql://localhost:3306/word_learning?characterEncodingutf8serverTimezoneAsia/Shanghaijava -Dfile.encodingUTF-8 -jar word-learning.jar这个「玄学乱码」大多不是编译期编码问题而是运行期连接参数漏了。数据库表本身如果是latin1老库还要先执行ALTER TABLE words CONVERT TO CHARACTER SET utf8mb4;把表转换过来。时区问题补了serverTimezoneAsia/Shanghai后DATETIME存进去和显示出来就一致了。5.4 学习记录只增不改一查统计就虚高现象同一个单词重复点「认识」study_records表里生成多条记录统计「平均每天学习单词数」时同一词被算了两次数字明显虚高。原因项目把学习记录当成流水日志来写每次打卡都 insert 一行没有按「用户 单词」做唯一约束也没有把「掌握状态」当成会变化的数据来更新。查询时不做去重统计必然失真。解决先给表加唯一键alter table study_records add unique key uk_user_word (user_id, word_id);再把打卡逻辑改成「存在就更新不存在才插入」的 upsert 写法。MySQL 里典型写法是INSERT ... ON DUPLICATE KEY UPDATE或者像第 3 章那样先select再决定update还是insert。统计「坚持天数」时用时间去重而不是数行数select count(distinct date(last_review_at)) as active_days from study_records where user_id 1;答辩老师最喜欢问这类「数据一致性」问题因为大部分 GitHub 上的简单项目都没做这层处理。你把唯一约束和 upsert 写进去代码量没有增加能讲的东西却多了一个你知道学习记录是状态不是流水。5.5 zip 里没有 SQL 脚本换台电脑就起不来现象把项目从笔记本拷到台式机或者直接用答辩现场的电脑打开数据库一张表都没有页面打开全是数据源报错。翻遍 zip发现根本没有.sql文件。原因打包时只打了代码数据库脚本没导出或者作者当初用的是图形工具里的「转储」功能但导出后忘了放进 zip。数据库脚本这类资源文件不像代码一样能通过编译检查出来特别容易被漏掉。解决自己从干净库里导出全量脚本放回项目里mysqldump -u root -p word_learning --default-character-setutf8mb4 word_learning.sqlmysqldump这个命令在 MySQL zip 安装目录的bin下就有不用额外下载工具。--default-character-setutf8mb4保证导出的脚本里中文注释和例句不乱码。然后在 README 里写清楚三步恢复mysql -u root -p -e create database word_learning default character set utf8mb4; mysql -u root -p word_learning word_learning.sql记住一个原则zip 里可以没有源码注释但不能没有数据库脚本。一个从零能跑起来的sql/目录是你第二次打开这个项目时最好的后悔药。6. 答辩前 48 小时验收清单、统计图表和最后一次打包最后这一章不展开新功能只讲验证和收尾。功能做完到答辩之间这 48 小时最容易翻车的不是代码而是「演示路径没走顺」。6.1 验收清单演示前照着走一遍功能操作预期表现登录输入正确账号密码跳转学习页刷新后仍保持登录单词查询打开词库分页每页 20 词显示音标、释义、例句学习打卡点「认识」提示下次复习时间列表中状态变为学习中复习提醒切到「到期词」只出现next_review_at now()的单词统计页查看近 7 天学习量折线图或表格数据与操作记录一致这张表不仅是你的演示脚本也是论文功能测试章节的素材。每行都过一遍比写十页文字管用。6.2 给论文加一张统计图论文里有一张「近 7 天学习单词数」的折线图比任何架构图都有说服力。数据来源就是study_records表select date(last_review_at) as d, count(distinct word_id) as cnt from study_records where user_id 1 and last_review_at date_sub(now(), interval 7 day) group by date(last_review_at) order by d;逻辑说明用date(last_review_at)把时间精确到天用count(distinct word_id)避免同一个词重复打卡被计两次。查询结果可以直接喂给 ECharts或者导出成 CSV 后在 Excel 里画图。答辩现场放这张图老师第一眼就能看到「系统产生了数据」比满屏代码直观得多。6.3 重新打包前的三个习惯我每次交毕设 zip 前都会做三件事。第一把数据库重置成干净的演示数据删掉自己测试时的脏记录然后重新导出 sql 脚本保证 zip 里的脚本和当前系统状态完全一致。第二把 README 写成「一个完全陌生的人照着做也能跑起来」的程度从 JDK 安装开始写不要默认别人电脑里什么都有。第三用命令行重新打 zip排除编译产物和 IDE 配置文件zip -r word-learning.zip . -x */target/* -x */.idea/* -x *.class-x参数排除target目录和 IDEA 配置zip 体积能小一大半换电脑解压后也不会把你的个人环境配置带过去。这三件事做完这个方向就算真正落地了能跑、能讲、能交。我的个人习惯是宁可少写两页论文也要保证演示现场一次跑通因为对毕业设计来本文还有配套的精品资源点击获取
返回列表