简介:黑马程序员推出的tlias智能学习辅助系统是一套基于JavaWeb的完整项目练习资料,面向计算机、电子信息等专业需要完成课程设计或毕业设计的学生,帮助其理解智能学习辅助系统的开发流程与实现思路。资源压缩包共422个文件,大小约78.44MB,涵盖Java源码、HTML页面、CSS样式、JavaScript脚本及大量PNG/SVG图片资源,前后端文件组织清晰,便于对照学习与二次开发。系统包含智能推荐学习资料、学习进度跟踪、测评反馈等核心功能模块,代码经过导师指导认可,具备一定规范性与实用性。通过研读源码,读者可掌握JavaWeb项目从需求分析到部署测试的完整链路,并学习前端交互与后端逻辑的整合方式。这套资源目前已有295人学习下载,对于正在筹备毕设或课设的读者而言,是一份可直接参考的项目范例。
1. 白嫖一个JavaWeb毕设底子:tlias智能学习辅助系统到底练什么
如果你正在找能直接交毕设、课设的JavaWeb项目,多半会搜到黑马程序员这个tlias智能学习辅助系统。名字带着“智能”,但打开源码你会发现它其实是JavaWeb入门阶段最标准的后台管理系统:登录鉴权、员工/部门管理、文件上传、分页查询。真正的价值在于,它把一套现代JavaWeb项目该有的骨架完整搭好了,SpringBoot + MyBatis + MySQL + JWT + Vue前后端分离,你不用从零搭环境,只要把包解压跑通,再往骨架上加自己的业务表,就能把“练习”变成“自己的系统”。适合两类人:一是刚学完JavaWeb想找个综合案例练手的新手,二是时间紧、想基于成熟案例二次开发的毕设党。这篇文章不会替你把代码一句句讲完,而是告诉你它解决什么问题、怎么最快跑起来、改哪些参数能应付答辩。
2. 拆开tlias这个JavaWeb综合案例:它到底练了哪些技术点
2.1 技术栈与选型:为什么入门案例都在用SpringBoot + MyBatis
tlias最值得学的地方不是业务,而是技术栈的组织方式。课程练的是JavaWeb入门到企业开发之间那段“从会写Servlet到能接手真实项目”的过渡。早期黑马案例用SSM框架(Spring + SpringMVC + MyBatis)居多,配置XML多到能劝退一半人。tlias这套改成SpringBoot主导,常见做法是内嵌Tomcat,一个main方法就能把服务起在8080端口,不用再打war包丢到Tomcat的webapps目录。这一点对毕设非常友好:演示的时候不用担心独立Tomcat没启动,SpringBoot起来接口就在。
MyBatis在这套系统里负责数据库操作。课程里大量练习Mapper接口 + XML文件的方式,因为到了公司里,老项目基本都是MyBatis或MyBatis-Plus。用tlias练会了XML里写动态SQL、resultMap映射、分页插件配合,面试被问“MyBatis #{}和${}区别”时你能直接拿项目里的代码举例,而不是背概念。
前端部分课程给的是Vue工程,常见有两种交付形态:一种直接给dist打包好的静态文件,另一种给完整前端源码。无论哪种,后端只出JSON接口,前端通过axios请求,这就是现在企业里最常见的前后端分离。答辩时你可以理直气壮地说“我独立完成了接口设计、鉴权逻辑与功能验证”,这就够了。
2.2 从压缩包里找项目地图:后端src、前端dist与SQL脚本的分工
拿到那个zip,先别急着双击idea导入工程。我一般会先建一个不带中文和空格的目录,比如D:\tlias\,把压缩包整个解压进去。Windows用户最容易在这步翻车:路径里带中文,后面MySQL的source命令和Tomcat静态资源路径都可能出现编码问题,属于典型的“启动失败但报错信息莫名其妙”。
解压后压缩包里通常有这几类东西:
| 内容 | 常见命名 | 作用 |
|---|---|---|
| 后端源码 | 类似tlias-web-management | SpringBoot工程,含pom.xml、src/main/java、src/main/resources |
| SQL脚本 | 类似tlias.sql或db.sql | 建库建表 + 初始化账号数据,启动前必须先导入 |
| 前端产物或源码 | dist目录或Vue工程 | 浏览器里看到的页面,负责调后端接口 |
| 配套说明 | 课程PDF、笔记或md | 往往是黑马Java笔记里对应章节的摘录 |
后端源码是练习的核心。打开src/main/resources里的application.yml,数据源、端口、文件上传大小都在那边。SQL脚本是整个系统的地基,它建了用户表、员工表、部门表。所谓“智能学习辅助系统”,落到表结构上就是标准的员工管理和部门管理,学习辅助体现在哪里,黑马课程里没有深究。它在JavaWeb入门阶段的定位是“把之前学的所有Web知识串起来”,不是一个AI系统。这一点你心里要有数:答辩时别硬往“智能”上夸,往“基于该骨架二次开发”方向讲才站得住。
2.3 三层架构与请求路径:一个员工列表请求是怎么走完的
拿到项目以后,第一件事不是运行,而是把一条请求链路读明白。以查询员工列表为例,典型路径是:前端axios发起GET请求到/emps?pageNum=1&pageSize=10,请求先被SpringBoot的DispatcherServlet接收,SpringMVC根据注解@GetMapping("/emps")找到Controller方法,Controller调用Service接口,Service实现类调用Mapper接口,Mapper的XML里写具体的SQL查询,结果逐层返回,最后以JSON格式响应给前端。
这套链路里每个文件各司其职,Controller只写参数接收和结果包装,不写SQL;Service只写业务规则,也不碰数据库;SQL全部集中在resources目录下的mapper XML里。新手最常见的错误是在Controller里直接Autowired一个Mapper,跳过了Service层,短时间能跑通,但答辩时你说不清“业务逻辑放在哪一层”,这就吃亏了。
@RestController @RequestMapping("/emps") public class EmpController { @Autowired private EmpService empService; @GetMapping public Result page(@RequestParam Integer pageNum, @RequestParam Integer pageSize) { PageBean pageBean = empService.page(pageNum, pageSize); return Result.success(pageBean); } }这里pageNum和pageSize是前端传的分页参数,Result是课程统一封装的后端响应对象,格式一般是{code, msg, data}。你一定要注意:Controller里不做分页计算,只接收参数并转发给Service。这样分层的好处是,如果前端从GET改成POST,或者从表单改成JSON,Controller改一下就够,Service不用动,这在实际开发里能省很多事。
我把这条链路在纸上画一遍,比打开源码乱点一小时更有效。你能对着白板讲清楚从请求进来到SQL返回的完整路径,答辩开场的十分钟就稳了。
3. 在IDEA里跑通JavaWeb项目完整案例:tlias的启动配置与SQL导入
3.1 环境检查:JDK、Maven、MySQL 8.0、IDEA各就各位
跑tlias之前,环境比项目本身更容易让你翻车。先做一次体检,命令行依次敲这四个命令,哪个报错就先把哪个解决掉:
java -version mvn -v mysql --version node -vjava -version确认JDK是8或11,tlias这类课程工程通常按JDK8编译,你本机装的是17也能跑,但IDEA里Project Structure的SDK和Language Level要对齐成同一版本。mvn -v确认Maven 3.6以上,IDEA自带Maven也行,但建议换成你本机安装的Maven,并配好aliyun镜像,否则下载依赖会慢到怀疑人生。mysql --version能看到5.7或8.0都可以,但驱动和URL写法有区别,下文3.2会说到。至于node -v,只有你打算用Vue源码方式跑前端时才需要,前端只有dist包的话可以跳过。
如果你是Windows用户,手头还没有MySQL,我建议直接下MySQL 8.0的zip免安装版,解压后执行三条命令就能把服务装成Windows本地服务:
mysqld --initialize-insecure mysqld --install tlias-mysql net start tlias-mysql--initialize-insecure会生成一个root空密码的账户,方便你接下来直接登录;--install tlias-mysql把MySQL注册成Windows服务,net start启动它。注意这三条命令都要在MySQL解压目录下的bin目录里执行,或者把bin路径加到环境变量PATH里。用zip免安装版的好处是以后不要了直接停服务删目录,不往系统里留下乱七八糟的残留。
3.2 三步导入SQL:建库、执行脚本、核对数据库账号
tlias的SQL脚本一般把建库和建表都写在一起,我们不看内容,直接在MySQL命令行里按顺序执行:
mysql -uroot -p登录后执行:
CREATE DATABASE IF NOT EXISTS tlias DEFAULT CHARSET utf8mb4; USE tlias; SOURCE D:/tlias/tlias.sql;注意三个细节。第一,SOURCE后面要用正斜杠或转义后的反斜杠,Windows路径D:\tlias\tlias.sql在MySQL命令行里容易被误读,写成D:/tlias/tlias.sql最保险。第二,数据库字符集用utf8mb4,不要用utf8,否则前端页面上输入emoji或生僻字时可能报“Incorrect string value”错误。第三,导入之后执行SHOW TABLES;,确认表确实进来了,别急着关窗口。我见过不少同学导入时没注意MySQL当前所在目录,SQL文件路径写错,报错没细看,以为导入了,结果启动后端直接“Table doesn't exist”。
如果你的MySQL是8.0,数据库连接URL里必须带时区参数,否则会报“The server time zone value”错误,具体怎么写下一节直接给配置。
3.3 启动后端:改配置文件的三个位置,等端口8080亮起来
后端工程导入IDEA以后,重点看src/main/resources/application.yml。课程配套的默认配置一般可以直接启动,但你本机的用户名、密码、端口未必和课程环境一致。常见的做法是把下面这一段复制进去,逐个参数对上自己的环境:
server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/tlias?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 servlet: multipart: max-file-size: 10MB max-request-size: 20MB mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true jwt: secret: TliasSecretKey2024 expiration: 43200这段配置有三个地方是启动成败的关键。第一个是driver-class-name,MySQL 8.0必须写com.mysql.cj.jdbc.Driver,老教程里那个com.mysql.jdbc.Driver在新驱动下会报警告甚至直接报错。第二个是URL里的serverTimezone=Asia/Shanghai,缺了它,MySQL 8.0连接时会报时区异常。第三个是jwt.expiration,单位是分钟,43200就是12小时,调试的时候建议先改成120,省得token过期了还以为是代码写错了。
改完配置,找到带有@SpringBootApplication注解的主类,直接右键Run。看到日志里出现“Tomcat started on port 8080”就是后端起来了。如果IDEA运行按钮是灰色的,见第5章的排查办法,那里有几个高频启动坑。
3.4 前端部分跑通:拿静态dist还是用Node起开发服务
前端有两种情况要分开处理,很多同学卡在这里不是因为代码,而是不知道自己在跑哪种。
第一种,压缩包里只有dist目录。这是已经构建好的纯静态文件,不需要node环境。最简单的方式是直接把dist里的内容复制到后端项目的src/main/resources/static下,然后只启动后端,浏览器访问http://localhost:8080/就能看到登录页。原理是SpringBoot内嵌Tomcat会把static目录当作静态资源根目录,前端打包后的js/css/html都在里面,和后端接口同源,自然没有跨域问题。这种方式最稳,我强烈建议第一次运行就用它,先把闭环跑通。
第二种,压缩包里带Vue源码目录,比如tlias-web这种,里面有package.json。这时需要先安装依赖再启动开发服务器:
cd tlias-web npm install npm run dev开发服务器默认起在8080或5173,后端跑在8080,这就有跨域问题。课程案例的前端工程一般在vite.config.js或vue.config.js里配了代理:
proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } }但tlias后端接口的路径前缀不一定是/api,你要先看前端的请求封装文件,比如utils/request.js里的baseURL。如果它直接写的是http://localhost:8080,那就不需要代理;如果写的是/api,而后端没有这个前缀,要么把代理去掉,要么在后端application.yml里加server.servlet.context-path: /api。一句话,前端页面打开后,按F12看Network面板里请求的完整URL,和后端Controller的@RequestMapping路径对得上,接口才能通。
3.5 一键验证:登录接口拿到token,列表接口返回JSON
前后端都在运行后,先不点页面,用curl直连后端验证最干净。tlias的登录接口通常是POST请求,参数是JSON;员工列表接口是GET请求,需要在请求头里带token。命令行执行:
TOKEN=$(curl -X POST http://localhost:8080/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}' | sed 's/.*"token":"\([^"]*\)".*/\1/') curl http://localhost:8080/emps?pageNum=1\&pageSize=10 \ -H "Authorization: $TOKEN"第一条命令登录并把返回的token字符串截出来,存到环境变量TOKEN里;第二条命令带着token去查员工列表。如果第二条命令返回了包含total和rows的JSON,说明后端整个链路是通的。没有装sed的Windows用户可以在Git Bash里跑,或者用Postman手动复制token。这一步过了,再去刷新浏览器页面,剩下的就只是前端展示问题,不再是“后端没起来”那种黑匣子。
4. 练习和改作业都要动代码:登录鉴权与CRUD的关键参数
4.1 JWT登录链路:生成token的代码与签名参数
tlias的登录模块是全项目里最值得你反复读的代码。它不用Session,而是用JWT签发token,前端每次请求都在请求头里带上这个token,后端拦截器负责校验。练明白这一块,等于学会了现在无状态登录的基本套路。
常见实现是基于jjwt或java-jwt库,生成token的代码大概长这样:
public String createToken(String username) { long now = System.currentTimeMillis(); Date expiration = new Date(now + jwtProperties.getExpiration() * 60 * 1000); return Jwts.builder() .setSubject(username) .setIssuedAt(new Date(now)) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, jwtProperties.getSecret()) .compact(); }setSubject放的是用户名,通常不往token里塞密码;setExpiration是过期时间,分钟数乘上60再乘1000转成毫秒;signWith里的SignatureAlgorithm.HS256指定签名算法,getSecret()对应配置文件里的jwt.secret。有一点要注意:secret至少32字节比较安全,课程项目常给一句话字符串直接放配置里,练手无所谓,答辩时如果能说出“生产环境secret应该用独立配置中心管理,不能提交到git”,就是加分项。
4.2 拦截器与放行路径:哪些请求必须带token,哪些放行
生成token只是前半段,真正卡住请求的是拦截器。tlias用一个自定义的HandlerInterceptor在请求进入Controller之前校验token,这是整个鉴权链的关键。
public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || token.isEmpty()) { response.setStatus(401); return false; } try { Claims claims = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); request.setAttribute("username", claims.getSubject()); return true; } catch (Exception e) { response.setStatus(401); return false; } } }这段代码的逻辑是:从请求头里拿Authorization字段,没有token直接返回401;有token就解析,解析成功把用户名塞进request属性并放行,解析失败说明token过期或被篡改,也返回401。它不关心业务,只做一道门卫。
注册拦截器时一定要把放行路径配全,否则登录接口自己也会被拦住:
registry.addInterceptor(new JwtInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login", "/error", "/upload/**");addPathPatterns("/**")表示拦截所有路径,excludePathPatterns里放行登录、错误页和上传文件的回显路径。这里最容易踩的坑是漏掉/error,导致认证失败时SpringBoot要跳转错误页也被拦截器返回401,前端收到的是个空响应体,排查起来特别迷惑。
4.3 员工列表加分页:PageHelper的startPage用法与SQL边界
分页查询是tlias里的高频考点。课程一般用的是PageHelper插件,写起来非常简洁:
public PageBean page(Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); List<Emp> list = empMapper.findAll(); PageInfo<Emp> pageInfo = new PageInfo<>(list); return new PageBean(pageInfo.getTotal(), pageInfo.getList()); }PageHelper.startPage(pageNum, pageSize)必须在Mapper查询之前调用,它通过MyBatis拦截器自动给下一条SQL拼接LIMIT,所以这条语句后面不能有任何其他数据库操作,否则分页会被污染成“对另一条查询生效”。PageInfo会把查询出的List包装起来,里面能拿到total总条数、pageNum当前页、pages总页数等信息。
对应的Mapper XML,我建议你重点看SQL是怎么写的:
<select id="findAll" resultType="cn.hm.tlias.pojo.Emp"> select id, username, name, dept_id as deptId, image, create_time createTime from emp where del_flag = 0 order by id desc </select>这里有两个细节值得学。第一,where del_flag = 0是逻辑删除,删除员工不是真的DELETE,而是把del_flag置为1,查询时只取未删除的,这是企业项目里很常见的规范,答辩时能解释清楚很加分。第二,application.yml里开了map-underscore-to-camel-case: true,数据库字段dept_id能自动映射成Java属性deptId,但有些老Mapper没开这个配置,就会查出来全是null。遇到字段对不上的情况,先在XML里用as起个和Java属性一致的别名,这比去改全局配置更快。
4.4 文件上传的存储路径与请求大小限制
tlias里一般还有图片上传功能,它练的是SpringBoot处理multipart请求的能力。常见实现是Controller接收MultipartFile,把文件写到本地磁盘指定目录,再把访问路径存到数据库。这里有两个参数藏在application.yml里,很多人根本没动过:
spring: servlet: multipart: max-file-size: 10MB max-request-size: 20MBmax-file-size限制单个文件大小,max-request-size限制一次请求中所有文件的总大小。SpringBoot默认只允许1MB,课程里如果你传一张手机拍的照片,超过1MB就报“Max upload size exceeded”。把它调到10MB/20MB是练手的基本操作。如果调了还报错,那就要查反向代理层的限制,这个在组件里部署时最常见。
文件上传成功后,tlias通常返回一个类似/upload/xxx.jpg的路径给前端。如果你把上传目录放在后端工程外面,比如D:/tlias/images,还要配置静态资源映射,否则前端拿到路径后无法在<img>标签里显示图片。常见做法是在配置类里继承WebMvcConfigurer,把磁盘目录映射到/upload/**这个URL前缀上。同时注意鉴别器,回显图片路径也要放行,否则就会像4.2说的那样,登录验证过了图片仍然加载不出来。
5. 从下载到答辩的五个大坑:zip损坏、数据库连不上、跨域与拦截器放行
5.1 zip解压后缺文件或提示伪加密:不是你的错,但要用对解压方式
现象:下载的这个tlias压缩包双击打开没问题,解压到一半提示“文件头损坏”,或者解压时要求输入密码,但压缩包来源页明明没给密码。
原因:网盘和聊天工具传输大zip时容易出两种问题,一是文件不完整但扩展名还是zip,解压工具打开才发现内部结构损坏;二是zip伪加密,这类文件在头部标记了加密位,实际数据并未加密,Windows自带解压工具会弹密码框又不接受空密码,看起来就像文件坏了。
解决:先看文件大小,和下载页标注的对比,差太多就直接重新下载。然后换7-Zip或WinRAR这类工具打开,如果7-Zip能正常列出内部文件,伪加密的文件可以用工具直接解压,或者用zip密码移除类的小工具把伪加密标志位清掉。不要反复用Windows自带解压器硬试,浪费时间。压缩包内部文件连目录都列不出来、7-Zip也报错,那文件基本就没救了,换下载渠道吧。
5.2 IDEA运行JavaWeb项目没有启动按钮或启动即退出
现象:导入项目后,IDEA右上角不出现SpringBoot的绿色运行按钮,直接右键主类又提示“没有主类”,或者点击运行后控制台闪一下立刻退出。
原因:这种情况九成是Maven没有把项目正确识别成SpringBoot工程。可能pom.xml被IDEA忽略了,也可能你打开的目录不对,选中了外层文件夹而不是包含pom.xml的那一层。启动即退出的另一种情况是JDK版本不匹配:课程项目编译级别是Java 8,IDEA默认用了17,运行时出现UnsupportedClassVersionError。
解决:先在IDEA右侧Maven面板点击刷新按钮重新导入,或者直接删掉项目目录里的.idea文件夹重新打开。确认Project Structure里Project SDK选到本机的JDK,Language Level选8或11。命令行里执行mvn clean package -DskipTests,能编译通过就说明代码没问题,回归到IDEA环境问题。记住一个规律:Maven面板里如果依赖项是红色,先去看settings.xml的镜像源和JDK路径,这两个地方改对,依赖一般就下来了。
5.3 数据源配置失败:mysql8.0驱动、时区与建库顺序
现象:后端启动日志里报“Failed to configure a DataSource”或“Unknown database 'tlias'”,后面跟着一串Communications link failure。
原因:三个字母拆开核对。一是数据库没建或者SQL没导入;二是application.yml里URL的库名、账号、密码和实际环境不符;三是MySQL 8.0的驱动类名和时区参数没配全,用MySQL 5.x的旧驱动类名连接8.0会直接失败。
解决:先确认MySQL服务起来了,mysql -uroot -p能登录;再执行SHOW DATABASES LIKE 'tlias';确认库存在;最后回头核对配置里的URL是否带了serverTimezone=Asia/Shanghai,驱动类名是否写全。我的习惯是在数据库连接工具里先用同样的账号密码手工连一次,能连上再回来改Java配置,这样能把问题快速定位到“配置写错”还是“环境没起”。注意MySQL 8.0的密码加密规则是caching_sha2_password,老驱动可能不支持,但课程配套的Maven依赖一般已经适配,遇到Public Key Retrieval is not allowed就在URL后面加allowPublicKeyRetrieval=true。
5.4 前端列表请求全部404:跨域与后端地址对不齐
现象:登录页能正常打开,账号密码输进去也能跳转,但员工列表、部门列表全是空白或报404,控制台Network里请求状态码404。
原因:这个翻车点特别迷惑,因为你以为后端挂了,其实后端接口用Postman明明能通。绝大多数时候是前端请求的URL和后端接口的实际路径对不上:后端Controller可能定义了/emps,前端baseURL却配了/api,代理把请求转发到了/api/emps,而后端没有这个路径。
解决:按F12看失败请求的完整URL,然后一条一条拆开对:协议、域名、端口、路径前缀、最终路径。前端源码方式运行时,看Vite或Vue的代理配置,target写的是不是http://localhost:8080;静态dist方式运行时,看request.js里的baseURL是不是空字符串或者没写全。最简单的排查顺序是:先用curl打后端接口确认通,然后浏览器直连后端接口确认通,再开前端页面看Network,三步定位法能解决九成接口对不齐的问题。
5.5 上传文件报“超出最大请求大小”:默认1MB是常见拦路虎
现象:其他功能都正常,只有上传头像时前端提示“请求被拒绝”或“超出最大请求大小”,后端日志里有MaxUploadSizeExceededException。
原因:SpringBoot内置上传限制是1MB,手机照片普遍两三MB,一传就爆。这是故意设计的默认值,防止有人往服务器塞大文件。另外前端提交的是multipart/form-data,如果还走了一层反向代理,代理的client_max_body_size默认也只有1MB,后端调大了前端依然报错。
解决:先把application.yml里的max-file-size调大,我一般调到10MB,max-request-size调到20MB。改完必须重启后端,这个参数是启动时加载的。如果项目部署时外面挂了nginx这类反向代理,同步把client_max_body_size 20m;加在http或server块里。前端页面如果一直报错,先清一次浏览器缓存,因为有些浏览器对失败的POST请求有缓存,影响你判断到底改没改对。
6. 答辩前把tlias从“练习”变成“自己的系统”
项目跑通只是第一步,答辩时判断这套系统是不是你亲手做的,问法一般都绕不开这几个点:接口怎么设计的、鉴权怎么实现的、SQL写在哪、分页原理是什么。先别急着加花哨功能,把下面这张验证表在浏览器和Postman里各过一遍,能过说明你对这套系统已经有掌控感。
| 验证对象 | 请求方式与参数 | 预期行为 |
|---|---|---|
| 登录接口 | POST /login,正确账号密码 | 返回code=1和token |
| 登录接口 | POST /login,错误密码 | 返回code=0或401 |
| 员工列表 | GET /emps,不带Authorization | HTTP 401被拦截 |
| 员工列表 | GET /emps?pageNum=1&pageSize=10,带token | 返回total和rows |
| 文件上传 | POST带一个大于1MB的文件 | 返回文件访问路径 |
| 静态图片访问 | GET /upload/xxx.jpg | 图片能正常显示 |
如果这些用例全部通过,你可以开始做两个“低成本高回报”的改动。第一,给系统加一张业务表。比如它是智能学习辅助系统,那就加一张study_task学习任务表,字段放任务标题、负责人、截止时间、完成状态,照着部门管理的模式把Controller、Service、Mapper、前端列表页各抄一遍。这一套CRUD走完,你就能理直气壮地说“我不是只跑通了原项目,我还能基于原架构做功能扩展”。第二,把员工表的概念往“学习”上靠。很多同学答辩时被问“你的学习辅助体现在哪”,支支吾吾答不上来。其实很简单,把“员工”讲成“学生”,“部门”讲成“班级”,再挂上你新增的学习任务表,整个系统就是一个“学习任务分配与完成情况管理平台”。数据的本质没变,但业务的讲述就顺了。
如果时间宽裕,再把项目里两个容易被追问的实现读一遍:登录成功后前端怎么存token、拦截器怎么从请求头取token。这两个细节每年都是答辩高频问题。我第一次拿这种课程项目去答辩时,卡在跨域上,前端页面明明能开但接口全挂,脸红脖子粗地解释不清,最后发现是前端工程的代理配置没生效。从那以后我养成了一个习惯:先用Postman把后端接口全部点通,再让浏览器和前端页面进场。你按这个顺序走,大概率能避开我当年的尴尬。希望帮到你。
本文还有配套的精品资源,点击获取