news 2026/10/8 16:05:43

Java Web停车场系统:可部署、可答辩的完整实战项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Web停车场系统:可部署、可答辩的完整实战项目

简介:本资源是一套面向Java初学者与课程设计学生的Web停车场管理系统完整开发实践包,聚焦B/S架构下的企业级应用开发全流程。资源涵盖系统源码、数据库脚本、毕业论文文档、部署与功能模块教学视频及多张界面截图,帮助学习者掌握Servlet/JSP或Spring Boot后端开发、MySQL数据库设计、HTML/CSS/JS前端交互及项目工程化交付能力。压缩包共16个文件,含7张系统运行截图(直观展示车位管理、预约支付等核心界面)、3份Word文档(论文、开题报告、任务书)、2段MP4视频(含环境搭建、数据库创建、模块功能演示)、1个ZIP源码包、1个SQL建库脚本、1个PPT答辩稿及1个DB数据库文件,整体大小40.51MB。已有1632人学习下载,内容结构清晰、理论与实操并重,特别适合Java Web课程设计、毕业设计参考及智慧停车类项目快速复现。

1. 这不是又一个“Java Web学生作业”:它真能跑通、真有支付闭环、真带完整论文链路的停车场系统

你搜“Java停车场系统”,十套里九套是空壳——首页能点,登录能输,但一进车位管理就404;数据库建了三张表,连个外键约束都没有;论文里写着“采用Spring Boot微服务架构”,源码里却只有Servlet+JDBC硬编码。这套《基于Web停车场管理系统的设计与实现》不一样:它压缩包里塞进的是可部署、可验证、可答辩的完整交付物——不是Demo,是能挂到局域网里让物业试用一周的真实系统。它用Java EE老派但稳当的技术栈(Servlet/JSP + Spring + MyBatis),不炫技、不堆新框架,专治“写完跑不起来”“论文和代码对不上号”“答辩被问一句就卡壳”的毕业季绝症。适合两类人:一是大三下刚学完JDBC和Servlet、正愁没实战项目练手的学生;二是想快速复现一个有真实业务逻辑(预约冲突检测、IC卡状态机、实时车位释放)+ 完整文档链(开题→任务书→论文→答辩PPT)+ 可视化验证路径(7张截图+2段实操视频)的Java Web入门者。它不教你Lambda表达式怎么写,但它会告诉你:为什么MyBatis的<foreach>必须加separator=",",否则SQL执行直接报错;为什么parking.sql里car_number字段设成VARCHAR(10)而不是CHAR(10),否则车牌模糊查询永远慢半拍。


2. 从解压到首页弹出:四步完成本地可运行环境搭建

2.1 环境清单与版本锚定:别碰JDK 17,用JDK 8u202

这套系统诞生于2021年前后,技术栈明确指向Java EE传统生态。强行用JDK 17+会触发三类致命问题:

  • javax.servlet.*包在JDK 11+中被移除,而源码里大量使用HttpServlet、HttpServletRequest等原生API;
  • Tomcat 9+默认启用jakarta.servlet.*命名空间,但本项目所有web.xml和JSP仍用javax.*;
  • MyBatis 3.4.x(项目所用版本)对JDK 17的var关键字支持不全,编译时Mapper接口泛型推导失败。

提示:下载JDK 8u202(推荐Oracle官方归档版或Adoptium Temurin 8u202-b08),Tomcat 8.5.94(非9.x),MySQL 5.7.32(非8.x)。这三个版本组合是本项目唯一经过视频实测的黄金三角。其他组合请自行承担ClassNotFoundException或SQLSyntaxErrorException风险。

2.2 数据库初始化:parking.sql不是一键导入就完事

解压后找到parking.sql,别急着双击导入。先打开文件,重点检查三处:

-- 1. 字符集必须为utf8mb4,否则中文姓名/车牌存入后变问号 CREATE DATABASE IF NOT EXISTS parking DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 用户表密码字段长度至少32位(MD5加密后长度) ALTER TABLE `user` MODIFY COLUMN `password` VARCHAR(32) NOT NULL; -- 3. 车位状态枚举值必须包含'occupied','vacant','maintenance',缺一不可 INSERT INTO `parking_space` (`id`, `status`, `location`) VALUES (1, 'vacant', 'A区-001'), (2, 'occupied', 'A区-002');

执行步骤:

  1. 在MySQL命令行中创建数据库:CREATE DATABASE parking CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 切换数据库:USE parking;
  3. 手动执行parking.sql中建表语句(跳过CREATE DATABASE行);
  4. 执行INSERT初始化数据——注意ic_card表中card_status字段值必须为'active'或'locked',视频里演示过'frozen'会导致IC卡模块报空指针。

2.3 项目导入Eclipse:别用IDEA自动识别,手动配Web Facet

源码包Parking.zip解压后是标准Eclipse动态Web项目结构:

Parking/ ├── src/ # Java源码(含com.parking.dao, com.parking.service等包) ├── WebContent/ # JSP/HTML/JS/CSS存放目录 │ ├── index.jsp │ ├── admin/ │ └── user/ ├── WEB-INF/ │ ├── web.xml # 关键!Servlet映射和Filter配置在此 │ └── lib/ # 包含mysql-connector-java-5.1.47.jar等12个jar └── build.xml # Ant构建脚本(视频里用Eclipse自带Ant工具执行)

导入步骤:

  1. Eclipse → File → Import → Existing Projects into Workspace;
  2. 选中Parking根目录,取消勾选“Copy projects into workspace”(否则路径错乱);
  3. 右键项目 → Properties → Project Facets → 勾选Dynamic Web Module 3.0(不是4.0!);
  4. Libraries → Add External JARs → 指向WEB-INF/lib/下全部jar(尤其确认spring-core-4.3.25.RELEASE.jar和mybatis-3.4.6.jar存在);
  5. Deployment Assembly → Add → Java Build Path Entries → 选择src文件夹 → Finish。

2.4 启动与验证:首页能进≠功能可用,必须走通一条预约流水

启动Tomcat后访问http://localhost:8080/Parking/,看到首页即代表基础环境OK。但真正验证成功需完成以下闭环:

  1. 用管理员账号admin/123456登录(账号密码硬编码在UserDao.java第42行);
  2. 进入“车位管理” → 点击“添加车位” → 输入A区-003、状态选vacant→ 提交;
  3. 切换用户角色为普通用户(user1/123456),进入“预约服务” → 选择刚添加的A区-003→ 选择日期为明天→ 提交;
  4. 返回管理员后台 → “预约记录”列表中应出现该条记录,状态为pending;
  5. 管理员点击“审核通过” → 状态变为confirmed,且对应车位A区-003在“车位管理”页显示为occupied。

注意:若第4步预约提交后页面跳转空白,检查ReservationServlet.java第89行request.getRequestDispatcher("user/reserve_success.jsp").forward(request, response);路径是否拼写正确——视频里reserve_success.jsp实际放在WebContent/user/下,而非WebContent/根目录。


3. 核心模块拆解:看懂这三块代码,你就掌握了Java Web业务开发的底层逻辑

3.1 车位状态机:ParkingSpaceService.java里的“占用-释放”原子性保障

停车场最核心的业务不是增删改查,而是状态变更的强一致性。比如:用户A预约车位X时,系统必须确保X在那一刻是vacant;用户B同时操作,不能两人抢到同一个车位。本项目用MyBatis的SELECT ... FOR UPDATE实现悲观锁:

// ParkingSpaceService.java 第57行 public boolean occupySpace(String spaceId) { // 1. 查询并锁定该车位记录(事务内) ParkingSpace space = parkingSpaceMapper.selectByIdForUpdate(spaceId); if (space == null || !"vacant".equals(space.getStatus())) { return false; // 已被占用或不存在 } // 2. 更新状态为occupied(同一事务内) space.setStatus("occupied"); return parkingSpaceMapper.updateById(space) > 0; }

关键点:

  • selectByIdForUpdate对应XML中<select>标签的useCache="false"和fetchSize="1",且SQL末尾必须加FOR UPDATE(MyBatis 3.4.6不支持自动追加,需手写);
  • 此方法必须包裹在@Transactional事务中,否则锁在方法结束即释放;
  • 视频里演示过:若去掉FOR UPDATE,并发预约时会出现两个用户同时看到vacant状态,导致超卖。

3.2 IC卡生命周期管理:ICCardService.java如何用状态流转防伪卡

IC卡模块不是简单存取,而是模拟真实卡片的物理状态变化:

  • active:正常可用(新卡激活后状态);
  • locked:连续输错密码3次后锁定(需管理员解锁);
  • expired:有效期过期(系统每日凌晨扫描更新)。

状态变更规则由updateCardStatus()方法强制校验:

// ICCardService.java 第112行 public void updateCardStatus(String cardId, String newStatus) { ICCard card = icCardMapper.selectById(cardId); // 状态迁移合法性检查(有限状态机) if (("active".equals(card.getStatus()) && "locked".equals(newStatus)) || ("locked".equals(card.getStatus()) && "active".equals(newStatus)) || ("active".equals(card.getStatus()) && "expired".equals(newStatus))) { card.setStatus(newStatus); icCardMapper.updateById(card); } else { throw new BusinessException("非法状态迁移:" + card.getStatus() + " → " + newStatus); } }

血泪经验:论文里写的“支持IC卡挂失”功能,在源码中实际是newStatus="locked",但视频里演示挂失操作时,前端调用的是/iccard/lock?cardId=123接口——这个URL映射在web.xml中对应ICCardLockServlet,而该Servlet里漏写了cardId参数校验,导致传空字符串时直接NPE。修复只需在doPost()开头加if (cardId == null || cardId.trim().isEmpty()) throw new IllegalArgumentException();

3.3 支付模块的“伪集成”:PaymentService.java如何用本地模拟替代支付宝SDK

项目标注“集成第三方支付”,实则用本地模拟规避SDK依赖。核心逻辑在processPayment():

// PaymentService.java 第34行 public boolean processPayment(String orderId, BigDecimal amount) { // 1. 验证订单有效性(查reservation表) Reservation reservation = reservationMapper.selectById(orderId); if (reservation == null || !"confirmed".equals(reservation.getStatus())) { return false; } // 2. 模拟支付成功(无真实网络请求) reservation.setStatus("paid"); reservation.setPayTime(new Date()); reservation.setAmount(amount); reservationMapper.updateById(reservation); // 3. 更新车位状态为occupied(幂等操作) ParkingSpace space = parkingSpaceMapper.selectById(reservation.getSpaceId()); if ("vacant".equals(space.getStatus())) { space.setStatus("occupied"); parkingSpaceMapper.updateById(space); } return true; }

为什么这样设计?

  • 毕业设计无需真实支付资质,但必须体现支付流程完整性;
  • processPayment()返回true即视为成功,后续所有报表统计(如income_report.jsp)均以此为依据;
  • 若你真想接入微信支付,只需替换processPayment()方法体:用HttpClient调用微信统一下单API,再用notify_url接收异步回调——但注意,当前web.xml未配置支付回调Servlet,需自行添加。

4. 论文与答辩材料:如何把源码细节转化成答辩PPT里的技术亮点

4.1 论文写作避坑:别写“采用Spring Boot”,要写“基于Spring MVC的分层架构”

摘要描述里提到“Spring框架”,但源码中实际是Spring MVC + MyBatis传统组合(非Spring Boot)。论文中若写“采用Spring Boot自动配置”,答辩时被问“application.yml在哪?”将当场翻车。正确写法:

“系统采用经典的三层架构:表现层使用JSP+Servlet实现MVC模式,控制层ReservationServlet接收HTTP请求并调用业务层;业务层ReservationService封装预约核心逻辑,包括并发控制与状态校验;持久层通过MyBatis的SqlSessionTemplate操作数据库,Mapper接口与XML映射文件分离,便于SQL优化。”

对应PPT第3页“技术选型”表格应如此填写:

层级技术组件选用理由源码位置
表现层JSP + Bootstrap 3.3.7兼容IE8,满足老旧浏览器要求;栅格系统快速布局WebContent/user/reserve.jsp
控制层Servlet 3.0 + web.xml配置显式声明Filter链,便于理解请求生命周期WEB-INF/web.xml第12-28行
业务层Spring 4.3.25 + @Transactional声明式事务管理,避免手动commit/rollbackcom.parking.service.ReservationService.java
持久层MyBatis 3.4.6 + XML映射SQL与Java代码分离,DBA可独立优化语句mapper/ReservationMapper.xml

4.2 开题报告与任务书:把视频里的操作步骤转化为研究计划节点

开题报告中“研究内容”部分常写得空泛。应直接引用视频时间戳作为里程碑:

  • 第1阶段(第1-2周):完成环境搭建与数据库初始化(见视频1.mp4 03:22-08:15);
  • 第2阶段(第3-4周):实现车位状态机与并发预约控制(见视频2.mp4 12:40-18:33,重点分析occupySpace()方法);
  • 第3阶段(第5周):开发IC卡状态流转模块,完成locked→active解锁流程测试(见视频2.mp4 25:10-31:05);
  • 第4阶段(第6周):集成支付模拟模块,生成月度收入报表(见income_report.jsp及ReportService.java)。

任务书中的“预期成果”必须量化:

  • 实现5个核心功能模块(用户管理、车位管理、预约服务、IC卡管理、报表统计);
  • 完成3类测试用例(单用户预约、双用户并发预约、管理员强制释放车位);
  • 输出4份文档(开题报告、论文、答辩PPT、部署手册)。

4.3 答辩PPT制作:用截图讲清“为什么这个系统不是玩具”

答辩PPT切忌堆砌代码。7张截图应按业务流组织,并标注关键验证点:

截图编号场景PPT备注要点防翻车话术
1.png管理员登录页“用户名admin密码123456,硬编码在UserDao.java第42行”“为简化演示,生产环境应对接LDAP或JWT”
3.png车位管理列表页“状态列实时刷新,绿色vacant/红色occupied,CSS类名status-vacant由JSP EL表达式动态绑定”“前端状态渲染与后端数据严格同步,无缓存污染”
5.png预约成功页“URL含?orderId=RES2023001,此ID由ReservationService.generateOrderId()生成,规则为RES+年月日+3位序列号”“订单号全局唯一,支撑后续支付与报表关联”
7.png收入报表页“数据来自SELECT SUM(amount) FROM reservation WHERE status='paid' AND pay_time BETWEEN ? AND ?”“报表SQL经EXPLAIN验证,status字段已建索引,百万级数据响应<200ms”

注意:答辩时若被问“如何保证高并发下预约不超卖”,不要只答“用了数据库锁”。必须指出:SELECT ... FOR UPDATE在InnoDB引擎下是对聚簇索引记录加行锁,而parking_space表主键为id,所以锁的是具体车位记录,不是整张表——这是性能关键。


5. 避坑指南:那些视频里没说、但会让你调试到凌晨三点的五个致命细节

5.1 现象:启动Tomcat后首页404,控制台无报错

原因:web.xml中<welcome-file-list>配置错误。源码里写的是<welcome-file>index.jsp</welcome-file>,但实际index.jsp位于WebContent/根目录,而Eclipse导入时可能因Facet配置错误导致WebContent未被识别为Web Root。
解决:右键项目 → Properties → Deployment Assembly → 点击WebContent→ Edit → 将Deploy Path改为/(不是/WebContent)。

5.2 现象:登录成功后跳转到/Parking/admin/index.jsp,但页面显示“HTTP Status 404”

原因:web.xml中<servlet-mapping>的<url-pattern>与实际JSP路径不匹配。视频里AdminServlet映射为/admin/*,但index.jsp在WebContent/admin/下,而<welcome-file>未配置admin/index.jsp。
解决:在web.xml的<welcome-file-list>中增加<welcome-file>admin/index.jsp</welcome-file>,或修改AdminServlet的doGet()方法,使其request.getRequestDispatcher("/admin/index.jsp").forward(...)显式跳转。

5.3 现象:预约提交后数据库reservation表新增记录,但parking_space表状态未更新

原因:ReservationService.processReservation()方法中,occupySpace()调用后未判断返回值。源码第78行parkingSpaceService.occupySpace(reservation.getSpaceId());缺少if (!result) { throw new BusinessException("车位已被占用"); }。
解决:在occupySpace()调用后添加返回值校验,并在catch块中回滚事务(当前代码无try-catch,异常直接抛出)。

5.4 现象:income_report.jsp中<c:forEach>遍历incomeList为空,但数据库有支付记录

原因:ReportService.getMonthlyIncome()方法中SQL拼接错误。源码第45行"WHERE pay_time >= '" + startDate + "' AND pay_time <= '" + endDate + "'"未对日期格式做yyyy-MM-dd HH:mm:ss标准化,且未使用PreparedStatement防SQL注入。
解决:改用SimpleDateFormat格式化日期,并用?占位符:"WHERE pay_time BETWEEN ? AND ?",在queryForList()前设置参数。

5.5 现象:视频里演示的“IC卡解锁”功能,实际点击按钮无反应

原因:unlock_card.jsp中JavaScript调用unlockCard()函数,但该函数定义在js/common.js里,而common.js未被unlock_card.jsp引入。视频录制时可能临时加了<script src="js/common.js"></script>但未保存到源码。
解决:在unlock_card.jsp的<head>中添加<script src="js/common.js"></script>,或直接将unlockCard()函数内联到该JSP底部。


6. 进阶技巧:用三步把“教学项目”升级为“可演示的轻量级生产系统”

6.1 给管理员加操作审计日志:5分钟补上论文里没写的“安全性设计”

当前系统所有管理操作(增删车位、审核预约、解锁IC卡)均无日志。补上审计日志能让论文“安全性”章节从空谈变成实锤。只需三步:

Step 1:建日志表

CREATE TABLE `admin_audit_log` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `operator` VARCHAR(20) NOT NULL COMMENT '操作人用户名', `operation_type` VARCHAR(30) NOT NULL COMMENT '操作类型:ADD_SPACE, APPROVE_RESERVATION等', `target_id` VARCHAR(50) COMMENT '操作目标ID,如车位ID或预约ID', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Step 2:写通用日志工具类

// com.parking.util.AuditLogger.java public class AuditLogger { private static final SqlSession sqlSession = SqlSessionUtil.getSqlSession(); public static void log(String operator, String operationType, String targetId) { Map<String, Object> params = new HashMap<>(); params.put("operator", operator); params.put("operationType", operationType); params.put("targetId", targetId); sqlSession.insert("AuditLogMapper.insertLog", params); sqlSession.commit(); // 注意:此处需手动commit,因不在Spring事务中 } }

Step 3:在关键Servlet中插入日志

// AdminServlet.java 的doPost()中 if ("addSpace".equals(action)) { // ...原有添加车位逻辑 AuditLogger.log((String) request.getSession().getAttribute("username"), "ADD_SPACE", space.getId()); }

效果:论文中可写“系统实现操作级审计日志,记录管理员所有敏感操作,满足等保2.0基本要求”。答辩时导出admin_audit_log表数据,就是最硬核的证据。

6.2 用jQuery AJAX改造页面跳转:让“预约成功”不再整页刷新

当前所有操作都用response.sendRedirect()整页跳转,体验割裂。用AJAX升级只需改两处:

前端(reserve.jsp)

<!-- 原提交按钮 --> <!-- <input type="submit" value="提交预约"> --> <!-- 替换为 --> <button onclick="submitReservation()">提交预约</button> <script> function submitReservation() { $.post("ReservationServlet", { action: "reserve", spaceId: $("#spaceId").val(), date: $("#date").val() }, function(data) { if (data.success) { alert("预约成功!订单号:" + data.orderId); location.href = "user/reserve_success.jsp?orderId=" + data.orderId; } else { alert("预约失败:" + data.message); } }); } </script>

后端(ReservationServlet.java)

// 原doPost()中处理预约的代码块 // 改为返回JSON(需引入json-lib-2.4.jar) PrintWriter out = response.getWriter(); out.print("{\"success\":true,\"orderId\":\"" + orderId + "\"}"); out.flush();

价值:PPT里可展示“前后端分离演进”,说明“从传统Web向现代化交互体验过渡”,比单纯讲“用了jQuery”更有深度。

6.3 生成数据库ER图:用PowerDesigner反向工程,让论文“数据库设计”章节有图有真相

别再手绘ER图!用PowerDesigner 16.5(免费版足够)反向工程parking.sql:

  1. PowerDesigner → File → Reverse Engineer → Database → 选择MySQL 5.7;
  2. 连接本地MySQL,输入parking库名;
  3. 勾选所有表 → Next → Finish;
  4. 自动生成ER图后,右键 → Layout → Quick Arrange → 自动排版;
  5. 导出为PNG插入论文第4章,标注外键关系(如reservation.space_id → parking_space.id)。

玄学提醒:PowerDesigner反向工程时,若parking_space表的status字段在SQL中定义为ENUM('vacant','occupied','maintenance'),PD会将其识别为VARCHAR而非ENUM。此时需手动在PD中双击该字段 → Properties → Data Type → 改为ENUM并填入值列表——否则论文里写的“采用ENUM类型保证状态完整性”就成空话。

从那以后我每次拿到Java Web源码包,第一件事不是跑起来,而是打开web.xml数<servlet>标签个数,再打开pom.xml(或build.xml)确认Spring版本,最后用Notepad++搜索FOR UPDATE看有没有并发控制。这三步做完,80%的“跑不起来”问题都能提前预判。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 16:04:59

AI Native流式输出实战:SSE协议与AG-UI渲染深度解析

1. 这不是“加个loading动画”那么简单&#xff1a;AI Native流式输出到底在解决什么问题你有没有遇到过这样的场景&#xff1a;用户在对话界面输入一个问题&#xff0c;页面卡住3秒&#xff0c;然后“唰”一下整段回答全弹出来&#xff1f;或者更糟——等了10秒&#xff0c;只…

作者头像 李华
网站建设 2026/10/8 16:04:04

yt9215 车规交换芯片 Linux 驱动开发实战:DSA/switchdev 选型与调试

简介&#xff1a;本资源为基于Linux DSA框架的YT9215 switch驱动源码包&#xff0c;面向嵌入式网络开发与交换机调试人员。驱动加载后会生成lan 网卡用于获取各网口状态&#xff0c;实际数据通信则依赖eth 网卡&#xff0c;并可通过VLAN划分实现每个接口独立管理&#xff0c;…

作者头像 李华
网站建设 2026/10/8 16:00:52

从一堆检验文献到一篇综述:临床检验诊断学同学的 AI 搭子怎么选?

先把场景说具体&#xff1a;如果你是临床检验诊断学专业学生&#xff0c;正在做毕业论文里的文献综述&#xff0c;题目类似——“外周血 ctDNA 甲基化检测在结直肠癌早期筛查与辅助诊断中的价值”——那你大概率会经历这样一段过程&#xff1a; 要在 PubMed、Web of Science、…

作者头像 李华
网站建设 2026/10/8 16:00:50

OPD缩放定律:训练前预测知识蒸馏效果

1. 这不是玄学&#xff0c;是可计算的蒸馏效率预判——OPD scaling law到底在解决什么问题“OPD的scaling law: 训练前预测蒸馏效果”这个标题乍看像论文摘要&#xff0c;但对真正做过模型压缩、知识蒸馏、边缘部署的工程师来说&#xff0c;它直击一个持续数年的痛点&#xff1…

作者头像 李华
网站建设 2026/10/8 16:00:49

Jeepay开源聚合支付系统实战:Java工程师部署与二次开发指南

简介&#xff1a;一套基于Java的开源聚合支付系统Jeepay&#xff0c;面向需要整合微信、支付宝、云闪付等多渠道支付能力的开发者与企业。系统内置支付网关自动路由&#xff0c;已对接微信服务商及普通商户&#xff08;V2/V3&#xff09;、支付宝服务商及普通商户&#xff08;R…

作者头像 李华
网站建设 2026/10/8 15:58:52

AI生成测试用例的工程落地:从提示词设计到自动化执行

前两天和一位做了八年测试的老同事聊天&#xff0c;他提到一个细节&#xff1a;他们部门2026年的校招笔试里&#xff0c;已经直接把“使用AI设计登录模块的测试用例”作为第一题。按他的原话&#xff0c;“现在招人如果还要测试我们自己教AI怎么测&#xff0c;那招聘这关就别过…

作者头像 李华