
引子:一条我删了三遍的简历条目
去年这个时候,我在简历的"技能"栏里写过一行字:Vue 3 / Element Plus(了解)。写完就删了。
原因很实在——我确实跟着教程做过一个后台,也确实能改样式、能接接口,但你让我从零搭一个前端工程、处理路由守卫、想清楚组件通信,我心里是虚的。面试官随便往深里问一句"你这个响应式是怎么实现的"“打包体积怎么优化”,我就得开始编。
"了解"这两个字写在简历上,不是加分项,是靶子。
但另一端的事实是:那些写着"Java 后端工程师"的岗位,JD 里越来越频繁地出现这么一行小字——
熟悉前端技术(Vue/React),有前后端联调经验者优先。
它躺在"加分项"里,却往往是筛简历时真正被折算成钱的那一条。
于是后端们陷入一个很别扭的处境:不学,简历过不了筛;学,投入产出比又低得让人心疼。 一个后端把 Vue 学到"能独立开工"的水位,通常得三到六个月,而这段时间里,Spring 生态、JVM 调优、分布式那些真正决定你天花板的硬骨头,是一点都没动。
这篇文章想聊的就是这个矛盾的新解法。不是"要不要学前端",而是:当交付能力可以被工具补齐之后,"会全栈"这件事的定价逻辑,是不是变了。
下面所有内容,都建立在我自己完整跑过一遍的基础上。截图、数据、坑,都在。
一、金九银十的招聘现实:后端岗的 JD,早就"越界"了
1.1 招聘方要的从来不是"你会前端",而是"你能交付"
先把一个误区拆掉。
面试官写"熟悉前端技术"的时候,他真正想买的,其实不是你的 Vue 水平。他想买的是三件事:
一个人能干完的活,不用配两个人。 这是人力成本,也是沟通成本。
出了问题,能自己定位到底是前端还是后端。 联调阶段最怕的就是两边互相甩锅,一个能同时看得懂 Network 面板和 Controller 断点的人,能省掉大量扯皮。
需求过来的时候,能自己判断"这个交互做不做得到"。 这是设计能力,不是编码能力。
注意,这三条没有一条要求你写出多漂亮的前端代码。
所以真正稀缺的,从来不是"前端很熟的后端",而是"能独立闭环交付一个完整项目的人"。这两个东西在招聘市场上经常被混为一谈,但成本差得很远。
1.2 一个更隐蔽的矛盾:招聘成本与岗位预算的错位
从招聘方的角度算一笔账,会更清楚为什么"全栈优先"这四个字越来越常见。
一个中等复杂度的中后台需求(比如一个内部工单系统、一个权限管理后台),传统模式下的人力配置大致是这样:
| 前端开发 | 前端工程师 1 人 | 约 3 天 |
| 后端开发 | 后端工程师 1 人 | 约 2 天 |
| 前后端联调 | 前端 + 后端 | 约 2 天 |
| 合计 | 至少 2 人 | 约 7 天 |
问题在于,这类需求往往体量很小——预算撑不起两个人的人力成本,但又确实需要两个人。招聘方只能二选一:要么把需求拖到能养得起两个人的规模,要么压低单个人的人力成本去招"什么都会一点"的人。
这就是"全栈"溢价的来源:不是市场觉得全栈更高级,而是市场需要一个能顶两个人的交付单元。
1.3 我从面试和项目里看到的三个信号
结合我自己投递、面试和被问到的经历,以及身边同行的反馈,我总结了三个信号:
信号一:问"你独立交付过什么"的面试官,比问"你熟悉哪些技术"的更多了。
技术栈可以通过背题补,交付经历补不了。一个完整的、能跑起来的、有权限控制和状态流转的项目,比十道八股文更能证明你。
信号二:全栈岗位的薪资带宽,确实比同级别的纯后端岗更宽。
但这个溢价不是"发给你学前端的时间"的补偿,而是"发给你一个人扛下整条链路"的责任定价。溢价买的是结果,不是过程。
信号三:门槛正在从"会写"转移到"会设计"。
当代码的产出速度不再是瓶颈,瓶颈就自动上移到了它前面那一步——你有没有能力把需求想清楚、把边界划清楚、把状态和权限定义清楚。
这三点看起来很虚,但它们恰恰是这轮变化里最值钱的部分。后面两章我会用一个真实项目把它们讲透。
二、实测:把"全栈岗"的活,交给一个人加一套工具
这一章是全文的骨架。我以一个真实中后台需求(TicketDesk 企业工单与处理看板系统)为对象,完整走了一遍从需求到运行的流程,每一步都留了截图。
2.1 先把测试条件说清楚
数据要能站住脚,前提是把条件写明白。这次实测的环境和复杂度如下:
| 硬件环境 | macOS 笔记本,Apple Silicon |
| IDE | IntelliJ IDEA(安装飞算 JavaAI 插件,专家模型) |
| 后端 | Spring Boot 3.2.5 + JDK 17 |
| 持久层 | Spring Data JPA + MySQL 8.0 |
| 前端 | Vue 3 + Element Plus(CDN 方式,无需构建) |
| 构建工具 | Maven |
| 需求复杂度 | 2 种角色、4 个页面、4 张数据表、11 个接口、14 个需求关键点 |
| 交付形式 | 本地可运行(mvn spring-boot:run 后访问 http://localhost:8080/) |
| 测试性质 | 单人单次实测,非严格实验室对比环境 |
最后一行很重要。单人单次意味着它不具备统计意义,我会在第三章明确说明哪些数字有参考价值、哪些只能当个例看。
2.2 第一步:需求输入——一段中文,代替一份 PRD
这是我全程感触最深的一步。
传统流程里,后端拿到的是一个模糊的口头需求,或者一份没画完的设计稿。你得先跟产品扯三轮,才敢动手。这次我做的事情很简单:把需求直接写清楚,写到我愿意拿它去跟产品对线为止。

我写的那段提示词,结构是这样的:
请为我开发一个用于 Java 求职作品展示的全栈项目:TicketDesk 企业工单与处理看板系统。
一、角色
1. 提交人:创建工单、查看自己的工单、补充评论、关闭已解决的工单。
2. 处理人:查看全部工单、领取待处理工单、处理自己领取的工单。
提供两个提交人账号和一个处理人账号用于本地演示。身份由后端登录态识别,权限必须在后端校验。
二、页面范围
1. 登录页。
2. 工单列表:支持关键词、状态、优先级筛选和分页。
3. 工单详情:展示描述、处理人、评论、操作记录和当前可执行操作;创建工单使用弹窗。
4. 处理看板:按待处理、处理中、已解决、已关闭分列展示。
三、业务规则
1. 工单包含标题、描述、分类、优先级、提交人和创建时间。
2. 状态按 待处理→处理中→已解决→已关闭 流转。
3. 领取后进入处理中;只有领取人可以提交解决说明。
4. 已解决工单只能由原提交人关闭。
5. 非法状态变更返回明确错误,前端同步提示。
6. 状态变更保存操作人、时间、前后状态和备注。
7. 提交人不得查看其他提交人的工单,直接访问接口也应被拒绝。
四、交付与验收
提供完整代码、演示账号初始化方式、覆盖各状态的模拟数据和启动文档。
验证"提交→领取→解决→关闭"的完整流程。
页面包含加载、空列表、失败和防重复提交状态。
不要使用前端固定数组代替真实接口,也不要声称未执行的测试已经通过。
注意最后两行。“不要使用前端固定数组代替真实接口”“不要声称未执行的测试已经通过”——这两句是这次需求能验收成功的关键。它们把"演示级"和"可交付级"的区别前置到了需求阶段,避免了后面拿一个纯静态的假页面自我感动。
这一步我花了大约 20 分钟。 看起来是"输入需求",实际上是做领域建模。状态机怎么流转、权限边界在哪里、谁能操作谁不能——这些想不清楚,后面生成什么都是白搭。
2.3 第二步:需求被拆成 14 个关键点
需求提交后,工具没有直接开始写代码,而是先把它拆解成了 14 个可逐条勾选的关键点。

这一步的价值被很多人低估了。它相当于强制你做一次需求评审,只不过评审对象变成了自己写的那段话。
拆出来的 14 条里,有几条是我原本没写得那么明确的,比如:
-
提交人只能查询自己的工单,处理人返回全部工单(数据隔离的落点)
-
工单详情要返回"当前用户可执行的操作列表"
-
每次状态变更自动保存操作人、操作时间、变更前状态、变更后状态和备注
-
所有写操作均具备防重复提交机制
"当前用户可执行的操作列表"这条尤其关键。它意味着不是前端硬编码"什么状态显示什么按钮",而是后端根据当前登录人和工单状态算出来返回给前端。这是权限校验必须放在后端这条规则的具体落地方式,也是面试时能讲出深度的一个点。
这一步大概花了 10 分钟,主要时间用在逐条确认和删掉一条我觉得多余的。
2.4 第三步:4 组接口方案,接口先对齐再写代码
接下来是接口设计,生成了 4 组接口方案。

4 组分别是:
| 认证与初始化服务 | 账号密码校验、登录态凭证、演示账号与模拟数据初始化 |
| 工单查询服务 | 创建工单、列表查询(关键词/状态/优先级筛选)、详情查询、处理看板分组查询 |
| 工单流转处理服务 | 领取、解决、关闭,含状态流转规则校验与操作记录 |
| 工单评论服务 | 评论添加与查询 |
最终落地的接口一共 11 个:
POST /api/auth/login 登录,返回 JWT Token
POST /api/auth/logout 登出
GET /api/auth/current 获取当前登录用户信息
POST /api/work-orders 创建工单(仅提交人)
GET /api/work-orders 工单列表(关键词 / 状态 / 优先级 + 分页)
GET /api/work-orders/{id} 工单详情(含评论、操作记录、可执行操作)
GET /api/work-orders/board 处理看板(按状态分组)
POST /api/work-orders/{id}/claim 领取工单(仅处理人)
POST /api/work-orders/{id}/resolve 解决工单(仅领取人)
POST /api/work-orders/{id}/close 关闭工单(仅原提交人)
POST /api/work-orders/{id}/comments 添加评论
这里有件事值得单独说:接口是在生成代码之前定下来的。
传统开发里,接口文档经常是"边写边改",前端拿到的是半成品,联调时字段对不上、命名不一致、返回结构不统一,这些都是联调阶段最常见的返工来源。
而这次流程里,接口是先于代码存在的。这意味着后端 Controller 和前端 api.js 从一开始就引用同一份约定——这不是"联调做得快",而是"联调这个环节被提前消化掉了"。
这一步大约 10 分钟。
2.5 第四步:4 张表、11 个接口定下来
接口之后是数据库表设计,共 4 张表。

4 张表分别是 t_user(用户信息表)、t_work_order(工单信息表)、t_work_order_comment(工单评论表)、t_work_order_operation_log(工单操作记录表)。
其中核心的工单表结构是这样:
CREATE TABLE IF NOT EXISTS `t_work_order` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`title` varchar(255) NOT NULL COMMENT '工单标题',
`description` text COMMENT '工单描述',
`category` varchar(64) COMMENT '工单分类',
`priority` varchar(32) NOT NULL COMMENT '优先级',
`status` varchar(32) NOT NULL DEFAULT 'PENDING'
COMMENT '状态(PENDING:待处理,PROCESSING:处理中,RESOLVED:已解决,CLOSED:已关闭)',
`submitter_id` bigint(20) unsigned NOT NULL COMMENT '提交人ID',
`processor_id` bigint(20) unsigned DEFAULT NULL COMMENT '处理人ID',
`resolution_note` text COMMENT '解决说明',
`create_by` varchar(64) COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) COMMENT '修改人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工单信息表';
有两个设计细节我认为值得点赞,也有一个我想吐槽的(留到第四章)。
值得点赞的:
-
t_work_order_operation_log 这张日志表。它记录 before_status、after_status、operator_id、remark。这意味着每一次状态变更都是可追溯的,而不是只保留一个最终状态。很多人做练手项目会忽略这张表,但它在真实业务里几乎是标配——因为"这个工单是谁改的状态"是运维和审计的刚需。
-
统一的审计字段(create_by / create_time / update_by / update_time)出现在每一张表上,命名一致。这种一致性在人工写代码时反而是最容易漏的。
这一步约 15 分钟,我主要是在核对 priority 和 status 用字符串枚举还是数字枚举——最后选了字符串,可读性优先,代价是索引效率略差。这个取舍在演示项目里是划算的。
2.6 第五步:代码生成计划
表结构确认之后,出现的是一个分阶段的代码生成计划。

计划被拆成了 7 个 Phase,从项目骨架、配置类、枚举与统一响应体,一直到前端页面和验收文档,每一条任务都可以单独撤回或调整。
这一步我基本没动,大约 5 分钟扫了一遍,确认没有多余的依赖(比如没有给我塞 Redis、没有塞消息队列)。
这里有个判断标准可以分享:生成计划里如果出现了你的需求里没提过的中间件,一定要删掉。 练手项目里塞越多组件,面试时被问穿的概率越高。
2.7 第六步:55 个文件落地
生成完成后,右侧工作区列出了完整的交付清单。

最终产出:
| 项目文档 | README.md(环境要求、数据库初始化、启动方式、演示账号、验收对照表) |
| 设计文档 | DESIGN.md(页面布局、角色权限矩阵、状态流转图、表结构、接口字段定义) |
| 项目配置 | pom.xml、application.yml |
| 后端代码 | src/main/java/com/ticketdesk/ 下完整分层:common / controller / dto / entity / repository / service |
| 前端代码 | src/main/resources/static/ 下的 index.html + js/(api.js / store.js / app.js / pages/ 四个页面) |
| 数据库脚本 | src/main/resources/sql/init.sql |
我统计了一下实际代码规模:
| Java 后端 | 41 个 | 约 3,113 行 |
| 前端 JS / HTML | 8 个 | 约 1,189 行 |
| 合计 | 55 个文件 | 约 4,300 行 |
其中几个核心文件的体量:WorkOrderServiceImpl.java 579 行(状态机与权限校验的集中地)、WorkOrderController.java 140 行、JwtUtils.java 124 行;前端 detail.js 325 行、list.js 311 行、board.js 127 行。
生成过程大约 25 分钟,这个时间里我可以去干别的,这一点确实是人力做不到的。
2.8 第七步:四个页面跑通,闭环验收
代码生成完,接下来是最见真章的环节:它到底能不能跑。
启动过程有一步需要自己动手——建库、执行 init.sql、改 application.yml 里的数据库账号密码。这一步 AI 替不了你,因为你的 MySQL 密码只有你自己知道。
然后 mvn spring-boot:run,浏览器访问 http://localhost:8080/。

这是登录页的实际效果。左侧是产品化的说明文案,右侧是登录表单,下方还贴心地把三个演示账号做成了可点击填充的卡片,并标注了角色(提交人 / 处理人)。
进入系统之后是工单列表页:

这一页的信息量很大,我逐条核对了一遍:
-
筛选区:关键词、状态、优先级三个条件,加查询和重置按钮 ✅
-
列表字段:工单编号、标题、分类、优先级、提交人、处理人、状态、创建时间、操作 ✅
-
状态标签的颜色区分:待处理(橙)、处理中(蓝)、已解决(绿)、已关闭(灰)✅
-
优先级区分:普通(灰)、高(橙)、紧急(红)✅
-
分页控件:显示 1-4,共 4 条 ✅
-
空处理人显示为"未领取",而不是显示空白或 null ✅
最后这一条是个小细节,但很能说明问题:它没有把"未领取"这种业务语义直接暴露成技术上的 null。 这种细节通常只有真正想过业务的人才会在意。
而权限隔离和状态流转,我是直接拿接口验的,验收结果如下:
| 完整流程 | 提交 → 领取 → 解决 → 关闭 | 状态依次流转,操作记录完整 |
| 列表隔离 | 提交人 A 创建工单后,提交人 B 查列表 | 列表中不显示该工单 |
| 详情隔离 | 提交人 B 直接访问 A 的工单详情接口 | 返回 403,无权访问 |
| 跳过领取直接解决 | 对"待处理"工单调用解决接口 | 返回"待处理工单不能直接解决" |
| 非领取人解决 | 其他处理人尝试解决已领取工单 | 返回"只有工单领取人才能提交解决说明" |
| 非提交人关闭 | 非原提交人尝试关闭工单 | 返回"只有工单提交人才能关闭工单" |
| 数据持久化 | 刷新页面后重新查看 | 状态、评论、操作记录均正确保留 |
验收加上环境准备,大约 60 分钟。
到这里,"后端不学前端、不联调,一人交付完整前后端项目"这句话,在我这里是跑通了的。
三、把时间摊开算:省掉的不是"写前端",是"返工"
第二章是过程,这一章算账。
3.1 传统 7 天是怎么花完的
官方给的口径是:中等复杂度 CRUD 页面,传统模式 约 7 天(前端 3 天 + 后端 2 天 + 联调 2 天),工具模式 约 1 天。
我一开始对这个"1 天"是持怀疑态度的。但把环节拆开之后,我发现真正值得讨论的不是"1 天能不能做到",而是那 7 天里,究竟有多少是花在真正的开发上。
| 前端开发 | 3 天 | 搭工程、写组件、调样式、处理路由与状态 |
| 后端开发 | 2 天 | 建模、写接口、写业务逻辑、写校验 |
| 前后端联调 | 2 天 | 字段对不上、参数名不一致、返回结构不统一、状态码约定不同 |
我的判断是:联调那 2 天,是纯粹的摩擦损耗。
它不产生任何业务价值,它的存在只是因为前后端各自拿着一张"可能对不上的约定"在干活。而这 2 天,恰恰是这套流程最先消掉的部分——因为接口在代码生成之前就已经定好了,前端调用和后端实现引用的是同一份定义。
3.2 这一次实测的账
我把自己的耗时如实记了下来:
| 写需求描述 | 约 20 分钟 | 含业务建模与状态机梳理 |
| 需求关键点确认 | 约 10 分钟 | 逐条核对 14 个关键点 |
| 接口方案确认 | 约 10 分钟 | 4 组接口方案 |
| 表结构确认 | 约 15 分钟 | 4 张表,核对字段与枚举类型 |
| 代码生成计划 | 约 5 分钟 | 扫一遍,删掉多余依赖 |
| 生成源码 | 约 25 分钟 | 期间可以离开 |
| 环境准备 + 跑通 + 验收 | 约 60 分钟 | 建库、改配置、逐项验收 |
| 合计 | 约 2 小时 25 分钟 | 单人单次,不含调试意外 |
这个数字比官方口径的"约 1 天"要好看。
但我必须把话说明白,否则这个数字就是在误导人:
我熟悉中后台场景。 工单系统、权限隔离、状态流转这套业务模型,对我来说是零成本的。如果你面对的是一个陌生领域(比如医疗、金融风控),需求建模那一步可能要花上几天。
我把需求写得很细。 那段提示词大约 800 字,是我自己思考的产物。AI 没有替我想清楚业务,它只是把我已经想清楚的东西执行了。 前置思考的时间成本,被我在表里计入了 20 分钟——如果算上我平时积累的领域经验,这个成本远不止 20 分钟。
这是单次记录,不是对照实验。 它不能证明"所有人用这套方式都能 2.5 小时交付"。
所以更诚实的结论是:工具把"执行"这一段压缩了将近一个数量级,但它没有压缩"想清楚"这一段。 而"想清楚"恰恰是决定项目质量上限的那一段。
3.3 联调归零,到底值多少钱
如果把这件事换算成钱,逻辑会更清楚。
假设一个前端 + 后端的组合,按人均日成本 800 元算,7 天是 11,200 元。其中联调占 2 天,也就是 3,200 元。
这 3,200 元买到的,是"两个人把各自的约定对齐"这个动作。而现在这个动作被前置到了设计阶段,成本接近于零。
这才是"全栈功能"真正的经济意义所在:它不是让你免费获得一个前端,而是让你免于支付协调成本。
从求职者的角度看,这句话可以翻译成更实在的一句话:
如果你能独立交付一个完整项目,你在雇主眼里的价值,锚定的不是"一个后端"的价格,而是"省下一整个前端岗位协调成本"的价格。
这就是"会全栈的后端"在市场上溢价的真正来源。
3.4 质量账:那 10% 去哪了
官方口径里还有一句:常规页面一次生成完成度约 90%,部分页面可直接使用。
这 90% 是很硬的数字,但那 10% 才是决定你能不能把它写进简历的关键。我这次的实际情况是:
-
页面骨架、表单、表格、筛选、分页、状态标签:一次成型,可以直接用
-
复杂交互(比如详情页里"按权限动态显示可执行操作按钮"):逻辑是对的,但视觉细节我改了
-
响应式与细节间距:需要人工过一遍
那 10% 是什么?是"能跑"和"敢拿去面试"之间的距离。
这也引出下一章——如果打算用这种方式做一个求职作品,你必须知道它的边界在哪里。
四、冷静视角:这套方式的溢价空间与天花板
按约稿要求,这一章写"优点 + 不足 + 建议"。我会尽量说得直白。
4.1 真实评价·优点
第一,交付物的完整度确实超出我对"AI 生成代码"的预期。
它给的不只是代码。README.md 里写了环境要求、数据库初始化方式、启动命令、演示账号,以及一份逐项的验收对照表;DESIGN.md 里给了页面布局草图、角色权限矩阵、状态流转图、表结构和接口字段定义。
也就是说,它交付的是一个"项目",而不是一堆文件。这一点对求职场景尤其重要:面试官想看的是你有没有工程意识,而文档本身就是工程意识最直观的证据。
第二,业务规则不是"提示词级别"的实现,而是落到代码里的实现。
我原本担心"权限必须后端校验"这种要求会被敷衍成前端隐藏按钮。实际结果是后端 /api/work-orders/{id} 对非本人的访问真的返回 403,非法状态流转真的返回了具体的错误文案(比如"待处理工单不能直接解决,请先领取")。这是能拿到面试桌上讲的东西。
第三,设计与实现的一致性,让"讲清楚为什么这么设计"变成了可能。
因为 DESIGN.md 里的状态流转图、权限矩阵是和代码一起生成的,你在面试时讲出的设计理由,和代码里实际的行为是能对上的。这比背设计模式强得多。
4.2 真实评价·不足
有 5 条,我按严重程度排:
不足一:文档和实现之间会出现"小漂移",必须自己核对一遍。
这是最实际的问题。我看到的项目文档里,演示账号写的是 submitter1 / submitter2 / processor1,密码 123456;但实际跑起来的登录页,显示的却是"张三 / 李四 / 王工",密码 Demo123。
功能没问题,两者都能登录,但如果你直接把文档交出去,别人照着文档是登不进去的。
这类漂移在生成式流程里几乎是必然的——文档、SQL 脚本、初始化代码是分别生成的三份东西,任何一份改动都可能导致它们不再对齐。
结论:把"文档与实现一致性核对"当成交付前的必做项。 至少要把 README 里的每一行命令、每一个账号,实际跑一遍。
不足二:前端用的是 CDN 方式引入 Element Plus,这是演示级的方案,不是生产级的方案。
代码里前端是 index.html 直接引 CDN 的 Vue 3 和 Element Plus,连构建步骤都省了。好处是极低的上手门槛——mvn spring-boot:run 之后就能看到页面,不需要 npm、不需要 Vite、不需要 node_modules。
但代价也很明确:
-
依赖外网 CDN,内网或断网环境下页面直接白屏
-
无法做按需加载,首屏体积偏大
-
没有版本锁定,CDN 上的版本更新可能直接让你的页面崩掉
-
没有工程化构建,意味着没有 ESLint、没有 TS、没有模块拆分——如果面试官问"你这个前端工程是怎么组织的",index.html + 一堆全局 js 文件这个答案,是不够看的
这一条必须清楚:它让你"能交付",但不等于让你"能讲工程化"。 如果你投的是明确要求前端能力的岗位,这块要自己补上。
不足三:“不学前端"不等于"可以不懂前端”。
这是我最想强调的一条认知风险。
生成的代码里,前端逻辑分布在 api.js(请求封装)、store.js(状态管理)、pages/*.js(四个页面)里。它确实能跑,也确实能改。但一旦出现问题——比如某个按钮点了没反应、某个字段显示成了 undefined、样式在某个分辨率下错位——排查的责任还是在你身上。
而排查前端问题的能力,恰恰是"不学前端"最缺的那部分。你不需要会写,但你需要会看:会看 Network 面板、会看 Console 报错、会看组件传参。这部分能力,工具替不了你。
不足四:默认配置是"演示友好",不是"生产安全"。
我在代码里看到几处明显不适合上生产的地方:
-
application.yml 里数据库账号密码是明文的 root / root
-
JWT 的签名密钥硬编码在配置里
-
演示账号是启动时自动初始化的(DataInitializer),生产环境应该关掉
-
密码用了 BCrypt 加密(这点做得对),但演示账号密码统一是 123456 或 Demo123,弱得离谱
如果这东西要真上生产,安全配置必须自己重新过一遍。 别指望生成的默认值。
不足五:它对"需求描述的清晰度"极其敏感,你含糊它就散。
我这次之所以顺利,很大程度上是因为需求写得足够细。如果我当时只写一句"做一个工单系统",大概率会得到一个"能增删改查但没有任何业务规则"的 CRUD 模板。
这不是工具的缺点,是它的特性。但它意味着:你省下的编码时间,会以"需求思考时间"的形式还回来。 想偷懒跳过思考直接生成,结果一定是拿到一个自己都讲不清的东西。
4.3 真实评价·建议
建议一:把它当"前端代写 + 联调替代",别当"业务代想"。
正确的分工是:你负责想清楚(领域模型、状态机、权限边界、异常路径),它负责写出来。
一旦你把"想清楚"这一步也交出去,你交出来的作品就是没有灵魂的,面试一深挖就散。
建议二:用它做一个"你能讲两个小时"的项目,而不是十个"能跑"的项目。
一个讲得透的项目,胜过一个仓库里躺着的十个 demo。判断标准很简单:你能不能不看代码,把状态流转、权限校验、异常处理讲清楚,并且说得出"为什么这么设计"。
建议三:把生成后的代码当"别人写的代码"来 review。
这是我这次收获最大的一步。因为不是自己写的,我反而更认真地看了一遍 WorkOrderServiceImpl.java(579 行)——状态校验的顺序、权限判断的位置、事务的边界。看别人(或 AI)的代码,比自己写一遍更能提升。
而这件事本身,就是面试里非常值钱的一段经历。
4.4 面试官会追问你的四个问题
如果你打算把这个项目写进简历,请先准备好这四个问题的答案:
Q1:你这个权限校验为什么放在后端?前端隐藏按钮不行吗?
参考方向:前端隐藏按钮只是交互优化,不是安全边界。用户可以直接调接口。所以必须在后端对每个请求重新做身份与归属校验——这也是为什么详情接口要返回 availableActions,而不是让前端自己判断。
Q2:状态流转是怎么保证不出错的?
参考方向:不是靠前端控制,而是在 Service 层做状态机校验:先查当前状态,再判断目标状态是否合法、操作人是否符合身份,不合法直接抛业务异常并返回明确文案。同时写一条操作日志,保证可追溯。
Q3:重复提交你是怎么处理的?
参考方向:前端做了按钮 loading 和禁用,但那只防"手抖"。后端有独立的防重复提交工具类(IdempotentUtils),避免绕过前端重复调用。
Q4:这个前端工程是怎么组织的?为什么用 CDN?
这题是陷阱。 老实回答:CDN 是为了降低本地运行门槛,让演示者不需要 npm 就能跑起来;如果要做生产级交付,会改成 Vite + npm 的工程化构建,做按需加载和版本锁定。
承认取舍,比假装完美更能加分。
五、这个金九银十,你可以怎么用
5.1 三条行动清单
第一,别急着学框架,先去做一个能讲透的项目。
如果你的目标是"拿到全栈岗的面试机会",那三个月速成的 Vue 未必能帮到你,但一个完整交付的项目能。先用两周做一个真实的小系统,把状态机、权限、异常路径想清楚。等你真正卡在"前端写不出来"的时候,再去补前端,你的学习会有的放矢得多。
第二,把"交付过程"留下来,它比代码更值钱。
这东西没法造假——整个流程的操作截图、每一步的耗时、你改过什么、你发现了什么不足。这些痕迹堆在一起,才构成一个可信的"我能独立交付"的证据链。
面试的时候别只给一个 GitHub 链接,把你当时怎么想的、踩了什么坑、最后怎么改的讲出来。这一段的杀伤力,比"我熟悉 Spring Boot"大得多。
第三,保持怀疑,包括对我这篇文章。
我在第三章把"2 小时 25 分钟"这个数字连同它的三个前提条件一起摆出来了,第四章也写了 5 条不足。这不是谦虚,这是"允许批评"这个要求本身该有的样子。
任何工具都有它的适用边界。判断一个工具值不值得用,标准从来不是"它有多强",而是"它的短板,是不是你恰好不需要的那块"。
5.2 结论
回到最开始那个问题:金九银十,"会全栈"的 Java 工程师更值钱吗?
我的答案是:值钱的不是"会全栈"这三个字,而是"能独立闭环交付"这个能力。
而这两者之间,差的是整个执行环节的成本。以前这个成本必须由你自己(花半年学前端)或者雇主(配两个人)来承担。现在多了一个第三种选择。
这不会让"学前端"这件事变得没有意义——真正懂前端的人,依然比只会用工具的人更能解决深水区的问题。 但它确实改变了定价:你的技术广度决定你能走多远,而你的交付能力,决定你今天能拿到多少。
如果非要用一句话总结我这次实测最真实的感受,大概是——
工具能替你写代码,但替不了你对业务的判断。所以它最先淘汰的,不是不会写前端的人,是不知道自己要做什么的人。
金九银十,祝各位都能拿到心仪的 offer。





