引言:一次关于"可控"的压力测试
开源 BI 工具 Apache SuperSet 在数据集层面提供角色与权限控制,但默认不提供针对单个 Chart / Dashboard 的对象级密码保护——已有的数据权限只能管到"哪些用户能访问哪些数据集",图表本身是否被某个组织成员独立加锁,并没有原生的承载位置。这是很多企业使用开源 BI 时的真实困境:功能要改,但很少有团队愿意为了一个权限小需求,去读懂一个百万行的代码库。
这恰好构成一个有价值的压力测试:把一个生产级规模的开源项目,交给数字研发团队去做全栈二次开发,它能不能"读懂—修改—验证"一气呵成?企业真正犹豫的,从来不是 AI 能不能写几行代码,而是敢不敢让 AI 在百万行级生产代码库上做二次开发——改坏了怎么办,数据安全怎么办。
我们用织灵 Coda Loom 2.0 的 ADE Teams(数字研发团队)做了这次实验。下面是一份完整的过程记录:从清点 SuperSet 的 10,364 个文件、约 235 万行文本开始,到为 Chart 和 Dashboard 加上完整的密码锁功能、14 项 API 验证全部通过结束。
而让这次实验成立的前提,只有一个词:可控。不是让 AI 脱离约束自行其是,而是在隔离、审计、可回滚的边界内交付——这正是工程级 AI 研发平台与"AI 写代码工具"的本质分野。
场景概述
一句话痛点
Apache SuperSet 作为开源 BI 工具,自带角色与数据集权限,但默认不提供针对单个图表 / Dashboard 的对象级密码保护——已有权限可以管理"谁能访问哪些数据集",却无法承载"这张图本身是否要被某个组织成员额外加锁",企业仍需二次开发。
织灵解法
通过织灵的数字研发团队(ADE Teams)直接在 SuperSet 的百万行代码基上进行全栈二次开发,从需求分析到代码实现再到验证修复,全程自然语言驱动。
预期效果
为 SuperSet 的 Chart 和 Dashboard 添加了完整的密码锁定 / 解锁功能,覆盖六个 UI 入口,支持密码设置、修改、移除,14 项 API 功能验证全部通过,全程无需手动编码。
场景背景
• 角色:后端 / 全栈开发者,需要为一个已有的大型项目添加新功能
• 任务:为 Apache SuperSet 的 Chart 和 Dashboard 实现密码保护功能
• 难点:
○ SuperSet 代码库庞大:10,364 个文件,约 235 万行文本,131 万行纯代码
○ 涉及前端(React / TypeScript)和后端(Flask / Python)全栈修改
○ 需要理解复杂的代码结构,包括模型层、API 层、Schema、前端组件树、状态管理等
○ 功能需要覆盖 6 个不同的 UI 入口(卡片视图、列表视图、详情页等)
○ 需要处理数据库迁移、权限注册、API 拦截等底层机制
项目代码规模
首先对 SuperSet 代码仓库进行清点统计


使用织灵的完整流程
1. 代码库探索与需求分析
首先让 Loom 清点当前 SuperSet 服务中已有的 Dashboard 和 Chart:

Loom 统计结果,当前全部 Dashboard 和 Chart 对已通过角色与数据集权限校验的登录用户可见,Apache SuperSet 默认不提供针对单个 Chart / Dashboard 的对象级密码锁机制:

随后,描述密码锁功能需求:图表所有者可设置 / 修改 / 移除密码,查看锁定内容时后端拦截并返回锁定状态,前端展示解锁界面。Loom 自动阅读了 SuperSet 的模型层、API 层、前端组件等关键代码,输出详细开发计划:

计划覆盖了后端模型修改(slice.py、dashboard.py)、API 接口(charts / api.py、dashboards / api.py)、数据拦截(charts / data / api.py)、Schema 更新、数据库迁移,以及前端 9 个文件的修改。
2. 代码实现
Loom ADE 进行大范围高复杂度的代码编写,涵盖后端模型、API、前端组件等多个层面:

后端修改:
• 在 superset/models/slice.py 和 superset/models/dashboard.py 中添加 password_hash 字段和 is_locked 属性
• 在 superset/charts/api.py 和 superset/dashboards/api.py 中实现密码管理 REST API(设置 / 验证 / 移除密码)
• 在 superset/charts/data/api.py 中实现数据请求拦截——当图表 / 仪表盘已锁定时,不返回数据,只返回锁定状态
• 更新 superset/charts/schemas.py、superset/dashboards/schemas.py 添加 is_locked 字段
• 在 superset/constants.py 中注册新端点的权限映射
• 创建数据库迁移文件
前端修改:
• 创建 PasswordLockModal.tsx 和 SetPasswordModal.tsx 两个核心组件
• 修改 ChartCard.tsx、DashboardCard.tsx——卡片视图添加锁徽标和密码管理菜单
• 修改 ChartList/index.tsx、DashboardList/index.tsx——列表视图添加密码管理入口
• 修改 Chart/index.tsx、DashboardPage.tsx——查看页面密码拦截和解锁流程
• 修改 ExploreViewContainer/index.tsx——探索页面的密码检查
• 修改 Dashboard.tsx——Dashboard 详情页密码管理
实现完毕后 Loom 进行代码总结:


3. 服务重启与验证

编码完成后,Loom 重启 Superset 服务:
重启过程中遇到 superset_core 模块导入问题,Loom 通过调整 PYTHONPATH 解决;发现权限未注册到数据库,创建sync_permissions.py 脚本同步权限;修ChartGetResponseSchema 中缺少 is_locked 字段的问题。最终完成全面验证:

4. UI 补全与 Bug 修复
第一个 Session 完成了核心功能,但列表页只实现了"锁标识展示",缺少"设置密码"的 UI 入口。在第二个 Session 中:
• 在卡片和列表的菜单中新增 Set Password / Change Password / Remove Password 选项
• 修改 useHeaderActionsDropdownMenu.tsx 和 useExploreAdditionalActionsMenu/index.tsx,补全 Dashboard 详情页和 Chart 探索页的右上角菜单
• 修复 useMemo 依赖数组缺失导致菜单不响应锁定状态变化的问题
• 逐一修复了 16 个 TypeScript 编译错误
最终效果展示
服务界面: Loom 启动的 SuperSet 服务界面,Dashboard 和 Chart 正常展示:

设置密码: 管理员可通过 Dashboard 右侧菜单中的 "Set Password" 选项为 Dashboard 设置密码:


加密标识: 加密后的 Dashboard 卡片上会显示锁定图标,一目了然:
密码验证: 访问加密 Dashboard 时,不再直接展示内容,而是弹出密码输入框

输入正确密码后,完整 Dashboard 内容正常展示:
密码管理: 管理员可以修改或删除已设置的密码,删除密码时需输入 "DELETE" 确认:

结果对比

关键收获
• 超大代码库不是障碍:Loom 能够快速理解 10,000+ 文件、131 万行纯代码的复杂项目,并精准定位需要修改的关键节点。传统开发中最耗时的"读代码"环节被大幅压缩。
• 全栈修改一气呵成:从 Python 后端模型、Flask API、数据库迁移,到 TypeScript 前端组件、状态管理、UI 交互,Loom 在一个 Session 内完成了跨层全栈开发,避免了手动切换上下文带来的效率损失。
• Bug 修复自然融入流程:无论是编译错误(16 个 TS 错误)、运行时问题(模块导入、权限同步),还是逻辑缺陷(useMemo 依赖数组),Loom 都能自动诊断并修复,无需开发者逐一排查。
• 迭代式开发体验顺畅:第一个 Session 完成核心功能,第二个 Session 根据使用反馈补全 UI 和修复剩余问题,Loom 在两个 Session 之间保持了上下文,能准确理解"上次做了什么、这次需要改什么"。
• 降低大型项目二开门槛:对于像 SuperSet 这样的企业级开源项目,传统二开需要开发者投入大量时间学习代码结构,而 Loom 把这个门槛降到了"能描述需求即可"的水平。
把掌控权,留在企业自己手里
密码锁只是一个切面。它真正验证的,是数字研发团队在百万行级代码库上跑通"理解—修改—验证"闭环的能力:读代码不再依赖某个资深工程师的脑子,改代码不再受上下文切换的拖累,验证不再靠人肉排查编译错误。
回到企业最关心的问题:把生产级二开交给 AI,底气从哪来?答案不在"模型更聪明",而在工程级的可控——私有化部署让数据不出域,安全沙箱让每次改动都在隔离环境中发生,凭证不落模型、操作全程审计可回滚。能力可以交给智能体,掌控权始终在企业自己手里。
这也正是织灵的定位:不是替代工程师,而是把人从"读懂别人代码"这类高重复、低创造的工作里解放出来,让人的精力回到真正的创造上。


