无尘阁日记

无尘阁日记

和AI搭档配置权限系统,是种什么体验?
2025-06-09

今天在项目权限配置上,我和 ChatGPT 协作完成了一系列权限插入、绑定、验证等操作。过程之中没有一行代码是冗余的,也没有一个 SQL 被误解。我们在对话中来回磨合语义、数据结构和业务逻辑,最终搭建出一整套可复用、可批量自动化生成的权限配置框架。借这次经验,我来分享整个协作过程的核心要点。

01|权限点定义从手写到自动生成

起初,我手动插入了如下 SQL:

INSERT INTO `auth_item` (`name`, `type`, `description`, `rule_name`, `data`, `created_at`, `updated_at`, `HeadOfficeUid`) 

VALUES ('/v1/income-model/virtual-add-child-subjects', 3, NULL, NULL, NULL, 1727142094, 1727142094, NULL);

我随后贴出了一个 Controller 类,其中包含了多个 @route@uses 的注释,比如:

/**
 * @uses 单项资产下载
 * @route /v1/virtual/download-single-asset
 */

我想把这些信息批量转化为 auth_item 的插入语句。起初生成的语句中混用了接口路径作为 name 字段,但这与我的规范不符。我指出:“name 应该是 @uses 的中文说明,前缀要加上【基础功能】【工作站】。”

随后,ChatGPT按要求调整结构,生成了如下标准格式:

INSERT INTO `auth_item` 

(`name`, `type`, `description`, `rule_name`, `data`, `created_at`, `updated_at`, `HeadOfficeUid`, `tenant_id`)

VALUES ('【基础功能】【工作站】单项资产下载', 2, NULL, '系统默认数据查看规则', NULL, 1727142333, 1727142333, NULL, 0);

我们将这类语句完整生成了 5 条,涵盖了“下载底稿、导入底稿、导出底稿、显示评估对象、检查”等全部 action。

02|权限绑定:角色 × 功能 = 组合爆发力

接下来,我给出了权限绑定的语句格式:

INSERT INTO `auth_item_child` 
(`parent`, `child`, `HeadOfficeUid`, `tenant_id`) 
VALUES ('【基础功能】【工作站】收益法新增加科目','/v1/income-model/virtual-add-subjects', NULL, 0);

ChatGPT明白我需要将这 5 个功能模块,与每个接口路径对应关系生成类似的绑定语句:

INSERT INTO `auth_item_child` 
(`parent`, `child`, `HeadOfficeUid`, `tenant_id`) 
VALUES ('【基础功能】【工作站】单项资产下载', '/v1/virtual/download-single-asset', NULL, 0);

我随后进一步提出要将这些权限项绑定到多个角色中,包括 OWNER、项目经理、评估人员、领导、单体项目成员、单体项目经理。它很快就明白了是「6 × 5 = 30条组合」,并输出如下格式:

INSERT INTO auth_item_child (parent, child, HeadOfficeUid, tenant_id) 
VALUES ('OWNER', '【基础功能】【工作站】单项资产下载', NULL, 0);-- 后续还有29条...

这一步我们几乎没费力就完成了 30 条标准权限绑定。

03|为特定公司开通权限:精确到组织单位

在权限体系中,还有一类绑定是为具体公司开通指定权限,比如某权限只给“雄安智评云数字科技有限公司”。我给出示例:

INSERT INTO `TJ_HeadOffice_Via_Permission` (`UUID`, `HeadOfficeUid`, `AuthItemUid`)

SELECT 127259506278137856, 

       (SELECT UUID FROM TJ_Organ WHERE NodeName='数字科技有限公司'),

       (SELECT id FROM auth_item WHERE name='【基础功能】【工作站】单项资产检查')

WHERE EXISTS (SELECT 1 FROM TJ_Organ WHERE NodeName='数字科技有限公司');

我要求 ChatGPT 按照这一格式,为剩余 4 个权限项也生成语句,并随机生成 UUID。它不仅生成了完整的 5 条,还在我更换公司名称为“北京天健兴业资产评估有限公司”时,立刻响应重新生成了另一套语句:

SELECT 17085012345678013, 
       (SELECT UUID FROM TJ_Organ WHERE NodeName='北京有限公司'),
       (SELECT id FROM auth_item WHERE name='【基础功能】【工作站】单项资产导出')

精确性、灵活性、批量处理能力都很强。


04|菜单体系也没落下:type、route、order完整对应

我给出了菜单插入格式,并提供了按钮顺序的 order

btnSingleAssetDownload.Tag = "9010";//下载底稿btnSingleAssetImport.Tag = "9020";//导入底稿

ChatGPT据此生成如下菜单配置:

INSERT INTO `menu` 

(`name`, `parent`, `Ancestor`, `path`, `type`, `route`, `order`, `data`)

VALUES ('【基础功能】【工作站】单项资产下载', NULL, '', '', 5, '/v1/virtual/download-single-asset', 9010, '');

我又要求生成相应的 const 常量,便于后期代码引用权限类型:

const SINGLE_ASSET_DOWNLOAD_TYPE = 20117; // 单项资产下载

随后,为了集成到权限数组中调用,我要它再生成 self:: 格式的写法:

self::SINGLE_ASSET_DOWNLOAD_TYPE, // 单项资产下载

这一步让数据结构和代码对接得非常顺畅。

05|插入确认语句:精准校验

我最后提出一个问题:如何确认一条 TJ_HeadOffice_Via_Permission 是否成功插入?ChatGPT立刻返回:

SELECT *

FROM TJ_HeadOffice_Via_Permission

WHERE UUID = 127259506278137856

  AND HeadOfficeUid = (SELECT UUID FROM TJ_Organ WHERE NodeName = '科技有限公司')

  AND AuthItemUid = (SELECT id FROM auth_item WHERE name = '【基础功能】【工作站】单项资产检查');

这一查询精确且可复用,可以批量验证数据写入效果。

最后的感受

今天这轮协作让我深刻体会到,权限系统不是一个模块,而是一张系统性的网。一个角色,一家公司,一项功能权限,它们之间是多维矩阵。ChatGPT帮我做的,不只是批量生成 SQL,它像一个随时待命的权限工程师,既理解结构逻辑,又擅长重复模式自动化处理,还能记住我设定的语义标准和风格偏好。

当我从思考、结构设定、到每一条 SQL 落地,AI 已不仅是助手,它已是我权限设计系统的一部分。

如夜话,至此。