一、这次我不想只看它会不会生成接口
用 AI 生成用户表、Controller 和几组增删改查,已经很难判断模型是不是真的“读懂”了业务。真实 Java 项目的难点往往藏在规则之间:同一个申请在不同状态下谁能操作,普通风险和高风险从哪里分流,负责人能不能审批自己提交的内容,发布失败后是直接结束还是必须进入回滚,以及两个重复请求同时到达时会不会产生两次有效审批。
飞算 JavaAI 此次升级加入了智能路由与专家模型。智能路由会根据任务复杂度匹配模型,专家模型则更偏向复杂系统设计和业务逻辑拆解。相比“能不能写出一段代码”,我更关心的是:当一份需求里同时出现权限链路、风险计算、状态机、事务和并发防护时,它能否先建立一张正确的业务地图,再把地图落实到接口、数据表和代码计划中。
因此,我设计了一个软件发布场景:发布哨兵 ReleaseGuard——软件发布风险分级审批与回滚登记系统。
这个项目刻意控制了规模:它不是微服务平台,不接 Jenkins、GitLab 或 Kubernetes,也不引入 Redis、消息队列和工作流引擎。发布动作只做业务登记。这样可以把注意力集中到真正想验证的部分——模型有没有理解风险分流、团队权限、状态转换和失败路径,而不是被外部基础设施分散。

图 1:在飞算 JavaAI 中输入 ReleaseGuard 的项目定位、技术栈与业务约束
二、测试环境与需求基线
本次记录的测试环境如下:
| 项目 | 测试条件 |
| 操作系统 | macOS 26.6.1,Apple Silicon |
| 开发环境 | IntelliJ IDEA 2024.1 |
| 飞算 JavaAI | 插件 3.9.8 |
| 使用模式 | Java Web 工程(新版)+ 智能路由 |
| 项目编译目标 | Java 17 |
| 本地验证运行时 | JDK 26.0.1、Maven 3.9.16 |
| 前端环境 | Node.js 24.16.0、npm 11.13.0 |
| 后端技术栈 | Spring Boot 3.5.16、Spring Security、JWT、MyBatis-Plus、H2/MySQL、JUnit 5 |
| 前端技术栈 | Vue 3、Vite、Pinia、Vue Router、Axios、Element Plus |
项目包含四类角色:开发人员 DEVELOPER、技术负责人 LEAD、运维人员 OPS 和管理员 ADMIN。为测试团队隔离,又准备了两个研发团队和六个演示账号。
风险分数必须由后端计算:
-
包含数据库变更:+2;
-
预计停机时间大于 0:+2;
-
包含配置变更:+1;
-
紧急发布:+2;
-
总分小于 3 为普通风险;
-
总分大于或等于 3 为高风险。
这里专门设置了 2/3 分边界。2 分申请经技术负责人通过后直接进入待发布,3 分申请则必须再经过运维审批。风险等级不能由前端直接指定,否则修改请求参数就能绕过审批路线。
核心状态机如下:
DRAFT
→ PENDING_LEAD
├─ 驳回 → REJECTED
├─ 普通风险 → READY_TO_RELEASE
└─ 高风险 → PENDING_OPS
├─ 驳回 → REJECTED
└─ 通过 → READY_TO_RELEASE
├─ 发布成功 → RELEASED
└─ 发布失败 → PENDING_ROLLBACK
→ ROLLED_BACK
我还把验收场景直接写进提示词:跨团队审批返回 403,非法状态跳转返回 409,负责人禁止自审,重复或并发审批只能成功一次,发布失败后只能由运维登记回滚。这样做的好处是,模型不能只把功能“画出来”,还要给出可以判断对错的实现边界。

图 2:提示词明确写入 2/3 分边界、越权、重复操作和回滚验收场景
三、第一关:长需求能不能拆成可检查的规则
输入完整需求后,飞算 JavaAI 没有直接开始堆源码,而是进入“理解需求—设计接口—表结构设计—代码生成计划—生成源码”的分阶段流程。
在理解需求阶段,系统把需求拆成了 47 个关键点。从截图中可以看到,拆解已经触及几个真正影响正确性的部分:
-
详情查询要结合当前角色执行数据范围校验;
-
所有提交、审批、驳回、发布和回滚操作必须生成记录;
-
状态更新和操作记录新增必须位于同一数据库事务;
-
重复审批、重复发布和重复回滚需要并发保护;
-
400、401、403、404、409 要有明确边界;
-
日志和错误响应不能暴露 JWT 密钥、密码或数据库连接信息。

图 3:需求被拆成 47 个可编辑、可调整的关键点
这一阶段最有价值的不是“47”这个数字本身,而是隐藏规则被显性化了。复杂业务经常不是漏掉一个页面,而是漏掉一个否定条件。例如“负责人可以审批本团队申请”和“负责人不能审批自己提交的申请”必须同时成立;只实现前一句,系统就留下了自审漏洞。
不过,关键点数量多也不等于理解一定正确。我的做法是重点复核四组内容:角色与数据范围、风险分数边界、合法状态迁移、失败与重复请求。其余 UI 文案和普通字段校验可以后置检查。
四、第二关:接口设计有没有围绕业务动作展开
需求确认后,飞算 JavaAI 生成了 11 个接口方案。从界面上看,方案覆盖了认证、当前用户、申请管理、负责人审批、运维处理、管理员查询、操作记录和质量验证,而不是把所有动作塞进一个通用的“更新状态”接口。

图 4:基于需求生成 11 个接口方案,并明确权限、并发与错误映射要求
这点很重要。对于状态机业务,我不希望前端提交一个任意 status,然后后端直接保存。更合理的做法是把行为表达成命令式接口,例如:
POST /api/releases/{id}/submit
POST /api/lead/releases/{id}/approve
POST /api/ops/releases/{id}/execute
POST /api/ops/releases/{id}/rollback
每个接口只接受当前动作所需参数,具体能否执行由 Service 根据身份、数据范围和当前状态决定。参数错误返回 400,未登录返回 401,越权返回 403,资源不存在返回 404,状态冲突和重复操作返回 409。这样的接口边界比“万能更新接口”更接近正常 Java 工程实践。
五、第三关:表结构有没有服务于状态机和审计
表结构阶段,系统设计了 4 张核心表:团队、用户、发布申请和操作记录。数量不多,但已经足够承载本次测试范围。

图 5:数据建模阶段生成 4 张表,操作记录保存原状态、新状态、角色、动作和时间
我重点查看的是操作记录表。一次状态变化至少需要保留申请标识、操作人、操作角色、原状态、新状态、操作类型、意见和操作时间。这样,页面上的时间线不是前端临时拼出来的,而是后端每次合法迁移留下的审计结果。
另一条关键约束是:状态更新与操作记录插入必须在同一事务中完成。 如果状态已经变成“已发布”,操作记录却因为异常没有写入,这条链路就失去可追溯性。反过来,如果记录写入但状态没变,也会产生错误审计。因此事务边界必须包住二者。
六、第四关:代码计划是不是按依赖关系推进
在生成源码之前,飞算 JavaAI 给出了 12 个阶段的代码生成计划:从多模块骨架、数据持久化、统一响应、JWT 认证开始,再进入风险计算、状态机、负责人审批、运维发布与回滚,最后完成前端页面、端到端验收和启动文档。

图 6:代码计划按照基础设施 → 核心规则 → 角色接口 → 前端 → 验收的顺序展开
这比一次性生成几十个文件更容易审阅。风险策略依赖领域枚举,审批接口依赖认证上下文和状态机,前端又依赖后端接口稳定。如果顺序反过来,很容易出现页面先写完、后端字段反复变化的问题。
七、关键代码:风险分流不能相信前端
最终工程把风险计算集中在独立策略类中。核心逻辑可以压缩为下面这段:
public RiskResult calculate(
Boolean databaseChange,
Boolean configurationChange,
Integer downtimeMinutes,
Boolean emergency) {
int score = 0;
if (Boolean.TRUE.equals(databaseChange)) score += 2;
if (downtimeMinutes != null && downtimeMinutes > 0) score += 2;
if (Boolean.TRUE.equals(configurationChange)) score += 1;
if (Boolean.TRUE.equals(emergency)) score += 2;
RiskLevel level = score >= 3 ? RiskLevel.HIGH : RiskLevel.NORMAL;
return new RiskResult(score, level);
}
public ReleaseStatus nextAfterLead(RiskLevel level) {
return level == RiskLevel.HIGH
? ReleaseStatus.PENDING_OPS
: ReleaseStatus.READY_TO_RELEASE;
}
创建、修改和提交申请时,后端都会重新计算风险。前端可以展示“预计风险分数”,但不能把自己算出的 riskLevel 当成最终依据。这一处理回答了本次测试的核心问题:模型没有把风险等级当成一个普通表单字段,而是理解成了决定后续审批路线的业务规则。
权限校验也不能只靠前端菜单。负责人审批时,后端必须同时验证角色、团队和申请人:
private void requireLeadScope(ReleaseRequest release, CurrentUser actor) {
if (!Objects.equals(release.getTeamId(), actor.teamId())) {
throw forbidden("技术负责人只能审批本团队申请");
}
if (Objects.equals(release.getApplicantId(), actor.id())) {
throw forbidden("审批人与申请人不能是同一人");
}
}
用户 ID、角色和团队 ID 从 JWT 认证上下文读取,而不是信任前端传入的 userId 或 teamId。这也是“权限链路”区别于“显示不同菜单”的地方。
八、从生成结果到真实运行:不同角色看到的不是同一张表
项目启动后,登录页提供六个演示账号:两个团队各有开发人员和技术负责人,另有运维与系统管理员。统一演示密码只用于本地 H2 环境。

图 7:登录页提供六个真实演示身份,对应不同权限和数据范围
开发人员进入控制总览后,只能看到自己提交的发布申请。页面显示草稿、待负责人、待发布等状态统计,并提供新建发布申请入口。

图 8:平台研发组开发人员只能看到本人范围内的 3 条申请
切换为技术负责人后,页面增加“团队审批”。审批台明确展示“0—2 分进入待发布,3 分及以上进入运维风险审批”,并且只列出本团队其他成员的待办,负责人自己的申请不会出现在列表中。

图 9:负责人审批台展示风险路线,并提供通过与驳回动作
跨团队切换后,开发人员看到的仍然只是自己的数据。截图中的增长研发组账号可以看到会员中心、促销引擎和账单任务等申请,但看不到平台研发组的申请。

图 10:增长研发组开发人员的“我的发布”体现 owner scope 数据范围
同一团队的技术负责人看到的是团队范围,而不是全局范围;总览中包含待运维、待回滚和已发布等状态,但仍受团队限制。

图 11:技术负责人以 team scope 查看本团队发布状态
发布失败后,申请不会被直接标记为“结束”,而是进入 PENDING_ROLLBACK。运维人员在回滚队列中填写恢复结果,完成后才进入 ROLLED_BACK 终态。

图 12:运维角色看到独立的回滚队列和“登记完成回滚”动作
管理员可以查看两个团队的全部六条演示申请,但页面明确标注 READ ONLY · NO APPROVAL AUTHORITY。管理员拥有全局可见性,不等于可以跳过业务角色代替审批。

图 13:管理员查看全局台账,但没有审批、发布和回滚按钮
九、量化结果:能确认什么,不能确认什么
为了避免把体验写成“感觉不错”,我把本次可以复核的数据列出来:
| 观察项 | 实测结果 |
| 需求理解 | 47 个关键点 |
| 接口设计 | 11 个接口方案 |
| 数据建模 | 4 张核心表 |
| 代码规划 | 12 个生成阶段 |
| 演示身份 | 6 个账号、4 类角色、2 个团队 |
| 后端自动化测试 | 9 项通过,0 失败 |
| 前端生产构建 | npm run build 通过 |
| npm 依赖审计 | 0 个已知漏洞 |
| 浏览器验证 | 登录、角色总览、团队审批、回滚队列、全局台账均可访问 |
后端测试覆盖了本次最关键的逻辑:2 分走普通路径、3 分走高风险路径、跨团队拒绝、禁止自审、非法重复执行返回冲突、发布失败进入待回滚并完成回滚。前端完成生产构建,最终项目可以使用 H2 零配置启动,也保留了 MySQL 8 的建表脚本和 Profile。
但需要明确,本次素材没有完整记录从输入提示词到生成结束的总耗时,也没有逐行统计人工修改次数。因此本文不计算“效率提升百分比”和“代码采纳率”,也不把 47 个关键点直接等同于 47 个功能全部正确。能确认的是:模型完成了结构化拆解,最终工程通过了既定的编译、测试和浏览器流程验证。
十、我的评价:亮点、不足和更合适的用法
-
最明显的亮点
第一,分阶段流程让模型的理解过程可见。需求、接口、表结构和代码计划之间有连续性:前面写下的风险分流、团队隔离、操作记录和并发冲突,后面能够在接口边界、数据结构和生成计划中找到对应位置。
第二,模型抓住了“规则的组合”,而不是单独实现几个字段。风险分数决定审批路线,角色决定数据范围,当前状态决定可执行动作,失败结果又决定是否进入回滚。能把这些条件串起来,才算真正进入复杂业务逻辑。
第三,工程完整度比较高。后端包含认证、统一响应、异常映射、持久化、事务和测试;前端包含登录、不同角色工作台、加载与空状态;项目还提供 H2 演示模式、MySQL 配置和启动说明。这些都比只生成 Service 片段更接近可运行项目。
-
仍然存在的不足
首先,47 个关键点仍然需要人工审阅。拆解得多不代表优先级一定正确,重复项、表述粒度和边界条件仍可能需要调整。尤其是权限与状态机,不能因为界面看起来正确就跳过接口测试。
其次,当前发布动作是业务模拟,没有接入真实 Jenkins、GitLab、Kubernetes,也没有验证生产环境中的网络失败、回调重试和外部系统幂等。这个范围适合测试模型的业务理解,但不能直接当作生产发布平台。
再次,智能路由解决了“选哪个模型”的问题,但从最终结果中只能评价拆解和工程质量,无法仅凭截图解释内部具体选择了哪一个模型、为什么选择。若后续能提供更透明的任务路由说明,会更利于开发者理解成本与质量之间的取舍。
最后,自动化测试已经覆盖核心路径,但还可以继续增加请求级并发测试、安全扫描、MySQL 实库集成测试和前端端到端测试。生产可用性不能只靠一次构建通过来证明。
-
我的使用建议
如果准备用飞算 JavaAI处理类似项目,我建议不要直接说“帮我做一个发布系统”,而是先写清楚四件事:
谁能看什么、谁能做什么;
状态允许怎样变化,哪些是终态;
数值边界在哪里,例如 2 分和 3 分分别走哪条路线;
异常和重复请求应该返回什么结果。
然后在理解需求、接口设计和表结构三个阶段各审阅一次。代码生成后,优先验证越权、边界、非法状态和幂等,而不是先看页面够不够漂亮。
十一、结论
这次 ReleaseGuard 实测给我的结论是:飞算 JavaAI 在复杂 Java 业务的“读懂”和“拆解”上,已经不只是把需求改写成若干 CRUD 接口。
面对风险计算、2/3 分边界、团队权限、禁止自审、受控状态机、事务记录和失败回滚,它能够把一份长需求拆成 47 个关键点、11 个接口方案、4 张数据表和 12 个代码阶段,并继续推进到一个能够真实登录、切换角色、执行审批和查看回滚队列的工程。后端 9 项自动化测试全部通过,前端也完成生产构建。
这不意味着开发者可以放弃评审。恰恰相反,模型把复杂需求拆得越完整,人越应该把精力放在边界、权限和失败路径上。更合理的分工是:让 AI 承担需求结构化和工程搭建,让开发者负责规则确认、测试设计和上线决策。
如果你想验证一个 Java AI 工具到底有没有变强,不妨给它一条包含权限、状态和异常分支的真实业务链路。能写出 Controller 只是起点,能让整条链路在正确的人、正确的状态和正确的失败路径下运行,才是更有意义的答案。
#飞算JavaAI #AI编程 #Java #Java代码生成 #AI coding模型 #Java开发 #SpringBoot #状态机 #权限校验



