以“资深后端架构师和数据库专家”为角色设定,向CodeFree智能体提交详细提示词。
角色设定:你是一位资深的后端架构师和数据库专家,专注于设计企业级权限管理系统,对PostgreSQL数据库有深入的了解。
请设计一个基于PostgreSQL的RBAC(基于角色的访问控制)认证系统的数据库物理模型。该系统需要满足以下核心需求:
RBAC核心概念实现:完整实现用户、角色、权限、用户角色关联、角色权限关联等核心实体关系;
多层级权限控制:支持权限的树状结构,实现权限的上下级继承关系;
细粒度权限管理:不仅控制功能操作权限,还要支持数据列级别的权限控制;
PostgreSQL特性利用:充分利用PostgreSQL的枚举类型、外键约束、索引优化等特性。
包含用户基本信息:用户ID、用户名、邮箱、密码哈希、状态等;
设计考虑:使用UUID作为主键还是自增整数?请说明选择理由。
角色基本信息:角色ID、角色名称、角色描述、状态;
设计考虑:如何实现角色的树状结构?使用邻接表还是闭包表?
权限资源定义:权限ID、权限名称、权限类型、权限路径/标识符;
用户角色关联表(user_roles):建立用户与角色的多对多关系;
角色权限关联表(role_permissions):建立角色与权限的多对多关系;
设计考虑:是否需要组(group)概念?用户组与角色的区别和联系。
使用PostgreSQL的枚举类型(ENUM)定义权限类型、状态等有限值字段。
示例:permission_type ENUM('admin', 'write', 'read') NOT NULL
时间戳字段使用TIMESTAMP WITH TIME ZONE。
用户权限查询:(user_id, entity_type, entity_id)
角色权限查询:(role_id, permission_id)
请为每个表提供完整的CREATE TABLE语句,包含字段名、数据类型、约束、字段注释(COMMENT)、索引定义、外键关系。
sqlCREATE TABLE users ( user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash TEXT NOT NULL, is_admin BOOLEAN DEFAULT FALSE, status SMALLINT DEFAULT 1 CHECK (status IN (0, 1)), -- 0:禁用, 1:启用 created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW());COMMENT ON TABLE users IS '用户信息表';COMMENT ON COLUMN users.is_admin IS '是否为超级管理员:true是,false否';
权限计算:用户最终权限 = 用户直接权限 + 角色权限 + 组权限;
利用PostgreSQL的行级安全特性实现数据行级别的访问控制。
示例:用户只能访问自己创建的数据,管理员可以访问所有数据
密码存储:使用bcrypt或argon2算法哈希存储;
最小权限原则:应用连接使用最小必要权限的数据库用户。
查询用户权限的SQL
权限验证的SQL
权限继承计算的SQL
docs/physical_model.md:包含物理模型和视图的结构和解释init/sql/physical_model.sql:包含所有表的建表语句和索引init/sql/views.sql:包含所有视图定义 init/sql/test_data.sql: 测试数据insert脚本
特别强调:请充分利用PostgreSQL的特性,如枚举类型、JSONB字段、数组类型、全文搜索等,设计一个既符合RBAC标准又充分利用数据库优势的物理模型。
---
description: Golang RESTful API 智能体代码生成与检查
---
# rules
规则名称:Golang RESTful API 智能体代码生成与检查
触发条件: 当新建或修改 Golang RESTful API 相关文件(如 .go 文件)时
源码组织结构遵循以下规则:
dataaudit/├── cmd/ # 应用入口│ └── server/│ └── main.go├── internal/│ ├── controller/ # 控制器层│ ├── dao/ # 数据访问层│ ├── cache/ # 数据缓存��│ ├── database/ # 数据库连接│ ├── errors/ # 错误处理│ ├── middleware/ # 中间件│ ├── model/ # 数据模型│ ├── response/ # 响应格式│ ├── router/ # 路由配置│ └── service/ # 业务逻辑层├── pkg/ # 公共库目录│ └── logger/ # 日志├── api/ # API定义目录│ └── openapi.yaml├── configs/ # 配置处理│ └── config.yaml├── deployments/ # docker编排文件│ └── Dockerfile│ └── compose.yaml├── scripts/ # 自动化编译发布的脚本│ └── build.sh├── go.mod # 依赖管理└── README.md # 项目说明
RESTful API设计原则
资源导向设计:遵循RESTful原则,将数据和功能映射为资源,使用URL作为资源的唯一标识符。
HTTP方法规范:
GET:用于查询资源
POST:用于创建新资源
PUT:用于更新资源
DELETE:用于删除资源
路由设计规范:
使用清晰、简洁的URL命名
例如:/users/{id}/orders 表示用户123的订单资源
遵循单一职责原则,每个API只服务于单一业务需求
基于已完成的数据库物理模型,提交提示词(已设置项目级规则)。CodeFree自动读取数据库模型文件,生成Todo列表(创建项目结构、实现配置管理、数据库连接、中间件等),并按步骤编写代码。最终代码无需大幅修改即可编译成功,还支持单元测试与API文档生成。
角色设定:你是一位资深的Golang后端开发专家,专注于使用Golang框架构建高性能、可扩展的RESTful API服务。
任务要求:请根据以下要求,为我提供一个完整的Golang RESTful API实现方案:
项目初始化:提供完整的项目结构设计,包括路由层、控制器层、服务层和数据层的分离。
依赖管理:使用Go Modules进行依赖管理,确保版本兼容性。
框架:使用Gin框架,因为它是一个轻量级、高性能的Web框架,能够快速构建强大的Web应用程序。
ORM框架: gorm,对开发人员友好的 Golang ORM 库,全功能orm库
接口限流框架:go.uber.org/ratelimit
日志框架:go.uber.org/zap ,非常快的、结构化的,分日志级别的Go日志库
配置管理: github.com/spf13/viper
接口文档:github.com/swaggo/gin-swagger 可以自动生成、展示和交互式地测试的 API 文档
设计文档: 项目目录下docs/physical_model.md
物理模型创建sql: 项目目录下init/sql/physical_model.sql
视图创建sql: 项目目录下init/sql/views.sql
申请一次性登录密码(POST /sys/otp/{mobile_phone})
登录(POST /sys/login)
获取单个用户信息(GET /users/{id})
json{ "code": 200, "message": "success", "data": {...}}
200:请求成功
201:资源创建成功
400:错误请求
404:资源未找到
500:服务器内部错误
配置管理: 使用yaml文件管理配置数据,使用viper读取配置,配置存在上下文context中;
请求日志记录:使用zap管理日志,可以通过上下文context中读取配置实现项目代码日志和中间件日志的分开配置日志级别,日志同时输出到console和文本文件中;
请求限流:使用ratelimit对关键接口限流,比如登录接口,防止被爆破,配置的限流数据可以通过上下文context中读取;
缓存配置:使用redis存储一次性密码和登录后的token,以用户mobilephone为key存储用户信息。
对输入参数进行有效性验证
使用结构体验证标签(如binding:"required")
返回清晰的验证错误信息
统一的错误处理机制
定义枚举类型的错误代码
记录错误日志便于问题排查
生成dockerfile,但不用立刻打包镜像;
分层编译设计,使用go:alpine为builder镜像,go:alpine为运行镜像。
使用docker compose 编排
使用caddy:2作为web代理镜像,反向代理给本项目镜像,本项目只监听docker网络接口
错误处理完善:所有可能出错的地方都要有适当的错误处理;
集成测试:使用Gin Gonic等工具测试路由和处理函数
输出格式要求:请提供完整的Go代码实现,包含详细的注释说明每个部分的功能和设计思路。代码应该可以直接运行或稍作配置即可使用。