news 2026/7/7 2:19:08

DeepSeek using Claude Code 重构Oracle Fusion/SAP最佳业务实践:以add user account为例子,描述程序的访问序列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek using Claude Code 重构Oracle Fusion/SAP最佳业务实践:以add user account为例子,描述程序的访问序列

前言:

掌控是大型项目的首要条件,按照自己顶下的设计模式及编程规范编程是AI编程的基本要求。

❯ 以add user account为例子,描述程序的访问序列,比如哪个网页访问什么类,按顺序描述

● Let me explore the codebase to find the user account related components and trace the access sequence.

● Explore(Find user account components)

⎿ Done (51 tool uses · 75.6k tokens · 1m 41s)

(ctrl+o to expand)

● "Add User Account" 程序访问序列

整个流程严格遵循 Jakarta EE 11 三层架构:展示层 (JSF) → 业务逻辑层 (EJB) → 数据持久层 (JPA Entity)。

---

第一阶段:页面入口与导航

步骤 1 — 用户访问用户列表页面

┌──────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 文件 │ 说明 │

├──────┼────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────┤

│ 1.1 │ src/main/webapp/app/security-console/users-list.xhtml │ 浏览器请求用户列表页面,显示所有用户表格 │

├──────┼────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────┤

│ 1.2 │ src/main/webapp/app/security-console/template.xhtml │ 页面模板,提供汉堡菜单、上下文导航行、侧边栏 │

├──────┼────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────┤

│ 1.3 │ openlabx.org.cn.security.web.UserListBean (@Named @ViewScoped) │ 页面加载时调用 search() 方法,通过 UserFacade.searchUsers() 获取用户列表数据 │

└──────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────┘

步骤 2 — 用户点击 "Add User Account" 按钮

┌──────┬──────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 文件 │ 方法/操作 │

├──────┼──────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 2.1 │ users-list.xhtml │ │

├──────┼──────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 2.2 │ UserListBean.java │ navigateToCreateUser() 返回导航字符串 "/app/security-console/user-edit?mode=create&faces-redirect=true" │

├──────┼──────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 2.3 │ src/main/webapp/app/security-console/user-edit.xhtml │ 浏览器重定向到用户编辑页面 │

└──────┴──────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────┘

---

第二阶段:表单初始化

步骤 3 — 页面加载时初始化创建模式

┌──────┬──────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 文件 │ 方法/操作 │

├──────┼──────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤

│ 3.1 │ user-edit.xhtml │ 接收 mode=create 参数 │

├──────┼──────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤

│ 3.2 │ user-edit.xhtml │ 触发加载 │

├──────┼──────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤

│ 3.3 │ openlabx.org.cn.security.web.UserEditBean │ loadUser() 检测到 mode=create,实例化一个空的 User 对象,加载 UserCategory 列表(供下拉选择) │

├──────┼──────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤

│ 3.4 │ openlabx.org.cn.security.ejb.UserCategoryFacade (@Stateless) │ 提供用户类别列表数据 │

└──────┴──────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────┘

---

第三阶段:用户提交表单(核心保存流程)

步骤 4 — 用户填写表单并点击 "Save"

┌──────┬────────┬─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 层级 │ 文件 │ 方法/操作 │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.1 │ 展示层 │ user-edit.xhtml │ │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.2 │ 展示层 │ UserEditBean.java │ save() — 校验密码(最少8字符、两次输入一致),设置用户类别,调用 userFacade.createUser(user, password, │

│ │ │ │ currentUser) │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.3 │ 业务层 │ openlabx.org.cn.security.ejb.UserFacade (@Stateless) │ createUser(User user, String password, String createdBy) — 外观模式入口,委托给 UserService │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.4 │ 业务层 │ openlabx.org.cn.security.ejb.UserService (@Stateless) │ createUser() — 核心业务逻辑:校验输入参数 → 调用 PasswordHasher.hash(password) → 设置 │

│ │ │ │ pwdChangeRequired=true → 根据 UserCategory 计算密码过期时间 → em.persist(user) │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.5 │ 业务层 │ openlabx.org.cn.security.ejb.PasswordHasher │ hash(password) — PBKDF2WithHmacSHA256 算法,迭代 600,000 次,16 字节盐值,生成格式 │

│ │ │ (@ApplicationScoped) │ ALGORITHM:ITERATIONS:BASE64_SALT:BASE64_HASH │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.6 │ 持久层 │ openlabx.org.cn.security.entity.User (@Entity │ JPA @PrePersist 生命周期回调自动设置 createdAt、updatedAt、pwdLastChangedAt │

│ │ │ @Table(name="sec_users")) │ │

├──────┼────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 4.7 │ 数据库 │ PostgreSQL sec_users 表 │ JPA 执行 INSERT INTO sec_users(...) │

└──────┴────────┴─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────┘

---

第四阶段:角色分配(可选)

步骤 5 — 用户保存后,可点击 "Add Role" 分配角色

┌──────┬────────┬───────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 层级 │ 文件 │ 方法/操作 │

├──────┼────────┼───────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤

│ 5.1 │ 展示层 │ user-edit.xhtml │ 打开 "Add Role" 对话框,搜索角色 │

├──────┼────────┼───────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤

│ 5.2 │ 展示层 │ UserEditBean.java │ searchAvailableRoles() → roleFacade.searchRoles(...) │

├──────┼────────┼───────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤

│ 5.3 │ 展示层 │ UserEditBean.java │ addSelectedRoles() — 遍历选中的角色,调用 userFacade.assignRoleToUser(userId, roleId, │

│ │ │ │ createdBy) │

├──────┼────────┼───────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤

│ 5.4 │ 业务层 │ UserFacade.java │ assignRoleToUser() — 检查是否已存在相同分配(防重复),创建 UserRole 对象 │

├──────┼────────┼───────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤

│ 5.5 │ 持久层 │ openlabx.org.cn.security.entity.UserRole (@Entity │ JPA em.persist(userRole) → INSERT INTO sec_user_roles │

│ │ │ @Table(name="sec_user_roles")) │ │

└──────┴────────┴───────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┘

---

第五阶段:权限刷新

步骤 6 — 创建用户后刷新授权缓存

┌──────┬──────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────┐

│ 顺序 │ 文件 │ 操作 │

├──────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────┤

│ 6.1 │ openlabx.org.cn.security.web.AuthorizationCacheBean (@SessionScoped) │ invalidate() — 清除当前用户的权限缓存,下次访问时重新从 AuthorizationEngine 加载 │

└──────┴──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────┘

---

完整调用链总结

浏览器 → users-list.xhtml

→ UserListBean.navigateToCreateUser() [展示层 - CDI Bean]

→ 浏览器重定向 → user-edit.xhtml

→ UserEditBean.loadUser() [展示层 - CDI Bean]

→ UserCategoryFacade (加载类别列表) [业务层 - EJB]

→ UserEditBean.save() [展示层 - CDI Bean]

→ UserFacade.createUser() [业务层 - EJB Facade]

→ UserService.createUser() [业务层 - EJB Service]

→ PasswordHasher.hash() [业务层 - 密码哈希]

→ em.persist(User) [持久层 - JPA Entity]

→ INSERT INTO sec_users [数据库 - PostgreSQL]

→ UserFacade.assignRoleToUser() [业务层 - EJB Facade]

→ em.persist(UserRole) [持久层 - JPA Entity]

→ INSERT INTO sec_user_roles [数据库 - PostgreSQL]

关键文件数量:3 个 XHTML 页面 → 2 个 CDI Bean → 3 个 EJB → 3 个 JPA Entity → 2 张数据库表。

✻ Cogitated for 2m 6s

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

DTC诊断测试方法

这篇文章用TSMaster工具从实操角度介绍IOS 14299中的诊断DTC测试方法,主要内容为如何搭建DTC测试环境以及测试方法 DTC的命名规则 DTC是Diagnostic Trouble Code的缩写,中文名称为诊断故障码,它的作用是将车辆上发生的故障通过固定的命名规…

作者头像 李华
网站建设 2026/7/7 2:13:37

那个差点被裁的女设计师,三个月后带着爆款杀回来了

三个月前,苏然的工位上贴着一张便利贴。 上面就写了五个字——“最后三个月。” 不是鸡汤。是通牒。 她负责的女装设计线,连续两个季度全公司销量垫底。老板把她叫进办公室,话很直接:“再给你一季,不行这条线整个砍掉。…

作者头像 李华
网站建设 2026/7/7 2:02:37

2026撰写行业报告总写不完零散专业词汇?可系统梳理行业专业词汇

"2026撰写行业报告,攒了一堆零散行业专业词汇理不清,越写越慢拖垮整个进度,这是我帮好几个做行业调研的朋友测工具的时候,最常碰到的痛点。核心问题不是你整理速度慢,是方法错了——要么靠手动堆,要么…

作者头像 李华
网站建设 2026/7/7 2:02:26

CBAM 注意力模块 PyTorch 实战:3 步集成 ResNet-50,ImageNet 精度提升 1.2%

CBAM 注意力模块 PyTorch 实战:3 步集成 ResNet-50,ImageNet 精度提升 1.2%在计算机视觉领域,注意力机制已成为提升模型性能的关键技术。今天我们将深入探讨如何将轻量级的卷积块注意力模块(CBAM)集成到经典ResNet-50架…

作者头像 李华
网站建设 2026/7/7 1:58:23

【Java项目技术亮点】熔断器状态机三态转换

写在前面 这个坑我踩过。去年我们订单服务调用下游支付服务,某天支付服务突然变慢,我们这边线程池瞬间被打满,接着是整个系统雪崩——连首页都打不开了。后来复盘才知道,如果当时上了熔断器,损失能减少 80%。熔断器这东…

作者头像 李华